Skip to content

Commit

Permalink
Support for material properties
Browse files Browse the repository at this point in the history
  • Loading branch information
yorikvanhavre committed Jun 12, 2023
1 parent 1e1e6c8 commit 1ba65dc
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 16 deletions.
4 changes: 2 additions & 2 deletions ifc_import.py
Expand Up @@ -60,10 +60,10 @@ def insert(
prj_obj = ifc_tools.create_document(document, filename, shapemode, strategy)
if params.GetBool("LoadOrphans", False):
ifc_tools.load_orphans(prj_obj)
if params.GetBool("LoadPsets", False):
ifc_tools.load_psets(prj_obj)
if not silent and params.GetBool("LoadMaterials", False):
ifc_tools.load_materials(prj_obj)
if params.GetBool("LoadPsets", False):
ifc_tools.load_psets(prj_obj)
document.recompute()
if FreeCAD.GuiUp:
FreeCADGui.doCommand(
Expand Down
27 changes: 21 additions & 6 deletions ifc_tools.py
Expand Up @@ -219,7 +219,6 @@ def create_material(element, parent, recursive=False):
create_material(s, obj, recursive)
else:
create_material(submat, obj, recursive)
show_psets(obj)
return obj


Expand Down Expand Up @@ -490,10 +489,11 @@ def add_properties(
elif data_type == "boolean":
if attr not in obj.PropertiesList:
obj.addProperty("App::PropertyBool", attr, "IFC")
if not value:
if not value or value in ["UNKNOWN", "FALSE"]:
value = False
elif not isinstance(value, bool):
print("DEBUG: attempting to set boolean value:", attr, value)
value = bool(value)
setattr(obj, attr, value) # will trigger error. TODO: Fix this
elif isinstance(value, ifcopenshell.entity_instance):
if links:
Expand Down Expand Up @@ -1428,9 +1428,12 @@ def has_psets(obj):

element = get_ifc_element(obj)
psets = getattr(element, "IsDefinedBy", [])
if [p for p in psets if p.is_a("IfcRelDefinesByProperties")]:
if psets and [p for p in psets if p.is_a("IfcRelDefinesByProperties")]:
# TODO verify too if these psets are not already there
return True
psets = getattr(element, "HasProperties", [])
if psets:
return True
return False


Expand All @@ -1443,11 +1446,16 @@ def get_psets(element):
psets = getattr(element, "IsDefinedBy", [])
psets = [p for p in psets if p.is_a("IfcRelDefinesByProperties")]
psets = [p.RelatingPropertyDefinition for p in psets]
if not psets:
psets = getattr(element, "HasProperties", [])
for pset in psets:
pset_dict = {}
if pset.is_a("IfcPropertySet"):
for prop in pset.HasProperties:
pset_dict[prop.Name] = str(prop.NominalValue)
if pset.is_a("IfcMaterialProperties"):
for prop in pset.Properties:
pset_dict[prop.Name] = str(prop.NominalValue)
elif pset.is_a("IfcElementQuantity"):
# TODO implement quantities
pass
Expand Down Expand Up @@ -1500,6 +1508,9 @@ def show_psets(obj):
obj.addProperty("App::PropertyVolume", pname, gname, ttip)
elif ptype in ["IfcPositivePlaneAngleMeasure", "IfcPlaneAngleMeasure"]:
obj.addProperty("App::PropertyAngle", pname, gname, ttip)
value = float(value)
while value > 360:
value = value - 360
elif ptype in ["IfcMassMeasure"]:
obj.addProperty("App::PropertyMass", pname, gname, ttip)
elif ptype in ["IfcAreaMeasure"]:
Expand Down Expand Up @@ -1567,6 +1578,10 @@ def edit_pset(obj, prop, value=None):
elif isinstance(value, float):
value_exist = float(value_exist)
elif isinstance(value, FreeCAD.Units.Quantity):
if value.Unit.Type == "Angle":
value_exist = float(value_exist)
while value_exist > 360:
value_exist = value_exist - 360
value_exist = FreeCAD.Units.Quantity(float(value_exist), value.Unit)
if value == value_exist:
return False
Expand All @@ -1577,15 +1592,15 @@ def edit_pset(obj, prop, value=None):
+ " ("
+ str(obj.StepId)
+ ") : "
+ target_prop
+ str(target_prop)
+ " : "
+ str(value)
+ " ("
+ type(value)
+ str(type(value))
+ ") -> "
+ str(value_exist)
+ " ("
+ type(value_exist)
+ str(type(value_exist))
+ ")\n"
)
pset = get_pset(pset, element)
Expand Down
64 changes: 56 additions & 8 deletions ifc_viewproviders.py
Expand Up @@ -436,22 +436,70 @@ def __setstate__(self, state):
return None

def getIcon(self):
from PySide2 import QtCore, QtGui # lazy loading

if not hasattr(self, "modicon"):
if hasattr(self, "icondata"):
return self.icondata
else:
import Arch_rc

self.modicon = overlay(
QtGui.QIcon(":/icons/Arch_Material.svg"),
os.path.join(os.path.dirname(__file__), "icons", "IFC.svg"),
)
return self.modicon
return ":/icons/Arch_Material.svg"

def updateData(self, obj, prop):
from PySide2 import QtCore, QtGui # lazy loading

if hasattr(self.Object, "Color"):
c = self.Object.Color
matcolor = QtGui.QColor(int(c[0] * 255), int(c[1] * 255), int(c[2] * 255))
darkcolor = QtGui.QColor(int(c[0] * 125), int(c[1] * 125), int(c[2] * 125))
else:
matcolor = QtGui.QColor(200, 200, 200)
darkcolor = QtGui.QColor(120, 120, 120)
im = QtGui.QImage(48, 48, QtGui.QImage.Format_ARGB32)
im.fill(QtCore.Qt.transparent)
pt = QtGui.QPainter(im)
pt.setPen(
QtGui.QPen(QtCore.Qt.black, 2, QtCore.Qt.SolidLine, QtCore.Qt.FlatCap)
)
gradient = QtGui.QLinearGradient(0, 0, 48, 48)
gradient.setColorAt(0, matcolor)
gradient.setColorAt(1, darkcolor)
pt.setBrush(QtGui.QBrush(gradient))
pt.drawEllipse(6, 6, 36, 36)
pt.setPen(
QtGui.QPen(QtCore.Qt.white, 1, QtCore.Qt.SolidLine, QtCore.Qt.FlatCap)
)
pt.setBrush(QtGui.QBrush(QtCore.Qt.white, QtCore.Qt.SolidPattern))
pt.drawEllipse(12, 12, 12, 12)
pt.end()
ba = QtCore.QByteArray()
b = QtCore.QBuffer(ba)
b.open(QtCore.QIODevice.WriteOnly)
im.save(b, "XPM")
self.icondata = ba.data().decode("latin1")

def claimChildren(self):
if hasattr(self.Object, "Group"):
return self.Object.Group
return []

def setupContextMenu(self, vobj, menu):
import ifc_tools # lazy import
from PySide2 import QtCore, QtGui, QtWidgets # lazy import

path = os.path.dirname(os.path.dirname(__file__))
icon = QtGui.QIcon(os.path.join(path, "icons", "IFC.svg"))
if ifc_tools.has_psets(self.Object):
action_props = QtWidgets.QAction(icon, "Expand property sets", menu)
action_props.triggered.connect(self.showProps)
menu.addAction(action_props)

def showProps(self):
"""Expands property sets"""

import ifc_tools # lazy loading

ifc_tools.show_psets(self.Object)
self.Object.Document.recompute()


def overlay(icon1, icon2):
"""Overlays icon2 onto icon1"""
Expand Down

0 comments on commit 1ba65dc

Please sign in to comment.