Add more options to Bonsai snap target. Follow 5649708ca4

This commit is contained in:
Bruno Perdigão
2025-01-21 10:10:57 -03:00
parent fc58b1769c
commit 325d6138d3
4 changed files with 39 additions and 14 deletions
+2
View File
@@ -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)
+6 -1
View File
@@ -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")
+8
View File
@@ -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)
+23 -13
View File
@@ -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):