0026827: Position and orientation for GD&T frames
[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 <XCAFDimTolObjects_GeomToleranceObject.hxx>
25 #include <TNaming_Tool.hxx>
26 #include <TNaming_Builder.hxx>
27 #include <TCollection_ExtendedString.hxx>
28 #include <TDataStd_Name.hxx>
29
30 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_GeomTolerance,TDF_Attribute)
31
32 enum ChildLab
33 {
34   ChildLab_Type = 1,
35   ChildLab_TypeOfValue,
36   ChildLab_Value,
37   ChildLab_MatReqModif,
38   ChildLab_ZoneModif,
39   ChildLab_ValueOfZoneModif,
40   ChildLab_Modifiers,
41   ChildLab_aMaxValueModif,
42   ChildLab_AxisLoc,
43   ChildLab_AxisN,
44   ChildLab_AxisRef,
45   ChildLab_PlaneLoc,
46   ChildLab_PlaneN,
47   ChildLab_PlaneRef,
48   ChildLab_Pnt,
49   ChildLab_PntText,
50   ChildLab_Presentation
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 = new TDataStd_Integer();
108   aType->Set(theObject->GetType());
109   Label().FindChild(ChildLab_Type).AddAttribute(aType);
110
111   if(theObject->GetTypeOfValue() != XCAFDimTolObjects_GeomToleranceTypeValue_None)
112   {
113     Handle(TDataStd_Integer) aTypeOfValue = new TDataStd_Integer();
114     aTypeOfValue->Set(theObject->GetTypeOfValue());
115     Label().FindChild(ChildLab_TypeOfValue).AddAttribute(aTypeOfValue);
116   }
117
118   Handle(TDataStd_Real) aValue = new TDataStd_Real();
119   aValue->Set(theObject->GetValue());
120   Label().FindChild(ChildLab_Value).AddAttribute(aValue);
121
122   Handle(TDataStd_Integer) aMatReqModif;
123   if(theObject->GetMaterialRequirementModifier() != XCAFDimTolObjects_GeomToleranceMatReqModif_None)
124   {
125     Label().FindChild(ChildLab_MatReqModif).FindAttribute(TDataStd_Integer::GetID(), aMatReqModif);
126     aMatReqModif = new TDataStd_Integer();
127     Label().FindChild(ChildLab_MatReqModif).AddAttribute(aMatReqModif);
128     aMatReqModif->Set(theObject->GetMaterialRequirementModifier());
129   }
130
131   if(theObject->GetZoneModifier() != XCAFDimTolObjects_GeomToleranceZoneModif_None)
132   {
133     Handle(TDataStd_Integer) aZoneModif = new TDataStd_Integer();
134     aZoneModif->Set(theObject->GetZoneModifier());
135     Label().FindChild(ChildLab_ZoneModif).AddAttribute(aZoneModif);
136   }
137   
138   if(theObject->GetValueOfZoneModifier() > 0)
139   {
140     Handle(TDataStd_Real) aValueOfZoneModif = new TDataStd_Real();
141     aValueOfZoneModif->Set(theObject->GetValueOfZoneModifier());
142     Label().FindChild(ChildLab_ValueOfZoneModif).AddAttribute(aValueOfZoneModif);
143   }
144
145   if(theObject->GetModifiers().Length() > 0)
146   {
147     Handle(TDataStd_IntegerArray) aModifiers = new TDataStd_IntegerArray();
148     Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
149     for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
150       anArr->SetValue(i,theObject->GetModifiers().Value(i));
151     aModifiers->ChangeArray(anArr);
152     Label().FindChild(ChildLab_Modifiers).AddAttribute(aModifiers);
153   }
154
155   if(theObject->GetMaxValueModifier() > 0)
156   {
157     Handle(TDataStd_Real) aMaxValueModif = new TDataStd_Real();
158     aMaxValueModif->Set(theObject->GetMaxValueModifier());
159     Label().FindChild(ChildLab_aMaxValueModif).AddAttribute(aMaxValueModif);
160   }
161
162   if(theObject->HasAxis())
163   {
164     Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
165     Handle(TDataStd_RealArray) aN = new TDataStd_RealArray();
166     Handle(TDataStd_RealArray) aR = new TDataStd_RealArray();
167     gp_Ax2 anAx = theObject->GetAxis();
168
169     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
170     for (Standard_Integer i = 1; i <= 3; i++)
171       aLocArr->SetValue(i, anAx.Location().Coord(i));
172     aLoc->ChangeArray(aLocArr);
173
174     Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
175     for (Standard_Integer i = 1; i <= 3; i++)
176       aNArr->SetValue(i, anAx.Direction().Coord(i));
177     aN->ChangeArray(aNArr);
178
179     Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
180     for (Standard_Integer i = 1; i <= 3; i++)
181       aRArr->SetValue(i, anAx.XDirection().Coord(i));
182     aR->ChangeArray(aRArr);
183
184     Label().FindChild(ChildLab_AxisLoc).AddAttribute(aLoc);
185     Label().FindChild(ChildLab_AxisN).AddAttribute(aN);
186     Label().FindChild(ChildLab_AxisRef).AddAttribute(aR);
187   }
188
189   if (theObject->HasPlane())
190   {
191     Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
192     Handle(TDataStd_RealArray) aN = new TDataStd_RealArray();
193     Handle(TDataStd_RealArray) aR = new TDataStd_RealArray();
194     gp_Ax2 anAx = theObject->GetPlane();
195
196     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
197     for (Standard_Integer i = 1; i <= 3; i++)
198       aLocArr->SetValue(i, anAx.Location().Coord(i));
199     aLoc->ChangeArray(aLocArr);
200
201     Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
202     for (Standard_Integer i = 1; i <= 3; i++)
203       aNArr->SetValue(i, anAx.Direction().Coord(i));
204     aN->ChangeArray(aNArr);
205
206     Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
207     for (Standard_Integer i = 1; i <= 3; i++)
208       aRArr->SetValue(i, anAx.XDirection().Coord(i));
209     aR->ChangeArray(aRArr);
210
211     Label().FindChild(ChildLab_PlaneLoc).AddAttribute(aLoc);
212     Label().FindChild(ChildLab_PlaneN).AddAttribute(aN);
213     Label().FindChild(ChildLab_PlaneRef).AddAttribute(aR);
214   }
215
216   if (theObject->HasPoint())
217   {
218     Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
219     gp_Pnt aPnt = theObject->GetPoint();
220
221     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
222     for (Standard_Integer i = 1; i <= 3; i++)
223       aLocArr->SetValue(i, aPnt.Coord(i));
224     aLoc->ChangeArray(aLocArr);
225
226     Label().FindChild(ChildLab_Pnt).AddAttribute(aLoc);
227   }
228
229   if (theObject->HasPointText())
230   {
231     Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
232     gp_Pnt aPntText = theObject->GetPointTextAttach();
233
234     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
235     for (Standard_Integer i = 1; i <= 3; i++)
236       aLocArr->SetValue(i, aPntText.Coord(i));
237     aLoc->ChangeArray(aLocArr);
238
239     Label().FindChild(ChildLab_PntText).AddAttribute(aLoc);
240   }
241
242   TopoDS_Shape aPresentation = theObject->GetPresentation();
243   if( !aPresentation.IsNull())
244   {
245     TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
246     TNaming_Builder tnBuild(aLPres);
247     tnBuild.Generated(aPresentation);
248     Handle(TCollection_HAsciiString) aName =  theObject->GetPresentationName();
249     if( !aName.IsNull() )
250     {
251       TCollection_ExtendedString str ( aName->String() );
252       TDataStd_Name::Set ( aLPres, str );
253     }
254   }
255  
256 }
257
258 //=======================================================================
259 //function :GetObject
260 //purpose  : 
261 //=======================================================================
262
263 Handle(XCAFDimTolObjects_GeomToleranceObject) XCAFDoc_GeomTolerance::GetObject()  const
264 {
265   Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = new XCAFDimTolObjects_GeomToleranceObject();
266
267   Handle(TDataStd_Integer) aType;
268   if(Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
269   {
270     anObj->SetType((XCAFDimTolObjects_GeomToleranceType)aType->Get());
271   }
272
273   Handle(TDataStd_Integer) aTypeOfValue;
274   if(Label().FindChild(ChildLab_TypeOfValue).FindAttribute(TDataStd_Integer::GetID(), aTypeOfValue))
275   {
276     anObj->SetTypeOfValue((XCAFDimTolObjects_GeomToleranceTypeValue)aTypeOfValue->Get());
277   }
278
279   Handle(TDataStd_Real) aValue;
280   if(Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_Real::GetID(), aValue))
281   {
282     anObj->SetValue(aValue->Get());
283   }
284
285   Handle(TDataStd_Integer) aMatReqModif;
286   if(Label().FindChild(ChildLab_MatReqModif).FindAttribute(TDataStd_Integer::GetID(), aMatReqModif))
287   {
288     anObj->SetMaterialRequirementModifier((XCAFDimTolObjects_GeomToleranceMatReqModif)aMatReqModif->Get());
289   }
290
291   Handle(TDataStd_Integer) aZoneModif;
292   if(Label().FindChild(ChildLab_ZoneModif).FindAttribute(TDataStd_Integer::GetID(), aZoneModif))
293   {
294     anObj->SetZoneModifier((XCAFDimTolObjects_GeomToleranceZoneModif)aZoneModif->Get());
295   }
296
297   Handle(TDataStd_Real) aValueOfZoneModif;
298   if(Label().FindChild(ChildLab_ValueOfZoneModif).FindAttribute(TDataStd_Real::GetID(), aValueOfZoneModif))
299   {
300     anObj->SetValueOfZoneModifier(aValueOfZoneModif->Get());
301   }
302
303   Handle(TDataStd_IntegerArray) anArr;
304   if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
305      && !anArr->Array().IsNull())
306   {
307     XCAFDimTolObjects_GeomToleranceModifiersSequence aModifiers;
308     for(Standard_Integer i = 1; i <= anArr->Length(); i++)
309       aModifiers.Append((XCAFDimTolObjects_GeomToleranceModif)anArr->Value(i));
310     anObj->SetModifiers(aModifiers);
311   }
312
313   Handle(TDataStd_Real) aMaxValueModif;
314   if(Label().FindChild(ChildLab_aMaxValueModif).FindAttribute(TDataStd_Real::GetID(), aMaxValueModif))
315   {
316     anObj->SetMaxValueModifier(aMaxValueModif->Get());
317   }
318   
319   Handle(TDataStd_RealArray) aLoc;
320   Handle(TDataStd_RealArray) aN;
321   Handle(TDataStd_RealArray) aR;
322   if(Label().FindChild(ChildLab_AxisLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
323     Label().FindChild(ChildLab_AxisN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
324     Label().FindChild(ChildLab_AxisRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
325   {
326     gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
327     gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
328     gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
329     gp_Ax2 anAx(aL, aD, aDR);
330     anObj->SetAxis(anAx);
331   }
332
333   if(Label().FindChild(ChildLab_PlaneLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
334     Label().FindChild(ChildLab_PlaneN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
335     Label().FindChild(ChildLab_PlaneRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
336   {
337     gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
338     gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
339     gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
340     gp_Ax2 anAx(aL, aD, aDR);
341     anObj->SetPlane(anAx);
342   }
343
344   Handle(TDataStd_RealArray) aPnt;
345   if(Label().FindChild(ChildLab_PlaneLoc).FindAttribute(TDataStd_RealArray::GetID(), aPnt) && aPnt->Length() == 3 )
346   {
347     gp_Pnt aP(aLoc->Value(aPnt->Lower()), aPnt->Value(aPnt->Lower()+1), aPnt->Value(aPnt->Lower()+2));
348     anObj->SetPoint(aP);
349   }
350
351   Handle(TDataStd_RealArray) aPntText;
352   if(Label().FindChild(ChildLab_PntText).FindAttribute(TDataStd_RealArray::GetID(), aPntText) && aPntText->Length() == 3 )
353   {
354     gp_Pnt aP(aPntText->Value(aPntText->Lower()), aPntText->Value(aPntText->Lower()+1), aPntText->Value(aPntText->Lower()+2));
355     anObj->SetPointTextAttach(aP);
356   }
357
358   Handle(TNaming_NamedShape) aNS;
359   TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
360   if ( aLPres.FindAttribute(TNaming_NamedShape::GetID(), aNS) ) 
361   {
362
363     TopoDS_Shape aPresentation = TNaming_Tool::GetShape(aNS);
364     if( !aPresentation.IsNull())
365     {
366       Handle(TDataStd_Name) aNameAtrr;
367       Handle(TCollection_HAsciiString) aPresentName;
368       if (aLPres.FindAttribute(TDataStd_Name::GetID(),aNameAtrr))
369       {
370         const TCollection_ExtendedString& aName = aNameAtrr->Get();
371
372         if( !aName.IsEmpty())
373           aPresentName = new TCollection_HAsciiString(aName);
374       }
375
376       anObj->SetPresentation(aPresentation, aPresentName);
377     }
378   }
379
380   return anObj;
381 }
382
383 //=======================================================================
384 //function : ID
385 //purpose  : 
386 //=======================================================================
387
388 const Standard_GUID& XCAFDoc_GeomTolerance::ID() const
389 {
390   return GetID();
391 }
392
393 //=======================================================================
394 //function : Restore
395 //purpose  : 
396 //=======================================================================
397
398 void XCAFDoc_GeomTolerance::Restore(const Handle(TDF_Attribute)& /*With*/) 
399 {
400 }
401
402
403 //=======================================================================
404 //function : NewEmpty
405 //purpose  : 
406 //=======================================================================
407
408 Handle(TDF_Attribute) XCAFDoc_GeomTolerance::NewEmpty() const
409 {
410   return new XCAFDoc_GeomTolerance();
411 }
412
413
414 //=======================================================================
415 //function : Paste
416 //purpose  : 
417 //=======================================================================
418
419 void XCAFDoc_GeomTolerance::Paste(const Handle(TDF_Attribute)& /*Into*/,
420                            const Handle(TDF_RelocationTable)& /*RT*/) const
421 {
422 }