0024002: Overall code and build procedure refactoring -- automatic
[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_DataMapOfIntegerListOfInteger.hxx>
24 #include <BOPCol_ListOfShape.hxx>
25 #include <BOPCol_MapOfInteger.hxx>
26 #include <BOPDS_Curve.hxx>
27 #include <BOPDS_DS.hxx>
28 #include <BOPDS_Iterator.hxx>
29 #include <BOPDS_PaveBlock.hxx>
30 #include <BOPDS_ShapeInfo.hxx>
31 #include <BOPDS_VectorOfInterfVV.hxx>
32 #include <BOPTools_AlgoTools.hxx>
33 #include <BRepBndLib.hxx>
34 #include <gp_Pnt.hxx>
35 #include <IntTools_Context.hxx>
36 #include <NCollection_BaseAllocator.hxx>
37 #include <NCollection_IncAllocator.hxx>
38 #include <TopoDS_Face.hxx>
39 #include <TopoDS_Vertex.hxx>
40
41 //=======================================================================
42 // function: PerformVV
43 // purpose: 
44 //=======================================================================
45   void BOPAlgo_PaveFiller::PerformVV() 
46 {
47   Standard_Boolean bWithSubShape;
48   Standard_Integer n1, n2, iFlag, nX, n, aSize, i, j, k, aNbBlocks;
49   Handle(NCollection_IncAllocator) aAllocator;
50   BOPCol_DataMapIteratorOfDataMapOfIntegerListOfInteger aItMILI;
51   BOPCol_ListIteratorOfListOfInteger aItLI, aItLI2;
52   TopoDS_Vertex aVn;
53   BOPDS_ShapeInfo aSIn;
54   //
55   myErrorStatus=0;
56   //
57   myIterator->Initialize(TopAbs_VERTEX, TopAbs_VERTEX);
58   aSize=myIterator->ExpectedLength();
59   if (!aSize) {
60     return; 
61   }
62   //
63   aSIn.SetShapeType(TopAbs_VERTEX);
64   
65   BOPDS_VectorOfInterfVV& aVVs=myDS->InterfVV();
66   aVVs.SetIncrement(aSize);
67   //
68   //-----------------------------------------------------scope f
69   aAllocator=new NCollection_IncAllocator();
70   BOPCol_IndexedDataMapOfIntegerListOfInteger aMILI(100, aAllocator);
71   BOPCol_DataMapOfIntegerListOfInteger aMBlocks(100, aAllocator);
72   BOPCol_ListOfShape aLV(aAllocator);
73   //
74   // 1. Map V/LV
75   for (; myIterator->More(); myIterator->Next()) {
76     myIterator->Value(n1, n2, bWithSubShape);
77     //
78     const TopoDS_Vertex& aV1=(*(TopoDS_Vertex *)(&myDS->Shape(n1))); 
79     const TopoDS_Vertex& aV2=(*(TopoDS_Vertex *)(&myDS->Shape(n2))); 
80     //
81     iFlag=BOPTools_AlgoTools::ComputeVV(aV1, aV2);
82     if (!iFlag) {
83       BOPAlgo_Tools::FillMap(n1, n2, aMILI, aAllocator);
84     }
85   } 
86   //
87   // 2. Make blocks
88   BOPAlgo_Tools::MakeBlocksCnx(aMILI, aMBlocks, aAllocator);
89   //
90   // 3. Make vertices
91   aNbBlocks=aMBlocks.Extent();
92   for (k=0; k<aNbBlocks; ++k) {
93     const BOPCol_ListOfInteger& aLI=aMBlocks.Find(k);
94     //
95     aLV.Clear();
96     aItLI.Initialize(aLI);
97     for (; aItLI.More(); aItLI.Next()) {
98       nX=aItLI.Value();
99       const TopoDS_Shape& aV=myDS->Shape(nX);
100       aLV.Append(aV);
101     }
102     //
103     BOPTools_AlgoTools::MakeVertex(aLV, aVn);
104     //
105     // Appennd new vertex to the DS
106     aSIn.SetShape(aVn);
107     n=myDS->Append(aSIn);
108     //
109     BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(n);
110     Bnd_Box& aBox=aSIDS.ChangeBox();
111     BRepBndLib::Add(aVn, aBox);
112     //
113     // Fill ShapesSD
114     aItLI.Initialize(aLI);
115     for (i=0; aItLI.More(); aItLI.Next(), ++i) {
116       n1=aItLI.Value();
117       myDS->AddShapeSD(n1, n);
118       //
119       aItLI2.Initialize(aLI);
120       for (j=0; aItLI2.More(); aItLI2.Next(), ++j) {
121         if (j>i) {
122           n2=aItLI2.Value();
123           //
124           myDS->AddInterf(n1, n2);
125           BOPDS_InterfVV& aVV=aVVs.Append1();
126           //
127           aVV.SetIndices(n1, n2);
128           aVV.SetIndexNew(n);
129         }
130       }
131     }
132   }
133   //
134   //-----------------------------------------------------scope t
135   aLV.Clear();
136   aMBlocks.Clear();
137   aMILI.Clear();
138   aAllocator.Nullify();
139 }