0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / BinMXCAFDoc / BinMXCAFDoc_LocationDriver.cxx
1 // Created on: 2005-05-17
2 // Created by: Eugeny NAPALKOV
3 // Copyright (c) 2005-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16
17 #include <BinMDataStd.hxx>
18 #include <BinMXCAFDoc_LocationDriver.hxx>
19 #include <BinObjMgt_Persistent.hxx>
20 #include <BinTools_LocationSet.hxx>
21 #include <CDM_MessageDriver.hxx>
22 #include <gp_Mat.hxx>
23 #include <gp_Trsf.hxx>
24 #include <gp_XYZ.hxx>
25 #include <Standard_Type.hxx>
26 #include <TDF_Attribute.hxx>
27 #include <TopLoc_Datum3D.hxx>
28 #include <TopLoc_Location.hxx>
29 #include <XCAFDoc_Location.hxx>
30
31 //#include <Precision.hxx>
32 //=======================================================================
33 //function :
34 //purpose  : 
35 //=======================================================================
36 BinMXCAFDoc_LocationDriver::BinMXCAFDoc_LocationDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
37      : BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_Location)->Name())
38      , myLocations(0) {
39 }
40
41 //=======================================================================
42 //function :
43 //purpose  : 
44 //=======================================================================
45 Handle(TDF_Attribute) BinMXCAFDoc_LocationDriver::NewEmpty() const {
46   return new XCAFDoc_Location();
47 }
48
49 //=======================================================================
50 //function :
51 //purpose  : 
52 //=======================================================================
53 Standard_Boolean BinMXCAFDoc_LocationDriver::Paste(const BinObjMgt_Persistent& theSource,
54                                                    const Handle(TDF_Attribute)& theTarget,
55                                                    BinObjMgt_RRelocationTable& theRelocTable) const
56 {
57   Handle(XCAFDoc_Location) anAtt = Handle(XCAFDoc_Location)::DownCast(theTarget);
58   TopLoc_Location aLoc;
59   Standard_Boolean aRes = Translate(theSource, aLoc, theRelocTable);
60   anAtt->Set(aLoc);
61   return aRes;
62 }
63
64 //=======================================================================
65 //function :
66 //purpose  : 
67 //=======================================================================
68 void BinMXCAFDoc_LocationDriver::Paste(const Handle(TDF_Attribute)& theSource,
69                                        BinObjMgt_Persistent& theTarget,
70                                        BinObjMgt_SRelocationTable& theRelocTable) const
71 {
72   Handle(XCAFDoc_Location) anAtt = Handle(XCAFDoc_Location)::DownCast(theSource);
73   TopLoc_Location aLoc = anAtt->Get();
74   Translate(aLoc, theTarget, theRelocTable);
75 }
76
77 //=======================================================================
78 //function :
79 //purpose  : 
80 //=======================================================================
81 Standard_Boolean BinMXCAFDoc_LocationDriver::Translate(const BinObjMgt_Persistent& theSource,
82                                                        TopLoc_Location& theLoc,
83                                                        BinObjMgt_RRelocationTable& theMap) const
84 {
85   Standard_Integer anId = 0;
86   theSource >> anId;
87   
88   if(anId == 0)
89   {
90     return Standard_True;
91   }
92   
93   Standard_Integer aFileVer = BinMDataStd::DocumentVersion();
94   if( aFileVer > 5 && myLocations == 0 )
95   {
96     return Standard_False;
97   }
98   
99   Standard_Integer aPower;
100   Handle(TopLoc_Datum3D) aDatum;
101   
102   if( aFileVer > 5 )
103   {
104     const TopLoc_Location& aLoc = myLocations->Location(anId);
105     aPower = aLoc.FirstPower();
106     aDatum = aLoc.FirstDatum();
107   } else {
108     theSource >> aPower;
109
110     Standard_Integer aDatumID = -1;
111     Standard_Integer aReadDatum = -1;
112     theSource >> aReadDatum;
113     theSource >> aDatumID;
114     if(aReadDatum != -1) {
115       if(theMap.IsBound(aDatumID)) {
116         aDatum = Handle(TopLoc_Datum3D)::DownCast(theMap.Find(aDatumID));
117       } else
118         return Standard_False;
119     } else {
120       // read the datum's trasformation
121       gp_Trsf aTrsf;
122
123       Standard_Real aScaleFactor;
124       theSource >> aScaleFactor;
125       aTrsf.SetScaleFactor(aScaleFactor);
126
127       Standard_Integer aForm;
128       theSource >> aForm;
129       aTrsf.SetForm((gp_TrsfForm)aForm);
130
131       Standard_Integer R, C;
132       gp_Mat& aMat = (gp_Mat&)aTrsf.HVectorialPart();
133       for(R = 1; R <= 3; R++)
134         for(C = 1; C <= 3; C++) {
135           Standard_Real aVal;
136           theSource >> aVal;
137           aMat.SetValue(R, C, aVal);
138         }
139
140       Standard_Real x, y, z;
141       theSource >> x >> y >> z;
142       gp_XYZ& aLoc = (gp_XYZ&)aTrsf.TranslationPart();
143       aLoc.SetX(x);
144       aLoc.SetY(y);
145       aLoc.SetZ(z);
146
147       aDatum = new TopLoc_Datum3D(aTrsf);
148       theMap.Bind(aDatumID, aDatum);
149     }
150   }
151   
152   //  Get Next Location
153   TopLoc_Location aNextLoc;
154   Translate(theSource, aNextLoc, theMap);
155   
156   //  Calculate the result
157   theLoc = aNextLoc * TopLoc_Location(aDatum).Powered(aPower);
158   return Standard_True;
159 }
160
161 //=======================================================================
162 //function :
163 //purpose  : 
164 //=======================================================================
165 void BinMXCAFDoc_LocationDriver::Translate(const TopLoc_Location& theLoc,
166                                            BinObjMgt_Persistent& theTarget,
167                                            BinObjMgt_SRelocationTable& theMap) const
168 {
169   if(theLoc.IsIdentity()) 
170   {
171     theTarget.PutInteger(0);
172     return;
173   }
174   
175   // The location is not identity  
176   if( myLocations == 0 )
177   {
178 #ifdef OCCT_DEBUG
179     cout<<"Pointer to LocationSet is NULL\n";
180 #endif
181     return;
182   }
183   
184   Standard_Integer anId = myLocations->Add(theLoc);
185   theTarget << anId;
186   
187   // In earlier version of this driver a datums from location stored in 
188   // the relocation table, but now it's not necessary
189   // (try to uncomment it if some problems appear)
190   /*
191   Handle(TopLoc_Datum3D) aDatum = theLoc.FirstDatum();
192   
193   if(!theMap.Contains(aDatum)) {
194     theMap.Add(aDatum);
195   }
196   */
197   
198   Translate(theLoc.NextLocation(), theTarget, theMap);
199 }
200