| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | """Provides the initialization code for the workbench's status bar. |
| | |
| | The status bar is activated by `InitGui.py` when the workbench is started, |
| | and is populated by various widgets, buttons and menus. |
| | """ |
| | |
| | |
| | |
| |
|
| | |
| | |
| | import PySide.QtCore as QtCore |
| | import PySide.QtGui as QtGui |
| | import PySide.QtWidgets as QtWidgets |
| |
|
| | import FreeCAD as App |
| | import FreeCADGui as Gui |
| | from draftutils import params |
| | from draftutils.init_tools import get_draft_snap_commands |
| | from draftutils.translate import translate |
| |
|
| | |
| | |
| | |
| |
|
| | draft_scales_metrics = [ |
| | "1:1000", |
| | "1:500", |
| | "1:250", |
| | "1:200", |
| | "1:100", |
| | "1:50", |
| | "1:25", |
| | "1:20", |
| | "1:10", |
| | "1:5", |
| | "1:2", |
| | "1:1", |
| | "2:1", |
| | "5:1", |
| | "10:1", |
| | "20:1", |
| | translate("draft", "Custom"), |
| | ] |
| |
|
| | draft_scales_arch_imperial = [ |
| | "1/16in=1ft", |
| | "3/32in=1ft", |
| | "1/8in=1ft", |
| | "3/16in=1ft", |
| | "1/4in=1ft", |
| | "3/8in=1ft", |
| | "1/2in=1ft", |
| | "3/4in=1ft", |
| | "1in=1ft", |
| | "1.5in=1ft", |
| | "3in=1ft", |
| | translate("draft", "Custom"), |
| | ] |
| |
|
| | draft_scales_eng_imperial = [ |
| | "1in=10ft", |
| | "1in=20ft", |
| | "1in=30ft", |
| | "1in=40ft", |
| | "1in=50ft", |
| | "1in=60ft", |
| | "1in=70ft", |
| | "1in=80ft", |
| | "1in=90ft", |
| | "1in=100ft", |
| | translate("draft", "Custom"), |
| | ] |
| |
|
| |
|
| | def get_scales(unit_system=0): |
| | """ |
| | returns the list of preset scales according to unit system. |
| | |
| | Parameters: |
| | unit_system = 0 : default from user preferences |
| | 1 : metrics |
| | 2 : imperial architectural |
| | 3 : imperial engineering |
| | """ |
| |
|
| | if unit_system == 0: |
| | scale_units_system = params.get_param("UserSchema", path="Units") |
| | if scale_units_system in [2, 3, 5]: |
| | return draft_scales_arch_imperial |
| | elif scale_units_system in [7]: |
| | return draft_scales_eng_imperial |
| | else: |
| | return draft_scales_metrics |
| | elif unit_system == 1: |
| | return draft_scales_metrics |
| | elif unit_system == 2: |
| | return draft_scales_arch_imperial |
| | elif unit_system == 3: |
| | return draft_scales_eng_imperial |
| |
|
| |
|
| | def scale_to_label(scale): |
| | """ |
| | transform a float number into a 1:X or X:1 scale and return it as label |
| | """ |
| | if scale <= 0: |
| | return "1:1" |
| | f = round(scale, 2) |
| | if f == 1: |
| | return "1:1" |
| | if f > 1: |
| | f = f.as_integer_ratio() |
| | if f[1] == 1: |
| | return str(f[0]) + ":1" |
| | return str(scale) |
| | f = round(1 / scale, 2) |
| | f = f.as_integer_ratio() |
| | if f[1] == 1: |
| | return "1:" + str(f[0]) |
| | return str(scale) |
| |
|
| |
|
| | def label_to_scale(label): |
| | """ |
| | transform a scale string into scale factor as float |
| | """ |
| | try: |
| | scale = float(label) |
| | return scale |
| | except Exception: |
| | if ":" in label: |
| | f = label.split(":") |
| | elif "=" in label: |
| | f = label.split("=") |
| | else: |
| | return None |
| | if len(f) == 2: |
| | try: |
| | num = App.Units.Quantity(f[0]).Value |
| | den = App.Units.Quantity(f[1]).Value |
| | scale = num / den |
| | return scale |
| | except Exception: |
| | err = translate("draft", "Unable to convert input into a scale factor") |
| | App.Console.PrintWarning(err) |
| | return None |
| |
|
| |
|
| | def _set_scale(action): |
| | """ |
| | triggered by scale pushbutton, set DefaultAnnoScaleMultiplier in preferences |
| | """ |
| | mw = Gui.getMainWindow() |
| | sb = mw.statusBar() |
| |
|
| | scale_widget = sb.findChild(QtWidgets.QToolBar, "draft_scale_widget") |
| |
|
| | if action.text() == translate("draft", "Custom"): |
| | title_text = translate("draft", "Set Custom Scale") |
| | dialog_text = translate("draft", "Set custom annotation scale in format x:x, x=x") |
| | custom_scale = QtWidgets.QInputDialog.getText(None, title_text, dialog_text) |
| | if custom_scale[1]: |
| | print(custom_scale[0]) |
| | scale = label_to_scale(custom_scale[0]) |
| | if scale is None: |
| | return |
| | if scale <= 0: |
| | return |
| | params.set_param("DefaultAnnoScaleMultiplier", 1 / scale) |
| | cs = scale_to_label(scale) |
| | scale_widget.scaleLabel.setText(cs) |
| | else: |
| | text_scale = action.text() |
| | scale_widget.scaleLabel.setText(text_scale) |
| | scale = label_to_scale(text_scale) |
| | params.set_param("DefaultAnnoScaleMultiplier", 1 / scale) |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| |
|
| | def init_draft_statusbar_scale(): |
| | """ |
| | this function initializes draft statusbar scale widget |
| | """ |
| | mw = Gui.getMainWindow() |
| | sb = mw.statusBar() |
| |
|
| | scale_widget = QtWidgets.QToolBar() |
| | |
| | scale_widget.toggleViewAction().setVisible(False) |
| | scale_widget.setObjectName("draft_scale_widget") |
| | text = translate( |
| | "draft", |
| | "Draft Scale Widget", |
| | "A context menu action used to show or hide this toolbar widget", |
| | ) |
| | scale_widget.setWindowTitle(text) |
| |
|
| | |
| | draft_scales = get_scales() |
| |
|
| | |
| | scale_multiplier = params.get_param("DefaultAnnoScaleMultiplier") |
| | annotation_scale = 1 / scale_multiplier if scale_multiplier > 0 else 1 |
| |
|
| | |
| | scale_widget.draft_scales = draft_scales |
| | scaleLabel = QtWidgets.QPushButton("Scale") |
| | scaleLabel.setObjectName("ScaleLabel") |
| | scaleLabel.setFlat(True) |
| | menu = QtWidgets.QMenu(scaleLabel) |
| | gUnits = QtGui.QActionGroup(menu) |
| | for u in draft_scales: |
| | a = QtGui.QAction(gUnits) |
| | a.setText(u) |
| | menu.addAction(a) |
| | scaleLabel.setMenu(menu) |
| | gUnits.triggered.connect(_set_scale) |
| | scale_label = scale_to_label(annotation_scale) |
| | scaleLabel.setText(scale_label) |
| | scaleLabel.setToolTip(translate("draft", "Set the scale used by Draft annotation tools")) |
| | scale_widget.addWidget(scaleLabel) |
| | scale_widget.scaleLabel = scaleLabel |
| |
|
| | |
| | sb.insertPermanentWidget(3, scale_widget) |
| | scale_widget.show() |
| |
|
| |
|
| | def init_draft_statusbar_snap(): |
| | """ |
| | this function initializes draft statusbar snap widget |
| | """ |
| |
|
| | def _spacer(): |
| | """ |
| | empty label instead of snap_widget.addSeparator() |
| | """ |
| | label = QtWidgets.QLabel() |
| | label.setFixedWidth(2) |
| | return label |
| |
|
| | mw = Gui.getMainWindow() |
| | sb = mw.statusBar() |
| |
|
| | |
| | |
| | if mw.findChild(QtWidgets.QToolBar, "Draft Snap") is None: |
| | return |
| |
|
| | |
| | snap_widget = QtWidgets.QToolBar() |
| | |
| | snap_widget.toggleViewAction().setVisible(False) |
| | snap_widget.setObjectName("draft_snap_widget") |
| | text = translate( |
| | "draft", |
| | "Draft Snap Widget", |
| | "A context menu action used to show or hide this toolbar widget", |
| | ) |
| | snap_widget.setWindowTitle(text) |
| | snap_widget.setOrientation(QtCore.Qt.Orientation.Horizontal) |
| | snap_widget.setIconSize(QtCore.QSize(16, 16)) |
| | sb.insertPermanentWidget(2, snap_widget) |
| |
|
| | |
| | snap_widget.addAction(Gui.Command.get("Draft_ToggleGrid").getAction()[0]) |
| |
|
| | snap_widget.addWidget(_spacer()) |
| |
|
| | |
| | snap_widget.addAction(Gui.Command.get("Draft_Snap_Lock").getAction()[0]) |
| | snap_action = snap_widget.children()[-1] |
| | snap_action.setFixedWidth(40) |
| |
|
| | snap_widget.addWidget(_spacer()) |
| |
|
| | |
| | snap_widget.addAction(Gui.Command.get("Draft_Snap_Dimensions").getAction()[0]) |
| |
|
| | snap_widget.addWidget(_spacer()) |
| |
|
| | |
| | snap_widget.addAction(Gui.Command.get("Draft_Snap_Ortho").getAction()[0]) |
| |
|
| | snap_widget.addWidget(_spacer()) |
| |
|
| | |
| | snap_widget.addAction(Gui.Command.get("Draft_Snap_WorkingPlane").getAction()[0]) |
| |
|
| | |
| | for cmd in get_draft_snap_commands(): |
| | if cmd not in [ |
| | "Separator", |
| | "Draft_ToggleGrid", |
| | "Draft_Snap_Lock", |
| | "Draft_Snap_Dimensions", |
| | "Draft_Snap_Ortho", |
| | "Draft_Snap_WorkingPlane", |
| | ]: |
| | snap_action.addAction(Gui.Command.get(cmd).getAction()[0]) |
| |
|
| |
|
| | def show_draft_statusbar_scale(): |
| | """ |
| | shows draft statusbar scale widget |
| | """ |
| | mw = Gui.getMainWindow() |
| | sb = mw.statusBar() |
| |
|
| | scale_widget = sb.findChild(QtWidgets.QToolBar, "draft_scale_widget") |
| | if scale_widget: |
| | scale_widget.show() |
| | else: |
| | scale_widget = mw.findChild(QtWidgets.QToolBar, "draft_scale_widget") |
| | if scale_widget: |
| | sb.insertPermanentWidget(3, scale_widget) |
| | scale_widget.show() |
| | else: |
| | init_draft_statusbar_scale() |
| |
|
| |
|
| | def show_draft_statusbar_snap(): |
| | """ |
| | shows draft statusbar snap widget |
| | """ |
| | mw = Gui.getMainWindow() |
| | sb = mw.statusBar() |
| |
|
| | snap_widget = sb.findChild(QtWidgets.QToolBar, "draft_snap_widget") |
| | if snap_widget: |
| | snap_widget.setOrientation(QtCore.Qt.Orientation.Horizontal) |
| | snap_widget.show() |
| | else: |
| | snap_widget = mw.findChild(QtWidgets.QToolBar, "draft_snap_widget") |
| | if snap_widget: |
| | sb.insertPermanentWidget(2, snap_widget) |
| | snap_widget.setOrientation(QtCore.Qt.Orientation.Horizontal) |
| | snap_widget.show() |
| | else: |
| | init_draft_statusbar_snap() |
| |
|
| |
|
| | def hide_draft_statusbar_scale(): |
| | """ |
| | hides draft statusbar scale widget |
| | """ |
| | mw = Gui.getMainWindow() |
| | sb = mw.statusBar() |
| |
|
| | scale_widget = sb.findChild(QtWidgets.QToolBar, "draft_scale_widget") |
| | if scale_widget is None: |
| | |
| | |
| | scale_widget = mw.findChild(QtWidgets.QToolBar, "draft_scale_widget") |
| | if scale_widget: |
| | scale_widget.hide() |
| |
|
| |
|
| | def hide_draft_statusbar_snap(): |
| | """ |
| | hides draft statusbar snap widget |
| | """ |
| | mw = Gui.getMainWindow() |
| | sb = mw.statusBar() |
| |
|
| | snap_widget = sb.findChild(QtWidgets.QToolBar, "draft_snap_widget") |
| | if snap_widget is None: |
| | |
| | |
| | snap_widget = mw.findChild(QtWidgets.QToolBar, "draft_snap_widget") |
| | if snap_widget: |
| | snap_widget.hide() |
| |
|
| |
|
| | def show_draft_statusbar(): |
| | """ |
| | shows draft statusbar if present or initializes it |
| | """ |
| | if params.get_param("DisplayStatusbarScaleWidget"): |
| | QtCore.QTimer().singleShot(500, show_draft_statusbar_scale) |
| | if params.get_param("DisplayStatusbarSnapWidget"): |
| | QtCore.QTimer().singleShot(500, show_draft_statusbar_snap) |
| |
|
| |
|
| | def hide_draft_statusbar(): |
| | """ |
| | hides draft statusbar if present |
| | """ |
| | |
| | |
| | QtCore.QTimer().singleShot(500, hide_draft_statusbar_scale) |
| | QtCore.QTimer().singleShot(500, hide_draft_statusbar_snap) |
| |
|
| |
|
| | |
| |
|