[MS V8i C++]内存中打开参考模型,修改参考模型的元素

我通过下面的方法遍历出了所有元素(及参考元素):

mdlModelRefIterator_create();

while(mdlModelRefIterator_getNext()!=NULL)

{

      //...
}

mdlModelRefIterator_free();

但是我想修改参考模型元素该怎么做呢?

Parents Reply Children
  • 下面是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