|
@ -3,7 +3,7 @@ from cq_warehouse.fastener import * |
|
|
from cq_warehouse.thread import * |
|
|
from cq_warehouse.thread import * |
|
|
from cqmore.curve import archimedeanSpiral, circle |
|
|
from cqmore.curve import archimedeanSpiral, circle |
|
|
from cqmore.polygon import regularPolygon, star |
|
|
from cqmore.polygon import regularPolygon, star |
|
|
from cqmore.polyhedron import polarZonohedra, Polyhedron |
|
|
from cqmore.polyhedron import polarZonohedra, Polyhedron, superellipsoid |
|
|
from cq_warehouse.extensions import Workplane |
|
|
from cq_warehouse.extensions import Workplane |
|
|
import functools as fnc |
|
|
import functools as fnc |
|
|
import itertools as it |
|
|
import itertools as it |
|
@ -13,77 +13,123 @@ import cqmore |
|
|
Workplane = cqmore.extend(Workplane) |
|
|
Workplane = cqmore.extend(Workplane) |
|
|
|
|
|
|
|
|
planter_height = 210 |
|
|
planter_height = 210 |
|
|
planter_radius = 130 |
|
|
planter_radius = 129 |
|
|
|
|
|
|
|
|
plate_offset = 47 |
|
|
plate_offset = 47 |
|
|
plate_thickness = 3 |
|
|
plate_thickness = 3 |
|
|
|
|
|
|
|
|
zonohedra = polarZonohedra(8, 49) |
|
|
zonohedra = polarZonohedra(8, 49) |
|
|
|
|
|
|
|
|
outer_points = [[n*(planter_height/3.5) for n in vec] for vec in zonohedra.points] |
|
|
outer_points = [[n * (planter_height / 3.5) for n in vec] for vec in zonohedra.points] |
|
|
|
|
|
|
|
|
outer_faces = zonohedra.faces |
|
|
outer_faces = zonohedra.faces |
|
|
|
|
|
|
|
|
outer_poly = Polyhedron(outer_points, outer_faces) |
|
|
outer_poly = Polyhedron(outer_points, outer_faces) |
|
|
|
|
|
|
|
|
result = Workplane().polyhedron(*outer_poly) |
|
|
result = Workplane().polyhedron(*outer_poly) |
|
|
|
|
|
|
|
|
holder_angle_offset = 20 |
|
|
holder_angle_offset = 20 |
|
|
|
|
|
|
|
|
result = (result.workplane(offset=-38).makePolygon( |
|
|
result = ( |
|
|
regularPolygon(nSides=4, |
|
|
result.workplane(offset=-38) |
|
|
radius=planter_radius-40, |
|
|
.makePolygon( |
|
|
|
|
|
regularPolygon( |
|
|
|
|
|
nSides=4, |
|
|
|
|
|
radius=planter_radius - 40, |
|
|
thetaStart=holder_angle_offset, |
|
|
thetaStart=holder_angle_offset, |
|
|
thetaEnd=360+holder_angle_offset), |
|
|
thetaEnd=360 + holder_angle_offset, |
|
|
forConstruction=True) |
|
|
), |
|
|
.vertices().cylinder(10, 7, combine="cut")) |
|
|
forConstruction=True, |
|
|
|
|
|
) |
|
|
|
|
|
.vertices() |
|
|
|
|
|
.cylinder(10, 7, combine="cut") |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
cone = cq.Solid.makeCone(planter_radius, 33, planter_height+95) |
|
|
cone = cq.Solid.makeCone(planter_radius, 33, planter_height + 95) |
|
|
|
|
|
|
|
|
result = result.workplane().cut(cone) |
|
|
result = result.workplane().cut(cone) |
|
|
|
|
|
|
|
|
result = result.workplane(offset=-40).cylinder(planter_height/1.45, planter_radius*0.58, combine="cut") |
|
|
result = result.workplane(offset=-40).cylinder( |
|
|
result = result.workplane(offset=-16).cylinder(planter_height/2.3, planter_radius/2.5, combine="cut") |
|
|
planter_height / 1.45, planter_radius * 0.58, combine="cut" |
|
|
result = result.workplane(offset=-5).cylinder(planter_height/2.3, planter_radius/1.85, combine="cut") |
|
|
) |
|
|
|
|
|
result = result.workplane(offset=-16).cylinder( |
|
|
#result = result.workplane(offset=-10).makePolygon(regularPolygon(nSides=4, radius=planter_radius/2.8, thetaStart=holder_angle_offset, thetaEnd=360+holder_angle_offset)).extrude(planter_height/2.8, combine="cut") |
|
|
planter_height / 2.3, planter_radius / 2.5, combine="cut" |
|
|
|
|
|
) |
|
|
result = result.workplane(offset=40).makePolygon(regularPolygon(nSides=8, radius=planter_radius/2.2, thetaStart=holder_angle_offset, thetaEnd=360+holder_angle_offset)).extrude(planter_height/15.5, combine="cut") |
|
|
result = result.workplane(offset=-5).cylinder( |
|
|
|
|
|
planter_height / 2.3, planter_radius / 1.85, combine="cut" |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
result = ( |
|
|
|
|
|
result.workplane(offset=40) |
|
|
|
|
|
.makePolygon( |
|
|
|
|
|
regularPolygon( |
|
|
|
|
|
nSides=8, |
|
|
|
|
|
radius=planter_radius / 2.2, |
|
|
|
|
|
thetaStart=holder_angle_offset, |
|
|
|
|
|
thetaEnd=360 + holder_angle_offset, |
|
|
|
|
|
) |
|
|
|
|
|
) |
|
|
|
|
|
.extrude(planter_height / 15.5, combine="cut") |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
circle_plate = Workplane().cylinder(plate_thickness, planter_radius/2.2) |
|
|
circle_plate = Workplane().cylinder( |
|
|
|
|
|
plate_thickness, planter_radius * 0.56 |
|
|
|
|
|
) # enough to fit 0.58 |
|
|
|
|
|
|
|
|
# Split this out into a different part |
|
|
# Split this out into a different part |
|
|
circle_plate = (circle_plate.workplane(offset=plate_offset+plate_thickness) |
|
|
circle_plate = ( |
|
|
|
|
|
circle_plate.workplane(offset=plate_offset + plate_thickness) |
|
|
.makePolygon( |
|
|
.makePolygon( |
|
|
star( |
|
|
star(outerRadius=planter_radius / 3, innerRadius=planter_radius / 4.9, n=8), |
|
|
outerRadius=planter_radius/2.6, |
|
|
forConstruction=True, |
|
|
innerRadius=planter_radius/4.9, |
|
|
) |
|
|
n=8), |
|
|
.vertices() |
|
|
forConstruction=True) |
|
|
.cskHole(8, 8, 0.5, depth=None) |
|
|
.vertices().cskHole(8, 8, 0.5, depth=None)) |
|
|
) |
|
|
|
|
|
|
|
|
simple = False |
|
|
simple = False |
|
|
|
|
|
|
|
|
screw = ButtonHeadScrew(size="M16-2", fastener_type="iso7380_1", length=10 * MM, simple=simple) |
|
|
screw = ButtonHeadScrew( |
|
|
|
|
|
size="M16-2", fastener_type="iso7380_1", length=10 * MM, simple=simple |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
scaled_screw = screw.scale(0.92) |
|
|
scaled_screw = screw.scale(0.90) |
|
|
|
|
|
|
|
|
screw_result = Workplane().circle(20).extrude(10).union(scaled_screw) |
|
|
screw_result = Workplane().circle(20).extrude(10).union(scaled_screw) |
|
|
|
|
|
|
|
|
result = result.workplane(offset=planter_height/2).cylinder(80, 65, combine="cut") |
|
|
result = result.workplane(offset=planter_height / 2).cylinder(80, 65, combine="cut") |
|
|
result = result.workplane(offset=(planter_height/2)-27).makePolygon(regularPolygon(nSides=11, |
|
|
|
|
|
radius=planter_radius/1.85, |
|
|
result = ( |
|
|
|
|
|
result.workplane(offset=(planter_height / 2) - 27) |
|
|
|
|
|
.makePolygon( |
|
|
|
|
|
regularPolygon( |
|
|
|
|
|
nSides=11, |
|
|
|
|
|
radius=planter_radius / 1.85, |
|
|
thetaStart=holder_angle_offset, |
|
|
thetaStart=holder_angle_offset, |
|
|
thetaEnd=360+holder_angle_offset)).extrude(10) |
|
|
thetaEnd=360 + holder_angle_offset, |
|
|
result = result.workplane(offset=(planter_height/2)-40).cylinder(80, 8.1, combine="cut") |
|
|
) |
|
|
result = result.workplane(offset=(planter_height/2)-15.6).threadedHole(screw, 20, simple=simple, fit="Loose") |
|
|
) |
|
|
|
|
|
.extrude(10) |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
result = result.workplane(offset=(planter_height / 2) - 15.8).threadedHole( |
|
|
|
|
|
screw, 20, simple=simple, fit="Loose" |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
tapered_circle = ( |
|
|
|
|
|
result.workplane(offset=planter_height / 3.0).circle(30).extrude(10, taper=42) |
|
|
|
|
|
) |
|
|
|
|
|
tapered_circle_inner = ( |
|
|
|
|
|
result.workplane(offset=planter_height / 3.0).circle(20).extrude(10, taper=42) |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
cut_tapered = Workplane().union(tapered_circle).cut(tapered_circle_inner) |
|
|
|
|
|
|
|
|
|
|
|
result = result.union(cut_tapered) |
|
|
|
|
|
|
|
|
assembly = cq.Assembly() |
|
|
assembly = cq.Assembly() |
|
|
|
|
|
|
|
|
assembly.add(screw_result, loc=cq.Location((0,0,0))) |
|
|
assembly.add(screw_result, loc=cq.Location((0, 0, 0))) |
|
|
assembly.add(result, loc=cq.Location((100,100,100))) |
|
|
assembly.add(result, loc=cq.Location((100, 100, 100))) |
|
|
assembly.add(circle_plate, loc=cq.Location((1100,1100,1100))) |
|
|
assembly.add(circle_plate, loc=cq.Location((1100, 1100, 1100))) |
|
|
|
|
|
|
|
|
try: |
|
|
try: |
|
|
show_object(result) |
|
|
show_object(result) |
|
|