1 // File: TDataXtd_PatternStd.cxx
2 // Created: Mon Apr 6 18:05:31 2009
3 // Author: Sergey ZARITCHNY
4 // <sergey.zaritchny@opencascade.com>
5 //Copyright: Open CasCade SA 2009
8 #include <TDataXtd_PatternStd.ixx>
9 #include <TDataStd.hxx>
10 #include <TDataXtd_Geometry.hxx>
11 #include <TDF_Label.hxx>
14 #include <gp_Trsf.hxx>
17 #include <TopoDS_Shape.hxx>
20 //=======================================================================
21 //function : GetPatternID
23 //=======================================================================
25 const Standard_GUID& TDataXtd_PatternStd::GetPatternID()
27 static Standard_GUID TDataXtd_PatternStdID("2a96b61b-ec8b-11d0-bee7-080009dc3333");
28 return TDataXtd_PatternStdID;
32 //=======================================================================
35 //=======================================================================
37 Handle(TDataXtd_PatternStd) TDataXtd_PatternStd::Set (const TDF_Label& L)
39 Handle(TDataXtd_PatternStd) A;
40 if (!L.FindAttribute(TDataXtd_Pattern::GetID(), A)) {
41 A = new TDataXtd_PatternStd();
47 //=======================================================================
48 //function : TDataXtd_PatternStd
50 //=======================================================================
52 TDataXtd_PatternStd::TDataXtd_PatternStd()
54 myAxis1Reversed (Standard_False),
55 myAxis2Reversed (Standard_False)
58 //=======================================================================
59 //function : Signature
61 //=======================================================================
63 void TDataXtd_PatternStd::Signature(const Standard_Integer signature)
66 if(mySignature == signature) return;
69 mySignature = signature;
72 //=======================================================================
75 //=======================================================================
77 void TDataXtd_PatternStd::Axis1(const Handle(TNaming_NamedShape)& Axis1)
81 if(myAxis1->Get() == Axis1->Get())
88 //=======================================================================
91 //=======================================================================
93 void TDataXtd_PatternStd::Axis2(const Handle(TNaming_NamedShape)& Axis2)
97 if(myAxis2->Get() == Axis2->Get())
105 //=======================================================================
106 //function : Axis1Reversed
108 //=======================================================================
110 void TDataXtd_PatternStd::Axis1Reversed(const Standard_Boolean Axis1Reversed)
112 // OCC2932 correction
113 if(myAxis1Reversed == Axis1Reversed) return;
116 myAxis1Reversed = Axis1Reversed;
119 //=======================================================================
120 //function : Axis2Reversed
122 //=======================================================================
124 void TDataXtd_PatternStd::Axis2Reversed(const Standard_Boolean Axis2Reversed)
126 // OCC2932 correction
127 if(myAxis2Reversed == Axis2Reversed) return;
130 myAxis2Reversed = Axis2Reversed;
133 //=======================================================================
136 //=======================================================================
138 void TDataXtd_PatternStd::Value1(const Handle(TDataStd_Real)& value)
140 // OCC2932 correction
141 if(!myValue1.IsNull())
142 if(myValue1->Get() == value->Get())
150 //=======================================================================
153 //=======================================================================
155 void TDataXtd_PatternStd::Value2(const Handle(TDataStd_Real)& value)
157 // OCC2932 correction
158 if(!myValue2.IsNull())
159 if(myValue2->Get() == value->Get())
167 //=======================================================================
168 //function : NbInstances1
170 //=======================================================================
172 void TDataXtd_PatternStd::NbInstances1(const Handle(TDataStd_Integer)& NbInstances1)
174 // OCC2932 correction
176 if(myNb1->Get() == NbInstances1->Get())
180 myNb1 = NbInstances1;
183 //=======================================================================
184 //function : NbInstances2
186 //=======================================================================
188 void TDataXtd_PatternStd::NbInstances2(const Handle(TDataStd_Integer)& NbInstances2)
190 // OCC2932 correction
192 if(myNb2->Get() == NbInstances2->Get())
196 myNb2 = NbInstances2;
199 //=======================================================================
202 //=======================================================================
204 void TDataXtd_PatternStd::Mirror(const Handle(TNaming_NamedShape)& plane)
206 // OCC2932 correction
207 if(!myMirror.IsNull()) {
208 if(myMirror->Get() == plane->Get())
216 //=======================================================================
219 //=======================================================================
221 Standard_Integer TDataXtd_PatternStd::NbTrsfs() const
223 Standard_Integer nb = 1;
224 if (mySignature < 5) {
225 if (!myNb1.IsNull()) nb = myNb1->Get();
226 if (!myNb2.IsNull()) nb = nb*myNb2->Get();
233 //=======================================================================
234 //function : ComputeTrsfs
236 //=======================================================================
238 void TDataXtd_PatternStd::ComputeTrsfs(TDataXtd_Array1OfTrsf& Trsfs) const
240 Standard_Integer nb = 0;
243 if (mySignature < 5) {
245 // recover direction and step
247 TDataXtd_Geometry::Axis(myAxis1, axis1);
248 if (myAxis1Reversed) axis1.Reverse();
250 Standard_Real value1 = myValue1->Get();
252 for (Standard_Integer i=2; i<=myNb1->Get(); i++) {
253 if (mySignature != 2) {
254 gp_Vec vec(axis1.Direction());
255 vec *= (value1*(i-1));
256 trsf.SetTranslation(vec);
259 trsf.SetRotation(axis1, value1*(i-1));
264 if (mySignature == 3 || mySignature == 4) {
265 // recover direction and step
267 TDataXtd_Geometry::Axis(myAxis2, axis2);
268 if (myAxis2Reversed) axis2.Reverse();
270 Standard_Real value2 = myValue2->Get();
272 for (Standard_Integer j=2; j<=myNb2->Get(); j++) {
274 if (mySignature ==3) {
275 gp_Vec vec(axis2.Direction());
276 vec *= (value2*(j-1));
277 trsf2.SetTranslation(vec);
280 trsf2.SetRotation(axis2, value2*(j-1));
284 for (Standard_Integer i=2; i<=myNb1->Get(); i++) {
286 trsf.Multiply(Trsfs(i-1));
294 TDataXtd_Geometry::Plane(myMirror, pln);
295 trsf.SetMirror(pln.Position().Ax2());
300 //=======================================================================
301 //function : PatternID
303 //=======================================================================
305 const Standard_GUID& TDataXtd_PatternStd::PatternID() const
307 return GetPatternID ();
311 //=======================================================================
314 //=======================================================================
316 void TDataXtd_PatternStd::Restore(const Handle(TDF_Attribute)& With)
318 Handle(TDataXtd_PatternStd) PatternStd = Handle(TDataXtd_PatternStd)::DownCast(With);
320 mySignature = PatternStd->Signature();
321 myAxis1Reversed = PatternStd->Axis1Reversed();
322 myAxis2Reversed = PatternStd->Axis2Reversed();
324 myAxis1 = PatternStd->Axis1();
325 myAxis2 = PatternStd->Axis2();
326 myValue1 = PatternStd->Value1();
327 myValue2 = PatternStd->Value2();
328 myNb1 = PatternStd->NbInstances1();
329 myNb2 = PatternStd->NbInstances2();
330 myMirror = PatternStd->Mirror();
333 //=======================================================================
334 //function : NewEmpty
336 //=======================================================================
338 Handle(TDF_Attribute) TDataXtd_PatternStd::NewEmpty() const
340 return new TDataXtd_PatternStd();
343 //=======================================================================
346 //=======================================================================
348 void TDataXtd_PatternStd::Paste(const Handle(TDF_Attribute)& Into,
349 const Handle(TDF_RelocationTable)& RT) const
351 Handle(TDataXtd_PatternStd) intof = Handle(TDataXtd_PatternStd)::DownCast(Into);
353 intof->Signature(mySignature);
354 intof->Axis1Reversed(myAxis1Reversed);
355 intof->Axis2Reversed(myAxis2Reversed);
357 if (mySignature < 5) {
358 Handle(TNaming_NamedShape) axis;
359 Handle(TDataStd_Real) value;
360 Handle(TDataStd_Integer) nb;
362 RT->HasRelocation(myAxis1, axis);
364 RT->HasRelocation(myValue1, value);
365 intof->Value1(value);
366 RT->HasRelocation(myNb1, nb);
367 intof->NbInstances1(nb);
369 if (mySignature > 2) {
370 RT->HasRelocation(myAxis2, axis);
372 RT->HasRelocation(myValue2, value);
373 intof->Value2(value);
374 RT->HasRelocation(myNb2, nb);
375 intof->NbInstances2(nb);
379 Handle(TNaming_NamedShape) plane;
380 RT->HasRelocation(myMirror, plane);
381 intof->Mirror(plane);
385 //=======================================================================
386 //function : References
388 //=======================================================================
390 void TDataXtd_PatternStd::References(const Handle(TDF_DataSet)& aDataSet) const
392 if (mySignature < 5) {
393 aDataSet->AddAttribute(myAxis1);
394 aDataSet->AddAttribute(myValue1);
395 aDataSet->AddAttribute(myNb1);
396 if (mySignature > 2) {
397 aDataSet->AddAttribute(myAxis2);
398 aDataSet->AddAttribute(myValue2);
399 aDataSet->AddAttribute(myNb2);
403 aDataSet->AddAttribute(myMirror);
407 //=======================================================================
410 //=======================================================================
412 Standard_OStream& TDataXtd_PatternStd::Dump(Standard_OStream& anOS) const
414 anOS << "TDataXtd_PatternStd";