def positiontOnEdge(
edge: cq.Edge,
target: cq.Vector,
window_start: float = 0.0,
window_end: float = 1.0,
tol: float = 0.00001,
) -> float:
"""
Search an edge for the position along it closest to target
"""
window_mid = (window_start + window_end) / 2
distance_to_start = (edge.positionAt(window_start) - target).Length
distance_to_mid = (edge.positionAt(window_mid) - target).Length
distance_to_end = (edge.positionAt(window_end) - target).Length
# Close enough to quit?
if distance_to_mid <= tol:
return window_mid
# Prepare for another try
if distance_to_start > distance_to_end:
window_start = window_mid
else:
window_end = window_mid
return positiontOnEdge(edge, target, window_start, window_end, tol)