1 // Created on: 2008-12-10
2 // Created by: Pavel TELKOV
3 // Copyright (c) 2008-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
17 #include <Message_Messenger.hxx>
18 #include <Standard_Type.hxx>
19 #include <TCollection_HAsciiString.hxx>
20 #include <TColStd_HArray1OfReal.hxx>
21 #include <TDF_Attribute.hxx>
22 #include <XCAFDoc_DimTol.hxx>
23 #include <XmlMXCAFDoc_DimTolDriver.hxx>
24 #include <XmlObjMgt.hxx>
25 #include <XmlObjMgt_Persistent.hxx>
27 IMPLEMENT_STANDARD_RTTIEXT(XmlMXCAFDoc_DimTolDriver,XmlMDF_ADriver)
28 IMPLEMENT_DOMSTRING (NameIndexString, "name")
29 IMPLEMENT_DOMSTRING (DescrIndexString, "descr")
30 IMPLEMENT_DOMSTRING (FirstIndexString, "first")
31 IMPLEMENT_DOMSTRING (LastIndexString, "last")
32 IMPLEMENT_DOMSTRING (ValueIndexString, "values")
34 //=======================================================================
35 //function : XmlMXCAFDoc_DimTolDriver
36 //purpose : Constructor
37 //=======================================================================
38 XmlMXCAFDoc_DimTolDriver::XmlMXCAFDoc_DimTolDriver
39 (const Handle(Message_Messenger)& theMsgDriver)
40 : XmlMDF_ADriver (theMsgDriver, "xcaf", "DimTol")
43 //=======================================================================
46 //=======================================================================
47 Handle(TDF_Attribute) XmlMXCAFDoc_DimTolDriver::NewEmpty() const
49 return (new XCAFDoc_DimTol());
52 //=======================================================================
54 //purpose : persistent -> transient (retrieve)
55 //=======================================================================
56 Standard_Boolean XmlMXCAFDoc_DimTolDriver::Paste
57 (const XmlObjMgt_Persistent& theSource,
58 const Handle(TDF_Attribute)& theTarget,
59 XmlObjMgt_RRelocationTable& ) const
61 Standard_Integer aKind;
62 XmlObjMgt_DOMString anIntStr = XmlObjMgt::GetStringValue(theSource);
64 if (anIntStr.GetInteger(aKind) == Standard_False) {
65 TCollection_ExtendedString aMessageString =
66 TCollection_ExtendedString("Cannot retrieve DimTol attribute kind from \"")
68 myMessageDriver->Send (aMessageString, Message_Fail);
69 return Standard_False;
72 const XmlObjMgt_Element& anElement = theSource;
73 XmlObjMgt_DOMString aNameStr = anElement.getAttribute(::NameIndexString());
74 XmlObjMgt_DOMString aDescrStr = anElement.getAttribute(::DescrIndexString());
75 if ( aNameStr == NULL || aDescrStr == NULL ) {
76 TCollection_ExtendedString aMessageString
77 ("Cannot retrieve DimTol attribute name or description");
78 myMessageDriver->Send (aMessageString, Message_Fail);
79 return Standard_False;
82 Handle(TCollection_HAsciiString) aName =
83 new TCollection_HAsciiString( aNameStr.GetString() );
84 Handle(TCollection_HAsciiString) aDescr =
85 new TCollection_HAsciiString( aDescrStr.GetString() );
87 Standard_Integer aFirstInd, aLastInd;
88 XmlObjMgt_DOMString aFirstIndex = anElement.getAttribute(::FirstIndexString());
89 if (aFirstIndex == NULL)
91 else if (!aFirstIndex.GetInteger(aFirstInd)) {
92 TCollection_ExtendedString aMessageString
93 ("Cannot retrieve the DimTol first index for real array ");
94 myMessageDriver->Send (aMessageString, Message_Fail);
95 return Standard_False;
97 XmlObjMgt_DOMString aLastIndex = anElement.getAttribute(::LastIndexString());
98 if (aLastIndex == NULL)
100 else if (!aLastIndex.GetInteger(aLastInd)) {
101 TCollection_ExtendedString aMessageString
102 ("Cannot retrieve the DimTol last index for real array ");
103 myMessageDriver->Send (aMessageString, Message_Fail);
104 return Standard_False;
107 const Standard_Integer aLength = aLastInd - aFirstInd + 1;
108 Handle(TColStd_HArray1OfReal) aHArr;
111 Standard_Real aValue = 0.;
112 const XmlObjMgt_DOMString& aString = anElement.getAttribute(::ValueIndexString());
113 aHArr = new TColStd_HArray1OfReal( aFirstInd, aLastInd );
114 Standard_CString aValueStr = Standard_CString(aString.GetString());
115 for (Standard_Integer ind = aFirstInd; ind <= aLastInd; ind++)
117 if (!XmlObjMgt::GetReal(aValueStr, aValue)) {
118 TCollection_ExtendedString aMessageString =
119 TCollection_ExtendedString("Cannot retrieve real member"
120 " for real array \"")
122 myMessageDriver->Send (aMessageString, Message_Fail);
123 return Standard_False;
125 aHArr->SetValue(ind, aValue);
129 Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theTarget);
130 anAtt->Set(aKind, aHArr, aName, aDescr);
132 return Standard_True;
135 //=======================================================================
137 //purpose : transient -> persistent (store)
138 //=======================================================================
139 void XmlMXCAFDoc_DimTolDriver::Paste (const Handle(TDF_Attribute)& theSource,
140 XmlObjMgt_Persistent& theTarget,
141 XmlObjMgt_SRelocationTable& ) const
143 Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theSource);
145 XmlObjMgt_DOMString aNameString, aDescrString;
146 if ( !anAtt->GetName().IsNull() )
147 aNameString = anAtt->GetName()->String().ToCString();
148 if ( !anAtt->GetDescription().IsNull() )
149 aDescrString = anAtt->GetDescription()->String().ToCString();
151 XmlObjMgt::SetStringValue (theTarget, anAtt->GetKind());
152 theTarget.Element().setAttribute(::NameIndexString(), aNameString);
153 theTarget.Element().setAttribute(::DescrIndexString(),aDescrString);
155 Handle(TColStd_HArray1OfReal) aHArr = anAtt->GetVal();
156 Standard_Integer aFirstInd = 1, aLastInd = 0;
157 if ( !aHArr.IsNull() )
159 aFirstInd = aHArr->Lower();
160 aLastInd = aHArr->Upper();
162 theTarget.Element().setAttribute(::FirstIndexString(), aFirstInd);
163 theTarget.Element().setAttribute(::LastIndexString(), aLastInd);
164 if ( aLastInd >= aFirstInd )
166 TCollection_AsciiString aValueStr;
167 for ( Standard_Integer i = aFirstInd; i <= aLastInd; i++ )
169 char aValueChar[256];
170 Sprintf(aValueChar, "%.15g", aHArr->Value(i));
171 aValueStr += aValueChar;
175 theTarget.Element().setAttribute(::ValueIndexString(), aValueStr.ToCString());