我这边可能需求更多一点,我想要的是把参考的图形复制一份保存在 当前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);
使用老的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: 瑞 胡
测试成功了。老师、谢谢。 代码已更新为新接口。
请问符老师,如果元素使用c#的copycontext,要怎么实现这个效果。
C# .NET和C++编程很像,模仿着C++就能写出C# 来。
element没有类似用attach作为model的构造。SetSourceModelRef设置为attach也没效果。
请参考我改写的代码如下:
public static void DoCopyTest() { DgnModel activeModel = Session.Instance.GetActiveDgnModel(); foreach (DgnAttachment dgnAttach in activeModel.GetDgnAttachments()) { using (ElementCopyContext copier = new ElementCopyContext(activeModel)) { Element elemInRef = dgnAttach.GetDgnModel().FindElementById((ElementId)1438L); if (!elemInRef.IsValid) continue; copier.SetSourceModelRef(dgnAttach); copier.DoCopy(elemInRef); } } }