From 11e97b8f233c8084de225353e4ee475c42ea8143 Mon Sep 17 00:00:00 2001 From: Hans Unzner Date: Fri, 14 Mar 2025 15:42:57 +0100 Subject: [PATCH 1/4] refactor step 1: unify create functions --- viaconstructor/viaconstructor.py | 70 ++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/viaconstructor/viaconstructor.py b/viaconstructor/viaconstructor.py index 5353dd0..7801ee1 100755 --- a/viaconstructor/viaconstructor.py +++ b/viaconstructor/viaconstructor.py @@ -2127,7 +2127,24 @@ def update_global_setup(self) -> None: eprint(f"Unknown setup-type: {entry['type']}") def create_global_setup(self, tabwidget) -> None: + titles = { + "mill": _("M&ill"), + "tool": _("&Tool"), + "workpiece": _("&Workpiece"), + "pockets": _("P&ockets"), + "tabs": _("Ta&bs"), + "leads": _("Lea&ds"), + "machine": _("M&achine"), + "view": _("&View"), + } for sname in self.project["setup_defaults"]: + # show_section = False + # for entry in self.project["setup_defaults"][sname].values(): + # if entry.get("per_object", False): + # show_section = True + # if not show_section: + # continue + scrollarea = QScrollArea() scrollarea.setWidgetResizable(True) vcontainer = QWidget() @@ -2135,26 +2152,18 @@ def create_global_setup(self, tabwidget) -> None: vlayout.setContentsMargins(0, 10, 0, 0) scrollarea.setWidget(vcontainer) - titles = { - "mill": _("M&ill"), - "tool": _("&Tool"), - "workpiece": _("&Workpiece"), - "pockets": _("P&ockets"), - "tabs": _("Ta&bs"), - "leads": _("Lea&ds"), - "machine": _("M&achine"), - "view": _("&View"), - } tabwidget.addTab(scrollarea, titles.get(sname, sname)) streched = False for ename, entry in self.project["setup_defaults"][sname].items(): + # if not entry.get("per_object", False): + # continue helptext = entry.get("tooltip", f"{sname}/{ename}") container = QWidget() hlayout = QHBoxLayout(container) hlayout.setContentsMargins(10, 0, 10, 0) - label = QLabel(entry.get("title", ename)) - label.setToolTip(helptext) - hlayout.addWidget(label) + entry["widget"] = QLabel(entry.get("title", ename)) + entry["widget"].setToolTip(helptext) + hlayout.addWidget(entry["widget"]) vlayout.addWidget(container) hlayout.addStretch(1) if entry["type"] == "bool": @@ -2228,7 +2237,7 @@ def create_global_setup(self, tabwidget) -> None: self.project["setup"][sname][ename].append(new_row) table = QTableWidget() - label.setToolTip(helptext) + table.setToolTip(helptext) table.setRowCount(len(self.project["setup"][sname][ename])) idxf_offset = 0 table.setColumnCount(len(entry["columns"])) @@ -2248,7 +2257,8 @@ def create_global_setup(self, tabwidget) -> None: table.setCellWidget(row_idx, 0, button) table.resizeColumnToContents(0) for col_idx, key in enumerate(entry["columns"]): - item = QTableWidgetItem(str(row.get(key, 0))) + ##### + item = QTableWidgetItem(str(row[key])) table.setItem( row_idx, col_idx + idxf_offset, @@ -2444,6 +2454,13 @@ def update_layer_setup(self) -> None: tab_idx += 1 def create_layer_setup(self, tabwidget) -> None: + titles = { + "mill": _("M&ill"), + "tool": _("&Tool"), + "pockets": _("P&ockets"), + "tabs": _("Ta&bs"), + "leads": _("Lea&ds"), + } for sname in self.project["setup_defaults"]: show_section = False for entry in self.project["setup_defaults"][sname].values(): @@ -2451,14 +2468,6 @@ def create_layer_setup(self, tabwidget) -> None: show_section = True if not show_section: continue - - titles = { - "mill": "Mill", - "tool": "Tool", - "pockets": "Pockets", - "tabs": "Tabs", - "leads": "Leads", - } scrollarea = QScrollArea() scrollarea.setWidgetResizable(True) vcontainer = QWidget() @@ -2712,6 +2721,13 @@ def update_object_setup(self) -> None: tab_idx += 1 def create_object_setup(self, tabwidget) -> None: + titles = { + "mill": _("M&ill"), + "tool": _("&Tool"), + "pockets": _("P&ockets"), + "tabs": _("Ta&bs"), + "leads": _("Lea&ds"), + } for sname in self.project["setup_defaults"]: show_section = False for entry in self.project["setup_defaults"][sname].values(): @@ -2719,14 +2735,6 @@ def create_object_setup(self, tabwidget) -> None: show_section = True if not show_section: continue - - titles = { - "mill": "Mill", - "tool": "Tool", - "pockets": "Pockets", - "tabs": "Tabs", - "leads": "Leads", - } scrollarea = QScrollArea() scrollarea.setWidgetResizable(True) vcontainer = QWidget() From bfc8e245b1a57ba7dbe29dbb1a6b24685eff3232 Mon Sep 17 00:00:00 2001 From: Hans Unzner Date: Thu, 13 Mar 2025 16:33:19 +0100 Subject: [PATCH 2/4] refactor step 2: common function for common tabs --- viaconstructor/viaconstructor.py | 567 ++++++++----------------------- 1 file changed, 149 insertions(+), 418 deletions(-) diff --git a/viaconstructor/viaconstructor.py b/viaconstructor/viaconstructor.py index 7801ee1..f07439e 100755 --- a/viaconstructor/viaconstructor.py +++ b/viaconstructor/viaconstructor.py @@ -2138,152 +2138,13 @@ def create_global_setup(self, tabwidget) -> None: "view": _("&View"), } for sname in self.project["setup_defaults"]: - # show_section = False - # for entry in self.project["setup_defaults"][sname].values(): - # if entry.get("per_object", False): - # show_section = True - # if not show_section: - # continue - - scrollarea = QScrollArea() - scrollarea.setWidgetResizable(True) - vcontainer = QWidget() - vlayout = QVBoxLayout(vcontainer) - vlayout.setContentsMargins(0, 10, 0, 0) - scrollarea.setWidget(vcontainer) - - tabwidget.addTab(scrollarea, titles.get(sname, sname)) - streched = False - for ename, entry in self.project["setup_defaults"][sname].items(): - # if not entry.get("per_object", False): - # continue - helptext = entry.get("tooltip", f"{sname}/{ename}") - container = QWidget() - hlayout = QHBoxLayout(container) - hlayout.setContentsMargins(10, 0, 10, 0) - entry["widget"] = QLabel(entry.get("title", ename)) - entry["widget"].setToolTip(helptext) - hlayout.addWidget(entry["widget"]) - vlayout.addWidget(container) - hlayout.addStretch(1) - if entry["type"] == "bool": - checkbox = QCheckBox() - checkbox.setChecked(self.project["setup"][sname][ename]) - checkbox.setToolTip(helptext) - checkbox.stateChanged.connect(self.global_changed) # type: ignore - hlayout.addWidget(checkbox) - entry["widget"] = checkbox - elif entry["type"] == "select": - combobox = QComboBox() - for option in entry["options"]: - combobox.addItem(option[0]) - combobox.setCurrentText(self.project["setup"][sname][ename]) - combobox.setToolTip(helptext) - combobox.currentTextChanged.connect(self.global_changed) # type: ignore - hlayout.addWidget(combobox) - entry["widget"] = combobox - elif entry["type"] == "color": - color = self.project["setup"][sname][ename] - rgb = f"{color[0] * 255:1.0f},{color[1] * 255:1.0f},{color[2] * 255:1.0f}" - button = QPushButton(rgb) - button.setStyleSheet(f"background-color:rgb({rgb})") - button.setToolTip(helptext) - button.clicked.connect(partial(self.color_select, sname, ename)) # type: ignore - hlayout.addWidget(button) - entry["widget"] = button - elif entry["type"] == "float": - dspinbox = QDoubleSpinBox() - dspinbox.setDecimals(entry.get("decimals", 4)) - dspinbox.setSingleStep(entry.get("step", 1.0)) - dspinbox.setMinimum(entry["min"]) - dspinbox.setMaximum(entry["max"]) - dspinbox.setValue(self.project["setup"][sname][ename]) - dspinbox.setToolTip(helptext) - dspinbox.valueChanged.connect(self.global_changed) # type: ignore - hlayout.addWidget(dspinbox) - entry["widget"] = dspinbox - elif entry["type"] == "int": - spinbox = QSpinBox() - spinbox.setSingleStep(entry.get("step", 1)) - spinbox.setMinimum(entry["min"]) - spinbox.setMaximum(entry["max"]) - spinbox.setValue(self.project["setup"][sname][ename]) - spinbox.setToolTip(helptext) - spinbox.valueChanged.connect(self.global_changed) # type: ignore - hlayout.addWidget(spinbox) - entry["widget"] = spinbox - elif entry["type"] == "str": - lineedit = QLineEdit() - lineedit.setText(self.project["setup"][sname][ename]) - lineedit.setToolTip(helptext) - lineedit.textChanged.connect(self.global_changed) # type: ignore - hlayout.addWidget(lineedit) - entry["widget"] = lineedit - elif entry["type"] == "mstr": - mlineedit = QPlainTextEdit() - mlineedit.setPlainText(self.project["setup"][sname][ename]) - mlineedit.setToolTip(helptext) - mlineedit.textChanged.connect(self.global_changed) # type: ignore - mlineedit.setFixedHeight(27) - hlayout.addWidget(mlineedit) - entry["widget"] = mlineedit - elif entry["type"] == "table": - # add empty row if not exist - first_element = list(entry["columns"].keys())[0] - if entry.get("column_defaults") is not None and str(self.project["setup"][sname][ename][-1][first_element]) != "": - new_row = {} - for key, default in entry["column_defaults"].items(): - new_row[key] = default - self.project["setup"][sname][ename].append(new_row) - - table = QTableWidget() - table.setToolTip(helptext) - table.setRowCount(len(self.project["setup"][sname][ename])) - idxf_offset = 0 - table.setColumnCount(len(entry["columns"])) - if entry["selectable"]: - table.setColumnCount(len(entry["columns"]) + 1) - table.setHorizontalHeaderItem(0, QTableWidgetItem("Select")) - idxf_offset = 1 - for col_idx, title in enumerate(entry["columns"]): - title = entry["columns"][title].get("title", title) - table.setHorizontalHeaderItem(col_idx + idxf_offset, QTableWidgetItem(title)) - for row_idx, row in enumerate(self.project["setup"][sname][ename]): - if entry["selectable"]: - button = QPushButton() - button.setIcon(QIcon(os.path.join(self.module_root, "icons", "select.png"))) - button.setToolTip(_("select this row")) - button.clicked.connect(partial(self.table_select, sname, ename, row_idx)) # type: ignore - table.setCellWidget(row_idx, 0, button) - table.resizeColumnToContents(0) - for col_idx, key in enumerate(entry["columns"]): - ##### - item = QTableWidgetItem(str(row[key])) - table.setItem( - row_idx, - col_idx + idxf_offset, - item, - ) - # if entry["columns"][key].get("ro", False): - # item.setFlags(Qt.ItemIsEditable) - table.resizeColumnToContents(col_idx + idxf_offset) - table.itemChanged.connect(self.global_changed) # type: ignore - vlayout.addWidget(table, stretch=1) - streched = True - entry["widget"] = table - else: - eprint(f"Unknown setup-type: {entry['type']}") - - unit = entry.get("unit", "") - if unit == "LINEARMEASURE": - unit = self.project["setup"]["machine"]["unit"] - - ulabel = QLabel(unit) - ulabel.setMinimumWidth(36) - ulabel.setFont(QFont("Arial", 9)) - hlayout.addWidget(ulabel) - if not streched: - vlayout.addStretch(1) + # show_section = False + # for entry in self.project["setup_defaults"][sname].values(): + # if entry.get("per_object", False): + # show_section = True + # if not show_section: + # continue + self.create_common(tabwidget, "widget", titles, sname, self.global_changed) def object_info_text(self, object_active_obj): if object_active_obj: @@ -2453,6 +2314,146 @@ def update_layer_setup(self) -> None: self.tabobjwidget.setTabText(tab_idx, f"{titles.get(sname, sname)}") tab_idx += 1 + def create_common(self, tabwidget, widget_name, titles, sname, change_func): + scrollarea = QScrollArea() + scrollarea.setWidgetResizable(True) + vcontainer = QWidget() + vlayout = QVBoxLayout(vcontainer) + vlayout.setContentsMargins(0, 10, 0, 0) + scrollarea.setWidget(vcontainer) + tabwidget.addTab(scrollarea, titles.get(sname, sname)) + + streched = False + for ename, entry in self.project["setup_defaults"][sname].items(): + # if not entry.get("per_object", False): + # continue + helptext = entry.get("tooltip", f"{sname}/{ename}") + container = QWidget() + hlayout = QHBoxLayout(container) + hlayout.setContentsMargins(10, 0, 10, 0) + entry[widget_name + "_label"] = QLabel(entry.get("title", ename)) + entry[widget_name + "_label"].setToolTip(helptext) + hlayout.addWidget(entry[widget_name + "_label"]) + vlayout.addWidget(container) + hlayout.addStretch(1) + if entry["type"] == "bool": + checkbox = QCheckBox() + checkbox.setChecked(self.project["setup"][sname][ename]) + checkbox.setToolTip(helptext) + checkbox.stateChanged.connect(change_func) # type: ignore + hlayout.addWidget(checkbox) + entry[widget_name] = checkbox + elif entry["type"] == "select": + combobox = QComboBox() + for option in entry["options"]: + combobox.addItem(option[0]) + combobox.setCurrentText(self.project["setup"][sname][ename]) + combobox.setToolTip(helptext) + combobox.currentTextChanged.connect(change_func) # type: ignore + hlayout.addWidget(combobox) + entry[widget_name] = combobox + elif entry["type"] == "color": + color = self.project["setup"][sname][ename] + rgb = f"{color[0] * 255:1.0f},{color[1] * 255:1.0f},{color[2] * 255:1.0f}" + button = QPushButton(rgb) + button.setStyleSheet(f"background-color:rgb({rgb})") + button.setToolTip(helptext) + button.clicked.connect(partial(self.color_select, sname, ename)) # type: ignore + hlayout.addWidget(button) + entry[widget_name] = button + elif entry["type"] == "float": + dspinbox = QDoubleSpinBox() + dspinbox.setDecimals(entry.get("decimals", 4)) + dspinbox.setSingleStep(entry.get("step", 1.0)) + dspinbox.setMinimum(entry["min"]) + dspinbox.setMaximum(entry["max"]) + dspinbox.setValue(self.project["setup"][sname][ename]) + dspinbox.setToolTip(helptext) + dspinbox.valueChanged.connect(change_func) # type: ignore + hlayout.addWidget(dspinbox) + entry[widget_name] = dspinbox + elif entry["type"] == "int": + spinbox = QSpinBox() + spinbox.setSingleStep(entry.get("step", 1)) + spinbox.setMinimum(entry["min"]) + spinbox.setMaximum(entry["max"]) + spinbox.setValue(self.project["setup"][sname][ename]) + spinbox.setToolTip(helptext) + spinbox.valueChanged.connect(change_func) # type: ignore + hlayout.addWidget(spinbox) + entry[widget_name] = spinbox + elif entry["type"] == "str": + lineedit = QLineEdit() + lineedit.setText(self.project["setup"][sname][ename]) + lineedit.setToolTip(helptext) + lineedit.textChanged.connect(change_func) # type: ignore + hlayout.addWidget(lineedit) + entry[widget_name] = lineedit + elif entry["type"] == "mstr": + mlineedit = QPlainTextEdit() + mlineedit.setPlainText(self.project["setup"][sname][ename]) + mlineedit.setToolTip(helptext) + mlineedit.textChanged.connect(change_func) # type: ignore + mlineedit.setFixedHeight(27) + hlayout.addWidget(mlineedit) + entry[widget_name] = mlineedit + elif entry["type"] == "table": + # add empty row if not exist + first_element = list(entry["columns"].keys())[0] + if entry.get("column_defaults") is not None and str(self.project["setup"][sname][ename][-1][first_element]) != "": + new_row = {} + for key, default in entry["column_defaults"].items(): + new_row[key] = default + self.project["setup"][sname][ename].append(new_row) + + table = QTableWidget() + table.setToolTip(helptext) + table.setRowCount(len(self.project["setup"][sname][ename])) + idxf_offset = 0 + table.setColumnCount(len(entry["columns"])) + if entry["selectable"]: + table.setColumnCount(len(entry["columns"]) + 1) + table.setHorizontalHeaderItem(0, QTableWidgetItem("Select")) + idxf_offset = 1 + for col_idx, title in enumerate(entry["columns"]): + title = entry["columns"][title].get("title", title) + table.setHorizontalHeaderItem(col_idx + idxf_offset, QTableWidgetItem(title)) + for row_idx, row in enumerate(self.project["setup"][sname][ename]): + if entry["selectable"]: + button = QPushButton() + button.setIcon(QIcon(os.path.join(self.module_root, "icons", "select.png"))) + button.setToolTip(_("select this row")) + button.clicked.connect(partial(self.table_select, sname, ename, row_idx)) # type: ignore + table.setCellWidget(row_idx, 0, button) + table.resizeColumnToContents(0) + for col_idx, key in enumerate(entry["columns"]): + item = QTableWidgetItem(str(row[key])) + table.setItem( + row_idx, + col_idx + idxf_offset, + item, + ) + # if entry["columns"][key].get("ro", False): + # item.setFlags(Qt.ItemIsEditable) + table.resizeColumnToContents(col_idx + idxf_offset) + table.itemChanged.connect(change_func) # type: ignore + vlayout.addWidget(table, stretch=1) + streched = True + entry[widget_name] = table + else: + eprint(f"Unknown setup-type: {entry['type']}") + + unit = entry.get("unit", "") + if unit == "LINEARMEASURE": + unit = self.project["setup"]["machine"]["unit"] + + ulabel = QLabel(unit) + ulabel.setMinimumWidth(36) + ulabel.setFont(QFont("Arial", 9)) + hlayout.addWidget(ulabel) + if not streched: + vlayout.addStretch(1) + def create_layer_setup(self, tabwidget) -> None: titles = { "mill": _("M&ill"), @@ -2468,142 +2469,7 @@ def create_layer_setup(self, tabwidget) -> None: show_section = True if not show_section: continue - scrollarea = QScrollArea() - scrollarea.setWidgetResizable(True) - vcontainer = QWidget() - vlayout = QVBoxLayout(vcontainer) - vlayout.setContentsMargins(0, 10, 0, 0) - scrollarea.setWidget(vcontainer) - tabwidget.addTab(scrollarea, titles.get(sname, sname)) - streched = False - for ename, entry in self.project["setup_defaults"][sname].items(): - if not entry.get("per_object", False): - continue - helptext = entry.get("tooltip", f"{sname}/{ename}") - container = QWidget() - hlayout = QHBoxLayout(container) - hlayout.setContentsMargins(10, 0, 10, 0) - entry["widget_lay_label"] = QLabel(entry.get("title", ename)) - entry["widget_lay_label"].setToolTip(helptext) - hlayout.addWidget(entry["widget_lay_label"]) - vlayout.addWidget(container) - hlayout.addStretch(1) - if entry["type"] == "bool": - checkbox = QCheckBox() - checkbox.setChecked(self.project["setup"][sname][ename]) - checkbox.setToolTip(helptext) - checkbox.stateChanged.connect(self.layer_changed) # type: ignore - hlayout.addWidget(checkbox) - entry["widget_lay"] = checkbox - elif entry["type"] == "select": - combobox = QComboBox() - for option in entry["options"]: - combobox.addItem(option[0]) - combobox.setCurrentText(self.project["setup"][sname][ename]) - combobox.setToolTip(helptext) - combobox.currentTextChanged.connect(self.layer_changed) # type: ignore - hlayout.addWidget(combobox) - entry["widget_lay"] = combobox - elif entry["type"] == "color": - color = self.project["setup"][sname][ename] - rgb = f"{color[0] * 255:1.0f},{color[1] * 255:1.0f},{color[2] * 255:1.0f}" - button = QPushButton(rgb) - button.setStyleSheet(f"background-color:rgb({rgb})") - button.setToolTip(helptext) - button.clicked.connect(partial(self.color_select, sname, ename)) # type: ignore - hlayout.addWidget(button) - entry["widget_lay"] = button - elif entry["type"] == "float": - dspinbox = QDoubleSpinBox() - dspinbox.setDecimals(entry.get("decimals", 4)) - dspinbox.setSingleStep(entry.get("step", 1.0)) - dspinbox.setMinimum(entry["min"]) - dspinbox.setMaximum(entry["max"]) - dspinbox.setValue(self.project["setup"][sname][ename]) - dspinbox.setToolTip(helptext) - dspinbox.valueChanged.connect(self.layer_changed) # type: ignore - hlayout.addWidget(dspinbox) - entry["widget_lay"] = dspinbox - elif entry["type"] == "int": - spinbox = QSpinBox() - spinbox.setSingleStep(entry.get("step", 1)) - spinbox.setMinimum(entry["min"]) - spinbox.setMaximum(entry["max"]) - spinbox.setValue(self.project["setup"][sname][ename]) - spinbox.setToolTip(helptext) - spinbox.valueChanged.connect(self.layer_changed) # type: ignore - hlayout.addWidget(spinbox) - entry["widget_lay"] = spinbox - elif entry["type"] == "str": - lineedit = QLineEdit() - lineedit.setText(self.project["setup"][sname][ename]) - lineedit.setToolTip(helptext) - lineedit.textChanged.connect(self.layer_changed) # type: ignore - hlayout.addWidget(lineedit) - entry["widget_lay"] = lineedit - elif entry["type"] == "mstr": - mlineedit = QPlainTextEdit() - mlineedit.setPlainText(self.project["setup"][sname][ename]) - mlineedit.setToolTip(helptext) - mlineedit.textChanged.connect(self.layer_changed) # type: ignore - hlayout.addWidget(mlineedit) - entry["widget_lay"] = mlineedit - elif entry["type"] == "table": - # add empty row if not exist - first_element = list(entry["columns"].keys())[0] - if entry.get("column_defaults") is not None and str(self.project["setup"][sname][ename][-1][first_element]) != "": - new_row = {} - for key, default in entry["column_defaults"].items(): - new_row[key] = default - self.project["setup"][sname][ename].append(new_row) - - table = QTableWidget() - table.setToolTip(helptext) - table.setRowCount(len(self.project["setup"][sname][ename])) - idxf_offset = 0 - table.setColumnCount(len(entry["columns"])) - if entry["selectable"]: - table.setColumnCount(len(entry["columns"]) + 1) - table.setHorizontalHeaderItem(0, QTableWidgetItem("Select")) - idxf_offset = 1 - for col_idx, title in enumerate(entry["columns"]): - title = entry["columns"][title].get("title", title) - table.setHorizontalHeaderItem(col_idx + idxf_offset, QTableWidgetItem(title)) - for row_idx, row in enumerate(self.project["setup"][sname][ename]): - if entry["selectable"]: - button = QPushButton() - button.setIcon(QIcon(os.path.join(self.module_root, "icons", "select.png"))) - button.setToolTip(_("select this row")) - button.clicked.connect(partial(self.table_select, sname, ename, row_idx)) # type: ignore - table.setCellWidget(row_idx, 0, button) - table.resizeColumnToContents(0) - for col_idx, key in enumerate(entry["columns"]): - item = QTableWidgetItem(str(row[key])) - table.setItem( - row_idx, - col_idx + idxf_offset, - item, - ) - # if entry["columns"][key].get("ro", False): - # item.setFlags(Qt.ItemIsEditable) - table.resizeColumnToContents(col_idx + idxf_offset) - table.itemChanged.connect(self.layer_changed) # type: ignore - vlayout.addWidget(table, stretch=1) - streched = True - entry["widget_lay"] = table - else: - eprint(f"Unknown setup-type: {entry['type']}") - - unit = entry.get("unit", "") - if unit == "LINEARMEASURE": - unit = self.project["setup"]["machine"]["unit"] - - ulabel = QLabel(unit) - ulabel.setMinimumWidth(36) - ulabel.setFont(QFont("Arial", 9)) - hlayout.addWidget(ulabel) - if not streched: - vlayout.addStretch(1) + self.create_common(tabwidget, "widget_lay", titles, sname, self.layer_changed) def setup_select_object(self, value): if self.project["status"] != "READY": @@ -2735,142 +2601,7 @@ def create_object_setup(self, tabwidget) -> None: show_section = True if not show_section: continue - scrollarea = QScrollArea() - scrollarea.setWidgetResizable(True) - vcontainer = QWidget() - vlayout = QVBoxLayout(vcontainer) - vlayout.setContentsMargins(0, 10, 0, 0) - scrollarea.setWidget(vcontainer) - tabwidget.addTab(scrollarea, titles.get(sname, sname)) - streched = False - for ename, entry in self.project["setup_defaults"][sname].items(): - if not entry.get("per_object", False): - continue - helptext = entry.get("tooltip", f"{sname}/{ename}") - container = QWidget() - hlayout = QHBoxLayout(container) - hlayout.setContentsMargins(10, 0, 10, 0) - entry["widget_obj_label"] = QLabel(entry.get("title", ename)) - entry["widget_obj_label"].setToolTip(helptext) - hlayout.addWidget(entry["widget_obj_label"]) - vlayout.addWidget(container) - hlayout.addStretch(1) - if entry["type"] == "bool": - checkbox = QCheckBox() - checkbox.setChecked(self.project["setup"][sname][ename]) - checkbox.setToolTip(helptext) - checkbox.stateChanged.connect(self.object_changed) # type: ignore - hlayout.addWidget(checkbox) - entry["widget_obj"] = checkbox - elif entry["type"] == "select": - combobox = QComboBox() - for option in entry["options"]: - combobox.addItem(option[0]) - combobox.setCurrentText(self.project["setup"][sname][ename]) - combobox.setToolTip(helptext) - combobox.currentTextChanged.connect(self.object_changed) # type: ignore - hlayout.addWidget(combobox) - entry["widget_obj"] = combobox - elif entry["type"] == "color": - color = self.project["setup"][sname][ename] - rgb = f"{color[0] * 255:1.0f},{color[1] * 255:1.0f},{color[2] * 255:1.0f}" - button = QPushButton(rgb) - button.setStyleSheet(f"background-color:rgb({rgb})") - button.setToolTip(helptext) - button.clicked.connect(partial(self.color_select, sname, ename)) # type: ignore - hlayout.addWidget(button) - entry["widget_obj"] = button - elif entry["type"] == "float": - dspinbox = QDoubleSpinBox() - dspinbox.setDecimals(entry.get("decimals", 4)) - dspinbox.setSingleStep(entry.get("step", 1.0)) - dspinbox.setMinimum(entry["min"]) - dspinbox.setMaximum(entry["max"]) - dspinbox.setValue(self.project["setup"][sname][ename]) - dspinbox.setToolTip(helptext) - dspinbox.valueChanged.connect(self.object_changed) # type: ignore - hlayout.addWidget(dspinbox) - entry["widget_obj"] = dspinbox - elif entry["type"] == "int": - spinbox = QSpinBox() - spinbox.setSingleStep(entry.get("step", 1)) - spinbox.setMinimum(entry["min"]) - spinbox.setMaximum(entry["max"]) - spinbox.setValue(self.project["setup"][sname][ename]) - spinbox.setToolTip(helptext) - spinbox.valueChanged.connect(self.object_changed) # type: ignore - hlayout.addWidget(spinbox) - entry["widget_obj"] = spinbox - elif entry["type"] == "str": - lineedit = QLineEdit() - lineedit.setText(self.project["setup"][sname][ename]) - lineedit.setToolTip(helptext) - lineedit.textChanged.connect(self.object_changed) # type: ignore - hlayout.addWidget(lineedit) - entry["widget_obj"] = lineedit - elif entry["type"] == "mstr": - mlineedit = QPlainTextEdit() - mlineedit.setPlainText(self.project["setup"][sname][ename]) - mlineedit.setToolTip(helptext) - mlineedit.textChanged.connect(self.object_changed) # type: ignore - hlayout.addWidget(mlineedit) - entry["widget_obj"] = mlineedit - elif entry["type"] == "table": - # add empty row if not exist - first_element = list(entry["columns"].keys())[0] - if entry.get("column_defaults") is not None and str(self.project["setup"][sname][ename][-1][first_element]) != "": - new_row = {} - for key, default in entry["column_defaults"].items(): - new_row[key] = default - self.project["setup"][sname][ename].append(new_row) - - table = QTableWidget() - table.setToolTip(helptext) - table.setRowCount(len(self.project["setup"][sname][ename])) - idxf_offset = 0 - table.setColumnCount(len(entry["columns"])) - if entry["selectable"]: - table.setColumnCount(len(entry["columns"]) + 1) - table.setHorizontalHeaderItem(0, QTableWidgetItem("Select")) - idxf_offset = 1 - for col_idx, title in enumerate(entry["columns"]): - title = entry["columns"][title].get("title", title) - table.setHorizontalHeaderItem(col_idx + idxf_offset, QTableWidgetItem(title)) - for row_idx, row in enumerate(self.project["setup"][sname][ename]): - if entry["selectable"]: - button = QPushButton() - button.setIcon(QIcon(os.path.join(self.module_root, "icons", "select.png"))) - button.setToolTip(_("select this row")) - button.clicked.connect(partial(self.table_select, sname, ename, row_idx)) # type: ignore - table.setCellWidget(row_idx, 0, button) - table.resizeColumnToContents(0) - for col_idx, key in enumerate(entry["columns"]): - item = QTableWidgetItem(str(row[key])) - table.setItem( - row_idx, - col_idx + idxf_offset, - item, - ) - # if entry["columns"][key].get("ro", False): - # item.setFlags(Qt.ItemIsEditable) - table.resizeColumnToContents(col_idx + idxf_offset) - table.itemChanged.connect(self.object_changed) # type: ignore - vlayout.addWidget(table, stretch=1) - streched = True - entry["widget_obj"] = table - else: - eprint(f"Unknown setup-type: {entry['type']}") - - unit = entry.get("unit", "") - if unit == "LINEARMEASURE": - unit = self.project["setup"]["machine"]["unit"] - - ulabel = QLabel(unit) - ulabel.setMinimumWidth(36) - ulabel.setFont(QFont("Arial", 9)) - hlayout.addWidget(ulabel) - if not streched: - vlayout.addStretch(1) + self.create_common(tabwidget, "widget_obj", titles, sname, self.object_changed) def object_move(spinbox_steps, checkbox_childs, direction): object_active = self.project["object_active"] From 0f446968238282f00b4bb096bf770c75a67b5cb1 Mon Sep 17 00:00:00 2001 From: Hans Unzner Date: Sun, 16 Mar 2025 14:14:08 +0100 Subject: [PATCH 3/4] add separate setup tab, further simplify create_common function --- viaconstructor/viaconstructor.py | 318 +++++++++++++++---------------- 1 file changed, 153 insertions(+), 165 deletions(-) diff --git a/viaconstructor/viaconstructor.py b/viaconstructor/viaconstructor.py index f07439e..fd55d16 100755 --- a/viaconstructor/viaconstructor.py +++ b/viaconstructor/viaconstructor.py @@ -2130,21 +2130,19 @@ def create_global_setup(self, tabwidget) -> None: titles = { "mill": _("M&ill"), "tool": _("&Tool"), - "workpiece": _("&Workpiece"), "pockets": _("P&ockets"), "tabs": _("Ta&bs"), "leads": _("Lea&ds"), + } + self.create_common(tabwidget, "widget", titles, self.global_changed) + + def create_settings_tabs(self, tabwidget) -> None: + titles = { + "workpiece": _("&Workpiece"), "machine": _("M&achine"), "view": _("&View"), } - for sname in self.project["setup_defaults"]: - # show_section = False - # for entry in self.project["setup_defaults"][sname].values(): - # if entry.get("per_object", False): - # show_section = True - # if not show_section: - # continue - self.create_common(tabwidget, "widget", titles, sname, self.global_changed) + self.create_common(tabwidget, "widget", titles, self.global_changed) def object_info_text(self, object_active_obj): if object_active_obj: @@ -2314,146 +2312,146 @@ def update_layer_setup(self) -> None: self.tabobjwidget.setTabText(tab_idx, f"{titles.get(sname, sname)}") tab_idx += 1 - def create_common(self, tabwidget, widget_name, titles, sname, change_func): - scrollarea = QScrollArea() - scrollarea.setWidgetResizable(True) - vcontainer = QWidget() - vlayout = QVBoxLayout(vcontainer) - vlayout.setContentsMargins(0, 10, 0, 0) - scrollarea.setWidget(vcontainer) - tabwidget.addTab(scrollarea, titles.get(sname, sname)) - - streched = False - for ename, entry in self.project["setup_defaults"][sname].items(): - # if not entry.get("per_object", False): - # continue - helptext = entry.get("tooltip", f"{sname}/{ename}") - container = QWidget() - hlayout = QHBoxLayout(container) - hlayout.setContentsMargins(10, 0, 10, 0) - entry[widget_name + "_label"] = QLabel(entry.get("title", ename)) - entry[widget_name + "_label"].setToolTip(helptext) - hlayout.addWidget(entry[widget_name + "_label"]) - vlayout.addWidget(container) - hlayout.addStretch(1) - if entry["type"] == "bool": - checkbox = QCheckBox() - checkbox.setChecked(self.project["setup"][sname][ename]) - checkbox.setToolTip(helptext) - checkbox.stateChanged.connect(change_func) # type: ignore - hlayout.addWidget(checkbox) - entry[widget_name] = checkbox - elif entry["type"] == "select": - combobox = QComboBox() - for option in entry["options"]: - combobox.addItem(option[0]) - combobox.setCurrentText(self.project["setup"][sname][ename]) - combobox.setToolTip(helptext) - combobox.currentTextChanged.connect(change_func) # type: ignore - hlayout.addWidget(combobox) - entry[widget_name] = combobox - elif entry["type"] == "color": - color = self.project["setup"][sname][ename] - rgb = f"{color[0] * 255:1.0f},{color[1] * 255:1.0f},{color[2] * 255:1.0f}" - button = QPushButton(rgb) - button.setStyleSheet(f"background-color:rgb({rgb})") - button.setToolTip(helptext) - button.clicked.connect(partial(self.color_select, sname, ename)) # type: ignore - hlayout.addWidget(button) - entry[widget_name] = button - elif entry["type"] == "float": - dspinbox = QDoubleSpinBox() - dspinbox.setDecimals(entry.get("decimals", 4)) - dspinbox.setSingleStep(entry.get("step", 1.0)) - dspinbox.setMinimum(entry["min"]) - dspinbox.setMaximum(entry["max"]) - dspinbox.setValue(self.project["setup"][sname][ename]) - dspinbox.setToolTip(helptext) - dspinbox.valueChanged.connect(change_func) # type: ignore - hlayout.addWidget(dspinbox) - entry[widget_name] = dspinbox - elif entry["type"] == "int": - spinbox = QSpinBox() - spinbox.setSingleStep(entry.get("step", 1)) - spinbox.setMinimum(entry["min"]) - spinbox.setMaximum(entry["max"]) - spinbox.setValue(self.project["setup"][sname][ename]) - spinbox.setToolTip(helptext) - spinbox.valueChanged.connect(change_func) # type: ignore - hlayout.addWidget(spinbox) - entry[widget_name] = spinbox - elif entry["type"] == "str": - lineedit = QLineEdit() - lineedit.setText(self.project["setup"][sname][ename]) - lineedit.setToolTip(helptext) - lineedit.textChanged.connect(change_func) # type: ignore - hlayout.addWidget(lineedit) - entry[widget_name] = lineedit - elif entry["type"] == "mstr": - mlineedit = QPlainTextEdit() - mlineedit.setPlainText(self.project["setup"][sname][ename]) - mlineedit.setToolTip(helptext) - mlineedit.textChanged.connect(change_func) # type: ignore - mlineedit.setFixedHeight(27) - hlayout.addWidget(mlineedit) - entry[widget_name] = mlineedit - elif entry["type"] == "table": - # add empty row if not exist - first_element = list(entry["columns"].keys())[0] - if entry.get("column_defaults") is not None and str(self.project["setup"][sname][ename][-1][first_element]) != "": - new_row = {} - for key, default in entry["column_defaults"].items(): - new_row[key] = default - self.project["setup"][sname][ename].append(new_row) - - table = QTableWidget() - table.setToolTip(helptext) - table.setRowCount(len(self.project["setup"][sname][ename])) - idxf_offset = 0 - table.setColumnCount(len(entry["columns"])) - if entry["selectable"]: - table.setColumnCount(len(entry["columns"]) + 1) - table.setHorizontalHeaderItem(0, QTableWidgetItem("Select")) - idxf_offset = 1 - for col_idx, title in enumerate(entry["columns"]): - title = entry["columns"][title].get("title", title) - table.setHorizontalHeaderItem(col_idx + idxf_offset, QTableWidgetItem(title)) - for row_idx, row in enumerate(self.project["setup"][sname][ename]): - if entry["selectable"]: - button = QPushButton() - button.setIcon(QIcon(os.path.join(self.module_root, "icons", "select.png"))) - button.setToolTip(_("select this row")) - button.clicked.connect(partial(self.table_select, sname, ename, row_idx)) # type: ignore - table.setCellWidget(row_idx, 0, button) - table.resizeColumnToContents(0) - for col_idx, key in enumerate(entry["columns"]): - item = QTableWidgetItem(str(row[key])) - table.setItem( - row_idx, - col_idx + idxf_offset, - item, - ) - # if entry["columns"][key].get("ro", False): - # item.setFlags(Qt.ItemIsEditable) - table.resizeColumnToContents(col_idx + idxf_offset) - table.itemChanged.connect(change_func) # type: ignore - vlayout.addWidget(table, stretch=1) - streched = True - entry[widget_name] = table - else: - eprint(f"Unknown setup-type: {entry['type']}") - - unit = entry.get("unit", "") - if unit == "LINEARMEASURE": - unit = self.project["setup"]["machine"]["unit"] - - ulabel = QLabel(unit) - ulabel.setMinimumWidth(36) - ulabel.setFont(QFont("Arial", 9)) - hlayout.addWidget(ulabel) - if not streched: - vlayout.addStretch(1) - + def create_common(self, tabwidget, widget_name, titles, change_func): + for sname in self.project["setup_defaults"]: + if sname in titles: + scrollarea = QScrollArea() + scrollarea.setWidgetResizable(True) + vcontainer = QWidget() + vlayout = QVBoxLayout(vcontainer) + vlayout.setContentsMargins(0, 10, 0, 0) + scrollarea.setWidget(vcontainer) + tabwidget.addTab(scrollarea, titles.get(sname, sname)) + + streched = False + for ename, entry in self.project["setup_defaults"][sname].items(): + helptext = entry.get("tooltip", f"{sname}/{ename}") + container = QWidget() + hlayout = QHBoxLayout(container) + hlayout.setContentsMargins(10, 0, 10, 0) + entry[widget_name + "_label"] = QLabel(entry.get("title", ename)) + entry[widget_name + "_label"].setToolTip(helptext) + hlayout.addWidget(entry[widget_name + "_label"]) + vlayout.addWidget(container) + hlayout.addStretch(1) + if entry["type"] == "bool": + checkbox = QCheckBox() + checkbox.setChecked(self.project["setup"][sname][ename]) + checkbox.setToolTip(helptext) + checkbox.stateChanged.connect(change_func) # type: ignore + hlayout.addWidget(checkbox) + entry[widget_name] = checkbox + elif entry["type"] == "select": + combobox = QComboBox() + for option in entry["options"]: + combobox.addItem(option[0]) + combobox.setCurrentText(self.project["setup"][sname][ename]) + combobox.setToolTip(helptext) + combobox.currentTextChanged.connect(change_func) # type: ignore + hlayout.addWidget(combobox) + entry[widget_name] = combobox + elif entry["type"] == "color": + color = self.project["setup"][sname][ename] + rgb = f"{color[0] * 255:1.0f},{color[1] * 255:1.0f},{color[2] * 255:1.0f}" + button = QPushButton(rgb) + button.setStyleSheet(f"background-color:rgb({rgb})") + button.setToolTip(helptext) + button.clicked.connect(partial(self.color_select, sname, ename)) # type: ignore + hlayout.addWidget(button) + entry[widget_name] = button + elif entry["type"] == "float": + dspinbox = QDoubleSpinBox() + dspinbox.setDecimals(entry.get("decimals", 4)) + dspinbox.setSingleStep(entry.get("step", 1.0)) + dspinbox.setMinimum(entry["min"]) + dspinbox.setMaximum(entry["max"]) + dspinbox.setValue(self.project["setup"][sname][ename]) + dspinbox.setToolTip(helptext) + dspinbox.valueChanged.connect(change_func) # type: ignore + hlayout.addWidget(dspinbox) + entry[widget_name] = dspinbox + elif entry["type"] == "int": + spinbox = QSpinBox() + spinbox.setSingleStep(entry.get("step", 1)) + spinbox.setMinimum(entry["min"]) + spinbox.setMaximum(entry["max"]) + spinbox.setValue(self.project["setup"][sname][ename]) + spinbox.setToolTip(helptext) + spinbox.valueChanged.connect(change_func) # type: ignore + hlayout.addWidget(spinbox) + entry[widget_name] = spinbox + elif entry["type"] == "str": + lineedit = QLineEdit() + lineedit.setText(self.project["setup"][sname][ename]) + lineedit.setToolTip(helptext) + lineedit.textChanged.connect(change_func) # type: ignore + hlayout.addWidget(lineedit) + entry[widget_name] = lineedit + elif entry["type"] == "mstr": + mlineedit = QPlainTextEdit() + mlineedit.setPlainText(self.project["setup"][sname][ename]) + mlineedit.setToolTip(helptext) + mlineedit.textChanged.connect(change_func) # type: ignore + mlineedit.setFixedHeight(27) + hlayout.addWidget(mlineedit) + entry[widget_name] = mlineedit + elif entry["type"] == "table": + # add empty row if not exist + first_element = list(entry["columns"].keys())[0] + if entry.get("column_defaults") is not None and str(self.project["setup"][sname][ename][-1][first_element]) != "": + new_row = {} + for key, default in entry["column_defaults"].items(): + new_row[key] = default + self.project["setup"][sname][ename].append(new_row) + + table = QTableWidget() + table.setToolTip(helptext) + table.setRowCount(len(self.project["setup"][sname][ename])) + idxf_offset = 0 + table.setColumnCount(len(entry["columns"])) + if entry["selectable"]: + table.setColumnCount(len(entry["columns"]) + 1) + table.setHorizontalHeaderItem(0, QTableWidgetItem("Select")) + idxf_offset = 1 + for col_idx, title in enumerate(entry["columns"]): + title = entry["columns"][title].get("title", title) + table.setHorizontalHeaderItem(col_idx + idxf_offset, QTableWidgetItem(title)) + for row_idx, row in enumerate(self.project["setup"][sname][ename]): + if entry["selectable"]: + button = QPushButton() + button.setIcon(QIcon(os.path.join(self.module_root, "icons", "select.png"))) + button.setToolTip(_("select this row")) + button.clicked.connect(partial(self.table_select, sname, ename, row_idx)) # type: ignore + table.setCellWidget(row_idx, 0, button) + table.resizeColumnToContents(0) + for col_idx, key in enumerate(entry["columns"]): + item = QTableWidgetItem(str(row[key])) + table.setItem( + row_idx, + col_idx + idxf_offset, + item, + ) + # if entry["columns"][key].get("ro", False): + # item.setFlags(Qt.ItemIsEditable) + table.resizeColumnToContents(col_idx + idxf_offset) + table.itemChanged.connect(change_func) # type: ignore + vlayout.addWidget(table, stretch=1) + streched = True + entry[widget_name] = table + else: + eprint(f"Unknown setup-type: {entry['type']}") + + unit = entry.get("unit", "") + if unit == "LINEARMEASURE": + unit = self.project["setup"]["machine"]["unit"] + + ulabel = QLabel(unit) + ulabel.setMinimumWidth(36) + ulabel.setFont(QFont("Arial", 9)) + hlayout.addWidget(ulabel) + if not streched: + vlayout.addStretch(1) + def create_layer_setup(self, tabwidget) -> None: titles = { "mill": _("M&ill"), @@ -2462,14 +2460,7 @@ def create_layer_setup(self, tabwidget) -> None: "tabs": _("Ta&bs"), "leads": _("Lea&ds"), } - for sname in self.project["setup_defaults"]: - show_section = False - for entry in self.project["setup_defaults"][sname].values(): - if entry.get("per_object", False): - show_section = True - if not show_section: - continue - self.create_common(tabwidget, "widget_lay", titles, sname, self.layer_changed) + self.create_common(tabwidget, "widget_lay", titles, self.layer_changed) def setup_select_object(self, value): if self.project["status"] != "READY": @@ -2594,14 +2585,7 @@ def create_object_setup(self, tabwidget) -> None: "tabs": _("Ta&bs"), "leads": _("Lea&ds"), } - for sname in self.project["setup_defaults"]: - show_section = False - for entry in self.project["setup_defaults"][sname].values(): - if entry.get("per_object", False): - show_section = True - if not show_section: - continue - self.create_common(tabwidget, "widget_obj", titles, sname, self.object_changed) + self.create_common(tabwidget, "widget_obj", titles, self.object_changed) def object_move(spinbox_steps, checkbox_childs, direction): object_active = self.project["object_active"] @@ -3466,12 +3450,16 @@ def __init__(self) -> None: self.infotext_widget = QPlainTextEdit() self.infotext_widget.setPlainText("info:") + + self.settings_widget = QTabWidget() + self.create_settings_tabs(self.settings_widget) ltabwidget = QTabWidget() ltabwidget.addTab(self.tabwidget, _("&Global")) ltabwidget.addTab(self.laywidget, _("&Layers")) ltabwidget.addTab(self.objwidget, _("&Objects")) ltabwidget.addTab(self.infotext_widget, _("&Infos")) + ltabwidget.addTab(self.settings_widget, _("&Setup")) ltabwidget.currentChanged.connect(self.tab_changed) left_gridlayout.addWidget(ltabwidget) From 90b36eeb008204a0bc4f3d94ced6cca81a4e0ea8 Mon Sep 17 00:00:00 2001 From: Hans Unzner Date: Sun, 16 Mar 2025 15:13:36 +0100 Subject: [PATCH 4/4] some translation fixes --- viaconstructor/locales/de/LC_MESSAGES/base.mo | Bin 15259 -> 15306 bytes viaconstructor/locales/de/LC_MESSAGES/base.po | 26 +++++++++--------- viaconstructor/viaconstructor.py | 4 +-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/viaconstructor/locales/de/LC_MESSAGES/base.mo b/viaconstructor/locales/de/LC_MESSAGES/base.mo index 5521c91cf3b4f301a9cd5ea04c2ac71029a9cd41..d79b761526bd6f22d4550a0db6946f035d5fd948 100644 GIT binary patch delta 6206 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 delta 6173 zcmaLbd01Cf9>?*cqO1vmAc-jwil~^TnR}+vrk13m4mr8?Q!qipt#P}FnzosRPN|LC zxRq%OIc}*bV=j}7%aCSMj#QIbf-`1mS@!XPI+#fw1p0aF; z_i1d%V#k$G&AA5nL6~!sC{M4WR_FTFbB-pLg`t>@wQz*hb1|CwW2on5nNQpOBCJXK zGIJG1P+#xg_uShQ)Zq?$U@z9DegKujhnRuqFcuRMor}SA498BWfqP*M?2FYg3nOs= zM&U5jz~r&dMjKekxJ@UO^>z9hG26 zlHVR-)=6Uh)j=W+$}AaGZ;inj*@N9sdzNYU2clNuVT{9EjK>*PFS7c2)XaCG5x1JrX(t=FLj4YWgG%V4c^Nh1A5dFT ztD#nc{g0!d0a8&nS|A^Q>wrq^L2QhJQHN_P>MNOzDYy)E_;#b-JBpk)cOKPm%|?7V z7==pcX4Dom!}cD9juiAmF&=e@W@9=oK`mJc>QEj*bx?*%vS42xG@ja(H7K;yR5zsb*c|rdl_mbr%{QWMeVuv zL+v4`2}PpLP@>rsHQ{z<-xSZ^i%~Qv<0+_tp0N5esDu_-`zxpc)}v;!+3MR+d%6cT zz)@_0U!i6mf3v?OX{hHiP+QW?qmWGDe$-Nr!{+!hYGx&bM^@@Ih39C(JKVpXZOL-;Ed!jNZQ)H9%Vo$G)f)8H7qO7qtT8P>D`PPY=wbpe0*~ zVYnQ%kGP^)smcDm@BO6sl+V zOCF8NvejLCvrnwd9xa2GpmZL~0|?c`k*5 z9=sh{40j*ug(;{P3NacNnk!K=eG|1p`%v$fqMkpCTG2|3#%rjRi)!t+$D*EVgu(y* z&!C_OZ%2K8ccYfJH)^2%s4WPf1{`DeC!=OQ6E(mhRN_mmeJyH5cA~amKgM7wYP>U8 zSKogn1$7Y8#{YgJP#vYBI=IE`h)SR*YK9MB9UOw%>wHwllTe@MTvWenFb!Wry?-3F zMW3RlrMqMewQlv#LJ~Hiy(=n#k*JyGp;lrxY9{lsEiS>}o}L>RL)Gy)Bs6-Om zvEO(v>V7WjZ%ko3*1sc#l{9Fe)2N@`a#V(2pc1J-E$O!yhjF+0reR&`ov}0a!&rP4 zHPaQSEm?zFiFZ)_?L|%GfJZ?yD@7f?uTY6xK>ea!M*Z21YVVth`V706gHbCn5tZHD8aL7A>YC9oOQ;X(5ZD&y}^1O9};EnweN zPeZ-e)#`&#E0l-YvZqkbZ$SN#dKYWsM;Oic?i>Z}*%j2%MRxL+EWu2{4BA_v5*>nC ziASuSk9vPH>iws%87@Mt#4glVaTYc6S{#%_OvU>8{=2GxgHeZR0;ZC4PG?qcVfoLFjDg(q30x>nQw#SU}tm?34KqqM{#(QbPY1 zOnZ2O(3MYUYpSlf6h0vCChjNFi3f>Q#Bt&Pp&z7agsu?!yUQ;I&%$Gr&s%*fF4Fqz zR1PJ6PmCng)`HNX`xj9?m?>L=IzUZ`iG;4LHv#QfzXvigjy%lDL<-4uJ%5^{(H$vCFUErk9e2RK^{lw`U`OfQK$-6OX8oz zK+UzUTI~85lZl?htHcPRA5lc;TYiLih^Rqw`g#2~@j6j;)ujDND%EfZK0&M@ban9g z_1{^Pw)yAZ|Lu<9rKvP_CoU5&5VdGKg?}dY5Qm6A5vPf&t2%{7#5=?Q;tVmK(6_rE zHW0rfdK0?Rh~~s3;yaIjvI$*Z6J3d?RpI)Sh@g|k!5aUefss}Y;CA9hVmI*&5lZ|- z%p)!mx_&0^AttC|*JpT)c#rU689>*I#1i5^M1Nv4ahNzsg!4=#zCx@fJ|uKCCE|$X z#B)Rq;y$7+kw+{gQi!T+PE`TlB0kstmr)2~fF5?UBVH%Q5BFyUNup80F>PNKypIAl25(|lERk7yw%nf1LDwR7^qM@QJzO z@&oyvt00gY82M;%qxABSqzU5#xg&D|1%c$g!zYZ) v$>p7l9)VGToUwtThOKV;fA@=rw%SuIDmx>4(u9eDv12FYk1lTBdS&D\n" "Language-Team: German \n" @@ -628,11 +628,11 @@ msgstr "Projekt" msgid "Save project" msgstr "Projekt speichern" -msgid "Save Machine-Commands" -msgstr "speichere Maschinen-Befehle" +msgid "Save Machine Output" +msgstr "&Maschinen-Programm speichern" -msgid "Save machine commands" -msgstr "speichere Maschinen-Befehle" +msgid "Save machine commands in a file" +msgstr "Maschinen-Befehle in Datei speichern" msgid "Machine" msgstr "Maschine" @@ -784,9 +784,6 @@ msgstr "Fräsen" msgid "&Tool" msgstr "&Werkzeuge" -msgid "&Workpiece" -msgstr "W&erkstück" - msgid "P&ockets" msgstr "&Taschen" @@ -796,6 +793,9 @@ msgstr "Ta&bs" msgid "Lea&ds" msgstr "Lea&ds" +msgid "&Workpiece" +msgstr "W&erkstück" + msgid "M&achine" msgstr "Maschine" @@ -806,7 +806,7 @@ msgid "Move:" msgstr "Verschieben:" msgid "Steps" -msgstr "Z-Zustellung" +msgstr "Schrittweite" msgid "with children" msgstr "mit Unterelementen" @@ -842,7 +842,7 @@ msgid "Rotate:" msgstr "Rotieren" msgid "Angle" -msgstr "Dreieck" +msgstr "Winkel" msgid "CCW" msgstr "CCW" @@ -941,7 +941,7 @@ msgid "&Objects" msgstr "&Objekte" msgid "&Infos" -msgstr "&Informationen" +msgstr "&Infos" -#~ msgid "insideout" -#~ msgstr "insideout" +msgid "&Setup" +msgstr "Einstellungen" diff --git a/viaconstructor/viaconstructor.py b/viaconstructor/viaconstructor.py index fd55d16..109977a 100755 --- a/viaconstructor/viaconstructor.py +++ b/viaconstructor/viaconstructor.py @@ -1649,10 +1649,10 @@ def create_actions(self) -> None: "", None, ], - _("Save Machine-Commands"): [ + _("Save Machine Output"): [ "save-gcode.png", "Ctrl+S", - _("Save machine commands"), + _("Save machine commands in a file"), self._toolbar_save_machine_cmd, True, True,