Salome HOME
73cb875017dfe4ff19ca1905183e3cabd0d5ce57
[modules/geom.git] / src / NMTTools / NMTTools_PaveFiller_2.cxx
1 // Copyright (C) 2007-2011  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:        NMTTools_PaveFiller_2.cxx
23 // Created:     Mon Dec  8 12:02:56 2003
24 // Author:      Peter KURNEV
25
26 #include <Standard_Version.hxx>
27
28 #include <NMTTools_PaveFiller.ixx>
29
30 #include <CASCatch_OCCTVersion.hxx>
31
32 #include <Precision.hxx>
33
34 #include <gp_Pnt.hxx>
35
36 #include <Geom_Curve.hxx>
37
38 #include <TopAbs_Orientation.hxx>
39
40 #include <TopoDS.hxx>
41 #include <TopoDS_Edge.hxx>
42 #include <TopoDS_Vertex.hxx>
43 #include <TopoDS_Iterator.hxx>
44
45 #include <BRep_Builder.hxx>
46 #include <BRep_Tool.hxx>
47
48 #include <BOPTools_Pave.hxx>
49 #include <BOPTools_PaveSet.hxx>
50 #include <BOPTools_CArray1OfVEInterference.hxx>
51 #include <BOPTools_VEInterference.hxx>
52
53 #include <BooleanOperations_AncestorsSeqAndSuccessorsSeq.hxx>
54
55 #include <NMTDS_Iterator.hxx>
56 #include <NMTDS_ShapesDataStructure.hxx>
57 #include <NMTDS_InterfPool.hxx>
58
59 // Modified  Thu Sep 14 14:35:18 2006
60 // Contribution of Samtech www.samcef.com BEGIN
61 #include <BOPTools_IndexedMapOfCoupleOfInteger.hxx>
62 #include <BOPTools_CoupleOfInteger.hxx>
63 #include <BooleanOperations_OnceExplorer.hxx>
64
65 static
66   Standard_Boolean Contains(const TopoDS_Edge& aE,
67                             const TopoDS_Vertex& aV);
68 // Contribution of Samtech www.samcef.com END
69
70 //=======================================================================
71 // function: PerformVE
72 // purpose:
73 //=======================================================================
74 void NMTTools_PaveFiller::PerformVE()
75 {
76   myIsDone=Standard_False;
77   //
78   Standard_Boolean bJustAdd;
79   Standard_Integer n1, n2, anIndexIn, aFlag, aWhat;
80   Standard_Integer aWith, aNbVEs, aBlockLength, iSDV, nV1;
81   Standard_Real aT;
82 #if OCC_VERSION_LARGE > 0x06030008
83   // In OCCT6.3.0sp9 is changed a signature of IntTools_Context::ComputeVE() method
84   Standard_Boolean bToUpdateVertex;
85   Standard_Real aDist;
86 #endif
87   TopoDS_Vertex aV1;
88   TopoDS_Edge aE2;
89   BOPTools_IndexedMapOfCoupleOfInteger aSnareMap;
90   BOPTools_CoupleOfInteger aCouple;
91   //
92   BOPTools_CArray1OfVEInterference& aVEs=myIP->VEInterferences();
93   //
94   myDSIt->Initialize (TopAbs_VERTEX, TopAbs_EDGE);
95   //
96   // BlockLength correction
97   aNbVEs=myDSIt->BlockLength();
98   aBlockLength=aVEs.BlockLength();
99   if (aNbVEs > aBlockLength) {
100     aVEs.SetBlockLength(aNbVEs);
101   }
102   //
103   for (; myDSIt->More(); myDSIt->Next()) {
104     myDSIt->Current(n1, n2, bJustAdd);
105     if (!IsSuccessorsComputed(n1, n2)) {
106       anIndexIn=0;
107       aWhat=n1; // Vertex
108       aWith=n2; // Edge
109       if (myDS->GetShapeType(n1)==TopAbs_EDGE) {
110         aWhat=n2;
111         aWith=n1;
112       }
113       //
114       if(bJustAdd) {
115         continue;
116       }
117       // Edge
118       aE2=TopoDS::Edge(myDS->Shape(aWith));
119       if (BRep_Tool::Degenerated(aE2)){
120         continue;
121       }
122       // Vertex
123       nV1=aWhat;
124       aV1=TopoDS::Vertex(myDS->Shape(aWhat));
125       //
126       iSDV=FindSDVertex(aWhat);
127       if (iSDV) {
128         nV1=iSDV;
129         aV1=TopoDS::Vertex(myDS->Shape(nV1));
130         // Modified to find same domain vertex Thu Sep 14 14:35:18 2006
131         // Contribution of Samtech www.samcef.com BEGIN
132         Standard_Integer nVE, iSDVE, iRet;
133         //
134         BooleanOperations_OnceExplorer aExp(*myDS);
135         iRet=0;
136         aExp.Init(aWith, TopAbs_VERTEX);
137         for (; aExp.More(); aExp.Next()) {
138           nVE=aExp.Current();
139           iSDVE=FindSDVertex(nVE);
140           if (iSDVE==iSDV) {
141             iRet=1;
142             break;
143           }
144         }
145         if (iRet) {
146           continue;
147         }
148       }
149       else {
150         if (Contains(aE2, aV1)) {
151           continue;
152         }
153         // Contribution of Samtech www.samcef.com END
154       }
155       //
156       //modified by NIZNHY-PKV Mon Dec 28 08:58:05 2009f
157 #if OCC_VERSION_LARGE > 0x06030008
158       // In OCCT6.3.0sp9 is changed a signature of IntTools_Context::ComputeVE() method
159       aFlag = myContext.ComputeVE (aV1, aE2, aT, bToUpdateVertex, aDist);
160 #else
161       aFlag = myContext.ComputeVE (aV1, aE2, aT);
162 #endif
163       //modified by NIZNHY-PKV Mon Dec 28 08:58:13 2009t
164       //
165       if (!aFlag) {
166         // Add Interference to the Pool
167         BOPTools_VEInterference anInterf (aWhat, aWith, aT);
168         anIndexIn=aVEs.Append(anInterf);
169         //
170         // Add Pave to the Edge's myPavePool
171         aCouple.SetCouple(nV1, aWith);
172         if (!aSnareMap.Contains(aCouple)){
173           aSnareMap.Add(aCouple);
174           //
175           BOPTools_Pave aPave(nV1, aT, BooleanOperations_VertexEdge);
176           aPave.SetInterference(anIndexIn);
177           BOPTools_PaveSet& aPaveSet= myPavePool(myDS->RefEdge(aWith));
178           aPaveSet.Append(aPave);
179         }
180         //
181         // State for the Vertex in DS;
182         myDS->SetState (aWhat, BooleanOperations_ON);
183         // Insert Vertex in Interference Object
184         BOPTools_VEInterference& aVE=aVEs(anIndexIn);
185         aVE.SetNewShape(aWhat);
186         //
187         myIP->Add(aWhat, aWith, Standard_True, NMTDS_TI_VE);
188         //
189         //modified by NIZNHY-PKV Mon Dec 28 09:00:54 2009f
190 #if OCC_VERSION_LARGE > 0x06030008
191         // In OCCT6.3.0sp9 is changed a signature of IntTools_Context::ComputeVE() method
192         if (bToUpdateVertex) {
193           BRep_Builder aBB;
194           //
195           aBB.UpdateVertex(aV1, aDist);
196         }
197 #endif
198         //modified by NIZNHY-PKV Mon Dec 28 09:00:57 2009t
199         //
200       } //if (!aFlag) {
201     }
202   }
203   myIsDone=Standard_True;
204 }
205
206 //=======================================================================
207 // function: PrepareEdges
208 // purpose:
209 //=======================================================================
210 void NMTTools_PaveFiller::PrepareEdges()
211 {
212   Standard_Integer  i, nV, ii, aNBSuc, ip, aNbShapesObject;
213   Standard_Real aT;
214   TopAbs_Orientation anOr;
215   TopoDS_Edge   aE;
216   TopoDS_Vertex aV;
217   //
218   aNbShapesObject=myDS->NumberOfShapesOfTheObject();
219   for (i=1; i<=myNbSources; ++i) {
220     if (myDS->GetShapeType(i)==TopAbs_EDGE) {
221       aE=TopoDS::Edge(myDS->Shape(i));
222       //
223       if (BRep_Tool::Degenerated(aE)){
224         continue;
225       }
226       //
227       BOPTools_PaveSet& aPaveSet=myPavePool(myDS->RefEdge(i));
228       //
229       // A <-
230       aNBSuc=myDS->NumberOfSuccessors(i);
231       for (ii=1; ii <=aNBSuc; ii++) {
232         nV=myDS->GetSuccessor(i, ii);
233         anOr=myDS->GetOrientation(i, ii);
234         aV=TopoDS::Vertex(myDS->Shape(nV));
235         aV.Orientation(anOr);
236         aT=BRep_Tool::Parameter(aV, aE);
237         //
238         ip=FindSDVertex(nV);
239         if (ip) {
240           aV=TopoDS::Vertex(myDS->Shape(ip));
241           aV.Orientation(anOr);// XX ? if the edge is closed it'll be amazing result
242           nV=ip;
243         }
244         //
245         BOPTools_Pave aPave(nV, aT);
246         aPaveSet.Append (aPave);
247       }
248     }
249   }
250 }
251
252 // Modified  Thu Sep 14 14:35:18 2006
253 // Contribution of Samtech www.samcef.com BEGIN
254 //=======================================================================
255 //function : Contains
256 //purpose  :
257 //=======================================================================
258 Standard_Boolean Contains(const TopoDS_Edge& aE,
259                           const TopoDS_Vertex& aV)
260 {
261   Standard_Boolean bRet;
262   TopoDS_Iterator aIt;
263   //
264   bRet=Standard_False;
265   aIt.Initialize(aE);
266   for (; aIt.More(); aIt.Next()) {
267     const TopoDS_Shape& aVE=aIt.Value();
268     if (aVE.IsSame(aV)) {
269       bRet=!bRet;
270       break;
271     }
272   }
273   return bRet;
274 }
275 // Contribution of Samtech www.samcef.com END