diff --git a/app.py b/app.py new file mode 100755 index 0000000..2f83917 --- /dev/null +++ b/app.py @@ -0,0 +1,327 @@ +#!/usr/bin/python +#-------------------------------------------------------------------------- +# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas +# Copyright: (C) 2001 Centro de Pesquisas Renato Archer +# Homepage: http://www.softwarepublico.gov.br +# Contact: invesalius@cti.gov.br +# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) +#-------------------------------------------------------------------------- +# Este programa e software livre; voce pode redistribui-lo e/ou +# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme +# publicada pela Free Software Foundation; de acordo com a versao 2 +# da Licenca. +# +# Este programa eh distribuido na expectativa de ser util, mas SEM +# QUALQUER GARANTIA; sem mesmo a garantia implicita de +# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM +# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais +# detalhes. +#------------------------------------------------------------------------- + + +import multiprocessing +import optparse as op +import os +import sys +import shutil + +if sys.platform == 'win32': + import _winreg +else: + if sys.platform != 'darwin': + import wxversion + #wxversion.ensureMinimal('2.8-unicode', optionsRequired=True) + #wxversion.select('2.8-unicode', optionsRequired=True) + wxversion.ensureMinimal('3.0') + +import wx +#from wx.lib.pubsub import setupv1 #new wx +from wx.lib.pubsub import setuparg1# as psv1 +#from wx.lib.pubsub import Publisher +#import wx.lib.pubsub as ps +from wx.lib.pubsub import pub as Publisher + +#import wx.lib.agw.advancedsplash as agw +#if sys.platform == 'linux2': +# _SplashScreen = agw.AdvancedSplash +#else: +# if sys.platform != 'darwin': +# _SplashScreen = wx.SplashScreen + + +import invesalius.gui.language_dialog as lang_dlg +import invesalius.i18n as i18n +import invesalius.session as ses +import invesalius.utils as utils + +# ------------------------------------------------------------------ + + +class InVesalius(wx.App): + """ + InVesalius wxPython application class. + """ + def OnInit(self): + """ + Initialize splash screen and main frame. + """ + self.SetAppName("InVesalius 3") + self.splash = SplashScreen() + self.splash.Show() + wx.CallLater(1000,self.Startup2) + + return True + + def MacOpenFile(self, filename): + """ + Open drag & drop files under darwin + """ + path = os.path.abspath(filename) + Publisher.sendMessage('Open project', path) + + def Startup2(self): + self.control = self.splash.control + self.frame = self.splash.main + self.SetTopWindow(self.frame) + self.frame.Show() + self.frame.Raise() + +# ------------------------------------------------------------------ + +class SplashScreen(wx.SplashScreen): + """ + Splash screen to be shown in InVesalius initialization. + """ + def __init__(self): + # Splash screen image will depend on currently language + lang = False + + # Language information is available in session configuration + # file. First we need to check if this file exist, if now, it + # should be created + create_session = False + session = ses.Session() + if not (session.ReadSession()): + create_session = True + + install_lang = 0 + # Check if there is a language set (if session file exists + if session.ReadLanguage(): + lang = session.GetLanguage() + if (lang != "False"): + _ = i18n.InstallLanguage(lang) + install_lang = 1 + else: + install_lang = 0 + else: + install_lang = 0 + + # If no language is set into session file, show dialog so + # user can select language + if install_lang == 0: + dialog = lang_dlg.LanguageDialog() + + # FIXME: This works ok in linux2, darwin and win32, + # except on win64, due to wxWidgets bug + try: + ok = (dialog.ShowModal() == wx.ID_OK) + except wx._core.PyAssertionError: + ok = True + finally: + if ok: + lang = dialog.GetSelectedLanguage() + session.SetLanguage(lang) + _ = i18n.InstallLanguage(lang) + else: + homedir = self.homedir = os.path.expanduser('~') + invdir = os.path.join(homedir, ".invesalius") + shutil.rmtree(invdir) + sys.exit() + + # Session file should be created... So we set the recent + # choosen language + if (create_session): + session.CreateItens() + session.SetLanguage(lang) + session.WriteSessionFile() + + session.SaveConfigFileBackup() + + + # Only after language was defined, splash screen will be + # shown + if lang: + # For pt_BR, splash_pt.png should be used + if (lang.startswith('pt')): + icon_file = "splash_pt.png" + else: + icon_file = "splash_" + lang + ".png" + + if hasattr(sys,"frozen") and (sys.frozen == "windows_exe"\ + or sys.frozen == "console_exe"): + abs_file_path = os.path.abspath(".." + os.sep) + path = abs_file_path + + path = os.path.join(path, "icons", icon_file) + else: + + path = os.path.join(".","icons", icon_file) + if not os.path.exists(path): + path = os.path.join(".", "icons", "splash_en.png") + + bmp = wx.Image(path).ConvertToBitmap() + + style = wx.SPLASH_TIMEOUT | wx.SPLASH_CENTRE_ON_SCREEN + wx.SplashScreen.__init__(self, + bitmap=bmp, + splashStyle=style, + milliseconds=1500, + id=-1, + parent=None) + self.Bind(wx.EVT_CLOSE, self.OnClose) + wx.Yield() + wx.CallLater(200,self.Startup) + + def Startup(self): + # Importing takes sometime, therefore it will be done + # while splash is being shown + from invesalius.gui.frame import Frame + from invesalius.control import Controller + from invesalius.project import Project + + self.main = Frame(None) + self.control = Controller(self.main) + + self.fc = wx.FutureCall(1, self.ShowMain) + wx.FutureCall(1, parse_comand_line) + + # Check for updates + from threading import Thread + p = Thread(target=utils.UpdateCheck, args=()) + p.start() + + def OnClose(self, evt): + # Make sure the default handler runs too so this window gets + # destroyed + evt.Skip() + self.Hide() + + # If the timer is still running then go ahead and show the + # main frame now + if self.fc.IsRunning(): + self.fc.Stop() + self.ShowMain() + + def ShowMain(self): + # Show main frame + self.main.Show() + + if self.fc.IsRunning(): + self.Raise() + +# ------------------------------------------------------------------ + + +def parse_comand_line(): + """ + Handle command line arguments. + """ + session = ses.Session() + + # Parse command line arguments + parser = op.OptionParser() + + # -d or --debug: print all pubsub messagessent + parser.add_option("-d", "--debug", + action="store_true", + dest="debug") + + # -i or --import: import DICOM directory + # chooses largest series + parser.add_option("-i", "--import", + action="store", + dest="dicom_dir") + options, args = parser.parse_args() + + # If debug argument... + if options.debug: + Publisher.subscribe(print_events, Publisher.ALL_TOPICS) + session.debug = 1 + + # If import DICOM argument... + if options.dicom_dir: + import_dir = options.dicom_dir + Publisher.sendMessage('Import directory', import_dir) + return True + + # Check if there is a file path somewhere in what the user wrote + # In case there is, try opening as it was a inv3 + else: + i = len(args) + while i: + i -= 1 + file = args[i] + if os.path.isfile(file): + path = os.path.abspath(file) + Publisher.sendMessage('Open project', path) + i = 0 + return True + return False + + +def print_events(data): + """ + Print pubsub messages + """ + utils.debug(data.topic) + +def main(): + """ + Initialize InVesalius GUI + """ + application = InVesalius(0) + application.MainLoop() + +if __name__ == '__main__': + # Needed in win 32 exe + if hasattr(sys,"frozen") and (sys.frozen == "windows_exe"\ + or sys.frozen == "console_exe"): + multiprocessing.freeze_support() + + #Click in the .inv3 file support + root = _winreg.HKEY_CLASSES_ROOT + key = "InVesalius 3.0\InstallationDir" + hKey = _winreg.OpenKey (root, key, 0, _winreg.KEY_READ) + value, type_ = _winreg.QueryValueEx (hKey, "") + path = os.path.join(value,'dist') + + os.chdir(path) + + # Create raycasting presets' folder, if it doens't exist + dirpath = os.path.join(os.path.expanduser('~'), + ".invesalius", + "presets") + if not os.path.isdir(dirpath): + os.makedirs(dirpath) + + # Create logs' folder, if it doesn't exist + dirpath = os.path.join(os.path.expanduser('~'), + ".invesalius", + "logs") + if not os.path.isdir(dirpath): + os.makedirs(dirpath) + + if hasattr(sys,"frozen") and sys.frozen == "windows_exe": + # Set system standard error output to file + path = os.path.join(dirpath, "stderr.log") + sys.stderr = open(path, "w") + + # Add current directory to PYTHONPATH, so other classes can + # import modules as they were on root invesalius folder + sys.path.insert(0, '.') + sys.path.append(".") + + + # Init application + main() + diff --git a/invesalius/constants.py b/invesalius/constants.py index 958eec0..276b5d3 100644 --- a/invesalius/constants.py +++ b/invesalius/constants.py @@ -23,8 +23,7 @@ import sys import wx import itertools -from project import Project - +#from invesalius.project import Project INVESALIUS_VERSION = "3.0" #--------------- @@ -208,8 +207,10 @@ VOLUME_POSITION = {AXIAL: [AXIAL_VOLUME_CAM_VIEW_UP, AXIAL_VOLUME_CAM_POSITION], # Mask threshold options -proj = Project() -THRESHOLD_RANGE = proj.threshold_modes[_("Bone")] + +#proj = Project() +#THRESHOLD_RANGE = proj.threshold_modes[_("Bone")] +THRESHOLD_RANGE = [0,3033] THRESHOLD_PRESETS_INDEX = _("Bone") THRESHOLD_HUE_RANGE = (0, 0.6667) THRESHOLD_INVALUE = 5000 @@ -319,9 +320,25 @@ WINDOW_LEVEL = {_("Abdomen"):(350,50), REDUCE_IMAGEDATA_QUALITY = 0 -ICON_DIR = os.path.abspath(os.path.join('..', 'icons')) -SAMPLE_DIR = os.path.abspath(os.path.join('..', 'samples')) -DOC_DIR = os.path.abspath(os.path.join('..', 'docs')) +FILE_PATH = os.path.split(__file__)[0] + +if hasattr(sys,"frozen") and (sys.frozen == "windows_exe"\ + or sys.frozen == "console_exe"): + abs_path_icon = os.path.abspath(FILE_PATH + os.sep + ".." + os.sep + ".." + os.sep + "..") + ICON_DIR = os.path.join(abs_path_icon, "icons") + SAMPLE_DIR = os.path.join(FILE_PATH, 'samples') + DOC_DIR = os.path.join(FILE_PATH, 'docs') +else: + ICON_DIR = os.path.abspath(os.path.join(FILE_PATH, '..', 'icons')) + SAMPLE_DIR = os.path.abspath(os.path.join(FILE_PATH,'..', 'samples')) + DOC_DIR = os.path.abspath(os.path.join(FILE_PATH,'..', 'docs')) + + +# MAC App +if not os.path.exists(ICON_DIR): + ICON_DIR = os.path.abspath(os.path.join(FILE_PATH, '..', '..', '..', '..', 'icons')) + SAMPLE_DIR = os.path.abspath(os.path.join(FILE_PATH,'..', '..', '..', '..', 'samples')) + DOC_DIR = os.path.abspath(os.path.join(FILE_PATH,'..', '..', '..', '..', 'docs')) ID_TO_BMP = {VOL_FRONT: [_("Front"), os.path.join(ICON_DIR, "view_front.png")], @@ -336,7 +353,7 @@ ID_TO_BMP = {VOL_FRONT: [_("Front"), os.path.join(ICON_DIR, "view_front.png")], # if 1, use vtkVolumeRaycastMapper, if 0, use vtkFixedPointVolumeRayCastMapper TYPE_RAYCASTING_MAPPER = 0 -folder=RAYCASTING_PRESETS_DIRECTORY= os.path.abspath(os.path.join("..", +folder=RAYCASTING_PRESETS_DIRECTORY= os.path.abspath(os.path.join(".", "presets", "raycasting")) diff --git a/invesalius/control.py b/invesalius/control.py index b020dbb..a123ac8 100644 --- a/invesalius/control.py +++ b/invesalius/control.py @@ -23,24 +23,24 @@ import wx import numpy from wx.lib.pubsub import pub as Publisher -import constants as const -import data.imagedata_utils as image_utils -import data.mask as msk -import data.measures -import data.slice_ as sl -import data.surface as srf -import data.volume as volume -import gui.dialogs as dialog -import project as prj -import reader.analyze_reader as analyze -import reader.dicom_grouper as dg -import reader.dicom_reader as dcm -import reader.bitmap_reader as bmp -import session as ses - - -import utils -import gui.dialogs as dialogs +import invesalius.constants as const +import invesalius.data.imagedata_utils as image_utils +import invesalius.data.mask as msk +import invesalius.data.measures as measures +import invesalius.data.slice_ as sl +import invesalius.data.surface as srf +import invesalius.data.volume as volume +import invesalius.gui.dialogs as dialog +import invesalius.project as prj +import invesalius.reader.analyze_reader as analyze +import invesalius.reader.dicom_grouper as dg +import invesalius.reader.dicom_reader as dcm +import invesalius.reader.bitmap_reader as bmp +import invesalius.session as ses + + +import invesalius.utils as utils +import invesalius.gui.dialogs as dialogs import subprocess import sys @@ -57,7 +57,7 @@ class Controller(): self.cancel_import = False #Init session session = ses.Session() - self.measure_manager = data.measures.MeasurementManager() + self.measure_manager = measures.MeasurementManager() Publisher.sendMessage('Load Preferences') @@ -376,8 +376,8 @@ class Controller(): data = evt.data ok = self.LoadImportBitmapPanel(data) if ok: - Publisher.sendMessage('Show import bitmap panel in frame') - #Publisher.sendMessage("Show import panel in frame") + Publisher.sendMessage('Show import bitmap panel in frame') + #Publisher.sendMessage("Show import panel in invesalius.gui.frame") as frame def LoadImportBitmapPanel(self, data): #if patient_series and isinstance(patient_series, list): @@ -435,6 +435,7 @@ class Controller(): const.THRESHOLD_OUTVALUE = proj.threshold_range[0] const.THRESHOLD_INVALUE = proj.threshold_range[1] + const.THRESHOLD_RANGE = proj.threshold_modes[_("Bone")] const.WINDOW_LEVEL[_('Default')] = (proj.window, proj.level) const.WINDOW_LEVEL[_('Manual')] = (proj.window, proj.level) diff --git a/invesalius/data/cursor_actors.py b/invesalius/data/cursor_actors.py index d8f765c..51abea6 100644 --- a/invesalius/data/cursor_actors.py +++ b/invesalius/data/cursor_actors.py @@ -21,9 +21,9 @@ import math import numpy import vtk -import imagedata_utils -from project import Project -import constants as const +import invesalius.data.imagedata_utils as imagedata_utils +from invesalius.project import Project as project +import invesalius.constants as const from vtk.util import numpy_support @@ -241,7 +241,6 @@ class CursorCircle(CursorBase): """ Function to plot the circle """ - print "Building circle cursor", self.orientation r = self.radius sx, sy, sz = self.spacing if self.orientation == 'AXIAL': @@ -284,12 +283,6 @@ class CursorCircle(CursorBase): self.mapper.SetOrientation(ORIENTATION[self.orientation]) - print '====================================' - print self.orientation - print circle_ci.GetSpacing() - print xi, xf, yi, yf, zi, zf - print '====================================' - def _calculate_area_pixels(self): """ Return the cursor's pixels. diff --git a/invesalius/data/geometry.py b/invesalius/data/geometry.py index 4e30704..ca5006a 100644 --- a/invesalius/data/geometry.py +++ b/invesalius/data/geometry.py @@ -23,8 +23,8 @@ import math import vtk from wx.lib.pubsub import pub as Publisher -import utils -import constants as const +import invesalius.utils as utils +import invesalius.constants as const class Box(object): diff --git a/invesalius/data/imagedata_utils.py b/invesalius/data/imagedata_utils.py index b5fe80c..dc24c51 100644 --- a/invesalius/data/imagedata_utils.py +++ b/invesalius/data/imagedata_utils.py @@ -30,12 +30,11 @@ from wx.lib.pubsub import pub as Publisher from scipy.ndimage import shift from vtk.util import numpy_support -import constants as const -from data import vtk_utils -from reader import bitmap_reader -import utils -import converters - +import invesalius.constants as const +from invesalius.data import vtk_utils as vtk_utils +import invesalius.reader.bitmap_reader as bitmap_reader +import invesalius.utils as utils +import invesalius.data.converters as converters # TODO: Test cases which are originally in sagittal/coronal orientation # and have gantry diff --git a/invesalius/data/mask.py b/invesalius/data/mask.py index c204cb9..510b2c4 100644 --- a/invesalius/data/mask.py +++ b/invesalius/data/mask.py @@ -26,9 +26,9 @@ import tempfile import numpy import vtk -import constants as const -import imagedata_utils as iu -import session as ses +import invesalius.constants as const +import invesalius.data.imagedata_utils as iu +import invesalius.session as ses from wx.lib.pubsub import pub as Publisher @@ -110,9 +110,6 @@ class EditionHistory(object): #self._reload_slice(self.index - 1) if h[self.index - 1].orientation == 'VOLUME': self.index -= 1 - print "================================" - print mvolume.shape - print "================================" h[self.index].commit_history(mvolume) self._reload_slice(self.index) Publisher.sendMessage("Enable redo", True) diff --git a/invesalius/data/measures.py b/invesalius/data/measures.py index d6ef91f..65f8be1 100644 --- a/invesalius/data/measures.py +++ b/invesalius/data/measures.py @@ -10,11 +10,10 @@ from wx.lib.pubsub import pub as Publisher import numpy as np import vtk -import constants as const -import project as prj -import session as ses -import utils - +import invesalius.constants as const +import invesalius.project as prj +import invesalius.session as ses +import invesalius.utils as utils TYPE = {const.LINEAR: _(u"Linear"), const.ANGULAR: _(u"Angular"), } diff --git a/invesalius/data/polydata_utils.py b/invesalius/data/polydata_utils.py index 23f7375..05cd59f 100644 --- a/invesalius/data/polydata_utils.py +++ b/invesalius/data/polydata_utils.py @@ -23,7 +23,7 @@ import vtk import wx from wx.lib.pubsub import pub as Publisher -import vtk_utils as vu +import invesalius.data.vtk_utils as vu # Update progress value in GUI UpdateProgress = vu.ShowProgress() diff --git a/invesalius/data/slice_.py b/invesalius/data/slice_.py index d128783..da1f752 100644 --- a/invesalius/data/slice_.py +++ b/invesalius/data/slice_.py @@ -23,20 +23,18 @@ import numpy as np import vtk from wx.lib.pubsub import pub as Publisher -import constants as const -import converters -import imagedata_utils as iu -import style as st -import session as ses -import utils - -from mask import Mask -from project import Project -from data import mips - -from data import transforms -import transformations - +import invesalius.constants as const +import invesalius.data.converters as converters +import invesalius.data.imagedata_utils as iu +import invesalius.style as st +import invesalius.session as ses +import invesalius.utils as utils +from invesalius.data.mask import Mask +from invesalius.project import Project +from invesalius.data import mips + +from invesalius.data import transforms +import invesalius.data.transformations as transformations OTHER=0 PLIST=1 WIDGET=2 @@ -386,7 +384,6 @@ class Slice(object): def __show_mask(self, pubsub_evt): # "if" is necessary because wx events are calling this before any mask # has been created - print "__show_mask" if self.current_mask: index, value = pubsub_evt.data self.ShowMask(index, value) @@ -889,7 +886,6 @@ class Slice(object): def ShowMask(self, index, value): "Show a mask given its index and 'show' value (0: hide, other: show)" - print "Showing Mask" proj = Project() proj.mask_dict[index].is_shown = value proj.mask_dict[index].on_show() diff --git a/invesalius/data/slice_data.py b/invesalius/data/slice_data.py index c40dece..bd6e26b 100644 --- a/invesalius/data/slice_data.py +++ b/invesalius/data/slice_data.py @@ -18,8 +18,8 @@ #-------------------------------------------------------------------------- import vtk -import constants as const -import vtk_utils as vu +import invesalius.constants as const +import invesalius.data.vtk_utils as vu BORDER_UP = 1 BORDER_DOWN = 2 diff --git a/invesalius/data/styles.py b/invesalius/data/styles.py index 037c489..a92bd78 100644 --- a/invesalius/data/styles.py +++ b/invesalius/data/styles.py @@ -30,10 +30,10 @@ import wx from wx.lib.pubsub import pub as Publisher -import constants as const -import converters -import cursor_actors as ca -import session as ses +import invesalius.constants as const +import invesalius.data.converters as converters +import invesalius.data.cursor_actors as ca +import invesalius.session as ses import numpy as np @@ -43,16 +43,15 @@ from scipy.ndimage import watershed_ift, generate_binary_structure from skimage.morphology import watershed from skimage import filter -from gui import dialogs -from .measures import MeasureData +import invesalius.gui.dialogs as dialogs +from invesalius.data.measures import MeasureData from . import floodfill -import watershed_process - -import utils -import transformations -import geometry as geom +import invesalius.data.watershed_process as watershed_process +import invesalius.utils as utils +import invesalius.data.transformations as transformations +import invesalius.data.geometry as geom ORIENTATIONS = { "AXIAL": const.AXIAL, @@ -1895,7 +1894,7 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle): def SetUp(self): if not self.config.dlg_visible: - import data.mask as mask + import invesalius.data.mask as mask default_name = const.MASK_NAME_PATTERN %(mask.Mask.general_index+2) self.config.mask_name = default_name diff --git a/invesalius/data/surface.py b/invesalius/data/surface.py index 68ac6ca..0ec727e 100644 --- a/invesalius/data/surface.py +++ b/invesalius/data/surface.py @@ -28,14 +28,14 @@ import vtk import wx from wx.lib.pubsub import pub as Publisher -import constants as const -import imagedata_utils as iu -import polydata_utils as pu -import project as prj -import session as ses -import surface_process -import utils as utl -import vtk_utils as vu +import invesalius.constants as const +import invesalius.data.imagedata_utils as iu +import invesalius.data.polydata_utils as pu +import invesalius.project as prj +import invesalius.session as ses +import invesalius.data.surface_process as surface_process +import invesalius.utils as utl +import invesalius.data.vtk_utils as vu try: import ca_smoothing diff --git a/invesalius/data/surface_process.py b/invesalius/data/surface_process.py index 63a1378..aa4e5cb 100644 --- a/invesalius/data/surface_process.py +++ b/invesalius/data/surface_process.py @@ -5,9 +5,9 @@ import time import numpy import vtk -import i18n -import converters -# import imagedata_utils as iu +import invesalius.i18n as i18n +import invesalius.data.converters as converters +# import invesalius.data.imagedata_utils as iu from scipy import ndimage diff --git a/invesalius/data/viewer_slice.py b/invesalius/data/viewer_slice.py index 33f5034..4526602 100755 --- a/invesalius/data/viewer_slice.py +++ b/invesalius/data/viewer_slice.py @@ -28,8 +28,7 @@ import numpy as np import vtk from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor -import styles - +import invesalius.data.styles as styles import wx import sys from wx.lib.pubsub import pub as Publisher @@ -39,17 +38,16 @@ try: except ImportError: # if it's not there locally, try the wxPython lib. import wx.lib.agw.floatspin as FS -import constants as const -import cursor_actors as ca -import data.slice_ as sl -import data.vtk_utils as vtku -import project -import slice_data as sd -import utils -import session as ses -from data import converters - -from data import measures +import invesalius.constants as const +import invesalius.data.cursor_actors as ca +import invesalius.data.slice_ as sl +import invesalius.data.vtk_utils as vtku +import invesalius.project as project +import invesalius.data.slice_data as sd +import invesalius.utils as utils +import invesalius.session as ses +import invesalius.data.converters as converters +import invesalius.data.measures as measures ID_TO_TOOL_ITEM = {} STR_WL = "WL: %d WW: %d" @@ -1236,10 +1234,10 @@ class Viewer(wx.Panel): self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_SIZEWE)) def SetSizeNWSECursor(self, pubsub_evt): - if sys.platform == 'win32': - self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_SIZING)) - else: + if sys.platform == 'linux2': self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_SIZENWSE)) + else: + self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_SIZING)) def OnExportPicture(self, pubsub_evt): Publisher.sendMessage('Begin busy cursor') diff --git a/invesalius/data/viewer_volume.py b/invesalius/data/viewer_volume.py index f75e6b6..3924b24 100755 --- a/invesalius/data/viewer_volume.py +++ b/invesalius/data/viewer_volume.py @@ -28,14 +28,13 @@ import vtk from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor from wx.lib.pubsub import pub as Publisher -import constants as const -import data.bases as bases -import data.vtk_utils as vtku -import project as prj -import style as st -import utils - -from data import measures +import invesalius.constants as const +import invesalius.data.bases as bases +import invesalius.data.vtk_utils as vtku +import invesalius.project as prj +import invesalius.style as st +import invesalius.utils as utils +import invesalius.data.measures as measures PROP_MEASURE = 0.8 diff --git a/invesalius/data/volume.py b/invesalius/data/volume.py index 91a07bf..35a0d66 100644 --- a/invesalius/data/volume.py +++ b/invesalius/data/volume.py @@ -25,13 +25,13 @@ import vtk import wx from wx.lib.pubsub import pub as Publisher -import constants as const -import project as prj -import slice_ -import converters -from data import vtk_utils +import invesalius.constants as const +import invesalius.project as prj +import invesalius.data.slice_ as slice_ +import invesalius.data.converters as converters +import invesalius.data.vtk_utils as vtk_utils from vtk.util import numpy_support -import session as ses +import invesalius.session as ses Kernels = { diff --git a/invesalius/data/vtk_utils.py b/invesalius/data/vtk_utils.py index 86724b9..372ff28 100644 --- a/invesalius/data/vtk_utils.py +++ b/invesalius/data/vtk_utils.py @@ -20,9 +20,8 @@ import sys import vtk from wx.lib.pubsub import pub as Publisher - -import constants as const -from gui.dialogs import ProgressDialog +import invesalius.constants as const +from invesalius.gui.dialogs import ProgressDialog # If you are frightened by the code bellow, or think it must have been result of # an identation error, lookup at: diff --git a/invesalius/gui/bitmap_preview_panel.py b/invesalius/gui/bitmap_preview_panel.py index 82f71ff..e66432a 100644 --- a/invesalius/gui/bitmap_preview_panel.py +++ b/invesalius/gui/bitmap_preview_panel.py @@ -8,11 +8,11 @@ from vtk.util import numpy_support from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor from wx.lib.pubsub import pub as Publisher -import constants as const -import data.vtk_utils as vtku -from data import converters -from reader import bitmap_reader -import utils +import invesalius.constants as const +import invesalius.data.vtk_utils as vtku +import invesalius.data.converters as converters +import invesalius.reader.bitmap_reader as bitmap_reader +import invesalius.utils as utils NROWS = 3 NCOLS = 6 diff --git a/invesalius/gui/data_notebook.py b/invesalius/gui/data_notebook.py index 59f3d62..e0bab5b 100644 --- a/invesalius/gui/data_notebook.py +++ b/invesalius/gui/data_notebook.py @@ -20,6 +20,7 @@ #-------------------------------------------------------------------------- import sys import platform +import os try: import Image @@ -32,11 +33,11 @@ import wx.lib.flatnotebook as fnb import wx.lib.platebtn as pbtn from wx.lib.pubsub import pub as Publisher -import constants as const -import data.slice_ as slice_ -import gui.dialogs as dlg -import gui.widgets.listctrl as listmix -import utils as ul +import invesalius.constants as const +import invesalius.data.slice_ as slice_ +import invesalius.gui.dialogs as dlg +import invesalius.gui.widgets.listctrl as listmix +import invesalius.utils as ul BTN_NEW, BTN_REMOVE, BTN_DUPLICATE = [wx.NewId() for i in xrange(3)] @@ -148,11 +149,11 @@ class MeasureButtonControlPanel(wx.Panel): def __init_gui(self): # Bitmaps to be used in plate buttons - BMP_NEW = wx.Bitmap("../icons/data_new.png", + BMP_NEW = wx.Bitmap(os.path.join(const.ICON_DIR, "data_new.png"), wx.BITMAP_TYPE_PNG) - BMP_REMOVE = wx.Bitmap("../icons/data_remove.png", + BMP_REMOVE = wx.Bitmap(os.path.join(const.ICON_DIR, "data_remove.png"), wx.BITMAP_TYPE_PNG) - BMP_DUPLICATE = wx.Bitmap("../icons/data_duplicate.png", + BMP_DUPLICATE = wx.Bitmap(os.path.join(const.ICON_DIR, "data_duplicate.png"), wx.BITMAP_TYPE_PNG) # Plate buttons based on previous bitmaps @@ -261,11 +262,11 @@ class ButtonControlPanel(wx.Panel): def __init_gui(self): # Bitmaps to be used in plate buttons - BMP_NEW = wx.Bitmap("../icons/data_new.png", + BMP_NEW = wx.Bitmap(os.path.join(const.ICON_DIR, "data_new.png"), wx.BITMAP_TYPE_PNG) - BMP_REMOVE = wx.Bitmap("../icons/data_remove.png", + BMP_REMOVE = wx.Bitmap(os.path.join(const.ICON_DIR, "data_remove.png"), wx.BITMAP_TYPE_PNG) - BMP_DUPLICATE = wx.Bitmap("../icons/data_duplicate.png", + BMP_DUPLICATE = wx.Bitmap(os.path.join(const.ICON_DIR, "data_duplicate.png"), wx.BITMAP_TYPE_PNG) # Plate buttons based on previous bitmaps @@ -452,13 +453,13 @@ class MasksListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): def __init_image_list(self): self.imagelist = wx.ImageList(16, 16) - image = wx.Image("../icons/object_invisible.jpg") + image = wx.Image(os.path.join(const.ICON_DIR, "object_invisible.jpg")) bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) img_null = self.imagelist.Add(bitmap) - image = wx.Image("../icons/object_visible.jpg") + image = wx.Image(os.path.join(const.ICON_DIR, "object_visible.jpg")) bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) @@ -466,7 +467,7 @@ class MasksListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): self.SetImageList(self.imagelist,wx.IMAGE_LIST_SMALL) - self.image_gray = Image.open("../icons/object_colour.jpg") + self.image_gray = Image.open(os.path.join(const.ICON_DIR, "object_colour.jpg")) def OnEditLabel(self, evt): Publisher.sendMessage('Change mask name', @@ -586,11 +587,11 @@ class SurfaceButtonControlPanel(wx.Panel): def __init_gui(self): # Bitmaps to be used in plate buttons - BMP_NEW = wx.Bitmap("../icons/data_new.png", + BMP_NEW = wx.Bitmap(os.path.join(const.ICON_DIR, "data_new.png"), wx.BITMAP_TYPE_PNG) - BMP_REMOVE = wx.Bitmap("../icons/data_remove.png", + BMP_REMOVE = wx.Bitmap(os.path.join(const.ICON_DIR, "data_remove.png"), wx.BITMAP_TYPE_PNG) - BMP_DUPLICATE = wx.Bitmap("../icons/data_duplicate.png", + BMP_DUPLICATE = wx.Bitmap(os.path.join(const.ICON_DIR, "data_duplicate.png"), wx.BITMAP_TYPE_PNG) # Plate buttons based on previous bitmaps @@ -781,13 +782,13 @@ class SurfacesListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): def __init_image_list(self): self.imagelist = wx.ImageList(16, 16) - image = wx.Image("../icons/object_invisible.jpg") + image = wx.Image(os.path.join(const.ICON_DIR, "object_invisible.jpg")) bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) img_null = self.imagelist.Add(bitmap) - image = wx.Image("../icons//object_visible.jpg") + image = wx.Image(os.path.join(const.ICON_DIR, "object_visible.jpg")) bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) @@ -795,7 +796,7 @@ class SurfacesListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): self.SetImageList(self.imagelist,wx.IMAGE_LIST_SMALL) - self.image_gray = Image.open("../icons/object_colour.jpg") + self.image_gray = Image.open(os.path.join(const.ICON_DIR, "object_colour.jpg")) def OnEditLabel(self, evt): Publisher.sendMessage('Change surface name', (evt.GetIndex(), evt.GetLabel())) @@ -1045,13 +1046,13 @@ class MeasuresListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): def __init_image_list(self): self.imagelist = wx.ImageList(16, 16) - image = wx.Image("../icons/object_invisible.jpg") + image = wx.Image(os.path.join(const.ICON_DIR, "object_invisible.jpg")) bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) img_null = self.imagelist.Add(bitmap) - image = wx.Image("../icons/object_visible.jpg") + image = wx.Image(os.path.join(const.ICON_DIR, "object_visible.jpg")) bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) @@ -1059,7 +1060,7 @@ class MeasuresListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): self.SetImageList(self.imagelist,wx.IMAGE_LIST_SMALL) - self.image_gray = Image.open("../icons/object_colour.jpg") + self.image_gray = Image.open(os.path.join(const.ICON_DIR, "object_colour.jpg")) def OnEditLabel(self, evt): @@ -1240,19 +1241,19 @@ class AnnotationsListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): def __init_image_list(self): self.imagelist = wx.ImageList(16, 16) - image = wx.Image("../icons/object_visible.jpg") + image = wx.Image(os.path.join(const.ICON_DIR, "object_visible.jpg")) bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) img_check = self.imagelist.Add(bitmap) - image = wx.Image("../icons/object_invisible.jpg") + image = wx.Image(os.path.join(const.ICON_DIR, "object_invisible.jpg")) bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) img_null = self.imagelist.Add(bitmap) - image = wx.Image("../icons/object_colour.jpg") + image = wx.Image(os.path.join(const.ICON_DIR, "object_colour.jpg")) bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) diff --git a/invesalius/gui/default_tasks.py b/invesalius/gui/default_tasks.py index f575da6..86a22f2 100644 --- a/invesalius/gui/default_tasks.py +++ b/invesalius/gui/default_tasks.py @@ -21,15 +21,15 @@ import wx import wx.lib.foldpanelbar as fpb from wx.lib.pubsub import pub as Publisher -import constants as const -import data_notebook as nb -import session as ses -import task_exporter as exporter -import task_slice as slice_ -import task_importer as importer -import task_surface as surface -import task_tools as tools -import task_navigator as navigator +import invesalius.constants as const +import invesalius.gui.data_notebook as nb +import invesalius.session as ses +import invesalius.gui.task_exporter as exporter +import invesalius.gui.task_slice as slice_ +import invesalius.gui.task_importer as importer +import invesalius.gui.task_surface as surface +import invesalius.gui.task_tools as tools +import invesalius.gui.task_navigator as navigator FPB_DEFAULT_STYLE = 2621440 diff --git a/invesalius/gui/default_viewers.py b/invesalius/gui/default_viewers.py index 948cb75..a8b509e 100644 --- a/invesalius/gui/default_viewers.py +++ b/invesalius/gui/default_viewers.py @@ -17,21 +17,24 @@ # detalhes. #-------------------------------------------------------------------------- import sys +import os import wx import wx.lib.agw.fourwaysplitter as fws from wx.lib.pubsub import pub as Publisher -import data.viewer_slice as slice_viewer -import data.viewer_volume as volume_viewer -import project -import widgets.slice_menu as slice_menu_ +import invesalius.data.viewer_slice as slice_viewer +import invesalius.data.viewer_volume as volume_viewer +import invesalius.project as project +import invesalius.gui.widgets.slice_menu as slice_menu_ -from gui.widgets.clut_raycasting import CLUTRaycastingWidget, \ + +from invesalius.gui.widgets.clut_raycasting import CLUTRaycastingWidget, \ EVT_CLUT_POINT_RELEASE, EVT_CLUT_CURVE_SELECT, \ EVT_CLUT_CURVE_WL_CHANGE -from constants import ID_TO_BMP +from invesalius.constants import ID_TO_BMP +import invesalius.constants as const class Panel(wx.Panel): def __init__(self, parent): @@ -300,8 +303,8 @@ import wx.lib.platebtn as pbtn import wx.lib.buttons as btn import wx.lib.pubsub as ps -import constants as const -import widgets.colourselect as csel +import invesalius.constants as const +import invesalius.gui.widgets.colourselect as csel [BUTTON_RAYCASTING, BUTTON_VIEW, BUTTON_SLICE_PLANE, BUTTON_3D_STEREO] = [wx.NewId() for num in xrange(4)] RAYCASTING_TOOLS = wx.NewId() @@ -333,14 +336,14 @@ class VolumeToolPanel(wx.Panel): wx.Panel.__init__(self, parent) # VOLUME RAYCASTING BUTTON - BMP_RAYCASTING = wx.Bitmap("../icons/volume_raycasting.png", + BMP_RAYCASTING = wx.Bitmap(os.path.join(const.ICON_DIR, "volume_raycasting.png"), wx.BITMAP_TYPE_PNG) - BMP_SLICE_PLANE = wx.Bitmap("../icons/slice_plane.png", + BMP_SLICE_PLANE = wx.Bitmap(os.path.join(const.ICON_DIR, "slice_plane.png"), wx.BITMAP_TYPE_PNG) - BMP_3D_STEREO = wx.Bitmap("../icons/3D_glasses.png", + BMP_3D_STEREO = wx.Bitmap(os.path.join(const.ICON_DIR, "3D_glasses.png"), wx.BITMAP_TYPE_PNG) diff --git a/invesalius/gui/dialogs.py b/invesalius/gui/dialogs.py index 0be6b39..9dd8a90 100644 --- a/invesalius/gui/dialogs.py +++ b/invesalius/gui/dialogs.py @@ -29,13 +29,12 @@ from wx.lib.agw import floatspin from wx.lib.wordwrap import wordwrap from wx.lib.pubsub import pub as Publisher -import constants as const -import gui.widgets.gradient as grad -import project as proj -import session as ses -import utils - -from gui.widgets.clut_imagedata import CLUTImageDataWidget, EVT_CLUT_NODE_CHANGED +import invesalius.constants as const +import invesalius.gui.widgets.gradient as grad +import invesalius.session as ses +import invesalius.utils as utils +from invesalius.gui.widgets import clut_imagedata +from invesalius.gui.widgets.clut_imagedata import CLUTImageDataWidget, EVT_CLUT_NODE_CHANGED import numpy as np @@ -603,9 +602,9 @@ class NewMask(wx.Dialog): pos=wx.DefaultPosition, style=wx.DEFAULT_DIALOG_STYLE, useMetal=False): - import constants as const - import data.mask as mask - import project as prj + import invesalius.constants as const + import invesalius.data.mask as mask + import invesalius.project as prj # Instead of calling wx.Dialog.__init__ we precreate the dialog # so we can set an extra style that must be set before @@ -711,14 +710,14 @@ class NewMask(wx.Dialog): def OnComboThresh(self, evt): - import project as prj + import invesalius.project as prj proj = prj.Project() (thresh_min, thresh_max) = proj.threshold_modes[evt.GetString()] self.gradient.SetMinimun(thresh_min) self.gradient.SetMaximun(thresh_max) def OnSlideChanged(self, evt): - import project as prj + import invesalius.project as prj thresh_min = self.gradient.GetMinValue() thresh_max = self.gradient.GetMaxValue() thresh = (thresh_min, thresh_max) @@ -878,9 +877,9 @@ class NewSurfaceDialog(wx.Dialog): def __init__(self, parent=None, ID=-1, title="InVesalius 3", size=wx.DefaultSize, pos=wx.DefaultPosition, style=wx.DEFAULT_DIALOG_STYLE, useMetal=False): - import constants as const - import data.surface as surface - import project as prj + import invesalius.constants as const + import invesalius.data.surface as surface + import invesalius.project as prj # Instead of calling wx.Dialog.__init__ we precreate the dialog # so we can set an extra style that must be set before @@ -1002,7 +1001,9 @@ class NewSurfaceDialog(wx.Dialog): def ExportPicture(type_=""): - import constants as const + import invesalius.constants as const + import invesalius.project as proj + INDEX_TO_EXTENSION = {0: "bmp", 1: "jpg", 2: "png", 3: "ps", 4:"povray", 5:"tiff"} WILDCARD_SAVE_PICTURE = _("BMP image")+" (*.bmp)|*.bmp|"+\ _("JPG image")+" (*.jpg)|*.jpg|"+\ @@ -1143,6 +1144,7 @@ class SurfaceCreationDialog(wx.Dialog): sizer.Fit(self) def OnSetMask(self, evt): + import invesalius.project as proj mask = proj.Project().mask_dict[evt.mask_index] self.ca.mask_edited = mask.was_edited self.ca.ReloadMethodsOptions() @@ -1153,9 +1155,9 @@ class SurfaceCreationDialog(wx.Dialog): class SurfaceCreationOptionsPanel(wx.Panel): def __init__(self, parent, ID=-1): - import constants as const - import data.surface as surface - import project as prj + import invesalius.constants as const + import invesalius.data.surface as surface + import invesalius.project as prj wx.Panel.__init__(self, parent, ID) @@ -1565,7 +1567,7 @@ class MaskBooleanDialog(wx.Dialog): else: self.mask2.SetSelection(0) - icon_folder = '../icons/' + icon_folder = const.ICON_DIR op_choices = ((_(u"Union"), const.BOOLEAN_UNION, 'bool_union.png'), (_(u"Difference"), const.BOOLEAN_DIFF, 'bool_difference.png'), (_(u"Intersection"), const.BOOLEAN_AND, 'bool_intersection.png'), @@ -1711,7 +1713,7 @@ class ImportBitmapParameters(wx.Dialog): def _init_gui(self): - import project as prj + import invesalius.project as prj p = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN @@ -1915,7 +1917,7 @@ class PanelFFillThreshold(wx.Panel): self._init_gui() def _init_gui(self): - import project as prj + import invesalius.project as prj project = prj.Project() bound_min, bound_max = project.threshold_range @@ -2204,7 +2206,7 @@ class FFillSegmentationOptionsDialog(wx.Dialog): """ Create the widgets. """ - import project as prj + import invesalius.project as prj # Target if sys.platform == "win32": diff --git a/invesalius/gui/dicom_preview_panel.py b/invesalius/gui/dicom_preview_panel.py index 8d31e7c..ce12820 100644 --- a/invesalius/gui/dicom_preview_panel.py +++ b/invesalius/gui/dicom_preview_panel.py @@ -31,10 +31,10 @@ from vtk.util import numpy_support from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor from wx.lib.pubsub import pub as Publisher -import constants as const -from reader import dicom_reader -import data.vtk_utils as vtku -import utils +import invesalius.constants as const +import invesalius.reader.dicom_reader as dicom_reader +import invesalius.data.vtk_utils as vtku +import invesalius.utils as utils import vtkgdcm diff --git a/invesalius/gui/frame.py b/invesalius/gui/frame.py index 286b7b9..3afa1f5 100644 --- a/invesalius/gui/frame.py +++ b/invesalius/gui/frame.py @@ -31,18 +31,17 @@ import wx.lib.popupctl as pc from wx.lib.agw.aui.auibar import AuiToolBar, AUI_TB_PLAIN_BACKGROUND -import constants as const -import default_tasks as tasks -import default_viewers as viewers -import gui.dialogs as dlg -import import_panel as imp -import import_bitmap_panel as imp_bmp -import import_network_panel as imp_net -import project as prj -import session as ses -import utils -import preferences - +import invesalius.constants as const +import invesalius.gui.default_tasks as tasks +import invesalius.gui.default_viewers as viewers +import invesalius.gui.dialogs as dlg +import invesalius.gui.import_panel as imp +import invesalius.gui.import_bitmap_panel as imp_bmp +import invesalius.gui.import_network_panel as imp_net +import invesalius.project as prj +import invesalius.session as ses +import invesalius.utils as utils +import invesalius.gui.preferences as preferences # Layout tools' IDs - this is used only locally, therefore doesn't # need to be defined in constants.py VIEW_TOOLS = [ID_LAYOUT, ID_TEXT] =\ @@ -174,8 +173,7 @@ class Frame(wx.Frame): Hide().Layer(1).MaximizeButton(True). Name("Data").Position(1)) - # This is the DICOM import panel. When the two panels above - # are shown, this should be hiden + # This is the DICOM import panel. When the two panels above as dicom # are shown, this should be hiden caption = _("Preview medical data to be reconstructed") aui_manager.AddPane(imp.Panel(self), wx.aui.AuiPaneInfo(). Name("Import").CloseButton(False).Centre().Hide(). @@ -353,8 +351,7 @@ class Frame(wx.Frame): def _ShowImportPanel(self, evt_pubsub): """ - Show only DICOM import panel. - """ + Show only DICOM import panel. as dicom """ Publisher.sendMessage("Set layout button data only") aui_manager = self.aui_manager aui_manager.GetPane("Import").Show(1) @@ -535,8 +532,7 @@ class Frame(wx.Frame): def ShowImportDicomPanel(self): """ - Show import DICOM panel. - """ + Show import DICOM panel. as dicom """ Publisher.sendMessage('Show import directory dialog') def ShowRetrieveDicomPanel(self): @@ -1041,8 +1037,7 @@ class TaskBarIcon(wx.TaskBarIcon): class ProjectToolBar(AuiToolBar): """ - Toolbar related to general project operations, including: import, - open, save and saveas, among others. + Toolbar related to general invesalius.project operations, including: import, as project open, save and saveas, among others. """ def __init__(self, parent): style = AUI_TB_PLAIN_BACKGROUND diff --git a/invesalius/gui/import_bitmap_panel.py b/invesalius/gui/import_bitmap_panel.py index adfd733..2a7cd3b 100644 --- a/invesalius/gui/import_bitmap_panel.py +++ b/invesalius/gui/import_bitmap_panel.py @@ -21,12 +21,11 @@ import wx.gizmos as gizmos from wx.lib.pubsub import pub as Publisher import wx.lib.splitter as spl -import constants as const -import gui.dialogs as dlg -import bitmap_preview_panel as bpp -import reader.bitmap_reader as bpr -from dialogs import ImportBitmapParameters - +import invesalius.constants as const +import invesalius.gui.dialogs as dlg +import invesalius.gui.bitmap_preview_panel as bpp +import invesalius.reader.bitmap_reader as bpr +from invesalius.gui.dialogs import ImportBitmapParameters as dialogs myEVT_SELECT_SERIE = wx.NewEventType() EVT_SELECT_SERIE = wx.PyEventBinder(myEVT_SELECT_SERIE, 1) diff --git a/invesalius/gui/import_network_panel.py b/invesalius/gui/import_network_panel.py index 50e6f11..38086ff 100644 --- a/invesalius/gui/import_network_panel.py +++ b/invesalius/gui/import_network_panel.py @@ -22,11 +22,11 @@ import wx.gizmos as gizmos from wx.lib.pubsub import pub as Publisher import wx.lib.splitter as spl -import constants as const -import gui.dialogs as dlg -#import dicom_preview_panel as dpp -import reader.dicom_grouper as dcm -import net.dicom as dcm_net +import invesalius.constants as const +import invesalius.gui.dialogs as dlg +#import invesalius.gui.dicom_preview_panel as dpp +import invesalius.reader.dicom_grouper as dcm +import invesalius.net.dicom as dcm_net from wx.lib.mixins.listctrl import CheckListCtrlMixin #from dicionario import musicdata diff --git a/invesalius/gui/import_panel.py b/invesalius/gui/import_panel.py index 2ea7af2..2125f1a 100644 --- a/invesalius/gui/import_panel.py +++ b/invesalius/gui/import_panel.py @@ -21,10 +21,10 @@ import wx.gizmos as gizmos from wx.lib.pubsub import pub as Publisher import wx.lib.splitter as spl -import constants as const -import gui.dialogs as dlg -import dicom_preview_panel as dpp -import reader.dicom_grouper as dcm +import invesalius.constants as const +import invesalius.gui.dialogs as dlg +import invesalius.gui.dicom_preview_panel as dpp +import invesalius.reader.dicom_grouper as dcm myEVT_SELECT_SERIE = wx.NewEventType() EVT_SELECT_SERIE = wx.PyEventBinder(myEVT_SELECT_SERIE, 1) diff --git a/invesalius/gui/language_dialog.py b/invesalius/gui/language_dialog.py index d147e6c..9d9d153 100644 --- a/invesalius/gui/language_dialog.py +++ b/invesalius/gui/language_dialog.py @@ -18,12 +18,25 @@ #-------------------------------------------------------------------------- import os +import sys import wx import wx.combo -import i18n +import invesalius.i18n as i18n -ICON_DIR = os.path.abspath(os.path.join('..', 'icons')) +file_path = os.path.split(__file__)[0] + +if hasattr(sys,"frozen") and (sys.frozen == "windows_exe"\ + or sys.frozen == "console_exe"): + abs_file_path = os.path.abspath(file_path + os.sep + ".." +\ + os.sep + ".." + os.sep + ".." + os.sep + "..") + ICON_DIR = os.path.abspath(os.path.join(abs_file_path, 'icons')) +else: + ICON_DIR = os.path.abspath(os.path.join(file_path, '..', '..','icons')) + +# MAC App +if not os.path.exists(ICON_DIR): + ICON_DIR = os.path.abspath(os.path.join(file_path, '..', '..', '..', '..', '..', 'icons')) class ComboBoxLanguage: diff --git a/invesalius/gui/preferences.py b/invesalius/gui/preferences.py index 2ad6a80..4ea1696 100644 --- a/invesalius/gui/preferences.py +++ b/invesalius/gui/preferences.py @@ -1,9 +1,8 @@ import wx -import constants as const +import invesalius.constants as const from wx.lib.pubsub import pub as Publisher -import session as ses -from language_dialog import ComboBoxLanguage - +import invesalius.session as ses +from invesalius.gui.language_dialog import ComboBoxLanguage ID = wx.NewId() try: diff --git a/invesalius/gui/task_exporter.py b/invesalius/gui/task_exporter.py index ec3f5c5..5fa28cc 100644 --- a/invesalius/gui/task_exporter.py +++ b/invesalius/gui/task_exporter.py @@ -25,9 +25,9 @@ import wx.lib.hyperlink as hl import wx.lib.platebtn as pbtn from wx.lib.pubsub import pub as Publisher -import constants as const -import gui.dialogs as dlg -import project as proj +import invesalius.constants as const +import invesalius.gui.dialogs as dlg +import invesalius.project as proj BTN_MASK = wx.NewId() BTN_PICTURE = wx.NewId() @@ -164,22 +164,22 @@ class InnerTaskPanel(wx.Panel): # Image(s) for buttons if sys.platform == 'darwin': BMP_EXPORT_SURFACE = wx.Bitmap(\ - "../icons/surface_export_original.png", + os.path.join(const.ICON_DIR, "surface_export_original.png"), wx.BITMAP_TYPE_PNG).ConvertToImage()\ .Rescale(25, 25).ConvertToBitmap() BMP_TAKE_PICTURE = wx.Bitmap(\ - "../icons/tool_photo_original.png", + os.path.join(const.ICON_DIR, "tool_photo_original.png"), wx.BITMAP_TYPE_PNG).ConvertToImage()\ .Rescale(25, 25).ConvertToBitmap() #BMP_EXPORT_MASK = wx.Bitmap("../icons/mask.png", # wx.BITMAP_TYPE_PNG) else: - BMP_EXPORT_SURFACE = wx.Bitmap("../icons/surface_export.png", + BMP_EXPORT_SURFACE = wx.Bitmap(os.path.join(const.ICON_DIR, "surface_export.png"), wx.BITMAP_TYPE_PNG).ConvertToImage()\ .Rescale(25, 25).ConvertToBitmap() - BMP_TAKE_PICTURE = wx.Bitmap("../icons/tool_photo.png", + BMP_TAKE_PICTURE = wx.Bitmap(os.path.join(const.ICON_DIR, "tool_photo.png"), wx.BITMAP_TYPE_PNG).ConvertToImage()\ .Rescale(25, 25).ConvertToBitmap() diff --git a/invesalius/gui/task_importer.py b/invesalius/gui/task_importer.py index 80293bb..7fddd26 100644 --- a/invesalius/gui/task_importer.py +++ b/invesalius/gui/task_importer.py @@ -24,8 +24,8 @@ import wx.lib.hyperlink as hl import wx.lib.platebtn as pbtn from wx.lib.pubsub import pub as Publisher -import constants as const -import gui.dialogs as dlg +import invesalius.constants as const +import invesalius.gui.dialogs as dlg BTN_IMPORT_LOCAL = wx.NewId() BTN_IMPORT_PACS = wx.NewId() @@ -96,9 +96,9 @@ class InnerTaskPanel(wx.Panel): link_open_proj.Bind(hl.EVT_HYPERLINK_LEFT, self.OnLinkOpenProject) # Image(s) for buttons - BMP_IMPORT = wx.Bitmap("../icons/file_import.png", wx.BITMAP_TYPE_PNG) - BMP_NET = wx.Bitmap("../icons/file_from_internet.png", wx.BITMAP_TYPE_PNG) - BMP_OPEN_PROJECT = wx.Bitmap("../icons/file_open.png", wx.BITMAP_TYPE_PNG) + BMP_IMPORT = wx.Bitmap(os.path.join(const.ICON_DIR, "file_import.png"), wx.BITMAP_TYPE_PNG) + BMP_NET = wx.Bitmap(os.path.join(const.ICON_DIR, "file_from_internet.png"), wx.BITMAP_TYPE_PNG) + BMP_OPEN_PROJECT = wx.Bitmap(os.path.join(const.ICON_DIR, "file_open.png"), wx.BITMAP_TYPE_PNG) bmp_list = [BMP_IMPORT, BMP_NET, BMP_OPEN_PROJECT] #for bmp in bmp_list: @@ -159,7 +159,7 @@ class InnerTaskPanel(wx.Panel): # self.LoadProject(filename, path) def TestLoadProjects2(self): - import session as ses + import invesalius.session as ses session = ses.Session() projects = session.recent_projects for tuple in projects: @@ -175,7 +175,7 @@ class InnerTaskPanel(wx.Panel): def LoadProject(self, proj_name="Unnamed", proj_dir=""): """ - Load into user interface name of project into import task panel. + Load into user interface name of invesalius.project into import task panel. Can be called 3 times in sequence. Call UnloadProjects to empty it. """ diff --git a/invesalius/gui/task_navigator.py b/invesalius/gui/task_navigator.py index da1bda9..95e150c 100644 --- a/invesalius/gui/task_navigator.py +++ b/invesalius/gui/task_navigator.py @@ -27,10 +27,9 @@ import wx.lib.masked.numctrl import wx.lib.platebtn as pbtn from wx.lib.pubsub import pub as Publisher -import data.bases as db -import data.co_registration as dcr -import project - +import invesalius.data.bases as db +import invesalius.data.co_registration as dcr +import invesalius.project as project IR1 = wx.NewId() IR2 = wx.NewId() IR3 = wx.NewId() diff --git a/invesalius/gui/task_slice.py b/invesalius/gui/task_slice.py index 953b743..03d5bac 100644 --- a/invesalius/gui/task_slice.py +++ b/invesalius/gui/task_slice.py @@ -18,22 +18,23 @@ # detalhes. #-------------------------------------------------------------------------- import sys +import os import wx import wx.lib.hyperlink as hl import wx.lib.platebtn as pbtn from wx.lib.pubsub import pub as Publisher -import data.mask as mask -import data.slice_ as slice_ -import constants as const -import gui.dialogs as dlg -import gui.widgets.gradient as grad -import gui.widgets.foldpanelbar as fpb -import widgets.colourselect as csel +import invesalius.data.mask as mask +import invesalius.data.slice_ as slice_ +import invesalius.constants as const +import invesalius.gui.dialogs as dlg +import invesalius.gui.widgets.gradient as grad +import invesalius.gui.widgets.foldpanelbar as fpb +import invesalius.gui.widgets.colourselect as csel -from project import Project -import session as ses +from invesalius.project import Project +import invesalius.session as ses BTN_NEW = wx.NewId() @@ -70,7 +71,7 @@ class InnerTaskPanel(wx.Panel): self.SetAutoLayout(1) # Image(s) for buttons - BMP_ADD = wx.Bitmap("../icons/object_add.png", wx.BITMAP_TYPE_PNG) + BMP_ADD = wx.Bitmap(os.path.join(const.ICON_DIR, "object_add.png"), wx.BITMAP_TYPE_PNG) #BMP_ADD.SetWidth(25) #BMP_ADD.SetHeight(25) @@ -524,7 +525,7 @@ class MaskProperties(wx.Panel): self.bind_evt_gradient = False self.gradient.SetMinValue(thresh_min) self.gradient.SetMaxValue(thresh_max) - print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", thresh_min, thresh_max + self.bind_evt_gradient = True thresh = (thresh_min, thresh_max) if thresh in Project().threshold_modes.values(): @@ -651,11 +652,11 @@ class EditionTools(wx.Panel): ## LINE 2 menu = wx.Menu() - CIRCLE_BMP = wx.Bitmap("../icons/brush_circle.jpg", wx.BITMAP_TYPE_JPEG) + CIRCLE_BMP = wx.Bitmap(os.path.join(const.ICON_DIR, "brush_circle.jpg"), wx.BITMAP_TYPE_JPEG) item = wx.MenuItem(menu, MENU_BRUSH_CIRCLE, _("Circle")) item.SetBitmap(CIRCLE_BMP) - SQUARE_BMP = wx.Bitmap("../icons/brush_square.jpg", wx.BITMAP_TYPE_JPEG) + SQUARE_BMP = wx.Bitmap(os.path.join(const.ICON_DIR, "brush_square.jpg"), wx.BITMAP_TYPE_JPEG) item2 = wx.MenuItem(menu, MENU_BRUSH_SQUARE, _("Square")) item2.SetBitmap(SQUARE_BMP) @@ -771,8 +772,8 @@ class EditionTools(wx.Panel): (thresh_min, thresh_max)) def OnMenu(self, evt): - SQUARE_BMP = wx.Bitmap("../icons/brush_square.jpg", wx.BITMAP_TYPE_JPEG) - CIRCLE_BMP = wx.Bitmap("../icons/brush_circle.jpg", wx.BITMAP_TYPE_JPEG) + SQUARE_BMP = wx.Bitmap(os.path.join(const.ICON_DIR, "brush_square.jpg"), wx.BITMAP_TYPE_JPEG) + CIRCLE_BMP = wx.Bitmap(os.path.join(const.ICON_DIR, "brush_circle.jpg"), wx.BITMAP_TYPE_JPEG) brush = {MENU_BRUSH_CIRCLE: const.BRUSH_CIRCLE, MENU_BRUSH_SQUARE: const.BRUSH_SQUARE} @@ -815,11 +816,11 @@ class WatershedTool(EditionTools): ## LINE 2 menu = wx.Menu() - CIRCLE_BMP = wx.Bitmap("../icons/brush_circle.jpg", wx.BITMAP_TYPE_JPEG) + CIRCLE_BMP = wx.Bitmap(os.path.join(const.ICON_DIR, "brush_circle.jpg"), wx.BITMAP_TYPE_JPEG) item = wx.MenuItem(menu, MENU_BRUSH_CIRCLE, _("Circle")) item.SetBitmap(CIRCLE_BMP) - SQUARE_BMP = wx.Bitmap("../icons/brush_square.jpg", wx.BITMAP_TYPE_JPEG) + SQUARE_BMP = wx.Bitmap(os.path.join(const.ICON_DIR, "brush_square.jpg"), wx.BITMAP_TYPE_JPEG) item2 = wx.MenuItem(menu, MENU_BRUSH_SQUARE, _("Square")) item2.SetBitmap(SQUARE_BMP) @@ -874,7 +875,7 @@ class WatershedTool(EditionTools): self.ww_wl_cbox = ww_wl_cbox # Line 6 - bmp = wx.Bitmap("../icons/configuration.png", wx.BITMAP_TYPE_PNG) + bmp = wx.Bitmap(os.path.join(const.ICON_DIR, "configuration.png"), wx.BITMAP_TYPE_PNG) self.btn_wconfig = wx.BitmapButton(self, -1, bitmap=bmp, size=(bmp.GetWidth()+10, bmp.GetHeight()+10)) self.btn_exp_watershed = wx.Button(self, -1, _('Expand watershed to 3D')) @@ -942,8 +943,8 @@ class WatershedTool(EditionTools): self.gradient_thresh.SetMaxValue(thresh_max) def OnMenu(self, evt): - SQUARE_BMP = wx.Bitmap("../icons/brush_square.jpg", wx.BITMAP_TYPE_JPEG) - CIRCLE_BMP = wx.Bitmap("../icons/brush_circle.jpg", wx.BITMAP_TYPE_JPEG) + SQUARE_BMP = wx.Bitmap(os.path.join(const.ICON_DIR, "brush_square.jpg"), wx.BITMAP_TYPE_JPEG) + CIRCLE_BMP = wx.Bitmap(os.path.join(const.ICON_DIR, "brush_circle.jpg"), wx.BITMAP_TYPE_JPEG) brush = {MENU_BRUSH_CIRCLE: const.BRUSH_CIRCLE, MENU_BRUSH_SQUARE: const.BRUSH_SQUARE} @@ -978,7 +979,7 @@ class WatershedTool(EditionTools): Publisher.sendMessage('Set use ww wl', value) def OnConfig(self, evt): - from data.styles import WatershedConfig + from invesalius.data.styles import WatershedConfig as styles config = WatershedConfig() dlg.WatershedOptionsDialog(config).Show() diff --git a/invesalius/gui/task_surface.py b/invesalius/gui/task_surface.py index a830436..9ae7f89 100644 --- a/invesalius/gui/task_surface.py +++ b/invesalius/gui/task_surface.py @@ -17,19 +17,20 @@ # detalhes. #-------------------------------------------------------------------------- import sys +import os import wx import wx.lib.hyperlink as hl from wx.lib.pubsub import pub as Publisher -import constants as const -import data.slice_ as slice_ -import gui.dialogs as dlg -import gui.widgets.foldpanelbar as fpb -import gui.widgets.colourselect as csel -import gui.widgets.platebtn as pbtn -import project as prj -import utils as utl +import invesalius.constants as const +import invesalius.data.slice_ as slice_ +import invesalius.gui.dialogs as dlg +import invesalius.gui.widgets.foldpanelbar as fpb +import invesalius.gui.widgets.colourselect as csel +import invesalius.gui.widgets.platebtn as pbtn +import invesalius.project as prj +import invesalius.utils as utl #INTERPOLATION_MODE_LIST = ["Cubic", "Linear", "NearestNeighbor"] MIN_TRANSPARENCY = 0 @@ -73,7 +74,7 @@ class InnerTaskPanel(wx.Panel): self.SetAutoLayout(1) - BMP_ADD = wx.Bitmap("../icons/object_add.png", wx.BITMAP_TYPE_PNG) + BMP_ADD = wx.Bitmap(os.path.join(const.ICON_DIR, "object_add.png"), wx.BITMAP_TYPE_PNG) #BMP_ADD.SetWidth(25) #BMP_ADD.SetHeight(25) @@ -134,7 +135,7 @@ class InnerTaskPanel(wx.Panel): evt.Skip() def OnLinkNewSurface(self, evt=None): - #import gui.dialogs as dlg + #import invesalius.gui.dialogs as dlg sl = slice_.Slice() dialog = dlg.SurfaceCreationDialog(None, -1, _('New surface'), @@ -299,17 +300,17 @@ class SurfaceTools(wx.Panel): link_seeds.Bind(hl.EVT_HYPERLINK_LEFT, self.OnLinkSeed) # Image(s) for buttons - img_largest = wx.Image("../icons/connectivity_largest.png", + img_largest = wx.Image(os.path.join(const.ICON_DIR, "connectivity_largest.png"), wx.BITMAP_TYPE_PNG) img_largest.Rescale(25, 25) bmp_largest = img_largest.ConvertToBitmap() - img_split_all = wx.Image("../icons/connectivity_split_all.png", + img_split_all = wx.Image(os.path.join(const.ICON_DIR, "connectivity_split_all.png"), wx.BITMAP_TYPE_PNG) img_split_all.Rescale(25, 25) bmp_split_all = img_split_all.ConvertToBitmap() - img_seeds = wx.Image("../icons/connectivity_manual.png", + img_seeds = wx.Image(os.path.join(const.ICON_DIR, "connectivity_manual.png"), wx.BITMAP_TYPE_PNG) img_seeds.Rescale(25, 25) bmp_seeds = img_seeds.ConvertToBitmap() @@ -556,7 +557,7 @@ class SurfaceProperties(wx.Panel): class QualityAdjustment(wx.Panel): def __init__(self, parent): - import constants as const + import invesalius.constants as const wx.Panel.__init__(self, parent) default_colour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_MENUBAR) self.SetBackgroundColour(default_colour) diff --git a/invesalius/gui/task_tools.py b/invesalius/gui/task_tools.py index 38ce05c..d3d4bb4 100644 --- a/invesalius/gui/task_tools.py +++ b/invesalius/gui/task_tools.py @@ -18,12 +18,14 @@ #-------------------------------------------------------------------------- import wx +import os import wx.lib.embeddedimage as emb import wx.lib.hyperlink as hl import wx.lib.platebtn as pbtn from wx.lib.pubsub import pub as Publisher -import constants +import invesalius.constants as constants +import invesalius.constants as const ID_BTN_MEASURE_LINEAR = wx.NewId() ID_BTN_MEASURE_ANGULAR = wx.NewId() @@ -71,9 +73,9 @@ class InnerTaskPanel(wx.Panel): txt_annotation.Bind(hl.EVT_HYPERLINK_LEFT, self.OnTextAnnotation) # Image(s) for buttons - BMP_ANNOTATE = wx.Bitmap("../icons/annotation.png", wx.BITMAP_TYPE_PNG) - BMP_ANGLE = wx.Bitmap("../icons/measure_angle.jpg", wx.BITMAP_TYPE_JPEG) - BMP_DISTANCE = wx.Bitmap("../icons/measure_line.png", wx.BITMAP_TYPE_PNG) + BMP_ANNOTATE = wx.Bitmap(os.path.join(const.ICON_DIR, "annotation.png"), wx.BITMAP_TYPE_PNG) + BMP_ANGLE = wx.Bitmap(os.path.join(const.ICON_DIR, "measure_angle.jpg"), wx.BITMAP_TYPE_JPEG) + BMP_DISTANCE = wx.Bitmap(os.path.join(const.ICON_DIR, "measure_line.png"), wx.BITMAP_TYPE_PNG) BMP_ANNOTATE.SetWidth(25) BMP_ANNOTATE.SetHeight(25) BMP_ANGLE.SetWidth(25) diff --git a/invesalius/gui/widgets/clut_raycasting.py b/invesalius/gui/widgets/clut_raycasting.py index 2a29a9f..158cbdc 100644 --- a/invesalius/gui/widgets/clut_raycasting.py +++ b/invesalius/gui/widgets/clut_raycasting.py @@ -26,8 +26,8 @@ import numpy import wx from wx.lib.pubsub import pub as Publisher -import gui.dialogs as dialog -import constants as const +import invesalius.gui.dialogs as dialog +import invesalius.constants as const FONT_COLOUR = (1, 1, 1) LINE_COLOUR = (128, 128, 128) diff --git a/invesalius/gui/widgets/slice_menu.py b/invesalius/gui/widgets/slice_menu.py index 8dccc38..61078dc 100644 --- a/invesalius/gui/widgets/slice_menu.py +++ b/invesalius/gui/widgets/slice_menu.py @@ -29,12 +29,10 @@ except(ImportError): import wx from wx.lib.pubsub import pub as Publisher -import constants as const -import data.slice_ as sl -import presets - -from gui.dialogs import ClutImagedataDialog - +import invesalius.constants as const +import invesalius.data.slice_ as sl +import invesalius.presets as presets +from invesalius.gui.dialogs import ClutImagedataDialog as dialogs PROJECTIONS_ID = OrderedDict(((_('Normal'), const.PROJECTION_NORMAL), (_('MaxIP'), const.PROJECTION_MaxIP), (_('MinIP'), const.PROJECTION_MinIP), diff --git a/invesalius/i18n.py b/invesalius/i18n.py index 8a5edf0..44ba76b 100644 --- a/invesalius/i18n.py +++ b/invesalius/i18n.py @@ -26,7 +26,7 @@ import gettext import os import sys -import utils as utl +import invesalius.utils as utl def GetLocales(): """Return a dictionary which defines supported languages""" @@ -58,8 +58,23 @@ def GetLocaleOS(): return locale.getdefaultlocale()[0] -def InstallLanguage(language): - language_dir = os.path.abspath(os.path.join('..','locale')) +def InstallLanguage(language): + file_path = os.path.split(__file__)[0] + + if hasattr(sys,"frozen") and (sys.frozen == "windows_exe"\ + or sys.frozen == "console_exe"): + + abs_file_path = os.path.abspath(file_path + os.sep + ".." + os.sep + ".." + os.sep + "..") + language_dir = os.path.join(abs_file_path, 'locale') + else: + abs_file_path = os.path.abspath(file_path + os.sep + "..") + language_dir = os.path.join(abs_file_path, 'locale') + + # MAC App + if not os.path.exists(language_dir): + abs_file_path = os.path.abspath(os.path.join(file_path, '..', '..', '..', '..')) + language_dir = os.path.join(abs_file_path, 'locale') + lang = gettext.translation('invesalius', language_dir,\ languages=[language], codeset='utf8') # Using unicode diff --git a/invesalius/invesalius.py b/invesalius/invesalius.py deleted file mode 100755 index 7d9acdd..0000000 --- a/invesalius/invesalius.py +++ /dev/null @@ -1,320 +0,0 @@ -#!/usr/bin/python -#-------------------------------------------------------------------------- -# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas -# Copyright: (C) 2001 Centro de Pesquisas Renato Archer -# Homepage: http://www.softwarepublico.gov.br -# Contact: invesalius@cti.gov.br -# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) -#-------------------------------------------------------------------------- -# Este programa e software livre; voce pode redistribui-lo e/ou -# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme -# publicada pela Free Software Foundation; de acordo com a versao 2 -# da Licenca. -# -# Este programa eh distribuido na expectativa de ser util, mas SEM -# QUALQUER GARANTIA; sem mesmo a garantia implicita de -# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM -# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais -# detalhes. -#------------------------------------------------------------------------- - - -import multiprocessing -import optparse as op -import os -import sys -import shutil - -if sys.platform == 'win32': - import _winreg -else: - if sys.platform != 'darwin': - import wxversion - #wxversion.ensureMinimal('2.8-unicode', optionsRequired=True) - #wxversion.select('2.8-unicode', optionsRequired=True) - wxversion.ensureMinimal('3.0') - -import wx -#from wx.lib.pubsub import setupv1 #new wx -from wx.lib.pubsub import setuparg1# as psv1 -#from wx.lib.pubsub import Publisher -#import wx.lib.pubsub as ps -from wx.lib.pubsub import pub as Publisher - -#import wx.lib.agw.advancedsplash as agw -#if sys.platform == 'linux2': -# _SplashScreen = agw.AdvancedSplash -#else: -# if sys.platform != 'darwin': -# _SplashScreen = wx.SplashScreen - - -import gui.language_dialog as lang_dlg -import i18n -import session as ses -import utils - -# ------------------------------------------------------------------ - - -class InVesalius(wx.App): - """ - InVesalius wxPython application class. - """ - def OnInit(self): - """ - Initialize splash screen and main frame. - """ - self.SetAppName("InVesalius 3") - self.splash = SplashScreen() - self.splash.Show() - wx.CallLater(1000,self.Startup2) - - return True - - def MacOpenFile(self, filename): - """ - Open drag & drop files under darwin - """ - path = os.path.abspath(filename) - Publisher.sendMessage('Open project', path) - - def Startup2(self): - self.control = self.splash.control - self.frame = self.splash.main - self.SetTopWindow(self.frame) - self.frame.Show() - self.frame.Raise() - -# ------------------------------------------------------------------ - -class SplashScreen(wx.SplashScreen): - """ - Splash screen to be shown in InVesalius initialization. - """ - def __init__(self): - # Splash screen image will depend on currently language - lang = False - - # Language information is available in session configuration - # file. First we need to check if this file exist, if now, it - # should be created - create_session = False - session = ses.Session() - if not (session.ReadSession()): - create_session = True - - install_lang = 0 - # Check if there is a language set (if session file exists - if session.ReadLanguage(): - lang = session.GetLanguage() - if (lang != "False"): - _ = i18n.InstallLanguage(lang) - install_lang = 1 - else: - install_lang = 0 - else: - install_lang = 0 - - # If no language is set into session file, show dialog so - # user can select language - if install_lang == 0: - dialog = lang_dlg.LanguageDialog() - - # FIXME: This works ok in linux2, darwin and win32, - # except on win64, due to wxWidgets bug - try: - ok = (dialog.ShowModal() == wx.ID_OK) - except wx._core.PyAssertionError: - ok = True - finally: - if ok: - lang = dialog.GetSelectedLanguage() - session.SetLanguage(lang) - _ = i18n.InstallLanguage(lang) - else: - homedir = self.homedir = os.path.expanduser('~') - invdir = os.path.join(homedir, ".invesalius") - shutil.rmtree(invdir) - sys.exit() - - # Session file should be created... So we set the recent - # choosen language - if (create_session): - session.CreateItens() - session.SetLanguage(lang) - session.WriteSessionFile() - - session.SaveConfigFileBackup() - - - # Only after language was defined, splash screen will be - # shown - if lang: - # For pt_BR, splash_pt.png should be used - if (lang.startswith('pt')): - icon_file = "splash_pt.png" - else: - icon_file = "splash_" + lang + ".png" - - path = os.path.join("..","icons", icon_file) - - if not os.path.exists(path): - path = os.path.join("..", "icons", "splash_en.png") - - bmp = wx.Image(path).ConvertToBitmap() - - style = wx.SPLASH_TIMEOUT | wx.SPLASH_CENTRE_ON_SCREEN - wx.SplashScreen.__init__(self, - bitmap=bmp, - splashStyle=style, - milliseconds=1500, - id=-1, - parent=None) - self.Bind(wx.EVT_CLOSE, self.OnClose) - wx.Yield() - wx.CallLater(200,self.Startup) - - def Startup(self): - # Importing takes sometime, therefore it will be done - # while splash is being shown - from gui.frame import Frame - from control import Controller - from project import Project - - self.main = Frame(None) - self.control = Controller(self.main) - - self.fc = wx.FutureCall(1, self.ShowMain) - wx.FutureCall(1, parse_comand_line) - - # Check for updates - from threading import Thread - p = Thread(target=utils.UpdateCheck, args=()) - p.start() - - def OnClose(self, evt): - # Make sure the default handler runs too so this window gets - # destroyed - evt.Skip() - self.Hide() - - # If the timer is still running then go ahead and show the - # main frame now - if self.fc.IsRunning(): - self.fc.Stop() - self.ShowMain() - - def ShowMain(self): - # Show main frame - self.main.Show() - - if self.fc.IsRunning(): - self.Raise() - -# ------------------------------------------------------------------ - - -def parse_comand_line(): - """ - Handle command line arguments. - """ - session = ses.Session() - - # Parse command line arguments - parser = op.OptionParser() - - # -d or --debug: print all pubsub messagessent - parser.add_option("-d", "--debug", - action="store_true", - dest="debug") - - # -i or --import: import DICOM directory - # chooses largest series - parser.add_option("-i", "--import", - action="store", - dest="dicom_dir") - options, args = parser.parse_args() - - # If debug argument... - if options.debug: - Publisher.subscribe(print_events, Publisher.ALL_TOPICS) - session.debug = 1 - - # If import DICOM argument... - if options.dicom_dir: - import_dir = options.dicom_dir - Publisher.sendMessage('Import directory', import_dir) - return True - - # Check if there is a file path somewhere in what the user wrote - # In case there is, try opening as it was a inv3 - else: - i = len(args) - while i: - i -= 1 - file = args[i] - if os.path.isfile(file): - path = os.path.abspath(file) - Publisher.sendMessage('Open project', path) - i = 0 - return True - return False - - -def print_events(data): - """ - Print pubsub messages - """ - utils.debug(data.topic) - -def main(): - """ - Initialize InVesalius GUI - """ - application = InVesalius(0) - application.MainLoop() - -if __name__ == '__main__': - # Needed in win 32 exe - if hasattr(sys,"frozen") and (sys.frozen == "windows_exe"\ - or sys.frozen == "console_exe"): - multiprocessing.freeze_support() - - #Click in the .inv3 file support - root = _winreg.HKEY_CLASSES_ROOT - key = "InVesalius 3.0\InstallationDir" - hKey = _winreg.OpenKey (root, key, 0, _winreg.KEY_READ) - value, type_ = _winreg.QueryValueEx (hKey, "") - path = os.path.join(value,'dist') - - os.chdir(path) - - # Create raycasting presets' folder, if it doens't exist - dirpath = os.path.join(os.path.expanduser('~'), - ".invesalius", - "presets") - if not os.path.isdir(dirpath): - os.makedirs(dirpath) - - # Create logs' folder, if it doesn't exist - dirpath = os.path.join(os.path.expanduser('~'), - ".invesalius", - "logs") - if not os.path.isdir(dirpath): - os.makedirs(dirpath) - - if hasattr(sys,"frozen") and sys.frozen == "windows_exe": - # Set system standard error output to file - path = os.path.join(dirpath, "stderr.log") - sys.stderr = open(path, "w") - - # Add current directory to PYTHONPATH, so other classes can - # import modules as they were on root invesalius folder - sys.path.insert(0, '..') - sys.path.append(".") - - - # Init application - main() - diff --git a/invesalius/net/dicom.py b/invesalius/net/dicom.py index cc0e397..d69b9f2 100644 --- a/invesalius/net/dicom.py +++ b/invesalius/net/dicom.py @@ -1,6 +1,5 @@ import gdcm -import utils - +import invesalius.utils as utils class DicomNet: @@ -110,7 +109,6 @@ class DicomNet: acquisition_date = utils.format_date(self.GetValueFromDICOM(rt, (0x0008,0x0022))) teste = self.GetValueFromDICOM(rt, (0x0020,0x000d)) - print ">>>>>>>>>>>>>>>>>>>>", teste patients[patient_id][serie_id] = {'name':name, 'age':age, 'gender':gender,\ 'study_description':study_description,\ @@ -146,11 +144,6 @@ class DicomNet: patient_id = str(values[0]) serie_id = str(values[1]) - print "(0x0010, 0x0020)",patient_id - - print "(0x0020, 0x000e)",serie_id - print "\n\n" - de_patient.SetByteValue(patient_id, gdcm.VL(len(patient_id))) de_serie.SetByteValue(serie_id, gdcm.VL(len(serie_id))) diff --git a/invesalius/presets.py b/invesalius/presets.py index 0a23ef0..850e5bc 100644 --- a/invesalius/presets.py +++ b/invesalius/presets.py @@ -20,12 +20,11 @@ import glob import os import plistlib -import constants as const +import invesalius.constants as const from wx.lib.pubsub import pub as Publisher -from utils import TwoWaysDictionary - +from invesalius.utils import TwoWaysDictionary class Presets(): def __init__(self): diff --git a/invesalius/project.py b/invesalius/project.py index 0969fb8..7949dde 100644 --- a/invesalius/project.py +++ b/invesalius/project.py @@ -29,13 +29,11 @@ import wx from wx.lib.pubsub import pub as Publisher import vtk -import constants as const -import data.mask as msk -import data.polydata_utils as pu -import data.surface as srf -from presets import Presets -from utils import Singleton, debug -import version +import invesalius.constants as const +import invesalius.data.polydata_utils as pu +from invesalius.presets import Presets +from invesalius.utils import Singleton, debug +import invesalius.version as version class Project(object): # Only one project will be initialized per time. Therefore, we use @@ -264,12 +262,13 @@ class Project(object): for f in filelist: if filelist[f].endswith('.plist'): - print f os.remove(f) def OpenPlistProject(self, filename): - import data.measures as ms - + import invesalius.data.measures as ms + import invesalius.data.mask as msk + import invesalius.data.surface as srf + if not const.VTK_WARNING: log_path = os.path.join(const.LOG_FOLDER, 'vtkoutput.txt') fow = vtk.vtkFileOutputWindow() @@ -358,7 +357,6 @@ def Extract(filename, folder): del fsrc del fdst tar.close() - print filelist return filelist diff --git a/invesalius/reader/bitmap_reader.py b/invesalius/reader/bitmap_reader.py index 742d2d6..af30557 100644 --- a/invesalius/reader/bitmap_reader.py +++ b/invesalius/reader/bitmap_reader.py @@ -23,7 +23,7 @@ import tempfile import sys import vtk import re -import constants as const +import invesalius.constants as const import wx from wx.lib.pubsub import pub as Publisher @@ -34,9 +34,8 @@ from scipy import misc import numpy import imghdr -import utils -from data import converters - +import invesalius.utils as utils +import invesalius.data.converters as converters #flag to control vtk error in read files no_error = True vtk_error = False diff --git a/invesalius/reader/dicom.py b/invesalius/reader/dicom.py index 84be16d..bd5ad43 100644 --- a/invesalius/reader/dicom.py +++ b/invesalius/reader/dicom.py @@ -21,8 +21,8 @@ import time #import gdcm #import vtkgdcm import sys -import utils -import constants as const +import invesalius.utils as utils +import invesalius.constants as const # In DICOM file format, if multiple values are present for the # "Window Center" (Level) and "Window Width", both attributes # shall have the same number of values and shall be considered as diff --git a/invesalius/reader/dicom_grouper.py b/invesalius/reader/dicom_grouper.py index 89dda45..b4f56b7 100644 --- a/invesalius/reader/dicom_grouper.py +++ b/invesalius/reader/dicom_grouper.py @@ -53,8 +53,7 @@ import gdcm -import utils - +import invesalius.utils as utils ORIENT_MAP = {"SAGITTAL":0, "CORONAL":1, "AXIAL":2, "OBLIQUE":2} diff --git a/invesalius/reader/dicom_reader.py b/invesalius/reader/dicom_reader.py index c006d0f..82f9ba3 100644 --- a/invesalius/reader/dicom_reader.py +++ b/invesalius/reader/dicom_reader.py @@ -29,14 +29,12 @@ import vtkgdcm import gdcm from wx.lib.pubsub import pub as Publisher -import constants as const -import dicom -import dicom_grouper -import session - +import invesalius.constants as const +import invesalius.reader.dicom as dicom +import invesalius.reader.dicom_grouper as dicom_grouper +import invesalius.session as session import glob -import utils - +import invesalius.utils as utils import plistlib @@ -71,7 +69,7 @@ def SortFiles(filelist, dicom): # Sort slices # FIXME: Coronal Crash. necessary verify if (dicom.image.orientation_label <> "CORONAL"): - #Organize reversed image + ##Organize reversed image sorter = gdcm.IPPSorter() sorter.SetComputeZSpacing(True) sorter.SetZSpacingTolerance(1e-10) diff --git a/invesalius/session.py b/invesalius/session.py index 6f540f9..974785a 100644 --- a/invesalius/session.py +++ b/invesalius/session.py @@ -27,7 +27,7 @@ import time #import wx.lib.pubsub as ps from wx.lib.pubsub import pub as Publisher -from utils import Singleton, debug +from invesalius.utils import Singleton, debug from random import randint class Session(object): @@ -42,7 +42,7 @@ class Session(object): self.project_status = 3 def CreateItens(self): - import constants as const + import invesalius.constants as const self.project_path = () self.debug = False self.project_status = const.PROJ_CLOSE @@ -75,7 +75,7 @@ class Session(object): self.WriteSessionFile() def IsOpen(self): - import constants as const + import invesalius.constants as const return self.project_status != const.PROJ_CLOSE def SaveConfigFileBackup(self): @@ -98,7 +98,7 @@ class Session(object): return False def CloseProject(self): - import constants as const + import invesalius.constants as const debug("Session.CloseProject") self.project_path = () self.project_status = const.PROJ_CLOSE @@ -107,7 +107,7 @@ class Session(object): self.WriteSessionFile() def SaveProject(self, path=()): - import constants as const + import invesalius.constants as const debug("Session.SaveProject") self.project_status = const.PROJ_OPEN if path: @@ -118,12 +118,12 @@ class Session(object): self.WriteSessionFile() def ChangeProject(self): - import constants as const + import invesalius.constants as const debug("Session.ChangeProject") self.project_status = const.PROJ_CHANGE def CreateProject(self, filename): - import constants as const + import invesalius.constants as const debug("Session.CreateProject") Publisher.sendMessage('Begin busy cursor') # Set session info @@ -134,7 +134,7 @@ class Session(object): return self.tempdir def OpenProject(self, filepath): - import constants as const + import invesalius.constants as const debug("Session.OpenProject") # Add item to recent projects list item = (path, file) = os.path.split(filepath) @@ -183,7 +183,7 @@ class Session(object): configfile.close() def __add_to_list(self, item): - import constants as const + import invesalius.constants as const # Last projects list l = self.recent_projects diff --git a/invesalius/style.py b/invesalius/style.py deleted file mode 100644 index 29d3369..0000000 --- a/invesalius/style.py +++ /dev/null @@ -1,112 +0,0 @@ -#-------------------------------------------------------------------------- -# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas -# Copyright: (C) 2001 Centro de Pesquisas Renato Archer -# Homepage: http://www.softwarepublico.gov.br -# Contact: invesalius@cti.gov.br -# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) -#-------------------------------------------------------------------------- -# Este programa e software livre; voce pode redistribui-lo e/ou -# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme -# publicada pela Free Software Foundation; de acordo com a versao 2 -# da Licenca. -# -# Este programa eh distribuido na expectativa de ser util, mas SEM -# QUALQUER GARANTIA; sem mesmo a garantia implicita de -# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM -# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais -# detalhes. -#-------------------------------------------------------------------------- - -from wx.lib.pubsub import pub as Publisher - - -# mode.py -# to be instanced inside Controller (control.py) - - - -# IMPORTANT: When adding a new state, remember o insert it into LEVEL -# dictionary - - -# RULE: -# default is the only level 0 -# states controlled somehow by taskmenu are level 1 -# states controlled by toolbar are level 2 -#LEVEL = {SLICE_STATE_DEFAULT: 0, -# SLICE_STATE_EDITOR: 1, -# SLICE_STATE_WL: 2, -# SLICE_STATE_SPIN: 2, -# SLICE_STATE_ZOOM: 2, -# SLICE_STATE_ZOOM_SL: 2} -#---------------------- -# TODO: Add to viewer_slice.py: - -#ps.Publisher().subscribe(self.OnSetMode, 'Set slice mode') - -#def OnSetMode(self, pubsub_evt): -# mode = pubsub_evt.data - # according to mode, set cursor, interaction, etc -#---------------------- -# TODO: Add GUI classes (frame, tasks related to slice, toolbar): - -# always bind to this class (regarding slice mode) and not to -# viewer_slice directly - -# example - pseudo code -#def OnToggleButtonSpin(self, evt) -# if evt.toggle: # doesn't exist, just to illustrate -# ps.Publisher().sendMessage('Enable mode', const.SLICE_STATE_ZOOM) -# else: -# ps.Publisher().subscribe('Disable mode', const.SLICE_STATE_ZOOM) - - -#---------------------- - - -import constants as const - -class StyleStateManager(object): -# don't need to be singleton, only needs to be instantiated inside -# (Controller) self.slice_mode = SliceMode() - - def __init__(self): - self.stack = {} - - # push default value to stack - self.stack[const.STYLE_LEVEL[const.STATE_DEFAULT]] = \ - const.STATE_DEFAULT - - def AddState(self, state): - - level = const.STYLE_LEVEL[state] - max_level = max(self.stack.keys()) - - # Insert new state into stack - self.stack[level] = state - - - new_max_level = max(self.stack.keys()) - return self.stack[new_max_level] - - def RemoveState(self, state): - level = const.STYLE_LEVEL[state] - if level in self.stack.keys(): - max_level = max(self.stack.keys()) - - # Remove item from stack - self.stack.pop(level) - - # New max level - new_max_level = max(self.stack.keys()) - - # Only will affect InVesalius behaviour if the highest - # level in stack has been removed - if level == max_level: - new_state = self.stack[new_max_level] - - return self.stack[new_max_level] - - max_level = max(self.stack.keys()) - return self.stack[max_level] - diff --git a/invesalius/utils.py b/invesalius/utils.py index 1d4fc32..41e47ac 100644 --- a/invesalius/utils.py +++ b/invesalius/utils.py @@ -71,10 +71,9 @@ def debug(error_str): Redirects output to file, or to the terminal This should be used in the place of "print" """ - from session import Session + from invesalius.session import Session session = Session() #if session.debug: - print >> sys.stderr, error_str def next_copy_name(original_name, names_list): """ @@ -372,8 +371,9 @@ def UpdateCheck(): import urllib import urllib2 import wx + import invesalius.session as ses def _show_update_info(): - from gui import dialogs + from invesalius.gui import dialogs msg=_("A new version of InVesalius is available. Do you want to open the download website now?") title=_("Invesalius Update") msgdlg = dialogs.UpdateMessageDialog(url) @@ -385,8 +385,7 @@ def UpdateCheck(): print "Checking updates..." # Check if there is a language set - #import i18n - import session as ses + #import invesalius.i18n as i18n import invesalius.session as ses session = ses.Session() install_lang = 0 if session.ReadLanguage(): @@ -400,7 +399,7 @@ def UpdateCheck(): random_id = session.GetRandomId() # Fetch update data from server - import constants as const + import invesalius.constants as const url = "http://www.cti.gov.br/dt3d/invesalius/update/checkupdate.php" headers = { 'User-Agent' : 'Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)' } data = {'update_protocol_version' : '1', -- libgit2 0.21.2