def _bounds_new(self, widget=None): with merge_history_and_block_events(self.core): params = {"specification": "margins", "lower": [0, 0, 0], "upper": [0, 0, 0], "reference_models": []} new_bounds = Boundary(None, data=params) new_bounds.set_application_value("name", self.get_non_conflicting_name("Bounds #%d")) self.select(new_bounds)
def show_gui(): pycam.Utils.set_application_key("pycam-gtk") deps_gtk = GuiCommon.requirements_details_gtk() report_gtk = GuiCommon.get_dependency_report(deps_gtk, prefix="\t") if GuiCommon.check_dependencies(deps_gtk): from pycam.Gui.Project import ProjectGui gui_class = ProjectGui else: full_report = [] full_report.append("PyCAM dependency problem") full_report.append("Error: Failed to load the GTK interface.") full_report.append("Details:") full_report.append(report_gtk) full_report.append("") full_report.append("Detailed list of requirements: %s" % GuiCommon.REQUIREMENTS_LINK) log.critical(os.linesep.join(full_report)) return EXIT_CODES["requirements"] event_manager = get_event_handler() event_manager.set("history", DataHistory()) with merge_history_and_block_events(event_manager): gui = gui_class(event_manager) # initialize plugins plugin_manager = pycam.Plugins.PluginManager(core=event_manager) plugin_manager.import_plugins() # some more initialization gui.reset_preferences() gui.load_preferences() gui.load_startup_workspace() event_manager.emit_event("notify-initialization-finished") # open the GUI get_mainloop(use_gtk=True).run() # optionally save workspace (based on configuration or dialog response) if event_manager.get("save_workspace_on_exit") == QuestionStatus.ASK.value: response = gui.get_question_response("Save Workspace?", True, allow_memorize=True) if response.should_memorize: event_manager.set("save_workspace_on_exit", (QuestionStatus.YES if response.is_yes else QuestionStatus.NO).value) should_store = response.is_yes elif event_manager.get( "save_workspace_on_exit") == QuestionStatus.YES.value: should_store = True else: should_store = False if should_store: gui.save_startup_workspace() gui.save_preferences() # no error -> return no error code return None
def _process_new(self, widget=None, strategy="slice"): with merge_history_and_block_events(self.core): params = {"strategy": strategy} params.update(self.core.get("get_default_parameter_values")("process", set_name=strategy)) new_process = pycam.workspace.data_models.Process(None, data=params) new_process.set_application_value("name", self.get_non_conflicting_name("Process #%d")) self.select(new_process)
def _task_new(self, widget=None, task_type="milling"): with merge_history_and_block_events(self.core): params = {"type": task_type} params.update(self.core.get("get_default_parameter_values")("task", set_name=task_type)) new_task = pycam.workspace.data_models.Task(None, data=params) new_task.set_application_value("name", self.get_non_conflicting_name("Task #%d")) self.select(new_task)
def load_workspace_from_description(self, description): from pycam.Flow.history import merge_history_and_block_events from pycam.Flow.parser import parse_yaml, validate_collections, RestoreCollectionsOnError with merge_history_and_block_events(self.settings): with RestoreCollectionsOnError(): parse_yaml(description, excluded_sections={ CollectionName.TOOLPATHS, CollectionName.EXPORTS }, reset=True) validate_collections()
def _export_setting_new(self, widget=None): with merge_history_and_block_events(self.core): params = { "gcode": self.core.get("get_default_parameter_values")( "toolpath_profile") } new_item = pycam.workspace.data_models.ExportSettings(None, data=params) new_item.set_application_value( "name", self.get_non_conflicting_name("Settings #%d")) self.select(new_item)
def _tool_new(self, widget=None, shape="flat_bottom"): # look for an unused tool ID existing_tool_ids = [tool.get_value("tool_id") for tool in self.get_all()] tool_id = 1 while tool_id in existing_tool_ids: tool_id += 1 with merge_history_and_block_events(self.core): params = {"shape": shape, "tool_id": tool_id} params.update(self.core.get("get_default_parameter_values")("tool", set_name=shape)) new_tool = pycam.workspace.data_models.Tool(None, data=params) new_tool.set_application_value("name", self.get_non_conflicting_name("Tool #%d")) self.select(new_tool)
def add_model(self, model_params, name=None, color=None): """ @param model_params: a dictionary describing the model, e.g.: {"source": {"type": "object", "data": FOO}} """ self.log.info("Adding new model: %s", name) if not color: color = self.core.get("color_model") if not color: color = self.FALLBACK_COLOR.copy() if name is None: name = self.get_non_conflicting_name("Model #%d") with merge_history_and_block_events(self.core): new_model = pycam.workspace.data_models.Model( None, copy.deepcopy(model_params)) new_model.set_application_value("name", name) new_model.set_application_value("color", color) new_model.set_application_value("visible", True)
def shutdown_handler(): # prevent repeated calls if shutdown_calls: return shutdown_calls.append(True) # optionally save workspace (based on configuration or dialog response) if has_loaded_custom_workspace: # A custom workspace file was given via command line - we always want to ask before # overwriting it. response = gui.get_question_response( "Save Workspace to '{}'?".format(workspace_filename), True) should_store = response.is_yes elif event_manager.get( "save_workspace_on_exit") == QuestionStatus.ASK.value: response = gui.get_question_response("Save Workspace?", True, allow_memorize=True) if response.should_memorize: event_manager.set("save_workspace_on_exit", (QuestionStatus.YES if response.is_yes else QuestionStatus.NO).value) should_store = response.is_yes elif event_manager.get( "save_workspace_on_exit") == QuestionStatus.YES.value: should_store = True else: should_store = False if should_store: gui.save_startup_workspace() gui.save_preferences() with merge_history_and_block_events(event_manager, emit_events_after=False): plugin_manager.disable_all_plugins() # close the GUI gui.stop() history.cleanup()
def show_gui(workspace_filename=None): pycam.Utils.set_application_key("pycam-gtk") deps_gtk = GuiCommon.requirements_details_gtk() report_gtk = GuiCommon.get_dependency_report(deps_gtk, prefix="\t") if GuiCommon.check_dependencies(deps_gtk): from pycam.Gui.Project import ProjectGui gui_class = ProjectGui else: full_report = [] full_report.append("PyCAM dependency problem") full_report.append("Error: Failed to load the GTK interface.") full_report.append("Details:") full_report.append(report_gtk) full_report.append("") full_report.append("Detailed list of requirements: %s" % GuiCommon.REQUIREMENTS_LINK) log.critical(os.linesep.join(full_report)) return EXIT_CODES["requirements"] event_manager = get_event_handler() history = DataHistory() event_manager.set("history", history) with merge_history_and_block_events(event_manager): log.debug("Initializing user interface") gui = gui_class(event_manager) # initialize plugins log.debug("Loading all available plugins") plugin_manager = pycam.Plugins.PluginManager(core=event_manager) plugin_manager.import_plugins() # some more initialization log.debug("Resetting preferences") gui.reset_preferences() log.debug("Loading preferences") gui.load_preferences() has_loaded_custom_workspace = False log.debug("Loading workspace") if workspace_filename is None: gui.load_startup_workspace() else: if gui.load_workspace_from_file(workspace_filename): has_loaded_custom_workspace = True else: gui.load_startup_workspace() log.debug("Finished initialization") log.debug("Configured events: %s", ", ".join(event_manager.get_events_summary_lines())) shutdown_calls = [] def shutdown_handler(): # prevent repeated calls if shutdown_calls: return shutdown_calls.append(True) # optionally save workspace (based on configuration or dialog response) if has_loaded_custom_workspace: # A custom workspace file was given via command line - we always want to ask before # overwriting it. response = gui.get_question_response( "Save Workspace to '{}'?".format(workspace_filename), True) should_store = response.is_yes elif event_manager.get( "save_workspace_on_exit") == QuestionStatus.ASK.value: response = gui.get_question_response("Save Workspace?", True, allow_memorize=True) if response.should_memorize: event_manager.set("save_workspace_on_exit", (QuestionStatus.YES if response.is_yes else QuestionStatus.NO).value) should_store = response.is_yes elif event_manager.get( "save_workspace_on_exit") == QuestionStatus.YES.value: should_store = True else: should_store = False if should_store: gui.save_startup_workspace() gui.save_preferences() with merge_history_and_block_events(event_manager, emit_events_after=False): plugin_manager.disable_all_plugins() # close the GUI gui.stop() history.cleanup() # Register our shutdown handler: it should be run _before_ the GTK main loop stops. # Otherwise some references and signals are gone when the teardown actions are exeucted. event_manager.register_event("mainloop-stop", shutdown_handler) # open the GUI - wait until the window is closed gui.run_forever() event_manager.unregister_event("mainloop-stop", shutdown_handler) # show final statistics log.debug("Configured events: %s", ", ".join(event_manager.get_events_summary_lines())) for event, stats in sorted(event_manager.get_events_summary().items()): if len(stats["handlers"]) > 0: log.info("Remaining listeners for event '%s': %s", event, ", ".join(str(func) for func in stats["handlers"])) # no error -> return no error code return None