From ad8d83a71b42e0d1c32dd3aa76791e8c7efc43b9 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Thu, 19 Nov 2020 13:13:38 +0100 Subject: [PATCH] Arch: Windows: Added 'invert opening' and 'invert hinge' context menu items + task panel buttons --- src/Mod/Arch/ArchWindow.py | 78 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/Mod/Arch/ArchWindow.py b/src/Mod/Arch/ArchWindow.py index d7ce6b2a18..a9642a6117 100644 --- a/src/Mod/Arch/ArchWindow.py +++ b/src/Mod/Arch/ArchWindow.py @@ -1119,6 +1119,56 @@ class _ViewProviderWindow(ArchComponent.ViewProviderComponent): ccol = (ccol[0],ccol[1],ccol[2],t) return ccol + def setupContextMenu(self,vobj,menu): + + if hasattr(self,"Object"): + from PySide import QtCore,QtGui + import Draft_rc + action1 = QtGui.QAction(QtGui.QIcon(":/icons/Arch_Window_Tree.svg"),"Invert opening direction",menu) + QtCore.QObject.connect(action1,QtCore.SIGNAL("triggered()"),self.invertOpening) + menu.addAction(action1) + action2 = QtGui.QAction(QtGui.QIcon(":/icons/Arch_Window_Tree.svg"),"Invert hinge position",menu) + QtCore.QObject.connect(action2,QtCore.SIGNAL("triggered()"),self.invertHinge) + menu.addAction(action2) + + def invertOpening(self): + + """swaps the opening modes found in this window""" + + pairs = [["Mode"+str(i),"Mode"+str(i+1)] for i in range(1,len(WindowOpeningModes),2)] + self.invertPairs(pairs) + + def invertHinge(self): + + """swaps the hinges found in this window""" + + pairs = [["Edge6","Edge8"],["Edge5","Edge7"]] + self.invertPairs(pairs) + + def invertPairs(self,pairs): + + """scans the WindowParts of this window and swaps the two elements of each pair, if found""" + + if hasattr(self,"Object"): + windowparts = self.Object.WindowParts + nparts = [] + for part in windowparts: + for pair in pairs: + if pair[0] in part: + part = part.replace(pair[0],pair[1]) + break + elif pair[1] in part: + part = part.replace(pair[1],pair[0]) + break + nparts.append(part) + if nparts != self.Object.WindowParts: + self.Object.WindowParts = nparts + FreeCAD.ActiveDocument.recompute() + else: + FreeCAD.Console.PrintWarning(translate("Arch","This window has no defined opening")+"\n") + + + class _ArchWindowTaskPanel: '''The TaskPanel for Arch Windows''' @@ -1184,6 +1234,18 @@ class _ArchWindowTaskPanel: self.delButton.setMaximumSize(QtCore.QSize(70,40)) self.delButton.setEnabled(False) + # invert buttons + self.invertOpeningButton = QtGui.QPushButton(self.baseform) + self.invertOpeningButton.setIcon(QtGui.QIcon(":/icons/Arch_Window_Tree.svg")) + self.invertOpeningButton.clicked.connect(self.invertOpening) + self.grid.addWidget(self.invertOpeningButton, 5, 0, 1, 7) + self.invertOpeningButton.setEnabled(False) + self.invertHingeButton = QtGui.QPushButton(self.baseform) + self.invertHingeButton.setIcon(QtGui.QIcon(":/icons/Arch_Window_Tree.svg")) + self.invertHingeButton.clicked.connect(self.invertHinge) + self.grid.addWidget(self.invertHingeButton, 6, 0, 1, 7) + self.invertHingeButton.setEnabled(False) + # add new ui = FreeCADGui.UiLoader() @@ -1366,6 +1428,11 @@ class _ArchWindowTaskPanel: self.retranslateUi(self.baseform) self.basepanel.obj = self.obj self.basepanel.update() + for wp in self.obj.WindowParts: + if ("Edge" in wp) and ("Mode" in wp): + self.invertOpeningButton.setEnabled(True) + self.invertHingeButton.setEnabled(True) + break def addElement(self): @@ -1579,11 +1646,22 @@ class _ArchWindowTaskPanel: self.addp5.setToolTip(QtGui.QApplication.translate("Arch", "If this is checked, the default Offset value of this window will be added to the value entered here", None)) self.field6.setText(QtGui.QApplication.translate("Arch", "Get selected edge", None)) self.field6.setToolTip(QtGui.QApplication.translate("Arch", "Press to retrieve the selected edge", None)) + self.invertOpeningButton.setText(QtGui.QApplication.translate("Arch", "Invert opening direction", None)) + self.invertHingeButton.setText(QtGui.QApplication.translate("Arch", "Invert hinge position", None)) for i in range(len(WindowPartTypes)): self.field2.setItemText(i, QtGui.QApplication.translate("Arch", WindowPartTypes[i], None)) for i in range(len(WindowOpeningModes)): self.field7.setItemText(i, QtGui.QApplication.translate("Arch", WindowOpeningModes[i], None)) + def invertOpening(self): + + if self.obj: + self.obj.ViewObject.Proxy.invertOpening() + + def invertHinge(self): + + if self.obj: + self.obj.ViewObject.Proxy.invertHinge() if FreeCAD.GuiUp: