0027932: Improvement of standard attributes usability.
[occt.git] / src / XCAFDoc / XCAFDoc_GeomTolerance.cxx
CommitLineData
9ebaae37 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_GeomTolerance.hxx>
15
16#include <TDF_RelocationTable.hxx>
1c9d3225 17#include <TDF_ChildIterator.hxx>
9ebaae37 18#include <XCAFDoc.hxx>
19#include <TDataStd_TreeNode.hxx>
20#include <TDataStd_Integer.hxx>
21#include <TDataStd_IntegerArray.hxx>
1c9d3225 22#include <TDataStd_RealArray.hxx>
9ebaae37 23#include <TDataStd_Real.hxx>
24#include <XCAFDimTolObjects_GeomToleranceObject.hxx>
5df609e7 25#include <TNaming_Tool.hxx>
26#include <TNaming_Builder.hxx>
27#include <TCollection_ExtendedString.hxx>
28#include <TDataStd_Name.hxx>
9ebaae37 29
92efcf78 30IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_GeomTolerance,TDF_Attribute)
31
9ebaae37 32enum ChildLab
33{
34 ChildLab_Type = 1,
35 ChildLab_TypeOfValue,
36 ChildLab_Value,
37 ChildLab_MatReqModif,
38 ChildLab_ZoneModif,
39 ChildLab_ValueOfZoneModif,
40 ChildLab_Modifiers,
1c9d3225 41 ChildLab_aMaxValueModif,
42 ChildLab_AxisLoc,
43 ChildLab_AxisN,
5df609e7 44 ChildLab_AxisRef,
45 ChildLab_PlaneLoc,
46 ChildLab_PlaneN,
47 ChildLab_PlaneRef,
48 ChildLab_Pnt,
49 ChildLab_PntText,
50 ChildLab_Presentation
9ebaae37 51};
52
53//=======================================================================
54//function : XCAFDoc_GeomTolerance
55//purpose :
56//=======================================================================
57
58XCAFDoc_GeomTolerance::XCAFDoc_GeomTolerance()
59{
60}
61
62
63//=======================================================================
64//function : GetID
65//purpose :
66//=======================================================================
67
68const Standard_GUID& XCAFDoc_GeomTolerance::GetID()
69{
70 static Standard_GUID DGTID ("58ed092f-44de-11d8-8776-001083004c77");
71 //static Standard_GUID ID("efd212e9-6dfd-11d4-b9c8-0060b0ee281b");
72 return DGTID;
73 //return ID;
74}
75
76//=======================================================================
77//function :
78//purpose :
79//=======================================================================
80
81Handle(XCAFDoc_GeomTolerance) XCAFDoc_GeomTolerance::Set (const TDF_Label& theLabel)
82{
83 Handle(XCAFDoc_GeomTolerance) A;
84 if (!theLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), A)) {
85 A = new XCAFDoc_GeomTolerance();
86 theLabel.AddAttribute(A);
87 }
88 return A;
89}
90
91//=======================================================================
92//function : SetObject
93//purpose :
94//=======================================================================
95
96void XCAFDoc_GeomTolerance::SetObject (const Handle(XCAFDimTolObjects_GeomToleranceObject)& theObject)
97{
98 Backup();
99
1c9d3225 100 //Label().ForForgetAllAttributes();
101 TDF_ChildIterator anIter(Label());
102 for(;anIter.More(); anIter.Next())
9ebaae37 103 {
1c9d3225 104 anIter.Value().ForgetAllAttributes();
9ebaae37 105 }
1c9d3225 106
fa53efef 107 Handle(TDataStd_Integer) aType = TDataStd_Integer::Set(Label().FindChild(ChildLab_Type), theObject->GetType());
9ebaae37 108
1c9d3225 109 if(theObject->GetTypeOfValue() != XCAFDimTolObjects_GeomToleranceTypeValue_None)
fa53efef 110 Handle(TDataStd_Integer) aTypeOfValue = TDataStd_Integer::Set(Label().FindChild(ChildLab_TypeOfValue),
111 theObject->GetTypeOfValue());
9ebaae37 112
fa53efef 113 Handle(TDataStd_Real) aValue = TDataStd_Real::Set(Label().FindChild(ChildLab_Value), theObject->GetValue());
9ebaae37 114
115 Handle(TDataStd_Integer) aMatReqModif;
1c9d3225 116 if(theObject->GetMaterialRequirementModifier() != XCAFDimTolObjects_GeomToleranceMatReqModif_None)
fa53efef 117 aMatReqModif = TDataStd_Integer::Set(Label().FindChild(ChildLab_MatReqModif),
118 theObject->GetMaterialRequirementModifier());
9ebaae37 119
1c9d3225 120 if(theObject->GetZoneModifier() != XCAFDimTolObjects_GeomToleranceZoneModif_None)
fa53efef 121 Handle(TDataStd_Integer) aZoneModif = TDataStd_Integer::Set(Label().FindChild(ChildLab_ZoneModif),
122 theObject->GetZoneModifier());
1c9d3225 123
124 if(theObject->GetValueOfZoneModifier() > 0)
fa53efef 125 Handle(TDataStd_Real) aValueOfZoneModif = TDataStd_Real::Set(Label().FindChild(ChildLab_ValueOfZoneModif),
126 theObject->GetValueOfZoneModifier());
9ebaae37 127
1c9d3225 128 if(theObject->GetModifiers().Length() > 0)
9ebaae37 129 {
1c9d3225 130 Handle(TDataStd_IntegerArray) aModifiers = new TDataStd_IntegerArray();
9ebaae37 131 Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
132 for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
133 anArr->SetValue(i,theObject->GetModifiers().Value(i));
134 aModifiers->ChangeArray(anArr);
1c9d3225 135 Label().FindChild(ChildLab_Modifiers).AddAttribute(aModifiers);
9ebaae37 136 }
137
1c9d3225 138 if(theObject->GetMaxValueModifier() > 0)
fa53efef 139 Handle(TDataStd_Real) aMaxValueModif = TDataStd_Real::Set(Label().FindChild(ChildLab_aMaxValueModif),
140 theObject->GetMaxValueModifier());
1c9d3225 141
142 if(theObject->HasAxis())
143 {
144 Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
145 Handle(TDataStd_RealArray) aN = new TDataStd_RealArray();
146 Handle(TDataStd_RealArray) aR = new TDataStd_RealArray();
147 gp_Ax2 anAx = theObject->GetAxis();
1c9d3225 148
6595eee7 149 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
150 for (Standard_Integer i = 1; i <= 3; i++)
151 aLocArr->SetValue(i, anAx.Location().Coord(i));
152 aLoc->ChangeArray(aLocArr);
1c9d3225 153
6595eee7 154 Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
155 for (Standard_Integer i = 1; i <= 3; i++)
156 aNArr->SetValue(i, anAx.Direction().Coord(i));
157 aN->ChangeArray(aNArr);
158
159 Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
160 for (Standard_Integer i = 1; i <= 3; i++)
161 aRArr->SetValue(i, anAx.XDirection().Coord(i));
162 aR->ChangeArray(aRArr);
1c9d3225 163
164 Label().FindChild(ChildLab_AxisLoc).AddAttribute(aLoc);
165 Label().FindChild(ChildLab_AxisN).AddAttribute(aN);
166 Label().FindChild(ChildLab_AxisRef).AddAttribute(aR);
167 }
5df609e7 168
169 if (theObject->HasPlane())
170 {
171 Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
172 Handle(TDataStd_RealArray) aN = new TDataStd_RealArray();
173 Handle(TDataStd_RealArray) aR = new TDataStd_RealArray();
174 gp_Ax2 anAx = theObject->GetPlane();
175
176 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
177 for (Standard_Integer i = 1; i <= 3; i++)
178 aLocArr->SetValue(i, anAx.Location().Coord(i));
179 aLoc->ChangeArray(aLocArr);
180
181 Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
182 for (Standard_Integer i = 1; i <= 3; i++)
183 aNArr->SetValue(i, anAx.Direction().Coord(i));
184 aN->ChangeArray(aNArr);
185
186 Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
187 for (Standard_Integer i = 1; i <= 3; i++)
188 aRArr->SetValue(i, anAx.XDirection().Coord(i));
189 aR->ChangeArray(aRArr);
190
191 Label().FindChild(ChildLab_PlaneLoc).AddAttribute(aLoc);
192 Label().FindChild(ChildLab_PlaneN).AddAttribute(aN);
193 Label().FindChild(ChildLab_PlaneRef).AddAttribute(aR);
194 }
195
196 if (theObject->HasPoint())
197 {
198 Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
199 gp_Pnt aPnt = theObject->GetPoint();
200
201 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
202 for (Standard_Integer i = 1; i <= 3; i++)
203 aLocArr->SetValue(i, aPnt.Coord(i));
204 aLoc->ChangeArray(aLocArr);
205
206 Label().FindChild(ChildLab_Pnt).AddAttribute(aLoc);
207 }
208
209 if (theObject->HasPointText())
210 {
211 Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
212 gp_Pnt aPntText = theObject->GetPointTextAttach();
213
214 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
215 for (Standard_Integer i = 1; i <= 3; i++)
216 aLocArr->SetValue(i, aPntText.Coord(i));
217 aLoc->ChangeArray(aLocArr);
218
219 Label().FindChild(ChildLab_PntText).AddAttribute(aLoc);
220 }
221
222 TopoDS_Shape aPresentation = theObject->GetPresentation();
223 if( !aPresentation.IsNull())
224 {
225 TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
226 TNaming_Builder tnBuild(aLPres);
227 tnBuild.Generated(aPresentation);
228 Handle(TCollection_HAsciiString) aName = theObject->GetPresentationName();
229 if( !aName.IsNull() )
230 {
231 TCollection_ExtendedString str ( aName->String() );
232 TDataStd_Name::Set ( aLPres, str );
233 }
234 }
235
9ebaae37 236}
237
238//=======================================================================
239//function :GetObject
240//purpose :
241//=======================================================================
242
243Handle(XCAFDimTolObjects_GeomToleranceObject) XCAFDoc_GeomTolerance::GetObject() const
244{
245 Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = new XCAFDimTolObjects_GeomToleranceObject();
246
247 Handle(TDataStd_Integer) aType;
248 if(Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
249 {
250 anObj->SetType((XCAFDimTolObjects_GeomToleranceType)aType->Get());
251 }
252
253 Handle(TDataStd_Integer) aTypeOfValue;
254 if(Label().FindChild(ChildLab_TypeOfValue).FindAttribute(TDataStd_Integer::GetID(), aTypeOfValue))
255 {
256 anObj->SetTypeOfValue((XCAFDimTolObjects_GeomToleranceTypeValue)aTypeOfValue->Get());
257 }
258
259 Handle(TDataStd_Real) aValue;
260 if(Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_Real::GetID(), aValue))
261 {
262 anObj->SetValue(aValue->Get());
263 }
264
265 Handle(TDataStd_Integer) aMatReqModif;
266 if(Label().FindChild(ChildLab_MatReqModif).FindAttribute(TDataStd_Integer::GetID(), aMatReqModif))
267 {
268 anObj->SetMaterialRequirementModifier((XCAFDimTolObjects_GeomToleranceMatReqModif)aMatReqModif->Get());
269 }
270
271 Handle(TDataStd_Integer) aZoneModif;
272 if(Label().FindChild(ChildLab_ZoneModif).FindAttribute(TDataStd_Integer::GetID(), aZoneModif))
273 {
274 anObj->SetZoneModifier((XCAFDimTolObjects_GeomToleranceZoneModif)aZoneModif->Get());
275 }
276
277 Handle(TDataStd_Real) aValueOfZoneModif;
278 if(Label().FindChild(ChildLab_ValueOfZoneModif).FindAttribute(TDataStd_Real::GetID(), aValueOfZoneModif))
279 {
280 anObj->SetValueOfZoneModifier(aValueOfZoneModif->Get());
281 }
282
283 Handle(TDataStd_IntegerArray) anArr;
284 if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
285 && !anArr->Array().IsNull())
286 {
287 XCAFDimTolObjects_GeomToleranceModifiersSequence aModifiers;
288 for(Standard_Integer i = 1; i <= anArr->Length(); i++)
289 aModifiers.Append((XCAFDimTolObjects_GeomToleranceModif)anArr->Value(i));
290 anObj->SetModifiers(aModifiers);
291 }
292
293 Handle(TDataStd_Real) aMaxValueModif;
294 if(Label().FindChild(ChildLab_aMaxValueModif).FindAttribute(TDataStd_Real::GetID(), aMaxValueModif))
295 {
296 anObj->SetMaxValueModifier(aMaxValueModif->Get());
297 }
1c9d3225 298
299 Handle(TDataStd_RealArray) aLoc;
300 Handle(TDataStd_RealArray) aN;
301 Handle(TDataStd_RealArray) aR;
302 if(Label().FindChild(ChildLab_AxisLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
303 Label().FindChild(ChildLab_AxisN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
304 Label().FindChild(ChildLab_AxisRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
305 {
6595eee7 306 gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
307 gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
308 gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
1c9d3225 309 gp_Ax2 anAx(aL, aD, aDR);
310 anObj->SetAxis(anAx);
311 }
5df609e7 312
313 if(Label().FindChild(ChildLab_PlaneLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
314 Label().FindChild(ChildLab_PlaneN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
315 Label().FindChild(ChildLab_PlaneRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
316 {
317 gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
318 gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
319 gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
320 gp_Ax2 anAx(aL, aD, aDR);
321 anObj->SetPlane(anAx);
322 }
323
324 Handle(TDataStd_RealArray) aPnt;
4a6d2783 325 if(Label().FindChild(ChildLab_Pnt).FindAttribute(TDataStd_RealArray::GetID(), aPnt) && aPnt->Length() == 3 )
5df609e7 326 {
327 gp_Pnt aP(aLoc->Value(aPnt->Lower()), aPnt->Value(aPnt->Lower()+1), aPnt->Value(aPnt->Lower()+2));
328 anObj->SetPoint(aP);
329 }
330
331 Handle(TDataStd_RealArray) aPntText;
332 if(Label().FindChild(ChildLab_PntText).FindAttribute(TDataStd_RealArray::GetID(), aPntText) && aPntText->Length() == 3 )
333 {
334 gp_Pnt aP(aPntText->Value(aPntText->Lower()), aPntText->Value(aPntText->Lower()+1), aPntText->Value(aPntText->Lower()+2));
335 anObj->SetPointTextAttach(aP);
336 }
337
338 Handle(TNaming_NamedShape) aNS;
339 TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
340 if ( aLPres.FindAttribute(TNaming_NamedShape::GetID(), aNS) )
341 {
342
343 TopoDS_Shape aPresentation = TNaming_Tool::GetShape(aNS);
344 if( !aPresentation.IsNull())
345 {
346 Handle(TDataStd_Name) aNameAtrr;
347 Handle(TCollection_HAsciiString) aPresentName;
348 if (aLPres.FindAttribute(TDataStd_Name::GetID(),aNameAtrr))
349 {
350 const TCollection_ExtendedString& aName = aNameAtrr->Get();
351
352 if( !aName.IsEmpty())
353 aPresentName = new TCollection_HAsciiString(aName);
354 }
355
356 anObj->SetPresentation(aPresentation, aPresentName);
357 }
358 }
359
9ebaae37 360 return anObj;
361}
362
363//=======================================================================
364//function : ID
365//purpose :
366//=======================================================================
367
368const Standard_GUID& XCAFDoc_GeomTolerance::ID() const
369{
370 return GetID();
371}
372
373//=======================================================================
374//function : Restore
375//purpose :
376//=======================================================================
377
378void XCAFDoc_GeomTolerance::Restore(const Handle(TDF_Attribute)& /*With*/)
379{
380}
381
382
383//=======================================================================
384//function : NewEmpty
385//purpose :
386//=======================================================================
387
388Handle(TDF_Attribute) XCAFDoc_GeomTolerance::NewEmpty() const
389{
390 return new XCAFDoc_GeomTolerance();
391}
392
393
394//=======================================================================
395//function : Paste
396//purpose :
397//=======================================================================
398
399void XCAFDoc_GeomTolerance::Paste(const Handle(TDF_Attribute)& /*Into*/,
400 const Handle(TDF_RelocationTable)& /*RT*/) const
401{
402}