0031687: Draw Harness, ViewerTest - extend command vrenderparams with option updating...
[occt.git] / src / XmlMDataXtd / XmlMDataXtd_PatternStdDriver.cxx
CommitLineData
b311480e 1// Created on: 2001-08-24
2// Created by: Alexnder GRIGORIEV
973c2be1 3// Copyright (c) 2001-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
7fd59977 16
83ae3591 17#include <Message_Messenger.hxx>
42cf5bc1 18#include <Standard_Type.hxx>
7fd59977 19#include <TDataStd_Integer.hxx>
42cf5bc1 20#include <TDataStd_Real.hxx>
7fd59977 21#include <TDataXtd_PatternStd.hxx>
42cf5bc1 22#include <TDF_Attribute.hxx>
7fd59977 23#include <TNaming_NamedShape.hxx>
42cf5bc1 24#include <XmlMDataXtd_PatternStdDriver.hxx>
25#include <XmlObjMgt_Persistent.hxx>
7fd59977 26
92efcf78 27IMPLEMENT_STANDARD_RTTIEXT(XmlMDataXtd_PatternStdDriver,XmlMDF_ADriver)
7fd59977 28IMPLEMENT_DOMSTRING (SignatureString, "signature")
29IMPLEMENT_DOMSTRING (Axis1RevString, "axis1reversed")
30IMPLEMENT_DOMSTRING (Axis2RevString, "axis2reversed")
31
32IMPLEMENT_DOMSTRING (NbInstances1RefString, "nbinstances1")
33IMPLEMENT_DOMSTRING (Value1RefString, "value1ref")
34IMPLEMENT_DOMSTRING (Axis1RefString, "axis1")
35
36IMPLEMENT_DOMSTRING (NbInstances2RefString, "nbinstances2")
37IMPLEMENT_DOMSTRING (Value2RefString, "value2ref")
38IMPLEMENT_DOMSTRING (Axis2RefString, "axis2")
39
40IMPLEMENT_DOMSTRING (MirrorRefString, "mirror")
41
42IMPLEMENT_DOMSTRING (TrueString, "true")
43
44//=======================================================================
45//function : XmlMDataXtd_PatternStdDriver
46//purpose : Constructor
47//=======================================================================
48XmlMDataXtd_PatternStdDriver::XmlMDataXtd_PatternStdDriver
83ae3591 49 (const Handle(Message_Messenger)& theMsgDriver)
7fd59977 50 : XmlMDF_ADriver (theMsgDriver, NULL)
51{}
52
53//=======================================================================
54//function : NewEmpty
55//purpose :
56//=======================================================================
57Handle(TDF_Attribute) XmlMDataXtd_PatternStdDriver::NewEmpty() const
58{
59 return (new TDataXtd_PatternStd());
60}
61
62//=======================================================================
63//function : Paste
64//purpose :
65//=======================================================================
66Standard_Boolean XmlMDataXtd_PatternStdDriver::Paste
67 (const XmlObjMgt_Persistent& theSource,
68 const Handle(TDF_Attribute)& theTarget,
69 XmlObjMgt_RRelocationTable& theRelocTable) const
70{
71 Handle(TDataXtd_PatternStd) aP =
72 Handle(TDataXtd_PatternStd)::DownCast(theTarget);
73 const XmlObjMgt_Element& anElem = theSource;
74
75 Standard_Integer aNb;
76 TCollection_ExtendedString aMsgString;
77
78 Standard_Integer signature;
79 if (!anElem.getAttribute(::SignatureString()).GetInteger(signature))
80 {
81 aMsgString = TCollection_ExtendedString
82 ("XmlMDataXtd_PatternStdDriver: Bad or undefined value for a \"")
83 + ::SignatureString() + "\" attribute (must be integer)";
83ae3591 84 myMessageDriver->Send (aMsgString, Message_Fail);
7fd59977 85 return Standard_False;
86 }
87
88 aP->Signature(signature);
89
90 XmlObjMgt_DOMString aString = anElem.getAttribute(::Axis1RevString());
91 aP->Axis1Reversed(aString != NULL);
92 aString = anElem.getAttribute(::Axis2RevString());
93 aP->Axis2Reversed(aString != NULL);
94
95 Handle(TNaming_NamedShape) TNS;
96 Handle(TDataStd_Real) TReal;
97 Handle(TDataStd_Integer) TInt;
98
99 if (signature < 5)
100 {
101 if (!anElem.getAttribute(::Axis1RefString()).GetInteger(aNb))
102 {
103 aMsgString = TCollection_ExtendedString
104 ("XmlMDataXtd_PatternStdDriver: Bad or undefined value for a \"")
105 + ::Axis1RefString() + "\" attribute (must be integer)";
83ae3591 106 myMessageDriver->Send (aMsgString, Message_Fail);
7fd59977 107 return Standard_False;
108 }
109 if (theRelocTable.IsBound(aNb))
110 TNS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
111 else
112 {
113 TNS = new TNaming_NamedShape;
114 theRelocTable.Bind(aNb, TNS);
115 }
116 aP->Axis1(TNS);
117
118 if (!anElem.getAttribute(::Value1RefString()).GetInteger(aNb))
119 {
120 aMsgString = TCollection_ExtendedString
121 ("XmlMDataXtd_PatternStdDriver: Bad or undefined value for a \"")
122 + ::Value1RefString() + "\" attribute (must be integer)";
83ae3591 123 myMessageDriver->Send (aMsgString, Message_Fail);
7fd59977 124 return Standard_False;
125 }
126 if (theRelocTable.IsBound(aNb))
127 TReal = Handle(TDataStd_Real)::DownCast(theRelocTable.Find(aNb));
128 else
129 {
130 TReal = new TDataStd_Real;
131 theRelocTable.Bind(aNb, TReal);
132 }
133 aP->Value1(TReal);
134
135 if (!anElem.getAttribute(::NbInstances1RefString()).GetInteger(aNb))
136 {
137 aMsgString = TCollection_ExtendedString
138 ("XmlMDataXtd_PatternStdDriver: Bad or undefined value for a \"")
139 + ::NbInstances1RefString() + "\" attribute (must be integer)";
83ae3591 140 myMessageDriver->Send (aMsgString, Message_Fail);
7fd59977 141 return Standard_False;
142 }
143 if (theRelocTable.IsBound(aNb))
144 TInt = Handle(TDataStd_Integer)::DownCast(theRelocTable.Find(aNb));
145 else
146 {
147 TInt = new TDataStd_Integer;
148 theRelocTable.Bind(aNb, TInt);
149 }
150 aP->NbInstances1(TInt);
151
152 if (signature > 2)
153 {
154 if (!anElem.getAttribute(::Axis2RefString()).GetInteger(aNb))
155 {
156 aMsgString = TCollection_ExtendedString
157 ("XmlMDataXtd_PatternStdDriver: Bad or undefined value for a \"")
158 + ::Axis2RefString() + "\" attribute (must be integer)";
83ae3591 159 myMessageDriver->Send (aMsgString, Message_Fail);
7fd59977 160 return Standard_False;
161 }
162 if (theRelocTable.IsBound(aNb))
163 TNS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
164 else
165 {
166 TNS = new TNaming_NamedShape;
167 theRelocTable.Bind(aNb, TNS);
168 }
169 aP->Axis2(TNS);
170
171 if (!anElem.getAttribute(::Value2RefString()).GetInteger(aNb))
172 {
173 aMsgString = TCollection_ExtendedString
174 ("XmlMDataXtd_PatternStdDriver: Bad or undefined value for a \"")
175 + ::Value2RefString() + "\" attribute (must be integer)";
83ae3591 176 myMessageDriver->Send (aMsgString, Message_Fail);
7fd59977 177 return Standard_False;
178 }
179 if (theRelocTable.IsBound(aNb))
180 TReal = Handle(TDataStd_Real)::DownCast(theRelocTable.Find(aNb));
181 else
182 {
183 TReal = new TDataStd_Real;
184 theRelocTable.Bind(aNb, TReal);
185 }
186 aP->Value2(TReal);
187
188 if (!anElem.getAttribute(::NbInstances2RefString()).GetInteger(aNb))
189 {
190 aMsgString = TCollection_ExtendedString
191 ("XmlMDataXtd_PatternStdDriver: Bad or undefined value for a \"")
192 + ::NbInstances2RefString() + "\" attribute (must be integer)";
83ae3591 193 myMessageDriver->Send (aMsgString, Message_Fail);
7fd59977 194 return Standard_False;
195 }
196 if (theRelocTable.IsBound(aNb))
197 TInt = Handle(TDataStd_Integer)::DownCast(theRelocTable.Find(aNb));
198 else
199 {
200 TInt = new TDataStd_Integer;
201 theRelocTable.Bind(aNb, TInt);
202 }
203 aP->NbInstances2(TInt);
204 }
205 }
206 else
207 {
208 if (!anElem.getAttribute(::MirrorRefString()).GetInteger(aNb))
209 {
210 aMsgString = TCollection_ExtendedString
211 ("XmlMDataXtd_PatternStdDriver: Bad or undefined value for a \"")
212 + ::MirrorRefString() + "\" attribute (must be integer)";
83ae3591 213 myMessageDriver->Send (aMsgString, Message_Fail);
7fd59977 214 return Standard_False;
215 }
216 if (theRelocTable.IsBound(aNb))
217 TNS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
218 else
219 {
220 TNS = new TNaming_NamedShape;
221 theRelocTable.Bind(aNb, TNS);
222 }
223 aP->Mirror(TNS);
224 }
225 return Standard_True;
226}
227
228//=======================================================================
229//function : Paste
230//purpose :
231//=======================================================================
232void XmlMDataXtd_PatternStdDriver::Paste
233 (const Handle(TDF_Attribute)& theSource,
234 XmlObjMgt_Persistent& theTarget,
235 XmlObjMgt_SRelocationTable& theRelocTable) const
236{
237 Handle(TDataXtd_PatternStd) aP =
238 Handle(TDataXtd_PatternStd)::DownCast(theSource);
239 XmlObjMgt_Element& anElem = theTarget;
240
241 Standard_Integer signature = aP->Signature();
242 anElem.setAttribute(::SignatureString(), signature);
243
244 if (aP->Axis1Reversed())
245 anElem.setAttribute(::Axis1RevString(), ::TrueString());
246 if (aP->Axis2Reversed())
247 anElem.setAttribute(::Axis2RevString(), ::TrueString());
248
249 Handle(TNaming_NamedShape) TNS;
250 Handle(TDataStd_Real) TReal;
251 Handle(TDataStd_Integer) TInt;
252
253 Standard_Integer aNb;
254
255 if (signature < 5)
256 {
257 // axis 1
258 TNS = aP->Axis1();
259 aNb = theRelocTable.FindIndex(TNS);
260 if (aNb == 0)
261 {
262 aNb = theRelocTable.Add(TNS);
263 }
264 anElem.setAttribute(::Axis1RefString(), aNb);
265
266 // real value 1
267 TReal = aP->Value1();
268 aNb = theRelocTable.FindIndex(TReal);
269 if (aNb == 0)
270 {
271 aNb = theRelocTable.Add(TReal);
272 }
273 anElem.setAttribute(::Value1RefString(), aNb);
274
275 // number of instances 1
276 TInt = aP->NbInstances1();
277 aNb = theRelocTable.FindIndex(TInt);
278 if (aNb == 0)
279 {
280 aNb = theRelocTable.Add(TInt);
281 }
282 anElem.setAttribute(::NbInstances1RefString(), aNb);
283
284 if (signature > 2)
285 {
286 // axis 2
287 TNS = aP->Axis2();
288 aNb = theRelocTable.FindIndex(TNS);
289 if (aNb == 0)
290 {
291 aNb = theRelocTable.Add(TNS);
292 }
293 anElem.setAttribute(::Axis2RefString(), aNb);
294
295 // real value 2
296 TReal = aP->Value2();
297 aNb = theRelocTable.FindIndex(TReal);
298 if (aNb == 0)
299 {
300 aNb = theRelocTable.Add(TReal);
301 }
302 anElem.setAttribute(::Value2RefString(), aNb);
303
304 // number of instances 2
305 TInt = aP->NbInstances2();
306 aNb = theRelocTable.FindIndex(TInt);
307 if (aNb == 0)
308 {
309 aNb = theRelocTable.Add(TInt);
310 }
311 anElem.setAttribute(::NbInstances2RefString(), aNb);
312 }
313 }
314 else
315 {
316 TNS = aP->Mirror();
317 aNb = theRelocTable.FindIndex(TNS);
318 if (aNb == 0)
319 {
320 aNb = theRelocTable.Add(TNS);
321 }
322 anElem.setAttribute(::MirrorRefString(), aNb);
323 }
324}