cnc-v2/gantry.py

222 lines
8.5 KiB
Python

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())