Пример #1
0
    def open_and_display_file(self, fpath, ftype=None):
        self.set_wait_cursor()
        progress_dialog_read = None
        progress_dialog_load = None
        success = True

        try:
            self.update_recent_files(fpath, ftype)
            self.model_file = ModelFile(fpath, ftype)

            self.scene = Scene(self.window)

            progress_dialog_read = ProgressDialog('Reading file...')
            model, model_data = self.model_file.read(progress_dialog_read.step)

            progress_dialog_load = ProgressDialog('Loading model...')
            model.load_data(model_data, progress_dialog_load.step)

            self.scene.clear()
            self.scene.add_model(model)

            if self.model_file.filetype == 'gcode':
                offset_x = self.config.read('machine.platform_offset_x', float)
                offset_y = self.config.read('machine.platform_offset_y', float)
                offset_z = self.config.read('machine.platform_offset_z', float)

                if offset_x is None and offset_y is None and offset_z is None:
                    self.scene.view_model_center()
                    logging.info(
                        'Platform offsets not set, showing model in the center'
                    )
                else:
                    model.offset_x = offset_x if offset_x is not None else 0
                    model.offset_y = offset_y if offset_y is not None else 0
                    model.offset_z = offset_z if offset_z is not None else 0
                    logging.info(
                        'Using platform offsets: (%s, %s, %s)' %
                        (model.offset_x, model.offset_y, model.offset_z))

            # platform needs to be added last to be translucent
            platform_w = self.config.read('machine.platform_w', float)
            platform_d = self.config.read('machine.platform_d', float)
            platform = Platform(platform_w, platform_d)
            self.scene.add_supporting_actor(platform)

            self.panel = self.create_panel()
            # update panel to reflect new model properties
            self.panel.set_initial_values()
            self.panel.connect_handlers()

            # always start with the same view on the scene
            self.scene.reset_view(True)
            if self.model_file.filetype == 'gcode':
                self.scene.mode_2d = bool(self.config.read('ui.gcode_2d', int))
            else:
                self.scene.mode_2d = False

            if hasattr(self.panel, 'set_3d_view'):
                self.panel.set_3d_view(not self.scene.mode_2d)

            self.window.set_file_widgets(self.scene, self.panel)
            self.window.filename = self.model_file.basename
            self.window.file_modified = False
            self.window.menu_enable_file_items(
                self.model_file.filetype != 'gcode')

            if self.model_file.size > 2**30:
                size = self.model_file.size / 2**30
                units = 'GB'
            elif self.model_file.size > 2**20:
                size = self.model_file.size / 2**20
                units = 'MB'
            elif self.model_file.size > 2**10:
                size = self.model_file.size / 2**10
                units = 'KB'
            else:
                size = self.model_file.size
                units = 'B'

            vertex_plural = 'vertex' if int(str(
                model.vertex_count)[-1]) == 1 else 'vertices'
            self.window.update_status(' %s (%.1f%s, %d %s)' %
                                      (self.model_file.basename, size, units,
                                       model.vertex_count, vertex_plural))
        except IOError, e:
            self.set_normal_cursor()
            error_dialog = OpenErrorAlert(fpath, e.strerror)
            error_dialog.show()
            success = False