Probably OpenSCAD isn't what most folks here think of when they hear "CAD" but I'm a programmer by day so for me it can be faster than dragging things around with a mouse and thinking about how to express constraints parsimoniously so constrain-driven CAD doesn't complain about over-constrained models.
For my PM-30MV, I need a stand that holds a tool chest and won't tip over if I have to run a load well out to one end. Since anchoring to the floor isn't a great option for me, cantilevered feet and leveling pads are a better idea. So I fired up OpenSCAD and came up with the following model. Before I weld it up or even buy stock I'd love thoughts on the design. I think the doubled supports in back are probably overkill but are a better-safe-than-sorry thing. I'll take a tool chest without handles or casters installed and slide it in the front, all the way back to the back supports.
The BOM for the image shown is:
2 48" 2"x2" tube (feet)
4 32.55" 1"x2" tube (pillars)
2 29.25" 1"x2" tube (transverse top support)
2 14.3" 1"x2" tube (top mill support)
2 14.3" 1"x1" angle (chest base support)
1 29.25"x18.3" plate (1/8" or thicker)
2 29.25" 1"x4" channel
2 14.3" 1"x4" channel
I didn't specify web/thickness generally, though I put something into the model. I don't have FEA tools and haven't done more than pondered with no training on how this might fail. Basically all the joints would be welded. Large holes drilled/milled in the ends of the feet to mount the leveling pads, and holes (not shown or modeled) drilled and tapped through the top plate and top mill support tubes for attaching the mill.
I would attach the OpenSCAD model but it's not an allowed type, so I guess I'll just paste it inline....
For my PM-30MV, I need a stand that holds a tool chest and won't tip over if I have to run a load well out to one end. Since anchoring to the floor isn't a great option for me, cantilevered feet and leveling pads are a better idea. So I fired up OpenSCAD and came up with the following model. Before I weld it up or even buy stock I'd love thoughts on the design. I think the doubled supports in back are probably overkill but are a better-safe-than-sorry thing. I'll take a tool chest without handles or casters installed and slide it in the front, all the way back to the back supports.
The BOM for the image shown is:
2 48" 2"x2" tube (feet)
4 32.55" 1"x2" tube (pillars)
2 29.25" 1"x2" tube (transverse top support)
2 14.3" 1"x2" tube (top mill support)
2 14.3" 1"x1" angle (chest base support)
1 29.25"x18.3" plate (1/8" or thicker)
2 29.25" 1"x4" channel
2 14.3" 1"x4" channel
I didn't specify web/thickness generally, though I put something into the model. I don't have FEA tools and haven't done more than pondered with no training on how this might fail. Basically all the joints would be welded. Large holes drilled/milled in the ends of the feet to mount the leveling pads, and holes (not shown or modeled) drilled and tapped through the top plate and top mill support tubes for attaching the mill.
I would attach the OpenSCAD model but it's not an allowed type, so I guess I'll just paste it inline....
C-like:
// Copyright © 2018 Michael K Johnson
// CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/
// dimensions are inches not mm because that's what all the components use
// Example dimensions are for holding this chest (without casters installed):
// https://www.homedepot.com/p/Husky-27-in-5-Drawer-Roller-Cabinet-Tool-Chest-in-Textured-Black-UAT-H-26051/303764045
// Expected to be used with leveling pads, such as
// https://www.precisionmatthews.com/shop/levelingpads/
// http://www.grizzly.com/products/Grizzly-Machine-Mount-3-1600-lb-Capacity
// prints calculated lengths to cut; weld all joints, drill as necessary
// no parts shown for filling tubes with sand to damp vibration but feel free
chest_w = 27;
chest_d = 18.3;
chest_h = 31.3;
web=0.125;
w_space = 0.125;
head_space = 0.25;
angle_w = 1;
angle_h = angle_w;
channel_w = 4;
channel_h = 1;
tube_w = 2;
tube_h = 1;
//foot_w = tube_w;
//foot_l = foot_w;
//foot_t = 3/16;
foot_w = 48;
foot_h = 2;
toe_h = max(2, foot_h);
foot_mount_d = 3/8;
pillar_l = chest_h+toe_h+head_space-tube_h;
echo(pillar_length=pillar_l);
transverse_l = chest_w + tube_h*2 + w_space*2;
echo(transverse_length=transverse_l);
support_l = chest_d-2*tube_w;
echo(support_length=support_l);
mill_x_offset = 17.125/2; // measure your mill: half X distance between center of mounting holes
back_support_l = transverse_l;
side_support_l = support_l;
top_t = 1/8;
top_w = chest_w+2*tube_h+2*w_space;
echo(top_width = top_w);
module chest() {
translate([-chest_w/2, -chest_d/2, 0])
cube([chest_w, chest_d, chest_h]);
}
module angle(width=angle_w, height=angle_h, web=web, length=4) {
translate([-width/2, -length/2, -height/2]) {
cube([width, length, web]);
cube([web, length, height]);
}
}
module channel(width=channel_w, height=channel_h, web=web, length=4) {
angle(width, height, web, length);
translate([width-(web+width/2), -length/2, -height/2])
cube([web, length, height]);
}
module tube(width=tube_w, height=tube_h, web=web, length=4) {
channel(width, height, web, length);
translate([-width/2, -length/2, height-(web+height/2)])
cube([width, length, web]);
}
module chest_support() {
toe_top = toe_h-web-angle_h/2;
foot_top = foot_h-angle_h/2;
h = max(toe_top, foot_top);
translate([angle_w/2-(chest_w/2+w_space), 0, h])
rotate([0, 180, 180]) {
if (h == foot_top) {
angle(length = chest_d - 2*tube_w);
} else {
angle(length = chest_d);
}
}
}
module pillar() {
translate([-(tube_h/2+chest_w/2+w_space), -chest_d/2+tube_w/2, pillar_l/2+tube_h])
rotate([90, 0, 90])
tube(length=pillar_l);
// foot — this would work for wide enough chest if no cantilever needed
/*
translate([-(tube_h+chest_w/2+w_space), -chest_d/2+tube_w/2, foot_t/2]) difference() {
cube([foot_w, foot_l, foot_t], center=true);
translate([-foot_w/4, 0, 0]) cylinder(d=foot_mount_d, h=foot_t*2, center=true, $fn=12);
}
*/
}
module foot_hole() {
translate([0, 0, -foot_h/2])
cylinder(d=foot_mount_d, h=foot_h, center=true, $fn=12);
translate([0, 0, foot_h/2])
cylinder(d=tube_w/4*3, h=foot_h, center=true, $fn=24);
}
module foot() {
translate([0, chest_d/2-tube_w/2, foot_h/2])
rotate([0, 0, 90])
difference() {
tube(height=foot_h, length=foot_w);
union() {
translate([0, foot_w/2-tube_w/2]) foot_hole();
translate([0, -(foot_w/2-tube_w/2)]) foot_hole();
}
}
}
module top_transverse() {
translate([0, chest_d/2-tube_w/2, chest_h+toe_h+head_space+tube_h/2])
rotate([0, 0, 90])
tube(length=transverse_l);
}
module top_support() {
translate([-mill_x_offset, 0, chest_h+toe_h+head_space+tube_h/2])
tube(length=support_l);
}
module back_support() {
translate([0, chest_d/2+channel_h/2, 0])
rotate([0, 90, 90])
channel(length=back_support_l);
}
module side_support() {
translate([-(chest_w/2+w_space+channel_h/2), 0, (chest_h+toe_h)/4*3 + channel_w/2])
rotate([0, 90, 0])
channel(length=side_support_l);
}
module top() {
translate([-top_w/2, -chest_d/2, pillar_l+tube_h+tube_h])
cube([top_w, chest_d, top_t]);
}
module assembly() {
//color("Gray", alpha=0.2) translate([0, 0, toe_h]) chest();
// angle supports for chest to sit on
chest_support();
mirror([1, 0, 0]) chest_support();
// pillars up the sides
pillar(); // LF
mirror([1, 0, 0]) pillar(); // RF
mirror([0, 1, 0]) pillar(); // LR
mirror([1, 0, 0]) mirror([0, 1, 0]) pillar(); // RR
// feet
foot();
mirror([0, 1, 0]) foot();
// transverse top supports
top_transverse();
mirror([0, 1, 0]) top_transverse();
// top supports under mill to be drilled for supports
top_support(); // left
mirror([1, 0, 0]) top_support(); // right
translate([0, 0, (chest_h+toe_h)/3 + channel_w/2]) back_support();
translate([0, 0, (chest_h+toe_h)/3*2 + channel_w/2]) back_support();
side_support();
mirror([1, 0, 0]) side_support();
top();
}
assembly();