@@ -67,6 +67,7 @@ def thread( outline_pts, inner_rad, pitch, length, external=True, segments_per_r
6767 outline_h = max_bb [1 ] - min_bb [1 ]
6868
6969 min_rad = max ( 0 , inner_rad - outline_w - EPSILON )
70+ max_rad = inner_rad + outline_w + EPSILON
7071
7172 # outline_pts, since they were created in 2D , are in the XY plane.
7273 # But spirals move a profile in XZ around the Z-axis. So swap Y and Z
@@ -89,12 +90,27 @@ def thread( outline_pts, inner_rad, pitch, length, external=True, segments_per_r
8990 angle = total_angle
9091 elevation = length
9192
93+ # Handle the neck-in radius for internal and external threads
9294 rad = inner_rad
95+ int_ext_mult = 1 if external else - 1
96+ neck_in_rad = min_rad if external else max_rad
97+
9398 if angle < neck_in_degrees :
94- rad = min_rad + angle / neck_in_degrees * outline_w
95- elif angle > total_angle - neck_out_degrees :
96- rad = min_rad + (total_angle - angle )/ neck_out_degrees * outline_w
99+ rad = neck_in_rad + int_ext_mult * angle / neck_in_degrees * outline_w
100+ elif angle > total_angle - neck_in_degrees :
101+ rad = neck_in_rad + int_ext_mult * (total_angle - angle )/ neck_out_degrees * outline_w
97102
103+ # if angle < neck_in_degrees:
104+ # if external:
105+ # rad = min_rad + angle/neck_in_degrees * outline_w
106+ # else:
107+ # rad = max_rad - angle/neck_out_degrees *outline_w
108+ # elif angle > total_angle - neck_out_degrees:
109+ # if external:
110+ # rad = min_rad + (total_angle - angle)/neck_out_degrees * outline_w
111+ # else:
112+ # rad = max_rad - (total_angle - angle)/neck_out_degrees *outline_w
113+ #
98114 elev_vec = Vector3 ( rad , 0 , elevation )
99115
100116 for p in euc_points :
0 commit comments