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 bottom = Workplane() screw_length = 7 simple = False screw = ButtonHeadScrew( size="M3-0.5", fastener_type="iso7380_1", length=screw_length * MM, simple=simple ) board_thickness = 1.64 wall_offset = 5 w = 26 h = 26 t = 2 screw_diameter = 3.3 screw_radius = screw_diameter / 2.0 hole_dist_from_side = 1.36 bottom = bottom.box(w, h, t) bottom = bottom.box(w + wall_offset, h + wall_offset, screw_length + t + 3) bottom = bottom.workplane(offset=t).box( w + (wall_offset - 2), h + (wall_offset - 2), screw_length + 3, combine="cut" ) bottom = ( bottom.workplane(offset=1.5) .rect( w - hole_dist_from_side - screw_diameter * 2 + 2, h - hole_dist_from_side - screw_diameter * 2 + 2, ) .vertices() .cylinder(screw_length - 1, screw_radius + 1) ) bottom = ( bottom.workplane(offset=4.5) .rect( w - hole_dist_from_side - screw_diameter * 2 + 2, h - hole_dist_from_side - screw_diameter * 2 + 2, ) .vertices() .threadedHole(screw, screw_length - 1, simple=simple) ) top = Workplane() top = top.box(w + wall_offset, h + wall_offset, t) top = ( top.workplane(offset=3.10) .rect( w / 4, h / 2, ) .vertices() .cylinder(5.810 - board_thickness, 1.2) # 5.810 = 9 - 3.189 ) top = ( top.faces(">Z[1]") .rect( w - hole_dist_from_side - screw_diameter * 2 + 2, h - hole_dist_from_side - screw_diameter * 2 + 2, ) .vertices() .hole(screw_diameter, 10) ) top = top.workplane().move(0, 13).box(9.7, 3, 10, combine="cut") top = top.workplane(offset=3).center(0, 0).cylinder(4.17, (4.13 / 2.0) + 0.5) top = top.workplane(offset=0).center(0, 0).cylinder(15, (4.13 / 2.0), combine="cut") cq.exporters.export(bottom, "/home/deck/model_files/air_quality_enclosure_bottom.step") cq.exporters.export(top, "/home/deck/model_files/air_quality_enclosure_top.step") try: show_object(top) except NameError: pass