import cadquery2 as cq from cadquery2 import exporters # Some dimensions copied from modelo.py, # TODO refactor into a separate file # Thickness of the outer material shell_t = 3 # Size of the kbd board kbd_height = 98 kbd_width = 286 kbd_angle = 5 # Size of the whole object width = kbd_width + 2 * shell_t height = 69 thickness = 10 # Visible screen size vis_w = 220 vis_h = 58 viewport_cutout = cq.Sketch().trapezoid(vis_w, vis_h, 90, mode="a") # Whole screen size scr_w = 231 scr_h = 65 scr_thickness = 5.5 screen_cutout = cq.Sketch().trapezoid(scr_w, scr_h, 90, mode="a") # Circuit board and cable hole. # This is in the back of the screen, and is a bit shorter in height than the # screen. It's wider so it removes enough material to make the shape simpler. board_cutout = cq.Sketch().trapezoid( scr_w + 5, scr_h - 10, 90, mode="a", ) def model(): return ( cq.Workplane("XY") .workplane().tag("mid_height") .box(width, 59, 62) .faces(">Z") .transformed(rotate=(45, 0, 0)) # Move the screen "lower" so it doesn't interfere # so much with the back .center(0, -2) .tag("slanted") # Arbitrary huge trapezoid to cut off the material *in front* # of the inclined screen .placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a")) .cutBlind(1000) # Cut off viewport hole so we can see the screen .workplaneFromTagged("slanted") .placeSketch(viewport_cutout) .cutBlind(-shell_t) # Make hole for screen assembly so the whole screen fits .workplaneFromTagged("slanted") .workplane(offset=-shell_t, centerOption="CenterOfBoundBox") # Left bezel is wider than right one, so this hole is displaced to the left .center(-3, 0) .placeSketch(screen_cutout) .cutBlind(-scr_thickness) # Trim the top .workplaneFromTagged("mid_height") .workplane(offset=21) .placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a")) .cutBlind(100) # Make it hollow .faces("Z and |X").fillet(5) ) exporters.export(model(), "screen_mount.stl") left_cutout = cq.Sketch().polygon( [(0, 0), (160, 0), (160, -100), (0, -100), (0, 0)], mode="a", ) right_side = ( model() .faces("