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", ) kbd_cable_hole = cq.Sketch().trapezoid(15, 5, 90, mode="a").vertices().fillet(1) 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) # Make small hole for the keyboard cable .faces(">Y") .workplane(offset=-5, centerOption="CenterOfBoundBox") .center(width / 2 - 128, -23) .placeSketch(kbd_cable_hole) .cutBlind(-1000) ) exporters.export(model(), "screen_mount.stl") right_side = ( model() .faces(">X") .workplane(centerOption="CenterOfBoundBox", offset=-140) .center(0, height / 2) .split(keepTop=True) ) exporters.export(right_side, "right_screen_mount.stl") left_side = ( model() .faces(">X") .workplane(centerOption="CenterOfBoundBox", offset=-140) .center(0, height / 2) .split(keepBottom=True) ) exporters.export(left_side, "left_screen_mount.stl")