b311480e |
1 | // Created on: 2004-05-13 |
2 | // Created by: Sergey ZARITCHNY |
973c2be1 |
3 | // Copyright (c) 2004-2014 OPEN CASCADE SAS |
b311480e |
4 | // |
973c2be1 |
5 | // This file is part of Open CASCADE Technology software library. |
b311480e |
6 | // |
d5f74e42 |
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 |
973c2be1 |
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. |
b311480e |
12 | // |
973c2be1 |
13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. |
7fd59977 |
15 | |
42cf5bc1 |
16 | |
7fd59977 |
17 | #include <BinMDF_ADriver.hxx> |
42cf5bc1 |
18 | #include <BinMNaming.hxx> |
19 | #include <BinMNaming_NamingDriver.hxx> |
7fd59977 |
20 | #include <BinObjMgt_Persistent.hxx> |
21 | #include <BinObjMgt_RRelocationTable.hxx> |
22 | #include <BinObjMgt_SRelocationTable.hxx> |
42cf5bc1 |
23 | #include <CDM_MessageDriver.hxx> |
24 | #include <Standard_Type.hxx> |
7fd59977 |
25 | #include <TCollection_AsciiString.hxx> |
42cf5bc1 |
26 | #include <TCollection_ExtendedString.hxx> |
27 | #include <TColStd_Array1OfInteger.hxx> |
28 | #include <TDF_Attribute.hxx> |
7fd59977 |
29 | #include <TDF_Tool.hxx> |
42cf5bc1 |
30 | #include <TNaming_Iterator.hxx> |
31 | #include <TNaming_ListIteratorOfListOfNamedShape.hxx> |
32 | #include <TNaming_NamedShape.hxx> |
33 | #include <TNaming_NameType.hxx> |
34 | #include <TNaming_Naming.hxx> |
35 | #include <TopAbs_ShapeEnum.hxx> |
566f8441 |
36 | |
92efcf78 |
37 | IMPLEMENT_STANDARD_RTTIEXT(BinMNaming_NamingDriver,BinMDF_ADriver) |
38 | |
7fd59977 |
39 | #define NULL_ENTRY "0:0" |
566f8441 |
40 | #define OBSOLETE_NUM (int)sizeof(Standard_Integer) |
41 | |
7fd59977 |
42 | //======================================================================= |
43 | // 'Z' - is reserved for: forfidden to use |
44 | //======================================================================= |
45 | static Standard_Character NameTypeToChar(const TNaming_NameType theNameType) |
46 | { |
47 | switch(theNameType) { |
48 | case TNaming_UNKNOWN : return 'N'; |
49 | case TNaming_IDENTITY : return 'I'; |
50 | case TNaming_MODIFUNTIL : return 'M'; |
51 | case TNaming_GENERATION : return 'G'; |
52 | case TNaming_INTERSECTION : return 'S'; |
53 | case TNaming_UNION : return 'U'; |
54 | case TNaming_SUBSTRACTION : return 'B'; |
55 | case TNaming_CONSTSHAPE : return 'C'; |
56 | case TNaming_FILTERBYNEIGHBOURGS : return 'F'; |
57 | case TNaming_ORIENTATION : return 'O'; |
58 | case TNaming_WIREIN : return 'W'; |
1ec8a59e |
59 | case TNaming_SHELLIN : return 'H'; |
7fd59977 |
60 | default: |
61 | Standard_DomainError::Raise("TNaming_NameType:: Name Type Unknown"); |
62 | } |
63 | return 'N'; // To avoid compilation error message. |
64 | } |
65 | |
66 | //======================================================================= |
67 | static TNaming_NameType CharTypeToName(const Standard_Character theCharType) |
68 | { |
69 | switch(theCharType) { |
70 | case 'N' : return TNaming_UNKNOWN; |
71 | case 'I' : return TNaming_IDENTITY; |
72 | case 'M' : return TNaming_MODIFUNTIL; |
73 | case 'G' : return TNaming_GENERATION; |
74 | case 'S' : return TNaming_INTERSECTION; |
75 | case 'U' : return TNaming_UNION; |
76 | case 'B' : return TNaming_SUBSTRACTION; |
77 | case 'C' : return TNaming_CONSTSHAPE; |
78 | case 'F' : return TNaming_FILTERBYNEIGHBOURGS; |
79 | case 'O' : return TNaming_ORIENTATION; |
80 | case 'W' : return TNaming_WIREIN; |
1ec8a59e |
81 | case 'H' : return TNaming_SHELLIN; |
7fd59977 |
82 | default: |
83 | Standard_DomainError::Raise("TNaming_NameType:: Name Type Unknown"); |
84 | } |
85 | return TNaming_UNKNOWN; // To avoid compilation error message. |
86 | } |
87 | |
88 | //======================================================================= |
89 | static Standard_Character ShapeTypeToChar(const TopAbs_ShapeEnum theShapeType) |
90 | { |
91 | switch (theShapeType) |
92 | { |
93 | case TopAbs_COMPOUND : return 'C'; |
94 | case TopAbs_COMPSOLID : return 'O'; |
95 | case TopAbs_SOLID : return 'S'; |
96 | case TopAbs_SHELL : return 'H'; |
97 | case TopAbs_FACE : return 'F'; |
98 | case TopAbs_WIRE : return 'W'; |
99 | case TopAbs_EDGE : return 'E'; |
100 | case TopAbs_VERTEX : return 'V'; |
101 | case TopAbs_SHAPE : return 'A'; |
102 | } |
103 | return 'A'; // To avoid compilation error message. |
104 | } |
105 | //======================================================================= |
106 | static TopAbs_ShapeEnum CharToShapeType(const Standard_Character theCharType) |
107 | { |
108 | switch (theCharType) |
109 | { |
110 | case 'C' : return TopAbs_COMPOUND; |
111 | case 'O' : return TopAbs_COMPSOLID; |
112 | case 'S' : return TopAbs_SOLID; |
113 | case 'H' : return TopAbs_SHELL; |
114 | case 'F' : return TopAbs_FACE; |
115 | case 'W' : return TopAbs_WIRE; |
116 | case 'E' : return TopAbs_EDGE; |
117 | case 'V' : return TopAbs_VERTEX; |
118 | case 'A' : return TopAbs_SHAPE; |
119 | } |
120 | return TopAbs_SHAPE; // To avoid compilation error message. |
121 | } |
122 | //======================================================================= |
123 | //function : BinMNaming_NamingDriver |
124 | //purpose : Constructor |
125 | //======================================================================= |
126 | |
127 | BinMNaming_NamingDriver::BinMNaming_NamingDriver |
128 | (const Handle(CDM_MessageDriver)& theMsgDriver) |
129 | : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TNaming_Naming)->Name()) |
130 | { |
131 | } |
132 | |
133 | //======================================================================= |
134 | //function : NewEmpty |
135 | //purpose : |
136 | //======================================================================= |
137 | |
138 | Handle(TDF_Attribute) BinMNaming_NamingDriver::NewEmpty() const |
139 | { |
140 | return new TNaming_Naming(); |
141 | } |
142 | |
143 | //======================================================================= |
144 | //function : Paste |
145 | //purpose : persistent -> transient (retrieve) |
146 | //======================================================================= |
147 | |
148 | Standard_Boolean BinMNaming_NamingDriver::Paste |
149 | (const BinObjMgt_Persistent& theSource, |
150 | const Handle(TDF_Attribute)& theTarget, |
151 | BinObjMgt_RRelocationTable& theRelocTable) const |
152 | { |
153 | Handle(TNaming_Naming) anAtt = Handle(TNaming_Naming)::DownCast(theTarget); |
154 | if(anAtt.IsNull()) return Standard_False; |
155 | |
156 | TNaming_Name& aName = anAtt->ChangeName(); |
157 | TCollection_ExtendedString aMsg; |
158 | //1. NameType |
159 | Standard_Character aValue; |
160 | Standard_Boolean ok = theSource >> aValue; |
161 | Standard_Boolean aNewF = Standard_False; |
162 | if (ok) { |
163 | if(aValue == 'Z') { // new format |
164 | aNewF = Standard_True; |
165 | ok = theSource >> aValue; //skip the sign & get NameType |
166 | if(!ok) return ok; |
167 | } |
168 | |
169 | aName.Type(CharTypeToName(aValue)); |
170 | |
171 | //2. ShapeType |
172 | ok = theSource >> aValue; |
173 | if (ok) { |
174 | aName.ShapeType(CharToShapeType(aValue)); |
175 | |
176 | //3. Args |
177 | Standard_Integer aNbArgs=0; |
178 | Standard_Integer anIndx; |
179 | Handle(TNaming_NamedShape) aNS; |
180 | ok = theSource >> aNbArgs; |
181 | if (ok) { |
182 | if(aNbArgs > 0) { |
183 | Standard_Integer i; |
184 | // read array |
185 | for(i=1; i<=aNbArgs;i++) { |
186 | if(!aNewF && i > OBSOLETE_NUM) break;//interrupt reading as old format can have only 4 items |
187 | ok = theSource >> anIndx; |
188 | if (!ok) |
189 | break; |
190 | else { |
191 | if (theRelocTable.IsBound(anIndx)) |
192 | aNS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(anIndx)); |
193 | else { |
194 | aNS = new TNaming_NamedShape; |
195 | theRelocTable.Bind(anIndx, aNS); |
196 | } |
197 | aName.Append(aNS); |
198 | } |
199 | } |
200 | //patch to release the rest of items |
201 | if(!aNewF && aNbArgs < OBSOLETE_NUM) { |
202 | for(i = aNbArgs+1;i <= OBSOLETE_NUM;i++) |
203 | theSource >> anIndx; |
204 | } |
205 | } |
206 | //4. StopNS |
207 | ok = theSource >> anIndx; |
208 | if(ok) { |
209 | if(anIndx > 0) { |
210 | if (theRelocTable.IsBound(anIndx)) |
211 | aNS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(anIndx)); |
212 | else |
213 | { |
214 | aNS = new TNaming_NamedShape; |
215 | theRelocTable.Bind(anIndx, aNS); |
216 | } |
217 | aName.StopNamedShape(aNS); |
218 | } |
219 | |
220 | //5. Index |
221 | ok = theSource >> anIndx; |
222 | if(ok) |
223 | aName.Index(anIndx); |
224 | else { |
225 | aMsg = TCollection_ExtendedString("BinMNaming_NamingDriver: " |
226 | "Cannot retrieve Index of Name"); |
227 | WriteMessage (aMsg); |
228 | } |
229 | } else { |
230 | aMsg = TCollection_ExtendedString("BinMNaming_NamingDriver: " |
231 | "Cannot retrieve reference on " |
232 | "StopNamedShape"); |
233 | WriteMessage (aMsg); |
234 | } |
235 | } else { |
236 | aMsg = TCollection_ExtendedString("BinMNaming_NamingDriver: " |
237 | "Cannot retrieve reference on " |
238 | "Arguments of Name"); |
239 | WriteMessage (aMsg); |
7dcac1df |
240 | } |
7fd59977 |
241 | |
7dcac1df |
242 | if(BinMNaming::DocumentVersion() > 3) { |
7fd59977 |
243 | TCollection_AsciiString entry; |
244 | ok = theSource >> entry; |
245 | if(ok) { |
0797d9d3 |
246 | #ifdef OCCT_DEBUG |
7fd59977 |
247 | cout << "NamingDriver:: Retrieved Context Label = " << entry << " Ok = " << theSource.IsOK() <<endl; |
248 | #endif |
249 | |
250 | //6. context label |
251 | if(!entry.IsEmpty() && !entry.IsEqual(TCollection_AsciiString(NULL_ENTRY))) |
252 | { |
253 | TDF_Label tLab; // Null label. |
254 | TDF_Tool::Label(anAtt->Label().Data(),entry, tLab, Standard_True); |
255 | if (!tLab.IsNull()) |
256 | aName.ContextLabel(tLab); |
257 | } |
258 | } |
7dcac1df |
259 | if(BinMNaming::DocumentVersion() > 4 && BinMNaming::DocumentVersion() < 7) { |
260 | // Orientation processing - converting from old format |
51740958 |
261 | Handle(TNaming_NamedShape) aNShape; |
262 | if(anAtt->Label().FindAttribute(TNaming_NamedShape::GetID(), aNShape)) { |
7dcac1df |
263 | //const TDF_Label& aLab = aNS->Label(); |
51740958 |
264 | TNaming_Iterator itL (aNShape); |
7dcac1df |
265 | for (; itL.More(); itL.Next()) { |
266 | const TopoDS_Shape& S = itL.NewShape(); |
267 | if (S.IsNull()) continue; |
51740958 |
268 | if(aNShape->Evolution() == TNaming_SELECTED) { |
7dcac1df |
269 | if (itL.More() && itL.NewShape().ShapeType() != TopAbs_VERTEX && |
270 | !itL.OldShape().IsNull() && itL.OldShape().ShapeType() == TopAbs_VERTEX ) {//OR-N |
271 | TopAbs_Orientation OrientationToApply = itL.OldShape().Orientation(); |
272 | aName.Orientation(OrientationToApply); |
273 | } |
274 | } |
275 | } |
276 | } |
277 | } |
278 | if(BinMNaming::DocumentVersion() > 6) { |
279 | ok = theSource >> anIndx; |
280 | TopAbs_Orientation OrientationToApply(TopAbs_FORWARD); |
281 | if(ok) { |
282 | OrientationToApply = (TopAbs_Orientation)anIndx; |
283 | aName.Orientation(OrientationToApply); |
0797d9d3 |
284 | #ifdef OCCT_DEBUG |
7dcac1df |
285 | cout << "NamingDriver:: Retrieved Orientation = " << OrientationToApply << " Ok = " << theSource.IsOK() <<endl; |
286 | #endif |
287 | } else { |
288 | aMsg = TCollection_ExtendedString("BinMNaming_NamingDriver: " |
289 | "Cannot retrieve Name Orientation "); |
290 | WriteMessage (aMsg); |
291 | } |
292 | } |
293 | } |
0797d9d3 |
294 | #ifdef OCCT_DEBUG |
7fd59977 |
295 | else if(BinMNaming::DocumentVersion() == -1) |
296 | cout << "Current DocVersion field is not initialized. " <<endl; |
297 | else |
298 | cout << "Current DocVersion = " << BinMNaming::DocumentVersion() <<endl; |
299 | #endif |
7dcac1df |
300 | } |
7fd59977 |
301 | } |
302 | return ok; |
303 | } |
304 | |
305 | //======================================================================= |
306 | //function : Paste |
307 | //purpose : transient -> persistent (store) |
308 | //======================================================================= |
309 | |
310 | void BinMNaming_NamingDriver::Paste (const Handle(TDF_Attribute)& theSource, |
311 | BinObjMgt_Persistent& theTarget, |
312 | BinObjMgt_SRelocationTable& theRelocTable) const |
313 | { |
314 | Handle(TNaming_Naming) anAtt = Handle(TNaming_Naming)::DownCast(theSource); |
315 | const TNaming_Name& aName = anAtt->GetName(); |
316 | |
317 | //0. add the sign of new format (to fix misprint with Array size) |
318 | theTarget.PutCharacter('Z'); |
319 | |
320 | //1. << NameType to Char |
321 | theTarget << NameTypeToChar(aName.Type()); |
322 | |
323 | //2. << ShapeType to Char |
324 | theTarget << ShapeTypeToChar(aName.ShapeType()); |
325 | |
326 | //3. Keep Args |
327 | Standard_Integer anIndx; |
328 | Standard_Integer aNbArgs = aName.Arguments().Extent(); |
329 | theTarget << aNbArgs; // keep Number |
330 | if (aNbArgs > 0) { |
331 | Standard_Integer i=0; |
332 | TColStd_Array1OfInteger anArray(1, aNbArgs); |
333 | //fill array |
334 | for (TNaming_ListIteratorOfListOfNamedShape it (aName.Arguments()); it.More(); it.Next()) { |
335 | Handle(TNaming_NamedShape) anArg = it.Value(); |
336 | anIndx = 0; i++; |
337 | if (!anArg.IsNull()) { |
338 | anIndx = theRelocTable.FindIndex(anArg); |
339 | if (anIndx == 0) |
340 | anIndx = theRelocTable.Add(anArg); |
341 | } |
342 | anArray.SetValue(i, anIndx); |
343 | } |
344 | |
345 | theTarget.PutIntArray ((BinObjMgt_PInteger) &anArray.Value(1), aNbArgs); // keep Array |
346 | } |
347 | |
348 | //4. keep StopNS |
349 | Handle(TNaming_NamedShape) aStopNS = aName.StopNamedShape(); |
350 | if (!aStopNS.IsNull()) { |
351 | anIndx = theRelocTable.FindIndex(aStopNS); |
352 | if (anIndx == 0) |
353 | anIndx = theRelocTable.Add(aStopNS); |
354 | } else |
355 | anIndx = 0; |
356 | theTarget << anIndx; |
357 | |
358 | //5. keep Index |
359 | theTarget << aName.Index(); |
360 | |
361 | //6. keep context label |
362 | TCollection_AsciiString entry(NULL_ENTRY); |
363 | if(!aName.ContextLabel().IsNull()) |
364 | TDF_Tool::Entry(aName.ContextLabel(), entry); |
365 | theTarget << entry; |
7dcac1df |
366 | |
367 | //7. keep Orientation |
368 | theTarget << (Standard_Integer)aName.Orientation(); |
369 | |
7fd59977 |
370 | } |