def setEdit(self, vobj, mode=0): try: machine = run.getMachine(vobj.Object) except run.MustSaveError: error_message = ( "Please save the file before opening the task panel. " "This must be done because the location of the working " "directory is set to \"Beside *.FCStd File\"." ) App.Console.PrintError(error_message + "\n") QtGui.QMessageBox.critical( Gui.getMainWindow(), "Can't open Task Panel", error_message ) return False except run.DirectoryDoesNotExistError: error_message = "Selected working directory doesn't exist." App.Console.PrintError(error_message + "\n") QtGui.QMessageBox.critical( Gui.getMainWindow(), "Can't open Task Panel", error_message ) return False task = _TaskPanelFemSolverControl.ControlTaskPanel(machine) Gui.Control.showDialog(task) return True
def setEdit(self, vobj, mode=0): try: machine = run.getMachine(vobj.Object) except MustSaveError: error_message = ( "Please save the file before opening the task panel. " "This must be done because the location of the working " "directory is set to \"Beside *.FCStd File\".") App.Console.PrintError(error_message + "\n") QtGui.QMessageBox.critical(Gui.getMainWindow(), "Can't open Task Panel", error_message) return False except DirectoryDoesNotExistError: error_message = "Selected working directory doesn't exist." App.Console.PrintError(error_message + "\n") QtGui.QMessageBox.critical(Gui.getMainWindow(), "Can't open Task Panel", error_message) return False task = _TaskPanelFemSolverControl.ControlTaskPanel(machine) Gui.Control.showDialog(task) return True
def get_custom_base(solver): from femsolver.settings import get_custom_dir path = get_custom_dir() if not os.path.isdir(path): error_message = "Selected working directory doesn't exist." FreeCAD.Console.PrintError(error_message + "\n") if FreeCAD.GuiUp: QtGui.QMessageBox.critical(FreeCADGui.getMainWindow(), "Can't start Solver or Mesh creation.", error_message) raise DirectoryDoesNotExistError("Invalid path") return path
def setStatusIcons(show=True): "shows or hides the BIM icons in the status bar" def toggle(): FreeCADGui.runCommand("BIM_TogglePanels") def addonMgr(): FreeCADGui.runCommand("Std_AddonMgr") mw = FreeCADGui.getMainWindow() if mw: st = mw.statusBar() from PySide import QtCore,QtGui statuswidget = st.findChild(QtGui.QToolBar,"BIMStatusWidget") if show: if statuswidget: statuswidget.show() else: statuswidget = QtGui.QToolBar() statuswidget.setObjectName("BIMStatusWidget") unitLabel = QtGui.QLabel() unitLabel.setObjectName("UnitLabel") unit = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Units").GetInt("UserSchema",0) unitLabel.setText(["Millimeters","Meters","Imperial","Inches","Centimeters","Architectural","Millimeters"][unit]) statuswidget.addWidget(unitLabel) st.addPermanentWidget(statuswidget) togglebutton = QtGui.QPushButton() bwidth = togglebutton.fontMetrics().boundingRect("AAAA").width() togglebutton.setMaximumWidth(bwidth) togglebutton.setIcon(QtGui.QIcon(os.path.join(os.path.dirname(__file__),"icons","BIM_TogglePanels.svg"))) togglebutton.setText("") togglebutton.setToolTip("Toggle report panels on/off") togglebutton.setFlat(True) QtCore.QObject.connect(togglebutton,QtCore.SIGNAL("pressed()"),toggle) statuswidget.addWidget(togglebutton) updatebutton = QtGui.QPushButton() updatebutton.setObjectName("UpdateButton") updatebutton.setMaximumWidth(bwidth) updatebutton.setIcon(QtGui.QIcon(":/icons/view-refresh.svg")) updatebutton.setText("") updatebutton.setToolTip("An update to the BIM workbench is available. Click here to open the addons manager.") updatebutton.setFlat(True) QtCore.QObject.connect(updatebutton,QtCore.SIGNAL("pressed()"),addonMgr) updatebutton.hide() statuswidget.addWidget(updatebutton) else: if statuswidget: statuswidget.hide() else: # when switching workbenches, the toolbar sometimes "jumps" # out of the status bar to any other dock area... statuswidget = mw.findChild(QtGui.QToolBar,"BIMStatusWidget") if statuswidget: statuswidget.hide()
def open(filename): #All of the CQGui.* calls in the Python console break after opening if we don't do this FreeCADGui.doCommand("import FreeCADGui as CQGui") # Make sure that we enforce a specific version (2.7) of the Python interpreter ver = hex(sys.hexversion) interpreter = "python%s.%s" % (ver[2], ver[4]) # => 'python2.7' # The extra version numbers won't work on Windows if sys.platform.startswith('win'): interpreter = 'python' # Set up so that we can import from our embedded packages module_base_path = module_locator.module_path() libs_dir_path = os.path.join(module_base_path, 'Libs') # Make sure we get the right libs under the FreeCAD installation fc_base_path = os.path.dirname(os.path.dirname(module_base_path)) fc_lib_path = os.path.join(fc_base_path, 'lib') #Getting the main window will allow us to find the children we need to work with mw = FreeCADGui.getMainWindow() # Grab just the file name from the path/file that's being executed docname = os.path.basename(filename) # Pull the font size from the FreeCAD-stored settings fontSize = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/cadquery-freecad-module").GetInt("fontSize") # Set up the code editor codePane = CodeEditor() codePane.setFont(QtGui.QFont('SansSerif', fontSize)) codePane.setObjectName("cqCodePane_" + os.path.splitext(os.path.basename(filename))[0]) mdi = mw.findChild(QtGui.QMdiArea) # add a code editor widget to the mdi area sub = mdi.addSubWindow(codePane) sub.setWindowTitle(docname) sub.setWindowIcon(QtGui.QIcon(':/icons/applications-python.svg')) sub.show() mw.update() #Pull the text of the CQ script file into our code pane codePane.open(filename) msg = QtGui.QApplication.translate( "cqCodeWidget", "Opened ", None) FreeCAD.Console.PrintMessage(msg + filename + "\r\n") return
def Activated(self): # store changes to be committed self.deleteList = [] # create the dialog self.dialog = FreeCADGui.PySideUic.loadUi(os.path.join(os.path.dirname(__file__),"dialogLayers.ui")) # set nice icons self.dialog.setWindowIcon(QtGui.QIcon(":/icons/Draft_VisGroup.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/view-refresh.svg")) self.dialog.buttonCancel.setIcon(QtGui.QIcon(":/icons/edit_Cancel.svg")) self.dialog.buttonOK.setIcon(QtGui.QIcon(":/icons/edit_OK.svg")) # restore window geometry from stored state pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/BIM") w = pref.GetInt("LayersManagerWidth",640) h = pref.GetInt("LayersManagerHeight",320) self.dialog.resize(w,h) # center the dialog over FreeCAD window mw = FreeCADGui.getMainWindow() self.dialog.move(mw.frameGeometry().topLeft() + mw.rect().center() - self.dialog.rect().center()) # connect signals/slots 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) # set the model up self.model = QtGui.QStandardItemModel() self.dialog.tree.setModel(self.model) self.dialog.tree.setUniformRowHeights(True) self.dialog.tree.setItemDelegate(BIM_Layers_Delegate()) self.dialog.tree.setItemsExpandable(False) self.dialog.tree.setRootIsDecorated(False) # removes spacing in first column self.dialog.tree.setSelectionMode(QtGui.QTreeView.ExtendedSelection) # allow to select many # fill the tree view self.update() # rock 'n roll!!! self.dialog.exec_()
def addonMgr(): mw = FreeCADGui.getMainWindow() if mw: st = mw.statusBar() statuswidget = st.findChild(QtGui.QToolBar, "CivilToolsStatusWidget") if statuswidget: updatebutton = statuswidget.findChild(QtGui.QPushButton, "UpdateButton") if updatebutton: statuswidget.actions()[-1].setVisible(False) FreeCADGui.runCommand("Std_AddonMgr")
def getDocNode(): doc = FreeCADGui.ActiveDocument.Document.Name tws = FreeCADGui.getMainWindow().findChildren(QtGui.QTreeWidget) for tw in tws: if tw.topLevelItemCount() != 1 or tw.topLevelItem(0).text(0) != "Application": continue toptree = tw.topLevelItem(0) for i in range(0, toptree.childCount()): docitem = toptree.child(i) if docitem.text(0) == doc: return docitem return None
def _getBesideBase(solver): fcstdPath = solver.Document.FileName if fcstdPath == "": error_message = ( "Please save the file before executing the solver. " "This must be done because the location of the working " "directory is set to \"Beside *.FCStd File\".") App.Console.PrintError(error_message + "\n") if App.GuiUp: QtGui.QMessageBox.critical(FreeCADGui.getMainWindow(), "Can't start Solver", error_message) raise MustSaveError() return os.path.splitext(fcstdPath)[0]
def __init__(self, name): """ Constructor """ disable = 0 if name != "NoneWorkbench": # Disable connection after activation mw = FreeCADGui.getMainWindow() mw.workbenchActivated.disconnect(run) if disable: return mw.addDockWidget(QtCore.Qt.TopDockWidgetArea, MenuDock()) CollapsDock = p.GetString("CollapsibleDock", "On") if CollapsDock == "On": ModernDock.run()
def start_browser(): global __browser_instance__ if not __browser_instance__: main_window = Gui.getMainWindow().findChild(QtGui.QMdiArea) bi = WebView(tr('Extension Manager'), get_cache_path(), request_handler, message_handler, main_window) bi.closed.connect(on_web_view_close) index = path_to_extman_url(get_resource_path('html', 'index.html')) bi.load(index) main_window.addSubWindow(bi) bi.show() __browser_instance__ = bi return __browser_instance__
def slotUpdateAvailable(self,txt): "triggered if an update is available" mw = FreeCADGui.getMainWindow() if mw: st = mw.statusBar() from PySide import QtCore,QtGui statuswidget = st.findChild(QtGui.QToolBar,"BIMStatusWidget") if statuswidget: updatebutton = statuswidget.findChild(QtGui.QPushButton,"UpdateButton") if updatebutton: updatebutton.show()
def clearReportView(name: str = ""): """[Clear Report View console] Args: name ([type]): [description] """ mw = Gui.getMainWindow() r = mw.findChild(QtGui.QTextEdit, "Report view") r.clear() import time now = time.ctime(int(time.time())) App.Console.PrintWarning("Cleared Report view " + str(now) + " by " + name + "\n")
def run(): dw = QtGui.QDockWidget() dw.setWindowTitle("Zebra Tool") centralWidget = QtGui.QWidget() dw.setWidget(centralWidget) layout = QtGui.QVBoxLayout() centralWidget.setLayout(layout) dw.setMinimumSize(250, 305) z = zebra() layout.addWidget(z.zebraWidget) FreeCADWindow = FreeCADGui.getMainWindow() FreeCADWindow.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dw)
def getWidget(self): mw = FreeCADGui.getMainWindow() mdiarea = mw.findChild(QtGui.QMdiArea) sws = mdiarea.subWindowList() print "windows ..." for w2 in sws: print str(w2.windowTitle()) s = str(w2.windowTitle()) if s == self.name + '1 : 1[*]': print "gefundne" return w2 print self.name + '1:1[*]'
def _getCustomBase(solver): path = settings.get_custom_dir() if not os.path.isdir(path): error_message = "Selected working directory doesn't exist." App.Console.PrintError(error_message + "\n") if App.GuiUp: QtGui.QMessageBox.critical( FreeCADGui.getMainWindow(), "Can't start Solver", error_message ) raise DirectoryDoesNotExistError("Invalid path") return path
def single_instance(): import FreeCADGui as Gui from PySide2 import QtWidgets window = Gui.getMainWindow() if window: for i in window.findChildren(QtWidgets.QDockWidget): if i.objectName() == "InspectWidgets": i.deleteLater() else: pass else: pass
def Activated(self): from PySide import QtCore,QtGui vm = findWidget() bimviewsbutton = None mw = FreeCADGui.getMainWindow() st = mw.statusBar() statuswidget = st.findChild(QtGui.QToolBar,"BIMStatusWidget") if statuswidget: if hasattr(statuswidget,"bimviewsbutton"): bimviewsbutton = statuswidget.bimviewsbutton if vm: if vm.isVisible(): vm.hide() if bimviewsbutton: bimviewsbutton.setChecked(False) else: vm.show() if bimviewsbutton: bimviewsbutton.setChecked(True) update() else: vm = QtGui.QListWidget() vm.setObjectName("Views Manager") vm.setSortingEnabled(True) vm.setIconSize(QtCore.QSize(16,16)) QtCore.QObject.connect(vm, QtCore.SIGNAL("itemDoubleClicked(QListWidgetItem*)"),show) mw = FreeCADGui.getMainWindow() combo = mw.findChild(QtGui.QDockWidget,"Combo View") if combo: s = combo.findChild(QtGui.QSplitter) if s: # discount the widget size from the first one h = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/BIM").GetInt("BimViewsSize",100) sizes = s.sizes() sizes[0] = sizes[0]-h s.addWidget(vm) s.setSizes(sizes+[h]) update() from DraftGui import todo
def restore_Main_Tools(): #Getting the main window will allow us to start setting things up the way we want mw = FreeCADGui.getMainWindow() #Adjust the docks as usual dockWidgets = mw.findChildren(QtGui.QDockWidget) for widget in dockWidgets: if (widget.objectName() == "Report view") or (widget.objectName() == "Python console") or (widget.objectName() == "Combo View"): widget.setVisible(True) if (widget.objectName()=="cqCodeView"): widget.setVisible(False) return 0
def showUpdateButton(avail): if avail: mw = FreeCADGui.getMainWindow() if mw: st = mw.statusBar() statuswidget = st.findChild(QtGui.QToolBar, "BIMStatusWidget") if statuswidget: updatebutton = statuswidget.findChild( QtGui.QPushButton, "UpdateButton") if updatebutton: #updatebutton.show() # doesn't work for some reason statuswidget.actions()[-1].setVisible(True) if hasattr(FreeCAD, "bim_update_checker"): del FreeCAD.bim_update_checker
def Activated(self): import FreeCADGui from PySide import QtCore, QtGui # build objects list self.objectslist = {} for obj in FreeCAD.ActiveDocument.Objects: if hasattr(obj, "IfcType"): self.objectslist[obj.Name] = obj.IfcType elif hasattr(obj, "IfcRole"): self.objectslist[obj.Name] = obj.IfcRole try: import ArchIFC self.ifcroles = ArchIFC.IfcTypes except (ImportError, AttributeError): import ArchComponent self.ifcroles = ArchComponent.IfcRoles # load the form and set the tree model up self.form = FreeCADGui.PySideUic.loadUi( os.path.join(os.path.dirname(__file__), "dialogIfcQuantities.ui")) self.form.setWindowIcon( QtGui.QIcon( os.path.join(os.path.dirname(__file__), "icons", "BIM_IfcQuantities.svg"))) # quantities tab self.qmodel = QtGui.QStandardItemModel() self.form.quantities.setModel(self.qmodel) self.form.quantities.setUniformRowHeights(True) self.form.quantities.setItemDelegate(QtGui.QStyledItemDelegate()) self.quantitiesDrawn = False QtCore.QObject.connect( self.qmodel, QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.setChecked) QtCore.QObject.connect(self.form.buttonBox, QtCore.SIGNAL("accepted()"), self.accept) QtCore.QObject.connect(self.form.quantities, QtCore.SIGNAL("clicked(QModelIndex)"), self.onClickTree) QtCore.QObject.connect(self.form.onlyVisible, QtCore.SIGNAL("stateChanged(int)"), self.update) # center the dialog over FreeCAD window mw = FreeCADGui.getMainWindow() self.form.move(mw.frameGeometry().topLeft() + mw.rect().center() - self.form.rect().center()) self.update() self.form.show()
def toggle_Tree(): mw1 = FreeCADGui.getMainWindow() treesSel = mw1.findChildren(QtGui.QTreeWidget) for tree in treesSel: items = tree.selectedItems() for item in items: if item.isExpanded() == True: collapse = True print("collapsing") else: print("expanding") collapse = False toggleAllSel(tree, item, collapse)
def toggleContextMenu(point): FreeCADGui.BimToggleMenu = QtGui.QMenu() for t in [ "Report view", "Python console", "Selection view", "Combo View" ]: a = QtGui.QAction(t) #a.setCheckable(True) #a.setChecked(FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/BIM").GetBool("toggle"+t.replace(" ",""),True)) FreeCADGui.BimToggleMenu.addAction(a) pos = FreeCADGui.getMainWindow().cursor().pos() FreeCADGui.BimToggleMenu.triggered.connect(toggleSaveSettings) #QtCore.QObject.connect(FreeCADGui.BimToggleMenu,QtCore.SIGNAL("triggered(QAction *)"),toggleSaveSettings) FreeCADGui.BimToggleMenu.popup(pos)
def set_unit(action): utext = action.text().replace("&", "") # unit = [0,4,1,3,7,5][unitsList.index(utext)] action.parent().parent().parent().setText(utext) etabs = etabs_obj.EtabsModel(backup=False) if etabs.success: mw = FreeCADGui.getMainWindow() statuswidget = mw.findChild(QtGui.QToolBar, "CivilToolsStatusWidget") force = statuswidget.force_label.text() length = statuswidget.length_label.text() print(force, length) print('changed') etabs.set_current_unit(force, length)
def __init__(self, obj): self.obj = obj self.main_win = FreeCADGui.getMainWindow() self.widget = QtGui.QDockWidget() self.widget.ui = myWidget_Ui(obj) self.widget.ui.setupUi(self.widget) self.widget.ui.pushButton_7.clicked.connect(self.accept) self.main_win.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.widget) self.widget.setFloating(True) self.initial_visibility = self.obj.ViewObject.Visibility self.obj.ViewObject.Visibility = False
def Activated(self): # load dialog self.form = Gui.PySideUic.loadUi( os.path.join(os.path.dirname(__file__), "ui/preferences-punch_visual.ui")) # center the dialog over FreeCAD window mw = Gui.getMainWindow() self.form.move(mw.frameGeometry().topLeft() + mw.rect().center() - self.form.rect().center()) # show dialog and run setup dialog afterwards if OK was pressed self.form.show()
def display_image(img_path): """Display an image in FreeCAD Gui, using MDI (slot). This slot is intended to be connected to renderer executor worker's 'result_ready' signal. It creates a MDI subwindow in FreeCAD Gui and embeds an ImageViewer into it. """ if not img_path: return # Create widget and subwindow viewer = ImageViewer(Gui.getMainWindow()) mdiarea = Gui.getMainWindow().centralWidget() subw = mdiarea.addSubWindow(viewer) subw.setWindowTitle("Rendering result") subw.setVisible(True) # Set subwindow background to opaque bkg = Gui.getMainWindow().palette().color(QPalette.Background) style = ( "QMdiSubWindow {" f"background-color:rgb({bkg.red()},{bkg.green()},{bkg.blue()});" "border-style:none;" "margin:0px;" "}" ) subw.setStyleSheet(style) # Create context menu menu = subw.systemMenu() menu.addSeparator() subw.widget().add_actions_to_menu(menu) # Load image and show window subw.widget().load_image(img_path) subw.showMaximized()
def __init__(self, PathObj, parent=FreeCADGui.getMainWindow()): self.PathObj = PathObj QtGui.QDialog.__init__(self, parent) layout = QtGui.QVBoxLayout(self) p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Path") c = p.GetUnsigned("DefaultHighlightPathColor", 4286382335) Q = QtGui.QColor(int((c >> 24) & 0xFF), int((c >> 16) & 0xFF), int((c >> 8) & 0xFF)) highlightcolor = (Q.red() / 255., Q.green() / 255., Q.blue() / 255., Q.alpha() / 255.) self.selectionobj = FreeCAD.ActiveDocument.addObject("Path::Feature", "selection") self.selectionobj.ViewObject.LineWidth = 4 self.selectionobj.ViewObject.NormalColor = highlightcolor # nice text editor widget for editing the gcode self.editor = QtGui.QTextEdit() font = QtGui.QFont() p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Editor") font.setFamily(p.GetString("Font", "Courier")) font.setFixedPitch(True) font.setPointSize(p.GetInt("FontSize", 10)) self.editor.setFont(font) self.editor.setText("G01 X55 Y4.5 F300.0") self.highlighter = GCodeHighlighter(self.editor.document()) layout.addWidget(self.editor) # Note lab = QtGui.QLabel() lab.setText(translate("Path_Inspect", "<b>Note</b>: Pressing OK will commit any change you make above to the object, but if the object is parametric, these changes will be overridden on recompute.")) lab.setWordWrap(True) layout.addWidget(lab) # OK and Cancel buttons self.buttons = QtGui.QDialogButtonBox( QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel, QtCore.Qt.Horizontal, self) layout.addWidget(self.buttons) self.buttons.accepted.connect(self.accept) self.buttons.rejected.connect(self.reject) self.editor.selectionChanged.connect(self.highlightpath) self.finished.connect(self.cleanup) prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Path") Xpos = int(prefs.GetString('inspecteditorX', "0")) Ypos = int(prefs.GetString('inspecteditorY', "0")) height = int(prefs.GetString('inspecteditorH', "500")) width = int(prefs.GetString('inspecteditorW', "600")) self.move(Xpos, Ypos) self.resize(width, height)
def Activated(self): FreeCAD.Console.PrintMessage(self.exFile + "\r\n") # So we can open the "Open File" dialog mw = FreeCADGui.getMainWindow() # Start off defaulting to the Examples directory module_base_path = module_locator.module_path() exs_dir_path = os.path.join(module_base_path, 'Libs/cadquery/examples/FreeCAD') # Append this script's directory to sys.path sys.path.append(os.path.dirname(exs_dir_path)) # We've created a library that FreeCAD can use as well to open CQ files ImportCQ.open(os.path.join(exs_dir_path, self.exFile))
def toggleToolbars(mcs): hgrp = mcs.getToolbarParams() show = False for toolbar in mcs._HiddenToolbars: if not hgrp.GetBool(toolbar, True): show = True break mw = FreeCADGui.getMainWindow() for toolbar in mcs._HiddenToolbars: if show != hgrp.GetBool(toolbar, True): hgrp.SetBool(toolbar, show) tb = mw.findChild(QtGui.QToolBar, toolbar) if not tb: logger.error('cannot find toolbar "{}"', toolbar) tb.setVisible(show)
def IsActive(self): if self.waitingOnCutGui == True: if CutGui.getStatus() == 'hidden': self.processCutGUIResult() mw = FreeCADGui.getMainWindow() tree = mw.findChildren(QtGui.QTreeWidget)[0] if len(tree.selectedItems()) != 1: self.selectedObject = None else: item = tree.selectedItems()[0] obj = FreeCAD.ActiveDocument.getObjectsByLabel(item.text(0))[0] if obj.ObjectType == "GCodeJob": self.selectedObject = obj else: self.selectedObject = None return True