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