mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-18 22:33:33 +00:00
Fix #5996. Bug where getting selected or active objects was not clear.
Sometimes we want to fetch selected objects, and that includes the active object, even if the active object isn't actually highlighted in the viewport (albiet rare, I think?). Conversely sometimes we want to get the active object, even if it isn't actually highlighted. The tool.Blender functions now have kwargs to distinguish between these.
This commit is contained in:
@@ -972,14 +972,15 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
|
|
||||||
relating_type = tool.Ifc.get().by_id(int(relating_type_id))
|
relating_type = tool.Ifc.get().by_id(int(relating_type_id))
|
||||||
|
|
||||||
has_only_walls_selected = tool.Blender.get_selected_objects() and all(
|
has_only_walls_selected = tool.Blender.get_selected_objects(include_active=False) and all(
|
||||||
(e := tool.Ifc.get_entity(o)) and e.is_a("IfcWall") for o in tool.Blender.get_selected_objects()
|
(e := tool.Ifc.get_entity(o)) and e.is_a("IfcWall")
|
||||||
|
for o in tool.Blender.get_selected_objects(include_active=False)
|
||||||
)
|
)
|
||||||
|
|
||||||
if tool.Model.get_usage_type(relating_type) == "LAYER3" and has_only_walls_selected:
|
if tool.Model.get_usage_type(relating_type) == "LAYER3" and has_only_walls_selected:
|
||||||
return bpy.ops.bim.draw_slab_from_wall("INVOKE_DEFAULT")
|
return bpy.ops.bim.draw_slab_from_wall("INVOKE_DEFAULT")
|
||||||
elif (
|
elif (
|
||||||
(active_obj := tool.Blender.get_active_object())
|
(active_obj := tool.Blender.get_active_object(is_selected=True))
|
||||||
and (active_element := tool.Ifc.get_entity(active_obj))
|
and (active_element := tool.Ifc.get_entity(active_obj))
|
||||||
and active_element.is_a("IfcSlab")
|
and active_element.is_a("IfcSlab")
|
||||||
and tool.Model.get_usage_type(relating_type) == "LAYER2"
|
and tool.Model.get_usage_type(relating_type) == "LAYER2"
|
||||||
|
|||||||
@@ -144,17 +144,21 @@ class Blender(bonsai.core.tool.Blender):
|
|||||||
return f"{name} {i}"
|
return f"{name} {i}"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_active_object(cls) -> bpy.types.Object:
|
def get_active_object(cls, is_selected: bool = False) -> bpy.types.Object:
|
||||||
return getattr(bpy.context, "active_object", None) or bpy.context.view_layer.objects.active
|
obj = getattr(bpy.context, "active_object", None) or bpy.context.view_layer.objects.active
|
||||||
|
if not is_selected:
|
||||||
|
return obj
|
||||||
|
if obj in cls.get_selected_objects(include_active=False):
|
||||||
|
return obj
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_selected_objects(cls) -> set[bpy.types.Object]:
|
def get_selected_objects(cls, include_active: bool = True) -> set[bpy.types.Object]:
|
||||||
"""Get selected objects including active object."""
|
"""Get selected objects including active object."""
|
||||||
if selected_objects := getattr(bpy.context, "selected_objects", None):
|
if selected_objects := getattr(bpy.context, "selected_objects", None):
|
||||||
if active_obj := cls.get_active_object():
|
if include_active and (active_obj := cls.get_active_object()):
|
||||||
return set(selected_objects + [active_obj])
|
return set(selected_objects + [active_obj])
|
||||||
return set(selected_objects)
|
return set(selected_objects)
|
||||||
if active_obj := cls.get_active_object():
|
if include_active and (active_obj := cls.get_active_object()):
|
||||||
return {active_obj}
|
return {active_obj}
|
||||||
return set()
|
return set()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user