X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_PipeDriver.cxx;h=aab459299de06e618e3ebc1d9fc5192d03fe34bc;hb=8422ddce7f07cce7117b80c6c8e26fb0bd8cbe78;hp=cf660675f21080d4e5eaccf0a7fc0fdb6505ee33;hpb=326bf4caf8410a271a8a4ed3f41461fcccdde22f;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx index cf660675f..aab459299 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -108,6 +108,8 @@ #define GROUP_SIDE2 3 #define GROUP_OTHER 4 +static const Standard_Real TolPipeSurf = 5.e-4; + static bool FillGroups(const TopTools_SequenceOfShape *theGroups, const TopTools_IndexedMapOfShape &theIndices, Handle(TColStd_HArray1OfInteger) *theGroupIds); @@ -115,11 +117,14 @@ static bool FillGroups(const TopTools_SequenceOfShape *theGroups, static void StoreGroups(GEOMImpl_IPipe *theCI, Handle(TColStd_HArray1OfInteger) *theGroups); -static bool DoGroups(BRepOffsetAPI_MakePipeShell &theSweep, - TopTools_SequenceOfShape *theGroups); +// after OCCT improvement +static bool DoGroups1(const TopoDS_Shape &theProfile, + BRepOffsetAPI_MakePipeShell &theSweep, + TopTools_SequenceOfShape *theGroups); -static bool CreateGroups(BRepOffsetAPI_MakePipeShell &theSweep, - GEOMImpl_IPipe *theCI); +static bool CreateGroups1(const TopoDS_Shape &theProfile, + BRepOffsetAPI_MakePipeShell &theSweep, + GEOMImpl_IPipe *theCI); //======================================================================= //function : GetID @@ -141,7 +146,7 @@ GEOMImpl_PipeDriver::GEOMImpl_PipeDriver() //======================================================================= //function : EvaluateBestSweepMode -//purpose : auxilary for right call of MakePipe and MakePipeShell +//purpose : auxiliary for right call of MakePipe and MakePipeShell //======================================================================= static GeomFill_Trihedron EvaluateBestSweepMode(const TopoDS_Shape& Spine) { @@ -178,11 +183,14 @@ static GeomFill_Trihedron EvaluateBestSweepMode(const TopoDS_Shape& Spine) //======================================================================= static Standard_Boolean BuildPipeShell(BRepOffsetAPI_MakePipeShell &theBuilder) { + theBuilder.SetForceApproxC1(Standard_True); + theBuilder.Build(); Standard_Boolean isDone = theBuilder.IsDone(); - if (!isDone) { + if (!isDone || + theBuilder.ErrorOnSurface() > TolPipeSurf) { // Try to use Descrete Trihedron mode. theBuilder.SetDiscreteMode(); theBuilder.Build(); @@ -194,24 +202,20 @@ static Standard_Boolean BuildPipeShell(BRepOffsetAPI_MakePipeShell &theBuilder) //======================================================================= //function : FillForOtherEdges -//purpose : auxilary for CreatePipeForShellSections() +//purpose : auxiliary for CreatePipeForShellSections() //======================================================================= static bool FillForOtherEdges(const TopoDS_Shape& F1, const TopoDS_Shape& E1, const TopoDS_Shape& V1, TopTools_IndexedDataMapOfShapeShape& FF) { - //cout<<"FillForOtherEdges"<IsKind(STANDARD_TYPE(Geom_Plane))) { + nbPlanar++; + } + else if (aS->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) { + Handle(Geom_RectangularTrimmedSurface) aTS = Handle(Geom_RectangularTrimmedSurface)::DownCast(aS); + if (aTS->BasisSurface()->IsKind(STANDARD_TYPE(Geom_Plane))) { + nbPlanar++; + } + } + aS = BRep_Tool::Surface(TopoDS::Face(aSh2)); + if (aS->IsKind(STANDARD_TYPE(Geom_Plane))) { + nbPlanar++; + } + else if (aS->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) { + Handle(Geom_RectangularTrimmedSurface) aTS = Handle(Geom_RectangularTrimmedSurface)::DownCast(aS); + if (aTS->BasisSurface()->IsKind(STANDARD_TYPE(Geom_Plane))) { + nbPlanar++; + } + } + } + if (nbPlanar < 2) { + TopoDS_Shape aPipe = aBuilder.Shape(); + // make sewing for result + Handle(BRepBuilderAPI_Sewing) aSewing = new BRepBuilderAPI_Sewing; + Standard_Real aTol = Precision::Confusion(); + aSewing->SetTolerance(aTol); + aSewing->SetFaceMode(Standard_True); + aSewing->SetFloatingEdgesMode(Standard_False); + aSewing->SetNonManifoldMode(Standard_False); + TopExp_Explorer anExp; + for (anExp.Init(aPipe, TopAbs_FACE); anExp.More(); anExp.Next()) { + aSewing->Add(anExp.Current()); + } + aSewing->Add(aSh1); + aSewing->Add(aSh2); + aSewing->Perform(); + aShape = aSewing->SewedShape(); + if (aShape.ShapeType() == TopAbs_SHELL) { + // Build a solid. + BRepBuilderAPI_MakeSolid aMkSolid; + aMkSolid.Add(TopoDS::Shell(aShape)); + if (!aMkSolid.IsDone()) { + isDone = Standard_False; + } + else { + TopoDS_Solid aSolid = aMkSolid.Solid(); + BRepClass3d_SolidClassifier aSC(aSolid); + aSC.PerformInfinitePoint(Precision::Confusion()); + if (aSC.State() == TopAbs_IN) { + aShape = aSolid.Reversed(); + } + else { + aShape = aSolid; + } + } + } + else { + isDone = Standard_False; + } + } + else { + isDone = Standard_False; + } + if (!isDone) { + isDone = aBuilder.MakeSolid(); + if (isDone) { + aShape = aBuilder.Shape(); + } + } + return isDone; +} + //======================================================================= //function : CreatePipeWithDifferentSections //purpose : @@ -837,7 +897,6 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections double tol = BRep_Tool::Tolerance(edge); TopoDS_Vertex VF = sae.FirstVertex(edge); gp_Pnt PF = BRep_Tool::Pnt(VF); - //cout<<"PF("< tol) { Standard_ConstructionError::Raise ("First location shapes is not coincided with first vertex of aWirePath"); @@ -911,7 +970,7 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections } } if (nbEdges we have to update WirePath + // one of edges was split => we have to update WirePath BRep_Builder B; TopoDS_Wire W; B.MakeWire(W); @@ -973,7 +1032,6 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections P1 = P2; } int LastLoc = 1; - //cout<<"Edges.Length()="< tol) { if (aCI) delete aCI; Standard_ConstructionError::Raise @@ -1627,7 +1693,7 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, // Create groups. if (isGenerateGroups) { // Make groups. - if (!DoGroups(aBuilder, aLocalGroups)) { + if (!DoGroups1(aWire1, aBuilder, aLocalGroups)) { if (aCI) delete aCI; Standard_ConstructionError::Raise("Generate groups failure"); } @@ -1813,7 +1879,7 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, bool stat = FillForOtherEdges(FS1,E1,V11,FF); if (!stat) { if (aCI) delete aCI; - Standard_ConstructionError::Raise("FindForOtherEdges: Can not mapping other egdes"); + Standard_ConstructionError::Raise("FindForOtherEdges: Can not map other edges"); } } @@ -1914,7 +1980,7 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, // Create groups. if (isGenerateGroups) { // Make groups. - if (!DoGroups(aBuilder, aLocalGroups)) { + if (!DoGroups1(aWire1, aBuilder, aLocalGroups)) { if (aCI) delete aCI; Standard_ConstructionError::Raise("Generate groups failure"); } @@ -1955,8 +2021,7 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, aShell = TopoDS::Shell(aSewShape); GProp_GProps aSystem; BRepGProp::VolumeProperties(aShell, aSystem); - if (aSystem.Mass()<0) { - //cout<<"aSewShape is reversed"<edge for created pipe edges + // auxiliary map vertex->edge for created pipe edges TopTools_IndexedDataMapOfShapeShape VPE; ShapeAnalysis_Edge sae; - //cout<<"FF.Extent()="<IsKind(STANDARD_TYPE(Geom_Conic))) { - // IsConicC1 = true; - // cout<<"C1 - Geom_Conic"<IsKind(STANDARD_TYPE(Geom_Line)) || C1->IsKind(STANDARD_TYPE(Geom_Conic))) { C1 = new Geom_TrimmedCurve(C1,fp,lp); } - //if (IsConicC1) { - // double tol = BRep_Tool::Tolerance(E1); - // GeomConvert_ApproxCurve ApxC1(C1,tol,GeomAbs_C1,10,5); - // C1 = ApxC1.Curve(); - //} Handle(Geom_Curve) C3 = BRep_Tool::Curve(E3,fp,lp); if (C3->IsKind(STANDARD_TYPE(Geom_Line)) || C3->IsKind(STANDARD_TYPE(Geom_Conic))) { C3 = new Geom_TrimmedCurve(C3,fp,lp); } - //filebuf fic; - //ostream os(&fic); - //os.precision(15); Handle(Geom_BSplineCurve) CE1 = GeomConvert::CurveToBSplineCurve(C1,Convert_RationalC1); if (CE1->Degree()<3) @@ -2395,7 +2444,7 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) GeomAPI_Interpolate anInt(HAP,Standard_False,1.e-7); anInt.Load(aDir1,aDir2); anInt.Perform(); - Handle(Geom_Curve) iso = anInt.Curve(); + const Handle(Geom_BSplineCurve) iso = anInt.Curve(); fp = iso->FirstParameter(); lp = iso->LastParameter(); step = (lp-fp)/(NbP-1); @@ -2464,8 +2513,7 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) aShell = TopoDS::Shell(aSewShape); GProp_GProps aSystem; BRepGProp::VolumeProperties(aShell, aSystem); - if (aSystem.Mass()<0) { - //cout<<"aSewShape is reversed"<GetGenerateGroups()) { // Nothing to do. @@ -2842,7 +2907,7 @@ bool CreateGroups(BRepOffsetAPI_MakePipeShell &theSweep, // Make groups. TopTools_SequenceOfShape aGroups[5]; - if (!DoGroups(theSweep, aGroups)) { + if (!DoGroups1(theProfile, theSweep, aGroups)) { return false; } @@ -2864,13 +2929,13 @@ bool CreateGroups(BRepOffsetAPI_MakePipeShell &theSweep, } //======================================================================= -//function : DoGroups -//purpose : auxilary for CreateGroups() +//function : DoGroups2 +//purpose : auxiliary for CreateGroups() //======================================================================= -static bool DoGroups(const TopoDS_Shape &theProfile, - const TopoDS_Shape &thePath, - BRepOffsetAPI_MakePipe &theSweep, - TopTools_SequenceOfShape *theGroups) +static bool DoGroups2(const TopoDS_Shape &theProfile, + const TopoDS_Shape &thePath, + BRepOffsetAPI_MakePipe &theSweep, + TopTools_SequenceOfShape *theGroups) { Standard_Boolean isDoSides = Standard_False; @@ -2914,7 +2979,7 @@ static bool DoGroups(const TopoDS_Shape &theProfile, } } } else { - // Create Other group. Get boudnary edges of the profile. + // Create Other group. Get boundary edges of the profile. TopTools_MapOfShape aMapBndEdges; TopExp_Explorer anExp(theProfile, TopAbs_EDGE); @@ -2953,12 +3018,12 @@ static bool DoGroups(const TopoDS_Shape &theProfile, //======================================================================= //function : CreateGroups -//purpose : auxilary for Execute() +//purpose : auxiliary for Execute() //======================================================================= -static bool CreateGroups(const TopoDS_Shape &theProfile, - const TopoDS_Shape &thePath, - BRepOffsetAPI_MakePipe &theSweep, - GEOMImpl_IPipe *theCI) +static bool CreateGroups2(const TopoDS_Shape &theProfile, + const TopoDS_Shape &thePath, + BRepOffsetAPI_MakePipe &theSweep, + GEOMImpl_IPipe *theCI) { if (!theCI->GetGenerateGroups()) { // Nothing to do. @@ -2968,7 +3033,7 @@ static bool CreateGroups(const TopoDS_Shape &theProfile, // Make groups. TopTools_SequenceOfShape aGroups[5]; - if (!DoGroups(theProfile, thePath, theSweep, aGroups)) { + if (!DoGroups2(theProfile, thePath, theSweep, aGroups)) { return false; } @@ -2993,7 +3058,7 @@ static bool CreateGroups(const TopoDS_Shape &theProfile, //function : Execute //purpose : //======================================================================= -Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const +Standard_Integer GEOMImpl_PipeDriver::Execute(Handle(TFunction_Logbook)& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); @@ -3088,21 +3153,21 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const if (aShapeBase.ShapeType() == TopAbs_EDGE || aShapeBase.ShapeType() == TopAbs_WIRE) { - TopoDS_Wire Profile; + TopoDS_Wire aProfile; if (aShapeBase.ShapeType() == TopAbs_WIRE) - Profile = TopoDS::Wire(aShapeBase); + aProfile = TopoDS::Wire(aShapeBase); else { BRep_Builder BB; - BB.MakeWire(Profile); - BB.Add(Profile, aShapeBase); + BB.MakeWire(aProfile); + BB.Add(aProfile, aShapeBase); } BRepOffsetAPI_MakePipeShell Sweep (aWirePath); BRepBuilderAPI_MakeFace FaceBuilder (aWirePath, Standard_True); //to find the plane of spine if (FaceBuilder.IsDone()) Sweep.SetMode(FaceBuilder.Face()); - Sweep.Add(Profile); + Sweep.Add(aProfile); Standard_Boolean isDone = BuildPipeShell(Sweep); @@ -3114,7 +3179,7 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const else aShape = Sweep.Shape(); //result is good - if (!CreateGroups(Sweep, aCI)) { + if (!CreateGroups1(aProfile, Sweep, aCI)) { if (aCI) delete aCI; Standard_ConstructionError::Raise("Generate groups failure"); } @@ -3122,24 +3187,25 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const else { GeomFill_Trihedron theBestMode = EvaluateBestSweepMode(aWirePath); - BRepOffsetAPI_MakePipe aMkPipe(aWirePath, aShapeBase, theBestMode); + BRepOffsetAPI_MakePipe aMkPipe + (aWirePath, aShapeBase, theBestMode, Standard_True); - if (aMkPipe.IsDone()) { + if (aMkPipe.IsDone() && aMkPipe.ErrorOnSurface() <= TolPipeSurf) { aShape = aMkPipe.Shape(); - if (!CreateGroups(aShapeBase, aWirePath, aMkPipe, aCI)) { + if (!CreateGroups2(aShapeBase, aWirePath, aMkPipe, aCI)) { if (aCI) delete aCI; Standard_ConstructionError::Raise("Generate groups failure"); } } else if (theBestMode != GeomFill_IsDiscreteTrihedron) { // Try to use Descrete Trihedron mode. BRepOffsetAPI_MakePipe aMkPipeDescrete - (aWirePath, aShapeBase, GeomFill_IsDiscreteTrihedron); + (aWirePath, aShapeBase, GeomFill_IsDiscreteTrihedron, Standard_True); if (aMkPipeDescrete.IsDone()) { aShape = aMkPipeDescrete.Shape(); - if (!CreateGroups(aShapeBase, aWirePath, aMkPipeDescrete, aCI)) { + if (!CreateGroups2(aShapeBase, aWirePath, aMkPipeDescrete, aCI)) { if (aCI) delete aCI; Standard_ConstructionError::Raise("Generate groups failure"); } @@ -3346,7 +3412,7 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const TopoDS_Shape aRes = GEOMUtils::CompsolidToCompound(aShape); aFunction->SetValue(aRes); - log.SetTouched(Label()); + log->SetTouched(Label()); return 1; } @@ -3425,5 +3491,4 @@ GetCreationInformation(std::string& theOperationName, return true; } -IMPLEMENT_STANDARD_HANDLE (GEOMImpl_PipeDriver,GEOM_BaseDriver); IMPLEMENT_STANDARD_RTTIEXT (GEOMImpl_PipeDriver,GEOM_BaseDriver);