X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=reprap-play.git;a=blobdiff_plain;f=filamentspool.scad;h=728ba69d23318f8b9ccb0cb48db5601c87b928bc;hp=f89befa21a08451b023e6100c33ce89d4d786cb7;hb=10c578bf7a31fd28a44056ad0b34c3cc8dc278ef;hpb=637ffed8123e7bce9c209e494588a9fe94375d85 diff --git a/filamentspool.scad b/filamentspool.scad index f89befa..728ba69 100644 --- a/filamentspool.scad +++ b/filamentspool.scad @@ -1,37 +1,184 @@ // -*- C -*- -fdia=2.85; +// filamentspool.scad +// 3D design for filament spools to hold coils as supplied by Faberdashery +// + +// +// Copyright 2012,2013,2016 Ian Jackson +// +// This work is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This work is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this work. If not, see +// + +// +// Each spool is a hub with 3 or 4 arms. Each arm has a cup for +// holding the filament. The effective diameter can be adjusted by +// setting the cup into a different seat in the arm. The cups are +// held on with simple clips, so the filement coil can easily be +// removed and replaced. +// +// This file (and its includes) can generate: +// +// ===== Heavy duty 4-armed spool for 3mm x 100m coil ===== +// +// A heavy duty 4-armed spool suitable for holding a 100m +// Faberdashery coil on the spool arm of a Lulzbot TAZ-5. +// +// Set +// fdia=2.85 +// lightduty=false +// And print following parts +// Hub +// ArmEnd x 4 +// FilamentCup x 4 (or FilamentCupPair x 2) +// CupSecuringClip x 4 +// +// You will also need 4 x M4 machine screws and nuts. +// +// ===== Light duty 3-armed spool for 3mm x <=30m coil ===== +// +// A light duty 3-armed spool suitable for up to around 30m +// of Faberdashery 2.85mm PLA. +// +// Set +// fdia=2.85 +// lightduty=true +// And print following parts +// Hub +// ArmEnd x 3 +// FilamentCup x 3 (or FilamentCup + FilamentCupPair) +// CupSecuringClip x 3 +// TowerDoveClipPin x 6 +// +// When assembling, insert one TowerDoveClipPin from each side, +// joining each ArmEnd to the Hub with two TowerDoveClipPins. +// Modest force with pliers is good to seat them properly. +// +// (note that the light duty and heavy duty CupSecuringClips +// are slightly different) +// +// ===== Notes regarding both the above spools ===== +// +// When mounting either spool on the TAZ-5 spool arm, put the `pointy' +// end of the hub towards the printer - ie, put put the spool on +// `backwards'. This ensures that the spool's arms will clear the +// printer framework. +// +// For the above, I generally used the Cura `Standard' PLA profile. +// +// ===== TAZ-5 feed tube adjustment kit ===== +// +// With a TAZ-5 I recommend using this kit to improve the feed +// reliability: +// +// Set +// fdia=2.85 +// And print following parts +// FilamentGuideSpacer (ideally, at `high detail') +// FilamentGuideArmPrint (optional; `high detail' or `standard') +// +// And possibly also +// t-nut_jig_0.2.stl +// from Aleph Objects - look here: +// http://download.lulzbot.com/TAZ/accessories/tool_heads/version_2/Dual_Extruder_v2/production_parts/stl/ +// +// The spacer clips onto the filament guide tube holder arm, on the +// inside, with the pointy flanged end towards the filament guide +// tube. It stops the filament guide tube angle (and so the +// filament's natural pickup location) changing as the print head moves. +// +// The FilamentGuideArm[Print] is a replacement for the arm supplied +// with your TAZ-5. It's longer, so that the filament pickup point is +// closer to the middle of the coil. Use the t-nut_jig to stop the +// T-nuts in the aluminium channel from annoyingly sliding down to the +// bottom while you swap out the arm. +// +// (Faberdashery coils, and therefore both the above spools, have a +// larger diameter than the flat-walled spools often supplied by other +// vendors. And the spools above have individual arms rather than a +// continuous disc. If the filament `unhooks' from the arm, it can +// pull taught around the hub and stop feeding properly.) +// +// ===== Spool storage arm, for mounting on walls ===== +// +// A storage arm suitable for screwing to walls, bookshelves, +// etc. (requires non-countersunk M4 screws); will hold two heavy duty +// spools each with a 100m coil. +// +// Set +// fdia=2.85 +// lightduty=false +// And print one of these, according to taste +// StorageArmLeft +// StorageArmRight +// +// NB that the `light duty' version of this is shorter and +// will only take two `light duty' spools. +// +// For the above, I used the Cura `High detail' PLA profile because +// I wanted it pretty, but the `Standard' profile should do fine. +// +// ===== Spools for 1.75mm filament ===== +// +// Spool (in many parts) for handing 1.75mm filament, printable +// on, and with parts for mounting on, a Reprappro Huxley. + + +fdia=2.85; // or 1.75 +lightduty=false; // or true + slop=0.5; bigslop=slop*2; +function selsz(sm,lt,lg) = fdia < 2 ? sm : lightduty ? lt : lg; +function usedove() = selsz(true,true,false); + +num_arms = selsz(3,3,4); + +channelslop=selsz(slop,0.75,slop); + exteffrad = 70; -hubeffrad = 30; -hubbigrad = 20; -hublwidth = 3; +hubeffrad = selsz(30, 82, 40); +hubbigrad = selsz(20, 38, 38); +hublwidth = selsz(3, 2.5, 4); hubstemwidth = 2; hublthick = 10; -hubaxlelen = 25; -hubaxlerad = 5; +hubaxlerad = selsz(5, 28/2, 28/2); totalheightfromtower = 240; axletowerfudgebend = 0; axleaxlefudgebend = 3; axlepadlen = 1.0; -function selsz(sm,lg) = fdia < 2 ? sm : lg; +armend_length = 120; -prongthick=selsz(5,7); -prongwidth=selsz(5,7); +prongthick=selsz(5,4,5); +prongwidth=selsz(5,4,5); +prongribwidth=3; +prongribheight=selsz(0,0,4); ratchetstep=15; ratchettooth=3; ratchettoothheight=5; ratchettoothsmoothr=1; ratchettoothslope=0.75; overlap=0.5; -cupwidth=selsz(40,60); -cupheight=selsz(55,75); +cupwidth=selsz(40,25,50); +cupheight=selsz(55,25,55); + +cupstrong_dx=selsz(0,0,-10); -propxshift = 0; +propxshift = -6; doveclipheight = 10; @@ -40,22 +187,25 @@ teethgapx=4+fdia; prongstalkxwidth=3; -stalklength=selsz(35,55); +stalklength=selsz(35,25,55); overclipcupgap=5; overclipdepth=15; overcliproundr=2.0; -overclipthick=0.5; -overclipcupnextgap=20; +overclipthick=1.0; +overclipcupnextgap=selsz(20,15,20); + +hubaxlelen = selsz(25, 62.5, 77.5); +echo(hubaxlelen); overclipsmaller=-2.5; overclipbigger=0.0; -wingspoke=3; +wingspoke=2.5; wingsize=6; wingthick=3; -armendwallthick=2.5; -armendbasethick=1.2; +armendwallthick=selsz(2.5, 1.8, 2.5); +armendbasethick=selsz(1.2, 1.2, 1.2); axlehorizoffset = 12.5; axlevertheight = 100; @@ -75,21 +225,44 @@ frictionwasherextrapush = 1.0; ratchetpawl=ratchetstep-ratchettooth-bigslop*2; +nondove_armhole_x = 32; +nondove_armhole_hole = 4 + 0.8; +nondove_armhole_support = 7; +nondove_armhole_wall = 3.2; +nondove_armhole_slop = 0.5; +nondove_armhole_slop_x = 0.5; + +nondove_armbase = nondove_armhole_x + nondove_armhole_hole/2 + + nondove_armhole_support; +echo(nondove_armbase); + include include include include -channelwidth = prongthick + slop; +channelwidth = prongthick + channelslop; channeldepth = prongwidth + ratchettoothheight; totalwidth = armendwallthick*2 + channelwidth; totalheight = channeldepth + armendbasethick; stalkwidth = prongwidth + prongstalkxwidth; -module ArmEnd(length=120){ ////toplevel - translate([ratchettoothsmoothr, channelwidth/2, -armendbasethick]) { - rotate([0,0,-90]) - DoveClipPairBase(h=doveclipheight); +module ArmEnd(length=armend_length){ ////toplevel + if (usedove()) { + translate([ratchettoothsmoothr, channelwidth/2, -armendbasethick]) { + rotate([0,0,-90]) + DoveClipPairBase(h=doveclipheight); + } + } else { + difference(){ + translate([1, -armendwallthick, -armendbasethick]) + mirror([1,0,0]) + cube([nondove_armbase+1, totalwidth, totalheight]); + translate([-nondove_armbase + nondove_armhole_x, + -armendwallthick + totalwidth/2, + -armendbasethick -1]) + cylinder(r= nondove_armhole_hole/2, h=totalheight+2, $fn=10); + } } difference(){ @@ -137,7 +310,7 @@ module FilamentCupHandle(){ module FilamentCupCup(){ for (my=[0,1]) mirror([0,my,0]) { - translate([0,cupwidth/2,0]) + translate([0, cupwidth/2, 0]) cube([cupheight + prongwidth, prongwidth, prongthick]); } } @@ -147,11 +320,31 @@ module FilamentCup() { ////toplevel gapy = prongwidth; dy = cupwidth/2 + gapy + overclipcupgap; + baselen = dy+cupwidth/2; translate([0, dy, 0]) FilamentCupCup(); - translate([0, -1, 0]); - cube([prongwidth, dy+1+cupwidth/2, prongthick]); + cube([prongwidth, baselen+1, prongthick]); + + translate([cupstrong_dx, prongwidth, 0]) { + cube([prongwidth, baselen-prongwidth, prongthick]); + for (y = [0, .33, .67, 1]) + translate([0, (baselen - prongwidth) * y, 0]) + cube([-cupstrong_dx + 1, prongwidth, prongthick]); + } + if (cupstrong_dx != 0) { + rotate([0,0,45]) + translate([-prongwidth*.55, -prongwidth*2.1, 0]) + cube([prongwidth*(2.65), prongwidth*4.2, prongthick]); + } + + translate([0, -0.2, 0]) + cube([prongribwidth, baselen, prongthick + prongribheight]); + + if (prongribheight > 0) { + translate([-prongwidth, baselen, 0]) + cube([cupheight/2, prongwidth + prongribheight, prongribwidth]); + } midrad = cupwidth/2 + prongwidth/2; @@ -166,12 +359,12 @@ module FilamentCup() { ////toplevel prongthick]); } for (y = [overclipcupgap, overclipcupgap+overclipcupnextgap]) { - translate([0, y, 0]) + translate([cupstrong_dx, y + prongwidth, 0]) rotate([0,0, 102 + fdia]) FilamentTeeth(fdia=fdia, h=teethh); } for (x = [-0.3, -1.3]) { - translate([cupheight + overclipcupnextgap*x, dy+cupwidth/2 + prongthick, 0]) + translate([cupheight + overclipcupnextgap*x, baselen + prongwidth, 0]) rotate([0,0, 12 + fdia]) FilamentTeeth(fdia=fdia, h=teethh); } @@ -201,6 +394,8 @@ module CupSecuringClip(){ ////toplevel CupSecuringClipSolidSmooth(xrad=overclipthick, xdepth=0); translate([-wingswidth/2, -wingsize/2, 0]) cube([wingswidth, wingsize, wingthick]); + translate([-wingsize/2, -wingswidth/2, 0]) + cube([wingsize, wingswidth, wingthick]); } translate([0,0,-0.1]) CupSecuringClipSolidSmooth(xrad=0, xdepth=0.2); @@ -216,40 +411,64 @@ module TowerDoveClipPin(){ ////toplevel } module Hub(){ ////toplevel - difference(){ - cylinder($fn=60, h=hublthick, r=hubbigrad); - translate([0,0,-1]) - cylinder($fn=30, h=hublthick+2, r=(hubbigrad-hublwidth)); - } axlerad = hubaxlerad + slop; - difference(){ - cylinder(h=hubaxlelen, r=axlerad+hublwidth); - translate([0,0,-1]) cylinder($fn=60, h=hubaxlelen+2, r=axlerad); - } + xmin = axlerad+hublwidth/2; + xmax = hubbigrad-hublwidth/2; hole = hubeffrad - hubbigrad - DoveClip_depth() - hublwidth*2; holewidth = DoveClipPairSane_width() - hubstemwidth*2; - for (ang=[0,120,240]) - rotate([0,0,ang]) { - difference() { - translate([hubeffrad,0,0]) - DoveClipPairSane(h=doveclipheight, - baseextend = (hubeffrad - DoveClip_depth() - - hubbigrad + hublwidth)); - if (hole>hublwidth && holewidth > 2) { - translate([hubbigrad + hublwidth, -holewidth/2, -1]) - cube([hole, holewidth, hublthick+2]); - } + nondove_allwidth = nondove_armhole_wall*2 + totalwidth; + difference(){ + union(){ + difference(){ + cylinder($fn=60, h=hublthick, r=hubbigrad); + translate([0,0,-1]) + cylinder($fn=30, h=hublthick+2, r=(hubbigrad-hublwidth)); } + cylinder(h=hubaxlelen, r=axlerad+hublwidth); + for (ang=[0 : 360/num_arms : 359]) + rotate([0,0,ang]) { + if (usedove()){ + difference() { + translate([hubeffrad,0,0]) + DoveClipPairSane(h=doveclipheight, + baseextend = (hubeffrad - DoveClip_depth() + - hubbigrad + hublwidth)); + if (hole>hublwidth && holewidth > 2) { + translate([hubbigrad + hublwidth, -holewidth/2, -1]) + cube([hole, holewidth, hublthick+2]); + } + } + } else { + difference(){ + translate([0, + -nondove_allwidth/2, + 0]) + cube([hubeffrad + nondove_armhole_x + + nondove_armhole_hole/2 + nondove_armhole_support, + nondove_allwidth, + nondove_armhole_wall + totalheight]); + translate([hubeffrad - nondove_armhole_slop_x, + -nondove_allwidth/2 + + nondove_armhole_wall - nondove_armhole_slop, + nondove_armhole_wall]) + cube([nondove_armhole_x + 50, + totalwidth + nondove_armhole_slop*2, + totalheight + 1]); + translate([hubeffrad + nondove_armhole_x, 0, -20]) + cylinder(r= nondove_armhole_hole/2, h=50, $fn=10); + } + } + } + for (ang = [0 : 180/num_arms : 359]) + rotate([0,0,ang]) rotate([90,0,0]) { + translate([0,0,-hublwidth/2]) + linear_extrude(height=hublwidth) + polygon([[xmin,0.05], [xmax,0.05], + [xmax,hublthick-0.2], [xmin, hubaxlelen-0.2]]); + } } - xmin = axlerad+hublwidth/2; - xmax = hubbigrad-hublwidth/2; - for (ang = [0 : 60 : 359]) - rotate([0,0,ang]) rotate([90,0,0]) { - translate([0,0,-hublwidth/2]) - linear_extrude(height=hublwidth) - polygon([[xmin,0.05], [xmax,0.05], - [xmax,hublthick-0.2], [xmin, hubaxlelen-0.2]]); - } + translate([0,0,-1]) cylinder($fn=60, h=hubaxlelen+2, r=axlerad); + } } module ArmExtender(){ ////toplevel @@ -368,13 +587,335 @@ module FilamentCupPair(){ ////toplevel rotate([0,0,180]) FilamentCup(); } +//----- storarm ----- + +storarm_hooklen = 8; +storarm_hookheight = 5; +storarm_thick = 10; +storarm_axleslop = 4; + +storarm_base_w = 30; +storarm_base_h = 100; +storarm_base_d = 15; +storarm_base_mind = 2; + +storarm_cope_hubaxle_mk1 = true; + +storarm_screw_hole = 4; +storarm_screw_hole_slop = 0.5; +storarm_besides_hole = 4; + +storarm_under_hole = 5; +storarm_screw_hole_head = 8.8; +storarm_screw_hole_head_slop = 1.5; + +// calculated + +storarm_axlerad = hubaxlerad - storarm_axleslop; +storarm_mainlen = hubaxlelen*2 + storarm_axleslop + + (storarm_cope_hubaxle_mk1 ? 10 : 0); +storarm_totlen = storarm_mainlen + storarm_hooklen; + +storarm_mid_off_y = storarm_axlerad; + +storarm_base_off_y = storarm_mid_off_y + storarm_base_h/2; + +module StorageArmDiagPartSide(xmin, xmax){ + xsz = xmax-xmin; + yuse = storarm_thick/2; + + intersection(){ + translate([xmin-1, -storarm_axlerad, storarm_thick/2]) + rotate([0,90,0]) + cylinder(r=storarm_axlerad, h=xsz+2, $fn=60); + translate([xmin, -yuse, 0]) + cube([xsz, yuse, storarm_thick]); + } +} + +module StorageArmDiagPart(xmin, xmax, shear, adjbot){ + hull(){ + StorageArmDiagPartSide(xmin,xmax); + + multmatrix([[1,0,0,0], + [shear,1,0,0], + [0,0,1,0], + [0,0,0,1]]) + translate([0, -storarm_axlerad*2 + adjbot, 0]) + mirror([0,1,0]) + StorageArmDiagPartSide(xmin,xmax); + } +} + +module StorageArmBaseTemplate(){ + square([storarm_base_w, storarm_base_h]); +} + +module StorageArmAtMountingHoles(){ + bes = storarm_besides_hole + storarm_screw_hole; + + x0 = bes; + x1 = storarm_base_w-bes; + y1 = storarm_base_h - bes; + y0 = bes; + + for (pos=[ [x0, y1], + [x1, y1], + [x1, y0] ]) { + rotate([0,90,0]) + translate([pos[0] - storarm_base_w, + pos[1] - storarm_base_off_y, -storarm_base_d]) + children(); + } +} + +module StorageArmRight(){ ////toplevel + shear = storarm_hookheight / (storarm_mainlen/2); + + StorageArmDiagPart(-1, storarm_mainlen/2+1, shear, 0); + StorageArmDiagPart(storarm_mainlen/2-1, storarm_mainlen+1, shear/2, + storarm_hookheight/2); + + translate([0, storarm_hookheight, 0]) + StorageArmDiagPart(storarm_mainlen, storarm_totlen, + shear/2, -storarm_hookheight/2); + + difference(){ + union(){ + hull(){ + translate([-storarm_base_d, -storarm_base_off_y, storarm_base_w]) + rotate([0,90,0]) + linear_extrude(height=storarm_base_mind) + StorageArmBaseTemplate(); + StorageArmDiagPart(-1, 0, shear, 0); + } + StorageArmAtMountingHoles(){ + cylinder(r= storarm_screw_hole_head/2, + h=10); + } + } + StorageArmAtMountingHoles(){ + translate([0,0,-1]) + cylinder(r= (storarm_screw_hole + storarm_screw_hole_slop)/2 , + h=20); + translate([0,0,storarm_under_hole]) + cylinder(r= (storarm_screw_hole_head + storarm_screw_hole_head_slop)/2, + h=20); + } + } +} + +module StorageArmLeft(){ ////toplevel + mirror([1,0,0]) StorageArmRight(); +} + +module StorArmHoleTest(){ ////toplevel + sz = storarm_screw_hole_head + storarm_besides_hole*2; + intersection(){ + StorageArmRight(); + translate([-50, -storarm_base_off_y, -1]) + cube([100, sz, sz+1]); + } +} + + +//----- filament guide spacer ----- + +guide_armdia = 15.0; +guide_armwidth = 10.2; +guide_armcorelen = 25.0; +guide_clipcirclethick = 10.0; + +guidefilclip_outerdia = 22.8; + +guidespacer_armslop = 0.75; +guidespacer_armlenslop = 1.05; + +guidespacer_prongprotrude = 4; +guidespacer_thick = 1.6; + +// calculated + +guidespacer_armdia = guide_armdia + guidespacer_armslop; +guidespacer_armwidth = guide_armwidth + guidespacer_armslop; +guidespacer_len = guide_armcorelen - guide_clipcirclethick + + guidespacer_armlenslop; + +guidespacer_wingheight = (guidefilclip_outerdia - guidespacer_armdia)/2; + +module FilamentGuideArmTemplate(extra=0){ + intersection(){ + circle(r= (guidespacer_armdia/2) + extra); + square(center=true, [guidespacer_armwidth+extra*2, + guidespacer_armdia + extra*2 + 10]); + } +} + +module FilamentGuideSpacerInnerTemplate(){ + FilamentGuideArmTemplate(); + translate([0, -guidespacer_armdia/2]) + square(center=true, [guidespacer_armwidth - guidespacer_prongprotrude, + guidespacer_armdia]); +} + +module FilamentGuideSpacer(){ ////toplevel + difference(){ + union(){ + linear_extrude(height= guidespacer_len) + FilamentGuideArmTemplate(extra= guidespacer_thick); + for (angle=[26, 60]) { + for (m=[0,1]) { + mirror([m,0,0]) { + rotate([0,0,angle]) { + hull(){ + for (t=[[0, guidespacer_wingheight], + [guidespacer_len-1, -guidespacer_wingheight]]) + translate([0,0, t[0] + 0.5]) + cube([guidespacer_thick, guidespacer_armdia + t[1]*2, + 1], + center=true); + } + } + } + } + } + } + translate([0,0,-1]) + linear_extrude(height= guidespacer_len+5) + FilamentGuideSpacerInnerTemplate(); + } +} + + +//----- replacement filament guide arm for TAZ-5 ----- + +guidearm_armslop = 0.25; +guidearm_armlenslop = 0.25; + +guidearm_hookprotr = 3; +guidearm_hookprotrflat = 1; +guidearm_hookslope = 0.3; + +guidearm_totallen = 60; + +guidearm_screwplatesz = 12; +guidearm_screwplateth = 4; +guidearm_screwplatewd = 15; +guidearm_screwhole = 5 + 0.5; + +guidearm_bendlen = 40; +guidearm_bendslot = 4.5; + +guidearm_stopthick = 4; +guidearm_protrslop = 1.0; + +// calculated + +guidearm_armdia = guide_armdia - guidearm_armslop; +guidearm_armwidth = guide_armwidth - guidearm_armslop; +guidearm_armcorelen = guide_armcorelen + guidearm_armlenslop; + +guidearm_base_z0 = -(guidearm_totallen - guidearm_armcorelen); + +guidearm_realbendlen = min(guidearm_bendlen, + guidearm_totallen - guidearm_screwplateth - 0.1); +guidearm_slopelen = guidearm_hookprotr/guidearm_hookslope; + +module FilamentGuideArmStop(h){ + for (ts=[-1,+1]) { + translate([ts * guidearm_hookprotr, 0,0]) + cylinder(r=guidearm_armdia/2, h, $fn=80); + } +} + +module FilamentGuideArmShaftPositive(){ + r = guidearm_armdia/2; + + translate([0,0, guidearm_base_z0+1]) + cylinder(r=r, h= guidearm_totallen, $fn=80); + translate([0,0, guidearm_armcorelen]){ + hull(){ + FilamentGuideArmStop(guidearm_hookprotrflat); + translate([0,0, guidearm_slopelen]) + cylinder(r=r, h=guidearm_hookprotrflat, $fn=80); + } + } + mirror([0,0,1]) + FilamentGuideArmStop(guidearm_stopthick); +} + +module FilamentGuideArmBase(){ + translate([0, + (guidearm_screwplatewd - guidearm_armwidth)/2, + guidearm_base_z0]){ + difference(){ + translate([0,0, guidearm_screwplateth/2]) + cube(center=true, + [guidearm_armdia + guidearm_screwplatesz*2, + guidearm_screwplatewd, + guidearm_screwplateth]); + for (ts=[-1,+1]) { + translate([ts * (guidearm_armdia/2 + guidearm_screwplatesz/2), + 0, + -20]) + cylinder(r= guidearm_screwhole/2, h=40, $fn=20); + } + } + } +} + +module FilamentGuideArm(){ ///toplevel + intersection(){ + difference(){ + FilamentGuideArmShaftPositive(); + translate([-guidearm_bendslot/2, + -50, + -guidearm_realbendlen + guidearm_armcorelen]) + cube([guidearm_bendslot, + 100, + guidearm_realbendlen + 100]); + hull(){ + for (zx=[ [ 0, guidearm_bendslot ], + [ guidearm_armcorelen + guidearm_slopelen, + guidearm_hookprotr*2 + guidearm_protrslop ] + ]) { + translate([-zx[1]/2, -50, zx[0]]) + cube([zx[1], 100, 1]); + } + } + } + cube(center=true, + [guidearm_armdia*2, + guidearm_armwidth, + guidearm_totallen*3]); + } + FilamentGuideArmBase(); +} + +module FilamentGuideArmPrint(){ ////toplevel + rotate([90,0,0]) + FilamentGuideArm(); +} + +module Demo(){ + translate([-hubeffrad-30,50,0]) Hub(); + ArmEnd(); + translate([0,50,0]) FilamentCup(); +} + //ArmEnd(); //FilamentCup(); //FilamentCupPair(); -CupSecuringClip(); +//CupSecuringClip(); //Hub(); //ArmExtender(); //Axle(); //AxleWasher(); //AxlePin(); //AxleFrictionWasher(); +//StorageArmLeft(); +//StorArmHoleTest(); +//FilamentGuideSpacer(); +//FilamentGuideArm(); +//FilamentGuideArmPrint(); +//Demo();