From 325d6138d36663455d58582ea09a4a502713f479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Tue, 21 Jan 2025 10:10:57 -0300 Subject: [PATCH] Add more options to Bonsai snap target. Follow 5649708ca48c0be0986b5f92524737127296e988 --- src/bonsai/bonsai/bim/__init__.py | 2 ++ src/bonsai/bonsai/bim/prop.py | 7 +++++- src/bonsai/bonsai/bim/ui.py | 8 +++++++ src/bonsai/bonsai/tool/snap.py | 36 ++++++++++++++++++++----------- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/bonsai/bonsai/bim/__init__.py b/src/bonsai/bonsai/bim/__init__.py index 58ae7ca30c..babf0e74e9 100644 --- a/src/bonsai/bonsai/bim/__init__.py +++ b/src/bonsai/bonsai/bim/__init__.py @@ -139,6 +139,7 @@ classes = [ prop.BIMFacet, prop.BIMFilterGroup, prop.BIMSnapProperties, + prop.BIMSnapGroups, ui.BIM_UL_clipping_plane, ui.BIM_UL_generic, ui.BIM_UL_topics, @@ -229,6 +230,7 @@ def register(): bpy.app.handlers.load_post.append(handler.loadIfcStore) bpy.types.Scene.BIMProperties = bpy.props.PointerProperty(type=prop.BIMProperties) bpy.types.Scene.BIMSnapProperties = bpy.props.PointerProperty(type=prop.BIMSnapProperties) + bpy.types.Scene.BIMSnapGroups = bpy.props.PointerProperty(type=prop.BIMSnapGroups) bpy.types.Screen.BIMAreaProperties = bpy.props.CollectionProperty(type=prop.BIMAreaProperties) bpy.types.Screen.BIMTabProperties = bpy.props.PointerProperty(type=prop.BIMTabProperties) bpy.types.Collection.BIMCollectionProperties = bpy.props.PointerProperty(type=prop.BIMCollectionProperties) diff --git a/src/bonsai/bonsai/bim/prop.py b/src/bonsai/bonsai/bim/prop.py index 2cf44952bc..cd18cfe8c0 100644 --- a/src/bonsai/bonsai/bim/prop.py +++ b/src/bonsai/bonsai/bim/prop.py @@ -586,9 +586,14 @@ class BIMFacet(PropertyGroup): class BIMFilterGroup(PropertyGroup): filters: CollectionProperty(type=BIMFacet, name="filters") - +class BIMSnapGroups(PropertyGroup): + object: BoolProperty(name="Object") + polyline: BoolProperty(name="Polyline") + measure: BoolProperty(name="Measure") + class BIMSnapProperties(PropertyGroup): vertex: BoolProperty(name="Vertex") edge: BoolProperty(name="Edge") edge_center: BoolProperty(name="Edge Center") + edge_intersection: BoolProperty(name="Edge Intersection") face: BoolProperty(name="Face") diff --git a/src/bonsai/bonsai/bim/ui.py b/src/bonsai/bonsai/bim/ui.py index 7a85701d08..d33c0e6345 100644 --- a/src/bonsai/bonsai/bim/ui.py +++ b/src/bonsai/bonsai/bim/ui.py @@ -1251,4 +1251,12 @@ class BIM_PT_snappping(Panel): col.prop(prop, "vertex", toggle=True, icon="SNAP_VERTEX") col.prop(prop, "edge", toggle=True, icon="SNAP_EDGE") col.prop(prop, "edge_center", toggle=True, icon="SNAP_MIDPOINT") + col.prop(prop, "edge_intersection", toggle=True, icon="SNAP_GRID") col.prop(prop, "face", toggle=True, icon="SNAP_FACE") + groups = context.scene.BIMSnapGroups + row = layout.row(align=True) + row.label(text="Bonsai Target Selection") + row = layout.row(align=True) + row.prop(groups, "object", toggle=True) + row.prop(groups, "polyline", toggle=True) + row.prop(groups, "measure", toggle=True) diff --git a/src/bonsai/bonsai/tool/snap.py b/src/bonsai/bonsai/tool/snap.py index 394b8ff7c8..9a44c81fa2 100644 --- a/src/bonsai/bonsai/tool/snap.py +++ b/src/bonsai/bonsai/tool/snap.py @@ -506,9 +506,19 @@ class Snap(bonsai.core.tool.Snap): filtered_points = [point for point in snapping_points if point[1] in options] return filtered_points + def filter_snapping_groups_based_on_settings(detected_snaps): + options = ["Edge-Vertex", "Axis", "Plane"] + props = context.scene.BIMSnapGroups + for prop in props.__annotations__.keys(): + if getattr(props, prop): + options.append(props.rna_type.properties[prop].name) + filtered_groups = [group for group in detected_snaps if group["group"] in options] + return filtered_groups + + filtered_snaps = filter_snapping_groups_based_on_settings(detected_snaps) snapping_points = [] edges = [] # Get edges to create edge-intersection snap - for snap_group in detected_snaps: + for snap_group in filtered_snaps: snap_obj = None if snap_group["group"] == "Polyline": for p in snap_group["points"]: @@ -543,7 +553,7 @@ class Snap(bonsai.core.tool.Snap): edges.append(p) break - for snap_group in detected_snaps: + for snap_group in filtered_snaps: if snap_group["group"] == "Axis": axis_start = snap_group["axis_start"] axis_end = snap_group["axis_end"] @@ -560,24 +570,24 @@ class Snap(bonsai.core.tool.Snap): if intersection[1]: snapping_points.insert(0, (intersection[1], "Edge Intersection", None)) - snapping_points = filter_snapping_points_based_on_settings(snapping_points) - + filtered_snapping_points = filter_snapping_points_based_on_settings(snapping_points) + # Make Axis first priority if tool_state.lock_axis or tool_state.axis_method in {"X", "Y", "Z"}: - cls.update_snapping_ref(snapping_points[0][0], snapping_points[0][1]) - for point in snapping_points: + cls.update_snapping_ref(filtered_snapping_points[0][0], filtered_snapping_points[0][1]) + for point in filtered_snapping_points: if point[1] == "Axis": - if snapping_points[0][1] not in {"Axis", "Plane"}: - mixed_snap = cls.mix_snap_and_axis(snapping_points[0], axis_start, axis_end) + if filtered_snapping_points[0][1] not in {"Axis", "Plane"}: + mixed_snap = cls.mix_snap_and_axis(filtered_snapping_points[0], axis_start, axis_end) for mixed_point in mixed_snap: - snapping_points.insert(0, mixed_point) + filtered_snapping_points.insert(0, mixed_point) cls.update_snapping_point(mixed_snap[0][0], mixed_snap[0][1]) - return snapping_points + return filtered_snapping_points cls.update_snapping_point(point[0], point[1]) - return snapping_points + return filtered_snapping_points - cls.update_snapping_point(snapping_points[0][0], snapping_points[0][1], snapping_points[0][2]) - return snapping_points + cls.update_snapping_point(filtered_snapping_points[0][0], filtered_snapping_points[0][1], filtered_snapping_points[0][2]) + return filtered_snapping_points @classmethod def modify_snapping_point_selection(cls, snapping_points, lock_axis=False):