From aea880cf9e484e6750390eb69343106e15614f00 Mon Sep 17 00:00:00 2001 From: jfa Date: Fri, 8 Feb 2013 12:40:16 +0000 Subject: [PATCH] 0021840: [CEA 655] Scalar bar: using a logarithmic scale --- .../gui/SMESH/images/scalar_bar_dlg.png | Bin 22098 -> 33252 bytes doc/salome/gui/SMESH/input/scalar_bar.doc | 10 +- idl/SMESH_Filter.idl | 2 +- src/Controls/SMESH_Controls.cxx | 16 +- src/Controls/SMESH_ControlsDef.hxx | 3 +- src/OBJECT/SMESH_Actor.cxx | 242 +++++++++--------- src/SMESHGUI/SMESHGUI.cxx | 5 +- .../SMESHGUI_Preferences_ScalarBarDlg.cxx | 116 +++++---- .../SMESHGUI_Preferences_ScalarBarDlg.h | 4 +- src/SMESHGUI/SMESH_msg_en.ts | 4 + src/SMESHGUI/SMESH_msg_fr.ts | 4 + src/SMESH_I/SMESH_Filter_i.cxx | 7 +- src/SMESH_I/SMESH_Filter_i.hxx | 5 +- 13 files changed, 238 insertions(+), 180 deletions(-) diff --git a/doc/salome/gui/SMESH/images/scalar_bar_dlg.png b/doc/salome/gui/SMESH/images/scalar_bar_dlg.png index 59ca53065b9a06a53ae289a6b6e469f67f20bc99..564689ad96ef81e321572bb7e4a84e2d156e4f28 100755 GIT binary patch literal 33252 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 z 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 R4E%-&5+bs~MS>r{{x26CgK+== literal 22098 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%0AgYRI zxHJpwJrEw{2NNSIV=u4XIR*RHtYAS7JNP-|Kpwo`GuLg9w=nzFLGeGKm~37OpIpdW zx2#oWpq-^oZOlD`6?^ThDn_B(Er6PA_Gu^s6Zr^vbwn!)Eb<>k)dmQi8uMB zN^@6UzfVqZ9Z!o?9l)Hz!%01v@fk{RSG%phzAS;t;=B$m(=L;U_JQo4x~8*F_QO1J z%6?P9tJ+IuXh}mnnjBqR*2}bDXzDcP+x+Y9m}E`svzsWxr_O^ZR^YdN`e=rSVSzhi z*xw+?J~CUOKV)igwVRX)7|f(v$f0?Y|AyUW&C#H$lXBz0y7>4cV^OkM1&`5Hp6blm zBeRwRlLfs^G(ZjZ*A!Ey1rw4}z!8sfB|_hsanv2Wtk;{P&95UZX3w`e+KMi66XKX@ zbuN5PUtgZi*$ap-IjKgs8V!3QT5qN5QRgR1!|q)mqJ|-P&ze0NT-Q#6JopB>^mcb< z-%fh;YeG^&)R*MY!`@}h&=pN=cY=sW;hS!Uwhi-8V1{JikW`i#3?;l8bb!^z;e zwR8!Eyn_Jr$J_%%Ntw?xOLWR3Q>_B~we)Ye&0V(`gyH7XYpArdqmH6ebQq z;obi`94=e3v@o7ni>3yt=j&q|2JqFORUvQDY`61d#sO(11;5v#oP~NFnYQOfQ}BMdMPkf!Mz_~c8S zdYi!h4uO3UEL?Ch;%lfe7L<8EKV)lb%fc`QJSq|P2`_vq2Ul)#aOLs_yx7X_XmyN` z3u7dLt5aNa?G-_Y%>B7WB8ZC%3#?|ILB?mxcE7L#nFOBBK?HLJS^h>LM%7>HKNsX? zgRzgmRU+WBv>T|&pyQ?s)JXo;8n*9|*3!fcU?yVS{pVy@MrqpV{FJAae%55meag<| zf<*AFe_n|V`6CdId*5Haarn6JWDhw<=i~&v{y46hMFmK*TqE9{id8>~1<2*Kg5gBz z#}$&D-qu~HtSI-v>AE8ckmxuqdgAJc2SEDb6EdHCS=F(AS8@t~&HYb|zHoW!0;{E6 zZ_Xb8ToJ>`yXsU0BHicsgZ{*x=E)u-SvCjxlL)l@G|so;4iXtmw=E3uw*5O{NhJfh z@ssyzP!7YIs^OC}jF_i~BA&B0N!lONJs%?_%Y=w(LNFj&b-X;E!1SL_k-#ZfNCg}K zUfq9Zat8adfLHUMS)9ciDE&;O+*_;TVVt6}5J0csll@cx?7sW;A8A=@t&W4;uR18W zD7UduyiG?Akh$(0E^B1WR^3ZWO)Y>{uU#1zH>;60=_TeJzmxfQhJGZQunw; zs4JCHyRL`o5HO8;TP7}+nZ8&t0R-BJ;RXLKdc|9xcbDdBSdj4~bwThw1+C}wP4a`- z?gfeLz;Eu^6Q*X|VgW1O@Sa=TaANnkS)lund}8;J@{CD>)b9>FrwZ%pFKvxD+V5`% zY>n;8m~k17akwTU2H<)Xt0lOO1Jf#lc-|NM5PBdJxwhm0B>slNw7%1~Ic3XF;R!Df zR(x^-R}OuHDiz)+-6%3BY0lgIf|bvfG#W$R(#w0DSFWr2OEemJ0hG&s+=t?zeN})| zzLL$^XY@$KgsfkkZl~K?EH~;2R9J9G3{j3u*!a#%G%2ANX^oj$-9c>icd0>+v@r(8 z!SBzo@R=PKM%}%|Vbp%nB;Q3#d$q~er25ytF?4fnYQAvJH3^W%QqxVF8S+Uzw4ZDE; zFp$@qV(FYCasD>*eooE$J~`DkO^_S9!N5KAYOkM!QIH964e9IIQ|e3`8z*ZdbIvs)}s$0 z0@58Ixeon_d4zmLuKgsDtlw|2S;uvh0vP2Rt&2Gq4riVIPEy|86Os4+a05Yh0hngO zbaVhPJa}HNKt-I%bP1=(Vql%K^8b~4Z2XY1ap~SuOZ|V$TJTBk(P!X&{u7In4c@+RFpkhx+ju;QA{a4{U_HkTfm!fi%_pIM<)750!y@-e_<|0S2X|Jc}V9T^W;6_LW{xC^2Cp^{1+ze*eIrzCX;|Dr`@q zx!)W@gQLQHBzN`oHSO>3FNlaBud1wkV`^%OSzboh-~aLO4h&|No}NzZ@{20KwNsp& zoL&XIVIUJfZaT}EO}(y}Aj7-P#l`hAt2IchNC0AgCckd9`+}jVuEc^FCZY;RM=CJC z{Vjm4T21l^je#?EyT6D`3Qlh)l?LDFb`#CcxQ@ERESj+QIw`y#AF0gyJ_xj)`!1IF zunux!5+W8?fYhd*Q{4Et=KIRugquK675hvvT?x?a2f|Fb(ugIUWj7c;?chM|;6URI zuVPnA^{!`=Q;d^A0I<^R7kdQiGmvt>Bp`zrR2ihnSENsbLUM$a)_uAx3u1+#0 zNx}?Mqj`!$$55R-(#6@3SpJ>?AW>#+6=;TVkCLAtr4HCW$qH6$KQ?v(k zf6iPA+0$K6Sb{k)+8RAKEV-~rnc!!k*zKU}FRvK6WOnpzZZP+qswmQ%I+EI-VZ;Yx zt7NctfTqH>+a|MPh$+*uI+@X-1|VfRHa?}y{{1f&-4b6}3|)A;lQOb3koh{bg*^^o<3?D0`?fpsHtwCB9hzFz-uJ@|-o9hZ*lYSbCOcWyF8 z*Ba4iAn~O+WUsAWqM8r#l^q7v+@jV5hCq|3QYONv;qKv~w>w$7ifHzZKfnLIjdW+W zn`H+`l1mFJN_TA+B0}y=J^8{jsiLC4+o!TUc|jyp0Fv#wF}KZlG6f3rfO#-JQl9I) zN%*xfW9FZ2nsxnXEqv!TRU&;=)5A;Q8lou;o1>>XO(xAk7i*hd(e%fx`V{OORI9v9 zP8Ko1b(?mrVWIG&&KG8-~n+))bqd?ZQC=1X-uhcQ-2ZREGlSGDr#9$8aZV&E~^*kU6BF9En zbUx}53CXF(sn(lX%4lL2aDdnlQ+dNJEz@GfMfK%+dD42ykwT~mQamDHO6qzarD4y$ zsX zo>L0UZg>auS@FmxQ;JvztyXorPe=)@M~XsBem&D`wo_(@3p*8|&fU#gUiH zIK(6pKlO-5%I+^4K!4O#Ggf#6m|F&y&)E)`BFqIKrNE@1cM&N|P`M)&m(u%se)Ho# zuCzt9tW2WiT%iC2Av>jk3J!U`%qzwsn++ZRaZoCpL+2BNc_we-AR+`^ zeg!+Z^RhRF{hCs~9GF7pvl_pJPs7s4+p_?A>L<)8;IkvRjsO%YeWYtbK(c6EiSv`N zekXB2V76MxD?tt24666pX*>8%F3$d3@wmfaK>!jE{&d8s`BG1^U~SK`mi2XDJBbFj zJvflpKM&dWmyXy`M=;Ph>-l~CbXC+8vUAQN!#9Mm$n}F%t6l7+=70bMYp%b6AVc#E zml&Ren8Su&R&l8UCzqOr4De|Z#e_gsUn4Z@S0+(1G}pA|eKxPLy~$AN6P+O*`s()y z2Q@LY$8@Fhq+)^)ps^U=zHj+VECNpEItvm)K2Pidf|H_0sy8e`W$D_>pkVLVolna> z9=-MF1Rw(J`SlQp)KyVC33qbR)e{0}5ptbY#A8saOtL!D^bY`(2k*SqVjpI#4rBSv-RTJZtAgfP^3r zL9x*a-MC5-4H}VwrFIOtfj!YY7LRI#d*Kv-grsO@-%N9hkf(MtBugAV5>S|^=OV&? z1H$PB$$`Dge1ZgAX%9C5SK5qVo9gzYO7fN`zCNeEaJG2-rUs4Xz}!a+sgAwFzYJ;L zheOj#=e>?V~N zXOleE(CnGb7cm*R_A~0)uSjyhnaHgxZuO7Po-OgM zcxX3o+2PVnD}CJ&RWlV1fJT1VUvXem==#e z0-Vq>ltFy1;+p+HxB`>SV-B0Uvft!vQMZus3>%Wnp#=J~Q7rnC?cHLuYQS*Jkwg4f zil^F~cY&NISxOEC#~6Ks9*5|O;Vdi!Fq|2s0!h-w=x`(UkjH)C4Ul6D<}zWn^ZAcg zt7Mx0Ybv+*mN-pO|FV(&pC@EQ1KR(;B#@&BoC#z~Q^oRJjm}iG4snF}rCfN{Ej0#c z0zVVZ}#?s8HE5uY~Y|}}AYGpv*Etq)e0Wk(Of2TCMzdHi`82H{<<5D;6MmaDUg<}v!- zmWwU5$7n89jN}8caKk)Z?WS4I>a7@XYUB8+M)7qSnGKICdG|eIq74pLR7&>BOqiN4 zxxdA=zfq@73_1UP@~dp-l^duP3zS>6ld@BfY6zM%!s!W|;>D#IA1fx&1iy67QL#_Q zX#J1wOwoFM?#*`1klf~!!S50?_6^#NXA{BQUjk*kT*VNh&QVqiCB)Nw%4-P zwA}o)h9c9ZfbNb9)m1Cn1#N&6D9^5pWODy#Qnvg652yz2;SyCjvuyTVoKdP%a4MxW zNY(QF+N*7U(r=O;NbX^`Lpj)*A*5g z70yAWKLEnlRFB(_EtKe+g1fhR;y#Io~8#LpnN29bJHth5O76UN% zw<9NswHi56U~sWk4oM9}JWmQGmVE41A&XbMnPD3JX)%z-)TxKK4>s8++K4+*8_7#e z<;+b8__kLw+n+jUVwSXfE1-hW7jHPug=68r5w<7`zVGo1mv91uL~}L(gUSF54r8aB z(pPrt#=iF?7?$XVo)&wkk*)sF?E?(dfwe&52W6P4-SOo|Gb@ z3gW2NTk1A zY_fm>c+$25@UL8rk_~@okhH}-TR6*WXx$!7Vq_SWBl&aW5t5%=TPYE5DcG0PZQha! z^5W;XOihs(kv+r#n2RcJZEy!KOG3~_{%HA>_2rCFC}I}+8z!5BzPLa z9-{5=w+!<0c=l%W{m;S=c}~1V6nqdprCS!~PJCmJ0XI;GwEd>CA+VPJT|^)|X*=N0 zDc>n6@&{j>qO&cgqlkxs*!I7jM8f|cv`lSPK^#;91s|tL6`fxSVafOI^V*}NN~w%* zA`iZQqg?*>P4SAnTHgGbdFvW}A1w8jfr zOg-|$1rgteM_&8BVk-g=PNMMP%dbyMOY7?5qE%c}l#j)lz<<0auWD{Ck&~0d%+CwE zoR>Q-f*>3QT4PmCd(%?A>ZQ{1&+afv5uIAiu?z=d!BWwQt{(g6l zmZ_ebn_EKC(C%*a*y!l(hK2@LPfvr@_4Nb_J5sNqNJd_zgs7q9=53*!s#1g=;)oZ4 z;5Te;^bTGDk>h7JafTzBs7o}7?yKF^S?qZ_$x;OpW+l20ll6g=p=onsnzS+H!r^YQ zE0@<0VBTqpcgUFZpLy23tQ9i1?;N`3j2&;;*mZacs2U?9#FY7Sm+b z3I4TDmx!uFqBumg6F;w9nf^Q+ksgrD`29?Os{S)tM46|LoC4Cj|5BlQM^%y;h4GqN z_bwnE%p#)z?IDElXgEQH#f#`znMJI?e)oFs6z7){;lYFqZQOZXBLD5mcwa*>Nz2`V z2d?ypa!>EaV8`HFuL=@e{qMIM%e%^FD-`UPg^g5a1xykYPJ!66GWZ~? z;HBc&p=ySO* z&M^5??|#Yi`r?+=zVTl1n!R&OJ^>gj9>vh3oneugl^*G?x3^K~cb+r}ZdV-fH@80L zK7LMq;1K#8G-oN3RQ_tS7}c%?_*-f_?q4`>A4qr~;LN<%hfQeQn@gI}BS%+qhhw@q zR~RGxDsq8Q+(NqIemu6?;fH*9&^~g(u(`S?S>v+9j$kR^Kq*0k=cdb_1lsWKUO$w# z4Smk2_29=&&$iQsF$g#dZ4A@l{`Ox|5vwOLX`fkfr9!6zr7upUftK%u0YLEth+>^fOe8HfZl6J zc0Hpzo|yl+r4OOO6XR6;d5yDi^zB+cvCi1yik#U&kGu@IypljdN{}wD{3+OxIlrD1 zT=&|O)|rl2B^DMA(4VeWnSbnPOihX|{8u{Vw=kW0RW|7HssG9Z^^m<)d8zfDf{&uJ zo}0mJO&BIj^65 zz%p7EY=4ZB0^(fFNt_e?haV#$I}8Senw*icg5YpCS9|;G9{29WpMyP zaT&Y~;5I_-VLkAA@-skJvBOGrs&Gldy1!QG8T_YQRBzI*|IIq@BA0wB?m@)* zKg^I?q-98jr4NyenOYiJA(E;MqVId$ zhM3d#o>aNlvX?YdJD#Pt%70>+aK8Oi(B6A0S)yk#vs?8{53VqL=HB?%vL^~lKl(q+I1EhNho;ZXu1f)m zo?((wv`(?X3Pu?J>xSxEqazgKE~O+Sko=YM4;HTEpDAtaR^5v;&Gsd3`x&Mb4*~)L zHX)Ay47!?!lP@tK(`wgh_1~E8m_;nUaHuFQ(@a)8cB$@ag;poZTvbr`81GG!*k2K6 zWU0{~T%u&PZ)9q$I8t-;e#g3oacz9gdS#pv|C&j3_42OUt#))q#n#(CK}YZ$A;Ene zKrWuB+5p`Af`R{4padlkFdgVm;t8V**8(E9XPmEl6h2)7+=&%$#6fd+G9xrZwM7h(Z3KH6*B&-x%9oFu>3^CEXfvWd=Rb47-@2XnDHU3q0a6E3` zlu2~__UgpLPd%a$>!-IbSh?&{nFHp3LDO%_9oYe+7|&?$*aG0Qb!I?0;i7Fx)@+k>>A686h}@SPkEO(7@bHlsR0{rz z0+0AKx^@L`6Uquoy7U?+z^Fe~@?rZnes*K&b!qXY5cMozkQxRIEy>~#kFxYj-RK~X zk@fHa-%<-2eE9x3W9Y&X`rPkE4NnV#BMd~fzQ@hI*g^mbxz4AT(ybx952}OuPnLPe znQYu`%j#ca@HcX9XGD^+UwnLVa5}%5Ol(KSXT&pMz!xVKfdDekuF2b{hNb=;mQN*I zMCeJMoJvz&*I6l3So+&&mlOqM8r3E;H&F=lqgyjTpl})3SaIzw#^GkGjr7xv%&vy^ zU408r)j(aMHl8?z`u4ddLY9K4gSGy|QCj%@y%%>H{ZUS{Y5@Y2g~r#cU#<~{OF~))*a1dpY%YO*SO5MV%6wMz zZQhC?4i26_J%Ded{J3KuN5!{)Y}Fx^#L~fYT&vQAhET7~n#L@^#Iy|a88pt1J8|>7 z&^-``4c%PAW{B8lD`1+X2OCjtlBZ)QpL zIAVC6NerZ;g^Z|fwP&DEViRpD7C{cz6xYWPZSgu{1BCUJ2FkgH)C< z%5Fuxm|CXVgKtvKYJ7J~53GjaRlTaFxrmZHHiW?jAB2od;}nIqGtf(Xkp3N_Ll6I+ zxTgWwvyvHvIm|xWGOcsV?o4}ht8t*sE5t={I#w~rf$HrTg^79ujtx1qm!thlII?-% zCNzO;`q2!_p{MGs zK#5N9ypr8%)=nMixongenNz|k>Pw#V<@7;w@8y>HN)b3yK0wgwZEVB=>UZ6n{v10| z1l#<0P%paUtkkMejpC4qn%qCePqgwyJKLwys9-Kk<7%fMKKEIf^C$LQE$$N7 z#pIcjb0if^DSh6Nvb~N)9EH^!fX{Y&@pBniY$luPr9rK`OoCG1WfPF&RJ)toyZoAT zaI3$sy|aJkfDA?Z8Qy=^zogM1hmh`}p|FWsuj?mO$$;JUS3yF`hEK+DMbtU?D7@0b zk89QAjx+VlXeFabkHPpa(=xrxM*DJSF$7cg;lIjUKGP<0=s)Ua&%^Jn7Xlk}ry zXBGGbzD3^N=bWrn{9)m#UhlBiW^+&Cr7Y-fXwi(D=Q<|SKX*iAHnhM#b==dal&dFs zXz$!`G?p(U06(z$+ixi(H}1iOF$z{frAmkxWn`&^W?g_tfsIae|2R*D$?QhUUmjg_ zRk3GC-wGDDS1cX90j&dtnBakeNsrq#R_WCja`mQ@|2DUN$tM>FEWw-IBFm9#hqlIV zw%rFG^{cXbD@;ARRxl_MY!cfrHs=;sDD9ziyQCgEQ-J4}uw}~2m?`KIzPzhynN~m5Fr zPN&45m}|c*0=`S{p*G!nBOP?M*E|{S_2pPql(OL|c%xHHchI=7f?C0(>GlQU*x{z6eO-Ac2(r8zrpbye$VI(rFxC8Pa0nmR0a+cu(H!ru@OA)bq&) zGgY}l$)iRpW7tfplI=UicOGZYb|rf0%%Qf+Dr@dSeak(vrq76h<|=IaB5?;EF{dMH zwYax1!F6UP)5*YZ2wXm?ml7)r_yiJqmaMPs?Lmr_0WZa>?e5BC?U-J$UwBB^>58Dj z^ek(iR1g`9s4}{eJ6m-A6#Y5xDqoK|k#OD&)$en!K{O0)wI`MQ{Weq*Xyg zMPq1c03!^eRrZnu1cO8n5D3tKQMQyp2B8p^hBbl&j5u^9Ji}IEqfd+Bhx|k-8A( z{@^WeiDyZ5%2gZ@G~?{VEA0kwF>H-AK>++fCw$?0(&Vay^9rj<%pxy9Tm;KnqaM?+ z*qd0||CKg{zE);J@{(>07gLCoRe#3mnG27s@PGZsAdOw$KAl~9PelsTnz14D)KczO zQMHbyuL47KppUX6IiSZQoxRR%5A?9Y=@K+fGnj>mQj=b+v8k=yG~*V^ENfj%2!NzxE0`<=%zW?F?l)AH zo%4Bs6;nWk++VBQT3(ju!a0<%?Q5u()n5NtTJsN0@tVN!5V14O&`aE~X^rnpY>@Y> zKu?f?0lhRIWndm|l&K2f4jNhAY&crlBhf4N5_qFK6A+O;6IKP>wuv$gC9eyGzI~MN z?NH12Vz?#IT?{AN*2OlmqlnwPM7WBjKt zpOX&(=wHZzZ<&?70Qrd7#kuI^QPEoZFKMXKKHDdr!n^5O7|w{Z!*SAE<2<|LYm22=NJlM|j`P3{{Ig?6yg-(P;;(H)+j z!78$oH+EXd(5cVtwPf_gpXlZuhKOqQVy7~Lu9?Xe#qa#KR;+VblyC4(CF4g(IFQs$ z$6Vi{e4yB7{*hpM)wo{T^*H4pHs(o<3-6y|eJf}*S|=y)HDjDKQosu9vaS_sFvn*X z4)!*%Nq!RibTh%L5LEK_um#enioT|;_mj6(pA$qf+^I=v@-xTjJdP~PvAK^VZ*mQ~ zR~LmH$e{|h5-gJ(g`Qcq$T3haXF)cib~wGblTP-H4N&X3vm~3cRCpkrI|>I18s}7N zv9`6vH1AFRe0V0zJhDxQo4t*bw(B)=$ejt#Nbw^;ifZO-MsDIkf_AIIl<1SXgXipA zcH;aKj-IAYuTfAbtDJZjP#bt)!c4O-JUk;ySVPi6Rt-8_b8xG({y( zPVr3kzq>j+Xc^3}YD2;!A$x3BqB+r~wLjcC>`*Jr_A`-?ytVVC7s7nM23kGON>7yd z-!xA27`iY>Ue@ox(=X*tYBkU#e!r31kT%&PJ2?oN+=Bxm{^;G2geN1dgy7daNE4ef zLpaeDb>9g5z{{n6?MsS3GAv4dX=t$Ap;uiwTU8*~C!8nu9P6zZ8*Ns}&>#}AaAznH zy8y|@u^r5=W{wsW{;Bd}~+x&`%X4S?9$&0)LLN!+BzTx(xiUnD8 z`B5Zy52-(VswZ;riv~abA&+@QeJrFMxluPx;)LJh<#!z)ZF1i-%VDW7qq~w1a>U*9 zXsKxQhEhcGcL)_RU$LOw7rO92ew3-H?sa^3{>%fkA`re`|>;pBT3!|hEZe6$v(n(NY)-*T$E`Scvn zjeIjXYCtv)16QNO(AXW)@?%51SaU_i2d#jvZEVk8^`QfL*1?4gsvy)Twdg)%L?v&+ zAs|2-F%jJ~g0nGmCn-mH&U9jp>O27KgT*|f+2Un(*|qRzcowtQIDScWlH6>zWM;zp znz|-A(PQ8gF?d}^_rtjC*UNSW+(68|@yM`du7^&nUqd{k?VieT31X>Y(Dq^^vR83d zfW7KmHqglNo;W+|qjCU`hOX_-zmN>QKYh~K#EnoI!NTEMH7t5bmF1->;{uFUpP_9e zOX@In|9>v)p-|_OW0p+rb595Ml|dTtx9tXgv}({|hZiiVjdU}lx=JNHZ{jBQQ$7no zD4%j!j@G9wB%1u^7;@tLOo*7byBixmdPD!YLr=ov;OMvPAjvnIF=)x{MdOq$5Yqi1 z$H1U{Q|Rea6>JR^<>e*NV?YuJb=T_}sX8gXgCb2j`^2i2gZ@iP{pN_)N{4`t0|p3K zP*=qz`0)X$QbTiUtq@PJdQZ?V_U|rVBbFlX&~}Xll0a9*s+(3>x*g+I;$P!-+o-(- zb#v|tt6N%j+lBC4!0$%g;*r~&Xb^8%1>kSNy)O|`mGv}|jVCP8`8)s6VZ&eS3 z;nQ;|E(M2Bn!+0UAX@_+P}o!s!)KuR@$L?Ajj`5P0QEy;Rk)#+znh#(AWT9vc6MCt zw=G(LyX5@Ci<;*;wF~O-2SH+duj{YLD{=F;l%%3#M4e4X;@9)CX*+u_ra)Y!IlEm6 z;6}a7B6qpXj(H4_&-L#wYR5}y46VqXN diff --git a/doc/salome/gui/SMESH/input/scalar_bar.doc b/doc/salome/gui/SMESH/input/scalar_bar.doc index 146a7fa78..7ef8da51d 100755 --- a/doc/salome/gui/SMESH/input/scalar_bar.doc +++ b/doc/salome/gui/SMESH/input/scalar_bar.doc @@ -7,8 +7,12 @@ In this dialog you can specify the properties of the scalar bar \image html scalar_bar_dlg.png
    -
  • Scalar Range in this menu you can specify -Min value and Max value of the Scalar Bar
  • +
  • Scalar Range - in this menu you can specify +Min value and Max value of the Scalar Bar, and +also you can turn on/off Logarithmic scaling of the scalar bar.
  • + +\note Logarithmic scale is not applicable in case of +negative and zero values in the range. In such cases it is disabled.
  • Font - in this menu you can set type, face and color for the font of Title and Labels of the Scalar @@ -29,7 +33,7 @@ location (X and Y) and size (Width and side)
  • Y: ordinate of the origin (from the bottom)
-
  • Distribution in this menu you can Show/Hide distribution histogram of the values of the Scalar Bar and specify histogram properties
  • +
  • Distribution - in this menu you can Show/Hide distribution histogram of the values of the Scalar Bar and specify histogram properties
    • Multicolor the histogram is colored as Scalar Bar
    • Monocolor the histogram is colored as selected with Distribution color selector
    • diff --git a/idl/SMESH_Filter.idl b/idl/SMESH_Filter.idl index 8cc7bc864..2c701fc2b 100644 --- a/idl/SMESH_Filter.idl +++ b/idl/SMESH_Filter.idl @@ -115,7 +115,7 @@ module SMESH { double GetValue( in long theElementId ); - Histogram GetHistogram( in short nbIntervals ); + Histogram GetHistogram( in short nbIntervals, in boolean isLogarithmic ); /*! * Set precision for calculation. It is a position after point which is diff --git a/src/Controls/SMESH_Controls.cxx b/src/Controls/SMESH_Controls.cxx index 2b8d3c695..239aa41e4 100644 --- a/src/Controls/SMESH_Controls.cxx +++ b/src/Controls/SMESH_Controls.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include "SMESH_ControlsDef.hxx" @@ -322,12 +321,12 @@ double NumericalFunctor::Round( const double & aVal ) * \param minmax - boundaries of diapason of values to divide into intervals */ //================================================================================ - void NumericalFunctor::GetHistogram(int nbIntervals, std::vector& nbEvents, std::vector& funValues, const vector& elements, - const double* minmax) + const double* minmax, + const bool isLogarithmic) { if ( nbIntervals < 1 || !myMesh || @@ -380,8 +379,15 @@ void NumericalFunctor::GetHistogram(int nbIntervals, for ( int i = 0; i < nbIntervals; ++i ) { // find end value of i-th interval - double r = (i+1) / double( nbIntervals ); - funValues[i+1] = funValues.front() * (1-r) + funValues.back() * r; + double r = (i+1) / double(nbIntervals); + if (isLogarithmic && funValues.front() > 1e-07 && funValues.back() > 1e-07) { + double logmin = log10(funValues.front()); + double lval = logmin + r * (log10(funValues.back()) - logmin); + funValues[i+1] = pow(10.0, lval); + } + else { + funValues[i+1] = funValues.front() * (1-r) + funValues.back() * r; + } // count values in the i-th interval if there are any if ( min != values.end() && *min <= funValues[i+1] ) diff --git a/src/Controls/SMESH_ControlsDef.hxx b/src/Controls/SMESH_ControlsDef.hxx index a0e984cdd..9b9c26525 100644 --- a/src/Controls/SMESH_ControlsDef.hxx +++ b/src/Controls/SMESH_ControlsDef.hxx @@ -125,7 +125,8 @@ namespace SMESH{ std::vector& nbEvents, std::vector& funValues, const std::vector& elements, - const double* minmax=0); + const double* minmax=0, + const bool isLogarithmic = false); virtual SMDSAbs_ElementType GetType() const = 0; virtual double GetBadRate( double Value, int nbNodes ) const = 0; long GetPrecision() const; diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 933f34c56..3ae80f7a1 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -18,13 +18,12 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // SMESH OBJECT : interactive object for SMESH visualization // File : SMESH_Actor.cxx // Author : Nicolas REJNERI // Module : SMESH -// + #include "SMESH_ActorDef.h" #include "SMESH_ActorUtils.h" #include "SMESH_DeviceActor.h" @@ -99,8 +98,8 @@ SMESH_ActorDef* SMESH_ActorDef::New(){ } -SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, - const char* theEntry, +SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, + const char* theEntry, const char* theName, int theIsClear) { @@ -120,7 +119,7 @@ SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, SMESH_ActorDef::SMESH_ActorDef() { - if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<fontValue( "SMESH", "numbering_node_font" ); if ( f.family() == "Arial" ) aFamilyNd = SMESH::FntArial; else if ( f.family() == "Courier" ) aFamilyNd = SMESH::FntCourier; - else if ( f.family() == "Times" ) aFamilyNd = SMESH::FntTimes; - aBoldNd = f.bold(); - anItalicNd = f.italic(); - aShadowNd = f.overline(); + else if ( f.family() == "Times" ) aFamilyNd = SMESH::FntTimes; + aBoldNd = f.bold(); + anItalicNd = f.italic(); + aShadowNd = f.overline(); aSizeNd = f.pointSize(); } vtkFloatingPointType anRGBNd[3] = {1,1,1}; @@ -179,10 +178,10 @@ SMESH_ActorDef::SMESH_ActorDef() QFont f = mgr->fontValue( "SMESH", "numbering_elem_font" ); if ( f.family() == "Arial" ) aFamilyEl = SMESH::FntArial; else if ( f.family() == "Courier" ) aFamilyEl = SMESH::FntCourier; - else if ( f.family() == "Times" ) aFamilyEl = SMESH::FntTimes; + else if ( f.family() == "Times" ) aFamilyEl = SMESH::FntTimes; aBoldEl = f.bold(); anItalicEl = f.italic(); - aShadowEl = f.overline(); + aShadowEl = f.overline(); aSizeEl = f.pointSize(); } vtkFloatingPointType anRGBEl[3] = {0,1,0}; @@ -218,7 +217,7 @@ SMESH_ActorDef::SMESH_ActorDef() my2DActor->SetStoreGemetryMapping(true); my2DActor->SetUserMatrix(aMatrix); my2DActor->PickableOff(); - my2DActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); + my2DActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); my2DActor->SetProperty(mySurfaceProp); my2DActor->SetBackfaceProperty(myBackSurfaceProp); my2DActor->SetRepresentation(SMESH_DeviceActor::eSurface); @@ -257,7 +256,7 @@ SMESH_ActorDef::SMESH_ActorDef() my3DActor->SetStoreGemetryMapping(true); my3DActor->SetUserMatrix(aMatrix); my3DActor->PickableOff(); - my3DActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); + my3DActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); my3DActor->SetProperty(myNormalVProp); my3DActor->SetBackfaceProperty(myReversedVProp); my3DActor->SetRepresentation(SMESH_DeviceActor::eSurface); @@ -339,7 +338,7 @@ SMESH_ActorDef::SMESH_ActorDef() my1DProp->DeepCopy(myEdgeProp); my1DProp->SetLineWidth(aLineWidth + aLineWidthInc); my1DProp->SetPointSize(aElem0DSize); - + my1DExtProp = vtkProperty::New(); my1DExtProp->DeepCopy(myEdgeProp); anRGB[0] = 1 - anRGB[0]; @@ -381,7 +380,7 @@ SMESH_ActorDef::SMESH_ActorDef() //aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); aFilter->RegisterCellsWithType(VTK_VERTEX); - + //Definition 0D device of the actor (ball elements) //----------------------------------------------- myBallProp = vtkProperty::New(); @@ -393,14 +392,14 @@ SMESH_ActorDef::SMESH_ActorDef() myBallActor->SetUserMatrix(aMatrix); myBallActor->SetStoreGemetryMapping(true); myBallActor->PickableOff(); - myBallActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); + myBallActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); myBallActor->SetVisibility(false); myBallActor->SetProperty(myBallProp); myBallActor->SetRepresentation(SMESH_DeviceActor::eSurface); aFilter = myBallActor->GetExtractUnstructuredGrid(); aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); aFilter->RegisterCellsWithType(VTK_POLY_VERTEX); - + //my0DExtProp = vtkProperty::New(); //my0DExtProp->DeepCopy(my0DProp); //anRGB[0] = 1 - anRGB[0]; @@ -434,12 +433,12 @@ SMESH_ActorDef::SMESH_ActorDef() myNodeActor->SetStoreClippingMapping(true); myNodeActor->PickableOff(); myNodeActor->SetVisibility(false); - myNodeActor->SetFontProperties( aFamilyNd, aSizeNd, aBoldNd, anItalicNd, aShadowNd, anRGBNd[0], anRGBNd[1], anRGBNd[2] ); + myNodeActor->SetFontProperties( aFamilyNd, aSizeNd, aBoldNd, anItalicNd, aShadowNd, anRGBNd[0], anRGBNd[1], anRGBNd[2] ); myNodeActor->SetProperty(myNodeProp); myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint); aFilter = myNodeActor->GetExtractUnstructuredGrid(); aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); - + myNodeExtProp = vtkProperty::New(); myNodeExtProp->DeepCopy(myNodeProp); anRGB[0] = 1 - anRGB[0]; @@ -466,7 +465,7 @@ SMESH_ActorDef::SMESH_ActorDef() myBaseActor->SetStoreGemetryMapping(true); myBaseActor->GetProperty()->SetOpacity(0.0); myPickableActor = myBaseActor; - + myHighlightProp = vtkProperty::New(); myHighlightProp->SetAmbient(1.0); myHighlightProp->SetDiffuse(0.0); @@ -480,7 +479,7 @@ SMESH_ActorDef::SMESH_ActorDef() myBallHighlightProp = vtkProperty::New(); myBallHighlightProp->DeepCopy(myHighlightProp); myBallHighlightProp->SetPointSize(aBallElemSize); - + myOutLineProp = vtkProperty::New(); myOutLineProp->SetAmbient(1.0); @@ -522,7 +521,7 @@ SMESH_ActorDef::SMESH_ActorDef() //Definition of myScalarBarActor //------------------------------ myLookupTable = vtkLookupTable::New(); - //Fix for Bug PAL5195 - SMESH764: + //Fix for Bug PAL5195 - SMESH764: //Controls - Aspect Ratio: incorrect colors of the best and worst values myLookupTable->SetHueRange(0.667,0.0); @@ -541,11 +540,11 @@ SMESH_ActorDef::SMESH_ActorDef() myEntityMode = eAllEntity; myEntityModeCache = eAllEntity; - + // Clipping planes myImplicitBoolean = vtkImplicitBoolean::New(); myImplicitBoolean->SetOperationTypeToIntersection(); - + //Quadratic 2D elements representation //----------------------------------------------------------------------------- int aQuadratic2DMode = mgr->integerValue( "SMESH", "quadratic_mode", 0); @@ -559,11 +558,11 @@ SMESH_ActorDef::SMESH_ActorDef() my2DActor->SetQuadraticArcMode(true); my1DActor->SetQuadraticArcMode(true); } - + int aQuadraticAngle = mgr->integerValue( "SMESH", "max_angle", 2); myHighlitableActor->SetQuadraticArcAngle(aQuadraticAngle); my2DActor->SetQuadraticArcAngle(aQuadraticAngle); - + // Set colors of the name actor SMESH::GetColor( "SMESH", "default_grp_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) ); myNameActor->SetBackgroundColor(anRGB[0], anRGB[1], anRGB[2]); @@ -619,8 +618,8 @@ SMESH_ActorDef::~SMESH_ActorDef() // myControlActor->Delete(); myControlActor == my2DActor myNodeExtProp->Delete(); - myNodeExtActor->Delete(); - + myNodeExtActor->Delete(); + my1DProp->Delete(); my1DActor->Delete(); my1DExtProp->Delete(); @@ -632,8 +631,8 @@ SMESH_ActorDef::~SMESH_ActorDef() myBallActor->Delete(); //my0DExtProp->Delete(); //my0DExtActor->Delete(); - - myImplicitBoolean->Delete(); + + myImplicitBoolean->Delete(); #ifndef DISABLE_PLOT2DVIEWER if(my2dHistogram) { @@ -656,7 +655,7 @@ void SMESH_ActorDef::Delete() } void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled ) -{ +{ if(myNodeActor) { myNodeActor->SetPointsLabeled(theIsPointsLabeled); SetRepresentation(GetRepresentation()); @@ -667,7 +666,7 @@ void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled ) void SMESH_ActorDef::SetPointsFontProperties( SMESH::LabelFont theFamily, int theSize, bool theBold, bool theItalic, bool theShadow, vtkFloatingPointType r, vtkFloatingPointType g, vtkFloatingPointType b ) -{ +{ if(myNodeActor) { myNodeActor->SetFontProperties( theFamily, theSize, theBold, theItalic, theShadow, r, g, b ); SetRepresentation( GetRepresentation() ); @@ -678,7 +677,7 @@ void SMESH_ActorDef::SetPointsFontProperties( SMESH::LabelFont theFamily, int th void SMESH_ActorDef::SetCellsFontProperties( SMESH::LabelFont theFamily, int theSize, bool theBold, bool theItalic, bool theShadow, vtkFloatingPointType r, vtkFloatingPointType g, vtkFloatingPointType b ) -{ +{ if(my3DActor) { my3DActor->SetFontProperties( theFamily, theSize, theBold, theItalic, theShadow, r, g, b ); SetRepresentation( GetRepresentation() ); @@ -723,10 +722,10 @@ void SMESH_ActorDef::SetCellsLabeled(bool theIsCellsLabeled) if(my0DActor) my0DActor->SetCellsLabeled(theIsCellsLabeled); - + if(myBallActor) myBallActor->SetCellsLabeled(theIsCellsLabeled); - + myTimeStamp->Modified(); } @@ -801,7 +800,7 @@ bool SMESH_ActorDef::GetFacesOrientation3DVectors() } -void +void SMESH_ActorDef:: SetControlMode(eControl theMode) { @@ -809,12 +808,16 @@ SetControlMode(eControl theMode) } -void +void SMESH_ActorDef:: SetControlMode(eControl theMode, bool theCheckEntityMode) { - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); + vtkLookupTable* lookupTable = static_cast(myScalarBarActor->GetLookupTable()); + bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10; + lookupTable->SetScale(VTK_SCALE_LINEAR); + + SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); if( !mgr ) return; @@ -1036,7 +1039,7 @@ SetControlMode(eControl theMode, if (!myIsEntityModeCache){ myEntityModeCache = GetEntityMode(); myIsEntityModeCache=true; - } + } SetEntityMode(eEdges); } else if(myControlActor == my2DActor) { @@ -1048,7 +1051,7 @@ SetControlMode(eControl theMode, if (!myIsEntityModeCache){ myEntityModeCache = GetEntityMode(); myIsEntityModeCache=true; - } + } SetEntityMode(eFaces); break; default: @@ -1062,7 +1065,7 @@ SetControlMode(eControl theMode, if (!myIsEntityModeCache){ myEntityModeCache = GetEntityMode(); myIsEntityModeCache=true; - } + } SetEntityMode(eVolumes); } } @@ -1080,15 +1083,22 @@ SetControlMode(eControl theMode, myTimeStamp->Modified(); Modified(); + + lookupTable = static_cast(myScalarBarActor->GetLookupTable()); + double * range = lookupTable->GetRange(); + + if (isLogarithmic && range[0] > 1e-07 && range[1] > 1e-07) + lookupTable->SetScale(VTK_SCALE_LOG10); + Update(); } void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){ - + //myHighlightActor->AddToRender(theRenderer); - theRenderer->AddActor(myBaseActor); + theRenderer->AddActor(myBaseActor); theRenderer->AddActor(myNodeExtActor); theRenderer->AddActor(my1DExtActor); @@ -1103,7 +1113,7 @@ void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){ //theRenderer->AddActor(my0DExtActor); theRenderer->AddActor(myHighlitableActor); - + theRenderer->AddActor2D(myScalarBarActor); // the superclass' method should be called at the end @@ -1137,8 +1147,8 @@ void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){ } -bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, - const char* theEntry, +bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, + const char* theEntry, const char* theName, int theIsClear) { @@ -1155,23 +1165,23 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, myHighlitableActor->Init(myVisualObj,myImplicitBoolean); myNodeExtActor->Init(myVisualObj,myImplicitBoolean); - + my0DActor->Init(myVisualObj,myImplicitBoolean); myBallActor->Init(myVisualObj,myImplicitBoolean); //my0DExtActor->Init(myVisualObj,myImplicitBoolean); - + my1DActor->Init(myVisualObj,myImplicitBoolean); my1DExtActor->Init(myVisualObj,myImplicitBoolean); - + my2DActor->Init(myVisualObj,myImplicitBoolean); my2DExtActor->Init(myVisualObj,myImplicitBoolean); my3DActor->Init(myVisualObj,myImplicitBoolean); my3DExtActor->Init(myVisualObj,myImplicitBoolean); - + my0DActor->GetMapper()->SetLookupTable(myLookupTable); myBallActor->GetMapper()->SetLookupTable(myLookupTable); //my0DExtActor->GetMapper()->SetLookupTable(myLookupTable); - + my1DActor->GetMapper()->SetLookupTable(myLookupTable); my1DExtActor->GetMapper()->SetLookupTable(myLookupTable); @@ -1179,7 +1189,7 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, my2DExtActor->GetMapper()->SetLookupTable(myLookupTable); my3DActor->GetMapper()->SetLookupTable(myLookupTable); my3DExtActor->GetMapper()->SetLookupTable(myLookupTable); - + vtkFloatingPointType aFactor, aUnits; my2DActor->GetPolygonOffsetParameters(aFactor,aUnits); my2DActor->SetPolygonOffsetParameters(aFactor,aUnits*0.75); @@ -1197,7 +1207,7 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, int aMode = mgr->integerValue( "SMESH", "display_mode" ); SetRepresentation(-1); - + if(aMode == 0){ SetRepresentation(eEdge); }else if(aMode == 1){ @@ -1205,7 +1215,7 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, }else if(aMode == 2){ SetRepresentation(ePoint); } - + if(aMode == 3){ SetShrink(); } @@ -1238,7 +1248,7 @@ void SMESH_ActorDef::SetTransform(VTKViewer_Transform* theTransform){ myNodeActor->SetTransform(theTransform); myBaseActor->SetTransform(theTransform); - + myHighlitableActor->SetTransform(theTransform); myNodeExtActor->SetTransform(theTransform); @@ -1274,7 +1284,7 @@ vtkMapper* SMESH_ActorDef::GetMapper(){ } -vtkUnstructuredGrid* SMESH_ActorDef::GetUnstructuredGrid(){ +vtkUnstructuredGrid* SMESH_ActorDef::GetUnstructuredGrid(){ return myVisualObj->GetUnstructuredGrid(); } @@ -1283,7 +1293,7 @@ bool SMESH_ActorDef::IsInfinitive(){ vtkDataSet *aDataSet = myPickableActor->GetUnstructuredGrid(); aDataSet->Update(); myIsInfinite = aDataSet->GetNumberOfCells() == 0 || - ( aDataSet->GetNumberOfCells() == 1 && + ( aDataSet->GetNumberOfCells() == 1 && aDataSet->GetCell(0)->GetCellType() == VTK_VERTEX ); return SALOME_Actor::IsInfinitive(); } @@ -1381,7 +1391,7 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ myNodeActor->VisibilityOff(); myBaseActor->VisibilityOff(); - + myNodeExtActor->VisibilityOff(); my0DActor->VisibilityOff(); @@ -1390,18 +1400,18 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ my1DActor->VisibilityOff(); my1DExtActor->VisibilityOff(); - + my2DActor->VisibilityOff(); my2DExtActor->VisibilityOff(); my3DActor->VisibilityOff(); my3DExtActor->VisibilityOff(); - + myScalarBarActor->VisibilityOff(); - + if(GetVisibility()){ if(theIsUpdateRepersentation) SetRepresentation(GetRepresentation()); - + if(myControlMode != eNone){ switch(myControlMode){ case eFreeNodes: @@ -1449,34 +1459,34 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ if(myEntityMode & eEdges && GetRepresentation() != ePoint){ my1DActor->VisibilityOn(); } - + if(myEntityMode & eFaces && GetRepresentation() != ePoint){ my2DActor->VisibilityOn(); } - + if(myEntityMode & eVolumes && GetRepresentation() != ePoint){ my3DActor->VisibilityOn(); } - - if(myNodeActor->GetPointsLabeled()){ + + if(myNodeActor->GetPointsLabeled()){ myNodeActor->VisibilityOn(); } if(my0DActor) my0DActor->UpdateLabels(); - + if(myBallActor) myBallActor->UpdateLabels(); - + if(my1DActor) my1DActor->UpdateLabels(); - + if(my2DActor) my2DActor->UpdateLabels(); - + if(my3DActor) - my3DActor->UpdateLabels(); - } + my3DActor->UpdateLabels(); + } #ifndef DISABLE_PLOT2DVIEWER else SMESH::ProcessIn2DViewers(this,SMESH::RemoveFrom2dViewer); @@ -1597,7 +1607,7 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode) //#ifdef VTK_HAVE_POLYHEDRON aFilter->RegisterCellsWithType(VTK_POLYHEDRON); //#endif - + aHightFilter->RegisterCellsWithType(VTK_TETRA); aHightFilter->RegisterCellsWithType(VTK_VOXEL); aHightFilter->RegisterCellsWithType(VTK_HEXAHEDRON); @@ -1620,7 +1630,7 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode) } void SMESH_ActorDef::SetRepresentation (int theMode) -{ +{ int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge); int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face); int aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume); @@ -1642,7 +1652,7 @@ void SMESH_ActorDef::SetRepresentation (int theMode) case eSurface: if (!aNbFaces && !aNbVolumes && !aNb0Ds && !aNbBalls) return; break; - } + } myRepresentation = theMode; } @@ -1655,7 +1665,7 @@ void SMESH_ActorDef::SetRepresentation (int theMode) myIsShrunk = true; } else { SetShrink(); - } + } } myPickableActor = myBaseActor; @@ -1696,7 +1706,7 @@ void SMESH_ActorDef::SetRepresentation (int theMode) my2DActor->SetQuadraticArcMode(true); my2DExtActor->SetRepresentation(aReperesent); - + my3DActor->SetProperty(aPropVN); my3DActor->SetBackfaceProperty(aPropVR); my3DActor->SetRepresentation(aReperesent); @@ -1721,7 +1731,7 @@ void SMESH_ActorDef::SetRepresentation (int theMode) aReperesent = SMESH_DeviceActor::eInsideframe; break; } - + if(aQuadraticMode == SMESH_Actor::eLines) my1DActor->SetQuadraticArcMode(false); else if(aQuadraticMode == SMESH_Actor::eArcs) @@ -1753,7 +1763,7 @@ void SMESH_ActorDef::SetPointRepresentation(bool theIsPointsVisible){ SetRepresentation(GetRepresentation()); } -bool SMESH_ActorDef::GetPointRepresentation(){ +bool SMESH_ActorDef::GetPointRepresentation(){ return myIsPointsVisible || myNodeActor->GetPointsLabeled(); } @@ -1776,7 +1786,7 @@ void SMESH_ActorDef::UpdateHighlight(){ myBallActor->SetProperty(myBallPreselectProp); } else if(anIsVisible){ myBallActor->SetProperty(myBallProp); - (myRepresentation == eSurface) ? + (myRepresentation == eSurface) ? myHighlitableActor->SetProperty(myOutLineProp) : myHighlitableActor->SetProperty(myEdgeProp); } if(GetUnstructuredGrid()->GetNumberOfCells()) { @@ -1813,10 +1823,10 @@ void SMESH_ActorDef::highlight(bool theHighlight){ } -void SMESH_ActorDef::SetPreSelected(bool thePreselect){ +void SMESH_ActorDef::SetPreSelected(bool thePreselect){ if ( myIsPreselected == thePreselect ) return; - myIsPreselected = thePreselect; + myIsPreselected = thePreselect; UpdateHighlight(); } @@ -1870,30 +1880,30 @@ void SMESH_ActorDef::Update(){ if(my0DActor) my0DActor->UpdateLabels(); - + if(myBallActor) myBallActor->UpdateLabels(); - + if(my1DActor) my1DActor->UpdateLabels(); - + if(my2DActor) my2DActor->UpdateLabels(); if(my3DActor) my3DActor->UpdateLabels(); - + if(myIsFacesOriented){ SetFacesOriented(myIsFacesOriented); } - + if(myVisualObj->GetEntitiesFlag()) { myEntityMode |= myVisualObj->GetEntitiesState(); } - + SetEntityMode(GetEntityMode()); SetVisibility(GetVisibility()); - + myTimeStamp->Modified(); Modified(); } @@ -1940,7 +1950,7 @@ void SMESH_ActorDef::SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType if( SMESH_GroupObj* aGroupObj = dynamic_cast( myVisualObj.get() ) ) if( aGroupObj->GetElementType() == SMDSAbs_Face ) myNameActor->SetBackgroundColor(r,g,b); - + myDeltaBrightness = delta; QColor bfc = Qtx::mainColorToSecondary(QColor(int(r*255),int(g*255),int(b*255)), delta); myBackSurfaceProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. ); @@ -1958,7 +1968,7 @@ void SMESH_ActorDef::SetVolumeColor(vtkFloatingPointType r,vtkFloatingPointType if( SMESH_GroupObj* aGroupObj = dynamic_cast( myVisualObj.get() ) ) if( aGroupObj->GetElementType() == SMDSAbs_Volume ) myNameActor->SetBackgroundColor(r,g,b); - + myDeltaVBrightness = delta; QColor bfc = Qtx::mainColorToSecondary(QColor(int(r*255),int(g*255),int(b*255)), delta); myReversedVProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. ); @@ -1994,7 +2004,7 @@ void SMESH_ActorDef::GetOutlineColor(vtkFloatingPointType& r,vtkFloatingPointTyp } -void SMESH_ActorDef::SetNodeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::SetNodeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ myNodeProp->SetColor(r,g,b); myNodeExtProp->SetColor(1.0-r,1.0-g,1.0-b); if( SMESH_GroupObj* aGroupObj = dynamic_cast( myVisualObj.get() ) ) @@ -2003,11 +2013,11 @@ void SMESH_ActorDef::SetNodeColor(vtkFloatingPointType r,vtkFloatingPointType g, Modified(); } -void SMESH_ActorDef::GetNodeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::GetNodeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ ::GetColor(myNodeProp,r,g,b); } -void SMESH_ActorDef::Set0DColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::Set0DColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ my0DProp->SetColor(r,g,b); if( SMESH_GroupObj* aGroupObj = dynamic_cast( myVisualObj.get() ) ) if( aGroupObj->GetElementType() == SMDSAbs_0DElement ) @@ -2015,11 +2025,11 @@ void SMESH_ActorDef::Set0DColor(vtkFloatingPointType r,vtkFloatingPointType g,vt Modified(); } -void SMESH_ActorDef::Get0DColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::Get0DColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ ::GetColor(my0DProp,r,g,b); } -void SMESH_ActorDef::SetBallColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::SetBallColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ myBallProp->SetColor(r,g,b); if( SMESH_GroupObj* aGroupObj = dynamic_cast( myVisualObj.get() ) ) if( aGroupObj->GetElementType() == SMDSAbs_Ball ) @@ -2027,27 +2037,27 @@ void SMESH_ActorDef::SetBallColor(vtkFloatingPointType r,vtkFloatingPointType g, Modified(); } -void SMESH_ActorDef::GetBallColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::GetBallColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ ::GetColor(myBallProp,r,g,b); } -void SMESH_ActorDef::SetHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::SetHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ myHighlightProp->SetColor(r,g,b); myBallHighlightProp->SetColor(r,g,b); Modified(); } -void SMESH_ActorDef::GetHighlightColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::GetHighlightColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ ::GetColor(myHighlightProp,r,g,b); } -void SMESH_ActorDef::SetPreHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::SetPreHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ myPreselectProp->SetColor(r,g,b); myBallPreselectProp->SetColor(r,g,b); Modified(); } -void SMESH_ActorDef::GetPreHighlightColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::GetPreHighlightColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ ::GetColor(myPreselectProp,r,g,b); } @@ -2061,7 +2071,7 @@ void SMESH_ActorDef::SetLineWidth(vtkFloatingPointType theVal){ myEdgeProp->SetLineWidth(theVal); my1DProp->SetLineWidth(theVal + aLineWidthInc); - my1DExtProp->SetLineWidth(theVal + aLineWidthInc); + my1DExtProp->SetLineWidth(theVal + aLineWidthInc); my2DExtProp->SetLineWidth(theVal + aLineWidthInc); my3DExtProp->SetLineWidth(theVal + aLineWidthInc); myOutLineProp->SetLineWidth(theVal); @@ -2153,7 +2163,7 @@ SMESH_ActorDef::SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) my3DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); } -vtkIdType +vtkIdType SMESH_ActorDef::AddClippingPlane(vtkPlane* thePlane) { if(thePlane){ @@ -2184,7 +2194,7 @@ GetNumberOfClippingPlanes() return myCippingPlaneCont.size(); } -vtkPlane* +vtkPlane* SMESH_ActorDef:: GetClippingPlane(vtkIdType theID) { @@ -2312,7 +2322,7 @@ void SMESH_ActorDef::UpdateScalarBar() int coloringType = mgr->integerValue("SMESH", "distribution_coloring_type", 0); myScalarBarActor->SetDistributionColoringType(coloringType); - + QColor distributionColor = mgr->colorValue("SMESH", "distribution_color", QColor(255, 255, 255)); double rgb[3]; @@ -2321,7 +2331,7 @@ void SMESH_ActorDef::UpdateScalarBar() rgb[2]= distributionColor.blue()/255.; myScalarBarActor->SetDistributionColor(rgb); - + } void SMESH_ActorDef::UpdateDistribution() @@ -2340,7 +2350,8 @@ void SMESH_ActorDef::UpdateDistribution() elemIds.push_back( (*e)->GetID()); vtkLookupTable* lookupTable = static_cast(myScalarBarActor->GetLookupTable()); double * range = lookupTable->GetRange(); - fun->GetHistogram(nbIntervals, nbEvents, funValues, elemIds, range); + bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10; + fun->GetHistogram(nbIntervals, nbEvents, funValues, elemIds, range, isLogarithmic); myScalarBarActor->SetDistribution(nbEvents); } } @@ -2394,17 +2405,17 @@ SPlot2d_Histogram* SMESH_ActorDef::UpdatePlot2Histogram() { if(my2dHistogram) my2dHistogram->clearAllPoints(); - + if(SMESH::Controls::NumericalFunctor* fun = dynamic_cast(myFunctor.get())) { - + if(!my2dHistogram) { my2dHistogram = new SPlot2d_Histogram(); Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(getIO()->getEntry(),"SMESH",getName()); my2dHistogram->setIO(anIO); } - + int nbIntervals = myScalarBarActor->GetMaximumNumberOfColors(); std::vector nbEvents; std::vector funValues; @@ -2412,22 +2423,23 @@ SPlot2d_Histogram* SMESH_ActorDef::UpdatePlot2Histogram() { if ( ! dynamic_cast(myVisualObj.get())) dynamic_cast(myVisualObj.get())->GetEntities( fun->GetType(), elems ); std::vector elemIds; - + for ( SMESH_VisualObjDef::TEntityList::iterator e = elems.begin(); e != elems.end(); ++e) elemIds.push_back( (*e)->GetID()); vtkLookupTable* lookupTable = static_cast(myScalarBarActor->GetLookupTable()); double * range = lookupTable->GetRange(); - fun->GetHistogram(nbIntervals, nbEvents, funValues, elemIds, range); + bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10; + fun->GetHistogram(nbIntervals, nbEvents, funValues, elemIds, range, isLogarithmic); - for ( int i = 0; i < std::min( nbEvents.size(), funValues.size() -1 ); i++ ) + for ( int i = 0; i < std::min( nbEvents.size(), funValues.size() -1 ); i++ ) my2dHistogram->addPoint(funValues[i] + (funValues[i+1] - funValues[i])/2.0, static_cast(nbEvents[i])); if(funValues.size() >= 2) my2dHistogram->setWidth((funValues[1] - funValues[0]) * 0.8) ; } - + //Color of the histogram if(myScalarBarActor->GetDistributionColoringType() == SMESH_MULTICOLOR_TYPE) my2dHistogram->setAutoAssign(true); @@ -2438,7 +2450,7 @@ SPlot2d_Histogram* SMESH_ActorDef::UpdatePlot2Histogram() { my2dHistogram->setColor(aColor); } - + return my2dHistogram; } #endif diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index b509f6ac1..5c87d1c2c 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -1108,9 +1108,10 @@ vtkLookupTable* lookupTable = static_cast(aScalarBarActor->GetLookupTable()); double * minmax = lookupTable->GetRange(); + bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10; std::vector nbEvents; std::vector funValues; - aNumFun->GetHistogram( nbIntervals, nbEvents, funValues, elements, minmax ); + aNumFun->GetHistogram( nbIntervals, nbEvents, funValues, elements, minmax, isLogarithmic ); QString anInitialPath = ""; if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) anInitialPath = QDir::currentPath(); @@ -1603,7 +1604,7 @@ aControl = SMESH_Actor::eCoincidentElems3D; break; } - + anActor->SetControlMode(aControl); anActor->GetScalarBarActor()->SetTitle( functorToString( anActor->GetFunctor() ).toLatin1().constData() ); SMESH::RepaintCurrentView(); diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx index 7f0a861ae..4e3f3d5b5 100644 --- a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx @@ -18,13 +18,12 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // SMESH SMESHGUI : GUI for SMESH component // File : SMESHGUI_Preferences_ScalarBarDlg.cxx // Author : Nicolas REJNERI, Open CASCADE S.A.S. // SMESH includes -// + #include "SMESHGUI_Preferences_ScalarBarDlg.h" #include "SMESHGUI.h" @@ -130,22 +129,28 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* /******************************************************************************/ // Scalar range myRangeGrp = new QGroupBox ( tr( "SMESH_RANGE_SCALARBAR" ), this ); - QHBoxLayout* myRangeGrpLayout = new QHBoxLayout( myRangeGrp ); + //QHBoxLayout* myRangeGrpLayout = new QHBoxLayout( myRangeGrp ); + QGridLayout* myRangeGrpLayout = new QGridLayout( myRangeGrp ); myRangeGrpLayout->setSpacing( SPACING_SIZE ); myRangeGrpLayout->setMargin( MARGIN_SIZE ); - + myMinEdit = new QLineEdit( myRangeGrp ); myMinEdit->setMinimumWidth( MINIMUM_WIDTH ); myMinEdit->setValidator( new QDoubleValidator( this ) ); - + myMaxEdit = new QLineEdit( myRangeGrp ); myMaxEdit->setMinimumWidth( MINIMUM_WIDTH ); myMaxEdit->setValidator( new QDoubleValidator( this ) ); - - myRangeGrpLayout->addWidget( new QLabel( tr( "SMESH_RANGE_MIN" ), myRangeGrp ) ); - myRangeGrpLayout->addWidget( myMinEdit ); - myRangeGrpLayout->addWidget( new QLabel( tr( "SMESH_RANGE_MAX" ), myRangeGrp ) ); - myRangeGrpLayout->addWidget( myMaxEdit ); - + + myLogarithmicCheck = new QCheckBox (myRangeGrp); + myLogarithmicCheck->setText(tr("SMESH_LOGARITHMIC_SCALARBAR")); + myLogarithmicCheck->setChecked(false); + + myRangeGrpLayout->addWidget( new QLabel( tr( "SMESH_RANGE_MIN" ), myRangeGrp ), 0, 0, 1, 1 ); + myRangeGrpLayout->addWidget( myMinEdit, 0, 1, 1, 1 ); + myRangeGrpLayout->addWidget( new QLabel( tr( "SMESH_RANGE_MAX" ), myRangeGrp ), 0, 2, 1, 1 ); + myRangeGrpLayout->addWidget( myMaxEdit, 0, 3, 1, 1 ); + myRangeGrpLayout->addWidget( myLogarithmicCheck, 1, 0, 1, 4 ); + aTopLayout->addWidget( myRangeGrp ); /******************************************************************************/ @@ -255,19 +260,19 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* myYSpin = new SMESHGUI_SpinBox(myOriginDimGrp); myYSpin->setAcceptNames( false ); - myYSpin->RangeStepAndValidator( 0.0, 1.0, 0.1, "parametric_precision" ); + myYSpin->RangeStepAndValidator( 0.0, 1.0, 0.1, "parametric_precision" ); myYSpin->setMinimumWidth( MINIMUM_WIDTH ); myYSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); myWidthSpin = new SMESHGUI_SpinBox(myOriginDimGrp); myWidthSpin->setAcceptNames( false ); - myWidthSpin->RangeStepAndValidator( 0.0, 1.0, 0.1, "parametric_precision" ); + myWidthSpin->RangeStepAndValidator( 0.0, 1.0, 0.1, "parametric_precision" ); myWidthSpin->setMinimumWidth( MINIMUM_WIDTH ); myWidthSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); myHeightSpin = new SMESHGUI_SpinBox(myOriginDimGrp); myHeightSpin->setAcceptNames( false ); - myHeightSpin->RangeStepAndValidator( 0.0, 1.0, 0.1, "parametric_precision" ); + myHeightSpin->RangeStepAndValidator( 0.0, 1.0, 0.1, "parametric_precision" ); myHeightSpin->setMinimumWidth( MINIMUM_WIDTH ); myHeightSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); @@ -297,18 +302,18 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* myDistribColorGrp->addButton(myDMonoColor);myDistribColorGrp->setId(myDMonoColor,1); myDistribColorGrp->addButton(myDMultiColor);myDistribColorGrp->setId(myDMultiColor,2); - + aDistributionGrpLayout->addWidget( myDMultiColor ); aDistributionGrpLayout->addWidget( myDMonoColor ); - + //Color of the Distribution in monocolor case: myDistributionColorLbl = new QLabel( tr( "SMESH_DISTRIBUTION_COLOR" ), myDistributionGrp ); aDistributionGrpLayout->addWidget( myDistributionColorLbl ); myMonoColorBtn = new QtxColorButton( myDistributionGrp ); aDistributionGrpLayout->addWidget(myMonoColorBtn); - + aTopLayout->addWidget(myDistributionGrp); - + /******************************************************************************/ // Common buttons myButtonGrp = new QGroupBox( this ); @@ -351,13 +356,13 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* myTitleFontCombo->setCurrentIndex(1); if( f.family()=="Times") myTitleFontCombo->setCurrentIndex(2); - + myTitleBoldCheck->setChecked ( f.bold() ); myTitleItalicCheck->setChecked( f.italic() ); myTitleShadowCheck->setChecked( f.overline() ); } - - QColor labelColor = mgr->colorValue("SMESH", "scalar_bar_label_color", + + QColor labelColor = mgr->colorValue("SMESH", "scalar_bar_label_color", QColor(255, 255, 255)); myLabelsColorBtn->setColor(labelColor); myLabelsFontCombo->setCurrentIndex(0); @@ -369,7 +374,7 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* myLabelsFontCombo->setCurrentIndex(1); if (f.family() == "Times") myLabelsFontCombo->setCurrentIndex(2); - + myLabelsBoldCheck ->setChecked( f.bold() ); myLabelsItalicCheck->setChecked( f.italic() ); myLabelsShadowCheck->setChecked( f.overline() ); @@ -391,7 +396,7 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* QString name = isHoriz ? "scalar_bar_horizontal_%1" : "scalar_bar_vertical_%1"; - myIniX = mgr->doubleValue("SMESH", name.arg( "x" ), + myIniX = mgr->doubleValue("SMESH", name.arg( "x" ), myHorizRadioBtn->isChecked() ? DEF_HOR_X : DEF_VER_X); myIniY = mgr->doubleValue("SMESH", name.arg( "y" ), @@ -412,18 +417,16 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* int coloringType = mgr->integerValue("SMESH", "distribution_coloring_type", 0); if( coloringType == SMESH_MONOCOLOR_TYPE ) { myDMonoColor->setChecked(true); - onDistributionChanged(myDistribColorGrp->id(myDMonoColor)); + onDistributionChanged(myDistribColorGrp->id(myDMonoColor)); } else { myDMultiColor->setChecked(true); onDistributionChanged(myDistribColorGrp->id(myDMultiColor)); } - + QColor distributionColor = mgr->colorValue("SMESH", "distribution_color", QColor(255, 255, 255)); myMonoColorBtn->setColor(distributionColor); - - // --> then init from selection if necessary onSelectionChanged(); @@ -434,6 +437,8 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* connect( myApplyBtn, SIGNAL( clicked() ), this, SLOT( onApply() ) ); connect( myCancelBtn, SIGNAL( clicked() ), this, SLOT( onCancel() ) ); connect( myHelpBtn, SIGNAL(clicked()), this, SLOT( onHelp() ) ); + connect( myMinEdit, SIGNAL( textChanged(const QString &) ), this, SLOT( onMinMaxChanged() ) ); + connect( myMaxEdit, SIGNAL( textChanged(const QString &) ), this, SLOT( onMinMaxChanged() ) ); connect( myXSpin, SIGNAL( valueChanged( double ) ), this, SLOT( onXYChanged() ) ); connect( myYSpin, SIGNAL( valueChanged( double ) ), this, SLOT( onXYChanged() ) ); connect( aOrientationGrp, SIGNAL( buttonClicked( int ) ), this, SLOT( onOrientationChanged() ) ); @@ -528,9 +533,9 @@ bool SMESHGUI_Preferences_ScalarBarDlg::onApply() if( myDistributionGrp->isChecked() ) { int ColoringType = myDMultiColor->isChecked() ? SMESH_MULTICOLOR_TYPE : SMESH_MONOCOLOR_TYPE; distributionTypeChanged = (ColoringType != myScalarBarActor->GetDistributionColoringType()); - if(distributionTypeChanged) + if (distributionTypeChanged) myScalarBarActor->SetDistributionColoringType(ColoringType); - + if( !myDMultiColor->isChecked() ) { QColor aTColor = myMonoColorBtn->color(); double rgb[3], oldRgb[3];; @@ -551,29 +556,31 @@ bool SMESHGUI_Preferences_ScalarBarDlg::onApply() double oldMinMax[2] = { myLookupTable->GetRange()[0], myLookupTable->GetRange()[1] }; bool rangeChanges = ( fabs( oldMinMax[0] - aMin ) + fabs( oldMinMax[1] - aMax ) > 0.001 * ( aMax-aMin + oldMinMax[1]-oldMinMax[0] )); - + bool nbColorsChanged = (myColorsSpin->value() != myScalarBarActor->GetMaximumNumberOfColors()); if(nbColorsChanged) myScalarBarActor->SetMaximumNumberOfColors(myColorsSpin->value()); - myLookupTable->SetRange( aMin, aMax ); myLookupTable->SetNumberOfTableValues(myColorsSpin->value()); + + bool scaleChanged = (myLogarithmicCheck->isChecked() != (myLookupTable->GetScale() == VTK_SCALE_LOG10)); + if (scaleChanged) + myLookupTable->SetScale(myLogarithmicCheck->isChecked() ? VTK_SCALE_LOG10 : VTK_SCALE_LINEAR); + myLookupTable->Build(); - if( nbColorsChanged || rangeChanges) + if (nbColorsChanged || rangeChanges || scaleChanged) myActor->UpdateDistribution(); - + #ifndef DISABLE_PLOT2DVIEWER - if( myActor->GetPlot2Histogram() && - (nbColorsChanged || + if( myActor->GetPlot2Histogram() && + (nbColorsChanged || rangeChanges || - distributionTypeChanged || + distributionTypeChanged || colorChanged )) SMESH::ProcessIn2DViewers(myActor); #endif - - SMESH::RepaintCurrentView(); return true; @@ -601,7 +608,7 @@ void SMESHGUI_Preferences_ScalarBarDlg::onCancel() void SMESHGUI_Preferences_ScalarBarDlg::onHelp() { LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); - if (app) + if (app) app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); else { QString platform; @@ -612,7 +619,7 @@ void SMESHGUI_Preferences_ScalarBarDlg::onHelp() #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", + arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)). arg(myHelpFileName)); } @@ -639,9 +646,13 @@ void SMESHGUI_Preferences_ScalarBarDlg::onSelectionChanged() SMESH_ScalarBarActor* myScalarBarActor = myActor->GetScalarBarActor(); if ( myScalarBarActor->GetLookupTable() ) { - vtkFloatingPointType *range = myScalarBarActor->GetLookupTable()->GetRange(); + vtkLookupTable* aLookupTable = static_cast(myScalarBarActor->GetLookupTable()); + + vtkFloatingPointType *range = aLookupTable->GetRange(); myMinEdit->setText( QString::number( range[0],'g',12 ) ); myMaxEdit->setText( QString::number( range[1],'g',12 ) ); + myLogarithmicCheck->setChecked(aLookupTable->GetScale() == VTK_SCALE_LOG10); + myLogarithmicCheck->setEnabled(range[0] > 1e-07 && range[1] > 1e-07); } vtkTextProperty* aTitleTextPrp = myScalarBarActor->GetTitleTextProperty(); @@ -682,15 +693,14 @@ void SMESHGUI_Preferences_ScalarBarDlg::onSelectionChanged() myMonoColorBtn->setColor( QColor( (int)( aTColor[0]*255 ), (int)( aTColor[1]*255 ), (int)( aTColor[2]*255 ) ) ); if ( coloringType == SMESH_MONOCOLOR_TYPE ) { myDMonoColor->setChecked(true); - onDistributionChanged(myDistribColorGrp->id(myDMonoColor)); + onDistributionChanged(myDistribColorGrp->id(myDMonoColor)); } else { myDMultiColor->setChecked(true); onDistributionChanged(myDistribColorGrp->id(myDMultiColor)); } myDistributionGrp->setChecked((bool)myScalarBarActor->GetDistributionVisibility()); onDistributionActivated(myScalarBarActor->GetDistributionVisibility()); - - + myRangeGrp->setEnabled( true ); myFontGrp->setEnabled( true ); myLabColorGrp->setEnabled( true ); @@ -727,6 +737,22 @@ void SMESHGUI_Preferences_ScalarBarDlg::closeEvent( QCloseEvent* e ) QDialog::closeEvent( e ); } +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::onMinMaxChanged + * + * Called when Scalar Range values are changed + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::onMinMaxChanged() +{ + double aMin = myMinEdit->text().toDouble(); + double aMax = myMaxEdit->text().toDouble(); + bool isLogarithmicEnabled = (aMin > 1e-07 && aMax > 1e-07); + myLogarithmicCheck->setChecked(isLogarithmicEnabled); + myLogarithmicCheck->setEnabled(isLogarithmicEnabled); +} + //================================================================================================= /*! * SMESHGUI_Preferences_ScalarBarDlg::onXYChanged @@ -833,7 +859,7 @@ void SMESHGUI_Preferences_ScalarBarDlg::initScalarBarFromResources() QString name; if (mgr){ // initialize from resoources - + // horizontal name = QString("scalar_bar_horizontal_%1"); if (mgr->hasValue("SMESH", name.arg( "x" ))) diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h index 804b4aa6a..05dea0f59 100644 --- a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h +++ b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h @@ -23,7 +23,7 @@ // SMESH SMESHGUI : GUI for SMESH component // File : SMESHGUI_Preferences_ScalarBarDlg.h // Author : Nicolas REJNERI, Open CASCADE S.A.S. -// + #ifndef SMESHGUI_PREFERENCES_SCALARBARDLG_H #define SMESHGUI_PREFERENCES_SCALARBARDLG_H @@ -78,6 +78,7 @@ protected slots: void onHelp(); void onSelectionChanged(); void onXYChanged(); + void onMinMaxChanged(); void onOrientationChanged(); void onDistributionChanged( int ); void onDistributionActivated( bool ); @@ -94,6 +95,7 @@ private: QGroupBox* myRangeGrp; QLineEdit* myMinEdit; QLineEdit* myMaxEdit; + QCheckBox* myLogarithmicCheck; QGroupBox* myFontGrp; QtxColorButton* myTitleColorBtn; diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index aa1c2add0..5e82b9bb1 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -1828,6 +1828,10 @@ Check algorithm documentation for supported geometry SMESH_LENGTH Length + + SMESH_LOGARITHMIC_SCALARBAR + Logarithmic + SMESH_MAKE_GROUPS Generate groups diff --git a/src/SMESHGUI/SMESH_msg_fr.ts b/src/SMESHGUI/SMESH_msg_fr.ts index 5345d612b..b322da2b2 100755 --- a/src/SMESHGUI/SMESH_msg_fr.ts +++ b/src/SMESHGUI/SMESH_msg_fr.ts @@ -1800,6 +1800,10 @@ Référez-vous à la documentation sur l'algorithme et la géométrie suppo SMESH_LENGTH Longueur + + SMESH_LOGARITHMIC_SCALARBAR + Logarithmic + SMESH_MAKE_GROUPS Générer les groupes diff --git a/src/SMESH_I/SMESH_Filter_i.cxx b/src/SMESH_I/SMESH_Filter_i.cxx index 523bf4677..f7040c5ab 100644 --- a/src/SMESH_I/SMESH_Filter_i.cxx +++ b/src/SMESH_I/SMESH_Filter_i.cxx @@ -18,13 +18,12 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses // File : SMESH_Filter_i.cxx // Author : Alexey Petrov, OCC // Module : SMESH -// + #include "SMESH_Filter_i.hxx" #include "SMDS_ElemIterator.hxx" @@ -580,12 +579,12 @@ CORBA::Double NumericalFunctor_i::GetValue( CORBA::Long theId ) return myNumericalFunctorPtr->GetValue( theId ); } -SMESH::Histogram* NumericalFunctor_i::GetHistogram(CORBA::Short nbIntervals) +SMESH::Histogram* NumericalFunctor_i::GetHistogram(CORBA::Short nbIntervals, CORBA::Boolean isLogarithmic) { std::vector nbEvents; std::vector funValues; std::vector elements; - myNumericalFunctorPtr->GetHistogram(nbIntervals,nbEvents,funValues,elements); + myNumericalFunctorPtr->GetHistogram(nbIntervals,nbEvents,funValues,elements,0,isLogarithmic); #ifdef WIN32 nbIntervals = CORBA::Short( min( nbEvents.size(), funValues.size() - 1)); diff --git a/src/SMESH_I/SMESH_Filter_i.hxx b/src/SMESH_I/SMESH_Filter_i.hxx index cb82aa6d5..d874819a8 100644 --- a/src/SMESH_I/SMESH_Filter_i.hxx +++ b/src/SMESH_I/SMESH_Filter_i.hxx @@ -18,13 +18,12 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses // File : SMESH_Filter_i.hxx // Author : Alexey Petrov, OCC // Module : SMESH -// + #ifndef _SMESH_FILTER_I_HXX_ #define _SMESH_FILTER_I_HXX_ @@ -162,7 +161,7 @@ namespace SMESH { public: CORBA::Double GetValue( CORBA::Long theElementId ); - SMESH::Histogram* GetHistogram(CORBA::Short nbIntervals); + SMESH::Histogram* GetHistogram(CORBA::Short nbIntervals, CORBA::Boolean isLogarithmic); void SetPrecision( CORBA::Long thePrecision ); CORBA::Long GetPrecision(); Controls::NumericalFunctorPtr GetNumericalFunctor(); -- 2.39.2