X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_ShapeDriver.cxx;h=b3aa980abdf8c7f945beeddedd231efc30d29932;hb=728e6e5834d7de537e9fe79518aafa28ec8e63ed;hp=09e2190a976980b3c8461e521c75fa4a6787031a;hpb=d3dd282390888d7dc091ba2c2ffe7923bd7458e6;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx index 09e2190a9..b3aa980ab 100644 --- a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx @@ -1,15 +1,21 @@ -using namespace std; -#include "GEOMImpl_ShapeDriver.hxx" -#include "GEOMImpl_IShapes.hxx" -#include "GEOMImpl_IShapesOperations.hxx" -#include "GEOMImpl_Types.hxx" -#include "GEOM_Function.hxx" +#include + +#include +#include +#include +#include +#include + +#include + +// OCCT Includes +#include #include #include #include -#include +#include #include #include #include @@ -17,7 +23,6 @@ using namespace std; #include #include #include -#include #include #include @@ -75,27 +80,53 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); unsigned int ind, nbshapes = aShapes->Length(); - // add edges + TopoDS_Wire aWire; + B.MakeWire(aWire); BRepBuilderAPI_MakeWire MW; + bool isMWDone = true; + + // add edges for (ind = 1; ind <= nbshapes; ind++) { Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); TopoDS_Shape aShape_i = aRefShape->GetValue(); if (aShape_i.IsNull()) { Standard_NullObject::Raise("Shape for wire construction is null"); } - if (aShape_i.ShapeType() == TopAbs_EDGE) - MW.Add(TopoDS::Edge(aShape_i)); - else if (aShape_i.ShapeType() == TopAbs_WIRE) - MW.Add(TopoDS::Wire(aShape_i)); - else + if (aShape_i.ShapeType() == TopAbs_EDGE) { + B.Add(aWire, TopoDS::Edge(aShape_i)); + MW.Add(TopoDS::Edge(aShape_i)); + } else if (aShape_i.ShapeType() == TopAbs_WIRE) { + B.Add(aWire, TopoDS::Wire(aShape_i)); + MW.Add(TopoDS::Wire(aShape_i)); + } else { Standard_TypeMismatch::Raise ("Shape for wire construction is neither an edge nor a wire"); + } + if (!MW.IsDone()) { + // check status after each edge/wire addition, because the final status + // can be OK even in case, when some edges/wires was not accepted. + isMWDone = false; + } } - if (!MW.IsDone()) { - Standard_ConstructionError::Raise("Wire construction failed"); + if (isMWDone) { + aShape = MW; + } else { + // fix edges order + Handle(ShapeFix_Wire) aFW = new ShapeFix_Wire; + aFW->Load(aWire); + aFW->FixReorder(); + + if (aFW->StatusReorder(ShapeExtend_FAIL1)) { + Standard_ConstructionError::Raise("Wire construction failed: several loops detected"); + } else if (aFW->StatusReorder(ShapeExtend_FAIL)) { + Standard_ConstructionError::Raise("Wire construction failed"); + } else if (aFW->StatusReorder(ShapeExtend_DONE2)) { + Standard_ConstructionError::Raise("Wire construction failed: some gaps detected"); + } else { + } + aShape = aFW->WireAPIMake(); } - aShape = MW; } else if (aType == FACE_WIRE) { Handle(GEOM_Function) aRefBase = aCI.GetBase(); @@ -105,14 +136,22 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const ("Shape for face construction is null or not a wire"); } TopoDS_Wire W = TopoDS::Wire(aShapeBase); - BRepBuilderAPI_MakeFace MF (W, aCI.GetIsPlanar()); - if (!MF.IsDone()) { + //BRepBuilderAPI_MakeFace MF (W, aCI.GetIsPlanar()); + //if (!MF.IsDone()) { + // Standard_ConstructionError::Raise("Face construction failed"); + //} + //aShape = MF.Shape(); + GEOMImpl_Block6Explorer::MakeFace(W, aCI.GetIsPlanar(), aShape); + if (aShape.IsNull()) { Standard_ConstructionError::Raise("Face construction failed"); } - aShape = MF.Shape(); } else if (aType == FACE_WIRES) { Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); + int nbshapes = aShapes->Length(); + if (nbshapes < 1) { + Standard_ConstructionError::Raise("No wires given"); + } // first wire Handle(GEOM_Function) aRefWire = Handle(GEOM_Function)::DownCast(aShapes->Value(1)); @@ -123,53 +162,56 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const TopoDS_Wire W = TopoDS::Wire(aWire); // basic face - BRepBuilderAPI_MakeFace MF (W, aCI.GetIsPlanar()); - if (!MF.IsDone()) { + //BRepBuilderAPI_MakeFace MF (W, aCI.GetIsPlanar()); + //if (!MF.IsDone()) { + // Standard_ConstructionError::Raise("Face construction failed"); + //} + //TopoDS_Shape FFace = MF.Shape(); + TopoDS_Shape FFace; + GEOMImpl_Block6Explorer::MakeFace(W, aCI.GetIsPlanar(), FFace); + if (FFace.IsNull()) { Standard_ConstructionError::Raise("Face construction failed"); } - TopoDS_Shape FFace = MF.Shape(); - if (!FFace.IsNull()) { - unsigned int ind, nbshapes = aShapes->Length(); - if (nbshapes == 1) { - aShape = FFace; - - } else if (nbshapes >= 2) { - TopoDS_Compound C; - BRep_Builder aBuilder; - aBuilder.MakeCompound(C); - BRepAlgo_FaceRestrictor FR; - - TopAbs_Orientation OriF = FFace.Orientation(); - TopoDS_Shape aLocalS = FFace.Oriented(TopAbs_FORWARD); - FR.Init(TopoDS::Face(aLocalS), Standard_False, Standard_True); - - for (ind = 1; ind <= nbshapes; ind++) { - Handle(GEOM_Function) aRefWire_i = - Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); - TopoDS_Shape aWire_i = aRefWire_i->GetValue(); - if (aWire_i.IsNull() || aWire_i.ShapeType() != TopAbs_WIRE) { - Standard_NullObject::Raise("Shape for face construction is null or not a wire"); - } - - FR.Add(TopoDS::Wire(aWire_i)); - } - - FR.Perform(); - - if (FR.IsDone()) { - int k = 0; - TopoDS_Shape aFace; - for (; FR.More(); FR.Next()) { - aFace = FR.Current().Oriented(OriF); - aBuilder.Add(C, aFace); - k++; - } - if (k == 1) { - aShape = aFace; - } else { - aShape = C; - } - } + + if (nbshapes == 1) { + aShape = FFace; + + } else { + TopoDS_Compound C; + BRep_Builder aBuilder; + aBuilder.MakeCompound(C); + BRepAlgo_FaceRestrictor FR; + + TopAbs_Orientation OriF = FFace.Orientation(); + TopoDS_Shape aLocalS = FFace.Oriented(TopAbs_FORWARD); + FR.Init(TopoDS::Face(aLocalS), Standard_False, Standard_True); + + for (int ind = 1; ind <= nbshapes; ind++) { + Handle(GEOM_Function) aRefWire_i = + Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); + TopoDS_Shape aWire_i = aRefWire_i->GetValue(); + if (aWire_i.IsNull() || aWire_i.ShapeType() != TopAbs_WIRE) { + Standard_NullObject::Raise("Shape for face construction is null or not a wire"); + } + + FR.Add(TopoDS::Wire(aWire_i)); + } + + FR.Perform(); + + if (FR.IsDone()) { + int k = 0; + TopoDS_Shape aFace; + for (; FR.More(); FR.Next()) { + aFace = FR.Current().Oriented(OriF); + aBuilder.Add(C, aFace); + k++; + } + if (k == 1) { + aShape = aFace; + } else { + aShape = C; + } } } } else if (aType == SHELL_FACES) { @@ -177,7 +219,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const unsigned int ind, nbshapes = aShapes->Length(); // add faces - BRepAlgo_Sewing aSewing(Precision::Confusion()*10.0); + BRepBuilderAPI_Sewing aSewing(Precision::Confusion()*10.0); for (ind = 1; ind <= nbshapes; ind++) { Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); TopoDS_Shape aShape_i = aRefShape->GetValue(); @@ -226,8 +268,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const unsigned int ind, nbshapes = aShapes->Length(); Standard_Integer ish = 0; TopoDS_Solid Sol; - TopoDS_Compound Res; - B.MakeCompound(Res); + B.MakeSolid(Sol); // add shapes for (ind = 1; ind <= nbshapes; ind++) { @@ -237,20 +278,21 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const Standard_NullObject::Raise("Shell for solid construction is null"); } if (aShapeShell.ShapeType() == TopAbs_SHELL) { - B.MakeSolid(Sol); B.Add(Sol, aShapeShell); - BRepClass3d_SolidClassifier SC (Sol); - SC.PerformInfinitePoint(Precision::Confusion()); - if (SC.State() == TopAbs_IN) { - B.MakeSolid(Sol); - B.Add(Sol, aShapeShell.Reversed()); - } - B.Add(Res, Sol); ish++; } } - if (ish == 1) aShape = Sol; - else aShape = Res; + if ( ish == 0 ) return 0; + BRepClass3d_SolidClassifier SC (Sol); + SC.PerformInfinitePoint(Precision::Confusion()); + switch (SC.State()) { + case TopAbs_IN: + aShape = Sol.Reversed(); break; + case TopAbs_OUT: + aShape = Sol; break; + default: // not closed shell? + return 0; + } } else if (aType == COMPOUND_SHAPES) { Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); @@ -276,7 +318,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const if (aShape_i.IsNull()) { Standard_NullObject::Raise("Shape for reverse is null"); } - + BRepBuilderAPI_Copy Copy(aShape_i); if( Copy.IsDone() ) { TopoDS_Shape tds = Copy.Shape(); @@ -290,7 +332,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const tds.Orientation(TopAbs_FORWARD) ; aShape = tds; - } + } } if (aShape.IsNull()) return 0;