请问MS update13 的SDK中有没有拖拽面片相关的API可以用?类似于MS ce版本中的Drag mesh功能。我想选中一个mesh网格中的几个面片然后对这几个面片进行处理。
API中的函数一般就来说都是非常底层的,并不对应一个个工具。
对于您这个需求,如果Mesh的类型是Indexed的话,只需要找到相应的Vertex数组,修改一个顶点坐标位置即可。您需要首先到开发帮助文档中学习一下Mesh的数据的存储知识然后才能正确编写Mesh相关的代码。
对于一个mesh元素,我鼠标选中的话一般都是选中整个mesh元素的
Work smart, not just work hard!
比如Drag Mesh工具会出现如下这样的画面:
这些黄色的部分你可以根据用户框选的Mesh的vertex构造这些边,然后用transient element(瞬态元素)表示它们。请查看MDL函数mdlTransient_xxx,这些瞬态元素不会添加到当前模型中,仅作为临时显示之用。
郭老师,我使用Polygon框选了一个范围,请问如何判断这个mesh上的哪些面片被我框选住了?目前我只知道如何判断一个点是不是在一个Polygon里面(mdlPolygon_pointInsideXY),判断面片的方法有吗?
感谢符工,确实可以用transient element来高亮显示出我选择了哪些面片
您可以判断一下面的每一个点是不是都在Polygon里边,从而确定这个面是否被框选中了。
郭老师,PolyfaceVisitor里面的函数是在是太多了。如何遍历所有的面片,并获取每个面片对应的点?
给您提供一个我曾经写过的测试样例供参考:
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); 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++; } }
符工,niubility!
现在能够实现获取局部面片;遍历整个面片,判断哪些面片在我的polygon里面;
请问如何把polygon里面的完整的面片去掉,然后跟新建的面片组合成新的mesh?
可借助于类PolyfaceCoordinateMap下的AddVistorFace将满足条件的面添加到一个新的Mesh中从而过滤掉不要的点。这样是生成了一个新的Mesh,可将老的Mesh删除即可。详细使用参考如下代码。我只是简单地设置了一个DRange3d进行点的过滤。
void meshCopyFacets(WCharCP unparsed) { //1 ---- Get a PolyfaceHeader from ElementId (without any error checking) ElementHandle eh(226L, ACTIVEMODEL); auto meshQuery = dynamic_cast<IMeshQuery*>(&eh.GetHandler()); PolyfaceHeaderPtr pInMesh; meshQuery->GetMeshData(eh, pInMesh); //2 ---- Create a PolyfaceHeader and connect it to a PolyfaceCoordinateMap PolyfaceHeaderPtr pOutMesh = PolyfaceHeader::CreateVariableSizeIndexed(); pOutMesh->CopyAllActiveFlagsFrom(*pInMesh); PolyfaceCoordinateMapPtr pfmap = PolyfaceCoordinateMap::Create(*pOutMesh); //3 ---- Filter facets into PolyfaceCoordinateMap DRange3d range = DRange3d::FromMinMax(-50000, 50000); PolyfaceVisitorPtr pv = PolyfaceVisitor::Attach(*pInMesh); while (pv->AdvanceToNextFace()) { BlockedVectorDPoint3dR pts = pv->Point(); for (DPoint3d pt : pts) { if (!range.IsContained(pt)) { pfmap->AddVisitorFace(*pv); break; } } } //4 ---- Add output mesh into current model EditElementHandle eeh; pOutMesh->Triangulate(100); MeshHeaderHandler::CreateMeshElement(eeh, nullptr, *pOutMesh, true, *ACTIVEMODEL); eeh.AddToModel(); }
执行结果如下图所示,能够看到右侧的Mesh被剪去了一块。
感谢符老师,刚刚有空测试上面的代码,确实可以过滤掉选定范围的mesh面片。如果我想向一个已经存在mesh里添加多个点坐标,然后重构mesh,但是原来的mesh边界,面片(点集未影响到的)不要发生变化?请问这个PolyfaceCoordinateMapPtr类里面有什么方法吗?
我注意到有一个方法,AddPoint();我用了,发现没作用,点集没有加进去,请问有什么方法吗?求指教!谢谢!
推荐您一个方法,在您要加的点处构造一个体,然后把这个体转成Mesh元素跟要往上加这个点的Mesh去做Union。