Salome HOME
1f162cb0c168f3d2fd85eafae7d4493a3f38a298
[modules/hydro.git] / src / HYDROData / HYDROData_Transform.cxx
1 #include <HYDROData_Transform.h>
2
3 #include <math.h>
4
5 #include <Bnd_Box.hxx>
6 #include <gp_Vec.hxx>
7
8 #include <TopoDS_Shape.hxx>
9 #include <TopoDS_Iterator.hxx>
10
11 #include <BRepBndLib.hxx>
12
13 #include <TopTools_ListIteratorOfListOfShape.hxx>
14
15 #include <BOPCol_ListOfShape.hxx>
16 #include <BOPCol_MapOfShape.hxx>
17
18 #include <BOPCol_ListOfShape.hxx>
19
20 #include <BOPAlgo_BuilderShape.hxx>
21 #include <BOPAlgo_PaveFiller.hxx>
22
23 #define DEB_SPLIT_TO_ZONES_CHECK_PARTITION 1
24 #ifdef DEB_SPLIT_TO_ZONES_CHECK_PARTITION
25 #include <BRepTools.hxx>
26 #include <TCollection_AsciiString.hxx>
27 static TCollection_AsciiString fileNameAfter("AfterTranslation");
28 #endif
29
30 void HYDROData_Transform::SetFileName(const TCollection_AsciiString& theNameAfter)
31 {
32 #ifdef DEB_SPLIT_TO_ZONES_CHECK_PARTITION
33   fileNameAfter = theNameAfter;
34 #endif
35 }
36 //=======================================================================
37 //function : HYDROData_Transform
38 //purpose  : 
39 //=======================================================================
40 HYDROData_Transform::HYDROData_Transform()
41 :
42   BOPAlgo_BuilderShape()
43 {
44   myToTransform=Standard_False;
45   myTreshold=10000.;
46   myTransform1=NULL;
47   myTransform2=NULL;
48   myBuilder=NULL;
49 }
50 //=======================================================================
51 //function : ~
52 //purpose  : 
53 //=======================================================================
54 HYDROData_Transform::~HYDROData_Transform()
55 {
56   Clear();
57 }
58 //=======================================================================
59 //function : Clear
60 //purpose  : 
61 //=======================================================================
62 void HYDROData_Transform::Clear()
63 {
64   myTreshold=10000.;
65   //
66   if (myTransform1) {
67     delete myTransform1;
68     myTransform1=NULL;
69   }
70   if (myTransform2) {
71     delete myTransform2;
72     myTransform2=NULL;
73   }
74   if (myBuilder) {
75     delete myBuilder;
76     myBuilder=NULL;
77   }
78   //
79   BOPAlgo_BuilderShape::PrepareHistory();
80 }
81 //=======================================================================
82 //function : SetArgument
83 //purpose  : 
84 //=======================================================================
85 void HYDROData_Transform::SetArgument(const TopoDS_Shape& theShape)
86 {
87   myArgument=theShape;
88 }
89 //=======================================================================
90 //function : AddArgument
91 //purpose  : 
92 //=======================================================================
93 const TopoDS_Shape& HYDROData_Transform::Argument()const
94 {
95   return myArgument;
96 }
97 //=======================================================================
98 //function : SetTreshold
99 //purpose  : 
100 //=======================================================================
101 void HYDROData_Transform::SetTreshold(const Standard_Real theTreshold)
102 {
103   myTreshold=theTreshold;
104 }
105 //=======================================================================
106 //function : Treshold
107 //purpose  : 
108 //=======================================================================
109 Standard_Real HYDROData_Transform::Treshold()const 
110 {
111   return myTreshold;
112 }
113 //=======================================================================
114 //function : SetToTransform
115 //purpose  : 
116 //=======================================================================
117 void HYDROData_Transform::SetToTransform(const Standard_Boolean theFlag)
118 {
119   myToTransform=theFlag;
120 }
121 //=======================================================================
122 //function : ToTransform
123 //purpose  : 
124 //=======================================================================
125 Standard_Boolean HYDROData_Transform::ToTransform()const
126 {
127   return myToTransform;
128 }
129 //=======================================================================
130 //function : CheckData
131 //purpose  : 
132 //=======================================================================
133 void HYDROData_Transform::CheckData()
134 {
135   if(myArgument.IsNull()) {
136     myErrorStatus=10;
137   }
138 }
139 //=======================================================================
140 //function : Prepare
141 //purpose  : 
142 //=======================================================================
143 void HYDROData_Transform::Prepare()
144 {
145   TopoDS_Shape aSx;
146   //
147   myErrorStatus=0;
148   myWarningStatus=0;
149   myShape=aSx;
150 }
151 //=======================================================================
152 //function : Perform
153 //purpose  : 
154 //=======================================================================
155 void HYDROData_Transform::Perform()
156 {
157   Prepare();
158   //
159   CheckData();
160   if(myErrorStatus) {
161     return;
162   }
163   //
164   Clear();
165   if(myErrorStatus) {
166     return;
167   }
168   //
169   ComputeTrsf();
170   if(myErrorStatus) {
171     return;
172   }
173   //
174   Transform1();
175   if(myErrorStatus) {
176     return;
177   }
178   //
179   BuildFuse();
180   if(myErrorStatus) {
181     return;
182   }
183   //
184   Transform2();
185 }
186 //=======================================================================
187 //function : Detect
188 //purpose  : 
189 //=======================================================================
190 void HYDROData_Transform::Detect()
191 {
192   Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
193   Standard_Real aXc, aYc, aZc;
194   Bnd_Box aBox; 
195   gp_Vec aVec;
196   //
197   myErrorStatus=0;
198   //
199   BRepBndLib::Add(myArgument, aBox);
200   //
201   aBox.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
202   //
203   aXc=0.5*(aXmin+aXmax);
204   aYc=0.5*(aYmin+aYmax);
205   aZc=0.5*(aZmin+aZmax);
206   printf(" aVc : { %lf %lf %lf }\n", aXc, aYc, aZc);
207   //
208   myToTransform=Standard_False;
209   if (fabs(aXc)>myTreshold || 
210       fabs(aYc)>myTreshold || 
211       fabs(aZc)>myTreshold) {
212     myToTransform=!myToTransform;
213   }  
214   //
215   aVec.SetCoord(-aXc, -aYc, -aZc);
216   myTrsf1.SetTranslation(aVec);
217   //
218   aVec.SetCoord(aXc, aYc, aZc);
219   myTrsf2.SetTranslation(aVec);
220 }
221 //=======================================================================
222 //function : ComputeTrsf
223 //purpose  : 
224 //=======================================================================
225 void HYDROData_Transform::ComputeTrsf()
226 {
227   if (!myToTransform) {
228     gp_Trsf aTrsf;
229     //
230     myTrsf1=aTrsf;
231     myTrsf2=aTrsf;
232   }
233 }
234 //=======================================================================
235 //function : Transform1
236 //purpose  : 
237 //=======================================================================
238 void HYDROData_Transform::Transform1()
239 {
240   Standard_Boolean bIsDone;
241   //
242   myErrorStatus=0;
243   //
244   myTransform1=new BRepBuilderAPI_Transform(myTrsf1);
245   //
246   myTransform1->Perform(myArgument);
247   bIsDone=myTransform1->IsDone();
248   if (!bIsDone) {
249     myErrorStatus=11;
250     return;
251   }
252 }
253 //=======================================================================
254 //function : BuildFuse
255 //purpose  : 
256 //=======================================================================
257 void HYDROData_Transform::BuildFuse()
258 {
259   Standard_Integer iErr;
260   TopoDS_Iterator aIt;
261   BOPCol_ListOfShape aLC;
262   BOPAlgo_PaveFiller aPF;
263   //
264   myErrorStatus=0;
265   //
266   const TopoDS_Shape& aS1=myTransform1->Shape();
267 #ifdef DEB_SPLIT_TO_ZONES_CHECK_PARTITION
268   TCollection_AsciiString aNameBefore = fileNameAfter + ".brep";
269   BRepTools::Write(aS1, aNameBefore.ToCString());
270 #endif
271   //
272   aIt.Initialize(aS1);
273   for (; aIt.More(); aIt.Next()) {
274     const TopoDS_Shape& aS1x=aIt.Value();
275     aLC.Append(aS1x);
276   }
277   //
278   aPF.SetArguments(aLC);
279   //
280   aPF.Perform();
281   iErr=aPF.ErrorStatus();
282   if (iErr) {
283     myErrorStatus=20;
284     return;
285   }
286   //
287   myBuilder=new BOPAlgo_Builder;
288   //
289   aIt.Initialize(aS1);
290   for (; aIt.More(); aIt.Next()) {
291     const TopoDS_Shape& aS1x=aIt.Value();
292     myBuilder->AddArgument(aS1x);
293   }
294   //
295   myBuilder->PerformWithFiller(aPF);
296   iErr=myBuilder->ErrorStatus();
297   if (iErr) {
298     myErrorStatus=21;
299     return;
300   }
301 }
302 //=======================================================================
303 //function : Transform2
304 //purpose  : 
305 //=======================================================================
306 void HYDROData_Transform::Transform2()
307 {
308   Standard_Boolean bIsDone;
309   //
310   myErrorStatus=0;
311   //
312   const TopoDS_Shape& aR1=myBuilder->Shape();
313   //
314   myTransform2=new BRepBuilderAPI_Transform(myTrsf2);
315   //
316   myTransform2->Perform(aR1);
317   bIsDone=myTransform2->IsDone();
318   if (!bIsDone) {
319     myErrorStatus=12;
320     return;
321   }
322   //
323   const TopoDS_Shape& aR2=myTransform2->Shape();
324   //
325   myShape=aR2;
326 }
327 //
328 //=======================================================================
329 //function : Modified
330 //purpose  : 
331 //=======================================================================
332 const TopTools_ListOfShape& HYDROData_Transform::Modified
333   (const TopoDS_Shape& aS)
334 {
335   TopTools_ListOfShape* pHistShapes;
336   TopTools_ListIteratorOfListOfShape aItLS;
337   //
338   pHistShapes=(TopTools_ListOfShape*)&myHistShapes;
339   pHistShapes->Clear();
340   //
341   const TopTools_ListOfShape& aLS1=myTransform1->Modified(aS);
342   const TopoDS_Shape& aS1=aLS1.First();
343   //
344   const TopTools_ListOfShape& aLS1B=myBuilder->Modified(aS1);
345   aItLS.Initialize(aLS1B);
346   for (; aItLS.More(); aItLS.Next()) {
347     const TopoDS_Shape& aS1B=aItLS.Value();
348     const TopTools_ListOfShape& aLS2B=myTransform2->Modified(aS1B);
349     const TopoDS_Shape& aS2B=aLS2B.First();
350     pHistShapes->Append(aS2B);
351   }
352   //
353   return myHistShapes;
354 }
355 //=======================================================================
356 //function : Generated
357 //purpose  : 
358 //=======================================================================
359 const TopTools_ListOfShape& HYDROData_Transform::Generated
360   (const TopoDS_Shape& aS)
361 {
362   TopTools_ListOfShape* pHistShapes;
363   TopTools_ListIteratorOfListOfShape aItLS;
364   //
365   pHistShapes=(TopTools_ListOfShape*)&myHistShapes;
366   pHistShapes->Clear();
367   //
368   const TopTools_ListOfShape& aLS1=myTransform1->Modified(aS);
369   const TopoDS_Shape& aS1=aLS1.First();
370   //
371   const TopTools_ListOfShape& aLS1B=myBuilder->Generated(aS1);
372   aItLS.Initialize(aLS1B);
373   for (; aItLS.More(); aItLS.Next()) {
374     const TopoDS_Shape& aS1B=aItLS.Value();
375     const TopTools_ListOfShape& aLS2B=myTransform2->Modified(aS1B);
376     const TopoDS_Shape& aS2B=aLS2B.First();
377     pHistShapes->Append(aS2B);
378   }
379   //
380   return myHistShapes;
381 }
382 //=======================================================================
383 //function : IsDeleted
384 //purpose  : 
385 //=======================================================================
386 Standard_Boolean HYDROData_Transform::IsDeleted(const TopoDS_Shape& aS)
387 {
388   Standard_Boolean bIsDeleted;
389   //
390   const TopTools_ListOfShape& aLS1=myTransform1->Modified(aS);
391   const TopoDS_Shape& aS1=aLS1.First();
392   //
393   bIsDeleted=myBuilder->IsDeleted(aS1);
394   //
395   return bIsDeleted;
396 }
397 //=======================================================================
398 //function : HasDeleted
399 //purpose  : 
400 //=======================================================================
401 Standard_Boolean HYDROData_Transform::HasDeleted()
402 {
403   return myBuilder->HasDeleted();
404 }
405 //=======================================================================
406 //function : HasGenerated
407 //purpose  : 
408 //=======================================================================
409 Standard_Boolean HYDROData_Transform::HasGenerated()
410 {
411   return myBuilder->HasGenerated();
412 }
413 //=======================================================================
414 //function : HasModified
415 //purpose  : 
416 //=======================================================================
417 Standard_Boolean HYDROData_Transform::HasModified()
418 {
419   return myBuilder->HasModified();
420 }