From b8e5dd32fcee12b11778c09fbf1847f7de64bed3 Mon Sep 17 00:00:00 2001 From: gdd Date: Fri, 29 Apr 2011 14:54:11 +0000 Subject: [PATCH] rnc: EDF 1618 GEOM: changed the wrning message when building an arc from endpoint and center. The message show now the value of the error too --- src/EntityGUI/EntityGUI_4Spin1Check_QTD.ui | 15 ++- src/EntityGUI/EntityGUI_Skeleton_QTD.ui | 10 +- src/EntityGUI/EntityGUI_SketcherDlg.cxx | 28 +++- src/GEOMGUI/GEOM_msg_en.ts | 2 +- src/GEOMGUI/GEOM_msg_fr.ts | 4 +- src/SKETCHER/Sketcher_Profile.cxx | 148 ++++++++++----------- src/SKETCHER/Sketcher_Profile.hxx | 2 + 7 files changed, 122 insertions(+), 87 deletions(-) diff --git a/src/EntityGUI/EntityGUI_4Spin1Check_QTD.ui b/src/EntityGUI/EntityGUI_4Spin1Check_QTD.ui index fa876ac60..b298c7c9d 100644 --- a/src/EntityGUI/EntityGUI_4Spin1Check_QTD.ui +++ b/src/EntityGUI/EntityGUI_4Spin1Check_QTD.ui @@ -134,7 +134,7 @@ - + @@ -149,6 +149,19 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + diff --git a/src/EntityGUI/EntityGUI_Skeleton_QTD.ui b/src/EntityGUI/EntityGUI_Skeleton_QTD.ui index 6f92ba864..52fc0b940 100644 --- a/src/EntityGUI/EntityGUI_Skeleton_QTD.ui +++ b/src/EntityGUI/EntityGUI_Skeleton_QTD.ui @@ -6,10 +6,16 @@ 0 0 - 380 + 390 236 + + + 0 + 0 + + Form @@ -62,7 +68,7 @@ - 30 + 35 0 diff --git a/src/EntityGUI/EntityGUI_SketcherDlg.cxx b/src/EntityGUI/EntityGUI_SketcherDlg.cxx index f01a072d4..c47afb1a4 100644 --- a/src/EntityGUI/EntityGUI_SketcherDlg.cxx +++ b/src/EntityGUI/EntityGUI_SketcherDlg.cxx @@ -1964,6 +1964,13 @@ bool EntityGUI_SketcherDlg::isValid( QString& msg ) //================================================================================= bool EntityGUI_SketcherDlg::execute( ObjectList& objects ) { + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); + int DigNum = qAbs(aPrecision); // options for the format of numbers in myNewCommand + char Format = 'f'; + if ( aPrecision < 0 ) // f --> DigNum is the number of digits after the decimal point + Format = 'g'; // g --> DigNum is the maximum number of significant digits + QString aParameters; if ( mySketchState == FIRST_POINT ) { @@ -1988,16 +1995,25 @@ bool EntityGUI_SketcherDlg::execute( ObjectList& objects ) Sketcher_Profile aProfile2( Command2.toAscii() ); //Error Message - if ( mySketchType == PT_ABS_CENTER || - mySketchType == PT_REL_CENTER ){ - Group4Spin->label->show(); - Group4Spin->label->setText( tr( aProfile2.ErrMsg().c_str() ) ); + if ( mySketchType == PT_ABS_CENTER || mySketchType == PT_REL_CENTER ){ + if (aProfile2.Error() > Precision::Confusion()){ + Group4Spin->label->show(); + Group4Spin->label->setText( tr("GEOM_SKETCHER_WARNING") + QString::number( aProfile2.Error(), Format, DigNum)); + } + else{ + Group4Spin->label->hide(); + } } else Group4Spin->label->hide(); if ( mySketchType == PT_SEL_CENTER ){ - Group2Sel->label->show(); - Group2Sel->label->setText( tr( aProfile2.ErrMsg().c_str() ) ); + if (aProfile2.Error() > Precision::Confusion()){ + Group2Sel->label->show(); + Group2Sel->label->setText( tr("GEOM_SKETCHER_WARNING") + QString::number( aProfile2.Error(), Format, DigNum)); + } + else{ + Group2Sel->label->hide(); + } } else Group2Sel->label->hide(); diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index ab1af6650..2ee69bbde 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -1563,7 +1563,7 @@ Please, select face, shell or solid and try again GEOM_SKETCHER_WARNING - Warning : The specified End Point is not on the Arc + Warning: End point not on the arc, distance = GEOM_SKETCHER_CENTER_X diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index 6645b3d5a..4d1985a3a 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -235,7 +235,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau GEOM_BUT_CLOSE_SKETCH - Fermer le contour et valider + Fermer le contour GEOM_BUT_END_SKETCH @@ -1543,7 +1543,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau GEOM_SKETCHER_WARNING - Attention : Le point final choisi n'est pas sur l'arc + Attention : Point final distant de l'arc de : GEOM_SKETCHER_CENTER_X diff --git a/src/SKETCHER/Sketcher_Profile.cxx b/src/SKETCHER/Sketcher_Profile.cxx index 2f62f13eb..eeead8051 100644 --- a/src/SKETCHER/Sketcher_Profile.cxx +++ b/src/SKETCHER/Sketcher_Profile.cxx @@ -67,7 +67,6 @@ Sketcher_Profile::Sketcher_Profile() //======================================================================= Sketcher_Profile::Sketcher_Profile(const char* aCmd) { - myErrMsg = ""; enum {line, circle, point, none} move; Standard_Integer i = 1; @@ -91,6 +90,7 @@ Sketcher_Profile::Sketcher_Profile(const char* aCmd) Handle(Geom_Surface) Surface; myOK = Standard_False; + myError = 0; //TCollection_AsciiString aCommand(CORBA::string_dup(aCmd)); TCollection_AsciiString aCommand ((char*)aCmd); @@ -252,106 +252,104 @@ Sketcher_Profile::Sketcher_Profile(const char* aCmd) case 'A': // TAngential arc by end point { if (n1 != 3) goto badargs; - Standard_Real vx = a(1).RealValue(); + Standard_Real vx = a(1).RealValue(); Standard_Real vy = a(2).RealValue(); - if (a(0) == "AA") { + if (a(0) == "AA") { vx -= x; vy -= y; } - Standard_Real det = dx * vy - dy * vx; - if ( Abs(det) > Precision::Confusion()) { - 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] + Standard_Real det = dx * vy - dy * vx; + if ( Abs(det) > Precision::Confusion()) { + 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,2Pi] - move = circle; + / (2.0 * det); // radius is > 0 or < 0 + if (Abs(radius) > Precision::Confusion()) { + angle = 2.0 * acos(c); // angle in [0,2Pi] + move = circle; } - else - move = none; - break; + else + move = none; + break; } else move = none; break; - } + } case 'U': // Arc by end point and radiUs { - if (n1 != 5) goto badargs; - Standard_Real vx = a(1).RealValue(); + 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 + 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))); + 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; + - vy * Sqrt(4.0 / (vx * vx + vy * vy) - 1.0 / (radius * radius))); + move = circle; } - else{ - move = none; - } - break; + else{ + move = none; + } + break; } case 'E': // Arc by end point and cEnter { - myErrMsg = ""; - if (n1 != 7) goto badargs; - Standard_Real vx = a(1).RealValue(); + 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(); + 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 + if (a(0) == "EE") { // Absolute vx -= x; vy -= y; - vxc -= x; - vyc -= 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); + myError = error; + if ( error > Precision::Confusion() ){ + MESSAGE("Warning : The specified end point is not on the Arc, distance = "< Precision::Confusion() && control_Tolerance == 1) // Don't create the arc if the end point + move = none; // is too far from it + 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; } - 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; + else { + move = none; + } + break; } case 'I': { diff --git a/src/SKETCHER/Sketcher_Profile.hxx b/src/SKETCHER/Sketcher_Profile.hxx index e68e2ebfe..97c41c54a 100644 --- a/src/SKETCHER/Sketcher_Profile.hxx +++ b/src/SKETCHER/Sketcher_Profile.hxx @@ -45,6 +45,7 @@ private: TopoDS_Shape myShape; bool myOK; std::string myErrMsg; + double myError; public: Standard_EXPORT gp_Pnt GetLastPoint(){return myLastPoint;}; @@ -53,5 +54,6 @@ public: Standard_EXPORT const TopoDS_Shape& GetShape(){return myShape;}; Standard_EXPORT bool IsDone(){return myOK;}; Standard_EXPORT std::string ErrMsg(){return myErrMsg;}; + Standard_EXPORT double Error(){return myError;}; }; -- 2.39.2