mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-11 06:18:09 +00:00
See #5972. You can now select booleans recursively.
This commit is contained in:
@@ -2737,6 +2737,7 @@ class ImportRepresentationItems(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
new = props.item_objs.add()
|
new = props.item_objs.add()
|
||||||
new.obj = item_obj
|
new.obj = item_obj
|
||||||
new.is_boolean = item_id in boolean_ids
|
new.is_boolean = item_id in boolean_ids
|
||||||
|
new.ifc_definition_id = item_id
|
||||||
|
|
||||||
tool.Geometry.import_item(item_obj)
|
tool.Geometry.import_item(item_obj)
|
||||||
tool.Geometry.import_item_attributes(item_obj)
|
tool.Geometry.import_item_attributes(item_obj)
|
||||||
|
|||||||
@@ -79,19 +79,20 @@ classes = (
|
|||||||
opening.AddBoolean,
|
opening.AddBoolean,
|
||||||
opening.AddPotentialHalfSpaceSolid,
|
opening.AddPotentialHalfSpaceSolid,
|
||||||
opening.AddPotentialOpening,
|
opening.AddPotentialOpening,
|
||||||
opening.EditOpenings,
|
|
||||||
opening.CloneOpening,
|
opening.CloneOpening,
|
||||||
opening.UpdateOpeningsFocus,
|
opening.EditOpenings,
|
||||||
opening.FlipFill,
|
opening.FlipFill,
|
||||||
opening.HideBooleans,
|
|
||||||
opening.HideAllOpenings,
|
opening.HideAllOpenings,
|
||||||
|
opening.HideBooleans,
|
||||||
opening.HideOpenings,
|
opening.HideOpenings,
|
||||||
opening.PurgeUnusedOpenings,
|
opening.PurgeUnusedOpenings,
|
||||||
opening.RecalculateFill,
|
opening.RecalculateFill,
|
||||||
opening.RemoveBoolean,
|
opening.RemoveBoolean,
|
||||||
opening.RemoveBooleans,
|
opening.RemoveBooleans,
|
||||||
|
opening.SelectBoolean,
|
||||||
opening.ShowBooleans,
|
opening.ShowBooleans,
|
||||||
opening.ShowOpenings,
|
opening.ShowOpenings,
|
||||||
|
opening.UpdateOpeningsFocus,
|
||||||
profile.ChangeCardinalPoint,
|
profile.ChangeCardinalPoint,
|
||||||
profile.ChangeProfileDepth,
|
profile.ChangeProfileDepth,
|
||||||
profile.DisableEditingExtrusionAxis,
|
profile.DisableEditingExtrusionAxis,
|
||||||
|
|||||||
@@ -1165,6 +1165,43 @@ class RemoveBoolean(Operator, tool.Ifc.Operator):
|
|||||||
tool.Geometry.reload_representation(rep_obj)
|
tool.Geometry.reload_representation(rep_obj)
|
||||||
|
|
||||||
|
|
||||||
|
class SelectBoolean(Operator):
|
||||||
|
bl_idname = "bim.select_boolean"
|
||||||
|
bl_label = "Remove Boolean"
|
||||||
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
bl_description = "Selects operands of the active boolean\nSHIFT-CLICK to select all operands recursively"
|
||||||
|
is_recursive: bpy.props.BoolProperty(name="Is Recursive", default=False, options={"SKIP_SAVE"})
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
props = context.scene.BIMBooleanProperties
|
||||||
|
return props.active_boolean
|
||||||
|
|
||||||
|
def invoke(self, context, event):
|
||||||
|
if event.type == "LEFTMOUSE" and event.shift:
|
||||||
|
self.is_recursive = True
|
||||||
|
return self.execute(context)
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
props = context.scene.BIMBooleanProperties
|
||||||
|
queue = [tool.Ifc.get().by_id(props.active_boolean.ifc_definition_id)]
|
||||||
|
items = {i.ifc_definition_id: i.obj for i in context.scene.BIMGeometryProperties.item_objs}
|
||||||
|
while queue:
|
||||||
|
item = queue.pop()
|
||||||
|
if item.is_a("IfcBooleanResult"):
|
||||||
|
if self.is_recursive:
|
||||||
|
queue.append(item.FirstOperand)
|
||||||
|
queue.append(item.SecondOperand)
|
||||||
|
else:
|
||||||
|
if obj := items.get(item.FirstOperand.id()):
|
||||||
|
tool.Blender.select_object(obj)
|
||||||
|
if obj := items.get(item.SecondOperand.id()):
|
||||||
|
tool.Blender.select_object(obj)
|
||||||
|
elif obj := items.get(item.id()):
|
||||||
|
tool.Blender.select_object(obj)
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
# TODO: merge with ProfileDecorator?
|
# TODO: merge with ProfileDecorator?
|
||||||
class DecorationsHandler:
|
class DecorationsHandler:
|
||||||
installed = None
|
installed = None
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ class BIM_PT_booleans(Panel):
|
|||||||
|
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
row.alignment = "RIGHT"
|
row.alignment = "RIGHT"
|
||||||
|
row.operator("bim.select_boolean", text="", icon="RESTRICT_SELECT_OFF")
|
||||||
row.operator("bim.remove_boolean", text="", icon="X")
|
row.operator("bim.remove_boolean", text="", icon="X")
|
||||||
|
|
||||||
self.layout.template_list("BIM_UL_booleans", "", props, "booleans", props, "active_boolean_index")
|
self.layout.template_list("BIM_UL_booleans", "", props, "booleans", props, "active_boolean_index")
|
||||||
|
|||||||
Reference in New Issue
Block a user