1 // Created on: 2001-08-24
2 // Created by: Alexnder GRIGORIEV
3 // Copyright (c) 2001-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
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>
27 IMPLEMENT_STANDARD_RTTIEXT(XmlMDataXtd_ConstraintDriver,XmlMDF_ADriver)
29 static TDataXtd_ConstraintEnum ConstraintTypeEnum
30 (const XmlObjMgt_DOMString&);
31 static const XmlObjMgt_DOMString& ConstraintTypeString
32 (const TDataXtd_ConstraintEnum);
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")
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")
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)
77 //=======================================================================
80 //=======================================================================
81 Handle(TDF_Attribute) XmlMDataXtd_ConstraintDriver::NewEmpty() const
83 return (new TDataXtd_Constraint());
86 //=======================================================================
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
95 Handle(TDataXtd_Constraint) aC =
96 Handle(TDataXtd_Constraint)::DownCast(theTarget);
97 const XmlObjMgt_Element& anElem = theSource;
100 TCollection_ExtendedString aMsgString;
103 Handle(TDataStd_Real) aTValue;
104 XmlObjMgt_DOMString aDOMStr = anElem.getAttribute(::ValueString());
107 if (!aDOMStr.GetInteger(aNb))
109 aMsgString = TCollection_ExtendedString
110 ("XmlMDataXtd_ConstraintDriver: "
111 "Cannot retrieve reference on Integer attribute from \"")
113 myMessageDriver->Send (aMsgString, Message_Fail);
114 return Standard_False;
118 if (theRelocTable.IsBound(aNb))
119 aTValue = Handle(TDataStd_Real)::DownCast(theRelocTable.Find(aNb));
122 aTValue = new TDataStd_Real;
123 theRelocTable.Bind(aNb, aTValue);
125 aC->SetValue(aTValue);
130 aDOMStr = anElem.getAttribute(::GeometriesString());
133 Standard_CString aGs = Standard_CString(aDOMStr.GetString());
136 if (!XmlObjMgt::GetInteger(aGs, aNb))
138 aMsgString = TCollection_ExtendedString
139 ("XmlMDataXtd_ConstraintDriver: Cannot retrieve reference on first Geometry from \"")
141 myMessageDriver->Send (aMsgString, Message_Fail);
142 return Standard_False;
144 Standard_Integer i = 1;
147 Handle(TNaming_NamedShape) aG;
148 if (theRelocTable.IsBound(aNb))
149 aG = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
152 aG = new TNaming_NamedShape;
153 theRelocTable.Bind(aNb, aG);
155 aC->SetGeometry (i, aG);
158 if (!XmlObjMgt::GetInteger(aGs, aNb)) aNb = 0;
164 aDOMStr = anElem.getAttribute(::PlaneString());
167 if (!aDOMStr.GetInteger(aNb))
169 aMsgString = TCollection_ExtendedString
170 ("XmlMDataXtd_ConstraintDriver: Cannot retrieve reference on Plane from \"")
172 myMessageDriver->Send (aMsgString, Message_Fail);
173 return Standard_False;
175 Handle(TNaming_NamedShape) aTPlane;
178 if (theRelocTable.IsBound(aNb))
179 aTPlane = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
182 aTPlane = new TNaming_NamedShape;
183 theRelocTable.Bind(aNb, aTPlane);
185 aC->SetPlane(aTPlane);
190 XmlObjMgt_DOMString aType = anElem.getAttribute(::TypeString());
191 aC->SetType(ConstraintTypeEnum(aType));
194 XmlObjMgt_DOMString aString = anElem.getAttribute(::StatusString());
195 const char * aPtr = aString.GetString();
196 aC->Verified((*aPtr) == '+');
198 aC->Inverted((*aPtr) == '+');
200 aC->Reversed((*aPtr) == '+');
202 return Standard_True;
205 //=======================================================================
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
214 Handle(TDataXtd_Constraint) aC =
215 Handle(TDataXtd_Constraint)::DownCast(theSource);
216 XmlObjMgt_Element& anElem = theTarget;
218 Standard_Integer aNb;
221 Handle(TDataStd_Real) aValue = aC->GetValue();
222 if (!aValue.IsNull())
224 aNb = theRelocTable.FindIndex(aValue);
227 aNb = theRelocTable.Add(aValue);
229 anElem.setAttribute(::ValueString(), aNb);
233 Standard_Integer NbGeom = aC->NbGeometries();
236 TCollection_AsciiString aGsStr;
237 for (Standard_Integer i = 1; i <= NbGeom; i++)
239 Handle(TNaming_NamedShape) aG = aC->GetGeometry(i);
243 aNb = theRelocTable.FindIndex(aG);
246 aNb = theRelocTable.Add(aG);
248 aGsStr += TCollection_AsciiString(aNb) + " ";
252 anElem.setAttribute(::GeometriesString(), aGsStr.ToCString());
256 Handle(TNaming_NamedShape) aTPlane = aC->GetPlane();
257 if (!aTPlane.IsNull())
259 aNb = theRelocTable.FindIndex(aTPlane);
262 aNb = theRelocTable.Add(aTPlane);
264 anElem.setAttribute(::PlaneString(), aNb);
268 anElem.setAttribute(::TypeString(), ConstraintTypeString(aC->GetType()));
271 TCollection_AsciiString aStatusStr;
273 if (aC->Verified()) aStatusStr += "+";
274 else aStatusStr += "-";
276 if (aC->Inverted()) aStatusStr += "+";
277 else aStatusStr += "-";
279 if (aC->Reversed()) aStatusStr += "+";
280 else aStatusStr += "-";
282 anElem.setAttribute(::StatusString(), aStatusStr.ToCString());
285 //=======================================================================
286 //function : ConstraintTypeEnum
288 //=======================================================================
289 static TDataXtd_ConstraintEnum ConstraintTypeEnum (const XmlObjMgt_DOMString& theString)
291 TDataXtd_ConstraintEnum aResult = TDataXtd_RADIUS;
292 // planar constraints
293 if (!theString.equals (::ConRadiusString()))
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;
347 throw Standard_DomainError("TDataXtd_ConstraintEnum; string value without enum term equivalence");
352 //=======================================================================
353 //function : ConstraintTypeString
355 //=======================================================================
356 static const XmlObjMgt_DOMString& ConstraintTypeString (const TDataXtd_ConstraintEnum theE)
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();
390 throw Standard_DomainError("TDataXtd_ConstraintEnum; enum term unknown");