# -*- coding: utf-8 -*- from math import pi linpar("A:OutsideDia", 914.4, 36) linpar("B:Height", 406.4, 16) intpar("N:Sides", 6) linpar("C:FlangeWidth", 38.1, 1.5) linpar("D:HoleDia", 6.35, 0.25) def dashed_vline(x, y0, y1, dash, gap): y = y0 while y < y1: yb = y + dash if yb > y1: yb = y1 moveto(x, y) lineto(x, yb) y = yb + gap def dashed_hline(x0, x1, y, dash, gap): x = x0 while x < x1: xb = x + dash if xb > x1: xb = x1 moveto(x, y) lineto(xb, y) x = xb + gap def draw_half_piece(yb, piece_len, panel_len, sides, flange_w, hole_dia, edge, gap, relief_w): yt = yb + B # Relief slot geometry relief_seg = (B - 2.0 * edge - gap) / 2.0 if relief_seg < 1: relief_seg = 1 bot_y0 = yb + edge bot_y1 = yb + edge + relief_seg top_y0 = yt - edge - relief_seg top_y1 = yt - edge # Main outline rect(0, yb, piece_len, yt) # Bend locations: left flange bend + bends between the main panels bend_x = [flange_w] for k in range(1, sides): bend_x.append(flange_w + k * panel_len) # Split relief slots for x in bend_x: rect(x - relief_w / 2.0, bot_y0, x + relief_w / 2.0, bot_y1) rect(x - relief_w / 2.0, top_y0, x + relief_w / 2.0, top_y1) # Longer panel center lines cl_y0 = bot_y1 + gap * 0.05 cl_y1 = top_y0 - gap * 0.05 dash_v = max(B * 0.06, 10.0) gap_v = dash_v * 0.55 if cl_y1 > cl_y0: for i in range(sides): x0 = flange_w + i * panel_len x1 = flange_w + (i + 1) * panel_len xc = (x0 + x1) / 2.0 dashed_vline(xc, cl_y0, cl_y1, dash_v, gap_v) # Full-length horizontal center line for each half piece dash_h = max(piece_len * 0.020, 18.0) gap_h = dash_h * 0.55 dashed_hline(0, piece_len, yb + B / 2.0, dash_h, gap_h) # Matching 3-hole bolt pattern left and right hole_x = max(flange_w * 0.35, hole_dia) x_left = hole_x x_right = piece_len - hole_x hole_margin = B * 0.09 y_bottom = yb + hole_margin y_mid = yb + B / 2.0 y_top = yt - hole_margin circle(x_left, y_bottom, hole_dia / 2.0) circle(x_left, y_mid, hole_dia / 2.0) circle(x_left, y_top, hole_dia / 2.0) circle(x_right, y_bottom, hole_dia / 2.0) circle(x_right, y_mid, hole_dia / 2.0) circle(x_right, y_top, hole_dia / 2.0) def generate(): sides = N if sides < 3: sides = 3 # Full fire ring circumference from OD full_flat = pi * A # Output two equal half pieces automatically half_flat = full_flat / 2.0 panel_len = half_flat / sides piece_len = C + half_flat # Fixed reliefs. Use simple unit inference so 0.75 in remains 19.05 mm in metric mode. if A > 100 or B > 50: edge = 19.05 gap = 19.05 relief_w = 3.175 else: edge = 0.75 gap = 0.75 relief_w = 0.125 # Keep relief geometry valid for short heights if B <= edge * 2.0 + gap + 5: edge = B * 0.18 gap = B * 0.18 piece_gap = max(B * 0.18, 35.0) # Two identical half pieces draw_half_piece(0, piece_len, panel_len, sides, C, D, edge, gap, relief_w) draw_half_piece(B + piece_gap, piece_len, panel_len, sides, C, D, edge, gap, relief_w) # Minimal readable preview labels oy = max(B * 0.12, 28.0) dimtxt("Input OD = full ring. Output = 2 half pieces.", piece_len * 0.50, 2.0 * B + piece_gap + oy) dimtxt("Flat per piece = A OD x 3.1416 / 2", piece_len * 0.50, 2.0 * B + piece_gap + oy * 1.35) dimtxt("A OD", piece_len * 0.10, 2.0 * B + piece_gap + oy * 1.75) dimtxt("B Height", -max(piece_len * 0.06, 35.0), B * 0.50) dimtxt("N Sides per half", piece_len * 0.82, 2.0 * B + piece_gap + oy * 1.75) dimtxt("C Flange", C * 0.50, -oy) dimtxt("D Hole dia", piece_len * 0.88, 2.0 * B + piece_gap + oy * 0.55)