import cadquery2 as cq from cadquery2 import exporters # Base for the notebook. Basically a kbd base that extends back # as much as possible # Size of the whole object width = 295 height = 165 thickness = 25 kbd_height = 100 kbd_angle = 6 # Thickness of the outer material shell_t = 3 # Insert Positions ti_radius = 2.35 ti_depth = 6.25 pillars = ( cq.Sketch() .push( [ (19, -16.5), (133, -16.5), (247.5, -16.5), (24, -86), (142.5, -91), (261.5, -86), ] ) .trapezoid(12, 12, 90, mode="a") .circle(ti_radius, mode="s") ) def model(): return ( cq.Workplane("XY") .workplane(offset=thickness / 2) .tag("mid_height") # Hollow box .box(width, height, thickness) .edges("|Z") .fillet(2) .faces(">Z") .shell(-shell_t) # Slanted mounting pillars on the kbd top .faces(">Z") .workplane(centerOption="CenterOfBoundBox") .center(-width / 2, 17) .transformed(rotate=cq.Vector(kbd_angle, 0, 0)) .tag("sloped") .placeSketch(pillars) .extrude(-1000) # Remove the excess extrusion .workplaneFromTagged("mid_height") .transformed(offset=cq.Vector(0, 0, -thickness / 2)) .split(keepTop=True) # Slope for the beyboard .workplaneFromTagged("sloped") .split(keepBottom=True) ) top_right = ( model() .faces(">Y") .workplane(offset = -120).split(keepTop=True) .faces(">X") .workplane(offset=-135).split(keepTop=True) ) exporters.export(top_right, "top_right.stl") top_left = ( model() .faces(">Y") .workplane(offset = -120).split(keepTop=True) .faces(">X") .workplane(offset=-135).split(keepBottom=True) ) exporters.export(top_left, "top_left.stl") bottom_right = ( model() .faces(">Y") .workplane(offset = -120).split(keepBottom=True) .faces(">X") .workplane(offset=-165).split(keepTop=True) ) exporters.export(bottom_right, "bottom_right.stl") bottom_left = ( model() .faces(">Y") .workplane(offset = -120).split(keepBottom=True) .faces(">X") .workplane(offset=-165).split(keepBottom=True) ) exporters.export(bottom_left, "bottom_left.stl")