mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-23 04:29:55 +00:00
Snap - Improves logic from previous commit.
Previous commit: Snap - Refactor x-ray mode handling to prevent double raycasting
This commit is contained in:
@@ -360,15 +360,6 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
plane_normal = tool.Polyline.use_transform_orientations(plane_normal)
|
plane_normal = tool.Polyline.use_transform_orientations(plane_normal)
|
||||||
return plane_origin, plane_normal
|
return plane_origin, plane_normal
|
||||||
|
|
||||||
def handle_snap_points_in_xray_mode(closest_snaps, detected_snaps, snap_obj, is_xray):
|
|
||||||
for snap in closest_snaps:
|
|
||||||
if snap_obj.obj == snap["object"]:
|
|
||||||
if "face_index" in snap and snap["face_index"]:
|
|
||||||
points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj)
|
|
||||||
for point in points:
|
|
||||||
point["group"] = "Object"
|
|
||||||
detected_snaps.append(point)
|
|
||||||
return detected_snaps
|
|
||||||
|
|
||||||
# Polyline
|
# Polyline
|
||||||
polyline_props = tool.Model.get_polyline_props()
|
polyline_props = tool.Model.get_polyline_props()
|
||||||
@@ -401,16 +392,27 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
closest_snaps = tool.Raycast.ray_cast_and_get_closest_to_camera_snaps(context, event, objs_to_raycast)
|
closest_snaps = tool.Raycast.ray_cast_and_get_closest_to_camera_snaps(context, event, objs_to_raycast)
|
||||||
detected_snaps.extend(closest_snaps)
|
detected_snaps.extend(closest_snaps)
|
||||||
|
|
||||||
xray_conditions = (space.shading.type == "SOLID" and space.shading.show_xray) or (space.shading.type == "WIREFRAME" and space.shading.show_xray_wireframe)
|
xray_mode = (space.shading.type == "SOLID" and space.shading.show_xray) or (space.shading.type == "WIREFRAME" and space.shading.show_xray_wireframe)
|
||||||
|
|
||||||
if xray_conditions:
|
for snap_obj in objs_to_raycast:
|
||||||
for snap_obj in objs_to_raycast:
|
for snap in closest_snaps:
|
||||||
detected_snaps = handle_snap_points_in_xray_mode(closest_snaps, detected_snaps, snap_obj, is_xray=True)
|
if snap_obj.obj == snap["object"]:
|
||||||
else:
|
if xray_mode:
|
||||||
for snap_obj in objs_to_raycast:
|
if "face_index" in snap and snap["face_index"]:
|
||||||
for snap in closest_snaps:
|
snap_points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj)
|
||||||
if "is_closest_to_camera" in snap and snap["is_closest_to_camera"]:
|
for point in snap_points:
|
||||||
detected_snaps = handle_snap_points_in_xray_mode([snap], detected_snaps, snap_obj, is_xray=False)
|
point["group"] = "Object"
|
||||||
|
detected_snaps.append(point)
|
||||||
|
else:
|
||||||
|
# If it is a solid object that is closest to camera it ignores all the rest
|
||||||
|
if "is_closest_to_camera" in snap and snap["is_closest_to_camera"] and snap["group"] == "Object":
|
||||||
|
closest_snap = [snap] # discards objects that aren't the closest
|
||||||
|
if "face_index" in snap and snap["face_index"]:
|
||||||
|
snap_points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj)
|
||||||
|
for point in snap_points:
|
||||||
|
point["group"] = "Object"
|
||||||
|
closest_snap.append(point)
|
||||||
|
detected_snaps = closest_snap
|
||||||
|
|
||||||
# snap to cut geometry (e.g. in plan view)
|
# snap to cut geometry (e.g. in plan view)
|
||||||
if CutDecorator.installed:
|
if CutDecorator.installed:
|
||||||
|
|||||||
Reference in New Issue
Block a user