mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-14 03:14:23 +00:00
Add more options to Bonsai snap target. Follow 5649708ca4
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user