Simple application UI for editing attributes

Example - https://files.catbox.moe/i0wgid.png

Previously before 71d469a27 we produced a lot of IfcApplications on live-builds because of the version differences, now it's possible to edit them from UI - fix the differences and merge them using 106323847
This commit is contained in:
Andrej730
2025-06-18 19:00:04 +05:00
parent 934c9e1485
commit 9af15aeb0b
6 changed files with 122 additions and 3 deletions
@@ -23,6 +23,7 @@ classes = (
operator.AddActor,
operator.AddAddress,
operator.AddAddressAttribute,
operator.AddApplication,
operator.AddOrganisation,
operator.AddPerson,
operator.AddPersonAndOrganisation,
@@ -32,16 +33,19 @@ classes = (
operator.ClearUser,
operator.DisableEditingActor,
operator.DisableEditingAddress,
operator.DisableEditingApplication,
operator.DisableEditingOrganisation,
operator.DisableEditingPerson,
operator.DisableEditingRole,
operator.EditActor,
operator.EditAddress,
operator.EditApplication,
operator.EditOrganisation,
operator.EditPerson,
operator.EditRole,
operator.EnableEditingActor,
operator.EnableEditingAddress,
operator.EnableEditingApplication,
operator.EnableEditingOrganisation,
operator.EnableEditingPerson,
operator.EnableEditingRole,
@@ -521,3 +521,46 @@ class RemoveApplication(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context):
ifc_file = tool.Ifc.get()
ifcopenshell.api.owner.remove_application(ifc_file, ifc_file.by_id(self.application_id))
class EnableEditingApplication(bpy.types.Operator):
bl_idname = "bim.enable_editing_application"
bl_label = "Enable Editing Application"
bl_options = {"REGISTER", "UNDO"}
application_id: bpy.props.IntProperty() # pyright: ignore[reportRedeclaration]
if TYPE_CHECKING:
application_id: int
def execute(self, context) -> "set[rna_enums.OperatorReturnItems]":
core.enable_editing_application(tool.Owner, tool.Ifc.get().by_id(self.application_id))
return {"FINISHED"}
class DisableEditingApplication(bpy.types.Operator):
bl_idname = "bim.disable_editing_application"
bl_label = "Disable Editing Application"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context) -> "set[rna_enums.OperatorReturnItems]":
core.disable_editing_application(tool.Owner)
return {"FINISHED"}
class EditApplication(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.edit_application"
bl_label = "Edit Application"
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context) -> "set[rna_enums.OperatorReturnItems]":
core.edit_application(tool.Ifc, tool.Owner)
return {"FINISHED"}
class AddApplication(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.add_application"
bl_label = "Add Application"
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context) -> None:
core.add_application(tool.Ifc, tool.Owner)
@@ -121,6 +121,9 @@ class BIMOwnerProperties(PropertyGroup):
)
actor: EnumProperty(items=get_actor, name="Actor")
active_application_id: IntProperty()
application_attributes: CollectionProperty(type=Attribute)
if TYPE_CHECKING:
active_person_id: int
person_attributes: bpy.types.bpy_prop_collection_idprop[Attribute]
@@ -147,3 +150,6 @@ class BIMOwnerProperties(PropertyGroup):
actor_type: str
the_actor: str
actor: str
active_application_id: int
application_attributes: bpy.types.bpy_prop_collection_idprop[Attribute]
+17 -3
View File
@@ -362,10 +362,24 @@ class BIM_PT_applications(bpy.types.Panel):
assert (layout := self.layout)
props = tool.Owner.get_owner_props()
row = self.layout.row()
row.operator("bim.add_application", icon="ADD")
apps_data: list[dict[str, Any]] = ApplicationsData.data["applications"]
if not apps_data:
layout.label(text="No Applications Found")
return
for app_data in apps_data:
row = layout.row()
row.label(text=app_data["name"])
row.operator("bim.remove_application", icon="X", text="").application_id = app_data["id"]
if props.active_application_id == app_data["id"]:
box = self.layout.box()
row = box.row(align=True)
row.operator("bim.edit_application", icon="CHECKMARK")
row.operator("bim.disable_editing_application", icon="CANCEL", text="")
bonsai.bim.helper.draw_attributes(props.application_attributes, box)
else:
row = layout.row(align=True)
row.label(text=app_data["name"])
op = row.operator("bim.enable_editing_application", icon="GREASEPENCIL", text="")
op.application_id = app_data["id"]
row.operator("bim.remove_application", icon="X", text="").application_id = app_data["id"]
+21
View File
@@ -195,3 +195,24 @@ def unassign_actor(
ifc: type[tool.Ifc], actor: ifcopenshell.entity_instance, element: ifcopenshell.entity_instance
) -> None:
ifc.run("owner.unassign_actor", relating_actor=actor, related_object=element)
def enable_editing_application(owner: type[tool.Owner], application: ifcopenshell.entity_instance) -> None:
owner.set_application(application)
owner.import_application_attributes()
def disable_editing_application(owner: type[tool.Owner]) -> None:
owner.clear_application()
def edit_application(ifc: type[tool.Ifc], owner: type[tool.Owner]) -> None:
application = owner.get_application()
ifc.run("owner.edit_application", application=application, attributes=owner.export_application_attributes())
owner.clear_application()
def add_application(ifc: type[tool.Ifc], owner: type[tool.Owner]) -> ifcopenshell.entity_instance:
application = ifc.run("owner.add_application")
enable_editing_application(owner, application)
return application
+31
View File
@@ -303,3 +303,34 @@ class Owner(bonsai.core.tool.Owner):
def get_actor(cls) -> ifcopenshell.entity_instance:
props = cls.get_owner_props()
return tool.Ifc().get().by_id(props.active_actor_id)
# Application.
@classmethod
def get_application(cls) -> ifcopenshell.entity_instance:
props = cls.get_owner_props()
return tool.Ifc.get().by_id(props.active_application_id)
@classmethod
def set_application(cls, application: ifcopenshell.entity_instance) -> None:
props = cls.get_owner_props()
props.active_application_id = application.id()
@classmethod
def clear_application(cls) -> None:
props = cls.get_owner_props()
if "active_application_id" in props:
del props["active_application_id"]
@classmethod
def import_application_attributes(cls) -> None:
props = cls.get_owner_props()
application = tool.Ifc.get().by_id(props.active_application_id)
props.application_attributes.clear()
bonsai.bim.helper.import_attributes("IfcApplication", props.application_attributes, application.get_info())
@classmethod
def export_application_attributes(cls) -> dict[str, Any]:
props = cls.get_owner_props()
attributes = bonsai.bim.helper.export_attributes(props.application_attributes)
return attributes