diff --git a/src/kicoil/geometry.py b/src/kicoil/geometry.py index c092f47..dbabb1d 100644 --- a/src/kicoil/geometry.py +++ b/src/kicoil/geometry.py @@ -578,8 +578,8 @@ class PlanarInductor(): xv, yv = self.shape.project_point(r, fold_angle, r_ref=refs_layer0[-1]) - footprint.lines.append(kicad.make_line(*points_layer0[-1], xv, yv, self.trace_width, self.layer_pair[0])) - footprint.lines.append(kicad.make_line(xv, yv, *points_layer1[0], self.trace_width, self.layer_pair[1])) + #footprint.lines.append(kicad.make_line(*points_layer0[-1], xv, yv, self.trace_width, self.layer_pair[0])) + #footprint.lines.append(kicad.make_line(xv, yv, *points_layer1[0], self.trace_width, self.layer_pair[1])) footprint.pads.append(kicad.make_via(xv, yv, self.via_diameter, self.via_drill, self.clearance, diff --git a/src/kicoil/skeletonator.py b/src/kicoil/skeletonator.py index b4701da..2ee8ee1 100644 --- a/src/kicoil/skeletonator.py +++ b/src/kicoil/skeletonator.py @@ -31,6 +31,14 @@ def interpolate(p1, p2, t, t_start=0, t_end=1): return (x1 + t*dx, y1 + t*dy) +def interpolate_1d(a, b, t, t_start=0, t_end=1): + if math.isclose(t_start, t_end): + return a + t_range = t_end - t_start + t = (t - t_start) / t_range + return a + (b-a) * t + + def approx_in_range(value, lower, upper): """ Approximate range check """ if math.isclose(value, lower) or math.isclose(value, upper): @@ -278,7 +286,8 @@ class Skeletonator: return t_map_int + ia2 else: return t_map_int + ia1 + (ia2 - ia1) * ((t - oa1) / (oa2 - oa1)) - + + def do_spiral(self, t1, t2, r1=None, r2=None): print(f' {t1=:.5f} {t2=:.5f} {r1=:.2f} {r2=:.2f}') if r1 is None: @@ -290,46 +299,32 @@ class Skeletonator: t1, t2 = t2, t1 r1, r2 = r2, r1 - def r_interpolate(t): - f = (t - t1) / (t2 - t1) - f = min(1, max(0, f)) # Clip to start/end of spiral - return r1 + (r2 - r1) * f + angle_map = [] + circumferences = [] + n = 100 + radius_steps = [r1 + (r2 - r1) * i/(n-1) for i in range(n)] + angle_steps = [t1 + (t2 - t1) * i/(n-1) for i in range(n)] + for r in radius_steps: + _ic_arcs, circumference = self.map_circumference(r) + circumference_sum = sum(math.dist(p1, p2) for p1, p2 in edge_cycle(circumference)) + circumferences.append(circumference_sum) - r_ref = min(r1, r2) # r_start, r_end) # Handle outward spirals where the radii are swapped - _ic_arcs, inner_circumference = self.map_circumference(r_ref) - inner_circumference_sum = sum(math.dist(p1, p2) for p1, p2 in edge_cycle(inner_circumference)) + angle = 0 + point_angles = [0] + for p1, p2 in edge_cycle(circumference): + edge_angle = math.dist(p1, p2) / circumference_sum + angle += edge_angle + point_angles.append(angle) + + angle_map.append(point_angles) - angle = 0 - point_angles = [0] - for p1, p2 in edge_cycle(inner_circumference): - edge_angle = math.dist(p1, p2) / inner_circumference_sum - angle += edge_angle - point_angles.append(angle) - - if r1 > r2: - t1 = self.map_angle(t1, r1, r2) - else: - t2 = self.map_angle(t2, r1, r2) - - turn_angles = range(math.floor(t1), math.ceil(t2) + 1) - for t_start, t_end in zip(turn_angles, turn_angles[1:]): - t_end = t_start + 1 - - for (p1, p2), (tp1, tp2) in zip(self.poly_edges, itertools.pairwise(point_angles)): - tp1, tp2 = tp1 + t_start, tp2 + t_start - rp1 = r_interpolate(tp1) - rp2 = r_interpolate(tp2) - _arc, p1_proj = self.project_arc(p1, rp1) - _arc, p2_proj = self.project_arc(p2, rp2) + for r, t, point_angles in zip(radius_steps, angle_steps, angle_map): + for (p1, p2), (tp1, tp2) in zip(self.poly_edges, itertools.pairwise(point_angles + point_angles[:1])): + _arc, p1_proj = self.project_arc(p1, r) + _arc, p2_proj = self.project_arc(p2, r) - if approx_in_range(t1, tp1, tp2): - _arc, p2_proj_r1 = self.project_arc(p2, r1) - yield interpolate(p1_proj, p2_proj_r1, t1, tp1, tp2), r_ref - if approx_in_range(t2, tp1, tp2): - _arc, p1_proj_r2 = self.project_arc(p1, r2) - yield interpolate(p1_proj_r2, p2_proj, t2, tp1, tp2), r_ref - elif approx_in_range(tp2, t1, t2): - yield p2_proj, r_ref + if approx_in_range(t%1, tp1, tp2): + yield interpolate(p1_proj, p2_proj, t%1, tp1, tp2), r def dump_to_pdf(self, filename): with PdfPages(filename) as pdf: