From: gdd Date: Wed, 24 Nov 2010 15:16:13 +0000 (+0000) Subject: RNC: EDF 1618 Sketcher improvement for arc creation X-Git-Tag: V6_2_0a1~9 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=fca838df4fb19b0975d388608a21f8a00f229453;p=modules%2Fgeom.git RNC: EDF 1618 Sketcher improvement for arc creation --- diff --git a/doc/salome/gui/GEOM/images/neo-scetcher1.png b/doc/salome/gui/GEOM/images/neo-scetcher1.png index 2205805bd..1f387e952 100755 Binary files a/doc/salome/gui/GEOM/images/neo-scetcher1.png and b/doc/salome/gui/GEOM/images/neo-scetcher1.png differ diff --git a/doc/salome/gui/GEOM/images/neo-scetcher2.png b/doc/salome/gui/GEOM/images/neo-scetcher2.png index cec5c57b4..bf0312277 100755 Binary files a/doc/salome/gui/GEOM/images/neo-scetcher2.png and b/doc/salome/gui/GEOM/images/neo-scetcher2.png differ diff --git a/doc/salome/gui/GEOM/input/creating_sketcher.doc b/doc/salome/gui/GEOM/input/creating_sketcher.doc index c93f5f3ff..bad3c2c35 100644 --- a/doc/salome/gui/GEOM/input/creating_sketcher.doc +++ b/doc/salome/gui/GEOM/input/creating_sketcher.doc @@ -49,7 +49,7 @@ is predefined and is equal to 90 degrees);
  • tangent to the previous segment;
  • vector components DX, DY.
  • -
  • Parameters of an element (for segment : length or target X or Y coordinate value, for arc : radius and angle).
  • +
  • Parameters of an element (for segment : length or target X or Y coordinate value, for arc : radius, angle or center coordinates).
  • \b Buttons: diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 21d98dd46..895af0c3f 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -1514,6 +1514,10 @@ Please, select face, shell or solid and try again GEOM_SKETCHER_ABS Absolute + + + GEOM_SKETCHER_ADD_PARAMS + Additionnal Parameters GEOM_SKETCHER_ANGLE @@ -1530,8 +1534,32 @@ Please, select face, shell or solid and try again GEOM_SKETCHER_ARC Arc - + + GEOM_SKETCHER_CENTER + Center + + + GEOM_SKETCHER_CENTER2 + Center : + + + GEOM_SKETCHER_CENTER_X + Center X coord. : + + + GEOM_SKETCHER_CENTER_Y + Center Y coord. : + + + GEOM_SKETCHER_CENTER_DX + Center DX coord. : + + + GEOM_SKETCHER_CENTER_DY + Center DY coord. : + + GEOM_SKETCHER_DEST Destination @@ -1566,6 +1594,10 @@ Please, select face, shell or solid and try again GEOM_SKETCHER_LENGTH2 Length : + + + GEOM_SKETCHER_NONE + None (Tangential) GEOM_SKETCHER_PER @@ -1578,7 +1610,15 @@ Please, select face, shell or solid and try again GEOM_SKETCHER_POINT2 Point : - + + + GEOM_SKETCHER_END_POINT2 + End Point : + + + GEOM_SKETCHER_RADIUS + Radius + GEOM_SKETCHER_RADIUS2 Radius : diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index 62dc3b162..71587db95 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -1100,6 +1100,10 @@ GEOM_SKETCHER_POINT2 Point : + + + GEOM_SKETCHER_END_POINT2 + End Point : GEOM_SKETCHER_RADIUS2 diff --git a/src/GEOM_SWIG/GEOM_Sketcher.py b/src/GEOM_SWIG/GEOM_Sketcher.py index 5a8edface..824f758bd 100644 --- a/src/GEOM_SWIG/GEOM_Sketcher.py +++ b/src/GEOM_SWIG/GEOM_Sketcher.py @@ -49,6 +49,19 @@ import geompy #"C radius length" : Create by direction, radius and length(in degree) #"AA x y": Create by point at X & Y #"A dx dy" : Create by point with DX & DY +#"UU x y radius flag1": Create by point at X & Y with given radiUs +#"U dx dy radius flag1" : Create by point with DX & DY with given radiUs +#"EE x y xc yc flag1 flag2": Create by point at X & Y with given cEnter +#"E dx dy dxc dyc radius flag1 flag2" : Create by point with DX & DY with given cEnter + +#Flag1 is 0 or 2 ... +# if 0 the drawn arc is the one of lower angle (< Pi) +# if 2 the drawn arc ius the one of greater angle (> Pi) + +#Flag2 is 0 or 1 ... +# if 0 the specified end point can be at a distance of the arc greater than the tolerance (10^-7) +# if 1 the wire is built only if the end point is on the arc +# with a tolerance of 10^-7 on the distance else the creation fails #To finish #"WW" : Close Wire diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index ce18f9e69..6ccb27bad 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -913,11 +913,27 @@ class geompyDC(GEOM._objref_GEOM_Gen): # - "C radius length" : Create arc by direction, radius and length(in degree) # - "AA x y": Create arc by point at X & Y # - "A dx dy" : Create arc by point with DX & DY - # . + # - "A dx dy" : Create arc by point with DX & DY + # - "UU x y radius flag1": Create arc by point at X & Y with given radiUs + # - "U dx dy radius flag1" : Create arc by point with DX & DY with given radiUs + # - "EE x y xc yc flag1 flag2": Create arc by point at X & Y with given cEnter coordinates + # - "E dx dy dxc dyc radius flag1 flag2" : Create arc by point with DX & DY with given cEnter coordinates + # . # \n # - "WW" : Close Wire (to finish) # - "WF" : Close Wire and build face (to finish) - # + # . + # \n + # - Flag1 (= reverse) is 0 or 2 ... + # - if 0 the drawn arc is the one of lower angle (< Pi) + # - if 2 the drawn arc ius the one of greater angle (> Pi) + # . + # \n + # - Flag2 (= control tolerance) is 0 or 1 ... + # - if 0 the specified end point can be at a distance of the arc greater than the tolerance (10^-7) + # - if 1 the wire is built only if the end point is on the arc + # with a tolerance of 10^-7 on the distance else the creation fails + # # @param theCommand String, defining the sketcher in local # coordinates of the working plane. # @param theWorkingPlane Nine double values, defining origin, diff --git a/src/SKETCHER/Sketcher_Profile.cxx b/src/SKETCHER/Sketcher_Profile.cxx index 5e04c891e..d7c46982f 100644 --- a/src/SKETCHER/Sketcher_Profile.cxx +++ b/src/SKETCHER/Sketcher_Profile.cxx @@ -67,6 +67,7 @@ Sketcher_Profile::Sketcher_Profile() //======================================================================= Sketcher_Profile::Sketcher_Profile(const char* aCmd) { + myErrMsg = ""; enum {line, circle, point, none} move; Standard_Integer i = 1; @@ -78,6 +79,9 @@ Sketcher_Profile::Sketcher_Profile(const char* aCmd) first = Standard_True; stayfirst = face = close = Standard_False; + Standard_Integer reversed = 0; + Standard_Integer control_Tolerance = 0; + TopoDS_Shape S; TopoDS_Vertex MP; BRepBuilderAPI_MakeWire MW; @@ -185,7 +189,7 @@ Sketcher_Profile::Sketcher_Profile(const char* aCmd) } case 'T': { - if (n1 != 3) goto badargs; + if (n1 != 3) goto badargs; Standard_Real vx = a(1).RealValue(); Standard_Real vy = a(2).RealValue(); if (a(0) == "TT") { @@ -245,7 +249,7 @@ Sketcher_Profile::Sketcher_Profile(const char* aCmd) move = none; break; } - case 'A': + case 'A': // TAngential arc by end point { if (n1 != 3) goto badargs; Standard_Real vx = a(1).RealValue(); @@ -254,16 +258,14 @@ Sketcher_Profile::Sketcher_Profile(const char* aCmd) vx -= x; vy -= y; } - Standard_Real det = (dx * vy - dy * vx); + Standard_Real det = dx * vy - dy * vx; if ( Abs(det) > Precision::Confusion()) { - Standard_Real c = (dx * vx + dy * vy) // Cosine of alpha = arc angle / 2 - / Sqrt((dx * dx + dy * dy) - * (vx * vx + vy * vy)); - radius = (vx * vx + vy * vy) // radius = distance between start - * Sqrt(dx * dx + dy * dy) // and end point / 2 * sin(alpha) - / (2.0 * det); // radius is > 0 or < 0 + Standard_Real c = (dx * vx + dy * vy) + / Sqrt((dx * dx + dy * dy) * (vx * vx + vy * vy)); // Cosine of alpha = arc of angle / 2 , alpha in [0,Pi] + radius = (vx * vx + vy * vy)* Sqrt(dx * dx + dy * dy) // radius = distance between start and end point / 2 * sin(alpha) + / (2.0 * det); // radius is > 0 or < 0 if (Abs(radius) > Precision::Confusion()) { - angle = 2.0 * acos(c); // angle in [0,Pi] + angle = 2.0 * acos(c); // angle in [0,2Pi] move = circle; } else @@ -274,6 +276,83 @@ Sketcher_Profile::Sketcher_Profile(const char* aCmd) move = none; break; } + case 'U': // Arc by end point and radiUs + { + if (n1 != 5) goto badargs; + Standard_Real vx = a(1).RealValue(); + Standard_Real vy = a(2).RealValue(); + radius = a(3).RealValue(); + reversed = a(4).IntegerValue(); + if (a(0) == "UU") { // Absolute + vx -= x; + vy -= y; + } + Standard_Real length = Sqrt(vx * vx + vy * vy); + if ( (4.0 - (vx * vx + vy * vy) / (radius * radius) >= 0.0 ) && (length > Precision::Confusion()) ) { + Standard_Real c = 0.5 * Sqrt(4.0 - (vx * vx + vy * vy) / (radius * radius)); // Cosine of alpha = arc angle / 2 , alpha in [0,Pi/2] + angle = 2.0 * acos(c); // angle in [0,Pi] + if ( reversed == 2 ) + angle = angle - 2 * PI; + dx = 0.5 * ( vy * 1.0/radius + + vx * Sqrt(4.0 / (vx * vx + vy * vy) - 1.0 / (radius * radius))); + dy = - 0.5 * ( vx * 1.0/radius + - vy * Sqrt(4.0 / (vx * vx + vy * vy) - 1.0 / (radius * radius))); + move = circle; + } + else{ + move = none; + } + break; + } + case 'E': // Arc by end point and cEnter + { + myErrMsg = ""; + if (n1 != 7) goto badargs; + Standard_Real vx = a(1).RealValue(); + Standard_Real vy = a(2).RealValue(); + Standard_Real vxc = a(3).RealValue(); + Standard_Real vyc = a(4).RealValue(); + reversed = a(5).IntegerValue(); + control_Tolerance = a(6).IntegerValue(); + + if (a(0) == "EE") { // Absolute + vx -= x; + vy -= y; + vxc -= x; + vyc -= y; + } + radius = Sqrt( vxc * vxc + vyc * vyc ); + Standard_Real det = vx * vyc - vy * vxc; + Standard_Real length = Sqrt(vx * vx + vy * vy); + Standard_Real length2 = Sqrt((vx-vxc) * (vx-vxc) + (vy-vyc) * (vy-vyc)); + Standard_Real length3 = Sqrt(vxc * vxc + vyc * vyc); + Standard_Real error = Abs(length2 - radius); + if ( error > Precision::Confusion() ){ + MESSAGE("Warning : The specified end point is not on the Arc, distance = "< Precision::Confusion() && // Don't create the arc if the end point + control_Tolerance == 1) // is too far from it + move = none; + else if ( (length > Precision::Confusion()) && + (length2 > Precision::Confusion()) && + (length3 > Precision::Confusion()) ) { + Standard_Real c = ( radius * radius - (vx * vxc + vy * vyc) ) + / ( radius * Sqrt((vx-vxc) * (vx-vxc) + (vy-vyc) * (vy-vyc)) ) ; // Cosine of arc angle + angle = acos(c); // angle in [0,Pi] + if ( reversed == 2 ) + angle = angle - 2 * PI; + if (det < 0) + angle = -angle; + dx = vyc / radius; + dy = -vxc / radius; + move = circle; + } + else { + move = none; + } + break; + } case 'I': { if (n1 != 2) goto badargs; diff --git a/src/SKETCHER/Sketcher_Profile.hxx b/src/SKETCHER/Sketcher_Profile.hxx index 29801915f..e68e2ebfe 100644 --- a/src/SKETCHER/Sketcher_Profile.hxx +++ b/src/SKETCHER/Sketcher_Profile.hxx @@ -29,6 +29,7 @@ #include #include #include +#include class Sketcher_Profile { @@ -43,6 +44,7 @@ private: TopoDS_Shape myShape; bool myOK; + std::string myErrMsg; public: Standard_EXPORT gp_Pnt GetLastPoint(){return myLastPoint;}; @@ -50,5 +52,6 @@ public: Standard_EXPORT const TopoDS_Shape& GetShape(){return myShape;}; Standard_EXPORT bool IsDone(){return myOK;}; + Standard_EXPORT std::string ErrMsg(){return myErrMsg;}; };