1 // File: XmlMXCAFDoc_DimTolDriver.cxx
2 // Created: 10.12.08 15:04:13
3 // Author: Pavel TELKOV
4 // Copyright: Open CASCADE 2008
6 #include <XmlMXCAFDoc_DimTolDriver.ixx>
7 #include <XmlObjMgt.hxx>
8 #include <XCAFDoc_DimTol.hxx>
9 #include <TCollection_HAsciiString.hxx>
10 #include <TColStd_HArray1OfReal.hxx>
12 IMPLEMENT_DOMSTRING (NameIndexString, "name")
13 IMPLEMENT_DOMSTRING (DescrIndexString, "descr")
14 IMPLEMENT_DOMSTRING (FirstIndexString, "first")
15 IMPLEMENT_DOMSTRING (LastIndexString, "last")
16 IMPLEMENT_DOMSTRING (ValueIndexString, "values")
18 //=======================================================================
19 //function : XmlMXCAFDoc_DimTolDriver
20 //purpose : Constructor
21 //=======================================================================
22 XmlMXCAFDoc_DimTolDriver::XmlMXCAFDoc_DimTolDriver
23 (const Handle(CDM_MessageDriver)& theMsgDriver)
24 : XmlMDF_ADriver (theMsgDriver, "xcaf", "DimTol")
27 //=======================================================================
30 //=======================================================================
31 Handle(TDF_Attribute) XmlMXCAFDoc_DimTolDriver::NewEmpty() const
33 return (new XCAFDoc_DimTol());
36 //=======================================================================
38 //purpose : persistent -> transient (retrieve)
39 //=======================================================================
40 Standard_Boolean XmlMXCAFDoc_DimTolDriver::Paste
41 (const XmlObjMgt_Persistent& theSource,
42 const Handle(TDF_Attribute)& theTarget,
43 XmlObjMgt_RRelocationTable& ) const
45 Standard_Integer aKind;
46 XmlObjMgt_DOMString anIntStr = XmlObjMgt::GetStringValue(theSource);
48 if (anIntStr.GetInteger(aKind) == Standard_False) {
49 TCollection_ExtendedString aMessageString =
50 TCollection_ExtendedString("Cannot retrieve DimTol attribute kind from \"")
52 WriteMessage (aMessageString);
53 return Standard_False;
56 const XmlObjMgt_Element& anElement = theSource;
57 XmlObjMgt_DOMString aNameStr = anElement.getAttribute(::NameIndexString());
58 XmlObjMgt_DOMString aDescrStr = anElement.getAttribute(::DescrIndexString());
59 if ( aNameStr == NULL || aDescrStr == NULL ) {
60 TCollection_ExtendedString aMessageString
61 ("Cannot retrieve DimTol attribute name or description");
62 WriteMessage (aMessageString);
63 return Standard_False;
66 Handle(TCollection_HAsciiString) aName =
67 new TCollection_HAsciiString( aNameStr.GetString() );
68 Handle(TCollection_HAsciiString) aDescr =
69 new TCollection_HAsciiString( aDescrStr.GetString() );
71 Standard_Integer aFirstInd, aLastInd;
72 XmlObjMgt_DOMString aFirstIndex = anElement.getAttribute(::FirstIndexString());
73 if (aFirstIndex == NULL)
75 else if (!aFirstIndex.GetInteger(aFirstInd)) {
76 TCollection_ExtendedString aMessageString
77 ("Cannot retrieve the DimTol first index for real array ");
78 WriteMessage (aMessageString);
79 return Standard_False;
81 XmlObjMgt_DOMString aLastIndex = anElement.getAttribute(::LastIndexString());
82 if (aLastIndex == NULL)
84 else if (!aLastIndex.GetInteger(aLastInd)) {
85 TCollection_ExtendedString aMessageString
86 ("Cannot retrieve the DimTol last index for real array ");
87 WriteMessage (aMessageString);
88 return Standard_False;
91 const Standard_Integer aLength = aLastInd - aFirstInd + 1;
92 Handle(TColStd_HArray1OfReal) aHArr;
95 Standard_Real aValue = 0.;
96 const XmlObjMgt_DOMString& aString = anElement.getAttribute(::ValueIndexString());
97 aHArr = new TColStd_HArray1OfReal( aFirstInd, aLastInd );
98 Standard_CString aValueStr = Standard_CString(aString.GetString());
99 for (Standard_Integer ind = aFirstInd; ind <= aLastInd; ind++)
101 if (!XmlObjMgt::GetReal(aValueStr, aValue)) {
102 TCollection_ExtendedString aMessageString =
103 TCollection_ExtendedString("Cannot retrieve real member"
104 " for real array \"")
106 WriteMessage (aMessageString);
107 return Standard_False;
109 aHArr->SetValue(ind, aValue);
113 Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theTarget);
114 anAtt->Set(aKind, aHArr, aName, aDescr);
116 return Standard_True;
119 //=======================================================================
121 //purpose : transient -> persistent (store)
122 //=======================================================================
123 void XmlMXCAFDoc_DimTolDriver::Paste (const Handle(TDF_Attribute)& theSource,
124 XmlObjMgt_Persistent& theTarget,
125 XmlObjMgt_SRelocationTable& ) const
127 Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theSource);
129 XmlObjMgt_DOMString aNameString, aDescrString;
130 if ( !anAtt->GetName().IsNull() )
131 aNameString = anAtt->GetName()->String().ToCString();
132 if ( !anAtt->GetDescription().IsNull() )
133 aDescrString = anAtt->GetDescription()->String().ToCString();
135 XmlObjMgt::SetStringValue (theTarget, anAtt->GetKind());
136 theTarget.Element().setAttribute(::NameIndexString(), aNameString);
137 theTarget.Element().setAttribute(::DescrIndexString(),aDescrString);
139 Handle(TColStd_HArray1OfReal) aHArr = anAtt->GetVal();
140 Standard_Integer aFirstInd = 1, aLastInd = 0;
141 if ( !aHArr.IsNull() )
143 aFirstInd = aHArr->Lower();
144 aLastInd = aHArr->Upper();
146 theTarget.Element().setAttribute(::FirstIndexString(), aFirstInd);
147 theTarget.Element().setAttribute(::LastIndexString(), aLastInd);
148 if ( aLastInd >= aFirstInd )
150 TCollection_AsciiString aValueStr;
151 for ( Standard_Integer i = aFirstInd; i <= aLastInd; i++ )
153 char aValueChar[256];
154 sprintf(aValueChar, "%.15g", aHArr->Value(i));
155 aValueStr += aValueChar;
159 theTarget.Element().setAttribute(::ValueIndexString(), aValueStr.ToCString());