--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="35.121284mm"
+ width="65.58564mm"
+ viewBox="0 0 232.39006 124.44549"
+ id="svg3226"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="cleaver.svg">
+ <title
+ id="title3252">Cleaver</title>
+ <defs
+ id="defs3232" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1366"
+ inkscape:window-height="712"
+ id="namedview3230"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="0.49406706"
+ inkscape:cx="-240.01238"
+ inkscape:cy="-71.123713"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg3226" />
+ <metadata
+ id="metadata3228">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Cleaver</dc:title>
+ <dc:date>2017-03-25</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Algot Runeman</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title>Algot Runeman</dc:title>
+ </cc:Agent>
+ </dc:rights>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>runeman.org</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:identifier>cleaver.svg</dc:identifier>
+ <cc:license
+ rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="g3203"
+ transform="matrix(0.42056397,0.24281273,-0.24281273,0.42056397,402.31684,-0.91434781)"
+ inkscape:export-xdpi="116.18397"
+ inkscape:export-ydpi="116.18397">
+ <path
+ id="path3188"
+ d="m -640,372.36133 c -17.08893,36.24441 -18.75546,87.9112 -20,140 l 280,0 0,-100 160,0 20,0 20,-20 -20,-20 -20,0 -160,0 -260,0 z m 13.88086,9.875 a 10.004855,10.004855 0 0 1 10.00391,10.00586 10.004855,10.004855 0 0 1 -10.00391,10.0039 10.004855,10.004855 0 0 1 -10.00586,-10.0039 10.004855,10.004855 0 0 1 10.00586,-10.00586 z"
+ style="fill:#cccccc;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path3190"
+ d="m -660,486.3622 c 90.62306,13.55138 183.97959,13.43541 280,0 l 0,26 c -93.33333,13.43541 -186.66667,13.55138 -280,0 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccsssc"
+ inkscape:connector-curvature="0"
+ id="path3192"
+ d="m -380,372.3622 0,40 c 0,0 124.56723,22.96101 180,0 8.71042,-3.60797 20,-10.57191 20,-20 0,-9.42809 -11.28958,-16.39203 -20,-20 -55.43277,-22.96101 -180,0 -180,0 z"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <circle
+ r="4.8780489"
+ cy="392.36221"
+ cx="-350.34396"
+ id="path3194"
+ style="opacity:0.75;fill:#ffff00;fill-opacity:1;stroke:#b3b3b3;stroke-width:0.24390243;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <circle
+ style="opacity:0.75;fill:#ffff00;fill-opacity:1;stroke:#b3b3b3;stroke-width:0.24390243;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle3196"
+ cx="-280.34396"
+ cy="392.36221"
+ r="4.8780489" />
+ <circle
+ r="4.8780489"
+ cy="392.36221"
+ cx="-206.34396"
+ id="circle3198"
+ style="opacity:0.75;fill:#ffff00;fill-opacity:1;stroke:#b3b3b3;stroke-width:0.24390243;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
--- /dev/null
+Original cleaver SVG is from https://openclipart.org/detail/278407/meat-cleaver (public domain)
\ No newline at end of file
--- /dev/null
+rotate ([0, 0, 120]) linear_extrude (2.5) import ("1492890647.svg");
// Defaults have no tolerance, should be printed using flexible
// filament for a snug fit
-module holder (battery_d = 20, battery_h = 3.2, case_wall = 1.7, slot_undersize = 0.4, wire_d = 1.2, cover_pct = 0.4) {
+module holder (battery_d = 20, battery_h = 3.2, case_wall = 1.7, slot_undersize = 0.4, wire_d = 1.5, cover_pct = 0.4) {
battery_h = battery_h - slot_undersize;
case_d = battery_d + case_wall*2;
--- /dev/null
+// Super simple hook
+// Intended for hanging a power strip from the top of a metal pegboard
+
+// vertical and horizontal pieces
+
+// actual measurements of board + power strip
+/* v0_len = 47.5 - 10; */
+/* v1_len = 47.5; */
+/* v2_len = 42.5; */
+
+/* h0_len = 26.75; */
+/* h1_len = 35.25; */
+/* h2_len = 35.25; */
+
+v0_len = 47.5 - 10;
+v1_len = 47.5;
+v2_len = 42.5;
+
+h0_len = 26.75;
+h1_len = 10;
+h2_len = 35.25;
+
+thickness = 0.45 * 6; // four perimeters on prusa mini with 0.4mm nozzle
+width = 15; // my power strip has a 20mm wide area where the hook could go
+fillet = 0; // doesn't quite work, affects internal dimensions
+
+$fa = 1;
+$fs = 0.5;
+linear_extrude (width) {
+ offset (r = -fillet) offset (r = +fillet) union () {
+ square ([thickness, v0_len]); //v0
+ translate ([0, v0_len]) square ([h0_len + thickness * 2, thickness]); //h0
+ translate ([h0_len + thickness, v0_len - v1_len]) square ([thickness, v1_len]); // v1
+ translate ([h0_len + thickness, v0_len - v1_len - thickness]) square ([h2_len + thickness * 2, thickness]); //h2
+ translate ([h0_len + h2_len + thickness * 2, v0_len - v1_len]) square ([thickness, v2_len]); //v2
+ translate ([h0_len + h2_len + thickness * 2 - h1_len, v0_len - v1_len + v2_len]) square ([h1_len + thickness, thickness]); //h1
+ }
+}
+
// length = 73
// max depth = 25
+// fixme: needs to be 72 I think
clip_gap = 73.5;
-clip_wall = 3;
+clip_wall = 4; // was 3, beefed up a bit after first pair broke
clip_depth = 20;
clip_width = 5;
hook = true;
hook_depth = 6;
-hook_wall = clip_wall;
+hook_wall = 3; // limited by size of rear output tray slots
$fs = 0.1;
$fa = 0.1;
slot_depth = 20;
// Offset for leg slot into the base
slot_offset = -1;
+// Enable/disable base
+base_enabled = true;
$fs = 0.1;
module base () {
side = slot_length + slot_thickness/2;
- offset (r = wall_thickness) polygon ([ [0, 0], [ side , 0], [0, side] ]);
+ if (base_enabled) {
+ offset (r = wall_thickness) polygon ([ [0, 0], [ side , 0], [0, side] ]);
+ } else {
+ walls ();
+ }
}
module walls () {
square ([slot_thickness, slot_length + slot_thickness/2]);
square ([slot_length + slot_thickness/2, slot_thickness]);
}
- base ();
+ if (base_enabled) { base (); }
}
}
--- /dev/null
+** Dependencies
+
+Requires https://justinsdk.github.io/dotSCAD/ installed in your
+library folder (~/.local/share/OpenSCAD/libraries/dotscad)
+
+** Customizing
+
+The built-in customizer in openscad can be used to easily tweak
+settings. A few presets that I used are included.
+
+** Print orientation
+
+Use Cura or Slic3r "align to face" feature to lay the mouth of the
+horn on the print bed.
+
+** Print Settings
+
+Intended to be printed hollow:
+
+ - 0 bottom layers
+ - 0 top layers
+ - 0% infill
+ - 0.2mm or lower layer height
+
+Did not have great luck with vase mode @ 0.2mm layer height (overhang
+near end of horn was too great and there were gaps), but might be
+worth a shot at 0.1mm.
+
+*** PETG
+
+Using a prusa mini with a 0.4mm nozzle @ 0.2mm layer height, I needed
+six perimeters to make the horn watertight. Also needed to make the
+final 10-15mm of the horn solid.
+
+** Guidance on making model watertight
+
+ - https://blog.prusaprinters.org/watertight-3d-printing-pt1-vases-cups-and-other-open-models_48949/
\ No newline at end of file
--- /dev/null
+{
+ "parameterSets": {
+ "flatter mouth": {
+ "bottom_radius": "4",
+ "horn_aspect": "[1, 0.92]",
+ "horn_length": "135",
+ "horn_rise": "25",
+ "horn_twist": "0",
+ "top_radius": "30"
+ },
+ "twisty": {
+ "bottom_radius": "4",
+ "horn_aspect": "[1, 0.92]",
+ "horn_length": "135",
+ "horn_rise": "30",
+ "horn_twist": "120",
+ "top_radius": "35"
+ },
+ "round horn": {
+ "bottom_radius": "4",
+ "horn_aspect": "[1, 1]",
+ "horn_length": "135",
+ "horn_rise": "25",
+ "horn_twist": "0",
+ "top_radius": "30"
+ }
+ },
+ "fileFormatVersion": "1"
+}
--- /dev/null
+// Simple 3D Printable Drinking Horn
+// Copyright (c) 2021 Clinton Ebadi <clinton@unknownlamer.org>
+
+
+// Released under the https://wiki.creativecommons.org/wiki/CC0
+// To the extent possible under law, Clinton Ebadi has waived all
+// copyright and related or neighboring rights to Simple 3D Printable Drinking Horn.
+
+// Single person mead horn, for winter solstice 2021 since sharing
+// mead from the real horn is probably still unsafe.
+
+use <dotscad/shape_circle.scad>;
+use <dotscad/helix_extrude.scad>;
+
+bottom_radius = 4;
+top_radius = 33;
+horn_length = 135;
+horn_rise = 40;
+horn_twist = 0;
+horn_aspect = [ 1.0, 0.92 ]; // [0:0.01:100]
+
+module helix_horn () {
+ helix_levels = 1/6;
+
+ arc_measure = (360 * helix_levels) * (3.13 / 180);
+ arc_length = horn_length;
+ helix_radius = (arc_length / arc_measure);
+
+ // Round off end
+ // todo: dotscad rounded cone instead?
+ translate ([helix_radius, 0, 0]) scale ([horn_aspect[0], 1/2, horn_aspect[1]]) intersection () {
+ sphere (r = bottom_radius);
+ rotate ([90, 0, 0]) cylinder (h = bottom_radius, r = bottom_radius, center=false);
+ }
+
+ shape_pts = [ for (pts = shape_circle (radius = bottom_radius)) [ pts[0] * horn_aspect[0], pts[1] * horn_aspect[1] ] ];
+
+ helix_extrude(shape_pts,
+ radius = helix_radius,
+ scale = top_radius/bottom_radius,
+ levels = helix_levels,
+ level_dist = horn_rise / helix_levels,
+ vt_dir = "SPI_UP",
+ twist = horn_twist / helix_levels
+ );
+}
+
+helix_horn ($fs = 0.1, $fa = 1);
base_diameter = 30;
base_height = 16.2;
bulb_diameter = 9;
+// Built in sacrificial support layer
+tea_light_support = true;
+tea_light_support_thickness = 0.3;
/* [Hidden] */
$fs=0.1;
}
// sacrificial support layer, subtracted since this will be
// subtracted from the ghost body
- translate ([0, 0, base_height+0.7]) #cylinder (d=base_diameter+2, h=0.3);
+ if (tea_light_support) {
+ translate ([0, 0, base_height+(1 - tea_light_support_thickness)])
+ #cylinder (d=base_diameter+2, h=tea_light_support_thickness);
+ }
}
-
}
module pacguy () {