Salome HOME
Mantis issue 0020894: EDF 1421 GEOM: Partition Bug with big geometrical objects....
[modules/geom.git] / src / NMTTools / NMTTools_PaveFiller_3.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
23 // File:        NMTTools_PaveFiller_3.cxx
24 // Created:     Mon Dec  8 16:06:56 2003
25 // Author:      Peter KURNEV
26 //              <pkv@irinox>
27 //
28 #include <NMTTools_PaveFiller.ixx>
29
30 #include <TopoDS.hxx>
31 #include <TopoDS_Shape.hxx>
32 #include <TopoDS_Vertex.hxx>
33 #include <TopoDS_Face.hxx>
34
35 #include <TopExp_Explorer.hxx>
36
37 #include <BOPTools_VSInterference.hxx>
38 #include <BOPTools_CArray1OfVSInterference.hxx>
39
40 #include <NMTDS_Iterator.hxx>
41 #include <NMTDS_ShapesDataStructure.hxx>
42 #include <NMTDS_InterfPool.hxx>
43
44
45 // Modified  Thu Sep 14 14:35:18 2006 
46 // Contribution of Samtech www.samcef.com BEGIN
47 static
48   Standard_Boolean Contains(const TopoDS_Face& aF,
49                             const TopoDS_Vertex& aV);
50 // Contribution of Samtech www.samcef.com END
51 //=======================================================================
52 // function: PerformVF
53 // purpose: 
54 //=======================================================================
55   void NMTTools_PaveFiller::PerformVF() 
56 {
57   myIsDone=Standard_False;
58   //
59   Standard_Boolean aJustAdd;
60   Standard_Integer n1, n2, anIndexIn, aFlag, aWhat, aWith, aNbVSs, aBlockLength, iSDV;
61   Standard_Real aU, aV;
62   TopoDS_Vertex aV1;
63   TopoDS_Face aF2;
64   //
65   BOPTools_CArray1OfVSInterference& aVSs=myIP->VSInterferences();
66   //
67   // V/E Interferences 
68   myDSIt->Initialize(TopAbs_VERTEX, TopAbs_FACE);
69   //
70   // BlockLength correction
71   aNbVSs=myDSIt->BlockLength();
72   aBlockLength=aVSs.BlockLength();
73   if (aNbVSs > aBlockLength) {
74     aVSs.SetBlockLength(aNbVSs);
75   }
76   //
77   for (; myDSIt->More(); myDSIt->Next()) {
78     myDSIt->Current(n1, n2, aJustAdd);
79     if (! IsSuccessorsComputed(n1, n2)) {
80       anIndexIn=0;
81       aWhat=n1; // Vertex
82       aWith=n2; // Face
83       if (myDS->GetShapeType(n1)==TopAbs_FACE) {
84         aWhat=n2;
85         aWith=n1;
86       }
87       //
88       iSDV=FindSDVertex(aWhat);
89         //
90       if(aJustAdd) {
91         //myIntrPool->AddInterference(aWhat, aWith, BooleanOperations_VertexSurface, anIndexIn);
92         continue;
93       }
94       //
95       aV1=TopoDS::Vertex(myDS->Shape(aWhat));
96       if (iSDV) {
97         aV1=TopoDS::Vertex(myDS->Shape(iSDV));
98       }
99         //
100       aF2=TopoDS::Face(myDS->Shape(aWith));
101       //
102       // Modified  Thu Sep 14 14:35:18 2006 
103       // Contribution of Samtech www.samcef.com BEGIN
104       if (Contains(aF2, aV1)) {
105         continue;
106       }
107       // Contribution of Samtech www.samcef.com END
108       //
109       aFlag=myContext.ComputeVS (aV1, aF2, aU, aV);
110       //
111       if (!aFlag) {
112         //
113         // Add Interference to the Pool
114         BOPTools_VSInterference anInterf (aWhat, aWith, aU, aV);
115         anIndexIn=aVSs.Append(anInterf);
116         //
117         // SetState for Vertex in DS;
118         myDS->SetState (aWhat, BooleanOperations_ON);
119         // Insert Vertex in Interference Object
120         BOPTools_VSInterference& aVS=aVSs(anIndexIn);
121         aVS.SetNewShape(aWhat);
122         // qqf
123         {
124           myIP->Add(aWhat, aWith, Standard_True, NMTDS_TI_VF);
125         }
126         // qqt
127       }
128       //myIntrPool->AddInterference(aWhat, aWith, BooleanOperations_VertexSurface, anIndexIn);
129     }
130   }
131   myIsDone=Standard_True;
132 }
133 // Modified  Thu Sep 14 14:35:18 2006 
134 // Contribution of Samtech www.samcef.com BEGIN
135 //=======================================================================
136 //function : Contains
137 //purpose  : 
138 //=======================================================================
139 Standard_Boolean Contains(const TopoDS_Face& aF,
140                           const TopoDS_Vertex& aV)
141 {
142   Standard_Boolean bRet;
143   TopExp_Explorer aExp;
144   //
145   bRet=Standard_False;
146   aExp.Init(aF, TopAbs_VERTEX);
147   for (; aExp.More(); aExp.Next()) {
148     const TopoDS_Shape& aVF=aExp.Current();
149     if (aVF.IsSame(aV)) {
150       bRet=!bRet;
151       break;
152     }
153   }
154   return bRet;
155 }
156 // Contribution of Samtech www.samcef.com END