0023024: Update headers of OCCT files
[occt.git] / src / VrmlAPI / VrmlAPI_Writer.cxx
1 // Copyright (c) 1999-2012 OPEN CASCADE SAS
2 //
3 // The content of this file is subject to the Open CASCADE Technology Public
4 // License Version 6.5 (the "License"). You may not use the content of this file
5 // except in compliance with the License. Please obtain a copy of the License
6 // at http://www.opencascade.org and read it completely before using this file.
7 //
8 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
9 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
10 //
11 // The Original Code and all software distributed under the License is
12 // distributed on an "AS IS" basis, without warranty of any kind, and the
13 // Initial Developer hereby disclaims all such warranties, including without
14 // limitation, any warranties of merchantability, fitness for a particular
15 // purpose or non-infringement. Please see the License for the specific terms
16 // and conditions governing the rights and limitations under the License.
17
18 #include <Standard_Stream.hxx>
19 #include <VrmlAPI_Writer.ixx>
20 #include <Vrml_Material.hxx>
21 #include <Quantity_HArray1OfColor.hxx>
22 #include <TopoDS_Shape.hxx>
23 #include <TColStd_HArray1OfReal.hxx>
24 #include <OSD_Path.hxx>
25 #include <VrmlConverter_IsoAspect.hxx>
26 #include <VrmlConverter_LineAspect.hxx>
27 #include <VrmlConverter_PointAspect.hxx>
28 #include <VrmlConverter_ShadingAspect.hxx>
29 #include <TopTools_Array1OfShape.hxx>
30 #include <Vrml.hxx>
31 #include <VrmlConverter_Projector.hxx>
32 #include <VrmlConverter_ShadedShape.hxx>
33 #include <Vrml_Group.hxx>
34 #include <Vrml_Instancing.hxx>
35 #include <Vrml_Separator.hxx>
36 #include <VrmlConverter_WFDeflectionShape.hxx>
37
38 VrmlAPI_Writer::VrmlAPI_Writer()
39 {
40   myDrawer = new VrmlConverter_Drawer;
41   myDeflection = -1;
42   Quantity_Color color;
43   color.SetValues(0, 0, 0, Quantity_TOC_RGB);
44   Handle(Quantity_HArray1OfColor) Col1 = new Quantity_HArray1OfColor(1,1);
45   Col1->SetValue(1,color);
46   Handle(TColStd_HArray1OfReal) kik1 = new TColStd_HArray1OfReal(1,1,0.0);
47   Handle(TColStd_HArray1OfReal) kik2 = new TColStd_HArray1OfReal(1,1,0.1);
48   myFrontMaterial = new Vrml_Material(Col1,Col1, Col1, Col1, kik1, kik2);
49   myPointsMaterial = new Vrml_Material(Col1,Col1, Col1, Col1, kik1, kik2);
50   myUisoMaterial = new Vrml_Material(Col1,Col1, Col1, Col1, kik1, kik2);
51   myVisoMaterial = new Vrml_Material(Col1,Col1, Col1, Col1, kik1, kik2);
52   myLineMaterial = new Vrml_Material(Col1,Col1, Col1, Col1, kik1, kik2);
53   myWireMaterial = new Vrml_Material(Col1,Col1, Col1, Col1, kik1, kik2);
54   myFreeBoundsMaterial = new Vrml_Material(Col1,Col1, Col1, Col1, kik1, kik2);
55   myUnfreeBoundsMaterial = new Vrml_Material(Col1,Col1, Col1, Col1, kik1, kik2);
56   DX = 1;      
57   DY = -1;  
58   DZ = 1;
59   XUp = 0;
60   YUp = 0;
61   ZUp = 1;
62   Focus = 6;
63   ResetToDefaults();
64 }
65
66 void VrmlAPI_Writer::ResetToDefaults() 
67 {
68   myTransparency = 0.0;
69   myShininess = 0.1;
70   Handle(TColStd_HArray1OfReal) kik1 = new TColStd_HArray1OfReal(1,1,myTransparency);
71   Handle(TColStd_HArray1OfReal) kik2 = new TColStd_HArray1OfReal(1,1,myShininess);
72   Handle(Quantity_HArray1OfColor) Col = new Quantity_HArray1OfColor(1,1);
73   Quantity_Color color; 
74   color.SetValues(0, 0, 0, Quantity_TOC_RGB);
75   Col->SetValue(1,color);
76   //
77   myFrontMaterial->SetAmbientColor(Col); myFrontMaterial->SetTransparency(kik1);myFrontMaterial->SetShininess(kik2);
78   myPointsMaterial->SetAmbientColor(Col); myPointsMaterial->SetTransparency(kik1);myPointsMaterial->SetShininess(kik2);
79   myUisoMaterial->SetAmbientColor(Col); myUisoMaterial->SetTransparency(kik1);myUisoMaterial->SetShininess(kik2);
80   myVisoMaterial->SetAmbientColor(Col); myVisoMaterial->SetTransparency(kik1);myVisoMaterial->SetShininess(kik2);
81   myLineMaterial->SetAmbientColor(Col); myLineMaterial->SetTransparency(kik1);myLineMaterial->SetShininess(kik2);
82   myWireMaterial->SetAmbientColor(Col); myWireMaterial->SetTransparency(kik1); myWireMaterial->SetShininess(kik2);
83   myFreeBoundsMaterial->SetAmbientColor(Col); myFreeBoundsMaterial->SetTransparency(kik1);myFreeBoundsMaterial->SetShininess(kik2);
84   myUnfreeBoundsMaterial->SetAmbientColor(Col); myUnfreeBoundsMaterial->SetTransparency(kik1);myUnfreeBoundsMaterial->SetShininess(kik2);
85   //
86   //
87   Handle(Quantity_HArray1OfColor) Col2 = new Quantity_HArray1OfColor(1,1);
88   color.SetValues(0.75, 0.75, 0.75, Quantity_TOC_RGB);
89   Col2->SetValue(1,color);
90   Handle(Quantity_HArray1OfColor) Col3 = new Quantity_HArray1OfColor(1,1);
91   color.SetValues(0.82, 0.79, 0.42, Quantity_TOC_RGB);
92   Col3->SetValue(1,color);
93   
94   myUisoMaterial->SetDiffuseColor(Col2);
95   myVisoMaterial->SetDiffuseColor(Col2);
96   myFreeBoundsMaterial->SetDiffuseColor(Col2);
97   myUnfreeBoundsMaterial->SetDiffuseColor(Col2);
98   
99   //
100 //  Handle(Quantity_HArray1OfColor) Col3 = new Quantity_HArray1OfColor(1,1);
101 //  color.SetValues(Quantity_NOC_GOLD);
102 //  Col3->SetValue(1,color);
103   myLineMaterial->SetDiffuseColor(Col2);
104   myWireMaterial->SetDiffuseColor(Col2);
105   //
106 //  Handle(Quantity_HArray1OfColor) Col4 = new Quantity_HArray1OfColor(1,1);
107 //  color.SetValues(Quantity_NOC_GOLD);
108 //  Col4->SetValue(1,color);
109   myFrontMaterial->SetDiffuseColor(Col2);
110   myPointsMaterial->SetDiffuseColor(Col2);
111   //
112   
113   myUisoMaterial->SetSpecularColor(Col3);
114   myVisoMaterial->SetSpecularColor(Col3);
115   myFreeBoundsMaterial->SetSpecularColor(Col3);
116   myUnfreeBoundsMaterial->SetSpecularColor(Col3);
117   myLineMaterial->SetSpecularColor(Col3);
118   myWireMaterial->SetSpecularColor(Col3);
119   myFrontMaterial->SetSpecularColor(Col3);
120   myPointsMaterial->SetSpecularColor(Col3);
121   
122   myRepresentation = VrmlAPI_BothRepresentation;
123 }
124 Handle(VrmlConverter_Drawer) VrmlAPI_Writer::Drawer() const
125 {
126   return myDrawer;
127 }
128 void VrmlAPI_Writer::SetDeflection(const Standard_Real aDef)
129 {
130   myDeflection = aDef;
131   if (myDeflection > 0) {
132     myDrawer->SetMaximalChordialDeviation(myDeflection);
133     myDrawer->SetTypeOfDeflection(Aspect_TOD_ABSOLUTE);
134   }
135   else myDrawer->SetTypeOfDeflection(Aspect_TOD_RELATIVE);
136 }
137 void VrmlAPI_Writer::SetRepresentation(const VrmlAPI_RepresentationOfShape aRep)
138 {
139   myRepresentation = aRep;
140 }
141 void VrmlAPI_Writer::SetTransparencyToMaterial(Handle(Vrml_Material)& aMaterial,const Standard_Real aTransparency) 
142 {
143   Handle(TColStd_HArray1OfReal) t = new TColStd_HArray1OfReal(1,1,aTransparency);
144   aMaterial->SetTransparency(t);
145 }
146
147 void VrmlAPI_Writer::SetShininessToMaterial(Handle(Vrml_Material)& aMaterial,const Standard_Real aShininess) 
148 {  
149   Handle(TColStd_HArray1OfReal) s = new TColStd_HArray1OfReal(1,1,aShininess);
150   aMaterial->SetShininess(s);
151 }
152
153 void VrmlAPI_Writer::SetAmbientColorToMaterial(Handle(Vrml_Material)& aMaterial,const Handle(Quantity_HArray1OfColor)& Color) 
154 {
155   aMaterial->SetAmbientColor(Color);
156 }
157
158 void VrmlAPI_Writer::SetDiffuseColorToMaterial(Handle(Vrml_Material)& aMaterial,const Handle(Quantity_HArray1OfColor)& Color) 
159 {
160   aMaterial->SetDiffuseColor(Color);
161 }
162
163 void VrmlAPI_Writer::SetSpecularColorToMaterial(Handle(Vrml_Material)& aMaterial,const Handle(Quantity_HArray1OfColor)& Color) 
164 {
165   aMaterial->SetSpecularColor(Color);
166 }
167
168 void VrmlAPI_Writer::SetEmissiveColorToMaterial(Handle(Vrml_Material)& aMaterial,const Handle(Quantity_HArray1OfColor)& Color) 
169 {
170   aMaterial->SetEmissiveColor(Color);
171 }
172
173 VrmlAPI_RepresentationOfShape VrmlAPI_Writer::GetRepresentation() const
174 {
175   return myRepresentation;  
176 }
177
178 Handle(Vrml_Material) VrmlAPI_Writer::GetFrontMaterial() const
179 {
180   return myFrontMaterial;
181 }
182
183 Handle(Vrml_Material) VrmlAPI_Writer::GetPointsMaterial() const
184 {
185   return myPointsMaterial;
186 }
187
188 Handle(Vrml_Material) VrmlAPI_Writer::GetUisoMaterial() const
189 {
190   return myUisoMaterial;
191 }
192
193 Handle(Vrml_Material) VrmlAPI_Writer::GetVisoMaterial() const
194 {
195   return myVisoMaterial;
196 }
197
198 Handle(Vrml_Material) VrmlAPI_Writer::GetLineMaterial() const
199 {
200   return myLineMaterial;
201 }
202
203 Handle(Vrml_Material) VrmlAPI_Writer::GetWireMaterial() const
204 {
205   return myWireMaterial;
206 }
207
208 Handle(Vrml_Material) VrmlAPI_Writer::GetFreeBoundsMaterial() const
209 {
210   return myFreeBoundsMaterial;
211 }
212
213 Handle(Vrml_Material) VrmlAPI_Writer::GetUnfreeBoundsMaterial() const
214 {
215   return myUnfreeBoundsMaterial;
216 }
217
218 void VrmlAPI_Writer::Write(const TopoDS_Shape& aShape,const Standard_CString aFile) const
219 {
220   OSD_Path thePath(aFile);
221   TCollection_AsciiString theFile;thePath.SystemName(theFile);
222   ofstream outfile;
223   outfile.open(theFile.ToCString(),  ios::out);
224   Handle(VrmlConverter_IsoAspect) ia = new VrmlConverter_IsoAspect;  // UIso
225   Handle(VrmlConverter_IsoAspect) ia1 = new VrmlConverter_IsoAspect; //VIso
226   ia->SetMaterial(myUisoMaterial);
227   ia->SetHasMaterial(Standard_True);
228   myDrawer->SetUIsoAspect(ia);
229   ia1->SetMaterial(myVisoMaterial);
230   ia1->SetHasMaterial(Standard_True);
231   myDrawer->SetVIsoAspect(ia1);
232 // default Number of iso lines is 10
233 //----  Definition of LineAspect (default - without own material)
234   Handle(VrmlConverter_LineAspect) la = new VrmlConverter_LineAspect;
235   la->SetMaterial(myLineMaterial);
236   la->SetHasMaterial(Standard_True);
237   myDrawer->SetLineAspect(la);
238 //----  Definition of Wire (without any neighbour)
239   Handle(VrmlConverter_LineAspect) lw = new VrmlConverter_LineAspect;
240   lw->SetMaterial(myWireMaterial);
241   lw->SetHasMaterial(Standard_True);
242   myDrawer->SetWireAspect(lw);
243 //----  Definition of Free boundaries
244   Handle(VrmlConverter_LineAspect) lf = new VrmlConverter_LineAspect;
245   lf->SetMaterial(myFreeBoundsMaterial);
246   lf->SetHasMaterial(Standard_True);
247   myDrawer->SetFreeBoundaryAspect(lf);
248 //----  Definition of Unfree boundaries
249   Handle(VrmlConverter_LineAspect) lun = new VrmlConverter_LineAspect;
250   lun->SetMaterial(myUnfreeBoundsMaterial);
251   lun->SetHasMaterial(Standard_True);
252   myDrawer->SetUnFreeBoundaryAspect(lun);
253 //----  Definition of Points (default - without own material)
254   Handle(VrmlConverter_PointAspect) pa = new VrmlConverter_PointAspect;
255   pa->SetMaterial(myPointsMaterial);
256   pa->SetHasMaterial(Standard_True);
257   myDrawer->SetPointAspect(pa);
258 //-----------------------------------------
259   Handle(VrmlConverter_ShadingAspect) sa = new VrmlConverter_ShadingAspect;
260   sa->SetFrontMaterial(myFrontMaterial);
261   sa->SetHasMaterial(Standard_True);
262   Vrml_ShapeHints  sh;
263   sa->SetShapeHints(sh);
264   myDrawer->SetShadingAspect(sa);
265 //-------- Shape --------------------------
266   TopTools_Array1OfShape Shapes(1,1);
267   Shapes.SetValue(1,aShape);
268
269 //=========================================
270 //----  Definition of data for Projector
271 //=========================================
272
273   VrmlConverter_TypeOfLight Light = VrmlConverter_NoLight;
274   VrmlConverter_TypeOfCamera Camera = VrmlConverter_PerspectiveCamera;
275   Handle(VrmlConverter_Projector) projector = new VrmlConverter_Projector (Shapes, 
276                                                                            Focus, 
277                                                                            DX,  DY,  DZ, 
278                                                                            XUp, YUp, ZUp,
279                                                                            Camera,
280                                                                            Light);
281   Vrml::VrmlHeaderWriter(outfile);
282   if (myRepresentation == VrmlAPI_BothRepresentation)
283     Vrml::CommentWriter(" This file contents both Shaded and Wire Frame representation of selected Shape ",outfile);   
284   if (myRepresentation == VrmlAPI_ShadedRepresentation)
285     Vrml::CommentWriter(" This file contents only Shaded representation of selected Shape ",outfile);   
286   if (myRepresentation == VrmlAPI_WireFrameRepresentation)
287     Vrml::CommentWriter(" This file contents only Wire Frame representation of selected Shape ",outfile);   
288   Vrml_Separator S1;
289   S1.Print(outfile); 
290   projector->Add(outfile);
291   Light = VrmlConverter_DirectionLight;
292   Camera = VrmlConverter_OrthographicCamera;
293   Handle(VrmlConverter_Projector) projector1 = new VrmlConverter_Projector (Shapes, 
294                                                                            Focus, 
295                                                                            DX,  DY,  DZ, 
296                                                                            XUp, YUp, ZUp,
297                                                                            Camera,
298                                                                            Light);
299   projector1->Add(outfile);
300   Vrml_Separator S2;
301   S2.Print(outfile); 
302   if (myRepresentation == VrmlAPI_ShadedRepresentation || myRepresentation == VrmlAPI_BothRepresentation)
303     {
304       Vrml_Group Group1;
305       Group1.Print(outfile);
306       Vrml_Instancing I2 ("Shaded representation of shape");
307       I2.DEF(outfile);
308       VrmlConverter_ShadedShape::Add(outfile,aShape,myDrawer);
309       Group1.Print(outfile);
310     }
311   if (myRepresentation == VrmlAPI_WireFrameRepresentation || myRepresentation == VrmlAPI_BothRepresentation)
312     {
313       Vrml_Group Group2;
314       Group2.Print(outfile);
315       Vrml_Instancing I3 ("Wire Frame representation of shape");
316       I3.DEF(outfile);
317       VrmlConverter_WFDeflectionShape::Add(outfile,aShape,myDrawer);
318       Group2.Print(outfile);
319     }
320   S2.Print(outfile); 
321   S1.Print(outfile); 
322 }
323