162e14286deb9c4626b6b8e3c397d03d80988563
[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
32 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_Dimension,TDF_Attribute)
33
34 enum ChildLab
35 {
36   ChildLab_Type = 1,
37   ChildLab_Value,
38   ChildLab_Qualifier,
39   ChildLab_Class,
40   ChildLab_Dec,
41   ChildLab_Modifiers,
42   ChildLab_Path,
43   ChildLab_Dir,
44   ChildLab_Pnts
45 };
46
47 //=======================================================================
48 //function : XCAFDoc_Dimension
49 //purpose  : 
50 //=======================================================================
51
52 XCAFDoc_Dimension::XCAFDoc_Dimension()
53 {
54 }
55
56
57 //=======================================================================
58 //function : GetID
59 //purpose  : 
60 //=======================================================================
61
62 const Standard_GUID& XCAFDoc_Dimension::GetID() 
63 {
64   static Standard_GUID DGTID ("58ed092c-44de-11d8-8776-001083004c77");
65   //static Standard_GUID ID("efd212e9-6dfd-11d4-b9c8-0060b0ee281b");
66   return DGTID; 
67   //return ID;
68 }
69
70 //=======================================================================
71 //function : Set
72 //purpose  : 
73 //=======================================================================
74 Handle(XCAFDoc_Dimension) XCAFDoc_Dimension::Set(const TDF_Label& theLabel) 
75 {
76   Handle(XCAFDoc_Dimension) A;
77   if (!theLabel.FindAttribute(XCAFDoc_Dimension::GetID(), A)) {
78     A = new XCAFDoc_Dimension();
79     theLabel.AddAttribute(A);
80   }
81   return A;
82 }
83
84 //=======================================================================
85 //function : SetObject
86 //purpose  : 
87 //=======================================================================
88 void XCAFDoc_Dimension::SetObject (const Handle(XCAFDimTolObjects_DimensionObject)& theObject)
89 {
90   Backup();
91
92   //Label().ForForgetAllAttributes();
93   TDF_ChildIterator anIter(Label());
94   for(;anIter.More(); anIter.Next())
95   {
96     anIter.Value().ForgetAllAttributes();
97   }
98   Handle(TDataStd_Integer) aType = new TDataStd_Integer();
99   Label().FindChild(ChildLab_Type).AddAttribute(aType);
100   aType->Set(theObject->GetType());
101
102   if(!theObject->GetValues().IsNull())
103   {
104     Handle(TDataStd_RealArray) aVal = new TDataStd_RealArray();
105     Label().FindChild(ChildLab_Value).AddAttribute(aVal);
106     aVal->ChangeArray(theObject->GetValues());
107   }
108
109   Handle(TDataStd_Integer) aQualifier = new TDataStd_Integer();
110   Label().FindChild(ChildLab_Qualifier).AddAttribute(aQualifier);
111   aQualifier->Set(theObject->GetQualifier());
112  
113   Standard_Boolean aH;
114   XCAFDimTolObjects_DimensionFormVariance aF;
115   XCAFDimTolObjects_DimensionGrade aG;
116   theObject->GetClassOfTolerance(aH,aF,aG);
117   Handle(TColStd_HArray1OfInteger) anArrI;
118   if(aF != XCAFDimTolObjects_DimensionFormVariance_None)
119   {
120     Handle(TDataStd_IntegerArray) aClass = new TDataStd_IntegerArray();
121     Label().FindChild(ChildLab_Class).AddAttribute(aClass);
122     anArrI = new TColStd_HArray1OfInteger(1,3);
123     anArrI->SetValue(1,aH);
124     anArrI->SetValue(2,aF);
125     anArrI->SetValue(3,aG);
126     aClass->ChangeArray(anArrI);
127   }
128
129   Standard_Integer aL, aR;
130   theObject->GetNbOfDecimalPlaces(aL, aR);
131   if (aL > 0 || aR > 0)
132   {
133     Handle(TDataStd_IntegerArray) aDec = new TDataStd_IntegerArray();
134     Label().FindChild(ChildLab_Dec).AddAttribute(aDec);
135     anArrI = new TColStd_HArray1OfInteger(1,2);
136     anArrI->SetValue(1,aL);
137     anArrI->SetValue(2,aR);
138     aDec->ChangeArray(anArrI);
139   }
140
141   if(theObject->GetModifiers().Length() > 0)
142   {
143     Handle(TDataStd_IntegerArray) aModifiers = new TDataStd_IntegerArray();
144     Label().FindChild(ChildLab_Modifiers).AddAttribute(aModifiers);
145     anArrI = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
146     for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
147       anArrI->SetValue(i,theObject->GetModifiers().Value(i));
148     aModifiers->ChangeArray(anArrI);
149   }
150
151   if(!theObject->GetPath().IsNull())
152   {
153     TNaming_Builder tnBuild(Label().FindChild(ChildLab_Path));
154     tnBuild.Generated(theObject->GetPath());
155   }
156
157   Handle(TColStd_HArray1OfReal) anArrR;
158   if(theObject->GetType() == XCAFDimTolObjects_DimensionType_Location_Oriented)
159   {
160     gp_Dir aD;
161     theObject->GetDirection(aD);
162     Handle(TDataStd_RealArray) aDir = new TDataStd_RealArray();
163     Label().FindChild(ChildLab_Dir).AddAttribute(aDir);
164     anArrR = new TColStd_HArray1OfReal(1,3);
165     anArrR->SetValue(1,aD.X());
166     anArrR->SetValue(2,aD.Y());
167     anArrR->SetValue(3,aD.Z());
168     aDir->ChangeArray(anArrR);
169   }
170
171   Handle(TColgp_HArray1OfPnt) aP = theObject->GetPoints();
172   if(!aP.IsNull() && aP->Length() > 0)
173   {
174     anArrR = new TColStd_HArray1OfReal(1,6);
175     Handle(TDataStd_RealArray) aPnts;
176     anArrR->SetValue(1,aP->Value(1).X());
177     anArrR->SetValue(2,aP->Value(1).Y());
178     anArrR->SetValue(3,aP->Value(1).Z());
179     anArrR->SetValue(4,aP->Value(2).X());
180     anArrR->SetValue(5,aP->Value(2).Y());
181     anArrR->SetValue(6,aP->Value(2).Z());
182     aPnts = new TDataStd_RealArray();
183     Label().FindChild(ChildLab_Pnts).AddAttribute(aPnts);
184     aPnts->ChangeArray(anArrR);
185   }
186 }
187
188 //=======================================================================
189 //function : GetObject
190 //purpose  : 
191 //=======================================================================
192 Handle(XCAFDimTolObjects_DimensionObject) XCAFDoc_Dimension::GetObject()  const
193 {
194   Handle(XCAFDimTolObjects_DimensionObject) anObj = new XCAFDimTolObjects_DimensionObject();
195
196   Handle(TDataStd_Integer) aType;
197   if(Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
198   {
199     anObj->SetType((XCAFDimTolObjects_DimensionType)aType->Get());
200   }
201
202   Handle(TDataStd_RealArray) aVal;
203   if(Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_RealArray::GetID(), aVal) 
204      && !aVal->Array().IsNull())
205   {
206     anObj->SetValues(aVal->Array());
207   }
208
209   Handle(TDataStd_Integer) aQualifier;
210   if(Label().FindChild(ChildLab_Qualifier).FindAttribute(TDataStd_Integer::GetID(), aQualifier))
211   {
212     anObj->SetQualifier((XCAFDimTolObjects_DimensionQualifier)aQualifier->Get());
213   }
214  
215   Handle(TDataStd_IntegerArray) aClass;
216   if(Label().FindChild(ChildLab_Class).FindAttribute(TDataStd_IntegerArray::GetID(), aClass) 
217      && !aClass->Array().IsNull() && aClass->Array()->Length() > 0)
218   {
219     anObj->SetClassOfTolerance(aClass->Array()->Value(1), (XCAFDimTolObjects_DimensionFormVariance)aClass->Array()->Value(2), (XCAFDimTolObjects_DimensionGrade)aClass->Array()->Value(3));
220   }
221
222   Handle(TDataStd_IntegerArray) aDec;
223   if(Label().FindChild(ChildLab_Dec).FindAttribute(TDataStd_IntegerArray::GetID(), aDec)
224      && !aDec->Array().IsNull() && aDec->Array()->Length() > 0)
225   {
226       anObj->SetNbOfDecimalPlaces(aDec->Array()->Value(1), aDec->Array()->Value(2));
227   }
228  
229   Handle(TDataStd_IntegerArray) aModifiers;
230   if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), aModifiers) 
231      && !aModifiers->Array().IsNull())
232   {
233     XCAFDimTolObjects_DimensionModifiersSequence aM;
234     for(Standard_Integer i = 1; i <= aModifiers->Array()->Length(); i++)
235       aM.Append((XCAFDimTolObjects_DimensionModif)aModifiers->Array()->Value(i));
236     anObj->SetModifiers(aM);
237   }
238
239   Handle(TNaming_NamedShape) aShape;
240   if(Label().FindChild(ChildLab_Path).FindAttribute(TNaming_NamedShape::GetID(), aShape)
241     && !aShape.IsNull())
242   {
243     anObj->SetPath(TopoDS::Edge(aShape->Get()));
244   }
245
246
247   Handle(TDataStd_RealArray) aDir;
248   if(Label().FindChild(ChildLab_Dir).FindAttribute(TDataStd_RealArray::GetID(), aDir)
249      && !aDir->Array().IsNull() && aDir->Array()->Length() > 0)
250   {
251     gp_Dir aD(aDir->Array()->Value(1), aDir->Array()->Value(2), aDir->Array()->Value(3));
252     anObj->SetDirection(aD);
253   }
254
255   Handle(TDataStd_RealArray) aPnts;
256   if(Label().FindChild(ChildLab_Pnts).FindAttribute(TDataStd_RealArray::GetID(), aPnts) 
257      && !aPnts->Array().IsNull() && aPnts->Array()->Length() > 0)
258   {
259     Handle(TColgp_HArray1OfPnt) aP = new TColgp_HArray1OfPnt(1,2);
260     aP->SetValue(1, gp_Pnt(aPnts->Array()->Value(1), aPnts->Array()->Value(2), aPnts->Array()->Value(3)));
261     aP->SetValue(2, gp_Pnt(aPnts->Array()->Value(4), aPnts->Array()->Value(5), aPnts->Array()->Value(6)));
262     anObj->SetPoints(aP);
263   }
264
265   return anObj;
266 }
267
268 //=======================================================================
269 //function : ID
270 //purpose  : 
271 //=======================================================================
272
273 const Standard_GUID& XCAFDoc_Dimension::ID() const
274 {
275   return GetID();
276 }
277
278 //=======================================================================
279 //function : Restore
280 //purpose  : 
281 //=======================================================================
282
283 void XCAFDoc_Dimension::Restore(const Handle(TDF_Attribute)& /*With*/) 
284 {
285 }
286
287
288 //=======================================================================
289 //function : NewEmpty
290 //purpose  : 
291 //=======================================================================
292
293 Handle(TDF_Attribute) XCAFDoc_Dimension::NewEmpty() const
294 {
295   return new XCAFDoc_Dimension();
296 }
297
298
299 //=======================================================================
300 //function : Paste
301 //purpose  : 
302 //=======================================================================
303
304 void XCAFDoc_Dimension::Paste(const Handle(TDF_Attribute)& /*Into*/,
305                            const Handle(TDF_RelocationTable)& /*RT*/) const
306 {
307 }