我通过下面的方法遍历出了所有元素(及参考元素):
mdlModelRefIterator_create();
while(mdlModelRefIterator_getNext()!=NULL)
{
//...}
mdlModelRefIterator_free();
但是我想修改参考模型元素该怎么做呢?
这个可能需要您通过编程打开参考模型所在的文件,修改之后保存一下。
有参考代码不?
我有段ce版的代码,但是完全和v8i同不到。我不知道MSDocument和DgnFile有什么区别
没有现成的代码,您可以试着移植一下,有问题可以随时到这里发问。编程对象太多了,有些对象没必要搞得那么清楚,只要比葫芦画瓢照搬着用就行了,大概从字面意思理解一下就行。
下面是CE的代码:
/** * @brief 打开指定的DGN文件 * @param[in] strDgnFileName DGN文件路径 * @param[in] mode 打开方式 * @return 处理结果(true:打开成功,false:打开失败) */ DgnFilePtr Utility::OpenDgnForOpenMode(WStringCR strDgnFileName, DgnFileOpenMode mode) { DgnFilePtr pDgnfile = NULL; WString strExtension = BeFileName::GetExtension(strDgnFileName.c_str()); if (strExtension.CompareToI(EXT_DGN)) return NULL; DgnFileStatus documentStatus; DgnDocumentPtr pDoc = DgnDocument::CreateFromFileName(documentStatus, strDgnFileName.c_str(), NULL, DEFFILE_BASEID, DgnPlatform::DgnDocument::FetchMode::Write); if (documentStatus != DgnFileStatus::DGNFILE_STATUS_Success) { return NULL; } pDgnfile = DgnFile::Create(*pDoc, mode); StatusInt openForWriteStatus; DgnFileStatus fileStatus = pDgnfile->LoadDgnFile(&openForWriteStatus); if (fileStatus != DgnFileStatus::DGNFILE_STATUS_Success) { return NULL; } pDgnfile->FillDictionaryModel(); return pDgnfile; }
//打开元素所在文件 oDgn = BOQTool::Utility::OpenDgnForOpenMode(eh.GetDgnFileP()->GetFileName(), DgnFileOpenMode::ReadWrite); if (oDgn != NULL) { // 获取参考文件中元素对应的DgnModel对象 StatusInt modelStatus; DgnModelP pModel = oDgn->LoadRootModelById(&modelStatus, oDgn->FindModelIdByName(eh.GetDgnModelP()->GetModelName()), true, false, true); // 判断DgnModel对象是否为NULL if (pModel != NULL) { // 获取参考文件中的元素对象 elRef = pModel->FindElementByID(eh.GetElementId()); // 实例化元素的EditElementHandle对象 newElem.SetElementRef(elRef, pModel); } }
但是DgnFile::Create(*pDoc, mode);函数在V8i中不传入DgnDocument;DgnFile也没有 LoadRootModelById()函数
需要调用mdlDgnFileObj_XXX c函数实现。
我发现修改参考文件元素,当前文件元素的方法,可能比较蹩脚,供大家参考:
//修改参考文件的元素 void AddDesignNums(const wstring& fileName, const wstring& modelName, vector<ElemDesign>& elems) { string fileNameStr = Utility::wstr2str(fileName); DgnModelRefP pModel = NULL; //mdlWorkDgn_openFile仅对非当前文件有效 if (SUCCESS == mdlWorkDgn_openFile(&pModel, NULL, NULL, fileNameStr.c_str(), modelName.c_str(), FALSE)) { DgnCacheP dgnCacheP = pModel->GetDgnCache(); if (!dgnCacheP->IsFilled(DGNCACHE_SECTION_GRAPHIC_ELMS)) dgnCacheP->FillSections(DGNCACHE_SECTION_GRAPHIC_ELMS); for (vector<ElemDesign>::iterator it = elems.begin(); it != elems.end(); ++it) { CacheElemRef cacheElemRef = dgnCacheP->FindElemInCache(it->id); BuildingEditElemHandle bldEditHandle(cacheElemRef, pModel); CCatalogCollection & dgInfo = bldEditHandle.GetCatalogCollection(); //修改元素 SetXPathValue(dgInfo, CommonStrings::XPath_ObjectId, it->designNum); bldEditHandle.Rewrite(); } mdlWorkDgn_saveChanges(pModel); mdlWorkDgn_closeFile(pModel); } } //修改当前文件的元素 void AddDesignNumsToActiveFile(const wstring& modelName, vector<ElemDesign>& elems) { DgnFileObjP dgnFileObjP = mdlDgnFileObj_getMasterFile(); DgnModelRefP pModel = NULL; if (SUCCESS == mdlModelRef_createWorkingByName(&pModel, dgnFileObjP, modelName.c_str(), TRUE, FALSE)) { DgnCacheP dgnCacheP = pModel->GetDgnCache(); if (!dgnCacheP->IsFilled(DGNCACHE_SECTION_GRAPHIC_ELMS)) dgnCacheP->FillSections(DGNCACHE_SECTION_GRAPHIC_ELMS); for (vector<ElemDesign>::iterator it = elems.begin(); it != elems.end(); ++it) { CacheElemRef cacheElemRef = dgnCacheP->FindElemInCache(it->id); BuildingEditElemHandle bldEditHandle(cacheElemRef, pModel); CCatalogCollection & dgInfo = bldEditHandle.GetCatalogCollection(); //修改元素 SetXPathValue(dgInfo, CommonStrings::XPath_ObjectId, it->designNum); bldEditHandle.Rewrite(); } mdlModelRef_freeWorking(pModel); } }
Answer Verified By: Rao Zhihua