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>
32 #include <XCAFDimTolObjects_DatumObject.hxx>
34 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_Datum,TDF_Attribute)
41 ChildLab_ModifierWithValue,
47 ChildLab_DTargetLength,
48 ChildLab_DTargetWidth,
49 ChildLab_DTargetNumber,
53 //=======================================================================
54 //function : XCAFDoc_Datum
56 //=======================================================================
57 XCAFDoc_Datum::XCAFDoc_Datum()
62 //=======================================================================
65 //=======================================================================
67 const Standard_GUID& XCAFDoc_Datum::GetID()
69 static Standard_GUID DID("58ed092e-44de-11d8-8776-001083004c77");
70 //static Standard_GUID ID("efd212e2-6dfd-11d4-b9c8-0060b0ee281b");
76 //=======================================================================
79 //=======================================================================
81 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel,
82 const Handle(TCollection_HAsciiString)& theName,
83 const Handle(TCollection_HAsciiString)& theDescription,
84 const Handle(TCollection_HAsciiString)& theIdentification)
86 Handle(XCAFDoc_Datum) aDatum;
87 if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
88 aDatum = new XCAFDoc_Datum();
89 theLabel.AddAttribute(aDatum);
91 aDatum->Set(theName,theDescription,theIdentification);
95 //=======================================================================
98 //=======================================================================
100 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel)
102 Handle(XCAFDoc_Datum) aDatum;
103 if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
104 aDatum = new XCAFDoc_Datum();
105 theLabel.AddAttribute(aDatum);
111 //=======================================================================
114 //=======================================================================
116 void XCAFDoc_Datum::Set(const Handle(TCollection_HAsciiString)& theName,
117 const Handle(TCollection_HAsciiString)& theDescription,
118 const Handle(TCollection_HAsciiString)& theIdentification)
122 myDescription = theDescription;
123 myIdentification = theIdentification;
127 //=======================================================================
130 //=======================================================================
132 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetName() const
135 return new TCollection_HAsciiString();
139 //=======================================================================
140 //function : GetDescriptio7n
142 //=======================================================================
144 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetDescription() const
146 return myDescription;
150 //=======================================================================
151 //function : GetIdentification
153 //=======================================================================
155 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetIdentification() const
157 return myIdentification;
160 //=======================================================================
161 //function : SetObject
163 //=======================================================================
165 void XCAFDoc_Datum::SetObject(const Handle(XCAFDimTolObjects_DatumObject)& theObject)
168 TDF_ChildIterator anIter(Label());
169 for(;anIter.More(); anIter.Next())
171 anIter.Value().ForgetAllAttributes();
173 if (!theObject->GetName().IsNull() && !theObject->GetName()->IsEmpty())
175 Handle(TDataStd_AsciiString) anAttName;
176 if(!Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
178 anAttName = new TDataStd_AsciiString();
179 Label().FindChild(ChildLab_Name).AddAttribute(anAttName);
181 anAttName->Set(theObject->GetName()->String());
184 Handle(TDataStd_Integer) aPosition = new TDataStd_Integer();
185 aPosition->Set(theObject->GetPosition());
186 Label().FindChild(ChildLab_Position).AddAttribute(aPosition);
188 if(theObject->GetModifiers().Length() > 0)
190 Handle(TDataStd_IntegerArray) aModifiers;
191 if(!Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), aModifiers))
193 aModifiers = new TDataStd_IntegerArray();
194 Label().FindChild(ChildLab_Modifiers).AddAttribute(aModifiers);
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 aModifiers->ChangeArray(anArr);
202 XCAFDimTolObjects_DatumModifWithValue aM;
204 theObject->GetModifierWithValue(aM, aV);
205 if(aM != XCAFDimTolObjects_DatumModifWithValue_None)
207 Handle(TDataStd_Integer) aModifierWithValueM;
208 if(!Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
210 aModifierWithValueM = new TDataStd_Integer();
211 Label().FindChild(ChildLab_ModifierWithValue).AddAttribute(aModifierWithValueM);
213 Handle(TDataStd_Real) aModifierWithValueV;
214 if(!Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
216 aModifierWithValueV = new TDataStd_Real();
217 Label().FindChild(ChildLab_ModifierWithValue).AddAttribute(aModifierWithValueV);
219 aModifierWithValueM->Set(aM);
220 aModifierWithValueV->Set(aV);
223 Handle(TDataStd_Integer) aIsTarget = new TDataStd_Integer();
224 aIsTarget->Set(theObject->IsDatumTarget());
225 Label().FindChild(ChildLab_IsDTarget).AddAttribute(aIsTarget);
227 if(theObject->IsDatumTarget())
229 Handle(TDataStd_Integer) aType = new TDataStd_Integer();
230 aType->Set(theObject->GetDatumTargetType());
231 Label().FindChild(ChildLab_DTargetType).AddAttribute(aType);
233 if(theObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area)
235 if(!theObject->GetDatumTarget().IsNull())
237 TNaming_Builder tnBuild(Label().FindChild(ChildLab_DatumTarget));
238 tnBuild.Generated(theObject->GetDatumTarget());
243 Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
244 Handle(TDataStd_RealArray) aN = new TDataStd_RealArray();
245 Handle(TDataStd_RealArray) aR = new TDataStd_RealArray();
246 gp_Ax2 anAx = theObject->GetDatumTargetAxis();
248 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
249 for (Standard_Integer i = 1; i <= 3; i++)
250 aLocArr->SetValue(i, anAx.Location().Coord(i));
251 aLoc->ChangeArray(aLocArr);
253 Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
254 for (Standard_Integer i = 1; i <= 3; i++)
255 aNArr->SetValue(i, anAx.Direction().Coord(i));
256 aN->ChangeArray(aNArr);
258 Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
259 for (Standard_Integer i = 1; i <= 3; i++)
260 aRArr->SetValue(i, anAx.XDirection().Coord(i));
261 aR->ChangeArray(aRArr);
263 Label().FindChild(ChildLab_AxisLoc).AddAttribute(aLoc);
264 Label().FindChild(ChildLab_AxisN).AddAttribute(aN);
265 Label().FindChild(ChildLab_AxisRef).AddAttribute(aR);
267 if(theObject->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
269 Handle(TDataStd_Real) aLen = new TDataStd_Real();
270 aLen->Set(theObject->GetDatumTargetLength());
271 Label().FindChild(ChildLab_DTargetLength).AddAttribute(aLen);
272 if(theObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
274 Handle(TDataStd_Real) aWidth = new TDataStd_Real();
275 aWidth->Set(theObject->GetDatumTargetWidth());
276 Label().FindChild(ChildLab_DTargetWidth).AddAttribute(aWidth);
280 Handle(TDataStd_Integer) aNum = new TDataStd_Integer();
281 aNum->Set(theObject->GetDatumTargetNumber());
282 Label().FindChild(ChildLab_DTargetNumber).AddAttribute(aNum);
286 //=======================================================================
287 //function : GetObject
289 //=======================================================================
291 Handle(XCAFDimTolObjects_DatumObject) XCAFDoc_Datum::GetObject() const
293 Handle(XCAFDimTolObjects_DatumObject) anObj = new XCAFDimTolObjects_DatumObject();
295 Handle(TDataStd_AsciiString) anAttName;
296 if(Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
298 Handle(TCollection_HAsciiString) aStr = new TCollection_HAsciiString(anAttName->Get());
299 anObj->SetName(aStr);
302 Handle(TDataStd_IntegerArray) anArr;
303 if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
304 && !anArr->Array().IsNull())
306 XCAFDimTolObjects_DatumModifiersSequence aModifiers;
307 for(Standard_Integer i = 1; i <= anArr->Length(); i++)
308 aModifiers.Append((XCAFDimTolObjects_DatumSingleModif)anArr->Value(i));
309 anObj->SetModifiers(aModifiers);
312 Handle(TDataStd_Integer) aModifierWithValueM;
313 if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
315 Handle(TDataStd_Real) aModifierWithValueV;
316 if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
318 anObj->SetModifierWithValue((XCAFDimTolObjects_DatumModifWithValue)aModifierWithValueM->Get(),aModifierWithValueV->Get());
322 Handle(TDataStd_Integer) aPosition;
323 if(Label().FindChild(ChildLab_Position).FindAttribute(TDataStd_Integer::GetID(), aPosition))
325 anObj->SetPosition(aPosition->Get());
328 Handle(TDataStd_Integer) aIsDTarget;
329 if(Label().FindChild(ChildLab_IsDTarget).FindAttribute(TDataStd_Integer::GetID(), aIsDTarget))
331 anObj->IsDatumTarget((aIsDTarget->Get() != 0));
338 if (aIsDTarget->Get() != 0)
340 Handle(TDataStd_Integer) aDTargetType;
341 if(Label().FindChild(ChildLab_DTargetType).FindAttribute(TDataStd_Integer::GetID(), aDTargetType))
343 anObj->SetDatumTargetType((XCAFDimTolObjects_DatumTargetType)aDTargetType->Get());
344 if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area)
346 Handle(TNaming_NamedShape) aDatumTarget;
347 if(Label().FindChild(ChildLab_DatumTarget).FindAttribute(TNaming_NamedShape::GetID(), aDatumTarget))
349 anObj->SetDatumTarget(aDatumTarget->Get());
354 Handle(TDataStd_RealArray) aLoc;
355 Handle(TDataStd_RealArray) aN;
356 Handle(TDataStd_RealArray) aR;
357 if(Label().FindChild(ChildLab_AxisLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
358 Label().FindChild(ChildLab_AxisN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
359 Label().FindChild(ChildLab_AxisRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
361 gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
362 gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
363 gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
364 gp_Ax2 anAx(aL, aD, aDR);
365 anObj->SetDatumTargetAxis(anAx);
368 if(anObj->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
370 Handle(TDataStd_Real) aLen;
371 if(Label().FindChild(ChildLab_DTargetLength).FindAttribute(TDataStd_Real::GetID(), aLen))
373 anObj->SetDatumTargetLength(aLen->Get());
375 if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
377 Handle(TDataStd_Real) aWidth;
378 if(Label().FindChild(ChildLab_DTargetWidth).FindAttribute(TDataStd_Real::GetID(), aWidth))
380 anObj->SetDatumTargetWidth(aWidth->Get());
386 Handle(TDataStd_Integer) aNum;
387 if(Label().FindChild(ChildLab_DTargetNumber).FindAttribute(TDataStd_Integer::GetID(), aNum))
389 anObj->SetDatumTargetNumber(aNum->Get());
393 anObj->SetDatumTargetNumber(0);
400 //=======================================================================
403 //=======================================================================
405 const Standard_GUID& XCAFDoc_Datum::ID() const
411 //=======================================================================
414 //=======================================================================
416 void XCAFDoc_Datum::Restore(const Handle(TDF_Attribute)& theWith)
418 myName = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetName();
419 myDescription = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetDescription();
420 myIdentification = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetIdentification();
424 //=======================================================================
425 //function : NewEmpty
427 //=======================================================================
429 Handle(TDF_Attribute) XCAFDoc_Datum::NewEmpty() const
431 return new XCAFDoc_Datum();
435 //=======================================================================
438 //=======================================================================
440 void XCAFDoc_Datum::Paste(const Handle(TDF_Attribute)& theInto,
441 const Handle(TDF_RelocationTable)& /*RT*/) const
443 Handle(XCAFDoc_Datum)::DownCast(theInto)->Set(myName,myDescription,myIdentification);