반응형
[ 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;
반응형
'3D' 카테고리의 다른 글
[OSG] 초기 화면 비율 조정 (0) | 2021.03.13 |
---|---|
[OpenCASCADE] STL(Mesh) to Polygon 2 (0) | 2021.03.13 |
[OpenCASCADE] Shape Edge Intersection (0) | 2021.03.13 |
[OpenCASCADE] Gradient Background 표현하기 (0) | 2021.03.13 |
[OpenCASCADE] Intersection (Shape - Plane) (0) | 2021.03.13 |