From bd5f1e74e3474e1dafaa8c72d924e284a7391eaf Mon Sep 17 00:00:00 2001 From: tim Date: Thu, 12 Sep 2024 22:55:35 -0400 Subject: [PATCH] Updates to some icons, new icons added for CAD tools, and new layout for CAD tools --- src/bonsai/bonsai/bim/data/icons/dm_add.png | Bin 997 -> 1046 bytes .../bonsai/bim/data/icons/dm_add_void.png | Bin 956 -> 1026 bytes src/bonsai/bonsai/bim/data/icons/dm_butt.png | Bin 176 -> 192 bytes .../bonsai/bim/data/icons/dm_centerline.png | Bin 329 -> 269 bytes .../bonsai/bim/data/icons/dm_centreline.png | Bin 329 -> 269 bytes .../bonsai/bim/data/icons/dm_edit_axis.png | Bin 183 -> 279 bytes .../bonsai/bim/data/icons/dm_edit_profile.png | Bin 191 -> 355 bytes .../bonsai/bim/data/icons/dm_exterior.png | Bin 248 -> 257 bytes src/bonsai/bonsai/bim/data/icons/dm_flip.png | Bin 405 -> 310 bytes .../bonsai/bim/data/icons/dm_interior.png | Bin 237 -> 251 bytes src/bonsai/bonsai/bim/data/icons/dm_merge.png | Bin 1244 -> 1260 bytes .../bonsai/bim/data/icons/dm_mirror.png | Bin 495 -> 481 bytes src/bonsai/bonsai/bim/data/icons/dm_mitre.png | Bin 267 -> 278 bytes .../icons/dm_perform_quantity_take-off.png | Bin 752 -> 448 bytes .../bonsai/bim/data/icons/dm_rotate_90.png | Bin 1027 -> 985 bytes src/bonsai/bonsai/bim/data/icons/dm_split.png | Bin 799 -> 819 bytes .../bonsai/bim/data/icons/dm_unjoin_walls.png | Bin 460 -> 485 bytes src/bonsai/bonsai/bim/data/icons/lm_add.png | Bin 1028 -> 1102 bytes .../bonsai/bim/data/icons/lm_add_void.png | Bin 1016 -> 1092 bytes src/bonsai/bonsai/bim/data/icons/lm_butt.png | Bin 180 -> 200 bytes .../bonsai/bim/data/icons/lm_centerline.png | Bin 398 -> 307 bytes .../bonsai/bim/data/icons/lm_centreline.png | Bin 400 -> 307 bytes .../bonsai/bim/data/icons/lm_edit_axis.png | Bin 183 -> 273 bytes .../bonsai/bim/data/icons/lm_edit_profile.png | Bin 190 -> 362 bytes .../bonsai/bim/data/icons/lm_exterior.png | Bin 277 -> 294 bytes src/bonsai/bonsai/bim/data/icons/lm_flip.png | Bin 433 -> 409 bytes .../bonsai/bim/data/icons/lm_interior.png | Bin 267 -> 287 bytes src/bonsai/bonsai/bim/data/icons/lm_merge.png | Bin 1494 -> 1473 bytes .../bonsai/bim/data/icons/lm_mirror.png | Bin 571 -> 537 bytes src/bonsai/bonsai/bim/data/icons/lm_mitre.png | Bin 270 -> 279 bytes .../icons/lm_perform_quantity_take-off.png | Bin 1113 -> 659 bytes .../bonsai/bim/data/icons/lm_rotate_90.png | Bin 1532 -> 1461 bytes src/bonsai/bonsai/bim/data/icons/lm_split.png | Bin 925 -> 886 bytes .../bonsai/bim/data/icons/lm_unjoin_walls.png | Bin 493 -> 495 bytes src/bonsai/bonsai/bim/module/cad/__init__.py | 4 + src/bonsai/bonsai/bim/module/cad/workspace.py | 280 ++++++++++-------- 36 files changed, 154 insertions(+), 130 deletions(-) diff --git a/src/bonsai/bonsai/bim/data/icons/dm_add.png b/src/bonsai/bonsai/bim/data/icons/dm_add.png index c6c89c7d1511ca698f59d7e83b2bea443bc461bb..7c1371fe4f2557dc51a9ffcfd0ae217424d6baa8 100644 GIT binary patch delta 966 zcmV;%13CQV2bKtsUVo!WL_t(og~gX$Xxmj7#((cgW@GVU>_V{>MYPgMTRP`O!3#g; zo$JJ*H_{DPl%>os8jxv7&Yi ztX<8T=Dc1cS<@_OlQh8x4&ndiIq&o2f6jT&8&OsMPq=fP=zry#GH~qyJO)>zkJ_Je z$s^gmfhPKwyV31}Gy+Aja2V*exOcX*_HscCI5_4i)pekL;I=fhE5NSb34hqjGm*R* z@Y44%NC!}zky|)xkR~5b9$S)uZ5+PCV%`;~10+N7LpIK_+{XraZ%gC>#D%s@4WuK?lz zB?{ZGQaNuQT{j?s4Y%(J9DeNB=*cRe5tz)Q__TmCcI9Gq+t|>fGVGMxU;yhbLTDcy zoEUBk92pN|%Ygu3QzXn33UbKcUgG7>%u zx@{rxOn(f-u>z#y^W#H<{>~$(1bd&tXF&W62VK~e{;|`2fioi~5a|JK%_MQQw_!O( zkNUd?g1B7`uWhP5XfWa*`|&)McMvvYnJ?$-crCM$$J@L5o~7na16=*vBq^u?Zy7_9+L<&bX| zaDPw2*cXd`l@xz9J|S&WDvo0)y-t~Vy=@;+fgriR&{gll-75@g_TN#LyPf& zZ?R^TRFg)wdQMjSI$YO1RinQp>lY>3#J zR&9EAk+#N=H%-!1|5tg>bKY})@AGkT9#K`^r;OpeT*{?!rGH!+_s#(Xq>P4qA$V5^ zc9d~`g@B|KE7>L3j4#JP_Je*AHRM;c*hAj0BLc9Ib03ew_zqZu`OGQEnGkHMVA12W z066iEn!w~D;CtZ1glOS~z@D)@+wG#DCuM+A&My#jAMijc;uxsa}=kscUQoT?+h} z#^iqstUGk4rCD0P%`yeRf}P&JdmeA2?beO<9D!{>_b?K_66C;x&gawIftzExmAe=^ z%^V=Cv52~wZ{Kfq*ZTel(KA)yB#>;)zNlET-2s17!+)a=Kcbbu_-Lni>ug0izPIL= z-_THTsUzQ9_)VE;qm%1??3!+x}xR4OW-x&eG=^Y%+uD=-PQBr zcZ3aqC4Z5?$sV;25Op;+U0aIEmQ9YYX8=^RwOTfA!2ISAU_&86J>ZBLiTO2DSb06)>gWlEa%B zu2TE%-l*Kd0o`9j>5OsZEcz=+e5scd7m6+~S?1Mu(Q*u9P-%|G2k_#-obP^=Jf zPk(_r>n@<9KLsrTp2zbA@(33j2k;G(Y(fHeg&~ijI;vl5;qm=wC>zC#$(Ibc1N8_t z&2{xg*iAta-e~GL`2=uEZGji15||U^;Rh{N`_9OV$;|%brqD^>i~s}?YF8{njWNu& r0vg1=tn zV|{rczr+ki>}KV+6uQpy`o&)>bR<8FR4egnvZ>CtMe~pkW%CR?w=#K7`5) zncLN1QIsQbjrI)n|tA2zsyBGljP}eL%{xfPcgqOK$g>>*o^hD;K<4ByhIs&R5~f&9Op$n54MVttCbZtCu}I5U1dIxW z_v;t)9pD585BgZE@O`phb}6s{!^8kSBr+rHOMmG%UINsx7dw|JxD5=%HexbByi65g z0FBHAsyxiO08zHoF5wjMIT4^Ndd;t0#ATo&x*v);3?I`Fgs|>#nV^|S&SPs!)Lxxr z|LQRTXKJ{GK@o`^ZrqXZqIjwacxtG|U4e;sx@S0Y^Rt=z|y=%gGGY) zNOR}Tad9VhGUiTZCKLUy=6-X&^Z(uNbfn^UHGg=u|lOG{MOLL!KPo?t-{9$V>5)_1L`9G@^&!F?zr%mkls8a zfTXzn;}!#fPSy^Luo3ti_zy4@S{_-f3yt#FoTLvp4isdPIJ>Q;EC&3S`q``fd>Ytk zPsjB^ihot;1WL2YNA6$45`iE5KT{PPq$*c)nB!q1@RGwfSb=jXZQi^Cq>*|n@c|y} zI^ldv&+`Q^62{Hgi}6Cbz;)#1WvqhH>E7d*AX^ zTxdkHE=W!RE0UhS#$JSnfq0_rUUG-DC7HVww?Lyhmt+CA3lRLOw2N?e>W^hZ9I38m z0{bNk0c)lNX?H-=`{`mu_yGH`@d6+AEl0@Ut}yF140)Y#&ybKCF&KLRYHJ)@i@rd$IVd2})v~Bv_U7OY#ENAwb z6t&BimjMD6Y;lX>@OxzUk{Qf@!0!aZgu2mvv4FO#oir BA`1Wj delta 89 zcmX@WxPfs(T#&7&i(^Pc>)UIFf(!;6ERG#-cl0PKJ>s5a%ecYW^}J83E3@A&TV4h* lSn&Gp4@Hlt{SY3*0rr+sw)Pu+_kM!}JYD@<);T3K0RUz89s~dY diff --git a/src/bonsai/bonsai/bim/data/icons/dm_centerline.png b/src/bonsai/bonsai/bim/data/icons/dm_centerline.png index 9f52ff498572bf10a918a5b899a5cb27d0bb555f..60ce5f0ce22eec54c8376cc649af75092127cb24 100644 GIT binary patch delta 183 zcmV;o07(DI0*wNYUVoZNL_t(og=75x|33pZz<9X^tHgiZ7DgBoT?^y2Y6FJ9jOVdv zyZB$X#Q>XmOjvEFBN%W8uu!1aWS|{zmKqKi(orxAjh{wu2c%NN0RtWdqYfBw2T+m- z&keK#jH%&(0gr+KcK{_(fYBZx$B+RJfl&vHI)IW~kUr23KrnBRkOhWx6ri_&$O;ik l959m_4jAw#7q7E~qC;}`${002ovPDHLkV1hW9M&~?*Jpmc}E}!BYb`RUuWoY`)2R33>~V09Hhz3Gg=sfB@jyh%)M(FV_UfTQ=-pC;a6_ t6bUZ}N-cnxhMy6Tc3sGO2?9U>cmv8vDraIXmOjvEFBN%W8uu!1aWS|{zmKqKi(orxAjh{wu2c%NN0RtWdqYfBw2T+m- z&keK#jH%&(0gr+KcK{_(fYBZx$B+RJfl&vHI)IW~kUr23KrnBRkOhWx6ri_&$O;ik l959m_4jAw#7q7E~qC;}`${002ovPDHLkV1hW9M&~?*Jpmc}E}!BYb`RUuWoY`)2R33>~V09Hhz3Gg=sfB@jyh%)M(FV_UfTQ=-pC;a6_ t6bUZ}N-cnxhMy6Tc3sGO2?9U>cmv8vDraI0ha=hUVo%XL_t(oh3%Hn3Bxc9MDI%0NjpL^SPX`CFlU6u11aALfkYOq zXwiKNTYkugB#H<;)oBj1PM2tL(D|WAd34k>f)>JGxRKw^% z599qG|AGJrfWH8+_JOw*Ks^i2He=033^Z4OGX!ND!U)Kq%{tTuASiNw=FR&{${^GL v?j{U?HV+UZmz4Lh?*TxD7Q-FMeJ5N2zwRe6BGCZs00000NkvXXu0mjfARbOx delta 96 zcmbQvw4HH6T%?Pqi(^Pc>)Uf1c^MQ0oGu=2ymO)A7;h{`_Gxb&dsSAOn|)a&Zf!R6 mFGanxULC#m&p%5BG|<59zm&`N{paFxkc6kJpUXO@geCywVIegD diff --git a/src/bonsai/bonsai/bim/data/icons/dm_edit_profile.png b/src/bonsai/bonsai/bim/data/icons/dm_edit_profile.png index 458cae080c3c4e22a1018ba8a9de4bf1dd674272..81e28320b7e3c803571246eea853a1897c3cf4d1 100644 GIT binary patch delta 270 zcmV+p0rCF70pkLYUVrdOL_t(oh3%I?4uUWcMduT4W4dCA8xy>di3^bsW$BGHaia&& z-iL8RA`K{m>ClDz6=CSiYo{f@U}g%bSR*NHE}9ja3bAAWn+iU_`t)7_#+^Vnw=yjW zoN5(!0f;Vaj%7QD=e{JO$pAhIHa`!36h#|e93EoO?Yx8b38Gvt%`Edn51(N{4771*T^u<(K&{chE9y)Y!ac^MRVm>qi}+Bp}dI7w*mFz6Z`UGDRE@>Dgi&8|j% zWo^tqm;&-nuW;5swB=Xfhi_~Q2q3UtlEFNI+0K#Urk%mv6CepsS3j3^P6vw!16l+CUI84SE4Z8o{to;F0uTWG7mR3t9Y|bKR3rs<0&;l~4OkEWcm)9n ZzyX925L9vA+SdR8002ovPDHLkV1mD-KxF^` delta 162 zcmV;T0A2rq0{8)tUVnv2L_t(oh3(d{4S+BVMA0AQb*Nw^UORJu_jNkl2H@-+$izHw1wuic z5Oexp03K+8HP96V=wiXhNB&#zS~00000NkvXXu0mjfWW!#t delta 321 zcmV-H0lxmW0+j=hU4H>0Nkl=X3c{oNc&;fw9@tht=i&$tYyqmjT`|OO zyay8Y1ksNlGJshTqwx%27DO^G08Bz;<9|Yc2_cFr04jtyt^|k> zs<;7=M5yCNz#t-y-%H~Fj^k6XApl$x?p{v4_?z(N0I;&h0r&k0oZ^l45q5wJKHR?U zqD>9#+q3u;*Z`OD#){AbF5{CBI>30`jF1EJaT7uYkjK@CJU|~;A<_VQT#Oh8Opl8Y z!+`nXDFiU|F*=$*9wT?y*KJEYj delta 151 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 diff --git a/src/bonsai/bonsai/bim/data/icons/dm_mirror.png b/src/bonsai/bonsai/bim/data/icons/dm_mirror.png index fb894b589885161c51445cd3bc5e7c35b7abf1b2..826c392b85ffa035cdb12154e281fd76e7be8854 100644 GIT binary patch delta 397 zcmV;80doHD1K|UZUVm;$L_t(oh2@vQPQpMGMel9=9B}0~Y2rfTN~J?6LRD7A#FZaq zV&Pxd`CQZl7-l;2o)j0}WEK?q&gmPbol-<#jDI36MG7nZP$}5B%Rl5-1&BAU+?CYl3Buz706^4i%Cb**w*UZ;b1t3h3!WBeGc!sg z;kg1o66M%C_TddR9Eh!gcqTHOKO}yW4F~iOqbXNqS8)~GA^-?0F2|u8l^Sjn004fi z(cXx*$J$a#FMmL(WKd57-z)&!^(zpEn33g)lVWhiq>zmQ-w!~%%4&U}zcBZ2^ rGCUyh=_(O{VfeAssQB;Sj=uql_w(YQq`Q;=0000lR zJM`~IEFV8%Gc@PZ55O0n2`UgVzniNgo0lQ3V{iAju2`w>1C&002ovPDHLk FV1n$nu=oG~ diff --git a/src/bonsai/bonsai/bim/data/icons/dm_mitre.png b/src/bonsai/bonsai/bim/data/icons/dm_mitre.png index 552906a9922d4cda4d22c26029fb692f392d71a1..3b220db2f60dee3756e28f95330c5d3528cdafe2 100644 GIT binary patch delta 169 zcmV;a09OBt0+s@hUKXQCL_t(og=75x|33qTfLsF@85kHCk#8G+)F7BA6Lc_9(8!)F zyBVku0!dHS+0TD}?jX7PsS*X0ID%?vfLupVH4&2I2&(4-QXN5)Y)FbDXjTpo>j;__ zM8r6P<|QE^N6@7x#^(sS)djd5LD$L%nmIfH{Jbk>w}=pnF!ImfCje00000NkvXXu0mjfFU?5Y diff --git a/src/bonsai/bonsai/bim/data/icons/dm_perform_quantity_take-off.png b/src/bonsai/bonsai/bim/data/icons/dm_perform_quantity_take-off.png index 7b538234c7bb3811296b31349900038d7f500141..7ac80919d98edfc4b5fabb9ab3b9b6f26be702d6 100644 GIT binary patch delta 364 zcmV-y0h9jl1;7K4U4H>hNklp=*FK#yg(MwtuA$`fgC}CKTAD> z=pyPp41xzSnj07oVAe+P1fPqv+8LNh)JcRe51J{c>Z&(gJ#VU{$~Q_(2VXVkrc^K$ zNdg-{4`>66z%lR+Tn7Iw&z3+j>j zt~Nt#OMO*$#~^SO_8zE;OLw0H+D zbH155=X`hWoo^;3N&K@EPzNjlzudP0_-en(N9g{}EsS=rBGB%mxS?a@%hr z&Bnu}2<(aZ$ABjLHNe@}SSv6RAW-AB$+-&E0IjwQF@Kk&NA~9=Wh5;cPf8;2y!YIP zk~(5}&&LZU34hd?#Bq71#yqVMTYrx?6?7 ze@7q-jFAwFB9;a&`biTB%{Xw><2m3u&~ALjxihP>B(~wDnBN)LX8p0beUfh3Uy_uS z^wD@qQdf~0dE0On*lPb3FkfN?nurt;U>ev6G#Wn#x_^Lb;2ZD;*jb=Po)k|Jod*Cn zftMu+90o@1-vjmn2aLzvR}IWL*Np--@;*Vgqy^AtCEh%4e}CfNZj-Ua@Jh{!6juloB9PpgNnFZ8v3a?Y1iFDQ zzzk3iTz>%;f!k#i9|V2?Pll#`_)HW<2cNnUEB(hgFoYLKtAh{s47y2kuTnV+a5M002ovPDHLk FV1i?1HiiHI diff --git a/src/bonsai/bonsai/bim/data/icons/dm_rotate_90.png b/src/bonsai/bonsai/bim/data/icons/dm_rotate_90.png index 32c2e2fbdf236f06c200a3a4796fb7481343bf2e..122fa8076437f44fc6dd6e988bbd198e34bbc1c4 100644 GIT binary patch delta 905 zcmV;419tp_2-ydaUVmmuL_t(og~gX!XkA4VhQAYSTB$Lq8k2%Wkdlf%h`lHTp%$d# zCBEp3BEE?z_+&vr)E6&Eh2o2aDpphwG^Hq1dyxu?)?&pwg&M84r9x_G6BA+*)6a)l zyO|vKIXxxDvtTiM|9j2MKQrqxyQ0!eX=&>0H3;+qgTSrLAb-#c>;xu&AO8;msD<{b z!|G9Wd4|ucHg$59in<=y4vYaCfFr`P!x_C5g|0`>tP z1ABm>|B}G-z~iKq?;%A%7tjWD16Ki^S)WOgqizM>2Tsq4L7c^-CfTVjDmkl8^=@^u zI_QiXRPR??=6~vhjgTmGf!e3;&4}z*SIw0G>SHnB4s~Gz1N5rC`OB?A|(SKFLb--<;ys!=UzASoxJAj*j zKY_P^0pLQQAGihh3Aiz$>a0;v=!?$CX?0qCq=fm)VSh6n?U=eYzO|~`0zaU(HF^Yh zMyD^-E7c|H>p^5qW_NSgZH>vUR)1H2HbqE5VprI`({;Mp(k@KIx09j8WYy9R{857dq+JlWCkM|jG29(m$aTQ67Z`P9|wLQUEg!*0WJgf*C7C~H`;XtkP|pga=sffYy&C& zH-BeXKd_dWAD0TrPo_wh+j{a@v@6dbSyt*$kE^HDE$WAnM&GE)UPX!>Q(sj-3cDBT z<^0fV!gg0#Dn?xqHDOpitUhJ=yKk2MhrB6c=Y(T7OEC?*MKF_Mh(L0H~R^ ztGi9|QqF!_^^7LZ0GzSpDm8U4aBbma27teTLEs3`3mgPK1HPN>8rbht87;A8a!h?y zU8&Y);|S)edm{KVvCyF|P?xE9s*kJN)Sn7qdew*3wwVB^0#T)xtDDqD4oE{?GZO$O z3j+15NO~X#WPg{sAmBJvy5{(|q<>VLcvCWd4E{^^cjh5AqEbLwsC zE9$uVX<<{l>D~{kkEu5W&8lygBv~J8e_C=yv&sA6^k~81#jxL%v#kr;6FFN=-KmbL zmzIEdGxqGZP!E`%(INF`_3XmN`N6`LoUJ?jI|{ycN0KK?0CYO>PE2|+Q5VI+hb0>c zV25&l_kXKBC4TcF&N~%x9*Xsbx!%zNv_(A*R8;#AusG(Op~p)6{s2aSB^7bD0tbLg zfCn>UOKgO61&h)OECl8N=KvRleXt_Qap1y=HGxer-vHF|01g8yfGY}{)-b_P9XPiM z0PPiPklune;%?rH)+Z;Z<_N;U>1 zFFWy8-)d?&2crNp-)q9R$MhYEdX=gFAN2$uAfZbmMqg%_tM-NQ2lcBs&q4L-k^q~- zx8KyVN1`@XHIY2)F{;1ijSEd(>qqr>bu7EuRS}?OYC4Bajj6}fjG9S~Iwt@O{|n}> V%gV$b5G()y002ovPDHLkV1i);$i@Hw diff --git a/src/bonsai/bonsai/bim/data/icons/dm_split.png b/src/bonsai/bonsai/bim/data/icons/dm_split.png index e33e105c708925c84d2402ed05076ffc110470c5..03018a8681f7cdb9e5d21c0201d38cd7aace350a 100644 GIT binary patch delta 737 zcmV<70v`RJ2D1i`UVp$zL_t(oh3%J5NEC4t$3MUQQ(C$y9gHH3K+P?zkODh&C4tV`#pu7Tj87B{<9C|VhY(I4GEufxpFz8yz*H+OHo z(|g}}^ZS1I&CHt_BO(BpSg(};h#8QU+x?U_`hlpb4S=u2CVxf827m@gI++oF8N322 zPj~_Rb}})QWdP7?I$l`-VZq6b>@Nd=Ui14(07G0g95eBOsuG%418u6FTnQk&Pz@oH ziK`_9=mtWnewj&(Gl=2?J4huy0-Nn)3rKLEv_!wI)4UFN57gTA5>O9(0ks1Xj?Q6t ztWK=Oml$2AIe);YG6#5=G0y=2z%PBkPp1~nm{_E19p;yS)2d#?8p%%N07&!TEXG{V zT|@4hSYPXZm>&f0xwLLzP7BUGkR!$-V<4Sb20oEWACbdD-wHI}4vYhPmG&Gs>u&TO z#mj-qAk$eQ>IwLsm}i}ZOh`ZQ)MY*mcwS0R0BMcRBY*z$Sa)nDPSV`aTL3^Ga6;8f zz&T*vtJ(7sI0xU|x_~i{l$1u~l(Y=KTIH1Ez-z2s$V3;`li=;K7JvoOJBs0=l4eK+ z56GeD4_9jq)`Z)svAX8~KAUqNET%lkGseG6%R@ zsCiKU00d9O@|KZp%>uxVS04%F~lM7&(BBS_AVAAR)#P3=oU4DQP#|FSZ3HQDO Tpue*Y00000NkvXXu0mjf12I&y delta 717 zcmV;;0y6!x2A>9yUVp4fL_t(oh3%J3NR&Ys$A2@fE1I5!pfZRktJM|7GCC+76v9hI z(<{ta*z5G9gn&FX9CJ{Hvn;DC{sK&M-zs`uR%#T$TEK&ipzfRkjF zV5JkviO4LZF9Uy#O=`ODBHVXD zMJ-FILG`$;U;}XtJOWNxybo5LwDk=D@NFstGGftIj#u_NB_>%8InQJ;la=u#X`?6QL zANWG1-G64|J8&A9*{J@e?N;i-GoafoT#0}06=QtW5*MI-Gx3}Z07$TV6x4u4L(3bo z00>!A27u9AYUh686!ViwE6*y<5MuDF@ zZXn}A54y&RY9MH34U$LX`v9GA4^;s7Ee8fM7R4M3Ib&vwy%rML|K$ ze{j)4p>*^QsNf=klRv=CO(>L>BI4rUAgJIV1qt>zG+>jO8k?IGOAlPaxq0t>AI{Ck zQ6fUfXm4|EK=j^GWL0IH391NXqBpErOJ)*ZNVM%6PfzzL8C ziqzkb<`5CBgNv2EhJ0K^-bG~0Pp|(&G(DAX$ew^*;Mq^E;~Dtgtdvco><4NrikZ6! zvc^#5eT@XpHGhExGy$mc!5PQ~fXwA0?FZJ?-CoLNUd#@GEPI7f0Ssa%S6wrPy#)-! z1pp$JJ7?!7S(N?2f~sUp09DG&17_R+AfMZHmzw1#i5Ng_szP=YVXZR&Fig@u2U325 vIC{dRRyVt{DeVFLF95B-<94Fs75D6s-(13 zH*nHMPir~A*a9?xi{A(fMgT{^E3h_7CRB(gf)&L-~E!4haNV`@9HV1G_0brh%*Dpx^=Q@$vVBZg@R{CQqQMY9h z2G+&%XK~$0L?4Jev{gS4wju?$j8H=3Z#)YCK&vQINuG=VSRUpW+om)J$N~Njz!!|0 VsEQoDdI10c002ovPDHLkV1lImqmcjr diff --git a/src/bonsai/bonsai/bim/data/icons/lm_add.png b/src/bonsai/bonsai/bim/data/icons/lm_add.png index 8031b0577c3a4699ef5cc877574c1f6e1e2b660a..0ecbed228f85a93382c54265e145684f8c6aad91 100644 GIT binary patch delta 1022 zcmVr;K8Xz@WDn>VvJ&_Q9_jjjU$y} z;)Ay|UZMs``ofSH1#E(~YU(u6kd{m@CxioIf5NreiGSN^%u(z^An6WT6`=a3 z)x?ohzd$kd84m1Gr~<5T_q;%-f&ErLyDx8u0l{Z@$S4IpAh0&+PvtjjGEmHiTWsw2fl@${6pw=TDpEN})vqZTD4@-~iBOF~ z4RC$x!b>nGXn%{%{M!L)uB>Q4Ks+=&E9gPswlxYb$EboYz+}6!&xv#z(TpMv+>jf`jAVgMZW^MtX!0>m1llIkt8?gsDf{> z>--6(W@|912Cj=oHsTFL87yZu^mCy6WY$=4GEcwqj=3T&1Ae_V6tFYDIey)3{`}_d#F>p&Vfm6K=b5Z^J zbj6pw7k4{Gq8Yk zAeV(SjV1m!5PkICK#XNsi-81?Hy>;der}p(dVgkS=ImEbXFP@I7t2}6Zo*Z-G2CwV zJCxppsPV^<09#fT_hNVTy2?s;Xi*Q>cXN0%v|B47~p2smbn%i3w}5 z$FlAN5E0AM@!NMm0f5`>o@3W?0|qlVTxAUf$n^Adtz}uS#uzHIEUPT?VB7XF;DrU* zFn_eE{}P6o!;%wjQFkZIRc-2@($@ZW5xp1aO2h~K7TesWyFTqr z%uOK;wPoNJ;CZRoQGz=4z&*<-BZ%&f7IwK@b+&D{r=_J`Q;tWF^1mT~cni|t##az# sD9mD&VF&ZKUol7vxM7!Z2 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 I>zopr0Bu4m=Kufz delta 93 zcmX@XxP@^-T$rP$i(^Pc>)UINf(!~Au8yYChHKKocs|bkxJjSkO+ixGcaK%8G7fZY pv*%y{gM_}#o7)xM{APu48T4AK*#77LED#0pJzf1=);T3K0RT%mAc+6~ diff --git a/src/bonsai/bonsai/bim/data/icons/lm_centerline.png b/src/bonsai/bonsai/bim/data/icons/lm_centerline.png index c49427f1eeedb3bb69927c011fa77518e9f29d8e..668c8217548801ef42bae48e787d70decf15bd47 100644 GIT binary patch delta 222 zcmV<403rX51G55tx>Qo5`PK*aN;Nd+*EpjQIS0qR2t054Mj5$%@% zm`7j^P)8uW2Q>4T??44qz(3dV)f5n8?C1ZQukA(@LCV|3;+NC07*qoM6N<$f_pY%Y5)KL delta 314 zcmV-A0mc5a0*(WaU4H=^Nkl(JZ) zBW$xb+^0yE3yG7yoVscEfCZqKz701=7pPADR4VD5x7!1Mrq0NmnC^fjIM{r~^~ M07*qoM6N<$f|K}?^#A|> diff --git a/src/bonsai/bonsai/bim/data/icons/lm_centreline.png b/src/bonsai/bonsai/bim/data/icons/lm_centreline.png index 718f41601ca68396b981debf444ed6fc4f1762ea..668c8217548801ef42bae48e787d70decf15bd47 100644 GIT binary patch delta 222 zcmV<403rX71G55tx>Qo5`PK*aN;Nd+*EpjQIS0qR2t054Mj5$%@% zm`7j^P)8uW2Q>4T??44qz(3dV)f5n8?C1ZQukA(@LCV|3;+NC07*qoM6N<$f_(B~YybcN delta 316 zcmV-C0mJ^Y0+0icU4H=`Nkl70(s(E`&fL6RgHfK0h@thOdl zRaFh3_rpncLN%imh~qe7=BUe*QZ+U=%8CFpXL=`O<`n?n3BADd1bzS;PEPo<=K(qZ O0000 zN;LfAPfK2a0L0AjR4sW-Io+b=ex$oGD+$083V;9zfB+!xQS6=p69DB@D5qkHAzDT! zYK;FsUV;D!fL{Pu=fG?Q5buJk%UE&|1Nsb10LsDZ0JPFTS~P&d{Wxq5%4yI5xHn+{ pXnUYrYrgZ|1ZbgXxHGxmgbQk0A~3FBu5JJT002ovPDHLkV1nusOke;2 delta 96 zcmbQpw4HH6T%?Pqi(^Pc>)Ue+1sN20oG(tXHPms6WI4Rx;Nzd ndFAxuCtrnW@2}@$Km!k$x}I{_&Mtmh36k)1^>bP0l+XkK`TimC diff --git a/src/bonsai/bonsai/bim/data/icons/lm_edit_profile.png b/src/bonsai/bonsai/bim/data/icons/lm_edit_profile.png index 16af577eecd72cf7323458e52aab97f4bc6ad8e5..5ca6dbe99b6353c1a79552a288e491be303a2d95 100644 GIT binary patch delta 277 zcmV+w0qXv~0qO#fUVryVL_t(oh3!{44#F@HoPqo(WoVGXD}syU4M?^Fuwqa z1|GnRmIk3*5J$?!1)0jydS}PST4Ra`d?L^wWoevNC7EU5k|3Go7{aY4FDvyYxU|-dI^U-T;9825&nNrv9nX)PE=TtVO{haju bJ%0g>OjimPpAMOb00000NkvXXu0mjfJ*Iv} delta 103 zcmaFGw2yH@T!Oc!i(^Pc>)Y!K1sN20oC6OTs!4ofI=mp2VMC0-{!MD{i%dhMOeYm? yGL|_Y-cS_n7GEW}>}Fr{c5?;05AWQ0;U3xUVpPmL_t(oh3(cs4uUWc1<)D8jr0a>kKx8dJ(DclaEwlS13gm5 zg-QwuBnIhc(Z8B7guL`GD61+F5m{^B!zUubL_~Z)4xaxSJ#{>{-!1w0KLQ6d-yx-R zfC6HS4+LO46&PdMd=Wyp6a_Hzd9*76fLBlfa6psIPbfe{_DKi;yaG6&uVCsvuy)`l zPyrQ?|BkOvfcL(gdvUF7rvm5P;09FcM0$X#-bTA30C)uzPysKTV<_;GZ_&vB0000< KMNUMnLSTX>1y#}j delta 191 zcmV;w06_ny0+j-gUVoxVL_t(oh3(d{4FWL?1yCD#BiO*n7&J)0Oi<7;Mx1N_BPH~g zy9SVd<6k;Op8OlLst#Jj%$SIXAIItKn~c+wx88RD_~4ho0n&RvKmo0_7ZQN4KvnO{ zVXgJz24Lp%%G?bAuOI+$fDq9e3NW)h5&*9N4v>`6<~`sM_&5dv5CCE3D-=*lnGO=q t;48>EPuGvN&_(zhQBw=zMwa8F_wa>d8vb-cmU6#pr9xy z=pDR-3mKcig+i$=yoo~h1J6wgGo`qib{6JeCXnwV$$N>I8GR<{l^z8E;qj!`OVIlc zL;?BteIQ*PaLx_P>>2p3s_Li%Yn1;~Jhs;cg~qKCC^fXvKZi=x2XLyY_Zxz{vMhfRfK5oOg2U2V z&}c*%aM4vSP(9Ui;1>84k#Vydwl1Ofel8+oU&oneQEs5*ms3E)1x zLEXr6QIUW#cg^!OZ*0HMXd%z%i9Mg0DMKm^1x-gVuZ9k3z77PkX7K!2>o*8u?tm$)0i1K}EX z2QUzvI1k`};Kum?3&JPv2QVNO@jKTz0Ni*1CIsZi>2nc(=N#iVfeCRQhT*L32<{Of z07d(z>ihnQh#mm!0K7^m%M<`b`=%OiLJ&THSv(ZM1sLNY2oAs+_eHn@oZ>zR7XT~H zMXUk5;v9qx5LFa+MF<>AiWS#ap63T4M2+dAv;oW$*gOtgCLx5V@H2^Ve+h^ZA6MJ9 uN_!lC08!)P(%y*~AW7VeIF{;~zvtgk#P5%l3Tp`f0000CIVmLqfZZ>{|554yd#R0Ttw&XW zQp&THZ%2VKCQSRBvlj&*qRTAuKnDs2fI5KKB?RzN1xP6!T0*(H0(Af}1>-+30J;T` ze2%ZG05QhU%D1DyIp?SS=S0K+nE5t~0?>hi0WbjG0M97!JMJr(00000NkvXXu0mjf DW*bz2 delta 181 zcmV;m080O#0*eBWUVoTLL_t(oh3%HX3575aM0drGw1XsNcoEc^{0A?Vk&q6wq^$Rd z2T?K~+&NAl```t#EFyFjUb^eU8AvcX0Z#%4s7nq@DYa057~__A-%?6~F@t?r-kHO3Y>Ez j6hK7gyn`!H00lSzd^R2)I=MHU00000NkvXXu0mjfZS+YE diff --git a/src/bonsai/bonsai/bim/data/icons/lm_merge.png b/src/bonsai/bonsai/bim/data/icons/lm_merge.png index 0f707f1db9e2b728183bf048924a7f722c6ab5e0..271766bc1fe10733133a300638cf3e0c2b606ed8 100644 GIT binary patch delta 1396 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 delta 487 zcmVv=5rJ0L+P;X~#bZQt zABJIHJC{+r?^%YPdbLxT2SHFXkktzfyLHWj%sg1H*XQxU%zp#T9M;+@GfxPQmjc29 zSO?M@z3JYeoUFA~5s3iQH+w)(1x%#P#IEK5u*tx$JTuX1wK@PgiST$bnT$2&08sgN zhoA~F5e>V!5XP8>h+M~GM6?8u36N$Eq?O?TmLtnN9bnH8dFI&wdx9u3&j;8M!pFQA zARA%{;59LpT7PpOS%&#{dX=cg9MBv_9?PLM*8vnjlraaAA0kgRoB7 z%fw#>6mQPV9T6GC2Qw#o#4V*|!f4HRRT9D+`=1~QVL+9OW17byoO3NBSHtVQ!PurSVxrKmpFRN_1+b?>`9x%w#%f$J6m_Ro|!4-S|ED0KwY(g3-RplTu{#}QP| z1*AHHCfSe_N6@SsAl4ByEr^J51kFoALXMzIQH;+KbgK(+IWdB+l@T^a(7iT9cf^2H m$H)9?1pt}=00001s(2$KbnU4H@~Nkl8unCsJ##iW1+DOYGZNW?OMdfD%fbNpmhpkb+_=w!b@1u+f%s&iT77; z*m*Pm%v*kbMNwolk*2BG0>p8=(bH{3!y@d+2O}dRhn#Z>@PDyXDvf4YHeqJ-z`Zn0 zZ^d!^1UT)SJ725SUKJINqUg4ySzxAADm`s98VRu9ITz*ge%OF>?kq3>oNP22$3h6x zKtFKJd%qjF2$VwzQ|%^m&dmV*W_Gn+uOA0a00SX}b1gR@Y0PZnd9Fx00AOajB;ClR z4tekAiU@=dc7IBuS!23IkALhRFteAya5G#mvq4GwBz*<$0@s`0-X=*hS5(-0KWk=t zfDdN&P|~Ge^!RB5&w~byR4RLWdU}=t1BN9HnSa?5@FGpqsg5XN5p(C92Mz;A z%xu)mCV?_AIX*t#-w`GB-jB5+An9oCJOLbBkFzYhxjmFHNs>3ME=EywLDHG#y(LMf z`2HmH_V(V%vg~pvl&~d22nq1s%-%_=Nm>L}B|WZIt7}~){9SYj{E;UtD&)P7JFbLz zPuOmfO*&D+yeDku0fC|Q!}d|ayeDku0pmCxWD}Hd!xOffq^pE~i!On09RhkhSA*BH P00000NkvXXu0mjfUkwXC delta 1035 zcmV+m1oZop1=$FYU4H}SNklE{x1D=^_xii4denc8jw! zOV)ygu7+9Bu4!nL34xdfyC8aDkXeC$z`W3IBnq-{cjuhFII@{(3SEUkAVo=3WXiJJ z%=dJ$b8PnP?pZG)Z}x?O_nYs1-shS5=6k-eD2hZLNs`#IWq-@&%$_~_@4>;r6riQ0 z<@VF3PyYqb+uQ4ghKA-T`pVz3jc;3&g-LK@hCSvg{9_ zBzv!-ocnoTVBknIV7Xil!!UdmAWhTvN~O|Wk~T{^lO)N>_V)G` z?|p})qkq+E^}9HZ*GsxP48wiJKI3))@CNWUfcJiBwOTztm4G;oJAo4bX4VOGNa_O8 zEX(EvLGV3eMpkvsZS&rL-N-SSfXl$WdHyZ%XOow(09c&omwhk!GcO69S(wzgwtwpP+xW_AEL3(PmO zCneSDxJD!DGPAkB+$_u1NqW}I4CsvG_)s$eX7&PO|ADPh6mr>~(b=mrNge1!QA;|@vP)oS&;_kI(wN75>$iTtT|nc35W zgM-(+_p5+Cz^4BG{&Qxw9@r5C!GUqO87G_(aH|FU1CcHQLW|@uIRF3v07*qoLVg diff --git a/src/bonsai/bonsai/bim/data/icons/lm_rotate_90.png b/src/bonsai/bonsai/bim/data/icons/lm_rotate_90.png index 9c9dd1161e6cc7588ede9242cd65fc293f283366..eaf26b2b5ff905a06a9a969fe6d94952987b2618 100644 GIT binary patch delta 1384 zcmV-u1(*8#3$+W7UVlPKL_t(og~gX`h+JnC$AACl&Xz1`x}DjLNx`C6i2*-|$@)Uv zp?hDZ8y73m&@BO>U!-aKMI}Wm3Q=jT+KL3hqGA;m(9Q1NnOyCrTdEs`zENt3 zBoSXiH{0x{o$k)ud;G97%VaaVn^u!NpYHSLoag-Rx#yned4FVPT+iXIYjhyDQV7Fv z7w~)F-fFda^lAfKl7TP`cS#zPwBVe3^=b!)whT0b9|bO?Y3e6Qa^_k9xD~-N@eE%34idInLP}g0b<}Butm})Guvur+a+yo^I4QMW@f)B7K?v4aNt1pKLMB- zQ55Y5o&d(vH2qSNB=5Ex4G#}*UR+$fT~e53*`5}VnZ53udu(7};OX}ZqE;td527{t z`}@0kdU|$C`a0k@(c zkOJQ;7K@L*muy_ph^p1wDI7u2!p4#bWVulI{cE0lq&uIXUM0{>@hk zpiY}n5Cl8>`ubijm&=P+x=<8F+ki6g3E-t%F1LGZZ0uj}86b)xU(zt}Ht@SRj$gja zNm395Uw@D^C~3aYXgr-H$w}Y$Z}dFx2rvZv&GWp0@$vC7b}&@ zYgv}<13r?^=kEY$*3JlU%FOOAl}Zn+3&2wQeQtbw{A^1om&=Q0HVO=?IRIbMv+V^s zH-9&G6nGbiT3Q^(7o2nV01IaJ_|VYMt?L2Y44l2pz`1ikU#V2OWpHq?2Pl}?CA;PH z^mH9KZDt>9*C!?>rp@eeU}Ku5KV1*tBCvU-fthUuXfzsmpbtROT!*zT03Tc_)@rpM z0DlMegkkvUwE+GK_)!#XX$ijXZvgHD@P9mSlce4z)M@}5SBg_pQ#DDC066Eqy()m2 z{R+5I(zB&fX&?;49iHbMk<<;4rfFT$#-?qj2DJ#NgU;;i>>=QcnceC8{zp3kRIAm) zz%R{grFK(eJq0M2%YC^c06?Wu*?(td zLy{hq^kAB%J6Jl9P_Nf#J3`=jTte)FHR5^aHj6|5*(nj^k6nOTe};3_o-kKoms>qbPc=-DzZG z~9hBwo=?&O0WFPJh|Baby4d{QOg9)`;Wy zdfs7i-Nl>D=D3*+0SDgc;sDm3foiqd*J`!KfDLALZxlse`+oqqce6Nvw|DQ}cda;p z1wpV6_{1WmSwqq>Gdq%H*=uI@H{dV8vvC~1_`e1?0DQDde+)QlnV2_$r_Ah;IF6rF z_cA(NfZ^fcRezr6Jp)`V>CPlc?(%*AT+j3RvMgKWoLejD5;MCBC<7OE#J>#eDwRr) zjE;^r&j>&gzVDv^v0Om4TK!0?)w&tD6j!#zdLl_z0o&s^-nC)^Gk>d8Dxa71ec-*o5#Y8sjvqf2 zfJHmu z6wU0RG)=eG>-BUwf47|BOeKn<`z2iq9F_D%&+{HS*-R{&0pIu66bgmwvn=a(&h3xm zcx<_K?tlCKdpyspNxHzy{#q;+pBNh(n{V4ImC7LSTi{$t-%XNa$4LRgFx(>Pr$A4K zeX39>d}e%n{7`355Corc&OI$@phNvU5X5mj-Qia@voYXoGrJ{g5cVAK$c~<0ISVxM;ynylO*|Fk|bMzNYV|J zO69|y1@fNQ1DtPW4|ey1tJP{nAOPNIG#WqYG`3o;U4Wc(pKI$RZ3gDjG<~2$CrLld z2Y>YG?ol?I%`XH00ydP(-CvVUo)G^ZwKj;$;ruvr0u!i_wqq60C=8P%ngn1z+B!ov$e3WQ|68LMz>Smd`;kl z_Y5#GG4TuF1z>ff(fGn~0ALzG(wgod-+%WDzz2Y{ec$it>FIfYZaT755lM$x*p8R7 z3AiVJ{Cc|=Tu%Nfa7`G7S9AtB=WYUu0L5alKg+V-JlT=}&bh-t-%>V!QmOO=@S3C# zmCNPzkgozW`x)RQ{W=W8b=7LMFAT%$oO8Q@8GtOy=7B=)zvQ=HQnT%|l#Gs!wtvj* z(fsk&;{XE#13v&Jfr}(fwpy(jNxzZwdte;Ux^?T0n%P_q(7#NLeqeSvfLwl==h$Rs z=5n&;?Cfk+(w!{qXa|6AluD(|!1=(;&Ye3mGn>grdNP2+C#xPs(M!NTfcK4zj9h+v zx~8V4-UjZTEBP66N#0M5C~+f8_fq@Qov zwCS8quQW}!0!SKf>m*G87X(3Ybyw2OdD3L1>iIDrNf)=z19hNxc6RpL?SJ(-GBOh6 zACeb`hK8PQ2Rr8;$dmlY_x)7><#PE-;11yRG)}q$rY7D3l9Pw8`$wNa8}6 z8&*CtH{>ff5TL|32sW|9a0k?|Vj66#&V!d>ed=bGo;)l@KGDOtz}(*?;lebzK37glY0C@gKkf z0N9>yg8+KXc#T|5O$p1nv9WO~ zu-ZsH0RVd66f{sGaE#8Gq!p?RNoyHdUQr^6ReazA6I%z~c-sWFR(6X6OE2bxtOeX<(C)K6swj zYHNxBG~L+`adND<*2*+}yleRWBFyS3R7|^e%6xS6mVew$Roo#{sgwiUDKUTHd0ybH z3C4j-f!81U!k%m=uYc7|26I35~3;fAU%Pye9NMoq3*L^p# zLG|%?e65H)0Q{9w)&1FQ_J?oNPXP)LZNNSwy(AJ{rn}qU+q$NvrsuvD^B;j#uIu&&v@43LK1g)Wjb2nP7^xO#?6eOka@v@qs^_aQhbmV9 zK<=hu4AnjXomY@P5Q)xS*YOm`aRz{C1^s1RU4Px8?(XhSKWJ4HRezG{_B)?p?2?fh z@bViR$Jt=a0WMZ+J|O@A^3nx(elD_6RX3Un&-1*lvg^VED4Z3KjIu~X7MqesrF(s- z00q-NlPoO!#-oo3MznHCNeKOXe{QD(;!lb6|9Jpq#AK5#fU1s^Ul2BceF)8-4d+vQt=*cQpXf7|*Fv2i&^nXk(#VU#a4H%$g0}`bZ zwGwM;YFgt#MFTu`pv{}!s+ECMD&=sC$YTRMa+qLcySPESJymqd;;9HEr48>p6vT85Z@~zmln9nabHzGRaGq;0MJAE z2{7%zGb?#LA_H11^@-t9p!6hJ5C=|*Qb$>RR<}Ut*@TJGK5jDR^cebHY z@pL-f01N^f9e&lLaU45K{nAd?&U`lzdFb1S{3K^Hb$-4dt*xyaf*|-F@C|nr3WaVz zf6-RcT>fj&(+()?BAM)y{!Flxcoaouc6Rm(u*ZA!T^z@YcGc3oo+^F?-0(~sU}oJn zOO=d{j(?s4KJwrn>g(%|Emb2gHsj(C`!nmAS$7k3uLaM;e5kq0BX({WhWmhUOhh_|hKBCFihtQ9aDNheI`Rlv3;LVXvmNdIFgZE-C$P1g zE0P}`9{#Kn-pVhWAaNWhTF5qL*6g32o^H0qfugD&uavf81N!-e`@oM5DCU5we&|3V z192QbSakyn?AqtLVyCLU=VkR#MO60zs`7_xh(_Ft1`)YkI|I)*jFXtP47q1LK&ez3 zuSJHkx+R#{^3+3;xL-LmH#ZllA}VgfazSs$Jpa9RZMiamJ&xnJs!6>Te@1V%fqwwO W5(4W*-0WHa0000SPacE`5e*G3{RNIio9I8#kdmd~ zkH4b7pqBoCG8IIEA_#}Kyhlr0Q%kfIv{%p+Md)eBLCwVS`5uV}?r`rr_udcZ4flwu zGD;*8i9a3Sx~>2iBi-&nOaT)K*bfr$WLee@a1#hXM5?xJzkjQ0DG&fqZbNFoo8N#- z$8l}}T-SXD&V2=_>S5QxhB4G{@Cxt}4u{V=7aYgA0Pg(&xT?C_Xf$3s7xn9rIciU@ z0k>xWAfrA;y&t z2}2&x)|wXTSAWCo2}wEQoxqT`#4G~e08+`;QB4DAzBbN&KsTjah;&_E&CQ{@-kUkD z*Kig-lHI0e7MSr10HVcifad$9jSrx#N;wk+kV>#T zFaUI(kZ}w|e#-EnCzQmXuM^pnP67W5;CVyx+X%b@pA;to%f4!zA!Psn002ovPDHLk FV1j%<-TJ0XVN)13n%9_~QMWozK5B*sMmvN%1$H}5G z<|K-uZ9swRAG1}}$whT36X(9~@A$sI)k)`MACQC9dF-eMTmV>WcSYpAlhz3UN)gc} zKoA5s-K4^Pp?|jnLHB5oHPgCw^xS56xH5~)+yMe^n^Bf1TK{p^W=gTSYXDH$kj>4e zhnz0wfYnxs>vlZD)YErE`p7K;6KMi~)nYSOipjFepD>OP8JQ$%jA8VV#7nzbhV7Aq zMghS~nx_Q-swIT+PNj4JV6IzXU=O83fFZ#D0r&#TmlDC^W+?Z)00000NkvXXu0mjf DXb8j( diff --git a/src/bonsai/bonsai/bim/module/cad/__init__.py b/src/bonsai/bonsai/bim/module/cad/__init__.py index 3f0ac8e336..cf4d5297a0 100644 --- a/src/bonsai/bonsai/bim/module/cad/__init__.py +++ b/src/bonsai/bonsai/bim/module/cad/__init__.py @@ -40,8 +40,12 @@ def register(): bpy.utils.register_tool(workspace.CadTool, after={"builtin.transform"}, separator=True, group=False) bpy.types.Scene.BIMCadProperties = bpy.props.PointerProperty(type=prop.BIMCadProperties) + workspace.load_custom_icons() + def unregister(): if not bpy.app.background: bpy.utils.unregister_tool(workspace.CadTool) del bpy.types.Scene.BIMCadProperties + + workspace.unload_custom_icons() \ No newline at end of file diff --git a/src/bonsai/bonsai/bim/module/cad/workspace.py b/src/bonsai/bonsai/bim/module/cad/workspace.py index 501fbdb11f..28ed2a0e5b 100644 --- a/src/bonsai/bonsai/bim/module/cad/workspace.py +++ b/src/bonsai/bonsai/bim/module/cad/workspace.py @@ -24,11 +24,48 @@ import ifcopenshell.util.unit from bpy.types import WorkSpaceTool from bonsai.bim.module.model.data import AuthoringData, RailingData, RoofData +def check_display_mode(): + global display_mode + try: + theme = bpy.context.preferences.themes['Default'] + text_color = theme.user_interface.wcol_menu_item.text + background_color = theme.user_interface.wcol_menu_item.outline + print(f"text_color = {text_color}") + print(f"background_color = {background_color}") + if sum(text_color) < 2.6: + display_mode = "lm" + else: + display_mode = "dm" + except: + display_mode = "dm" + + +def load_custom_icons(): + global custom_icon_previews + if display_mode is None: + check_display_mode() + + icons_dir = os.path.join(os.path.dirname(__file__), "..", "..", "data", "icons") + custom_icon_previews = bpy.utils.previews.new() + + prefix = f"{display_mode}_" + + for entry in os.scandir(icons_dir): + if entry.name.endswith(".png") and entry.name.startswith(prefix): + name = os.path.splitext(entry.name)[0].replace(prefix, "", 1) + custom_icon_previews.load(name.upper(), entry.path, "IMAGE") + + +def unload_custom_icons(): + global custom_icon_previews + if custom_icon_previews: + bpy.utils.previews.remove(custom_icon_previews) + custom_icon_previews = None + class CadTool(WorkSpaceTool): bl_space_type = "VIEW_3D" bl_context_mode = "EDIT_MESH" - bl_idname = "bim.cad_tool" bl_label = "CAD Tool" bl_description = "Gives you CAD authoring related superpowers" @@ -39,7 +76,7 @@ class CadTool(WorkSpaceTool): ("bim.cad_hotkey", {"type": "E", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_E")]}), ("bim.cad_hotkey", {"type": "F", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_F")]}), ("bim.cad_hotkey", {"type": "O", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_O")]}), - ("bim.cad_hotkey", {"type": "Q", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_Q")]}), + # ("bim.cad_hotkey", {"type": "Q", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_Q")]}), # Apply ("bim.cad_hotkey", {"type": "R", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_R")]}), ("bim.cad_hotkey", {"type": "T", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_T")]}), ("bim.cad_hotkey", {"type": "V", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_V")]}), @@ -47,93 +84,47 @@ class CadTool(WorkSpaceTool): ) def draw_settings(context, layout, workspace_tool): + ui_context = str(context.region.type) obj = context.active_object if not obj or not obj.data: return if hasattr(obj.data, "BIMMeshProperties") and obj.data.BIMMeshProperties.subshape_type == "PROFILE": - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_Q") element = tool.Ifc.get_entity(obj) if element: if element.is_a("IfcProfileDef"): - row.operator("bim.edit_arbitrary_profile", text="Save Profile") - row.operator("bim.align_view_to_profile", text="", icon="AXIS_FRONT") - row.operator("bim.disable_editing_arbitrary_profile", text="", icon="CANCEL") + add_header_apply_button(layout, "Edit Profile", "bim.edit_arbitrary_profile", "bim.disable_editing_arbitrary_profile", ui_context) elif element.is_a("IfcRelSpaceBoundary"): - row.operator("bim.edit_boundary_geometry", text="Save Profile") - row.operator("bim.disable_editing_boundary_geometry", text="", icon="CANCEL") + add_header_apply_button(layout, "Edit Boundary Geometry", "bim.edit_boundary_geometry", "bim.disable_editing_boundary_geometry", ui_context) else: - row.operator("bim.edit_extrusion_profile", text="Save Profile") - row.operator("bim.align_view_to_profile", text="", icon="AXIS_FRONT") - row.operator("bim.disable_editing_extrusion_profile", text="", icon="CANCEL") + add_header_apply_button(layout, "Edit Profile", "bim.edit_extrusion_profile", "bim.disable_editing_extrusion_profile", ui_context) - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_E") - row.operator("bim.cad_hotkey", text="Extend").hotkey = "S_E" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_T") - row.operator("bim.cad_hotkey", text="Mitre").hotkey = "S_T" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_F") - row.operator("bim.cad_hotkey", text="Fillet").hotkey = "S_F" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_O") - row.operator("bim.cad_hotkey", text="Offset").hotkey = "S_O" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_R") - row.operator("bim.add_rectangle", text="Rectangle") - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_C") - row.operator("bim.add_ifccircle", text="Circle") - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_V") - row.operator("bim.set_arc_index", text="3-Point Arc") - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_X") - row.operator("bim.reset_vertex", text="Reset Vertex") + row = layout.row(align=True) + add_layout_hotkey_operator(row, "Extend", "S_E", "Extends/reduces element to 3D cursor", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Join", "S_T", "Joins two non-parallel paths at their intersection", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Fillet", "S_V", "Fillet", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Offset", "S_O", "Offset", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Rectangle", "S_R", "Rectangle", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Circle", "S_C", "Circle", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "3-Point Arc", "S_V", "3-Point Arc", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Reset Vertex", "S_X", "Reset Vertex", ui_context) elif hasattr(obj.data, "BIMMeshProperties") and obj.data.BIMMeshProperties.subshape_type == "AXIS": - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_Q") - row.operator("bim.edit_extrusion_axis", text="Save Axis") - row.operator("bim.disable_editing_extrusion_axis", text="", icon="CANCEL") - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_E") - row.operator("bim.cad_hotkey", text="Extend").hotkey = "S_E" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_T") - row.operator("bim.cad_hotkey", text="Mitre").hotkey = "S_T" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_F") - row.operator("bim.cad_hotkey", text="Fillet").hotkey = "S_F" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_O") - row.operator("bim.cad_hotkey", text="Offset").hotkey = "S_O" + add_header_apply_button(layout, "Edit Axis", "bim.set_arc_index", "bim.set_arc_index", ui_context) + row = layout.row(align=True) + add_layout_hotkey_operator(row, "Extend", "S_E", "Extends/reduces element to 3D cursor", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Join", "S_T", "Joins two non-parallel paths at their intersection", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Fillet", "S_F", "Fillet", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Offset", "S_O", "Offset", ui_context) else: if ( @@ -141,54 +132,29 @@ class CadTool(WorkSpaceTool): and RailingData.data["pset_data"] and context.active_object.BIMRailingProperties.is_editing_path ): - row = layout.row(align=True) - row.label(text="", icon=f"EVENT_TAB") - row.operator("bim.finish_editing_railing_path") - row.operator("bim.cancel_editing_railing_path", icon="CANCEL", text="") + add_header_apply_button(layout, "Edit Railing Path", "bim.finish_editing_railing_path", "bim.cancel_editing_railing_path", ui_context) elif ( (RoofData.is_loaded or not RoofData.load()) and RoofData.data["pset_data"] and context.active_object.BIMRoofProperties.is_editing_path ): - row = layout.row(align=True) - row.label(text="", icon=f"EVENT_TAB") - row.operator("bim.finish_editing_roof_path") - row.operator("bim.cancel_editing_roof_path", icon="CANCEL", text="") - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_R") - row.operator("bim.cad_hotkey", text="Set Gable Roof Angle").hotkey = "S_R" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_E") - row.operator("bim.cad_hotkey", text="Extend").hotkey = "S_E" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_T") - row.operator("bim.cad_hotkey", text="Mitre").hotkey = "S_T" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_F") - row.operator("bim.cad_hotkey", text="Fillet").hotkey = "S_F" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_O") - row.operator("bim.cad_hotkey", text="Offset").hotkey = "S_O" - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="2-Point Arc", icon="EVENT_C") - - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_V") - row.operator("bim.cad_hotkey", text="3-Point Arc").hotkey = "S_V" + add_header_apply_button(layout, "Edit Roof Path", "bim.finish_editing_roof_path", "bim.cancel_editing_roof_path", ui_context) + row = layout.row(align=True) + add_layout_hotkey_operator(row, "Set Gable Roof Angle", "S_R", "Set Gable Roof Angle", ui_context) + + row = layout.row(align=True) + add_layout_hotkey_operator(row, "Extend", "S_E", "Extends/reduces element to 3D cursor", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Join", "S_T", "Joins two non-parallel paths at their intersection", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Fillet", "S_V", "Fillet", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "Offset", "S_O", "Offset", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "2-Point Arc", "S_C", "2-Point Arc", ui_context) + row = row if ui_context == "TOOL_HEADER" else layout.row(align=True) + add_layout_hotkey_operator(row, "3-Point Arc", "S_V", "3-Point Arc", ui_context) class CadHotkey(bpy.types.Operator): @@ -196,6 +162,11 @@ class CadHotkey(bpy.types.Operator): bl_label = "CAD Hotkey" bl_options = {"REGISTER", "UNDO"} hotkey: bpy.props.StringProperty() + description: bpy.props.StringProperty() + + @classmethod + def description(cls, context, operator): + return operator.description or "" def execute(self, context): self.props = context.scene.BIMCadProperties @@ -260,17 +231,17 @@ class CadHotkey(bpy.types.Operator): si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) bpy.ops.bim.cad_offset(distance=self.props.distance / si_conversion) - def hotkey_S_Q(self): - element = tool.Ifc.get_entity(bpy.context.active_object) - if bpy.context.active_object.data.BIMMeshProperties.subshape_type == "PROFILE": - if element.is_a("IfcProfileDef"): - bpy.ops.bim.edit_arbitrary_profile() - elif element.is_a("IfcRelSpaceBoundary"): - bpy.ops.bim.edit_boundary_geometry() - else: - bpy.ops.bim.edit_extrusion_profile() - elif bpy.context.active_object.data.BIMMeshProperties.subshape_type == "AXIS": - bpy.ops.bim.edit_extrusion_axis() + # def hotkey_S_Q(self): + # element = tool.Ifc.get_entity(bpy.context.active_object) + # if bpy.context.active_object.data.BIMMeshProperties.subshape_type == "PROFILE": + # if element.is_a("IfcProfileDef"): + # bpy.ops.bim.edit_arbitrary_profile() + # elif element.is_a("IfcRelSpaceBoundary"): + # bpy.ops.bim.edit_boundary_geometry() + # else: + # bpy.ops.bim.edit_extrusion_profile() + # elif bpy.context.active_object.data.BIMMeshProperties.subshape_type == "AXIS": + # bpy.ops.bim.edit_extrusion_axis() def hotkey_S_R(self): if self.is_profile(): @@ -306,3 +277,52 @@ class CadHotkey(bpy.types.Operator): and hasattr(obj.data, "BIMMeshProperties") and obj.data.BIMMeshProperties.subshape_type == "PROFILE" ) + + +def add_header_apply_button(layout, text, apply_operator, cancel_operator, ui_context=""): + custom_icon = custom_icon_previews.get(text.upper().replace(" ", "_"), custom_icon_previews["IFC"]).icon_id + row = layout.row(align=True) + row.label(text=f"{text} Mode", icon_value=custom_icon) + if apply_operator in ("bim.edit_arbitrary_profile", "bim.edit_extrusion_profile"): + row.operator("bim.align_view_to_profile", text="Align View" if ui_context!="TOOL_HEADER" else "", icon="AXIS_FRONT") + + row = layout.row(align=True) + row.operator(apply_operator, text="Apply" if ui_context!="TOOL_HEADER" else "", icon_value=custom_icon_previews["APPLY"].icon_id) + row.label(text="", icon="EVENT_TAB") if ui_context!="TOOL_HEADER" else row + + row = layout.row(align=True) + row.label(text="Tools") + + +def add_layout_hotkey_operator(layout, text, hotkey, description, ui_context=""): + parts = hotkey.split("_") + modifier, key = parts + op_text = "" if ui_context == "TOOL_HEADER" else text + custom_icon = custom_icon_previews.get(text.upper().replace(" ", "_"), custom_icon_previews["IFC"]).icon_id + modifier_icon, modifier_str = MODIFIERS.get(modifier, ("NONE", "")) + + row = layout if ui_context == "TOOL_HEADER" else layout.row(align=True) + op = row.operator("bim.cad_hotkey", text=op_text, icon_value=custom_icon) + + if ui_context != "TOOL_HEADER" and len(parts) == 2: + layout = layout.row(align=True) # Create a new line for hotkey display + layout.label(text="", icon=modifier_icon) + layout.label(text="", icon=f"EVENT_{key}") + + hotkey_description = f"Hotkey: {modifier_str} {key}" + description = "\n\n".join(filter(None, [hotkey_description if description else ""])) + op.hotkey = hotkey + op.description = description or hotkey_description + + return op + + + + + +custom_icon_previews = None +display_mode = None + +MODIFIERS = { + "S": ("EVENT_SHIFT", "⇧"), +} \ No newline at end of file