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