30#include "wx/dcclient.h"
36#include <wx/graphics.h>
50#define mpLEGEND_MARGIN 5
51#define mpLEGEND_LINEWIDTH 10
60IMPLEMENT_ABSTRACT_CLASS(
mpLayer, wxObject )
65 SetPen( (wxPen&) *wxBLACK_PEN );
66 SetFont( (wxFont&) *wxNORMAL_FONT );
80 m_dim = wxRect( 0, 0, 1, 1 );
81 m_brush = *wxTRANSPARENT_BRUSH;
82 m_reference.x = 0; m_reference.y = 0;
108 return m_dim.Contains( point );
166 return m_dim.GetPosition();
172 return m_dim.GetSize();
237 dc.GetTextExtent( label, &tmpX, &tmpY );
238 textX = ( textX > tmpX + baseWidth ) ? textX : tmpX + baseWidth +
mpLEGEND_MARGIN;
250 m_dim.height = textY;
261 dc.GetTextExtent( label, &tmpX, &tmpY );
306 if(
m_pen.GetWidth() <= 1 )
308 for( wxCoord i = startPx; i < endPx; ++i )
313 if( (iy >= minYpx) && (iy <= maxYpx) )
314 dc.DrawPoint( i, iy );
319 for( wxCoord i = startPx; i < endPx; ++i )
324 if( iy >= minYpx && iy <= maxYpx )
325 dc.DrawLine( i, iy, i, iy );
334 dc.GetTextExtent(
m_name, &tx, &ty );
372 if(
m_pen.GetWidth() <= 1 )
374 for( i = minYpx; i < maxYpx; ++i )
378 if( (ix >= startPx) && (ix <= endPx) )
379 dc.DrawPoint( ix, i );
384 for( i = 0; i< w.
GetScrY(); ++i )
388 if( (ix >= startPx) && (ix <= endPx) )
389 dc.DrawLine( ix, i, ix, i );
398 dc.GetTextExtent(
m_name, &tx, &ty );
424 maxDrawX = minDrawX = maxDrawY = minDrawY = 0;
446 wxCHECK_RET(
m_scaleX, wxS(
"X scale was not set" ) );
447 wxCHECK_RET(
m_scaleY, wxS(
"Y scale was not set" ) );
458 if( endPx <= startPx || minYpx >= maxYpx )
474 dc.SetClippingRegion( startPx, minYpx, endPx - startPx + 1, maxYpx - minYpx + 1 );
480 std::set<wxCoord> ys;
486 wxCoord newX = w.
x2p( px );
497 ys.insert( w.
y2p( py ) );
503 if( (ix >= startPx) && (ix <= endPx) && (iy >= minYpx) && (iy <= maxYpx) )
507 if(
m_pen.GetWidth() <= 1 )
508 dc.DrawPoint( ix, iy );
510 dc.DrawLine( ix, iy, ix, iy );
518 ys.insert( w.
y2p( py ) );
533 std::vector<wxPoint>pointList;
534 pointList.reserve( ( endPx - startPx ) * 2 );
538 bool hasNext =
GetNextXY( nextX, nextY );
539 bool offRight =
false;
556 wxCoord x1 = w.
x2p( px );
557 wxCoord y1 = w.
y2p( py );
567 if( nextX1 < startPx-1 )
570 else if( x1 > endPx )
578 if( !count || line_start.x != x1 )
584 if( count && dupx0 > 1 && abs( ymax0 - ymin0 ) > 2 )
585 dc.DrawLine( x0, ymin0, x0, ymax0 );
591 pointList.emplace_back( wxPoint( x1, y1 ) );
599 ymin0 = std::min( ymin0, y1 );
600 ymax0 = std::max( ymax0, y1 );
606 if( pointList.size() > 1 )
613 std::vector<wxPoint> drawPoints;
614 drawPoints.reserve( ( endPx - startPx ) * 2 );
617 int chunkSize = 10000;
619 int chunkSize = 100000;
621 if( dc.GetPen().GetStyle() == wxPENSTYLE_DOT )
624 drawPoints.push_back( pointList[0] );
626 for(
size_t ii = 1; ii < pointList.size()-1; ii++ )
630 if( drawPoints.back().y == pointList[ii].y &&
631 drawPoints.back().y == pointList[ii+1].y )
637 drawPoints.push_back( pointList[ii] );
639 if( (
int) drawPoints.size() > chunkSize )
641 dc.DrawLines( (
int) drawPoints.size(), &drawPoints[0] );
645 drawPoints.push_back( pointList[ii] );
651 if( drawPoints.back() != pointList.back() )
652 drawPoints.push_back( pointList.back() );
654 dc.DrawLines( (
int) drawPoints.size(), &drawPoints[0] );
663 dc.GetTextExtent(
m_name, &tx, &ty );
687 dc.DrawText(
m_name, tx, ty );
690 dc.DestroyClippingRegion();
698#define mpLN10 2.3025850929940456840179914546844
702 double minV, maxV, minVvis, maxVvis;
712 double minErr = 1000000000000.0;
713 double bestStep = 1.0;
716 for(
int i = 10; i <= 20; i += 2 )
718 double curr_step = fabs( maxVvis - minVvis ) / (double) i;
719 double base = pow( 10, floor( log10( curr_step ) ) );
720 double stepInt = floor( curr_step / base ) * base;
721 double err = fabs( curr_step - stepInt );
730 double numberSteps = floor( ( maxVvis - minVvis ) / bestStep );
735 while( numberSteps - 2.0 >= m_scrX/96.0 )
738 numberSteps = floor( ( maxVvis - minVvis ) / bestStep );
741 double v = floor( minVvis / bestStep ) * bestStep;
742 double zeroOffset = 100000000.0;
748 if( fabs( v ) < zeroOffset )
749 zeroOffset = fabs( v );
754 if( zeroOffset <= bestStep )
796 const wxString s = tickLabel.label;
798 dc.GetTextExtent( s, &tx, &ty );
817 double pymin = w.
p2y( minYpx );
818 double pymax = w.
p2y( maxYpx );
840 double y_slave0 = p0 /
m_scale;
841 double y_slave1 = p1 /
m_scale;
843 double dy_slave = (y_slave1 - y_slave0);
844 double exponent = floor( log10( dy_slave ) );
845 double base = dy_slave / pow( 10.0, exponent );
847 double dy_scaled = ceil( 2.0 * base ) / 2.0 * pow( 10.0, exponent );
853 minvv = floor( minvv / dy_scaled ) * dy_scaled;
856 m_scale *= dy_slave / dy_scaled;
876 double minVvis, maxVvis;
901 double minErr = 1000000000000.0;
902 double bestStep = 1.0;
905 for(
int i = 10; i <= 20; i += 2 )
907 double curr_step = fabs( maxVvis - minVvis ) / (double) i;
908 double base = pow( 10, floor( log10( curr_step ) ) );
909 double stepInt = floor( curr_step / base ) * base;
910 double err = fabs( curr_step - stepInt );
919 double numberSteps = floor( ( maxVvis - minVvis ) / bestStep );
923 while( numberSteps >= m_scrY/32.0 )
926 numberSteps = floor( ( maxVvis - minVvis ) / bestStep );
929 double v = floor( minVvis / bestStep ) * bestStep;
930 double zeroOffset = 100000000.0;
931 const int iterLimit = 1000;
934 while( v <= maxVvis && i < iterLimit )
938 if( fabs( v ) < zeroOffset )
939 zeroOffset = fabs( v );
949 if( zeroOffset <= bestStep )
966 double pxmin = w.
p2x( startPx );
967 double pxmax = w.
p2x( endPx );
976 double minV, maxV, minVvis, maxVvis;
982 double minDecade = pow( 10, floor( log10( minV ) ) );
983 double maxDecade = pow( 10, ceil( log10( maxV ) ) );
984 double visibleDecades = log( maxVvis / minVvis ) / log( 10 );
993 if( minDecade == 0.0 )
999 while( visibleDecades - 2 >= m_scrX / 96.0 )
1002 visibleDecades = log( maxVvis / minVvis ) / log( step );
1005 for( d = minDecade; d<=maxDecade; d *= step )
1009 for(
double dd = d; dd < d * step; dd += d )
1011 if( visibleDecades < 2 )
1029 SetFont( (wxFont&) *wxSMALL_FONT );
1030 SetPen( (wxPen&) *wxGREY_PEN );
1064 const int extend = w.
GetScrX();
1095 if( p >= startPx && p <= endPx )
1100 dc.DrawLine( p, orgy, p, orgy - 4 );
1102 dc.DrawLine( p, orgy, p, orgy + 4 );
1106 m_pen.SetStyle( wxPENSTYLE_DOT );
1111 m_pen.SetStyle( wxPENSTYLE_DOT );
1113 dc.DrawLine( p, orgy + 4, p, minYpx );
1114 m_pen.SetStyle( wxPENSTYLE_SOLID );
1116 dc.DrawLine( p, orgy + 4, p, orgy - 4 );
1121 dc.DrawLine( p, orgy - 4, p, maxYpx );
1123 dc.DrawLine( p, minYpx, p, maxYpx );
1126 m_pen.SetStyle( wxPENSTYLE_SOLID );
1132 m_pen.SetStyle( wxPENSTYLE_SOLID );
1134 dc.DrawLine( startPx, minYpx, endPx, minYpx );
1135 dc.DrawLine( startPx, maxYpx, endPx, maxYpx );
1141 if( !tickLabel.visible )
1147 if( (p >= startPx) && (p <= endPx) )
1150 wxString s = tickLabel.label;
1152 dc.GetTextExtent( s, &tx, &ty );
1155 dc.DrawText( s, p - tx / 2, orgy - 4 - ty );
1157 dc.DrawText( s, p - tx / 2, orgy + 4 );
1162 dc.GetTextExtent(
m_name, &tx, &ty );
1167 dc.DrawText(
m_name, extend - tx - 4, orgy - 8 - ty - labelH );
1171 dc.DrawText(
m_name, (endPx + startPx) / 2 - tx / 2, orgy + 6 + labelH );
1175 dc.DrawText(
m_name, extend - tx - 4, orgy - 4 - ty );
1180 dc.DrawText(
m_name, (endPx - startPx - tx) >> 1, orgy - 6 - ty - labelH );
1182 dc.DrawText(
m_name, extend - tx - 4, orgy + 4 );
1187 dc.DrawText(
m_name, extend - tx - 4, orgy + 6 + labelH );
1202 SetFont( (wxFont&) *wxSMALL_FONT );
1203 SetPen( (wxPen&) *wxGREY_PEN );
1207 m_masterScale =
nullptr;
1248 dc.DrawLine( orgx, minYpx, orgx, maxYpx );
1256 int labelHeight = 0;
1258 dc.GetTextExtent( s, &tx, &labelHeight );
1265 if( p >= minYpx && p <= maxYpx )
1270 dc.DrawLine( orgx, p, orgx + 4, p );
1272 dc.DrawLine( orgx - 4, p, orgx, p );
1276 dc.DrawLine( orgx - 4, p, orgx + 4, p );
1278 m_pen.SetStyle( wxPENSTYLE_DOT );
1281 dc.DrawLine( orgx - 4, p, endPx, p );
1283 m_pen.SetStyle( wxPENSTYLE_SOLID );
1296 if( !tickLabel.visible )
1299 if( p >= minYpx && p <= maxYpx )
1301 s = tickLabel.label;
1302 dc.GetTextExtent( s, &tx, &ty );
1305 dc.DrawText( s, orgx + 4, p - ty / 2 );
1307 dc.DrawText( s, orgx - 4 - tx, p - ty / 2 );
1313 dc.GetTextExtent(
m_name, &tx, &ty );
1318 dc.DrawText(
m_name, labelW + 8, 4 );
1322 dc.DrawText(
m_name, orgx - ( tx / 2 ), minYpx - ty - 4 );
1326 dc.DrawText(
m_name, orgx + 4, 4 );
1331 dc.DrawText(
m_name, orgx - ( tx / 2 ), minYpx - ty - 4 );
1335 dc.DrawText(
m_name, orgx - 6 - tx - labelW, 4 );
1349IMPLEMENT_DYNAMIC_CLASS(
mpWindow, wxWindow )
1351BEGIN_EVENT_TABLE(
mpWindow, wxWindow )
1373 initializeGraphicsContext();
1386 m_popmenu.Append(
mpID_FIT,
_(
"Fit on Screen" ),
_(
"Set plot view to show all items" ) );
1389 SetBackgroundColour( *wxWHITE );
1393 SetSizeHints( 128, 128 );
1396 SetBackgroundStyle( wxBG_STYLE_CUSTOM );
1430 float zoom =
event.GetMagnification() + 1.0f;
1431 wxPoint pos( event.GetX(), event.GetY() );
1435 else if(
zoom < 1.0f )
1450 const wxMouseWheelAxis axis =
event.GetWheelAxis();
1451 const int modifiers =
event.GetModifiers();
1454 if( axis == wxMOUSE_WHEEL_HORIZONTAL )
1458 else if( modifiers == wxMOD_NONE )
1462 else if( modifiers == wxMOD_CONTROL )
1466 else if( modifiers == wxMOD_SHIFT )
1470 else if( modifiers == wxMOD_ALT )
1494 wxCursor
cursor = wxCURSOR_MAGNIFIER;
1496 if( event.m_middleDown )
1523 else if( event.m_leftDown )
1528 cursor = wxCURSOR_SIZING;
1530 cursor = wxCURSOR_SIZEWE;
1538 cursor = wxCURSOR_MAGNIFIER;
1540 wxClientDC dc(
this );
1543 dc.SetBrush( *wxTRANSPARENT_BRUSH );
1559 if( layer->IsInfo() && layer->IsVisible() )
1563 if( infoLayer->
Inside( event.GetPosition() ) )
1566 cursor = wxCURSOR_SIZING;
1568 cursor = wxCURSOR_SIZEWE;
1585 wxPoint pointClicked =
event.GetPosition();
1594 wxPoint release( event.GetX(), event.GetY() );
1606 if( release != press )
1622void mpWindow::Fit(
double xMin,
double xMax,
double yMin,
double yMax,
const wxCoord* printSizeX,
1623 const wxCoord* printSizeY, wxOrientation directions )
1625 const bool isPrinting = printSizeX !=
nullptr && printSizeY !=
nullptr;
1628 double newDesiredXmin = xMin;
1629 double newDesiredXmax = xMax;
1630 double newDesiredYmin = yMin;
1631 double newDesiredYmax = yMax;
1648 newScrX = *printSizeX;
1649 newScrY = *printSizeY;
1654 GetClientSize( &newScrX, &newScrY );
1662 double desiredSpanX = xMax - xMin;
1663 double desiredSpanY = yMax - yMin;
1664 double newScaleX = ( desiredSpanX != 0 ) ?
double( plotScreenWidth ) / desiredSpanX : 1;
1665 double newScaleY = ( desiredSpanY != 0 ) ?
double( plotScreenHeight ) / desiredSpanY : 1;
1670 double newPosY = yMax + (
m_marginTop / newScaleY );
1673 if( ( ( directions & wxHORIZONTAL ) != 0 ) || isPrinting )
1687 if( ( ( directions & wxVERTICAL ) != 0 ) || isPrinting )
1718 if( ( directions & wxHORIZONTAL ) != 0 )
1737 if( ( directions & wxVERTICAL ) != 0 )
1789void mpWindow::ZoomIn(
const wxPoint& centerPoint,
double zoomFactor, wxOrientation directions )
1791 DoZoom( centerPoint, zoomFactor, directions );
1803 if( zoomFactor == 0 )
1805 DoZoom( centerPoint, 1.0 / zoomFactor, directions );
1818 p0.x = std::max( p0.x, pMinX );
1819 p0.x = std::min( p0.x, pMaxX );
1820 p0.y = std::max( p0.y, pMinY );
1821 p0.y = std::min( p0.y, pMaxY );
1822 p1.x = std::max( p1.x, pMinX );
1823 p1.x = std::min( p1.x, pMaxX );
1824 p1.y = std::max( p1.y, pMinY );
1825 p1.y = std::min( p1.y, pMaxY );
1828 double p0x =
p2x( p0.x );
1829 double p0y =
p2y( p0.y );
1830 double p1x =
p2x( p1.x );
1831 double p1y =
p2y( p1.y );
1834 double zoom_x_min = p0x<p1x ? p0x : p1x;
1835 double zoom_x_max = p0x>p1x ? p0x : p1x;
1836 double zoom_y_min = p0y<p1y ? p0y : p1y;
1837 double zoom_y_max = p0y>p1y ? p0y : p1y;
1845 Fit( zoom_x_min, zoom_x_max, zoom_y_min, zoom_y_max );
1854 if( directionsNeedingRefitting != 0 )
1906 PopupMenu( &
m_popmenu, event.GetX(), event.GetY() );
1976 if( refreshDisplay )
1988 wxLayerList::iterator layIt;
1992 if( *layIt == layer )
1995 if( alsoDeleteObject )
2000 if( refreshDisplay )
2016 if( alsoDeleteObject )
2022 if( refreshDisplay )
2029 wxPaintDC paintDC(
this );
2034 wxDC* targetDC = &paintDC;
2051 if( wxGraphicsContext* ctx = targetDC->GetGraphicsContext() )
2053 if( !ctx->SetInterpolationQuality( wxINTERPOLATION_BEST ) )
2054 if( !ctx->SetInterpolationQuality( wxINTERPOLATION_GOOD ) )
2055 ctx->SetInterpolationQuality( wxINTERPOLATION_FAST );
2057 ctx->SetAntialiasMode( wxANTIALIAS_DEFAULT );
2061 targetDC->SetPen( *wxTRANSPARENT_PEN );
2062 wxBrush brush( GetBackgroundColour() );
2063 targetDC->SetBrush( brush );
2069 layer->Plot( *targetDC, *
this );
2074 targetDC->SetPen( pen );
2075 targetDC->SetBrush( *wxTRANSPARENT_BRUSH );
2084void mpWindow::DoZoom(
const wxPoint& centerPoint,
double zoomFactor, wxOrientation directions )
2088 if( directions == wxVERTICAL )
2090 directions = wxHORIZONTAL;
2093 const bool horizontally = ( directions & wxHORIZONTAL ) != 0;
2094 const bool vertically = ( directions & wxVERTICAL ) != 0;
2099 wxPoint c( centerPoint );
2100 if( c == wxDefaultPosition )
2116 const double newScaleX = horizontally ? (
m_scaleX * zoomFactor ) :
m_scaleX;
2117 const double newScaleY = vertically ? (
m_scaleY * zoomFactor ) :
m_scaleY;
2126 const double prior_layer_x =
p2x( c.x );
2130 m_posX = prior_layer_x - c.x / newScaleX;
2139 const double prior_layer_y =
p2y( c.y );
2143 m_posY = prior_layer_y + c.y / newScaleY;
2151 if( zoomFactor < 1.0 )
2159 if( directionsNeedingRefitting != 0 )
2170 const double plotSpanX = plotScreenWidth /
m_scaleX;
2181 const double plotSpanY = plotScreenHeight /
m_scaleY;
2192 return static_cast<wxOrientation
>( 0 );
2199 wxOrientation result = {};
2201 if( ( directions & wxHORIZONTAL ) != 0 )
2204 result =
static_cast<wxOrientation
>( result | wxHORIZONTAL );
2207 if( ( directions & wxVERTICAL ) != 0 )
2210 result =
static_cast<wxOrientation
>( result | wxVERTICAL );
2219 const int change =
event.GetWheelRotation();
2220 const double changeUnitsX = change /
m_scaleX;
2221 const double changeUnitsY = change /
m_scaleY;
2222 const wxPoint clickPt( event.GetX(), event.GetY() );
2250 if( event.GetWheelRotation() > 0 )
2257 if( event.GetWheelRotation() > 0 )
2264 if( event.GetWheelRotation() > 0 )
2306 if( ( position >= (
int)
m_layers.size() ) || position < 0 )
2317 if( !layer->GetName().Cmp(
name ) )
2338 if( aImageSize == wxDefaultSize )
2345 sizeX = aImageSize.x;
2346 sizeY = aImageSize.y;
2350 wxBitmap screenBuffer( sizeX, sizeY );
2351 wxMemoryDC screenDC;
2352 screenDC.SelectObject( screenBuffer );
2353 screenDC.SetPen( *wxWHITE_PEN );
2355 wxBrush brush( GetBackgroundColour() );
2356 screenDC.SetBrush( brush );
2357 screenDC.DrawRectangle( 0, 0, sizeX, sizeY );
2366 layer->Plot( screenDC, *
this );
2368 if( aImageSize != wxDefaultSize )
2373 SetScr( bk_scrX, bk_scrY );
2379 aImage = screenBuffer.ConvertToImage();
2398 if( layer->IsInfo() )
2402 if( tmpLyr->
Inside( point ) )
2415 lx->SetVisible( viewable );
2424 return lx->IsVisible();
2434 lx->SetVisible( viewable );
2443 return lx->IsVisible();
2450 const wxColour& axesColour )
2452 SetBackgroundColour( bgColour );
2453 SetForegroundColour( drawColour );
2463 wxPen axisPen = layer->GetPen();
2464 axisPen.SetColour( axesColour );
2465 layer->SetPen( axisPen );
2470 wxPen infoPen = layer->GetPen();
2471 infoPen.SetColour( drawColour );
2472 layer->SetPen( infoPen );
2478template <
typename... Ts>
2480 wxWindow(
std::forward<Ts>( windowArgs )... ),
2494 m_desiredXmin( 0.0 ),
2495 m_desiredXmax( 1.0 ),
2496 m_desiredYmin( 0.0 ),
2497 m_desiredYmax( 1.0 ),
2498 m_topBottomPlotGapFactor( 0.03 ),
2499 m_leftRightPlotGapFactor( 0.0 ),
2502 m_marginBottom( 0 ),
2506 m_buff_bmp( nullptr ),
2507 m_enableDoubleBuffer( false ),
2508 m_enableMouseNavigation( true ),
2509 m_enableLimitedView( false ),
2510 m_mouseWheelActions( defaultMouseWheelActions() ),
2511 m_movingInfoLayer( nullptr ),
2518 if( wxGraphicsContext* ctx =
m_buff_dc.GetGraphicsContext() )
2520 if( !ctx->SetInterpolationQuality( wxINTERPOLATION_BEST )
2521 || !ctx->SetInterpolationQuality( wxINTERPOLATION_GOOD ) )
2523 ctx->SetInterpolationQuality( wxINTERPOLATION_FAST );
2526 ctx->SetAntialiasMode( wxANTIALIAS_DEFAULT );
2577 double xlogmin = log10(
m_minV );
2578 double xlogmax = log10(
m_maxV );
2580 return ( log10( x ) - xlogmin) / (xlogmax - xlogmin);
2586 double xlogmin = log10(
m_minV );
2587 double xlogmax = log10(
m_maxV );
2589 return pow( 10.0, xplot * (xlogmax - xlogmin) + xlogmin );
2632 if( xs.size() != ys.size() )
2647 for(
const double x : xs )
2656 for(
const double y : ys )
A class providing graphs functionality for a 2D plot (either continuous or a set of points),...
void SetSweepWindow(int aSweepIdx) override
bool GetNextXY(double &x, double &y) override
Get locus value for next N.
std::vector< double > m_ys
double m_minX
Loaded at SetData.
std::vector< double > m_xs
The internal copy of the set of data to draw.
virtual void SetData(const std::vector< double > &xs, const std::vector< double > &ys)
Changes the internal data: the set of points to draw.
void Clear()
Clears all the data, leaving the layer empty.
void Rewind() override
Rewind value enumeration with mpFXY::GetNextXY.
Abstract base class providing plot and labeling functionality for a locus plot F:N->X,...
double s2y(double plotCoordY) const
virtual void SetScale(mpScaleBase *scaleX, mpScaleBase *scaleY)
virtual void Rewind()=0
Rewind value enumeration with mpFXY::GetNextXY.
virtual void SetSweepWindow(int aSweepIdx)
virtual size_t GetCount() const =0
virtual void Plot(wxDC &dc, mpWindow &w) override
Layer plot handler.
double y2s(double y) const
void UpdateViewBoundary(wxCoord xnew, wxCoord ynew)
Update label positioning data.
double x2s(double x) const
virtual int GetSweepCount() const
double s2x(double plotCoordX) const
virtual bool GetNextXY(double &x, double &y)=0
Get locus value for next N.
Abstract base class providing plot and labeling functionality for functions F:X->Y.
virtual double GetY(double x) const =0
Get function value for argument.
virtual void Plot(wxDC &dc, mpWindow &w) override
Layer plot handler.
Abstract base class providing plot and labeling functionality for functions F:Y->X.
virtual double GetX(double y) const =0
Get function value for argument.
virtual void Plot(wxDC &dc, mpWindow &w) override
Layer plot handler.
Base class to create small rectangular info boxes mpInfoLayer is the base class to create a small rec...
virtual ~mpInfoLayer()
Destructor.
mpInfoLayer()
Default constructor.
wxPoint GetPosition() const
Returns the position of the upper left corner of the box (in pixels)
virtual void Plot(wxDC &dc, mpWindow &w) override
Plot method.
virtual void UpdateReference()
Updates the rectangle reference point.
virtual bool Inside(const wxPoint &point) const
Checks whether a point is inside the info box rectangle.
virtual void Move(wxPoint delta)
Moves the layer rectangle of given pixel deltas.
wxSize GetSize() const
Returns the size of the box (in pixels)
Implements the legend to be added to the plot This layer allows you to add a legend to describe the p...
mpInfoLegend()
Default constructor.
virtual void Plot(wxDC &dc, mpWindow &w) override
Plot method.
~mpInfoLegend()
Default destructor.
const wxString & GetDisplayName() const
mpLayerType GetLayerType() const
Get layer type: a Layer can be of different types: plot lines, axis, info boxes, etc,...
bool IsVisible() const
Checks whether the layer is visible or not.
virtual double GetMinY() const
Get inclusive bottom border of bounding box.
const wxPen & GetPen() const
Get pen set for this layer.
virtual double GetMaxX() const
Get inclusive right border of bounding box.
virtual double GetMinX() const
Get inclusive left border of bounding box.
virtual double GetMaxY() const
Get inclusive top border of bounding box.
Plot layer implementing a x-scale ruler.
virtual void recalculateTicks(wxDC &dc, mpWindow &w)
void GetDataRange(double &minV, double &maxV) const
std::vector< double > m_tickValues
virtual double TransformToPlot(double x) const
virtual void formatLabels()
void computeLabelExtents(wxDC &dc, mpWindow &w)
virtual void ExtendDataRange(double minV, double maxV)
std::vector< TICK_LABEL > m_tickLabels
void updateTickLabels(wxDC &dc, mpWindow &w)
virtual double TransformFromPlot(double xplot) const
virtual void getVisibleDataRange(mpWindow &w, double &minV, double &maxV) override
virtual void Plot(wxDC &dc, mpWindow &w) override
Plot given view of layer to the given device context.
mpScaleXLog(const wxString &name=wxT("log(X)"), int flags=mpALIGN_CENTER, bool ticks=true, unsigned int type=mpX_NORMAL)
Full constructor.
virtual double TransformFromPlot(double xplot) const override
virtual double TransformToPlot(double x) const override
void recalculateTicks(wxDC &dc, mpWindow &w) override
virtual double TransformToPlot(double x) const override
virtual double TransformFromPlot(double xplot) const override
virtual void recalculateTicks(wxDC &dc, mpWindow &w) override
mpScaleX(const wxString &name=wxT("X"), int flags=mpALIGN_CENTER, bool ticks=true, unsigned int type=mpX_NORMAL)
Full constructor.
Plot layer implementing a y-scale ruler.
virtual void getVisibleDataRange(mpWindow &w, double &minV, double &maxV) override
virtual double TransformFromPlot(double xplot) const override
void computeSlaveTicks(mpWindow &w)
virtual void Plot(wxDC &dc, mpWindow &w) override
Layer plot handler.
virtual void recalculateTicks(wxDC &dc, mpWindow &w) override
virtual double TransformToPlot(double x) const override
Canvas for plotting mpLayer implementations.
bool SaveScreenshot(wxImage &aImage, wxSize aImageSize=wxDefaultSize, bool aFit=false)
Draw the window on a wxBitmap, then save it to a file.
mpInfoLayer * m_movingInfoLayer
void DelAllLayers(bool alsoDeleteObject, bool refreshDisplay=true)
Remove all layers from the plot.
void SetColourTheme(const wxColour &bgColour, const wxColour &drawColour, const wxColour &axesColour)
Set Color theme.
virtual bool SetYView(double pos, double desiredMax, double desiredMin)
Applies new Y view coordinates depending on the settings.
void ZoomRect(wxPoint p0, wxPoint p1)
Zoom view fitting given coordinates to the window (p0 and p1 do not need to be in any specific order)
void onMouseLeftRelease(wxMouseEvent &event)
int GetMarginLeft() const
bool m_enableMouseNavigation
void RecomputeDesiredY(double &min, double &max)
wxOrientation ViewNeedsRefitting(wxOrientation directions) const
void OnPaint(wxPaintEvent &event)
void OnShowPopupMenu(wxMouseEvent &event)
void onMouseLeftDown(wxMouseEvent &event)
void onMouseWheel(wxMouseEvent &event)
static MouseWheelActionSet defaultMouseWheelActions()
void SetMargins(int top, int right, int bottom, int left)
Set window margins, creating a blank area where some kinds of layers cannot draw.
MouseWheelActionSet m_mouseWheelActions
int GetScrX() const
Get current view's X dimension in device context units.
int GetScrY() const
Get current view's Y dimension in device context units.
double p2x(wxCoord pixelCoordX)
Converts mpWindow (screen) pixel coordinates into graph (floating point) coordinates,...
double p2y(wxCoord pixelCoordY)
Converts mpWindow (screen) pixel coordinates into graph (floating point) coordinates,...
void initializeGraphicsContext()
void RecomputeDesiredX(double &min, double &max)
wxCoord x2p(double x)
Converts graph (floating point) coordinates into mpWindow (screen) pixel coordinates,...
MouseWheelAction
Enumerates the possible mouse wheel actions that can be performed on the plot.
double m_leftRightPlotGapFactor
mpInfoLayer * IsInsideInfoLayer(wxPoint &point)
Check if a given point is inside the area of a mpInfoLayer and eventually returns its pointer.
void OnMouseMiddleDown(wxMouseEvent &event)
std::stack< std::array< double, 4 > > m_redoZoomStack
void SetLayerVisible(const wxString &name, bool viewable)
Sets the visibility of a layer by its name.
void DoZoom(const wxPoint ¢erPoint, double zoomFactor, wxOrientation directions)
mpLayer * GetLayer(int position) const
void onZoomRedo(wxCommandEvent &event)
void ZoomIn(const wxPoint ¢erPoint=wxDefaultPosition)
Zoom into current view and refresh display.
void ZoomOut(const wxPoint ¢erPoint=wxDefaultPosition)
Zoom out current view and refresh display.
virtual bool UpdateBBox()
Recalculate global layer bounding box, and save it in m_minX,...
bool DelLayer(mpLayer *layer, bool alsoDeleteObject=false, bool refreshDisplay=true)
Remove a plot layer from the canvas.
void UpdateAll()
Refresh display.
void AdjustLimitedView(wxOrientation directions=wxBOTH)
Limits the zoomed or panned view to the area used by the plots.
wxCoord y2p(double y)
Converts graph (floating point) coordinates into mpWindow (screen) pixel coordinates,...
void OnCenter(wxCommandEvent &event)
virtual bool SetXView(double pos, double desiredMax, double desiredMin)
Applies new X view coordinates depending on the settings.
void SetScaleX(double scaleX)
Set current view's X scale and refresh display.
void onMagnify(wxMouseEvent &event)
double m_topBottomPlotGapFactor
void onZoomOut(wxCommandEvent &event)
void pushZoomUndo(const std::array< double, 4 > &aZoom)
std::stack< std::array< double, 4 > > m_undoZoomStack
int GetMarginRight() const
void GetBoundingBox(double *bbox) const
Returns the bounding box coordinates.
void SetScr(int scrX, int scrY)
Set current view's dimensions in device context units.
int GetMarginBottom() const
void PerformMouseWheelAction(wxMouseEvent &event, MouseWheelAction action)
static double zoomIncrementalFactor
This value sets the zoom steps whenever the user clicks "Zoom in/out" or performs zoom with the mouse...
double m_desiredXmin
These are updated in Fit, ZoomIn, ZoomOut, ZoomRect, SetXView, SetYView and may be different from the...
bool m_enableDoubleBuffer
void OnFit(wxCommandEvent &event)
void OnSize(wxSizeEvent &event)
const mpLayer * GetLayerByName(const wxString &name) const
unsigned int CountAllLayers() const
Counts the number of plot layers, whether or not they have a bounding box.
void SetPos(double posX, double posY)
Set current view's X and Y position and refresh display.
void onZoomIn(wxCommandEvent &event)
double GetScaleY() const
Get current view's Y scale.
double GetScaleX() const
Get current view's X scale.
bool AddLayer(mpLayer *layer, bool refreshDisplay=true)
Add a plot layer to the canvas.
void Fit() override
Set view to fit global bounding box of all plot layers and refresh display.
void onZoomUndo(wxCommandEvent &event)
double GetPosY() const
Get current view's Y position.
void onMouseMove(wxMouseEvent &event)
double GetPosX() const
Get current view's X position.
bool IsLayerVisible(const wxString &name) const
Check whether a layer with given name is visible.
#define mpLEGEND_LINEWIDTH
#define mpALIGN_BORDER_RIGHT
Aligns Y axis to right border.
#define mpALIGN_RIGHT
Aligns label to the right.
#define mpALIGN_NW
Aligns label to north-west.
#define mpALIGN_FAR_RIGHT
Aligns label to the right of mpALIGN_RIGHT.
#define mpALIGN_BORDER_TOP
Aligns X axis to top border.
#define mpALIGN_CENTER
Aligns label to the center.
#define mpALIGN_LEFT
Aligns label to the left.
#define mpALIGN_TOP
Aligns label to the top.
#define mpALIGN_BORDER_LEFT
Aligns Y axis to left border.
#define mpALIGN_SE
Aligns label to south-east.
#define mpALIGN_NE
Aligns label to north-east.
#define mpALIGN_BOTTOM
Aligns label to the bottom.
#define mpALIGN_BORDER_BOTTOM
Aligns X axis to bottom border.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
Contains the set of modified mouse wheel actions that can be performed on the plot.
MouseWheelAction horizontal
MouseWheelAction verticalWithShift
MouseWheelAction verticalWithCtrl
MouseWheelAction verticalWithAlt
MouseWheelAction verticalUnmodified