mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 22:50:21 +00:00
Add utility method to retrieve dynamic enum items without needing a reference to the callback
This is useful because trying to directly access a dynamic enum with an empty items list throws an error in the console + Remove prop search from template_type in pset ui which has only 2 elements
This commit is contained in:
@@ -108,7 +108,7 @@ def export_attributes(props, callback=None):
|
|||||||
return attributes
|
return attributes
|
||||||
|
|
||||||
|
|
||||||
def prop_with_search(layout, data, prop_name, **kwargs):
|
def prop_with_search(layout, data, prop_name, **kwargs):
|
||||||
# kwargs are layout.prop arguments (text, icon, etc.)
|
# kwargs are layout.prop arguments (text, icon, etc.)
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
# Magick courtesy of https://blender.stackexchange.com/a/203443/86891
|
# Magick courtesy of https://blender.stackexchange.com/a/203443/86891
|
||||||
@@ -118,6 +118,20 @@ def prop_with_search(layout, data, prop_name, **kwargs):
|
|||||||
op.prop_name = prop_name
|
op.prop_name = prop_name
|
||||||
|
|
||||||
|
|
||||||
|
def get_enum_items(data, prop_name, context):
|
||||||
|
# Retrieve items from a dynamic EnumProperty, which is otherwise not supported
|
||||||
|
# Or throws an error in the console when the items callback returns an empty list
|
||||||
|
# See https://blender.stackexchange.com/q/215781/86891
|
||||||
|
prop = data.__annotations__[prop_name]
|
||||||
|
items = prop.keywords.get("items")
|
||||||
|
if items is None:
|
||||||
|
return
|
||||||
|
if not isinstance(items, (list, tuple)):
|
||||||
|
# items are retrieved through a callback, not a static list :
|
||||||
|
items = items(data, context)
|
||||||
|
return items
|
||||||
|
|
||||||
|
|
||||||
class IfcHeaderExtractor:
|
class IfcHeaderExtractor:
|
||||||
def __init__(self, filepath: str):
|
def __init__(self, filepath: str):
|
||||||
self.filepath = filepath
|
self.filepath = filepath
|
||||||
|
|||||||
@@ -490,7 +490,7 @@ class BIM_PT_add_edit_custom_properties(Panel):
|
|||||||
if prop.template_type == "IfcPropertySingleValue":
|
if prop.template_type == "IfcPropertySingleValue":
|
||||||
row.prop(prop, prop.get_value_name(), text="")
|
row.prop(prop, prop.get_value_name(), text="")
|
||||||
prop_with_search(row, prop, "primary_measure_type", text="")
|
prop_with_search(row, prop, "primary_measure_type", text="")
|
||||||
prop_with_search(row, prop, "template_type", text="")
|
row.prop(prop, "template_type", text="")
|
||||||
op = row.operator("bim.remove_property_to_edit", icon="X", text="")
|
op = row.operator("bim.remove_property_to_edit", icon="X", text="")
|
||||||
op.index = index
|
op.index = index
|
||||||
op.option = "AddEditProperties"
|
op.option = "AddEditProperties"
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import blenderbim.core.root as core
|
|||||||
import blenderbim.tool as tool
|
import blenderbim.tool as tool
|
||||||
from ifcopenshell.api.void.data import Data as VoidData
|
from ifcopenshell.api.void.data import Data as VoidData
|
||||||
from blenderbim.bim.ifc import IfcStore
|
from blenderbim.bim.ifc import IfcStore
|
||||||
|
from blenderbim.bim.helper import get_enum_items
|
||||||
|
|
||||||
|
|
||||||
class Operator:
|
class Operator:
|
||||||
@@ -131,7 +132,7 @@ class AssignClass(bpy.types.Operator, Operator):
|
|||||||
ifc_class = self.ifc_class or props.ifc_class
|
ifc_class = self.ifc_class or props.ifc_class
|
||||||
predefined_type = self.userdefined_type if self.predefined_type == "USERDEFINED" else self.predefined_type
|
predefined_type = self.userdefined_type if self.predefined_type == "USERDEFINED" else self.predefined_type
|
||||||
ifc_context = self.context_id
|
ifc_context = self.context_id
|
||||||
if not ifc_context and props.__annotations__["contexts"].keywords.get("items")(props, context):
|
if not ifc_context and get_enum_items(props, "contexts", context):
|
||||||
ifc_context = int(props.contexts or "0") or None
|
ifc_context = int(props.contexts or "0") or None
|
||||||
if ifc_context:
|
if ifc_context:
|
||||||
ifc_context = tool.Ifc.get().by_id(ifc_context)
|
ifc_context = tool.Ifc.get().by_id(ifc_context)
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ from . import schema
|
|||||||
from blenderbim.bim.ifc import IfcStore
|
from blenderbim.bim.ifc import IfcStore
|
||||||
from blenderbim.bim.prop import StrProperty
|
from blenderbim.bim.prop import StrProperty
|
||||||
from blenderbim.bim.ui import IFCFileSelector
|
from blenderbim.bim.ui import IFCFileSelector
|
||||||
|
from blenderbim.bim.helper import get_enum_items
|
||||||
from mathutils import Vector, Matrix, Euler
|
from mathutils import Vector, Matrix, Euler
|
||||||
from math import radians
|
from math import radians
|
||||||
|
|
||||||
@@ -545,11 +546,9 @@ class BIM_OT_enum_property_search(bpy.types.Operator):
|
|||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
self.clear_collections()
|
self.clear_collections()
|
||||||
self.data = context.data
|
self.data = context.data
|
||||||
items = self.data.__annotations__[self.prop_name].keywords.get("items")
|
items = get_enum_items(self.data, self.prop_name, context)
|
||||||
if items is None:
|
if items is None:
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
if not isinstance(items, list):
|
|
||||||
items = items(self.data, context)
|
|
||||||
self.add_items_regular(items)
|
self.add_items_regular(items)
|
||||||
self.add_items_suggestions()
|
self.add_items_suggestions()
|
||||||
return context.window_manager.invoke_props_dialog(self)
|
return context.window_manager.invoke_props_dialog(self)
|
||||||
|
|||||||
Reference in New Issue
Block a user