├── .gitignore ├── photos ├── cover.jpg ├── desk.jpg ├── side.jpg └── socket.jpg ├── test_hex_mount.stl ├── .gitmodules ├── test_hex_mount.scad ├── lily58.scad ├── lily58plate_slot.scad ├── README.md ├── LICENSE ├── module-bevelextrude.scad ├── Makefile ├── lily58_TOP-Frame.svg ├── lily58cover.scad ├── lily58case.scad ├── lily58plate.scad ├── lily58base.scad ├── lily58_BOTTOM-Edge_Cuts.svg ├── lily58_BOTTOM-Frame.svg ├── lily58_TOP-Edge_Cuts.svg └── lily58_TOP-B_Cu.svg /.gitignore: -------------------------------------------------------------------------------- 1 | *.gcode 2 | *.3mf 3 | -------------------------------------------------------------------------------- /photos/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/lily58-3d/main/photos/cover.jpg -------------------------------------------------------------------------------- /photos/desk.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/lily58-3d/main/photos/desk.jpg -------------------------------------------------------------------------------- /photos/side.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/lily58-3d/main/photos/side.jpg -------------------------------------------------------------------------------- /photos/socket.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/lily58-3d/main/photos/socket.jpg -------------------------------------------------------------------------------- /test_hex_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/lily58-3d/main/test_hex_mount.stl -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "BOSL"] 2 | path = BOSL 3 | url = https://github.com/revarbat/BOSL.git 4 | -------------------------------------------------------------------------------- /test_hex_mount.scad: -------------------------------------------------------------------------------- 1 | 2 | module hex_mount(l=3, hex=1.55, height=1.5, thick=5) { 3 | difference() { 4 | translate([0, -thick/2, 0]) cube([l, thick, height]); 5 | translate([0, -hex/2, height/2]) cube([l, hex, height/2]); 6 | translate([0, 0, height-hex/cos(30)/2]) rotate([0, 90, 0]) cylinder(l, d=hex/cos(30), $fn=6); 7 | } 8 | } 9 | 10 | cube([28, 15, 1], center=true); 11 | translate([10, 4, -1.6-0.5]) { 12 | hex_mount(l=3, height=1.6); 13 | translate([-20, -10, 0]) rotate([0, 0, 90]) hex_mount(l=1.5, hex=1.60, height=1.6); 14 | } -------------------------------------------------------------------------------- /lily58.scad: -------------------------------------------------------------------------------- 1 | // Switch style 2 | low_profile = false; 3 | // Include case 4 | case = false; 5 | // Show PCB 6 | pcb = false; 7 | 8 | translate([-97, -125, 0]) union() { 9 | if (pcb) { 10 | translate([0, 0, -1.6]) color("blue", 0.1) { 11 | linear_extrude(1.6) import("lily58-B_Cu.svg", $fn=8); 12 | linear_extrude(1.6) import("lily58-F_Cu.svg", $fn=8); 13 | } 14 | } 15 | if (low_profile) { 16 | import("lily58plate_low_profile.stl"); 17 | translate([0, 0, -1.6]) import("lily58base_low_profile.stl"); 18 | translate([97, 125, 0]) import("lily58cover_low_profile.stl"); 19 | if (case) { 20 | import("lily58case_low_profile.stl"); 21 | } 22 | } else { 23 | import("lily58plate.stl"); 24 | translate([0, 0, -1.6]) import("lily58base.stl"); 25 | translate([97, 125, 0]) import("lily58cover.stl"); 26 | if (case) { 27 | import("lily58case.stl"); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lily58plate_slot.scad: -------------------------------------------------------------------------------- 1 | // Demo switch style 2 | low_profile = false; 3 | 4 | include 5 | use 6 | 7 | 8 | module slot_negative(low_profile = false) { 9 | upper_plate = low_profile ? 1.3 : 1.5; 10 | height = low_profile ? 2.2 : 5; 11 | hole = low_profile ? 14.1 : 14.1; 12 | hang = low_profile ? 1 : 2; 13 | hang_width = low_profile ? 11.5 : 6; 14 | 15 | cuboid([hole, hole, height], align=V_UP); 16 | // Printing upright 17 | //cuboid([hole+hang, hole+hang, height-upper_plate], align=V_UP, chamfer=2, edges=EDGES_Z_ALL); 18 | // Inverted printing 19 | cuboid([hole+hang, hang_width, height-upper_plate], align=V_UP, chamfer=1, edges=EDGES_Z_ALL); 20 | cuboid([hang_width, hole+hang, height-upper_plate], align=V_UP, chamfer=1, edges=EDGES_Z_ALL); 21 | } 22 | 23 | module slot_demo(low_profile = false) { 24 | difference() { 25 | cuboid([20, 20, low_profile ? 2.2 : 5], align=V_UP); 26 | slot_negative(low_profile = low_profile); 27 | } 28 | } 29 | 30 | slot_demo(low_profile=low_profile); 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Lily58 3D 3 | 4 | 3D printable plate and base for the Lily58 Pro. 5 | 6 | Goals: 7 | 8 | - Portable, not take up too much space in my bag 9 | - Low profile while using full-size switches 10 | 11 | ## Hardware 12 | 13 | You'll need the models printed, plus these parts per side: 14 | 15 | - 7 × M2 nuts 16 | - 7 × 8mm M2 bolts 17 | - Button/pan head bolts work well. A whole set of M2 bolts of different lengths is pretty affordable 18 | - Please check the 3D models again before buying specific lengths, I am unsure if this is the right lengths 19 | 20 | ## Media 21 | 22 | I did a [talk on this at Hackware v7.3](https://www.youtube.com/watch?v=zgcLRntWxqA). 23 | 24 | Submit photos of your own prints on [GitHub Discussions](https://github.com/serverwentdown/lily58-3d/discussions/new?category=show-and-tell&title=Here%27s%20my%20print!)! 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Ambrose Chua 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /module-bevelextrude.scad: -------------------------------------------------------------------------------- 1 | // Original version by Greg Frost https://www.thingiverse.com/thing:135408 2 | // Modified to support bottom bevels 3 | 4 | //bevel_extrude_example(); 5 | 6 | module bevel_extrude_example() 7 | { 8 | bevel_extrude(height=10,bevel_depth=2,bottom=true,$fn=16) 9 | example_shape(); 10 | } 11 | 12 | module example_shape() 13 | { 14 | union() 15 | { 16 | square([8,30],true); 17 | rotate(30) 18 | square([35,8],true); 19 | 20 | translate([0,15]) 21 | square([30,8],true); 22 | } 23 | } 24 | 25 | module bevel_border(size=1) 26 | { 27 | difference() 28 | { 29 | minkowski() 30 | { 31 | children(); 32 | square(size,true); 33 | } 34 | children(); 35 | } 36 | } 37 | 38 | module bevel_cutaway(bevel_depth=5,bottom=false) 39 | { 40 | translate([0,0,-bevel_depth]) 41 | minkowski() 42 | { 43 | linear_extrude(height=bevel_depth,convexity=5) 44 | bevel_border(1) 45 | children(); 46 | if (bottom) { 47 | cylinder(h=bevel_depth+1,r2=0,r1=bevel_depth*sqrt(2)); 48 | } else { 49 | cylinder(h=bevel_depth+1,r1=0,r2=bevel_depth*sqrt(2)); 50 | } 51 | } 52 | } 53 | 54 | module bevel_extrude(height=20,bevel_depth=1,bottom=false) 55 | { 56 | difference() 57 | { 58 | linear_extrude(height=height,convexity=5) 59 | children(); 60 | if (bottom) { 61 | translate([0,0,0]) 62 | bevel_cutaway(bevel_depth,bottom) 63 | children(); 64 | } else { 65 | translate([0,0,height]) 66 | bevel_cutaway(bevel_depth,bottom) 67 | children(); 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | OPENSCAD=flatpak run org.openscad.OpenSCAD 2 | OPENSCAD_EXPORT=$(OPENSCAD) --export-format asciistl 3 | 4 | TARGETS=\ 5 | lily58plate.stl \ 6 | lily58plate_low_profile.stl \ 7 | lily58base.stl \ 8 | lily58base_low_profile.stl \ 9 | lily58base_6deg.stl \ 10 | lily58cover.stl \ 11 | lily58cover_low_profile.stl \ 12 | lily58cover_socketed.stl \ 13 | lily58case.stl \ 14 | lily58case_low_profile.stl \ 15 | lily58case_pair.stl \ 16 | lily58case_pair_low_profile.stl \ 17 | 18 | 19 | all: $(TARGETS) 20 | 21 | clean: 22 | rm -f $(TARGETS) 23 | 24 | lily58plate.stl: lily58plate.scad lily58plate_slot.scad 25 | $(OPENSCAD_EXPORT) -o lily58plate.stl lily58plate.scad 26 | lily58plate_low_profile.stl: lily58plate.scad lily58plate_slot.scad 27 | $(OPENSCAD_EXPORT) -o lily58plate_low_profile.stl lily58plate.scad -D low_profile=true 28 | 29 | lily58base.stl: lily58base.scad 30 | $(OPENSCAD_EXPORT) -o lily58base.stl lily58base.scad 31 | lily58base_low_profile.stl: lily58base.scad 32 | $(OPENSCAD_EXPORT) -o lily58base_low_profile.stl lily58base.scad -D low_profile=true 33 | lily58base_6deg.stl: lily58base.scad 34 | $(OPENSCAD_EXPORT) -o lily58base_6deg.stl lily58base.scad -D tilted=true 35 | 36 | lily58cover.stl: lily58cover.scad lily58plate.scad lily58plate_slot.scad lily58base.scad 37 | $(OPENSCAD_EXPORT) -o lily58cover.stl lily58cover.scad 38 | lily58cover_low_profile.stl: lily58cover.scad lily58plate.scad lily58plate_slot.scad lily58base.scad 39 | $(OPENSCAD_EXPORT) -o lily58cover_low_profile.stl lily58cover.scad -D low_profile=true 40 | lily58cover_socketed.stl: lily58cover.scad lily58plate.scad lily58plate_slot.scad lily58base.scad 41 | $(OPENSCAD_EXPORT) -o lily58cover_socketed.stl lily58cover.scad -D socketed=true 42 | 43 | lily58case.stl: lily58case.scad 44 | $(OPENSCAD_EXPORT) -o lily58case.stl lily58case.scad 45 | 46 | lily58case_low_profile.stl: lily58case.scad 47 | $(OPENSCAD_EXPORT) -o lily58case_low_profile.stl lily58case.scad -D low_profile=true 48 | 49 | lily58case_pair.stl: lily58case.scad 50 | $(OPENSCAD_EXPORT) -o lily58case_pair.stl lily58case.scad -D pair=true 51 | 52 | lily58case_pair_low_profile.stl: lily58case.scad 53 | $(OPENSCAD_EXPORT) -o lily58case_pair_low_profile.stl lily58case.scad -D pair=true -D low_profile=true 54 | -------------------------------------------------------------------------------- /lily58_TOP-Frame.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 38 | SVG Picture created as Lily58_Pro_TOP-Edge_Cuts.svg date 2021/12/30 12:46:19 40 | Picture generated by PCBNEW 42 | 47 | 49 | 50 | 52 | SVG Picture created as Lily58_Pro_TOP-Edge_Cuts.svg date 2021/12/30 12:46:19 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /lily58cover.scad: -------------------------------------------------------------------------------- 1 | // Higher definition curves 2 | $fa = 8; 3 | $fs = 0.4; 4 | 5 | // Switch style 6 | low_profile = false; 7 | // Controller is socketed 8 | socketed = false; 9 | // Full size cavity 10 | full_size_cavity = true; 11 | // Battery thickness. Original design is 8mm. New design is 7mm. Include adhesive thickness. 12 | battery_thickness = 7.5; 13 | 14 | use 15 | use 16 | 17 | include 18 | use 19 | 20 | 21 | 22 | translate([-97, -125, -2]) color("red", 0.4) { 23 | linear_extrude(0.1) import("lily58-B_Cu.svg", $fn=8); 24 | linear_extrude(0.1) import("lily58-F_Cu.svg", $fn=8); 25 | } 26 | 27 | 28 | module cover(low_profile = false) { 29 | width = 28.2; 30 | depth = 54.3; 31 | top_thick = 0.75; 32 | height = socketed ? 5.5 + 1.6 + battery_thickness + top_thick : 2.5 + battery_thickness + top_thick; 33 | pcb_thick = 1.6; 34 | 35 | difference() { 36 | //translate([-14.7, -3, -pcb_thick]) cuboid([29, 48.8+2.8, height+pcb_thick], fillet=2, edges=EDGES_Z_ALL, center=false); 37 | translate([-14.2, 51.55-depth, -pcb_thick]) cuboid([width, depth-3.5, height+pcb_thick], fillet=1.2, edges=EDGES_Z_ALL, center=false); 38 | 39 | translate([-97, -125, -0.05]) plate(low_profile=low_profile); 40 | translate([-97, -125, -pcb_thick]) linear_extrude(pcb_thick) offset(0.1) import("lily58_BOTTOM-Frame.svg"); 41 | 42 | // Mounting 43 | bolt_thick = 1.3; 44 | bolt_width = 4.7; 45 | bolt_position = 6; 46 | slot_width = bolt_width * cos(30); 47 | slot_length = 5; 48 | translate([11, 0, 0]) cylinder(bolt_position, d=2.4); 49 | translate([11, 0, bolt_position-0.2]) rotate([0, 0, 30]) cylinder(bolt_thick+0.2, d=4.7, $fn=6); 50 | translate([11-slot_width/2, 0, bolt_position]) cuboid([slot_width, slot_length, bolt_thick], center=false); 51 | translate([-11, 0, 0]) cylinder(bolt_position, d=2.4); 52 | translate([-11, 0, bolt_position-0.2]) rotate([0, 0, 30]) cylinder(bolt_thick+0.2, d=4.7, $fn=6); 53 | translate([-11-slot_width/2, 0, bolt_position]) cuboid([slot_width, slot_length, bolt_thick], center=false); 54 | 55 | // Reset 56 | translate([-12.6, 17.35, 0]) cylinder(20, d=1.8); 57 | translate([-12.1, 17.35, 0]) cuboid([3.75, 8.5, 4.75], align=[0, 0, 1]); 58 | 59 | translate([3.45, 7, 0]) union() { 60 | difference() { 61 | union() { 62 | if (full_size_cavity) { 63 | step = 1.7; 64 | // Controller 65 | translate([0, -4.9, 0]) cuboid([19.5, 46, step], align=[0, 1, 1]); 66 | translate([0, -4.9, 0]) cuboid([12.5, 45.5, step+0.2], align=[0, 1, 1]); 67 | // Remaining cavity 68 | translate([-15, -4.9, 0]) cuboid([24.5, 44.7, height-top_thick], align=[1, 1, 1]); 69 | } else { 70 | // Controller Cavity 71 | cuboid([20, 40, 7.5], align=[0, 1, 1]); 72 | // Battery Cavity 73 | translate([0, -3, 0]) cuboid([16, 43, 14.5], align=[0, 1, 1]); 74 | } 75 | } 76 | if (socketed) { 77 | // Support 78 | translate([0, 40, 0]) cuboid([20, 2, 2], align=[0, -1, 1]); 79 | } 80 | } 81 | // USB socket 82 | translate([0, 40-12+2, socketed ? 2 : -0.5]) cuboid([11, 12, 3.5], align=[0, 1, 1], fillet=1.5, edges=EDGES_Y_ALL); 83 | } 84 | } 85 | } 86 | 87 | cover(low_profile=low_profile); 88 | // Correction: 0% infill, PETG, Rev 1 89 | //scale([1.007, 1.007, 1.000]) cover(low_profile=low_profile); 90 | -------------------------------------------------------------------------------- /lily58case.scad: -------------------------------------------------------------------------------- 1 | // Higher definition curves 2 | $fa = 8; 3 | $fs = 0.4; 4 | 5 | // Switch style 6 | low_profile = false; 7 | // Case for both sides 8 | pair = false; 9 | 10 | use 11 | 12 | module hex_mount(l=3, hex=1.55, height=1.5, thick=5) { 13 | difference() { 14 | translate([0, -thick/2, 0]) cube([l, thick, height]); 15 | translate([0, -hex/2, height/2]) cube([l, hex, height/2]); 16 | translate([0, 0, height-hex/cos(30)/2]) rotate([0, 90, 0]) cylinder(l, d=hex/cos(30), $fn=6); 17 | } 18 | } 19 | 20 | module case_side(low_profile = false, pair = false) { 21 | /* 22 | translate([0, 0, 0]) color("blue", 0.2) { 23 | linear_extrude(0.1) import("lily58-B_Cu.svg", $fn=8); 24 | linear_extrude(0.1) import("lily58-F_Cu.svg", $fn=8); 25 | } 26 | */ 27 | //translate([0, 0, -4]) bevel_extrude(4, bevel_depth=1, bottom=true) offset(0.1) import("lily58_BOTTOM-Frame.svg"); 28 | // Height of the plate 29 | plate_height = low_profile ? 2.2 : 5; 30 | // Height between the PCB and top of key 31 | pcb_key_height = low_profile ? 12.5 : 20; 32 | // Height between the plate and top of key 33 | plate_key_height = pcb_key_height - plate_height; 34 | // Height of the hex holder 35 | holder_height = 1.6; 36 | // Additional height between key and plate 37 | over_height = holder_height + 0.4; 38 | // Total height for the supports 39 | support_height = plate_key_height + over_height; 40 | // Height of the base 41 | base_height = low_profile ? 0 : 0; 42 | // Height of the PCB 43 | pcb_height = 1.6; 44 | // Total height of the hole 45 | height = over_height + pcb_key_height + pcb_height + base_height; 46 | 47 | base = 1.5; 48 | gap = 0.05; 49 | wall = 1.5; 50 | translate([0, 0, pair ? -height-wall/2 : -pcb_height-base_height]) difference() { 51 | translate([0, 0, 0]) bevel_extrude(height+wall, bevel_depth=pair ? 0 : 2, bottom=false) offset(0.1+gap+wall) import("lily58_BOTTOM-Frame.svg"); 52 | difference() { 53 | translate([0, 0, 0]) bevel_extrude(height, bevel_depth=2) offset(0.1+gap) import("lily58_BOTTOM-Frame.svg"); 54 | 55 | translate([82-0.2, 95, height - support_height]) cube([8, 25, support_height]); 56 | translate([144.4, 73.4, height - support_height]) cube([35, 2, support_height]); 57 | translate([179.5, 87, height - support_height]) cube([6, 6, support_height]); 58 | translate([185.5, 88.3, height - support_height]) cube([17, 1, support_height]); 59 | translate([189, 169.5, height - support_height]) cube([38, 4, support_height]); 60 | translate([209, 167.5, height - support_height]) cube([18, 4, support_height]); 61 | translate([113.5, 171, height - support_height]) cube([15, 3, support_height]); 62 | 63 | translate([160, 170, height-holder_height]) { 64 | hex_mount(l=3, height=holder_height); 65 | translate([-20, -10, 0]) rotate([0, 0, 90]) hex_mount(l=1.5, hex=1.60, height=holder_height); 66 | } 67 | } 68 | } 69 | 70 | //translate([97, 125, 0]) import("lily58cover_low_profile.stl"); 71 | } 72 | 73 | module case(low_profile = false, pair = true) { 74 | if (pair) { 75 | case_side(low_profile=low_profile, pair=true); 76 | mirror([0, 0, 1]) case_side(low_profile=low_profile, pair=true); 77 | } else { 78 | case_side(low_profile=low_profile, pair=false); 79 | } 80 | } 81 | 82 | case(low_profile=low_profile, pair=pair); 83 | // Correction: 0% infill, PETG, Rev 1 84 | //scale([1.007, 1.007, 1.007]) base(); 85 | //scale(1.007, 1.007) base(); 86 | // Correction: 0% infill, PETG 87 | //scale([1.004, 1.004, 0.004]) base(); 88 | -------------------------------------------------------------------------------- /lily58plate.scad: -------------------------------------------------------------------------------- 1 | // Higher definition curves 2 | $fa = 8; 3 | $fs = 0.4; 4 | 5 | // Switch style 6 | low_profile = false; 7 | 8 | use 9 | use 10 | 11 | 12 | module bolt(low_profile = false) { 13 | depth = low_profile ? 2.2 : 5; 14 | head = 1.2; 15 | translate([0, 0, -depth]) cylinder(10, d=2.4); 16 | translate([0, 0, depth-head]) cylinder(head, d=4.7, $fn=6); 17 | } 18 | 19 | module bolt_notch() { 20 | // 1.65 instead of 1.6 to allow for some compression 21 | translate([0, 0, -1.65]) cylinder(1.65, d=4.2); 22 | } 23 | 24 | module plate(low_profile = false) { 25 | depth = low_profile ? 2.2 : 5; 26 | shrink = 0.01; 27 | //translate([0, -2, -1]) color("red") linear_extrude(0.1) import("lily58_TOP-B_Cu.svg"); 28 | //color("red") linear_extrude(0.1) import("lily58-F_Cu.svg", $fn=8); 29 | difference() { 30 | union() { 31 | translate([0, -2, shrink]) bevel_extrude(depth-shrink*2, bevel_depth=1, $fn=32) offset(0.1) import("lily58_TOP-Frame.svg"); 32 | translate([105, y_cmp-114.8, 0]) bolt_notch(); 33 | translate([129.6, y_cmp-59.6, 0]) bolt_notch(); 34 | translate([129.6, y_cmp-97.6, 0]) bolt_notch(); 35 | translate([205.8, y_cmp-61.8, 0]) bolt_notch(); 36 | translate([205.8, y_cmp-100, 0]) bolt_notch(); 37 | } 38 | y_cmp = 210; 39 | 40 | // Keys 41 | translate([101.4, y_cmp-97.5, 0]) slot_negative(low_profile=low_profile); 42 | translate([105, y_cmp-127, 0]) rotate([0, 0, -60]) slot_negative(low_profile=low_profile); 43 | translate([120.5, y_cmp-50, 0]) slot_negative(low_profile=low_profile); 44 | translate([120.5, y_cmp-69.1, 0]) slot_negative(low_profile=low_profile); 45 | translate([120.5, y_cmp-88.1, 0]) slot_negative(low_profile=low_profile); 46 | translate([120.5, y_cmp-107.1, 0]) slot_negative(low_profile=low_profile); 47 | translate([139.5, y_cmp-47.6, 0]) slot_negative(low_profile=low_profile); 48 | translate([139.5, y_cmp-66.7, 0]) slot_negative(low_profile=low_profile); 49 | translate([139.5, y_cmp-85.7, 0]) slot_negative(low_profile=low_profile); 50 | translate([139.5, y_cmp-104.8, 0]) slot_negative(low_profile=low_profile); 51 | translate([158.6, y_cmp-46.21, 0]) slot_negative(low_profile=low_profile); 52 | translate([158.6, y_cmp-65.3, 0]) slot_negative(low_profile=low_profile); 53 | translate([158.6, y_cmp-84.4, 0]) slot_negative(low_profile=low_profile); 54 | translate([158.6, y_cmp-103.4, 0]) slot_negative(low_profile=low_profile); 55 | translate([177.6, y_cmp-47.6, 0]) slot_negative(low_profile=low_profile); 56 | translate([177.6, y_cmp-66.6, 0]) slot_negative(low_profile=low_profile); 57 | translate([177.6, y_cmp-85.7, 0]) slot_negative(low_profile=low_profile); 58 | translate([177.6, y_cmp-104.8, 0]) slot_negative(low_profile=low_profile); 59 | translate([196.7, y_cmp-52.4, 0]) slot_negative(low_profile=low_profile); 60 | translate([196.7, y_cmp-71.3, 0]) slot_negative(low_profile=low_profile); 61 | translate([196.7, y_cmp-90.5, 0]) slot_negative(low_profile=low_profile); 62 | translate([196.7, y_cmp-109.5, 0]) slot_negative(low_profile=low_profile); 63 | translate([215.7, y_cmp-53.9, 0]) slot_negative(low_profile=low_profile); 64 | translate([215.7, y_cmp-72.8, 0]) slot_negative(low_profile=low_profile); 65 | translate([215.7, y_cmp-92, 0]) slot_negative(low_profile=low_profile); 66 | translate([215.7, y_cmp-111, 0]) slot_negative(low_profile=low_profile); 67 | translate([130, y_cmp-126, 0]) slot_negative(low_profile=low_profile); 68 | translate([149, y_cmp-123.75, 0]) slot_negative(low_profile=low_profile); 69 | translate([168.1, y_cmp-123.75, 0]) slot_negative(low_profile=low_profile); 70 | 71 | // Cover 72 | translate([108, y_cmp-85, 0]) cylinder(depth, d=4); 73 | translate([86, y_cmp-85, 0]) cylinder(depth, d=4); 74 | 75 | // Bolts 76 | translate([105, y_cmp-114.8, 0]) bolt(low_profile=low_profile); 77 | translate([129.6, y_cmp-59.6, 0]) bolt(low_profile=low_profile); 78 | translate([129.6, y_cmp-97.6, 0]) bolt(low_profile=low_profile); 79 | translate([205.8, y_cmp-61.8, 0]) bolt(low_profile=low_profile); 80 | translate([205.8, y_cmp-100, 0]) bolt(low_profile=low_profile); 81 | } 82 | } 83 | 84 | plate(low_profile=low_profile); 85 | // Correction: 0% infill, PETG, Rev 1 86 | //scale([1.007, 1.007, 1.000]) plate(low_profile=low_profile); 87 | // Correction: 0% infill, PETG 88 | //scale([1.004, 1.004, 0.004]) plate(); 89 | -------------------------------------------------------------------------------- /lily58base.scad: -------------------------------------------------------------------------------- 1 | // Higher definition curves 2 | $fa = 8; 3 | $fs = 0.4; 4 | 5 | tilted = false; 6 | // Switch style 7 | low_profile = false; 8 | 9 | use 10 | 11 | 12 | module bolt() { 13 | thick = 1.4; 14 | translate([0, 0, -12]) cylinder(12, d=2.4); 15 | translate([0, 0, -12-thick]) cylinder(12, d=3.9); 16 | } 17 | 18 | module slot_keepout(low_profile = false) { 19 | if (low_profile) { 20 | translate([-16/2, -6.175, -1.8]) cube([16, 5, 1.8]); 21 | translate([-18.75/2, -6.175+(5-2.5)/2, -1.8]) cube([18.75, 2.5, 1.8]); 22 | translate([-6/2, -8.39, -1.8]) cube([6, 5, 1.8]); 23 | translate([-8/2, -8.39+(5-2.5)/2, -1.8]) cube([8, 2.5, 1.8]); 24 | } else { 25 | translate([-18/2, 0.25, -1.8]) cube([18, 7, 1.8]); 26 | } 27 | // Switch 28 | translate([0, 0, -1]) cylinder(1.4, d=4.1, $fn=12); 29 | translate([-5.35, 0, -1]) cylinder(1.4, d=2.3, $fn=12); 30 | translate([5.35, 0, -1]) cylinder(1.4, d=2.3, $fn=12); 31 | } 32 | 33 | module feet() { 34 | // Feet 35 | depth = 0.75; 36 | y_cmp = 210; 37 | translate([89.5, y_cmp-43.5, 0]) cylinder(depth, d=10); 38 | translate([106.4, y_cmp-134.5, 0]) cylinder(depth, d=10); 39 | translate([219, y_cmp-47.5, 0]) cylinder(depth, d=10); 40 | translate([219, y_cmp-114, 0]) cylinder(depth, d=10); 41 | } 42 | 43 | module base(low_profile = false) { 44 | thick = 2.2; 45 | 46 | translate([0, 0, 0]) color("blue", 0.2) { 47 | linear_extrude(0.1) import("lily58-B_Cu.svg", $fn=8); 48 | linear_extrude(0.1) import("lily58-F_Cu.svg", $fn=8); 49 | } 50 | 51 | difference() { 52 | if (tilted) { 53 | // Tilted 54 | difference() { 55 | translate([0, 0, -20]) bevel_extrude(20, bevel_depth=1, bottom=true, $fn=32) offset(0.1) import("lily58_BOTTOM-Frame.svg"); 56 | translate([15, 0, -25]) translate([80, 60, 0]) cube([150, 150, 20]); 57 | translate([0, 0, -45.7]) rotate([0, -6, 0]) translate([80, 60, 0]) cube([150, 150, 20]); 58 | } 59 | } else { 60 | // Flat 61 | difference() { 62 | translate([0, 0, -thick]) bevel_extrude(thick, bevel_depth=1, bottom=true, $fn=32) offset(0.1) import("lily58_BOTTOM-Frame.svg"); 63 | translate([0, 0, -thick]) feet(); 64 | } 65 | } 66 | y_cmp = 210; 67 | 68 | // Keys 69 | translate([101.4, y_cmp-97.5, 0]) slot_keepout(low_profile=low_profile); 70 | translate([105, y_cmp-127, 0]) rotate([0, 0, -60]) slot_keepout(low_profile=low_profile); 71 | translate([120.5, y_cmp-50, 0]) slot_keepout(low_profile=low_profile); 72 | translate([120.5, y_cmp-69.1, 0]) slot_keepout(low_profile=low_profile); 73 | translate([120.5, y_cmp-88.1, 0]) slot_keepout(low_profile=low_profile); 74 | translate([120.5, y_cmp-107.1, 0]) slot_keepout(low_profile=low_profile); 75 | translate([139.5, y_cmp-47.6, 0]) slot_keepout(low_profile=low_profile); 76 | translate([139.5, y_cmp-66.7, 0]) slot_keepout(low_profile=low_profile); 77 | translate([139.5, y_cmp-85.7, 0]) slot_keepout(low_profile=low_profile); 78 | translate([139.5, y_cmp-104.8, 0]) slot_keepout(low_profile=low_profile); 79 | translate([158.6, y_cmp-46.21, 0]) slot_keepout(low_profile=low_profile); 80 | translate([158.6, y_cmp-65.3, 0]) slot_keepout(low_profile=low_profile); 81 | translate([158.6, y_cmp-84.4, 0]) slot_keepout(low_profile=low_profile); 82 | translate([158.6, y_cmp-103.4, 0]) slot_keepout(low_profile=low_profile); 83 | translate([177.6, y_cmp-47.6, 0]) slot_keepout(low_profile=low_profile); 84 | translate([177.6, y_cmp-66.6, 0]) slot_keepout(low_profile=low_profile); 85 | translate([177.6, y_cmp-85.7, 0]) slot_keepout(low_profile=low_profile); 86 | translate([177.6, y_cmp-104.8, 0]) slot_keepout(low_profile=low_profile); 87 | translate([196.7, y_cmp-52.4, 0]) slot_keepout(low_profile=low_profile); 88 | translate([196.7, y_cmp-71.3, 0]) slot_keepout(low_profile=low_profile); 89 | translate([196.7, y_cmp-90.5, 0]) slot_keepout(low_profile=low_profile); 90 | translate([196.7, y_cmp-109.5, 0]) slot_keepout(low_profile=low_profile); 91 | translate([215.7, y_cmp-53.9, 0]) slot_keepout(low_profile=low_profile); 92 | translate([215.7, y_cmp-72.8, 0]) slot_keepout(low_profile=low_profile); 93 | translate([215.7, y_cmp-92, 0]) slot_keepout(low_profile=low_profile); 94 | translate([215.7, y_cmp-111, 0]) slot_keepout(low_profile=low_profile); 95 | translate([130, y_cmp-126, 0]) slot_keepout(low_profile=low_profile); 96 | translate([149, y_cmp-123.75, 0]) slot_keepout(low_profile=low_profile); 97 | translate([168.1, y_cmp-123.75, 0]) slot_keepout(low_profile=low_profile); 98 | 99 | // Diodes 100 | diode_thick = 1.4; 101 | translate([114.5, y_cmp-61+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 6, diode_thick], center=true); 102 | translate([135.3, y_cmp-60.2+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 3, diode_thick], center=true); 103 | translate([134.3, y_cmp-57.2+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 3, diode_thick], center=true); 104 | translate([152.6, y_cmp-57.4+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 6, diode_thick], center=true); 105 | translate([171.5, y_cmp-58.7+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 6, diode_thick], center=true); 106 | translate([190.6, y_cmp-63.3+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 6, diode_thick], center=true); 107 | translate([221.8, y_cmp-64.9+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 6, diode_thick], center=true); 108 | translate([0, -38.1, 0]) { 109 | translate([114.5, y_cmp-61+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 6, diode_thick], center=true); 110 | translate([135.3, y_cmp-60.2+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 3, diode_thick], center=true); 111 | translate([134.3, y_cmp-57.2+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 3, diode_thick], center=true); 112 | translate([152.6, y_cmp-57.4+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 6, diode_thick], center=true); 113 | translate([171.5, y_cmp-58.7+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 6, diode_thick], center=true); 114 | translate([190.6, y_cmp-63.3+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 6, diode_thick], center=true); 115 | translate([221.8, y_cmp-64.9+1.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 6, diode_thick], center=true); 116 | } 117 | translate([123.9, y_cmp-118, 0]) translate([0, 0, -diode_thick/2]) cube([6, 3, diode_thick], center=true); 118 | translate([142.9, y_cmp-115.8, 0]) translate([0, 0, -diode_thick/2]) cube([6, 3, diode_thick], center=true); 119 | translate([162, y_cmp-115.8, 0]) translate([0, 0, -diode_thick/2]) cube([6, 3, diode_thick], center=true); 120 | translate([109.8, y_cmp-119.3, 0]) rotate([0, 0, -60]) translate([0, 0, -diode_thick/2]) cube([6, 3, diode_thick], center=true); 121 | translate([105.6, y_cmp-89.5, 0]) translate([0, 0, -diode_thick/2]) cube([6, 3, diode_thick], center=true); 122 | 123 | // Controller 124 | //translate([91, y_cmp-71.8, -1.75]) cube([19, 32, 3]); // Controller 125 | translate([91 + (19-3.75), y_cmp-71.8, -1.75]) cube([3.75, 32, 3]); // Controller 126 | translate([91, y_cmp-71.8, -1.75]) cube([3.75, 32, 3]); // Controller 127 | translate([83.5, y_cmp-72.5, -1.75+0.4]) cube([3, 9.5, 3]); // Reset 128 | //translate([83.25, y_cmp-50.8, -1.5]) cube([7.5, 9.4, 3]); // Audio 129 | //translate([85, y_cmp-52.3, -1.5]) cube([4, 2.5, 3]); // Audio 130 | //translate([85.4, y_cmp-48.55, -0.75]) cube([3.25, 8.5, 3]); // Audio 131 | translate([95, y_cmp-76, -1.75]) cube([11, 3, 3]); // OLED 132 | 133 | // Cover 134 | translate([108, y_cmp-85, 0]) bolt(); 135 | translate([86, y_cmp-85, 0]) bolt(); 136 | 137 | // Bolts 138 | translate([105, y_cmp-114.8, 0]) bolt(); 139 | translate([129.6, y_cmp-59.6, 0]) bolt(); 140 | translate([129.6, y_cmp-97.6, 0]) bolt(); 141 | translate([205.8, y_cmp-61.8, 0]) bolt(); 142 | translate([205.8, y_cmp-100, 0]) bolt(); 143 | } 144 | } 145 | 146 | base(low_profile=low_profile); 147 | // Correction: 0% infill, PETG, Rev 1 148 | //scale([1.007, 1.007, 1.007]) base(low_profile=low_profile); 149 | //scale(1.007, 1.007) base(); 150 | // Correction: 0% infill, PETG 151 | //scale([1.004, 1.004, 0.004]) base(); 152 | -------------------------------------------------------------------------------- /lily58_BOTTOM-Edge_Cuts.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 38 | SVG Picture created as Lily58_Pro_BOTTOM-Edge_Cuts.svg date 2022/01/16 15:12:18 40 | Picture generated by PCBNEW 42 | 46 | 50 | 54 | 58 | 62 | 66 | 70 | 74 | 78 | 82 | 86 | 90 | 94 | 98 | 102 | 106 | 110 | 114 | 118 | 122 | 126 | 130 | 134 | 138 | 142 | 146 | 150 | 154 | 158 | 162 | 166 | 170 | 174 | 178 | 182 | 186 | 190 | 194 | 198 | 202 | 206 | 210 | 214 | 218 | 222 | 226 | 230 | 234 | 238 | 242 | 246 | 250 | 254 | 258 | 262 | 266 | 270 | 274 | 278 | 282 | 286 | 290 | 294 | 298 | 302 | 306 | 310 | 314 | 318 | 322 | 326 | 330 | 334 | 338 | 342 | 346 | 350 | 354 | 358 | 362 | 366 | 370 | 374 | 378 | 382 | 386 | 390 | 394 | 398 | 402 | 406 | 410 | 414 | 418 | 422 | 426 | 430 | 434 | 438 | 442 | 446 | 450 | 454 | 458 | 462 | 466 | 470 | 474 | 478 | 482 | 486 | 490 | 494 | 498 | 502 | 506 | 510 | 514 | 518 | 522 | 525 | 528 | 531 | 534 | 537 | 540 | 542 | 543 | 545 | SVG Picture created as Lily58_Pro_BOTTOM-Edge_Cuts.svg date 2022/01/16 15:12:18 546 | 547 | 548 | 549 | 550 | -------------------------------------------------------------------------------- /lily58_BOTTOM-Frame.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 24 | 25 | 44 | SVG Picture created as Lily58_Pro_BOTTOM-Edge_Cuts.svg date 2022/01/16 15:12:18 46 | Picture generated by PCBNEW 48 | 52 | 56 | 60 | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | 256 | 260 | 264 | 268 | 272 | 276 | 280 | 284 | 288 | 292 | 296 | 300 | 304 | 308 | 312 | 316 | 320 | 324 | 328 | 332 | 336 | 340 | 344 | 348 | 352 | 356 | 360 | 364 | 368 | 372 | 376 | 380 | 384 | 388 | 392 | 396 | 400 | 404 | 408 | 412 | 416 | 420 | 424 | 428 | 432 | 436 | 440 | 444 | 448 | 452 | 456 | 460 | 464 | 468 | 472 | 476 | 480 | 484 | 488 | 492 | 496 | 500 | 504 | 508 | 512 | 516 | 520 | 524 | 528 | 531 | 534 | 537 | 540 | 543 | 546 | 548 | 549 | 551 | SVG Picture created as Lily58_Pro_BOTTOM-Edge_Cuts.svg date 2022/01/16 15:12:18 552 | 553 | 554 | 555 | 561 | 562 | -------------------------------------------------------------------------------- /lily58_TOP-Edge_Cuts.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | SVG Picture created as Lily58_Pro_TOP-Edge_Cuts.svg date 2021/12/30 12:46:19 11 | Picture generated by PCBNEW 12 | 15 | 16 | 19 | 22 | 25 | 28 | 31 | 34 | 37 | 40 | 43 | 46 | 49 | 52 | 55 | 58 | 61 | 64 | 67 | 70 | 73 | 76 | 79 | 82 | 85 | 88 | 91 | 94 | 97 | 100 | 103 | 106 | 109 | 112 | 115 | 118 | 121 | 124 | 127 | 130 | 133 | 136 | 139 | 142 | 145 | 148 | 151 | 154 | 157 | 160 | 163 | 166 | 169 | 172 | 175 | 178 | 181 | 184 | 187 | 188 | 191 | 192 | 193 | 196 | 197 | 200 | 203 | 206 | 209 | 212 | 213 | 216 | 217 | 218 | 221 | 222 | 225 | 228 | 231 | 234 | 237 | 238 | 241 | 242 | 243 | 246 | 247 | 250 | 253 | 256 | 259 | 262 | 263 | 266 | 267 | 268 | 271 | 272 | 275 | 278 | 281 | 284 | 287 | 288 | 291 | 292 | 293 | 296 | 297 | 300 | 303 | 306 | 309 | 312 | 313 | 316 | 317 | 318 | 321 | 322 | 325 | 328 | 331 | 334 | 337 | 338 | 341 | 342 | 343 | 346 | 347 | 350 | 353 | 356 | 359 | 362 | 363 | 366 | 367 | 368 | 371 | 372 | 375 | 378 | 381 | 384 | 387 | 388 | 391 | 392 | 393 | 396 | 397 | 400 | 403 | 406 | 409 | 412 | 413 | 416 | 417 | 418 | 421 | 422 | 425 | 428 | 431 | 434 | 437 | 438 | 441 | 442 | 443 | 446 | 447 | 450 | 453 | 456 | 459 | 462 | 463 | 466 | 467 | 468 | 471 | 472 | 475 | 478 | 481 | 484 | 487 | 488 | 491 | 492 | 493 | 496 | 497 | 500 | 503 | 506 | 509 | 512 | 513 | 516 | 517 | 518 | 521 | 522 | 525 | 528 | 531 | 534 | 537 | 538 | 541 | 542 | 543 | 546 | 547 | 550 | 553 | 556 | 559 | 562 | 565 | 568 | 571 | 574 | 577 | 580 | 583 | 586 | 589 | 592 | 595 | 598 | 601 | 604 | 607 | 610 | 613 | 616 | 619 | 622 | 625 | 628 | 631 | 634 | 637 | 640 | 643 | 646 | 649 | 652 | 655 | 658 | 661 | 664 | 667 | 670 | 673 | 676 | 679 | 682 | 685 | 688 | 691 | 694 | 697 | 700 | 703 | 706 | 709 | 712 | 715 | 718 | 719 | 722 | 723 | 724 | 727 | 728 | 731 | 734 | 737 | 738 | 741 | 742 | 743 | 746 | 747 | 750 | 753 | 754 | 757 | 758 | 759 | 762 | 763 | 766 | 769 | 772 | 775 | 778 | 779 | 782 | 783 | 784 | 787 | 788 | 791 | 794 | 797 | 800 | 801 | 804 | 805 | 806 | 809 | 810 | 813 | 816 | 819 | 822 | 825 | 828 | 829 | 832 | 833 | 834 | 837 | 838 | 841 | 844 | 847 | 850 | 853 | 854 | 857 | 858 | 859 | 862 | 863 | 866 | 869 | 872 | 875 | 878 | 879 | 882 | 883 | 884 | 887 | 888 | 891 | 894 | 897 | 900 | 903 | 904 | 907 | 908 | 909 | 912 | 913 | 916 | 919 | 922 | 925 | 928 | 931 | 934 | 937 | 940 | 943 | 946 | 949 | 952 | 955 | 958 | 961 | 964 | 967 | 970 | 973 | 976 | 979 | 982 | 985 | 988 | 991 | 994 | 997 | 1000 | 1003 | 1004 | 1007 | 1008 | 1009 | 1012 | 1013 | 1016 | 1019 | 1022 | 1025 | 1028 | 1031 | 1034 | 1035 | 1038 | 1039 | 1040 | 1043 | 1044 | 1047 | 1050 | 1053 | 1056 | 1059 | 1062 | 1065 | 1068 | 1071 | 1074 | 1077 | 1080 | 1083 | 1086 | 1089 | 1092 | 1095 | 1098 | 1101 | 1104 | 1107 | 1110 | 1113 | 1116 | 1119 | 1122 | 1125 | 1128 | 1131 | 1134 | 1137 | 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 1146 | 1147 | 1148 | 1149 | 1150 | 1151 | -------------------------------------------------------------------------------- /lily58_TOP-B_Cu.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 38 | SVG Picture created as Lily58_Pro_TOP-B_Cu.svg date 2021/12/30 15:27:34 40 | Picture generated by PCBNEW 42 | 45 | 50 | 51 | 54 | 59 | 60 | 63 | 68 | 69 | 72 | 77 | 78 | 81 | 86 | 87 | 90 | 93 | 94 | 97 | 102 | 107 | 108 | 111 | 114 | 117 | 120 | 123 | 126 | 129 | 132 | 135 | 138 | 141 | 144 | 147 | 150 | 153 | 156 | 159 | 162 | 165 | 168 | 171 | 174 | 177 | 180 | 183 | 186 | 189 | 192 | 195 | 198 | 201 | 204 | 207 | 210 | 213 | 216 | 219 | 222 | 225 | 228 | 231 | 234 | 237 | 240 | 243 | 246 | 249 | 252 | 255 | 258 | 261 | 264 | 267 | 270 | 273 | 276 | 279 | 282 | 285 | 288 | 289 | 292 | 297 | 298 | 301 | 304 | 307 | 310 | 313 | 314 | 317 | 322 | 323 | 326 | 329 | 332 | 335 | 338 | 339 | 342 | 347 | 348 | 351 | 354 | 357 | 360 | 363 | 364 | 367 | 372 | 373 | 376 | 379 | 382 | 385 | 388 | 389 | 392 | 397 | 398 | 401 | 404 | 407 | 410 | 413 | 414 | 417 | 422 | 423 | 426 | 429 | 432 | 435 | 438 | 441 | 444 | 447 | 448 | 451 | 456 | 457 | 460 | 463 | 466 | 469 | 472 | 473 | 476 | 481 | 482 | 485 | 488 | 491 | 494 | 497 | 498 | 501 | 506 | 507 | 510 | 513 | 516 | 519 | 522 | 523 | 526 | 531 | 532 | 535 | 538 | 541 | 544 | 547 | 548 | 551 | 556 | 557 | 560 | 563 | 566 | 569 | 572 | 573 | 576 | 581 | 582 | 585 | 588 | 591 | 594 | 597 | 598 | 601 | 606 | 607 | 610 | 613 | 616 | 619 | 622 | 623 | 626 | 631 | 632 | 635 | 638 | 641 | 644 | 647 | 650 | 653 | 656 | 659 | 662 | 665 | 668 | 671 | 674 | 677 | 680 | 683 | 686 | 689 | 692 | 695 | 698 | 701 | 704 | 707 | 710 | 713 | 716 | 719 | 722 | 725 | 728 | 731 | 734 | 737 | 740 | 743 | 746 | 749 | 752 | 755 | 758 | 761 | 764 | 767 | 770 | 773 | 776 | 779 | 782 | 785 | 788 | 791 | 794 | 797 | 800 | 803 | 804 | 807 | 812 | 813 | 816 | 819 | 820 | 823 | 828 | 829 | 832 | 835 | 836 | 839 | 844 | 845 | 848 | 851 | 854 | 857 | 860 | 863 | 864 | 867 | 872 | 873 | 876 | 879 | 882 | 885 | 888 | 891 | 892 | 895 | 900 | 901 | 904 | 907 | 910 | 913 | 916 | 917 | 920 | 925 | 926 | 929 | 932 | 935 | 938 | 941 | 942 | 945 | 950 | 951 | 954 | 957 | 960 | 963 | 966 | 967 | 970 | 975 | 976 | 979 | 982 | 985 | 988 | 991 | 994 | 997 | 1000 | 1003 | 1006 | 1009 | 1012 | 1015 | 1018 | 1021 | 1024 | 1027 | 1030 | 1033 | 1036 | 1039 | 1042 | 1045 | 1048 | 1051 | 1054 | 1057 | 1060 | 1063 | 1066 | 1067 | 1070 | 1075 | 1076 | 1079 | 1082 | 1085 | 1088 | 1091 | 1094 | 1097 | 1098 | 1101 | 1106 | 1107 | 1110 | 1113 | 1116 | 1119 | 1122 | 1125 | 1128 | 1131 | 1134 | 1137 | 1140 | 1143 | 1146 | 1149 | 1152 | 1155 | 1158 | 1161 | 1164 | 1167 | 1170 | 1173 | 1176 | 1179 | 1182 | 1185 | 1188 | 1191 | 1194 | 1197 | 1200 | 1202 | 1204 | 1206 | 1208 | 1210 | 1212 | 1213 | 1215 | 1216 | 1218 | SVG Picture created as Lily58_Pro_TOP-B_Cu.svg date 2021/12/30 15:27:34 1219 | 1220 | 1221 | 1222 | 1223 | --------------------------------------------------------------------------------