From 07ee3c1fbfb4eb21620d226d4ee688e6f4f6dee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Sat, 23 Mar 2024 11:58:50 +0100 Subject: [PATCH] feat: revert some stuff --- README.md | 131 ++++++++++++++---- assets/generated/AntiStudInsert.png | Bin 0 -> 588 bytes assets/generated/C15.png | Bin 0 -> 733 bytes assets/generated/C7.png | Bin 0 -> 846 bytes assets/generated/Classic Full Curve.png | Bin 0 -> 123 bytes assets/generated/Classic Full Straight.png | Bin 0 -> 384 bytes assets/generated/Classic Half Curve.png | Bin 0 -> 123 bytes assets/generated/Classic Half Straight.png | Bin 0 -> 493 bytes assets/generated/Classic Quarter Straight.png | Bin 0 -> 644 bytes assets/generated/S10.png | Bin 0 -> 569 bytes assets/generated/S25.png | Bin 0 -> 399 bytes assets/generated/S4.png | Bin 0 -> 700 bytes assets/generated/S5.png | Bin 0 -> 712 bytes assets/generated/StudInsert.png | Bin 0 -> 627 bytes assets/generated/Switch R25.png | Bin 0 -> 872 bytes track.scad | 16 ++- 16 files changed, 116 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 5ce6766..c59c1df 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,121 @@ -# create-svelte +# Brick Monorail -Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte). +Parametric Lego-compatible monorail tracks, designed specifically for 3d printing. +Two orders of magnitude cheaper than buying used. -## Creating a project +Since the parts are made parametric, you can have any length or curve radius you want, +but these are the original tracks you can replicate -If you're seeing this, you've probably already done this step. Congrats! +As an overview, or why it's worth a try: They print rapidly on modern printers, and cost barely anything. -```bash -# create a new project in the current directory -npm create svelte@latest +| 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) | -# create a new project in my-app -npm create svelte@latest my-app -``` +You can also generate your own custom rails with any length, radius or angle. -## Developing +Todo: ramps, switches, train assembly -Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: +## Design differences -```bash -npm run dev +Injection molding has vastly different requirements to 3d printing. +Due to this the original rails print absolutely horribly due to the copious amounts of supports needed. +Surfaces printed on supports just never look good. -# or start the server and open the app in a new browser tab -npm run dev -- --open -``` +Because of that, I decided to instead of having a support part on the bottom, I'd carve out space for +a 1x2 plate, which you can fit there for the same effect. -## Building +The monorail tracks are also solid now, which is not something you can do in injection molding but leaves +a really nice surface finish at the bottom of the rail for us. -To create a production version of your app: +For now, I also use non-baseplate aligned joints for curves. While this means you can't just snap the rails +on a baseplate, it enables you to use straight rails at non-90 degree angles which I think is an absolute +win over the original design since the 45 degree curves are useless outside of joining them with switches. -```bash -npm run build -``` +_These are 3d printing optimized, compatible rails, not replicas. Replicas print horribly due to support._ -You can preview the production build with `npm run preview`. +### Optional Differences -> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. +#### Operating on r25 instead of r28 + +What difference do these three studs make? +With this radius we can take advantage of the pythagorean triples `3/4/5` and `7/24/25` to stay on the stud +grid with turntables. + +- Curve C15 +- Curve C7 +- Straight S25 +- Straight S10 +- Straight S5 +- Straight S4 + +How it fits + +- Two C15 and one C7 make exactly a 90 degree turn, where every part stays on the stud grid. +- 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. + +![](./assets/r25.svg) + +## Printing + +To be compatible with standard bricks, the following print settings are strongly advised + +- Nozzle: **0.4**, this is equivalent to 1 LDU. +- Layer height: **0.2**, less than that is barely better and just causes more problems than it solves. + If you want to go lower, it's advisable to use heights that satisfy `0.4 % h == 0` such as 0.1. + - **Make sure your initial layer height is either 0.2 or 0.4!** +- Supports: **yes**, normal, don't use tree supports. +- Set your "Initial Layer Horizontal Expansion" to a value that works for you, for example -0.2mm to compensate for elephant's foot. + Alternatively, you can trim the extra plastic off by hand. + +My prints were done on a modified SecKit SK-Go2 running Klipper, with 10k acceleration and 150mm/s print speed for a good +balance of speed and quality. A short rail will take about an hour to print. + +### Inserts + +_This is optional and increases difficulty and print time, but I highly recommened it._ + +Studs and anti-studs print rather inconsistently at the orientation of the rail. +To combat that, I added the option to pre-print stud and anti-stud inserts at perfect orientation and insert them mid-print. +Because the layer is immediately covered up, the plastic will adhere like it would if it was printed in one go. + +This also allows you to pre-select the best inserts without having to print a full rail only to have one bad stud. + +- In Cura, insert a "Pause at layer" at the last layer where the insert spots are not covered yet. +- If you use Klipper, use "Search and replace" with `; LAYER:32` to `; LAYER:32\nPAUSE`. + +### Filament + +| 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. + +_Notes for newcomers:_ + +- Most bricks are injection molded from ABS, however I find PLA to be much more easy and safe to handle. +- PLA starts to deform at 60°C, so don't leave it in the sun or in your car. +- PLA is brittle. While ABS deforms with force applied to it, PLA will just snap. +- ABS is harder to print, an enclosure is a must, and warping can be difficult to handle. + +#### Printing Safety + +In case you are new to 3D printing: + +- 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 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..929334f3272c278a52012f92003a5cf1758feb53 100644 GIT binary patch literal 588 zcmV-S0<-;zP)L!B2d);;Xt1cYw%YZ zP|Bynh%&u=Qw@-hnB3v4K$K?Zw05@pT@IWXh|=s|&A#Z{ z_``8SvNzHYrrwyL`#rU#!X>u5KVE-#=y3-+=Rjol%=rEo!b6b*?j9WA{!~Ns+L=3t zaEXzIWp!f_{@-3avi;?`VGTB$cY)$jlfZX}L_G#rq@ z&?(i^swj;N;L5@|nx|<}fNa_r4J$Hs4(C9LQE)UGo|mFyuWRHP);4_iz#IS&5X-_* zbF9l0C<%gaXd7Q+^kmWEZ}Xbk7L^1X&o5tchOz_si~=;TJ4ji$FrVZPWE%yoN{!zd zR1a)0nnHj)M}Y+kq~zCLg||C2XoVWmG-gAc!~1f`j4>FJ$(M{7qI#5Phst#3WyqM! zaMX~#)i6WG6r?S?AsHVsIaawDlA-=HYs=G+F^o)(6-$9{YD{R=3O5v*TGap%C;~;G avhxFE`9|$Bzd29<00009)chQkytdThiJ_f8$Ot|9JK|Sxzr@J zRA!V>EGVcw6x7@NQ<@N1FG6jWdfm!OR^8oB9bMb;y6tXvo5cAdhwuG*@8RS3e7#r3 z^Iou&g3304fCz|y2q@bC0wSP)9>kmQ?J!CVym+6wlB% zRpD}&bl&y984KFY>#&;*wLXpm>Z;w3El(j!VvyhgwcVbkDcO;-Rao6*8;2Aw#KX0{ zcO>rSOzM=D9yaiqJAFJKt5?^5_{sgfOhh9NB&ccXW(|k)u%e~$BNv*>uXMi>^*1v~ zQ!aH((KIktC?ks(u1;|CU8!py2I7MerFq`>byx8U)ELuIC3fe<#RJBA3={qmHTJ#?<`e^5+~cK?=c$(pZ}&&KmIHb#$>PIn(e0q#R7*Ljy;(*0>fc zHaq7u)%Am^Yef8)b=~u08u;Qt^J}&bNJ2p&@U`z8Jb_i5u7IvI>Wz2(jvpnb&P%Bg z25IGQBQMSN@k0j`ShrA8Y3-L*1F$2*M(3o}M^UoNHS5C_T?e%{Z~Av81A2?}8XVN( zWc!0_w*Nm_u<^e!@AnW79MKxMK4Dkitb3FW%A!L(D&J&0=7LFMO;Nbm^JQ~MIjGpy zoIVPQ_+NX-%2zVMokbbY0KuUajLc|2A|1+bP}v3$5CIVo0c9Jor& literal 0 HcmV?d00001 diff --git a/assets/generated/C7.png b/assets/generated/C7.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bd37754f845ff0ce76a4bfe6822565e7ec283028 100644 GIT binary patch literal 846 zcmV-U1F`&xP)tquw5)D4Aiy23cy<)a+6mH#bhUPbrm3v7Wu8tvlNKN~ zG&PN5Kb?%_#B#X+IV{>&6g4zgYKCEyqiLLu&3s~zdp3~l#uQc#Qxu|Ul%5jdy?U?) zZ44Tq>?75jH4;aRG_)p(im^&p6#wXl3gkyI~NO6 z^W}lf8$u8450^~W+CJH4Ukb*q2nWNmJkZI!4@kAdM^@c1Cc0exKjuU+7#eSOeZ#1~(+GAK< z-SFKtp2QY zg{Mh2zeDpDJ^vKEh|mxNI%2FM^~VSRaiv2}8i9l|N8}ERm&T(0dm>iUI*<EYuaAL@TmS$707*qoM6N<$f^A-amH+?% literal 0 HcmV?d00001 diff --git a/assets/generated/Classic Full Curve.png b/assets/generated/Classic Full Curve.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a2f3e7b5930af78ea7b02ae243c84ddf81be70ab 100644 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H15WH%bFkwP~tbmY^&?;spASiY4@bFl{$HB>Yw~S%kM`q{A T!LwcgO=IwM^>bP0l+XkK!#pT5 literal 0 HcmV?d00001 diff --git a/assets/generated/Classic Full Straight.png b/assets/generated/Classic Full Straight.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..01249adfa111861378e9224f2ebf1d198ff7f4d1 100644 GIT binary patch literal 384 zcmV-`0e}99P)z9*I63N z?{~>aa}`xWQX@aN#ldu8AVf~2QO9RObxnV`(qE1Ysx&`;vr6;%JMjZjHQoOQ3k@a+ zMS})XdsAwxhw8Priw6hfUSv!VR&}azIvDF3FgXK}6Dl?GwgRQdMrR;qLiOX=eY5Nn zQZ*<=Mk_T|k)1$ii;Os-y9O~HFe)`&k!=!cMxzT-HSQ-3W`|^TKHl!>;sKowHMUvh zL^^+x_d}M(>Xs2{E`z>X@5yF)@*|xFj9&X*`?+{|`g-ipX~3w|^TnQ81J<`a-GsgY e3}O(2nw}#g0KFU}&!PkX000015WH%bFkwP~tbmY^&?;spASiY4@bFl{$HB>Yw~S%kM`q{A T!LwcgO=IwM^>bP0l+XkK!#pT5 literal 0 HcmV?d00001 diff --git a/assets/generated/Classic Half Straight.png b/assets/generated/Classic Half Straight.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2886ea8d732faa84c226c64abb05802040303a8c 100644 GIT binary patch literal 493 zcmVa&hzyo<859EQe2Jk?+0Q&5# zu|K@Xg+qX{clcn$MEu$(cb{LqZ>~(@e>I{~yBQ7DA?yT4!_iajTJH&YdG+ZHr^l9vY zq_a*MmJtnQ+dGzy6Oeu(o7!Uo#1%3uI2w=z4O8e?$WX;3VHrC#=+UMM%M3`rtz2ky zfuuC-Zo<+r02-9k_Ig=5lpUo2IzFi4&!nxyiR>O0Nd1XECkrRO<^TgeV|&mvMqYP~NKTra%)|y!N2t^<5e?_CU0CgJm39 j+A3rX;DJ2QzX$pT!<*zkm7ms700000NkvXXu0mjfWck|2 literal 0 HcmV?d00001 diff --git a/assets/generated/Classic Quarter Straight.png b/assets/generated/Classic Quarter Straight.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fddce6d0e09b12554efe81f0222b5dccf8dbfc2b 100644 GIT binary patch literal 644 zcmV-~0(v=qcauoS@|iy;0$ z6qgR2g@PSKqC@GRRv{|Jw+-I+$dC8lBo|uv<{8TMlFNPayw7{dIgZ7)N!q3XGN247 z1ImCl4X~SmeorsPSf%V+CT_o{^4#;6{+v`CG6!e)xOL}qq_z1ps&nQ10g;AZrC6n) zWMNrxY5I4MdFG!y``YY`)jNb|7HH1Z_FcVn&@(?=mUT8k7Ut9IAU{ppEPPwcE|-{M zASn&lb?7AU+ezZ`B(RkV_&>mOPM$^>NK#&m{ zFiE%d@CS&~@SP}qPN%^f!arDV#y_Mq zQHzB+gwx=GM<*sQ`oN{^NsNCJef_4fs8I zLie9cuJm`43k?H)o1F>#9d&E*9LhP4<(Y!L@4x(W>g-X#dNF$Izv>P|GKh{{U(MgB z_E<6n01+jULA_j);+091mT*1$-{(qb)Bw3sLZb`_>{0b%@qs$`b|6&Q!;*wLB`M2L e29yD9i~a%YZwrkE4=&*V0000Hk literal 0 HcmV?d00001 diff --git a/assets/generated/S10.png b/assets/generated/S10.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a8531e52493f50276eb5eb1788f78d36b603c019 100644 GIT binary patch literal 569 zcmV-90>=G`P)|Xj?De3X3}iX&^x~@^K7y3iJfg2v<9cLd$SB zKNq=&My6j1hHx50fV>+8AfX$$2I--Z)FTBXLxWEpc^Wa0jvLixNdZ-By`V?*eR!u- z^@xE=n`sO;m?lKCA~{@jnk5Fpj|kx&7(x#Qgwyyoi=S}eXdrPV8f000&+%GsVk{mG z1p|V*cZ2cS#50}L{7*+{^z{S+(HviY64Dbct9n1v>~@x?Ui4{5(BXQxlLJFA_@DlJ zw0+KQ62FZAfZ$rpR)~pUr~SrO;pCv zvi@+XuD_q>(Haa$$MbM|lKwP_U6#I&i$^4u8dYRWLck&eK$b=qIelVQrZwudvWlD- zPfS9V22$jtgtjdUq6tojt~xQG77Z#M;lDCdV+~N_n~+&#QjHhL%*K7KfRvb0yG6#v z69%FyvN?zCf9ri&pB##8yg)C1^7QQZvYKkme|2#r#uSuh0>0GW@7L;DJl?!s{m_8| tI#hmbf+5w2xYM3=WNrY17{s7`&l;>y*ESled2|2(002ovPDHLkV1lSZtgrw8 literal 0 HcmV?d00001 diff --git a/assets/generated/S4.png b/assets/generated/S4.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8b80ed43df79bc35cb0cbb4141bc6d48d30ecd01 100644 GIT binary patch literal 700 zcmV;t0z>_YP)D? z&1CV?jW1R|9yrjPn|x=o(-y@AD2?XPi|?X0O!L(e-(q#7f-Jn@wRCeASs|$>e5M(K zUrD2p+JpTPX^0*^ZMirk-eg{chDAq9BbDz=1ICDp=0Uzv8yD@-11Y>w-*Bxx2ako1 zqbWNeb*B{4(%f(F+wkf&6lWGzOo41^z@EdE2@@J<7SKrT0gc6RWJRO6Q|3Vihp@OX zdt2|2Ee(?)4a+iiO#|dWWA#J;P3O=7q!9x|f%>7bojOvQ1key@)XhTmCiUX=u8mJV zOq9cMDDGbTL-sA*Yjz3FPm^o)a^;74ke^456X92dJ@o1L+-M;X9M7Lkut0C$cMLCi za_~&`?3qp7*=yOtt*(dr=XUaE-VXELJ<^`s8k&>|^vx z^lZLbG6CXW2{n!8=_sA502Y{s{;_^p-6?F=(bIe3Gugj3sUg>J{I}*${Bz6nMl6=E z)%btF_%lhP#!EYRh!UZmX@6Sv%KQqU@&2cckulq(WQ@jKiMI^Sfb-5?t)fFBja0m6 z1k2W*)W_9Lq?_Bf1n(nb9n?n=FJ+OLsrTb$kv|Bfoy5=*s?)hdtNxw ias=e8+_kI#(&;aC5kjkwlO-|$0000!@7e>MLOU5iqX6Bp6Zj6xqAHwYH%;q=$?=b_O=aT

4o3LjOE%q?&Px^Qa#e9+?(B!Fg;)Q=At?=@7<|?c z=-SKUGq%#oUE@Pq;WG)DVx#~C1_vk7qBUGNOBaGmbNBHV))<`T_Px5fLt14_QwM-> zn(6#A?kg)K4eJdRLUZ%$#-h7I^wtXL&HmlX*va{G>qP5MET$4q9pr@gfdBGv8S0`u%y8P6iS1815KG|iqjaY?)TY+6k$rtKjQ0hgUD_x z(rU`tqyx9a_Cz%l(ECb#B$EmfsQ1R8cI?R%3qLw0@dP5=q~5Y~Egh8X(e&gvC41}s z>>!f{>rtVSo7$jz430x9*DU>9`+KtI4_#u9UOBx;A1|G0HvY|H3H+lpSh=a@;(eJ< z(|L#PmD&Ru@H{v84BNmM3bcGU3BNu~$1;D+1~hnQsX$;rpko&%0pif93CQjTx1Qkp zeKNp0d1vV2fo~*GTt~KECYs^^8Hi$))9c6T?^drGG`5FGFIQuk(R2~WSX}`!wx?S_ u#x#)u<#Bc!wu!PZ8^T7-aII-7u?2$q5<2sUDqPAr0zMG!%>5=Fe? z%KHNXSLAm>j!UxH8yFad+1c4QJF}Z`kpj zVT)(2j_!pwbM^09hgi56r5uT|PzE&cuuN+R$h31sZ3^`7@B|q7^~W?LhkpKka@+lJsIQk#pcn2VpKr$MUTwRa?vYY_M-Y6ZjTCx?|EU8lO2AT^KT{Sb3sT! zlf!Ny?+T9u0;vQVxIJ>9_b+eJ1#oaOEmuK!Q;WulO4)}`1G;$fxZ3H0Y-jU4akApO zjFR<-Yjw=q=T~oBzhIs$DmMsv;a!%su!v{Ej!?+D7mpyU`vS|R6wV}Bkq%LN$jA6^ zN9jrp+e#J{igiM2gCLeHLmD|y>(&1#GBuoGvZyp_NbrpPYb#k)@-B0fjmE?qX3|+8 zAT2Uh+F1ZW$S9CGjUJGKi~w1oaS~jN4%dc|Z0ahBL#YaF8(`;w&H$h7A(4W{z^4EJ N002ovPDHLkV1m?KA`bun literal 0 HcmV?d00001 diff --git a/assets/generated/Switch R25.png b/assets/generated/Switch R25.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..dcbee076d97d5ef3ec3a2289aa7f30ce54abc1c9 100644 GIT binary patch literal 872 zcmV-u1DE`XP)Nz;d(3X39o2vWLA(?XIWh=?F0$%?4ZNK4D)K#fRB5edZ?BPb)m z$f81|qI$`@(>v)Uit4E}wUauMNYvfFyV;wY+uhrnU6)R1zXzF}UGIMPpV@D0qBw#U zQgMj}SRe~zfh0Sg|)8~C5zj;(ulrr`0Swf*LTxcO+x>PAh@2O)ij>&%BDLMd=0 zP3L8kTSqswnF8XCWdnsZfnHZxNjeN}dCTdCSH6Fno4o{&TW!KpMT6uFT}em!!N zagCxsaT=O~yHn{HNM-njcZD?`iJl3yX3@fEvESMphvzLSW9ab@}mQXBz<=n*M4V`Tmq=QVFiv&<8uKgnL?oBHEtG79FVf! zeVWD^x-?|=m#|n!7l>zkPKrvQLE)C&(-)ZV&%#R@`RG?e_?TkXAl1`eJ0w!F-G)Kr zGBceIWg{M`cI*1hDj)+g(7-?mDmm}crHKP#$7L?(|20Tk2B6{!7kw8%#g)1>MnI}E y0-Apr2hp;M*oS2TK;{;gXn+N>Ko;n~2mJ*-5t(Pj5l%z^0000; /* [Print Settings] */ -Tolerance = 0.2; +Tolerance = 0.4; // Mid-print stud inserts allowing the studs to be printed facing up seperately StudInserts = true; // Mid-print slot inserts eliminating the need for supports @@ -69,10 +69,10 @@ module antiStudInsert(carve=true, depth=$studHeight * 2, supportHeight=$LDU * 4, difference() { union() { cube([$tile * 2, $tile, depth + supportHeight], anchor=FRONT+BOTTOM); - translate([0, $tile + supportWidth + (carve ? 0 : $LDU / 2), 0]) + translate([0, $tile + supportWidth + (carve ? 0 : Tolerance), 0]) cube([ - $tile * 2 + supportWidth + (carve ? 0 : $LDU), - supportWidth + $tile * 0.6 + (carve ? 0 : $LDU), + $tile * 2 + supportWidth + (carve ? 0 : Tolerance * 2), + supportWidth + $tile * 0.6 + (carve ? 0 : Tolerance * 2), depth + supportHeight ], anchor=BACK+BOTTOM); } @@ -97,9 +97,9 @@ module studInsert(carve=true, supportThickness = $LDU * 4) { cube([supportThickness, $tile + $stud, $stud], anchor=RIGHT); translate([-supportThickness, 0, $stud / 2]) cube([ - supportThickness + (carve ? 0 : $LDU), - $tile + $stud + $LDU + (carve ? 0 : $LDU), - $stud + $LDU * 1.5 + (carve ? 0 : $LDU) + supportThickness + (carve ? 0 : Tolerance * 2), + $tile + $stud + $LDU + (carve ? 0 : Tolerance * 2), + $stud + $LDU * 1.5 + (carve ? 0 : Tolerance * 2) ], anchor=RIGHT+TOP); } @@ -341,6 +341,7 @@ module monorailSwitch() { } } +union() { if (Type == "rail") { if (Angle == 0) monorailStraight(); @@ -357,6 +358,7 @@ if (Type == "rail") { translate([0, 55, 0]) cube([100, 60, 100], FRONT); } } +} // endCapStraight();