79fb481543f9ed1c61d4b96f5db7a57ab3636fdf
[occt.git] / src / XmlMXCAFDoc / XmlMXCAFDoc_DimTolDriver.cxx
1 // Created on: 2008-12-10
2 // Created by: Pavel TELKOV
3 // Copyright (c) 2008-2012 OPEN CASCADE SAS
4 //
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.
9 //
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.
12 //
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.
19
20
21 #include <XmlMXCAFDoc_DimTolDriver.ixx>
22 #include <XmlObjMgt.hxx>
23 #include <XCAFDoc_DimTol.hxx>
24 #include <TCollection_HAsciiString.hxx>
25 #include <TColStd_HArray1OfReal.hxx>
26
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")
32
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")
40 {}
41
42 //=======================================================================
43 //function : NewEmpty
44 //purpose  : 
45 //=======================================================================
46 Handle(TDF_Attribute) XmlMXCAFDoc_DimTolDriver::NewEmpty() const
47 {
48   return (new XCAFDoc_DimTol());
49 }
50
51 //=======================================================================
52 //function : Paste
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
59 {
60   Standard_Integer aKind;
61   XmlObjMgt_DOMString anIntStr = XmlObjMgt::GetStringValue(theSource);
62
63   if (anIntStr.GetInteger(aKind) == Standard_False) {
64     TCollection_ExtendedString aMessageString =
65       TCollection_ExtendedString("Cannot retrieve DimTol attribute kind from \"")
66         + anIntStr + "\"";
67     WriteMessage (aMessageString);
68     return Standard_False;
69   }
70   
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;
79   }
80
81   Handle(TCollection_HAsciiString) aName =
82     new TCollection_HAsciiString( aNameStr.GetString() );
83   Handle(TCollection_HAsciiString) aDescr =
84     new TCollection_HAsciiString( aDescrStr.GetString() );
85   
86   Standard_Integer aFirstInd, aLastInd;
87   XmlObjMgt_DOMString aFirstIndex = anElement.getAttribute(::FirstIndexString());
88   if (aFirstIndex == NULL)
89     aFirstInd = 1;
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;
95   }
96   XmlObjMgt_DOMString aLastIndex = anElement.getAttribute(::LastIndexString());
97   if (aLastIndex == NULL)
98     aLastInd = 0;
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;
104   }
105   
106   const Standard_Integer aLength = aLastInd - aFirstInd + 1;
107   Handle(TColStd_HArray1OfReal) aHArr;
108   if ( aLength > 0 ) {
109     // read real array
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++)
115     {
116       if (!XmlObjMgt::GetReal(aValueStr, aValue)) {
117         TCollection_ExtendedString aMessageString =
118           TCollection_ExtendedString("Cannot retrieve real member"
119                                      " for real array \"")
120             + aValueStr + "\"";
121         WriteMessage (aMessageString);
122         return Standard_False;
123       }
124       aHArr->SetValue(ind, aValue);
125     }
126   }
127   
128   Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theTarget);
129   anAtt->Set(aKind, aHArr, aName, aDescr);
130
131   return Standard_True;
132 }
133
134 //=======================================================================
135 //function : Paste
136 //purpose  : transient -> persistent (store)
137 //=======================================================================
138 void XmlMXCAFDoc_DimTolDriver::Paste (const Handle(TDF_Attribute)& theSource,
139                                        XmlObjMgt_Persistent&        theTarget,
140                                        XmlObjMgt_SRelocationTable&  ) const
141 {
142   Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theSource);
143   
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();
149
150   XmlObjMgt::SetStringValue (theTarget, anAtt->GetKind());
151   theTarget.Element().setAttribute(::NameIndexString(), aNameString);
152   theTarget.Element().setAttribute(::DescrIndexString(),aDescrString);
153
154   Handle(TColStd_HArray1OfReal) aHArr = anAtt->GetVal();
155   Standard_Integer aFirstInd = 1, aLastInd = 0;
156   if ( !aHArr.IsNull() )
157   {
158     aFirstInd = aHArr->Lower();
159     aLastInd = aHArr->Upper();
160   }
161   theTarget.Element().setAttribute(::FirstIndexString(), aFirstInd);
162   theTarget.Element().setAttribute(::LastIndexString(), aLastInd);
163   if ( aLastInd >= aFirstInd )
164   {
165     TCollection_AsciiString aValueStr;
166     for ( Standard_Integer i = aFirstInd; i <= aLastInd; i++ )
167     {
168       char aValueChar[256];
169       Sprintf(aValueChar, "%.15g", aHArr->Value(i));
170       aValueStr += aValueChar;
171       if ( i < aLastInd )
172         aValueStr += ' ';
173     }
174     theTarget.Element().setAttribute(::ValueIndexString(), aValueStr.ToCString());
175   }
176 }