示例#1
0
 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)
示例#2
0
文件: run_gui.py 项目: jayMcBee/pycam
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
示例#3
0
 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)
示例#4
0
 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)
示例#5
0
 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()
示例#6
0
 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)
示例#7
0
 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)
示例#8
0
文件: Models.py 项目: jayMcBee/pycam
    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)
示例#9
0
    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()
示例#10
0
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