我在参考c++例子的时候发现ELementHandle类型在Bentley.DgnPlatform下,Bentley.DgnPlatformNET并无法创建这个对象,那么按照下面的方法我就无法继续获取了,求解
void meshQuery(WCharCP unparsed) { ElementHandle eh(849L, ACTIVEMODEL); if (!eh.IsValid()) { mdlDialog_dmsgsPrint(L"invalid element id"); return; } auto meshQuery = dynamic_cast<IMeshQuery*>(&eh.GetHandler()); if (nullptr == meshQuery) return; PolyfaceHeaderPtr pMesh; meshQuery->GetMeshData(eh, pMesh); size_t numVertex, numFacet, numQuad, numTriangle, numImplicitTriangle, numVisEdges, numInvEdges; pMesh->CollectCounts(numVertex, numFacet, numQuad, numTriangle, numImplicitTriangle, numVisEdges, numInvEdges); WPrintfString myStr(L"mesh style = %d, numVertex = %d, numFacet = %d, numQuad = %d, numTriangle = %d", pMesh->GetMeshStyle(), numVertex, numFacet, numQuad, numTriangle); mdlDialog_dmsgsPrint(myStr.GetWCharCP()); PolyfaceVisitorPtr pv = PolyfaceVisitor::Attach(*pMesh); int nFace = 1; while (pv->AdvanceToNextFace()) { myStr.Sprintf(L"------------ face %d ------------", nFace); mdlDialog_dmsgsPrint(myStr.GetWCharCP()); BlockedVectorDPoint3dR pts = pv->Point(); for (DPoint3d pt : pts) { myStr.Sprintf(L"x = %.2f, y = %.2f, z = %.2f", pt.x, pt.y, pt.z); mdlDialog_dmsgsPrint(myStr.GetWCharCP()); } nFace++; } }
C# 中的Element就对应于C++中的ElementHandle。请参考如下C# 代码:
private static void GetMeshPoints() { DgnModel dgnModel = Session.Instance.GetActiveDgnModel(); MeshHeaderElement meshElem = dgnModel.FindElementById((ElementId)1447L) as MeshHeaderElement; using(PolyfaceVisitor pv = new PolyfaceVisitor(meshElem.GetMeshData(), true)) { while (pv.AdvanceToNextFace()) { IEnumerator<DPoint3d> pts = pv.Point.GetEnumerator(); while (pts.MoveNext()) { DPoint3d pt = pts.Current; //MessageCenter.Instance.ShowInfoMessage(pt.ToString(), null, false); } } } }
MS学习资源:
MicroStation Wednesday视频分享
深入探讨MicroStation DGN基本概念系列
一步步学习MicroStation CE Addin开发
一步步学习MicroStation CE MDL开发
Answer Verified By: micro wish