258 lines
10 KiB
Python
258 lines
10 KiB
Python
# ***************************************************************************
|
|
# * *
|
|
# * Copyright (c) 2017 Yorik van Havre <yorik@uncreated.net> *
|
|
# * *
|
|
# * 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. *
|
|
# * for detail see the LICENCE text file. *
|
|
# * *
|
|
# * This program 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 for more details. *
|
|
# * *
|
|
# * You should have received a copy of the GNU Library General Public *
|
|
# * License along with this program; if not, write to the Free Software *
|
|
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
|
# * USA *
|
|
# * *
|
|
# ***************************************************************************
|
|
|
|
"""The BIM Windows Manager command"""
|
|
|
|
import os
|
|
import FreeCAD
|
|
import FreeCADGui
|
|
|
|
QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP
|
|
translate = FreeCAD.Qt.translate
|
|
|
|
|
|
class BIM_Windows:
|
|
def GetResources(self):
|
|
return {
|
|
"Pixmap": "BIM_Windows",
|
|
"MenuText": QT_TRANSLATE_NOOP("BIM_Windows", "Manage doors and windows..."),
|
|
"ToolTip": QT_TRANSLATE_NOOP(
|
|
"BIM_Windows",
|
|
"Manage the different doors and windows of your BIM project",
|
|
),
|
|
}
|
|
|
|
def IsActive(self):
|
|
v = hasattr(FreeCADGui.getMainWindow().getActiveWindow(), "getSceneGraph")
|
|
return v
|
|
|
|
def Activated(self):
|
|
FreeCADGui.Control.showDialog(BIM_Windows_TaskPanel())
|
|
|
|
|
|
class BIM_Windows_TaskPanel:
|
|
|
|
def __init__(self):
|
|
from PySide import QtCore, QtGui
|
|
|
|
self.form = FreeCADGui.PySideUic.loadUi(":/ui/dialogWindows.ui")
|
|
self.form.setWindowIcon(QtGui.QIcon(":/icons/BIM_Windows.svg"))
|
|
self.form.groupMode.currentIndexChanged.connect(self.update)
|
|
self.form.windows.itemClicked.connect(self.editWindow)
|
|
self.form.windows.itemDoubleClicked.connect(self.showWindow)
|
|
self.form.windowLabel.returnPressed.connect(self.setLabel)
|
|
self.form.windowDescription.returnPressed.connect(self.setDescription)
|
|
self.form.windowTag.returnPressed.connect(self.setTag)
|
|
self.form.windowHeight.returnPressed.connect(self.setHeight)
|
|
self.form.windowWidth.returnPressed.connect(self.setWidth)
|
|
self.form.windowMaterial.clicked.connect(self.setMaterial)
|
|
self.form.windows.header().setResizeMode(0, QtGui.QHeaderView.Stretch)
|
|
self.update()
|
|
|
|
def getStandardButtons(self):
|
|
from PySide import QtGui
|
|
|
|
return int(QtGui.QDialogButtonBox.Close)
|
|
|
|
def reject(self):
|
|
FreeCADGui.Control.closeDialog()
|
|
FreeCAD.ActiveDocument.recompute()
|
|
|
|
def update(self, index=None):
|
|
import Draft, Arch_rc
|
|
from PySide import QtGui
|
|
|
|
self.form.windows.clear()
|
|
windows = [
|
|
o for o in FreeCAD.ActiveDocument.Objects if Draft.getType(o) == "Window"
|
|
]
|
|
if self.form.groupMode.currentIndex() == 0:
|
|
for window in windows:
|
|
s1 = window.Label
|
|
s2 = window.Tag
|
|
it = QtGui.QTreeWidgetItem([s1, s2])
|
|
it.setIcon(0, QtGui.QIcon(":/icons/Arch_Window_Tree.svg"))
|
|
it.setToolTip(0, window.Name)
|
|
self.form.windows.addTopLevelItem(it)
|
|
else:
|
|
groups = {}
|
|
for window in windows:
|
|
group = None
|
|
if self.form.groupMode.currentIndex() == 1:
|
|
group = window.Width.UserString + " x " + window.Height.UserString
|
|
elif self.form.groupMode.currentIndex() == 2:
|
|
if window.CloneOf:
|
|
group = window.CloneOf.Label
|
|
else:
|
|
group = window.Name
|
|
elif self.form.groupMode.currentIndex() == 3:
|
|
group = window.Tag
|
|
else:
|
|
if window.Material:
|
|
group = window.Material.Label
|
|
if not group:
|
|
group = "None"
|
|
if group in groups:
|
|
groups[group].append(window)
|
|
else:
|
|
groups[group] = [window]
|
|
for group in groups.keys():
|
|
s1 = group
|
|
top = QtGui.QTreeWidgetItem([s1, ""])
|
|
top.setExpanded(True)
|
|
self.form.windows.addTopLevelItem(top)
|
|
for window in groups[group]:
|
|
s1 = window.Label
|
|
s2 = window.Tag
|
|
it = QtGui.QTreeWidgetItem([s1, s2])
|
|
it.setIcon(0, QtGui.QIcon(":/icons/Arch_Window_Tree.svg"))
|
|
it.setToolTip(0, window.Name)
|
|
top.addChild(it)
|
|
self.form.windows.expandAll()
|
|
wc = 0
|
|
dc = 0
|
|
for w in windows:
|
|
if hasattr(w, "IfcType"):
|
|
r = w.IfcType
|
|
elif hasattr(w, "IfcRole"):
|
|
r = w.IfcRole
|
|
else:
|
|
r = w.Role
|
|
if "Window" in r:
|
|
wc += 1
|
|
elif "Door" in r:
|
|
dc += 1
|
|
self.form.windowsCount.setText(str(wc))
|
|
self.form.doorsCount.setText(str(dc))
|
|
|
|
def editWindow(self, item, column):
|
|
|
|
if len(self.form.windows.selectedItems()) == 1:
|
|
# don't change the contents if we have more than one floor selected
|
|
window = FreeCAD.ActiveDocument.getObject(item.toolTip(0))
|
|
if window:
|
|
self.form.windowLabel.setText(window.Label)
|
|
self.form.windowDescription.setText(window.Description)
|
|
self.form.windowTag.setText(window.Tag)
|
|
self.form.windowWidth.setText(window.Width.UserString)
|
|
self.form.windowHeight.setText(window.Height.UserString)
|
|
if window.Material:
|
|
self.form.windowMaterial.setText(window.Material.Label)
|
|
# select objects
|
|
FreeCADGui.Selection.clearSelection()
|
|
for item in self.form.windows.selectedItems():
|
|
o = FreeCAD.ActiveDocument.getObject(item.toolTip(0))
|
|
if o:
|
|
FreeCADGui.Selection.addSelection(o)
|
|
|
|
def showWindow(self, item, column):
|
|
|
|
window = FreeCAD.ActiveDocument.getObject(item.toolTip(0))
|
|
if window:
|
|
FreeCADGui.Selection.clearSelection()
|
|
FreeCADGui.Selection.addSelection(window)
|
|
FreeCADGui.SendMsgToActiveView("ViewSelection")
|
|
|
|
def setWidth(self):
|
|
val = FreeCAD.Units.Quantity(self.form.windowWidth.text()).Value
|
|
if val:
|
|
for it in self.form.windows.selectedItems():
|
|
window = FreeCAD.ActiveDocument.getObject(it.toolTip(0))
|
|
if window:
|
|
window.Width = val
|
|
self.update()
|
|
|
|
def setHeight(self):
|
|
val = FreeCAD.Units.Quantity(self.form.windowHeight.text()).Value
|
|
if val:
|
|
for it in self.form.windows.selectedItems():
|
|
window = FreeCAD.ActiveDocument.getObject(it.toolTip(0))
|
|
if window:
|
|
window.Height = val
|
|
self.update()
|
|
|
|
def setLabel(self):
|
|
val = self.form.windowLabel.text()
|
|
if val:
|
|
for it in self.form.windows.selectedItems():
|
|
window = FreeCAD.ActiveDocument.getObject(it.toolTip(0))
|
|
if window:
|
|
window.Label = val
|
|
self.update()
|
|
|
|
def setTag(self):
|
|
for it in self.form.windows.selectedItems():
|
|
window = FreeCAD.ActiveDocument.getObject(it.toolTip(0))
|
|
if window:
|
|
window.Tag = self.form.windowTag.text()
|
|
self.update()
|
|
|
|
def setDescription(self):
|
|
for it in self.form.windows.selectedItems():
|
|
window = FreeCAD.ActiveDocument.getObject(it.toolTip(0))
|
|
if window:
|
|
window.Description = self.form.windowDescription.text()
|
|
self.update()
|
|
|
|
def setMaterial(self):
|
|
import Draft, Arch_rc
|
|
from PySide import QtGui
|
|
|
|
form = FreeCADGui.PySideUic.loadUi(":/ui/dialogMaterialChooser.ui")
|
|
mw = FreeCADGui.getMainWindow()
|
|
form.move(
|
|
mw.frameGeometry().topLeft() + mw.rect().center() - form.rect().center()
|
|
)
|
|
materials = [
|
|
o for o in FreeCAD.ActiveDocument.Objects if Draft.getType(o) == "Material"
|
|
]
|
|
it = QtGui.QListWidgetItem(translate("BIM", "None"))
|
|
it.setIcon(QtGui.QIcon(":/icons/button_invalid.svg"))
|
|
it.setToolTip("__None__")
|
|
form.list.addItem(it)
|
|
for mat in materials:
|
|
it = QtGui.QListWidgetItem(mat.Label)
|
|
it.setIcon(QtGui.QIcon(":/icons/Arch_Material.svg"))
|
|
it.setToolTip(mat.Name)
|
|
form.list.addItem(it)
|
|
result = form.exec_()
|
|
if result:
|
|
mat = None
|
|
sel = form.list.selectedItems()
|
|
if sel:
|
|
sel = sel[0]
|
|
if sel.toolTip() != "__None__":
|
|
mat = FreeCAD.ActiveDocument.getObject(str(sel.toolTip()))
|
|
for it in self.form.windows.selectedItems():
|
|
window = FreeCAD.ActiveDocument.getObject(it.toolTip(0))
|
|
if window:
|
|
if mat:
|
|
window.Material = mat
|
|
else:
|
|
window.Material = None
|
|
if mat:
|
|
self.form.windowMaterial.setText(mat.Label)
|
|
self.update()
|
|
|
|
|
|
FreeCADGui.addCommand("BIM_Windows", BIM_Windows())
|