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