3D

[OpenCASCADE] STL(Mesh) to Polygon

반응형

[ 2010년에 작성된 글입니다. 지금은 다를 수 있습니다. ]

 

Mesh를 가지고는 OCC에서의 일반적인 알고리즘을 사용할 수 없을 듯 하여,

Polygon 으로 변환을 하였다.

 

물론 Mesh의 삼각형 데이터를 무작정 polygon으로 만든거라....

무식하면서도,, 좀 그렇지만,

어쨋든 간단하게 처리가 가능하므로 일단 적용.

큰 모델에서는 다른 방법이 필요할 듯 하다.

 

OSD_Path aFile("path");
Handle(StlMesh_Mesh) aSTLMesh = RWStl::ReadFile(aFile);
TopoDS_Compound ResultShape;
BRep_Builder CompoundBuilder;
CompoundBuilder.MakeCompound(ResultShape);
Standard_Integer NumberDomains = aSTLMesh->NbDomains();
Standard_Integer iND; gp_XYZ p1, p2, p3;
TopoDS_Vertex Vertex1, Vertex2, Vertex3;
TopoDS_Face AktFace;
TopoDS_Wire AktWire;
BRep_Builder B; Standard_Real x1, y1, z1;
Standard_Real x2, y2, z2;
Standard_Real x3, y3, z3;
StlMesh_MeshExplorer aMExp(aSTLMesh);
for (iND = 1; iND <= NumberDomains; iND++)
{
	for (aMExp.InitTriangle(iND); aMExp.MoreTriangle(); aMExp.NextTriangle())
	{
		aMExp.TriangleVertices(x1, y1, z1, x2, y2, z2, x3, y3, z3);
		p1.SetCoord(x1, y1, z1);
		p2.SetCoord(x2, y2, z2);
		p3.SetCoord(x3, y3, z3);
		if ((!(p1.IsEqual(p2, 0.0))) && (!(p1.IsEqual(p3, 0.0))))
		{
			Vertex1 = BRepBuilderAPI_MakeVertex(p1);
			Vertex2 = BRepBuilderAPI_MakeVertex(p2);
			Vertex3 = BRepBuilderAPI_MakeVertex(p3);
			AktWire = BRepBuilderAPI_MakePolygon(Vertex1, Vertex2, Vertex3, Standard_True);
			if (!AktWire.IsNull())
			{
				AktFace = BRepBuilderAPI_MakeFace(AktWire);
				if (!AktFace.IsNull())
					CompoundBuilder.Add(ResultShape, AktFace);
			}
		}
	}
}
TopoDS_Shape aShape = ResultShape;
반응형