import cadquery as cq from ocp_vscode import * from utils import * import localselectors tube_w = inch(2.0) tube_h = inch(1.5) tube_wall = inch(0.075) # 1.519 #inch(0.062) column_spacing = 500 column_h = 400 plate_z = 2.54 plate_z2 = 10 x_rail_spacing = 240 x_carriage_spacing = 120 class Gantry: def __init__(self, w): self.left = tubing( column_h, tube_w, tube_h, tube_wall, w.transformed(offset=(-0.5*column_spacing, 0, 0))) self.right = tubing( column_h, tube_w, tube_h, tube_wall, w.transformed(offset=(0.5*column_spacing, 0, 0))) upper_center = column_h - 0.5*tube_w self.upper = tubing( column_spacing - tube_w, tube_h, tube_w, tube_wall, w.transformed(offset=(-0.5*column_spacing+0.5*tube_w, 0, upper_center), rotate=(90, 90, 0))) lower_center = upper_center - x_rail_spacing self.lower = tubing( column_spacing - tube_w, tube_h, tube_w, tube_wall, w.transformed( offset=( -0.5*column_spacing+0.5*tube_w, 0, lower_center), rotate=(90, 90, 0))) self.upper_rail = HGR20( w.transformed( offset=(0, 0.5*tube_h + plate_z, upper_center), rotate=(-90, 0, 0) ), column_spacing + tube_w) self.lower_rail = HGR20( w.transformed( offset=(0, 0.5*tube_h + plate_z, lower_center), rotate=(-90, 0, 0) ), column_spacing + tube_w) self.upper_front_plate = ( w.transformed(offset=(0, tube_h/2, upper_center), rotate=(-90, 0, 0)) .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)) .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)) .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)) .rect(column_spacing + tube_w, tube_w) .extrude(plate_z) ) self.upper_front_plate = self.upper_rail.holes(self.upper_front_plate) self.upper_back_plate = self.upper_rail.holes(self.upper_back_plate) self.lower_front_plate = self.lower_rail.holes(self.lower_front_plate) self.lower_back_plate = self.lower_rail.holes(self.lower_back_plate) def assembly(self): return (cq.Assembly(name="gantry") .add(self.left, name="left column") .add(self.right, name="right column") .add(self.upper, name="upper platform") .add(self.lower, name="lower platform") .add(self.upper_rail.rail(), name="upper rail") .add(self.lower_rail.rail(), name="lower rail") .add(self.upper_front_plate, name="upper front plate") .add(self.lower_front_plate, name="lower front plate") .add(self.upper_back_plate, name="upper back plate") .add(self.lower_back_plate, name="lower back plate") ) #assembly.test = 7 z_rail_spacing = 120 z_carriage_spacing = 100 z_rail_len = 450 carriage_w = 250 carriage_h = 300 bolster_w = 30 bolster_z = 25 class Carriage: def __init__(self, gantry, x=0, z=0): self.bul = gantry.upper_rail.carriage(x) self.bur = gantry.upper_rail.carriage(x+x_carriage_spacing) self.bll = gantry.lower_rail.carriage(x) self.blr = gantry.lower_rail.carriage(x+x_carriage_spacing) back = cq.Workplane("XZ").copyWorkplane(self.bul.workplaneFromTagged("mountingholes")) # why doesn't this track the carriage without me adding x to it? self.plate = (back.center(-x-HGR20.L-x_carriage_spacing/2, -x_rail_spacing/2) #.rect(HGR20.L+x_carriage_spacing, HGR20.W+x_rail_spacing) .rect(carriage_w, carriage_h) .extrude(plate_z2) .faces(">z") # localselectors plugin .workplane() .tag("carriage_plate") ) self.plate = gantry.upper_rail.carriageHoles(self.plate, x) self.plate = gantry.upper_rail.carriageHoles(self.plate, x+x_carriage_spacing) self.plate = gantry.lower_rail.carriageHoles(self.plate, x) self.plate = gantry.lower_rail.carriageHoles(self.plate, x+x_carriage_spacing) # creating the workplane the rails of the spindle carrier # mount to, because HGR works from that plane forward self.carrier_plane = (cq.Workplane() .copyWorkplane(self.plate.workplaneFromTagged("carriage_plate")) .transformed(offset=(0, 0, HGR20.H), rotate=(180, 0, 0)) ) self.left_rail = HGR20( self.carrier_plane. transformed(offset=(z_rail_spacing/2, z, 0), rotate=(0, 0, 90)), z_rail_len) self.right_rail = HGR20( self.carrier_plane. transformed(offset=(-z_rail_spacing/2, z, 0), rotate=(0, 0, 90)), z_rail_len) u_zcarriage_pos = z_rail_len/2 - HGR20.L/2 -z - z_carriage_spacing/2 l_zcarriage_pos = u_zcarriage_pos + z_carriage_spacing self.ful = self.left_rail.carriage(u_zcarriage_pos) self.fll = self.left_rail.carriage(l_zcarriage_pos) self.fur = self.right_rail.carriage(u_zcarriage_pos) self.flr = self.right_rail.carriage(l_zcarriage_pos) self.plate = self.left_rail.carriageHoles(self.plate, u_zcarriage_pos) self.plate = self.left_rail.carriageHoles(self.plate, l_zcarriage_pos) self.plate = self.right_rail.carriageHoles(self.plate, u_zcarriage_pos) self.plate = self.right_rail.carriageHoles(self.plate, l_zcarriage_pos) self.lbolster = (cq.Workplane() .copyWorkplane(self.plate.workplaneFromTagged("carriage_plate")) .transformed(offset=(-(carriage_w - bolster_w)/2, 0, 0)) .rect(bolster_w, carriage_h) .extrude(bolster_z) ) self.rbolster = (cq.Workplane() .copyWorkplane(self.plate.workplaneFromTagged("carriage_plate")) .transformed(offset=((carriage_w - bolster_w)/2, 0, 0)) .rect(bolster_w, carriage_h) .extrude(bolster_z) ) # TODO add bolster mounting holes self.wp_carrier = (cq.Workplane() .copyWorkplane(self.plate.workplaneFromTagged("carriage_plate")) .transformed(offset=(0, -z, HGR20.H), rotate=(0, 0, 0)) ) def assembly(self): return (cq.Assembly(name="x carriage") .add(self.bul, name="back ul carriage") .add(self.bur, name="back ur carriage") .add(self.bll, name="back ll carriage") .add(self.blr, name="back lr carriage") .add(self.plate, name="carrier plate") .add(self.left_rail.rail(), name="left rail") .add(self.right_rail.rail(), name="right rail") .add(self.ful, name="front ul carriage") .add(self.fur, name="front ur carriage") .add(self.fll, name="front ll carriage") .add(self.flr, name="front lr carriage") .add(self.lbolster, name="left bolster") .add(self.lbolster, name="right bolster") ) class Carrier: def __init__(self, carriage): self.plane = carriage.wp_carrier self.plate = (cq.Workplane() .copyWorkplane(self.plane) .rect(200, z_rail_len) .extrude(10)) self.plate = carriage.left_rail.holes(self.plate) self.plate = carriage.right_rail.holes(self.plate) def assembly(self): return (cq.Assembly(name="z carrier") .add(self.plate, name="z plate")) g = Gantry(cq.Workplane()) c = Carriage(g, 150, 0) ca = Carrier(c) # TODO add ball screws and associated assembly full_assmbly = (cq.Assembly() .add(g.assembly(), name="gantry") .add(c.assembly(), name="carriage") .add(ca.assembly(), name="carrier") ) show_object(full_assmbly) #show_object(ca.assembly()) #show_object(c.assembly()) #show_object(g.assembly())