From 91ac59384838f07868fb2502582a116ce818880e Mon Sep 17 00:00:00 2001 From: dmv Date: Fri, 26 Dec 2008 08:46:48 +0000 Subject: [PATCH] 0019827: EDF 736 GEOM : Duplication of a object along an elliptic path --- .../gui/GEOM/images/transformation13.png | Bin 28287 -> 29512 bytes .../GEOM/input/modify_location_operation.doc | 10 +- .../input/tui_transformation_operations.doc | 2 +- idl/GEOM_Gen.idl | 4 +- idl/GEOM_Superv.idl | 3 +- src/DlgRef/DlgRef.cxx | 14 ++ src/DlgRef/DlgRef.h | 16 +++ src/DlgRef/DlgRef.pro | 1 + src/DlgRef/Makefile.am | 1 + src/GEOMGUI/GEOM_msg_en.ts | 4 + src/GEOMImpl/GEOMImpl_IPosition.hxx | 4 + .../GEOMImpl_ITransformOperations.cxx | 7 +- .../GEOMImpl_ITransformOperations.hxx | 3 +- src/GEOMImpl/GEOMImpl_PositionDriver.cxx | 124 ++++++++++++++---- src/GEOM_I/GEOM_ITransformOperations_i.cc | 5 +- src/GEOM_I/GEOM_ITransformOperations_i.hh | 3 +- src/GEOM_I_Superv/GEOM_Superv_i.cc | 5 +- src/GEOM_I_Superv/GEOM_Superv_i.hh | 3 +- src/GEOM_SWIG/GEOM_TestAll.py | 2 +- src/GEOM_SWIG/geompyDC.py | 6 +- .../TransformationGUI_PositionDlg.cxx | 22 +++- .../TransformationGUI_PositionDlg.h | 4 +- 22 files changed, 193 insertions(+), 50 deletions(-) diff --git a/doc/salome/gui/GEOM/images/transformation13.png b/doc/salome/gui/GEOM/images/transformation13.png index 71efd5599fa20c572bcf010e5e38adde478191ab..1ae0170df69de5e3c2f164f9a84d741fd775a05f 100644 GIT binary patch literal 29512 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
%@)a&2OLgRK>osHdb)o^s& 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 Unpublished edges checkbox allows to select subshape edges on the other objects. -\n Arguments: Name + one or several objects + Translation path. +\n Reverse Direction checkbox allows to REVERSE the direction of the object movement along its path. + +Arguments: Name + one or several objects + Translation path. \n Advanced option: \ref restore_presentation_parameters_page "Set presentation parameters and subshapes from arguments". - + \image html transformation13.png -\image html transformation14.png - \image html transformation12.png +\image html transformation14.png + \n TUI Command: geompy.MakePosition(theObject, theStartLCS, theEndLCS), where \em theObject is a shape, location of which is modified, \em theStartLCS is a location to move the shape from, \em diff --git a/doc/salome/gui/GEOM/input/tui_transformation_operations.doc b/doc/salome/gui/GEOM/input/tui_transformation_operations.doc index 8301afa6f..7fd356e7c 100644 --- a/doc/salome/gui/GEOM/input/tui_transformation_operations.doc +++ b/doc/salome/gui/GEOM/input/tui_transformation_operations.doc @@ -123,7 +123,7 @@ cs2 = geompy.MakeMarker(30,40,40, 1,0,0, 0,1,0) # modify the location of the given object position = geompy.MakePosition(cylinder, cs1, cs2) -position2 = geompy.PositionAlongPath(position, circle, 0.75, 1) +position2 = geompy.PositionAlongPath(position, circle, 0.75, 1, 1) # add objects in the study id_cs1 = geompy.addToStudy(cs1, "Coordinate system 1") diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 397012d34..2dc3540db 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -799,13 +799,15 @@ module GEOM * \param thePath Wire or Edge along that the object will be translated. * \param theDistance progress of Path (0 = actual location, 1 = end of path location). * \param theCopy is a true or false parameter. true is to create a copy, false to move the object. + * \param theCopy is a true or false parameter. true is to reverse direction, false is to move normal direction. * \return New GEOM_Object, containing the displaced shape. */ GEOM_Object PositionAlongPath (in GEOM_Object theObject, in GEOM_Object thePath, in double theDistance, - in boolean theCopy); + in boolean theCopy, + in boolean theReverse); /*! * Recompute the shape from its arguments. diff --git a/idl/GEOM_Superv.idl b/idl/GEOM_Superv.idl index 5b5605b61..94ca2a7d6 100644 --- a/idl/GEOM_Superv.idl +++ b/idl/GEOM_Superv.idl @@ -346,7 +346,8 @@ module GEOM GEOM_Object PositionAlongPath (in GEOM_Object theObject, in GEOM_Object thePath, in double theDistance, - in boolean theCopy); + in boolean theCopy, + in boolean theReverse); //-----------------------------------------------------------// // ShapesOperations // diff --git a/src/DlgRef/DlgRef.cxx b/src/DlgRef/DlgRef.cxx index f93df1ac2..997486d7a 100644 --- a/src/DlgRef/DlgRef.cxx +++ b/src/DlgRef/DlgRef.cxx @@ -687,6 +687,20 @@ void DlgRef_4Sel1Spin2Check::ShowRows( int fromRow, int toRow, bool toShow ) } } +////////////////////////////////////////// +// DlgRef_4Sel1Spin3Check +////////////////////////////////////////// + +DlgRef_4Sel1Spin3Check::DlgRef_4Sel1Spin3Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_4Sel1Spin3Check::~DlgRef_4Sel1Spin3Check() +{ +} + ////////////////////////////////////////// // DlgRef_6Sel ////////////////////////////////////////// diff --git a/src/DlgRef/DlgRef.h b/src/DlgRef/DlgRef.h index 4e677a321..21c1eb73b 100644 --- a/src/DlgRef/DlgRef.h +++ b/src/DlgRef/DlgRef.h @@ -746,6 +746,22 @@ public: void ShowRows( int, int, bool = true ); }; +////////////////////////////////////////// +// DlgRef_4Sel1Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_4Sel1Spin3Check_QTD.h" + +class DLGREF_EXPORT DlgRef_4Sel1Spin3Check : public QWidget, + public Ui::DlgRef_4Sel1Spin3Check_QTD +{ + Q_OBJECT + +public: + DlgRef_4Sel1Spin3Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_4Sel1Spin3Check(); +}; + ////////////////////////////////////////// // DlgRef_6Sel ////////////////////////////////////////// diff --git a/src/DlgRef/DlgRef.pro b/src/DlgRef/DlgRef.pro index f8f824056..4ba720ba7 100644 --- a/src/DlgRef/DlgRef.pro +++ b/src/DlgRef/DlgRef.pro @@ -57,6 +57,7 @@ HEADERS += DlgRef_3Spin_QTD.h HEADERS += DlgRef_3Spin1Check_QTD.h HEADERS += DlgRef_3Sel3Spin1Check_QTD.h HEADERS += DlgRef_4Sel1Spin2Check_QTD.h +HEADERS += DlgRef_4Sel1Spin3Check_QTD.h HEADERS += DlgRef_SpinBox.h HEADERS += DlgRef_1Sel1Spin.h HEADERS += DlgRef_1Sel2Spin.h diff --git a/src/DlgRef/Makefile.am b/src/DlgRef/Makefile.am index 46df04ce7..c48834cc7 100644 --- a/src/DlgRef/Makefile.am +++ b/src/DlgRef/Makefile.am @@ -82,6 +82,7 @@ UIC_FILES = \ ui_DlgRef_4Sel1List1Check_QTD.h \ ui_DlgRef_4Sel1List_QTD.h \ ui_DlgRef_4Sel1Spin2Check_QTD.h \ + ui_DlgRef_4Sel1Spin3Check_QTD.h \ ui_DlgRef_6Sel_QTD.h \ ui_DlgRef_Skeleton_QTD.h diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index af217b165..981368ec5 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -1304,6 +1304,10 @@ Please, select face, shell or solid and try again GEOM_REVERSE Reverse + + GEOM_REVERSE_DIRECTION + Reverse Direction + GEOM_REVERSE_PLANE Reverse the plane normal diff --git a/src/GEOMImpl/GEOMImpl_IPosition.hxx b/src/GEOMImpl/GEOMImpl_IPosition.hxx index b01b1115a..33e604f0e 100644 --- a/src/GEOMImpl/GEOMImpl_IPosition.hxx +++ b/src/GEOMImpl/GEOMImpl_IPosition.hxx @@ -27,6 +27,7 @@ #define POSITION_ARG_END_LCS 3 #define POSITION_ARG_PATH 5 #define POSITION_ARG_DISTANCE 6 +#define POSITION_ARG_REVERSE 7 class GEOMImpl_IPosition { @@ -56,6 +57,9 @@ class GEOMImpl_IPosition double GetDistance() { return _func->GetReal(POSITION_ARG_DISTANCE); } + void SetReverse(bool theReverse) { _func->SetReal(POSITION_ARG_REVERSE, theReverse); } + bool GetReverse() { return _func->GetReal(POSITION_ARG_REVERSE); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx index 84a0f4991..0721e9857 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx @@ -1341,7 +1341,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionShapeCopy //============================================================================= Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionAlongPath (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePath, - double theDistance, bool theCopy) + double theDistance, bool theCopy, bool theReverse) { SetErrorCode(KO); @@ -1370,6 +1370,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionAlongPath aTI.SetShape(anOriginal); aTI.SetPath(thePath->GetLastFunction()); aTI.SetDistance(theDistance); + aTI.SetReverse(theReverse); //Compute the position try { @@ -1390,13 +1391,13 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionAlongPath //Make a Python command if (theCopy) { GEOM::TPythonDump(aFunction) << aCopy << " = geompy.PositionAlongPath(" - << theObject << ", " << thePath << ", " << theDistance << ", " << theCopy << ")"; + << theObject << ", " << thePath << ", " << theDistance << ", " << theCopy << ", " << theReverse << ")"; SetErrorCode(OK); return aCopy; } GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.PositionAlongPath(" - << theObject << ", " << thePath << ", " << theDistance << ", " << theCopy << ")"; + << theObject << ", " << thePath << ", " << theDistance << ", " << theCopy << ", " << theReverse << ")"; SetErrorCode(OK); return theObject; diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx index 44830f68c..aafbde215 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx @@ -121,7 +121,8 @@ class GEOMImpl_ITransformOperations : public GEOM_IOperations Standard_EXPORT Handle(GEOM_Object) PositionAlongPath (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePath, double theDistance, - bool theCopy); + bool theCopy, + bool theReverse); Standard_EXPORT Handle(GEOM_Object) Rotate (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theAxis, diff --git a/src/GEOMImpl/GEOMImpl_PositionDriver.cxx b/src/GEOMImpl/GEOMImpl_PositionDriver.cxx index c9ddc2097..49e019ff0 100644 --- a/src/GEOMImpl/GEOMImpl_PositionDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PositionDriver.cxx @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,8 @@ #include #include #include +#include +#include #include #include @@ -145,6 +148,7 @@ Standard_Integer GEOMImpl_PositionDriver::Execute(TFunction_Logbook& log) const Handle(GEOM_Function) aRefShape = aCI.GetShape(); Handle(GEOM_Function) aPathShape = aCI.GetPath(); double aValue = aCI.GetDistance(); + bool aReversed = aCI.GetReverse(); TopoDS_Shape aShapeBase = aRefShape->GetValue(); TopoDS_Shape aPath = aPathShape->GetValue(); @@ -152,31 +156,70 @@ Standard_Integer GEOMImpl_PositionDriver::Execute(TFunction_Logbook& log) const if (aShapeBase.IsNull() || aPath.IsNull()) return 0; + //Get a Center Of Mass Of Base Object + GProp_GProps aSystem; + gp_Pnt aCenterMass; + if (aShapeBase.ShapeType() == TopAbs_VERTEX) { + aCenterMass = BRep_Tool::Pnt(TopoDS::Vertex(aShapeBase)); + } else if (aShapeBase.ShapeType() == TopAbs_EDGE || aShapeBase.ShapeType() == TopAbs_WIRE) { + BRepGProp::LinearProperties(aShapeBase, aSystem); + aCenterMass = aSystem.CentreOfMass(); + } else if (aShapeBase.ShapeType() == TopAbs_FACE || aShapeBase.ShapeType() == TopAbs_SHELL) { + BRepGProp::SurfaceProperties(aShapeBase, aSystem); + aCenterMass = aSystem.CentreOfMass(); + } else { + BRepGProp::VolumeProperties(aShapeBase, aSystem); + aCenterMass = aSystem.CentreOfMass(); + } + TopoDS_Shape aTrimmedPath; gp_Trsf aTrsf; Handle(Geom_Curve) aCurve; Standard_Real aFirst =0.,aLast=0.; Standard_Real aParam = 0.; Standard_Real aLength = 0.; + + gp_Pnt aPFirst, aPLast; - if ( aPath.ShapeType() == TopAbs_EDGE ) { + if ( aPath.ShapeType() == TopAbs_EDGE ) { // The Path is Edge TopoDS_Edge anEdge = TopoDS::Edge(aPath); - // Computation by Parameter + BRep_Tool::Range(anEdge,aFirst,aLast); aCurve = BRep_Tool::Curve(anEdge,aFirst,aLast); - aParam = aFirst + aValue*(aLast - aFirst); - } else if ( aPath.ShapeType() == TopAbs_WIRE ) { + if (aReversed) + aCurve = aCurve->Reversed(); + + aCurve->D0(aFirst, aPFirst); + aCurve->D0(aLast, aPLast); + + // Translate a CenterMass of Base Shape to the start of the path + if ( !aPFirst.IsEqual(aCenterMass, gp::Resolution()) ) { + gp_Trsf aCurTrsf; + aCurTrsf.SetTranslation(aCenterMass, aPFirst); + aTrsf.PreMultiply(aCurTrsf); + } + aParam = aFirst + aValue*(aLast - aFirst); // Calculate parameter + } else if ( aPath.ShapeType() == TopAbs_WIRE ) { // The path Shape is Wire + TopoDS_Wire aWire = TopoDS::Wire(aPath); + + // fix edges order + Handle(ShapeFix_Wire) aFixWire = new ShapeFix_Wire; + aFixWire->Load(aWire); + aFixWire->FixReorder(); + aWire = aFixWire->Wire(); + TopExp_Explorer ex; TopTools_SequenceOfShape Edges; Standard_Real nbEdges = 0.; - BRepTools_WireExplorer aWE (TopoDS::Wire(aPath)); - for (; aWE.More(); aWE.Next(), nbEdges++) + BRepTools_WireExplorer aWE (aWire); + for (; aWE.More(); aWE.Next(), nbEdges++) // Explore a Wire on Edges Edges.Append(aWE.Current()); Standard_Real aSummOfLen =0.; Standard_Real aCurLen =0.; GeomAdaptor_Curve aAdC; - for(int i=1; i<=Edges.Length(); i++) { + + for(int i=1; i<=Edges.Length(); i++) { // Calculate summary Lenght of edges TopoDS_Edge anEdge = TopoDS::Edge(Edges.Value(i)); BRep_Tool::Range(anEdge,aFirst,aLast); aCurve = BRep_Tool::Curve(anEdge,aFirst,aLast); @@ -185,29 +228,61 @@ Standard_Integer GEOMImpl_PositionDriver::Execute(TFunction_Logbook& log) const aSummOfLen += aCurLen; } + // Move BaseShape to the Start Of the Curve + TopoDS_Edge anEdge; + if (!aReversed) + anEdge = TopoDS::Edge(Edges.Value(1)); + else + anEdge = TopoDS::Edge(Edges.Value(Edges.Length())); + + BRep_Tool::Range(anEdge,aFirst,aLast); + aCurve = BRep_Tool::Curve(anEdge,aFirst,aLast); + aCurve->D0(aFirst, aPFirst); + aCurve->D0(aLast, aPLast); + if ( !aPFirst.IsEqual(aCenterMass, gp::Resolution()) ) { + gp_Trsf aCurTrsf; + if (aReversed && anEdge.Orientation() == TopAbs_FORWARD) + aPFirst = aPLast; + + aCurTrsf.SetTranslation(aCenterMass, aPFirst); + aTrsf.PreMultiply(aCurTrsf); + } + Standard_Real aWireLen = aSummOfLen*aValue; aSummOfLen = 0; for(int i=1; i<=Edges.Length(); i++) { - TopoDS_Edge anEdge = TopoDS::Edge(Edges.Value(i)); - BRep_Tool::Range(anEdge,aFirst,aLast); + TopoDS_Edge anEdge; + if (!aReversed) + anEdge = TopoDS::Edge(Edges.Value(i)); + else + anEdge = TopoDS::Edge(Edges.Value(Edges.Length() - i + 1)); + aCurve = BRep_Tool::Curve(anEdge,aFirst,aLast); + BRep_Tool::Range(anEdge,aFirst,aLast); + + if (!aReversed && anEdge.Orientation() == TopAbs_REVERSED) + aCurve = aCurve->Reversed(); + + if (aReversed && anEdge.Orientation() == TopAbs_FORWARD) + aCurve = aCurve->Reversed(); + aAdC.Load(aCurve,aFirst,aLast); - aCurLen = GCPnts_AbscissaPoint::Length(aAdC,aFirst,aLast); + aCurLen = GCPnts_AbscissaPoint::Length(aAdC,aFirst,aLast); - if ( aWireLen > (aSummOfLen + aCurLen) ) { - aSummOfLen += aCurLen; // Transform a Base object along this Edge + if ( aWireLen > (aSummOfLen + aCurLen) ) { // Transform a Base object along this Edge + aSummOfLen += aCurLen; gp_Pnt aP1, aP2; gp_Vec aStartVec1, aStartVec2, aDestVec1, aDestVec2; aCurve->D2(aFirst, aP1, aStartVec1, aStartVec2 ); aCurve->D2(aLast, aP2, aDestVec1, aDestVec2 ); gp_Trsf aCurTrsf; - if (aStartVec2.Magnitude() < gp::Resolution() || aDestVec2.Magnitude() < gp::Resolution()) // one of the second derivatives is null - aCurTrsf.SetTranslation(aP1, aP2); - else { + if (aStartVec2.Magnitude() > gp::Resolution() && aDestVec2.Magnitude() > gp::Resolution()) { gp_Ax3 aStartAx3(aP1, aStartVec1, aStartVec2); gp_Ax3 aDestAx3(aP2, aDestVec1, aDestVec2); aCurTrsf.SetDisplacement(aStartAx3, aDestAx3); - } + } else + aCurTrsf.SetTranslation(aP1, aP2); + aTrsf.PreMultiply(aCurTrsf); } else { @@ -221,21 +296,26 @@ Standard_Integer GEOMImpl_PositionDriver::Execute(TFunction_Logbook& log) const } else return 0; // Unknown Type + gp_Trsf aCurTrsf; gp_Pnt aP1, aP2; gp_Vec aStartVec1, aStartVec2, aDestVec1, aDestVec2; aCurve->D2(aFirst, aP1, aStartVec1, aStartVec2 ); aCurve->D2(aParam, aP2, aDestVec1, aDestVec2 ); - gp_Trsf aCurTrsf; - if (aStartVec2.Magnitude() < gp::Resolution() || aDestVec2.Magnitude() < gp::Resolution()) // one of the second derivatives is null - aCurTrsf.SetTranslation(aP1, aP2); - else { + if (aStartVec2.Magnitude() > gp::Resolution() && aDestVec2.Magnitude() > gp::Resolution()) { gp_Ax3 aStartAx3(aP1, aStartVec1, aStartVec2); gp_Ax3 aDestAx3(aP2, aDestVec1, aDestVec2); aCurTrsf.SetDisplacement(aStartAx3, aDestAx3); - } - + } else + aCurTrsf.SetTranslation(aP1, aP2); + aTrsf.PreMultiply(aCurTrsf); + + if ( !aPFirst.IsEqual(aCenterMass, gp::Resolution()) ) { + gp_Trsf aCurTrsf; + aCurTrsf.SetTranslation(aPFirst, aCenterMass); + aTrsf.PreMultiply(aCurTrsf); + } // Perform transformation BRepBuilderAPI_Transform aBRepTrsf (aShapeBase, aTrsf, Standard_False); diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.cc b/src/GEOM_I/GEOM_ITransformOperations_i.cc index 9715c0c4d..a66ae7970 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.cc +++ b/src/GEOM_I/GEOM_ITransformOperations_i.cc @@ -997,7 +997,8 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::PositionAlongPath (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr thePath, CORBA::Double theDistance, - CORBA::Boolean theCopy) + CORBA::Boolean theCopy, + CORBA::Boolean theReverse) { GEOM::GEOM_Object_var aGEOMObject; @@ -1021,7 +1022,7 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::PositionAlongPath //Perform the position Handle(GEOM_Object) anObject = - GetOperations()->PositionAlongPath(aBasicObject, aPathObject, theDistance, theCopy); + GetOperations()->PositionAlongPath(aBasicObject, aPathObject, theDistance, theCopy, theReverse); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.hh b/src/GEOM_I/GEOM_ITransformOperations_i.hh index 62dc08c9a..a366020dc 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.hh +++ b/src/GEOM_I/GEOM_ITransformOperations_i.hh @@ -144,7 +144,8 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i : GEOM::GEOM_Object_ptr PositionAlongPath (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr thePath, CORBA::Double theDistance, - CORBA::Boolean theCopy); + CORBA::Boolean theCopy, + CORBA::Boolean theReverse); GEOM::GEOM_Object_ptr RotateThreePoints (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr theCentPoint, diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 283910acf..196284c0c 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -1826,12 +1826,13 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::PositionShapeCopy (GEOM::GEOM_Object_ptr th GEOM::GEOM_Object_ptr GEOM_Superv_i::PositionAlongPath (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr thePath, CORBA::Double theDistance, - CORBA::Boolean theCopy) + CORBA::Boolean theCopy, + CORBA::Boolean theReverse) { beginService( " GEOM_Superv_i::PositionAlongPath" ); MESSAGE("GEOM_Superv_i::PositionAlongPath"); getTransfOp(); - GEOM::GEOM_Object_ptr anObj = myTransfOp->PositionAlongPath(theObject, thePath, theDistance, theCopy); + GEOM::GEOM_Object_ptr anObj = myTransfOp->PositionAlongPath(theObject, thePath, theDistance, theCopy, theReverse); endService( " GEOM_Superv_i::PositionAlongPath" ); return anObj; } diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh index ca3781a07..e803f8071 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.hh +++ b/src/GEOM_I_Superv/GEOM_Superv_i.hh @@ -422,7 +422,8 @@ public: GEOM::GEOM_Object_ptr PositionAlongPath (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr thePath, CORBA::Double theDistance, - CORBA::Boolean theCopy); + CORBA::Boolean theCopy, + CORBA::Boolean theReverse); //-----------------------------------------------------------// // ShapesOperations // diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index b852c52f5..f1b275ced 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -207,7 +207,7 @@ def TestAll (geompy, math): MirrorAxis = geompy.MakeMirrorByAxis(Box, Line1) # MirrorPnt = geompy.MakeMirrorByPoint(Box, p200) # Position = geompy.MakePosition(Box, cs1, cs2) #(3 GEOM_Object_ptr)->GEOM_Object_ptr - Position2 = geompy.PositionAlongPath(Box, Arc, 0.5, 1) #(2 GEOM_Object_ptr, 1 Double, 1 Bool)->GEOM_Object_ptr + Position2 = geompy.PositionAlongPath(Box, Arc, 0.5, 1, 0) #(2 GEOM_Object_ptr, 1 Double, 2 Bool)->GEOM_Object_ptr Offset = geompy.MakeOffset(Box, 10.) #(GEOM_Object_ptr, Double)->GEOM_Object_ptr Orientation = geompy.ChangeOrientation(Box) diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 341506dd1..f499d97ff 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -2247,12 +2247,14 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @param theObject The object to be displaced. # @param thePath Wire or Edge along that the object will be translated. # @param theDistance progress of Path (0 = start location, 1 = end of path location). + # @param theCopy is to create a copy objects if true. + # @param theReverse - 0 for usual direction, 1 to reverse path direction. # @return New GEOM_Object, containing the displaced shape. # # @ref tui_modify_location "Example" - def PositionAlongPath(self,theObject, thePath, theDistance, theCopy): + def PositionAlongPath(self,theObject, thePath, theDistance, theCopy, theReverse): # Example: see GEOM_TestAll.py - anObj = self.TrsfOp.PositionAlongPath(theObject, thePath, theDistance, theCopy) + anObj = self.TrsfOp.PositionAlongPath(theObject, thePath, theDistance, theCopy, theReverse) RaiseIfFailed("PositionAlongPath", self.TrsfOp) return anObj diff --git a/src/TransformationGUI/TransformationGUI_PositionDlg.cxx b/src/TransformationGUI/TransformationGUI_PositionDlg.cxx index 1515623ec..f64340c16 100644 --- a/src/TransformationGUI/TransformationGUI_PositionDlg.cxx +++ b/src/TransformationGUI/TransformationGUI_PositionDlg.cxx @@ -66,7 +66,7 @@ TransformationGUI_PositionDlg::TransformationGUI_PositionDlg mainFrame()->RadioButton2->setIcon(image1); mainFrame()->RadioButton3->setIcon(image2); - Group1 = new DlgRef_4Sel1Spin2Check(centralWidget()); + Group1 = new DlgRef_4Sel1Spin3Check(centralWidget()); Group1->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); Group1->TextLabel1->setText(tr("GEOM_OBJECTS")); Group1->TextLabel2->setText(tr("GEOM_START_LCS")); @@ -79,6 +79,7 @@ TransformationGUI_PositionDlg::TransformationGUI_PositionDlg Group1->PushButton5->setIcon(imageselect); Group1->CheckButton1->setText(tr("GEOM_CREATE_COPY")); Group1->CheckButton2->setText(tr("SELECT_UNPUBLISHED_EDGES")); + Group1->CheckButton3->setText(tr("GEOM_REVERSE_DIRECTION")); QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); @@ -122,7 +123,7 @@ void TransformationGUI_PositionDlg::Init() Group1->LineEdit5->setText(""); initSpinBox(Group1->SpinBox_DX, 0, 1, 0.05, 6); // VSR:TODO : DBL_DIGITS_DISPLAY - Group1->SpinBox_DX->setValue(1); + Group1->SpinBox_DX->setValue(0); Group1->CheckButton2->setEnabled(false); @@ -150,6 +151,7 @@ void TransformationGUI_PositionDlg::Init() connect(Group1->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); connect(Group1->CheckButton2, SIGNAL(toggled(bool)), this, SLOT(SelectionTypeButtonClicked())); + connect(Group1->CheckButton3, SIGNAL(toggled(bool)), this, SLOT(ValueChangedInSpinBox())); initName(tr("GEOM_POSITION")); @@ -192,6 +194,7 @@ void TransformationGUI_PositionDlg::ConstructorsClicked (int constructorId) Group1->PushButton1->click(); Group1->CheckButton2->hide(); + Group1->CheckButton3->hide(); } break; case 1: @@ -210,6 +213,7 @@ void TransformationGUI_PositionDlg::ConstructorsClicked (int constructorId) Group1->PushButton1->click(); Group1->CheckButton2->hide(); + Group1->CheckButton3->hide(); } break; case 2: @@ -232,6 +236,7 @@ void TransformationGUI_PositionDlg::ConstructorsClicked (int constructorId) Group1->PushButton1->click(); Group1->CheckButton2->show(); + Group1->CheckButton3->show(); } break; } @@ -333,6 +338,9 @@ void TransformationGUI_PositionDlg::SelectionIntoArgument() return; else myEditCurrentArgument->setText(aName); + + if (getConstructorId() == 2) + Group1->PushButton5->click(); } else if (myEditCurrentArgument == Group1->LineEdit2) { if (aSelList.Extent() != 1) @@ -363,10 +371,8 @@ void TransformationGUI_PositionDlg::SelectionIntoArgument() aName = GEOMBase::GetName(myEndLCS); myEditCurrentArgument->setText(aName); - if (!myEndLCS->_is_nil() && !myObjects.length() && getConstructorId() != 2) + if (!myEndLCS->_is_nil() && !myObjects.length()) Group1->PushButton1->click(); - else if (getConstructorId() == 2 && !myObjects.length()) - Group1->PushButton5->click(); } else if (myEditCurrentArgument == Group1->LineEdit5) { myPath = GEOM::GEOM_Object::_nil(); @@ -413,6 +419,9 @@ void TransformationGUI_PositionDlg::SelectionIntoArgument() myEditCurrentArgument->setText(aName); myPath = aSelectedObject; + + if (!myPath->_is_nil() && !myObjects.length()) + Group1->PushButton1->click(); } // clear selection @@ -631,9 +640,10 @@ bool TransformationGUI_PositionDlg::execute (ObjectList& objects) case 2: { double aDistance = Group1->SpinBox_DX->value(); + bool toReverse = Group1->CheckButton3->isChecked(); for (int i = 0; i < myObjects.length(); i++) { anObj = GEOM::GEOM_ITransformOperations::_narrow(getOperation())-> - PositionAlongPath(myObjects[i], myPath, aDistance, toCreateCopy); + PositionAlongPath(myObjects[i], myPath, aDistance, toCreateCopy, toReverse); if (!anObj->_is_nil()) objects.push_back(anObj._retn()); } diff --git a/src/TransformationGUI/TransformationGUI_PositionDlg.h b/src/TransformationGUI/TransformationGUI_PositionDlg.h index 9a18399d8..e306c52c5 100644 --- a/src/TransformationGUI/TransformationGUI_PositionDlg.h +++ b/src/TransformationGUI/TransformationGUI_PositionDlg.h @@ -28,7 +28,7 @@ #include -class DlgRef_4Sel1Spin2Check; +class DlgRef_4Sel1Spin3Check; //================================================================================= // class : TransformationGUI_PositionDlg @@ -64,7 +64,7 @@ private: // to initialize the first selection field with a selected object on the dialog creation bool myInitial; - DlgRef_4Sel1Spin2Check* Group1; + DlgRef_4Sel1Spin3Check* Group1; private slots: void ClickOnOk(); -- 2.39.2