0023024: Update headers of OCCT files
[occt.git] / src / StlAPI / StlAPI_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 <StlAPI_Writer.ixx>
19 #include <StlTransfer.hxx>
20 #include <TopoDS_Shape.hxx>
21 #include <Bnd_Box.hxx>
22 #include <RWStl.hxx>
23 #include <BRepBndLib.hxx>
24 #include <OSD_Path.hxx>
25
26 #define MAX2(X, Y)      (  Abs(X) > Abs(Y)? Abs(X) : Abs(Y) )
27 #define MAX3(X, Y, Z)   ( MAX2 ( MAX2(X,Y) , Z) )
28
29 StlAPI_Writer::StlAPI_Writer()
30 {
31   theStlMesh = new StlMesh_Mesh;
32   theASCIIMode = Standard_True;
33   theDeflection = 0.01;
34   theRelativeMode = Standard_True;
35   theCoefficient = 0.001;
36 }
37
38 void StlAPI_Writer::SetDeflection(const Standard_Real aDeflection) 
39 {
40   theDeflection = aDeflection;
41 }
42 void StlAPI_Writer::SetCoefficient(const Standard_Real aCoefficient) 
43 {
44   theCoefficient = aCoefficient;
45 }
46
47 Standard_Boolean& StlAPI_Writer::RelativeMode() 
48 {
49   return theRelativeMode;
50 }
51
52 Standard_Boolean& StlAPI_Writer::ASCIIMode() 
53 {
54   return theASCIIMode;
55 }
56
57 void StlAPI_Writer::Write(const TopoDS_Shape& aShape,const Standard_CString aFileName) 
58 {
59   OSD_Path aFile(aFileName);
60   if (theRelativeMode) {
61     Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
62     Bnd_Box Total;
63     BRepBndLib::Add(aShape, Total);
64     Total.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
65     theDeflection = MAX3(aXmax-aXmin , aYmax-aYmin , aZmax-aZmin)*theCoefficient;
66   }
67   StlTransfer::BuildIncrementalMesh(aShape, theDeflection, theStlMesh);
68   // Write the built mesh
69   if (theASCIIMode) {
70     RWStl::WriteAscii(theStlMesh, aFile);
71     }  
72   else {
73     RWStl::WriteBinary(theStlMesh, aFile);
74     }
75 }
76