Salome HOME
merge master 2015/06/04
[modules/hydro.git] / src / HYDROData / HYDROData_Transform.cxx
1 // Copyright (C) 2014-2015  EDF-R&D
2 // This library is free software; you can redistribute it and/or
3 // modify it under the terms of the GNU Lesser General Public
4 // License as published by the Free Software Foundation; either
5 // version 2.1 of the License, or (at your option) any later version.
6 //
7 // This library is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10 // Lesser General Public License for more details.
11 //
12 // You should have received a copy of the GNU Lesser General Public
13 // License along with this library; if not, write to the Free Software
14 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
15 //
16 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
17 //
18
19 #include <HYDROData_Transform.h>
20
21 #include <math.h>
22
23 #include <Bnd_Box.hxx>
24 #include <gp_Vec.hxx>
25
26 #include <TopoDS_Shape.hxx>
27 #include <TopoDS_Iterator.hxx>
28
29 #include <BRepBndLib.hxx>
30
31 #include <TopTools_ListIteratorOfListOfShape.hxx>
32
33 #include <BOPCol_ListOfShape.hxx>
34 #include <BOPCol_MapOfShape.hxx>
35
36 #include <BOPCol_ListOfShape.hxx>
37
38 #include <BOPAlgo_BuilderShape.hxx>
39 #include <BOPAlgo_PaveFiller.hxx>
40
41 //#define DEB_SPLIT_TO_ZONES_CHECK_PARTITION 1
42 #ifdef DEB_SPLIT_TO_ZONES_CHECK_PARTITION
43 #include <BRepTools.hxx>
44 #include <TCollection_AsciiString.hxx>
45 static TCollection_AsciiString fileNameAfter("AfterTranslation");
46 #endif
47
48 void HYDROData_Transform::SetFileName(const TCollection_AsciiString& theNameAfter)
49 {
50 #ifdef DEB_SPLIT_TO_ZONES_CHECK_PARTITION
51   fileNameAfter = theNameAfter;
52 #endif
53 }
54 //=======================================================================
55 //function : HYDROData_Transform
56 //purpose  : 
57 //=======================================================================
58 HYDROData_Transform::HYDROData_Transform()
59 :
60   BOPAlgo_BuilderShape()
61 {
62   myToTransform=Standard_False;
63   myTreshold=10000.;
64   myTransform1=NULL;
65   myTransform2=NULL;
66   myBuilder=NULL;
67 }
68 //=======================================================================
69 //function : ~
70 //purpose  : 
71 //=======================================================================
72 HYDROData_Transform::~HYDROData_Transform()
73 {
74   Clear();
75 }
76 //=======================================================================
77 //function : Clear
78 //purpose  : 
79 //=======================================================================
80 void HYDROData_Transform::Clear()
81 {
82   myTreshold=10000.;
83   //
84   if (myTransform1) {
85     delete myTransform1;
86     myTransform1=NULL;
87   }
88   if (myTransform2) {
89     delete myTransform2;
90     myTransform2=NULL;
91   }
92   if (myBuilder) {
93     delete myBuilder;
94     myBuilder=NULL;
95   }
96   //
97   BOPAlgo_BuilderShape::PrepareHistory();
98 }
99 //=======================================================================
100 //function : SetArgument
101 //purpose  : 
102 //=======================================================================
103 void HYDROData_Transform::SetArgument(const TopoDS_Shape& theShape)
104 {
105   myArgument=theShape;
106 }
107 //=======================================================================
108 //function : AddArgument
109 //purpose  : 
110 //=======================================================================
111 const TopoDS_Shape& HYDROData_Transform::Argument()const
112 {
113   return myArgument;
114 }
115 //=======================================================================
116 //function : SetTreshold
117 //purpose  : 
118 //=======================================================================
119 void HYDROData_Transform::SetTreshold(const Standard_Real theTreshold)
120 {
121   myTreshold=theTreshold;
122 }
123 //=======================================================================
124 //function : Treshold
125 //purpose  : 
126 //=======================================================================
127 Standard_Real HYDROData_Transform::Treshold()const 
128 {
129   return myTreshold;
130 }
131 //=======================================================================
132 //function : SetToTransform
133 //purpose  : 
134 //=======================================================================
135 void HYDROData_Transform::SetToTransform(const Standard_Boolean theFlag)
136 {
137   myToTransform=theFlag;
138 }
139 //=======================================================================
140 //function : ToTransform
141 //purpose  : 
142 //=======================================================================
143 Standard_Boolean HYDROData_Transform::ToTransform()const
144 {
145   return myToTransform;
146 }
147 //=======================================================================
148 //function : CheckData
149 //purpose  : 
150 //=======================================================================
151 void HYDROData_Transform::CheckData()
152 {
153   if(myArgument.IsNull()) {
154     myErrorStatus=10;
155   }
156 }
157 //=======================================================================
158 //function : Prepare
159 //purpose  : 
160 //=======================================================================
161 void HYDROData_Transform::Prepare()
162 {
163   TopoDS_Shape aSx;
164   //
165   myErrorStatus=0;
166   myWarningStatus=0;
167   myShape=aSx;
168 }
169 //=======================================================================
170 //function : Perform
171 //purpose  : 
172 //=======================================================================
173 void HYDROData_Transform::Perform()
174 {
175   Prepare();
176   //
177   CheckData();
178   if(myErrorStatus) {
179     return;
180   }
181   //
182   Clear();
183   if(myErrorStatus) {
184     return;
185   }
186   //
187   ComputeTrsf();
188   if(myErrorStatus) {
189     return;
190   }
191   //
192   Transform1();
193   if(myErrorStatus) {
194     return;
195   }
196   //
197   BuildFuse();
198   if(myErrorStatus) {
199     return;
200   }
201   //
202   Transform2();
203 }
204 //=======================================================================
205 //function : Detect
206 //purpose  : 
207 //=======================================================================
208 void HYDROData_Transform::Detect()
209 {
210   Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
211   Standard_Real aXc, aYc, aZc;
212   Bnd_Box aBox; 
213   gp_Vec aVec;
214   //
215   myErrorStatus=0;
216   //
217   BRepBndLib::Add(myArgument, aBox);
218   //
219   aBox.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
220   //
221   aXc=0.5*(aXmin+aXmax);
222   aYc=0.5*(aYmin+aYmax);
223   aZc=0.5*(aZmin+aZmax);
224   //printf(" aVc : { %lf %lf %lf }\n", aXc, aYc, aZc);
225   //
226   myToTransform=Standard_False;
227   if (fabs(aXc)>myTreshold || 
228       fabs(aYc)>myTreshold || 
229       fabs(aZc)>myTreshold) {
230     myToTransform=!myToTransform;
231   }  
232   //
233   aVec.SetCoord(-aXc, -aYc, -aZc);
234   myTrsf1.SetTranslation(aVec);
235   //
236   aVec.SetCoord(aXc, aYc, aZc);
237   myTrsf2.SetTranslation(aVec);
238 }
239 //=======================================================================
240 //function : ComputeTrsf
241 //purpose  : 
242 //=======================================================================
243 void HYDROData_Transform::ComputeTrsf()
244 {
245   if (!myToTransform) {
246     gp_Trsf aTrsf;
247     //
248     myTrsf1=aTrsf;
249     myTrsf2=aTrsf;
250   }
251 }
252 //=======================================================================
253 //function : Transform1
254 //purpose  : 
255 //=======================================================================
256 void HYDROData_Transform::Transform1()
257
258   myErrorStatus=0;
259   //
260   if (myToTransform) {//pkv ft
261     Standard_Boolean bIsDone;
262     //
263     myErrorStatus=0;
264     //
265     myTransform1=new BRepBuilderAPI_Transform(myTrsf1);
266     //
267     myTransform1->Perform(myArgument);
268     bIsDone=myTransform1->IsDone();
269     if (!bIsDone) {
270       myErrorStatus=11;
271     }
272   }
273 }
274 //=======================================================================
275 //function : BuildFuse
276 //purpose  : 
277 //=======================================================================
278 void HYDROData_Transform::BuildFuse()
279 {
280   Standard_Integer iErr;
281   TopoDS_Iterator aIt;
282   BOPCol_ListOfShape aLC;
283   BOPAlgo_PaveFiller aPF;
284   //
285   myErrorStatus=0;
286   //
287    //modified by NIZNHY-PKV Wed Jan 15 13:24:48 2014f
288   const TopoDS_Shape& aS1=
289     (myToTransform)? myTransform1->Shape() : myArgument;
290   //const TopoDS_Shape& aS1=()Transform1->Shape();
291   //modified by NIZNHY-PKV Wed Jan 15 13:24:52 2014t
292
293 #ifdef DEB_SPLIT_TO_ZONES_CHECK_PARTITION
294   TCollection_AsciiString aNameBefore = fileNameAfter + ".brep";
295   BRepTools::Write(aS1, aNameBefore.ToCString());
296 #endif
297   //
298   aIt.Initialize(aS1);
299   for (; aIt.More(); aIt.Next()) {
300     const TopoDS_Shape& aS1x=aIt.Value();
301     aLC.Append(aS1x);
302   }
303   //
304   aPF.SetArguments(aLC);
305   //
306   aPF.Perform();
307   iErr=aPF.ErrorStatus();
308   if (iErr) {
309     myErrorStatus=20;
310     return;
311   }
312   //
313   myBuilder=new BOPAlgo_Builder;
314   //
315   aIt.Initialize(aS1);
316   for (; aIt.More(); aIt.Next()) {
317     const TopoDS_Shape& aS1x=aIt.Value();
318     myBuilder->AddArgument(aS1x);
319   }
320   //
321   myBuilder->PerformWithFiller(aPF);
322   iErr=myBuilder->ErrorStatus();
323   if (iErr) {
324     myErrorStatus=21;
325     return;
326   }
327 }
328 //=======================================================================
329 //function : Transform2
330 //purpose  : 
331 //=======================================================================
332 void HYDROData_Transform::Transform2()
333 {
334   myErrorStatus=0;
335   //
336   const TopoDS_Shape& aR1=myBuilder->Shape();
337   //
338   myShape=aR1; //pkv ft
339   if (myToTransform) { //pkv ft
340     Standard_Boolean bIsDone;
341     //
342     myTransform2=new BRepBuilderAPI_Transform(myTrsf2);
343     //
344     myTransform2->Perform(aR1);
345     bIsDone=myTransform2->IsDone();
346     if (!bIsDone) {
347       myErrorStatus=12;
348       return;
349     }
350     //
351     const TopoDS_Shape& aR2=myTransform2->Shape();
352     //
353     myShape=aR2;
354   }
355 }
356 //
357 //=======================================================================
358 //function : Modified
359 //purpose  : 
360 //=======================================================================
361 const TopTools_ListOfShape& HYDROData_Transform::Modified
362   (const TopoDS_Shape& aS)
363 {
364   TopTools_ListOfShape* pHistShapes;
365   TopTools_ListIteratorOfListOfShape aItLS;
366   //
367   pHistShapes=(TopTools_ListOfShape*)&myHistShapes;
368   pHistShapes->Clear();
369   //
370   if (myToTransform) { //pkv ft
371     const TopTools_ListOfShape& aLS1=myTransform1->Modified(aS);
372     const TopoDS_Shape& aS1=aLS1.First();
373     //
374     const TopTools_ListOfShape& aLS1B=myBuilder->Modified(aS1);
375     //
376     if (aLS1B.IsEmpty()) { //pkv ft
377       const TopTools_ListOfShape& aLS2B=myTransform2->Modified(aS1);
378       const TopoDS_Shape& aS2B=aLS2B.First();
379       pHistShapes->Append(aS2B);
380     }
381     else {
382       aItLS.Initialize(aLS1B);
383       for (; aItLS.More(); aItLS.Next()) {
384         const TopoDS_Shape& aS1B=aItLS.Value();
385         const TopTools_ListOfShape& aLS2B=myTransform2->Modified(aS1B);
386         const TopoDS_Shape& aS2B=aLS2B.First();
387         pHistShapes->Append(aS2B);
388       }
389     }
390   }
391   else {
392     const TopTools_ListOfShape& aLS1B=myBuilder->Modified(aS);
393     aItLS.Initialize(aLS1B);
394     for (; aItLS.More(); aItLS.Next()) {
395       const TopoDS_Shape& aS1B=aItLS.Value();
396       pHistShapes->Append(aS1B);
397     }
398   }
399   //
400   return myHistShapes;
401 }
402 //=======================================================================
403 //function : Generated
404 //purpose  : 
405 //=======================================================================
406 const TopTools_ListOfShape& HYDROData_Transform::Generated
407   (const TopoDS_Shape& aS)
408 {
409   TopTools_ListOfShape* pHistShapes;
410   TopTools_ListIteratorOfListOfShape aItLS;
411   //
412   pHistShapes=(TopTools_ListOfShape*)&myHistShapes;
413   pHistShapes->Clear();
414   //
415   if (myToTransform) { //pkv ft
416     const TopTools_ListOfShape& aLS1=myTransform1->Modified(aS);
417     const TopoDS_Shape& aS1=aLS1.First();
418     //
419     const TopTools_ListOfShape& aLS1B=myBuilder->Generated(aS1);
420     if (aLS1B.IsEmpty()) { //pkv ft
421       const TopTools_ListOfShape& aLS2B=myTransform2->Modified(aS1);
422       const TopoDS_Shape& aS2B=aLS2B.First();
423       pHistShapes->Append(aS2B);
424     }
425     else {
426       aItLS.Initialize(aLS1B);
427       for (; aItLS.More(); aItLS.Next()) {
428         const TopoDS_Shape& aS1B=aItLS.Value();
429         const TopTools_ListOfShape& aLS2B=myTransform2->Modified(aS1B);
430         const TopoDS_Shape& aS2B=aLS2B.First();
431         pHistShapes->Append(aS2B);
432       }
433     }
434   }
435   else {
436     const TopTools_ListOfShape& aLS1B=myBuilder->Generated(aS);
437     aItLS.Initialize(aLS1B);
438     for (; aItLS.More(); aItLS.Next()) {
439       const TopoDS_Shape& aS1B=aItLS.Value();
440       pHistShapes->Append(aS1B);
441     }
442   }
443   //
444   return myHistShapes;
445 }
446 //=======================================================================
447 //function : IsDeleted
448 //purpose  : 
449 //=======================================================================
450 Standard_Boolean HYDROData_Transform::IsDeleted(const TopoDS_Shape& aS)
451 {
452   Standard_Boolean bIsDeleted;
453   //
454   if (myToTransform) { //pkv ft
455     const TopTools_ListOfShape& aLS1=myTransform1->Modified(aS);
456     const TopoDS_Shape& aS1=aLS1.First();
457     //
458     bIsDeleted=myBuilder->IsDeleted(aS1);
459   }
460   else {
461     bIsDeleted=myBuilder->IsDeleted(aS);
462   }
463   //
464   return bIsDeleted;
465 }
466 //=======================================================================
467 //function : HasDeleted
468 //purpose  : 
469 //=======================================================================
470 Standard_Boolean HYDROData_Transform::HasDeleted()
471 {
472   return myBuilder->HasDeleted();
473 }
474 //=======================================================================
475 //function : HasGenerated
476 //purpose  : 
477 //=======================================================================
478 Standard_Boolean HYDROData_Transform::HasGenerated()
479 {
480   return myBuilder->HasGenerated();
481 }
482 //=======================================================================
483 //function : HasModified
484 //purpose  : 
485 //=======================================================================
486 Standard_Boolean HYDROData_Transform::HasModified()
487 {
488   return myBuilder->HasModified();
489 }