]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Rolling back protection against crash in logarithmic scale
authorsan <san@opencascade.com>
Wed, 21 Dec 2005 15:20:50 +0000 (15:20 +0000)
committersan <san@opencascade.com>
Wed, 21 Dec 2005 15:20:50 +0000 (15:20 +0000)
src/Plot2d/Plot2d_Curve.cxx
src/Plot2d/Plot2d_Curve.h
src/Plot2d/Plot2d_ViewFrame.cxx
src/Plot2d/Plot2d_ViewFrame.h
src/Plot2d/resources/Plot2d_msg_en.po

index 325115aa27ad0bc418281d4609b4375128ebdfd3..c0a9abbb6f2a1694e188bf2898b8c613bfd5de57 100755 (executable)
@@ -353,3 +353,33 @@ QwtPlot::Axis Plot2d_Curve::getYAxis() const
 {
   return myYAxis;
 }
+
+/*!
+  Gets curve's minimal abscissa
+*/
+double Plot2d_Curve::getMinX() const
+{
+  QValueList<Plot2d_Point>::const_iterator aIt;
+  double aMinX = 1e150;
+  int aCurrent = 0;
+  for(aIt = myPoints.begin(); aIt != myPoints.end(); ++aIt) {
+    if ( (*aIt).x < aMinX )
+      aMinX = (*aIt).x;
+  }
+  return aMinX;
+}
+
+/*!
+  Gets curve's minimal ordinate
+*/
+double Plot2d_Curve::getMinY() const
+{
+  QValueList<Plot2d_Point>::const_iterator aIt;
+  double aMinY = 1e150;
+  int aCurrent = 0;
+  for(aIt = myPoints.begin(); aIt != myPoints.end(); ++aIt) {
+    if ( (*aIt).y < aMinY )
+      aMinY = (*aIt).y;
+  }
+  return aMinY;
+}
index e54009d5e18ed207e83c020902de8c404d2835e4..b17f7c327364b8ae26296d4c1f53b09199bfc78e 100755 (executable)
@@ -82,6 +82,12 @@ public:
   void        setYAxis(QwtPlot::Axis theYAxis);
   QwtPlot::Axis getYAxis() const;
 
+  // Protection against QwtCurve::drawLines() bug in Qwt 0.4.x: 
+  // it crashes if switched to X/Y logarithmic mode, when one or more points have
+  // non-positive X/Y coordinate
+  double      getMinX() const;
+  double      getMinY() const;
+
 protected:
   bool        myAutoAssign;
   QString     myHorTitle;
index 4ef5df821af25b81bbba36c751372a0548d5e9cd..6d8546d358272b8d3eac3283bbaf0cc9e0f4de7f 100755 (executable)
@@ -1314,11 +1314,17 @@ void Plot2d_ViewFrame::setFont( const QFont& font, ObjectType type, bool update)
 */
 void Plot2d_ViewFrame::setHorScaleMode( const int mode, bool update )
 {
+  // san -- Protection against QwtCurve bug in Qwt 0.4.x: 
+  // it crashes if switched to X/Y logarithmic mode, when one or more points have
+  // non-positive X/Y coordinate
+  if ( mode && !isXLogEnabled() ){
+    SUIT_MessageBox::warn1(this, tr("WARNING"), tr("WRN_XLOG_NOT_ALLOWED"), tr("BUT_OK"));
+    return;
+  }
+
   myXMode = mode;
-  if ( myXMode == 0 ) // linear
-    myPlot->changeAxisOptions( QwtPlot::xBottom, QwtAutoScale::Logarithmic, false );
-  else                // logarithmic
-    myPlot->changeAxisOptions( QwtPlot::xBottom, QwtAutoScale::Logarithmic, true );
+
+  myPlot->changeAxisOptions( QwtPlot::xBottom, QwtAutoScale::Logarithmic, myXMode != 0 );
 
   if ( update )
     fitAll();
@@ -1329,6 +1335,14 @@ void Plot2d_ViewFrame::setHorScaleMode( const int mode, bool update )
 */
 void Plot2d_ViewFrame::setVerScaleMode( const int mode, bool update )
 {
+  // san -- Protection against QwtCurve bug in Qwt 0.4.x: 
+  // it crashes if switched to X/Y logarithmic mode, when one or more points have
+  // non-positive X/Y coordinate
+  if ( mode && !isYLogEnabled() ){
+    SUIT_MessageBox::warn1(this, tr("WARNING"), tr("WRN_YLOG_NOT_ALLOWED"), tr("BUT_OK"));
+    return;
+  }
+
   myYMode = mode;
   if ( myYMode == 0 ) { // linear
     myPlot->changeAxisOptions( QwtPlot::yLeft, QwtAutoScale::Logarithmic, false );
@@ -1345,6 +1359,7 @@ void Plot2d_ViewFrame::setVerScaleMode( const int mode, bool update )
   emit vpModeVerChanged();
 }
 
+
 /*!
   Return, scale mode for horizontal axis
 */
@@ -1557,6 +1572,32 @@ void Plot2d_ViewFrame::onViewGlobalPan()
   qApp->installEventFilter( this );
 }
 
+/*!
+  Precaution for logarithmic X scale
+*/
+bool Plot2d_ViewFrame::isXLogEnabled() const
+{
+  bool allPositive = true;
+  QIntDictIterator<Plot2d_Curve> it( myCurves );
+  for ( ; allPositive && it.current(); ++it ) {
+    allPositive = ( it.current()->getMinX() > 0. );
+  }
+  return allPositive;
+}
+
+/*!
+  Precaution for logarithmic Y scale
+*/
+bool Plot2d_ViewFrame::isYLogEnabled() const
+{
+  bool allPositive = true;
+  QIntDictIterator<Plot2d_Curve> it( myCurves );
+  for ( ; allPositive && it.current(); ++it ) {
+    allPositive = ( it.current()->getMinY() > 0. );
+  }
+  return allPositive;
+}
+
 //=================================================================================
 // Plot2d_Plot2d implementation
 //=================================================================================
index 3629ed1ca89f2ad000e5c476b2bdde4e029e0695..ff39f51b946e88c487aac80e9502a4652f6910a8 100755 (executable)
@@ -110,6 +110,12 @@ public:
   bool    isModeVerLinear();
   bool    isLegendShow() { return myShowLegend; };
 
+  // Protection against QwtCurve::drawLines() bug in Qwt 0.4.x: 
+  // it crashes if switched to X/Y logarithmic mode, when one or more points have
+  // non-positive X/Y coordinate
+  bool    isXLogEnabled() const;
+  bool    isYLogEnabled() const;
+
 protected:
   int     testOperation( const QMouseEvent& );
   void    readPreferences();
index fec03363165ce82fbfb7959135cd6bf787dd912c..b9b3c9b8138d9890307bc86117743cec459bbf9c 100755 (executable)
@@ -141,6 +141,15 @@ msgstr "Error"
 msgid "BUT_OK"
 msgstr "Ok"
 
+msgid "WARNING"
+msgstr "Warning"
+
+msgid "WRN_XLOG_NOT_ALLOWED"
+msgstr "Some points with non-positive abscissa values have been detected.\nLogarithmic scale for abscissa axis is not allowed."
+
+msgid "WRN_YLOG_NOT_ALLOWED"
+msgstr "Some points with non-positive ordinate values have been detected.\nLogarithmic scale for ordinate axis is not allowed."
+
 # ------------------------------------
 # Plot2d_SetupViewDlg
 # ------------------------------------