0031313: Foundation Classes - Dump improvement for classes
[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 <XCAFDimTolObjects_GeomToleranceObject.hxx>
27 #include <TNaming_Tool.hxx>
28 #include <TNaming_Builder.hxx>
29 #include <TCollection_ExtendedString.hxx>
30 #include <TDataStd_Name.hxx>
31
32 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_GeomTolerance,TDF_Attribute)
33
34 enum ChildLab
35 {
36   ChildLab_Type = 1,
37   ChildLab_TypeOfValue,
38   ChildLab_Value,
39   ChildLab_MatReqModif,
40   ChildLab_ZoneModif,
41   ChildLab_ValueOfZoneModif,
42   ChildLab_Modifiers,
43   ChildLab_aMaxValueModif,
44   ChildLab_AxisLoc,
45   ChildLab_AxisN,
46   ChildLab_AxisRef,
47   ChildLab_PlaneLoc,
48   ChildLab_PlaneN,
49   ChildLab_PlaneRef,
50   ChildLab_Pnt,
51   ChildLab_PntText,
52   ChildLab_Presentation,
53   ChildLab_AffectedPlane
54 };
55
56 //=======================================================================
57 //function : XCAFDoc_GeomTolerance
58 //purpose  : 
59 //=======================================================================
60
61 XCAFDoc_GeomTolerance::XCAFDoc_GeomTolerance()
62 {
63 }
64
65
66 //=======================================================================
67 //function : GetID
68 //purpose  : 
69 //=======================================================================
70
71 const Standard_GUID& XCAFDoc_GeomTolerance::GetID() 
72 {
73   static Standard_GUID DGTID ("58ed092f-44de-11d8-8776-001083004c77");
74   //static Standard_GUID ID("efd212e9-6dfd-11d4-b9c8-0060b0ee281b");
75   return DGTID; 
76   //return ID;
77 }
78
79 //=======================================================================
80 //function :
81 //purpose  : 
82 //=======================================================================
83
84 Handle(XCAFDoc_GeomTolerance) XCAFDoc_GeomTolerance::Set (const TDF_Label& theLabel)
85 {
86   Handle(XCAFDoc_GeomTolerance) A;
87   if (!theLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), A)) {
88     A = new XCAFDoc_GeomTolerance();
89     theLabel.AddAttribute(A);
90   }
91   return A;
92 }
93
94 //=======================================================================
95 //function : SetObject
96 //purpose  : 
97 //=======================================================================
98
99 void XCAFDoc_GeomTolerance::SetObject (const Handle(XCAFDimTolObjects_GeomToleranceObject)& theObject) 
100 {
101   Backup();
102
103   if (theObject->GetSemanticName())
104   {
105     TCollection_ExtendedString str(theObject->GetSemanticName()->String());
106     TDataStd_Name::Set(Label(), str);
107   }
108
109   TDF_ChildIterator anIter(Label());
110   for(;anIter.More(); anIter.Next())
111   {
112     anIter.Value().ForgetAllAttributes();
113   }
114
115   Handle(TDataStd_Integer) aType = TDataStd_Integer::Set(Label().FindChild(ChildLab_Type), theObject->GetType());
116
117   if(theObject->GetTypeOfValue() != XCAFDimTolObjects_GeomToleranceTypeValue_None)
118     Handle(TDataStd_Integer) aTypeOfValue = TDataStd_Integer::Set(Label().FindChild(ChildLab_TypeOfValue), 
119                                             theObject->GetTypeOfValue());
120
121   Handle(TDataStd_Real) aValue = TDataStd_Real::Set(Label().FindChild(ChildLab_Value), theObject->GetValue());
122
123   Handle(TDataStd_Integer) aMatReqModif;
124   if(theObject->GetMaterialRequirementModifier() != XCAFDimTolObjects_GeomToleranceMatReqModif_None)
125     aMatReqModif = TDataStd_Integer::Set(Label().FindChild(ChildLab_MatReqModif), 
126                    theObject->GetMaterialRequirementModifier());
127
128   if(theObject->GetZoneModifier() != XCAFDimTolObjects_GeomToleranceZoneModif_None)
129     Handle(TDataStd_Integer) aZoneModif = TDataStd_Integer::Set(Label().FindChild(ChildLab_ZoneModif), 
130                                           theObject->GetZoneModifier());
131   
132   if(theObject->GetValueOfZoneModifier() > 0)
133     Handle(TDataStd_Real) aValueOfZoneModif = TDataStd_Real::Set(Label().FindChild(ChildLab_ValueOfZoneModif),
134                                               theObject->GetValueOfZoneModifier());
135
136   if(theObject->GetModifiers().Length() > 0)
137   {
138     Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
139     for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
140       anArr->SetValue(i,theObject->GetModifiers().Value(i));
141     Handle(TDataStd_IntegerArray) aModifiers = TDataStd_IntegerArray::Set(Label().FindChild(ChildLab_Modifiers), 
142                                                1, theObject->GetModifiers().Length());
143     if(!aModifiers.IsNull())
144       aModifiers->ChangeArray(anArr);
145   }
146
147   if(theObject->GetMaxValueModifier() > 0)
148     Handle(TDataStd_Real) aMaxValueModif = TDataStd_Real::Set(Label().FindChild(ChildLab_aMaxValueModif),
149                                            theObject->GetMaxValueModifier());
150
151   if (theObject->HasAxis())
152   {
153     gp_Ax2 anAx = theObject->GetAxis();
154     
155     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
156     for (Standard_Integer i = 1; i <= 3; i++)
157       aLocArr->SetValue(i, anAx.Location().Coord(i));
158     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisLoc), 1, 3);
159     if (!aLoc.IsNull())
160       aLoc->ChangeArray(aLocArr);
161     
162     Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
163     for (Standard_Integer i = 1; i <= 3; i++)
164       aNArr->SetValue(i, anAx.Direction().Coord(i));
165     Handle(TDataStd_RealArray) aN = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisN), 1, 3);
166     if (!aN.IsNull())
167       aN->ChangeArray(aNArr);
168     
169     Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
170     for (Standard_Integer i = 1; i <= 3; i++)
171       aRArr->SetValue(i, anAx.XDirection().Coord(i));
172     Handle(TDataStd_RealArray) aR = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisRef), 1, 3);
173     if (!aR.IsNull())
174       aR->ChangeArray(aRArr);
175   }
176
177   if (theObject->HasPlane())
178   {
179     gp_Ax2 anAx = theObject->GetPlane();
180     
181     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
182     for (Standard_Integer i = 1; i <= 3; i++)
183       aLocArr->SetValue(i, anAx.Location().Coord(i));
184     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneLoc), 1, 3);
185     if (!aLoc.IsNull())
186       aLoc->ChangeArray(aLocArr);
187     
188     Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
189     for (Standard_Integer i = 1; i <= 3; i++)
190       aNArr->SetValue(i, anAx.Direction().Coord(i));
191     Handle(TDataStd_RealArray) aN = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneN), 1, 3);
192     if (!aN.IsNull())
193       aN->ChangeArray(aNArr);
194     
195     Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
196     for (Standard_Integer i = 1; i <= 3; i++)
197       aRArr->SetValue(i, anAx.XDirection().Coord(i));
198     Handle(TDataStd_RealArray) aR = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneRef), 1, 3);
199     if (!aR.IsNull())
200       aR->ChangeArray(aRArr);
201   }
202
203   if (theObject->HasPoint())
204   {
205     gp_Pnt aPnt = theObject->GetPoint();
206     
207     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
208     for (Standard_Integer i = 1; i <= 3; i++)
209       aLocArr->SetValue(i, aPnt.Coord(i));
210     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Pnt), 1, 3);
211     if (!aLoc.IsNull())
212       aLoc->ChangeArray(aLocArr);
213   }
214
215   if (theObject->HasPointText())
216   {
217     gp_Pnt aPntText = theObject->GetPointTextAttach();
218     
219     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
220     for (Standard_Integer i = 1; i <= 3; i++)
221       aLocArr->SetValue(i, aPntText.Coord(i));
222     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PntText), 1, 3);
223     if (!aLoc.IsNull())
224       aLoc->ChangeArray(aLocArr);
225   }
226
227   TopoDS_Shape aPresentation = theObject->GetPresentation();
228   if( !aPresentation.IsNull())
229   {
230     TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
231     TNaming_Builder tnBuild(aLPres);
232     tnBuild.Generated(aPresentation);
233     Handle(TCollection_HAsciiString) aName =  theObject->GetPresentationName();
234     if( !aName.IsNull() )
235     {
236       TCollection_ExtendedString str ( aName->String() );
237       TDataStd_Name::Set ( aLPres, str );
238     }
239   }
240
241   if (theObject->HasAffectedPlane())
242   {
243     TDF_Label aLAffectedPlane = Label().FindChild(ChildLab_AffectedPlane);
244     TDataStd_Integer::Set(aLAffectedPlane, (Standard_Integer)theObject->GetAffectedPlaneType());
245     TDataXtd_Plane::Set(aLAffectedPlane, theObject->GetAffectedPlane());
246   }
247 }
248
249 //=======================================================================
250 //function :GetObject
251 //purpose  : 
252 //=======================================================================
253
254 Handle(XCAFDimTolObjects_GeomToleranceObject) XCAFDoc_GeomTolerance::GetObject()  const
255 {
256   Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = new XCAFDimTolObjects_GeomToleranceObject();
257
258   Handle(TDataStd_Name) aSemanticNameAttr;
259   Handle(TCollection_HAsciiString) aSemanticName;
260   if (Label().FindAttribute(TDataStd_Name::GetID(), aSemanticNameAttr))
261   {
262     const TCollection_ExtendedString& aName = aSemanticNameAttr->Get();
263     if (!aName.IsEmpty())
264       aSemanticName = new TCollection_HAsciiString(aName);
265   }
266   anObj->SetSemanticName(aSemanticName);
267
268   Handle(TDataStd_Integer) aType;
269   if(Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
270   {
271     anObj->SetType((XCAFDimTolObjects_GeomToleranceType)aType->Get());
272   }
273
274   Handle(TDataStd_Integer) aTypeOfValue;
275   if(Label().FindChild(ChildLab_TypeOfValue).FindAttribute(TDataStd_Integer::GetID(), aTypeOfValue))
276   {
277     anObj->SetTypeOfValue((XCAFDimTolObjects_GeomToleranceTypeValue)aTypeOfValue->Get());
278   }
279
280   Handle(TDataStd_Real) aValue;
281   if(Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_Real::GetID(), aValue))
282   {
283     anObj->SetValue(aValue->Get());
284   }
285
286   Handle(TDataStd_Integer) aMatReqModif;
287   if(Label().FindChild(ChildLab_MatReqModif).FindAttribute(TDataStd_Integer::GetID(), aMatReqModif))
288   {
289     anObj->SetMaterialRequirementModifier((XCAFDimTolObjects_GeomToleranceMatReqModif)aMatReqModif->Get());
290   }
291
292   Handle(TDataStd_Integer) aZoneModif;
293   if(Label().FindChild(ChildLab_ZoneModif).FindAttribute(TDataStd_Integer::GetID(), aZoneModif))
294   {
295     anObj->SetZoneModifier((XCAFDimTolObjects_GeomToleranceZoneModif)aZoneModif->Get());
296   }
297
298   Handle(TDataStd_Real) aValueOfZoneModif;
299   if(Label().FindChild(ChildLab_ValueOfZoneModif).FindAttribute(TDataStd_Real::GetID(), aValueOfZoneModif))
300   {
301     anObj->SetValueOfZoneModifier(aValueOfZoneModif->Get());
302   }
303
304   Handle(TDataStd_IntegerArray) anArr;
305   if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
306      && !anArr->Array().IsNull())
307   {
308     XCAFDimTolObjects_GeomToleranceModifiersSequence aModifiers;
309     for(Standard_Integer i = 1; i <= anArr->Length(); i++)
310       aModifiers.Append((XCAFDimTolObjects_GeomToleranceModif)anArr->Value(i));
311     anObj->SetModifiers(aModifiers);
312   }
313
314   Handle(TDataStd_Real) aMaxValueModif;
315   if(Label().FindChild(ChildLab_aMaxValueModif).FindAttribute(TDataStd_Real::GetID(), aMaxValueModif))
316   {
317     anObj->SetMaxValueModifier(aMaxValueModif->Get());
318   }
319   
320   Handle(TDataStd_RealArray) aLoc;
321   Handle(TDataStd_RealArray) aN;
322   Handle(TDataStd_RealArray) aR;
323   if (Label().FindChild(ChildLab_AxisLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
324       Label().FindChild(ChildLab_AxisN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
325       Label().FindChild(ChildLab_AxisRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3)
326   {
327     gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower() + 1), aLoc->Value(aLoc->Lower() + 2));
328     gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower() + 1), aN->Value(aN->Lower() + 2));
329     gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower() + 1), aR->Value(aR->Lower() + 2));
330     gp_Ax2 anAx(aL, aD, aDR);
331     anObj->SetAxis(anAx);
332   }
333
334   if (Label().FindChild(ChildLab_PlaneLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
335       Label().FindChild(ChildLab_PlaneN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
336       Label().FindChild(ChildLab_PlaneRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3)
337   {
338     gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower() + 1), aLoc->Value(aLoc->Lower() + 2));
339     gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower() + 1), aN->Value(aN->Lower() + 2));
340     gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower() + 1), aR->Value(aR->Lower() + 2));
341     gp_Ax2 anAx(aL, aD, aDR);
342     anObj->SetPlane(anAx);
343   }
344
345   Handle(TDataStd_RealArray) aPnt;
346   if (Label().FindChild(ChildLab_Pnt).FindAttribute(TDataStd_RealArray::GetID(), aPnt) && aPnt->Length() == 3)
347   {
348     gp_Pnt aP(aPnt->Value(aPnt->Lower()), aPnt->Value(aPnt->Lower() + 1), aPnt->Value(aPnt->Lower() + 2));
349     anObj->SetPoint(aP);
350   }
351
352   Handle(TDataStd_RealArray) aPntText;
353   if (Label().FindChild(ChildLab_PntText).FindAttribute(TDataStd_RealArray::GetID(), aPntText) && aPntText->Length() == 3)
354   {
355     gp_Pnt aP(aPntText->Value(aPntText->Lower()), aPntText->Value(aPntText->Lower() + 1), aPntText->Value(aPntText->Lower() + 2));
356     anObj->SetPointTextAttach(aP);
357   }
358
359   Handle(TNaming_NamedShape) aNS;
360   TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
361   if ( aLPres.FindAttribute(TNaming_NamedShape::GetID(), aNS) ) 
362   {
363
364     TopoDS_Shape aPresentation = TNaming_Tool::GetShape(aNS);
365     if( !aPresentation.IsNull())
366     {
367       Handle(TDataStd_Name) aNameAtrr;
368       Handle(TCollection_HAsciiString) aPresentName;
369       if (aLPres.FindAttribute(TDataStd_Name::GetID(),aNameAtrr))
370       {
371         const TCollection_ExtendedString& aName = aNameAtrr->Get();
372
373         if( !aName.IsEmpty())
374           aPresentName = new TCollection_HAsciiString(aName);
375       }
376
377       anObj->SetPresentation(aPresentation, aPresentName);
378     }
379   }
380
381   Handle(TDataXtd_Plane) anAffectedPlaneAttr;
382   if (Label().FindChild(ChildLab_AffectedPlane).FindAttribute(TDataXtd_Plane::GetID(), anAffectedPlaneAttr))
383   {
384     gp_Pln aPlane;
385     TDataXtd_Geometry::Plane(anAffectedPlaneAttr->Label(), aPlane);
386     Handle(TDataStd_Integer) aTypeAttr;
387     Label().FindChild(ChildLab_AffectedPlane).FindAttribute(TDataStd_Integer::GetID(), aTypeAttr);
388     anObj->SetAffectedPlane(aPlane, (XCAFDimTolObjects_ToleranceZoneAffectedPlane)aTypeAttr->Get());
389   }
390
391   return anObj;
392 }
393
394 //=======================================================================
395 //function : ID
396 //purpose  : 
397 //=======================================================================
398
399 const Standard_GUID& XCAFDoc_GeomTolerance::ID() const
400 {
401   return GetID();
402 }
403
404 //=======================================================================
405 //function : Restore
406 //purpose  : 
407 //=======================================================================
408
409 void XCAFDoc_GeomTolerance::Restore(const Handle(TDF_Attribute)& /*With*/) 
410 {
411 }
412
413
414 //=======================================================================
415 //function : NewEmpty
416 //purpose  : 
417 //=======================================================================
418
419 Handle(TDF_Attribute) XCAFDoc_GeomTolerance::NewEmpty() const
420 {
421   return new XCAFDoc_GeomTolerance();
422 }
423
424
425 //=======================================================================
426 //function : Paste
427 //purpose  : 
428 //=======================================================================
429
430 void XCAFDoc_GeomTolerance::Paste(const Handle(TDF_Attribute)& /*Into*/,
431                            const Handle(TDF_RelocationTable)& /*RT*/) const
432 {
433 }
434
435 //=======================================================================
436 //function : DumpJson
437 //purpose  : 
438 //=======================================================================
439 void XCAFDoc_GeomTolerance::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
440 {
441   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
442
443   OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDF_Attribute)
444 }