Description |
---|
Use this to manage the visibility of document objects. There are 2 modes of operation: Show All and Show Types. In Show Types mode (the default) you only see a list of the types of objects, e.g. Body, Sketch, Pad, Extrude. Toggling one of the types off/on will set the visibility of all document objects of that type in the active document. |
Author |
TheMarkster |
Download |
ToolBar Icon |
Links |
Macros recipes How to install macros How to customize toolbars |
Macro Version |
1.06 |
Date last modified |
2020-06-18 |
FreeCAD Version(s) |
All |
Default shortcut |
None |
See also |
None |
Use this macro to manage visibility of document objects either by type or individually.
Macro_Visibility_Manager.FCMacro
# -*- coding: utf-8 -*- """ *************************************************************************** * Copyright (c) 2019 <TheMarkster> * * * * This file is a supplement to the FreeCAD CAx development system. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License (LGPL) * * as published by the Free Software Foundation; either version 2 of * * the License, or (at your option) any later version. * * * * This software is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License at http://www.gnu.org/licenses * * for more details. * * * * For more information about the GNU Library General Public License * * write to the Free Software Foundation, Inc., 59 Temple Place, * * Suite 330, Boston, MA 02111-1307 USA * * * *************************************************************************** """ """ Visibility_Manager Macro Use this to manage the visibility of document objects. There are 2 modes of operation: Show All and Show Types. In Show Types mode (the default) you only see a list of the types of objects, e.g. Body, Sketch, Pad, Extrude. Toggling one of the types off/on will set the visibility of all document objects of that type in the active document. In Show All mode (Press Shift key while executing the macro) you see a different checkbox for each and every document object, sorted alphabetically. You can toggle each object's visibility individually. """ __title__ = "Visibility_Manager" __author__ = "TheMarkster" __url__ = "" __Wiki__ = "https://www.freecadweb.org/wiki/Macro_Visibility_Manager" __date__ = "2020.06.18" __version__ = 1.06 import FreeCAD from PySide import QtCore, QtGui import time class Dlg(QtGui.QDialog): def __init__(self, bShowAll=False): QtGui.QDialog.__init__(self) self.types={} #dict of types self.showAll = bShowAll self.reload = False self.infoLabel = QtGui.QLabel() self.infoLabel.mousePressEvent = self.label_clicked if self.showAll: self.infoLabel.setText("Show All mode") else: self.infoLabel.setText("Show by Type mode") checkboxLayout = QtGui.QVBoxLayout() self.checkboxes = [] widget = QtGui.QWidget() #will hold scroll area checkboxLayout = QtGui.QVBoxLayout() self.addCheckboxes(checkboxLayout) widget.setLayout(checkboxLayout) #Scroll Area Properties scroll = QtGui.QScrollArea() scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) scroll.setWidgetResizable(True) scroll.setWidget(widget) vLayout = QtGui.QVBoxLayout() vLayout.addWidget(scroll) #buttons = QtGui.QDialogButtonBox( # QtGui.QDialogButtonBox.Ok.__or__(QtGui.QDialogButtonBox.Cancel), # QtCore.Qt.Horizontal, self) buttons = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok, QtCore.Qt.Horizontal,self) buttons.addButton(QtGui.QDialogButtonBox.Cancel) mode_button = buttons.addButton('Switch Mode', QtGui.QDialogButtonBox.ActionRole) mode_button.clicked.connect(self.label_clicked) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) buttons.setCenterButtons(True) layout = QtGui.QVBoxLayout() layout.addWidget(self.infoLabel) layout.addLayout(vLayout) layout.addWidget(buttons) self.setLayout(layout) def label_clicked(self, event): self.reload = True self.close() QtGui.QApplication.processEvents() time.sleep(0.1) def addCheckboxes (self, cbLayout): objectList = FreeCAD.ActiveDocument.findObjects() objectList.sort(key=lambda x: x.Name, reverse=False) nameList = [] for obj in objectList: if not self.nameInList(obj.Name, nameList): nameList.append(obj.Name) self.newType(obj.Name) all = QtGui.QCheckBox("All", self) all.setObjectName("all") all.toggled.connect(self.allToggled) cbLayout.addWidget(all) self.checkboxes = [all] for name in nameList: for nn in range(0,len(self.types[name])): objLabel = getattr(FreeCAD.ActiveDocument,self.types[name][nn]).Label objName = self.types[name][nn] if objLabel != objName and self.showAll: ck = QtGui.QCheckBox(self.types[name][nn]+" ("+objLabel+")", self) else: ck = QtGui.QCheckBox(objName,self) ck.setObjectName(objName) if getattr(FreeCAD.ActiveDocument,self.types[name][nn]).ViewObject.Visibility: ck.setCheckState(QtCore.Qt.Checked) else: ck.setCheckState(QtCore.Qt.Unchecked) if nn != 0 and not self.showAll: ck.hide() cbLayout.addWidget(ck) self.checkboxes.append(ck) def addToTypes(self, typeName, name): self.types[typeName].append(name) def newType(self, typeName): self.types[typeName] = [typeName] def nameInList(self, name, nameList): """ check if name is in nameList e.g. name = "Extrude002" nameList = ["Extrude", "Extrude001", "Extrude002"...] """ for nl in nameList: if nl in name and nl[:3] == name[:3]: self.addToTypes(nl,name) return True return False def allToggled(self): """all checkbox was toggled""" allState = self.checkboxes[0].checkState() for ii in range(1,len(self.checkboxes)): self.checkboxes[ii].setCheckState(allState) def accept(self): """user clicked Ok""" self.setWindowOpacity(0.85) self.infoLabel.setText("Working...") if self.showAll: for ii in range(1, len(self.checkboxes)): name = self.checkboxes[ii].objectName() state = self.checkboxes[ii].checkState() if state == QtCore.Qt.Checked: obj = getattr(FreeCAD.ActiveDocument, name) if not obj.ViewObject.Visibility: obj.ViewObject.Visibility = True else: obj = getattr(FreeCAD.ActiveDocument, name) if obj.ViewObject.Visibility: obj.ViewObject.Visibility = False QtGui.QApplication.processEvents() time.sleep(0.01) else: #show type mode for ii in range(1, len(self.checkboxes)): if not self.checkboxes[ii].isVisible(): continue name = self.checkboxes[ii].objectName() state = self.checkboxes[ii].checkState() if state == QtCore.Qt.Checked: for n in self.types[name]: obj = getattr(FreeCAD.ActiveDocument, n) obj.ViewObject.Visibility = True else: for n in self.types[name]: obj = getattr(FreeCAD.ActiveDocument, n) obj.ViewObject.Visibility = False QtGui.QApplication.processEvents() time.sleep(0.01) self.close() showAll = False modifiers = QtGui.QApplication.keyboardModifiers() if modifiers == QtCore.Qt.ShiftModifier: showAll = True if FreeCAD.ActiveDocument: dlg = Dlg(showAll) dlg.setWindowTitle("Visibility Manager v"+str(__version__)) result = dlg.exec_() while dlg.reload: showAll = not dlg.showAll dlg = Dlg(showAll) dlg.setWindowTitle("Visibility Manager v"+str(__version__)) result = dlg.exec_() else: FreeCAD.Console.PrintWarning("Visibility Manager v"+str(__version__)+": no active document\n")