mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 22:50:21 +00:00
assign_class - avoid empty geometries and assigning shape reprs to structural items
This commit is contained in:
@@ -180,7 +180,10 @@ class AssignClass(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
predefined_type: bpy.props.StringProperty()
|
predefined_type: bpy.props.StringProperty()
|
||||||
userdefined_type: bpy.props.StringProperty()
|
userdefined_type: bpy.props.StringProperty()
|
||||||
context_id: bpy.props.IntProperty()
|
context_id: bpy.props.IntProperty()
|
||||||
|
|
||||||
|
# TODO: is never used?
|
||||||
should_add_representation: bpy.props.BoolProperty(default=True)
|
should_add_representation: bpy.props.BoolProperty(default=True)
|
||||||
|
|
||||||
ifc_representation_class: bpy.props.StringProperty()
|
ifc_representation_class: bpy.props.StringProperty()
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@@ -193,6 +196,7 @@ class AssignClass(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
ifc_representation_class: str
|
ifc_representation_class: str
|
||||||
|
|
||||||
def _execute(self, context):
|
def _execute(self, context):
|
||||||
|
ifc_file = tool.Ifc.get()
|
||||||
props = tool.Root.get_root_props()
|
props = tool.Root.get_root_props()
|
||||||
objects: list[bpy.types.Object] = []
|
objects: list[bpy.types.Object] = []
|
||||||
if self.obj:
|
if self.obj:
|
||||||
@@ -212,6 +216,10 @@ class AssignClass(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
if ifc_context:
|
if ifc_context:
|
||||||
ifc_context = tool.Ifc.get().by_id(ifc_context)
|
ifc_context = tool.Ifc.get().by_id(ifc_context)
|
||||||
|
|
||||||
|
schema = ifcopenshell.schema_by_name(ifc_file.schema)
|
||||||
|
declaration = schema.declaration_by_name(ifc_class)
|
||||||
|
is_structural = ifcopenshell.util.schema.is_a(declaration, "IfcStructuralItem")
|
||||||
|
|
||||||
# Manage selection as operator can be called not from UI but using `object` argument.
|
# Manage selection as operator can be called not from UI but using `object` argument.
|
||||||
current_selection = tool.Blender.get_objects_selection(context)
|
current_selection = tool.Blender.get_objects_selection(context)
|
||||||
tool.Blender.clear_objects_selection()
|
tool.Blender.clear_objects_selection()
|
||||||
@@ -234,7 +242,13 @@ class AssignClass(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if self.should_add_representation and isinstance(obj.data, bpy.types.Mesh) and obj.data.polygons:
|
if (
|
||||||
|
self.should_add_representation
|
||||||
|
and not is_structural
|
||||||
|
and isinstance(obj.data, bpy.types.Mesh)
|
||||||
|
and obj.data.polygons
|
||||||
|
):
|
||||||
|
# Export mesh as tesselation.
|
||||||
|
|
||||||
def ensure_single_user_mesh(mesh: bpy.types.Mesh) -> None:
|
def ensure_single_user_mesh(mesh: bpy.types.Mesh) -> None:
|
||||||
if mesh.users == 1:
|
if mesh.users == 1:
|
||||||
@@ -290,7 +304,21 @@ class AssignClass(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
should_sync_changes_first=False,
|
should_sync_changes_first=False,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# TODO: replace empty geometry meshes with empties.
|
|
||||||
|
def is_representation_supported() -> bool:
|
||||||
|
# We don't support much topological representations
|
||||||
|
# and need to prevent assigning IfcShapeRepresentations to structural items.
|
||||||
|
if is_structural:
|
||||||
|
return False
|
||||||
|
data = obj.data
|
||||||
|
# Is empty mesh.
|
||||||
|
if isinstance(data, bpy.types.Mesh) and not data.vertices:
|
||||||
|
return False
|
||||||
|
# Is empty curve.
|
||||||
|
if isinstance(data, bpy.types.Curve) and not data.splines:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
element = core.assign_class(
|
element = core.assign_class(
|
||||||
tool.Ifc,
|
tool.Ifc,
|
||||||
tool.Collector,
|
tool.Collector,
|
||||||
@@ -298,7 +326,7 @@ class AssignClass(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
obj=obj,
|
obj=obj,
|
||||||
ifc_class=ifc_class,
|
ifc_class=ifc_class,
|
||||||
predefined_type=predefined_type,
|
predefined_type=predefined_type,
|
||||||
should_add_representation=self.should_add_representation,
|
should_add_representation=self.should_add_representation and is_representation_supported(),
|
||||||
context=ifc_context,
|
context=ifc_context,
|
||||||
ifc_representation_class=self.ifc_representation_class,
|
ifc_representation_class=self.ifc_representation_class,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user