0029338: Data Exchange - Add Planes for Tolerance zones in Geometric tolerances
[occt.git] / src / XCAFDoc / XCAFDoc_Datum.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
15 #include <gp_Pln.hxx>
16 #include <Standard_GUID.hxx>
17 #include <Standard_Type.hxx>
18 #include <TCollection_HAsciiString.hxx>
19 #include <TDF_Attribute.hxx>
20 #include <TDF_Label.hxx>
21 #include <TDF_ChildIterator.hxx>
22 #include <TDF_RelocationTable.hxx>
23 #include <XCAFDoc_Datum.hxx>
24 #include <TDataStd_AsciiString.hxx>
25 #include <TDataStd_IntegerArray.hxx>
26 #include <TDataStd_RealArray.hxx>
27 #include <TDataStd_Integer.hxx>
28 #include <TDataStd_Real.hxx>
29 #include <TDataXtd_Geometry.hxx>
30 #include <TDataXtd_Plane.hxx>
31 #include <TDataXtd_Point.hxx>
32 #include <TNaming_NamedShape.hxx>
33 #include <TNaming_Builder.hxx>
34 #include <TNaming_Tool.hxx>
35 #include <TDataStd_Name.hxx>
36
37 #include <XCAFDimTolObjects_DatumObject.hxx>
38
39 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_Datum,TDF_Attribute)
40
41 enum ChildLab
42 {
43   ChildLab_Name = 1,
44   ChildLab_Position,
45   ChildLab_Modifiers,
46   ChildLab_ModifierWithValue,
47   ChildLab_IsDTarget,
48   ChildLab_DTargetType,
49   ChildLab_Axis,
50   ChildLab_DTargetLength,
51   ChildLab_DTargetWidth,
52   ChildLab_DTargetNumber,
53   ChildLab_DatumTarget,
54   ChildLab_Plane,
55   ChildLab_Pnt,
56   ChildLab_PntText,
57   ChildLab_Presentation
58 };
59
60 //=======================================================================
61 //function : XCAFDoc_Datum
62 //purpose  : 
63 //=======================================================================
64 XCAFDoc_Datum::XCAFDoc_Datum()
65 {
66 }
67
68
69 //=======================================================================
70 //function : GetID
71 //purpose  : 
72 //=======================================================================
73
74 const Standard_GUID& XCAFDoc_Datum::GetID() 
75 {
76   static Standard_GUID DID("58ed092e-44de-11d8-8776-001083004c77");
77   //static Standard_GUID ID("efd212e2-6dfd-11d4-b9c8-0060b0ee281b");
78   return DID;
79   //return ID;
80 }
81
82
83 //=======================================================================
84 //function : Set
85 //purpose  : 
86 //=======================================================================
87
88 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel,
89                                          const Handle(TCollection_HAsciiString)& theName,
90                                          const Handle(TCollection_HAsciiString)& theDescription,
91                                          const Handle(TCollection_HAsciiString)& theIdentification) 
92 {
93   Handle(XCAFDoc_Datum) aDatum;
94   if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
95     aDatum = new XCAFDoc_Datum();
96     theLabel.AddAttribute(aDatum);
97   }
98   aDatum->Set(theName,theDescription,theIdentification); 
99   return aDatum;
100 }
101
102 //=======================================================================
103 //function : Set
104 //purpose  : 
105 //=======================================================================
106
107 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel) 
108 {
109   Handle(XCAFDoc_Datum) aDatum;
110   if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
111     aDatum = new XCAFDoc_Datum();
112     theLabel.AddAttribute(aDatum);
113   }
114   return aDatum;
115 }
116
117
118 //=======================================================================
119 //function : Set
120 //purpose  : 
121 //=======================================================================
122
123 void XCAFDoc_Datum::Set(const Handle(TCollection_HAsciiString)& theName,
124                         const Handle(TCollection_HAsciiString)& theDescription,
125                         const Handle(TCollection_HAsciiString)& theIdentification) 
126 {
127   Backup();
128   myName = theName;
129   myDescription = theDescription;
130   myIdentification = theIdentification;
131 }
132
133
134 //=======================================================================
135 //function : GetName
136 //purpose  : 
137 //=======================================================================
138
139 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetName() const
140 {
141   if(myName.IsNull())
142     return new TCollection_HAsciiString();
143   return myName;
144 }
145
146 //=======================================================================
147 //function : GetDescriptio7n
148 //purpose  : 
149 //=======================================================================
150
151 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetDescription() const
152 {
153   return myDescription;
154 }
155
156
157 //=======================================================================
158 //function : GetIdentification
159 //purpose  : 
160 //=======================================================================
161
162 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetIdentification() const
163 {
164   return myIdentification;
165 }
166
167 //=======================================================================
168 //function : SetObject
169 //purpose  : 
170 //=======================================================================
171
172 void XCAFDoc_Datum::SetObject(const Handle(XCAFDimTolObjects_DatumObject)& theObject)
173 {
174   Backup();
175   TDF_ChildIterator anIter(Label());
176   for(;anIter.More(); anIter.Next())
177   {
178     anIter.Value().ForgetAllAttributes();
179   }
180   if (!theObject->GetName().IsNull() && !theObject->GetName()->IsEmpty())
181     Handle(TDataStd_AsciiString) anAttName = TDataStd_AsciiString::Set(Label().FindChild(ChildLab_Name),
182                                              theObject->GetName()->String());
183
184   Handle(TDataStd_Integer) aPosition = TDataStd_Integer::Set(Label().FindChild(ChildLab_Position),
185                                        theObject->GetPosition());
186
187   if(theObject->GetModifiers().Length() > 0)
188   {   
189     Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
190     for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
191       anArr->SetValue(i,theObject->GetModifiers().Value(i));
192     Handle(TDataStd_IntegerArray) aModifiers = TDataStd_IntegerArray::Set(Label().FindChild(ChildLab_Modifiers), 
193                                                1, theObject->GetModifiers().Length());
194     if(!aModifiers.IsNull())
195       aModifiers->ChangeArray(anArr);
196   }
197
198   XCAFDimTolObjects_DatumModifWithValue aM;
199   Standard_Real aV;
200   theObject->GetModifierWithValue(aM, aV);
201   if(aM != XCAFDimTolObjects_DatumModifWithValue_None)
202   {
203     Handle(TDataStd_Integer) aModifierWithValueM = 
204       TDataStd_Integer::Set(Label().FindChild(ChildLab_ModifierWithValue), aM);
205
206     Handle(TDataStd_Real) aModifierWithValueV = 
207       TDataStd_Real::Set(Label().FindChild(ChildLab_ModifierWithValue), aV);
208   }
209
210   Handle(TDataStd_Integer) aIsTarget = TDataStd_Integer::Set(Label().FindChild(ChildLab_IsDTarget), 
211                                        theObject->IsDatumTarget());
212
213   if(theObject->IsDatumTarget())
214   {
215     Handle(TDataStd_Integer) aType = TDataStd_Integer::Set(Label().FindChild(ChildLab_DTargetType), 
216                                      theObject->GetDatumTargetType());
217
218     if(theObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area)
219     {
220       if(!theObject->GetDatumTarget().IsNull())
221       {
222         TNaming_Builder tnBuild(Label().FindChild(ChildLab_DatumTarget));
223         tnBuild.Generated(theObject->GetDatumTarget());
224       }
225     }
226     else if (theObject->HasDatumTargetParams())
227     {
228       gp_Ax2 anAx = theObject->GetDatumTargetAxis();
229       TDataXtd_Plane::Set(Label().FindChild(ChildLab_Axis), gp_Pln(gp_Ax3(anAx)));
230
231       if(theObject->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
232       {
233         Handle(TDataStd_Real) aLen = TDataStd_Real::Set(Label().FindChild(ChildLab_DTargetLength),
234                                      theObject->GetDatumTargetLength());
235         if(theObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
236           Handle(TDataStd_Real) aWidth = TDataStd_Real::Set(Label().FindChild(ChildLab_DTargetWidth),
237                                          theObject->GetDatumTargetWidth());
238       }
239     }
240     Handle(TDataStd_Integer) aNum = TDataStd_Integer::Set(Label().FindChild(ChildLab_DTargetNumber), 
241                                     theObject->GetDatumTargetNumber());
242   }
243
244   if (theObject->HasPlane())
245   {
246     TDataXtd_Plane::Set(Label().FindChild(ChildLab_Plane), gp_Pln(gp_Ax3(theObject->GetPlane())));
247   }
248
249   if (theObject->HasPoint())
250   {
251     TDataXtd_Point::Set(Label().FindChild(ChildLab_Pnt), theObject->GetPoint());
252   }
253
254   if (theObject->HasPointText())
255   {
256     TDataXtd_Point::Set(Label().FindChild(ChildLab_PntText), theObject->GetPointTextAttach());
257   }
258
259   TopoDS_Shape aPresentation = theObject->GetPresentation();
260   if( !aPresentation.IsNull())
261   {
262     TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
263     TNaming_Builder tnBuild(aLPres);
264     tnBuild.Generated(aPresentation);
265     Handle(TCollection_HAsciiString) aName =  theObject->GetPresentationName();
266     if( !aName.IsNull() )
267     {
268       TCollection_ExtendedString str ( aName->String() );
269       TDataStd_Name::Set ( aLPres, str );
270     }
271   }
272  
273 }
274
275 //=======================================================================
276 //function : GetObject
277 //purpose  : 
278 //=======================================================================
279
280 Handle(XCAFDimTolObjects_DatumObject) XCAFDoc_Datum::GetObject() const
281 {
282   Handle(XCAFDimTolObjects_DatumObject) anObj = new XCAFDimTolObjects_DatumObject();
283
284   Handle(TDataStd_AsciiString) anAttName;
285   if(Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
286   {
287     Handle(TCollection_HAsciiString) aStr = new TCollection_HAsciiString(anAttName->Get());
288     anObj->SetName(aStr);
289   }
290
291   Handle(TDataStd_IntegerArray) anArr;
292   if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
293      && !anArr->Array().IsNull())
294   {
295     XCAFDimTolObjects_DatumModifiersSequence aModifiers;
296     for(Standard_Integer i = 1; i <= anArr->Length(); i++)
297       aModifiers.Append((XCAFDimTolObjects_DatumSingleModif)anArr->Value(i));
298     anObj->SetModifiers(aModifiers);
299   }
300
301   Handle(TDataStd_Integer) aModifierWithValueM;
302   if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
303   {
304     Handle(TDataStd_Real) aModifierWithValueV;
305     if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
306     {
307       anObj->SetModifierWithValue((XCAFDimTolObjects_DatumModifWithValue)aModifierWithValueM->Get(),aModifierWithValueV->Get());
308     }
309   }
310
311   Handle(TDataStd_Integer) aPosition;
312   if(Label().FindChild(ChildLab_Position).FindAttribute(TDataStd_Integer::GetID(), aPosition))
313   {
314     anObj->SetPosition(aPosition->Get());
315   }
316
317   Handle(TDataXtd_Plane) aPlaneAttr;
318   if (Label().FindChild(ChildLab_Plane).FindAttribute(TDataXtd_Plane::GetID(), aPlaneAttr))
319   {
320     gp_Pln aPlane;
321     TDataXtd_Geometry::Plane(aPlaneAttr->Label(), aPlane);
322     gp_Ax2 anAx(aPlane.Location(), aPlane.Axis().Direction(), aPlane.XAxis().Direction());
323     anObj->SetPlane(anAx);
324   }
325
326   Handle(TDataXtd_Point) aPntAttr;
327   if (Label().FindChild(ChildLab_Pnt).FindAttribute(TDataXtd_Point::GetID(), aPntAttr))
328   {
329     gp_Pnt aPoint;
330     TDataXtd_Geometry::Point(aPntAttr->Label(), aPoint);
331     anObj->SetPoint(aPoint);
332   }
333
334   Handle(TDataXtd_Point) aPntTextAttr;
335   if (Label().FindChild(ChildLab_PntText).FindAttribute(TDataXtd_Point::GetID(), aPntTextAttr))
336   {
337     gp_Pnt aPoint;
338     TDataXtd_Geometry::Point(aPntTextAttr->Label(), aPoint);
339     anObj->SetPointTextAttach(aPoint);
340   }
341
342   Handle(TDataStd_Integer) aIsDTarget;
343   if(Label().FindChild(ChildLab_IsDTarget).FindAttribute(TDataStd_Integer::GetID(), aIsDTarget))
344   {
345     anObj->IsDatumTarget((aIsDTarget->Get() != 0));
346   }
347   else
348   {
349     return anObj;
350   }
351
352   if (aIsDTarget->Get() != 0)
353   {
354     Handle(TDataStd_Integer) aDTargetType;
355     if(Label().FindChild(ChildLab_DTargetType).FindAttribute(TDataStd_Integer::GetID(), aDTargetType))
356     {
357       anObj->SetDatumTargetType((XCAFDimTolObjects_DatumTargetType)aDTargetType->Get());
358       if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area)
359       {
360         Handle(TNaming_NamedShape) aDatumTarget;
361         if(Label().FindChild(ChildLab_DatumTarget).FindAttribute(TNaming_NamedShape::GetID(), aDatumTarget))
362         {
363           anObj->SetDatumTarget(aDatumTarget->Get());
364         }
365       }
366       else
367       {
368         Handle(TDataXtd_Plane) anAxisAttr;
369         if (Label().FindChild(ChildLab_Axis).FindAttribute(TDataXtd_Plane::GetID(), anAxisAttr))
370         {
371           gp_Pln aPlane;
372           TDataXtd_Geometry::Plane(anAxisAttr->Label(), aPlane);
373           gp_Ax2 anAx(aPlane.Location(), aPlane.Axis().Direction(), aPlane.XAxis().Direction());
374           anObj->SetDatumTargetAxis(anAx);
375         }
376
377         if(anObj->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
378         {
379           Handle(TDataStd_Real) aLen;
380           if(Label().FindChild(ChildLab_DTargetLength).FindAttribute(TDataStd_Real::GetID(), aLen))
381           {
382             anObj->SetDatumTargetLength(aLen->Get());
383           }
384           if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
385           {
386             Handle(TDataStd_Real) aWidth;
387             if(Label().FindChild(ChildLab_DTargetWidth).FindAttribute(TDataStd_Real::GetID(), aWidth))
388             {
389               anObj->SetDatumTargetWidth(aWidth->Get());
390             }
391           }
392         }
393       }
394     }
395     Handle(TDataStd_Integer) aNum;
396     if(Label().FindChild(ChildLab_DTargetNumber).FindAttribute(TDataStd_Integer::GetID(), aNum))
397     {
398       anObj->SetDatumTargetNumber(aNum->Get());
399     }
400     else 
401     {
402       anObj->SetDatumTargetNumber(0);
403     }
404   }
405
406   Handle(TNaming_NamedShape) aNS;
407   TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
408   if ( aLPres.FindAttribute(TNaming_NamedShape::GetID(), aNS) ) 
409   {
410
411     TopoDS_Shape aPresentation = TNaming_Tool::GetShape(aNS);
412     if( !aPresentation.IsNull())
413     {
414       Handle(TDataStd_Name) aNameAtrr;
415       Handle(TCollection_HAsciiString) aPresentName;
416       if (aLPres.FindAttribute(TDataStd_Name::GetID(),aNameAtrr))
417       {
418         const TCollection_ExtendedString& aName = aNameAtrr->Get();
419
420         if( !aName.IsEmpty())
421           aPresentName = new TCollection_HAsciiString(aName);
422       }
423
424       anObj->SetPresentation(aPresentation, aPresentName);
425     }
426   }
427   return anObj;
428 }
429
430 //=======================================================================
431 //function : ID
432 //purpose  : 
433 //=======================================================================
434
435 const Standard_GUID& XCAFDoc_Datum::ID() const
436 {
437   return GetID();
438 }
439
440
441 //=======================================================================
442 //function : Restore
443 //purpose  : 
444 //=======================================================================
445
446 void XCAFDoc_Datum::Restore(const Handle(TDF_Attribute)& theWith) 
447 {
448   myName = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetName();
449   myDescription = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetDescription();
450   myIdentification = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetIdentification();
451 }
452
453
454 //=======================================================================
455 //function : NewEmpty
456 //purpose  : 
457 //=======================================================================
458
459 Handle(TDF_Attribute) XCAFDoc_Datum::NewEmpty() const
460 {
461   return new XCAFDoc_Datum();
462 }
463
464
465 //=======================================================================
466 //function : Paste
467 //purpose  : 
468 //=======================================================================
469
470 void XCAFDoc_Datum::Paste(const Handle(TDF_Attribute)& theInto,
471                           const Handle(TDF_RelocationTable)& /*RT*/) const
472 {
473   Handle(XCAFDoc_Datum)::DownCast(theInto)->Set(myName,myDescription,myIdentification);
474 }
475