1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
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.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
14 #include <XCAFDoc_GeomTolerance.hxx>
16 #include <TDF_RelocationTable.hxx>
17 #include <TDF_ChildIterator.hxx>
18 #include <XCAFDoc.hxx>
19 #include <TDataStd_TreeNode.hxx>
20 #include <TDataStd_Integer.hxx>
21 #include <TDataStd_IntegerArray.hxx>
22 #include <TDataStd_RealArray.hxx>
23 #include <TDataStd_Real.hxx>
24 #include <XCAFDimTolObjects_GeomToleranceObject.hxx>
25 #include <TNaming_Tool.hxx>
26 #include <TNaming_Builder.hxx>
27 #include <TCollection_ExtendedString.hxx>
28 #include <TDataStd_Name.hxx>
30 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_GeomTolerance,TDF_Attribute)
39 ChildLab_ValueOfZoneModif,
41 ChildLab_aMaxValueModif,
53 //=======================================================================
54 //function : XCAFDoc_GeomTolerance
56 //=======================================================================
58 XCAFDoc_GeomTolerance::XCAFDoc_GeomTolerance()
63 //=======================================================================
66 //=======================================================================
68 const Standard_GUID& XCAFDoc_GeomTolerance::GetID()
70 static Standard_GUID DGTID ("58ed092f-44de-11d8-8776-001083004c77");
71 //static Standard_GUID ID("efd212e9-6dfd-11d4-b9c8-0060b0ee281b");
76 //=======================================================================
79 //=======================================================================
81 Handle(XCAFDoc_GeomTolerance) XCAFDoc_GeomTolerance::Set (const TDF_Label& theLabel)
83 Handle(XCAFDoc_GeomTolerance) A;
84 if (!theLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), A)) {
85 A = new XCAFDoc_GeomTolerance();
86 theLabel.AddAttribute(A);
91 //=======================================================================
92 //function : SetObject
94 //=======================================================================
96 void XCAFDoc_GeomTolerance::SetObject (const Handle(XCAFDimTolObjects_GeomToleranceObject)& theObject)
100 //Label().ForForgetAllAttributes();
101 TDF_ChildIterator anIter(Label());
102 for(;anIter.More(); anIter.Next())
104 anIter.Value().ForgetAllAttributes();
107 Handle(TDataStd_Integer) aType = new TDataStd_Integer();
108 aType->Set(theObject->GetType());
109 Label().FindChild(ChildLab_Type).AddAttribute(aType);
111 if(theObject->GetTypeOfValue() != XCAFDimTolObjects_GeomToleranceTypeValue_None)
113 Handle(TDataStd_Integer) aTypeOfValue = new TDataStd_Integer();
114 aTypeOfValue->Set(theObject->GetTypeOfValue());
115 Label().FindChild(ChildLab_TypeOfValue).AddAttribute(aTypeOfValue);
118 Handle(TDataStd_Real) aValue = new TDataStd_Real();
119 aValue->Set(theObject->GetValue());
120 Label().FindChild(ChildLab_Value).AddAttribute(aValue);
122 Handle(TDataStd_Integer) aMatReqModif;
123 if(theObject->GetMaterialRequirementModifier() != XCAFDimTolObjects_GeomToleranceMatReqModif_None)
125 Label().FindChild(ChildLab_MatReqModif).FindAttribute(TDataStd_Integer::GetID(), aMatReqModif);
126 aMatReqModif = new TDataStd_Integer();
127 Label().FindChild(ChildLab_MatReqModif).AddAttribute(aMatReqModif);
128 aMatReqModif->Set(theObject->GetMaterialRequirementModifier());
131 if(theObject->GetZoneModifier() != XCAFDimTolObjects_GeomToleranceZoneModif_None)
133 Handle(TDataStd_Integer) aZoneModif = new TDataStd_Integer();
134 aZoneModif->Set(theObject->GetZoneModifier());
135 Label().FindChild(ChildLab_ZoneModif).AddAttribute(aZoneModif);
138 if(theObject->GetValueOfZoneModifier() > 0)
140 Handle(TDataStd_Real) aValueOfZoneModif = new TDataStd_Real();
141 aValueOfZoneModif->Set(theObject->GetValueOfZoneModifier());
142 Label().FindChild(ChildLab_ValueOfZoneModif).AddAttribute(aValueOfZoneModif);
145 if(theObject->GetModifiers().Length() > 0)
147 Handle(TDataStd_IntegerArray) aModifiers = new TDataStd_IntegerArray();
148 Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
149 for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
150 anArr->SetValue(i,theObject->GetModifiers().Value(i));
151 aModifiers->ChangeArray(anArr);
152 Label().FindChild(ChildLab_Modifiers).AddAttribute(aModifiers);
155 if(theObject->GetMaxValueModifier() > 0)
157 Handle(TDataStd_Real) aMaxValueModif = new TDataStd_Real();
158 aMaxValueModif->Set(theObject->GetMaxValueModifier());
159 Label().FindChild(ChildLab_aMaxValueModif).AddAttribute(aMaxValueModif);
162 if(theObject->HasAxis())
164 Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
165 Handle(TDataStd_RealArray) aN = new TDataStd_RealArray();
166 Handle(TDataStd_RealArray) aR = new TDataStd_RealArray();
167 gp_Ax2 anAx = theObject->GetAxis();
169 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
170 for (Standard_Integer i = 1; i <= 3; i++)
171 aLocArr->SetValue(i, anAx.Location().Coord(i));
172 aLoc->ChangeArray(aLocArr);
174 Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
175 for (Standard_Integer i = 1; i <= 3; i++)
176 aNArr->SetValue(i, anAx.Direction().Coord(i));
177 aN->ChangeArray(aNArr);
179 Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
180 for (Standard_Integer i = 1; i <= 3; i++)
181 aRArr->SetValue(i, anAx.XDirection().Coord(i));
182 aR->ChangeArray(aRArr);
184 Label().FindChild(ChildLab_AxisLoc).AddAttribute(aLoc);
185 Label().FindChild(ChildLab_AxisN).AddAttribute(aN);
186 Label().FindChild(ChildLab_AxisRef).AddAttribute(aR);
189 if (theObject->HasPlane())
191 Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
192 Handle(TDataStd_RealArray) aN = new TDataStd_RealArray();
193 Handle(TDataStd_RealArray) aR = new TDataStd_RealArray();
194 gp_Ax2 anAx = theObject->GetPlane();
196 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
197 for (Standard_Integer i = 1; i <= 3; i++)
198 aLocArr->SetValue(i, anAx.Location().Coord(i));
199 aLoc->ChangeArray(aLocArr);
201 Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
202 for (Standard_Integer i = 1; i <= 3; i++)
203 aNArr->SetValue(i, anAx.Direction().Coord(i));
204 aN->ChangeArray(aNArr);
206 Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
207 for (Standard_Integer i = 1; i <= 3; i++)
208 aRArr->SetValue(i, anAx.XDirection().Coord(i));
209 aR->ChangeArray(aRArr);
211 Label().FindChild(ChildLab_PlaneLoc).AddAttribute(aLoc);
212 Label().FindChild(ChildLab_PlaneN).AddAttribute(aN);
213 Label().FindChild(ChildLab_PlaneRef).AddAttribute(aR);
216 if (theObject->HasPoint())
218 Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
219 gp_Pnt aPnt = theObject->GetPoint();
221 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
222 for (Standard_Integer i = 1; i <= 3; i++)
223 aLocArr->SetValue(i, aPnt.Coord(i));
224 aLoc->ChangeArray(aLocArr);
226 Label().FindChild(ChildLab_Pnt).AddAttribute(aLoc);
229 if (theObject->HasPointText())
231 Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
232 gp_Pnt aPntText = theObject->GetPointTextAttach();
234 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
235 for (Standard_Integer i = 1; i <= 3; i++)
236 aLocArr->SetValue(i, aPntText.Coord(i));
237 aLoc->ChangeArray(aLocArr);
239 Label().FindChild(ChildLab_PntText).AddAttribute(aLoc);
242 TopoDS_Shape aPresentation = theObject->GetPresentation();
243 if( !aPresentation.IsNull())
245 TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
246 TNaming_Builder tnBuild(aLPres);
247 tnBuild.Generated(aPresentation);
248 Handle(TCollection_HAsciiString) aName = theObject->GetPresentationName();
249 if( !aName.IsNull() )
251 TCollection_ExtendedString str ( aName->String() );
252 TDataStd_Name::Set ( aLPres, str );
258 //=======================================================================
259 //function :GetObject
261 //=======================================================================
263 Handle(XCAFDimTolObjects_GeomToleranceObject) XCAFDoc_GeomTolerance::GetObject() const
265 Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = new XCAFDimTolObjects_GeomToleranceObject();
267 Handle(TDataStd_Integer) aType;
268 if(Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
270 anObj->SetType((XCAFDimTolObjects_GeomToleranceType)aType->Get());
273 Handle(TDataStd_Integer) aTypeOfValue;
274 if(Label().FindChild(ChildLab_TypeOfValue).FindAttribute(TDataStd_Integer::GetID(), aTypeOfValue))
276 anObj->SetTypeOfValue((XCAFDimTolObjects_GeomToleranceTypeValue)aTypeOfValue->Get());
279 Handle(TDataStd_Real) aValue;
280 if(Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_Real::GetID(), aValue))
282 anObj->SetValue(aValue->Get());
285 Handle(TDataStd_Integer) aMatReqModif;
286 if(Label().FindChild(ChildLab_MatReqModif).FindAttribute(TDataStd_Integer::GetID(), aMatReqModif))
288 anObj->SetMaterialRequirementModifier((XCAFDimTolObjects_GeomToleranceMatReqModif)aMatReqModif->Get());
291 Handle(TDataStd_Integer) aZoneModif;
292 if(Label().FindChild(ChildLab_ZoneModif).FindAttribute(TDataStd_Integer::GetID(), aZoneModif))
294 anObj->SetZoneModifier((XCAFDimTolObjects_GeomToleranceZoneModif)aZoneModif->Get());
297 Handle(TDataStd_Real) aValueOfZoneModif;
298 if(Label().FindChild(ChildLab_ValueOfZoneModif).FindAttribute(TDataStd_Real::GetID(), aValueOfZoneModif))
300 anObj->SetValueOfZoneModifier(aValueOfZoneModif->Get());
303 Handle(TDataStd_IntegerArray) anArr;
304 if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
305 && !anArr->Array().IsNull())
307 XCAFDimTolObjects_GeomToleranceModifiersSequence aModifiers;
308 for(Standard_Integer i = 1; i <= anArr->Length(); i++)
309 aModifiers.Append((XCAFDimTolObjects_GeomToleranceModif)anArr->Value(i));
310 anObj->SetModifiers(aModifiers);
313 Handle(TDataStd_Real) aMaxValueModif;
314 if(Label().FindChild(ChildLab_aMaxValueModif).FindAttribute(TDataStd_Real::GetID(), aMaxValueModif))
316 anObj->SetMaxValueModifier(aMaxValueModif->Get());
319 Handle(TDataStd_RealArray) aLoc;
320 Handle(TDataStd_RealArray) aN;
321 Handle(TDataStd_RealArray) aR;
322 if(Label().FindChild(ChildLab_AxisLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
323 Label().FindChild(ChildLab_AxisN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
324 Label().FindChild(ChildLab_AxisRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
326 gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
327 gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
328 gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
329 gp_Ax2 anAx(aL, aD, aDR);
330 anObj->SetAxis(anAx);
333 if(Label().FindChild(ChildLab_PlaneLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
334 Label().FindChild(ChildLab_PlaneN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
335 Label().FindChild(ChildLab_PlaneRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
337 gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
338 gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
339 gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
340 gp_Ax2 anAx(aL, aD, aDR);
341 anObj->SetPlane(anAx);
344 Handle(TDataStd_RealArray) aPnt;
345 if(Label().FindChild(ChildLab_Pnt).FindAttribute(TDataStd_RealArray::GetID(), aPnt) && aPnt->Length() == 3 )
347 gp_Pnt aP(aLoc->Value(aPnt->Lower()), aPnt->Value(aPnt->Lower()+1), aPnt->Value(aPnt->Lower()+2));
351 Handle(TDataStd_RealArray) aPntText;
352 if(Label().FindChild(ChildLab_PntText).FindAttribute(TDataStd_RealArray::GetID(), aPntText) && aPntText->Length() == 3 )
354 gp_Pnt aP(aPntText->Value(aPntText->Lower()), aPntText->Value(aPntText->Lower()+1), aPntText->Value(aPntText->Lower()+2));
355 anObj->SetPointTextAttach(aP);
358 Handle(TNaming_NamedShape) aNS;
359 TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
360 if ( aLPres.FindAttribute(TNaming_NamedShape::GetID(), aNS) )
363 TopoDS_Shape aPresentation = TNaming_Tool::GetShape(aNS);
364 if( !aPresentation.IsNull())
366 Handle(TDataStd_Name) aNameAtrr;
367 Handle(TCollection_HAsciiString) aPresentName;
368 if (aLPres.FindAttribute(TDataStd_Name::GetID(),aNameAtrr))
370 const TCollection_ExtendedString& aName = aNameAtrr->Get();
372 if( !aName.IsEmpty())
373 aPresentName = new TCollection_HAsciiString(aName);
376 anObj->SetPresentation(aPresentation, aPresentName);
383 //=======================================================================
386 //=======================================================================
388 const Standard_GUID& XCAFDoc_GeomTolerance::ID() const
393 //=======================================================================
396 //=======================================================================
398 void XCAFDoc_GeomTolerance::Restore(const Handle(TDF_Attribute)& /*With*/)
403 //=======================================================================
404 //function : NewEmpty
406 //=======================================================================
408 Handle(TDF_Attribute) XCAFDoc_GeomTolerance::NewEmpty() const
410 return new XCAFDoc_GeomTolerance();
414 //=======================================================================
417 //=======================================================================
419 void XCAFDoc_GeomTolerance::Paste(const Handle(TDF_Attribute)& /*Into*/,
420 const Handle(TDF_RelocationTable)& /*RT*/) const