X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fviews.cpp;h=54a12b8d764ea05f6d96d71015de8215fe3283cb;hb=276e2f99dbf1ecea92bd7d3d6bb9c9c8035677f3;hp=c94fa7ec453aac4706114fd477657cbaad93606c;hpb=4d5f56994972346351a48730315a7d85924103ba;p=ctsim.git diff --git a/src/views.cpp b/src/views.cpp index c94fa7e..54a12b8 100644 --- a/src/views.cpp +++ b/src/views.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: views.cpp,v 1.120 2001/02/25 16:21:36 kevin Exp $ +** $Id: views.cpp,v 1.129 2001/03/07 22:30:16 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -49,6 +49,7 @@ #include "timer.h" #include "threadproj.h" #include "threadrecon.h" +#include "threadraster.h" #if defined(MSVC) || HAVE_SSTREAM #include @@ -248,7 +249,7 @@ END_EVENT_TABLE() ImageFileView::ImageFileView() : wxView(), m_pFrame(NULL), m_pCanvas(NULL), m_pFileMenu(0), m_bMinSpecified(false), m_bMaxSpecified(false) { - m_iDefaultExportFormatID = ImageFile::FORMAT_PNG; + m_iDefaultExportFormatID = ImageFile::EXPORT_FORMAT_PNG; } ImageFileView::~ImageFileView() @@ -839,6 +840,8 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) m_pFileMenu->Append(wxID_PRINT, "&Print..."); m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup..."); m_pFileMenu->Append(wxID_PREVIEW, "Print Preview"); + m_pFileMenu->AppendSeparator(); + m_pFileMenu->Append(MAINMENU_IMPORT, "&Import...\tCtrl-M"); #ifdef CTSIM_MDI m_pFileMenu->AppendSeparator(); m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces..."); @@ -893,12 +896,12 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) m_pMenuAnalyze->Append (IFMENU_PLOT_COL, "Plot &Column"); m_pMenuAnalyze->Append (IFMENU_PLOT_HISTOGRAM, "Plot &Histogram"); m_pMenuAnalyze->AppendSeparator(); - m_pMenuAnalyze->Append (IFMENU_PLOT_FFT_ROW, "Plot FFT Row"); - m_pMenuAnalyze->Append (IFMENU_PLOT_FFT_COL, "Plot FFT Column"); + m_pMenuAnalyze->Append (IFMENU_PLOT_FFT_ROW, "P&lot FFT Row"); + m_pMenuAnalyze->Append (IFMENU_PLOT_FFT_COL, "Plo&t FFT Column"); m_pMenuAnalyze->AppendSeparator(); m_pMenuAnalyze->Append (IFMENU_COMPARE_IMAGES, "Compare &Images..."); - m_pMenuAnalyze->Append (IFMENU_COMPARE_ROW, "Compare &Row"); - m_pMenuAnalyze->Append (IFMENU_COMPARE_COL, "Compare &Column"); + m_pMenuAnalyze->Append (IFMENU_COMPARE_ROW, "Compare Ro&w"); + m_pMenuAnalyze->Append (IFMENU_COMPARE_COL, "Compare Colu&mn"); m_pMenuAnalyze->Enable (IFMENU_PLOT_ROW, false); m_pMenuAnalyze->Enable (IFMENU_PLOT_COL, false); m_pMenuAnalyze->Enable (IFMENU_COMPARE_ROW, false); @@ -1079,20 +1082,30 @@ ImageFileView::OnExport (wxCommandEvent& event) DialogExportParameters dialogExport (getFrameForChild(), m_iDefaultExportFormatID); if (dialogExport.ShowModal() == wxID_OK) { wxString strFormatName (dialogExport.getFormatName ()); - m_iDefaultExportFormatID = ImageFile::convertFormatNameToID (strFormatName.c_str()); + m_iDefaultExportFormatID = ImageFile::convertExportFormatNameToID (strFormatName.c_str()); wxString strExt; wxString strWildcard; - if (m_iDefaultExportFormatID == ImageFile::FORMAT_PGM || m_iDefaultExportFormatID == ImageFile::FORMAT_PGMASCII) { + 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::FORMAT_PNG || m_iDefaultExportFormatID == ImageFile::FORMAT_PNG16) { + 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); @@ -1401,7 +1414,7 @@ ImageFileView::OnPlotFFTRow (wxCommandEvent& event) rPlotFile.addColumn (1, pYReal); rPlotFile.addColumn (2, pYImag); rPlotFile.addColumn (3, pYMag); - for (int iL = 0; iL < rIF.nLabels(); iL++) + for (unsigned 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"; @@ -1501,7 +1514,7 @@ ImageFileView::OnPlotFFTCol (wxCommandEvent& event) rPlotFile.addColumn (1, pYReal); rPlotFile.addColumn (2, pYImag); rPlotFile.addColumn (3, pYMag); - for (int iL = 0; iL < rIF.nLabels(); iL++) + for (unsigned 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"; @@ -1824,13 +1837,15 @@ PhantomFileView::PhantomFileView() #if defined(DEBUG) || defined(_DEBUG) m_iDefaultNDet = 165; m_iDefaultNView = 180; + m_iDefaultNSample = 1; #else m_iDefaultNDet = 367; m_iDefaultNView = 320; -#endif m_iDefaultNSample = 2; +#endif m_dDefaultRotation = 1; m_dDefaultFocalLength = 2; + m_dDefaultCenterDetectorLength = 2; m_dDefaultViewRatio = 1; m_dDefaultScanRatio = 1; m_iDefaultGeometry = Scanner::GEOMETRY_PARALLEL; @@ -1876,8 +1891,8 @@ PhantomFileView::OnProjections (wxCommandEvent& event) { DialogGetProjectionParameters dialogProjection (getFrameForChild(), m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, - m_dDefaultFocalLength, m_dDefaultViewRatio, m_dDefaultScanRatio, m_iDefaultGeometry, - m_iDefaultTrace); + m_dDefaultFocalLength, m_dDefaultCenterDetectorLength, m_dDefaultViewRatio, m_dDefaultScanRatio, + m_iDefaultGeometry, m_iDefaultTrace); int retVal = dialogProjection.ShowModal(); if (retVal != wxID_OK) return; @@ -1888,6 +1903,7 @@ PhantomFileView::OnProjections (wxCommandEvent& event) m_iDefaultTrace = dialogProjection.getTrace(); m_dDefaultRotation = dialogProjection.getRotAngle(); m_dDefaultFocalLength = dialogProjection.getFocalLengthRatio(); + m_dDefaultCenterDetectorLength = dialogProjection.getCenterDetectorLengthRatio(); m_dDefaultViewRatio = dialogProjection.getViewRatio(); m_dDefaultScanRatio = dialogProjection.getScanRatio(); wxString sGeometry = dialogProjection.getGeometry(); @@ -1900,7 +1916,7 @@ PhantomFileView::OnProjections (wxCommandEvent& event) const Phantom& rPhantom = GetDocument()->getPhantom(); Scanner theScanner (rPhantom, sGeometry.c_str(), m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, - dRotationRadians, m_dDefaultFocalLength, m_dDefaultViewRatio, m_dDefaultScanRatio); + dRotationRadians, m_dDefaultFocalLength, m_dDefaultCenterDetectorLength, m_dDefaultViewRatio, m_dDefaultScanRatio); if (theScanner.fail()) { wxString msg = "Failed making scanner\n"; msg += theScanner.failMessage().c_str(); @@ -1913,6 +1929,7 @@ PhantomFileView::OnProjections (wxCommandEvent& event) os << "Projections for " << rPhantom.name() << ": nDet=" << m_iDefaultNDet << ", nView=" << m_iDefaultNView << ", nSamples=" << m_iDefaultNSample << ", RotAngle=" << m_dDefaultRotation << ", FocalLengthRatio=" << m_dDefaultFocalLength + << ", CenterDetectorLengthRatio=" << m_dDefaultCenterDetectorLength << ", ViewRatio=" << m_dDefaultViewRatio << ", ScanRatio=" << m_dDefaultScanRatio << ", Geometry=" << sGeometry.c_str() << ", FanBeamAngle=" << convertRadiansToDegrees (theScanner.fanBeamAngle()); @@ -1937,10 +1954,11 @@ PhantomFileView::OnProjections (wxCommandEvent& event) } } } else { - if (theApp->getUseBackgroundTasks() || theApp->getNumberCPU() > 1) { +#if HAVE_WXTHREADS + if (theApp->getUseBackgroundTasks()) { ProjectorSupervisorThread* pProjector = new ProjectorSupervisorThread (this, m_iDefaultNDet, m_iDefaultNView, sGeometry.c_str(), m_iDefaultNSample, dRotationRadians, - m_dDefaultFocalLength, m_dDefaultViewRatio, m_dDefaultScanRatio, os.str().c_str()); + m_dDefaultFocalLength, m_dDefaultCenterDetectorLength, m_dDefaultViewRatio, m_dDefaultScanRatio, os.str().c_str()); if (pProjector->Create() != wxTHREAD_NO_ERROR) { sys_error (ERR_SEVERE, "Error creating projector thread"); delete pProjector; @@ -1949,7 +1967,9 @@ PhantomFileView::OnProjections (wxCommandEvent& event) pProjector->SetPriority(60); pProjector->Run(); return; - } else { + } else +#endif // HAVE_WXTHREADS + { pProj = new Projections; pProj->initFromScanner (theScanner); wxProgressDialog dlgProgress (wxString("Projection"), wxString("Projection Progress"), pProj->nView() + 1, getFrameForChild(), wxPD_CAN_ABORT ); @@ -1997,56 +2017,67 @@ PhantomFileView::OnRasterize (wxCommandEvent& event) DialogGetRasterParameters dialogRaster (getFrameForChild(), m_iDefaultRasterNX, m_iDefaultRasterNY, m_iDefaultRasterNSamples, m_dDefaultRasterViewRatio); int retVal = dialogRaster.ShowModal(); - if (retVal == wxID_OK) { - m_iDefaultRasterNX = dialogRaster.getXSize(); - m_iDefaultRasterNY = dialogRaster.getYSize(); - m_iDefaultRasterNSamples = dialogRaster.getNSamples(); - m_dDefaultRasterViewRatio = dialogRaster.getViewRatio(); - if (m_iDefaultRasterNSamples < 1) - m_iDefaultRasterNSamples = 1; - if (m_dDefaultRasterViewRatio < 0) - m_dDefaultRasterViewRatio = 0; - if (m_iDefaultRasterNX > 0 && m_iDefaultRasterNY > 0) { - const Phantom& rPhantom = GetDocument()->getPhantom(); - - ImageFile* pImageFile = new ImageFile; - - pImageFile->setArraySize (m_iDefaultRasterNX, m_iDefaultRasterNY); - wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), - pImageFile->nx() + 1, getFrameForChild(), wxPD_CAN_ABORT ); - Timer timer; - for (unsigned int i = 0; i < pImageFile->nx(); i++) { - rPhantom.convertToImagefile (*pImageFile, m_dDefaultRasterViewRatio, m_iDefaultRasterNSamples, - Trace::TRACE_NONE, i, 1, true); - if (! dlgProgress.Update (i+1)) { - delete pImageFile; - return; - } - } - - ImageFileDocument* pRasterDoc = theApp->newImageDoc(); - if (! pRasterDoc) { - sys_error (ERR_SEVERE, "Unable to create image file"); + if (retVal != wxID_OK) + return; + + m_iDefaultRasterNX = dialogRaster.getXSize(); + m_iDefaultRasterNY = dialogRaster.getYSize(); + m_iDefaultRasterNSamples = dialogRaster.getNSamples(); + m_dDefaultRasterViewRatio = dialogRaster.getViewRatio(); + if (m_iDefaultRasterNSamples < 1) + m_iDefaultRasterNSamples = 1; + if (m_dDefaultRasterViewRatio < 0) + m_dDefaultRasterViewRatio = 0; + if (m_iDefaultRasterNX <= 0 || m_iDefaultRasterNY <= 0) + return; + + const Phantom& rPhantom = GetDocument()->getPhantom(); + std::ostringstream os; + os << "Rasterize Phantom " << rPhantom.name() << ": XSize=" << m_iDefaultRasterNX << ", YSize=" + << m_iDefaultRasterNY << ", ViewRatio=" << m_dDefaultRasterViewRatio << ", nSamples=" + << m_iDefaultRasterNSamples;; + +#if HAVE_WXTHREADS + if (theApp->getUseBackgroundTasks()) { + RasterizerSupervisorThread* pThread = new RasterizerSupervisorThread (this, m_iDefaultRasterNX, m_iDefaultRasterNY, + m_iDefaultRasterNSamples, m_dDefaultRasterViewRatio, os.str().c_str()); + if (pThread->Create() != wxTHREAD_NO_ERROR) { + *theApp->getLog() << "Error creating rasterizer thread\n"; + return; + } + pThread->SetPriority (60); + pThread->Run(); + } else +#endif + { + ImageFile* pImageFile = new ImageFile (m_iDefaultRasterNX, m_iDefaultRasterNY); + wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), + pImageFile->nx() + 1, getFrameForChild(), wxPD_CAN_ABORT ); + Timer timer; + for (unsigned int i = 0; i < pImageFile->nx(); i++) { + rPhantom.convertToImagefile (*pImageFile, m_dDefaultRasterViewRatio, m_iDefaultRasterNSamples, Trace::TRACE_NONE, i, 1, true); + if (! dlgProgress.Update (i+1)) { + delete pImageFile; return; } - pRasterDoc->setImageFile (pImageFile); - - if (theApp->getAskDeleteNewDocs()) - pRasterDoc->Modify (true); - pRasterDoc->UpdateAllViews (this); - pRasterDoc->getView()->getFrame()->Show(true); - std::ostringstream os; - os << "Rasterize Phantom " << rPhantom.name() << ": XSize=" << m_iDefaultRasterNX << ", YSize=" - << m_iDefaultRasterNY << ", ViewRatio=" << m_dDefaultRasterViewRatio << ", nSamples=" - << m_iDefaultRasterNSamples;; - *theApp->getLog() << os.str().c_str() << "\n"; - pImageFile->labelAdd (os.str().c_str(), timer.timerEnd()); - ImageFileView* rasterView = pRasterDoc->getView(); - if (rasterView) { - rasterView->getFrame()->SetFocus(); - rasterView->OnUpdate (rasterView, NULL); - } - + } + + ImageFileDocument* pRasterDoc = theApp->newImageDoc(); + if (! pRasterDoc) { + sys_error (ERR_SEVERE, "Unable to create image file"); + return; + } + pRasterDoc->setImageFile (pImageFile); + if (theApp->getAskDeleteNewDocs()) + pRasterDoc->Modify (true); + pRasterDoc->UpdateAllViews (this); + pRasterDoc->getView()->getFrame()->Show(true); + *theApp->getLog() << os.str().c_str() << "\n"; + pImageFile->labelAdd (os.str().c_str(), timer.timerEnd()); + ImageFileView* rasterView = pRasterDoc->getView(); + if (rasterView) { + rasterView->getFrame()->SetFocus(); + rasterView->OnUpdate (rasterView, NULL); } } } @@ -2093,6 +2124,8 @@ PhantomFileView::CreateChildFrame(wxDocument *doc, wxView *view) m_pFileMenu->Append(wxID_PRINT, "&Print..."); m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup..."); m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view"); + m_pFileMenu->AppendSeparator(); + m_pFileMenu->Append(MAINMENU_IMPORT, "&Import...\tCtrl-M"); #ifdef CTSIM_MDI m_pFileMenu->AppendSeparator(); m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces..."); @@ -2418,9 +2451,9 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) os << "Reconstruct " << rProj.getFilename() << ": xSize=" << m_iDefaultNX << ", ySize=" << m_iDefaultNY << ", Filter=" << optFilterName.c_str() << ", FilterParam=" << m_dDefaultFilterParam << ", FilterMethod=" << optFilterMethodName.c_str() << ", FilterGeneration=" << optFilterGenerationName.c_str() << ", Zeropad=" << m_iDefaultZeropad << ", Interpolation=" << optInterpName.c_str() << ", InterpolationParam=" << m_iDefaultInterpParam << ", Backprojection=" << optBackprojectName.c_str(); Timer timerRecon; + ImageFile* pImageFile = NULL; if (m_iDefaultTrace > Trace::TRACE_CONSOLE) { - ImageFile* pImageFile = new ImageFile; - pImageFile->setArraySize (m_iDefaultNX, m_iDefaultNY); + pImageFile = new ImageFile (m_iDefaultNX, m_iDefaultNY); Reconstructor* pReconstructor = new Reconstructor (rProj, *pImageFile, optFilterName.c_str(), m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(), optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace); @@ -2431,7 +2464,6 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) if (pDlgReconstruct->isCancelled() || ! pDlgReconstruct->reconstructView (iView, true)) { delete pDlgReconstruct; delete pReconstructor; - delete pImageFile; return; } ::wxYield(); @@ -2444,26 +2476,9 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) pReconstructor->postProcessing(); delete pDlgReconstruct; delete pReconstructor; - ImageFileDocument* pReconDoc = theApp->newImageDoc(); - if (! pReconDoc) { - sys_error (ERR_SEVERE, "Unable to create image file"); - return; - } - pReconDoc->setImageFile (pImageFile); - if (theApp->getAskDeleteNewDocs()) - pReconDoc->Modify (true); - pReconDoc->UpdateAllViews (this); - if (ImageFileView* rasterView = pReconDoc->getView()) { - rasterView->OnUpdate (rasterView, NULL); - rasterView->getFrame()->SetFocus(); - rasterView->getFrame()->Show(true); - } - *theApp->getLog() << os.str().c_str() << "\n"; - pImageFile->labelAdd (rProj.getLabel()); - pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd()); - } else { - if (theApp->getUseBackgroundTasks() || theApp->getNumberCPU() > 1) { +#if HAVE_WXTHREADS + if (theApp->getUseBackgroundTasks()) { ReconstructorSupervisorThread* pReconstructor = new ReconstructorSupervisorThread (this, m_iDefaultNX, m_iDefaultNY, optFilterName.c_str(), m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(), @@ -2475,9 +2490,11 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) } pReconstructor->SetPriority (60); pReconstructor->Run(); - } else { - ImageFile* pImageFile = new ImageFile; - pImageFile->setArraySize (m_iDefaultNX, m_iDefaultNY); + return; + } else +#endif + { + pImageFile = new ImageFile (m_iDefaultNX, m_iDefaultNY); Reconstructor* pReconstructor = new Reconstructor (rProj, *pImageFile, optFilterName.c_str(), m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(), optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace); @@ -2487,31 +2504,30 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) pReconstructor->reconstructView (iView, 1); if (! dlgProgress.Update (iView + 1)) { delete pReconstructor; - delete pImageFile; - return; + return; // don't make new window, thread will do this } } pReconstructor->postProcessing(); delete pReconstructor; - ImageFileDocument* pReconDoc = theApp->newImageDoc(); - if (! pReconDoc) { - sys_error (ERR_SEVERE, "Unable to create image file"); - return; - } - pReconDoc->setImageFile (pImageFile); - if (theApp->getAskDeleteNewDocs()) - pReconDoc->Modify (true); - pReconDoc->UpdateAllViews (this); - if (ImageFileView* rasterView = pReconDoc->getView()) { - rasterView->OnUpdate (rasterView, NULL); - rasterView->getFrame()->SetFocus(); - rasterView->getFrame()->Show(true); - } - *theApp->getLog() << os.str().c_str() << "\n"; - pImageFile->labelAdd (rProj.getLabel()); - pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd()); } } + ImageFileDocument* pReconDoc = theApp->newImageDoc(); + if (! pReconDoc) { + sys_error (ERR_SEVERE, "Unable to create image file"); + return; + } + pReconDoc->setImageFile (pImageFile); + if (theApp->getAskDeleteNewDocs()) + pReconDoc->Modify (true); + pReconDoc->UpdateAllViews (this); + if (ImageFileView* rasterView = pReconDoc->getView()) { + rasterView->OnUpdate (rasterView, NULL); + rasterView->getFrame()->SetFocus(); + rasterView->getFrame()->Show(true); + } + *theApp->getLog() << os.str().c_str() << "\n"; + pImageFile->labelAdd (rProj.getLabel()); + pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd()); } @@ -2561,6 +2577,8 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) m_pFileMenu->Append(wxID_PRINT, "&Print..."); m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup..."); m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view"); + m_pFileMenu->AppendSeparator(); + m_pFileMenu->Append(MAINMENU_IMPORT, "&Import...\tCtrl-M"); #ifdef CTSIM_MDI m_pFileMenu->AppendSeparator(); m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces..."); @@ -2891,6 +2909,8 @@ PlotFileView::CreateChildFrame(wxDocument *doc, wxView *view) m_pFileMenu->Append(wxID_PRINT, "&Print..."); m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup..."); m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view"); + m_pFileMenu->AppendSeparator(); + m_pFileMenu->Append(MAINMENU_IMPORT, "&Import...\tCtrl-M"); #ifdef CTSIM_MDI m_pFileMenu->AppendSeparator(); m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces..."); @@ -3144,6 +3164,8 @@ TextFileView::CreateChildFrame (wxDocument *doc, wxView *view) m_pFileMenu->Append(wxID_PRINT, "&Print..."); m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup..."); m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view"); + m_pFileMenu->AppendSeparator(); + m_pFileMenu->Append(MAINMENU_IMPORT, "&Import...\tCtrl-M"); #ifdef CTSIM_MDI m_pFileMenu->AppendSeparator(); m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces...");