0023022: This is desirable to access OpenGl extensions and core API (1.2+) in one...
[occt.git] / src / XmlMNaming / XmlMNaming_NamingDriver.cxx
1 // File:      XmlMNaming_NamingDriver.cxx
2 // Created:   31.08.01 10:09:46
3 // Author:    Julia DOROVSKIKH
4 // Copyright: Open Cascade 2001
5 // History:
6
7 #include <XmlMNaming_NamingDriver.ixx>
8
9 #include <XmlObjMgt.hxx>
10 #include <XmlMNaming.hxx>
11 #include <TNaming_Name.hxx>
12 #include <TNaming_Naming.hxx>
13 #include <TNaming_NamedShape.hxx>
14 #include <TNaming_ListIteratorOfListOfNamedShape.hxx>
15 #include <TDF_Tool.hxx>
16
17 //=======================================================================
18 static TopAbs_ShapeEnum ShapeEnumFromString (const XmlObjMgt_DOMString&);
19 static TNaming_NameType NameTypeFromString (const XmlObjMgt_DOMString&);
20
21 static const XmlObjMgt_DOMString& ShapeEnumToString (const TopAbs_ShapeEnum);
22 static const XmlObjMgt_DOMString& NameTypeToString (const TNaming_NameType);
23
24 IMPLEMENT_DOMSTRING (IndexString,               "index")
25 IMPLEMENT_DOMSTRING (StopNamedShapeString,      "stopNS")
26 IMPLEMENT_DOMSTRING (TypeString,                "nametype")
27 IMPLEMENT_DOMSTRING (ShapeTypeString,           "shapetype")
28 IMPLEMENT_DOMSTRING (ArgumentsString,           "arguments")
29 IMPLEMENT_DOMSTRING (ContextLabelString,        "contextlabel")
30
31 IMPLEMENT_DOMSTRING (NTUnknownString,           "unknown")
32 IMPLEMENT_DOMSTRING (NTIdentityString,          "identity")
33 IMPLEMENT_DOMSTRING (NTModifUntilString,        "modifuntil")
34 IMPLEMENT_DOMSTRING (NTGenerationString,        "generation")
35 IMPLEMENT_DOMSTRING (NTIntersectionString,      "intersection")
36 IMPLEMENT_DOMSTRING (NTUnionString,             "union")
37 IMPLEMENT_DOMSTRING (NTSubtractionString,       "subtraction")
38 IMPLEMENT_DOMSTRING (NTConstShapeString,        "constshape")
39 IMPLEMENT_DOMSTRING (NTFilterByNeighString,     "filterbyneigh")
40 IMPLEMENT_DOMSTRING (NTOrientationString,       "orientation")
41 IMPLEMENT_DOMSTRING (NTWireInString,             "wirein")
42
43 IMPLEMENT_DOMSTRING (ShCompoundString,          "compound")
44 IMPLEMENT_DOMSTRING (ShCompsolidString,         "compsolid")
45 IMPLEMENT_DOMSTRING (ShSolidString,             "solid")
46 IMPLEMENT_DOMSTRING (ShShellString,             "shell")
47 IMPLEMENT_DOMSTRING (ShFaceString,              "face")
48 IMPLEMENT_DOMSTRING (ShWireString,              "wire")
49 IMPLEMENT_DOMSTRING (ShEdgeString,              "edge")
50 IMPLEMENT_DOMSTRING (ShVertexString,            "vertex")
51 IMPLEMENT_DOMSTRING (ShShapeString,             "shape")
52
53 //=======================================================================
54 //function : XmlMNaming_NamingDriver
55 //purpose  : Constructor
56 //=======================================================================
57 XmlMNaming_NamingDriver::XmlMNaming_NamingDriver
58                         (const Handle(CDM_MessageDriver)& theMsgDriver)
59       : XmlMDF_ADriver (theMsgDriver, NULL)
60 {}
61
62 //=======================================================================
63 //function : NewEmpty
64 //purpose  : 
65 //=======================================================================
66 Handle(TDF_Attribute) XmlMNaming_NamingDriver::NewEmpty() const
67 {
68   return (new TNaming_Naming());
69 }
70
71 //=======================================================================
72 //function : Paste
73 //purpose  : persistent -> transient (retrieve)
74 //=======================================================================
75 Standard_Boolean XmlMNaming_NamingDriver::Paste
76                         (const XmlObjMgt_Persistent&  theSource,
77                          const Handle(TDF_Attribute)& theTarget,
78                          XmlObjMgt_RRelocationTable&  theRelocTable) const
79 {
80   const XmlObjMgt_Element& anElem = theSource;
81   Handle(TNaming_Naming) aNg = Handle(TNaming_Naming)::DownCast(theTarget);  
82
83   TNaming_Name& aNgName = aNg->ChangeName();
84
85   // type and shape type
86   aNgName.Type     (NameTypeFromString (anElem.getAttribute(::TypeString())));
87   aNgName.ShapeType(ShapeEnumFromString(anElem.getAttribute(::ShapeTypeString())));
88
89   Standard_Integer aNb;
90   Handle(TNaming_NamedShape) NS;
91   TCollection_ExtendedString aMsgString;
92
93   XmlObjMgt_DOMString aDOMStr = anElem.getAttribute(::ArgumentsString());
94   if (aDOMStr != NULL)
95   {
96     Standard_CString aGs = Standard_CString(aDOMStr.GetString());
97
98     // first argument
99     if (!XmlObjMgt::GetInteger(aGs, aNb))
100     {
101       aMsgString = TCollection_ExtendedString
102         ("XmlMNaming_NamingDriver: Cannot retrieve reference "
103          "on first Argument from \"") + aDOMStr + "\"";
104       WriteMessage (aMsgString);
105       return Standard_False;
106     }
107     while (aNb > 0)
108     {
109       if (theRelocTable.IsBound(aNb))
110         NS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
111       else
112       {
113         NS = new TNaming_NamedShape;
114         theRelocTable.Bind(aNb, NS);
115       }
116       aNgName.Append(NS);
117
118       // next argument
119       if (!XmlObjMgt::GetInteger(aGs, aNb)) aNb = 0;
120     }
121   }
122
123   // stop named shape
124   aDOMStr = anElem.getAttribute(::StopNamedShapeString());
125   if (aDOMStr != NULL)
126   {
127     if (!aDOMStr.GetInteger(aNb))
128     {
129       aMsgString = TCollection_ExtendedString
130         ("XmlMNaming_NamingDriver: Cannot retrieve reference "
131          "on StopNamedShape from \"") + aDOMStr + "\"";
132       WriteMessage (aMsgString);
133       return Standard_False;
134     }
135     if (aNb > 0)
136     {
137       if (theRelocTable.IsBound(aNb))
138         NS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
139       else
140       {
141         NS = new TNaming_NamedShape;
142         theRelocTable.Bind(aNb, NS);
143       }
144       aNgName.StopNamedShape(NS);  
145     }
146   }
147
148   // index
149   aDOMStr = anElem.getAttribute(::IndexString());
150   if (!aDOMStr.GetInteger(aNb))
151   {
152     aMsgString = TCollection_ExtendedString
153       ("XmlMNaming_NamingDriver: Cannot retrieve "
154        "integer value of Index from \"") + aDOMStr + "\"";
155     WriteMessage (aMsgString);
156     return Standard_False;
157   }
158   aNgName.Index(aNb);
159 //
160 #ifdef DEB
161   //cout << "CurDocVersion = " << XmlMNaming::DocumentVersion() <<endl;
162 #endif
163   if(XmlMNaming::DocumentVersion() > 3) {
164     XmlObjMgt_DOMString aDomEntry = anElem.getAttribute(::ContextLabelString());
165     if (aDomEntry != NULL)
166       { 
167         TCollection_AsciiString anEntry;
168         if (XmlObjMgt::GetTagEntryString (aDomEntry, anEntry) == Standard_False)
169           {
170             TCollection_ExtendedString aMessage =
171               TCollection_ExtendedString ("Cannot retrieve Entry from \"")
172                 + aDomEntry + '\"';
173             WriteMessage (aMessage);
174             return Standard_False;
175           }
176     
177         // find label by entry
178         TDF_Label tLab; // Null label.
179         if (anEntry.Length() > 0) {
180           TDF_Tool::Label(aNg->Label().Data(), anEntry, tLab, Standard_True);
181             aNgName.ContextLabel(tLab);
182 #ifdef DEB
183             cout << "Retrieving Context Label = " << anEntry.ToCString() <<endl;
184 #endif
185           }
186       }
187 #ifdef DEB
188     else
189       cout << "Retrieving Context Label is NULL" <<endl;
190 #endif
191   }
192 #ifdef DEB
193   else if(XmlMNaming::DocumentVersion() == -1)
194     cout << "Current DocVersion field is not initialized. "  <<endl;
195   else 
196     cout << "Current DocVersion = "  << XmlMNaming::DocumentVersion() <<endl;
197 #endif
198   return Standard_True;
199 }
200
201 //=======================================================================
202 //function : Paste
203 //purpose  : transient -> persistent (store)
204 //=======================================================================
205 void XmlMNaming_NamingDriver::Paste
206                         (const Handle(TDF_Attribute)& theSource,
207                          XmlObjMgt_Persistent&        theTarget,
208                          XmlObjMgt_SRelocationTable&  theRelocTable) const
209 {
210   Handle(TNaming_Naming) aNg = Handle(TNaming_Naming)::DownCast(theSource);
211   XmlObjMgt_Element& anElem = theTarget;
212   const TNaming_Name& aNgName = aNg->GetName();
213
214   // type and shape type
215   anElem.setAttribute(::TypeString(), NameTypeToString(aNgName.Type()));
216   anElem.setAttribute(::ShapeTypeString(), ShapeEnumToString(aNgName.ShapeType()));
217   
218   Standard_Integer aNb;
219
220   // arguments
221   Standard_Integer NbArgs = aNgName.Arguments().Extent();
222   if (NbArgs > 0)
223   {
224     TCollection_AsciiString anArgsStr;
225     for (TNaming_ListIteratorOfListOfNamedShape it (aNgName.Arguments()); it.More(); it.Next())
226     {
227       Handle(TNaming_NamedShape) anArg = it.Value();
228       aNb = 0;
229       if (!anArg.IsNull())
230       {
231         aNb = theRelocTable.FindIndex(anArg);
232         if (aNb == 0)
233         {
234           aNb = theRelocTable.Add(anArg);
235         }
236         anArgsStr += TCollection_AsciiString(aNb) + " ";
237       }
238       else anArgsStr += "0 ";
239     }
240     anElem.setAttribute(::ArgumentsString(), anArgsStr.ToCString());
241   }
242
243   // stop named shape
244   Handle(TNaming_NamedShape) aSNS = aNgName.StopNamedShape();
245   if (!aSNS.IsNull())
246   {
247     aNb = theRelocTable.FindIndex(aSNS);
248     if (aNb == 0)
249     {
250       aNb = theRelocTable.Add(aSNS);
251     }
252     anElem.setAttribute(::StopNamedShapeString(), aNb);
253   }
254
255   // index
256   anElem.setAttribute(::IndexString(), aNgName.Index());
257
258   // context label
259   TCollection_AsciiString anEntry;
260   if(!aNgName.ContextLabel().IsNull())
261     TDF_Tool::Entry(aNgName.ContextLabel(), anEntry);  
262   XmlObjMgt_DOMString aDOMString;
263   XmlObjMgt::SetTagEntryString (aDOMString, anEntry);
264   anElem.setAttribute(::ContextLabelString(), aDOMString);
265 #ifdef DEB
266   cout << "XmlMNaming_NamingDriver::Store: ContextLabel Entry = " << anEntry << endl;
267   if (aDOMString != NULL)
268   {
269     Standard_CString aStr = Standard_CString(aDOMString.GetString());
270     cout << "XmlMNaming_NamingDriver::Store: ContextLabel DOMString = " << aStr << endl;
271   } else
272     cout << "XmlMNaming_NamingDriver::Store: aDOMString is NULL" <<endl;
273 #endif
274
275 }
276
277 //=======================================================================
278 //function : ShapeEnumToString
279 //purpose  : 
280 //=======================================================================
281 static const XmlObjMgt_DOMString& ShapeEnumToString (const TopAbs_ShapeEnum theE)
282 {
283   switch (theE)
284   {
285   case TopAbs_COMPOUND  : return ::ShCompoundString();
286   case TopAbs_COMPSOLID : return ::ShCompsolidString();
287   case TopAbs_SOLID     : return ::ShSolidString();
288   case TopAbs_SHELL     : return ::ShShellString();
289   case TopAbs_FACE      : return ::ShFaceString();
290   case TopAbs_WIRE      : return ::ShWireString();
291   case TopAbs_EDGE      : return ::ShEdgeString();
292   case TopAbs_VERTEX    : return ::ShVertexString();
293   case TopAbs_SHAPE     : return ::ShShapeString();  
294   }
295   static XmlObjMgt_DOMString aNullString;
296   return aNullString; // To avoid compilation error message.
297 }
298
299 //=======================================================================
300 //function : NameTypeToString
301 //purpose  : 
302 //=======================================================================
303 static const XmlObjMgt_DOMString& NameTypeToString (const TNaming_NameType theE) 
304 {
305   switch (theE)
306   { 
307   case TNaming_UNKNOWN             : return ::NTUnknownString();  
308   case TNaming_IDENTITY            : return ::NTIdentityString();
309   case TNaming_MODIFUNTIL          : return ::NTModifUntilString();
310   case TNaming_GENERATION          : return ::NTGenerationString();
311   case TNaming_INTERSECTION        : return ::NTIntersectionString();
312   case TNaming_UNION               : return ::NTUnionString();
313   case TNaming_SUBSTRACTION        : return ::NTSubtractionString();
314   case TNaming_CONSTSHAPE          : return ::NTConstShapeString();
315   case TNaming_FILTERBYNEIGHBOURGS : return ::NTFilterByNeighString();
316   case TNaming_ORIENTATION         : return ::NTOrientationString();
317   case TNaming_WIREIN              : return ::NTWireInString();
318   default:
319     Standard_DomainError::Raise("TNaming_NameType; enum term unknown ");
320   }
321   static XmlObjMgt_DOMString aNullString;
322   return aNullString; // To avoid compilation error message.
323 }
324
325 //=======================================================================
326 //function : ShapeEnumFromString
327 //purpose  : 
328 //=======================================================================
329 static TopAbs_ShapeEnum ShapeEnumFromString (const XmlObjMgt_DOMString& theString)
330 {
331   TopAbs_ShapeEnum aResult = TopAbs_SHAPE;
332   if (!theString.equals (::ShShapeString()))
333   {
334     if (theString.equals (::ShCompoundString()))
335       aResult = TopAbs_COMPOUND;
336     else if (theString.equals (::ShCompsolidString()))
337       aResult = TopAbs_COMPSOLID;
338     else if (theString.equals (::ShSolidString()))
339       aResult = TopAbs_SOLID;
340     else if (theString.equals (::ShShellString()))
341       aResult = TopAbs_SHELL;
342     else if (theString.equals (::ShFaceString()))
343       aResult = TopAbs_FACE;
344     else if (theString.equals (::ShWireString()))
345       aResult = TopAbs_WIRE;
346     else if (theString.equals (::ShEdgeString()))
347       aResult = TopAbs_EDGE;
348     else if (theString.equals (::ShVertexString()))
349       aResult = TopAbs_VERTEX;
350     else
351       Standard_DomainError::Raise
352         ("TopAbs_ShapeEnum; string value without enum term equivalence");
353   }
354   return aResult;
355 }
356
357 //=======================================================================
358 //function : NameTypeFromString
359 //purpose  : 
360 //=======================================================================
361 static TNaming_NameType NameTypeFromString (const XmlObjMgt_DOMString& theString) 
362 {
363   TNaming_NameType aResult = TNaming_UNKNOWN;
364   if (!theString.equals (::NTUnknownString()))
365   {
366     if (theString.equals (::NTIdentityString()))
367       aResult = TNaming_IDENTITY;
368     else if (theString.equals (::NTModifUntilString()))
369       aResult = TNaming_MODIFUNTIL;
370     else if (theString.equals (::NTGenerationString()))
371       aResult = TNaming_GENERATION;
372     else if (theString.equals (::NTIntersectionString()))
373       aResult = TNaming_INTERSECTION;
374     else if (theString.equals (::NTUnionString()))
375       aResult = TNaming_UNION;
376     else if (theString.equals (::NTSubtractionString()))
377       aResult = TNaming_SUBSTRACTION;
378     else if (theString.equals (::NTConstShapeString()))
379       aResult = TNaming_CONSTSHAPE;
380     else if (theString.equals (::NTFilterByNeighString()))
381       aResult = TNaming_FILTERBYNEIGHBOURGS;
382     else if (theString.equals (::NTOrientationString()))
383       aResult = TNaming_ORIENTATION;
384     else if (theString.equals (::NTWireInString()))
385       aResult = TNaming_WIREIN;
386     else
387       Standard_DomainError::Raise
388         ("TNaming_NameType; string value without enum term equivalence");
389   }
390   return aResult;
391 }