From c0cc40f102633b0e702f4badfc0a51a155808a3e Mon Sep 17 00:00:00 2001 From: vsr Date: Tue, 18 Feb 2014 14:01:16 +0400 Subject: [PATCH] Merge from branch mpa/qwt6_porting --- .../gui/images/plot2d_view_settings.png | Bin 29837 -> 61324 bytes .../gui/images/pref_salome_plot2dviewer.png | Bin 57572 -> 58913 bytes doc/salome/gui/input/plot2d_viewer.doc | 22 +- doc/salome/gui/input/setting_preferences.doc | 60 +-- src/LightApp/LightApp_Application.cxx | 121 +++-- src/LightApp/resources/LightApp.xml | 1 + src/LightApp/resources/LightApp_msg_en.ts | 20 + src/LightApp/resources/LightApp_msg_fr.ts | 20 + src/Plot2d/Plot2d.cxx | 2 +- src/Plot2d/Plot2d.h | 4 +- src/Plot2d/Plot2d_AnalyticalCurve.cxx | 22 +- src/Plot2d/Plot2d_Curve.cxx | 16 +- src/Plot2d/Plot2d_Histogram.cxx | 10 +- src/Plot2d/Plot2d_Histogram.h | 34 +- src/Plot2d/Plot2d_Object.cxx | 26 +- src/Plot2d/Plot2d_Object.h | 2 - src/Plot2d/Plot2d_PlotItems.cxx | 392 +++++++++------ src/Plot2d/Plot2d_PlotItems.h | 115 +++-- src/Plot2d/Plot2d_SetupViewDlg.cxx | 163 +++++-- src/Plot2d/Plot2d_SetupViewDlg.h | 12 +- src/Plot2d/Plot2d_ViewFrame.cxx | 457 ++++++++++-------- src/Plot2d/Plot2d_ViewFrame.h | 59 +-- src/Plot2d/Plot2d_ViewManager.cxx | 4 +- src/Plot2d/Plot2d_ViewModel.cxx | 5 +- src/Plot2d/Plot2d_ViewModel.h | 2 +- src/Plot2d/Plot2d_ViewWindow.cxx | 8 +- src/Plot2d/resources/Plot2d_msg_en.ts | 32 ++ src/Plot2d/resources/Plot2d_msg_fr.ts | 32 ++ src/SPlot2d/SPlot2d_ViewModel.cxx | 4 +- src/SPlot2d/SPlot2d_ViewModel.h | 2 +- 30 files changed, 1042 insertions(+), 605 deletions(-) diff --git a/doc/salome/gui/images/plot2d_view_settings.png b/doc/salome/gui/images/plot2d_view_settings.png index 2b7ddffc78a3576d36460bd6833f0b2f08ebe41d..e87556beb23f2158c243e0c1230ac32740d9ce12 100644 GIT binary patch literal 61324 zcmaI81z43^v@VRIfYO41G}2wtB@NOb(v2Y9T?zvewNUNg2y%J&;F{p6ieJ6o6v^FD2DO22pW z=MsE*-F6GUk~{uS-y;}=2hzNfbX4Vd0&mV68&MoFB)OQ1g(7m1cZB#Ayy#cW-NVcr z3}q&i(l4Zr&FdX7BIkLJ*U8YEgcW`^+(kezSmKO67>}lgU)6dvZZ{j*czt#5{A;~r zx1?C}g45qXh8&jcz8HTPeNKc$GkVyroeCB|Lq^d;gpn=buxTb zE&1Zy{tMSPMg(tgc!O~6h(4ea#o~>OrIN+Evnhmt(3e_I9H@LYeJDlCc_NaRmpkw> zF*1*yo?cQ)s;0V{B2d4R=<6n}CQe?>xn zaso7@X_OMgTL@3Rq5d_sr+R$$@k@fvD0eD=VdBUUn|(3X7$#sw5@M=11r}9UUE( z1bhY*n=)hX8kJ;ZWXJ;r>jhVP5+;w^(t8*B=t47OLNn-SV(&#GA|Q}F9kWiQpw}51#o_j}fY!Jfi#yK4hgr0mOfR%7 z#;Y!Zc4ixkb8|II3~xowqfn4WY3S))-t9CA*`C=`T76F?tAZ=3g2e}0=qkFYk^H;L zOu27*$@lNyv$M_Q<-4?JE6`UbC&!Dm>pQx-&{`cZF)>M_{$>$P4|pb}uu@S`F)?|s z^`&23o;S@BAt3PguQuw6r8TyDd}vB*>P_nP?V4SyV&`B`m5>M&32t3ffAIoCndJ4N zyT1O++XMUtavBfqYAAe-jn8U~vjckkLKxU3?=!{LFcAWLIv>CWaP<9Z@iy)K$nxX@x_5SK0fwZ%g#l->UEue9fI6z zV`a3^pAQV#>5wEQYT7E`2e5bq4`qF4Ha$DSA+aii#R5$bM7gFSku+09@q`+(LyhCFx;Ejlj7 zjN?(uYwrdI1{A}R2XmBmFvc(Eej_$|8QK}*Zh3S_OuMtx0HccK_+)Z`@V{+JU2C6N*FYc zBoPV1QYHGlvb6aDD@|EnzbGfC%I2K=3}3`!e<^ZHV9fgXvuHr2&1ClH+#mDyc+A?) zi)RsMXP(s5S>I21Z{4~zc61A2maMAi)QRt7a>on(t+BSRMMX0uz5%_2WL8#Io;@Gv z)o7Gb!?6dc6Gd@n{u#-zkg6JujkG&C<>ynw&#jy}M~F11=^;Z7>#l3`?HQx+AyMS=T( z*x2yZ=fc8EmwMu}UvK_e0u*4RBM+i8bg};5-hYtCCIzT{^Z zf7&>O3MG5$z5X&VFvu$?5cOF5Jo#EsfJWg=y>~yVH7q0q1rsx;X>M<^wfMjw>Jex5 z_wVj2WSo~(CrXJ==()ItZ5#9!h9&OZyXT7z-GJZkO3=?RqTO`+-n6)MPrx}Q)PUCT zM+f`Mon>VlG_f9MUF)!4_ZENWV?G}p9#)W-Kb%~{ztZ>~8rsp|b52Y`tdzzVVKfHM z=ykZZ=MpV`-SAJFRKbPnEg4PqZjm?kbX~V6Lo%$!Z6^|okkd^5#f!L#ilcP#VAu{% zoY#~C-&a-rJ>Hrex2}Bs`l+mJdl)|J6KKsxM@BjD{pooJM$^5R)!tObBbCsQ5H>EZEV|I5*`65;3Mv*BVVkq^Piq8vdebG8My|)M zfByVIp`fMBnG*>(I5>ESi(54N{c0FpLb@mC4cEfp4?W4VM&^E63&tdyY4n>t9>T`MTk$*InW;bj#BO42VvNtE zi-kjiLqHIM)zRDA=(HNy&qi6(1wXGX!r5%f0Za9ml2WK%Fw-RC@6M!B@6JeJ(&x|Q zLd^6O3FlPtMS_%+izlUv7d&S?b~Ak@RgtB)J3KnFvb03=82wL2}h(8tG7H96c=(a6KeQ>MqL7<@Gr`+<)1L zErvLZOhZF6F#RD@I;!${KxwIiul`lsYi799`TeKF#F;t|P8OD;%F5%#)~G7mY0t|u zm&~l@fBNmuYlpTz3Ka2%h6X6(b_8-s7u>@mBf{UW$rqjnzWaJl>{U-P-%mdzb2GDj z_qx!~(32DQ8haW0w&_~8#;k-F1)AyHPYadOgzxX)55r?Vvp#)?Lwk09J~=S~+Zm0R z_x%j)?lh%OY@!kp5^{1@01OS>ngF)Hiq}^Zf0XdZOYHBHuB7m;@EV#1pL!@xE@EQ8 zw%<=!ygF*2tT4=mGb~~Dy(j-tq~9s(m`}G#JagWq0Eh@Q)8~~#rlOQ)s+*Rqg^#%$+u-9oEj!O@hl6+*9G+3#*va;?@ zPfz(>O?tjiS0@p6b}#DI9aDj}uUG!$nJeeIS@4W+VZNWDlDs@|uCTJM7%|KCZG_jZ z;mO6jTN_({>XV}>rG!I(5D{v8mqJ29x{`Q`0mVao+9+>(#N{{y8(&RTZE0CVNcZP|Wm*EI z?Globqi02zr1iwal=eV?Zqv%d2)Z6>T3c_zZ!t47^H@(kjjx7l2YYgSd>jqQp4NToaC3ZcA5-qutvBlV8t+0vK79D#tj#JdD@)J8G0@$OPH_l* z?AI@`(2R!C^O3l_vSk%E8#DE_(0trZCg)IE*^?DXV#r^s%|ZgG^iZ{OptVgkq8jNGNACBS69m_b)97En9^R9?h?jz>gT>!>H@)2c2tX&o@4BtKa<@D{84 z@MUPje>4S)5BSt{jZ3Z9U#N4gfCu|CrB9Zr zv+q4`rVqeEB#pu+C5^;7JK4*O&BTdq5wzb$kd1lw?wv2u<*)1e8Y(K|Rd#8a0gLOL zIoM*bI4J3i?=;*6^_y&VC)ao!7MjP##(=z@|Ghr=lDvoWJ1UKhl;RM0P5ep#~;LEGYw~A3N*HxNjGEgN)FmI9DwIMI&JlxA}b?2Qj7Z;p3cm zW7fdFmN5JzW*S$y0;W@u! zIkFWI0Reg78cPp!UbEiRX}Qu-v+M4|xB5oXzcx3w*1n0t1%+z9y1GgkXix0s;4sg6 za$QK(j^Aql4H7OQHxYp#Y47l`OYU|bpVLbD^G1LFUq?ivjpc9Hu1W|+m2o9isU%hI zi0-=AWea^eSnZXTlG1PVCGmv)SVYFBK=yk4ncv#EWaQU`b%I59GG4N59eKOMcfOr* z%)P0?;wXR^6#;amvQpCzmyE%8mX?;#d{6N4;8mHMni7k+CSOI9hX4?O_ltsx%5zRy z@7v^g-F;=!8vYTEm6H=ECy&*0!;O(byV<(wZ{|vjM}sC-2E=@0IrQR~5nKxPrEn z61TzuJjpbQIHNoJ=f=roCLt*;D=kc{fa7j60brrE#Zpn^6X?bS25yU`N}^}CJ_*VWwI{`Lu_JAdle&J&^HT>?xvdyGhWwCZe z$6ymDD=VlTYgMzpN&GIBjGZ%e4o=IVAK{rFJa{1BwvCI8{WUlDvq5N7RB=Ipv#Vpa z-%#HWuj7)8+>u|)GGfFX>w9CBHbg@8e%DvPVQgpW_?|ogkUP}1IcT325+dW_!M8aA zHFBm?6eTMs2a{CLJ#+SV9uge4fx*GaO9>2rWR)rwK69RzcI1xyc;R`s5PUzhiK6H= zI97`vAloX;kmO!_y`}rmQ%@}1y}XL|v<9`Tf*EhL0&iO0CpRMJKQh6MSo2?H zgGT=EGBr+AwA6lS4<8W_KD9#RC7!c?-F7-$;d`*zOUP~+fa9&W_FoTdjW5jEiTVsc#Wu*z-PJdfoeZhmV4h@;nO_4;OEDN2C88PZ4Oo z$OzE~ls*NSv<++9X@}oxPCI|K^6!2l!Jutivj21|xCt}6saSJxV5pi;`lK;|i589{W-9Dsl> z{os}A^#V7-x!Y>q*RKhjUXcKxK|93?9|n-HCIVU*9T>(j<)(Lub6-jb!@gnRQYHbD9eR6*!4`(N4*Lub_Mtd8-m zYr0ue8%xT|pR22o*gg>i{J;KKqez#XoBM^j3WyXw_Sd(B)a2BxMtk(2Fg+5od?L1X zxIPF}b=HRJ7R6FkdvX8R?akQ~Mpjlhfn75{^<`vorK3ne$q*05$T9$UPr&XSm=~It zmGu&|jm*0skX&9|1g)X<6XceTc{!-7tA9KH^HnVeV04vJtKxKeO=mo_9q*VrAe!~{ zuV2%@a%#5veG|D1njA11z^V<|TARy-d%2%>H#H$r3~fe_DKl;?ko5qw138FG4-W%5 zBzeVwH#s+#j)a8dOd2F$PV?R+!H&`d^To9}O+CE`tQzvgXO%n1NIzA-&~6@7DC?DR-5PI;me7armJg*#Cp{{0XcfJ8ci(JzPqu}a zv9#OObnCLXZBJE;I|rG*G{1WX$=$eOZ!Sm2pdG!Dazm7i}G#gIR1< zHMQPkKBuDz^}xQ0{L!n^)wCV%nAcbg^z;@_DsMKXsEoKDWxNwo$ali@5w%W`t@V3L;^UE#?r_%@YinxCe`5PN+|705 z`X{?PiEw1Db|hY}xxwK;%3JJW{F^x@iQo`iePth?`iO{#PoFeZ9aW{wev|oKyumty z6&R=?B<%t4hJudnqj80CvjV-E<@V79;RTK&%WWZT4;f$dadvlgg9?n|Us6_PT&np` zqbCt^9s2oG)I024t=!SJh)_>UiNHp1N8Q>?)B^!boz%9D)& z(gGVp!`E29*q9g?ETQ88b_2?Hc5;#|;1=05UtX31R2rmTDU=9q(#wTYRE%IJ!1*8$ znd6)LlS@SsTbP;-Ie*QbO#b-sXr-G7QwcLPYm9p3_X{QUWIPQ1Cdw>M*} z#I@);?!x@r2&YwIU9kerzc8!FX=nx!uNu0WW4rsIjI6k%+%Cx7t>xaGoD{F?qyMBoeV;cgGzi@ z9v+S+8*`Ya^O)gmeZvq}a-O$m-hRxwGC7%86zkBtML$#_-m<29^D%cl{}uA^uZ&+( zcTb3duwpdcuiAb3@?}XQ9Lal8Myw~3IPiT$go3Q>yYzGlF}hV1jBqMvY!GC8lP*A+ zv7K$`UUpn(5%cxEy7D=X2zvAgos-b^N%B9qZx`R=`pQRAvc>-{>e}sN*W*JvF}YR^ zHPBCBBhKw)!IrqtD_=JnShIg09c{!$fNoytOI2A`6co%!j4{`VG(v#(d#OEEi|Iv2 z;RjIHiuEfzH!2G))-9lGzce*nGrFb4Hy+Qb&#lL8>ehB-HF`aDM0@R%&}}w4I_fvk ziF$RdsaoUrG&U}7#qW@jiKzeNsP`8ki!K;!slV`JmbA7SqkEPNsjUEP9$ zf{TXz`q!VIrV0CCiQ%*AdLR9Hs5f94Hw-5YaFK@~)U}z;_%sYm2Zud1?3~CnUQ$BB zP^^KWq0N!P$(eeuYF%4Z)q&yW{O+RBuBpwrHvzqALdAJ`6D3AXC-)X>T{cFbW5RZ# zRZ8tc)CFc)Xk87oOYXJHO4p;nz60~#B%yBu&PiNPo&W@Q+Z`1>g9P2CS2+~j~Lj<*#L`Y zXRovz;LjV)PXtt8i#e@y-MixC<>ZV7uj%>ozC|;1t=`Jxy}fidJ6G)Uj*pDYBnBWR zLz8?}W2weD$b6*(IyNZI0oQ1$+&9h%3g~2964|sgNvQrh~tyO==u3hV{fX^B%EXO z5=A{5Jwrosv0MP$aDc3>t$#-mrNzW>82)(uq7n`bRK#tJaUqKZDl)P(prJg>gU(6! z{COX^QZ2s-{rwbO39}a*!dI_eJ<O)$Zh}BBLRmWv_R~N|2h_`QJi2>Euudw`>6P)wR?;`*< zy*m5Set)@m7Lp9k=Bci_Mn^wX)F2k4`(0=j>0o459d? z)ZPU!Ljqo>8Ng!T3HP&RbvH~;*(U)6J0 zWNd!-El=H>rg`&?W#_=5p`nEZW6~(M)BWWn9$P{pqHBKzOt%w&y1@ntt5YMKe`Sm6 zQ+yN@z+99Eo0h28=E`)!it3iDF~SYN#NsPVc*$iIH(X$FX)@i2-{RB%RwyFwZEZzB z+SUysMwGxLKJ27_@b*Xn0DVb@TL7_leVnf( z2LRmrV*kJJevMs?3_l%P?#2a;{*3K)+Un;Wb#828aE56KgD)_X;+sZf56k0*%G z@-q;s0>AM6rLU-L*w>}SS#@If^;Gkl=g}X1c&lz)CQukGG_ zv_x|OObQ9CJE9k>KG)|qJhI$+N8o0?=SM);{dVNIwrUtd)xPXVB!u(r`}Z-o!kt2$ zsylb?07e2$#}97D*!T z;KL?QgMb5ahBAW>1Ho+-XVG3JL-1c|~vHGzS5f^MLO zmX;Pl5J*P=VynM@e^13{IYdWEnJJZT+txXWdULgF5=W3mOuxKrD6awR01=32N~r-6 zsO8|tYCM1bTwT4rqho;c6sH?6JEujWMc5_hjwUe%GDWl5H=q+J{-0MFk5#RGB~%*v`U&KDep9r$bRz7Od1%UJK(N zaj&5{Kt$p#$-Twl19*=*3|)n*@OB6CPoTMio>5fvV!OD@l*7ctBtJjj$hzDe!Drln>av+hLj?-1-QW(HCJ$RLr@U~-n@rT1pmj!rKQ`zNW1Bk>+B6fGqsptK3WEkvTom zf3gPB<)9Ayw^}_yG@=45+W(FgAizEU)Awr=(UgposLYT^Xk;qWvy@eQW?TRIO}Z%2 z0pQlnvx<%L;~lHnS+)O6JT)kN)30-PXgwymmxE)7iTGcWPA&ex)QLvy+Io6uP%;{y zT`zaWgG%`$4I&NXj>43ew)~Ncnur%ivHgJX|LCK%`gE(&fLVcU=r zACFHWcGJ-^IH?!~7|GdwbPjF+SOi}MG2qJ=sz7B&RY%~DYu?Wk6>VR>W+5jhU$p%V z3L_XB9i5$sh_}}T4-R)>?|Qv(1ujdV=OOp@AITbxX7S?fK|gyxc$bj*l0qretF5do zI=1~i4X^A3fVTHPu}c;9nkW~HZ4Xxp!N+;1Q)>Jc;DZ(8hQGhkG`Rw^ z0;dyaXoi_qx98O+ADrxt4$p&?h~OM#NfqEMG}$!K*wM~QRJ62|fdJFMRF_by0wYKI z*NXyO3b@hHt*tLVA|s2!;s=nHtC9)a48`Bx(G`HMWfq%QNCusNfI#5;@^WXtk5{1D zJw<8x-OO^V&qPk%m#kgAU>DPPylNlr-;N!je+B-yNcXFWfn3|cZ({kjGdcF?5GT?U&4e7@I z)#c@OnNIRRPsSrWEL>jq-OpggzJLE7$drNKWmbOvp$5z#YR&@L;JNk3Qwx;zP??+ z;Aco@h1NMo)>Z&8!N#g_lQf`V1EAg+&zke)i+%M}-*h^J%MwEmxL`o@N`Q>zJIR_%&#Ef+Zp3u9zf}FaTq8luf96^lSc-U$X0*M zU{`J$Y;pq6fRK>zq78B-L!+b8DC) z$z_lrS4CTU!XQf|;ODEa_HrX)njqL1fuPV!60p_7-^7(fHr}>97x}R52SPdl9B`fCbHKdOmwcC^8 zSjg5?S@de2tEs8!=+yd5x;}c8F!QY5X!IuMIgAmHNkBkI9tdymI-O`?YTOAGpGg7* zRDzxH+ST9?S&(;2%bR`>LJ@v?u84R8H=b_%&*|0IZEql$`)}2r%Mla9alQ+Pw+{vM z?Z}2vG>M+xr($Bat!{zo`ni5-d08QWf0+@Fn9tbM^f?v$>uqs@t97Z|Cs$9((GfnA zIBa}Rsjv)5W{KrJX*3d_yQ7G82U4Y?0QHy*Ds`(H%L)r^6r>dH-Qi14~sDiW%f(9J3i zQ<@L8si5LBCv)3O^zQxDtTQczw5-_LSii|?PYNn3X67nH5A>ePmoIvPMF#2#I4nLu zC1YCTD(z-T2?%6jmY~K6<7n_I#+YVKWszA=G#H^FoIH9QJn79!OGO0?G%HIZJ$_IH zG?~N{k*-&ot%bNvY=IR1R0L>J#WVH4l?eQMo9Q zSGcnvFK>V(ZxSdUDn9Ej@PplwH;HEKE)YrNf=DTx0AwH{u8@YJ+eH?rsoCgoU6=R{HSy@{P!Gf?QO@QoN z^DOO^F!-6TZy_e9q`-qsL%0s|TXY$$mhBn%aszq~ou4m3BJRxQ z5cQf-S5opN#C{_&B6E6^0oQ@TyV{jvVrK_L+1Tc#LL)to&Zh?66R@;O9ZFFsIMu%W zt2j_nQi2KClPbW-!0=}Qlry9+Ia$)J5@528ccEfnxVpJTy^G|7EF-iN5RU-Z)(O^Q zkn$6dlJ+b+a&mCW#B_CZJZ`_{kpWrdMUn2fy{cmW12Lv z?WP?yP_b03qhX zYCKG(D2Tst*WQ9l*?-DDYkLJT+v(})%#4hc$?lxlVo2&bBW*xQ2>k+V!6|Ji?`u9+ zz5ZwF?iX*dGUz&bdLYNf%sg$7bq!bpoP8>4Y8{V5%gnaDzkk!XeI_82w%U~%`{Bcr zmmRq9Mj#=Ig@%-wo0|)E(V;Bxs53CM<$pQoii*BTWqthk*S!5rJl*zC9_l!M$p|2t zYYD}d)M7GUs~-3%+S+bMVe>&??9rn~tx+U7epDz6-AOzUuKXAiv*6b+0eOaxznqtL zy^xsj@(aq*D4sX7s6K!G#rzn6c@{b}-p{mD)Kp=ip;%(DXwJ$Mfu^RWGBKb>m!;ZV zu52ZNp$r68=gO$sv^}QM8#DW6p+U7>{TmA@E##iy;#d4=P3098LPA2L1zMcYB!gJn z+uEQk_YYpYi~E7^iGTp?0GL~DUS5&bx9k`-;E3&Cmp&yVIWX`MW6*-u1S!910`!tax+?hhdT`H(db_u9#81b187Yo z7Vs>nsUf5&x7%rm3w^r{mMT3xBjaSXNzP3et?j?p8(ksB3nK4SyfBZ?2HsVvOQ3Rri<)|%hpTx0?DjEjvGS2~ANbb9*p780<`^_P9n z;$iOv1qI21Dr#Xt;+FDcq$9!RkwwC<3=HD91TgKtJ1p`qa5F=H@=LqWQCB~b9!HFc zjd_Us@RK}^q)L~c%2JNSRf>=Zn3d}TSy0zO-RMf>%7-TIcXdijEQ0X55>6ht33kWS zLVEQdhCamMIlDR8b=n94KXf8pEycIzV{>T@iX$Aonc<@2@p@Q}Q)hqh+pIM}Hg6pKizMdI_8-CK3WPE3}ZNAeoomb%Ik0j$jJaZi9fZmAja#08acO6~>j_ z7#8mv7zHvUkixoiDUr<0@30`@sJb7SBEY|_q1j+v?dbPXM`v-+^}-}6T5=;-8R zWq}%;`}J$Zdhg9$gP0BHS1>YkFQ(lPgM{PxGu6Cr+;C1FMpM$zNGW{)!}6#NQZth! zzTyDwM6oW_&j9I7{rK@2hsgQgxhB5?;$QY?6kl?4-H)fV%+1YXs8IFsOUA83GoZ*{ zy7%>NOW{gl-|3J06@f?9?mC8JPfRNt({2h@eFZz^Ed)q@O|5wG!PR47VPUSHP=A~Q z<)vqnucxQSXx>Pdg$L4wdNYl_Tm(TBXbPzu@S{fa8E>g1fB$Y#OcNHOq6)l$9+bi? z!sO(0!}%J?o_|095Zbn{OK4>5 zQ?s)M^77#r?K` zk`tr$j{ihnNx)Pb%o{DOg!%xX%lSm#z8g6sJIL(0^AO-EEHN0dfq^W$*=k4*uS3W` zBsBDQ%Wq)t+rUXyB9h<)Q=u3`NCqUQewPN{%ZcXZC6%5`(TM=p%`s7t_APK&pT zyV}4TJ=EW{F*Y99JWl3!`7>4RbTeqqp`E2jg;i% zW{DQKR;pkxsnxAQ!hXHN)XeOx;Mn7EEjl?lxwv=-tXY)w^S?U=b?*Js)Aiz%$l{tX zSyg+_)$9GGAq15Hn1HD?Rqw?ksVa}8CNIwf09;FpPe^DQ22%Qd*uxS~iRxE-Q^PWk zl^6+3gfz$~;Zef%#Q~<+ ztEuk}=89>hB_*$1W9KFW5%?Vp(J7k0E`7!j9vsAo&V&R!GxOHU%5f{1A54iszK=YR zE|i0lGb}t@7ldXpIvW1pZEd+w(NNMm<5`e{@0_2X+f9}9n-z6~y?L{gU|h7!gtbNx zN&DTo0?$b4!Y2bFQNsB?x_Wvr>;(EeP$dDF4{E$RV}uJe(NP0v2=rQos@7k>7AzOk zuYM3Fb%SjHx-AwSUQvF2Sj0Oa&rLeL{R_Z4tjYNJ__GyG`1NtHArt(%4rdocEC#*| z4Lz?tb$zFS169E>Z3+DDjkUJ);L$EWo~Vd0Y7{YDU0onO6cU&P3dy|DEEZrsnVGo) zLIGS9Lj@6x)7}Fb*|NO64j6@i4p8g5l~L>};Jnrc^BF-HB%xUQ$Hx%f6iDheVZ(ipQ;`Bttu`x zaArC>nRskm+yY1x7RS$aQlR+HFc7z{Yp|n%s*{}qbQ6kFk0D#)G!@_%cUFWsFN}ht zjnN&EXf>^OSgL;to6};Gk|viQBU6BExLVbYNzu$=4EmjyhbM`MgRZo6aEmd-8ew7U z-S>>ae|I*5zk7;7;6+pO)3p|8U$2|y`v&3t90tNPD@-xfhIF$Sceb_d_CBDeqZ9Nz z%mwota!!!6Vr0y3Yik4Gb+8IC$vzyQ0kAJNAG?Ael_KB<0ssC35$_W=)3x_IbvzL3 zR#Ow_|p?nAoR2Ym{Y8-{wt(1g>d@9Fj7)vGt-O1q` zj6sF|-I0kC@V78A<1A>-$l9uBR?ZULv`*~ zFe{(_Mv$%_jM@EA9k6#~a#nNbFA&o(wfb=j#Drvo{AZS4u6D=IpAMS1zfR@JPakkBcu zo%X`kmW_!Cr|01-?j%TPOZfTu0f@rJj(&rP{JXWas-XbbNM`2ZSg8pV3wVORTa%;P zjdSs~4-h{4{I_JIDImAAqr-dj3?@lHDN<4Chh2AGu$SH&O&(~b+2sz4^33wSP&f`A zp6lhr5$JLhfsRg23JUT&BHxwbhX#hu&X;Cks{!)ccie|44B4{a0O6MkpL18w6Fzx0xS{|w3qlP*57*rW1zuTslR5uK764O5@!1RI=Y|{!xRUJG zlF@0|^QtT`YYs}(AK=l0r~j2_bhCW7pZ`@kWm0$qab5AH@}9v#wP&i9>t$IflO1>O z-i7o)oCm8KxW#0AHjS;K(g6^;^{#4*{{NGR>*Kcdu^sD`)zvgUpOs%Ns40`pFxCg# z1*WMl>Oi+Ocp;Z*$`fnrdbl;p&*oTpVmA&~^-@faGO=ey zb=^yFo7UdHQ5yTs9%`i&^7L|6ecskW5^{6^mKZUHbamSP0e&x$&@w+OYwypQc|aAw zueTm6HJ>sO&%=l&!5$zWL7y|+rV^OwKZ27mG~^6JEQNK_X#Y@)(DqkXe6z4rkYPOq zlym9?!FzCyK$JLxns-J6Qq9|-Ajm>N1Rjuv^-LYG_}h=u)n-gv{@187>)2N|;#T|H zpfK*aK^zaHB9JfPKr6*iiLC)fg|!CS09fOHrCUl$c9o_GvG_!kmcj}7EP*x*W-Dww zZXAAdi43!Xy{Q5akH+}VA?Kby%YFR|FvDPG_Ci$^C_^<&R>Er(@;WXr{|v@7kXE_k zo=@zQbaWxzW(Q;x4)7LlAtC`VDsK=1!Ae+I7!s)LPoCU_JdKSXU!L%W1Y-Eb+RRfN z{7Z2R4pBU7;>EE7!wbSeQwMR>o*2@CRIU%RYtHMnxw+bW+P@fp+=*R;B9|#Hwf@qwVlLMo36f`uIp!LSxx3aM05N zHCQY^K0l42f@~gSCw6!3@xqq3=VzSj;bSU*bpf=TfbibU$4EST21(fqr#&)oXuCem z*N-KUhX5c#U1bIH;3k7yRMg`a)(F!oFgXfZxfSPVP)2Tx9G;G*ruS-Fy7VNr*d4|9 zcVJvPz!v+-zwCfRWCdAm4m3Mzf5J9E>*8?2}d9nw9r~l7S8X<+Vjf3L^5(k71 z@Xh11^Jhw(q+8BIOHF?FlqJ5!(%!89^lv5`0`1_6dLD0DnA-(o)wphH%UgE=hwV)h z*jZk7fmuC;B%TxzzlK4ikt-6!bXvMl<9{533_3o(YAA((Q+NSkva?5%qX62ti;4#h zSHh=H-l4=d{=t4NHdGn7h=;sm+j5u4F&glc`jQ zVWkSVvGDS`1L7sdFo$}jQ)z9)k#I9-i|V{H<1_#3EmRR$fkW4t+S*vEuV21=DJr^x zk75DkUK#fYJ{1CHdO*a5TS%}`3`&Oj}PC5#_ z_Pf`Qk^y4_GW{o5{(ABIzrk{CdU-eJ8^?m~K85L%DLO{R&I`8#n5+j#2JkoVeQ-`I z=&3rhF@WaQKD~muQzN5!$)d31t!ZiLNJyc=5@3sEMo0tbcjQfmCgrmKgD|Kcrbb~H z1U{PvBNa^Xd-vYKBpV2e@F^HI7ckq8j7}&K)j5cG2onLrdFoK$0Q3fzSK7_J}Pk zkU*h7da=;k-ra4ps3^H}4_%~tmvR*{u^yv4mzI_m9qj;_r!#4Pa$vUy@Tmf@(pPS`fn)2?%S%VX zq=ryzi}A;gaTI}}W0Dt~^VcRjU5n{cSG>MvCP?wk6)!FNxuUtT%jDi}s;*6_T2Kzz zP!v9AVa~8c{fO5{_u<1IJdMZYTA4M&-9?i0W}hA%oG-5Tq%fH%-P%w^3ARa znm4R^rydBcdfW&zZtRfcOiD^(_Yp&BZ*PZ*cH>Fn&M~1YjrimucVKJZ%zK?(T<+cZ z1({{wxI@E<>yUteF)?V~R~HApAXGxh`SI&63I%vQ5F7&q6?hk1X!5{2cke>YFUbV) zd|nR;J~ad8Bw={+aUgJPW(EcjrsdO>jZIA8=esB~BO?{HwFy%cG11Xo+}v2{=ny2= zJ*d7E6ofy^vYjYjHyMO|BEs!sT~=9Ydo~7v)DPemzj!fn{iz-LH)x1}allM!JfE1u z)&xrXJ|+gnRTsgtfG`m#JEI4|^ELMi&}F7Dqgpu$(6+_pX>fv@L=6jtI4DiwgPCBA zNjMCDwh^c&^yi?jiY_i(uB!tU3q|i^K6oCTJ*>R^Gt4;iu2g5IqvM&pAyhdy#O`0n z9!Ir7HjX`^3w#0?Pk_YHkDeY|_#h|P-kDMn+O@7WuxHPQq}KaNYHG2HIg9q+DM&Rp%x#<#ktW+M zP1v>MIo?{EnBb6*=xG?xvark)yXz6;PRbOpB(AQfLQsAU9bL0>*BRS{_tm5|1@ z8&+PR2K=;laCjFQ4vpOK+c?b5z{W>Ohfl9UxqqKj*!xq9@k?{_>yLZ*aaDu=A8&60 zPW9UM4J!>QAq|Ac++fI%c?wAq4N5X*F7qs7HYJ%tGA9W|88Xj=WG0b$$eei=;rp$< z@8|jM=Y5~|{l4SR$G+REWwq9SUH|Jk&);-bYTmnV@NjhLxJV4D8PM;!yE8xK z?C(8_B$qokZyr8++`y>Ggf$l}tM3?h$$IY3$;q=2iKeE~)6>sPPrE`nuSgaW62cR6 zjEZV?Zq9La=7a;6va+&BjKuwKEJz5kCvP6G6awl1CIynU-Q74H5khm$?avw-JKE#N z?U<%-+@Rvt0$!W^^yyc4E3o@R7I{b-s5KnQ$a)%u56Lm@yMAUT4k~6jKWZ2UwzpPG z$H$GIhtT)Ev|daf7>tu7vsz6jKS0kbTGl;UQoI5Cn9Wa6N9;;Kl+Anc4lypFoG)_S zXz%KZl#aW0>P4Jzr@*7^@+nfqC)jau_Yk&<(#&mI0n_mGbju_kXOowmyTx4wa3d~DKNTpm#wwqQV+f~Zje&d!#Ky1*`w2tFf6dXF>dN6nw9 zO8OQS+pGQVQH=se*Do8l*Q@m&GsR(hf!5PDagxHPGM~(*xA&p=@n6$J#XOcnF#8Jb zF|)O|-#TN)!O7_#7#N7Ha8c4|iuLqqLe^P;43lZW6ce7`3*yqctf3 zmd5aA(QV5O5iMgYXT6$1p<(yf8v4E`@Zz_`%&Ui_kyKUsXQ2)z@eVW7+v=tDIT?El zxxA$lW#!~%Iy2ctL?QzNl{GcRS%lth8y=Dd%8hsOizMO@t~bE@v$sE-q#${``!SI1 zm6a9knFCd~eyBLuDc)5mNX!|ni|K|r9Myn!iV?$&Vg0eMHFfigfB!FNtsppB3B10A ziAgtnWhz4sQo6ctK17=)c_-ditZS&7J~MPC_SUpket1X>GdufgjjzP-c6Ybst3`Ph zIwtXFZ;Bhet|y!Sx!mKHbS?Cq!H9vj%ZpYSRQ7U#^vE-L`RbLM=;R8vf!ARZfgJ#ycQ55ef^&Mp8ZoQi`Q$Bf7^5)&64(=ZJ)b#0lj_kJQN8RD89PPU6}+eMa(yNSe2IcyFUj^$HQkkQ;tTgy@XfXWQgL(~^p z-P+f$-xKM6kt{2I%*OP&FPd+)Fm25}3!^CvlA4V*b^1IH|7?b*rp2XRN3Gq~0`*by zsg$`jH)v*#RG(T%?+<<4XT7<;EIeu>;v_ViNiL+GYkH83Y$i`qSG#go+dkxG9e>b& zl0R!!&6@NeX;UnNbgOR5rFgsvIFNh9dz?e9YKKn~k5>}gELQ0+OLF_x{G4AsvEd-v zRP@~Cg6btI)Z^VWYMmw9I&UB`ALWeNcy3j-a1=ejABp7E&5c!5=XGmmhqgR7ifh*( za=h?T(b!nVYnCq^;VA~j#zK_`Y78?`!;$QgULD#j+0wVHo-gsMPr8PaYMFdy9SYoO zWqU@(IMmI52JEmkGcz&q0^eoSQeq3a%t9F#=PDT=tpwpfbjd4;TRtMF0-inFZ)ybE zE#iH|H*N*4(t@>(4Vx#wV%S~@-P2Xke}TslzJrzD@tqDtOYhNS5v^OU$xcb7J`+RJ zHpt={7|=Or=MS3473mpGO%{Ls+Le9!L81N3XBQ>`0eg?dowK2RU*x{5JFSDIhGa-P zcMI4p`ahaqG-zk1>j5d!j???Lyq&*x^D)!yZB zWD;ak2%FN46KOQA`~{l!GtIYEwR&5ilaR(aTUkPacfUN@&g=#0Nw)qxW!ro*-WX2o zFV^P;1h}-asLy_j|8}W}`|ZsGC>})Zr^+I0(9H|ak0~8?=%S;LCe%QJeATIwu0tF4 zW1L)E_R+IzC`%f%ZGX+hIrHEBsXNx@tdA z=5e2Tus z>3G8eQ4RXM;yvOVA33ftggS99D<~-b45AiYLfsG58zGMlXu{?E@V_WTKn+`4FN9{D zJ??IxQRwt>=>6)&saC;eauSlSbwIhCmR>ff|9UX_$=oPGLm}UKWWSL;J0D+bL+|vL z23j0>bE~VDNTxgThp^R4xczk0a?>hQAAqZSuLU_7Il23v;d#W3RJk9!L}F)fdlg9taiGoObbXT7F5A#*doL@|8$@d;rxV%Jsz@*G?i@ii;~?^-lgx_(%4=54(}3 zRk*G?s(pOocoE_IyuoQ26!kh4RlablTVP#*D{V>L)3^5{8(D=y6GLBs!gpfz$ujSGz3YR(wf^`z| zVR^q3cgORe%Q6MYvuKLl= zjf4KDZzi7f^7Hf8LQduP@0Ar_@hzdA`XF%YAcXLBb%Auk!QKXb1YQ65FKSxa5P6oS zi?8%~h0mTnAgXU-boMl>4+ZpVh0+ce*)R8dM++4z?{eUa!)29V6 z7FI?Qy{`|Ecme1Ey#t2p=lq)eV58FEx|$kBFWHNd;(8a^LTLL0PI^60K-G4Oa4k`iKRv`OWaGcEf1zkH!n?x3v`TXxpC5gpPOhzZh97LNb(f(4xXMDA zvFr2a&-m7wo83rif{rr|4Nnb^j(#a#gargg6ZXtI8(>&(tEfz!u~L=4tWfN<`Rs7j zXbd`1g7p8>CrX=joI_|qv^*umN>b{6k5x$)f8sdJ8W9y$*L&WQQfF18_(bNaO;I2r zSpfBYdE|x5mutv*zfm1$W8&o8d_TLfdV1bI`I@FCCkKb$I)CR`M#h%+s;iaN`f^`^ z80+`dnvPK(**~(J@1M7{U+C`3`z|+TTM85?^qdA?3^nGci_7M(^A>G`SU2T^ zqTFT5lADN!{qwWxzzplY-n%eO|E#QebSo!TMMZ@fgsq2hMWLR2^X6x)`_@GJr~Lef z?H@lNp92At9HZ3!a;+^b6UGmphmjvSatzod)sbUmAK3OHeF=^Ukr*vV8l0JOayttb ze!W@?$4Y?wV{T;t{^n!8%V5||-C)_}6=9=c{NB^!vi|)(eY>OD(|}ZLhUVsdg+|=7 zm71DV5z-|tzj>v{e`k&r8PPe<%uz!rWGhk(MadB3rAyTx)pKsEs^&sN>avy&zEr)g zU7#K67dWkxT8sg~#-4Y+opi{zTtkBB;I!|R0H|k>j+S0}KII2ecK|Qr)H}WTM&DS+ zakIzU+eii(9vi~>5}9{)YI@qv)=tqV3Rw}hv=9-Pfjj|( zW>gT6ACX_9c-X-~OZk`MhNDGqK`07D*Y!+$bKX{cU|=aOxBYL?O->E}S#O&(=RAAr z6rF^%V|TmRnc6cxmwkZ#zP)zpL{rD+g2#^iJT`gT0}_)qZgT?Z29w8*`JRVe843pz zS`!J0lD^&h3+8^M!U$C0Jj;bUb!ghNdPpyz>U(?p1C#qHr&88_uirb6C1BC1p?=eZ zx1!Rj1hGpJvpmp)jEdBsKhGC)pZBJ=vU@?Jtr)#B3uPger$&j3!`x5t^`{wcw?0fI8 zUf1Id$A%E|Dl2M)xVd@HZVkJuVL`j@pPq>9isW`M2f6~HTSQc};z#pQ;Z9+6EjZGa zrrVTnh2HAx>w|Y`wBF5*E32<>?k{yeWT=3nm%Dh;Rar|@MP>Ns&(A}97zWIZi(LnC zN7(<@{)gbuG|WV;`A~E+CnJL=&zZb>ikP?0d)3l*7>fwX3X(YJL`5MO`u=@Mbnd|( zPb>7Vka6QCg0mnZBJ#q`zn%yjp`OYm|L@u&ilX+#y4JNgtM@;?LE8Zhi>RVQW%bsliOm*_+VLSB5;4iXILe`$iOl^QdwvdTO>l<@eg! zx75V)ux{@!!Oa`1eNr;C1;NBiX7!DFwI98QT;E+LdW2So*jCaIEX>xk3vdiR*>mt9 z%h;uRH=7d~b$1cHj=LZ;$*ye^#E-sdE`}%T7{TsHB+2nl4<%2COa7;k`d3%=ACEw% z`QNo$|1@BdBE3cJA<43jMF{cCdv#ae8iMKYdY*!gLFtRC%{2a&o4} zhu3gZ;PdP|%-+%2x!fszLznX1-~Hr-mIYl5os7d{l&I5BBsW@;v2(MO0)LX$QV*fBf$>lgzA_fp8UG}5llMVeF3pR$PUXqxB*zxPDC zD&r1^*bZfuL(XS~k%1+3(o&+pInNV`(Q}^7)g#15_CJ=6qwtZX3_`vOr2HRKQk?%( z&cAGbIXtXCWqkK;WOitF&dU`zZm>FK;;uoH_44_1sozx4*do^vbqdl0@J?==dVzEi z^d1Kls63H$_s@&~JO9p1!&qdyNXOwuhY*pSThIdV3k)tt_OpUP{QmwX-hv`qtjNO$ zD<3)`4IqFiak)B%2bT`&Dp!gKi$p|4?A^T^G{kiYBP0r354ui2Lw~a^(TQ{ZP3wfZ zfJMu-AL*Id@GpJ&_J=?$UNwC1&P1r*?i2?{r9B%f8z)r6n+410Cb%^6q)t-Evrytg zw;1D1V9&i1BRdnwA93$ZQc5m-ULR7s3`|vD8PtW9f1oB@cTMTPjTs*Dz)gnTk4w1Z zWdzN`V)|8o0eYg(Zsektb5hr>z;6TrKY$A(=A-7X1Qm{XSm#obQxvaWg{=de?a)vK z2c59f@O((MH`$5(f3Kmnrms!4jtXEGpPgTp!L|IJYxYI`#mcoxiE|8~Q+HTuIIcx2% zf8DAD4G?+{Xd<5a`Avlf_3V&zm%K*EKeray>+NAlvN|gO0n;F$WMl>hRtzeAd9|c5 zOdy#keTK8YPok|s0|My@E*}u50!odlaF5x31%%3)n}7MhxuhZglR0Qj9|$pGb-pM(3K-pnV{~qQzO%cVippI9kS{YM;{_H$l%0JZ%CE&`6TMt0l<4TI<)*f8Y&qY! ze7dIgnS!Z1s=bgJEYd$J=T=H5BohqWwVYC8OjGNAuWmz8VnNyy{^Et~iAxtr?%#iK zkM)A7SH<8~<`=oM#j4QlAm>+(!JjSoDR2kLecMM4A6~5EE_J!BI?Zce4saM>#X}c( zUx{Ssk}0!46n#jEcP0JMGGQwc)2RCi`AtAl&8|*^R)M(;ht$+qSL?(Qs0k3%c==Z2 zEHosnY;3w}iOR7MQs*OH9sEOk`)yP9s0L)fCA1h5zEN=}TQrjhOh(&VtNUr(7UDO{ zs=8+Ym6h2IGN={z#3%_03I+xQAST+x*tny>V3IWC_^zEEdIzr{)o*%in|dBh&HD#8;RR|x&(ick@>FjZo{}2Z$E9~Epo)&Tcn8ryq4$sO zy>AoViXL3hY4VWnJ$S^*=%oxr{xEIas*)! z`>VY*$B8OgE3Jg+=)J4$h|U;MymM6JF=~wN8|6KBZd{p|`Y!!irVtr9J;}@u2h^$+ zg-=RGj-Ftv(A?QeO}RCkdNROmo}YG&e)Jw4hqo@ zcnr9Sm+pc@w9oKE>iba*H`QgLV7|G?#rOG#B{nOD=63DeVX}BlTsx%!;`F@2Lga6k zKwU0c>ee$x|Fn8&p70XIv?DsSQ+>aCjUJX}TyF&1bdx*b%PYT4Y1WzAttqw4AF1ku zyTE+Aa^K;mFR=+X-isd}p|ISw^OaN?_&I`79Ee&7yE52LcqHO3kjX_EWm_y_QH(ak zUW&W6Q*aOB28$kUByJn2jbtkLBxk_`t`z9>@Zr_g@X?t;iEDeD&({t*>VOj(pN;!R z`oKh38h z4P--+L*7qk?|B&qy6ny%DS#yNi;IP5*gT{L#>Tw&2(RTv1XBjTy!~?LksXBk=-SrW z5P8O+uHCYocvky;$9wL>ZqClmErV}}?@W2{KE3$u9J&6t2y`P%Oww9fTM(OpXOUM{ zMnlRXRFnJDjT%kfUUE8cNk=It!jX6s7}%t;{9fDgMFpU63wJ-4$JYY@XQ6KmJ3Aki z*|aa_@IHW8LPm{rOhMrxAz+C11oN$#xp~!-96o&bL-x&G5}Q}@Uof3!RJ*0wcGv`t z?P`HU#aEvst+!EY9+GCE+!x3&P~Bo{YqzI|xQ1yM`y!By>bg$6rT{bCyyV4sJBv|n_oGe zB-U70M{o~<4k%|VpP8BA)+#y|V|Mq(-C%5J8L^R(1+LvIkl8@;aqnTQxbrbOI>q=F z{_p4EU9+EFKkwBH{*a3Mu7;|r(SrxIr)823ZrzMxAHb(WnMUbz2bf0n-hCQNf4LablCrOmm}L=zI;i-$j!}-c%^T_-=OpzVh@0^JGFJ- zj_Rg*|4tLsf&w4<&pnFE;Vy9je7u*6OG}DGOv%@_RiNgLHTT1{_=CvkHIP=i_=)`a#0sb-&^ZmZC)oq%BRi)mj}{^RS7Cv$(7 z#%}heP|Nq{xlKC(Qwa|bKmFh)3O%UFguIaxG}aU~3oUp?v#014wBk_pLDdht1jbrj z#D#iJBZn#jVj|H-hn}Mah&JYc?$jpE=!^Do0!pqd{#+I%5XKeU#Zm{j zgzbTG6&ZiXRm=MH>A~tzX0II6z8k9QVRoXEU|5v`lmO4X@)gU!L<@ulxh2AOzrKTS zq7ve!#()|CZ_?ury4ryJLVJ(!#niv_Twg{b)&U*+@s4ZVRAJGNUmeIWe4mn}uA-u^ zXL8t?sof@s{kA7ADEbwsf_jKgT;*(l+#H|}Oz%dW3kJ^ivlj?)vBvjZSH9jt%K-Tk z2SHfwIy@JYTAPmT3%8)x^Y;;_Z|~__4ev3d53J7YG|eldqbo6{$Y+KR9=f}XE|v3M z&tU~H+Rhwnnlhbs*>nLx-X%!AGe|Bz^yP~O5AItV4UYEpI*Ur%vuMlXK$378#waeD z71J23sFyF>@xI0yqJGGb%aY_57Q#0HHrbv=e#es!8|RD6C@3h_CX!-B=pjW^P*6f( zA^y>tC|>wF$lMcr69}oc_Uz=?6&A{*t5Jp!LLg4z102$sp)Z1m<*5P(?nn}wMA!HV zruCon`Uee%tw->r@S8WWiMML>tt-0scwK`u4!hD&W97Y#eY>PxUBz>U{pf^m0R2Qh z4iX7|Gzrcq_CP8X6B3fyY{Qs4(p7L*DT+NvK000R5~Lg%2a(Pn`HRN*uFST;;_Y_M zzSDMgwj1sRzmgy9c77bN!OfzLILVBhoEb-XwTr^gnXs@7<2VD|p`K%YKQ|nyAm%M^ zF2Y#|wNO>jCM*uo-vlrpMeIeBJ}+e8pA9pWV?=g4@rBPMAv9Oi08ZIe&3?-kEL-50 zSvO+<$Bd2|;((fpkB-&=5N*VzqR!6A*>L;=tQk;-x&NwVVR5FWn86BnqF-p~J)^TcNN>M)$*PP!vazH1GKYI^LIvbz#Xe?FC zt`S7%!9q>-kV}NdHA{1xl###RYRjeiH|!M4nj?^g_F;&I6&Vk;-$mbJSRqZ&F4^oC z7cZ9aCSM+WX@gJ$M6+VC=w#eM368yYjx=BcsFzasxk1?}pIi%x4Z^4$*l+OQO64Y- zV)#i65`&EaR?tQzfhge6i2Z?Q$)`5}R$&}RuJ*nhtZFxJR_MD$h9V*S`ODzZfI8PW zkGq9scVSGzt(Yi?j*|HNF1km35&shEj0+TFw3Ldz3T7mskjH3`%a z`AtZy9#1v&MqSy0d^VX&Q4`>iNaEgBvIGpH^2H2G;O*llF3^T!vBh8ng@vG=BsUsdzb9aBX%^U%t z;jlQ%8&MzYwtiXa+9Ub3DJ~WrnMY64zee`ATdp8(r5AEu1eYNP0n;HM@w#B`ws{?uS+%`C#r$O=EQmHBP+Rv%aP`-kQMz8So5+HDE>BGz+Ft zQH0CUlik`@Wf$-pK2JJ>P-VS)*vfEgfG55ix#`r~w|;Pv5Q^2)<9E>3ex_%i*@AEG zL#`&nPvJOF&BJtHsGa_{G-k`jcNMW-xwS@Zcd9ZPl^WBui?=M+lv(IST%OkGb7|*9 zi%Rr;|DFX-XT+*Dg#D@^k6Mb0qA8dQ2Z{+@amIxv;RfQ(#wfq~s=nSgdQB4BgmVpG+Gp ztbix%W5WA{j|r|T?ndxh`ciZiJwza4UZd>^8$O$m2)3D-SaAo%lN3souf7(Cq=;y> zHT~e`=SQwz_L%2TNuYJ!sI^d!yJhUM@a6}70nUfGYQgwhT)8>bk72}Wkl)^4gkl^v`rKm(CbM{k<)fnI?$R+t9^5S04xj;1jy`0y=;Mc@2gTC57Y(29Z?t=%3 zTqXnpDQHCPImQppW%tY)t~XdzZSFaf4#4+Mvl%^6*`^ZmZW;^SBbT=Jml2n5 z?$LQsp?efxY(L50=x_5uV%}>TZ{o%8un>ARQtBeA%N4rr_^rL=6D8U8nto_}G?Vw>x?n&;Bz7>d^a zsBUmw@&maU*}u;`2K8et=Ol+d1&v23*V=Lut@}#9O8+NzRyGd+uS71L z*OeUa`f`D0pDYhvP`I`cq0%GJux zIPVP7dGMgCx!F>5QUKuO%V^Z|tiEB!Cim6V?)Da09qxwsJkO|4rC&#Hu`(Sw%^ondD zP{={_3?)t`tgA~0(Yj;SN?a zO9QAdCM@QmUikb*S|kR5A|gO;tiMxH*0yMx5$`zt<#gb`Fj!b#b8`g&K28nnb3|Lo z7Ggz$<`-umc45LsY;J`5T&U3jq*_JQ6NZ1oipkxPf%aHh*!~aoW9gc@rn_Y%%qQ|LxtG|nxq61NecK&D{N3MnDF z&kZr6VM*2kcPo#1OcF! zMP6O~SU67p`i$_3>S`kk3uyBFV#>dKkwd10JPX&I^hb(plI|;XnVv&OJZ@6ckueSr z4aKL%&HViJSH&PHDe0Gh6Ta0$?8*_Q4<1Cuh6RTH&g9sRRJeMzt)-3U)jh?Z%$#?# zo+`4z#X_5zk8;l^Q1&M?#tIyzIyzKP29k!riV%@IHjKz$xx8Ar%R}l;v6EfL?7jJY z^Bu1Wx35 zsTx##+HIvG$m3p_M?fbWX-!*hPbi#_u?2P`u*fdk4#;hE;3w-(&{KBgK>nU{;cqp= z+&Q4FckWON9V5_K=d;hd2GP+A13Q&|>fh0k^Elz6tZXF=UFm_8!Ian-NcRxmjCmGz z6e)_P0<;;2ur3zfDF5z^mH3ojzqPRqu|9x6MFoX70r5;;DBZd`%)(D_FgvV697@QJ zLA!<)zdQ54BC{JWuwVM*)tx+jnxG8m)KDpFoCf^K?hL` zzaU>y>jdoORk|(Pk5O`-qwWw`jr$kSxde?8?yCF8?~BB|ii})`S_dF2hZSwg!7DyT z6OsK0w*(aANd2zxYc|e8>FfuKF{&Ym##GZZtDc=;a$;Yh>t}K3~JdH zV}3d^stie8(ANmd1et=Nlr-Xo{Qhzkw!5zYHP5(%?_}evD?ak>j6?o%v}pYR+W-ma zu;f9_iNJb%J{te_T4RIk3=|J+`}k?5e?IoT$`A#eHBVjb&lwzKKP?yvci z_NRx=S9p&TIMFg%Eei&e!881FUgCTA+f_5pDAJ7+4!~br>Fr_H$pkKMW%t?heShT8 zhX7((NNT|dXH-w@`) z>3!tn+mmUf!66~@YfWGDanc@US0p43Lf-W-*0#aI1mds@)Fm1Yts!Y81&Iam-Kg9~ zMn?eJFcHL6$n4bVYRkHCHXjyG4A6+pbof=~`2_9LxaD=rN3%6MFl0{9qO&J<*SXsJ z%C~NXB6Bm4p!kU^^-f*UhN5EWUIoDw#2{fSv~2xAv=}3c5)*5`e(fo7MbMWPHcjsa z> zV-$^vx36AlHGeq?`{CGRE_{kgy-Y~IuIaq27x@J&N`^RaI_gU&(5ZP*B&U3&P2-gi z6{Tf-`?qKq15LQObF;GEp1FSO#jQV^lACWQJl+u_l7OgTJdNG1w|BrYFV&h;>ywax zKn{H4y<1S_fOLZnwf0+b*4rc96C)!>si}=|&z9yIwCjGQr$1%_OU4UxBnd>nz(TIWWiWz~<5gOf-UI>Vku=*@JrF=n) zQAmiIkubUgl?$HTcI}6d%bKP0>J@q8u`#%eKoXm~EH7w(Ltj%%&Xag2;}k@8B>% z&gpdH2!b@1B<>$IHSXv{D1+^a9w6%%NqngR(8179Qtl)>w?>B9d2vE=K{gpkwX(Ie zJl8Cko{{q&+)&tSbrX2l3PcKeHh+P;4IeonYTwb-5kP<53F&TxW_@vyHbtnt*xw#!>+EV#vZm!kBau zydOu7QekL42TBIH_Y(&rbR$1HG#Uu-4zsnn6P47p8bwxozRBL^4c0T*20222(xGShTb=wreh! zO#}g_KQ+(i`uZu{MzGsg;U+nv83r2>g zc17}B3vSIQ9Bdgn>GkK&X5-eZsok=>$JYN=^%_IQm}Om63rPwjVv4QNiF}$y(F;OA zF>GvX>KRZ|LWH(^*RE4Xp25C36Qj`=2I_ABE_S=_cDzH$Gp-cOFg=9f z+mU=mWInQx1wsp=RcOwMSA#AO1Uq=?*_17_X^T5Q!T&orIKZm;!SQ0%#Q`GEDWd80 z%-q9-D4yfAw0h-HTX#&7!lEl7D4-jg5EyEXsY5<7JOcN6B7~-xJ*1Eg8x|5Wng3Y( zh1=kt{>v(yjO8$7G4f+inV#r^Pz3-&_jsxWv=eX5A%b7{U9be$+t{u>p=Y=_ct*z0$zT4~hTQ3%ezF1bbF9K*j zj3ff3<4~X9yY~(XkOa-kD2SjqhB*x}H!1swuyv1&oVRILG-WG7o%)Z8RkZeR6|1Ah zMa=2T%Hj`Ndw&6B49+75#rCnCqC!GbJsGVo0l(k1#EV3Z2q5*RzNx9d(ONa@O1);$ zXriIzqYL(r>`AFk1eiTPJ*;$isrIfaS!;@)jH)%Hqe8->$Pk$)+gfQ@>-|#*4P$?y z(Jc0Uk~pZdU%q^?XZP+yK9zu{5Qv3d6(K!f-LY(4Z=X3H;d*ET+XzCjG&MEsmTfmO zwRRi-7_x2awcWUwwxF4ilv16~9P}c%zM)~H#5D-&(&&V-iy|APnVq?rA;BTw2Y_vT zPfE@NE>8)GJs=@0Ji5Kd4jrl~3auIP>-oWY`X5Y@H$y4u%^PW0opSBI#+M-_K#+&0 zM!pGH39NME9}NH?L;0kC zdm^UfL*s)#ghBK^y|-i;{6~X$g-;VU%;rIv=t31}V;(;IJuqF4nup`qB$nlg7_V** zG~w71kVjLkb8caA@g`SdM@JW_iU+drRFMRQiK@_;Y&dQ#4c@jbs$E0h<8=*R7!H^6 zf368;k|DvO7u!a9YFanNq#&Cx&hvP=fX@)LYw79hANkvvm$c*?9Op5J;Y*^1R{y5^ zY+XEzEFBF@6o{*q_Hhpi3(L*T1(H=7X@6c^+;uE9h9s^*U4ZK7QD`-+$BJX@y1zC* zO_p80`}63bL!emy()nE$w(rBTg_$d5Zii*#42#gCI9S7LjKGO-5Fz=~Lf-^k_UXaBzi12lDkmgHNBB^&dLY5RnnN z2>z!)lvqmVBYB_!(Ew2y`EG~}#@Rb2GYg!G=!hU=d`_ox(j$DI5RuBx=J=L#Dg^n$ zzgyCX{zlIJSC9M;+DgLDdX|T|R(HY7q@a?3AU*rgvbs7GXi6N&SJSNLftx?s^F(>u zZNFQyvh^n$NA|M5KSHttc_aU~D&W{;QTLbKWOEI|Qn}*a9GVRd`VGUTqbs=t_p}IV zVW5)ezDOAVVbF`SSK#DAv1R+A9Vru#>tSN%@r{uZG~~Y~CoW9|LcU@e#w#k?-Pec^ zN1fl#M#Pj@&YUTDSZ7G#x8)$%(NwjVI26Tj@E|EFKX76|f zx9$I5)w~WD&;PcR-{_9?@`BItsp}!YirCky<;Eb7jz4o91v>me9rL;yw{`Y-A{@{U zu@GJqzE#lV5`rcjhMxKR!@0kTjgT(>T~f*_vMu5-1t?vMIftQD&~WM{*;`uXJ$KpB zt#su|=BF%a5;Sxw7u81Y)boJgNFKTs5)ur+($>xv%@)GxEFYCS5Y5oTF=PS(Cd%YJ z>wBV0fjsO9~Jbr2YUSm&#+#PWxJgkTk-j&wKJ3JrSIGNVpT zO6sDrBCl}wj2H(UBjj?xGQnfu7yPshF>7JkZfXFdaWk8^s~75xks&Z7z#z}%_b0Fy zfV^rHL)O+DO~)`dl0H;i1QvZbw0a`)a3tqNUHDH19&|`!WeiSU!Y5zgUyL}jhl1Q;3JJRXb_l!! zsgL{rC5IX%9i0Z|9?qo>)=%(t6sJeztC?%fczTnwu&@$Bsc-S@Bqjzo1#A>QfY36O zh8R|e>JZMGnZClP@E6q1Oe+|KHQdMx7Z>&*=MBfPkujL>08Hf<6e!(_x~rnGgc@wi zZ3_@ijEIrN0Y#=DCT37u-@+9qVr( z?>w~79odh7<3Nj#==|VunkgK_UQ8wYC_df4}lLGBLwqZNxH|XMkt)tXOFIU*Q z3qK11>`5=?=cq{-|Kg0|V(8<_kr2yjmyB{tj3K_&-@# z3-GoW5f;QpClJ4Q%fYkSfiGNZq)^62Q6gUnsX2p)?FujYskWAz&L zH!4A@a`-Sxf*Y~PjfRCyDH0Nry!`x&Gl73NY{$?2_+D?DSfl7FzBwV%nlWOgsYZY>OLX%y zf_QHEJZn=W&xd#(q4;nwRF-0Vq0RSq*L}tgt8!>#q{e=Oqa)YjFMaG!cLVd+v)=zd z=mI)S4|6b#D{Ca+V$%Vi7xtxw>4uC!xX5f$;HW_;Y|rRmU|W$mf^PUdcn;7E?YG;D zm=lbCHWs;W_vt?&#C-p)snnIE4-6DOhA85cj|m^&eE2yw`2&8{zLLz=UT25*3M$~Z zcY0Vdt;ho1Kvm#Y;)bmbt@(V6{n!jy(J>qt<^dxMS}l1tKSYnkQ!nt;7GCMIij?zw`0`Ra*V`pZ*&){|}*{^YmLo zAQifxYnSkZvPX|R843u`+_RSiqfiLO9KwJ7)871B{6-l$d4^;}MaAdRI)!=dY4TTi z?zw>_*C1Ok?*1RIx;GLcwf&a-fX?lmet<0R~$sl3Qr7v0i zCW=sWgBFHc0jpj3rhfQSgdN1k$K#xi0JvBa#;u)`^Qj$nr>t~HiCIHx-0A-4;TA$Z z1K|E+$ByXM;LYt&F3Uk}^YhowQ|hB7sC=ftl3}FN$*YTfmjZ|Cg<}^Znp_$mHvEp}<8vlnosmp0UAjDx z|JCMGh5mj1F6uU(8r2ZrE6v$Vv1 zI7>qgQYIKcx6|Vs{-*IOEy~-jzow?d%%_C#lE-{6o}@sj3b(xg!T_KK*R6aC6qk}@ z7kX!CL*cX<9+pkG5i9Nrg*L^GLliI$R#sP;+`r$D9&v#w2yO$o01*MWZyPCuh4vqj ztAboEJN60quONHgPeO7>P5r3E85Rl>r1@UadWO?#STa1#rEvvkRO*|M712 zGg&4mJ*a7Denyd!A8@d;J1%HW7on(?VSN$w1W=Jd*LI6L@9he^#eJ!srbVv?S$qS0gv4!CoBQ`Eef}BHCTiMo4)Zg9S6m_; zGoOb*4usiSEMB&)4SRd>>iwVZQJC)P#iY9RTbegFd4ekRu9A7TZYl!-ha?a&5oF%j z3l z3q$aW;13_(RT`o8bFjCENHd2&7o)46sYBAc`E-zZjqt~mOkGgB#6WD}jvIch%u zyX*;68i)kIz0Hn~BXSuyuy1dbK5x=C@8+yuDPbZ9;8l!}fwBcO6z{fg z#o&MmPlTd9RaBMkU@JVK4TgLXiik}IFMWiH3ZAp+j*^P{9@2_)2`vghs!_*7R|@su zmu1?RDX4Rhj?)7S5bk-mctaO+DAVV*MblJhTs6TU);le$3!?y zO-!Qr?+5qamUQv(^d>W3?6#j8=RwVf0DYy~?4IS#Ep792a~)8;)g^}k#!?B{ce7cUwh^EKAB3}e6%19^{n&qha5pfH`Ny(xH027V?U z_db_{2mSrEX!C7u+`Lg-R0P!U@>@51*c^i(zl8vNEta-e07_7|k;JtZ{wp(MIJMV* z2mYuj&CH}LN~5Nxak-S%&ffk~ie+G1mxYx19t$t*CkUfvVQ0N0cah0UrTSg!oqQ%9 z#(6Y-KwI{b(U*}c156aNox28MIE)EobV4TuHB#f_E841-AvcPNiMe|?o3QILoWyt! zyx4w*qqlG0dgUu5C}&4Hr57tP+T7K?9>+`xlfv)K)qX+Ko-*;TS_QWEk=eF6dUf_= z{VVZ}Nx`Zl(f?~ct!0S%jA#0nq#gwh#K zP8>>vXj$p6jqOUVMIu|JDEyq9M5Iq)qzFcVTvV%S|B~}AorL>>YtecO^CgsvI9qyq zd*%f&*%5cCNS6qHK`aZvJv%cS@ixcP1l%xH0ggtoU-^QTX)Cg3tQT2r_!dEPF%f9> zhzPa02punqs0L&nbe6hHN@#if$N}daG0EG;lZ=pwW2JYHe(QA&8-<1`U7F^h!5_-| zs1M;{Q_3-gd}Z;IWug3i%Eje~#7>X7fh|u$Zr<=P#8E85ry~MChgq>Rmr0%!5+Xz- zqBp@1p(DJHr4u0?fg&AyY^{9VpV3WPt(|g}H&PS5o;*1waYjW|wc6nZFwdbbgQ@~8;^&HrL((WxL~~|=JJ85WRyzwlR>bW%WVcXm z_p-t;6D!Qr%a{?W>vp*-rO(pbpv)ifuIW;9SY0E=u3iVoG;X%mgO zRi%4+CLvCocD}R6O3mCR#eeLbJ^-8dbjdUC!s^GqR4_y|W6-pwrauKt_|wou!Lx)g z9kDVu9J6t;+m11RqAoU$UX98%?|i15d4~goQM{UAlfkq&tZ4Ta$D^M!Q{HNC|q4jL}ez>#ESy*%PPFq1=?P?QP@3BiHh(?iFY_1)lfgrXeD zaT;VAtTnqOx&~Um2o0Uzclq??v4qC=r{9Y)dDBt?&JePlYi@OqO%Awq3n|5`mf8!G z!EjO|>NUGshbKbTZTZ)&&Jf>2e16>pmwz z0f3;Bt8v$GM1u=V4*1%gg@0z9<%0DM-*#e5u1;jzY(A-$1-~K2Edk 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 literal 29837 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 Hb;$n$<=y_5 diff --git a/doc/salome/gui/images/pref_salome_plot2dviewer.png b/doc/salome/gui/images/pref_salome_plot2dviewer.png index 339dbf95012b70579fe3293b43f7af6bfdf58641..b75a840691dcff86ac3435dfaf40f263136cc374 100644 GIT binary patch literal 58913 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 literal 57572 zcmZ5|2RN2(`1f5TNyti>8L7-{va(0Wmc94P-XbI+3E9~zdlN#)-g_n4Gkg0^@B9A$ z-*Pxhk+o-ElCLx1q4CqMUbm%=vU#HYicod@E?l3 zkfahiI{L({+%Nd_u7jwWgQAVGgR|Z%BgDko#>$An-r$vyk+r?4jl(8NJwJj_Ad(`_ zlw9K1rkpkLBxjJVF{P_F_;7d#aR@|kZYx=;;Sl^4kryna;IMqSFW#g5U6^nF#n&$; z&#uYeu1S3Og)-~ywGXmaQPCe!<9z(){ndsszz641KmUqXt*$bBoxS<9C!1Z8LSOq`n>V<;AtW=z)IL|Q`O)&?%^9&cTx(dldS`9g zFIWu)izCJ6_0CM68uW|ahrFkIOoz{SW_OUgu8Ycp{oX3jf-fy3B!q-lY-c*&3srFGc1qOYE}uCFSv{eil$C99 z-+y0RlFH5=WdAB>IIrepOYe5I=_vEg$pOmn*Qyft1A|f#Rn@Yb$AdqpQ%XNEOi0vw zp*?jDCE@B7p$tFWk?UI-axN~ROWzal`no>6j;Kcn-Df7E^A{@0SYSlHH~4J?6YfQq zH_hE>`$IaTTkteajru%Ujv)Dknv$lWzP^IS$(WqFz_C{u>3hM&*G22L4E{=Hi#z_q6TsulJlS z5iRXp#)BdUGeI9KC#UrK`aHH-l`I>b@ut9%{WVt-9GtKQir_og5|S}f^%vojllMx6 z6eC=EDI!|Kq!C0hW0#S^Xm$0%{bao@;^j?3O>rG*>W}+qv-Qj3N7mIwJ5knC)knui z96CxG8g$_j??XaXS60&eXYA@9$i`P%jN~WsxqFo`oR3iUy6Rd!o%E(ovnukMI>w`w zMUbC{#bsrC!&VyZ2ODS2WxjW=9h7g>>NZ@h+HP!YOnB;)k)Hnd$m6Md4TDDc?oywy z6CE{f+vw=%(2!$WKTT|GZ1JkGq2cocmc5}>RdaLm{ziE!@uS1TN=&=HzCN=NFVEVR z7BR-K+`M!xMGY#3)ArQe@iL2pjp-Ar-(jIkzc{B%P2x-Z{r#WW`&m!b(Wp)r$&VL$ z`Q_!Uf67+mNh|B_Eh@5llye~?Rd45+4vT?eC1p$WgpgLg0Y#azn6`>L$)zze}jSB^Ek4;o*~xu@WYal^hrz4 zA08goFH*Y~(qdd!Nm;Djo(mthB7GwL0t;21cVUGd*F4)q7$D@oUJk$kKTE zQYMDQsQ1gWVmb~Ej_NSSnKJiiKR>@xTb&Tr4x3skE z-=pU7%TLXlTUz3B@3y=b@?c_(iEP41I(lzqitgb<3H9wBfs3{As$gTm4%Y}O)v>0g zrna%=-elouMy;y|I{H@C1Qq~#)}Fan!g zFV4?4v}&fNrXnID(ig8GUv!{2prMWAYwhgsi%Cz{x*yCoUGI@hR99D@s&Q7WR@E6C z9DLLC=n&o7)bu+A(e8&srNQ!p@4vP=+G1uo%@ z52f2r4#<-=En}V=i-?G{>|nkY)HO8Rov^8w*^ix6P?``5O1&BBLh~1Hz5B%r<9mGR zGnI8>HRK+OFJ-=F-5)HpC3<0C6l*b&H(VX}F4?SLgV5M5mY3b*HQKVUq9Q|T_3dD* zuX8xD6))6&KBk+C=UwJDe$L5|*VF%Z#%uNE%QpAZ%0DYZ*jKKUGwfXn77f7Od^Ouh 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 W%UJ!$Q%(GXyzGUuZ)L9i@xK7^l5e&E diff --git a/doc/salome/gui/input/plot2d_viewer.doc b/doc/salome/gui/input/plot2d_viewer.doc index 11640c348..b5072eb85 100644 --- a/doc/salome/gui/input/plot2d_viewer.doc +++ b/doc/salome/gui/input/plot2d_viewer.doc @@ -138,16 +138,28 @@ The options are as follows: - Curve type you can select from \em Points, \em Lines or \em Spline. -- Show legend here you can define the position of the +- Marker size - size of the points (markers) forming curve lines. + +- Background color of the XY plot. + +- Selection color - this submenu allows to select the color of selected object in the viewer. + +- Legend allows specifying the properties of the legend. + + - Show legend - this options specifies if it's necessary to show legend by default. + + - Legend Position here you can define the position of the description table on the XY plot (to the \em Left, to the \em Right, on \em Top or on \em Bottom). + + - Symbol type you can select the type of legend item symbol from "Marker on line" or "Marker above line" -- Legend font here you can set type, face and color for the + - Legend font here you can set type, face and color for the font of Legend item. + + - Legend font color - this allows to select the color of the font of the legend item. -- Marker size - size of the points (markers) forming curve lines. - -- Background color of the XY plot. + - Highlighted legend font color - this submenu allows to select the color of the font of the selected legend item. - Deviation marker allows specifying the properties of the marker, which is used for drawing deviations data. diff --git a/doc/salome/gui/input/setting_preferences.doc b/doc/salome/gui/input/setting_preferences.doc index 9b0899efd..99d478271 100644 --- a/doc/salome/gui/input/setting_preferences.doc +++ b/doc/salome/gui/input/setting_preferences.doc @@ -186,39 +186,43 @@ titles displayed in the viewer: \image html pref_salome_plot2dviewer.png -- Show legend - this options specifies if it's necessary to -show legend by default. -- Legend Position - this submenu allows to set the default position -of the legend, it can be located to the left, to the right, on top or -on bottom of the graph. -- Legend font - this allows to set type and face for the font of Legend item. -- Curve Type - this allows to set the representation of graphs in -your presentations. You can see only Points, points connected with -Lines or points connected with smooth Splines. -- Marker Size - this submenu allows you to set the size of -markers in your graphs. -- Horizontal and Vertical axis scale - this submenus allow you to set -the scale for vertical and horizontal axes. It can be either Linear or -Logarithmic. Note that the Logarithmic scale can be used only -if the minimum value of corresponding component (abscissa or ordinate) -of all points displayed in the viewer is greater than zero. -If this condition is not met, the scale is switched to Linear -automatically, even if it is set to Logarithmic. - Background color - this submenu allows to select the background color. Click on the colored line to access to the \ref select_color_and_font_page "Select Color" dialog box. -- Legend font color - this allows to select the color of the -font of the legend item. -- Highlighted legend font color - this submenu allows to select -the color of the font of the selected legend item. - Selection color - this submenu allows to select the color of selected object in the viewer. -- Deviation marker color - this submenu allows to select the -color of the deviation marker. -- Deviation marker line width allows to define line width of -the deviation marker. -- Deviation marker tick size allows to define size of the upper -and lower horizontal lines of the deviation marker. +- Viewer - allows specifying the properties of the Plot 2D Viewer. + - Curve Type - this allows to set the representation of graphs in + your presentations. You can see only Points, points connected with + Lines or points connected with smooth Splines. + - Marker Size - this submenu allows you to set the size of + markers in your graphs. + - Horizontal and Vertical axis scale - this submenus allow you to set + the scale for vertical and horizontal axes. It can be either Linear or + Logarithmic. Note that the Logarithmic scale can be used only + if the minimum value of corresponding component (abscissa or ordinate) + of all points displayed in the viewer is greater than zero. + If this condition is not met, the scale is switched to Linear + automatically, even if it is set to Logarithmic. + - Deviation marker color - this submenu allows to select the + color of the deviation marker. + - Deviation marker line width allows to define line width of + the deviation marker. + - Deviation marker tick size allows to define size of the upper + and lower horizontal lines of the deviation marker. +- Legend - allows specifying the properties of the legend. + - Show legend - this options specifies if it's necessary to + show legend by default. + - Legend Position - this submenu allows to set the default position + of the legend, it can be located to the left, to the right, on top or + on bottom of the graph. + - Symbol type you can select the type of legend item symbol from "Marker on line" + or "Marker above line" + - Legend font - this allows to set type and face for the font of Legend item. + - Legend font color - this allows to select the color of the + font of the legend item. + - Highlighted legend font color - this submenu allows to select + the color of the font of the selected legend item.

Directories Preferences

diff --git a/src/LightApp/LightApp_Application.cxx b/src/LightApp/LightApp_Application.cxx index 1461178bc..21f213ad9 100644 --- a/src/LightApp/LightApp_Application.cxx +++ b/src/LightApp/LightApp_Application.cxx @@ -2423,22 +2423,18 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab //pref->setItemProperty( "columns", 2, plot2dGroup ); - // ... -> show legend - pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dGroup, - LightApp_Preferences::Bool, "Plot2d", "ShowLegend" ); - // ... -> legend position - int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dGroup, - LightApp_Preferences::Selector, "Plot2d", "LegendPos" ); - aValuesList.clear(); - anIndicesList.clear(); - aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM"); - anIndicesList << 0 << 1 << 2 << 3 ; - pref->setItemProperty( "strings", aValuesList, legendPosition ); - pref->setItemProperty( "indexes", anIndicesList, legendPosition ); - // ... -> legend font - pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" ); - // ... -> curve type - int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dGroup, + // ... -> background + pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup, + LightApp_Preferences::Color, "Plot2d", "Background" ); + // ... -> selection color + pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup, + LightApp_Preferences::Color, "Plot2d", "SelectionColor" ); + + // ... "Viewer" group <> + int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup ); + + // .... -> curve type + int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup, LightApp_Preferences::Selector, "Plot2d", "CurveType" ); aValuesList.clear(); anIndicesList.clear(); @@ -2446,13 +2442,13 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) anIndicesList << 0 << 1 << 2 ; pref->setItemProperty( "strings", aValuesList, curveType ); pref->setItemProperty( "indexes", anIndicesList, curveType ); - // ... -> marker size - int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dGroup, + // .... -> marker size + int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup, LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" ); pref->setItemProperty( "min", 0, markerSize ); pref->setItemProperty( "max", 100, markerSize ); - // ... -> horizontal scaling mode - int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dGroup, + // .... -> horizontal scaling mode + int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup, LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" ); aValuesList.clear(); anIndicesList.clear(); @@ -2460,34 +2456,59 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) anIndicesList << 0 << 1 ; pref->setItemProperty( "strings", aValuesList, horScale ); pref->setItemProperty( "indexes", anIndicesList, horScale ); - // ... -> vertical scaling mode - int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dGroup, + // .... -> vertical scaling mode + int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup, LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" ); pref->setItemProperty( "strings", aValuesList, verScale ); pref->setItemProperty( "indexes", anIndicesList, verScale ); - // ... -> background - pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup, - LightApp_Preferences::Color, "Plot2d", "Background" ); - // ... -> font color - pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" ); - // ... -> selection font color - pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" ); - // ... -> selection color - pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup, - LightApp_Preferences::Color, "Plot2d", "SelectionColor" ); - // ... -> errors/deviation colot - pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dGroup, + + // .... -> errors/deviation colot + pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup, LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" ); - // ... -> deviation markers line size - int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dGroup, + // .... -> deviation markers line size + int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup, LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" ); pref->setItemProperty( "min", 1, deviationMarkerLw ); pref->setItemProperty( "max", 5, deviationMarkerLw ); - // ... -> deviation markers tick mark size - int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dGroup, + // .... -> deviation markers tick mark size + int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup, LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" ); pref->setItemProperty( "min", 1, deviationMarkerTs ); pref->setItemProperty( "max", 5, deviationMarkerTs ); + // .... "Viewer" group <> + + // ... "Legend" group <> + int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup ); + + // .... -> show legend + pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup, + LightApp_Preferences::Bool, "Plot2d", "ShowLegend" ); + // .... -> legend position + int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup, + LightApp_Preferences::Selector, "Plot2d", "LegendPos" ); + aValuesList.clear(); + anIndicesList.clear(); + aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM"); + anIndicesList << 0 << 1 << 2 << 3 ; + pref->setItemProperty( "strings", aValuesList, legendPosition ); + pref->setItemProperty( "indexes", anIndicesList, legendPosition ); + // .... -> Symbol type + int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup, + LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" ); + aValuesList.clear(); + anIndicesList.clear(); + aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE"); + anIndicesList << 0 << 1 ; + pref->setItemProperty( "strings", aValuesList, legendSymbolType ); + pref->setItemProperty( "indexes", anIndicesList, legendSymbolType ); + // .... -> legend font + pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" ); + // ... -> font color + pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" ); + // ... -> selection font color + pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" ); + // ... "Legend" group <> + // .. "Plot2d viewer" group <> // .. "Directories" preferences tab <> @@ -2953,14 +2974,22 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString } #ifndef DISABLE_PLOT2DVIEWER - if ( sec == "Plot2d" ) { - if( param == "SelectionColor" ) { - QColor c = resMgr->colorValue( sec, param ); - Plot2d_Object::setSelectionColor(c); - } - else if (param == "SelectedLegendFontColor") { - QColor c = resMgr->colorValue( sec, param ); - Plot2d_Object::setHighlightedLegendTextColor(c); + QList lst; + viewManagers( Plot2d_Viewer::Type(), lst ); + QListIterator itPlot2d( lst ); + while ( itPlot2d.hasNext() ) { + SUIT_ViewManager* viewMgr = itPlot2d.next(); + SUIT_ViewModel* vm = viewMgr->getViewModel(); + if ( !vm || !vm->inherits( "Plot2d_Viewer" ) ) + continue; + + Plot2d_Viewer* Plot2dVM = dynamic_cast( vm ); + + viewMgr->setViewModel( vm ); + Plot2d_ViewWindow* wnd = dynamic_cast( viewMgr->getActiveView() ); + if( wnd ) { + Plot2d_ViewFrame* frame = wnd->getViewFrame(); + frame->SetPreference(); } } #endif diff --git a/src/LightApp/resources/LightApp.xml b/src/LightApp/resources/LightApp.xml index 4f93798f4..5c0b0d574 100644 --- a/src/LightApp/resources/LightApp.xml +++ b/src/LightApp/resources/LightApp.xml @@ -176,6 +176,7 @@ + diff --git a/src/LightApp/resources/LightApp_msg_en.ts b/src/LightApp/resources/LightApp_msg_en.ts index 1295bba41..06ebdb473 100644 --- a/src/LightApp/resources/LightApp_msg_en.ts +++ b/src/LightApp/resources/LightApp_msg_en.ts @@ -670,6 +670,26 @@ The changes will be applied on the next application session. PREF_GROUP_PLOT2DVIEWER Plot 2D Viewer + + PREF_GROUP_VIEWER + Viewer + + + PREF_GROUP_LEGEND + Legend + + + PREF_LEGEND_SYMBOL_TYPE + Symbol type: + + + PREF_MARKER_ABOVE_LINE + Marker above line + + + PREF_MARKER_ON_LINE + Marker on line + PREF_DEVIATION_COLOR Deviation marker color diff --git a/src/LightApp/resources/LightApp_msg_fr.ts b/src/LightApp/resources/LightApp_msg_fr.ts index e9f864f59..7bb01a172 100755 --- a/src/LightApp/resources/LightApp_msg_fr.ts +++ b/src/LightApp/resources/LightApp_msg_fr.ts @@ -670,6 +670,26 @@ Les modifications seront appliquées à la prochaine session. PREF_GROUP_PLOT2DVIEWER Scène Plot2d + + PREF_GROUP_VIEWER + Scène + + + PREF_GROUP_LEGEND + Légende + + + PREF_LEGEND_SYMBOL_TYPE + Type de symbole: + + + PREF_MARKER_ABOVE_LINE + Marqueur dessus de la ligne + + + PREF_MARKER_ON_LINE + Marqueur sur la ligne + PREF_DEVIATION_COLOR Couleur des marqueurs de déviation diff --git a/src/Plot2d/Plot2d.cxx b/src/Plot2d/Plot2d.cxx index 3fcae1e88..71d604726 100755 --- a/src/Plot2d/Plot2d.cxx +++ b/src/Plot2d/Plot2d.cxx @@ -529,7 +529,7 @@ bool Plot2d::existMarker( const int rtti, const QwtPlot* thePlot, const QwtSymbo if ( anItem && anItem->rtti() == rtti ) { QwtPlotCurve* crv = dynamic_cast( anItem ); if ( crv ) { - QwtSymbol::Style aStyle = crv->symbol().style(); + QwtSymbol::Style aStyle = crv->symbol()->style(); QColor aColor = crv->pen().color(); Qt::PenStyle aLine = crv->pen().style(); ok = closeColors( aColor, color ) && aStyle == typeMarker && aLine == typeLine; diff --git a/src/Plot2d/Plot2d.h b/src/Plot2d/Plot2d.h index 9150a254c..4f0e3d3fa 100755 --- a/src/Plot2d/Plot2d.h +++ b/src/Plot2d/Plot2d.h @@ -37,7 +37,9 @@ #endif #include -#include +#include +#include +#include class QPainter; class QwtPlot; diff --git a/src/Plot2d/Plot2d_AnalyticalCurve.cxx b/src/Plot2d/Plot2d_AnalyticalCurve.cxx index 8e00b9b0e..75b14cede 100755 --- a/src/Plot2d/Plot2d_AnalyticalCurve.cxx +++ b/src/Plot2d/Plot2d_AnalyticalCurve.cxx @@ -165,18 +165,18 @@ void Plot2d_AnalyticalCurve::updatePlotItem() aCurve->setSelected(isSelected()); aCurve->setPen( QPen(aColor , lineW, ps ) ); - aCurve->setSymbol( QwtSymbol( ms, QBrush( aColor ), - QPen( aColor ), - QSize( markerS , markerS ) ) ); + aCurve->setSymbol( new QwtSymbol( ms, QBrush( aColor ), + QPen( aColor ), + QSize( markerS , markerS ) ) ); aCurve->setLegendPen(QPen(getColor(), getLineWidth(), ps )); - aCurve->setLegendSymbol( QwtSymbol( ms, QBrush( getColor() ), - QPen( getColor() ), - QSize( getMarkerSize() , getMarkerSize() ))); + aCurve->setLegendSymbol( new QwtSymbol( ms, QBrush( getColor() ), + QPen( getColor() ), + QSize( getMarkerSize() , getMarkerSize() ))); double *x, *y; long nb = getData( &x, &y ); - aCurve->setData( x, y, nb ); + aCurve->setSamples( x, y, nb ); aCurve->setTitle(getName()); } @@ -213,10 +213,10 @@ void Plot2d_AnalyticalCurve::calculate() { */ bool Plot2d_AnalyticalCurve::checkCurve( const QwtPlot* thePlot) { if( !myExpression.isEmpty() && thePlot ) { - const QwtScaleDiv* div = thePlot->axisScaleDiv(QwtPlot::xBottom); - setRangeBegin(div->lowerBound()); - setRangeEnd(div->upperBound()); - calculate(); + const QwtScaleDiv div = thePlot->axisScaleDiv(QwtPlot::xBottom); + setRangeBegin(div.lowerBound()); + setRangeEnd(div.upperBound()); + calculate(); } return myState == Plot2d_AnalyticalCurve::StateOk; } diff --git a/src/Plot2d/Plot2d_Curve.cxx b/src/Plot2d/Plot2d_Curve.cxx index 615d5dfd8..4bc84ef7e 100755 --- a/src/Plot2d/Plot2d_Curve.cxx +++ b/src/Plot2d/Plot2d_Curve.cxx @@ -135,19 +135,19 @@ void Plot2d_Curve::updatePlotItem( QwtPlotItem* theItem ) aCurve->setSelected(isSelected()); aCurve->setPen( QPen(aColor , lineW, ps ) ); - aCurve->setSymbol( QwtSymbol( ms, QBrush( aColor ), - QPen( aColor ), - QSize( markerS , markerS ) ) ); + aCurve->setSymbol( new QwtSymbol( ms, QBrush( aColor ), + QPen( aColor ), + QSize( markerS , markerS ) ) ); aCurve->setLegendPen(QPen(getColor(), getLineWidth(), ps )); - aCurve->setLegendSymbol( QwtSymbol( ms, QBrush( getColor() ), - QPen( getColor() ), - QSize( getMarkerSize() , getMarkerSize() ))); + aCurve->setLegendSymbol( new QwtSymbol( ms, QBrush( getColor() ), + QPen( getColor() ), + QSize( getMarkerSize() , getMarkerSize() ))); double *x, *y, *min, *max; long nb = getData( &x, &y ); if(nb > 0 && x && y) { - aCurve->setData( x, y, nb ); + aCurve->setSamples( x, y, nb ); delete [] x; delete [] y; QList idx; @@ -160,7 +160,7 @@ void Plot2d_Curve::updatePlotItem( QwtPlotItem* theItem ) aCurve->clearDeviationData(); } } else { - aCurve->setData( NULL, NULL, 0 ); + aCurve->setSamples( NULL, NULL, 0 ); } } diff --git a/src/Plot2d/Plot2d_Histogram.cxx b/src/Plot2d/Plot2d_Histogram.cxx index 8e291f2d7..d41bf002c 100644 --- a/src/Plot2d/Plot2d_Histogram.cxx +++ b/src/Plot2d/Plot2d_Histogram.cxx @@ -135,22 +135,20 @@ void Plot2d_Histogram::setData( const QList& theXVals, /*! Gets data */ -QwtIntervalData Plot2d_Histogram::getData() const +QwtIntervalSeriesData Plot2d_Histogram::getData() const { pointList aPoints = getPointList(); int aSize = aPoints.size(); - QwtArray anIntervals( aSize ); - QwtArray aValues( aSize ); + QwtArray anIntervals( aSize ); double aX; double aWidth = myWidth <= 0 ? myDefWidth : myWidth; // VSR: width is either manually assigned or auto-calculated for ( int i = 0; i < aSize; i++ ) { aX = aPoints[i].x; - anIntervals[i] = QwtDoubleInterval( aX - aWidth/2, aX + aWidth/2 ); - aValues[i] = aPoints[i].y; + anIntervals[i] = QwtIntervalSample( aPoints[i].y, aX - aWidth/2, aX + aWidth/2 ); } - return QwtIntervalData( anIntervals, aValues ); + return QwtIntervalSeriesData( anIntervals ); } /*! diff --git a/src/Plot2d/Plot2d_Histogram.h b/src/Plot2d/Plot2d_Histogram.h index 04fe363a6..dcb6b3a3d 100644 --- a/src/Plot2d/Plot2d_Histogram.h +++ b/src/Plot2d/Plot2d_Histogram.h @@ -28,7 +28,7 @@ #include "Plot2d.h" #include "Plot2d_Object.h" -#include +#include class PLOT2D_EXPORT Plot2d_Histogram : public Plot2d_Object { @@ -39,30 +39,30 @@ public: virtual ~Plot2d_Histogram(); Plot2d_Histogram& operator= ( const Plot2d_Histogram& ); - virtual int rtti(); - virtual QwtPlotItem* createPlotItem(); - virtual void autoFill( const QwtPlot* ); - virtual void updatePlotItem( QwtPlotItem* ); + virtual int rtti(); + virtual QwtPlotItem* createPlotItem(); + virtual void autoFill( const QwtPlot* ); + virtual void updatePlotItem( QwtPlotItem* ); - void setData( const QList&, const QList& ); - QwtIntervalData getData() const; + void setData( const QList&, const QList& ); + QwtIntervalSeriesData getData() const; - void setColor( const QColor& ); - QColor getColor() const; + void setColor( const QColor& ); + QColor getColor() const; - void setWidth( const double ); - double getWidth( const bool ) const; + void setWidth( const double ); + double getWidth( const bool ) const; - static double getMinInterval( const QList& ); + static double getMinInterval( const QList& ); protected: - QColor getNextColor( const QwtPlot* ); - bool existColor( const QwtPlot*, const QColor& ); + QColor getNextColor( const QwtPlot* ); + bool existColor( const QwtPlot*, const QColor& ); private: - QColor myColor; - double myWidth; - double myDefWidth; + QColor myColor; + double myWidth; + double myDefWidth; }; #endif // PLOT2D_HISTOGRAM_H diff --git a/src/Plot2d/Plot2d_Object.cxx b/src/Plot2d/Plot2d_Object.cxx index 457db98ee..a87640bd6 100755 --- a/src/Plot2d/Plot2d_Object.cxx +++ b/src/Plot2d/Plot2d_Object.cxx @@ -25,34 +25,10 @@ #include "Plot2d_Object.h" -#ifndef NO_SUIT -#include -#include -#endif - // Static members QColor Plot2d_Object::mySelectionColor; QColor Plot2d_Object::myHighlightedLegendTextColor; -/* - * Read colors from the resource manager. -*/ -void Plot2d_Object::initColors() { -#ifndef NO_SUIT - SUIT_Session* session = SUIT_Session::session(); - if(!session) - return; - - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - if(resMgr) { - mySelectionColor = resMgr->colorValue( "Plot2d", "SelectionColor", QColor(80,80,80) ); - myHighlightedLegendTextColor = resMgr->colorValue( "Plot2d", "SelectedLegendFontColor", QColor(255,255,255) ); - } -#else - mySelectionColor = QColor(80,80,80); - myHighlightedLegendTextColor = QColor(255,255,255); -#endif -} /*! Constructor @@ -127,7 +103,7 @@ void Plot2d_Object::updatePlotItem( QwtPlotItem* theItem ) return; if ( theItem->yAxis() != getYAxis() || theItem->xAxis() != getXAxis() ) { - theItem->setAxis( getXAxis(), getYAxis() ); + theItem->setAxes( getXAxis(), getYAxis() ); QwtPlot* aPlot = theItem->plot(); if ( aPlot ) { diff --git a/src/Plot2d/Plot2d_Object.h b/src/Plot2d/Plot2d_Object.h index 2c219fab7..5682a09ad 100755 --- a/src/Plot2d/Plot2d_Object.h +++ b/src/Plot2d/Plot2d_Object.h @@ -105,8 +105,6 @@ public: void setSelected(const bool); bool isSelected() const; - static void initColors(); - static void setSelectionColor(const QColor& c); static QColor selectionColor(); diff --git a/src/Plot2d/Plot2d_PlotItems.cxx b/src/Plot2d/Plot2d_PlotItems.cxx index be54a678e..c212bf6e5 100644 --- a/src/Plot2d/Plot2d_PlotItems.cxx +++ b/src/Plot2d/Plot2d_PlotItems.cxx @@ -24,19 +24,25 @@ #include "Plot2d_PlotItems.h" #include "Plot2d_Object.h" +#include "Plot2d_ViewFrame.h" #include #include #include #include #include +#include +#include #include #include #include #include -#include +#include #include +const int SPACING = 10; +const int SYMBOL_SIZE = 13; + const char* yAxisLeft[] = { "12 12 2 1", " c None", @@ -72,44 +78,69 @@ const char* yAxisRight[] = { " "}; /*! - Constructor of Plot2d_QwtLegendItem + Constructor of Plot2d_QwtLegendLabel */ -Plot2d_QwtLegendItem::Plot2d_QwtLegendItem( QWidget* parent ) : - QwtLegendItem( parent ), +Plot2d_QwtLegendLabel::Plot2d_QwtLegendLabel( QWidget* parent ) : + QwtLegendLabel( parent ), myYAxisIdentifierMode( IM_None ), - myIsSelected(false) + myIsSelected(false), + mySymbol( new QwtSymbol() ), + mySymbolType(0), + myPen( QPen() ) { myYAxisLeftIcon = yAxisLeft; myYAxisRightIcon = yAxisRight; int anIconWidth = qMax( myYAxisLeftIcon.width(), myYAxisRightIcon.width() ); + setSpacing( SPACING ); mySpacingCollapsed = spacing(); - mySpacingExpanded = anIconWidth - mySpacingCollapsed; + mySpacingExpanded = anIconWidth + mySpacingCollapsed; } /*! - Destructor of Plot2d_QwtLegendItem + Destructor of Plot2d_QwtLegendLabel */ -Plot2d_QwtLegendItem::~Plot2d_QwtLegendItem() +Plot2d_QwtLegendLabel::~Plot2d_QwtLegendLabel() { } /*! Set Y axis identifier displaying mode */ -void Plot2d_QwtLegendItem::setYAxisIdentifierMode( const int theMode ) +void Plot2d_QwtLegendLabel::setYAxisIdentifierMode( const int theMode ) { myYAxisIdentifierMode = theMode; setSpacing( theMode == IM_None ? mySpacingCollapsed : mySpacingExpanded ); } /*! - Redefined method of drawing identifier of legend item + Paint the identifier to a given rect. + \param painter Painter + \param rect Rect where to paint */ -void Plot2d_QwtLegendItem::drawIdentifier( QPainter* painter, const QRect& rect ) const +void Plot2d_QwtLegendLabel::drawIdentifier( QPainter* painter, const QRect& rect ) { - QwtLegendItem::drawIdentifier( painter, rect ); + if ( rect.isEmpty() ) + return; + if( myPen.style() != Qt::NoPen ) { + painter->save(); + painter->setPen(myPen); + QwtPainter::drawLine( painter, rect.left() - 2, rect.center().y() + mySymbolType * 4, + rect.right() + 2, rect.center().y() + mySymbolType * 4 ); + painter->restore(); + } + if ( mySymbol->style() != QwtSymbol::NoSymbol ) + { + QRect symbolRect; + symbolRect.setSize( QSize( SYMBOL_SIZE, SYMBOL_SIZE ) ); + symbolRect.moveCenter( QPoint( rect.center().x(), rect.center().y() - mySymbolType * 4 ) ); + painter->save(); + painter->setBrush( mySymbol->brush() ); + painter->setPen( mySymbol->pen() ); + mySymbol->drawSymbol( painter, symbolRect ); + painter->restore(); + } if( myYAxisIdentifierMode != IM_None ) { QPixmap aPixmap( myYAxisIdentifierMode == IM_Left ? yAxisLeft : yAxisRight ); painter->save(); @@ -121,19 +152,22 @@ void Plot2d_QwtLegendItem::drawIdentifier( QPainter* painter, const QRect& rect /*! Update highliting on the item. */ -void Plot2d_QwtLegendItem::updateHighlit() { +void Plot2d_QwtLegendLabel::updateHighlit() { QwtText txt = text(); - if(isSelected()) { + if( isSelected() ) { QColor highlightColor = Plot2d_Object::selectionColor(); - if(highlightColor != txt.backgroundBrush().color()) { - txt.setBackgroundBrush(highlightColor); + if( highlightColor != txt.backgroundBrush().color() ) { + txt.setBackgroundBrush( highlightColor ); setText(txt); } - } else if( QWidget* parent = qobject_cast(this->parent()->parent()) ) { - QPalette aPal = parent->palette(); - if(aPal.color(QPalette::Background) != txt.backgroundBrush().color()) { - txt.setBackgroundBrush(aPal.color(QPalette::Background)); - setText(txt); + } + else if( this->parent() ) { + if(QWidget* parent = qobject_cast( this->parent()->parent() ) ) { + QPalette aPal = parent->palette(); + if( aPal.color( QPalette::Background) != txt.backgroundBrush().color() ) { + txt.setBackgroundBrush( aPal.color( QPalette::Background ) ); + setText( txt ); + } } } } @@ -141,14 +175,14 @@ void Plot2d_QwtLegendItem::updateHighlit() { /*! Sets selected property. */ -void Plot2d_QwtLegendItem::setSelected(const bool on) { +void Plot2d_QwtLegendLabel::setSelected(const bool on) { myIsSelected = on; } /*! Gets selected property. */ -bool Plot2d_QwtLegendItem::isSelected() const { +bool Plot2d_QwtLegendLabel::isSelected() const { return myIsSelected; } @@ -156,17 +190,79 @@ bool Plot2d_QwtLegendItem::isSelected() const { /* Draw text of the item. */ -void Plot2d_QwtLegendItem::drawText(QPainter * painter, const QRect &rect) { +void Plot2d_QwtLegendLabel::drawText( QPainter * painter, const QRectF &rect ) { painter->setPen( isSelected() ? Plot2d_Object::highlightedLegendTextColor() : - getColorFromPalette( QPalette::Text) ); + getColorFromPalette( QPalette::Text) ); - QwtLegendItem::drawText( painter, rect ); + QwtTextLabel::drawText( painter, rect ); +} + +/*! + Sets symbol. +*/ +void Plot2d_QwtLegendLabel::setSymbol( const QwtSymbol* theSymbol ) +{ + mySymbol = new QwtSymbol( theSymbol->style(), theSymbol->brush(), + theSymbol->pen(), theSymbol->size() ); +} + +/*! + Sets symbol type 0(marker on line) or 1(marker above line). +*/ +void Plot2d_QwtLegendLabel::setSymbolType( const int theType ) +{ + mySymbolType = theType; +} + +/*! + Sets pen. +*/ +void Plot2d_QwtLegendLabel::setPen (const QPen& thePen ) +{ + myPen = thePen; +} + +/*! + Redefined method paintEvent of QwtLegendLabel +*/ +void Plot2d_QwtLegendLabel::paintEvent( QPaintEvent *e ) +{ + const QRect cr = contentsRect(); + + int ButtonFrame = 6; + QPainter painter( this ); + painter.setClipRegion( e->region() ); + + if ( isDown() ) + { + qDrawWinButton( &painter, 0, 0, width(), height(), + palette(), true ); + } + + painter.save(); + painter.setClipRect( cr ); + + drawContents( &painter ); + + QRect iconRect = cr; + if ( !icon().isNull() ) + { + if ( itemMode() != QwtLegendData::ReadOnly ) + iconRect.setX( iconRect.x() + ButtonFrame ); + iconRect.setSize( QSize( icon().size().width() + spacing() , + icon().size().height() + spacing() ) ); + iconRect.moveCenter( QPoint( iconRect.center().x(), cr.center().y() ) ); + } + + drawIdentifier( &painter, iconRect ); + + painter.restore(); } /* Get color from the legend pallete by 'role' flag. */ -QColor Plot2d_QwtLegendItem::getColorFromPalette(QPalette::ColorRole role) { +QColor Plot2d_QwtLegendLabel::getColorFromPalette(QPalette::ColorRole role) { QWidget* pw = parentWidget(); QColor col = palette().color( role ); while( pw ) { @@ -242,72 +338,63 @@ void Plot2d_QwtPlotCurve::setYAxisIdentifierEnabled( const bool on ) /*! Redefined method, which updates legend of the curve */ -void Plot2d_QwtPlotCurve::updateLegend( QwtLegend* legend ) const +void Plot2d_QwtPlotCurve::updateLegend( const QwtPlotItem* thePlotItem, + const QList& theLegendData ) { - if ( !legend ) + if ( !thePlotItem || !thePlotItem->plot() ) return; - QWidget* widget = legend->find( this ); - - if ( testItemAttribute(QwtPlotItem::Legend) ) { - - if ( widget == NULL ) { - widget = legendItem(); - if ( widget ) { - if ( widget->inherits("QwtLegendItem") ) { - QwtLegendItem *label = (QwtLegendItem *)widget; - label->setItemMode(legend->itemMode()); - - if ( plot() ) { - QObject::connect(label, SIGNAL(clicked()), - plot(), SLOT(legendItemClicked())); - QObject::connect(label, SIGNAL(checked(bool)), - plot(), SLOT(legendItemChecked(bool))); - } - } - legend->contentsWidget()->layout()->addWidget(widget); - legend->insert(this, widget); - } - } - - QwtPlotCurve::updateLegend( legend ); - + if ( !testItemAttribute( QwtPlotItem::Legend ) ) + return; - if( Plot2d_QwtLegendItem* anItem = dynamic_cast( widget ) ) { - int aMode = Plot2d_QwtLegendItem::IM_None; - if( myYAxisIdentifierEnabled ) - aMode = myYAxis == QwtPlot::yRight ? - Plot2d_QwtLegendItem::IM_Right : - Plot2d_QwtLegendItem::IM_Left; - anItem->setYAxisIdentifierMode( aMode ); - if(isSelected()) { - anItem->setCurvePen(legendPen()); - anItem->setSymbol(legendSymbol()); - } - anItem->setSelected(isSelected()); - anItem->updateHighlit(); - } + QwtPlotCurve::updateLegend( thePlotItem, theLegendData ); + + const QVariant itemInfo = thePlotItem->plot()->itemToInfo( const_cast< QwtPlotItem *>( thePlotItem ) ); + QwtLegend* legend = dynamic_cast( thePlotItem->plot()->legend() ); + QWidget* widget = legend->legendWidget( itemInfo ); + QwtLegendLabel* label = dynamic_cast( widget ); + if( Plot2d_QwtLegendLabel* anItem = (Plot2d_QwtLegendLabel*)label ) { + int aMode = Plot2d_QwtLegendLabel::IM_None; + if( myYAxisIdentifierEnabled ) + aMode = myYAxis == QwtPlot::yRight ? + Plot2d_QwtLegendLabel::IM_Right : + Plot2d_QwtLegendLabel::IM_Left; + anItem->setYAxisIdentifierMode( aMode ); + + anItem->setSymbol( legendSymbol() ); + if( Plot2d_Plot2d* plot = dynamic_cast( thePlotItem->plot() ) ) + anItem->setSymbolType( plot->getLegendSymbolType() ); + anItem->setPen( legendPen() ); + + anItem->setSelected( isSelected() ); + anItem->updateHighlit(); + anItem->repaint(); } } /*! - Redefined method, which creates and returns legend item of the curve + Redefined method, which updates and calls QwtPlot::autoRefresh() for the parent plot */ -QWidget* Plot2d_QwtPlotCurve::legendItem() const +void Plot2d_QwtPlotCurve::itemChanged() { - return new Plot2d_QwtLegendItem; + if ( plot() ) + updateLegend( this, legendData() ); + + QwtPlotItem::itemChanged(); } /*! Redefined method, which draw a set of points of a curve. */ -void Plot2d_QwtPlotCurve::draw(QPainter *painter, - const QwtScaleMap &xMap, const QwtScaleMap &yMap, - int from, int to) const +void Plot2d_QwtPlotCurve::drawSeries( QPainter *painter, + const QwtScaleMap &xMap, + const QwtScaleMap &yMap, + const QRectF &canvasRect, + int from, int to) const { if (to < 0) to = dataSize() - 1; - QwtPlotCurve::draw(painter, xMap, yMap, from, to); + QwtPlotCurve::drawSeries(painter, xMap, yMap, canvasRect, from, to); //draw deviation data if(hasDeviationData()) { @@ -321,8 +408,9 @@ void Plot2d_QwtPlotCurve::draw(QPainter *painter, painter->setPen(p); for (int i = from; i <= to; i++) { if(!myDeviationData->values(i,min,max)) continue; - xi = x(i); - yi = y(i); + const QPointF sample = data()->sample( i ); + xi = sample.x(); + yi = sample.y(); xp = xMap.transform(xi); ytop = yMap.transform(yi + max); ybtm = yMap.transform(yi - min); @@ -406,7 +494,9 @@ void Plot2d_QwtPlotCurve::clearDeviationData() Constructor. */ Plot2d_SelectableItem::Plot2d_SelectableItem(): - myIsSelected(false) + myIsSelected(false), + myLegendSymbol( new QwtSymbol() ), + myLegendPen( QPen() ) { } @@ -448,15 +538,19 @@ QPen Plot2d_SelectableItem::legendPen() const { /*! Sets legend symbol property. */ -void Plot2d_SelectableItem::setLegendSymbol(const QwtSymbol& s) { - myLegendSymbol = s; +void Plot2d_SelectableItem::setLegendSymbol( const QwtSymbol* s ) { + myLegendSymbol->setStyle( s->style() ); + myLegendSymbol->setBrush( s->brush() ); + myLegendSymbol->setPen( s->pen() ); + myLegendSymbol->setSize( s->size() ); } /*! Sets legend symbol property. */ -QwtSymbol Plot2d_SelectableItem::legendSymbol() const { - return myLegendSymbol; +QwtSymbol* Plot2d_SelectableItem::legendSymbol() const { + return new QwtSymbol( myLegendSymbol->style(), myLegendSymbol->brush(), + myLegendSymbol->pen(), myLegendSymbol->size() ); } /*! @@ -521,16 +615,16 @@ double Plot2d_HistogramQwtItem::baseline() const /*! Sets data to object */ -void Plot2d_HistogramQwtItem::setData( const QwtIntervalData& theData ) +void Plot2d_HistogramQwtItem::setData( const QwtIntervalSeriesData& theData ) { - myData = theData; + myData.setSamples( theData.samples() ); itemChanged(); } /*! Returns data from object */ -const QwtIntervalData& Plot2d_HistogramQwtItem::data() const +const QwtIntervalSeriesData& Plot2d_HistogramQwtItem::data() const { return myData; } @@ -618,7 +712,7 @@ bool Plot2d_HistogramQwtItem::testHistogramAttribute( HistogramAttribute theAttr void Plot2d_HistogramQwtItem::draw( QPainter* thePainter, const QwtScaleMap& theXMap, const QwtScaleMap& theYMap, - const QRect& ) const + const QRectF& ) const { thePainter->setPen( QPen( myColor ) ); @@ -627,19 +721,19 @@ void Plot2d_HistogramQwtItem::draw( QPainter* thePainter, for ( int i = 0; i < (int)myData.size(); i++ ) { if ( myAttributes & Plot2d_HistogramQwtItem::Xfy ) { - const int x2 = theXMap.transform( myData.value( i ) ); + const int x2 = theXMap.transform( myData.sample(i).value ); if ( x2 == x0 ) continue; - int y1 = theYMap.transform( myData.interval( i ).minValue() ); - int y2 = theYMap.transform( myData.interval( i ).maxValue() ); + int y1 = theYMap.transform( myData.sample( i ).interval.minValue() ); + int y2 = theYMap.transform( myData.sample( i ).interval.maxValue() ); if ( y1 > y2 ) qSwap( y1, y2 ); if ( i < (int)myData.size() - 2 ) { - const int yy1 = theYMap.transform( myData.interval(i+1).minValue() ); - const int yy2 = theYMap.transform( myData.interval(i+1).maxValue() ); + const int yy1 = theYMap.transform( myData.sample(i+1).interval.minValue() ); + const int yy2 = theYMap.transform( myData.sample(i+1).interval.maxValue() ); if ( y2 == qwtMin( yy1, yy2 ) ) { - const int xx2 = theXMap.transform( myData.interval(i+1).minValue() ); + const int xx2 = theXMap.transform( myData.sample(i+1).interval.minValue() ); if ( xx2 != x0 && ( ( xx2 < x0 && x2 < x0 ) || ( xx2 > x0 && x2 > x0 ) ) ) { // One pixel distance between neighboured bars @@ -650,19 +744,19 @@ void Plot2d_HistogramQwtItem::draw( QPainter* thePainter, drawBar( thePainter, Qt::Horizontal, QRect( x0, y1, x2 - x0, y2 - y1 ) ); } else { - const int y2 = theYMap.transform( myData.value( i ) ); + const int y2 = theYMap.transform( myData.sample( i ).value ); if ( y2 == y0 ) continue; - int x1 = theXMap.transform( myData.interval( i ).minValue() ); - int x2 = theXMap.transform( myData.interval( i ).maxValue() ); + int x1 = theXMap.transform( myData.sample( i ).interval.minValue() ); + int x2 = theXMap.transform( myData.sample( i ).interval.maxValue() ); if ( x1 > x2 ) qSwap( x1, x2 ); if ( i < (int)myData.size() - 2 ) { - const int xx1 = theXMap.transform( myData.interval(i+1).minValue() ); - const int xx2 = theXMap.transform( myData.interval(i+1).maxValue() ); + const int xx1 = theXMap.transform( myData.sample(i+1).interval.minValue() ); + const int xx2 = theXMap.transform( myData.sample(i+1).interval.maxValue() ); if ( x2 == qwtMin( xx1, xx2 ) ) { - const int yy2 = theYMap.transform( myData.value(i+1) ); + const int yy2 = theYMap.transform( myData.sample(i+1).value ); if ( yy2 != y0 && ( ( yy2 < y0 && y2 < y0 ) || ( yy2 > y0 && y2 > y0 ) ) ) { // One pixel distance between neighboured bars @@ -756,28 +850,35 @@ QList Plot2d_HistogramItem::getBars() const /*! Set to legend item symbol with color of item */ -void Plot2d_HistogramItem::updateLegend( QwtLegend* theLegend ) const +void Plot2d_HistogramItem::updateLegend( QwtPlotItem* thePlotItem, + QList& theLegendData ) { - if ( !theLegend ) + if ( !thePlotItem || !thePlotItem->plot() ) return; - Plot2d_HistogramQwtItem::updateLegend( theLegend ); + Plot2d_HistogramQwtItem::updateLegend( thePlotItem, theLegendData ); - QWidget* theWidget = theLegend->find( this ); - if ( !theWidget || !theWidget->inherits( "QwtLegendItem" ) ) + const QVariant itemInfo = thePlotItem->plot()->itemToInfo( const_cast< QwtPlotItem *>( thePlotItem ) ); + QwtLegend *legend = dynamic_cast( thePlotItem->plot()->legend() ); + QWidget* widget = legend->legendWidget( itemInfo ); + + if ( !widget || !widget->inherits( "QwtLegendItem" ) ) return; - Plot2d_QwtLegendItem* anItem = ( Plot2d_QwtLegendItem* )theWidget; - QFontMetrics aFMetrics( anItem->font() ); - int aSize = aFMetrics.height(); - QwtSymbol aSymbol( QwtSymbol::Rect, QBrush( legendPen().color() ), - QPen( legendPen().color() ), QSize( aSize, aSize ) ); - anItem->setSymbol( aSymbol ); - anItem->setIdentifierMode( theLegend->identifierMode() - | QwtLegendItem::ShowSymbol ); - anItem->setSelected(isSelected()); - anItem->updateHighlit(); - anItem->update(); + QwtLegendLabel* label = dynamic_cast( widget ); + if( Plot2d_QwtLegendLabel* anItem = (Plot2d_QwtLegendLabel*)( label ) ) { + QFontMetrics aFMetrics( anItem->font() ); + int aSize = aFMetrics.height(); + QwtSymbol* aSymbol = new QwtSymbol( QwtSymbol::Rect, QBrush( legendPen().color() ), + QPen( legendPen().color() ), QSize( aSize, aSize ) ); + anItem->setSymbol( aSymbol ); + if( Plot2d_Plot2d* plot = dynamic_cast( thePlotItem->plot() ) ) + anItem->setSymbolType( plot->getLegendSymbolType() ); + anItem->setSelected( isSelected() ); + anItem->updateHighlit(); + anItem->update(); + anItem->repaint(); + } } /*! @@ -786,7 +887,7 @@ void Plot2d_HistogramItem::updateLegend( QwtLegend* theLegend ) const void Plot2d_HistogramItem::draw( QPainter* thePainter, const QwtScaleMap& theXMap, const QwtScaleMap& theYMap, - const QRect& ) const + const QRectF& ) const { // nds: clear list of bar items Plot2d_HistogramItem* anItem = (Plot2d_HistogramItem*)this; @@ -796,23 +897,23 @@ void Plot2d_HistogramItem::draw( QPainter* thePainter, const int x0 = theXMap.transform( baseline() ); const int y0 = theYMap.transform( baseline() ); - const QwtIntervalData& iData = data(); + const QwtIntervalSeriesData& iData = data(); for ( int i = 0; i < (int)iData.size(); i++ ) { if ( testHistogramAttribute( Plot2d_HistogramItem::Xfy ) ) { - const int x2 = theXMap.transform( iData.value( i ) ); + const int x2 = theXMap.transform( iData.sample(i).value ); if ( x2 == x0 ) continue; - int y1 = theYMap.transform( iData.interval( i ).minValue() ); - int y2 = theYMap.transform( iData.interval( i ).maxValue() ); + int y1 = theYMap.transform( iData.sample(i).interval.minValue() ); + int y2 = theYMap.transform( iData.sample(i).interval.maxValue() ); if ( y1 > y2 ) qSwap( y1, y2 ); if ( i < (int)iData.size() - 2 ) { - const int yy1 = theYMap.transform( iData.interval(i+1).minValue() ); - const int yy2 = theYMap.transform( iData.interval(i+1).maxValue() ); + const int yy1 = theYMap.transform( iData.sample(i+1).interval.minValue() ); + const int yy2 = theYMap.transform( iData.sample(i+1).interval.maxValue() ); if ( y2 == qwtMin( yy1, yy2 ) ) { - const int xx2 = theXMap.transform( iData.interval(i+1).minValue() ); + const int xx2 = theXMap.transform( iData.sample(i+1).interval.minValue() ); if ( xx2 != x0 && ( ( xx2 < x0 && x2 < x0 ) || ( xx2 > x0 && x2 > x0 ) ) ) { // One pixel distance between neighboured bars @@ -826,19 +927,19 @@ void Plot2d_HistogramItem::draw( QPainter* thePainter, anItem->myBarItems.append( aRect ); } else { - const int y2 = theYMap.transform( iData.value( i ) ); + const int y2 = theYMap.transform( iData.sample(i).value ); if ( y2 == y0 ) continue; - int x1 = theXMap.transform( iData.interval( i ).minValue() ); - int x2 = theXMap.transform( iData.interval( i ).maxValue() ); + int x1 = theXMap.transform( iData.sample(i).interval.minValue() ); + int x2 = theXMap.transform( iData.sample(i).interval.maxValue() ); if ( x1 > x2 ) qSwap( x1, x2 ); if ( i < (int)iData.size() - 2 ) { - const int xx1 = theXMap.transform( iData.interval(i+1).minValue() ); - const int xx2 = theXMap.transform( iData.interval(i+1).maxValue() ); + const int xx1 = theXMap.transform( iData.sample(i+1).interval.minValue() ); + const int xx2 = theXMap.transform( iData.sample(i+1).interval.maxValue() ); if ( x2 == qwtMin( xx1, xx2 ) ) { - const int yy2 = theYMap.transform( iData.value(i+1) ); + const int yy2 = theYMap.transform( iData.sample(i+1).value ); if ( yy2 != y0 && ( ( yy2 < y0 && y2 < y0 ) || ( yy2 > y0 && y2 > y0 ) ) ) { // One pixel distance between neighboured bars @@ -870,15 +971,6 @@ bool Plot2d_HistogramItem::isCrossItems() const return myCrossed; } -/*! - Redefined method, which creates and returns legend item of the curve -*/ -QWidget* Plot2d_HistogramItem::legendItem() const -{ - return new Plot2d_QwtLegendItem; -} - - /*! Draws bar of histogram and on it bars of histograms with lower height. */ @@ -931,3 +1023,29 @@ int Plot2d_HistogramItem::getCrossedTop( const QRect& theRect ) const } return aRes; } + +Plot2d_QwtLegend::Plot2d_QwtLegend( QWidget *parent ): +QwtLegend( parent ) +{ + setAutoFillBackground(true); +} + +Plot2d_QwtLegend::~Plot2d_QwtLegend() +{ +} + +/*! + Redefined method, which create a widget to be inserted into the legend. +*/ +QWidget *Plot2d_QwtLegend::createWidget( const QwtLegendData &data ) const +{ + Q_UNUSED( data ); + + Plot2d_QwtLegendLabel *label = new Plot2d_QwtLegendLabel(); + label->setItemMode( defaultItemMode() ); + + connect( label, SIGNAL( clicked() ), SLOT( itemClicked() ) ); + connect( label, SIGNAL( checked( bool ) ), SLOT( itemChecked( bool ) ) ); + + return label; +} diff --git a/src/Plot2d/Plot2d_PlotItems.h b/src/Plot2d/Plot2d_PlotItems.h index 357303a94..6feff2c1a 100644 --- a/src/Plot2d/Plot2d_PlotItems.h +++ b/src/Plot2d/Plot2d_PlotItems.h @@ -27,31 +27,37 @@ #include "Plot2d.h" -#include +#include +#include #include #include -#include #include +#include +#include -class PLOT2D_EXPORT Plot2d_QwtLegendItem : public QwtLegendItem +class PLOT2D_EXPORT Plot2d_QwtLegendLabel : public QwtLegendLabel { public: enum YAxisIdentifierMode { IM_None = 0, IM_Left, IM_Right }; public: - Plot2d_QwtLegendItem( QWidget* = 0 ); - virtual ~Plot2d_QwtLegendItem(); + Plot2d_QwtLegendLabel( QWidget* = 0 ); + virtual ~Plot2d_QwtLegendLabel(); public: void setYAxisIdentifierMode( const int ); void updateHighlit(); - void setSelected(const bool on); + void setSelected( const bool on ); bool isSelected() const; - QColor getColorFromPalette(QPalette::ColorRole role); + QColor getColorFromPalette( QPalette::ColorRole role ); + void drawIdentifier( QPainter*, const QRect& ); + void setSymbol( const QwtSymbol* ); + void setSymbolType( const int ); + void setPen( const QPen& ); protected: - virtual void drawIdentifier( QPainter*, const QRect& ) const; - virtual void drawText(QPainter *, const QRect &); + virtual void drawText( QPainter*, const QRectF& ); + virtual void paintEvent( QPaintEvent* ); private: @@ -62,26 +68,29 @@ private: int mySpacingCollapsed; int mySpacingExpanded; bool myIsSelected; + QwtSymbol* mySymbol; + int mySymbolType; + QPen myPen; }; class PLOT2D_EXPORT Plot2d_SelectableItem { public: - Plot2d_SelectableItem(); - ~Plot2d_SelectableItem(); - - void setSelected( const bool ); - bool isSelected() const; - - void setLegendPen( const QPen & ); - QPen legendPen() const; - - void setLegendSymbol( const QwtSymbol& ); - QwtSymbol legendSymbol() const; - + Plot2d_SelectableItem(); + ~Plot2d_SelectableItem(); + + void setSelected( const bool ); + bool isSelected() const; + + void setLegendPen( const QPen& ); + QPen legendPen() const; + + void setLegendSymbol( const QwtSymbol* ); + QwtSymbol* legendSymbol() const; + private: bool myIsSelected; QPen myLegendPen; - QwtSymbol myLegendSymbol; + QwtSymbol* myLegendSymbol; }; class PLOT2D_EXPORT Plot2d_QwtPlotCurve : public QwtPlotCurve, public Plot2d_SelectableItem @@ -92,27 +101,28 @@ public: public: virtual void setYAxisIdentifierEnabled( const bool ); - virtual void draw(QPainter *p, - const QwtScaleMap &xMap, - const QwtScaleMap &yMap, - int from, int to) const; + virtual void drawSeries( QPainter* p, + const QwtScaleMap& xMap, + const QwtScaleMap& yMap, + const QRectF& canvasRect, + int from, int to) const; - void setDeviationData(const double* min, const double* max, const QList &idx); + void setDeviationData( const double* min, const double* max, const QList& idx ); bool hasDeviationData() const; void clearDeviationData(); - protected: - virtual void updateLegend( QwtLegend* ) const; - virtual QWidget* legendItem() const; + virtual void updateLegend( const QwtPlotItem*, + const QList& ); + virtual void itemChanged(); QColor deviationMarkerColor() const; int deviationMarkerLineWidth() const; int deviationMarkerTickSize() const; private: - QwtPlot::Axis myYAxis; - bool myYAxisIdentifierEnabled; + QwtPlot::Axis myYAxis; + bool myYAxisIdentifierEnabled; class Plot2d_DeviationData; Plot2d_DeviationData* myDeviationData; @@ -131,8 +141,8 @@ public: explicit Plot2d_HistogramQwtItem( const QwtText& ); virtual ~Plot2d_HistogramQwtItem(); - void setData( const QwtIntervalData& ); - const QwtIntervalData& data() const; + void setData( const QwtIntervalSeriesData& ); + const QwtIntervalSeriesData& data() const; void setColor( const QColor& ); QColor color() const; @@ -140,7 +150,7 @@ public: virtual QwtDoubleRect boundingRect() const; virtual int rtti() const; virtual void draw( QPainter*, const QwtScaleMap&, - const QwtScaleMap&, const QRect& ) const; + const QwtScaleMap&, const QRectF& ) const; void setBaseline( double ); double baseline() const; @@ -156,7 +166,7 @@ private: private: int myAttributes; - QwtIntervalData myData; + QwtIntervalSeriesData myData; QColor myColor; double myReference; }; @@ -168,25 +178,34 @@ public: explicit Plot2d_HistogramItem( const QwtText& ); virtual ~Plot2d_HistogramItem(); - QList getBars() const; + QList getBars() const; - virtual void updateLegend( QwtLegend* ) const; - virtual void draw( QPainter*, const QwtScaleMap&, - const QwtScaleMap&, const QRect& ) const; + virtual void updateLegend( QwtPlotItem*, + QList& ); + virtual void draw( QPainter*, const QwtScaleMap&, + const QwtScaleMap&, const QRectF& ) const; + + void setCrossItems( bool theCross ); + bool isCrossItems() const; - void setCrossItems( bool theCross ); - bool isCrossItems() const; +protected: + void drawRectAndLowers( QPainter*, Qt::Orientation, + const QRect& ) const; + int getCrossedTop( const QRect& ) const; protected: - void drawRectAndLowers( QPainter*, Qt::Orientation, - const QRect& ) const; - int getCrossedTop( const QRect& ) const; + QList myBarItems; + bool myCrossed; +}; - virtual QWidget* legendItem() const; +class PLOT2D_EXPORT Plot2d_QwtLegend : public QwtLegend +{ +public: + explicit Plot2d_QwtLegend( QWidget *parent = NULL ); + virtual ~Plot2d_QwtLegend(); protected: - QList myBarItems; - bool myCrossed; + virtual QWidget* createWidget( const QwtLegendData& ) const; }; #endif // PLOT2D_PLOTITEMS_H diff --git a/src/Plot2d/Plot2d_SetupViewDlg.cxx b/src/Plot2d/Plot2d_SetupViewDlg.cxx index 814a28932..712371428 100755 --- a/src/Plot2d/Plot2d_SetupViewDlg.cxx +++ b/src/Plot2d/Plot2d_SetupViewDlg.cxx @@ -89,19 +89,6 @@ Plot2d_SetupViewDlg::Plot2d_SetupViewDlg( QWidget* parent, myCurveCombo->addItem( tr( "PLOT2D_CURVE_TYPE_LINES" ) ); myCurveCombo->addItem( tr( "PLOT2D_CURVE_TYPE_SPLINE" ) ); - // legend - myLegendCheck = new QCheckBox( tr( "PLOT2D_ENABLE_LEGEND" ), this ); - myLegendCombo = new QComboBox( this ); - myLegendFont = new QtxFontEdit( this ); - myLegendColor = new QtxColorButton( this ); - QLabel* aLegendFontLab = new QLabel( tr( "PLOT2D_LEGEND_FONT" ), this ); - myLegendCombo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - myLegendCombo->setMinimumWidth( MIN_COMBO_WIDTH ); - myLegendCombo->addItem( tr( "PLOT2D_LEGEND_POSITION_LEFT" ) ); - myLegendCombo->addItem( tr( "PLOT2D_LEGEND_POSITION_RIGHT" ) ); - myLegendCombo->addItem( tr( "PLOT2D_LEGEND_POSITION_TOP" ) ); - myLegendCombo->addItem( tr( "PLOT2D_LEGEND_POSITION_BOTTOM" ) ); - // marker size QLabel* aMarkerLab = new QLabel( tr( "PLOT2D_MARKER_SIZE_LBL" ), this ); myMarkerSpin = new QSpinBox( this ); @@ -115,6 +102,68 @@ Plot2d_SetupViewDlg::Plot2d_SetupViewDlg( QWidget* parent, QLabel* aBGLab = new QLabel( tr( "PLOT2D_BACKGROUND_COLOR_LBL" ), this ); myBackgroundBtn = new QtxColorButton( this ); + // selection color + QLabel* aSelectionLab = new QLabel( tr( "PLOT2D_SELECTION_COLOR_LBL" ), this ); + mySelectionBtn = new QtxColorButton( this ); + + QHBoxLayout* ViewerColorLayout = new QHBoxLayout; + ViewerColorLayout->addWidget( aBGLab ); + ViewerColorLayout->addWidget( myBackgroundBtn ); + ViewerColorLayout->addStretch(); + ViewerColorLayout->addWidget( aSelectionLab ); + ViewerColorLayout->addWidget( mySelectionBtn ); + ViewerColorLayout->addStretch(); + + // legend + QGroupBox* aLegendGrp = new QGroupBox( tr( "PLOT2D_LEGEND_GROUP" ), this ); + QGridLayout* aLegendLayout = new QGridLayout( aLegendGrp ); + aLegendLayout->setMargin( MARGIN_SIZE ); aLegendLayout->setSpacing( SPACING_SIZE ); + aLegendGrp->setLayout( aLegendLayout ); + + myLegendCheck = new QCheckBox( tr( "PLOT2D_ENABLE_LEGEND" ), this ); + + QLabel* aLegendPosition = new QLabel( tr( "PLOT2D_LEGEND_POSITION" ), this ); + myLegendCombo = new QComboBox( this ); + myLegendCombo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myLegendCombo->setMinimumWidth( MIN_COMBO_WIDTH ); + myLegendCombo->addItem( tr( "PLOT2D_LEGEND_POSITION_LEFT" ) ); + myLegendCombo->addItem( tr( "PLOT2D_LEGEND_POSITION_RIGHT" ) ); + myLegendCombo->addItem( tr( "PLOT2D_LEGEND_POSITION_TOP" ) ); + myLegendCombo->addItem( tr( "PLOT2D_LEGEND_POSITION_BOTTOM" ) ); + + QLabel* aLegendSymbolType = new QLabel( tr( "PLOT2D_LEGEND_SYMBOL_TYPE" ), this ); + myLegendSymbolType = new QComboBox( this ); + myLegendSymbolType->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myLegendSymbolType->setMinimumWidth( MIN_COMBO_WIDTH ); + myLegendSymbolType->addItem( tr( "PLOT2D_MARKER_ON_LINE" ) ); + myLegendSymbolType->addItem( tr( "PLOT2D_MARKER_ABOVE_LINE" ) ); + + QLabel* aLegendFontLab = new QLabel( tr( "PLOT2D_LEGEND_FONT" ), this ); + myLegendFont = new QtxFontEdit( this ); + + QLabel* aLegendFontColor = new QLabel( tr( "PLOT2D_LEGEND_FONT_COLOR" ), this ); + myLegendFontColor = new QtxColorButton( this ); + + QLabel* aSelectLegendFontColor = new QLabel( tr( "PLOT2D_SELECTED_LEGEND_FONT_COLOR" ), this ); + mySelectedLegendFontColor = new QtxColorButton( this ); + + QHBoxLayout* FontLayout = new QHBoxLayout; + FontLayout->addWidget( aLegendFontColor ); + FontLayout->addWidget( myLegendFontColor ); + FontLayout->addStretch(); + FontLayout->addWidget( aSelectLegendFontColor ); + FontLayout->addWidget( mySelectedLegendFontColor ); + FontLayout->addStretch(); + + aLegendLayout->addWidget( myLegendCheck, 0, 0 ); + aLegendLayout->addWidget( aLegendPosition, 1, 0 ); + aLegendLayout->addWidget( myLegendCombo, 1, 1 ); + aLegendLayout->addWidget( aLegendSymbolType, 2, 0 ); + aLegendLayout->addWidget( myLegendSymbolType, 2, 1 ); + aLegendLayout->addWidget( aLegendFontLab, 3, 0 ); + aLegendLayout->addWidget( myLegendFont, 3, 1 ); + aLegendLayout->addLayout( FontLayout, 4, 0, 1, 2 ); + //Deviation marker parameters QGroupBox* aDeviationGrp = new QGroupBox( tr( "PLOT2D_DEVIATION_MARKER_TLT" ), this ); QHBoxLayout* aDeviationLayout = new QHBoxLayout(aDeviationGrp); @@ -375,30 +424,21 @@ Plot2d_SetupViewDlg::Plot2d_SetupViewDlg( QWidget* parent, btnLayout->addWidget( myHelpBtn ); // layout widgets - topLayout->addWidget( myTitleCheck, 0, 0 ); - topLayout->addWidget( myTitleEdit, 0, 1, 1, 3 ); - topLayout->addWidget( myLegendCheck, 1, 0 ); - topLayout->addWidget( myLegendCombo, 1, 1 ); - topLayout->addWidget( aCurveLab, 1, 2 ); - topLayout->addWidget( myCurveCombo, 1, 3 ); - topLayout->addWidget( aLegendFontLab,2, 0 ); - topLayout->addWidget( myLegendFont, 2, 1 ); - topLayout->addWidget( myLegendColor, 2, 2 ); - - topLayout->addWidget( aMarkerLab, 3, 0 ); - topLayout->addWidget( myMarkerSpin, 3, 1 ); - QHBoxLayout* bgLayout = new QHBoxLayout; - bgLayout->addWidget( myBackgroundBtn ); bgLayout->addStretch(); - topLayout->addWidget( aBGLab, 3, 2 ); - topLayout->addLayout( bgLayout, 3, 3 ); - topLayout->addWidget( aDeviationGrp, 4, 0, 1, 4 ); - topLayout->addWidget( aNormalizeGrp, 5, 0, 1, 4 ); - topLayout->addWidget( aScaleGrp, 6, 0, 1, 4 ); - topLayout->addWidget( aTabWidget, 7, 0, 1, 4 ); - topLayout->addWidget( myDefCheck, 8, 0, 1, 4 ); - topLayout->setRowStretch( 9, 5 ); - - topLayout->addLayout( btnLayout, 10, 0, 1, 4 ); + topLayout->addWidget( myTitleCheck, 0, 0 ); + topLayout->addWidget( myTitleEdit, 0, 1, 1, 3 ); + topLayout->addWidget( aCurveLab, 1, 0 ); + topLayout->addWidget( myCurveCombo, 1, 1 ); + topLayout->addWidget( aMarkerLab, 2, 0 ); + topLayout->addWidget( myMarkerSpin, 2, 1 ); + topLayout->addLayout( ViewerColorLayout, 3, 0, 1, 4 ); + topLayout->addWidget( aLegendGrp, 4, 0, 1, 4 ); + topLayout->addWidget( aDeviationGrp, 5, 0, 1, 4 ); + topLayout->addWidget( aNormalizeGrp, 6, 0, 1, 4 ); + topLayout->addWidget( aScaleGrp, 7, 0, 1, 4 ); + topLayout->addWidget( aTabWidget, 8, 0, 1, 4 ); + topLayout->addWidget( myDefCheck, 9, 0, 1, 4 ); + topLayout->setRowStretch( 10, 5 ); + topLayout->addLayout( btnLayout, 11, 0, 1, 4 ); if ( !showDefCheck ) myDefCheck->hide(); @@ -698,12 +738,15 @@ bool Plot2d_SetupViewDlg::getRMinNormMode() \param col legend font color \sa isLegendEnabled(), getLegendPos(), getLegendFont() */ -void Plot2d_SetupViewDlg::setLegend( bool enable, int pos, const QFont& fnt, const QColor& col ) +void Plot2d_SetupViewDlg::setLegend( bool enable, int pos, int symbolType, + const QFont& fnt, const QColor& fontColor, const QColor& selFontColor ) { myLegendCheck->setChecked( enable ); myLegendCombo->setCurrentIndex( pos ); + myLegendSymbolType->setCurrentIndex( symbolType ); myLegendFont->setCurrentFont( fnt ); - myLegendColor->setColor( col ); + myLegendFontColor->setColor( fontColor ); + mySelectedLegendFontColor->setColor( selFontColor ); onLegendChecked(); } @@ -727,6 +770,16 @@ int Plot2d_SetupViewDlg::getLegendPos() return myLegendCombo->currentIndex(); } +/*! + \brief Get legend symbol type. + \return legend symbol type: 0 (marker on line), 1 (marker above line) + \sa setLegend() +*/ +int Plot2d_SetupViewDlg::getLegendSymbolType() +{ + return myLegendSymbolType->currentIndex(); +} + /*! \brief Get legend font. \return legend font @@ -744,7 +797,17 @@ QFont Plot2d_SetupViewDlg::getLegendFont() */ QColor Plot2d_SetupViewDlg::getLegendColor() { - return myLegendColor->color(); + return myLegendFontColor->color(); +} + +/*! + \brief Get selected legend font color. + \return selected legend font color + \sa setLegend() +*/ +QColor Plot2d_SetupViewDlg::getSelectedLegendColor() +{ + return mySelectedLegendFontColor->color(); } /*! @@ -840,6 +903,26 @@ QColor Plot2d_SetupViewDlg::getBackgroundColor() return myBackgroundBtn->color(); } +/*! + \brief Set selection color. + \param color selection color + \sa getSelectionColor() +*/ +void Plot2d_SetupViewDlg::setSelectionColor( const QColor& color ) +{ + mySelectionBtn->setColor( color ); +} + +/*! + \brief Get selection color. + \return selection color + \sa setSelectionColor() +*/ +QColor Plot2d_SetupViewDlg::getSelectionColor() +{ + return mySelectionBtn->color(); +} + /*! \brief Set major grid parameters. \param enableX if \c true, horizontal major grid is enabled diff --git a/src/Plot2d/Plot2d_SetupViewDlg.h b/src/Plot2d/Plot2d_SetupViewDlg.h index 1e9f3e4e7..855ce61f3 100755 --- a/src/Plot2d/Plot2d_SetupViewDlg.h +++ b/src/Plot2d/Plot2d_SetupViewDlg.h @@ -73,11 +73,13 @@ public: bool getRMinNormMode(); void setRMinNormMode(const bool); - void setLegend( bool, int, const QFont&, const QColor& ); + void setLegend( bool, int, int, const QFont&, const QColor&, const QColor& ); bool isLegendEnabled(); int getLegendPos(); + int getLegendSymbolType(); QFont getLegendFont(); QColor getLegendColor(); + QColor getSelectedLegendColor(); void setMarkerSize( const int ); int getMarkerSize(); @@ -85,6 +87,9 @@ public: void setBackgroundColor( const QColor& ); QColor getBackgroundColor(); + void setSelectionColor( const QColor& ); + QColor getSelectionColor(); + void setMajorGrid( bool, const int, bool, const int, bool, const int ); void getMajorGrid( bool&, int&, bool&, int&, bool&, int& ); void setMinorGrid( bool, const int, bool, const int, bool, const int ); @@ -133,7 +138,9 @@ private: QLineEdit* myTitleYEdit; QLineEdit* myTitleY2Edit; QtxColorButton* myBackgroundBtn; - QtxColorButton* myLegendColor; + QtxColorButton* mySelectionBtn; + QtxColorButton* myLegendFontColor; + QtxColorButton* mySelectedLegendFontColor; QtxFontEdit* myLegendFont; QCheckBox* myXGridCheck; QSpinBox* myXGridSpin; @@ -150,6 +157,7 @@ private: QComboBox* myCurveCombo; QCheckBox* myLegendCheck; QComboBox* myLegendCombo; + QComboBox* myLegendSymbolType; QSpinBox* myMarkerSpin; QComboBox* myXModeCombo; QComboBox* myYModeCombo; diff --git a/src/Plot2d/Plot2d_ViewFrame.cxx b/src/Plot2d/Plot2d_ViewFrame.cxx index 76caaec02..083f80bce 100755 --- a/src/Plot2d/Plot2d_ViewFrame.cxx +++ b/src/Plot2d/Plot2d_ViewFrame.cxx @@ -74,6 +74,7 @@ #include #include #include +#include #include #include @@ -181,10 +182,11 @@ Plot2d_ViewFrame::Plot2d_ViewFrame( QWidget* parent, const QString& title ) : QWidget (parent, 0), myOperation( NoOpId ), myCurveType( 1 ), - myShowLegend( true ), myLegendPos( 1 ), myLegendFont("Helvetic",12), - myLegendColor(Qt::black), + myShowLegend( true ), myLegendPos( 1 ), myLegendSymbolType( 0 ), myLegendFont("Helvetic",12), + myLegendColor(Qt::black), mySelectedLegendFontColor( Qt::darkBlue ), myMarkerSize( DEFAULT_MARKER_SIZE ), myBackground( Qt::white ), + mySelectionColor( Qt::gray ), myTitle( "" ), myXTitle( "" ), myYTitle( "" ), myY2Title( "" ), myTitleEnabled( true ), myXTitleEnabled( true ), myYTitleEnabled( true ), myY2TitleEnabled (true), @@ -206,18 +208,6 @@ Plot2d_ViewFrame::Plot2d_ViewFrame( QWidget* parent, const QString& title ) aLayout->addWidget( myPlot ); - // createActions(); - connect( myPlot, SIGNAL( legendClicked( QwtPlotItem* ) ), - this, SIGNAL( legendClicked( QwtPlotItem* ) ) ); - - // IPAL 21465 - /* connect( myPlot->axisWidget( QwtPlot::xBottom ), SIGNAL( scaleDivChanged() ), - myPlot, SLOT( onScaleDivChanged() ) ); - connect( myPlot->axisWidget( QwtPlot::yLeft ), SIGNAL( scaleDivChanged() ), - myPlot, SLOT( onScaleDivChanged() ) ); - if (mySecondY) - connect( myPlot->axisWidget( QwtPlot::yRight ), SIGNAL( scaleDivChanged() ), - myPlot, SLOT( onScaleDivChanged() ) );*/ #ifndef NO_SUIT Init(); #endif @@ -236,7 +226,6 @@ void Plot2d_ViewFrame::Init() /* Initial Setup - get from the preferences */ readPreferences(); - myPlot->setMargin( 5 ); setCurveType( myCurveType, false ); setXGrid( myXGridMajorEnabled, myXGridMaxMajor, myXGridMinorEnabled, myXGridMaxMinor, false ); setYGrid( myYGridMajorEnabled, myYGridMaxMajor, myYGridMinorEnabled, myYGridMaxMinor, @@ -251,9 +240,12 @@ void Plot2d_ViewFrame::Init() setHorScaleMode( myXMode, false ); setVerScaleMode( myYMode, false ); setBackgroundColor( myBackground ); + setSelectionColor( mySelectionColor ); setLegendPos( myLegendPos ); + setLegendSymbolType( myLegendSymbolType ); setLegendFont( myLegendFont ); setLegendFontColor( myLegendColor ); + setSelectedLegendFontColor( mySelectedLegendFontColor ); showLegend( myShowLegend, false ); myPlot->replot(); @@ -272,6 +264,21 @@ void Plot2d_ViewFrame::Init() } myPlot->canvas()->installEventFilter( this ); } +void Plot2d_ViewFrame::SetPreference() +{ + readPreferences(); + setBackgroundColor( myBackground ); + setSelectionColor( mySelectionColor ); + setCurveType( myCurveType, true ); + setMarkerSize( myMarkerSize, true ); + showLegend( myShowLegend, true ); + setLegendPos( myLegendPos ); + setLegendSymbolType( myLegendSymbolType ); + setLegendFont( myLegendFont ); + setLegendFontColor( myLegendColor ); + setSelectedLegendFontColor( mySelectedLegendFontColor ); + myPlot->replot(); +} /*! Gets window's central widget */ @@ -465,10 +472,13 @@ void Plot2d_ViewFrame::readPreferences() myShowLegend = resMgr->booleanValue( "Plot2d", "ShowLegend", myShowLegend ); myLegendPos = resMgr->integerValue( "Plot2d", "LegendPos", myLegendPos ); + myLegendSymbolType = resMgr->integerValue( "Plot2d", "LegendSymbolType", myLegendSymbolType ); myLegendFont = resMgr->fontValue( "Plot2d", "LegendFont", myLegendFont ); myLegendColor = resMgr->colorValue( "Plot2d", "LegendFontColor", myLegendColor ); + mySelectedLegendFontColor = resMgr->colorValue( "Plot2d", "SelectedLegendFontColor", mySelectedLegendFontColor ); myMarkerSize = resMgr->integerValue( "Plot2d", "MarkerSize", myMarkerSize ); myBackground = resMgr->colorValue( "Plot2d", "Background", myBackground ); + mySelectionColor = resMgr->colorValue( "Plot2d", "SelectionColor", mySelectionColor ); myTitleEnabled = resMgr->booleanValue( "Plot2d", "ShowTitle", myTitleEnabled ); myXTitleEnabled = resMgr->booleanValue( "Plot2d", "ShowHorTitle", myXTitleEnabled ); @@ -519,13 +529,19 @@ void Plot2d_ViewFrame::writePreferences() resMgr->setValue( "Plot2d", "CurveType", myCurveType ); resMgr->setValue( "Plot2d", "ShowLegend", myShowLegend ); resMgr->setValue( "Plot2d", "LegendPos", myLegendPos ); + resMgr->setValue( "Plot2d", "LegendSymbolType", myLegendSymbolType ); resMgr->setValue( "Plot2d", "LegendFont", myLegendFont ); resMgr->setValue( "Plot2d", "LegendFontColor", myLegendColor ); + resMgr->setValue( "Plot2d", "SelectedLegendFontColor", mySelectedLegendFontColor ); resMgr->setValue( "Plot2d", "MarkerSize", myMarkerSize ); resMgr->setValue( "Plot2d", "Background", myBackground ); + resMgr->setValue( "Plot2d", "SelectionColor", mySelectionColor ); resMgr->setValue( "Plot2d", "ShowTitle", myTitleEnabled ); resMgr->setValue( "Plot2d", "ShowHorTitle", myXTitleEnabled ); resMgr->setValue( "Plot2d", "ShowVerLeftTitle", myYTitleEnabled ); + resMgr->setValue( "Plot2d", "DeviationMarkerColor", myPlot->property(PLOT2D_DEVIATION_COLOR).value() ); + resMgr->setValue( "Plot2d", "DeviationMarkerLineWidth", myPlot->property(PLOT2D_DEVIATION_LW).toInt() ); + resMgr->setValue( "Plot2d", "DeviationMarkerTickSize", myPlot->property(PLOT2D_DEVIATION_TS).toInt() ); if ( mySecondY ) resMgr->setValue( "Plot2d", "ShowVerRightTitle", myY2TitleEnabled ); @@ -567,8 +583,8 @@ QString Plot2d_ViewFrame::getInfo( const QPoint& pnt ) QwtValueList aTicks; bool xFound = false, yFound = false; double xCoord, yCoord; - const QwtScaleDiv* aXscale = myPlot->axisScaleDiv( QwtPlot::xBottom ); - aTicks = aXscale->ticks( QwtScaleDiv::MajorTick ); + const QwtScaleDiv& aXscale = myPlot->axisScaleDiv( QwtPlot::xBottom ); + aTicks = aXscale.ticks( QwtScaleDiv::MajorTick ); for ( i = 0; i < aTicks.count(); i++ ) { double majXmark = aTicks[i]; int xmark = myPlot->transform( QwtPlot::xBottom, majXmark ); @@ -579,7 +595,7 @@ QString Plot2d_ViewFrame::getInfo( const QPoint& pnt ) } } if ( !xFound ) { - aTicks = aXscale->ticks( QwtScaleDiv::MinorTick ); + aTicks = aXscale.ticks( QwtScaleDiv::MinorTick ); for ( i = 0; i < aTicks.count(); i++ ) { double minXmark = aTicks[i]; int xmark = myPlot->transform( QwtPlot::xBottom, minXmark ); @@ -590,8 +606,8 @@ QString Plot2d_ViewFrame::getInfo( const QPoint& pnt ) } } } - const QwtScaleDiv* aYscale = myPlot->axisScaleDiv( QwtPlot::yLeft ); - aTicks = aYscale->ticks( QwtScaleDiv::MajorTick ); + const QwtScaleDiv& aYscale = myPlot->axisScaleDiv( QwtPlot::yLeft ); + aTicks = aYscale.ticks( QwtScaleDiv::MajorTick ); for ( i = 0; i < aTicks.count(); i++ ) { double majYmark = aTicks[i]; int ymark = myPlot->transform( QwtPlot::yLeft, majYmark ); @@ -602,7 +618,7 @@ QString Plot2d_ViewFrame::getInfo( const QPoint& pnt ) } } if ( !yFound ) { - aTicks = aYscale->ticks( QwtScaleDiv::MinorTick ); + aTicks = aYscale.ticks( QwtScaleDiv::MinorTick ); for ( i = 0; i < aTicks.count(); i++ ) { double minYmark = aTicks[i]; int ymark = myPlot->transform( QwtPlot::yLeft, minYmark ); @@ -626,8 +642,8 @@ QString Plot2d_ViewFrame::getInfo( const QPoint& pnt ) bool yFound2 = false; double yCoord2; - const QwtScaleDiv* aYscale2 = myPlot->axisScaleDiv( QwtPlot::yRight ); - aTicks = aYscale2->ticks( QwtScaleDiv::MajorTick ); + const QwtScaleDiv& aYscale2 = myPlot->axisScaleDiv( QwtPlot::yRight ); + aTicks = aYscale2.ticks( QwtScaleDiv::MajorTick ); for ( i = 0; i < aTicks.count(); i++ ) { double majYmark = aTicks[i]; int ymark = myPlot->transform( QwtPlot::yRight, majYmark ); @@ -638,7 +654,7 @@ QString Plot2d_ViewFrame::getInfo( const QPoint& pnt ) } } if ( !yFound2 ) { - aTicks = aYscale2->ticks( QwtScaleDiv::MinorTick ); + aTicks = aYscale2.ticks( QwtScaleDiv::MinorTick ); for ( i = 0; i < aTicks.count(); i++ ) { double minYmark = aTicks[i]; int ymark = myPlot->transform( QwtPlot::yRight, minYmark ); @@ -731,8 +747,8 @@ QVector< QVector > Plot2d_ViewFrame::displayPlot2dCurveList( con bool displayLegend, const QList< bool >& sides) { // Consider the new legend's entries - // (PB: to update the legend we must remove it and put a new QwtLegend in the QwtPlot) - myPlot->insertLegend( (QwtLegend*)NULL); // we remove here, we shall put at the end + // (PB: to update the legend we must remove it and put a new QwtAbstractLegend in the QwtPlot) + myPlot->insertLegend( (QwtAbstractLegend*)NULL); // we remove here, we shall put at the end int nbAllCurves = curveList.size(); int nbGroups = nbAllCurves / groupSize; @@ -875,9 +891,10 @@ QVector< QVector > Plot2d_ViewFrame::displayPlot2dCurveList( con QwtPlotCurve* plotCurve = dynamic_cast(getPlotObject(plot2dCurve)); vectCurve[ig].push_back(plotCurve); // Modify the points' markers - QwtSymbol symbol(plotCurve->symbol()) ; - symbol.setStyle(symbolStyle1); - symbol.setPen(QPen(color1,lineWidth1)); + QwtSymbol* symbol = new QwtSymbol(plotCurve->symbol()->style(), plotCurve->symbol()->brush(), + plotCurve->symbol()->pen(), plotCurve->symbol()->size()) ; + symbol->setStyle(symbolStyle1); + symbol->setPen(QPen(color1,lineWidth1)); //symbol.setBrush( QBrush( color1)); //QSize size = 0.5*(symbol.size()); //symbol.setSize(size); @@ -1002,7 +1019,7 @@ Plot2d_Curve* Plot2d_ViewFrame::createPlot2dCurve( QString & title, { if (!displayLegend) { - myPlot->insertLegend( (QwtLegend*)NULL); + myPlot->insertLegend( (QwtAbstractLegend*)NULL); } displayCurve( plot2dCurve); @@ -1024,15 +1041,16 @@ Plot2d_Curve* Plot2d_ViewFrame::createPlot2dCurve( QString & title, } // Modify points' markers - QwtSymbol symbol (plotCurve->symbol()) ; - symbol.setStyle( markerKind); + QwtSymbol* symbol = new QwtSymbol( plotCurve->symbol()->style(), plotCurve->symbol()->brush(), + plotCurve->symbol()->pen(), plotCurve->symbol()->size() ) ; + symbol->setStyle( markerKind ); // if (markerKind != QwtSymbol::NoSymbol) { - symbol.setPen( QPen( theColor, lineWidth)); - symbol.setBrush( QBrush( theColor)); - QSize size = 2.0*(symbol.size()); //0.5 - symbol.setSize(size); + symbol->setPen( QPen( theColor, lineWidth)); + symbol->setBrush( QBrush( theColor)); + QSize size = 2.0*(symbol->size()); //0.5 + symbol->setSize(size); } plotCurve->setSymbol( symbol); @@ -1071,14 +1089,14 @@ QwtPlotCurve *Plot2d_ViewFrame::createSegment( double *X, double *Y, int nbPoint QColor & lineColor, QwtSymbol::Style markerKind, bool side) { - QwtPlotCurve* aPCurve = new QwtPlotCurve(); + QwtPlotCurve* aPCurve = new QwtPlotCurve( QString::null ); - aPCurve->setData( X, Y, nbPoint); + aPCurve->setSamples( X, Y, nbPoint); aPCurve->setPen( QPen( lineColor, lineWidth, lineKind)); - QwtSymbol aSymbol; - aSymbol.setStyle( markerKind); - aPCurve->setSymbol( aSymbol); + QwtSymbol* aSymbol; + aSymbol->setStyle( markerKind ); + aPCurve->setSymbol( aSymbol ); // The segment must not have legend's entry aPCurve->setItemAttribute( QwtPlotItem::Legend, false); @@ -1254,13 +1272,8 @@ QwtPlotItem* Plot2d_ViewFrame::displayObject( Plot2d_Object* object, bool update Plot2d_Curve* aCurve = dynamic_cast( object ); if ( aCurve ) { - //myMarkerSize = 1; - //aCurve->setMarkerSize( myMarkerSize ); - - if (aCurve->getMarkerSize() == 0) - { - aCurve->setMarkerSize( myMarkerSize ); - } + if ( aCurve->getMarkerSize() == 0 ) + aCurve->setMarkerSize( myMarkerSize ); processFiltering(update); updatePlotItem( aCurve, anItem ); @@ -1409,10 +1422,12 @@ void Plot2d_ViewFrame::updateLegend( const Plot2d_Prs* prs ) update legend */ void Plot2d_ViewFrame::updateLegend() { - if ( myPlot->getLegend() ) { - ObjectDict::iterator it = myObjects.begin(); - for( ; it != myObjects.end(); ++it ) - it.key()->updateLegend(myPlot->getLegend()); + const QwtPlotItemList& items = myPlot->itemList(); + QwtPlotItemIterator it; + for ( it = items.begin(); it != items.end(); it++ ) { + QwtPlotItem* item = *it; + if ( item ) + item->updateLegend( item, item->legendData() ); } } @@ -1422,14 +1437,7 @@ void Plot2d_ViewFrame::updateLegend() { */ void Plot2d_ViewFrame::fitAll() { - // Postpone fitAll operation until QwtPlot geometry - // has been fully defined - if ( !myPlot->polished() ){ - QApplication::postEvent( this, new QEvent( (QEvent::Type)FITALL_EVENT ) ); - return; - } - - // no need to set auto scaling, it wiil be disabled by setAxisScale() method call + // no need to set auto scaling, it will be disabled by setAxisScale() method call // myPlot->setAxisAutoScale( QwtPlot::yLeft ); // myPlot->setAxisAutoScale( QwtPlot::xBottom ); // myPlot->replot(); @@ -1708,9 +1716,11 @@ void Plot2d_ViewFrame::onSettings() if (mySecondY) dlg->setY2Title( myY2TitleEnabled, myY2Title ); dlg->setCurveType( myCurveType ); - dlg->setLegend( myShowLegend, myLegendPos, myLegendFont, myLegendColor ); + dlg->setLegend( myShowLegend, myLegendPos, myLegendSymbolType, myLegendFont, + myLegendColor, mySelectedLegendFontColor ); dlg->setMarkerSize( myMarkerSize ); dlg->setBackgroundColor( myBackground ); + dlg->setSelectionColor( mySelectionColor ); dlg->setScaleMode(myXMode, myYMode); dlg->setLMinNormMode(myNormLMin); dlg->setLMaxNormMode(myNormLMax); @@ -1759,6 +1769,9 @@ void Plot2d_ViewFrame::onSettings() } if ( myLegendPos != dlg->getLegendPos() ) { setLegendPos( dlg->getLegendPos() ); + } + if ( myLegendSymbolType != dlg->getLegendSymbolType() ) { + setLegendSymbolType( dlg->getLegendSymbolType() ); } if ( myLegendFont != dlg->getLegendFont() ) { setLegendFont( dlg->getLegendFont() ); @@ -1766,6 +1779,9 @@ void Plot2d_ViewFrame::onSettings() if ( myLegendColor != dlg->getLegendColor() ) { setLegendFontColor( dlg->getLegendColor() ); } + if ( mySelectedLegendFontColor != dlg->getSelectedLegendColor() ) { + setSelectedLegendFontColor( dlg->getSelectedLegendColor() ); + } // marker size if ( myMarkerSize != dlg->getMarkerSize() ) { @@ -1775,6 +1791,10 @@ void Plot2d_ViewFrame::onSettings() if ( myBackground != dlg->getBackgroundColor() ) { setBackgroundColor( dlg->getBackgroundColor() ); } + // selection color + if ( mySelectionColor != dlg->getSelectionColor() ) { + setSelectionColor( dlg->getSelectionColor() ); + } // grid bool aXGridMajorEnabled, aXGridMinorEnabled, aYGridMajorEnabled, aYGridMinorEnabled, aY2GridMajorEnabled, aY2GridMinorEnabled; @@ -1857,9 +1877,9 @@ void Plot2d_ViewFrame::updateAnalyticalCurve(Plot2d_AnalyticalCurve* c, bool upd { #ifndef DISABLE_PYCONSOLE if(!c) return; - QwtScaleDiv* div = myPlot->axisScaleDiv(QwtPlot::xBottom); - c->setRangeBegin(div->lowerBound()); - c->setRangeEnd(div->upperBound()); + QwtScaleDiv div = myPlot->axisScaleDiv(QwtPlot::xBottom); + c->setRangeBegin(div.lowerBound()); + c->setRangeEnd(div.upperBound()); c->calculate(); c->setMarkerSize(myMarkerSize); QwtPlotItem* item = c->plotItem(); @@ -1869,6 +1889,7 @@ void Plot2d_ViewFrame::updateAnalyticalCurve(Plot2d_AnalyticalCurve* c, bool upd if( c->isActive() ) { c->updatePlotItem(); item->attach( myPlot ); + item->itemChanged(); item->show(); } c->setAction(Plot2d_AnalyticalCurve::ActNothing); @@ -2020,19 +2041,31 @@ void Plot2d_ViewFrame::showLegend( bool show, bool update ) { myShowLegend = show; if ( myShowLegend ) { - QwtLegend* legend = myPlot->legend(); - if ( !legend ) { - legend = new QwtLegend( myPlot ); + QwtAbstractLegend* absLegend = myPlot->legend(); + QwtLegend* legend = 0; + if ( !absLegend ) { + legend = new Plot2d_QwtLegend( myPlot ); + legend->setDefaultItemMode(QwtLegendData::Clickable); + connect( legend, SIGNAL( clicked (const QVariant&, int) ), + this, SIGNAL( clicked (const QVariant&, int) ) ); legend->setFrameStyle( QFrame::Box | QFrame::Sunken ); } - legend->setItemMode( QwtLegend::ClickableItem ); - myPlot->insertLegend( legend ); - setLegendPos( myLegendPos ); - setLegendFont( myLegendFont ); - setLegendFontColor( myLegendColor ); + else { + legend = dynamic_cast(absLegend); + } + if(legend) { + myPlot->insertLegend( legend ); + setLegendPos( myLegendPos ); + setLegendFont( myLegendFont ); + setLegendFontColor( myLegendColor ); + } } else myPlot->insertLegend( 0 ); + + if( show && update ) + updateLegend(); + if ( update ) myPlot->replot(); } @@ -2043,7 +2076,7 @@ void Plot2d_ViewFrame::showLegend( bool show, bool update ) void Plot2d_ViewFrame::setLegendPos( int pos ) { myLegendPos = pos; - QwtLegend* legend = myPlot->legend(); + QwtAbstractLegend* legend = myPlot->legend(); if ( legend ) { switch( pos ) { case 0: @@ -2070,13 +2103,31 @@ int Plot2d_ViewFrame::getLegendPos() const return myLegendPos; } +/*! + Sets legend symbol type : 0 - marker on line, 1 - marker above line +*/ +void Plot2d_ViewFrame::setLegendSymbolType( int type ) +{ + myLegendSymbolType = type; + myPlot->setLegendSymbolType( type ); + updateLegend(); +} + +/*! + Gets legend symbol type : 0 - marker on line, 1 - marker above line +*/ +int Plot2d_ViewFrame::getLegendSymbolType() const +{ + return myLegendSymbolType; +} + /*! Sets legend font */ void Plot2d_ViewFrame::setLegendFont( const QFont& fnt ) { myLegendFont = fnt; - QwtLegend* legend = myPlot->legend(); + QwtAbstractLegend* legend = myPlot->legend(); if ( legend ) { legend->setFont(fnt); } @@ -2090,21 +2141,13 @@ QFont Plot2d_ViewFrame::getLegendFont() const return myLegendFont; } -/*! - Gets legend font color -*/ -QColor Plot2d_ViewFrame::getLegendFontColor() const -{ - return myLegendColor; -} - /*! Sets legend font color */ void Plot2d_ViewFrame::setLegendFontColor( const QColor& col ) { myLegendColor = col; - QwtLegend* legend = myPlot->legend(); + QwtAbstractLegend* legend = myPlot->legend(); if ( legend ) { QPalette pal = legend->palette(); pal.setColor( QPalette::Text, col ); @@ -2112,6 +2155,31 @@ void Plot2d_ViewFrame::setLegendFontColor( const QColor& col ) } } +/*! + Gets legend font color +*/ +QColor Plot2d_ViewFrame::getLegendFontColor() const +{ + return myLegendColor; +} + +/*! + Sets selected legend font color +*/ +void Plot2d_ViewFrame::setSelectedLegendFontColor( const QColor& col ) +{ + mySelectedLegendFontColor = col; + Plot2d_Object::setHighlightedLegendTextColor( col ); +} + +/*! + Gets selected legend font color +*/ +QColor Plot2d_ViewFrame::getSelectedLegendFontColor() const +{ + return mySelectedLegendFontColor; +} + /*! Sets new marker size */ @@ -2126,11 +2194,11 @@ void Plot2d_ViewFrame::setMarkerSize( const int size, bool update ) QwtPlotCurve* crv = it.key(); if ( crv ) { - QwtSymbol aSymbol = crv->symbol(); - aSymbol.setSize( myMarkerSize, myMarkerSize ); + QwtSymbol* aSymbol = new QwtSymbol( crv->symbol()->style(), crv->symbol()->brush(), + crv->symbol()->pen(), QSize( myMarkerSize, myMarkerSize ) ); crv->setSymbol( aSymbol ); - if(it.value()) - it.value()->setMarkerSize( myMarkerSize ); + if( it.value() ) + it.value()->setMarkerSize( myMarkerSize ); } } if ( update ) @@ -2165,6 +2233,7 @@ void Plot2d_ViewFrame::setBackgroundColor( const QColor& color ) } Repaint(); } + /*! Gets background color */ @@ -2172,6 +2241,24 @@ QColor Plot2d_ViewFrame::backgroundColor() const { return myBackground; } + +/*! + Sets selection color +*/ +void Plot2d_ViewFrame::setSelectionColor( const QColor& color ) +{ + mySelectionColor = color; + Plot2d_Object::setSelectionColor( color ); +} + +/*! + Gets selection color +*/ +QColor Plot2d_ViewFrame::selectionColor() const +{ + return mySelectionColor; +} + /*! Sets hor.axis grid parameters */ @@ -2188,8 +2275,8 @@ void Plot2d_ViewFrame::setXGrid( bool xMajorEnabled, const int xMajorMax, myPlot->setAxisMaxMinor( QwtPlot::xBottom, myXGridMaxMinor ); QwtPlotGrid* grid = myPlot->grid(); - if ( myPlot->axisScaleDiv( QwtPlot::xBottom ) ) - grid->setXDiv( *myPlot->axisScaleDiv( QwtPlot::xBottom ) ); + if ( !myPlot->axisScaleDiv( QwtPlot::xBottom ).isEmpty() ) + grid->setXDiv( myPlot->axisScaleDiv( QwtPlot::xBottom ) ); grid->enableX( myXGridMajorEnabled ); grid->enableXMin( myXGridMinorEnabled ); @@ -2225,8 +2312,8 @@ void Plot2d_ViewFrame::setYGrid( bool yMajorEnabled, const int yMajorMax, } QwtPlotGrid* grid = myPlot->grid(); - if ( myPlot->axisScaleDiv( QwtPlot::yLeft ) ) - grid->setYDiv( *myPlot->axisScaleDiv( QwtPlot::yLeft ) ); + if ( !myPlot->axisScaleDiv( QwtPlot::yLeft ).isEmpty() ) + grid->setYDiv( myPlot->axisScaleDiv( QwtPlot::yLeft ) ); if (mySecondY) { if (myYGridMajorEnabled) { @@ -2234,8 +2321,8 @@ void Plot2d_ViewFrame::setYGrid( bool yMajorEnabled, const int yMajorMax, grid->enableYMin( myYGridMinorEnabled ); } else if (myY2GridMajorEnabled) { - if ( myPlot->axisScaleDiv( QwtPlot::yRight ) ) - grid->setYDiv( *myPlot->axisScaleDiv( QwtPlot::yRight ) ); + if ( !myPlot->axisScaleDiv( QwtPlot::yRight ).isEmpty() ) + grid->setYDiv( myPlot->axisScaleDiv( QwtPlot::yRight ) ); grid->enableY( myY2GridMajorEnabled ); grid->enableYMin( myY2GridMinorEnabled ); } @@ -2353,6 +2440,12 @@ void Plot2d_ViewFrame::setHorScaleMode( const int mode, bool update ) myXMode = mode; + // set bounds of logarithmic scale + if( myXMode != 0 ) { + myPlot->setAxisScale( QwtPlot::xBottom, 1.0, 1e5 ); + myPlot->updateAxes(); + } + myPlot->setLogScale(QwtPlot::xBottom, myXMode != 0); if ( update ) @@ -2389,9 +2482,21 @@ void Plot2d_ViewFrame::setVerScaleMode( const int mode, bool update ) } myYMode = mode; + + // set bounds of logarithmic scale + if( myYMode != 0 ){ + myPlot->setAxisScale( QwtPlot::yLeft, 1.0, 1e5 ); + myPlot->updateAxes(); + } + myPlot->setLogScale(QwtPlot::yLeft, myYMode != 0); - if (mySecondY) + if (mySecondY) { + if( myYMode != 0 ){ + myPlot->setAxisScale( QwtPlot::yRight, 1.0, 1e5 ); + myPlot->updateAxes(); + } myPlot->setLogScale( QwtPlot::yRight, myYMode != 0 ); + } if ( update ) fitAll(); @@ -2878,7 +2983,7 @@ void Plot2d_ViewFrame::setEnableAxis( QwtPlot::Axis theAxis, bool isEnable ) class Plot2d_QwtPlotZoomer : public QwtPlotZoomer { public: - Plot2d_QwtPlotZoomer( int xAxis, int yAxis, QwtPlotCanvas* canvas ) + Plot2d_QwtPlotZoomer( int xAxis, int yAxis, QWidget* canvas ) : QwtPlotZoomer( xAxis, yAxis, canvas ) { qApp->installEventFilter( this ); @@ -2893,7 +2998,6 @@ public: */ Plot2d_Plot2d::Plot2d_Plot2d( QWidget* parent ) : QwtPlot( parent ), - myIsPolished( false ), myPicker( 0 ) { // Create alternative scales @@ -2902,7 +3006,6 @@ Plot2d_Plot2d::Plot2d_Plot2d( QWidget* parent ) setAxisScaleDraw( QwtPlot::yRight, new Plot2d_ScaleDraw() ); myPlotZoomer = new Plot2d_QwtPlotZoomer( QwtPlot::xBottom, QwtPlot::yLeft, canvas() ); - myPlotZoomer->setSelectionFlags( QwtPicker::DragSelection | QwtPicker::CornerToCorner ); myPlotZoomer->setTrackerMode( QwtPicker::AlwaysOff ); myPlotZoomer->setRubberBand( QwtPicker::RectRubberBand ); myPlotZoomer->setRubberBandPen( QColor( Qt::green ) ); @@ -2917,7 +3020,7 @@ Plot2d_Plot2d::Plot2d_Plot2d( QWidget* parent ) myScaleDraw = NULL; // grid myGrid = new QwtPlotGrid(); - QPen aMajPen = myGrid->majPen(); + QPen aMajPen = myGrid->majorPen(); aMajPen.setStyle( Qt::DashLine ); myGrid->setPen( aMajPen ); @@ -2947,7 +3050,7 @@ Plot2d_Plot2d::~Plot2d_Plot2d() void Plot2d_Plot2d::setLogScale( int axisId, bool log10 ) { if ( log10 ) - setAxisScaleEngine( axisId, new QwtLog10ScaleEngine() ); + setAxisScaleEngine( axisId, new QwtLogScaleEngine() ); else setAxisScaleEngine( axisId, new QwtLinearScaleEngine() ); } @@ -2984,7 +3087,7 @@ void Plot2d_Plot2d::replot() /*! Get legend */ -QwtLegend* Plot2d_Plot2d::getLegend() +QwtAbstractLegend* Plot2d_Plot2d::getLegend() { #if QWT_VERSION < 0x040200 return d_legend; @@ -3016,12 +3119,14 @@ void Plot2d_Plot2d::defaultPicker() myPlotZoomer->setMousePattern( QwtEventPattern::MouseSelect1, Qt::RightButton, Qt::ControlModifier ); // zooming button for ( int i = QwtEventPattern::MouseSelect2; i < QwtEventPattern::MouseSelect6; i++ ) - myPlotZoomer->setMousePattern( i, Qt::NoButton, Qt::NoButton ); + myPlotZoomer->setMousePattern( (QwtEventPattern::MousePatternCode)i, Qt::NoButton, + Qt::NoModifier ); } void Plot2d_Plot2d::setPickerMousePattern( int button, int state ) { - myPlotZoomer->setMousePattern( QwtEventPattern::MouseSelect1, button, state ); + myPlotZoomer->setMousePattern( QwtEventPattern::MouseSelect1, (Qt::MouseButton)button, + (Qt::KeyboardModifiers)state ); } /*! @@ -3035,11 +3140,11 @@ void Plot2d_Plot2d::setPicker( Plot2d_QwtPlotPicker *picker) /*! * Create marker and tooltip associed with a point */ -QwtPlotMarker* Plot2d_Plot2d::createMarkerAndTooltip( QwtSymbol symbol, - double X, - double Y, - QString & tooltip, - Plot2d_QwtPlotPicker *picker) +QwtPlotMarker* Plot2d_Plot2d::createMarkerAndTooltip( QwtSymbol* symbol, + double X, + double Y, + QString & tooltip, + Plot2d_QwtPlotPicker *picker) { QwtPlotMarker* aPlotMarker = new QwtPlotMarker(); @@ -3066,11 +3171,6 @@ QwtPlotMarker* Plot2d_Plot2d::createMarkerAndTooltip( QwtSymbol symbol, return aPlotMarker; } -bool Plot2d_Plot2d::polished() const -{ - return myIsPolished; -} - QwtPlotGrid* Plot2d_Plot2d::grid() const { return myGrid; @@ -3081,44 +3181,6 @@ QwtPlotZoomer* Plot2d_Plot2d::zoomer() const return myPlotZoomer; } -/*! - Slot: checks the current labels format and change it if needed -*/ -void Plot2d_Plot2d::onScaleDivChanged() -{ - QwtScaleWidget* aSW = 0; - if ( ( aSW = dynamic_cast(sender()) ) ) { - int axisId = -1; - switch ( aSW->alignment() ) { - case QwtScaleDraw::BottomScale: - axisId = QwtPlot::xBottom; - break; - case QwtScaleDraw::LeftScale: - axisId = QwtPlot::yLeft; - break; - case QwtScaleDraw::RightScale: - axisId = QwtPlot::yRight; - break; - default: - break; - } - - if ( axisId >= 0 ) { - QwtScaleMap map = canvasMap(axisId); - double aDist = fabs(map.s2()-map.s1()) / (axisMaxMajor(axisId)*axisMaxMinor(axisId)); - - QString aDistStr; - aDistStr.sprintf("%e",aDist); - int aPrecision = aDistStr.right(aDistStr.length()-aDistStr.indexOf('e')-2).toInt(); - - QwtScaleDraw* aQwtSD = axisScaleDraw(axisId); - Plot2d_ScaleDraw* aPlot2dSD = dynamic_cast(aQwtSD); - if ( ( !aPlot2dSD && aPrecision > 6 ) || ( aPlot2dSD && aPlot2dSD->precision() != aPrecision ) ) - setAxisScaleDraw( axisId, new Plot2d_ScaleDraw(*aQwtSD, 'f', aPrecision) ); - } - } -} - /*! Updates identifiers of Y axis type in the legend. */ @@ -3143,19 +3205,10 @@ void Plot2d_Plot2d::updateYAxisIdentifiers() if ( Plot2d_QwtPlotCurve* aPCurve = dynamic_cast( item ) ) aPCurve->setYAxisIdentifierEnabled( enableYLeft && enableYRight ); if ( item && item->isVisible() && legend() ) - item->updateLegend( legend() ); + item->updateLegend( item, item->legendData() ); } } -/*! - Sets the flag saying that QwtPlot geometry has been fully defined. -*/ -void Plot2d_Plot2d::polish() -{ - QwtPlot::polish(); - myIsPolished = true; -} - // Methods to manage axis graduations /* Create definition and graduations of axes @@ -3360,6 +3413,20 @@ void Plot2d_Plot2d::clearSeparationLineList() mySeparationLineList.clear(); } +/* Set type of legend symbol + */ +void Plot2d_Plot2d::setLegendSymbolType( const int type ) +{ + myLegendSymbolType = type; +} + +/* Get type of legend symbol + */ +int Plot2d_Plot2d::getLegendSymbolType() +{ + return myLegendSymbolType; +} + /*! Creates presentation of object Default implementation is empty @@ -3381,8 +3448,12 @@ void Plot2d_ViewFrame::copyPreferences( Plot2d_ViewFrame* vf ) myCurveType = vf->myCurveType; myShowLegend = vf->myShowLegend; myLegendPos = vf->myLegendPos; + myLegendSymbolType = vf->myLegendSymbolType; + myLegendFont = vf->myLegendFont; + mySelectedLegendFontColor = vf->mySelectedLegendFontColor; myMarkerSize = vf->myMarkerSize; myBackground = vf->myBackground; + mySelectionColor = vf->mySelectionColor; myTitle = vf->myTitle; myXTitle = vf->myXTitle; myYTitle = vf->myYTitle; @@ -3519,22 +3590,24 @@ bool Plot2d_ViewFrame::print( const QString& file, const QString& format ) const if( pd ) { - myPlot->print( *pd ); + QwtPlotRenderer* pr = new QwtPlotRenderer(); + pr->renderTo( myPlot, *pd ); res = true; delete pd; } } return res; #endif + } /** * Print Plot2d window */ -void Plot2d_ViewFrame::printPlot( QPainter* p, const QRect& rect, - const QwtPlotPrintFilter& filter ) const +void Plot2d_ViewFrame::printPlot( QPainter* p, const QRectF& rect) const { - myPlot->print( p, rect, filter ); + QwtPlotRenderer* pr = new QwtPlotRenderer(); + pr->render( myPlot, p, rect ); } /*! @@ -3951,7 +4024,7 @@ void Plot2d_ViewFrame::updatePlotItem(Plot2d_Object* theObject, QwtPlotItem* the xNew[j] = itTmp.value().at(j).first; yNew[j] = itTmp.value().at(j).second; } - cu->setData(xNew, yNew,j); + cu->setSamples(xNew, yNew,j); delete [] xNew; delete [] yNew; if(aNormAlgo->getNormalizationMode() != Plot2d_NormalizeAlgorithm::NormalizeNone) { @@ -3969,7 +4042,7 @@ void Plot2d_ViewFrame::updatePlotItem(Plot2d_Object* theObject, QwtPlotItem* the */ QwtPlotCanvas* Plot2d_ViewFrame::getPlotCanvas() const { - return myPlot ? myPlot->canvas() : 0; + return myPlot ? (QwtPlotCanvas*)myPlot->canvas() : 0; } /*! @@ -4120,21 +4193,13 @@ Plot2d_ScaleDraw::Plot2d_ScaleDraw( char f, int prec ) invalidateCache(); } -Plot2d_ScaleDraw::Plot2d_ScaleDraw( const QwtScaleDraw& scaleDraw, char f, int prec ) - : QwtScaleDraw(scaleDraw), - myFormat(f), - myPrecision(prec) -{ - invalidateCache(); -} - QwtText Plot2d_ScaleDraw::label( double value ) const { - QwtScaleMap m = map(); + QwtScaleMap m = scaleMap(); QString str1 = QwtScaleDraw::label( m.s1() ).text(); QString str2 = QwtScaleDraw::label( m.s2() ).text(); if ( str1 == str2 ) { - double aDist = fabs(map().s2()-map().s1())/5; + double aDist = fabs(scaleMap().s2()-scaleMap().s1())/5; int precision = 0; while (aDist < 1 ) { precision++; @@ -4218,9 +4283,13 @@ void Plot2d_AxisScaleDraw::draw( QPainter* painter, const QPalette & palette) co major_ticks.clear(); major_ticks.append( myTicks); - myPlot->axisScaleDiv(QwtPlot::xBottom)->setTicks(QwtScaleDiv::MajorTick, major_ticks); - myPlot->axisScaleDiv(QwtPlot::xBottom)->setTicks(QwtScaleDiv::MediumTick, medium_ticks); - myPlot->axisScaleDiv(QwtPlot::xBottom)->setTicks(QwtScaleDiv::MinorTick, minor_ticks); + + QwtScaleDiv aScaleDiv = myPlot->axisScaleDiv( QwtPlot::xBottom ); + aScaleDiv.setTicks( QwtScaleDiv::MajorTick, major_ticks ); + aScaleDiv.setTicks( QwtScaleDiv::MediumTick, medium_ticks ); + aScaleDiv.setTicks( QwtScaleDiv::MinorTick, minor_ticks ); + myPlot->setAxisScaleDiv( QwtPlot::xBottom, aScaleDiv ); + QwtScaleDraw *scale = myPlot->axisScaleDraw(QwtPlot::xBottom); ((Plot2d_AxisScaleDraw*)(scale))->applyTicks(); @@ -4294,9 +4363,11 @@ void Plot2d_AxisScaleDraw::applyTicks() medium_ticks.clear(); minor_ticks.clear(); - myPlot->axisScaleDiv(QwtPlot::xBottom)->setTicks(QwtScaleDiv::MajorTick, myTicks); - myPlot->axisScaleDiv(QwtPlot::xBottom)->setTicks(QwtScaleDiv::MediumTick, medium_ticks); - myPlot->axisScaleDiv(QwtPlot::xBottom)->setTicks(QwtScaleDiv::MinorTick, minor_ticks); + QwtScaleDiv aQwtScaleDiv = myPlot->axisScaleDiv( QwtPlot::xBottom ); + aQwtScaleDiv.setTicks( QwtScaleDiv::MajorTick, myTicks ); + aQwtScaleDiv.setTicks( QwtScaleDiv::MediumTick, medium_ticks ); + aQwtScaleDiv.setTicks( QwtScaleDiv::MinorTick, minor_ticks ); + myPlot->setAxisScaleDiv( QwtPlot::xBottom, aQwtScaleDiv ); QwtScaleDiv* aScaleDiv = (QwtScaleDiv*) &scaleDiv(); @@ -4327,7 +4398,7 @@ void Plot2d_AxisScaleDraw::drawLabel( QPainter* painter, double value) const //const char *c_label = std_label.c_str(); //std::cout << " deviceLabel= |" << c_label << "|" << std::endl; - QPoint p = labelPosition( value ); + QPointF p = labelPosition( value ); p += QPoint(0, DEVICE_BY); QFont prevf = painter->font(); //QColor prevc = (painter->pen()).color(); @@ -4371,13 +4442,11 @@ const double Plot2d_QwtPlotPicker::BOUND_HV_SIZE = 0.2; Plot2d_QwtPlotPicker::Plot2d_QwtPlotPicker( int xAxis, int yAxis, - int selectionFlags, RubberBand rubberBand, DisplayMode trackerMode, QwtPlotCanvas *canvas) : QwtPlotPicker( xAxis, yAxis, - selectionFlags, rubberBand, trackerMode, canvas) // of drawing zone QwtPlot @@ -4400,20 +4469,30 @@ Plot2d_QwtPlotPicker::~Plot2d_QwtPlotPicker() /* Return the tooltip associated with a point when the mouse cursor pass near */ -QwtText Plot2d_QwtPlotPicker::trackerText( const QwtDoublePoint & pos ) const +QwtText Plot2d_QwtPlotPicker::trackerText( const QPoint & pos ) const { for (QList::const_iterator pMarkerIt = pMarkers.begin();pMarkerIt != pMarkers.end(); ++pMarkerIt ) { QwtPlotMarker* pMarker = *pMarkerIt; if ( pMarker != NULL ) { - const QwtSymbol &symb=pMarker->symbol(); - const QSize& sz=symb.size(); + const QwtSymbol* symb=pMarker->symbol(); + const QSize& sz=symb->size(); const QwtScaleMap yMapRef=plot()->canvasMap(QwtPlot::yLeft); const QwtScaleMap xMap=plot()->canvasMap(pMarker->xAxis()); const QwtScaleMap yMap=plot()->canvasMap(pMarker->yAxis()); QwtDoubleRect bound0=pMarker->boundingRect(); - QRect bound00=pMarker->transform(xMap,yMap,bound0); + int x1 = qRound(xMap.transform(bound0.left())); + int x2 = qRound(xMap.transform(bound0.right())); + int y1 = qRound(yMap.transform(bound0.top())); + int y2 = qRound(yMap.transform(bound0.bottom())); + + if ( x2 < x1 ) + qSwap(x1, x2); + if ( y2 < y1 ) + qSwap(y1, y2); + + QRect bound00=QRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); QPoint toto(xMap.transform(pos.x()),yMapRef.transform(pos.y())); bound00.setX(bound00.x()-sz.width()); bound00.setY(bound00.y()-sz.height()); diff --git a/src/Plot2d/Plot2d_ViewFrame.h b/src/Plot2d/Plot2d_ViewFrame.h index f1732b976..fb23604f2 100755 --- a/src/Plot2d/Plot2d_ViewFrame.h +++ b/src/Plot2d/Plot2d_ViewFrame.h @@ -39,6 +39,8 @@ #include #include #include +#include +#include #include #include @@ -74,6 +76,7 @@ public: virtual ~Plot2d_ViewFrame(); void Init(); + void SetPreference(); enum ObjectType { MainTitle, XTitle, YTitle, Y2Title, XAxis, YAxis, Y2Axis }; @@ -186,14 +189,20 @@ public: void showLegend( bool, bool = true ); void setLegendPos( int ); int getLegendPos() const; + void setLegendSymbolType( int ); + int getLegendSymbolType() const; void setLegendFont( const QFont& ); QFont getLegendFont() const; void setLegendFontColor( const QColor& ); QColor getLegendFontColor() const; + void setSelectedLegendFontColor( const QColor& ); + QColor getSelectedLegendFontColor() const; void setMarkerSize( const int, bool = true ); int getMarkerSize() const; virtual void setBackgroundColor( const QColor& ); QColor backgroundColor() const; + virtual void setSelectionColor( const QColor& ); + QColor selectionColor() const; void setXGrid( bool, const int, bool, const int, bool = true ); void setYGrid( bool, const int, bool, const int, bool, const int, bool, const int, bool = true ); @@ -232,8 +241,7 @@ public: void setEnableAxis( QwtPlot::Axis, bool ); virtual bool print( const QString&, const QString& ) const; - void printPlot( QPainter*, const QRect&, - const QwtPlotPrintFilter& = QwtPlotPrintFilter() ) const; + void printPlot( QPainter*, const QRectF& ) const; QString getVisualParameters(); void setVisualParameters( const QString& ); @@ -294,7 +302,7 @@ signals: void vpNormRModeChanged(); void vpCurveChanged(); void contextMenuRequested( QContextMenuEvent* ); - void legendClicked( QwtPlotItem* ); + void clicked (const QVariant&, int ); protected: Plot2d_Plot2d* myPlot; @@ -304,10 +312,13 @@ protected: int myCurveType; bool myShowLegend; int myLegendPos; + int myLegendSymbolType; QFont myLegendFont; QColor myLegendColor; + QColor mySelectedLegendFontColor; int myMarkerSize; QColor myBackground; + QColor mySelectionColor; QString myTitle, myXTitle, myYTitle, myY2Title; bool myTitleEnabled, myXTitleEnabled, myYTitleEnabled, myY2TitleEnabled; bool myXGridMajorEnabled, myYGridMajorEnabled, myY2GridMajorEnabled; @@ -343,26 +354,27 @@ public: Plot2d_Plot2d( QWidget* ); virtual ~Plot2d_Plot2d(); - void setLogScale( int, bool ); + void setLogScale( int, bool ); - void replot(); - QwtLegend* getLegend(); - QSize sizeHint() const; - QSize minimumSizeHint() const; - void defaultPicker(); - void setPickerMousePattern( int, int = Qt::NoButton ); - void setPicker( Plot2d_QwtPlotPicker *picker); + void replot(); + QwtAbstractLegend* getLegend(); + QSize sizeHint() const; + QSize minimumSizeHint() const; + void defaultPicker(); + void setPickerMousePattern( int, int = Qt::NoButton ); + void setPicker( Plot2d_QwtPlotPicker *picker); Plot2d_QwtPlotPicker* getPicker() { return myPicker; } Plot2d_AxisScaleDraw* getScaleDraw() { return myScaleDraw; } QList getSeparationLineList() { return mySeparationLineList; } void clearSeparationLineList(); - QwtPlotMarker *createMarkerAndTooltip( QwtSymbol symbol, - double X, - double Y, - QString & tooltip, - Plot2d_QwtPlotPicker *picker); + void setLegendSymbolType( const int ); + int getLegendSymbolType(); + QwtPlotMarker *createMarkerAndTooltip( QwtSymbol* symbol, + double X, + double Y, + QString & tooltip, + Plot2d_QwtPlotPicker *picker); - bool polished() const; QwtPlotGrid* grid() const; QwtPlotZoomer* zoomer() const; @@ -380,17 +392,9 @@ public: void createSeparationLine( double Xpos); - -public slots: - virtual void polish(); - -protected slots: - void onScaleDivChanged(); - protected: QwtPlotGrid* myGrid; QList myColors; - bool myIsPolished; QwtPlotZoomer* myPlotZoomer; Plot2d_AxisScaleDraw* myScaleDraw; // The point picker associated with the graphic view @@ -398,13 +402,13 @@ protected: private: // List of verticals segments between two curves QList mySeparationLineList; + int myLegendSymbolType; }; class Plot2d_ScaleDraw: public QwtScaleDraw { public: Plot2d_ScaleDraw( char f = 'g', int prec = 6 ); - Plot2d_ScaleDraw( const QwtScaleDraw& scaleDraw, char f = 'g', int prec = 6 ); virtual QwtText label( double value ) const; @@ -486,7 +490,6 @@ public: Plot2d_QwtPlotPicker( int xAxis, int yAxis, - int selectionFlags, RubberBand rubberBand, DisplayMode trackerMode, QwtPlotCanvas *canvas); @@ -502,7 +505,7 @@ public: protected: - virtual QwtText trackerText( const QwtDoublePoint & pos ) const; + virtual QwtText trackerText( const QPoint & pos ) const; }; diff --git a/src/Plot2d/Plot2d_ViewManager.cxx b/src/Plot2d/Plot2d_ViewManager.cxx index 29b7cbf72..94e86e02c 100755 --- a/src/Plot2d/Plot2d_ViewManager.cxx +++ b/src/Plot2d/Plot2d_ViewManager.cxx @@ -66,8 +66,8 @@ bool Plot2d_ViewManager::insertView( SUIT_ViewWindow* theView ) Plot2d_ViewFrame* aViewFrame = view->getViewFrame(); Plot2d_Viewer* aViewer = getPlot2dModel(); - connect( aViewFrame, SIGNAL( legendClicked( QwtPlotItem* ) ), - aViewer, SLOT( onLegendClicked( QwtPlotItem* ) ) ); + connect( aViewFrame, SIGNAL( clicked(const QVariant&, int) ), + aViewer, SLOT( onClicked(const QVariant&, int) ) ); } return res; } diff --git a/src/Plot2d/Plot2d_ViewModel.cxx b/src/Plot2d/Plot2d_ViewModel.cxx index 18fc7a914..0f76b1018 100755 --- a/src/Plot2d/Plot2d_ViewModel.cxx +++ b/src/Plot2d/Plot2d_ViewModel.cxx @@ -40,7 +40,8 @@ Plot2d_Viewer::Plot2d_Viewer(bool theAutoDel) { myPrs = 0; myAutoDel = theAutoDel; - Plot2d_Object::initColors(); + Plot2d_Object::setSelectionColor( QColor(80,80,80) ); + Plot2d_Object::setHighlightedLegendTextColor( QColor(255,255,255) ); } /*! @@ -219,7 +220,7 @@ void Plot2d_Viewer::onCloneView( Plot2d_ViewFrame* clonedVF, Plot2d_ViewFrame* n /* SLOT: called when clicked item in the legend from Plot2d_ViewManager */ -void Plot2d_Viewer::onLegendClicked( QwtPlotItem* plotItem ) +void Plot2d_Viewer::onClicked(const QVariant& itemInfo, int index) { } diff --git a/src/Plot2d/Plot2d_ViewModel.h b/src/Plot2d/Plot2d_ViewModel.h index 78c7a62c8..bafdf9ee7 100755 --- a/src/Plot2d/Plot2d_ViewModel.h +++ b/src/Plot2d/Plot2d_ViewModel.h @@ -62,7 +62,7 @@ protected slots: void onDumpView(); void onShowToolbar(); virtual void onCloneView( Plot2d_ViewFrame*, Plot2d_ViewFrame* ); - virtual void onLegendClicked( QwtPlotItem* ); + virtual void onClicked( const QVariant&, int ); private: Plot2d_Prs* myPrs; diff --git a/src/Plot2d/Plot2d_ViewWindow.cxx b/src/Plot2d/Plot2d_ViewWindow.cxx index 6df2c8a22..8fe81acb0 100755 --- a/src/Plot2d/Plot2d_ViewWindow.cxx +++ b/src/Plot2d/Plot2d_ViewWindow.cxx @@ -866,7 +866,7 @@ void Plot2d_ViewWindow::onPrintView() } QMap< QwtPlotCurve*, QPen > aCurvToPen; - QMap< QwtPlotCurve*, QwtSymbol > aCurvToSymbol; + QMap< QwtPlotCurve*, QwtSymbol* > aCurvToSymbol; if ( needColorCorrection ) { @@ -891,12 +891,12 @@ void Plot2d_ViewWindow::onPrintView() aCurve->setPen( aPen ); // symbol - QwtSymbol aSymbol = aCurve->symbol(); + QwtSymbol* aSymbol = const_cast( aCurve->symbol() ); aCurvToSymbol[ aCurve ] = aSymbol; - aPen = aSymbol.pen(); + aPen = aSymbol->pen(); aPen.setColor( QColor( 0, 0, 0 ) ); aPen.setWidthF( 1.5 ); - aSymbol.setPen( aPen ); + aSymbol->setPen( aPen ); aCurve->setSymbol( aSymbol ); } diff --git a/src/Plot2d/resources/Plot2d_msg_en.ts b/src/Plot2d/resources/Plot2d_msg_en.ts index 3f7bea97e..ff2920585 100644 --- a/src/Plot2d/resources/Plot2d_msg_en.ts +++ b/src/Plot2d/resources/Plot2d_msg_en.ts @@ -335,6 +335,10 @@ PLOT2D_BACKGROUND_COLOR_LBL Background color: + + PLOT2D_SELECTION_COLOR_LBL + Selection color: + PLOT2D_DEVIATION_MARKER_TLT Deviation marker @@ -565,6 +569,34 @@ Logarithmic scale for ordinate axis is not allowed. PLOT2D_ENABLE_MAIN_TITLE Main title + + PLOT2D_LEGEND_GROUP + Legend + + + PLOT2D_LEGEND_POSITION + Legend position: + + + PLOT2D_LEGEND_SYMBOL_TYPE + Symbol type: + + + PLOT2D_MARKER_ABOVE_LINE + Marker above line + + + PLOT2D_MARKER_ON_LINE + Marker on line + + + PLOT2D_LEGEND_FONT_COLOR + Legend font color: + + + PLOT2D_SELECTED_LEGEND_FONT_COLOR + Highlighted legend font color: + TOT_PLOT2D_CURVES_LINES Draw lines diff --git a/src/Plot2d/resources/Plot2d_msg_fr.ts b/src/Plot2d/resources/Plot2d_msg_fr.ts index e4796f09a..3503778e6 100755 --- a/src/Plot2d/resources/Plot2d_msg_fr.ts +++ b/src/Plot2d/resources/Plot2d_msg_fr.ts @@ -335,6 +335,10 @@ PLOT2D_BACKGROUND_COLOR_LBL Couleur d'arrière-plan: + + PLOT2D_SELECTION_COLOR_LBL + Couleur de sélection: + PLOT2D_DEVIATION_MARKER_TLT Marqueur de déviation @@ -565,6 +569,34 @@ L'échelle logarithmique de l'ordonnée n'est pas permise.PLOT2D_ENABLE_MAIN_TITLE Titre principal + + PLOT2D_LEGEND_GROUP + Légende + + + PLOT2D_LEGEND_POSITION + Position de la Légende: + + + PLOT2D_LEGEND_SYMBOL_TYPE + Type de symbole: + + + PLOT2D_MARKER_ABOVE_LINE + Marqueur dessus de la ligne + + + PLOT2D_MARKER_ON_LINE + Marqueur sur la ligne + + + PLOT2D_LEGEND_FONT_COLOR + Couleur de police de la légende: + + + PLOT2D_SELECTED_LEGEND_FONT_COLOR + Couleur de surlignement de la légende: + TOT_PLOT2D_CURVES_LINES Dessiner des lignes diff --git a/src/SPlot2d/SPlot2d_ViewModel.cxx b/src/SPlot2d/SPlot2d_ViewModel.cxx index a250c04ba..0f4ed1d7d 100644 --- a/src/SPlot2d/SPlot2d_ViewModel.cxx +++ b/src/SPlot2d/SPlot2d_ViewModel.cxx @@ -400,11 +400,13 @@ SUIT_ViewWindow* SPlot2d_Viewer::createView( SUIT_Desktop* theDesktop ) SLOT: called when action "Legend Clicked" is activated. override "onLegendClicked" method from Plot2d_ViewModel. */ -void SPlot2d_Viewer::onLegendClicked( QwtPlotItem* plotItem ) +void SPlot2d_Viewer::onClicked( const QVariant& itemInfo, int index ) { Plot2d_ViewFrame* aViewFrame = getActiveViewFrame(); if(aViewFrame == NULL) return; + QwtPlotItem* plotItem = aViewFrame->getPlot()->infoToItem( itemInfo ); + bool isAnalytical = false; AnalyticalCurveList curves = aViewFrame->getAnalyticalCurves(); foreach ( Plot2d_AnalyticalCurve* curve, curves ) { diff --git a/src/SPlot2d/SPlot2d_ViewModel.h b/src/SPlot2d/SPlot2d_ViewModel.h index eef72df46..562932b9a 100644 --- a/src/SPlot2d/SPlot2d_ViewModel.h +++ b/src/SPlot2d/SPlot2d_ViewModel.h @@ -84,7 +84,7 @@ public: Handle(SALOME_InteractiveObject) FindIObject( const char* Entry ); protected slots: - virtual void onLegendClicked( QwtPlotItem* plotItem ); + virtual void onClicked( const QVariant&, int ); signals: void legendSelected( const QString& ); -- 2.30.2