-\r
-\r
-void\r
-ImageFileView::OnPlotRow (wxCommandEvent& event)\r
-{\r
- int xCursor, yCursor;\r
- if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) {\r
- wxMessageBox ("No row selected. Please use left mouse button on image to select column","Error");\r
- return;\r
- }\r
- \r
- const ImageFile& rIF = dynamic_cast<ImageFileDocument*>(GetDocument())->getImageFile();\r
- ImageFileArrayConst v = rIF.getArray();\r
- int nx = rIF.nx();\r
- int ny = rIF.ny();\r
- \r
- if (v != NULL && yCursor < ny) {\r
- double* pX = new double [nx];\r
- double* pY = new double [nx];\r
- for (int i = 0; i < nx; i++) {\r
- pX[i] = i;\r
- pY[i] = v[i][yCursor];\r
- }\r
- PlotFileDocument* pPlotDoc = dynamic_cast<PlotFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT));\r
- if (! pPlotDoc) {\r
- sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");\r
- } else {\r
- PlotFile& rPlotFile = pPlotDoc->getPlotFile();\r
- std::ostringstream title;\r
- title << "Row " << yCursor;\r
- rPlotFile.setTitle(title.str());\r
- rPlotFile.setXLabel("Column");\r
- rPlotFile.setYLabel("Pixel Value");\r
- rPlotFile.setCurveSize (2, nx);\r
- rPlotFile.addColumn (0, pX);\r
- rPlotFile.addColumn (1, pY);\r
- }\r
- delete pX;\r
- delete pY;\r
- pPlotDoc->Modify(true);\r
- }\r
- \r
-}\r
-
-void\r
-ImageFileView::OnPlotCol (wxCommandEvent& event)\r
-{\r
- int xCursor, yCursor;\r
- if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) {\r
- wxMessageBox ("No column selected. Please use left mouse button on image to select column","Error");\r
- return;\r
- }\r
- \r
- const ImageFile& rIF = dynamic_cast<ImageFileDocument*>(GetDocument())->getImageFile();\r
- ImageFileArrayConst v = rIF.getArray();\r
- int nx = rIF.nx();\r
- int ny = rIF.ny();\r
- \r
- if (v != NULL && xCursor < nx) {\r
- double* pX = new double [ny];\r
- double* pY = new double [ny];\r
- for (int i = 0; i < ny; i++) {\r
- pX[i] = i;\r
- pY[i] = v[xCursor][i];\r
- }\r
- PlotFileDocument* pPlotDoc = dynamic_cast<PlotFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT));\r
- if (! pPlotDoc) {\r
- sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");\r
- } else {\r
- PlotFile& rPlotFile = pPlotDoc->getPlotFile();\r
- std::ostringstream title;\r
- title << "Column " << xCursor;\r
- rPlotFile.setTitle(title.str());\r
- rPlotFile.setXLabel("Row");\r
- rPlotFile.setYLabel("Pixel Value");\r
- rPlotFile.setCurveSize (2, nx);\r
- rPlotFile.addColumn (0, pX);\r
- rPlotFile.addColumn (1, pY);\r
- }\r
- delete pX;\r
- delete pY;\r
- pPlotDoc->Modify(true);\r
- }\r
-}\r
-\r
-void\r
-ImageFileView::OnCompareCol (wxCommandEvent& event)\r
-{\r
- int xCursor, yCursor;\r
- if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) {\r
- wxMessageBox ("No column selected. Please use left mouse button on image to select column","Error");\r
- return;\r
- }\r
- \r
- std::vector<ImageFileDocument*> vecIFDoc;\r
- theApp->getCompatibleImages (GetDocument(), vecIFDoc);\r
- \r
- DialogGetComparisonImage dialogGetCompare (m_frame, "Get Comparison Image", vecIFDoc, false);\r
- \r
- if (dialogGetCompare.ShowModal() == wxID_OK) {\r
- ImageFileDocument* pCompareDoc = dialogGetCompare.getImageFileDocument();\r
- const ImageFile& rIF = GetDocument()->getImageFile();\r
- const ImageFile& rCompareIF = pCompareDoc->getImageFile();\r
- \r
- ImageFileArrayConst v1 = rIF.getArray();\r
- ImageFileArrayConst v2 = rCompareIF.getArray();\r
- int nx = rIF.nx();\r
- int ny = rIF.ny();\r
- \r
- if (v1 != NULL && xCursor < nx) {\r
- double* pX = new double [ny];\r
- double* pY1 = new double [ny];\r
- double* pY2 = new double [ny];\r
- for (int i = 0; i < ny; i++) {\r
- pX[i] = i;\r
- pY1[i] = v1[xCursor][i];\r
- pY2[i] = v2[xCursor][i];\r
- }\r
- PlotFileDocument* pPlotDoc = dynamic_cast<PlotFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT));\r
- if (! pPlotDoc) {\r
- sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");\r
- } else {\r
- PlotFile& rPlotFile = pPlotDoc->getPlotFile();\r
- std::ostringstream title;\r
- title << "Comparison of Column " << xCursor;\r
- rPlotFile.setTitle(title.str());\r
- rPlotFile.setXLabel("Row");\r
- rPlotFile.setYLabel("Pixel Value");\r
- rPlotFile.setCurveSize (3, nx);\r
- rPlotFile.addColumn (0, pX);\r
- rPlotFile.addColumn (1, pY1);\r
- rPlotFile.addColumn (2, pY2);\r
- }\r
- delete pX;\r
- delete pY1;\r
- delete pY2;\r
- pPlotDoc->Modify(true);\r
- }\r
- }\r
-}\r
-
-void\r
-ImageFileView::OnCompareRow (wxCommandEvent& event)\r
-{\r
- int xCursor, yCursor;\r
- if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) {\r
- wxMessageBox ("No column selected. Please use left mouse button on image to select column","Error");\r
- return;\r
- }\r
- \r
- std::vector<ImageFileDocument*> vecIFDoc;\r
- theApp->getCompatibleImages (GetDocument(), vecIFDoc);\r
- \r
- DialogGetComparisonImage dialogGetCompare (m_frame, "Get Comparison Image", vecIFDoc, false);\r
- \r
- if (dialogGetCompare.ShowModal() == wxID_OK) {\r
- ImageFileDocument* pCompareDoc = dialogGetCompare.getImageFileDocument();\r
- const ImageFile& rIF = GetDocument()->getImageFile();\r
- const ImageFile& rCompareIF = pCompareDoc->getImageFile();\r
- \r
- ImageFileArrayConst v1 = rIF.getArray();\r
- ImageFileArrayConst v2 = rCompareIF.getArray();\r
- int nx = rIF.nx();\r
- int ny = rIF.ny();\r
- \r
- if (v1 != NULL && yCursor < ny) {\r
- double* pX = new double [nx];\r
- double* pY1 = new double [nx];\r
- double* pY2 = new double [nx];\r
- for (int i = 0; i < nx; i++) {\r
- pX[i] = i;\r
- pY1[i] = v1[i][yCursor];\r
- pY2[i] = v2[i][yCursor];\r
- }\r
- PlotFileDocument* pPlotDoc = dynamic_cast<PlotFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT));\r
- if (! pPlotDoc) {\r
- sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");\r
- } else {\r
- PlotFile& rPlotFile = pPlotDoc->getPlotFile();\r
- std::ostringstream title;\r
- title << "Comparison of Row " << yCursor;\r
- rPlotFile.setTitle(title.str());\r
- rPlotFile.setXLabel("Column");\r
- rPlotFile.setYLabel("Pixel Value");\r
- rPlotFile.setCurveSize (3, ny);\r
- rPlotFile.addColumn (0, pX);\r
- rPlotFile.addColumn (1, pY1);\r
- rPlotFile.addColumn (2, pY2);\r
- }\r
- delete pX;\r
- delete pY1;\r
- delete pY2;\r
- pPlotDoc->Modify(true);\r
- }\r
- }\r
-}\r
-\r
-\r
+
+void
+ImageFileView::OnExport (wxCommandEvent& event)
+{
+ ImageFile& rIF = dynamic_cast<ImageFileDocument*>(GetDocument())->getImageFile();
+ ImageFileArrayConst v = rIF.getArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+ if (v != NULL && nx != 0 && ny != 0) {
+ if (! m_bMinSpecified || ! m_bMaxSpecified) {
+ double min, max;
+ rIF.getMinMax (min, max);
+ if (! m_bMinSpecified)
+ m_dMinPixel = min;
+ if (! m_bMaxSpecified)
+ m_dMaxPixel = max;
+ }
+
+ DialogExportParameters dialogExport (m_frame, m_iDefaultExportFormatID);
+ if (dialogExport.ShowModal() == wxID_OK) {
+ wxString strFormatName (dialogExport.getFormatName ());
+ m_iDefaultExportFormatID = ImageFile::convertFormatNameToID (strFormatName.c_str());
+
+ wxString strExt;
+ wxString strWildcard;
+ if (m_iDefaultExportFormatID == ImageFile::FORMAT_PGM || m_iDefaultExportFormatID == ImageFile::FORMAT_PGMASCII) {
+ strExt = ".pgm";
+ strWildcard = "PGM Files (*.pgm)|*.pgm";
+ }
+#ifdef HAVE_PNG
+ else if (m_iDefaultExportFormatID == ImageFile::FORMAT_PNG || m_iDefaultExportFormatID == ImageFile::FORMAT_PNG16) {
+ strExt = ".png";
+ strWildcard = "PNG Files (*.png)|*.png";
+ }
+#endif
+
+ const wxString& strFilename = wxFileSelector (wxString("Export Filename"), wxString(""),
+ wxString(""), strExt, strWildcard, wxOVERWRITE_PROMPT | wxHIDE_READONLY | wxSAVE);
+ if (strFilename) {
+ rIF.exportImage (strFormatName.c_str(), strFilename.c_str(), 1, 1, m_dMinPixel, m_dMaxPixel);
+ *theApp->getLog() << "Exported file " << strFilename << "\n";
+ }
+ }
+ }
+}
+
+void
+ImageFileView::OnScaleSize (wxCommandEvent& event)
+{
+ ImageFile& rIF = GetDocument()->getImageFile();
+ unsigned int iOldNX = rIF.nx();
+ unsigned int iOldNY = rIF.ny();
+
+ DialogGetXYSize dialogGetXYSize (m_frame, "Set New X & Y Dimensions", iOldNX, iOldNY);
+ if (dialogGetXYSize.ShowModal() == wxID_OK) {
+ unsigned int iNewNX = dialogGetXYSize.getXSize();
+ unsigned int iNewNY = dialogGetXYSize.getYSize();
+ std::ostringstream os;
+ os << "Scale Size from (" << iOldNX << "," << iOldNY << ") to (" << iNewNX << "," << iNewNY << ")";
+ ImageFileDocument* pScaledDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));
+ if (! pScaledDoc) {
+ sys_error (ERR_SEVERE, "Unable to create image file");
+ return;
+ }
+ ImageFile& rScaledIF = pScaledDoc->getImageFile();
+ rScaledIF.setArraySize (iNewNX, iNewNY);
+ rScaledIF.labelsCopy (rIF);
+ rScaledIF.labelAdd (os.str().c_str());
+ rIF.scaleImage (rScaledIF);
+ *theApp->getLog() << os.str().c_str() << "\n";
+ if (theApp->getSetModifyNewDocs())
+ pScaledDoc->Modify(TRUE);
+ pScaledDoc->UpdateAllViews (this);
+ pScaledDoc->GetFirstView()->OnUpdate (this, NULL);
+ }
+}
+
+void
+ImageFileView::OnPlotRow (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) {
+ wxMessageBox ("No row selected. Please use left mouse button on image to select column","Error");
+ return;
+ }
+
+ const ImageFile& rIF = dynamic_cast<ImageFileDocument*>(GetDocument())->getImageFile();
+ ImageFileArrayConst v = rIF.getArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+
+ if (v != NULL && yCursor < ny) {
+ double* pX = new double [nx];
+ double* pY = new double [nx];
+ for (int i = 0; i < nx; i++) {
+ pX[i] = i;
+ pY[i] = v[i][yCursor];
+ }
+ PlotFileDocument* pPlotDoc = dynamic_cast<PlotFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT));
+ if (! pPlotDoc) {
+ sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");
+ } else {
+ PlotFile& rPlotFile = pPlotDoc->getPlotFile();
+ std::ostringstream os;
+ os << "Row " << yCursor;
+ std::string title("title ");
+ title += os.str();
+ rPlotFile.addEzsetCommand (title.c_str());
+ rPlotFile.addEzsetCommand ("xlabel Column");
+ rPlotFile.addEzsetCommand ("ylabel Pixel Value");
+ rPlotFile.addEzsetCommand ("lxfrac 0");
+ rPlotFile.addEzsetCommand ("box");
+ rPlotFile.addEzsetCommand ("grid");
+ rPlotFile.setCurveSize (2, nx);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pY);
+ }
+ delete pX;
+ delete pY;
+ if (theApp->getSetModifyNewDocs())
+ pPlotDoc->Modify(true);
+ pPlotDoc->UpdateAllViews();
+ }
+}
+
+void
+ImageFileView::OnPlotCol (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) {
+ wxMessageBox ("No column selected. Please use left mouse button on image to select column","Error");
+ return;
+ }
+
+ const ImageFile& rIF = dynamic_cast<ImageFileDocument*>(GetDocument())->getImageFile();
+ ImageFileArrayConst v = rIF.getArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+
+ if (v != NULL && xCursor < nx) {
+ double* pX = new double [ny];
+ double* pY = new double [ny];
+ for (int i = 0; i < ny; i++) {
+ pX[i] = i;
+ pY[i] = v[xCursor][i];
+ }
+ PlotFileDocument* pPlotDoc = dynamic_cast<PlotFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT));
+ if (! pPlotDoc) {
+ sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");
+ } else {
+ PlotFile& rPlotFile = pPlotDoc->getPlotFile();
+ std::ostringstream os;
+ os << "Column " << xCursor;
+ std::string title("title ");
+ title += os.str();
+ rPlotFile.addEzsetCommand (title.c_str());
+ rPlotFile.addEzsetCommand ("xlabel Row");
+ rPlotFile.addEzsetCommand ("ylabel Pixel Value");
+ rPlotFile.addEzsetCommand ("lxfrac 0");
+ rPlotFile.addEzsetCommand ("box");
+ rPlotFile.addEzsetCommand ("grid");
+ rPlotFile.setCurveSize (2, nx);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pY);
+ }
+ delete pX;
+ delete pY;
+ if (theApp->getSetModifyNewDocs())
+ pPlotDoc->Modify(true);
+ pPlotDoc->UpdateAllViews();
+ }
+}
+
+#ifdef HAVE_FFT
+void
+ImageFileView::OnPlotFFTRow (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) {
+ wxMessageBox ("No row selected. Please use left mouse button on image to select column","Error");
+ return;
+ }
+
+ const ImageFile& rIF = dynamic_cast<ImageFileDocument*>(GetDocument())->getImageFile();
+ ImageFileArrayConst v = rIF.getArray();
+ ImageFileArrayConst vImag = rIF.getImaginaryArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+
+ if (v != NULL && yCursor < ny) {
+ fftw_complex* pcIn = new fftw_complex [nx];
+
+ int i;
+ for (i = 0; i < nx; i++) {
+ pcIn[i].re = v[i][yCursor];
+ if (rIF.isComplex())
+ pcIn[i].im = vImag[i][yCursor];
+ else
+ pcIn[i].im = 0;
+ }
+
+ fftw_plan plan = fftw_create_plan (nx, FFTW_FORWARD, FFTW_IN_PLACE);
+ fftw_one (plan, pcIn, NULL);
+ fftw_destroy_plan (plan);
+
+ double* pX = new double [nx];
+ double* pYReal = new double [nx];
+ double* pYImag = new double [nx];
+ double* pYMag = new double [nx];
+ for (i = 0; i < nx; i++) {
+ pX[i] = i;
+ pYReal[i] = pcIn[i].re;
+ pYImag[i] = pcIn[i].im;
+ pYMag[i] = ::sqrt (pcIn[i].re * pcIn[i].re + pcIn[i].im * pcIn[i].im);
+ }
+ Fourier::shuffleFourierToNaturalOrder (pYReal, nx);
+ Fourier::shuffleFourierToNaturalOrder (pYImag, nx);
+ Fourier::shuffleFourierToNaturalOrder (pYMag, nx);
+
+ PlotFileDocument* pPlotDoc = dynamic_cast<PlotFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT));
+ if (! pPlotDoc) {
+ sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");
+ } else {
+ PlotFile& rPlotFile = pPlotDoc->getPlotFile();
+ std::ostringstream os;
+ os << "Row " << yCursor;
+ std::string title("title ");
+ title += os.str();
+ rPlotFile.addEzsetCommand (title.c_str());
+ rPlotFile.addEzsetCommand ("xlabel Column");
+ rPlotFile.addEzsetCommand ("ylabel Pixel Value");
+ rPlotFile.addEzsetCommand ("lxfrac 0");
+ rPlotFile.addEzsetCommand ("curve 1");
+ rPlotFile.addEzsetCommand ("color 1");
+ rPlotFile.addEzsetCommand ("curve 2");
+ rPlotFile.addEzsetCommand ("color 2");
+ rPlotFile.addEzsetCommand ("dash 1");
+ rPlotFile.addEzsetCommand ("curve 3");
+ rPlotFile.addEzsetCommand ("dash 2");
+ rPlotFile.addEzsetCommand ("color 3");
+ rPlotFile.addEzsetCommand ("box");
+ rPlotFile.addEzsetCommand ("grid");
+ rPlotFile.setCurveSize (2, nx);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pYReal);
+ rPlotFile.addColumn (2, pYImag);
+ rPlotFile.addColumn (3, pYMag);
+ }
+ delete pX;
+ delete pYReal;
+ delete pYImag;
+ delete pYMag;
+ delete [] pcIn;
+
+ if (theApp->getSetModifyNewDocs())
+ pPlotDoc->Modify(true);
+ pPlotDoc->UpdateAllViews();
+ }
+}
+
+void
+ImageFileView::OnPlotFFTCol (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) {
+ wxMessageBox ("No column selected. Please use left mouse button on image to select column","Error");
+ return;
+ }
+
+ const ImageFile& rIF = dynamic_cast<ImageFileDocument*>(GetDocument())->getImageFile();
+ ImageFileArrayConst v = rIF.getArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+
+ if (v != NULL && xCursor < nx) {
+ double* pX = new double [ny];
+ double* pY = new double [ny];
+ for (int i = 0; i < ny; i++) {
+ pX[i] = i;
+ pY[i] = v[xCursor][i];
+ }
+ PlotFileDocument* pPlotDoc = dynamic_cast<PlotFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT));
+ if (! pPlotDoc) {
+ sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");
+ } else {
+ PlotFile& rPlotFile = pPlotDoc->getPlotFile();
+ std::ostringstream os;
+ os << "Column " << xCursor;
+ std::string title("title ");
+ title += os.str();
+ rPlotFile.addEzsetCommand (title.c_str());
+ rPlotFile.addEzsetCommand ("xlabel Row");
+ rPlotFile.addEzsetCommand ("ylabel Pixel Value");
+ rPlotFile.addEzsetCommand ("lxfrac 0");
+ rPlotFile.addEzsetCommand ("box");
+ rPlotFile.addEzsetCommand ("grid");
+ rPlotFile.setCurveSize (2, nx);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pY);
+ }
+ delete pX;
+ delete pY;
+ if (theApp->getSetModifyNewDocs())
+ pPlotDoc->Modify(true);
+ pPlotDoc->UpdateAllViews();
+ }
+}
+#endif
+
+void
+ImageFileView::OnCompareCol (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) {
+ wxMessageBox ("No column selected. Please use left mouse button on image to select column","Error");
+ return;
+ }
+
+ std::vector<ImageFileDocument*> vecIFDoc;
+ theApp->getCompatibleImages (GetDocument(), vecIFDoc);
+ if (vecIFDoc.size() == 0) {
+ wxMessageBox ("No compatible images for Column Comparison", "Error");
+ return;
+ }
+ DialogGetComparisonImage dialogGetCompare (m_frame, "Get Comparison Image", vecIFDoc, false);
+
+ if (dialogGetCompare.ShowModal() == wxID_OK) {
+ ImageFileDocument* pCompareDoc = dialogGetCompare.getImageFileDocument();
+ const ImageFile& rIF = GetDocument()->getImageFile();
+ const ImageFile& rCompareIF = pCompareDoc->getImageFile();
+
+ ImageFileArrayConst v1 = rIF.getArray();
+ ImageFileArrayConst v2 = rCompareIF.getArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+
+ if (v1 != NULL && xCursor < nx) {
+ double* pX = new double [ny];
+ double* pY1 = new double [ny];
+ double* pY2 = new double [ny];
+ for (int i = 0; i < ny; i++) {
+ pX[i] = i;
+ pY1[i] = v1[xCursor][i];
+ pY2[i] = v2[xCursor][i];
+ }
+ PlotFileDocument* pPlotDoc = dynamic_cast<PlotFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT));
+ if (! pPlotDoc) {
+ sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");
+ } else {
+ PlotFile& rPlotFile = pPlotDoc->getPlotFile();
+ std::ostringstream os;
+ os << "Column " << xCursor << " Comparison";
+ std::string title("title ");
+ title += os.str();
+ rPlotFile.addEzsetCommand (title.c_str());
+ rPlotFile.addEzsetCommand ("xlabel Row");
+ rPlotFile.addEzsetCommand ("ylabel Pixel Value");
+ rPlotFile.addEzsetCommand ("lxfrac 0");
+ rPlotFile.addEzsetCommand ("curve 1");
+ rPlotFile.addEzsetCommand ("color 2");
+ rPlotFile.addEzsetCommand ("curve 2");
+ rPlotFile.addEzsetCommand ("color 4");
+ rPlotFile.addEzsetCommand ("dash 5");
+ rPlotFile.addEzsetCommand ("box");
+ rPlotFile.addEzsetCommand ("grid");
+ rPlotFile.setCurveSize (3, nx);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pY1);
+ rPlotFile.addColumn (2, pY2);
+ }
+ delete pX;
+ delete pY1;
+ delete pY2;
+ if (theApp->getSetModifyNewDocs())
+ pPlotDoc->Modify(true);
+ pPlotDoc->UpdateAllViews();
+ }
+ }
+}
+
+void
+ImageFileView::OnCompareRow (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) {
+ wxMessageBox ("No column selected. Please use left mouse button on image to select column","Error");
+ return;
+ }
+
+ std::vector<ImageFileDocument*> vecIFDoc;
+ theApp->getCompatibleImages (GetDocument(), vecIFDoc);
+
+ if (vecIFDoc.size() == 0) {
+ wxMessageBox ("No compatible images for Row Comparison", "Error");
+ return;
+ }
+
+ DialogGetComparisonImage dialogGetCompare (m_frame, "Get Comparison Image", vecIFDoc, false);
+
+ if (dialogGetCompare.ShowModal() == wxID_OK) {
+ ImageFileDocument* pCompareDoc = dialogGetCompare.getImageFileDocument();
+ const ImageFile& rIF = GetDocument()->getImageFile();
+ const ImageFile& rCompareIF = pCompareDoc->getImageFile();
+
+ ImageFileArrayConst v1 = rIF.getArray();
+ ImageFileArrayConst v2 = rCompareIF.getArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+
+ if (v1 != NULL && yCursor < ny) {
+ double* pX = new double [nx];
+ double* pY1 = new double [nx];
+ double* pY2 = new double [nx];
+ for (int i = 0; i < nx; i++) {
+ pX[i] = i;
+ pY1[i] = v1[i][yCursor];
+ pY2[i] = v2[i][yCursor];
+ }
+ PlotFileDocument* pPlotDoc = dynamic_cast<PlotFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT));
+ if (! pPlotDoc) {
+ sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");
+ } else {
+ PlotFile& rPlotFile = pPlotDoc->getPlotFile();
+ std::ostringstream os;
+ os << "Row " << yCursor << " Comparison";
+ std::string title("title ");
+ title += os.str();
+ rPlotFile.addEzsetCommand (title.c_str());
+ rPlotFile.addEzsetCommand ("xlabel Column");
+ rPlotFile.addEzsetCommand ("ylabel Pixel Value");
+ rPlotFile.addEzsetCommand ("lxfrac 0");
+ rPlotFile.addEzsetCommand ("curve 1");
+ rPlotFile.addEzsetCommand ("color 2");
+ rPlotFile.addEzsetCommand ("curve 2");
+ rPlotFile.addEzsetCommand ("color 4");
+ rPlotFile.addEzsetCommand ("dash 5");
+ rPlotFile.addEzsetCommand ("box");
+ rPlotFile.addEzsetCommand ("grid");
+ rPlotFile.setCurveSize (3, ny);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pY1);
+ rPlotFile.addColumn (2, pY2);
+ }
+ delete pX;
+ delete pY1;
+ delete pY2;
+ if (theApp->getSetModifyNewDocs())
+ pPlotDoc->Modify(true);
+ pPlotDoc->UpdateAllViews();
+ }
+ }
+}
+
+static int NUMBER_HISTOGRAM_BINS = 256;
+
+void
+ImageFileView::OnPlotHistogram (wxCommandEvent& event)
+{
+ const ImageFile& rIF = dynamic_cast<ImageFileDocument*>(GetDocument())->getImageFile();
+ ImageFileArrayConst v = rIF.getArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+
+ if (v != NULL && nx > 0 && ny > 0) {
+ PlotFileDocument* pPlotDoc = dynamic_cast<PlotFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT));
+ if (! pPlotDoc) {
+ sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");
+ return;
+ }
+
+ double* pX = new double [NUMBER_HISTOGRAM_BINS];
+ double* pY = new double [NUMBER_HISTOGRAM_BINS];
+ double dMin, dMax;
+ rIF.getMinMax (dMin, dMax);
+ double dBinWidth = (dMax - dMin) / NUMBER_HISTOGRAM_BINS;
+
+ for (int i = 0; i < NUMBER_HISTOGRAM_BINS; i++) {
+ pX[i] = dMin + (i + 0.5) * dBinWidth;
+ pY[i] = 0;
+ }
+ for (int ix = 0; ix < nx; ix++)
+ for (int iy = 0; iy < ny; iy++) {
+ int iBin = nearest<int> ((v[ix][iy] - dMin) / dBinWidth);
+ if (iBin >= 0 && iBin < NUMBER_HISTOGRAM_BINS)
+ pY[iBin] += 1;
+ }
+
+ PlotFile& rPlotFile = pPlotDoc->getPlotFile();
+ std::ostringstream os;
+ os << "Histogram";
+ std::string title("title ");
+ title += os.str();
+ rPlotFile.addEzsetCommand (title.c_str());
+ rPlotFile.addEzsetCommand ("xlabel Pixel Value");
+ rPlotFile.addEzsetCommand ("ylabel Count");
+ rPlotFile.addEzsetCommand ("box");
+ rPlotFile.addEzsetCommand ("grid");
+ rPlotFile.setCurveSize (2, nx);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pY);
+ delete pX;
+ delete pY;
+ if (theApp->getSetModifyNewDocs())
+ pPlotDoc->Modify(true);
+ pPlotDoc->UpdateAllViews();
+ }
+}
+
+