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