1 // File: GEOMAlgo_FinderShapeOn.cxx
2 // Created: Tue Jan 11 14:44:31 2005
3 // Author: Peter KURNEV
7 #include <GEOMAlgo_FinderShapeOn.ixx>
9 #include <TopAbs_ShapeEnum.hxx>
12 #include <TopoDS_Face.hxx>
13 #include <TopoDS_Shape.hxx>
14 #include <TopoDS_Compound.hxx>
15 #include <TopoDS_Shell.hxx>
16 #include <TopoDS_Solid.hxx>
17 #include <TopoDS_Vertex.hxx>
18 #include <TopoDS_Edge.hxx>
20 #include <TopoDS_Iterator.hxx>
22 #include <TopTools_ListIteratorOfListOfShape.hxx>
23 #include <TopTools_IndexedMapOfShape.hxx>
24 #include <TopTools_DataMapOfShapeShape.hxx>
26 #include <BRep_Builder.hxx>
29 #include <TopExp_Explorer.hxx>
31 #include <BRepLib_MakeFace.hxx>
32 #include <BRepLib_FaceError.hxx>
34 #include <BOPTools_DSFiller.hxx>
36 #include <GEOMAlgo_WireSolid.hxx>
37 #include <GEOMAlgo_ShellSolid.hxx>
38 #include <GEOMAlgo_VertexSolid.hxx>
39 #include <GEOMAlgo_ShapeSolid.hxx>
42 //=======================================================================
43 //function : GEOMAlgo_FinderShapeOn
45 //=======================================================================
46 GEOMAlgo_FinderShapeOn::GEOMAlgo_FinderShapeOn()
51 myShapeType=TopAbs_VERTEX;
52 myState=GEOMAlgo_ST_UNKNOWN;
54 //=======================================================================
57 //=======================================================================
58 GEOMAlgo_FinderShapeOn::~GEOMAlgo_FinderShapeOn()
61 //=======================================================================
62 //function : SetSurface
64 //=======================================================================
65 void GEOMAlgo_FinderShapeOn::SetSurface(const Handle(Geom_Surface)& aS)
69 //=======================================================================
72 //=======================================================================
73 const Handle(Geom_Surface)& GEOMAlgo_FinderShapeOn::Surface() const
77 //=======================================================================
78 //function : SetShapeType
80 //=======================================================================
81 void GEOMAlgo_FinderShapeOn::SetShapeType(const TopAbs_ShapeEnum aType)
85 //=======================================================================
86 //function : ShapeType
88 //=======================================================================
89 TopAbs_ShapeEnum GEOMAlgo_FinderShapeOn::ShapeType()const
93 //=======================================================================
96 //=======================================================================
97 void GEOMAlgo_FinderShapeOn::SetState(const GEOMAlgo_State aState)
101 //=======================================================================
104 //=======================================================================
105 GEOMAlgo_State GEOMAlgo_FinderShapeOn::State() const
109 //=======================================================================
112 //=======================================================================
113 const TopTools_ListOfShape& GEOMAlgo_FinderShapeOn::Shapes() const
117 //=======================================================================
120 //=======================================================================
121 void GEOMAlgo_FinderShapeOn::Perform()
127 if (!myResult.IsNull()){
137 if(myErrorStatus || myWarningStatus) {
147 //=======================================================================
150 //=======================================================================
151 void GEOMAlgo_FinderShapeOn::Find()
155 Standard_Boolean bIsDone;
156 Standard_Integer iErr;
157 TopTools_ListIteratorOfListOfShape aIt;
159 BOPTools_DSFiller aDF;
160 GEOMAlgo_ShapeSolid* pSS;
162 // 1. Prepare DSFiller
163 aDF.SetShapes (myArg1, myArg2);
164 bIsDone=aDF.IsDone();
166 myErrorStatus=30; // wrong args are used for DSFiller
170 bIsDone=aDF.IsDone();
172 myErrorStatus=31; // DSFiller failed
179 if (myShapeType==TopAbs_VERTEX) {
180 pSS=new GEOMAlgo_VertexSolid;
182 else if (myShapeType==TopAbs_EDGE) {
183 pSS=new GEOMAlgo_WireSolid;
185 else if (myShapeType==TopAbs_FACE) {
186 pSS=new GEOMAlgo_ShellSolid;
191 iErr=pSS->ErrorStatus();
193 myErrorStatus=32; // builder ShapeSolid failed
198 const TopTools_ListOfShape& aLS=pSS->Shapes(myState);
201 for (; aIt.More(); aIt.Next()) {
202 const TopoDS_Shape& aSImage=aIt.Value();
203 if (myImages.IsBound(aSImage)) {
204 const TopoDS_Shape& aS=myImages.Find(aSImage);
208 myErrorStatus=33;// can not find original shape
215 //=======================================================================
216 //function : MakeArguments
218 //=======================================================================
219 void GEOMAlgo_FinderShapeOn::MakeArguments()
223 Standard_Integer i, aNb;
224 BRepLib_FaceError aFErr;
225 BRepLib_MakeFace aMF;
226 TopTools_IndexedMapOfShape aM;
228 TopoDS_Compound aCmp;
232 TopTools_DataMapOfShapeShape aOriginals;
233 TopExp_Explorer aExp;
236 aMF.Init(mySurface, Standard_True);
238 if (aFErr!=BRepLib_FaceDone) {
239 myErrorStatus=20; // can not build the face
243 const TopoDS_Shape& aF=aMF.Shape();
246 aExp.Init(aF, TopAbs_VERTEX);
247 for (; aExp.More(); aExp.Next()) {
248 const TopoDS_Vertex& aV=TopoDS::Vertex(aExp.Current());
249 aBB.UpdateVertex(aV, myTolerance);
251 aExp.Init(aF, TopAbs_EDGE);
252 for (; aExp.More(); aExp.Next()) {
253 const TopoDS_Edge& aE=TopoDS::Edge(aExp.Current());
254 aBB.UpdateEdge(aE, myTolerance);
256 const TopoDS_Face& aFace=TopoDS::Face(aF);
257 aBB.UpdateFace(aFace, myTolerance);
270 GEOMAlgo_FinderShapeOn::CopySource(myShape, myImages, aOriginals, aSC);
272 TopExp::MapShapes(aSC, myShapeType, aM);
275 myWarningStatus=10; // No found subshapes of type myShapeType
279 aBB.MakeCompound(aCmp);
280 for (i=1; i<=aNb; ++i) {
281 const TopoDS_Shape& aS=aM(i);
286 //=======================================================================
287 //function : CheckData
289 //=======================================================================
290 void GEOMAlgo_FinderShapeOn::CheckData()
294 if(mySurface.IsNull()) {
295 myErrorStatus=10; // mySurface=NULL
299 if (myShape.IsNull()) {
300 myErrorStatus=11; // myShape=NULL
304 if (!(myShapeType==TopAbs_VERTEX ||
305 myShapeType==TopAbs_EDGE ||
306 myShapeType==TopAbs_FACE)) {
307 myErrorStatus=12; // unallowed subshape type
311 if (myState==GEOMAlgo_ST_UNKNOWN ||
312 myState==GEOMAlgo_ST_INOUT) {
313 myErrorStatus=13; // unallowed state type
318 //=======================================================================
319 //function : CopySource
321 //=======================================================================
322 void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE,
323 TopTools_DataMapOfShapeShape& aImages,
324 TopTools_DataMapOfShapeShape& aOriginals,
327 Standard_Boolean bFree;
328 TopAbs_ShapeEnum aType;
333 aType=aE.ShapeType();
335 if (aOriginals.IsBound(aE)) {
336 aEx=aOriginals.ChangeFind(aE);
337 if (aType==TopAbs_EDGE) {
342 aEx=aE.EmptyCopied();
343 aOriginals.Bind(aE, aEx);
344 aImages.Bind(aEx, aE);
347 aR=(Standard_Integer)aType+1;
348 if (aR>TopAbs_VERTEX) {
353 aEx.Free(Standard_True);
355 aType=(TopAbs_ShapeEnum) aR;
357 aIt.Initialize(aE);//, Standard_False);
358 for (; aIt.More(); aIt.Next()) {
359 const TopoDS_Shape& aV=aIt.Value();
362 CopySource (aV, aImages, aOriginals, aVx);
364 aVx.Orientation(aV.Orientation());
374 // 10 -mySurface=NULL
376 // 12 -unallowed type of subshapes
377 // 13 -unallowed state
378 // 20 -can not build the face
379 // 30 -wrong args are used for DSFiller
380 // 31 -DSFiller failed
381 // 32 -builder ShapeSolid failed
382 // 33 -can not find original shape
386 // 10 -subshapes of type myShapeType can not be fond in myShape