0030773: Application Framework - To allow to inherit existing attributes to reuse...
[occt.git] / src / XCAFDoc / XCAFDoc_Dimension.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_Dimension.hxx>
15
16 #include <TDF_RelocationTable.hxx>
17 #include <TDF_ChildIterator.hxx>
18 #include <XCAFDoc.hxx>
19 #include <TDataStd_TreeNode.hxx>
20 #include <Precision.hxx>
21 #include <TColgp_HArray1OfPnt.hxx>
22 #include <TDataStd_Integer.hxx>
23 #include <TDataStd_IntegerArray.hxx>
24 #include <TDataStd_ExtStringArray.hxx>
25 #include <TDataStd_Real.hxx>
26 #include <TDataStd_RealArray.hxx>
27 #include <TNaming_Builder.hxx>
28 #include <TNaming_NamedShape.hxx>
29 #include <TColStd_HArray1OfReal.hxx>
30 #include <TopoDS.hxx>
31 #include <XCAFDimTolObjects_DimensionObject.hxx>
32 #include <TNaming_Tool.hxx>
33 #include <TDataStd_Name.hxx>
34
35 IMPLEMENT_DERIVED_ATTRIBUTE(XCAFDoc_Dimension,TDataStd_GenericEmpty)
36 enum ChildLab
37 {
38   ChildLab_Type = 1,
39   ChildLab_Value,
40   ChildLab_Qualifier,
41   ChildLab_Class,
42   ChildLab_Dec,
43   ChildLab_Modifiers,
44   ChildLab_Path,
45   ChildLab_Dir,
46   ChildLab_Pnt1,
47   ChildLab_Pnt2,
48   ChildLab_PlaneLoc,
49   ChildLab_PlaneN,
50   ChildLab_PlaneRef,
51   ChildLab_PntText,
52   ChildLab_Presentation,
53   ChildLab_Descriptions,
54   ChildLab_DescriptionNames
55 };
56
57 //=======================================================================
58 //function : XCAFDoc_Dimension
59 //purpose  : 
60 //=======================================================================
61
62 XCAFDoc_Dimension::XCAFDoc_Dimension()
63 {
64 }
65
66
67 //=======================================================================
68 //function : GetID
69 //purpose  : 
70 //=======================================================================
71
72 const Standard_GUID& XCAFDoc_Dimension::GetID() 
73 {
74   static Standard_GUID DGTID ("58ed092c-44de-11d8-8776-001083004c77");
75   //static Standard_GUID ID("efd212e9-6dfd-11d4-b9c8-0060b0ee281b");
76   return DGTID; 
77   //return ID;
78 }
79
80 //=======================================================================
81 //function : Set
82 //purpose  : 
83 //=======================================================================
84 Handle(XCAFDoc_Dimension) XCAFDoc_Dimension::Set(const TDF_Label& theLabel) 
85 {
86   Handle(XCAFDoc_Dimension) A;
87   if (!theLabel.FindAttribute(XCAFDoc_Dimension::GetID(), A)) {
88     A = new XCAFDoc_Dimension();
89     theLabel.AddAttribute(A);
90   }
91   return A;
92 }
93
94 //=======================================================================
95 //function : SetObject
96 //purpose  : 
97 //=======================================================================
98 void XCAFDoc_Dimension::SetObject (const Handle(XCAFDimTolObjects_DimensionObject)& theObject)
99 {
100   Backup();
101
102   if (theObject->GetSemanticName())
103   {
104     TCollection_ExtendedString str(theObject->GetSemanticName()->String());
105     TDataStd_Name::Set(Label(), str);
106   }
107
108   TDF_ChildIterator anIter(Label());
109   for(;anIter.More(); anIter.Next())
110   {
111     anIter.Value().ForgetAllAttributes();
112   }
113   Handle(TDataStd_Integer) aType = TDataStd_Integer::Set(Label().FindChild(ChildLab_Type), theObject->GetType());
114
115   if(!theObject->GetValues().IsNull())
116   {
117     Handle(TDataStd_RealArray) aVal = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Value), theObject->GetValues()->Lower(), 
118                                       theObject->GetValues()->Lower() + theObject->GetValues()->Length() - 1);
119     if(!aVal.IsNull())
120       aVal->ChangeArray(theObject->GetValues());
121   }
122
123   Handle(TDataStd_Integer) aQualifier = TDataStd_Integer::Set(Label().FindChild(ChildLab_Qualifier), theObject->GetQualifier());
124  
125   Standard_Boolean aH;
126   XCAFDimTolObjects_DimensionFormVariance aF;
127   XCAFDimTolObjects_DimensionGrade aG;
128   theObject->GetClassOfTolerance(aH,aF,aG);
129   Handle(TColStd_HArray1OfInteger) anArrI;
130   if(aF != XCAFDimTolObjects_DimensionFormVariance_None)
131   {
132     anArrI = new TColStd_HArray1OfInteger(1,3);
133     anArrI->SetValue(1,aH);
134     anArrI->SetValue(2,aF);
135     anArrI->SetValue(3,aG);
136     Handle(TDataStd_IntegerArray) aClass = TDataStd_IntegerArray::Set(Label().FindChild(ChildLab_Class), 1, 3);
137     if(!aClass.IsNull())
138       aClass->ChangeArray(anArrI);
139   }
140
141   Standard_Integer aL, aR;
142   theObject->GetNbOfDecimalPlaces(aL, aR);
143   if (aL > 0 || aR > 0)
144   {
145     anArrI = new TColStd_HArray1OfInteger(1,2);
146     anArrI->SetValue(1,aL);
147     anArrI->SetValue(2,aR);
148     Handle(TDataStd_IntegerArray) aDec = TDataStd_IntegerArray::Set(Label().FindChild(ChildLab_Dec), 1, 2);
149     if(!aDec.IsNull())
150       aDec->ChangeArray(anArrI);
151   }
152
153   if(theObject->GetModifiers().Length() > 0)
154   {
155     anArrI = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
156     for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
157       anArrI->SetValue(i,theObject->GetModifiers().Value(i));
158     Handle(TDataStd_IntegerArray) aModifiers = TDataStd_IntegerArray::Set(Label().FindChild(ChildLab_Modifiers), 
159                                                1, theObject->GetModifiers().Length());
160     if(!aModifiers.IsNull())
161       aModifiers->ChangeArray(anArrI);
162   }
163
164   if(!theObject->GetPath().IsNull())
165   {
166     TNaming_Builder tnBuild(Label().FindChild(ChildLab_Path));
167     tnBuild.Generated(theObject->GetPath());
168   }
169
170   Handle(TColStd_HArray1OfReal) anArrR;
171   if(theObject->GetType() == XCAFDimTolObjects_DimensionType_Location_Oriented)
172   {
173     gp_Dir aD;
174     theObject->GetDirection(aD);
175     anArrR = new TColStd_HArray1OfReal(1, 3);
176     anArrR->SetValue(1, aD.X());
177     anArrR->SetValue(2, aD.Y());
178     anArrR->SetValue(3, aD.Z());
179     Handle(TDataStd_RealArray) aDir = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Dir), 1, 3);
180     if (!aDir.IsNull())
181       aDir->ChangeArray(anArrR);
182   }
183
184   if (theObject->HasPoint())
185   {
186     gp_Pnt aPnt1 = theObject->GetPoint();
187
188     Handle(TColStd_HArray1OfReal) aPntArr = new TColStd_HArray1OfReal(1, 3);
189     for (Standard_Integer i = 1; i <= 3; i++)
190       aPntArr->SetValue(i, aPnt1.Coord(i));
191     Handle(TDataStd_RealArray) aPnt = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Pnt1), 1, 3);
192     if (!aPnt.IsNull())
193       aPnt->ChangeArray(aPntArr);
194   }
195
196   if (theObject->HasPoint2())
197   {
198     gp_Pnt aPnt2 = theObject->GetPoint2();
199
200     Handle(TColStd_HArray1OfReal) aPntArr = new TColStd_HArray1OfReal(1, 3);
201     for (Standard_Integer i = 1; i <= 3; i++)
202       aPntArr->SetValue(i, aPnt2.Coord(i));
203     Handle(TDataStd_RealArray) aPnt = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Pnt2), 1, 3);
204     if (!aPnt.IsNull())
205       aPnt->ChangeArray(aPntArr);
206   }
207
208   if (theObject->HasPlane())
209   {
210     gp_Ax2 anAx = theObject->GetPlane();
211
212     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
213     for (Standard_Integer i = 1; i <= 3; i++)
214       aLocArr->SetValue(i, anAx.Location().Coord(i));
215     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneLoc), 1, 3);
216     if (!aLoc.IsNull())
217       aLoc->ChangeArray(aLocArr);
218
219     Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
220     for (Standard_Integer i = 1; i <= 3; i++)
221       aNArr->SetValue(i, anAx.Direction().Coord(i));
222     Handle(TDataStd_RealArray) aN = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneN), 1, 3);
223     if (!aN.IsNull())
224       aN->ChangeArray(aNArr);
225
226     Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
227     for (Standard_Integer i = 1; i <= 3; i++)
228       aRArr->SetValue(i, anAx.XDirection().Coord(i));
229     Handle(TDataStd_RealArray) aRAtt = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneRef), 1, 3);
230     if (!aRAtt.IsNull())
231       aRAtt->ChangeArray(aRArr);
232   }
233
234   if (theObject->HasTextPoint())
235   {
236     gp_Pnt aPntText = theObject->GetPointTextAttach();
237
238     Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
239     for (Standard_Integer i = 1; i <= 3; i++)
240       aLocArr->SetValue(i, aPntText.Coord(i));
241     Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PntText), 1, 3);
242     if (!aLoc.IsNull())
243       aLoc->ChangeArray(aLocArr);
244   }
245
246   TopoDS_Shape aPresentation = theObject->GetPresentation();
247   if( !aPresentation.IsNull())
248   {
249     TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
250     TNaming_Builder tnBuild(aLPres);
251     tnBuild.Generated(aPresentation);
252     Handle(TCollection_HAsciiString) aName =  theObject->GetPresentationName();
253     if( !aName.IsNull() )
254     {
255       TCollection_ExtendedString str ( aName->String() );
256       TDataStd_Name::Set ( aLPres, str );
257     }
258   }
259
260   if (theObject->HasDescriptions())
261   {
262     Handle(TColStd_HArray1OfExtendedString) aDescrArr = new TColStd_HArray1OfExtendedString(1, theObject->NbDescriptions());
263     Handle(TColStd_HArray1OfExtendedString) aDescrNameArr = new TColStd_HArray1OfExtendedString(1, theObject->NbDescriptions());
264     for (Standard_Integer i = 0; i < theObject->NbDescriptions(); i++) {
265       TCollection_ExtendedString aDescr(theObject->GetDescription(i)->String());
266       aDescrArr->SetValue(i + 1, aDescr);
267       TCollection_ExtendedString aDescrName(theObject->GetDescriptionName(i)->String());
268       aDescrNameArr->SetValue(i + 1, aDescrName);
269     }
270     Handle(TDataStd_ExtStringArray) aDescriptions = TDataStd_ExtStringArray::Set(Label().FindChild(ChildLab_Descriptions),
271                                                     1, theObject->NbDescriptions());
272     Handle(TDataStd_ExtStringArray) aDescriptionNames = TDataStd_ExtStringArray::Set(Label().FindChild(ChildLab_DescriptionNames),
273                                                         1, theObject->NbDescriptions());
274     if(!aDescriptions.IsNull())
275       aDescriptions->ChangeArray(aDescrArr);
276     if(!aDescriptionNames.IsNull())
277       aDescriptionNames->ChangeArray(aDescrNameArr);
278   }
279 }
280
281 //=======================================================================
282 //function : GetObject
283 //purpose  : 
284 //=======================================================================
285 Handle(XCAFDimTolObjects_DimensionObject) XCAFDoc_Dimension::GetObject()  const
286 {
287   Handle(XCAFDimTolObjects_DimensionObject) anObj = new XCAFDimTolObjects_DimensionObject();
288
289   Handle(TDataStd_Name) aSemanticNameAttr;
290   Handle(TCollection_HAsciiString) aSemanticName;
291   if (Label().FindAttribute(TDataStd_Name::GetID(), aSemanticNameAttr))
292   {
293     const TCollection_ExtendedString& aName = aSemanticNameAttr->Get();
294     if (!aName.IsEmpty())
295       aSemanticName = new TCollection_HAsciiString(aName);
296   }
297   anObj->SetSemanticName(aSemanticName);
298
299   Handle(TDataStd_Integer) aType;
300   if(Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
301   {
302     anObj->SetType((XCAFDimTolObjects_DimensionType)aType->Get());
303   }
304
305   Handle(TDataStd_RealArray) aVal;
306   if(Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_RealArray::GetID(), aVal) 
307      && !aVal->Array().IsNull())
308   {
309     anObj->SetValues(aVal->Array());
310   }
311
312   Handle(TDataStd_Integer) aQualifier;
313   if(Label().FindChild(ChildLab_Qualifier).FindAttribute(TDataStd_Integer::GetID(), aQualifier))
314   {
315     anObj->SetQualifier((XCAFDimTolObjects_DimensionQualifier)aQualifier->Get());
316   }
317  
318   Handle(TDataStd_IntegerArray) aClass;
319   if(Label().FindChild(ChildLab_Class).FindAttribute(TDataStd_IntegerArray::GetID(), aClass) 
320      && !aClass->Array().IsNull() && aClass->Array()->Length() > 0)
321   {
322     anObj->SetClassOfTolerance(aClass->Array()->Value(1) != 0, (XCAFDimTolObjects_DimensionFormVariance)aClass->Array()->Value(2), (XCAFDimTolObjects_DimensionGrade)aClass->Array()->Value(3));
323   }
324
325   Handle(TDataStd_IntegerArray) aDec;
326   if(Label().FindChild(ChildLab_Dec).FindAttribute(TDataStd_IntegerArray::GetID(), aDec)
327      && !aDec->Array().IsNull() && aDec->Array()->Length() > 0)
328   {
329       anObj->SetNbOfDecimalPlaces(aDec->Array()->Value(1), aDec->Array()->Value(2));
330   }
331  
332   Handle(TDataStd_IntegerArray) aModifiers;
333   if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), aModifiers) 
334      && !aModifiers->Array().IsNull())
335   {
336     XCAFDimTolObjects_DimensionModifiersSequence aM;
337     for(Standard_Integer i = 1; i <= aModifiers->Array()->Length(); i++)
338       aM.Append((XCAFDimTolObjects_DimensionModif)aModifiers->Array()->Value(i));
339     anObj->SetModifiers(aM);
340   }
341
342   Handle(TNaming_NamedShape) aShape;
343   if(Label().FindChild(ChildLab_Path).FindAttribute(TNaming_NamedShape::GetID(), aShape)
344     && !aShape.IsNull())
345   {
346     anObj->SetPath(TopoDS::Edge(aShape->Get()));
347   }
348
349   Handle(TDataStd_RealArray) aDir;
350   if (Label().FindChild(ChildLab_Dir).FindAttribute(TDataStd_RealArray::GetID(), aDir)
351     && !aDir->Array().IsNull() && aDir->Array()->Length() > 0)
352   {
353     gp_Dir aD(aDir->Array()->Value(1), aDir->Array()->Value(2), aDir->Array()->Value(3));
354     anObj->SetDirection(aD);
355   }
356
357   Handle(TDataStd_RealArray) aPnt1;
358   if (Label().FindChild(ChildLab_Pnt1).FindAttribute(TDataStd_RealArray::GetID(), aPnt1) && aPnt1->Length() == 3)
359   {
360     gp_Pnt aP(aPnt1->Value(aPnt1->Lower()), aPnt1->Value(aPnt1->Lower() + 1), aPnt1->Value(aPnt1->Lower() + 2));
361     anObj->SetPoint(aP);
362   }
363
364   Handle(TDataStd_RealArray) aPnt2;
365   if (Label().FindChild(ChildLab_Pnt2).FindAttribute(TDataStd_RealArray::GetID(), aPnt2) && aPnt2->Length() == 3)
366   {
367     gp_Pnt aP(aPnt2->Value(aPnt2->Lower()), aPnt2->Value(aPnt2->Lower() + 1), aPnt2->Value(aPnt2->Lower() + 2));
368     anObj->SetPoint2(aP);
369   }
370
371
372   Handle(TDataStd_RealArray) aLoc, aN, aR;
373   if (Label().FindChild(ChildLab_PlaneLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
374       Label().FindChild(ChildLab_PlaneN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
375       Label().FindChild(ChildLab_PlaneRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3)
376   {
377     gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower() + 1), aLoc->Value(aLoc->Lower() + 2));
378     gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower() + 1), aN->Value(aN->Lower() + 2));
379     gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower() + 1), aR->Value(aR->Lower() + 2));
380     gp_Ax2 anAx(aL, aD, aDR);
381     anObj->SetPlane(anAx);
382   }
383
384   Handle(TDataStd_RealArray) aPntText;
385   if (Label().FindChild(ChildLab_PntText).FindAttribute(TDataStd_RealArray::GetID(), aPntText) && aPntText->Length() == 3)
386   {
387     gp_Pnt aP(aPntText->Value(aPntText->Lower()), aPntText->Value(aPntText->Lower() + 1), aPntText->Value(aPntText->Lower() + 2));
388     anObj->SetPointTextAttach(aP);
389   }
390
391   Handle(TNaming_NamedShape) aNS;
392   TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
393   if ( aLPres.FindAttribute(TNaming_NamedShape::GetID(), aNS) ) 
394   {
395     TopoDS_Shape aPresentation = TNaming_Tool::GetShape(aNS);
396     if( !aPresentation.IsNull())
397     {
398       Handle(TDataStd_Name) aNameAtrr;
399       Handle(TCollection_HAsciiString) aPresentName;
400       if (aLPres.FindAttribute(TDataStd_Name::GetID(),aNameAtrr))
401       {
402         const TCollection_ExtendedString& aName = aNameAtrr->Get();
403         if( !aName.IsEmpty())
404           aPresentName = new TCollection_HAsciiString(aName);
405       }
406       anObj->SetPresentation(aPresentation, aPresentName);
407     }
408   }
409
410   Handle(TDataStd_ExtStringArray) aDescriptions, aDescriptionNames;
411   if (Label().FindChild(ChildLab_Descriptions).FindAttribute(TDataStd_ExtStringArray::GetID(), aDescriptions) &&
412     Label().FindChild(ChildLab_DescriptionNames).FindAttribute(TDataStd_ExtStringArray::GetID(), aDescriptionNames)) {
413     for (Standard_Integer i = 1; i <= aDescriptions->Length(); i++) {
414       Handle(TCollection_HAsciiString) aDescription, aDescriptionName;
415       aDescription = new TCollection_HAsciiString(TCollection_AsciiString(aDescriptions->Value(i)));
416       aDescriptionName = new TCollection_HAsciiString(TCollection_AsciiString(aDescriptionNames->Value(i)));
417       anObj->AddDescription(aDescription, aDescriptionName);
418     }
419   }
420   return anObj;
421 }
422
423 //=======================================================================
424 //function : ID
425 //purpose  : 
426 //=======================================================================
427
428 const Standard_GUID& XCAFDoc_Dimension::ID() const
429 {
430   return GetID();
431 }