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