0031642: Visualization - crash in Graphic3d_Structure::SetVisual() on redisplaying...
[occt.git] / src / XmlMDataXtd / XmlMDataXtd_PatternStdDriver.cxx
1 // Created on: 2001-08-24
2 // Created by: Alexnder GRIGORIEV
3 // Copyright (c) 2001-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 <TDataStd_Integer.hxx>
20 #include <TDataStd_Real.hxx>
21 #include <TDataXtd_PatternStd.hxx>
22 #include <TDF_Attribute.hxx>
23 #include <TNaming_NamedShape.hxx>
24 #include <XmlMDataXtd_PatternStdDriver.hxx>
25 #include <XmlObjMgt_Persistent.hxx>
26
27 IMPLEMENT_STANDARD_RTTIEXT(XmlMDataXtd_PatternStdDriver,XmlMDF_ADriver)
28 IMPLEMENT_DOMSTRING (SignatureString,           "signature")
29 IMPLEMENT_DOMSTRING (Axis1RevString,            "axis1reversed")
30 IMPLEMENT_DOMSTRING (Axis2RevString,            "axis2reversed")
31
32 IMPLEMENT_DOMSTRING (NbInstances1RefString,     "nbinstances1")
33 IMPLEMENT_DOMSTRING (Value1RefString,           "value1ref")
34 IMPLEMENT_DOMSTRING (Axis1RefString,            "axis1")
35
36 IMPLEMENT_DOMSTRING (NbInstances2RefString,     "nbinstances2")
37 IMPLEMENT_DOMSTRING (Value2RefString,           "value2ref")
38 IMPLEMENT_DOMSTRING (Axis2RefString,            "axis2")
39
40 IMPLEMENT_DOMSTRING (MirrorRefString,           "mirror")
41
42 IMPLEMENT_DOMSTRING (TrueString,                "true")
43
44 //=======================================================================
45 //function : XmlMDataXtd_PatternStdDriver
46 //purpose  : Constructor
47 //=======================================================================
48 XmlMDataXtd_PatternStdDriver::XmlMDataXtd_PatternStdDriver
49                         (const Handle(Message_Messenger)& theMsgDriver)
50       : XmlMDF_ADriver (theMsgDriver, NULL)
51 {}
52
53 //=======================================================================
54 //function : NewEmpty
55 //purpose  : 
56 //=======================================================================
57 Handle(TDF_Attribute) XmlMDataXtd_PatternStdDriver::NewEmpty() const
58 {
59   return (new TDataXtd_PatternStd());
60 }
61
62 //=======================================================================
63 //function : Paste
64 //purpose  : 
65 //=======================================================================
66 Standard_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)";
84     myMessageDriver->Send (aMsgString, Message_Fail);
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)";
106       myMessageDriver->Send (aMsgString, Message_Fail);
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)";
123       myMessageDriver->Send (aMsgString, Message_Fail);
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)";
140       myMessageDriver->Send (aMsgString, Message_Fail);
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)";
159         myMessageDriver->Send (aMsgString, Message_Fail);
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)";
176         myMessageDriver->Send (aMsgString, Message_Fail);
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)";
193         myMessageDriver->Send (aMsgString, Message_Fail);
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)";
213       myMessageDriver->Send (aMsgString, Message_Fail);
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 //=======================================================================
232 void 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 }