141c805645c452bc5d6d423b118aad5ee1946115
[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 #include <TNaming_Tool.hxx>
31 #include <TDataStd_Name.hxx>
32
33 #include <XCAFDimTolObjects_DatumObject.hxx>
34
35 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_Datum,TDF_Attribute)
36
37 enum ChildLab
38 {
39   ChildLab_Name = 1,
40   ChildLab_Position,
41   ChildLab_Modifiers,
42   ChildLab_ModifierWithValue,
43   ChildLab_IsDTarget,
44   ChildLab_DTargetType,
45   ChildLab_AxisLoc,
46   ChildLab_AxisN,
47   ChildLab_AxisRef,
48   ChildLab_DTargetLength,
49   ChildLab_DTargetWidth,
50   ChildLab_DTargetNumber,
51   ChildLab_DatumTarget,
52   ChildLab_PlaneLoc,
53   ChildLab_PlaneN,
54   ChildLab_PlaneRef,
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
230       Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
231       for (Standard_Integer i = 1; i <= 3; i++)
232         aLocArr->SetValue(i, anAx.Location().Coord(i));
233       Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisLoc), 1, 3);
234       if(!aLoc.IsNull())
235         aLoc->ChangeArray(aLocArr);
236
237       Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
238       for (Standard_Integer i = 1; i <= 3; i++)
239         aNArr->SetValue(i, anAx.Direction().Coord(i));
240       Handle(TDataStd_RealArray) aN = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisN), 1, 3);
241       if(!aN.IsNull())
242         aN->ChangeArray(aNArr);
243
244       Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
245       for (Standard_Integer i = 1; i <= 3; i++)
246         aRArr->SetValue(i, anAx.XDirection().Coord(i));
247       Handle(TDataStd_RealArray) aR = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisRef), 1, 3);
248       if(!aR.IsNull())
249         aR->ChangeArray(aRArr);
250
251       if(theObject->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
252       {
253         Handle(TDataStd_Real) aLen = TDataStd_Real::Set(Label().FindChild(ChildLab_DTargetLength),
254                                      theObject->GetDatumTargetLength());
255         if(theObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
256           Handle(TDataStd_Real) aWidth = TDataStd_Real::Set(Label().FindChild(ChildLab_DTargetWidth),
257                                          theObject->GetDatumTargetWidth());
258       }
259     }
260     Handle(TDataStd_Integer) aNum = TDataStd_Integer::Set(Label().FindChild(ChildLab_DTargetNumber), 
261                                     theObject->GetDatumTargetNumber());
262   }
263
264   if (theObject->HasPlane())
265   {
266     gp_Ax2 anAx = theObject->GetPlane();
267
268     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
269     for (Standard_Integer i = 1; i <= 3; i++)
270       aLocArr->SetValue(i, anAx.Location().Coord(i));
271     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneLoc), 1, 3);
272     if(!aLoc.IsNull())
273       aLoc->ChangeArray(aLocArr);
274
275     Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
276     for (Standard_Integer i = 1; i <= 3; i++)
277       aNArr->SetValue(i, anAx.Direction().Coord(i));
278     Handle(TDataStd_RealArray) aN = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneN), 1, 3);
279     if(!aN.IsNull())
280       aN->ChangeArray(aNArr);
281
282     Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
283     for (Standard_Integer i = 1; i <= 3; i++)
284       aRArr->SetValue(i, anAx.XDirection().Coord(i));
285     Handle(TDataStd_RealArray) aR = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneRef), 1, 3);
286     if(!aR.IsNull())
287       aR->ChangeArray(aRArr);
288   }
289
290   if (theObject->HasPoint())
291   {
292     gp_Pnt aPnt = theObject->GetPoint();
293
294     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
295     for (Standard_Integer i = 1; i <= 3; i++)
296       aLocArr->SetValue(i, aPnt.Coord(i));
297     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Pnt), 1, 3);
298     if(!aLoc.IsNull())
299       aLoc->ChangeArray(aLocArr);
300   }
301
302   if (theObject->HasPointText())
303   {
304     gp_Pnt aPntText = theObject->GetPointTextAttach();
305
306     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
307     for (Standard_Integer i = 1; i <= 3; i++)
308       aLocArr->SetValue(i, aPntText.Coord(i));
309     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PntText), 1, 3);
310     if(!aLoc.IsNull())
311       aLoc->ChangeArray(aLocArr);
312   }
313   TopoDS_Shape aPresentation = theObject->GetPresentation();
314   if( !aPresentation.IsNull())
315   {
316     TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
317     TNaming_Builder tnBuild(aLPres);
318     tnBuild.Generated(aPresentation);
319     Handle(TCollection_HAsciiString) aName =  theObject->GetPresentationName();
320     if( !aName.IsNull() )
321     {
322       TCollection_ExtendedString str ( aName->String() );
323       TDataStd_Name::Set ( aLPres, str );
324     }
325   }
326  
327 }
328
329 //=======================================================================
330 //function : GetObject
331 //purpose  : 
332 //=======================================================================
333
334 Handle(XCAFDimTolObjects_DatumObject) XCAFDoc_Datum::GetObject() const
335 {
336   Handle(XCAFDimTolObjects_DatumObject) anObj = new XCAFDimTolObjects_DatumObject();
337
338   Handle(TDataStd_AsciiString) anAttName;
339   if(Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
340   {
341     Handle(TCollection_HAsciiString) aStr = new TCollection_HAsciiString(anAttName->Get());
342     anObj->SetName(aStr);
343   }
344
345   Handle(TDataStd_IntegerArray) anArr;
346   if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
347      && !anArr->Array().IsNull())
348   {
349     XCAFDimTolObjects_DatumModifiersSequence aModifiers;
350     for(Standard_Integer i = 1; i <= anArr->Length(); i++)
351       aModifiers.Append((XCAFDimTolObjects_DatumSingleModif)anArr->Value(i));
352     anObj->SetModifiers(aModifiers);
353   }
354
355   Handle(TDataStd_Integer) aModifierWithValueM;
356   if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
357   {
358     Handle(TDataStd_Real) aModifierWithValueV;
359     if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
360     {
361       anObj->SetModifierWithValue((XCAFDimTolObjects_DatumModifWithValue)aModifierWithValueM->Get(),aModifierWithValueV->Get());
362     }
363   }
364
365   Handle(TDataStd_Integer) aPosition;
366   if(Label().FindChild(ChildLab_Position).FindAttribute(TDataStd_Integer::GetID(), aPosition))
367   {
368     anObj->SetPosition(aPosition->Get());
369   }
370
371   Handle(TDataStd_RealArray) aLoc, aN, aR;
372   if(Label().FindChild(ChildLab_PlaneLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
373     Label().FindChild(ChildLab_PlaneN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
374     Label().FindChild(ChildLab_PlaneRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
375   {
376     gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
377     gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
378     gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
379     gp_Ax2 anAx(aL, aD, aDR);
380     anObj->SetPlane(anAx);
381   }
382
383   Handle(TDataStd_RealArray) aPnt;
384   if(Label().FindChild(ChildLab_Pnt).FindAttribute(TDataStd_RealArray::GetID(), aPnt) && aPnt->Length() == 3 )
385   {
386     gp_Pnt aP(aLoc->Value(aPnt->Lower()), aPnt->Value(aPnt->Lower()+1), aPnt->Value(aPnt->Lower()+2));
387     anObj->SetPoint(aP);
388   }
389
390   Handle(TDataStd_RealArray) aPntText;
391   if(Label().FindChild(ChildLab_PntText).FindAttribute(TDataStd_RealArray::GetID(), aPntText) && aPntText->Length() == 3 )
392   {
393     gp_Pnt aP (aPntText->Value(aPntText->Lower()), aPntText->Value(aPntText->Lower()+1), aPntText->Value(aPntText->Lower()+2));                          
394     anObj->SetPointTextAttach(aP);
395   }
396
397   Handle(TDataStd_Integer) aIsDTarget;
398   if(Label().FindChild(ChildLab_IsDTarget).FindAttribute(TDataStd_Integer::GetID(), aIsDTarget))
399   {
400     anObj->IsDatumTarget((aIsDTarget->Get() != 0));
401   }
402   else
403   {
404     return anObj;
405   }
406
407   if (aIsDTarget->Get() != 0)
408   {
409     Handle(TDataStd_Integer) aDTargetType;
410     if(Label().FindChild(ChildLab_DTargetType).FindAttribute(TDataStd_Integer::GetID(), aDTargetType))
411     {
412       anObj->SetDatumTargetType((XCAFDimTolObjects_DatumTargetType)aDTargetType->Get());
413       if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area)
414       {
415         Handle(TNaming_NamedShape) aDatumTarget;
416         if(Label().FindChild(ChildLab_DatumTarget).FindAttribute(TNaming_NamedShape::GetID(), aDatumTarget))
417         {
418           anObj->SetDatumTarget(aDatumTarget->Get());
419         }
420       }
421       else
422       {
423         if(Label().FindChild(ChildLab_AxisLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
424           Label().FindChild(ChildLab_AxisN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
425           Label().FindChild(ChildLab_AxisRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
426         {
427           gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
428           gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
429           gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
430           gp_Ax2 anAx(aL, aD, aDR);
431           anObj->SetDatumTargetAxis(anAx);
432         }
433
434         if(anObj->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
435         {
436           Handle(TDataStd_Real) aLen;
437           if(Label().FindChild(ChildLab_DTargetLength).FindAttribute(TDataStd_Real::GetID(), aLen))
438           {
439             anObj->SetDatumTargetLength(aLen->Get());
440           }
441           if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
442           {
443             Handle(TDataStd_Real) aWidth;
444             if(Label().FindChild(ChildLab_DTargetWidth).FindAttribute(TDataStd_Real::GetID(), aWidth))
445             {
446               anObj->SetDatumTargetWidth(aWidth->Get());
447             }
448           }
449         }
450       }
451     }
452     Handle(TDataStd_Integer) aNum;
453     if(Label().FindChild(ChildLab_DTargetNumber).FindAttribute(TDataStd_Integer::GetID(), aNum))
454     {
455       anObj->SetDatumTargetNumber(aNum->Get());
456     }
457     else 
458     {
459       anObj->SetDatumTargetNumber(0);
460     }
461   }
462
463   Handle(TNaming_NamedShape) aNS;
464   TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
465   if ( aLPres.FindAttribute(TNaming_NamedShape::GetID(), aNS) ) 
466   {
467
468     TopoDS_Shape aPresentation = TNaming_Tool::GetShape(aNS);
469     if( !aPresentation.IsNull())
470     {
471       Handle(TDataStd_Name) aNameAtrr;
472       Handle(TCollection_HAsciiString) aPresentName;
473       if (aLPres.FindAttribute(TDataStd_Name::GetID(),aNameAtrr))
474       {
475         const TCollection_ExtendedString& aName = aNameAtrr->Get();
476
477         if( !aName.IsEmpty())
478           aPresentName = new TCollection_HAsciiString(aName);
479       }
480
481       anObj->SetPresentation(aPresentation, aPresentName);
482     }
483   }
484   return anObj;
485 }
486
487 //=======================================================================
488 //function : ID
489 //purpose  : 
490 //=======================================================================
491
492 const Standard_GUID& XCAFDoc_Datum::ID() const
493 {
494   return GetID();
495 }
496
497
498 //=======================================================================
499 //function : Restore
500 //purpose  : 
501 //=======================================================================
502
503 void XCAFDoc_Datum::Restore(const Handle(TDF_Attribute)& theWith) 
504 {
505   myName = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetName();
506   myDescription = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetDescription();
507   myIdentification = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetIdentification();
508 }
509
510
511 //=======================================================================
512 //function : NewEmpty
513 //purpose  : 
514 //=======================================================================
515
516 Handle(TDF_Attribute) XCAFDoc_Datum::NewEmpty() const
517 {
518   return new XCAFDoc_Datum();
519 }
520
521
522 //=======================================================================
523 //function : Paste
524 //purpose  : 
525 //=======================================================================
526
527 void XCAFDoc_Datum::Paste(const Handle(TDF_Attribute)& theInto,
528                           const Handle(TDF_RelocationTable)& /*RT*/) const
529 {
530   Handle(XCAFDoc_Datum)::DownCast(theInto)->Set(myName,myDescription,myIdentification);
531 }
532