From 6d6235d35f578edf93ba45f4100035b6917d9b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Mon, 26 Feb 2024 18:03:46 +0100 Subject: [PATCH] improvements --- .gitignore | 1 + README.md | 39 +++---- assets/generated/AntiStudInsert.png | Bin 0 -> 607 bytes assets/generated/C15.png | Bin 0 -> 710 bytes assets/generated/C7.png | Bin 0 -> 863 bytes assets/generated/Classic Full Curve.png | Bin 0 -> 476 bytes assets/generated/Classic Full Straight.png | Bin 0 -> 396 bytes assets/generated/Classic Half Curve.png | Bin 0 -> 651 bytes assets/generated/Classic Half Straight.png | Bin 0 -> 486 bytes assets/generated/Classic Quarter Straight.png | Bin 0 -> 664 bytes assets/generated/S10.png | Bin 0 -> 596 bytes assets/generated/S25.png | Bin 0 -> 391 bytes assets/generated/S4.png | Bin 0 -> 773 bytes assets/generated/S5.png | Bin 0 -> 761 bytes assets/generated/StudInsert.png | Bin 0 -> 644 bytes r25.svg => assets/r25.svg | 0 build.sh | 10 ++ track.json | 98 ++++++++++++++---- track.scad | 91 +++++++++++----- 19 files changed, 173 insertions(+), 66 deletions(-) create mode 100644 assets/generated/AntiStudInsert.png create mode 100644 assets/generated/C15.png create mode 100644 assets/generated/C7.png create mode 100644 assets/generated/Classic Full Curve.png create mode 100644 assets/generated/Classic Full Straight.png create mode 100644 assets/generated/Classic Half Curve.png create mode 100644 assets/generated/Classic Half Straight.png create mode 100644 assets/generated/Classic Quarter Straight.png create mode 100644 assets/generated/S10.png create mode 100644 assets/generated/S25.png create mode 100644 assets/generated/S4.png create mode 100644 assets/generated/S5.png create mode 100644 assets/generated/StudInsert.png rename r25.svg => assets/r25.svg (100%) create mode 100755 build.sh diff --git a/.gitignore b/.gitignore index 1567411..68a6176 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.stl +/build/ diff --git a/README.md b/README.md index 4cda96f..08871a4 100644 --- a/README.md +++ b/README.md @@ -8,18 +8,21 @@ but these are the original tracks you can replicate As an overview, or why it's worth a try: They print rapidly on modern printers, and cost barely anything. -| Name | Material Cost | Print Time | -| --------------------- | ------------- | ---------- | -| C15 | ~10ct | 45m | -| C7 | ~5ct | 15m | -| S25 | ~12ct | 1h | -| S10 | ~5ct | 15m | -| S5 | ~5ct | 15m | -| Classic R28 90° Curve | ~25ct | 2h | -| Classic R28 45° Curve | ~12ct | 1h | -| Classic L32 Straight | ~20ct | 1.5h | -| Classic L16 Straight | ~10ct | 45m | -| Classic L8 Straight | ~5ct | 15m | +| Preset | Cost | Time | Image | +| ----------------------------- | ----- | ---- | -------------------------------------------------------------------------------- | +| C15 | ~10ct | 45m | ![C15](./assets/generated/C15.png) | +| C7 | ~5ct | 15m | ![C7](./assets/generated/C7.png) | +| S25 | ~12ct | 1h | ![S25](./assets/generated/S25.png) | +| S10 | ~5ct | 15m | ![S10](./assets/generated/S10.png) | +| S5 | ~5ct | 15m | ![S5](./assets/generated/S5.png) | +| S4 | ~5ct | 15m | ![S4](./assets/generated/S4.png) | +| Classic Full Curve (R28 90°) | ~25ct | 2h | ![Classic Full Curve](./assets/generated/Classic%20Full%20Curve.png) | +| Classic Half Curve (R28 45°) | ~12ct | 1h | ![Classic Half Curve](./assets/generated/Classic%20Half%20Curve.png) | +| Classic Full Straight (L32) | ~20ct | 1.5h | ![Classic Full Straight](./assets/generated/Classic%20Full%20Straight.png) | +| Classic Half Straight (L16) | ~10ct | 45m | ![Classic Half Straight](./assets/generated/Classic%20Half%20Straight.png) | +| Classic Quarter Straight (L8) | ~5ct | 15m | ![Classic Quarter Straight](./assets/generated/Classic%20Quarter%20Straight.png) | + +You can also generate your own custom rails with any length, radius or angle. Todo: ramps, switches, train assembly @@ -62,7 +65,7 @@ How it fits - An s-curve with C15 moves over 20 studs, diagonals can be done with any length divisible by 5 - An s-curve with C7 moves two studs, but diagonals require a full S25 to land cleanly again. -![](./r25.svg) +![](./assets/r25.svg) ## Printing @@ -81,10 +84,10 @@ balance of speed and quality. A short rail will take about an hour to print. ### Filament -| Color | RAL Color | Pantone | PLA Supplier | ABS Supplier | -| ----------------- | ---------- | ------- | ------------ | ------------ | -| Light Bluish Gray | `RAL 7040` | | dasfilament | | -| Light Gray | `RAL 7005` | | | | +| Color | RAL | PLA Supplier | ABS Supplier | +| ----------------- | ---------- | ------------ | ------------ | +| Light Bluish Gray | `RAL 7040` | dasfilament | | +| Light Gray | `RAL 7005` | | | - None of these colors will be an exact match, just the texture of 3d printing it can make a huge difference, but usually fall close enough in the range. - The original rails will be in _Light Gray_, not _Light Bluish Gray_, but since I barely own any pre- 2004 color change bricks I chose to match my other bricks instead. @@ -100,6 +103,6 @@ _Notes for newcomers:_ In case you are new to 3D printing: -- Most filaments (including PLA) release toxic gases when _burned_ +- Most filaments (including PLA) can release toxic gases when _burned_ - FDM printing can cause fine particle emission - ABS when heated to normal printing temperatures can release styrene fumes diff --git a/assets/generated/AntiStudInsert.png b/assets/generated/AntiStudInsert.png new file mode 100644 index 0000000000000000000000000000000000000000..33f7ef5b430f2cb2ad625255e1ba081db1cba8e4 GIT binary patch literal 607 zcmV-l0-*hgP)?{OR2o{zicmWpPfCNh$ zF@+LDP>cspGC4W(v$NxD)?!{{k5?Yz@ZUEsX= zl1v)Yod{}yqwBcCaYIlVIMUvzhA`E1f}VHOmI=oVAqqeot-e|G*aMxjAhOA2d?SYN zQsjVd4-W8rrXl)l@6I7yqNQP3TAzdC&G`d6uRh5xHM4d@Lu!$wp?af6Z;)7~bxobq z1{XO#>%eh#CfR7-_JOd=VzkaIt?oR-G8u9N!rL#dUY?#mB@iz)!m4oaqVu3 z%P2teTHSn0g#j{+f>b32Zw;-UVu2h-fd<=y;lK7Gf4lQW)`h+gZH6Ro(PY|a45KumY{~Z-KnYBv4>Oeq?qU5%xVq{d;d{NJH8%GIgw2 t3Vc&z@=j>shVrITHb4Z5KoMx%`36NhNdmNE;_3hZ002ovPDHLkV1hOS3?u*m literal 0 HcmV?d00001 diff --git a/assets/generated/C15.png b/assets/generated/C15.png new file mode 100644 index 0000000000000000000000000000000000000000..28c39929130030f0d7894a13df2bc9ac35329316 GIT binary patch literal 710 zcmV;%0y+JOP)uO^i}mC-;?AlW4PESVyu$`RhZJ-7T|9#tOQERhP-1VO2NzBkQbp(e$-g^SyyE_V z(g zh}x!py);O14<)w8_cVH>Y>m8f@9{J_>niPiI%*&=_3RxuD}StR2tRyAYv6t$iS8P@ zLsW0h*+($usP#zmc+PSp-3aT_7Y3ijwHTB6{c{5Hh2Sg_S6lSgWpPVz#lEQdo&v zQl^zy5SUa%1_q{EPrXPlL3!O-ue)LwXFBVV!!*vEncW#%i}_fFGiPRJeth3|=1@G} z3l>t)!3G#017v^PVht0LW z|8p54P|E9AiUKq>{~016a5!pM69YINoIMtWW)#a8AV^VTuXe$t&@=@>*+-*-DAzzhv8h#R3M&RzE)PjdjwIZ3t8v&n$&odHTrxS$%eS7S zZQ=N|pnULB&Jwb?x@nl_6)4J}Beit>aZWV(qQkRm`>e+57=Ry}%ehO*@2Gh&3{(fH zhvsTvV9mKJ0~=PG6<<(0(_1=#6uW2RTJy(GQ{?pAZuUc94oSQSHKF!sFSjnrn?e0Dv<#--}P8D{k&k(Js zX>Fenp2Ec<7tL*B$OM0Q(k~4Vt+Gm6LQnXLarcz4oj-s5js}?*`w|m;-(|`4z-=KE zI7O4`HvcqY(72ZaGi#{oo*N!B4q4EARf8Mnrm|2%ll3Gl(d9L=}$rJfqT0wGwSnF1WqRfc` zwT`{o_3+tPN_OXcM;km%%X=4ChQzB3wh>Ct=1>>mZ@8K;OeV_X<(|G8hZ>+c6gF2x zBwUS&Vp8@;HnxoDq5?E}3Ltldoht6-yHc pvvArL1ZX~j4mQ958K8e2^b7QjPe*8OL4W`N002ovPDHLkV1k9tkTU=P literal 0 HcmV?d00001 diff --git a/assets/generated/Classic Full Curve.png b/assets/generated/Classic Full Curve.png new file mode 100644 index 0000000000000000000000000000000000000000..01f061f3c5524064de854d066eba817d90b832c6 GIT binary patch literal 476 zcmV<20VDp2P)uUYX(N;~WMN5)krfMBV@Z0SG_< z;tc>0fB*y_-hlYQ+22CBY|QLJ$*`TcM1%ygMC={CilR_!EKL7$>+~bW!uUX0A`WMU z@a?}e)fKT^Umc^=wBAS<=_Dl44-5D+OGrlp7T6wRWE(2~e&pKmY;|@A&}3Dx46d S)LnM~00004lPx2qbRa6}U4Lldiwfg$rTp2Emq-=>adWGyzU-R)jHD8Vl>NF2e<4#l6e_=qn z=I!~yL4yfG(V&6!+$fE6Q5}1?_TYg0gNzBnicVKvgR!p>HZu^pLrMd;mC%B0H3Km_ z)E~$Go8{giU4s&2v`}LO*$cEY$cPpDYY^KbtU^r}WS0&NqcH{P8vjXynIVYI-OVXo zdxS}b2HPxEiOHYfekhAn-!dZ2e$f5vZ9boD{Ya+~hR42nyo6_Vo>bMD$iC<_c5?_= q^~*o0#{IUZt2i`(K@4Kh(6s@8^S^Sseb(Lp0000F|90%~XkBu^lAp2u==oCRv6tslLymY8zM0Th^CUEPW%Et!>6CZq~QE44Py9NtIAS zP=Dw4A|+&)$K#orb;RKUuDgT)CNMO9VjSp0}ug@>+dHt=&@>YBuOcOnf#=eyq zXvRPO?g(yWgUSr-Y+Tdu(rF4SgGJpY?a$`~TfJhSIF$eYb?iE@SE^ohBJiSAK&}*a l8z4XeBtQb>Hb8)^)?e0I3=G@&?q2`^002ovPDHLkV1k&RHBbNm literal 0 HcmV?d00001 diff --git a/assets/generated/Classic Half Straight.png b/assets/generated/Classic Half Straight.png new file mode 100644 index 0000000000000000000000000000000000000000..62080a1173fc1eff9554c4fd9ddd45361983a616 GIT binary patch literal 486 zcmV@P)@1Fj?oCSU6c4}yp!_Mi zQX<#XSJN~z_s%zGzI)C|^JOvjIL-O>{h8@&x9?e*A}SgXKmim$0aP>~fJy=SzFXpd z@}d+O0?PXKgOiE)win+%Id82j4$J?lrIr27G*?jfOniL)j!vIhHz6yTuHnU!e>N{$ zn0;t6WYpAmCgmsnQ>U1%2r`7x95vsOyG5naFwc_78hxx}&02ER^9(7u0gckg5O_^? zka5C|#d6Y6j=g8=c!BVZ?3$h|Af=IEp=cm7Xn4e)jSO8(QY_~Tb-Jpkisc5vkCl%G z3o>f>w+UOv0o18dtIH$CL)kMdpuMdb`KK5w{Y3UJ7KHsS(=)`st)z!aW6zNB4AhH7 zrLll8Co)y*h=?<5YH4MD@bT&8r#co>rKcOHe(-wzH9kA=ES@aP4aqNX4J-&XZdV6S zhFJ459Ui|mE^Y}a5cVl!+VJy8HmYo*L9W4qbQx{m$Pqcco$TJgqDLC$nxPybDjE<# c0rc-de+;YZk>O9&UW4`lpT5Ar(D`bB+Ky&U?zIwUfm~R_p1!=&x z^6DzcO>?)KQ~Fx1Rul}xq`~sIGlkN>wK!fjnuRzxvB8tA%xL7N^DrynirL z`_VYc%2OUYn1v>brNKr9Xs}4kQ)IE)xQ!e%;x&4G;c0U@T zN;n#Cg_fUK!c0%=oAwO$@)vy#KfM1u2U=%ke{i4>NC&zV}}(#c@{JXz3BbHzs-l5V1>SprlmtUST?$6V(T0~k{y2ff3^N5 ziaa240uETMFVYyN42c>Fl9kfC`h#W_9cljl`whsAH%Jr^XKKXuszq^oO)X-0o(rbVKC;$q8 z0-#<41VC=3%H6JAoi_)+#!u)md)88 zeAcA@up0kI|2!%+#2YGdUBNUt zRZL?^ibzjgbOeYQ7LuWmVbmmgW40C39&DSVJzg9VA1XW=xD<&=VS9Kqj@?e=A~LZz z_9nN`K=N|okeEhb0NfiFK#tzvZ=OA-fcAiZAT;9Afzvnx`SHeWSRkNGmV45h&l4x* z)*fe|(jLvCreB>$lbHLvfB59n9xf2C?U^*WR&;r$S~z|6 zPvZ<^=d&LKTDg+G{TLhho!YG+-xA&SYnySL8gq$Y;jr|?|9s)ar!gQPT6t(vC>yMZ_1)U@W@CUgzWCRfg)=9ppL_mMS~!>y`7A%6-*=19t4k!DeRV%LY4;9 i2`Rk>2!H}0+4=%89Rp8XxHusI0000^76mU6z?GtSXe&(_h+-$_kU(eV`~Exq#y+;s5U@BlLM`OFD3zUj^Xd_;XlhH z^4iCO_s{uF_gyEU+#Sh+e2q(m&WZ7WLB7US=lb#>mTetahk|T;O?o`AghsN-(tua? z@wIUOUmlOy8VrcyxjNr3|2B(V7M*$Vn8H${ii}AJSY!Yw&`^=fhqE%$xN8*@xiB71 zLV*TS_N&MVYcG1ChNP`09%w`vZg__y_Ez2zzxDVGjdQ z%M?X7QIV<-;!xQT!E-oQ+R}5bwzd9hW)_>fTynk9%I?cJu1PNW?ECvB@s-OuY9uN3 z2JnD9AP>j`syDzU1e&^jwDA5k{5kvF`CUdY88|r2HnP1N2xPkO?T5LuCtB&2OQT=l zIeznv_{^#_i#}K|O5($h_lBjWmj>d{(Dq<&s_Yc0omzXP_!=H)lOj`Ur-A6Ojkr>= ztGleGvf7DaKwr;rXsUvY{?^NihG;U8bqG|*6s@}0ZDqO)s|n+PX}jWLZs;J>(J`fI znoVj$+u~!rRb8sZ)JEK9;3t9f8|6Jp^ z&>`zhWoMyEmSYpC-8%!(BVp0Y^~3Abj;;{A4DSDqP|)-nK%bk>iyL`)D%2NDYQx)6 z{ulgYca}NOy(h-0V=bQ-vKWYXMqHtP64{S27RizXSRW6}d>#%qFty00000NkvXXu0mjf D(8p~z literal 0 HcmV?d00001 diff --git a/assets/generated/S5.png b/assets/generated/S5.png new file mode 100644 index 0000000000000000000000000000000000000000..b07db27474f8da84acafa978bfeea9abaaa18fc0 GIT binary patch literal 761 zcmV+CN4V^b!?>-b6$xs6~oZyojJdp@-foQtyHY-n@9pMFI+~r4U3E zP3lFgB8bLQLA11r;#x%8y0nThP1k1z*QE3B?PRe5_oEEU8fjQ>s3bH)3tN*XTZ!4D1Elok$bmKNX6oWbQT^Flk%q_llC?OTndKHJrYto$ z18e{3R)P>_&O5`?u#P@j5EZB+L(-5xjV!STTIXn2bH}!DYG_6i=y{=?yU(@`wMRlj z%8eCm4~|d#$Ub}}YHDd@X3zD$CGIDct%Eso92KpSyg&$4n&@7#30`t<@DfJGr4c2C zm*_l{0l}z?j$?MnF=4@|(rKkMqVC}XNe&*C2GhunC6q}igZ(wVX+s$npimmQH*hEu zm#S*&d+EKfem1}NrX%pMY{ZxU_; zGJB-etacsTlswTAjfcjbeRDSD4a9Hijy)Te?Eup|^Czi3wUuGPoi#UIoGZVG7YC>% z-YBZ3ZtX}kz@Owx=?w}GH%G19*ze{WxRl4(LzI`RL{60KWd}ECye;_Y%VMO_a5yNF zYlrA-H!kO3&Aw?ul2N#GcmCFQ?QfQ295N>|f*UBVj2dYOZ+x_A ryaB?GG)5jo=B>PO$OrO)>PWu;79ld%7Tk<)00000NkvXXu0mjfe7ar+ literal 0 HcmV?d00001 diff --git a/assets/generated/StudInsert.png b/assets/generated/StudInsert.png new file mode 100644 index 0000000000000000000000000000000000000000..0e238b20a5908ba51c2b5ce811521918bad3999c GIT binary patch literal 644 zcmV-~0(?{PEpdbh-1HnepNG$9mg;t;>lNG^MO!wn2`GdI5{$#UdzMJ^d;Kl|p*_vO;`C&-e#bpvdGHb5Jo zRjc53yY27S$bXO2-{|h(W-wA5tklUI07+@IurimS!wB^G>sGdapx%C*iWhXB{OJ$= z!n8>PXM64O1D+4#$ux;4JJG)+ij#1>2%}^+Ps=Csm`OeKUJTmcm-_NbCIvzg@(T8F{KlNq52KJ)k-XZFOKv!5G zsI%1q`~x7M)+kD;Iuy%+#3FUNvhTHOCc3B7wv-V8zuTr2*m$>DmMM!BUs# z$P9o!eEEOn;xXz=bj4Kc0pcSYeRI&7S~L=%%h%saTa(n_)fm}>r;hsgQ38TT7Wm%q z-9);}{fEC`pYwiIw+9G9O$G=z`Mp~ea?RBnKTw&UD&_H)ls#HBTp(VY+mC)naT1Of zVU!%Wz~-=!T+Si3K6UNkI)q0EoGU6Bf_iYfO1WY{BQIA>7BFv*^|X5qSe%hz+t21{ zG04Fh@7z7Z{>svr*`oo3MHT{C6i#RWuR72zQ!FF0%; /* [Print Settings] */ // Some feature are generated with respect to the layer height LayerHeight = 0.2; // [0.1,0.13,0.2] -// Enable built-in support for 3d printing -Support = true; +// Mid-print stud inserts allowing the studs to be printed facing up seperately +StudInserts = false; +// Mid-print slot inserts eliminating the need for supports +AntiStudInserts = false; +// Part to generate +Type = "rail"; // [rail,studs,antistuds] + /* [Model Settings] */ Length = 8; // [4:1:56] // Useful when working with Pythagorean Triples UseLengthForCurveAngle = true; -Radius = 28; // [4:1:36] +Radius = 25; // [4:1:36] // The angle the track takes Angle = 0.0; @@ -59,6 +64,35 @@ module tooth() { ]); } +module antiStudInsert(carve=true, depth=$studHeight * 2, supportHeight=$LDU * 4, supportWidth=$LDU * 4) { + difference() { + union() { + cube([$tile * 2, $tile, depth + supportHeight], anchor=FRONT+BOTTOM); + translate([0, $tile, 0]) cube([$tile * 2 + supportWidth, supportWidth, depth + supportHeight], anchor=FRONT+BOTTOM); + translate([0, $tile / 2, 0]) cube([$tile * 2 + supportWidth, supportWidth, depth + supportHeight], anchor=FRONT+BOTTOM); + } + + if (carve) { + mirror_copy([1, 0, 0]) + translate([$tile / 2, $tile / 2, 0]) group() { + cube([$stud, $stud, depth], anchor=BOTTOM+CENTER); + mirror_copy([0, 1, 0]) + mirror_copy([1, 0, 0]) + translate([$LDU * 2, $LDU * 2, 0]) + cube([$stud / 2, $stud / 2, depth], anchor=BOTTOM+FRONT+LEFT); + } + } + } +} + +module studInsert(supportThickness = $LDU * 4) { + mirror_copy([0, 1, 0]) translate([0, $tile / 2, 0]) group() { + cube([supportThickness, $stud, $stud], anchor=RIGHT); + cyl(l=$studHeight, d=$stud, $fn=48, anchor=TOP, orient=LEFT); + } + translate([-supportThickness, 0, 0]) cube([supportThickness, $tile + $stud + $LDU, $stud], anchor=RIGHT); +} + module brickSlot(w=1, l=1, h=3) { cube([$tile * w, $tile * l, $plate * h], anchor=TOP); mirror_copy([1, 0, 0]) @@ -74,26 +108,20 @@ module endCapStraight(includeRail=true) { difference() { union() { cube([$width, $tile * 2, $tile], anchor=CENTER); - mirror_copy([0, 1, 0]) - translate([0, $tile / 2, 0]) - cyl(l=$width + $studHeight * 2 + $LDU / 2, d=$stud, orient=LEFT, $fn=24); + if (!StudInserts) { + mirror_copy([1, 0, 0]) translate([$width / 2, 0, 0]) studInsert(); + } // End Slot translate([$tile + $LDU, -$tile, 0]) cube([6 * $LDU, $LDU, $tile], anchor=LEFT+BACK); - - if (Support) { - mirror_copy([1, 0, 0]) difference() { - translate([$tile * 2 - $studHeight, 0, -$tile / 2]) cube([$LDU * 3, $tile * 2 - $LDU - 2, $LDU * 6], anchor=BOTTOM+RIGHT); - mirror_copy([0, 1, 0]) - translate([0, $tile / 2, 0]) - cyl(l=$width + $studHeight * 2 + $LDU / 2, d=$stud + LayerHeight * 2, orient=LEFT, $fn=24); - } - } } - // Brick slots - mirror_copy([1, 0, 0]) - translate([$tile / 2, -$tile / 2, $tile / 2 - $plate * 2]) - brickSlot(); + + if (StudInserts) { + mirror_copy([1, 0, 0]) translate([$width / 2, 0, 0]) studInsert(); + } + + translate([0, -$tile, $tile / 2 - $plate * 2]) cube([$tile * 2, $tile, $plate], anchor=FRONT+TOP); + translate([0, -$tile, $tile / 2 - $plate * 2]) antiStudInsert(carve=false); // Fingernail slot mirror_copy([1, 0, 0]) @@ -113,11 +141,8 @@ module endCapStraight(includeRail=true) { cyl(d=$fillet, h=$tile, $fn=12); } - if (Support) { - translate([0, -$tile, -$tile / 2]) - rect_tube(size=[$tile * 2 - $LDU * 2, $tile - $LDU * 2], h=$LDU * 4 - LayerHeight, wall=$LDU * 2, anchor=FRONT+BOTTOM); - translate([0, -$tile, -$tile / 2]) - cube([$LDU * 2, $tile - $LDU * 2, $LDU * 4 - LayerHeight], anchor=FRONT+BOTTOM); + if (!AntiStudInserts) { + translate([0, -$tile, $tile / 2 - $plate * 2]) antiStudInsert(); } if (includeRail) { @@ -137,6 +162,9 @@ module monorailCurve(r=28, sa, ea, p1) { angle = [180 - ea, 180 + sa]; points = arc($n_teeth, r=(r * $tile), angle=angle); + echo(points[0] / $tile); + echo(points[len(points) - 1] / $tile); + translate([r * $tile, 0, 0]) union() { translate(points[0]) rot(180 - ea) back($tile) endCapStraight(includeRail=false); translate(points[len(points) - 1]) rot(sa) back($tile) endCapStraight(includeRail=false); @@ -176,10 +204,17 @@ module monorailStraight(l) { } } -if (Angle == 0) - monorailStraight(l=Length); -else - monorailCurve(Radius, sa=0, ea=UseLengthForCurveAngle ? asin(Length / Radius) : Angle); +if (Type == "rail") { + if (Angle == 0) + monorailStraight(l=Length); + else + monorailCurve(Radius, sa=0, ea=UseLengthForCurveAngle ? asin(Length / Radius) : Angle); +} else if (Type == "studs") { + rotate([0, -90, 0]) studInsert(); +} else if (Type == "antistuds") { + rotate([180, 0, 180]) antiStudInsert(); +} + // endCapStraight(); // translate([28.75, -232, -5.75]) rotate([0, 0, 90]) import("straight.stl");