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