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 )
314 if( ( iy >= minYpx ) && ( iy <= maxYpx ) )
315 dc.DrawPoint( i, iy );
320 for( wxCoord i = startPx; i < endPx; ++i )
326 if( iy >= minYpx && iy <= maxYpx )
327 dc.DrawLine( i, iy, i, iy );
336 dc.GetTextExtent(
m_name, &tx, &ty );
376 if(
m_pen.GetWidth() <= 1 )
378 for( i = minYpx; i < maxYpx; ++i )
382 if( ( ix >= startPx ) && ( ix <= endPx ) )
383 dc.DrawPoint( ix, i );
388 for( i = 0; i< w.
GetScrY(); ++i )
392 if( ( ix >= startPx ) && ( ix <= endPx ) )
393 dc.DrawLine( ix, i, ix, i );
402 dc.GetTextExtent(
m_name, &tx, &ty );
430 maxDrawX = minDrawX = maxDrawY = minDrawY = 0;
452 wxCHECK_RET(
m_scaleX, wxS(
"X scale was not set" ) );
453 wxCHECK_RET(
m_scaleY, wxS(
"Y scale was not set" ) );
464 if( endPx <= startPx || minYpx >= maxYpx )
480 dc.SetClippingRegion( startPx, minYpx, endPx - startPx + 1, maxYpx - minYpx + 1 );
486 std::set<wxCoord> ys;
492 wxCoord newX = w.
x2p( px );
503 ys.insert( w.
y2p( py ) );
509 if( ( ix >= startPx ) && ( ix <= endPx ) && ( iy >= minYpx ) && ( iy <= maxYpx ) )
513 if(
m_pen.GetWidth() <= 1 )
514 dc.DrawPoint( ix, iy );
516 dc.DrawLine( ix, iy, ix, iy );
524 ys.insert( w.
y2p( py ) );
539 std::vector<wxPoint>pointList;
540 pointList.reserve( ( endPx - startPx ) * 2 );
544 bool hasNext =
GetNextXY( nextX, nextY );
545 bool offRight =
false;
562 wxCoord x1 = w.
x2p( px );
563 wxCoord y1 = w.
y2p( py );
573 if( nextX1 < startPx-1 )
576 else if( x1 > endPx )
584 if( !count || line_start.x != x1 )
590 if( count && dupx0 > 1 && abs( ymax0 - ymin0 ) > 2 )
591 dc.DrawLine( x0, ymin0, x0, ymax0 );
597 pointList.emplace_back( wxPoint( x1, y1 ) );
605 ymin0 = std::min( ymin0, y1 );
606 ymax0 = std::max( ymax0, y1 );
612 if( pointList.size() > 1 )
619 std::vector<wxPoint> drawPoints;
620 drawPoints.reserve( ( endPx - startPx ) * 2 );
623 int chunkSize = 10000;
625 int chunkSize = 100000;
627 if( dc.GetPen().GetStyle() == wxPENSTYLE_DOT )
630 drawPoints.push_back( pointList[0] );
632 for(
size_t ii = 1; ii < pointList.size()-1; ii++ )
636 if( drawPoints.back().y == pointList[ii].y &&
637 drawPoints.back().y == pointList[ii+1].y )
643 drawPoints.push_back( pointList[ii] );
645 if( (
int) drawPoints.size() > chunkSize )
647 dc.DrawLines( (
int) drawPoints.size(), &drawPoints[0] );
651 drawPoints.push_back( pointList[ii] );
657 if( drawPoints.back() != pointList.back() )
658 drawPoints.push_back( pointList.back() );
660 dc.DrawLines( (
int) drawPoints.size(), &drawPoints[0] );
669 dc.GetTextExtent(
m_name, &tx, &ty );
693 dc.DrawText(
m_name, tx, ty );
696 dc.DestroyClippingRegion();
704#define mpLN10 2.3025850929940456840179914546844
708 double minV, maxV, minVvis, maxVvis;
718 double minErr = 1000000000000.0;
719 double bestStep = 1.0;
722 for(
int i = 10; i <= 20; i += 2 )
724 double curr_step = fabs( maxVvis - minVvis ) / (double) i;
725 double base = pow( 10, floor( log10( curr_step ) ) );
726 double stepInt = floor( curr_step / base ) * base;
727 double err = fabs( curr_step - stepInt );
736 double numberSteps = floor( ( maxVvis - minVvis ) / bestStep );
741 while( numberSteps - 2.0 >= m_scrX/96.0 )
744 numberSteps = floor( ( maxVvis - minVvis ) / bestStep );
747 double v = floor( minVvis / bestStep ) * bestStep;
748 double zeroOffset = 100000000.0;
754 if( fabs( v ) < zeroOffset )
755 zeroOffset = fabs( v );
760 if( zeroOffset <= bestStep )
802 const wxString s = tickLabel.label;
804 dc.GetTextExtent( s, &tx, &ty );
823 double pymin = w.
p2y( minYpx );
824 double pymax = w.
p2y( maxYpx );
846 double y_slave0 = p0 /
m_scale;
847 double y_slave1 = p1 /
m_scale;
849 double dy_slave = ( y_slave1 - y_slave0 );
850 double exponent = floor( log10( dy_slave ) );
851 double base = dy_slave / pow( 10.0, exponent );
853 double dy_scaled = ceil( 2.0 * base ) / 2.0 * pow( 10.0, exponent );
859 minvv = floor( minvv / dy_scaled ) * dy_scaled;
862 m_scale *= dy_slave / dy_scaled;
882 double minVvis, maxVvis;
907 double minErr = 1000000000000.0;
908 double bestStep = 1.0;
911 for(
int i = 10; i <= 20; i += 2 )
913 double curr_step = fabs( maxVvis - minVvis ) / (double) i;
914 double base = pow( 10, floor( log10( curr_step ) ) );
915 double stepInt = floor( curr_step / base ) * base;
916 double err = fabs( curr_step - stepInt );
925 double numberSteps = floor( ( maxVvis - minVvis ) / bestStep );
929 while( numberSteps >= m_scrY / 32.0 )
932 numberSteps = floor( ( maxVvis - minVvis ) / bestStep );
935 double v = floor( minVvis / bestStep ) * bestStep;
936 double zeroOffset = 100000000.0;
937 const int iterLimit = 1000;
940 while( v <= maxVvis && i < iterLimit )
944 if( fabs( v ) < zeroOffset )
945 zeroOffset = fabs( v );
955 if( zeroOffset <= bestStep )
972 double pxmin = w.
p2x( startPx );
973 double pxmax = w.
p2x( endPx );
982 double minV, maxV, minVvis, maxVvis;
988 double minDecade = pow( 10, floor( log10( minV ) ) );
989 double maxDecade = pow( 10, ceil( log10( maxV ) ) );
990 double visibleDecades = log( maxVvis / minVvis ) / log( 10 );
999 if( minDecade == 0.0 )
1005 while( visibleDecades - 2 >= m_scrX / 96.0 )
1008 visibleDecades = log( maxVvis / minVvis ) / log( step );
1011 for( d = minDecade; d<=maxDecade; d *= step )
1015 for(
double dd = d; dd < d * step; dd += d )
1017 if( visibleDecades < 2 )
1036 SetFont( (wxFont&) *wxSMALL_FONT );
1037 SetPen( (wxPen&) *wxGREY_PEN );
1071 const int extend = w.
GetScrX();
1104 if( p >= startPx && p <= endPx )
1109 dc.DrawLine( p, orgy, p, orgy - 4 );
1111 dc.DrawLine( p, orgy, p, orgy + 4 );
1115 m_pen.SetStyle( wxPENSTYLE_DOT );
1120 m_pen.SetStyle( wxPENSTYLE_DOT );
1122 dc.DrawLine( p, orgy + 4, p, minYpx );
1123 m_pen.SetStyle( wxPENSTYLE_SOLID );
1125 dc.DrawLine( p, orgy + 4, p, orgy - 4 );
1130 dc.DrawLine( p, orgy - 4, p, maxYpx );
1132 dc.DrawLine( p, minYpx, p, maxYpx );
1135 m_pen.SetStyle( wxPENSTYLE_SOLID );
1141 m_pen.SetStyle( wxPENSTYLE_SOLID );
1143 dc.DrawLine( startPx, minYpx, endPx, minYpx );
1144 dc.DrawLine( startPx, maxYpx, endPx, maxYpx );
1150 if( !tickLabel.visible )
1156 if( ( p >= startPx ) && ( p <= endPx ) )
1159 wxString s = tickLabel.label;
1161 dc.GetTextExtent( s, &tx, &ty );
1164 dc.DrawText( s, p - tx / 2, orgy - 4 - ty );
1166 dc.DrawText( s, p - tx / 2, orgy + 4 );
1171 dc.GetTextExtent(
m_name, &tx, &ty );
1176 dc.DrawText(
m_name, extend - tx - 4, orgy - 8 - ty - labelH );
1180 dc.DrawText(
m_name, ( endPx + startPx ) / 2 - tx / 2, orgy + 6 + labelH );
1184 dc.DrawText(
m_name, extend - tx - 4, orgy - 4 - ty );
1189 dc.DrawText(
m_name, ( endPx - startPx - tx ) >> 1, orgy - 6 - ty - labelH );
1191 dc.DrawText(
m_name, extend - tx - 4, orgy + 4 );
1196 dc.DrawText(
m_name, extend - tx - 4, orgy + 6 + labelH );
1212 SetFont( (wxFont&) *wxSMALL_FONT );
1213 SetPen( (wxPen&) *wxGREY_PEN );
1217 m_masterScale =
nullptr;
1259 dc.DrawLine( orgx, minYpx, orgx, maxYpx );
1268 int labelHeight = 0;
1270 dc.GetTextExtent( s, &tx, &labelHeight );
1277 if( p >= minYpx && p <= maxYpx )
1282 dc.DrawLine( orgx, p, orgx + 4, p );
1284 dc.DrawLine( orgx - 4, p, orgx, p );
1288 dc.DrawLine( orgx - 4, p, orgx + 4, p );
1290 m_pen.SetStyle( wxPENSTYLE_DOT );
1293 dc.DrawLine( orgx - 4, p, endPx, p );
1295 m_pen.SetStyle( wxPENSTYLE_SOLID );
1308 if( !tickLabel.visible )
1311 if( p >= minYpx && p <= maxYpx )
1313 s = tickLabel.label;
1314 dc.GetTextExtent( s, &tx, &ty );
1318 dc.DrawText( s, orgx + 4, p - ty / 2 );
1320 dc.DrawText( s, orgx - 4 - tx, p - ty / 2 );
1325 dc.GetTextExtent(
m_name, &tx, &ty );
1330 dc.DrawText(
m_name, labelW + 8, 4 );
1334 dc.DrawText(
m_name, orgx - ( tx / 2 ), minYpx - ty - 4 );
1338 dc.DrawText(
m_name, orgx + 4, 4 );
1343 dc.DrawText(
m_name, orgx - ( tx / 2 ), minYpx - ty - 4 );
1347 dc.DrawText(
m_name, orgx - 6 - tx - labelW, 4 );
1361IMPLEMENT_DYNAMIC_CLASS(
mpWindow, wxWindow )
1363BEGIN_EVENT_TABLE(
mpWindow, wxWindow )
1386 initializeGraphicsContext();
1395 _(
"Return zoom to level prior to last zoom action" ) );
1397 _(
"Return zoom to level prior to last zoom undo" ) );
1402 _(
"Center plot view to this position" ) );
1403 m_popmenu.Append(
mpID_FIT,
_(
"Fit on Screen" ),
_(
"Set plot view to show all items" ) );
1406 SetBackgroundColour( *wxWHITE );
1410 SetSizeHints( 128, 128 );
1413 SetBackgroundStyle( wxBG_STYLE_CUSTOM );
1448 float zoom =
event.GetMagnification() + 1.0f;
1449 wxPoint pos( event.GetX(), event.GetY() );
1453 else if(
zoom < 1.0f )
1468 const wxMouseWheelAxis axis =
event.GetWheelAxis();
1469 const int modifiers =
event.GetModifiers();
1472 if( axis == wxMOUSE_WHEEL_HORIZONTAL )
1476 else if( modifiers == wxMOD_NONE )
1480 else if( modifiers == wxMOD_CONTROL )
1484 else if( modifiers == wxMOD_SHIFT )
1488 else if( modifiers == wxMOD_ALT )
1512 wxCursor
cursor = wxCURSOR_MAGNIFIER;
1514 if( event.m_middleDown )
1541 else if( event.m_leftDown )
1546 cursor = wxCURSOR_SIZING;
1548 cursor = wxCURSOR_SIZEWE;
1556 cursor = wxCURSOR_MAGNIFIER;
1558 wxClientDC dc(
this );
1561 dc.SetBrush( *wxTRANSPARENT_BRUSH );
1577 if( layer->IsInfo() && layer->IsVisible() )
1581 if( infoLayer->
Inside( event.GetPosition() ) )
1584 cursor = wxCURSOR_SIZING;
1586 cursor = wxCURSOR_SIZEWE;
1603 wxPoint pointClicked =
event.GetPosition();
1612 wxPoint release( event.GetX(), event.GetY() );
1624 if( release != press )
1640void mpWindow::Fit(
double xMin,
double xMax,
double yMin,
double yMax,
const wxCoord* printSizeX,
1641 const wxCoord* printSizeY, wxOrientation directions )
1643 const bool isPrinting = printSizeX !=
nullptr && printSizeY !=
nullptr;
1646 double newDesiredXmin = xMin;
1647 double newDesiredXmax = xMax;
1648 double newDesiredYmin = yMin;
1649 double newDesiredYmax = yMax;
1666 newScrX = *printSizeX;
1667 newScrY = *printSizeY;
1672 GetClientSize( &newScrX, &newScrY );
1680 double desiredSpanX = xMax - xMin;
1681 double desiredSpanY = yMax - yMin;
1682 double newScaleX = ( desiredSpanX != 0 ) ?
double( plotScreenWidth ) / desiredSpanX : 1;
1683 double newScaleY = ( desiredSpanY != 0 ) ?
double( plotScreenHeight ) / desiredSpanY : 1;
1688 double newPosY = yMax + (
m_marginTop / newScaleY );
1691 if( ( ( directions & wxHORIZONTAL ) != 0 ) || isPrinting )
1705 if( ( ( directions & wxVERTICAL ) != 0 ) || isPrinting )
1736 if( ( directions & wxHORIZONTAL ) != 0 )
1755 if( ( directions & wxVERTICAL ) != 0 )
1807void mpWindow::ZoomIn(
const wxPoint& centerPoint,
double zoomFactor, wxOrientation directions )
1809 DoZoom( centerPoint, zoomFactor, directions );
1821 if( zoomFactor == 0 )
1824 DoZoom( centerPoint, 1.0 / zoomFactor, directions );
1837 p0.x = std::max( p0.x, pMinX );
1838 p0.x = std::min( p0.x, pMaxX );
1839 p0.y = std::max( p0.y, pMinY );
1840 p0.y = std::min( p0.y, pMaxY );
1841 p1.x = std::max( p1.x, pMinX );
1842 p1.x = std::min( p1.x, pMaxX );
1843 p1.y = std::max( p1.y, pMinY );
1844 p1.y = std::min( p1.y, pMaxY );
1847 double p0x =
p2x( p0.x );
1848 double p0y =
p2y( p0.y );
1849 double p1x =
p2x( p1.x );
1850 double p1y =
p2y( p1.y );
1853 double zoom_x_min = p0x<p1x ? p0x : p1x;
1854 double zoom_x_max = p0x>p1x ? p0x : p1x;
1855 double zoom_y_min = p0y<p1y ? p0y : p1y;
1856 double zoom_y_max = p0y>p1y ? p0y : p1y;
1864 Fit( zoom_x_min, zoom_x_max, zoom_y_min, zoom_y_max );
1874 if( directionsNeedingRefitting != 0 )
1926 PopupMenu( &
m_popmenu, event.GetX(), event.GetY() );
1996 if( refreshDisplay )
2008 wxLayerList::iterator layIt;
2012 if( *layIt == layer )
2015 if( alsoDeleteObject )
2020 if( refreshDisplay )
2036 if( alsoDeleteObject )
2042 if( refreshDisplay )
2049 wxPaintDC paintDC(
this );
2054 wxDC* targetDC = &paintDC;
2071 if( wxGraphicsContext* ctx = targetDC->GetGraphicsContext() )
2073 if( !ctx->SetInterpolationQuality( wxINTERPOLATION_BEST ) )
2074 if( !ctx->SetInterpolationQuality( wxINTERPOLATION_GOOD ) )
2075 ctx->SetInterpolationQuality( wxINTERPOLATION_FAST );
2077 ctx->SetAntialiasMode( wxANTIALIAS_DEFAULT );
2081 targetDC->SetPen( *wxTRANSPARENT_PEN );
2082 wxBrush brush( GetBackgroundColour() );
2083 targetDC->SetBrush( brush );
2089 layer->Plot( *targetDC, *
this );
2094 targetDC->SetPen( pen );
2095 targetDC->SetBrush( *wxTRANSPARENT_BRUSH );
2105void mpWindow::DoZoom(
const wxPoint& centerPoint,
double zoomFactor, wxOrientation directions )
2109 if( directions == wxVERTICAL )
2112 directions = wxHORIZONTAL;
2115 const bool horizontally = ( directions & wxHORIZONTAL ) != 0;
2116 const bool vertically = ( directions & wxVERTICAL ) != 0;
2121 wxPoint c( centerPoint );
2122 if( c == wxDefaultPosition )
2138 const double newScaleX = horizontally ? (
m_scaleX * zoomFactor ) :
m_scaleX;
2139 const double newScaleY = vertically ? (
m_scaleY * zoomFactor ) :
m_scaleY;
2148 const double prior_layer_x =
p2x( c.x );
2152 m_posX = prior_layer_x - c.x / newScaleX;
2161 const double prior_layer_y =
p2y( c.y );
2165 m_posY = prior_layer_y + c.y / newScaleY;
2173 if( zoomFactor < 1.0 )
2181 if( directionsNeedingRefitting != 0 )
2192 const double plotSpanX = plotScreenWidth /
m_scaleX;
2203 const double plotSpanY = plotScreenHeight /
m_scaleY;
2214 return static_cast<wxOrientation
>( 0 );
2221 wxOrientation result = {};
2223 if( ( directions & wxHORIZONTAL ) != 0 )
2226 result =
static_cast<wxOrientation
>( result | wxHORIZONTAL );
2229 if( ( directions & wxVERTICAL ) != 0 )
2232 result =
static_cast<wxOrientation
>( result | wxVERTICAL );
2241 const int change =
event.GetWheelRotation();
2242 const double changeUnitsX = change /
m_scaleX;
2243 const double changeUnitsY = change /
m_scaleY;
2244 const wxPoint clickPt( event.GetX(), event.GetY() );
2273 if( event.GetWheelRotation() > 0 )
2281 if( event.GetWheelRotation() > 0 )
2289 if( event.GetWheelRotation() > 0 )
2333 if( ( position >= (
int)
m_layers.size() ) || position < 0 )
2344 if( !layer->GetName().Cmp(
name ) )
2365 if( aImageSize == wxDefaultSize )
2372 sizeX = aImageSize.x;
2373 sizeY = aImageSize.y;
2377 wxBitmap screenBuffer( sizeX, sizeY );
2378 wxMemoryDC screenDC;
2379 screenDC.SelectObject( screenBuffer );
2380 screenDC.SetPen( *wxWHITE_PEN );
2382 wxBrush brush( GetBackgroundColour() );
2383 screenDC.SetBrush( brush );
2384 screenDC.DrawRectangle( 0, 0, sizeX, sizeY );
2393 layer->Plot( screenDC, *
this );
2395 if( aImageSize != wxDefaultSize )
2400 SetScr( bk_scrX, bk_scrY );
2406 aImage = screenBuffer.ConvertToImage();
2425 if( layer->IsInfo() )
2429 if( tmpLyr->
Inside( point ) )
2442 lx->SetVisible( viewable );
2451 return lx->IsVisible();
2461 lx->SetVisible( viewable );
2470 return lx->IsVisible();
2477 const wxColour& axesColour )
2479 SetBackgroundColour( bgColour );
2480 SetForegroundColour( drawColour );
2491 wxPen axisPen = layer->GetPen();
2492 axisPen.SetColour( axesColour );
2493 layer->SetPen( axisPen );
2499 wxPen infoPen = layer->GetPen();
2500 infoPen.SetColour( drawColour );
2501 layer->SetPen( infoPen );
2507template <
typename... Ts>
2509 wxWindow(
std::forward<Ts>( windowArgs )... ),
2523 m_desiredXmin( 0.0 ),
2524 m_desiredXmax( 1.0 ),
2525 m_desiredYmin( 0.0 ),
2526 m_desiredYmax( 1.0 ),
2527 m_topBottomPlotGapFactor( 0.03 ),
2528 m_leftRightPlotGapFactor( 0.0 ),
2531 m_marginBottom( 0 ),
2535 m_buff_bmp( nullptr ),
2536 m_enableDoubleBuffer( false ),
2537 m_enableMouseNavigation( true ),
2538 m_enableLimitedView( false ),
2539 m_mouseWheelActions( defaultMouseWheelActions() ),
2540 m_movingInfoLayer( nullptr ),
2547 if( wxGraphicsContext* ctx =
m_buff_dc.GetGraphicsContext() )
2549 if( !ctx->SetInterpolationQuality( wxINTERPOLATION_BEST )
2550 || !ctx->SetInterpolationQuality( wxINTERPOLATION_GOOD ) )
2552 ctx->SetInterpolationQuality( wxINTERPOLATION_FAST );
2555 ctx->SetAntialiasMode( wxANTIALIAS_DEFAULT );
2606 double xlogmin = log10(
m_minV );
2607 double xlogmax = log10(
m_maxV );
2609 return ( log10( x ) - xlogmin ) / ( xlogmax - xlogmin );
2615 double xlogmin = log10(
m_minV );
2616 double xlogmax = log10(
m_maxV );
2618 return pow( 10.0, xplot * ( xlogmax - xlogmin ) + xlogmin );
2661 if( xs.size() != ys.size() )
2676 for(
const double x : xs )
2685 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