from cadquery import exporters from cq_warehouse.extensions import Workplane from cq_warehouse.fastener import * from cq_warehouse.thread import * from cqmore.curve import archimedeanSpiral, circle from cqmore.polygon import regularPolygon, star from cqmore.polyhedron import polarZonohedra, Polyhedron, superellipsoid from svg_path import addSvgPath from svgpathtools import svg2paths import cadquery as cq import cqmore from math import ceil, floor Workplane = cqmore.extend(Workplane) Workplane.addSvgPath = addSvgPath screw_simple = False # Controls whether to not actually make the screw threads, saves time running it for testing screw_length = 10 # FIXME need different ones for different holes top_screw = ButtonHeadScrew( size="M3-0.5", fastener_type="iso7380_1", length=screw_length * MM, simple=screw_simple, ) gland_diameter = 15 barrel_diameter = 11 # digikey perfboard # It's the distance to the *middle* of the hole breadboard_height = 81 breadboard_width = 50.8 bb_hole_dist_from_top = 5.37 bb_hole_dist_from_side = 25.23 bb_hole_diameter = 2.76 # buck converter bc_height = 43.18 bc_width = 31.16 bc_hole_dist_from_top = 6.44 bc_hole_dist_from_side = 2.21 # distance to middle of hole as before, also it's the distance from the closer side bc_hole_diameter = 4.18 # large buck converter lbc_height = 57.8 lbc_width = 57.8 lbc_hole_dist_from_top = 4.5 lbc_hole_dist_from_side = 25.8 lbc_hole_diameter = 6.83 wall_thickness = 3 box_height = 115 + wall_thickness box_width = 157 + wall_thickness box_thickness = 25 pole_height = box_thickness - 2 pole_dist = 10 lower_box = Workplane() def make_component_holder_line( result, pole_height, line_x_dist, line_y_dist, x_offset=0, y_offset=0, ): return ( result.workplane(offset=(pole_height / 2) - wall_thickness) .move(x_offset, y_offset) .line( line_x_dist, line_y_dist, ) .vertices() .cylinder(pole_height, 3) .workplane(offset=(pole_height - wall_thickness + 1.5)) .move(x_offset, y_offset) .line( line_x_dist, line_y_dist, ) .vertices() .threadedHole(top_screw, pole_height * 0.4, simple=screw_simple) ) def make_component_holder( result, pole_dist, pole_height, box_width, box_height, x_offset=0, y_offset=0, ): return ( result.workplane(offset=(pole_height / 2) - wall_thickness) .move(x_offset, y_offset) .rect( box_height - wall_thickness - pole_dist, box_width - wall_thickness - pole_dist, ) .vertices() .cylinder(pole_height, 3) .workplane(offset=(pole_height - wall_thickness + 1.5)) .move(x_offset, y_offset) .rect( box_height - wall_thickness - pole_dist, box_width - wall_thickness - pole_dist, ) .vertices() .threadedHole(top_screw, pole_height * 0.4, simple=screw_simple) ) lower_box = ( lower_box.box(box_height, box_width, box_thickness) .workplane(offset=wall_thickness) .box( box_height - wall_thickness, box_width - wall_thickness, box_thickness, combine="cut", ) ) lower_box = make_component_holder( lower_box, pole_dist, pole_height, box_width, box_height, ) lower_box = make_component_holder( lower_box, pole_dist, 10, breadboard_width, breadboard_height, x_offset=0, y_offset=50, ) lower_box = make_component_holder_line(lower_box, 8, 0, 15, x_offset=0, y_offset=0) cq.exporters.export(lower_box, "/home/deck/model_files/fan_control_box_lower.step") try: show_object(lower_box) except NameError: pass