1 // Created on: 2009-04-06
2 // Created by: Sergey ZARITCHNY
3 // Copyright (c) 2009-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
20 #include <gp_Trsf.hxx>
22 #include <Standard_GUID.hxx>
23 #include <Standard_Type.hxx>
24 #include <TDataStd.hxx>
25 #include <TDataStd_Integer.hxx>
26 #include <TDataStd_Real.hxx>
27 #include <TDataXtd_Geometry.hxx>
28 #include <TDataXtd_PatternStd.hxx>
29 #include <TDF_Attribute.hxx>
30 #include <TDF_DataSet.hxx>
31 #include <TDF_Label.hxx>
32 #include <TDF_RelocationTable.hxx>
33 #include <TNaming_NamedShape.hxx>
34 #include <TopoDS_Shape.hxx>
36 IMPLEMENT_STANDARD_RTTIEXT(TDataXtd_PatternStd,TDataXtd_Pattern)
38 //=======================================================================
39 //function : GetPatternID
41 //=======================================================================
42 const Standard_GUID& TDataXtd_PatternStd::GetPatternID()
44 static Standard_GUID TDataXtd_PatternStdID("2a96b61b-ec8b-11d0-bee7-080009dc3333");
45 return TDataXtd_PatternStdID;
49 //=======================================================================
52 //=======================================================================
54 Handle(TDataXtd_PatternStd) TDataXtd_PatternStd::Set (const TDF_Label& L)
56 Handle(TDataXtd_PatternStd) A;
57 if (!L.FindAttribute(TDataXtd_Pattern::GetID(), A)) {
58 A = new TDataXtd_PatternStd();
64 //=======================================================================
65 //function : TDataXtd_PatternStd
67 //=======================================================================
69 TDataXtd_PatternStd::TDataXtd_PatternStd()
71 myAxis1Reversed (Standard_False),
72 myAxis2Reversed (Standard_False)
75 //=======================================================================
76 //function : Signature
78 //=======================================================================
80 void TDataXtd_PatternStd::Signature(const Standard_Integer signature)
83 if(mySignature == signature) return;
86 mySignature = signature;
89 //=======================================================================
92 //=======================================================================
94 void TDataXtd_PatternStd::Axis1(const Handle(TNaming_NamedShape)& Axis1)
98 if(myAxis1->Get() == Axis1->Get())
105 //=======================================================================
108 //=======================================================================
110 void TDataXtd_PatternStd::Axis2(const Handle(TNaming_NamedShape)& Axis2)
112 // OCC2932 correction
113 if(!myAxis2.IsNull())
114 if(myAxis2->Get() == Axis2->Get())
122 //=======================================================================
123 //function : Axis1Reversed
125 //=======================================================================
127 void TDataXtd_PatternStd::Axis1Reversed(const Standard_Boolean Axis1Reversed)
129 // OCC2932 correction
130 if(myAxis1Reversed == Axis1Reversed) return;
133 myAxis1Reversed = Axis1Reversed;
136 //=======================================================================
137 //function : Axis2Reversed
139 //=======================================================================
141 void TDataXtd_PatternStd::Axis2Reversed(const Standard_Boolean Axis2Reversed)
143 // OCC2932 correction
144 if(myAxis2Reversed == Axis2Reversed) return;
147 myAxis2Reversed = Axis2Reversed;
150 //=======================================================================
153 //=======================================================================
155 void TDataXtd_PatternStd::Value1(const Handle(TDataStd_Real)& value)
157 // OCC2932 correction
158 if(!myValue1.IsNull())
159 if(myValue1->Get() == value->Get())
167 //=======================================================================
170 //=======================================================================
172 void TDataXtd_PatternStd::Value2(const Handle(TDataStd_Real)& value)
174 // OCC2932 correction
175 if(!myValue2.IsNull())
176 if(myValue2->Get() == value->Get())
184 //=======================================================================
185 //function : NbInstances1
187 //=======================================================================
189 void TDataXtd_PatternStd::NbInstances1(const Handle(TDataStd_Integer)& NbInstances1)
191 // OCC2932 correction
193 if(myNb1->Get() == NbInstances1->Get())
197 myNb1 = NbInstances1;
200 //=======================================================================
201 //function : NbInstances2
203 //=======================================================================
205 void TDataXtd_PatternStd::NbInstances2(const Handle(TDataStd_Integer)& NbInstances2)
207 // OCC2932 correction
209 if(myNb2->Get() == NbInstances2->Get())
213 myNb2 = NbInstances2;
216 //=======================================================================
219 //=======================================================================
221 void TDataXtd_PatternStd::Mirror(const Handle(TNaming_NamedShape)& plane)
223 // OCC2932 correction
224 if(!myMirror.IsNull()) {
225 if(myMirror->Get() == plane->Get())
233 //=======================================================================
236 //=======================================================================
238 Standard_Integer TDataXtd_PatternStd::NbTrsfs() const
240 Standard_Integer nb = 1;
241 if (mySignature < 5) {
242 if (!myNb1.IsNull()) nb = myNb1->Get();
243 if (!myNb2.IsNull()) nb = nb*myNb2->Get();
250 //=======================================================================
251 //function : ComputeTrsfs
253 //=======================================================================
255 void TDataXtd_PatternStd::ComputeTrsfs(TDataXtd_Array1OfTrsf& Trsfs) const
257 Standard_Integer nb = 0;
260 if (mySignature < 5) {
262 // recover direction and step
264 TDataXtd_Geometry::Axis(myAxis1, axis1);
265 if (myAxis1Reversed) axis1.Reverse();
267 Standard_Real value1 = myValue1->Get();
269 for (Standard_Integer i=2; i<=myNb1->Get(); i++) {
270 if (mySignature != 2) {
271 gp_Vec vec(axis1.Direction());
272 vec *= (value1*(i-1));
273 trsf.SetTranslation(vec);
276 trsf.SetRotation(axis1, value1*(i-1));
281 if (mySignature == 3 || mySignature == 4) {
282 // recover direction and step
284 TDataXtd_Geometry::Axis(myAxis2, axis2);
285 if (myAxis2Reversed) axis2.Reverse();
287 Standard_Real value2 = myValue2->Get();
289 for (Standard_Integer j=2; j<=myNb2->Get(); j++) {
291 if (mySignature ==3) {
292 gp_Vec vec(axis2.Direction());
293 vec *= (value2*(j-1));
294 trsf2.SetTranslation(vec);
297 trsf2.SetRotation(axis2, value2*(j-1));
301 for (Standard_Integer i=2; i<=myNb1->Get(); i++) {
303 trsf.Multiply(Trsfs(i-1));
311 TDataXtd_Geometry::Plane(myMirror, pln);
312 trsf.SetMirror(pln.Position().Ax2());
317 //=======================================================================
318 //function : PatternID
320 //=======================================================================
322 const Standard_GUID& TDataXtd_PatternStd::PatternID() const
324 return GetPatternID ();
328 //=======================================================================
331 //=======================================================================
333 void TDataXtd_PatternStd::Restore(const Handle(TDF_Attribute)& With)
335 Handle(TDataXtd_PatternStd) PatternStd = Handle(TDataXtd_PatternStd)::DownCast(With);
337 mySignature = PatternStd->Signature();
338 myAxis1Reversed = PatternStd->Axis1Reversed();
339 myAxis2Reversed = PatternStd->Axis2Reversed();
341 myAxis1 = PatternStd->Axis1();
342 myAxis2 = PatternStd->Axis2();
343 myValue1 = PatternStd->Value1();
344 myValue2 = PatternStd->Value2();
345 myNb1 = PatternStd->NbInstances1();
346 myNb2 = PatternStd->NbInstances2();
347 myMirror = PatternStd->Mirror();
350 //=======================================================================
351 //function : NewEmpty
353 //=======================================================================
355 Handle(TDF_Attribute) TDataXtd_PatternStd::NewEmpty() const
357 return new TDataXtd_PatternStd();
360 //=======================================================================
363 //=======================================================================
365 void TDataXtd_PatternStd::Paste(const Handle(TDF_Attribute)& Into,
366 const Handle(TDF_RelocationTable)& RT) const
368 Handle(TDataXtd_PatternStd) intof = Handle(TDataXtd_PatternStd)::DownCast(Into);
370 intof->Signature(mySignature);
371 intof->Axis1Reversed(myAxis1Reversed);
372 intof->Axis2Reversed(myAxis2Reversed);
374 if (mySignature < 5) {
375 Handle(TNaming_NamedShape) axis;
376 Handle(TDataStd_Real) value;
377 Handle(TDataStd_Integer) nb;
379 RT->HasRelocation(myAxis1, axis);
381 RT->HasRelocation(myValue1, value);
382 intof->Value1(value);
383 RT->HasRelocation(myNb1, nb);
384 intof->NbInstances1(nb);
386 if (mySignature > 2) {
387 RT->HasRelocation(myAxis2, axis);
389 RT->HasRelocation(myValue2, value);
390 intof->Value2(value);
391 RT->HasRelocation(myNb2, nb);
392 intof->NbInstances2(nb);
396 Handle(TNaming_NamedShape) plane;
397 RT->HasRelocation(myMirror, plane);
398 intof->Mirror(plane);
402 //=======================================================================
403 //function : References
405 //=======================================================================
407 void TDataXtd_PatternStd::References(const Handle(TDF_DataSet)& aDataSet) const
409 if (mySignature < 5) {
410 aDataSet->AddAttribute(myAxis1);
411 aDataSet->AddAttribute(myValue1);
412 aDataSet->AddAttribute(myNb1);
413 if (mySignature > 2) {
414 aDataSet->AddAttribute(myAxis2);
415 aDataSet->AddAttribute(myValue2);
416 aDataSet->AddAttribute(myNb2);
420 aDataSet->AddAttribute(myMirror);
424 //=======================================================================
427 //=======================================================================
429 Standard_OStream& TDataXtd_PatternStd::Dump(Standard_OStream& anOS) const
431 anOS << "TDataXtd_PatternStd";