0030773: Application Framework - To allow to inherit existing attributes to reuse...
[occt.git] / src / XmlMXCAFDoc / XmlMXCAFDoc_DimTolDriver.cxx
1 // Created on: 2008-12-10
2 // Created by: Pavel TELKOV
3 // Copyright (c) 2008-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
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.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16
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>
26
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")
33
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")
41 {}
42
43 //=======================================================================
44 //function : NewEmpty
45 //purpose  : 
46 //=======================================================================
47 Handle(TDF_Attribute) XmlMXCAFDoc_DimTolDriver::NewEmpty() const
48 {
49   return (new XCAFDoc_DimTol());
50 }
51
52 //=======================================================================
53 //function : Paste
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
60 {
61   Standard_Integer aKind;
62   XmlObjMgt_DOMString anIntStr = XmlObjMgt::GetStringValue(theSource);
63
64   if (anIntStr.GetInteger(aKind) == Standard_False) {
65     TCollection_ExtendedString aMessageString =
66       TCollection_ExtendedString("Cannot retrieve DimTol attribute kind from \"")
67         + anIntStr + "\"";
68     myMessageDriver->Send (aMessageString, Message_Fail);
69     return Standard_False;
70   }
71   
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;
80   }
81
82   Handle(TCollection_HAsciiString) aName =
83     new TCollection_HAsciiString( aNameStr.GetString() );
84   Handle(TCollection_HAsciiString) aDescr =
85     new TCollection_HAsciiString( aDescrStr.GetString() );
86   
87   Standard_Integer aFirstInd, aLastInd;
88   XmlObjMgt_DOMString aFirstIndex = anElement.getAttribute(::FirstIndexString());
89   if (aFirstIndex == NULL)
90     aFirstInd = 1;
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;
96   }
97   XmlObjMgt_DOMString aLastIndex = anElement.getAttribute(::LastIndexString());
98   if (aLastIndex == NULL)
99     aLastInd = 0;
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;
105   }
106   
107   const Standard_Integer aLength = aLastInd - aFirstInd + 1;
108   Handle(TColStd_HArray1OfReal) aHArr;
109   if ( aLength > 0 ) {
110     // read real array
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++)
116     {
117       if (!XmlObjMgt::GetReal(aValueStr, aValue)) {
118         TCollection_ExtendedString aMessageString =
119           TCollection_ExtendedString("Cannot retrieve real member"
120                                      " for real array \"")
121             + aValueStr + "\"";
122         myMessageDriver->Send (aMessageString, Message_Fail);
123         return Standard_False;
124       }
125       aHArr->SetValue(ind, aValue);
126     }
127   }
128   
129   Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theTarget);
130   anAtt->Set(aKind, aHArr, aName, aDescr);
131
132   return Standard_True;
133 }
134
135 //=======================================================================
136 //function : Paste
137 //purpose  : transient -> persistent (store)
138 //=======================================================================
139 void XmlMXCAFDoc_DimTolDriver::Paste (const Handle(TDF_Attribute)& theSource,
140                                        XmlObjMgt_Persistent&        theTarget,
141                                        XmlObjMgt_SRelocationTable&  ) const
142 {
143   Handle(XCAFDoc_DimTol) anAtt = Handle(XCAFDoc_DimTol)::DownCast(theSource);
144   
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();
150
151   XmlObjMgt::SetStringValue (theTarget, anAtt->GetKind());
152   theTarget.Element().setAttribute(::NameIndexString(), aNameString);
153   theTarget.Element().setAttribute(::DescrIndexString(),aDescrString);
154
155   Handle(TColStd_HArray1OfReal) aHArr = anAtt->GetVal();
156   Standard_Integer aFirstInd = 1, aLastInd = 0;
157   if ( !aHArr.IsNull() )
158   {
159     aFirstInd = aHArr->Lower();
160     aLastInd = aHArr->Upper();
161   }
162   theTarget.Element().setAttribute(::FirstIndexString(), aFirstInd);
163   theTarget.Element().setAttribute(::LastIndexString(), aLastInd);
164   if ( aLastInd >= aFirstInd )
165   {
166     TCollection_AsciiString aValueStr;
167     for ( Standard_Integer i = aFirstInd; i <= aLastInd; i++ )
168     {
169       char aValueChar[256];
170       Sprintf(aValueChar, "%.15g", aHArr->Value(i));
171       aValueStr += aValueChar;
172       if ( i < aLastInd )
173         aValueStr += ' ';
174     }
175     theTarget.Element().setAttribute(::ValueIndexString(), aValueStr.ToCString());
176   }
177 }