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>
39 ChildLab_ModifierWithValue,
45 ChildLab_DTargetLength,
46 ChildLab_DTargetWidth,
47 ChildLab_DTargetNumber,
51 //=======================================================================
52 //function : XCAFDoc_Datum
54 //=======================================================================
55 XCAFDoc_Datum::XCAFDoc_Datum()
60 //=======================================================================
63 //=======================================================================
65 const Standard_GUID& XCAFDoc_Datum::GetID()
67 static Standard_GUID DID("58ed092e-44de-11d8-8776-001083004c77");
68 //static Standard_GUID ID("efd212e2-6dfd-11d4-b9c8-0060b0ee281b");
74 //=======================================================================
77 //=======================================================================
79 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel,
80 const Handle(TCollection_HAsciiString)& theName,
81 const Handle(TCollection_HAsciiString)& theDescription,
82 const Handle(TCollection_HAsciiString)& theIdentification)
84 Handle(XCAFDoc_Datum) aDatum;
85 if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
86 aDatum = new XCAFDoc_Datum();
87 theLabel.AddAttribute(aDatum);
89 aDatum->Set(theName,theDescription,theIdentification);
93 //=======================================================================
96 //=======================================================================
98 Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel)
100 Handle(XCAFDoc_Datum) aDatum;
101 if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
102 aDatum = new XCAFDoc_Datum();
103 theLabel.AddAttribute(aDatum);
109 //=======================================================================
112 //=======================================================================
114 void XCAFDoc_Datum::Set(const Handle(TCollection_HAsciiString)& theName,
115 const Handle(TCollection_HAsciiString)& theDescription,
116 const Handle(TCollection_HAsciiString)& theIdentification)
120 myDescription = theDescription;
121 myIdentification = theIdentification;
125 //=======================================================================
128 //=======================================================================
130 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetName() const
133 return new TCollection_HAsciiString();
137 //=======================================================================
138 //function : GetDescriptio7n
140 //=======================================================================
142 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetDescription() const
144 return myDescription;
148 //=======================================================================
149 //function : GetIdentification
151 //=======================================================================
153 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetIdentification() const
155 return myIdentification;
158 //=======================================================================
159 //function : SetObject
161 //=======================================================================
163 void XCAFDoc_Datum::SetObject(const Handle(XCAFDimTolObjects_DatumObject)& theObject)
166 TDF_ChildIterator anIter(Label());
167 for(;anIter.More(); anIter.Next())
169 anIter.Value().ForgetAllAttributes();
171 if (!theObject->GetName().IsNull() && !theObject->GetName()->IsEmpty())
173 Handle(TDataStd_AsciiString) anAttName;
174 if(!Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
176 anAttName = new TDataStd_AsciiString();
177 Label().FindChild(ChildLab_Name).AddAttribute(anAttName);
179 anAttName->Set(theObject->GetName()->String());
182 Handle(TDataStd_Integer) aPosition = new TDataStd_Integer();
183 aPosition->Set(theObject->GetPosition());
184 Label().FindChild(ChildLab_Position).AddAttribute(aPosition);
186 if(theObject->GetModifiers().Length() > 0)
188 Handle(TDataStd_IntegerArray) aModifiers;
189 if(!Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), aModifiers))
191 aModifiers = new TDataStd_IntegerArray();
192 Label().FindChild(ChildLab_Modifiers).AddAttribute(aModifiers);
194 Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
195 for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
196 anArr->SetValue(i,theObject->GetModifiers().Value(i));
197 aModifiers->ChangeArray(anArr);
200 XCAFDimTolObjects_DatumModifWithValue aM;
202 theObject->GetModifierWithValue(aM, aV);
203 if(aM != XCAFDimTolObjects_DatumModifWithValue_None)
205 Handle(TDataStd_Integer) aModifierWithValueM;
206 if(!Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
208 aModifierWithValueM = new TDataStd_Integer();
209 Label().FindChild(ChildLab_ModifierWithValue).AddAttribute(aModifierWithValueM);
211 Handle(TDataStd_Real) aModifierWithValueV;
212 if(!Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
214 aModifierWithValueV = new TDataStd_Real();
215 Label().FindChild(ChildLab_ModifierWithValue).AddAttribute(aModifierWithValueV);
217 aModifierWithValueM->Set(aM);
218 aModifierWithValueV->Set(aV);
221 Handle(TDataStd_Integer) aIsTarget = new TDataStd_Integer();
222 aIsTarget->Set(theObject->IsDatumTarget());
223 Label().FindChild(ChildLab_IsDTarget).AddAttribute(aIsTarget);
225 if(theObject->IsDatumTarget())
227 Handle(TDataStd_Integer) aType = new TDataStd_Integer();
228 aType->Set(theObject->GetDatumTargetType());
229 Label().FindChild(ChildLab_DTargetType).AddAttribute(aType);
231 if(theObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area)
233 if(!theObject->GetDatumTarget().IsNull())
235 TNaming_Builder tnBuild(Label().FindChild(ChildLab_DatumTarget));
236 tnBuild.Generated(theObject->GetDatumTarget());
241 Handle(TDataStd_RealArray) aLoc = new TDataStd_RealArray();
242 Handle(TDataStd_RealArray) aN = new TDataStd_RealArray();
243 Handle(TDataStd_RealArray) aR = new TDataStd_RealArray();
244 gp_Ax2 anAx = theObject->GetDatumTargetAxis();
246 Handle(TColStd_HArray1OfReal) aLocArr = new TColStd_HArray1OfReal(1, 3);
247 for (Standard_Integer i = 1; i <= 3; i++)
248 aLocArr->SetValue(i, anAx.Location().Coord(i));
249 aLoc->ChangeArray(aLocArr);
251 Handle(TColStd_HArray1OfReal) aNArr = new TColStd_HArray1OfReal(1, 3);
252 for (Standard_Integer i = 1; i <= 3; i++)
253 aNArr->SetValue(i, anAx.Direction().Coord(i));
254 aN->ChangeArray(aNArr);
256 Handle(TColStd_HArray1OfReal) aRArr = new TColStd_HArray1OfReal(1, 3);
257 for (Standard_Integer i = 1; i <= 3; i++)
258 aRArr->SetValue(i, anAx.XDirection().Coord(i));
259 aR->ChangeArray(aRArr);
261 Label().FindChild(ChildLab_AxisLoc).AddAttribute(aLoc);
262 Label().FindChild(ChildLab_AxisN).AddAttribute(aN);
263 Label().FindChild(ChildLab_AxisRef).AddAttribute(aR);
265 if(theObject->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
267 Handle(TDataStd_Real) aLen = new TDataStd_Real();
268 aLen->Set(theObject->GetDatumTargetLength());
269 Label().FindChild(ChildLab_DTargetLength).AddAttribute(aLen);
270 if(theObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
272 Handle(TDataStd_Real) aWidth = new TDataStd_Real();
273 aWidth->Set(theObject->GetDatumTargetWidth());
274 Label().FindChild(ChildLab_DTargetWidth).AddAttribute(aWidth);
278 Handle(TDataStd_Integer) aNum = new TDataStd_Integer();
279 aNum->Set(theObject->GetDatumTargetNumber());
280 Label().FindChild(ChildLab_DTargetNumber).AddAttribute(aNum);
284 //=======================================================================
285 //function : GetObject
287 //=======================================================================
289 Handle(XCAFDimTolObjects_DatumObject) XCAFDoc_Datum::GetObject() const
291 Handle(XCAFDimTolObjects_DatumObject) anObj = new XCAFDimTolObjects_DatumObject();
293 Handle(TDataStd_AsciiString) anAttName;
294 if(Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
296 Handle(TCollection_HAsciiString) aStr = new TCollection_HAsciiString(anAttName->Get());
297 anObj->SetName(aStr);
300 Handle(TDataStd_IntegerArray) anArr;
301 if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
302 && !anArr->Array().IsNull())
304 XCAFDimTolObjects_DatumModifiersSequence aModifiers;
305 for(Standard_Integer i = 1; i <= anArr->Length(); i++)
306 aModifiers.Append((XCAFDimTolObjects_DatumSingleModif)anArr->Value(i));
307 anObj->SetModifiers(aModifiers);
310 Handle(TDataStd_Integer) aModifierWithValueM;
311 if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
313 Handle(TDataStd_Real) aModifierWithValueV;
314 if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
316 anObj->SetModifierWithValue((XCAFDimTolObjects_DatumModifWithValue)aModifierWithValueM->Get(),aModifierWithValueV->Get());
320 Handle(TDataStd_Integer) aPosition;
321 if(Label().FindChild(ChildLab_Position).FindAttribute(TDataStd_Integer::GetID(), aPosition))
323 anObj->SetPosition(aPosition->Get());
326 Handle(TDataStd_Integer) aIsDTarget;
327 if(Label().FindChild(ChildLab_IsDTarget).FindAttribute(TDataStd_Integer::GetID(), aIsDTarget))
329 anObj->IsDatumTarget((aIsDTarget->Get() != 0));
336 if (aIsDTarget->Get() != 0)
338 Handle(TDataStd_Integer) aDTargetType;
339 if(Label().FindChild(ChildLab_DTargetType).FindAttribute(TDataStd_Integer::GetID(), aDTargetType))
341 anObj->SetDatumTargetType((XCAFDimTolObjects_DatumTargetType)aDTargetType->Get());
342 if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area)
344 Handle(TNaming_NamedShape) aDatumTarget;
345 if(Label().FindChild(ChildLab_DatumTarget).FindAttribute(TNaming_NamedShape::GetID(), aDatumTarget))
347 anObj->SetDatumTarget(aDatumTarget->Get());
352 Handle(TDataStd_RealArray) aLoc;
353 Handle(TDataStd_RealArray) aN;
354 Handle(TDataStd_RealArray) aR;
355 if(Label().FindChild(ChildLab_AxisLoc).FindAttribute(TDataStd_RealArray::GetID(), aLoc) && aLoc->Length() == 3 &&
356 Label().FindChild(ChildLab_AxisN).FindAttribute(TDataStd_RealArray::GetID(), aN) && aN->Length() == 3 &&
357 Label().FindChild(ChildLab_AxisRef).FindAttribute(TDataStd_RealArray::GetID(), aR) && aR->Length() == 3 )
359 gp_Pnt aL(aLoc->Value(aLoc->Lower()), aLoc->Value(aLoc->Lower()+1), aLoc->Value(aLoc->Lower()+2));
360 gp_Dir aD(aN->Value(aN->Lower()), aN->Value(aN->Lower()+1), aN->Value(aN->Lower()+2));
361 gp_Dir aDR(aR->Value(aR->Lower()), aR->Value(aR->Lower()+1), aR->Value(aR->Lower()+2));
362 gp_Ax2 anAx(aL, aD, aDR);
363 anObj->SetDatumTargetAxis(anAx);
366 if(anObj->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
368 Handle(TDataStd_Real) aLen;
369 if(Label().FindChild(ChildLab_DTargetLength).FindAttribute(TDataStd_Real::GetID(), aLen))
371 anObj->SetDatumTargetLength(aLen->Get());
373 if(anObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
375 Handle(TDataStd_Real) aWidth;
376 if(Label().FindChild(ChildLab_DTargetWidth).FindAttribute(TDataStd_Real::GetID(), aWidth))
378 anObj->SetDatumTargetWidth(aWidth->Get());
384 Handle(TDataStd_Integer) aNum;
385 if(Label().FindChild(ChildLab_DTargetNumber).FindAttribute(TDataStd_Integer::GetID(), aNum))
387 anObj->SetDatumTargetNumber(aNum->Get());
391 anObj->SetDatumTargetNumber(0);
398 //=======================================================================
401 //=======================================================================
403 const Standard_GUID& XCAFDoc_Datum::ID() const
409 //=======================================================================
412 //=======================================================================
414 void XCAFDoc_Datum::Restore(const Handle(TDF_Attribute)& theWith)
416 myName = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetName();
417 myDescription = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetDescription();
418 myIdentification = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetIdentification();
422 //=======================================================================
423 //function : NewEmpty
425 //=======================================================================
427 Handle(TDF_Attribute) XCAFDoc_Datum::NewEmpty() const
429 return new XCAFDoc_Datum();
433 //=======================================================================
436 //=======================================================================
438 void XCAFDoc_Datum::Paste(const Handle(TDF_Attribute)& theInto,
439 const Handle(TDF_RelocationTable)& /*RT*/) const
441 Handle(XCAFDoc_Datum)::DownCast(theInto)->Set(myName,myDescription,myIdentification);