1 // File: XmlMNaming_NamingDriver.cxx
2 // Created: 31.08.01 10:09:46
3 // Author: Julia DOROVSKIKH
4 // Copyright: Open Cascade 2001
7 #include <XmlMNaming_NamingDriver.ixx>
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>
17 //=======================================================================
18 static TopAbs_ShapeEnum ShapeEnumFromString (const XmlObjMgt_DOMString&);
19 static TNaming_NameType NameTypeFromString (const XmlObjMgt_DOMString&);
21 static const XmlObjMgt_DOMString& ShapeEnumToString (const TopAbs_ShapeEnum);
22 static const XmlObjMgt_DOMString& NameTypeToString (const TNaming_NameType);
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")
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")
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")
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)
62 //=======================================================================
65 //=======================================================================
66 Handle(TDF_Attribute) XmlMNaming_NamingDriver::NewEmpty() const
68 return (new TNaming_Naming());
71 //=======================================================================
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
80 const XmlObjMgt_Element& anElem = theSource;
81 Handle(TNaming_Naming) aNg = Handle(TNaming_Naming)::DownCast(theTarget);
83 TNaming_Name& aNgName = aNg->ChangeName();
85 // type and shape type
86 aNgName.Type (NameTypeFromString (anElem.getAttribute(::TypeString())));
87 aNgName.ShapeType(ShapeEnumFromString(anElem.getAttribute(::ShapeTypeString())));
90 Handle(TNaming_NamedShape) NS;
91 TCollection_ExtendedString aMsgString;
93 XmlObjMgt_DOMString aDOMStr = anElem.getAttribute(::ArgumentsString());
96 Standard_CString aGs = Standard_CString(aDOMStr.GetString());
99 if (!XmlObjMgt::GetInteger(aGs, aNb))
101 aMsgString = TCollection_ExtendedString
102 ("XmlMNaming_NamingDriver: Cannot retrieve reference "
103 "on first Argument from \"") + aDOMStr + "\"";
104 WriteMessage (aMsgString);
105 return Standard_False;
109 if (theRelocTable.IsBound(aNb))
110 NS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
113 NS = new TNaming_NamedShape;
114 theRelocTable.Bind(aNb, NS);
119 if (!XmlObjMgt::GetInteger(aGs, aNb)) aNb = 0;
124 aDOMStr = anElem.getAttribute(::StopNamedShapeString());
127 if (!aDOMStr.GetInteger(aNb))
129 aMsgString = TCollection_ExtendedString
130 ("XmlMNaming_NamingDriver: Cannot retrieve reference "
131 "on StopNamedShape from \"") + aDOMStr + "\"";
132 WriteMessage (aMsgString);
133 return Standard_False;
137 if (theRelocTable.IsBound(aNb))
138 NS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
141 NS = new TNaming_NamedShape;
142 theRelocTable.Bind(aNb, NS);
144 aNgName.StopNamedShape(NS);
149 aDOMStr = anElem.getAttribute(::IndexString());
150 if (!aDOMStr.GetInteger(aNb))
152 aMsgString = TCollection_ExtendedString
153 ("XmlMNaming_NamingDriver: Cannot retrieve "
154 "integer value of Index from \"") + aDOMStr + "\"";
155 WriteMessage (aMsgString);
156 return Standard_False;
161 //cout << "CurDocVersion = " << XmlMNaming::DocumentVersion() <<endl;
163 if(XmlMNaming::DocumentVersion() > 3) {
164 XmlObjMgt_DOMString aDomEntry = anElem.getAttribute(::ContextLabelString());
165 if (aDomEntry != NULL)
167 TCollection_AsciiString anEntry;
168 if (XmlObjMgt::GetTagEntryString (aDomEntry, anEntry) == Standard_False)
170 TCollection_ExtendedString aMessage =
171 TCollection_ExtendedString ("Cannot retrieve Entry from \"")
173 WriteMessage (aMessage);
174 return Standard_False;
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);
183 cout << "Retrieving Context Label = " << anEntry.ToCString() <<endl;
189 cout << "Retrieving Context Label is NULL" <<endl;
193 else if(XmlMNaming::DocumentVersion() == -1)
194 cout << "Current DocVersion field is not initialized. " <<endl;
196 cout << "Current DocVersion = " << XmlMNaming::DocumentVersion() <<endl;
198 return Standard_True;
201 //=======================================================================
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
210 Handle(TNaming_Naming) aNg = Handle(TNaming_Naming)::DownCast(theSource);
211 XmlObjMgt_Element& anElem = theTarget;
212 const TNaming_Name& aNgName = aNg->GetName();
214 // type and shape type
215 anElem.setAttribute(::TypeString(), NameTypeToString(aNgName.Type()));
216 anElem.setAttribute(::ShapeTypeString(), ShapeEnumToString(aNgName.ShapeType()));
218 Standard_Integer aNb;
221 Standard_Integer NbArgs = aNgName.Arguments().Extent();
224 TCollection_AsciiString anArgsStr;
225 for (TNaming_ListIteratorOfListOfNamedShape it (aNgName.Arguments()); it.More(); it.Next())
227 Handle(TNaming_NamedShape) anArg = it.Value();
231 aNb = theRelocTable.FindIndex(anArg);
234 aNb = theRelocTable.Add(anArg);
236 anArgsStr += TCollection_AsciiString(aNb) + " ";
238 else anArgsStr += "0 ";
240 anElem.setAttribute(::ArgumentsString(), anArgsStr.ToCString());
244 Handle(TNaming_NamedShape) aSNS = aNgName.StopNamedShape();
247 aNb = theRelocTable.FindIndex(aSNS);
250 aNb = theRelocTable.Add(aSNS);
252 anElem.setAttribute(::StopNamedShapeString(), aNb);
256 anElem.setAttribute(::IndexString(), aNgName.Index());
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);
266 cout << "XmlMNaming_NamingDriver::Store: ContextLabel Entry = " << anEntry << endl;
267 if (aDOMString != NULL)
269 Standard_CString aStr = Standard_CString(aDOMString.GetString());
270 cout << "XmlMNaming_NamingDriver::Store: ContextLabel DOMString = " << aStr << endl;
272 cout << "XmlMNaming_NamingDriver::Store: aDOMString is NULL" <<endl;
277 //=======================================================================
278 //function : ShapeEnumToString
280 //=======================================================================
281 static const XmlObjMgt_DOMString& ShapeEnumToString (const TopAbs_ShapeEnum theE)
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();
295 static XmlObjMgt_DOMString aNullString;
296 return aNullString; // To avoid compilation error message.
299 //=======================================================================
300 //function : NameTypeToString
302 //=======================================================================
303 static const XmlObjMgt_DOMString& NameTypeToString (const TNaming_NameType theE)
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();
319 Standard_DomainError::Raise("TNaming_NameType; enum term unknown ");
321 static XmlObjMgt_DOMString aNullString;
322 return aNullString; // To avoid compilation error message.
325 //=======================================================================
326 //function : ShapeEnumFromString
328 //=======================================================================
329 static TopAbs_ShapeEnum ShapeEnumFromString (const XmlObjMgt_DOMString& theString)
331 TopAbs_ShapeEnum aResult = TopAbs_SHAPE;
332 if (!theString.equals (::ShShapeString()))
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;
351 Standard_DomainError::Raise
352 ("TopAbs_ShapeEnum; string value without enum term equivalence");
357 //=======================================================================
358 //function : NameTypeFromString
360 //=======================================================================
361 static TNaming_NameType NameTypeFromString (const XmlObjMgt_DOMString& theString)
363 TNaming_NameType aResult = TNaming_UNKNOWN;
364 if (!theString.equals (::NTUnknownString()))
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;
387 Standard_DomainError::Raise
388 ("TNaming_NameType; string value without enum term equivalence");