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