You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
5.3 KiB
231 lines
5.3 KiB
from cadquery import exporters
|
|
from cq_warehouse.extensions import Workplane
|
|
from cq_warehouse.fastener import *
|
|
from cq_warehouse.thread import *
|
|
import cadquery as cq
|
|
|
|
screw_simple = False # Controls whether to not actually make the screw threads, saves time running it for testing
|
|
|
|
screw_length = 15 # FIXME need different ones for different holes
|
|
handle_screw = ButtonHeadScrew(
|
|
size="M6-1",
|
|
fastener_type="iso7380_1",
|
|
length=screw_length * MM,
|
|
simple=screw_simple,
|
|
)
|
|
|
|
magnet_diameter = 4.92
|
|
magnet_radius = magnet_diameter / 2.0
|
|
|
|
prong_width = 20.0
|
|
prong_dist = 228 - prong_width
|
|
prong_height = 23.5
|
|
prong_thickness = 7.7
|
|
|
|
wall_thickness = 5.4
|
|
depth = 128
|
|
width = 240
|
|
height = 133
|
|
magnet_buffer_space = 0.3
|
|
|
|
foot_diameter = 8.8
|
|
foot_radius = foot_diameter / 2.0
|
|
|
|
result = Workplane()
|
|
result = result.box(
|
|
width + wall_thickness, depth + wall_thickness, height + wall_thickness
|
|
)
|
|
|
|
result = (
|
|
result.workplane(offset=0)
|
|
.move(wall_thickness, 0)
|
|
.box(
|
|
width + wall_thickness,
|
|
depth - wall_thickness,
|
|
height - wall_thickness,
|
|
combine="cut",
|
|
)
|
|
)
|
|
|
|
# Magnet holes
|
|
result = (
|
|
result.workplane(offset=wall_thickness)
|
|
.move(width / 2.0 - magnet_diameter, 0)
|
|
.box(
|
|
magnet_diameter + magnet_buffer_space + 1.5,
|
|
depth,
|
|
height + wall_thickness * 2,
|
|
combine="cut",
|
|
)
|
|
)
|
|
|
|
result = (
|
|
result.workplane(offset=-(height / 2.0) + 1.5)
|
|
.move(
|
|
width / 2.0 - wall_thickness + (magnet_buffer_space / 2.0),
|
|
-(depth / 2.0) + wall_thickness,
|
|
)
|
|
.line(0, depth - wall_thickness * 2)
|
|
.vertices()
|
|
.cylinder(6.6, magnet_radius, combine="cut")
|
|
)
|
|
|
|
door_side_magnet_cut_left = (
|
|
Workplane("XZ")
|
|
.workplane(offset=depth / 2.0)
|
|
.move(
|
|
width / 2.0 - wall_thickness + (magnet_buffer_space / 2.0),
|
|
-depth / 2.0 + wall_thickness + 7,
|
|
)
|
|
.cylinder(4.3, magnet_radius)
|
|
)
|
|
|
|
door_side_magnet_cut_right = (
|
|
Workplane("XZ")
|
|
.workplane(offset=-(depth / 2.0))
|
|
.move(
|
|
width / 2.0 - wall_thickness + (magnet_buffer_space / 2.0),
|
|
-depth / 2.0 + wall_thickness + 7,
|
|
)
|
|
.cylinder(4.3, magnet_radius)
|
|
)
|
|
|
|
result = result.cut(door_side_magnet_cut_left)
|
|
result = result.cut(door_side_magnet_cut_right)
|
|
|
|
door_side_magnet_cut_left_top = (
|
|
Workplane("XZ")
|
|
.workplane(offset=depth / 2.0)
|
|
.move(
|
|
width / 2.0 - wall_thickness + (magnet_buffer_space / 2.0),
|
|
depth / 2.0 - wall_thickness - 7,
|
|
)
|
|
.cylinder(4.3, magnet_radius)
|
|
)
|
|
|
|
door_side_magnet_cut_right_top = (
|
|
Workplane("XZ")
|
|
.workplane(offset=-(depth / 2.0))
|
|
.move(
|
|
width / 2.0 - wall_thickness + (magnet_buffer_space / 2.0),
|
|
depth / 2.0 - wall_thickness - 7,
|
|
)
|
|
.cylinder(4.3, magnet_radius)
|
|
)
|
|
|
|
result = result.cut(door_side_magnet_cut_left_top)
|
|
result = result.cut(door_side_magnet_cut_right_top)
|
|
|
|
# slots to fit the oscilloscope in
|
|
# move 38 mm back
|
|
scope_slots = (
|
|
Workplane("ZX")
|
|
.workplane(offset=(height / 2.0))
|
|
.move(depth / 2.0 - wall_thickness - 38, -(width / 2.0) + 13)
|
|
.line(0, prong_dist)
|
|
.vertices()
|
|
.box(prong_thickness, prong_width, wall_thickness * 3)
|
|
)
|
|
|
|
result = result.cut(scope_slots)
|
|
|
|
feet_cut = (
|
|
Workplane("ZX")
|
|
.workplane(offset=-depth / 2.0 - 2)
|
|
.move(0, 0)
|
|
.rect(height - wall_thickness * 6, width - wall_thickness * 6)
|
|
.vertices()
|
|
.cylinder(1.4, foot_radius)
|
|
)
|
|
|
|
result = result.cut(feet_cut)
|
|
|
|
## Doors
|
|
|
|
door = Workplane()
|
|
door = door.box(wall_thickness, depth, height)
|
|
|
|
## Door magnets
|
|
|
|
door = (
|
|
door.workplane(offset=-(height / 2.0) - 1)
|
|
.move(
|
|
0,
|
|
-(depth / 2.0) + wall_thickness,
|
|
)
|
|
.line(0, depth - wall_thickness * 2)
|
|
.vertices()
|
|
.cylinder(6.6, magnet_radius, combine="cut")
|
|
)
|
|
|
|
_door_side_magnet_cut_left = (
|
|
Workplane("XZ")
|
|
.workplane(offset=(depth / 2.0))
|
|
.move(
|
|
0,
|
|
-depth / 2.0 + wall_thickness + 7,
|
|
)
|
|
.cylinder(4.3, magnet_radius)
|
|
)
|
|
|
|
_door_side_magnet_cut_right = (
|
|
Workplane("XZ")
|
|
.workplane(offset=-(depth / 2.0))
|
|
.move(
|
|
0,
|
|
-depth / 2.0 + wall_thickness + 7,
|
|
)
|
|
.cylinder(4.3, magnet_radius)
|
|
)
|
|
|
|
door = door.cut(_door_side_magnet_cut_left)
|
|
door = door.cut(_door_side_magnet_cut_right)
|
|
|
|
_door_side_magnet_cut_left_top = (
|
|
Workplane("XZ")
|
|
.workplane(offset=depth / 2.0)
|
|
.move(
|
|
0,
|
|
depth / 2.0 - wall_thickness - 7,
|
|
)
|
|
.cylinder(4.3, magnet_radius)
|
|
)
|
|
|
|
_door_side_magnet_cut_right_top = (
|
|
Workplane("XZ")
|
|
.workplane(offset=-(depth / 2.0))
|
|
.move(
|
|
0,
|
|
depth / 2.0 - wall_thickness - 7,
|
|
)
|
|
.cylinder(4.3, magnet_radius)
|
|
)
|
|
|
|
door = door.cut(_door_side_magnet_cut_left_top)
|
|
door = door.cut(_door_side_magnet_cut_right_top)
|
|
|
|
# door_handle_cut = Workplane().union(screw_thread.rotate((0, 0, 0), (0, 1, 0), 270))
|
|
door = (
|
|
door.rotate((0, 0, 0), (0, 1, 0), 270)
|
|
.workplane(offset=6.0)
|
|
.move(60, 0)
|
|
.threadedHole(handle_screw, 8, simple=screw_simple, fit="Close")
|
|
)
|
|
|
|
handle = (
|
|
Workplane()
|
|
.union(handle_screw)
|
|
.workplane(offset=5)
|
|
.cylinder(8, 6, combine="cut")
|
|
.workplane(offset=5)
|
|
.cylinder(5, 3.5)
|
|
)
|
|
|
|
cq.exporters.export(result, "/home/deck/model_files/organizer.stl")
|
|
cq.exporters.export(door, "/home/deck/model_files/organizer_door.stl")
|
|
cq.exporters.export(handle, "/home/deck/model_files/organizer_door_handle.stl")
|
|
|
|
try:
|
|
show_object(handle)
|
|
except NameError:
|
|
pass
|
|
|