From 731761d34b4a8bcf6fec68435b597ddd3d4c5cb2 Mon Sep 17 00:00:00 2001 From: eap Date: Tue, 21 Oct 2014 20:06:51 +0400 Subject: [PATCH] 22757: [EDF] Vertex on Edge --- .../examples/repairing_operations_ex10.py | 12 + doc/salome/gui/GEOM/images/divedgebypoint.png | Bin 0 -> 18671 bytes doc/salome/gui/GEOM/images/repair8.png | Bin 17969 -> 19410 bytes .../input/add_point_on_edge_operation.doc | 86 ++++--- idl/GEOM_Gen.idl | 17 +- resources/CMakeLists.txt | 1 + resources/pointonedgebypoint.png | Bin 0 -> 444 bytes src/GEOMGUI/GEOM_images.ts | 4 + src/GEOMGUI/GEOM_msg_en.ts | 8 + src/GEOMImpl/GEOMImpl_HealingDriver.cxx | 45 +++- src/GEOMImpl/GEOMImpl_IHealingOperations.cxx | 64 +++++ src/GEOMImpl/GEOMImpl_IHealingOperations.hxx | 10 +- src/GEOMImpl/GEOMImpl_Types.hxx | 9 +- src/GEOM_I/GEOM_IHealingOperations_i.cc | 34 +++ src/GEOM_I/GEOM_IHealingOperations_i.hh | 10 +- src/GEOM_SWIG/GEOM_TestHealing.py | 6 + src/GEOM_SWIG/geomBuilder.py | 43 +++- src/RepairGUI/RepairGUI_DivideEdgeDlg.cxx | 227 +++++++++++++++--- src/RepairGUI/RepairGUI_DivideEdgeDlg.h | 15 +- src/ShHealOper/ShHealOper_EdgeDivide.cxx | 85 +++++-- src/ShHealOper/ShHealOper_EdgeDivide.hxx | 13 +- 21 files changed, 566 insertions(+), 123 deletions(-) create mode 100644 doc/salome/gui/GEOM/images/divedgebypoint.png mode change 100755 => 100644 doc/salome/gui/GEOM/images/repair8.png create mode 100644 resources/pointonedgebypoint.png diff --git a/doc/salome/examples/repairing_operations_ex10.py b/doc/salome/examples/repairing_operations_ex10.py index 898991b4e..c2dbc160f 100644 --- a/doc/salome/examples/repairing_operations_ex10.py +++ b/doc/salome/examples/repairing_operations_ex10.py @@ -6,6 +6,8 @@ import GEOM from salome.geom import geomBuilder geompy = geomBuilder.New(salome.myStudy) +# Variant 1: using DivideEdge() + # create vertices p1 = geompy.MakeVertex(0,0,50) p2 = geompy.MakeVertex(60,0,50) @@ -27,4 +29,14 @@ edge_points = geompy.SubShapeAllSortedCentres(divide, geompy.ShapeType["VERTEX"] for point in edge_points: geompy.addToStudyInFather(divide, point, "Edge's point after divide") + +# Variant 2: using DivideEdgeByPoint() + +box = geompy.MakeBox(0,0,0, 10,10,10, theName="box") +p = geompy.MakeVertex( 3, -2, 1, theName="point to project" ) +edge = geompy.GetEdgeNearPoint( box, p, theName="edge to split") + +div = geompy.DivideEdgeByPoint( box, edge, p, theName="box (edge divided)") + + salome.sg.updateObjBrowser(1) diff --git a/doc/salome/gui/GEOM/images/divedgebypoint.png b/doc/salome/gui/GEOM/images/divedgebypoint.png new file mode 100644 index 0000000000000000000000000000000000000000..cb80833cdf8a5f33b4b3e336c49d07aeb57a5a1b GIT binary patch literal 18671 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 HEcAZ>h3FDc literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/repair8.png b/doc/salome/gui/GEOM/images/repair8.png old mode 100755 new mode 100644 index d7654461b78ca10fa0290c75147b75f925e3416b..5c30a97603cb9c2924d1071a9427888f5340fd37 GIT binary patch literal 19410 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 Point on Edge in the Main Menu select Repair - > Add Point on Edge. -\n This operation splits an edge in two new edges in accordance with the -specified mode (by length or by parameter) and a value specifying the -position of the point on edge (for example val =0.5; mode = -by length). This operation is available in OCC Viewer only. - -\n The \b Result will be a \b GEOM_Object. - -\n TUI Command: geompy.DivideEdge(Shape, EdgeID, Value, -IsByParameter) -- \em Shape is a shape which contains an edge to be divided -- \em EdgeID is the ID of the edge to be divided, if it is = -1, -then \em Shape should be an edge itself -- \em Value is a value of parameter on edge or length parameter, -depending on \em IsByParameter. -- \em IsByParameter is a boolean flag, specifying operation mode: - - \c True: \em Value is treated as a curve parameter [0..1] - - \c False: \em Value is treated as a length parameter [0..1] - -Arguments: Name + 1 Edge + 1 Value setting the position of -the point according to one of the selected modes. - -The difference between "by parameter" and "by length" modes becomes -apparent on the edges with irregular parametrization (for example, -b-splines which usually have irregular density by the length). -For example, value 0.5 "by length" on such edge will produce the point -in the middle of this edge (equidistant from both its ends); the same -0.5 value "by parameter" will result in the point situated closer to -one of the ends (depending on the actual parametrization). - -\image html repair8.png +This operation splits an edge in two new edges. +This operation is available in OCC Viewer only. + +The \b Result will be a \b GEOM_Object. + +\n Location of a new vertex on a selected edge can be defined two ways: +
    +
  1. We can specify a position (ranging from 0.0 to 1.0) of the + vertex on the selected edge either by length or by parameter. +

    + TUI Command: geompy.DivideEdge(Shape, EdgeID, Value, + IsByParameter) +

      +
    • \em Shape is a shape which contains an edge to be divided
    • +
    • \em EdgeID is the ID of the edge to be divided, if it is = -1, + then \em Shape should be an edge itself.
    • +
    • \em Value is a value of parameter on edge or length parameter, + depending on \em IsByParameter.
    • +
    • \em IsByParameter is a boolean flag, specifying operation mode: + - \c True: \em Value is treated as a curve parameter [0..1] + - \c False: \em Value is treated as a length parameter [0..1]
    • +
    + \b Arguments: Name + 1 Edge + 1 Value setting the position of + the point according to one of the selected modes. + + The difference between "by parameter" and "by length" modes becomes + apparent on the edges with irregular parametrization (for example, + b-splines which usually have irregular density by the length). + For example, value 0.5 "by length" on such edge will produce the point + in the middle of this edge (equidistant from both its ends); the same + 0.5 value "by parameter" will result in the point situated closer to + one of the ends (depending on the actual parametrization). + + \image html repair8.png + \n\n +
  2. +
  3. We can select a point that will be projected to the selected + edge to find the location of the new vertex. +

    + TUI Command: geompy.DivideEdgeByPoint(Shape, Edge, Point) +

      +
    • \em Shape is a shape which contains an edge to be divided
    • +
    • \em Edge is an edge to be divided (or it's ID, if it is = -1, + then \em Shape should be an edge itself).
    • +
    • \em Point is a point to project to \a Edge.
    • +
    + \b Arguments: Name + 1 Edge + 1 Point. + + \image html divedgebypoint.png + +
  4. +
\n Example: \image html image167.png "The initial edge" -\image html image168.png "The edge split in two segments" +\image html image168.png "The edge split in two segments" -Our TUI Scripts provide you with useful examples of the use of +Our TUI Scripts provide you with useful examples of the use of \ref tui_add_point_on_edge "Repairing Operations". */ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 84d441015..0d65fd8f8 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -3654,7 +3654,7 @@ module GEOM GEOM_Object RemoveInternalFaces (in ListOfGO theSolids); /*! - * \brief Addition of a point to a given edge object. + * \brief Addition of a point to a given edge of \a theObject. * \param theObject Shape to be processed. * \param theEdgeIndex Index of edge to be divided within theObject's shape, * if -1, then theObject itself is the edge. @@ -3662,11 +3662,24 @@ module GEOM * depending on \a isByParameter. * \param isByParameter If TRUE : \a theValue is treated as a curve parameter [0..1], * if FALSE : \a theValue is treated as a length parameter [0..1] - * \return New GEOM_Object, containing processed shape. + * \return New GEOM_Object, containing the processed shape. */ GEOM_Object DivideEdge (in GEOM_Object theObject, in short theEdgeIndex, in double theValue, in boolean isByParameter); + /*! + * \brief Addition of a point to a given edge of \a theObject by projecting + * another point to the given edge. + * \param theObject Shape to be processed. + * \param theEdgeIndex Index of edge to be divided within theObject's shape, + * if -1, then theObject itself is the edge. + * \param thePoint Point to project to theEdgeIndex-th edge. + * \return New GEOM_Object, containing the processed shape. + */ + GEOM_Object DivideEdgeByPoint (in GEOM_Object theObject, + in short theEdgeIndex, + in GEOM_Object thePoint); + /*! * \brief Suppress the vertices in the wire in case if adjacent edges are C1 continuous. * \param theWire Wire to minimize the number of C1 continuous edges in. diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index e3afdf6cb..1dd296155 100755 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -145,6 +145,7 @@ SET( _res_files planeworkingorigin.png point2.png pointonedge.png + pointonedgebypoint.png pointonface.png point_line_intersection.png polyline.png diff --git a/resources/pointonedgebypoint.png b/resources/pointonedgebypoint.png new file mode 100644 index 0000000000000000000000000000000000000000..2068517112488b6ff705fb9e4c55f7f99954cf33 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~wj^(N7l!{J zxM1({$v_d#0*}aI1_o|n5N2eUHAey{$X?><>&kwQOO#Jp#c}a9PoOC_o-U3d7N^fn z-tT?bLFBl-rr?`v58JM3-h31EN@>RqHQurduD_l~oVc%a&dEcJJ^X)%1;@(?iVK~Y zbdNj@JtvXf{PlSA<9oZS@4v6TzuWppZuOpdp}C)|cdJ;gE8nQS@S@wzpLf@Olx=OB z|2&w%{`~X0dFO9y+`Z*|{A=E~o6gJ?x1PI(|0(|+-RgE&xo)`z7qiUu-;;n8^MM?t z?n4O-GOw0I*9Ge2$)B*YiWFgs<@9ezTo|$^ruUK4N{J1x4;SvW;9~Ya{KY4B=Hsf? zGmHm*{bOw?Eow2gtICON_DLG_DIVIDE_EDGE pointonedge.png + + ICON_DLG_DIVIDE_EDGE_BY_PNT + pointonedgebypoint.png + ICON_DLG_ELLIPSE_PV ellipsepointvector.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 3a1336069..1dcc33e19 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -38,6 +38,14 @@ Do you still want to delete these objects? DEVIDE_EDGE_NEW_OBJECT_NAME NewObject + + DEVIDE_EDGE_BAD_PROJ_MSG + Projection outside the edge + + + DEVIDE_EDGE_BY_PROJ_POINT + Point to project + ERROR_SHAPE_TYPE Object of incorrect type selected! diff --git a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx index 5cb3b922c..48bca4095 100644 --- a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx @@ -145,6 +145,7 @@ Standard_Integer GEOMImpl_HealingDriver::Execute(TFunction_Logbook& log) const RemoveInternalFaces(&HI, anOriginalShape, aShape); break; case DIVIDE_EDGE: + case DIVIDE_EDGE_BY_POINT: AddPointOnEdge(&HI, anOriginalShape, aShape); break; case CHANGE_ORIENTATION: @@ -533,26 +534,44 @@ GEOMImpl_HealingDriver::RemoveInternalFaces (GEOMImpl_IHealing* theHI, //function : AddPointOnEdge //purpose : //======================================================================= -Standard_Boolean GEOMImpl_HealingDriver::AddPointOnEdge (GEOMImpl_IHealing* theHI, +Standard_Boolean GEOMImpl_HealingDriver::AddPointOnEdge (GEOMImpl_IHealing* theHI, const TopoDS_Shape& theOriginalShape, - TopoDS_Shape& theOutShape) const + TopoDS_Shape& theOutShape) const { Standard_Boolean isByParameter = theHI->GetIsByParameter(); - Standard_Integer anIndex = theHI->GetIndex(); - Standard_Real aValue = theHI->GetDevideEdgeValue(); + Standard_Integer anIndex = theHI->GetIndex(); + Standard_Real aValue = theHI->GetDevideEdgeValue(); + TopoDS_Shape pointToProject; + { + Handle(TColStd_HSequenceOfTransient) funs = theHI->GetShapes(); + if ( !funs.IsNull() && funs->Length() > 0 ) { + Handle(GEOM_Function) fun = Handle(GEOM_Function)::DownCast( funs->Value(1) ); + if ( !fun.IsNull() ) + pointToProject = fun->GetValue(); + } + } + ShHealOper_EdgeDivide aHealer (theOriginalShape); Standard_Boolean aResult = Standard_False; - if (anIndex == -1) { // apply algorythm for the whole shape which is EDGE - if (theOriginalShape.ShapeType() == TopAbs_EDGE) - aResult = aHealer.Perform(TopoDS::Edge(theOriginalShape), aValue, isByParameter); + if (anIndex == -1) { // apply algorithm for the whole shape which is EDGE + if (theOriginalShape.ShapeType() == TopAbs_EDGE) { + if ( pointToProject.IsNull() ) + aResult = aHealer.Perform(TopoDS::Edge(theOriginalShape), aValue, isByParameter); + else + aResult = aHealer.Perform(TopoDS::Edge(theOriginalShape), pointToProject); + } } else { TopTools_IndexedMapOfShape aShapes; TopExp::MapShapes(theOriginalShape, aShapes); TopoDS_Shape aEdgeShape = aShapes.FindKey(anIndex); - if (aEdgeShape.ShapeType() == TopAbs_EDGE) - aResult = aHealer.Perform(TopoDS::Edge(aEdgeShape), aValue, isByParameter); + if (aEdgeShape.ShapeType() == TopAbs_EDGE) { + if ( pointToProject.IsNull() ) + aResult = aHealer.Perform(TopoDS::Edge(aEdgeShape), aValue, isByParameter); + else + aResult = aHealer.Perform(TopoDS::Edge(aEdgeShape), pointToProject); + } } if (aResult) @@ -946,6 +965,14 @@ GetCreationInformation(std::string& theOperationName, AddParam( theParams, "By parameter", aCI.GetIsByParameter() ); AddParam( theParams, "Value", aCI.GetDevideEdgeValue() ); break; + case DIVIDE_EDGE_BY_POINT: + theOperationName = "POINT_ON_EDGE"; + if ( aCI.GetIndex() > 0 ) + AddParam( theParams, "Edge", "#" ) << aCI.GetIndex() << " of " << aCI.GetOriginal(); + else + AddParam( theParams, "Edge", aCI.GetOriginal() ); + AddParam( theParams, "Point", aCI.GetShapes() ); + break; case CHANGE_ORIENTATION: theOperationName = "CHANGE_ORIENTATION"; AddParam( theParams, "Selected shape", aCI.GetOriginal() ); diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx index ab4975aa2..3a2b13305 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx @@ -764,6 +764,70 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::DivideEdge (Handle(GEOM_Object) return aNewObject; } +//============================================================================= +/*! + * DivideEdgeByPoint + */ +//============================================================================= +Handle(GEOM_Object) +GEOMImpl_IHealingOperations::DivideEdgeByPoint (Handle(GEOM_Object) theObject, + int theIndex, + Handle(GEOM_Object) thePoint) +{ + // set error code, check parameters + SetErrorCode(KO); + + if (theObject.IsNull() || thePoint.IsNull()) + return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + Handle(GEOM_Function) aPointFunc = thePoint->GetLastFunction(); + if (aLastFunction.IsNull() || aPointFunc.IsNull()) + return NULL; //There is no function which creates an object to be processed + + // Add a new object + Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY ); + + //Add the function + aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), DIVIDE_EDGE_BY_POINT); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // prepare "data container" class IHealing + GEOMImpl_IHealing HI(aFunction); + HI.SetIndex( theIndex ); + HI.SetOriginal( aLastFunction ); + + Handle(TColStd_HSequenceOfTransient) funSeq = new TColStd_HSequenceOfTransient; + funSeq->Append( aPointFunc ); + HI.SetShapes( funSeq ); + + //Compute the translation + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Healing driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) + << aNewObject << " = geompy.DivideEdgeByPoint(" << theObject + << ", " << theIndex << ", " << thePoint << ")"; + + SetErrorCode(OK); + return aNewObject; +} + //============================================================================= /*! * FuseCollinearEdgesWithinWire diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx index f8b17b371..e2af51e10 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx @@ -77,9 +77,13 @@ class GEOMImpl_IHealingOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) RemoveInternalFaces (std::list< Handle(GEOM_Object)> & theSolids); Standard_EXPORT Handle(GEOM_Object) DivideEdge( Handle(GEOM_Object) theObject, - int theIndex, - double theValue, - bool isByParameter ); + int theIndex, + double theValue, + bool isByParameter ); + + Standard_EXPORT Handle(GEOM_Object) DivideEdgeByPoint( Handle(GEOM_Object) theObject, + int theIndex, + Handle(GEOM_Object) thePoint ); Standard_EXPORT Handle(GEOM_Object) FuseCollinearEdgesWithinWire (Handle(GEOM_Object) theWire, diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 419e10160..720ce5e6e 100644 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -203,10 +203,10 @@ #define DISK_THREE_PNT 2 #define DISK_R 3 -#define CYLINDER_R_H 1 -#define CYLINDER_PNT_VEC_R_H 2 -#define CYLINDER_R_H_A 3 -#define CYLINDER_PNT_VEC_R_H_A 4 +#define CYLINDER_R_H 1 +#define CYLINDER_PNT_VEC_R_H 2 +#define CYLINDER_R_H_A 3 +#define CYLINDER_PNT_VEC_R_H_A 4 #define CONE_R1_R2_H 1 #define CONE_PNT_VEC_R1_R2_H 2 @@ -317,6 +317,7 @@ #define FUSE_COLLINEAR_EDGES 10 #define SEWING_NON_MANIFOLD 11 #define REMOVE_INTERNAL_FACES 12 +#define DIVIDE_EDGE_BY_POINT 13 #define BASIC_FILLING 1 diff --git a/src/GEOM_I/GEOM_IHealingOperations_i.cc b/src/GEOM_I/GEOM_IHealingOperations_i.cc index d286fcf36..e951e55c9 100644 --- a/src/GEOM_I/GEOM_IHealingOperations_i.cc +++ b/src/GEOM_I/GEOM_IHealingOperations_i.cc @@ -449,6 +449,40 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::DivideEdge (GEOM::GEOM_Object_p return GetObject(aNewObject); } +//============================================================================= +/*! + * DivideEdgeByPoint + */ +//============================================================================= +GEOM::GEOM_Object_ptr +GEOM_IHealingOperations_i::DivideEdgeByPoint (GEOM::GEOM_Object_ptr theObject, + CORBA::Short theIndex, + GEOM::GEOM_Object_ptr thePoint) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Get the object itself + Handle(GEOM_Object) anObject = GetObjectImpl(theObject); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Get the point + Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint); + if (aPoint.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = + GetOperations()->DivideEdgeByPoint( anObject, theIndex, aPoint ); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +} + //============================================================================= /*! * FuseCollinearEdgesWithinWire diff --git a/src/GEOM_I/GEOM_IHealingOperations_i.hh b/src/GEOM_I/GEOM_IHealingOperations_i.hh index 853187139..8ca4b277c 100644 --- a/src/GEOM_I/GEOM_IHealingOperations_i.hh +++ b/src/GEOM_I/GEOM_IHealingOperations_i.hh @@ -81,9 +81,13 @@ class GEOM_I_EXPORT GEOM_IHealingOperations_i : GEOM::GEOM_Object_ptr RemoveInternalFaces (const GEOM::ListOfGO& theSolids); GEOM::GEOM_Object_ptr DivideEdge (GEOM::GEOM_Object_ptr theObject, - CORBA::Short theIndex, - CORBA::Double theValue, - CORBA::Boolean isByParameter); + CORBA::Short theIndex, + CORBA::Double theValue, + CORBA::Boolean isByParameter); + + GEOM::GEOM_Object_ptr DivideEdgeByPoint (GEOM::GEOM_Object_ptr theObject, + CORBA::Short theIndex, + GEOM::GEOM_Object_ptr thePoint); GEOM::GEOM_Object_ptr FuseCollinearEdgesWithinWire (GEOM::GEOM_Object_ptr theWire, const GEOM::ListOfGO& theVertices); diff --git a/src/GEOM_SWIG/GEOM_TestHealing.py b/src/GEOM_SWIG/GEOM_TestHealing.py index 7d399a252..1df42aeef 100644 --- a/src/GEOM_SWIG/GEOM_TestHealing.py +++ b/src/GEOM_SWIG/GEOM_TestHealing.py @@ -323,6 +323,12 @@ def TestDivideEdge (geompy): Id_Box = geompy.addToStudy(Box, "Box") Id_Divide = geompy.addToStudy(Divide, "Box with Divided Edge") + # using geompy.DivideEdgeByPoint() + p = geompy.MakeVertex( 30, -5, 10, theName="Point to project" ) + edge = geompy.GetEdgeNearPoint( Box, p, theName="Edge to split") + div = geompy.DivideEdgeByPoint( Box, edge, p, theName="Box (edge divided)") + assert geompy.NumberOfEdges( Box ) == geompy.NumberOfEdges( div ) - 1 + def TestFuseEdges (geompy): # create vertices diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index a0926791c..5a0aa557d 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -6590,6 +6590,45 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): self._autoPublish(anObj, theName, "divideEdge") return anObj + ## Addition of a point to a given edge of \a theObject by projecting + # another point to the given edge. + # @param theObject Shape to be processed. + # @param theEdgeIndex Index of edge to be divided within theObject's shape, + # if -1, then theObject itself is the edge. + # @param thePoint Point to project to theEdgeIndex-th edge. + # @param theName Object name; when specified, this parameter is used + # for result publication in the study. Otherwise, if automatic + # publication is switched on, default value is used for result name. + # + # @return New GEOM.GEOM_Object, containing processed shape. + # + # @ref tui_add_point_on_edge "Example" + @ManageTransactions("HealOp") + def DivideEdgeByPoint(self, theObject, theEdgeIndex, thePoint, theName=None): + """ + Addition of a point to a given edge of \a theObject by projecting + another point to the given edge. + + Parameters: + theObject Shape to be processed. + theEdgeIndex The edge or its index to be divided within theObject's shape, + if -1, then theObject itself is the edge. + thePoint Point to project to theEdgeIndex-th edge. + theName Object name; when specified, this parameter is used + for result publication in the study. Otherwise, if automatic + publication is switched on, default value is used for result name. + + Returns: + New GEOM.GEOM_Object, containing processed shape. + """ + # Example: see GEOM_TestHealing.py + if isinstance( theEdgeIndex, GEOM._objref_GEOM_Object ): + theEdgeIndex = self.GetSubShapeID( theObject, theEdgeIndex ) + anObj = self.HealOp.DivideEdgeByPoint(theObject, theEdgeIndex, thePoint) + RaiseIfFailed("DivideEdgeByPoint", self.HealOp) + self._autoPublish(anObj, theName, "divideEdge") + return anObj + ## Suppress the vertices in the wire in case if adjacent edges are C1 continuous. # @param theWire Wire to minimize the number of C1 continuous edges in. # @param theVertices A list of vertices to suppress. If the list @@ -9688,7 +9727,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): ## Perform an Archimde operation on the given shape with given parameters. # The object presenting the resulting face is returned. # @param theShape Shape to be put in water. - # @param theWeight Weight og the shape. + # @param theWeight Weight of the shape. # @param theWaterDensity Density of the water. # @param theMeshDeflection Deflection of the mesh, using to compute the section. # @param theName Object name; when specified, this parameter is used @@ -9707,7 +9746,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): Parameters: theShape Shape to be put in water. - theWeight Weight og the shape. + theWeight Weight of the shape. theWaterDensity Density of the water. theMeshDeflection Deflection of the mesh, using to compute the section. theName Object name; when specified, this parameter is used diff --git a/src/RepairGUI/RepairGUI_DivideEdgeDlg.cxx b/src/RepairGUI/RepairGUI_DivideEdgeDlg.cxx index 19e10b070..62715108b 100644 --- a/src/RepairGUI/RepairGUI_DivideEdgeDlg.cxx +++ b/src/RepairGUI/RepairGUI_DivideEdgeDlg.cxx @@ -38,16 +38,23 @@ #include -#include +#include +#include +#include +#include #include -#include -#include +#include +#include #include -#include -#include +#include #include -#include -#include +#include +#include +#include +#include +#include + +enum { BY_PARAM, BY_POINT_PROJ }; //================================================================================= // class : RepairGUI_DivideEdgeDlg() @@ -61,6 +68,7 @@ RepairGUI_DivideEdgeDlg::RepairGUI_DivideEdgeDlg( GeometryGUI* theGeometryGUI, Q : GEOMBase_Skeleton( theGeometryGUI, parent, modal ) { QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_DIVIDE_EDGE" ) ) ); + QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_DIVIDE_EDGE_BY_PNT" ) ) ); QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); setWindowTitle( tr( "GEOM_DIVIDE_EDGE_TITLE" ) ); @@ -68,16 +76,18 @@ RepairGUI_DivideEdgeDlg::RepairGUI_DivideEdgeDlg( GeometryGUI* theGeometryGUI, Q /***************************************************************/ mainFrame()->GroupConstructors->setTitle(tr("GEOM_DIVIDE_EDGE_TITLE")); mainFrame()->RadioButton1->setIcon( image0 ); - mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose ); - mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton2->setIcon( image2 ); mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); mainFrame()->RadioButton3->close(); - GroupPoints = new DlgRef_1SelExt( centralWidget() ); + GroupPoints = new DlgRef_2SelExt( centralWidget() ); GroupPoints->GroupBox1->setTitle( tr( "GEOM_ADD_POINT" ) ); GroupPoints->TextLabel1->setText( tr( "GEOM_EDGE" ) ); GroupPoints->PushButton1->setIcon( image1 ); GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->TextLabel2->setText( tr( "DEVIDE_EDGE_BY_PROJ_POINT" ) ); + GroupPoints->PushButton2->setIcon( image1 ); + GroupPoints->LineEdit2->setReadOnly( true ); QRadioButton* rb1 = new QRadioButton( tr( "GEOM_BY_PARAMETER" ), GroupPoints->Box ); QRadioButton* rb2 = new QRadioButton( tr( "GEOM_BY_LENGTH" ), GroupPoints->Box ); @@ -90,13 +100,13 @@ RepairGUI_DivideEdgeDlg::RepairGUI_DivideEdgeDlg( GeometryGUI* theGeometryGUI, Q myValEdt = new SalomeApp_DoubleSpinBox( GroupPoints->Box ); initSpinBox( myValEdt, 0., 1., 0.1, "parametric_precision" ); myValEdt->setValue( 0.5 ); - QLabel* aLbl1 = new QLabel( tr( "GEOM_VALUE" ), GroupPoints->Box ); + myValLbl = new QLabel( tr( "GEOM_VALUE" ), GroupPoints->Box ); QGridLayout* l = new QGridLayout( GroupPoints->Box ); l->setMargin( 0 ); l->setSpacing( 6 ); l->addWidget( rb1, 0, 0, 1, 2 ); l->addWidget( rb2, 1, 0, 1, 2 ); - l->addWidget( aLbl1, 2, 0 ); + l->addWidget( myValLbl, 2, 0 ); l->addWidget( myValEdt, 2, 1 ); QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); @@ -110,6 +120,29 @@ RepairGUI_DivideEdgeDlg::RepairGUI_DivideEdgeDlg( GeometryGUI* theGeometryGUI, Q Init(); } +//======================================================================= +//function : ConstructorsClicked +//purpose : hide/show widgets depending on a selected constructor +//======================================================================= +void RepairGUI_DivideEdgeDlg::ConstructorsClicked( int constructorId ) +{ + myIsParameterGr->button( 0 )->setShown( constructorId == BY_PARAM ); + myIsParameterGr->button( 1 )->setShown( constructorId == BY_PARAM ); + myValEdt ->setShown( constructorId == BY_PARAM ); + myValLbl ->setShown( constructorId == BY_PARAM ); + GroupPoints->TextLabel2 ->setShown( constructorId == BY_POINT_PROJ ); + GroupPoints->PushButton2 ->setShown( constructorId == BY_POINT_PROJ ); + GroupPoints->LineEdit2 ->setShown( constructorId == BY_POINT_PROJ ); + + initSelection(); + + if ( constructorId == BY_PARAM && + !GroupPoints->PushButton1->isDown() ) + GroupPoints->PushButton1->click(); + + displayPreview(); +} + //================================================================================= // function : ~RepairGUI_DivideEdgeDlg() // purpose : Destroys the object and frees any allocated resources @@ -128,25 +161,31 @@ void RepairGUI_DivideEdgeDlg::Init() myEditCurrentArgument = GroupPoints->LineEdit1; myObject = GEOM::GEOM_Object::_nil(); - myIndex = -1; + myPoint.nullify(); + myIndex = -1; + myProjectionOK = false; //myGeomGUI->SetState( 0 ); - initSelection(); /* signals and slots connections */ connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); + connect( myValEdt, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox() ) ); connect( GroupPoints->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); connect( GroupPoints->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); + connect( GroupPoints->PushButton2, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + connect( GroupPoints->LineEdit2, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); initName( tr( "DEVIDE_EDGE_NEW_OBJECT_NAME" ) ); resize(100,100); + ConstructorsClicked( BY_PARAM ); SelectionIntoArgument(); } @@ -165,6 +204,7 @@ void RepairGUI_DivideEdgeDlg::ValueChangedInSpinBox() //================================================================================= void RepairGUI_DivideEdgeDlg::displayPreview() { + myProjectionOK = false; erasePreview(); if ( myObject->_is_nil() ) return; @@ -173,7 +213,7 @@ void RepairGUI_DivideEdgeDlg::displayPreview() gp_Pnt aPnt; GEOMBase::GetShape( myObject, aShape, TopAbs_SHAPE ); - if ( myIndex != -1) { + if ( myIndex != -1 ) { TopTools_IndexedMapOfShape aShapes; TopExp::MapShapes(aShape, aShapes); aShape = aShapes.FindKey(myIndex); @@ -182,15 +222,55 @@ void RepairGUI_DivideEdgeDlg::displayPreview() if (aShape.ShapeType() == TopAbs_EDGE) { Standard_Real aFP, aLP, aP; Handle(Geom_Curve) aCurve = BRep_Tool::Curve(TopoDS::Edge(aShape), aFP, aLP); - aP = aFP + (aLP - aFP) * myValEdt->value(); - aPnt = aCurve->Value(aP); - BRepBuilderAPI_MakeVertex mkVertex (aPnt); - aShape = mkVertex.Shape(); + if ( aCurve.IsNull() ) return; + + if ( getConstructorId() == BY_PARAM ) + { + aP = aFP + (aLP - aFP) * myValEdt->value(); + aPnt = aCurve->Value(aP); + BRepBuilderAPI_MakeVertex mkVertex (aPnt); + aShape = mkVertex.Shape(); + } + else if ( getConstructorId() == BY_POINT_PROJ && myPoint ) + { + TopoDS_Shape aPoints; + GEOMBase::GetShape( myPoint.get(), aPoints, TopAbs_SHAPE ); + + BRep_Builder builder; + TopoDS_Compound compoundOfVV; + builder.MakeCompound(compoundOfVV); + aShape = compoundOfVV; + + GeomAPI_ProjectPointOnCurve aProjector; + aProjector.Init( aCurve, aFP, aLP ); + + TopTools_MapOfShape vMap; + TopExp_Explorer vertex( aPoints, TopAbs_VERTEX ); + for ( ; vertex.More(); vertex.Next() ) + { + if ( !vMap.Add( vertex.Current() )) continue; + gp_Pnt p = BRep_Tool::Pnt( TopoDS::Vertex( vertex.Current() )); + aProjector.Perform( p ); + if ( aProjector.NbPoints() > 0 ) + { + double u = aProjector.LowerDistanceParameter(); + if ( Min( u - aFP, aLP - u ) > Precision::Confusion() ) + { + builder.Add( compoundOfVV, BRepBuilderAPI_MakeVertex( aProjector.NearestPoint())); + myProjectionOK = true; + } + } + } + } + else + { + return; + } // Build prs SALOME_Prs* aPrs = getDisplayer()->BuildPrs( aShape ); if ( aPrs != 0 && !aPrs->IsNull() ) GEOMBase_Helper::displayPreview( aPrs, false, true ); - } + } } //================================================================================= @@ -218,9 +298,11 @@ bool RepairGUI_DivideEdgeDlg::ClickOnApply() myEditCurrentArgument->setText( "" ); myObject = GEOM::GEOM_Object::_nil(); + myPoint.nullify(); myIndex = -1; + myProjectionOK = false; - initSelection(); + ConstructorsClicked(getConstructorId()); return true; } @@ -235,8 +317,17 @@ void RepairGUI_DivideEdgeDlg::SelectionIntoArgument() { myEditCurrentArgument->setText( "" ); - myObject = GEOM::GEOM_Object::_nil(); - myIndex = -1; + const bool toSelectObject = ( myEditCurrentArgument == GroupPoints->LineEdit1 ); + if ( toSelectObject ) + { + myObject = GEOM::GEOM_Object::_nil(); + myIndex = -1; + } + else //if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) + { + myPoint.nullify(); + myProjectionOK = false; + } LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); SALOME_ListIO aSelList; @@ -252,7 +343,7 @@ void RepairGUI_DivideEdgeDlg::SelectionIntoArgument() if ( GEOMBase::GetShape( aSelectedObj, aShape, TopAbs_SHAPE ) ) { const int aType = aShape.ShapeType(); - if ( aType <= TopAbs_EDGE ) // edge, wire, face, shell, solid, compound + if ( aType <= TopAbs_EDGE || !toSelectObject ) // edge, wire, face, shell, solid, compound { GEOM::short_array anIndexes; @@ -263,20 +354,29 @@ void RepairGUI_DivideEdgeDlg::SelectionIntoArgument() if ( !aMap.IsEmpty() ) // sub-shape selection { - myIndex = aMap( 1 ); - myObject = aSelectedObj; - myEditCurrentArgument->setText( aName += QString( ":edge_%1" ).arg( myIndex ) ); + if ( toSelectObject ) { + myIndex = aMap( 1 ); + myObject = aSelectedObj; + myEditCurrentArgument->setText( aName += QString( ":edge_%1" ).arg( myIndex ) ); + } + else if (( myPoint = getSelected( TopAbs_VERTEX ))) + { + myEditCurrentArgument->setText( aName += QString( ":vertex_%1" ).arg( aMap( 1 ))); + } } - else if ( aType == TopAbs_EDGE ) // single shape selection + else if ( aType == TopAbs_EDGE && toSelectObject ) // single shape selection { myIndex = -1; myObject = aSelectedObj; - myEditCurrentArgument->setText( GEOMBase::GetName( myObject ) ); + myEditCurrentArgument->setText( aName ); + } + else if ( aType == TopAbs_VERTEX && !toSelectObject ) // single shape selection + { + myPoint = aSelectedObj; + myEditCurrentArgument->setText( aName ); } else // face, shell, solid or compound was selected, and NOT its sub-shape. { - myIndex = -1; - myObject = GEOM::GEOM_Object::_nil(); } } } @@ -292,10 +392,29 @@ void RepairGUI_DivideEdgeDlg::SelectionIntoArgument() //================================================================================= void RepairGUI_DivideEdgeDlg::SetEditCurrentArgument() { - if ( sender() == GroupPoints->PushButton1 ) { + QPushButton* send = (QPushButton*)sender(); + + if ( send == GroupPoints->PushButton1 ) { GroupPoints->LineEdit1->setFocus(); myEditCurrentArgument = GroupPoints->LineEdit1; + + GroupPoints->PushButton2->setDown(false); + GroupPoints->LineEdit2->setEnabled(false); } + if ( send == GroupPoints->PushButton2 ) { + GroupPoints->LineEdit2->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit2; + + GroupPoints->PushButton1->setDown(false); + GroupPoints->LineEdit1->setEnabled(false); + } + // enable line edit + myEditCurrentArgument->setEnabled(true); + myEditCurrentArgument->setFocus(); + // after setFocus(), because it will be setDown(false) when loses focus + send->setDown(true); + + initSelection(); SelectionIntoArgument(); } @@ -310,6 +429,11 @@ void RepairGUI_DivideEdgeDlg::LineEditReturnPressed() myEditCurrentArgument = GroupPoints->LineEdit1; GEOMBase_Skeleton::LineEditReturnPressed(); } + if ( sender() == GroupPoints->LineEdit2 && + !GroupPoints->LineEdit2->isHidden() ) { + myEditCurrentArgument = GroupPoints->LineEdit2; + GEOMBase_Skeleton::LineEditReturnPressed(); + } } @@ -327,7 +451,7 @@ void RepairGUI_DivideEdgeDlg::ActivateThisDialog() myIndex = -1; //myGeomGUI->SetState( 0 ); - initSelection(); + ConstructorsClicked(getConstructorId()); } //================================================================================= @@ -356,7 +480,16 @@ GEOM::GEOM_IOperations_ptr RepairGUI_DivideEdgeDlg::createOperation() //================================================================================= bool RepairGUI_DivideEdgeDlg::isValid( QString& msg ) { - bool ok = myValEdt->isValid( msg, !IsPreview() ); + bool ok = false; + if ( getConstructorId() == BY_PARAM ) + { + ok = myValEdt->isValid( msg, !IsPreview() ); + } + else if ( getConstructorId() == BY_POINT_PROJ ) + { + if (( ok = myPoint ) && !( ok = myProjectionOK )) + msg = tr("DEVIDE_EDGE_BAD_PROJ_MSG"); + } return !myObject->_is_nil() && ok; } @@ -367,11 +500,16 @@ bool RepairGUI_DivideEdgeDlg::isValid( QString& msg ) bool RepairGUI_DivideEdgeDlg::execute( ObjectList& objects ) { GEOM::GEOM_IHealingOperations_var anOper = GEOM::GEOM_IHealingOperations::_narrow( getOperation() ); - GEOM::GEOM_Object_var anObj = anOper->DivideEdge( myObject, myIndex, myValEdt->value(), getIsByParameter() ); + GEOM::GEOM_Object_var anObj; + if ( getConstructorId() == BY_PARAM ) + anObj = anOper->DivideEdge( myObject, myIndex, myValEdt->value(), getIsByParameter() ); + else + anObj = anOper->DivideEdgeByPoint( myObject, myIndex, myPoint.get() ); + bool aResult = !anObj->_is_nil(); if ( aResult ) { - if ( !IsPreview() ) + if ( !IsPreview() && ( getConstructorId() == BY_PARAM )) { QStringList aParameters; aParameters << ""; @@ -400,6 +538,19 @@ bool RepairGUI_DivideEdgeDlg::getIsByParameter() const //================================================================================= void RepairGUI_DivideEdgeDlg::initSelection() { - GEOM::GEOM_Object_var aNullGeomObject; - localSelection( aNullGeomObject, TopAbs_EDGE ); // load local selection on ALL objects + TopAbs_ShapeEnum type = TopAbs_EDGE; + if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) + type = TopAbs_VERTEX; + + globalSelection(); // close local contexts, if any + localSelection( GEOM::GEOM_Object::_nil(), type ); // load local selection on ALL objects +} + +//================================================================================= +// function : addSubshapeToStudy +// purpose : virtual method to add new SubObjects if local selection +//================================================================================= +void RepairGUI_DivideEdgeDlg::addSubshapesToStudy() +{ + GEOMBase::PublishSubObject( myPoint.get() ); } diff --git a/src/RepairGUI/RepairGUI_DivideEdgeDlg.h b/src/RepairGUI/RepairGUI_DivideEdgeDlg.h index 4b1adc3c9..129c9895c 100644 --- a/src/RepairGUI/RepairGUI_DivideEdgeDlg.h +++ b/src/RepairGUI/RepairGUI_DivideEdgeDlg.h @@ -29,7 +29,7 @@ #include -class DlgRef_1SelExt; +class DlgRef_2SelExt; class SalomeApp_DoubleSpinBox; class QButtonGroup; @@ -50,7 +50,8 @@ protected: virtual GEOM::GEOM_IOperations_ptr createOperation(); virtual bool isValid( QString& ); virtual bool execute( ObjectList& ); - + virtual void addSubshapesToStudy(); + private: void Init(); void enterEvent( QEvent* ); @@ -58,13 +59,16 @@ private: bool getIsByParameter() const; int myIndex; - + private: GEOM::GEOM_Object_var myObject; - - DlgRef_1SelExt* GroupPoints; + GEOM::GeomObjPtr myPoint; + bool myProjectionOK; + + DlgRef_2SelExt* GroupPoints; QButtonGroup* myIsParameterGr; SalomeApp_DoubleSpinBox* myValEdt; + QLabel* myValLbl; protected slots: void ClickOnOk(); @@ -76,6 +80,7 @@ protected slots: void LineEditReturnPressed(); void SelectionIntoArgument(); void SetEditCurrentArgument(); + void ConstructorsClicked( int ); }; #endif // REPAIRGUI_DIVIDEEDGEDLG_H diff --git a/src/ShHealOper/ShHealOper_EdgeDivide.cxx b/src/ShHealOper/ShHealOper_EdgeDivide.cxx index 3a910c55d..99de5efe5 100644 --- a/src/ShHealOper/ShHealOper_EdgeDivide.cxx +++ b/src/ShHealOper/ShHealOper_EdgeDivide.cxx @@ -24,24 +24,28 @@ // Created: 30.04.04 16:44:47 // Author: Galina KULIKOVA // +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include #include -#include -#include -#include -#include +#include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include -#include #include -#include -#include -#include -#include + //#include <.hxx> //#include <.hxx> //======================================================================= @@ -113,10 +117,51 @@ Standard_Boolean ShHealOper_EdgeDivide::Perform(const TopoDS_Shape& theEdge, return myDone; } //======================================================================= -//function : build +//function : Perform //purpose : //======================================================================= +Standard_Boolean ShHealOper_EdgeDivide::Perform(const TopoDS_Shape& theEdge, + const TopoDS_Shape& thePoints) +{ + myDone = Standard_False; + myErrorStatus = ShHealOper_NotError; + if(theEdge.ShapeType() != TopAbs_EDGE) { + myErrorStatus = ShHealOper_InvalidParameters; + return myDone; + } + myDivideParamMode = true; + myEdge = TopoDS::Edge(theEdge); + Handle(TColStd_HSequenceOfReal) aSeqValues = new TColStd_HSequenceOfReal; + + double aFirst,aLast; + Handle(Geom_Curve) aCurve = BRep_Tool::Curve(myEdge,aFirst,aLast); + if ( aCurve.IsNull() ) return false; + GeomAPI_ProjectPointOnCurve aProjector; + aProjector.Init( aCurve, aFirst, aLast ); + + TopTools_MapOfShape vMap; + TopExp_Explorer vertex( thePoints, TopAbs_VERTEX ); + for ( ; vertex.More(); vertex.Next() ) + { + if ( !vMap.Add( vertex.Current() )) continue; + gp_Pnt p = BRep_Tool::Pnt( TopoDS::Vertex( vertex.Current() )); + aProjector.Perform( p ); + if ( aProjector.NbPoints() > 0 ) + { + double u = double( aProjector.LowerDistanceParameter() ); + double param = ( u - aFirst ) / ( aLast - aFirst ); + aSeqValues->Append( param ); + } + } + myDone = build(aSeqValues); + return myDone; +} +//======================================================================= +//function : build +//purpose : +//======================================================================= + Standard_Boolean ShHealOper_EdgeDivide::build(const Handle(TColStd_HSequenceOfReal)& theValues) { if(myEdge.IsNull() || !theValues->Length()) { @@ -124,16 +169,16 @@ Standard_Boolean ShHealOper_EdgeDivide::build(const Handle(TColStd_HSequenceOfRe return Standard_False; } - Standard_Boolean has3d = Standard_False, - has2d = Standard_False, - hasPCurves = Standard_False; - + Standard_Boolean has3d = Standard_False, + has2d = Standard_False, + hasPCurves = Standard_False; + //computation of the split values in dependance from specified mode and values. if(!computeValues(theValues, has3d,has2d,hasPCurves)) { myErrorStatus = ShHealOper_InvalidParameters; return Standard_False; } - + //setting split values in the splitting curve tools. Handle(ShapeUpgrade_WireDivide) aSplitTool = new ShapeUpgrade_WireDivide; aSplitTool->Load(myEdge); @@ -152,7 +197,7 @@ Standard_Boolean ShHealOper_EdgeDivide::build(const Handle(TColStd_HSequenceOfRe myErrorStatus = ShHealOper_InvalidParameters; return Standard_False; } - + //split 3d curve and pcurve for each face reffering to edge. Standard_Boolean isDone = Standard_True; if(hasPCurves) { diff --git a/src/ShHealOper/ShHealOper_EdgeDivide.hxx b/src/ShHealOper/ShHealOper_EdgeDivide.hxx index 4fd3ef0d6..d552149c8 100644 --- a/src/ShHealOper/ShHealOper_EdgeDivide.hxx +++ b/src/ShHealOper/ShHealOper_EdgeDivide.hxx @@ -27,12 +27,11 @@ #ifndef ShHealOper_EdgeDivide_HeaderFile #define ShHealOper_EdgeDivide_HeaderFile +#include #include +#include #include #include -#include -#include -#include /// Class ShHealOper_EdgeDivide //Intended for spitting edge in accordance to the specified mode and value. @@ -59,7 +58,7 @@ class ShHealOper_EdgeDivide : public ShHealOper_Tool //specified mode and value. //If theDivideParamMode is equal to true edge will be splitted by parameter. //Else edge will be spliited by length (default true). - //theValue is koefficient for splitting from 0 to 1. + //theValue is coefficient for splitting from 0 to 1. Standard_EXPORT Standard_Boolean Perform(const TopoDS_Shape& theEdge, const TColStd_SequenceOfReal& theValues, @@ -67,7 +66,11 @@ class ShHealOper_EdgeDivide : public ShHealOper_Tool //Performs spitting of the specified edge in the accoradnce to //specified mode and sequence of values the same way as previous. - protected: + Standard_EXPORT Standard_Boolean Perform(const TopoDS_Shape& theEdge, + const TopoDS_Shape& thePoint); + //Performs spitting of the specified edge by projecting a point to it. + +protected: // ---------- PROTECTED METHODS ---------- -- 2.39.2