From 07b9cc47ba0695282fd30eaa79c388507b121537 Mon Sep 17 00:00:00 2001 From: Roberto Alsina Date: Sat, 15 Apr 2023 18:39:03 -0300 Subject: [PATCH] Atomic exporter so fstl doesn't whine --- notebook_nueva/Makefile | 2 +- notebook_nueva/base.py | 11 ++++++----- notebook_nueva/hinged_lid.py | 12 ++++++------ notebook_nueva/hinged_lid.stl | Bin 1188184 -> 1188184 bytes notebook_nueva/hinged_lid_left.stl | Bin 600484 -> 600484 bytes notebook_nueva/hinged_lid_right.stl | Bin 615384 -> 615384 bytes notebook_nueva/simple_lid.py | 13 ++++++------- notebook_nueva/tandy_lid.py | 8 ++++---- notebook_nueva/tandy_lid.stl | Bin 268284 -> 268284 bytes notebook_nueva/tandy_lid_left.stl | Bin 144484 -> 144484 bytes notebook_nueva/tandy_lid_right.stl | Bin 151084 -> 151084 bytes notebook_nueva/utils.py | 12 +++++++++++- 12 files changed, 34 insertions(+), 24 deletions(-) diff --git a/notebook_nueva/Makefile b/notebook_nueva/Makefile index 7bb2cc9..7a9ede9 100644 --- a/notebook_nueva/Makefile +++ b/notebook_nueva/Makefile @@ -2,5 +2,5 @@ STL_FILES = base.stl hinged_lid.stl simple_lid.stl tandy_lid.stl all: $(STL_FILES) -%.stl: %.py dimensions.py +%.stl: %.py dimensions.py utils.py python $< \ No newline at end of file diff --git a/notebook_nueva/base.py b/notebook_nueva/base.py index 9040ed4..8beeff8 100644 --- a/notebook_nueva/base.py +++ b/notebook_nueva/base.py @@ -1,5 +1,4 @@ import cadquery as cq -from cadquery import exporters from cq_warehouse.drafting import Draft import audio_plug @@ -11,6 +10,8 @@ import usb_hub import zero_holder as cpu_holder import dimensions as dim +from utils import export + # Base for the notebook. Basically a kbd base that extends back # as much as possible @@ -147,7 +148,7 @@ if __name__ == "__main__": .cutBlind(100) ) - exporters.export(right_side, "base_right.stl") + export(right_side, "base_right.stl") right_cutout = cq.Sketch().polygon( [ @@ -168,7 +169,7 @@ if __name__ == "__main__": .placeSketch(right_cutout) .cutBlind(100) ) - exporters.export(left_side, "base_left.stl") + export(left_side, "base_left.stl") # draft = Draft(decimal_precision=1) # dimensions = [] @@ -191,13 +192,13 @@ if __name__ == "__main__": # ) # ) - exporters.export(model, "base.stl") + export(model, "base.stl") # for d in dimensions[1:]: # dimensions[0].add(d.toCompound()) # dimensions[0].add(model) - exporters.export( + export( # model[0].toCompound(), model, "base.svg", diff --git a/notebook_nueva/hinged_lid.py b/notebook_nueva/hinged_lid.py index f7d2ba4..382d7a2 100644 --- a/notebook_nueva/hinged_lid.py +++ b/notebook_nueva/hinged_lid.py @@ -1,8 +1,8 @@ import cadquery as cq -from cadquery import exporters import dimensions as dim import keyboard +from utils import export mounting_pillar_positions = [(x, -y) for x, y in dim.mounting_pillar_positions] mounting_pillars = ( @@ -383,11 +383,11 @@ def front_bezel(): if __name__ == "__main__": model = model() - exporters.export(model, "hinged_lid.stl") + export(model, "hinged_lid.stl") - exporters.export(front_bezel(), "hinged_lid_bezel.stl") + export(front_bezel(), "hinged_lid_bezel.stl") - exporters.export( + export( model, "hinged_lid.svg", opt={ @@ -404,7 +404,7 @@ if __name__ == "__main__": .split(keepTop=True) ) - exporters.export(right_side, "hinged_lid_right.stl") + export(right_side, "hinged_lid_right.stl") left_side = ( model.faces(">X") @@ -412,4 +412,4 @@ if __name__ == "__main__": .split(keepBottom=True) ) - exporters.export(left_side, "hinged_lid_left.stl") + export(left_side, "hinged_lid_left.stl") diff --git a/notebook_nueva/hinged_lid.stl b/notebook_nueva/hinged_lid.stl index b6288b1f040c5b2b9bd76515115f001bc4af243b..6311f011734385e864aa2ecb0d45c40e8cfa152e 100644 GIT binary patch delta 114 zcmca{$m7N#kA@b;7N!>F7M2#)7Pc1l7LFFq7OocV7M>Q~EqvB2)917B*-!Ui;R~OB zk%iA_dO9ng@pKkezU1krS%DJESozeZ|6}DdoSw)AlrUfevNYNGc-t4S@c}VE5DNgY L;PwSF7M2#)7Pc1l7LFFq7OocV7M>Q~EqvB2({ow)QWzPgFJR#l zpB~J@r#}523!mzAQ&zr|>CCKr#?#NR@)=E^#mZ+lor?`9k;n$*>a+0~w@+c?17dz4 P764+w?NiuF7M3ln+{>otFJrZzF0qU?eEPy=tVYw#m$MpAzp{)qdHU?- tK#8*DtZLKGEoU{HZn%Qgc-jgeF7M3ln+{>ohE@Mq$WSCyCj8$~H;xbmv>FbuUs!nHJ&YCj) w@-kNA>2sE|8coky&T2RP)^ebP;R+!4|8iF2_LLQ@K+Fcj?AudTa5yvq0F{{}EC2ui diff --git a/notebook_nueva/hinged_lid_right.stl b/notebook_nueva/hinged_lid_right.stl index 22dc7e354fe8c03657c395b9de3351cd8a4e47a8..f4655d618340d1eaed9e1e98be4cc15bbfe55ca1 100644 GIT binary patch delta 94 zcmca{T=m9r)rJF7M2#)Eo|x@)4M&`?5CS}u!T=o_h93le#(PQb$YNToALAy u9&E|ew|fF*Cwa1|O@HOdW;or~3n(Gu#b(%E@5Khh>_E)1z21v6QW5|k=pUN^ delta 89 zcmca{T=m9r)rJF7M2#)Eo|x@(<43DQl_hWu-Q*P<-w*pUC|TBeec0$Jbi~J no6+<(Pd2;h-#md5zFt7Cv=^IkdxIAn5VHd@$Myy<&Im~Wj~X5! diff --git a/notebook_nueva/simple_lid.py b/notebook_nueva/simple_lid.py index 55ab900..980d20c 100644 --- a/notebook_nueva/simple_lid.py +++ b/notebook_nueva/simple_lid.py @@ -1,8 +1,7 @@ import cadquery as cq -from cadquery import exporters import dimensions as dim -from utils import extrude_shape2, hex_vents, punch_hole +from utils import extrude_shape2, hex_vents, punch_hole, export def model(): @@ -85,12 +84,12 @@ def decorative_cover(): if __name__ == "__main__": model = model() - exporters.export(model, "simple_lid.stl") + export(model, "simple_lid.stl") cover = decorative_cover() - exporters.export(cover, "simple_lid_cover.stl") + export(cover, "simple_lid_cover.stl") - exporters.export( + export( model, "lid.svg", opt={ @@ -98,11 +97,11 @@ if __name__ == "__main__": }, ) - exporters.export( + export( model.faces(">X").workplane(offset=-dim.width / 2).split(keepTop=True), "simple_lid_right.stl", ) - exporters.export( + export( model.faces(">X").workplane(offset=-dim.width / 2).split(keepBottom=True), "simple_lid_left.stl", ) diff --git a/notebook_nueva/tandy_lid.py b/notebook_nueva/tandy_lid.py index 02cc717..74df11e 100644 --- a/notebook_nueva/tandy_lid.py +++ b/notebook_nueva/tandy_lid.py @@ -1,7 +1,7 @@ import cadquery as cq -from cadquery import exporters import dimensions as dim +from utils import export viewport_cutout = ( cq.Sketch().trapezoid(dim.vis_w, dim.vis_h, 90, mode="a").vertices().fillet(2) @@ -111,7 +111,7 @@ def model(): if __name__ == "__main__": model = model() - exporters.export(model, "tandy_lid.stl") + export(model, "tandy_lid.stl") offset_width = -dim.width / 2 @@ -121,7 +121,7 @@ if __name__ == "__main__": .split(keepTop=True) ) - exporters.export(right_side, "tandy_lid_right.stl") + export(right_side, "tandy_lid_right.stl") left_side = ( model.faces(">X") @@ -129,4 +129,4 @@ if __name__ == "__main__": .split(keepBottom=True) ) - exporters.export(left_side, "tandy_lid_left.stl") + export(left_side, "tandy_lid_left.stl") diff --git a/notebook_nueva/tandy_lid.stl b/notebook_nueva/tandy_lid.stl index e2c4e1e284793aafd65b17da1ec5934ae1267d07..21602dbb85d795b4e3c5499731e14a1b38388d4e 100644 GIT binary patch delta 2655 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 E0I|>gHvj+t diff --git a/notebook_nueva/tandy_lid_left.stl b/notebook_nueva/tandy_lid_left.stl index 6fbf22724554350e497f96f4b487b06546e83d2f..80cdd6d3c1a00069fb15420e680a4c34e943110e 100644 GIT binary patch delta 881 zcmWmAPe_w-9LI5f4<;i? zXYCtv))+W7)>=9JrFj@Th{V`Ib|?vv7~vsyh#f>i`g|@g-rwi@+q36+>W8NKp($Kc z?w||?l}+4aKdAhYV|5OyV+lM*Imj+aliMNCLV80ue8Q>#Z5>iuhFlI~{__HivhI;$ z7zaHgs0$=dLgZisi-A#;i!2lK7}#TFSk5sVX^o(29Q#;yl8Rtq8(03sI40niYf;oO z$7z<2l%r}#wqBxQqIE!R8VP z&tP+Y7FFlC&vMVIgq)p2Wl858j(jJ9I7SCa$8pz_*Qg}vB^A<>09LY1;-o{s5o?Oo z4RlFV%#ctLcl9K3v27k4ptNgV`INLSV6LS=259>Nk2l|8E(2{zD~ln+8O&aw3mNsm zkSB|n?+_DtyNLIAoJHLt-^d$seF^+S>4!_ItmOU*<|{x)S5(80Y!36YoVqDLa_WXS zK43ge0%Vt@NlTtzA&;t%o{zvv;^c^Ila2zIBHiRKDFJ=;6aPN6irGVcf5!L7ui~)> ziWpsFnV8qW9?QwfkbY8I!!P>QQB{%x35~FG^0RCN*LI}&1yv@~#78U}SVT5aU8J3? aZ{h(O8+bnNS5;~gXB8LCK=)Tw^U;5g)mUNx delta 881 zcmW;IPiWF%9LI6KvWA3*F(Sr@7!e*ugjs}yj2Iq7Bw}>vFeHY>7$Fih&}_NQ*>W)U z$9%%M5@G+s%$n0Zuj&oTsq#I?Xeaw5O>Txj3mFXIUXxV@+VVnn4C-PS^Y52njCGe3 z!no)fMRkxI36Y~wEQZHW4zfy2rPKY%zf%wmrD9%rD zq-IziQi{r++IfYFk*-NlXZ1~D;eL(kBqQV}$&+(2Y;RAYe#FG9pG?VzGwRMP<_jb| zi+7%%L)AD2=Om$=9NXr>(|K%rSqCg%9AzizIG$R5gG!Pn86*P#cWU`8O&~=^BK8s zP>+`|-y%lxZV7+p(K6}=`A*)Ft1I9yNL81a z{UbO_d}N=bNlOl2p_xOK$-pOIA#rj-c1d?0Op|`{hZKRn{F$$Jt>Xi9tmE+47m!=W z&mJzI9AuT4HozgPhm|3IQr!@5LL+QnL5d8K3h{DbCAhMu8sAVQGDAGXyop8UHmYw6 bbdmZdh-^thySJs-u6in%O+foA(s=j}0CiSm diff --git a/notebook_nueva/tandy_lid_right.stl b/notebook_nueva/tandy_lid_right.stl index 02ffa2e654a8720aa49900e55ec91e7711d0ef60..e894ab988b33498781097207809ca26bae7b939a 100644 GIT binary patch delta 1744 zcmWkuYfMx}6!t7!U=?9u0TmVmM3+St*o#1F*gM78`f3#8E2z|}Sn<_peKnRqRHC$M zQE%{6OBIV%8}UIzR~i&sA6V;?ifvl!gZipg1u8477W&PP`Q|(4eDlqjxszK}ZmcRd z9tm!zV%^++M(NHj5~KCrZo7W7UDX%5=Xe_mMT;)nc4a_zp?It}x!d(OuT=fwE7f@I zN`VON=yfVk&*-q}XFF8=gN{7i-H}eCb$h2>Kh>$~8!@J0v|z0BsLF-fPeh@fh(p|4-=v8l2edL=wJq)wyKUKetc^T$m7{6ic#pv0UPrLP{U3R^( zOVum7RAoLb6XSJb_ZemK$VK8%nHSmhOWmrmEn%_P`S#~0&1GMcO{pziB$To=no)M1 z@_0Its%+@HKs@4PBD)f@WxjCmIieZ-1xj3E08Ew;2T+=R$`k9j-armI%&i8p^BOPI zqP$>LBUxW>z(dIjz?6urTrq*ic|&-}8=Bz?D!~9HvShj_=1&zk1@b`!TYnZiP2_Np z5468andSrV@r5?)#(QXLxesmO`7&1aP88SJ=}UH>O(Swd4;SC?r9>`Aja5HVw_$Le zALSdooB4_#rO*WK_Ji+cBc;<$ZZLu;8qv?7o>0Ct!qXKyQrzRxp7IVhj}kv{E+|L$ zg6O#v)k!Gs1$ZpsxP)+j%BL~B)*pxX&~?n8ti%BUFk3vK<- ziuy=^@`%I5O0Et?{fWgY;yD78Z_E0yFn~$IvM}_}vk&CaO`&M?&oF2j5p#u1p3b)j z8!zpHWTs4}_XT)M*a1+gov*cjcu`+$aoXf78rZ8Jl$T^FxWObkIjtYfrXt?n4^J>5 z9LqZTp_VkvTeR@ZaNP7(*2A$RE&^?|Nx^9eQ5L}W5jgt$+!}#;Ndywv7Mwcl@-r=; zpIXRHNBEe99LmcBJ;W4_j6`NOkBOu*4vvEQZX{rZWWxc9W9=iYkq<^;PXphHqB2^; z%lpInMt?}Yk>C>z|D$`aYDv618kPCcShvByS*v6v21h(pb4MG&zsQmrgYV~w!J-Qi z5@Ydp-r}-YxYuw)EH%(dE*(H=RKe#4P%A%d967RRY;KDFGMnPJnvqU_iWtvohQ` z7?)8rI9ofx)e67uC=2l4)UtD*#b3G_e9s;|l zG}wjkB>Z!gCENEq<9J*;Waf?goilm0q#N7(osan`1YDDb6~i-duqAvr9cN8ra|U)@ qTz^0FAwPiHwIYM?zgy2^1kHu`sDML#?t!|P^$!HO9tgvTfd2uUa7YLM delta 1744 zcmWkseN>KT9NsTI>P__OOZrl8(TCnXo>ZIlKDQhra_AVg(213498;vTbC_mrH06Z* z)bF&DkC|_AbeQCbb{aJY$z;yvXfcH`LP=Wfy8pPZ`?{~+^}Fu-exAFk(o|JxI^o() z-%7Xc2I<(NYlEo;Vy67F+o}cGZ4h1Z#~!Pk*t66=b%S^$TYI`?|7%@deyy9XUt2Fc zdWW4i%Y@!AxuZ8rF7DN3Pj5V>Nb4J`JpV?QB^V1Zo?~q4)3v7BFGPV%>$6HrpDxez z#nXNHtgn&Q$(pwrvZ`N~$^BW<6SMh0UEal+g?-sF$}qhM&k?&OZK-oDdym4(E>V_N?6pF4 z@Dd^`hZE`i0-(8XUoN6q5@m3a9mM$xf&p6VuUTR7s#4oye-ySdzs(P6y>V!%z=UaLx&> z-zfG_!D$8F&Xi3vxX>AwSX%RwGlh_rGs`B**=+=x?+k}$(guTus>JqJV2Y; z94vNnnj1V8H;9|uaKCo0Q-ZHMgvUyq<&NYPBLl=)e&mj1yW&9cGuJ5k*f&IkaJ2{g z$sVwJ0<=!{7WrJD#JftI>m3bSLr8lwkM#Ov{)Pfb%d*gff`+}YI!PPUk%Lnx$RZ8`xEUM;CUy9K@uRb+C<62+r z^y=t4VjlbXkrkaOepJS;{&4^02gp}!3P6h~>@;rjF@Nky+~!YZw2{}2LG;ZruBUssN-PKh>m%b(x3vFYB(Pfu;yw6-5PTKKP-N{30ZdfvmSWezv@2EOE@4@u^z=r#^Yh^TR+b@!yys4 ze8Kosqn5kJgI?*|U_@|Q1WwadQyf7riN555NGvaMbtGkIZ{1fIm)Ro<_dm`lQM8bj z^T8;ppx2xf4O=^}QBw`?SCa$(9*uwJ$O$nN!}c-Q{0cz3`fo>KChv~Hj(NV7HWywA z$^)wYiH`c4q%NB)SLmqc?&z`Y zwiz5Y0q#Yycw>iILgptE5PIvwX4?~9h?*Ahti|?1bhwusvMuI+K