Commit e3682cbb2078fb7a4eb33221ab7b3adc60c87664
Exists in
xmartlabs-command-line
Merge branch 'command-line' of git://github.com/xmartlabs/invesalius3 into xmartlabs-command-line
Showing
4 changed files
with
98 additions
and
8 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,31 @@ |
| 1 | +FROM ubuntu:16.04 | |
| 2 | + | |
| 3 | +RUN apt-get update | |
| 4 | +RUN apt-get install -y \ | |
| 5 | + cython \ | |
| 6 | + python-concurrent.futures \ | |
| 7 | + python-gdcm \ | |
| 8 | + python-matplotlib \ | |
| 9 | + python-nibabel \ | |
| 10 | + python-numpy \ | |
| 11 | + python-pil \ | |
| 12 | + python-psutil \ | |
| 13 | + python-scipy \ | |
| 14 | + python-serial \ | |
| 15 | + python-skimage \ | |
| 16 | + python-vtk6 \ | |
| 17 | + python-vtkgdcm \ | |
| 18 | + python-wxgtk3.0 \ | |
| 19 | + xvfb # For a virtual X server. | |
| 20 | + | |
| 21 | +RUN apt-get install -y locales | |
| 22 | +RUN locale-gen en_US.UTF-8 | |
| 23 | +ENV LANG en_US.UTF-8 | |
| 24 | +ENV LANGUAGE en_US:en | |
| 25 | +ENV LC_ALL en_US.UTF-8 | |
| 26 | + | |
| 27 | +WORKDIR /usr/local/app | |
| 28 | + | |
| 29 | +COPY . . | |
| 30 | + | |
| 31 | +RUN python setup.py build_ext --inplace | ... | ... |
app.py
| ... | ... | @@ -24,6 +24,7 @@ import optparse as op |
| 24 | 24 | import os |
| 25 | 25 | import sys |
| 26 | 26 | import shutil |
| 27 | +import traceback | |
| 27 | 28 | |
| 28 | 29 | if sys.platform == 'win32': |
| 29 | 30 | import _winreg |
| ... | ... | @@ -245,6 +246,13 @@ def parse_comand_line(): |
| 245 | 246 | parser.add_option("-i", "--import", |
| 246 | 247 | action="store", |
| 247 | 248 | dest="dicom_dir") |
| 249 | + | |
| 250 | + parser.add_option("-s", "--save", | |
| 251 | + help="To save the project after an import.") | |
| 252 | + | |
| 253 | + parser.add_option("-a", "--export-to-all", | |
| 254 | + help="To open a project and export it to STL for all mask presets.") | |
| 255 | + | |
| 248 | 256 | options, args = parser.parse_args() |
| 249 | 257 | |
| 250 | 258 | # If debug argument... |
| ... | ... | @@ -256,23 +264,65 @@ def parse_comand_line(): |
| 256 | 264 | if options.dicom_dir: |
| 257 | 265 | import_dir = options.dicom_dir |
| 258 | 266 | Publisher.sendMessage('Import directory', import_dir) |
| 267 | + | |
| 268 | + if options.save: | |
| 269 | + Publisher.sendMessage('Save project', os.path.abspath(options.save)) | |
| 270 | + exit(0) | |
| 271 | + | |
| 272 | + check_for_exporting(options) | |
| 273 | + | |
| 259 | 274 | return True |
| 260 | 275 | |
| 261 | 276 | # Check if there is a file path somewhere in what the user wrote |
| 262 | 277 | # In case there is, try opening as it was a inv3 |
| 263 | 278 | else: |
| 264 | - i = len(args) | |
| 265 | - while i: | |
| 266 | - i -= 1 | |
| 267 | - file = args[i] | |
| 268 | - if os.path.isfile(file): | |
| 269 | - path = os.path.abspath(file) | |
| 270 | - Publisher.sendMessage('Open project', path) | |
| 271 | - i = 0 | |
| 279 | + for arg in reversed(args): | |
| 280 | + if os.path.isfile(arg): | |
| 281 | + path_ = os.path.abspath(arg) | |
| 282 | + Publisher.sendMessage('Open project', path_) | |
| 283 | + | |
| 284 | + check_for_exporting(options) | |
| 285 | + | |
| 272 | 286 | return True |
| 273 | 287 | return False |
| 274 | 288 | |
| 275 | 289 | |
| 290 | +def check_for_exporting(options): | |
| 291 | + if options.export_to_all: | |
| 292 | + try: | |
| 293 | + method = { | |
| 294 | + 'algorithm': 'Default', | |
| 295 | + 'options': {}, | |
| 296 | + } | |
| 297 | + | |
| 298 | + import invesalius.constants as const | |
| 299 | + from invesalius.project import Project | |
| 300 | + | |
| 301 | + for threshold_name, threshold_range in Project().presets.thresh_ct.iteritems(): | |
| 302 | + if isinstance(threshold_range[0], int): | |
| 303 | + Publisher.sendMessage('Set threshold values', threshold_range) | |
| 304 | + | |
| 305 | + srf_options = { | |
| 306 | + 'index': 0, | |
| 307 | + 'name': '', | |
| 308 | + 'quality': _('Optimal *'), | |
| 309 | + 'fill': False, | |
| 310 | + 'keep_largest': False, | |
| 311 | + 'overwrite': False, | |
| 312 | + } | |
| 313 | + Publisher.sendMessage('Create surface from index', | |
| 314 | + {'method': method, 'options': srf_options}) | |
| 315 | + | |
| 316 | + filename = u'{}-{}.stl'.format(options.export_to_all, threshold_name) | |
| 317 | + Publisher.sendMessage('Export surface to file', (filename, const.FILETYPE_STL)) | |
| 318 | + | |
| 319 | + Publisher.sendMessage('Remove surfaces', [0]) | |
| 320 | + except: | |
| 321 | + traceback.print_exc() | |
| 322 | + finally: | |
| 323 | + exit(0) | |
| 324 | + | |
| 325 | + | |
| 276 | 326 | def print_events(data): |
| 277 | 327 | """ |
| 278 | 328 | Print pubsub messages | ... | ... |
invesalius/control.py
| ... | ... | @@ -98,6 +98,8 @@ class Controller(): |
| 98 | 98 | |
| 99 | 99 | Publisher.subscribe(self.SetBitmapSpacing, 'Set bitmap spacing') |
| 100 | 100 | |
| 101 | + Publisher.subscribe(self.OnSaveProject, 'Save project') | |
| 102 | + | |
| 101 | 103 | def SetBitmapSpacing(self, pubsub_evt): |
| 102 | 104 | proj = prj.Project() |
| 103 | 105 | proj.spacing = pubsub_evt.data |
| ... | ... | @@ -335,6 +337,10 @@ class Controller(): |
| 335 | 337 | session.OpenProject(filepath) |
| 336 | 338 | Publisher.sendMessage("Enable state project", True) |
| 337 | 339 | |
| 340 | + def OnSaveProject(self, pubsub_evt): | |
| 341 | + path = pubsub_evt.data | |
| 342 | + self.SaveProject(path) | |
| 343 | + | |
| 338 | 344 | def SaveProject(self, path=None): |
| 339 | 345 | Publisher.sendMessage('Begin busy cursor') |
| 340 | 346 | session = ses.Session() | ... | ... |