From 6516c22dc3c58e76da95ff7279371fbed1e194ce Mon Sep 17 00:00:00 2001 From: Kiria Date: Fri, 21 Mar 2025 10:34:54 +0800 Subject: [PATCH] Rewrite keystone.scad (#35) * helper/keystone: rewrite completely * rack-mount/patch-panel: edit to adapt to the new keystone * helper/keystone: fill the lug-side opening * rack-mount/patch-panel: allow combining two types of keystones and plates freely * rack-mount/patch-panel/entry: apply suggestions Co-authored-by: Zhao (Jack) Wang * rack-mount/patch-panel: fix animate.scad & regen gif --------- Co-authored-by: Zhao (Jack) Wang --- helper/common.scad | 5 ++- helper/{keystone.scad => keystone1.scad} | 13 +++++- helper/keystone2.scad | 42 +++++++++++++++++ rack-mount/patch-panel/animate.gif | Bin 7830 -> 7133 bytes rack-mount/patch-panel/animate.scad | 13 ++---- rack-mount/patch-panel/entry.scad | 8 +++- rack-mount/patch-panel/patchPanel.scad | 55 +++++++++++------------ 7 files changed, 94 insertions(+), 42 deletions(-) rename helper/{keystone.scad => keystone1.scad} (77%) create mode 100644 helper/keystone2.scad diff --git a/helper/common.scad b/helper/common.scad index c4abcad..3d04219 100644 --- a/helper/common.scad +++ b/helper/common.scad @@ -3,10 +3,11 @@ include <./apply.scad> include <./dovetail.scad> include <./filet.scad> -include <./keystone.scad> +include <./keystone1.scad> +include <./keystone2.scad> include <./math.scad> include <./matrix.scad> include <./screws.scad> include <./sine.scad> -$fn=64; \ No newline at end of file +$fn=64; diff --git a/helper/keystone.scad b/helper/keystone1.scad similarity index 77% rename from helper/keystone.scad rename to helper/keystone1.scad index 37b6ed3..463177a 100644 --- a/helper/keystone.scad +++ b/helper/keystone1.scad @@ -1,4 +1,3 @@ - include <../config/common.scad> // rj45 slot-to-slot keystone jack model and negative @@ -45,3 +44,15 @@ module rj45KeystoneJack_N() { rj45Keystone(); } } + +module keystone1(outerWidth, outerHeight) { + rotate([0, 0, 180]) // To keep the same direction with keystone2 + difference() { + translate([0, 0, 5.9 / 2]) + cube([outerWidth, outerHeight, 5.9], center = true); + + translate([-(keystoneMainBodyWidth + xySlack) / 2, (heightWithHookCatch + heightWithBottomLug - keystoneMainBodyHeight) / 2, 0]) + rotate([90, 0, 0]) + rj45KeystoneJack_N(); + } +} diff --git a/helper/keystone2.scad b/helper/keystone2.scad new file mode 100644 index 0000000..15121f8 --- /dev/null +++ b/helper/keystone2.scad @@ -0,0 +1,42 @@ +include <../config/common.scad> + +// These all constants are obtained by measuring rj45 keystone modules +// in hand. frontToRearDepth and rearPanelThickness are adjusted after testing. +// Before printing the Patch Panel, print a keystone2(outerWidth = 19, +// outerHeight = 27) to test if it fits. +frontWidth = 14.5; +frontHeight = 16.2; + +frontToRearDepth = 8.4; + +rearWidth = frontWidth; +rearHeight = 19.55; +rearPanelThickness = 2 - supportedOverhangSlack; + +maximumWidth = frontWidth; +maximumHeight = 22.15; + +lugHeight = 1.3; + +module keystone2(plateThickness = 1, outerWidth, outerHeight) { + assert(outerWidth > maximumWidth); + assert(outerHeight > maximumHeight); + + difference() { + // Outer cube + translate([-outerWidth / 2, -outerHeight / 2, 0]) + cube([outerWidth, outerHeight, frontToRearDepth + rearPanelThickness]); + + // Front panel hole + translate([-(frontWidth + xySlack) / 2, -(frontHeight + xySlack) / 2, 0]) + cube([frontWidth + xySlack, frontHeight + xySlack, plateThickness]); + + // Middle cavity + translate([-(maximumWidth + xySlack) / 2, -frontHeight / 2 - lugHeight - xySlack / 2, plateThickness]) + cube([rearWidth + xySlack, outerHeight + 1000, frontToRearDepth - plateThickness]); + + // Rear panel hole + translate([-(rearWidth + xySlack) / 2, -(frontHeight + xySlack) / 2, frontToRearDepth]) + cube([rearWidth + xySlack, rearHeight + xySlack, rearPanelThickness]); + } +} diff --git a/rack-mount/patch-panel/animate.gif b/rack-mount/patch-panel/animate.gif index f30f11c265970d69d3197bb0a5070475633b6714..2d6e294035e7ffd78b52f396c612c182bb552909 100644 GIT binary patch delta 6049 zcmaKwc{J2-|HePFVeETDvhSgx?36uQC0mSbh!9Ga>}JM{eK+>8g^)ejiIJ_ylFE{8 zMAnLsE#=qudA`rTzx(g|ocn#B*L7XzI`2&Nc}2{113e{WM>2#5{F4v3>EY^`k*sNL z=|N1g2@CSc&kCt5xpv3A0Dq%B2Q^TFe*F|ZQR8Cz$ji4NJNlt!@?+h)REwapqPww# znq)IYBZEhF3X{*>F7OFFiM;7>OGZjvH7!uj)>!HRN?u9kyu5*)fwNH|Z)k|%8md>j9!9k_5Sr_^Uikq3?@8?tYt1M z{6d53Oe29<#3@fq;o>2pc+L?+L2;M~0tc1P=A1#1>#Z}8CC%5j$`o8g$#pgzD{jqK zCXlNklX->~C|s4*i~I9KO;uBM=pGe*%}jzBgmv_4mN}A9aTwH(`Fb zrEaks3xV+3SbqD|1S)1t8E$>f)|2x5YPK5JE5dM=kjKK?wijz-VZ&+ip@A4Tr$UVj zRZ-OKm%dEZ$@{&VZEyZI+v>YTbum|GW1<{W%Uj^CcxU>xi|-S!&bGa^@e-rO8?9fr zd*jU5#AGfgdw#LWzQuQ|tMhno{XKQXT7H@QM5S6D)0|xHf@T(iJS^jqC$~{4&;yv+w2h<=U&XXTT->C^%{f=0{}9toxOl zl|*mU`U7Dod6W1Sl7$(PYWcc5j2x8OdwXTdb8kdxt$J@%O_j9d`t`Vs2=UScNQwGl zHH{N+H46X)>`TdW+KTWyQS0Sxx`V!^uJW4Sz7ZyuN@G&*Otc}+kfx?!Vj0u#xC7A< z)~9(2g)hUrQ0AX{=2PeP-z7%Q2b}A=J085(*RnVae9x!c!7x8KT1hvG4*aa#GuV0| zNzB#ZOHs7UiG!Vk80Z}XcHC!eG3@HeR{daYMv7MF(3wT02u7p_XbyQ?blY%Pd^!Fc zKf3dWj=s#V-M8meaPXqX=m?eypO~jZwlgkTw2~_yiy)dRk!c!?%gJIOC-An~G>@3Z=qOFgS zheI3BYVoVg66tT*S5UXj3W}8-MkTLh5y^1`g7J9~?3G(Dc%$=jp4AF#=$3)aHjvcK zE#5@QieM~EZCrgj^z* zGbG2b0b5qSUTx!3^FVjw02Hs|gn5Ber-VU}p}BU?UioU@6O$~n4`nL*6~P{&qnX^i z<*1*PsY`Y=THXM29@@p+0>f-MXlU8ZTm%NwfN}>E3Ky6BXjP=EY<~{|Rc&S$8TY3R zb^SWqM}F2Jo3K>oCY3_yonVQrAsG7(RuJ&L++9`XOoUGlsrZ38#d{z_nIJ|h0Mhbe z0d*s)(%+CtdmQAD!ip9A+%~BTudnueo;#J~F9JOb1*r9f34@r?gBG&LEiYxxxzF4! z*LuHYKTIB;Th$Y5Q}w9uEjO}bh_#HpP+j|YgL+=}UO)%ssc8V$@%&Eip~7;_*%x4J zYi>WnPa#NWm39!$k_H)OMS9Q7lUo+r2(zX+lc z1YtraMQ%zWz?1?!?;Hz*hLNKh?FS(m7jfO3x6T|zZ_D-fmjb8hb>^3WZO_vc{oAx= zlM_G+$x#hvAvz=yGV;XPmn0*mO>pWGEd9u{{Hf7?)PI5FZ>m5M6w~B;l`Y9k`Lwo= zuwd44D_C#rhJ$bWaGTtjAd7MGtK!~ZOz$<+b`3Kba>1mB+GOk6bBFS>rPVl~xf~qE zC{PRW|Mig4^|cnzc)=r1ibP@$yHBoEI@ifti8JG1;u_$y`QfGRfdCUDS0Ht4Xl33k zNH^O5Wls0d>Z1K4)##5;J!#b~iwut^@W=ajvzPa*#)76Uavh`+!~EQC1xGGo5QkhJ ze;?}fHZOE17Lx;>?ezAAQ1s<9-i&SR(kbp%U&Exmi{9G*c<1-?*@EPmEUl%Mv99ke z-%i}YaHVviD#Z&7O-mq zfg*6@KUAffaFSN|O#$FM0Ort$h|R#^wDAfE!WT_IAVpLBZiEpwLaUWvF8~rE1Dxin znNE(^*YU{^f^l|a%5!!u6MtQbBR{9Ceg)L9A`*23a1d_OMX6h2XwJXt1^S4Ocu6-Op>kWFi9(eh>b&^$FxGcbv0@8RTOb-NQzP7ZM1u^r3kNu#Luequ?gzK8( zrFWywO5Nhfm~}2k8d)1zz+KT%*CZ-GHGXjgm4HYXui)xELfXCq=1M@NyOHl&6CcPW zGQQ`~O^v%pjA8eVp9@U7{W*~VpY(NIV)Hd}XgXC24`H#5B zFN9ptVKOv_7i4`IVx2-e!$p0p0dGrTo=K52M>AVv;#l2v*sW6!0#Z@wsod6fJR5qv z$El4L$xpAO30q$ia5vz}Oe=noR{0@K##$7~Wg@3cq;^iTc}!F~=8SA(AkND24tpd1LM8w9&6DYdKtF@B7XFXu~9&2t&W07D7u0eumK|oUR7rWSc-t^ z^*B%EY+r2J>2m=F4WM#4J08fns0502%z1*%30(rHkf6LEx}%RiB|*6rIk}Z>xz#hd zwa2;jT%-nNQlmAgIf&GnLuzj$be{*g*6&7%YxQ=ux+-&|Noout@hY2P|MD?CdGM}&4P&xiEYo$jq|nxub~-h(>+DD2)5msCv31Ud4IJ2;4j zrLa$w{o<#N*Fq%&k9h(DPpuvlYNhet_&lMVV@ff|T-Mq|z|HQ_=Sq3KBFCDp(G>`X zwPS#j+irBl+=&eusM{N~Wz6}OA@IwEhW-|J?O|CKc^_Cz&V_TZOj4|9UAP{+ocvfh zoZ&TAme@Lpn#KG7p35+5l5}XbJ9A1T1=vwu{iNx>5E>|Zryu@NAUlB^;m`+1xOI`+ ze8EG+5kZ9)8ZS0R^EK~GZca0m36v?8bYW7^`yR@4wz|!n0t$Fo%SLrB*&4(NdqH&A z8PN}rriK@bSrv7v++QTu(cop&aX+`4a{LSJ)zz9f=h&3Q$z3mh9e&dW{)Nm5NI8N4 z(7%w2M3OiibDb;yLax=58q@P;eO0xM^rB~vL~02ex;3AFDB-;On>V@0+b~}=E>-AT z)Ln%zh`2dQn)GZs=2FlnW&Y1Uf^I50#DB_>Pz)aY;*X2af(OaMpd2!c5ST7L#Uk=b z3;@L03%SEn)1s&{GP812S>1h!m!A}ul-3FcUV=dy+3JY6zo6CFoS4}r*&y$P-(xV` z2n56D&%<-`PK%VyEeiEALv#1)8q>zt!=ue@hPu7AgJUq2-^5E#Zo>B-8LAdH?Wqv!yqfpUq~7g5 z)~e=HBPzsL27eQ5Bvr*Ry4Dn4x2o5v>L{cgn-ZUioJFjy zZy**I##aJYH+T2e<`zJgxmcN^!|atCuM>>n~`YsIo{ zSe*LHF83vNsRa8Wke~I_;5Uv6O07)!1~S$(4p`y71;+MQJSscdE|%Z)Q}aJQZL9r) z>BvIjSGiBjBxK4|@)sgdW|h*F28n6f?GyKWZ3$>ehDmPG%ywavK|8})mcAk-7 zbLFW~yS*JwJ*Va4LTZ@N@1Kb550r$+%NPEL2M8<-*d8C$qpd_{`^1=!tmc?s@Q;cM zEJSYQBxy0y=nvl@QzEve;LNY}(4cx-j6A*1R`~DWW=~R!g!Fhmsby;#5)m>{q8ecX zZ9gY9wQOqzh1oh^M2?aIAKdyFFM_yM&=It^@YDmo{T6f#r5ha%$S1vQW!+|b+nqw` zVme%r9_M2c_@AG-{{c@6>ijSGBGG@qyH(a!8!~%Ijrn^1bz?xV^d- zu*ES-`3Bm6J~L0x-x;2w{@3c6Wo3+zN*KJLHlfI%1OT3vx3mg{ z*3~~zdx2?eYU}M2VRfxZe4g6V)7(G)P9&5?0#;dBIx#ypzpzMI`Wxk6R@c@iKpS7b zec#^svAehb^WgC4_~h5=?>}b%g!YQ;QV#)7O-(;{2WeIYVGz`_rKx+Ot%8udKNq9v z)CXtpx9&W`mb@Wy3!DYhTYIkPrX%m(^CYuo8DXO3d~-{!_dbjmtKdh!ZV-j_o~Q(| z*6d$qnJ6`qmRCQyQZ`Y6FN=64xhH9E}*>{Xmi#rJuUVCvrtp#<-W{>y9XQc7*R&2OXQ zRMFdkH$T6r3Gffs?y&e?kac~~ey#(xQ__D~jA>5I@StP9SGSP&B=F?&D^zRpwE=S| zy)8clOT%tO@%Vl0`XN-5R*Fo17W03)1X|=@S$>sl zB;MdUkKqw8tTAPnmQv7IXSJWK4=f*15nOL9_1t+pxDy!b<*mWX9vMD%tMr|xtv%W& z($Ft}DKIo4F%iS!;qt&ND)TCeBaRf5R8W{0j`2(jw1 z+})g0ZYU#?_t z3*F@ll(yNgPHps3qJleaH=X?PiZFL5LeX{ejU7E6Fv$|y4x9?x5+3p%;vH9-F(=;+csk*?f7{zfI?@)u|P7fWiVltFsFf#71wlu&&%PHCg zM+V7KQ1}X1M<;H~5zjnrwow*AKOZ^PJ>>;n7SO#00z&k{OfgtoM94izbaZSo3nVQKiiQ8@QC5HpklF`v zgPMVx|IzXP;`MJQE)y8jv7_^@-45M8tIip}9fOE$z+h{rJXH!!#7tMQYT|L#3M3@A z$a@jcIcd_^%V&-|Zg*RDS|>wvB)yy)!};|jeY^5rz$8yAT27L7 zL)`SKj#u*|?#mJ%)QumS>bn1w%&j(S@%hDqFp53Y_oW?#y!yQ9oMZSP7h3m)Ss6<=&@IQkxGsK^JYVt?YYE`_7x-cZ@bYG91 zP#DQBSFaIkt>Z07%P5S#3#POByHh>a_!3v`_}U(+}Cs6_cyszWrViweR&0291%PCh#TPG;(2W?t7>MV z{?ydS#nI%=UzP#B;eV;;1{>DIKWWXdXwS0jEr9nG!AC3Yr|TT;B17z>!(OGty~#~~ zS6)yR_gGF}_t}G6E=liwi!mNKY1W8$;>vg9yze2LmGeT4_vh-J=Np_?T3-1Sp@ZrwxWz>`JOA45ejQL% z9Q2_wq^TyPsW!Z|KA}yJ{hD0Y)z;D8(ALq}&V|a+*45QkS@M?5oqsN2nGu9cIR1@D z1SsX-Y)=9Ojw9C;^e8e8J(*Gnkxl}mwW5s3IOtA+9^Mr0XhcEdpD%dk$Ido-N4(1xRHT_s<(!Q24^mKhR zg`=+P?Ktp)OZ7yGJ^R|;a`1ih%dK0(3#Ai%-PVH7+?2czf3EaIb3N!(`t^A#{5&i> zXZvKYZ+H;>psVxh;*`9gRuZZ9&VE6JZcyXCS z%=5&pVi^ZTQhcT-=iFwNk8YUfX0}&vIugv_1Baj$zGZyRi$J}0NMU9l1%VlaaR4S{ z?S)f*x@7C4oBxEv$tNfr)BQyxf$&+Wei*=7Eg++gb+g?ZNdq{>Dp(EK#>K^4kL(Q|r*Xb~ zD8Ya9%H-Xzqp25`XSauTSVoU-+F=>JnOxIuo-Ce0V~;0XZk#T;ERFp*Sw>0=fgqxV zl1PC41^e3(|1V6Z>+uNfThkCqVfRIvyL+BxpZX0~0HS-aha!%Dy{T*7C@tv}1c55| zouC}qfZArLY3X(0=YAG=8VO15XdX?;+oK>bCC2IUSD(;d{*hEN+`L4jrMIpQCuiQ< z^%j`bTpcfpHTy2Tyj;9G-I%yiK5hH7_2O(7`(XNvAXli8wl|~rfb;TKg(Bkk_+2F8 z&*l7$GfsLGjKx-?i3kHus28|Y!vJi}-@rmT-DDQ~DCQvyv0Ps_mEV3acTxbf1A*@l zq#-IUG)&q5Fg*ACzJ4ABWoji^uK%v7KBd+uxY_@)2mL+>!XAWhUbFX_)~tv7y^tps zRtIUihfv>nPj)aN5RlxTWvMv9xzG)etHdLrGB}V#A9A5OqoGeKR?5h3P%bNPcre+G z{K#|pu5*8*Zx}B+qNRipnC~h=WZZL^+A2}qQG3_}lOd|*0f0?S$DGiK(RM!?byoJUS>bD^5*Xtk|T6yOHdPeYt6xB0%f&1j0OsD1TC|2d#5E zs$3Yvfgu8l`~v&W9i~X1me80r%rkg#!Mj0$W+By=akkI_;0nk1xcS>rZNwA~&`?9s zZ4|*^?VL}leh0OCt7%LR87$Kc&efa3K{w5jiXFdaLe<}7@|Oy(Q^g}Uq(*#4qN^g( z9eLMz0HU1XDmSl37NH2J4j3=KM9xgZ$#oUsGoZgmL|?nG>D`3w^s4qO(dQ>TGC)oa zS9||FnWlUGwrvGk;}s;_xu1#kTlczlCK?%B;wh3#oO@N{?|85j&B@bw;OZ9e<09+| zZ{~M_|0!^J@r)H}j_cxf5BmH(zsetvgE@?+#%~#u67B$Tp#qgpxY<|3{jsm0PL-ra z@fIX5)omPKAN$fmo?!K4KX+TyiI z+D9J+ndBRfe1P%}opZdYz4R#V0<#B4kT|z z``8^gx)kUWZ{$NL$P84MGarYju#<9Qh){}fCvG*bMLLl!QtQ?(=}*^r6enJd$Zi56 zBs%0Mi#TAhClY`$yMT%4cI&XcVu_q;i};y`Ha| zQVPq1`t9{<>~#3%k-qv>vSSU)^aA3~-DZiXy>~5c|kdmnww{MNCJ*&>?!zK=- z+rAs^UvysEl$YWU_%ESKwiYuRmXF7AZC^Sba? z-1Q~fL?Gi5*Y`6fWLO=-c?@x{QLZ995ZsJxG4}lxLQgnAgndR{(>rlOVDAt|SSdOk zABNc=ueT2$hJt9|fT)^Xb}+Jm1i{&ilF0{ykzhW+)HW2=QGyir36`P*@!~+j+<-JQ zN2Z*oynM**NAeP~QfxYYTFoJ=AR=nGXZitL*xOph$zQfF#JriE^dSf~%Imjk_BbNs z$*KQoTBt(=8?8G4atGTWL##|0=b8d=Hbo8V161fl;2CpJ49%ffn^2U%MTHr zVNv&y_D+werv(W}KIcT*3ievso`&BADRaRgp-wE}1W0yC1P3!Ho>zow6ilsVk;E+J zOyXs8>V-~Vf#Cq54}e%cuO131667|#c02KgBi;gNKFbeYMgks6ALOI` zeWHg-+1WQG`n$cEYNaa)EF?%^pvY=SGv+e^7@CS%@nIX8m00M$yH0P#H46Il+DbJs zb}vF{nfd*1VYYQnZ=Xo3X#l7y#5eR z<9mm4OY)Qfk-+E-Z;@AL@J(Pp&(KXtHGm?$n-Q(-ZN3yH%zo&OMEVI z^&}BapLAQnT1Ho!%R5OwC22{{TWL;NrC;|hOR}DH@_|Y6{eC_jUH_fN4Ve*#mkc$&|vLWW}mb)K|Jb$e>|HJ26`(YX<5ZO5a5!_ophEO)|l;}ukYzsFt zchs$Y;A}SB=V^w!dj^#jAo>u%w7~Mq*lBSLDn6OH@tHZiAoN;h!@e~wJhLGqtFi_!vd-h#fIL;pEL1FRUZA_iiCA@;+-GBISW7>aY4Isowe|0Wo~a|VGj1I&Q9 z4Co3_28;m!dd)2uW#arOF|XWir_)`$&CwNIp*ZBPx{R|F{Vv8T)y@Cj=hdI&{=Bcc z0qO`BT79pD3R;*&wU5EAtPw&3#YfXD>iyHzN2N1-ZUst#pwnw4*xSqZ<~#QQWK?ui zFx2No_?wvIlo(WqVPa%zPOec_Zhk5zJiDM2QS`2)thB$t$8p=M2Rl46=H; z%YG#Pv)=t6+a5|l?05%56Gj?NDRI1$uKfZUDPmR(KC4Zl`A?!_0~i4DhoC>e3h?Bg z>@W{wUpVJFl~=#o=}daf$cTt6kVl6(CF@pMgpX93iY2fT&(!)X&S#Do)dUT>#f|O1 zG9&X|_}SlV6Z`Wb*w2!c4G|iKd>RaagvY**i%&>QN=`{lOV7v@Wu{@y!o<>$6c%wp zOQE!Rm39S1g-k$wLt|NKRm;7a+7FFgxJEFxqP6!gU$4PGa(6tLDV~2axFPbstOu7F{yKZ}T9Uxp0V z++>7wiExUz*m-+H(sRT}UTBn}Qq*MJqY#6vHD6K5a+A9zXHPrk1zkF-tonTdNMtM1 z>-GjRJ5bY0^XLOp;wKlWdJBPG)ZZwzoteyocD#)56gkQWaT}2Qb20UL4CBez9MS(mBKm?cUEE+6C925i=-z?=rvimi|!FO1tg1}mI zE$az7TyDlXg1eATpN z5BoQea{o&(On|rr=o&x)Pyc~*#r=Ol%8F2rG7*(Br{pc2mi^(^kx}8L?;SAWRK{%S zRx!Ts{A9N}Ywgr)+U*OPkI^3`gn&STf+M4%WBvhDl{q1XBsGl&nh8y|PeTKF`T5{1 zC~b}oI<26px~e$4OsOKZ2HRX+lvP?U*+|mzu_wQ?tMOBRbFTz$V5Dm3*4I(Q)cDQG zsgW7+x%vJ@v8CmnRnhg0mQ4}D7IsJY$6ocm(C>qSBf*o?ymNue^D91Dnq?d<^gBm; z{OGrjVOyNMJJ?-rEe|>~<4XDcHEaw zI!@v6M(}H*B4V0?tX^OY!P$uTvAb38WR#)*?!I!lMA@A@rLyUIGFMTPN`sD8`ijI# z-Fn_JHxvDYDz(~2t1m;pcx5ft7zM4}V|`OO3W0%1Ze7%)f_oykgiYJkBvAktxpcZg ziwDuCa3%@w7&Q(f;%KS6P7hl=?Z>EORGq}lpM$4rpG3t*OC~`SAglk=CGSl{ScDb- z@sYduh^zCmPewk`k83r!n@(Z2cXy%3(^pFf@318gy;y~uFD71t4AzmX8gC6aU&=zr zeTUuJmiL?ejp7`)eONbes%qS9P$;dh&$|GBCLlTn0HfkVUBV-xV$;&2<53}rYRLhq z83l#Waap-HF_A@8)zM{Q6(spJO=)#}^^Mq$7T&gwkF{OhJ)NH;D!*X6n0tq6{?31_ zYGR;aYP^4-eLiF6+w$~c%6if2=J$fFyq#VA-p}+Og9oukb0??2jxT_-_F?kVINEL$ zaIq!k6Q8FM^po{ZQghszax@VauR(gW#l2XV)P2ZSEuU<}j#gDMzd{0DJ84a$wOwAC z&%jH-&bQF_vCUVLyRO?xEyj3-f^|fE;N$XG=Q|~1nA=HyG24T~5b>+?F^1odwUYNF79Q4aY#?=w=FtkHNO5M!0EC%G|3DNDt-T)KQx(8SrI zqm{p6u*xdQ$BQ5-0eBN@m zB3Xr2%pH-BMd~cl#_apGFW8cGZA=pt(D-3#MQX^+X{i?;Xx$!~t4BvqCrZ{^WIxVZ zZ_kOpl>W@YW1zSWouyK{m4g%?Qt8PbXM-Tgj!QztDa=gTpo@7oPa z3C_STZ&&bdvgI;4zxeG=E@R)Sa^ChQ{QhoN-F5iq_vQH*07u@wd<+7^6tyuCNFjw4 z3=y@KFb|5JIDQ(Hm-7i1#_lnT3#QUzUIo+h!dIP`dvQi!Y9v98h@*ElFPithIWKs( z=oBR*K25NTzBM4c5zeiGK_cE)9G$Kw8nnU+;wku%g%mf0;YBG14jDz!+D0usDWsLry>ns417sO8{r*et@7bQyB98yARQ{(^{uw^vAm{(PQ~nlBk|!hc-yCWo z;PiCFXky;10wen3lG0KPy0A*4thTN!7n5I&Rr=6cTS461rP%hdxB=aS>yz$jqhaqK zk!@pTgD{THDAUr?%zj&1URhmR-@t2<5NNh(pqrb7eFAWB2!@_OY4=8d?H^tPptUya zUnZ))pc|qPCu(#jDvpZNT&M228X_Ww-(u06cAYntUDM_;9ah+v1n69+Dn-y0>1hdC zdieVa7aK&&P|mgMN;&4`C^4M#Lu3ejc|lRESK%h{<3$IVg7&0dc_wNP@@%e>ytYhL ztz!d!+>j-htJwSIeoH#uv`}`n?;O5?#ak(PSuZsvoov{2np6m0T9(x4AU=9hglj2j z|1#)(&Hh&iyFx7-nY^mgn=v=M`95dCe~%?|*r}puCYv$SVtBi|YNB0*bz$h$P~*s= zL*_yge(=!mVvi)dX0;__2!ipSDxa?N8AMoqGa`ClX6tZ%HKr$FUX;Xr z9==#LVqfkksugqFxJSa6!bA<(E&eD9?v~FGebG^5k~ycaJCx@%{n9~) zBmOjeuWz(>@Z;AhwXs?H0o?RA<+)j6_N9&GFSXpPZhZJJ67D z{5|*Kv)cPwT|_Wi8vqw?8x&4WK7TiTANMhgS^73TP^SiooDvpnFRd%=kL4i0Mj|`~ z90&w z)byO|KI(W|^hweZ;av5{R;MF^4SRMLu(m$(Y`OE|%8x(-M_!%DaR;@Zl`J8Og1lgT z7!E2G9qkah0d?C@cdLjzHdeR3`-Th<491_+!JHOMCBKi066amXj}A+5dal7B315$; zC@d|A5?9&JkLG0+;tOZMm-4;WS)0YZSNhP5i-U>F7qXHFjIO7M-JVlRw7NaFk<4xp ziBEsw(88CdgWBqakTsO45sBFMvXrD!ltzYUxek;GMSBx}EY5P@J5xhPuax0ZSozBd M`7xrbVBqe50ae0SF8}}l diff --git a/rack-mount/patch-panel/animate.scad b/rack-mount/patch-panel/animate.scad index 03a7341..bc4ff65 100644 --- a/rack-mount/patch-panel/animate.scad +++ b/rack-mount/patch-panel/animate.scad @@ -12,17 +12,12 @@ module animatePatchPanel(at=$t) { plateThickness = 3; keystoneSpacing = 19; - slots = max(1,ceil(at*8)); + allSlots = [2, 2, 2, 2, 2, 2, 2, 5, 2]; + numSlots = max(1,ceil(at*8)); + slots = [each [for (i=[1:numSlots]) allSlots[i]]]; rotate(a=[90,0,0]) - mirror(v=[0,0,1]) render() - patchPanelSystem(numSlots = slots, plateThickness=plateThickness, keystoneSpacing=keystoneSpacing); - - // keystone visualization - for (i = [0:slots-1]) { - translate(v=[keystoneSpacing*i + 12, 0,0,]) // hardcoded offset - %rj45Keystone(); - } + patchPanelSystem(slots = slots, plateThickness=plateThickness, keystoneSpacing=keystoneSpacing); } \ No newline at end of file diff --git a/rack-mount/patch-panel/entry.scad b/rack-mount/patch-panel/entry.scad index b164dce..91584c7 100644 --- a/rack-mount/patch-panel/entry.scad +++ b/rack-mount/patch-panel/entry.scad @@ -12,7 +12,11 @@ module patchPanelSystem ( // begin config //////////////////////////////////////////////////////////////////////////////////////////////////////// -numSlots = 8, +// 1 for the original keystone mount design, 2 for a visually cleaner keystone mount +// but where the keystone is a bit harder to remove +// 3 for a cube with the height of plateThickness, +// 4 and 5 for cubes with the same height as keystone1 and 2 +slots = [2, 2, 2, 2, 2, 2, 2, 5, 2], plateThickness = 3, keystoneSpacing = 19, center = false @@ -21,7 +25,7 @@ center = false ) { mirror(v = [0, 0, 1]) - patchPanel(slots = numSlots, center=center); + patchPanel(slots = slots, plateThickness = 3, keystoneSpacing = 19, center=center); } patchPanelSystem(); diff --git a/rack-mount/patch-panel/patchPanel.scad b/rack-mount/patch-panel/patchPanel.scad index 6932006..010370c 100644 --- a/rack-mount/patch-panel/patchPanel.scad +++ b/rack-mount/patch-panel/patchPanel.scad @@ -8,35 +8,34 @@ use <../plateBase.scad> Please also make sure that the correct rack frame preset is set in rackFrame.scad. */ -module patchPanel (slots=8, plateThickness=3, keystoneSpacing=19, center=false) { +module patchPanel(slots, plateThickness = 3, screwToXEdge = 4.5, screwToYEdge = 4.5, keystoneSpacing = 19, center = false) { + slotsWidth = len(slots) * keystoneSpacing; + slotsMinPadding = railScrewHoleToInnerEdge+4; + plateLength = rackMountScrewWidth + 2 * screwToXEdge; + plateHeight = 2 * uDiff + 2 * screwToXEdge; + leftRailScrewToSlots = center + ? (plateLength-(slotsWidth+slotsMinPadding))/2 + : slotsMinPadding; + difference() { - supportPlateThickness = 5.9; - supportPlateHeight = 29; - supportPlateEdgeSpacing = 3; - supportPlateWidth = slots * keystoneSpacing + supportPlateEdgeSpacing; - supportPlateMinPadding = railScrewHoleToInnerEdge+4; + plateBase(U = 2, plateThickness = plateThickness, screwType = mainRailScrewType, screwToXEdge = screwToXEdge, screwToYEdge = screwToYEdge, filletR = 2); + translate([leftRailScrewToSlots, -screwToYEdge - 10 * eps, -plateThickness - 10 * eps]) + cube([slotsWidth, plateHeight + 2 * 10 * eps, plateThickness + 2 * 10 * eps]); + } - // TODO: these values should belong somewhere closer to plateBase.scad - railScrewToEdge = 4.5; - plateLength = rackMountScrewWidth + 2*railScrewToEdge; - - leftRailScrewToSupportDx = center - ? (plateLength-(supportPlateWidth+supportPlateMinPadding))/2 - : supportPlateMinPadding; - - union() { - plateBase(U = 2, plateThickness = plateThickness, screwType = mainRailScrewType, screwToXEdge=railScrewToEdge, screwToYEdge=railScrewToEdge, filletR = 2); - translate(v = [leftRailScrewToSupportDx, - railScrewToEdge, - supportPlateThickness]) - cube(size = [supportPlateWidth, supportPlateHeight, supportPlateThickness]); - } - - render() - union() { - for (i = [0:slots-1]) { - translate(v = [leftRailScrewToSupportDx+supportPlateEdgeSpacing + i*keystoneSpacing, 0, eps]) - rotate(a = [-90, 0, 0]) - rj45KeystoneJack_N(); - } - } + for(i = [0 : len(slots) - 1]) { + translate([leftRailScrewToSlots + keystoneSpacing / 2 + i * keystoneSpacing, uDiff, -plateThickness]) + let (slot = slots[i]) + if (slot == 1) keystone1(outerWidth = keystoneSpacing, outerHeight = plateHeight); + else if (slot == 2) keystone2(outerWidth = keystoneSpacing, outerHeight = plateHeight); + else if (slot == 3) plate(outerWidth = keystoneSpacing, outerHeight = plateHeight, thickness = plateThickness); + else if (slot == 4) plate(outerWidth = keystoneSpacing, outerHeight = plateHeight, thickness = 5.9); + else if (slot == 5) plate(outerWidth = keystoneSpacing, outerHeight = plateHeight, thickness = 9.9); + else assert(false); } } + +module plate(outerWidth, outerHeight, thickness) { + translate([0, 0, thickness / 2]) + cube([outerWidth, outerHeight, thickness], center = true); +}