mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-10-02 21:12:07 +00:00
Add more options to Bonsai snap target. Follow 5649708ca4
This commit is contained in:
@@ -139,6 +139,7 @@ classes = [
|
|||||||
prop.BIMFacet,
|
prop.BIMFacet,
|
||||||
prop.BIMFilterGroup,
|
prop.BIMFilterGroup,
|
||||||
prop.BIMSnapProperties,
|
prop.BIMSnapProperties,
|
||||||
|
prop.BIMSnapGroups,
|
||||||
ui.BIM_UL_clipping_plane,
|
ui.BIM_UL_clipping_plane,
|
||||||
ui.BIM_UL_generic,
|
ui.BIM_UL_generic,
|
||||||
ui.BIM_UL_topics,
|
ui.BIM_UL_topics,
|
||||||
@@ -229,6 +230,7 @@ def register():
|
|||||||
bpy.app.handlers.load_post.append(handler.loadIfcStore)
|
bpy.app.handlers.load_post.append(handler.loadIfcStore)
|
||||||
bpy.types.Scene.BIMProperties = bpy.props.PointerProperty(type=prop.BIMProperties)
|
bpy.types.Scene.BIMProperties = bpy.props.PointerProperty(type=prop.BIMProperties)
|
||||||
bpy.types.Scene.BIMSnapProperties = bpy.props.PointerProperty(type=prop.BIMSnapProperties)
|
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.BIMAreaProperties = bpy.props.CollectionProperty(type=prop.BIMAreaProperties)
|
||||||
bpy.types.Screen.BIMTabProperties = bpy.props.PointerProperty(type=prop.BIMTabProperties)
|
bpy.types.Screen.BIMTabProperties = bpy.props.PointerProperty(type=prop.BIMTabProperties)
|
||||||
bpy.types.Collection.BIMCollectionProperties = bpy.props.PointerProperty(type=prop.BIMCollectionProperties)
|
bpy.types.Collection.BIMCollectionProperties = bpy.props.PointerProperty(type=prop.BIMCollectionProperties)
|
||||||
|
|||||||
@@ -586,9 +586,14 @@ class BIMFacet(PropertyGroup):
|
|||||||
class BIMFilterGroup(PropertyGroup):
|
class BIMFilterGroup(PropertyGroup):
|
||||||
filters: CollectionProperty(type=BIMFacet, name="filters")
|
filters: CollectionProperty(type=BIMFacet, name="filters")
|
||||||
|
|
||||||
|
class BIMSnapGroups(PropertyGroup):
|
||||||
|
object: BoolProperty(name="Object")
|
||||||
|
polyline: BoolProperty(name="Polyline")
|
||||||
|
measure: BoolProperty(name="Measure")
|
||||||
|
|
||||||
class BIMSnapProperties(PropertyGroup):
|
class BIMSnapProperties(PropertyGroup):
|
||||||
vertex: BoolProperty(name="Vertex")
|
vertex: BoolProperty(name="Vertex")
|
||||||
edge: BoolProperty(name="Edge")
|
edge: BoolProperty(name="Edge")
|
||||||
edge_center: BoolProperty(name="Edge Center")
|
edge_center: BoolProperty(name="Edge Center")
|
||||||
|
edge_intersection: BoolProperty(name="Edge Intersection")
|
||||||
face: BoolProperty(name="Face")
|
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, "vertex", toggle=True, icon="SNAP_VERTEX")
|
||||||
col.prop(prop, "edge", toggle=True, icon="SNAP_EDGE")
|
col.prop(prop, "edge", toggle=True, icon="SNAP_EDGE")
|
||||||
col.prop(prop, "edge_center", toggle=True, icon="SNAP_MIDPOINT")
|
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")
|
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]
|
filtered_points = [point for point in snapping_points if point[1] in options]
|
||||||
return filtered_points
|
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 = []
|
snapping_points = []
|
||||||
edges = [] # Get edges to create edge-intersection snap
|
edges = [] # Get edges to create edge-intersection snap
|
||||||
for snap_group in detected_snaps:
|
for snap_group in filtered_snaps:
|
||||||
snap_obj = None
|
snap_obj = None
|
||||||
if snap_group["group"] == "Polyline":
|
if snap_group["group"] == "Polyline":
|
||||||
for p in snap_group["points"]:
|
for p in snap_group["points"]:
|
||||||
@@ -543,7 +553,7 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
edges.append(p)
|
edges.append(p)
|
||||||
break
|
break
|
||||||
|
|
||||||
for snap_group in detected_snaps:
|
for snap_group in filtered_snaps:
|
||||||
if snap_group["group"] == "Axis":
|
if snap_group["group"] == "Axis":
|
||||||
axis_start = snap_group["axis_start"]
|
axis_start = snap_group["axis_start"]
|
||||||
axis_end = snap_group["axis_end"]
|
axis_end = snap_group["axis_end"]
|
||||||
@@ -560,24 +570,24 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
if intersection[1]:
|
if intersection[1]:
|
||||||
snapping_points.insert(0, (intersection[1], "Edge Intersection", None))
|
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
|
# Make Axis first priority
|
||||||
if tool_state.lock_axis or tool_state.axis_method in {"X", "Y", "Z"}:
|
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])
|
cls.update_snapping_ref(filtered_snapping_points[0][0], filtered_snapping_points[0][1])
|
||||||
for point in snapping_points:
|
for point in filtered_snapping_points:
|
||||||
if point[1] == "Axis":
|
if point[1] == "Axis":
|
||||||
if snapping_points[0][1] not in {"Axis", "Plane"}:
|
if filtered_snapping_points[0][1] not in {"Axis", "Plane"}:
|
||||||
mixed_snap = cls.mix_snap_and_axis(snapping_points[0], axis_start, axis_end)
|
mixed_snap = cls.mix_snap_and_axis(filtered_snapping_points[0], axis_start, axis_end)
|
||||||
for mixed_point in mixed_snap:
|
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])
|
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])
|
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])
|
cls.update_snapping_point(filtered_snapping_points[0][0], filtered_snapping_points[0][1], filtered_snapping_points[0][2])
|
||||||
return snapping_points
|
return filtered_snapping_points
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def modify_snapping_point_selection(cls, snapping_points, lock_axis=False):
|
def modify_snapping_point_selection(cls, snapping_points, lock_axis=False):
|
||||||
|
|||||||
Reference in New Issue
Block a user