]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Changing the scaling mode to Logarithmic. (bug 1116)
authoradv <adv@opencascade.com>
Tue, 26 Jun 2012 12:30:28 +0000 (12:30 +0000)
committeradv <adv@opencascade.com>
Tue, 26 Jun 2012 12:30:28 +0000 (12:30 +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.ts

index fec9762686b65dd7d32945e42c09fa972faa4185..0e85942342929fd35c7d9e5be59fe1d935e0252e 100755 (executable)
@@ -206,6 +206,14 @@ void Plot2d_Curve::clearAllPoints()
   myPoints.clear();
 }
 
+/*!
+  Set curve's data : abscissas of points
+*/
+void Plot2d_Curve::setPointList( const pointList& thePoints )
+{
+  myPoints = thePoints;
+}
+
 /*!
   Gets curve's data : abscissas of points
 */
index 8692be8c947cd7f91e6e269df7bf64a20b8c55cf..5fcb8a95e5226c1f2de38922ceb24e5929daeefe 100755 (executable)
@@ -63,6 +63,7 @@ public:
   void               insertPoint( int, double, double, const QString& = QString() );
   void               deletePoint( int );
   void               clearAllPoints();
+  void               setPointList( const pointList& thePoints );
   pointList          getPointList() const;
 
   void               setData( const double*, const double*, 
index b82e05d165af046235548e56a05ae3d552818d2c..b5f9583684c801873a4474825c945c06c4c327d7 100755 (executable)
@@ -1523,9 +1523,14 @@ 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::warning(this, tr("WARNING"), tr("WRN_XLOG_NOT_ALLOWED"));
-    return;
+  if ( mode && !isXLogEnabled() ) {
+    int answer = SUIT_MessageBox::question( this, tr( "TITLE_LOG_NOT_ALLOWED" ), 
+                                            tr( "QUESTION_XLOG_NOT_ALLOWED" ), 
+                                            SUIT_MessageBox::Yes | SUIT_MessageBox::No );
+    if( answer == SUIT_MessageBox::No )
+      return;
+
+    doXLogEnabled();
   }
 
   myXMode = mode;
@@ -1548,7 +1553,13 @@ void Plot2d_ViewFrame::setVerScaleMode( const int mode, bool update )
   // 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::warning(this, tr("WARNING"), tr("WRN_YLOG_NOT_ALLOWED"));
+    int answer = SUIT_MessageBox::question( this, tr( "TITLE_LOG_NOT_ALLOWED" ), 
+                                            tr( "QUESTION_YLOG_NOT_ALLOWED" ), 
+                                            SUIT_MessageBox::Yes | SUIT_MessageBox::No );
+    if( answer == SUIT_MessageBox::No )
+      return;
+
+    doYLogEnabled();
     return;
   }
 
@@ -1798,6 +1809,14 @@ bool Plot2d_ViewFrame::isXLogEnabled() const
   return allPositive;
 }
 
+/*!
+  Remove all non-positive abscissa values
+*/
+void Plot2d_ViewFrame::doXLogEnabled()
+{
+  doLogEnabled( true );
+}
+
 /*!
   Precaution for logarithmic Y scale
 */
@@ -1810,6 +1829,49 @@ bool Plot2d_ViewFrame::isYLogEnabled() const
   return allPositive;
 }
 
+/*!
+  Remove all non-positive ordinate values
+*/
+void Plot2d_ViewFrame::doYLogEnabled()
+{
+  doLogEnabled( false );
+}
+
+/*!
+  Remove all non-positive abscissa or ordinate values
+*/
+void Plot2d_ViewFrame::doLogEnabled( const bool theIsAbscissa )
+{
+  CurveDict::ConstIterator it = myPlot->getCurves().begin();
+  for ( ; it != myPlot->getCurves().end(); it++ )
+  {
+    Plot2d_CurvePtr aCurve = it.value();
+    pointList aPointList = aCurve->getPointList();
+
+    bool isHasNegative = false;
+    pointList::iterator aPointIt = aPointList.begin();
+    for ( ; aPointIt != aPointList.end(); )
+    {
+      if( ( theIsAbscissa ? aPointIt->x : aPointIt->y ) > 0 )
+      {
+        aPointIt++;
+        continue;
+      }
+
+      aPointIt = aPointList.erase( aPointIt );
+      isHasNegative = true;
+    }
+
+    if( !isHasNegative )
+      continue;
+
+    aCurve->setPointList( aPointList );
+    updateCurve( aCurve, false );
+  }
+
+  myPlot->replot();
+}
+
 class Plot2d_QwtPlotZoomer : public QwtPlotZoomer
 {
 public:
index 59877ce9bef6155c4350a1b0ff90d4c609496a9b..a986820bd64f5fd7ee2567b3e83e89e91424cc54 100755 (executable)
@@ -127,7 +127,10 @@ public:
   // it crashes if switched to X/Y logarithmic mode, when one or more points have
   // non-positive X/Y coordinate
   bool    isXLogEnabled() const;
+  void    doXLogEnabled();
+
   bool    isYLogEnabled() const;
+  void    doYLogEnabled();
 
   virtual bool print( const QString& file = QString::null,
                       const QString& format = QString::null ) const;
@@ -158,6 +161,7 @@ protected:
   QwtPlotCurve* getPlotCurve( Plot2d_Curve* curve );
   bool    hasPlotCurve( Plot2d_Curve* curve );
   void    setCurveType( QwtPlotCurve* curve, int curveType );
+  void    doLogEnabled( const bool theIsAbscissa );
 
 public slots:
   void    onViewPan(); 
index 91d36f5f4be9423955510a424457b2fe611b186e..88c83f9051ea75f2f85aed2712243c56dc88aefb 100644 (file)
         <translation>Background color:</translation>
     </message>
     <message>
-        <source>WRN_XLOG_NOT_ALLOWED</source>
+        <source>TITLE_LOG_NOT_ALLOWED</source>
+        <translation>Logarithmic scaling not allowed</translation>
+    </message>
+    <message>
+        <source>QUESTION_XLOG_NOT_ALLOWED</source>
         <translation>Some points with non-positive abscissa values have been detected.
-Logarithmic scale for abscissa axis is not allowed.</translation>
+It is necessary to remove these points before Logarithmic scaling
+will be allowed. Some information will be lost.
+Are you sure you want to continue?</translation>
     </message>
     <message>
-        <source>WRN_YLOG_NOT_ALLOWED</source>
+        <source>QUESTION_YLOG_NOT_ALLOWED</source>
         <translation>Some points with non-positive ordinate values have been detected.
-Logarithmic scale for ordinate axis is not allowed.</translation>
+It is necessary to remove these points before Logarithmic scaling
+will be allowed. Some information will be lost.
+Are you sure you want to continue?</translation>
     </message>
     <message>
         <source>DSC_FITRECT</source>