0030773: Application Framework - To allow to inherit existing attributes to reuse...
[occt.git] / src / XmlMXCAFDoc / XmlMXCAFDoc_DimTolDriver.cxx
CommitLineData
b311480e 1// Created on: 2008-12-10
2// Created by: Pavel TELKOV
973c2be1 3// Copyright (c) 2008-2014 OPEN CASCADE SAS
b311480e 4//
973c2be1 5// This file is part of Open CASCADE Technology software library.
b311480e 6//
d5f74e42 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
973c2be1 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.
b311480e 12//
973c2be1 13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
7fd59977 15
42cf5bc1 16
83ae3591 17#include <Message_Messenger.hxx>
42cf5bc1 18#include <Standard_Type.hxx>
7fd59977 19#include <TCollection_HAsciiString.hxx>
20#include <TColStd_HArray1OfReal.hxx>
42cf5bc1 21#include <TDF_Attribute.hxx>
22#include <XCAFDoc_DimTol.hxx>
23#include <XmlMXCAFDoc_DimTolDriver.hxx>
24#include <XmlObjMgt.hxx>
25#include <XmlObjMgt_Persistent.hxx>
7fd59977 26
92efcf78 27IMPLEMENT_STANDARD_RTTIEXT(XmlMXCAFDoc_DimTolDriver,XmlMDF_ADriver)
7fd59977 28IMPLEMENT_DOMSTRING (NameIndexString, "name")
29IMPLEMENT_DOMSTRING (DescrIndexString, "descr")
30IMPLEMENT_DOMSTRING (FirstIndexString, "first")
31IMPLEMENT_DOMSTRING (LastIndexString, "last")
32IMPLEMENT_DOMSTRING (ValueIndexString, "values")
33
34//=======================================================================
35//function : XmlMXCAFDoc_DimTolDriver
36//purpose : Constructor
37//=======================================================================
38XmlMXCAFDoc_DimTolDriver::XmlMXCAFDoc_DimTolDriver
83ae3591 39 (const Handle(Message_Messenger)& theMsgDriver)
7fd59977 40: XmlMDF_ADriver (theMsgDriver, "xcaf", "DimTol")
41{}
42
43//=======================================================================
44//function : NewEmpty
45//purpose :
46//=======================================================================
47Handle(TDF_Attribute) XmlMXCAFDoc_DimTolDriver::NewEmpty() const
48{
49 return (new XCAFDoc_DimTol());
50}
51
52//=======================================================================
53//function : Paste
54//purpose : persistent -> transient (retrieve)
55//=======================================================================
56Standard_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 + "\"";
83ae3591 68 myMessageDriver->Send (aMessageString, Message_Fail);
7fd59977 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");
83ae3591 78 myMessageDriver->Send (aMessageString, Message_Fail);
7fd59977 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 ");
83ae3591 94 myMessageDriver->Send (aMessageString, Message_Fail);
7fd59977 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 ");
83ae3591 103 myMessageDriver->Send (aMessageString, Message_Fail);
7fd59977 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 + "\"";
83ae3591 122 myMessageDriver->Send (aMessageString, Message_Fail);
7fd59977 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//=======================================================================
139void 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];
91322f44 170 Sprintf(aValueChar, "%.15g", aHArr->Value(i));
7fd59977 171 aValueStr += aValueChar;
172 if ( i < aLastInd )
173 aValueStr += ' ';
174 }
175 theTarget.Element().setAttribute(::ValueIndexString(), aValueStr.ToCString());
176 }
177}