Commit 1e716228 authored by sumpfralle's avatar sumpfralle

renamed events "*-parameter-changed" to "*-changed"

migrated task settings to the new parameter manager


git-svn-id: https://pycam.svn.sourceforge.net/svnroot/pycam/trunk@1144 bbaffbd6-741e-11dd-a85d-61de82d9cad9
parent ea4da952
...@@ -187,7 +187,7 @@ ...@@ -187,7 +187,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkAlignment" id="alignment1"> <object class="GtkAlignment" id="ProcessSelectorBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="xscale">0</property> <property name="xscale">0</property>
<property name="yscale">0</property> <property name="yscale">0</property>
......
...@@ -82,6 +82,20 @@ ...@@ -82,6 +82,20 @@
</row> </row>
</data> </data>
</object> </object>
<object class="GtkListStore" id="TaskTypeList">
<columns>
<!-- column-name label -->
<column type="gchararray"/>
<!-- column-name name -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0" translatable="yes">Test</col>
<col id="1" translatable="yes">sfd</col>
</row>
</data>
</object>
<object class="GtkVPaned" id="TaskBox"> <object class="GtkVPaned" id="TaskBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
...@@ -256,55 +270,18 @@ ...@@ -256,55 +270,18 @@
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">5</property> <property name="spacing">5</property>
<child> <child>
<object class="GtkHBox" id="hbox1"> <object class="GtkAlignment" id="TaskChooserBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="spacing">3</property> <property name="xscale">0</property>
<child> <property name="yscale">0</property>
<object class="GtkFrame" id="TaskModelsFram">
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="left_padding">12</property>
<child> <child>
<object class="GtkViewport" id="viewport1"> <object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="resize_mode">queue</property>
<property name="shadow_type">etched-out</property>
<child>
<object class="GtkTreeView" id="Models">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="spacing">3</property>
<property name="model">ModelsList</property>
<property name="headers_visible">False</property>
<property name="headers_clickable">False</property>
<property name="search_column">0</property>
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn1">
<property name="title">column</property>
<child> <child>
<object class="GtkCellRendererText" id="cellrenderertext1"/> <object class="GtkLabel" id="label1">
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="TaskModelsFrame">
<property name="visible">True</property> <property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Models&lt;/b&gt;</property> <property name="label" translatable="yes">Task type:</property>
<property name="use_markup">True</property>
</object>
</child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
...@@ -312,260 +289,39 @@ ...@@ -312,260 +289,39 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkVSeparator" id="vseparator1"> <object class="GtkComboBox" id="TaskTypeSelector">
<property name="visible">True</property> <property name="visible">True</property>
<property name="orientation">vertical</property> <property name="model">TaskTypeList</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="ComponentsFrame">
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
<property name="left_padding">12</property>
<child>
<object class="GtkTable" id="table9">
<property name="visible">True</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
<property name="column_spacing">5</property>
<property name="row_spacing">3</property>
<child> <child>
<object class="GtkLabel" id="TaskToolLabel"> <object class="GtkCellRendererText" id="cellrenderertext1"/>
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Tool:</property>
</object>
<packing>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="TaskProcessLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Process:</property>
</object>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="TaskBoundsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Bounds:</property>
</object>
<packing>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="ToolSelector">
<property name="visible">True</property>
<property name="model">ToolList</property>
<child>
<object class="GtkCellRendererText" id="ToolListCell"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="ProcessSelector">
<property name="visible">True</property>
<property name="model">ProcessList</property>
<child>
<object class="GtkCellRendererText" id="ProcessListCell"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="BoundsSelector">
<property name="visible">True</property>
<property name="model">BoundsList</property>
<child>
<object class="GtkCellRendererText" id="BoundsListCell"/>
<attributes> <attributes>
<attribute name="text">1</attribute> <attribute name="text">0</attribute>
</attributes> </attributes>
</child> </child>
</object> </object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="ComponentsFrameLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Components&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator2">
<property name="visible">True</property>
</object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkFrame" id="frame12">
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment19">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="top_padding">3</property>
<property name="left_padding">12</property>
<child>
<object class="GtkTable" id="table5">
<property name="visible">True</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
<property name="column_spacing">4</property>
<property name="row_spacing">4</property>
<child>
<object class="GtkLabel" id="FeedrateLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Feedrate:</property>
</object>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="SpindleSpeedLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Spindle Speed:</property>
</object> </object>
<packing>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child> </child>
<child>
<object class="GtkSpinButton" id="FeedrateControl">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="adjustment">feedrate</property>
</object> </object>
<packing> <packing>
<property name="left_attach">1</property> <property name="position">0</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="SpindleSpeedControl">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="adjustment">speed</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="SpeedLimitsUnitLabel"> <object class="GtkHBox" id="TaskParameterBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="xalign">0</property> <property name="spacing">5</property>
<property name="label" translatable="yes">Unit:</property>
</object>
</child>
<child> <child>
<object class="GtkLabel" id="SpeedUnit"> <placeholder/>
<property name="visible">True</property>
<property name="label" translatable="yes">inches/minute</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="ProcessingSpeedLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Speed&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="position">2</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
</object> </object>
......
...@@ -222,7 +222,7 @@ ...@@ -222,7 +222,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkAlignment" id="alignment1"> <object class="GtkAlignment" id="ToolSelectorBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="xscale">0</property> <property name="xscale">0</property>
<property name="yscale">0</property> <property name="yscale">0</property>
...@@ -267,7 +267,7 @@ ...@@ -267,7 +267,7 @@
<child> <child>
<object class="GtkHBox" id="ToolParameterBox"> <object class="GtkHBox" id="ToolParameterBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="spacing">3</property> <property name="spacing">5</property>
<child> <child>
<placeholder/> <placeholder/>
</child> </child>
......
...@@ -31,7 +31,7 @@ _GTK_COLOR_MAX = 65535.0 ...@@ -31,7 +31,7 @@ _GTK_COLOR_MAX = 65535.0
class Models(pycam.Plugins.ListPluginBase): class Models(pycam.Plugins.ListPluginBase):
UI_FILE = "models.ui" UI_FILE = "models.ui"
COLUMN_ID, COLUMN_NAME, COLUMN_VISIBLE, COLUMN_COLOR, COLUMN_ALPHA = range(5) COLUMN_REF, COLUMN_NAME, COLUMN_VISIBLE, COLUMN_COLOR, COLUMN_ALPHA = range(5)
LIST_ATTRIBUTE_MAP = {"name": COLUMN_NAME, "visible": COLUMN_VISIBLE, LIST_ATTRIBUTE_MAP = {"name": COLUMN_NAME, "visible": COLUMN_VISIBLE,
"color": COLUMN_COLOR, "alpha": COLUMN_ALPHA} "color": COLUMN_COLOR, "alpha": COLUMN_ALPHA}
ICONS = {"visible": "visible.svg", "hidden": "visible_off.svg"} ICONS = {"visible": "visible.svg", "hidden": "visible_off.svg"}
...@@ -78,7 +78,7 @@ class Models(pycam.Plugins.ListPluginBase): ...@@ -78,7 +78,7 @@ class Models(pycam.Plugins.ListPluginBase):
self._model_cache = {} self._model_cache = {}
cache = self._model_cache cache = self._model_cache
for row in self._treemodel: for row in self._treemodel:
cache[row[self.COLUMN_ID]] = list(row) cache[row[self.COLUMN_REF]] = list(row)
self._treemodel.clear() self._treemodel.clear()
for index, item in enumerate(self): for index, item in enumerate(self):
if id(item) in cache: if id(item) in cache:
......
...@@ -267,6 +267,9 @@ class ParameterSectionGTK(object): ...@@ -267,6 +267,9 @@ class ParameterSectionGTK(object):
widget.set_label(param["label"]) widget.set_label(param["label"])
self._table.attach(widget, 0, 2, index, index + 1, self._table.attach(widget, 0, 2, index, index + 1,
xoptions=gtk.FILL, yoptions=gtk.FILL) xoptions=gtk.FILL, yoptions=gtk.FILL)
elif not param["label"]:
self._table.attach(widget, 0, 2, index, index + 1,
xoptions=gtk.FILL, yoptions=gtk.FILL)
else: else:
# spinbutton, combobox, ... # spinbutton, combobox, ...
label = gtk.Label("%s:" % param["label"]) label = gtk.Label("%s:" % param["label"])
......
...@@ -33,7 +33,7 @@ class PathParamOverlap(pycam.Plugins.PluginBase): ...@@ -33,7 +33,7 @@ class PathParamOverlap(pycam.Plugins.PluginBase):
# configure the input/output converter # configure the input/output converter
widget = pycam.Gui.ControlsGTK.InputNumber(lower=0, upper=99, digits=0, widget = pycam.Gui.ControlsGTK.InputNumber(lower=0, upper=99, digits=0,
increment=10, change_handler=lambda widget=None: \ increment=10, change_handler=lambda widget=None: \
self.core.emit_event("process-parameter-changed")) self.core.emit_event("process-changed"))
widget.set_conversion( widget.set_conversion(
set_conv=lambda float_value: int(float_value * 100.0), set_conv=lambda float_value: int(float_value * 100.0),
get_conv=lambda percent: percent / 100.0) get_conv=lambda percent: percent / 100.0)
...@@ -53,7 +53,7 @@ class PathParamStepDown(pycam.Plugins.PluginBase): ...@@ -53,7 +53,7 @@ class PathParamStepDown(pycam.Plugins.PluginBase):
def setup(self): def setup(self):
widget = pycam.Gui.ControlsGTK.InputNumber(lower=0.01, upper=1000, widget = pycam.Gui.ControlsGTK.InputNumber(lower=0.01, upper=1000,
digits=2, start=1, change_handler=lambda widget=None: \ digits=2, start=1, change_handler=lambda widget=None: \
self.core.emit_event("process-parameter-changed")) self.core.emit_event("process-changed"))
self.core.get("register_parameter")("process", "pathgenerator", self.core.get("register_parameter")("process", "pathgenerator",
"step_down", "Step down", widget, weight=20) "step_down", "Step down", widget, weight=20)
return True return True
...@@ -70,7 +70,7 @@ class PathParamMaterialAllowance(pycam.Plugins.PluginBase): ...@@ -70,7 +70,7 @@ class PathParamMaterialAllowance(pycam.Plugins.PluginBase):
def setup(self): def setup(self):
widget = pycam.Gui.ControlsGTK.InputNumber(start=0, lower=0, upper=100, widget = pycam.Gui.ControlsGTK.InputNumber(start=0, lower=0, upper=100,
digits=2, change_handler=lambda widget=None: \ digits=2, change_handler=lambda widget=None: \
self.core.emit_event("process-parameter-changed")) self.core.emit_event("process-changed"))
self.core.get("register_parameter")("process", "pathgenerator", self.core.get("register_parameter")("process", "pathgenerator",
"material_allowance", "Material allowance", widget, weight=30) "material_allowance", "Material allowance", widget, weight=30)
return True return True
...@@ -90,7 +90,7 @@ class PathParamMillingStyle(pycam.Plugins.PluginBase): ...@@ -90,7 +90,7 @@ class PathParamMillingStyle(pycam.Plugins.PluginBase):
("climb / down", "climb"), ("climb / down", "climb"),
("conventional / up", "conventional")), ("conventional / up", "conventional")),
change_handler=lambda widget=None: self.core.emit_event( change_handler=lambda widget=None: self.core.emit_event(
"process-parameter-changed")) "process-changed"))
self.core.get("register_parameter")("process", "pathgenerator", self.core.get("register_parameter")("process", "pathgenerator",
"milling_style", "Milling style", input_control, weight=50) "milling_style", "Milling style", input_control, weight=50)
return True return True
...@@ -108,7 +108,7 @@ class PathParamGridDirection(pycam.Plugins.PluginBase): ...@@ -108,7 +108,7 @@ class PathParamGridDirection(pycam.Plugins.PluginBase):
input_control = pycam.Gui.ControlsGTK.InputChoice( input_control = pycam.Gui.ControlsGTK.InputChoice(
(("x", "x"), ("y", "y"), ("xy", "xy")), (("x", "x"), ("y", "y"), ("xy", "xy")),
change_handler=lambda widget=None: self.core.emit_event( change_handler=lambda widget=None: self.core.emit_event(
"process-parameter-changed")) "process-changed"))
self.core.get("register_parameter")("process", "pathgenerator", self.core.get("register_parameter")("process", "pathgenerator",
"grid_direction", "Direction", input_control, weight=40) "grid_direction", "Direction", input_control, weight=40)
return True return True
...@@ -125,7 +125,7 @@ class PathParamRadiusCompensation(pycam.Plugins.PluginBase): ...@@ -125,7 +125,7 @@ class PathParamRadiusCompensation(pycam.Plugins.PluginBase):
def setup(self): def setup(self):
widget = pycam.Gui.ControlsGTK.InputCheckBox( widget = pycam.Gui.ControlsGTK.InputCheckBox(
change_handler=lambda widget=None: self.core.emit_event( change_handler=lambda widget=None: self.core.emit_event(
"process-parameter-changed")) "process-changed"))
self.core.get("register_parameter")("process", "pathgenerator", self.core.get("register_parameter")("process", "pathgenerator",
"radius_compensation", "Radius compensation", widget, weight=80) "radius_compensation", "Radius compensation", widget, weight=80)
return True return True
...@@ -140,10 +140,9 @@ class PathParamTraceModel(pycam.Plugins.PluginBase): ...@@ -140,10 +140,9 @@ class PathParamTraceModel(pycam.Plugins.PluginBase):
DEPENDS = ["Processes", "Models"] DEPENDS = ["Processes", "Models"]
def setup(self): def setup(self):
# TODO: check if gtk is in use self.input_control = pycam.Gui.ControlsGTK.InputTable([],
self.input_control = pycam.Gui.ControlsGTK.InputTable([], force_type=long, force_type=long, change_handler=lambda widget=None: \
change_handler=lambda widget=None: self.core.emit_event( self.core.emit_event("process-changed"))
"process-parameter-changed"))
# configure the input/output converter # configure the input/output converter
def get_converter(model_refs): def get_converter(model_refs):
models_dict = {} models_dict = {}
......
...@@ -101,7 +101,7 @@ class Processes(pycam.Plugins.ListPluginBase): ...@@ -101,7 +101,7 @@ class Processes(pycam.Plugins.ListPluginBase):
self.register_model_update(update_model) self.register_model_update(update_model)
self.core.register_event("process-selection-changed", self.core.register_event("process-selection-changed",
self._process_switch) self._process_switch)
self.core.register_event("process-parameter-changed", self.core.register_event("process-changed",
self._store_process_settings) self._store_process_settings)
self.core.register_event("process-strategy-changed", self.core.register_event("process-strategy-changed",
self._store_process_settings) self._store_process_settings)
...@@ -166,6 +166,11 @@ class Processes(pycam.Plugins.ListPluginBase): ...@@ -166,6 +166,11 @@ class Processes(pycam.Plugins.ListPluginBase):
self.pop(index) self.pop(index)
# show "new" only if a strategy is available # show "new" only if a strategy is available
self.gui.get_object("ProcessNew").set_sensitive(len(model) > 0) self.gui.get_object("ProcessNew").set_sensitive(len(model) > 0)
selector_box = self.gui.get_object("ProcessSelectorBox")
if len(model) < 2:
selector_box.hide()
else:
selector_box.show()
def _get_strategy(self, name=None): def _get_strategy(self, name=None):
strategies = self.core.get("get_parameter_sets")("process") strategies = self.core.get("get_parameter_sets")("process")
...@@ -212,7 +217,7 @@ class Processes(pycam.Plugins.ListPluginBase): ...@@ -212,7 +217,7 @@ class Processes(pycam.Plugins.ListPluginBase):
if not process: if not process:
control_box.hide() control_box.hide()
else: else:
self.core.block_event("process-parameter-changed") self.core.block_event("process-changed")
self.core.block_event("process-strategy-changed") self.core.block_event("process-strategy-changed")
strategy_name = process["strategy"] strategy_name = process["strategy"]
self.select_strategy(strategy_name) self.select_strategy(strategy_name)
...@@ -220,7 +225,7 @@ class Processes(pycam.Plugins.ListPluginBase): ...@@ -220,7 +225,7 @@ class Processes(pycam.Plugins.ListPluginBase):
self.core.get("set_parameter_values")("process", process["parameters"]) self.core.get("set_parameter_values")("process", process["parameters"])
control_box.show() control_box.show()
self.core.unblock_event("process-strategy-changed") self.core.unblock_event("process-strategy-changed")
self.core.unblock_event("process-parameter-changed") self.core.unblock_event("process-changed")
self.core.emit_event("process-strategy-changed") self.core.emit_event("process-strategy-changed")
def _process_new(self, *args): def _process_new(self, *args):
......
# -*- coding: utf-8 -*-
"""
$Id$
Copyright 2011 Lars Kruse <devel@sumpfralle.de>
This file is part of PyCAM.
PyCAM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
PyCAM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with PyCAM. If not, see <http://www.gnu.org/licenses/>.
"""
import pycam.Plugins
import pycam.Gui.ControlsGTK
class TaskParamCollisionModels(pycam.Plugins.PluginBase):
DEPENDS = ["Models", "Tasks"]
def setup(self):
self.input_control = pycam.Gui.ControlsGTK.InputTable([],
force_type=long, change_handler=lambda widget=None: \
self.core.emit_event("task-changed"))
# configure the input/output converter
def get_converter(model_refs):
models_dict = {}
for model in self.core.get("models"):
models_dict[id(model)] = model
models = []
for model_ref in model_refs:
models.append(models_dict[model_ref])
return models
def set_converter(models):
return [id(model) for model in models]
self.input_control.set_conversion(set_conv=set_converter,
get_conv=get_converter)
self.input_control.get_widget().set_size_request(240, -1)
self.core.get("register_parameter")("task", "models",
"collision_models", "", self.input_control,
weight=5)
self.core.register_event("model-list-changed", self._update_models)
return True
def teardown(self):
self.core.get("unregister_parameter")("task", "models",
"collision_models")
def _update_models(self):
choices = []
models = self.core.get("models")
for model in models:
if hasattr(model, "triangles"):
choices.append((models.get_attr(model, "name"), id(model)))
self.input_control.update_choices(choices)
class TaskParamTool(pycam.Plugins.PluginBase):
DEPENDS = ["Tools", "Tasks"]
def setup(self):
self.input_control = pycam.Gui.ControlsGTK.InputChoice([],
force_type=long, change_handler=lambda widget=None: \
self.core.emit_event("task-changed"))
self.core.get("register_parameter")("task", "components", "tool",
"Tool", self.input_control, weight=10)
self.core.register_event("tool-list-changed", self._update_tools)
return True
def teardown(self):
self.core.get("unregister_parameter")("task", "components", "tool")
def _update_tools(self):
choices = []
tools = self.core.get("tools")
for tool in tools:
choices.append((tools.get_attr(tool, "name"), id(tool)))
self.input_control.update_choices(choices)
class TaskParamProcess(pycam.Plugins.PluginBase):
DEPENDS = ["Processes", "Tasks"]
def setup(self):
self.input_control = pycam.Gui.ControlsGTK.InputChoice([],
force_type=long, change_handler=lambda widget=None: \
self.core.emit_event("task-changed"))
self.core.get("register_parameter")("task", "components", "process",
"Process", self.input_control, weight=20)
self.core.register_event("process-list-changed", self._update_processes)
return True
def teardown(self):
self.core.get("unregister_parameter")("task", "components", "process")
def _update_processes(self):
choices = []
processes = self.core.get("processes")
for process in processes:
choices.append((processes.get_attr(process, "name"), id(process)))
self.input_control.update_choices(choices)
class TaskParamBounds(pycam.Plugins.PluginBase):
DEPENDS = ["Bounds", "Tasks"]
def setup(self):
self.input_control = pycam.Gui.ControlsGTK.InputChoice([],
force_type=long, change_handler=lambda widget=None: \
self.core.emit_event("task-changed"))
self.core.get("register_parameter")("task", "components", "bounds",
"Bounds", self.input_control, weight=30)
self.core.register_event("bounds-list-changed", self._update_bounds)
return True
def teardown(self):
self.core.get("unregister_parameter")("task", "components", "bounds")
def _update_bounds(self):
choices = []
bounds = self.core.get("bounds")
for bound in bounds:
choices.append((bounds.get_attr(bound, "name"), id(bound)))
self.input_control.update_choices(choices)
# -*- coding: utf-8 -*-
"""
$Id$
Copyright 2011 Lars Kruse <devel@sumpfralle.de>
This file is part of PyCAM.
PyCAM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
PyCAM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with PyCAM. If not, see <http://www.gnu.org/licenses/>.
"""
import pycam.Plugins
class TaskTypeMilling(pycam.Plugins.PluginBase):
DEPENDS = ["Tasks", "TaskParamCollisionModels", "TaskParamTool",
"TaskParamProcess", "TaskParamBounds"]
def setup(self):
parameters = {"collision_models": [],
"tool": None,
"process": None,
"bounds": None,
}
self.core.get("register_parameter_set")("task", "milling",
"Milling", self.run_task, parameters=parameters,
weight=10)
return True
def teardown(self):
self.core.get("unregister_parameter_set")("task", "milling")
def run_task(self):
pass
...@@ -25,16 +25,6 @@ import time ...@@ -25,16 +25,6 @@ import time
import pycam.Plugins import pycam.Plugins
import pycam.Utils import pycam.Utils
from pycam.Exporters.GCodeExporter import GCodeGenerator from pycam.Exporters.GCodeExporter import GCodeGenerator
from pycam.Toolpath.MotionGrid import MILLING_STYLE_IGNORE, \
MILLING_STYLE_CONVENTIONAL, MILLING_STYLE_CLIMB, GRID_DIRECTION_X, \
GRID_DIRECTION_Y, GRID_DIRECTION_XY, get_lines_grid, get_fixed_grid
import pycam.PathProcessors.SimpleCutter
import pycam.PathGenerators.PushCutter
import pycam.PathProcessors.ContourCutter
import pycam.PathGenerators.ContourFollow
import pycam.PathProcessors.PathAccumulator
import pycam.PathGenerators.DropCutter
import pycam.PathGenerators.EngraveCutter
class Tasks(pycam.Plugins.ListPluginBase): class Tasks(pycam.Plugins.ListPluginBase):
...@@ -59,9 +49,40 @@ class Tasks(pycam.Plugins.ListPluginBase): ...@@ -59,9 +49,40 @@ class Tasks(pycam.Plugins.ListPluginBase):
self.gui.get_object(obj_name)) self.gui.get_object(obj_name))
self.gui.get_object("TaskNew").connect("clicked", self.gui.get_object("TaskNew").connect("clicked",
self._task_new) self._task_new)
# parameters
parameters_box = self.gui.get_object("TaskParameterBox")
def clear_parameter_widgets():
parameters_box.foreach(
lambda widget: parameters_box.remove(widget))
def add_parameter_widget(item, name):
# create a frame within an alignment and the item inside
frame_label = gtk.Label()
frame_label.set_markup("<b>%s</b>" % name)
frame = gtk.Frame()
frame.set_label_widget(frame_label)
align = gtk.Alignment()
frame.add(align)
align.set_padding(0, 3, 12, 3)
align.add(item)
frame.show_all()
parameters_box.pack_start(frame, expand=False)
self.core.register_ui_section("task_parameters",
add_parameter_widget, clear_parameter_widgets)
self.core.get("register_parameter_group")("task",
changed_set_event="task-type-changed",
changed_set_list_event="task-type-list-changed",
get_current_set_func=self._get_type)
models_parameter_widget = self.core.get(
"register_parameter_section")("task", "models")
self.core.register_ui("task_parameters", "Collision models",
models_parameter_widget, weight=20)
components_parameter_widget = self.core.get(
"register_parameter_section")("task", "components")
self.core.register_ui("task_parameters", "Components",
components_parameter_widget, weight=10)
# handle table events # handle table events
self.core.register_event("task-selection-changed", self.core.register_event("task-selection-changed",
self._switch_task) self._task_switch)
self.gui.get_object("TaskNameCell").connect("edited", self.gui.get_object("TaskNameCell").connect("edited",
self._edit_task_name) self._edit_task_name)
selection = self._taskview.get_selection() selection = self._taskview.get_selection()
...@@ -90,32 +111,19 @@ class Tasks(pycam.Plugins.ListPluginBase): ...@@ -90,32 +111,19 @@ class Tasks(pycam.Plugins.ListPluginBase):
else: else:
self._treemodel.append((id(item), "Task #%d" % index)) self._treemodel.append((id(item), "Task #%d" % index))
self.core.emit_event("task-list-changed") self.core.emit_event("task-list-changed")
self._detail_handlers = [] # shape selector
for obj_name in ("FeedrateControl", "SpindleSpeedControl"): type_selector = self.gui.get_object("TaskTypeSelector")
obj = self.gui.get_object(obj_name) type_selector.connect("changed", lambda widget: \
handler = obj.connect("value-changed", self.core.emit_event("task-type-changed"))
lambda widget: self.core.emit_event("task-changed")) self.core.register_event("task-type-list-changed",
self._detail_handlers.append((obj, handler)) self._update_widgets)
self.gui.get_object("Models").get_selection().set_mode( self.core.register_event("task-selection-changed",
self._gtk.SELECTION_MULTIPLE) self._task_switch)
for obj_name in ("Models", "ToolSelector", "ProcessSelector", "BoundsSelector"):
obj = self.gui.get_object(obj_name)
obj.get_model().clear()
if hasattr(obj, "get_selection"):
obj = obj.get_selection()
handler = obj.connect("changed",
lambda widget: self.core.emit_event("task-changed"))
self._detail_handlers.append((obj, handler))
for category, event in (("models", "model-list-changed"),
("tool", "tool-list-changed"),
("process", "process-list-changed"),
("bounds", "bounds-list-changed")):
self.core.register_event(event, self._update_external_model,
category)
self._update_external_model(category)
self.core.register_event("task-changed", self._store_task) self.core.register_event("task-changed", self._store_task)
self.core.register_event("task-type-changed", self._store_task)
self.register_model_update(update_model) self.register_model_update(update_model)
self._switch_task() self._update_widgets()
self._task_switch()
self.core.set("tasks", self) self.core.set("tasks", self)
return True return True
...@@ -123,53 +131,24 @@ class Tasks(pycam.Plugins.ListPluginBase): ...@@ -123,53 +131,24 @@ class Tasks(pycam.Plugins.ListPluginBase):
if self.gui: if self.gui:
self.core.unregister_ui("main", self.gui.get_object("TaskBox")) self.core.unregister_ui("main", self.gui.get_object("TaskBox"))
self.core.unregister_event("task-selection-changed", self.core.unregister_event("task-selection-changed",
self._switch_task) self._task_switch)
self.core.unregister_event("task-selection-changed", self.core.unregister_event("task-selection-changed",
self._switch_task) self._task_switch)
self.core.unregister_event("task-changed", self._store_task) self.core.unregister_event("task-changed", self._store_task)
def _get_modelview_and_content(self, category): def get_selected(self, index=False):
model = {None: self._taskview, return self._get_selected(self._taskview, index=index)
"tool": self.gui.get_object("ToolSelector"),
"process": self.gui.get_object("ProcessSelector"),
"bounds": self.gui.get_object("BoundsSelector"),
"models": self.gui.get_object("Models")}[category]
content = {None: self,
"tool": self.core.get("tools"),
"process": self.core.get("processes"),
"bounds": self.core.get("bounds"),
"models": self.core.get("models")}[category]
return model, content
def get_selected(self, category=None, index=False):
modelview, content = self._get_modelview_and_content(category)
return self._get_selected(modelview, index=index, content=content)
def select(self, item, category=None, keep=False): def select(self, tasks):
if isinstance(item, list): print "Tasks: %s" % str(tasks)
keep = False selection = self._taskview.get_selection()
if not item: if not isinstance(tasks, (list, tuple)):
self.select(None, category=category) tasks = [tasks]
else: for index, task in enumerate(self):
for one in item: if task in tasks:
self.select(one, category=category, keep=keep)
keep = True
else:
modelview, content = self._get_modelview_and_content(category)
if (item is None) or (item in content):
if not item is None:
index = [id(entry) for entry in content].index(id(item))
if hasattr(modelview, "get_selection"):
selection = modelview.get_selection()
if not keep:
selection.unselect_all()
if not item is None:
selection.select_path((index,)) selection.select_path((index,))
else: else:
if item is None: selection.unselect_path((index,))
modelview.set_active(-1)
else:
modelview.set_active(index)
def _edit_task_name(self, cell, path, new_text): def _edit_task_name(self, cell, path, new_text):
path = int(path) path = int(path)
...@@ -177,70 +156,94 @@ class Tasks(pycam.Plugins.ListPluginBase): ...@@ -177,70 +156,94 @@ class Tasks(pycam.Plugins.ListPluginBase):
new_text: new_text:
self._treemodel[path][self.COLUMN_NAME] = new_text self._treemodel[path][self.COLUMN_NAME] = new_text
def _switch_task(self): def _get_type(self, name=None):
tasks = self.get_selected() types = self.core.get("get_parameter_sets")("task")
if tasks: if name is None:
task = tasks[0] # find the currently selected one
selector = self.gui.get_object("TaskTypeSelector")
model = selector.get_model()
index = selector.get_active()
if index < 0:
return None
type_name = model[index][1]
else: else:
task = None type_name = name
details_box = self.gui.get_object("TaskDetails") if type_name in types:
if task: return types[type_name]
# block all "change" signals for the task controls
for obj, signal_handler in self._detail_handlers:
obj.handler_block(signal_handler)
for key in ("tool", "process", "bounds", "models"):
self.select(task[key], category=key)
self.gui.get_object("FeedrateControl").set_value(task["feedrate"])
self.gui.get_object("SpindleSpeedControl").set_value(task["spindlespeed"])
# unblock the signals again
for obj, signal_handler in self._detail_handlers:
obj.handler_unblock(signal_handler)
details_box.show()
else: else:
details_box.hide() return None
def _store_task(self, widget=None): def select_type(self, name):
selector = self.gui.get_object("TaskTypeSelector")
for index, row in enumerate(selector.get_model()):
if row[1] == name:
selector.set_active(index)
break
else:
selector.set_active(-1)
def _update_widgets(self):
model = self.gui.get_object("TaskTypeList")
model.clear()
types = self.core.get("get_parameter_sets")("task").values()
types.sort(key=lambda item: item["weight"])
for one_type in types:
model.append((one_type["label"], one_type["name"]))
# check if any on the processes became obsolete due to a missing plugin
removal = []
type_names = [one_type["name"] for one_type in types]
for index, task in enumerate(self):
if not task["type"] in tape_names:
removal.append(index)
removal.reverse()
for index in removal:
self.pop(index)
# show "new" only if a strategy is available
self.gui.get_object("TaskNew").set_sensitive(len(model) > 0)
selector_box = self.gui.get_object("TaskChooserBox")
if len(model) < 2:
selector_box.hide()
else:
selector_box.show()
def _task_switch(self):
tasks = self.get_selected() tasks = self.get_selected()
if tasks: control_box = self.gui.get_object("TaskDetails")
task = tasks[0] if len(tasks) != 1:
control_box.hide()
else: else:
task = None task = tasks[0]
self.core.block_event("task-changed")
self.core.block_event("task-type-changed")
type_name = task["type"]
self.select_type(type_name)
one_type = self._get_type(type_name)
self.core.get("set_parameter_values")("task", task["parameters"])
control_box.show()
self.core.unblock_event("task-type-changed")
self.core.unblock_event("task-changed")
# trigger a widget update
self.core.emit_event("task-type-changed")
def _store_task(self, widget=None):
tasks = self.get_selected()
details_box = self.gui.get_object("TaskDetails") details_box = self.gui.get_object("TaskDetails")
if task is None: task_type = self._get_type()
if (len(tasks) != 1) or not task_type:
details_box.hide() details_box.hide()
return
else: else:
task["feedrate"] = self.gui.get_object("FeedrateControl").get_value() task = tasks[0]
task["spindlespeed"] = self.gui.get_object("SpindleSpeedControl").get_value() task["type"] = task_type["name"]
for key in ("tool", "process", "bounds", "models"): parameters = task["parameters"]
task[key] = self.get_selected(category=key) parameters.update(self.core.get("get_parameter_values")("task"))
details_box.show() details_box.show()
def _update_external_model(self, category):
modelview, content = self._get_modelview_and_content(category)
ids = [id(item) for item in content]
model = modelview.get_model()
for index, one_id in enumerate(ids):
while (len(model) > index) and \
(model[index][self.COLUMN_REF] != one_id):
index_iter = model.get_iter((index, ))
if model[index][self.COLUMN_REF] in ids:
# move it to the end of the list
model.move_before(index_iter, None)
else:
model.remove(index_iter)
if len(model) <= index:
name = content.get_attr(content[index], "name", id_col=self.COLUMN_REF)
model.append((one_id, name))
def _task_new(self, *args): def _task_new(self, *args):
new_task = { types = self.core.get("get_parameter_sets")("task").values()
"models": [], types.sort(key=lambda item: item["weight"])
"tool": [], one_type = types[0]
"process": [], new_task = {"type": one_type["name"],
"bounds": [], "parameters": one_type["parameters"].copy(),
"feedrate": 300,
"spindlespeed": 1000,
} }
self.append(new_task) self.append(new_task)
self.select(new_task) self.select(new_task)
...@@ -262,58 +265,6 @@ class Tasks(pycam.Plugins.ListPluginBase): ...@@ -262,58 +265,6 @@ class Tasks(pycam.Plugins.ListPluginBase):
def _generate_all_toolpaths(self, widget=None): def _generate_all_toolpaths(self, widget=None):
self.generate_toolpaths(self) self.generate_toolpaths(self)
def _get_path_generator(self, process):
if process["PushRemoveStrategy"]:
processor = pycam.PathProcessors.SimpleCutter.SimpleCutter
generator = pycam.PathGenerators.PushCutter.PushCutter
elif process["ContourPolygonStrategy"]:
processor = pycam.PathProcessors.ContourCutter.ContourCutter
generator = pycam.PathGenerators.PushCutter.PushCutter
elif process["ContourFollowStrategy"]:
processor = pycam.PathProcessors.SimpleCutter.SimpleCutter
generator = pycam.PathGenerators.ContourFollow.ContourFollow
elif process["SurfaceStrategy"]:
processor = pycam.PathProcessors.PathAccumulator.PathAccumulator
generator = pycam.PathGenerators.DropCutter.DropCutter
elif process["EngraveStrategy"]:
processor = pycam.PathProcessors.SimpleCutter.SimpleCutter
generator = pycam.PathGenerators.EngraveCutter.EngraveCutter
else:
self.log.error("Unknown path strategy: %s" % str(process))
return
# TODO: "physics" should be set, as well
return generator(processor(), physics=None)
def _get_motion_grid(self, tool, process, bounds, models):
step_width = float(tool.radius) / 4.0
milling_style_map = {
"MillingStyleConventional": MILLING_STYLE_CONVENTIONAL,
"MillingStyleClimb": MILLING_STYLE_CLIMB,
"MillingStyleIgnore": MILLING_STYLE_IGNORE,
}
for key in milling_style_map:
if process[key]:
milling_style = milling_style_map[key]
break
grid_direction_map = {"GridDirectionX": GRID_DIRECTION_X,
"GridDirectionY": GRID_DIRECTION_Y,
"GridDirectionXY": GRID_DIRECTION_XY,
}
for key in grid_direction_map:
if process[key]:
grid_direction = grid_direction_map[key]
break
line_distance = 2 * float(tool.radius) * \
(1 - 0.01 * float(process["OverlapPercent"]))
# TODO: handle offset and pocketing
if process["EngraveStrategy"]:
return get_lines_grid(models, bounds, process["MaxStepDown"],
step_width=step_width, milling_style=milling_style)
else:
return get_fixed_grid(bounds, process["MaxStepDown"],
line_distance=line_distance, grid_direction=grid_direction,
milling_style=milling_style)
def generate_toolpath(self, task, progress=None): def generate_toolpath(self, task, progress=None):
models = task["models"] models = task["models"]
tool = task["tool"] tool = task["tool"]
......
...@@ -32,7 +32,7 @@ class ToolParamRadius(pycam.Plugins.PluginBase): ...@@ -32,7 +32,7 @@ class ToolParamRadius(pycam.Plugins.PluginBase):
def setup(self): def setup(self):
control = pycam.Gui.ControlsGTK.InputNumber(lower=0, upper=99, digits=0, control = pycam.Gui.ControlsGTK.InputNumber(lower=0, upper=99, digits=0,
change_handler=lambda widget=None: self.core.emit_event( change_handler=lambda widget=None: self.core.emit_event(
"tool-parameter-changed")) "tool-changed"))
control.set_conversion(set_conv=lambda value: value * 2.0, control.set_conversion(set_conv=lambda value: value * 2.0,
get_conv=lambda value: value / 2.0) get_conv=lambda value: value / 2.0)
self.core.get("register_parameter")("tool", "size", "radius", self.core.get("register_parameter")("tool", "size", "radius",
...@@ -50,7 +50,7 @@ class ToolParamTorusRadius(pycam.Plugins.PluginBase): ...@@ -50,7 +50,7 @@ class ToolParamTorusRadius(pycam.Plugins.PluginBase):
def setup(self): def setup(self):
control = pycam.Gui.ControlsGTK.InputNumber(lower=0, upper=99, digits=0, control = pycam.Gui.ControlsGTK.InputNumber(lower=0, upper=99, digits=0,
change_handler=lambda widget=None: self.core.emit_event( change_handler=lambda widget=None: self.core.emit_event(
"tool-parameter-changed")) "tool-changed"))
self.core.get("register_parameter")("tool", "size", "torus_radius", self.core.get("register_parameter")("tool", "size", "torus_radius",
"Torus radius", control, weight=20) "Torus radius", control, weight=20)
return True return True
...@@ -66,7 +66,7 @@ class ToolParamFeedrate(pycam.Plugins.PluginBase): ...@@ -66,7 +66,7 @@ class ToolParamFeedrate(pycam.Plugins.PluginBase):
def setup(self): def setup(self):
control = pycam.Gui.ControlsGTK.InputNumber(lower=0, upper=10000, control = pycam.Gui.ControlsGTK.InputNumber(lower=0, upper=10000,
digits=0, change_handler=lambda widget=None: \ digits=0, change_handler=lambda widget=None: \
self.core.emit_event("tool-parameter-changed")) self.core.emit_event("tool-changed"))
self.core.get("register_parameter")("tool", "speed", "feedrate", self.core.get("register_parameter")("tool", "speed", "feedrate",
"Feedrate", control, weight=10) "Feedrate", control, weight=10)
return True return True
...@@ -82,7 +82,7 @@ class ToolParamSpindleSpeed(pycam.Plugins.PluginBase): ...@@ -82,7 +82,7 @@ class ToolParamSpindleSpeed(pycam.Plugins.PluginBase):
def setup(self): def setup(self):
control = pycam.Gui.ControlsGTK.InputNumber(lower=0, upper=100000, control = pycam.Gui.ControlsGTK.InputNumber(lower=0, upper=100000,
digits=0, change_handler=lambda widget=None: \ digits=0, change_handler=lambda widget=None: \
self.core.emit_event("tool-parameter-changed")) self.core.emit_event("tool-changed"))
self.core.get("register_parameter")("tool", "speed", "spindle_speed", self.core.get("register_parameter")("tool", "speed", "spindle_speed",
"Spindle speed", control, weight=20) "Spindle speed", control, weight=20)
return True return True
......
...@@ -51,10 +51,7 @@ class Tools(pycam.Plugins.ListPluginBase): ...@@ -51,10 +51,7 @@ class Tools(pycam.Plugins.ListPluginBase):
parameters_box.foreach( parameters_box.foreach(
lambda widget: parameters_box.remove(widget)) lambda widget: parameters_box.remove(widget))
def add_parameter_widget(item, name): def add_parameter_widget(item, name):
# create a frame with an align and the item inside # create a frame within an alignment and the item inside
if len(parameters_box.get_children()) > 0:
# add a separator between two content blocks
parameters_box.pack_start(gtk.VSeparator())
frame_label = gtk.Label() frame_label = gtk.Label()
frame_label.set_markup("<b>%s</b>" % name) frame_label.set_markup("<b>%s</b>" % name)
frame = gtk.Frame() frame = gtk.Frame()
...@@ -67,7 +64,6 @@ class Tools(pycam.Plugins.ListPluginBase): ...@@ -67,7 +64,6 @@ class Tools(pycam.Plugins.ListPluginBase):
parameters_box.pack_start(frame, expand=True) parameters_box.pack_start(frame, expand=True)
self.core.register_ui_section("tool_parameters", self.core.register_ui_section("tool_parameters",
add_parameter_widget, clear_parameter_widgets) add_parameter_widget, clear_parameter_widgets)
selector = self.gui.get_object("ToolShapeSelector")
self.core.get("register_parameter_group")("tool", self.core.get("register_parameter_group")("tool",
changed_set_event="tool-shape-changed", changed_set_event="tool-shape-changed",
changed_set_list_event="tool-shape-list-changed", changed_set_list_event="tool-shape-list-changed",
...@@ -80,6 +76,7 @@ class Tools(pycam.Plugins.ListPluginBase): ...@@ -80,6 +76,7 @@ class Tools(pycam.Plugins.ListPluginBase):
"tool", "speed") "tool", "speed")
self.core.register_ui("tool_parameters", "Speed", self.core.register_ui("tool_parameters", "Speed",
speed_parameter_widget, weight=20) speed_parameter_widget, weight=20)
# table updates
cell = self.gui.get_object("ToolTableShapeCell") cell = self.gui.get_object("ToolTableShapeCell")
self.gui.get_object("ToolTableShapeColumn").set_cell_data_func( self.gui.get_object("ToolTableShapeColumn").set_cell_data_func(
cell, self._render_tool_shape) cell, self._render_tool_shape)
...@@ -107,20 +104,21 @@ class Tools(pycam.Plugins.ListPluginBase): ...@@ -107,20 +104,21 @@ class Tools(pycam.Plugins.ListPluginBase):
selection.connect("changed", selection.connect("changed",
lambda widget, event: self.core.emit_event(event), lambda widget, event: self.core.emit_event(event),
"tool-selection-changed") "tool-selection-changed")
# shape selector
shape_selector = self.gui.get_object("ToolShapeSelector") shape_selector = self.gui.get_object("ToolShapeSelector")
shape_selector.connect("changed", lambda widget: \ shape_selector.connect("changed", lambda widget: \
self.core.emit_event("tool-shape-changed")) self.core.emit_event("tool-shape-changed"))
self.core.register_event("tool-shape-list-changed", self.core.register_event("tool-shape-list-changed",
self._update_widgets) self._update_widgets)
self.register_model_update(update_model)
self.core.register_event("tool-selection-changed", self.core.register_event("tool-selection-changed",
self._tool_change) self._tool_switch)
self.core.register_event("tool-parameter-changed", self.core.register_event("tool-changed",
self._store_tool_settings) self._store_tool_settings)
self.core.register_event("tool-shape-changed", self.core.register_event("tool-shape-changed",
self._store_tool_settings) self._store_tool_settings)
self.register_model_update(update_model)
self._update_widgets() self._update_widgets()
self._tool_change() self._tool_switch()
self.core.set("tools", self) self.core.set("tools", self)
return True return True
...@@ -128,7 +126,7 @@ class Tools(pycam.Plugins.ListPluginBase): ...@@ -128,7 +126,7 @@ class Tools(pycam.Plugins.ListPluginBase):
if self.gui: if self.gui:
self.core.unregister_ui("main", self.gui.get_object("ToolBox")) self.core.unregister_ui("main", self.gui.get_object("ToolBox"))
self.core.unregister_event("tool-selection-changed", self.core.unregister_event("tool-selection-changed",
self._tool_change) self._tool_switch)
self.core.set("tools", None) self.core.set("tools", None)
return True return True
...@@ -201,10 +199,9 @@ class Tools(pycam.Plugins.ListPluginBase): ...@@ -201,10 +199,9 @@ class Tools(pycam.Plugins.ListPluginBase):
cell.set_cell_data_func(renderer, self._render_tool_shape) cell.set_cell_data_func(renderer, self._render_tool_shape)
def _update_widgets(self): def _update_widgets(self):
# TODO: keep the current selection
model = self.gui.get_object("ToolShapeList") model = self.gui.get_object("ToolShapeList")
model.clear() model.clear()
shapes = list(self.core.get("get_parameter_sets")("tool").values()) shapes = self.core.get("get_parameter_sets")("tool").values()
shapes.sort(key=lambda item: item["weight"]) shapes.sort(key=lambda item: item["weight"])
for shape in shapes: for shape in shapes:
model.append((shape["label"], shape["name"])) model.append((shape["label"], shape["name"]))
...@@ -219,6 +216,11 @@ class Tools(pycam.Plugins.ListPluginBase): ...@@ -219,6 +216,11 @@ class Tools(pycam.Plugins.ListPluginBase):
self.pop(index) self.pop(index)
# show "new" only if a strategy is available # show "new" only if a strategy is available
self.gui.get_object("ToolNew").set_sensitive(len(model) > 0) self.gui.get_object("ToolNew").set_sensitive(len(model) > 0)
selector_box = self.gui.get_object("ToolSelectorBox")
if len(model) < 2:
selector_box.hide()
else:
selector_box.show()
def _store_tool_settings(self): def _store_tool_settings(self):
tool = self.get_selected() tool = self.get_selected()
...@@ -233,13 +235,13 @@ class Tools(pycam.Plugins.ListPluginBase): ...@@ -233,13 +235,13 @@ class Tools(pycam.Plugins.ListPluginBase):
control_box.show() control_box.show()
self._trigger_table_update() self._trigger_table_update()
def _tool_change(self, widget=None, data=None): def _tool_switch(self, widget=None, data=None):
tool = self.get_selected() tool = self.get_selected()
control_box = self.gui.get_object("ToolSettingsControlsBox") control_box = self.gui.get_object("ToolSettingsControlsBox")
if not tool: if not tool:
control_box.hide() control_box.hide()
else: else:
self.core.block_event("tool-parameter-changed") self.core.block_event("tool-changed")
self.core.block_event("tool-shape-changed") self.core.block_event("tool-shape-changed")
shape_name = tool["shape"] shape_name = tool["shape"]
self.select_shape(shape_name) self.select_shape(shape_name)
...@@ -247,7 +249,7 @@ class Tools(pycam.Plugins.ListPluginBase): ...@@ -247,7 +249,7 @@ class Tools(pycam.Plugins.ListPluginBase):
self.core.get("set_parameter_values")("tool", tool["parameters"]) self.core.get("set_parameter_values")("tool", tool["parameters"])
control_box.show() control_box.show()
self.core.unblock_event("tool-shape-changed") self.core.unblock_event("tool-shape-changed")
self.core.unblock_event("tool-parameter-changed") self.core.unblock_event("tool-changed")
# trigger a widget update # trigger a widget update
self.core.emit_event("tool-shape-changed") self.core.emit_event("tool-shape-changed")
...@@ -260,3 +262,4 @@ class Tools(pycam.Plugins.ListPluginBase): ...@@ -260,3 +262,4 @@ class Tools(pycam.Plugins.ListPluginBase):
} }
self.append(new_tool) self.append(new_tool)
self.select(new_tool) self.select(new_tool)
...@@ -405,7 +405,7 @@ class ListPluginBase(PluginBase, list): ...@@ -405,7 +405,7 @@ class ListPluginBase(PluginBase, list):
# TODO: "self.treemodel" should not be used here # TODO: "self.treemodel" should not be used here
model = self._treemodel model = self._treemodel
if id_col is None: if id_col is None:
id_col = self.COLUMN_ID id_col = self.COLUMN_REF
if attr in self.LIST_ATTRIBUTE_MAP: if attr in self.LIST_ATTRIBUTE_MAP:
col = self.LIST_ATTRIBUTE_MAP[attr] col = self.LIST_ATTRIBUTE_MAP[attr]
for index in range(len(model)): for index in range(len(model)):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment