0caa73ba0903467c766d3d84f3fe6fc33fb5c42d
[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 = 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     gp_Ax2 anAx = theObject->GetAxis();
146
147     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
148     for (Standard_Integer i = 1; i <= 3; i++)
149       aLocArr->SetValue(i, anAx.Location().Coord(i));
150     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisLoc), 1, 3);
151     if(!aLoc.IsNull())
152       aLoc->ChangeArray(aLocArr);
153
154     Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
155     for (Standard_Integer i = 1; i <= 3; i++)
156       aNArr->SetValue(i, anAx.Direction().Coord(i));
157     Handle(TDataStd_RealArray) aN = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisN), 1, 3);
158     if(!aN.IsNull())
159       aN->ChangeArray(aNArr);
160
161     Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
162     for (Standard_Integer i = 1; i <= 3; i++)
163       aRArr->SetValue(i, anAx.XDirection().Coord(i));
164     Handle(TDataStd_RealArray) aR = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisRef), 1, 3);
165     if(!aR.IsNull())
166       aR->ChangeArray(aRArr);
167   }
168
169   if (theObject->HasPlane())
170   {
171     gp_Ax2 anAx = theObject->GetPlane();
172
173     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
174     for (Standard_Integer i = 1; i <= 3; i++)
175       aLocArr->SetValue(i, anAx.Location().Coord(i));
176     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneLoc), 1, 3);
177     if(!aLoc.IsNull())
178       aLoc->ChangeArray(aLocArr);
179
180     Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
181     for (Standard_Integer i = 1; i <= 3; i++)
182       aNArr->SetValue(i, anAx.Direction().Coord(i));
183     Handle(TDataStd_RealArray) aN = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneN), 1, 3);
184     if(!aN.IsNull())
185       aN->ChangeArray(aNArr);
186
187     Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
188     for (Standard_Integer i = 1; i <= 3; i++)
189       aRArr->SetValue(i, anAx.XDirection().Coord(i));
190     Handle(TDataStd_RealArray) aR = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneRef), 1, 3);
191     if(!aR.IsNull())
192       aR->ChangeArray(aRArr);
193   }
194
195   if (theObject->HasPoint())
196   {
197     gp_Pnt aPnt = theObject->GetPoint();
198
199     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
200     for (Standard_Integer i = 1; i <= 3; i++)
201       aLocArr->SetValue(i, aPnt.Coord(i));
202     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Pnt), 1, 3);
203     if(!aLoc.IsNull())
204       aLoc->ChangeArray(aLocArr);
205   }
206
207   if (theObject->HasPointText())
208   {
209     gp_Pnt aPntText = theObject->GetPointTextAttach();
210
211     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
212     for (Standard_Integer i = 1; i <= 3; i++)
213       aLocArr->SetValue(i, aPntText.Coord(i));
214     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PntText), 1, 3);
215     if(!aLoc.IsNull())
216       aLoc->ChangeArray(aLocArr);
217   }
218
219   TopoDS_Shape aPresentation = theObject->GetPresentation();
220   if( !aPresentation.IsNull())
221   {
222     TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
223     TNaming_Builder tnBuild(aLPres);
224     tnBuild.Generated(aPresentation);
225     Handle(TCollection_HAsciiString) aName =  theObject->GetPresentationName();
226     if( !aName.IsNull() )
227     {
228       TCollection_ExtendedString str ( aName->String() );
229       TDataStd_Name::Set ( aLPres, str );
230     }
231   }
232  
233 }
234
235 //=======================================================================
236 //function :GetObject
237 //purpose  : 
238 //=======================================================================
239
240 Handle(XCAFDimTolObjects_GeomToleranceObject) XCAFDoc_GeomTolerance::GetObject()  const
241 {
242   Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = new XCAFDimTolObjects_GeomToleranceObject();
243
244   Handle(TDataStd_Integer) aType;
245   if(Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
246   {
247     anObj->SetType((XCAFDimTolObjects_GeomToleranceType)aType->Get());
248   }
249
250   Handle(TDataStd_Integer) aTypeOfValue;
251   if(Label().FindChild(ChildLab_TypeOfValue).FindAttribute(TDataStd_Integer::GetID(), aTypeOfValue))
252   {
253     anObj->SetTypeOfValue((XCAFDimTolObjects_GeomToleranceTypeValue)aTypeOfValue->Get());
254   }
255
256   Handle(TDataStd_Real) aValue;
257   if(Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_Real::GetID(), aValue))
258   {
259     anObj->SetValue(aValue->Get());
260   }
261
262   Handle(TDataStd_Integer) aMatReqModif;
263   if(Label().FindChild(ChildLab_MatReqModif).FindAttribute(TDataStd_Integer::GetID(), aMatReqModif))
264   {
265     anObj->SetMaterialRequirementModifier((XCAFDimTolObjects_GeomToleranceMatReqModif)aMatReqModif->Get());
266   }
267
268   Handle(TDataStd_Integer) aZoneModif;
269   if(Label().FindChild(ChildLab_ZoneModif).FindAttribute(TDataStd_Integer::GetID(), aZoneModif))
270   {
271     anObj->SetZoneModifier((XCAFDimTolObjects_GeomToleranceZoneModif)aZoneModif->Get());
272   }
273
274   Handle(TDataStd_Real) aValueOfZoneModif;
275   if(Label().FindChild(ChildLab_ValueOfZoneModif).FindAttribute(TDataStd_Real::GetID(), aValueOfZoneModif))
276   {
277     anObj->SetValueOfZoneModifier(aValueOfZoneModif->Get());
278   }
279
280   Handle(TDataStd_IntegerArray) anArr;
281   if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
282      && !anArr->Array().IsNull())
283   {
284     XCAFDimTolObjects_GeomToleranceModifiersSequence aModifiers;
285     for(Standard_Integer i = 1; i <= anArr->Length(); i++)
286       aModifiers.Append((XCAFDimTolObjects_GeomToleranceModif)anArr->Value(i));
287     anObj->SetModifiers(aModifiers);
288   }
289
290   Handle(TDataStd_Real) aMaxValueModif;
291   if(Label().FindChild(ChildLab_aMaxValueModif).FindAttribute(TDataStd_Real::GetID(), aMaxValueModif))
292   {
293     anObj->SetMaxValueModifier(aMaxValueModif->Get());
294   }
295   
296   Handle(TDataStd_RealArray) aLoc;
297   Handle(TDataStd_RealArray) aN;
298   Handle(TDataStd_RealArray) aR;
299   if(Label().FindChild(ChildLab_AxisLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
300     Label().FindChild(ChildLab_AxisN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
301     Label().FindChild(ChildLab_AxisRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
302   {
303     gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
304     gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
305     gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
306     gp_Ax2 anAx(aL, aD, aDR);
307     anObj->SetAxis(anAx);
308   }
309
310   if(Label().FindChild(ChildLab_PlaneLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
311     Label().FindChild(ChildLab_PlaneN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
312     Label().FindChild(ChildLab_PlaneRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
313   {
314     gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
315     gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
316     gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
317     gp_Ax2 anAx(aL, aD, aDR);
318     anObj->SetPlane(anAx);
319   }
320
321   Handle(TDataStd_RealArray) aPnt;
322   if(Label().FindChild(ChildLab_Pnt).FindAttribute(TDataStd_RealArray::GetID(), aPnt) && aPnt->Length() == 3 )
323   {
324     gp_Pnt aP(aLoc->Value(aPnt->Lower()), aPnt->Value(aPnt->Lower()+1), aPnt->Value(aPnt->Lower()+2));
325     anObj->SetPoint(aP);
326   }
327
328   Handle(TDataStd_RealArray) aPntText;
329   if(Label().FindChild(ChildLab_PntText).FindAttribute(TDataStd_RealArray::GetID(), aPntText) && aPntText->Length() == 3 )
330   {
331     gp_Pnt aP(aPntText->Value(aPntText->Lower()), aPntText->Value(aPntText->Lower()+1), aPntText->Value(aPntText->Lower()+2));
332     anObj->SetPointTextAttach(aP);
333   }
334
335   Handle(TNaming_NamedShape) aNS;
336   TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
337   if ( aLPres.FindAttribute(TNaming_NamedShape::GetID(), aNS) ) 
338   {
339
340     TopoDS_Shape aPresentation = TNaming_Tool::GetShape(aNS);
341     if( !aPresentation.IsNull())
342     {
343       Handle(TDataStd_Name) aNameAtrr;
344       Handle(TCollection_HAsciiString) aPresentName;
345       if (aLPres.FindAttribute(TDataStd_Name::GetID(),aNameAtrr))
346       {
347         const TCollection_ExtendedString& aName = aNameAtrr->Get();
348
349         if( !aName.IsEmpty())
350           aPresentName = new TCollection_HAsciiString(aName);
351       }
352
353       anObj->SetPresentation(aPresentation, aPresentName);
354     }
355   }
356
357   return anObj;
358 }
359
360 //=======================================================================
361 //function : ID
362 //purpose  : 
363 //=======================================================================
364
365 const Standard_GUID& XCAFDoc_GeomTolerance::ID() const
366 {
367   return GetID();
368 }
369
370 //=======================================================================
371 //function : Restore
372 //purpose  : 
373 //=======================================================================
374
375 void XCAFDoc_GeomTolerance::Restore(const Handle(TDF_Attribute)& /*With*/) 
376 {
377 }
378
379
380 //=======================================================================
381 //function : NewEmpty
382 //purpose  : 
383 //=======================================================================
384
385 Handle(TDF_Attribute) XCAFDoc_GeomTolerance::NewEmpty() const
386 {
387   return new XCAFDoc_GeomTolerance();
388 }
389
390
391 //=======================================================================
392 //function : Paste
393 //purpose  : 
394 //=======================================================================
395
396 void XCAFDoc_GeomTolerance::Paste(const Handle(TDF_Attribute)& /*Into*/,
397                            const Handle(TDF_RelocationTable)& /*RT*/) const
398 {
399 }