【msce c++】如何把参考文件的元素复制到当前model中?需要保留参考的缩放参数。

我这边可能需求更多一点,我想要的是把参考的图形复制一份保存在 当前model,这些元素需要有参考的旋转,缩放等信息。

如下代码。我做了测试,只是把原始参考文件的元素复制过来了, 这些元素不具有参考的参数,比如旋转和缩放等。

DgnDocumentMonikerPtr moniker = Bentley::DgnPlatform::DgnDocumentMoniker::CreateFromFileName(CCommonOperate::CStringToBentleyWString(frameInfo.sFilePath).c_str(),NULL);

	DgnAttachmentP attachment;
	if (0 != ACTIVEMODEL->CreateDgnAttachment(attachment, *moniker, CCommonOperate::CStringToBentleyWString(frameInfo.sModelName).c_str())) {
		MessageBox::Show("参考模版文件失败");
	}
	attachment->SetStoredScale(dScale);
	attachment->SetMasterOrigin(insertPoint);
	Bentley::DgnModelP dgnModelP = attachment->GetDgnModelP();
	for (PersistentElementRefP const& elemRef : *dgnModelP->GetGraphicElementsP())
	{
		if (CELL_HEADER_ELM != elemRef->GetElementType()) {
			continue;
		}

		Bentley::DgnPlatform::ElementId elmID = elemRef->GetElementId();
		EditElementHandle eehCell(elmID, dgnModelP->AsDgnModelP());
		if (!eehCell.IsValid()) {
			continue;
		}

		Bentley::DgnPlatform::ElementCopyContext copier(ACTIVEMODEL);
		if (SUCCESS != copier.DoCopy(eehCell))
		{
			MessageBox::Show("有一个没成功");
		}
		
	}
	ACTIVEMODEL->DeleteDgnAttachment(attachment);

Parents
  • 使用老的mdl函数应该可以。mdlElmdscr_readToMaster能获取到变换过的元素

  • 我使用这一套老函数成功了。

    int scanCallback(MSElementDescr* pDes, void* pArg, Bentley::DgnPlatform::ScanCriteria* pScan)
    {
    if (mdlElement_getType(&pDes->el) != CELL_HEADER_ELM) {
    return SUCCESS;
    }
    
    ElementCopyContextP ccP = mdlCopyContext_create();
    mdlCopyContext_setScaleToDestination(ccP, true);
    mdlCopyContext_setModelFromElmdscr(ccP, true);
    if (SUCCESS == mdlElmdscr_copy(&pDes, mdlScanCriteria_getModel(pScan), ACTIVEMODEL, ccP)) {
    Bentley::DgnPlatform::ElementId id = mdlElement_getID(&pDes->el);
    TempScanElmId.push_back(id);
    }
    mdlCopyContext_free(&ccP);
    return SUCCESS;
    }
    
    
    
    mdlRefFile_attach();
    
    Bentley::DgnPlatform::ScanCriteria *scP = mdlScanCriteria_create();
    mdlScanCriteria_setReturnType(scP, MSSCANCRIT_ITERATE_ELMDSCR, FALSE, FALSE) ;
    mdlScanCriteria_setElmDscrCallback(scP, (PFScanElemDscrCallback)scanCallback, NULL) ;
    mdlScanCriteria_setDrawnElements(scP) ;
    mdlScanCriteria_setModel(scP, dgnModelRef) ;
    mdlScanCriteria_scan(scP, NULL, NULL, NULL);
    mdlScanCriteria_free(scP);

  • 不需要。DoCopy也可成功。主要问题在于不能用pAttach->GetDgnModelP()来获取模型而要直接用pAttach。如下代码测试通过:

    void DoCopyTest()
    {
    	DgnModelP pActiveModel = ISessionMgr::GetActiveDgnModelP();
    	DgnAttachmentArrayP pAttachArray = pActiveModel->GetDgnAttachmentsP();
    	if (NULL == pAttachArray)
    	{
    		mdlDialog_dmsgsPrint(L"No Attached Reference");
    		return;
    	}
    	for (DgnAttachmentP pAttach : *pAttachArray)
    	{
    		EditElementHandle   eeh(1438L, pAttach); //Don't use pAttach->GetDgnModelP()
    		if (!eeh.IsValid())
    			continue;
    		ElementCopyContext copier(ACTIVEMODEL);
    		copier.SetSourceModelRef(eeh.GetModelRef());
    		copier.SetTransformToDestination(true);
    		copier.DoCopy(eeh);
    	}
    }



    Answer Verified By: 瑞 胡 

  • 测试成功了。老师、谢谢。 代码已更新为新接口。

Reply Children
No Data