From f83a4f96dd702720632b7392eba582b23799a3a1 Mon Sep 17 00:00:00 2001 From: vsr Date: Tue, 8 Dec 2009 14:56:11 +0000 Subject: [PATCH] Merge from V5_1_3_BR branch (07/12/09) --- doc/salome/gui/VISU/images/isosurfaces.png | Bin 22762 -> 28550 bytes .../gui/VISU/input/3d_presentations.doc | 6 +- doc/salome/gui/VISU/input/cut_lines.doc | 6 +- doc/salome/gui/VISU/input/evolution.doc | 39 ++-- .../gui/VISU/input/importing_med_objects.doc | 7 +- doc/salome/gui/VISU/input/iso_surfaces.doc | 6 +- doc/salome/gui/VISU/input/med_object.doc | 14 +- doc/salome/gui/VISU/input/slider.doc | 18 +- doc/salome/gui/VISU/input/sweeping.doc | 4 +- .../gui/VISU/input/table_presentations.doc | 6 +- doc/salome/gui/VISU/input/tui_evolution.doc | 38 ++++ .../VISU/input/viewing_3d_presentations.doc | 215 ++++++++---------- src/CONVERTOR/VISU_MeshValue.cxx | 4 +- src/ENGINE/Makefile.am | 2 +- src/GUITOOLS/Makefile.am | 3 +- src/OBJECT/VISU_Actor.cxx | 5 +- src/OBJECT/VISU_GaussPtsAct.cxx | 6 + src/OBJECT/VISU_GaussPtsAct.h | 5 + src/OBJECT/VISU_MeshAct.cxx | 1 - src/OBJECT/VISU_ScalarMapAct.cxx | 1 - src/PIPELINE/VISU_Extractor.cxx | 49 +++- src/PIPELINE/VISU_IsoSurfacesPL.cxx | 37 ++- src/PIPELINE/VISU_IsoSurfacesPL.hxx | 11 +- src/PIPELINE/VISU_LookupTable.cxx | 12 +- src/PIPELINE/VISU_LookupTable.hxx | 5 + src/PIPELINE/VISU_OpenGLPointSpriteMapper.cxx | 2 +- src/VISUGUI/Makefile.am | 5 - src/VISUGUI/VISU_msg_en.ts | 12 + src/VISUGUI/VisuGUI.cxx | 31 +-- src/VISUGUI/VisuGUI_CutSegmentDlg.cxx | 2 +- src/VISUGUI/VisuGUI_EvolutionDlg.cxx | 66 +++++- src/VISUGUI/VisuGUI_EvolutionDlg.h | 9 +- src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx | 106 ++++++--- src/VISUGUI/VisuGUI_IsoSurfacesDlg.h | 6 + src/VISUGUI/VisuGUI_Tools.cxx | 109 +++++---- src/VISU_I/Makefile.am | 21 +- src/VISU_I/VISU_CutLinesBase_i.cc | 7 +- src/VISU_I/VISU_DumpPython.cc | 2 + src/VISU_I/VISU_Evolution.cxx | 51 ++++- src/VISU_I/VISU_Evolution.h | 2 + src/VISU_I/VISU_Gen_i.cc | 6 +- src/VISU_I/VISU_IsoSurfaces_i.cc | 29 ++- src/VISU_I/VISU_IsoSurfaces_i.hh | 8 + src/VISU_I/VISU_Prs3d_i.cc | 8 - src/VISU_I/VISU_ResultUtils.cc | 2 +- src/VISU_I/VISU_ScalarMap_i.cc | 5 +- src/VISU_I/VISU_Tools.h | 39 ++-- src/VISU_SWIG/Makefile.am | 4 +- .../{visu_swig_test.py => visu_evolution.py} | 40 +++- 49 files changed, 716 insertions(+), 356 deletions(-) create mode 100644 doc/salome/gui/VISU/input/tui_evolution.doc rename src/VISU_SWIG/{visu_swig_test.py => visu_evolution.py} (53%) mode change 100644 => 100755 diff --git a/doc/salome/gui/VISU/images/isosurfaces.png b/doc/salome/gui/VISU/images/isosurfaces.png index 358dc90650eec72ea181d7744713afa5dd370855..7b13173ab633e663a38221ed2ba88f41eaead780 100644 GIT binary patch literal 28550 zcmbTe1yq!8yElrWVuFg&AtEi^jZ%VA(k(r744onZN=kP(Lr6D>bThy(bobERoO}NJ z-D{n__q)G!zT;Y`F!ellT-UE|e#*;AK6yy=5Ca3_iPQ(N&lniD;xRC8``^C@eo~zs zQip-@3PVclosx6n=Cq5J((?76y@9uHUkASGd~KEb^?Q7ccb%!JagkA67F=JoOlHc; zC_CFoPd$#&v99WKU6YFCaQUIicFm&SNBUQ<>Rz#6vO_(+o>Eex=7R3K&lV%sdR>wa zEDn0z2e`0aroQ_A^!?aRJQ0OAqxUJk|1NB8Ei1PoReBDQ#vkiWux@O_7q%`_cX@xG zV$=F^uuzf<)Z%H`%2}^+~US+1KbVe~Em~$f|eLCWg zD85&Rybxzi(O1Y*%2lF=4Q=5;4$oYU={4@d9&f^ZX|{=fhUQ?=M+Mx1vpP&?qKeX4 zPq$`!Fbar5G5*NCG#jSovb-P+L}pt5IkKp~Hu~h*`9Sb{# z`=V%e8X~Op-tqAA{ZdV(6kL5itaJ6p*g@dxk6QhdcHHsE@SEhTM@}NM*$I8!RTV=e zsxN$B`*_!1zVD~bDOnz9u^1;-g#|j%6Zw4JCZs7O3mtOEPoSxw)0|T4?yuV2l_lZX zrLnTI;^E=Ji1m3a;^>H%oUBt_tAY!8ICRqr;Yd~RmN0r>xF({E>LT1k#*^^E(o?%Lm*uO)Gz2>G=$-cIe{TvK=Zm-8|6zTl+(2+w=L*c3|15HT2HfqXEW-w(&+IFohC6?%W5 zSSz?OcPzgYTt687YLmn}X4fu-7D=#GDa&p=?jnPZh5I-=cSMjyf@4iyIN(O?*9PH< zs~zM`Eniqvsy%B&G6v+@3ov+d;7v5H8JHK2mMfvtl2XzPuLR1e zn5=}VtN9`s)Q%xU*g4r&_S=Kek`mYyxmnD)bDisV8fQu)8am`KsXB~y8VZ@6j<@`r z*qzwy?9NOtgs$sMHKR1=rvLI|>>^8AUbx2`O{3Z+TlbTvvn5<_HQ=-ZX z755WB=9b7fPhNQ2M{C5ha=S$)aI{Dm!t}*ZJ9xBSEF?O54 zJ9K?CTE-|mTwE7u9k+yg0}pgWj0V}~uYX!}eo7x3_j%y-cww(Zbo}=bj*#n(V0&<5 zpd|IDKfe;XCK%l?@=2@WgFNzzJ!c0_!&(Rj>+oTtp1zHFPQerM;{-}ve%kH{Y!3bI zu72e!zBOfWwmU4;{aRn)&29Qg`R&IWrG;_ioO!xh!t_xO3snLW5{NHOcIfa88!xss z6O)qm4i8)V`U8CCgxy*xuD|dlbHAT^fZ!E@gE=`y)MjEL#AIe>CJAH~9d_h2YeCTSnS8EH<}@GuG6EZm)4KmPrI?xN z?)rgoLyDK7?xGJ5JT4JWh=% z0r$1BJgoRlT^_f*mlWJbB88($lPsXX@qo_Ye%N=9tjUe1Cz`Rvkj-}E@~+V3In6Pd z@+;xc6*4MZ7JmMO+XId-bn5Sm9IW)gm$DR63!PCO9Wy?g<2629GHD%sNiK8VST;~7 z<$00j*OTGsFY&a+$R=MHWAARV(LM z%nCF#^m??)e{b}&%+2o&h&D1d4&QnCJv`>orALifN#m3&qJgPyD*jAi80>o0v@z-;lWCbB842ETB3X)I z)O=vIA`&B;6f5Au#w;86r-2>si=87S{|Vbn-xOH9Vyi2r*ZN((y<$deO6=rQA8s>| zNH6_4<38I(;Mj+4n7ObeHaN$*J-3?TC81!>kc4C1 zm(*U%$j{@v@Hpn^-layAmZ{_J+&iU!2OgeeUF&goPC0T^i*+u;oZ~L6cNB{}lpBg@ zWsXkNy}u=X3Q8`lzL_am-uEck^8(O-fXr=^HQN20QKDRcW5aPqcB*G#x&j-`1$yHD3Bd+m5~6HzR86etow3g10(- zU;w5-Oizqy-tjwK;LMjVp3Am{CaH8|NOJ={PL z)7FU0fu_;doL#Vi8QdPMAEWsvi(wiIBNt39qKI0P{E5G!A~)9!VMoNt;|x(7mWK~J z`V$w0$qVjO+ym{mV7eZYCM#C+;>cjBGt5w@d$Fu|bZM*Nv)wLbKNW_vNOs&zO{(4cW}72-pC zep>>2qp#NKp1dK8-QlO(C@#xp&YRb5j1#K-R?27Fbvv|N1YLd1uPByZTi4&PHd(5L z!pEOP$!R7k7fCQn4xcV0;szqX_8?kHh-6#OnUoi>&v z5nkhLU=R6R`YnAjL?!MQ>iPv8F_ zZZ9bmj(o%skp6{(2)=%Z@p9%{`xll}B>pY6sc+dFgPjfifJrFjA3AZU&Z=Zv)cW{{ z*0dNIjZ+NJAab_ot3j-V%VRXiKI3e|reQIo+V10UvCw z*%zL9VkxFjm$0yhRR$pd@s~iOf_AYx?^HuawzVqS&;)*O#9n299Xbf zVAk{^o`<`+tLs67PW!9|z49WFiTOGDB?q$^aQyYIo(N$(I{n{9iPojix&~!ii@o?2v*~dRqt!kpWt&9p1E-p z$!II&DX)m4FNZeZTU}k9;KT&2p@|W6{_ow_eBu~$3k%=O6;;{F*jR~z@m#bMYCo%~ zeULVj*5;^qw|9KpUggWIKCT|Dp9tG1eu~UL+<`}4`^qG2!9?$!RY9@g zGitPUkb8YPA)B@w8_Lg9q9-9G{TUjX1C8llT3yXh$ur$X)NB1_rOPHZ3*;zOeN*SS zlaDeU>GoZEl#4K{_o(jz)0WmTj+YN^snT$m+#(-gHnLHB@nmgLk&K3x=SNbVquu_9 zlyP5jo7eS0ia9+y6_u~mblrHix61CpL56{|q@A4|3sLZrcE4yba}AM9)@NtJka+j*UDlPYz5N?z=Fr8C5CgWj&c2?k>gv;YpT2_u zVL8-j;n@bNcx)eqm;EUYzzi>C)c&R=a$9?Iq9L%a$s${~$+MnkN4##-Y5S7bj(K@u zythoj{fw*fIsi40?VWwNuVpT9w4~VD8#F(%uIOI3tqJZEBI|Y(rCJl~8n(q>S!Q{` z^*rLa`uWC?bkD|A4SPv(NBFN_@+ct^9-FT+3EW|^kr1K!n8a`kPa&5fLo$y;g@usT zXHIWIe*Jo?6Mqx#a%I#LZM)F=fXi~Gbz88m#%BH-@77k;?8;!8sKrG6&lX#MTRVIG zy`Dgr1^T8;3CF@;dprwBx1l?EE)nr;z&N>Ld$A;=y@tAdbt5A)Feg@Jd9lR}J&)0K?^>V=d~pB%pOzLM z-$(fI!$P_jyy%aZoh4UQRZVug=Jhh~pEsuiVH`zAV|o@tYBf+@7v2vt5*cYDl==E1WFnYO)&6eiBC*7Zts{y4pc( zUEl2OgLQfpI=i>OuiqU>r&7^@L{@bldR!c{8Xpo&U{%rl5&k-t`lYnAw0GUq)U@1c zy7sSwqM{-poAdp`+nUeD*nTl3)v1v6yv#@MmMeX8J_+UtfD+pG^! zWeafmPWnx?U*fN7mM`X{c)m6^e%#pD2ltu(njOt@b8~2I4W= zI64|HwEk@E=+Mj@_z~wF6N8_eoZK7B+Okk)BN%yHH75VISz=5nNy|ZHw2ynXmnOyi zc4T64+}`G6zbC}^zE*{D|9tSX+!BdL%PYLFwWXb5r&$hZ7QQ)?-KBpwi6k z2VWI6S)Gv`*(_ey?)R{XegGyP!>miq@n$4_=KJ?M-@bjLw-`PVb`Nc8YC;_4E79M^ z#N>spJk|(~=CYjp6_w;0lY_rCQMp)L=7p$!3l?~?*Sre`8$0{iQiPoIcFk(9<{%*< zVY$V4>0gIX65hW7PAX5y$>sF)(rPR#`ZOa>%Iq1mi;-nk(|pm)y8UiD4JN~U^cl1d zLCMeML^jH-%-b&aOpcG&OetI3x~1BWUuiKuq>s7cs_?@1^wb&LPwVt_($v%xYUUn% zcjPRsEKf1VZhuKCAn>Cnq3&@DH&_8HO&lq`y`R|F*kVuq3bY3iDw?WCkR`VEC-K8k zM}|g5B@0O}r|gGiRt|S}ZB&Z1r1bPC^78U};{-c4gf{H?K=lE$Le0t=1}0HGGn8C7 zc{Rl?IWqEv9TXbJZ9NlpEEC__8ylC%?}qKuEaL7iFq|z@mVaGoIhj7Z4jLM5zzPFKm2R%F9+0IJx01c7}|X9bZ^jSP&R6u>Z1!S(D~l{56%E zBr+&C-bOAx>O$9>fpKS7mm&J!%E8?~;-0m5Ut!VG)4!&n@s|_6iUbV>dcMo=U-s6K z5NzG0<>kG0V(VCRzt+HF?3eA&%*@>FW++zD2<3D!e-GBu_M}7kV~A-;dEgb&TzvyfCfv50=U;j0pAVbf@Sb|dU`@QHNu(Rs8{HW z*D{!OAlBuCj^3E76sM)8ex;~-GM{pDiH0f|pm>x)=3mRE2nAPFaYxX|tyCa&*o$v~ zjC0WCB?O*67k{A{tpdw3=m=SJaNU2jZ>drQ87peM8$5+7AY%~pnoD)~Gu(q4Ea3w- zIsP!y=;>=rg$6uEjZ_8mP1oYGgu1ETW>GBIfEpGF3CY@EBj(+^cVE0vxvpcTkk*cI zOVaMIdn^KAbvW~z9w@({oRsYR{&EkXNJDw1G>M6c0OYq1AaP#O+cBv-5hyBs${0-@ z&9$|$`E4$E%ygrXD90l=$z`b^-;1w(UqR8aW}{&9XScp+i9ppNl*WXHuL@-$)T+-y z)Y;wt7m37=(r8=miFt;UC{)N$Feh?I1tsE97yf+}zYS!gD1pT-QEL@qi27 z-9LOSD5#C?q?KVz)+e8*e00rhG4U-UgYw$*dP%E059u|bF&3kZlk}5V60p1R@$u8s z(_e8>bh;0bBH$xb#%~7IJyK~O62=iabDyl}$2&MpKMh85-X-GZuDW;BkxCSwzVP}W z=G~W`KYUg)SF0=3O>}fUvjgYkWP#@>jYgDFXm;4IC$}lYEPZ|bY+qlC6(Wo4gvlts zKTTKoB?A8WTl8iS?I$rj;6OV=(zk;F#j7iwR5t0+j~RzS0FmRu12Cfsrnu$m0v#9b zdHen8LOTa^^~o%}bB7zenQa90|NZ*#|NX81-9z~^*S>w{Hp~^Vall);L-9Qq zdc-uCDC7};gc@ZxJIt-MlCFquV~Y4f`5kh&p`0r9>677A?NLyZle;!|mPGq3zs|Sd zr|EE*s`pCZ&BZsV2pV`66#sw?A0MC3VWSlYAP*j5=eLY1TMR8pJ-7J&G+3kI0SCCn zy|KuS-eS4d6pU8@4NAl;9i$q z&f5f@ST~6ma?o?lp4r#n?gYKI^?F7bH>c~6>HRoDr(Y>0Lw}#e^pS+{e*(DjhlgNg zx5(nsl2~sq!2_=MKO}NyNcieBzIuH=vNZ)!&@m1o0ikDwglQ71B;0=lB zJsiEg@HRwc9miOw9tVY(fo;njA}?Vt*gj3p8_=Iu2a;CDO;VOy_i)S25D&isthKkF z9`iFWFe5b;10zb>sKnFs*Dc6U=7W1a&6j+Fg40@fB41!4f&YoS09*RP7S|o68#VNW z(rZKGzMdR+w=Pek-t8x9!nDB3tlXL?U6_6uR1Li|d2W#bAk`-qi-!lR1158+-T-vj zp6wgG7kzK8RfGmSKLOyG#QU1r`X=xY6sg@SoY{mENP%*#BsAj_*kUcXctpmHko+P9 z49el!K-QpRy{A=-T-@4{K^AGB?FTXgC;;HAeAJzEKm?z%Q)YJ`73(-6f7HctTa)F{ z<$*@SveV{*w|*j5pF%j$KWBI;^>F{ukHEl1^3aEiJ()N zaUT(AR3D??>H*Xakn-yFgOlMxw<!bR;WcH3?|DBeljheHqvB8skA zD#~t8Do09UxB7eZcnqz5)*BlTQ5Vr|(B-jyCp!2}PPL>-jT;XwQ-M~^kp9QXi4z#x%f4oqPj4_E7A)T6Zmu7Hv%Xt zV8h07Lh)Q1X3{sEW<32v^hno-Y90}DTP-D3%~I4G@M!Zn%>%a-R!)B8a?OEv#5ahs z{OuDR&;Syw6@>nsaB;C!#cRLzG=a-{!DdP?kt9j&a(_W1s={KNO*WCIIlC`mtigmE zpGk`)M<$sgPLkXs5)|cD(w~%X-h7W)X;RW7R9X0Ld z7~#kojMQ=KTXE1z%AsDix-cL{HE9m~JjH!nXF$Np%DPgHjBb?Z&muX#tjWpTs&mvV zFyFdRj@tP4ud%4Glw3cnUy3vggt`?s?$hHdGM9REI96KDN&va)qpr4@g0ZUv-^KBc z!S+8h9-=xXU))?MYw9HD`fc9FZZ0qMVDo$)XVeW1ar$0r9gRGe9V z%Z*BUegp>>a!kjU(w9LyWL=LojILi@oSv#>g8rHyJlEiMvVyX1EGjSPmUWHMo&m^` z%l%o(^(N^wfh?qNf?<%w3 zmIn&v0GZ%V{^zPj!t_0Eb91-cJvqGTWCyK%&p z*eaX@^kyGrCKced+I5c03B^rm+VcDu{fWFS(@wK}Kt||Ak??y48TZ92C@F~nl*p)q zg>_f8HtloDYN+79&{Xig%87@ij5>y&J}HJ~m6iVfk{3siVEhoyQP#(p-kzR&aq;qb zN`Ns18cAe4t2pm|T6hk5>1A=@lU9Y31#~@&scLv)G!RXHHH$)Cjs^UQ_O@T2${G^Y zKtx4FM@syR8Dsd-LyYcNv^_whZSGY3~!zCsOcQ>TCWVxdPMrY_9au4hfv7-?Eju28ja+hcfjalnM z(WShYgAvu6H%iqrKp1#RO4@ggc~SGr-TO3Rk2b)r&jl79Yh(10je??Ce*muHFjl)Y zBQ*1dTF2DsvwpaEEqWU1<9%L&X|zR8qqOkHEI_^(hhS!s;y@zq>7%r^-l0d<;2jzL z$L@|SZQI)|S!~~5sK@8^x)zYg2m?KyeaF{j%41-9ML;n}c6q5Q;sriF5JTTqmQw#4 zrVT4^%y{cB1} zLU4o4@0!sSqQxJl7=6$2&)9viDM$(2QD0n-HjQkZ4bJwL-)dC<0E>~(Yrr`@o&JU* zmD2_GoRF}q(8nrEbwH;a0{^T3$wJw`a8d~9ic`~5>obM?XysJ$gbeW7*kSZa{H(kB zMfu>ZqxxH7ZVR+5{>&+a_QYp6e}dIvLJ4TE#(%NUbVOTa2HqkX zVeVQIW$bpH_r;Ipg;I-)i=%Hruf=b?K{n3kiKKRKieLT=IUjC1TXS>s;SMrIsNrI6 zW2L)bypq@J4G~tHaOH67G2}Zf10P@f+S*#Jm0xa-;q_R^Cj5WWr+>$B{>7~R_0SSl z!h0t5VALd!~ zE|K>L4@3*!x6OJ>>IXww0eQ0xmi7tI$ZFhglJ?aoth~?jo8}03j}qC#_!=ITad3 z@i`t6G-SAD&<41~rPHGIr^_+h=g*)22nop+y}$<2S@h2nxi^%Q8Gmi_i#$N3p!yg+ zNSBWLZtGhtmn9JpAYMjO6|tn8s@{0$NEEL0uCoK9|B;iElR&)7V2(BUf?Vt3+}tZ1 z7qzS09U`$*7us`*8SOo$fOJ6Q!ALFw23Kg8Wa(vLaOH&JedhH|&*?EGHFfq-J-R7R zHid$w%y#v2J<}w!%xP9VaTpvPp(CUu8VO49f78?-;x($XSuI^lWv@ZnpX6h4RU{L0bnf(N+Nza6(U4p6|@ zvYGvUfiZU8RCu^Pj0H+2ki}vJO&opQBsllZCI-~2Z78mj-~^goWk;b9943w#z~PaSgJC1%_Lu1&mZbp5wxNG=?&Atxv2%mr{*7J|o7E0&`L zg!21Fwnw0aL6rH;6-UQx4b*Gx>A>C62K*gm)I@)SadEu0xGc_$i;r(2)T=y++Yj{E z$AkiRXn6%pKp*H1hpKX}&drGcqM{+wC0UT0oBNLB_Oo;@qE@mee}LoAIWQo}N_U8w zEtZ`~MVP_Y?N^XM#Nnbt0^Te04o|=9c0DBupqdnZH~{`D@AvN}9Hy0kq|h5d#_7v*AOHe2w;o&bjo7p) zi?>A9=MvzbRa#7cHnF^qgJZJX9rXeaFC3tV#Br#F%CQITwgKP@?v2M#>M8E#daaz{ z`MI^PWo7Ju#P-H>!bZ0eI82|j8yMSdZ}L9Ahq<@62Y`NGBGW3wtVr|&mgClhxTmMk z+1Z)JY-Q4qA3tiXqMtgXH{XdTez#ew#$`430rG*Ca+^eNxULXnf>NfYwDu1U)`zP? zT|j&2Q7^Z7hE6eFC+~@gE9;mzY$g1=22-U@P81PB%D=F)Gq8bxoeebIi1z%67PALc zl8EMIDv-4G7t}GzvHLl7#%BjoB1a-04g(#Cl8dWy$lkpB`GQ0Rz@wL#mmqBn;UFr< z)*#`)hLjTl^=&ZsV{{h|XIljUw__s0$r>9dGGdoMiIxkuFDBwkF&?*3`L6*lrFE(6 z=9eHkuyFi;2rMAJY(IV_ru{Qc;ml+I`%`p%rB-OjC}`YN`q3_do%G;;NNE4H2h?nQ z`eFVX+Rbo zwiSO3-+(5}&{iV&4-lnTAd0&8vO?Np*(>T{g@)xbo9~cFM z(`78p@HhdrskcX^v2KXk=;N%PX4RA*1k!t%62qc6?J|I}!hIjGK! z1Ose*i>cpXo>%9#9lQL4sH4sC2LB&F?qhh4Up@kcIKWPizxrTd@1vNT*sf>xFa%hy z9$=u$wua1EsE4U*9(&F}20_&S31wKB1cOiIuFCZ{b{kP4nM|f{@ ze-|AF*&lDsb^tmNcin0~#6C1$XUz;=hNMv6_!s7hAp2Os_UW%j#^3`!5Abc`kzPuvlvcUKQTo%W7 zTW|L*u4YvZpkN4%2jXM^mAwUuXR3jkj8HFUKF)32Vs*Nj(r-A z7R=-9C%d~W1CPwNW*QRGTKsej>9bIs?~N7r_3{;8g>pfW>A|1SJ1%5%54>!GyGobgUQsg2lwd z1`FM|G0f zAs!wXY3MM`@3fr>qN^2VRZpY-YYW$_{cjX9n%8oYd=hw9#+MC?aU3qsB^N?$E>HK& z&E)<&LxjpKM>zmcrB>(2h!)r%oM`jbe+J19%h^n+h*(1Q2&l;bSk6B}Lro^iO;_xB zC83tmIAKxe>m4bby}hjUUHURf)*l4k0D7dP<>^cW`xSb; zIpd>K%&i-?vbANYobbG#CiQdP{rkU8RK`?%9&jMk8{K&W@tD#*Y}|lgo1B}=;Pl=D z7?82-P9bNlliz$Fsg>KnIT85(#pNA4?1x=loX~J{$AE~;`Qes+8}D2Tp^HtRo-2RefYd-Ww`>*$FHTebA!l-o9Px zf94cFO!@jX2$nDEl3xX$%(|t3;E$-^W7eEm-UZq4@Nnmwh7%X?B_%Cgs^+D>$p$3` zbjy6TKdC|}hek|U>1#Ue!=FD*ZViH*qq7lkB|d*vr2nLeR~IxkHYPn>NcZsvF`}Q8 ze-CF@5{5{JL!_CEMtM@oyPvJ|0|~8BmvwQ79X#H?5j4e+?Et2j3M@B zY%is#Cx4QLbEFRRY2>2**RNkOK%~mNeu@YrT!8a2Qu~BEApSU`sM|cZyFajd>Aw>_n6Ua&;jZTf&yilWpEk<2Qt2JCTdT@D#2^_TY zrpXq5H?v$XeX)m%)+H2hW&zlnl8r4K*j>i5!}#myKBrx4KMyGK0*KG8P)b&+9m0mrKb{|4NG5{b%L720*X1=9(A1n= zTuaafB44qmz(sEvAS!_c1#bb{?O#{SG2Iw?0h|fqo|#wIVgev0j%CuHNWsmGud0eP zn{+(l8F{k<9LUqz(VMj4^I8_+HEy+TaGM58mkW)niUW~~qYm>o3pZmKw zEHS#{B)3k%*$W0s=(wb1Pi~Q}a$jA12mpfj!2!I)AYoG-FsWRC_|-V<77Fa|QgS9| z7|lkM9;9XOC@TNQ2xr}XA+GS@lfa{|qs=w#3>Oz?5#btptONgDa_4hew?Ob!z|%ai z{v!q##k2!#mmJxo*RNiE4K&5)1>PHu(C#ZRuN3U;5se<_`-^hI&%p}T&>%7yNHzja zG-J2rbUr6g89>vs=Oe|$db|W;RknKzZ4W2Wxx>cOg-2G~uIwNLlbMxe3w%i)m;E>3 z`OD|5sW%uvJe0b*b%pNxM8Wr%<(P+thS!i);?jqY(p+)m4YFutLt8mf}h<+2zP z0pkaDTcWU6@;gkdxQ_Pt6BOt~iy+^!0BkE0&$5LT}=97-GSrOn)1VBoVbS;w1;t%WU73p7p(01(#Pj! zJdzA31DV;J{Br|l5ZE$2YUuy_zJ=$RSGt4??4q$U`z?lO3HH~2CG9tEc;ivFE@j~0 zlp&k?h!F>o0t|s?2|*T-K6vl|2*`^&s{?I;__k07N~+KA?{i^gw^G1g?=gh)vVIQJ^NdiF9x)P&O+=)&KIbL2GN@`Ke1qG2ms7>R;zcmQs| zAxi-KgZN7<4zshHTSROuBn%9hoZ!(5bhHQv;D9oK_}TY#+La@QjpEQy9I&X{zOaB( z4t?YS0oZ{A!4iL4T3l9>oIuh_0Hmh%;pyVw072|z%&%WxtaQiyIW1wPIt@Cy%X;7P z+yA2~WG~~re5oFp@i`9!=+J?=%*;2?I^5^a-?oEw*8}(tU<Cj*2C^gVD;y3-p$8@$gf$2K{4VF~IRHbZjmh_d z`u$eD^gG-@LQzZ0LP-6jmwn(Dl+GW}rRcZne?eC7Bei)P8`H85TTaXt0B9ZHMAEmv zw}CSBx8Y>QJZyVqMZ(>^Uc3$@WRg3`+=BWNxS?yi6r+W@9Z60zU11rL^qZ2OK0Wrw zCSL$iZFC??LE#xlff2|^NCXqL0ijMxPL5{vGj(z zM-E2*pIxbdG(sUma&O+Bd>>>^cjtU?!ku_SLBI(%Q#Uv$uj97G`Ov{PGc$X4=p*xZ zfv_E`NZW>2YRRIC*t)?+d0x5oY%&(P`!BTnw~PfHr~a zg?xQOgA3SDUHx=YUYF#dF^SbA_6!CRp=kh~<9VooUJYI8r{Lg-T=P#~A1})hKL_5> zI!J~mz2=LXJQ@_mvF%~3+U=wa9c<8aLd&y*dZG_32-Wn2?>)v6)?xV1EC9)$g19me zx5Kh-+@rQ;@*38TX76{?kb79>kqKdwF&ygh$nAKZLipD#ZpUvx(h;mWi6DY^#>Ux*o$0^>-K9zECbU=csoqP!rXD#& zKAw@M*3d+d3T#l=XdWXt5DKC?I>|ba3JstTs;jGmkp~iXm3_lq(6VG@v(bku5oTan z1AC9-CReFYWtjf=OHen^=RsMwUNd59*Z~6q$o2iRGw zpu&&{*bgSof~^gB8xUMTh*42qO$2n1`#>HX+cQ`@I=4Gg<&exbKL8Spgz~?}5QBT# z9+%eUa7^KV&3vW~7=(k_4#a@1(s8{&+xLI|h$I|!j3&n(i#0S7qyj^3)KWvUBBbGP zZ3a_ZVXV&DTAN#ZBn?1~xc$=?Xzk;2Uw@*)yu+W|^TSkFb*)u=Zb!1~ex55SWGSDW zxDGx+SyVh)s0rOUb)%!D{Q~snx9XqmoRwF6A-%v~sZo%P+#0LFthSw?1m}cH3}X2l z=z&%bW(1g_XQ)kGHfFI5l^e{yC-&(UlgE}IS7(b^4Qy5rSlp;3d_Tnk-X%T0j--{0GyQ0DOM{{Dl9c0L7RxN;|YLuhusp2Y8-;a)Le{W@`}f zf0y|CuWs0XL=a)b8#*Q+Tk=l=@F|yL%bobhkryCpoQpC>du*({_SFAdVDVpSt5qxv zoNlWGqA*%$&7}k^30yZGcz^g;mkZ~N&oFt|2>A6D@_L>+=T99NSSiAuQA&&z)T7n< zBW~Tv0s&1Bixk7m{;d6g&8&i`qV^K{fXiV3!U2rBf6|dp)W%cORbX%k$8z$=)I7I) zK4}vI;D{L5g*yJDW66LN5&a$#BnsB>kx<+dy)84%P5{H^02@h6QgU&7TUG^ler8cy z92+9IbL1j+(soIedLYZ#o4_3!6cmISibiRt#5iRYLK0g?8)i59Cl65mv?zQ0LR#cd*Po<5#XXG+| zG&Wu-Yu?nyR_C@$i(;DD3BRjCqpBn?GAzCO?cl=4!SKtMd$Bm|e^6)6y*_a}t8QoR z!tAp<2|KG7NjpFc*Cc(<-J6L7l zc%u~lf}Fg#wN*@TuNAjK=f>~v%rhAfBlg1~w|YV_Yuq^c=j=2h^yL_nJdJFkji@E8 zf3fj5p|G$HbK`D$kyedjYE?vUO)?{^y46L!;hwh6#Z&k82yHaj!#L2Ol8Z6L~G zDy^o?*tfc0G9ZAr>FaPzRIad``P?6 zjRx0>;Vnh=X$AgGha^tZAu#~s!ZX3SvS>F$V`F+YwxRP{ubb=c-rjP4rqFod%y7#1 zq0qUxFH%F`Nr%X$Yh{4VJ})eY$)s>;FSdsaV^Wg;QhF|7lyf9ThR;#uP$%O7e#^q- zjrLX2XC2REpbO`$CcDWhCMT!YUkYqZSE&vNo+RQisX^GcLG+};rN?+{qT!>7YziFY z=nIXC8;;|#N%=BIWb*hDZPjEv;^}Q|)B6sAwkN-ltz?waS*aO=uj{Ok1C=ueg;9Do zx@Z%3Tw{OXxm2kmR&qD5vL14dy~$02eZhDQ#F|F2h=m55eXw97cv&bDYZrr#AjJ0v zxRHC}er%1M@*vw;@ygTN;T)XR0KZRw-a#?nacd?Ez*fF#p(sQ{`WN3om+9*L0{by% zw-|e40CFSUE>9Oj&8BNBjvNxWEDwRxIYt^I*+>4l>zT}Y2cSEs!;H=HqmDf^$6j>>dCSg20fro;H_z^*g{@fO8iCHVu$aj+*^&5_Mw0 zN78ZAsDhKHX0weAK&44a9*sNCx?+?8Zo&T1kuo?##9@B?HX)mjL-lR;shKxXP|JTLboQ7CfH({~^VWMdG#(Nro)#p&YwI+S0MQp$3&Qn|OO z0|M+zS3t@01+D<@dn+}1gD2g@bkUakYmiu52V};$rX^}>YKXY(V>81UY>Tw(RJL19 zCo3%(3O{=4G`{EmuA%F+Hu&!D*nJmhqXUiw9jfC1q98I#lTd;M5s=V=5UPrFX+nr}M@Jb% zKoLZc&_W9(krp7K*Z>6~v?O#?q=uqEKtj7abLOsd&mGT?`|tiZtmRq=-xu<|-}~+T z?B{v*&g-WE!3p+_V8T75tlTwI7So$sLSwU|G$wD&4A4EmE-QNc${$&AjB^w6%y&Uf zv1e#F&gep!L)db5LBa4fNfG5ZWw#D#5XH}f)1XvjW_r3PGxL{a9?u{S_M|0oHRPERQ&Ph^vhF#2-{;D%`z$x9e4IB$)dW2!x^}C70g###gUgTj%}aA3h{PuOaN7K-O_ReyCB` z8`j>mX%mYW670|&GD*taBP^T^{dFW*y}L0n2VH-V4^GYg;$AEyej**5_7fnN%gG%v zgBCDuG5=am_&l5OPkrrp>ug*Yx4_}>e8KrAm%xnH`(^p;ZM-1+wZpx_&vph-`C$cJ;Fr>(aXZ%jby4a>Z_Tx=CjSR+Wkp+{0W zcYjCSUiiuI^x-#$4bW(^xr5y1$%hhs_(Lb8D?c8$PRo(8R9E2^YkT*Wee~{`ZBGv< za;UQhzK`Oc0v;T#FYj)Ft`}PdqMSh^LDkbbVRmrJHC$q+WX9XV^K_?0+Zr=zeFH;7 zW_NKNx8F}0(PnZ2xl12{E1fuVfk*X^)p95Oa8dx_HTrho$p)3{jgB6R+$xIjQ3{LQ zg1CsW(=zkjds3jwk%10n4OrX|@b&dotq9GJ-71=%D*CI>jmEVA&8dRf+1+fF&4_!y zxFQf|cPb+gM0kxGrr!u6o*g111tv*wQI+&ymyhgHpP5vw+e0Ih?{f?Ixu9O>SR~@B8*pZz6?B}q(Kjl5+2D^Sf z?T2HNQp{DCP8CEg>CRWC`{p<-2h~Z5?J%jLeHl`0l3&wi)h~4sZ{B(5^VUw!M_ip{ zg!^3Q5Z|~nI?5Im2bPbz>gwvkSg8CGf+crKULv#(wkjU_^_-$iT^1DPZ=Jt@?!NHF zF_zscRJzbwl`)$q#^ccq?fMUAXx?n7cNaa*UK^RN8wdN41;m`9mluj`oyumMiXCfy zqx!@a)LV|g7ymL0Hu9Y(#?nIOBDu>z5qOlNE#CV&bo;Ab5s$oguM6^sYbb$-B5m8T zqe5g1G?u&3(H4m|^gPFin4l??qk1m7*z5?q+7N7KD#5vQwF7FLg!uR@$%-YDF*HFX zaPEp-_4VQxs#VuU?n3g;>!S~m|M;}E$iAl6IskAAZ1=;}9+fZXcRZZ?&jVflW+p^D zS`7XoOft%2*oE%dC2rxSSp4GpKBVBa<{3!Me0_LDe>&2 zZ*c6k)1!SGE3Ee+4fQdd0H~abt**f15EqvTex&YuN&#=Jj2{1bQpDlPq2Z_>aMQia zQT%~NN3s09Kmkv-$NZy~-f}<7s*$V>DZBk)3mGtHLFL2HSy$-o9BHUpA6kVCVZmdB zO~hsMgDZ5PbL*aLSoU>P^u*UK_Ie=w$M2h|Wl#DvTvFk><-e+r6mC_Nk`N-`LT z&$pxFCxBOAm3$qE(C2-f`vtxeIs|B<#P~`dLC6M9H-)`BG53Q)l%5HJM3r9_ogVZ@} zish+OH$h000zON@y83m_DxrM#(18Odq4IQxe4m;&U)_@7kL3*7<-W=~18zAIz&(R= z=PHZI`@Kxy{Fry}+NB2~D;D?P)J)7?xLSnMR8FzLj~nL_cMKMtsnC zwV_J85KLghgZNl2JwHOteP1d=Js_me{#?*W%P30k+PC!oncCG8Qt|fosi#hzDx};x zeY3e`7`n3{vat%23>CG&lx==)JbEPJ&Yj-)vC&cY?zT&D(oyyN++@+K3PkB)wOG#F z{G4#_`?J^xAqmWV2a{=EfEzZKw6dD|T9N`H{4|TUf6Fwda*hOCs9bm<<>zY(i*k4@bC!x2+gHUYotk5Tivv{xVRSr0y-5*DkNed z$g{4Y!ck5xL*qR42cenC9!_Z$6%~*o3n>inR+~%y_+$Fiu-c<=;J&Yo(3hqzEJj`> zoCrLXdksDDk@PVCoQ{r8RiN$I*sP@&7RWml$qMB8ir~{9-0TkJNe0`w0BlnoKBKGK zjvFoP*tbc1jhB}-cc3%xfgf{mZq5v%v!{OFAH|} zU=KqEFBXFIzo+i!+FlM5`f@^7il(dhY1j=EEV&~`FkW6{XGXH8xwiYlp_Vk11Kj*3 z27_H)HGj3K@tz2=Qp6XzIB?9aCddNFq-4#&YqxQKL`K4x!m&fLvU<=w0S#knqiT~G zrgt5F^e!!gN4bY!Y|&68WJwJ^Jr=n!kU1$w`|0PB@GR-WCE?Qh1TeZiI>q~rlWDeo zU_7yoe|oOs&OrWSz01lMZ%h-=E-k6qj})x)A$a)Dz6)l8zyK9XmUVNoa$wxq)sWv? znCAZq1CHQxnUI3>jh?7Z_T^IU^lO|k#rLg$r!;~$-y2 zWbUkU2o%XdtHq7we(Y9jJFnAvbW29ew8oxYqM1-~9o<2Bi5^Mmh}<&GXjL&H8R z^LJg*W0!xY7j*sHHbZ{zX1PBjs8Z?1_P`GnjW1ukP##Y`345R`6jf)e|0dvwJ(h$`+%8xI ze#+PH(RfZ5y#BP&ZnIGv zg8Mj;9ev-eEAIg}SJeO|d$pf(G_0>qj*ledCFG(-Rm>p$Hfzbc_A`=J5^Lr+2HPq7 z*Ki754P4Emt|=3ii)HJ2&&=&mnQr}g#iDA|ji2GrcE!tNn+mjhfp@Lw-f36?~j6X=)DP8!JN=7)+LZO^_Rm zyATZ<`qXPpK+di%&j-yjyxluDysqIbG@CMYqZV>eYx<$Q#bdRFAbfdzdHO#2*Go68 zsaLTzNy=t#>Jiamq+-0I%A!{x)Fik@34EUU7}~ufD{^sqAQ$@YF?AyIVr()ZnsndSKW_sH2IY(I5DHk@8PrM-qbzvIYwZ$q|JG!= z>tHm;f!JFB73B>1t{%v_e^NXNPUYT1_Al=UcCO6UP`W=eS9YFIT;qth)X^9q18_f$ zM=-&}y!_=0pL&AE+*lBs$vN6acGX*a9@R)C8>3drI^48*<5FuM)*T+_#~B9p?^7jw zpL8}_j(|7x-~svh|kN<5v9h*0i` zB{FQa^0K2NbA)wtvO9w)xf0tLpO)s0ubILrJd(U%Yg-6X7Pqn{0*Rk2eDhG214R*Q z4!W_%2cIwHpLYF@%jq))fid8=XQf-`!L^WAjAn&`l7NR<3Gx^6U1C$Wal~_=A$9`9 zS>dBneDdnEM3J${#rwcM61DMM({nz53^-w^tuei&Q>(W&-vWHqrJYxU)6|_QRc=}j^tMD3VFR4$EOjxKsf#ZhZj7}&f##t)xbOA$%PGm5ORanU z?)>)gC57P6xA)yPIS{LI}H@JSsA-!YMG=etF%*^7Gl1M;k^_B-GqEj`o*<22@ATdT<-7Fi~_lZ_) zlprJqog)gil_tRF7#JI~q4X|%|B@K+7o`MhQ%YDofweo(w(Z33<1sg#TR0y6i~ZQO zx#tdYzi6I<2eFKsH%yZ;O#G8DN>%}T|HFm)eGXR5U!{qpd$zQUZVVL49@NY*BFUUA zbzBjGby_l<0tRr3=SkDUG#TPSHrfbIAttB?H{Bh3=X!#~$EE6(pH z=oJ9!sxz}bs%(9Y3nSa6zQnNf;yw%yGl8$!Hs+9kqc*m$O4Nk^4Ugt^@c4HcUXfx( zAd~~C&S%QxwfR$C*#baY5@@1#fW>yk!yQ%Emch zS0qdux7vzEs2>OV>98tb4Sut*vbveG@@ssGWE2+I1n4 z9Or5*aT&H25Jp7MR_UF{(lFs~YYSjHq$_ilNWLJaM;Oez{?PmDS>`t04GdYbI_gV3T(fy)*9kd`E%#9H{M9+N_z~Ci3ty?*h+;TE9sZmm9y$~7yL-jL`MWBBYAFN4_^ji z&Fw_(&ya0EWxx*&49<7lO^}zfh2D#M+G`8ufT3tFe5d$a$^GDnyzsj9ZCkgRKyy=h z-rD|_By$Q%j(a0ec&v-0--D6;S&Oan>r@24Fa&u0!}*`T7^Vv6&xCECk=9H>;R-Y6whq*PecU z;JHjSYYCp&JS}b-rb&=HuufH6y&{6R9m+q(u#!IMQ zJ2ODXFLe_iHC@NFeHv1@ap!dsT`eLaLPI507I5#$moHFzb-w@iydSf68e?}7z zw(Jr>m>4q;@z01)N|?x}ArO-XXsv(ONcdYH6HP{Lzq)TcKL~-)v@-IFw;i5s_epd{ z(9DWSppC35=a?-zHBiuDr&W z#7%#Y1tz^ViKwE7TLeY3me_Tmy*xuu1;*5SggCK>;3(soyMld-@s9)sWG!Q}ErvtKX4N+XSgDebb_%y$8|v z8>j72YKxYgOTGB$=D&VNYn=k4E&+UU19pO4eyOz*m8U#C4RP5DVw1JmC+&ZD3QljC zg9j(U8D{~`YGs#Jal!rC{m$Ze_D*h^JjxM_(FO(v9qmLt;a$5j!EHYIKu^-QXVoK9 zm73jab=Jh>KAM0WS@?8U`BkXlEse~cy6`%vOfvxK6&R;!_m)Co9XKjd12ar$!!a6~ znK7Xkt;4mP%a}piGut55E!7DFJ7Es(5#@ml3g&Q#&s2H0*58Y-`)126c+Iod0 zqqC+JClf-`+V~7ijA;*J{;#`qZff zmW}t}2XO%Qt9+jWCEzO-AFa+_Y zz0*9EwF9+&5pQ$6N}`KJ9e2HM(F@aX&d6UNn}ER1gk}q)v}1O+b#HU8rF}?+J08&I zIGb8?S5n+l=?Ku~!An!+wYBz*4DFTkeD{y*=U<{llo}Mcx@#jPjD^7(KA|rBC>DAm zLG*Q7N*w^{GuBIxZt?y0-B-08K?@DS573d<$J4>4L*|dwY<55gVzEhB-uQ6rLPb${ zXXHcKLMQo0l(zS$Be-Dm^?+C5Q&XTUWb{+71Zm_IdA7HI$}fw6E{rO}w9xe=p!*A8 z^jp!#j~|1ojNN?3T=}3B#Jk?E48Z6}{+P$78@6j{y!o_^LR8IXSsYyM$;E;fM=V2g zrb2TJSEl9}g$!_ED06#AqT*WJ&a1!ceotE-eIlbjoc0q1Hj7O&8-RAj`ieq1^o7Ln zccMoR^sE)AP$;HQc}c_bf!=X1L}z|@j2@yTZ*J4)Vm0>EAkl%j_*lc6%(r*Uh0NHl zjeZ_-1^0AL{;aCt%-krv&B?3Ju`ukV0XfD0#+})eV-Ly)bG)61vw7udi~L^7mRsfC zo_V{Kpye`fDFFu`z)-W$VTio;@ekM>GWwuLt2TT0WM*@5=4m-V5L0VgK~wQrxk%@> zw6rk!ejaJ;k-achr>MW$!*PXF); z0j5@Y1qCDG+2|4>LqkJzSTfH^aGiU*O?4OZdKh6jpNAXi#QeN5+j5D1-$n^gnmbSL z(7IBwn>&UWhIA2M(|xaDEir(`j842h@|1zJg}%B~U|<0aK6RpOu$5s8%)Lux1e@ zg69jOr)#K-hlLf!c%SmAjqviqqM~y8{DVQGnsiDGyhZ=%;_B{UE{y(kZETg0qhYcn zH1L0#OTNf9^rak`pI_<}3lBRzTeFnf@`lkHmcD+C>%!YVv0>7l{forP*s-Q5Y`*Xas+b3s?}&l&fH%{Pr-h7^ zl*Bm0%_esQKIs;6_ptF-u9llV0RC|Ore=mY_@lrUwh;B8E-!HZ*Xv0Fg%xbje8fydyG?qi0i)0fHpX>zOhjr zYKWn=A-wy(ZuIW76j#E=i{Eb>gdN5z0n^F>{Z^hZvS>moInvmuOJ1=qGeQq_ z1mv^a)SxD7sF_c|tv9-U`6ig-VJ1P&_r_?~r+Ug3p0OIU)#gM=(QL3POxC6ixpY#w zk^e^au&{my1b!FEFIUc}^S+kWvRl}fLdnY-dC5)GTeRLs_(9*?#r@q5oaUldZ5d#% zlCVkW*l@1F1L?yG3Kouy>(uuW?TFNykRT@AZCK18ON(2y$wDxu2{raW2S`X1o!hcrC`x6#y3}oiU;1GNV%cs>09s8((Xdb2uU@fMgQ;rNJ(eg5MF+)=pQ+WYF(#P4vJgj@Y-DF=yH9lwT{{DnTeD4ENok$AwRJw7vl)>W lQ7w(_xBDKUv&P-n)Iv@49#a=_gwNMQ=Z{ literal 22762 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�Y;)V+u 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 D$X8zd diff --git a/doc/salome/gui/VISU/input/3d_presentations.doc b/doc/salome/gui/VISU/input/3d_presentations.doc index e5b70335..701400df 100755 --- a/doc/salome/gui/VISU/input/3d_presentations.doc +++ b/doc/salome/gui/VISU/input/3d_presentations.doc @@ -4,7 +4,7 @@ \image html introduction.png "Example of a 3D presentation" -\b Post Pro module provides several types of 3D presentations, +\b Post-Pro module provides several types of 3D presentations, visualizing the structure of MED objects. All presentations can be seen only in Salome VTK Viewer (ALT+K). \n All presentation types could be divided in two main groups: @@ -14,6 +14,6 @@ presentations can be seen only in Salome VTK Viewer (ALT+K). Created presentations can be edited, animaded, recorded and viewed in -different modes. The whole range of such operations is described in \subpage 3d_management_page "Managment of presentations" section. +different modes. The whole range of such operations is described in \subpage a3d_management_page "Managing 3D Presentations" section. -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/VISU/input/cut_lines.doc b/doc/salome/gui/VISU/input/cut_lines.doc index a119a75f..c5d156f5 100644 --- a/doc/salome/gui/VISU/input/cut_lines.doc +++ b/doc/salome/gui/VISU/input/cut_lines.doc @@ -77,10 +77,10 @@ the viewer: Tip: From Cut Lines presentation you can create a data table. This table will consist of the field scalar values located on each cut line of the constructed presentation (see also: -\ref creating_tables_from_cut_lines_page "Creating tables from Cut -Lines presentations"). After that your data table can be used for +\ref creating_tables_from_cut_lines "Creating tables from CutLines presentations"). +After that your data table can be used for construction of a 2d plot of curves based on the scalar values from the table (see also: \ref creating_curves_page "Creating curves" and \ref creating_plot2d_page "Creating Plot 2D presentation"). -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/VISU/input/evolution.doc b/doc/salome/gui/VISU/input/evolution.doc index baeef5af..345d8203 100644 --- a/doc/salome/gui/VISU/input/evolution.doc +++ b/doc/salome/gui/VISU/input/evolution.doc @@ -2,49 +2,46 @@ \page evolution_page Evolution on Point -This feature allows to trace temporal evolution of a variable at a given point. -It can be activated by context menu on field: +Evolution on Point operation allows tracing the temporal evolution of a variable at a given point. +It can be activated via the context menu on a field: \image html evolution_context_menu.png -Presence of the Evolution on Point action in the context menu depends on -the following conditions: +The availability of this operation in the context menu depends on the following conditions:

    -
  • Active view should be VTK view (to choose a point using a preview actor).
  • The selected field should be defined on the Node entity.
  • The selected field should have multiple time stamps.
-After activation of the action the following dialog is displayed together with -preview actor in the VTK view: +The following dialog will be displayed (if the VTK view is active, the preview actor is also displayed): \image html evolution_dialog.png -Three parameters are controlled by this dialog:
    -
  • Field - name of the field. This parameter is intended for informational -purpose only and could not be changed by the dialog.
  • -
  • Point - id of the point. It could be set by selection of point on the -preview actor displayed in the VTK view (note that there is no need to switch to -the point selection mode manually, because it is turned on automatically during -the life time of the dialog).
  • -
  • Component - name of the component (scalar mode). This control is +
  • Field - the name of the field given for information, it cannot be changed in the dialog.
  • +
  • Point - the point ID. It can be input manually or by +selection of the point in the viewer (note that the point selection +mode is turned on automatically by the Evolution on Point dialog).
  • +
  • Component - the name of the component (scalar mode). This control is enabled if there are multiple components in the field data.
-Clicking on OK button leads to creation of Plot2d view with a graph -of the Evolution: +Clicking OK button leads to the creation of Plot2d a view +with an Evolution graph: \image html evolution_result.png -X axis of the graph corresponds to values of the time stamps, Y axis - to values -of the selected component of the field at the specified point. +The X axis of the graph corresponds to the values of the time stamps, +the Y axis - to the value of the selected field component at the specified point. -\note Evolution is automatically published to the study after clicking on OK -button. It could be restored by clicking on the Show action in the context +\note Evolution is automatically published to the study after clicking OK +button. It can be restored by selecting the Show action in the context menu on the published object: \image html evolution_restore.png + +Our TUI Scripts provide you with \subpage tui_evolution_page script. + */ diff --git a/doc/salome/gui/VISU/input/importing_med_objects.doc b/doc/salome/gui/VISU/input/importing_med_objects.doc index e6a53c31..5aa758cf 100644 --- a/doc/salome/gui/VISU/input/importing_med_objects.doc +++ b/doc/salome/gui/VISU/input/importing_med_objects.doc @@ -2,8 +2,9 @@ \page importing_med_objects_page Import/Export MED objects -\n There exist two sources of \ref structure_of_med_objects_page "MED objects": MED and other Salome -components publishing them and MED files. +There are two sources of \ref med_object_page "MED objects": +- MED and other SALOME components publishing them MED objects +- MED files To load MED objects from other components: \par @@ -87,4 +88,4 @@ path and change the name of the exported MED file: To complete file export click Save. -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/VISU/input/iso_surfaces.doc b/doc/salome/gui/VISU/input/iso_surfaces.doc index a06f907e..2810f218 100644 --- a/doc/salome/gui/VISU/input/iso_surfaces.doc +++ b/doc/salome/gui/VISU/input/iso_surfaces.doc @@ -27,13 +27,15 @@ Surfaces, or click "Iso surfaces" icon in the
  • Iso Surface tab allows to set additional parameters of the Iso Surfaces presentation:
    • -
    • Number of surfaces, which will be generated in the framework of this presentation.
    • Minimum / Maximum value fields allow to enter the range of scalar or vector values applied to the cells, on the basis of which -this presentation will be created.
    • +this presentation will be created (note that these fields are editable +only if Use custom range button is checked, otherwise range of +the scalar bar values is used).
    • Update scalar bar range with these values button allows you to update the range of the values, displayed with by the scalar bar, with the previously defined range of values.
    • +
    • Number of surfaces, which will be generated in the framework of this presentation.
  • Scalar Bar tab allows to define the parameters of the scalar bar displayed with this presentation (\ref scalar_map_page "see also").
  • diff --git a/doc/salome/gui/VISU/input/med_object.doc b/doc/salome/gui/VISU/input/med_object.doc index a6791f42..268bb51e 100755 --- a/doc/salome/gui/VISU/input/med_object.doc +++ b/doc/salome/gui/VISU/input/med_object.doc @@ -5,20 +5,20 @@ \b MED \b Object is a specific twofold data structure with consists of \b Mesh \b Data and \b Physical \b Data. -\b Mesh \b Data includes geometrical information: list of nodes, edges, faces and cells +- \b Mesh \b Data includes geometrical information: list of nodes, edges, faces and cells of the mesh, and information on the interpolation in accordance with resulting -elements, i.e. the mesh should be compatible with the chosen interpolation; -\b Physical \b Data contains initial and boundary conditions: scalar +elements, i.e. the mesh should be compatible with the chosen interpolation. +- \b Physical \b Data contains initial and boundary conditions: scalar or vector values applied to the mesh cells. -\n It is not possible to create and edit \b MED \b Objects in the \b +It is not possible to create and edit \b MED \b Objects in the \b Post-Pro module. You can only \subpage importing_med_objects_page "import a MED object" from Salome MED module or from a MED file. -\n \b MED Objects can be visualized and explored with various types of +\b MED Objects can be visualized and explored with various types of \subpage a3d_presentations_page "3D presentations". -\n \b Post-Pro visualization engine bases on VTK and OpenGL +\b Post-Pro visualization engine bases on VTK and OpenGL technologies, which provide useful tools for \subpage a3d_management_page "Management of presentations". @@ -33,7 +33,7 @@ containing three main folders: \ref families_anchor "Families",

    Families

    A \b Family is a user-defined submesh composed of cells of a -definite type - Nodes, Edges, Faces or Cells. The +definite type - Nodes, Edges, Faces or Cells. The presentation created on the basis of a particular \b family will be composed of geometrical elements, corresponding to the type of cells of this \b family. diff --git a/doc/salome/gui/VISU/input/slider.doc b/doc/salome/gui/VISU/input/slider.doc index bf2f4cc3..811cb289 100755 --- a/doc/salome/gui/VISU/input/slider.doc +++ b/doc/salome/gui/VISU/input/slider.doc @@ -43,15 +43,13 @@ of the timestamps. \image html slider2.png \b Properties tab allows setting memory management properties. -
      -
    • \b Minimal radio button commands the application to use a minimum -amount of memory
    • -
    • \b Limited radio button allows to set the upper limit for the -amount of used memory.
    • -
    • \b Used and \b Free fields allow to set target values for used -and free memory.
    • -
    • \b Speed scroll allows to set the speed of the presentation.
    • -
        +- \b Minimal radio button commands the application to use a minimum + amount of memory +- \b Limited radio button allows to set the upper limit for the amount + of used memory +- \b Used and \b Free fields allow to set target values for used and + free memory. +- \b Speed scroll allows to set the speed of the presentation. -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/VISU/input/sweeping.doc b/doc/salome/gui/VISU/input/sweeping.doc index cd243d22..298c5a08 100644 --- a/doc/salome/gui/VISU/input/sweeping.doc +++ b/doc/salome/gui/VISU/input/sweeping.doc @@ -20,7 +20,7 @@ displaying the \em basic field presentation will end it. To sweep a field presentation: -\ref creating_field_presentations_page "Create a field presentation". +\ref field_presentations_page "Create a field presentation". In the Main menu select View -> Windows -> Sweep. The following dialog will appear. @@ -54,4 +54,4 @@ viewer and selecting \b Sweep in the context menu. Default parameters for \b Sweep can be set in the Main menu in File -> Preferences -> Post-Pro -> Sweep, Animation tab -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/VISU/input/table_presentations.doc b/doc/salome/gui/VISU/input/table_presentations.doc index 3a57a993..82dc0c96 100644 --- a/doc/salome/gui/VISU/input/table_presentations.doc +++ b/doc/salome/gui/VISU/input/table_presentations.doc @@ -4,7 +4,7 @@ DataTable object is a way to represent a two-dimensional data array (data arranged in rows and columns) in Salome. Each column groups values expressed in certain measurement \b units. -All \b columns and rows have titles. Tables can be \b +All \b columns and rows have titles. Tables can be \b rarefied, which means that some cells may be empty, without any values. @@ -13,6 +13,8 @@ special programming API (this problem lies out of the scope of Salome GUI Help), or \subpage importing_exporting_tables_page "imported" from properly defined ACSII files. +\anchor creating_tables_from_cut_lines + \note Alternatively, it is possible to create a table from the scalar values applied to the cells forming a \ref cut_lines_page "Cut Lines" or a \ref cut_segment_page "Cut Segment" presentation. Simply right-click on the @@ -36,4 +38,4 @@ Plot 2D viewer is described in the documentation on GUI module. -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/VISU/input/tui_evolution.doc b/doc/salome/gui/VISU/input/tui_evolution.doc new file mode 100644 index 00000000..ea149e33 --- /dev/null +++ b/doc/salome/gui/VISU/input/tui_evolution.doc @@ -0,0 +1,38 @@ +/*! + +\page tui_evolution_page Example of Evolution on Point + +\code +import os +import VISU +from visu_gui import * + +myViewManager = myVisu.GetViewManager(); + +myView = myViewManager.CreateXYPlot(); +myView.SetTitle("The viewer for Evolution") +print "myViewManager.CreateXYPlot()" + +medFile = "TimeStamps.med" +medFile = os.getenv('DATA_DIR') + '/MedFiles/' + medFile +myResult = myVisu.ImportFile(medFile) + +anEvolution = myVisu.CreateEvolution(myView); + +aSObj = myStudy.FindObjectIOR(myResult.GetID()) +aSObj = aSObj.FindSubObject(1)[1] # dom +aSObj = aSObj.FindSubObject(3)[1] # Fields +aSObj = aSObj.FindSubObject(2)[1] # vitesse +print "setField : ", anEvolution.setField(aSObj) + +anEvolution.setComponentId(1) # x component + +anEvolution.setPointId(500) + +print "Show Evolution" +anEvolution.showEvolution() + +myView.FitAll() +\endcode + +*/ diff --git a/doc/salome/gui/VISU/input/viewing_3d_presentations.doc b/doc/salome/gui/VISU/input/viewing_3d_presentations.doc index 40ad0203..e8bffd5d 100644 --- a/doc/salome/gui/VISU/input/viewing_3d_presentations.doc +++ b/doc/salome/gui/VISU/input/viewing_3d_presentations.doc @@ -2,10 +2,11 @@ \page viewing_3d_presentations_page Viewing 3D presentations -\n Each newly created presentation is displayed in the VTK 3D +Each newly created presentation is displayed in the VTK 3D Viewer. VTK 3D Viewer is described in details in the documentation on GUI module. -\n To display an existing presentation, right-click on it in the + +To display an existing presentation, right-click on it in the Object Browser and select \b Show. \image html viewing3.png @@ -19,146 +20,117 @@ options: visualization and NOT all properties can be set for a certain 3D presentation. -\anchor filter_by_scalars_anchor +- Hide all - allows to hide all objects from the +viewer. + +- Edit - allows to return to the menu, where the presentation +has been created and change its parameters. + +- \anchor filter_by_scalars_anchor Filter by Scalars - allows +showing only the cells with values that fit into the defined +Scalar Range. -
          -
        • Hide all - allows to hide all objects from the -viewer.
        • -
        • Edit - allows to return to the menu, where the presentation -has been created and change its parameters.
        • -
        • Filter by Scalars - allows showing only the cells with -values that fit into the defined Scalar Range. -
          If the presentation is created on nodes, only the cells with all +If the presentation is created on nodes, only the cells with all nodes lying in the range defined by the scalar filter will be visible. \image html viewing2.png -In this menu, check in Filter by scalar range box and input -the minimum and the maximum values for the Scalar Range
        • +In the dialog box, check in Filter by scalar range box and input +the minimum and the maximum values for the Scalar Range. \image html viewing4.png -\anchor rename_anchor - -
        • Rename - allows to rename the presentation.
        • -
        • Copy - allows to create a copy of the presentation in the -same subfolder (time stamp) in the Object Browser.
        • - -
        • Hide - allows to hide the selected presentation from the -viewer.
        • -
        • If selected in the Object Browser, Hide is replaced by -Show, which allows to display the selected presentation in the -viewer.
        • +- \anchor rename_anchor Rename - allows to rename the presentation. +- Copy - allows to create a copy of the presentation in the +same subfolder (time stamp) in the Object Browser. -
        • Values Labeling allows to display values applied to the +- Values Labeling allows to display values applied to the cells or nodes of a 3D presentation. \image html values_labeling.png -
        • \anchor labeling_parameters_anchor -
        • Labeling Parameters allows to change such labeling parameters as font and color. +- Labeling Parameters allows to change such labeling parameters as font and color. \image html labeling_parameters.png -
        • - -
        • Show Only - allows to display only the selected -presentation, hiding all other from the viewer.
        • -
        • Hide Scalar Bar/Show Scalar Bar - allows to show/hide the scalar bar -attached to the 3d presentation.
        • -
        • Representation - allows to switch among the available -representation types. - -\image html viewing10.png - -
        - -\image html viewing5.png "Points" - -\image html viewing6.png "Surface" - -\image html viewing7.png "Wireframe" - -\image html viewing8.png "Insideframe - displays the wires lying within the object" - -\image html viewing9.png "Surfaceframe - displays wires and cells lying on the object surface" - -\image html viewing11.png "Feature edges - shows the contour of the object" - -\image html viewing12.png "Shrink" - -Shading on - colors the object in a realistic -way, revealing its geometry, for example, by applying shadows to the inside regions; used together with \b Surface. - -Shading off - colors the object basing only on scalar values. - -\anchor width_opacity_anchor -
          -
        • 2D Quadratic - allows to choose how the quadratic elements -are visualized: as straight lines or as arcs of circle.
        • +- Hide - allows to hide the selected presentation from the +viewer. +- If selected in the Object Browser, Hide is replaced by +Show, which allows to display the selected presentation in the +viewer. +- Show Only - allows to display only the selected +presentation, hiding all other from the viewer. + +- Hide Scalar Bar/Show Scalar Bar - allows to show/hide the scalar bar +attached to the 3d presentation. + +- Representation - allows to switch among the available +representation types.\n\n\image html viewing10.png + - Points \image html viewing5.png + - Surface \image html viewing6.png + - Wireframe \image html viewing7.png + - Insideframe - displays the wires lying within the object \image html viewing8.png + - Surfaceframe - displays wires and cells lying on the object surface \image html viewing9.png + - Feature edges - shows the contour of the object \image html viewing11.png + - Shrink \image html viewing12.png + - Shading on - colors the object in a realistic way, + revealing its geometry, for example, by applying shadows to the + inside regions; used together with \b Surface. + - Shading off - colors the object basing only on scalar values. + +- 2D Quadratic - allows to choose how the quadratic elements +are visualized: as straight lines or as arcs of circle. \image html quadratic.png -
        • \b Properties
        • - -
            -
          • \b Opacity - allows to set the value of opacity of the -presentation between 0 (transparent) and 100 (opaque). -\note For a \ref gauss_points_presentations_page "Gauss Points" -presentation, displayed using Point Sprites or OpenGL Points -\ref primitive_types_page "primitives", this property only allows -switching between transparent and opaque modes. The textures are drawn -in the opaque mode if the opacity is equal to 100% and in -the transparent mode if the opacity is lower that 100% (note that -they become invisible when the opacity is equal to 0%). -
          • - -\image html viewing13.png - -
          • Line Width - allows to set the width of lines representing -edges of the presentation between 1 (thin) and 100 (thick).
          • - -\image html line_width.png - -
          • Shrink Factor - allows to set the shrink factor of the -presentation to be used in \b Shrink mode. Possible values range -between 20 and 100, the default value is 80.
          • - -\image html shrink_factor.png - -
          • Edge Color - allows to set the color of lines representing -the edges of the presentation displayed in SurfaceFrame mode
          • - -
          -
        • \ref translate_presentation_page "Translate Presentation" - allows -to translate the presentation along coordinate axes.
        • -
        • \ref clipping_page "Clipping Planes" - allows to create -cross-section views of presentations.
        • -
        • \ref sweeping_page "Sweep" - allows to display pseudo-animation of -the presentation.
        • - -
        • Dump view - exports an object from the viewer in bmp, png, -jpg or jpeg image format.
        • -
        • Change Background - allows to change the properties of the -background.
        • -
        • View Operations checkbox - shows or hides the VTK viewer +- \b Properties + - \b Opacity - allows to set the value of opacity of the + presentation between 0 (transparent) and 100 (opaque). + \note For a \ref gauss_points_presentations_page "Gauss Points" + presentation, displayed using Point Sprites or OpenGL + Points \ref primitive_types_page "primitives", this property + only allows switching between transparent and opaque modes. The + textures are drawn in the opaque mode if the opacity is equal to + 100% and in the transparent mode if the opacity is lower that 100% + (note that they become invisible when the opacity is equal to + 0%).\n\n \image html viewing13.png + - Line Width - allows to set the width of lines representing + edges of the presentation between 1 (thin) and 100 (thick).\n\n + \image html line_width.png + - Shrink Factor - allows to set the shrink factor of the + presentation to be used in \b Shrink mode. Possible values range + between 20 and 100, the default value is 80.\n\n \image html + shrink_factor.png + - Edge Color - allows to set the color of lines representing + the edges of the presentation displayed in SurfaceFrame mode. + +- \ref translate_presentation_page "Translate Presentation" - allows +to translate the presentation along coordinate axes. +- \ref clipping_page "Clipping Planes" - allows to create +cross-section views of presentations. +- \ref sweeping_page "Sweep" - allows to display pseudo-animation of +the presentation. + +- Dump view - exports an object from the viewer in bmp, png, +jpg or jpeg image format. +- Change Background - allows to change the properties of the +background. + +- View Operations checkbox - shows or hides the VTK viewer toolbar. The information about the VTK viewer functionalities is -available in the documentation on the GUI module.
        • -
        • Recording operations checkbox - shows or hides buttons used -for \ref recording_page "Recording"
        • +available in the documentation on the GUI module. +- Recording operations checkbox - shows or hides buttons used +for \ref recording_page "Recording". -
        • The following menu items are added when the presentation is -selected in the Object Browser
        • . -
            -
          • \b Delete - removes the presentation from the study.
          • -
          • \b Refresh - updates the presentation in the VTK viewer
          • -
          • \b Find - activates Find Tool described in the documentation -on GUI module.
          • +The following menu items are added when the presentation is +selected in the Object Browser. -
          -
        +- \b Delete - removes the presentation from the study. +- \b Refresh - updates the presentation in the VTK viewer. +- \b Find - activates Find Tool described in the documentation + on GUI module. When you create several presentations of the same object, you may wish to see them simultaneously, which might be impossible, because they @@ -175,17 +147,18 @@ In \b Auto mode you specify along which \b Axis and at which In \b Manual mode you set the coordinates for each presentation separately. -
        Displaying several presentations at the same time may cause superposition of their scalar bars. To avoid this, check Arrange Scalar Bars radio button in the Preferences -> Post-Pro -> Scalar Bar. A separate scalar bar will be displayed for each presentation. -\n Alternatively you may wish to merge the scalar bars to have a + +Alternatively you may wish to merge the scalar bars to have a common scalar bar for all presentations. To do this, select several presentations or fields in the object browser, right-click and from the pop-up menu select Merge Scalar Range. -\n To restore separate bars and scales for each module select Use + +To restore separate bars and scales for each module select Use Field Range from the same menu. */ diff --git a/src/CONVERTOR/VISU_MeshValue.cxx b/src/CONVERTOR/VISU_MeshValue.cxx index bf103815..95e0c646 100644 --- a/src/CONVERTOR/VISU_MeshValue.cxx +++ b/src/CONVERTOR/VISU_MeshValue.cxx @@ -342,13 +342,13 @@ namespace VISU } } - TVTKBasicType aModule = (TVTKBasicType)sqrt(aModules[0]); + TVTKBasicType aModule = (TVTKBasicType)sqrt((double)aModules[0]); aDataValues[0] = aModule; // init Min aDataValues[1] = aModule; // init Max aDataValues[2] = aModule; // init Average for (vtkIdType ig = 0; ig < aNbGauss; ig++) { - aModule = (TVTKBasicType)sqrt(aModules[ig]); + aModule = (TVTKBasicType)sqrt((double)aModules[ig]); aDataValues[0] = std::min(TVTKBasicType(aModule), aDataValues[0]); // Min aDataValues[1] = std::max(TVTKBasicType(aModule), aDataValues[1]); // Max diff --git a/src/ENGINE/Makefile.am b/src/ENGINE/Makefile.am index 0acbfc13..30618c13 100644 --- a/src/ENGINE/Makefile.am +++ b/src/ENGINE/Makefile.am @@ -35,5 +35,5 @@ dist_libVISUEngine_la_SOURCES= VISU_Engine_i.cc libVISUEngine_la_CPPFLAGS= $(KERNEL_CXXFLAGS) $(MED_CXXFLAGS) $(CORBA_CXXFLAGS) $(CORBA_INCLUDES) \ -I$(top_builddir)/idl -libVISUEngine_la_LDFLAGS= $(KERNEL_LDFLAGS) -lSalomeIDLKernel -lSalomeNS -lSalomeContainer $(CORBA_LIBS) \ +libVISUEngine_la_LDFLAGS= $(KERNEL_LDFLAGS) -lSalomeIDLKernel -lSALOMELocalTrace -lSalomeNS -lSalomeContainer $(CORBA_LIBS) \ $(top_builddir)/idl/libSalomeIDLVISU.la diff --git a/src/GUITOOLS/Makefile.am b/src/GUITOOLS/Makefile.am index 3d844b0c..3182f1a8 100644 --- a/src/GUITOOLS/Makefile.am +++ b/src/GUITOOLS/Makefile.am @@ -46,5 +46,4 @@ libVISUGUITOOLS_la_CPPFLAGS= -ftemplate-depth-32 \ libVISUGUITOOLS_la_LDFLAGS= \ $(KERNEL_LDFLAGS) -lSALOMELocalTrace \ - $(GUI_LDFLAGS) -lCAM -lsuit -lqtx \ - $(QT_LIBS) $(QWT_LIBS) + $(GUI_LDFLAGS) -lCAM -lsuit -lqtx diff --git a/src/OBJECT/VISU_Actor.cxx b/src/OBJECT/VISU_Actor.cxx index 959fce3d..20a5a842 100644 --- a/src/OBJECT/VISU_Actor.cxx +++ b/src/OBJECT/VISU_Actor.cxx @@ -771,12 +771,11 @@ VISU_Actor { if( mySelectionMode == ActorSelection ) ResetTextActor(); - else - aShowTextActor = false; myLastSelectionMode = mySelectionMode; } - myTextActor->SetVisibility( GetVisibility() && theIsHighlight && aShowTextActor ); + myTextActor->SetVisibility( GetVisibility() && theIsHighlight && aShowTextActor && + ( mySelectionMode == ActorSelection || isSubElementsHighlighted() ) ); bool anInitialHasIndex = isHighlighted(); bool aCurrentHasIndex = theIsHighlight; diff --git a/src/OBJECT/VISU_GaussPtsAct.cxx b/src/OBJECT/VISU_GaussPtsAct.cxx index fbf86d5e..3d02199a 100644 --- a/src/OBJECT/VISU_GaussPtsAct.cxx +++ b/src/OBJECT/VISU_GaussPtsAct.cxx @@ -1431,6 +1431,12 @@ vtkImplicitFunctionCollection* VISU_GaussPtsAct::GetClippingPlanes() return myFunction->GetFunction(); } +//---------------------------------------------------------------------------- +vtkDataSet* VISU_GaussPtsAct::GetValLabelsInput() +{ + return GetInput(); +} + //============================================================================== diff --git a/src/OBJECT/VISU_GaussPtsAct.h b/src/OBJECT/VISU_GaussPtsAct.h index 48155c84..9db3f4f1 100644 --- a/src/OBJECT/VISU_GaussPtsAct.h +++ b/src/OBJECT/VISU_GaussPtsAct.h @@ -272,6 +272,11 @@ class VISU_OBJECT_EXPORT VISU_GaussPtsAct : public VISU_Actor virtual vtkImplicitFunctionCollection* GetClippingPlanes(); + //---------------------------------------------------------------------------- + virtual + vtkDataSet* + GetValLabelsInput(); + protected: //---------------------------------------------------------------------------- VISU_GaussPtsAct(); diff --git a/src/OBJECT/VISU_MeshAct.cxx b/src/OBJECT/VISU_MeshAct.cxx index ee575ff0..40f6c9c1 100644 --- a/src/OBJECT/VISU_MeshAct.cxx +++ b/src/OBJECT/VISU_MeshAct.cxx @@ -77,7 +77,6 @@ VISU_MeshAct int anElem0DSize = aResourceMgr->integerValue( "VISU", "elem0d_size", 5); GetSurfaceProperty()->SetPointSize(anElem0DSize); - GetEdgeProperty()->SetPointSize(anElem0DSize); } } diff --git a/src/OBJECT/VISU_ScalarMapAct.cxx b/src/OBJECT/VISU_ScalarMapAct.cxx index ce5a4e76..f487f609 100644 --- a/src/OBJECT/VISU_ScalarMapAct.cxx +++ b/src/OBJECT/VISU_ScalarMapAct.cxx @@ -257,7 +257,6 @@ VISU_ScalarMapAct int anElem0DSize = aResourceMgr->integerValue( "VISU", "elem0d_size", 5); mySurfaceActor->GetProperty()->SetPointSize(anElem0DSize); - myEdgeActor->GetProperty()->SetPointSize(anElem0DSize); } } diff --git a/src/PIPELINE/VISU_Extractor.cxx b/src/PIPELINE/VISU_Extractor.cxx index 361f5849..aafb7d55 100644 --- a/src/PIPELINE/VISU_Extractor.cxx +++ b/src/PIPELINE/VISU_Extractor.cxx @@ -41,6 +41,7 @@ #include #include +#define USE_SPRINTF 1 //---------------------------------------------------------------------------- vtkStandardNewMacro(VISU_Extractor); @@ -103,21 +104,61 @@ VISU_Extractor vtkFloatingPointType CutValue (vtkFloatingPointType theValue, int theDecimals) { vtkFloatingPointType v = theValue; + +#ifdef USE_SPRINTF + char aFormat[16]; + sprintf(aFormat, "%%.%dg", theDecimals); + char aStr [256]; + sprintf(aStr, aFormat, theValue); + v = atof(aStr); +#else + +#ifndef USE_OLD_ALGORITHM + // + // VSR 19/10/2009: new algorithm does not use long long type + // + long n1 = 0; + // calculate order of the integral part + while ( v > 1. ) { + v = v / 10.; + n1++; + } + // calculate length of the fractional part + long n2 = theDecimals - n1; + v = theValue; + if ( n2 > 0 ) + while ( n2-- > 0 ) v = v * 10.; + else + while ( n2++ < 0 ) v = v / 10.; + v = floor( (double) v ); + n2 = theDecimals - n1; + if ( n2 > 0 ) + while ( n2-- > 0 ) v = v / 10.; + else + while ( n2++ < 0 ) v = v * 10.; +#else + // + // VSR 19/10/2009: old algorithm uses long long type - + // causes incompatibility with some platforms (Windows?) + // vtkFloatingPointType aDegree = 0.0; if (abs((long long)v) > 1) - aDegree = (long long)log10(abs((long long)v)) + 1; + aDegree = (long long)log10((double)abs((long long)v)) + 1; aDegree = theDecimals - aDegree; //printf("$$$ 1 v = %.20g , aDegree = %lld \n", v, (long long)aDegree); aDegree = pow(10, aDegree); v = ((vtkFloatingPointType)((long long)(v * aDegree))) / aDegree; //printf("$$$ 2 v = %.20g , aDegree = %lld \n", v, (long long)aDegree); +#endif + +#endif return v; } //---------------------------------------------------------------------------- -template +template void Module2Scalars(vtkDataArray *theInputDataArray, TValueType* theOutputPtr, @@ -128,8 +169,8 @@ Module2Scalars(vtkDataArray *theInputDataArray, for(vtkIdType aTupleId = 0; aTupleId < theNbOfTuples; aTupleId++){ theInputDataArray->GetTuple(aTupleId, &anArray[0]); vtkFloatingPointType aVector[3] = {anArray[0], anArray[1], anArray[2]}; - vtkFloatingPointType aScalar = sqrt(aVector[0]*aVector[0] + - aVector[1]*aVector[1] + + vtkFloatingPointType aScalar = sqrt(aVector[0]*aVector[0] + + aVector[1]*aVector[1] + aVector[2]*aVector[2]); *theOutputPtr = TValueType(aScalar); theOutputPtr++; diff --git a/src/PIPELINE/VISU_IsoSurfacesPL.cxx b/src/PIPELINE/VISU_IsoSurfacesPL.cxx index 25abb517..47554dc0 100644 --- a/src/PIPELINE/VISU_IsoSurfacesPL.cxx +++ b/src/PIPELINE/VISU_IsoSurfacesPL.cxx @@ -32,6 +32,7 @@ #include +#define GAP_COEFFICIENT 0.0001 //---------------------------------------------------------------------------- @@ -91,6 +92,7 @@ VISU_IsoSurfacesPL SetNbParts(aPipeLine->GetNbParts()); vtkFloatingPointType aRange[2] = {aPipeLine->GetMin(), aPipeLine->GetMax()}; SetRange(aRange); + SetRangeFixed(aPipeLine->IsRangeFixed()); } } @@ -134,15 +136,20 @@ VISU_IsoSurfacesPL //---------------------------------------------------------------------------- void VISU_IsoSurfacesPL -::SetRange(vtkFloatingPointType theRange[2]) +::SetRange(vtkFloatingPointType theRange[2], bool theIsForced) { - if(VISU::CheckIsSameRange(myRange, theRange)) + if(VISU::CheckIsSameRange(myRange, theRange) && !theIsForced) return; if(theRange[0] <= theRange[1]){ myRange[0] = theRange[0]; myRange[1] = theRange[1]; vtkFloatingPointType aRange[2] = {theRange[0], theRange[1]}; + if( IsRangeFixed() ) { + double aDelta = fabs( aRange[1] - aRange[0] ) * GAP_COEFFICIENT; + aRange[0] += aDelta; + aRange[1] -= aDelta; + } if(GetScaling() == VTK_SCALE_LOG10) VISU_LookupTable::ComputeLogRange(theRange, aRange); myContourFilter->GenerateValues(GetNbParts(), aRange); @@ -168,6 +175,25 @@ VISU_IsoSurfacesPL } +//---------------------------------------------------------------------------- +void +VISU_IsoSurfacesPL +::SetRangeFixed(bool theIsFixed) +{ + myIsRangeFixed = theIsFixed; + SetRange( myRange, true ); +} + + +//---------------------------------------------------------------------------- +bool +VISU_IsoSurfacesPL +::IsRangeFixed() +{ + return myIsRangeFixed; +} + + void //---------------------------------------------------------------------------- VISU_IsoSurfacesPL @@ -180,6 +206,8 @@ VISU_IsoSurfacesPL vtkFloatingPointType aScalarRange[2]; GetSourceRange(aScalarRange); SetRange(aScalarRange); + + SetRangeFixed(true); } //---------------------------------------------------------------------------- @@ -233,6 +261,11 @@ VISU_IsoSurfacesPL vtkFloatingPointType aRange[2] = {GetMax() - theMapScale*(GetMax()-GetMin()), GetMax()}; vtkFloatingPointType aNewRange[2] = {aRange[0], aRange[1]}; + if( IsRangeFixed() ) { + double aDelta = fabs( aNewRange[1] - aNewRange[0] ) * GAP_COEFFICIENT; + aNewRange[0] += aDelta; + aNewRange[1] -= aDelta; + } if(GetScaling() == VTK_SCALE_LOG10) VISU_LookupTable::ComputeLogRange(aRange,aNewRange); myContourFilter->GenerateValues(GetNbParts(), aNewRange); diff --git a/src/PIPELINE/VISU_IsoSurfacesPL.hxx b/src/PIPELINE/VISU_IsoSurfacesPL.hxx index 9c8b8a80..1fb16590 100644 --- a/src/PIPELINE/VISU_IsoSurfacesPL.hxx +++ b/src/PIPELINE/VISU_IsoSurfacesPL.hxx @@ -65,7 +65,7 @@ public: virtual void - SetRange(vtkFloatingPointType theRange[2]); + SetRange(vtkFloatingPointType theRange[2], bool theIsForced = false); virtual vtkFloatingPointType @@ -74,6 +74,14 @@ public: virtual vtkFloatingPointType GetMax(); + + virtual + void + SetRangeFixed(bool theIsFixed); + + virtual + bool + IsRangeFixed(); public: virtual @@ -110,6 +118,7 @@ protected: int myNbParts; vtkFloatingPointType myRange[2]; + bool myIsRangeFixed; vtkCellDataToPointData* myCellDataToPointData; vtkContourFilter *myContourFilter; diff --git a/src/PIPELINE/VISU_LookupTable.cxx b/src/PIPELINE/VISU_LookupTable.cxx index 938b8293..a2a4e7f7 100644 --- a/src/PIPELINE/VISU_LookupTable.cxx +++ b/src/PIPELINE/VISU_LookupTable.cxx @@ -42,7 +42,8 @@ VISU_LookupTable ::VISU_LookupTable(int sze, int ext): vtkLookupTable(sze, ext), myScale(1.0), - myBicolor(false) + myBicolor(false), + myHasMarkedValues(false) {} //---------------------------------------------------------------------------- @@ -68,6 +69,7 @@ VISU_LookupTable vtkIdType anIndex = this->GetIndex( theValue ); unsigned char *aTablePtr = this->GetPointer( anIndex ); CopyColor( aTablePtr, theColor ); + myHasMarkedValues = true; } @@ -173,6 +175,14 @@ VISU_LookupTable } } +void +VISU_LookupTable +::ForceBuild() +{ + Superclass::ForceBuild(); + myHasMarkedValues = false; +} + // Apply log to value, with appropriate constraints. inline vtkFloatingPointType diff --git a/src/PIPELINE/VISU_LookupTable.hxx b/src/PIPELINE/VISU_LookupTable.hxx index 1acbecb6..16a8a477 100644 --- a/src/PIPELINE/VISU_LookupTable.hxx +++ b/src/PIPELINE/VISU_LookupTable.hxx @@ -38,6 +38,8 @@ class VISU_PIPELINE_EXPORT VISU_LookupTable: public vtkLookupTable vtkTypeMacro(VISU_LookupTable,vtkLookupTable); static VISU_LookupTable *New(); + virtual void ForceBuild(); + virtual void MapScalarsThroughTable2(void *input, unsigned char *output, int inputDataType, int numberOfValues, int inputIncrement, int outputIncrement); @@ -56,6 +58,8 @@ class VISU_PIPELINE_EXPORT VISU_LookupTable: public vtkLookupTable void MarkValueByColor( vtkFloatingPointType theValue, unsigned char* theColor ); + bool HasMarkedValues() const { return myHasMarkedValues; } + void FillByColor( unsigned char* theColor ); void MakeBiColor(); @@ -67,5 +71,6 @@ class VISU_PIPELINE_EXPORT VISU_LookupTable: public vtkLookupTable vtkFloatingPointType myScale; bool myBicolor; + bool myHasMarkedValues; }; #endif // VISU_LookupTable_H diff --git a/src/PIPELINE/VISU_OpenGLPointSpriteMapper.cxx b/src/PIPELINE/VISU_OpenGLPointSpriteMapper.cxx index e667bc24..82d59e35 100755 --- a/src/PIPELINE/VISU_OpenGLPointSpriteMapper.cxx +++ b/src/PIPELINE/VISU_OpenGLPointSpriteMapper.cxx @@ -26,7 +26,7 @@ // #include "VISU_OpenGLPointSpriteMapper.hxx" -#include "SVTK_Extension.h" +//#include "SVTK_Extension.h" #include #include diff --git a/src/VISUGUI/Makefile.am b/src/VISUGUI/Makefile.am index 286f2961..aff94dc9 100644 --- a/src/VISUGUI/Makefile.am +++ b/src/VISUGUI/Makefile.am @@ -39,7 +39,6 @@ salomeinclude_HEADERS= \ VisuGUI.h \ VisuGUI_Module.h \ VisuGUI_Selection.h \ - VisuGUI_Tools.h \ VisuGUI_ViewTools.h \ VisuGUI_NameDlg.h \ VisuGUI_FileDlg.h \ @@ -70,7 +69,6 @@ salomeinclude_HEADERS= \ VisuGUI_Timer.h \ VisuGUI_Slider.h \ VisuGUI_InputPane.h \ - VisuGUI_CacheDlg.h \ VisuGUI_FieldFilter.h \ VisuGUI_ValuesLabelingDlg.h @@ -120,7 +118,6 @@ dist_libVISU_la_SOURCES= \ VisuGUI_Slider.cxx \ VisuGUI_Sweep.cxx \ VisuGUI_InputPane.cxx \ - VisuGUI_CacheDlg.cxx \ VisuGUI_FileInfoDlg.cxx \ VisuGUI_FieldFilter.cxx \ VisuGUI_ClippingPanel.cxx \ @@ -168,14 +165,12 @@ MOC_FILES= \ VisuGUI_Slider_moc.cxx \ VisuGUI_Sweep_moc.cxx \ VisuGUI_InputPane_moc.cxx \ - VisuGUI_CacheDlg_moc.cxx \ VisuGUI_FileInfoDlg_moc.cxx \ VisuGUI_ClippingPanel_moc.cxx \ VisuGUI_ClippingPlaneDlg_moc.cxx \ VisuGUI_FilterScalarsDlg_moc.cxx \ VisuGUI_ValuesLabelingDlg_moc.cxx - nodist_libVISU_la_SOURCES=$(MOC_FILES) # additionnal information to compil and link file diff --git a/src/VISUGUI/VISU_msg_en.ts b/src/VISUGUI/VISU_msg_en.ts index 7a04f283..d7ec1595 100644 --- a/src/VISUGUI/VISU_msg_en.ts +++ b/src/VISUGUI/VISU_msg_en.ts @@ -2407,6 +2407,18 @@ Please, provide non-empty resulting presentation. SHOW_VALUES_CHK Show values (nb per surface) + + RANGE + Range + + + USE_SCALAR_BAR_RANGE + Use scalar bar range + + + USE_CUSTOM_RANGE + Use custom range + VisuGUI_IsoSurfacesDlg diff --git a/src/VISUGUI/VisuGUI.cxx b/src/VISUGUI/VisuGUI.cxx index c54562c9..ebe7f5f2 100644 --- a/src/VISUGUI/VisuGUI.cxx +++ b/src/VISUGUI/VisuGUI.cxx @@ -118,7 +118,7 @@ #include "VisuGUI_BuildProgressDlg.h" #include "VisuGUI_TransparencyDlg.h" #include "VisuGUI_ShrinkFactorDlg.h" -#include "VisuGUI_CacheDlg.h" +//#include "VisuGUI_CacheDlg.h" #include "VisuGUI_Table3dDlg.h" #include "VisuGUI_ClippingPanel.h" #include "VisuGUI_FilterScalarsDlg.h" @@ -199,6 +199,20 @@ VisuGUI VisuGUI ::~VisuGUI() { + if( myDisplayer ) { + delete myDisplayer; + myDisplayer = 0; + } + + if( mySlider ) { + delete mySlider; + mySlider = 0; + } + + if( mySweep ) { + delete mySweep; + mySweep = 0; + } } void @@ -2118,12 +2132,8 @@ void VisuGUI ::OnPointEvolution() { - SVTK_ViewWindow* aViewWindow = VISU::GetActiveViewWindow( this ); - if( !aViewWindow ) - return; - _PTR(Study) aCStudy = GetCStudy( GetAppStudy( this ) ); - VisuGUI_EvolutionDlg* aDlg = new VisuGUI_EvolutionDlg( this, aViewWindow, aCStudy ); + VisuGUI_EvolutionDlg* aDlg = new VisuGUI_EvolutionDlg( this, aCStudy ); LightApp_SelectionMgr* aSelectionMgr = GetSelectionMgr( this ); SALOME_ListIO aListIO; @@ -2150,10 +2160,6 @@ void VisuGUI ::OnShowEvolution() { - SVTK_ViewWindow* aViewWindow = VISU::GetActiveViewWindow( this ); - if( !aViewWindow ) - return; - LightApp_SelectionMgr* aSelectionMgr = GetSelectionMgr( this ); SALOME_ListIO aListIO; aSelectionMgr->selectedObjects( aListIO ); @@ -2172,7 +2178,7 @@ VisuGUI if( aType != VISU::TEVOLUTION ) return; - VisuGUI_EvolutionDlg* aDlg = new VisuGUI_EvolutionDlg( this, aViewWindow, aCStudy ); + VisuGUI_EvolutionDlg* aDlg = new VisuGUI_EvolutionDlg( this, aCStudy ); aDlg->restoreFromStudy( aSObj ); aDlg->show(); } @@ -3303,7 +3309,6 @@ VisuGUI aRule += " and $type in {'VISU::TFIELD'}"; aRule += " and medEntity='NODE_ENTITY'"; aRule += " and nbTimeStamps>1"; - aRule += " and activeView in {'VTKViewer' 'SVTK'}"; mgr->setRule( action( VISU_POINT_EVOLUTION ), aRule ); aRule = "client='ObjectBrowser' and $type in {'VISU::TENTITY' 'VISU::TFAMILY' 'VISU::TGROUP'}"; @@ -3479,7 +3484,7 @@ void VisuGUI::contextMenuPopup( const QString& theClient, QMenu* theMenu, QStrin VISU::VISUType aType = VISU::Storable::RestoringMap2Type( aMap ); if (aType == VISU::TANIMATION) { theMenu->addAction( action( VISU_SHOW_ANIMATION ) ); - } else if (aType == VISU::TEVOLUTION && GetActiveViewWindow(this)) { + } else if (aType == VISU::TEVOLUTION) { theMenu->addAction( action( VISU_SHOW_EVOLUTION ) ); } else if (isOBClient) { if (IsSObjectTable(aSObject)) { diff --git a/src/VISUGUI/VisuGUI_CutSegmentDlg.cxx b/src/VISUGUI/VisuGUI_CutSegmentDlg.cxx index 764f8104..34ec4ca3 100644 --- a/src/VISUGUI/VisuGUI_CutSegmentDlg.cxx +++ b/src/VISUGUI/VisuGUI_CutSegmentDlg.cxx @@ -433,7 +433,7 @@ void VisuGUI_CutSegmentDlg::updatePoints( bool update ) aPoints->InsertNextPoint( aPoint2 ); vtkCellArray* aVerts = vtkCellArray::New(); - for( int i = 0, n = aPoints->GetNumberOfPoints(); i < n; i++ ) + for( vtkIdType i = 0, n = aPoints->GetNumberOfPoints(); i < n; i++ ) aVerts->InsertNextCell( 1, &i ); vtkPolyData* aProfile = vtkPolyData::New(); diff --git a/src/VISUGUI/VisuGUI_EvolutionDlg.cxx b/src/VISUGUI/VisuGUI_EvolutionDlg.cxx index 07cbefac..b5298f14 100644 --- a/src/VISUGUI/VisuGUI_EvolutionDlg.cxx +++ b/src/VISUGUI/VisuGUI_EvolutionDlg.cxx @@ -49,6 +49,7 @@ #include #include +#include #include #include #include @@ -56,12 +57,10 @@ #include -VisuGUI_EvolutionDlg::VisuGUI_EvolutionDlg( VisuGUI* theModule, - SVTK_ViewWindow* theViewWindow, - _PTR(Study) theStudy ) : +VisuGUI_EvolutionDlg::VisuGUI_EvolutionDlg( VisuGUI* theModule, _PTR(Study) theStudy ) : QtxDialog( VISU::GetDesktop( theModule ), false, false, QtxDialog::Standard, Qt::Dialog ), myModule( theModule ), - myViewWindow( theViewWindow ), + myViewWindow( NULL ), myPreviewActor( NULL ) { setWindowTitle( tr( "TITLE" ) ); @@ -80,7 +79,9 @@ VisuGUI_EvolutionDlg::VisuGUI_EvolutionDlg( VisuGUI* theModule, QLabel* aPointLabel = new QLabel( tr( "POINT" ) ); myPointLE = new QLineEdit( aParamGrp ); - myPointLE->setReadOnly( true ); + + myPointValidator = new QIntValidator( this ); + myPointLE->setValidator( myPointValidator ); QLabel* aComponentLabel = new QLabel( tr( "COMPONENT" ) ); myComponentCB = new QComboBox( aParamGrp ); @@ -102,12 +103,22 @@ VisuGUI_EvolutionDlg::VisuGUI_EvolutionDlg( VisuGUI* theModule, aMainLayout->setSpacing( 0 ); aMainLayout->addWidget( aParamGrp ); - connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) ); + connect( myPointLE, SIGNAL( textEdited( const QString& ) ), + this, SLOT( onPointEdited( const QString& ) ) ); connect( myModule->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( onSelectionEvent() ) ); + connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) ); + myStoredSelectionMode = ActorSelection; + + myViewWindow = VISU::GetActiveViewWindow( myModule ); + if( myViewWindow ) + { + connect( myViewWindow, SIGNAL( destroyed() ), this, SLOT( onViewWindowClosed() ) ); + connect( myViewWindow, SIGNAL( closing( SUIT_ViewWindow* ) ), this, SLOT( onViewWindowClosed() ) ); + } } //------------------------------------------------------------------------ @@ -137,6 +148,9 @@ void VisuGUI_EvolutionDlg::updateFromEngine() std::string aFieldName = myEngine->getFieldName(); myFieldLE->setText( QString( aFieldName.c_str() ) ); + int aNbPoints = myEngine->getNbPoints(); + myPointValidator->setRange( 0, aNbPoints-1 ); + QStringList aComponentList; VISU::ComponentDataList aComponentDataList = myEngine->getComponentDataList(); int aNbComp = aComponentDataList.size(); @@ -311,6 +325,32 @@ void VisuGUI_EvolutionDlg::restoreFromStudy( _PTR(SObject) theEvolution ) myComponentCB->setCurrentIndex( myEngine->getComponentId() ); } +//------------------------------------------------------------------------ +void VisuGUI_EvolutionDlg::onPointEdited( const QString& theText ) +{ + if( !myViewWindow ) + return; + + if( !myPreviewActor || !myPreviewActor->hasIO() ) + return; + + bool ok = false; + int aPointId = theText.toInt( &ok ); + if( !ok ) + return; + + Handle(SALOME_InteractiveObject) anIO = myPreviewActor->getIO(); + + SVTK_Selector* aSelector = myViewWindow->GetSelector(); + aSelector->ClearIObjects(); + aSelector->AddOrRemoveIndex( anIO, aPointId, false ); + aSelector->AddIObject( anIO ); + + myPreviewActor->Highlight( true ); + + myViewWindow->Repaint(); +} + //------------------------------------------------------------------------ void VisuGUI_EvolutionDlg::onSelectionEvent() { @@ -345,6 +385,20 @@ void VisuGUI_EvolutionDlg::onSelectionEvent() } } +//------------------------------------------------------------------------ +void VisuGUI_EvolutionDlg::onViewWindowClosed() +{ + if( myViewWindow ) + { + if( myPreviewActor ) + { + myPreviewActor->Delete(); + myPreviewActor = 0; + } + myViewWindow = 0; + } +} + //------------------------------------------------------------------------ void VisuGUI_EvolutionDlg::onHelp() { diff --git a/src/VISUGUI/VisuGUI_EvolutionDlg.h b/src/VISUGUI/VisuGUI_EvolutionDlg.h index 0cc5663d..bf86a0bb 100644 --- a/src/VISUGUI/VisuGUI_EvolutionDlg.h +++ b/src/VISUGUI/VisuGUI_EvolutionDlg.h @@ -33,6 +33,7 @@ #include class QComboBox; +class QIntValidator; class QKeyEvent; class QLineEdit; @@ -47,9 +48,7 @@ class VisuGUI_EvolutionDlg: public QtxDialog Q_OBJECT public: - VisuGUI_EvolutionDlg( VisuGUI* theModule, - SVTK_ViewWindow* theViewWindow, - _PTR(Study) theStudy ); + VisuGUI_EvolutionDlg( VisuGUI* theModule, _PTR(Study) theStudy ); ~VisuGUI_EvolutionDlg(); public: @@ -68,7 +67,9 @@ private: void updateFromEngine(); private slots: + void onPointEdited( const QString& ); void onSelectionEvent(); + void onViewWindowClosed(); void onHelp(); private: @@ -79,6 +80,8 @@ private: QLineEdit* myPointLE; QComboBox* myComponentCB; + QIntValidator* myPointValidator; + SVTK_ViewWindow* myViewWindow; SALOME_Actor* myPreviewActor; Selection_Mode myStoredSelectionMode; diff --git a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx index 76e48c21..fcf2963c 100644 --- a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx +++ b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx @@ -54,6 +54,8 @@ #include #include #include +#include +#include using namespace std; @@ -74,59 +76,79 @@ VisuGUI_IsoSurfPane::VisuGUI_IsoSurfPane (QWidget* parent, TopGroupLayout->setSpacing( 6 ); TopGroupLayout->setMargin( 11 ); + QGroupBox* aRangeBox = new QGroupBox( tr( "RANGE" ), this ); + QRadioButton* aUseScalarBarRange = new QRadioButton( tr( "USE_SCALAR_BAR_RANGE" ), aRangeBox ); + QRadioButton* aUseCustomRange = new QRadioButton( tr( "USE_CUSTOM_RANGE" ), aRangeBox ); + + myRangeGrp = new QButtonGroup( aRangeBox ); + myRangeGrp->addButton( aUseScalarBarRange, ScalarBarRange ); + myRangeGrp->addButton( aUseCustomRange, CustomRange ); + aUseScalarBarRange->setChecked( true ); + + connect( myRangeGrp, SIGNAL( buttonClicked( int ) ), this, SLOT( onRangeButtonClicked( int ) ) ); + + QLabel* LabelMin = new QLabel( tr( "MIN_VALUE" ), aRangeBox ); + MinIso = new QLineEdit( aRangeBox ); + MinIso->setValidator( new QDoubleValidator( aRangeBox ) ); + MinIso->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + MinIso->setMinimumSize( 70, 0 ); + LabelMin->setBuddy( MinIso ); + + QLabel* LabelMax = new QLabel( tr( "MAX_VALUE" ), aRangeBox ); + MaxIso = new QLineEdit( aRangeBox ); + MaxIso->setValidator( new QDoubleValidator( aRangeBox ) ); + MaxIso->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + MaxIso->setMinimumSize( 70, 0 ); + LabelMax->setBuddy( MaxIso ); + + QPushButton* aUpdateBtn = new QPushButton( "Update scalar bar range with these values", aRangeBox ); + aUpdateBtn->setEnabled( false ); + connect( aUpdateBtn, SIGNAL( clicked() ), this, SLOT(onCBUpdate() ) ); + connect( aUseCustomRange, SIGNAL( toggled( bool ) ), aUpdateBtn, SLOT( setEnabled( bool ) ) ); + + QGridLayout* aRangeLayout = new QGridLayout( aRangeBox ); + aRangeLayout->setSpacing( 6 ); + aRangeLayout->setMargin( 11 ); + aRangeLayout->addWidget( aUseScalarBarRange, 0, 0 ); + aRangeLayout->addWidget( aUseCustomRange, 0, 1 ); + aRangeLayout->addWidget( LabelMin, 1, 0 ); + aRangeLayout->addWidget( MinIso, 1, 1 ); + aRangeLayout->addWidget( LabelMax, 2, 0 ); + aRangeLayout->addWidget( MaxIso, 2, 1 ); + aRangeLayout->addWidget( aUpdateBtn, 3, 0, 1, 2 ); + + TopGroupLayout->addWidget( aRangeBox, 0, 0, 1, 2 ); + QLabel* LabelNbr = new QLabel (tr("NB_SURFACES"), TopGroup); - TopGroupLayout->addWidget( LabelNbr, 0, 0 ); + TopGroupLayout->addWidget( LabelNbr, 1, 0 ); NbrIso = new QSpinBox( TopGroup ); NbrIso->setMaximum( 100 ); NbrIso->setMinimum( 1 ); NbrIso->setSingleStep( 1 ); NbrIso->setValue( 1 ); - TopGroupLayout->addWidget( NbrIso, 0, 1 ); - - QLabel* LabelMin = new QLabel (tr("MIN_VALUE"), TopGroup ); - TopGroupLayout->addWidget(LabelMin, 1, 0); - //MinIso = new QtxDoubleSpinBox( -DBL_MAX, DBL_MAX, 0.1, TopGroup ); - MinIso = new QLineEdit( TopGroup ); - MinIso->setValidator( new QDoubleValidator(TopGroup) ); - MinIso->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - MinIso->setMinimumSize( 70, 0 ); - LabelMin->setBuddy(MinIso); - TopGroupLayout->addWidget( MinIso, 1, 1 ); - - QLabel* LabelMax = new QLabel (tr("MAX_VALUE"), TopGroup ); - TopGroupLayout->addWidget( LabelMax, 2, 0 ); - //MaxIso = new QtxSpinBoxDbl( -DBL_MAX, DBL_MAX, 0.1, TopGroup ); - MaxIso = new QLineEdit( TopGroup ); - MaxIso->setValidator( new QDoubleValidator(TopGroup) ); - MaxIso->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - MaxIso->setMinimumSize( 70, 0 ); - LabelMax->setBuddy(MaxIso); - TopGroupLayout->addWidget( MaxIso, 2, 1 ); + TopGroupLayout->addWidget( NbrIso, 1, 1 ); myUseMagnitude = new QCheckBox(tr("MAGNITUDE_COLORING_CHK"), TopGroup); myUseMagnitude->setChecked(true); - TopGroupLayout->addWidget( myUseMagnitude, 3, 0 ); + TopGroupLayout->addWidget( myUseMagnitude, 2, 0 ); mySelColor = new QtxColorButton( TopGroup ); mySelColor->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - TopGroupLayout->addWidget( mySelColor, 3, 1 ); + TopGroupLayout->addWidget( mySelColor, 2, 1 ); //connect( mySelColor, SIGNAL( clicked() ), this, SLOT( setColor() ) ); connect( myUseMagnitude, SIGNAL( toggled(bool) ), mySelColor, SLOT( setDisabled(bool) ) ); myUseLabels = new QCheckBox(tr("SHOW_VALUES_CHK"), TopGroup); myUseLabels->setChecked(false); - TopGroupLayout->addWidget( myUseLabels, 4, 0 ); + TopGroupLayout->addWidget( myUseLabels, 3, 0 ); myNbLabels = new QSpinBox( TopGroup ); myNbLabels->setMinimum(1); myNbLabels->setMaximum(100); myNbLabels->setSingleStep(1); myNbLabels->setEnabled(false); - TopGroupLayout->addWidget( myNbLabels, 4, 1 ); + TopGroupLayout->addWidget( myNbLabels, 3, 1 ); connect( myUseLabels, SIGNAL( toggled(bool) ), myNbLabels, SLOT( setEnabled(bool) ) ); - QPushButton* aUpdateBtn = new QPushButton( "Update scalar bar range with these values", TopGroup); - TopGroupLayout->addWidget( aUpdateBtn, 5, 0, 1, 2); - connect( aUpdateBtn, SIGNAL( clicked() ), this, SLOT(onCBUpdate() ) ); mySelColor->setEnabled( !myUseMagnitude->isChecked() ); } @@ -135,6 +157,12 @@ void VisuGUI_IsoSurfPane::initFromPrsObject (VISU::IsoSurfaces_i* thePrs) NbrIso->setValue(thePrs->GetNbSurfaces()); MinIso->setText(QString::number(thePrs->GetSubMin())); MaxIso->setText(QString::number(thePrs->GetSubMax())); + + int anId = thePrs->IsSubRangeFixed() ? ScalarBarRange : CustomRange; + bool anIsSubRangeFixed = thePrs->IsSubRangeFixed(); + myRangeGrp->button( anId )->setChecked( true ); + onRangeButtonClicked( anId ); + myUseMagnitude->setChecked(thePrs->IsColored()); SALOMEDS::Color anOldColor = thePrs->GetColor(); QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B)); @@ -148,7 +176,18 @@ void VisuGUI_IsoSurfPane::initFromPrsObject (VISU::IsoSurfaces_i* thePrs) int VisuGUI_IsoSurfPane::storeToPrsObject (VISU::IsoSurfaces_i* thePrs) { thePrs->SetNbSurfaces(NbrIso->value()); - thePrs->SetSubRange(MinIso->text().toDouble(), MaxIso->text().toDouble()); + + if( myRangeGrp->checkedId() == ScalarBarRange ) + { + thePrs->SetSubRange( myScalarPane->getMin(), myScalarPane->getMax() ); + thePrs->SetSubRangeFixed( true ); + } + else // CustomRange + { + thePrs->SetSubRange( MinIso->text().toDouble(), MaxIso->text().toDouble() ); + thePrs->SetSubRangeFixed( false ); + } + thePrs->ShowLabels(myUseLabels->isChecked(), myNbLabels->value()); thePrs->ShowColored(myUseMagnitude->isChecked()); if(!thePrs->IsColored()){ @@ -162,6 +201,13 @@ int VisuGUI_IsoSurfPane::storeToPrsObject (VISU::IsoSurfaces_i* thePrs) return 1; } +void VisuGUI_IsoSurfPane::onRangeButtonClicked( int theId ) +{ + bool isCustomRange = theId == 1; + MinIso->setEnabled( isCustomRange ); + MaxIso->setEnabled( isCustomRange ); +} + void VisuGUI_IsoSurfPane::onCBUpdate() { myScalarPane->setRange(MinIso->text().toDouble(), MaxIso->text().toDouble(), true); diff --git a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h index fd7b234b..a57ccbcd 100644 --- a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h +++ b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h @@ -33,6 +33,7 @@ class QTabWidget; class QLineEdit; class QSpinBox; +class QButtonGroup; class QtxColorButton; namespace VISU @@ -47,6 +48,9 @@ class VisuGUI_IsoSurfPane : public QWidget { Q_OBJECT; +public: + enum { ScalarBarRange = 0, CustomRange }; + public: VisuGUI_IsoSurfPane (QWidget* parent, VisuGUI_ScalarBarPane* theScalarPane); @@ -61,10 +65,12 @@ public: QColor color() const; protected slots: + void onRangeButtonClicked( int ); void onCBUpdate(); void setColor(); private: + QButtonGroup* myRangeGrp; QLineEdit* MinIso; QLineEdit* MaxIso; QSpinBox* NbrIso; diff --git a/src/VISUGUI/VisuGUI_Tools.cxx b/src/VISUGUI/VisuGUI_Tools.cxx index fcc2f174..4f1dbe03 100644 --- a/src/VISUGUI/VisuGUI_Tools.cxx +++ b/src/VISUGUI/VisuGUI_Tools.cxx @@ -33,6 +33,7 @@ #include "VISU_Tools.h" +#include "VISU_ColoredPrs3dHolder_i.hh" #include "VISU_Gen_i.hh" #include "VISU_Prs3d_i.hh" #include "VISU_Result_i.hh" @@ -217,17 +218,18 @@ namespace VISU VISU_Gen_i* GetVisuGen(const CAM_Module* theModule) { - static VISU_Gen_i* aGen = NULL; + static VISU_Gen_i* aGen = 0; if(!aGen){ SALOME_LifeCycleCORBA aLCC(SalomeApp_Application::namingService()); Engines::Component_var aComponent = aLCC.FindOrLoad_Component("FactoryServer","VISU"); VISU_Gen_var aVISU = VISU_Gen::_narrow(aComponent); - if(!CORBA::is_nil(aVISU)){ - if((aGen = VISU_Gen_i::GetVisuGenImpl())) - aGen->SetCurrentStudy(GetDSStudy(GetCStudy(GetAppStudy(theModule)))); - } + if(!CORBA::is_nil(aVISU)) + aGen = VISU_Gen_i::GetVisuGenImpl(); } - if(!aGen) + + if(aGen) + aGen->SetCurrentStudy(GetDSStudy(GetCStudy(GetAppStudy(theModule)))); + else throw std::runtime_error(QObject::tr("ERR_CANT_FIND_VISU_COMPONENT").toLatin1().data()); return aGen; } @@ -1149,7 +1151,7 @@ namespace VISU // ======================================================================================== std::vector GetPrs3dList (const SalomeApp_Module* theModule, const Handle(SALOME_InteractiveObject)& theIO, - bool theGP) + bool theGP) { std::vector aList; if (!theIO.IsNull() && theIO->hasEntry()) { @@ -1162,7 +1164,7 @@ namespace VISU std::vector GetPrs3dList (const SalomeApp_Module* theModule, _PTR(SObject) theObject, - bool theGP) + bool theGP) { std::vector aList; int k = 0; if (!theObject) @@ -1176,9 +1178,9 @@ namespace VISU if (!CORBA::is_nil(aVisuObj)) { VISU::VISUType aType = aVisuObj->GetType(); switch (aType) { - case VISU::TGAUSSPOINTS: - if ( !theGP ) break; - case VISU::TSCALARMAP: + case VISU::TGAUSSPOINTS: + if ( !theGP ) break; + case VISU::TSCALARMAP: case VISU::TISOSURFACES: case VISU::TDEFORMEDSHAPE: case VISU::TCUTPLANES: @@ -1187,9 +1189,9 @@ namespace VISU case VISU::TVECTORS: case VISU::TSTREAMLINES: case VISU::TPLOT3D: - case VISU::TSCALARMAPONDEFORMEDSHAPE: - case VISU::TDEFORMEDSHAPEANDSCALARMAP: - case VISU::TMESH: + case VISU::TSCALARMAPONDEFORMEDSHAPE: + case VISU::TDEFORMEDSHAPEANDSCALARMAP: + case VISU::TMESH: { PortableServer::ServantBase_var aServant = VISU::GetServant(aCORBAObject); if (aServant.in()) { @@ -1220,47 +1222,60 @@ namespace VISU } } break; + case VISU::TCOLOREDPRS3DHOLDER: + { + PortableServer::ServantBase_var aServant = VISU::GetServant(aCORBAObject); + if (aServant.in()) { + VISU::ColoredPrs3dHolder_i* aPrsHolderObject = dynamic_cast(aServant.in()); + if( aPrsHolderObject ) { + VISU::Prs3d_i* aPrsObject = aPrsHolderObject->GetPrs3dDevice(); + aList.resize(k+1); + aList[k] = aPrsObject; + k++; + } + } + } } } } else { VISU::VISUType aType = VISU::Storable::SObject2Type(theObject); switch (aType) { case VISU::TFIELD: { - _PTR(ChildIterator) anIter = aCStudy->NewChildIterator(theObject); - _PTR(SObject) aTimeStamp; - anIter->Next(); // First is reference on support - for (; anIter->More(); anIter->Next()) { - aTimeStamp = anIter->Value(); - if (!aTimeStamp) continue; - std::vector aSubList = GetPrs3dList(theModule, aTimeStamp); - if (!aSubList.empty()) { - int n = aSubList.size(); - aList.resize(k+n); - for (int i = 0; i < n; i++) { - aList[k] = aSubList[i]; - k++; - } - } - } - break; + _PTR(ChildIterator) anIter = aCStudy->NewChildIterator(theObject); + _PTR(SObject) aTimeStamp; + anIter->Next(); // First is reference on support + for (; anIter->More(); anIter->Next()) { + aTimeStamp = anIter->Value(); + if (!aTimeStamp) continue; + std::vector aSubList = GetPrs3dList(theModule, aTimeStamp); + if (!aSubList.empty()) { + int n = aSubList.size(); + aList.resize(k+n); + for (int i = 0; i < n; i++) { + aList[k] = aSubList[i]; + k++; + } + } + } + break; } case VISU::TTIMESTAMP: { - _PTR(ChildIterator) anIter = aCStudy->NewChildIterator(theObject); - _PTR(SObject) aPrs; - for (; anIter->More(); anIter->Next()) { - aPrs = anIter->Value(); - if (!aPrs) continue; - std::vector aSubList = GetPrs3dList(theModule, aPrs); - if (!aSubList.empty()) { - int n = aSubList.size(); - aList.resize(k+n); - for (int i = 0; i < n; i++) { - aList[k] = aSubList[i]; - k++; - } - } - } - break; + _PTR(ChildIterator) anIter = aCStudy->NewChildIterator(theObject); + _PTR(SObject) aPrs; + for (; anIter->More(); anIter->Next()) { + aPrs = anIter->Value(); + if (!aPrs) continue; + std::vector aSubList = GetPrs3dList(theModule, aPrs); + if (!aSubList.empty()) { + int n = aSubList.size(); + aList.resize(k+n); + for (int i = 0; i < n; i++) { + aList[k] = aSubList[i]; + k++; + } + } + } + break; }} } return aList; diff --git a/src/VISU_I/Makefile.am b/src/VISU_I/Makefile.am index f959903e..9d6c9de5 100644 --- a/src/VISU_I/Makefile.am +++ b/src/VISU_I/Makefile.am @@ -135,19 +135,22 @@ libVISUEngineImpl_la_CPPFLAGS= \ -I$(top_builddir)/idl libVISUEngineImpl_la_LDFLAGS= \ - $(PYTHON_LIBS) \ - $(BOOST_LIB_SIGNALS) \ - $(BOOST_LIB_THREAD) \ - $(BOOST_LIB_SYSTEM) \ - $(QT_MT_LIBS) \ - $(QWT_LIBS) \ $(KERNEL_LDFLAGS) \ $(GUI_LDFLAGS) \ $(MED_LDFLAGS) \ ../../idl/libSalomeIDLVISU.la \ + $(PYTHON_LIBS) \ + $(BOOST_LIB_SIGNALS) \ + $(BOOST_LIB_THREAD) \ + $(BOOST_LIB_SYSTEM) \ + $(BOOST_LIB_FILESYSTEM) \ $(VTK_LIBS) libVISUEngineImpl_la_LIBADD= \ + ../CONVERTOR/libVisuConvertor.la \ + ../PIPELINE/libVisuPipeLine.la \ + ../OBJECT/libVisuObject.la \ + ../GUITOOLS/libVISUGUITOOLS.la \ -lSalomeIDLKernel \ -lSalomeHDFPersist \ -lSalomeGenericObj \ @@ -166,11 +169,7 @@ libVISUEngineImpl_la_LIBADD= \ -lSPlot2d \ -lqtx \ -lLightApp \ - -lstd \ - ../CONVERTOR/libVisuConvertor.la \ - ../PIPELINE/libVisuPipeLine.la \ - ../OBJECT/libVisuObject.la \ - ../GUITOOLS/libVISUGUITOOLS.la + -lstd if MED_ENABLE_MULTIPR libVISUEngineImpl_la_CPPFLAGS+= $(MULTIPR_CPPFLAGS) diff --git a/src/VISU_I/VISU_CutLinesBase_i.cc b/src/VISU_I/VISU_CutLinesBase_i.cc index 7a43b3fe..2a256794 100644 --- a/src/VISU_I/VISU_CutLinesBase_i.cc +++ b/src/VISU_I/VISU_CutLinesBase_i.cc @@ -262,10 +262,9 @@ void VISU::CutLinesBase_i ::CreatePipeLine(VISU_PipeLine* thePipeLine) { - /*if(!thePipeLine){ - myCutLinesBasePL = VISU_CutLinesBasePL::New(); - }else*/ - myCutLinesBasePL = dynamic_cast(thePipeLine); + // temporarily commented (see note 0006576 of the external issue 0020468) + //myCutLinesBasePL = dynamic_cast(thePipeLine); + myCutLinesBasePL = (VISU_CutLinesBasePL*)thePipeLine; TSuperClass::CreatePipeLine(myCutLinesBasePL); } diff --git a/src/VISU_I/VISU_DumpPython.cc b/src/VISU_I/VISU_DumpPython.cc index cc010783..f0567bfb 100644 --- a/src/VISU_I/VISU_DumpPython.cc +++ b/src/VISU_I/VISU_DumpPython.cc @@ -892,6 +892,8 @@ namespace VISU } std::string aSObjectName = GetName(theSObject); + if(theArgumentName.empty()) + theArgumentName = "aSComponent"; theStr< //------------------------------------------------------------------------ -template bool ProcessValForTime( VISU::PValForTimeImpl aValForTime, +template bool ProcessValForTime( VISU::PValForTimeImpl theValForTime, VISU::Elem2Comp2Value& theElem2Comp2Value ) { theElem2Comp2Value.clear(); @@ -52,7 +52,7 @@ template bool ProcessValForTime( VISU::PValForTimeImpl aValForTim typedef VISU::TTMeshValue< TVTKBasicType > TMeshValue; typedef MED::SharedPtr< TMeshValue > TMeshValuePtr; - const TMeshValuePtr aMeshValue = aValForTime->GetMeshValue( VISU::ePOINT1 ); + const TMeshValuePtr aMeshValue = theValForTime->GetMeshValue( VISU::ePOINT1 ); if( !aMeshValue ) return false; @@ -91,6 +91,20 @@ template bool ProcessValForTime( VISU::PValForTimeImpl aValForTim return true; } +//------------------------------------------------------------------------ +template int GetNbPoints( VISU::PValForTimeImpl theValForTime ) +{ + typedef typename VISU::TL::TEnum2VTKBasicType< EDataType >::TResult TVTKBasicType; + typedef VISU::TTMeshValue< TVTKBasicType > TMeshValue; + typedef MED::SharedPtr< TMeshValue > TMeshValuePtr; + + const TMeshValuePtr aMeshValue = theValForTime->GetMeshValue( VISU::ePOINT1 ); + if( !aMeshValue ) + return 0; + + return aMeshValue->GetNbElem(); +} + //------------------------------------------------------------------------ VISU_Evolution::VISU_Evolution( _PTR(Study) theStudy, VISU::XYPlot_ptr theXYPlot ) @@ -222,6 +236,39 @@ void VISU_Evolution::setComponentId( int theComponentId ) myComponentId = theComponentId; } +//------------------------------------------------------------------------ +int VISU_Evolution::getNbPoints() const +{ + if( !myFieldImpl ) + return 0; + + vtkIdType aDataType = myFieldImpl->GetDataType(); + const VISU::TValField& aValField = myFieldImpl->myValField; + if( aValField.empty() ) + return 0; + + VISU::TValField::const_iterator aValFieldIter = aValField.begin(); + for( ; aValFieldIter != aValField.end(); aValFieldIter++ ) + { + const vtkIdType& aTimeStamp = aValFieldIter->first; + VISU::PValForTimeImpl aValForTime = aValFieldIter->second; + + // to force method VISU::MedConvertor::FillValForTime() to be called + myResult->GetInput()->GetTimeStampOnMesh( myMeshName, myEntity, myFieldName, aTimeStamp ); + + switch( aDataType ) + { + case VTK_DOUBLE : return GetNbPoints( aValForTime ); + case VTK_FLOAT : return GetNbPoints( aValForTime ); + case VTK_INT : return GetNbPoints( aValForTime ); + case VTK_LONG: return GetNbPoints( aValForTime ); + default: return 0; + } + } + + return 0; +} + //------------------------------------------------------------------------ bool VISU_Evolution::extractData( int thePointId, int theComponentId, diff --git a/src/VISU_I/VISU_Evolution.h b/src/VISU_I/VISU_Evolution.h index 27301345..b40e9aec 100644 --- a/src/VISU_I/VISU_Evolution.h +++ b/src/VISU_I/VISU_Evolution.h @@ -83,6 +83,8 @@ public: bool setField( _PTR(SObject) theField ); bool setField( SALOMEDS::SObject_ptr theField ); + int getNbPoints() const; + void setPointId( int thePointId ); int getPointId() const { return myPointId; } diff --git a/src/VISU_I/VISU_Gen_i.cc b/src/VISU_I/VISU_Gen_i.cc index 8b23c10b..3c2304e0 100644 --- a/src/VISU_I/VISU_Gen_i.cc +++ b/src/VISU_I/VISU_Gen_i.cc @@ -1305,7 +1305,11 @@ namespace VISU void VISU_Gen_i ::Close(SALOMEDS::SComponent_ptr theComponent) - {} + { + if ( !CORBA::is_nil( myStudyDocument ) && !CORBA::is_nil( theComponent ) && + myStudyDocument->StudyId() == theComponent->GetStudy()->StudyId()) + myStudyDocument = SALOMEDS::Study::_nil(); + } //--------------------------------------------------------------- diff --git a/src/VISU_I/VISU_IsoSurfaces_i.cc b/src/VISU_I/VISU_IsoSurfaces_i.cc index 1e60235e..906aef86 100644 --- a/src/VISU_I/VISU_IsoSurfaces_i.cc +++ b/src/VISU_I/VISU_IsoSurfaces_i.cc @@ -138,6 +138,8 @@ VISU::IsoSurfaces_i myNbLabels = VISU::Storable::FindValue(theMap,"myNbLabels").toInt(); myIsLabeled = VISU::Storable::FindValue(theMap,"myIsLabeled").toInt(); SetSubRange(aMin,aMax); + + SetSubRangeFixed(VISU::Storable::FindValue(theMap,"myIsRangeFixed").toInt()); return this; } @@ -155,6 +157,7 @@ VISU::IsoSurfaces_i Storable::DataToStream( theStr, "myRange[1]", GetSubMax() ); Storable::DataToStream( theStr, "myNbLabels", myNbLabels ); Storable::DataToStream( theStr, "myIsLabeled", myIsLabeled ); + Storable::DataToStream( theStr, "myIsRangeFixed", IsSubRangeFixed() ); } //--------------------------------------------------------------- @@ -204,10 +207,11 @@ VISU::IsoSurfaces_i ::SetSubRange(CORBA::Double theMin, CORBA::Double theMax) { VISU::TSetModified aModified(this); - + + bool isForced = false; vtkFloatingPointType aRange[2] = {theMin, theMax}; - ProcessVoidEvent(new TVoidMemFun1ArgEvent - (GetSpecificPL(), &VISU_IsoSurfacesPL::SetRange, aRange)); + ProcessVoidEvent(new TVoidMemFun2ArgEvent + (GetSpecificPL(), &VISU_IsoSurfacesPL::SetRange, aRange, isForced)); } //--------------------------------------------------------------- @@ -226,6 +230,25 @@ VISU::IsoSurfaces_i return myIsoSurfacesPL->GetMax(); } +//--------------------------------------------------------------- +void +VISU::IsoSurfaces_i +::SetSubRangeFixed(CORBA::Boolean theIsFixed) +{ + VISU::TSetModified aModified(this); + + ProcessVoidEvent(new TVoidMemFun1ArgEvent + (GetSpecificPL(), &VISU_IsoSurfacesPL::SetRangeFixed, theIsFixed)); +} + +//--------------------------------------------------------------- +CORBA::Boolean +VISU::IsoSurfaces_i +::IsSubRangeFixed() +{ + return myIsoSurfacesPL->IsRangeFixed(); +} + //--------------------------------------------------------------- void diff --git a/src/VISU_I/VISU_IsoSurfaces_i.hh b/src/VISU_I/VISU_IsoSurfaces_i.hh index 86833c53..b8e245c5 100644 --- a/src/VISU_I/VISU_IsoSurfaces_i.hh +++ b/src/VISU_I/VISU_IsoSurfaces_i.hh @@ -82,6 +82,14 @@ namespace VISU CORBA::Double GetSubMax(); + virtual + void + SetSubRangeFixed(CORBA::Boolean theIsFixed); + + virtual + CORBA::Boolean + IsSubRangeFixed(); + VISU_IsoSurfacesPL* GetSpecificPL() const { diff --git a/src/VISU_I/VISU_Prs3d_i.cc b/src/VISU_I/VISU_Prs3d_i.cc index 4f61facd..84d72d90 100644 --- a/src/VISU_I/VISU_Prs3d_i.cc +++ b/src/VISU_I/VISU_Prs3d_i.cc @@ -101,10 +101,6 @@ VISU::Prs3d_i::~Prs3d_i() { if(MYDEBUG) MESSAGE("Prs3d_i::~Prs3d_i - this = "<Destroy(); } @@ -165,10 +161,6 @@ VISU::Prs3d_i if(theResult) { SetStudyDocument(theResult->GetStudyDocument()); - theResult->Register(); - } - if(myResult) { - myResult->Destroy(); } VISU::TSetModified aModified(this); diff --git a/src/VISU_I/VISU_ResultUtils.cc b/src/VISU_I/VISU_ResultUtils.cc index b117cc9c..640dd24e 100644 --- a/src/VISU_I/VISU_ResultUtils.cc +++ b/src/VISU_I/VISU_ResultUtils.cc @@ -176,7 +176,7 @@ namespace VISU const void* thePointer) { std::ostringstream aStream; - aStream<(theActor)){ VISU_LookupTable * aLookupTable = GetSpecificPL()->GetBarTable(); - if ( IsScalarFilterUsed() ) { + bool anIsScalarFilterUsed = IsScalarFilterUsed(); + if ( anIsScalarFilterUsed || aLookupTable->HasMarkedValues() ) aLookupTable->ForceBuild(); + + if ( anIsScalarFilterUsed ) { static unsigned char MARK_COLOR[] = { 255, 255, 255 }; aLookupTable->MarkValueByColor( GetScalarFilterMin(), MARK_COLOR ); aLookupTable->MarkValueByColor( GetScalarFilterMax(), MARK_COLOR ); diff --git a/src/VISU_I/VISU_Tools.h b/src/VISU_I/VISU_Tools.h index 128d755b..50713227 100644 --- a/src/VISU_I/VISU_Tools.h +++ b/src/VISU_I/VISU_Tools.h @@ -27,6 +27,7 @@ #define VISU_TOOLS_H #include "VISUConfig.hh" +#include "VISU_I.hxx" #include @@ -45,30 +46,30 @@ namespace VISU /*! Display/Erase/Update a curve presentation. * Parameter \a frame may be NULL, in this case there is only update without display/erase */ - void UpdateCurve( VISU::Curve_i*, - Plot2d_ViewFrame*, - SPlot2d_Curve*, - int theDisplaying ); + VISU_I_EXPORT void UpdateCurve( VISU::Curve_i*, + Plot2d_ViewFrame*, + SPlot2d_Curve*, + int theDisplaying ); - void PlotTable( SalomeApp_Study*, - Plot2d_ViewFrame*, - VISU::Table_i*, - int theDisplaying ); + VISU_I_EXPORT void PlotTable( SalomeApp_Study*, + Plot2d_ViewFrame*, + VISU::Table_i*, + int theDisplaying ); - void PlotCurve( Plot2d_ViewFrame*, - VISU::Curve_i*, - int theDisplaying ); + VISU_I_EXPORT void PlotCurve( Plot2d_ViewFrame*, + VISU::Curve_i*, + int theDisplaying ); - void PlotRemoveCurve(SalomeApp_Application*, - VISU::Curve_i* ); + VISU_I_EXPORT void PlotRemoveCurve(SalomeApp_Application*, + VISU::Curve_i* ); - void PlotContainer( Plot2d_ViewFrame*, - VISU::Container_i*, - int theDisplaying ); + VISU_I_EXPORT void PlotContainer( Plot2d_ViewFrame*, + VISU::Container_i*, + int theDisplaying ); - void CreatePlot( VISU_Gen_i*, - Plot2d_ViewFrame*, - _PTR(SObject) theTableSO ); + VISU_I_EXPORT void CreatePlot( VISU_Gen_i*, + Plot2d_ViewFrame*, + _PTR(SObject) theTableSO ); } #endif diff --git a/src/VISU_SWIG/Makefile.am b/src/VISU_SWIG/Makefile.am index a95527bb..3b4a7ca4 100644 --- a/src/VISU_SWIG/Makefile.am +++ b/src/VISU_SWIG/Makefile.am @@ -59,9 +59,9 @@ _libVISU_Swig_la_LIBADD = $(PYTHON_LIBS) ../CONVERTOR/libVisuConvertor.la ../PI dist_salomescript_DATA = batchmode_visu.py batchmode_visu_table.py batchmode_visu_view3d.py \ visu_med.py visu_view3d.py visu.py visu_gui.py visu_prs_example.py \ visu_table.py visu_big_table.py visu_view.py visu_delete.py \ - visu_swig_test.py visu_split_views.py \ + visu_split_views.py \ visu_succcessive_animation.py visu_apply_properties.py visu_apply_properties_successive.py \ - batchmode_visu_view.py visu_cache.py visu_pointmap3d.py visu_view3d_parameters.py \ + batchmode_visu_view.py visu_cache.py visu_pointmap3d.py visu_view3d_parameters.py visu_evolution.py \ VISU_Example_01.py VISU_Example_02.py VISU_Example_03.py VISU_Example_04.py \ VISU_Example_05.py VISU_Example_06.py VISU_Example_07.py diff --git a/src/VISU_SWIG/visu_swig_test.py b/src/VISU_SWIG/visu_evolution.py old mode 100644 new mode 100755 similarity index 53% rename from src/VISU_SWIG/visu_swig_test.py rename to src/VISU_SWIG/visu_evolution.py index ade7a94c..cf17eeef --- a/src/VISU_SWIG/visu_swig_test.py +++ b/src/VISU_SWIG/visu_evolution.py @@ -20,9 +20,37 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -from libVISU_Swig import * -medFile = os.getenv('DATA_DIR') + '/MedFiles/fra.med' -myCon=Convertor(medFile) -myPrs=ScalarMap(myCon,"LE VOLUME",0,"VITESSE",1) -myView=View3D() -myView.Display(myPrs) +# VISU VISU_SWIG : binding of C++ implementation and Python +# File : visu_evolution.py +# Module : VISU +# +import os +import VISU +from visu_gui import * + +myViewManager = myVisu.GetViewManager(); + +myView = myViewManager.CreateXYPlot(); +myView.SetTitle("The viewer for Evolution") +print "myViewManager.CreateXYPlot()" + +medFile = "TimeStamps.med" +medFile = os.getenv('DATA_DIR') + '/MedFiles/' + medFile +myResult = myVisu.ImportFile(medFile) + +anEvolution = myVisu.CreateEvolution(myView); + +aSObj = myStudy.FindObjectIOR(myResult.GetID()) +aSObj = aSObj.FindSubObject(1)[1] # dom +aSObj = aSObj.FindSubObject(3)[1] # Fields +aSObj = aSObj.FindSubObject(2)[1] # vitesse +print "setField : ", anEvolution.setField(aSObj) + +anEvolution.setComponentId(1) # x component + +anEvolution.setPointId(500) + +print "Show Evolution" +anEvolution.showEvolution() + +myView.FitAll() -- 2.39.2