| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | """Provides GUI tools to create Layer objects.""" |
| | |
| | |
| | |
| |
|
| | |
| | |
| | from PySide.QtCore import QT_TRANSLATE_NOOP |
| |
|
| | import os |
| | import FreeCAD as App |
| | import FreeCADGui as Gui |
| | import Draft_rc |
| | from draftguitools import gui_base |
| | from draftmake import make_layer |
| | from draftobjects import layer |
| | from draftutils import params |
| | from draftutils import utils |
| | from draftutils.translate import translate |
| |
|
| | |
| | bool(Draft_rc.__name__) |
| |
|
| |
|
| | def getColorIcon(color): |
| | "returns a QtGui.QIcon from a color 3-float tuple" |
| |
|
| | from PySide import QtCore, QtGui |
| |
|
| | c = QtGui.QColor(int(color[0] * 255), int(color[1] * 255), int(color[2] * 255)) |
| | im = QtGui.QImage(48, 48, QtGui.QImage.Format_ARGB32) |
| | im.fill(c) |
| | px = QtGui.QPixmap.fromImage(im) |
| | return QtGui.QIcon(px) |
| |
|
| |
|
| | class Layer(gui_base.GuiCommandSimplest): |
| | """GuiCommand to create a Layer object in the document.""" |
| |
|
| | def __init__(self): |
| | super().__init__(name="Draft_Layer") |
| |
|
| | def GetResources(self): |
| | """Set icon, menu and tooltip.""" |
| | return { |
| | "Pixmap": "Draft_Layer", |
| | "MenuText": QT_TRANSLATE_NOOP("Draft_Layer", "New Layer"), |
| | "ToolTip": QT_TRANSLATE_NOOP( |
| | "Draft_Layer", |
| | "Adds a layer to the document.\nObjects added to this layer can share the same visual properties.", |
| | ), |
| | } |
| |
|
| | def Activated(self): |
| | """Execute when the command is called. |
| | |
| | It calls the `finish(False)` method of the active Draft command. |
| | """ |
| | super().Activated() |
| |
|
| | self.doc.openTransaction(translate("draft", "Create layer")) |
| | Gui.addModule("Draft") |
| | Gui.doCommand( |
| | "layer = Draft.make_layer(name=None, line_color=None, shape_color=None, line_width=None, draw_style=None, transparency=None)" |
| | ) |
| | Gui.doCommand("FreeCAD.ActiveDocument.recompute()") |
| | self.doc.commitTransaction() |
| |
|
| |
|
| | class AddToLayer(gui_base.GuiCommandNeedsSelection): |
| | """GuiCommand for the Draft_AddToLayer tool.""" |
| |
|
| | def __init__(self): |
| | super().__init__(name="Draft_AddToLayer") |
| |
|
| | def GetResources(self): |
| | """Set icon, menu and tooltip.""" |
| | return { |
| | "Pixmap": "Draft_AddToLayer", |
| | "MenuText": QT_TRANSLATE_NOOP("Draft_AddToLayer", "Add to Layer"), |
| | "ToolTip": QT_TRANSLATE_NOOP( |
| | "Draft_AddToLayer", |
| | "Adds selected objects to a layer, or removes them from any layer", |
| | ), |
| | } |
| |
|
| | def Activated(self): |
| | """Execute when the command is called.""" |
| | super().Activated() |
| |
|
| | if not hasattr(Gui, "draftToolBar"): |
| | return |
| |
|
| | self.ui = Gui.draftToolBar |
| | objs = [obj for obj in App.ActiveDocument.Objects if utils.get_type(obj) == "Layer"] |
| | objs.sort(key=lambda obj: obj.Label) |
| | self.objects = [None] + [None] + objs |
| | self.labels = ( |
| | [translate("draft", "Remove From Layer")] |
| | + ["---"] |
| | + [obj.Label for obj in objs] |
| | + ["---"] |
| | + [translate("draft", "Add to New Layer")] |
| | ) |
| | self.icons = ( |
| | [self.ui.getIcon(":/icons/list-remove.svg")] |
| | + [None] |
| | + [obj.ViewObject.Icon for obj in objs] |
| | + [None] |
| | + [self.ui.getIcon(":/icons/list-add.svg")] |
| | ) |
| | self.ui.sourceCmd = self |
| | self.ui.popupMenu(self.labels, self.icons) |
| |
|
| | def proceed(self, option): |
| | self.ui.sourceCmd = None |
| |
|
| | if option == self.labels[0]: |
| | |
| | changed = False |
| | for obj in Gui.Selection.getSelection(): |
| | lyr = layer.get_layer(obj) |
| | if lyr is not None: |
| | if not changed: |
| | self.doc.openTransaction(translate("draft", "Remove from layer")) |
| | changed = True |
| | lyr.Proxy.removeObject(lyr, obj) |
| | if changed: |
| | self.doc.commitTransaction() |
| | self.doc.recompute() |
| | return |
| |
|
| | if option == self.labels[-1]: |
| | |
| | from PySide import QtWidgets |
| |
|
| | txt, ok = QtWidgets.QInputDialog.getText( |
| | None, |
| | translate("draft", "New Layer"), |
| | translate("draft", "Layer name"), |
| | text=translate("draft", "Layer", "Object label"), |
| | ) |
| | if not ok: |
| | return |
| | if not txt: |
| | return |
| | self.doc.openTransaction(translate("draft", "Add to new layer")) |
| | lyr = make_layer.make_layer( |
| | name=txt, |
| | line_color=None, |
| | shape_color=None, |
| | line_width=None, |
| | draw_style=None, |
| | transparency=None, |
| | ) |
| | for obj in Gui.Selection.getSelection(): |
| | lyr.Proxy.addObject(lyr, obj) |
| | self.doc.commitTransaction() |
| | self.doc.recompute() |
| | return |
| |
|
| | |
| | i = self.labels.index(option) |
| | lyr = self.objects[i] |
| | self.doc.openTransaction(translate("draft", "Add to layer")) |
| | for obj in Gui.Selection.getSelection(): |
| | lyr.Proxy.addObject(lyr, obj) |
| | self.doc.commitTransaction() |
| | self.doc.recompute() |
| |
|
| |
|
| | class LayerManager: |
| | """GuiCommand that displays a Layers manager dialog""" |
| |
|
| | def GetResources(self): |
| |
|
| | return { |
| | "Pixmap": "Draft_LayerManager", |
| | "MenuText": QT_TRANSLATE_NOOP("Draft_LayerManager", "Manage Layers"), |
| | "ToolTip": QT_TRANSLATE_NOOP("Draft_LayerManager", "Allows to modify the layers"), |
| | } |
| |
|
| | def IsActive(self): |
| | """Return True when this command should be available.""" |
| | return bool(App.activeDocument()) |
| |
|
| | def Activated(self): |
| |
|
| | from PySide import QtCore, QtGui, QtWidgets |
| |
|
| | |
| | self.deleteList = [] |
| |
|
| | |
| | self.dialog = Gui.PySideUic.loadUi(":/ui/dialogLayers.ui") |
| |
|
| | |
| | self.dialog.setWindowIcon(QtGui.QIcon(":/icons/Draft_Layer.svg")) |
| | self.dialog.buttonNew.setIcon(QtGui.QIcon(":/icons/document-new.svg")) |
| | self.dialog.buttonDelete.setIcon(QtGui.QIcon(":/icons/delete.svg")) |
| | self.dialog.buttonSelectAll.setIcon(QtGui.QIcon(":/icons/edit-select-all.svg")) |
| | self.dialog.buttonToggle.setIcon(QtGui.QIcon(":/icons/dagViewVisible.svg")) |
| | self.dialog.buttonIsolate.setIcon(QtGui.QIcon(":/icons/Std_ShowSelection.svg")) |
| | self.dialog.buttonCancel.setIcon(QtGui.QIcon(":/icons/edit_Cancel.svg")) |
| | self.dialog.buttonOK.setIcon(QtGui.QIcon(":/icons/edit_OK.svg")) |
| |
|
| | |
| | w = params.get_param("LayersManagerWidth") |
| | h = params.get_param("LayersManagerHeight") |
| | self.dialog.resize(w, h) |
| |
|
| | |
| | mw = Gui.getMainWindow() |
| | self.dialog.move( |
| | mw.frameGeometry().topLeft() + mw.rect().center() - self.dialog.rect().center() |
| | ) |
| |
|
| | |
| | self.dialog.buttonNew.clicked.connect(self.addItem) |
| | self.dialog.buttonDelete.clicked.connect(self.onDelete) |
| | self.dialog.buttonSelectAll.clicked.connect(self.dialog.tree.selectAll) |
| | self.dialog.buttonToggle.clicked.connect(self.onToggle) |
| | self.dialog.buttonCancel.clicked.connect(self.dialog.reject) |
| | self.dialog.buttonIsolate.clicked.connect(self.onIsolate) |
| | self.dialog.buttonOK.clicked.connect(self.accept) |
| | self.dialog.rejected.connect(self.reject) |
| |
|
| | |
| | self.model = QtGui.QStandardItemModel() |
| | self.dialog.tree.setModel(self.model) |
| | self.dialog.tree.setUniformRowHeights(True) |
| | self.dialog.tree.setItemDelegate(Layers_Delegate()) |
| | self.dialog.tree.setItemsExpandable(False) |
| | self.dialog.tree.setRootIsDecorated(False) |
| | self.dialog.tree.setSelectionMode( |
| | QtWidgets.QTreeView.ExtendedSelection |
| | ) |
| |
|
| | |
| | self.update() |
| |
|
| | |
| | self.dialog.exec_() |
| |
|
| | def accept(self): |
| | "when OK button is pressed" |
| |
|
| | doc = App.ActiveDocument |
| | changed = False |
| | trans_name = translate("draft", "Layers change") |
| |
|
| | |
| | for name in self.deleteList: |
| | if not changed: |
| | doc.openTransaction(trans_name) |
| | changed = True |
| | doc.removeObject(name) |
| |
|
| | |
| | for row in range(self.model.rowCount()): |
| |
|
| | |
| | name = self.model.item(row, 1).toolTip() |
| | obj = None |
| | if name: |
| | obj = doc.getObject(name) |
| | if not obj: |
| | if not changed: |
| | doc.openTransaction(trans_name) |
| | changed = True |
| | obj = make_layer.make_layer( |
| | name=None, |
| | line_color=None, |
| | shape_color=None, |
| | line_width=None, |
| | draw_style=None, |
| | transparency=None, |
| | ) |
| | vobj = obj.ViewObject |
| |
|
| | |
| | checked = self.model.item(row, 0).checkState() == QtCore.Qt.Checked |
| | if checked != vobj.Visibility: |
| | if not changed: |
| | doc.openTransaction(trans_name) |
| | changed = True |
| | vobj.Visibility = checked |
| |
|
| | |
| | label = self.model.item(row, 1).text() |
| | |
| | if label and obj.Label != label: |
| | if not changed: |
| | doc.openTransaction(trans_name) |
| | changed = True |
| | obj.Label = label |
| |
|
| | |
| | width = self.model.item(row, 2).data(QtCore.Qt.DisplayRole) |
| | |
| | if width and vobj.LineWidth != width: |
| | if not changed: |
| | doc.openTransaction(trans_name) |
| | changed = True |
| | vobj.LineWidth = width |
| |
|
| | |
| | style = self.model.item(row, 3).text() |
| | if style is not None and vobj.DrawStyle != style: |
| | if not changed: |
| | doc.openTransaction(trans_name) |
| | changed = True |
| | vobj.DrawStyle = style |
| |
|
| | |
| | color = self.model.item(row, 4).data(QtCore.Qt.UserRole) |
| | if color is not None and vobj.LineColor[:3] != color: |
| | if not changed: |
| | doc.openTransaction(trans_name) |
| | changed = True |
| | vobj.LineColor = color |
| |
|
| | |
| | color = self.model.item(row, 5).data(QtCore.Qt.UserRole) |
| | if color is not None and vobj.ShapeColor[:3] != color: |
| | if not changed: |
| | doc.openTransaction(trans_name) |
| | changed = True |
| | vobj.ShapeColor = color |
| |
|
| | |
| | transparency = self.model.item(row, 6).data(QtCore.Qt.DisplayRole) |
| | if transparency is not None and vobj.Transparency != transparency: |
| | if not changed: |
| | doc.openTransaction(trans_name) |
| | changed = True |
| | vobj.Transparency = transparency |
| |
|
| | |
| | color = self.model.item(row, 7).data(QtCore.Qt.UserRole) |
| | if color is not None and vobj.LinePrintColor[:3] != color: |
| | if not changed: |
| | doc.openTransaction(trans_name) |
| | changed = True |
| | vobj.LinePrintColor = color |
| |
|
| | |
| | if changed: |
| | doc.commitTransaction() |
| | doc.recompute() |
| |
|
| | |
| | self.dialog.reject() |
| |
|
| | def reject(self): |
| | "when Cancel button is pressed or dialog is closed" |
| |
|
| | |
| | params.set_param("LayersManagerWidth", self.dialog.width()) |
| | params.set_param("LayersManagerHeight", self.dialog.height()) |
| |
|
| | return True |
| |
|
| | def update(self): |
| | "rebuild the model from document contents" |
| |
|
| | self.model.clear() |
| |
|
| | |
| | self.model.setHorizontalHeaderLabels( |
| | [ |
| | translate("Draft", "On"), |
| | translate("Draft", "Name"), |
| | translate("Draft", "Line Width"), |
| | translate("Draft", "Draw Style"), |
| | translate("Draft", "Line Color"), |
| | translate("Draft", "Face Color"), |
| | translate("Draft", "Transparency"), |
| | translate("Draft", "Line Print Color"), |
| | ] |
| | ) |
| | self.dialog.tree.header().setDefaultSectionSize(72) |
| | self.dialog.tree.setColumnWidth(0, 32) |
| | self.dialog.tree.setColumnWidth(1, 128) |
| |
|
| | |
| | objs = [obj for obj in App.ActiveDocument.Objects if utils.get_type(obj) == "Layer"] |
| | objs.sort(key=lambda o: o.Label) |
| | for obj in objs: |
| | self.addItem(obj) |
| |
|
| | def addItem(self, obj=None): |
| | "adds a row to the model" |
| |
|
| | from PySide import QtCore, QtGui |
| |
|
| | |
| | onItem = QtGui.QStandardItem() |
| | onItem.setCheckable(True) |
| | onItem.setCheckState(QtCore.Qt.Checked) |
| | nameItem = QtGui.QStandardItem(translate("Draft", "New Layer")) |
| | widthItem = QtGui.QStandardItem() |
| | widthItem.setData(params.get_param_view("DefaultShapeLineWidth"), QtCore.Qt.DisplayRole) |
| | styleItem = QtGui.QStandardItem(utils.DRAW_STYLES[params.get_param("DefaultDrawStyle")]) |
| | lineColorItem = QtGui.QStandardItem() |
| | lineColorItem.setData( |
| | utils.get_rgba_tuple(params.get_param_view("DefaultShapeLineColor"))[:3], |
| | QtCore.Qt.UserRole, |
| | ) |
| | shapeColorItem = QtGui.QStandardItem() |
| | shapeColorItem.setData( |
| | utils.get_rgba_tuple(params.get_param_view("DefaultShapeColor"))[:3], QtCore.Qt.UserRole |
| | ) |
| | transparencyItem = QtGui.QStandardItem() |
| | transparencyItem.setData( |
| | params.get_param_view("DefaultShapeTransparency"), QtCore.Qt.DisplayRole |
| | ) |
| | linePrintColorItem = QtGui.QStandardItem() |
| | linePrintColorItem.setData( |
| | utils.get_rgba_tuple(params.get_param("DefaultPrintColor"))[:3], QtCore.Qt.UserRole |
| | ) |
| |
|
| | |
| | if obj: |
| | vobj = obj.ViewObject |
| | onItem.setCheckState(QtCore.Qt.Checked if vobj.Visibility else QtCore.Qt.Unchecked) |
| | nameItem.setText(obj.Label) |
| | nameItem.setToolTip(obj.Name) |
| | widthItem.setData(vobj.LineWidth, QtCore.Qt.DisplayRole) |
| | styleItem.setText(vobj.DrawStyle) |
| | lineColorItem.setData(vobj.LineColor[:3], QtCore.Qt.UserRole) |
| | shapeColorItem.setData(vobj.ShapeColor[:3], QtCore.Qt.UserRole) |
| | transparencyItem.setData(vobj.Transparency, QtCore.Qt.DisplayRole) |
| | if hasattr(vobj, "LinePrintColor"): |
| | linePrintColorItem.setData(vobj.LinePrintColor[:3], QtCore.Qt.UserRole) |
| | lineColorItem.setIcon(getColorIcon(lineColorItem.data(QtCore.Qt.UserRole))) |
| | shapeColorItem.setIcon(getColorIcon(shapeColorItem.data(QtCore.Qt.UserRole))) |
| | linePrintColorItem.setIcon(getColorIcon(linePrintColorItem.data(QtCore.Qt.UserRole))) |
| |
|
| | |
| | self.model.appendRow( |
| | [ |
| | onItem, |
| | nameItem, |
| | widthItem, |
| | styleItem, |
| | lineColorItem, |
| | shapeColorItem, |
| | transparencyItem, |
| | linePrintColorItem, |
| | ] |
| | ) |
| |
|
| | def onDelete(self): |
| | "delete selected rows" |
| |
|
| | rows = [] |
| | for index in self.dialog.tree.selectedIndexes(): |
| | if not index.row() in rows: |
| | rows.append(index.row()) |
| |
|
| | |
| | if index.column() == 1: |
| | name = self.model.itemFromIndex(index).toolTip() |
| | if name: |
| | if not name in self.deleteList: |
| | self.deleteList.append(name) |
| |
|
| | |
| | rows.sort() |
| | rows.reverse() |
| | for row in rows: |
| | self.model.takeRow(row) |
| |
|
| | def onToggle(self): |
| | "toggle selected layers on/off" |
| |
|
| | from PySide import QtCore |
| |
|
| | state = None |
| | for index in self.dialog.tree.selectedIndexes(): |
| | if index.column() == 0: |
| | |
| | if state is None: |
| | if self.model.itemFromIndex(index).checkState() == QtCore.Qt.Checked: |
| | state = QtCore.Qt.Unchecked |
| | else: |
| | state = QtCore.Qt.Checked |
| | self.model.itemFromIndex(index).setCheckState(state) |
| |
|
| | def onIsolate(self): |
| | "isolates the selected layers (turns all the others off" |
| |
|
| | from PySide import QtCore |
| |
|
| | onrows = [] |
| | for index in self.dialog.tree.selectedIndexes(): |
| | if not index.row() in onrows: |
| | onrows.append(index.row()) |
| | for row in range(self.model.rowCount()): |
| | if not row in onrows: |
| | self.model.item(row, 0).setCheckState(QtCore.Qt.Unchecked) |
| |
|
| |
|
| | if App.GuiUp: |
| |
|
| | from PySide import QtCore, QtGui, QtWidgets |
| |
|
| | class Layers_Delegate(QtWidgets.QStyledItemDelegate): |
| | "model delegate" |
| |
|
| | def __init__(self, parent=None, *args): |
| |
|
| | QtWidgets.QStyledItemDelegate.__init__(self, parent, *args) |
| | |
| | |
| | self.first = True |
| |
|
| | def createEditor(self, parent, option, index): |
| |
|
| | if index.column() == 0: |
| | editor = QtWidgets.QCheckBox(parent) |
| | if index.column() == 1: |
| | editor = QtWidgets.QLineEdit(parent) |
| | elif index.column() == 2: |
| | editor = QtWidgets.QSpinBox(parent) |
| | editor.setMaximum(99) |
| | elif index.column() == 3: |
| | editor = QtWidgets.QComboBox(parent) |
| | editor.addItems(utils.DRAW_STYLES) |
| | elif index.column() == 4: |
| | editor = QtWidgets.QLineEdit(parent) |
| | self.first = True |
| | elif index.column() == 5: |
| | editor = QtWidgets.QLineEdit(parent) |
| | self.first = True |
| | elif index.column() == 6: |
| | editor = QtWidgets.QSpinBox(parent) |
| | editor.setMaximum(100) |
| | elif index.column() == 7: |
| | editor = QtWidgets.QLineEdit(parent) |
| | self.first = True |
| | return editor |
| |
|
| | def setEditorData(self, editor, index): |
| |
|
| | if index.column() == 0: |
| | editor.setChecked(index.data()) |
| | elif index.column() == 1: |
| | editor.setText(index.data()) |
| | elif index.column() == 2: |
| | editor.setValue(index.data()) |
| | elif index.column() == 3: |
| | editor.setCurrentIndex(utils.DRAW_STYLES.index(index.data())) |
| | elif index.column() == 4: |
| | editor.setText(str(index.data(QtCore.Qt.UserRole))) |
| | if self.first: |
| | c = index.data(QtCore.Qt.UserRole) |
| | color = QtWidgets.QColorDialog.getColor( |
| | QtGui.QColor(int(c[0] * 255), int(c[1] * 255), int(c[2] * 255)) |
| | ) |
| | editor.setText(str(color.getRgbF())) |
| | self.first = False |
| | elif index.column() == 5: |
| | editor.setText(str(index.data(QtCore.Qt.UserRole))) |
| | if self.first: |
| | c = index.data(QtCore.Qt.UserRole) |
| | color = QtWidgets.QColorDialog.getColor( |
| | QtGui.QColor(int(c[0] * 255), int(c[1] * 255), int(c[2] * 255)) |
| | ) |
| | editor.setText(str(color.getRgbF())) |
| | self.first = False |
| | elif index.column() == 6: |
| | editor.setValue(index.data()) |
| | elif index.column() == 7: |
| | editor.setText(str(index.data(QtCore.Qt.UserRole))) |
| | if self.first: |
| | c = index.data(QtCore.Qt.UserRole) |
| | color = QtWidgets.QColorDialog.getColor( |
| | QtGui.QColor(int(c[0] * 255), int(c[1] * 255), int(c[2] * 255)) |
| | ) |
| | editor.setText(str(color.getRgbF())) |
| | self.first = False |
| |
|
| | def setModelData(self, editor, model, index): |
| |
|
| | if index.column() == 0: |
| | model.setData(index, editor.isChecked()) |
| | elif index.column() == 1: |
| | model.setData(index, editor.text()) |
| | elif index.column() == 2: |
| | model.setData(index, editor.value()) |
| | elif index.column() == 3: |
| | model.setData(index, utils.DRAW_STYLES[editor.currentIndex()]) |
| | elif index.column() == 4: |
| | model.setData(index, eval(editor.text()), QtCore.Qt.UserRole) |
| | model.itemFromIndex(index).setIcon(getColorIcon(eval(editor.text()))) |
| | elif index.column() == 5: |
| | model.setData(index, eval(editor.text()), QtCore.Qt.UserRole) |
| | model.itemFromIndex(index).setIcon(getColorIcon(eval(editor.text()))) |
| | elif index.column() == 6: |
| | model.setData(index, editor.value()) |
| | elif index.column() == 7: |
| | model.setData(index, eval(editor.text()), QtCore.Qt.UserRole) |
| | model.itemFromIndex(index).setIcon(getColorIcon(eval(editor.text()))) |
| |
|
| |
|
| | Gui.addCommand("Draft_Layer", Layer()) |
| | Gui.addCommand("Draft_AddToLayer", AddToLayer()) |
| | Gui.addCommand("Draft_LayerManager", LayerManager()) |
| |
|
| | |
| |
|