simulator: plot curves: fix incorrect draw area limits calculation when zooming.

Fixes: lp:1674132
https://bugs.launchpad.net/kicad/+bug/1674132
This commit is contained in:
jean-pierre charras 2019-09-26 16:29:52 +02:00
parent 281d77f6b3
commit 19cf78f802
2 changed files with 31 additions and 15 deletions

View File

@ -2171,9 +2171,11 @@ void mpWindow::AdjustLimitedView()
if( !m_enableLimitedView ) if( !m_enableLimitedView )
return; return;
// m_min and m_max are plot limits for curves
// xMin, xMax, yMin, yMax are the full limits (plot limit + margin)
const double xMin = m_minX - m_marginLeft / m_scaleX; const double xMin = m_minX - m_marginLeft / m_scaleX;
const double xMax = m_maxX - m_marginRight / m_scaleX; const double xMax = m_maxX + m_marginRight / m_scaleX;
const double yMin = m_minY + m_marginTop / m_scaleY; const double yMin = m_minY - m_marginTop / m_scaleY;
const double yMax = m_maxY + m_marginBottom / m_scaleY; const double yMax = m_maxY + m_marginBottom / m_scaleY;
if( m_desiredXmin < xMin ) if( m_desiredXmin < xMin )

View File

@ -1237,12 +1237,14 @@ public:
wxCoord* printSizeX = NULL, wxCoord* printSizeY = NULL ); wxCoord* printSizeX = NULL, wxCoord* printSizeY = NULL );
/** Zoom into current view and refresh display /** Zoom into current view and refresh display
* @param centerPoint The point (pixel coordinates) that will stay in the same position on the screen after the zoom (by default, the center of the mpWindow). * @param centerPoint The point (pixel coordinates) that will stay in the same
* position on the screen after the zoom (by default, the center of the mpWindow).
*/ */
void ZoomIn( const wxPoint& centerPoint = wxDefaultPosition ); void ZoomIn( const wxPoint& centerPoint = wxDefaultPosition );
/** Zoom out current view and refresh display /** Zoom out current view and refresh display
* @param centerPoint The point (pixel coordinates) that will stay in the same position on the screen after the zoom (by default, the center of the mpWindow). * @param centerPoint The point (pixel coordinates) that will stay in the same
* position on the screen after the zoom (by default, the center of the mpWindow).
*/ */
void ZoomOut( const wxPoint& centerPoint = wxDefaultPosition ); void ZoomOut( const wxPoint& centerPoint = wxDefaultPosition );
@ -1258,7 +1260,8 @@ public:
/** Zoom out current view along Y and refresh display */ /** Zoom out current view along Y and refresh display */
void ZoomOutY(); void ZoomOutY();
/** Zoom view fitting given coordinates to the window (p0 and p1 do not need to be in any specific order) */ /** Zoom view fitting given coordinates to the window (p0 and p1 do not need to be in any specific order)
*/
void ZoomRect( wxPoint p0, wxPoint p1 ); void ZoomRect( wxPoint p0, wxPoint p1 );
/** Refresh display */ /** Refresh display */
@ -1266,7 +1269,8 @@ public:
// Added methods by Davide Rondini // Added methods by Davide Rondini
/** Counts the number of plot layers, excluding axes or text: this is to count only the layers which have a bounding box. /** Counts the number of plot layers, excluding axes or text: this is to count only the layers
* which have a bounding box.
* \return The number of profiles plotted. * \return The number of profiles plotted.
*/ */
unsigned int CountLayers(); unsigned int CountLayers();
@ -1282,28 +1286,33 @@ public:
void PrintGraph(mpPrintout *print); void PrintGraph(mpPrintout *print);
#endif #endif
/** Returns the left-border layer coordinate that the user wants the mpWindow to show (it may be not exactly the actual shown coordinate in the case of locked aspect ratio). /** Returns the left-border layer coordinate that the user wants the mpWindow to show
* (it may be not exactly the actual shown coordinate in the case of locked aspect ratio).
* @sa Fit * @sa Fit
*/ */
double GetDesiredXmin() { return m_desiredXmin; } double GetDesiredXmin() { return m_desiredXmin; }
/** Returns the right-border layer coordinate that the user wants the mpWindow to show (it may be not exactly the actual shown coordinate in the case of locked aspect ratio). /** Returns the right-border layer coordinate that the user wants the mpWindow to show
* (it may be not exactly the actual shown coordinate in the case of locked aspect ratio).
* @sa Fit * @sa Fit
*/ */
double GetDesiredXmax() { return m_desiredXmax; } double GetDesiredXmax() { return m_desiredXmax; }
/** Returns the bottom-border layer coordinate that the user wants the mpWindow to show (it may be not exactly the actual shown coordinate in the case of locked aspect ratio). /** Returns the bottom-border layer coordinate that the user wants the mpWindow to show
* (it may be not exactly the actual shown coordinate in the case of locked aspect ratio).
* @sa Fit * @sa Fit
*/ */
double GetDesiredYmin() { return m_desiredYmin; } double GetDesiredYmin() { return m_desiredYmin; }
/** Returns the top layer-border coordinate that the user wants the mpWindow to show (it may be not exactly the actual shown coordinate in the case of locked aspect ratio). /** Returns the top layer-border coordinate that the user wants the mpWindow to show
* (it may be not exactly the actual shown coordinate in the case of locked aspect ratio).
* @sa Fit * @sa Fit
*/ */
double GetDesiredYmax() { return m_desiredYmax; } double GetDesiredYmax() { return m_desiredYmax; }
/** Returns the bounding box coordinates /** Returns the bounding box coordinates
* @param bbox Pointer to a 6-element double array where to store bounding box coordinates. */ * @param bbox Pointer to a 6-element double array where to store bounding box coordinates.
*/
void GetBoundingBox( double* bbox ); void GetBoundingBox( double* bbox );
/** Enable/disable scrollbars /** Enable/disable scrollbars
@ -1323,10 +1332,13 @@ public:
wxSize imageSize = wxDefaultSize, bool fit = false ); wxSize imageSize = wxDefaultSize, bool fit = false );
/** This value sets the zoom steps whenever the user clicks "Zoom in/out" or performs zoom with the mouse wheel. /** This value sets the zoom steps whenever the user clicks "Zoom in/out" or performs zoom with the mouse wheel.
* It must be a number above unity. This number is used for zoom in, and its inverse for zoom out. Set to 1.5 by default. */ * It must be a number above unity. This number is used for zoom in, and its inverse for zoom out.
* Set to 1.5 by default.
*/
static double zoomIncrementalFactor; static double zoomIncrementalFactor;
/** Set window margins, creating a blank area where some kinds of layers cannot draw. This is useful for example to draw axes outside the area where the plots are drawn. /** Set window margins, creating a blank area where some kinds of layers cannot draw.
* This is useful for example to draw axes outside the area where the plots are drawn.
* @param top Top border * @param top Top border
* @param right Right border * @param right Right border
* @param bottom Bottom border * @param bottom Bottom border
@ -1492,7 +1504,8 @@ protected:
int m_clickedX; // !< Last mouse click X position, for centering and zooming the view int m_clickedX; // !< Last mouse click X position, for centering and zooming the view
int m_clickedY; // !< Last mouse click Y position, for centering and zooming the view int m_clickedY; // !< Last mouse click Y position, for centering and zooming the view
/** These are updated in Fit() only, and may be different from the real borders (layer coordinates) only if lock aspect ratio is true. /** These are updated in Fit() only, and may be different from the real borders
* (layer coordinates) only if lock aspect ratio is true.
*/ */
double m_desiredXmin, m_desiredXmax, m_desiredYmin, m_desiredYmax; double m_desiredXmin, m_desiredXmax, m_desiredYmin, m_desiredYmax;
@ -1808,7 +1821,8 @@ class WXDLLIMPEXP_MATHPLOT mpCovarianceEllipse : public mpMovableObject
{ {
public: public:
/** Default constructor. /** Default constructor.
* Initializes to a unity diagonal covariance matrix, a 95% confidence interval (2 sigmas), 32 segments, and a continuous plot (m_continuous=true). * Initializes to a unity diagonal covariance matrix, a 95% confidence interval (2 sigmas),
* 32 segments, and a continuous plot (m_continuous=true).
*/ */
mpCovarianceEllipse( double cov_00 = 1, mpCovarianceEllipse( double cov_00 = 1,
double cov_11 = 1, double cov_11 = 1,