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