-\r
-void\r
-ImageFileView::OnExport (wxCommandEvent& event)\r
-{\r
- ImageFile& rIF = dynamic_cast<ImageFileDocument*>(GetDocument())->getImageFile();\r
- ImageFileArrayConst v = rIF.getArray();\r
- int nx = rIF.nx();\r
- int ny = rIF.ny();\r
- if (v != NULL && nx != 0 && ny != 0) {\r
- if (! m_bMinSpecified || ! m_bMaxSpecified) {\r
- double min, max;\r
- rIF.getMinMax (min, max);\r
- if (! m_bMinSpecified)\r
- m_dMinPixel = min;\r
- if (! m_bMaxSpecified)\r
- m_dMaxPixel = max;\r
- }\r
-\r
- DialogExportParameters dialogExport (m_frame, m_iDefaultExportFormatID);\r
- if (dialogExport.ShowModal() == wxID_OK) {\r
- wxString strFormatName (dialogExport.getFormatName ());\r
- m_iDefaultExportFormatID = ImageFile::convertFormatNameToID (strFormatName.c_str());\r
-\r
- wxString strExt;\r
- wxString strWildcard;\r
- if (m_iDefaultExportFormatID == ImageFile::FORMAT_PGM || m_iDefaultExportFormatID == ImageFile::FORMAT_PGMASCII) {\r
- strExt = ".pgm";\r
- strWildcard = "PGM Files (*.pgm)|*.pgm";\r
- }\r
-#ifdef HAVE_PNG\r
- else if (m_iDefaultExportFormatID == ImageFile::FORMAT_PNG || m_iDefaultExportFormatID == ImageFile::FORMAT_PNG16) {\r
- strExt = ".png";\r
- strWildcard = "PNG Files (*.png)|*.png";\r
- }\r
-#endif\r
-\r
- const wxString& strFilename = wxFileSelector (wxString("Export Filename"), wxString(""), \r
- wxString(""), strExt, strWildcard, wxOVERWRITE_PROMPT | wxHIDE_READONLY | wxSAVE);\r
- if (strFilename) {\r
- rIF.exportImage (strFormatName.c_str(), strFilename.c_str(), 1, 1, m_dMinPixel, m_dMaxPixel);\r
- *theApp->getLog() << "Exported file " << strFilename << "\n";\r
- }\r
- }\r
- }\r
-}\r
-\r
-void\r
-ImageFileView::OnScaleSize (wxCommandEvent& event)\r
-{\r
- ImageFile& rIF = GetDocument()->getImageFile();\r
- unsigned int iOldNX = rIF.nx();\r
- unsigned int iOldNY = rIF.ny();\r
-\r
- DialogGetXYSize dialogGetXYSize (m_frame, "Set New X & Y Dimensions", iOldNX, iOldNY);\r
- if (dialogGetXYSize.ShowModal() == wxID_OK) {\r
- unsigned int iNewNX = dialogGetXYSize.getXSize();\r
- unsigned int iNewNY = dialogGetXYSize.getYSize();\r
- std::ostringstream os;\r
- os << "Scale Size from (" << iOldNX << "," << iOldNY << ") to (" << iNewNX << "," << iNewNY << ")";\r
- ImageFileDocument* pScaledDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));\r
- if (! pScaledDoc) {\r
- sys_error (ERR_SEVERE, "Unable to create image file");\r
- return;\r
- }\r
- ImageFile& rScaledIF = pScaledDoc->getImageFile();\r
- rScaledIF.setArraySize (iNewNX, iNewNY);\r
- rScaledIF.labelAdd (os.str().c_str());\r
- rIF.scaleImage (rScaledIF);\r
- *theApp->getLog() << os.str().c_str() << "\n";\r
- if (theApp->getSetModifyNewDocs())\r
- pScaledDoc->Modify(TRUE);\r
- pScaledDoc->UpdateAllViews (this);\r
- pScaledDoc->GetFirstView()->OnUpdate (this, NULL);\r
- }\r
-}\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 os;\r
- os << "Row " << yCursor;\r
- std::string title("title ");\r
- title += os.str();\r
- rPlotFile.addEzsetCommand (title.c_str());\r
- rPlotFile.addEzsetCommand ("xlabel Column");\r
- rPlotFile.addEzsetCommand ("ylabel Pixel Value");\r
- rPlotFile.addEzsetCommand ("lxfrac 0");\r
- rPlotFile.addEzsetCommand ("box");\r
- rPlotFile.addEzsetCommand ("grid");\r
- rPlotFile.setCurveSize (2, nx);\r
- rPlotFile.addColumn (0, pX);\r
- rPlotFile.addColumn (1, pY);\r
- }\r
- delete pX;\r
- delete pY;\r
- if (theApp->getSetModifyNewDocs())\r
- pPlotDoc->Modify(true);\r
- pPlotDoc->UpdateAllViews();\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 os;\r
- os << "Column " << xCursor;\r
- std::string title("title ");\r
- title += os.str();\r
- rPlotFile.addEzsetCommand (title.c_str());\r
- rPlotFile.addEzsetCommand ("xlabel Row");\r
- rPlotFile.addEzsetCommand ("ylabel Pixel Value");\r
- rPlotFile.addEzsetCommand ("lxfrac 0");\r
- rPlotFile.addEzsetCommand ("box");\r
- rPlotFile.addEzsetCommand ("grid");\r
- rPlotFile.setCurveSize (2, nx);\r
- rPlotFile.addColumn (0, pX);\r
- rPlotFile.addColumn (1, pY);\r
- }\r
- delete pX;\r
- delete pY;\r
- if (theApp->getSetModifyNewDocs())\r
- pPlotDoc->Modify(true);\r
- pPlotDoc->UpdateAllViews();\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
- if (vecIFDoc.size() == 0) {\r
- wxMessageBox ("No compatible images for Column Comparison", "Error");\r
- return;\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 os;\r
- os << "Column " << xCursor << " Comparison";\r
- std::string title("title ");\r
- title += os.str();\r
- rPlotFile.addEzsetCommand (title.c_str());\r
- rPlotFile.addEzsetCommand ("xlabel Row");\r
- rPlotFile.addEzsetCommand ("ylabel Pixel Value");\r
- rPlotFile.addEzsetCommand ("lxfrac 0");\r
- rPlotFile.addEzsetCommand ("curve 1");\r
- rPlotFile.addEzsetCommand ("color 2");\r
- rPlotFile.addEzsetCommand ("curve 2");\r
- rPlotFile.addEzsetCommand ("color 4");\r
- rPlotFile.addEzsetCommand ("dash 5");\r
- rPlotFile.addEzsetCommand ("box");\r
- rPlotFile.addEzsetCommand ("grid");\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
- if (theApp->getSetModifyNewDocs())\r
- pPlotDoc->Modify(true);\r
- pPlotDoc->UpdateAllViews();\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
- if (vecIFDoc.size() == 0) {\r
- wxMessageBox ("No compatible images for Row Comparison", "Error");\r
- return;\r
- }\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 os;\r
- os << "Row " << yCursor << " Comparison";\r
- std::string title("title ");\r
- title += os.str();\r
- rPlotFile.addEzsetCommand (title.c_str());\r
- rPlotFile.addEzsetCommand ("xlabel Column");\r
- rPlotFile.addEzsetCommand ("ylabel Pixel Value");\r
- rPlotFile.addEzsetCommand ("lxfrac 0");\r
- rPlotFile.addEzsetCommand ("curve 1");\r
- rPlotFile.addEzsetCommand ("color 2");\r
- rPlotFile.addEzsetCommand ("curve 2");\r
- rPlotFile.addEzsetCommand ("color 4");\r
- rPlotFile.addEzsetCommand ("dash 5");\r
- rPlotFile.addEzsetCommand ("box");\r
- rPlotFile.addEzsetCommand ("grid");\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
- if (theApp->getSetModifyNewDocs())\r
- pPlotDoc->Modify(true);\r
- pPlotDoc->UpdateAllViews();\r
- }\r
- }\r
-}\r
-\r
-\r
+
+void
+ImageFileView::OnExport (wxCommandEvent& event)
+{
+ ImageFile& rIF = 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 (getFrameForChild(), m_iDefaultExportFormatID);
+ if (dialogExport.ShowModal() == wxID_OK) {
+ wxString strFormatName (dialogExport.getFormatName ());
+ m_iDefaultExportFormatID = ImageFile::convertExportFormatNameToID (strFormatName.c_str());
+
+ wxString strExt;
+ wxString strWildcard;
+ if (m_iDefaultExportFormatID == ImageFile::EXPORT_FORMAT_PGM || m_iDefaultExportFormatID == ImageFile::EXPORT_FORMAT_PGMASCII) {
+ strExt = ".pgm";
+ strWildcard = "PGM Files (*.pgm)|*.pgm";
+ }
+#ifdef HAVE_PNG
+ else if (m_iDefaultExportFormatID == ImageFile::EXPORT_FORMAT_PNG || m_iDefaultExportFormatID == ImageFile::EXPORT_FORMAT_PNG16) {
+ strExt = ".png";
+ strWildcard = "PNG Files (*.png)|*.png";
+ }
+#endif
+#ifdef HAVE_CTN_DICOM
+ else if (m_iDefaultExportFormatID == ImageFile::EXPORT_FORMAT_DICOM) {
+ strExt = "";
+ strWildcard = "DICOM Files (*.*)|*.*";
+ }
+#endif
+ else {
+ strExt = "";
+ strWildcard = "Miscellaneous (*.*)|*.*";
+ }
+
+ 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 (getFrameForChild(), "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 = theApp->newImageDoc();
+ 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->getAskDeleteNewDocs())
+ pScaledDoc->Modify (true);
+ pScaledDoc->UpdateAllViews (this);
+ pScaledDoc->getView()->OnUpdate (this, NULL);
+ pScaledDoc->getView()->getFrame()->Show(true);
+ }
+}
+
+#if wxUSE_GLCANVAS
+void
+ImageFileView::OnConvert3d (wxCommandEvent& event)
+{
+ ImageFile& rIF = GetDocument()->getImageFile();
+ Graph3dFileDocument* pGraph3d = theApp->newGraph3dDoc();
+ pGraph3d->setBadFileOpen();
+ pGraph3d->createFromImageFile (rIF);
+ pGraph3d->getView()->OnUpdate (this, NULL);
+ pGraph3d->UpdateAllViews();
+ pGraph3d->getView()->getFrame()->SetClientSize (400, 400);
+ pGraph3d->getView()->getFrame()->Show (true);
+ GetDocumentManager()->ActivateView (pGraph3d->getView(), true, false);
+ ::wxYield();
+ pGraph3d->getView()->getCanvas()->SetFocus();
+}
+#endif
+
+void
+ImageFileView::OnPlotRow (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_pCanvas->GetCurrentCursor (xCursor, yCursor)) {
+ wxMessageBox ("No row selected. Please use left mouse button on image to select column","Error");
+ return;
+ }
+
+ const ImageFile& rIF = GetDocument()->getImageFile();
+ ImageFileArrayConst v = rIF.getArray();
+ ImageFileArrayConst vImag = rIF.getImaginaryArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+
+ if (v != NULL && yCursor < ny) {
+ double* pX = new double [nx];
+ double* pYReal = new double [nx];
+ double *pYImag = NULL;
+ double *pYMag = NULL;
+ if (rIF.isComplex()) {
+ pYImag = new double [nx];
+ pYMag = new double [nx];
+ }
+ for (int i = 0; i < nx; i++) {
+ pX[i] = i;
+ pYReal[i] = v[i][yCursor];
+ if (rIF.isComplex()) {
+ pYImag[i] = vImag[i][yCursor];
+ pYMag[i] = ::sqrt (v[i][yCursor] * v[i][yCursor] + vImag[i][yCursor] * vImag[i][yCursor]);
+ }
+ }
+ PlotFileDocument* pPlotDoc = theApp->newPlotDoc();
+ 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.addEzsetCommand ("curve 1");
+ rPlotFile.addEzsetCommand ("color 1");
+ if (rIF.isComplex()) {
+ rPlotFile.addEzsetCommand ("dash 1");
+ rPlotFile.addEzsetCommand ("curve 2");
+ rPlotFile.addEzsetCommand ("color 4");
+ rPlotFile.addEzsetCommand ("dash 3");
+ rPlotFile.addEzsetCommand ("curve 3");
+ rPlotFile.addEzsetCommand ("color 0");
+ rPlotFile.addEzsetCommand ("solid");
+ rPlotFile.setCurveSize (4, nx);
+ } else
+ rPlotFile.setCurveSize (2, nx);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pYReal);
+ if (rIF.isComplex()) {
+ rPlotFile.addColumn (2, pYImag);
+ rPlotFile.addColumn (3, pYMag);
+ }
+ for (unsigned int iL = 0; iL < rIF.nLabels(); iL++)
+ rPlotFile.addDescription (rIF.labelGet(iL).getLabelString().c_str());
+ os << " Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str();
+ *theApp->getLog() << os.str().c_str() << "\n";
+ rPlotFile.addDescription (os.str().c_str());
+ }
+ delete pX;
+ delete pYReal;
+ if (rIF.isComplex()) {
+ delete pYImag;
+ delete pYMag;
+ }
+ if (theApp->getAskDeleteNewDocs())
+ pPlotDoc->Modify (true);
+ pPlotDoc->UpdateAllViews ();
+ pPlotDoc->getView()->OnUpdate (this, NULL);
+ pPlotDoc->getView()->getFrame()->Show(true);
+ }
+}
+
+void
+ImageFileView::OnPlotCol (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_pCanvas->GetCurrentCursor (xCursor, yCursor)) {
+ wxMessageBox ("No column selected. Please use left mouse button on image to select column","Error");
+ return;
+ }
+
+ const ImageFile& rIF = GetDocument()->getImageFile();
+ ImageFileArrayConst v = rIF.getArray();
+ ImageFileArrayConst vImag = rIF.getImaginaryArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+
+ if (v != NULL && xCursor < nx) {
+ double* pX = new double [ny];
+ double* pYReal = new double [ny];
+ double* pYImag = NULL;
+ double* pYMag = NULL;
+ if (rIF.isComplex()) {
+ pYImag = new double [ny];
+ pYMag = new double [ny];
+ }
+ for (int i = 0; i < ny; i++) {
+ pX[i] = i;
+ pYReal[i] = v[xCursor][i];
+ if (rIF.isComplex()) {
+ pYImag[i] = vImag[xCursor][i];
+ pYMag[i] = ::sqrt (v[xCursor][i] * v[xCursor][i] + vImag[xCursor][i] * vImag[xCursor][i]);
+ }
+ }
+ PlotFileDocument* pPlotDoc = theApp->newPlotDoc();
+ 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.addEzsetCommand ("curve 1");
+ rPlotFile.addEzsetCommand ("color 1");
+ if (rIF.isComplex()) {
+ rPlotFile.addEzsetCommand ("dash 1");
+ rPlotFile.addEzsetCommand ("curve 2");
+ rPlotFile.addEzsetCommand ("color 4");
+ rPlotFile.addEzsetCommand ("dash 3");
+ rPlotFile.addEzsetCommand ("curve 3");
+ rPlotFile.addEzsetCommand ("color 0");
+ rPlotFile.addEzsetCommand ("solid");
+ rPlotFile.setCurveSize (4, ny);
+ } else
+ rPlotFile.setCurveSize (2, ny);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pYReal);
+ if (rIF.isComplex()) {
+ rPlotFile.addColumn (2, pYImag);
+ rPlotFile.addColumn (3, pYMag);
+ }
+ for (unsigned int iL = 0; iL < rIF.nLabels(); iL++)
+ rPlotFile.addDescription (rIF.labelGet(iL).getLabelString().c_str());
+ os << " Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str();
+ *theApp->getLog() << os.str().c_str() << "\n";
+ rPlotFile.addDescription (os.str().c_str());
+ }
+ delete pX;
+ delete pYReal;
+ if (rIF.isComplex()) {
+ delete pYImag;
+ delete pYMag;
+ }
+ if (theApp->getAskDeleteNewDocs())
+ pPlotDoc->Modify (true);
+ pPlotDoc->UpdateAllViews ();
+ pPlotDoc->getView()->OnUpdate (this, NULL);
+ pPlotDoc->getView()->getFrame()->Show(true);
+ }
+}
+
+#ifdef HAVE_FFT
+void
+ImageFileView::OnPlotFFTRow (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_pCanvas->GetCurrentCursor (xCursor, yCursor)) {
+ wxMessageBox ("No row selected. Please use left mouse button on image to select column","Error");
+ return;
+ }
+
+ const ImageFile& rIF = 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 = theApp->newPlotDoc();
+ 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 ("dash 1");
+ rPlotFile.addEzsetCommand ("curve 2");
+ rPlotFile.addEzsetCommand ("color 4");
+ rPlotFile.addEzsetCommand ("dash 3");
+ rPlotFile.addEzsetCommand ("curve 3");
+ rPlotFile.addEzsetCommand ("color 0");
+ rPlotFile.addEzsetCommand ("solid");
+ rPlotFile.addEzsetCommand ("box");
+ rPlotFile.addEzsetCommand ("grid");
+ rPlotFile.setCurveSize (4, nx);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pYReal);
+ rPlotFile.addColumn (2, pYImag);
+ rPlotFile.addColumn (3, pYMag);
+ for (int iL = 0; iL < rIF.nLabels(); iL++)
+ rPlotFile.addDescription (rIF.labelGet(iL).getLabelString().c_str());
+ os << " FFT Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str();
+ *theApp->getLog() << os.str().c_str() << "\n";
+ rPlotFile.addDescription (os.str().c_str());
+ }
+ delete pX;
+ delete pYReal;
+ delete pYImag;
+ delete pYMag;
+ delete [] pcIn;
+
+ if (theApp->getAskDeleteNewDocs())
+ pPlotDoc->Modify (true);
+ pPlotDoc->UpdateAllViews ();
+ pPlotDoc->getView()->OnUpdate (this, NULL);
+ pPlotDoc->getView()->getFrame()->Show(true);
+ }
+}
+
+void
+ImageFileView::OnPlotFFTCol (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_pCanvas->GetCurrentCursor (xCursor, yCursor)) {
+ wxMessageBox ("No column selected. Please use left mouse button on image to select column","Error");
+ return;
+ }
+
+ const ImageFile& rIF = GetDocument()->getImageFile();
+ ImageFileArrayConst v = rIF.getArray();
+ ImageFileArrayConst vImag = rIF.getImaginaryArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+
+ if (v != NULL && xCursor < nx) {
+ fftw_complex* pcIn = new fftw_complex [ny];
+ double *pdTemp = new double [ny];
+
+ int i;
+ for (i = 0; i < ny; i++)
+ pdTemp[i] = v[xCursor][i];
+ Fourier::shuffleNaturalToFourierOrder (pdTemp, ny);
+ for (i = 0; i < ny; i++)
+ pcIn[i].re = pdTemp[i];
+
+ for (i = 0; i < ny; i++) {
+ if (rIF.isComplex())
+ pdTemp[i] = vImag[xCursor][i];
+ else
+ pdTemp[i] = 0;
+ }
+ Fourier::shuffleNaturalToFourierOrder (pdTemp, ny);
+ for (i = 0; i < ny; i++)
+ pcIn[i].im = pdTemp[i];
+
+ fftw_plan plan = fftw_create_plan (ny, FFTW_BACKWARD, FFTW_IN_PLACE);
+ fftw_one (plan, pcIn, NULL);
+ fftw_destroy_plan (plan);
+
+ double* pX = new double [ny];
+ double* pYReal = new double [ny];
+ double* pYImag = new double [ny];
+ double* pYMag = new double [ny];
+ for (i = 0; i < ny; 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);
+ }
+
+ PlotFileDocument* pPlotDoc = theApp->newPlotDoc();
+ 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 Column");
+ rPlotFile.addEzsetCommand ("ylabel Pixel Value");
+ rPlotFile.addEzsetCommand ("lxfrac 0");
+ rPlotFile.addEzsetCommand ("curve 1");
+ rPlotFile.addEzsetCommand ("color 1");
+ rPlotFile.addEzsetCommand ("dash 1");
+ rPlotFile.addEzsetCommand ("curve 2");
+ rPlotFile.addEzsetCommand ("color 4");
+ rPlotFile.addEzsetCommand ("dash 3");
+ rPlotFile.addEzsetCommand ("curve 3");
+ rPlotFile.addEzsetCommand ("color 0");
+ rPlotFile.addEzsetCommand ("solid");
+ rPlotFile.addEzsetCommand ("box");
+ rPlotFile.addEzsetCommand ("grid");
+ rPlotFile.setCurveSize (4, ny);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pYReal);
+ rPlotFile.addColumn (2, pYImag);
+ rPlotFile.addColumn (3, pYMag);
+ for (int iL = 0; iL < rIF.nLabels(); iL++)
+ rPlotFile.addDescription (rIF.labelGet(iL).getLabelString().c_str());
+ os << " FFT Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str();
+ *theApp->getLog() << os.str().c_str() << "\n";
+ rPlotFile.addDescription (os.str().c_str());
+ }
+ delete pX;
+ delete pYReal;
+ delete pYImag;
+ delete pYMag;
+ delete pdTemp;
+ delete [] pcIn;
+
+ if (theApp->getAskDeleteNewDocs())
+ pPlotDoc->Modify (true);
+ pPlotDoc->UpdateAllViews ();
+ pPlotDoc->getView()->OnUpdate (this, NULL);
+ pPlotDoc->getView()->getFrame()->Show(true);
+ }
+}
+#endif
+
+void
+ImageFileView::OnCompareCol (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_pCanvas->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 (getFrameForChild(), "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 = theApp->newPlotDoc();
+ 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, ny);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pY1);
+ rPlotFile.addColumn (2, pY2);
+
+ unsigned int iL;
+ for (iL = 0; iL < rIF.nLabels(); iL++) {
+ std::string s = GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str();
+ s += ": ";
+ s += rIF.labelGet(iL).getLabelString();
+ rPlotFile.addDescription (s.c_str());
+ }
+ for (iL = 0; iL < rCompareIF.nLabels(); iL++) {
+ std::string s = pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str();
+ s += ": ";
+ s += rCompareIF.labelGet(iL).getLabelString();
+ rPlotFile.addDescription (s.c_str());
+ }
+ os << " Between " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " and "
+ << pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str();
+ *theApp->getLog() << os.str().c_str() << "\n";
+ rPlotFile.addDescription (os.str().c_str());
+ }
+ delete pX;
+ delete pY1;
+ delete pY2;
+ if (theApp->getAskDeleteNewDocs())
+ pPlotDoc->Modify (true);
+ pPlotDoc->UpdateAllViews ();
+ pPlotDoc->getView()->OnUpdate (this, NULL);
+ pPlotDoc->getView()->getFrame()->Show(true);
+ }
+ }
+}
+
+void
+ImageFileView::OnCompareRow (wxCommandEvent& event)
+{
+ int xCursor, yCursor;
+ if (! m_pCanvas->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 (getFrameForChild(), "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 = theApp->newPlotDoc();
+ 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, nx);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pY1);
+ rPlotFile.addColumn (2, pY2);
+ unsigned int iL;
+ for (iL = 0; iL < rIF.nLabels(); iL++) {
+ std::string s = GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str();
+ s += ": ";
+ s += rIF.labelGet(iL).getLabelString();
+ rPlotFile.addDescription (s.c_str());
+ }
+ for (iL = 0; iL < rCompareIF.nLabels(); iL++) {
+ std::string s = pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str();
+ s += ": ";
+ s += rCompareIF.labelGet(iL).getLabelString();
+ rPlotFile.addDescription (s.c_str());
+ }
+ os << " Between " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " and "
+ << pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str();
+ *theApp->getLog() << os.str().c_str() << "\n";
+ rPlotFile.addDescription (os.str().c_str());
+ }
+ delete pX;
+ delete pY1;
+ delete pY2;
+ if (theApp->getAskDeleteNewDocs())
+ pPlotDoc->Modify (true);
+ pPlotDoc->UpdateAllViews ();
+ pPlotDoc->getView()->OnUpdate (this, NULL);
+ pPlotDoc->getView()->getFrame()->Show(true);
+ }
+ }
+}
+
+static int NUMBER_HISTOGRAM_BINS = 256;
+
+void
+ImageFileView::OnPlotHistogram (wxCommandEvent& event)
+{
+ const ImageFile& rIF = GetDocument()->getImageFile();
+ ImageFileArrayConst v = rIF.getArray();
+ int nx = rIF.nx();
+ int ny = rIF.ny();
+
+ if (v != NULL && nx > 0 && ny > 0) {
+ PlotFileDocument* pPlotDoc = theApp->newPlotDoc();
+ 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, NUMBER_HISTOGRAM_BINS);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pY);
+ for (unsigned int iL = 0; iL < rIF.nLabels(); iL++) {
+ std::string s = GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str();
+ s += ": ";
+ s += rIF.labelGet(iL).getLabelString();
+ rPlotFile.addDescription (s.c_str());
+ }
+ os << " Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str();
+ *theApp->getLog() << os.str().c_str() << "\n";
+ rPlotFile.addDescription (os.str().c_str());
+ delete pX;
+ delete pY;
+ if (theApp->getAskDeleteNewDocs())
+ pPlotDoc->Modify (true);
+ pPlotDoc->UpdateAllViews ();
+ pPlotDoc->getView()->OnUpdate (this, NULL);
+ pPlotDoc->getView()->getFrame()->Show(true);
+ }
+}
+
+