1 #include <StlAPI_Reader.ixx>
3 #include <StlMesh_Mesh.hxx>
4 #include <OSD_Path.hxx>
5 #include <BRep_Builder.hxx>
6 #include <BRepBuilderAPI_MakeVertex.hxx>
7 #include <BRepBuilderAPI_MakePolygon.hxx>
8 #include <BRepBuilderAPI_MakeFace.hxx>
9 #include <BRepBuilderAPI_Sewing.hxx>
11 #include <TopoDS_Compound.hxx>
12 #include <TopoDS_Wire.hxx>
13 #include <TopoDS_Edge.hxx>
14 #include <TopoDS_Vertex.hxx>
15 #include <TopoDS_Face.hxx>
16 #include <TopoDS_Shell.hxx>
17 #include <StlMesh_MeshExplorer.hxx>
21 StlAPI_Reader::StlAPI_Reader() {}
23 void StlAPI_Reader::Read(TopoDS_Shape& aShape, const Standard_CString aFileName)
25 OSD_Path aFile(aFileName);
27 Handle(StlMesh_Mesh) aSTLMesh = RWStl::ReadFile(aFile);
28 Standard_Integer NumberDomains = aSTLMesh->NbDomains();
31 TopoDS_Vertex Vertex1, Vertex2, Vertex3;
34 BRepBuilderAPI_Sewing aSewingTool;
35 Standard_Real x1, y1, z1;
36 Standard_Real x2, y2, z2;
37 Standard_Real x3, y3, z3;
39 aSewingTool.Init(1.0e-06,Standard_True);
41 TopoDS_Compound aComp;
42 BRep_Builder BuildTool;
43 BuildTool.MakeCompound( aComp );
45 StlMesh_MeshExplorer aMExp (aSTLMesh);
47 for (iND=1;iND<=NumberDomains;iND++)
49 for (aMExp.InitTriangle (iND); aMExp.MoreTriangle (); aMExp.NextTriangle ())
51 aMExp.TriangleVertices (x1,y1,z1,x2,y2,z2,x3,y3,z3);
52 p1.SetCoord(x1,y1,z1);
53 p2.SetCoord(x2,y2,z2);
54 p3.SetCoord(x3,y3,z3);
56 if ((!(p1.IsEqual(p2,0.0))) && (!(p1.IsEqual(p3,0.0))))
58 Vertex1 = BRepBuilderAPI_MakeVertex(p1);
59 Vertex2 = BRepBuilderAPI_MakeVertex(p2);
60 Vertex3 = BRepBuilderAPI_MakeVertex(p3);
62 AktWire = BRepBuilderAPI_MakePolygon( Vertex1, Vertex2, Vertex3, Standard_True);
64 if( !AktWire.IsNull())
66 AktFace = BRepBuilderAPI_MakeFace( AktWire);
68 BuildTool.Add( aComp, AktFace );
75 aSewingTool.Load( aComp );
76 aSewingTool.Perform();
77 aShape = aSewingTool.SewedShape();
78 if ( aShape.IsNull() )