From bd4e97f732f7c8154aafbf1bf419c6115e9560c7 Mon Sep 17 00:00:00 2001 From: Eduardo Davila Date: Mon, 30 Mar 2009 15:27:05 +0000 Subject: [PATCH] BUG MACOS --- appli/wxContourGUIExample/CMakeLists.txt | 2 +- .../wxContourGUIExample.cxx | 199 +++++++++++++++++- .../interfMenuBar.h | 15 +- .../interfToolsPanels.h | 1 + .../wxContourMainFrame.cxx | 25 ++- .../wxContourViewPanel.cxx | 14 +- .../wxContour_ButtonsBar.cxx | 1 + .../KernelManagerContour.cxx | 12 +- .../KernelManagerContour.h | 2 +- 9 files changed, 236 insertions(+), 35 deletions(-) diff --git a/appli/wxContourGUIExample/CMakeLists.txt b/appli/wxContourGUIExample/CMakeLists.txt index ef609de..27220a7 100644 --- a/appli/wxContourGUIExample/CMakeLists.txt +++ b/appli/wxContourGUIExample/CMakeLists.txt @@ -4,7 +4,7 @@ IF(WIN32) ADD_EXECUTABLE(wxContourGUIExample WIN32 wxContourGUIExample.cxx) SET_TARGET_PROPERTIES(wxContourGUIExample PROPERTIES LINK_FLAGS /subsystem:console ) ELSE(WIN32) - ADD_EXECUTABLE(wxContourGUIExample wxContourGUIExample) + ADD_EXECUTABLE(wxContourGUIExample MACOSX_BUNDLE wxContourGUIExample) ENDIF(WIN32) diff --git a/appli/wxContourGUIExample/wxContourGUIExample.cxx b/appli/wxContourGUIExample/wxContourGUIExample.cxx index 9e8d5e5..c59f955 100644 --- a/appli/wxContourGUIExample/wxContourGUIExample.cxx +++ b/appli/wxContourGUIExample/wxContourGUIExample.cxx @@ -34,15 +34,34 @@ //#include "interfMainPanel.h" +#if defined(MACOSX) // assume this is OSX +# include +# include // _NSGetExecutablePath : must add -framework CoreFoundation to link line +# include +# ifndef PATH_MAX +# define PATH_MAX MAXPATHLEN +# endif +#endif // MACOSX + +#ifndef PATH_MAX // If not defined yet : do it +# define PATH_MAX 2048 +#endif + + + + wxContourMainFrame* wxTheApplication::frame = 0; //---------------------------------------------------------------------------------------------------------------- // This macro implements the entry point (main function) for the application //---------------------------------------------------------------------------------------------------------------- + + +/* //EED // http://lists.wxwidgets.org/archive/wx-dev/msg30449.html -wxString getExecutablePath() +wxString GetExecutablePath() { char buf[512]; char* slash; @@ -71,6 +90,167 @@ wxString getExecutablePath() return wxString(buf, wxConvUTF8 ); } +*/ + + + + +//========================================================================= +// From http://www.fltk.org/newsgroups.php?gfltk.general+v:22083 +// +int get_app_path (char *pname, size_t pathsize) +{ +#ifdef LINUX + /* Oddly, the readlink(2) man page says no NULL is appended. */ + /* So you have to do it yourself, based on the return value: */ + pathsize --; /* Preserve a space to add the trailing NULL */ + long result = readlink("/proc/self/exe", pname, pathsize); + if (result > 0) + { + pname[result] = 0; /* add the #@!%ing NULL */ + + if ((access(pname, 0) == 0)) + return 0; /* file exists, return OK */ + /*else name doesn't seem to exist, return FAIL (falls + through) */ + } +#endif /* LINUX */ + +#ifdef WIN32 + long result = GetModuleFileName(NULL, pname, pathsize); + if (result > 0) + { + /* fix up the dir slashes... */ + int len = strlen(pname); + int idx; + for (idx = 0; idx < len; idx++) + { + if (pname[idx] == '\\') pname[idx] = '/'; + } + + for (idx = len-1; idx >=0 ; idx--) + { + if (pname[idx] == '/') + { + pname[idx+1] = '\0'; + idx = -1; + } + } + + if ((access(pname, 0) == 0)) + return 0; /* file exists, return OK */ + /*else name doesn't seem to exist, return FAIL (falls + through) */ + } +#endif /* WIN32 */ + +#ifdef SOLARIS + char *p = getexecname(); + if (p) + { + /* According to the Sun manpages, getexecname will + "normally" return an */ + /* absolute path - BUT might not... AND that IF it is not, + pre-pending */ + /* getcwd() will "usually" be the correct thing... Urgh! + */ + + /* check pathname is absolute (begins with a / ???) */ + if (p[0] == '/') /* assume this means we have an + absolute path */ + { + strncpy(pname, p, pathsize); + if ((access(pname, 0) == 0)) + return 0; /* file exists, return OK */ + } + else /* if not, prepend getcwd() then check if file + exists */ + { + getcwd(pname, pathsize); + long result = strlen(pname); + strncat(pname, "/", (pathsize - result)); + result ++; + strncat(pname, p, (pathsize - result)); + + if ((access(pname, 0) == 0)) + return 0; /* file exists, return OK */ + /*else name doesn't seem to exist, return FAIL + (falls through) */ + } + } +#endif /* SOLARIS */ + +#ifdef MACOSX /* assume this is OSX */ + /* + from http://www.hmug.org/man/3/NSModule.html + + extern int _NSGetExecutablePath(char *buf, unsigned long + *bufsize); + + _NSGetExecutablePath copies the path of the executable + into the buffer and returns 0 if the path was successfully + copied in the provided buffer. If the buffer is not large + enough, -1 is returned and the expected buffer size is + copied in *bufsize. Note that _NSGetExecutablePath will + return "a path" to the executable not a "real path" to the + executable. That is the path may be a symbolic link and + not the real file. And with deep directories the total + bufsize needed could be more than MAXPATHLEN. + */ + + int status = -1; + char *given_path = (char*)malloc(MAXPATHLEN * 2); + if (!given_path) return status; + + uint32_t npathsize = MAXPATHLEN * 2; + long result = _NSGetExecutablePath(given_path, &npathsize); + if (result == 0) + { /* OK, we got something - now try and resolve the real path... + */ + if (realpath(given_path, pname) != NULL) + { + if ((access(pname, 0) == 0)) + status = 0; /* file exists, return OK */ + } + } + free (given_path); + return status; +#endif /* MACOSX */ + + return -1; /* Path Lookup Failed */ +} +//========================================================================= + +#if defined(_WIN32) +#define CREACONTOUR_VALID_FILE_SEPARATOR_CHAR '\\' +#else +#define CREACONTOUR_VALID_FILE_SEPARATOR_CHAR '/' +#endif + + +//========================================================================= +std::string GetExecutablePath() +{ + char name[PATH_MAX]; + int err = get_app_path(name, PATH_MAX); + if (err) + { + printf("Could not determine current executable path ? "); + } + + // remove the exe name + char *slash; + slash = strrchr(name, CREACONTOUR_VALID_FILE_SEPARATOR_CHAR); + if (slash) + { + *slash = 0; + } + return name; +} +//========================================================================= + + + @@ -113,7 +293,13 @@ bool wxTheApplication :: OnInit() image_type, threads); w.ShowModal(); - + + std::string datadir( GetExecutablePath() ) ; + +#ifdef MACOSX /* assume this is OSX */ + datadir=datadir+"/../../.."; +#endif // MACOSX + //vtkImageData* selectedimage=NULL; std::vector images; if(w.GetReturnCode() == wxID_OK){ @@ -133,8 +319,8 @@ bool wxTheApplication :: OnInit() }else if (w.GetReturnCode() == wxID_CANCEL){ vtkMetaImageReader *reader = vtkMetaImageReader::New(); - wxString filename= getExecutablePath()+ wxString( _T("/data/hola.mhd") , wxConvUTF8 ); - reader->SetFileName( (const char*)(filename.mb_str()) ); + std::string filename= datadir + "/data/hola.mhd"; + reader->SetFileName( filename.c_str() ); reader->Update(); images.push_back(reader->GetOutput()); }else{ @@ -145,11 +331,10 @@ bool wxTheApplication :: OnInit() wxFrame* frame1 = new wxFrame(NULL, wxID_ANY, wxT("ROI Application - Evaluation version, 09 Feb 2009 "), wxPoint(400,50), wxSize(800, 600) ); //frame = new wxContourMainFrame( frame1, wxID_ANY, wxString(_T("")), wxPoint(50,50), wxSize(800, 600), images ); - frame = wxContourMainFrame::getInstance(frame1, wxID_ANY, wxString(_T("")), wxPoint(200,50), wxSize(800, 600), images, wxDEFAULT_FRAME_STYLE | wxSUNKEN_BORDER,(const char*)( getExecutablePath().mb_str() ) ); + frame = wxContourMainFrame::getInstance(frame1, wxID_ANY, wxString(_T("")), wxPoint(200,50), wxSize(800, 600), images, wxDEFAULT_FRAME_STYLE | wxSUNKEN_BORDER,datadir ); frame1->CreateStatusBar(); frame1->Show(TRUE); - - + frame->RefreshInterface(); return TRUE; } diff --git a/lib/Interface_Icons_NDimensions/interfMenuBar.h b/lib/Interface_Icons_NDimensions/interfMenuBar.h index 28441b0..55905bf 100644 --- a/lib/Interface_Icons_NDimensions/interfMenuBar.h +++ b/lib/Interface_Icons_NDimensions/interfMenuBar.h @@ -1,6 +1,7 @@ #ifndef __interfMENUBARH__ #define __interfMENUBARH__ +#include #include #include #include @@ -45,7 +46,7 @@ public: this->SetAutoLayout( true ); //first row of the sizer, the buttons are being added - for(int i = 0; i < vpath.size();i++){ + for(int i = 0; i < (int)(vpath.size());i++){ std::string p = vpath[i]; wxBitmapButton* bitmapbutton = this->getButton(p, sizex, sizey); flexsizer->Add(bitmapbutton,wxFIXED_MINSIZE); @@ -53,7 +54,7 @@ public: } //second row of the sizer, the names are being added - for(int i = 0; i < vnom.size(); i++){ + for(int i = 0; i < (int)(vnom.size()); i++){ //sizex = vectbutton[i]->GetSize().GetWidth(); std::string n = vnom[i]; vectbutton[i]->SetToolTip(wxString(n.c_str(),wxConvUTF8)); @@ -102,7 +103,7 @@ public: ** and name of the button. See addButton(, ) **/ virtual void setVectorFunction(std::vector vectf){ - for(int i = 0; i < vectf.size();i++){ + for(int i = 0; i < (int)(vectf.size());i++){ vectfunct.push_back(vectf[i]); } } @@ -113,7 +114,7 @@ public: **/ virtual void connectEvents(wxEvtHandler* evtHandler){ - for(int i = 0; i < vectbutton.size();i++){ + for(int i = 0; i < (int)(vectbutton.size());i++){ Connect(vectbutton[i]->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, vectfunct[i],NULL,evtHandler); } } @@ -124,7 +125,7 @@ public: **/ virtual void connectEvents(){ - for(int i = 0; i < vectbutton.size();i++){ + for(int i = 0; i < (int)(vectbutton.size());i++){ Connect(vectbutton[i]->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, vectfunct[i],NULL,vecthand[i]); } } @@ -136,7 +137,7 @@ public: ** @params const char name of the button see wxContour_ActionCommandsID.h to view the commands **/ virtual void setButtonName(int i, const char c){ - if(i < vectbutton.size()){ + if(i < (int)(vectbutton.size())){ std::string ac = c+""; vectbutton[i]->SetName(wxString(ac.c_str(),wxConvUTF8)); } @@ -163,7 +164,7 @@ public: virtual void setEventHandlers(std::vector hand){ - for(int i = 0; i < hand.size();i++){ + for(int i = 0; i < (int)(hand.size());i++){ vecthand.push_back(hand[i]); } } diff --git a/lib/Interface_Icons_NDimensions/interfToolsPanels.h b/lib/Interface_Icons_NDimensions/interfToolsPanels.h index 8d8b128..3ce9141 100644 --- a/lib/Interface_Icons_NDimensions/interfToolsPanels.h +++ b/lib/Interface_Icons_NDimensions/interfToolsPanels.h @@ -1,6 +1,7 @@ #ifndef __interfToolsPanelH__ #define __interfToolsPanelH__ +#include #include #include "mBarRange.h" #include diff --git a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx index e81e730..e202f98 100644 --- a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx +++ b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx @@ -102,7 +102,16 @@ char wxContourMainFrame::COPY = 'C'; inredo = 0; inundo = 0; - kernelManager = new KernelManagerContour(images,datadir+"/data/"); +#if defined(__GNUC__) + std::string str_home(getenv("HOME")); +#elif defined(_WIN32) + std::string str_home(getenv("USERPROFILE")); +#endif + std::string strCreaContourDataTmp = str_home + "/.creaContourDataTemp/"; +// std::string command("mkdir "+strCreaContourDataTmp); +// system( command.c_str() ); + + kernelManager = new KernelManagerContour( images , datadir+"/data/" , strCreaContourDataTmp ); //kernelManager->setVectImages(images); //kernelManager->initializeEnvironment(); @@ -709,10 +718,10 @@ void wxContourMainFrame :: createMirrorContourOf ( std::string anExistingKName, double pnt1X = refPoint1->GetX(); double pnt1Y = refPoint1->GetY(); - double pnt1Z = refPoint1->GetZ(); +// double pnt1Z = refPoint1->GetZ(); double pnt2X = refPoint2->GetX(); double pnt2Y = refPoint2->GetY(); - double pnt2Z = refPoint2->GetZ(); +// double pnt2Z = refPoint2->GetZ(); double angle = (atan2(pnt2Y - pnt1Y, pnt2X - pnt1X) * 180 / 3.1415926535897932384626433832795)+90; vtkTransform *t = vtkTransform::New(); @@ -1483,8 +1492,8 @@ myfile.close(); { id = polyDataResult->GetLines()->GetData()->GetValue(ii); p = polyDataResult->GetPoint(id); - double x=p[0]; - double y=p[1]; +// double x=p[0]; +// double y=p[1]; vecX.push_back( p[0] ); vecY.push_back( p[1] ); vecZ.push_back( -900 ); @@ -2049,7 +2058,8 @@ void wxContourMainFrame::onSaveResults(std::string directory,std::string namefil int iTitle,sizeTitle = (maxX / _numberOfVariablesStatistics); for ( iTitle=0; iTitleShowModal(); } // if diff --git a/lib/Interface_ManagerContour_NDimensions/wxContourViewPanel.cxx b/lib/Interface_ManagerContour_NDimensions/wxContourViewPanel.cxx index 00465c1..bab1268 100644 --- a/lib/Interface_ManagerContour_NDimensions/wxContourViewPanel.cxx +++ b/lib/Interface_ManagerContour_NDimensions/wxContourViewPanel.cxx @@ -148,7 +148,6 @@ DEFINE_EVENT_TYPE( wxINSTANT_CHANGE ) //outSizer->Fit( this ); initializeScenceManager(); - } @@ -212,7 +211,7 @@ DEFINE_EVENT_TYPE( wxINSTANT_CHANGE ) } //------------------------------------------------------------------------------------------------------------ - void wxContourViewPanel :: createViewPanel() + void wxContourViewPanel::createViewPanel() { std::vector * numViews = new std::vector (); numViews->push_back(2); @@ -222,7 +221,8 @@ DEFINE_EVENT_TYPE( wxINSTANT_CHANGE ) theViewPanel->SetBackgroundColour(wxColour(0,0,0)); theViewPanel->SetSize(800,600); - theViewPanel->GetWindow(1)->SetSize(800,600); + theViewPanel->GetWindow(1)->SetSize(800,600); + } //------------------------------------------------------------------------------------------------------------ @@ -311,14 +311,14 @@ DEFINE_EVENT_TYPE( wxINSTANT_CHANGE ) */ void wxContourViewPanel :: onStartChange_Bar_Horizontal(wxCommandEvent& event) { - int nxStart_h = getStartHorizontal(); +// int nxStart_h = getStartHorizontal(); } /** * Handles the event wxEVT_TSBAR_END from the horizontal bar */ void wxContourViewPanel :: onEndChange_Bar_Horizontal(wxCommandEvent& event) { - int nxEnd_h = getEndHorizontal(); +// int nxEnd_h = getEndHorizontal(); } /** * Handles the event wxEVT_SELECTION_END from the horizontal bar @@ -332,8 +332,8 @@ DEFINE_EVENT_TYPE( wxINSTANT_CHANGE ) */ void wxContourViewPanel :: onMovedBar_Horizontal(wxCommandEvent& event) { - int nxStart_h = getStartHorizontal(); - int nxEnd_h = getEndHorizontal(); +// int nxStart_h = getStartHorizontal(); +// int nxEnd_h = getEndHorizontal(); } diff --git a/lib/Interface_ManagerContour_NDimensions/wxContour_ButtonsBar.cxx b/lib/Interface_ManagerContour_NDimensions/wxContour_ButtonsBar.cxx index f000243..0b7d735 100644 --- a/lib/Interface_ManagerContour_NDimensions/wxContour_ButtonsBar.cxx +++ b/lib/Interface_ManagerContour_NDimensions/wxContour_ButtonsBar.cxx @@ -15,6 +15,7 @@ //------------------------------------------------------------------------------------------------------------ #include "wxContour_ActionCommandsID.h" +#include #include "wx/toolbar.h" #include "wx/log.h" #include "wx/image.h" diff --git a/lib/kernel_ManagerContour_NDimensions/KernelManagerContour.cxx b/lib/kernel_ManagerContour_NDimensions/KernelManagerContour.cxx index 2a1586c..8322259 100644 --- a/lib/kernel_ManagerContour_NDimensions/KernelManagerContour.cxx +++ b/lib/kernel_ManagerContour_NDimensions/KernelManagerContour.cxx @@ -34,7 +34,7 @@ KernelManagerContour::KernelManagerContour(){ **/ } -KernelManagerContour::KernelManagerContour(std::vector images,std::string datadir){ +KernelManagerContour::KernelManagerContour(std::vector images,std::string datadir,std::string tmpdir){ /**THIS ALL SHOULD BE IN AN OTHER LIB CALLED PERSISTANCE @@ -48,14 +48,16 @@ KernelManagerContour::KernelManagerContour(std::vector images,std int time = seconds; - stundoredo = datadir+"/temp"+intToString(time); + stundoredo = tmpdir+"/temp"+intToString(time); _currentIndex = 0; _contourPropagation = NULL; #if(WIN32) - mkdir(stundoredo.c_str()); + mkdir(tmpdir.c_str()); + mkdir(stundoredo.c_str()); #else - mkdir(stundoredo.c_str(),755); + mkdir(tmpdir.c_str(),755); + mkdir(stundoredo.c_str(),755); #endif stundoredo += "/cont"; /** @@ -66,7 +68,7 @@ KernelManagerContour::KernelManagerContour(std::vector images,std } KernelManagerContour::~KernelManagerContour(){ -} +} std::vector KernelManagerContour::getVectImages(){ return vectimages; diff --git a/lib/kernel_ManagerContour_NDimensions/KernelManagerContour.h b/lib/kernel_ManagerContour_NDimensions/KernelManagerContour.h index 067cbf3..a266134 100644 --- a/lib/kernel_ManagerContour_NDimensions/KernelManagerContour.h +++ b/lib/kernel_ManagerContour_NDimensions/KernelManagerContour.h @@ -33,7 +33,7 @@ public: ** If images are available before the construction of the kernelManager this method should be used ** it sets the vector images and initializes the environment **/ - KernelManagerContour(std::vector images,std::string datadir); + KernelManagerContour(std::vector images,std::string datadir,std::string tmpdir); ~KernelManagerContour(); std::vector getVectImages(); -- 2.45.1