From 8851ec8d8f69aedca05141791a6f81239cb192b0 Mon Sep 17 00:00:00 2001 From: skv Date: Tue, 21 Jul 2015 18:29:07 +0300 Subject: [PATCH] 0022664: [CEA 1253] MakePipeWithDifferentSections fails on a elbow pipe --- doc/salome/examples/complex_objs_ex05.py | 16 +- doc/salome/gui/GEOM/images/pipe3.png | Bin 29124 -> 30885 bytes .../input/creating_extrusion_alongpath.doc | 17 +- idl/GEOM_Gen.idl | 9 +- src/GEOMGUI/GEOM_msg_en.ts | 4 + src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx | 22 +- src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx | 1 + src/GEOMImpl/GEOMImpl_IPipe.hxx | 1 + src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx | 6 + src/GEOMImpl/GEOMImpl_PipeDriver.cxx | 215 ++++++++++++++---- src/GEOMImpl/GEOMImpl_PipeDriver.hxx | 1 + src/GEOMImpl/GEOMImpl_PrismDriver.cxx | 3 +- src/GEOM_I/GEOM_I3DPrimOperations_i.cc | 3 +- src/GEOM_I/GEOM_I3DPrimOperations_i.hh | 1 + src/GEOM_I_Superv/GEOM_Superv_i.cc | 2 +- src/GEOM_PY/structelem/parts.py | 3 +- src/GEOM_SWIG/geomBuilder.py | 39 +++- src/GenerationGUI/GenerationGUI_PipeDlg.cxx | 59 +++-- src/GenerationGUI/GenerationGUI_PipeDlg.h | 2 + 19 files changed, 325 insertions(+), 79 deletions(-) diff --git a/doc/salome/examples/complex_objs_ex05.py b/doc/salome/examples/complex_objs_ex05.py index f38f0816b..f6681b587 100644 --- a/doc/salome/examples/complex_objs_ex05.py +++ b/doc/salome/examples/complex_objs_ex05.py @@ -18,18 +18,22 @@ circles.append(geompy.MakeCircle(vertices[1], edges[0], 40)) circles.append(geompy.MakeCircle(vertices[2], edges[2], 30)) circles.append(geompy.MakeCircle(vertices[3], edges[2], 20)) -# create pipe -Pipe = geompy.MakePipeWithDifferentSections(circles, vertices, Wire_1, 0, 0) +# create pipes +Pipe1 = geompy.MakePipeWithDifferentSections(circles, vertices, Wire_1, 0, 0) +Pipe2 = geompy.MakePipeWithDifferentSectionsBySteps(circles, vertices, Wire_1) # add objects in the study geompy.addToStudy(circles[0], "circles1") geompy.addToStudy(circles[1], "circles2") geompy.addToStudy(circles[2], "circles3") geompy.addToStudy(circles[3], "circles4") -id_wire = geompy.addToStudy(Wire_1, "Path") -id_pipe = geompy.addToStudy(Pipe, "Pipe") +id_wire = geompy.addToStudy(Wire_1, "Path") +id_pipe1 = geompy.addToStudy(Pipe1, "Pipe1") +id_pipe2 = geompy.addToStudy(Pipe2, "Pipe2") # display the wire(path) and the pipe gg.createAndDisplayGO(id_wire) -gg.createAndDisplayGO(id_pipe) -gg.setDisplayMode(id_pipe,1) +gg.createAndDisplayGO(id_pipe1) +gg.createAndDisplayGO(id_pipe2) +gg.setDisplayMode(id_pipe1,1) +gg.setDisplayMode(id_pipe2,1) diff --git a/doc/salome/gui/GEOM/images/pipe3.png b/doc/salome/gui/GEOM/images/pipe3.png index d1b7f403112e899f565dd7a357a33e951efaa125..c5c3149152a256cb0e62efc775af7a4aaebc1902 100644 GIT binary patch delta 13521 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 JizJQx{tG%MohtwU delta 11767 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 diff --git a/doc/salome/gui/GEOM/input/creating_extrusion_alongpath.doc b/doc/salome/gui/GEOM/input/creating_extrusion_alongpath.doc index 078089362..84260fe68 100644 --- a/doc/salome/gui/GEOM/input/creating_extrusion_alongpath.doc +++ b/doc/salome/gui/GEOM/input/creating_extrusion_alongpath.doc @@ -72,18 +72,33 @@ Additional controls: - If With contact is checked, the section is translated in contact with the spine. - If With correction is checked, the section is rotated to be orthogonal to the spine tangent in the corresponding point. +- If Step-by-step generation is checked, the result is created +step-by-step, i.e. it creates pipes between each pair of neighbor sections and +fuses them into a single shape. + +\note If Step-by-step generation is checked, With contact and +With correction controls are disabled as corrections of bases are +not allowed in step-by-step mode. Generate groups checkbox - if checked allows to create groups of sub-shapes. For more details on groups creation please refer to \ref create_groups_page "this description". \n The \b Result of the operation will be a shell or a solid. -\n TUI Command: geompy.MakePipeWithDifferentSections(baseShape, locations, pathShape, withContact, withCorrection, +\n TUI Commands: +- geompy.MakePipeWithDifferentSections(baseShape, locations, pathShape, withContact, withCorrection, IsGenerateGroups=False) \n Arguments: Name + list of shapes (edges, planar wires, faces or shells) serving as base object + list of locations (vertices) on the path corresponding specified list of the shapes + 1 shape (edge or wire) for definition of the path + 3 Boolean parameters (withContact, withCorrection, IsGenerateGroups). +- geompy.MakePipeWithDifferentSectionsBySteps(baseShape, locations, pathShape, + IsGenerateGroups=False) +\n Arguments: Name + list of shapes (edges, planar wires, faces or shells) serving as base object + +list of locations (vertices) on the path corresponding specified list of the shapes + +1 shape (edge or wire) for definition of the path + +Boolean parameter. + \n Advanced options \ref preview_anchor "Preview" \image html pipe3.png diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index d7c643562..4b56df001 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -1808,9 +1808,13 @@ module GEOM * should be equal to number of bases or list of locations can be empty. * \param thePath - Path shape to extrude the base shape along it. * \param theWithContact - the mode defining that the section is translated to be in - * contact with the spine. + * contact with the spine. Ignored if IsBySteps is set. * \param theWithCorrection - defining that the section is rotated to be - * orthogonal to the spine tangent in the correspondent point + * orthogonal to the spine tangent in + * the correspondent point. Ignored if IsBySteps is set. + * \param IsBySteps - flag that tells if the result should be created + * step by step or as a whole. If IsBySteps is set no correction + * of bases is allowed. * \param IsGenerateGroups flag that tells if it is necessary to * return groups (true) or not (false). * \return The list of objects. The first one is a result pipe, @@ -1823,6 +1827,7 @@ module GEOM in GEOM_Object thePath, in boolean theWithContact , in boolean theWithCorrection, + in boolean IsBySteps, in boolean IsGenerateGroups); /*! diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index d9ce747c7..606714b1e 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -1428,6 +1428,10 @@ Please, select face, shell or solid and try again GEOM_GROUP_NAME_PREFIX Group Names Prefix + + GEOM_STEP_BY_STEP + Step-by-step generation + GEOM_PLANE Plane diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index 017447071..4f46c1bbd 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -1828,6 +1828,7 @@ Handle(TColStd_HSequenceOfTransient) const Handle(GEOM_Object) &thePath, const bool theWithContact, const bool theWithCorrections, + const bool IsBySteps, const bool IsGenerateGroups) { SetErrorCode(KO); @@ -1897,8 +1898,13 @@ Handle(TColStd_HSequenceOfTransient) aCI.SetBases(aSeqBases); aCI.SetLocations(aSeqLocs); aCI.SetPath(aRefPath); - aCI.SetWithContactMode(theWithContact); - aCI.SetWithCorrectionMode(theWithCorrections); + + if (!IsBySteps) { + aCI.SetWithContactMode(theWithContact); + aCI.SetWithCorrectionMode(theWithCorrections); + } + + aCI.SetIsBySteps(IsBySteps); aCI.SetGenerateGroups(IsGenerateGroups); //Compute the Pipe value @@ -1930,7 +1936,11 @@ Handle(TColStd_HSequenceOfTransient) pyDump << aPipeDS; } - pyDump << " = geompy.MakePipeWithDifferentSections(["; + if (IsBySteps) { + pyDump << " = geompy.MakePipeWithDifferentSectionsBySteps(["; + } else { + pyDump << " = geompy.MakePipeWithDifferentSections(["; + } for(i =1 ; i <= nbBases; i++) { @@ -1962,7 +1972,11 @@ Handle(TColStd_HSequenceOfTransient) } } - pyDump<< "], "<GetInteger(PIPEDS_ARG_WITHCORRECT); } + void SetIsBySteps (int IsBySteps) + { _func->SetInteger(PIPEDS_ARG_BY_STEPS, IsBySteps); } + + int GetIsBySteps() + { return _func->GetInteger(PIPEDS_ARG_BY_STEPS); } + }; #endif diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx index 31f53f873..cf660675f 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx @@ -43,8 +43,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -686,6 +688,42 @@ static void FindFirstPairFaces(const TopoDS_Shape& S1, const TopoDS_Shape& S2, FS2 = Fs(numface); } +//======================================================================= +//function : RemoveFaces +//purpose : This function returns theShapeFrom without faces of the shape +// theFacesToRm. It returns a shell if theShapeFrom is a solid or +// a compound otherwise. Auxilary for CreatePipeWithDifferentSections +// method. +//======================================================================= +static TopoDS_Shape RemoveFaces(const TopoDS_Shape &theShapeFrom, + const TopoDS_Shape &theFacesToRm) +{ + TopTools_IndexedMapOfShape aMapFaces; + TopExp_Explorer anExp(theShapeFrom, TopAbs_FACE); + BRep_Builder aBuilder; + TopoDS_Shape aResult; + + if (theShapeFrom.ShapeType() == TopAbs_SOLID) { + // Create shell + aBuilder.MakeShell(TopoDS::Shell(aResult)); + } else { + // Create compound + aBuilder.MakeCompound(TopoDS::Compound(aResult)); + } + + TopExp::MapShapes(theFacesToRm, TopAbs_FACE, aMapFaces); + + for (; anExp.More(); anExp.Next()) { + const TopoDS_Shape &aFace = anExp.Current(); + + if (!aMapFaces.Contains(aFace)) { + aBuilder.Add(aResult, aFace); + } + } + + return aResult; +} + //======================================================================= //function : CreatePipeWithDifferentSections //purpose : @@ -696,6 +734,7 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections const Handle(TopTools_HSequenceOfShape) theHSeqLocs, const Standard_Boolean theWithContact, const Standard_Boolean theWithCorrect, + const Standard_Boolean IsBySteps, Handle(TColStd_HArray1OfInteger) *theGroups) { TopoDS_Shape aShape; @@ -883,49 +922,82 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections } } - // check curvature of wire for condition that - // max summary angle between directions along - // wire path must be < 4*PI. If not - split wire - // and seguences of shapes, perform pipe for each - // and make sewing after that - double fp,lp; - gp_Pnt P1,P2; - gp_Vec Vec1,Vec2; - double SumAng = 0; - if ( Edges.Length() > 0 ) { - Handle(Geom_Curve) C = BRep_Tool::Curve(TopoDS::Edge(Edges.Value(1)),fp,lp); - C->D1(fp,P1,Vec1); - C->D1(lp,P2,Vec2); - SumAng = fabs(Vec1.Angle(Vec2)); - Vec1 = Vec2; - P1 = P2; - } TColStd_SequenceOfInteger SplitEdgeNums,SplitLocNums; - int LastLoc = 1; - //cout<<"Edges.Length()="<D1(lp,P2,Vec2); - double ang = fabs(Vec1.Angle(Vec2)); - SumAng += ang; - if (SumAng>4*M_PI) { - SumAng = ang; - SplitEdgeNums.Append(i-1); - int j; - for (j=LastLoc+1; j<=aSeqLocs.Length(); j++) { - TopoDS_Vertex aVert = TopoDS::Vertex(aSeqLocs.Value(j)); - gp_Pnt P = BRep_Tool::Pnt(aVert); - if (P1.Distance(P) < tol) { - SplitLocNums.Append(j); - LastLoc = j; - break; - } + + if (IsBySteps) { + // Fill SplitEdgeNums and SplitLocNums with intermediate location indices + // and corresponding edge indices. + Standard_Integer i = 1; + Standard_Integer j; + TopoDS_Vertex aVert; + gp_Pnt aP; + + for (j = 2; j < aSeqLocs.Length(); j++) { + SplitLocNums.Append(j); + aVert = TopoDS::Vertex(aSeqLocs.Value(j)); + aP = BRep_Tool::Pnt(aVert); + + while (i < Edges.Length()) { + Standard_Real aFp; + Standard_Real aLp; + TopoDS_Edge anEdge = TopoDS::Edge(Edges.Value(i)); + Standard_Real aTol = BRep_Tool::Tolerance(anEdge); + Handle(Geom_Curve) aC = BRep_Tool::Curve(anEdge, aFp, aLp); + gp_Pnt aPLast; + + aC->D0(aLp, aPLast); + i++; + + if (aP.Distance(aPLast) < aTol) { + SplitEdgeNums.Append(i - 1); + break; } } + } + } else { + // check curvature of wire for condition that + // max summary angle between directions along + // wire path must be < 4*PI. If not - split wire + // and seguences of shapes, perform pipe for each + // and make sewing after that + double fp,lp; + gp_Pnt P1,P2; + gp_Vec Vec1,Vec2; + double SumAng = 0; + if ( Edges.Length() > 0 ) { + Handle(Geom_Curve) C = BRep_Tool::Curve(TopoDS::Edge(Edges.Value(1)),fp,lp); + C->D1(fp,P1,Vec1); + C->D1(lp,P2,Vec2); + SumAng = fabs(Vec1.Angle(Vec2)); Vec1 = Vec2; P1 = P2; + } + int LastLoc = 1; + //cout<<"Edges.Length()="<D1(lp,P2,Vec2); + double ang = fabs(Vec1.Angle(Vec2)); + SumAng += ang; + if (SumAng>4*M_PI) { + SumAng = ang; + SplitEdgeNums.Append(i-1); + int j; + for (j=LastLoc+1; j<=aSeqLocs.Length(); j++) { + TopoDS_Vertex aVert = TopoDS::Vertex(aSeqLocs.Value(j)); + gp_Pnt P = BRep_Tool::Pnt(aVert); + if (P1.Distance(P) < tol) { + SplitLocNums.Append(j); + LastLoc = j; + break; + } + } + } + Vec1 = Vec2; + P1 = P2; + } } bool isCreateGroups = (theGroups != NULL); @@ -966,9 +1038,24 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid"); } - BuildPipeShell(aBuilder); + Standard_Boolean isDone = BuildPipeShell(aBuilder); + + if (isDone && NeedCreateSolid && nn == 1) { + // Make solid for the first step. + isDone = aBuilder.MakeSolid(); + } + + if (!isDone) { + Standard_ConstructionError::Raise("Pipe construction failure"); + } TopoDS_Shape resShape = aBuilder.Shape(); + + if (NeedCreateSolid && nn == 1) { + // Remove top lid from the result. + resShape = RemoveFaces(resShape, aBuilder.LastShape()); + } + aSeqRes.Append(resShape); // Create groups. @@ -1014,9 +1101,23 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid"); } - BuildPipeShell(aBuilder); + Standard_Boolean isDone = BuildPipeShell(aBuilder); + + if (isDone && NeedCreateSolid) { + isDone = aBuilder.MakeSolid(); + } + + if (!isDone) { + Standard_ConstructionError::Raise("Pipe construction failure"); + } TopoDS_Shape resShape = aBuilder.Shape(); + + if (NeedCreateSolid) { + // Remove bottom lid from the result. + resShape = RemoveFaces(resShape, aBuilder.FirstShape()); + } + aSeqRes.Append(resShape); // Create groups. @@ -1046,6 +1147,28 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections aSewing->Perform(); aShape = aSewing->SewedShape(); + if (NeedCreateSolid && aShape.ShapeType() == TopAbs_SHELL) { + // Build a solid. + BRepBuilderAPI_MakeSolid aMkSolid; + + aMkSolid.Add(TopoDS::Shell(aShape)); + + if (!aMkSolid.IsDone()) { + Standard_ConstructionError::Raise("Can't create solid pipe"); + } + + TopoDS_Solid aSolid = aMkSolid.Solid(); + BRepClass3d_SolidClassifier aSC(aSolid); + + aSC.PerformInfinitePoint(Precision::Confusion()); + + if (aSC.State() == TopAbs_IN) { + aShape = aSolid.Reversed(); + } else { + aShape = aSolid; + } + } + if (isCreateGroups) { // Replase Group shapes by modified ones. TopTools_SequenceOfShape aSeqGroups[5]; @@ -3032,6 +3155,7 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const Handle(TColStd_HSequenceOfTransient) aLocObjs = aCIDS->GetLocations (); Standard_Boolean aWithContact = (aCIDS->GetWithContactMode()); Standard_Boolean aWithCorrect = (aCIDS->GetWithCorrectionMode()); + Standard_Boolean isBySteps = aCIDS->GetIsBySteps(); if (aCI) { delete aCI; @@ -3079,7 +3203,7 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const aShape = CreatePipeWithDifferentSections (aWirePath, aHSeqBases, aHSeqLocs, - aWithContact, aWithCorrect, pGroups); + aWithContact, aWithCorrect, isBySteps, pGroups); if (isGenerateGroups) { // Store created groups. @@ -3265,8 +3389,13 @@ GetCreationInformation(std::string& theOperationName, AddParam( theParams, "Bases", aCI.GetBases() ); AddParam( theParams, "Locations", aCI.GetLocations() ); AddParam( theParams, "Path", aCI.GetPath() ); - AddParam( theParams, "With contact", aCI.GetWithContactMode() ); - AddParam( theParams, "With correction", aCI.GetWithCorrectionMode() ); + + if (!aCI.GetIsBySteps()) { + AddParam( theParams, "With contact", aCI.GetWithContactMode() ); + AddParam( theParams, "With correction", aCI.GetWithCorrectionMode() ); + } + + AddParam( theParams, "Step by step", aCI.GetIsBySteps() ); break; } case PIPE_SHELL_SECTIONS: diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.hxx b/src/GEOMImpl/GEOMImpl_PipeDriver.hxx index 3a4deca6f..767536946 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.hxx @@ -88,6 +88,7 @@ public: const Handle(TopTools_HSequenceOfShape) theLocs, const Standard_Boolean theWithContact, const Standard_Boolean theWithCorrect, + const Standard_Boolean IsBySteps, Handle(TColStd_HArray1OfInteger) *theGroups = NULL); Standard_EXPORT virtual diff --git a/src/GEOMImpl/GEOMImpl_PrismDriver.cxx b/src/GEOMImpl/GEOMImpl_PrismDriver.cxx index 52f6d2109..48e5353ea 100644 --- a/src/GEOMImpl/GEOMImpl_PrismDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PrismDriver.cxx @@ -351,7 +351,8 @@ TopoDS_Shape GEOMImpl_PrismDriver::MakeScaledPrism (const TopoDS_Shape& theShape aLocs->Append(aShapeCDG_1); aLocs->Append(aShapeCDG_2); - aShape = GEOMImpl_PipeDriver::CreatePipeWithDifferentSections(aWirePath, aBases, aLocs, false, false); + aShape = GEOMImpl_PipeDriver::CreatePipeWithDifferentSections + (aWirePath, aBases, aLocs, false, false, false); // 7. Make a solid, if possible if (theShapeBase.ShapeType() == TopAbs_FACE) { diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc index 3d5969f71..41b415ded 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc @@ -987,6 +987,7 @@ GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections GEOM::GEOM_Object_ptr thePath, CORBA::Boolean theWithContact, CORBA::Boolean theWithCorrections, + CORBA::Boolean IsBySteps, CORBA::Boolean IsGenerateGroups) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -1029,7 +1030,7 @@ GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections GetOperations()->MakePipeWithDifferentSections (aSeqBases, aSeqLocations, aPath, theWithContact, - theWithCorrections, IsGenerateGroups); + theWithCorrections, IsBySteps, IsGenerateGroups); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh index d5d8ea847..3fe2951eb 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh @@ -186,6 +186,7 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i : GEOM::GEOM_Object_ptr thePath, CORBA::Boolean theWithContact, CORBA::Boolean theWithCorrections, + CORBA::Boolean IsBySteps, CORBA::Boolean IsGenerateGroups); GEOM::ListOfGO* MakePipeWithShellSections diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index bfd598ad5..449a3c6b8 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -1512,7 +1512,7 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeWithDifferentSections beginService( " GEOM_Superv_i::MakePipeWithDifferentSections" ); MESSAGE("GEOM_Superv_i::MakePipeWithDifferentSections"); get3DPrimOp(); - GEOM::ListOfGO_var aList = my3DPrimOp->MakePipeWithDifferentSections(theBases,theLocations, thePath,theWithContact,theWithCorrections, false); + GEOM::ListOfGO_var aList = my3DPrimOp->MakePipeWithDifferentSections(theBases,theLocations, thePath,theWithContact,theWithCorrections, false, false); endService( " GEOM_Superv_i::MakePipeWithDifferentSections" ); return aList[0]; } diff --git a/src/GEOM_PY/structelem/parts.py b/src/GEOM_PY/structelem/parts.py index 5ab2f2474..ae1e59d0f 100644 --- a/src/GEOM_PY/structelem/parts.py +++ b/src/GEOM_PY/structelem/parts.py @@ -361,7 +361,8 @@ class Beam(StructuralElementPart): face2 = self.geom.MakeFace(wire2, True) shell = self.geom.MakePipeWithDifferentSections([wire1, wire2], [point1, point2], - path, False, False) + path, False, False, + False) closedShell = self.geom.MakeShell([face1, face2, shell]) solid = self.geom.MakeSolid([closedShell]) return solid diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index 0e8257dec..d0eba918c 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -4037,7 +4037,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): aList = self.PrimOp.MakePipeWithDifferentSections(theSeqBases, theLocations, thePath, theWithContact, theWithCorrection, - IsGenerateGroups) + False, IsGenerateGroups) RaiseIfFailed("MakePipeWithDifferentSections", self.PrimOp) if IsGenerateGroups: @@ -4047,6 +4047,43 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): self._autoPublish(aList[0], theName, "pipe") return aList[0] + ## Create a shape by extrusion of the profile shape along + # the path shape. This function is a version of + # MakePipeWithShellSections() with the same parameters, except + # eliminated theWithContact and theWithCorrection. So it is + # possible to find the description of all parameters is in this + # method. The difference is that this method performs the operation + # step by step, i.e. it creates pipes between each pair of neighbor + # sections and fuses them into a single shape. + # + # @ref tui_creation_pipe_with_diff_sec "Example" + @ManageTransactions("PrimOp") + def MakePipeWithDifferentSectionsBySteps(self, theSeqBases, + theLocations, thePath, + IsGenerateGroups=False, theName=None): + """ + Create a shape by extrusion of the profile shape along + the path shape. This function is a version of + MakePipeWithShellSections() with the same parameters, except + eliminated theWithContact and theWithCorrection. So it is + possible to find the description of all parameters is in this + method. The difference is that this method performs the operation + step by step, i.e. it creates pipes between each pair of neighbor + sections and fuses them into a single shape. + """ + aList = self.PrimOp.MakePipeWithDifferentSections(theSeqBases, + theLocations, thePath, + False, False, + True, IsGenerateGroups) + RaiseIfFailed("MakePipeWithDifferentSectionsBySteps", self.PrimOp) + + if IsGenerateGroups: + self._autoPublish(aList, theName, "pipe") + return aList + + self._autoPublish(aList[0], theName, "pipe") + return aList[0] + ## Create a shape by extrusion of the profile shape along # the path shape. The path shape can be a wire or an edge. # the several profiles can be specified in the several locations of path. diff --git a/src/GenerationGUI/GenerationGUI_PipeDlg.cxx b/src/GenerationGUI/GenerationGUI_PipeDlg.cxx index 33b43b09f..703fe5ede 100644 --- a/src/GenerationGUI/GenerationGUI_PipeDlg.cxx +++ b/src/GenerationGUI/GenerationGUI_PipeDlg.cxx @@ -50,13 +50,14 @@ //================================================================================= GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidget* parent, bool modal, Qt::WindowFlags fl) - : GEOMBase_Skeleton (theGeometryGUI, parent, modal, fl), - myGenGroupCheckGP (0), - myPrefixLblGP (0), - myPrefixEditGP (0), - myGenGroupCheckGMP (0), - myPrefixLblGMP (0), - myPrefixEditGMP (0) + : GEOMBase_Skeleton (theGeometryGUI, parent, modal, fl), + myGenGroupCheckGP (0), + myPrefixLblGP (0), + myPrefixEditGP (0), + myStepByStepCheckGMP (0), + myGenGroupCheckGMP (0), + myPrefixLblGMP (0), + myPrefixEditGMP (0) { QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPE"))); QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); @@ -124,15 +125,18 @@ GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidg // Add widgets for group generation QGridLayout *aLayoutGMP = (QGridLayout *)GroupMakePoints->GroupBox1->layout(); - myGenGroupCheckGMP = + myStepByStepCheckGMP = + new QCheckBox(tr("GEOM_STEP_BY_STEP"), GroupMakePoints->GroupBox1); + myGenGroupCheckGMP = new QCheckBox(tr("GEOM_GENERATE_GROUPS"), GroupMakePoints->GroupBox1); - myPrefixLblGMP = + myPrefixLblGMP = new QLabel (tr("GEOM_GROUP_NAME_PREFIX"), GroupMakePoints->GroupBox1); - myPrefixEditGMP = new QLineEdit(GroupMakePoints->GroupBox1); + myPrefixEditGMP = new QLineEdit(GroupMakePoints->GroupBox1); - aLayoutGMP->addWidget(myGenGroupCheckGMP, 8, 0, 1, 3); - aLayoutGMP->addWidget(myPrefixLblGMP, 9, 0, 1, 2); - aLayoutGMP->addWidget(myPrefixEditGMP, 9, 2); + aLayoutGMP->addWidget(myStepByStepCheckGMP, 8, 0, 1, 3); + aLayoutGMP->addWidget(myGenGroupCheckGMP, 9, 0, 1, 3); + aLayoutGMP->addWidget(myPrefixLblGMP, 10, 0, 1, 2); + aLayoutGMP->addWidget(myPrefixEditGMP, 10, 2); QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); @@ -201,8 +205,10 @@ void GenerationGUI_PipeDlg::Init() connect(GroupMakePoints->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupMakePoints->CheckBox1, SIGNAL(clicked()), this, SLOT(processPreview())); connect(GroupMakePoints->CheckBox2, SIGNAL(clicked()), this, SLOT(processPreview())); - connect(myGenGroupCheckGP, SIGNAL(toggled(bool)), this, SLOT(GenGroupClicked(bool))); - connect(myGenGroupCheckGMP, SIGNAL(toggled(bool)), this, SLOT(GenGroupClicked(bool))); + connect(myStepByStepCheckGMP, SIGNAL(clicked()), this, SLOT(processPreview())); + connect(myGenGroupCheckGP, SIGNAL(toggled(bool)), this, SLOT(GenGroupClicked(bool))); + connect(myGenGroupCheckGMP, SIGNAL(toggled(bool)), this, SLOT(GenGroupClicked(bool))); + connect(myStepByStepCheckGMP, SIGNAL(toggled(bool)), this, SLOT(StepByStepClicked(bool))); initName(tr("GEOM_PIPE")); resize(100,100); @@ -250,6 +256,7 @@ void GenerationGUI_PipeDlg::ConstructorsClicked( int constructorId ) GroupPoints->hide(); GroupMakePoints->show(); GroupMakePoints->PushButton1->click(); + myStepByStepCheckGMP->setChecked(false); myGenGroupCheckGMP->setChecked(false); resetGenGroup(myGenGroupCheckGMP, false, true); break; @@ -583,10 +590,16 @@ bool GenerationGUI_PipeDlg::execute (ObjectList& objects) myGenGroupCheckGMP->isChecked(); } + bool isWithContact = GroupMakePoints->CheckBox1->isEnabled() && + GroupMakePoints->CheckBox1->isChecked(); + bool isWithCorrection = GroupMakePoints->CheckBox2->isEnabled() && + GroupMakePoints->CheckBox2->isChecked(); + aList = anOper->MakePipeWithDifferentSections - (myBaseGO.in(), myLocationsGO.in(), myPath.get(), - GroupMakePoints->CheckBox1->isChecked(), - GroupMakePoints->CheckBox2->isChecked(), doGroups); + (myBaseGO.in(), myLocationsGO.in(), myPath.get(), + isWithContact, isWithCorrection, + myStepByStepCheckGMP->isChecked(), + doGroups); if (aList->length() > 0) { if (doGroups) { @@ -706,6 +719,16 @@ void GenerationGUI_PipeDlg::GenGroupClicked(bool isChecked) resetGenGroup((QCheckBox *)sender(), isChecked, false); } +//================================================================================= +// function : StepByStepClicked +// purpose : Slot to treat checking "Step-by-step generation" check box. +//================================================================================= +void GenerationGUI_PipeDlg::StepByStepClicked(bool isChecked) +{ + GroupMakePoints->CheckBox1->setEnabled(!isChecked); + GroupMakePoints->CheckBox2->setEnabled(!isChecked); +} + //================================================================================= // function : updateGenGroup // purpose : Update "Generate groups" widgets depending on the path. diff --git a/src/GenerationGUI/GenerationGUI_PipeDlg.h b/src/GenerationGUI/GenerationGUI_PipeDlg.h index 4b2d88efd..341fb18f4 100644 --- a/src/GenerationGUI/GenerationGUI_PipeDlg.h +++ b/src/GenerationGUI/GenerationGUI_PipeDlg.h @@ -81,6 +81,7 @@ private: QCheckBox *myGenGroupCheckGP; QLabel *myPrefixLblGP; QLineEdit *myPrefixEditGP; + QCheckBox *myStepByStepCheckGMP; QCheckBox *myGenGroupCheckGMP; QLabel *myPrefixLblGMP; QLineEdit *myPrefixEditGMP; @@ -95,6 +96,7 @@ private slots: void ConstructorsClicked( int ); void SelectionTypeButtonClicked(); void GenGroupClicked(bool); + void StepByStepClicked(bool); }; #endif // GENERATIONGUI_PIPEDLG_H -- 2.39.2