]> SALOME platform Git repositories - modules/geom.git/blob - src/GEOMAlgo/GEOMAlgo_WESCorrector.cxx
Salome HOME
GDD: Check that the PipeTShape is a block if it is required by user
[modules/geom.git] / src / GEOMAlgo / GEOMAlgo_WESCorrector.cxx
1 //  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 // File:        NMTAlgo_WESCorrector.cxx
23 // Created:     
24 // Author:      Peter KURNEV
25 //              <pkv@irinox>
26 //
27 #include <GEOMAlgo_WESCorrector.ixx>
28
29 #include <TopoDS.hxx>
30 #include <TopoDS_Shape.hxx>
31 #include <TopoDS_Wire.hxx>
32 #include <TopoDS_Face.hxx>
33 #include <TopoDS_Edge.hxx>
34
35 #include <BRep_Builder.hxx>
36 #include <BRep_Tool.hxx>
37
38 #include <TopTools_IndexedMapOfOrientedShape.hxx>
39 #include <TopTools_ListIteratorOfListOfShape.hxx>
40
41 #include <BOP_ConnexityBlock.hxx>
42 #include <BOP_ListIteratorOfListOfConnexityBlock.hxx>
43
44 #include <BOPTColStd_ListOfListOfShape.hxx>
45 #include <BOPTColStd_ListIteratorOfListOfListOfShape.hxx>
46
47 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
48 #include <NMTTools_IndexedDataMapOfShapeIndexedMapOfShape.hxx>
49 #include <TopExp.hxx>
50 #include <TopTools_IndexedMapOfShape.hxx>
51 #include <TopTools_MapOfShape.hxx>
52 #include <TopTools_MapIteratorOfMapOfShape.hxx>
53 #include <TopoDS_Iterator.hxx>
54 #include <GEOMAlgo_WireSplitter.hxx>
55 #include <GEOMAlgo_WESScaler.hxx>
56
57
58 static
59   void MakeWire(const TopTools_ListOfShape& aLE, 
60                 TopoDS_Wire& newWire);
61
62 //modified by NIZNHY-PKV Thu Jun 10 11:26:55 2010f
63 static
64   Standard_Boolean IsToScale(const TopoDS_Face& aF, 
65                              Standard_Real& aScale);
66 //modified by NIZNHY-PKV Thu Jun 10 11:27:02 2010t
67 //=======================================================================
68 // function: 
69 // purpose: 
70 //=======================================================================
71   GEOMAlgo_WESCorrector::GEOMAlgo_WESCorrector()
72 :
73   GEOMAlgo_Algo()
74 {
75 }
76 //=======================================================================
77 // function: ~
78 // purpose: 
79 //=======================================================================
80   GEOMAlgo_WESCorrector::~GEOMAlgo_WESCorrector()
81 {
82 }
83 //=======================================================================
84 // function: SetWES
85 // purpose: 
86 //=======================================================================
87   void GEOMAlgo_WESCorrector::SetWES (const GEOMAlgo_WireEdgeSet& aWES)
88 {
89   GEOMAlgo_WireEdgeSet* pWES=(GEOMAlgo_WireEdgeSet*) &aWES;
90   myWES=pWES;
91 }
92 //=======================================================================
93 // function: WES
94 // purpose: 
95 //=======================================================================
96   GEOMAlgo_WireEdgeSet& GEOMAlgo_WESCorrector::WES () 
97 {
98   return *myWES;
99 }
100 //=======================================================================
101 // function: NewWES
102 // purpose: 
103 //=======================================================================
104   GEOMAlgo_WireEdgeSet& GEOMAlgo_WESCorrector::NewWES () 
105 {
106   return myNewWES;
107 }
108 //=======================================================================
109 // function: Perform
110 // purpose: 
111 //=======================================================================
112   void GEOMAlgo_WESCorrector::Perform()
113 {
114   myErrorStatus=0;
115   //
116   DoConnexityBlocks();
117   DoCorrections();
118 }
119 //=======================================================================
120 // function: DoConnexityBlocks
121 // purpose: 
122 //=======================================================================
123   void GEOMAlgo_WESCorrector::DoConnexityBlocks()
124 {
125   Standard_Boolean bRegular, bClosed;
126   Standard_Integer i, aNbV, j, aNbC, aNbVP, aNbVS;
127   TopTools_ListIteratorOfListOfShape aIt;
128   TopoDS_Iterator aItE;
129   TopoDS_Shape aER;
130   TopTools_IndexedMapOfShape aMER, aMEP, aMEC, aMVP;
131   TopTools_IndexedMapOfShape aMVS, aMVAdd;
132   TopTools_IndexedDataMapOfShapeListOfShape aMVE;
133   //
134   // 1. aMVE;
135   const TopTools_ListOfShape& aLSE=myWES->StartElements();
136   aIt.Initialize(aLSE);
137   for (; aIt.More(); aIt.Next()) {
138     const TopoDS_Shape& aE=aIt.Value();
139     if (!aMEP.Contains(aE)) {
140       aMEP.Add(aE);
141       TopExp::MapShapesAndAncestors(aE, TopAbs_VERTEX, TopAbs_EDGE, aMVE);
142     }
143     else {
144       aMER.Add(aE);
145     }
146   }
147   //
148   // 2. 
149   aNbV=aMVE.Extent();
150   for (i=1; i<=aNbV; ++i) {
151     const TopoDS_Shape& aV=aMVE.FindKey(i);
152     //
153     aNbVS=aMVS.Extent();
154     if (aNbVS==aNbV) {
155       break;
156     }
157     //
158     if (aMVS.Contains(aV)) {
159       continue;
160     }
161     aMVS.Add(aV);    // aMVS - globally processed vertices
162     //
163     //------------------------------------- goal: aMEC
164     aMEC.Clear();    // aMEC - edges of CB
165     aMVP.Clear();    // aMVP - vertices to process right now 
166     aMVAdd.Clear();  // aMVAdd vertices to process on next step of while(1)
167     //
168     aMVP.Add(aV);
169     //
170     while(1) {
171       aNbVP=aMVP.Extent();
172       for (j=1; j<=aNbVP; ++j) {
173         const TopoDS_Shape& aVP=aMVP(j);
174         const TopTools_ListOfShape& aLE=aMVE.FindFromKey(aVP);
175         aIt.Initialize(aLE);
176         for (; aIt.More(); aIt.Next()) {
177           const TopoDS_Shape& aE=aIt.Value();
178           if (aMEC.Contains(aE)) {
179             continue;
180           }
181           aMEC.Add(aE);
182           //
183           aItE.Initialize(aE);
184           for (; aItE.More(); aItE.Next()) {
185             const TopoDS_Shape& aVE=aItE.Value();
186             if (!aMVS.Contains(aVE)) {
187               aMVS.Add(aVE);
188               aMVAdd.Add(aVE);
189             }
190           }
191         }
192       }//for (j=1; j<=aNbVP; ++j) 
193       //
194       aNbVP=aMVAdd.Extent();
195       if (!aNbVP) {
196         break; // from while(1)
197       }
198       //
199       aMVP.Clear();
200       for (j=1; j<=aNbVP; ++j) {
201         const TopoDS_Shape& aVE=aMVAdd(j);
202         aMVP.Add(aVE);
203       }
204       aMVAdd.Clear();
205     }// while(1) {
206     //-------------------------------------
207     BOP_ConnexityBlock aCB;
208     TopTools_ListOfShape aLEC;
209     TopTools_IndexedDataMapOfShapeListOfShape aMVER;
210     //
211     bRegular=Standard_True;
212    
213     aNbC=aMEC.Extent();
214     for (j=1; j<=aNbC; ++j) {
215       aER=aMEC(j);
216       //
217       if (aMER.Contains(aER)) {
218         aER.Orientation(TopAbs_FORWARD);
219         aLEC.Append(aER);
220         aER.Orientation(TopAbs_REVERSED);
221         aLEC.Append(aER);
222         //
223         bRegular=Standard_False;
224       }
225       else {
226         aLEC.Append(aER);
227       }
228       //
229       if (bRegular) {
230         TopExp::MapShapesAndAncestors(aER, TopAbs_VERTEX, TopAbs_EDGE, aMVER);
231       }
232     }//for (j=1; j<=aNbC; ++j) {
233     //
234     if (bRegular) {
235       Standard_Integer k, aNbVR, aNbER;
236       //
237       aNbVR=aMVER.Extent();
238       for (k=1; k<=aNbVR; ++k) {
239         const TopTools_ListOfShape& aLER=aMVER(k);
240         aNbER=aLER.Extent();
241         if (aNbER==1) {
242           const TopoDS_Edge& aEx=TopoDS::Edge(aER);
243           bClosed=BRep_Tool::IsClosed(aEx, myWES->Face());
244           if (!bClosed) {
245             bRegular=!bRegular;
246             break;
247           }
248         }
249         if (aNbER>2) {
250           bRegular=!bRegular;
251           break;
252         }
253       }
254     }
255     //
256     aCB.SetShapes(aLEC);
257     aCB.SetRegularity(bRegular);
258     myConnexityBlocks.Append(aCB);
259     aMEC.Clear();
260   }//for (i=1; i<=aNbV; ++i) {
261 }
262
263 //=======================================================================
264 // function: DoCorrections
265 // purpose: 
266 //=======================================================================
267   void GEOMAlgo_WESCorrector::DoCorrections()
268 {
269   Standard_Boolean bIsRegular, bIsNothingToDo, bToScale;
270   Standard_Integer iErr;
271   Standard_Real aScale;
272   TopoDS_Wire aW;
273   BOP_ListIteratorOfListOfConnexityBlock aCBIt;
274   GEOMAlgo_WESScaler aWSC;
275   //
276   const TopoDS_Face& aF=myWES->Face();
277   //modified by NIZNHY-PKV Thu Jun 10 11:27:45 2010f
278   bToScale=IsToScale(aF, aScale);
279   //modified by NIZNHY-PKV Thu Jun 10 11:27:49 2010t
280   //
281   myNewWES.SetFace(aF);
282   aCBIt.Initialize(myConnexityBlocks);
283   for (; aCBIt.More(); aCBIt.Next()) {
284     const BOP_ConnexityBlock& aCB=aCBIt.Value();
285     const TopTools_ListOfShape& aLE=aCB.Shapes();
286     //
287     bIsRegular=aCB.IsRegular();
288     if (bIsRegular) {
289       MakeWire(aLE, aW);
290       myNewWES.AddShape (aW);
291       continue;
292     }
293     //
294     GEOMAlgo_WireSplitter aWS;
295     //
296     //modified by NIZNHY-PKV Thu Jun 10 10:40:43 2010f
297     if(bToScale) {
298       TopoDS_Shape aE;
299       TopTools_ListIteratorOfListOfShape aIt;
300       BOPTColStd_ListIteratorOfListOfListOfShape aItLLSS;
301       //
302       aWSC.SetScale(aScale);
303       aWSC.SetFace(aF);
304       aWSC.SetEdges(aLE);
305       //
306       aWSC.Perform();
307       iErr=aWSC.ErrorStatus();
308       if (iErr) {
309         return;
310       }
311       //
312       const TopoDS_Face& aFS=aWSC.FaceScaled();
313       const TopTools_ListOfShape& aLES=aWSC.EdgesScaled();
314       //
315       aWS.SetFace(aFS);
316       aWS.SetEdges(aLES);
317       //
318       aWS.Perform();
319       iErr=aWS.ErrorStatus();
320       if (iErr) {
321         continue;
322       }
323       //
324       bIsNothingToDo=aWS.IsNothingToDo();
325       if (bIsNothingToDo) {
326         MakeWire(aLE, aW);
327         myNewWES.AddShape (aW);
328         continue;
329       }
330       //
331       const BOPTColStd_ListOfListOfShape& aLLSS=aWS.Shapes();
332       aItLLSS.Initialize(aLLSS);
333       for (; aItLLSS.More(); aItLLSS.Next()) {
334         TopTools_ListOfShape aLS;
335         //
336         const TopTools_ListOfShape& aLSS=aItLLSS.Value();
337         aIt.Initialize(aLSS);
338         for (; aIt.More(); aIt.Next()) {
339           const TopoDS_Shape& aES=aIt.Value();
340           aE=aWSC.Origin(aES);
341           aLS.Append(aE);
342         }
343         //
344         MakeWire(aLS, aW);
345         myNewWES.AddShape (aW);
346       }
347     }//if(bToScale)
348     //modified by NIZNHY-PKV Thu Jun 10 10:40:48 2010t
349     //
350     else {
351       aWS.SetFace(aF);
352       aWS.SetEdges(aLE);
353       //
354       aWS.Perform();
355       iErr=aWS.ErrorStatus();
356       if (iErr) {
357         continue;
358       }
359       bIsNothingToDo=aWS.IsNothingToDo();
360       if (bIsNothingToDo) {
361         MakeWire(aLE, aW);
362         myNewWES.AddShape (aW);
363         continue;
364       }
365       //
366       const BOPTColStd_ListOfListOfShape& aSSS=aWS.Shapes();
367     
368       BOPTColStd_ListIteratorOfListOfListOfShape aWireIt(aSSS);
369       for (; aWireIt.More(); aWireIt.Next()) {
370         const TopTools_ListOfShape& aLEx=aWireIt.Value();
371         //
372         MakeWire(aLEx, aW);
373         myNewWES.AddShape (aW);
374       }
375     }// else
376   }
377 }
378 //=======================================================================
379 // function: MakeWire
380 // purpose: 
381 //=======================================================================
382   void MakeWire(const TopTools_ListOfShape& aLE, 
383                 TopoDS_Wire& newWire)
384 {
385   BRep_Builder aBB;
386   aBB.MakeWire(newWire);
387
388   TopTools_ListIteratorOfListOfShape anIt(aLE);
389   for (; anIt.More(); anIt.Next()){
390     const TopoDS_Edge& aE=TopoDS::Edge(anIt.Value());
391     aBB.Add(newWire, aE);
392   }
393 }
394 //
395 //modified by NIZNHY-PKV Thu Jun 10 11:14:09 2010f
396
397 #include <Geom_Surface.hxx>
398 #include <TopLoc_Location.hxx>
399 #include <BRepAdaptor_Surface.hxx>
400  
401 //=======================================================================
402 //function : IsToScale
403 //purpose  : 
404 //=======================================================================
405 Standard_Boolean IsToScale(const TopoDS_Face& aF, 
406                            Standard_Real& aScale)
407 {
408   Standard_Boolean bRet;
409   Standard_Real aV1, aV2, dV, aTr;
410   GeomAbs_SurfaceType aType;
411   BRepAdaptor_Surface aBAS;
412   //
413   bRet=Standard_False;
414   aScale=1.;
415   //
416   aBAS.Initialize(aF);
417   aType=aBAS.GetType();
418   if (aType==GeomAbs_Cylinder) {
419     aTr=1.e5;
420     aV1=aBAS.FirstVParameter();
421     aV2=aBAS.LastVParameter();
422     dV=aV2-aV1;
423     if (dV>aTr) {
424       bRet=!bRet;
425       aScale=1./aTr;
426     }
427   }
428   return bRet;
429 }
430 //modified by NIZNHY-PKV Thu Jun 10 11:14:12 2010t
431