0029338: Data Exchange - Add Planes for Tolerance zones in Geometric tolerances
[occt.git] / src / XCAFDoc / XCAFDoc_GeomTolerance.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include <XCAFDoc_GeomTolerance.hxx>
15
16 #include <TDF_RelocationTable.hxx>
17 #include <TDF_ChildIterator.hxx>
18 #include <XCAFDoc.hxx>
19 #include <TDataStd_TreeNode.hxx>
20 #include <TDataStd_Integer.hxx>
21 #include <TDataStd_IntegerArray.hxx>
22 #include <TDataStd_RealArray.hxx>
23 #include <TDataStd_Real.hxx>
24 #include <TDataXtd_Geometry.hxx>
25 #include <TDataXtd_Plane.hxx>
26 #include <TDataXtd_Point.hxx>
27 #include <XCAFDimTolObjects_GeomToleranceObject.hxx>
28 #include <TNaming_Tool.hxx>
29 #include <TNaming_Builder.hxx>
30 #include <TCollection_ExtendedString.hxx>
31 #include <TDataStd_Name.hxx>
32
33 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_GeomTolerance,TDF_Attribute)
34
35 enum ChildLab
36 {
37   ChildLab_Type = 1,
38   ChildLab_TypeOfValue,
39   ChildLab_Value,
40   ChildLab_MatReqModif,
41   ChildLab_ZoneModif,
42   ChildLab_ValueOfZoneModif,
43   ChildLab_Modifiers,
44   ChildLab_aMaxValueModif,
45   ChildLab_Axis,
46   ChildLab_Plane,
47   ChildLab_Pnt,
48   ChildLab_PntText,
49   ChildLab_Presentation,
50   ChildLab_AffectedPlane
51 };
52
53 //=======================================================================
54 //function : XCAFDoc_GeomTolerance
55 //purpose  : 
56 //=======================================================================
57
58 XCAFDoc_GeomTolerance::XCAFDoc_GeomTolerance()
59 {
60 }
61
62
63 //=======================================================================
64 //function : GetID
65 //purpose  : 
66 //=======================================================================
67
68 const Standard_GUID& XCAFDoc_GeomTolerance::GetID() 
69 {
70   static Standard_GUID DGTID ("58ed092f-44de-11d8-8776-001083004c77");
71   //static Standard_GUID ID("efd212e9-6dfd-11d4-b9c8-0060b0ee281b");
72   return DGTID; 
73   //return ID;
74 }
75
76 //=======================================================================
77 //function :
78 //purpose  : 
79 //=======================================================================
80
81 Handle(XCAFDoc_GeomTolerance) XCAFDoc_GeomTolerance::Set (const TDF_Label& theLabel)
82 {
83   Handle(XCAFDoc_GeomTolerance) A;
84   if (!theLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), A)) {
85     A = new XCAFDoc_GeomTolerance();
86     theLabel.AddAttribute(A);
87   }
88   return A;
89 }
90
91 //=======================================================================
92 //function : SetObject
93 //purpose  : 
94 //=======================================================================
95
96 void XCAFDoc_GeomTolerance::SetObject (const Handle(XCAFDimTolObjects_GeomToleranceObject)& theObject) 
97 {
98   Backup();
99
100   //Label().ForForgetAllAttributes();
101   TDF_ChildIterator anIter(Label());
102   for(;anIter.More(); anIter.Next())
103   {
104     anIter.Value().ForgetAllAttributes();
105   }
106
107   Handle(TDataStd_Integer) aType = TDataStd_Integer::Set(Label().FindChild(ChildLab_Type), theObject->GetType());
108
109   if(theObject->GetTypeOfValue() != XCAFDimTolObjects_GeomToleranceTypeValue_None)
110     Handle(TDataStd_Integer) aTypeOfValue = TDataStd_Integer::Set(Label().FindChild(ChildLab_TypeOfValue), 
111                                             theObject->GetTypeOfValue());
112
113   Handle(TDataStd_Real) aValue = TDataStd_Real::Set(Label().FindChild(ChildLab_Value), theObject->GetValue());
114
115   Handle(TDataStd_Integer) aMatReqModif;
116   if(theObject->GetMaterialRequirementModifier() != XCAFDimTolObjects_GeomToleranceMatReqModif_None)
117     aMatReqModif = TDataStd_Integer::Set(Label().FindChild(ChildLab_MatReqModif), 
118                    theObject->GetMaterialRequirementModifier());
119
120   if(theObject->GetZoneModifier() != XCAFDimTolObjects_GeomToleranceZoneModif_None)
121     Handle(TDataStd_Integer) aZoneModif = TDataStd_Integer::Set(Label().FindChild(ChildLab_ZoneModif), 
122                                           theObject->GetZoneModifier());
123   
124   if(theObject->GetValueOfZoneModifier() > 0)
125     Handle(TDataStd_Real) aValueOfZoneModif = TDataStd_Real::Set(Label().FindChild(ChildLab_ValueOfZoneModif),
126                                               theObject->GetValueOfZoneModifier());
127
128   if(theObject->GetModifiers().Length() > 0)
129   {
130     Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
131     for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
132       anArr->SetValue(i,theObject->GetModifiers().Value(i));
133     Handle(TDataStd_IntegerArray) aModifiers = TDataStd_IntegerArray::Set(Label().FindChild(ChildLab_Modifiers), 
134                                                1, theObject->GetModifiers().Length());
135     if(!aModifiers.IsNull())
136       aModifiers->ChangeArray(anArr);
137   }
138
139   if(theObject->GetMaxValueModifier() > 0)
140     Handle(TDataStd_Real) aMaxValueModif = TDataStd_Real::Set(Label().FindChild(ChildLab_aMaxValueModif),
141                                            theObject->GetMaxValueModifier());
142
143   if (theObject->HasAxis())
144   {
145     TDataXtd_Plane::Set(Label().FindChild(ChildLab_Axis), gp_Pln(gp_Ax3(theObject->GetPlane())));
146   }
147
148   if (theObject->HasPlane())
149   {
150     TDataXtd_Plane::Set(Label().FindChild(ChildLab_Plane), gp_Pln(gp_Ax3(theObject->GetPlane())));
151   }
152
153   if (theObject->HasPoint())
154   {
155     TDataXtd_Point::Set(Label().FindChild(ChildLab_Pnt), theObject->GetPoint());
156   }
157
158   if (theObject->HasPointText())
159   {
160     TDataXtd_Point::Set(Label().FindChild(ChildLab_PntText), theObject->GetPointTextAttach());
161   }
162
163   TopoDS_Shape aPresentation = theObject->GetPresentation();
164   if( !aPresentation.IsNull())
165   {
166     TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
167     TNaming_Builder tnBuild(aLPres);
168     tnBuild.Generated(aPresentation);
169     Handle(TCollection_HAsciiString) aName =  theObject->GetPresentationName();
170     if( !aName.IsNull() )
171     {
172       TCollection_ExtendedString str ( aName->String() );
173       TDataStd_Name::Set ( aLPres, str );
174     }
175   }
176
177   if (theObject->HasAffectedPlane())
178   {
179     TDF_Label aLAffectedPlane = Label().FindChild(ChildLab_AffectedPlane);
180     TDataStd_Integer::Set(aLAffectedPlane, (Standard_Integer)theObject->GetAffectedPlaneType());
181     TDataXtd_Plane::Set(aLAffectedPlane, theObject->GetAffectedPlane());
182   }
183 }
184
185 //=======================================================================
186 //function :GetObject
187 //purpose  : 
188 //=======================================================================
189
190 Handle(XCAFDimTolObjects_GeomToleranceObject) XCAFDoc_GeomTolerance::GetObject()  const
191 {
192   Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = new XCAFDimTolObjects_GeomToleranceObject();
193
194   Handle(TDataStd_Integer) aType;
195   if(Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
196   {
197     anObj->SetType((XCAFDimTolObjects_GeomToleranceType)aType->Get());
198   }
199
200   Handle(TDataStd_Integer) aTypeOfValue;
201   if(Label().FindChild(ChildLab_TypeOfValue).FindAttribute(TDataStd_Integer::GetID(), aTypeOfValue))
202   {
203     anObj->SetTypeOfValue((XCAFDimTolObjects_GeomToleranceTypeValue)aTypeOfValue->Get());
204   }
205
206   Handle(TDataStd_Real) aValue;
207   if(Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_Real::GetID(), aValue))
208   {
209     anObj->SetValue(aValue->Get());
210   }
211
212   Handle(TDataStd_Integer) aMatReqModif;
213   if(Label().FindChild(ChildLab_MatReqModif).FindAttribute(TDataStd_Integer::GetID(), aMatReqModif))
214   {
215     anObj->SetMaterialRequirementModifier((XCAFDimTolObjects_GeomToleranceMatReqModif)aMatReqModif->Get());
216   }
217
218   Handle(TDataStd_Integer) aZoneModif;
219   if(Label().FindChild(ChildLab_ZoneModif).FindAttribute(TDataStd_Integer::GetID(), aZoneModif))
220   {
221     anObj->SetZoneModifier((XCAFDimTolObjects_GeomToleranceZoneModif)aZoneModif->Get());
222   }
223
224   Handle(TDataStd_Real) aValueOfZoneModif;
225   if(Label().FindChild(ChildLab_ValueOfZoneModif).FindAttribute(TDataStd_Real::GetID(), aValueOfZoneModif))
226   {
227     anObj->SetValueOfZoneModifier(aValueOfZoneModif->Get());
228   }
229
230   Handle(TDataStd_IntegerArray) anArr;
231   if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
232      && !anArr->Array().IsNull())
233   {
234     XCAFDimTolObjects_GeomToleranceModifiersSequence aModifiers;
235     for(Standard_Integer i = 1; i <= anArr->Length(); i++)
236       aModifiers.Append((XCAFDimTolObjects_GeomToleranceModif)anArr->Value(i));
237     anObj->SetModifiers(aModifiers);
238   }
239
240   Handle(TDataStd_Real) aMaxValueModif;
241   if(Label().FindChild(ChildLab_aMaxValueModif).FindAttribute(TDataStd_Real::GetID(), aMaxValueModif))
242   {
243     anObj->SetMaxValueModifier(aMaxValueModif->Get());
244   }
245   
246   Handle(TDataXtd_Plane) anAxisAttr;
247   if (Label().FindChild(ChildLab_Axis).FindAttribute(TDataXtd_Plane::GetID(), anAxisAttr))
248   {
249     gp_Pln aPlane;
250     TDataXtd_Geometry::Plane(anAxisAttr->Label(), aPlane);
251     gp_Ax2 anAx(aPlane.Location(), aPlane.Axis().Direction(), aPlane.XAxis().Direction());
252     anObj->SetAxis(anAx);
253   }
254
255   Handle(TDataXtd_Plane) aPlaneAttr;
256   if (Label().FindChild(ChildLab_Plane).FindAttribute(TDataXtd_Plane::GetID(), aPlaneAttr))
257   {
258     gp_Pln aPlane;
259     TDataXtd_Geometry::Plane(aPlaneAttr->Label(), aPlane);
260     gp_Ax2 anAx(aPlane.Location(), aPlane.Axis().Direction(), aPlane.XAxis().Direction());
261     anObj->SetPlane(anAx);
262   }
263
264   Handle(TDataXtd_Point) aPntAttr;
265   if (Label().FindChild(ChildLab_Pnt).FindAttribute(TDataXtd_Point::GetID(), aPntAttr))
266   {
267     gp_Pnt aPoint;
268     TDataXtd_Geometry::Point(aPntAttr->Label(), aPoint);
269     anObj->SetPoint(aPoint);
270   }
271
272   Handle(TDataXtd_Point) aPntTextAttr;
273   if (Label().FindChild(ChildLab_PntText).FindAttribute(TDataXtd_Point::GetID(), aPntTextAttr))
274   {
275     gp_Pnt aPoint;
276     TDataXtd_Geometry::Point(aPntTextAttr->Label(), aPoint);
277     anObj->SetPointTextAttach(aPoint);
278   }
279
280   Handle(TNaming_NamedShape) aNS;
281   TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
282   if ( aLPres.FindAttribute(TNaming_NamedShape::GetID(), aNS) ) 
283   {
284
285     TopoDS_Shape aPresentation = TNaming_Tool::GetShape(aNS);
286     if( !aPresentation.IsNull())
287     {
288       Handle(TDataStd_Name) aNameAtrr;
289       Handle(TCollection_HAsciiString) aPresentName;
290       if (aLPres.FindAttribute(TDataStd_Name::GetID(),aNameAtrr))
291       {
292         const TCollection_ExtendedString& aName = aNameAtrr->Get();
293
294         if( !aName.IsEmpty())
295           aPresentName = new TCollection_HAsciiString(aName);
296       }
297
298       anObj->SetPresentation(aPresentation, aPresentName);
299     }
300   }
301
302   Handle(TDataXtd_Plane) anAffectedPlaneAttr;
303   if (Label().FindChild(ChildLab_AffectedPlane).FindAttribute(TDataXtd_Plane::GetID(), anAffectedPlaneAttr))
304   {
305     gp_Pln aPlane;
306     TDataXtd_Geometry::Plane(anAffectedPlaneAttr->Label(), aPlane);
307     Handle(TDataStd_Integer) aTypeAttr;
308     Label().FindChild(ChildLab_AffectedPlane).FindAttribute(TDataStd_Integer::GetID(), aTypeAttr);
309     anObj->SetAffectedPlane(aPlane, (XCAFDimTolObjects_ToleranceZoneAffectedPlane)aTypeAttr->Get());
310   }
311
312   return anObj;
313 }
314
315 //=======================================================================
316 //function : ID
317 //purpose  : 
318 //=======================================================================
319
320 const Standard_GUID& XCAFDoc_GeomTolerance::ID() const
321 {
322   return GetID();
323 }
324
325 //=======================================================================
326 //function : Restore
327 //purpose  : 
328 //=======================================================================
329
330 void XCAFDoc_GeomTolerance::Restore(const Handle(TDF_Attribute)& /*With*/) 
331 {
332 }
333
334
335 //=======================================================================
336 //function : NewEmpty
337 //purpose  : 
338 //=======================================================================
339
340 Handle(TDF_Attribute) XCAFDoc_GeomTolerance::NewEmpty() const
341 {
342   return new XCAFDoc_GeomTolerance();
343 }
344
345
346 //=======================================================================
347 //function : Paste
348 //purpose  : 
349 //=======================================================================
350
351 void XCAFDoc_GeomTolerance::Paste(const Handle(TDF_Attribute)& /*Into*/,
352                            const Handle(TDF_RelocationTable)& /*RT*/) const
353 {
354 }