0026936: Drawbacks of inlining in new type system in OCCT 7.0 -- automatic
[occt.git] / src / BinMNaming / BinMNaming_NamedShapeDriver.cxx
1 // Created on: 2004-04-08
2 // Created by: Sergey ZARITCHNY
3 // Copyright (c) 2004-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 <BinMNaming_NamedShapeDriver.hxx>
18 #include <BinObjMgt_Persistent.hxx>
19 #include <BinTools_LocationSet.hxx>
20 #include <BinTools_ShapeSet.hxx>
21 #include <CDM_MessageDriver.hxx>
22 #include <Standard_DomainError.hxx>
23 #include <Standard_Type.hxx>
24 #include <TCollection_AsciiString.hxx>
25 #include <TDF_Attribute.hxx>
26 #include <TDF_Label.hxx>
27 #include <TNaming_Builder.hxx>
28 #include <TNaming_Evolution.hxx>
29 #include <TNaming_Iterator.hxx>
30 #include <TNaming_NamedShape.hxx>
31 #include <TopAbs_Orientation.hxx>
32 #include <TopoDS_Shape.hxx>
33
34 IMPLEMENT_STANDARD_RTTIEXT(BinMNaming_NamedShapeDriver,BinMDF_ADriver)
35
36 #define SHAPESET "SHAPE_SECTION"
37 #define FORMAT_NUMBER 3
38 //=======================================================================
39 static Standard_Character EvolutionToChar(const TNaming_Evolution theEvol)
40 {
41   switch(theEvol) {
42     case TNaming_PRIMITIVE    : return 'P';
43     case TNaming_GENERATED    : return 'G';
44     case TNaming_MODIFY       : return 'M';
45     case TNaming_DELETE       : return 'D';
46     case TNaming_SELECTED     : return 'S';
47     case TNaming_REPLACE      : return 'M'; // for compatibility case TNaming_REPLACE      : return 'R';
48   default:
49     Standard_DomainError::Raise("TNaming_Evolution:: Evolution Unknown");
50   }
51   return 'P'; // To avoid compilation error message.
52 }
53
54 //=======================================================================
55 static TNaming_Evolution EvolutionToEnum(const Standard_Character theEvol)
56 {
57   switch(theEvol) {
58     case 'P': return TNaming_PRIMITIVE;
59     case 'G': return TNaming_GENERATED;
60     case 'M': return TNaming_MODIFY;
61     case 'D': return TNaming_DELETE;
62     case 'S': return TNaming_SELECTED;
63     case 'R': return TNaming_MODIFY; //for compatibility //TNaming_REPLACE;
64   default:
65     Standard_DomainError::Raise("TNaming_Evolution:: Evolution Unknown");
66   }
67   return TNaming_PRIMITIVE; // To avoid compilation error message.
68 }
69 //=======================================================================
70 static Standard_Character OrientationToChar(const TopAbs_Orientation theOrient)
71 {
72   switch(theOrient) {
73     case TopAbs_FORWARD    : return 'F';
74     case TopAbs_REVERSED   : return 'R';
75     case TopAbs_INTERNAL   : return 'I';
76     case TopAbs_EXTERNAL   : return 'E';
77   default:
78     Standard_DomainError::Raise("TopAbs_Orientation:: Orientation Unknown");
79   }
80   return 'F'; // To avoid compilation error message.
81 }
82 //=======================================================================
83 static TopAbs_Orientation CharToOrientation(const Standard_Character  theCharOrient)
84 {
85   switch(theCharOrient) {
86     case 'F':  return TopAbs_FORWARD;
87     case 'R':  return TopAbs_REVERSED;
88     case 'I':  return TopAbs_INTERNAL;
89     case 'E':  return TopAbs_EXTERNAL;
90   default:
91     Standard_DomainError::Raise("TopAbs_Orientation:: Orientation Unknown");
92   }
93   return TopAbs_FORWARD; // To avoid compilation error message.
94 }
95
96 //=======================================================================
97 static void TranslateTo (const TopoDS_Shape&            theShape,
98                          BinObjMgt_Persistent&          theResult,
99                          BinTools_ShapeSet&            theShapeSet)
100 {
101   // Check for empty shape
102   if (theShape.IsNull()) {
103     theResult.PutInteger(-1);
104     theResult.PutInteger(-1);
105     theResult.PutInteger(-1);
106     return;
107   }
108   // Add to shape set both TShape and Location contained in <theShape>
109   const Standard_Integer aTShapeID = theShapeSet.Add (theShape);
110   const Standard_Integer aLocID =
111     theShapeSet.Locations().Index (theShape.Location());
112
113   // Fill theResult with shape parameters: TShape ID, Location, Orientation
114   theResult << aTShapeID;
115   theResult << aLocID;
116   theResult << OrientationToChar(theShape.Orientation());
117 }
118 //=======================================================================
119 static int TranslateFrom  (const BinObjMgt_Persistent&  theSource,
120                          TopoDS_Shape&                  theResult,
121                          BinTools_ShapeSet&            theShapeSet)
122 {
123   Standard_Integer aShapeID, aLocID;
124   Standard_Character aCharOrient;
125   Standard_Boolean Ok = theSource >> aShapeID; //TShapeID;
126   if(!Ok) return 1;
127   // Read TShape and Orientation
128   if (aShapeID <= 0 || aShapeID > theShapeSet.NbShapes())
129     return 1;
130   Ok = theSource >> aLocID;
131   if(!Ok) return 1;
132   Ok = theSource >> aCharOrient;
133   if(!Ok) return 1;
134   TopAbs_Orientation anOrient = CharToOrientation(aCharOrient);
135
136   theResult.TShape      (theShapeSet.Shape(aShapeID).TShape());//TShape
137   theResult.Location    (theShapeSet.Locations().Location (aLocID)); //Location
138   theResult.Orientation (anOrient);//Orientation
139   return 0;
140 }
141
142 //=======================================================================
143 //function : BinMNaming_NamedShapeDriver
144 //purpose  : Constructor
145 //=======================================================================
146
147 BinMNaming_NamedShapeDriver::BinMNaming_NamedShapeDriver
148                         (const Handle(CDM_MessageDriver)& theMsgDriver)
149      : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TNaming_NamedShape)->Name()), myShapeSet(Standard_False),myFormatNb(FORMAT_NUMBER)
150 {
151 }
152
153 //=======================================================================
154 //function : NewEmpty
155 //purpose  : 
156 //=======================================================================
157
158 Handle(TDF_Attribute) BinMNaming_NamedShapeDriver::NewEmpty() const
159 {
160   return new TNaming_NamedShape();
161 }
162
163 //=======================================================================
164 //function : Paste
165 //purpose  : persistent => transient (retrieve)
166 //=======================================================================
167
168 Standard_Boolean BinMNaming_NamedShapeDriver::Paste
169                                 (const BinObjMgt_Persistent&  theSource,
170                                  const Handle(TDF_Attribute)& theTarget,
171                                  BinObjMgt_RRelocationTable&  ) const
172 {
173   Handle(TNaming_NamedShape) aTAtt= Handle(TNaming_NamedShape)::DownCast(theTarget);
174   Standard_Integer aNbShapes;
175   theSource >> aNbShapes;
176   TDF_Label aLabel = theTarget->Label ();
177   TNaming_Builder   aBuilder   (aLabel);
178   if (aNbShapes == 0) return Standard_False;
179   Standard_Integer aVer;
180   Standard_Boolean ok = theSource >> aVer;
181   if(!ok) return Standard_False;
182   aTAtt->SetVersion(aVer); //Version
183   Standard_Character aCharEvol;
184   ok = theSource >> aCharEvol;
185   if(!ok) return Standard_False;
186   TNaming_Evolution anEvol  = EvolutionToEnum(aCharEvol); //Evolution
187   aTAtt->SetVersion(anEvol);
188
189   BinTools_ShapeSet& aShapeSet = (BinTools_ShapeSet&) myShapeSet;
190
191   for (Standard_Integer i = 1; i <= aNbShapes; i++) {
192     TopoDS_Shape anOldShape, aNewShape;
193     
194     if ( anEvol != TNaming_PRIMITIVE ) 
195       if(TranslateFrom(theSource, anOldShape, aShapeSet)) return Standard_False;
196
197     if (anEvol != TNaming_DELETE) 
198       if(TranslateFrom(theSource, aNewShape, aShapeSet)) return Standard_False;
199
200     switch (anEvol) {
201     case TNaming_PRIMITIVE    : 
202       aBuilder.Generated(aNewShape); 
203       break;
204     case TNaming_GENERATED    : 
205       aBuilder.Generated(anOldShape, aNewShape); 
206       break;
207     case TNaming_MODIFY       : 
208       aBuilder.Modify(anOldShape, aNewShape); 
209       break;
210     case TNaming_DELETE       : 
211       aBuilder.Delete (anOldShape); 
212       break;
213     case TNaming_SELECTED     : 
214       aBuilder.Select(aNewShape, anOldShape); 
215       break;
216     case TNaming_REPLACE      :
217       aBuilder.Modify(anOldShape, aNewShape); // for compatibility aBuilder.Replace(anOldShape, aNewShape);
218       break;
219       default :
220         Standard_DomainError::Raise("TNaming_Evolution:: Evolution Unknown");
221     }
222     anOldShape.Nullify();
223     aNewShape.Nullify();
224   }
225   return Standard_True;
226 }
227
228 //=======================================================================
229 //function : Paste
230 //purpose  : transient => persistent (store)
231 //=======================================================================
232
233 void BinMNaming_NamedShapeDriver::Paste (const Handle(TDF_Attribute)& theSource,
234                                          BinObjMgt_Persistent&        theTarget,
235                                          BinObjMgt_SRelocationTable&  ) const
236 {
237   Handle(TNaming_NamedShape) aSAtt= Handle(TNaming_NamedShape)::DownCast(theSource);
238
239   //--------------------------------------------------------------
240   Standard_Integer NbShapes = 0;
241   for (TNaming_Iterator SItr (aSAtt); SItr.More (); SItr.Next ()) NbShapes++;
242   //--------------------------------------------------------------
243
244   if (NbShapes == 0) return;
245
246   BinTools_ShapeSet& aShapeSet = (BinTools_ShapeSet&) myShapeSet;
247   TNaming_Evolution anEvol = aSAtt->Evolution();
248   
249   theTarget << NbShapes;
250   theTarget << aSAtt->Version();
251   theTarget << EvolutionToChar(anEvol);
252  
253
254   Standard_Integer i = 1;  
255   for (TNaming_Iterator SIterator(aSAtt) ;SIterator.More(); SIterator.Next()) {
256     const TopoDS_Shape& OldShape = SIterator.OldShape();
257     const TopoDS_Shape& NewShape = SIterator.NewShape();
258     
259     if ( anEvol != TNaming_PRIMITIVE ) 
260       TranslateTo (OldShape, theTarget, aShapeSet); 
261
262     if (anEvol != TNaming_DELETE) 
263       TranslateTo (NewShape, theTarget, aShapeSet);
264     
265     i++;
266   }
267
268 }
269
270
271 //=======================================================================
272 //function : WriteShapeSection
273 //purpose  : 
274 //=======================================================================
275
276 void BinMNaming_NamedShapeDriver::WriteShapeSection (Standard_OStream& theOS)
277 {
278   theOS << SHAPESET; 
279   myShapeSet.SetFormatNb(myFormatNb);
280   myShapeSet.Write (theOS);
281   myShapeSet.Clear();
282 }
283
284 //=======================================================================
285 //function : Clear
286 //purpose  : 
287 //=======================================================================
288
289 void BinMNaming_NamedShapeDriver::Clear()
290 {
291   myShapeSet.Clear();
292 }
293
294 //=======================================================================
295 //function : ReadShapeSection
296 //purpose  : 
297 //=======================================================================
298
299 void BinMNaming_NamedShapeDriver::ReadShapeSection (Standard_IStream& theIS)
300 {
301   // check section title string; note that some versions of OCCT (up to 6.3.1) 
302   // might avoid writing shape section if it is empty
303   std::streamoff aPos = theIS.tellg();
304   TCollection_AsciiString aSectionTitle;
305   theIS >> aSectionTitle;
306   if(aSectionTitle.Length() > 0 && aSectionTitle == SHAPESET) {
307     myShapeSet.Clear();
308     myShapeSet.Read (theIS);
309     SetFormatNb(myShapeSet.FormatNb());
310   }
311   else
312     theIS.seekg(aPos); // no shape section is present, try to return to initial point
313 }
314