0033661: Data Exchange, Step Import - Tessellated GDTs are not imported
[occt.git] / src / XmlMDataXtd / XmlMDataXtd_ConstraintDriver.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_Real.hxx>
20 #include <TDataXtd_Constraint.hxx>
21 #include <TDF_Attribute.hxx>
22 #include <TNaming_NamedShape.hxx>
23 #include <XmlMDataXtd_ConstraintDriver.hxx>
24 #include <XmlObjMgt.hxx>
25 #include <XmlObjMgt_Persistent.hxx>
26
27 IMPLEMENT_STANDARD_RTTIEXT(XmlMDataXtd_ConstraintDriver,XmlMDF_ADriver)
28
29 static TDataXtd_ConstraintEnum    ConstraintTypeEnum
30                                                 (const XmlObjMgt_DOMString&);
31 static const XmlObjMgt_DOMString& ConstraintTypeString
32                                                 (const TDataXtd_ConstraintEnum);
33
34 IMPLEMENT_DOMSTRING (TypeString,             "contype")
35 IMPLEMENT_DOMSTRING (ValueString,            "valueref")
36 IMPLEMENT_DOMSTRING (GeometriesString,       "geometries")
37 IMPLEMENT_DOMSTRING (PlaneString,            "plane")
38 IMPLEMENT_DOMSTRING (StatusString,           "flags")
39      // planar constraints
40 IMPLEMENT_DOMSTRING (ConRadiusString,        "radius")
41 IMPLEMENT_DOMSTRING (ConDiameterString,      "diameter")
42 IMPLEMENT_DOMSTRING (ConMinRadiusString,     "minorradius")
43 IMPLEMENT_DOMSTRING (ConMajRadiusString,     "majorradius")
44 IMPLEMENT_DOMSTRING (ConTangentString,       "tangent")
45 IMPLEMENT_DOMSTRING (ConParallelString,      "parallel")
46 IMPLEMENT_DOMSTRING (ConPerpendicularString, "perpendicular")
47 IMPLEMENT_DOMSTRING (ConConcentricString,    "concentric")
48 IMPLEMENT_DOMSTRING (ConCoincidentString,    "coincident")
49 IMPLEMENT_DOMSTRING (ConDistanceString,      "distance")
50 IMPLEMENT_DOMSTRING (ConAngleString,         "angle")
51 IMPLEMENT_DOMSTRING (ConEqualRadiusString,   "equalradius")
52 IMPLEMENT_DOMSTRING (ConSymmetryString,      "symmetry")
53 IMPLEMENT_DOMSTRING (ConMidPointString,      "midpoint")
54 IMPLEMENT_DOMSTRING (ConEqualDistanceString, "equaldist")
55 IMPLEMENT_DOMSTRING (ConFixString,           "fix")
56 IMPLEMENT_DOMSTRING (ConRigidString,         "rigid")
57      // placement constraints
58 IMPLEMENT_DOMSTRING (ConFromString,          "from")
59 IMPLEMENT_DOMSTRING (ConAxisString,          "axis")
60 IMPLEMENT_DOMSTRING (ConMateString,          "mate")
61 IMPLEMENT_DOMSTRING (ConAlignFacesString,    "alignfaces")
62 IMPLEMENT_DOMSTRING (ConAlignAxesString,     "alignaxes")
63 IMPLEMENT_DOMSTRING (ConAxesAngleString,     "axesangle")
64 IMPLEMENT_DOMSTRING (ConFacesAngleString,    "facesangle")
65 IMPLEMENT_DOMSTRING (ConRoundString,         "round")
66 IMPLEMENT_DOMSTRING (ConOffsetString,        "offset")
67
68 //=======================================================================
69 //function : XmlMDataXtd_ConstraintDriver
70 //purpose  : Constructor
71 //=======================================================================
72 XmlMDataXtd_ConstraintDriver::XmlMDataXtd_ConstraintDriver
73                         (const Handle(Message_Messenger)& theMsgDriver)
74       : XmlMDF_ADriver (theMsgDriver, NULL)
75 {}
76
77 //=======================================================================
78 //function : NewEmpty
79 //purpose  : 
80 //=======================================================================
81 Handle(TDF_Attribute) XmlMDataXtd_ConstraintDriver::NewEmpty() const
82 {
83   return (new TDataXtd_Constraint());
84 }
85
86 //=======================================================================
87 //function : Paste
88 //purpose  : persistent -> transient (retrieve)
89 //=======================================================================
90 Standard_Boolean XmlMDataXtd_ConstraintDriver::Paste
91                         (const XmlObjMgt_Persistent&  theSource,
92                          const Handle(TDF_Attribute)& theTarget,
93                          XmlObjMgt_RRelocationTable&  theRelocTable) const
94 {
95   Handle(TDataXtd_Constraint) aC = 
96     Handle(TDataXtd_Constraint)::DownCast(theTarget);
97   const XmlObjMgt_Element& anElem = theSource;
98
99   Standard_Integer aNb;
100   TCollection_ExtendedString aMsgString;
101
102   // value
103   Handle(TDataStd_Real) aTValue;
104   XmlObjMgt_DOMString aDOMStr = anElem.getAttribute(::ValueString());
105   if (aDOMStr != NULL)
106   {
107     if (!aDOMStr.GetInteger(aNb))
108     {
109       aMsgString = TCollection_ExtendedString
110         ("XmlMDataXtd_ConstraintDriver: "
111          "Cannot retrieve reference on Integer attribute from \"")
112           + aDOMStr + "\"";
113       myMessageDriver->Send (aMsgString, Message_Fail);
114       return Standard_False;
115     }
116     if (aNb > 0)
117     {
118       if (theRelocTable.IsBound(aNb))
119         aTValue = Handle(TDataStd_Real)::DownCast(theRelocTable.Find(aNb));
120       else
121       {
122         aTValue = new TDataStd_Real;
123         theRelocTable.Bind(aNb, aTValue);
124       }
125       aC->SetValue(aTValue);
126     }
127   }
128
129   // geometries
130   aDOMStr = anElem.getAttribute(::GeometriesString());
131   if (aDOMStr != NULL)
132   {
133     Standard_CString aGs = Standard_CString(aDOMStr.GetString());
134
135     // first geometry
136     if (!XmlObjMgt::GetInteger(aGs, aNb))
137     {
138       aMsgString = TCollection_ExtendedString
139         ("XmlMDataXtd_ConstraintDriver: Cannot retrieve reference on first Geometry from \"")
140           + aDOMStr + "\"";
141       myMessageDriver->Send (aMsgString, Message_Fail);
142       return Standard_False;
143     }
144     Standard_Integer i = 1;
145     while (aNb > 0)
146     {
147       Handle(TNaming_NamedShape) aG;
148       if (theRelocTable.IsBound(aNb))
149         aG = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
150       else
151       {
152         aG = new TNaming_NamedShape;
153         theRelocTable.Bind(aNb, aG);
154       }
155       aC->SetGeometry (i, aG);
156
157       // next geometry
158       if (!XmlObjMgt::GetInteger(aGs, aNb)) aNb = 0;
159       i++;
160     }
161   }
162
163   // plane
164   aDOMStr = anElem.getAttribute(::PlaneString());
165   if (aDOMStr != NULL)
166   {
167     if (!aDOMStr.GetInteger(aNb))
168     {
169       aMsgString = TCollection_ExtendedString
170         ("XmlMDataXtd_ConstraintDriver: Cannot retrieve reference on Plane from \"")
171           + aDOMStr + "\"";
172       myMessageDriver->Send (aMsgString, Message_Fail);
173       return Standard_False;
174     }
175     Handle(TNaming_NamedShape) aTPlane;
176     if (aNb > 0)
177     {
178       if (theRelocTable.IsBound(aNb))
179         aTPlane = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
180       else
181       {
182         aTPlane = new TNaming_NamedShape;
183         theRelocTable.Bind(aNb, aTPlane);
184       }
185       aC->SetPlane(aTPlane);
186     }
187   }
188
189   // constraint type
190   XmlObjMgt_DOMString aType = anElem.getAttribute(::TypeString());
191   aC->SetType(ConstraintTypeEnum(aType));
192
193   // flags
194   XmlObjMgt_DOMString aString = anElem.getAttribute(::StatusString());
195   const char * aPtr = aString.GetString();
196   aC->Verified((*aPtr) == '+');
197   aPtr ++;
198   aC->Inverted((*aPtr) == '+');
199   aPtr ++;
200   aC->Reversed((*aPtr) == '+');
201
202   return Standard_True;
203 }
204
205 //=======================================================================
206 //function : Paste
207 //purpose  : transient -> persistent (store)
208 //=======================================================================
209 void XmlMDataXtd_ConstraintDriver::Paste
210                         (const Handle(TDF_Attribute)& theSource,
211                          XmlObjMgt_Persistent&        theTarget,
212                          XmlObjMgt_SRelocationTable&  theRelocTable) const
213 {
214   Handle(TDataXtd_Constraint) aC =
215     Handle(TDataXtd_Constraint)::DownCast(theSource);
216   XmlObjMgt_Element& anElem = theTarget;
217
218   Standard_Integer aNb;
219
220   // value
221   Handle(TDataStd_Real) aValue = aC->GetValue();
222   if (!aValue.IsNull())
223   {
224     aNb = theRelocTable.FindIndex(aValue);
225     if (aNb == 0)
226     {
227       aNb = theRelocTable.Add(aValue);
228     }
229     anElem.setAttribute(::ValueString(), aNb);
230   }
231
232   // geometries
233   Standard_Integer NbGeom = aC->NbGeometries();
234   if (NbGeom >= 1)
235   {
236     TCollection_AsciiString aGsStr;
237     for (Standard_Integer i = 1; i <= NbGeom; i++)
238     {
239       Handle(TNaming_NamedShape) aG = aC->GetGeometry(i);
240       aNb = 0;
241       if (!aG.IsNull())
242       {
243         aNb = theRelocTable.FindIndex(aG);
244         if (aNb == 0)
245         {
246           aNb = theRelocTable.Add(aG);
247         }
248         aGsStr += TCollection_AsciiString(aNb) + " ";
249       }
250       else aGsStr += "0 ";
251     }
252     anElem.setAttribute(::GeometriesString(), aGsStr.ToCString());
253   }
254
255   // plane
256   Handle(TNaming_NamedShape) aTPlane = aC->GetPlane();
257   if (!aTPlane.IsNull())
258   {
259     aNb = theRelocTable.FindIndex(aTPlane);
260     if (aNb == 0)
261     {
262       aNb = theRelocTable.Add(aTPlane);
263     }
264     anElem.setAttribute(::PlaneString(), aNb);
265   }
266   
267   // constraint type
268   anElem.setAttribute(::TypeString(), ConstraintTypeString(aC->GetType()));
269
270   // flags
271   TCollection_AsciiString aStatusStr;
272
273   if (aC->Verified()) aStatusStr += "+";
274   else aStatusStr += "-";
275
276   if (aC->Inverted()) aStatusStr += "+";
277   else aStatusStr += "-";
278
279   if (aC->Reversed()) aStatusStr += "+";
280   else aStatusStr += "-";
281
282   anElem.setAttribute(::StatusString(), aStatusStr.ToCString());
283 }
284
285 //=======================================================================
286 //function : ConstraintTypeEnum
287 //purpose  : 
288 //=======================================================================
289 static TDataXtd_ConstraintEnum ConstraintTypeEnum (const XmlObjMgt_DOMString& theString) 
290 {
291   TDataXtd_ConstraintEnum aResult = TDataXtd_RADIUS;
292   // planar constraints
293   if (!theString.equals (::ConRadiusString()))
294   {
295     if (theString.equals (::ConDiameterString()))
296       aResult = TDataXtd_DIAMETER;
297     else if (theString.equals (::ConMinRadiusString()))
298       aResult = TDataXtd_MINOR_RADIUS;
299     else if (theString.equals (::ConMajRadiusString()))
300       aResult = TDataXtd_MAJOR_RADIUS;
301     else if (theString.equals (::ConTangentString()))
302       aResult = TDataXtd_TANGENT;
303     else if (theString.equals (::ConParallelString()))
304       aResult = TDataXtd_PARALLEL;
305     else if (theString.equals (::ConPerpendicularString()))
306       aResult = TDataXtd_PERPENDICULAR;
307     else if (theString.equals (::ConConcentricString()))
308       aResult = TDataXtd_CONCENTRIC;
309     else if (theString.equals (::ConCoincidentString()))
310       aResult = TDataXtd_COINCIDENT;
311     else if (theString.equals (::ConDistanceString()))
312       aResult = TDataXtd_DISTANCE;
313     else if (theString.equals (::ConAngleString()))
314       aResult = TDataXtd_ANGLE;
315     else if (theString.equals (::ConEqualRadiusString()))
316       aResult = TDataXtd_EQUAL_RADIUS;
317     else if (theString.equals (::ConSymmetryString()))
318       aResult = TDataXtd_SYMMETRY;
319     else if (theString.equals (::ConMidPointString()))
320       aResult = TDataXtd_MIDPOINT;
321     else if (theString.equals (::ConEqualDistanceString()))
322       aResult = TDataXtd_EQUAL_DISTANCE;
323     else if (theString.equals (::ConFixString()))
324       aResult = TDataXtd_FIX;
325     else if (theString.equals (::ConRigidString()))
326       aResult = TDataXtd_RIGID;
327     // placement constraints
328     else if (theString.equals (::ConFromString()))
329       aResult = TDataXtd_FROM;
330     else if (theString.equals (::ConAxisString()))
331       aResult = TDataXtd_AXIS;
332     else if (theString.equals (::ConMateString()))
333       aResult = TDataXtd_MATE;
334     else if (theString.equals (::ConAlignFacesString()))
335       aResult = TDataXtd_ALIGN_FACES;
336     else if (theString.equals (::ConAlignAxesString()))
337       aResult = TDataXtd_ALIGN_AXES;
338     else if (theString.equals (::ConAxesAngleString()))
339       aResult = TDataXtd_AXES_ANGLE;
340     else if (theString.equals (::ConFacesAngleString()))
341       aResult = TDataXtd_FACES_ANGLE;
342     else if (theString.equals (::ConRoundString()))
343       aResult = TDataXtd_ROUND;
344     else if (theString.equals (::ConOffsetString()))
345       aResult = TDataXtd_OFFSET;
346     else
347       throw Standard_DomainError("TDataXtd_ConstraintEnum; string value without enum term equivalence");
348   }
349   return aResult;
350 }
351
352 //=======================================================================
353 //function : ConstraintTypeString
354 //purpose  : 
355 //=======================================================================
356 static const XmlObjMgt_DOMString& ConstraintTypeString (const TDataXtd_ConstraintEnum theE) 
357 {
358   switch (theE)
359   {
360     // planar constraints
361   case TDataXtd_RADIUS         : return ::ConRadiusString();
362   case TDataXtd_DIAMETER       : return ::ConDiameterString();
363   case TDataXtd_MINOR_RADIUS   : return ::ConMinRadiusString();
364   case TDataXtd_MAJOR_RADIUS   : return ::ConMajRadiusString();
365   case TDataXtd_TANGENT        : return ::ConTangentString();
366   case TDataXtd_PARALLEL       : return ::ConParallelString();
367   case TDataXtd_PERPENDICULAR  : return ::ConPerpendicularString();
368   case TDataXtd_CONCENTRIC     : return ::ConConcentricString();
369   case TDataXtd_COINCIDENT     : return ::ConCoincidentString();
370   case TDataXtd_DISTANCE       : return ::ConDistanceString();
371   case TDataXtd_ANGLE          : return ::ConAngleString();
372   case TDataXtd_EQUAL_RADIUS   : return ::ConEqualRadiusString();
373   case TDataXtd_SYMMETRY       : return ::ConSymmetryString();
374   case TDataXtd_MIDPOINT       : return ::ConMidPointString();   
375   case TDataXtd_EQUAL_DISTANCE : return ::ConEqualDistanceString();
376   case TDataXtd_FIX            : return ::ConFixString();
377   case TDataXtd_RIGID          : return ::ConRigidString();
378     // placement constraints
379   case TDataXtd_FROM           : return ::ConFromString(); 
380   case TDataXtd_AXIS           : return ::ConAxisString(); 
381   case TDataXtd_MATE           : return ::ConMateString();
382   case TDataXtd_ALIGN_FACES    : return ::ConAlignFacesString();
383   case TDataXtd_ALIGN_AXES     : return ::ConAlignAxesString();
384   case TDataXtd_AXES_ANGLE     : return ::ConAxesAngleString();
385   case TDataXtd_FACES_ANGLE    : return ::ConFacesAngleString();
386   case TDataXtd_ROUND          : return ::ConRoundString();
387   case TDataXtd_OFFSET         : return ::ConOffsetString();
388     
389   default:
390     throw Standard_DomainError("TDataXtd_ConstraintEnum; enum term unknown");
391   }
392 }