mirror of
https://github.com/levinsv/pgadmin3.git
synced 2026-05-15 14:15:49 -06:00
Add Bar plot
Добавлена отрисовка столбчатой диаграммы. Формат данных: L | Y ------ L1 | Y1 L2 | Y2 ...
This commit is contained in:
parent
1431b1abdb
commit
8c123b0550
7 changed files with 304 additions and 59 deletions
|
|
@ -446,6 +446,7 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) {
|
||||||
wxArrayInt cols;
|
wxArrayInt cols;
|
||||||
wxArrayString leg;
|
wxArrayString leg;
|
||||||
wxArrayInt colsY;
|
wxArrayInt colsY;
|
||||||
|
wxString rez="Draw plot";
|
||||||
if (IsSelection()) {
|
if (IsSelection()) {
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int row, col;
|
int row, col;
|
||||||
|
|
@ -476,11 +477,45 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) {
|
||||||
else {
|
else {
|
||||||
return "not select cells or columns";
|
return "not select cells or columns";
|
||||||
}
|
}
|
||||||
|
std::vector<wxString> lbar;
|
||||||
|
size_t numRows = GetNumberRows();
|
||||||
|
|
||||||
if (cols.Count()>0) {
|
if (cols.Count()>0) {
|
||||||
|
int idx = 0;
|
||||||
|
int cl1 = cols[idx];
|
||||||
|
int legC = -1;
|
||||||
|
int xC = -1;
|
||||||
//cols = GetSelectedCols();
|
//cols = GetSelectedCols();
|
||||||
|
if (cols.Count() == 2) {
|
||||||
|
legC = cl1; idx++;
|
||||||
|
cl1 = cols[idx];
|
||||||
|
if (colTypClasses.Item(cl1) != PGTYPCLASS_NUMERIC) {
|
||||||
|
wxMessageBox("The number of selected column 2 needed Number type\nExample: LY", "Plot");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
std::vector<double> x, y;
|
||||||
|
double xv=0, yv;
|
||||||
|
for (int i = 0; i < numRows; i++)
|
||||||
|
{
|
||||||
|
if (GetRowSize(i) == 0) continue;
|
||||||
|
//str.Append(GetExportLine(i, cols));
|
||||||
|
wxString yVal = GetCellValue(i, cl1);
|
||||||
|
if (!yVal.ToCDouble(&yv)) { yVal.ToDouble(&yv); /* error! */ }
|
||||||
|
x.push_back(xv);
|
||||||
|
y.push_back(yv);
|
||||||
|
xv++;
|
||||||
|
lbar.push_back(GetCellValue(i, legC));
|
||||||
|
}
|
||||||
|
frmPlot* frame = new frmPlot(parent, "Plot Bar");
|
||||||
|
frame->ClearAndSetAxis(ctlSQLGrid::GetColumnName(legC), mpX_NORMAL, ctlSQLGrid::GetColumnName(cl1));
|
||||||
|
frame->AddSeries("Bar", x, y, lbar);
|
||||||
|
frame->Go();
|
||||||
|
return rez;
|
||||||
|
|
||||||
|
}
|
||||||
if (cols.Count() < 3) {
|
if (cols.Count() < 3) {
|
||||||
wxMessageBox("The number of selected columns must be more than 2\nExample: LXY or XYYYY...", "Plot");
|
|
||||||
|
wxMessageBox("The number of selected columns must be more than 1\nExample: LXY or XYYYY...", "Plot");
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -519,9 +554,9 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) {
|
||||||
frmPlot* frame = new frmPlot(parent,"Plot");
|
frmPlot* frame = new frmPlot(parent,"Plot");
|
||||||
frame->ClearAndSetAxis(xA, typeAxisX, yA);
|
frame->ClearAndSetAxis(xA, typeAxisX, yA);
|
||||||
// Rows read
|
// Rows read
|
||||||
size_t numRows = GetNumberRows();
|
|
||||||
wxString lg,currLg;
|
wxString lg,currLg;
|
||||||
|
|
||||||
if (legC !=-1) {
|
if (legC !=-1) {
|
||||||
// 3 cols
|
// 3 cols
|
||||||
std::vector<double> x,y;
|
std::vector<double> x,y;
|
||||||
|
|
@ -532,7 +567,7 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) {
|
||||||
if (GetRowSize(i) == 0) continue;
|
if (GetRowSize(i) == 0) continue;
|
||||||
currLg= GetCellValue(i, legC);
|
currLg= GetCellValue(i, legC);
|
||||||
if (lg != currLg && !lg.IsEmpty()) {
|
if (lg != currLg && !lg.IsEmpty()) {
|
||||||
frame->AddSeries(lg, x, y);
|
if (x.size()>0) frame->AddSeries(lg, x, y,lbar);
|
||||||
lg = wxEmptyString;
|
lg = wxEmptyString;
|
||||||
}
|
}
|
||||||
if (lg.IsEmpty()) {
|
if (lg.IsEmpty()) {
|
||||||
|
|
@ -550,8 +585,9 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) {
|
||||||
dt = parseDT(fmttype, xVal);
|
dt = parseDT(fmttype, xVal);
|
||||||
if (fmttype == -1) {
|
if (fmttype == -1) {
|
||||||
wxString temp = wxString::Format("The values of column X must be timestamp [row: %d,col: %d]",i+1, colsY[0]);
|
wxString temp = wxString::Format("The values of column X must be timestamp [row: %d,col: %d]",i+1, colsY[0]);
|
||||||
wxMessageBox(temp, "Plot");
|
rez = temp;
|
||||||
return "";
|
//wxMessageBox(temp, "Plot");
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
xv = (double)dt.GetTicks();
|
xv = (double)dt.GetTicks();
|
||||||
}
|
}
|
||||||
|
|
@ -562,7 +598,7 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) {
|
||||||
x.push_back(xv);
|
x.push_back(xv);
|
||||||
y.push_back(yv);
|
y.push_back(yv);
|
||||||
}
|
}
|
||||||
frame->AddSeries(lg, x, y);
|
frame->AddSeries(lg, x, y,lbar);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -601,13 +637,13 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) {
|
||||||
y.push_back(yv);
|
y.push_back(yv);
|
||||||
|
|
||||||
}
|
}
|
||||||
frame->AddSeries(lg, x, y);
|
frame->AddSeries(lg, x, y,lbar);
|
||||||
y.clear();
|
y.clear();
|
||||||
first = false;
|
first = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
frame->Go();
|
frame->Go();
|
||||||
return "plot draw";
|
return rez;
|
||||||
|
|
||||||
}
|
}
|
||||||
wxString ctlSQLResult::SummaryColumn()
|
wxString ctlSQLResult::SummaryColumn()
|
||||||
|
|
|
||||||
126
frm/frmPlot.cpp
126
frm/frmPlot.cpp
|
|
@ -10,10 +10,10 @@ enum {
|
||||||
ID_ALIGN_X_AXIS,
|
ID_ALIGN_X_AXIS,
|
||||||
ID_ALIGN_Y_AXIS,
|
ID_ALIGN_Y_AXIS,
|
||||||
ID_TOGGLE_GRID,
|
ID_TOGGLE_GRID,
|
||||||
ID_TOGGLE_SCROLLBARS,
|
ID_COPY_SCREEN,
|
||||||
ID_TOGGLE_INFO,
|
ID_TOGGLE_INFO,
|
||||||
ID_SAVE_SCREENSHOT,
|
ID_SAVE_SCREENSHOT,
|
||||||
ID_TOGGLE_LISSAJOUX,
|
ID_TOGGLE_SHOW_SERIES,
|
||||||
ID_TOGGLE_SHOW_SIMBOL,
|
ID_TOGGLE_SHOW_SIMBOL,
|
||||||
ID_TOGGLE_COSINE,
|
ID_TOGGLE_COSINE,
|
||||||
ID_BLACK_THEME
|
ID_BLACK_THEME
|
||||||
|
|
@ -73,13 +73,22 @@ EVT_MENU(mpID_FIT, frmPlot::OnFit)
|
||||||
EVT_MENU(ID_ALIGN_X_AXIS, frmPlot::OnAlignXAxis)
|
EVT_MENU(ID_ALIGN_X_AXIS, frmPlot::OnAlignXAxis)
|
||||||
EVT_MENU(ID_ALIGN_Y_AXIS, frmPlot::OnAlignYAxis)
|
EVT_MENU(ID_ALIGN_Y_AXIS, frmPlot::OnAlignYAxis)
|
||||||
EVT_MENU(ID_TOGGLE_GRID, frmPlot::OnToggleGrid)
|
EVT_MENU(ID_TOGGLE_GRID, frmPlot::OnToggleGrid)
|
||||||
EVT_MENU(ID_TOGGLE_SCROLLBARS, frmPlot::OnCopy)
|
EVT_MENU(ID_COPY_SCREEN, frmPlot::OnCopy)
|
||||||
EVT_MENU(ID_TOGGLE_INFO, frmPlot::OnToggleInfoLayer)
|
EVT_MENU(ID_TOGGLE_INFO, frmPlot::OnToggleInfoLayer)
|
||||||
EVT_MENU(ID_SAVE_SCREENSHOT, frmPlot::OnSaveScreenshot)
|
EVT_MENU(ID_SAVE_SCREENSHOT, frmPlot::OnSaveScreenshot)
|
||||||
EVT_MENU(ID_BLACK_THEME, frmPlot::OnBlackTheme)
|
EVT_MENU(ID_BLACK_THEME, frmPlot::OnBlackTheme)
|
||||||
EVT_MENU(ID_TOGGLE_LISSAJOUX, frmPlot::OnToggleLissajoux)
|
EVT_MENU(ID_TOGGLE_SHOW_SERIES, frmPlot::OnToggleShowSeries)
|
||||||
EVT_MENU(ID_TOGGLE_SHOW_SIMBOL, frmPlot::OnToggleShowSimbol)
|
EVT_MENU(ID_TOGGLE_SHOW_SIMBOL, frmPlot::OnToggleShowSimbol)
|
||||||
EVT_MENU(ID_TOGGLE_COSINE, frmPlot::OnToggleCosine)
|
EVT_MENU(ID_TOGGLE_COSINE, frmPlot::OnToggleCosine)
|
||||||
|
EVT_MENU(mpID_CENTER, frmPlot::OnCenter)
|
||||||
|
EVT_MENU(mpID_ZOOM_IN, frmPlot::OnZoomIn)
|
||||||
|
EVT_MENU(mpID_ZOOM_INX, frmPlot::OnZoomInX)
|
||||||
|
EVT_MENU(mpID_ZOOM_INY, frmPlot::OnZoomInY)
|
||||||
|
EVT_MENU(mpID_ZOOM_OUTX, frmPlot::OnZoomOutX)
|
||||||
|
EVT_MENU(mpID_ZOOM_OUTY, frmPlot::OnZoomOutY)
|
||||||
|
EVT_MENU(mpID_ZOOM_OUT, frmPlot::OnZoomOut)
|
||||||
|
EVT_MENU(mpID_LOCKASPECT, frmPlot::OnLockAspect)
|
||||||
|
EVT_KEY_DOWN(frmPlot::OnKEY_DOWN)
|
||||||
EVT_CLOSE(frmPlot::OnClose)
|
EVT_CLOSE(frmPlot::OnClose)
|
||||||
wxEND_EVENT_TABLE()
|
wxEND_EVENT_TABLE()
|
||||||
|
|
||||||
|
|
@ -99,7 +108,7 @@ frmPlot::frmPlot(frmQuery* parent, const wxString& _title) : pgFrame(parent, _ti
|
||||||
file_menu->Append(ID_PRINT_PREVIEW, wxT("Print Pre&view..."));
|
file_menu->Append(ID_PRINT_PREVIEW, wxT("Print Pre&view..."));
|
||||||
file_menu->Append(ID_PRINT, wxT("&Print..."));
|
file_menu->Append(ID_PRINT, wxT("&Print..."));
|
||||||
file_menu->Append(ID_SAVE_SCREENSHOT, wxT("Save screenshot"));
|
file_menu->Append(ID_SAVE_SCREENSHOT, wxT("Save screenshot"));
|
||||||
file_menu->Append(ID_TOGGLE_SCROLLBARS, wxT("Copy clipboard screenshot\tCtrl+C"));
|
file_menu->Append(ID_COPY_SCREEN, wxT("Copy clipboard screenshot\tCtrl+C"));
|
||||||
|
|
||||||
file_menu->AppendSeparator();
|
file_menu->AppendSeparator();
|
||||||
file_menu->Append(ID_ABOUT, wxT("&About..."));
|
file_menu->Append(ID_ABOUT, wxT("&About..."));
|
||||||
|
|
@ -108,20 +117,28 @@ frmPlot::frmPlot(frmQuery* parent, const wxString& _title) : pgFrame(parent, _ti
|
||||||
view_menu->Append(mpID_FIT, wxT("&Fit bounding box"), wxT("Set plot view to show all items"));
|
view_menu->Append(mpID_FIT, wxT("&Fit bounding box"), wxT("Set plot view to show all items"));
|
||||||
view_menu->Append(mpID_ZOOM_IN, wxT("Zoom in"), wxT("Zoom in plot view."));
|
view_menu->Append(mpID_ZOOM_IN, wxT("Zoom in"), wxT("Zoom in plot view."));
|
||||||
view_menu->Append(mpID_ZOOM_OUT, wxT("Zoom out"), wxT("Zoom out plot view."));
|
view_menu->Append(mpID_ZOOM_OUT, wxT("Zoom out"), wxT("Zoom out plot view."));
|
||||||
|
view_menu->AppendCheckItem(mpID_LOCKASPECT, _("Lock aspect"),_("Lock horizontal and vertical zoom aspect."));
|
||||||
|
view_menu->AppendSeparator();
|
||||||
|
|
||||||
|
view_menu->Append(mpID_ZOOM_INX, wxT("Zoom in X axis\tKP_Add"), wxT("Zoom in plot view X axis."));
|
||||||
|
view_menu->Append(mpID_ZOOM_OUTX, wxT("Zoom out X axis\tKP_Subtract"), wxT("Zoom out plot view X axis."));
|
||||||
|
view_menu->Append(mpID_ZOOM_INY, wxT("Zoom in Y axis\tCtrl+KP_Add"), wxT("Zoom in plot view Y axis."));
|
||||||
|
view_menu->Append(mpID_ZOOM_OUTY, wxT("Zoom out Y axis\tCtrl+KP_Subtract"), wxT("Zoom out plot view Y axis."));
|
||||||
|
|
||||||
view_menu->AppendSeparator();
|
view_menu->AppendSeparator();
|
||||||
view_menu->Append(ID_ALIGN_X_AXIS, wxT("Switch &X axis align"));
|
view_menu->Append(ID_ALIGN_X_AXIS, wxT("Switch &X axis align"));
|
||||||
view_menu->Append(ID_ALIGN_Y_AXIS, wxT("Switch &Y axis align"));
|
view_menu->Append(ID_ALIGN_Y_AXIS, wxT("Switch &Y axis align"));
|
||||||
view_menu->AppendCheckItem(ID_TOGGLE_GRID, wxT("Toggle grid/ticks"));
|
view_menu->AppendCheckItem(ID_TOGGLE_GRID, wxT("Toggle grid/ticks"));
|
||||||
//view_menu->AppendCheckItem( ID_TOGGLE_SCROLLBARS, wxT("Show Scroll Bars"));
|
//view_menu->AppendCheckItem( ID_COPY_SCREEN, wxT("Show Scroll Bars"));
|
||||||
view_menu->AppendCheckItem(ID_TOGGLE_INFO, wxT("Show overlay info box"));
|
view_menu->AppendCheckItem(ID_TOGGLE_INFO, wxT("Show overlay info box"));
|
||||||
view_menu->Check(ID_TOGGLE_INFO, true);
|
view_menu->Check(ID_TOGGLE_INFO, true);
|
||||||
view_menu->AppendCheckItem(ID_BLACK_THEME, wxT("Switch to black background theme"));
|
view_menu->AppendCheckItem(ID_BLACK_THEME, wxT("Switch to black background theme"));
|
||||||
|
|
||||||
//show_menu->AppendCheckItem(ID_TOGGLE_LISSAJOUX, wxT("Lissajoux"));
|
show_menu->AppendCheckItem(ID_TOGGLE_SHOW_SERIES, wxT("Show name series"));
|
||||||
show_menu->AppendCheckItem(ID_TOGGLE_SHOW_SIMBOL, wxT("Show Simbol"));
|
show_menu->AppendCheckItem(ID_TOGGLE_SHOW_SIMBOL, wxT("Show Simbol"));
|
||||||
//show_menu->AppendCheckItem(ID_TOGGLE_COSINE, wxT("Cosine"));
|
//show_menu->AppendCheckItem(ID_TOGGLE_COSINE, wxT("Cosine"));
|
||||||
// Start with all plots visible
|
// Start with all plots visible
|
||||||
//show_menu->Check(ID_TOGGLE_LISSAJOUX, true);
|
show_menu->Check(ID_TOGGLE_SHOW_SERIES, false);
|
||||||
show_menu->Check(ID_TOGGLE_SHOW_SIMBOL, true);
|
show_menu->Check(ID_TOGGLE_SHOW_SIMBOL, true);
|
||||||
//show_menu->Check(ID_TOGGLE_COSINE, true);
|
//show_menu->Check(ID_TOGGLE_COSINE, true);
|
||||||
|
|
||||||
|
|
@ -135,9 +152,10 @@ frmPlot::frmPlot(frmQuery* parent, const wxString& _title) : pgFrame(parent, _ti
|
||||||
mpLayer* l;
|
mpLayer* l;
|
||||||
|
|
||||||
m_plot = new mpWindow(this, -1, wxPoint(0, 0), wxSize(100, 100), wxSUNKEN_BORDER);
|
m_plot = new mpWindow(this, -1, wxPoint(0, 0), wxSize(100, 100), wxSUNKEN_BORDER);
|
||||||
|
|
||||||
m_plot->SetMargins(30, 100, 50, 100);
|
m_plot->SetMargins(30, 100, 50, 100);
|
||||||
wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
m_plot->Bind(wxEVT_KEY_DOWN, &frmPlot::OnKEY_DOWN, this);
|
||||||
|
|
||||||
topsizer->Add(m_plot, 1, wxEXPAND);
|
topsizer->Add(m_plot, 1, wxEXPAND);
|
||||||
// topsizer->Add(m_log, 0, wxEXPAND);
|
// topsizer->Add(m_log, 0, wxEXPAND);
|
||||||
|
|
@ -184,23 +202,24 @@ void frmPlot::ClearAndSetAxis(wxString XtextAxis, unsigned int X_labelType, wxSt
|
||||||
yaxis->SetFont(graphFont);
|
yaxis->SetFont(graphFont);
|
||||||
xaxis->SetDrawOutsideMargins(false);
|
xaxis->SetDrawOutsideMargins(false);
|
||||||
yaxis->SetDrawOutsideMargins(false);
|
yaxis->SetDrawOutsideMargins(false);
|
||||||
m_plot->AddLayer(xaxis);
|
m_plot->AddLayer(xaxis); // 0
|
||||||
m_plot->AddLayer(yaxis);
|
m_plot->AddLayer(yaxis); // 1
|
||||||
m_plot->AddLayer(nfo = new mpInfoCoords(wxRect(80, 20, 10, 10), wxTRANSPARENT_BRUSH)); //&hatch));
|
m_plot->AddLayer(nfo = new mpInfoCoords(wxRect(80, 80, 10, 10), wxTRANSPARENT_BRUSH)); //&hatch));
|
||||||
nfo->SetVisible(true);
|
nfo->SetVisible(true); // 2
|
||||||
//wxBrush hatch2(wxColour(163,208,212), wxSOLID);
|
//wxBrush hatch2(wxColour(163,208,212), wxSOLID);
|
||||||
mpInfoLegend* leg;
|
mpInfoLegend* leg;
|
||||||
m_plot->AddLayer(leg = new mpInfoLegend(wxRect(20, 20, 40, 40), wxTRANSPARENT_BRUSH)); //&hatch2));
|
m_plot->AddLayer(leg = new mpInfoLegend(wxRect(20, 20, 40, 40), wxTRANSPARENT_BRUSH)); //&hatch2));
|
||||||
leg->SetVisible(true);
|
leg->SetVisible(true); // 3
|
||||||
leg->SetDrawOutsideMargins(false);
|
leg->SetDrawOutsideMargins(false);
|
||||||
indexColor = 0;
|
indexColor = 0;
|
||||||
//m_plot->Fit();
|
//m_plot->Fit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmPlot::AddSeries(const wxString legend, const std::vector<double>& x, const std::vector<double>& y)
|
void frmPlot::AddSeries(const wxString legend, const std::vector<double>& x, const std::vector<double>& y, const std::vector<wxString>& l)
|
||||||
{
|
{
|
||||||
mpFXYVector* vectorLayer = new mpFXYVector(legend);
|
mpFXYVector* vectorLayer = new mpFXYVector(legend);
|
||||||
vectorLayer->SetData(x, y);
|
vectorLayer->SetData(x, y);
|
||||||
|
if (l.size()>0) vectorLayer->SetLegendBar(l);
|
||||||
vectorLayer->SetContinuity(true);
|
vectorLayer->SetContinuity(true);
|
||||||
size_t n;
|
size_t n;
|
||||||
wxColourDesc cc;
|
wxColourDesc cc;
|
||||||
|
|
@ -212,17 +231,71 @@ void frmPlot::AddSeries(const wxString legend, const std::vector<double>& x, con
|
||||||
//= new wxColour(cc.name);
|
//= new wxColour(cc.name);
|
||||||
}
|
}
|
||||||
if (indexColor >= WXSIZEOF(colors)) cc.name = L"#000000";
|
if (indexColor >= WXSIZEOF(colors)) cc.name = L"#000000";
|
||||||
|
|
||||||
wxPen vectorpen(wxColour(cc.name), 2, wxPENSTYLE_SOLID);
|
|
||||||
|
|
||||||
vectorLayer->SetPen(vectorpen);
|
|
||||||
vectorLayer->SetDrawOutsideMargins(false);
|
vectorLayer->SetDrawOutsideMargins(false);
|
||||||
vectorLayer->ShowName(false);
|
|
||||||
vectorLayer->ShowSimbol(true);
|
vectorLayer->ShowSimbol(true);
|
||||||
|
if (vectorLayer->IsLegendBar()) {
|
||||||
|
wxPen vectorpen(wxColour(cc.name), 1, wxPENSTYLE_SOLID);
|
||||||
|
wxBrush br(wxColour(cc.name));
|
||||||
|
vectorLayer->SetPen(vectorpen);
|
||||||
|
vectorLayer->ShowName(false);
|
||||||
|
vectorLayer->SetBrush(br);
|
||||||
|
vectorLayer->SetContinuity(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxPen vectorpen(wxColour(cc.name), 2, wxPENSTYLE_SOLID);
|
||||||
|
vectorLayer->SetPen(vectorpen);
|
||||||
|
vectorLayer->ShowName(false);
|
||||||
|
}
|
||||||
m_plot->AddLayer(vectorLayer);
|
m_plot->AddLayer(vectorLayer);
|
||||||
//m_plot->Fit();
|
//m_plot->Fit();
|
||||||
}
|
}
|
||||||
|
void frmPlot::OnKEY_DOWN(wxKeyEvent& event) {
|
||||||
|
//void OnScrollThumbTrack(wxScrollWinEvent & event);
|
||||||
|
bool modctrl;
|
||||||
|
if ((event.GetModifiers() & wxMOD_CONTROL) == wxMOD_CONTROL) {
|
||||||
|
modctrl = true;
|
||||||
|
}
|
||||||
|
else modctrl = false;
|
||||||
|
int go = 0;
|
||||||
|
int orient = wxHORIZONTAL;
|
||||||
|
if (event.GetKeyCode() == WXK_DOWN) {
|
||||||
|
go =-( m_plot->GetScrY() - m_plot->GetMarginTop() - m_plot->GetMarginBottom());
|
||||||
|
orient = wxVERTICAL;
|
||||||
|
}
|
||||||
|
if (event.GetKeyCode() == WXK_UP) {
|
||||||
|
go = (m_plot->GetScrY() - m_plot->GetMarginTop() - m_plot->GetMarginBottom());
|
||||||
|
orient = wxVERTICAL;
|
||||||
|
}
|
||||||
|
if (event.GetKeyCode() == WXK_LEFT) {
|
||||||
|
go = -(m_plot->GetScrX()-m_plot->GetMarginRight() - m_plot->GetMarginLeft());
|
||||||
|
}
|
||||||
|
if (event.GetKeyCode() == WXK_RIGHT) {
|
||||||
|
go = m_plot->GetScrX()-m_plot->GetMarginRight() - m_plot->GetMarginLeft();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((go != 0)) {
|
||||||
|
|
||||||
|
wxScrollWinEvent evt(wxEVT_NULL, go ,orient);
|
||||||
|
double npos;
|
||||||
|
if (orient == wxHORIZONTAL) {
|
||||||
|
npos = m_plot->GetPosX() + (double)go / m_plot->GetScaleX();
|
||||||
|
//m_plot->OnScrollThumbTrack(evt);
|
||||||
|
m_plot->SetPosX(npos);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
npos = m_plot->GetPosY() + (double)go / m_plot->GetScaleY();
|
||||||
|
//m_plot->OnScrollThumbTrack(evt);
|
||||||
|
m_plot->SetPosY(npos);
|
||||||
|
|
||||||
|
}
|
||||||
|
event.Skip(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event.Skip(true);
|
||||||
|
|
||||||
|
}
|
||||||
void frmPlot::OnFit(wxCommandEvent& WXUNUSED(event))
|
void frmPlot::OnFit(wxCommandEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
m_plot->Fit();
|
m_plot->Fit();
|
||||||
|
|
@ -379,9 +452,18 @@ void frmPlot::OnSaveScreenshot(wxCommandEvent& event)
|
||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmPlot::OnToggleLissajoux(wxCommandEvent& event)
|
void frmPlot::OnToggleShowSeries(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
m_plot->SetLayerVisible(wxT("Lissajoux"), event.IsChecked());
|
bool v = event.IsChecked();
|
||||||
|
for (unsigned int p = 4; p < m_plot->CountAllLayers(); p++) {
|
||||||
|
mpFXYVector* ly = dynamic_cast<mpFXYVector*>(m_plot->GetLayer(p));
|
||||||
|
if (ly == NULL) continue;
|
||||||
|
if ((ly->GetLayerType() == mpLAYER_PLOT) && (ly->IsVisible())) {
|
||||||
|
ly->ShowName(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//m_plot->SetLayerVisible(wxT("Lissajoux"), event.IsChecked());
|
||||||
|
m_plot->UpdateAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmPlot::OnToggleShowSimbol(wxCommandEvent& event)
|
void frmPlot::OnToggleShowSimbol(wxCommandEvent& event)
|
||||||
|
|
|
||||||
|
|
@ -2172,7 +2172,7 @@ void frmQuery::OnLabelRightClick(wxGridEvent &event)
|
||||||
xmenu->Append(MNU_COPY, _("&Copy"), _("Copy selected cells to clipboard."));
|
xmenu->Append(MNU_COPY, _("&Copy"), _("Copy selected cells to clipboard."));
|
||||||
xmenu->Append(MNU_PASTE, _("&Paste"), _("Paste data from the clipboard."));
|
xmenu->Append(MNU_PASTE, _("&Paste"), _("Paste data from the clipboard."));
|
||||||
xmenu->Append(MNU_DELETE, _("&Delete"), _("Delete selected rows."));
|
xmenu->Append(MNU_DELETE, _("&Delete"), _("Delete selected rows."));
|
||||||
xmenu->Append(MNU_AUTOCOLSPLOT, _("Draw plot LXY or XYYY..."), _("Draw plot LXY or XYYY..."));
|
xmenu->Append(MNU_AUTOCOLSPLOT, _("Draw plot LY(bar) or LXY or XYYY..."), _("Draw plot LY(bar) LXY or XYYY..."));
|
||||||
xmenu->Append(MNU_SUMMARY_COL, _("Summary"), _("Summary selected cells."));
|
xmenu->Append(MNU_SUMMARY_COL, _("Summary"), _("Summary selected cells."));
|
||||||
xmenu->Append(MNU_CHECK_COLUMN_DATE, _("Check the sequence of dates"), _("Check the sequence of dates"));
|
xmenu->Append(MNU_CHECK_COLUMN_DATE, _("Check the sequence of dates"), _("Check the sequence of dates"));
|
||||||
xmenu->Append(MNU_COPY_INSERT, _("Copy Insert format"), _("Copy Insert format."));
|
xmenu->Append(MNU_COPY_INSERT, _("Copy Insert format"), _("Copy Insert format."));
|
||||||
|
|
|
||||||
125
frm/mathplot.cpp
125
frm/mathplot.cpp
|
|
@ -58,7 +58,7 @@
|
||||||
#define mpSCROLL_NUM_PIXELS_PER_LINE 10
|
#define mpSCROLL_NUM_PIXELS_PER_LINE 10
|
||||||
|
|
||||||
// See doxygen comments.
|
// See doxygen comments.
|
||||||
double mpWindow::zoomIncrementalFactor = 1.5;
|
double mpWindow::zoomIncrementalFactor = 1.2;
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// mpLayer
|
// mpLayer
|
||||||
|
|
@ -180,13 +180,15 @@ void mpInfoCoords::UpdateInfo(mpWindow &w, wxEvent &event) {
|
||||||
int mouseY = ((wxMouseEvent &)event).GetY();
|
int mouseY = ((wxMouseEvent &)event).GetY();
|
||||||
double xx=w.p2x(mouseX);
|
double xx=w.p2x(mouseX);
|
||||||
double yy=w.p2y(mouseY);
|
double yy=w.p2y(mouseY);
|
||||||
double tx,ty;
|
double tx=0,ty=0;
|
||||||
double dd;
|
double dd;
|
||||||
|
|
||||||
wxCoord sx,sy;
|
wxCoord sx,sy;
|
||||||
wxString namel;
|
wxString namel;
|
||||||
|
int size_vec;
|
||||||
for (unsigned int p = 0; p < w.CountAllLayers(); p++) {
|
for (unsigned int p = 0; p < w.CountAllLayers(); p++) {
|
||||||
mpFXYVector *ly = reinterpret_cast<mpFXYVector*>(w.GetLayer(p));
|
mpFXYVector *ly = dynamic_cast<mpFXYVector*>(w.GetLayer(p));
|
||||||
|
if (ly == NULL) continue;
|
||||||
if ((ly->GetLayerType() == mpLAYER_PLOT) && (ly->IsVisible())) {
|
if ((ly->GetLayerType() == mpLAYER_PLOT) && (ly->IsVisible())) {
|
||||||
tx=xx;ty=yy;
|
tx=xx;ty=yy;
|
||||||
double d=ly->GetDistance(tx,ty);
|
double d=ly->GetDistance(tx,ty);
|
||||||
|
|
@ -195,7 +197,9 @@ void mpInfoCoords::UpdateInfo(mpWindow &w, wxEvent &event) {
|
||||||
dd=sqrt((double)(sx-mouseX)*(double)(sx-mouseX)+(double)(sy-mouseY)*(double)(sy-mouseY));
|
dd=sqrt((double)(sx-mouseX)*(double)(sx-mouseX)+(double)(sy-mouseY)*(double)(sy-mouseY));
|
||||||
if (dd<4)
|
if (dd<4)
|
||||||
{
|
{
|
||||||
namel=ly->GetName();
|
size_vec = ly->GetSize();
|
||||||
|
namel.Printf("%s\nNumber points: %d",ly->GetName(),size_vec);
|
||||||
|
size_vec = ly->GetSize();
|
||||||
mouseX=1;
|
mouseX=1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -213,6 +217,7 @@ void mpInfoCoords::UpdateInfo(mpWindow &w, wxEvent &event) {
|
||||||
wxString s = xaxis->GetLabelTextValue(x);
|
wxString s = xaxis->GetLabelTextValue(x);
|
||||||
wxString xname = xaxis->GetName();
|
wxString xname = xaxis->GetName();
|
||||||
wxString yname = yaxis->GetName();
|
wxString yname = yaxis->GetName();
|
||||||
|
|
||||||
toolTipContent.Printf(_("%s\n%s = %s\n%s = %f"), namel,xname,s,yname, ty);
|
toolTipContent.Printf(_("%s\n%s = %s\n%s = %f"), namel,xname,s,yname, ty);
|
||||||
wxTipWindow** ptr = NULL;
|
wxTipWindow** ptr = NULL;
|
||||||
wxRect rectBounds(sx, sy, 5, 5);
|
wxRect rectBounds(sx, sy, 5, 5);
|
||||||
|
|
@ -550,17 +555,46 @@ void mpFXY::UpdateViewBoundary(wxCoord xnew, wxCoord ynew) {
|
||||||
minDrawY = (minDrawY < ynew) ? minDrawY : ynew;
|
minDrawY = (minDrawY < ynew) ? minDrawY : ynew;
|
||||||
// drawnPoints++;
|
// drawnPoints++;
|
||||||
}
|
}
|
||||||
|
void drawInRectText(wxDC &dc, wxString text,wxRect out,int align) {
|
||||||
|
wxCoord tx, ty;
|
||||||
|
dc.GetMultiLineTextExtent(text, &tx, &ty);
|
||||||
|
wxRect in(0,0,tx,ty);
|
||||||
|
int angle = 0;
|
||||||
|
//if ((ix2 - ix) < ty) continue;
|
||||||
|
if (out.width < tx) {
|
||||||
|
angle = 90;
|
||||||
|
in.SetWidth(ty);
|
||||||
|
in.SetHeight(tx);
|
||||||
|
in = in.CenterIn(out);
|
||||||
|
in.y = in.y + tx;
|
||||||
|
if (in.y > (out.y+out.height)) in.y = out.y + out.height;
|
||||||
|
if (align == wxALIGN_TOP) {
|
||||||
|
in.y = out.y + tx+15;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
in = in.CenterIn(out);
|
||||||
|
if (align == wxALIGN_TOP) {
|
||||||
|
in.y = out.y + ty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dc.DrawRotatedText(text, in.x, in.y, angle);
|
||||||
|
|
||||||
|
}
|
||||||
void mpFXY::Plot(wxDC &dc, mpWindow &w) {
|
void mpFXY::Plot(wxDC &dc, mpWindow &w) {
|
||||||
if (m_visible) {
|
if (m_visible) {
|
||||||
|
mpFXYVector *v= dynamic_cast<mpFXYVector*>(this);
|
||||||
|
bool isBar = false;
|
||||||
|
if (v != NULL) isBar = v->IsLegendBar();
|
||||||
|
|
||||||
int wsimb = m_pen.GetWidth();
|
int wsimb = m_pen.GetWidth();
|
||||||
if (IsSelect()) {
|
if (IsSelect() && !isBar) {
|
||||||
wxPen pensel(m_pen);
|
wxPen pensel(m_pen);
|
||||||
pensel.SetWidth(wsimb * 2);
|
pensel.SetWidth(wsimb * 2);
|
||||||
dc.SetPen(pensel);
|
dc.SetPen(pensel);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
dc.SetPen(m_pen);
|
dc.SetPen(m_pen);
|
||||||
}
|
}
|
||||||
dc.SetBrush(m_brush);
|
dc.SetBrush(m_brush);
|
||||||
|
|
@ -569,10 +603,10 @@ void mpFXY::Plot(wxDC &dc, mpWindow &w) {
|
||||||
// positioning
|
// positioning
|
||||||
Rewind();
|
Rewind();
|
||||||
GetNextXY(x, y);
|
GetNextXY(x, y);
|
||||||
maxDrawX = x;
|
maxDrawX = 0;
|
||||||
minDrawX = x;
|
minDrawX = 10000000000;
|
||||||
maxDrawY = y;
|
maxDrawY = 0;
|
||||||
minDrawY = y;
|
minDrawY = 10000000000;
|
||||||
// drawnPoints = 0;
|
// drawnPoints = 0;
|
||||||
Rewind();
|
Rewind();
|
||||||
|
|
||||||
|
|
@ -588,7 +622,41 @@ void mpFXY::Plot(wxDC &dc, mpWindow &w) {
|
||||||
if (!m_continuous) {
|
if (!m_continuous) {
|
||||||
// for some reason DrawPoint does not use the current pen,
|
// for some reason DrawPoint does not use the current pen,
|
||||||
// so we use DrawLine for fat pens
|
// so we use DrawLine for fat pens
|
||||||
if (m_pen.GetWidth() <= 1) {
|
if (isBar) {
|
||||||
|
double widthbar = 0.9;
|
||||||
|
int ix2,iy2;
|
||||||
|
iy2 = w.y2p(0);
|
||||||
|
dc.SetFont(m_font);
|
||||||
|
if (iy2 > maxYpx) iy2 = maxYpx;
|
||||||
|
bool viewY = false;
|
||||||
|
while (GetNextXY(x, y)) {
|
||||||
|
ix = w.x2p(x- widthbar/2);
|
||||||
|
ix2 = w.x2p(x + widthbar / 2);
|
||||||
|
iy = w.y2p(y);
|
||||||
|
viewY = false;
|
||||||
|
if (iy < minYpx) { iy = minYpx; viewY = true; }
|
||||||
|
if (ix2 > endPx) ix2 = endPx;
|
||||||
|
if (ix < startPx) ix = startPx;
|
||||||
|
if (ix2 < startPx|| ix>endPx) continue;
|
||||||
|
if (m_drawOutsideMargins || ((ix >= startPx) && (ix <= endPx) &&
|
||||||
|
(iy >= minYpx) && (iy <= maxYpx))) {
|
||||||
|
dc.DrawRectangle(ix, iy, ix2 - ix, iy2 - iy);
|
||||||
|
UpdateViewBoundary(ix, iy);
|
||||||
|
wxCoord tx, ty;
|
||||||
|
wxString s = v->GetLegendBar();
|
||||||
|
|
||||||
|
|
||||||
|
wxRect rectBig(ix,iy, ix2 - ix, iy2 - iy);
|
||||||
|
wxRect rectSmall(0, 0, tx, ty);
|
||||||
|
drawInRectText(dc,s,rectBig,wxALIGN_CENTER);
|
||||||
|
if (viewY) {
|
||||||
|
s.Printf("%f",y);
|
||||||
|
drawInRectText(dc, s, rectBig, wxALIGN_TOP);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (m_pen.GetWidth() <= 1) {
|
||||||
while (GetNextXY(x, y)) {
|
while (GetNextXY(x, y)) {
|
||||||
ix = w.x2p(x);
|
ix = w.x2p(x);
|
||||||
iy = w.y2p(y);
|
iy = w.y2p(y);
|
||||||
|
|
@ -923,11 +991,7 @@ void mpScaleX::Plot(wxDC &dc, mpWindow &w) {
|
||||||
|
|
||||||
// double n = floor( (w.GetPosX() - (double)extend / w.GetScaleX()) / step )
|
// double n = floor( (w.GetPosX() - (double)extend / w.GetScaleX()) / step )
|
||||||
// * step ;
|
// * step ;
|
||||||
double n0 =
|
double n0 =floor((w.GetPosX() /* - (double)(extend - w.GetMarginLeft() - w.GetMarginRight())/ w.GetScaleX() */) /step) * step;
|
||||||
floor(
|
|
||||||
(w.GetPosX() /* - (double)(extend - w.GetMarginLeft() - w.GetMarginRight())/ w.GetScaleX() */) /
|
|
||||||
step) *
|
|
||||||
step;
|
|
||||||
double n = 0;
|
double n = 0;
|
||||||
#ifdef MATHPLOT_DO_LOGGING
|
#ifdef MATHPLOT_DO_LOGGING
|
||||||
wxLogMessage(wxT("mpScaleX::Plot: dig: %f , step: %f, end: %f, n: %f"), dig,
|
wxLogMessage(wxT("mpScaleX::Plot: dig: %f , step: %f, end: %f, n: %f"), dig,
|
||||||
|
|
@ -1325,6 +1389,10 @@ EVT_LEFT_UP(mpWindow::OnMouseLeftRelease)
|
||||||
EVT_MENU(mpID_CENTER, mpWindow::OnCenter)
|
EVT_MENU(mpID_CENTER, mpWindow::OnCenter)
|
||||||
EVT_MENU(mpID_FIT, mpWindow::OnFit)
|
EVT_MENU(mpID_FIT, mpWindow::OnFit)
|
||||||
EVT_MENU(mpID_ZOOM_IN, mpWindow::OnZoomIn)
|
EVT_MENU(mpID_ZOOM_IN, mpWindow::OnZoomIn)
|
||||||
|
EVT_MENU(mpID_ZOOM_INX, mpWindow::OnZoomInX)
|
||||||
|
EVT_MENU(mpID_ZOOM_INX, mpWindow::OnZoomInY)
|
||||||
|
EVT_MENU(mpID_ZOOM_OUTX, mpWindow::OnZoomOutX)
|
||||||
|
EVT_MENU(mpID_ZOOM_OUTX, mpWindow::OnZoomOutY)
|
||||||
EVT_MENU(mpID_ZOOM_OUT, mpWindow::OnZoomOut)
|
EVT_MENU(mpID_ZOOM_OUT, mpWindow::OnZoomOut)
|
||||||
EVT_MENU(mpID_LOCKASPECT, mpWindow::OnLockAspect)
|
EVT_MENU(mpID_LOCKASPECT, mpWindow::OnLockAspect)
|
||||||
EVT_MENU(mpID_HELP_MOUSE, mpWindow::OnMouseHelp)
|
EVT_MENU(mpID_HELP_MOUSE, mpWindow::OnMouseHelp)
|
||||||
|
|
@ -1777,6 +1845,18 @@ void mpWindow::ZoomOut(const wxPoint ¢erPoint) {
|
||||||
#endif
|
#endif
|
||||||
UpdateAll();
|
UpdateAll();
|
||||||
}
|
}
|
||||||
|
void mpWindow::OnZoomInX(wxCommandEvent& WXUNUSED(event)) {
|
||||||
|
ZoomInX();
|
||||||
|
}
|
||||||
|
void mpWindow::OnZoomInY(wxCommandEvent& WXUNUSED(event)) {
|
||||||
|
ZoomInY();
|
||||||
|
}
|
||||||
|
void mpWindow::OnZoomOutX(wxCommandEvent& WXUNUSED(event)) {
|
||||||
|
ZoomOutX();
|
||||||
|
}
|
||||||
|
void mpWindow::OnZoomOutY(wxCommandEvent& WXUNUSED(event)) {
|
||||||
|
ZoomOutY();
|
||||||
|
}
|
||||||
|
|
||||||
void mpWindow::ZoomInX() {
|
void mpWindow::ZoomInX() {
|
||||||
m_scaleX = m_scaleX * zoomIncrementalFactor;
|
m_scaleX = m_scaleX * zoomIncrementalFactor;
|
||||||
|
|
@ -2566,6 +2646,7 @@ bool mpFXYVector::GetNextXY(double &x, double &y) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
else {
|
else {
|
||||||
x = m_xs[m_index];
|
x = m_xs[m_index];
|
||||||
|
if (m_leg.size() > 0) m_current_leg = m_leg[m_index];
|
||||||
y = m_ys[m_index++];
|
y = m_ys[m_index++];
|
||||||
return m_index <= m_xs.size();
|
return m_index <= m_xs.size();
|
||||||
}
|
}
|
||||||
|
|
@ -2574,6 +2655,10 @@ bool mpFXYVector::GetNextXY(double &x, double &y) {
|
||||||
void mpFXYVector::Clear() {
|
void mpFXYVector::Clear() {
|
||||||
m_xs.clear();
|
m_xs.clear();
|
||||||
m_ys.clear();
|
m_ys.clear();
|
||||||
|
m_leg.clear();
|
||||||
|
}
|
||||||
|
int mpFXYVector::GetSize() {
|
||||||
|
return m_xs.size();
|
||||||
}
|
}
|
||||||
double mpFXYVector::GetDistance(double &x,double &y) {
|
double mpFXYVector::GetDistance(double &x,double &y) {
|
||||||
std::vector<double>::const_iterator itX;
|
std::vector<double>::const_iterator itX;
|
||||||
|
|
@ -2593,7 +2678,15 @@ double mpFXYVector::GetDistance(double &x,double &y) {
|
||||||
return minD;
|
return minD;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
void mpFXYVector::SetLegendBar(const std::vector<wxString>& leg) {
|
||||||
|
if (leg.size() != m_ys.size()) {
|
||||||
|
wxLogError(
|
||||||
|
_("wxMathPlot error: X and Y vector are not of the same length!"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_leg = leg;
|
||||||
|
|
||||||
|
}
|
||||||
void mpFXYVector::SetData(const std::vector<double> &xs,
|
void mpFXYVector::SetData(const std::vector<double> &xs,
|
||||||
const std::vector<double> &ys) {
|
const std::vector<double> &ys) {
|
||||||
// Check if the data vectora are of the same size
|
// Check if the data vectora are of the same size
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ public:
|
||||||
frmPlot(frmQuery* parent, const wxString& _title);
|
frmPlot(frmQuery* parent, const wxString& _title);
|
||||||
~frmPlot();
|
~frmPlot();
|
||||||
void Go();
|
void Go();
|
||||||
void AddSeries(const wxString legend, const std::vector<double>& x, const std::vector<double>& y);
|
void AddSeries(const wxString legend, const std::vector<double>& x, const std::vector<double>& y,const std::vector<wxString>& l);
|
||||||
void ClearAndSetAxis(wxString XtextAxis, unsigned int X_labelType, wxString YtextAxis);
|
void ClearAndSetAxis(wxString XtextAxis, unsigned int X_labelType, wxString YtextAxis);
|
||||||
void OnAbout(wxCommandEvent& event);
|
void OnAbout(wxCommandEvent& event);
|
||||||
void OnQuit(wxCommandEvent& event);
|
void OnQuit(wxCommandEvent& event);
|
||||||
|
|
@ -26,10 +26,20 @@ public:
|
||||||
void OnCopy(wxCommandEvent& event);
|
void OnCopy(wxCommandEvent& event);
|
||||||
void OnToggleInfoLayer(wxCommandEvent& event);
|
void OnToggleInfoLayer(wxCommandEvent& event);
|
||||||
void OnSaveScreenshot(wxCommandEvent& event);
|
void OnSaveScreenshot(wxCommandEvent& event);
|
||||||
void OnToggleLissajoux(wxCommandEvent& event);
|
void OnToggleShowSeries(wxCommandEvent& event);
|
||||||
void OnToggleShowSimbol(wxCommandEvent& event);
|
void OnToggleShowSimbol(wxCommandEvent& event);
|
||||||
void OnToggleCosine(wxCommandEvent& event);
|
void OnToggleCosine(wxCommandEvent& event);
|
||||||
void OnBlackTheme(wxCommandEvent& event);
|
void OnBlackTheme(wxCommandEvent& event);
|
||||||
|
void OnCenter(wxCommandEvent& event) { m_plot->OnCenter(event); };
|
||||||
|
void OnZoomIn(wxCommandEvent& event) { m_plot->OnZoomIn(event); };
|
||||||
|
void OnZoomInX(wxCommandEvent& event) { m_plot->OnZoomInX(event); };
|
||||||
|
void OnZoomInY(wxCommandEvent& event) { m_plot->OnZoomInY(event); };
|
||||||
|
void OnZoomOutX(wxCommandEvent& event) { m_plot->OnZoomOutX(event); };
|
||||||
|
void OnZoomOutY(wxCommandEvent& event) { m_plot->OnZoomOutY(event); };
|
||||||
|
void OnZoomOut(wxCommandEvent& event) { m_plot->OnZoomOut(event); };
|
||||||
|
void OnLockAspect(wxCommandEvent& event) { m_plot->OnLockAspect(event); };
|
||||||
|
void OnKEY_DOWN(wxKeyEvent& event);
|
||||||
|
|
||||||
|
|
||||||
mpWindow* m_plot;
|
mpWindow* m_plot;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,10 @@ enum {
|
||||||
mpID_FIT = 2000, //!< Fit view to match bounding box of all layers
|
mpID_FIT = 2000, //!< Fit view to match bounding box of all layers
|
||||||
mpID_ZOOM_IN, //!< Zoom into view at clickposition / window center
|
mpID_ZOOM_IN, //!< Zoom into view at clickposition / window center
|
||||||
mpID_ZOOM_OUT, //!< Zoom out
|
mpID_ZOOM_OUT, //!< Zoom out
|
||||||
|
mpID_ZOOM_INX,
|
||||||
|
mpID_ZOOM_INY,
|
||||||
|
mpID_ZOOM_OUTX,
|
||||||
|
mpID_ZOOM_OUTY,
|
||||||
mpID_CENTER, //!< Center view on click position
|
mpID_CENTER, //!< Center view on click position
|
||||||
mpID_LOCKASPECT, //!< Lock x/y scaling aspect
|
mpID_LOCKASPECT, //!< Lock x/y scaling aspect
|
||||||
mpID_HELP_MOUSE //!< Shows information about the mouse commands
|
mpID_HELP_MOUSE //!< Shows information about the mouse commands
|
||||||
|
|
@ -662,6 +666,14 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual bool GetNextXY(double &x, double &y) = 0;
|
virtual bool GetNextXY(double &x, double &y) = 0;
|
||||||
|
|
||||||
|
/** Get legend value for N.
|
||||||
|
Override this function in your implementation.
|
||||||
|
@param x Returns X value
|
||||||
|
@param y Returns Y value
|
||||||
|
*/
|
||||||
|
virtual wxString GetLegendBar() = 0;
|
||||||
|
|
||||||
|
|
||||||
/** Layer plot handler.
|
/** Layer plot handler.
|
||||||
This implementation will plot the locus in the visible area and
|
This implementation will plot the locus in the visible area and
|
||||||
put a label according to the alignment specified.
|
put a label according to the alignment specified.
|
||||||
|
|
@ -1315,6 +1327,18 @@ public:
|
||||||
@return reference to axis colour used in theme */
|
@return reference to axis colour used in theme */
|
||||||
const wxColour &GetAxesColour() { return m_axColour; };
|
const wxColour &GetAxesColour() { return m_axColour; };
|
||||||
|
|
||||||
|
void OnCenter(wxCommandEvent& event); //!< Context menu handler
|
||||||
|
void OnFit(wxCommandEvent& event); //!< Context menu handler
|
||||||
|
void OnZoomIn(wxCommandEvent& event); //!< Context menu handler
|
||||||
|
void OnZoomOut(wxCommandEvent& event); //!< Context menu handler
|
||||||
|
void OnZoomInX(wxCommandEvent& WXUNUSED(event));
|
||||||
|
void OnZoomInY(wxCommandEvent& WXUNUSED(event));
|
||||||
|
void OnZoomOutX(wxCommandEvent& WXUNUSED(event));
|
||||||
|
void OnZoomOutY(wxCommandEvent& WXUNUSED(event));
|
||||||
|
void OnScrollThumbTrack(
|
||||||
|
wxScrollWinEvent& event); //!< Scroll thumb on scroll bar moving
|
||||||
|
|
||||||
|
void OnLockAspect(wxCommandEvent& event); //!< Context menu handler
|
||||||
protected:
|
protected:
|
||||||
void OnPaint(
|
void OnPaint(
|
||||||
wxPaintEvent &event); //!< Paint handler, will plot all attached layers
|
wxPaintEvent &event); //!< Paint handler, will plot all attached layers
|
||||||
|
|
@ -1328,11 +1352,6 @@ protected:
|
||||||
//when the user drags with the
|
//when the user drags with the
|
||||||
//right button or just "clicks"
|
//right button or just "clicks"
|
||||||
//for the menu
|
//for the menu
|
||||||
void OnCenter(wxCommandEvent &event); //!< Context menu handler
|
|
||||||
void OnFit(wxCommandEvent &event); //!< Context menu handler
|
|
||||||
void OnZoomIn(wxCommandEvent &event); //!< Context menu handler
|
|
||||||
void OnZoomOut(wxCommandEvent &event); //!< Context menu handler
|
|
||||||
void OnLockAspect(wxCommandEvent &event); //!< Context menu handler
|
|
||||||
void OnMouseHelp(wxCommandEvent &event); //!< Context menu handler
|
void OnMouseHelp(wxCommandEvent &event); //!< Context menu handler
|
||||||
void OnMouseWheel(wxMouseEvent &event); //!< Mouse handler for the wheel
|
void OnMouseWheel(wxMouseEvent &event); //!< Mouse handler for the wheel
|
||||||
void OnMouseMove(
|
void OnMouseMove(
|
||||||
|
|
@ -1341,8 +1360,6 @@ protected:
|
||||||
OnMouseLeftDown(wxMouseEvent &event); //!< Mouse left click (for rect zoom)
|
OnMouseLeftDown(wxMouseEvent &event); //!< Mouse left click (for rect zoom)
|
||||||
void
|
void
|
||||||
OnMouseLeftRelease(wxMouseEvent &event); //!< Mouse left click (for rect zoom)
|
OnMouseLeftRelease(wxMouseEvent &event); //!< Mouse left click (for rect zoom)
|
||||||
void OnScrollThumbTrack(
|
|
||||||
wxScrollWinEvent &event); //!< Scroll thumb on scroll bar moving
|
|
||||||
void OnScrollPageUp(wxScrollWinEvent &event); //!< Scroll page up
|
void OnScrollPageUp(wxScrollWinEvent &event); //!< Scroll page up
|
||||||
void OnScrollPageDown(wxScrollWinEvent &event); //!< Scroll page down
|
void OnScrollPageDown(wxScrollWinEvent &event); //!< Scroll page down
|
||||||
void OnScrollLineUp(wxScrollWinEvent &event); //!< Scroll line up
|
void OnScrollLineUp(wxScrollWinEvent &event); //!< Scroll line up
|
||||||
|
|
@ -1451,17 +1468,24 @@ public:
|
||||||
* @sa Clear
|
* @sa Clear
|
||||||
*/
|
*/
|
||||||
void SetData(const std::vector<double> &xs, const std::vector<double> &ys);
|
void SetData(const std::vector<double> &xs, const std::vector<double> &ys);
|
||||||
|
void SetLegendBar(const std::vector<wxString>& leg);
|
||||||
|
bool IsLegendBar() { return m_leg.size() > 0; }
|
||||||
|
wxString GetLegendBar() {
|
||||||
|
return m_current_leg
|
||||||
|
;
|
||||||
|
}
|
||||||
/** Clears all the data, leaving the layer empty.
|
/** Clears all the data, leaving the layer empty.
|
||||||
* @sa SetData
|
* @sa SetData
|
||||||
*/
|
*/
|
||||||
void Clear();
|
void Clear();
|
||||||
double GetDistance(double &x,double &y);
|
double GetDistance(double &x,double &y);
|
||||||
|
int GetSize();
|
||||||
protected:
|
protected:
|
||||||
/** The internal copy of the set of data to draw.
|
/** The internal copy of the set of data to draw.
|
||||||
*/
|
*/
|
||||||
std::vector<double> m_xs, m_ys;
|
std::vector<double> m_xs, m_ys;
|
||||||
|
std::vector<wxString> m_leg;
|
||||||
|
wxString m_current_leg;
|
||||||
/** The internal counter for the "GetNextXY" interface
|
/** The internal counter for the "GetNextXY" interface
|
||||||
*/
|
*/
|
||||||
size_t m_index;
|
size_t m_index;
|
||||||
|
|
|
||||||
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue