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.
15 #include <Standard_GUID.hxx>
16 #include <Standard_Type.hxx>
17 #include <TCollection_HAsciiString.hxx>
18 #include <TDF_Attribute.hxx>
19 #include <TDF_Label.hxx>
20 #include <TDF_ChildIterator.hxx>
21 #include <TDF_RelocationTable.hxx>
22 #include <XCAFDoc_Datum.hxx>
23 #include <TDataStd_AsciiString.hxx>
24 #include <TDataStd_IntegerArray.hxx>
25 #include <TDataStd_RealArray.hxx>
26 #include <TDataStd_Integer.hxx>
27 #include <TDataStd_Real.hxx>
28 #include <TNaming_NamedShape.hxx>
29 #include <TNaming_Builder.hxx>
30 #include <TNaming_Tool.hxx>
31 #include <TDataStd_Name.hxx>
33 #include <XCAFDimTolObjects_DatumObject.hxx>
35 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_Datum,TDF_Attribute)
42 ChildLab_ModifierWithValue,
48 ChildLab_DTargetLength,
49 ChildLab_DTargetWidth,
50 ChildLab_DTargetNumber,
60 //=======================================================================
61 //function : XCAFDoc_Datum
63 //=======================================================================
64 XCAFDoc_Datum::XCAFDoc_Datum()
69 //=======================================================================
72 //=======================================================================
74 const Standard_GUID& XCAFDoc_Datum::GetID()
76 static Standard_GUID DID("58ed092e-44de-11d8-8776-001083004c77");
77 //static Standard_GUID ID("efd212e2-6dfd-11d4-b9c8-0060b0ee281b");
83 //=======================================================================
86 //=======================================================================
88 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel,
89 const Handle(TCollection_HAsciiString)& theName,
90 const Handle(TCollection_HAsciiString)& theDescription,
91 const Handle(TCollection_HAsciiString)& theIdentification)
93 Handle(XCAFDoc_Datum) aDatum;
94 if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
95 aDatum = new XCAFDoc_Datum();
96 theLabel.AddAttribute(aDatum);
98 aDatum->Set(theName,theDescription,theIdentification);
102 //=======================================================================
105 //=======================================================================
107 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel)
109 Handle(XCAFDoc_Datum) aDatum;
110 if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
111 aDatum = new XCAFDoc_Datum();
112 theLabel.AddAttribute(aDatum);
118 //=======================================================================
121 //=======================================================================
123 void XCAFDoc_Datum::Set(const Handle(TCollection_HAsciiString)& theName,
124 const Handle(TCollection_HAsciiString)& theDescription,
125 const Handle(TCollection_HAsciiString)& theIdentification)
129 myDescription = theDescription;
130 myIdentification = theIdentification;
134 //=======================================================================
137 //=======================================================================
139 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetName() const
142 return new TCollection_HAsciiString();
146 //=======================================================================
147 //function : GetDescriptio7n
149 //=======================================================================
151 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetDescription() const
153 return myDescription;
157 //=======================================================================
158 //function : GetIdentification
160 //=======================================================================
162 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetIdentification() const
164 return myIdentification;
167 //=======================================================================
168 //function : SetObject
170 //=======================================================================
172 void XCAFDoc_Datum::SetObject(const Handle(XCAFDimTolObjects_DatumObject)& theObject)
176 if (theObject->GetSemanticName())
178 TCollection_ExtendedString str(theObject->GetSemanticName()->String());
179 TDataStd_Name::Set(Label(), str);
182 TDF_ChildIterator anIter(Label());
183 for(;anIter.More(); anIter.Next())
185 anIter.Value().ForgetAllAttributes();
187 if (!theObject->GetName().IsNull() && !theObject->GetName()->IsEmpty())
188 Handle(TDataStd_AsciiString) anAttName = TDataStd_AsciiString::Set(Label().FindChild(ChildLab_Name),
189 theObject->GetName()->String());
191 Handle(TDataStd_Integer) aPosition = TDataStd_Integer::Set(Label().FindChild(ChildLab_Position),
192 theObject->GetPosition());
194 if(theObject->GetModifiers().Length() > 0)
196 Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
197 for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
198 anArr->SetValue(i,theObject->GetModifiers().Value(i));
199 Handle(TDataStd_IntegerArray) aModifiers = TDataStd_IntegerArray::Set(Label().FindChild(ChildLab_Modifiers),
200 1, theObject->GetModifiers().Length());
201 if(!aModifiers.IsNull())
202 aModifiers->ChangeArray(anArr);
205 XCAFDimTolObjects_DatumModifWithValue aM;
207 theObject->GetModifierWithValue(aM, aV);
208 if(aM != XCAFDimTolObjects_DatumModifWithValue_None)
210 Handle(TDataStd_Integer) aModifierWithValueM =
211 TDataStd_Integer::Set(Label().FindChild(ChildLab_ModifierWithValue), aM);
213 Handle(TDataStd_Real) aModifierWithValueV =
214 TDataStd_Real::Set(Label().FindChild(ChildLab_ModifierWithValue), aV);
217 Handle(TDataStd_Integer) aIsTarget = TDataStd_Integer::Set(Label().FindChild(ChildLab_IsDTarget),
218 theObject->IsDatumTarget());
220 if(theObject->IsDatumTarget())
222 Handle(TDataStd_Integer) aType = TDataStd_Integer::Set(Label().FindChild(ChildLab_DTargetType),
223 theObject->GetDatumTargetType());
225 if(theObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area)
227 if(!theObject->GetDatumTarget().IsNull())
229 TNaming_Builder tnBuild(Label().FindChild(ChildLab_DatumTarget));
230 tnBuild.Generated(theObject->GetDatumTarget());
233 else if (theObject->HasDatumTargetParams())
235 gp_Ax2 anAx = theObject->GetDatumTargetAxis();
236 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
237 for (Standard_Integer i = 1; i <= 3; i++)
238 aLocArr->SetValue(i, anAx.Location().Coord(i));
239 Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisLoc), 1, 3);
241 aLoc->ChangeArray(aLocArr);
243 Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
244 for (Standard_Integer i = 1; i <= 3; i++)
245 aNArr->SetValue(i, anAx.Direction().Coord(i));
246 Handle(TDataStd_RealArray) aN = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisN), 1, 3);
248 aN->ChangeArray(aNArr);
250 Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
251 for (Standard_Integer i = 1; i <= 3; i++)
252 aRArr->SetValue(i, anAx.XDirection().Coord(i));
253 Handle(TDataStd_RealArray) aR = TDataStd_RealArray::Set(Label().FindChild(ChildLab_AxisRef), 1, 3);
255 aR->ChangeArray(aRArr);
257 if(theObject->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
259 Handle(TDataStd_Real) aLen = TDataStd_Real::Set(Label().FindChild(ChildLab_DTargetLength),
260 theObject->GetDatumTargetLength());
261 if(theObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
262 Handle(TDataStd_Real) aWidth = TDataStd_Real::Set(Label().FindChild(ChildLab_DTargetWidth),
263 theObject->GetDatumTargetWidth());
266 Handle(TDataStd_Integer) aNum = TDataStd_Integer::Set(Label().FindChild(ChildLab_DTargetNumber),
267 theObject->GetDatumTargetNumber());
270 if (theObject->HasPlane())
272 gp_Ax2 anAx = theObject->GetPlane();
274 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
275 for (Standard_Integer i = 1; i <= 3; i++)
276 aLocArr->SetValue(i, anAx.Location().Coord(i));
277 Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneLoc), 1, 3);
279 aLoc->ChangeArray(aLocArr);
281 Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
282 for (Standard_Integer i = 1; i <= 3; i++)
283 aNArr->SetValue(i, anAx.Direction().Coord(i));
284 Handle(TDataStd_RealArray) aN = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneN), 1, 3);
286 aN->ChangeArray(aNArr);
288 Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
289 for (Standard_Integer i = 1; i <= 3; i++)
290 aRArr->SetValue(i, anAx.XDirection().Coord(i));
291 Handle(TDataStd_RealArray) aR = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PlaneRef), 1, 3);
293 aR->ChangeArray(aRArr);
296 if (theObject->HasPoint())
298 gp_Pnt aPnt = theObject->GetPoint();
300 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
301 for (Standard_Integer i = 1; i <= 3; i++)
302 aLocArr->SetValue(i, aPnt.Coord(i));
303 Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_Pnt), 1, 3);
305 aLoc->ChangeArray(aLocArr);
308 if (theObject->HasPointText())
310 gp_Pnt aPntText = theObject->GetPointTextAttach();
312 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
313 for (Standard_Integer i = 1; i <= 3; i++)
314 aLocArr->SetValue(i, aPntText.Coord(i));
315 Handle(TDataStd_RealArray) aLoc = TDataStd_RealArray::Set(Label().FindChild(ChildLab_PntText), 1, 3);
317 aLoc->ChangeArray(aLocArr);
320 TopoDS_Shape aPresentation = theObject->GetPresentation();
321 if( !aPresentation.IsNull())
323 TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
324 TNaming_Builder tnBuild(aLPres);
325 tnBuild.Generated(aPresentation);
326 Handle(TCollection_HAsciiString) aName = theObject->GetPresentationName();
327 if( !aName.IsNull() )
329 TCollection_ExtendedString str ( aName->String() );
330 TDataStd_Name::Set ( aLPres, str );
336 //=======================================================================
337 //function : GetObject
339 //=======================================================================
341 Handle(XCAFDimTolObjects_DatumObject) XCAFDoc_Datum::GetObject() const
343 Handle(XCAFDimTolObjects_DatumObject) anObj = new XCAFDimTolObjects_DatumObject();
345 Handle(TDataStd_Name) aSemanticNameAttr;
346 Handle(TCollection_HAsciiString) aSemanticName;
347 if (Label().FindAttribute(TDataStd_Name::GetID(), aSemanticNameAttr))
349 const TCollection_ExtendedString& aName = aSemanticNameAttr->Get();
350 if (!aName.IsEmpty())
351 aSemanticName = new TCollection_HAsciiString(aName);
353 anObj->SetSemanticName(aSemanticName);
355 Handle(TDataStd_AsciiString) anAttName;
356 if(Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
358 Handle(TCollection_HAsciiString) aStr = new TCollection_HAsciiString(anAttName->Get());
359 anObj->SetName(aStr);
362 Handle(TDataStd_IntegerArray) anArr;
363 if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
364 && !anArr->Array().IsNull())
366 XCAFDimTolObjects_DatumModifiersSequence aModifiers;
367 for(Standard_Integer i = 1; i <= anArr->Length(); i++)
368 aModifiers.Append((XCAFDimTolObjects_DatumSingleModif)anArr->Value(i));
369 anObj->SetModifiers(aModifiers);
372 Handle(TDataStd_Integer) aModifierWithValueM;
373 if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
375 Handle(TDataStd_Real) aModifierWithValueV;
376 if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
378 anObj->SetModifierWithValue((XCAFDimTolObjects_DatumModifWithValue)aModifierWithValueM->Get(),aModifierWithValueV->Get());
382 Handle(TDataStd_Integer) aPosition;
383 if(Label().FindChild(ChildLab_Position).FindAttribute(TDataStd_Integer::GetID(), aPosition))
385 anObj->SetPosition(aPosition->Get());
388 Handle(TDataStd_RealArray) aLoc, aN, aR;
389 if (Label().FindChild(ChildLab_PlaneLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
390 Label().FindChild(ChildLab_PlaneN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
391 Label().FindChild(ChildLab_PlaneRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3)
393 gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower() + 1), aLoc->Value(aLoc->Lower() + 2));
394 gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower() + 1), aN->Value(aN->Lower() + 2));
395 gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower() + 1), aR->Value(aR->Lower() + 2));
396 gp_Ax2 anAx(aL, aD, aDR);
397 anObj->SetPlane(anAx);
400 Handle(TDataStd_RealArray) aPnt;
401 if (Label().FindChild(ChildLab_Pnt).FindAttribute(TDataStd_RealArray::GetID(), aPnt) && aPnt->Length() == 3)
403 gp_Pnt aP(aLoc->Value(aPnt->Lower()), aPnt->Value(aPnt->Lower() + 1), aPnt->Value(aPnt->Lower() + 2));
407 Handle(TDataStd_RealArray) aPntText;
408 if (Label().FindChild(ChildLab_PntText).FindAttribute(TDataStd_RealArray::GetID(), aPntText) && aPntText->Length() == 3)
410 gp_Pnt aP(aPntText->Value(aPntText->Lower()), aPntText->Value(aPntText->Lower() + 1), aPntText->Value(aPntText->Lower() + 2));
411 anObj->SetPointTextAttach(aP);
414 Handle(TDataStd_Integer) aIsDTarget;
415 if(Label().FindChild(ChildLab_IsDTarget).FindAttribute(TDataStd_Integer::GetID(), aIsDTarget))
417 anObj->IsDatumTarget((aIsDTarget->Get() != 0));
424 if (aIsDTarget->Get() != 0)
426 Handle(TDataStd_Integer) aDTargetType;
427 if(Label().FindChild(ChildLab_DTargetType).FindAttribute(TDataStd_Integer::GetID(), aDTargetType))
429 anObj->SetDatumTargetType((XCAFDimTolObjects_DatumTargetType)aDTargetType->Get());
430 if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area)
432 Handle(TNaming_NamedShape) aDatumTarget;
433 if(Label().FindChild(ChildLab_DatumTarget).FindAttribute(TNaming_NamedShape::GetID(), aDatumTarget))
435 anObj->SetDatumTarget(aDatumTarget->Get());
440 if (Label().FindChild(ChildLab_AxisLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
441 Label().FindChild(ChildLab_AxisN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
442 Label().FindChild(ChildLab_AxisRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3)
444 gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower() + 1), aLoc->Value(aLoc->Lower() + 2));
445 gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower() + 1), aN->Value(aN->Lower() + 2));
446 gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower() + 1), aR->Value(aR->Lower() + 2));
447 gp_Ax2 anAx(aL, aD, aDR);
448 anObj->SetDatumTargetAxis(anAx);
451 if(anObj->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
453 Handle(TDataStd_Real) aLen;
454 if(Label().FindChild(ChildLab_DTargetLength).FindAttribute(TDataStd_Real::GetID(), aLen))
456 anObj->SetDatumTargetLength(aLen->Get());
458 if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
460 Handle(TDataStd_Real) aWidth;
461 if(Label().FindChild(ChildLab_DTargetWidth).FindAttribute(TDataStd_Real::GetID(), aWidth))
463 anObj->SetDatumTargetWidth(aWidth->Get());
469 Handle(TDataStd_Integer) aNum;
470 if(Label().FindChild(ChildLab_DTargetNumber).FindAttribute(TDataStd_Integer::GetID(), aNum))
472 anObj->SetDatumTargetNumber(aNum->Get());
476 anObj->SetDatumTargetNumber(0);
480 Handle(TNaming_NamedShape) aNS;
481 TDF_Label aLPres = Label().FindChild( ChildLab_Presentation);
482 if ( aLPres.FindAttribute(TNaming_NamedShape::GetID(), aNS) )
485 TopoDS_Shape aPresentation = TNaming_Tool::GetShape(aNS);
486 if( !aPresentation.IsNull())
488 Handle(TDataStd_Name) aNameAtrr;
489 Handle(TCollection_HAsciiString) aPresentName;
490 if (aLPres.FindAttribute(TDataStd_Name::GetID(),aNameAtrr))
492 const TCollection_ExtendedString& aName = aNameAtrr->Get();
494 if( !aName.IsEmpty())
495 aPresentName = new TCollection_HAsciiString(aName);
498 anObj->SetPresentation(aPresentation, aPresentName);
504 //=======================================================================
507 //=======================================================================
509 const Standard_GUID& XCAFDoc_Datum::ID() const
515 //=======================================================================
518 //=======================================================================
520 void XCAFDoc_Datum::Restore(const Handle(TDF_Attribute)& theWith)
522 myName = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetName();
523 myDescription = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetDescription();
524 myIdentification = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetIdentification();
528 //=======================================================================
529 //function : NewEmpty
531 //=======================================================================
533 Handle(TDF_Attribute) XCAFDoc_Datum::NewEmpty() const
535 return new XCAFDoc_Datum();
539 //=======================================================================
542 //=======================================================================
544 void XCAFDoc_Datum::Paste(const Handle(TDF_Attribute)& theInto,
545 const Handle(TDF_RelocationTable)& /*RT*/) const
547 Handle(XCAFDoc_Datum)::DownCast(theInto)->Set(myName,myDescription,myIdentification);