mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 15:08:51 +00:00
Also support changing profile for other sweptsolids
E.g. changing it for IfcRevolvedAreaSolid - https://imgur.com/a/jHOC8rt
This commit is contained in:
@@ -81,6 +81,9 @@ class AuthoringData:
|
|||||||
cls.data["active_class"] = cls.active_class()
|
cls.data["active_class"] = cls.active_class()
|
||||||
cls.data["active_material_usage"] = cls.active_material_usage()
|
cls.data["active_material_usage"] = cls.active_material_usage()
|
||||||
cls.data["is_representation_item_active"] = cls.is_representation_item_active()
|
cls.data["is_representation_item_active"] = cls.is_representation_item_active()
|
||||||
|
# After is_representation_item_active.
|
||||||
|
cls.data["is_representation_item_swept_solid"] = cls.is_representation_item_swept_solid()
|
||||||
|
|
||||||
cls.data["active_representation_type"] = cls.active_representation_type()
|
cls.data["active_representation_type"] = cls.active_representation_type()
|
||||||
cls.data["boundary_class"] = cls.boundary_class()
|
cls.data["boundary_class"] = cls.boundary_class()
|
||||||
cls.data["selected_material_usages"] = cls.selected_material_usages()
|
cls.data["selected_material_usages"] = cls.selected_material_usages()
|
||||||
@@ -246,6 +249,13 @@ class AuthoringData:
|
|||||||
return False
|
return False
|
||||||
return tool.Geometry.is_representation_item(obj)
|
return tool.Geometry.is_representation_item(obj)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_representation_item_swept_solid(cls) -> bool:
|
||||||
|
if not cls.data["is_representation_item_active"]:
|
||||||
|
return False
|
||||||
|
assert (obj := bpy.context.active_object) and (item := tool.Geometry.get_representation_item(obj))
|
||||||
|
return item.is_a("IfcSweptAreaSolid")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def active_representation_type(cls):
|
def active_representation_type(cls):
|
||||||
if active_object := tool.Blender.get_active_object():
|
if active_object := tool.Blender.get_active_object():
|
||||||
|
|||||||
@@ -284,7 +284,9 @@ class EditItemUI:
|
|||||||
assert obj
|
assert obj
|
||||||
|
|
||||||
mesh_props = obj.data.BIMMeshProperties
|
mesh_props = obj.data.BIMMeshProperties
|
||||||
if cls.get_item_object_class(obj) == "IfcExtrudedAreaSolid":
|
if AuthoringData.data["is_representation_item_swept_solid"]:
|
||||||
|
# TODO: support EndSweptArea for IfcRevolvedAreaSolidTapered,
|
||||||
|
# will need to add second attribute for this.
|
||||||
row = cls.layout.row(align=True)
|
row = cls.layout.row(align=True)
|
||||||
row.prop(mesh_props, "item_profile")
|
row.prop(mesh_props, "item_profile")
|
||||||
if mesh_props.item_profile == "-":
|
if mesh_props.item_profile == "-":
|
||||||
@@ -294,14 +296,10 @@ class EditItemUI:
|
|||||||
for item_attribute in obj.data.BIMMeshProperties.item_attributes:
|
for item_attribute in obj.data.BIMMeshProperties.item_attributes:
|
||||||
row = cls.layout.row()
|
row = cls.layout.row()
|
||||||
draw_attribute(item_attribute, cls.layout)
|
draw_attribute(item_attribute, cls.layout)
|
||||||
if len(obj.data.BIMMeshProperties.item_attributes):
|
if len(obj.data.BIMMeshProperties.item_attributes) or AuthoringData.data["is_representation_item_swept_solid"]:
|
||||||
row = cls.layout.row()
|
row = cls.layout.row()
|
||||||
row.operator("bim.update_item_attributes", icon="FILE_REFRESH", text="")
|
row.operator("bim.update_item_attributes", icon="FILE_REFRESH", text="")
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def get_item_object_class(cls, obj: bpy.types.Object) -> str:
|
|
||||||
return obj.name.split("/")[1]
|
|
||||||
|
|
||||||
|
|
||||||
class BIM_MT_add_representation_item(Menu):
|
class BIM_MT_add_representation_item(Menu):
|
||||||
bl_idname = "BIM_MT_add_representation_item"
|
bl_idname = "BIM_MT_add_representation_item"
|
||||||
|
|||||||
@@ -971,13 +971,19 @@ class Geometry(bonsai.core.tool.Geometry):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_representation_item(cls, obj: bpy.types.Object) -> bool:
|
def get_representation_item(cls, obj: bpy.types.Object) -> Union[ifcopenshell.entity_instance, None]:
|
||||||
return bool(
|
data = obj.data
|
||||||
(data := obj.data)
|
if (
|
||||||
and isinstance(data, Geometry.TYPES_WITH_MESH_PROPERTIES)
|
isinstance(data, Geometry.TYPES_WITH_MESH_PROPERTIES)
|
||||||
and (ifc_id := data.BIMMeshProperties.ifc_definition_id)
|
and (ifc_id := data.BIMMeshProperties.ifc_definition_id)
|
||||||
and tool.Ifc.get().by_id(ifc_id).is_a("IfcRepresentationItem")
|
and ((item := tool.Ifc.get().by_id(ifc_id)).is_a("IfcRepresentationItem"))
|
||||||
)
|
):
|
||||||
|
return item
|
||||||
|
return None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_representation_item(cls, obj: bpy.types.Object) -> bool:
|
||||||
|
return bool(cls.get_representation_item(obj))
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_active_or_representation_obj(cls) -> bpy.types.Object | None:
|
def get_active_or_representation_obj(cls) -> bpy.types.Object | None:
|
||||||
@@ -1677,7 +1683,7 @@ class Geometry(bonsai.core.tool.Geometry):
|
|||||||
bonsai.bim.helper.import_attributes2(item, props.item_attributes, callback=callback)
|
bonsai.bim.helper.import_attributes2(item, props.item_attributes, callback=callback)
|
||||||
|
|
||||||
profile = None
|
profile = None
|
||||||
if item.is_a("IfcExtrudedAreaSolid"):
|
if item.is_a("IfcSweptAreaSolid"):
|
||||||
profile = item.SweptArea
|
profile = item.SweptArea
|
||||||
if profile is None or profile.ProfileName is None:
|
if profile is None or profile.ProfileName is None:
|
||||||
item_profile = "-"
|
item_profile = "-"
|
||||||
|
|||||||
Reference in New Issue
Block a user