diff --git a/ChineseHotEnd.scad b/ChineseHotEnd.scad new file mode 100644 index 0000000..adcdb5f --- /dev/null +++ b/ChineseHotEnd.scad @@ -0,0 +1,29 @@ +module grooveRing(spread) { +radGroove = 12.1/2; +widthGroove = 4.5; + #difference() { + cylinder(h=widthGroove+1.6*spread+1*0,r=10,$fn=24); + translate([0,0,-.1]) cylinder(h=6,r=radGroove+spread*0.6,$fn=32); + } +} + +module ChineseHotEnd() { +spread = 0.2*0; +radCyl = 16.12/2; +widthCap = 5.1; +heightNut = 8.5; +diamNut = 10; +radNutEdges = 11.7/2; // tips of hexagons used for $fn=6 cyl, not face diam + difference() { + union() { + translate([0,0,-widthCap-spread]) { + cylinder(h=40+spread,r=radCyl+spread,$fn=48); + translate([0,0,-heightNut-.5]) cylinder(h=9.9,r=radNutEdges+1.0*spread,$fn=6); + } + + } + translate([0,0,spread]) grooveRing(spread); + } +} + +ChineseHotEnd(); diff --git a/Makefile b/Makefile index fdc6d69..c4387da 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,9 @@ effector.stl retractable.stl power_supply.stl extruder.stl frame_extruder.stl \ glass_frame.stl m5_internal.stl plate_3x.stl plate_1x.stl \ switch_holder.stl hotend_fan.stl +aaronGcode: frame_top.gcode frame_motor.gcode carriage.gcode \ + extruder.gcode effector.gcode + .SECONDARY: # Explicit wildcard expansion suppresses errors when no files are found. @@ -15,7 +18,7 @@ include $(wildcard *.deps) openscad -m make -d $*.deps -o $@ $< %.gcode: %.stl - slic3r -o $@ $< + slic3r --load QuelabKosselConfig.ini -o $@ $< # Replace tabs with spaces. %.tab: %.scad diff --git a/QuelabKosselConfig.ini b/QuelabKosselConfig.ini new file mode 100644 index 0000000..8aaad28 --- /dev/null +++ b/QuelabKosselConfig.ini @@ -0,0 +1,114 @@ +# generated by Slic3r 0.9.10b on Mon Mar 31 08:54:58 2014 +avoid_crossing_perimeters = 0 +bed_size = 195,195 +bed_temperature = 0 +bottom_solid_layers = 3 +bridge_acceleration = 0 +bridge_fan_speed = 100 +bridge_flow_ratio = 1 +bridge_speed = 35 +brim_width = 0 +complete_objects = 0 +cooling = 1 +default_acceleration = 0 +disable_fan_first_layers = 1 +duplicate = 1 +duplicate_distance = 6 +duplicate_grid = 1,1 +end_gcode = G1 X12.0 F4000 ; home (almost) x - stops extruder crashing into frame if at very top of Z height\nG28 Y0 ; move the print to the front.\nM84 ; disable motors\nM104 S0 ; extruder heater off\nM140 S0 ; bed heater off +external_perimeter_speed = 70% +external_perimeters_first = 0 +extra_perimeters = 1 +extruder_clearance_height = 20 +extruder_clearance_radius = 20 +extruder_offset = 0x0 +extrusion_axis = E +extrusion_multiplier = .82 +extrusion_width = 0 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_diameter = 1.75 +fill_angle = 45 +fill_density = 0.4 +fill_pattern = honeycomb +first_layer_bed_temperature = 0 +first_layer_extrusion_width = 0 +first_layer_height = 0.30 +first_layer_speed = 20% +first_layer_temperature = 0 +g0 = 0 +gap_fill_speed = 20 +gcode_arcs = 0 +gcode_comments = 0 +gcode_flavor = reprap +infill_acceleration = 0 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0 +infill_first = 0 +infill_only_where_needed = 0 +infill_speed = 70 +layer_gcode = +layer_height = 0.35 +max_fan_speed = 100 +min_fan_speed = 35 +min_print_speed = 10 +min_skirt_length = 0 +notes = +nozzle_diameter = 0.5 +only_retract_when_crossing_perimeters = 0 +output_filename_format = [input_filename_base].gcode +perimeter_acceleration = 0 +perimeter_extruder = 1 +perimeter_extrusion_width = 0 +perimeter_speed = 60 +perimeters = 3 +post_process = +print_center = 97.5,97.5 +raft_layers = 0 +randomize_start = 0 +resolution = 0 +retract_before_travel = 10 +retract_layer_change = 1 +retract_length = 1.2 +retract_length_toolchange = 3 +retract_lift = .05 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 18 +rotate = 0 +scale = 1 +skirt_distance = 6 +skirt_height = 1 +skirts = 2 +slowdown_below_layer_time = 15 +small_perimeter_speed = 30 +solid_fill_pattern = rectilinear +solid_infill_below_area = 50 +solid_infill_every_layers = 0 +solid_infill_extrusion_width = 0 +solid_infill_speed = 60 +spiral_vase = 0 +start_gcode = G28 ; home all axes +support_material = 1 +support_material_angle = 45 +support_material_enforce_layers = 0 +support_material_extruder = 1 +support_material_extrusion_width = 0 +support_material_interface_layers = 0 +support_material_interface_spacing = 0 +support_material_pattern = honeycomb +support_material_spacing = 1.8 +support_material_speed = 60 +support_material_threshold = 40 +temperature = 0 +threads = 5 +toolchange_gcode = +top_infill_extrusion_width = 0 +top_solid_infill_speed = 30 +top_solid_layers = 3 +travel_speed = 135 +use_relative_e_distances = 0 +vibration_limit = 0 +wipe = 0 +z_offset = 0 diff --git a/README.md b/README.md index 060561f..c64874b 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,24 @@ Release status ============== -Most of these parts are now stable and won't change much more. +These are Mr-What's tweaks to Johann's mini-kossel drawings +circa Feb. 2014. +The main changes are: -How to print Mini Kossel -======================== + * Attach the carriage to a base that can mount Delrin wheels + that ride directly on the extrusion, instead of the + linear bearing rails. -* 3x plate_3x.stl (about 3x80g = 240g of plastic) -* 1x plate_1x.stl (about 50g of plastic) + * Added support material to make printing easier on Quelab's + public RepRap printer (Hackerspace in Albuquerque, NM) + + * Simplified some parts. + + * Changed effector head to carry a different shaped hot-end. + + * Attempting to use pressure sensors on top of the NEMA-17 motors + instead of the probe. This will require new, very tight tolerance + print bed mounts. Links ===== @@ -16,28 +27,13 @@ Links * Mailing list: http://groups.google.com/group/deltabot * Project history: http://deltabot.tumblr.com -Pay it forward -============== - -Johann is offering free printed parts for Mini Kossel: - -* I'm going to make some Mini Kossel printed parts kits. -* I'm going to give them away for free (as in beer). -* Some kits may include some non-printed parts. -* Free international shipping is included. -* No delivery schedule, maybe only one kit per month. - -But there's no such thing as a free lunch. If you want to receive a -free kit, you must swear by your geek honor: - -* To complete your Mini Kossel and tune it well. -* To print two (2) Mini Kossel kits and also give them away for free. -* To make your recipients agree to the same rule. +Upstream Project +================ -After giving away the 2 free kits, you may sell printed parts for any -price you want. +Johann offers some free printed parts, on the condition that +once you get a printer working, you give away two (2) sets +of free parts to others. After that, you are free to sell +printed parts. -If you're interested, please email johann@rocholl.net and let me know -your favorite PLA color and mailing address. If you want to get your -printed parts first, explain why you're more qualified than others to -start giving away high quality printed parts soon. +See Johann's main source project for more details. + https://github.com/jcrocholl/kossel diff --git a/basePlate.scad b/basePlate.scad new file mode 100644 index 0000000..d2d2804 --- /dev/null +++ b/basePlate.scad @@ -0,0 +1,84 @@ +// complete top (bottom) assembly, fused with vertexB drawing. +// take a slice of this to generate DXF drawing for laser cut + +use ; + +m3rad = 2.94/2-.1; +vertexTrad = 181.3; // radius for vertical extrusion centers +extTrad = 109.6; // radius for horiz extrusion centers + +fuzz = -0.1; // fuzz (contraction) for laser cut holes + +slop = 0.3; // extra fuzz to add for slop in mounts + +//projection(cut=true) +translate([0,0,-0.2]) { + difference() { + union() { + for (a=[0,120,240]) { + rotate([0,0,a ]) translate([0,-vertexTrad,-1]) vertexCframe(5,fuzz+slop,motorHole=true); + // dialte a bit to make parts fuse. + // initial numbers are close to exact + rotate([0,0,a-30]) translate([extTrad-.295,0,5]) + cube([15+.5,300+1,15],center=true); + + // this should allow us to draw both the motor shaft area, + // and have an island drawing the idler holder holes. + // delete whichever one(s) you do not want on LaserCut + rotate([0,0,a]) translate([0,-vertexTrad+32,-2]) + hull() for(b=[-1,1]) translate([17*b,0,0]) + cylinder(r=7,h=9,$fn=48); + } + + hull() { + for (a=[0,120,240]) rotate([0,0,a]) + translate([0,-64,-1]) cylinder(h=6,r=85,$fn=6); + } + } + + // drill more holes in plate + translate([0,0,-1]) { + + // drill edge holes -- these can use extra slop + for(a=[0,120,240]) rotate([0,0,a]) translate([0,extTrad,-4]) + for (b=[-140:70:140]) translate([b,0,0]) m3hole(22,fuzz+.15+slop); + + // holes for belt tensioner idler + // should be 22mm in from front of 20mm extrusion + // for frogCarriage20v, using openbuilds wheel kit with spacer + %translate([0,-vertexTrad+10+11,4]) cube([2*12,22,5],center=true); // diagnostic for spacing from extrusion + for (a=[30,150,270]) rotate([0,0,a]) + for(b=[-1,1]) translate([vertexTrad-32,12*b,-3]) + cylinder(r=m3rad+.1,h=27,$fn=11); + + if (1) { + // decorative holes + translate([0,0,-1]) cylinder(r=35,h=17,$fn=120); + for(d=[0,60,120,180,240,300]) + rotate([0,0,d]) translate([75,0,-1]) + cylinder(r=30,h=17,$fn=96); + + for(d=[30,150,270]) rotate([0,0,d]) + translate([118,0,-1]) + hull() for(a=[-1,1]) translate([0,a*30,0]) + cylinder(r=12,h=17,$fn=80); + + for(d=[30,90,150,210,270,330]) rotate([0,0,d]) + translate([90,0,-1]) cylinder(r=8,h=17,$fn=60); + + //for(d=[30,150,270]) for (a=[-1,1]) rotate([0,0,d+a*24]) + // translate([118,0,-2]) cylinder(r=8,h=17,$fn=60); + + } else { + // a big ring might be better for under print bed + //cylinder(r=90,h=18,$fn=120); + } + + } + + } +} + +////%translate([-350/2,130,0]) cube([350,20,20]); +//%translate([0,0,20]) cylinder(r=9*25.4/2,h=4,$fn=180); +//%translate([0,0,30]) cylinder(r=250/2,h=3.3,$fn=180); diff --git a/beltCatch.scad b/beltCatch.scad new file mode 100644 index 0000000..33d5cf7 --- /dev/null +++ b/beltCatch.scad @@ -0,0 +1,58 @@ +beltThick = 1.45 + 0.2; // thickness of belt from back to tooth tip +// the doubled belt part must be very tight, or teeth will slip. +beltThick2 = 2.35 + 0.1; // thickness of DOUBLED over belt, teeth interlocked + +module beltCatch(height,full=false) +{ + postRad = 2.7; // radius of main post + // post is a little thin to safely support a screw. + // move pilot screw hole to an outer brace + //difference() { + hull() { + cylinder(h=height,r=postRad,$fn=32); + translate([-postRad,0,0]) cube([0.6,2.0*postRad,height]); + } + // translate([0,0,height-4]) cylinder(h=5,r=.6,$fn=11); // pilot hole for optional lock-in screw + //} + + difference() { + union() { + difference() { + cylinder(h=height,r=postRad+beltThick+3,$fn=48); + translate([0,0,-1]) cylinder(h=height+2,r=postRad+beltThick,$fn=48); + translate([-10,0,-1]) cube([10,20,height+2]); + translate([-10*.7071,10*.7071,-1]) rotate([0,0,-45]) cube([10,20,height+2]); + } + translate([-postRad-beltThick-3,-.1,0]) hull() { + translate([-2, 0,0]) cube([5,3 ,height]); + translate([ 1,15,0]) cube([2,1,height]); + } + hull() { + translate([-postRad-beltThick+beltThick2, 2.0*postRad+beltThick+.5,0]) + cube([2,8.35,height]); + rotate([0,0,43]) translate([postRad+beltThick,0,0]) cube([3,1,height]); + } + } + + // chop off (unnecessary) bottom curve part of catch + translate([-12 ,-15,-1]) cube([24,15-postRad-beltThick-0.2,height+2]); + translate([-2.5,-15,-1]) cube([ 5,15-postRad-0.2 ,height+2]); + + if (!full) { + // chop off most of far brace for close quarters + translate([postRad+1,-8,-1]) cube([10,20,height+2]); + translate([-2,-7,-1]) rotate([0,0,-45]) cube([5,10,height+2]); + } + + // pilot hole for optional lock-in screw + translate([1,1.7*postRad+.7*beltThick+3,height-4]) + cylinder(h=5,r=.8,$fn=6); + + } +} + +union(){ + beltCatch(6.3); + translate([-6.4,-4.5,-2.5]) cube([10.1,20.4,2.7]); +} +%translate([0,-20,0]) mirror([0,1,0]) beltCatch(6,full=true); diff --git a/boxRAMPS200x200.pl b/boxRAMPS200x200.pl new file mode 100755 index 0000000..489d744 --- /dev/null +++ b/boxRAMPS200x200.pl @@ -0,0 +1,79 @@ +#!/usr/bin/perl -w +# $URL: svn+ssh://mrwhat@ssh.boim.com/home/mrwhat/svn/Walker/trunk/e20payload30_171x285.pl $ +# $Id: e20payload30_171x285.pl 417 2014-04-19 14:38:28Z mrwhat $ + +require 'laserPartsUtil.pl'; + +# get this from file name to make SURE it matches +($wmm,$hmm) = &parseSizeFromFileName($0); + +&printLaserCutHeader($wmm,$hmm); + +local $x0 = 80; +local $y0 = 80; +&ArduinoMegaMountHoles($x0+2,$y0+60); + +&startPart($x0,$y0); +print "M0,0 l10,0 +l0,-3 l10,0 l0,3 l10,0 +l0,-3 l10,0 l0,3 l10,0 +l0,-3 l10,0 l0,3 l10,0 +l0,-3 l10,0 l0,3 l10,0 +l0,-3 l10,0 l0,3 l10,0 +l0,10 l3,0 l0,10 l-3,0 +l0,10 l3,0 l0,15 l-3,0 +l0,10 l3,0 l0,10 l-3,0 l0,10 +l-10,0 l0,3 l-10,0 l0,-3 +l-10,0 l0,3 l-10,0 l0,-3 +l-10,0 l0,3 l-10,0 l0,-3 +l-10,0 l0,3 l-10,0 l0,-3 +l-10,0 l0,3 l-10,0 l0,-3 l-10,0 +l0,-10 l-3,0 l0,-10 l3,0 +l0,-10 l-3,0 l0,-15 l3,0 +l0,-10 l-3,0 l0,-10 l3,0 Z +$endPart"; + +print "Hole to align with reset button\n"; +&plotCircle(37+$x0,$y0-28,3.5,12); + +&startPart($x0-3,$y0); +print "M3,0 l0,-3 l-13,0 +l0,3 l-10,0 l0,-3 l-10,0 +l0,3 l-10,0 l0,-3 l-10,0 +l0,3 l-10,0 l0,-3 l-13,0 +l0,13 l3,0 l0,10 l-3,0 +l0,10 l3,0 l0,15 l-3,0 +l0,10 l3,0 l0,10 l-3,0 +l0,13 +l13,0 l0,-3 l10,0 l0,3 +l10,0 l0,-3 l10,0 l0,3 +l10,0 l0,-3 l10,0 l0,3 +l13,0 l0,-3 $endPart"; + +local $px = 16.8-30; +local $py = 79 + $y0; +print "USB port and power holes + + + + +\n"; + + +&startPart($x0,$y0-3); +print "M0,0 l0,-10 l-3,0 +l0,-10 l3,0 l0,-10 l-3,0 +l0,-10 l3,0 l0,-10 l-3,0 +l0,-10 l3,0 l0,-13 +l10,0 l0,3 l10,0 l0,-3 +l10,0 l0,3 l10,0 l0,-3 +l10,0 l0,3 l10,0 l0,-3 +l10,0 l0,3 l10,0 l0,-3 +l10,0 l0,3 l10,0 l0,-3 +l10,0 l0,13 +l3,0 l0,10 l-3,0 l0,10 +l3,0 l0,10 l-3,0 l0,10 +l3,0 l0,10 l-3,0 l0,13 +$endPart"; + +print "\n"; # end of drawing diff --git a/boxRAMPS400x400.pl b/boxRAMPS400x400.pl new file mode 100755 index 0000000..39a7400 --- /dev/null +++ b/boxRAMPS400x400.pl @@ -0,0 +1,77 @@ +#!/usr/bin/perl -w +# $URL: svn+ssh://mrwhat@ssh.boim.com/home/mrwhat/svn/Walker/trunk/e20payload30_171x285.pl $ +# $Id: e20payload30_171x285.pl 417 2014-04-19 14:38:28Z mrwhat $ + +require 'laserPartsUtil.pl'; + +# get this from file name to make SURE it matches +($wmm,$hmm) = &parseSizeFromFileName($0); + +&printLaserCutHeader($wmm,$hmm); + +&ArduinoMegaMountHoles(112,230); + +&startPart(110,170); +print "M0,0 l10,0 +l0,-3 l10,0 l0,3 l10,0 +l0,-3 l10,0 l0,3 l10,0 +l0,-3 l10,0 l0,3 l10,0 +l0,-3 l10,0 l0,3 l10,0 +l0,-3 l10,0 l0,3 l10,0 +l0,10 l3,0 l0,10 l-3,0 +l0,10 l3,0 l0,15 l-3,0 +l0,10 l3,0 l0,10 l-3,0 l0,10 +l-10,0 l0,3 l-10,0 l0,-3 +l-10,0 l0,3 l-10,0 l0,-3 +l-10,0 l0,3 l-10,0 l0,-3 +l-10,0 l0,3 l-10,0 l0,-3 +l-10,0 l0,3 l-10,0 l0,-3 l-10,0 +l0,-10 l-3,0 l0,-10 l3,0 +l0,-10 l-3,0 l0,-15 l3,0 +l0,-10 l-3,0 l0,-10 l3,0 Z +$endPart"; + +print "Hole to align with reset button\n"; +&plotCircle(147,142,3.5,12); + +&startPart(110-3,170); +print "M3,0 l0,-3 l-13,0 +l0,3 l-10,0 l0,-3 l-10,0 +l0,3 l-10,0 l0,-3 l-10,0 +l0,3 l-10,0 l0,-3 l-13,0 +l0,13 l3,0 l0,10 l-3,0 +l0,10 l3,0 l0,15 l-3,0 +l0,10 l3,0 l0,10 l-3,0 +l0,13 +l13,0 l0,-3 l10,0 l0,3 +l10,0 l0,-3 l10,0 l0,3 +l10,0 l0,-3 l10,0 l0,3 +l13,0 l0,-3 $endPart"; + +print "USB port and power holes + + + + +\n"; + + +#&startPart(110-3,170-3-5,-90); # for checking alignment with front plate +&startPart(110,170-3); +print "M0,0 l0,-10 l-3,0 +l0,-10 l3,0 l0,-10 l-3,0 +l0,-10 l3,0 l0,-10 l-3,0 +l0,-10 l3,0 l0,-13 +l10,0 l0,3 l10,0 l0,-3 +l10,0 l0,3 l10,0 l0,-3 +l10,0 l0,3 l10,0 l0,-3 +l10,0 l0,3 l10,0 l0,-3 +l10,0 l0,3 l10,0 l0,-3 +l10,0 l0,13 +l3,0 l0,10 l-3,0 l0,10 +l3,0 l0,10 l-3,0 l0,10 +l3,0 l0,10 l-3,0 l0,13 +$endPart"; + +print "\n"; # end of drawing + diff --git a/card.stl b/card.stl deleted file mode 100644 index 0c39cd7..0000000 --- a/card.stl +++ /dev/null @@ -1,5966 +0,0 @@ -solid OpenSCAD_Model - facet normal -1 -0 -0 - outer loop - vertex -43 -14.5 -0.1 - vertex -43 -14.5 0.3 - vertex -43 14.5 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -43 14.5 -0.1 - vertex -43 -14.5 0.3 - vertex -43 14.5 0.3 - endloop - endfacet - facet normal -0.991445 -0.130526 -0 - outer loop - vertex -43 -14.5 -0.1 - vertex -42.6593 -17.0882 -0.1 - vertex -43 -14.5 0.3 - endloop - endfacet - facet normal -0.991445 -0.130526 0 - outer loop - vertex -43 -14.5 0.3 - vertex -42.6593 -17.0882 -0.1 - vertex -42.6593 -17.0882 0.3 - endloop - endfacet - facet normal -0 -0 -1 - outer loop - vertex -43 -14.5 -0.1 - vertex -43 14.5 -0.1 - vertex -42.6593 -17.0882 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -43 14.5 -0.1 - vertex -42.6593 17.0882 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -42.6593 17.0882 -0.1 - vertex -41.6603 19.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -41.6603 19.5 -0.1 - vertex -40.0711 21.5711 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -40.0711 21.5711 -0.1 - vertex -38 23.1603 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -38 23.1603 -0.1 - vertex -35.5882 24.1593 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -35.5882 24.1593 -0.1 - vertex -33 24.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -33.4 5.2 -0.1 - vertex -33 24.5 -0.1 - vertex 33 24.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 3.6 5.2 -0.1 - vertex 38 23.1603 -0.1 - vertex 40.0711 21.5711 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.975 5.075 -0.1 - vertex 41.6603 19.5 -0.1 - vertex 42.6593 17.0882 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 13.8 5.2 -0.1 - vertex 42.6593 17.0882 -0.1 - vertex 43 14.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 34.2 -4 -0.1 - vertex 43 14.5 -0.1 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex 43 -14.5 -0.1 - vertex 42.6593 -17.0882 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex 42.6593 -17.0882 -0.1 - vertex 41.6603 -19.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex 41.6603 -19.5 -0.1 - vertex 40.0711 -21.5711 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex 40.0711 -21.5711 -0.1 - vertex 38 -23.1603 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex 38 -23.1603 -0.1 - vertex 35.5882 -24.1593 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex 35.5882 -24.1593 -0.1 - vertex 33 -24.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex 33 -24.5 -0.1 - vertex -33 -24.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -33 -24.5 -0.1 - vertex -35.5882 -24.1593 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -35.5882 -24.1593 -0.1 - vertex -38 -23.1603 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -38 -23.1603 -0.1 - vertex -40.0711 -21.5711 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -40.0711 -21.5711 -0.1 - vertex -41.6603 -19.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -33 24.5 -0.1 - vertex -33.4 5.2 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -32 5.2 -0.1 - vertex -33.4 5.2 -0.1 - vertex 33 24.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -33.4 5.2 -0.1 - vertex -33.4 -4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -24.6 5 -0.1 - vertex -22 3.6 -0.1 - vertex -28.2 0.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -33.4 -4 -0.1 - vertex -32 -4 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -8.2 -2.6 -0.1 - vertex -2.2 -2.5 -0.1 - vertex -2.4 -2.6 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -20.2 5.2 -0.1 - vertex 33 24.5 -0.1 - vertex -14.4 5.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -26.2 -4 -0.1 - vertex -32 -4 -0.1 - vertex -29.6 2.22045e-16 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -32 -4 -0.1 - vertex -26.2 -4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -26.2 -4 -0.1 - vertex -24.6 -4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -14.4 -4 -0.1 - vertex -42.6593 -17.0882 -0.1 - vertex -20.2 -4 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -24.6 5 -0.1 - vertex -20.925 5.075 -0.1 - vertex -21.5 4.7 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -20.2 5.2 -0.1 - vertex -24.6 5 -0.1 - vertex 33 24.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -26.2 5.2 -0.1 - vertex 33 24.5 -0.1 - vertex -24.6 5.2 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -24.6 5 -0.1 - vertex -24.6 5.2 -0.1 - vertex 33 24.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -32 5.2 -0.1 - vertex 33 24.5 -0.1 - vertex -26.2 5.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -32 5.2 -0.1 - vertex -29.6 1.2 -0.1 - vertex -32 1.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.4 3.8 -0.1 - vertex -8.6 3.6 -0.1 - vertex -8.2 3.8 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -0.8 -0.4 -0.1 - vertex 3.6 2.22045e-16 -0.1 - vertex -0.8 -2.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -24.6 -4 -0.1 - vertex -21.875 -2.975 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.2 3 -0.1 - vertex -8.2 1.2 -0.1 - vertex -2.2 3.7 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -21.875 -2.975 -0.1 - vertex -21.5 -3.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -21.5 -3.5 -0.1 - vertex -20.925 -3.875 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 10.5 4.7 -0.1 - vertex 42.6593 17.0882 -0.1 - vertex 10.875 4.175 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -20.925 -3.875 -0.1 - vertex -20.2 -4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 1.8 1.6 -0.1 - vertex -1.825 1.1 -0.1 - vertex -2.4 1.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -14.4 -4 -0.1 - vertex -13.675 -3.875 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -1.3 0.8 -0.1 - vertex 1.8 1.6 -0.1 - vertex -0.925 0.3 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 25 -4 -0.1 - vertex 20.8 2.22045e-16 -0.1 - vertex 20.8 1.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 13.8 -4 -0.1 - vertex 10.875 4.175 -0.1 - vertex 13.8 5.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -10 -2.4 -0.1 - vertex -12.725 -2.975 -0.1 - vertex -10 -1.8 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -8.925 5.075 -0.1 - vertex -12.6 3.6 -0.1 - vertex 33 24.5 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -12.6 3.6 -0.1 - vertex -12.725 4.175 -0.1 - vertex 33 24.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -8.6 -2.4 -0.1 - vertex -2.2 -0.1 -0.1 - vertex -8.5 -2.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -13.1 4.7 -0.1 - vertex 33 24.5 -0.1 - vertex -12.725 4.175 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -24.6 5 -0.1 - vertex -21.875 4.175 -0.1 - vertex -22 3.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -24.6 5 -0.1 - vertex -21.5 4.7 -0.1 - vertex -21.875 4.175 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -13.675 5.075 -0.1 - vertex -14.4 5.2 -0.1 - vertex 33 24.5 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -20.925 5.075 -0.1 - vertex -24.6 5 -0.1 - vertex -20.2 5.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.2 -2.5 -0.1 - vertex -8.5 -2.5 -0.1 - vertex -2.2 -0.1 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -22 -2.4 -0.1 - vertex -28.2 0.6 -0.1 - vertex -22 3.6 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -29.6 1.2 -0.1 - vertex -32 5.2 -0.1 - vertex -26.2 5.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -10 -2.4 -0.1 - vertex -13.675 -3.875 -0.1 - vertex -13.1 -3.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -13.675 -3.875 -0.1 - vertex -10 -2.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.4 3.8 -0.1 - vertex 3.2 3.6 -0.1 - vertex 3.6 3.8 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -0.925 4.175 -0.1 - vertex 38 23.1603 -0.1 - vertex -0.8 3.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -9.875 -2.975 -0.1 - vertex -9.5 -3.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.4 2.22045e-16 -0.1 - vertex -0.8 -2.4 -0.1 - vertex 3.6 2.22045e-16 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -8.6 -2.4 -0.1 - vertex -2.25 -0.025 -0.1 - vertex -2.2 -0.1 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -8.925 -3.875 -0.1 - vertex -8.2 -4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 1.8 1.6 -0.1 - vertex -2.4 1.2 -0.1 - vertex 1.8 3.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -2.4 -4 -0.1 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -2.4 -4 -0.1 - vertex -1.825 -3.875 -0.1 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 1.8 -2.4 -0.1 - vertex -1.3 -3.5 -0.1 - vertex -0.925 -2.975 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 1.925 0.9 -0.1 - vertex -0.925 0.3 -0.1 - vertex 1.8 1.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.4 -4 -0.1 - vertex -42.6593 -17.0882 -0.1 - vertex -8.2 -4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -8.6 -2.4 -0.1 - vertex -2.4 2.22045e-16 -0.1 - vertex -2.25 -0.025 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 13.8 -4 -0.1 - vertex 10.5 -3.5 -0.1 - vertex 10.875 -2.975 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -8.2 3.8 -0.1 - vertex -8.6 3.6 -0.1 - vertex -8.5 3.7 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.4 2.22045e-16 -0.1 - vertex -10 -1.8 -0.1 - vertex -12.6 -2.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -8.925 0.1 -0.1 - vertex -8.2 2.22045e-16 -0.1 - vertex -12.6 -2.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.4 2.22045e-16 -0.1 - vertex -12.6 -2.4 -0.1 - vertex -8.2 2.22045e-16 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -9.5 0.4 -0.1 - vertex -8.925 0.1 -0.1 - vertex -12.6 -2.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -12.6 3.6 -0.1 - vertex -9.5 0.4 -0.1 - vertex -12.6 -2.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.4 3.8 -0.1 - vertex -8.2 1.2 -0.1 - vertex -8.375 1.225 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.4 3.8 -0.1 - vertex -8.375 1.225 -0.1 - vertex -8.5 1.3 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.2 -2.5 -0.1 - vertex -8.2 -2.6 -0.1 - vertex -8.375 -2.575 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.4 3.8 -0.1 - vertex -8.5 1.3 -0.1 - vertex -8.575 1.425 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -8.2 5.2 -0.1 - vertex 33 24.5 -0.1 - vertex -2.4 5.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -12.6 3.6 -0.1 - vertex -10 1.6 -0.1 - vertex -9.875 0.9 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -12.6 3.6 -0.1 - vertex -10 3.6 -0.1 - vertex -10 1.6 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -1.3 4.7 -0.1 - vertex 38 23.1603 -0.1 - vertex -0.925 4.175 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -2.4 5.2 -0.1 - vertex 33 24.5 -0.1 - vertex -1.825 5.075 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.4 2.22045e-16 -0.1 - vertex -8.6 -1.8 -0.1 - vertex -10 -1.8 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -8.6 -1.8 -0.1 - vertex -2.4 2.22045e-16 -0.1 - vertex -8.6 -2.4 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -9.5 4.7 -0.1 - vertex -12.6 3.6 -0.1 - vertex -8.925 5.075 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -8.2 5.2 -0.1 - vertex -8.925 5.075 -0.1 - vertex 33 24.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 13.8 -4 -0.1 - vertex 11 3.6 -0.1 - vertex 10.875 4.175 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.4 3.8 -0.1 - vertex -8.6 1.6 -0.1 - vertex -8.6 3.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -0.8 -0.4 -0.1 - vertex 2.875 0.1 -0.1 - vertex 3.6 2.22045e-16 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 1.8 1.6 -0.1 - vertex -1.3 0.8 -0.1 - vertex -1.825 1.1 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -12.6 3.6 -0.1 - vertex -9.875 0.9 -0.1 - vertex -9.5 0.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.4 3.8 -0.1 - vertex -8.575 1.425 -0.1 - vertex -8.6 1.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -10 -2.4 -0.1 - vertex -13.1 -3.5 -0.1 - vertex -12.725 -2.975 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.2 -2.5 -0.1 - vertex -8.375 -2.575 -0.1 - vertex -8.5 -2.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -0.8 3.6 -0.1 - vertex 2.875 5.075 -0.1 - vertex 2.3 4.7 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -0.8 3.6 -0.1 - vertex 38 23.1603 -0.1 - vertex 2.875 5.075 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex 1.925 4.175 -0.1 - vertex -0.8 3 -0.1 - vertex 2.3 4.7 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.4 2.22045e-16 -0.1 - vertex 1.8 -1.8 -0.1 - vertex -0.8 -2.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -2.4 -2.6 -0.1 - vertex -2.2 -2.5 -0.1 - vertex -2.25 -2.575 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.4 2.22045e-16 -0.1 - vertex 3.2 -1.8 -0.1 - vertex 1.8 -1.8 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 3.3 1.3 -0.1 - vertex 9.55 3.775 -0.1 - vertex 3.425 1.225 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 13.8 5.2 -0.1 - vertex 43 14.5 -0.1 - vertex 22.2 5.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 13.8 -4 -0.1 - vertex 11 -0.4 -0.1 - vertex 10.875 0.3 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 3.6 5.2 -0.1 - vertex 40.0711 21.5711 -0.1 - vertex 41.6603 19.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -8.925 -3.875 -0.1 - vertex -42.6593 -17.0882 -0.1 - vertex -9.5 -3.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -9.875 -2.975 -0.1 - vertex -42.6593 -17.0882 -0.1 - vertex -10 -2.4 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -0.8 -2.4 -0.1 - vertex 1.8 -1.8 -0.1 - vertex -0.925 -2.975 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.4 -4 -0.1 - vertex 43 -14.5 -0.1 - vertex 3.6 -4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -1.825 -3.875 -0.1 - vertex 1.8 -2.4 -0.1 - vertex 1.925 -2.975 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -1.825 -3.875 -0.1 - vertex 1.925 -2.975 -0.1 - vertex 2.3 -3.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -1.825 -3.875 -0.1 - vertex 2.3 -3.5 -0.1 - vertex 2.875 -3.875 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -1.825 -3.875 -0.1 - vertex 2.875 -3.875 -0.1 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 2.875 -3.875 -0.1 - vertex 3.6 -4 -0.1 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex 9.975 1.1 -0.1 - vertex 9.4 1.2 -0.1 - vertex 11 3 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 25 -4 -0.1 - vertex 22.2 3.8 -0.1 - vertex 25 5.2 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 9.4 -4 -0.1 - vertex 9.975 -3.875 -0.1 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal -0 -0 -1 - outer loop - vertex 3.6 -2.6 -0.1 - vertex 3.3 -2.5 -0.1 - vertex 9.4 -2.6 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex 10.5 0.8 -0.1 - vertex 9.975 1.1 -0.1 - vertex 11 3 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 13.8 -4 -0.1 - vertex 11 -2.4 -0.1 - vertex 11 -0.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 1.8 -2.4 -0.1 - vertex -0.925 -2.975 -0.1 - vertex 1.8 -1.8 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 3.6 1.2 -0.1 - vertex 9.6 3 -0.1 - vertex 11 3 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 13.8 -4 -0.1 - vertex 11 3 -0.1 - vertex 11 3.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 1.8 -2.4 -0.1 - vertex -1.825 -3.875 -0.1 - vertex -1.3 -3.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -0.925 0.3 -0.1 - vertex 1.925 0.9 -0.1 - vertex -0.8 -0.4 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 9.975 5.075 -0.1 - vertex 42.6593 17.0882 -0.1 - vertex 10.5 4.7 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 3.6 5.2 -0.1 - vertex 41.6603 19.5 -0.1 - vertex 9.4 5.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -0.8 3 -0.1 - vertex 1.925 4.175 -0.1 - vertex 1.8 3.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -8.2 1.2 -0.1 - vertex -0.8 3 -0.1 - vertex 1.8 3.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.55 3.775 -0.1 - vertex 3.3 1.3 -0.1 - vertex 9.4 3.8 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 3.6 3.8 -0.1 - vertex 3.3 3.7 -0.1 - vertex 3.425 3.775 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.4 3.8 -0.1 - vertex 3.2 1.6 -0.1 - vertex 3.2 3.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.4 3.8 -0.1 - vertex 3.225 1.425 -0.1 - vertex 3.2 1.6 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 3.3 3.7 -0.1 - vertex 3.6 3.8 -0.1 - vertex 3.2 3.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.6 3.7 -0.1 - vertex 3.425 1.225 -0.1 - vertex 9.55 3.775 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 3.225 1.425 -0.1 - vertex 9.4 3.8 -0.1 - vertex 3.3 1.3 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.6 3 -0.1 - vertex 3.6 1.2 -0.1 - vertex 3.425 1.225 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.6 3 -0.1 - vertex 3.425 1.225 -0.1 - vertex 9.6 3.7 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -8.2 1.2 -0.1 - vertex -2.2 3 -0.1 - vertex -0.8 3 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 13.8 -4 -0.1 - vertex 10.875 -2.975 -0.1 - vertex 11 -2.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 13.8 -4 -0.1 - vertex 9.975 -3.875 -0.1 - vertex 10.5 -3.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 2.3 0.4 -0.1 - vertex -0.8 -0.4 -0.1 - vertex 1.925 0.9 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 13.8 -4 -0.1 - vertex 10.875 0.3 -0.1 - vertex 11 3 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 10.875 4.175 -0.1 - vertex 42.6593 17.0882 -0.1 - vertex 13.8 5.2 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 9.4 5.2 -0.1 - vertex 41.6603 19.5 -0.1 - vertex 9.975 5.075 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -8.2 1.2 -0.1 - vertex -2.4 3.8 -0.1 - vertex -2.25 3.775 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -8.2 1.2 -0.1 - vertex -2.25 3.775 -0.1 - vertex -2.2 3.7 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 2.875 5.075 -0.1 - vertex 38 23.1603 -0.1 - vertex 3.6 5.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 25 -4 -0.1 - vertex 22.2 -2.6 -0.1 - vertex 20.8 2.22045e-16 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex 20.8 1.2 -0.1 - vertex 15.2 1.2 -0.1 - vertex 22.2 3.8 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 25 -4 -0.1 - vertex 20.8 1.2 -0.1 - vertex 22.2 3.8 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -8.2 3.8 -0.1 - vertex -8.5 3.7 -0.1 - vertex -8.375 3.775 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -0.8 3.6 -0.1 - vertex 2.3 4.7 -0.1 - vertex -0.8 3 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -1.3 4.7 -0.1 - vertex 35.5882 24.1593 -0.1 - vertex 38 23.1603 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -0.8 -0.4 -0.1 - vertex 2.3 0.4 -0.1 - vertex 2.875 0.1 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.6 -2.5 -0.1 - vertex 3.2 -2.4 -0.1 - vertex 9.6 -0.1 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 3.6 -2.6 -0.1 - vertex 3.425 -2.575 -0.1 - vertex 3.3 -2.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 3.2 -1.8 -0.1 - vertex 9.55 -0.025 -0.1 - vertex 9.6 -0.1 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 3.2 -1.8 -0.1 - vertex 9.6 -0.1 -0.1 - vertex 3.2 -2.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 3.2 -2.4 -0.1 - vertex 9.6 -2.5 -0.1 - vertex 9.55 -2.575 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 3.2 -2.4 -0.1 - vertex 9.55 -2.575 -0.1 - vertex 9.4 -2.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 3.2 -2.4 -0.1 - vertex 9.4 -2.6 -0.1 - vertex 3.3 -2.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 3.2 -1.8 -0.1 - vertex 9.4 2.22045e-16 -0.1 - vertex 9.55 -0.025 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 20.8 2.22045e-16 -0.1 - vertex 15.2 -2.6 -0.1 - vertex 15.2 2.22045e-16 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 9.975 -3.875 -0.1 - vertex 13.8 -4 -0.1 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 13.8 -4 -0.1 - vertex 22.2 -4 -0.1 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 25 5.2 -0.1 - vertex 43 14.5 -0.1 - vertex 26.4 5.2 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 15.2 -2.6 -0.1 - vertex 20.8 2.22045e-16 -0.1 - vertex 22.2 -2.6 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -8.2 1.2 -0.1 - vertex 1.8 3.6 -0.1 - vertex -2.4 1.2 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -10 -1.8 -0.1 - vertex -12.725 -2.975 -0.1 - vertex -12.6 -2.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 25 -4 -0.1 - vertex 22.2 -4 -0.1 - vertex 22.2 -2.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 22.2 3.8 -0.1 - vertex 15.2 1.2 -0.1 - vertex 15.2 3.8 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex 10.875 0.3 -0.1 - vertex 10.5 0.8 -0.1 - vertex 11 3 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 22.2 3.8 -0.1 - vertex 43 14.5 -0.1 - vertex 25 5.2 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 22.2 5.2 -0.1 - vertex 43 14.5 -0.1 - vertex 22.2 3.8 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 26.4 5.2 -0.1 - vertex 43 14.5 -0.1 - vertex 26.4 -2.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 22.2 -4 -0.1 - vertex 25 -4 -0.1 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 34.2 -2.6 -0.1 - vertex 43 14.5 -0.1 - vertex 34.2 -4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex 25 -4 -0.1 - vertex 34.2 -4 -0.1 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex 26.4 -2.6 -0.1 - vertex 43 14.5 -0.1 - vertex 34.2 -2.6 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -13.675 5.075 -0.1 - vertex 33 24.5 -0.1 - vertex -13.1 4.7 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -32 2.22045e-16 -0.1 - vertex -29.6 2.22045e-16 -0.1 - vertex -32 -4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -12.6 3.6 -0.1 - vertex -9.5 4.7 -0.1 - vertex -9.875 4.175 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -12.6 3.6 -0.1 - vertex -9.875 4.175 -0.1 - vertex -10 3.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -21.875 -2.975 -0.1 - vertex -24.6 -3.8 -0.1 - vertex -22 -2.4 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -21.875 -2.975 -0.1 - vertex -24.6 -4 -0.1 - vertex -24.6 -3.8 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -28.2 0.6 -0.1 - vertex -22 -2.4 -0.1 - vertex -24.6 -3.8 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -1.825 5.075 -0.1 - vertex 33 24.5 -0.1 - vertex 35.5882 24.1593 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -1.825 5.075 -0.1 - vertex 35.5882 24.1593 -0.1 - vertex -1.3 4.7 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex 9.4 1.2 -0.1 - vertex 3.6 1.2 -0.1 - vertex 11 3 -0.1 - endloop - endfacet - facet normal -0.991445 0.130526 0 - outer loop - vertex -43 14.5 -0.1 - vertex -43 14.5 0.3 - vertex -42.6593 17.0882 -0.1 - endloop - endfacet - facet normal -0.991445 0.130526 0 - outer loop - vertex -42.6593 17.0882 -0.1 - vertex -43 14.5 0.3 - vertex -42.6593 17.0882 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -43 14.5 0.3 - vertex -43 -14.5 0.3 - vertex -42.6593 -17.0882 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -40.0711 -21.5711 0.3 - vertex -43 14.5 0.3 - vertex -41.6603 -19.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -41.6603 -19.5 0.3 - vertex -43 14.5 0.3 - vertex -42.6593 -17.0882 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -38 -23.1603 0.3 - vertex -43 14.5 0.3 - vertex -40.0711 -21.5711 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -35.5882 -24.1593 0.3 - vertex -43 14.5 0.3 - vertex -38 -23.1603 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -33 -24.5 0.3 - vertex -43 14.5 0.3 - vertex -35.5882 -24.1593 0.3 - endloop - endfacet - facet normal -0 -0 1 - outer loop - vertex -33.4 -4 0.3 - vertex -43 14.5 0.3 - vertex -33 -24.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -21.875 4.175 0.3 - vertex -21.5 4.7 0.3 - vertex -43 14.5 0.3 - endloop - endfacet - facet normal -0 -0 1 - outer loop - vertex -8.2 2.22045e-16 0.3 - vertex -8.925 0.1 0.3 - vertex -2.4 -2.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.2 1.2 0.3 - vertex -8.6 3.6 0.3 - vertex -8.6 1.6 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -1.3 -3.5 0.3 - vertex -1.825 -3.875 0.3 - vertex 40.0711 -21.5711 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -12.6 3.6 0.3 - vertex -9.5 0.4 0.3 - vertex -9.875 0.9 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 42.6593 17.0882 0.3 - vertex -43 14.5 0.3 - vertex 43 14.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 41.6603 19.5 0.3 - vertex -43 14.5 0.3 - vertex 42.6593 17.0882 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 40.0711 21.5711 0.3 - vertex -43 14.5 0.3 - vertex 41.6603 19.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 38 23.1603 0.3 - vertex -43 14.5 0.3 - vertex 40.0711 21.5711 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 35.5882 24.1593 0.3 - vertex -43 14.5 0.3 - vertex 38 23.1603 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 33 24.5 0.3 - vertex -43 14.5 0.3 - vertex 35.5882 24.1593 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -33 24.5 0.3 - vertex -43 14.5 0.3 - vertex 33 24.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -35.5882 24.1593 0.3 - vertex -43 14.5 0.3 - vertex -33 24.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -38 23.1603 0.3 - vertex -43 14.5 0.3 - vertex -35.5882 24.1593 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -40.0711 21.5711 0.3 - vertex -43 14.5 0.3 - vertex -38 23.1603 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -41.6603 19.5 0.3 - vertex -43 14.5 0.3 - vertex -40.0711 21.5711 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -42.6593 17.0882 0.3 - vertex -43 14.5 0.3 - vertex -41.6603 19.5 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex 33 -24.5 0.3 - vertex -33.4 -4 0.3 - vertex -33 -24.5 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex -33.4 5.2 0.3 - vertex -43 14.5 0.3 - vertex -33.4 -4 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex -32 5.2 0.3 - vertex -43 14.5 0.3 - vertex -33.4 5.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -28.2 0.6 0.3 - vertex -21.875 -2.975 0.3 - vertex -22 -2.4 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex -26.2 5.2 0.3 - vertex -43 14.5 0.3 - vertex -32 5.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -10 -1.8 0.3 - vertex -8.6 -1.8 0.3 - vertex -12.6 3.6 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -12.725 -2.975 0.3 - vertex -13.1 -3.5 0.3 - vertex 33 -24.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 33 -24.5 0.3 - vertex -24.6 -4 0.3 - vertex -26.2 -4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 33 -24.5 0.3 - vertex -24.6 -3.8 0.3 - vertex -24.6 -4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 33 -24.5 0.3 - vertex -26.2 -4 0.3 - vertex -32 -4 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -29.6 2.22045e-16 0.3 - vertex -32 2.22045e-16 0.3 - vertex -26.2 -4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 33 -24.5 0.3 - vertex -32 -4 0.3 - vertex -33.4 -4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -24.6 5.2 0.3 - vertex -21.875 4.175 0.3 - vertex -43 14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -22 3.6 0.3 - vertex -21.875 4.175 0.3 - vertex -24.6 5.2 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -0.8 -0.4 0.3 - vertex -0.8 -2.4 0.3 - vertex 2.3 -3.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -0.8 -2.4 0.3 - vertex -0.925 -2.975 0.3 - vertex 41.6603 -19.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -21.5 4.7 0.3 - vertex -20.925 5.075 0.3 - vertex -43 14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.2 2.22045e-16 0.3 - vertex -2.25 -2.575 0.3 - vertex -2.2 -2.5 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex -20.2 5.2 0.3 - vertex -43 14.5 0.3 - vertex -20.925 5.075 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -2.4 -4 0.3 - vertex 33 -24.5 0.3 - vertex 35.5882 -24.1593 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex -43 14.5 0.3 - vertex -14.4 5.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.2 5.2 0.3 - vertex -2.4 5.2 0.3 - vertex 43 14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex -14.4 5.2 0.3 - vertex -13.675 5.075 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 10.5 4.7 0.3 - vertex 13.8 5.2 0.3 - vertex 9.975 5.075 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 13.8 -4 0.3 - vertex 10.875 4.175 0.3 - vertex 11 3.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -28.2 0.6 0.3 - vertex -20.925 -3.875 0.3 - vertex -21.5 -3.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 33 -24.5 0.3 - vertex -12.6 -2.4 0.3 - vertex -12.725 -2.975 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -26.2 5.2 0.3 - vertex -24.6 5.2 0.3 - vertex -43 14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -21.5 -3.5 0.3 - vertex -21.875 -2.975 0.3 - vertex -28.2 0.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 33 -24.5 0.3 - vertex -13.675 -3.875 0.3 - vertex -14.4 -4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 33 -24.5 0.3 - vertex -20.2 -4 0.3 - vertex -24.6 -3.8 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -14.4 -4 0.3 - vertex -20.2 -4 0.3 - vertex 33 -24.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -20.2 -4 0.3 - vertex -20.925 -3.875 0.3 - vertex -24.6 -3.8 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex -26.2 -4 0.3 - vertex -32 2.22045e-16 0.3 - vertex -32 -4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.2 1.2 0.3 - vertex -8.6 1.6 0.3 - vertex -8.575 1.425 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -0.8 -0.4 0.3 - vertex 1.8 -2.4 0.3 - vertex 1.8 -1.8 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.2 -1.8 0.3 - vertex -0.925 0.3 0.3 - vertex -0.8 -0.4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -10 1.6 0.3 - vertex -12.725 4.175 0.3 - vertex -12.6 3.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -10 3.6 0.3 - vertex -13.675 5.075 0.3 - vertex -13.1 4.7 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -2.4 2.22045e-16 0.3 - vertex -2.2 -0.1 0.3 - vertex -2.25 -0.025 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -10 3.6 0.3 - vertex -9.875 4.175 0.3 - vertex -13.675 5.075 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -10 1.6 0.3 - vertex -13.1 4.7 0.3 - vertex -12.725 4.175 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.6 -2.6 0.3 - vertex 3.2 -1.8 0.3 - vertex 3.2 -2.4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.2 -1.8 0.3 - vertex -1.3 0.8 0.3 - vertex -0.925 0.3 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 10.875 0.3 0.3 - vertex 9.6 3 0.3 - vertex 10.5 0.8 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 26.4 -2.6 0.3 - vertex 34.2 -2.6 0.3 - vertex 26.4 5.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 13.8 -4 0.3 - vertex 10.875 0.3 0.3 - vertex 11 -0.4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 2.3 0.4 0.3 - vertex 1.925 0.9 0.3 - vertex -2.2 3 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex -9.5 4.7 0.3 - vertex -13.675 5.075 0.3 - vertex -9.875 4.175 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.925 5.075 0.3 - vertex -13.675 5.075 0.3 - vertex -9.5 4.7 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex -13.675 5.075 0.3 - vertex -8.925 5.075 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 9.4 -2.6 0.3 - vertex 9.55 -2.575 0.3 - vertex -8.375 3.775 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex -8.925 5.075 0.3 - vertex -8.2 5.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex -2.4 5.2 0.3 - vertex -1.825 5.075 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -2.4 3.8 0.3 - vertex -2.2 3.7 0.3 - vertex -2.25 3.775 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -1.3 4.7 0.3 - vertex 1.8 3.6 0.3 - vertex -1.825 5.075 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -2.4 3.8 0.3 - vertex -2.2 3 0.3 - vertex -2.2 3.7 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -2.4 2.22045e-16 0.3 - vertex -2.2 -2.5 0.3 - vertex -2.2 -0.1 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.2 1.2 0.3 - vertex -8.575 1.425 0.3 - vertex -8.5 1.3 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.2 -1.8 0.3 - vertex 9.4 -2.6 0.3 - vertex -1.3 0.8 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -1.3 0.8 0.3 - vertex 9.4 -2.6 0.3 - vertex -1.825 1.1 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -1.825 1.1 0.3 - vertex -8.5 3.7 0.3 - vertex -8.6 3.6 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -2.4 2.22045e-16 0.3 - vertex -8.2 2.22045e-16 0.3 - vertex -2.2 -2.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.425 1.225 0.3 - vertex 3.6 1.2 0.3 - vertex 3.3 1.3 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 9.55 -2.575 0.3 - vertex 9.6 -2.5 0.3 - vertex -8.2 3.8 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.6 3.6 0.3 - vertex -2.4 1.2 0.3 - vertex -1.825 1.1 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -2.4 3.8 0.3 - vertex -8.2 3.8 0.3 - vertex -2.2 3 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -0.8 -0.4 0.3 - vertex 1.925 -2.975 0.3 - vertex 1.8 -2.4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -0.8 -0.4 0.3 - vertex 2.3 -3.5 0.3 - vertex 1.925 -2.975 0.3 - endloop - endfacet - facet normal -0 -0 1 - outer loop - vertex 2.875 -3.875 0.3 - vertex -0.8 -2.4 0.3 - vertex 41.6603 -19.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -2.4 -4 0.3 - vertex -8.2 -4 0.3 - vertex 33 -24.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 13.8 -4 0.3 - vertex 13.8 5.2 0.3 - vertex 10.875 4.175 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.225 1.425 0.3 - vertex 3.3 1.3 0.3 - vertex 3.6 1.2 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex 40.0711 -21.5711 0.3 - vertex -1.825 -3.875 0.3 - vertex 38 -23.1603 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.375 1.225 0.3 - vertex -8.2 1.2 0.3 - vertex -8.5 1.3 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -1.825 -3.875 0.3 - vertex -2.4 -4 0.3 - vertex 38 -23.1603 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.2 2.22045e-16 0.3 - vertex -2.4 -2.6 0.3 - vertex -2.25 -2.575 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 1.8 -1.8 0.3 - vertex 3.2 -1.8 0.3 - vertex -0.8 -0.4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -22 -2.4 0.3 - vertex -24.6 5 0.3 - vertex -28.2 0.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 33 -24.5 0.3 - vertex -8.925 -3.875 0.3 - vertex -12.6 -2.4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 33 -24.5 0.3 - vertex -8.2 -4 0.3 - vertex -8.925 -3.875 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.425 -2.575 0.3 - vertex 3.6 -2.6 0.3 - vertex 3.3 -2.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -28.2 0.6 0.3 - vertex -24.6 -3.8 0.3 - vertex -20.925 -3.875 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -22 -2.4 0.3 - vertex -22 3.6 0.3 - vertex -24.6 5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -2.4 -4 0.3 - vertex 35.5882 -24.1593 0.3 - vertex 38 -23.1603 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -1.825 1.1 0.3 - vertex 9.4 -2.6 0.3 - vertex -8.5 3.7 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -10 1.6 0.3 - vertex -10 3.6 0.3 - vertex -13.1 4.7 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -12.6 3.6 0.3 - vertex -9.875 0.9 0.3 - vertex -10 1.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 10.875 4.175 0.3 - vertex 13.8 5.2 0.3 - vertex 10.5 4.7 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 10.5 -3.5 0.3 - vertex 9.975 -3.875 0.3 - vertex 43 -14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 10.5 0.8 0.3 - vertex 9.6 3 0.3 - vertex 9.975 1.1 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.2 -2.4 0.3 - vertex 3.3 -2.5 0.3 - vertex 3.6 -2.6 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -8.375 3.775 0.3 - vertex -8.5 3.7 0.3 - vertex 9.4 -2.6 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -8.2 3.8 0.3 - vertex -8.375 3.775 0.3 - vertex 9.55 -2.575 0.3 - endloop - endfacet - facet normal -0 -0 1 - outer loop - vertex 2.875 0.1 0.3 - vertex -8.2 3.8 0.3 - vertex 9.6 -2.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 11 -2.4 0.3 - vertex 10.875 -2.975 0.3 - vertex 13.8 -4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 1.8 1.6 0.3 - vertex -0.925 4.175 0.3 - vertex -0.8 3.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 9.4 2.22045e-16 0.3 - vertex 9.6 -0.1 0.3 - vertex 9.55 -0.025 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.6 5.2 0.3 - vertex 9.4 5.2 0.3 - vertex 43 14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 1.8 1.6 0.3 - vertex -1.3 4.7 0.3 - vertex -0.925 4.175 0.3 - endloop - endfacet - facet normal -0 -0 1 - outer loop - vertex 3.6 2.22045e-16 0.3 - vertex 2.875 0.1 0.3 - vertex 9.6 -2.5 0.3 - endloop - endfacet - facet normal -0 -0 1 - outer loop - vertex 2.3 0.4 0.3 - vertex -8.2 3.8 0.3 - vertex 2.875 0.1 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 2.3 0.4 0.3 - vertex -2.2 3 0.3 - vertex -8.2 3.8 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 9.4 2.22045e-16 0.3 - vertex 3.6 2.22045e-16 0.3 - vertex 9.6 -2.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -0.8 3 0.3 - vertex -2.2 3 0.3 - vertex 1.8 1.6 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex 1.925 4.175 0.3 - vertex -1.825 5.075 0.3 - vertex 1.8 3.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 15.2 1.2 0.3 - vertex 20.8 1.2 0.3 - vertex 15.2 3.8 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex 2.3 4.7 0.3 - vertex -1.825 5.075 0.3 - vertex 1.925 4.175 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 2.875 5.075 0.3 - vertex -1.825 5.075 0.3 - vertex 2.3 4.7 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex -1.825 5.075 0.3 - vertex 2.875 5.075 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 9.6 3 0.3 - vertex 9.6 3.7 0.3 - vertex 3.2 3.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex 2.875 5.075 0.3 - vertex 3.6 5.2 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 22.2 -2.6 0.3 - vertex 22.2 -4 0.3 - vertex 43 -14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 22.2 3.8 0.3 - vertex 15.2 3.8 0.3 - vertex 20.8 1.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex 9.4 5.2 0.3 - vertex 9.975 5.075 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.3 3.7 0.3 - vertex 9.6 3.7 0.3 - vertex 9.55 3.775 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 9.4 3.8 0.3 - vertex 3.425 3.775 0.3 - vertex 3.3 3.7 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 9.4 3.8 0.3 - vertex 3.6 3.8 0.3 - vertex 3.425 3.775 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.2 3.6 0.3 - vertex 9.4 1.2 0.3 - vertex 9.6 3 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 3.3 3.7 0.3 - vertex 3.2 3.6 0.3 - vertex 9.6 3.7 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.3 3.7 0.3 - vertex 9.55 3.775 0.3 - vertex 9.4 3.8 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 9.4 -4 0.3 - vertex 41.6603 -19.5 0.3 - vertex 42.6593 -17.0882 0.3 - endloop - endfacet - facet normal -0 -0 1 - outer loop - vertex 25 -4 0.3 - vertex 22.2 -2.6 0.3 - vertex 43 -14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 9.4 2.22045e-16 0.3 - vertex 9.6 -2.5 0.3 - vertex 9.6 -0.1 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 9.4 -4 0.3 - vertex 3.6 -4 0.3 - vertex 41.6603 -19.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 22.2 -4 0.3 - vertex 13.8 -4 0.3 - vertex 43 -14.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 9.6 3 0.3 - vertex 9.4 1.2 0.3 - vertex 9.975 1.1 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.6 1.2 0.3 - vertex 9.4 1.2 0.3 - vertex 3.2 3.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.6 1.2 0.3 - vertex 3.2 3.6 0.3 - vertex 3.2 1.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 1.8 1.6 0.3 - vertex 1.8 3.6 0.3 - vertex -1.3 4.7 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 13.8 -4 0.3 - vertex 11 -0.4 0.3 - vertex 11 -2.4 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 20.8 2.22045e-16 0.3 - vertex 15.2 2.22045e-16 0.3 - vertex 22.2 -2.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.2 1.2 0.3 - vertex -2.4 1.2 0.3 - vertex -8.6 3.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.6 1.2 0.3 - vertex 3.2 1.6 0.3 - vertex 3.225 1.425 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex 43 -14.5 0.3 - vertex 9.4 -4 0.3 - vertex 42.6593 -17.0882 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 1.8 1.6 0.3 - vertex -0.8 3.6 0.3 - vertex -0.8 3 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 13.8 -4 0.3 - vertex 9.6 3 0.3 - vertex 10.875 0.3 0.3 - endloop - endfacet - facet normal -0 -0 1 - outer loop - vertex 3.6 -4 0.3 - vertex 2.875 -3.875 0.3 - vertex 41.6603 -19.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 13.8 -4 0.3 - vertex 11 3 0.3 - vertex 9.6 3 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 13.8 -4 0.3 - vertex 11 3.6 0.3 - vertex 11 3 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 2.875 -3.875 0.3 - vertex 2.3 -3.5 0.3 - vertex -0.8 -2.4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 3.6 -2.6 0.3 - vertex 9.4 -2.6 0.3 - vertex 3.2 -1.8 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 10.875 -2.975 0.3 - vertex 10.5 -3.5 0.3 - vertex 43 -14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 20.8 2.22045e-16 0.3 - vertex 22.2 -2.6 0.3 - vertex 25 -4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex 9.975 5.075 0.3 - vertex 13.8 5.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex 13.8 5.2 0.3 - vertex 22.2 5.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 25 -4 0.3 - vertex 22.2 3.8 0.3 - vertex 20.8 1.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 25 -4 0.3 - vertex 22.2 5.2 0.3 - vertex 22.2 3.8 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 15.2 -2.6 0.3 - vertex 22.2 -2.6 0.3 - vertex 15.2 2.22045e-16 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 25 -4 0.3 - vertex 20.8 1.2 0.3 - vertex 20.8 2.22045e-16 0.3 - endloop - endfacet - facet normal -0 -0 1 - outer loop - vertex 13.8 -4 0.3 - vertex 10.875 -2.975 0.3 - vertex 43 -14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 1.925 0.9 0.3 - vertex 1.8 1.6 0.3 - vertex -2.2 3 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 34.2 -4 0.3 - vertex 25 -4 0.3 - vertex 43 -14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex 22.2 5.2 0.3 - vertex 25 5.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex 25 5.2 0.3 - vertex 26.4 5.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 25 -4 0.3 - vertex 25 5.2 0.3 - vertex 22.2 5.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex 34.2 -2.6 0.3 - vertex 43 -14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex 43 14.5 0.3 - vertex 26.4 5.2 0.3 - vertex 34.2 -2.6 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 34.2 -2.6 0.3 - vertex 34.2 -4 0.3 - vertex 43 -14.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -13.1 -3.5 0.3 - vertex -13.675 -3.875 0.3 - vertex 33 -24.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.2 -2.6 0.3 - vertex -2.4 -2.6 0.3 - vertex -8.925 0.1 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -32 5.2 0.3 - vertex -32 1.2 0.3 - vertex -29.6 1.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -29.6 1.2 0.3 - vertex -26.2 5.2 0.3 - vertex -32 5.2 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.2 -2.6 0.3 - vertex -8.925 0.1 0.3 - vertex -9.5 0.4 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex 9.975 -3.875 0.3 - vertex 9.4 -4 0.3 - vertex 43 -14.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.2 -2.6 0.3 - vertex -9.5 0.4 0.3 - vertex -8.6 -1.8 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.2 -2.6 0.3 - vertex -8.6 -1.8 0.3 - vertex -8.6 -2.4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -22 3.6 0.3 - vertex -24.6 5.2 0.3 - vertex -24.6 5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -20.2 5.2 0.3 - vertex -14.4 5.2 0.3 - vertex -43 14.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -0.925 -2.975 0.3 - vertex -1.3 -3.5 0.3 - vertex 40.0711 -21.5711 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -0.925 -2.975 0.3 - vertex 40.0711 -21.5711 0.3 - vertex 41.6603 -19.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -12.6 3.6 0.3 - vertex -8.6 -1.8 0.3 - vertex -9.5 0.4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.6 -2.4 0.3 - vertex -8.5 -2.5 0.3 - vertex -8.2 -2.6 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.375 -2.575 0.3 - vertex -8.2 -2.6 0.3 - vertex -8.5 -2.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -12.6 3.6 0.3 - vertex -10 -2.4 0.3 - vertex -10 -1.8 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -8.925 -3.875 0.3 - vertex -9.5 -3.5 0.3 - vertex -12.6 -2.4 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -12.6 3.6 0.3 - vertex -9.875 -2.975 0.3 - vertex -10 -2.4 0.3 - endloop - endfacet - facet normal -0 -0 1 - outer loop - vertex -9.875 -2.975 0.3 - vertex -12.6 -2.4 0.3 - vertex -9.5 -3.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -12.6 3.6 0.3 - vertex -12.6 -2.4 0.3 - vertex -9.875 -2.975 0.3 - endloop - endfacet - facet normal -0.92388 -0.382683 -0 - outer loop - vertex -42.6593 -17.0882 -0.1 - vertex -41.6603 -19.5 -0.1 - vertex -42.6593 -17.0882 0.3 - endloop - endfacet - facet normal -0.92388 -0.382683 0 - outer loop - vertex -42.6593 -17.0882 0.3 - vertex -41.6603 -19.5 -0.1 - vertex -41.6603 -19.5 0.3 - endloop - endfacet - facet normal -0.793353 -0.608761 -0 - outer loop - vertex -41.6603 -19.5 -0.1 - vertex -40.0711 -21.5711 -0.1 - vertex -41.6603 -19.5 0.3 - endloop - endfacet - facet normal -0.793353 -0.608761 0 - outer loop - vertex -41.6603 -19.5 0.3 - vertex -40.0711 -21.5711 -0.1 - vertex -40.0711 -21.5711 0.3 - endloop - endfacet - facet normal -0.608761 -0.793353 0 - outer loop - vertex -40.0711 -21.5711 0.3 - vertex -40.0711 -21.5711 -0.1 - vertex -38 -23.1603 -0.1 - endloop - endfacet - facet normal -0.608761 -0.793353 0 - outer loop - vertex -38 -23.1603 0.3 - vertex -40.0711 -21.5711 0.3 - vertex -38 -23.1603 -0.1 - endloop - endfacet - facet normal -0.382683 -0.92388 0 - outer loop - vertex -38 -23.1603 0.3 - vertex -38 -23.1603 -0.1 - vertex -35.5882 -24.1593 -0.1 - endloop - endfacet - facet normal -0.382683 -0.92388 0 - outer loop - vertex -35.5882 -24.1593 0.3 - vertex -38 -23.1603 0.3 - vertex -35.5882 -24.1593 -0.1 - endloop - endfacet - facet normal -0.130526 -0.991445 0 - outer loop - vertex -35.5882 -24.1593 0.3 - vertex -35.5882 -24.1593 -0.1 - vertex -33 -24.5 -0.1 - endloop - endfacet - facet normal -0.130526 -0.991445 0 - outer loop - vertex -33 -24.5 0.3 - vertex -35.5882 -24.1593 0.3 - vertex -33 -24.5 -0.1 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex -33 -24.5 0.3 - vertex -33 -24.5 -0.1 - vertex 33 -24.5 -0.1 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex 33 -24.5 0.3 - vertex -33 -24.5 0.3 - vertex 33 -24.5 -0.1 - endloop - endfacet - facet normal 0.130526 -0.991445 0 - outer loop - vertex 33 -24.5 0.3 - vertex 33 -24.5 -0.1 - vertex 35.5882 -24.1593 -0.1 - endloop - endfacet - facet normal 0.130526 -0.991445 0 - outer loop - vertex 35.5882 -24.1593 0.3 - vertex 33 -24.5 0.3 - vertex 35.5882 -24.1593 -0.1 - endloop - endfacet - facet normal 0.382683 -0.92388 0 - outer loop - vertex 35.5882 -24.1593 0.3 - vertex 35.5882 -24.1593 -0.1 - vertex 38 -23.1603 -0.1 - endloop - endfacet - facet normal 0.382683 -0.92388 0 - outer loop - vertex 38 -23.1603 0.3 - vertex 35.5882 -24.1593 0.3 - vertex 38 -23.1603 -0.1 - endloop - endfacet - facet normal 0.608761 -0.793353 0 - outer loop - vertex 38 -23.1603 0.3 - vertex 38 -23.1603 -0.1 - vertex 40.0711 -21.5711 -0.1 - endloop - endfacet - facet normal 0.608761 -0.793353 0 - outer loop - vertex 40.0711 -21.5711 0.3 - vertex 38 -23.1603 0.3 - vertex 40.0711 -21.5711 -0.1 - endloop - endfacet - facet normal 0.793353 -0.608761 0 - outer loop - vertex 40.0711 -21.5711 0.3 - vertex 40.0711 -21.5711 -0.1 - vertex 41.6603 -19.5 -0.1 - endloop - endfacet - facet normal 0.793353 -0.608761 0 - outer loop - vertex 41.6603 -19.5 0.3 - vertex 40.0711 -21.5711 0.3 - vertex 41.6603 -19.5 -0.1 - endloop - endfacet - facet normal 0.92388 -0.382683 0 - outer loop - vertex 41.6603 -19.5 0.3 - vertex 41.6603 -19.5 -0.1 - vertex 42.6593 -17.0882 -0.1 - endloop - endfacet - facet normal 0.92388 -0.382683 0 - outer loop - vertex 42.6593 -17.0882 0.3 - vertex 41.6603 -19.5 0.3 - vertex 42.6593 -17.0882 -0.1 - endloop - endfacet - facet normal 0.991445 -0.130526 0 - outer loop - vertex 42.6593 -17.0882 0.3 - vertex 42.6593 -17.0882 -0.1 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal 0.991445 -0.130526 0 - outer loop - vertex 43 -14.5 0.3 - vertex 42.6593 -17.0882 0.3 - vertex 43 -14.5 -0.1 - endloop - endfacet - facet normal 1 0 -0 - outer loop - vertex 43 -14.5 0.3 - vertex 43 -14.5 -0.1 - vertex 43 14.5 -0.1 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 43 14.5 0.3 - vertex 43 -14.5 0.3 - vertex 43 14.5 -0.1 - endloop - endfacet - facet normal 0.991445 0.130526 0 - outer loop - vertex 43 14.5 -0.1 - vertex 42.6593 17.0882 -0.1 - vertex 42.6593 17.0882 0.3 - endloop - endfacet - facet normal 0.991445 0.130526 -0 - outer loop - vertex 43 14.5 0.3 - vertex 43 14.5 -0.1 - vertex 42.6593 17.0882 0.3 - endloop - endfacet - facet normal 0.92388 0.382683 0 - outer loop - vertex 42.6593 17.0882 -0.1 - vertex 41.6603 19.5 -0.1 - vertex 41.6603 19.5 0.3 - endloop - endfacet - facet normal 0.92388 0.382683 -0 - outer loop - vertex 42.6593 17.0882 0.3 - vertex 42.6593 17.0882 -0.1 - vertex 41.6603 19.5 0.3 - endloop - endfacet - facet normal 0.793353 0.608761 0 - outer loop - vertex 41.6603 19.5 -0.1 - vertex 40.0711 21.5711 -0.1 - vertex 40.0711 21.5711 0.3 - endloop - endfacet - facet normal 0.793353 0.608761 -0 - outer loop - vertex 41.6603 19.5 0.3 - vertex 41.6603 19.5 -0.1 - vertex 40.0711 21.5711 0.3 - endloop - endfacet - facet normal 0.608761 0.793353 0 - outer loop - vertex 38 23.1603 -0.1 - vertex 38 23.1603 0.3 - vertex 40.0711 21.5711 -0.1 - endloop - endfacet - facet normal 0.608761 0.793353 0 - outer loop - vertex 40.0711 21.5711 -0.1 - vertex 38 23.1603 0.3 - vertex 40.0711 21.5711 0.3 - endloop - endfacet - facet normal 0.382683 0.92388 0 - outer loop - vertex 35.5882 24.1593 -0.1 - vertex 35.5882 24.1593 0.3 - vertex 38 23.1603 -0.1 - endloop - endfacet - facet normal 0.382683 0.92388 0 - outer loop - vertex 38 23.1603 -0.1 - vertex 35.5882 24.1593 0.3 - vertex 38 23.1603 0.3 - endloop - endfacet - facet normal 0.130526 0.991445 0 - outer loop - vertex 33 24.5 -0.1 - vertex 33 24.5 0.3 - vertex 35.5882 24.1593 -0.1 - endloop - endfacet - facet normal 0.130526 0.991445 0 - outer loop - vertex 35.5882 24.1593 -0.1 - vertex 33 24.5 0.3 - vertex 35.5882 24.1593 0.3 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex -33 24.5 -0.1 - vertex -33 24.5 0.3 - vertex 33 24.5 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex 33 24.5 -0.1 - vertex -33 24.5 0.3 - vertex 33 24.5 0.3 - endloop - endfacet - facet normal -0.130526 0.991445 0 - outer loop - vertex -35.5882 24.1593 -0.1 - vertex -35.5882 24.1593 0.3 - vertex -33 24.5 -0.1 - endloop - endfacet - facet normal -0.130526 0.991445 0 - outer loop - vertex -33 24.5 -0.1 - vertex -35.5882 24.1593 0.3 - vertex -33 24.5 0.3 - endloop - endfacet - facet normal -0.382683 0.92388 0 - outer loop - vertex -38 23.1603 -0.1 - vertex -38 23.1603 0.3 - vertex -35.5882 24.1593 -0.1 - endloop - endfacet - facet normal -0.382683 0.92388 0 - outer loop - vertex -35.5882 24.1593 -0.1 - vertex -38 23.1603 0.3 - vertex -35.5882 24.1593 0.3 - endloop - endfacet - facet normal -0.608761 0.793353 0 - outer loop - vertex -40.0711 21.5711 -0.1 - vertex -40.0711 21.5711 0.3 - vertex -38 23.1603 -0.1 - endloop - endfacet - facet normal -0.608761 0.793353 0 - outer loop - vertex -38 23.1603 -0.1 - vertex -40.0711 21.5711 0.3 - vertex -38 23.1603 0.3 - endloop - endfacet - facet normal -0.793353 0.608761 0 - outer loop - vertex -41.6603 19.5 -0.1 - vertex -41.6603 19.5 0.3 - vertex -40.0711 21.5711 -0.1 - endloop - endfacet - facet normal -0.793353 0.608761 0 - outer loop - vertex -40.0711 21.5711 -0.1 - vertex -41.6603 19.5 0.3 - vertex -40.0711 21.5711 0.3 - endloop - endfacet - facet normal -0.92388 0.382683 0 - outer loop - vertex -42.6593 17.0882 -0.1 - vertex -42.6593 17.0882 0.3 - vertex -41.6603 19.5 -0.1 - endloop - endfacet - facet normal -0.92388 0.382683 0 - outer loop - vertex -41.6603 19.5 -0.1 - vertex -42.6593 17.0882 0.3 - vertex -41.6603 19.5 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex -32 5.2 -0.1 - vertex -32 5.2 0.3 - vertex -33.4 5.2 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex -33.4 5.2 -0.1 - vertex -32 5.2 -0.1 - vertex -33.4 5.2 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -33.4 5.2 -0.1 - vertex -33.4 5.2 0.3 - vertex -33.4 -4 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -33.4 -4 -0.1 - vertex -33.4 5.2 -0.1 - vertex -33.4 -4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -32 5.2 0.3 - vertex -32 5.2 -0.1 - vertex -32 1.2 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -32 1.2 0.3 - vertex -32 5.2 -0.1 - vertex -32 1.2 -0.1 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex -29.6 1.2 -0.1 - vertex -29.6 1.2 0.3 - vertex -32 1.2 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex -32 1.2 -0.1 - vertex -29.6 1.2 -0.1 - vertex -32 1.2 0.3 - endloop - endfacet - facet normal 0.761939 -0.647648 0 - outer loop - vertex -26.2 5.2 -0.1 - vertex -26.2 5.2 0.3 - vertex -29.6 1.2 0.3 - endloop - endfacet - facet normal 0.761939 -0.647648 0 - outer loop - vertex -29.6 1.2 -0.1 - vertex -26.2 5.2 -0.1 - vertex -29.6 1.2 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex -24.6 5.2 -0.1 - vertex -24.6 5.2 0.3 - vertex -26.2 5.2 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex -26.2 5.2 -0.1 - vertex -24.6 5.2 -0.1 - vertex -26.2 5.2 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -24.6 5.2 0.3 - vertex -24.6 5.2 -0.1 - vertex -24.6 5 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -24.6 5 0.3 - vertex -24.6 5.2 -0.1 - vertex -24.6 5 -0.1 - endloop - endfacet - facet normal -0.773957 0.633238 0 - outer loop - vertex -24.6 5 0.3 - vertex -24.6 5 -0.1 - vertex -28.2 0.6 0.3 - endloop - endfacet - facet normal -0.773957 0.633238 0 - outer loop - vertex -28.2 0.6 0.3 - vertex -24.6 5 -0.1 - vertex -28.2 0.6 -0.1 - endloop - endfacet - facet normal -0.773957 -0.633238 0 - outer loop - vertex -24.6 -3.8 0.3 - vertex -28.2 0.6 0.3 - vertex -24.6 -3.8 -0.1 - endloop - endfacet - facet normal -0.773957 -0.633238 0 - outer loop - vertex -24.6 -3.8 -0.1 - vertex -28.2 0.6 0.3 - vertex -28.2 0.6 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -24.6 -3.8 0.3 - vertex -24.6 -3.8 -0.1 - vertex -24.6 -4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -24.6 -4 0.3 - vertex -24.6 -3.8 -0.1 - vertex -24.6 -4 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex -24.6 -4 0.3 - vertex -24.6 -4 -0.1 - vertex -26.2 -4 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex -26.2 -4 0.3 - vertex -24.6 -4 -0.1 - vertex -26.2 -4 -0.1 - endloop - endfacet - facet normal 0.761939 0.647648 0 - outer loop - vertex -29.6 2.22045e-16 0.3 - vertex -26.2 -4 0.3 - vertex -26.2 -4 -0.1 - endloop - endfacet - facet normal 0.761939 0.647648 0 - outer loop - vertex -29.6 2.22045e-16 -0.1 - vertex -29.6 2.22045e-16 0.3 - vertex -26.2 -4 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex -29.6 2.22045e-16 0.3 - vertex -29.6 2.22045e-16 -0.1 - vertex -32 2.22045e-16 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex -32 2.22045e-16 0.3 - vertex -29.6 2.22045e-16 -0.1 - vertex -32 2.22045e-16 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -32 2.22045e-16 0.3 - vertex -32 2.22045e-16 -0.1 - vertex -32 -4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -32 -4 0.3 - vertex -32 2.22045e-16 -0.1 - vertex -32 -4 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex -32 -4 0.3 - vertex -32 -4 -0.1 - vertex -33.4 -4 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex -33.4 -4 0.3 - vertex -32 -4 -0.1 - vertex -33.4 -4 -0.1 - endloop - endfacet - facet normal 0.977176 -0.21243 0 - outer loop - vertex -21.875 4.175 -0.1 - vertex -21.875 4.175 0.3 - vertex -22 3.6 0.3 - endloop - endfacet - facet normal 0.977176 -0.21243 0 - outer loop - vertex -22 3.6 -0.1 - vertex -21.875 4.175 -0.1 - vertex -22 3.6 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -22 3.6 -0.1 - vertex -22 3.6 0.3 - vertex -22 -2.4 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -22 -2.4 -0.1 - vertex -22 3.6 -0.1 - vertex -22 -2.4 0.3 - endloop - endfacet - facet normal 0.813733 -0.581238 0 - outer loop - vertex -21.5 4.7 -0.1 - vertex -21.5 4.7 0.3 - vertex -21.875 4.175 0.3 - endloop - endfacet - facet normal 0.813733 -0.581238 0 - outer loop - vertex -21.875 4.175 -0.1 - vertex -21.5 4.7 -0.1 - vertex -21.875 4.175 0.3 - endloop - endfacet - facet normal 0.546268 -0.837611 0 - outer loop - vertex -20.925 5.075 -0.1 - vertex -20.925 5.075 0.3 - vertex -21.5 4.7 0.3 - endloop - endfacet - facet normal 0.546268 -0.837611 0 - outer loop - vertex -21.5 4.7 -0.1 - vertex -20.925 5.075 -0.1 - vertex -21.5 4.7 0.3 - endloop - endfacet - facet normal 0.169907 -0.98546 0 - outer loop - vertex -20.2 5.2 -0.1 - vertex -20.2 5.2 0.3 - vertex -20.925 5.075 0.3 - endloop - endfacet - facet normal 0.169907 -0.98546 0 - outer loop - vertex -20.925 5.075 -0.1 - vertex -20.2 5.2 -0.1 - vertex -20.925 5.075 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex -14.4 5.2 -0.1 - vertex -14.4 5.2 0.3 - vertex -20.2 5.2 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex -20.2 5.2 -0.1 - vertex -14.4 5.2 -0.1 - vertex -20.2 5.2 0.3 - endloop - endfacet - facet normal -0.169907 -0.98546 -0 - outer loop - vertex -13.675 5.075 -0.1 - vertex -13.675 5.075 0.3 - vertex -14.4 5.2 0.3 - endloop - endfacet - facet normal -0.169907 -0.98546 -0 - outer loop - vertex -14.4 5.2 -0.1 - vertex -13.675 5.075 -0.1 - vertex -14.4 5.2 0.3 - endloop - endfacet - facet normal -0.546268 -0.837611 -0 - outer loop - vertex -13.1 4.7 -0.1 - vertex -13.1 4.7 0.3 - vertex -13.675 5.075 0.3 - endloop - endfacet - facet normal -0.546268 -0.837611 -0 - outer loop - vertex -13.675 5.075 -0.1 - vertex -13.1 4.7 -0.1 - vertex -13.675 5.075 0.3 - endloop - endfacet - facet normal -0.813733 -0.581238 0 - outer loop - vertex -12.725 4.175 0.3 - vertex -13.1 4.7 0.3 - vertex -12.725 4.175 -0.1 - endloop - endfacet - facet normal -0.813733 -0.581238 0 - outer loop - vertex -12.725 4.175 -0.1 - vertex -13.1 4.7 0.3 - vertex -13.1 4.7 -0.1 - endloop - endfacet - facet normal -0.977176 -0.21243 0 - outer loop - vertex -12.6 3.6 0.3 - vertex -12.725 4.175 0.3 - vertex -12.6 3.6 -0.1 - endloop - endfacet - facet normal -0.977176 -0.21243 0 - outer loop - vertex -12.6 3.6 -0.1 - vertex -12.725 4.175 0.3 - vertex -12.725 4.175 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -12.6 3.6 0.3 - vertex -12.6 3.6 -0.1 - vertex -12.6 -2.4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -12.6 -2.4 0.3 - vertex -12.6 3.6 -0.1 - vertex -12.6 -2.4 -0.1 - endloop - endfacet - facet normal -0.977176 0.21243 0 - outer loop - vertex -12.6 -2.4 0.3 - vertex -12.6 -2.4 -0.1 - vertex -12.725 -2.975 0.3 - endloop - endfacet - facet normal -0.977176 0.21243 0 - outer loop - vertex -12.725 -2.975 0.3 - vertex -12.6 -2.4 -0.1 - vertex -12.725 -2.975 -0.1 - endloop - endfacet - facet normal -0.813733 0.581238 0 - outer loop - vertex -12.725 -2.975 0.3 - vertex -12.725 -2.975 -0.1 - vertex -13.1 -3.5 0.3 - endloop - endfacet - facet normal -0.813733 0.581238 0 - outer loop - vertex -13.1 -3.5 0.3 - vertex -12.725 -2.975 -0.1 - vertex -13.1 -3.5 -0.1 - endloop - endfacet - facet normal -0.546268 0.837611 0 - outer loop - vertex -13.1 -3.5 0.3 - vertex -13.1 -3.5 -0.1 - vertex -13.675 -3.875 0.3 - endloop - endfacet - facet normal -0.546268 0.837611 0 - outer loop - vertex -13.675 -3.875 0.3 - vertex -13.1 -3.5 -0.1 - vertex -13.675 -3.875 -0.1 - endloop - endfacet - facet normal -0.169907 0.98546 0 - outer loop - vertex -13.675 -3.875 0.3 - vertex -13.675 -3.875 -0.1 - vertex -14.4 -4 0.3 - endloop - endfacet - facet normal -0.169907 0.98546 0 - outer loop - vertex -14.4 -4 0.3 - vertex -13.675 -3.875 -0.1 - vertex -14.4 -4 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex -14.4 -4 0.3 - vertex -14.4 -4 -0.1 - vertex -20.2 -4 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex -20.2 -4 0.3 - vertex -14.4 -4 -0.1 - vertex -20.2 -4 -0.1 - endloop - endfacet - facet normal 0.169907 0.98546 -0 - outer loop - vertex -20.2 -4 0.3 - vertex -20.2 -4 -0.1 - vertex -20.925 -3.875 0.3 - endloop - endfacet - facet normal 0.169907 0.98546 -0 - outer loop - vertex -20.925 -3.875 0.3 - vertex -20.2 -4 -0.1 - vertex -20.925 -3.875 -0.1 - endloop - endfacet - facet normal 0.546268 0.837611 -0 - outer loop - vertex -20.925 -3.875 0.3 - vertex -20.925 -3.875 -0.1 - vertex -21.5 -3.5 0.3 - endloop - endfacet - facet normal 0.546268 0.837611 -0 - outer loop - vertex -21.5 -3.5 0.3 - vertex -20.925 -3.875 -0.1 - vertex -21.5 -3.5 -0.1 - endloop - endfacet - facet normal 0.813733 0.581238 0 - outer loop - vertex -21.875 -2.975 0.3 - vertex -21.5 -3.5 0.3 - vertex -21.5 -3.5 -0.1 - endloop - endfacet - facet normal 0.813733 0.581238 0 - outer loop - vertex -21.875 -2.975 -0.1 - vertex -21.875 -2.975 0.3 - vertex -21.5 -3.5 -0.1 - endloop - endfacet - facet normal 0.977176 0.21243 0 - outer loop - vertex -22 -2.4 0.3 - vertex -21.875 -2.975 0.3 - vertex -21.875 -2.975 -0.1 - endloop - endfacet - facet normal 0.977176 0.21243 0 - outer loop - vertex -22 -2.4 -0.1 - vertex -22 -2.4 0.3 - vertex -21.875 -2.975 -0.1 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -10 -1.8 -0.1 - vertex -10 -1.8 0.3 - vertex -10 -2.4 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -10 -2.4 -0.1 - vertex -10 -1.8 -0.1 - vertex -10 -2.4 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex -8.6 -1.8 -0.1 - vertex -8.6 -1.8 0.3 - vertex -10 -1.8 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex -10 -1.8 -0.1 - vertex -8.6 -1.8 -0.1 - vertex -10 -1.8 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -8.6 -1.8 0.3 - vertex -8.6 -1.8 -0.1 - vertex -8.6 -2.4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -8.6 -2.4 0.3 - vertex -8.6 -1.8 -0.1 - vertex -8.6 -2.4 -0.1 - endloop - endfacet - facet normal -0.707107 -0.707107 -0 - outer loop - vertex -8.5 -2.5 -0.1 - vertex -8.5 -2.5 0.3 - vertex -8.6 -2.4 0.3 - endloop - endfacet - facet normal -0.707107 -0.707107 -0 - outer loop - vertex -8.6 -2.4 -0.1 - vertex -8.5 -2.5 -0.1 - vertex -8.6 -2.4 0.3 - endloop - endfacet - facet normal -0.514496 -0.857493 -0 - outer loop - vertex -8.375 -2.575 -0.1 - vertex -8.375 -2.575 0.3 - vertex -8.5 -2.5 0.3 - endloop - endfacet - facet normal -0.514496 -0.857493 -0 - outer loop - vertex -8.5 -2.5 -0.1 - vertex -8.375 -2.575 -0.1 - vertex -8.5 -2.5 0.3 - endloop - endfacet - facet normal -0.141421 -0.989949 -0 - outer loop - vertex -8.2 -2.6 -0.1 - vertex -8.2 -2.6 0.3 - vertex -8.375 -2.575 0.3 - endloop - endfacet - facet normal -0.141421 -0.989949 -0 - outer loop - vertex -8.375 -2.575 -0.1 - vertex -8.2 -2.6 -0.1 - vertex -8.375 -2.575 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex -2.4 -2.6 -0.1 - vertex -2.4 -2.6 0.3 - vertex -8.2 -2.6 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex -8.2 -2.6 -0.1 - vertex -2.4 -2.6 -0.1 - vertex -8.2 -2.6 0.3 - endloop - endfacet - facet normal 0.164399 -0.986394 0 - outer loop - vertex -2.25 -2.575 -0.1 - vertex -2.25 -2.575 0.3 - vertex -2.4 -2.6 0.3 - endloop - endfacet - facet normal 0.164399 -0.986394 0 - outer loop - vertex -2.4 -2.6 -0.1 - vertex -2.25 -2.575 -0.1 - vertex -2.4 -2.6 0.3 - endloop - endfacet - facet normal 0.83205 -0.5547 0 - outer loop - vertex -2.2 -2.5 -0.1 - vertex -2.2 -2.5 0.3 - vertex -2.25 -2.575 0.3 - endloop - endfacet - facet normal 0.83205 -0.5547 0 - outer loop - vertex -2.25 -2.575 -0.1 - vertex -2.2 -2.5 -0.1 - vertex -2.25 -2.575 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -2.2 -0.1 -0.1 - vertex -2.2 -0.1 0.3 - vertex -2.2 -2.5 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -2.2 -2.5 -0.1 - vertex -2.2 -0.1 -0.1 - vertex -2.2 -2.5 0.3 - endloop - endfacet - facet normal 0.83205 0.5547 0 - outer loop - vertex -2.25 -0.025 0.3 - vertex -2.2 -0.1 0.3 - vertex -2.2 -0.1 -0.1 - endloop - endfacet - facet normal 0.83205 0.5547 0 - outer loop - vertex -2.25 -0.025 -0.1 - vertex -2.25 -0.025 0.3 - vertex -2.2 -0.1 -0.1 - endloop - endfacet - facet normal 0.164399 0.986394 -0 - outer loop - vertex -2.25 -0.025 0.3 - vertex -2.25 -0.025 -0.1 - vertex -2.4 2.22045e-16 0.3 - endloop - endfacet - facet normal 0.164399 0.986394 -0 - outer loop - vertex -2.4 2.22045e-16 0.3 - vertex -2.25 -0.025 -0.1 - vertex -2.4 2.22045e-16 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex -2.4 2.22045e-16 0.3 - vertex -2.4 2.22045e-16 -0.1 - vertex -8.2 2.22045e-16 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex -8.2 2.22045e-16 0.3 - vertex -2.4 2.22045e-16 -0.1 - vertex -8.2 2.22045e-16 -0.1 - endloop - endfacet - facet normal 0.136637 0.990621 -0 - outer loop - vertex -8.2 2.22045e-16 0.3 - vertex -8.2 2.22045e-16 -0.1 - vertex -8.925 0.1 0.3 - endloop - endfacet - facet normal 0.136637 0.990621 -0 - outer loop - vertex -8.925 0.1 0.3 - vertex -8.2 2.22045e-16 -0.1 - vertex -8.925 0.1 -0.1 - endloop - endfacet - facet normal 0.462566 0.886585 -0 - outer loop - vertex -8.925 0.1 0.3 - vertex -8.925 0.1 -0.1 - vertex -9.5 0.4 0.3 - endloop - endfacet - facet normal 0.462566 0.886585 -0 - outer loop - vertex -9.5 0.4 0.3 - vertex -8.925 0.1 -0.1 - vertex -9.5 0.4 -0.1 - endloop - endfacet - facet normal 0.8 0.6 0 - outer loop - vertex -9.875 0.9 0.3 - vertex -9.5 0.4 0.3 - vertex -9.5 0.4 -0.1 - endloop - endfacet - facet normal 0.8 0.6 0 - outer loop - vertex -9.875 0.9 -0.1 - vertex -9.875 0.9 0.3 - vertex -9.5 0.4 -0.1 - endloop - endfacet - facet normal 0.984428 0.175791 0 - outer loop - vertex -10 1.6 0.3 - vertex -9.875 0.9 0.3 - vertex -9.875 0.9 -0.1 - endloop - endfacet - facet normal 0.984428 0.175791 0 - outer loop - vertex -10 1.6 -0.1 - vertex -10 1.6 0.3 - vertex -9.875 0.9 -0.1 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -10 3.6 -0.1 - vertex -10 3.6 0.3 - vertex -10 1.6 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -10 1.6 -0.1 - vertex -10 3.6 -0.1 - vertex -10 1.6 0.3 - endloop - endfacet - facet normal 0.977176 -0.21243 0 - outer loop - vertex -9.875 4.175 -0.1 - vertex -9.875 4.175 0.3 - vertex -10 3.6 0.3 - endloop - endfacet - facet normal 0.977176 -0.21243 0 - outer loop - vertex -10 3.6 -0.1 - vertex -9.875 4.175 -0.1 - vertex -10 3.6 0.3 - endloop - endfacet - facet normal 0.813733 -0.581238 0 - outer loop - vertex -9.5 4.7 -0.1 - vertex -9.5 4.7 0.3 - vertex -9.875 4.175 0.3 - endloop - endfacet - facet normal 0.813733 -0.581238 0 - outer loop - vertex -9.875 4.175 -0.1 - vertex -9.5 4.7 -0.1 - vertex -9.875 4.175 0.3 - endloop - endfacet - facet normal 0.546268 -0.837611 0 - outer loop - vertex -8.925 5.075 -0.1 - vertex -8.925 5.075 0.3 - vertex -9.5 4.7 0.3 - endloop - endfacet - facet normal 0.546268 -0.837611 0 - outer loop - vertex -9.5 4.7 -0.1 - vertex -8.925 5.075 -0.1 - vertex -9.5 4.7 0.3 - endloop - endfacet - facet normal 0.169907 -0.98546 0 - outer loop - vertex -8.2 5.2 -0.1 - vertex -8.2 5.2 0.3 - vertex -8.925 5.075 0.3 - endloop - endfacet - facet normal 0.169907 -0.98546 0 - outer loop - vertex -8.925 5.075 -0.1 - vertex -8.2 5.2 -0.1 - vertex -8.925 5.075 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex -2.4 5.2 -0.1 - vertex -2.4 5.2 0.3 - vertex -8.2 5.2 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex -8.2 5.2 -0.1 - vertex -2.4 5.2 -0.1 - vertex -8.2 5.2 0.3 - endloop - endfacet - facet normal -0.21243 -0.977176 -0 - outer loop - vertex -1.825 5.075 -0.1 - vertex -1.825 5.075 0.3 - vertex -2.4 5.2 0.3 - endloop - endfacet - facet normal -0.21243 -0.977176 -0 - outer loop - vertex -2.4 5.2 -0.1 - vertex -1.825 5.075 -0.1 - vertex -2.4 5.2 0.3 - endloop - endfacet - facet normal -0.581238 -0.813733 -0 - outer loop - vertex -1.3 4.7 -0.1 - vertex -1.3 4.7 0.3 - vertex -1.825 5.075 0.3 - endloop - endfacet - facet normal -0.581238 -0.813733 -0 - outer loop - vertex -1.825 5.075 -0.1 - vertex -1.3 4.7 -0.1 - vertex -1.825 5.075 0.3 - endloop - endfacet - facet normal -0.813733 -0.581238 0 - outer loop - vertex -0.925 4.175 0.3 - vertex -1.3 4.7 0.3 - vertex -0.925 4.175 -0.1 - endloop - endfacet - facet normal -0.813733 -0.581238 0 - outer loop - vertex -0.925 4.175 -0.1 - vertex -1.3 4.7 0.3 - vertex -1.3 4.7 -0.1 - endloop - endfacet - facet normal -0.977176 -0.21243 0 - outer loop - vertex -0.8 3.6 0.3 - vertex -0.925 4.175 0.3 - vertex -0.8 3.6 -0.1 - endloop - endfacet - facet normal -0.977176 -0.21243 0 - outer loop - vertex -0.8 3.6 -0.1 - vertex -0.925 4.175 0.3 - vertex -0.925 4.175 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -0.8 3.6 0.3 - vertex -0.8 3.6 -0.1 - vertex -0.8 3 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -0.8 3 0.3 - vertex -0.8 3.6 -0.1 - vertex -0.8 3 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex -0.8 3 0.3 - vertex -0.8 3 -0.1 - vertex -2.2 3 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex -2.2 3 0.3 - vertex -0.8 3 -0.1 - vertex -2.2 3 -0.1 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -2.2 3.7 -0.1 - vertex -2.2 3.7 0.3 - vertex -2.2 3 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -2.2 3 -0.1 - vertex -2.2 3.7 -0.1 - vertex -2.2 3 0.3 - endloop - endfacet - facet normal 0.83205 0.5547 0 - outer loop - vertex -2.25 3.775 0.3 - vertex -2.2 3.7 0.3 - vertex -2.2 3.7 -0.1 - endloop - endfacet - facet normal 0.83205 0.5547 0 - outer loop - vertex -2.25 3.775 -0.1 - vertex -2.25 3.775 0.3 - vertex -2.2 3.7 -0.1 - endloop - endfacet - facet normal 0.164399 0.986394 -0 - outer loop - vertex -2.25 3.775 0.3 - vertex -2.25 3.775 -0.1 - vertex -2.4 3.8 0.3 - endloop - endfacet - facet normal 0.164399 0.986394 -0 - outer loop - vertex -2.4 3.8 0.3 - vertex -2.25 3.775 -0.1 - vertex -2.4 3.8 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex -2.4 3.8 0.3 - vertex -2.4 3.8 -0.1 - vertex -8.2 3.8 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex -8.2 3.8 0.3 - vertex -2.4 3.8 -0.1 - vertex -8.2 3.8 -0.1 - endloop - endfacet - facet normal -0.141421 0.989949 0 - outer loop - vertex -8.2 3.8 0.3 - vertex -8.2 3.8 -0.1 - vertex -8.375 3.775 0.3 - endloop - endfacet - facet normal -0.141421 0.989949 0 - outer loop - vertex -8.375 3.775 0.3 - vertex -8.2 3.8 -0.1 - vertex -8.375 3.775 -0.1 - endloop - endfacet - facet normal -0.514496 0.857493 0 - outer loop - vertex -8.375 3.775 0.3 - vertex -8.375 3.775 -0.1 - vertex -8.5 3.7 0.3 - endloop - endfacet - facet normal -0.514496 0.857493 0 - outer loop - vertex -8.5 3.7 0.3 - vertex -8.375 3.775 -0.1 - vertex -8.5 3.7 -0.1 - endloop - endfacet - facet normal -0.707107 0.707107 0 - outer loop - vertex -8.5 3.7 0.3 - vertex -8.5 3.7 -0.1 - vertex -8.6 3.6 0.3 - endloop - endfacet - facet normal -0.707107 0.707107 0 - outer loop - vertex -8.6 3.6 0.3 - vertex -8.5 3.7 -0.1 - vertex -8.6 3.6 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -8.6 3.6 0.3 - vertex -8.6 3.6 -0.1 - vertex -8.6 1.6 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -8.6 1.6 0.3 - vertex -8.6 3.6 -0.1 - vertex -8.6 1.6 -0.1 - endloop - endfacet - facet normal -0.989949 -0.141421 0 - outer loop - vertex -8.575 1.425 0.3 - vertex -8.6 1.6 0.3 - vertex -8.575 1.425 -0.1 - endloop - endfacet - facet normal -0.989949 -0.141421 0 - outer loop - vertex -8.575 1.425 -0.1 - vertex -8.6 1.6 0.3 - vertex -8.6 1.6 -0.1 - endloop - endfacet - facet normal -0.857493 -0.514496 0 - outer loop - vertex -8.5 1.3 0.3 - vertex -8.575 1.425 0.3 - vertex -8.5 1.3 -0.1 - endloop - endfacet - facet normal -0.857493 -0.514496 0 - outer loop - vertex -8.5 1.3 -0.1 - vertex -8.575 1.425 0.3 - vertex -8.575 1.425 -0.1 - endloop - endfacet - facet normal -0.514496 -0.857493 -0 - outer loop - vertex -8.375 1.225 -0.1 - vertex -8.375 1.225 0.3 - vertex -8.5 1.3 0.3 - endloop - endfacet - facet normal -0.514496 -0.857493 -0 - outer loop - vertex -8.5 1.3 -0.1 - vertex -8.375 1.225 -0.1 - vertex -8.5 1.3 0.3 - endloop - endfacet - facet normal -0.141421 -0.989949 -0 - outer loop - vertex -8.2 1.2 -0.1 - vertex -8.2 1.2 0.3 - vertex -8.375 1.225 0.3 - endloop - endfacet - facet normal -0.141421 -0.989949 -0 - outer loop - vertex -8.375 1.225 -0.1 - vertex -8.2 1.2 -0.1 - vertex -8.375 1.225 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex -2.4 1.2 -0.1 - vertex -2.4 1.2 0.3 - vertex -8.2 1.2 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex -8.2 1.2 -0.1 - vertex -2.4 1.2 -0.1 - vertex -8.2 1.2 0.3 - endloop - endfacet - facet normal -0.171341 -0.985212 -0 - outer loop - vertex -1.825 1.1 -0.1 - vertex -1.825 1.1 0.3 - vertex -2.4 1.2 0.3 - endloop - endfacet - facet normal -0.171341 -0.985212 -0 - outer loop - vertex -2.4 1.2 -0.1 - vertex -1.825 1.1 -0.1 - vertex -2.4 1.2 0.3 - endloop - endfacet - facet normal -0.496139 -0.868243 -0 - outer loop - vertex -1.3 0.8 -0.1 - vertex -1.3 0.8 0.3 - vertex -1.825 1.1 0.3 - endloop - endfacet - facet normal -0.496139 -0.868243 -0 - outer loop - vertex -1.825 1.1 -0.1 - vertex -1.3 0.8 -0.1 - vertex -1.825 1.1 0.3 - endloop - endfacet - facet normal -0.8 -0.6 0 - outer loop - vertex -0.925 0.3 0.3 - vertex -1.3 0.8 0.3 - vertex -0.925 0.3 -0.1 - endloop - endfacet - facet normal -0.8 -0.6 0 - outer loop - vertex -0.925 0.3 -0.1 - vertex -1.3 0.8 0.3 - vertex -1.3 0.8 -0.1 - endloop - endfacet - facet normal -0.984428 -0.175791 0 - outer loop - vertex -0.8 -0.4 0.3 - vertex -0.925 0.3 0.3 - vertex -0.8 -0.4 -0.1 - endloop - endfacet - facet normal -0.984428 -0.175791 0 - outer loop - vertex -0.8 -0.4 -0.1 - vertex -0.925 0.3 0.3 - vertex -0.925 0.3 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -0.8 -0.4 0.3 - vertex -0.8 -0.4 -0.1 - vertex -0.8 -2.4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -0.8 -2.4 0.3 - vertex -0.8 -0.4 -0.1 - vertex -0.8 -2.4 -0.1 - endloop - endfacet - facet normal -0.977176 0.21243 0 - outer loop - vertex -0.8 -2.4 0.3 - vertex -0.8 -2.4 -0.1 - vertex -0.925 -2.975 0.3 - endloop - endfacet - facet normal -0.977176 0.21243 0 - outer loop - vertex -0.925 -2.975 0.3 - vertex -0.8 -2.4 -0.1 - vertex -0.925 -2.975 -0.1 - endloop - endfacet - facet normal -0.813733 0.581238 0 - outer loop - vertex -0.925 -2.975 0.3 - vertex -0.925 -2.975 -0.1 - vertex -1.3 -3.5 0.3 - endloop - endfacet - facet normal -0.813733 0.581238 0 - outer loop - vertex -1.3 -3.5 0.3 - vertex -0.925 -2.975 -0.1 - vertex -1.3 -3.5 -0.1 - endloop - endfacet - facet normal -0.581238 0.813733 0 - outer loop - vertex -1.3 -3.5 0.3 - vertex -1.3 -3.5 -0.1 - vertex -1.825 -3.875 0.3 - endloop - endfacet - facet normal -0.581238 0.813733 0 - outer loop - vertex -1.825 -3.875 0.3 - vertex -1.3 -3.5 -0.1 - vertex -1.825 -3.875 -0.1 - endloop - endfacet - facet normal -0.21243 0.977176 0 - outer loop - vertex -1.825 -3.875 0.3 - vertex -1.825 -3.875 -0.1 - vertex -2.4 -4 0.3 - endloop - endfacet - facet normal -0.21243 0.977176 0 - outer loop - vertex -2.4 -4 0.3 - vertex -1.825 -3.875 -0.1 - vertex -2.4 -4 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex -2.4 -4 0.3 - vertex -2.4 -4 -0.1 - vertex -8.2 -4 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex -8.2 -4 0.3 - vertex -2.4 -4 -0.1 - vertex -8.2 -4 -0.1 - endloop - endfacet - facet normal 0.169907 0.98546 -0 - outer loop - vertex -8.2 -4 0.3 - vertex -8.2 -4 -0.1 - vertex -8.925 -3.875 0.3 - endloop - endfacet - facet normal 0.169907 0.98546 -0 - outer loop - vertex -8.925 -3.875 0.3 - vertex -8.2 -4 -0.1 - vertex -8.925 -3.875 -0.1 - endloop - endfacet - facet normal 0.546268 0.837611 -0 - outer loop - vertex -8.925 -3.875 0.3 - vertex -8.925 -3.875 -0.1 - vertex -9.5 -3.5 0.3 - endloop - endfacet - facet normal 0.546268 0.837611 -0 - outer loop - vertex -9.5 -3.5 0.3 - vertex -8.925 -3.875 -0.1 - vertex -9.5 -3.5 -0.1 - endloop - endfacet - facet normal 0.813733 0.581238 0 - outer loop - vertex -9.875 -2.975 0.3 - vertex -9.5 -3.5 0.3 - vertex -9.5 -3.5 -0.1 - endloop - endfacet - facet normal 0.813733 0.581238 0 - outer loop - vertex -9.875 -2.975 -0.1 - vertex -9.875 -2.975 0.3 - vertex -9.5 -3.5 -0.1 - endloop - endfacet - facet normal 0.977176 0.21243 0 - outer loop - vertex -10 -2.4 0.3 - vertex -9.875 -2.975 0.3 - vertex -9.875 -2.975 -0.1 - endloop - endfacet - facet normal 0.977176 0.21243 0 - outer loop - vertex -10 -2.4 -0.1 - vertex -10 -2.4 0.3 - vertex -9.875 -2.975 -0.1 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 1.8 -1.8 -0.1 - vertex 1.8 -1.8 0.3 - vertex 1.8 -2.4 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 1.8 -2.4 -0.1 - vertex 1.8 -1.8 -0.1 - vertex 1.8 -2.4 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex 3.2 -1.8 -0.1 - vertex 3.2 -1.8 0.3 - vertex 1.8 -1.8 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex 1.8 -1.8 -0.1 - vertex 3.2 -1.8 -0.1 - vertex 1.8 -1.8 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 3.2 -1.8 0.3 - vertex 3.2 -1.8 -0.1 - vertex 3.2 -2.4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 3.2 -2.4 0.3 - vertex 3.2 -1.8 -0.1 - vertex 3.2 -2.4 -0.1 - endloop - endfacet - facet normal -0.707107 -0.707107 -0 - outer loop - vertex 3.3 -2.5 -0.1 - vertex 3.3 -2.5 0.3 - vertex 3.2 -2.4 0.3 - endloop - endfacet - facet normal -0.707107 -0.707107 -0 - outer loop - vertex 3.2 -2.4 -0.1 - vertex 3.3 -2.5 -0.1 - vertex 3.2 -2.4 0.3 - endloop - endfacet - facet normal -0.514496 -0.857493 -0 - outer loop - vertex 3.425 -2.575 -0.1 - vertex 3.425 -2.575 0.3 - vertex 3.3 -2.5 0.3 - endloop - endfacet - facet normal -0.514496 -0.857493 -0 - outer loop - vertex 3.3 -2.5 -0.1 - vertex 3.425 -2.575 -0.1 - vertex 3.3 -2.5 0.3 - endloop - endfacet - facet normal -0.141421 -0.989949 -0 - outer loop - vertex 3.6 -2.6 -0.1 - vertex 3.6 -2.6 0.3 - vertex 3.425 -2.575 0.3 - endloop - endfacet - facet normal -0.141421 -0.989949 -0 - outer loop - vertex 3.425 -2.575 -0.1 - vertex 3.6 -2.6 -0.1 - vertex 3.425 -2.575 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex 9.4 -2.6 -0.1 - vertex 9.4 -2.6 0.3 - vertex 3.6 -2.6 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex 3.6 -2.6 -0.1 - vertex 9.4 -2.6 -0.1 - vertex 3.6 -2.6 0.3 - endloop - endfacet - facet normal 0.164399 -0.986394 0 - outer loop - vertex 9.55 -2.575 -0.1 - vertex 9.55 -2.575 0.3 - vertex 9.4 -2.6 0.3 - endloop - endfacet - facet normal 0.164399 -0.986394 0 - outer loop - vertex 9.4 -2.6 -0.1 - vertex 9.55 -2.575 -0.1 - vertex 9.4 -2.6 0.3 - endloop - endfacet - facet normal 0.83205 -0.5547 0 - outer loop - vertex 9.6 -2.5 -0.1 - vertex 9.6 -2.5 0.3 - vertex 9.55 -2.575 0.3 - endloop - endfacet - facet normal 0.83205 -0.5547 0 - outer loop - vertex 9.55 -2.575 -0.1 - vertex 9.6 -2.5 -0.1 - vertex 9.55 -2.575 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 9.6 -0.1 -0.1 - vertex 9.6 -0.1 0.3 - vertex 9.6 -2.5 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 9.6 -2.5 -0.1 - vertex 9.6 -0.1 -0.1 - vertex 9.6 -2.5 0.3 - endloop - endfacet - facet normal 0.83205 0.5547 0 - outer loop - vertex 9.55 -0.025 0.3 - vertex 9.6 -0.1 0.3 - vertex 9.6 -0.1 -0.1 - endloop - endfacet - facet normal 0.83205 0.5547 0 - outer loop - vertex 9.55 -0.025 -0.1 - vertex 9.55 -0.025 0.3 - vertex 9.6 -0.1 -0.1 - endloop - endfacet - facet normal 0.164399 0.986394 -0 - outer loop - vertex 9.55 -0.025 0.3 - vertex 9.55 -0.025 -0.1 - vertex 9.4 2.22045e-16 0.3 - endloop - endfacet - facet normal 0.164399 0.986394 -0 - outer loop - vertex 9.4 2.22045e-16 0.3 - vertex 9.55 -0.025 -0.1 - vertex 9.4 2.22045e-16 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex 9.4 2.22045e-16 0.3 - vertex 9.4 2.22045e-16 -0.1 - vertex 3.6 2.22045e-16 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex 3.6 2.22045e-16 0.3 - vertex 9.4 2.22045e-16 -0.1 - vertex 3.6 2.22045e-16 -0.1 - endloop - endfacet - facet normal 0.136637 0.990621 -0 - outer loop - vertex 3.6 2.22045e-16 0.3 - vertex 3.6 2.22045e-16 -0.1 - vertex 2.875 0.1 0.3 - endloop - endfacet - facet normal 0.136637 0.990621 -0 - outer loop - vertex 2.875 0.1 0.3 - vertex 3.6 2.22045e-16 -0.1 - vertex 2.875 0.1 -0.1 - endloop - endfacet - facet normal 0.462566 0.886585 -0 - outer loop - vertex 2.875 0.1 0.3 - vertex 2.875 0.1 -0.1 - vertex 2.3 0.4 0.3 - endloop - endfacet - facet normal 0.462566 0.886585 -0 - outer loop - vertex 2.3 0.4 0.3 - vertex 2.875 0.1 -0.1 - vertex 2.3 0.4 -0.1 - endloop - endfacet - facet normal 0.8 0.6 0 - outer loop - vertex 1.925 0.9 0.3 - vertex 2.3 0.4 0.3 - vertex 2.3 0.4 -0.1 - endloop - endfacet - facet normal 0.8 0.6 0 - outer loop - vertex 1.925 0.9 -0.1 - vertex 1.925 0.9 0.3 - vertex 2.3 0.4 -0.1 - endloop - endfacet - facet normal 0.984428 0.175791 0 - outer loop - vertex 1.8 1.6 0.3 - vertex 1.925 0.9 0.3 - vertex 1.925 0.9 -0.1 - endloop - endfacet - facet normal 0.984428 0.175791 0 - outer loop - vertex 1.8 1.6 -0.1 - vertex 1.8 1.6 0.3 - vertex 1.925 0.9 -0.1 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 1.8 3.6 -0.1 - vertex 1.8 3.6 0.3 - vertex 1.8 1.6 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 1.8 1.6 -0.1 - vertex 1.8 3.6 -0.1 - vertex 1.8 1.6 0.3 - endloop - endfacet - facet normal 0.977176 -0.21243 0 - outer loop - vertex 1.925 4.175 -0.1 - vertex 1.925 4.175 0.3 - vertex 1.8 3.6 0.3 - endloop - endfacet - facet normal 0.977176 -0.21243 0 - outer loop - vertex 1.8 3.6 -0.1 - vertex 1.925 4.175 -0.1 - vertex 1.8 3.6 0.3 - endloop - endfacet - facet normal 0.813733 -0.581238 0 - outer loop - vertex 2.3 4.7 -0.1 - vertex 2.3 4.7 0.3 - vertex 1.925 4.175 0.3 - endloop - endfacet - facet normal 0.813733 -0.581238 0 - outer loop - vertex 1.925 4.175 -0.1 - vertex 2.3 4.7 -0.1 - vertex 1.925 4.175 0.3 - endloop - endfacet - facet normal 0.546268 -0.837611 0 - outer loop - vertex 2.875 5.075 -0.1 - vertex 2.875 5.075 0.3 - vertex 2.3 4.7 0.3 - endloop - endfacet - facet normal 0.546268 -0.837611 0 - outer loop - vertex 2.3 4.7 -0.1 - vertex 2.875 5.075 -0.1 - vertex 2.3 4.7 0.3 - endloop - endfacet - facet normal 0.169907 -0.98546 0 - outer loop - vertex 3.6 5.2 -0.1 - vertex 3.6 5.2 0.3 - vertex 2.875 5.075 0.3 - endloop - endfacet - facet normal 0.169907 -0.98546 0 - outer loop - vertex 2.875 5.075 -0.1 - vertex 3.6 5.2 -0.1 - vertex 2.875 5.075 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex 9.4 5.2 -0.1 - vertex 9.4 5.2 0.3 - vertex 3.6 5.2 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex 3.6 5.2 -0.1 - vertex 9.4 5.2 -0.1 - vertex 3.6 5.2 0.3 - endloop - endfacet - facet normal -0.21243 -0.977176 -0 - outer loop - vertex 9.975 5.075 -0.1 - vertex 9.975 5.075 0.3 - vertex 9.4 5.2 0.3 - endloop - endfacet - facet normal -0.21243 -0.977176 -0 - outer loop - vertex 9.4 5.2 -0.1 - vertex 9.975 5.075 -0.1 - vertex 9.4 5.2 0.3 - endloop - endfacet - facet normal -0.581238 -0.813733 -0 - outer loop - vertex 10.5 4.7 -0.1 - vertex 10.5 4.7 0.3 - vertex 9.975 5.075 0.3 - endloop - endfacet - facet normal -0.581238 -0.813733 -0 - outer loop - vertex 9.975 5.075 -0.1 - vertex 10.5 4.7 -0.1 - vertex 9.975 5.075 0.3 - endloop - endfacet - facet normal -0.813733 -0.581238 0 - outer loop - vertex 10.875 4.175 0.3 - vertex 10.5 4.7 0.3 - vertex 10.875 4.175 -0.1 - endloop - endfacet - facet normal -0.813733 -0.581238 0 - outer loop - vertex 10.875 4.175 -0.1 - vertex 10.5 4.7 0.3 - vertex 10.5 4.7 -0.1 - endloop - endfacet - facet normal -0.977176 -0.21243 0 - outer loop - vertex 11 3.6 0.3 - vertex 10.875 4.175 0.3 - vertex 11 3.6 -0.1 - endloop - endfacet - facet normal -0.977176 -0.21243 0 - outer loop - vertex 11 3.6 -0.1 - vertex 10.875 4.175 0.3 - vertex 10.875 4.175 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 11 3.6 0.3 - vertex 11 3.6 -0.1 - vertex 11 3 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 11 3 0.3 - vertex 11 3.6 -0.1 - vertex 11 3 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex 11 3 0.3 - vertex 11 3 -0.1 - vertex 9.6 3 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex 9.6 3 0.3 - vertex 11 3 -0.1 - vertex 9.6 3 -0.1 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 9.6 3.7 -0.1 - vertex 9.6 3.7 0.3 - vertex 9.6 3 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 9.6 3 -0.1 - vertex 9.6 3.7 -0.1 - vertex 9.6 3 0.3 - endloop - endfacet - facet normal 0.83205 0.5547 0 - outer loop - vertex 9.55 3.775 0.3 - vertex 9.6 3.7 0.3 - vertex 9.6 3.7 -0.1 - endloop - endfacet - facet normal 0.83205 0.5547 0 - outer loop - vertex 9.55 3.775 -0.1 - vertex 9.55 3.775 0.3 - vertex 9.6 3.7 -0.1 - endloop - endfacet - facet normal 0.164399 0.986394 -0 - outer loop - vertex 9.55 3.775 0.3 - vertex 9.55 3.775 -0.1 - vertex 9.4 3.8 0.3 - endloop - endfacet - facet normal 0.164399 0.986394 -0 - outer loop - vertex 9.4 3.8 0.3 - vertex 9.55 3.775 -0.1 - vertex 9.4 3.8 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex 9.4 3.8 0.3 - vertex 9.4 3.8 -0.1 - vertex 3.6 3.8 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex 3.6 3.8 0.3 - vertex 9.4 3.8 -0.1 - vertex 3.6 3.8 -0.1 - endloop - endfacet - facet normal -0.141421 0.989949 0 - outer loop - vertex 3.6 3.8 0.3 - vertex 3.6 3.8 -0.1 - vertex 3.425 3.775 0.3 - endloop - endfacet - facet normal -0.141421 0.989949 0 - outer loop - vertex 3.425 3.775 0.3 - vertex 3.6 3.8 -0.1 - vertex 3.425 3.775 -0.1 - endloop - endfacet - facet normal -0.514496 0.857493 0 - outer loop - vertex 3.425 3.775 0.3 - vertex 3.425 3.775 -0.1 - vertex 3.3 3.7 0.3 - endloop - endfacet - facet normal -0.514496 0.857493 0 - outer loop - vertex 3.3 3.7 0.3 - vertex 3.425 3.775 -0.1 - vertex 3.3 3.7 -0.1 - endloop - endfacet - facet normal -0.707107 0.707107 0 - outer loop - vertex 3.3 3.7 0.3 - vertex 3.3 3.7 -0.1 - vertex 3.2 3.6 0.3 - endloop - endfacet - facet normal -0.707107 0.707107 0 - outer loop - vertex 3.2 3.6 0.3 - vertex 3.3 3.7 -0.1 - vertex 3.2 3.6 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 3.2 3.6 0.3 - vertex 3.2 3.6 -0.1 - vertex 3.2 1.6 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 3.2 1.6 0.3 - vertex 3.2 3.6 -0.1 - vertex 3.2 1.6 -0.1 - endloop - endfacet - facet normal -0.989949 -0.141421 0 - outer loop - vertex 3.225 1.425 0.3 - vertex 3.2 1.6 0.3 - vertex 3.225 1.425 -0.1 - endloop - endfacet - facet normal -0.989949 -0.141421 0 - outer loop - vertex 3.225 1.425 -0.1 - vertex 3.2 1.6 0.3 - vertex 3.2 1.6 -0.1 - endloop - endfacet - facet normal -0.857493 -0.514496 0 - outer loop - vertex 3.3 1.3 0.3 - vertex 3.225 1.425 0.3 - vertex 3.3 1.3 -0.1 - endloop - endfacet - facet normal -0.857493 -0.514496 0 - outer loop - vertex 3.3 1.3 -0.1 - vertex 3.225 1.425 0.3 - vertex 3.225 1.425 -0.1 - endloop - endfacet - facet normal -0.514496 -0.857493 -0 - outer loop - vertex 3.425 1.225 -0.1 - vertex 3.425 1.225 0.3 - vertex 3.3 1.3 0.3 - endloop - endfacet - facet normal -0.514496 -0.857493 -0 - outer loop - vertex 3.3 1.3 -0.1 - vertex 3.425 1.225 -0.1 - vertex 3.3 1.3 0.3 - endloop - endfacet - facet normal -0.141421 -0.989949 -0 - outer loop - vertex 3.6 1.2 -0.1 - vertex 3.6 1.2 0.3 - vertex 3.425 1.225 0.3 - endloop - endfacet - facet normal -0.141421 -0.989949 -0 - outer loop - vertex 3.425 1.225 -0.1 - vertex 3.6 1.2 -0.1 - vertex 3.425 1.225 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex 9.4 1.2 -0.1 - vertex 9.4 1.2 0.3 - vertex 3.6 1.2 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex 3.6 1.2 -0.1 - vertex 9.4 1.2 -0.1 - vertex 3.6 1.2 0.3 - endloop - endfacet - facet normal -0.171341 -0.985212 -0 - outer loop - vertex 9.975 1.1 -0.1 - vertex 9.975 1.1 0.3 - vertex 9.4 1.2 0.3 - endloop - endfacet - facet normal -0.171341 -0.985212 -0 - outer loop - vertex 9.4 1.2 -0.1 - vertex 9.975 1.1 -0.1 - vertex 9.4 1.2 0.3 - endloop - endfacet - facet normal -0.496139 -0.868243 -0 - outer loop - vertex 10.5 0.8 -0.1 - vertex 10.5 0.8 0.3 - vertex 9.975 1.1 0.3 - endloop - endfacet - facet normal -0.496139 -0.868243 -0 - outer loop - vertex 9.975 1.1 -0.1 - vertex 10.5 0.8 -0.1 - vertex 9.975 1.1 0.3 - endloop - endfacet - facet normal -0.8 -0.6 0 - outer loop - vertex 10.875 0.3 0.3 - vertex 10.5 0.8 0.3 - vertex 10.875 0.3 -0.1 - endloop - endfacet - facet normal -0.8 -0.6 0 - outer loop - vertex 10.875 0.3 -0.1 - vertex 10.5 0.8 0.3 - vertex 10.5 0.8 -0.1 - endloop - endfacet - facet normal -0.984428 -0.175791 0 - outer loop - vertex 11 -0.4 0.3 - vertex 10.875 0.3 0.3 - vertex 11 -0.4 -0.1 - endloop - endfacet - facet normal -0.984428 -0.175791 0 - outer loop - vertex 11 -0.4 -0.1 - vertex 10.875 0.3 0.3 - vertex 10.875 0.3 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 11 -0.4 0.3 - vertex 11 -0.4 -0.1 - vertex 11 -2.4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 11 -2.4 0.3 - vertex 11 -0.4 -0.1 - vertex 11 -2.4 -0.1 - endloop - endfacet - facet normal -0.977176 0.21243 0 - outer loop - vertex 11 -2.4 0.3 - vertex 11 -2.4 -0.1 - vertex 10.875 -2.975 0.3 - endloop - endfacet - facet normal -0.977176 0.21243 0 - outer loop - vertex 10.875 -2.975 0.3 - vertex 11 -2.4 -0.1 - vertex 10.875 -2.975 -0.1 - endloop - endfacet - facet normal -0.813733 0.581238 0 - outer loop - vertex 10.875 -2.975 0.3 - vertex 10.875 -2.975 -0.1 - vertex 10.5 -3.5 0.3 - endloop - endfacet - facet normal -0.813733 0.581238 0 - outer loop - vertex 10.5 -3.5 0.3 - vertex 10.875 -2.975 -0.1 - vertex 10.5 -3.5 -0.1 - endloop - endfacet - facet normal -0.581238 0.813733 0 - outer loop - vertex 10.5 -3.5 0.3 - vertex 10.5 -3.5 -0.1 - vertex 9.975 -3.875 0.3 - endloop - endfacet - facet normal -0.581238 0.813733 0 - outer loop - vertex 9.975 -3.875 0.3 - vertex 10.5 -3.5 -0.1 - vertex 9.975 -3.875 -0.1 - endloop - endfacet - facet normal -0.21243 0.977176 0 - outer loop - vertex 9.975 -3.875 0.3 - vertex 9.975 -3.875 -0.1 - vertex 9.4 -4 0.3 - endloop - endfacet - facet normal -0.21243 0.977176 0 - outer loop - vertex 9.4 -4 0.3 - vertex 9.975 -3.875 -0.1 - vertex 9.4 -4 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex 9.4 -4 0.3 - vertex 9.4 -4 -0.1 - vertex 3.6 -4 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex 3.6 -4 0.3 - vertex 9.4 -4 -0.1 - vertex 3.6 -4 -0.1 - endloop - endfacet - facet normal 0.169907 0.98546 -0 - outer loop - vertex 3.6 -4 0.3 - vertex 3.6 -4 -0.1 - vertex 2.875 -3.875 0.3 - endloop - endfacet - facet normal 0.169907 0.98546 -0 - outer loop - vertex 2.875 -3.875 0.3 - vertex 3.6 -4 -0.1 - vertex 2.875 -3.875 -0.1 - endloop - endfacet - facet normal 0.546268 0.837611 -0 - outer loop - vertex 2.875 -3.875 0.3 - vertex 2.875 -3.875 -0.1 - vertex 2.3 -3.5 0.3 - endloop - endfacet - facet normal 0.546268 0.837611 -0 - outer loop - vertex 2.3 -3.5 0.3 - vertex 2.875 -3.875 -0.1 - vertex 2.3 -3.5 -0.1 - endloop - endfacet - facet normal 0.813733 0.581238 0 - outer loop - vertex 1.925 -2.975 0.3 - vertex 2.3 -3.5 0.3 - vertex 2.3 -3.5 -0.1 - endloop - endfacet - facet normal 0.813733 0.581238 0 - outer loop - vertex 1.925 -2.975 -0.1 - vertex 1.925 -2.975 0.3 - vertex 2.3 -3.5 -0.1 - endloop - endfacet - facet normal 0.977176 0.21243 0 - outer loop - vertex 1.8 -2.4 0.3 - vertex 1.925 -2.975 0.3 - vertex 1.925 -2.975 -0.1 - endloop - endfacet - facet normal 0.977176 0.21243 0 - outer loop - vertex 1.8 -2.4 -0.1 - vertex 1.8 -2.4 0.3 - vertex 1.925 -2.975 -0.1 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex 22.2 5.2 -0.1 - vertex 22.2 5.2 0.3 - vertex 13.8 5.2 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex 13.8 5.2 -0.1 - vertex 22.2 5.2 -0.1 - vertex 13.8 5.2 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 13.8 5.2 -0.1 - vertex 13.8 5.2 0.3 - vertex 13.8 -4 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 13.8 -4 -0.1 - vertex 13.8 5.2 -0.1 - vertex 13.8 -4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 22.2 5.2 0.3 - vertex 22.2 5.2 -0.1 - vertex 22.2 3.8 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 22.2 3.8 0.3 - vertex 22.2 5.2 -0.1 - vertex 22.2 3.8 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex 22.2 3.8 0.3 - vertex 22.2 3.8 -0.1 - vertex 15.2 3.8 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex 15.2 3.8 0.3 - vertex 22.2 3.8 -0.1 - vertex 15.2 3.8 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 15.2 3.8 0.3 - vertex 15.2 3.8 -0.1 - vertex 15.2 1.2 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 15.2 1.2 0.3 - vertex 15.2 3.8 -0.1 - vertex 15.2 1.2 -0.1 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex 20.8 1.2 -0.1 - vertex 20.8 1.2 0.3 - vertex 15.2 1.2 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex 15.2 1.2 -0.1 - vertex 20.8 1.2 -0.1 - vertex 15.2 1.2 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 20.8 1.2 0.3 - vertex 20.8 1.2 -0.1 - vertex 20.8 2.22045e-16 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 20.8 2.22045e-16 0.3 - vertex 20.8 1.2 -0.1 - vertex 20.8 2.22045e-16 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex 20.8 2.22045e-16 0.3 - vertex 20.8 2.22045e-16 -0.1 - vertex 15.2 2.22045e-16 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex 15.2 2.22045e-16 0.3 - vertex 20.8 2.22045e-16 -0.1 - vertex 15.2 2.22045e-16 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 15.2 2.22045e-16 0.3 - vertex 15.2 2.22045e-16 -0.1 - vertex 15.2 -2.6 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 15.2 -2.6 0.3 - vertex 15.2 2.22045e-16 -0.1 - vertex 15.2 -2.6 -0.1 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex 22.2 -2.6 -0.1 - vertex 22.2 -2.6 0.3 - vertex 15.2 -2.6 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex 15.2 -2.6 -0.1 - vertex 22.2 -2.6 -0.1 - vertex 15.2 -2.6 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 22.2 -2.6 0.3 - vertex 22.2 -2.6 -0.1 - vertex 22.2 -4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 22.2 -4 0.3 - vertex 22.2 -2.6 -0.1 - vertex 22.2 -4 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex 22.2 -4 0.3 - vertex 22.2 -4 -0.1 - vertex 13.8 -4 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex 13.8 -4 0.3 - vertex 22.2 -4 -0.1 - vertex 13.8 -4 -0.1 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex 26.4 5.2 -0.1 - vertex 26.4 5.2 0.3 - vertex 25 5.2 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex 25 5.2 -0.1 - vertex 26.4 5.2 -0.1 - vertex 25 5.2 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 25 5.2 -0.1 - vertex 25 5.2 0.3 - vertex 25 -4 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex 25 -4 -0.1 - vertex 25 5.2 -0.1 - vertex 25 -4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 26.4 5.2 0.3 - vertex 26.4 5.2 -0.1 - vertex 26.4 -2.6 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 26.4 -2.6 0.3 - vertex 26.4 5.2 -0.1 - vertex 26.4 -2.6 -0.1 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex 34.2 -2.6 -0.1 - vertex 34.2 -2.6 0.3 - vertex 26.4 -2.6 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex 26.4 -2.6 -0.1 - vertex 34.2 -2.6 -0.1 - vertex 26.4 -2.6 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 34.2 -2.6 0.3 - vertex 34.2 -2.6 -0.1 - vertex 34.2 -4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex 34.2 -4 0.3 - vertex 34.2 -2.6 -0.1 - vertex 34.2 -4 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex 34.2 -4 0.3 - vertex 34.2 -4 -0.1 - vertex 25 -4 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex 25 -4 0.3 - vertex 34.2 -4 -0.1 - vertex 25 -4 -0.1 - endloop - endfacet - facet normal -0.707107 -0.707107 -0 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -20.5 -2.5 0.3 - vertex -20.6 -2.4 0.3 - endloop - endfacet - facet normal -0.707107 -0.707107 -0 - outer loop - vertex -20.6 -2.4 -0.1 - vertex -20.5 -2.5 -0.1 - vertex -20.6 -2.4 0.3 - endloop - endfacet - facet normal -0 -0 -1 - outer loop - vertex -20.6 -2.4 -0.1 - vertex -20.6 3.6 -0.1 - vertex -20.5 -2.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -20.6 3.6 -0.1 - vertex -20.5 3.7 -0.1 - endloop - endfacet - facet normal 0 -0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -20.5 3.7 -0.1 - vertex -20.375 3.775 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -20.375 3.775 -0.1 - vertex -20.2 3.8 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -20.2 3.8 -0.1 - vertex -14.4 3.8 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -14.4 3.8 -0.1 - vertex -14.225 3.775 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -14.225 3.775 -0.1 - vertex -14.1 3.7 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -14.1 3.7 -0.1 - vertex -14 3.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -14 3.6 -0.1 - vertex -14 -2.4 -0.1 - endloop - endfacet - facet normal -0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -14 -2.4 -0.1 - vertex -14.1 -2.5 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -14.1 -2.5 -0.1 - vertex -14.225 -2.575 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -14.225 -2.575 -0.1 - vertex -14.4 -2.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -14.4 -2.6 -0.1 - vertex -20.2 -2.6 -0.1 - endloop - endfacet - facet normal 0 0 -1 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -20.2 -2.6 -0.1 - vertex -20.375 -2.575 -0.1 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -20.6 3.6 0.3 - vertex -20.6 3.6 -0.1 - vertex -20.6 -2.4 0.3 - endloop - endfacet - facet normal -1 0 0 - outer loop - vertex -20.6 -2.4 0.3 - vertex -20.6 3.6 -0.1 - vertex -20.6 -2.4 -0.1 - endloop - endfacet - facet normal -0.514496 -0.857493 -0 - outer loop - vertex -20.375 -2.575 -0.1 - vertex -20.375 -2.575 0.3 - vertex -20.5 -2.5 0.3 - endloop - endfacet - facet normal -0.514496 -0.857493 -0 - outer loop - vertex -20.5 -2.5 -0.1 - vertex -20.375 -2.575 -0.1 - vertex -20.5 -2.5 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -20.6 3.6 0.3 - vertex -20.6 -2.4 0.3 - vertex -20.5 -2.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -20.2 -2.6 0.3 - vertex -20.6 3.6 0.3 - vertex -20.375 -2.575 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -20.375 -2.575 0.3 - vertex -20.6 3.6 0.3 - vertex -20.5 -2.5 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex -14.4 -2.6 0.3 - vertex -20.6 3.6 0.3 - vertex -20.2 -2.6 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex -14.225 -2.575 0.3 - vertex -20.6 3.6 0.3 - vertex -14.4 -2.6 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex -14.1 -2.5 0.3 - vertex -20.6 3.6 0.3 - vertex -14.225 -2.575 0.3 - endloop - endfacet - facet normal -0 0 1 - outer loop - vertex -14 -2.4 0.3 - vertex -20.6 3.6 0.3 - vertex -14.1 -2.5 0.3 - endloop - endfacet - facet normal 0 0 1 - outer loop - vertex -14 3.6 0.3 - vertex -20.6 3.6 0.3 - vertex -14 -2.4 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -14.1 3.7 0.3 - vertex -20.6 3.6 0.3 - vertex -14 3.6 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -14.225 3.775 0.3 - vertex -20.6 3.6 0.3 - vertex -14.1 3.7 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -14.4 3.8 0.3 - vertex -20.6 3.6 0.3 - vertex -14.225 3.775 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -20.2 3.8 0.3 - vertex -20.6 3.6 0.3 - vertex -14.4 3.8 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -20.375 3.775 0.3 - vertex -20.6 3.6 0.3 - vertex -20.2 3.8 0.3 - endloop - endfacet - facet normal 0 -0 1 - outer loop - vertex -20.5 3.7 0.3 - vertex -20.6 3.6 0.3 - vertex -20.375 3.775 0.3 - endloop - endfacet - facet normal -0.141421 -0.989949 -0 - outer loop - vertex -20.2 -2.6 -0.1 - vertex -20.2 -2.6 0.3 - vertex -20.375 -2.575 0.3 - endloop - endfacet - facet normal -0.141421 -0.989949 -0 - outer loop - vertex -20.375 -2.575 -0.1 - vertex -20.2 -2.6 -0.1 - vertex -20.375 -2.575 0.3 - endloop - endfacet - facet normal 0 -1 0 - outer loop - vertex -14.4 -2.6 -0.1 - vertex -14.4 -2.6 0.3 - vertex -20.2 -2.6 0.3 - endloop - endfacet - facet normal -0 -1 -0 - outer loop - vertex -20.2 -2.6 -0.1 - vertex -14.4 -2.6 -0.1 - vertex -20.2 -2.6 0.3 - endloop - endfacet - facet normal 0.141421 -0.989949 0 - outer loop - vertex -14.225 -2.575 -0.1 - vertex -14.225 -2.575 0.3 - vertex -14.4 -2.6 0.3 - endloop - endfacet - facet normal 0.141421 -0.989949 0 - outer loop - vertex -14.4 -2.6 -0.1 - vertex -14.225 -2.575 -0.1 - vertex -14.4 -2.6 0.3 - endloop - endfacet - facet normal 0.514496 -0.857493 0 - outer loop - vertex -14.1 -2.5 -0.1 - vertex -14.1 -2.5 0.3 - vertex -14.225 -2.575 0.3 - endloop - endfacet - facet normal 0.514496 -0.857493 0 - outer loop - vertex -14.225 -2.575 -0.1 - vertex -14.1 -2.5 -0.1 - vertex -14.225 -2.575 0.3 - endloop - endfacet - facet normal 0.707107 -0.707107 0 - outer loop - vertex -14 -2.4 -0.1 - vertex -14 -2.4 0.3 - vertex -14.1 -2.5 0.3 - endloop - endfacet - facet normal 0.707107 -0.707107 0 - outer loop - vertex -14.1 -2.5 -0.1 - vertex -14 -2.4 -0.1 - vertex -14.1 -2.5 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -14 3.6 -0.1 - vertex -14 3.6 0.3 - vertex -14 -2.4 0.3 - endloop - endfacet - facet normal 1 0 0 - outer loop - vertex -14 -2.4 -0.1 - vertex -14 3.6 -0.1 - vertex -14 -2.4 0.3 - endloop - endfacet - facet normal 0.707107 0.707107 -0 - outer loop - vertex -14 3.6 0.3 - vertex -14 3.6 -0.1 - vertex -14.1 3.7 0.3 - endloop - endfacet - facet normal 0.707107 0.707107 -0 - outer loop - vertex -14.1 3.7 0.3 - vertex -14 3.6 -0.1 - vertex -14.1 3.7 -0.1 - endloop - endfacet - facet normal 0.514496 0.857493 -0 - outer loop - vertex -14.1 3.7 0.3 - vertex -14.1 3.7 -0.1 - vertex -14.225 3.775 0.3 - endloop - endfacet - facet normal 0.514496 0.857493 -0 - outer loop - vertex -14.225 3.775 0.3 - vertex -14.1 3.7 -0.1 - vertex -14.225 3.775 -0.1 - endloop - endfacet - facet normal 0.141421 0.989949 -0 - outer loop - vertex -14.225 3.775 0.3 - vertex -14.225 3.775 -0.1 - vertex -14.4 3.8 0.3 - endloop - endfacet - facet normal 0.141421 0.989949 -0 - outer loop - vertex -14.4 3.8 0.3 - vertex -14.225 3.775 -0.1 - vertex -14.4 3.8 -0.1 - endloop - endfacet - facet normal 0 1 0 - outer loop - vertex -14.4 3.8 0.3 - vertex -14.4 3.8 -0.1 - vertex -20.2 3.8 0.3 - endloop - endfacet - facet normal 0 1 -0 - outer loop - vertex -20.2 3.8 0.3 - vertex -14.4 3.8 -0.1 - vertex -20.2 3.8 -0.1 - endloop - endfacet - facet normal -0.141421 0.989949 0 - outer loop - vertex -20.2 3.8 0.3 - vertex -20.2 3.8 -0.1 - vertex -20.375 3.775 0.3 - endloop - endfacet - facet normal -0.141421 0.989949 0 - outer loop - vertex -20.375 3.775 0.3 - vertex -20.2 3.8 -0.1 - vertex -20.375 3.775 -0.1 - endloop - endfacet - facet normal -0.514496 0.857493 0 - outer loop - vertex -20.375 3.775 0.3 - vertex -20.375 3.775 -0.1 - vertex -20.5 3.7 0.3 - endloop - endfacet - facet normal -0.514496 0.857493 0 - outer loop - vertex -20.5 3.7 0.3 - vertex -20.375 3.775 -0.1 - vertex -20.5 3.7 -0.1 - endloop - endfacet - facet normal -0.707107 0.707107 0 - outer loop - vertex -20.5 3.7 0.3 - vertex -20.5 3.7 -0.1 - vertex -20.6 3.6 0.3 - endloop - endfacet - facet normal -0.707107 0.707107 0 - outer loop - vertex -20.6 3.6 0.3 - vertex -20.5 3.7 -0.1 - vertex -20.6 3.6 -0.1 - endloop - endfacet -endsolid OpenSCAD_Model diff --git a/carriage.scad b/carriage.scad index 5feab83..d8d6b3f 100644 --- a/carriage.scad +++ b/carriage.scad @@ -50,12 +50,16 @@ module carriage() { // Screws for linear slider. for (x = [-10, 10]) { for (y = [-10, 10]) { - translate([x, y, thickness]) # + translate([x, y, thickness]) cylinder(r=m3_wide_radius, h=30, center=true, $fn=12); } } + + // potential screw to hold a washer to keep belts in-place + translate([3,-2.5,8]) cylinder(r=1,h=9,$fn=12); + // Screws for ball joints. - translate([0, 16, horn_thickness/2]) rotate([0, 90, 0]) # + translate([0, 16, horn_thickness/2]) rotate([0, 90, 0]) cylinder(r=m3_wide_radius, h=60, center=true, $fn=12); // Lock nuts for ball joints. for (x = [-1, 1]) { @@ -68,4 +72,26 @@ module carriage() { } } -carriage(); +module earBrace() { + intersection () { + hull() { + rotate([0,55,0]) scale([2,1,1]) cylinder(r=.4,h=7,$nf=12); + linear_extrude(height=0.1) + polygon(points=[[0,0],[7,1.5],[7,-1.5]], paths=[[0,1,2,0]]); + } + translate([-2,-5,0]) cube([10,10,10]); + } +} + +union() { + translate([0,0,.34]) carriage(); + color("Cyan") { + linear_extrude(height=0.4) + polygon(points=[[17,-20],[23,16],[17,28], [-17,28],[-23,16],[-17,-20]], + paths=[[0,1,2,3,4,5,0]]); + + // support material, forced + translate([ 15,16.2,0]) earBrace(); + translate([-15,16.2,0]) mirror([1,0,0]) earBrace(); + } +} diff --git a/carriage.stl b/carriage.stl deleted file mode 100644 index 39b521c..0000000 Binary files a/carriage.stl and /dev/null differ diff --git a/cncProbe.scad b/cncProbe.scad new file mode 100644 index 0000000..1ffb871 --- /dev/null +++ b/cncProbe.scad @@ -0,0 +1,184 @@ +// sketch for low-impact surface probe switch +// Aaron Birenboim nov14 + +// low accuracy... but high repeatability version +// of a CNC probe + +magRad=10.5; // radius of magnet group + +sphereDiam = 3.0; // new set of spheres appears to be true 3.0mm +//bitDiam = 1.12; // 3/64" drill bit, for rods +bitDiam = 1.56; // 1/16" drill bit + +mountTowerRad = 10; + +module magnetGroup(fuzz=0) { + for(i=[-120,0,120]) rotate([0,0,i]) + for (a=[-1,1]) translate([1.8*a,-magRad,0]) + sphere(sphereDiam/2+fuzz,$fn=36); // 3mm bucky balls +} +module magnetGroupBase() { + for(i=[-120,0,120]) rotate([0,0,i]) hull() + for (a=[-1,1]) translate([1.8*a,-magRad,-1]) + cylinder(r2=sphereDiam/2+.5,r1=sphereDiam/2+1.1,h=1.35,$fn=36); +} + +module magnetJig(fuzz=0) { + difference() { + translate([0,0,-3]) triPlate(2.4,2*magRad-2,2*magRad+4.3); + magnetGroup(fuzz=fuzz); + translate([0,0,-4]) cylinder(r=1.7,h=5,$fn=32); + + // mount towers + for(a=[-120,0,120]) rotate([0,0,a]) { + translate([0,mountTowerRad ,-3.6]) cylinder(r=3.5,h=14,$fn=6); + //translate([0,mountTowerRad+2,-3.6]) + // scale([3,1,1]) rotate([0,0,30]) cylinder(r=4.5 ,h=14,$fn=3); + } + } +} + +// top mounting plate for m6 bolt attachment +module topPlateM6(fuzz=.1) { + difference() { + rotate([0,0,60]) triPlate(8,20,30); + + for(a=[-120,0,120]) rotate([0,0,a]) + translate([0,mountTowerRad,0]) { + // mount tower cut-out + translate([0,0,5]) cylinder(r=4+fuzz*2,h=8,$fn=6); + + // screw holes for mount towers #2 screw is diam 2.12 + translate([0,0,-1]) { + cylinder(r=2.12/2+fuzz+.2,h=14,$fn=24); // drill hole + cylinder(r1=4.1/2+fuzz+.2,r2=4.1/2+fuzz,h=3,$fn=24); // countersink + } + } + + // countersink for hex head on M6 + cylinder(r=5.9/2+fuzz,h=22,$fn=36,center=true); + translate([0,0,4]) cylinder(h=6,r1=9.9/2/cos(30)+0.5*fuzz, + r2=9.9/2/cos(30)+3 *fuzz,$fn=6); + translate([0,0,3.3]) cylinder(r=9/2+3*fuzz,h=1,$fn=48); + translate([0,0,2]) cylinder(h=3,r1=5.9/2,r2=5.9/2+1,$fn=48); + + } +} +module topPlateM6a(fuzz=.1) { + difference() { + union() { + // mount towers + for(a=[-120,0,120]) rotate([0,0,a]) + translate([0,mountTowerRad,0]) cylinder(r=4,h=8,$fn=6); + + rotate([0,0,60]) //difference() { + triPlate(6,16.92,26.92); + // translate([0,0,3]) triPlate(4,14,24); + //} + + // hex head catcher for M6 + cylinder(h=6,r1=8,r2=6,$fn=6); + } + + // screw holes for mount towers #2 screw is diam 2.12 + for(a=[-120,0,120]) rotate([0,0,a]) + translate([0,mountTowerRad,-1]) + cylinder(r=2.12/2+fuzz+.2,h=14,$fn=13); + + // countersink for hex head on M6 + cylinder(r=5.9/2+fuzz,h=22,$fn=17,center=true); + translate([0,0,3]) cylinder(h=6,r1=9.9/2/cos(30),r2=9.9/2/cos(30)+2*fuzz,$fn=6); + translate([0,0,2.3]) cylinder(r=9/2+3*fuzz,h=1,$fn=48); + + } +} + +module magnetMount(notional=false,fuzz=0) { + // magnets for contacts and alignment + if (notional) color([0,0.4,0.8]) magnetGroup(); + + // magnet base + difference() { + union() { + difference() { + translate([0,0,-3.6]) triPlate(3.6+2.6,2*magRad+2,2*magRad+8); + translate([0,0,-0.2]) triPlate(10 ,2*magRad-1,2*magRad+5); + } + magnetGroupBase(); + + // mount towers + for(a=[-120,0,120]) rotate([0,0,a]) + translate([0,mountTowerRad,-3.6]) { + cylinder(r=4,h=17,$fn=6); + + hull() { + translate([0,0 ,14]) cylinder(r=.4,h=1,$fn=6); + translate([0,0.8,6]) cube([20,1.3,.1],center=true); + } + } + } + + // screw holes for mount towers #2 screw is diam 2.12 + for(a=[-120,0,120]) rotate([0,0,a]) + translate([0,mountTowerRad,5]) + #cylinder(r=2.12/2+fuzz-.2,h=14,$fn=9); + + magnetGroup(fuzz=fuzz); + + // skip this for actual printed model... + // this is just to see insides easier for display + if (notional) + translate([0,0,.5]) cylinder(r=7+magRad,h=10,$fn=6); + + // probe pass-through + translate([0,0,-4]) cylinder(r=1.5,h=5,$fn=32); + + // drill holes for magnet contact wires + for(a=[-1,1]) translate([a*5.5,15,.65]) + rotate([90,0,0]) rotate([0,0,18]) cylinder(r=1,h=6,$fn=5); + + } +} + +module probeMount(notional=false,fuzz=0) { + difference() { + hull() { + cylinder(r=3,h=6,$fn=6); + + // holders for rods + for(a=[-120,0,120]) rotate([0,0,a]) + rotate([90,0,0]) rotate([0,0,22.5]) + cylinder(r=bitDiam/2+1.5,h=8,$fn=8); + + } + + // chop off bottom of hull a bit + translate([0,0,-3]) cylinder(r=22,h=3-bitDiam/2-fuzz-.2,$fn=6); + + // drill holes to hold rods + for(a=[-120,0,120]) rotate([0,0,a]) + #translate([0,-1.5,0] )rotate([90,0,0]) + cylinder(r=bitDiam/2+fuzz,h=10.5,$fn=16); + + // hole for probe + //#cylinder(r=bitDiam/2+fuzz,h=20,$fn=16,center=true); + #cylinder(r=.7+fuzz,h=20,$fn=12,center=true); // for pin + } +} + +module triPlate(h=2,r1=8,r2=10) { + rotate([0,0,30]) intersection() { + cylinder(r=r1,h=h,$fn=3); + translate([0,0,-0.1]) rotate([0,0,60]) cylinder(r=r2,h=h+0.2,$fn=3); + } +} + +// parts to be fabricated +//translate([35,0,0]) +magnetMount(fuzz=0.16);//,notional=true); +translate([0,0,1.5]) probeMount(fuzz=0.2); +%translate([33,0,4]) magnetJig(fuzz=.11); + +//translate([0,0,14]) +//%translate([0,0,2.8]) rotate([180,0,60]) + //topPlateM6(); diff --git a/effector.scad b/effector.scad index a4d76ef..bc8a4f2 100644 --- a/effector.scad +++ b/effector.scad @@ -43,4 +43,25 @@ module effector() { } } -translate([0, 0, height/2]) effector(); +module supportBlade() { + intersection() { + translate([-2,-3,0]) cube([5,6,5]); + translate([0,-.2,-1.3]) rotate([0,-38,0]) hull() { + cube([3.3,.4,1.5]); + translate([0,-.8,-3]) cube([3,2,1]); + } + } +} + +// Shift up and add a brim for easier printing at quelab +union() { +translate([0, 0, height/2+.32]) effector(); +color("Cyan") { + cylinder(h=.4,r1=34.3,r2=34,$fn=6); + for (a = [0,120,240]) { + rotate([0,0,a]) { + translate([ 18.4,-20,0.1]) supportBlade(); + translate([-18.4,-20,0.1]) rotate([0,0,180]) supportBlade(); + } + } +}} \ No newline at end of file diff --git a/effector.stl b/effector.stl deleted file mode 100644 index 11654c4..0000000 Binary files a/effector.stl and /dev/null differ diff --git a/effectorC.scad b/effectorC.scad new file mode 100644 index 0000000..1597de3 --- /dev/null +++ b/effectorC.scad @@ -0,0 +1,124 @@ +include ; +use ; // as altered for chinese J hot-end + +//metric_thread(diameter=5, pitch=0.8, length=8, internal=true); + +separation = 40; // Distance between ball joint mounting faces. +offset = 20; // Same as DELTA_EFFECTOR_OFFSET in Marlin. +mount_radius = 12.5; // Hotend mounting screws, standard would be 25mm. +hotend_radius = 8; // Hole for the hotend (J-Head diameter is 16mm). +push_fit_height = 4; // Length of brass threaded into printed plastic. +height = 8; +cone_r1 = 2.5; +cone_r2 = 14; + +module effector() { + difference() { + union() { + cylinder(r=offset-3, h=height, center=true, $fn=60); + for (a = [60:120:359]) rotate([0, 0, a]) { + rotate([0, 0, 30]) translate([offset-2, 0, 0]) + cube([10, 13, height], center=true); + for (s = [-1, 1]) scale([s, 1, 1]) { + translate([0, offset, 0]) difference() { + intersection() { + cube([separation, 40, height], center=true); + translate([0, -4, 0]) rotate([0, 90, 0]) + cylinder(r=10, h=separation, center=true); + translate([separation/2-7, 0, 0]) rotate([0, 90, 0]) + cylinder(r1=cone_r2, r2=cone_r1, h=14, center=true, $fn=24); + } + rotate([0, 90, 0]) + cylinder(r=m3_radius, h=separation+1, center=true, $fn=12); + rotate([90, 0, 90]) + cylinder(r=m3_nut_radius, h=separation-24, center=true, $fn=6); + } + } + } + + // extra cap for chinese hot end + hull() { + cylinder(r=8.5,h=12,$fn=6); + cylinder(r=3.6,h=16,$fn=24); + } + } + // for shorter hot-end that Johann used: + //translate([0, 0, push_fit_height-height/2]) cylinder(r=hotend_radius, h=height, $fn=36); + translate([0,0,-4.1+.3]) mirror([0,0,1]) ChineseHotEnd(); + translate([0,0,-height/2-.2]) cylinder(h=5.6,r=16.12/2+.2,$fn=48); // mount depth for hot end is critical. spread adjustments on ChineseHotEnd may not be perfect. This adjusts mount depth + + // overkill. + //translate([0, 0, -6+14]) import("m5_internal.stl"); + translate([0, 0, -6+14]) cylinder(h=11,r=4.9/2-.2,$fn=16); + + for (a = [0:60:359]) rotate([0, 0, a]) { + translate([0, mount_radius, 0]) + cylinder(r=m3_wide_radius, h=2*height, center=true, $fn=12); + } + + // slice in half to check wall thicknesses, diagnostic only + //translate([-30,0,-10]) cube([60,30,30]); + + } +} + +module supportBlade() { + intersection() { + translate([-2,-3,0]) cube([5,6,5]); + translate([0,-.2,-1.3]) rotate([0,-38,0]) hull() { + cube([3.3,.2,1.5]); + translate([0,-.8,-3]) cube([3,2,1]); + } + } +} + +module supportPost(x,y,h,r=1,scalex=1,scaley=1,rot=0,thick=0.2,fn=6) { + translate([x,y,0]) rotate([0,0,rot]) scale([scalex,scaley,1]) difference() { + cylinder(h=h,r=r,$fn=fn); + translate([0,0,-.1]) cylinder(h=h+.2,r=r-thick,$fn=fn); + } +} + +module nutCatcher() { + difference() { + cylinder(h=2.3,r1=4.6,r2=4,$fn=18); + // nuts are 5.5mm wide. radius to corner is 5.5/2/.866=3.1755 + translate([0,0,-.1]) cylinder(h=2.5,r1=3.08,r2=3.3,$fn=6); + } +} + +module boltCatcher() { +m3headRad=5.36/2; + difference() { + cylinder(h=2.3,r1=4.5,r2=3.6,$fn=36); + translate([0,0,-.1]) cylinder(h=2.5,r1=m3headRad+0.1,r2=m3headRad+0.25,$fn=24); + } +} + +use ; + +//difference() { + union() { + translate([0, 0, height/2]) effector(); + color("Cyan") { + for (a = [0,120,240]) { + rotate([0,0,a]) { + translate([ 18.4,-20,0]) supportBlade(); + translate([-18.4,-20,0]) rotate([0,0,180]) supportBlade(); + } + } + + supportPost(0,0,height-2.66,r=6.3); + supportPost(0,0,height-2.66,r=7.7); + supportPost(0,0,height+6.25,r=4.5); + supportPost(0,0,height+6.3 ,r=2.5); + } + + // gave up on retractable probe : translate([0,-12.5,height])retractable(); + for (a=[-30:60:270]) { rotate([0,0,a]) { + translate([12.5,0,height-.1]) boltCatcher(); + }} + } +// // bore out a larger hole to hold bowden tube for lower-friction probe guide +// %translate([0,-12.5,-1]) cylinder(h=21.1,r=3.95/2,$fn=24); +//} diff --git a/effectorM.scad b/effectorM.scad new file mode 100644 index 0000000..f140740 --- /dev/null +++ b/effectorM.scad @@ -0,0 +1,122 @@ +include ; +use ; // as altered for chinese all-metal hot-end + +//metric_thread(diameter=5, pitch=0.8, length=8, internal=true); + +offset = 20+4; // Same as DELTA_EFFECTOR_OFFSET in Marlin. +mount_radius = 18; //12.5; // Hotend mounting screws, standard would be 25mm. +hotend_radius = 8; // Hole for the hotend (J-Head diameter is 16mm). +push_fit_height = 4; // Length of brass threaded into printed plastic. +height = 12; + +use ; + +module rodMountHorns() { + for (a = [60:120:359]) rotate([0, 0, a]) translate([0, offset, 0]) + intersection() { + translate([0, -2, 0]) rotate([0, 90, 0]) + cylinder(r=8, h=55, center=true); + rodMountHorn(); + } +} + +module effector() { + difference() { + intersection() { + cylinder(r=2.5*offset,h=height,center=true,$fn=6); + + union() { + cylinder(r=offset+3.7,h=height,center=true,$fn=6); + rodMountHorns(); + + // more bracing on effector + for(a=[90:120:355]) rotate([0,0,a]) translate([19,0,0]) + rotate([90,0,0]) cylinder(r=height*0.8,h=20,$fn=36,center=true); + } + } + + // nut cut-out for horns + for(a=[60:120:355]) rotate([0,0,a]) + translate([0,offset,0]) rodMountHornBore(); + + // hole for hot-end + cylinder(h=height+1,r=16/2+.1,$fn=60,center=true); + + // bolt holes + for (a = [30:60:359]) rotate([0, 0, a]) + translate([0, mount_radius, 0]) + cylinder(r=m3_wide_radius, h=height+1, center=true, $fn=12); + } +} + +// a fuzz of about .1 to .2 good for 3D printing. +// -.1 to -.2 for laser cut projection +module bracePlate(fuzz=.1,hole=6) { + difference() { + union() { + cylinder(r=24,h=4,$fn=60); + for (a = [30:60:359]) rotate([0, 0, a]) + translate([0, mount_radius, 3.9]) nutCatcher(); + } + translate([0,0,2.4]) cylinder(r=8+fuzz,h=6,$fn=60); + // top base plate could be as low as 011.1mm and fit around nut + // default collar is 012mm + translate([0,0,-1]) cylinder(r=hole+fuzz,h=6,$fn=60); + for (a = [30:60:359]) rotate([0, 0, a]) { + translate([0, mount_radius, 0]) + cylinder(r=2.94/2+fuzz, h=9, center=true, $fn=12); + } + } +} + +module nutCatcher() { + difference() { + cylinder(h=2.3,r1=4.6,r2=4,$fn=18); + // nuts are 5.5mm wide. radius to corner is 5.5/2/.866=3.1755 + translate([0,0,-.1]) cylinder(h=2.5,r1=3.08,r2=3.3,$fn=6); + } +} + +module boltCatcher() { +m3headRad=5.36/2; + difference() { + cylinder(h=2.3,r1=4.5,r2=3.6,$fn=36); + translate([0,0,-.1]) cylinder(h=2.5,r1=m3headRad+0.1,r2=m3headRad+0.25,$fn=24); + } +} + +///////////////////////////////////////////////////////////// + +translate([0,0,-6]) mirror([0,0,1]) %metalHotEnd(); + +effector(); + +// pattern for laser-cut top plate +//projection(cut=true) translate([0,0,-1]) +%translate([0,0,8]) + bracePlate(fuzz=0,hole=11.1/2); + +// split bottom plate into two parts +/* +difference() { + bracePlate(fuzz=.1,hole=6); + for (a=[-6,6]) translate([15,a,0]) cube([30,.2,6],center=true); +} +*/ +fz=.2; +if(0) +if(0) { + difference() { + bracePlate(fuzz=.1,hole=6); + translate([15,0,4]) cube([30,12+fz,9],center=true); + translate([15,0,2.4+3]) cube([30,16+fz,6],center=true); + } +} else { + intersection() { + bracePlate(fuzz=.1,hole=6); + translate([15,0,4]) cube([30,12-fz,9],center=true); + } +} + +// other file may use bracePlate and nutCatcher modules +// to build fan mounts and ducts diff --git a/endstop.scad b/endstop.scad index e05bab0..90eaf09 100644 --- a/endstop.scad +++ b/endstop.scad @@ -6,7 +6,7 @@ thickness = 9; // 1mm thicker than linear rail. width = 15; // Same as vertical extrusion. height = 15; -module endstop() { +module endstopForRail() { difference() { union() { cube([width, thickness, height], center=true); @@ -35,4 +35,44 @@ module endstop() { } } -translate([0, 0, height/2]) endstop(); \ No newline at end of file +thick=6; // less thick for carriage +// for more recent design of integrated wheeledCarriage +// use tilt=11.3 for first iteration with trapazoidal base +// slope on original trapazoid bottom carriage was 8mm in 40. +module endstopCarriage(tilt=0) { + difference() { + union() { + //translate([-width/2-1,-height/2,0]) cube([width+2+5, height+2, thick]); + hull() { + translate([-4,-6,0]) cylinder(h=thick,r=4,$fn=22); + translate([ 4,-6,0]) cylinder(h=thick,r=4,$fn=22); + translate([-4, 4,0]) cylinder(h=thick,r=4,$fn=22); + translate([ 6, 4,0]) rotate([0,0,tilt]) translate([9.5,0,0]) + cylinder(h=thick,r=4,$fn=22); + } + translate([-3.4/2,-10,3.5]) cube([3.4, height+3, thick]); + } + + // bolt hole to attach to extrusion + translate([0,-2.5,0]) { + translate([0,0,-1]) cylinder(r=m3_wide_radius, h=20, $fn=12); + translate([0,0,-1]) cylinder(r=3, h=3.3, $fn=24); + translate([0,0,thick+1]) rotate([0,0,30]) + cylinder(r1=5.8/2,r2=8/2,h=4,$fn=6); + } + + translate([3, 4, -1]) { + translate([2.5,0,0]) { + %rotate([90,0,180+tilt]) scale([-1,1,1]) translate([9.5/2-1,-2,0]) microswitch(); + // 2.4mm diam was good for M2.5. go a little smaller for #2 + rotate([0,0,tilt]) + #translate([9.5-1,0,-1.5]) cylinder(r=2.3/2, h=thick+4, $fn=12); + #translate([ -1,0,-1.5]) cylinder(r=2.3/2, h=thick , $fn=12); + } + } + } +} + +//translate([0,30, height/2]) endstopForRail(); +mirror([1,0,0]) // switched sides of carriage + endstopCarriage(11.3*0); diff --git a/endstop.stl b/endstop.stl deleted file mode 100644 index ffd55d1..0000000 Binary files a/endstop.stl and /dev/null differ diff --git a/endstop20v.scad b/endstop20v.scad new file mode 100644 index 0000000..a36f8d2 --- /dev/null +++ b/endstop20v.scad @@ -0,0 +1,44 @@ +use ; +use ; + +m5rad = 4.92/2;//4.88/2; +m5_head_radius = 8.62/2;//8.5/2; // 5mm head height, uses 4mm hex drive + +module microswitchEndstop20v(fuzz) { + difference() { + hull() { + translate([4.6,-4,0]) cylinder(h=10,r=5,$fn=36); + translate([ -5,-4,0]) cylinder(h=10,r=5,$fn=36); + translate([3.6,10,0]) cylinder(h=10,r=5,$fn=36); + translate([-18,10,0]) cylinder(h=10,r=5,$fn=36); + } + + translate([0,16,10+6]) rotate([90,0,0]) ext20(30,fuzz,verbose=0); + translate([-26,-12,8]) cube([20,30,8]); + + // 5mm bolt hole + cylinder(r=m5rad+fuzz,h=11,$fn=15); + translate([0,0,-4]) + cylinder(r2=m5_head_radius,r1=m5_head_radius+.3,h=5,$fn=24); + + // 2.4mm diam was good for M2.5. go a little smaller for #2 + translate([-16.5,10,-1]) for(a=[0,1]) + translate([9.5*a,0,-1]) cylinder(r=2.3/2, h=11, $fn=11); + + // extra clearance for extrusion nut + translate([0,0,8.8]) cube([10,16,4],center=true); + translate([0,0,6 ]) cylinder(r=3.5+.2,h=4,$fn=17); + } + + %translate([-9.5/2-7,10,-3]) rotate([-90,0,0]) microswitch(); +} + +microswitchEndstop20v(.1); + +// support (not helpful with current shallow countersink... just clean up with drill bit) +%color("Cyan") { + difference() { + cylinder(h=.8,r=3.5,$fn=10); + translate([0,0,-1]) cylinder(h=7,r=3.2,$fn=10); + } +} \ No newline at end of file diff --git a/ext15.scad b/ext15.scad new file mode 100644 index 0000000..4a73c49 --- /dev/null +++ b/ext15.scad @@ -0,0 +1,56 @@ +module slotT1(w,rs,re,len) { +$fn=24; + hull() { + translate([-w/2+re,-rs-re+.2,0]) cylinder(r=re,h=len); + translate([ -1 , -8 ,0]) cube([1,8-rs+1.45,len]); + translate([-w/2-0.5,-10 ,0]) cube([w/2,1,len]); + } +} + +module slotT(len) { +rs=3.56/2; +w=15; +d=5; +re=0.5; +$fn=24; + difference() { + translate([-w/2-2,-9,0]) cube([w/2+2,18,len]); + + translate([0,0,-1]) difference() { + union() { + translate([-w/2+d-rs,-10,0]) cube([6,20,len+2]); + slotT1(w,rs,re,len+2); + mirror([0,1,0]) slotT1(w,rs,re,len+2); + } + + translate([-w/2, 0 ,-1]) hull() { + translate([d-rs,0,0]) cylinder(r=rs-0.5,h=len+2); + translate([0,-rs+.2,0]) cube([0.1,2*rs-.4,len+2]); + } + } + } +} + +module ext15(len) { +w=15; +//sw = 3; +ro=1; +$fn=24; + difference() { + hull() { + translate([-w/2+ro,-w/2+ro,0]) cylinder(r=ro,h=len); + translate([-w/2+ro, w/2-ro,0]) cylinder(r=ro,h=len); + translate([ w/2-ro, w/2-ro,0]) cylinder(r=ro,h=len); + translate([ w/2-ro,-w/2+ro,0]) cylinder(r=ro,h=len); + } + + translate([0,0,-1]) { + for (a=[0,90,180,270]) { + rotate([0,0,a]) + slotT(len+2); + } + } + } +} + +ext15(5); diff --git a/ext15ob.scad b/ext15ob.scad new file mode 100644 index 0000000..f39eea2 --- /dev/null +++ b/ext15ob.scad @@ -0,0 +1,59 @@ +module slotT1(w,rs,re,len) { +$fn=24; + hull() { + translate([-w/2+re,-rs-re,0]) cylinder(r=re,h=len); + translate([ -1 , -8 ,0]) cube([1,8-rs+1.2,len]); + translate([-w/2-0.5,-10 ,0]) cube([w/2,1,len]); + } +} + +// rs -- radius of slot (slot width/2) +// d -- depth of slot +module slotT(w,rs,d,len) { +re=0.3; +$fn=24; + difference() { + translate([-w/2-2,-9,0]) cube([w/2+2,18,len]); + + translate([0,0,-1]) difference() { + union() { + translate([-w/2+d-rs,-10,0]) cube([6,20,len+2]); + mirror([0,1,0]) slotT1(w,rs,re,len+2); + slotT1(w,rs,re,len+2); + } + + translate([-w/2, 0 ,-1]) hull() { + translate([d-rs,0,0]) cylinder(r=rs-0.5,h=len+2); + translate([0,-rs+.2,0]) cube([0.1,2*rs-.4,len+2]); + } + } + } +} + +module ext15(len,fuzz=0) { +w=15; + +wz = w + fuzz; +w1 = wz-abs(fuzz)*2; + difference() { + union() { + translate([0,0,len/2]) cube([wz,wz,len],center=true); + if (abs(fuzz) > 0) { // extra room on corners, where slop can be a problem + for(i=[-1,1]) for(j=[-1,1]) + translate([i*w1/2,j*w1/2,0]) + cylinder(r=abs(fuzz)*2,h=len,$fn=8); + } + } + + translate([0,0,-1]) { + for (a=[0,90,180,270]) { + rotate([0,0,a]) + slotT(wz,3.2/2-fuzz,4.5-fuzz,len+2); + } + } + } +} + +ext15(2,0.2); +ext15(4); +translate([0,0,3.98]) ext15(2,-0.1); diff --git a/ext20.scad b/ext20.scad new file mode 100644 index 0000000..daae2e1 --- /dev/null +++ b/ext20.scad @@ -0,0 +1,56 @@ +module slotT625a(w,rs,re,len) { +$fn=24; + hull() { + translate([-w/2+re,-rs-re,0]) cylinder(r=re,h=len); + translate([ -1 ,-rs-5 ,0]) cube([1,7,len]); + translate([-w/2-0.5,-10 ,0]) cube([w/2,1,len]); + } +} + +module slotT625(len,fuzz) { +rs=6.25/2-fuzz; +d=6; +re=0.5; +$fn=24; +w=20+fuzz*2; + difference() { + translate([-w/2-2,-9,0]) cube([w/2+2,18,len]); + + translate([0,0,-1]) difference() { + union() { + translate([-w/2+3,-10,0]) cube([w/2-2,20,len+2]); + slotT625a(w,rs,re,len+2); + mirror([0,1,0]) slotT625a(w,rs,re,len+2); + } + + translate([-w/2,0,-1]) hull() { + translate([0,-rs,0]) cube([0.1,2*rs,len+2]); + translate([d-rs+.5,0,0]) cylinder(r=rs-.5,h=len+2); + } + } + } +} + +module ext20(len,fuzz) { +w=20+fuzz*2; +ro=1; +$fn=24; + difference() { + hull() { + translate([-w/2+ro,-w/2+ro,0]) cylinder(r=ro,h=len); + translate([-w/2+ro, w/2-ro,0]) cylinder(r=ro,h=len); + translate([ w/2-ro, w/2-ro,0]) cylinder(r=ro,h=len); + translate([ w/2-ro,-w/2+ro,0]) cylinder(r=ro,h=len); + } + + translate([0,0,-1]) { + for (a=[0,90,180,270]) { + rotate([0,0,a]) + slotT625(len+2,fuzz); + } + %cylinder(r=4.25/2,h=len+2); + } + } +} + +ext20(5,0.2); diff --git a/ext20v.scad b/ext20v.scad new file mode 100644 index 0000000..c400c56 --- /dev/null +++ b/ext20v.scad @@ -0,0 +1,60 @@ +// cut-out model to fit Openbuilds V-Slot 20mm extrusion + +// fuzz is -1/2 kerf for a laser cutter, +// or the amount of extrusion spread for a 3D printer + +module slotV(len,fuzz,verbose) { +// center of square cylinder for V cut-out is 1mm outside of extrusion. +// outside border of extrusion is 1.9mm. inner slot width is 6.35mm, but +// corners are beveled, so ideal corner would be less +// 1/2 slot width is the same dist as sr-(1+1.9), hence +sr = 1+1.9+(6.2/2); + difference() { + // having testing trouble. I don't want to worry about v-slot tab yet. + // make it extra small until I'm really ready to tweak it (remove -.3) + translate([-10-1,0,0]) cylinder(r=sr-fuzz*sqrt(2)-.3,h=len,$fn=4); + translate([-8+.3+4/2,0,len/2]) cube([4,7,len],center=true); // arbitrary .3mm extra lip to tab + } + + // actual slot profile + if(verbose % 2) %hull() { + translate([-10+2+1.2/2,0,len/2]) cube([1.2,10.6,len],center=true); + translate([-5,0,len/2]) cube([2,4,len],center=true); + } +} + +module ext20(len,fuzz=0,verbose=3) { +w=20+2*fuzz; +w2f = w/2 - 0.6*abs(fuzz); // offset to center of corner stress relief loop +rc = (abs(fuzz) < 0.1) ? 0.2 : 2*abs(fuzz); // radius of corner releif loop +ro=1; +$fn=24; + difference() { + union() { + translate([0,0,len/2]) cube([w,w,len],center=true); + for(i=[-1,1]) for(j=[-1,1]) // extra clearance around corners + translate([w2f*i,w2f*j,0]) cylinder(r=rc,h=len,$fn=8); + } + + translate([0,0,-1]) { + for (a=[0,90,180,270]) { + rotate([0,0,a]) + slotV(len+2,fuzz,verbose); + } + if (floor(verbose/2) % 2) %cylinder(r=2,h=len+2); + } + } +} + +if (0) { // notional display + translate([0,0,4]) ext20(5,0.2); + ext20(5,0); + translate([0,0,-4]) ext20(5,-0.2); +} else { + // quality of fit cutout test cut/print + projection(cut=true) + difference() { + cube([30,30,10],center=true); + translate([0,0,-12/2]) ext20(12,-0.15); // quelab laser cutter + } +} diff --git a/extruder.scad b/extruder.scad index bc9a4d0..a0aad00 100644 --- a/extruder.scad +++ b/extruder.scad @@ -5,14 +5,28 @@ include ; filament_offset = 22.5; +// This is slightly larger than the actual bearing to allow some spinning clearance +module bearingSpace() { +bearingRadius=16/2; +bearingWidth=5; // outside part +hubRadius=7.75/2; +hubInset=0.5; +union() { + difference() { + cylinder(r=bearingRadius+0.5,h=bearingWidth+2*hubInset); + translate([0,0,-.1]) cylinder(r=hubRadius-0.2,h=bearingWidth+2); + } + translate([0,0,hubInset]) cylinder(r=hubRadius+1,h=bearingWidth); +}} + module extruder() { rotate([90, 0, 0]) difference() { union() { //main cylinder - translate([16,20,21]) rotate([90,0,0]) cylinder(h=20, r=17.5); + translate([16,20,21]) rotate([90,0,0]) cylinder(h=20, r=17.5, $fn=48); //bearing mount - translate([31,20,21]) rotate([90,0,0]) cylinder (h=20, r=8); + translate([31,20-3,21]) rotate([90,0,0]) cylinder (h=20-3, r=8); //pushfit/pneufit mount translate([filament_offset, 6.5, 13]) @@ -22,15 +36,19 @@ module extruder() { translate([21.75,6.5,34]) rotate([0,0,0]) cylinder (h=8, r=3, $fn=12); //clamp - translate([20, 0, 28]) cube([13, 20, 14]); + translate([20, 0, 28-2.4]) cube([13, 20, 14+2.5]); } //pulley opening translate([16,21,21]) rotate([90,0,0]){ - cylinder (h=22, r=6.6); + cylinder (h=22, r=6.7+.1, $fn=48); + // Holes for screws to mount into gearhead rotate([0,0,45]) { - //translate([14,0,0]) cylinder(h=22, r=1.6, $fn=12); + // smear hole where tab flexes to go around bolt + hull() { translate([15,-.8,0]) cylinder(h=22, r=1.9, $fn=12); + translate([14,0,0]) cylinder(h=22, r=1.6, $fn=12); } + translate([0,14,0]) cylinder(h=22, r=1.6, $fn=12); translate([-14,0,0]) cylinder(h=22, r=1.6, $fn=12); translate([0,-14,0]) cylinder(h=22, r=1.6, $fn=12); @@ -41,28 +59,37 @@ module extruder() { translate([16,21,21]) rotate([90,0,0]) cylinder (h=3.35, r=11.25); //pulley hub indentation - translate([16,20-2,21]) rotate([90,0,0]) cylinder (h=5.6, r=7); + // my little groved drive does not need this (ab) + //translate([16,20-2,21]) rotate([90,0,0]) cylinder (h=5.6, r=7); + // however, the set screw does stick out, so it needs a little extra at the top + translate([16,18,21]) rotate([90,0,0]) cylinder (h=7, r=7.5); //bearing screws - translate([31,21,21]) rotate([90,0,0]) cylinder (h=22, r=2.6, $fn=12); - #translate([31,22,21]) rotate([90,30,0]) cylinder (h=8.01, r=4.7, $fn=6); + translate([31,21,21]) rotate([90, 0,0]) cylinder (h=22 , r=2.6, $fn=16); + translate([31,22,21]) rotate([90,30,0]) cylinder (h=8.01, r=4.7, $fn=6); //bearing - difference() { + // slic3r 9.9 or before overhang fill works for me (ab) + // 1.0+ fill does not work at all. almost anywhere ;-( + //difference() { union() { - translate([31,9.5,21]) rotate([90,0,0]) cylinder (h=5.25, r=8.5); - translate([31,9.5-5.25,21-8.25-2]) cube([20, 5.25, 18.5]); + // instead of just cylinder, make little extra space to spin freely + //translate([31,9.5+0.75,21]) rotate([90,0,0]) #cylinder (h=5.25, r=8.5); + translate([31,9.5+0.6,21]) rotate([90,0,0]) bearingSpace(); + + //translate([31,9.5+0.6-5.25-.4,21-8.25-2]) #cube([20, 5.25, 18.5]); //opening between bearing and pulley - translate([20,9.5-5.25,21-8.25+3.25+1]) cube([10, 5.25, 8]); + translate([20,9.5+0.75-5.25-.5,21-8.25+3.25+1]) #cube([6, 5.25, 8]); } - //removable supports - for (z = [15:3:27]) { - translate([36, 10, z]) # cube([20, 20, 0.5], center=true); - } - } + + ////removable supports + //for (z = [15:3:27]) { + // translate([36, 10, z]) cube([20, 20, 0.5], center=true); + //} + //} //filament path chamfer - translate([filament_offset,6.5,15]) rotate([0,0,0]) # + translate([filament_offset,6.5,15]) rotate([0,0,0]) cylinder(h=3, r1=0.5, r2=3, $fn=12); //filament path @@ -70,10 +97,11 @@ module extruder() { cylinder(h=60, r=1.1, $fn=12); //pushfit/pneufit mount - translate([filament_offset, 6.5, 0]) # cylinder(r=2.3, h=8, $fn=12); + translate([filament_offset, 6.5, 0]) cylinder(r=2.3, h=8, $fn=12); //clamp slit translate([25,-1,10]) cube([2, 22, 35]); + translate([25.5,-1,34]) rotate([0,10,0]) cube([1.5, 22, 10]); //clamp nut translate([10.5,12,38]) rotate([0,90,0]) cylinder(h=11, r=m3_nut_radius, $fn=6); @@ -83,4 +111,8 @@ module extruder() { } } -extruder(); +// adding brim for quelab print +union(){ +translate([-20,22,.32]) extruder(); +color("Cyan") cylinder(h=.4,r=25,$fn=6); +} \ No newline at end of file diff --git a/extruder.stl b/extruder.stl deleted file mode 100644 index 90d7eb7..0000000 Binary files a/extruder.stl and /dev/null differ diff --git a/extruderMount.scad b/extruderMount.scad new file mode 100644 index 0000000..808188b --- /dev/null +++ b/extruderMount.scad @@ -0,0 +1,47 @@ +// this one turns the extruder motor on it's side relative to the extrusion rail + +include ; + +module shortNema17body() { + intersection() { + translate([0,0,-.1]) cylinder(r=50/2,h=16.2,$fn=120); + cube([42,42,40],center=true); + } + nema17end(9); + translate([0,0,16+8]) nema17end(8); + translate([0,0,16+8+5]) cylinder(h=21,r=36/2,$fn=80); +} +module nema17end(thick) { + translate([-21,-21,-thick]) intersection() { + cube([42,42,thick]); + translate([21,-16,-1]) rotate([0,0,45]) cube([52.5,52.5,10]); + } +} + +module extruderMount() { + difference() { + union() { + translate([-15,-7.5,0]) cube([30,15,20]); + + intersection() { + translate([-21.2,-15,23]) rotate([0,45,0]) cube([30,30,30]); + translate([-18,-16,8]) cube([36,32,50]); + } + } + + // bolt holes + //for (x=[-11, 0, 11]) { + for (x=[-8, 8]) { + translate([x,0,-1]) { + cylinder(r=m3_wide_radius, h=10, $fn=12); + #translate([0, 0, 4.7]) cylinder(r1=2.8, r2=3.5, h=25, $fn=24); + } + } + + translate([0,-8.2,40]) rotate([-90,45,0]) + #scale([1.007,1.007,1.01]) shortNema17body(); + } +} + +extruderMount(); + diff --git a/extrusionTab.svg b/extrusionTab.svg new file mode 100644 index 0000000..ccdf5a9 --- /dev/null +++ b/extrusionTab.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/frameBot.scad b/frameBot.scad new file mode 100644 index 0000000..2f02aff --- /dev/null +++ b/frameBot.scad @@ -0,0 +1,17 @@ + +use ; +use ; + +module frameBot() { + difference() { + vertexB(45); + + translate([0,12,45/2]) rotate([90,0,0]) { + #nema17holes(); + //translate([0,0,2])%nema17(); + } + + } +} + +frameBot(); diff --git a/frame_extruder.scad b/frame_extruder.scad index fc3fb04..11ca2b9 100644 --- a/frame_extruder.scad +++ b/frame_extruder.scad @@ -20,4 +20,7 @@ module frame_extruder() { } } -frame_extruder(); +union() { + translate([0,0,.17]) frame_extruder(); + color("Cyan") cube([15.2,29.2,0.4],center=true); +} \ No newline at end of file diff --git a/frame_extruder.stl b/frame_extruder.stl deleted file mode 100644 index 260fe75..0000000 Binary files a/frame_extruder.stl and /dev/null differ diff --git a/frame_motor.scad b/frame_motor.scad index d83cd8f..3939b92 100644 --- a/frame_motor.scad +++ b/frame_motor.scad @@ -5,34 +5,50 @@ use ; $fn = 24; +module motorScrewsAndAccess(){ + translate([0, motor_offset, 0]) { + // Motor shaft/pulley cutout. + rotate([90, 0, 0]) cylinder(r=12, h=20, center=true, $fn=60); + // NEMA 17 stepper motor mounting screws. + for (x = [-1, 1]) for (z = [-1, 1]) { + scale([x, 1, z]) translate([15.5, -5, 15.5]) { + rotate([90, 0, 0]) cylinder(r=1.65, h=20, center=true, $fn=12); + // Easier ball driver access. + //rotate([74, -30, 0]) cylinder(r=1.8, h=60, $fn=12); + } + } + } +} + +module motorCablePaths() { + for (mirror = [-1, 1]) scale([mirror, 1, 1]) { + translate([-35, 45, 0]) rotate([0, 0, -30]) + cube([4, 15, 15], center=true); + //translate([-6, 0, 0]) cylinder(r=2.5, h=40); + //translate([-11, 0, 0]) cube([15, 4, 15], center=true); + } +} + module frame_motor() { difference() { // No idler cones. vertex(3*extrusion, idler_offset=0, idler_space=100); + // KOSSEL logotype. - translate([20.5, -10, 0]) rotate([90, -90, 30]) - scale([0.11, 0.11, 1]) import("logotype.stl"); - // Motor cable paths. - for (mirror = [-1, 1]) scale([mirror, 1, 1]) { - translate([-35, 45, 0]) rotate([0, 0, -30]) - # cube([4, 15, 15], center=true); - translate([-6, 0, 0]) cylinder(r=2.5, h=40); - translate([-11, 0, 0]) # cube([15, 4, 15], center=true); - } - translate([0, motor_offset, 0]) { - // Motor shaft/pulley cutout. - rotate([90, 0, 0]) cylinder(r=12, h=20, center=true, $fn=60); - // NEMA 17 stepper motor mounting screws. - for (x = [-1, 1]) for (z = [-1, 1]) { - scale([x, 1, z]) translate([15.5, -5, 15.5]) { - rotate([90, 0, 0]) cylinder(r=1.65, h=20, center=true, $fn=12); - // Easier ball driver access. - rotate([74, -30, 0]) # cylinder(r=1.8, h=60, $fn=12); - } - } - } + //translate([20.5, -10, 0]) rotate([90, -90, 30]) + // scale([0.11, 0.11, 1]) import("logotype.stl"); + + //motorCablePaths(); + motorScrewsAndAccess(); + translate([0, motor_offset, 0]) rotate([90, 0, 0]) % nema17(); + } } -translate([0, 0, 22.5]) frame_motor(); +union() { +translate([0, 0, 22.5+0.34]) frame_motor(); +vertexPad(); +mirror([1,0,0]) endBrace(3*extrusion); + endBrace(3*extrusion); +} diff --git a/frame_motor.stl b/frame_motor.stl deleted file mode 100644 index 503c886..0000000 Binary files a/frame_motor.stl and /dev/null differ diff --git a/frame_top.scad b/frame_top.scad index 2285cac..7353b6e 100644 --- a/frame_top.scad +++ b/frame_top.scad @@ -1,23 +1,39 @@ -include ; +//include ; +extrusion=15; use ; $fn = 24; module frame_top() { +m3nutRad = 5.45/2/cos(30) + 0.1; difference() { - vertex(extrusion, idler_offset=3, idler_space=12.5); + vertex(extrusion); + // M3 bolt to support idler bearings. - translate([0, 65, 0]) rotate([90, 0, 0]) # - cylinder(r=m3_radius, h=55); + //translate([0, 65, 0]) rotate([90, 0, 0]) cylinder(r=m3_radius, h=55); + // Vertical belt tensioner. - translate([0, 10, 0]) rotate([18, 0, 0]) union() { - cylinder(r=m3_wide_radius, h=30, center=true); - translate([0, -3, 8]) cube([2*m3_wide_radius, 6, 12], center=true); - translate([0, 0, -2]) scale([1, 1, -1]) rotate([0, 0, 30]) # - cylinder(r1=m3_nut_radius, r2=m3_nut_radius+1, h=10, $fn=6); + %translate([0, 10, 0]) rotate([18, 0, 0]) union() { + cylinder(r=2.94/2+.2, h=30, center=true); + //translate([0, -3, 8]) cube([2*m3_wide_radius, 6, 12], center=true); + translate([0, 0, -2]) scale([1, 1, -1]) rotate([0, 0, 30]) + cylinder(r1=m3nutRad-0.1, r2=m3nutRad+0.3, h=10, $fn=6); } } } -translate([0, 0, 7.5]) frame_top(); +use ; + +union() { + translate([0, 0, 7.5]) rotate([0,180,0]) frame_top(); + //vertexPad(); + mirror([1,0,0]) endBrace(extrusion); + endBrace(extrusion); + + color("Cyan") { // support material + for (a=[-1,1]) supportPillar(18.2*a,-1,5); + translate([0,0,5]) supportPillar(0,-5,5,r=0.7); + } + +} diff --git a/frame_top.stl b/frame_top.stl deleted file mode 100644 index 05bf6ba..0000000 Binary files a/frame_top.stl and /dev/null differ diff --git a/frogCarriage.scad b/frogCarriage.scad new file mode 100644 index 0000000..85219b4 --- /dev/null +++ b/frogCarriage.scad @@ -0,0 +1,282 @@ +include ; +use ; + +separation = 40; // width of rod mount cones +thickness = 6; + +horn_thickness = 13; +horn_x = 8; + +belt_width = 6; +belt_x = 5.6; +belt_z = 7; + +// Parameters for wheeled base +base_thickness = 11; // wheel carriage level thickness +wheel_radius = 8; // delrin wheels +extrusion_width = 15; +wheel_offset = 22; // wheel pair wheelbase +m3_head_radius=5.36/2+0.2; +boltSep = 10; // tension bolt seperation half-dist +m3rad = 2.94/2+0.1; // tight fit, at least for vertical m3 screw holes. + +module carriage() { + // Timing belt (up and down). + translate([-belt_x, 0, belt_z + belt_width/2]) % + cube([1.7, 100, belt_width], center=true); + translate([belt_x, 0, belt_z + belt_width/2]) % + cube([1.7, 100, belt_width], center=true); + difference() {union() { + // Main body + hull() { + translate([-9.5,-15,-.5]) cube([19.2,30,1]); + translate([-9.5, -8,thickness-1]) cube([19.2,16,1]); + } + + // Ball joint mount horns. + for (x = [-1, 1]) { + scale([x, 1, 1]) intersection() { + translate([0, 0, horn_thickness/2]) + cube([separation, 18, horn_thickness], center=true); + translate([horn_x, 0, horn_thickness/2]) rotate([0, 90, 0]) + cylinder(r1=14, r2=2.5, h=separation/2-horn_x); + } + } + + // side support + for (i=[-1,1]) { hull() { + translate([ 9.8*i,-7.5,12]) scale([1,2,1]) rotate([0,0,22.5]) cylinder(h=1,r=2,$fn=8); + translate([ 9.8*i, 7.5,12]) scale([1,2,1]) rotate([0,0,22.5]) cylinder(h=1,r=2,$fn=8); + translate([ 9.6*i,-18,0]) sphere(2,$fn=8); + translate([ 9.6*i, 18,0]) sphere(2,$fn=8); + translate([14*i,0,0]) cylinder(h=1,r=3,$fn=6); + }} + + translate([2.1,-8.1,3.5]) rotate([0,0,180]) beltCatch(9.5); + translate([2.1, 8.1,3.5]) mirror([1,0,0]) beltCatch(9.5); + + // belt catch support/fill + translate([ 3 ,-24,3.5]) cube([4,48,3.5]); + translate([-1.6,-16,3.5]) cube([6,32,3.5]); + } + + // Screws for ball joints. + translate([0, 0, horn_thickness/2]) rotate([0, 90, 0]) + cylinder(r=m3rad, h=60, center=true, $fn=13); + // Lock nuts for ball joints. + for (x = [-1, 1]) { + scale([x, 1, 1]) intersection() { + translate([horn_x, 0, horn_thickness/2]) rotate([90, 0, -90]) + cylinder(r1=m3_nut_radius-0.2, r2=m3_nut_radius+0.5, h=8, + center=true, $fn=6); + } + } + } +} + + +module wheelAxleBrace() { + intersection() { + cylinder(h=base_thickness+3,r=6,$fn=36); + translate([0,0,3]) scale([1,1,2.2]) sphere(6.5,$fn=36); + } +} +module wheelAxleHole(dHeadRad) { + translate([0,0,-30]) cylinder(h=60,r=m3rad,$fn=13); + translate([0,0,base_thickness-1]) + cylinder(h=10,r1=m3_head_radius-.1+dHeadRad, + r2=m3_head_radius+.5+dHeadRad,$fn=30); +} +module mobileWheelMount(dilation) { +bthick = base_thickness + 2*dilation; +br = wheel_radius-2 + 2*dilation; + difference() { + hull() { + intersection() { + cylinder(r=br+1,h=bthick,$fn=36); + if(dilation==0) translate([0,0,bthick*0.7]) + scale([1,1,2]) sphere(br+0.5,$fn=36); + } + if (0) %translate([-br+2,0,base_thickness/2]) + rotate([0,90,0]) for (a=[-boltSep,boltSep]) { + translate([0,a,0]) rotate([0,0,30]) + cylinder(h=wheel_radius*2+99*abs(dilation),r=(bthick/2)/cos(30),$fn=6); + } + translate([-br+2,0,base_thickness/2]) + rotate([0,90,0]) for (a=[-1,1]) { + translate([0,boltSep*a*1.0,0]) + intersection() { + cylinder(h=wheel_radius*2+99*abs(dilation), + r=bthick*0.6,$fn=60); + cube([bthick,30,40],center=true); + } + } + } + if (dilation==0) { // this is the ACTUAL mount, not a socket, add screw holes + translate([0,0,-2.2]) wheelAxleHole(0); + translate([0,0,bthick/2]) rotate([0,90,0]) { + for (i=[-boltSep,boltSep]) { + translate([0,i,-1]) wheelAxleHole(-0.1); + } + } + } + } +} + +module cableCatchBrace() { +$fn=12; + hull() { + translate([ 1,7,12]) scale([7,2,3]) sphere(1); + translate([24,-2,7]) scale([2,3,5]) sphere(1); + translate([ 7,-2,9]) scale([1,3,1]) sphere(1); + translate([12,-5,8]) cube([16,1,4],center=true); + } + + // more bracing for under belt catch + hull() { + translate([-5,-8,14]) scale([3,1,1]) sphere(1); + translate([-4, 2,14]) scale([6,1,1]) sphere(1); + translate([-7, 3, 2]) scale([8,1,1]) sphere(1); + } + +} + +module wheelBase() { +dx = extrusion_width/2+wheel_radius-0.5; // wheel rides roughly 0.5mm inside rail +supportSpread = 6; + difference() { + union() { + for (i=[-wheel_offset,wheel_offset]) { + hull() { // main wheel axle screw holder pair + translate([-dx, i,0]) wheelAxleBrace(); + translate([-dx+10,(i<0)?i+11:i-11,10]) + sphere(1,$fn=6); + } + } + + // tension screw housing pair + translate([0,0,base_thickness/2]) rotate([0,90,0]) { + for (i=[-1,1]) { + hull() translate([0,i*boltSep,-20]) { + cylinder(r=5,h=41,$fn=36); + translate([5.43,0,16.5]) cube([.1,2,32],center=true); + } + } + } + + // brace section for mobile mount + hull() { + //%translate([16,0,base_thickness/2]) cube([24, 44,base_thickness],center=true); + for(a=[-1,1]) translate([4,15*a,base_thickness/2]) + rotate([0,90,0]) rotate([0,0,22.5]) + cylinder(r=base_thickness/2/cos(22.5),h=23,$fn=8); + translate([-6,0,base_thickness]) cube([1,14,.1],center=true); + } + + // brace between main fixed wheel axles + //%translate([-dx-2,-16,0]) cube([ 7,32,base_thickness]); + hull() for(i=[-wheel_offset,wheel_offset]) + translate([-dx+1,i,6]) scale([1.5,.1,3]) sphere(2,$fn=36); + + // extra bracing from belt catch to mobile mount rails + translate([0,-15,1]) cableCatchBrace(); + translate([0, 15,1]) mirror([0,1,0]) cableCatchBrace(); + } + + // Adjustable tension screw holes + translate([0,0,base_thickness/2]) rotate([0,90,0]) { + for(i=[-boltSep,boltSep]) { + translate([0,i,-24]) { + cylinder(r=m3rad,h=60,$fn=13); + cylinder(r1=m3_nut_radius+.4, r2=m3_nut_radius-.2, h=7, $fn=6); + } + } + } + } +} + +module wheelBaseHoles() { +dx = extrusion_width/2+wheel_radius; + for (a=[-wheel_offset,wheel_offset]) + translate([-dx+0.5,a,1]) wheelAxleHole(0); + translate([dx-2 ,0,0 ]) mobileWheelMount(.2); // dilated version for main slot + translate([dx-2.5,0,0.5]) mobileWheelMount(-.1); // shrunk, and shifted up to raise ceiling a bit +} + +module earBrace() { + intersection () { + hull() { + rotate([0,55,0]) scale([2,1,1]) cylinder(r=.4,h=7,$fn=12); + linear_extrude(height=0.1) + polygon(points=[[0,0],[7,1.5],[7,-1.5]], paths=[[0,1,2,0]]); + } + translate([-2,-5,0]) cube([10,10,10]); + } +} + +module frogCarriage() { + difference() { + union() { + translate([0,0,base_thickness-.4]) mirror([1,0,0]) carriage(); + wheelBase(); + } + + wheelBaseHoles(); + + // extra clearance for extrusion rail + translate([-9, -30,-.1]) cube([18,60,1.5]); + } +} + +module supportPillar(x,y,len,rot=0,r=2,xscale=1) { + translate([x,y,0]) difference() { + rotate([0,0,rot]) scale([xscale,1,1]) cylinder(r=r ,h=len ,$fn=6); + translate([0,0,-0.5]) rotate([0,0,rot]) scale([xscale,1,1]) cylinder(r=r-.25,h=len+1,$fn=6); + } +} +module supportPillar4(x,y,dx,dy,dz,rot=0) { +t=0.3; +x0 = x + ((x<0)?dx:-dx)/2; +y0 = y + ((y>0)?dy:-dy)/2; + translate([x0,y0,dz/2]) rotate([0,0,rot]) difference() { + cube([dx ,dy ,dz ],center=true); + cube([dx-t,dy-t,dz+1],center=true); + } +} + +use ; +%translate([0,33,6.5]) rotate([180,0,0]) endstopCarriage(); + +%translate([extrusion_width/2+wheel_radius-1+22*0,0,0]) mobileWheelMount(0); + +union() { + frogCarriage(); + + // support structures + //if(0) + color("Cyan") { + translate([ 17.3,0,base_thickness+.9]) scale([0.5,0.6,0.7]) earBrace(); + translate([-17.3,0,base_thickness+.9]) mirror([1,0,0]) scale([0.5,0.6,0.7]) earBrace(); + for (i=[-1,1]) { + supportPillar(19.3*i,0,12.2,r=1.5); // under horn earBrace()'s + + // horn overhang + supportPillar(14,12 *i,base_thickness+.4,r=1.2,xscale=3.5); + supportPillar(12, 8.5*i,base_thickness+.4,-30*i,xscale=2.5,r=1.3); + supportPillar(12.6,4*i,base_thickness+.4,-38*i,r=1.2,xscale=4); + + supportPillar(5.5,16.3*i,2,r=1.5); + supportPillar4(8,14*i,5,4.5,2); + supportPillar4(-8,7.2*i,16,5.4,2); + supportPillar4(-6,9*i,12,2,2); + + supportPillar(5,4*i,2,70*i,r=1.2,xscale=2); + supportPillar(8.5,3.3*i,13,i*17,r=1.2); + //supportPillar(-9,3*i,12,10*i,r=1.5); + //supportPillar(-3.5,3.5*i,11,xscale=2.5,r=1.3); + } + supportPillar(11,0,base_thickness+.4,xscale=2,r=2); + supportPillar(4.5,0,2,r=1.2); + supportPillar(-5.5,0,12,r=2,xscale=2); + } +} diff --git a/frogCarriage20v.scad b/frogCarriage20v.scad new file mode 100644 index 0000000..93fb2df --- /dev/null +++ b/frogCarriage20v.scad @@ -0,0 +1,306 @@ +// frog carriage design, for OpenBuilds 20mm V-slot extrusion, +// with low-profile OpenBuilds solid v-wheels + +include ; +use ; +use ; + +thickness = 6; + + +belt_width = 6; +belt_x = 5.6; +belt_z = 7; + +extrusion_width = 20; + +// Parameters for wheeled base +base_thickness = 11; // wheel carriage level thickness +wheel_radius = 15.23/2; // openbuilds solid low-profile v delrin wheels +wheel_slot_penetration = 1.75; // wheel rides this far inside slot +wheel_dx = extrusion_width/2+wheel_radius-wheel_slot_penetration; + + +wheel_offset = 25; // wheel pair wheelbase +boltSep = 12; // tension bolt seperation half-dist + +m3_head_radius=5.36/2+0.2; +m3rad = 2.94/2+0.15; // tight fit, at least for vertical m3 screw holes. +m3nutRad = 5.45/2/cos(30); + +m5rad = 4.92/2 + 0.2;//4.88/2; +m5_head_radius = 8.62/2;//8.5/2; // 5mm head height, uses 4mm hex drive + +hornAxisHeight = 13/2; + +/* 40mm separation version +module ballJointMountHorns() { +separation = 40; // width of rod mount cones +horn_thickness = 13; +horn_x = 8; + #for (x = [-1, 1]) { + scale([x, 1, 1]) intersection() { + translate([0, 0, horn_thickness/2]) + cube([separation, 18, horn_thickness], center=true); + translate([horn_x, 0, horn_thickness/2]) rotate([0, 90, 0]) + cylinder(r1=14, r2=2.5, h=separation/2-horn_x); + } + } +} +*/ + +// for 50mm separation +module ballJointMountHorns() { + translate([0,0,hornAxisHeight]) + difference() { + intersection() { + rodMountHorn(); // for 50mm separation + cube([51,16,hornAxisHeight*2],center=true); + } + translate([-2,0,0]) cube([16,50,22],center=true); + } +} + +module carriage() { + // Timing belt (up and down). + for (a=[-1,1]) translate([a*belt_x, 0, belt_z + belt_width/2]) + %cube([1.7, 100, belt_width], center=true); + + difference() { + union() { + // Main body + hull() { + translate([-9.5,-15,-.5]) cube([19.2,30,1]); + translate([-9.5, -8,thickness-1]) cube([19.2,16,1]); + } + + ballJointMountHorns(); + + // side support + for (i=[-1,1]) hull() { + translate([10.6*i,0,12]) scale([1, 6 ,1]) cylinder(h=1 ,r=2,$fn=12); + translate([ 9 *i,0, 0]) scale([1,10.9,1]) cylinder(h=.1,r=2,$fn=18); + + translate([18*i,0,2]) cylinder(h=7,r=3,$fn=6); + } + + translate([2.1,-8.1,3.5]) rotate([0,0,180]) beltCatch(9.5); + translate([2.1, 8.1,3.5]) mirror([1,0,0]) beltCatch(9.5); + + // belt catch support/fill + translate([ 3 ,-24,3.5]) cube([4,48,3.5]); + translate([-1.6,-16,3.5]) cube([6,32,3.5]); + } + + // Screws for ball joints. + translate([0,0,hornAxisHeight]) rodMountHornBore(boreLen=13); + + } +} + + +module wheelAxleBrace() { + intersection() { + cylinder(h=base_thickness+5,r=7,$fn=36); + translate([0,0,-5.3]) scale([1,1,2.5]) sphere(10,$fn=36); + } +} +module wheelAxleHole(dHeadRad) { + translate([0,0,-30]) cylinder(h=60,r=m3rad,$fn=13); + translate([0,0,base_thickness-1]) + cylinder(h=9,r1=m3_head_radius-.1+dHeadRad, + r2=m3_head_radius+.5+dHeadRad,$fn=30); +} +module wheelAxleHole5(dHeadRad) { + translate([0,0,-40]) cylinder(h=60,r=m5rad,$fn=13); + cylinder(h=11,r1=m5_head_radius-.1+dHeadRad, + r2=m5_head_radius+.5+dHeadRad,$fn=30); +} +module mobileWheelMount(dilation) { +bthick = base_thickness + 2*dilation; +br = 7 + 2*dilation; + difference() { + hull() { + translate([-br,0,base_thickness/2]) + rotate([0,90,0]) for (a=[-1,1]) { + translate([0,boltSep*a,0]) + intersection() { + cylinder(h=18+99*abs(dilation),r=bthick*0.55,$fn=6); + cube([bthick,20,60],center=true); + } + } + } + if (dilation==0) { // this is the ACTUAL mount, not a socket, add screw holes + translate([0,0,bthick-5.1]) wheelAxleHole5(0); + translate([0,0,bthick/2 ]) rotate([0,90,0]) { + for (i=[-boltSep,boltSep]) { + translate([0,i,-1]) wheelAxleHole(-0.1); + } + } + } + } +} + +module cableCatchBrace() { +$fn=12; + hull() { + translate([ 1,7,12]) scale([7,2,3]) sphere(1); + translate([24,-2,7]) scale([2,3,5]) sphere(1); + translate([ 7,-2,9]) scale([1,3,1]) sphere(1); + translate([12,-boltSep+6,8]) cube([16,1,4],center=true); + } + + // more bracing for under belt catch + hull() { + translate([-5,-8,14]) scale([3,1,1]) sphere(1); + translate([-4, 2,14]) scale([6,1,1]) sphere(1); + translate([-7, 3, 2]) scale([8,1,1]) sphere(1); + } + +} + +module wheelBase() { +supportSpread = 6; + difference() { + union() { + for (i=[-wheel_offset,wheel_offset]) { + hull() { // main wheel axle screw holder pair + translate([-wheel_dx, i,0]) wheelAxleBrace(); + translate([-wheel_dx+10,(i<0)?i+11:i-11,10]) + sphere(1,$fn=6); + } + } + + // tension screw housing pair + translate([0,0,base_thickness/2]) rotate([0,90,0]) { + for (i=[-1,1]) { + hull() translate([0,i*boltSep,-20]) { + cylinder(r=5,h=41,$fn=36); + translate([5.43,0,16.5]) cube([.1,2,32],center=true); + } + } + } + + // brace section for mobile mount + hull() { + for(a=[-1,1]) translate([2,(boltSep+4)*a,base_thickness/2]) + rotate([0,90,0]) + intersection() { + rotate([0,0,22.5]) + cylinder(r=base_thickness/2+1,h=25,$fn=8); + //cylinder(r=base_thickness/2/cos(22.5),h=23,$fn=8); + cube([base_thickness,base_thickness,80],center=true); + } + translate([-8,0,base_thickness]) cube([1,14,.1],center=true); + } + + // brace between main fixed wheel axles + hull() for(i=[-wheel_offset,wheel_offset]) + translate([-wheel_dx+1,i,6]) scale([1.5,.1,3]) sphere(2,$fn=36); + + // extra bracing from belt catch to mobile mount rails + translate([0,-15,1]) cableCatchBrace(); + translate([0, 15,1]) mirror([0,1,0]) cableCatchBrace(); + + // brace under mount horn on non-mobile side. + // not structurally necessary, but allows us to print with + // less support material + hull() { + translate([-19,0,11]) scale([1,2,1]) cylinder(r=2,h=.1,$fn=36); + translate([-15,0,10.7]) scale([1,2,1]) cylinder(r=4.3,h=.1,$fn=48); + translate([-16.7,0,6]) sphere(1,$fn=10); + } + + } + + // Adjustable tension screw holes + translate([0,0,base_thickness/2]) rotate([0,90,0]) { + for(i=[-boltSep,boltSep]) { + translate([0,i,-24]) { + cylinder(r=m3rad,h=60,$fn=13); + cylinder(r1=m3nutRad+.4, r2=m3nutRad-.2, h=7, $fn=6); + } + } + } + } +} + +module wheelBaseHoles() { + for (a=[-wheel_offset,wheel_offset]) + translate([-wheel_dx,a,base_thickness+1]) wheelAxleHole5(0); + translate([wheel_dx-1.5,0,0 ]) mobileWheelMount(.15); // dilated version for main slot + // raise supported ceiling a bit, since it is hard to clen supports + translate([wheel_dx+2.3,0,base_thickness-.7]) + cube([22,2*(boltSep+2),2],center=true); +} + +module frogCarriage() { + difference() { + union() { + translate([0,0,base_thickness-.4]) mirror([1,0,0]) carriage(); + wheelBase(); + } + + wheelBaseHoles(); + + // extra clearance for extrusion rail + //#translate([-9, -30,-.1]) cube([18,60,1.5]); + } +} + +use ; + +module mobileMountSupportBlade() { + intersection () { + rotate([60,0,0]) cube([.4,3,6],center=true); + translate([-1,-2,0]) cube([1,6,3]); + } +} +module mobileMountSupport() { + for(a=[-3.9:4:10]) + translate([a,-boltSep-4.3,0]) mobileMountSupportBlade(); +} + + + +//if (0) +%translate([wheel_dx+33*1,0,0]) { + mobileWheelMount(0); + // support + color("Green") { + //translate([3,0,0]) + mobileMountSupport(); + mirror([0,1,0]) mobileMountSupport(); + } +} + +frogCarriage(); + +// support structures +//if(0) +color("Cyan") { + translate([ 22.3,0,base_thickness+.2]) scale([0.5,0.6,0.7]) earBrace(); + translate([-22.3,0,base_thickness+.2]) mirror([1,0,0]) scale([0.5,0.6,0.7]) earBrace(); + + // under horn. Slightly different heights for mobile clearance + translate([19.5,0,0]) rotate([0,0,90]) supportPillar(0,0,base_thickness+.2,r=1,xscale=5); + + + for (i=[-1,1]) { + supportPillar(24*i,0,12.2,r=1.5); // under horn earBrace()'s + + // horn overhang + supportPillar(13.5 ,11.4*i,base_thickness+.2,r=1,xscale=6,rot=15*i); + supportPillar4(10.5 , 10.5 *i,5,4,base_thickness+.2); + } + supportPillar4(12.6,0,9,15,base_thickness+.2); + supportPillar4(12.6,0,5,11,base_thickness+.2); + supportPillar4(12.6,0,2, 7,base_thickness+.2); + supportPillar(-9.5,0,9,r=1.4,xscale=5,rot=90); + supportPillar(-5 ,0,8,r=1.3,xscale=5,rot=90); +} + +use ; +// This carriage sits 1.8mm above extrusion +%translate([0,-40,6-1.8]) rotate([0,180,0]) microswitchEndstop20v(0); + diff --git a/gamma28mount100x100.pl b/gamma28mount100x100.pl new file mode 100755 index 0000000..18ce5bb --- /dev/null +++ b/gamma28mount100x100.pl @@ -0,0 +1,54 @@ +#!/usr/bin/perl -w +# $URL: svn+ssh://mrwhat@ssh.boim.com/home/mrwhat/svn/Walker/trunk/e20payload30_171x285.pl $ +# $Id: e20payload30_171x285.pl 417 2014-04-19 14:38:28Z mrwhat $ + +require 'laserPartsUtil.pl'; + +# get this from file name to make SURE it matches +($wmm,$hmm) = &parseSizeFromFileName($0); +print STDERR "$wmm x $hmm\n"; +&printLaserCutHeader($wmm,$hmm); + + +# set up standard cart. coords with origin near LLC +print "\n"; +&plotCircle(0,58.5 ,3,16); +&plotCircle(31+35,12,3,16); +print ""; + +print " +long side brace to glue on +\n"; + +print "\nExtra bracing for thin arm, flush with box +\n"; +print "\n"; + +print "\nCut-out for gamma28 duct. +Delete this for actual brace cut, but delete everything else to cut +hole for duct on main box. +\n\n"; + +print "\nVent holes +Delete this for actual brace cut, but delete everything else to cut +vent holes in main box.\n"; +for ($x=10; $x < 70; $x+=18) { + for ($y=4; $y<=16; $y+=4) { + print "\n"; + } +} + + +print "\n\n\n"; # end of drawing + diff --git a/glassBedTab.scad b/glassBedTab.scad new file mode 100644 index 0000000..5521876 --- /dev/null +++ b/glassBedTab.scad @@ -0,0 +1,49 @@ +// Glass print bed holder tab + +// ---- 250mm borosilicate plate from ultibots. +//plateDiam = 9.84 * 25.4; +//plateThick = 3.3; +//tabHeight = 6.5; + +// ---- 9" springform pan base, norpro, tempered glass +plateDiam = 9.03 * 25.4; +plateThick = 4.9; +tabHeight = 8; + + +tabWidth = 3; // amount of tab that sits on top of glass + + +m3threadRad = 2.88/2; +m3HeadRad = 5.4/2; + +plateRad = plateDiam/2; + +// need bolt head 4.5mm above extrusion to use 8mm bolt +counterSink = tabHeight-4.5; // depth of bolt head countersink + + +difference() { + scale([1.3,1.6,1]) cylinder(r=10,h=tabHeight,$fn=60); + + // m3 bolt hole + translate([0,-9,-1]) { + cylinder(r=m3threadRad+0.3,h=11,$fn=17); + cylinder(r1=m3HeadRad+.4,r2=m3HeadRad+.15,h=1+counterSink,$fn=25); + } + + translate([0,plateRad-tabWidth,tabHeight-plateThick+.2]) { + cylinder(r=plateRad,h=plateThick+.3,$fn=180); + translate([0,0,-tabHeight+plateThick-1]) + cylinder(r=plateRad-tabWidth,h=plateThick+2,$fn=180); + } + +} + +%color("Cyan") { // support + translate([0,-9,0]) difference() { + cylinder(h=counterSink-.3,r=2.35,$fn=8); + translate([0,0,-1]) + cylinder(h=6,r=2.2,$fn=8); + } +} \ No newline at end of file diff --git a/glassBedTab10.scad b/glassBedTab10.scad new file mode 100644 index 0000000..8b4191a --- /dev/null +++ b/glassBedTab10.scad @@ -0,0 +1,37 @@ +// Glass print bed holder for 10" borosilicate plate +// from ultibots. + +plateDiam = 9.84 * 25.4; +plateThick = 3.3; + +m3threadRad = 2.88/2; +m3HeadRad = 5.4/2; + +plateRad = plateDiam/2; + +tabHeight = 6.5; + +difference() { + scale([1.3,1.6,1]) cylinder(r=10,h=tabHeight,$fn=60); + + // m3 bolt hole + translate([0,-9,-1]) { + cylinder(r=m3threadRad+0.3,h=11,$fn=11); + cylinder(r1=m3HeadRad+.35,r2=m3HeadRad+.1,h=1+3-.5,$fn=17); + } + + translate([0,plateRad-4,tabHeight-plateThick+.2]) { + cylinder(r=plateRad,h=plateThick+.3,$fn=180); + translate([0,0,-tabHeight+plateThick-1]) + cylinder(r=plateRad-3,h=plateThick+2,$fn=180); + } + +} + +color("Cyan") { // support + translate([0,-9,0]) difference() { + cylinder(h=2.2,r=2.35,$fn=8); + translate([0,0,-1]) + cylinder(h=4,r=2.2,$fn=8); + } +} \ No newline at end of file diff --git a/glass_frame.stl b/glass_frame.stl deleted file mode 100644 index ed0efef..0000000 Binary files a/glass_frame.stl and /dev/null differ diff --git a/glass_tab.stl b/glass_tab.stl deleted file mode 100644 index 3edcc30..0000000 Binary files a/glass_tab.stl and /dev/null differ diff --git a/hotEndProbeMount.scad b/hotEndProbeMount.scad new file mode 100644 index 0000000..abdac8b --- /dev/null +++ b/hotEndProbeMount.scad @@ -0,0 +1,26 @@ +use ; + +ew = 16.1+.3; +eh = 9.75+.2; +mountPlateThickness=3; +difference() { + union() { + hull() { + translate([0,0,5/2]) cube([19,13,5],center=true); + translate([0,18,0.5]) cube([8,1,1],center=true); + } + hull() { + translate([0,21.8,7.3]) cube([14.5,8,1.3],center=true); + translate([0,7,3]) cube([3,2,4],center=true); + translate([0,16,0.5]) cube([10,10,1],center=true); + } + } + translate([-ew/2,-eh/2,mountPlateThickness]) cube([ew,eh,5]); + translate([0,0,-1]) cylinder(r=2.94/2+.2,h=9,$fn=24); +} + +%translate([0,9.8/2,12+mountPlateThickness]) { // Z offset to nozzle center + translate([0,25,0]) rotate([90,0,0]) cylinder(h=20,r=.2,$fn=4); // show where hot-end tip centerline is + rotate([-90,0,0]) cylinder(h=4.5,r2=0.3,r1=4,$fn=24); + translate([0,18,0]) rotate([90,0,0]) rotate([0,0,-60]) magnetMount(disk=2); +} diff --git a/hotEndRetainer.scad b/hotEndRetainer.scad new file mode 100644 index 0000000..e5dc111 --- /dev/null +++ b/hotEndRetainer.scad @@ -0,0 +1,168 @@ +include ; +use ; // as altered for chinese J hot-end + + +separation = 40; // Distance between ball joint mounting faces. +offset = 20; // Same as DELTA_EFFECTOR_OFFSET in Marlin. +mount_radius = 12.5; // Hotend mounting screws, standard would be 25mm. +hotend_radius = 8; // Hole for the hotend (J-Head diameter is 16mm). +push_fit_height = 4; // Length of brass threaded into printed plastic. +height = 8; +cone_r1 = 2.5; +cone_r2 = 14; + +//// dimensions of attachment groove in chineese knock-off J-head +radGroove = 12.1/2; +// groove width is 4.5. Make a little thinner for "slop" and pad +grooveWidth = 4.4; + +module nutCatcher() { + difference() { + cylinder(h=2.3,r1=4.6,r2=4,$fn=36); + // nuts are 5.5mm wide. radius to corner is 5.5/2/.866=3.1755 + translate([0,0,-.1]) cylinder(h=2.5,r1=3.08,r2=3.3,$fn=6); + } +} + +// key piece of hot-end retainer, alone for building fan mount/duct +module hotEndKey() { + difference() { + union() { + translate([0,11,grooveWidth/2]) cube([12-0.1,18,grooveWidth],center=true); + //%cylinder(r=offset-3, h=4.4, $fn=60); + translate([0, mount_radius, grooveWidth-0.1]) + nutCatcher(); + } + + translate([0,0,-.1]) cylinder(r=radGroove+.2,h=5,$fn=48); + + translate([0, mount_radius, 0]) + cylinder(r=m3_wide_radius, h=2*height, center=true, $fn=12); + } +} + +module hotEndRetainer() { +radGroove = 12.1/2; + difference() { + union() { + // groove width is 4.5. Make a little thinner for "slop" and pad + cylinder(r=offset-3, h=4.4, $fn=60); + + for (a = [0:60:359]) rotate([0, 0, a]) + translate([0, mount_radius, 4.3]) + nutCatcher(); + } + + translate([0,0,-.1]) cylinder(r=radGroove+.2,h=5,$fn=48); + + for (a = [0:60:359]) rotate([0, 0, a]) { + translate([0, mount_radius, 0]) + cylinder(r=m3_wide_radius, h=2*height, center=true, $fn=12); + } + translate([ radGroove-.3,0,0]) cube([.3,20,5]); + translate([-radGroove-.2,0,0]) cube([.3,20,5]); + } +} + +fanBoltSep = 32; // distance between fan bolt centers +/* +module fanBoltReceivers() { + for(x=[-1,1]) { for(y=[-1,1]) { + translate(fanBoltSep*0.5*[x,y,0]) difference() { + cylinder(h=4,r=3.3,$fn=16); + + // try to make holes tight enough to directly thread an M3 bolt + translate([0,0,-1]) cylinder(h=6,r=2.7/2,$fn=9); + } + }} +} +*/ + +module fanMount40mm() { + union() { + // frame under outside edge of fan + translate([-22,-20,0]) difference() { + cube([40,40,4]); + + // flatten circle edges for extra bracing + translate([20,20,1]) intersection() { + cylinder(r=19,h=10,$fn=48,center=true); + cube([35,35,8],center=true); + } + + // notch in frame for bolt + translate([36,20,6]) rotate([0,90,0]) cylinder(h=4,r=6,$fn=9); + + // don't bother with top of frame. Will generate too much fill. + // may glue more ducting there later if necessary + translate([-1,7,-1]) cube([15,26,8]); + + // fan bolt holes. + // make tight enough to directly thread an M3 bolt, no nut + translate([20,20,-1]) { for(x=[-1,1]) { for(y=[-1,1]) { + translate(fanBoltSep*0.5*[x,y,0]) + cylinder(h=6,r=2.8/2,$fn=9); + }}} + } + + // duct/redirection toward hot-end + translate([-22,0,5]) rotate([0,90,0]) scale([1.2,1,1]) difference() { + cylinder(h=42,r=20.5,$fn=48); + translate([ 0 ,0,-2]) cylinder(h=42,r=19,$fn=48); + translate([-22,0,-1]) cylinder(h=44,r=16,$fn=16); + translate([3.8,-22,-1]) cube([20,44,44]); // chop off stuff that intersects with fan + translate([-6,0,39]) scale([1,2,1]) cylinder(h=5,r=7,$fn=16); // chop off stuff that fills in drill holes + translate([-17,0,39]) scale([1,2,1]) cylinder(h=5,r=7,$fn=16); + } + } +} + +module slottedDuct(h=40,r=17.3,thick=0.6) { + difference() { + cylinder(h=h,r=r,$fn=60); + translate([0,0, 3]) cylinder(h=h ,r=r-thick,$fn=60); + translate([0,0,-1]) cylinder(h=h+2,r=r-2 ,$fn=24); + translate([0,10+1,h/2]) cube([12.4,20,h+2],center=true); + + // extra vent to increase flow around top (cool part) of hot-end + translate([0,-15,20]) rotate([90,0,0]) scale([1,4,1]) cylinder(r=2,h=5,$fn=12); + } +} + +module blowerKey() { +blowOW=11; //Outer width of DX 322439 blower, Model4010S, 12v, 0.1A + difference() { + union() { + hotEndKey(); + translate([0,19.3,11]) cube([blowOW+3,6,59],center=true); + } + + translate([0,19.3,12]) { + translate([0,2,0]) cube([10.8,6,42.5],center=true); + translate([0,0,(42.5-25)/2-1]) cube([9.3,7,25],center=true); + translate([-1.8,-1,-26]) cube([7.2,5,5.7]); + } + translate([2,21,-20]) #cylinder(r=1,h=8 ,$fn=11); + translate([0,21, 30]) cylinder(r=1,h=15,$fn=11); + translate([0,21, 37]) cylinder(r=2,h=8,$fn=11); + } +} + +//===================================================================== +// Shift up and add a brim for easier printing at quelab +union() { + hotEndRetainer(); + slottedDuct(); + translate([0,-18.5,fanBoltSep/2+5.5]) rotate([-90,90,0]) %fanMount40mm(); + + //color("Cyan") { + // //%cylinder(h=.4,r=17.1,$fn=60); + //} +} + +blowerKey(); // shows relation to main +translate([30,0,0]) rotate([-90,0,0]) blowerKey(); // for printing + +%ChineseHotEnd(); // to show overlay +//%translate([50,0,0]) fanMount(); +//%translate([0,22,0]) grooveRing(0); \ No newline at end of file diff --git a/hotEndSwitchMount.scad b/hotEndSwitchMount.scad new file mode 100644 index 0000000..51ea434 --- /dev/null +++ b/hotEndSwitchMount.scad @@ -0,0 +1,32 @@ +use ; + +ew = 16.1+.3; +eh = 9.75+.2; +mountPlateThickness=3; +difference() { + union() { + hull() { + translate([-9,-6,0]) cube([18,13,5]); + translate([-1.5,10,0.5]) cube([15,6,1],center=true); + } + hull() { + translate([-2.4,16,11.5]) cube([12,7,1.3],center=true); + //translate([-1,7,3]) scale([8,2,2]) sphere(1,$fn=12); + translate([0,7,3]) cube([6,2,4],center=true); + translate([-1,9,0.5]) cube([16,10,1],center=true); + } + } + //%translate([-ew/2,-eh/2,mountPlateThickness]) cube([ew,eh,5]); + translate([-ew/2,-eh/2,mountPlateThickness]) hull() { + translate( [ 0.1, 0.1,0]) cube([ew-0.2,eh-0.2,0.1]); + translate([-0.2,-0.2,3]) cube([ew+0.4,eh+0.4,0.1]); + } + translate([0,0,-1]) cylinder(r=2.94/2+.2,h=9,$fn=24); + translate([-2.4,15,0]) nanoswitchHoles(); +} + +%translate([0,9.8/2,12+mountPlateThickness]) { // Z offset to nozzle center + translate([0,20,0]) rotate([90,0,0]) cylinder(h=15,r=.2,$fn=4); // show where hot-end tip centerline is + rotate([-90,0,0]) cylinder(h=4.5,r2=0.3,r1=4,$fn=24); + translate([-2.4,15-9.8/2,.15-mountPlateThickness]) nanoswitch(); +} diff --git a/hotend_fan.stl b/hotend_fan.stl deleted file mode 100644 index 02dec72..0000000 Binary files a/hotend_fan.stl and /dev/null differ diff --git a/laserPartsUtil.pl b/laserPartsUtil.pl new file mode 100644 index 0000000..6166e81 --- /dev/null +++ b/laserPartsUtil.pl @@ -0,0 +1,197 @@ +# SVG drawing primitives + +$cutColor= "\#0000FF"; +$deg2rad = 0.01745329252; +$endPart = "'>\n"; # endpath and location(translation) group to end each part + +sub printHeader() { + local ($w,$h) = @_; + +#always set scale to 10:1 pixels:unit. +#This is convenient for looking with geeqie. 1:1 renders too blurry + #if ($preview) { $w *= 10; $h *= 10; } + + # make the device scale 10* the virtual size in mm. + local $w10 = 10*$w; + local $h10 = 10*$h; + +# adding viewport-fill=\"white\" attribute to does not seem to help... + print " + +\n"; +} + +# takes full width of desired drawing area in mm. +# draw fiducials (for non-preview) which are inset INSIDE this drawing area by 0.5mm +# parameters should be ACTUAL drawing area OUTSIDE dimensions +# (Fiducials drawn barely INSIDE this box!) +sub drawCornerFiducials() { + local ($w,$h) = (@_); + + # should be in a mm scale drawing group before calling this function + +# try to set a "background" rectangle that renders better on image viewers as png +# (viewers don't have a background to show through under transparency) + print " +background rectangle + *** delete this for production drawing *** + +\n"; + +# fiducial in magenta is ponoko code for light engraving + + local ($xa,$x0,$xb) = ($w-1,$w-.5,$w); + local ($ya,$y0,$yb) = ($h-1,$h-.5,$h); + + # print a little border + # for some unknown reason, this box seems to show up shifted by 0.5 units. + # crosses are as expected. I have no idea why I need the extra translate() + print "\nBounding box/warning strip + *** delete this for production drawing *** + I have no idea why it needs the extra translate() to line up\n"; + print "\n"; + + # let fiducial be inset, 0.5mm inside drawing area + print "\nCorner crosses, centers inset 0.5mm, tips ON border\n"; + print " +\n"; +} + +####### Standard header/container fiducials for drawings to be converted to DXF for LaserCut +sub printLaserCutHeader { + local ($wmm,$hmm) = @_; + + &printHeader($wmm,$hmm); + + print " +Establish main drawing parameters + set stroke-width to 0.01 or 0.001 for production/DXF +\n"; + + &drawCornerFiducials($wmm,$hmm,$preview); +} + +### Assuming that a file name is like *WxH.*, where W is drawing width, and H +# is drawing height (usually mm, but could be pixels), parse these numbers from file name and use them. +sub parseSizeFromFileName() { + local ($fNam) = @_; + + local ($w,$h) = (384,384); + $_ = $fNam; + chomp; + s/^.*\///; +#print STDERR "\n$_\n"; + s/\..*$//; +#print STDERR "\n$_\n"; + local @a = split /x/; +#print STDERR "$#a\n"; +print STDERR "$a[$#a-1]x"; +print STDERR "$a[$#a]\n"; + if ($#a < 1) { return($w,$h); } + $h = $a[$#a]; + $_ = $a[$#a-1]; + @a = split /[a-zA-Z_\+\-\s\.]/; + if ($#a < 0) { return($w,$h); } + $w = $a[$#a]; +print STDERR "$w x $h\n"; + return($w,$h); +} + +sub startPart() { + local ($cx, $cy, $rot) = (@_,0); + + print "\n"; + # moved to a setting for the whole cut group: + #print " $stopDeg) : ($a < $stopDeg) ) { + $ar = $a * $deg2rad; + $x = $cx + $r * cos($ar); + $y = $cy + $r * sin($ar); + printf(" L%.2f,%.2f",$x,$y); + $a += $step; + } + $ar = $stopDeg * $deg2rad; + $x = $cx + $r * cos($ar); + $y = $cy + $r * sin($ar); + printf(" L%.2f,%.2f\n",$x,$y); +} + +sub raspPiMountHoles() { + local ($x0,$y0,$rot) = (@_,0,0,0); + + local ($w,$h) = (85,56); # total board width and height + local $hr = 2.9/2; # hole radius + + &startPart($x0,$y0,$rot); + #$hr = $rad4; + local $hrd = 12; + &drawCircle( 5,$h-12.5,$hr,$hrd); + &drawCircle($w-25.5,18,$hr,$hrd); + print $endPart; +} + +sub ArduinoUnoMountHoles() { + local ($x0,$y0,$rot) = (@_,0,0,0); + + &startPart($x0,$y0,$rot); + local $hrd = 12; + local $hr = $rad4 + $fuzz; # override global, which may not be set + &drawCircle(14 ,53.3-2.5 ,$hr,$hrd); + &drawCircle(14+1.3 ,53.3-2.5-5.1-27.9-15.2,$hr,$hrd); + &drawCircle(14+1.3+50.8,53.3-2.5-5.1 ,$hr,$hrd); + &drawCircle(14+1.3+50.8,53.3-2.5-5.1-27.9 ,$hr,$hrd); + print $endPart; +} + +# origin is URC looking down from top +sub ArduinoMegaMountHoles() { + local ($x0,$y0,$rot) = (@_,0,0,0); + + &startPart($x0,$y0,$rot); + local $hrd = 12; + local $hr = 3.2/2; # Arduino holes are diameter 3.2mm + &drawCircle(14 , -2.5 ,$hr,$hrd); + &drawCircle(14+1.3 ,-53.3+2.5 ,$hr,$hrd); + &drawCircle(14+1.3+50.8 ,-53.3+2.5+15.2 ,$hr,$hrd); + &drawCircle(14+1.3+50.8 ,-53.3+2.5+15.2+27.9,$hr,$hrd); + &drawCircle(14+1.3+50.8+24.1,-53.3+2.5 ,$hr,$hrd); + &drawCircle(101.6-5 , -2.5 ,$hr,$hrd); + print $endPart; +} + +1; diff --git a/logotype.stl b/logotype.stl deleted file mode 100644 index df1bb23..0000000 Binary files a/logotype.stl and /dev/null differ diff --git a/longAllMetalBowdenHotEnd.scad b/longAllMetalBowdenHotEnd.scad new file mode 100644 index 0000000..04e4af0 --- /dev/null +++ b/longAllMetalBowdenHotEnd.scad @@ -0,0 +1,35 @@ + + +module hotBlock() { +bevilRad=.8; +br=16.15/2 - bevilRad; + translate([0,0,-2.85]) cylinder(r=7.94/2/cos(30),h=2.85,$fn=6); + //%translate([0,0,11.9/2]) cube([16.15,16.15,11.9],center=true); + difference() { + translate([0,3.85,0]) hull() for(a=[-1,1]) for(b=[-1,1]) + translate([a*br,b*br,0]) cylinder(r=bevilRad,h=11.9,$fn=16); + + translate([0,3.85+16.15/2-6.25/2-1.6,3.6+6.25/2]) rotate([0,90,0]) + #cylinder(r=6.25/2,h=17,$fn=36,center=true); + } + translate([0,0,-5]) cylinder(r1=.5,r2=2,h=2.3,$fn=36); + +} + +module metalHotEnd() { + union() { + translate([0,0,-12 ]) cylinder(r=12/2,h=50 ,$fn=60); + translate([0,0,-12 ]) cylinder(r=16/2,h=3.7 ,$fn=60); + translate([0,0,-2.75]) cylinder(r=16/2,h=2.75,$fn=60); + translate([0,0, 2.45]) cylinder(r=16/2,h=1,$fn=60); + for (a=[0:9]) + translate([0,0,6.2+a*(2.2+1.2)]) cylinder(r=24.9/2,h=1.2,$fn=60); + } + + translate([0,0,-12-7]) cylinder(r=(9.86/2)/cos(30),h=6.4,$fn=6); + translate([0,0,38+11.9+2.9]) rotate([180,0,0]) hotBlock(); +} + +metalHotEnd(); + +//hotBlock(); \ No newline at end of file diff --git a/m5_internal.stl b/m5_internal.stl deleted file mode 100644 index 9dd5987..0000000 Binary files a/m5_internal.stl and /dev/null differ diff --git a/microswitch.scad b/microswitch.scad index 3df94ec..4ad48c9 100644 --- a/microswitch.scad +++ b/microswitch.scad @@ -1,6 +1,13 @@ // Don't print this file, purchase real micro switches // e.g. Honeywell ZM10B10A01 or OMRON SS-5 or similar. +module microswitchHoles() { + for (x = [-9.5/2, 9.5/2]) { + translate([x, 0, 0]) rotate([90, 0, 0]) + cylinder(r=2.5/2, h=20, center=true, $fn=12); + } +} + module microswitch() { difference() { union() { @@ -13,11 +20,44 @@ module microswitch() { cube([0.6, 3.2, 13], center=true); } } - for (x = [-9.5/2, 9.5/2]) { - translate([x, 0, 0]) rotate([90, 0, 0]) - cylinder(r=2.5/2, h=20, center=true, $fn=12); + microswitchHoles(); + } +} + +module microswitchGuide() { + intersection() { + difference() { + hull() { + translate([-6,0,0]) cylinder(r=4,h=2,$fn=24); + translate([ 6,0,0]) cylinder(r=4,h=2,$fn=24); + translate([ 2.4,8,0]) scale([2,1,1]) cylinder(r=3,h=2,$fn=36); + } + translate([0,0,-1]) rotate([-90,0,0]) microswitchHoles(); + } + translate([2.4,8,-1]) microswitchGuideSlot(); + } +} + +// little slot to help glide probe handle on top of switch +module microswitchGuideSlot() { + difference() { + union() { + translate([-4.6,0.5,0]) cylinder(h=4,r=4,$fn=36); + translate([ 4.6,0.5,0]) cylinder(h=4,r=4,$fn=36); + hull() { + translate([-15,-13,0]) cube([25,1,4]); + translate([-11, -1,0]) cube([18,1,4]); + } } + cylinder(h=15,r=.6,$fn=18,center=true); } } -microswitch(); + +%microswitch(); + +translate([0,-20,-1]) { + rotate([-90,0,0]) %microswitch(); + //projection(cut=true) + microswitchGuide(); +} \ No newline at end of file diff --git a/modularProbePost.scad b/modularProbePost.scad new file mode 100644 index 0000000..1f7d62c --- /dev/null +++ b/modularProbePost.scad @@ -0,0 +1,170 @@ +include ; + +height = 26; +height2 = 26; +tunnel = 2.4; +face_offset = 4; + +module nanoswitchHoles() { + translate([ 6.5/2,0,-15+13]) cylinder(h=22,r=1,$fn=16); + translate([-6.5/2,0,-15]) cylinder(h=22,r=1,$fn=16); +} + +module nanoswitch() { + difference() { + translate([-12.8/2,-1,0]) cube([12.8,6.2,5.75]); + translate([0,0,-1]) nanoswitchHoles(); + } + #translate([12.8/2-4,6.2-1,1]) cylinder(h=5.75-2,r=0.45,$fn=16); +} + +// little slot to help glide probe handle on top of switch +module guideSlot() { + difference() { + union() { + translate([-2.6,0,0]) scale([1,2,1]) cylinder(h=4,r=2,$fn=36); + translate([ 2.6,0,0]) scale([1,2,1]) cylinder(h=4,r=2,$fn=36); + hull() { + translate([-11,-10,0]) cube([18,1,4]); + translate([-9,-1,0]) cube([15,1,4]); + } + translate([-4.5,0,2]) cube([6,4,4],center=true); + } + cylinder(h=5,r=.6,$fn=18); + } +} + +module nanoswitchGuide() { + //%translate([-12.8/2,-1,0]) cube([12.8,6.2,5.75]); + //%translate([12.8/2-4,6.2-1,1]) cylinder(h=5.75-2,r=0.45,$fn=16); + intersection() { + difference() { + hull() { + translate([-4,0,0]) cylinder(r=3,h=2,$fn=24); + translate([ 4,0,0]) cylinder(r=3,h=2,$fn=24); + translate([ 2.4,6,0]) scale([2,1,1]) cylinder(r=2,h=2,$fn=36); + } + translate([0,0,-1]) nanoswitchHoles(); + } + translate([2.4,5.5,-1]) guideSlot(); + } +} + +module hotEndHullProxy() { + hull() { + translate([0,0,1]) cylinder(r=3,h=17,$fn=24); + cylinder(r=9,h=13,$fn=6); + } +} + +module foot() { + difference() { + rotate([0,0,-60]) hull() { + translate([12.5,0,0]) cylinder(r=5, h=4, $fn=24); + translate([1,-3,0]) scale([1,2,1]) cylinder(r=1,h=12,$fn=9); + } + translate([12.5, 0, 0]) { + for (a = [60:120:359]) { + rotate([0, 0, a]) translate([-12.5, 0, 0]) { + cylinder(r=m3_wide_radius, h=20, center=true, $fn=12); + translate([0,0,2.5]) cylinder(r1=3.05, r2=3.5, h=10, $fn=6); + }} + } + } +} + +// main hole centered at (0,0). +module retractable() { + difference() { + union() { + cylinder(r=6, h=height, $fn=32); + translate([-6,-6,0]) cube([12, 6, height]); + hull() { + translate([-6,-4,0]) cube([2,4,height]); + translate([-2,2,15]) cylinder(r=3,h=4,$fn=16); + translate([-8+4,-2,0]) rotate([0,0,-50]) scale([1.5,2,1]) cylinder(r=2,h=18,$fn=24); + } + // extra wide for switch sticking out + hull() { + translate([6,-2,0]) rotate([0,0,-50]) scale([4,3,1]) cylinder(r=1,h=9,$fn=24); + translate([3,-2,15]) sphere(1); + } + + // Feet for vertical M3 screw attachment. + rotate([0, 0, 90]) { + foot(); + scale([1, -1, 1]) foot(); + } + + } + + // central drill hole + cylinder(r=tunnel/2+extra_radius, h=3*height, center=true, $fn=21); + + // main probe handle slot + translate([-(tunnel-0.5)/2, -7, 12]) hull() { + translate([0,0,3]) cube([tunnel-0.5 ,7,15]); + translate([.3,0,0]) cube([tunnel-1.025,7,1]); + } + + // retracted probe catch ledge + hull() { + translate([tunnel/2, 0, 21]) rotate([0, 0,-150]) { + translate([0,2,1]) cube([tunnel,8,9]); + rotate([0,-10,0]) cube([tunnel,7,2]); + } + translate([0,0,21])cylinder(r=tunnel/2,h=15,$fn=18); + } + + // Safety needle spring. + translate([-4.5, 0, height-11]) rotate([90, 0, 0]) + translate([0,0,-8]) cylinder(r=1, h=20, $fn=12); + translate([-4, 0, height-2]) rotate([90, 0, 0]) + translate([0,0,-2]) cylinder(r=1/2, h=20, $fn=12); + + // Flat front face. + translate([0, -face_offset-10, height/2]) cube([30, 20, 2*height], center=true); + + // make sure we clear the hot-end hull on top + translate([0,12.5,-1]) hotEndHullProxy(); + + // Sub-miniature micro switch. + translate([-2.5, -face_offset, 5]) { + mirror([1,0,0]) translate([-5,0,1.7]) rotate([90,0,0]) { + %nanoswitch(); + nanoswitchHoles(); + } + } + + // bore out a larger hole to hold bowden tube for lower-friction probe guide + translate([0,0,-.02]) cylinder(h=12-2,r=3.95/2+.2,$fn=36); + + } +} + +// put solid layer below holes for quelab printer +//union(){ +// translate([0,0,0.15]) + // retractable(); +// color("Cyan") { +// hull() { +// translate([-11,-4.5,0]) cube([7,10,.3]); +// translate([-11,6.5,0]) cylinder(h=.3,r=5.5,$fn=16); +// } +// hull() { +// translate([4,-4.5,0]) cube([2,10,.3]); +// translate([ 11,6.5,0]) cylinder(h=.3,r=5.5,$fn=16); +// } +// translate([-4.5,-4.5,0]) cube([9,10,.3]); +// } +//} + +// show in relation to effector head : +//use ; +//%translate([0,12.5,-4]) scale([1.02,1.02,1]) effector(); + +// draw a probe handle guide plate, to be converted to DXF for laser cut +translate([0,-20,0]) { + %translate([0,0,-5.75]) nanoswitch(); + projection(cut=true) {translate([0,0,-2]) nanoswitchGuide();} +} diff --git a/motorVertex.scad b/motorVertex.scad new file mode 100644 index 0000000..c9a462f --- /dev/null +++ b/motorVertex.scad @@ -0,0 +1,32 @@ +// vertexC for use with OpenBuilds v-slot 2mm extrusion towers, +// 15mm extrusion braces, and nema17 motors + +use ; +use ; + +difference() { + vertexC(45,0.1); + translate([0,48,45/2]) rotate([90,0,0]) { + nema17holes(); + //translate([0,0,2])%nema17(); + } +} + +// support +use ; + +color("Cyan") { + for(a=[-1,1]) { + supportPillar(19.2*a,-5.5,4.4); + translate([15.8*a,0, 0 ]) rotate([0,0,-30*a]) zigZag(66,-2*a,6.2,2); + translate([15.8*a,0, 9.3]) rotate([0,0,-30*a]) zigZag(66,-2*a,5.5,2); + translate([15.8*a,0,30.6]) rotate([0,0,-30*a]) zigZag(66,-2*a,5.6,2); + } + for(z=[5,45-10]) { + translate([-22.5,-6.6,z]) supportPillar4(0,0,3,2,5.3, 30); + translate([ 25.5,-6.6,z]) supportPillar4(0,0,3,2,5.3,-30); + } + for(z=[7.1,30.1]) translate([ 1,-17,z]) supportPillar4(0,0,2 ,4,8); + for(z=[9.1,32.2]) translate([.8,-10,z]) supportPillar4(0,0,1.6,4,4); + translate([0,44,13]) supportPillar(0,0,21,r=1.2,xscale=7); +} diff --git a/nanoswitch.scad b/nanoswitch.scad new file mode 100644 index 0000000..d227be9 --- /dev/null +++ b/nanoswitch.scad @@ -0,0 +1,45 @@ +module nanoswitchHoles() { + translate([ 6.5/2,0,-15+13]) cylinder(h=33,r=1+.05,$fn=16); + translate([-6.5/2,0,-15 ]) cylinder(h=33,r=1+.05,$fn=16); +} + +module nanoswitch() { + difference() { + translate([-12.8/2,-1,0]) cube([12.8,6.2,5.75]); + translate([0,0,-1]) nanoswitchHoles(); + } + #translate([12.8/2-4,6.2-1,1]) cylinder(h=5.75-2,r=0.45,$fn=16); +} + +// little slot to help glide probe handle on top of switch +module guideSlot() { + difference() { + union() { + translate([-2.75,0,0]) scale([1,2,1]) cylinder(h=4,r=2,$fn=36); + translate([ 2.75,0,0]) scale([1,2,1]) cylinder(h=4,r=2,$fn=36); + hull() { + translate([-11,-10,0]) cube([18,1,4]); + translate([-9,-1,0]) cube([15,1,4]); + } + translate([-4.5,0,2]) cube([6,4,4],center=true); + } + cylinder(h=5,r=.75,$fn=18); + } +} + +module nanoswitchGuide() { + intersection() { + difference() { + hull() { + translate([-4,0,0]) cylinder(r=3,h=2,$fn=24); + translate([ 4,0,0]) cylinder(r=3,h=2,$fn=24); + translate([ 2.4,6,0]) scale([2,1,1]) cylinder(r=2,h=2,$fn=36); + } + translate([0,0,-1]) nanoswitchHoles(); + } + translate([2.4,5.2,-1]) guideSlot(); + } +} + +%translate([0,0,-5.75]) nanoswitch(); +projection(cut=true) {translate([0,0,-2]) nanoswitchGuide();} diff --git a/needleProbe.scad b/needleProbe.scad new file mode 100644 index 0000000..c56ab9f --- /dev/null +++ b/needleProbe.scad @@ -0,0 +1,119 @@ +// sketch for low-impact surface probe switch +// Aaron Birenboim 06sep14 + +magRad=6; // radius of magnet group + +module magnetGroup(fuzz=0,disk=0) { +// not sure which orientation is better, try both? +diskMagnetRot = (disk>1)?[90,0,0]:[0,90,0]; + for(i=[-120,0,120]) rotate([0,0,i]) translate([0,-magRad,-0.6]) + if (disk) rotate(diskMagnetRot) + cylinder(h=1+fuzz*1.1,r=1.5+fuzz,$fn=36,center=true); + else + sphere(2.94/2+fuzz,$fn=36); // 3mm bucky balls +} + +module magnetMount(notional=false,disk=false,fuzz=0) { + // magnets for contacts and alignment + if (notional) color([0,0.4,0.8]) magnetGroup(disk=disk); + + // magnet base + difference() { + translate([0,0,-3]) triPlate(3+7,8+magRad,13.5+magRad); + triPlate(10,6+magRad,11.5+magRad); + + // skip this for actual printed model... + // this is just to see insides easier for display + if (notional) + translate([0,0,0.4]) cylinder(r=7+magRad,h=10,$fn=6); + else // hollow out for magnet spheres + magnetGroup(disk=disk,fuzz=fuzz); + + translate([0,0,-4]) cylinder(r=.6+fuzz*1.5,h=5,$fn=9); + + // drill hole for magnet contact wire + translate([0,-magRad-.3,0]) rotate([90,0,0]) + rotate([0,0,-30]) cylinder(r=0.8,h=6,$fn=3); + + } +} + +module pinHead() { + union() { // head + intersection() { + translate([0,0,-1]) cube([2,2,2],center=true); + scale([0.8,0.8,0.4]) sphere(1,$fn=36); + } + + translate([0,0,-0.05]) cylinder(r=.32,h=10,$fn=24); // shaft + } +} + +module probeMount(notional=false,fuzz=0) { + intersection() { // main probe mount plate + translate([0,0,1]) cube([20,20,3],center=true); // cut off pin shafts above + + union() { + if (notional) for(i=[-120,0,120]) rotate([0,0,i]) + translate([0,-magRad,-.05]) color([.5,.5,.6]) pinHead(); + + difference() { + //triPlate(1.5); // main plate, fiberglass plastic, like PCB + triPlate(1.5,4.5+magRad,10+magRad); // main plate, fiberglass plastic, like PCB + + for(i=[-120,0,120]) rotate([0,0,i]) // pin holes + translate([0,-magRad,-1]) cylinder(r=0.4+fuzz,h=5,$fn=8); + translate([0,0,-1]) cylinder(r=0.4+fuzz,h=5,$fn=8); + } + } + } + + if (notional) { // show probe pin for notional drawing + translate([0,0,1.6])mirror([0,0,1]) color([.3,.3,.5]) pinHead(); // main probe + translate([0,0,-8]) scale([1,1,2]) sphere(0.4,$fn=36); + } +} + +module triPlate(h=2,r1=8,r2=10) { + rotate([0,0,30]) intersection() { + cylinder(r=r1,h=h,$fn=3); + translate([0,0,-0.1]) rotate([0,0,60]) cylinder(r=r2,h=h+0.2,$fn=3); + } +} + +%if(1) { // show assembled notional view + /////////// main, in-place view + magnetMount(1,disk=0); + translate ([0,0,3]) probeMount(1); + + // case can be 3D printed or machined + if(0) %translate([0,0,-4]) difference() { + cylinder(r=7,h=10,$fn=60); + translate([0,0,2]) cylinder(r=5.5,h=9,$fn=60); + } + + color([.8,.4,.4]) { // wires + translate([0,-8,0.2]) cube([0.5,10,0.5],center=true); + rotate([60,0,60]) translate([0,10,-0.5]) cube([0.5,10,0.5],center=true); + translate([0,-3,3.5]) rotate([0,0,-30]) cube([0.5,5.5,0.5]); + translate([0,3,0.2]) cube([5.5,0.5,0.5],center=true); + } +} // end of assembly view + +// parts to be fabricated +translate([0,20, 0]) + //magnetMount(fuzz=0.25,disk=0); + magnetMount(fuzz=0.4,disk=2); + +%translate([20,0,-1]) probeMount(fuzz=0.4); +%translate([-20,0,-1]) { // cap + difference() { + triPlate(3,7.5+magRad,13+magRad); + + translate([0,0,2]) difference() { + cylinder(r=14,h=4,$fn=6); + translate([0,0,-1]) triPlate(6,6+magRad-0.3,11.5+magRad-0.3); + } + translate([0,0,-1]) cylinder(r=0.6,h=6,$fn=6); // pass-trough for probe plate contact + } +} diff --git a/nema17.scad b/nema17.scad index 58fa3c5..5c28713 100644 --- a/nema17.scad +++ b/nema17.scad @@ -18,4 +18,14 @@ module nema17() { } } +module nema17holes() { + cylinder(r=11+1, h=4+5, $fn=48); + cylinder(r=2.5+.2, h=25, $fn=36); + for (a = [0:90:359]) { + rotate([0, 0, a]) translate([15.5, 15.5, 0]) + cylinder(r=2.94/2+.2, h=10, $fn=11); + } +} + nema17(); +%nema17holes(); \ No newline at end of file diff --git a/plate_1x.scad b/plate_1x.scad deleted file mode 100644 index bbe067e..0000000 --- a/plate_1x.scad +++ /dev/null @@ -1,15 +0,0 @@ -include ; - -use ; -use ; -use ; -use ; - -% translate([0, 0, -3]) cylinder(r=85, h=3); -translate([0, 30, 0]) union() { - translate([0, 0, 4]) effector(); - translate([0, -30, 0]) power_supply(); - translate([0, -42, 0]) rotate([0, 0, 180]) power_supply(); - translate([-20, -65, 0]) rotate([0, 0, 45]) retractable(); - translate([-8, -47, 0]) extruder(); -} diff --git a/plate_1x.stl b/plate_1x.stl deleted file mode 100644 index 0862e15..0000000 Binary files a/plate_1x.stl and /dev/null differ diff --git a/plate_3x.scad b/plate_3x.scad deleted file mode 100644 index a93e055..0000000 --- a/plate_3x.scad +++ /dev/null @@ -1,17 +0,0 @@ -include ; - -use ; -use ; -use ; -use ; -use ; - -% translate([0, 0, -3]) cylinder(r=85, h=3); -union() { - translate([-15, -55, 22.5]) frame_motor(); - translate([15, 55, 7.5]) rotate([0, 0, 180]) frame_top(); - translate([-40, 30, 0]) rotate([0, 0, -30]) carriage(); - translate([0, 0, 7.5]) endstop(); - translate([-15, -30, 7.5]) endstop(); - translate([45, -20, thickness/2]) rotate([0, 0, 150]) glass_tab(); -} diff --git a/plate_3x.stl b/plate_3x.stl deleted file mode 100644 index b1cb117..0000000 Binary files a/plate_3x.stl and /dev/null differ diff --git a/power_supply.stl b/power_supply.stl deleted file mode 100644 index be4ec48..0000000 Binary files a/power_supply.stl and /dev/null differ diff --git a/probePost.scad b/probePost.scad new file mode 100644 index 0000000..e2bb3b5 --- /dev/null +++ b/probePost.scad @@ -0,0 +1,102 @@ +include ; + +height = 26; +height2 = 26; +tunnel = 2.4; +face_offset = 4; + +module nanoswitchHoles() { + translate([ 6.5/2,0,-15]) cylinder(h=22,r=1,$fn=16); + translate([-6.5/2,0,-15]) cylinder(h=22,r=1,$fn=16); +} + +module nanoswitch() { + difference() { + translate([-12.8/2,-1,0]) cube([12.8,6.2,5.75]); + translate([0,0,-1]) nanoswitchHoles(); + } + #translate([12.8/2-4,6.2-1,1]) cylinder(h=5.75-2,r=0.45,$fn=16); +} + +module hotEndHullProxy() { + hull() { + translate([0,0,1]) cylinder(r=3,h=17,$fn=24); + cylinder(r=9,h=13,$fn=6); + } +} + +// main hole centered at (0,0). Bottom extends -1 in the Z direction, for +// clean unions with support structure. Bottom intended to be at z=0 plane +module retractable() { + difference() { + union() { + translate([ 0, 0,-1]) cylinder(r=6, h=height+1, $fn=32); + translate([-6,-6,-1]) cube([12, 6, height+1]); + hull() { + translate([-6,-4,-1]) cube([2,4,height+1]); + translate([-2,2,15]) cylinder(r=3,h=4,$fn=16); + translate([-8+4,-2,-1]) rotate([0,0,-50]) scale([1.5,2,1]) cylinder(r=2,h=18,$fn=24); + } + } + + // central drill hole + cylinder(r=tunnel/2+extra_radius, h=3*height, center=true, $fn=21); + + // main probe handle slot + translate([-(tunnel-0.5)/2, -7, 12]) hull() { + translate([0,0,3]) cube([tunnel-0.5 ,7,15]); + translate([.3,0,0]) cube([tunnel-1.025,7,1]); + } + + // retracted probe catch ledge + hull() { + translate([tunnel/2, 0, 21]) rotate([0, 0,-150]) { + translate([0,2,1]) cube([tunnel,8,9]); + rotate([0,-10,0]) cube([tunnel,7,2]); + } + translate([0,0,21])cylinder(r=tunnel/2,h=15,$fn=18); + } + + // Safety needle spring. + translate([-4.5, 0, height-11]) rotate([90, 0, 0]) + translate([0,0,-8]) cylinder(r=2.5/2, h=20, $fn=12); + translate([-4, 0, height-2]) rotate([90, 0, 0]) + translate([0,0,-2]) cylinder(r=1/2, h=20, $fn=12); + + // Flat front face. + translate([0, -face_offset-10, height/2]) cube([30, 20, 2*height], center=true); + + // make sure we clear the hot-end hull on top + //translate([0,12.5,-1]) hotEndHullProxy(); + + // Sub-miniature micro switch. + translate([-2.5+2, -face_offset, 5]) { + translate([0,0,1]) rotate([90,0,0]) { + %nanoswitch(); + nanoswitchHoles(); + } + } + } +} + +// put solid layer below holes for quelab printer +//union(){ +// translate([0,0,0.15]) + retractable(); +// color("Cyan") { +// hull() { +// translate([-11,-4.5,0]) cube([7,10,.3]); +// translate([-11,6.5,0]) cylinder(h=.3,r=5.5,$fn=16); +// } +// hull() { +// translate([4,-4.5,0]) cube([2,10,.3]); +// translate([ 11,6.5,0]) cylinder(h=.3,r=5.5,$fn=16); +// } +// translate([-4.5,-4.5,0]) cube([9,10,.3]); +// } +//} + +// show in relation to effector head : +//use ; +//%translate([0,12.5,-4]) scale([1.02,1.02,1]) effector(); + diff --git a/pulleyHolder.scad b/pulleyHolder.scad new file mode 100644 index 0000000..b486891 --- /dev/null +++ b/pulleyHolder.scad @@ -0,0 +1,73 @@ +boltSep = 12; +baseRad = 5; +m3rad = 2.94/2 + .1; +baseHeight = 10; + +module boltHolder() { + scale([.9,1.1,1]) hull() { + cylinder(r=baseRad,h=baseHeight,$fn=45); + translate([0,0,baseHeight+1.5]) scale([1.3,1,1]) cylinder(r=3.5,h=1,$fn=45); + } +} + +module nutHole() { + union() { + cylinder(r1=5.2/2/.866+.1,r2=3.2/.866,h=5,$fn=6); + translate([0,0,-30]) cylinder(r=m3rad+.1,h=31,$fn=13); + } +} + +module pulleyProxy() { + rotate([90,0,0]) difference() { + cylinder(r=11.5/2,h=8,center=true,$fn=48); + cylinder(r=1.5,h=9,center=true,$fn=16); + } +} + +module pulleyArea() { +w2=5.2; +h2=2.5+.2; +cr=2.5; +bh=baseHeight+5; +ef=24; + difference() { + hull() { + translate([-w2, h2,-1]) cylinder(r=cr,h=bh,$fn=ef); + translate([-w2,-h2,-1]) cylinder(r=cr,h=bh,$fn=ef); + translate([ w2, h2,-1]) cylinder(r=cr,h=bh,$fn=ef); + translate([ w2,-h2,-1]) cylinder(r=cr,h=bh,$fn=ef); + } + + translate([0,-4,baseHeight/2]) rotate([ 90,0,0]) cylinder(r1=2.5,r2=6,h=3,$fn=22); + translate([0, 4,baseHeight/2]) rotate([-90,0,0]) cylinder(r1=2.5,r2=6,h=3,$fn=22); + } +} + +module pulleyHolder() { + difference() { + union() { + translate([-boltSep,0,0]) boltHolder(); + translate([ boltSep,0,0]) boltHolder(); + hull() { + translate([-boltSep,0,0]) scale([.9,1.1,1]) cylinder(r=baseRad,h=baseHeight,$fn=48); + translate([ boltSep,0,0]) scale([.9,1.1,1]) cylinder(r=baseRad,h=baseHeight,$fn=48); + // 16 wide is about perfect for M3-14 bolt. + // may want to switch to an M3-16 in the future, so this would have to be wider + translate([0,0,baseHeight/2]) + rotate([90,0,0]) cylinder(r=4,h=16,center=true,$fn=24); + } + } + + translate([-boltSep,0,baseHeight]) nutHole(); + translate([ boltSep,0,baseHeight]) nutHole(); + translate([0,-baseRad-1,baseHeight/2]) rotate([ 90,0,0]) nutHole(); + translate([0, baseRad+1,baseHeight/2]) rotate([-90,0,0]) + cylinder(r1=5.5/2-.1,r2=5.5/2+.3,h=5,$fn=23); + pulleyArea(); + } +} + + +pulleyHolder(); + +%translate([0,0,baseHeight/2]) pulleyProxy(); diff --git a/retractable.scad b/retractable.scad index a83f37c..cf770b0 100644 --- a/retractable.scad +++ b/retractable.scad @@ -9,47 +9,44 @@ face_offset = 4; module foot() { difference() { - translate([12.5, 0, 0]) rotate([0, 0, -60]) - translate([-12.5, 0, 1]) rotate([0, 0, -60]) union() { - cylinder(r=5, h=2, center=true, $fn=24); - translate([10, 0, 0]) - cube([20, 10, 2], center=true); + rotate([0,0,-60]) hull() { + translate([12.5,0,0]) cylinder(r=5, h=4, $fn=24); + translate([1,-3,0]) scale([1,2,1]) cylinder(r=1,h=12,$fn=9); } - translate([0, -10, 0]) - cube([40, 20, 20], center=true); translate([12.5, 0, 0]) { - // Space for bowden push fit connector. - cylinder(r=6.49, h=3*height, center=true, $fn=32); for (a = [60:120:359]) { - rotate([0, 0, a]) translate([-12.5, 0, 0]) + rotate([0, 0, a]) translate([-12.5, 0, 0]) { cylinder(r=m3_wide_radius, h=20, center=true, $fn=12); - } + translate([0,0,2.5]) cylinder(r1=3.05, r2=3.5, h=10, $fn=6); + }} } } } +module hotEndHullProxy() { + hull() { + translate([0,0,1]) cylinder(r=3,h=17,$fn=24); + cylinder(r=9,h=13,$fn=6); + } +} + module retractable() { difference() { union() { translate([0, 0, height/2]) cylinder(r=6, h=height, center=true, $fn=32); - translate([0, -3, height/2]) - cube([12, 6, height], center=true); - // Lower part on the left. - translate([-6, 0, height2/2]) - cylinder(r=6, h=height2, center=true, $fn=32); - translate([-3, 0, height2/2]) - cube([6, 12, height2], center=true); - translate([-3, -3, height2/2]) - cube([18, 6, height2], center=true); + translate([0, -3, height/2]) cube([12, 6, height], center=true); + hull() { + translate([-6,-4,0]) cube([2,4,26]); + translate([-2,2,15]) cylinder(r=3,h=4,$fn=16); + translate([-8,-2,0]) rotate([0,0,-50]) scale([1.5,2,1]) cylinder(r=2,h=8,$fn=24); + } // Feet for vertical M3 screw attachment. rotate([0, 0, 90]) { foot(); scale([1, -1, 1]) foot(); } } - translate([-19, 0, height/2+6]) rotate([0, 15, 0]) - cube([20, 20, height], center=true); cylinder(r=tunnel/2+extra_radius, h=3*height, center=true, $fn=12); translate([0, -6, height/2+12]) cube([tunnel-0.5, 12, height], center=true); @@ -57,25 +54,47 @@ module retractable() { cube([tunnel, 12, height], center=true); // Safety needle spring. translate([-4.5, 0, height-11]) rotate([90, 0, 0]) - cylinder(r=2.5/2, h=40, center=true, $fn=12); + translate([0,0,-8]) cylinder(r=2.5/2, h=20, $fn=12); translate([-4, 0, height-2]) rotate([90, 0, 0]) - cylinder(r=1/2, h=40, center=true, $fn=12); - // Effector screw heads. - rotate([0, 0, 330]) translate([-12.5, 0, 2]) - cylinder(r=4, h=30, $fn=24); + translate([0,0,-2]) cylinder(r=1/2, h=20, $fn=12); // Flat front face. translate([0, -face_offset-10, height/2]) difference() { cube([30, 20, 2*height], center=true); } + // make sure we clear the hot-end hull on top + translate([0,12.5,-1]) hotEndHullProxy(); // Sub-miniature micro switch. - translate([-2.5, -face_offset-3, 5]) { + translate([-2.5+0.7, -face_offset-3, 5]) { % microswitch(); for (x = [-9.5/2, 9.5/2]) { translate([x, 0, 0]) rotate([90, 0, 0]) - cylinder(r=2.5/2, h=40, center=true, $fn=12); + translate([0,0,-9]) cylinder(r=2.5/2, h=20, $fn=12); } } } } -retractable(); +// put solid layer below holes for quelab printer +//union(){ +// translate([0,0,0.15]) +difference() { + retractable(); + translate([0,0,-.1]) #cylinder(r=3.95/2,h=10.5,$fn=24); +} +// color("Cyan") { +// hull() { +// translate([-11,-4.5,0]) cube([7,10,.3]); +// translate([-11,6.5,0]) cylinder(h=.3,r=5.5,$fn=16); +// } +// hull() { +// translate([4,-4.5,0]) cube([2,10,.3]); +// translate([ 11,6.5,0]) cylinder(h=.3,r=5.5,$fn=16); +// } +// translate([-4.5,-4.5,0]) cube([9,10,.3]); +// } +//} + +// show in relation to effector head : +//use ; +//%translate([0,12.5,-4]) scale([1.02,1.02,1]) effector(); + diff --git a/retractable.stl b/retractable.stl deleted file mode 100644 index e7b530d..0000000 Binary files a/retractable.stl and /dev/null differ diff --git a/rodMountHorn.scad b/rodMountHorn.scad new file mode 100644 index 0000000..98c4754 --- /dev/null +++ b/rodMountHorn.scad @@ -0,0 +1,30 @@ +//include ; + +// parameters for rod mount horns. +// these parameters should be the same for the carriage horns. +separation = 40+10; // Distance between ball joint mounting faces. +cone_r1 = 2.5; +cone_r2 = 20; +cone_height=18; + +module rodMountHorn() { + for (s = [-1, 1]) scale([s, 1, 1]) + translate([separation/2-9, 0, 0]) rotate([0, 90, 0]) + cylinder(r1=cone_r2, r2=cone_r1, h=cone_height, center=true, $fn=24); +} + +m3rad = 2.94/2; +m3nutRad = 5.5/cos(30)/2; + +// boreLen is length of M3 bore before nut holder +module rodMountHornBore(fuzz=0.1,boreLen=15) { + rotate([0,90,0]) { + cylinder(r=m3rad+fuzz,h=separation+1,$fn=12,center=true); + cylinder(r=m3nutRad+fuzz*2,h=separation-2*boreLen,$fn=6,center=true); + } +} + +difference() { + rodMountHorn(); + #rodMountHornBore(); +} diff --git a/smoothie.scad b/smoothie.scad new file mode 100644 index 0000000..e1e81c3 --- /dev/null +++ b/smoothie.scad @@ -0,0 +1,144 @@ + +//projection(cut=true) +//%translate([0,0,-121]) import("smoothie.stl"); // older 4-driver smoothie board +%translate([-3,14,3+6]) rotate([90,0,90]) import("smoothieX5.stl"); + +module smoothie4Holes() { +hr = 1.8; // hole radius +hh = 9; // hole height +$fn=12; + translate([-31,-27.45 ,-1]) cylinder(h=hh,r=hr); + translate([-37.45,65.4,-1]) cylinder(h=hh,r=hr); + translate([61.5,-32.5 ,-1]) cylinder(h=hh,r=hr); + translate([61.6,65.4 ,-1]) cylinder(h=hh,r=hr); + + translate([62.3,13.1 ,-1]) cylinder(h=hh,r=hr+.2); + translate([62.3,23.2 ,-1]) cylinder(h=hh,r=hr+.2); +} + +module smoothieX5holes(hr=1.8,hrp=2) { // hole sizes on board +$fn=12; +hh=9; + translate([ 3.6, 27.9,-1]) cylinder(h=hh,r=hr); + translate([ 8.5,120.9,-1]) cylinder(h=hh,r=hr); + translate([101.6, 28.4,-1]) cylinder(h=hh,r=hr); + translate([101 ,127.4,-1]) cylinder(h=hh,r=hr); + + translate([49.5,4,-1]) cylinder(h=hh,r=hrp); + translate([59.5,4,-1]) cylinder(h=hh,r=hrp); +} + +twx = 130; // x tab width +twy = 150; // y tab width +twz = 70; +tw = 2.8; // cutout tab width +tw1 = 3; // slightly longer tab width for finger joints +fuzz = .1; +module smoothieX5botPlate() { +cr = 3; // plate rounded corner radius +bw = 6; // border width, outside tabs + difference() { + hull() { + translate([ -tw/2-bw, -tw-bw,0]) cylinder(h=3,r=cr,$fn=24); + translate([ -tw/2-bw,twy+tw+bw,0]) cylinder(h=3,r=cr,$fn=24); + translate([twx+tw+bw,twy+tw+bw,0]) cylinder(h=3,r=cr,$fn=24); + translate([twx+tw+bw, -tw-bw,0]) cylinder(h=3,r=cr,$fn=24); + } + + translate([3,19,0]) smoothieX5holes(hr=2.9/2,hrp=2.9/2); + + for (x=[-1.4-fuzz,twx+tw/2+fuzz]) + for (y=[5:20:twy]) translate([x,y,0]) + cube([tw,10,22],center=true); + + for (y=[-1.4-fuzz,twy+tw/2+fuzz]) + for (x=[15:20:twx]) translate([x,y,0]) + cube([10,tw,22],center=true); + } +} + +module smoothieSidePlate(PWMcutOut=1, stepperCutOut=1) { + difference() { + cube([twy+2*tw1,twz+2*tw1,tw]); + + if (PWMcutOut) { + translate([ 49,9,-1]) cube([39,12,5]); + translate([ 84.5,9,-1]) cube([20,10,5]); + translate([109.5,9,-1]) cube([10,10,5]); + } + + if (stepperCutOut) { // stepper sire cut-outs + for (i=[73,123]) + translate([i,27,-1]) scale([2,1,1]) cylinder(r=5.5,h=5,$fn=24); + //%translate([75,30,0]) cube([12,6,15],center=true); + + translate([145,35,-1]) mirror([1,0,0]) sunon1208fanHole(); + } + + for(j=[-1,twz+tw1]) for (i=[10+tw1:20:twy-1]) + translate([i,j,-1]) cube([10,tw1+1,5]); + + for (j=[-1,153]) { + translate([j, -1,-1]) cube([tw1+1,10+1+tw1,5]); + translate([j,20+tw1,-1]) cube([tw1+1,10 ,5]); + translate([j,40+tw1,-1]) cube([tw1+1,10 ,5]); + translate([j,60+tw1,-1]) cube([tw1+1,10+1+tw1,5]); + } + + } +} + +module sunon1208fanHole() { + cube([106+1,20.6+1,6]); + translate([21,10,0]) cube([50,25.5+1-10,6]); + translate([21+28,13,0]) cube([50,25.5+1-10,6]); + translate([21+27+27,16,0]) cube([29+1+2,25.5+1-10,6]); +} + +module smoothieEndPlate(dataCutOut=1) { + difference() { + cube([twx+2*tw1,twz+2*tw1,2.8]); + + for (y=[-1,twz+tw1]) { + for(i=[tw1:20:twx]) + translate([i,y,-1]) cube([10,tw1+1,5]); + translate([-1,y,-1]) cube([10,tw1+1,5]); + translate([twx-5,y,-1]) cube([15,4,5]); + } + + for(x=[-1,twx+tw1]) for(y=[13:20:55]) + translate([x,y,-1]) cube([4,10,5]); + + if(dataCutOut) { + translate([19,8,-1]) cube([51,6,5]); + translate([19,10,-1]) cube([20,13,5]); + translate([34,10,-1]) cube([18,16,5]); + } + + } +} + +//projection(cut=true) translate([0,0,-1]) +smoothieX5botPlate(); +//translate([0,0,74]) smoothieX5botPlate(); +//#smoothieX5holes(); + +if(1) { +color([.8,.4,.4]) +translate([0,153.6,0]) rotate([90,0,-90]) + smoothieSidePlate(); +color([.4,.8,.4]) +translate([130,-tw1-fuzz,0]) rotate([90,0,90]) + smoothieSidePlate(); +} +//projection(cut=true) translate([0,0,-1]) smoothieSidePlate(); + +if(1) { +color([.3,.8,1]) +translate([-tw1,0,0]) rotate([90,0,0]) smoothieEndPlate(); +color([.3,.8,.6]) +translate([-tw1,twy+tw+fuzz,0]) rotate([90,0,0]) smoothieEndPlate(); +} +//projection(cut=true) translate([0,0,-1]) smoothieEndPlate(); + +////translate([0,0,100]) sunon1208fanHole(); diff --git a/support.scad b/support.scad new file mode 100644 index 0000000..dfadeb0 --- /dev/null +++ b/support.scad @@ -0,0 +1,44 @@ +module earBrace() { + intersection () { + hull() { + rotate([0,55,0]) scale([2,1,1]) cylinder(r=.4,h=7,$fn=12); + linear_extrude(height=0.1) + polygon(points=[[0,0],[7,1.5],[7,-1.5]], paths=[[0,1,2,0]]); + } + translate([-2,-5,0]) cube([10,10,10]); + } +} + +module supportPillar(x,y,len,rot=0,r=2,xscale=1,yscale=1) { + translate([x,y,0]) difference() { + rotate([0,0,rot]) scale([xscale,yscale,1]) cylinder(r=r ,h=len ,$fn=6); + translate([0,0,-0.5]) rotate([0,0,rot]) scale([xscale,yscale,1]) cylinder(r=r-.25,h=len+1,$fn=6); + } +} +module supportPillar4(x,y,dx,dy,dz,rot=0) { +t=0.2; + translate([x,y,dz/2]) rotate([0,0,rot]) difference() { + cube([dx ,dy ,dz ],center=true); + cube([dx-t,dy-t,dz+1],center=true); + } +} + +module zigZag(ylen,width,height,step,thick=0.4) { + union() { + for(y=[0:step:ylen]) { + hull() { + translate([-width/2,y ,0]) cylinder(h=height,r=thick/2,$fn=3); + translate([ width/2,y+step/2,0]) cylinder(h=height,r=thick/2,$fn=3); + } + hull() { + translate([ width/2,y+step/2,0]) cylinder(h=height,r=thick/2,$fn=3); + translate([-width/2,y+step ,0]) cylinder(h=height,r=thick/2,$fn=3); + } + } + } +} + +translate([0,10,0]) earBrace(); +supportPillar4(10,0,4,6,2,45); +supportPillar(-10,0,4); +translate([0,-22,0]) zigZag(20,4,4,2); diff --git a/switch_holder.stl b/switch_holder.stl deleted file mode 100644 index 499846a..0000000 Binary files a/switch_holder.stl and /dev/null differ diff --git a/tiltedDelta.scad b/tiltedDelta.scad new file mode 100644 index 0000000..648a457 --- /dev/null +++ b/tiltedDelta.scad @@ -0,0 +1,232 @@ +use ; +//cube([10,10,10]); + +// openbeam sells 1515 extrusions in 270length (and others). +// I think I got misumi at 300, but they are selectable. + +// the simple drawing, ext15.scad has no fuzz, so I'll +// use the OpenBeam model, ext15ob.scad until I add that. +use ; + +baseExtLen = 300; +railTilt = 10.8; // degrees + +use ; + +difference() { + //union() { + translate([0,140,100]) baseVertex(); + // translate([0,0,960]) apex(); + // translate([0,213,-4]) foot(); + //} + + dilatedExtrusions(); // for cut-outs for extrusions +} + +module foot() { + //%rotate([0,0,45]) cylinder(r1=20,r2=5,h=20,$fn=4); + hull() { + for(x=[-1,1]) for(y=[-1,1]) + translate([12*x,12*y,2]) sphere(2,$fn=24); + translate([0,0,12]) sphere(12,$fn=36); + } +} + +module apex() { + difference() { + hull() for (a=[-120,0,120]) rotate([0,0,a]) for(x=[-1,1]) { + translate([10*x,36, 0]) sphere(2,$fn=36); + translate([10*x,33,16]) sphere(2,$fn=36); + } + + translate([0,0,-4]) cylinder(r1=15,r2=10,h=24,$fn=6); + + // remove outside slot residual, and (most of) side rails + for (a=[-120,0,120]) rotate([0,0,a]) + translate([0,30, 0]) + rotate([railTilt,0,0]) cube([19.6,16,50],center=true); + + // side bolt holes + for (a=[-120,0,120]) rotate([0,0,a]) for(x=[-1,1]) + translate([15*x,27.1,8.6]) + rotate([0,-90*x,0]) rotate([0,0,90]) M5boltHole(.15); + + // inside bolt holes + for (a=[-120,0,120]) rotate([0,0,a]) + translate([0,11,6]) + rotate([railTilt-90,0,0]) M5boltHole(.15); + + + // flat edge cut-outs + //for (a=[-60:120:355]) rotate([0,0,a]) + // #translate([0,28,-4]) scale([3.5,1,1]) cylinder(r1=7,r2=7,h=24,$fn=6); + } +} + +//%scale(1.02) nema17(); +//nema17MountHoles(); + +// shave off some odities from main vertex and drill holes +module baseVertex() difference() { + baseVertexShell(); + + translate([0,11,-16]) rotate([railTilt-90,0,0]) { + //%scale(1.02) nema17(); + nema17MountHoles(); + } + + // remove outside of vertical rail strip + translate([0,60,0]) rotate([railTilt,0,0]) + cube([10,5,20],center=true); + + railZone(); + mirror([1,0,0]) railZone(); + + for (a=[-1,1]) translate([31.6*a,2,0]) rotate([0,0,-90-a*60]) + rotate([0,90,0]) M3railHole(8); + for (a=[-1,1]) translate([17*a,28,0]) rotate([0,0,-90-a*60]) + rotate([0,90,0]) M3railHole(8); + + // inside 20v mount screw + translate([0,37.5,-4]) + rotate([railTilt-90,0,0]) M5boltHole(); + + for (a=[-1,1]) translate([16.5*a,53,0]) + rotate([0,-90*a,0]) rotate([0,0,a*(90-railTilt)]) M5boltHole(); + +} + +// hole for setting up an 8mm M3 screw to attach to a 1515 extrusion +module M3railHole() { +nutRad = 5.46/2/cos(30); + M3screwHole(8); + translate([0,0,-8.8]) rotate([0,0,30]) + cylinder(r1=nutRad+.2,r2=nutRad,h=4,$fn=6); +} + +// get rid of extranious junk around rails on vertex +module railZone() { + translate([-47,1.5,0]) rotate([0,0,-30]) { + //hull() { + cube([12,100,16],center=true); + //translate([-10,30,-40]) cube(1); + //} + hull() { + translate([-10,20,-40]) cube(1); + translate([4,0,-5]) cube([9,100,5],center=true); + } + } +} + +module baseVertexShell() { +cr=2; // corner radius +zHi=7.5-cr; +zLo=-7.5+cr;//-4; + union() { + + hull() { + for(x=[-1,1]) { + translate([11*x,59,zHi]) sphere(r=cr,$fn=24); + translate([11*x,61,zLo]) sphere(r=cr,$fn=24); + + for(z=[zLo,zHi]) translate([27*x,44,z]) sphere(r=cr,$fn=24); + for(z=[zLo,zHi]) translate([44*x,-2,z]) sphere(r=cr,$fn=24); + } + +// for(z=[zLo,zHi]) { +// translate([x*40,0,z]) sphere(r=cr,$fn=24); +// } +// } + } + + hull() for(x=[-1,1]) { + // repeat lower nodes on outside of vertex tip + translate([11*x,61,zLo]) sphere(r=cr,$fn=24); + translate([30*x,15,-36]) sphere(r=cr,$fn=24); + translate([30*x, 4,-4 ]) sphere(r=cr,$fn=24); + } + + //%hull() { + // translate([0,40,0]) cube([30,1,1],center=true); + // cube([70,2*cr,10],center=true); + // for (x=[-1,1]) translate([x*25,8,-40]) sphere(r=cr,$fn=24); + //} + + } +} + +module M3screwHole(holeDepth=10,sinkHeight=4,fuzz=0.05) { + translate([0,0,-holeDepth]) cylinder(r=2.96/2+fuzz,h=holeDepth+1,$fn=16); + cylinder(r1=5.38/2+fuzz,r2=5.38/2+sinkHeight*fuzz/2,h=sinkHeight,$fn=20); +} + +module nema17MountHoles() { + // make central more superset of shaft + cylinder(r=11+1, h=2*9+35, $fn=48,center=true); + //#cylinder(r=2.5+.2, h=25, $fn=36); // shaft + + for (a = [0:90:359]) { + rotate([0, 0, a]) translate([15.5, 15.5, 0]) + cylinder(r=2.94/2+.1, h=20, $fn=11,center=true); + } +} + + +module dilatedExtrusions() { + for (a=[-120,0,120]) rotate([0,0,a]) + translate([0,212,0]) + rotate([railTilt,0,0]) { + + // make a little indent at foot of model to make feet fit better + difference() { + ext20(1000,.1,0); + cube([14,14,1],center=true); + } + + // want NEMA face plate 36ish mm from extrusion. + // make sure this is carved out + hull() { + for(x=[-1,1]) translate([25*x,-7.5-36-4,100]) + cylinder(r=4,h=80,$fn=24,center=true); + translate([0,-7.5-36-30,100]) cube([90,1,80],center=true); + } + //%hull() { + // translate([0,-7.5-36-20,100]) cube([50,40,80],center=true); + // translate([0,-7.5-36-30,100]) cube([90,1,80],center=true); + //} + + // clear zone for linear motion parts around shaft + hull() for(x=[-1,1]) { + translate([10*x,-19,50]) cylinder(r=3,h=100,$fn=24); + translate([20*x,-36,50]) cylinder(r=3,h=100,$fn=24); + } + } + + for (a=[-90,30,150]) rotate([0,0,a]) + translate([110,(baseExtLen+1)/2,100]) + rotate([90,0,0]) difference() { + ext15(baseExtLen+1,.1); + + // cut out ext hallow .5mm too long, but put a little + // spacer at the desired position + cube([12,12,1],center=true); + cylinder(r1=2,r2=1,h=2,$fn=16); + translate([0,0,baseExtLen+1]) cube([12,12,1],center=true); + translate([0,0,baseExtLen-1]) cylinder(r1=1,r2=2,h=2,$fn=16); + } +} + + +m5rad = 4.92/2;//4.88/2; +m5_head_radius = 8.62/2;//8.5/2; // 5mm head height, uses 4mm hex drive + +module M5boltHole(fuzz=0.05) { + cylinder(r=m5rad+fuzz,h=11,$fn=15); + translate([0,0,-14]) + cylinder(r2=m5_head_radius,r1=m5_head_radius+1,h=15,$fn=24); + + // extra clearance for extrusion nut + translate([0,0,8.8]) cube([10,16,4],center=true); + translate([0,0,6 ]) cylinder(r=3.5+.2,h=4,$fn=17); + +} diff --git a/topAssem.scad b/topAssem.scad new file mode 100644 index 0000000..12e6bbf --- /dev/null +++ b/topAssem.scad @@ -0,0 +1,75 @@ +// complete top (bottom) assembly, fused with vertexB drawing. +// take a slice of this to generate DXF drawing for laser cut + +use ; + +m3rad = 2.94/2-.1; + +//projection(cut=true) +translate([0,0,-0.2]) { + difference() { + union() { + for (a=[0,120,240]) { + rotate([0,0,a]) translate([0,-141,0]) vertexB(16,-0.15); + } + + difference() { + intersection() { + rotate([0,0,30]) cylinder(r=221,h=15,$fn=3); + translate([0,0,-1]) rotate([0,0,-30]) cylinder(r=333,h=17,$fn=3); + } + + // open holes so that holes from vertex can show through + for (a=[0,120,240]) { rotate([0,0,a]) + for (b=[-1,1]) { + translate([58*b,-108,-1]) cylinder(r=4,h=23,$fn=6); + translate([40*b,-138,-1]) cylinder(r=4,h=23,$fn=6); + } + } + } + } + + // drill more holes in top plate + translate([0,0,-1]) { + + // drill edge holes + for (b=[0,120,240]) { + rotate([0,0,b]) { + for (c=[-1,0,1]) { + translate([c*35,104,0]) cylinder(r=m3rad,h=27,$fn=11); + } + } + } + + // holes for belt tensioner idler + // should be about 20mm in from front of extrusion + %translate([0,-158,18]) cube([2*12,20,5],center=true); // diagnostic for spacing from extrusion + for (a=[30,150,270]) { + rotate([0,0,a]) { + for(b=[-1,1]) { + translate([148,12*b,0]) cylinder(r=m3rad,h=27,$fn=11); + } + } + } + + if (1) { + // decorative holes + cylinder(r=30,h=17,$fn=120); + for(d=[0,60,120,180,240,300]) { + rotate([0,0,d]) translate([75,0,0]) cylinder(r=25,h=17,$fn=96); + } + for(d=[30,150,270]) { + rotate([0,0,d]) translate([112,0,0]) cylinder(r=15,h=17,$fn=96); + } + } else { + // a big ring might be better for under print bed + cylinder(r=90,h=18,$fn=120); + } + + } + } +} + +%translate([-350/2,130,0]) cube([350,20,20]); +%translate([0,0,20]) cylinder(r=9*25.4/2,h=4,$fn=180); +%translate([0,0,30]) cylinder(r=250/2,h=3.3,$fn=180); \ No newline at end of file diff --git a/topPlate340x300.pl b/topPlate340x300.pl new file mode 100755 index 0000000..5399a11 --- /dev/null +++ b/topPlate340x300.pl @@ -0,0 +1,150 @@ +#!/usr/bin/perl -w +# $URL$ +# $Id$ +# +# top brace plate for mini-kossel +# +# Extrusion is (ideally) 240mm. Inside triangle formed by +# extrusion is (ideally) 269.445mm + +require 'laserPartsUtil.pl'; + +# get this from file name to make SURE it matches +($wmm,$hmm) = &parseSizeFromFileName($0); + +&printLaserCutHeader($wmm,$hmm); + +$pi = 3.14159265359; +$deg2rad = $pi / 180; +$s60 = sin(60*$deg2rad); + +$iLen = 240 + 2 * 30*$s60; # inside length of triangle (sin(60)==cos(30)) +$rCurve = 4; # radius of curves +$truncOffset = 69; # how far back from vertex do we want curve +$extWidth = 15; # extrusion width +$borderWidth = $extWidth; # width of border past inside iLen triangle +$boltOffset = 61; # dist from corner of extrusion centerline triangle to put first bolt +$pulleyInsetFromInsideVertex = 45; # approx. needs calibration +$pulleyBoltSep = 12; # from pulleyHolder.scad +$pulleyBraceLen = 40; +$pulleyBraceRad = 8; + +$oLen = $iLen + 2*2*$borderWidth*$s60; # outside triangle length +$sLen = $iLen + 2* $extWidth*$s60; # extrusion slot centerline triangle len +local $yLo = (sin(30*$deg2rad)/cos(30*$deg2rad)) * ($oLen/2); +local $h = sqrt(3) * $oLen / 2; +print STDERR "yLo $yLo\n"; + +printf("\n",$wmm/2,$hmm*0.65); + +local $iyLo = $yLo-$borderWidth; +local $yHi = $yLo-$h; +local $iyHi = $yHi + 2 * $borderWidth; + +# Slot center line +local $syLo = (sin(30*$deg2rad)/cos(30*$deg2rad)) * ($sLen/2); +local $sh = sqrt(3) * $sLen / 2; +local $syHi = $syLo-$sh; + +&printEquilateralTriangle($oLen, $yLo,$ yHi); # outside border of plate +&printEquilateralTriangle($iLen,$iyLo,$iyHi); # inside border of extrusion +&printEquilateralTriangle($sLen,$syLo,$syHi); # centerline of extrusion slot + +&printTruncTriangle(0,0,0,$oLen,$truncOffset,$rCurve); + +$r3 = 2.94/2 - 0.1; # radius for hole for M3 screw +local $br = (($iLen/2) / $s60) - $pulleyInsetFromInsideVertex; +#print STDERR "iLen = $iLen\npulley bolt radius = $br\n"; +&plotPulleyBoltHoles($br, 0,$pulleyBoltSep); +&plotPulleyBoltHoles($br, 120,$pulleyBoltSep); +&plotPulleyBoltHoles($br,-120,$pulleyBoltSep); + +### braces for pulley bolts +local $pbr = $pulleyBraceRad; +local $pbd = 2*$pulleyBoltSep; +local $pbl = $pulleyBraceLen; +local $x0 = -60.4; +local $y0 = -110; +local $pd = $pulleyBraceLen + 2*$pulleyBraceRad + 0.2; +&plotBrace($x0,$y0,120,$r3,$pbr,$pbd,$pbl); $x0 -= 0.5*$pd; $y0 += $s60*$pd; +&plotBrace($x0,$y0,120,$r3,$pbr,$pbd,$pbl); $x0 -= 0.5*$pd; $y0 += $s60*$pd; +&plotBrace($x0,$y0,120,$r3,$pbr,$pbd,$pbl); +#&plotBrace(0,-$br,180,$r3,$pbr,$pbd,$pbl); # diag: show overlay + +### edge bolt holes + +local $x1 = -$sLen/2+$boltOffset; +local $nf = 24; # number of facets for bolt holes +&plotCircle(-$x1,$syLo,$r3,$nf); +&plotCircle( $x1,$syLo,$r3,$nf); +&plotCircle( 0 ,$syLo,$r3,$nf); +local $dx = -2 * $x1; +$x1 = $boltOffset/2; +local $y1 = $syHi + $s60 * $boltOffset; +print STDERR "syLo=$syLo syHi=$syHi sh=$sh y1=$y1\n"; +&plotCircle( $x1,$y1,$r3,$nf); +&plotCircle(-$x1,$y1,$r3,$nf); $x1 += $dx/4; $y1 += $s60 * $dx/2; +&plotCircle( $x1,$y1,$r3,$nf); +&plotCircle(-$x1,$y1,$r3,$nf); $x1 += $dx/4; $y1 += $s60 * $dx/2; +&plotCircle( $x1,$y1,$r3,$nf); +&plotCircle(-$x1,$y1,$r3,$nf); + +# decorative holes +$dx=60; +$br=30; +$nf=90; +&plotCircle( 0 ,-$dx ,$br,$nf); +&plotCircle( $dx*$s60, $dx/2,$br,$nf); +&plotCircle(-$dx*$s60, $dx/2,$br,$nf); + +print ""; + + +sub printTruncTriangle() { + local ($x0,$y0,$rot,$len,$offst,$rc) = @_; + + local $h = sqrt(3) * $len / 2; + local $yLo = (sin(30*$deg2rad)/cos(30*$deg2rad)) * ($len/2); + local $yHi = $yLo - $h; + local $v1x = $len/2; local $v1y = $yLo; + local $v2x = 0; local $v2y = $yHi; + local $v3x = -$v1x; local $v3y = $v1y; + + print "\n"; +} + +sub plotPulleyBoltHoles() { + local ($pulleyRad, $ang, $boltSep) = @_; + + print "Pulley Carriage Bolt Holes\n"; + &plotCircle(-$boltSep,-$pulleyRad,$r3,18); + &plotCircle( $boltSep,-$pulleyRad,$r3,18); + print "\n"; +} + +sub plotBrace() { + local ($x0,$y0,$rot,$ri,$ro,$len,$bLen) = @_; + + print "Connector Link (pulley bolt brace) +\n"; + &plotCircle(-$len/2,0,$ri,24); + &plotCircle( $len/2,0,$ri,24); + print "\n"; +} + +sub printEquilateralTriangle() { + local ($len,$lo,$hi) = @_; + + print "\n",$len/2, $lo, $hi,-$len/2, $lo); +} diff --git a/vertex.scad b/vertex.scad index 44382aa..a9acde1 100644 --- a/vertex.scad +++ b/vertex.scad @@ -3,9 +3,13 @@ include ; $fn = 24; roundness = 6; +m3rad = 2.93/2; +m3headRad = 5.36/2; +m3nutRad = 5.5/2/cos(30); + module extrusion_cutout(h, extra) { difference() { - cube([extrusion+extra, extrusion+extra, h], center=true); + cube([extrusion+extra+.3, extrusion+extra+.3, h], center=true); for (a = [0:90:359]) rotate([0, 0, a]) { translate([extrusion/2, 0, 0]) cube([6, 2.5, h+1], center=true); @@ -14,87 +18,136 @@ module extrusion_cutout(h, extra) { } module screw_socket() { - cylinder(r=m3_wide_radius, h=20, center=true); - translate([0, 0, 3.8]) cylinder(r=3.5, h=5); +extraCounterSink = 0.4; // add a little extra countersink for Quelab printer + cylinder(r=m3rad+0.1, h=20, center=true, $fn=13); + translate([0, 0, 3.8-extraCounterSink]) + cylinder(r=5.35/2+.2, h=5, $fn=24); } module screw_socket_cone() { union() { screw_socket(); - scale([1, 1, -1]) cylinder(r1=4, r2=7, h=4); + translate([0,0,-1.5]) scale([1,1,-1]) rotate([0,0,30]) + cylinder(r1=m3nutRad, r2=m3nutRad+1, h=5, $fn=6); } } -module vertex(height, idler_offset, idler_space) { - union() { - // Pads to improve print bed adhesion for slim ends. - translate([-37.5, 52.2, -height/2]) cylinder(r=8, h=0.5); - translate([37.5, 52.2, -height/2]) cylinder(r=8, h=0.5); - difference() { - union() { - intersection() { - translate([0, 22, 0]) - cylinder(r=36, h=height, center=true, $fn=60); - translate([0, -37, 0]) rotate([0, 0, 30]) - cylinder(r=50, h=height+1, center=true, $fn=6); - } - translate([0, 38, 0]) intersection() { - rotate([0, 0, -90]) - cylinder(r=55, h=height, center=true, $fn=3); - translate([0, 10, 0]) - cube([100, 100, 2*height], center=true); - translate([0, -10, 0]) rotate([0, 0, 30]) - cylinder(r=55, h=height+1, center=true, $fn=6); - } +module vertexShell(height) { union() { + intersection() { + translate([0, 22, 0]) + cylinder(r=36, h=height, center=true, $fn=60); + translate([0, -37, 0]) rotate([0, 0, 30]) + cylinder(r=50, h=height+1, center=true, $fn=6); + } + translate([0, 38, 0]) intersection() { + rotate([0, 0, -90]) + cylinder(r=55, h=height, center=true, $fn=3); + translate([0, 10, 0]) + cube([100, 100, 2*height], center=true); + translate([0, -10, 0]) rotate([0, 0, 30]) + cylinder(r=55, h=height+1, center=true, $fn=6); + } +}} + +module sub2(height,idler_offset,idler_space) { difference() { + translate([0, 58, 0]) minkowski() { + intersection() { + rotate([0, 0, -90]) + cylinder(r=55, h=height, center=true, $fn=3); + translate([0, -32+1.5, 0]) + cube([100, 16-4, 2*height], center=true); + } + cylinder(r=roundness, h=1, center=true); + } + // Idler support cones. [no longer putting idler here. attached to top brace (ab)] + if (idler_space < 30*.001) { + translate([0, 26+idler_offset-30, 0]) rotate([-90, 0, 0]) + cylinder(r1=30, r2=2, h=30-idler_space/2); + translate([0, 26+idler_offset+30, 0]) rotate([90, 0, 0]) + cylinder(r1=30, r2=2, h=30-idler_space/2); + } +}} + +//use ; // Mistumi +use ; // OpenBeam + +module vertex(height) { + difference() { + vertexShell(height); + sub2(height); + translate([0, 58, 0]) minkowski() { + intersection() { + rotate([0, 0, -90]) + cylinder(r=55, h=height, center=true, $fn=3); + translate([0, 7, 0]) + cube([100, 30, 2*height], center=true); } - difference() { - translate([0, 58, 0]) minkowski() { - intersection() { - rotate([0, 0, -90]) - cylinder(r=55, h=height, center=true, $fn=3); - translate([0, -32, 0]) - cube([100, 16, 2*height], center=true); + cylinder(r=roundness, h=1, center=true); + } + + //%extrusion_cutout(height+10, 2*extra_radius); // try more detailed extrusion model + // fuzz=0.3 was good fit on OpenBeam + translate([0,0,-height/2-1]) ext15(height+2,0.3); + + for (z = [0:30:height]) { + translate([0, -7.5-extra_radius, z+7.5-height/2]) rotate([90, 0, 0]) + screw_socket_cone(); + for (a = [-1, 1]) { + rotate([0, 0, 30*a]) translate([-16*a, 111, z+7.5-height/2]) { + // % rotate([90, 0, 0]) extrusion_cutout(200, 0); + // Screw sockets. + for (y = [-88, -44]) { + translate([a*7.5, y, 0]) rotate([0, a*90, 0]) screw_socket(); } - cylinder(r=roundness, h=1, center=true); - } - // Idler support cones. - translate([0, 26+idler_offset-30, 0]) rotate([-90, 0, 0]) - cylinder(r1=30, r2=2, h=30-idler_space/2); - translate([0, 26+idler_offset+30, 0]) rotate([90, 0, 0]) - cylinder(r1=30, r2=2, h=30-idler_space/2); - } - translate([0, 58, 0]) minkowski() { - intersection() { - rotate([0, 0, -90]) - cylinder(r=55, h=height, center=true, $fn=3); - translate([0, 7, 0]) - cube([100, 30, 2*height], center=true); - } - cylinder(r=roundness, h=1, center=true); - } - extrusion_cutout(height+10, 2*extra_radius); - for (z = [0:30:height]) { - translate([0, -7.5-extra_radius, z+7.5-height/2]) rotate([90, 0, 0]) - screw_socket_cone(); - for (a = [-1, 1]) { - rotate([0, 0, 30*a]) translate([-16*a, 111, z+7.5-height/2]) { - // % rotate([90, 0, 0]) extrusion_cutout(200, 0); - // Screw sockets. - for (y = [-88, -44]) { - translate([a*7.5, y, 0]) rotate([0, a*90, 0]) screw_socket(); + // Nut tunnels. + for (zzz = [-1, 1]) { if ((height<20) || (zzz>0)) { + assign(zz=((z<20)?-1:1)*zzz){ + scale([1, 1, zz]) translate([0, -100, 3]) minkowski() { + //rotate([0, 0, -a*30]) #cylinder(r=4, h=16, $fn=6); + rotate([0, 0, -a*30]) cylinder(r=4, h=5, $fn=6); + cube([0.1, 5, 0.1], center=true); } - // Nut tunnels. - for (z = [-1, 1]) { - scale([1, 1, z]) translate([0, -100, 3]) minkowski() { - rotate([0, 0, -a*30]) cylinder(r=4, h=16, $fn=6); - cube([0.1, 5, 0.1], center=true); - } - } - } + }}} } } } } } -translate([0, 0, 7.5]) vertex(15, idler_offset=0, idler_space=10); + +// add a little extra bracing to the edge to try to keep from warping +module endBrace(height) { +br=1.2; + translate([ 43.05,57.5,0]) rotate([0,0,60]) { + // extend leg a bit + hull() { cube([1,4,height]); + translate([10,br,0]) cylinder(h=15,r=br, $fn=16); + } + hull() { + translate([10,br,0]) cylinder(h=13,r=br, $fn=16); + translate([9,2,0]) cube([2*br,12,2]); + } + } +} + +// ------------ pad/brim to help sticking/warping on Quelab printer (ab) +module footTab() { +x1=13; y1=30; +x2=5; y2=40; + linear_extrude(height=0.4) + polygon(points=[[0,0],[-x1,y1+5],[-x2,y2+10], [x2,y2+10],[x1+5,y1+10]], + paths=[[0,1,2,3,4,0]]); +} + +module vertexPad() { color("Cyan") { + translate([0,-3,0]) scale([2,1,1]) cylinder(h=.4,r1=16.3,r2=16,$fn=6); + translate([ 25,34,0]) rotate(-33) mirror([1,0,0]) footTab(); + translate([-25,34,0]) rotate( 33) footTab(); + linear_extrude(height=0.4) + polygon(points=[[16,10],[35.6,44.2],[-35.6,44.2],[-16,10]],paths=[[0,1,2,3,0]]); +}} + +// ======================================================================= + +vertex(15); +//intersection() { cube([25,25,20],center=true); vertex(15); } diff --git a/vertexB.scad b/vertexB.scad new file mode 100644 index 0000000..c3f19f5 --- /dev/null +++ b/vertexB.scad @@ -0,0 +1,112 @@ +//use ; +use ; + +module vertexBframe(thick) { +t2 = thick+2; + union() { + difference() { + intersection() { + hull() for(a=[0,120,240]) rotate([0,0,a]) + translate([0,-68,0]) cylinder(r=6,h=thick,$fn=36); + translate([0,0,-1]) hull() { + translate([0,-50,0]) + scale([16,8,1]) cylinder(r=1,h=t2+2,$fn=64); + translate([-75,40,0]) cube([150,4,t2]); + } + } + + // clear out main interior V + hull() { + for(a=[-1,1]) { translate([22*a,-13,-1]) cylinder(r=8,h=t2,$fn=36); } + translate([0,45,thick/2]) cube([130,1,t2],center=true); + } + } + + // diagnostic ruler. We want about 36mm between front of nema17 + // and front edge of extrusion + %translate([0,-9,9]) cube([2,36,t2*2],center=true); + + for(a=[-1,1]) { + hull() { + translate([cos(30)*68*a,68/2,0]) cylinder(r=6,h=thick,$fn=36); + translate([54*a,21,0]) cylinder(r=1,h=thick,$fn=6); + } + } + } +} + +// brace across vertex. custom sizing +module braceRail(thick) { +t2 = thick+2; + difference() { + translate([-55,-15,0]) cube([110,27,thick]); + + translate([0,0,-1]) { // make all subtractions a little wide to make sure it is a clean cut + hull() { + for (a=[-1,1]) { translate([38*a,17,0]) cylinder(r=12,h=t2,$fn=36); } + } + hull() { + for (a=[-1,1]) { translate([24.5*a,-10,0]) cylinder(r=10,h=t2,$fn=36); } + } + for(a=[-1,1]) { translate([54*a,-7,t2/2]) rotate([0,0,-30*a]) + cube([20,50,t2],center=true); + } + } + } +} + +module m3hole(thick,fuzz) { cylinder(r=2.94/2+fuzz, h=thick+2, $fn=11); } +module m5socketHead(len,fuzz,counterSink=0) { + union() { + translate([0,0,-0.03]) cylinder(h=len+0.03,r=4.88/2+fuzz, $fn=13); + translate([0,0,-5-counterSink]) + cylinder(h=5+counterSink, + r1=8.5/2+fuzz+(len+counterSink)*0.02, + r2=8.5/2+fuzz-0.1, + $fn=24); + } +} +module m5slotNut() { + translate([0,0,-1.6/2]) cube([10,15,1.61],center=true); + cylinder(h=1.4,r=7/2,$fn=36); +} +module extrusionAnchorCutout(z,fuzz) { + translate([0,-52,z]) { + translate([0,6.6,0]) rotate([ 90,0,0]) m5slotNut(); + rotate([-90,0,0]) m5socketHead(10,fuzz,2); + } +} + +module vertexB(thick,fuzz) { + difference() { + union() { + vertexBframe(thick); + translate([0,5,0]) braceRail(thick); + } + + translate([0,0,-1]) { + translate([0,-37,0]) ext20(thick+11*0.2,fuzz,2); + + // M3 drill holes + for(a=[-1,1]) { + translate([19*a,-31,0]) m3hole(thick,fuzz/2); + translate([39*a, 3,0]) m3hole(thick,fuzz/2); + translate([59*a, 34,0]) m3hole(thick,fuzz/2); + + //smooth outer ear transition + translate([44*a,28.4,0]) cylinder(r=10,h=thick+2,$fn=60); + } + } // end of z=-1 shift for subtractions + + // extrusion anchor screw(s) + if(thick < 21) { + extrusionAnchorCutout(thick/2,fuzz); + } else { + extrusionAnchorCutout( 9,fuzz); + extrusionAnchorCutout(thick-9,fuzz); + } + + } // end of difference +} + +vertexB(1?16:45,0.2); diff --git a/vertexC.scad b/vertexC.scad new file mode 100644 index 0000000..f694dc5 --- /dev/null +++ b/vertexC.scad @@ -0,0 +1,152 @@ +// vertex for use with OpenBuilds v-slot 2mm extrusion towers, +// and 15mm extrusion braces + +use ; +use ; + + +module vertexCframe(thick,fuzz,extCutout=true,motorHole=true) { +t2 = thick+2; + difference() { + hull() { + for(a=[-1,1]) translate([12*a,-12,0]) + cylinder(h=thick,r=10,$fn=36); + translate([0,58,thick/2]) cube([127,2,thick],center=true); + } + + // extrusion guide + if (extCutout) { + for(a=[-1,1]) { + translate([-20*a,-3.5,0]) rotate([0,0,30*a]) { + translate([0,0,7.5]) + rotate([-90,0,0]) ext15(100,0.15); + if (thick>33) translate([0,0,thick-7.5]) + rotate([-90,0,0]) ext15(100,0.15); + } + + // remove slot guide from other 3 sides + translate([-24*a,-5.82,-.5]) + rotate([0,0,30*a]) translate([-8,0,0]) + cube([16,90,thick+2]); + } + } + + // motor shaft area cut-out + if (motorHole) hull() { + for (a=[-1,1]) { + translate([12*a,24,-1]) cylinder(h=t2,r=8,$fn=36); + translate([20*a,35,-1]) cylinder(h=t2,r=6,$fn=36); + } + } + + // screw tab cut-out + hull() { + for (a=[-1,1]) { + translate([30*a,52,-1]) cylinder(h=t2,r=6,$fn=36); + } + translate([0,65,thick/2]) cube([90,2,thick],center=true); + } + + // --------- extrusion cut-out + translate([0,0,-1]) ext20(thick+11,fuzz,2); + + // M3 drill holes + for(a=[-1,1]) translate([30*a,41,-1]) m3hole(thick,fuzz); + + } + + // diagnostic ruler. We want about 36mm between front of nema17 + // and front edge of extrusion + %translate([0,28,9]) cube([2,36,t2*2],center=true); +} + +module m3hole(thick,fuzz) { cylinder(r=2.94/2+fuzz, h=thick+2, $fn=11); } +module m5socketHead(len,fuzz,counterSink=0) { + union() { + translate([0,0,-0.03]) cylinder(h=len+0.03,r=4.88/2+fuzz, $fn=13); + translate([0,0,-5-counterSink-5]) + cylinder(h=5+counterSink+5, + r1=8.5/2+fuzz+(len+counterSink)*0.02, + r2=8.5/2+fuzz-0.1, + $fn=24); + } +} +module m5slotNut() { + translate([0,0,-1.6/2]) cube([10,15,1.61],center=true); + cylinder(h=1.4,r=7/2,$fn=36); +} +module extrusionAnchorCutout(z,fuzz) { + translate([0,-14.8,z]) { + translate([0,6.6,0]) rotate([ 90,0,0]) m5slotNut(); + rotate([-90,0,0]) m5socketHead(10,fuzz,2); + } +} + +module m3extHole(fuzz) { + translate([0,0,-8])m3hole(9-2,fuzz); + cylinder(h=8,r1=5.5/2-.1,r2=5.5/2+.4,$fn=24); + translate([0,0,-10]) + cylinder(h=5,r2=5.5/2/cos(30),r1=5.5/2/cos(30)+.4,$fn=6); +} + +module e15nutAccess() { + hull() { + cylinder(h=6,r=3/cos(30),$fn=6); + translate([5,0,3]) cube([1,6,6],center=true); + } +} + +module extMountHoles(t2,f2) { + for(a=[-1,1]) translate([0,0,t2]) { + translate([-22.5*a,24,0]) + rotate([0,0,120*a]) rotate([90,0,0]) m3extHole(f2); + translate([-38.3*a,52,0]) + rotate([0,0,120*a]) rotate([90,0,0]) m3extHole(f2); + } +} + +module vertexC(thick,fuzz) { + difference() { + vertexCframe(thick,fuzz); + + // extrusion anchor screw(s) + if(thick < 21) { + extrusionAnchorCutout(thick/2,fuzz); + } else { + extrusionAnchorCutout( 11,fuzz); + extrusionAnchorCutout(thick-11,fuzz); + } + + extMountHoles(7.5,fuzz/2); // extrusion mount holes + if (thick>33) extMountHoles(thick-7.5,fuzz/2); + + // slot access cutouts + for(a=[-1,1]) { + translate([-18.7*a,-6, -6+4.5]) rotate([0,0,90+30*a]) e15nutAccess(); + translate([-18.7*a,-6,thick-4.5]) rotate([0,0,90+30*a]) e15nutAccess(); + } + translate([-26.5,-10,7.5]) rotate([90,0,90+30]) e15nutAccess(); + translate([ 21.5, -7,7.5]) rotate([90,0,90-30]) e15nutAccess(); + if (thick > 33) { + translate([-26.5,-10,thick-7.5]) + rotate([90,0,90+30]) e15nutAccess(); + translate([ 21.5, -7,thick-7.5]) + rotate([90,0,90-30]) e15nutAccess(); + } + } // end of difference +} + +vertexC(1?15:45,0.08); + +use ; + +color("Cyan") { + for(a=[-1,1]) { + supportPillar(19.2*a,-5.5,4.4); + translate([15.6*a,0,0]) rotate([0,0,-30*a]) zigZag(66,2,6.2,2); + } + translate([-22.5,-6.6,4.6]) supportPillar4(0,0,3,2,5.8, 30); + translate([ 25.5,-6.6,4.6]) supportPillar4(0,0,3,2,5.8,-30); + translate([ 1,-17,3.2]) supportPillar4(0,0,2 ,4,8.6); + translate([.8,-10,5.4]) supportPillar4(0,0,1.6,4,4.4); +} diff --git a/wheeledCarriage.scad b/wheeledCarriage.scad new file mode 100644 index 0000000..24b7a4f --- /dev/null +++ b/wheeledCarriage.scad @@ -0,0 +1,261 @@ +include ; +use ; + +separation = 40; +thickness = 6; + +horn_thickness = 13; +horn_x = 8; + +belt_width = 6; +belt_x = 5.6; +belt_z = 7; + +// Parameters for wheeled base +base_thickness = 11; +wheel_radius = 8; // delrin wheels +extrusion_width = 15; +wheel_offset = 18; +m3_head_radius=5.4/2+0.2; +boltSep = 8; // tension bolt seperation half-dist + +module carriage() { + // Timing belt (up and down). + translate([-belt_x, 0, belt_z + belt_width/2]) % + cube([1.7, 100, belt_width], center=true); + translate([belt_x, 0, belt_z + belt_width/2]) % + cube([1.7, 100, belt_width], center=true); + difference() { + union() { + // Main body + hull() { + translate([-9.5,-15,-.5]) cube([19.2,30,1]); + translate([-9.5, -8,thickness-1]) cube([19.2,16,1]); + } + + // Ball joint mount horns. + for (x = [-1, 1]) { + scale([x, 1, 1]) intersection() { + translate([0, 0, horn_thickness/2]) + cube([separation, 18, horn_thickness], center=true); + translate([horn_x, 0, horn_thickness/2]) rotate([0, 90, 0]) + cylinder(r1=14, r2=2.5, h=separation/2-horn_x); + } + } + + // side support + for (i=[-1,1]) { hull() { + translate([ 9.8*i,-7.5,12]) scale([1,2,1]) rotate([0,0,22.5]) cylinder(h=1,r=2,$fn=8); + translate([ 9.8*i, 7.5,12]) scale([1,2,1]) rotate([0,0,22.5]) cylinder(h=1,r=2,$fn=8); + translate([ 9.6*i,-18,0]) sphere(2,$fn=8); + translate([ 9.6*i, 18,0]) sphere(2,$fn=8); + translate([14*i,0,0]) cylinder(h=1,r=3,$fn=6); + }} + + translate([2.1,-8.1,3.5]) rotate([0,0,180]) beltCatch(9); + translate([2.1, 8.1,3.5]) mirror([1,0,0]) beltCatch(9); + + // belt catch support/fill + translate([ 3 ,-24,3.5]) cube([4,48,3.5]); + translate([-1.6,-16,3.5]) cube([6,32,3.5]); + } + + // Screws for ball joints. + translate([0, 0, horn_thickness/2]) rotate([0, 90, 0]) + cylinder(r=m3_wide_radius, h=60, center=true, $fn=12); + // Lock nuts for ball joints. + for (x = [-1, 1]) { + scale([x, 1, 1]) intersection() { + translate([horn_x, 0, horn_thickness/2]) rotate([90, 0, -90]) + cylinder(r1=m3_nut_radius-0.2, r2=m3_nut_radius+0.5, h=8, + center=true, $fn=6); + } + } + } +} + + +module wheelAxleBrace() { + //hull() { + // cylinder(h=1,r=5,$fn=36); + // translate([0,0,base_thickness-3]) cylinder(h=6,r1=5,r2=3.7,$fn=36); + //} + intersection() { + cylinder(h=base_thickness+3,r=5,$fn=36); + translate([0,0,4]) scale([1,1,3]) sphere(5,$fn=36); + } +} +module wheelAxleHole() { + translate([0,0,-30]) cylinder(h=60,r=m3_wide_radius,$fn=12); + translate([0,0,base_thickness-1]) cylinder(h=10,r=m3_head_radius,$fn=30); +} +module mobileWheelMount(dilation) { +bthick = base_thickness + 2*dilation; + difference() { + union() { + cylinder(h=bthick,r=6.5+dilation,$fn=24); + translate([0,0,bthick/2]) rotate([0,90,0]) hull() { + translate([0,-boltSep,0])cylinder(h=10,r=bthick/2,$fn=6); + translate([0, boltSep,0])cylinder(h=10,r=bthick/2,$fn=6); + } + } + if (dilation==0) { // this is the ACTUAL mount, not a socket, add screw holes + translate([0,0,-2.2]) wheelAxleHole(); + translate([0,0,bthick/2]) rotate([0,90,0]) { + for (i=[-boltSep,boltSep]) { + translate([0,i,-3]) wheelAxleHole(); + } + } + // move to main #translate([-8,-6,-.1]) cube([3.5,12,1.3]); + } + } +} + +module cableCatchBrace() { + hull() { + translate([0, 1.5,12.4]) cube([12 ,3 ,1 ]); + //translate([ 2, 5,11]) cube([6.5,1 ,2.5]); + translate([13,-.5, 5 ]) cube([8,6,5]); + } + + // flat pad for stop switch + %translate([4,-7,5]) cube([12,7,5]); // flat pad for stop switch + hull() { + translate([7.5 ,4,7.5]) rotate([90,0,0]) cylinder(r1=3,r2=2.1,h=9,$fn=15); + translate([18 ,4,7.5]) rotate([90,0,0]) cylinder(r1=3,r2=2.1,h=9,$fn=15); + // some extra bracing + translate([13,0,3]) rotate([90,0,0]) scale([2,1,1]) cylinder(r1=4,r2=1,h=1,$fn=22); + } + + // more bracing for under belt catch + hull() { + translate([-6,-6,14]) sphere(2,$fn=22); + translate([-10,2,14]) cube([11,1,1]); + translate([-8,4, 4]) sphere(1,$fn=18); + translate([-1,1,14]) sphere(2,$fn=22); + } + +} + +module wheelBase() { +dx = extrusion_width/2+wheel_radius; +supportSpread = 6; + difference() { + union() { + for (i=[-wheel_offset,wheel_offset]) { + hull() { // main wheel axle screw holder pair + translate([-dx, i,0]) wheelAxleBrace(); + translate([-dx+10,(i<0)?i+9:i-9,8]) cylinder(r=2,h=1,$fn=6); + } + } + + // tension screw housing pair + translate([0,0,base_thickness/2]) rotate([0,90,0]) { + for (i=[-boltSep,boltSep]) { + translate([0,i,-20]) cylinder(r=4.2,h=41,$fn=36); + } + } + + // brace section for mobile mount + //%hull() { // brace section for mobile mount + // translate([ dx- 9,-16,.03]) cube([15,32,base_thickness]); + // translate([ dx-20,-12,4]) cube([11,24,base_thickness-4]); + //} + hull() { + translate([dx+6,-16,base_thickness/2+0.01]) scale([1,1,base_thickness/2]) sphere(1,$fn=36); + translate([dx+6, 16,base_thickness/2+0.01]) scale([1,1,base_thickness/2]) sphere(1,$fn=36); + translate([ 6, 16,base_thickness/2+0.01]) scale([1,1,base_thickness/2]) sphere(1,$fn=36); + translate([ 6,-16,base_thickness/2+0.01]) scale([1,1,base_thickness/2]) sphere(1,$fn=36); + translate([-4,0,10]) rotate([90,0,0]) cylinder(r=1.5,h=14,$fn=24,center=true); + } + + // brace between main fixed wheel axles + //%translate([-dx-2,-16,0]) cube([ 7,32,base_thickness]); + hull() { + translate([-dx+2, wheel_offset,6]) scale([1.5,.1,3]) sphere(2,$fn=36); + translate([-dx+2,-wheel_offset,6]) scale([1.5,.1,3]) sphere(2,$fn=36); + } + + // fill in little middle-underside gap between braces + //translate([-dx+2, -6,base_thickness*0.55]) cube([ 9,16,3]); + + // extra bracing from belt catch to mobile mount rails + translate([0,-15,1]) cableCatchBrace(); + translate([0, 15,1]) mirror([0,1,0]) cableCatchBrace(); + } + + // Adjustable tension screw holes + translate([0,0,base_thickness/2]) rotate([0,90,0]) { + for(i=[-boltSep,boltSep]) { + translate([0,i,-24]) { + cylinder(r=m3_wide_radius,h=60,$fn=12); + cylinder(r1=m3_nut_radius+.4, r2=m3_nut_radius-.2, h=7, $fn=6); + } + } + } + } +} + +module wheelBaseHoles() { +dx = extrusion_width/2+wheel_radius; + translate([-dx,-wheel_offset,1]) wheelAxleHole(); + translate([-dx, wheel_offset,1]) wheelAxleHole(); + translate([dx-6,0,0]) mobileWheelMount(.3); + translate([dx-2,0,0]) mobileWheelMount(.3); +} + +module earBrace() { + intersection () { + hull() { + rotate([0,55,0]) scale([2,1,1]) cylinder(r=.4,h=7,$nf=12); + linear_extrude(height=0.1) + polygon(points=[[0,0],[7,1.5],[7,-1.5]], paths=[[0,1,2,0]]); + } + translate([-2,-5,0]) cube([10,10,10]); + } +} + +module mobileSupport() { + for (i=[26,30]) { + intersection() { + translate([i ,-8.2,-0.4]) rotate([0,5,-90]) scale([0.8,0.6,0.8]) earBrace(); + translate([i-2,-17,.3]) cube([4,8,4]); + } + } +} + +use ; +%translate([0,34.4-2,6.5]) rotate([180,0,0]) endstopCarriage(); + +difference() { union() { + difference() { + union() { + translate([0,-5+5,base_thickness-.4]) mirror([1,0,0]) carriage(); + wheelBase(); + } + wheelBaseHoles(); + } + translate([23+5,0,0.05]) mobileWheelMount(0); + + color("Cyan") { + //%hull() { + // for (i=[-wheel_offset,wheel_offset]) { + // translate([-extrusion_width/2-wheel_radius,i,0]) + // cylinder(h=0.4,r=6.65,$fn=24); + // } + //} + //%translate([9,-17,0]) cube([23,34,0.4]); + + // support material, forced + translate([ 17.3,0,base_thickness+.9]) scale([0.5,0.6,0.7]) earBrace(); + translate([-17.3,0,base_thickness+.9]) mirror([1,0,0]) scale([0.5,0.6,0.7]) earBrace(); + translate([5,-1.5*0,.1]) { + mobileSupport(); + mirror([0,1,0]) mobileSupport(); + } + } +} +translate([-8.5, -20,-.1]) cube([17,60,1.3]); // extra clearance for extrusion rail +translate([ 19 ,-7.5,-.2]) cube([ 5,15,1.4]); +//translate([ 8.5, -6,-.2]) #cube([ 5,12,1]); +}