📄 svm.cpp
字号:
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/image.h"
#include "wx/file.h"
#include "wx/statline.h"
#include "measurement.cpp"
wxFile *logFile;
// fileok betolteset jelzo flagek
bool imageLoaded = false, vpLoaded = false, addingVPs = false;
// kep meretei
int width,height;
// vanishing pointok szama
int vpCount = 0;
// vanishing pointok
long **vanishingPoints = NULL;
// kivalasztott 2 vp
long selectedVP[2][2] = { {-1,-1} , {-1,-1} };
// referencia objektum merete
float refSize = -1.0;
// referencia objektum
long refObject[2][2] = { {-1,-1} , {-1,-1} };
// egerrel kivalasztott aktualis vonal
int mouseLine[2][2] = { {-1,-1} , {-1,-1} };
// ----------------------------------------------------------------------------
// SvmApp - az alkalmazashoz tartozo osztaly
// ----------------------------------------------------------------------------
class SvmApp: public wxApp {
// ez hivodik meg az alkalmazas indulasakor
virtual bool OnInit();
};
// ----------------------------------------------------------------------------
// BitmapCanvas - a MainPanel tartalma, a megjelenitest vegzi
// ----------------------------------------------------------------------------
class BitmapCanvas : public wxScrolledWindow {
public:
// konstruktorok
BitmapCanvas(wxWindow *parent, const wxSize& size);
// a bitmapet rendeli hozza az ablakhoz
void SetBitmap(const wxBitmap& bitmap);
// bitmapet adja vissza
wxBitmap* GetBitmap();
// a kep megjelenitese
void OnPaint(wxPaintEvent& event);
// eger kezeles
void OnMouseUp(wxMouseEvent& event);
void OnMouseDown(wxMouseEvent& event);
void OnMouseMove(wxMouseEvent& event);
protected:
// esemenytabla (az OnPainthez)
DECLARE_EVENT_TABLE()
private:
// eger lenyomasat jelzo flag
bool mouseDown;
// kezdeti uzenet
wxStaticText *labelWarning;
// a bitmap
wxBitmap m_bitmap;
};
// ----------------------------------------------------------------------------
// RadioWindow - a MainPanel tartalma, a radio gombokat tartalmazza
// ----------------------------------------------------------------------------
class RadioWindow : public wxScrolledWindow {
public:
// konstruktorok
RadioWindow(wxWindow *parent, const wxSize& size);
// radio gombok epitese
void CreateContent(const char* vpFileName, int x, int y);
// radio gomb megnyomasakor hivodik meg
void OnRadio1(wxCommandEvent& event);
void OnRadio2(wxCommandEvent& event);
protected:
DECLARE_EVENT_TABLE()
private:
// kezdeti szoveg
wxStaticText *labelWarning;
// radio boxok
wxRadioBox *radioBox1;
wxRadioBox *radioBox2;
enum {
RADIO_1 = 1,
RADIO_2,
};
};
// ----------------------------------------------------------------------------
// ControlWindow - a MainPanel tartalma, fo kezelo szerveket tartalmazza
// ----------------------------------------------------------------------------
class ControlWindow : public wxPanel {
public:
// konstruktorok
ControlWindow(wxWindow *parent, const wxSize& size);
// esemenykezelok
void OnTextRefsize(wxCommandEvent& event);
void OnBtnStartAdd(wxCommandEvent& event);
void OnBtnStopAdd(wxCommandEvent& event);
void OnBtnDefref(wxCommandEvent& event);
void OnBtnMeasure(wxCommandEvent& event);
// gombokat aktivalja ha lehetseges, egyebkent deaktivalja
void EnableBtns();
// get fuggvenyek
wxButton* GetBtnMeasure();
wxButton* GetBtnDefref();
protected:
DECLARE_EVENT_TABLE()
private:
wxTextCtrl *textRefsize, *textResult;
wxButton *btnDefref, *btnMeasure, *btnStartAdd, *btnStopAdd;
enum {
TEXT_REFSIZE = 11,
TEXT_RESULT,
BTN_STARTADD,
BTN_STOPADD,
BTN_DEFREF,
BTN_MEASURE,
};
};
// ----------------------------------------------------------------------------
// MainPanel - foablak tartalma
// ----------------------------------------------------------------------------
class MainPanel: public wxPanel {
public:
// konstruktor
MainPanel(wxFrame *parent);
// get fuggvenyek
BitmapCanvas* GetCanvas();
RadioWindow* GetRadioWindow();
ControlWindow* GetControlWindow();
private:
BitmapCanvas *canvas;
RadioWindow *radioWindow;
ControlWindow *controlWindow;
};
// ----------------------------------------------------------------------------
// MainFrame - foablak
// ----------------------------------------------------------------------------
class MainFrame: public wxFrame {
public:
// konstruktor
MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
// a Kep Megnyitasa menure kattintva hivodik meg
void OnOpenImage(wxCommandEvent& event);
// a VP File Megnyitasa menure kattintva hivodik meg
void OnOpenVp(wxCommandEvent& event);
// a Kilepes menure kattintva hivodik meg
void OnQuit(wxCommandEvent& event);
// a Nevjegy menure kattintva hivodik meg
void OnAbout(wxCommandEvent& event);
// menu epitese
void MenuBuild(int open);
protected:
DECLARE_EVENT_TABLE()
private:
wxMenuBar *menuBar;
wxMenu *fileMenu, *infoMenu;
MainPanel *mainPanel;
wxImage image;
enum {
MENU_IMAGE_OPEN = 21,
MENU_VPFILE_OPEN,
MENU_FILE_QUIT,
MENU_INFO_ABOUT,
};
};
// ----------------------------------------------------------------------------
// VPFIleReader - Vanishing Point fileok beolvasasara
// ----------------------------------------------------------------------------
class VPFileReader {
public:
// konstruktor, destruktor
VPFileReader(const char *vpFileName);
~VPFileReader();
// beolvasas
void ReadVPFile();
private:
char *vpFileName;
wxFile *vpFile;
};
// az esemenytablak (esemenyekhez fuggvenyeket rendel hozza)
BEGIN_EVENT_TABLE(BitmapCanvas, wxScrolledWindow)
EVT_PAINT(BitmapCanvas::OnPaint)
EVT_LEFT_DOWN(BitmapCanvas::OnMouseDown)
EVT_LEFT_UP(BitmapCanvas::OnMouseUp)
EVT_MOTION(BitmapCanvas::OnMouseMove)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(RadioWindow, wxScrolledWindow)
EVT_RADIOBOX(RADIO_1, RadioWindow::OnRadio1)
EVT_RADIOBOX(RADIO_2, RadioWindow::OnRadio2)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(ControlWindow, wxPanel)
EVT_TEXT(TEXT_REFSIZE, ControlWindow::OnTextRefsize)
EVT_BUTTON(BTN_STARTADD, ControlWindow::OnBtnStartAdd)
EVT_BUTTON(BTN_STOPADD, ControlWindow::OnBtnStopAdd)
EVT_BUTTON(BTN_DEFREF, ControlWindow::OnBtnDefref)
EVT_BUTTON(BTN_MEASURE, ControlWindow::OnBtnMeasure)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(MainFrame, wxFrame)
EVT_MENU(MENU_IMAGE_OPEN, MainFrame::OnOpenImage)
EVT_MENU(MENU_VPFILE_OPEN, MainFrame::OnOpenVp)
EVT_MENU(MENU_FILE_QUIT, MainFrame::OnQuit)
EVT_MENU(MENU_INFO_ABOUT, MainFrame::OnAbout)
END_EVENT_TABLE()
// ============================================================================
// ============================================================================
// ----------------------------------------------------------------------------
// SvmApp
// ----------------------------------------------------------------------------
IMPLEMENT_APP(SvmApp)
bool SvmApp::OnInit() {
// foablak letrehozasa
MainFrame *frame = new MainFrame( "Svm", wxPoint(0,0), wxSize(1024,640) );
// es megmutatasa
frame->Show( true );
SetTopWindow( frame );
return true;
}
// ----------------------------------------------------------------------------
// BitmapCanvas
// ----------------------------------------------------------------------------
BitmapCanvas::BitmapCanvas(wxWindow *parent, const wxSize& size) : wxScrolledWindow(parent, -1, wxDefaultPosition, size) {
mouseDown = false;
// az ablak letrehozasa
wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
labelWarning = new wxStaticText(this,-1,"No image file opened!");
mainSizer->Add(labelWarning, 0, wxTOP | wxALIGN_CENTER, 50);
// a sizer beallitasa
SetSizer(mainSizer);
}
void BitmapCanvas::SetBitmap(const wxBitmap& bitmap) {
// ablak torlese
if (!imageLoaded) labelWarning->Destroy();
// a bitmap betoltese
m_bitmap = bitmap;
imageLoaded = true;
// a scrollbar meretenek es leptekenek beallitasa
SetScrollbars(10, 10,m_bitmap.GetWidth() / 10, m_bitmap.GetHeight() / 10);
// frissites
Refresh(true);
Update();
}
wxBitmap* BitmapCanvas::GetBitmap() {
return &m_bitmap;
}
void BitmapCanvas::OnPaint(wxPaintEvent& event) {
// device context letrehozasa es hozzarendelese az ablakhoz
wxPaintDC dc(this);
PrepareDC(dc);
// a kep megjelenitese
if (m_bitmap.Ok()) {
dc.DrawBitmap(m_bitmap, 0, 0);
}
// ha van megadva ref. obj. akkor azt is kirajzolja
if (!((refObject[0][0] == -1) || (refObject[1][0] == -1) || (refObject[0][1] == -1) || (refObject[1][1] == -1) || (refSize == -1.0))) {
dc.SetPen(*wxRED_PEN);
dc.DrawLine(refObject[0][0],refObject[0][1],refObject[1][0],refObject[1][1]);
dc.SetPen(wxPen(wxColour(255,100,100),1,wxSOLID));
dc.DrawLine(refObject[0][0]-3,refObject[0][1]-3,refObject[0][0]+3,refObject[0][1]+3);
dc.DrawLine(refObject[0][0]+3,refObject[0][1]-3,refObject[0][0]-3,refObject[0][1]+3);
dc.DrawLine(refObject[1][0]-3,refObject[1][1]-3,refObject[1][0]+3,refObject[1][1]+3);
dc.DrawLine(refObject[1][0]+3,refObject[1][1]-3,refObject[1][0]-3,refObject[1][1]+3);
}
// vanishing pointok kirajzolasa
if ((selectedVP[0][0] >= 0) && (selectedVP[0][0] < width) && (selectedVP[0][1] >= 0) && (selectedVP[0][1] < height) && (imageLoaded)) {
dc.SetPen(wxPen(wxColour(0,255,100),3,wxSOLID));
dc.DrawLine(selectedVP[0][0]-3,selectedVP[0][1]-3,selectedVP[0][0]+3,selectedVP[0][1]+3);
dc.DrawLine(selectedVP[0][0]+3,selectedVP[0][1]-3,selectedVP[0][0]-3,selectedVP[0][1]+3);
}
if ((selectedVP[1][0] >= 0) && (selectedVP[1][0] < width) && (selectedVP[1][1] >= 0) && (selectedVP[1][1] < height) && (imageLoaded)) {
dc.SetPen(wxPen(wxColour(0,255,100),3,wxSOLID));
dc.DrawLine(selectedVP[1][0]-3,selectedVP[1][1]-3,selectedVP[1][0]+3,selectedVP[1][1]+3);
dc.DrawLine(selectedVP[1][0]+3,selectedVP[1][1]-3,selectedVP[1][0]-3,selectedVP[1][1]+3);
}
// vanishing line kirajzolasa
if ((selectedVP[0][0] != -1) && (selectedVP[0][1] != -1) && (selectedVP[1][0] != -1) && (selectedVP[1][1] != -1)) {
int x1 = selectedVP[0][0];
int y1 = selectedVP[0][1];
int x2 = selectedVP[1][0];
int y2 = selectedVP[1][1];
// megcsereli a ket pontot ha az elso x koordinataja nagyobb
if (x1 > x2) { int tmp=x1; x1=x2; x2=tmp; tmp=y1; y1=y2; y2=tmp;}
int X1=x1, Y1=y1, X2=x2, Y2=y2;
// addig huzza szet a vanishing point szakaszat amig nem megy vegig a kepen
if (!((x1==x2) && (y1==y2))) {
while (x1>0) { x1-=(X2-X1); y1-=(Y2-Y1); }
while (x2<width) { x2+=(X2-X1); y2+=(Y2-Y1); }
}
// logFile->Write(wxString::Format(_T("x1:%d y1:%d, x2:%d y2:%d\n"),x1,y1,x2,y2));
// logFile->Write(wxString::Format(_T("X1:%d Y1:%d, X2:%d Y2:%d\n"),X1,Y1,X2,Y2));
// logFile->Write(wxString::Format(_T("X2-X1:%d Y2-Y1:%d\n"),X2-X1,Y2-Y1));
dc.SetPen(wxPen(wxColour(0,192,100),2,wxSOLID));
dc.DrawLine(x1,y1,x2,y2);
}
// eger altal kijelolt vonal kirajzolasa
if (!((mouseLine[0][0] == -1) || (mouseLine[1][0] == -1) || (mouseLine[0][1] == -1) || (mouseLine[1][1] == -1))) {
dc.SetPen(wxPen(wxColour(0,128,210),1,wxSOLID));
dc.DrawLine(mouseLine[0][0], mouseLine[0][1], mouseLine[1][0], mouseLine[1][1]);
}
}
void BitmapCanvas::OnMouseDown(wxMouseEvent& event) {
if (!addingVPs) {
mouseDown = true;
int x,y;
CalcUnscrolledPosition(event.GetX(),event.GetY(),&x,&y);
mouseLine[0][0] = x;
mouseLine[0][1] = y;
// logFile->Write(wxString::Format(_T("+ Down: %d %d\n"),mouseLine[0][0],mouseLine[0][1]));
}
}
void BitmapCanvas::OnMouseUp(wxMouseEvent& event) {
int x,y;
CalcUnscrolledPosition(event.GetX(),event.GetY(),&x,&y);
if (!addingVPs) {
mouseDown = false;
mouseLine[1][0] = x;
mouseLine[1][1] = y;
// logFile->Write(wxString::Format(_T("- Up: %d %d\n"),mouseLine[1][0],mouseLine[1][1]));
// ablak tartalmanak frissitese
Refresh();
// defref gomb aktivalasa ha lehetseges
((MainPanel*)GetParent())->GetControlWindow()->EnableBtns();
} else {
((MainPanel*)GetParent())->GetRadioWindow()->CreateContent(NULL,x,y);
}
}
void BitmapCanvas::OnMouseMove(wxMouseEvent& event) {
int x,y;
CalcUnscrolledPosition(event.GetX(),event.GetY(),&x,&y);
((MainFrame*)(GetParent()->GetParent()))->SetStatusText(wxString::Format(_T("%d,%d"),x,y), 4);
if (mouseDown) {
mouseLine[1][0] = x;
mouseLine[1][1] = y;
// ablak tartalmanak frissitese
Refresh();
// logFile->Write(wxString::Format(_T("\tMove: %d %d\n"),mouseLine[1][0],mouseLine[1][1]));
}
}
// ----------------------------------------------------------------------------
// RadioWindow
// ----------------------------------------------------------------------------
RadioWindow::RadioWindow(wxWindow *parent, const wxSize& size) : wxScrolledWindow(parent, -1, wxDefaultPosition, size, wxSTATIC_BORDER) {
// az ablak letrehozasa
wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
labelWarning = new wxStaticText(this,-1,"No Vanishing Points file opened!");
mainSizer->Add(labelWarning, 0, wxTOP | wxALIGN_CENTER, 50);
// a sizer beallitasa
SetSizer(mainSizer);
}
void RadioWindow::CreateContent(const char* vpFileName, int x, int y) {
// ablak torlese
if (!vpLoaded) labelWarning->Destroy();
else {
radioBox1->Destroy();
radioBox2->Destroy();
}
if ((x==0) && (y==0)) { // ha file-t toltunk be
// VP file beolvasasa
VPFileReader *vpReader = new VPFileReader(vpFileName);
vpReader->ReadVPFile();
delete vpReader;
} else { // ha kezzel adunk meg vp-t
vpCount++;
// uj lista keszitese
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -