Commit 34cd93f5f83ca90c743f82d66165f1dcedc69c36
1 parent
9647607e
Exists in
xmartlabs-command-line
and in
1 other branch
Add command to import and export in STL to all available presets
Showing
2 changed files
with
56 additions
and
13 deletions
Show diff stats
Dockerfile
| @@ -18,10 +18,14 @@ RUN apt-get install -y \ | @@ -18,10 +18,14 @@ RUN apt-get install -y \ | ||
| 18 | python-wxgtk3.0 \ | 18 | python-wxgtk3.0 \ |
| 19 | xvfb # For a virtual X server. | 19 | xvfb # For a virtual X server. |
| 20 | 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 | + | ||
| 21 | WORKDIR /usr/local/app | 27 | WORKDIR /usr/local/app |
| 22 | 28 | ||
| 23 | COPY . . | 29 | COPY . . |
| 24 | 30 | ||
| 25 | RUN python setup.py build_ext --inplace | 31 | RUN python setup.py build_ext --inplace |
| 26 | - | ||
| 27 | -RUN Xvfb :10 -ac -screen 0 1024x768x24 & |
app.py
| @@ -24,6 +24,7 @@ import optparse as op | @@ -24,6 +24,7 @@ import optparse as op | ||
| 24 | import os | 24 | import os |
| 25 | import sys | 25 | import sys |
| 26 | import shutil | 26 | import shutil |
| 27 | +import traceback | ||
| 27 | 28 | ||
| 28 | if sys.platform == 'win32': | 29 | if sys.platform == 'win32': |
| 29 | import _winreg | 30 | import _winreg |
| @@ -247,10 +248,11 @@ def parse_comand_line(): | @@ -247,10 +248,11 @@ def parse_comand_line(): | ||
| 247 | dest="dicom_dir") | 248 | dest="dicom_dir") |
| 248 | 249 | ||
| 249 | parser.add_option("-s", "--save", | 250 | parser.add_option("-s", "--save", |
| 250 | - action="store", | ||
| 251 | - dest="save", | ||
| 252 | help="To save the project after an import.") | 251 | help="To save the project after an import.") |
| 253 | 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 | + | ||
| 254 | options, args = parser.parse_args() | 256 | options, args = parser.parse_args() |
| 255 | 257 | ||
| 256 | # If debug argument... | 258 | # If debug argument... |
| @@ -265,25 +267,62 @@ def parse_comand_line(): | @@ -265,25 +267,62 @@ def parse_comand_line(): | ||
| 265 | 267 | ||
| 266 | if options.save: | 268 | if options.save: |
| 267 | Publisher.sendMessage('Save project', os.path.abspath(options.save)) | 269 | Publisher.sendMessage('Save project', os.path.abspath(options.save)) |
| 268 | - return True | 270 | + exit(0) |
| 271 | + | ||
| 272 | + check_for_exporting(options) | ||
| 269 | 273 | ||
| 270 | return True | 274 | return True |
| 271 | 275 | ||
| 272 | # Check if there is a file path somewhere in what the user wrote | 276 | # Check if there is a file path somewhere in what the user wrote |
| 273 | # In case there is, try opening as it was a inv3 | 277 | # In case there is, try opening as it was a inv3 |
| 274 | else: | 278 | else: |
| 275 | - i = len(args) | ||
| 276 | - while i: | ||
| 277 | - i -= 1 | ||
| 278 | - file = args[i] | ||
| 279 | - if os.path.isfile(file): | ||
| 280 | - path = os.path.abspath(file) | ||
| 281 | - Publisher.sendMessage('Open project', path) | ||
| 282 | - 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 | + | ||
| 283 | return True | 286 | return True |
| 284 | return False | 287 | return False |
| 285 | 288 | ||
| 286 | 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 | + | ||
| 287 | def print_events(data): | 326 | def print_events(data): |
| 288 | """ | 327 | """ |
| 289 | Print pubsub messages | 328 | Print pubsub messages |