0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / BOPAlgo / BOPAlgo_PaveFiller_9.cxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15
16 #include <Bnd_Box.hxx>
17 #include <BOPAlgo_PaveFiller.hxx>
18 #include <BOPAlgo_SectionAttribute.hxx>
19 #include <BOPCol_MapOfInteger.hxx>
20 #include <BOPCol_NCVector.hxx>
21 #include <BOPCol_Parallel.hxx>
22 #include <BOPDS_Curve.hxx>
23 #include <BOPDS_DS.hxx>
24 #include <BOPDS_Iterator.hxx>
25 #include <BOPDS_ListOfPaveBlock.hxx>
26 #include <BOPDS_PaveBlock.hxx>
27 #include <BOPDS_ShapeInfo.hxx>
28 #include <gp_Pnt.hxx>
29 #include <IntTools_Context.hxx>
30 #include <IntTools_ShrunkRange.hxx>
31 #include <TopoDS_Edge.hxx>
32 #include <TopoDS_Face.hxx>
33 #include <TopoDS_Vertex.hxx>
34
35 //
36 //=======================================================================
37 //class    : BOPAlgo_ShrunkRange
38 //purpose  : 
39 //=======================================================================
40 class BOPAlgo_ShrunkRange : public IntTools_ShrunkRange {
41  public:
42   BOPAlgo_ShrunkRange() 
43   : IntTools_ShrunkRange(),
44     myWarningStatus(0) {
45   }
46   //
47   virtual ~BOPAlgo_ShrunkRange() {
48   }
49   //
50   void SetPaveBlock(const Handle(BOPDS_PaveBlock)& aPB) {
51     myPB=aPB;
52   }
53   //
54   Handle(BOPDS_PaveBlock)& PaveBlock() {
55     return myPB;
56   }
57   //
58   virtual void Perform() {
59     //
60     myWarningStatus=0;
61     //
62     IntTools_ShrunkRange::Perform();
63     if (myErrorStatus) {
64       myWarningStatus=1;
65     }
66   }
67   //
68   Standard_Integer WarningStatus() const {
69     return myWarningStatus;
70   }
71   //
72  protected:
73   Standard_Integer myWarningStatus;
74   Handle(BOPDS_PaveBlock) myPB;
75 };
76 //
77 //=======================================================================
78 typedef BOPCol_NCVector
79   <BOPAlgo_ShrunkRange> BOPAlgo_VectorOfShrunkRange; 
80 //
81 typedef BOPCol_ContextFunctor 
82   <BOPAlgo_ShrunkRange,
83   BOPAlgo_VectorOfShrunkRange,
84   Handle(IntTools_Context), 
85   IntTools_Context> BOPAlgo_ShrunkRangeFunctor;
86 //
87 typedef BOPCol_ContextCnt 
88   <BOPAlgo_ShrunkRangeFunctor,
89   BOPAlgo_VectorOfShrunkRange,
90   Handle(IntTools_Context)> BOPAlgo_ShrunkRangeCnt;
91 //
92 //=======================================================================
93 // function: FillShrunkData
94 // purpose: 
95 //=======================================================================
96 void BOPAlgo_PaveFiller::FillShrunkData(const TopAbs_ShapeEnum aType1,
97                                         const TopAbs_ShapeEnum aType2)
98 {
99   Standard_Integer iSize;
100   
101   //
102   myErrorStatus=0;
103   //
104   myIterator->Initialize(aType1, aType2);
105   iSize=myIterator->ExpectedLength();
106   if (!iSize) {
107     return; 
108   }
109   //
110   Standard_Boolean bJustAdd;
111   Standard_Integer i, iEnd, nS[2], nE, nV1, nV2, aNbVSD, k, iWrn;
112   Standard_Real aT1, aT2, aTS1, aTS2;
113   BOPDS_ListIteratorOfListOfPaveBlock aItLPB;
114   BOPCol_MapOfInteger aMI; 
115   BOPAlgo_VectorOfShrunkRange aVSD;
116   //
117   iEnd=(aType2==TopAbs_EDGE) ? 2 : 1;
118   //
119   for (; myIterator->More(); myIterator->Next()) {
120     myIterator->Value(nS[0], nS[1], bJustAdd);
121     if(bJustAdd) {
122       continue;
123     }
124     //
125     for (i=0; i<iEnd; ++i) {
126       nE=nS[i];
127       if (!aMI.Add(nE)) {
128         continue;
129       }
130       //
131       const BOPDS_ShapeInfo& aSIE=myDS->ShapeInfo(nE);
132       if (aSIE.HasFlag()){
133         continue;
134       }
135       //
136       BOPDS_ListOfPaveBlock& aLPB=myDS->ChangePaveBlocks(nE);
137       aItLPB.Initialize(aLPB);
138       for (; aItLPB.More(); aItLPB.Next()) {
139         const Handle(BOPDS_PaveBlock)& aPB=aItLPB.ChangeValue();
140         if (aPB->HasShrunkData()) {
141           continue;
142         }
143         //
144         // FillShrunkData(aPB);
145         aPB->Indices(nV1, nV2);
146         aPB->Range(aT1, aT2);
147         //
148         const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&aSIE.Shape()));
149         //
150         const TopoDS_Vertex& aV1=
151           (*(TopoDS_Vertex *)(&myDS->Shape(nV1))); 
152         //
153         const TopoDS_Vertex& aV2=
154           (*(TopoDS_Vertex *)(&myDS->Shape(nV2))); 
155         //
156         BOPAlgo_ShrunkRange& aSD=aVSD.Append1();
157         //
158         aSD.SetPaveBlock(aPB);
159         aSD.SetData(aE, aT1, aT2, aV1, aV2); 
160       }
161     }
162   }
163   //
164   aNbVSD=aVSD.Extent();
165   //=============================================================
166   BOPAlgo_ShrunkRangeCnt::Perform(myRunParallel, aVSD, myContext);
167   //=============================================================
168   //
169   for (k=0; k < aNbVSD; ++k) {
170     BOPAlgo_ShrunkRange& aSD=aVSD(k);
171     iWrn=aSD.WarningStatus();
172     if (iWrn==1) {
173       continue;
174     }
175     //
176     Handle(BOPDS_PaveBlock)& aPB=aSD.PaveBlock();
177     aSD.ShrunkRange(aTS1, aTS2);
178     const Bnd_Box& aBox=aSD.BndBox();
179     //
180     aPB->SetShrunkData(aTS1, aTS2, aBox);
181   }
182 }