From c22b2d04fe67985a4fbd7ee5dc460bbba50b76c1 Mon Sep 17 00:00:00 2001 From: ouv Date: Thu, 22 Apr 2010 11:10:58 +0000 Subject: [PATCH] Issue 0020465: [CEA 335] sort tables in visualisation mode --- doc/salome/gui/VISU/images/viewtable.png | Bin 13295 -> 31447 bytes .../gui/VISU/input/table_presentations.doc | 20 + resources/SalomeApp.xml | 2 + src/VISUGUI/VISU_msg_en.ts | 36 ++ src/VISUGUI/VisuGUI.cxx | 27 +- src/VISU_I/VISU_TableDlg.cxx | 88 +++- src/VISU_I/VISU_TableDlg.h | 10 + src/VISU_I/VISU_Table_i.cc | 35 +- src/VISU_I/VISU_Table_i.hh | 17 +- src/VISU_I/VISU_ViewManager_i.cc | 379 ++++++++---------- src/VISU_I/VISU_ViewManager_i.hh | 4 +- src/VISU_I/VISU_View_i.cc | 8 +- 12 files changed, 387 insertions(+), 239 deletions(-) diff --git a/doc/salome/gui/VISU/images/viewtable.png b/doc/salome/gui/VISU/images/viewtable.png index 13a0e5da3db65786103f013789269b92899068ec..697cdd310b6321845ebcdb762d56ee6966ca6b3f 100644 GIT binary patch literal 31447 zcmbrm1z45q)-}8og)Jf|Dxj1~DJdON1|SX6Eg&r*-5^rZ(hX8l64H&dba!`m_dl2W zoU`{i-}&DEz5d^8@5|*{i?yETzVA8bm}88Ir-Ycm4fOly2n6DW;Okd!5Qs}>@PFDL zsPK$O&xRfX@c<$C>bbOa^y-+6vh?2h;nqM72}ac9W%>0$-I7Gz>29*UDB;l5h?1nx zIl4We$RU{x3-Mb;BWuetWg!E*-ww2ks9$$^3r~f5rG*Q734OjyOU+SxdOq1+_wy%4 zE5?Wo53zq@?NRg&dt65p1#0hvpfrJMwv zl3#+H`S91u`>GxUUWy-I|L`^)pSsO^~_ ziMlakH?&Yn3s5FooYsC$h24JTbH=4wM284D;P%F2MalLFuCcT~B152{VKN1mUA8(? zQj`u$HVo~!`B3P1DWxahXbk7${@OFMQ)_Jff=C>i*r(JxeR5@;y7}Y-bOF0N#7UB0 zn-(O+P;C?z^d^rGRkm#=dV_BEnT(B<{uEmtj7i@XI!k44TJ&D(-7=?@{Nc0fmZLn{ z#ppwL`mEGyL#%@4V%E=K>ZEZb5A#+`EGa9izj4)B=;aO6)eBuR3AR$pUG}YcV2|RnvW*dp) ze|38yBB28?o~2)<7axfOr4Cox*@$N6@6k-8 zh!eZ}*++au@T`wkbog<391T=%h#GbDy)-N|e(~5-D7mJu&+RsaUuUI*4uZpcQ6s3rv^kx`blO`3^?#S=*Z&!mm9RIJj=ghw_9#a2srf(tX7rTf>P`#LmLX3uT@xITL) zbqTx6Ka}R>W|mSMN30_mWoT75EX=u!-Kow67KR?~`Bnmn_s zj=j)IY-UT#?)96T&EdgjG2}WKtKuJ1m)*ub8u4(Na(jqkV=?=h$;x=gze3R7X`8}* zf9<(Psb92k`-5`P>xf5+Ebqiei#WR~xDbt%JfF>$pRAv-JdrEA6fMm`&VS+jEX*lE z=hYRd3ES%_9$4}@dT4BH_d~I+U!OVH!I_B;YElYP)7l|&H+^M@wzQQuV`Y`xa z@|&sISy#o(`NORw>}yT~Sx!^)^X}Q%bovFQbw~D319k~xt_$FaWvMbb<#OMMvLxBt z7AN4|ziPEJwz%&kb?tp`GzXC?8wZCo`uTzXt$Rz?CArHmV^T2Qv2ChNr7;%5@_a_qlu-HbbWlt6{xA50Y`QD7}MMQ|d=Ejs8*+jVa0-DrdPP2j?H9_G$9Z zX$BppFr}Pn*WzkOoJj6pG`P>P8VsCC2+KYo=Fh-d5vqU-Rpj}*g}4fH$DXmwZ< zv~+a{yiVs-@BhA8IpWcoDgp8C3}L%r<}C5p(o4>l97%~dU)$Ppuvdz9-nCPk<06T~$>`PDYJ zycdPIa^=cocnrUvi;`z)+a68h55IcDy9q2$Y%$f0Cx1RX-K>pg7+`d2QGHG%W}|a$ zx3cjdMcnLcSnK{3ZudO1CbO%2O|R8HZ;u>JXzng|$6na&TP==qUOGHzkI`K@oSv51 zW{S-4h*XLgVoF_US?o$|YHntrv_hD-XGK>YUMGAJNk4t`Ji5%OjoA8oFfMdp=Q5zm8~@Rur((i(i7j7tD1FJEI#CFVn?=D^73pF)+Q5BWH3Cd z9`6WFNVX+%5PlW2I5o!by&9*CQjH2~DL@XY7_mGBUCs>tjW_5>-T2 zxf^-s8%l@E8QGo3T-v5d#)1>B5?%>b-|hGMXh%ntZ{V(7;>SH0tFXh8lPkg&RFjeS zZ~ulhy3}tRZhugDQ}%ysJoI zMby8=H=}GlKJxtJW=AX4;>Qz zBeD7UatO)Mx??fVYgR@6DzPjb6lGK6nXeA6?bV(h>y@152LUmn3%2Y?V7%V%>;Q? z)&XpbUsfB}AG+RT{&>!PHm#Pals`H&R8sfwEMYZpH!*gtdf)h9BvBvUk%DP%3PqJ7S@fFmjmw{l ziHW5dG8UcIdSFFx8*;QovdpAW#7(I-7+Z0q+-)OSD`$Snq zSt0*}WZD`-(dkLc_`?3$2q~f9bQ#x#$>z`JL3@h=yR1gzkIl^0WC_OA_PG^?6ySBr z)s+LDU`2meIxWdd95G^z1qNZ4KA2kOS6-l} zO?Nm+FRiI{lpVR((ML-dm6er<+4=eIbS}vpw#6ScDv}X2^Xn z6`L<%(^YOhY7{464PGhgOE$yhKH9ylSfGFPXQon-^|uYiXikgn*}_(uiFgMz%k@#c z{57I6yKqi_^~C%+Hb&^nuX%Vh_(PLgIp+(sG5DC7xD(omjrZ@V^6U?4l3`w~ zBqt|tiA?AqI+x7v+_@7xR=!e$>s^?%H*`pBx|C${U~^6(VQbuD@&z9+uC7oS?2QP%Od?U*{WQD zexxQed-u}@q)JS7PzQ{a=`2R(L$l?wRXq(yyq!Ms3}l@ZX7(DSS&oF>eDOK5o?NhM z@v8k3+&3QsuT4}}SE`+dg@t+Kc{3Ur87Y@p`W8(%menzsEwq!7khu8xV4QD`6XPA% zNCa6_Y&TQA>i9h0JV&L=biX~0rvr|#rA z#O@eGHRU!t#byhb@RIiUsm8yy{0kgnxc0}*;V=#i|^88GGu>DieJ|q z|IRL1o3PlQspP3uYPlv9H}3Gq3O0X*?cQfUKNf|7;0so_ER{0syLb8WzO{vK&)-4C zz?1lW75gK`Qbk5899GLB@KcN9iFRogqK=vjXR&K?Q&j6Z?U9~g!`@mdKB&xja@Q%q`LWM%IZ$jhC0#(_{5c9DKJ@2HDY=>pe(2f8X9Jt*ymJ!a zqlAQnzOmoscCXnXlX<_&epec2fymWqvd?9LPdRarphL1)u|Fb{Od3d`D$4K&d z_h81KpB_buOqB#OZi%PDVYJAe1>pJ(d=^qFs_STIGubG`b_Ygjd!i6=L|nExmTiih zoScW}CmRYCw#+W5m<);?EiD=_~;Am9~0f24BZciUYp zh!w=_!UD>Nx#qhGiHU-*Ur%-=3cPytDo3w}{PJbTXI?p$Yl^a&iuEpNSa>Y&@eBsC zn1@5p3uH62#>;K&ce?~etDNGVyP$4`Rh?eN!omtNY=&}iyt`z7ezbtVz-RFZp^}@P zpVv<985tQ#t*AfA*QiHFeqvh`Yg1Db{Rpb?v63tSRP0`&{)t?HfUffk+R+{gM+7cz z7`EU}~aBv1qpHt(nHH{r&mO zqVZ`gr$dyL{!GT9Z$o)HL7|}yZr5=kf%*_}Me>|2iGP>>k(834;R6}-Wd{}!teeYBTveg#SQeqiK(>lLCM|sJ>JU5``l&shD%{?xP*+6!F z``aC;H~H0p=jedQ-1X0X#-QG~pJTnH5f~WwUUnfzz1DiCja5)oH2Le-kE^Sz*d${u zVRZPaYNh6$@Xqk>8S1s}$|a^(efeEvGx$<^Bqbyu8Lz+>Cm>f>sgKwUxk<>J7e7pP zwh(LQcXo0R6c#4H&yNc6m<%-G-Sn2mMvt9^4*a&3wl?NyuVT|V^dNFk${*wTdOfej z#VNSBVjyiX==VMj+N(N0UJ;3A3y5<%zvs(e8^Ne!y_6g#WZ3a5faK_G!>I#mKZb=r z0ekKXhrIk7p}TUB(-@=$yXjWqIfE#~=aI*Zo12@-px=ks=`;Y|F01>jtE$NJKHGV!Q`^rpN-IojTejI zC_mk9!64+w@7S%6M#U&E=(j89*mF?tWvTrG9BXp@CsR(#N*(9fw?oX z#{Cs;Y5pz}snxRI<*VEBqsUvJa40urrj3=lS!HaN%1)#Z-zM>d%L`s@Xv5bIyT_y} zL6)DizcQ4UB2(0?6tjEDa`lVd9(-Z2SVo_$#qBFBLdQr(F<(Z;68F}v=jP_-zWRAj z3X+NYzu>*b;MG9%*H5<4RlWQ9@zUL4BM1lT`!+(|*+lO{cMYcL^2rN_f`_}Y3|?c9 zqCTMi=+(%Z*fm&8)_{(VzN%Q2<3oC;__c7i_C7X>=cU&eU#IDZ;Z=fTMgwnD44NvDf1S#rU zzU~1$iZdwq2?+_C+xr>~KKFXF)#7?r((W3`Im=>h$e{)98aV%Tc?hcZC7$E8Xvdib z-y7E^Mq2Rc=;$=$>ahv#v_h_>EKvEzq}%y1Kc6Y8Pfo$Buq^%fZC+A#*YLrkn|6;g z+HT-8F_rIcZhn2~fk~~L|0R@0X*ih%vX|R+ob9Dhamo1U5II%#{jxmCG->UD0`mQk zv5tfhsx@y;$^`QIw-=RXr*m{pQ-IqW$Hro~9ZohIdCqS+IXPu4XA05}mRZrQ^k>Zg zKrJpS>&cL#o9~DdcX7Y*J-vv$o>x4jhu(Vgtsg1jk0!f>1o}?@T_q;tOFseOU;3T7 z0kL7UFhgd$&ZG9&>TI5N7WSP2nir@*p&6AwfASiQKE2?&G%v3x{^G@DZ(KTZGBP)Q z-~03y%hK*Q@U^!ry&B>vX^nyd9PjOVk%2* z)l6AoC>@YfT=UT%CdvE(^fn7zyl#P_t@(z!{Q7X80Ta4W9c1-R{eq;Vq|QV;te}yR zN{44%#sWwTdwOdtYex$H%*-;+b8`dOkZTQ4WVN7Fli-Nd^F@Yj0E9>z1nBin> zh=ASnl_dS(@sO+|?$I+qFCVO|bf)V(Nhv6(C{bbKMv9E{7_`Z#WWVPKo=_>G-60yM zZRdHf1p)`6Em0ZN9 zb0~?&_nGzIZ5O23*zK>!8&6a+>2lH8(tEn2XOFhsN5hIcl`bsY60Fe~eEpte;jYsDN}yY4g&T zkdS&bVtZbI0$utA)Jlau5J}kkWI3$rbOTwcGiL`A0vUbSw{BHeyP&~4>KYqorl()n z+jIUtqnO=r;)6zn+2da5>ZVRDKqrCE{hD&cC5z!$PrpoN@3~wbeW&=z!A1(ipO11z&a=CeccNlHxa6h1?ZS#&4VH&j}OTrYf*lEa>q)V@{0ZCFT zl-Ipi5;l-is9Nv}tUb|!ZaHnr0ve)0I4^L^bXE>cp-%6s8ynF+mY6MUZ@17f8uU}g zt{*X73?I?)``}fNSJ>HTwNlw1j9I)75>vwY9aoF+u!MMQxSA z>&$MWLSXj%*P9OCs9`_HSir@4tiMbB)2CnDym3NT2u=W%0gpv#QL;8tls9FJp9<_Z z?-VO3H|v*@o%zrqS+liVvJu~1=HdH{3f!&@+Nf{ZXSo;X?HpS~RCkAiNkcsv5&#QEYV( zJGD?YWVN-qnNvy}T9?3ZqF`PYvRC#!i=NGV^QLj-7Wt1KZgPB7^r#E%F*Cqq``l;t zveK?dOvR&?&-n;P+!-^foZ`FZr90$%(^AvUuWH|=mvcJ(aYy&Mh}bi$)px(XJamtX zBi`nOe=wa!2LwESTgzM90jZCFFJynXx18Ca|HESELujL4Kog05V5l6if)m%P&m3XJ zAWS1JEUYLLESRE(%R=Z7R6TnEuz#Hw4B`$BtEh4xkS>F+u-56~ zL=77o+j=3!3S$R)QbBQXR^=IK&i(q8o+?Xo^I3@Z;*t_%g3yv4FSRg$&_?6c(0F7v z-x_bVF|JkkBNeJx(3dYizdU>?5{h=^N{+>f>@t8+{Rz4o?b? zjhl6FH7@sM2nq|6(9rk-bAc?V87Jz3)RcK~$%X^5RV~XnE`TI&-@aX|c5y5RoK*5J zyw*r&Z|HwEfh~Y0K_1%6wc&!_k;I|JbSav{B3(!W@lD`3R0L za;{ANrx)P#h<^_Fzz1_L&~1)vbn_!?&M&e>GG%dNJLqOU)ox|`QLwOt)}eUL&MlbC zg;BLSS{24~>RaD&I;9hlg=KyDgIEz>Xj{o%?u^ z1eQ?Wno{Q7J5s>dEY!qAMD4j+EsLWijF6&oa-P=G5G5O$Eq2B$SJ?J#;?4pU@ayYy zmw%?5LgR_?&EqDDxGU(!13zR%y`0a5)}|BPAS=B|5hIM+s~+B4yXOM5BYj(OGQB%eRaIe-G1x@HQ9_6Xkxbl2QREGz#<7-}C1VjZ1Ep595 zQ5V%GJ*gCvwPEH+CcT&n;ve>`jek@78)wew?zqvh+u@#seF50 ziwYE8lSCtcFzAy-tSv6X;Yv`*(-sM5tA3~CT}hjvQuysZdRBTWjnAH*>WzMcoco8G zmU>^g%J(kDA8~M$@)!IaA0t*YHVuZed())QC@3fh2nlaotf(0<-LI9rbY|eo|MJha zwIMr;7@#KgUW*&xdy$}TqTkmvt^v$!kKr)e9h8h3P*JHkYKX$&YL*xOi}6(9KQ4G~ zxa7f1ii(Z$1&_C0V-j>-U=oe8jEYN3aLzZDy)rVWfG(V!n+u4G6L)mvwmEXk-r3%U zR&4>|;;?ToPq?g=9Wt=RN`J_N9sBF!V56i~(x-Y+ zGgzhbv0}jYuY36JT@8nEweyjtsdbfYjzTvv+lQ~2>A7W} zKmWn!#0LGGR#4*8K9__Jr0S7V1$ssE9*t>@<9}B{*ap)Rytq+HDaoazDP>CL4Y1-TYabRm_htYQ4;?0}DsenS}G~>{~KbxvKe`g6)&;opAHJPqnxe^>M*Kcpu z5~{;xCS|zSEljrsNc+Acx8o^WL_`FCN5%ytd1SYoo?sL5LgN8F0@+Qu>RIA1MMc7o zN=Ys6^`d9Wfv<#}G9b+gUM=gP{;Z03tM5%+!F;b}(G+1D>m zG7Quxh5r1oU^>(n?CDHPXlPe=4yrC8mO>-qn&YeC&pH<75Dccge zvEP|uMT}HU;9d6HO%#^G#~d;3PtVqjoitYmf3SE)(IC4J?Y78UxVUI{Dw`VpiH)s; zoPdx38TC^mu@gaz7}{xn_V7P$<)7bXDY!>mh3Dc(MHN?Zvq+$pap|~gP2}k*3al1l9raf1KbTWg;?|h zHnwo+s-`wJ#7#{Z%B(iD0jA1~y($a(bMvuLBm>t1EBOtW(xfSgxa{9CZK$8WBp@Kb z;6X{{>T{1%iB>_sZ5CiEmA%&kVaaa2`QRlgR{TN_*U^5Iu`so!e){LrQ+p&p94;`p zhK`;q+PV63Vj>PYw%de+qS>kyh{e7PT&Nvi1^kH)Pfp|vQK+2%47V?Mp95D}xPtoP6Q+z6>PoYj~J*qx#g_A{WLVqi(TD(tNAU$s=K z+AfjpLrL8juW+tmwSm*+nPKi=Z_nm*ZZE^swf>Lgouj|m{I)2G=j~5KD78WjUDas~ zl4gYBEnjX;546K~iEg=!KIL-jF5Mx39A5$hU#O}Q-S=%sa8>I{y66%h-a1~%mRkYU z!5!n?r=lWOF56wiBt!>)rYz&TUpEuyptvnTLM>Pq<`eu)LLgc+9|Tt$2|8`hHZcJL z`k~p_9sd%o!H-ZlLpIZTtzdvMcvsD4?k;lug2cJ?fU=XL`z9VI7DlTgU!Z>%dYtqR z-E?c|W7Bf`p_Y|Z96;3}S!Z!^aYT7VMTy-3EfEnBe@j~gqlewWy39(Ybnu^xo5P9v z;@gzX_?@00tN-w=9^N;A4$8`ZlY_OO)p)~jJ`S7!108$VBy#2-Ozev6a zfP5coD0U#<-S{XNM837vNQ^)4ly`!UK+;i>{OB3K)n)Z0)e2kfg(AbAP|z+VQp94K z^+R(m2_9ca?XnLuA8kec?aJr;pTn8b>q@wafQW7!8NvT3r)qPRm6a87ytmP)=}VON z(tuAZXC%?$681iMj_%f@H|;5%i$C~9qBwljC2JA7gJ0v-OQQ5x4f}l1d#WCKRSN1S z{KWx%+-`jE@S(G->lHXqHB}d9#y?M|&Z46UlvtGp16(pGyY&nBdjNQcvl!mrXm<LwEg&xS9ck&4=zXb(!^>`=!2{sPOr z^J0^k&%VB7^z;Gc<(yf{B{gLml?K~F$IBn~Dut36M*H9FT8K*h#i2=T;r;%?G5%xN zMlAsI-<3-Ofhq0*+L>G|T30>`*l>5PIQwlu1n@2D8S}wPhDY0e|F)pKm>UC*mS?81 zS!1Q$1xj*3Erjg0bqO56Z%W5z3}j8uFS`Tsu(7dme-{@MBMQI+f$Lbw3!(nNjPKQ}Ua#MjZm>sm&;R6)fa8+e zXtuG&9FgGEZ?4x7#UiJwB0nq^BL-=gtChA06e{Rg+@hlJf${XgqyGd1JASj&n>U|* zeCldzQ9$+q-+`c@;15AHN=jNHp z6x2k0oMTHS%nZk|yee@;Dky?;h{FMRo0PnW0A7|^QPlGZH+QURh21SYyw~yrPYaF4 z^dFDp>0r@S9zLqBu11#O0aYj8e6=2te$ADpJ27H%^LZ(4A#%8(g=RbRZJ>RJs~8<^ z&xyovgaC`eBTw}&)rZEgJ}GO`&+4y5)E;vj87Wh5R7ms!=qa5?c$;|(;ajq7BqX!R!- zM+m{J{XO^oEz8i!~4k1~9&E+c^nwr-( zh}waYldsTcrqYzV{B${4QY8GTb554}?Ck8#GKNr)93l)yiiW+ z`AtX!6WsE*-1Qckj2Nr+(Rk7?VKP zQ9OGV_5C|F@Z9_t=Vyjv?=oO{dNP$*YdgMSKL=#UXVI607k-Tw) z35ViUT)-VKLZ9pntVE(KmfMN51ZJ7aFRR@}NgO(b_a=d3RZcvF9Ohq=-s?aBAXywN z?!&LjD@z?7{TXupklpUjXDj5nZ*G2=Z;!do3lyzSbH*@~^Kg1i)Cv0?Uv?Wkx_M+yz08NRm)TLb|Stk5`dac%`9++ePjH{Zzj zYxGYK>|~oAC3>@~&V_(WZfb95QBcJ{K&gNo38hmL15U+ve&xUg2t%>yYqWkxo1IdJcH8($^qVi4_4(kT_p?OKZ25`wXF$hrRCtl{*l|1o#uDrt7_tJG7{82bo18yigwt?2dd6PKx&s!tf8Y>!maQh=;f-IZ_c=`RAdH< zECw+*0VvbMMaCV_O&zV~bzsaX6~2E6br)0?*kM5tk$mf(o0Mg^&uBGCb+6LHCE0Nebx(d;~YKv1QF<>SGH1li{{K>|jq1JbA~5bT)ah3IgMLwBZqb-OAI^N@bR(=Nrap}BdX`v&^I3u019=h_3(rYY|{{}{w42D}9Xnt2? zM|1Q1%=Gj-!1ZS?lgqaSZs2FH{iCn2pilKvqaw69-`zO%MZiHp<)pZ{_`|`tO0B&(mN*f&t?uDa#{d>CE^h4m6Vf58yo}Q8H7|ZUCZ|f> zE#@FAL!OX|zu;?|dYj?3x;1KNC;F|fzW&y|d!E3P1En$toe$EKAfdWjvdZi%mIB=n z5!tXoR$M(Y)&VCYt@uDKLq(m0$j2FgY!l9IMh?C@2z7e9{r8Cip*X%7nbQVYVp4PC zu4fNG$^-BKA`%iQFfarL2jB75l*ZS1n?>so1=M1ax{LeWbG2Rq08sZc zzt!C#CKk^gulNH4gY>%r9?Z8e2iMm(((86U`1I)$(l7xA#0SjGeebvmV?{jwYiUY)e>3PR#n zpgoy}-MI@3eM}TAaOh5elx(rjvITHc!cD2pgU4;p2HKr+m19hAuXIgK4IaIQYdwAX z4f>~Y{*|Krr1tlg2B;}{VTp<@*BB6D?M67+1bL6#!^82wQT`loPhu_%4KPmiU8`$o zz#iv{hHuQV?bDZS$hz`CU;YlfNKtObhKY#@8Qzm?Vr|M>MQ!jekRUzJ0OB7kJQQRd zCbi@@GEuW?!wx0?4i&WRgjaO*ws&?wD0v8qQo?afZLLD_hldWwyO-WVH-mJlK(CAF zZ|srAXjakz!~}s)`uOp$ggJv37+#D6jl;#nAo&J`gt!4tMgUMoerZsUX09LLqhQ&h zN>TBA$C~9jIwyp*c%*>aiQ4~b+0TqKoC6M}7EmUnD!}ruf%6O@9H*lNXb4WmAxh2= z{r%M;kq8Di$aE1Zg`8*he_;Te0jv4edmI+a?+#0#qD8ZtHR#5GJ_rTk1;7OP+;^U$ zSy(^v+W|A(x_@7P3(Wzz-&it-@4hG1V92q)I6HufK@N!=?5kbC)d#h}ratAHAQ#+i zRxi4KRxH4_|Td>lbH`o;7v9sW1lhg;e1?sWG?db7mRd;Q z^FCZm^ruE@>0ck4IegDNsRoxHl8T152LXa;QZEbO7~~b+o1*f7mI$N?zD(IDLJL;I z?qD#!4jvZyLK;qK7C45IR=!zt9duq_V2?*&Ew%pw2@GLW#yl1rghNBWR~LY)l5$*1 z3I$v(>#6<5I9IQ}h36g!CI71TTOQf$^UI?ZcB~L43!W6QIjKm13|HB9Qhm5JgOp={ z34Eumjr7t0l>y^&P}P#ViUhGMO$TY04D$JdU=7;Wo{`Pt#sSD|gc6HHBO9%@jjP** z;X-+aBP{&>L~Zce(%_H8%okE=n8e%wj0}CU25B7UjQCEL=H~d!&6xm=;SAtHEryS{ z!9)Da(x)1YeY{V3c(165WBgrUR3!^xSM zS~x9(u;ZR{fMSCAC&)`|)!2b^0%*wvy=$KC?ArQzJD@l=Fdl^X?#lhEyd#y}LUiF| zMvFb;uItvVdwGY%e?XF)2Y3VCRip9pCZqsqZCzZyhqSdKeVn7^HbD^BPr+}P*wqi% zR!~fgKe6k>)-+!O5Rc}3=6v#R7OW;5JcN=HfUYTEK%GBEW=tlgU_h!MO7Y3c;vg+e zqERgTEsxcC9(z}cGIYyfmXV!-%kvgKzA$K25R~ATa)Zwqkl+THmR7m=Cv-xfC28(0 z_vHg1YYsdIBv@>_N13Tq#8O%$L9;rAmzmJWE%)zuYgD9kw46^sF2(%bpg z2%J8-+nR5){DlUw3f~XCfNKN?+!a*R!0_;20NJViBn<%-bb0l5@Q<26Spr2PX->$t@<3H<@+EUtoZ@E{QMpv;koJplpX2D#dyun?uG?r4tw+FZ& zhZwo}vt>w=(-bMh)t|NY-qJrG2_8289xS*c#((_JM{uTpQ%7z=0dTshmpZ`xj->SW z@cZQ~Zog0X8~Z;^AI@YFNNVo}OuoOLUm=ng0I>>SOGXoJ;BN;LHcAdHDsn%8a6e;R z>$?KWS?~yn5oli5$YHXl0PTiOLE+(%H5k`{+tNZii+H}-yQQ_26#Prj-UGE7&f`=m2^=W_ z7)T+@Bh_40$0M!oo*o+70cde|7rSb|ZP8@5L&*j<0F>*WAm&0bhe;)&%#?2plVI=P zT^Yav{t;^PV7^{ZyvVha=UoTi9k=)QS%Q&SYe4(V5xFP-_xeurqm`tM1od=RB9&19 zpGfg(bE=kvS*vfJ6_u9;L+($nlRFns&Raq)pmTw3y0%BouYrKZmt$L7%88D zT5?-8hWGt@YOsWqn9QJN$YpA4tqLX1ai6R*7M^QTfj~#HXPe$fm|K^F>tO=tgdwb{ zqoWaAj4-H>cm&$XFsYL;@Bx{`p`pOPf$HuBlaUCh`0AUJ)%@3zQh_RjO^3;jyy8>H zr4aajhlkc6pEuu~=+=;sjrl*=0w5v6NBKp4s)gw)>KHpXYayZ2q$d`xqw%@9x&1I( z5QAMsKwlbKIE1sXJBRggS#T%y!-deFe$q87Yp1oyf>v9dKaDvqD8S%QtNj?&jrhwS z^i)AW3(P^wptOHiEbyvyI2oqol&MkXpRgLx4BvH5)K0kLK~cTY>@u*=)8+iS0L?>m3*y zm1AJu^NkP2pES~t~e`=W0g5#=3m9U5M4avDJ=K# z(#A#y99i&=KLq>3rAsXFmg3T=rm6!fenm z3Ea4LQ0(NEbx%P0n=M(0B_Sns1tSRp={b3y#ACawi}XiB%MMTqS<%5$jYL!p$~>(h zxEEg{o~mC?OG|@6f?POq;E6P5BS6nFof86jK@i+yKq5WvA~Kt+&(7)Z$a62@c=__B zLhie33JMB9+x;+KdV}oCGBl7Qo*?tU3RnTfFuhhZF%K8Rh)kb|Ly!n1(xlA+uD^=F z-bXPr?B789A2ERAa_^JGYm*>7$%O8rK`MhaGqJKt0S08W(qUxrRA;NIGGpcJ_|F{r ze>DC~rN4B6egRiS2-4{`hLy=a zLr#NTfys=6b(Qne1s?on;MtJACD@-x>c6K;^*p70umUM2oC2@?U8OAaFIr!Ix#ti` zUU=T7pzQVBww>{1Z5_{*yZvkC6&bR;dtQk zWLT@o|7JL#BythFO##*Sk0`P;$PY>~GEdww2^IT9b0X~@dj1oQXgq-G4FG^{EowhK z@$=_Dg{vAI98y=7^mNaEZ*J(mWRaU!KVUM&OSQU|^{n!|? z3qpGJf?{J;^&OCr3PW4K+D6KV(0#jUYi_%UKSCU#WI z|5?eUB1U%i_p@Z^UkeI8WMIGs!~iWkd=V)bS^YH2fIA*wewdkZ^YB2sbm$jaAXU$ z4lJ4T8+R^?Ovp+Z`u&%l{#}~I|JlFaV|gE5zn7_26$@SLW{)^e0N4wm!VDIhB-XEG ze*SNzJhZf;gXbbzFi5DXFO9t6?cwGWM77!3vBeuHscYA-Yu0_fg;NBi)7$?l4_Me0 znD8LmeC7WibsuE7Pl6S(`gwlAjsGb3*gG4eB`?b?*FO9EQ;?F@%|`M4?&^(~D@V5r z=_n}B0P_MLNUg}t!$S;zOwG(_(&?bwz!XV0{JseU)Wa6AuCsrbvL(~(gZ=LBfR7!5iLcN(vKvdy^f2|%E)#g<*$dhBG z7I~@TXjnu!`hAqg`)dX!4$!m3gG10g4pfz2kU=O%RfSi_%ECbMfdm9d^Z_NM7qDkR zE$e?W`QAK>20|Dxx%U%H?BbS|ERbZ8PG2YxN~80+y}@|lLZ(n)$ip%-Pn?rUyP%P# zoqcAz``9~-n$|4EVYw-#*y)1X_dfG2)j$xlI~+3s$s-cS9RpByXGkY5MBWm7WXK^b9HbdNN4xDlkTwx8 z3WQ1L(oCx_# z6%|6T|D~H2m6RTX{BV~gA7sls`~ov8!B?R2AEiLqdbn#J1#&|$HS8^;%`C{+}zr7=6#^c z7{i>6R+`}2LAXlhu*B$A-PClgPo~e1TaM@f3MwYvXMj;88@#doOG9|l0k28H>ng|A z(>L1DJ8;#%(ZEb&8ZysQ<8e-iC-vS`NsfWJ)m4li@;-Sw9m~pbuSs8+n9%Q>pC0Yp z^nA6ZZ*14(BrsbHXfYJEi6WY|k&Tv3|qDioN~)8lY{!x($@H_1|&L%j8v1 zxChsQB>B2;A2CUeqrAnps@CtOhy#oW9 zpgf`XB*FH98qLwC<4HdVI<}XW*MmFg5AUE$N=v(fcV%%@+u(CGcsA*^Tk-z5avAy^ z*v9NO!P5RpBHa#~7-2J(as(UsI~|?G{QNs$;{p9pJGQ|Jtn~oQQDFWX zPJAtt=^yW!u;;N!UfKeYDWjUJqqk_1a0lh120{V@ai;mzSUk@5Y+mpvkgLCaT+X5= z>gQM9E2vk~qm8;-f}SqT6*dm!k8vV@yH?ras>AwMyA7BXYm}^6z!ZXCrB!3n+w;#y z!J8#6f!q&WKM?Hg{__!;{rcA=@jo6C2yi*9zol79`7WxSL7Dh#EWluyJf}u6^d<2f z6t7FX^au_jm+(bAp+kad#co{h`u8$gcYvB>u(-X;&q^APhxmQTi?}GuOJ-;Wf@+Q_ zT*9#28g~WbU>1${THLe6@c-$%|8W)YzW0OazixI^u=aixT3JvtuwBpJUYHjm4^jsK z)NmMB+D{<#ZXVggf3EKC2}wz>47ofo32W*+Z+9gN;}(~ePQ$Ed4M?mJriLaNX=%@a z2S2pu2D?K*U|@IFzGW{ceowWU@4#;ss_E&u4ZkhLt-U3w60WLW$0c&y+e0NXAu4Y-9$e8IkE@l5|DKRT$`k-s^7Q7y-V1UWZ1cL>b_AOrt3SNUI!w*CV zX<6A9j{?3zB2j7SjU;Q}E#ZQ27Z7Q^pk0`*vHfZotE`CC+XNCV1ZP@G$3sp8LxhO? zGb^D>2+Nq##nU;TwtK&R{Q~%ocJn6QR|(6hnyas9d|m*e_|$lH1_&ZD zVv7}=`ATM77;+6i?0zLJCr6@bhAL(BI&UJ{7p8cr>>Fmb%!QUq#dI*1vsyB8)~62BXs>ef`V=vO;q}V zUy0Gs4w{BLfjQsy^%E&kk#kb2V5x)oXiMFQ;b#@>4ZMIq5dftomzJ)5#9wiy-RaF2 z8J2&6G22@}!^VaO_7RWlxa@JyxbsU-#k*5P5g%)6YX87;>iAH0kjK-~;1xpk^t^s6 z=f@9c$OtTk<8{G0@7s~|&I<~U1Q;3tp-bX1>;Ad}0$HShnnF4+l2THXR&CHhqNo9) z3Z9u{(aNsazmFV@=)U zSOED;aqix|dlTJla_8ue>(^h3iuyL|_0a@zgkrn&gWB^D+cVr1>w_j&r&g?~vOJb_ z2@t`S1rTHF2~l#E3r87e755swDZV&tjVLyA{ z_kCU0Z`yc*#^rs4`H`KFPDWEzbq@TxtUj*rr&(o02N+_gwp1=&+>x4^s{Sp)Uls~% z0*VEW951#EdYO%n@7~X!rX)oO9 zQh56|eRy*-`?@Xigj0>^*gq8))7#kC5UR_(rFo0+C&&2J?jEu*H#cv{b;&9)!}X_E z=rl{cHaSMFiiwJ%L2$tL&%JD3QRB9uUxq@`t{(*)@|DkTjWYT zWwEof)62GfUDnz&&`yL)9N6BS}|_ ztp@ivXu)NOdE9oejuksW2`D>sa8Wv~aCou#6~V3arpY|0ONfo(0pd7{i;qAE{PD{d zW~f!Zz0c(rNYZ+LF1{~SeK@?0&v^hY`7sfnzBhx9nMZCLy-vB0sDF`EfOWbpJ__x*DCLa$=*Qhjw2i33}}?hw+TvWy~eAk;X(9LIk$ zVm;#!E*Lsl_bQhk?Z%CF?+)M$A$}N`E^ukjzJ4)fC6heS{&<#j89`z~Eqj-|`Esc6 z={hekMNnq%$35DgT+7W%MPbM3$$?ZSUqL2cqP~gp_Dn zAvdYgWe!#3w0`l*%6X3u(`8>8Zv6covqoqa~Krb zD?g=sgbXfANBWSptj=&3PIw1`<9y z#I;<^=fy8dZGyPSAN&0?su0fco9aS)j4T>s2OR8eY^wFFs5nRv{zfk!xemlOOt>OJ z*Qs*aDw`3$IA3@Tm;I_Tno0=5)LqTDc^?*_rKKAMv`W4RWS)8(-F3nnpW#D~A3a)+ ziIAU6Cda*b5>Bll^uM!l44tBdmwY~H_r|0rU}Vk$zv3w5Fb z86Wyd8@OW;&~Vg?7qr-k=zENejN)FuHrhowk^w9MRz*$>ho|&^;h+Y*Y67YRtWH+; z1Q~Y@=vWb4mQQB@eiuL`sZssMON=5us@reI#>N)(qC<}x=r|8<)u|$5N^!$KZj;)4 zQBhHdq|r^yW3vj&bL;3?_(*u(xDuarTZk-ZltyhG9l9uO20&9l-!Y*|b`y=`!xB&D`Ib-TzXi+daN}~c&*`@ITSWtdo#x-YI1m26zyK~3RZ;nbdJRiBmZR{%;9$zdFI+Ka-}hSH zaiJj*JbMVLE(Ep2l!|6~>%oJ~-z$tC<3j&#h<%n^bo(KyJgC(Kv91DVf^-06MNfN! zgvA2dQ0Kt=$3*cTenO!qhCr{@ht?n>RUujcL3CVA4dnX`K;5_c@#G2dYsQ_15J$>p zxL5-q4oMKp`aT%)xS5}e>o(k(92vz2u%s!Q*Fnfp0J-G77O5^-n@;a0DJ*52ZPZ^H zRXoJt)GY3V!PTlrZDnSv)v%`ZqGjjijI+-ke&1Z{9t@v{O;zs9d#_))D}yISzW=+< z{LfkcFVkyAbY$xOTZ!@awmBSq`#SU^lZF0TH*FRXdQuUo&ymIWg^5VV^;H(f+P_6q z!6dy>c-|kp#?Fzr)FXIS@vkDKn9r?^+NP&A59O(>f$pZWNY>Ha?uHO7I-(+){QnKm z$wmp=lqfT8+Fm=y%`~z$!=&`blh7QT4@MC0;so%<^Uj;?WR7{0`-QO9V{9eh3>YLG z;kQ4buU{Gz925kZ2q#WF{E3Q+5)l=xc5>ghZyzQCy2wf&Xfv?xWHYN0FE5DGRFF?z zg4zC*aD5$}uIYc)u`3fIXH4D-H|1ITa{t-;8UTXc+PX)1lTXtth&k+zgod}ah_d1Z zQr`T)u9!E`(W`K72|-5RF+6-9W-|_?aPAy5a?w^13KV6*BzfAAE9>|5>!&e#gZdN{ z5~6?n`0)eP?IJsO8kaTa@NL?(39!*;aPWxnvV)kBi11RMgE)s6CkXlzy9cC#<6vTz zZA3ftvY&bL=)rC-z{%S5{`+05uO?%3fB0a*b#!)s#0eulg!!xx?hrXp1mYOe z(lB@@bA)#r{kYRfJUvH}DSCW|UqQ5_Az8cXxi6bS_dIy`5QEU#ty?7(qlOA@G5en3 zz6I!MRRD7_vK&VHg(J7^*~LMUl(Cf((u%kj*C+C)snk!a$|9W7V*UBEdkX5@@0ygaHOOiTZ(`C#cg3YYpiTn5)_apyBrQ?^I?p=YGx^naw`Er!hwGTFeeQOsS1vmZ1-B7HK^%sGVN|ZSk5% zMP(bfmpdJSWfL<(=zeSCG7kjYh`BG%dCZ^`=%v~+5{Wl~!)?~$U?8?VjMFH{S_R#L zl8VY|^fKrzKrx^od_J>?lE%QqWZafN-DE-N=T4kH?E?Vt_f(Qc5e_)Jw_3Hg`^p~g zdXv6Ed(mKkS5VFOMpV}oe3l+eoCM`N;SL0q5G+l!eIL9tKErxvy_^I0ka8Yo5lhwf z=le@F(L%vJau?=UJPTkP%mN%r<(=Li|IulDujqU5FZK9>iHR3R2bkQsVTR0Tvx`*l z*bHiF7N*iH>7KMoc_pwG(0|g9kSzBZI#JuV*RdNhNdf3kR8wQdAj`wUGij9&7T6}l{EHwBS~1IuA-i<`vyA$R{=T6&DS-Z1SF zYr!QSfn9r;Nk6)~Z$XeADWo+IOzJSml8(Vai*NR}oRO7B0jHcjcaDZcv`96v0c}%U zTwKPVZmvFX^#_SyI$SsZg>k#icKDDYwg}$y_5Dbw+rtN1LHipU8v}~$7#g|<`vQsf zhT_OH?SRJ@|KdL%8DEHdcjhEZx{a-^vXT;ASa>)M=`VntL&qwfSTC$_Bc30unn7Xp zrgK`OXT?h9oPLz|2U#D@3Fg&jb6zJhjpvxkLrn4qsz@XrXW|_JWIBv!Bu^+WSDF@O z9vxK;jUpWW>P_@+aC>IS=$vlfwHBni5AayR$Z~7rd2Nw{Hl3?5=soQUg5Uzkcj#9; z=2f(}&KCz8x|i~q)COm_rwWo&)491{XsY?$*uU)|16r_hS7DOFv&n=_9>%2@4OfI=_%mYsxvVg;w0-im4rhV$vZ6YzK8(0KP6c?9B zkQCpbp`#Dk+aDVfBjrIVJ7YL_0*eQpBKk@zZmyjn-d_Z+xJ$ z70Q2lGS4(1!({${N886WPE*qbPZFui7N;C0_+S&bE$9~S+-zWIn3NKx$F(x$vQZw( zx9cig{it}Wa&Tafq-Z2DB$2;loNmu!>nxTD$gvft}#O~!*t zHzj-!a_w@W*)fm-Nu~g1>&$P+Rap zj}FR_TuCNSw5XK_JUU!M&3(J0R=&M^_re~9utOIVw|@P7^|pP#0VC1m9R4me^&(Iu zXf%<*;+VokDic}~m0$j6b);`>s7vLWf6fg`;4V$o7&k-9DqG(3{s8R#ij0W~9D10i z*^JIFc^|EO3Gn*Ke3^AqJ@0R1L`&q?MC@Q-WK6kB{BBGA&<}OrHMSo4*hF=lGP1U= zq&VHxi$wh6o08_?zT!_`{hjA=odP9_&D5(Fs5k^iSvK;7cd#-d zM0DD}Kg*dx3E#)Qfxn32)A*%E&8R6gRqEDEUD#wdIzwCM*6-gS!8wM$I z-`p~eJep6vI(YO)S#52-fS4EyRzEc}-`hZMq<SktU2XYR4E^1s2 zu#>tZn33j^w@}YhR9KikxN>b@*Jjvde6NWm-)G%R&*?IcJsOqwcJtKKRJqRhz`!6I zC#N?)QfIKC2f4P#GlYAvWU{-`ID&Ffiu7ZGKQbZwl;+OIXD+VWNLrfC%BLX#Z%e`> z+Wz=>|BxFVt*42iO%BgS-q=xTkrCfx+t;7Xalij7uf&MHF;~KaD~&Q{nCGfLoc?jb zXKJssbXqNE+V|`=N&R-`&V`?7zQ_W?QlmoSpI5k)bxyafZ7l*wkIftaA{(n{a>uf>dQlji5g41cZm$&&@A zbo7dVv$n4CGcz%v%M)z>$$JEM_e=?~al8%wt)=aEza9d5#&=^0Z=5;K2r-qx+_iS|H5z&Mfu^+^g^5q-fS!p(_u=YTK4rZ2^6Ly{^Zht z5S!qOXlq3ZZ_z4i3ybDU>I?!g%38f$T*v3>O}&Pn6C|b{I+!k?c-$)w(9kcTaj-wx|Dg@|b9KI#R#VL+IGj#>$ zdilzg0!Zoz`Q8Vf`71tydygF6U;O(g<6?=LLc!OsYwhjr`@X*pEC?A6oRe*KxRjCS zUta$Q^@5j7W_aTMr(LP+H8rnd^D)hf>8E;6GwIRfR&F=oOk-Gdn^(Gao@Ew5a?@lO{#D@j9twtfm~Y-|#6QYI#=d%cVUAsLx5ttyjw?i|E>4d6)JA$ zatl&Ne!B`E@#kg?h}bNfk&rv_08D}<$$i%X>vZ_=*z<83=XW!TcDnn94mNjXrM9z4 z?pHK%Ycg(+c$e-Un>n43aN4O=TUvtWoit$b`DgSb$KSIlUu)J+;2A9==K-DwKOnR( z!NPGXxKpNwT0aLt4X-4|WitBw6F23u`k`(7qEn>4-eP3nAPs``6C7&>JJd@nw8G z6ZGA1yq_eV6ex=e5LP3!dN(>)u!j$Vf}*uY@M3{6MASS_NjVW~Z)duBdU`qpeBSo; zj6=i22<0Uq`4~BotMK;+AY+Qr43AHdr>0nIojp^cW3W(LoAALZE_5Sn3$JIdoSOz6 zX)nd9%IS=8+rOPwcIKy7CuzCxW7-edBEJQ`L28-8@i_(}+a^`M6cGDoBsY>23>CH~ zY0!^SI=+U;&=CwR>}V5DGuyI~gV~5c0;x2qPhDflLlR$p4EFkg@(J(V6?t^99yhb_ z)fNc>!98>UN&q|%j{#A{TiF=cczKyg2cXTjcS~V5TpCt;JRBJIPLEcMEwdFXhLtf*z_viSZ`rsaca2$nE zg2;|6j$E1)#;nx^D-9tYCPdMY;gWzJSL;Q_G-L_yF3W!%Gi?!nT1U=12mQ08aUsL~ z8X&k^<>fI^ZhGf55mRj5?lyBSTeH1fHF7@6HXQ-Pu*DI~s{D2-1G9-a-46@de*f==6Jbo{3ah#tNCH<(%U)xb>y`&#&4?{ga zAzgBElG(Xy7XXD=?cIjnjwhmu>;vL2JxR#xclO~fQSeK99>En+(B6S zW3oyJn+C(u*PfqWmWrd*7{brwv^1~8L~-a^LzG{Z;$Ll$0e~PTCM?5Q=qhS8U0^jt zVgtcC{}^)w;qEv)8db12k;DCH)2lBO&t7S68BpSQGy)G*3H4%_yc-XY9U?0d&c?V5 zc@1JmG}SEm*QveJc%SvFtLvpCNm1$ZL`2@TO;eNN0d2?HG5uh~e>dBu;%Yc4hmoHh z4wfJV*HN}Mx25_)%>L`*H=h#yUJWVP+KL>k(4Gv$(G}2Z2hYWy)YpHVI@1j(4q%iZ zpc!#-abiOPsA`F_AB31F$jJ>d5V#~Rhsg^F(7;h3su?MNANbfywT-nd*Fe#{n*K&8 z770!iEf-E4FOU>!YJPQ@{(y*)_W-#94HEVIaVjK)+rym+pCu!Xi|TLRZf0l8Cd$=J zXR6gZAu#s>rbIaPnGrN~3vNzA3Wrz%;x%3zO4O;>er_(E-y)_R($5!A%SyVF&gIaP zRL_Ur10Em-j*~TjSJI@1g)o{iFgd%2wt{D>Cc7~g4v2R+PxjrwJlFxTzNtLNJLaps z)BHV)u&iNK={=3SmYWDme4ncez6|4Sf|$YYC1cmTuIro|H=0;})Qd5*QU~t@PE8qt z20}jL(B|YLicnZytCn|Bl8fMifHS5b%f38RT8o+synFVC*E)jA0eVG52fk1s_%N7btdasF@>pI^9qwH@=SbFsZhrUt-yI)1dqrALu4Z$I20PB_=s-BG@Yk&KYn2p{y3DP|(=F)J@@3d)F!k1qhw znj&P*3T52u6io~Ti6#D|t$+ui!!R8PpX$|juGmNddiUU+EIX{AN5LW?k@Is9D-I)I zIYlshkM)FFUrAK^T3^2rzyoNw!@!GvbauX&aCoeN4FYmV1riWgM{c0l#Hgd*!aYXa zO~>h1L{t_;C_m3^!yPKXPr&sY#b({GRuG{+>tW~qxGU+yO@O+ctq$!3tN6Wc$4oJ= z^#xo7_M9HFl9$E;JmSLb5u>cCs_F^GmN2TpdU!c8KX>>_B?aZ@?z3k+A7H&Cd7d_O z+W-*<(=o%~`9F&COSGkY-ny4l$2!KlDNPC%f#x@-}gEovv3Vw<|qA_>Q5p9I{SAd$eNEpzM_J5YqNs; zn`v)(BMAZ2m1O8eDDJ|rN;o?vbH8S(+bh57j_ai(bIS6$fqAdF7wF}$;iNkPfEGCwuWe+n zADhQ*fw8_2M}+`qeEzCO$pOY%<>wF{0|q=pb0asmFQgBb!=Y;Pf0Xz1gywu$F01uX z$Q`@nvy6Lo1ZPC3@zkTb1eBZ47;MWa69sIOge!wS;j0qTip z_0v(x)3uZt1cbJ6`8`bCU-Z3V>k-owGeWH>puDGUgdl^w*}fPUL2JkNf_btPpe- zcFVpch@bAJy_vjuIPm!5F=9H z$*+O{a-~kFl~-a{>sO@B3oqjHV2F~{lnKy2f1>abWwJeY`JO%TN%{|TQw}?+u!oK% z&$li>^a)L#q}?8Tvbdi7As+$b# zC*Jp<<-|+%rDkf26oRp^T{_FJ^OIwLuX(lHA_8KG!VaYffvn?5^2tZo`z%5Y$nZs` zT_!$g#l6~^)2FRndd%*+7W7c2@@AIOo|p;oUd#N6P%;|4Mld-eP3402)6m>p>kdgvf#EU<6eS%9@WUQ9Ux;A_Bv`z69^?LY~;?#_ML)XuYGYRZq)^ zlYU?AS@V0aD*tNd0tbQGq`+(9m1SVa<))sWm$w<37$z!S=5Yv6LxI`*=IbfQ#BxPI zuCMYo*gB@(aN+aJL!18GA@Wqd+>2ae0Cw|G3pIM+t`JJo`3Vm&@3 z*X?kTwraUN(Fm`_(>dKg{`fIvoV=XCwzda2mlR1x|w}df2wK z&Eq~dnHFt)2vRsE^o@)JkQx|O^)?@Am(aDX0et|Ox9GFu*e$Hx6yvxLFW#P?>xI%} zJwL7<|RIi(q8%+ zatC5JZ_TwuFgldy#aiRz(0oKVurHE(PjsZ!QM0d((N46Xp@A4j2EdLsE@g3L1 z>o;O53DNm#X0ABPfbsN+&%Gw@v#yV8QcK@x{(PxcjcwWYSx?R_b5lZiPi>8Kb>k@J zmNT()=+f_1VHXO_OHMW}+%DT#T;|bZH=TD!Q~RK}Orjl+tdl?6;qu7w%xA;YEP?SN z^HTGd-Q4?om2zePsDuQ)`qd`QHPMu-C0xjUn4#M1+GhQT|If<3%Du7>0~rH-ggTU-3{_J2MJkrbrusYi0_D#w_7g7 z`49?nW9km3$ic^xUN^n2ZXNMF&x)7Y6`Tt?+90eo8{fD1aV70B#HWr?;XGe^OxOzK zW4twdhB&G9-uVl;dj9n@$xVTy{e-%k%{ZzlbX1qWrk4iKGj+doH-R?!+KGr! z?v0Ml0I9`yUcJRnYI(177b4skD|q8kF?`o3UK%)pUm#F8x}-23&~h&C+=DZCVKwQP Mil*}0!xwJ;Kkr^7+5i9m literal 13295 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

js1_`d`3 z-=p=~adLAE{)o@5SHYhCqiK!|Oq0z$AcF7ycRbJU*WcLDUdX?SP5h#vBbL)Xcjk?L z=k?=cS#L=a%xFU|k7a%NPR_ca&hC_T!DW_}%j+%)0~m#3!}$)ZISZZd5W`EonWe^! z=msr$Z3&+3;HU9*zCw!G)^JCwFWMP+JgYPbBx<2=tPuw5E^my%>z7SSA9=XH!1 z!kA%&S*76AQs(1HF5$l0(DL(jUS!wYdyI>l`QlKy6Cs8MAt#2hA-9n3&J zn=>baiw|j&{#tHFB*<~G8@Gpmk`E#_U>=d+b@7(LWy7ZZVW#qdu=`A(n3$MR#DL(h zM@aVSPPdZNZeO-E{&U+?s~RRFpP#+?)!*>v>e8zv(@%TvfzO!y`AkEkx+{}JE7(jW z`Wi_Q0X+%Vu}q;qFHD?`j@ob!mRo7Jn3eth!U+E5%U}HoC2?ZfF=K`?%i34%=u0-l z!Uq&|s0;Uz;o&*Cxs730Z<0p#{J!RA3R0SYrKP8sm#`T*IB*)J8*%XPWHd@nC855- z!OWsM*q-xV(`hGJ{MH(LlBr7nbH>)6vvRfiBzVmbJH{Wj#Lu>EQ^A%rZ>BOg{)&J) z%Z)aVCFl}9c}^)+WD=hVI-5$uduPg*d(;C69yX&--p%g2!H9HcN*hid9xRAP#1j*W ziiu&~4QcP}Y+mR}LW4-yRllx}SEE5!GjBprNJvO%+d+OE*$FF)?Le7@`gGm!*mnLX zcU6*|)HCBNJlc<5b+tOee6`6vxF98F2P; zqKn-ofmC6Z1z#=8@!&sy-XF7Xqg_kAtD@rMrnc&GwEaYUvjL+-uP`SsuL;1woWs>G z!c4a82PHDxdD^fp3uOZdcDC!+@qA7ZMkeKY_Y4fe0f?IJuMS%VD9x37E|fG`mN%J~ zm3tH&Eq=Tk9~B!LSW_cTBkF`RSY*%~O2)Z4OMkAD;BvhC>;j3ysfD9bQo;eA)ST{* z>cDMi4Si0XF)v+ev@D;II-8Z^b6ijnG(?ZKdFHG$9X-dem)vjJaxm!=S-oC`zq8QQ z3^usbdicibNO`A89k}ES2)Kq+2@ePwEH-KbSG1e?iaUKpr@y~n{4qm)Z}hoVj`ZH# zkCS#Tiy$&pRaFpTO$q#F00*|3>CcEhe*D<BalU-{QbS+=wLaXY@$n5bC@(LMh@6~F6XxgVxAsO6K@#+QLwK~xnNuxI zGF)Bil$2AuNUqqhcC!heH)rcgu+tg>-v~cGr23wtY^BO0RaJtO6$AuP@H`?~&j+_h zL`4<);RDObUa?Qh;npk~B<8Z(0Pt1bXE}ux1-~F4@Rb)pn3d>oQQop+KrzeLuW~16 z2lW>7x91q?j*^?V=Q~TCmhW3n)LaG6Ny%pn#c}B}(eQkhG#TF4$atX_&ttGzmUens z3OU?EboFY8pw)o!`q-Ds7dvcW3e4ZlZ>D-5KLY_oxTQ21np*2V(|>-Rx8yl)S~YF7 zaeh}POJ7B}=Ah?5F8kDenVvT8e3JVd;b6^lA6tr1`Cr5c;DDdG`g?GVhYv3~`d&4U zxoTcEO8`+(Q`6cGDD(~V=iQKu!H8CKe!cvP$Hc%cbK%wI&0DvIrtRZPcyjWKN$3<^ z!UKk_73#fDHJ;~c30!>o^yy)wUGB`4`}gmU9p?ho6Rl>DR~bNOFF|^$*;IV2RWMm% zh#(s2MPZ;G8&(4$QfsOGm;kXg6xQ|`)@<>@V`eX;!_SK|xNngp76b55ZV&r)Z1BK) zrGJ(DZwF%iSK_k<5vt!?UQ_T}_Hlgp@WHq#05_-b;i6gg9e_4JU;XTmzE-aW0}$NO zm;2z}qeo#N0GXtujKaIpg8>3PFLC(6AtE3sI8A?kh)w5xXaY6NwZ{Z@dRWN=RC4)T zM02vAEDH!(g^h%Xi3x&gJq{F}J-cScH2$N?VRLj2g0TFh|2zx98C-^$pP&D!wRJ#? zskEFNW=CgdZ?-ypt6WvO^ZXQikp`UJdi926%~mTl~bEf6c0Fv)(>i{D3@9p~Ikbswtn_u%k;uc`%f?Hxo%V=?bO6I?N%>}Umnus=UN$n-c^4-N~{G<(ny zs%$w{RV6w%H)lN6;72L&l<3CIoA&#wy3lQ1-K$^+fByU#FnR$2f`WpSLe`Y`A3TVD z^XBDrbI|PR!KAi8_}hDWA{_IB?b0@pI2JqaRM@z5N+4`PI!&{i9TDyQl_+3&chh3? zXfcghSeW8Lwi;PhU{KI3INhe_t3#!bZ&VZ!3f0m)w{b&Xzb<{+%Orlhlo^^8eWQRz z;10~eLr$s7LMSO3fLl%uhoDgAYQl$B0vJp|ODoQf3=tM~`B9Bq@BENLCb5Z$Nz?4g zisjd~HqJzaj;979hif9(UnH1B%i;srTlGp!FR`g6vWOP}w)~MUYrnIgI_9xa>vndu z7`O!)e^21Q<+yM;BO_yT!ec|EpmY4$9Gw=7icag>8gcKtT9!T15m6b04Sl` z*4A7gV77V{>8HPjkdzEtyRGuKsXwIyk260%PbuXszVQ8BW`}?SAt!eD-)mUScf<~r znqk9eZu$QBp#j}CHfAt2GeaBdA^V;rO!)5IyR|sMcPa^zUZM&SG`S-JE4RQ+JVfn; zlQ}PLd8_;K$M_Owgx2aPyl1-pD!`tXUFI0ZK0SE&`2230#!y2nr?zpaPQZ&v&mGkd zA3t9Evl$>%lMjL`9p>?F+_>?m8yi|)URF|94+62jF;PoSd4;#WXj6Qw|vgTg`SUKLLA)OEkF=PCnkoTog!z! zlZ9qS-_X;Bd3)%f-P#}~rlx+)tQb+5ObA8LOBE@rbhn1Teod0+UqR0EC^!(GB20{2_lB^lf6$mCYc=0OqWnc-mUz;K`bw_EsM=`j!D9jR5Rj#8M1zq7<- z60c`_|109+o!=;w>d0_EOH|4wOX=B3!5{s-> z%|Z3q{QI{??ARZ@IH6@a;`J!%n0$MDeEi;857(eYu$c?pDX+o8nU$54o$(@6|@{4EQS)|(Q@CXQy+S}VV3DW21=SL?baHvdH+B1`L>#>O2tiQgetBd=( z<>kFh1vKbWS=ko6{3<`)#m0hS#o)DJSKc1gGBN!6+Mmbh}|NpjPdW$g8*z}p z;sqLIw(_H3J64`fhE~klOxDr%_V#APC&P!W6K*`g6SAEM1Nv!hetvqZjUL;$SkKbR zir-;QiIjq37F2YN-{0Lt8!8SxZKbv~UjF$}>F!YTTIS|#k|&$8P=nY;jen%n*$`@T0N3O=Xyn@lmVw(}QkulGm@U#R!+P@M3CFc- z()aEW1A@`GfBz+bB{_L{MsNUa5wsY_=Y(HVTqmxDNtl19q>*sfOo)5?mZjier9U6? zef0{fK(8F{SC;C7UA=Zekk@*(?t*OUsbPRZ02LAQ)*UiI9+ANzB%_gq zMpDz?y)`tVHaiz{6UJxKJtQC-;Prk(ZhC;5c^ z?M~j=y+Na(M&kxv?=Aefg@vk9DrGuU;H$yzAhneCf;S(lIJB*eR|^BxMUzS`Y(vu; zPR%arlP2k9xAcRt_t|R--qx9xiLHK5qiK?~sK=9de;6GQ5g%ar$XJw(f=bnkq(X5{ zDC(u{3pFs7jVf?ZNj!;n0C?+v)(Mk_xOf^9@Qkc1tman)vX++Dfi&UsJhZDhKSPFA zd`wPw6wcZ2)1*5YdVK6Y=5v19)bdzAW+mpHmKIh_d%)+<0@D>1J#_M;zN>GwV0Vt3 z9W+MZOe`#zK``1T_B79zGc%@KdY^G3C69A5o?l~U)1DPYNHO-qn;zdVX?%IAXC5V1L1yn=mv*pj)8kZ6r2ZW zPU4jfhpnz!n@kM!t@lX(m1BZPEl{ChS#&2$Yig1Lf{}=9V-YOUJjczgBctuDP*(t1 z^$JECnj~yH1Kw`g>5<~C!EylLM?lEgx1w(kPULNTyxGa&R>DmSwIFz!7yxVSyo*bI z8QE_S4iA?H@uewPyx0vvIsh2=(n^V^H zC7t`Tp?hhEyT8=YhVnxzyf|U>l3ZeS3zAoXOdvacjERNCBqT)cd-~{G&5Iq<=NOia z9nzU|?-eFPfe^>3{|0R?B-t`?b9b$+aR{^J+J8J&SK2GIYtc;$yBp7gtKC$gSIEJ| z^>wPzU+nm&asW_)lc|o-+k-+BaeRLE%eZV9rT+o5n1HmPiv*&f`&hklML#+nAB5*IjDMY3}TvSt2tJL;VwBa)# z8}>{tMW=36ll=+j|1HAZknD%M-J>MMfNWOvr9VglVdvKEr{wit$#S6z?`ZgL*O3*5 zqgbaN+x1(xvgIRJ_Xls^zP+`Z3P9|(lal~+RC}#&1nY73X9tar;uwEGS6zVRQIsMm z^l>#IIUHeQ8yXOR88krx+?ZzONO2|=*Zw4#F0dyT`pI&)5b_NT#j819$#+|LXF+PK z_=R8j;%ftdxJsXo3aKOsscMZ`+F)4z5xpST_&xTmx%4Y8H#Rn=kjL~@TJB~Im0M99 z@2?^3(sgntNKqdLq0ron2l%eSb}|CE4Uf&ut7_NALcoIvx<9DdAF+Zx^w+e-Q@6(W z1n4VzKms5p6Ntg5Vw2I#iY2ZahAb>B4WQ69EoES2L}OP^b<(Zk1m7QPZEba_y*5x} zz$x}>d)t9V(vxzu;yFnw2|~3u`EuU`R^Q85e}!0oDlg7~0$qO)Ct%;+=j7l3e+Hnl zJu+U#M&nr;K-=29*XpU6k0u{MUl_jx1^}7Iy*UnRwbA& zgwZ0dgPB8?vu)_y++*vpN@CvnlTUmS5)!mPFUi=34vc?7d;k7D^y0+}SkLp}PnZ0$ z2xI_8y?OJ-?(F2ne%2D^ANd1qZEbN}zixTpX>DE5tSoM^Q$A4bYODG1p|c*iy9jDw z7&tW&gY&J~HrBTDnb*7{5^%d|8Lmf_8V({BrBO)F8Im^_v4n!wj{mHw{wWeJ>W1Id z0TShl`Cr7~G~IsTCYP;x&BZ&HqK^Rt+#S!9lEytQZBRox3 z@mt768Ul{Uib`ZFS3{lPgA1h}E9)2;eD$Wead)!Fx1OH1U+Plh=|_o35hoX*?4Gad zZ_URWF-c0&dF-z?0*SK;e#EQ2mUy}kuP5UqRIv+TGyJy%k_q(f(qr)7cb7Q?hkGyEm)@f6?Bfj`ODERJ{c4Pv7_*e z=eBsc&+a33zX~ykp%_jTR_GxIMfJlo);vv5X+%d1I#R$#3kwRY2jMfD)6K9>;e)Kh z7GCdOn{m@$9|m&wh2E3@l`&B(izq3q9L||-8>sVpX-yAm4Sdwn5{uA~hnz~P_|<&v zVg*xECPU9Hd1#-Gn1o%8^bB1z$+k0&8(`J#+qWTtNg4SjKB$GS}U{uYsX z62BRng-s3wk>sIf0k9(IB=SI6d040dgzs8@D?5u=B8N6Rv?e**VL-3bM#VEWv zE_tccb2yHN>bw7!lD>H9|0pzTPDwo77uP}tLFDZh{?^griy(0Rt7g53cvg@l$Y&I4u{<)vnAAkFT(aly~!M&}>xRWlr1E2Me5jhOo} z#+(7fv4qFIoVT}k(4s!@%|R84a()0`KYsG$+DIJ8Od%V`$dG>*(ll}0TwHPo>*J$^ zWna$ac2K1yPrTK-Yp*9t)zH0|BW6wVwfU`~^KDyz%t2L})1^bsSLatQq+Qht|Gj(n z{Ird{$a=(gRDw)n%91sCFR$GCedZ{}>*%=C*Vkt}UgeC!LihdEkUhj8Gb3Z;EFj{+ zhmj$}Wfo?`pPt~rU^Z~W+%uB;U+o9`s<$kr3?D^1jPk zYJjo#CD{G}(hB`-lr)&vyI3F_7$rYC`Rhx#xVV+xr&W(pDQLa2!Qp0#rVc_ynvp2?>U}}MWmZ;J0A4b{7P)ih4iOm{>#&cEq1=q1~lOK zURWXRfO7w3$V6I}g4a+E)MRh}vg7!5~nC4H!ttHNoryu z6-wCc?d<`-7qrHj^B(5&0ecG$M;k_IiM1y)(7YF?cyF1s8UXz&fN7`Q$65)0dnMKs zca@ZIV6>tEpsR%0($b>y`6)4-*X})(;6$aakVp;yvUgMx)S^G(GToKWv%i#iH+V09 z0V=Z>Axjmm5D*xM8wmW!<=y~ki~d7~ z>UKs6T(}$n{CgAiB&g?FSu7rvKI7y2|ZF&~hY~vjt zY(xTCg9=@@gK<}~=Xbw=vvCCvih>S*y~}eoqmjKpt!;0)rxs*C+zCN>RXU`sSvM zi3wws>jsbLt04jHQ+8mg2i>&jo&uGOqK!?F9V^ElC3s~-)H7uEWr5Es0*hniAL|h z4r0g$PRG%8PR=cG`?&G0X`t5y%Bj^q3n@m>G)~ldL`OyW5;H3_{Fc0+wGy8^pyzlV zQbC65%>r_St&UeyfQO(P{w;DZU>{Hu4go<6cpHL%bJzeJhQDaTYM?+G*tG!6G&D5> zf`f5@5@xu5{fo4=~34WQ1k(RWtFuXZ`mDPA5^R{r?BiKTtc<$v?-3tosxDNEkPfipW zOBOKvyy*>p`G30Q|6fAb_8c>9;(zT^T=);!wk;qLqQLkA$R*&OWYpCe_EualwZj18 zz^^9Vi_#siB=Dq2Yyi~;M?`3SCitfIj}cg)#p&SaSZdOY1?((lW@e0ht-|}Cx#z#m zSw7N65FzxZLHS-*M+Uxp%X#Ik-CttmU#*7!)4Tg!Y#S6d>jI$+goYQVUVd?L8^B?{ z=OY4udde@_9gZ+i|1C|_iZL-WmwFu7psao%$1>^#EK%k|zVj`FesA;{Ng-0}bA{C) z&+ghN1sL{lvBikO_&YlUs6hAQU(C1IRc9Bcf`~8#7?SkjoZC-(3IurhprJ?jL;p|! z^BHq`y6;^F({t%)sLkAse}F3V z?i9-A*#?4u2h1wK3H%1oybK1$9O|2>+6FX!Ky;%r{Mxl^9AM>>qa9SdKYsie-;E-BT_DoIp=XEL63=C+n&VX75>&H(xs$2ze4rW6rB|R&f zxBpPl?nry|0Lqbm8a&yt%Vj%RXXz>PDKq3H=!@0(UKk%yEI-Bm*T|IxQ%CZhk(44b zz1yq$>5LZRqB#nTrp2Vi zhxv({h&hIA#Q>lJUS7ht+nkaX6pFnI!V!m%&~=HG9~f%7#qyTc76{-f_E=g!l{1rN z?oJT{^BMb*Jzzv5^>+D3Dnf}}B5(Iebu?(PJB4K7AwoQ0k`2|;0hkYrY_a)~V6bEq z)1Ka31b3hpXW!tDA%?L~Dc;tyyQ%VEfjCS2JnsIXgKkMuAH!9?G`%1yAS~wggO^m+ zfi?1@$mlQM4OA<@YgW7^`S3jDA-Q**g7L!a%zD3)5P=&%hPomP&W zPWtDz0CqqfsO|>vCp>q16>r(kU|I`N(|M>&Wb>tjbGxR1Q>z;Y!s~(q@nkkBhO|35 zwC`QEq}4iH^WhZz$t)AeFM`k~1_M+;YCyMv2n3ADKJqn-*{oBS9jWE^s!TQ@Q(jTx zI1R5Mk~1h`H+YE)JZ`1a@)d9;2#LI}qr;K^J)TOx8+8^pzrwE0jrD;_0WE5hnd!G- z0d(!scs2Zo$q32Y{lcM7Pw)X~2lVx6vaqsFgDe>O{4AzmaK_qN8-WS>iVr@k0P`xH z@ec~0&GY&+0$v(7^hQP7iheqW$akZus+cRp&lF>_gzns+B3@1#1srA7M;z^)>j0+n zJPH4MxbDm8B;LotKG0P`;t(B(xmH$BUOS%Y@9{ZvWPOc{1zo%rFU)Td$P~{z`(j{% zE;m=XeMZh^+Ivuhloi|dBv0st)Vgbmf4g4|?4Y_kol8VuOEsgr?X<{|Lu}D_zLefs z67_x%*_?Cbq%-Uc{_^63)BUl)L8ji!mO8~XFS`nwgg|4ncyGs~K_x~9o1no!oah&| zu@rWyW_|tz>?`Pa*@2k~c-(=Ip@)paPFB|;a`HR^?ot~Fob|V{u_oKiF~kF`mz#qK zgUZ|SlDb-Bv?X(HPCO_*%|5D2-tsaz-x(o!gVJG!9&3UDfv?irM*>nM+-Cs#wQ(X0 zrH_9&F;=iyk=Tq^1-8-q(3F;z>eRULhbee}{F>z4>OJUwZofYU`V=K@Tc(~z^YNfR zEe9-lRMYWmON+>NkL91NK#Re+dsXF93Nvf5# zwG*XJx9uVrmLW824MT%!_6GD1Pd9ubyNaKa@7FJQZ6P=66^~1txC}p00(auD`23jn zHwR7Zj!N3l0DGBv*V{5Gj(Yb z*fH%NlxsflNYH2r2njS9^BE)e*KjUhwuW0HUeFFaAu)o}T@yX55YiQ_2IYpyvJa2^ zLuaxARjs$N@g{2{B=c6n1W4uUsR`7=B6x>a+E6K!BcRT@@LRT zvvE$ukEhQA%G*P$jzvAaj~%z>3$<1!>*>K0yPSIozq))i19{rb$%zdef&@c#sOHqV z1Bb0&0kn)!mkeQaC6taS$E{%VKnm%{5U5M+k!ls{1?t|kFzHGZ1pdMRm(Bg6oBP!Z zr`dZt&(rk3n6jd5s5$W{44~Y=dMXKgXs0AdvF}z^pBTl(X#ndtkCa=Xzy_4}OLY!* z)w!yGVOZGM-1!71x05DMUJW{G_zADO#`7Arf>9a4<;sEHQ?=MEAzzpCLdxWYDt;~~ zS={+&b95BBs9AkXS!DZoy&k=(8%eQv0YJZif}>r-if9kfS+7{|UU;U5itEWv+WBtP zX)k!xZQHR8(I9Ot*xV#4L&4t{nOb}jz;Xnx`cLlCX+;g965mZn+As*2VgaVZ{PL)s zo6O|fP1uEZW%A~1;8kZRKE~ESZbOtrQPovVF>H1g|;p*cX1My{1pPdtRu4AuMNOL@a}kM zitSkMx`4|*+PXFj7+D8_wKx$K8JV>w`@p4DN4Y9mgVg|~x diff --git a/doc/salome/gui/VISU/input/table_presentations.doc b/doc/salome/gui/VISU/input/table_presentations.doc index 82dc0c96..44a153bf 100644 --- a/doc/salome/gui/VISU/input/table_presentations.doc +++ b/doc/salome/gui/VISU/input/table_presentations.doc @@ -27,6 +27,26 @@ in the context menu. \image html viewtable.png +When the Enable editing option is checked, contents of the table +are editable. +\note At the current moment this mode allows to sort table data only. +Sorting is performed by clicking on header of the column, by which the data +has to be sorted. + +Sort policy option allows to specify how the empty cells will be processed +during the sort procedure. The following options are available: +

    +
  • Empty cells are considered as lowest values
  • +
  • Empty cells are considered as highest values
  • +
  • Empty cells are always first
  • +
  • Empty cells are always last
  • +
  • Empty cells are ignored (means that positions of the empty cells +will not change after sorting)
  • +
+ +Adjust Cells button allows to adjust size of the table cells according +to their contents. + It is also possible to create \subpage table_3d_page "Table 3D presentation" basing on the table data and display it in the VTK viewer. diff --git a/resources/SalomeApp.xml b/resources/SalomeApp.xml index 91c71b58..74dc330c 100644 --- a/resources/SalomeApp.xml +++ b/resources/SalomeApp.xml @@ -72,6 +72,8 @@ + + diff --git a/src/VISUGUI/VISU_msg_en.ts b/src/VISUGUI/VISU_msg_en.ts index ea430b44..7c4cfd7a 100644 --- a/src/VISUGUI/VISU_msg_en.ts +++ b/src/VISUGUI/VISU_msg_en.ts @@ -421,6 +421,42 @@ number of time stamps or number of components is not the same! VISU_SWEEPING_PREF Sweeping preferences + + VISU_TABLES + Tables + + + VISU_TABLES_EDITING_PROPS + Tables editing properties + + + VISU_TABLES_ENABLE_EDITING + Enable editing + + + VISU_TABLES_SORT_POLICY + Sort policy + + + VISU_TABLES_EMPTY_LOWEST + Empty cells are considered as lowest values + + + VISU_TABLES_EMPTY_HIGHEST + Empty cells are considered as highest values + + + VISU_TABLES_EMPTY_FIRST + Empty cells are always first + + + VISU_TABLES_EMPTY_LAST + Empty cells are always last + + + VISU_TABLES_EMPTY_IGNORE + Empty cells are ignored + VISU_TIME_STAMP_FREQUENCY Time stamp frequency (for AVI generation) diff --git a/src/VISUGUI/VisuGUI.cxx b/src/VISUGUI/VisuGUI.cxx index 600c00f4..8cc895f5 100644 --- a/src/VISUGUI/VisuGUI.cxx +++ b/src/VISUGUI/VisuGUI.cxx @@ -4215,9 +4215,6 @@ void VisuGUI::createPreferences() setPreferenceProperty( scalar_def_represent, "indexes", indices1 ); addPreference( tr( "VISU_SHRINK" ), representGr, LightApp_Preferences::Bool, "VISU", "scalar_def_shrink" ); - addPreference( "", representGr, LightApp_Preferences::Space ); - - int quadraticmode = addPreference( tr( "QUADRATIC_REPRESENT_MODE" ), representGr, LightApp_Preferences::Selector, "VISU", "quadratic_mode" ); QStringList quadraticModes; quadraticModes.append("Lines"); @@ -4285,6 +4282,30 @@ void VisuGUI::createPreferences() addPreference( tr( "VISU_AUTOMATIC_FIT_ALL" ), representGr, LightApp_Preferences::Bool, "VISU", "automatic_fit_all" ); + // TAB: Tables ; group: "Tables editing properties" + int tablesTab = addPreference( tr( "VISU_TABLES" ) ); + + int tablesGr = addPreference( tr( "VISU_TABLES_EDITING_PROPS" ), tablesTab ); + setPreferenceProperty( tablesGr, "columns", 1 ); + + addPreference( tr( "VISU_TABLES_ENABLE_EDITING" ), tablesGr, LightApp_Preferences::Bool, "VISU", "tables_enable_editing" ); + + int sortPolicyPref = addPreference( tr( "VISU_TABLES_SORT_POLICY" ), tablesGr, LightApp_Preferences::Selector, "VISU", "tables_sort_policy" ); + QStringList policies; + policies.append( tr( "VISU_TABLES_EMPTY_LOWEST" ) ); + policies.append( tr( "VISU_TABLES_EMPTY_HIGHEST" ) ); + policies.append( tr( "VISU_TABLES_EMPTY_FIRST" ) ); + policies.append( tr( "VISU_TABLES_EMPTY_LAST" ) ); + policies.append( tr( "VISU_TABLES_EMPTY_IGNORE" ) ); + indices.clear(); + indices.append( 0 ); + indices.append( 1 ); + indices.append( 2 ); + indices.append( 3 ); + indices.append( 4 ); + setPreferenceProperty( sortPolicyPref, "strings", policies ); + setPreferenceProperty( sortPolicyPref, "indexes", indices ); + // TAB: Feature edges ; group: "Feature edges properties" int featureEdgesTab = addPreference( tr( "VISU_FEATURE_EDGES" ) ); diff --git a/src/VISU_I/VISU_TableDlg.cxx b/src/VISU_I/VISU_TableDlg.cxx index 6fc4d5e2..46a6b993 100644 --- a/src/VISU_I/VISU_TableDlg.cxx +++ b/src/VISU_I/VISU_TableDlg.cxx @@ -52,6 +52,7 @@ #include #include #include +#include #include "utilities.h" @@ -289,6 +290,11 @@ VISU_TableDlg::VISU_TableDlg( QWidget* parent, checkLayout->addWidget( myEditCheck ); checkLayout->addWidget( myUpdateCheck ); mainLayout->addLayout( checkLayout ); + + if ( LightApp_Application* app = ( LightApp_Application* )SUIT_Session::session()->activeApplication() ) { + int anEnableEditing = app->resourceMgr()->booleanValue( "VISU", "tables_enable_editing", false ); + myEditCheck->setChecked( anEnableEditing ); + } } mainLayout->addWidget( top ); mainLayout->addLayout( btnLayout ); @@ -471,7 +477,7 @@ void VISU_TableDlg::keyPressEvent( QKeyEvent* e ) Constructor */ VISU_TableDlg::TableWidget::TableWidget( QWidget* parent, - Qt::Orientation orientation ) + Qt::Orientation orientation ) : QWidget( parent ), myOrientation( orientation ) { myTitleEdit = new QLineEdit( this ); @@ -491,7 +497,21 @@ VISU_TableDlg::TableWidget::TableWidget( QWidget* parent, myAddColBtn = new QPushButton( VISU_TableDlg::tr( "ADD_COLUMN_BTN" ), this ); myDelColBtn = new QPushButton( VISU_TableDlg::tr( "REMOVE_COLUMN_BTN" ), this ); mySelectAllBtn = new QPushButton( VISU_TableDlg::tr( "SELECT_ALL_BTN" ), this ); - myClearBtn = new QPushButton( VISU_TableDlg::tr( "CLEAR_BTN"), this ); + myClearBtn = new QPushButton( VISU_TableDlg::tr( "CLEAR_BTN" ), this ); + + mySortPolicyLabel = new QLabel( VISU_TableDlg::tr( "VISU_TABLES_SORT_POLICY" ), this ); + mySortPolicyCombo = new QComboBox( this ); + mySortPolicyCombo->insertItems( 0, QStringList() << + VISU_TableDlg::tr( "VISU_TABLES_EMPTY_LOWEST" ) << + VISU_TableDlg::tr( "VISU_TABLES_EMPTY_HIGHEST" ) << + VISU_TableDlg::tr( "VISU_TABLES_EMPTY_FIRST" ) << + VISU_TableDlg::tr( "VISU_TABLES_EMPTY_LAST" ) << + VISU_TableDlg::tr( "VISU_TABLES_EMPTY_IGNORE" ) ); + + if ( LightApp_Application* app = ( LightApp_Application* )SUIT_Session::session()->activeApplication() ) { + int aSortPolicy = app->resourceMgr()->integerValue( "VISU", "tables_sort_policy", 3 ); + mySortPolicyCombo->setCurrentIndex( aSortPolicy ); + } // the features has been temporarily disabled myAddRowBtn->hide(); @@ -514,12 +534,20 @@ VISU_TableDlg::TableWidget::TableWidget( QWidget* parent, btnLayout->addWidget( mySelectAllBtn ); btnLayout->addWidget( myClearBtn ); + QHBoxLayout* sortLayout = new QHBoxLayout; + sortLayout->setMargin( 0 ); + sortLayout->setSpacing( SPACING_SIZE ); + sortLayout->addWidget( mySortPolicyLabel ); + sortLayout->addWidget( mySortPolicyCombo ); + sortLayout->addStretch( 1 ); + QGridLayout* mainLayout = new QGridLayout( this ); mainLayout->setMargin( 0 ); mainLayout->setSpacing( SPACING_SIZE ); mainLayout->addWidget( myTitleEdit, 0, 0, 1, 2 ); - mainLayout->addWidget( myTable, 1, 0 ); - mainLayout->addLayout( btnLayout, 1, 1 ); + mainLayout->addWidget( myTable, 1, 0 ); + mainLayout->addLayout( btnLayout, 1, 1 ); + mainLayout->addLayout( sortLayout, 2, 0, 1, 2 ); connect( myTable, SIGNAL( itemSelectionChanged() ), this, SLOT( updateButtonsState() ) ); @@ -532,6 +560,10 @@ VISU_TableDlg::TableWidget::TableWidget( QWidget* parent, connect( myAdjustBtn, SIGNAL( clicked() ), this, SLOT( adjustTable() ) ); connect( mySelectAllBtn, SIGNAL( clicked() ), this, SLOT( selectAll() ) ); connect( myClearBtn, SIGNAL( clicked() ), this, SLOT( clearTable() ) ); + connect( myTable->horizontalHeader(), SIGNAL( sectionClicked( int ) ), + this, SLOT( columnClicked( int ) ) ); + connect( myTable->verticalHeader(), SIGNAL( sectionClicked( int ) ), + this, SLOT( rowClicked( int ) ) ); myTable->horizontalHeader()->installEventFilter( this ); myTable->verticalHeader()->installEventFilter( this ); myTable->installEventFilter( this ); @@ -559,6 +591,12 @@ void VISU_TableDlg::TableWidget::initialize( _PTR(Study) study, VISU::Table_i* t setEditEnabled( false ); showColumnTitles( false ); + updateTableFromServant(); + updateButtonsState(); +} + +void VISU_TableDlg::TableWidget::updateTableFromServant() +{ _PTR(SObject) aSObject = myStudy->FindObjectID( myTableObj->GetObjectEntry() ); if ( aSObject ) { int i, j; @@ -683,7 +721,6 @@ void VISU_TableDlg::TableWidget::initialize( _PTR(Study) study, VISU::Table_i* t break; } } - updateButtonsState(); } /*! @@ -691,7 +728,16 @@ void VISU_TableDlg::TableWidget::initialize( _PTR(Study) study, VISU::Table_i* t */ void VISU_TableDlg::TableWidget::setEditEnabled( bool enable ) { - // the feature has been temporarily disabled + if( !enable ) { + myTable->horizontalHeader()->setSortIndicatorShown( false ); + myTable->verticalHeader()->setSortIndicatorShown( false ); + adjustTable(); + } + + mySortPolicyLabel->setEnabled( enable ); + mySortPolicyCombo->setEnabled( enable ); + + // the rest features have been temporarily disabled enable = false; myTitleEdit->setReadOnly( !enable ); @@ -1089,6 +1135,36 @@ void VISU_TableDlg::TableWidget::clearTable() myTable->clearContents(); updateButtonsState(); } +/*! + Column clicked slot +*/ +void VISU_TableDlg::TableWidget::columnClicked( int column ) +{ + if ( myTableObj && mySortPolicyCombo->isEnabled() ) { + myTableObj->SortByRow( column + 1, + ( VISU::SortOrder )myTable->horizontalHeader()->sortIndicatorOrder(), + ( VISU::SortPolicy )mySortPolicyCombo->currentIndex() ); + myTable->horizontalHeader()->setSortIndicatorShown( true ); + myTable->verticalHeader()->setSortIndicatorShown( false ); + updateTableFromServant(); + } +} +/*! + Row clicked slot +*/ +void VISU_TableDlg::TableWidget::rowClicked( int row ) +{ + /* the feature has been temporarily disabled + if ( myTableObj && mySortPolicyCombo->isEnabled() && row > 0 ) { // first row contains units + myTableObj->SortByColumn( row, + ( VISU::SortOrder )myTable->verticalHeader()->sortIndicatorOrder(), + ( VISU::SortPolicy )mySortPolicyCombo->currentIndex() ); + myTable->horizontalHeader()->setSortIndicatorShown( false ); + myTable->verticalHeader()->setSortIndicatorShown( true ); + updateTableFromServant(); + } + */ +} /*! Event filter - handles titles editing */ diff --git a/src/VISU_I/VISU_TableDlg.h b/src/VISU_I/VISU_TableDlg.h index df63250b..a911a6ce 100644 --- a/src/VISU_I/VISU_TableDlg.h +++ b/src/VISU_I/VISU_TableDlg.h @@ -32,9 +32,11 @@ #include #include +class QLabel; class QLineEdit; class QPushButton; class QCheckBox; +class QComboBox; class QTableWidget; namespace VISU @@ -135,6 +137,12 @@ public slots: void selectAll(); void clearTable(); + void columnClicked( int ); + void rowClicked( int ); + +protected: + void updateTableFromServant(); + private: _PTR(Study) myStudy; VISU::Table_i* myTableObj; @@ -150,6 +158,8 @@ private: QPushButton* myAdjustBtn; QPushButton* mySelectAllBtn; QPushButton* myClearBtn; + QLabel* mySortPolicyLabel; + QComboBox* mySortPolicyCombo; Qt::Orientation myOrientation; }; diff --git a/src/VISU_I/VISU_Table_i.cc b/src/VISU_I/VISU_Table_i.cc index ffc9a055..22166fd5 100644 --- a/src/VISU_I/VISU_Table_i.cc +++ b/src/VISU_I/VISU_Table_i.cc @@ -138,7 +138,7 @@ VISU::Table_i aReal->SortRow( theRow, (SALOMEDS::AttributeTable::SortOrder)theSortOrder, (SALOMEDS::AttributeTable::SortPolicy)theSortPolicy ); } - UpdateCurves(); + UpdateCurves( std::map() ); } } @@ -161,7 +161,7 @@ VISU::Table_i aReal->SortColumn( theColumn, (SALOMEDS::AttributeTable::SortOrder)theSortOrder, (SALOMEDS::AttributeTable::SortPolicy)theSortPolicy ); } - UpdateCurves(); + UpdateCurves( std::map() ); } } @@ -184,7 +184,7 @@ VISU::Table_i aReal->SortByRow( theRow, (SALOMEDS::AttributeTable::SortOrder)theSortOrder, (SALOMEDS::AttributeTable::SortPolicy)theSortPolicy ); } - UpdateCurves(); + UpdateCurves( std::map() ); } } @@ -196,25 +196,29 @@ VISU::Table_i SALOMEDS::SObject_var SO = mySObj; SALOMEDS::StudyBuilder_var Builder = GetStudyDocument()->NewBuilder(); if ( !SO->_is_nil() ) { + SALOMEDS::LongSeq_var aRowIndices; SALOMEDS::GenericAttribute_var anAttr; if ( Builder->FindAttribute( SO, anAttr, "AttributeTableOfInteger" ) ) { SALOMEDS::AttributeTableOfInteger_var anInt = SALOMEDS::AttributeTableOfInteger::_narrow( anAttr ); - anInt->SortByColumn( theColumn, (SALOMEDS::AttributeTable::SortOrder)theSortOrder, - (SALOMEDS::AttributeTable::SortPolicy)theSortPolicy ); + aRowIndices = anInt->SortByColumn( theColumn, (SALOMEDS::AttributeTable::SortOrder)theSortOrder, + (SALOMEDS::AttributeTable::SortPolicy)theSortPolicy ); } else if ( Builder->FindAttribute( SO, anAttr, "AttributeTableOfReal" ) ) { SALOMEDS::AttributeTableOfReal_var aReal = SALOMEDS::AttributeTableOfReal::_narrow( anAttr ); - aReal->SortByColumn( theColumn, (SALOMEDS::AttributeTable::SortOrder)theSortOrder, - (SALOMEDS::AttributeTable::SortPolicy)theSortPolicy ); + aRowIndices = aReal->SortByColumn( theColumn, (SALOMEDS::AttributeTable::SortOrder)theSortOrder, + (SALOMEDS::AttributeTable::SortPolicy)theSortPolicy ); } - UpdateCurves(); + std::map aMixData; + for ( int i = 0, n = aRowIndices->length(); i < n; i++ ) + aMixData[ aRowIndices[i] ] = i+1; + UpdateCurves( aMixData ); } } //---------------------------------------------------------------------------- void VISU::Table_i -::UpdateCurves() +::UpdateCurves(std::map theMixData) { SALOMEDS::SObject_var SO = mySObj; SALOMEDS::StudyBuilder_var Builder = GetStudyDocument()->NewBuilder(); @@ -222,9 +226,16 @@ VISU::Table_i for ( CI->InitEx( true ); CI->More(); CI->Next() ) { CORBA::Object_var anObj = SObjectToObject( CI->Value() ); VISU::Curve_var aCurve = VISU::Curve::_narrow( anObj ); - if ( !aCurve->_is_nil() ) - if( VISU::Curve_i* pCurve = dynamic_cast( GetServant( aCurve ).in() ) ) - UpdatePlot2d( NULL, eDisplay, pCurve ); // first parameter is null to update curves in all views + if ( !aCurve->_is_nil() ) { + if ( VISU::Curve_i* pCurve = dynamic_cast( GetServant( aCurve ).in() ) ) { + int aHRow = pCurve->GetHRow(), aVRow = pCurve->GetVRow(); + if ( theMixData.find( aHRow ) != theMixData.end() ) + pCurve->SetHRow( theMixData[ aHRow ] ); + if ( theMixData.find( aVRow ) != theMixData.end() ) + pCurve->SetVRow( theMixData[ aVRow ] ); + UpdatePlot2d( pCurve, eUpdateData ); + } + } } } diff --git a/src/VISU_I/VISU_Table_i.hh b/src/VISU_I/VISU_Table_i.hh index d385b1cb..3db4f3b5 100644 --- a/src/VISU_I/VISU_Table_i.hh +++ b/src/VISU_I/VISU_Table_i.hh @@ -64,7 +64,7 @@ namespace VISU{ protected: Storable* Build(int theRestoring); - void UpdateCurves(); + void UpdateCurves(std::map theMixData); protected: VISU::Table::Orientation myOrientation; @@ -145,10 +145,17 @@ namespace VISU{ public: virtual Storable* Create(); - int GetHRow() const { return myHRow;} - int GetVRow() const { return myVRow;} - int GetZRow() const { return myZRow;} - int GetIsV2() const { return myIsV2;} + int GetHRow() const { return myHRow; } + void SetHRow( const int theHRow ) { myHRow = theHRow; } + + int GetVRow() const { return myVRow; } + void SetVRow( const int theVRow ) { myVRow = theVRow; } + + int GetZRow() const { return myZRow; } + void SetZRow( const int theZRow ) { myZRow = theZRow; } + + int GetIsV2() const { return myIsV2; } + void SetIsV2( const int theIsV2 ) { myIsV2 = theIsV2; } virtual Storable* Restore( const Storable::TRestoringMap& theMap, SALOMEDS::SObject_ptr theSO); diff --git a/src/VISU_I/VISU_ViewManager_i.cc b/src/VISU_I/VISU_ViewManager_i.cc index 07293528..e591ba5a 100644 --- a/src/VISU_I/VISU_ViewManager_i.cc +++ b/src/VISU_I/VISU_ViewManager_i.cc @@ -95,19 +95,19 @@ namespace VISU { QList anApplications = aSession->applications(); QList::Iterator anIter = anApplications.begin(); while ( anIter != anApplications.end() ) { - SUIT_Application* anApp = *anIter; - if (SUIT_Study* aSStudy = anApp->activeStudy()) { - if (SalomeApp_Study* aStudy = dynamic_cast(aSStudy)) { + SUIT_Application* anApp = *anIter; + if (SUIT_Study* aSStudy = anApp->activeStudy()) { + if (SalomeApp_Study* aStudy = dynamic_cast(aSStudy)) { if (_PTR(Study) aCStudy = aStudy->studyDS()) { //if (myStudyName == aCStudy->Name()) { if (myStudyId == aCStudy->StudyId()) { - myResult = dynamic_cast(anApp); - break; - } - } - } - } - anIter++; + myResult = dynamic_cast(anApp); + break; + } + } + } + } + anIter++; } if (!myResult) { //MESSAGE("Error: application is not found for study : " << myStudyName); @@ -151,7 +151,7 @@ namespace VISU { { VISU::View3D_i* aView = new View3D_i (myApplication); if (aView->Create(0)) - myResult = aView->_this(); + myResult = aView->_this(); } }; @@ -179,11 +179,11 @@ namespace VISU { { //if (CheckStudy(myStudyDocument)) { if (myApplication) { - TViewFrame* pView = new TViewFrame (myApplication); - if (pView->Create(1)) { - myResult = pView->_this(); - qApp->processEvents(); // Fix for bug 9929 - } + TViewFrame* pView = new TViewFrame (myApplication); + if (pView->Create(1)) { + myResult = pView->_this(); + qApp->processEvents(); // Fix for bug 9929 + } } } }; @@ -216,7 +216,7 @@ namespace VISU { Table_ptr myTable; public: TCreateTableViewFrameEvent (SalomeApp_Application* theApplication, - Table_ptr theTable): + Table_ptr theTable): TCreateViewEvent(theApplication), myTable(theTable), myResult(VISU::TableView::_nil()) @@ -225,9 +225,9 @@ namespace VISU { virtual void Execute() { //if (CheckStudy(myStudyDocument)) { - VISU::TableView_i* pView = new TableView_i (myApplication); - if (pView->Create(myTable) != NULL) - myResult = pView->_this(); + VISU::TableView_i* pView = new TableView_i (myApplication); + if (pView->Create(myTable) != NULL) + myResult = pView->_this(); //} } typedef VISU::TableView_ptr TResult; @@ -247,15 +247,15 @@ namespace VISU { View_ptr myView; public: TEvent(View_ptr theView): - myView(theView) + myView(theView) {} virtual void Execute(){ - if (!CORBA::is_nil(myView)) { - if (VISU::View_i* pView = dynamic_cast(VISU::GetServant(myView).in())) { - pView->Close(); - pView->_remove_ref(); - } - } + if (!CORBA::is_nil(myView)) { + if (VISU::View_i* pView = dynamic_cast(VISU::GetServant(myView).in())) { + pView->Close(); + pView->_remove_ref(); + } + } } }; @@ -298,19 +298,19 @@ namespace VISU { VISU_Actor *anVISUActor = NULL, *aResActor = NULL; for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL;){ if(anActor->IsA("VISU_Actor")){ - anVISUActor = VISU_Actor::SafeDownCast(anActor); - if (thePrs == anVISUActor->GetPrs3d()) { - aResActor = anVISUActor; - if(theDisplaing < eErase) - aResActor->VisibilityOn(); - else - aResActor->VisibilityOff(); - } else { - if(theDisplaing == eEraseAll || theDisplaing == eDisplayOnly) - anVISUActor->VisibilityOff(); - else if ( theDisplaing == eDisplayAll ) - anVISUActor->VisibilityOn(); - } + anVISUActor = VISU_Actor::SafeDownCast(anActor); + if (thePrs == anVISUActor->GetPrs3d()) { + aResActor = anVISUActor; + if(theDisplaing < eErase) + aResActor->VisibilityOn(); + else + aResActor->VisibilityOff(); + } else { + if(theDisplaing == eEraseAll || theDisplaing == eDisplayOnly) + anVISUActor->VisibilityOff(); + else if ( theDisplaing == eDisplayAll ) + anVISUActor->VisibilityOn(); + } } } if (aResActor) { @@ -319,14 +319,14 @@ namespace VISU { } if(thePrs != NULL && theDisplaing < eErase){ try{ - anVISUActor = thePrs->CreateActor(); - vf->AddActor(anVISUActor); + anVISUActor = thePrs->CreateActor(); + vf->AddActor(anVISUActor); }catch(std::exception& exc){ - if(MYDEBUG) INFOS(exc.what()); - return NULL; + if(MYDEBUG) INFOS(exc.what()); + return NULL; }catch(...){ - if(MYDEBUG) INFOS("Unknown exception was occured!!!"); - return NULL; + if(MYDEBUG) INFOS("Unknown exception was occured!!!"); + return NULL; } } RepaintView(theViewWindow); @@ -335,12 +335,12 @@ namespace VISU { struct TUpdatePlot2dEvent: public SALOME_Event { - int myDisplaying; Curve_i* myCurve; + int myDisplaying; - TUpdatePlot2dEvent (const int theDisplaying, Curve_i* theCurve): - myDisplaying(theDisplaying), - myCurve(theCurve) + TUpdatePlot2dEvent (Curve_i* theCurve, const int theDisplaying): + myCurve(theCurve), + myDisplaying(theDisplaying) {} virtual void Execute() @@ -375,7 +375,7 @@ namespace VISU { if (Plot2d_ViewManager* aManager = dynamic_cast(aViewManager)) { if (SPlot2d_Viewer* aViewer = dynamic_cast(aManager->getViewModel())) { if (Plot2d_ViewFrame* aViewFrame = aViewer->getActiveViewFrame()) { - UpdatePlot2d(aViewFrame, myDisplaying, myCurve); + UpdatePlot2d(myCurve, myDisplaying, aViewFrame); } } } @@ -383,128 +383,93 @@ namespace VISU { } }; - void UpdatePlot2d (Plot2d_ViewFrame *theView,int theDisplaying, Curve_i* theCurve) + void UpdatePlot2d (Curve_i* theCurve, int theDisplaying, Plot2d_ViewFrame* theView) { if(MYDEBUG) MESSAGE("UpdatePlot2d - theDisplaying = " << theDisplaying); if (!theView) { // update all views - ProcessVoidEvent(new TUpdatePlot2dEvent(theDisplaying, theCurve)); + ProcessVoidEvent(new TUpdatePlot2dEvent(theCurve, theDisplaying)); return; } QList clist; theView->getCurves(clist); if (theDisplaying == eEraseAll) { for (int i = 0; i < clist.count(); i++) { - if(MYDEBUG) MESSAGE("UpdatePlot2d - erasing all : curve - " << clist.at(i)); - theView->eraseCurve(clist.at(i)); + if(MYDEBUG) MESSAGE("UpdatePlot2d - erasing all : curve - " << clist.at(i)); + theView->eraseCurve(clist.at(i)); } } else if (theDisplaying == eErase) { if (theCurve) { - for (int i = 0; i < clist.count(); i++) { - SPlot2d_Curve* aSPlot2dC = dynamic_cast(clist.at(i)); - if (aSPlot2dC->hasIO() && - !strcmp(theCurve->GetEntry().c_str(), aSPlot2dC->getIO()->getEntry())) { - if(MYDEBUG) MESSAGE("UpdatePlot2d - erasing : curve - " << aSPlot2dC); - theView->eraseCurve(aSPlot2dC); - } - } - } - } else if (theDisplaying == eDisplay) { - if (theCurve) { - bool bFound = false; - for (int i = 0; i < clist.count(); i++) { - SPlot2d_Curve* aSPlot2dC = dynamic_cast(clist.at(i)); - if (aSPlot2dC->hasIO() && - !strcmp(theCurve->GetEntry().c_str(), aSPlot2dC->getIO()->getEntry())) { - if(MYDEBUG) MESSAGE("UpdatePlot2d - displaying : curve - " << aSPlot2dC); - aSPlot2dC->setHorTitle( theCurve->GetHorTitle().c_str() ); - aSPlot2dC->setVerTitle( theCurve->GetVerTitle().c_str() ); - aSPlot2dC->setHorUnits( theCurve->GetHorUnits().c_str() ); - aSPlot2dC->setVerUnits( theCurve->GetVerUnits().c_str() ); - double* xList = 0; - double* yList = 0; - QStringList zList; - int nbPoints = theCurve->GetData( xList, yList, zList ); - if (nbPoints > 0 && xList && yList) { - aSPlot2dC->setData( xList, yList, nbPoints, zList ); - } - if (!theCurve->IsAuto()) { - aSPlot2dC->setLine((Plot2d::LineType)theCurve->GetLine(), - theCurve->GetLineWidth()); - aSPlot2dC->setMarker((Plot2d::MarkerType)theCurve->GetMarker()); - SALOMEDS::Color color = theCurve->GetColor(); - aSPlot2dC->setColor(QColor((int)(color.R*255.), - (int)(color.G*255.), - (int)(color.B*255.))); - } - aSPlot2dC->setAutoAssign(theCurve->IsAuto()); - theView->displayCurve(aSPlot2dC); - bFound = true; - } - } - if (!bFound) { - Plot2d_Curve* crv = theCurve->CreatePresentation(); - if(MYDEBUG) MESSAGE("UpdatePlot2d - displaying : curve (new) - "<displayCurve( crv ); - theCurve->SetLine( (VISU::Curve::LineType)crv->getLine(), crv->getLineWidth() ); - theCurve->SetMarker( (VISU::Curve::MarkerType)crv->getMarker()); - SALOMEDS::Color newColor; - newColor.R = crv->getColor().red()/255.; - newColor.G = crv->getColor().green()/255.; - newColor.B = crv->getColor().blue()/255.; - theCurve->SetColor( newColor ); - crv->setAutoAssign( theCurve->IsAuto() ); - } - } + for (int i = 0; i < clist.count(); i++) { + SPlot2d_Curve* aSPlot2dC = dynamic_cast(clist.at(i)); + if (aSPlot2dC->hasIO() && + !strcmp(theCurve->GetEntry().c_str(), aSPlot2dC->getIO()->getEntry())) { + if(MYDEBUG) MESSAGE("UpdatePlot2d - erasing : curve - " << aSPlot2dC); + theView->eraseCurve(aSPlot2dC); + } + } } - } else if (theDisplaying == eDisplayOnly) { + } else if (theDisplaying == eDisplay || + theDisplaying == eDisplayOnly || + theDisplaying == eUpdateData) { if (theCurve) { - bool bFound = false; - for (int i = 0; i < clist.count(); i++) { - SPlot2d_Curve* aSPlot2dC = dynamic_cast(clist.at(i)); - if (aSPlot2dC->hasIO() && - !strcmp(theCurve->GetEntry().c_str(), aSPlot2dC->getIO()->getEntry())) { - if(MYDEBUG) MESSAGE("UpdatePlot2d - displaying only : curve - " << aSPlot2dC); - aSPlot2dC->setHorTitle( theCurve->GetHorTitle().c_str() ); - aSPlot2dC->setVerTitle( theCurve->GetVerTitle().c_str() ); - aSPlot2dC->setHorUnits( theCurve->GetHorUnits().c_str() ); - aSPlot2dC->setVerUnits( theCurve->GetVerUnits().c_str() ); - double* xList = 0; - double* yList = 0; - QStringList zList; - int nbPoints = theCurve->GetData( xList, yList, zList ); - if ( nbPoints > 0 && xList && yList ) { - aSPlot2dC->setData( xList, yList, nbPoints, zList ); - } - if ( !theCurve->IsAuto() ) { - aSPlot2dC->setLine((Plot2d::LineType)theCurve->GetLine(), theCurve->GetLineWidth()); - aSPlot2dC->setMarker((Plot2d::MarkerType)theCurve->GetMarker()); - SALOMEDS::Color color = theCurve->GetColor(); - aSPlot2dC->setColor(QColor((int)(color.R*255.), (int)(color.G*255.), (int)(color.B*255.))); - } - aSPlot2dC->setAutoAssign(theCurve->IsAuto()); - theView->displayCurve(aSPlot2dC); - bFound = true; - } else { - theView->eraseCurve(aSPlot2dC); - } - } - if (!bFound) { - Plot2d_Curve* crv = theCurve->CreatePresentation(); - if(MYDEBUG) MESSAGE("UpdatePlot2d - displaying only : curve (new) - " << crv); - if (crv) { - theView->displayCurve(crv); - theCurve->SetLine((VISU::Curve::LineType)crv->getLine(), crv->getLineWidth()); - theCurve->SetMarker((VISU::Curve::MarkerType)crv->getMarker()); - SALOMEDS::Color newColor; - newColor.R = crv->getColor().red()/255.; - newColor.G = crv->getColor().green()/255.; - newColor.B = crv->getColor().blue()/255.; - theCurve->SetColor(newColor); - crv->setAutoAssign(theCurve->IsAuto()); - } - } + bool bFound = false; + for (int i = 0; i < clist.count(); i++) { + SPlot2d_Curve* aSPlot2dC = dynamic_cast(clist.at(i)); + if (aSPlot2dC->hasIO() && + !strcmp(theCurve->GetEntry().c_str(), aSPlot2dC->getIO()->getEntry())) { + if (theDisplaying == eUpdateData) { + if(MYDEBUG) MESSAGE("UpdatePlot2d - updating data : curve - " << aSPlot2dC); + } + else { + if(MYDEBUG) MESSAGE("UpdatePlot2d - displaying : curve - " << aSPlot2dC); + } + double* xList = 0; + double* yList = 0; + QStringList zList; + int nbPoints = theCurve->GetData( xList, yList, zList ); + if (nbPoints > 0 && xList && yList) { + aSPlot2dC->setData( xList, yList, nbPoints, zList ); + } + if (theDisplaying == eUpdateData) { + theView->updateCurve(aSPlot2dC, true); + } else { + aSPlot2dC->setHorTitle( theCurve->GetHorTitle().c_str() ); + aSPlot2dC->setVerTitle( theCurve->GetVerTitle().c_str() ); + aSPlot2dC->setHorUnits( theCurve->GetHorUnits().c_str() ); + aSPlot2dC->setVerUnits( theCurve->GetVerUnits().c_str() ); + if (!theCurve->IsAuto()) { + aSPlot2dC->setLine((Plot2d::LineType)theCurve->GetLine(), + theCurve->GetLineWidth()); + aSPlot2dC->setMarker((Plot2d::MarkerType)theCurve->GetMarker()); + SALOMEDS::Color color = theCurve->GetColor(); + aSPlot2dC->setColor(QColor((int)(color.R*255.), + (int)(color.G*255.), + (int)(color.B*255.))); + } + aSPlot2dC->setAutoAssign(theCurve->IsAuto()); + theView->displayCurve(aSPlot2dC); + bFound = true; + } + } else if (theDisplaying == eDisplayOnly) { + theView->eraseCurve(aSPlot2dC); + } + } + if (!bFound && theDisplaying != eUpdateData) { + Plot2d_Curve* crv = theCurve->CreatePresentation(); + if(MYDEBUG) MESSAGE("UpdatePlot2d - displaying : curve (new) - "<displayCurve( crv ); + theCurve->SetLine( (VISU::Curve::LineType)crv->getLine(), crv->getLineWidth() ); + theCurve->SetMarker( (VISU::Curve::MarkerType)crv->getMarker()); + SALOMEDS::Color newColor; + newColor.R = crv->getColor().red()/255.; + newColor.G = crv->getColor().green()/255.; + newColor.B = crv->getColor().blue()/255.; + theCurve->SetColor( newColor ); + crv->setAutoAssign( theCurve->IsAuto() ); + } + } } } } @@ -595,18 +560,18 @@ namespace VISU { QList anApplications = aSession->applications(); QList::Iterator anIter = anApplications.begin(); while ( anIter != anApplications.end() ) { - SUIT_Application* aSUITApp = *anIter; - if (SUIT_Study* aSStudy = aSUITApp->activeStudy()) { + SUIT_Application* aSUITApp = *anIter; + if (SUIT_Study* aSStudy = aSUITApp->activeStudy()) { if (SalomeApp_Study* aStudy = dynamic_cast(aSStudy)) { if (_PTR(Study) aCStudy = aStudy->studyDS()) { if (aStudyName == aCStudy->Name()) { anApp = dynamic_cast(aSUITApp); - break; - } - } - } + break; + } + } + } } - anIter++; + anIter++; } if (!anApp) return; @@ -636,23 +601,23 @@ namespace VISU { QList::Iterator anVMIter = aViewManagerList.begin(); for (; anVMIter != aViewManagerList.end(); anVMIter++ ) { SUIT_ViewManager* aViewManager = *anVMIter; - QVector aViews = aViewManager->getViews(); - for (int i = 0, iEnd = aViews.size(); i < iEnd; i++) { - if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) { - if (Plot2d_ViewWindow* vw = dynamic_cast(aViewWindow)) { + QVector aViews = aViewManager->getViews(); + for (int i = 0, iEnd = aViews.size(); i < iEnd; i++) { + if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) { + if (Plot2d_ViewWindow* vw = dynamic_cast(aViewWindow)) { Plot2d_ViewFrame* vf = vw->getViewFrame(); - QList clist; - vf->getCurves(clist); - for (int i = 0; i < clist.count(); i++) { + QList clist; + vf->getCurves(clist); + for (int i = 0; i < clist.count(); i++) { if (SPlot2d_Curve* cu = dynamic_cast(clist.at(i))) { - if (cu->hasIO() && - strcmp(myPrs->GetEntry().c_str(), cu->getIO()->getEntry())) { - vf->eraseCurve(cu); - } - } - } - vf->Repaint(); - //jfa tmp:aViewFrame->unHighlightAll(); + if (cu->hasIO() && + strcmp(myPrs->GetEntry().c_str(), cu->getIO()->getEntry())) { + vf->eraseCurve(cu); + } + } + } + vf->Repaint(); + //jfa tmp:aViewFrame->unHighlightAll(); } } } @@ -680,10 +645,10 @@ namespace VISU { if (_PTR(Study) aCStudy = aStudy->studyDS()) { if (aStudyName == aCStudy->Name()) { anApp = dynamic_cast(aSUITApp); - break; - } - } - } + break; + } + } + } } } if (!anApp) @@ -716,21 +681,21 @@ namespace VISU { SUIT_ViewManager* aViewManager = anVMIter.current(); QPtrVector aViews = aViewManager->getViews(); for (int i = 0, iEnd = aViews.size(); i < iEnd; i++) { - if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) { - if (Plot2d_ViewWindow* vw = dynamic_cast(aViewWindow)) { + if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) { + if (Plot2d_ViewWindow* vw = dynamic_cast(aViewWindow)) { Plot2d_ViewFrame* vf = vw->getViewFrame(); QList clist; vf->getCurves(clist); - for (int i = 0; i < clist.count(); i++) { + for (int i = 0; i < clist.count(); i++) { if (SPlot2d_Curve* cu = dynamic_cast(clist.at(i))) { - if (cu->hasIO() && - strcmp(cu->getIO()->getEntry(), thePrs->GetEntry()) == 0) { - vf->eraseCurve(cu); - } - } - } - vf->Repaint(); - //jfa tmp:aViewFrame->unHighlightAll(); + if (cu->hasIO() && + strcmp(cu->getIO()->getEntry(), thePrs->GetEntry()) == 0) { + vf->eraseCurve(cu); + } + } + } + vf->Repaint(); + //jfa tmp:aViewFrame->unHighlightAll(); } } } @@ -756,10 +721,10 @@ namespace VISU { if (_PTR(Study) aCStudy = aStudy->studyDS()) { if (aStudyName == aCStudy->Name()) { anApp = dynamic_cast(aSUITApp); - break; - } - } - } + break; + } + } + } } anIter++; } @@ -793,22 +758,22 @@ namespace VISU { SUIT_ViewManager* aViewManager = *anVMIter; QVector aViews = aViewManager->getViews(); for (int i = 0, iEnd = aViews.size(); i < iEnd; i++) { - if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) { - if (SVTK_ViewWindow* vw = dynamic_cast(aViewWindow)) { + if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) { + if (SVTK_ViewWindow* vw = dynamic_cast(aViewWindow)) { VISU_Actor* anActor = NULL; - VTK::ActorCollectionCopy aCopy(vw->getRenderer()->GetActors()); + VTK::ActorCollectionCopy aCopy(vw->getRenderer()->GetActors()); vtkActorCollection *anActColl = aCopy.GetActors(); - anActColl->InitTraversal(); + anActColl->InitTraversal(); vtkActor *aVTKActor = anActColl->GetNextActor(); - for (; !anActor && aVTKActor; aVTKActor = anActColl->GetNextActor()) { + for (; !anActor && aVTKActor; aVTKActor = anActColl->GetNextActor()) { if (VISU_Actor* anVISUActor = dynamic_cast(aVTKActor)) { - if (thePrs == anVISUActor->GetPrs3d()) { - anActor = anVISUActor; + if (thePrs == anVISUActor->GetPrs3d()) { + anActor = anVISUActor; } } } if (anActor) { - vw->RemoveActor(anActor); + vw->RemoveActor(anActor); } } } diff --git a/src/VISU_I/VISU_ViewManager_i.hh b/src/VISU_I/VISU_ViewManager_i.hh index 6824f1c0..b951d461 100644 --- a/src/VISU_I/VISU_ViewManager_i.hh +++ b/src/VISU_I/VISU_ViewManager_i.hh @@ -72,9 +72,9 @@ namespace VISU { void RepaintView (SUIT_ViewWindow* theViewWindow); - enum Displaing {eDisplayAll, eDisplay, eDisplayOnly, eErase, eEraseAll}; + enum Displaing {eDisplayAll, eDisplay, eDisplayOnly, eErase, eEraseAll, eUpdateData}; VISU_I_EXPORT VISU_Actor* UpdateViewer (SUIT_ViewWindow* theViewWindow, int theDisplaing, Prs3d_i* thePrs = NULL); - void UpdatePlot2d (Plot2d_ViewFrame *theView, int theDisplaying, Curve_i* theCurve); + void UpdatePlot2d (Curve_i* theCurve, int theDisplaying, Plot2d_ViewFrame* theView = NULL); VISU_I_EXPORT VISU_Actor* FindActor(SVTK_ViewWindow* theViewWindow, VISU::Prs3d_i* thePrs3d); VISU_I_EXPORT VISU_ActorBase* FindActorBase(SVTK_ViewWindow* theViewWindow, VISU::TActorFactory* theActor); diff --git a/src/VISU_I/VISU_View_i.cc b/src/VISU_I/VISU_View_i.cc index 9ef00c68..51aed177 100644 --- a/src/VISU_I/VISU_View_i.cc +++ b/src/VISU_I/VISU_View_i.cc @@ -1336,7 +1336,7 @@ namespace VISU { { // is it Curve ? if (Curve_i* aCurve = dynamic_cast(VISU::GetServant(myPrsObj).in())) { - UpdatePlot2d(myView,myDisplaing,aCurve); + UpdatePlot2d(aCurve,myDisplaing,myView); } // is it Container ? if (Container_i* aContainer = dynamic_cast(VISU::GetServant(myPrsObj).in())) { @@ -1344,7 +1344,7 @@ namespace VISU { for ( int i = 1; i <= nbCurves; i++ ) { VISU::Curve_i* aCurve = aContainer->GetCurve( i ); if ( aCurve && aCurve->IsValid() ) { - UpdatePlot2d(myView,myDisplaing,aCurve); + UpdatePlot2d(aCurve,myDisplaing,myView); } } myView->Repaint(); @@ -1366,8 +1366,8 @@ namespace VISU { if (!CORBA::is_nil(childObject)) { CORBA::Object_ptr aCurve = VISU::Curve::_narrow(childObject); if (!CORBA::is_nil(aCurve)) - UpdatePlot2d(myView, myDisplaing, - dynamic_cast(VISU::GetServant(aCurve).in())); + UpdatePlot2d(dynamic_cast(VISU::GetServant(aCurve).in()), + myDisplaing, myView); } } myView->Repaint(); -- 2.39.2