0028259: Method MakeBlocksCnx is duplicated in two different places in BOPAlgo
[occt.git] / src / BOPAlgo / BOPAlgo_PaveFiller_1.cxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 2010-2014 OPEN CASCADE SAS
3 // Copyright (c) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
4 // Copyright (c) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT,
5 //                         EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 //
7 // This file is part of Open CASCADE Technology software library.
8 //
9 // This library is free software; you can redistribute it and/or modify it under
10 // the terms of the GNU Lesser General Public License version 2.1 as published
11 // by the Free Software Foundation, with special exception defined in the file
12 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
13 // distribution for complete text of the license and disclaimer of any warranty.
14 //
15 // Alternatively, this file may be used under the terms of Open CASCADE
16 // commercial license or contractual agreement.
17
18
19 #include <Bnd_Box.hxx>
20 #include <BOPAlgo_PaveFiller.hxx>
21 #include <BOPAlgo_SectionAttribute.hxx>
22 #include <BOPAlgo_Tools.hxx>
23 #include <BOPCol_DataMapOfIntegerInteger.hxx>
24 #include <BOPCol_DataMapOfIntegerListOfInteger.hxx>
25 #include <BOPCol_IndexedDataMapOfIntegerListOfInteger.hxx>
26 #include <BOPCol_ListOfShape.hxx>
27 #include <BOPCol_MapOfInteger.hxx>
28 #include <BOPDS_Curve.hxx>
29 #include <BOPDS_DS.hxx>
30 #include <BOPDS_Iterator.hxx>
31 #include <BOPDS_PaveBlock.hxx>
32 #include <BOPDS_ShapeInfo.hxx>
33 #include <BOPDS_VectorOfInterfVV.hxx>
34 #include <BOPTools_AlgoTools.hxx>
35 #include <BRepBndLib.hxx>
36 #include <BRep_TVertex.hxx>
37 #include <BRep_Tool.hxx>
38 #include <gp_Pnt.hxx>
39 #include <IntTools_Context.hxx>
40 #include <NCollection_BaseAllocator.hxx>
41 #include <Precision.hxx>
42 #include <TopoDS.hxx>
43 #include <TopoDS_Face.hxx>
44 #include <TopoDS_Vertex.hxx>
45
46 //=======================================================================
47 // function: PerformVV
48 // purpose: 
49 //=======================================================================
50 void BOPAlgo_PaveFiller::PerformVV() 
51 {
52   Standard_Integer n1, n2, iFlag, aSize;
53   Handle(NCollection_BaseAllocator) aAllocator;
54   //
55   myErrorStatus=0;
56   //
57   myIterator->Initialize(TopAbs_VERTEX, TopAbs_VERTEX);
58   aSize=myIterator->ExpectedLength();
59   if (!aSize) {
60     return; 
61   }
62   //
63   BOPDS_VectorOfInterfVV& aVVs=myDS->InterfVV();
64   aVVs.SetIncrement(aSize);
65   //
66   //-----------------------------------------------------scope f
67   aAllocator=
68     NCollection_BaseAllocator::CommonBaseAllocator();
69   BOPCol_IndexedDataMapOfIntegerListOfInteger aMILI(100, aAllocator);
70   NCollection_List<BOPCol_ListOfInteger> aMBlocks(aAllocator);
71   //
72   // 1. Map V/LV
73   for (; myIterator->More(); myIterator->Next()) {
74     myIterator->Value(n1, n2);
75     //
76     const TopoDS_Vertex& aV1=(*(TopoDS_Vertex *)(&myDS->Shape(n1))); 
77     const TopoDS_Vertex& aV2=(*(TopoDS_Vertex *)(&myDS->Shape(n2))); 
78     //
79     iFlag=BOPTools_AlgoTools::ComputeVV(aV1, aV2, myFuzzyValue);
80     if (!iFlag) {
81       BOPAlgo_Tools::FillMap<Standard_Integer, TColStd_MapIntegerHasher>(n1, n2, aMILI, aAllocator);
82     }
83   } 
84   //
85   // 2. Make blocks
86   BOPAlgo_Tools::MakeBlocks<Standard_Integer, TColStd_MapIntegerHasher>(aMILI, aMBlocks, aAllocator);
87   //
88   // 3. Make vertices
89   NCollection_List<BOPCol_ListOfInteger>::Iterator aItB(aMBlocks);
90   for (; aItB.More(); aItB.Next()) {
91     const BOPCol_ListOfInteger& aLI = aItB.Value();
92     MakeSDVertices(aLI);
93   }
94   //
95   BOPCol_DataMapIteratorOfDataMapOfIntegerInteger aItDMII;
96   //
97   BOPCol_DataMapOfIntegerInteger& aDMII=myDS->ShapesSD();
98   aItDMII.Initialize(aDMII);
99   for (; aItDMII.More(); aItDMII.Next()) {
100     n1=aItDMII.Key();
101     myDS->InitPaveBlocksForVertex(n1);
102   }
103   //
104   //-----------------------------------------------------scope t
105   aMBlocks.Clear();
106   aMILI.Clear();
107 }
108
109 //=======================================================================
110 // function: PerformVV
111 // purpose: 
112 //=======================================================================
113 Standard_Integer BOPAlgo_PaveFiller::MakeSDVertices
114    (const BOPCol_ListOfInteger& theVertIndices,
115     const Standard_Boolean theAddInterfs)
116 {
117   TopoDS_Vertex aVSD, aVn;
118   Standard_Integer nSD = -1;
119   BOPCol_ListIteratorOfListOfInteger aItLI(theVertIndices);
120   BOPCol_ListOfShape aLV;
121   for (; aItLI.More(); aItLI.Next()) {
122     Standard_Integer nX = aItLI.Value(), nSD1;
123     if (myDS->HasShapeSD(nX, nSD1)) {
124       const TopoDS_Shape& aVSD1 = myDS->Shape(nSD1);
125       if (nSD == -1) {
126         aVSD = TopoDS::Vertex(aVSD1);
127         nSD = nSD1;
128       }
129       else {
130         aLV.Append(aVSD1);
131       }
132     }
133     const TopoDS_Shape& aV = myDS->Shape(nX);
134     aLV.Append(aV);
135   }
136   BOPTools_AlgoTools::MakeVertex(aLV, aVn);
137   Standard_Integer nV;
138   if (nSD != -1) {
139     // update old SD vertex with new value
140     Handle(BRep_TVertex)& aTVertex =
141       reinterpret_cast<Handle(BRep_TVertex)&>(const_cast<Handle(TopoDS_TShape)&>(aVSD.TShape()));
142     aTVertex->Pnt(BRep_Tool::Pnt(aVn));
143     aTVertex->Tolerance(BRep_Tool::Tolerance(aVn));
144     aVn = aVSD;
145     nV = nSD;
146   }
147   else {
148     // Append new vertex to the DS
149     BOPDS_ShapeInfo aSIn;
150     aSIn.SetShapeType(TopAbs_VERTEX);
151     aSIn.SetShape(aVn);
152     nV = myDS->Append(aSIn);
153   }
154   BOPDS_ShapeInfo& aSIDS = myDS->ChangeShapeInfo(nV);
155   Bnd_Box& aBox = aSIDS.ChangeBox();
156   BRepBndLib::Add(aVn, aBox);
157   aBox.SetGap(aBox.GetGap() + Precision::Confusion());
158   //
159   // Fill ShapesSD
160   BOPDS_VectorOfInterfVV& aVVs = myDS->InterfVV();
161   if (theAddInterfs)
162     aVVs.SetIncrement(theVertIndices.Extent());
163   //
164   aItLI.Initialize(theVertIndices);
165   for (; aItLI.More(); aItLI.Next()) {
166     Standard_Integer n1 = aItLI.Value();
167     myDS->AddShapeSD(n1, nV);
168     //
169     if (theAddInterfs) {
170       BOPCol_ListIteratorOfListOfInteger aItLI2 = aItLI;
171       aItLI2.Next();
172       for (; aItLI2.More(); aItLI2.Next()) {
173         Standard_Integer n2 = aItLI2.Value();
174         //
175         myDS->AddInterf(n1, n2);
176         BOPDS_InterfVV& aVV = aVVs.Append1();
177         //
178         aVV.SetIndices(n1, n2);
179         aVV.SetIndexNew(nV);
180       }
181     }
182   }
183   return nV;
184 }