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 = 68.68 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 = 63.18 lbc_width = 57.8 lbc_hole_dist_from_top = 4.5 lbc_hole_dist_from_side = 25.8 lbc_hole_diameter = 5.8 lbc_hole_radius = lbc_hole_diameter / 2.0 wall_thickness = 3 # for a box, not octogon # box_height = 115 + wall_thickness # box_width = 157 + wall_thickness box_radius = 87 + wall_thickness box_thickness = 25 pole_height = box_thickness - 3 inner_pole_height = 13 pole_dist = 3 lower_box = Workplane() def make_component_holder_octogon( result, pole_height, pole_dist, box_radius, x_offset=0, y_offset=0, ): return ( result.workplane(offset=(pole_height / 2) - wall_thickness) .move(x_offset, y_offset) .makePolygon( regularPolygon( nSides=8, radius=box_radius - wall_thickness - pole_dist, # FIXME subtract wall_thickness on the input instead thetaStart=0, thetaEnd=360, ) ) .vertices() .cylinder(pole_height, 3) .workplane(offset=(pole_height - wall_thickness + 1.5)) .move(x_offset, y_offset) .makePolygon( regularPolygon( nSides=8, radius=box_radius - wall_thickness - pole_dist, thetaStart=0, thetaEnd=360, ) ) .vertices() .threadedHole(top_screw, pole_height * 0.6, simple=screw_simple, fit="Close") ) def make_component_holder_line( result, pole_height=0, pole_radius=3, line_x_dist=0, line_y_dist=0, x_offset=0, y_offset=0, ): return ( result.workplane(offset=(wall_thickness / 2.0)) .move(x_offset, y_offset) .line( line_x_dist, line_y_dist, ) .vertices() .cylinder(inner_pole_height, pole_radius) .workplane(offset=(wall_thickness * 2) + 3.7) .move(x_offset, y_offset) .line( line_x_dist, line_y_dist, ) .vertices() .threadedHole(top_screw, inner_pole_height, simple=screw_simple, fit="Close") ) def make_component_holder( result, pole_dist, pole_height=0, pole_radius=3, box_width=None, box_height=None, x_offset=0, y_offset=0, ): return ( result.workplane(offset=(wall_thickness / 2.0)) .move(x_offset, y_offset) .rect( box_height, box_width, ) .vertices() .cylinder(inner_pole_height, pole_radius) .workplane(offset=(wall_thickness * 2) + 3.7) .move(x_offset, y_offset) .rect( box_height, box_width, ) .vertices() .threadedHole(top_screw, inner_pole_height, simple=screw_simple, fit="Close") ) """ 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 = ( lower_box.makePolygon( regularPolygon( nSides=8, radius=box_radius, thetaStart=0, thetaEnd=360, ) ) .extrude(box_thickness) .workplane(offset=-((box_thickness / 2.0) - wall_thickness)) .makePolygon( regularPolygon( nSides=8, radius=box_radius - wall_thickness, thetaStart=0, thetaEnd=360, ) ) .extrude(box_thickness * 2, combine="cut") ) lower_box = make_component_holder_octogon( lower_box, pole_height, pole_dist, box_radius, x_offset=0, y_offset=0 ) """ lower_box = make_component_holder( lower_box, pole_dist, pole_height, box_width, box_height, ) """ lower_box = make_component_holder( lower_box, pole_dist, pole_height=5, box_width=breadboard_width, box_height=breadboard_height, x_offset=0, y_offset=40, ) lower_box = make_component_holder_line( lower_box, pole_height=5, line_x_dist=breadboard_height, line_y_dist=0, x_offset=-(breadboard_height / 2.0), y_offset=40, ) bc_pole_radius = 4 lower_box = lower_box.workplane(offset=(wall_thickness / 2.0)).move(-(lbc_height/2.0), -25).box(5, lbc_width-5, 13) lower_box = lower_box.workplane(offset=(wall_thickness / 2.0)).move(lbc_height/2.0 - bc_pole_radius*2, -25).box(5, lbc_width-5, 13) lower_box = make_component_holder_line( lower_box, pole_height=6, pole_radius=bc_pole_radius, line_x_dist=lbc_height - lbc_hole_diameter - lbc_hole_radius, line_y_dist=0, x_offset=-(lbc_height / 2.0), y_offset=-(lbc_width / 2.5), ) #lower_box = lower_box.workplane(offset=(wall_thickness / 2.0)).box(lbc_height, 5, 13) cq.exporters.export(lower_box, "/home/deck/model_files/fan_control_box_lower.stl") try: show_object(lower_box) except NameError: pass