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_ExtStringArray.hxx>
25 #include <TDataStd_Real.hxx>
26 #include <TDataStd_RealArray.hxx>
27 #include <TNaming_Builder.hxx>
28 #include <TNaming_NamedShape.hxx>
29 #include <TColStd_HArray1OfReal.hxx>
30 #include <TopoDS.hxx>
31 #include <XCAFDimTolObjects_DimensionObject.hxx>
32 #include <TNaming_Tool.hxx>
33 #include <TDataStd_Name.hxx>
34
35 IMPLEMENT_DERIVED_ATTRIBUTE(XCAFDoc_Dimension,TDataStd_GenericEmpty)
36 enum ChildLab
37 {
38 ChildLab_Type = 1,
39 ChildLab_Value,
40 ChildLab_Qualifier,
41 ChildLab_Class,
42 ChildLab_Dec,
43 ChildLab_Modifiers,
44 ChildLab_Path,
45 ChildLab_Dir,
46 ChildLab_Pnt1,
47 ChildLab_Pnt2,
48 ChildLab_PlaneLoc,
49 ChildLab_PlaneN,
50 ChildLab_PlaneRef,
51 ChildLab_PntText,
52 ChildLab_Presentation,
53 ChildLab_Descriptions,
54 ChildLab_DescriptionNames
55 };
56
57 //=======================================================================
58 //function : XCAFDoc_Dimension
59 //purpose :
60 //=======================================================================
61
XCAFDoc_Dimension()62 XCAFDoc_Dimension::XCAFDoc_Dimension()
63 {
64 }
65
66
67 //=======================================================================
68 //function : GetID
69 //purpose :
70 //=======================================================================
71
GetID()72 const Standard_GUID& XCAFDoc_Dimension::GetID()
73 {
74 static Standard_GUID DGTID ("58ed092c-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 : Set
82 //purpose :
83 //=======================================================================
Handle(XCAFDoc_Dimension)84 Handle(XCAFDoc_Dimension) XCAFDoc_Dimension::Set(const TDF_Label& theLabel)
85 {
86 Handle(XCAFDoc_Dimension) A;
87 if (!theLabel.FindAttribute(XCAFDoc_Dimension::GetID(), A)) {
88 A = new XCAFDoc_Dimension();
89 theLabel.AddAttribute(A);
90 }
91 return A;
92 }
93
94 //=======================================================================
95 //function : SetObject
96 //purpose :
97 //=======================================================================
SetObject(const Handle (XCAFDimTolObjects_DimensionObject)& theObject)98 void XCAFDoc_Dimension::SetObject (const Handle(XCAFDimTolObjects_DimensionObject)& theObject)
99 {
100 Backup();
101
102 if (theObject->GetSemanticName())
103 {
104 TCollection_ExtendedString str(theObject->GetSemanticName()->String());
105 TDataStd_Name::Set(Label(), str);
106 }
107
108 TDF_ChildIterator anIter(Label());
109 for(;anIter.More(); anIter.Next())
110 {
111 anIter.Value().ForgetAllAttributes();
112 }
113 Handle(TDataStd_Integer) aType = TDataStd_Integer::Set(Label().FindChild(ChildLab_Type), theObject->GetType());
114
115 if(!theObject->GetValues().IsNull())
116 {
117 Handle(TDataStd_RealArray) aVal = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Value), theObject->GetValues()->Lower(),
118 theObject->GetValues()->Lower() + theObject->GetValues()->Length() - 1);
119 if(!aVal.IsNull())
120 aVal->ChangeArray(theObject->GetValues());
121 }
122
123 Handle(TDataStd_Integer) aQualifier = TDataStd_Integer::Set(Label().FindChild(ChildLab_Qualifier), theObject->GetQualifier());
124
125 Standard_Boolean aH;
126 XCAFDimTolObjects_DimensionFormVariance aF;
127 XCAFDimTolObjects_DimensionGrade aG;
128 theObject->GetClassOfTolerance(aH,aF,aG);
129 Handle(TColStd_HArray1OfInteger) anArrI;
130 if(aF != XCAFDimTolObjects_DimensionFormVariance_None)
131 {
132 anArrI = new TColStd_HArray1OfInteger(1,3);
133 anArrI->SetValue(1,aH);
134 anArrI->SetValue(2,aF);
135 anArrI->SetValue(3,aG);
136 Handle(TDataStd_IntegerArray) aClass = TDataStd_IntegerArray::Set(Label().FindChild(ChildLab_Class), 1, 3);
137 if(!aClass.IsNull())
138 aClass->ChangeArray(anArrI);
139 }
140
141 Standard_Integer aL, aR;
142 theObject->GetNbOfDecimalPlaces(aL, aR);
143 if (aL > 0 || aR > 0)
144 {
145 anArrI = new TColStd_HArray1OfInteger(1,2);
146 anArrI->SetValue(1,aL);
147 anArrI->SetValue(2,aR);
148 Handle(TDataStd_IntegerArray) aDec = TDataStd_IntegerArray::Set(Label().FindChild(ChildLab_Dec), 1, 2);
149 if(!aDec.IsNull())
150 aDec->ChangeArray(anArrI);
151 }
152
153 if(theObject->GetModifiers().Length() > 0)
154 {
155 anArrI = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
156 for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
157 anArrI->SetValue(i,theObject->GetModifiers().Value(i));
158 Handle(TDataStd_IntegerArray) aModifiers = TDataStd_IntegerArray::Set(Label().FindChild(ChildLab_Modifiers),
159 1, theObject->GetModifiers().Length());
160 if(!aModifiers.IsNull())
161 aModifiers->ChangeArray(anArrI);
162 }
163
164 if(!theObject->GetPath().IsNull())
165 {
166 TNaming_Builder tnBuild(Label().FindChild(ChildLab_Path));
167 tnBuild.Generated(theObject->GetPath());
168 }
169
170 Handle(TColStd_HArray1OfReal) anArrR;
171 if(theObject->GetType() == XCAFDimTolObjects_DimensionType_Location_Oriented)
172 {
173 gp_Dir aD;
174 theObject->GetDirection(aD);
175 anArrR = new TColStd_HArray1OfReal(1, 3);
176 anArrR->SetValue(1, aD.X());
177 anArrR->SetValue(2, aD.Y());
178 anArrR->SetValue(3, aD.Z());
179 Handle(TDataStd_RealArray) aDir = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Dir), 1, 3);
180 if (!aDir.IsNull())
181 aDir->ChangeArray(anArrR);
182 }
183
184 if (theObject->HasPoint())
185 {
186 gp_Pnt aPnt1 = theObject->GetPoint();
187
188 Handle(TColStd_HArray1OfReal) aPntArr = new TColStd_HArray1OfReal(1, 3);
189 for (Standard_Integer i = 1; i <= 3; i++)
190 aPntArr->SetValue(i, aPnt1.Coord(i));
191 Handle(TDataStd_RealArray) aPnt = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Pnt1), 1, 3);
192 if (!aPnt.IsNull())
193 aPnt->ChangeArray(aPntArr);
194 }
195
196 if (theObject->HasPoint2())
197 {
198 gp_Pnt aPnt2 = theObject->GetPoint2();
199
200 Handle(TColStd_HArray1OfReal) aPntArr = new TColStd_HArray1OfReal(1, 3);
201 for (Standard_Integer i = 1; i <= 3; i++)
202 aPntArr->SetValue(i, aPnt2.Coord(i));
203 Handle(TDataStd_RealArray) aPnt = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Pnt2), 1, 3);
204 if (!aPnt.IsNull())
205 aPnt->ChangeArray(aPntArr);
206 }
207
208 if (theObject->HasPlane())
209 {
210 gp_Ax2 anAx = theObject->GetPlane();
211
212 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
213 for (Standard_Integer i = 1; i <= 3; i++)
214 aLocArr->SetValue(i, anAx.Location().Coord(i));
215 Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneLoc), 1, 3);
216 if (!aLoc.IsNull())
217 aLoc->ChangeArray(aLocArr);
218
219 Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
220 for (Standard_Integer i = 1; i <= 3; i++)
221 aNArr->SetValue(i, anAx.Direction().Coord(i));
222 Handle(TDataStd_RealArray) aN = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneN), 1, 3);
223 if (!aN.IsNull())
224 aN->ChangeArray(aNArr);
225
226 Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
227 for (Standard_Integer i = 1; i <= 3; i++)
228 aRArr->SetValue(i, anAx.XDirection().Coord(i));
229 Handle(TDataStd_RealArray) aRAtt = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneRef), 1, 3);
230 if (!aRAtt.IsNull())
231 aRAtt->ChangeArray(aRArr);
232 }
233
234 if (theObject->HasTextPoint())
235 {
236 gp_Pnt aPntText = theObject->GetPointTextAttach();
237
238 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
239 for (Standard_Integer i = 1; i <= 3; i++)
240 aLocArr->SetValue(i, aPntText.Coord(i));
241 Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PntText), 1, 3);
242 if (!aLoc.IsNull())
243 aLoc->ChangeArray(aLocArr);
244 }
245
246 TopoDS_Shape aPresentation = theObject->GetPresentation();
247 if( !aPresentation.IsNull())
248 {
249 TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
250 TNaming_Builder tnBuild(aLPres);
251 tnBuild.Generated(aPresentation);
252 Handle(TCollection_HAsciiString) aName = theObject->GetPresentationName();
253 if( !aName.IsNull() )
254 {
255 TCollection_ExtendedString str ( aName->String() );
256 TDataStd_Name::Set ( aLPres, str );
257 }
258 }
259
260 if (theObject->HasDescriptions())
261 {
262 Handle(TColStd_HArray1OfExtendedString) aDescrArr = new TColStd_HArray1OfExtendedString(1, theObject->NbDescriptions());
263 Handle(TColStd_HArray1OfExtendedString) aDescrNameArr = new TColStd_HArray1OfExtendedString(1, theObject->NbDescriptions());
264 for (Standard_Integer i = 0; i < theObject->NbDescriptions(); i++) {
265 TCollection_ExtendedString aDescr(theObject->GetDescription(i)->String());
266 aDescrArr->SetValue(i + 1, aDescr);
267 TCollection_ExtendedString aDescrName(theObject->GetDescriptionName(i)->String());
268 aDescrNameArr->SetValue(i + 1, aDescrName);
269 }
270 Handle(TDataStd_ExtStringArray) aDescriptions = TDataStd_ExtStringArray::Set(Label().FindChild(ChildLab_Descriptions),
271 1, theObject->NbDescriptions());
272 Handle(TDataStd_ExtStringArray) aDescriptionNames = TDataStd_ExtStringArray::Set(Label().FindChild(ChildLab_DescriptionNames),
273 1, theObject->NbDescriptions());
274 if(!aDescriptions.IsNull())
275 aDescriptions->ChangeArray(aDescrArr);
276 if(!aDescriptionNames.IsNull())
277 aDescriptionNames->ChangeArray(aDescrNameArr);
278 }
279 }
280
281 //=======================================================================
282 //function : GetObject
283 //purpose :
284 //=======================================================================
Handle(XCAFDimTolObjects_DimensionObject)285 Handle(XCAFDimTolObjects_DimensionObject) XCAFDoc_Dimension::GetObject() const
286 {
287 Handle(XCAFDimTolObjects_DimensionObject) anObj = new XCAFDimTolObjects_DimensionObject();
288
289 Handle(TDataStd_Name) aSemanticNameAttr;
290 Handle(TCollection_HAsciiString) aSemanticName;
291 if (Label().FindAttribute(TDataStd_Name::GetID(), aSemanticNameAttr))
292 {
293 const TCollection_ExtendedString& aName = aSemanticNameAttr->Get();
294 if (!aName.IsEmpty())
295 aSemanticName = new TCollection_HAsciiString(aName);
296 }
297 anObj->SetSemanticName(aSemanticName);
298
299 Handle(TDataStd_Integer) aType;
300 if(Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
301 {
302 anObj->SetType((XCAFDimTolObjects_DimensionType)aType->Get());
303 }
304
305 Handle(TDataStd_RealArray) aVal;
306 if(Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_RealArray::GetID(), aVal)
307 && !aVal->Array().IsNull())
308 {
309 anObj->SetValues(aVal->Array());
310 }
311
312 Handle(TDataStd_Integer) aQualifier;
313 if(Label().FindChild(ChildLab_Qualifier).FindAttribute(TDataStd_Integer::GetID(), aQualifier))
314 {
315 anObj->SetQualifier((XCAFDimTolObjects_DimensionQualifier)aQualifier->Get());
316 }
317
318 Handle(TDataStd_IntegerArray) aClass;
319 if(Label().FindChild(ChildLab_Class).FindAttribute(TDataStd_IntegerArray::GetID(), aClass)
320 && !aClass->Array().IsNull() && aClass->Array()->Length() > 0)
321 {
322 anObj->SetClassOfTolerance(aClass->Array()->Value(1) != 0, (XCAFDimTolObjects_DimensionFormVariance)aClass->Array()->Value(2), (XCAFDimTolObjects_DimensionGrade)aClass->Array()->Value(3));
323 }
324
325 Handle(TDataStd_IntegerArray) aDec;
326 if(Label().FindChild(ChildLab_Dec).FindAttribute(TDataStd_IntegerArray::GetID(), aDec)
327 && !aDec->Array().IsNull() && aDec->Array()->Length() > 0)
328 {
329 anObj->SetNbOfDecimalPlaces(aDec->Array()->Value(1), aDec->Array()->Value(2));
330 }
331
332 Handle(TDataStd_IntegerArray) aModifiers;
333 if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), aModifiers)
334 && !aModifiers->Array().IsNull())
335 {
336 XCAFDimTolObjects_DimensionModifiersSequence aM;
337 for(Standard_Integer i = 1; i <= aModifiers->Array()->Length(); i++)
338 aM.Append((XCAFDimTolObjects_DimensionModif)aModifiers->Array()->Value(i));
339 anObj->SetModifiers(aM);
340 }
341
342 Handle(TNaming_NamedShape) aShape;
343 if(Label().FindChild(ChildLab_Path).FindAttribute(TNaming_NamedShape::GetID(), aShape)
344 && !aShape.IsNull())
345 {
346 anObj->SetPath(TopoDS::Edge(aShape->Get()));
347 }
348
349 Handle(TDataStd_RealArray) aDir;
350 if (Label().FindChild(ChildLab_Dir).FindAttribute(TDataStd_RealArray::GetID(), aDir)
351 && !aDir->Array().IsNull() && aDir->Array()->Length() > 0)
352 {
353 gp_Dir aD(aDir->Array()->Value(1), aDir->Array()->Value(2), aDir->Array()->Value(3));
354 anObj->SetDirection(aD);
355 }
356
357 Handle(TDataStd_RealArray) aPnt1;
358 if (Label().FindChild(ChildLab_Pnt1).FindAttribute(TDataStd_RealArray::GetID(), aPnt1) && aPnt1->Length() == 3)
359 {
360 gp_Pnt aP(aPnt1->Value(aPnt1->Lower()), aPnt1->Value(aPnt1->Lower() + 1), aPnt1->Value(aPnt1->Lower() + 2));
361 anObj->SetPoint(aP);
362 }
363
364 Handle(TDataStd_RealArray) aPnt2;
365 if (Label().FindChild(ChildLab_Pnt2).FindAttribute(TDataStd_RealArray::GetID(), aPnt2) && aPnt2->Length() == 3)
366 {
367 gp_Pnt aP(aPnt2->Value(aPnt2->Lower()), aPnt2->Value(aPnt2->Lower() + 1), aPnt2->Value(aPnt2->Lower() + 2));
368 anObj->SetPoint2(aP);
369 }
370
371
372 Handle(TDataStd_RealArray) aLoc, aN, aR;
373 if (Label().FindChild(ChildLab_PlaneLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
374 Label().FindChild(ChildLab_PlaneN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
375 Label().FindChild(ChildLab_PlaneRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3)
376 {
377 gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower() + 1), aLoc->Value(aLoc->Lower() + 2));
378 gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower() + 1), aN->Value(aN->Lower() + 2));
379 gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower() + 1), aR->Value(aR->Lower() + 2));
380 gp_Ax2 anAx(aL, aD, aDR);
381 anObj->SetPlane(anAx);
382 }
383
384 Handle(TDataStd_RealArray) aPntText;
385 if (Label().FindChild(ChildLab_PntText).FindAttribute(TDataStd_RealArray::GetID(), aPntText) && aPntText->Length() == 3)
386 {
387 gp_Pnt aP(aPntText->Value(aPntText->Lower()), aPntText->Value(aPntText->Lower() + 1), aPntText->Value(aPntText->Lower() + 2));
388 anObj->SetPointTextAttach(aP);
389 }
390
391 Handle(TNaming_NamedShape) aNS;
392 TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
393 if ( aLPres.FindAttribute(TNaming_NamedShape::GetID(), aNS) )
394 {
395 TopoDS_Shape aPresentation = TNaming_Tool::GetShape(aNS);
396 if( !aPresentation.IsNull())
397 {
398 Handle(TDataStd_Name) aNameAtrr;
399 Handle(TCollection_HAsciiString) aPresentName;
400 if (aLPres.FindAttribute(TDataStd_Name::GetID(),aNameAtrr))
401 {
402 const TCollection_ExtendedString& aName = aNameAtrr->Get();
403 if( !aName.IsEmpty())
404 aPresentName = new TCollection_HAsciiString(aName);
405 }
406 anObj->SetPresentation(aPresentation, aPresentName);
407 }
408 }
409
410 Handle(TDataStd_ExtStringArray) aDescriptions, aDescriptionNames;
411 if (Label().FindChild(ChildLab_Descriptions).FindAttribute(TDataStd_ExtStringArray::GetID(), aDescriptions) &&
412 Label().FindChild(ChildLab_DescriptionNames).FindAttribute(TDataStd_ExtStringArray::GetID(), aDescriptionNames)) {
413 for (Standard_Integer i = 1; i <= aDescriptions->Length(); i++) {
414 Handle(TCollection_HAsciiString) aDescription, aDescriptionName;
415 aDescription = new TCollection_HAsciiString(TCollection_AsciiString(aDescriptions->Value(i)));
416 aDescriptionName = new TCollection_HAsciiString(TCollection_AsciiString(aDescriptionNames->Value(i)));
417 anObj->AddDescription(aDescription, aDescriptionName);
418 }
419 }
420 return anObj;
421 }
422
423 //=======================================================================
424 //function : ID
425 //purpose :
426 //=======================================================================
427
ID() const428 const Standard_GUID& XCAFDoc_Dimension::ID() const
429 {
430 return GetID();
431 }
432
433 //=======================================================================
434 //function : DumpJson
435 //purpose :
436 //=======================================================================
DumpJson(Standard_OStream & theOStream,Standard_Integer theDepth) const437 void XCAFDoc_Dimension::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
438 {
439 OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
440
441 OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDataStd_GenericEmpty)
442
443 Handle(XCAFDimTolObjects_DimensionObject) anObject = GetObject();
444 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, anObject.get())
445 }
446