Salome HOME
7dd43e95277858215c2079f968249ff6269ac2a4
[modules/geom.git] / src / GEOMAlgo / GEOMAlgo_WireSolid.cxx
1 // Copyright (C) 2007-2015  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, or (at your option) any later version.
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:        GEOMAlgo_WireSolid.cxx
24 // Created:     Wed Jan 12 10:19:31 2005
25 // Author:      Peter KURNEV
26 //              <pkv@irinox>
27 //
28 #include <GEOMAlgo_WireSolid.hxx>
29
30 #include <Basics_OCCTVersion.hxx>
31
32 #include <Standard_Failure.hxx>
33
34 #include <TopAbs_ShapeEnum.hxx>
35
36 #include <TopTools_ListIteratorOfListOfShape.hxx>
37
38 #include <BOPDS_DS.hxx>
39 #include <BOPDS_IndexRange.hxx>
40 #include <BOPDS_ListOfPaveBlock.hxx>
41 #include <BOPDS_PaveBlock.hxx>
42 #include <TopoDS_Solid.hxx>
43 #if OCC_VERSION_LARGE > 0x06070100
44 #include <IntTools_Context.hxx>
45 #else
46 #include <BOPInt_Context.hxx>
47 #endif
48 #include <BRepClass3d_SolidClassifier.hxx>
49 #include <BRep_Tool.hxx>
50 #include <BOPTools_AlgoTools.hxx>
51
52 #include <Basics_OCCTVersion.hxx>
53
54 //=======================================================================
55 //function : GEOMAlgo_WireSolid
56 //purpose  :
57 //=======================================================================
58 GEOMAlgo_WireSolid::GEOMAlgo_WireSolid()
59 :
60   GEOMAlgo_ShapeSolid()
61 {
62 }
63 //=======================================================================
64 //function : ~
65 //purpose  :
66 //=======================================================================
67 GEOMAlgo_WireSolid::~GEOMAlgo_WireSolid()
68 {
69 }
70 //=======================================================================
71 // function: Perform
72 // purpose:
73 //=======================================================================
74 void GEOMAlgo_WireSolid::Perform()
75 {
76   myErrorStatus=0;
77   //
78   try {
79     if (myDSFiller==NULL) {
80       myErrorStatus=10;
81       return;
82     }
83     if(myDSFiller->ErrorStatus()) {
84       myErrorStatus=11;
85       return;
86     }
87     //
88     Standard_Integer aNbArgs;
89     //
90     const BOPDS_DS& aDS=myDSFiller->DS();
91     const BOPCol_ListOfShape& aLS=aDS.Arguments();
92     aNbArgs=aLS.Extent();
93     if (!aNbArgs) {
94       myErrorStatus=13;
95       return;
96     }
97     //
98     BuildResult();
99   }
100   //
101   catch (Standard_Failure) {
102     myErrorStatus= 12;
103   }
104 }
105 //=======================================================================
106 // function: BuildResult
107 // purpose:
108 //=======================================================================
109 void GEOMAlgo_WireSolid::BuildResult()
110 {
111   Standard_Boolean bHasPaveBlocks;
112   Standard_Integer i, iRank, aNbPB,  iBeg, iEnd, aNbArgs, nE;// nSp
113   Standard_Real aTol;
114   TopAbs_ShapeEnum aType;
115   TopAbs_State aState;
116   TopoDS_Edge aE;
117   //
118   myErrorStatus=0;
119   myLSIN.Clear();
120   myLSOUT.Clear();
121   myLSON.Clear();
122   //
123   const BOPDS_DS& aDS=myDSFiller->DS();
124   BOPDS_DS* pDS=(BOPDS_DS*)&aDS;
125   //
126   const BOPCol_ListOfShape& aLS=pDS->Arguments();
127   aNbArgs=aLS.Extent();
128   if (aNbArgs!=2) {
129     myErrorStatus=14;
130     return;
131   }
132   //
133   iRank=-1;
134   const TopoDS_Shape& aObj=aLS.First();
135   if (aObj.ShapeType()==TopAbs_WIRE) {
136     iRank=0;
137   }
138   const TopoDS_Shape& aTool=aLS.Last();
139   if (aTool.ShapeType()==TopAbs_WIRE) {
140     iRank=1;
141   }
142   //
143   if (iRank==-1) {
144     myErrorStatus=15;
145     return;
146   }
147   //
148   aTol=1.e-7;
149   //
150   const TopoDS_Solid& aSolid=(iRank==0) ?  *((TopoDS_Solid*)&aTool) :
151     *((TopoDS_Solid*)&aObj);
152   //
153 #if OCC_VERSION_LARGE > 0x06070100
154   Handle(IntTools_Context) aCtx=myDSFiller->Context();
155 #else
156   Handle(BOPInt_Context) aCtx=myDSFiller->Context();
157 #endif
158   //BRepClass3d_SolidClassifier& aSC=aCtx->SolidClassifier(aSolid);
159   //
160   const BOPDS_IndexRange& aRange=pDS->Range(iRank);
161   aRange.Indices(iBeg, iEnd);
162   //
163   for (i=iBeg; i<=iEnd; ++i) {
164     const TopoDS_Shape& aS=pDS->Shape(i);
165     aType=aS.ShapeType();
166     if (aType!=TopAbs_EDGE) {
167       continue;
168     }
169     //
170     aE=*((TopoDS_Edge*)&pDS->Shape(i));
171     if (BRep_Tool::Degenerated(aE)) {
172       continue;
173     }
174     //
175     bHasPaveBlocks=pDS->HasPaveBlocks(i);
176     if (!bHasPaveBlocks) {
177       continue;
178     }
179     //
180     aState=TopAbs_UNKNOWN;
181     //
182     const BOPDS_ListOfPaveBlock& aLPB=pDS->PaveBlocks(i);
183     aNbPB=aLPB.Extent();
184     if (!aNbPB) {
185       aState=BOPTools_AlgoTools::ComputeStateByOnePoint(aE, aSolid, aTol, aCtx);
186     }
187     else if (aNbPB==1) {
188       const Handle(BOPDS_PaveBlock)& aPB=aLPB.First();
189       if (pDS->IsCommonBlock(aPB)) {
190         aState=TopAbs_ON;
191       }
192       else{
193         nE=aPB->Edge();
194         aE=*((TopoDS_Edge*)&pDS->Shape(nE));
195         aState=BOPTools_AlgoTools::ComputeStateByOnePoint(aE, aSolid, aTol, aCtx);
196       }
197       //----------
198       if (aState==TopAbs_ON) {
199         myLSON.Append(aE);
200       }
201       else if (aState==TopAbs_OUT) {
202         myLSOUT.Append(aE);
203       }
204       else if (aState==TopAbs_IN) {
205         myLSIN.Append(aE);
206       }
207     }
208   }
209 }