5aaa2f5a124b55001ae13a89b999961e82062a86
[occt.git] / src / XSDRAWSTLVRML / XSDRAWSTLVRML_ToVRML.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include <XSDRAWSTLVRML_ToVRML.ixx>
15
16 #include <Standard_Stream.hxx>
17 #include <BRepMesh_FastDiscret.hxx>
18 #include <BRepMesh_Triangle.hxx>
19 #include <BRepMesh_Edge.hxx>
20 #include <Bnd_Box.hxx>
21 #include <BRepBndLib.hxx>
22 #include <TopExp_Explorer.hxx>
23 #include <TopoDS.hxx>
24
25 #include <gp_Pnt.hxx> //ied_modif_for_compil_Nov-20-1998
26
27 XSDRAWSTLVRML_ToVRML::XSDRAWSTLVRML_ToVRML  ()
28 {
29   myEmissiveColorRed   = 0.3;
30   myEmissiveColorGreen = 0.3;
31   myEmissiveColorBlue  = 0.3;
32   myDiffuseColorRed    = 0.3;
33   myDiffuseColorGreen  = 0.3;
34   myDiffuseColorBlue   = 0.5;
35   myTransparency       = 0.0;
36   myAmbientIntensity   = 0.3;
37   mySpecularColorRed   = 0.7;
38   mySpecularColorGreen = 0.7;
39   mySpecularColorBlue  = 0.8;
40   myShininess   = 0.1;
41   myTexture     = " [] " ;
42   myCreaseAngle = 1.57;
43   myDeflection  = 0.005;
44 }
45
46 Standard_Real&  XSDRAWSTLVRML_ToVRML::EmissiveColorRed  ()  {  return myEmissiveColorRed  ;  }
47 Standard_Real&  XSDRAWSTLVRML_ToVRML::EmissiveColorGreen()  {  return myEmissiveColorGreen;  }
48 Standard_Real&  XSDRAWSTLVRML_ToVRML::EmissiveColorBlue ()  {  return myEmissiveColorBlue ;  }
49 Standard_Real&  XSDRAWSTLVRML_ToVRML::DiffuseColorRed   ()  {  return myDiffuseColorRed   ;  }
50 Standard_Real&  XSDRAWSTLVRML_ToVRML::DiffuseColorGreen ()  {  return myDiffuseColorGreen ;  }
51 Standard_Real&  XSDRAWSTLVRML_ToVRML::DiffuseColorBlue  ()  {  return myDiffuseColorBlue  ;  }
52 Standard_Real&  XSDRAWSTLVRML_ToVRML::Transparency      ()  {  return myTransparency      ;  }
53 Standard_Real&  XSDRAWSTLVRML_ToVRML::AmbientIntensity  ()  {  return myAmbientIntensity  ;  }
54 Standard_Real&  XSDRAWSTLVRML_ToVRML::SpecularColorRed  ()  {  return mySpecularColorRed  ;  }
55 Standard_Real&  XSDRAWSTLVRML_ToVRML::SpecularColorGreen()  {  return mySpecularColorGreen;  }
56 Standard_Real&  XSDRAWSTLVRML_ToVRML::SpecularColorBlue ()  {  return mySpecularColorBlue ;  }
57 Standard_Real&  XSDRAWSTLVRML_ToVRML::Shininess  ()         {  return myShininess  ;  }
58 TCollection_AsciiString&  XSDRAWSTLVRML_ToVRML::Texture ()  {  return myTexture    ;  }
59 Standard_Real&  XSDRAWSTLVRML_ToVRML::CreaseAngle()         {  return myCreaseAngle;  }
60 Standard_Real&  XSDRAWSTLVRML_ToVRML::Deflection ()         {  return myDeflection ;  }
61
62 //=======================================================================
63 // function : ToVRML::Write
64 // purpose  : conversion of a Shape into VRML format for 3d visualisation
65 //=======================================================================
66
67 Standard_Boolean  XSDRAWSTLVRML_ToVRML::Write
68   (const TopoDS_Shape& theShape, const Standard_CString theFileName) const
69 {
70   filebuf aFile;
71   ostream anOut(&aFile);
72
73   if ( aFile.open(theFileName,ios::out) )
74   {
75     // Creates facets from the shape
76     // Create (defle     : Real    from Standard;
77     //         shape     : Shape   from TopoDS;
78     //         angl      : Real    from Standard = 0.17;
79     //         withShare : Boolean from Standard = Standard_True;
80     //         inshape   : Boolean from Standard = Standard_False;
81     //         relative  : Boolean from Standard = Standard_False;
82     //         shapetrigu: Boolean from Standard = Standard_False)
83     //         returns mutable Discret from BRepMesh;
84
85     Bnd_Box aBox;
86     BRepBndLib::Add(theShape, aBox);
87
88     Handle(BRepMesh_FastDiscret) aDiscret =
89       new BRepMesh_FastDiscret( theShape,
90                                 myDeflection,
91                                 0.17,
92                                 aBox,
93                                 Standard_True,
94                                 Standard_False,
95                                 Standard_True,
96                                 Standard_True );
97
98       // Header of the VRML file
99       anOut << "#VRML V2.0 utf8" << endl;
100       anOut << "Group {" << endl;
101       anOut << "  children [ " << endl;
102       anOut << "    NavigationInfo {" << endl;
103       anOut << "      type \"EXAMINE\" " << endl;
104       anOut << "    }," << endl;
105       anOut << "    Shape {" << endl;
106
107       anOut << "      appearance Appearance {" << endl;
108       anOut << "        texture ImageTexture {" << endl;
109       anOut << "          url " << myTexture.ToCString() << endl;
110       anOut << "        }" << endl;
111       anOut << "        material Material {" << endl;
112       anOut << "          diffuseColor " << myDiffuseColorRed << " "
113                                          << myDiffuseColorGreen << " "
114                                          << myDiffuseColorBlue << " " << endl;
115       anOut << "          emissiveColor " << myEmissiveColorRed << " "
116                                           << myEmissiveColorGreen << " "
117                                           << myEmissiveColorBlue << " " << endl;
118       anOut << "          transparency " << myTransparency << endl;
119       anOut << "          ambientIntensity " << myAmbientIntensity << " " << endl;
120       anOut << "          specularColor " << mySpecularColorRed << " "
121                                           << mySpecularColorGreen << " "
122                                           << mySpecularColorBlue << " " << endl;
123       anOut << "          shininess " << myShininess << " " << endl;
124       anOut << "        }" << endl;
125       anOut << "      }" << endl;
126
127       anOut << "      geometry IndexedFaceSet {" << endl;
128       anOut << "        coord Coordinate {" << endl;
129       anOut << "          point [" << endl;
130
131       // Puts the coordinates of all the vertices using the order
132       // given during the discretisation
133       TopExp_Explorer aFaceIt(theShape, TopAbs_FACE);
134       for (; aFaceIt.More(); aFaceIt.Next())
135       {
136         Handle(BRepMesh_FaceAttribute) anAttribute;
137         const TopoDS_Face& aFace = TopoDS::Face(aFaceIt.Current());
138         if (!aDiscret->GetFaceAttribute(aFace, anAttribute) || !anAttribute->IsValid())
139           continue;
140
141         Handle(BRepMesh_DataStructureOfDelaun)& aStructure =
142           anAttribute->ChangeStructure();
143
144         const Standard_Integer aNbVertices = aStructure->NbNodes();
145         for (Standard_Integer i = 1; i <= aNbVertices; ++i)
146         {
147           const BRepMesh_Vertex& aVertex = aStructure->GetNode(i);
148           const gp_Pnt&          aPoint  = anAttribute->GetPoint(aVertex);
149
150           anOut << "          "
151             << aPoint.Coord().X() << " "
152             << aPoint.Coord().Y() << " "
153             << aPoint.Coord().Z() << "," << endl;
154         }
155       }
156
157       anOut << "          ]" << endl;
158       anOut << "        }" << endl;
159       anOut << "        coordIndex [" << endl;
160
161       // Retrieves all the triangles in order to draw the facets
162       for (aFaceIt.Init(theShape, TopAbs_FACE); aFaceIt.More(); aFaceIt.Next())
163       {
164         Handle(BRepMesh_FaceAttribute) anAttribute;
165         const TopoDS_Face& aFace = TopoDS::Face(aFaceIt.Current());
166
167         if (!aDiscret->GetFaceAttribute(aFace, anAttribute) || !anAttribute->IsValid())
168           continue;
169
170         Handle(BRepMesh_DataStructureOfDelaun)& aStructure =
171           anAttribute->ChangeStructure();
172
173         const Standard_Integer aNbTriangles = aStructure->NbElements();
174         for ( Standard_Integer i = 1; i <= aNbTriangles; ++i )
175         {
176           const BRepMesh_Triangle& aTriangle = aStructure->GetElement(i);
177
178           Standard_Integer v[3];
179           aStructure->ElementNodes(aTriangle, v);
180
181           anOut << "          "
182                 << v[0] - 1 << ", "
183                 << v[1] - 1 << ", "
184                 << v[2] - 1 << ", -1," << endl;
185         }
186       }
187
188       anOut << "        ]" << endl;
189       anOut << "        solid FALSE" << endl; // it is not a closed solid
190       anOut << "        creaseAngle " << myCreaseAngle << " " << endl; // for smooth shading
191       anOut << "      }" << endl;
192       anOut << "    }" << endl;
193       anOut << "  ]" << endl;
194       anOut << "}" << endl;
195   }
196   else
197   {
198     // Failure when opening file
199     return Standard_False;
200   }
201
202   aFile.close();
203   return Standard_True;
204 }
205