From e892caaf41bbc8419033df7c144002e01866cd59 Mon Sep 17 00:00:00 2001 From: Kelvin Ly Date: Wed, 26 Mar 2025 07:58:38 -0400 Subject: [PATCH] Generate DXFs for all the laser cut parts --- export_stuff.py | 25 ++++++++++++++++++++ gantry.py | 61 +++++++++++++++++++++++++++++++++++++------------ utils.py | 23 +++++++++++++------ 3 files changed, 87 insertions(+), 22 deletions(-) create mode 100644 export_stuff.py diff --git a/export_stuff.py b/export_stuff.py new file mode 100644 index 0000000..f826276 --- /dev/null +++ b/export_stuff.py @@ -0,0 +1,25 @@ +import cadquery as cq +from cadquery import exporters + +import gantry + +parts = [ + (gantry.g.upper_front_plate, "gantry_upper_front", gantry.plate_z), + (gantry.g.upper_back_plate, "gantry_upper_back", gantry.plate_z), + (gantry.g.lower_front_plate, "gantry_lower_front", gantry.plate_z), + (gantry.g.lower_back_plate, "gantry_lower_back", gantry.plate_z), + (gantry.g.right_bearing_mount, "gantry_fixed_bearing_mount", gantry.x_mount_z), + (gantry.g.left_bearing_mount, "gantry_floating_bearing_mount", gantry.x_mount_z), + (gantry.g.stepper_mount, "gantry_stepper_mount", gantry.stepper_mount_z), + (gantry.c.plate, "carriage", gantry.plate_z2), + (gantry.ca.plate, "carrier", gantry.carrier_plate_z), + (gantry.ca.left_spacer, "carrier_left_spacer", gantry.z_spacer_z), + (gantry.ca.right_spacer, "carrier_right_spacer", gantry.z_spacer_z), + (gantry.ca.stepper_mount, "carrier_stepper_mount", gantry.stepper_mount_z), +] + +for part, path, thickness in parts: + exporters.exportDXF( + part.workplaneFromTagged("base").section(), + "dxfs/{}-{:.2f}mm.dxf".format(path, thickness), + ) diff --git a/gantry.py b/gantry.py index ed977b2..cafccba 100644 --- a/gantry.py +++ b/gantry.py @@ -1,5 +1,7 @@ import cadquery as cq -from ocp_vscode import * + +if __name__ == "__main__": + from ocp_vscode import * from utils import * import localselectors @@ -13,6 +15,9 @@ plate_z = 2.54 plate_z2 = 10 x_mount_z = 5 +stepper_mount_z = 5 + +carrier_plate_z = 10 ballscrew_x_offset = 4 @@ -77,22 +82,38 @@ class Gantry: column_spacing + tube_w, ) self.upper_front_plate = ( - w.transformed(offset=(0, tube_h / 2, upper_center), rotate=(-90, 0, 0)) + cq.Workplane() + .copyWorkplane( + w.transformed(offset=(0, tube_h / 2, upper_center), rotate=(-90, 0, 0)) + ) + .tag("base") .rect(column_spacing + tube_w, tube_w) .extrude(plate_z) ) self.lower_front_plate = ( - w.transformed(offset=(0, tube_h / 2, lower_center), rotate=(-90, 0, 0)) + cq.Workplane() + .copyWorkplane( + w.transformed(offset=(0, tube_h / 2, lower_center), rotate=(-90, 0, 0)) + ) + .tag("base") .rect(column_spacing + tube_w, tube_w) .extrude(plate_z) ) self.upper_back_plate = ( - w.transformed(offset=(0, -tube_h / 2, upper_center), rotate=(90, 0, 0)) + cq.Workplane() + .copyWorkplane( + w.transformed(offset=(0, -tube_h / 2, upper_center), rotate=(90, 0, 0)) + ) + .tag("base") .rect(column_spacing + tube_w, tube_w) .extrude(plate_z) ) self.lower_back_plate = ( - w.transformed(offset=(0, -tube_h / 2, lower_center), rotate=(90, 0, 0)) + cq.Workplane() + .copyWorkplane( + w.transformed(offset=(0, -tube_h / 2, lower_center), rotate=(90, 0, 0)) + ) + .tag("base") .rect(column_spacing + tube_w, tube_w) .extrude(plate_z) ) @@ -143,7 +164,9 @@ class Gantry: ) self.right_bearing_mount = ( - w.copyWorkplane(right_bearing_base) + cq.Workplane() + .copyWorkplane(right_bearing_base) + .tag("base") .rect(tube_h, x_rail_spacing - tube_w) .extrude(x_mount_z) .center(-ballscrew_x_offset, 0) @@ -174,6 +197,7 @@ class Gantry: ) self.left_bearing_mount = ( w.copyWorkplane(self.floating_mount_w) + .tag("base") .transformed(offset=(0, ballscrew_x_offset, 0), rotate=(0, 0, 90)) .rect(tube_h, x_rail_spacing - tube_w) .extrude(x_mount_z) @@ -217,13 +241,14 @@ class Gantry: .copyWorkplane( stepper_mount_w.transformed(offset=(0, 0, 0), rotate=(0, 0, 45)) ) + .tag("base") .rect(58.4, 58.4) - .extrude(5) + .extrude(stepper_mount_z) .copyWorkplane( stepper_mount_w.transformed(offset=(0, -ballscrew_x_offset, 0)) ) .rect(88, tube_h) - .extrude(5) + .extrude(stepper_mount_z) .copyWorkplane( stepper_mount_w.transformed(offset=(0, 0, 0), rotate=(180, 0, 45)) ) @@ -307,6 +332,7 @@ class Carriage: cq.Workplane() .copyWorkplane(back) .center(-x - HGR20.L - x_carriage_spacing / 2, -x_rail_spacing / 2) + .tag("base") # .rect(HGR20.L+x_carriage_spacing, HGR20.W+x_rail_spacing) .rect(carriage_w, carriage_h) .extrude(plate_z2) @@ -466,6 +492,7 @@ class Carrier: cq.Workplane() .copyWorkplane(self.plane) .transformed(offset=(z_rail_spacing / 2, 0, 0)) + .tag("base") .rect(z_spacer_w, z_rail_len) .extrude(z_spacer_z) ) @@ -473,6 +500,7 @@ class Carrier: cq.Workplane() .copyWorkplane(self.plane) .transformed(offset=(-z_rail_spacing / 2, 0, 0)) + .tag("base") .rect(z_spacer_w, z_rail_len) .extrude(z_spacer_z) ) @@ -481,8 +509,9 @@ class Carrier: cq.Workplane() .copyWorkplane(self.plane) .transformed(offset=(0, 0, z_spacer_z)) + .tag("base") .rect(200, z_rail_len) - .extrude(10) + .extrude(carrier_plate_z) .copyWorkplane(self.plane) .center(0, z_rail_len / 2 - 40 / 2) .rect(68, 40) @@ -554,9 +583,10 @@ class Carrier: offset=(0, z_rail_len / 2 + 10, 0), rotate=(-90, 0, 0) ) ) + .tag("base") .tag("flange_center") .rect(100, 50) - .extrude(5) + .extrude(stepper_mount_z) .workplaneFromTagged("flange_center") .transformed(rotate=(180, 0, 0)) .rect(90, 25, forConstruction=True) @@ -569,7 +599,7 @@ class Carrier: ) .tag("stepper_center") .rect(58.4, 58.4) - .extrude(5) + .extrude(stepper_mount_z) .workplaneFromTagged("stepper_center") .transformed(rotate=(180, 0, 0)) .rect(47.41, 47.41, forConstruction=True) @@ -742,7 +772,8 @@ full_assembly = ( .add(m.assembly(), name="spindle mount") ) -show_object(full_assembly) -# show_object(ca.assembly()) -# show_object(c.assembly()) -# show_object(g.assembly()) +if __name__ == "__main__": + show_object(full_assembly) + # show_object(ca.assembly()) + # show_object(c.assembly()) + # show_object(g.assembly()) diff --git a/utils.py b/utils.py index 6b5e439..2c22f73 100644 --- a/utils.py +++ b/utils.py @@ -8,7 +8,7 @@ import localselectors class SFU1204: def __init__(self, base, l): - self.w = base.workplane() + self.w = cq.Workplane().copyWorkplane(base.workplane()) self.len = l def ballscrew(self): @@ -25,14 +25,16 @@ class SFU1204: (self.len, 8 / 2), (self.len, 0), ] - w = self.w.moveTo(0, 0) + w = cq.Workplane().copyWorkplane(self.w).moveTo(0, 0) for v in profile[1:]: w = w.lineTo(v[1], v[0]) w = w.close() return w.revolve() def nut(self, x): - w = self.w.transformed(offset=(0, x, 0), rotate=(90, 0, 0)) + w = cq.Workplane().copyWorkplane( + self.w.transformed(offset=(0, x, 0), rotate=(90, 0, 0)) + ) n = ( w.sketch() .circle(40 / 2) @@ -62,7 +64,11 @@ class SFU1204: return n def nutHoles(self, solid, x): - w = self.w.transformed(offset=(0, x, 0), rotate=(90, 0, 0)) + w = ( + cq.Workplane() + .copyWorkplane(self.w) + .transformed(offset=(0, x, 0), rotate=(90, 0, 0)) + ) hole_r = 32 / 2 hole_pts = [ ( @@ -403,9 +409,12 @@ def inch(x): def tubing(l, x, y, w, workplane): - return workplane.placeSketch( - cq.Sketch().rect(x, y).rect(x - 2 * w, y - 2 * w, mode="s") - ).extrude(l) + return ( + cq.Workplane() + .copyWorkplane(workplane) + .placeSketch(cq.Sketch().rect(x, y).rect(x - 2 * w, y - 2 * w, mode="s")) + .extrude(l) + ) if __name__ == "__main__":