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 = 160 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) ) left_cutout = cq.Sketch().polygon( [(0, 0), (160, 0), (160, -100), (120, -100), (120, -200), (0, -200), (0, 0)], mode="a", ) right_side = ( model() .faces("