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 <XCAFDoc_DimTol.hxx>
21 #include <XmlMXCAFDoc_DimTolDriver.hxx>
22 #include <XmlObjMgt.hxx>
23 #include <XmlObjMgt_Persistent.hxx>
25 IMPLEMENT_STANDARD_RTTIEXT(XmlMXCAFDoc_DimTolDriver,XmlMDF_ADriver)
26 IMPLEMENT_DOMSTRING (NameIndexString, "name")
27 IMPLEMENT_DOMSTRING (DescrIndexString, "descr")
28 IMPLEMENT_DOMSTRING (FirstIndexString, "first")
29 IMPLEMENT_DOMSTRING (LastIndexString, "last")
30 IMPLEMENT_DOMSTRING (ValueIndexString, "values")
32 //=======================================================================
33 //function : XmlMXCAFDoc_DimTolDriver
34 //purpose : Constructor
35 //=======================================================================
36 XmlMXCAFDoc_DimTolDriver::XmlMXCAFDoc_DimTolDriver
37 (const Handle(Message_Messenger)& theMsgDriver)
38 : XmlMDF_ADriver (theMsgDriver, "xcaf", "DimTol")
41 //=======================================================================
44 //=======================================================================
45 Handle(TDF_Attribute) XmlMXCAFDoc_DimTolDriver::NewEmpty() const
47 return (new XCAFDoc_DimTol());
50 //=======================================================================
52 //purpose : persistent -> transient (retrieve)
53 //=======================================================================
54 Standard_Boolean XmlMXCAFDoc_DimTolDriver::Paste
55 (const XmlObjMgt_Persistent& theSource,
56 const Handle(TDF_Attribute)& theTarget,
57 XmlObjMgt_RRelocationTable& ) const
59 Standard_Integer aKind;
60 XmlObjMgt_DOMString anIntStr = XmlObjMgt::GetStringValue(theSource);
62 if (anIntStr.GetInteger(aKind) == Standard_False) {
63 TCollection_ExtendedString aMessageString =
64 TCollection_ExtendedString("Cannot retrieve DimTol attribute kind from \"")
66 myMessageDriver->Send (aMessageString, Message_Fail);
67 return Standard_False;
70 const XmlObjMgt_Element& anElement = theSource;
71 XmlObjMgt_DOMString aNameStr = anElement.getAttribute(::NameIndexString());
72 XmlObjMgt_DOMString aDescrStr = anElement.getAttribute(::DescrIndexString());
73 if ( aNameStr == NULL || aDescrStr == NULL ) {
74 TCollection_ExtendedString aMessageString
75 ("Cannot retrieve DimTol attribute name or description");
76 myMessageDriver->Send (aMessageString, Message_Fail);
77 return Standard_False;
80 Handle(TCollection_HAsciiString) aName =
81 new TCollection_HAsciiString( aNameStr.GetString() );
82 Handle(TCollection_HAsciiString) aDescr =
83 new TCollection_HAsciiString( aDescrStr.GetString() );
85 Standard_Integer aFirstInd, aLastInd;
86 XmlObjMgt_DOMString aFirstIndex = anElement.getAttribute(::FirstIndexString());
87 if (aFirstIndex == NULL)
89 else if (!aFirstIndex.GetInteger(aFirstInd)) {
90 TCollection_ExtendedString aMessageString
91 ("Cannot retrieve the DimTol first index for real array ");
92 myMessageDriver->Send (aMessageString, Message_Fail);
93 return Standard_False;
95 XmlObjMgt_DOMString aLastIndex = anElement.getAttribute(::LastIndexString());
96 if (aLastIndex == NULL)
98 else if (!aLastIndex.GetInteger(aLastInd)) {
99 TCollection_ExtendedString aMessageString
100 ("Cannot retrieve the DimTol last index for real array ");
101 myMessageDriver->Send (aMessageString, Message_Fail);
102 return Standard_False;
105 const Standard_Integer aLength = aLastInd - aFirstInd + 1;
106 Handle(TColStd_HArray1OfReal) aHArr;
109 Standard_Real aValue = 0.;
110 const XmlObjMgt_DOMString& aString = anElement.getAttribute(::ValueIndexString());
111 aHArr = new TColStd_HArray1OfReal( aFirstInd, aLastInd );
112 Standard_CString aValueStr = Standard_CString(aString.GetString());
113 for (Standard_Integer ind = aFirstInd; ind <= aLastInd; ind++)
115 if (!XmlObjMgt::GetReal(aValueStr, aValue)) {
116 TCollection_ExtendedString aMessageString =
117 TCollection_ExtendedString("Cannot retrieve real member"
118 " for real array \"")
120 myMessageDriver->Send (aMessageString, Message_Fail);
121 return Standard_False;
123 aHArr->SetValue(ind, aValue);
127 Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theTarget);
128 anAtt->Set(aKind, aHArr, aName, aDescr);
130 return Standard_True;
133 //=======================================================================
135 //purpose : transient -> persistent (store)
136 //=======================================================================
137 void XmlMXCAFDoc_DimTolDriver::Paste (const Handle(TDF_Attribute)& theSource,
138 XmlObjMgt_Persistent& theTarget,
139 XmlObjMgt_SRelocationTable& ) const
141 Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theSource);
143 XmlObjMgt_DOMString aNameString, aDescrString;
144 if ( !anAtt->GetName().IsNull() )
145 aNameString = anAtt->GetName()->String().ToCString();
146 if ( !anAtt->GetDescription().IsNull() )
147 aDescrString = anAtt->GetDescription()->String().ToCString();
149 XmlObjMgt::SetStringValue (theTarget, anAtt->GetKind());
150 theTarget.Element().setAttribute(::NameIndexString(), aNameString);
151 theTarget.Element().setAttribute(::DescrIndexString(),aDescrString);
153 Handle(TColStd_HArray1OfReal) aHArr = anAtt->GetVal();
154 Standard_Integer aFirstInd = 1, aLastInd = 0;
155 if ( !aHArr.IsNull() )
157 aFirstInd = aHArr->Lower();
158 aLastInd = aHArr->Upper();
160 theTarget.Element().setAttribute(::FirstIndexString(), aFirstInd);
161 theTarget.Element().setAttribute(::LastIndexString(), aLastInd);
162 if ( aLastInd >= aFirstInd )
164 TCollection_AsciiString aValueStr;
165 for ( Standard_Integer i = aFirstInd; i <= aLastInd; i++ )
167 char aValueChar[256];
168 Sprintf(aValueChar, "%.15g", aHArr->Value(i));
169 aValueStr += aValueChar;
173 theTarget.Element().setAttribute(::ValueIndexString(), aValueStr.ToCString());