94 lines
2.2 KiB
Python
94 lines
2.2 KiB
Python
|
import cadquery as cq
|
||
|
from cadquery import exporters
|
||
|
|
||
|
|
||
|
p_innerWidth = 27.0 # Outer width of box enclosure
|
||
|
p_innerLength = 51.0 # Outer length of box enclosure
|
||
|
p_innerHeight = 20 # Outer height of box enclosure
|
||
|
|
||
|
p_thickness = 1.0 # Thickness of the box walls
|
||
|
p_bottomHeight = 3
|
||
|
p_boardThickness = 1
|
||
|
|
||
|
p_screwpostSpacing = [20.4, 44.4]
|
||
|
p_screwpostID = 3.5
|
||
|
p_screwpostOD = 5
|
||
|
p_innerScrewpostOD = 6.25
|
||
|
p_screwLength = 12.0
|
||
|
|
||
|
p_countersinkDiameter = 5.75
|
||
|
|
||
|
p_hexnutDiameter = 6.5
|
||
|
p_hexnutDepth = 2.5
|
||
|
|
||
|
p_wireOpening = [15, 6]
|
||
|
|
||
|
countersinkDepth = (p_innerHeight + p_thickness * 2) - p_screwLength
|
||
|
|
||
|
enclosed = (
|
||
|
cq.Workplane("XY")
|
||
|
.rect(p_innerWidth, p_innerLength)
|
||
|
.extrude(p_innerHeight)
|
||
|
)
|
||
|
|
||
|
# split box into lid and bottom parts
|
||
|
(bottom, lid) = (
|
||
|
enclosed.shell(p_thickness)
|
||
|
.faces("<Z")
|
||
|
.workplane(-(p_thickness + p_bottomHeight + p_boardThickness))
|
||
|
.split(keepTop=True, keepBottom=True)
|
||
|
.all()
|
||
|
)
|
||
|
|
||
|
bottom = (
|
||
|
bottom.faces("<Z[1]").workplane()
|
||
|
.rect(*p_screwpostSpacing, forConstruction=True)
|
||
|
.vertices()
|
||
|
.polygon(6, p_hexnutDiameter + p_thickness * 2)
|
||
|
.extrude(p_bottomHeight)
|
||
|
)
|
||
|
|
||
|
bottom = (
|
||
|
bottom.faces("<Z").workplane()
|
||
|
.rect(*p_screwpostSpacing, forConstruction=True)
|
||
|
.vertices().tag("screw_holes")
|
||
|
.polygon(6, p_hexnutDiameter)
|
||
|
.cutBlind(-p_hexnutDepth)
|
||
|
.vertices(tag="screw_holes")
|
||
|
.circle(p_screwpostID / 2.0)
|
||
|
.cutThruAll()
|
||
|
)
|
||
|
|
||
|
lid = (
|
||
|
lid.faces("<Z").workplane()
|
||
|
.rect(*p_screwpostSpacing, forConstruction=True)
|
||
|
.vertices()
|
||
|
.circle(p_screwpostOD / 2.0)
|
||
|
.extrude('next')
|
||
|
)
|
||
|
|
||
|
lid = (
|
||
|
lid.faces(">Z").workplane()
|
||
|
.rect(*p_screwpostSpacing, forConstruction=True)
|
||
|
.vertices().tag("screw_holes")
|
||
|
.circle(p_countersinkDiameter / 2.0 + p_thickness)
|
||
|
.extrude(-(countersinkDepth + p_thickness))
|
||
|
.vertices(tag="screw_holes")
|
||
|
.cboreHole(p_screwpostID, p_countersinkDiameter, countersinkDepth)
|
||
|
)
|
||
|
|
||
|
lid = (
|
||
|
lid.faces(">Y").edges("<Z").workplane(centerOption='CenterOfMass')
|
||
|
.move(0, p_wireOpening[1] / 2.0)
|
||
|
.rect(*p_wireOpening)
|
||
|
.cutThruAll()
|
||
|
)
|
||
|
|
||
|
|
||
|
show_object(bottom, 'bottom')
|
||
|
show_object(lid, 'lid')
|
||
|
|
||
|
|
||
|
exporters.export(bottom, f'bottom.stl')
|
||
|
exporters.export(lid, f'lid.stl')
|