Integration of OCCT 6.5.0 from SVN
[occt.git] / src / StlAPI / StlAPI_Reader.cxx
1 #include <StlAPI_Reader.ixx>
2 #include <RWStl.hxx>
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>
10 #include <gp_Pnt.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>
18
19
20
21 StlAPI_Reader::StlAPI_Reader() {}
22
23 void StlAPI_Reader::Read(TopoDS_Shape& aShape, const Standard_CString aFileName) 
24 {
25   OSD_Path aFile(aFileName);
26   
27   Handle(StlMesh_Mesh) aSTLMesh = RWStl::ReadFile(aFile);
28   Standard_Integer NumberDomains = aSTLMesh->NbDomains();
29   Standard_Integer iND;
30   gp_XYZ p1, p2, p3;
31   TopoDS_Vertex Vertex1, Vertex2, Vertex3;
32   TopoDS_Face AktFace;
33   TopoDS_Wire AktWire;
34   BRepBuilderAPI_Sewing aSewingTool;
35   Standard_Real x1, y1, z1;
36   Standard_Real x2, y2, z2;
37   Standard_Real x3, y3, z3;
38   
39   aSewingTool.Init(1.0e-06,Standard_True);
40   
41   TopoDS_Compound aComp;
42   BRep_Builder BuildTool;
43   BuildTool.MakeCompound( aComp );
44
45   StlMesh_MeshExplorer aMExp (aSTLMesh);
46   
47   for (iND=1;iND<=NumberDomains;iND++) 
48   {
49     for (aMExp.InitTriangle (iND); aMExp.MoreTriangle (); aMExp.NextTriangle ()) 
50     {
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);
55       
56       if ((!(p1.IsEqual(p2,0.0))) && (!(p1.IsEqual(p3,0.0))))
57       {
58         Vertex1 = BRepBuilderAPI_MakeVertex(p1);
59         Vertex2 = BRepBuilderAPI_MakeVertex(p2);
60         Vertex3 = BRepBuilderAPI_MakeVertex(p3);
61         
62         AktWire = BRepBuilderAPI_MakePolygon( Vertex1, Vertex2, Vertex3, Standard_True);
63         
64         if( !AktWire.IsNull())
65         {
66           AktFace = BRepBuilderAPI_MakeFace( AktWire);
67           if(!AktFace.IsNull())
68             BuildTool.Add( aComp, AktFace );
69         }
70       }
71     }
72   }
73   aSTLMesh->Clear();
74
75   aSewingTool.Load( aComp );
76   aSewingTool.Perform();
77   aShape = aSewingTool.SewedShape();
78   if ( aShape.IsNull() )
79     aShape = aComp;
80 }
81