X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_ShapeDriver.cxx;h=9e8f83b06d2d9e638d6fcd2640bb008847f24956;hb=ed87a1f7c81ec39992aff1f463d73dc81e5791e0;hp=9f2ec8081ef91a66252bca747b44290ede986db2;hpb=8180539548a5038e52445454e88c1a170ee64e56;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx index 9f2ec8081..9e8f83b06 100644 --- a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,15 +18,19 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include +#include #include +#include #include #include #include #include +#include // OCCT Includes #include @@ -39,8 +43,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -49,6 +55,7 @@ #include #include +#include #include #include @@ -71,6 +78,8 @@ #include #include +#include +#include #include #include #include @@ -89,10 +98,15 @@ #include #include +#include +#include + +#include + //modified by NIZNHY-PKV Wed Dec 28 13:48:20 2011f //static // void KeepEdgesOrder(const Handle(TopTools_HSequenceOfShape)& aEdges, -// const Handle(TopTools_HSequenceOfShape)& aWires); +// const Handle(TopTools_HSequenceOfShape)& aWires); //modified by NIZNHY-PKV Wed Dec 28 13:48:23 2011t //======================================================================= @@ -128,73 +142,24 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const TopoDS_Shape aShape; TCollection_AsciiString aWarning; + std::list anExpectedType; BRep_Builder B; if (aType == WIRE_EDGES) { - Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); - TopoDS_Wire aWire; - B.MakeWire(aWire); + anExpectedType.push_back(TopAbs_WIRE); - // add edges - for (unsigned int ind = 1; ind <= aShapes->Length(); 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 || aShape_i.ShapeType() == TopAbs_WIRE) { - TopExp_Explorer exp (aShape_i, TopAbs_EDGE); - for (; exp.More(); exp.Next()) - B.Add(aWire, TopoDS::Edge(exp.Current())); - } else { - Standard_TypeMismatch::Raise - ("Shape for wire construction is neither an edge nor a wire"); - } - } - - // 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 { - } + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); - // IMP 0019766: Building a Wire from unconnected edges by introducing a tolerance Standard_Real aTolerance = aCI.GetTolerance(); if (aTolerance < Precision::Confusion()) aTolerance = Precision::Confusion(); - aFW->ClosedWireMode() = Standard_False; - aFW->FixConnected(aTolerance); - if (aFW->StatusConnected(ShapeExtend_FAIL)) { - Standard_ConstructionError::Raise("Wire construction failed: cannot build connected wire"); - } - // IMP 0019766 - if (aFW->StatusConnected(ShapeExtend_DONE3)) { - // Confused with but not Analyzer.Precision(), set the same - aFW->FixGapsByRangesMode() = Standard_True; - if (aFW->FixGaps3d()) { - Handle(ShapeExtend_WireData) sbwd = aFW->WireData(); - Handle(ShapeFix_Edge) aFe = new ShapeFix_Edge; - for (Standard_Integer iedge = 1; iedge <= sbwd->NbEdges(); iedge++) { - TopoDS_Edge aEdge = TopoDS::Edge(sbwd->Edge(iedge)); - aFe->FixVertexTolerance(aEdge); - aFe->FixSameParameter(aEdge); - } - } - else if (aFW->StatusGaps3d(ShapeExtend_FAIL)) { - Standard_ConstructionError::Raise("Wire construction failed: cannot fix 3d gaps"); - } - } - aShape = aFW->WireAPIMake(); + aShape = MakeWireFromEdges(aShapes, aTolerance); } else if (aType == FACE_WIRE) { + anExpectedType.push_back(TopAbs_FACE); + Handle(GEOM_Function) aRefBase = aCI.GetBase(); TopoDS_Shape aShapeBase = aRefBase->GetValue(); if (aShapeBase.IsNull()) Standard_NullObject::Raise("Argument Shape is null"); @@ -228,6 +193,8 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const } } else if (aType == FACE_WIRES) { + anExpectedType.push_back(TopAbs_FACE); + // Try to build a face from a set of wires and edges int ind; @@ -253,6 +220,10 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const } } + if (aSeqEdgesIn->IsEmpty()) { + Standard_ConstructionError::Raise("No edges given"); + } + // 2. Connect edges to wires of maximum length Handle(TopTools_HSequenceOfShape) aSeqWiresOut; ShapeAnalysis_FreeBounds::ConnectEdgesToWires(aSeqEdgesIn, Precision::Confusion(), @@ -343,7 +314,45 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const aShape = C; } } + else if (aType == FACE_FROM_SURFACE) { + anExpectedType.push_back(TopAbs_FACE); + + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); + + if (aShapes.IsNull() == Standard_False) { + Standard_Integer aNbShapes = aShapes->Length(); + + if (aNbShapes == 2) { + Handle(GEOM_Function) aRefFace = + Handle(GEOM_Function)::DownCast(aShapes->Value(1)); + Handle(GEOM_Function) aRefWire = + Handle(GEOM_Function)::DownCast(aShapes->Value(2)); + + if (aRefFace.IsNull() == Standard_False && + aRefWire.IsNull() == Standard_False) { + TopoDS_Shape aShFace = aRefFace->GetValue(); + TopoDS_Shape aShWire = aRefWire->GetValue(); + + if (aShFace.IsNull() == Standard_False && + aShFace.ShapeType() == TopAbs_FACE && + aShWire.IsNull() == Standard_False && + aShWire.ShapeType() == TopAbs_WIRE) { + TopoDS_Face aFace = TopoDS::Face(aShFace); + TopoDS_Wire aWire = TopoDS::Wire(aShWire); + Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace); + BRepBuilderAPI_MakeFace aMkFace(aSurf, aWire); + + if (aMkFace.IsDone()) { + aShape = aMkFace.Shape(); + } + } + } + } + } + } else if (aType == SHELL_FACES) { + anExpectedType.push_back(TopAbs_SHELL); + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); unsigned int ind, nbshapes = aShapes->Length(); @@ -399,40 +408,14 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const } } - } - else if (aType == SOLID_SHELL) { - Handle(GEOM_Function) aRefShell = aCI.GetBase(); - TopoDS_Shape aShapeShell = aRefShell->GetValue(); - if (!aShapeShell.IsNull() && aShapeShell.ShapeType() == TopAbs_COMPOUND) { - TopoDS_Iterator It (aShapeShell, Standard_True, Standard_True); - if (It.More()) aShapeShell = It.Value(); - } - if (aShapeShell.IsNull() || aShapeShell.ShapeType() != TopAbs_SHELL) { - Standard_NullObject::Raise("Shape for solid construction is null or not a shell"); - } - - BRepCheck_Shell chkShell(TopoDS::Shell(aShapeShell)); - if (chkShell.Closed() == BRepCheck_NotClosed) return 0; - - TopoDS_Solid Sol; - 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()); - } - - aShape = Sol; - } else if (aType == SOLID_SHELLS) { + anExpectedType.push_back(TopAbs_SOLID); + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); unsigned int ind, nbshapes = aShapes->Length(); Standard_Integer ish = 0; - TopoDS_Solid Sol; - B.MakeSolid(Sol); + BRepBuilderAPI_MakeSolid aMkSolid; // add shapes for (ind = 1; ind <= nbshapes; ind++) { @@ -446,11 +429,13 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const if (It.More()) aShapeShell = It.Value(); } if (aShapeShell.ShapeType() == TopAbs_SHELL) { - B.Add(Sol, aShapeShell); + aMkSolid.Add(TopoDS::Shell(aShapeShell)); ish++; } } - if (ish == 0) return 0; + if (ish == 0 || !aMkSolid.IsDone()) return 0; + + TopoDS_Solid Sol = aMkSolid.Solid(); BRepClass3d_SolidClassifier SC (Sol); SC.PerformInfinitePoint(Precision::Confusion()); if (SC.State() == TopAbs_IN) @@ -459,6 +444,8 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const aShape = Sol; } else if (aType == COMPOUND_SHAPES) { + anExpectedType.push_back(TopAbs_COMPOUND); + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); unsigned int ind, nbshapes = aShapes->Length(); @@ -477,31 +464,9 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const aShape = C; } - /* - else if (aType == REVERSE_ORIENTATION) { - Handle(GEOM_Function) aRefShape = aCI.GetBase(); - TopoDS_Shape aShape_i = aRefShape->GetValue(); - 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(); - if( tds.IsNull() ) { - Standard_ConstructionError::Raise("Orientation aborted : Can not reverse the shape"); - } - - if( tds.Orientation() == TopAbs_FORWARD) - tds.Orientation(TopAbs_REVERSED); - else - tds.Orientation(TopAbs_FORWARD); - - aShape = tds; - } - } - */ else if (aType == EDGE_WIRE) { + anExpectedType.push_back(TopAbs_EDGE); + Handle(GEOM_Function) aRefBase = aCI.GetBase(); TopoDS_Shape aWire = aRefBase->GetValue(); Standard_Real LinTol = aCI.GetTolerance(); @@ -510,7 +475,36 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const aShape = MakeEdgeFromWire(aWire, LinTol, AngTol); } + else if (aType == SOLID_FACES) { + anExpectedType.push_back(TopAbs_SOLID); + anExpectedType.push_back(TopAbs_COMPOUND); + anExpectedType.push_back(TopAbs_COMPSOLID); + + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); + unsigned int ind, nbshapes = aShapes->Length(); + + // add faces + BOPCol_ListOfShape aLS; + 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 solid construction is null"); + } + aLS.Append(aShape_i); + } + + BOPAlgo_MakerVolume aMV; + aMV.SetArguments(aLS); + aMV.SetIntersect(aCI.GetIsIntersect()); + aMV.Perform(); + if (aMV.ErrorStatus()) return 0; + + aShape = aMV.Shape(); + } else if (aType == EDGE_CURVE_LENGTH) { + anExpectedType.push_back(TopAbs_EDGE); + GEOMImpl_IVector aVI (aFunction); // RefCurve @@ -584,6 +578,96 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const BRepBuilderAPI_MakeEdge aME (ReOrientedCurve, UFirst, aParam); if (aME.IsDone()) aShape = aME.Shape(); + } else if (aType == SHAPE_ISOLINE) { + GEOMImpl_IIsoline aII (aFunction); + Handle(GEOM_Function) aRefFace = aII.GetFace(); + TopoDS_Shape aShapeFace = aRefFace->GetValue(); + + if (aShapeFace.ShapeType() == TopAbs_FACE) { + TopoDS_Face aFace = TopoDS::Face(aShapeFace); + bool isUIso = aII.GetIsUIso(); + Standard_Real aParam = aII.GetParameter(); + Standard_Real U1,U2,V1,V2; + + // Construct a real geometric parameter. + aFace.Orientation(TopAbs_FORWARD); + ShapeAnalysis::GetFaceUVBounds(aFace,U1,U2,V1,V2); + + if (isUIso) { + aParam = U1 + (U2 - U1)*aParam; + } else { + aParam = V1 + (V2 - V1)*aParam; + } + + aShape = MakeIsoline(aFace, isUIso, aParam); + } else { + Standard_NullObject::Raise + ("Shape for isoline construction is not a face"); + } + } else if (aType == EDGE_UV) { + anExpectedType.push_back(TopAbs_EDGE); + GEOMImpl_IShapeExtend aSE (aFunction); + Handle(GEOM_Function) aRefEdge = aSE.GetShape(); + TopoDS_Shape aShapeEdge = aRefEdge->GetValue(); + + if (aShapeEdge.ShapeType() == TopAbs_EDGE) { + TopoDS_Edge anEdge = TopoDS::Edge(aShapeEdge); + + aShape = ExtendEdge(anEdge, aSE.GetUMin(), aSE.GetUMax()); + } + } else if (aType == FACE_UV) { + anExpectedType.push_back(TopAbs_FACE); + + GEOMImpl_IShapeExtend aSE (aFunction); + Handle(GEOM_Function) aRefFace = aSE.GetShape(); + TopoDS_Shape aShapeFace = aRefFace->GetValue(); + + if (aShapeFace.ShapeType() == TopAbs_FACE) { + TopoDS_Face aFace = TopoDS::Face(aShapeFace); + + aFace.Orientation(TopAbs_FORWARD); + aShape = ExtendFace(aFace, aSE.GetUMin(), aSE.GetUMax(), + aSE.GetVMin(), aSE.GetVMax()); + } + } else if (aType == SURFACE_FROM_FACE) { + anExpectedType.push_back(TopAbs_FACE); + + GEOMImpl_IShapeExtend aSE (aFunction); + Handle(GEOM_Function) aRefFace = aSE.GetShape(); + TopoDS_Shape aShapeFace = aRefFace->GetValue(); + + if (aShapeFace.ShapeType() == TopAbs_FACE) { + TopoDS_Face aFace = TopoDS::Face(aShapeFace); + Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace); + + if (aSurface.IsNull() == Standard_False) { + Handle(Standard_Type) aType = aSurface->DynamicType(); + Standard_Real aU1; + Standard_Real aU2; + Standard_Real aV1; + Standard_Real aV2; + + // Get U, V bounds of the face. + aFace.Orientation(TopAbs_FORWARD); + ShapeAnalysis::GetFaceUVBounds(aFace, aU1, aU2, aV1, aV2); + + // Get the surface of original type + while (aType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) { + Handle(Geom_RectangularTrimmedSurface) aTrSurface = + Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface); + + aSurface = aTrSurface->BasisSurface(); + aType = aSurface->DynamicType(); + } + + const Standard_Real aTol = BRep_Tool::Tolerance(aFace); + BRepBuilderAPI_MakeFace aMF(aSurface, aU1, aU2, aV1, aV2, aTol); + + if (aMF.IsDone()) { + aShape = aMF.Shape(); + } + } + } } else { } @@ -594,6 +678,22 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const BRepCheck_Analyzer ana (aShape, false); if (!ana.IsValid()) { //Standard_ConstructionError::Raise("Algorithm have produced an invalid shape result"); + // For Mantis issue 0021772: EDF 2336 GEOM: Non valid face created from two circles + Handle(ShapeFix_Shape) aSfs = new ShapeFix_Shape (aShape); + aSfs->Perform(); + aShape = aSfs->Shape(); + } + + // Check if the result shape type is compatible with the expected. + const TopAbs_ShapeEnum aShType = aShape.ShapeType(); + + if (!anExpectedType.empty()) { + bool ok = false; + std::list::const_iterator it; + for (it = anExpectedType.begin(); it != anExpectedType.end() && !ok; ++it) + ok = (*it == TopAbs_SHAPE || *it == aShType); + if (!ok) + Standard_ConstructionError::Raise("Result type check failed"); } aFunction->SetValue(aShape); @@ -606,6 +706,73 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const return 1; } +TopoDS_Wire GEOMImpl_ShapeDriver::MakeWireFromEdges(const Handle(TColStd_HSequenceOfTransient)& theEdgesFuncs, + const Standard_Real theTolerance) +{ + BRep_Builder B; + + TopoDS_Wire aWire; + B.MakeWire(aWire); + + // add edges + for (unsigned int ind = 1; ind <= theEdgesFuncs->Length(); ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(theEdgesFuncs->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 || aShape_i.ShapeType() == TopAbs_WIRE) { + TopExp_Explorer exp (aShape_i, TopAbs_EDGE); + for (; exp.More(); exp.Next()) + B.Add(aWire, TopoDS::Edge(exp.Current())); + } else { + Standard_TypeMismatch::Raise + ("Shape for wire construction is neither an edge nor a wire"); + } + } + + // 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 { + } + + // IMP 0019766: Building a Wire from unconnected edges by introducing a tolerance + aFW->ClosedWireMode() = Standard_False; + aFW->FixConnected(theTolerance); + if (aFW->StatusConnected(ShapeExtend_FAIL)) { + Standard_ConstructionError::Raise("Wire construction failed: cannot build connected wire"); + } + // IMP 0019766 + if (aFW->StatusConnected(ShapeExtend_DONE3)) { + // Confused with but not Analyzer.Precision(), set the same + aFW->FixGapsByRangesMode() = Standard_True; + if (aFW->FixGaps3d()) { + Handle(ShapeExtend_WireData) sbwd = aFW->WireData(); + Handle(ShapeFix_Edge) aFe = new ShapeFix_Edge; + for (Standard_Integer iedge = 1; iedge <= sbwd->NbEdges(); iedge++) { + TopoDS_Edge aEdge = TopoDS::Edge(sbwd->Edge(iedge)); + aFe->FixVertexTolerance(aEdge); + aFe->FixSameParameter(aEdge); + } + } + else if (aFW->StatusGaps3d(ShapeExtend_FAIL)) { + Standard_ConstructionError::Raise("Wire construction failed: cannot fix 3d gaps"); + } + } + aWire = aFW->WireAPIMake(); + + return aWire; +} + TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, const Standard_Real LinTol, const Standard_Real AngTol) @@ -626,7 +793,7 @@ TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, TColStd_SequenceOfReal TolSeq; GeomAbs_CurveType CurType; TopoDS_Vertex FirstVertex, LastVertex; - Standard_Boolean FinalReverse = Standard_False; + Standard_Real aPntShiftDist = 0.; BRepTools_WireExplorer wexp(theWire) ; for (; wexp.More(); wexp.Next()) @@ -658,8 +825,6 @@ TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, LparSeq.Append(lpar); CurType = aType; FirstVertex = wexp.CurrentVertex(); - if (anEdge.Orientation() == TopAbs_REVERSED) - FinalReverse = Standard_True; } else { @@ -706,6 +871,18 @@ TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, gp_Pnt P2 = ElCLib::Value(lpar, aLine); NewFpar = ElCLib::Parameter(PrevLine, P1); NewLpar = ElCLib::Parameter(PrevLine, P2); + + // Compute shift + if (ConnectByOrigin == TopAbs_FORWARD) { + gp_Pnt aNewP2 = ElCLib::Value(NewLpar, PrevLine); + + aPntShiftDist += P2.Distance(aNewP2); + } else { + gp_Pnt aNewP1 = ElCLib::Value(NewFpar, PrevLine); + + aPntShiftDist += P1.Distance(aNewP1); + } + if (NewLpar < NewFpar) { Standard_Real MemNewFpar = NewFpar; @@ -725,6 +902,8 @@ TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, Abs(aCircle.Radius() - PrevCircle.Radius()) <= LinTol && aCircle.Axis().IsParallel(PrevCircle.Axis(), AngTol)) { + const Standard_Boolean isFwd = ConnectByOrigin == TopAbs_FORWARD; + if (aCircle.Axis().Direction() * PrevCircle.Axis().Direction() < 0.) { Standard_Real memfpar = fpar; @@ -736,6 +915,18 @@ TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, gp_Pnt P2 = ElCLib::Value(lpar, aCircle); NewFpar = ElCLib::Parameter(PrevCircle, P1); NewLpar = ElCLib::Parameter(PrevCircle, P2); + + // Compute shift + if (isFwd) { + gp_Pnt aNewP2 = ElCLib::Value(NewLpar, PrevCircle); + + aPntShiftDist += P2.Distance(aNewP2); + } else { + gp_Pnt aNewP1 = ElCLib::Value(NewFpar, PrevCircle); + + aPntShiftDist += P1.Distance(aNewP1); + } + if (NewLpar < NewFpar) NewLpar += 2.*M_PI; //Standard_Real MemNewFpar = NewFpar, MemNewLpar = NewLpar; @@ -761,6 +952,8 @@ TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, Abs(anEllipse.MinorRadius() - PrevEllipse.MinorRadius()) <= LinTol && anEllipse.Axis().IsParallel(PrevEllipse.Axis(), AngTol)) { + const Standard_Boolean isFwd = ConnectByOrigin == TopAbs_FORWARD; + if (anEllipse.Axis().Direction() * PrevEllipse.Axis().Direction() < 0.) { Standard_Real memfpar = fpar; @@ -772,6 +965,18 @@ TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, gp_Pnt P2 = ElCLib::Value(lpar, anEllipse); NewFpar = ElCLib::Parameter(PrevEllipse, P1); NewLpar = ElCLib::Parameter(PrevEllipse, P2); + + // Compute shift + if (isFwd) { + gp_Pnt aNewP2 = ElCLib::Value(NewLpar, PrevEllipse); + + aPntShiftDist += P2.Distance(aNewP2); + } else { + gp_Pnt aNewP1 = ElCLib::Value(NewFpar, PrevEllipse); + + aPntShiftDist += P1.Distance(aNewP1); + } + if (NewLpar < NewFpar) NewLpar += 2.*M_PI; if (ConnectByOrigin == TopAbs_FORWARD) @@ -800,6 +1005,18 @@ TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, gp_Pnt P2 = ElCLib::Value(lpar, aHypr); NewFpar = ElCLib::Parameter(PrevHypr, P1); NewLpar = ElCLib::Parameter(PrevHypr, P2); + + // Compute shift + if (ConnectByOrigin == TopAbs_FORWARD) { + gp_Pnt aNewP2 = ElCLib::Value(NewLpar, PrevHypr); + + aPntShiftDist += P2.Distance(aNewP2); + } else { + gp_Pnt aNewP1 = ElCLib::Value(NewFpar, PrevHypr); + + aPntShiftDist += P1.Distance(aNewP1); + } + if (NewLpar < NewFpar) { Standard_Real MemNewFpar = NewFpar; @@ -824,6 +1041,18 @@ TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, gp_Pnt P2 = ElCLib::Value(lpar, aParab); NewFpar = ElCLib::Parameter(PrevParab, P1); NewLpar = ElCLib::Parameter(PrevParab, P2); + + // Compute shift + if (ConnectByOrigin == TopAbs_FORWARD) { + gp_Pnt aNewP2 = ElCLib::Value(NewLpar, PrevParab); + + aPntShiftDist += P2.Distance(aNewP2); + } else { + gp_Pnt aNewP1 = ElCLib::Value(NewFpar, PrevParab); + + aPntShiftDist += P1.Distance(aNewP1); + } + if (NewLpar < NewFpar) { Standard_Real MemNewFpar = NewFpar; @@ -853,19 +1082,18 @@ TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, LocSeq.Append(aLocShape); FparSeq.Append(fpar); LparSeq.Append(lpar); - TolSeq.Append(BRep_Tool::Tolerance(CurVertex)); + TolSeq.Append(aPntShiftDist + BRep_Tool::Tolerance(CurVertex)); + aPntShiftDist = 0.; CurType = aType; } } // end of else (CurveSeq.IsEmpty()) -> not first time } // end for (; wexp.More(); wexp.Next()) LastVertex = wexp.CurrentVertex(); - TolSeq.Append(BRep_Tool::Tolerance(LastVertex)); + TolSeq.Append(aPntShiftDist + BRep_Tool::Tolerance(LastVertex)); - TopoDS_Vertex FirstVtx_final = (FinalReverse)? LastVertex : FirstVertex; - FirstVtx_final.Orientation(TopAbs_FORWARD); - TopoDS_Vertex LastVtx_final = (FinalReverse)? FirstVertex : LastVertex; - LastVtx_final.Orientation(TopAbs_REVERSED); + FirstVertex.Orientation(TopAbs_FORWARD); + LastVertex.Orientation(TopAbs_REVERSED); if (!CurveSeq.IsEmpty()) { @@ -933,71 +1161,476 @@ TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire, if (concatcurve->Value(concatcurve->Lower())->Continuity()==GeomAbs_C0){ Standard_ConstructionError::Raise("Construction aborted : The given Wire has sharp bends between some Edges, no valid Edge can be built"); } - ResEdge = BRepLib_MakeEdge(concatcurve->Value(concatcurve->Lower()), - FirstVtx_final, LastVtx_final, - concatcurve->Value(concatcurve->Lower())->FirstParameter(), - concatcurve->Value(concatcurve->Lower())->LastParameter()); + + Standard_Boolean isValidEndVtx = Standard_True; + + if (closed_flag) { + // Check if closed curve is reordered. + Handle(Geom_Curve) aCurve = concatcurve->Value(concatcurve->Lower()); + Standard_Real aFPar = aCurve->FirstParameter(); + gp_Pnt aPFirst; + gp_Pnt aPntVtx = BRep_Tool::Pnt(FirstVertex); + Standard_Real aTolVtx = BRep_Tool::Tolerance(FirstVertex); + + aCurve->D0(aFPar, aPFirst); + + if (!aPFirst.IsEqual(aPntVtx, aTolVtx)) { + // The curve is reordered. Find the new first and last vertices. + TopTools_IndexedMapOfShape aMapVtx; + TopExp::MapShapes(theWire, TopAbs_VERTEX, aMapVtx); + + const Standard_Integer aNbVtx = aMapVtx.Extent(); + Standard_Integer iVtx; + + for (iVtx = 1; iVtx <= aNbVtx; iVtx++) { + const TopoDS_Vertex aVtx = TopoDS::Vertex(aMapVtx.FindKey(iVtx)); + const gp_Pnt aPnt = BRep_Tool::Pnt(aVtx); + const Standard_Real aTol = BRep_Tool::Tolerance(aVtx); + + if (aPFirst.IsEqual(aPnt, aTol)) { + // The coinsident vertex is found. + FirstVertex = aVtx; + LastVertex = aVtx; + FirstVertex.Orientation(TopAbs_FORWARD); + LastVertex.Orientation(TopAbs_REVERSED); + break; + } + } + + if (iVtx > aNbVtx) { + // It is necessary to create new vertices. + isValidEndVtx = Standard_False; + } + } + } + + if (isValidEndVtx) { + ResEdge = BRepLib_MakeEdge(concatcurve->Value(concatcurve->Lower()), + FirstVertex, LastVertex, + concatcurve->Value(concatcurve->Lower())->FirstParameter(), + concatcurve->Value(concatcurve->Lower())->LastParameter()); + } else { + ResEdge = BRepLib_MakeEdge(concatcurve->Value(concatcurve->Lower()), + concatcurve->Value(concatcurve->Lower())->FirstParameter(), + concatcurve->Value(concatcurve->Lower())->LastParameter()); + } } else { if (CurveSeq(1)->IsInstance(STANDARD_TYPE(Geom_TrimmedCurve))) CurveSeq(1) = (*((Handle(Geom_TrimmedCurve)*)&(CurveSeq(1))))->BasisCurve(); - CurveSeq(1)->Transform(LocSeq(1).Location().Transformation()); - ResEdge = BRepLib_MakeEdge(CurveSeq(1), - FirstVtx_final, LastVtx_final, + Handle(Geom_Curve) aNewCurve = + Handle(Geom_Curve)::DownCast(CurveSeq(1)->Copy()); + + aNewCurve->Transform(LocSeq(1).Location().Transformation()); + + if (LocSeq(1).Orientation() == TopAbs_REVERSED) { + const TopoDS_Vertex aVtxTmp = FirstVertex; + + FirstVertex = LastVertex; + LastVertex = aVtxTmp; + FirstVertex.Orientation(TopAbs_FORWARD); + LastVertex.Orientation(TopAbs_REVERSED); + } + + ResEdge = BRepLib_MakeEdge(aNewCurve, + FirstVertex, LastVertex, FparSeq(1), LparSeq(1)); + + if (LocSeq(1).Orientation() == TopAbs_REVERSED) { + ResEdge.Reverse(); + } } } - if (FinalReverse) - ResEdge.Reverse(); - return ResEdge; } -//======================================================================= -//function : GEOMImpl_ShapeDriver_Type_ -//purpose : -//======================================================================= -Standard_EXPORT Handle_Standard_Type& GEOMImpl_ShapeDriver_Type_() +//============================================================================= +/*! + * \brief Returns an isoline for a face. + */ +//============================================================================= + +TopoDS_Shape GEOMImpl_ShapeDriver::MakeIsoline + (const TopoDS_Face &theFace, + const bool IsUIso, + const double theParameter) const +{ + TopoDS_Shape aResult; + GEOMUtils::Hatcher aHatcher(theFace); + const GeomAbs_IsoType aType = (IsUIso ? GeomAbs_IsoU : GeomAbs_IsoV); + + aHatcher.Init(aType, theParameter); + aHatcher.Perform(); + + if (!aHatcher.IsDone()) { + Standard_ConstructionError::Raise("MakeIsoline : Hatcher failure"); + } + + const Handle(TColStd_HArray1OfInteger) &anIndices = + (IsUIso ? aHatcher.GetUIndices() : aHatcher.GetVIndices()); + + if (anIndices.IsNull()) { + Standard_ConstructionError::Raise("MakeIsoline : Null hatching indices"); + } + + const Standard_Integer anIsoInd = anIndices->Lower(); + const Standard_Integer aHatchingIndex = anIndices->Value(anIsoInd); + + if (aHatchingIndex == 0) { + Standard_ConstructionError::Raise("MakeIsoline : Invalid hatching index"); + } + + const Standard_Integer aNbDomains = + aHatcher.GetNbDomains(aHatchingIndex); + + if (aNbDomains < 0) { + Standard_ConstructionError::Raise("MakeIsoline : Invalid number of domains"); + } + + // The hatching is performed successfully. Create the 3d Curve. + Handle(Geom_Surface) aSurface = BRep_Tool::Surface(theFace); + Handle(Geom_Curve) anIsoCurve = (IsUIso ? + aSurface->UIso(theParameter) : aSurface->VIso(theParameter)); + Handle(Geom2d_Curve) aPIsoCurve = + aHatcher.GetHatching(aHatchingIndex); + const Standard_Real aTol = Precision::Confusion(); + Standard_Integer anIDom = 1; + Standard_Real aV1; + Standard_Real aV2; + BRep_Builder aBuilder; + Standard_Integer aNbEdges = 0; + + for (; anIDom <= aNbDomains; anIDom++) { + if (aHatcher.GetDomain(aHatchingIndex, anIDom, aV1, aV2)) { + // Check first and last parameters. + if (!aHatcher.IsDomainInfinite(aHatchingIndex, anIDom)) { + // Create an edge. + TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(anIsoCurve, aV1, aV2); + + // Update it with a parametric curve on face. + aBuilder.UpdateEdge(anEdge, aPIsoCurve, theFace, aTol); + aNbEdges++; + + if (aNbEdges > 1) { + // Result is a compond. + if (aNbEdges == 2) { + // Create a new compound. + TopoDS_Compound aCompound; + + aBuilder.MakeCompound(aCompound); + aBuilder.Add(aCompound, aResult); + aResult = aCompound; + } + + // Add an edge to the compound. + aBuilder.Add(aResult, anEdge); + } else { + // Result is the edge. + aResult = anEdge; + } + } + } + } + + if (aNbEdges == 0) { + Standard_ConstructionError::Raise("MakeIsoline : Empty result"); + } + + return aResult; +} + +//============================================================================= +/*! + * \brief Returns an extended edge. + */ +//============================================================================= + +TopoDS_Shape GEOMImpl_ShapeDriver::ExtendEdge + (const TopoDS_Edge &theEdge, + const Standard_Real theMin, + const Standard_Real theMax) const { + TopoDS_Shape aResult; + Standard_Real aF; + Standard_Real aL; + Handle(Geom_Curve) aCurve = BRep_Tool::Curve(theEdge, aF, aL); + const Standard_Real aTol = BRep_Tool::Tolerance(theEdge); + Standard_Real aRange2d = aL - aF; + + if (aCurve.IsNull() == Standard_False && aRange2d > aTol) { + Standard_Real aMin = aF + aRange2d*theMin; + Standard_Real aMax = aF + aRange2d*theMax; + + Handle(Standard_Type) aType = aCurve->DynamicType(); + + // Get the curve of original type + while (aType == STANDARD_TYPE(Geom_TrimmedCurve)) { + Handle(Geom_TrimmedCurve) aTrCurve = + Handle(Geom_TrimmedCurve)::DownCast(aCurve); + + aCurve = aTrCurve->BasisCurve(); + aType = aCurve->DynamicType(); + } - static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); - if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); - static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); - if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); - static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); - if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + if (aCurve->IsPeriodic()) { + // The curve is periodic. Check if a new range is less then a period. + if (aMax - aMin > aCurve->Period()) { + aMax = aMin + aCurve->Period(); + } + } else { + // The curve is not periodic. Check if aMin and aMax within bounds. + aMin = Max(aMin, aCurve->FirstParameter()); + aMax = Min(aMax, aCurve->LastParameter()); + } + if (aMax - aMin > aTol) { + // Create a new edge. + BRepBuilderAPI_MakeEdge aME (aCurve, aMin, aMax); - static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; - static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_ShapeDriver", - sizeof(GEOMImpl_ShapeDriver), - 1, - (Standard_Address)_Ancestors, - (Standard_Address)NULL); + if (aME.IsDone()) { + aResult = aME.Shape(); + } + } + } - return _aType; + return aResult; } -//======================================================================= -//function : DownCast -//purpose : -//======================================================================= -const Handle(GEOMImpl_ShapeDriver) Handle(GEOMImpl_ShapeDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +//============================================================================= +/*! + * \brief Returns an extended face. + */ +//============================================================================= + +TopoDS_Shape GEOMImpl_ShapeDriver::ExtendFace + (const TopoDS_Face &theFace, + const Standard_Real theUMin, + const Standard_Real theUMax, + const Standard_Real theVMin, + const Standard_Real theVMax) const +{ + TopoDS_Shape aResult; + Handle(Geom_Surface) aSurface = BRep_Tool::Surface(theFace); + const Standard_Real aTol = BRep_Tool::Tolerance(theFace); + Standard_Real aU1; + Standard_Real aU2; + Standard_Real aV1; + Standard_Real aV2; + + // Get U, V bounds of the face. + ShapeAnalysis::GetFaceUVBounds(theFace, aU1, aU2, aV1, aV2); + + const Standard_Real aURange = aU2 - aU1; + const Standard_Real aVRange = aV2 - aV1; + + if (aSurface.IsNull() == Standard_False && + aURange > aTol && aURange > aTol) { + Handle(Standard_Type) aType = aSurface->DynamicType(); + + // Get the surface of original type + while (aType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) { + Handle(Geom_RectangularTrimmedSurface) aTrSurface = + Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface); + + aSurface = aTrSurface->BasisSurface(); + aType = aSurface->DynamicType(); + } + + Standard_Real aUMin = aU1 + aURange*theUMin; + Standard_Real aUMax = aU1 + aURange*theUMax; + Standard_Real aVMin = aV1 + aVRange*theVMin; + Standard_Real aVMax = aV1 + aVRange*theVMax; + + aSurface->Bounds(aU1, aU2, aV1, aV2); + + if (aSurface->IsUPeriodic()) { + // The surface is U-periodic. Check if a new U range is less + // then a period. + if (aUMax - aUMin > aSurface->UPeriod()) { + aUMax = aUMin + aSurface->UPeriod(); + } + } else { + // The surface is not V-periodic. Check if aUMin and aUMax + // within bounds. + aUMin = Max(aUMin, aU1); + aUMax = Min(aUMax, aU2); + } + + if (aSurface->IsVPeriodic()) { + // The surface is V-periodic. Check if a new V range is less + // then a period. + if (aVMax - aVMin > aSurface->VPeriod()) { + aVMax = aVMin + aSurface->VPeriod(); + } + } else { + // The surface is not V-periodic. Check if aVMin and aVMax + // within bounds. + aVMin = Max(aVMin, aV1); + aVMax = Min(aVMax, aV2); + } + + if (aUMax - aUMin > aTol && aVMax - aVMin > aTol) { + // Create a new edge. + BRepBuilderAPI_MakeFace aMF + (aSurface, aUMin, aUMax, aVMin, aVMax, aTol); + + if (aMF.IsDone()) { + aResult = aMF.Shape(); + } + } + } + + return aResult; +} + +//================================================================================ +/*! + * \brief Returns a name of creation operation and names and values of creation parameters + */ +//================================================================================ + +bool GEOMImpl_ShapeDriver:: +GetCreationInformation(std::string& theOperationName, + std::vector& theParams) { - Handle(GEOMImpl_ShapeDriver) _anOtherObject; + if (Label().IsNull()) return 0; + Handle(GEOM_Function) function = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IShapes aCI( function ); + Standard_Integer aType = function->GetType(); + + switch ( aType ) { + case WIRE_EDGES: + theOperationName = "WIRE"; + AddParam( theParams, "Wires/edges", aCI.GetShapes() ); + AddParam( theParams, "Tolerance", aCI.GetTolerance() ); + break; + case FACE_WIRE: + theOperationName = "FACE"; + AddParam( theParams, "Wire/edge", aCI.GetBase() ); + AddParam( theParams, "Is planar wanted", aCI.GetIsPlanar() ); + break; + case FACE_WIRES: + theOperationName = "FACE"; + AddParam( theParams, "Wires/edges", aCI.GetShapes() ); + AddParam( theParams, "Is planar wanted", aCI.GetIsPlanar() ); + break; + case FACE_FROM_SURFACE: + { + theOperationName = "FACE"; + + Handle(TColStd_HSequenceOfTransient) shapes = aCI.GetShapes(); + + if (shapes.IsNull() == Standard_False) { + Standard_Integer aNbShapes = shapes->Length(); + + if (aNbShapes > 0) { + AddParam(theParams, "Face", shapes->Value(1)); + + if (aNbShapes > 1) { + AddParam(theParams, "Wire", shapes->Value(2)); + } + } + } + break; + } + case SHELL_FACES: + theOperationName = "SHELL"; + AddParam( theParams, "Objects", aCI.GetShapes() ); + break; + case SOLID_SHELLS: + theOperationName = "SOLID"; + AddParam( theParams, "Objects", aCI.GetShapes() ); + break; + case SOLID_FACES: + theOperationName = "SOLID_FROM_FACES"; + AddParam( theParams, "Objects", aCI.GetShapes() ); + AddParam( theParams, "Is intersect", aCI.GetIsIntersect() ); + break; + case COMPOUND_SHAPES: + theOperationName = "COMPOUND"; + AddParam( theParams, "Objects", aCI.GetShapes() ); + break; + case EDGE_WIRE: + theOperationName = "EDGE"; + AddParam( theParams, "Wire", aCI.GetBase() ); + AddParam( theParams, "Linear Tolerance", aCI.GetTolerance() ); + AddParam( theParams, "Angular Tolerance", aCI.GetAngularTolerance() ); + break; + case EDGE_CURVE_LENGTH: + theOperationName = "EDGE"; + { + GEOMImpl_IVector aCI( function ); + AddParam( theParams, "Edge", aCI.GetPoint1() ); + AddParam( theParams, "Start point", aCI.GetPoint2() ); + AddParam( theParams, "Length", aCI.GetParameter() ); + } + break; + case SHAPES_ON_SHAPE: + { + theOperationName = "GetShapesOnShapeAsCompound"; + Handle(TColStd_HSequenceOfTransient) shapes = aCI.GetShapes(); + if ( !shapes.IsNull() && shapes->Length() > 0 ) + AddParam( theParams, "Check shape", shapes->Value(1) ); + if ( !shapes.IsNull() && shapes->Length() > 1 ) + AddParam( theParams, "Shape", shapes->Value(2) ); + AddParam( theParams, "Shape type", TopAbs_ShapeEnum( aCI.GetSubShapeType() )); + AddParam( theParams, "State", TopAbs_State((int) aCI.GetTolerance() )); + break; + } + case SHAPE_ISOLINE: + { + GEOMImpl_IIsoline aII (function); + + theOperationName = "ISOLINE"; + AddParam(theParams, "Face", aII.GetFace()); + AddParam(theParams, "Isoline type", (aII.GetIsUIso() ? "U" : "V")); + AddParam(theParams, "Parameter", aII.GetParameter()); + break; + } + case EDGE_UV: + { + GEOMImpl_IShapeExtend aSE (function); + + theOperationName = "EDGE_EXTEND"; + AddParam(theParams, "Edge", aSE.GetShape()); + AddParam(theParams, "Min", aSE.GetUMin()); + AddParam(theParams, "Max", aSE.GetUMax()); + break; + } + case FACE_UV: + { + GEOMImpl_IShapeExtend aSE (function); + + theOperationName = "FACE_EXTEND"; + AddParam(theParams, "Face", aSE.GetShape()); + AddParam(theParams, "UMin", aSE.GetUMin()); + AddParam(theParams, "UMax", aSE.GetUMax()); + AddParam(theParams, "VMin", aSE.GetVMin()); + AddParam(theParams, "VMax", aSE.GetVMax()); + break; + } + case SURFACE_FROM_FACE: + { + GEOMImpl_IShapeExtend aSE (function); - if (!AnObject.IsNull()) { - if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_ShapeDriver))) { - _anOtherObject = Handle(GEOMImpl_ShapeDriver)((Handle(GEOMImpl_ShapeDriver)&)AnObject); - } + theOperationName = "SURFACE_FROM_FACE"; + AddParam(theParams, "Face", aSE.GetShape()); + break; + } + default: + return false; } - return _anOtherObject; + return true; } +IMPLEMENT_STANDARD_HANDLE (GEOMImpl_ShapeDriver,GEOM_BaseDriver); +IMPLEMENT_STANDARD_RTTIEXT (GEOMImpl_ShapeDriver,GEOM_BaseDriver); + //modified by NIZNHY-PKV Wed Dec 28 13:48:31 2011f #include #include @@ -1013,7 +1646,7 @@ const Handle(GEOMImpl_ShapeDriver) Handle(GEOMImpl_ShapeDriver)::DownCast(const //======================================================================= /* void KeepEdgesOrder(const Handle(TopTools_HSequenceOfShape)& aEdges, - const Handle(TopTools_HSequenceOfShape)& aWires) + const Handle(TopTools_HSequenceOfShape)& aWires) { Standard_Integer aNbWires, aNbEdges; // @@ -1052,7 +1685,7 @@ void KeepEdgesOrder(const Handle(TopTools_HSequenceOfShape)& aEdges, for (j=1; j<=aNbEdges; ++j) { const TopoDS_Shape& aE=aEdges->Value(j); if (aMEx.Contains(aE)) { - aBB.Add(aWy, aE); + aBB.Add(aWy, aE); } } //