[MSCE C++]Mesh面片拖拽相关的API

请问MS update13 的SDK中有没有拖拽面片相关的API可以用?类似于MS ce版本中的Drag mesh功能。我想选中一个mesh网格中的几个面片然后对这几个面片进行处理。

Parents Reply Children
  • 给您提供一个我曾经写过的测试样例供参考:

    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?

    Work smart, not just work hard!

  • 可借助于类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();我用了,发现没作用,点集没有加进去,请问有什么方法吗?求指教!谢谢!

    Work smart, not just work hard!

  • 推荐您一个方法,在您要加的点处构造一个体,然后把这个体转成Mesh元素跟要往上加这个点的Mesh去做Union。