1 // Created on: 2008-12-10
2 // Created by: Pavel TELKOV
3 // Copyright (c) 2008-2012 OPEN CASCADE SAS
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
21 #include <XmlMXCAFDoc_DimTolDriver.ixx>
22 #include <XmlObjMgt.hxx>
23 #include <XCAFDoc_DimTol.hxx>
24 #include <TCollection_HAsciiString.hxx>
25 #include <TColStd_HArray1OfReal.hxx>
27 IMPLEMENT_DOMSTRING (NameIndexString, "name")
28 IMPLEMENT_DOMSTRING (DescrIndexString, "descr")
29 IMPLEMENT_DOMSTRING (FirstIndexString, "first")
30 IMPLEMENT_DOMSTRING (LastIndexString, "last")
31 IMPLEMENT_DOMSTRING (ValueIndexString, "values")
33 //=======================================================================
34 //function : XmlMXCAFDoc_DimTolDriver
35 //purpose : Constructor
36 //=======================================================================
37 XmlMXCAFDoc_DimTolDriver::XmlMXCAFDoc_DimTolDriver
38 (const Handle(CDM_MessageDriver)& theMsgDriver)
39 : XmlMDF_ADriver (theMsgDriver, "xcaf", "DimTol")
42 //=======================================================================
45 //=======================================================================
46 Handle(TDF_Attribute) XmlMXCAFDoc_DimTolDriver::NewEmpty() const
48 return (new XCAFDoc_DimTol());
51 //=======================================================================
53 //purpose : persistent -> transient (retrieve)
54 //=======================================================================
55 Standard_Boolean XmlMXCAFDoc_DimTolDriver::Paste
56 (const XmlObjMgt_Persistent& theSource,
57 const Handle(TDF_Attribute)& theTarget,
58 XmlObjMgt_RRelocationTable& ) const
60 Standard_Integer aKind;
61 XmlObjMgt_DOMString anIntStr = XmlObjMgt::GetStringValue(theSource);
63 if (anIntStr.GetInteger(aKind) == Standard_False) {
64 TCollection_ExtendedString aMessageString =
65 TCollection_ExtendedString("Cannot retrieve DimTol attribute kind from \"")
67 WriteMessage (aMessageString);
68 return Standard_False;
71 const XmlObjMgt_Element& anElement = theSource;
72 XmlObjMgt_DOMString aNameStr = anElement.getAttribute(::NameIndexString());
73 XmlObjMgt_DOMString aDescrStr = anElement.getAttribute(::DescrIndexString());
74 if ( aNameStr == NULL || aDescrStr == NULL ) {
75 TCollection_ExtendedString aMessageString
76 ("Cannot retrieve DimTol attribute name or description");
77 WriteMessage (aMessageString);
78 return Standard_False;
81 Handle(TCollection_HAsciiString) aName =
82 new TCollection_HAsciiString( aNameStr.GetString() );
83 Handle(TCollection_HAsciiString) aDescr =
84 new TCollection_HAsciiString( aDescrStr.GetString() );
86 Standard_Integer aFirstInd, aLastInd;
87 XmlObjMgt_DOMString aFirstIndex = anElement.getAttribute(::FirstIndexString());
88 if (aFirstIndex == NULL)
90 else if (!aFirstIndex.GetInteger(aFirstInd)) {
91 TCollection_ExtendedString aMessageString
92 ("Cannot retrieve the DimTol first index for real array ");
93 WriteMessage (aMessageString);
94 return Standard_False;
96 XmlObjMgt_DOMString aLastIndex = anElement.getAttribute(::LastIndexString());
97 if (aLastIndex == NULL)
99 else if (!aLastIndex.GetInteger(aLastInd)) {
100 TCollection_ExtendedString aMessageString
101 ("Cannot retrieve the DimTol last index for real array ");
102 WriteMessage (aMessageString);
103 return Standard_False;
106 const Standard_Integer aLength = aLastInd - aFirstInd + 1;
107 Handle(TColStd_HArray1OfReal) aHArr;
110 Standard_Real aValue = 0.;
111 const XmlObjMgt_DOMString& aString = anElement.getAttribute(::ValueIndexString());
112 aHArr = new TColStd_HArray1OfReal( aFirstInd, aLastInd );
113 Standard_CString aValueStr = Standard_CString(aString.GetString());
114 for (Standard_Integer ind = aFirstInd; ind <= aLastInd; ind++)
116 if (!XmlObjMgt::GetReal(aValueStr, aValue)) {
117 TCollection_ExtendedString aMessageString =
118 TCollection_ExtendedString("Cannot retrieve real member"
119 " for real array \"")
121 WriteMessage (aMessageString);
122 return Standard_False;
124 aHArr->SetValue(ind, aValue);
128 Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theTarget);
129 anAtt->Set(aKind, aHArr, aName, aDescr);
131 return Standard_True;
134 //=======================================================================
136 //purpose : transient -> persistent (store)
137 //=======================================================================
138 void XmlMXCAFDoc_DimTolDriver::Paste (const Handle(TDF_Attribute)& theSource,
139 XmlObjMgt_Persistent& theTarget,
140 XmlObjMgt_SRelocationTable& ) const
142 Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theSource);
144 XmlObjMgt_DOMString aNameString, aDescrString;
145 if ( !anAtt->GetName().IsNull() )
146 aNameString = anAtt->GetName()->String().ToCString();
147 if ( !anAtt->GetDescription().IsNull() )
148 aDescrString = anAtt->GetDescription()->String().ToCString();
150 XmlObjMgt::SetStringValue (theTarget, anAtt->GetKind());
151 theTarget.Element().setAttribute(::NameIndexString(), aNameString);
152 theTarget.Element().setAttribute(::DescrIndexString(),aDescrString);
154 Handle(TColStd_HArray1OfReal) aHArr = anAtt->GetVal();
155 Standard_Integer aFirstInd = 1, aLastInd = 0;
156 if ( !aHArr.IsNull() )
158 aFirstInd = aHArr->Lower();
159 aLastInd = aHArr->Upper();
161 theTarget.Element().setAttribute(::FirstIndexString(), aFirstInd);
162 theTarget.Element().setAttribute(::LastIndexString(), aLastInd);
163 if ( aLastInd >= aFirstInd )
165 TCollection_AsciiString aValueStr;
166 for ( Standard_Integer i = aFirstInd; i <= aLastInd; i++ )
168 char aValueChar[256];
169 Sprintf(aValueChar, "%.15g", aHArr->Value(i));
170 aValueStr += aValueChar;
174 theTarget.Element().setAttribute(::ValueIndexString(), aValueStr.ToCString());