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 |
30 | IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_GeomTolerance,TDF_Attribute) |
31 | |
9ebaae37 |
32 | enum 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 | |
58 | XCAFDoc_GeomTolerance::XCAFDoc_GeomTolerance() |
59 | { |
60 | } |
61 | |
62 | |
63 | //======================================================================= |
64 | //function : GetID |
65 | //purpose : |
66 | //======================================================================= |
67 | |
68 | const 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 | |
81 | Handle(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 | |
96 | void 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 | |
243 | Handle(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 | |
368 | const Standard_GUID& XCAFDoc_GeomTolerance::ID() const |
369 | { |
370 | return GetID(); |
371 | } |
372 | |
373 | //======================================================================= |
374 | //function : Restore |
375 | //purpose : |
376 | //======================================================================= |
377 | |
378 | void XCAFDoc_GeomTolerance::Restore(const Handle(TDF_Attribute)& /*With*/) |
379 | { |
380 | } |
381 | |
382 | |
383 | //======================================================================= |
384 | //function : NewEmpty |
385 | //purpose : |
386 | //======================================================================= |
387 | |
388 | Handle(TDF_Attribute) XCAFDoc_GeomTolerance::NewEmpty() const |
389 | { |
390 | return new XCAFDoc_GeomTolerance(); |
391 | } |
392 | |
393 | |
394 | //======================================================================= |
395 | //function : Paste |
396 | //purpose : |
397 | //======================================================================= |
398 | |
399 | void XCAFDoc_GeomTolerance::Paste(const Handle(TDF_Attribute)& /*Into*/, |
400 | const Handle(TDF_RelocationTable)& /*RT*/) const |
401 | { |
402 | } |