From fb83e88659f0dddd08dbcdcf310a37517e1cda9f Mon Sep 17 00:00:00 2001 From: mpa Date: Thu, 20 Mar 2014 17:29:38 +0400 Subject: [PATCH] 0022378: EDF 2273 GEOM: Select a point/edge/face/solid in the "Set Rotation Point" window --- .../gui/images/set_rotation_point_dialog1.png | Bin 11621 -> 12249 bytes .../gui/images/set_rotation_point_dialog2.png | Bin 10835 -> 13592 bytes .../gui/images/set_rotation_point_dialog3.png | Bin 0 -> 13389 bytes doc/salome/gui/input/occ_3d_viewer.doc | 4 +- doc/salome/gui/input/vtk_3d_viewer.doc | 10 +-- .../OCCViewer_SetRotationPointDlg.cxx | 25 ++++--- src/OCCViewer/OCCViewer_SetRotationPointDlg.h | 7 +- src/OCCViewer/OCCViewer_ViewFrame.h | 3 +- src/OCCViewer/OCCViewer_ViewWindow.cxx | 38 +++++++--- src/OCCViewer/OCCViewer_ViewWindow.h | 3 +- src/OCCViewer/resources/OCCViewer_msg_en.ts | 18 ++++- src/OCCViewer/resources/OCCViewer_msg_fr.ts | 18 ++++- src/SVTK/SALOME_Actor.cxx | 32 +++++++++ src/SVTK/SALOME_Actor.h | 4 ++ src/SVTK/SVTK_InteractorStyle.cxx | 68 ++++++++++++++---- src/SVTK/SVTK_SetRotationPointDlg.cxx | 49 +++++++++---- src/SVTK/SVTK_SetRotationPointDlg.h | 13 +++- src/SVTK/SVTK_ViewWindow.cxx | 5 +- src/SVTK/SVTK_ViewWindow.h | 2 +- src/SVTK/resources/SVTK_msg_en.ts | 18 ++++- src/SVTK/resources/SVTK_msg_fr.ts | 18 ++++- 21 files changed, 269 insertions(+), 66 deletions(-) create mode 100644 doc/salome/gui/images/set_rotation_point_dialog3.png diff --git a/doc/salome/gui/images/set_rotation_point_dialog1.png b/doc/salome/gui/images/set_rotation_point_dialog1.png index 9d3b89eb8c0e2ca2d8be59fe2c51f139e4b2ab6e..0904b433b16f7fa9578c1067b8db807b5006aa28 100644 GIT binary patch literal 12249 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 T>tsP^5kyH|U9L>VJoLW+rBfXm literal 11621 zcmbt)1yodTyDy=lfFK4PiXzey(jht^NJ)1L2uOo;3n(cdEjfxH(#_B*-8sS#k|Q~E zGjrbg|G%@&J@1VoVz4{fu@AFJhRP=O1kFDYus;fYYCbAjc8z__ z=duQb!5l(S$SfQlUZzP;^UAaD$9;C=VYF~t=0^-Y5lxBAC;ZnG!J1W+k7m@q*u|#K zF?}uNG8{P^`F?P*6hqW6fy!WEt%0REJKR(VncVYy-E3wAfk3PuwOE(x7%3cho&6kh zRfj;b?#U?;*%%5vgFt8#Z@lX}ueA>j4HdY35AQ?9KRz}#n~u5igG;{-eUyPf6tig} zLPI~lMyvBd|vk_)lHRxa-Yu$r%Y@H}&KiU+2PPReBBvA|j}^y|{iq zDRI6+$CyHY_Nl%Dp>|{T8XOVaY166yS?2XTKBqnFhse5xu=e7Oss*H%5yq9e zS1wEZyj)Cur27n~9Lk zk9~-^>bOdh3)c-Yo_#wfG*Hcu@6veNA>riq38S%u`KI&OwWbDI zBct_Rb)$5~Vuy!E$o%=ZbVpzBH&b0gZF*HCQ7}ntDQ7;6E~>?M#(xWJL___AkT+-X zR$5>)qq~)`k&e3b)Vq{)A%AFOG3oZ@xP>E*e7d`wSs!T>yvF()rAWy$w!fZN?-8ms z>L~lHb5&TOmzQ$s)dX!(@5=9R6~Q3o+(B%%x5MYJq6!*#jT-dx5F>-lR#YE9hM=Qc z<_#Pv6Z@RKsY>)r?Ad>RDAjI0NNVnp*v`Q=-~e1_aA<)B?aX}f_nr%Y*L(2|wt7n)W1?M}9cr7mqqZ?sWk+E)24!4##&yTGl>6uV zl^W0CZo8L*;ewj8gN|Yb4D0%29BW{`cW4t33|))d*I$_P$EFPEd@l@64)XD*B4;1f zBC7Jg`qW-pS6b7S9(+!m5^`d}$z&U}FFw~&YoqYFlu|jvI|;MwSB)apDPzc_J*g5Q@sp%Z)QY#X z4&-_IVag}KWcCyWi%@#@^?3#Qsjkbc`M6}Y1S7`5^5nqw(IK}4yje&;d8qBkUH9zv z9Hj+$!9Ww{sxE3E#%J%A;+p26%?}T$7Wd}4q|5%Z8@i4QYe9>d0dC zhZ?6=15%DJiw|MGU@=G{LXL9tUp399#cC{_#u1=z}r$jFmRKlFj!# zZ(MD!G_C7mB-`PdIRlw?<_DE!otf+hnp*C6qw56d6C$0IV1!3i5`VDXJ6{hmXGfJ{ zT?@}QIcDaFQL_{Y&gF~W)7@`L6!yNE$h$M&;lzi)UQ?M+d9P6dvp?9IVD58&Tdn&U z?f0JHwCa%I+>TOsF_3{3`kM94#5n!`W)P9}xWG(v`taO9U4xFx~4K2_vR zXsgZyNN&}RWA)8DH+n`m>h6%UGcnpn_b;3^c?{(i_|2*5d}!*q*~;rx@{#ezwbCPv zckEUj?T+J9-yyg0+ckVz;zBe{i5Bzx!)vncWXzaadG3WNrP`{U zhM&7GRG@o)kPR=Rogcto>$B&9c~i|L`Fa_RW100l)%cm*-}{!&9|sNB2TIuOWD4Sd5p51E;7 z{=ie71?YH5Spmw-Y|75{AuKdBSHO&df{;p<%8-cAP6pZ%w^N2Zd<6r&@ zg9-k^teSdg2Cd+eV%|+9dDY=T zwiX8UMSqM{b#=*M1Kc*75Par6w{PCMwVuVrrB`7xxoiGCNnhXh{CF{1_k7kAvzyf9 zsM;rkXFF99c8gVcsMM^}Iw>_Nsk8M1N%HZZpVph`9gmVp+wme}h;>m1E1K{+`;(oH zRv|e#x!=L-4ko|f1=OFcq~g7{u;7EXUb3%lfnRKuy2oW?FuqEz88Ao@axgMQ9&RE} z4kDW@hMJ|PJv-CWgq;Y4{k1fGR#f8?#f6gZ1%)`;72D{--O{DdEB&c8-1DMW<^(>w z&-&#+Xk^T_v^u_{g>v8r*3bX+P2=${2|d}1gPzag$#YoDQNd{^duwYeyRCxj z*>S${MR@M$_ucL1`$T~*Mi+s~ zmn5$)u%D?dU1Q3xMrFia+=-deUd%4ZOeSt#HsrBHMT-rRu*nf!q!#@tm){|_wSG-3^g@E6+t$1J^(p7<@+vGb z>FNEAzGu{;E|2iw(_SQIveDQ6@Ls)seYwMU?rQV6MA6FjeA_!TUcEmSbJLvLsJ^<# zoL=1HQ>uOKwRiJvA$y0gxyHM`^%sXoaP|yGk#*7Ly-CB>PK)nOjrH!DsT=v{t0&Ib zTORkf<&SGo@WQN6I^pqmGg!3%yWGBO119AjAXbNx;ic^CzgG{rqq-=80#nPCmpsw zH1rBPCz#p~gJ=3BX&KQxQB9B}s5ansL(eLWepeFl+@vG$H9=dE!C8$VUj5Td8W;2a8 z`TOH3!z7iwyhODPoGu?tJClPi1=iIOqgnE|ypC4;nNV1YV#E>I#PZux=gtAXb++C$ z|H7461#WyFqFyov(e33VV}eGG46mcD>rcy9`X7@9HFzHpT=E%dup0et;I*2K;nObC zp>afpLu6!ziwwmYPyLPYK{)5JZ!*1M!Z-3-WhtuPeVOQ2AJ3+ua*vCvaQZE)N=6^Q zddB?m&LYMxRmkBX3rn`F*)2*+SwBBXdpKQlyc1>2lz9)Re{X+nVYj}Inx_wtuqQM) z`|tG&d3yDXa(dZN1Ve|iZK%NB6CMxHh#xlxrAhkI=J$t7{2VBlY-EX%iJ;tR-KU}! zHo1H6@WwQ^5Y`!i1-DF6UB8{~kLOr7{j;Nk4_)br*}qIewf%F6^|P2IHv_7y zUZYJnu~FmC1L^M5@&*RQ5lR~ZgYI>TpI{-L;dK$G98Hde8$x=waZ=9_FJwL4naz@ExJ zDRrVyf3G!y2TzkJm049)b^2{D*FG8n`}60Gr161gW$(?HTB!VtTQl7#bNG)g*|h#% zVvo+Tcn#S|+V%k^cP+2((sAo-yVNRIzZxfB*TW56to#{Rd`wD;-c}7QMNI7tN*X0M zBgs{o$#GceZC@pYyVBY0DB2~Tbwn{LLEGpa)>cv}MPO%;4+05PjZA8N>2Gb+C-i3M z?v?ArJ|{|$Ebj3~C2y=004j|>N%>#F-CyXKXYIc$Dfn=r&kexzCwT=PYz{xW+P7kt zT>ESQ)zbjC%59E{tT*$sALFF#{{Tk+1?p;kLlfucjm3{m6(~a>1FNHOmBMk&{D8|Q zOI@bIna6%I5&f zv+m_zICCy6&|^DSD7L*j-%W)G%Y_WIhrd-rq-wKBZc*zD_fI{5Z101{&_j>>&bc8PmQ z1z>U|Bi-KD^th8EoEAHFc37GCzhLn|S(y}>e4WwrlVa^RK<7JKu(;H=zz-y!`OJw2 z#4Qs>Irg^1(7Pun*xtCdF~u#qwy!WUr%@%L;R0R$TI2DH`g5feK_~!b0h@`BaWt&G zTtcBM&feFg93PU~4EAuX*Vd&c`T3VDJK77Cf4#lfa#_#5NyZZW;z_6Bs84}eq z_EQyBZQ%J~VPVjzF{`uzF(oYKqEv^oK&Lbla$=s1{#6>3mG!`Yn+nGRS^_Uu*iM%9 z9X1?H=={~#z_-BDHj$NguV73y~8@>jCLO&j0Z`0 z8k;R)z8&?Rd(^^j?w*{SR6ZtV*35C{yg8Pk=oJfUPpRv=mZ1G~*HR}dzeOMQ!*hEA zPfyRR?^&^N>21?XH6GV_f}tjrdRDUqA|Yf9t?LJNVm?dTp61@9fIw_)*aFhjIpaR3 z1P=a!XdiWPG{-8+p0daqmGleon3R)}L@>YbXRLv0GFcsA^!&XC58jKR>*GKO$tx(d ztsf9Lu8pygF^YG69ySwpUAukF_m)nz$vvZD_|H@xaJ_&)JjH$4PZ=4?$SOM#$KQCv zs>AdmUP}ZLYs^o+Wk0^=rInvxQ&bb|cX7)5y6Xnu37t3+HPF*xT3P~ffbWO{W5BWQ zsVzEVb4+&XR+m0KZ9p0w0HqeN9{W>&kt$&SOheta8pR5=zpxyAK{fidnAd=@G|$Nr1ry zgRj#8+SzR8@#qof?>QT+lC3Q#NS=Gle1S#{UcAmLid(e4RKLaMn;hmO7Zw+t-itnZ z^r(5$E$O75Bb^aModQoo{Bm#7D8MJlvvYp0gEiM#&de@=cb*%iojS)I&*;gBtgNg! zbxPhLFx#}?Trs}khdf5IuNUQ}s_c4u5;(%p^n+B!egRa*CTtRBY=*L`cq2CQfxzaw zSwR}z(y1V2G0~?hOiu=KZF8#940C=`O>9Wb7z6@y)?@LyY}EDzeGqcfV(f>ifoFSy zK$LCY(AVdyBiST?(r_BqR^ak=Fy%=Es9ugMeKeWhzIme3-G#yWk_VB1p)WWJANQv> z;rsCCTV{9$r-sb+f&ZSD$7VLhH%ggx;7T2kL0`bmzkfnZ_$a2hj1LkR!{Um>cTkLY zl*vrzB*??@o59S?R3Yu^b%^y#b_OxG0&BWuDxf7szAMqqy&bFBqrH6ja#nWsN%76{ zNm~HPHyIhD5bN!xrJs_MHJ1R6#IeAE{BJH^Iy%%&PEO!(r|pG8$eB98 z)+0M8x%7rWu>0*O*Fc?e)Fxxky->(-p9MaDD>|N*3 zE_#h9GGy7+)CiWl%joszD?64^!6(PVZFBaHBc`P5P1)YA{9xCF+UH9`(eqGjz(vB! z$?A~G@^|fcEiJFvRdF}0yL+>pxZlFDC+pFL9mjTw-B}eM+F`mnMhdeNy@W#DqM_-| zl!*}bJ}hwP&ev%S@40bJR*(2r?tMU|RuD~?C%Cl~YKb$F6Oqvm*+AAL`gI^{ue97K zbteOOq$9?NQc7`h^KbFG8h7*`diEb^r1lxuzTgIX%W4 zcbS7k)%K#Rik^7AL8I{Dr%bxjqiL6)crjhp-` zPgSF*utkrb&jEow@@bXB5GS|)24dejFvZU=n>ukCdE~G8ywv`O;F6D0$xr}8&kO?O{l}))?nwyutU49wGB&7@@ zmKz??*VhL_uI!kUPv#A;htHg(ig_NTyPs@6Z(8189mUJa$}%a{!Lf(#fdR4~{>&CQ zDj=7^Po6U>52CWHtn3jd=Ou8Efq~})q|wp<^aiD{;@*cFEt_sYInY@QW+*8tk_LA+ zgTkzlLiPL4@HfR&!N|4{asYEQg0|EkS(jaAtxk{7(e0+t_V7C_Q#u+UQ0lCl9OvZ( z?cE-Z;-LyFbsVGud;%;4q*aMY3xQsht-PKdEdc(FU!`r>BT&n98@!$*CnrB(WsL)p zxgvM8r%;TCCmLzr5E&RqaC)%bSpsdN7J2&s-1L!ABIRHmv6nh`9-LoPo7XBh?T@`E zFltCCDBuJfzOB}ET?cN@kfWTw00>OB!(1aOvNtkJh|g|Kfb7C06wqP3M8Ar7aJ+;i z{#ZYM>^ownBNm0k?Zs%RT>!Y{=Dn1%AE{eF>0F&Cq#Kkx<20;uJ4oVCi_yd0d>K7I zT*x@fO!s2$HrjybOe|my7YP+Q(*|O9f*J~Fvx|#)K zFU~kv=}T|Ju;XX3#jqd6+h2jkk#r~6h@l@6V_ z?LFOb`KKhM7E%Xp02&LNyEIU_cF3yb<^V#-3z_o4U)s%mJ5OuEH@BefydZfay5zv{Mm2cI(p_iOw0Vb+tJ}&#Aa*2)u}56e-?Pg-0*6 z5HT(#TV_Dpckk?POvXhut#!@c4^g1kVE3LTAt4cQJ|x9OF4A?5@8V>&9&@@*${-jI z=%c9nmZF|licy;y8`lT<1W;;76b)L_+VNyV8M8b-o4vm2C@!R@B^gjlJH=L<`&lZ6oCSr!$~ zg53j%={ZpU7ODE6QC%Da&LYyGX}Q?{g5%ah#k*2cu-3pt_H-@M|tZ&PlgE3pp+1rr}C zrQV>RkuElB_$=c5&^@w|WIKI(4(`AN>N-nDLs>mV426MH`yEb$>Q7(Wf)@_Fy8HXv zDb~J#CBu=1D|^8dP=eb2sd(CGr?6ClwhUZ|n{J8PBHzloKK%<4Qdh=8&Y!T2J0fm{61Y0W{Ez9%?r5s&S=?$b_0x|6ynt{{!WYC;3# znI5Q~{ms&ZrIWTU=-G77y%k>IY61tP5K(*y!cTcEbe{LvW3{s{MT7+GbMJB{C@_66 zDJJc&ByDD&($f0q9O_%TC>mk1j&(C1X`h616jzU6qZ)n`gzv7PPdDR#2!Ybzx`+hwx8WS(xujwDGy$VpoS|UR^;I z@Nvry3x62P1Yc*6-JO2zcZQt13AhH}Xg)2u;nCi}Vskp)h5~E1Cz;=}`f$qTWGPOC zTGB@t2n4T-mrpr!kz^ibdJu{`lcD9Fy7*{nx?B3oy|U`+YB;#mL_U&k{RdIojf5U2 z$`TXHDJbk2vsjc*hDJuRh>Oz~BO*Xh@$<(42XDho4Dh?xsDbo^mCJKwss;vW{+{ft ztRXnZ7i1N#g4NAzAmPOjIt7HP!9QVfzjF35*=X(Tt+J_`a&!b-`2wl^vS7e&AVR^6 zma8~EbxMG;`aFazCNAzdfIKT?6_*s|_`W^7uCJD*T4I0bxh6&;@mP6hW2%AU_c=6X z_%&)dE+fY9EMR$rEJ@3XiGm_Gc~0rrurRNkHyOMma2NM3z!l2BI|MGfpgI4a8|#vu zJpVyz{?BfLwM2=czn_<#HXAc@MMxuP)I-((-}?pD`-ae+ z^o4%w5bzqnjd3zgAVk5Udi$z?i$eJ2zqLv<&+=wGbYUTb>fdwQ5#Su0Rgsj`T49AEi0 zan?*QR4?NU6r@gbVEd7fNooAKzV%8sYsS)OldoRBtF^67bO(GsZ?n|yMgSoECZ&2M zdIhKpyGlI;artaNHd-;Pu(d7S?FKix?^h^vzAWMYs81bJ!IW0&mg)&qU5_-XyRH&+ zm6I|8Z5TCf(QZ)*EkChuN3VD5N}Z4k3+6i*6w)GtA;mMnxzJ0A&Nk(Oy@Nyh?gp?4&T*e-30FR zM>?SaV?SkOGUc4OnL2mvI&{kdu=GPeetdmOGJ1iOoqK}o)O5^AHBK#C+Xi+1;x&_( z$^bo$A}05pKK{YSJHuh)?COhuO*1S!+!T25IOsLTH1SN4l#$;Pqul(ACWhxYIQf`rsEo`g@9nZN;J`ZZmrR zC+Zm)frxdk@~u+~FtHlm9a$iUWe07%c89Tk5GeHCQDjrG?6Mb^5vNw9-Q#1&?huwO z?D9<0Ht@Q5w;G+sxz)jTcgNOlz7zT`b6YhgQaCl~&UREOZ|OLu|12z8G0VI+vA__X z*vaVq5m*Bn`Sja{Buuw%1&&x6tWOl0t?{dS0$Z&H=lNIp z(AZ5?F17Kw zdh&>m55;(3`yV%IPnIq?_>H06u`Crf$RfzAZh(V{F>sBBrzDu%ihhf>RhPFwL`!;L z2?4hr1b7Te<$VExG1%c&9r|tm6U5`UOLG2tJNhywd8u0Ghrn6KEehui80nSFvOCYX zB8L5+`s3`cCDw410b>@SM%BSSnkD-q|?GQ~5$8^^0euW{NSidgvg zVu6fQ)6w}eH=8L#0`!O0w=ynD5}<+4&wYv-4)p|We>K0uC-hi~c>y|XKr|0zNGLpe zMgZ(Hlc6utn2H5Bh*F`#W4oP&cJb|ILX;i(ivHb)il5&h*3ALi{~igZ;n9Iue!J65 zNdDMs|BXGZPn>_9QC*8~zFlSGZ8zWm*(=t^;Mn+tzJn9!^x=9>n%p^ZfDZDO^1cra z24=!l*Y`I~$>;O7v`ewge$N=b(u=x;f}jURUobFp9A?uBIE{^uHYVG^bcNkEbi&?p z^k~miFu#aqTrTV7UhImw4|(wdD??e~gzy0Dz5a2V< zo(WV@y}Y}4wy&-N8iWH2M^uR8pa`$ciHxTmRTW;9w*`Ty==jL+9L1fUyt7M+>vfd_ z8%=$^M6VDK7a&`%;9(Am{fBWr(iAWa<>ck@e*-Fdn3KT$t=?x`iKEP8#}v>`)#8lL zEzivK-7)Un*s?98E2ody{N*!&`VKhs$9R6LR)J1SW;kq)N^O4C9Z$p*LfV&x)Yes$eZ zs~2x_u?%GNWQLSF>f_1E2#Br%6ct(8F(Ke8*yy!sqqo$2Q4uGo&i7HOym_* z@<*uR!+>!gl-T+ohQoiEqUL6PtEri3zb!z^OUY}PbDv1b&dj-bDhjL5d8esI?N+$8 z{r`0F$N$u|Li!R@V)YP8Kip6EH`NhJH`t^DWC903WC9F4kp1`80(eR9!;wNsLsXQ^@pKy*B_P04XK(?xKw%hu($;GraxoH|c?6S?p`)(hb}z%T#$^{a0dxhT^{0CjPkB_PvzUxk z+(V^>olYjpuAzHC{zd~QaytZpeQIyd?Hq?Hvl@K}a)$URfX%_VJ&3Gl8O4)4-+u14HQh}vb>3XBjiR8U!nxO=BXT~6 zy`KERH;O57DZ_b-8;=!oE8BkW6_Xed@z)4`M`t=3lY9$X)G!gUn%A6h~8N9s) zF#HZ!tR>7}7D&7uYQ{8A<*00i`;E@x?wA#2#?*akIzijJz>Bu=GHgqAXb3|tc9?l| z@pM^s4lqy^NHMp_0jUB)VCJF_J{#UPZ_?U!3-E5xyy0#ggfi#gI(8{uh?@c=oLOn>0l>8EEoKbu}zZ{=Edj^J@ zc0<}3Ozf1AOn|L7`!Bsoz&l4qM!8K!my#ZVO$AXj;mW@j8N%o#2mC=Q$UpH{Kgt9S ze$ZQ}$ve|bSedLh-@BZvzmx>|D?aszk-(5jALrUt$OOmyf;C&_@7zdv5<2EU3^o=R zqkkvUAN4ingH#Z041mo4{T*;f)tcBq#to}|mb>^42CzKc8wJVAtVRg#)c|Syt@sf| zE^2?XgZY2+9?$>HhR5V=6>Y=Lo}3ny0P*p}`XlHgIsnr1fQ4n}jLPWHA^)#pW`@`@ z{4M}0(HboCi&_eGpAW~Ev7 zV!tCDnAGbEDZzVBtbg$u+d20S=BQ z-@Ci-?m5rdKX%ShI55n7x}~2pp;B&t4-CS0dp19pqK`zx&Mm z7ks&C{rrs`0)gvr`R_`Vo;(KvL4}Zd_C(P+VSUO;$FoJI_sTohp{uQgEkIr(|w2!!Z$RW~PCjv9727D80$qXq)8 z`VM^+@d}TQ2;uEYRfRwdUF*1xNTGPnfDCQp0p+V8an zQz$4Y`Qkr#^e92VDF2D}HHF)Q7iSw@Gk>ln%Em-RCC&-buWORVJ=k=Z8)4L%YAVb+LC{0GaBtvzYg$#IQ4xsVUb_#y&PSCPtF*Ls%FO z59dbS=!93gh*x&Q#rcFmG?v)%*~!7N$8Lqygm9;0WL4Zzeceg>RRaTqB#I>0YS)pG zk%h@aNmYF8&lWtSa3tWcuzHxn8~Zr?j+`j-FoT<;zeCffw}-t3yoRQkCIddV720 z;^NRRn>_slXdHvdIY)l{&T+3#K zlSX_;HXpy$8gxa^Hun#=jME>Fyxw(h^?sMa8#o(eM_9NS-W1J(GBd3k2kdUA{=dHPS zXPBQY&&G$%K7IPcV>PulTA;0JOe}VvmR4^ottC|_6$0qR3n_S^oY~jOB3_1p?5vvg z_WP4#A3uIvTQf)Xk8_)uaE%Wd$>EXn+i#;gGADZax*FV%wngXPA*p?+G&D6~OYU*o z9CTdzV?PZFwCZ%(hzSS?8XFr;OibV#4WB;?3-qejp5Pz+owAGlO~o5AdB|fmjg5^A zp1c>g{lMT?p^n{B_rjL5{<|!>rsBFZIye}_VbG&784cRb*6|@4v}OH9KCND9W5!Gfq{Y3S#@n} z-TnO^8{gKtoGngGIC*|MYi@2H8XB6Mnwr<0Ct;~Ho~5~49_YxrKA0tYa(o=l*_R|# zV>|qUFeoD}t=M=gO(9E`d#XA;BHhR5s#yE@`0+wl3^Mhw()r=Thtks0{E79>Te?h4 z*%HUyZ=GFTX;6_-Q4aPFS`D5d_<Kd= z_)GB@nHs~YO?c;yGwYrq8}a)aI3yxErz;9s1Y)kPuF|zJ-H!2foVG^J&b*=XK6{Fa zibEqKjtYNA3Im$_aox@rvkMC3vIduW;ty5^vvPAEZ8PJ^;oW%O_?FENn_Mj4s>#6P z%>C}&yHI;#Sky^KNu_(+*vuP!t}oA6W2Dd;k5!59TG?`wsLz}j4zBE~y^Eh59Ufs{ z#zysbzv0CC2TM>;ke4iUM{!By{E+tH!*A8quCc>x#rhT&dG$~*{%NB9K~7F?W@?(R zQN>}m*d1SC`QpV3Wo6}@?Cek1hlYobFuiAJSsCSIKS+O2QBzadEZBVc&Qv zE}k*_`sdG|_Qw?=3@j{KZ{**=Un(iJuud+&{?aB#Q8Knxpxt0OQEhQtxTQmLHrcr_02Z5 zDJi0wn&i}UjErp?`%B?{dxWRQduDImjBPYrgbuKw@Wa~Xt$ESvj|in-zFc#AcwMyS zFb;jJWv-(-?`EB2niH4I@oAwVX64?Be)ETbfIPJ_)8QPYjhTjIb`QVQ)Ktj(+}yQw zfr|K@K7oji(vp&$oxPf5cQ2nN3@NFO%e&d&|s}Zef>kV{Y*Hjrnk=60Kxtt;_r(l-0v511a86bu~3eCo6%@XpxAv`2l0DyGl_joS8LM zRoq!iKFKk`!Pr49{MNs{LqlcjbPK;-=TAwdOtrHAT0bC8#=yHaS+&#ihet_C3Gy|V zkCL-d=c?H9-^3cqi=+1WE%d^|J?tCgSrBxRPoL7hRS*>yzy1V&W4g}mc-N%qpDGPl zpe7XL?xWbWG#U#F3sgUb|INlHjqtOoswya$y!?DLC@yYps3_sl(SG=WK|x(TJr=sd zt>YneHfJ~Zay<6C#|#;W#Ed5^ZFEv~$Z#121Wq?k_pqWvKFMI zynXvNB_*ZMVxoL}eB2+8vbD8YHi3(P+J1E?n}}7*e5%}GFjGb=sIFa8>`A?6eatNu zi|v`nbN0I8;_cZce@>(BXUM9`%C!%_woZ@ifOjY>w~EY}DXRG9LmZuQ`f(cdXw*0| zR|RbEYy;{KbPr?x9zE%>$=^uSF}MHZva=LI%44~|HU_}NWBIG{sIP~RkPw+FmnMPx&i3CdNp|GId7MEBoMQadENVU03G)pRY!j^F{?8J$kfO zP$+!tfiDJCLgm#fVspM%lt9rvZAr1Z;rigf00_)rC7hiGVMkTLMH#dS*r#eI%7{c0AA&E*0sO?~RmhTUXy z+CTgBAYy}bms@qUj*FM~*Z1#K0s?O9pUWniDx{^PWD>Xr`unY?svY)nRwpVpj$(J9 zzNbruJzg`a^qg|#*p>(;E&@c#n3i^Mu=mF!^<3DFVyLz-FlaF>!8s<0jgO;6Dd(!P z_dEZ7<{!X6&L6=j$1qRf9U3rly2Ko=l9pL7V=?yw$*ol8r;-*JIaTA-07bPelze@P z0Ks3fUz_x8@bIv&ZD>dl)eqOZzcC?V*d4q7mjIEdfhDorF+;a%JWAPk-9Wo*u`gcx z_3IzHMVWoEmPSUS(?VBMBFq{GXb=c{eCrs}|2H-KZx)$EsPVL~;R+T4fmE{8QmAlv z!dxdZiudgr!dv<0;IOnu{J8x+UNwyW5B~X|HyJFRVSX(6TK9GQ=uN~jS-U@Fxz+?D zg!}2?){n1*2vL)#{0m+R(uRhMAE}@I931qjM&Muns6n%|HQ#oAe$K?i#2fl&bv0kDtaI|TCg#^A4*hO? z@8{>Yw@4}A_=uW%w*3=rk5xrsp*7?S5JYBH*3rSio&9|ZAy@k*-A9CGO@25s?!KO? zh!0nvvkbh})D$us$p!XCF6jJ`>I0)(QonI&rU)xb%tRpqYU-AA&qYdCR~I=MnZ3O| zQ0A%6tv?evUXw_O5m6qE7{{HSs;}iX}l)?8NECW9bOQNEpVq94rKCkH; z8{Y@|(96oglEiH{lIbmzE)n9oyFB1?gvFv+U#c_j_fRE&?R>@(m?Pb0k>kenS=e1K zje2*NnR*ZODbyN(LhTyQytK3*J;QlH8Zl!fMp)%;C;Ju?^5s4!PW$`&@uxg>ZYQ$p zlBCqTaLZ6SIEaIR+j*-08O@VK($h0WMMhRuR~D;2@}X+4INTHTINn8PM<7!>WFz$S zblc>-XRJP8@K)ScBes{Yx8DUqJDR5n)SlaU^S4a=Ir@QF z?Y8cbhK7a;QiMrclX|8Ivfyob8~a;y_;B6 zC=E>wb`n4Q;=)4bqwS2ky1K%0^5y4mlcmx2e?~0U$IFnZK0ZE5-;^)G8qN(Wxm=Rq zJw98yH<>v(o$c)(PRU5gm*#A%PHpmmX8`kHdiXGcbUi0=^mIK@QN$B`D4(1>JTt`xL2s|XY0uY4h`jQ&l>)Bx{JFlNAuNUp#lgv0 zihz@|1Zby=+Xc`0-P^a*zkK1yWov8OPIx`& zW-mc5hP^AB7^_-wNl9O#0FUFE>fO6hr>Cd48D)ugIjJg}zYe6IA2eKOR$4cXw|?$g zsCVCbEw1F-V+i?~W%T9X?_iCVkS4lXe@TCIXyl_57t~mw*4HsHfw--W)foN!BDGh4 zO(7vGLD*w_V#2K>oPJw#;Zg(>5ENNX@l(uwqOa0m@w$3;a<{mwEabz7U#Clp;o;%1 zghGfiX(ZvH7uI&=>9}YX=7~m{?_^M%fRUxV{HNU9+_*SU5z;q(KE}j^P2M|F`K1kj z+RT<~H3LMm9^;9#vnvMX^%JYzgZ=#^G;e@*Sa!AvPln}Fe{6#yRhuoFF8Ao`*RPL- zl%)@@Kn~kEI_4jcgKGHY_4Z32RLH>0>x%sFVpQ(cUMnM9_)UNwsFmwDO^ zo`;3A=8xTWV+Zgk1?iAth2Fn?1X;q`EE;`Dynh-CQWSitL{ckis!!ON)*mhUoFqxduqZY%7I$mTM;(Df6A(-MQJ> zE3gO&iPnIxw}a{kn^dqq{?0-6+eAf0=V{edmzFB3sk#0@-2@%n2)}!aqOjNCujU_M zOh00+5@eYx({mEVyeb*=FZKs50EO2a9$>=H{SE_5ooQvf_ZSFo37z$+D+q)!`@b3^ zCMR}5p%G*gwXz7&rG8~13gm(-3mnmZfl!9_i;0{EsdOrJM(bA)q7y!sj!T$zM3+%q z7~3i);?;9wRpa+}fxPlOAJ?dRnO#Rm$7A=T)JbyuCs4;QN&(rdL00XmQ#{xg%{4xoF^P} zQ^P1ls;jCXg}zOna+{6pf~he)tn`a~*`2D2KLLu%#)n@vJBvNx;kQ8O+*Y`ahldA> zYhV7M}U~u-|$%Kj?>fEA4(fh$=Arv z%34}n94VIN$}<%J2%gx8TM~;=7prUMjIB0iiiu?A!J-dxj#Swg8lV_zvaXTQ!RgV?=B8EKi}=SDX#>Wdo}Q<@*1QP~ z=f`F(fp@{0K_{^5fkP$qSt5OSWW;i&Ug+`T^6KhwFylr?Rm8-6)@IknO29?XP*z?9 zK$)Af{X1D@Hkvgh5f^ z;d6_Nk1fWzJb4~GcyRUVRmD_Mra@I{TYR= z*0~)>Ail6O-hY5Uk zhP?>^_-a+Q8SrF(|F#4ESFc{-yzbz&m7d-_RCT_F9zF^Ouu`Tx z6FiAb6t*V5e5 znCe>$TeY69vwYWINQXA zUE_A}_fxv$OBop#L5dKG`3kUK6;)N8k2)6u1OGV~`wJGWgM-~vh1ZN#Qo~fWrWd*$ z^0v1<5u`r@0|SUReIXgHKx1T6(cGM_6P}ZomzTQwL|Yi;Mg8xCpqoVSg5~C8+YnV> zZ_9Ufb^_Uc$-daDDbO|+X7-B(Ot6iaun!;bCzS!4CMs=c{q%_afDjrO8cf&QoizF5 zaT@imrOy}vYeX+?*WtEzb+M`zeoskmEc-J`jNKZv#L7l?qJ_y{2MeIvtiW3$6o`h} z=cMpgBL6o;R&9(kEy~{BA(TSs#rc))M4lLT6*;*u4OEX|O?8!4o$X%5jOSo~fB(ie zFNi^@2nHyYQqP|glX?jhH`$Q2*)-N+8C?tuaJ7J} zz`j8B4Q+jGlEiiTGlD~1s^4)-4o^;7L>s$p*}mGp1~YUX(qWu`9MT(H8ZHu?Cbr@M za1p*_WQZpRx7uhtecIGAOixXH$wB-Ef`fzG$wORq_4MRUJ;Y=$AC`?9So<3@8-Hid z>!=^_@bG|317`!^4{DTItJb--`<@Kf3*}pslrs%pUT$t~sE<`uM^q(Goc>PQ*xCk$ zh6=l*3n9YAzIt7pBU2$%B_{H|e*K!AJ?rK8#j(^^ zT1{FyNTai{k(%YPC77#4>_xZ97&a^J9ufHrur;RYW_8H6g;K;r5j(P5V&s#}snDr$ zTvr1ItE5B^-Y9QFZEbCCZns+i4^BEY3Lnpgm#o;IgM;HGJHwloVj2J=fv3_<#xvm$ zd3Y)^GYyBn%In9Ce;x-{q5ZkiYUa>p#2J)s1A`1dzZ*x z1YKZN7*FWv=pJd6sx}mO0=^uO&{s%U%KjZ>l1Z05E}L)Nusy&>_{~qnRX{+%y=0C|ez^=;+kjT&8OT}L1m4-DCCRKo`eu5%W_o=C1CtMa zdd_u?d)_ivY&FsO+6^o$ES_Na=(UA@vI?Q(@r=00^f~oGp-{20#I_7oRH3so=Plq5CG|f) zc#doP6(s&m+h{=G$2WuBgXsHtD`{KbpKMRfT4Exs{6^T(uZn^s=mXD%3i z6AODz9_Fc+*Snqcwzn_4g@lts(}bKuza50csuB$?ZA4UD#@CegYb>lF z@Rlb&m7m5zP=KGuAW{QXcHs6ugh9Ueojn~&%E}Bp(znT>G|W#b_M_kx^gL z>({Tjxw+-#7C%+!fBKYKT)YL$ zN88MI@80?OwJ!F=^O50-EkpTZ)vEn|9aoRk*4i40g9GV$|Ni|C!NK;nwx+)bXTatH zg{B3PUsKZqpc*J4E-~A0{}6}^c6bO2Cv`2{!q@_6tF09zYlD8m-;Isr-&gw+4>;|F+$Xfzre?)UCQO@$vn;y$(hiC~uK!c~W}s*7AxCv^?BHfXu)_c7F4uSc%2ZXJNeKxW?(VhV2gk>& zgCz>?Cs+}1U}5vT7i{lJ!8TrAHij+~5fPD|o?fGf8}$2t_v~E!uz80jVb?{$b;Iez z#oap^8Om0esdeEr=!}#&nO|Hicla{`J*s$ce&gdW&JJckCeo|(u(R7(TlbHQBykvY zo*ZnD?th$F&V5rtA>x?}bar8(yG9688X6iX(w@J*1_r(W6W|lA5-k!z zN0)$3+j6cApQAy&a$ zL&m=jMc##v_V379y;r7T{Y_Iad!r#1yms(ETyThtv&+e6X>RgVSx#0`2OnQS(BS@k ziub=d*GT%R-Xx)i!KPOb-b4Ex3-g06Ne6=oW^xEbL(;4LD*iUg+IhORa@TNPM2bbD z0rcfp2|9&|0xkqtv70u%E)Le|Lq}_Fi~9depya!P7$;b>`@ehPE2s{K&EHQBJ?-Weue?AY?$lq-0zg5dL2Vc~PA4p8+Wpx8M$Zao6S`w;`f{^8aI-(yw8_Xi7cxTp3}qspa9q&81T z>^>8F_T4j+7owux5fKppgGa=(l3^6tIXOR9W|W^ODC~d;*dx>_Qa!zT>((vU6|?F8 ze3h^ErI+TQux`?qw6yTVL`@YHNkau!*Xo=cQ@d4a%3mcyK~=2ACf28Hh*dyI9)Zl~ zK#(`$ZG0LnwhKyg>=Ke!*GBMP71FGu)cT0=ug1jxF_&SVgnq!v3T7V}ZWj0?2z>rd zI-(2VT{>rp8;G>v7fw}UP+P#}Yd0Zlo2cMKcso9e^I$>Yzi-69AbQ^@iiE@m6W~4* zlLKhj2M+?ZIq2zIpf#YZJTg5!JveB$&>4k3g~P_75UiArVF8|V$(>GeZy-{JzeZ}{ zkPEqTJ$SGR34K|J0s^RwMuvy^czJmR1Y#m1L6VS(cqSxhzk0=HIs~e`06=1M)7r>r z3Cy(pKLUu~OY$qmHs_~D($SBovj9X#a^Kv(d$$a9ADk{NY9wEil!(Y5-xW9%I00Zx zvSX7zHjmBAW3GCxs2B-O7rG;YKnz4CJfJ@XtsJv7@!6@kYVr1(8)d1u#aiSz=1bZs zd5<}w!XL7+S$15uyZucd` z#eIE!#Rr+UV=N@W%luI(bJ>Vn7Z|T)e&M}-id8x*k@?yd3Nq;Zo4o*vvy@v~jK9ns zq3;;eMc?$0lQZJwLk9;3Qc}`$y?gQRnOe=`^PNPwo;4YxrzqL6=jFc398dgmDlcjG zQ&CTSZ3{Acn|1UDTX2UyzkqB(9uV$gY1SjuX?%pn_~TrL;)udtuGly z0o=gePESu~luc+~u!UY~L3Z}o?$d7Q(WB~KulxF)5hSiN9sIIM&J)ybVDdblH7x2vy%DjS|J>uV*#y{L=J<0 z?unW|KKYp;Ei5byE=ZHjWOFke2S@P=VM}b{<0>|kPN~(wC}Fc#JE`$);`N#J$+rqm zZOd*L)Mok9oEfHd?j=uY6E)29*wYr-*IkBA&_ z_Po6j+W-h@S^i5Q@jMvGt0P>t$wA4=_WVMCYQWYZ&7pxJD45{BXelQ4qcwzdXM4N5 zyBn0`&(mW8f3O`uWM}i(L9m&P}zMAUZ(2_2!z0Urst%?KK#so|k}qTSQUIyV&nIC*(?==uPn z3pha!!)2N|8%k48TGI$nkD|R zhuV%=iq3_l5n0rw%<&U;MzZu!6j7huGzQdmP9PHteif z-cZhEY&QY78}C0kvwrGY*ly4SL+x}MkPL~7%PFVq}Y85wA@SqE=5RApa_@-%a8r|$#Ciu08(y)w{U*V3w=m2w4Uai0APtW~g`Jv`2| zr)wOe0qDu@xF2_$zz%22Y?pcynG`Y;1YKTlI+26N02+si^}yx))CGvn?5j_Bz~%zL z3*0JbIlBoR*NJ)$Hyaxp29Y_a496hYI9*W-wzIlMh!XsPeq z%8f{|OY2r5U}D1B-Mf3lD)Vw*&^2-}^y~_vlonWuSo_qOyW&uVHmkDAXqlA}0~N*L`KHO?coNBiu!5kj7v)=cZe>Eye=vpa$@2t zR=JIyb;U%nYIRqX{~ho&gVqeG;`q|7XX&Y&M$_F1E`DuK2?+FPX<9=mDSdTHcb2k* z-D3y8jqZOY`7xw;m-@>WI){~?-7Y(Gy$LRy&V{WjgT2Sc0^2(eKM!`|S$%$?38OCK zHCQx_U0CHMuU;)q>b~go`8#Fs?b}UMe>{)xQ$Mob4H?;E3oCxMc%}?38QJcaj5tAx)t};IZD9Ttzjwd54yry@cEq z4`D2z_#(eAneWY;8PC>*6~4EJn-ov|DegbY9qRws)2<3=!@(&%Jf!-PK}%sr+u6V{ zTC483FOrFIB6}3!T`rkH;QFMvSeK7a8w=|pfmjd`9*vQ(TXamcG8v)aL*|}4x10R2 z2SkyHyq`GSD;Fb~j3Gg~q1NP)-4 zoA65hla!oxctlC}@Gz1(GG1NSbZEe3=f>g^YhR~Ywe7-N?AtA7%~zIR-nT3LRk3m5 zHZE>rviGZ~?U41o&)-kC$HuhD$^VGNtaU_8642t_tnml^{ei00R^&B)5yq5QhCxJXDsqE;a4;=%{kw>5Z&W^jN{ z;?OT-WhwaWzXDh!BqU^HEaa(Id@dOR=KvZls3{)AcUFmz8D?8vGVoX_DU*SX0E*w7_T!J_Ak2jUSWQh%8ulewn3_Id zWR&cM=ZzQXwShAYFKW&|+t6>$-cmU&{f&q&;Ya@c#IUq3RGuIAQVHwa!mujr8?D?vxZ4gDtA4q|{KM z=;03{s(Lx;4acKG7Hwcz>H_WTS z?L!sYVUW7Dps4`|QT>p}UM3q?5EdaMD&mEzU}OdZqC;D=v#Sf_cetP)FEqyhxWLPS zS@q%ZaaTCXnQuCvW55dFW@iUkdN~U1>w$?V6`~eqik3*1Kh`4H{Gy5&7tbO|#Y7;4 z|FxM+FsDQSvmck>gBry^h;qr#yR!5%@DGNR$BSx3UgPIUrHh%TlZ0s{wSqxyUjeWa zD*utYQ|e(Grykp+lGWt%-l?DO`#_p8%=RZ5_)JV|B2sWf zZ375r$(fUQZD<}p-iIp@%b`R(`KXbWArt-(I6eo*HaJz_{=>ZZ!S*%>JNv9{6}qe~ zuYl5<(g$8BPc9k);OOK8u(fr3TvO zjKjSBcz%nVwD7dZ(xGMcbe`+xG?f@JZI=_wMP{P~A!K~Ta0$4$xS$u%-5>iuf-wP& zQ@7>*)UaehhDwaA&$o$*jUh^mjVn*X7N8B5w?>iRg->4CN3W(b z>naV3IRcDNadCWBe{0DF9I+`l4q-kET=LO;?UT*(rtF9;76y&Tn3%rqZhbalj3+2R zKVh%))5#+{*fpF0%uRlCS1HSM6Se;?9Ai9tYjWfiK2kvgS;<5_w#iHp{QiCz8Z;>j)38qSSmFUIkSsH~r*A8uy7q)G;=XB?S z2w7k>N96e{U!C8eI8o-$wpTU%h? zNXf}j3cFVp6tG5gJbL&L=F3{yu&JBpw|L2Lu_N9Y{^xRnZ$OUUyB7y#rz3*#KdwAU zNUIzRILJWqcSymMRtCQr`2!}-8yjcAu!26YfaBWc-X7R}0UtgrL*G>00q+AYui72v zJhBTzwtHX@z}{h&VrP4&KGIXFGO`e4l8^MJv!E?%dc2jNiD_kIU7fp(8_Eh~9z!OB z)l8koDcVNHA_VmXdI=bQdKfXWf-bf&b1G|z+emM_V{0{4f1P$WB@RZ9N=rSn48!N? z?nQT}zW0BOX&L?TBO4pr;d;dk(&zVv9n4HY2d=QcaB^}osm|3BZw81rFy>j32;6r*^%&{Oi}Y_V!#n{_1A$3{6g!n0;^`0?jG$H*`A?t0X+H z$G0qg=FsCZO#|0JNc{Z2GRNf1;TkZ$kX|`xsu}bkxF{i=OwNe+>zdufa_)IAzK0yJ zE=BTV!X)3-j_d#Wwb*m&c>nKJgasm88udM$?Mc>^2KE2nsmD7_%7ztdPC?+kiLJti zj<_(@`D_0qG9;Qz9TDC1Fs)z|b9o39GIYbh z&@trQqyKx}_nh~iHsHyk%cqpQouE)VWSWCmo$jF$q-$lV=%*n$f zo_Q|kSkKPLs7=9?7gCkSagUMFGlsOKZsP+qA}VV5jx<)vo4;Q|Tjsy6IYdP%n|`K` ziHb^9l_Do2<4f}6WMs5rKQLI-FIK^Nvw1CenlK_|6Mx!7Bw^6NOxZ)6(7950MbTCK zCALOBZU#vJ8kYu-SOcc6r^Vp5Uc=gN4|hG8Z}iA&QR^sOv~gqmdh5}wi-VI*8|@hW zw@;(4FR(;2-e%!kzYM*<(q$$rc%$7rG{sBa>^eUDOt3D+zf0q;*ex&G$YFCyNH*(I zYT09(+oqcMuIxC{GI;hZ=JV!LNERVhXz(xlWR|DWm-D+1UYJRzSEbT-AFw%=ikFwY zQwlU^y=c~;{uR_d!y5I;R=AwjAB~>0+qmQlW6&<5v`btaYr;({&bN?Bf9My8n>^7o zhL6HL=FK4{a=|az+AGS+dT-s% zpY+5-3W;vngoR2t{{;&$6|&JCtB>{;u)fU>m63!YyO6(Xe3D_Xs#JGQs_J9|PO)*f zp*q(yoe6`R_K0S&Z}-l3>QKVmw&r&iWX#`{yHLo`OU0PaR-FxOh;M|-ENn3p?g>?y zWcxvJX0vo$`TB)6JN8@c&zyMo@vaeGA#`2kbVAo46T6PNp@KsvwOKWnSeN3aKE6k? z1Fm#ed8oE+_#bZ=`4|&zhbM@%x=`0eydud6eW7G33(ax!Gb0U5m&K9McR?CZJBiJ+ z=hxb3*t9a#!_P9Ig3L+wqNY-HG9HoMq^+}~1EpDz$f}(iXC8CwN9DB#lkU_kQvo(o zQfw|48v0vhIpss{lKwNfD4)X^?PcPkN#8v?nCsFNsD<{nr=bnb@#*a$YnAKG@Pl}G z%U79_+!sufM@biohB^+Z4u}Qjy=1zyF3- z-(_iz9(oyLoHr{NY~J5>hVXX1*cE#he0Hs@DP|^;0LofRa;(%3cRV#&>#m3kJsj*l zTntR9pF_%b{OGhdokM56MqkaVltu-epS_uT2vsK2do zE?lEmTBuEvagHm@RCnQGKpKSjcA(<-65B+lU+7GzX(nl(ocm*G#jDL-!E{_&W+#2L zeb)4x_;|I`HPXWnW8>D2nTBQD)4HsoiV~-fYrk$RuK1a1i$AtoLsoIB5SX-4iD1D4xWtzNVekm zz4rKGDWg$*6B;{v&WAMJ`jeFJ`s}VtxK2yrr3Yv4jy-kA?4ccFT}aJ>ZZaWvOULJf z>)Q_r%V)*kx})oIHVZANW4;Sb9{z+`_AJHV@w?qcx{1`5T_){Oj2+AC^(BQosm#C& zg6;{rY(<{inaDz>gtnFY-=(mL7Bku`YjQZ7cKh*k>6jVX`0qBWO+C@0(f6V`Htk+O zU5=gSSDhZ@=yez#eH^vnb_wtP7^UiS{7#8u#mvu0#I3h#OnYYM){569)xuf)@%!=& z`l>y$`7Lp=fLIvPGlXZ~1torr;M`W@W;!Rzo{)b#CB!vO+DhGU(cc`|Qc?wbfq-y$xBxAwD;OyZa}qap!0CR>_-o;p7i_w!}I3=N7$NPnLld z@y9^CRfZ(f^rv@KIS@lfrtuS(50I&*qi5yxxM5ugRwL_*+AKo6%}cUr?GT zXXbqh_S9tZ{FgIziV2tY`U*xTXEth;(8d^L>-Ra%6(l1|7&I}S8A?0?!b-1gK}JTV zwLE-Tdj_a(Cs`{9`g2H+T6n6dl zyV}cC0YRqJ*%m*O9&z&_&zockMx8RHWcG%?a&q!MBflvqv^^#GEw;G7g%|s`2!~?M zmfHfZo%iS3Y^C7J1-A|U5D4KX%!^O?_)%`yuH3^p0OK=KTm`MF)*s?Ct~g z5+41Np&$8IHutp;Dg&d3GYCk-myVt`Po6THZ=SvmG~Zf4x->7RyTB|jL(gfI#UBoS zVvkxMU8qc0Fh26&!m>s!omB$U+fXv)U#Vx%rEUF3!Bap|1GqeuL%Ef47_kFb>DXbYZZrKP16 znUs|edJeflKyUW7Qb!!VTb0!^FgJ03&GX|74Gl%%Z1!E&BvJ|3-k_o~+&sX#cKy2L zLSAg%im@s3cno%tPx`rehq5uHY@^LdFF z-eOx((7~u3#vZsko%l&xu=Krmez46F$6t|=?uc0grJ(B#h+Z-F>|~w0cS(ktEZ zBslhxM_XH4vPXcho3_ zJtzbHjx5LeOi`7mhnow@+s2gCLhoUX7b$YSiz|kD^!~6(H6I^QcqH)(dgbF$t%!b> z=h?;S*4ob|d{)h@s}{e?Z6x;xIW1lWotmHJ_j=`H@U+y{j(xm<`{-loUx(Md8k($p zB`-uT&u1=sN8@Yex3L?&HvDs21bKjSmZ$M7`IZZVu?GOH!uHhyGeL~YlX zF_)L_%w9%sQ>CtgY;c{E^Dc4h9_6B68L4vAuMTQVx_-+93Hd$e!7O2w{qDd;3nM`7 zD~4(OT$7cR-Cz9~7D*ovbp;21ph4foZ+}D9)|TaR@<3BtN5`<%^&XZ+WW{hjIW3Eu zC@rUH`TJb86=vyI3 ztTQ;N%KSeA>NM902zH;J z$L!|3P&Jx)y|{!#c6UlVBL9#_sG#7W5&O})z#Jw`!DGh6!$Zozpzq1g&wq`G=&H$; zfbxX1QAwye)PknRN;u09D^+*b`0yCkYxLnyVJdgF^=%bn78L7<@nv1TG zD>zuSu5;LIY-}E=$+YXYShg1vHOnPliV#x^esX~|H#VNxWN3`Bj!#aSkg(A0*PpHw7x z_2twqEeGfy0WtPEK2CQATz2_5^Y~5xC%ULk1C4!6NV}@vRTFpcjbp!NkWVyb%xp|iF zAr%U}DJAGQ`X=fd89hvfr|}qDCtqV}X^H1nkXmg=_nqGR!otZZW`5CTP5yUIDqTj! zgLZ$gg1(e`BK6MB&V1&hS$&Q_N1_p@!R|*)g!RFb=fe>F_-I(Vva=btZ=J88%XEg_ zM}P7M!H7jd5|U+T1IntU80Y!$S2E*j=K?LW^|B~X_GkX$=ew7{XWj0)-4I4k99iY` zbMPEjh3zAlZ}plJu#0VN1S4g-<`(mHsSu9=oU#@O{Cg6g6=EWfI|E===Ir~3< zT(`hKJW1b5&dQSpHi#!lM4>sIkk^Iq7ss^=_e5sVHq6 z=52+-Csp|5aNfcOWiqmYN55@A;W{ZN321*pebGsO8Krm!=wXWegU1*@0B#F#3t)Kk z5fyf%d&|A|@88FPjJ$@=-R0(vlR(vG_t*#s2pBeaae+xwJP@GScsSu$WDcWeU|=ZH z;~2`2mFIDy+T}(EIKu5cKkNe}ENPb|-T=O;#p+`gB(#OY%qH(X`S-3#`DC{W|u* zun6K~P_*A09z7Zp+q*YR&?$+VoG00r$y6NtR8 z6!$hIMJa}y%b@Z(+2_xnd$NSm2`RW;Pv0WS5SvcZjdfZV-+MJxRT)7)LDi6xlQSr@ z!d3qu$W|Q$(Jxt!6`6J&TRF)a6L>Kps8?d7UXs1-!HI0uw2py_*k5?kB7A~UrqYO1Pkmke}ty>WCBqTVQ4wPenFl9G)C zGrkF3PvR9D^(?gR>IBJzM@3z$_uP8a5l06M;3t=vW|SbGj&)RA9B_izA+aVVg8<-Vu=jYuA1#kI(6tH<`=0z0r5iXD64Uq!5ALTM_d=y88F7kbHYlv`5d@T0DW0C$O_?de5+hz;SQRN68sT#- zR%IqaB^Fr`@Rp8_$gf|&Le>+LliPO|I;bRlcq1%t+`04pgODRs)lQTM)FR5;eAnQ- ztAn|OteP3aK}=@q@|N=la@3LFbBa%&-j z(xP4z=e&Tf2IRwim#X&G(YQj_93Hy5^5Q3w+$1Mo&T8I*1bVCvd^2r^!C(?4uh6Et z$qQYLuhwWIa2lpiS+?I^!RH44zGhW?0kCKr%-RRaS`FBu6jF)@>_rbV;nPha+M!mz=}5hH3`Six;!c!7?} zlJZZk?R})AB;Y-5qE~FBsHJt|$B!RH24%0%gv-{V1pAV&eMyK2a%{Sj15SSBPkJF< z1e9;yIs%PU?Urvd1}4+2+fsCVyAO}N$NXWF-$7?@Z!QoW&Qw@S6CD>YAIHZ&kK!n! z>(~`FRS-tDJkhSS13E*Y) zx%Bnu8K*n{Gq!B)yi%7>f0yyj1loG@)=m2{sHrdVfi|m+ot;jJnH1J&v2jO=dC-s7 zcQ_ns^|UFZj%UM`E~Ju64=riM13DM>FG6FLySrGJg~0eT3N4vmo=|kB@UXJ7Mz*v( zB$tFeJdGT_PEByD;9lVAA(zLR;PcD3^|Jpth{ROB6HMJtRRt#j+2lXdSK(pHZcm2Y z-*t3^+Ti41OCNocFogDp1_yP2H}Sxr&D#HP!*aUO_t~>& z7F9+sMQPiNWwai*1zB(Z7z z>pIF_BR{b@@N{=jjprxSR3d&yewrHRUS=^=#SkSOdP@^OrbU?B3 z5a$@VSfg6QOkgGYz??RIY;5fDLl^?f00;_zCC-Bw%UGy=8-DQRryjo~-9u2d(A#iQ zF^}UL!s(lZXG9ouN-}z+IO)D6b%xdqUJl(Mt<7gA?Gxzj2alw@}|}t#Lf`+ zd<|By`+VE=fWSa1KC7!U0ei&2hs_?|tFf*@{A%=d|13_FH|9%GWsbiax0%vM{l--lC#X(bj%7)<%Xu!7820B%XBdmlCDZ&|v-ORbp?Aj7ykeh3QO2|vhxj$BH(xbTcrY(`L`tH0AujjKY*GcaG#8jg6r8(o_bHF zL`_@yIr4N5WCL!en>7t9`Aqq5)6#yZXS!G|7o}k-OwsFF(eVoitPPamlnq&-j~C*j zJy2Br&@{(D=;*HsD809q$%TBl9<2c z4+}c?*{mAlrNxu*-puhoLTyY|C8mqdv;mw?m9!~8G~bEpD~sxwpPx_VwZz7Nw6^xm zva+&C@0mc!!*Ods#R;izJAVyVa7LSB-xeL9i8u{;M)@esUVxu}92P9I<>b@R)N~aO z?_E;Tl7f?Ea_ zv!6mKBff$A1y<-S=42^=-7HF)%h9Y^7JGTU7;%Wy>-HpRJ~& zQp9F>@=MA%Ir!5h6~}Md&&|HAe4&j93keB&ty-*P9_ zQ1&yZ%VgW$bW2epY-}7%4T0#DF!px>?S8iMEYXAaN2WCFyjzv#2Ia$*zD(b}UXiKp zEKP~{seTRc^I80M;O&}NTs+*tJaw9CmzlUZ-s9)pO8XnXD#mSIbAP<7XSAURFwGM8 z*{xr--cSA6c(&V3E8&IVukYMQ6`F%JM5N65nx+SGlo)O~P;4x6v7ayVGvDPS^$gy@ z*W>JZAmj8eDM^GID?)MiD71hgj%n%q5%H-!wG>WfY3Zzl`;X=q7Ua#$=)r_pZub%) zzi2aiWE7ICmcnn>M=R_!9x~-@w>t3oY>qV8V!YInh(`PkAaHO%>ua21_k-vEBJaVv znqO9Tan12@@sc1L^Xu~}bdtT0uViqgQl_BmN7Md1!jR%Nn{K}u|D*NZwV{0QOG*Nl z{U{yib2R0>HU+6UG~G#MetF4f_gtCxTj)V;s^|0qZhC|;vlw%oNjNhL(;!$+yQ5DO z6xip!;WKa^ZIyx1T^N{?r_Vnkby6_W6J{&0uV)8v(v$lKqW<^3;oqPF6mh@TA469W zzu5(dJP1<%;Ee8O=u(S`O}_%lf3HAL0UgV2n$t!@6Ox2(|N~HX_DLAq5V@% zQK78?oE5UIuljfJ`#T!`HwgOAkod1@F1u$5uL~xL9nwA4T^oa$S0&|E7Y8}a)I-D( z)uZ_2A?^2K%M3Uzt`L%sU50$uJ`OI(V7)lLx)r<~RFzy%T`Z0HY(1h{<0??rSKl4J zIh2_lz(yRnDic&U-_3ZTyq+RP*(SV^dE#USpSG`j&50b=Kvh>6mKhCKd&VA4)#v~I z>H%AaLxokvMCmV+_*W%WFGn>{IB~t}4*HOZYVM!S#v&uJEpEO}qqcQ!vpZ#Ii@mzD z0AK5*i4Hfk<_lvH`G@!4W$0v5=hc87H|6H-&7MjUKT_SaCpxJk)S#yyP; z(Qlv}PN6|PN(6E;2an`vL`_@yO?qJC;P@{8vYQ-gpOT5|>;#yiq%Ue-ReVHw+2W%e zq{=3^Ip7_cD(21t@QnR^{zQ#4pz@ovv^}liguVe23r?pqF9L!W{YRmu-G`e9j--;I zd5_qk2~O0##3hd8g#{#>;&O`+xQ!oOU9BiPd<(D)k55i^gZ(c^U2z-F{%+&M^gwcE zgIE1z;ixkf76A$7S%AHdJBvga8g^wiW5WHCr$q9Mk-S!I*ZdCGe@I;Jk)&{&T50d+ zs4gKZMav9Es;6f+4_qkx&f7nTVC>c{R`nv+EHH8`YV#M?eFJYTUg02L@*x{L2!)AX z7|qQz#`_9Ju&941bsy8f;2f%Pua95}2kJN{FE77Sbvlnk#!QXHl}x2H2cDFl4{cUD z{k&;zKGqn(WnBI22sLFAe14F-Y-&{hy01GWF;N}}EXb1yf#u-ppdQQU?CjL$F`TS& zq^Pj%n+N0hY-79(!~Eo2Mo()cy%8rT^NvT~oog15km_P~n<^JsjMW`%Q*pX*6#yw- zv6kBSLfG6lcyIbY_B=*qq>zl0q>KcU-k&3t6v}+=k8V;aEfMX0JX)GPfQPITS6sIRph#k`q6SED}B(hWrhapLPxwvu{s#( zq2{`}y2ok!;Xo$Igao^!O#d{aiZnbESc-cI@&>RVDNL+UKY;XEFUar8)NF41OF=F@ zVt!>Ma>}`*9~Bv2LOSJ)YA5XoYUxLH1YhhiFy6l}7I-2E(o(>G?iY=Yrt!35tso@^ z?|OU=P{Xtgt&u7I9fT#F03_^(zdi{cYpOrknt}D8JOGY>t%|OZaPH`a7n?!j=Nrdp z^xQ%=7~HJNt;C^^Ow7#To-RA|R~ejf(!sz1Pc6v@x@<#(7E{GkuM! zEd2UG4i3l$VjC2>&qgH#h(=!lrC`ynE`2@hfl^DjoPKm}e!hUs z?roh2jpg2SB_}7&f`S6U=K~=%GtF*_-Jt%Y0rw|!zJCh@|BV3SurkElBQT~H_*d;A zU0eE=i7H3mr6hg!rno9u2ZuuY7au@D6981Kp6y7@=eNHqHg>sHj70Ba;CF}m-^kOyO36QM4E`N{<~qw!jY{_v`2qH&dotJZ z8{cW(M@My*g#ABgAN$GPUeXDDOwgX0LXI>0mdi9n&i{|NG&+@w?_OCRL<@;g{XEEB z?I`RRpG>f@M?CI0#2ULaB^}B5!15sXejlKVgg+V5y^)}*WkFVAP5DS&Usi!#HdL`O z4m(D9Gp~iwti$y|Y1FVS0q49YZ3OWCe_jHO)@}f!F!mD=c@=OIKADB6GLU;lWAb_s z_HdilD}W%?7ge_cc2=GZe3GS=4yaY_rYJz(HfTdWUHWkfkRinrIa+4hOAVrOajfQ( zbq*jdpViNWL1i$NysNE(xoY9=;(2*)HwMP-Zw|JZ_Vt>&;N2AytJ6aNcNB_MWY+Wn zY-h}Z6>Uj*c31;j`W#6=|L+n}-D(ZS=|`Z$8oCFRgM)*|U`bs^-q3TRLa%u3u6%EA z=LgAW1TjNk{$1)aukgzWEo5Jk%N3{!r|&IZ9Hmc>GQ zY)>j*n2<|R!8^~JJ0O4t-B_np3u(CSc=vA30#RW0)w zIc5tDEMa9$O;)gBP*GrKcoTN@!Hpu1-1M{8U{J;i3O|?P$r3*w%($O+{Dp>mUOMP zE7SfyoQHge8^7d1Uftw(WHqv`yGZ3rNfNe^;q;D#MfcZ9l+S&D*kI)IPaC$HX&R>b z;G|NIfpZ5597Z$29m{s*!Nnxinlk5tAjrxGb-b;k1B8~(Y@gjcHQOH!pJhS^;;#NX$qTw}t{TNdpfWq-pbk4U@p#Fx4j*qDXM#pnM7__{)GKCX!=I z`68RUDn^cZy<_kaymn2+aD-1=;wNlONu3WJeDxaCh$!W{_jjIx-75tJ$z>I-pJJFV zC@a1q0JAnqnXl{CpJS@J)1S2WX=8qmlL2yIy|@ZAP3+Gj9CfHW$;nBkLkHlA5%Jb} s5Ak1tv$Yj@9Ka7$%^Y*3b6qm%jtkogKVR|z4~t@{C~7D`O(?SR>;cUBaTr*b~X`7wu~HP@4a{S-h2O_ zeSZJ(xPOoDec%80L&Q1fyC~n&z%$2CtS1@PcLz{x)ON$Cew?RnC08< zF{`jBXfxlC3Hzy{Gjlggfli@SCYPs>XwJx=wb$PG?z3bPgu zAt6tsi$FZ_*}8&wMuH+kc!$%X5r{~v>8ps8dq@rhfy5b@IEl<0ggp{;zP&ZsQm}-A#UIFzfJ$=p_15--CkAj@sT~F-_Hy_{n zNRf%#oBJFbo7Th0+8aG-0sD_vJK_a+V%rb;V`F2>joYF{N;iqHQZq9Jn(RV?f)wK4 z2zstLzj?!g;!Y{%r{WiL-`m=bXnL9?=5n&OT=dc8cI@pgy@y_5`*&B32ea4IsfT1d zMV!{%lXows(*i8`-Fm*rP){U;goFeKE1j;EyKQcqCLAtuBy@Fj5a8jNKUISRhmcbL zJT=WsP;%MXYx%Xm+F74u=5<|bsK39zM+wpW!V<}WUuWv>e7(hw|L02`9nr(Z@^k!? zg8h-%#*pls92sO(WMq51NY}UOu=3dB%ZtP6y#05|nQbjCN)Cx}=PdEsnrdo4?U#Eo zWHA+SVy!MLc_fLDsTEF}gf#pKrK!Qe9s9+rNIDvtWIppj#YAC;^!;Xe<%nx|cr902 zT3VuSMPpm|{voJA=Ukkua+Ho(AybF)^e7K_#(&zyB<3W3^_zbue*M!`7FO2EO7zId zT2GqX=4g3a&17nW)vTa$W}n;s3ZKSB=?(bx&W-4oj=D%Jo z($Ueev$buGYQ+3_h}yg@ZiSAD8X%csP*PHYJvcpn+#F0P(B9E**)$x!?(gqU$WLw2 zKV@2eX}hydtG9EoJ|-7T^|Rl4Szt;P;hE2mQfF-$7~B$e-McSI6q@|d^J3=MI^HX- zZ&{mtsIN~|N9X*)_q4#ofIjq*F4}q9JYHR0y{WM=E-o(o`cR&h-g6E6*@fWx^!g%` zt~Pq}X+ngC0*rH-%kLO?9ym`}L z#$d5CS%lQ-_3B`bi;D{~HHA--mtwtVR!%O2O2}o$Xm$P8&0C4$UY_~OuTVsiL>n6$ zzDhXaZO$cp7ORC{+qijnZsW^3J0C@}X%!X~)z#GrVKog6#Z+Va&{|ERm*+(`rrC6>U2U6tWA4ng z^s%?McW5M!3!jId|1~E$M^d%({?5Snf$aK*1_+4x<>lDO&wKO!LATgd46~M3mXgFA zggH4sX}c`6$3|hW#wupS#f^Sx2vSZI9&lalWbgd&;R7-i&Qsj&0G}>0A=1LqQq+Fw znQ&s2^R|JR+48NE_E*ksZuF?ruUgo6J?PFBWnzv3JcEdBa{VB zuyBGQyF(BL6T`#bzI@*?CJmFjTj_Pc&&!+Mw=5J73YU*L7!}P8Ex(CXv96K zJRZim2hKX%*cABtV@o~O)lC{&|FHAnHKpgtURGh@PK=&sjVZZQVB7rQz(Ckju2@AI zo9(>H`v_t6vD#Jh7C(Kq&6=!3l`fZLUw==}qk{=8Zes`|%qxF4-D*!!yGBJrLqh@r z0wJOD;#D)BGkOk2#@E)?)hurZ633jV5~;qXr^DH_i1#EUP^qb@p*}@MK9`opw2t7o zG(FDx{_VBc<>s@3;^Mt{4+$ik0WR+QvorUdvAVOf1-%k}dRA5ukH)>gz`*culACH# zK0ZDf8I0W3wzjq!-yale{BHH;GHleYwB6sBs6cbPkrxcPPA$wUMmIUw8C@FQHs5Q? z%jfX(Hjjz3voo^S?&474#f#_`qdUU(kDorx)8rbSzM?a7s5o3IXg4*(s2rl~cDUiO zeI{dRxjvAsPC7#h*FY>KkUMp>xan1Fy2#+dx%SCztW$T`80WBxZH5IF}Nzo zqlH@9^Ii6puCGaB$UXJJE{d@M%FsQ8)3Bt&1lj$l>5 z;>0o{D(a@x()sBj&+GQ?p*|W>*Wx-XoOmvNa)0WF_WAkw-L1W?`N`8N)nDOYdM}nL zhSgQ2`@AjlEyqeMtF2c}hOg5VTTKYd$Ta9n2aJT4(in=o?o1Fu(%rrt+pUy(=gu9+ z5=W?sLt=_;qio#7SJ{I@d*H&x4~+*d_{%gTli8fxPdIOVO!tl2=f88uzee zc-VP;^k>KSm8ohkcPV#A$AjSl!(bfpJgtfl#mZ#Q6SMu50fqDEmDS}?3Za$SW4s*u zvC+}E27}xC0)@r-kB~VU1qS)cf1tVV+3#m4#!4}YA#|veK4~R~F=f53Y=1Lv@m_bO zvg)C{TKd{p>E?1@rrW{V@>&R@JJF*nrwiqrq+Yt+HFarZY)prmM7!8+{jRZ@ZFF!9 zMG)P*qBI;)t<~RWDVB=IBCghX7^|nN+iApY(w?AiZ9O$2dPU+n(ta3;KF*}&z8!phhWyl@7I+SNUPrui3MIv3o`TYmz3IK6WkB+Fs+&|L>23)7T z;vfvzHO63%X`8pb>XnxL{d+<}!rtEA%*@PV`>MM~dJ*XC%I@{2I!XJyH&sMwzD zE$8%~{oU(tROL74!wVgVeX1@Y_ym$}HEeKc>Tng}Vs$9T>v-quuV1d+qbaG<0lB(A zf2F6_*VXyfyn3*!x3IRR_+sa9$}7O%e{gV+@HTh4T<9HU6V>n8--mMaoR()8xVX5; z$jGX{dO}+*bvtUFhI%4O?6zbtEM;1_J6E_`vhTf z^i9JbUBdRS&^_1GEO$TN(GsxE%FY&1d|T!`ZJ_P0ZDqxt=eu+YK`48bU%swjP?ABWs#P0{#}oMMV`}mlrn73y z+(U)z7Pd;`qoZG&o3vHOEdKeE&*eOu9g}CjZ%-`cv^gniw}9_k)7;iJ`}3#Ox-jb5 z$@<>Tj;)h`6Jvxt5!UgIyd=0)i4Pq}=y)59pBPBZJd!(d2rzwTO(}ELw=?kl`wht$1Y>13^g#_DLW2ajxNe&Z+@dq$A8sEXKWm+5?de-38ayL8URSO*VLq@H4@s( z=PxoyJ%9cj`XrH5Lqh|`zZ(uARdYv&$I;gGXD-8L?w>z@GBPsGoes|=kOkCDcer=} z9w;e!p{5q)-fU0+3?$yNH%%^dX2#$mih+Rvu4X(|3c0^F5-~(26-XNhXF59i5*nIq z<%bW~%9GT+e*~!ee*UZ>BXiaL;1K~T=Kjh^Q6`|H$B&VcL@X>U(b3UkrPhla5=2-o zDMK@qt#};F%*^ugEdUGP3Q*6Kl|w#!cv7VF;K2g`p7V=`Q`#C*Qa*)+h0)QsB#Gb@ z$imQ zs_Q!NthQ*jfq{Y3%W-j+ow?V^@3L}L|AMl`#Zsdd62GKt>bcsu*RShUII@x1w1iU; z29$bVoFhj@NBsi=tWPXeU0jaelQMl)WUQe(!aJ)bD5ui3l(7Gu6!VSt(0HLEQT^ph z7A7VWefl6?R5zt7E99E#m#aA&EPDZpPW2pwAg}n zZSUw%i&T@vr>QaGjtGy4KIRxhyA+)}y9pDOYZs}H?S#(>-F8$h@*TxGcMBbIM~ z&*SufV3Pcy>z=7Dm(T7d`_08_>TKhSHeeV6Z|3gb3gUAdA9i!vB*v=I^Y)Tv4``b& zo?av97VU0*qOd|qsl`#RVtn()E%&0_J+0-J9>u6$HiYw+FJFL{5tESgj!+bG`G=h9g3=}IEcH(j`mf(5&9c$?W zi};IN-O7{MrciEfZs6|pIdZjfc)XaT2Pv$*eM3P)x9i-Rr)`N!Nh>ga-4(RJ`VYDX zT>zO27sxhCrnUGS3akpLQ|crL#7mTeBMt)b$4%ltDI(#V)t2^2YY+ZyL+`tv$`I|i z=+;pB`a!=*p*%X8PU~L1Ve8CSVM2pI*c1ILtvEb)KIYgZv+6(~T5-p24cbKEiJr-1d${)#T9D7#jCq|h`=&J0t{pxyV3Zt4S*eh zI(bDRcNM)Zju*ELo0jcQj`0?&^ZZdqsJ|7EaEfg_#A7+x>tcIrtITozWzoL*;E$f3 z9vdg8%_Ty6aUxxvf1pzUcmtxv#=)Wf;srmC!0yft(7-oO6Y3+Ln$NU!fL@h5GXulG)VIs=ayuYMqx~nXQLG~tB>@3)W5N^PAa?+IM=msgs}sv~_Hzs4H1~s=%WO z7SoJ3ZuwQ;S5E~8dj}#Z!H~XZcmzVq_K~Y}O!b6;girj)rp~kjItLtbzkg=|kz-|L z1tgLUI9+4o`6yQP&Wr?|vbS_zTt2j;dkadoagW$v@qUy|!xi&}PNr3ArBmfz4h0Qp zg{!Npfz%i1KsE8Q$Q~ksG<_cdmga0$Hs+{^2-UT$VT<#yIynfkU)EDqpkOU7E@ozC zmiDp-%bNF@rg(|Fu~~&jMa@rdOwZ5nk6BmS2qqXdg+RS;sITAKn4nD4XS0H$$Kc#I zwI(4jm^ZcP>%Z8Q9D(;dE}tw+G_U&NB#1T;vW$xyA4L?=k|65Ff80Oibt&p`V(;X1 z2yzP0hK@uLf&2IGi-^S6yc!-I#m2_|@c#Y!RP`m`hziH`y8^hlxPZbzFu23_rXLWx zv5}D{XfwZl2~$$W-w|~k9vg#lWOTUEg`-3%V3poun*AbY#vvm&cLO@VUV(vMb~bDI z>+v!hIQy?Xra)L>zre_U57 z@GXD`5JXtn*a!#-tK1HAQ7BYJg-E&FEoy3y;~ithh}f{O>FH@MxG-G-U^&uKQgCBi zUvV-j#TA?Oe2L-E>jad8Mvpf(`u~VfKRVuBgpR_`$ti(cUi!OzTGg_M^y*@T27m9~ zJ-8bU23N7MU%q^K7X=j8aeXu@A>nL$Rt|_i5DAW##eq~3C}^AkM~8t>L9EQpD@=Rt z?o98@w_RSGZbA>V7%K_3m}w59hj#bd#(iVFyy$g@6f#GDDx6u&jbm zeC@ogUbW|XX@6ILe=!>EzR_hDDo1m;w`c$P57C`Fx?1XR!<2~XVIk=cWM2u&ruCST zD^=tj?C8blmA%!!gx-)EJ`=vRwe@|4EJkM5vUL;qw(F8fY_E<;+u&}O9hE`Bg_Ru{9Z_~na^D?P!o+b8Wyng)}7^snG4(|t3WL-gFA@@^`u0MZX zX=#n&T)%Tx_$Q_)%LKGESd|MveM_W0-@kvqefu_OYi^grA~pK8G3z8)HjAB!TU&20 z3gS5RYyAl*IjQP6f55(&1en%cN8<&oK|&em%AW$z*m5{;PW|lJGmZRL?|Kkv3Naj9 zJeuCz4Loqw?Fg`#aXJlDZ!5 zX!6G^S=Aa8jEjzQ=$0Mrc8LS!r8p1(6>(;+C8Dpd55SF*k~q!Gv|z}r;ANFRi^4#A z`x=zPz6>SEnK*z^1qEDQCZMr`kTEwmSG8ucx4qPy76wN~rZOl*JG;5y+9=Dy%Img{N41n+I)bmxVpM{TK;OStCLn%X6NU3Y+GQ1UX44Mwt<1c-B8&#rlzzgY(lC)A{Gt~>w*a=tDpf* zy2+{hqjn7O95PED0_APKEk@z-V{!@#VG$7~*x_w%lmIuIwgQNF=GLHJzOy5Bi3?hr9A=V!yYtwCYtAfe86M zE32o!|6X!$fByrP2eme5yZuiUl2OcXO0nF2w1F@RXb8GRc_8qBgX8jL+MMZ)IkJbY zM}ZG-Nh1da`{M}sVGfY<{rgH^=5;Sta{r&h>=7+Soa7LnXHOvkTie~F ztH8^+2AtA!rvANJ_KTindwE=W_yX=k@nxEP(jr&X$S~0T`Y}`qSjYrnhZQK^bE>3F zisR(yg0gRd5O8#K@3iHu0u7HAy-F{0jLyoov(UDT%Ify#H-@OF=*3P)#@9>Hd$l%e)v|6`hv5+s6^{E9m+$DxErTLX zMCV)|%gf)KBl~2xd+c)j;1*ufR+m?u-sQbNF{lvq*V5EvU}6{xDVWbuRD4XuZ$W-MsRnw#x*AWc zBI=o>=Q}_NLJxB6Y3b?HQc}F7-!|iR4~ldL&o3+-tPBJx=8lhR+ZqRicz+6gyzRBk z;Uu1vltk|D;_CX^$Oy!BAohTN10O2>zPvQggS8tg%_}apmzI{cx98nthNWX=&4!s2 zXnTbt7L)#SNil_mwz|4^V%ivn6ciLh1O*>xm%RlQdv20I9K>%B{%~+`fZcs5E-r=^ z&By03@Lf$Xq@uh$N3Xi7tc<*A8w5Uhk;AQ7gb~zem_<;R_ck{_R#p95WBDEs#9TL`saSrC&nb#xNL!&P8-1Lqv0goBNp zk)95Pt_ZRwJ>6(`q2q7$-XGFyG2y}=`{lqIQ0D@&R!am^VnV`Ez_$iMd~!|+EiJhI zGRQXCKtOvDzQ<6G4X<9kT52`Ha{oRp4L=@Ms_)jx9iU+_!GbmpIvwB}m?Qy0gI-Z@ zli-AwxQ0Xmn=U9Vb+WVL;p3aXY;&@)0kLiNJZ#o|dcW_fcve;x)sNKIia|c-?^ilt5@l|4?T-X@$>K3 zMZP{hpb;k|jDL{{@;q5)^6)r^rQH$`g^1xX=^U@}7^|%{Sn5uN2_)z$fLM*BLCS_j zsIb;S|h1ag(RcXfT8ZAPlwH>Lcc~^=*%E7_WH9r23l@%oKlA_bQwhLX!)&>UL z)|2SY4P?Vsz;6g%ww#woNtw4x#6(t&U#uF}-^NEh)3qW@V3EY2B4oOIw{~PiGgl5z zkJ*QCpuc}_p@UM6N$%*O7tWJJ7CH*j19254rC?a#jEvV777y^3Lo?Iz3}3(IAGCUa zf8ms}a{B9E*_N|>mvIY@sT-$?d2#F;WdXeFcS4(F^qMs+J9m1RT4_X8U z-ncGZLG`C>VbD6Q|aYGc&R%Q$Pft9 z-M?M{e*Q_w7}z*Dx6B(L;3_N6L)XX=DMiod(VX}&$^`tBo0|*rx+JpF^W3%lGZ&-? zWClq#pgol^c9)iryPQ>d1 z4N+%$@e$YCO168;V6~`Pa{=OQeYIVkO}ngnYU;8s;5r0;Jin#u(Uv}J&z=z_DnrRG z%g#0jU8!gbW^7eeRY*E0P%!#}3B#K=ZyX;@Vcous@b1RFp?lTu>J*wqOzQsm3)hO% zzQRwRh(K=y2Dy__f4DgXwLG&=+(}nKft81+XaxFBgt`Qb2>~+to-j5yBM_(%ihy7^ z-#O7$dDu6653`9;Z+_?=|~RPEIZ_FT+B>NSAs- z9w8AxvXoJD(cx}jwxI1si7G@5^qi-#lT#s3kGELo zabb$6?Y3$D$_PPpt3*s|%P#a!KJovjIU{|8NEh%6FGUVSM3Kl9#E}gI7213_;?FHg z1maPY!VDDqx1jXRafi$%j@?E`s7t&PNT6qc`4hja^*Ip$2WwHnr>nAq3b8iw(g9oZQjDfsKV_1zm-SKzYLw0e93Z zG{P-kTV1UH><*MpCg>K7;V9`q#sY?kB7zW_h5!LIgcF}q$TmGEhpk-R-oDt+uOX6I zl}HLmCTu2MN&8z{L{FxKH)e*AbUP%{QvIowU)jkQX(X0>6@#~~5fCKunvs;Z8*vj$ z9UmWqT1hu#YHl8Z2fsjspv^_iO-(=H!R07CeQHu9KE<2{vT$qb6Ah2qpLgxy3aD)g zI05UAsv|4eo_O0_U>M0| z0|P(vnMVU>2%#2f&Qw%V0v2Bax`Ro>^Z8BzR+ey%!oqO8dRO2JmH5)BDGt zoSvW{<)Cdf&x5{6NG%+xeTUby8|Z|{7dLU|t~Se(c>fGpP=AlNKwX^FodmbSbTyy$ zYO^SZ?yK{iHV%-h7?MG5>1aK1XD$P*{a4e!bqffD#Z;Bf)=5P`dU|@fc$Z~~?Zw%# zxz8X{qi#`@gQ{*>kUGHTme@6vdOWaN>8DSh%F8qJ@qq=Y4aT4AOSinX5{9C4w7`}$ zzqDj(Wu>dGzF6Jvwf^g;?DKAC2f<%*zuyR_D=jpn@kXf$1aN@&za>z=r!wVRR zzYh!~*B3RI{}81R{ebxA>Bo;W;up!Kms@vqfy0mV8uytflA*CF4mJg6IXkJpRQQ2} z5)H;B50A=UzfK@^uA*;Sx}E*0lT}k2_-Q`GzOUuFyz`YUzH|>JI56Y@4D%=P$&OO; zA+q`COCLyNWo2bQK0ffR`9s}V-_#TzA74>cMvLON7=C4Hs_|0g1QWYx^*86o(x>MK z$)y)L{F5Jtt?FKn_OBd=K zY~qCtG~)W=mM6tWN6uh60tGiFPrJ(LPL*>Q{#=9CdIPPNt-idvI&_&`P(Tb0n*=H+#$2VJ+o8MfFmYbN0cwMG zbWN&59+Dh;jMA&f zNpv;@1_kXVAB&px-kS`amiZL=cY7N26jxBcE7U6i)X*a@S(cgE@jLm8f9;0X)?AE@ z9&qwLpAqHd8S}dI^kh1~L3H1IMvEqrN=n-9=}GpQ*3g^kFHgik*kA1zgqk(iKfo7u z$wht?%ahyC(8kL0B0*F{RaG_QL0SeQB`MF>Z_U*|)`om>#JeyE?)-3^^ApHF5(%KtS+V+kC zVyV{F-o?(2oo)FK!5&-|pBI+Z8-+b zYf3dUX)RqB6Cq5*$GCRf((-SDFg8^s!+Pp&OOXQ1B zgKa;oZz)tqO>SH~3#FyUL=XvohT}X_DZQ2lP&mRV@(RMM)3{Xt|8w2R@3iX(6B;Y@-=D>g{OmhWFIi8=5ld~Jtt|w1g2M2+(_P4bGiF5qz zjiITTyf_i`;X{UU;&~Q33kJfHvHJq=UwnE*0h2#q!cYT4$hof2frwZ4 zx(M)~wUN=>%uIMff;)(@(5P0y4EXsoQbiw-y^2aW(743JiBELWpbn#9Lj_nQK9& z0&E1?87yYhP1`W4;m|JI0{)v5K$ehm%{xDTf5a!*?a{l~H2pe%W)>D;NFO%Noe zL;WXKQ?I8BVbYZ(3IkLSq9N`CxVcI4>G11-4espj!chVH14$HjKcYPw!bF$~ywo(4 z_b@bE^#ebhWX9J%>#tfbHSeNKdE)}L)oNV|dB(MFAoPiiYIPHUdd$x+JTvUVLm=Yb z{U_&nI-!t!RNFiWmL$<5x#xrkL?DaFu&*OY7^{7R$qIs)Zf?sKX07Ab-sOK&Mm42Un^`vuw0ab{p*l6&+B?x6OQCvQNl0}cT31OxhqY~|VC-U>OcX}o>A1yLs(dWVgH!QuR5|MTb1uxOIb@02mBEpOb!3NY>R8sHnC zqod1ykr&7B5f@$Ok?^;_YVvK;E#)sr=+ChxO8w)b5Ikhz|oTnq#fQRxw$^h)P6`NU`q~yViT1Qxnalb+dAV@|*fJPjC5eEq zgU0YaC^RBGeCP0R3h);#XNu?q=3V3g+{%DI#f#NDg|>hQnB}uLl4oqo0)qsxm>7f_ zdV6hwBajo=IoXksl2*9PG6u_ny4}&<{39=0U0qfEg~|d^!faCr$Dv*>Z5}Nhdx7cn z7r<_gj@PRcZc2jfgk`jRvB8Mj+}s>$`F(o&zBT5_1a*D=)VMf`Jdg|a!8!>qdU;)f zzzuNH5uQ1C_wF6cEBF7`^#=a}@*@7FQh{GSx#>yHW8OdwhdSmhl zdyGO_kMlH)V)p*jVCqVPHUJJ^EJ;Do!-a&@o0=bln$q>xA;_hdkT-pCFI#$3R+wwWoxoLb4XaYmMxqQ6*k7Q)P z{1F=)U+KQTQ&WdS5KIuR0vbX%c?dC;L2D#)YHI57)nlxH`}ZG|MLQBOu1RXufVIQ) zGPeUv8ik4@^Z}t3*Cy^UGn*M1?ZNno6su-z*PuWH)@iJ^1Qu>@V7bElkR99iALuDu z&W7Nj@~z?I;n_VnU_=^#8_H|rvTvf}9Lgq4y_>%lZB4&a*lYdOe7|R9 zP1pX1U-bhNEB8M-@f%}EH{CB+7^5TvFd;!ky|~}``N;&WLIs=XjKer0B+~uz`C zzMkhW@tF&ybK;##Kn|#ka;}|6d<5`Tw#1-F~2U z%UZL0iXR?EpzedGY>1EwQS+OdH01f=?)RTL|23HGM&Cgox^0^0X7n%vf)U=iAu-x* zXEEC^q`<=Qi}zw~CVBVoqc8S49pOQj&BWje?3Vc%uKm{@*vPi9 zub1-df7`nKKUWyZ{{0;Fl;VH=MabtK*<}LR--m6APT*OfDW-qTD)1=Hqpr4&Set to Origin button restores the default rotation point coordinates. -- Select Point from View button allows to select the rotation - point in the 3D Viewer. +- Gravity Center of Select Object button allows to choose Point, Edge, Face or Solid in drop-down menu. + As soon as corresponding object is selected in the viewer, its gravity center will be used as center of the rotation point.
diff --git a/doc/salome/gui/input/vtk_3d_viewer.doc b/doc/salome/gui/input/vtk_3d_viewer.doc index d09134121..2224cfa53 100644 --- a/doc/salome/gui/input/vtk_3d_viewer.doc +++ b/doc/salome/gui/input/vtk_3d_viewer.doc @@ -91,7 +91,7 @@ which the rotation is performed. By default the rotation point is located in the Center of the bounding box of an object. -\image html set_rotation_point_dialog2.png +\image html set_rotation_point_dialog3.png Unchecking Use Bounding Box Center check-box allows you to define the coordinates of the rotation point manually. @@ -99,8 +99,8 @@ define the coordinates of the rotation point manually. - Set to Origin button restores the default rotation point coordinates. -- Select Point from View button allows to select the rotation - point in the 3D Viewer. +- Gravity Center of Select Object button allows to choose Point, Edge, Face or Volume in drop-down menu. + As soon as corresponding object is selected in the viewer, its gravity center will be used as center of the rotation point.
@@ -123,12 +123,12 @@ These buttons orientate the scene strictly about coordinate axes: \image html vtk_view_anticlockwise.png -Rotate counter-clockwise - rotates view 90° counter-clockwise. +Rotate counter-clockwise - rotates view 90� counter-clockwise.
\image html vtk_view_clockwise.png -Rotate clockwise - rotates view 90° clockwise. +Rotate clockwise - rotates view 90� clockwise.
\image html vtk_view_reset.png diff --git a/src/OCCViewer/OCCViewer_SetRotationPointDlg.cxx b/src/OCCViewer/OCCViewer_SetRotationPointDlg.cxx index 527f6cfb4..7cb449b52 100644 --- a/src/OCCViewer/OCCViewer_SetRotationPointDlg.cxx +++ b/src/OCCViewer/OCCViewer_SetRotationPointDlg.cxx @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -77,11 +78,20 @@ OCCViewer_SetRotationPointDlg::OCCViewer_SetRotationPointDlg( OCCViewer_ViewWind vbox->addWidget(myToOrigin); connect(myToOrigin, SIGNAL(clicked()), this, SLOT(onToOrigin())); - // Create "Select Point from View" button + // Create "Gravity Center of Select Object" button mySelectPoint = new QPushButton(tr("LBL_SELECTPOINT")); mySelectPoint->setCheckable(true); + + QMenu* menuType = new QMenu( this ); + mySelectActions[ menuType->addAction( tr("LBL_POINT") ) ] = TopAbs_VERTEX; + mySelectActions[ menuType->addAction( tr("LBL_EDGE") ) ] = TopAbs_EDGE; + mySelectActions[ menuType->addAction( tr("LBL_FACE") ) ] = TopAbs_FACE; + mySelectActions[ menuType->addAction( tr("LBL_SOLID") ) ] = TopAbs_SOLID; + connect( menuType, SIGNAL( triggered( QAction* ) ), this, SLOT( onSelectMenu( QAction* ) ) ); + + mySelectPoint->setMenu( menuType ); + vbox->addWidget(mySelectPoint); - connect(mySelectPoint, SIGNAL(clicked()), this, SLOT(onSelectPoint())); myGroupBoxSel->setLayout(vbox); @@ -217,8 +227,7 @@ void OCCViewer_SetRotationPointDlg ::onToOrigin() { - if ( mySelectPoint->isChecked() ) - mySelectPoint->toggle(); + mySelectPoint->setChecked( false ); setCoords(); myView->activateSetRotationSelected(myX->text().toDouble(), myY->text().toDouble(), @@ -227,12 +236,10 @@ OCCViewer_SetRotationPointDlg void OCCViewer_SetRotationPointDlg -::onSelectPoint() +::onSelectMenu( QAction* theAction ) { - if ( mySelectPoint->isChecked() ) - myView->activateStartPointSelection(); - else - mySelectPoint->toggle(); + mySelectPoint->setChecked( true ); + myView->activateStartPointSelection( mySelectActions[theAction] ); } void diff --git a/src/OCCViewer/OCCViewer_SetRotationPointDlg.h b/src/OCCViewer/OCCViewer_SetRotationPointDlg.h index bd388863e..43b36d1ac 100644 --- a/src/OCCViewer/OCCViewer_SetRotationPointDlg.h +++ b/src/OCCViewer/OCCViewer_SetRotationPointDlg.h @@ -26,6 +26,9 @@ #include "OCCViewer.h" #include +#include + +#include class QtxAction; @@ -33,6 +36,7 @@ class QLineEdit; class QPushButton; class QGroupBox; class QCheckBox; +class QAction; class OCCViewer_ViewWindow; @@ -54,6 +58,7 @@ public: protected: OCCViewer_ViewWindow* myView; QtxAction* myAction; + QMap mySelectActions; QCheckBox* myIsBBCenter; @@ -72,7 +77,7 @@ protected slots: void onBBCenterChecked(); void onToOrigin(); - void onSelectPoint(); + void onSelectMenu( QAction* ); void onCoordChanged(); diff --git a/src/OCCViewer/OCCViewer_ViewFrame.h b/src/OCCViewer/OCCViewer_ViewFrame.h index 977436de8..5c1b95297 100644 --- a/src/OCCViewer/OCCViewer_ViewFrame.h +++ b/src/OCCViewer/OCCViewer_ViewFrame.h @@ -27,6 +27,7 @@ #include "OCCViewer_ViewWindow.h" #include +#include class SUIT_Desktop; class OCCViewer_Viewer; @@ -118,7 +119,7 @@ public slots: virtual void activateSetRotationGravity() {} virtual void activateSetRotationSelected( double theX, double theY, double theZ ) {} - virtual void activateStartPointSelection() {} + virtual void activateStartPointSelection( TopAbs_ShapeEnum ) {} virtual void updateGravityCoords() {} void onMaximizedView( OCCViewer_ViewWindow*, bool ); diff --git a/src/OCCViewer/OCCViewer_ViewWindow.cxx b/src/OCCViewer/OCCViewer_ViewWindow.cxx index b7038b0c2..0e2505507 100755 --- a/src/OCCViewer/OCCViewer_ViewWindow.cxx +++ b/src/OCCViewer/OCCViewer_ViewWindow.cxx @@ -65,6 +65,8 @@ #include #include +#include +#include #include #include @@ -488,20 +490,38 @@ void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent ) for ( ic->InitSelected(); ic->MoreSelected(); ic->NextSelected() ) { TopoDS_Shape aShape = ic->SelectedShape(); + GProp_GProps aSystem; + gp_Pnt aPnt; if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) { - gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( ic->SelectedShape() ) ); - if ( mySetRotationPointDlg ) - { - myRotationPointSelection = false; - mySetRotationPointDlg->setCoords(aPnt.X(), aPnt.Y(), aPnt.Z()); - } + aPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape ) ); + } + else if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_EDGE ) + { + BRepGProp::LinearProperties( aShape, aSystem ); + aPnt = aSystem.CentreOfMass(); + } + else if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_FACE ) + { + BRepGProp::SurfaceProperties( aShape, aSystem ); + aPnt = aSystem.CentreOfMass(); + } + else if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_SOLID ) + { + BRepGProp::VolumeProperties( aShape, aSystem ); + aPnt = aSystem.CentreOfMass(); } else { myCurrPointType = myPrevPointType; break; } + + if ( mySetRotationPointDlg ) + { + myRotationPointSelection = false; + mySetRotationPointDlg->setCoords(aPnt.X(), aPnt.Y(), aPnt.Z()); + } } if ( ic->NbSelected() == 0 ) myCurrPointType = myPrevPointType; if ( mySetRotationPointDlg ) mySetRotationPointDlg->toggleChange(); @@ -744,9 +764,9 @@ void OCCViewer_ViewWindow::activateSetRotationSelected( double theX, double theY } /*! - \brief Start the point selection process. + \brief Start the shape selection process. */ -void OCCViewer_ViewWindow::activateStartPointSelection() +void OCCViewer_ViewWindow::activateStartPointSelection( TopAbs_ShapeEnum theShapeType ) { myPrevPointType = myCurrPointType; myCurrPointType = SELECTED; @@ -765,7 +785,7 @@ void OCCViewer_ViewWindow::activateStartPointSelection() anObj->IsKind( STANDARD_TYPE(AIS_Shape) ) ) { ic->Load(anObj,-1); - ic->Activate(anObj,AIS_Shape::SelectionMode(TopAbs_VERTEX)); + ic->Activate(anObj,AIS_Shape::SelectionMode(theShapeType)); } } // activate selection <------ diff --git a/src/OCCViewer/OCCViewer_ViewWindow.h b/src/OCCViewer/OCCViewer_ViewWindow.h index ca1869d2e..57b819862 100755 --- a/src/OCCViewer/OCCViewer_ViewWindow.h +++ b/src/OCCViewer/OCCViewer_ViewWindow.h @@ -28,6 +28,7 @@ #include "SUIT_ViewWindow.h" #include #include +#include class QtxRectRubberBand; class SUIT_Desktop; @@ -266,7 +267,7 @@ public slots: virtual void activateSetRotationGravity(); virtual void activateSetRotationSelected( double theX, double theY, double theZ ); - virtual void activateStartPointSelection(); + virtual void activateStartPointSelection( TopAbs_ShapeEnum ); virtual void updateGravityCoords(); virtual void showEvent( QShowEvent * ); diff --git a/src/OCCViewer/resources/OCCViewer_msg_en.ts b/src/OCCViewer/resources/OCCViewer_msg_en.ts index efdf010e6..40695337d 100644 --- a/src/OCCViewer/resources/OCCViewer_msg_en.ts +++ b/src/OCCViewer/resources/OCCViewer_msg_en.ts @@ -352,7 +352,23 @@ LBL_SELECTPOINT - Select Point from View + Gravity Center of Select Object + + + LBL_POINT + Point + + + LBL_EDGE + Edge + + + LBL_FACE + Face + + + LBL_SOLID + Solid diff --git a/src/OCCViewer/resources/OCCViewer_msg_fr.ts b/src/OCCViewer/resources/OCCViewer_msg_fr.ts index 8e094db3d..ba56fdcdd 100755 --- a/src/OCCViewer/resources/OCCViewer_msg_fr.ts +++ b/src/OCCViewer/resources/OCCViewer_msg_fr.ts @@ -351,7 +351,23 @@ LBL_SELECTPOINT - Choisir le point dans la vue + Сentre de gravité des objets sélectionnés + + + LBL_POINT + Point + + + LBL_EDGE + Arête + + + LBL_FACE + Face + + + LBL_SOLID + Solide diff --git a/src/SVTK/SALOME_Actor.cxx b/src/SVTK/SALOME_Actor.cxx index dfc510440..3f4383692 100644 --- a/src/SVTK/SALOME_Actor.cxx +++ b/src/SVTK/SALOME_Actor.cxx @@ -1018,6 +1018,38 @@ SALOME_Actor myCellAreaPicker = theAreaPicker; } +/*! + To find a gravity center of object + \param theObjId - identification of object +*/ +double* +SALOME_Actor +::GetGravityCenter( int theObjId ) +{ + double* result = new double[3]; + for( int i = 0; i < 3; i++ ) + result[i]= 0.0; + + vtkPoints* points = GetElemCell( theObjId )->GetPoints(); + int nbPoints = points->GetNumberOfPoints(); + + if( nbPoints <= 0 ) + return NULL; + + for( int i = 0; i < nbPoints; i++ ) + { + double* aPoint = points->GetPoint(i); + result[0] += aPoint[0]; + result[1] += aPoint[1]; + result[2] += aPoint[2]; + } + result[0] = result[0] / nbPoints; + result[1] = result[1] / nbPoints; + result[2] = result[2] / nbPoints; + + return result; +} + /*! To set up a prehighlight property (initialized by SVTK_Renderer::AddActor) */ diff --git a/src/SVTK/SALOME_Actor.h b/src/SVTK/SALOME_Actor.h index 7642a8dd7..573400549 100644 --- a/src/SVTK/SALOME_Actor.h +++ b/src/SVTK/SALOME_Actor.h @@ -257,6 +257,10 @@ class SVTK_EXPORT SALOME_Actor : public VTKViewer_Actor void SetCellAreaPicker(SVTK_AreaPicker* theAreaPicker); + //---------------------------------------------------------------------------- + //! To find a gravity center of object + double* GetGravityCenter( int ); + //---------------------------------------------------------------------------- //! To set up a prehighlight property (initialized by #SVTK_Renderer::AddActor) void diff --git a/src/SVTK/SVTK_InteractorStyle.cxx b/src/SVTK/SVTK_InteractorStyle.cxx index 1274acc0d..6bb805359 100644 --- a/src/SVTK/SVTK_InteractorStyle.cxx +++ b/src/SVTK/SVTK_InteractorStyle.cxx @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -535,22 +536,61 @@ void SVTK_InteractorStyle::OnLeftButtonDown(int ctrl, int shift, { if( SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( aVTKActor ) ) { - SVTK::TPickLimiter aPickLimiter( myPointPicker, anActor ); - myPointPicker->Pick( aSelectionEvent->myX, - aSelectionEvent->myY, - 0.0, + Selection_Mode aSelectionMode = GetSelector()->SelectionMode(); + double* aCoords; + int aVtkId; + bool isTrueType = false; + + if( myCurrFocalPointType == SVTK::StartFocalPointSelection || + ( myCurrRotationPointType == SVTK::StartPointSelection && aSelectionMode == NodeSelection ) ) + { + SVTK::TPickLimiter aPickLimiter( myPointPicker, anActor ); + myPointPicker->Pick( aSelectionEvent->myX, + aSelectionEvent->myY, + 0.0, + GetCurrentRenderer() ); + aVtkId = myPointPicker->GetPointId(); + if ( aVtkId >= 0 ) + { + int anObjId = anActor->GetNodeObjId( aVtkId ); + aCoords = anActor->GetNodeCoord(anObjId); + isTrueType = true; + } + } + + if( aSelectionMode == EdgeSelection || aSelectionMode == FaceSelection || aSelectionMode == VolumeSelection ) + { + vtkSmartPointer aCellPicker = vtkCellPicker::New(); + aCellPicker->SetTolerance( 0.005 ); + SVTK::TPickLimiter aPickLimiter( aCellPicker, anActor ); + aCellPicker->Pick( aSelectionEvent->myX, + aSelectionEvent->myY, + 0.0, GetCurrentRenderer() ); - int aVtkId = myPointPicker->GetPointId(); - if ( aVtkId >= 0 ) - { - int anObjId = anActor->GetNodeObjId( aVtkId ); - double* aCoords = anActor->GetNodeCoord(anObjId); - + aVtkId = aCellPicker->GetCellId(); + int aCellId = anActor->GetElemObjId( aVtkId ); + + if( aSelectionMode == EdgeSelection ) + isTrueType = anActor->GetObjDimension( aCellId ) == 1; + else if( aSelectionMode == FaceSelection ) + isTrueType = anActor->GetObjDimension( aCellId ) == 2; + else if( aSelectionMode == VolumeSelection ) + isTrueType = anActor->GetObjDimension( aCellId ) == 3; + + if ( aVtkId >= 0 && isTrueType ) + aCoords = anActor->GetGravityCenter( aCellId ); + } + + if( aVtkId >= 0 ) + { if (myCurrRotationPointType == SVTK::StartPointSelection) { myCurrRotationPointType = SVTK::SetRotateSelected; - // invoke event for update coordinates in SVTK_SetRotationPointDlg - InvokeEvent(SVTK::RotationPointChanged,(void*)aCoords); + if( isTrueType ) + InvokeEvent(SVTK::RotationPointChanged,(void*)aCoords); + else + InvokeEvent(SVTK::RotationPointChanged); + GetSelector()->SetSelectionMode(ActorSelection); } else if (myCurrFocalPointType == SVTK::StartFocalPointSelection) { myCurrFocalPointType = SVTK::SetFocalPointSelected; @@ -572,6 +612,7 @@ void SVTK_InteractorStyle::OnLeftButtonDown(int ctrl, int shift, // invoke event with no data (for SVTK_SetRotationPointDlg) InvokeEvent(SVTK::RotationPointChanged,0); myCurrRotationPointType = myPrevRotationPointType; + GetSelector()->SetSelectionMode(ActorSelection); } else if (myCurrFocalPointType == SVTK::StartFocalPointSelection) { // invoke event with no data (for SVTK_ViewParameterDlg) @@ -1310,8 +1351,7 @@ void SVTK_InteractorStyle::onCursorMove(QPoint mousePos) SALOME_Actor* aPreHighlightedActor = NULL; vtkActorCollection* anActorCollection = GetSelector()->Pick(aSelectionEvent, GetCurrentRenderer()); - if ( myCurrRotationPointType == SVTK::StartPointSelection || - myCurrFocalPointType == SVTK::StartFocalPointSelection ) + if ( myCurrFocalPointType == SVTK::StartFocalPointSelection ) { myHighlightSelectionPointActor->SetVisibility( false ); diff --git a/src/SVTK/SVTK_SetRotationPointDlg.cxx b/src/SVTK/SVTK_SetRotationPointDlg.cxx index ec7d66e1c..57cbd9229 100755 --- a/src/SVTK/SVTK_SetRotationPointDlg.cxx +++ b/src/SVTK/SVTK_SetRotationPointDlg.cxx @@ -38,11 +38,13 @@ #include #include #include +#include #include #include #include #include +#include /*! Constructor @@ -87,12 +89,19 @@ SVTK_SetRotationPointDlg vbox->addWidget(myToOrigin); connect(myToOrigin, SIGNAL(clicked()), this, SLOT(onToOrigin())); - // Create "Select Point from View" button - mySelectPoint = new QPushButton(myGroupBoxSel); - mySelectPoint->setText(tr("LBL_SELECTPOINT")); + // Create "Gravity Center of Select Object" button + mySelectPoint = new QPushButton(tr("LBL_SELECTPOINT")); mySelectPoint->setCheckable(true); + + QMenu* menuType = new QMenu( this ); + mySelectActions[ menuType->addAction( tr("LBL_POINT") ) ] = NodeSelection; + mySelectActions[ menuType->addAction( tr("LBL_EDGE") ) ] = EdgeSelection; + mySelectActions[ menuType->addAction( tr("LBL_FACE") ) ] = FaceSelection; + mySelectActions[ menuType->addAction( tr("LBL_VOLUME") ) ] = VolumeSelection; + connect( menuType, SIGNAL( triggered( QAction* ) ), this, SLOT( onSelectMenu( QAction* ) ) ); + + mySelectPoint->setMenu( menuType ); vbox->addWidget(mySelectPoint); - connect(mySelectPoint, SIGNAL(clicked()), this, SLOT(onSelectPoint())); // Create croup box with grid layout myGroupBoxCoord = new QGroupBox(this); @@ -165,7 +174,6 @@ SVTK_SetRotationPointDlg myEventCallbackCommand->Delete(); myEventCallbackCommand->SetClientData(this); myEventCallbackCommand->SetCallback(SVTK_SetRotationPointDlg::ProcessEvents); - myIsObserverAdded = false; } /* @@ -181,11 +189,10 @@ void SVTK_SetRotationPointDlg ::addObserver() { - if ( !myIsObserverAdded ) { - vtkInteractorStyle* aIStyle = myRWInteractor->GetInteractorStyle(); + vtkInteractorStyle* aIStyle = myRWInteractor->GetInteractorStyle(); + if( !IsObserverAdded( aIStyle ) ) { aIStyle->AddObserver(SVTK::BBCenterChanged, myEventCallbackCommand.GetPointer(), myPriority); aIStyle->AddObserver(SVTK::RotationPointChanged, myEventCallbackCommand.GetPointer(), myPriority); - myIsObserverAdded = true; } } @@ -239,6 +246,21 @@ SVTK_SetRotationPointDlg } } +bool +SVTK_SetRotationPointDlg +::IsObserverAdded( vtkInteractorStyle* theInteractorStyle ) +{ + bool isAdded = false; + for( int i = 0; i < myInteractorStyleList.count(); i++ ) + if( myInteractorStyleList.at(i) == theInteractorStyle ) + isAdded = true; + + if( !isAdded ) + myInteractorStyleList.append( theInteractorStyle ); + + return isAdded; +} + void SVTK_SetRotationPointDlg ::setEnabled(QGroupBox* theGrp, const bool theState) @@ -284,8 +306,7 @@ void SVTK_SetRotationPointDlg ::onToOrigin() { - if ( mySelectPoint->isChecked() ) - mySelectPoint->toggle(); + mySelectPoint->setChecked( false ); myX->setText(QString::number(0.0)); myY->setText(QString::number(0.0)); myZ->setText(QString::number(0.0)); @@ -293,12 +314,10 @@ SVTK_SetRotationPointDlg void SVTK_SetRotationPointDlg -::onSelectPoint() +::onSelectMenu( QAction* theAction ) { - if ( mySelectPoint->isChecked() ) - myMainWindow->activateStartPointSelection(); - else - mySelectPoint->toggle(); + mySelectPoint->setChecked( true ); + myMainWindow->activateStartPointSelection( mySelectActions[theAction] ); } void diff --git a/src/SVTK/SVTK_SetRotationPointDlg.h b/src/SVTK/SVTK_SetRotationPointDlg.h index 4553cdf4d..469987496 100755 --- a/src/SVTK/SVTK_SetRotationPointDlg.h +++ b/src/SVTK/SVTK_SetRotationPointDlg.h @@ -28,11 +28,15 @@ #define SVTK_SETROTATIONPOINTDLG_H #include "SVTK.h" +#include "SVTK_Selection.h" #include #include +#include +#include + class SVTK_ViewWindow; class SVTK_RenderWindowInteractor; @@ -42,8 +46,10 @@ class QLineEdit; class QPushButton; class QGroupBox; class QCheckBox; +class QAction; class vtkCallbackCommand; +class vtkInteractorStyle; class vtkObject; class SVTK_EXPORT SVTK_SetRotationPointDlg : public ViewerTools_DialogBase @@ -63,8 +69,10 @@ public: protected: SVTK_ViewWindow *myMainWindow; SVTK_RenderWindowInteractor* myRWInteractor; - bool myIsObserverAdded; + QList myInteractorStyleList; + QMap mySelectActions; + QCheckBox* myIsBBCenter; QGroupBox * myGroupBoxSel; @@ -77,6 +85,7 @@ protected: QLineEdit* myZ; void setEnabled(QGroupBox* theGrp, const bool theState); + bool IsObserverAdded( vtkInteractorStyle* ); //---------------------------------------------------------------------------- // Priority at which events are processed @@ -96,7 +105,7 @@ protected slots: void onBBCenterChecked(); void onToOrigin(); - void onSelectPoint(); + void onSelectMenu( QAction* ); void onCoordChanged(); diff --git a/src/SVTK/SVTK_ViewWindow.cxx b/src/SVTK/SVTK_ViewWindow.cxx index 3abb6476f..63ed448bc 100755 --- a/src/SVTK/SVTK_ViewWindow.cxx +++ b/src/SVTK/SVTK_ViewWindow.cxx @@ -1866,10 +1866,11 @@ void SVTK_ViewWindow::activateSetRotationSelected(void* theData) } /*! - Set the point selected by user as a rotation point + Set the gravity center of element selected by user as a rotation point */ -void SVTK_ViewWindow::activateStartPointSelection() +void SVTK_ViewWindow::activateStartPointSelection( Selection_Mode theSelectionMode ) { + SetSelectionMode( theSelectionMode ); myEventDispatcher->InvokeEvent(SVTK::StartPointSelection,0); } diff --git a/src/SVTK/SVTK_ViewWindow.h b/src/SVTK/SVTK_ViewWindow.h index b648af301..3ee736b38 100755 --- a/src/SVTK/SVTK_ViewWindow.h +++ b/src/SVTK/SVTK_ViewWindow.h @@ -294,7 +294,7 @@ public slots: void activateSetRotationGravity(); void activateSetRotationSelected(void* theData); - void activateStartPointSelection(); + void activateStartPointSelection( Selection_Mode ); void onUpdateRate(bool theIsActivate); void onNonIsometric(bool theIsActivate); diff --git a/src/SVTK/resources/SVTK_msg_en.ts b/src/SVTK/resources/SVTK_msg_en.ts index 947d70d93..baf4c4f76 100644 --- a/src/SVTK/resources/SVTK_msg_en.ts +++ b/src/SVTK/resources/SVTK_msg_en.ts @@ -449,7 +449,23 @@ Please, refer to the documentation. LBL_SELECTPOINT - Select Point from View + Gravity Center of Select Object + + + LBL_POINT + Point + + + LBL_EDGE + Edge + + + LBL_FACE + Face + + + LBL_VOLUME + Volume DLG_TITLE diff --git a/src/SVTK/resources/SVTK_msg_fr.ts b/src/SVTK/resources/SVTK_msg_fr.ts index ba75a9bda..a6b8cdc5b 100755 --- a/src/SVTK/resources/SVTK_msg_fr.ts +++ b/src/SVTK/resources/SVTK_msg_fr.ts @@ -449,7 +449,23 @@ Veuillez consulter la documentation. LBL_SELECTPOINT - Choisir un point dans la vue + Сentre de gravité des objets sélectionnés + + + LBL_POINT + Point + + + LBL_EDGE + Arête + + + LBL_FACE + Face + + + LBL_VOLUME + Volume DLG_TITLE -- 2.39.2