From ae32dcd34f98b91cdb4f5800063a394feb0df408 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 21 Aug 2014 15:15:12 +0400 Subject: [PATCH] 22483: EDF 2772 SMESH: Define several 3D viscous layer hypotheses on the same Geometry --- .../gui/SMESH/images/analyticdensity.png | Bin 0 -> 11816 bytes .../gui/SMESH/images/createmesh-inv.png | Bin 24164 -> 32951 bytes .../gui/SMESH/images/createmesh-inv2.png | Bin 24918 -> 34473 bytes .../gui/SMESH/images/createmesh-inv3.png | Bin 23896 -> 31860 bytes .../distributionwithanalyticdensity.png | Bin 35416 -> 33428 bytes .../images/distributionwithtabledensity.png | Bin 38836 -> 33863 bytes doc/salome/gui/SMESH/images/image10.jpg | Bin 20826 -> 10816 bytes .../gui/SMESH/input/1d_meshing_hypo.doc | 40 +- .../gui/SMESH/input/additional_hypo.doc | 11 +- .../gui/SMESH/input/constructing_meshes.doc | 31 +- .../SMESH/input/constructing_submeshes.doc | 12 +- .../gui/SMESH/input/creating_groups.doc | 25 +- doc/salome/gui/SMESH/input/editing_meshes.doc | 12 +- idl/SMESH_Mesh.idl | 41 +- resources/CMakeLists.txt | 2 + resources/mesh_minus.png | Bin 0 -> 529 bytes resources/mesh_plus.png | Bin 0 -> 598 bytes src/SMESH/SMESH_Algo.hxx | 2 + src/SMESH/SMESH_Hypothesis.hxx | 3 +- src/SMESH/SMESH_Mesh.cxx | 55 +- src/SMESH/SMESH_Mesh.hxx | 2 +- src/SMESH/SMESH_subMesh.cxx | 56 ++- src/SMESH/SMESH_subMesh.hxx | 4 +- src/SMESHDS/SMESHDS_Hypothesis.cxx | 11 + src/SMESHDS/SMESHDS_Hypothesis.hxx | 1 + src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx | 45 +- src/SMESHGUI/SMESHGUI_MeshDlg.cxx | 352 +++++++++---- src/SMESHGUI/SMESHGUI_MeshDlg.h | 57 ++- src/SMESHGUI/SMESHGUI_MeshOp.cxx | 161 +++--- src/SMESHGUI/SMESHGUI_MeshOp.h | 8 +- src/SMESHGUI/SMESH_images.ts | 8 + src/SMESH_I/SMESH_Mesh_i.cxx | 86 ++-- src/SMESH_I/SMESH_Mesh_i.hxx | 18 +- src/SMESH_SWIG/smeshBuilder.py | 45 +- src/SMESH_SWIG/smesh_algorithm.py | 16 +- src/StdMeshers/StdMeshers_FaceSide.cxx | 24 +- src/StdMeshers/StdMeshers_FaceSide.hxx | 3 +- src/StdMeshers/StdMeshers_Hexa_3D.cxx | 16 +- src/StdMeshers/StdMeshers_MEFISTO_2D.cxx | 3 + src/StdMeshers/StdMeshers_Propagation.cxx | 22 +- src/StdMeshers/StdMeshers_Propagation.hxx | 9 +- src/StdMeshers/StdMeshers_Quadrangle_2D.cxx | 4 +- src/StdMeshers/StdMeshers_Regular_1D.cxx | 46 +- src/StdMeshers/StdMeshers_ViscousLayers.cxx | 468 ++++++++++++++---- src/StdMeshers/StdMeshers_ViscousLayers.hxx | 12 +- src/StdMeshers/StdMeshers_ViscousLayers2D.cxx | 384 ++++++++++---- src/StdMeshers/StdMeshers_ViscousLayers2D.hxx | 23 +- 47 files changed, 1512 insertions(+), 606 deletions(-) create mode 100644 doc/salome/gui/SMESH/images/analyticdensity.png mode change 100755 => 100644 doc/salome/gui/SMESH/images/createmesh-inv2.png mode change 100755 => 100644 doc/salome/gui/SMESH/images/createmesh-inv3.png mode change 100755 => 100644 doc/salome/gui/SMESH/images/distributionwithanalyticdensity.png mode change 100755 => 100644 doc/salome/gui/SMESH/images/distributionwithtabledensity.png mode change 100755 => 100644 doc/salome/gui/SMESH/images/image10.jpg create mode 100644 resources/mesh_minus.png create mode 100644 resources/mesh_plus.png diff --git a/doc/salome/gui/SMESH/images/analyticdensity.png b/doc/salome/gui/SMESH/images/analyticdensity.png new file mode 100644 index 0000000000000000000000000000000000000000..b1c9972ab94283d7d89c68aa31cb1cb84e11e7da GIT binary patch literal 11816 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/createmesh-inv.png b/doc/salome/gui/SMESH/images/createmesh-inv.png index 2180d416a6d84a76954fcfe8b660b3990f4fc2de..d17ce5373d7e1cd6664f189baee5e975de700a0d 100644 GIT binary patch literal 32951 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 Z=y@TAld2-cr|=szc^PHtV#(+J{|yDX3c>&Y literal 24164 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 Oy7Q;HauLcr_`d+e?3N7x diff --git a/doc/salome/gui/SMESH/images/createmesh-inv2.png b/doc/salome/gui/SMESH/images/createmesh-inv2.png old mode 100755 new mode 100644 index 2b6beded2aaf5365558ab37413edc0dda4dc0cc4..30e624813ee73ee8434c44e4544175300a237828 GIT binary patch literal 34473 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

!<1JU+ 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 literal 24918 zcmce-byQVd+c%1$ptOogBZ{PSw}PTHNF$AOcZZUaD$;B~kZzFf?v|1k>F$Pe?fZG2 z?;Gzq@B5we*SW`F+#B~|t-02k^SXXDKgmkJ#>ODRKtVyl7JKvZEeguDD)>>jg$Dmp zFnZ{NP% zwA7(T#%3F3+l$@d-pAue*s@}`+sYY#i^2y_b9ub3PyXAeJfgRDAY=+3{wZ1KN1FHV zu@F4rTNFgGIFBZNkM;cXITRDNg@rm&EQ&%NoBhEt7(Cm`Ukd};wcNTK!7%ZEgexH|a91aFcZZxC{&W^vgo6 z*Jje#Rq|oQl>S~{=V?l>i(jwO#xaSfw2dv9oU;o3jfpCet>yJ4*> z6ur~ba&+ZbY`Aci6|uj*TcSiG&Z1^a=1V;?AS#xs(e~hm|B=YU2%i?UHN3TTN4A2aMecPimtqY4 zvXXG0?z~dK4g>ur_vf4RxEhmUM`k$gx*82DR*gIAD$Zji^Oqa>>Rsn2RHJ*p^|psp znN5bHoHJ_~)N!>0RLnoeF0O_|mYgufF`>O0|7kp<^(5F?5Bk7 zC~`W#t{Ox(Q*kvOd3i4BxgIr1&$X0Zj@)KB=lqQGpGBkQ!m~XadCyNp_^|@L6<=pv z@z`Pb-xR8vPPg+pt7`nj@3a*aG-R!LNp>0E?O+B7?rs4>A(^dz|a+T~22;#DGs zb!M!Kh4Sy>v$_ywy@ECSlO*_*keiR%&Xi{siRMS}#wj#7)bsJhU(t_TH9e}Xe8Dv{ z6h+Rs_}=8HUT0Q87mXqTHrKK94COzV9v87T2<9#2<31PtvS#mft@364eox*scKxc} z_L;@@IN9jgh9Ohr7p?WxVS(wUgUX!lkAH&r>}5Ki$utb>VX>Eonl3!lQqM2i?MhpC zSS3uRJx-x)d0Tr}uDtBtv)}J7`sTXaKikf6dc;W!9~m99-ro&ml6I{u%T9Vr`$WmANz1*knyTxh2Fsry6so_F<#6yot&n6P8{&pOLw9 zBHPo89aCEg(m1-j*AL>>Dq`*wJ&RyU(QsmIRod#yT?Wkv5amy+S}bc3~aKZtlHh}lA(7+7}k_a zIV;^_*K`x&JJHn$AJI^6d+TCN*yj6)q4IrfR(WZ0n)&W~V#eJ395a8nlc;T3DW11_ zy-u^ZxiSh)S5}j^FP&L?Q|#?$Ph0Xrum63DyYl z%LfjLjskXclw}`;sOp1=nG&AQr=Xts&V?jl3Z(8H_@8LfCnVG#u_$hIoWPD(>%Fg^pld( z*QEP3s<>IGuFRDFYcoqiUcK#hE@ye_{T!i9qEeFIhq@Q~p2~F=OT2T`cZK|ShrWqNW*f(4O`yrF-Aksz9xpyK@4B}+nwZw|oi=Z&Xa%>Fw;|owdN^_p zqspXiSh`KsWgA=I5sI#d))89Jn(}zZ{SI@D4?pC;7vLZ2*Q*wr`eWtIwCs{6)sCT; zmH987Rrw9?2I))?j)wA;5nS3f+wb~m+9G0(hg6Lo{-LAJCwME<6kemDf3ZYk#;4&P z6E$ecoP+xEr0OF_O20ixP7WgIuo1yk-us^Yexr<`dX%aWUB<)9ywJb(KRjmh9eoF5 z=M}GdB68&~mt;L+|Kzx-*-t1;aXP6b;&ITDzlq2cH00kqi7CfeaPy!FJ=2qMQmEZ^ z$r^I5UG5}?&M3_O>WfE0LegXSsNO`m4*zo!2a?DC*WxJecEre@P|e_@aWHkXv&XG!OdVCTq^E*^dO$}#S%DMfT@?|^IH`L^eZtH z?at9~+Uf+Kf3;>EY9GADHLGQcEtm#&;dyN-sim3|V8A2Wrr9gPpy2Y!}PZpHe?9cAS|;vrH;iKhe}sZQuA^ z5>#QksLL5Ar+7bosN;uNc=>!NUlv2xdsY^!+2=Ts>Op?H3LkzkPcQvWF{$1J>eR3-D=aX^rH+>nqf2Gnyzh z7bz3__0n1ZU-88NK8ZB?d?G<#-Q@vO<X~t(d@e? z!{0Dta2axRb$O}3H{-e`5b0iw71Z)EEDYDO_JE3%&!HLa%c)wKigH|JCYGppUQESzuNgUJUkVf#3G${Sapedg-Y5nk7;_wV2PI;Xr2TO4>z zep7omOR;)?P{M7egcgj@KvF)7^^v>H2=&IY(*QsO@x&!aiNAHXh=BSt4 z^|GFCWpP+n`TF%Mib|y&Z8(+mpKuwW%&3q9ss(>mktSj1{ejnn{6@?*E(ebV1rsJL z>ktjz=&0Jv<-%P??3#zu+RUF56Z?{0csreKlsTU)M8)vh(bv93a)jlL6)Kj3-grZVzMS+|R^h!C8xVWN}wcKHHzI^lM z777m!5B`G(UlS8$5(V9lyRgQRHQU==1%cjttySecPCNsZp$3wY$?;el+ zDn821n>Wo)bTDILV!Gpb?xCbNIqSc3B&Dfpp1n#tCl3pAjo0$H^qs15+?(~r-EDso zw!PcMlwwTuJhd-2?fcM5`BH+btYQQ@nUj}JlV8QsHM_NuknV2DNJb6uz662WSXg%X ziSUeCLx?-t+h1%Mj^=6bxE(Xo zI;NH{5r>E#seXt}Q#@wRGmdp_TejnsQ;bl|R?=Z^FO04X2n>Au^r(kBii#&YZRGSD#rlF@XAnnvGGuv%WoSf_ma6=v-8-(3aIk5EpAVTpt`9Bw)9~6B84ogsQvZI?mz(t3&X+XWixg+Gv=M&kdzqwHBeP z6PbFB8v>4->R-ddS0>7~^aU~udSZ8`9B1y3llOUE?vcZ<_Npgxa&r7fleQ5!q>O4m z1MX2v_oqrcgtsmB=8ZO#aW7M+(`nbORMXMC=C-!IU-B}F<-y-eT@F@XCmAK#X_xvE4VU}BM@iMe#DGO?^5o~6 zTXWcy>o3Fa5)yXwBKU}_2!(GkJ!$%HdT0krm1#e;9-^w-(6^+%to_r+pH}oj<7>8m z)%Y()TyPJXgWUCE|^mIl#@w1IS5CP`alyV%UH*hAeL9npbh+(m6bP|^)V~sei|l) zkJXogz31|nd`ZF?5y;LZUlMeUrUovILb=YLJT$z~_P$Vs5tHPVT>pxlGD(vDi*#e6 zth7qu&Bo$14J>}Z8gTYZ3FeC;J@m6f@>dnivCCGPZa;%e#b&0b2G$PjO~P#E60_8A zm0?~>Utzb4rGLXA6%IEVfN6ro2ZbzbQ-Hwv=*?nZ;#NY!w{I^iX%RJNha(j>(1B-P zc=K3oKSy+x6WOV42;EyBukmNQ>0Xw#fax6(b#-+_Xl}&T zaD|9;x=8wpdf!7bBube3GoZ=O%>4P{>`-1o!6z}1{OoAswPIf4y+`aC8?Fu;6J>g5 z%JgE+x;RVS7`{s{q$HZG7x72d*HC2CjY2zz9rBT46*>(9Cxfl0agj zpw~L-G#Db5#GR{_%51xvUyud7YO5m7d8^x&DI9_5`9>?xZMTf)5Qm6lc*pA6YnGgn zaxGfOQV>%}D6Vs z2qhKjT`eKzap-OIn(3SMG(?aHAX>)tT-${X*lzL(em9)a(kW4cVs20Ln1Q(QnNYCm zNcPa${_;VdfBY9(A3R2~u)ZnxqbbQmPQ8yd})y%veq=kIn?Q+Yb*pHXz#@8smi06;|iaIPh}hHd^x zO&uOB9VV9XW4XH6ia2+g<#*rmKr?-gjuYQG`zs+NetP%L$RwMQ%M)G+-rHhLMr0H5 z%h5(|Zti(b89Rffo1Nrc$mx13O3j{rvwROn)9Laiw3jWV=*|D#H3%5r$;jbHdenRa zTvVXfh64rdm06HVg6k$vuxN@akJOMAH;Mh^H$V9y*_4j=f7(~f?)nS(<&I;Ma3{3P zkw36K_4n+jQkSt#Ld>U!4$dnh0)m24^t&Q&prenTd_{wmRwAEWvr%(29W*reH}aju z-1*7g=E{o~FZNd^{L5xs;%?ugPNKm`O-&^cw2SW5;FVWVdE?y5QEH!HZ1s!K{r`kJl_3ky4~ZIsb5JfWit^vpkZ zOx^2@ayO2VdL<=LHIl2AQkF-3;YOvVjU~un@%Z9cxw*CVYxL&;xEIbiZ2zVY`T3Rz zCMqBya$GiO-sqDLEtPkWpz}6qa{GAkb%l`6hh?90ExVZb9Pg2k1jF9}hA+5KYmG_!D7Vv*;P@Zi&s>obLS#oVraxp#p7TZO01++`9 z?yuc*Tqhd_b-=_ioiu+w+ni znq-Pp9H)%{&^LD0aZK0xAFG{|PVFo+7Ho0j=MH>ww_Bfms5%Pi|^Bcv^J4sTJs zlvf%SEDrWTpl??1^=7NhcwIwPDY6rb*lTKRlEuGi<&Np5nD2}C$Ax)r{PyrB+l$8D zCk|CLg>kYk{)cX*(b#Losr7(6Fga;-ZEZm_W?e%JhJv-OdNvf<0~AY9dXGNAnCvzq`ARSeyn| zwe~E=tA5|+&oDOT?u}2TS-bHMw!i;pZS7t9;kW;$r^$^mXjVsu37tmcUY$@33=E)< z@Ywipn2xX;&6{+=611GIrfcf8C>vdoP}nGqb#>s33u$^CT5vuyQ?#XkbI~Tb^k3VE zZ%6BD|gI4){d)~|$YhA5xEe0edLD|TLf(PrYR%7Lx7xVTtkGEC<{CW!u>>nrmr zWADQio`Q>qHlb$Uwg+*4%|@I^9gQ=U;POCHHI22y?EHa$C`P%e!*gxOBZ%vF%G*30clv zdh@0lk+DqE_@q%zA$6oFWg&vR^VwPlFhMLd?=w~8I#yq``zYS2L5q)%uU$5AVlm_h zp9&WI8QvQhu-Yz4qQv8*yPix=s)v#ZbZ*ZzX{?1w>U5*(P40z=J}H}WAVz_a(gZdF zIYW6PDf#zTraTJAh&&<46ajpqD0n0!-TmK1PFAz?3D^v<65US;wLDJrLnhu$F{eQb zoc)CL|JDMH#*?4246q!ZoX!>SndFS#i_)}JzEt@~o+|%E;Ly;}@bcx$0?REyUdI)z zdakb8hWD&r;=f^e4XwOXR0Q^+m@dB>BARk`{58#(09YUYzZ!8KfQqt4>8mi$(OuP-o>hiYCso*r&Uq!aTE@R#z4lIxW$Xms?a0aNI7W)J2$y&Qm> zzdZIAdaJG;teM{idQ+69OGi!j$D5c=3k%9f8pm6M^DZ-F;3&-D2yG_j2&YeQ?-|VJ z9`}#p8VbrXKp<&pX|c-nQ79-V+_uAT=@{leu;4P=wn~2Wr*u^?v~P+YkQ<;`l=_j_ z_YyO>p-i8=mz+oJ{Yy#&uYF@*A8uTaU(;NDTN`?O0%8gvY4RmaW>pwpN|X0(ob3kP zUgPyc_4}Z(JZ5AJrEV3Hn=i_ICvQBFXCAR95h!tNHn(KPeNXH!gN&@&=Z=`IXxqK z+|Kb%tgpMKwzh9m{gej{m#BNL$seAy0CD4uQI@JKvaB>#r|sw8o=DKVnGidi+oItu zL2P;OK37tD003(^PitHRy4yu%p2fol_eon?w>U>!YGVCJn}nOnsTXiYF1P4eyG41+ zLegAE58uc4J*pQ{^&&_3I(TN~2K>I%!K>6Iq*LQ&HS@*^C zirvWR+6QFg7P`%c`=(D4u4WGHKKgXTD8lid z&)Q^{kdUw*BZVpujtFNk&rbdQQ|=bUszf*zA4>LcV6r;FVP|ivLB3nMk>gnYsWcxo z7rOt@i}x>o{LIDSH%AU7ii+4_mdHdN-?v{@8Mn`(Osh1wY0l`|^b443D0k-WykB}R zF=5gX{?A~H2X)Y86%_t%>u~ybmGxPZq#%&Wf9^+i{H8kQ?WbfB>ogyfE%l>UY1D zBsfa`8BvYDhMe4;qiI{FmZvS;>p17<=S~a5%FDyq52?aGX$rUwth7pJ1O`r7qyvED z7u>XV*7ETi}p(H7A`I|HT7#a{qTQIj{pH$i{S)A zNJt1p$+IdpJ<%mLH}l=KTeog$0|VJyC^H*x9P@80nytCHzd2RaX@l8)^S+CdboxCM zYU!i3*l*vyF`xK$#0$C;DJtH^!CCZusF`H1ZrYnDBm+(Ar|BrpE5(9|^`B^=0S#0$i$^GhY zvXye3?0;tygtXF|ypuA=7Y;amyX7b=r#MV%hjMcB=zHki`}w;_G^cs2YXWEriEgL2uTDqnpiCJC6LAD~ zFi9GKPeEjP)Jw6w4Ml!RUsBL3S=xI(|)P0*R9+(^Jn7UWPFb1(Tz?=ilE+2n_- z*LfwCX?^m0eG-rfC=JJ_n&S-lf@k||XfwR!zx6#1vbC)Lw%-ZswB<#R@VMN76%aPC z6!?4bQ}%Evhy(0WO*1p(UhVDeCPI|IO3fom3RPu`)pF^5@P>{1iC>t;wxZ(l*M|vR zs%+Q@UF_dO@Hyrwj#oHWaFc}c;<~zng!*N4+L@K#Tywm+(0MSkf z%$RY8gAzM8=ndYD;HOWYO7gOwZ3CYTFePpK6i#iTz65h_Y2wPQtNLWmgkP`}WQ5Dh zqdGSC(|z8OTndez(#$MzQ2JHM97r8gCtG4UOhFX)^!}L(6=Sx(0ToH{KV18OADus4 zqw0${{aS3weUgxrOw!5=_knG%KIV;M^rVbV#hN>I=5Q*o5Ml^pejuc?Z7Ondo>`E4 z@ByrLB=;O7-gi5m^H)p|zB-$^Na)ot;cCX{=TGB_m43pIyLza;ii>;kVQ;AqBrYj{ zPGDUvre-p6d@4;%Pv86V?IA54T{57fYTgY+psuSm=23$yc6KY1zHi^r8Wf)d0*_V~ za{EskJ_s#9Ri5?r^ZDw*NE+VpYpjQYiV6*pmd)u#EFo|4PJiD;0AaZHBo`^qvx7Ftl&ydAHYghUFs z2;9~Pl&45DsuFp)*(QaQq9QF_Pq z`(o@S8k(-S<#{pjTJn#d%{6Rh!$pcIKflvz;ZJ>=Sj>!Gj&8O1h?jgjgEqao)X*{0 zl%v2GPgo&ezD=5h+bQX{KGFU(Qm=j~|LDKCy+}g)KN!LPhp$F^YFP4L18gG(ojbtg zSDDsKt3@M+L}PE4udn}i8Vr=cWQ7woP(>sSr6!%15C=-r|CR)5A{=W#jkeMMo(4vX z{mGGjA5>?O8y;7) zTQP#}m9CW??{&A68aO06|5>tR% zD*gMA9r#UP^aKP4Hyg17#qR=U$>V;?4lJ|Di2ZtbBC)uG1Lybe-?7#F@j_a{6Q*91 zdp3*U3R2e8qm3l#l-YH>wUDZeSm=smvtL!%cX9U~zJK>_Bk-SV_5V33gW6ueEn}{>d$y(VeaT;I%fiy4NSr z2c9Q5Q$J0H1G#2g!lR=JQ2cPor9ta0Uz&C$5Om|dcI{foVe#GM+TmZts5I;kU8-|3 zs?e~jz_MWht~u?p#!!24_-+%tdGV;TlRBZjUqdnj&oT(PW^CAy+|l)DvniA&W^ z^}7}sax{x$!9=iK%Prg8ACei$*Al{VK}D;f?m zMMFtCei{!sIj?ph3o6**Kpj`6s<`s2cQLfw5AJ)$Tt4)}A;hRp3FGfP-kGo1D4jr2 zsdi#Pk}pu>Z>nF_WoBj~eTBN7b7JsV4S!|GO*%}NV^3$}Cx3Sye8=`MRzOqfmxj0R zRDysjO%eV;v9b*K9JNOmW3k$ZvAUc_Keyf%`Hs@@b0-&0ajGOtvKJp+x4kj1`hhy4hXOyBR~QEOs0JLE@%b24d~<`V~eJI0Vf29T(BEV3;(Pv@EZK? zJQ3AqCjzVB`1qLF=Ir3rhqU`^KB zM?*~P_Ke#FHjLLdk>Q3q-_MqyhkG!kN8ceO2r{iFN*;#U#<5lYa-8|=jjKfnN5wA9 zAeX~+u`7=YIR#$`XMA}o5y|Yl`yP@JPFpocbkDN0=sYjhw44`X3@3+#MMPG{3ZH-% zt@pS6%QH|auc4y-QnCEsE_C&7Cp}G|FpLDyHZ?pZFHlO040?!=?{u^7%Hwh;%#(e& zP=g{bO~Ta_9fu@IK3y7FuMCP~gl#E+m;|3}5FDL>!EQZUe{E%DxEQS>_80;fsd{ap z=SA}mORs(+HiXO#2a;dG2#$;Ny}iASrz$y2M|1v(g4|y$F&zzsH-K8;Hg0pezap=9 z@s9$dRFSlImlqKVIiLtgu@u^`DIJMXMv04wRpg*wc2FlWyPw)sI&5^}3Z2)lj~5GM z*}^sAxvf7kYEqPexkW;Og?i4bWgP0gLcQX{Y;fQx4;LebWN`SCf02 zNw9e7Z%ifBxYB9JsK=nKj5BEdj0St|e%itEIBI&67)YJg*4FnIYc5;Y_%HT{s!tZ< z0KaDo_pKtFx3<^W`gVWkj80N#{G#OMj{f!yA8nG=>+@&4quX?U9s`x#tU1y|QTu81 z!otGB_arm(zU5;?baXpY-MNh_PgLGS@+(YMHnyp)rpCtO6O(a$>%f^Nd~P{0*>Zen6m!uMt_ z2C`x=+g|E16EG76FJrrmiamAlKD%+>yWx?c0LB0cGXJ3-S8fuu0s*d$jt-DOLlZqu zDt_y?39)Ee+|clqCgoFfAuah|e!SE?4jlmb`Fzg{dZnNU$R&iiSb`GrYuIkm9EcGR z%Q&!eyI3mGMkpKe)_>VTl7T9L#B?IIQZckcb#t;P( z`Cz|vagg%&K}5xI>*(rny$DzvZ2ojF<{#ET31LN4Z|Du9}gVwd$d9={{ZzvYAHDgfB;HZbx3~#CNeV zXP%o7tdqNc9~q{@R#aqi1qotixLQL+szF{|y&HlFJc-r`#Fo`xW@ojb1ViL5>(_X$ zDHp8L+qZ5ReRB`}AMjK58B-NrvWfCuwksp{2so?H9$Tb!xj2X9qxrUG?oF*7V^ox((Pk zt3uZAjdNQ=vhTLV1Ef<2W>~Z&)#1jJe_|b&{9EZ@Un0G)J9p$P?bA|Izl4X2!1U?p z>Y4`~AGu!PmPl~W;jk9nLT2rHFZ$mOGVE{0VkD_R6I7ow9h9QF*CE!iK2=smk@W*S zXr$q?BNLimgsn^mUbO$!KJ(18v$W|>Go!%dau@rDf&#|8*oZWd^dX(%@$J36rWL#7 zp_Mlh5+ZW=SZJuABtX>zD-c+)QNf|=vj=YO?!-B66h!joE)L4SF`w1dmW%}^)3IY3 z`3ejeJ&4HU{1N( zEiDhEuw$BtKG#Mulup!vT&4QJI|FA3;30?4_V%_Z-7?C*Q6f&dcS>8R z&H6Hn&7O@jFzrIVb)(o;$gPb5Y69osNBIu|E8o-xBhZ%+046_8Ss?u_C|1X3XYzn{ zT`{Lq9Ji)P1YEwsWA&R6jOR4}jgqGmGCY$<#m08ezv%^(|0YXvX>ILCDCBP2*I@qJ zZBE97lJe;?6A*0}K7Hw)ooT2%s&A?`GujsQ@#A%vZy@Fhc?tyv1r4m&L7Fegn8^Hh z>37gGywPzhaja?RaH>*z>}k6%~;Ir5Vf11gOIOfZ>6w^SJz_SrldiDSi3ilztjs zuJ~9D#CPJQ`Fet5*ihgtJX#r{^q9PSQc+QXMaCX2cNC%vhzHV%g6B*A00K}84Ex9u z+!s~FB_x1*X@j)`h?o^xAIw3hTF4`h+t5+EJs^C=Y4!-5FzDVkdkkEtkof$6CO{ko z_Lh1K=aw*cSWdxqso3H=VzK$#j#1On8A%9XjNwabC5aaeI*wLU7g*FX2ueQsICzlE zM*WX0%IDC43zxnfP0#YUI4yMEGXU9(nJ8qFH5ly)ePsS4TG~&r;J{YsN!#MIKALir zH)BXEFOLSez~**rh4kY9A;?7aY7|UtJUex}b8&i*0<8*GG`t0sVi#<^*5C%%?z1Fx z6=S>9TWGr^&FNVeGd89IxL*|TeE&-IVsUi2v_?}oHU=p6Y&}Tq`>VUu(1Ro_6 z1rehLHLd$ALoq_0f+#Yfo?jse!K~YSOEd0(Xh;*$3Opg2$Chg1ZCRnk6mLC8a12By zp+|=M2gcg3*ip=DndWBe!VdBl>HDiOtM{D)HTWd9x@_81P+2USPwX&?ci{9Ra( z0|9p0FDug61j4N+MGJsNKYxpVDeQI~glC{8Z`IU5M{Uz)1{ez{;_u)0$QP0!mogbe z3lb9aTQNz=8;>9@3ituw0y)fbI1Xklz&j(z;ez)Is5me%klW*&`$3TJ!P+Q@3!o>_ z1R`_35IFQ2$$fY4;ltPB;u!Ew{;cKKEh2x0m9@;f$q{(U>n4ZmosEMQWsm_07&duY zFXVOp(ansLxXNLpQQfFDgG-m02xv`9MZAtAfv zGzobME(*}nd9eSEPfh^(;zGSDRC)H^&`@ilDH>kd=In={wsn+`-rmUNha@#Hh31N7 zgytcLT0KUC2!+t+wa=`qzAU)G*N_QTh~u)l9dCCnDz+N2v%X)(LxGI6w3-^xEN^Yu z|IL1^0ihC<=mxzo!B(#isLNB?TmmkK8F&tg3`6)+Ze2b2v6$ogQ&c$QyxrJblg|MJ z?CkB?CjNMv2DQlT>f(rm&!Jl&*UUrp7&a0)6k&R0WdZpm!Fla#dYs_0nknvTtiJ%S z1-L>xvQ@$(2P^Oq3yWOu-TR}}5{`dhRcF|Y18h`q@&xWTl9g9f(B0ns2tpwUY5ysU z*YX^&zWm3{s3^Iis#@*t?#e3o67x;9gN+CbC%VS~7Vyii2Mqb;y^W2+*RNl{g^P)< zel`jK21Gp3z34@NN8%FV9lgB{?#qWGI+9*Omn&hxp1Snc-S3?oDSwk6+w}5SRZT1Q7sNIztd&gC!jpfYFWJ_T4UK30W<0G zPk9=#4zYLv+enCr7kFH_{4TTX6F8cb*HHz6!f8g(6~*Kzv$wbR1Z;H>^ae{zl^r%G z#bCmK@j5yh1(D(+_%lBo($&qU34D&Bz&KF17oxOmwr5}b{%I@%1P2OEqEGxbQPgHL zIu1d5+7{Pv`E>m?R8vwEeUT54e>f&^2bCcsOI+F_bgd~p8S1`Dl>-AnTr2`^6fjoi zcCTf(sHN+4L-B{Kpfvug1|^fGwzlCEdRm4C-9jtDdH%w}LO2f%EyJ8!t1~nPS{j=2 zQhydx8z8ulPHX%Xl~(DhtPit2TRGoh!!C+pDJ{<8y1GCkgkBY+N7H4<>r3=X)N;qn zN{PY_Zrr>%kZwsn?XhM~B^mFPOan{U=D1&n*U_5vc@GpBWOxb^%e`C+z9F_%TNNl9h;l;_n2GHLDxx$he{ZZI22 z4hyXAdK^{F6uO<*K=5{+_eJa6Khk}{TK{)ca95#8osP>=#D4DdTRH_30z!jX>gk?W zm-a*>^zW$o8;5O!LPH^7l`^yffuL9EEA8FAl%=npaoJU0gQc2Aat~_9W^r;{8)yEI zbt_Cp=>%>u3kybwScQX5sw@0>L^qpn8B+YWZ(%(W5+aAl0qCmZs^gH9(|{G7;H2G+ z+8xgl{+FWTej57Cn@IM99IW7r)Na1L>A7*kgoP5-{0bS_Ysz?OKYlRJMqcyr@hO*) z&FuW|+~hRds9snBt%CfKF!w>7%O7Ifv%HTw9kt^6sqG4nj`mXSzS1W0S*_{=qUM#@t{nJM7 znPcaou~qqYd53XjXk-2R+#i zG3%I%qu1KptnT3cPExX4e{>9R{=#>EvaJ0P7O?a4f3D|gRB3XSYAp7YP3LUay1`~L zAxcW0vT2X(L7U{{e_V_k{uxmFA=z_&ugF26Rfwd6qz4J z^SJ$G1~Rk+#=!b?P26^Ym50Fk=$N?!w41D~uTfF2q2!{~d;pnmYhxTCA=C!A(Rd_> zFkd>HZ4<&?nQ3GaFk$!{HXpH2>~!WA(?9%XY;3%|&nqr2&TX}gLKs8%(_|oUzj#F@ zDEGagJ}7Q-3O7>*0$Ow%U~G?=z2HCIVdwK>>(W#U)Y&Fak2miXC`m1sA!=thWvH2! zC_xQ(0KxR6EIKf{Vfe0FELD(O;q)jg9CVI2z<_L++F!A-)Y{EQZv~$n@CrcBH`uDJ zfr_nGV%7q-{cT8CfLaNYYgB+9kv9^Zmc!ib3KM0ZhV8@WBi_3o2!A~b2>5dg ze4IPBUt$8bZ$Vvon)(#34^XVuqZR@v<u;?@F2-CM<&x3MXhX+9@6K8E-C{yn9T z#n~Ox!ia!?TRF^#}vBW9Br0*P$0E);uqJ{FIHE}%R;l2c zNvHit1gHh{m>i0VQ~6zWOs;UGP}S6Cggu7=!v3kw(gHrd!mC$`3dmeNhk|0wIwTZ4 zIpa36h85+vksJ=db+2LkQY*0~QoMme#I9IHXYa7~JEXr~7El6_e&Q3Ir49V&H(x2r za@<#xA5g%SvK3HJd^NOs*~RFS5!>T&(6~9M%|QJtGyFeU06Mxx-9kKkeDJH|`R%{L zse%PXL&=4t&CH(R_=K? z*kl3Z@*f~dQ$BrqO`9_gcE3=B@$bI*Usg#%pRz=)O!8@#DvZRnKyJ;Po zvUe)@@;M%%?~`WqYhPLhP(Jo0afi0+-k^AVy{J6+hA4vh8Dn$(o6k4yeU%;*s~pmp z+9G!zG+22?>GNY^W+`5fTEjkjGk;ZinCnPMu`CvpZw0#hYPkG$d9PV64U7m>|u3Ly)~WB2A4nZ9#nh zL_e#`b3Jw)7xWp~M5SzA3|44@;Pc zsIyg>>+XXGt$$jAScpPE%KAREirl_=O{L0!p)Hg&1r#aB@qPM|LRa=3K0}Zp67wNr zlFEGm7%Ej3xhVPg6?woz6d@C8(y0H-oe3Hnaj*CV1mF=QeH6GYic` z_K4mNZ!2V;;-NdiPEkTO7py);=LaA}K=%~|DPekg8cErMf+|2=Qmu94fxpu^*%s}n*|`NpK1*H`uggXcAs{4Z6FSe)Hf{3Qr>26@9s7l z6koFfj$_+K>IiB^AE>uZz`LE{N43;UHQbizrK=sitAk=l>Ob5{mo=vUY?YRgw$-F$ z7wl$Yz05lZQGccMmbW?$3ObMZAIE14X|$MeB3HK68>^tTYE3Hy!C>>btrtfi0{FN-C=BR$G>v`e4cYU0ej8_(OyCEUX~O1b#xV zV;?7^)$E0~#37nL%11f#O3xAO9&`okt15Sg_3#k1EC z6Y2yd$)s7HqmK|F-3Cwug@D`W5xB|E7Y=HeE_ZH%KMJoE1Es2GQ>7R3wJ*HUSk~$c zSX{b|z~SvoYVbB;cQ}YJ?rxWRLdy{eTdWelI#Yy0R11%kG$br6Y@RBD4)$U%6!!_v z!*D~575B1<>Q=Y1EgY_aR{K0#5>*?tU;ADC1 z`xByEGznkdj~_pFdRA)K6BH*Wf2`Tsg6%_v7l;iMn0i3CTVPi=ky}6o2f3BUzDyXa z;UNil5XjMLR610w*ej4^<3&(e(cS4XZwwg3zoN+v0X{k$xQpS?yHpA91A9og|G>u~EK&W~GB^3f7!4J8n)A ztr>~OoFY|Doy_{anJ_4KxCm)w9*-@`P0*yRf$K?9h3owWzupPtARedfN8pdgu&r%P zDINI>oqqs)2jft7_73i8g`EQ=AsR=UQ?QsFtKy=3P?kpLkii7l$1bc{wu9jhiW0Rp{9={&9nU!4gg`w4r07RQarS8l>? zA;#WlxQ!OY;Ry-7pn9Hkb$RM+PFCc|sP+YXd1CVI|7z_zgPKa%wPkhJ0-}fo5Nvdi zvJ?qTL{JeaBE6~E1*C)~y;%?y2nZOE5?H#FfT2f7umRGW5IQP^l2D|C5(K{YxI44= zo4Ip;-CxlVl9Q8@w>%Aki}f{^55M}jjz22!yUpds`OQIR1Hky_Gs@-`4I3)MDWQa0^C>6Cd%}kDWk5=O>8C+(RJxPuZZRaI;qll)xdQS zH~3C(scL~o02-D3XKrJ%X^A>UJE0CXIX!~g*6Gb%PD^|4NTLdhNr3w;1P*=2&Yf^(4Q6t)p=GYF zvYsc!UIXx1SW+^lwBQ9SreWb>$CZ7g!phvAmgJ?a&o4yb6b49isd1%&5jT{|#+c+t zjEd`*x7=GpAZW?#@MRkc9f2zt)mGsN#_HDJy{3dZ*C6^}a*5$U_doI)L|8~n50s3HeE8}2SUtX;=!xh@U{u(7qVf#{=%!pf^# zkJ~??=y!RqPo4@XU`+-^V25G_Feh3j;pr?N+XY<=I~46Po3?txnP;%5Kuvhw{@iv% zJ#Rt(wzzc6nuZ`0lz^2D?_?GKxaVIuf_|S;5H@}c?M7KySy)u`w2~4JLF<~S=}X4) zbbkh%t(U5SDEJV>{jFygI4_n`>iopv!uxa{uikwBWt^Iw2_dbywN;B?U}#|Q&U+;I zvULz2UddB%#o?S_$+L%yT~Lp2@`>I>Jzkz_Oh1^#?O(4qST7mR?o zazu)XpF5LoRF97*QQd(EnW&nheE9HTCy)sjFKSq>BwG0&<~!I5Or;WjqQFErghQhH z1z%GOYj-pqo25ng3XvDdTjP-QfJ{X&O(7hffq^>IOq#cGzgUfyPS%YyQ?9**M>!7i zbrhh;_pI&9%y;bA38m~ib6x=Wyx2aN)pi423lk?qTtsPSUCijY8RQ>BrbSuF))r+G z!Q^c*W4uXMXYTG&dz-57A*|xR^wHGztnAst`Q6%&vvz>5++Nma-G`H#+uS!6UmMn_ z@i;08fT3hEjR_E|Mltsq+7MLl)fls8^IiHdkT? z<7axeY=19pZ2bJj6lDK!yf^wJ1?HmPDul2|P|*K=L!BIY314UzOum5@uKEXv0t(Po3#w_H9*XFaxOyUyq{%d!*VUWSaB zLp(f9!(@LmNPgkQW}7kg?A?C{c*}F%&0NRBOlyKvAX$g<_0N6#_FWx_*Rr)0Oi4-c zEFa45y>H>o*E1YvVO7IHP!E-^y^av6#)Xy$)}rY8Wt(BPj$89U>0M4Gujvavr2=4} zJ1Zj6FtxP0>T?H;M%MN1tFYc8>k&|&KzqgjnCk&TOz2yH{nPY zmovY?EDHW}gc1lF?AEvaPnZc7Me2Pt+||B8)`afa%iDy{VfMkHbm3y}#6&qO|YrYVW-AMswF7 zM7bb>6om@P)w-$ua2AgRt+-kTk9xvJ1XoN@IT%zZrGdI=aZyqC&mOST4{xpyRF`bv zQ8aqE!pW2O)s&Zh<=g1Wh~QCRzYiQ)vCEw5@Q;Bc@UVV2OI_8qjwkF-HXwrmLg}{&djUTrLzL(Y$!U7 ztQS0CImE!B_Mp47n@;wMryP=`14FwermLCi$07vX7ujSYM9eYNRx1!=!k!P8idpd= zdrX4gXv0LTI;{Hf<3}kNv5_I_%ezMije)69!ehjxci`%iVG&Z>T01}-y<7Y8%ZR$Dd5}k(RvLJ~@ ziQSIdUiSqZA9i$l)dnF)kk=4Wxd+-K_<+A7>YclNq2=8$M_5|&R*ej_z<%FH4Ez=J zHy#C4z+Woo-8|{l(LUUHBlfcLl{Sf0Y77fq)$mIm4N}?m(P3eGK|=}K`*eR0E})2YNMteu&j*C%8(SYUni(@)2l9*OeSc8M@ zpuN^fl+CS^?yRv11`;GkH{}~tDZ9-dYcFs(;He*&6UO`OQnM;w^-kTptT!4=1<#jE zoVeM0po-y2%$>e%ibK(O$mM! z*+I@Y9|sXakeJf3PEUX>CsydXARIK5L8{rxKFR90z;f5KUN9jcWAR(KBx)$GKe3nq zU@2gJkAZsc5r$w9MbCx9JPJ+#f`U@@+e;f8<+2JIu-2H@o1x3sJXY*9n)Y7hS}y1ca)~*x9H1!ZaP4UbJqlaSqa#T zY8#M}Ib}XFdNpb!ljr7GBHsQCxSR#xB|iczOJ$f510M56btA|h*xY|?{P1;u7b{nk zFH&O}&-sn28!D|?CGRvT6-rhqsFPLX3wE<;cb@L0e3+-OD2NRXNV(#gkP8?@Z8$G> z@@KfvV9Jk=Q9m2+&+uGK(N(O~Lg!ddB$!e|?B%ekNT`Y#n0w z9Qf}W$0bbj66aLKY4(o&ALfo*+a-?WZ^Q(Ujx@wOy2TaI6G3_b`D<0st}A^(R8Cv6 zpr|i&^IfG_hL1Is$-XEOUC<}-{PP>p0VKh@5Znqsx$^S?a&iP>$yIl&XaC-FwXK!y zpWlYZ7(yUYo{jR6LiGij`B|Gn%>`Owrrkv7-~UAJ$<@SK-M)Pa=ocYS%Sb^8n!TG8 zklctK90t!)AFCFEn!J3ROU*|4unfpQ&``4gc@Py9g&40peZ_wQsV{B(f$HHmo4GxI)ZJW?+qmz<=5V7i)U8eVI>@Oqze1QsQSKMedp_J*bgU*o?xxOzS)b=6-tI~6X{Vj5Ed7)9Ch zMR|O++28vei`)d(_lg-CFYiEvNK&_V20=YK*A5C1VGhDXl~X4 zBo^vobtOv^Mv26jY^}xaxc)9;=WuC70I3l<$rhBnn`%Pzq@H$4k#%{RN1Kt{RFyQB zX6_;iLIkt^%-a9-_=WeMe*vk<)Jr=@XKD9>n7v$@w}-2Jn}Y)6;b{<8i+FI5 zVpzJqsp+T0GDn}_x%Gg1-_NiI2fT!MG=R}P#+y&6o=Vxtf8xvc`X{8Vij~FYuD0`p zIpqBpEqfJ|);1X}bPq>*G?;YR$k!qZJ#<^@yr2EJhTI*D{fJ4Mv&MwAe}J53$y{B4 zH?>OV`pdBEM1&l;7B4O^;lK{{6lf?wy%RVTwkO>g-4t0_gsyta&meHHTN%ANC9bYB??=^?T}&?*uKW&n|{M|q-7jMia4WcOAwTB|B!0(T|d`EX0h zb^e>Cpw6m5oU@BkQHFzgAk!pj=w}xoqOcqr`lWn^_(6{#8c?oh&sy%J@)_X{LimA)*B>EFbM@)iTQ2%L40cPPwBP zepF(-jB1VU9r}=ralru;FKf;Q;eh~CLLq@qb!^HmrO>b~@2E*M)E6)_fH235Y%3Rb zJq?1Pz=>gCY#jRJ$*&IBM1gDZfAt>jDYR$;0Ug5AIFxbccQ?WzPYq}I8+P7wq4eMI zS2FI;SU!@U&pY9qMW*G4m3X8tL)!8>g|)y2SE4p9XgNmZ^x5YZ$VX{)?@_xt^)fk! zR9Ka88@Sc4fO1n`LEuI%fTb zWD{=VPr)n=Iyy3GO&0ti@9a-2jI^U{j>^Lt0_4i#xtv9&Utk8KxvA+4@S=dBgZNM+ zo+9O!UzQWd#mU)apTLTIQiq9q^^IO1CRS^qlnOkV^Wm!lcZ=2>8c98$1LT;49s&^I zP!PrpHD=LFY|4G`>J__)9@JLb`tOcCDa%HNk-L7Y?X7`76|jcGNdIWh#q*r>Q_#7I(4uenRW z%~>q||7i9zySb7qpL+`Y`}oh9b?1EVx;xgN!kqs1NgbAWZo+)>o5{@$o|}nFn(Z*4 zgoyq3Wb)7d40rxQC*N-j_eCC3Ww7&DM0WW-5@31-O}CN|KfdT=9>ST zneBz>KAhNVul3x|9g7e}c?lFmd_)KYf+8g;rUZdJy8~a&(C6Tc)EMD0`1ZnHQqu_n zLG5_@dKOEEN&rsMIlt3z7Bg`&as9V??+qsd7S{pby@shrGW^i&bG_bd~ zwlFeydOTR|-Fxsf+^46hSU6joK;9W!IFs6#IGHnnpJaIYheeWL1_VM1krESD`Ixe| z;HINIH3vCzl6cuh{EW6dMbfmJmrU2LQ4 zqFty~hR8UNh#0!}hJq57bxEj1PFYgK7_R>`HZncA!VaonJ19_xBMLo#TtbG0K>m7P zUgj)lJU$LESNxi~kOUvHvObiHhf+k69K*ts68wMmIjlDXGE9bk_6+h?^r`_fjEn6d# zFiFIj%Y3ZR%1(|Kx3OyzX8zfJ*xF%V1B`zz5uZa9^WjXo*(>@PANZgR6(oJ%Q{9ce z>IlV4JCb+oW-y|s9^2G^;9DN6P32YQv%8qItJkZ?iT^+_%^9|gaD&jJdyG*|@r{Lt z5t6RYr`kiXxCcGc+9~D^CX`_4zze`bO+3@-F`M4vH8Ksb}m8J)~DM-HX^!DeB zP-M+l89(BfZ!qH`E;T(ITwj<+z)y6xY>k^!^TdVuX5}&5;_485GfIMdv(ZxZ5NObm zM)V%`Gm}=5qLNl-g2_V9UBk4Zu+2jMQ8>!YKZDaDt*3;Xq!RQ^Hs~Aj_HNG><-xAv zRYAwk?`E%m#)OKo;=kF@_;O}G+9rLENG#{gm2p4U=q_U`j3u>07En~wAk{$*@84|R zI-c>+{I1h3BE9ycIt5v(Ba1-2Spw>PeBS%Df8Gkm?LAM8T@Go$jn9>8Q(S&q!v!G$ z&K;S*aOB)IL8^Q*i#KwRfdilK?dlL_fyU9#423_amFpVE*M2`*4)-Ow+g6d#MLv5s ziirN1nbQoTif+7%zDJPPZ;GR}n=f@c{AEX8@9fY$_(rSh<~F|cK^5AAdY5 z5USyy*YwXN@T#4{Zo3C)J1VW;1UUfg-@?{=8riqbSme&J1n=eEG!F@8%Sek716K|TI@&s3f1i% z>^`)#!rZgz^WPtDw%DgAp6^wyFLE4SA}3{Q3bza)=oip>oX$S@J`{ZqvhFGRa=tqi zaQm_0AXFQ@iktD=$Kx=~cBwe6xU|&mQg1ekY7VQd7GAhTO>u&msZ{KzM0|NToyRXL zuatdRoB1Aj7}zQ=2bZ{_jli$^gPmJUr|)fSTr>mIMzP;^u{x~eo$P;^sVL?t@rS=5 z3)mQn{>~5n3~Nd}#9k(v z@+1FZ$g7skwK&tJL5#_h1o#aPS&D)gDw(+b#U{7uqra8H*H)@!BRWqKVUWn&ZZ+}u`L=y%yIq4Rr4_V1viTGulq22WV4oZeOX{uK?DW9-oO6k>s?*Q+My z;ww}&tR?pe!kO@o;6cnm};942KakCQ3f2=s!D10m9wZuD}5)yHrICtV8 zM=Wy(^%=7ww=*MW6Vux0kVkE8C$i6rLk*x<@!u}*?>jj_Q*J4R3|Kw9WM#nF>;NiBJn{%#FD~jeZ^KJ z=M1GHevZcK5*dz=zGb~;yR~En7VD+Y@J`CMMSz@k6Yx6K850GgL1d3`wxZesIfe_+Z*S?H8p*idae&| zhtLF%Cb&L49Id`N_RV!;=NauH5OUpG*4VdY;`1yN^K&x(VqM9x(Qs2AQ6Xkcks)Qwe`L!KDUFxk8x|;e0Qzc&Qm3>laozig!RAy> z@8Nb_o9>NeF~zRlc~qJ;J!HSOf-8oXsk^QnVf}cYAL$!0#^H0%-apRuA!vYbYNoS9 zT(QP!YNWqEB{-5*#4O@)Vr-ye`oq+L5eG*V{#O#RfL{-f$;XG9^d?Z94a;_db#=?k zp@l1gn#Mt`uX9o?xj{sqP?sO}SI?Ea?*5Pm{7{k_EF3TBeU7i2ZnFJ7{Z=FGovOn* zu4FNdyK<85w_6Q*>|P{x>vY;8O9C<#wUdIPD^(i?w07p8w9I_Gxun$~^xocD&Gu6C z5K9(hvz=u7J${t0^gA4MKl7!19r4JV&n-`Or!>jP^y@s)ay-;kbrqEp?`f;l6pOpq zS!;gv4S6fs9a6SX zPsK18z*~krwjOoVkT#yW_29R|2oMO-b72w)#2NZ;8_(+;wdP>dRi)I|6+vQ^6ZZ^~ zVY00_ECKB-iLg25q@$xHpw6YttNbVdK3v_W-;kW`daSb-S^EdP9p#40xDjv0OpPFr zt=um&7zL)J&U9Nb#&i2j5%#oO%9n9U^Pg(bAj8-Th&M?j+eom_JBPm-;7UawUI;&v zzy)Pk9vv3zV4dKJOw49!3#U`E&n}I7UZ&-mC~?()?_GRwb}dIcI?Wj|$G-@qNcsJO zuH14%h}RebN(9Q3eeCK}S; z2J~M4{1z4(dOB8qz&owU$IEN^@%GuZ!9&O^8r!AjCYw3VXv+LZB$eTG79;V;hkG1G zorLuC(gFf@-4#zbsLqo@%wfy(l5>*4{TFF7DY^l0BwnPH2?gsuC68~Wm{%Bjm zE+nCtrmL(>5hcmaKi$QQ+|H8nTLK|+vC2yQy+c%XHbuBNh1ARTU-K#Rpw3Y4$!pZw zlcfr)k3}Tb&D1$<`gOtfDX*=|^hxhx#pP*~(_=Y}jg8SLq&1RSwpQ2Ln3|eK5)00j z8FeL;8L3o_nNLAJp%z4CwD5aepKXr?qY`K_jW&6lTka=SaoNs)lcc=AIiLIG;9pnA zBl5+jJwgjN_7|P7f`T15Ka?)CRAm+4-0X7~aV6+|Lkfz7g^tcVQ?SpnW1VOas%Dc% z6?k-aUr%5s&yDhBPoH`zqfTSAX2;{-Q;tYPW2VzZ%tnv40jYHX?rFZ?g(cPU)Ug)a z5@MZRgze{N=ee?p(H}`!I631GZ@`LMXmA6={73u`lng#KGdH!$YEnLt)dUQ+^Ud5R zI;PU*EW?Ai0qu>!R03YM?;g{o`Yk^9H*Xm74gS5(tM#3oS*~A)5BImCA|jY$Ee|)l zs)cGckxPu2h%L7V4IEaJ*7H{v;)hh7RBi{0JWe;V8XD7iuY{UhZYLAR%+$n6uU6Yg zpqWjcm((;gBs?A+9UaEo(K!T@c3<=`7Nl<{za?#_78Dc+G2LCCx$q30oZUM+OQA5_ zUo?gG6Wp!fH2QTdX!JAc*8if{yn(;LAH*=g6~9{zV`|1_Hy@6sl0im6k&0e(tdoc& z_CEUi%)j+5^!;Pu%IfOraxlrkQj71!-i%6UW8+O|Xr1rl{Uw-oDzWOZCAn6Rw+Mj? z3Vm56c}$r0yX)`Su5xm6+JjMAoUfzH%F0H0?ss-}GM)+NUn=F(4vnUPih&p?B7q=r z?K;J%t8dmK4)q>>^uHH6aC2}FhQ4Q5YIbU1aK+37C4uVU`%l_S(Bp88g~I$9Eauod z;m>2=>{)W>@+m6rr!hw^uilCoY4^C;+1}o^u(j1YWZ%mUj>PwQK~BZfIk+evnJJMy zf{P6A->Ok=98yu?q@scuEX>|dtXORwoxQ`u$G@#G%F4>_ z*Fk3fSabPP^it9M#0uaj%erwLcSeDjZ$5{C*)1N+V++sU-RAO<9~~V%sTdNRt9D5? zTxkzRqw!*G9heBWX+M~((w346;qMzC$0QSzgLc;hijc)7$H(KalXeeI4#pYHwHHbV z3n!;xQ@>E!Rb7xKj*7-8ZW{O+xMN^7RaH$snE%~d=`UMnK2MZ8 znCR0O&|UAC&b%bM7~wYAk5hQn37Ytk2oLd-w?`}c?OpYO%R#lcnBOmaXnbVtrc zdyW2lbx%FldaxhckSjD&ciWyfxvM>X_N8ylN}56s^uCmP*+eSN_! zHD-l@fx#N%Xrv!n>xp4wV^dXC(XRokGEYAB=6p(DS4W4Qfx*bgh)KV>$ejHRAFuA z@>Bx=Q;Q@Q@=Ncm9kCKYW#9g-k*_IZ6Lo04Y$cN$ivsD+Ed>RLq6r1GhaTiOKy`yz z2-UPSHL|v`5zX~Io|~x1$r)WtW4yoj{2mtvhPt~Y9_V+6&j8X|G8S8Z_;7UGMKX4d z?8EPs)?++7J6oB`A!Jjg5W({2t}(JTxo}Tpl425!nh1 zWRa~NYkZuknhe@D@^qBFy9rGo8X@0@fNo^8IKy|PBcyu!H7PUXAPyB`9_;*jOB54y zB@0^RFCY+JR6jw`5uihFz*UNpZovS=`J90U9uNywJFLw4zJ_Uo2KtOKd_8FNbK#b% zUqu?+K}Nmip5~BGmpUDLP}Q(;vaK3y!ey1=E(gM{$BJhTB#;aS^fPUg2xh`|hZIsM z?R+2C(@R&v`T1D2V#xo6jaY@1|3)bV=WQuUe3qJ;s^8?1v*7R?;w()e{J1@qw>w$V z;C)-I`1eG7R&^U(s~m<8YXM-}Bh&m8y|2MY7tfBO%*Q?BsH30& zvMHvEuy5Z6gTYdO_i-oAc)MPc=l*U}?Yq(drTc>FL;vyu2EKYnwyqhqF~O`uajX5?<+o-YOj3 z)dtEg7$W1xf^$JlhU=jVFB(9-0ZX*x-g{tv{)tqFczJu3>NK?(mTB$gdq}ACcd?|@ z7p@d1*Gv{^#zaLKn3!N;VR5+Zs1!`MrlZ;}Hr7>Ej*pEw-Cpbi{FQ*3n3|U8)Sb*$ zSs9jbzkdCik#VrC?KzpTwRNNAM8W=CO<3oOg5b6BKoZCJ7+tJ1Xd@C561vwNCBEX8 zIjoBBOg)1@&cQ%}2QyF?YS%tF>{6LL$$n{lBp} z1Ch?=7r1}RXY$h0y`UfB)pXM;H|_x!G8mB%jxH@Pe{pUHm zur#>tXZ3=ab$+ow2h9Yt%5JXOW_vUTnrSmvy#SDHr8A70n)-BOKpXt%&G~Ls+tV^47J)NwETh<5Q!s#~c z&EA{U#l;LFule{qL5=Kr)5DH$Gt&0%*|TTa{t`7OV>$U?`SE%32?P;`iyJWmbZ#FS zVj?Fu+?y_wmzU>$xCk4@4Z_04*3#Cd2ml{hgI-NePOd4pR;Q$)!PC~3QS|{__ITds zJcaZKVgX(@wpV0p8yl{mB-k$0lLdf6a({mh+OUP71|*2N{(k{>AzW5(ue3|N0W${& z!<#pm)kug)nErNpdV0g3Ncpt+v?FZLN{Qj%>?%S-LkS59f7;N{GSvZ=Xm;b;L6!p zSyd)Z&d;f&9Kp$lcN z0K|i4h%??sPr640g6NZKpaaXPy8)9 z(xj013L4@9wcX&LAV$4LZf0i1_J~T8?r&u2-WQs-wk65QbFKae6F7@Cc1w-!r_{0u zAB>D%;o-UOO}98X!62Z5_5~|M>=li?PUARtEoU%eU&^?VN5 z>K;$+-ba7=>J?D=e!ipMmuP=g7fKLLyj|#LkRVHKHIw-qvM6LJzvjBv$829WFVJvF zDB$`;>>-~bGGP$Bt5FELj;ANePT-gUD<9weE!^U-7n8^H!4?5BENkB&_T-fjT}ig2 zh9wkl_fkP1=4?bh=co|KCvgjByeBGui1$B{682vR)hM5#Rf<-w6o7?%l1G9fD<+}- z7hd9uFF+t&OSW8%V75YD$0o<{8FqZ3RzXHYEO2Y(;DO#0!-?Vs8E{ARwF^9;*`T37 zh7BsO1foa*v?6!e6VgCMh@- zE&^^m1=O!Tytq0T9vfUEnkCm8((%nQNf6HU6n z!^^$!&%C3)Cu=XT*3u)O`kFr;2+mG`dvhWTv5!P@uzs|KcrzFE6*l zir97Q_8<}8QWZ>UpaE`>k=bC{3slrU%zJD3G0#3fW5*8{&(yLRkdFLp5p8JPZ;}W>wlkBc~ zuJ2$mDU{~O#8XpJe(79cG5S-aQRgR~osSpdYJf|PA;YL&?{%^!e#1yH9<&E)k#ka0cL01Ib){{tpv$ z>XAf3rUnL4-@g4~wp{K}rorN)eNC^JvWQ2-fAd!X!AzoG97;t)b9;5A*wrXC75&h7 zMI-W>oSdAI(e~l)+EP4A7dMECiVC=4sqM?(D7TlF9RO6mctx!!>w?7nhX6>S%>V4uBq+RTr{hh`=u;O=aEDO4-IISFIR&nUH|oDDRX z26)%?6;Bi$Rv0~oS`HX~N8jHl|IDy6Gn2r|9@_@sBA@5BJ2|kl^f;cc3`&lywDfGf z3!UmqNJihFxm{r$3X_||tnRsdx&GBjjHzI8pW3Eg&gcNd27 zLlibVP#W{kBSn1e7JQe|A>uJeBu9 z5z*E8Xp4Z$7ECdbGU6f(9i(!U{Mz#}WlZrXE$hNI5C&i&dQE)WjugL?jvG*ZQXoEsPKyXemQX(|?2(+}Lv$M0JqN4fv`RM3q zsTk^eP+cqwu5NF~%qszF^nJMAwBeM8y!E7x`?4;iqLV`|cpe#grI050o<7%SP$JuZ z<%g9Nn3y|o>wuR7R%vQ%{6#FQva&Lf%}i-KGc%J(uQ6lMiTRF*5fp6Ow5TXD->uzU zndmjp>~@8d&?tP>Bi2=UIxw5~JwS`JBax*GsuG@nN2OtJN60HQV*a1aYR1NEeeq2G zetudG#sC*Y@AT1#1*cPgX|t>deY|=*|0xMRx!Kff_RNAiLLr?~fQF{4vy+OJHdLDA z1vp1iZ7vxh)L0u9-4_A__W|}KLzzb`_E+h3WB_wti;U*p+M!zMx^s_pY-e#AV zNSp)68uvV24Im>?7M;Y+;b)*M&k}x>l?Z$Zt=D^{D2|Ofvt$-{_OlLX)W~dit%y!{6ld z`n1ArT^F{%tJl9>h-y}RU9_QEqttbW??Y24-$~Ue?F7f+7up-Dwo_kTJ{o6KX!W13 zXtmTGE1hFv*IPtiEG;dAzadTeGE;Hdqp4-k$HvY~UrVh(S(l6VpLb7=Hvmd2pk4IX zg*sv zvsbQEUPLD@OU>R6giBx=aTzQT3OXkA0ysbq5xaK322_BU%XNO4BDkrs@jIuIx_Yot zZGOImiOKpLrRFLZR$Zdw>EBlWNMZq2PEJ&0t~Ad3v**db>_ADJ zs8m){Q`6G2G&cX?KE-9XP=s?ZSF{U0%zU%=?c0^lFd+!G3ym%}5?bb(eNd>3|?@R(Sh5Nj?3RD{e-7e<)6WM00Igz1edypzsP5|>_QF}n|3!ga@no^{{9?{N@Q6X z=;!y`j}!=%K-%Zf%H9P8q|U{+A4mf{cs|m>_!*XqYp!HY8gze*L`; z+XU<-mCvnY^!dAY@5Tc>vkTlOUWRmZZxK-w>hb%Qx%5rGTVhm7>MJ)^Rku3BssM#N zu8B?4%9#Njx~6W$%+9)YdOfhGCHM(In0IdThALR{@5AH{aq;j1`=Rc4S7oE~V|nto z*Vh))Dp)n4ls({rER?Rm^nU;TJ?n-*A(2zrU%Hq&M7QS<1%-HN?VpIGsq4?;pa1g^5|DUBd{t1&ca8HZTr6Jm)Wf zvI9`+PV|$K>O3uATA+(;p3Vu2k7LqqK4@@RSZFAuce;*tL$e!buoW&IsRFw8Yz4a| z9|OZc&rCjCgU|Iz4ss7JvUo)h6k^_$#Fr;zev|&RvgqyQ z-F&lC2%2Q`>C~z!j-X#{St941J1*Xb4+5QMYWrH$F`YJHd_H&FBIff~4$I5SD#mv5 zQz$OGv*B7|b8FZT$bRVEpRIj?Es6m8eg?-=N4V$01ZO5D7Jj#6ZQmBIFbSE8j*_*RmAazF@YaMylK<})0c6F5wpL|U9Kc58ww4F}TQ$OSh&dju ze{)pk`)nGlIgR%Y7!j+Slbpp1Q5*4oAJgmAvQg5Uz$+?Y{pRbBYS!`eqWZwo`Z&t~z1fEZ0nOANFh0bfriIaqZpfA-rD1KK z_A2R?)zTcg!e8#7SD>|p4Kf%P534-f*oliv%Prn1=;-Qd`S?I?>!}k~Gf!AyIoQ$IEqz8(_5}BOxir7FubUPF@|PHo(fGb4Ph_RlUPkIn#r`dHjtL zWW@cMA^;jqYC$RdlFw})849&`bBokLe-rm*8<{t_T^Q=XO$gK~v*G;jBtBP}ZikE2 z)z!}M0$faPfBNx=iHS=}N`UytPaH`bgwA``mkAtIZazK$k~iyx@hZGh6u_*wg*|(} z7dV(ffy|&?-QV8cJ~!t%v?u^2%UK{pF4n0UoqIYw*9&4n_$FcW0Mi#ZoTcxx#d}D| z1JpW;W`7y@H)6QwNh8c0<-f%R+UN_8jRjBFzA@GP>?Gj`RATSzll35@pmf&)i&; z@8R-9cCdQndS5(Jpa^ZMP5WYnnS#Pn8X;$}$Iq*lMqZKEEG#3XHR&2E)D!SrXmqc5=UUxqu(dQ+%^odIVIg$zcx>7`09p@0 zk26WyC|iw|&%$Q*bvgm)@qO!#b;!K_Nw{_HryH?!>cEM`b^fD1){?|yWD1-pEiL@u zcFhXY@J5Z%i61~+HZwB=T|2j>FlKD?;jQ#f10vK<7&G3~ zgT(~_KE7o6Jl~^M1Yo8YHZ<@B832;+eS0y`-TfBIg8Q|;p4VL$-ajfTDwA7^yldSN zEWLb9J8&i@W-MQsCO}b64kdY@q^L*?3Ro`@xEL_HP_j-vP{1Ncgbp?~f}Y|P`K6^y z6BbPeKwSZ@x0`#}@oHCIPEP)|eAMU9!X_qE;o>oelDfJ?96?~cCL|^GUaCxx?h0Um zbp-+tdy~ZkBCi1|&&@TA>=eMi!9)b0=FYFD?3?qJZ!m>tb#AQ2pdQS}yYA~`PTO9O z)SSwdHK~}T7OG^F!zdXu{D0##z;{vrTE*6ICSXEXWM|uX={^@TW)u<;Vu&of84AA@ z5PWy$>)1q|yiCC1*R~N}qAB`*1GILmIVCP7T2{63Us-;lIVt1u?=lP>9bLe;x1{!m z2M@HnSg{ZE`-%Da`HHWdo$bHdx$TdhyIkz%3iub(03RJ#)vX_ZPS2%Y)7S`7vIb^m zG%rK`Lnm0_W{i?V7r_ncF=lnwMQ;D0l<&3pc(Blbgu~eA`{?uT9h}G)Qs~a>Tmy!k z%;sjn^X&pXCRyr=tSk`)1vD}hZEcW)%s)A=FH{Gnkt`|tPcXW%u@kFZk@*RQ8m7S0 z0fn1@)7sqm+j)`+Ya)mjjnlWRBybd!T>Yx8o$l)^tgXEw@{M`h2X5VBwgj4Gaww-G zo9W;`{FjQ2O}Y6=y4qD4w)?!DN)a3>o51{eHjUY!Evj8&2kSL0Z8QlnkS|{6_L1=N z@L*v-+!Bk*&2ol@UO~yIV>Gq3=@hs)INm|ulW?!ioor`c3=Iw*07-^CN|HRP+nAMB zo-6=AZAw)(5h#d2e*wO2r{Qrjm)%;G3XqHP5T|wn+n2j>{xo`BE2+9!b873+gHP42 zkJs7PN5`Ssvz-n!K(IDh`S=<}geN^|r>$MpCg)bUJ5>b=3JM)A4|MJ9>;^93DoIZ8 z2rSFFczHd1*6#4w%#Pge{<5?J)d~?ASqz$!m$!RzChz3$V_{*Tq%>M&XZpTkf4QQq zRIdp%egztTW@mY6Xo6?e?mPh!#0mBH_Li5GMVY<1XDvAJ5_JLK2PAv&WRc7xFxLUA z_%W(UkIfO7g_%CY1yoLE=I+5k)E6%-D&vQThf7-?>J6A;z*OgRv-Np89zZ=%QB7yJ zP!bap1I7wC#Kby&NX4)(wJx^@lknxPO^5avi%UoV;iLASYo(S;Vh4rF@1FxyP!28K zaB%Y@aYw#0xjrv`CDU<|PNR@sq*E8&wR-$`-L-id6BCop@13O~ix7Xt&b37%pKK5jrP!8ie9h^s$| z-@SZA!cNt{=u(9q{50@z0IGI%<=HJYpH#qs8y=mW4rJ?|A;DYOQ}1W{5>0HC|6R_3 z$ggp_$@>EO1XSShU}|Y#JeHgEfi{^k-LJH;P`lcB224+&D#njB&)1t+xyp0K5(9_f zX51oRxcfatJcG9QKo4h1Lmn|8W1hey)?rki!1Qf*R-M}qUP%#570=@|XUDHPCibn> ztaDrkxfWovEUqvJd7QoG=B~BSU%=;cEvl)xJX!D4_EO2HA`x^xFBnv@HpTi!@-vpi9P?t`Xtk6BqWMuzzZW_)=U470?r<`O^FDxC;q~ z!8%#~vwX;xr(^iy^(W5l53qKAz5(Ot-0(i2e+CV zWCsJDf~xNL=dRUM-dnSc!lGrPfD8E_cnse=P?DFdLFOl0A`<9D{PO~!0)r@+_M7KV z*I7fB_S*rO1`31_*+it8@-b6u+o~4A;jsT|}&qxr16C z-&a*$-sW%z);fK>o|4S2Ct6&XJrYd=(bOQfGM6odl#2!cM^nK*xA@t?YX%lxM=Xl$6Eb-ZX0h^*`5p;?qkluSCmppEk@B^ zw{s4zuHsM(*jB?bkMkWYeEiuaPq%ZM68#qNLW@&VH5Q_V!+0t!at)7|5Uou1t>oln zWrFqf^~1?op_-xMk`hKA!rm-o}ZdT?j1BzO3h^HlS4y8IANWj1pyQR)c+H^ zmivwM^_<*+#>Pg_i?d%BL0p!kJ5eCBLaJ^&|N2$a4T~_kf|@GrrLB_nScS@&m~?c# zpc+wqVJ%FWGXP5i3eSzK7y z*VE&0c(7QZJ_JNNd;&c1XMJ=1$u}PxtAH~r;hm212{TuJ3NF|`MfLx}N}*EHpFE^o`6SF|{=ut03@3wpG4j&_Z;z}0E1rS18!f#_7R zc3x?zT~E0fbY^yzJV3fnTEE!~4+KtDZ&1oK?phH@tQQ++=GzF#jC;!I8R%joMUFwt zG!K8-o?C?in)&D763 z_KjIRSxPTn7?ynmsZct#l8oHn0U`$0)_Xm#XfQ-T=m9{&clo>un`tQ7j<5RgwtN-&APB!@_RYhnaL3-MWX#0Ck<5nv#I(KHlCGs1^c)9kA?8 zAh)^q8vn5WQOaJkZvf36oSv6yas%us42KCA-53<&Aa56(WGejFU!y39_t;aC+VJx` z2r7L4{@uxJC@~>{9++M2Hz-zeSTr#mQ$9*9Pr0n1N0AW|F%5nk-l+|`i zi@!8GgOPc&^}y(Z;+n?mLhEe$^DQYZkK-Ch_rW}Wu4P|<@yS$)BX4N)cw()&c+Ky8$W%5C@>A#mMq}k^Ji*6XzT?e zBbimS)T9^i=7xq2N3tbcU0q>?6)~2EhZRZD8+W@fIkf1ufKl)jFvX)h{|X9Iih$^t z7;i5xkpCBXy{$Exj`Ju6eFqwi&dz~!Ari7mo84-VRC;t+M*D}2ILxh(6v`4U^4f!}?HQpEglu?YnJBqE3bqH5L~ZwH+dWT}f$1OTiDJ^?B| z`_IZsX8=y;ZS^+$;Y3k%!Mys7f>Lqo6SD?mI%MOF3v z8xY*#_Bb;K%nd^Xcw&2VHHW!!$vdi2a&oa#x*)0y%*2A3VWnIk-kM$yrm-J^p zoiV=3Cfm8y?#>RZ*PN}u7_r{Q>2<0uFV~H`A1!H=>C zMz*%H5)Ft_X(cXt2@c&qpUEu^0Ib9tc8c)$2wPLOFbsT*q z;m51vRX{iZG>`@u8XDz#^DsCH{}^qa^sX7~?L{QR#K*^P5lEB1yZ$?L>pKrx*+_IP z;wG=FUm#vb1AS`Jii*C14mmqBD+*&YPTp9VsnO9ejpNng%zyGT= zxJkzs7vfOBHu6f1EQRGZvCMU}`98wFxKK+uX32LGD} z+W$v81~8YQG&8N~x@{JlkL06^KF4Uf8i)KxAb|%owY{AkUgs^vor?D$(gT{}q{b;oCH=7wup}@< zKr-!=Vsj{g$A4%QA@T(=ySd_r52PZm1q5`9-kMmwEYl!oeDkLGFAnKFa&=$-k2MAt zLo>f0c)0jQx(%EH`4}+aEsqbk;|=+s`OdmPB>SG4%CMAy z3U-NskvsurF1>qw(5?bEp}eECqphB;o{yfefv}zraqPkN_B9yQG=A@L$Ms%!r_G7N z9Ko7!4A|wvLlR(kgJ8I2+uGy9;Ugvz2vGpY1agckAPvCE$$lv+DhjlS-O5V#OvNj( z9Kf~?PV2;>O<*Sz;NlvanFR*~bdPyn?9~DBP%s^AVB`Rq;vg(ddNr-t7NiTI$2+Hh zVUQ=PsHmv1nZw4!gnf0Bp&KP3UM41cuY3BD|3T>S%FD;m@gycs0W&QBMfS@wG4i;N zmp!r2mAwX3?{i0L<;d-Mita|MmVR{}fky9p_=ue3={TItcpT#wy+~)q&+VAd3gVJx zaB1UBT6_BjJWsBqfO&4BN;MaxtF7L*c?w1oc!wJFaVpdd^z=oAg>=5k54^iB*#nj( zF8<9x4v~tsYWgJ#^1%Q8UVy0*A}*g4eijdRXJCkcFITv zt=;YInPUO40)ulDGBYw@Si4ItkNyZ~APEXKCWz()2ZN+Phb16>0LPTUwhcf!+b2OPvc`M_WD2s; zgzoHre|mOu77!2sM7Ii!qNg)}Frd)=2fce}PL7MK1{4KQwW_s}=fjR2kLQ1v{Xv8k zi{imQ7_9^4r?nh8woFG*?mXiH3Z1^VVDrT%N+`@Lq%vfqasiqEMyJz9ZoU@o%T5>{ zcj0(OT`zBM;6SqTkJ3oC4K7C5^fA)YSC*B5W|yD1w7fi8yR*ve7Z(dB8PqTIYKCXV znYRfp@=V*i$JE?>3q&{b6;!{2#u1H}U4!x^90G!Jo;!w!)5c&(NC@7^G5SCBjbcMg zar?hK`T~739-A9>!md1pZ(SXl3JfbiB0@*N;RU+=vAl7vLRH11~pLXR8CSGdFG}0}%@t@SUU$MtYu%3>xowAZ( z8w*ly-S86+`I(FiR3&f7a5@lfs-6PV2PEaAAHdde0K`a>-!erh4MX0N{&r|AD4^xy zikHvU*3zsl1tM5`nW40U)G^pOgvmsXaUrKM&1G<2z>ND9fDJf2w%JVk6;s@QPQ~Am zMXZkHDkO7yYc=hFrYjPaxY+WewA0g;hf$bi5Ei(;yp6hKY&p=p{;HMu zNOS*ZEO7ieh)tNQ7CX0cNJw<~aB#qvM=pJD+MX;<7L&zPpOWqnp%A5rgDXt7;sPCo zT=y>x`hh$*ux#({?t!xK4G&N#P<6?p=4*XKDY03$kbx%&wo^n?;&~v$i27e}G-Zd5 zYF@dzy?_P&ca{m0YUvgBXpRhyw)PzOVDSFS2g?{W-ZYWw+p_~R-P2zNOmA;*m3Ntd zKThDi`kwv+uy)POpHK%q0IqLkvRIqEtb24+DLvoL#KgqLNKSX^bL)r7zqg5udY%Z7 zBR$I|89IspkQ{b-LmQyjU$B0Tn4I)@uV?L@v| z?g@oBe*}{7NME-0FX37zY;!D-=o@HUrGk7KE%%jXxWyiw9k4|GZ$W9DPGkbBD9`5F6}&xQ>^R5}8eC+h{4 zKRoOklxz?X9kzVhiVe7RkTUb$eq6N#{96ffj2dHpRhMKJ;z+lhz4XM=@}NkJS-vRK zO2wC4);*>O2*6vy4tp0}{4$;Ff4F!-K&Dtkur0B**tVD@ey6R7rI0Ls{H+nBDnO7# zQ*)X7;b>VjPKGHz=e!A_?_F(R%tC~fS<3$29;i%`(LYAa2P~@n)~uJB1%TWHj4ROi zC2uC#~OdP%Y`Hre~ zMDWVqUQw*i1Q3RDId{V4sAG!tTOQ)|eOj5VM}J6xESfntTdq_hU|b*`$^Y@__xN}v z2s#1%+PF;PyqA)S3Y5N0Ad`W(h_J9QI1j`LD-r#Zh0Ke0s#BpRDgp%3=`kL-&Ou4@ zmqDW$cDACX)p1(#H;{7bE|pAJXOhdgWVKQMzskNkD#|t7*FZ%= zLJT@Yq)|yFMJ!rC0Z9o(QfZ__KtKcp1UAx2gM&pNeidmI0+hUw~&S@XAT8z$B0x~2{!esGQ!`qg8_dU`_ zqaFV9Gv98hsy1U8Knag4n(nU>W&&6jyUfjP16)hXYvVQs@0QBTg!0JfV|jOt;j&q>wG-{r*e)>QaSuw2!&i zi#IrRX)?PNPE8D+2zoXBIa^78pmKh5U}p2uE6WejS&`Ag6|Q6aUI&SklLwTnLidWl zb-I5fsm08=HhA?d4toz#H z8Ml>_5&j2PM)_i3Bq())ce7$9L(V5DBJ28nSHdG#w}ASlzkHPFwV9;WNGjRKz7u5k zt@VFDi5A5A1ziNIr?Z59P-1P{r|`O;SNEJ`Kq3Bd-R=qeZ`E58>52Vueu6@@c<`~ROf7;$Zx|lYmIyfNc%9Sg3ZW#P=lvC;?U)Ee0yjmV6pI~>bGWWpp zePb$RFu~b5|4<7k^EU4UY@ieym?ywCBFc9Rc4* z`(V@Hmv$@o426Y-H3+09dZ@03mWJG-!K4I=s{!*J&qhUrtozx^*h~wv)WJiCpjCAms@g7c8r!L)ySn?mfprzRt?!P;B!7R-F^ZDM zIW?Jl81Hk6a%x^aW@){?v-3|5=fi?u-94|a-63UiF32L5Kc^GYv77QK{jQ;>$5@@_ z*Nscw+~MCXD>lFRkMyG`(V21=o6%pxrl%Kvg6+uvC=l#6_i580N532-Ok3@vi@c}! zgkQZ)UWDfXTaJsLTPoJ^s6t(!+KReq14;B9jh;cxEq8}+lLU443pS4MV%KGB9r|93 zF7Ch%v>qA!-u^K*R`>RH{8^Vw93(yM7Ao-)q4LS=(!C*3E`U5B*aQHPm8BUIW!sCx z0>FL#$b$zDj?@S|>ulwq*a91$R(V$PPAmHtzGBV0O@LJE9Jp-!8#AxnYO{Uvme#`I zr|`HwF>5|IF)P1c)^9y>gWdkejW#Z%T6+f?$f*-jo7c?9NujWQ>?=zht*f_@ zSDqol$ywjo)am|Kyh6U{F&|Iv$y3R6w6uHyu?uWtiaP4#0g4mmIq^pii`Ra$bgZfA zJe*ao|IYvwi7$azarwm|J3gIZGt*Ve}w! zvfA!?M0o=uuCIFHm}bzC9AJ`IDf0DPqsd*>i%szzA#j7IPrs0Q!WP~De2RjU6#geI zQ6uKh4JNj5G+esmmzDJkvt!;N&?xJWN<)f4$NDTR?BQ{b<$foG0=(yNqhLHsAj~l6 z7~62U)pn}BwjK4O*j}c!2F`@Fl-6PfWg4`_b8~YvBqI{+>BRQ`~<1X?Xa-!tB@j4sR%TdC3%yi19~RSXl+Rx0xCnR}bBN_Nj#< z#BB&Oba8Pp-K`5ASYW6ai%?YC=yzIVT`wxh$l$8rr6kq}4t3kly{=pBOn!FKh|Mu| z@XZ7xWS+O)z`o3R{pH!SJWuYN;P?Duk!9KvboSTyBR4OZ_dn0RTR*(%5%_7Oq`0Kq zk?CS_*YoF&*Slx7MH_d~H&^ZrT369e4M>?bsFr3rCrsw{+@)OM@TtU9C+z1T;je)N zg8E6mzHxqrqL1pui?zXw;!{&oN6Bh~HyE7#5)iCh7R=dtibw5xdIk3}am z{(&jRzP;Vun+plspI3%LKG}e~b(-q(61J`T%82|Tc=tDXpFzF=CRr`x8!!>fR`hgq ztrPZW`yp>EQv}XjCKK_e@tbP5ZESx2sgSzr$kLJ$MMcGQ`L_+;MM>r5?(k$`h@YGv z9>e;SmX?$xZ~_0Z*28s(Ow=0Ij04lCRR(^OZncCJC%R4{70JmmTzR6_m@Uqnjf{xk z8h%?;R3|XZi8^;Wy6d%<*G?&(_U7iqViQx$A~4zV@$eiBtl{J1TlsnfPQd5SZ>XwL z($L5e3^*`4Xo&>K;j|cbQeO?!(&*@Y!<^xA|2{!s)in<=L_$*1HFDo=b8|X+`t|Xa zV-Yi{X=wtw?@nSJv#=!AO;2dIKhK~)7TYM*c~al|fRwSf(r0TpM%DXL)7!7=9&lQU z?Z#07xQ00C#}A|FG^ehqRL#EoCR*k*C1*vYFR(bWhH_o3y$I|IH7ItYv$Bj7%Ja~ZU;M^Yk!2NtZz`9=?UI%R0z ztwF?qtCE27Oxc}g8*}rC|fC)-SSeO-K-NkFy4n@9t{hHd~g5G_K zZ2dQD=tU`*B^DPJ1W%rPPd!%!c{rxOLQCLkX_^`u-zRQtO#)FJJu=++t>arqd&iqe zi(lsX_AosPRIbf;FWg3{3keFirlqh@N^(70>mKNJv{|ooij-IT_mBdeJ#55mG0SWP zjhiJTQ{V_uXC4Oxe6WL7p%VvRM+ZT)pp~~nVfoJ=C1vGN+hXWa=A%3_c(rMxKB4J= z4HD9?wb^QlxyASIWk`I%$wxwvW6TA*MZ3WK+SRL}s+sB(SQe;;gJYD~GRm+%5R5t^uYx06lx5b^lqHd6N+dFjP-MLMk18Mds$_y3v>D zM9p)gXW#G|?Z4K4bVy^VIP#}3XT3_4aUG*y_0ZNbbJV9VO--Il8_{ke9*Ey^*ogrK#m^pYs0B>L;oX##n6xAG5RiC<+OSQ3}15G_171c zbNQ~j+R!ax6++rDqEbEfB>@f9p1*pr!sAvJW`xIOdHE{Mt5N*hR+*7*Zf^A^^U$=7 zevJt{@x#|fq319hlgGctONyU56$RHuwTG4fpm3;_gG2!n6)**lq`HSGk^+Ag^Hkw1D-yyReP+LYNIg)Zqe+qJ z!AEZFbG3WyMsR0h;w<^JP35-Z)cC1Y|LxwHN{8h@UE_t|P~#`P`n8hf3-r-)r%%&! zL{g0}=~G!yOYR!X$h64jS`F&GA#FQ+nVC5OPQ*JdsWxUNV)t6*ws&kdra57X>FMq5 zwsb@Z3e=-Id2L+cY^8_d^fkNX)XcPzJx7$tIm?|>Rh)G-ZUWYoO(S+;oVPhSb+kuf z(G8{namT6mQbIRLNJwD&L$d2vb>|s|~@n zTmADPw<|hOvRaCjb!fchC0nQ&VrP1{iy3344iXdLSJs!r`cjg(O7osNMYV4J3uaob zed-AM&?wxwt0IV~$I3&t@hSM$4*6^;nNAc*}N%y7oGSGw?~^!4|hYO6U9 zA8zczQBSaQwxrW=7s@25=J}qxw;qSD`nrY&h`QWL`qqO)yM_u9*xxp^d6&H9y)LC= zQ($tr@$+YfQ${|vC7`qK-o5MLQL%BPe_m>B{Md-=49)Nnu~M;PK9r#<1@)hcS6@^Z zQ#F`t%;gq|SxxN^ub$YuSa|EYRrid;@euKtU%Wx!h?QUzMykn2d95PHxKtx5S>h4+ zK{uXK;j1C&Xd*_YrpmZXU+mfKVB4c5Y_+eI*Zg-X{Z)VC@>+~L>gV$tFP4VzdtBvB zkWGnkoR>qa2=?B3f93Y(3>pC+AEK$IoqyK#t;m)Vp+I1wqD*S5vCdI)sbZ&Tah$xD_R8SB9{ng$`rS-zvWCjRe=bI!tc-HT7NNX?;bWC2mhRhX5-c8IZDQ zv>&tU5s%?UH^feT#mZRF*GJCi>NSVD! z#i?P(`GuS)&2qC7p$uu)le*bE^W0AD{Y+W4z zZhik#o958)kun$7b05x?a24vXj8m{cJBA{89f1O}_n`^swW(x0bf{gxZ{$7MK5(vG zm7bp1w7$MIkW;`AC2HAq(&won$NF%%3IwFeER-n3jxz(VHdyGa<~ftor*=w&JlbkW z*yNM3DQaIn69HJaD2L*j#?PZX@>LMZ8hffnZGYtu!8sDD7s^A|C~5dsCEgaBc? z0j)2=L{*j};?kUu(3->QJ?dz#eIzWfe)2KekO5%Ha2Emug+6I(si=}GyXy_!#pQt~ z!GY~eM4LN5BGL$z5%S*o0GN7ifa^jR>e1o&tAmf3nfYv-6ioZjCK?4GT!oA44y2F} zNv?=i@A5JPy$Ll29)K8Wh>5gHs`e+2hDAg?d-fUfR?Ng$u`u00)r@ZGbzvb&LG5XO zIW{!bA~Ads@&GO-rlu_K+$lDyA>oe-?EEJz?8o@Hzht-8r~4zDi)|{{`zJ+23iI>3 z@wF%`ABfyS%#pG1S#j~1zTyQO=Z(M2!_$fujr7pu!~K3rR8;iTsequMaztNIkX&UF z_a)=5lkFEfVAU9+dgSp(2`?=cn!qgu7RuRGw~^TA@kKd%qdxI*a=x=)ZN-$Nqod<1 zd$Z^<;o5kaV&1_NXklYhw`FNzK>%9t?T#$)>X$kH>Uf2N6#wT#$Og3K{pGHrkmo{} zRakgfp$~F=kc!N}i{UCHXuSu@b?m0O6|ReTZf!tJ)85f>T~kvq`ZLDlZ&g)nr%%s= z7S?)%K6D=u5vVJMv-X_uLyL>A!?C~?%E>k1>BQRfL@390=DbvPhOxalyjwG}i!M=~~ zF;qQkdVPUyXyLX><;MIspx&#{szAw;3CT192H*~<9s-;FJAT5+(eZV+rBs3dC2^)j zCgu^~kv9D$f1t`kBaej&@p4$x7^!cSzC@efnN6>n#zt-li4A-zEQO225P-U&8sXHO zcd0kAMc)wf#nINbs;LIEuRD4_g3L)(UY;a!1#A75sp%OpF%}=V{cknJm%EqtqzR?- zXm`(4ZU^%hoGLADIbciVSt`RN6j*B+S^2p3>i*g85|+t>)?a^_}d zPW^DalA?A*^9WOjC?ppHJ^W&A%y*59jYAmDuz^frBXBqPE0r1BmI-akR5Tqtm8a&=?jW={#$QrVD*B(XJ1W$F%n1Vf*@XYLPN%+^2y8~D$?Y%wyW#9XsgL2=@p;=Z(oK$<$*t zNBxZB{C_M!FuU^#>@<4>qd(OJ=}1}Yo($L4)Y05}9Sh&g8C`_VBrFuvkgV+56$%49 zawlqJ^JQ4lb8DSg)9qsKeA6Gl5e(-=_I06J{NDOqcmvG99;i$pP4Tl3B6%`eY zNqu#7W3W~sDhP&}mCzZu7O!7VecCoKP*GOKpu^9@Q=QOw%h0g7z1^1&(1{tpwl-|@ zIC4KVHhwg^r=UQ(6)Fe<25Gg4i7cF){>o{`d}3o`^DO_y;52xOMM&?yrY&%e-0c;# zD9|nA^xI2B^gSRxJ|5~1p27`?L`DR)`4;MrQ3nXoDcLbOU`i8FR8m4@8!R*5ydBzu z7?nq~%#PNvlEo;0h*#?c3fa-Y5qi0PSo%wF^Mw5YKXpyb&hGAv5z!pyy%<|EcXr(>MaH6|~ibMZa!wAm|LWWSB8)x{n zkW7`Q%1({wT>)7tStv4eAR2OUSq0mLtu-5qSI1$32Yvt*_P!N1HuRjuy4JANYG^#e zVSkh2fyn=OvRzd~lA<>NNI0yJ_7fps-Vk;iB1w$Qc;E-TmFm`!?V@ImriXh-G52xM zkRUee&L78LNPi#m!$7$=R09XMqapv6nI zuu^urDIreW^LJGZ>DborK91q_W1N9KN0)_0nMfs}ZhuAF{8U_Xg**)OntQ5x#KRY`MeFBn7 zAXqUBz^Mle0CirM9~Fs8K@qfBNXYWS!g+!e(XzkfkOI{5<4|v6(->P=tRoH&l2`5X z4VUleuV8WnNJ~XUMYi`C*4(k5o|@!{WN=?>x#TPX5Lq(xG8qL$ZhHDrVe@Z5Gc~Mp zOYRGIy}ff#w!XT0w+hOtkcdd|HsQFM+7jEN$}?X-KnpPOg;z<&mYfXH*0R(2`ies7fS*&zh zF@G3UlVi&#YY_VE_ygs)#91#l&g;WzdwYB2Dfm!&$x!aU&~?H!>2m$gxh^G3j_^A& zf|QSarZ@^^SjK@#6FxnWd$Tw((XPkxN(ZoYt z^90R)gMx}4&IqG((v>;ZV{Io2MGA@7ye=oLyekRgGU01lykZjeGW=yyK5Jl&(aEE5 zjP}-G6q+)dnO#^2_dl-7eYm8qi3)uYEKBr+tyO?YPnY zkUE^D2*D??dL->VwIxRc!hH!@j@*WV-0W-(AGw;OV*?`UvGnBTIl z9h<{a$AVwowS^`gPIIuac6NeZGKo*Q;CVkCO_qw(kVKn?rgSV85?>=LE5?oMv!7l^ zMU#_L2M}p%Z`L$4pgF9r_P+QMhD_W-28b*qT8Al*zQ6S*bkB>ccm8T|He#3GT;|1} zfJ@?2B6Q`J4Cw5K6R?$x>&y#s%k2u4Pijm)jgN}V9~|&qdcovmWaIWF`JtyGnJE?dH$n?-}k))k4iSvGn2N8RU<7$l1@W`!_~g##gE&SGRI7=WhyUdLG}MUKZ}_ zu75=`S5@ye(@S~kM%6fy_Q6%NWAWb<@MC}fHsr5_M)Gew`2X`S?$RS_LRI6b!R)9n z(Vl(fF0AGMz91q+mpHN@xLjPfa@2VEcdab0OFmuy`%r3UwL*d37-ZkRXO z@uvQ`QGgsTYxur%a*RYuNI&hbPIbyV=#sCch=0!>Cd-te0SbaWOuA|_apm_BLZn*y z1ErbE?9?JLde^R{%=5;}u+%3*%Ph}+&`+EkiGCd}f~DmD`-v&7&nKUQj)nF&V&Ul( zPoL&TwR`hb6-5)`T_WYxV+&V^)OxcDA=ujG#R8I8EyMN} zVTQXLn(c~blK%Tl$FKY}`-7B%uCS}=>BXsX(geuOyCkb|`O2eUfVx58t!&EsXnamG z`L0;0XhjiGK_|z1)~@Y{ND7@&aWOef>$Orx@tTu{#7pMril)`S7k)N??sNdM5N>NW?wSUq>FCQmjJIA)Et{Bx|q89K>h8-6W?>XX% zX_&O<;iJy~UJ~vT=GYZg{m5=q%XlWkVrVD6dwWUz?>gHPaZuPfQB#?LS5)iK-}Pa? ze3l_Yt|ldR_rKTb=63_XHo?D7_O-gwyH>j2eHYfClX>m{SG_>9sW@<%#TSX+St2H$ z=d^hWOqEyMA;T|}5;|jId-2wz#v-9T?g3h@qSMHbX_m$xfWW_TB!8yfbLlQROMt*qP@9dvui8v4P| zkQ9(G+EFm9`uh5S6KmUO$!awX+(%|+q=A1p4Z1Jmt|g6DoLpQmJVIPt2a5|t-d}IM ziC9R_*5jmMl5lPw9Q0fqN2}bz$jGP_gh+UAucCAMm~6osL=hhNK^B6q!p9oi@OEhG z?_o`D-inMoj0EwrP&X-0sFhJ7$oBq3_AlND-VXQ!)VMa?m$Jtqcv|y<`X?zJqCZe} zv?U5qRa=-T9qrN1-~13Sb+PT=2L^GHpUijT$`*%B)Bc4 zJ$^XDzl)m~Kp;VKp=xt|Iq>+8$BiUDsuxTzAos`ijGr3Cp-N6zI`H7;JdtZ(fnTI=iU z0TZ+Ma45&VgD4!YV-*7K0SK!ENi#lpbEyc1O(`udhCcVNQ^i># z9%}*N4MIWz)kBI2Qj!7!Dy({@(=%lYUn{r%2!MI@QMI#M0DF$dh)#+nh@KP5v3Kq4 z&JzRe%GNIjBBfK!&E0FDuKwokP!&+E)6ucdp3zWJ&JMWF04GHZ>~0 zKyvIQ(`jf4y0+E+2Kixjb-Uo;n(HPWt$54W_$Th_U@h(aVHUb@cqY;Qlai1?Pd`Uq zcNmecb72L!S4}Tv^#1*t@^|0AY~0+rLc5d95r`0cDEOS1dur7#v#T8|y$1mBW#1)6 zc}XZ7eh(Cvg71v&WAJ&}D7QGc`LU;`B(tOu)I6((_O*cFC1zj7D=wAbQ~^bN@$%lM z_(bXKnK+w0l_`X`46qx7?5Su)-zs#hCFPy?=dUxV*X7jouUZ=$zs!l7qTh7^vu_d>E*#$O-wx< zBfR-q3`JZB?(}IIQ%I&paN>w&wExVBw%dw>MNZ6UZu7O)mws2b9dcxkSU(g}hjc|6 zl9ZCv`#P;65iS}XQh@i8lapJ+)R;oRJip~~JQxWmLjQ(ZrfpVQ(?5iaUo1mB5Y(!e za7yodwa{Bns5aQCxsD$<9W51{D_Z*9tplaDfkCBH(*R*pDMfR)}zq!t=&_>&+EGjh@3c(MKa1dnERU!~`E z-)ynT=~ZtEsTII{G^f8mTh79pMHVf=TM7CSfE9kB#@Cmxm;6_$E!O#+8Izov7JZo^?9(f!A)R>g*2#XI$$U>u45{GGxPQ#5Rpm6TUpEy{n@?L#o zbMu(AKN5tIDU5$lJ0Qqyp<$ie`1qTZanV`1{;r*p$rFLP`!4xynIAs-4ZBmM&Z^?> zoUEs4vJHa0J38Av-)fAQpY@K#5^xMdfx69O5Oy8rzrjfzpmrctF;?iF z*^D&9fiZ%~k%BpL@N-gmgQ3|2%rrqkuf8-M;z8U5n;}UWvID%~|Kk z$jl5L=ueApQZ53oh2(7Q#V}Lnix`fZduIl+Kk3uS?X7=sAisr{r93m}T<1dnfwjL< z57@#)Gp>mq%X}RP@eyuUSBfpsU{d?>qZ?vXN-V?pdDKq&@3p?$;-0X$E|tA|vw#mY z0BYBB^=ITc@iY3(p14s6(gKM$;pqneCz(@F`OpLAFia~_h)yLqphQIpxpr`p{QZSt zqVEX5@LmF$kGs~swR<|xvOKJe_i8p-tX;^FyMlaiupYRNN=$rw@Co#iP14(Leedo8 zT*JCTCiHVCV(=kRHi7YJJ%$lg)LIuOgPR@{07y)ohZq!j3&pm_3Mrc-OMcA%gf8#`@F5~=>c|280C+1aQrLu zJ;A{-?<~Q)2@xjNx81#a`-zFg>_*8V32RbK4bkGrWj%;2X8?ApagpVjyGt0}RdlTH z`w-JIQm9~GLGkOo%=op{+H{4hotn;j9rh_#Hs{qj9vfe9F2hYV2w8xDhfv|Gosg!3 z9Zk>`L4bl`7<#Bmk^Zi(mGb3*>SYiQ62Lxi_ODJ}M<0NM93*BSIGmn725PkLSSjNEIY-gcn-%qT0cLBE32s zjtgYbHe-G%qiNjv``Yu=9evF9Wvgcg{2UBf7Bk(9W4Fm{o|II`+MY8Q@oEzgn#!kR zj^bQx`$-Ko=dCaCzQ?~lm*hc=t^EzorNhEQ=pbN~ZrNxU9)1vcUQUyX;PeEC?ECw`~8$9t|!&+LlzNhDT z|3`#vsu$%WI;MiM?8|>`6F4m6gziww0y4L*eL@Q#sv<{(JU~<1pxo(ejLmcJC+Hb% zwq&~e91@vhu5P^0+G=X~{W8DSY&@%zNo@DyLWAMLw{M3bc^VzH4(@%D0&GGgMv_2_ zszR*|6JQ~d&AoHe`5ASz3f;Qn`(1(jl-0SabJF;3$Dtf$YnP51Hl72>eZcP^15I{b ziLAJlrRD4-HxEz58&)64F=On+Z+m=nbD+1dG7dVTcJ-=PQMdbBSMwX0iX5eohDWLt z4G%P2Afz`L*M*=Bh>%QG%AI`hd!O>)xbwokD#97mMK+R|Pebnhr)T$VnHI%VVEbM9DZBAd6Q(aYPh~_4jrUtw<++{b`Gb_)3q% zr$E1N-PJc()SzxX?*N&Pegsw*jf1=Iuxxna?lc3lF5?2pwn}8;y1A9PHJ0KHcULrR z70%iavqGJN!flkl5;rl!Ymm>-l*-R&fO{J?3`n}3SW#599x3#+6o2Z*VyzyF5G9Zs zHd|w<^ON(QIalPHMiBgy!O7>j^)_;O?X9O_@&j96yYrSEXW>gIF3j)G*K_sQwFnb(sIQ zhzOdoC}9?JfBBQ?C^0_WqOl<1ls70}dQYqRP3mYlOQqq8|41h+eyk$=n+1m^gO4O% z2p3`&+r6*vhW7t=El0mmblj>4N{W O#qz|6RqhVhrF_B1`mRoo)ZsTE#h4Nt&fAF&< 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 diff --git a/doc/salome/gui/SMESH/images/distributionwithanalyticdensity.png b/doc/salome/gui/SMESH/images/distributionwithanalyticdensity.png old mode 100755 new mode 100644 index 83c086b438f0f500646e431a10f0fb4898fe0842..170428dc2808afd7d89c417d7cfaf6c71ed13c0b GIT binary patch literal 33428 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 literal 35416 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�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

ABD_FrF8aZco}ENwYj>wf|GhO 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 G@qYkS3VJ{Q diff --git a/doc/salome/gui/SMESH/images/image10.jpg b/doc/salome/gui/SMESH/images/image10.jpg old mode 100755 new mode 100644 index a53ea0bf20df443cef3b31833b70f60923fe8393..c52d80c9d5f0f1262461e584858e6a4abb9ea6d6 GIT binary patch literal 10816 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

T6T3oJDJ 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 L)MRU0! literal 20826 zcmeFZbx>R3w>BCaic{PrNO5;>u~M{naJK-#trRH~Xt3b!R$M}GE3Pf>F2$`_q4e@Q z=R4p1&6#8O&i(7o_s*>BWcHpU&t&IaYdz2NzJC|~ZU6}0Dyk>~kdTl8|1$nA16~6# z(a|x`(J(PEFtD&NU*Hhq;$UOrP!PSuC#IpKqotvwrltpSv(htiGEq~riM-S?sHo3pKRllYpc0}H zG4RQuztpn8V1y9!ha}`ukx_bHshDKJ_Hnw*54vrq4Ufw>we*R&f!XrLMMn%IClaf);Bc5n-I+{t-as+`UeJwhDWBRXJ+T-7Z#T`x3+h7_x67t99~>r{kp!ny}SSY z4_rt9lz)Zw{P?fP{v9sDXI#jrs3@oy|GH<>T~0qtLq{m+1f{=Y)@zk&VVxRwAoC`ivg9tt5q25|ek zAJk!VKj#FJ;KLE&FFoS{>bZq)@35P@3ruX@ZNz-tIhEu zsqfa_yD)Gy0Ll7}@w#NS<2pB+Q;8-(p-u+Kd8FU zr+K+*~21S{%e3u>6Y=lCnGlc+X0T!crmp-!$D`O=k+4*=uM+P=fc zt2CqXm3Sg57d+sn0e|{2?s7$*;+u{1s+of@HI^CZPM8&!=|Ty=e%U1_$#sD|+J|Ux z7#P`GdqQ94XBVs+Sm#@s0PrO=hBE6&)T19$E?r2MO2=%PfOMJ+mI72&>|(4@%Wbq3 zW$Cx$vPa*X3U8FMUIuDu$7kOBW~E7kkx}UMS;-5AYXK0MDGIJb!nl7dwfuOm=tBrD=|ffm?VE|o_s(uUCM$Zpl8+aGyH>5v|2J+YomOI2I7%Kg1W4~ zfS|Q^`;y@6apNgzdVBx1QnZ+?@QfWkM7-)tEbq|4U48C$Xj8Tam4VLt>`>CfF^SYrNrRo zSCIgzEA5wTJgN8ZrmHD2TH#TquV4Co;T)zw(v}~2FxU_^rY#KRD4g>0z4kqQyF3XN zYTU!x$l|_RVQ<2l8gZ{IrO&~&rb9Ix4dijT#$L{hzu-;oWBcgC{uXJG@^ndS7}53B6|PL5=eAX3dG}05-5B z(N@0s<`s^*v5T0wx?~d&pe~N0!UL`3;(}wru>&elEb9alRz9Jn=y6b>@{!x3x+`Mt zlQ0i{K7m(!&;~W1ahd7Ysd7Z7Z?97Fq(i|gB0<+}3DavOUFWm0g&rRy&qM>7tG1b` z@j1KCfG%0qympgf)Og}MDAJRI844%iCo`7vb8$qHeC_WA1gn~OOGIp#GlNCk{I@cF zw%U$N94BUeiuAKIv@{1mb_F*E&V%KMj+djTIz8eB70vMf)Trf*`~~QAwG)YptMVkp zVKbpCYH$%-^J2vN(Pq7``b83_8S#5tv%S3~V$I3Rue~lQq0lNmvXH*7`FGZSEqYMt z_Bh?!`nry+x`vJr7pBbdC_XClu(}lqH@V&l${Y^l`kK~4jPIVBS!}LLKj}WdRCSE#eDqGa{*!KZ)mMzVVnDJXTJU>*35$w)! z!VG?z0=cPD#8o)|7R7kk6f(H_XJp4~=TfvA%|KG0IzcwU$i#GYQfNvEt=&GR9t-L+ z7?>%GVL$BRgA$U37a`0;B&I0eO%wyIsT)vq!t_;NB0)H*9xbb;F}EaeTk@s$U8Y;h zQ@luCg<4yKsehji6f?fzp3ni9)TP{tZVLhq*$RSR{JRiStsye&uUt7+bv<5Id%Lcd zOhGm7lWfH>i!cY+%Egq5x+syjn$5zo$vq$1PymR4JFpAU-s){F%=62uEAAB+ODt4c zzMgSakq9o}wpYZa z3yN&*Zn`xQi;tqOb|LwI>^(vg?E%pO6Em-ciB``rVR6&@K#?`_O$GtyRIvh3=$>zY zQS%JAL_}W9kO$Zlu{TFXXpCl@O5OA$dlc43)J`i~A)XWcyCfM>I{J0JFR?E{u$FvE zF6@fH+s(kucR(DiT=3*o=md=f|T zli#nso0e%OPdFJ7FrHTkw1vvCH%IfgQQ;dOef8}OjCjJqo+_Iu9Brc^VDOEqPIgjN zyBLP$iKg=X`xMR~t#Oy{ND9Q7|31*1NLO73z0cO)3baW9E#lhOQ+yA?9|{b2?5lPX z^aI#auqT0dS;!yhgOar;=H_(#GB8awq~(pvtP)tOK?!vd7j?eIXr!Bn&_!W69LTFd z%zPyP()0q-FXWJ_YyNhLij^bML{$%a@FEM0S8Rtfw(DJR9`(x!Ula<38-NP+(`6Z`;xXv_5_M`Q~{Z3EKz%&8T`d{9A{oV+C_FWN*3DV zMScTI8VD2S+1C21k>jr7qC8j26NCehQtSyUPgHURFK&VKlM8cI$R4d+ut!O zh~{|ziLD?S@E=7_u3=l8R;J^(8;*b>=OXRWG23{C6+AZpKidHQ>v4nUe|MX~2{#vx zJZW1jR*HQl1fPBI@{(^RD_(9JE^R`zX7Xk=-4>}>B?q9Ca><5de32DQmOnTmT0GMj zRxU@ZQMTI0l%|&U$&a&|#v@7c6$)*~m7$ThoqIN(y`RxvfOnU~x|z@=+-+KXn52SH z9XbB8Z!Gxbv7!b>u)A~xso7ZZLDUY#AlO2iPS`B4MxKIwS%e; z7D9#Vs{{1|Ws`&o7O_P%9iaS^gJ`epFvI13KwF0Lwj{dp40t&>O$UH9AN%2=U$1>Y zb@8j3NX_-!`sYWnFZp*7r%zTl#n95lcgGANGx-z3)hbt?&C=0DX$u-V7kzVBR4H)K zr<@E~WXs+}YZX#wZG^So(4g@Temh?P^O>x^Bxz|vaBJQZUi3b;|C!xIeE6X~T9ocp z2A4U(F1G(ZP+Jx^y7V@My5#gN%Di-1d2~i>$u;ZeWWCLThJ*Q1jiU>H9W4b%zs-N1 z8g$@P!zXH$-p|0F?~%8_q=7=rNtiss`q!DhlYr6m&J1Id4x*{$O)|9BxQR%|KKn&( za>MO!!cYNOLOHK;BV(iGwWXy`Eje$96g*G$8Fr}o@pzk$egWKsITEMZrNA`(?M*?n z-+ztzo#~X@*(4R?EU-Vqoj2xA?W=F+h`Fm8`hxYRg|kFL;j&r_V`n2X-}D&qyqsN1Q-g`4AL1I2{nwmm3cc%i;Dk2T&>(B zTjPzwj)fG;)R~Fpw^YIGVag#j@Pv77WjabR6*UDqtnHI+oBcayKnJ73Ii7)c72kO38z z>>}R}f)x*Kdow()E-nSp6u?$%8P0&44fZm+!2S87tYEv>TYGUvGnF-*whw}oS$c%4 zZz^`nVQlFry9grFcQ*Pc99do!=e{{3TOb2%jyP#Q7e+o3lOKM-&vyGE*?ELnXQqRK z_5Wp^)DIT;HtD)W<7C*ZtQ~Mt*O#C?@ijV+R15{@&ZHYB@XPR#ETMt#ky`uo_^-M7 zCgFW`@hn%*XvtAGBwLfpRsI$Xj6L!RN2iynlW$gP+kJRY4YnTQ^g)cBI|f(xInfMKDsw{#Ch{!iSL~0Un8z zb|WP#b)w9{{tRUWt5rJn1Ok>Fr|tUGFZkZ z5jPe+RT)F|ZSJ>F|L%yf1_a{$ejKJ7&r3A$=uqMuKfZp6#;DB-n2{7iW>jy#q8|0l>WQfO8HSMp^n`Z?~BDq zYIU7IxAt?c?0eao?Td=17_UL{Gb8s*EaUn_LGYYK$`MPkK6aDD?wUk>G%)1m(NU zyqu)r?eaAII>*(z8hf(dnPlhful$Y9uZ#0y8v9lu15o9@?7}&4?2-m`8TjbEPv>h_ z`cCBCc1-WMPKSU<*zrZ*HRyQxHsWrhwJnz895>JEx*UfXPH=bYMZL`S@kO5_Bd{0 zSLWP+S59XtS-otxxJtl{lU<~n(&C(R-Q>fnRA(a{k*uj;=*XoXkPH>*nBK>axsp{& zqe0tc`l{AfZ(@ol1wp2n;O(;QWy8YqYWKvroXYzm6#ugP*ptc$BYZo>#~$X1u86^C zhzix9aTmS0E;pSnZ(PH>jah#b_yfL6a(UDxpW;5P0`KaBFgoB4-<{Km@nmtc+}o*X z9hdK7r?8z`s<(1xmX3L-d*m1<2%to~>PkTKu&nns=i^DOfqH6OgUO^hzkL}Z-Z>Kx z`97@E@0XggYuqWFtZ^jgZ0-4R<5-U~0giUFN~QoP4m*&Us|>UDXBLQy_AfxfBq;Sh zx!}S(SEy)ukb2_#D6tx`8g)!MIlFlUiDa(v#Z;CMm-db7whayeR|4h_6Yl+l8;<0W zCSr>uyS<%Ub#PO{zAR&FS8EHheTiP;C@T4iC>?u9sO%)gZBgqFrsfj?`!_)KA+pv_f)u2MTj`{*b9=-)8rz3 z_Pn!^%e)WM6aH>$*)k?d(T7gsinCK|FFEU~D&tj%VpVLsfwA}&Mp(siIP*l^m-5q~ zK^Mt-K+JpZsdl#@k9jFHSwS`%hm7BQTX&-H7v_VtnvsSZ>13-aG1({ zseCimW`m~`zdO%Wrv$u2{&kj^A>&s-X`tjMopSh4)pQW>SZNg37vIGWv}3x`FBP3-QvOIu{U$N1veQ2vGB-c{!Kp)cVtpmJgbyxLVmvHXub1N;FldQdbq zTVGS~U10jGmWC3W+h+VnL-2JGwo^nvz;aohgOP2MNd*6xkBBZO5-x%%A~VP)F7oR%>BQl zogo;J=u|o|Y*F(20VIjmi++2B0?->SSwH2bmW*9~B`((VW?J!}i@IMV#=c&Psiav# zRFe&Fa*PUrT$cdA`?N_}@#~$P488I{fn6I(#h*H=O0)k0I+mYS{{n)YIY<>Oi&ZF= zR+Z}dEfgwOmmU0f$L~T71qalvEHCDhdpO04_zA^I zdzOu_WOUB0n$rPVEZ!`yv7yZfMD!%Kx_m#(#6KiZ}D^p4o8~loeE-R?L zc>uh2kF!{I_#VIMxVA&b$Lgj>nawd1{5}z%D>^u*jr53}1rA;@9t7^LktO~(#MgaI z@=>#+tF8-<&0HD3VhmJqVRRKNe;9A`mNqqb?7%SM43xo*m?l~M!3WB8a^J;Iprhs) zom@2q`K%IO75oMC9bC(mnM9GZ-}^%IS^G3RD6oTNg@*@uujmj`8t%M%j_RvUfCNG+G#$}6ejAcw- zGDRP+WrUVEB+m4{3ROGdYePdkfOBCqAPZu|v6?kYEtRFcc6NF&J>x~JrDIO4r2zQ1 z(5nN_9s9Wa`Bf;bSmQ1qZ*4L{oRz;pZKRaL#ljv9+r%1h{ObRCtSsho_j9rfnr zolDPlis<7I;dZEyK_s#a^Ju=N+&*ikT=!PIuj7w`6ppA?B<>aQX!QE{4 zir*pAOw-YyzB2i6QfD8}tu@tmC9ieKFjn1kcyj-`JNZ$y-HJ%@*jpHu40EDKu?8m( zx%=HvQ)Z}raJFrK2q;)yHdgO*DU_OHDRLnPz1v5y!-L02(D9YcKVl1A_;~ zhWgd1+^M%MujXStG&1E8%?@jRr7)F(2;oF}0!v$KNHFhmrgRn_TjO6qjm8yTAQvnk zNQSKR^1i;(lxunqo?*Y8y!6U4svxE?p@9kQ9kFF;;!%#cPQo3GG<7t9YN%<2tFrPi zEn0ElyW61HN_(}^m_T&xl2SGx`ta#+2dg06NQ0BW%55X?D>@d6q}^JI8tIZoqs{K0 zKRfy{p`xCP!J-Eb&(zkH#_cCF?5~Ke#}3K0)lSdB{~{Y`eCdlHr+-u5hP0DGo*jw? zQ%1OGUD;(r<>>LmXVW}Gz;2VS0bazo9Pj2vYX=Nt_YRALfr-HZ8On{S_TgptuSn+w zj7yYvi>^da1~t}%r9;C{kTtNtWLpnXH*+_q(54I0e8}c9c7>EAccFju#cMt^1I)(( z3wTry9oqz+@=z7s$xm7k=E=z^x7soK788LnDiyzqE&0P%URZC2J6EfTOIP#~9pjor zU(6hEJMV>9Z%ATdzhT|?D#81F78Lvd&mVJLzy-@Qb6 zot^-H#dZLT`nkda(a<|Q8N02UP#L5;dyi=r@W>)9x1lr{%&MB;agpS=Ae@c{nh?UZ zpwqZrXnht=I5n6$G0SU`c)n4uh2OwXjLl)$wDqjOq-HumK>hZF5qEBSxm#yHYV_?BB?6EBOi~TYw$iaKn5)Dpl!r8MVH1^{HdNbCp)4T1sRJvS2)$|TDm8lX~c4pUV z;gN0bfvff}_4-~IM@0pj`N5BnQ>pT65_r2_O6{_28$&p%eP=W};PI=`EVVX#wdq+t z2q70Z5`i2FfDMBBUHx#AqIK?}Q>YRl699At@}8f56_ic+K29{n{rQpd^N=3?@s}

!zOIMl~Z-{+6xbC{jZ?*|<1b?Q}9+8Hv!tyQ|UX${ijkv~KZ zZ=B;(+f`{#3B7V#Kk&Ne`-v}q0WV8u(eu55 z<`uhJ{2>_U(0p^OosFF*6oRCC=ka|>iLbjfBu$7%T&a(nONTx_yo*w+9pmtJ-imbG z89a}$kdPM0_p1rt0mt2>DPx1>NkJA0>nM{gDXqw1vv0-PGlFI(WK9l2*p0%Mg3$zu za+bb8egf~C$9u`SBu8zaVnUG(fXvyZV*)_&`vpA6D#wL(oVl}WZs{)ogjW#FKH*jn z%?9{Kd^L*Mxha{G@MX#XMYR_by|vQ%WH-zJs`vM)fTveETsjhh*g?z21#broxItL# zg6iQKBa07zFncKSF!Nexs<^qpXJD|r@gyS_W2+BG{3RX*2D!1 za>YlMSxGayVn;IJ`o*=8l#~nOm6bPTRuQi#X81;tA-i>=sM|SyeTW=_@7G-Fdw&7% zr#EI;as(r>n_+T9Y%=WDHgcSO54pwGamW~**(@{F6B)m~ild;)#iyh!Nwul3zJJzA zrq9hR4UEBMx$r7*yjl=S{;ABvR0lh=^y3gH;K%Q1%jHw_zLwk$(>a#349CgH97J`X zEtZ5P&{U9AO(r*IFJd^L#+0(MazH8Q&%a2wl$)8Fj)C`Q3Ol2xSZP7T(ahTSCd*+1 z>L^y>6aKoN&RtSafSrLqBt>c^-FcS|yx3A?-H;A>#WwtN?2(H<_i^FfyMo4ezep&x z$ERDS-g4Y#-m2dXDB*@pzC{%HhVJXlUvp42-d7gF;Z5mQ&ALRV@uOMEw%WX3pze4c zC;WGwDpp=rAHSL%3i}A3IG?YiofAgjvqkr9Lt$zX%ICiw^lyE}%S_i+Ruzc(RXm4+ z3~o=lbv32$Cu`=#0AZRJLD|Jeb4v=}ty8w%#EM+y?`CZ(jz8J4qDb(a#X1(}La`0| z_ZQVX{J8orD}|M%4Z!>MquIw2&J$Qb1j?oDX4XqZ9%=6j@0 z>V50v5Ww7?!h86#wZL)?%cHJnG(ZHq`LSra`q6}1A0b?4XlgmHiKxri>5C!oduM=h z8xluUBPzPHagL*PM>_eyKQRFsEjIXdC-_kO>1)-B7JjlZ2@uchG~TVxw$bK%Hfh~y zm2>;V2uk^7^D~jcE*K@Q?IC&SXm|$_j6?O2>QJC0?JrYB~Q_w#Rs)?mYUbgqHj&0rbcDk&-h%GvT3Rh7KB zm>6K~5Ve2U%jUl)J_wNTk11I56uv|Tr2Khi#Hj`Km?Oe4Gl|#(;SUuHYuKX5wc%MF!KJy^gbN1V* zL#@GxXP+o7=qxWbcDOu5TmUbCYMkhT@#c?xG+Ct7w0yB4j%pHb!QvCxT4l!L#H_pe zu_RQ&Cxn|!n#5k@fE}+vVx)0jvjMW-@SX>EdCLc^HZMeDvXL+jdLIz6L{>9NK8W(r z+bERnq&0Q@KxG44Qw?Z~+%hm4(Os%^>sxWTyu~4UNg;_eFC?70$?*Z0kC@?E=&^UM z!ik}H00P6{(&|Bn?hkPzQdhQTvShbECcVl{N5RwwZYfHmgc$NKvOeLtbqix#2_n_} zvx@e=p8sb8`}lv>TzyA#N?C^3idcE}S$PXQAVeR&Nr_vu+EKfZIu;)mj$6af*zJb& zB#8*qAkEgHNIzEvVnsMoHR{#coKNOmgtwT<2Ue_NmtQ{Jo5{&i_|GAHN)G)$G?FU% zo&wp=BDQzDyStAr!v?m4eW`6tKI$gE6Gq|&b7^mF^aF35l4O~@pDr)ohRk<3>pEq! zomM;Vd%Mlmr)$0<2NtqQFL?ac5gj#AFVijdU6Ww_C{hKrzA$O0)J^Wc>5-aGv(oX5 zvDR^Reb2=9LQWgqBZ9_pGT2UDBo=4jhCvM-Dz%yc7!ZWPJ`KUQcLR2|#h>IYpEaruF6~qJpiKrLX-5 zHDZTL630{g_UK0ii%6Yukh%d#KLOOaMq1j>WmxW>iNp6@N7Bpb8sVp`)}U0XR9}R)RdhHbtMej|A{6C@WHe=E!ev`Oz`)CPE^QD5A=`lP zHnsOc?(N9$7l6?@cw2|a`{|RsdVxU*gMOe09a9rJhFKD=2sKLgHqQlV9i*@->>IT! zH3H3U4U2pV?(tl`TJxVA#RMHI+$3xI-%znKNOJZ+G#6U?tJiO` zAJ>}1+Tw`UqTn*j^aMRZmENb8eprSq_Sw#2Ch{|jV3%{xmke3|Ziqejl=MpAU`My{MNAW3aO7+WfW;&Ox zL!kpQ-dle26HUGd)_JK1Jx76~KaO5+n@H!Q{{m#fnSWeg-3thVoirm&fo_#&Xz<3o zs`lvhb{~B!T2%{O4@3>>2iE$owi(V6ClmEvLn}!07ZH;%INBwk`-W+vIZ#y2Gf#YqTnQURNa#z*z5oDRq}pcLMt-M_ zRM9GK!KX`MU8`A_^n?T?nA7?x2DLl!OTGWv7_zep|bhzY(dYg%4+ z-y&73V$Oy^+`U2%i8!HKMe1PDLoHd_u=$k?A{e~4=;yeK0!K%y*N=54kcQS$`>kF| zoCn%$al2-rWDMk`G~_!D|MvAszZT-TJ$l#+rK?{eu17TcmWC9WU%HOKXdp3ZKOOt$ zvX&O$Id+}XOKb8+coyLC#WahaK^Nbn1NB4&+jghsYl#IL82M&W-j~}DYyx%7jmMK| zVj-5Z?{1!j8p-hSg8;|&>|dR&k6$QtFJ?S{o|^Jehi3z2-BAijoN2e&9Z%%!9B^Zb zyyp(}*aiT=#6uOw*rr=%Hu}0=K3#PfLM#=%2ljymoUg+cUOHwSS`5E~#D- zmtRp7VfvtC0dS)E!oFYW34!HL=Ok3Wye0^*-VU|NU|D%RQuo*n^H}e7&jzjNq)~B^qxRZs*4(<0 z6-mNzRA;6nwu#Mo`-$D1ZH}HDo!eF?GXpjI+gnIw-B*D=Ed#4^3|GCM0sfZRcII>5 z7qZ-YFwsdQm=Kls1`7!Q;I*9_2+^(KgWWhLsvZ6DLTvs8;933*Vrc71`%`Z9>gK%! zrnwiJM@$7QaC3f7E*7J#!augu&#Jz3X8BuY9%gls^vA>hRlVmyh%fvcnTfi1!N453-s#ipr5 zJ_JBYSkT1av)a0jQ=d6IyXFAFYvCdSMxX^1CkVNw%7`ihYd%W&Ue(=~ezQd`LDIQ1 zq4D-6TFay%-&1ZJ1C6x6JN=^&SchM^S+Cx_<=KP!)2)_MrWmKHG5JgpPt0auqgG1(Nsg>tf+R~CD(ZU0SS$>*i>ieF(!A8EY06@A`>ePCqDN5Uq7KC9IBbq{p zNMA6Jo=(1GrNE)MO3Vq1Z2^?x_tDUP;C{M)lU8q^VgNI+mgxYO`4mO)Vx1aTp=P~M zX}9pqsDkqSM7Y0(*m$^EKzpxjMIw>ORd-MNV%Eh5x2szfhU#;$gjN;xlc4HH=s&xU z0g>GJf#qNQ^}~(@zpOXC7V1k(%BJq@$K6Z&LR0oN?`fB>5osn~WgMV8Bh6s%@4rOH zJK_Q+x+Ye|c_V+nwBF%4;pS_cBkozjvrR?X)!5L`)Y1++oRerCQzOD>mzU2{J_Ma+ zg`@t%{#;2*7&^isG!5r?pa54E)CtI2+GeozEKrN{@7To3()r$O;!KPfyTnIU-vD^241fXuRz&LnXNOL&3uB8f7h@sLz zN^Fzmy!wpGZfmGtA8!FVRQ?dg;o^pZ?rg;>D!n*6+ZYMAZd#SRnO+*-?|~qhTy)N9 zD{koQ8it_K;_B9&_s2f_0cwZE0-PL9db}|{W;3cVA*k!DC&{UE#Lba11|y{>H$dxz z4sFa>r9vl&j8Z3j9{(L=JaI^Z;n~*NaSZ30W3>xO5nHkIUqC}-H|iroJM_=T&zDtt z=ewDAGEanwz`p>?2h6%F5qyDBtOl_G5vyg26V(deAR42~rL&V%Zv=q?C&S4I@{eJJ zfA+}2ME{OC)Xg55`9c9cHuu9}&c{D0XHKFQ+>1obZ)e5lZQ2F`SU;9V7d$Tnu`{ML z8ZjK7UwG`{G`K>5mm5B&-!@N-1#D-)!J8ZbXmwAMGp;AJa}!jgzGKdI(VWM46qrM! z?s;@+GdF8=r227OIi(-a8YbrPtvd}P+xYBu^4+kBlyT5iuJdp+{*V3szqa514_r-C zv)8zeqkWXR#Z?ozK#_R~$-5I*h^Hrq$BOZG0y$?!+~#P!UuO-i}xTU}bpOwBP|$Xh}36NyU;Rv}l1JfeKp zMB{mRH0_|~U}weLdMFYQ)4Gz+H`-Xnx9@)9&E4kirZF0?ETq)CPQcl&8X%nITn#?k z05>oes#1fmXeu{QD5#Vfbzis9yYv)aAi}yf*%Q?h8Riz$sOQf3qU@r+6J>_hQTT3Y zD=|VpG+U`Cp&MlGKB*%dbcUGpfH~%+6q;_#Hxu> zotEZ?DIV@BF16J$UdaSdc~5dLj7)kzdap9jwC-Rj`_EIclXnwo$)1yH02Y@E(+eyy z6>H!xdbjp@LkMBcn!%^~HzseRnCSVfy(mzvKXBkaGK0Oj{{kA%&b&xl8eo0!o|w1t zcWY#$3KXK$@fyfQ1w4el6%WiMp-ZcKEr^tFW7_HXH2pnau&(fPU;J_7*RK)Et@7P+ zl5oO0J|6R($(Yv)J^AQ|>VQ4YKt*1C5=~AWFZWoZx{>J=;yEwgR4&y&4Civ2B=-`& zq+nWx1L*knV}n|RZ0WEJ3T3Y}JUlpk+)Y)0{a86lQTY+z(I64H_?*Fzy&?pk|yFa*QaldWCtKdjsB(VRY(zM}M=%+p4BFK>iEV z!q8mb(#$(x;nzUbhlIm?d9$T>mbHBm>|1^K?0$e49b64$1UBiVLd2%_TO3fwS=T(x z>!6I6-&%fEadGtAP%4})Gh}S3jHt(&Sw>vFQ;40>)%@t5wgfm-2JThB2Lhu+6$A}17!g;>?M3)nM%m;Eq7HS0UAq% zk(2ERS|$Qr?14>*6WePvj6x^7{cS3pa1ipvjPy3ZPIwY=CqT@iDe z+~D;9ELP?ET>g`RJ^JUB7Sz-;4ZfCBAIuMNrA8_yX~vqqj_#`Pv*{#snk*ve7b0D9 zKTD*OpEHf%p=)YZng|0I(hWguJi`<@MmtZtaCSbZHGZZSz^pAGohbzyiz)g>~WB$}MOmKCQFYWfgqFtQQl8RENcN6Ml3xz}NkBUd3gmIak>( zS8Qaoa&YD?@;@`cZF&(_;Gc7zcUv zY!lwBn(4FFt1`t|I@ShhiG1$U1~G)b>v1=1?#)%1BN7c}xaO$Bn{ko9rP#zPr>|0M zzJ*#*pzN)J2$__Kn3SjZ%h1*-tPb4(li!hKpJmX0RY3pgh?1Ra*bz`cpK@d0V5SBJ zzz#L1`8iuqIj!-SZ11C}{WoGh2%nr)J|0*a6cMSsWb8bDA;HkoJ#_E!U7z{uo#N7i zW?iDzch7)(rjGQj6hD2>$R`iX6~Q;jv=-pJ-1OI;=&fo3Z&d>hN_)kQOHcS(o*s>QpF%%nw>b$19zS-9yM zNova6k*O}MFMNA0yqKU>94mYuJLiT3jVU5z&tHufF`v3y?pZ%iRw-49KXPV?b@EB; zYv}ulrPgBrZHK&Kiihq5E<^AmB)PV*KRBBB^sUin9A3(LAKZA1G`S@v^uka!A<(h` z6^Uhh-QxD)x&8NFjaLj0$WrxEN>2C4X_c#HHbyp8uyZ~7J@lk`41S%cKm7%0!`ndE z?>&TyJ3gf#2*Xjcit35{2}DhuDw`uGT{-0q8M%w!B*atji$g>CrIRC`h??5SJ}&v( zwtg{Q9JVyt7${~4bj98+fM($-vxaDEkwv!a{(())fnBbQmq#u3UcLJq`%Jxmy8k>G z9@I?1F`qFx*A5ZNhJU*8wv}{Lb1Lic?rIMe4Bv~7f$DqrhRQv}%{C zSSu>aV+j@-D5yk`al_ABcyZFH9|H^C849X$s&Mkttu@U^OuZ&Yz2)Q!RYx=ah~dB@ zwiN>meFZ+rdlMcSsnFKYH$3nfJ#c3~Z@U`Io#4({8mi`_mAuRJvbCp`R|3F@9k$MH zkHY9mZo*Pwh2zh)62D?-yh3ip+rAjH1&AQJ4}dWFOhE3sCH1{NZi!ZT-fyc(gE&;1 zvkp8~8bfUp&%}8R1_=EuR(|WHByT+6GTxrVk3)dFtV%p}ul-6G2OZhVWLn;V0bW2N z4?Ry;+{K?ZYK@7V%T!MIYqc_M!J@Cb>G-bj0zA8kk>r;LGX&?wKM}Qr9CPioW_s4C zM#gVWo@NjIi}0%s=Q@LOHFgN`c&TEKOW7n_hDwx%P}e0fLXAJ-`pwn$Ln!#84)MMpg9zV+c1z?dvZ(Esns}KnSN^ZCItOhsL%46?A67aVHFP8rKV0siKRI#eteh?vOl4nroHJs z18a~8zp5|Fz$Un|O>4@*yjX^LNM_C^iT-l1xF+hae{%h~r&M$a#MX9LdhamjW)vg8XP+;_-tJbmh_H{tq6{u9>&9TJ7R|$R>V4wv znytoPhP@Y_ zubY-tZeu?rA!D3z>eNa6kz=TkSas^=NseSY@r?vMBFHRea`EAOmW79HUH_p4?A!(%w;o2QhrBqytt1*p9V?o zN%qqOx(N%ah)7uB7+2%VD>j$ld6g0e6<24q)vEFqzuoL;+-|Z&-}^|^girf)-BM@( z?f=2{5juhYlWiaVC%Z^6oDYV#%ehvmR^Mgzy)-dZ##@!1@Y94dmuaCLd-E zusCc)q>HZ{{-^v|wc}v_5p8z)`ud?B!pXwX#kLVq3!B^G%}Y#5k=KyNz#jKXC8Rjn zjZ_6H%#^|SQCO6;;uV#qYS;f8-s>&n1zB`gy^%dv)tXbLpR;8DtN4o*WAfTu-uv^K zc@$>jsHgw{ z>7Tbl=xSZDDN?Wd-aAUaF;dK-f8Z?tHr%OVArU3v2jhITVIHb3R>Auy_hWzR>?}#; z3rmzu6m!JuhqoN>oZSdsmF|kTjT7LYq*hV90#`>PW_+y{Cc@h{U3AENGArvB zwbyv@6t_asxk~jRe|wRokAa9HhB>O7TfnXwz*=n^yJ*(gB2J+VM)idwGYrR;ER(NY zmY~;+#|7weKOsYo5q(YVQ_^lsCbAmaV`R4|5o|ZWx%p zD0|WtlP+nnk;tJkOcl^^tZ<+swtB| z?g1+*(nS|v;x=o<=g6ytV&3{y?HX3O8214~LhE;xq39zGD9yrhf=H%3FRL5!RLkw> zvB?(q`P6BD)F{*AC+lI{$BmV;kMZROnw`&;3pZ>YnaFQi8rtCIa-7DK2fL|o#3Qk* z>%j0ClMX~|$1NzIit0aeyCC;;MDR6+k&b;Jrt@zoKB#q|^z_#2UlQc(FLG{Z;IsX| zS~>T3CKxu34u+vW+7_JVI;&ejG03TSs0HTvdQF>+&htjRp?0j%W#16P8FX4QhD#F26)`IK&5lV-yGI})IgwWAk6kgTlo$W3ovq|oXBH9s_#VW3+r>0U%bl5%Vix2Z`!q1vL`sN3x#^9l&GKK=SPNYM&*ib9*1bO#b z9389D4AIc7&u?~*Mxsl+x`M1xvBkG`H_`}}?b@g-qlR={DIA8@Y!;I_i~YQLbZD1N z-j6ygiiN%x;xB(1FCE@h4=KHG^n?5pr1M*LF{Q-PH!(A^qVEmY;cDoPZD)8!j!?xFq{RVsyHmP9ur2n?J z_*_DPj~Vm&Xb#i9aJrW=a7OHSDNz&+eUu3zupXAwqC1C!b-ktQnk(N|&8YNA@mb)x z)ijdep55kF_wvn zKIQtPoIyfHXyS6^u<>&GqSB2q>ql+c z=oxvDil`9ty@Zlk^V-o7Tj;6;BIEioV-dOjd#4!FJYs@}NN$;WM}u)Bqny7)i_|m* zc-r$8Rb}9Z3*rDX>SDMu&rU+ zpttLM_<{1d8n~y)eM&E!Xn}7@W*wE=5bkV(wate}*+)dFo(}(M%6B(G_I^MLthaD3 z`#=g;lB)}2-Y%YjBpL-cf@a~CWE%iLd z0<%B8^8aUuqCNawV`|RB@O5pqV<-`i!WwXt?c0+O+bdS0gHgPqI(ygT9*pMOGb7W} z1Ip7mRHUA@KV|-Rhjm$CP!Is{vt(9P!D!FS<*TH$edUfcPVr{K=cg5t8awKVtB{pN zM194bcrla38rFuWZ4v5ur;`RWPn`y#DM+rl2PprkmL?cY+s`@))>$Sz%K~q}sb^&w z+i#CqciSA}PR{%C)DkR+VQ)hxjB*gIa+kU_+A8}uDJfhpE=ZXqE!@49eM*30oCeE6 zHzb+Mts;VUP!u z`K=HH^*PvHzZ$EJvRjW$qC{`^`n6DrStU8|irYt|eVUG3R+%n0BAHReOzCFENuRg$ z%cqdD`1GdaH5V0b7g%jh^1)8BInzrVP>kojQVcA#7Q=RJ%WZntGhNEq2*T1ghlPK~ z=_}l5-#Btpo_RUUGVeO_3X+bCy@*|4_vrKCL#-cm=`etdatQKMx_L)Q0Vkc?wr;_3!jm;ilwRUoBxGfN4Ktwoua2(cwqJ*4!+4-D8p1SvK9)2fsDdRM7VWIGWYSQ?OiOxKtINjP79B{Equidistant Distribution - all segments will have the same length, you define only the Number of Segments. -
Scale Distribution - length of segments gradually changes depending on the Scale Factor, which is a ratio of the first segment length to the last segment length. +
Scale Distribution - length of segments gradually changes +depending on the Scale Factor, which is a ratio of the first +segment length to the last segment length.
+Length of segments changes in geometric progression with the common +ratio (A) depending on the Scale Factor (S) and Number of +Segments (N) as follows: A = S**(1/(N-1)). For an +edge of length L, length of the first segment is +L * (1 - A)/(1 - A**N). -\image html a-nbsegments2.png - -
Distribution with Table Density - you input a number of -pairs t - F(t), where \b t ranges from 0 to 1, and the module computes the -formula, which will rule the change of length of segments and shows -the curve in the plot. You can select the Conversion mode from -\b Exponent and Cut negative. -\image html distributionwithtabledensity.png +\image html a-nbsegments2.png
Distribution with Analytic Density - you input the formula, which will rule the change of length of segments and the module shows -the curve in the plot. +in the plot the density function curve in red and the node +distribution as blue crosses. \image html distributionwithanalyticdensity.png +
+\anchor analyticdensity_anchor +The node distribution is computed so that to have the density function +integral on the range between two nodes equal for all segments. +\image html analyticdensity.png + +
Distribution with Table Density - you input a number of +pairs t - F(t), where \b t ranges from 0 to 1, and the module computes the +formula, which will rule the change of length of segments and shows +in the plot the density function curve in red and the node +distribution as blue crosses. The node distribution is computed the +same way as for +\ref analyticdensity_anchor "Distribution with Analytic Density". You +can select the Conversion mode from\b Exponent and Cut +negative. + +\image html distributionwithtabledensity.png + See Also a sample TUI Script of a \ref tui_deflection_1d "Defining Number of Segments" hypothesis operation. +
\anchor start_and_end_length_anchor

Start and End Length hypothesis

diff --git a/doc/salome/gui/SMESH/input/additional_hypo.doc b/doc/salome/gui/SMESH/input/additional_hypo.doc index adccc49aa..5c5c204ef 100644 --- a/doc/salome/gui/SMESH/input/additional_hypo.doc +++ b/doc/salome/gui/SMESH/input/additional_hypo.doc @@ -93,7 +93,7 @@ computations. and edges, just hide the mesh to avoid this. To avoid a long wait when a geometry with many faces (or edges) is displayed, the number of faces (edges) shown at a time is limited by the value of "Sub-shapes - preview chunk size" preference (in Preferences/Mesh/General tab).
+ preview chunk size" preference (in Preferences/Mesh/General tab). If faces/edges without layers are specified, the element layers are not constructed on geometrical faces shared by several solids in 3D @@ -106,6 +106,15 @@ computations. possibly being internal faces/edges within the whole model. \image html viscous_layers_on_submesh.png 2D viscous layers constructed on boundary edges of a sub-mesh on a disk face. + If you use \b several hypotheses to define viscous layers on faces of + one solid, keep in mind the following. Each hypothesis defines a set + of faces with viscous layers (even if you specify faces without + layers). The sets of faces with viscous layers defined by several + hypotheses should not intersect, else the module won't add an + hypothesis that is incompatible with another one.
+ Also you can't define different number of layers on adjacent faces + of a solid.
+ This logic is also valid for the 2D hypothesis. diff --git a/doc/salome/gui/SMESH/input/constructing_meshes.doc b/doc/salome/gui/SMESH/input/constructing_meshes.doc index b4aa75ecb..232d4f524 100644 --- a/doc/salome/gui/SMESH/input/constructing_meshes.doc +++ b/doc/salome/gui/SMESH/input/constructing_meshes.doc @@ -29,10 +29,14 @@ \image html createmesh-inv.png
-
  • Select Mesh Type in the corresponding list from Any, Hexahedral, Tetrahedral, Triangular and \b Quadrilateral (there can be less items for lower dimensions). - - Selection of a mesh type hides any algorithms that are not able to create elements of this type.
  • - +
  • To filter off irrelevant meshing algorithms, you can + select Mesh Type in the corresponding list from Any, + Hexahedral, Tetrahedral, Triangular and \b Quadrilateral (there + can be less items for the geometry of lower dimensions). + + Selection of a mesh type hides all meshing algorithms that can not + generate elements of this type.
  • +
  • Apply \subpage basic_meshing_algos_page "meshing algorithms" and \subpage about_hypo_page "hypotheses" which will be used to compute this mesh. @@ -42,7 +46,8 @@ dimension of the CAD model (geometry) the algorithms listed on this page affect and the maximal dimension of elements the algorithms generate. For example, \b 3D page lists the algorithms that affect - 3D geometrical objects (solids). + 3D geometrical objects (solids) and generate 3D mesh elements + (tetrahedra, hexahedra etc.) \note - Some page(s) can be disabled if the source geometrical @@ -65,7 +70,6 @@ it is "Mesh_1". Then select the geometrical object you wish to mesh in the Object Browser and click "Select" button near \b Geometry field (if the name of the object has not yet appeared in \b Geometry field). -
    \image html image120.png "Select" button @@ -74,21 +78,22 @@ Now you can define 3D Algorithm and 3D Hypotheses, which will be applied to the solids of your geometrical object. Click the "Add Hypothesis" button to add a hypothesis. -
    \image html image121.png "Add Hypothesis" button
    + Click the "Plus" button to enable adding more additional hypotheses. Click the "Edit Hypothesis" button to change the values for the current hypothesis. -
    \image html image122.png "Edit Hypothesis" button
    - Most 2D and 3D algorithms can work without hypotheses using default meshing parameters. Some algorithms do not require any hypotheses. After selection of an algorithm "Hypothesis" field of + Most 2D and 3D algorithms can work without hypotheses using + default meshing parameters. Some algorithms do not require any + hypotheses. After selection of an algorithm "Hypothesis" field of the dialog can contain:
    • \ if the algorithm can work using default @@ -109,7 +114,10 @@ that any object has edges, even if their existence is not apparent, for example, a sphere has 4 edges). Note that the choice of hypotheses and lower dimension algorithms depends on - the higher dimension algorithm. + the higher dimension algorithm. + + If you wish you can select different algorithms and/or hypotheses + for meshing some parts of your CAD model by \ref constructing_submeshes_page. Some algorithms generate mesh of several dimensions, while others produce mesh of only one dimension. In the latter case there must @@ -128,8 +136,9 @@ It contains:
        +
      • a mesh name (Mesh_mechanic);
      • a reference to the geometrical object on the basis of - which the mesh has been constructed;
      • + which the mesh has been constructed (\a mechanic);
      • Applied hypotheses folder containing the references to the hypotheses applied at the construction of the mesh;
      • Applied algorithms folder containing the references diff --git a/doc/salome/gui/SMESH/input/constructing_submeshes.doc b/doc/salome/gui/SMESH/input/constructing_submeshes.doc index 917fd5f65..230903449 100644 --- a/doc/salome/gui/SMESH/input/constructing_submeshes.doc +++ b/doc/salome/gui/SMESH/input/constructing_submeshes.doc @@ -2,7 +2,7 @@ \page constructing_submeshes_page Constructing sub-meshes -Sub-mesh is a mesh on a geometrical sub-object created with algorithms +Sub-mesh is a mesh on a geometrical sub-object created with meshing algorithms and/or hypotheses other than the algorithms and hypotheses assigned to the parent mesh on the parent geometrical object. @@ -52,7 +52,7 @@ The following dialog box will appear: \par It allows to define the \b Name, the parent \b Mesh and the \b Geometry (e.g. a face if the parent mesh has been built on box) of the -sub-mesh. You can define algorithms and hypotheses in the same way as +sub-mesh. You can select meshing algorithms and hypotheses in the same way as in \ref constructing_meshes_page "Create mesh" menu. \par @@ -93,11 +93,13 @@ displayed as follows: \par It contains:
          -
        • a reference to the geometrical object on the basis of which the sub-mesh has been constructed;
        • +
        • a sub-mesh name (\a SubMeshFace1) +
        • a reference to the geometrical object on the basis of which the + sub-mesh has been constructed (Cylindrical Face_1);
        • Applied hypotheses folder containing the references to the -hypotheses applied to the construction of the sub-mesh;
        • +hypotheses selected at the construction of the sub-mesh;
        • Applied algorithms folder containing the references to the -algorithms applied to the construction of the sub-mesh.
        • +algorithms selected at the construction of the sub-mesh.

        See Also a sample TUI Script of a diff --git a/doc/salome/gui/SMESH/input/creating_groups.doc b/doc/salome/gui/SMESH/input/creating_groups.doc index 95adb8655..5dda220d1 100644 --- a/doc/salome/gui/SMESH/input/creating_groups.doc +++ b/doc/salome/gui/SMESH/input/creating_groups.doc @@ -40,31 +40,26 @@ the following ways: mesh. For this, turn on the Select All check box. In this mode all controls, which allow selecting the entities in other ways, are disabled.
      • -
      • By applying the Filter. The Set filter button allows to - define the filter for selection of the elements for your group. See more - about filters on the - \ref selection_filter_library_page "Selection filter library" page.
        - If the Enable manual edition check box is turned off, the - filter entirely defines the group contents. In this mode, the filter is - applied to all elements of the mesh. If there are no entities - corresponding to the filter, the \b Apply button is disabled.
        - If the Enable manual edition check box is turned on, the defined - filter can be used to for selection of entities for the group.
      • By choosing entities manually with the mouse in the 3D Viewer. For this, turn on the Enable manual edition check box. You can click on an element in the 3D viewer and it will be highlighted. After that click the \b Add button and the ID of this element will be - added to the list.
      • -
      • By adding entities from either a submesh or an existing + added to the list.
        + The Set filter button allows to define the filter for + selection of the elements for your group. See more about filters on + the \ref selection_filter_library_page "Selection filter library" + page.
      • +
      • By adding entities from either a sub-mesh or an existing group. For this, turn on the Enable manual edition check - box. Select from set of fields allows to select a submesh or + box. Select from set of fields allows to select a sub-mesh or a group of the appropriate type.
      In the manual edition mode you can
        -
      • click the \b Remove button to remove the selected elements from the list
      • +
      • click the \b Remove button to remove the selected list items from + the list.
      • click the Sort List button to sort the list of IDs of -mesh elements.
      • + mesh elements.
      \image html creategroup.png diff --git a/doc/salome/gui/SMESH/input/editing_meshes.doc b/doc/salome/gui/SMESH/input/editing_meshes.doc index 62685e557..4cc70553f 100644 --- a/doc/salome/gui/SMESH/input/editing_meshes.doc +++ b/doc/salome/gui/SMESH/input/editing_meshes.doc @@ -2,11 +2,11 @@ \page editing_meshes_page Editing Meshes -\n After you have created a mesh or submesh with definite applied -hypotheses and algorithms you can edit your mesh by \b assigning new -hypotheses and algorithms or \b unassigning the applied hypotheses and -algorithms. The editing proceeds in the same way as Mesh -Creation. +\n After you have created a mesh or sub-mesh with definite applied +meshing algorithms and hypotheses you can edit your mesh by \b assigning other +algorithms and/or hypotheses or \b unassigning the applied hypotheses and +algorithms. The editing proceeds in the same way as +\ref create_mesh_anchor "Mesh Creation". \image html createmesh-inv3.png @@ -26,4 +26,4 @@ changes if we apply different algorithms to it.
      See Also a sample TUI Script of an \ref tui_editing_mesh "Edit Mesh" operation. -*/ \ No newline at end of file +*/ diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index 059170dcb..593272ab0 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -88,19 +88,19 @@ module SMESH typedef sequence log_array; struct PointStruct { double x; - double y; - double z; } ; + double y; + double z; } ; typedef sequence nodes_array; struct DirStruct { PointStruct PS ; } ; // analog to OCCT gp_Vec struct AxisStruct { double x; - double y; - double z; - double vx; - double vy; - double vz; } ; + double y; + double z; + double vx; + double vy; + double vz; } ; /*! * Node location on a shape */ @@ -215,7 +215,8 @@ module SMESH HYP_BAD_DIM, // bad dimension HYP_BAD_SUBSHAPE, // shape is neither the main one, nor its sub-shape, nor a group HYP_BAD_GEOMETRY, // geometry mismatches algorithm's expectation - HYP_NEED_SHAPE // algorithm can work on shape only + HYP_NEED_SHAPE, // algorithm can work on shape only + HYP_INCOMPAT_HYPS // several additional hypotheses are incompatible one with other }; /*! @@ -389,7 +390,7 @@ module SMESH * Create a group */ SMESH_Group CreateGroup( in ElementType elem_type, - in string name ) + in string name ) raises (SALOME::SALOME_Exception); /*! @@ -508,31 +509,29 @@ module SMESH raises (SALOME::SALOME_Exception); /*! - * Add hypothesis to the mesh, under a particular Sub-shape + * Add hypothesis to the mesh, under a particular sub-shape * (or the main shape itself) - * The Add method is only used to prepare the build of the mesh and store + * This method is only used to prepare the build of the mesh and store * the algorithms and associated parameters. - * Actual job of mesh the shape is done by MESH_Gen. + * Actual job of meshing the shape is done by SMESH_Gen::Compute() * @params - * - aSubShape : sub-shape obtained by a shape explode in GEOM + * - aSubObject : sub-shape obtained by a shape explode in GEOM * (or main shape) - * - anHyp : hypothesis object + * - anHyp : an hypothesis object * @return - * - OK if the hypothesis is compatible with the sub-shape - * (and all previous hypothesis on the sub-shape) - * - NOK if the hypothesis is not compatible with the sub-shape - * (or one previous hypothesis on the sub-shape) - * raises exception if hypothesis has not been created + * - An enum item explaining what's up + * - anErrorText: an optional textual description of a problem (if any) */ Hypothesis_Status AddHypothesis(in GEOM::GEOM_Object aSubObject, - in SMESH_Hypothesis anHyp) + in SMESH_Hypothesis anHyp, + out string anErrorText) raises (SALOME::SALOME_Exception); /*! * Remove an hypothesis previouly added with AddHypothesis. */ Hypothesis_Status RemoveHypothesis(in GEOM::GEOM_Object aSubObject, - in SMESH_Hypothesis anHyp) + in SMESH_Hypothesis anHyp) raises (SALOME::SALOME_Exception); /*! diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index 6bab9ef29..4ffa049b7 100755 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -44,6 +44,8 @@ SET(SMESH_RESOURCES_FILES mesh_hypo_segment.png mesh_hypo_volume.png mesh_hypo_edit.png + mesh_plus.png + mesh_minus.png mesh_info.png advanced_mesh_info.png standard_mesh_info.png diff --git a/resources/mesh_minus.png b/resources/mesh_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..884e6b4f94f2d8282a0336a9fc4cbf4944d53d0b GIT binary patch literal 529 zcmV+s0`C2ZP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^z_ z4HqLZdPOk+00EInL_t(I%dM0#Puoxs$A5k{`1xW=6wwHZP=|o}2@rFYjW2=JfgOp3 z33cn1&jB;vp(_g;OOcQ|bx0JOM}l9MOKMqm5;gp#(>)s3?6lB|oX=Ml|CU2mxP-`-*>8Yyce~o&|y>3BmByzyVvVQ`hTjSR#`C%Z1ns6J>U;8T~=^38YO9(iijj4Vnie;&(P`&URLd|+wGEN z8Ab7Lq*;~)v%$X3g5PhS{%e3g&b|Qb1EJBj%{q#B?*YC7`{o^$-Ui;HKLHMa-BzphAR=Bw-jXC4CQ0H|tX1s__#6Sb3UdjZ0G&L~w*YCP634Lxe(TC@ z1JBO6U%*QQ41wu*JbnZ=Rjq|^&eereB{zpvGr*3uwrOKJrCsg-AAud_NpIN9r))BSKN#P0w!Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^z_ z4HG*?dKhB>00GuXL_t(I%e~Y;PZVJg2Jqi4cXGF!8Z|kCN}*zNHbi1UX^4##egzZl z>5MVaZ$JrO!A28edzCS^+7K%g5HS%2`L|i|c5U7>>*WqeFitZ2=G~cjGV{(eQ_@48 zJX?;^Us()kx}VJ4yOtHqQQ_S0j*a{$iKeEehLQJC7{@S1QR@Vj`v7La+1B**UxrgN zGn&oji-m=S$B5Cu4wB=P`~%lf>BcBtDmWW7%Cc;)A6lBGYiI}G3)m|HR#BOpoE*mY zpxONV{QG`@+uPgf_4@5Nj>qFTUXJ5smOt8ZT(7jP7BN*KZZ(9lpT&+}%X1WA(g zBz7NpgxBT3@Sk`Z$a*zUX#@9rMGg)Qw(vDfRE*U$O_#7y#un`E?k?g4*0EWu)g}%o z?@XGeufhy(;0w;7UJlv8BG!V#-8|1%4gmZRbRf)p1s}0f?D9a!u8wzyG@uszN3a=6 zZ=+h=Hs68+e1>YZsxdqJr%B=c;7S;ZR>*EWJY7;cAd9i!G=a-qw&%EkSK+>N*govY k4n866`rpJ#X9pJLH{4j1FT*0;1ONa407*qoM6N<$f~<)NU;qFB literal 0 HcmV?d00001 diff --git a/src/SMESH/SMESH_Algo.hxx b/src/SMESH/SMESH_Algo.hxx index 348c34df0..4e5dc4afc 100644 --- a/src/SMESH/SMESH_Algo.hxx +++ b/src/SMESH/SMESH_Algo.hxx @@ -138,6 +138,8 @@ class SMESH_EXPORT SMESH_Algo : public SMESH_Hypothesis * \param aShape - the shape * \param aStatus - check result * \retval bool - true if hypothesis is well defined + * + * Textual description of a problem can be stored in _comment field. */ virtual bool CheckHypothesis(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape, diff --git a/src/SMESH/SMESH_Hypothesis.hxx b/src/SMESH/SMESH_Hypothesis.hxx index 215f11471..4454410c4 100644 --- a/src/SMESH/SMESH_Hypothesis.hxx +++ b/src/SMESH/SMESH_Hypothesis.hxx @@ -63,7 +63,8 @@ public: HYP_BAD_DIM, // bad dimension HYP_BAD_SUBSHAPE, // shape is neither the main one, nor its sub-shape, nor a group HYP_BAD_GEOMETRY, // shape geometry mismatches algorithm's expectation - HYP_NEED_SHAPE // algorithm can work on shape only + HYP_NEED_SHAPE, // algorithm can work on shape only + HYP_INCOMPAT_HYPS // several additional hypotheses are incompatible one with other }; static bool IsStatusFatal(Hypothesis_Status theStatus) { return theStatus >= HYP_UNKNOWN_FATAL; } diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index dcdf7fe3f..7692f9f0e 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -601,12 +601,16 @@ SMESH_ComputeErrorPtr SMESH_Mesh::GMFToMesh(const char* theFileName, //============================================================================= SMESH_Hypothesis::Hypothesis_Status - SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, - int anHypId ) throw(SALOME_Exception) +SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, + int anHypId, + std::string* anError ) throw(SALOME_Exception) { Unexpect aCatch(SalomeException); if(MYDEBUG) MESSAGE("SMESH_Mesh::AddHypothesis"); + if ( anError ) + anError->clear(); + SMESH_subMesh *subMesh = GetSubMesh(aSubShape); if ( !subMesh || !subMesh->GetId()) return SMESH_Hypothesis::HYP_BAD_SUBSHAPE; @@ -631,23 +635,36 @@ SMESH_Hypothesis::Hypothesis_Status } } - // shape + // shape - bool isAlgo = ( !anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO ); - int event = isAlgo ? SMESH_subMesh::ADD_ALGO : SMESH_subMesh::ADD_HYP; + bool isAlgo = ( anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO ); + int event = isAlgo ? SMESH_subMesh::ADD_ALGO : SMESH_subMesh::ADD_HYP; SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); + if ( anError && SMESH_Hypothesis::IsStatusFatal(ret) && subMesh->GetComputeError() ) + *anError = subMesh->GetComputeError()->myComment; + // sub-shapes - if (!SMESH_Hypothesis::IsStatusFatal(ret) && - anHyp->GetDim() <= SMESH_Gen::GetShapeDim(aSubShape)) // is added on father + if ( !SMESH_Hypothesis::IsStatusFatal(ret) && + anHyp->GetDim() <= SMESH_Gen::GetShapeDim(aSubShape)) // is added on father { event = isAlgo ? SMESH_subMesh::ADD_FATHER_ALGO : SMESH_subMesh::ADD_FATHER_HYP; SMESH_Hypothesis::Hypothesis_Status ret2 = - subMesh->SubMeshesAlgoStateEngine(event, anHyp); + subMesh->SubMeshesAlgoStateEngine(event, anHyp, /*exitOnFatal=*/true); if (ret2 > ret) + { ret = ret2; + if ( SMESH_Hypothesis::IsStatusFatal( ret )) + { + if ( anError && subMesh->GetComputeError() ) + *anError = subMesh->GetComputeError()->myComment; + // remove anHyp + event = isAlgo ? SMESH_subMesh::REMOVE_ALGO : SMESH_subMesh::REMOVE_HYP; + subMesh->AlgoStateEngine(event, anHyp); + } + } // check concurent hypotheses on ancestors if (ret < SMESH_Hypothesis::HYP_CONCURENT && !isGlobalHyp ) @@ -892,16 +909,19 @@ int SMESH_Mesh::GetHypotheses(const SMESH_subMesh * aSubMesh, const TopoDS_Shape & aSubShape = aSubMesh->GetSubShape(); const list& hypList = _myMeshDS->GetHypothesis(aSubShape); for ( hyp = hypList.begin(); hyp != hypList.end(); hyp++ ) - if ( aFilter.IsOk (cSMESH_Hyp( *hyp ), aSubShape) && - ( cSMESH_Hyp(*hyp)->IsAuxiliary() || !mainHypFound ) && - hypTypes.insert( (*hyp)->GetName() ).second ) + { + const SMESH_Hypothesis* h = cSMESH_Hyp( *hyp ); + if (( aFilter.IsOk( h, aSubShape )) && + ( h->IsAuxiliary() || !mainHypFound ) && + ( h->IsAuxiliary() || hypTypes.insert( h->GetName() ).second )) { aHypList.push_back( *hyp ); nbHyps++; - if ( !cSMESH_Hyp(*hyp)->IsAuxiliary() ) + if ( !h->IsAuxiliary() ) mainHypFound = true; if ( assignedTo ) assignedTo->push_back( aSubShape ); } + } } // get hypos from ancestors of aSubShape @@ -918,16 +938,19 @@ int SMESH_Mesh::GetHypotheses(const SMESH_subMesh * aSubMesh, const TopoDS_Shape& curSh = (*smIt)->GetSubShape(); const list& hypList = _myMeshDS->GetHypothesis(curSh); for ( hyp = hypList.begin(); hyp != hypList.end(); hyp++ ) - if (( aFilter.IsOk( cSMESH_Hyp( *hyp ), curSh )) && - ( cSMESH_Hyp(*hyp)->IsAuxiliary() || !mainHypFound ) && - ( hypTypes.insert( (*hyp)->GetName() ).second )) + { + const SMESH_Hypothesis* h = cSMESH_Hyp( *hyp ); + if (( aFilter.IsOk( h, curSh )) && + ( h->IsAuxiliary() || !mainHypFound ) && + ( h->IsAuxiliary() || hypTypes.insert( h->GetName() ).second )) { aHypList.push_back( *hyp ); nbHyps++; - if ( !cSMESH_Hyp(*hyp)->IsAuxiliary() ) + if ( !h->IsAuxiliary() ) mainHypFound = true; if ( assignedTo ) assignedTo->push_back( curSh ); } + } } } return nbHyps; diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx index 1e92a4871..0cf3e0949 100644 --- a/src/SMESH/SMESH_Mesh.hxx +++ b/src/SMESH/SMESH_Mesh.hxx @@ -126,7 +126,7 @@ public: bool theMakeRequiredGroups = true ); SMESH_Hypothesis::Hypothesis_Status - AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId) + AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId, std::string* error=0) throw(SALOME_Exception); SMESH_Hypothesis::Hypothesis_Status diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index 5edc28da0..59294a54c 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -670,11 +670,17 @@ bool SMESH_subMesh::IsApplicableHypotesis(const SMESH_Hypothesis* theHypothesis, return false; } -//============================================================================= +//================================================================================ /*! - * + * \brief Treats modification of hypotheses definition + * \param [in] event - what happens + * \param [in] anHyp - a hypothesis + * \return SMESH_Hypothesis::Hypothesis_Status - a treatment result. + * + * Optional description of a problematic situation (if any) can be retrieved + * via GetComputeError(). */ -//============================================================================= +//================================================================================ SMESH_Hypothesis::Hypothesis_Status SMESH_subMesh::AlgoStateEngine(int event, SMESH_Hypothesis * anHyp) @@ -753,7 +759,7 @@ SMESH_Hypothesis::Hypothesis_Status if ( ! CanAddHypothesis( anHyp )) // check dimension return SMESH_Hypothesis::HYP_BAD_DIM; - if ( /*!anHyp->IsAuxiliary() &&*/ getSimilarAttached( _subShape, anHyp ) ) + if ( !anHyp->IsAuxiliary() && getSimilarAttached( _subShape, anHyp ) ) return SMESH_Hypothesis::HYP_ALREADY_EXIST; if ( !meshDS->AddHypothesis(_subShape, anHyp)) @@ -782,6 +788,9 @@ SMESH_Hypothesis::Hypothesis_Status if (!isApplicableHyp) return ret; // not applicable hypotheses do not change algo state + if (( algo = GetAlgo())) + algo->InitComputeError(); + switch (_algoState) { @@ -946,7 +955,7 @@ SMESH_Hypothesis::Hypothesis_Status // ret should be fatal: anHyp was not added ret = SMESH_Hypothesis::HYP_INCOMPATIBLE; } - else if (!_father->IsUsedHypothesis( anHyp, this )) + else if (!_father->IsUsedHypothesis( anHyp, this )) ret = SMESH_Hypothesis::HYP_INCOMPATIBLE; if (SMESH_Hypothesis::IsStatusFatal( ret )) @@ -1114,6 +1123,11 @@ SMESH_Hypothesis::Hypothesis_Status } } + if ( _algo ) { // get an error description set by _algo->CheckHypothesis() + _computeError = _algo->GetComputeError(); + _algo->InitComputeError(); + } + bool stateChange = ( _algoState != oldAlgoState ); if ( stateChange && _algoState == HYP_OK ) // hyp becomes OK @@ -1141,8 +1155,8 @@ SMESH_Hypothesis::Hypothesis_Status ComputeSubMeshStateEngine( CHECK_COMPUTE_STATE ); } - if (stateChange || modifiedHyp) - ComputeStateEngine(MODIF_ALGO_STATE); + if ( stateChange || modifiedHyp ) + ComputeStateEngine( MODIF_ALGO_STATE ); _realComputeCost = ( _algoState == HYP_OK ) ? computeCost() : 0; @@ -1213,14 +1227,24 @@ void SMESH_subMesh::setAlgoState(algo_state state) _algoState = state; } -//============================================================================= +//================================================================================ /*! + * \brief Send an event to sub-meshes + * \param [in] event - the event + * \param [in] anHyp - an hypothesis + * \param [in] exitOnFatal - to stop iteration on sub-meshes if a sub-mesh + * reports a fatal result + * \return SMESH_Hypothesis::Hypothesis_Status - the worst result * + * Optional description of a problematic situation (if any) can be retrieved + * via GetComputeError(). */ -//============================================================================= +//================================================================================ + SMESH_Hypothesis::Hypothesis_Status - SMESH_subMesh::SubMeshesAlgoStateEngine(int event, - SMESH_Hypothesis * anHyp) + SMESH_subMesh::SubMeshesAlgoStateEngine(int event, + SMESH_Hypothesis * anHyp, + bool exitOnFatal) { SMESH_Hypothesis::Hypothesis_Status ret = SMESH_Hypothesis::HYP_OK; //EAP: a wire (dim==1) should notify edges (dim==1) @@ -1229,10 +1253,16 @@ SMESH_Hypothesis::Hypothesis_Status { SMESH_subMeshIteratorPtr smIt = getDependsOnIterator(false,false); while ( smIt->more() ) { - SMESH_Hypothesis::Hypothesis_Status ret2 = - smIt->next()->AlgoStateEngine(event, anHyp); + SMESH_subMesh* sm = smIt->next(); + SMESH_Hypothesis::Hypothesis_Status ret2 = sm->AlgoStateEngine(event, anHyp); if ( ret2 > ret ) + { ret = ret2; + _computeError = sm->_computeError; + sm->_computeError.reset(); + if ( exitOnFatal && SMESH_Hypothesis::IsStatusFatal( ret )) + break; + } } } return ret; diff --git a/src/SMESH/SMESH_subMesh.hxx b/src/SMESH/SMESH_subMesh.hxx index 59c700ec2..6d38841e0 100644 --- a/src/SMESH/SMESH_subMesh.hxx +++ b/src/SMESH/SMESH_subMesh.hxx @@ -218,10 +218,10 @@ public: AlgoStateEngine(int event, SMESH_Hypothesis * anHyp); SMESH_Hypothesis::Hypothesis_Status - SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp); + SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp, bool exitOnFatal=false); algo_state GetAlgoState() const { return _algoState; } - compute_state GetComputeState() const { return _computeState; }; + compute_state GetComputeState() const { return _computeState; } SMESH_ComputeErrorPtr& GetComputeError() { return _computeError; } void DumpAlgoState(bool isMain); diff --git a/src/SMESHDS/SMESHDS_Hypothesis.cxx b/src/SMESHDS/SMESHDS_Hypothesis.cxx index a5851a204..6e4376142 100644 --- a/src/SMESHDS/SMESHDS_Hypothesis.cxx +++ b/src/SMESHDS/SMESHDS_Hypothesis.cxx @@ -103,3 +103,14 @@ bool SMESHDS_Hypothesis::operator==(const SMESHDS_Hypothesis& other) const ((SMESHDS_Hypothesis*)&other)->SaveTo(otherSave); return mySave.str() == otherSave.str(); } + +//================================================================================ +/*! + * \brief Compare types of hypotheses + */ +//================================================================================ + +bool SMESHDS_Hypothesis::IsSameName( const SMESHDS_Hypothesis& other) const +{ + return _name == other._name; +} diff --git a/src/SMESHDS/SMESHDS_Hypothesis.hxx b/src/SMESHDS/SMESHDS_Hypothesis.hxx index ea01d617a..5e4165048 100644 --- a/src/SMESHDS/SMESHDS_Hypothesis.hxx +++ b/src/SMESHDS/SMESHDS_Hypothesis.hxx @@ -48,6 +48,7 @@ class SMESHDS_EXPORT SMESHDS_Hypothesis virtual std::ostream & SaveTo(std::ostream & save)=0; virtual std::istream & LoadFrom(std::istream & load)=0; + bool IsSameName( const SMESHDS_Hypothesis& other) const; virtual bool operator==(const SMESHDS_Hypothesis& other) const; bool operator!=(const SMESHDS_Hypothesis& other) const { return !(*this==other); } diff --git a/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx b/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx index 878163738..379ed1b2b 100644 --- a/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx @@ -91,21 +91,25 @@ namespace SMESH QList myListOfHypothesesSets; - void processHypothesisStatus(const int theHypStatus, + void processHypothesisStatus(const int theHypStatus, SMESH::SMESH_Hypothesis_ptr theHyp, - const bool theIsAddition) + const bool theIsAddition, + const char* theError = 0) { if (theHypStatus > SMESH::HYP_OK) { // get Hyp name QString aHypName ("NULL Hypothesis"); if (!CORBA::is_nil(theHyp)) { _PTR(SObject) Shyp = SMESH::FindSObject(theHyp); - if (Shyp) + if (Shyp) { // name in study aHypName = Shyp->GetName().c_str(); - else + } + else { // label in xml file - aHypName = GetHypothesisData(theHyp->GetName())->Label; + CORBA::String_var hypType = theHyp->GetName(); + aHypName = GetHypothesisData( hypType.in() )->Label; + } } // message @@ -116,12 +120,22 @@ namespace SMESH else aMsg = (isFatal ? "SMESH_CANT_RM_HYP" : "SMESH_RM_HYP_WRN"); - aMsg = QObject::tr(aMsg.toLatin1().data()).arg(aHypName) + - QObject::tr(QString("SMESH_HYP_%1").arg(theHypStatus).toLatin1().data()); + aMsg = QObject::tr(aMsg.toLatin1().data()).arg(aHypName); - if ( theHypStatus == SMESH::HYP_HIDDEN_ALGO ) // PAL18501 - aMsg = aMsg.arg( GetHypothesisData(theHyp->GetName())->Dim[0] ); + if ( theError && theError[0] ) + { + aMsg += theError; + } + else + { + QObject::tr(QString("SMESH_HYP_%1").arg(theHypStatus).toLatin1().data()); + if ( theHypStatus == SMESH::HYP_HIDDEN_ALGO ) { // PAL18501 + CORBA::String_var hypType = theHyp->GetName(); + if ( HypothesisData* hd = GetHypothesisData( hypType.in() )) + aMsg = aMsg.arg( hd->Dim[0] ); + } + } SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), aMsg); @@ -520,7 +534,8 @@ namespace SMESH _PTR(SObject) SM = SMESH::FindSObject(aMesh); GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh(SM); try { - res = aMesh->AddHypothesis(aShapeObject, aHyp); + CORBA::String_var error; + res = aMesh->AddHypothesis(aShapeObject, aHyp, error.out()); if (res < SMESH::HYP_UNKNOWN_FATAL) { _PTR(SObject) aSH = SMESH::FindSObject(aHyp); if (SM && aSH) { @@ -529,7 +544,7 @@ namespace SMESH } if (res > SMESH::HYP_OK) { wc.suspend(); - processHypothesisStatus(res, aHyp, true); + processHypothesisStatus(res, aHyp, true, error.in() ); wc.resume(); } } @@ -554,8 +569,10 @@ namespace SMESH SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); _PTR(SObject) SsubM = SMESH::FindSObject(aSubMesh); GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh(SsubM); - if (!aMesh->_is_nil() && SsubM && !aShapeObject->_is_nil()) { - res = aMesh->AddHypothesis(aShapeObject, aHyp); + if (!aMesh->_is_nil() && SsubM && !aShapeObject->_is_nil()) + { + CORBA::String_var error; + res = aMesh->AddHypothesis( aShapeObject, aHyp, error.out() ); if (res < SMESH::HYP_UNKNOWN_FATAL) { _PTR(SObject) meshSO = SMESH::FindSObject(aMesh); if (meshSO) @@ -563,7 +580,7 @@ namespace SMESH } if (res > SMESH::HYP_OK) { wc.suspend(); - processHypothesisStatus(res, aHyp, true); + processHypothesisStatus( res, aHyp, true, error.in() ); wc.resume(); } } diff --git a/src/SMESHGUI/SMESHGUI_MeshDlg.cxx b/src/SMESHGUI/SMESHGUI_MeshDlg.cxx index 682673205..f3a2719d4 100644 --- a/src/SMESHGUI/SMESHGUI_MeshDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshDlg.cxx @@ -32,16 +32,19 @@ #include // Qt includes -#include +#include +#include #include -#include -#include #include -#include -#include +#include +#include #include -#include #include +#include +#include +#include + +#include #define SPACING 6 #define MARGIN 11 @@ -65,62 +68,81 @@ SMESHGUI_MeshTab::SMESHGUI_MeshTab( QWidget* theParent ) SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); QIcon aCreateIcon( aResMgr->loadPixmap( "SMESH", tr( "ICON_HYPO" ) ) ); QIcon aEditIcon( aResMgr->loadPixmap( "SMESH", tr( "ICON_HYPO_EDIT" ) ) ); + QIcon aPlusIcon( aResMgr->loadPixmap( "SMESH", tr( "ICON_PLUS" ) ) ); + QIcon aMinusIcon( aResMgr->loadPixmap( "SMESH", tr( "ICON_MINUS" ) ) ); // Algorifm QLabel* anAlgoLbl = new QLabel( tr( "ALGORITHM" ), this ); - myHyp[ Algo ] = new QComboBox( this ); + myHypCombo[ Algo ] = new QComboBox( this ); // Hypothesis QLabel* aHypLbl = new QLabel( tr( "HYPOTHESIS" ), this ); - myHyp[ MainHyp ] = new QComboBox( this ); - myHyp[ MainHyp ]->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); - myCreateHyp[ MainHyp ] = new QToolButton( this ); - myCreateHyp[ MainHyp ]->setIcon( aCreateIcon ); - myEditHyp[ MainHyp ] = new QToolButton( this ); - myEditHyp[ MainHyp ]->setIcon( aEditIcon ); - + myHypCombo[ MainHyp ] = new QComboBox( this ); + myHypCombo[ MainHyp ]->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); + myCreateHypBtn[ MainHyp ] = new QToolButton( this ); + myCreateHypBtn[ MainHyp ]->setIcon( aCreateIcon ); + myEditHypBtn[ MainHyp ] = new QToolButton( this ); + myEditHypBtn[ MainHyp ]->setIcon( aEditIcon ); + // Line QFrame* aLine = new QFrame( this ); aLine->setFrameStyle( QFrame::HLine | QFrame::Sunken ); - + // Add. hypothesis QLabel* anAddHypLbl = new QLabel( tr( "ADD_HYPOTHESIS" ), this ); - myHyp[ AddHyp ] = new QComboBox( this ); - myHyp[ AddHyp ]->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); - myCreateHyp[ AddHyp ] = new QToolButton( this ); - myCreateHyp[ AddHyp ]->setIcon( aCreateIcon ); - myEditHyp[ AddHyp ] = new QToolButton( this ); - myEditHyp[ AddHyp ]->setIcon( aEditIcon ); - + myHypCombo[ AddHyp ] = new QComboBox( this ); + myHypCombo[ AddHyp ]->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); + myCreateHypBtn[ AddHyp ] = new QToolButton( this ); + myCreateHypBtn[ AddHyp ]->setIcon( aCreateIcon ); + myEditHypBtn[ AddHyp ] = new QToolButton( this ); + myEditHypBtn[ AddHyp ]->setIcon( aEditIcon ); + myEditHypBtn[ MoreAddHyp ] = new QToolButton( this ); + myEditHypBtn[ MoreAddHyp ]->setIcon( aEditIcon ); + + myAddHypList = new QListWidget( this ); + myMoreAddHypBtn = new QToolButton( this ); + myMoreAddHypBtn->setIcon( aPlusIcon ); + myLessAddHypBtn = new QToolButton( this ); + myLessAddHypBtn->setIcon( aMinusIcon ); + // Fill layout QGridLayout* aLay = new QGridLayout( this ); aLay->setMargin( MARGIN ); aLay->setSpacing( SPACING ); aLay->addWidget( anAlgoLbl, 0, 0 ); - aLay->addWidget( myHyp[ Algo ], 0, 1 ); + aLay->addWidget( myHypCombo[ Algo ], 0, 1 ); aLay->addWidget( aHypLbl, 1, 0 ); - aLay->addWidget( myHyp[ MainHyp ], 1, 1 ); - aLay->addWidget( myCreateHyp[ MainHyp ], 1, 2 ); - aLay->addWidget( myEditHyp[ MainHyp ], 1, 3 ); + aLay->addWidget( myHypCombo[ MainHyp ], 1, 1 ); + aLay->addWidget( myCreateHypBtn[ MainHyp ], 1, 2 ); + aLay->addWidget( myEditHypBtn[ MainHyp ], 1, 3 ); aLay->addWidget( aLine, 2, 0, 1, 4 ); aLay->addWidget( anAddHypLbl, 3, 0 ); - aLay->addWidget( myHyp[ AddHyp ], 3, 1 ); - aLay->addWidget( myCreateHyp[ AddHyp ], 3, 2 ); - aLay->addWidget( myEditHyp[ AddHyp ], 3, 3 ); - aLay->addItem( new QSpacerItem( 0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding ), 4, 0 ); - + aLay->addWidget( myHypCombo[ AddHyp ], 3, 1 ); + aLay->addWidget( myCreateHypBtn[ AddHyp ], 3, 2 ); + aLay->addWidget( myEditHypBtn[ AddHyp ], 3, 3 ); + aLay->addWidget( myAddHypList, 4, 1, 2, 1 ); + aLay->addWidget( myMoreAddHypBtn, 4, 2 ); + aLay->addWidget( myEditHypBtn[ MoreAddHyp ], 4, 3 ); + aLay->addWidget( myLessAddHypBtn, 5, 2 ); + aLay->addItem( new QSpacerItem( 0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding ), 6, 0 ); + // Connect signals and slots for ( int i = MainHyp; i <= AddHyp; i++ ) { - connect( myCreateHyp[ i ], SIGNAL( clicked() ) , SLOT( onCreateHyp() ) ); - connect( myEditHyp[ i ] , SIGNAL( clicked() ) , SLOT( onEditHyp() ) ); - connect( myHyp[ i ] , SIGNAL( activated( int ) ), SLOT( onHyp( int ) ) ); + connect( myCreateHypBtn[ i ], SIGNAL( clicked() ) , SLOT( onCreateHyp() ) ); + connect( myEditHypBtn[ i ] , SIGNAL( clicked() ) , SLOT( onEditHyp() ) ); + connect( myHypCombo[ i ] , SIGNAL( activated( int ) ), SLOT( onHyp( int ) ) ); } - connect( myHyp[ Algo ], SIGNAL( activated( int ) ), SLOT( onHyp( int ) ) ); - + connect( myHypCombo[ Algo ], SIGNAL( activated( int ) ), SLOT( onHyp( int ) ) ); + + connect( myAddHypList, SIGNAL( currentRowChanged( int ) ), SLOT( onHyp( int ) ) ); + connect( myEditHypBtn[ MoreAddHyp ], SIGNAL( clicked() ), SLOT( onEditHyp() ) ); + connect( myMoreAddHypBtn, SIGNAL( clicked() ), SLOT( onMoreAddHyp() )); + connect( myLessAddHypBtn, SIGNAL( clicked() ), SLOT( onLessAddHyp() )); + // Initialize controls - + setAvailableHyps( Algo, QStringList() ); setAvailableHyps( MainHyp, QStringList() ); setAvailableHyps( AddHyp, QStringList() ); @@ -135,6 +157,49 @@ SMESHGUI_MeshTab::~SMESHGUI_MeshTab() { } +//================================================================================ +/*! + * \brief Adds an item in a control corresponding to \a type + * \param [in] txt - item text + * \param [in] type - HypType + * \param [in] index - index of item in a list of items + */ +//================================================================================ + +void SMESHGUI_MeshTab::addItem( const QString& txt, const int type, const int index ) +{ + if ( type <= AddHyp ) + { + myHypCombo[ type ]->addItem( txt, QVariant( index )); + } + else + { + QListWidgetItem* item = new QListWidgetItem( txt, myAddHypList ); + item->setData( Qt::UserRole, QVariant( index )); + } +} + +//================================================================================ +/*! + * \brief Returns index of hyp of a given type + */ +//================================================================================ + +int SMESHGUI_MeshTab::getCurrentIndex( const int type, const bool curByType ) const +{ + if ( type <= AddHyp ) + { + return myHypCombo[ type ]->itemData( myHypCombo[ type ]->currentIndex() ).toInt(); + } + else + { + int row = curByType ? ( type - AddHyp - 1 ) : myAddHypList->currentRow(); + if ( QListWidgetItem* item = myAddHypList->item( row )) + return item->data( Qt::UserRole ).toInt(); + } + return -1; +} + //================================================================================ /*! * \brief Sets available hypothesis or algorithms @@ -146,25 +211,26 @@ SMESHGUI_MeshTab::~SMESHGUI_MeshTab() //================================================================================ void SMESHGUI_MeshTab::setAvailableHyps( const int theId, const QStringList& theHyps ) { - myAvailableHyps[ theId ] = theHyps; + myAvailableHypTypes[ theId ] = theHyps; bool enable = ! theHyps.isEmpty(); if ( theId == Algo ) // fill list of algos { - myHyp[ Algo ]->clear(); + myHypCombo[ Algo ]->clear(); if ( enable ) { - myHyp[ Algo ]->addItem( tr( "NONE" ) ); - myHyp[ Algo ]->addItems( theHyps ); - myHyp[ Algo ]->setCurrentIndex( 0 ); + addItem( tr( "NONE"), Algo, 0 ); + for ( int i = 0, nbHyp = theHyps.count(); i < nbHyp; ++i ) + addItem( theHyps[i], Algo, i+1 ); + myHypCombo[ Algo ]->setCurrentIndex( 0 ); } } else // enable buttons { - myCreateHyp[ theId ]->setEnabled( enable ); - myEditHyp [ theId ]->setEnabled( false ); + myCreateHypBtn[ theId ]->setEnabled( enable ); + myEditHypBtn [ theId ]->setEnabled( false ); } - myHyp[ theId ]->setEnabled( enable ); + myHypCombo[ theId ]->setEnabled( enable ); } //================================================================================ @@ -172,7 +238,7 @@ void SMESHGUI_MeshTab::setAvailableHyps( const int theId, const QStringList& the * \brief Sets existing hypothesis * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) * \param theHyps - list of available hypothesis names - * \param theDefaultAvlbl - \c true means that the algorithm can with w/o hypothesis + * \param theDefaultAvlbl - \c true means that the algorithm can work w/o hypothesis * with some default parameters * * Sets existing main or additional hypothesis for this tab @@ -184,17 +250,25 @@ void SMESHGUI_MeshTab::setExistingHyps( const int theId, { if ( theId != Algo ) { - bool enable = ! myAvailableHyps[ theId ].isEmpty(); - myHyp[ theId ]->clear(); + bool enable = ! myAvailableHypTypes[ theId ].isEmpty(); + myHypCombo[ theId ]->clear(); if ( enable ) { QString none = tr( theDefaultAvlbl ? "DEFAULT" : ( theId == AddHyp ) ? "NONE" : "NONE" ); - myHyp[ theId ]->addItem( none ); - myHyp[ theId ]->addItems( theHyps ); - myHyp[ theId ]->setCurrentIndex( 0 ); + addItem( none, theId, 0 ); + for ( int i = 0, nbHyp = theHyps.count(); i < nbHyp; ++i ) + addItem( theHyps[i], theId, i+1 ); + myHypCombo[ theId ]->setCurrentIndex( 0 ); + } + myHypCombo [ theId ]->setEnabled( enable ); + myEditHypBtn[ theId ]->setEnabled( false ); + if ( theId == AddHyp ) + { + myAddHypList->clear(); + myEditHypBtn[ MoreAddHyp ]->setEnabled( false ); + myMoreAddHypBtn->setEnabled( false ); + myLessAddHypBtn->setEnabled( false ); } - myHyp [ theId ]->setEnabled( enable ); - myEditHyp[ theId ]->setEnabled( false ); } } @@ -210,46 +284,70 @@ void SMESHGUI_MeshTab::setExistingHyps( const int theId, //================================================================================ void SMESHGUI_MeshTab::addHyp( const int theId, const QString& theHyp ) { - myHyp[ theId ]->addItem( theHyp ); - myHyp[ theId ]->setCurrentIndex( myHyp[ theId ]->count() - 1 ); - myEditHyp[ theId ]->setEnabled( true ); - myHyp[ theId ]->setEnabled( true ); + int index = myHypCombo[ theId ]->count(); + if ( theId == AddHyp ) + index += myAddHypList->count(); + addItem( theHyp, theId, index ); + myHypCombo[ theId ]->setCurrentIndex( myHypCombo[ theId ]->count() - 1 ); + myEditHypBtn[ theId ]->setEnabled( true ); + myHypCombo[ theId ]->setEnabled( true ); + if ( theId == AddHyp ) + myMoreAddHypBtn->setEnabled( true ); } //================================================================================ /*! * \brief Renames hypothesis - * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) - * \param theIndex - index of hypothesis to be renamed - * \param theNewName - new name of hypothesis to be renamed - * + * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) + * \param theIndex - index of hypothesis to be renamed + * \param theNewName - new name of hypothesis to be renamed + * * Renames hypothesis */ //================================================================================ -void SMESHGUI_MeshTab::renameHyp( const int theId, - const int theIndex, - const QString& theNewName ) -{ - if ( theIndex > 0 && theIndex < myHyp[ theId ]->count() ) - myHyp[ theId ]->setItemText( theIndex, theNewName ); -} +// void SMESHGUI_MeshTab::renameHyp( const int theId, +// const int theIndex, +// const QString& theNewName ) +// { +// if ( theIndex > 0 && theIndex < myHypCombo[ theId ]->count() ) +// myHypCombo[ theId ]->setItemText( theIndex, theNewName ); +// } //================================================================================ /*! - * \brief Sets current hypothesis - * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) - * \param theIndex - index of hypothesis to be set as current - * - * Sets current hypothesis + * \brief Sets current hypothesis + * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) + * \param theIndex - index of hypothesis to be set as current + * + * Sets current hypothesis */ //================================================================================ void SMESHGUI_MeshTab::setCurrentHyp( const int theId, const int theIndex ) { - if ( theIndex >= 0 && theIndex < myHyp[ theId ]->count() ) + if ( theId <= AddHyp ) { - myHyp[ theId ]->setCurrentIndex( theIndex ); - if ( myEditHyp[ theId ] ) - myEditHyp[ theId ]->setEnabled( theIndex > 0 ); + if ( theIndex >= 0 && theIndex < myHypCombo[ theId ]->count() ) + { + myHypCombo[ theId ]->setCurrentIndex( theIndex ); + if ( myEditHypBtn[ theId ] ) + myEditHypBtn[ theId ]->setEnabled( theIndex > 0 ); + if ( theId == AddHyp ) + myMoreAddHypBtn ->setEnabled( theIndex > 0 ); + } + } + else // more than one additional hyp assigned + { + // move a hyp from myHypCombo[ AddHyp ] to myAddHypList + for ( int i = 1, nb = myHypCombo[ AddHyp ]->count(); i < nb; ++i ) + { + int curIndex = myHypCombo[ AddHyp ]->itemData( i ).toInt(); + if ( theIndex == curIndex ) + { + addItem( myHypCombo[ AddHyp ]->itemText( i ), theId, theIndex ); + myHypCombo[ AddHyp ]->removeItem( i ); + break; + } + } } } @@ -260,11 +358,26 @@ void SMESHGUI_MeshTab::setCurrentHyp( const int theId, const int theIndex ) * \retval int - index of current hypothesis * * Gets current hypothesis + * Use theId > AddHyp to get more than selected addetional hyps (see nbAddHypTypes()). */ //================================================================================ int SMESHGUI_MeshTab::currentHyp( const int theId ) const { - return myHyp[ theId ]->currentIndex(); + return getCurrentIndex( theId, /*curByType=*/true ); +} + +//================================================================================ +/*! + * \brief Returns nb of selected supplementary additional hypotheses + * + * Access to their indices is via currentHyp( AddHyp + i ) where i is within the + * range 0 <= i < this->nbAddHypTypes() + */ +//================================================================================ + +int SMESHGUI_MeshTab::nbAddHypTypes() const +{ + return myAddHypList->count(); } //================================================================================ @@ -277,12 +390,12 @@ int SMESHGUI_MeshTab::currentHyp( const int theId ) const //================================================================================ void SMESHGUI_MeshTab::onCreateHyp() { - bool isMainHyp = sender() == myCreateHyp[ MainHyp ]; + bool isMainHyp = ( sender() == myCreateHypBtn[ MainHyp ]); QMenu aPopup( this ); QStringList aHypNames = isMainHyp ? - myAvailableHyps[ MainHyp ] : myAvailableHyps[ AddHyp ]; + myAvailableHypTypes[ MainHyp ] : myAvailableHypTypes[ AddHyp ]; QList actions; for ( int i = 0, n = aHypNames.count(); i < n; i++ ) @@ -304,8 +417,12 @@ void SMESHGUI_MeshTab::onCreateHyp() void SMESHGUI_MeshTab::onEditHyp() { const QObject* aSender = sender(); - int aHypType = aSender == myEditHyp[ MainHyp ] ? MainHyp : AddHyp; - emit editHyp( aHypType, myHyp[ aHypType ]->currentIndex() - 1 ); // - 1 because there is NONE on the top + int aHypType = MainHyp; + for ( ; aHypType <= MoreAddHyp; ++aHypType ) + if ( aSender == myEditHypBtn[ aHypType ]) + break; + emit editHyp( Min( aHypType, AddHyp ), + getCurrentIndex( aHypType ) - 1 ); // - 1 because there is NONE on the top } //================================================================================ @@ -320,11 +437,66 @@ void SMESHGUI_MeshTab::onEditHyp() void SMESHGUI_MeshTab::onHyp( int theIndex ) { const QObject* aSender = sender(); - if ( aSender == myHyp[ Algo ] ) + if ( aSender == myHypCombo[ Algo ] ) + { emit selectAlgo( theIndex - 1 ); // - 1 because there is NONE on the top - else { - int anIndex = aSender == myHyp[ MainHyp ] ? MainHyp : AddHyp; - myEditHyp[ anIndex ]->setEnabled( theIndex > 0 ); + } + else if ( aSender == myAddHypList ) + { + myEditHypBtn[ MoreAddHyp ]->setEnabled( theIndex >= 0 ); + myLessAddHypBtn ->setEnabled( theIndex >= 0 ); + } + else + { + int type = ( aSender == myHypCombo[ MainHyp ] ? MainHyp : AddHyp ); + myEditHypBtn[ type ]->setEnabled( theIndex > 0 ); + + if ( type == AddHyp ) + myMoreAddHypBtn ->setEnabled( theIndex > 0 ); + } +} + +//================================================================================ +/*! + * \brief Adds a current additional hyp to myAddHypList + * + * SLOT called when myMoreAddHypBtn ("plus") clicked + */ +//================================================================================ + +void SMESHGUI_MeshTab::onMoreAddHyp() +{ + int hypIndex = currentHyp( AddHyp ); + if ( hypIndex > 0 ) + { + // move a hyp from myHypCombo[ AddHyp ] to myAddHypList + int comboIndex = myHypCombo[ AddHyp ]->currentIndex(); + addItem( myHypCombo[ AddHyp ]->itemText( comboIndex ), MoreAddHyp, hypIndex ); + + myHypCombo[ AddHyp ]->removeItem( comboIndex ); + myHypCombo[ AddHyp ]->setCurrentIndex( 0 ); + + myMoreAddHypBtn->setEnabled( false ); + myEditHypBtn[ AddHyp ]->setEnabled( false ); + } +} + +//================================================================================ +/*! + * \brief Removes a current additional hyp from myAddHypList + * + * SLOT called when myLessAddHypBtn ("minus") clicked + */ +//================================================================================ + +void SMESHGUI_MeshTab::onLessAddHyp() +{ + if ( QListWidgetItem * item = myAddHypList->currentItem() ) + { + // move a hyp from myAddHypList to myHypCombo[ AddHyp ] + int hypIndex = item->data( Qt::UserRole ).toInt(); + addItem( item->text(), AddHyp, hypIndex ); + delete item;//myAddHypList->takeItem( myAddHypList->currentRow() ); } } @@ -334,14 +506,14 @@ void SMESHGUI_MeshTab::onHyp( int theIndex ) * * Resets all tab fields */ -//================================================================================ +//================================================================================ void SMESHGUI_MeshTab::reset() { for ( int i = Algo; i <= AddHyp; i++ ) { - myHyp[ i ]->setCurrentIndex( 0 ); - if ( myEditHyp[ i ] ) - myEditHyp[ i ]->setEnabled( false ); + myHypCombo[ i ]->setCurrentIndex( 0 ); + if ( myEditHypBtn[ i ] ) + myEditHypBtn[ i ]->setEnabled( false ); } } diff --git a/src/SMESHGUI/SMESHGUI_MeshDlg.h b/src/SMESHGUI/SMESHGUI_MeshDlg.h index 2d0cdde74..f8d8b108e 100644 --- a/src/SMESHGUI/SMESHGUI_MeshDlg.h +++ b/src/SMESHGUI/SMESHGUI_MeshDlg.h @@ -38,11 +38,12 @@ #include class SMESHGUI_MeshTab; -class QTabWidget; +class QAction; class QComboBox; -class QToolButton; +class QListWidget; class QMenu; -class QAction; +class QTabWidget; +class QToolButton; /*! * \brief Dialog for mech creation or editing @@ -89,7 +90,7 @@ private slots: void onGeomSelectionButton( bool ); void onChangedMeshType( const int ); -private: + private: QMap myTabs; QTabWidget* myTabWg; QToolButton* myHypoSetButton; @@ -98,23 +99,26 @@ private: }; /*! - * \brief Tab for tab widget containing controls for definition of + * \brief Tab for tab widget containing controls for definition of * algorithms and hypotheses -*/ + */ class SMESHGUI_EXPORT SMESHGUI_MeshTab : public QFrame { Q_OBJECT - -public: + + public: /*! To differ main algorithms, hypotheses and additional ones*/ enum HypType - { + { Algo = 0, //!< algorithms MainHyp, //!< main hypothesis - AddHyp //!< additional hypothesis - }; - + AddHyp, //!< additional hypothesis + MoreAddHyp //! since several additional hypothesis are possible, the 2-nd, 3-d etc + // additional hypotheses are coded as being of HypType (AddHyp + 1), (AddHyp + 2) etc. + // Nb of HypType's after MainHyp is returned by SMESHGUI_MeshTab::nbAddHypTypes() + }; + public: SMESHGUI_MeshTab( QWidget* ); virtual ~SMESHGUI_MeshTab(); @@ -122,9 +126,10 @@ public: void setAvailableHyps( const int, const QStringList& ); void setExistingHyps( const int, const QStringList&, bool=false); void addHyp( const int, const QString& ); - void renameHyp( const int, const int, const QString& ); + //void renameHyp( const int, const int, const QString& ); void setCurrentHyp( const int, const int ); int currentHyp( const int ) const; + int nbAddHypTypes() const; void reset(); signals: @@ -139,14 +144,24 @@ private slots: void onCreateHyp(); void onEditHyp(); void onHyp( int ); - -private: - QMap myHyp; - QMap myCreateHyp; - QMap myEditHyp; - - QMap myAvailableHyps; - QMap myExistingHyps; + void onMoreAddHyp(); + void onLessAddHyp(); + +private: + + void addItem( const QString& txt, const int type, const int index ); + int getCurrentIndex( const int type, const bool curByType=false) const; + + QMap myAvailableHypTypes; + + QMap myHypCombo; + QMap myCreateHypBtn; + QMap myEditHypBtn; + + QToolButton* myMoreAddHypBtn; + QToolButton* myLessAddHypBtn; + QListWidget* myAddHypList; // 2-nd, etc. additional hyps + }; #endif // SMESHGUI_MESHDLG_H diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.cxx b/src/SMESHGUI/SMESHGUI_MeshOp.cxx index de77540c6..ab8b437a6 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshOp.cxx @@ -610,8 +610,8 @@ void SMESHGUI_MeshOp::selectionDone() myDlg->objectWg( SMESHGUI_MeshDlg::Geom, SMESHGUI_MeshDlg::Btn )->hide(); myDlg->updateGeometry(); myDlg->adjustSize(); - readMesh(); myIsMesh = submeshVar->_is_nil(); + readMesh(); } else myDlg->reset(); @@ -873,7 +873,11 @@ void SMESHGUI_MeshOp::availableHyps( const int theDim, * \param theAlgoData - to select hypos able to be used by this algo (optional) * * Gets existing (i.e. already created) hypotheses or algorithm in accordance with - * input parameters + * input parameters. + * + * WARNING: when using this method to get hyps existing in Mesh component, + * call availableHyps() before in order to get only hyps of available types + * that was filtered by availableHyps() */ //================================================================================ void SMESHGUI_MeshOp::existingHyps( const int theDim, @@ -881,7 +885,7 @@ void SMESHGUI_MeshOp::existingHyps( const int theDim, _PTR(SObject) theFather, QStringList& theHyps, THypList& theHypList, - HypothesisData* theAlgoData) + HypothesisData* theAlgoData) const { // Clear hypoheses list theHyps.clear(); @@ -890,20 +894,21 @@ void SMESHGUI_MeshOp::existingHyps( const int theDim, if ( !theFather ) return; - const bool isAux = ( theHypType == AddHyp ); - _PTR(SObject) aHypRoot; _PTR(GenericAttribute) anAttr; _PTR(AttributeName) aName; _PTR(AttributeIOR) anIOR; - bool isMesh = !_CAST( SComponent, theFather ); + const bool isMesh = !_CAST( SComponent, theFather ); int aPart = -1; if ( isMesh ) aPart = theHypType == Algo ? SMESH::Tag_RefOnAppliedAlgorithms : SMESH::Tag_RefOnAppliedHypothesis; else aPart = theHypType == Algo ? SMESH::Tag_AlgorithmsRoot : SMESH::Tag_HypothesisRoot; + const bool isAux = ( theHypType == AddHyp ); + const bool allHyps = ( !isMesh && theHypType != Algo && theDim > -1); + if ( theFather->FindSubObject( aPart, aHypRoot ) ) { _PTR(ChildIterator) anIter = @@ -931,9 +936,10 @@ void SMESHGUI_MeshOp::existingHyps( const int theDim, CORBA::String_var hypType = aHypVar->GetName(); HypothesisData* aData = SMESH::GetHypothesisData( hypType.in() ); if ( !aData) continue; - if ( ( theDim == -1 || aData->Dim.contains( theDim ) ) && - ( isCompatible ( theAlgoData, aData, theHypType )) && - ( theHypType == Algo || isAux == aData->IsAuxOrNeedHyp )) + if (( theDim == -1 || aData->Dim.contains( theDim ) ) && + ( isCompatible ( theAlgoData, aData, theHypType )) && + ( theHypType == Algo || isAux == aData->IsAuxOrNeedHyp ) && + ( !allHyps || myAvailableHypData[theDim][theHypType].count(aData) )) { std::string aHypName = aName->Value(); theHyps.append( aHypName.c_str() ); @@ -1173,6 +1179,8 @@ void SMESHGUI_MeshOp::createHypothesis(const int theDim, myDim = theDim; myType = theType; + + // get a unique hyp name QStringList aHypNames; TDim2Type2HypList::const_iterator aDimIter = myExistingHyps.begin(); for ( ; aDimIter != myExistingHyps.end(); aDimIter++) { @@ -1481,13 +1489,14 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, { if ( !isAccessibleDim( dim )) continue; - for ( int type = MainHyp; type < NbHypTypes; type++ ) + for ( int dlgType = MainHyp; dlgType < nbDlgHypTypes(dim); dlgType++ ) { + const int type = Min( dlgType, AddHyp ); myAvailableHypData[ dim ][ type ].clear(); QStringList anAvailable, anExisting; HypothesisData* curAlgo = algoByDim[ dim ]; - int hypIndex = currentHyp( dim, type ); + int hypIndex = currentHyp( dim, dlgType ); SMESH::SMESH_Hypothesis_var curHyp; if ( hypIndex >= 0 && hypIndex < myExistingHyps[ dim ][ type ].count() ) @@ -1521,8 +1530,8 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, if ( !isCompatible( curAlgo, hypData, type )) curHyp = SMESH::SMESH_Hypothesis::_nil(); } - existingHyps( dim, type, pObj, anExisting, myExistingHyps[ dim ][ type ], curAlgo); availableHyps( dim, type, anAvailable, myAvailableHypData[ dim ][ type ], curAlgo); + existingHyps( dim, type, pObj, anExisting, myExistingHyps[ dim ][ type ], curAlgo); defaulHypAvlbl = (type == MainHyp && !curAlgo->IsAuxOrNeedHyp ); } // set list of hypotheses @@ -1701,14 +1710,19 @@ bool SMESHGUI_MeshOp::createMesh( QString& theMess, QStringList& theEntryList ) SMESH::SetName( aMeshSO, myDlg->objectText( SMESHGUI_MeshDlg::Obj ) ); } - for ( int aDim = SMESH::DIM_0D; aDim <= SMESH::DIM_3D; aDim++ ) { + for ( int aDim = SMESH::DIM_0D; aDim <= SMESH::DIM_3D; aDim++ ) + { if ( !isAccessibleDim( aDim )) continue; // assign hypotheses - for ( int aHypType = MainHyp; aHypType <= AddHyp; aHypType++ ) { - int aHypIndex = currentHyp( aDim, aHypType ); - if ( aHypIndex >= 0 && aHypIndex < myExistingHyps[ aDim ][ aHypType ].count() ) { - SMESH::SMESH_Hypothesis_var aHypVar = myExistingHyps[ aDim ][ aHypType ][ aHypIndex ].first; + for ( int dlgType = MainHyp; dlgType < nbDlgHypTypes(aDim); dlgType++ ) + { + const int aHypIndex = currentHyp( aDim, dlgType ); + const int aHypType = Min( dlgType, AddHyp ); + if ( aHypIndex >= 0 && aHypIndex < myExistingHyps[ aDim ][ aHypType ].count() ) + { + SMESH::SMESH_Hypothesis_var aHypVar = + myExistingHyps[ aDim ][ aHypType ][ aHypIndex ].first; if ( !aHypVar->_is_nil() ) SMESH::AddHypothesisOnMesh( aMeshVar, aHypVar ); } @@ -1838,9 +1852,10 @@ bool SMESHGUI_MeshOp::createSubMesh( QString& theMess, QStringList& theEntryList if ( !anAlgoVar->_is_nil() ) SMESH::AddHypothesisOnSubMesh( aSubMeshVar, anAlgoVar ); // assign hypotheses - for ( int aHypType = MainHyp; aHypType <= AddHyp; aHypType++ ) + for ( int dlgType = MainHyp; dlgType < nbDlgHypTypes(aDim); dlgType++ ) { - int aHypIndex = currentHyp( aDim, aHypType ); + const int aHypIndex = currentHyp( aDim, dlgType ); + const int aHypType = Min( dlgType, AddHyp ); if ( aHypIndex >= 0 && aHypIndex < myExistingHyps[ aDim ][ aHypType ].count() ) { SMESH::SMESH_Hypothesis_var aHypVar = @@ -1876,6 +1891,36 @@ int SMESHGUI_MeshOp::currentHyp( const int theDim, const int theHypType ) const return myDlg->tab( theDim )->currentHyp( theHypType ) - 1; } +//================================================================================ +/*! + * \brief Checks if a hypothesis is selected + */ +//================================================================================ + +bool SMESHGUI_MeshOp::isSelectedHyp( int theDim, int theHypType, int theIndex) const +{ + if ( theHypType < AddHyp ) // only one hyp can be selected + return currentHyp( theDim, theHypType ) == theIndex; + + for ( int dlgHypType = AddHyp; dlgHypType < nbDlgHypTypes( theDim ); ++dlgHypType ) + if ( currentHyp( theDim, dlgHypType ) == theIndex ) + return true; + + return false; +} + +//================================================================================ +/*! + * \brief Returns nb of HypType's taking into account possible several + * selected additional hypotheses which are coded as additional HypType's. + */ +//================================================================================ + +int SMESHGUI_MeshOp::nbDlgHypTypes( const int dim ) const +{ + return NbHypTypes + myDlg->tab( dim )->nbAddHypTypes(); +} + //================================================================================ /*! * \brief Returns true if hypotheses of given dim can be assigned @@ -2074,11 +2119,11 @@ void SMESHGUI_MeshOp::readMesh() SMESH::SMESH_Hypothesis_var aVar = myObjHyps[ dim ][ Algo ].first().first; HypothesisData* algoData = SMESH::GetHypothesisData( aVar->GetName() ); aHypIndex = myAvailableHypData[ dim ][ Algo ].indexOf ( algoData ); -// if ( aHypIndex < 0 && algoData ) { -// // assigned algo is incompatible with other algorithms -// myAvailableHypData[ dim ][ Algo ].push_back( algoData ); -// aHypIndex = myAvailableHypData[ dim ][ hypType ].count() - 1; -// } + // if ( aHypIndex < 0 && algoData ) { + // // assigned algo is incompatible with other algorithms + // myAvailableHypData[ dim ][ Algo ].push_back( algoData ); + // aHypIndex = myAvailableHypData[ dim ][ hypType ].count() - 1; + // } algoFound = ( aHypIndex > -1 ); } setCurrentHyp( dim, Algo, aHypIndex ); @@ -2095,23 +2140,26 @@ void SMESHGUI_MeshOp::readMesh() { // get hypotheses existingHyps( dim, hypType, pObj, anExisting, myObjHyps[ dim ][ hypType ] ); - // find index of requered hypothesis among existing ones for this dimension and type - int aHypIndex = -1; - if ( myObjHyps[ dim ][ hypType ].count() > 0 ) { - aHypIndex = find( myObjHyps[ dim ][ hypType ].first().first, - myExistingHyps[ dim ][ hypType ] ); + for ( int i = 0, nb = myObjHyps[ dim ][ hypType ].count(); i < nb; ++i ) + { + // find index of required hypothesis among existing ones for this dimension and type + int aHypIndex = find( myObjHyps[ dim ][ hypType ][ i ].first, + myExistingHyps[ dim ][ hypType ] ); if ( aHypIndex < 0 ) { // assigned hypothesis is incompatible with the algorithm if ( currentHyp( dim, Algo ) < 0 ) { // none algo selected; it is edition for sure, of submesh maybe hypWithoutAlgo = true; - myExistingHyps[ dim ][ hypType ].push_back( myObjHyps[ dim ][ hypType ].first() ); + myExistingHyps[ dim ][ hypType ].push_back( myObjHyps[ dim ][ hypType ][ i ] ); + anExisting.push_back( myObjHyps[ dim ][ hypType ][ i ].second ); aHypIndex = myExistingHyps[ dim ][ hypType ].count() - 1; myDlg->tab( dim )->setExistingHyps( hypType, anExisting ); } } + setCurrentHyp( dim, hypType + i, aHypIndex ); + + if ( hypType == MainHyp ) break; // only one main hyp allowed } - setCurrentHyp( dim, hypType, aHypIndex ); } } // make available other hyps of same type as one without algo @@ -2122,8 +2170,8 @@ void SMESHGUI_MeshOp::readMesh() //================================================================================ /*! * \brief Gets name of object - * \param theSO - SObject - * \retval QString - name of object + * \param theSO - SObject + * \retval QString - name of object * * Gets name of object */ @@ -2249,37 +2297,38 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess ) myObjHyps[ dim ][ Algo ].append( THypItem( anAlgoVar, aName) ); } - // assign hypotheses + // remove deselected hypotheses for ( int hypType = MainHyp; hypType <= AddHyp; hypType++ ) { - int aNewHypIndex = currentHyp( dim, hypType ); - int anOldHypIndex = -1; - - // remove old hypotheses - if ( myObjHyps[ dim ][ hypType ].count() > 0 ) + for ( int i = 0, nb = myObjHyps[ dim ][ hypType ].count(); i < nb; ++i ) { - anOldHypIndex = find( myObjHyps[ dim ][ hypType ].first().first, - myExistingHyps[ dim ][ hypType ] ); - if ( aNewHypIndex != anOldHypIndex || // different hyps - anOldHypIndex == -1 ) // hyps of different algos + SMESH::SMESH_Hypothesis_var hyp = myObjHyps[ dim ][ hypType ][ i ].first; + int hypIndex = this->find( hyp, myExistingHyps[ dim ][ hypType ]); + if ( !isSelectedHyp( dim, hypType, hypIndex ) && !hyp->_is_nil() ) { - SMESH::RemoveHypothesisOrAlgorithmOnMesh - ( pObj, myObjHyps[ dim ][ hypType ].first().first ); - myObjHyps[ dim ][ hypType ].clear(); + SMESH::RemoveHypothesisOrAlgorithmOnMesh( pObj, hyp ); } } - - // assign new hypotheses - if ( aNewHypIndex != anOldHypIndex && aNewHypIndex > -1 ) + } + // assign newly selected hypotheses + for ( int dlgType = MainHyp; dlgType < nbDlgHypTypes(dim); dlgType++ ) + { + const int curIndex = currentHyp( dim, dlgType ); + const int hypType = Min( dlgType, AddHyp ); + if ( curIndex >= 0 && curIndex < myExistingHyps[ dim ][ hypType ].count() ) { - if ( isMesh ) - SMESH::AddHypothesisOnMesh - (aMeshVar, myExistingHyps[ dim ][ hypType ][ aNewHypIndex ].first ); - else if ( !aSubMeshVar->_is_nil() ) - SMESH::AddHypothesisOnSubMesh - ( aSubMeshVar, myExistingHyps[ dim ][ hypType ][ aNewHypIndex ].first ); + SMESH::SMESH_Hypothesis_var hyp = myExistingHyps[ dim ][ hypType ][ curIndex ].first; + + bool isAssigned = ( this->find( hyp, myObjHyps[ dim ][ hypType ]) >= 0 ); + if ( !isAssigned ) + { + if ( isMesh ) + SMESH::AddHypothesisOnMesh (aMeshVar, hyp ); + else if ( !aSubMeshVar->_is_nil() ) + SMESH::AddHypothesisOnSubMesh ( aSubMeshVar, hyp ); + } } - // reread all hypotheses of mesh if necessary + // reread all hypotheses of mesh QStringList anExisting; existingHyps( dim, hypType, pObj, anExisting, myObjHyps[ dim ][ hypType ] ); } diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.h b/src/SMESHGUI/SMESHGUI_MeshOp.h index 8aa0fb9da..99a699ba4 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.h +++ b/src/SMESHGUI/SMESHGUI_MeshOp.h @@ -96,12 +96,12 @@ private: QStringList&, THypDataList&, HypothesisData* = 0 ) const; - static void existingHyps( const int, + void existingHyps( const int, const int, _PTR(SObject), QStringList&, THypList&, - HypothesisData* = 0 ); + HypothesisData* = 0 ) const; HypothesisData* hypData( const int, const int, const int ); // access to myAvailableHypData @@ -117,6 +117,8 @@ private: bool askUser=false); int currentHyp( const int, const int ) const; + bool isSelectedHyp( int, int, int ) const; + int nbDlgHypTypes( const int ) const; bool isAccessibleDim( const int ) const; void setCurrentHyp( const int, const int, const int ); void setDefaultName( const QString& prefix="" ) const; @@ -135,7 +137,9 @@ private: void createMeshTypeList( QStringList& ); void setAvailableMeshType( const QStringList& ); void setFilteredAlgoData( const int, const int ); + private: + SMESHGUI_MeshDlg* myDlg; SMESHGUI_ShapeByMeshOp* myShapeByMeshOp; bool myToCreate; diff --git a/src/SMESHGUI/SMESH_images.ts b/src/SMESHGUI/SMESH_images.ts index 63187d137..80c04e7d6 100644 --- a/src/SMESHGUI/SMESH_images.ts +++ b/src/SMESHGUI/SMESH_images.ts @@ -299,6 +299,14 @@ ICON_HYPO_EDIT mesh_hypo_edit.png + + ICON_PLUS + mesh_plus.png + + + ICON_MINUS + mesh_minus.png + ICON_INTERSECT mesh_intersectGroups.png diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index 311e1377d..a5ed1ac3c 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -549,6 +549,7 @@ SMESH::Hypothesis_Status SMESH_Mesh_i::ConvertHypothesisStatus RETURNCASE( HYP_BAD_SUBSHAPE ); RETURNCASE( HYP_BAD_GEOMETRY ); RETURNCASE( HYP_NEED_SHAPE ); + RETURNCASE( HYP_INCOMPAT_HYPS ); default:; } return SMESH::HYP_UNKNOWN_FATAL; @@ -564,33 +565,31 @@ SMESH::Hypothesis_Status SMESH_Mesh_i::ConvertHypothesisStatus */ //============================================================================= -SMESH::Hypothesis_Status SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp) +SMESH::Hypothesis_Status +SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Object_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp, + CORBA::String_out anErrorText) throw(SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); if ( _preMeshInfo ) _preMeshInfo->ForgetOrLoad(); - SMESH_Hypothesis::Hypothesis_Status status = addHypothesis( aSubShapeObject, anHyp ); + std::string error; + SMESH_Hypothesis::Hypothesis_Status status = addHypothesis( aSubShape, anHyp, &error ); + anErrorText = error.c_str(); SMESH::SMESH_Mesh_var mesh( _this() ); if ( !SMESH_Hypothesis::IsStatusFatal(status) ) { SALOMEDS::Study_var study = _gen_i->GetCurrentStudy(); - _gen_i->AddHypothesisToShape( study, mesh, aSubShapeObject, anHyp ); + _gen_i->AddHypothesisToShape( study, mesh, aSubShape, anHyp ); } if(MYDEBUG) MESSAGE( " AddHypothesis(): status = " << status ); // Update Python script - //if(_impl->HasShapeToMesh()) - { - TPythonDump() << "status = " << mesh << ".AddHypothesis( " - << aSubShapeObject << ", " << anHyp << " )"; - } - // else { - // TPythonDump() << "status = " << mesh << ".AddHypothesis( "<< anHyp << " )"; - // } + TPythonDump() << "status = " << mesh << ".AddHypothesis( " + << aSubShape << ", " << anHyp << " )"; return ConvertHypothesisStatus(status); } @@ -602,12 +601,13 @@ SMESH::Hypothesis_Status SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Object_ptr //============================================================================= SMESH_Hypothesis::Hypothesis_Status -SMESH_Mesh_i::addHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp) +SMESH_Mesh_i::addHypothesis(GEOM::GEOM_Object_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp, + std::string* anErrorText) { if(MYDEBUG) MESSAGE("addHypothesis"); - if (CORBA::is_nil( aSubShapeObject ) && HasShapeToMesh()) + if (CORBA::is_nil( aSubShape ) && HasShapeToMesh()) THROW_SALOME_CORBA_EXCEPTION("bad Sub-shape reference",SALOME::BAD_PARAM); if (CORBA::is_nil( anHyp )) @@ -619,22 +619,28 @@ SMESH_Mesh_i::addHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, TopoDS_Shape myLocSubShape; //use PseudoShape in case if mesh has no shape if(HasShapeToMesh()) - myLocSubShape = _gen_i->GeomObjectToShape( aSubShapeObject); + myLocSubShape = _gen_i->GeomObjectToShape( aSubShape); else myLocSubShape = _impl->GetShapeToMesh(); const int hypId = anHyp->GetId(); - status = _impl->AddHypothesis(myLocSubShape, hypId); - if ( !SMESH_Hypothesis::IsStatusFatal(status) ) { + std::string error; + status = _impl->AddHypothesis( myLocSubShape, hypId, &error ); + if ( !SMESH_Hypothesis::IsStatusFatal(status) ) + { _mapHypo[hypId] = SMESH::SMESH_Hypothesis::_duplicate( anHyp ); anHyp->Register(); // assure there is a corresponding submesh if ( !_impl->IsMainShape( myLocSubShape )) { int shapeId = _impl->GetMeshDS()->ShapeToIndex( myLocSubShape ); if ( _mapSubMesh_i.find( shapeId ) == _mapSubMesh_i.end() ) - SMESH::SMESH_subMesh_var( createSubMesh( aSubShapeObject )); + SMESH::SMESH_subMesh_var( createSubMesh( aSubShape )); } } + else if ( anErrorText ) + { + *anErrorText = error; + } } catch(SALOME_Exception & S_ex) { @@ -649,7 +655,7 @@ SMESH_Mesh_i::addHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, */ //============================================================================= -SMESH::Hypothesis_Status SMESH_Mesh_i::RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, +SMESH::Hypothesis_Status SMESH_Mesh_i::RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShape, SMESH::SMESH_Hypothesis_ptr anHyp) throw(SALOME::SALOME_Exception) { @@ -657,18 +663,18 @@ SMESH::Hypothesis_Status SMESH_Mesh_i::RemoveHypothesis(GEOM::GEOM_Object_ptr aS if ( _preMeshInfo ) _preMeshInfo->ForgetOrLoad(); - SMESH_Hypothesis::Hypothesis_Status status = removeHypothesis( aSubShapeObject, anHyp ); + SMESH_Hypothesis::Hypothesis_Status status = removeHypothesis( aSubShape, anHyp ); SMESH::SMESH_Mesh_var mesh = _this(); if ( !SMESH_Hypothesis::IsStatusFatal(status) ) { SALOMEDS::Study_var study = _gen_i->GetCurrentStudy(); - _gen_i->RemoveHypothesisFromShape( study, mesh, aSubShapeObject, anHyp ); + _gen_i->RemoveHypothesisFromShape( study, mesh, aSubShape, anHyp ); } // Update Python script if(_impl->HasShapeToMesh()) TPythonDump() << "status = " << mesh << ".RemoveHypothesis( " - << aSubShapeObject << ", " << anHyp << " )"; + << aSubShape << ", " << anHyp << " )"; else TPythonDump() << "status = " << mesh << ".RemoveHypothesis( " << anHyp << " )"; @@ -683,12 +689,12 @@ SMESH::Hypothesis_Status SMESH_Mesh_i::RemoveHypothesis(GEOM::GEOM_Object_ptr aS //============================================================================= SMESH_Hypothesis::Hypothesis_Status -SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, +SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Object_ptr aSubShape, SMESH::SMESH_Hypothesis_ptr anHyp) { if(MYDEBUG) MESSAGE("removeHypothesis()"); - if (CORBA::is_nil( aSubShapeObject ) && HasShapeToMesh()) + if (CORBA::is_nil( aSubShape ) && HasShapeToMesh()) THROW_SALOME_CORBA_EXCEPTION("bad Sub-shape reference", SALOME::BAD_PARAM); if (CORBA::is_nil( anHyp )) @@ -700,7 +706,7 @@ SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, TopoDS_Shape myLocSubShape; //use PseudoShape in case if mesh has no shape if( _impl->HasShapeToMesh() ) - myLocSubShape = _gen_i->GeomObjectToShape( aSubShapeObject ); + myLocSubShape = _gen_i->GeomObjectToShape( aSubShape ); else myLocSubShape = _impl->GetShapeToMesh(); @@ -726,18 +732,18 @@ SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, //============================================================================= SMESH::ListOfHypothesis * -SMESH_Mesh_i::GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject) +SMESH_Mesh_i::GetHypothesisList(GEOM::GEOM_Object_ptr aSubShape) throw(SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); if (MYDEBUG) MESSAGE("GetHypothesisList"); - if (_impl->HasShapeToMesh() && CORBA::is_nil(aSubShapeObject)) + if (_impl->HasShapeToMesh() && CORBA::is_nil(aSubShape)) THROW_SALOME_CORBA_EXCEPTION("bad Sub-shape reference", SALOME::BAD_PARAM); SMESH::ListOfHypothesis_var aList = new SMESH::ListOfHypothesis(); try { - TopoDS_Shape myLocSubShape = _gen_i->GeomObjectToShape(aSubShapeObject); + TopoDS_Shape myLocSubShape = _gen_i->GeomObjectToShape(aSubShape); if ( myLocSubShape.IsNull() && !_impl->HasShapeToMesh() ) myLocSubShape = _impl->GetShapeToMesh(); const list& aLocalList = _impl->GetHypothesisList( myLocSubShape ); @@ -803,18 +809,18 @@ SMESH::submesh_array* SMESH_Mesh_i::GetSubMeshes() throw (SALOME::SALOME_Excepti */ //============================================================================= -SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::GetSubMesh(GEOM::GEOM_Object_ptr aSubShapeObject, +SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::GetSubMesh(GEOM::GEOM_Object_ptr aSubShape, const char* theName ) throw(SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); - if (CORBA::is_nil(aSubShapeObject)) + if (CORBA::is_nil(aSubShape)) THROW_SALOME_CORBA_EXCEPTION("bad Sub-shape reference", SALOME::BAD_PARAM); SMESH::SMESH_subMesh_var subMesh; SMESH::SMESH_Mesh_var aMesh = _this(); try { - TopoDS_Shape myLocSubShape = _gen_i->GeomObjectToShape(aSubShapeObject); + TopoDS_Shape myLocSubShape = _gen_i->GeomObjectToShape(aSubShape); //Get or Create the SMESH_subMesh object implementation @@ -830,16 +836,16 @@ SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::GetSubMesh(GEOM::GEOM_Object_ptr aSubShap // create a new subMesh object servant if there is none for the shape if ( subMesh->_is_nil() ) - subMesh = createSubMesh( aSubShapeObject ); + subMesh = createSubMesh( aSubShape ); if ( _gen_i->CanPublishInStudy( subMesh )) { SALOMEDS::Study_var study = _gen_i->GetCurrentStudy(); SALOMEDS::SObject_wrap aSO = - _gen_i->PublishSubMesh( study, aMesh, subMesh, aSubShapeObject, theName ); + _gen_i->PublishSubMesh( study, aMesh, subMesh, aSubShape, theName ); if ( !aSO->_is_nil()) { // Update Python script TPythonDump() << aSO << " = " << aMesh << ".GetSubMesh( " - << aSubShapeObject << ", '" << theName << "' )"; + << aSubShape << ", '" << theName << "' )"; } } } @@ -863,7 +869,7 @@ void SMESH_Mesh_i::RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) if ( theSubMesh->_is_nil() ) return; - GEOM::GEOM_Object_var aSubShapeObject; + GEOM::GEOM_Object_var aSubShape; SALOMEDS::Study_var aStudy = _gen_i->GetCurrentStudy(); if ( !aStudy->_is_nil() ) { // Remove submesh's SObject @@ -875,10 +881,10 @@ void SMESH_Mesh_i::RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) anObj->ReferencedObject( aRef.inout() )) { CORBA::Object_var obj = aRef->GetObject(); - aSubShapeObject = GEOM::GEOM_Object::_narrow( obj ); + aSubShape = GEOM::GEOM_Object::_narrow( obj ); } - // if ( aSubShapeObject->_is_nil() ) // not published shape (IPAL13617) - // aSubShapeObject = theSubMesh->GetSubShape(); + // if ( aSubShape->_is_nil() ) // not published shape (IPAL13617) + // aSubShape = theSubMesh->GetSubShape(); SALOMEDS::StudyBuilder_var builder = aStudy->NewBuilder(); builder->RemoveObjectWithChildren( anSO ); @@ -888,7 +894,7 @@ void SMESH_Mesh_i::RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) } } - if ( removeSubMesh( theSubMesh, aSubShapeObject.in() )) + if ( removeSubMesh( theSubMesh, aSubShape.in() )) if ( _preMeshInfo ) _preMeshInfo->ForgetOrLoad(); diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index cd9a7a916..e4c1b634a 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -86,21 +86,22 @@ public: void ClearSubMesh(CORBA::Long ShapeID) throw (SALOME::SALOME_Exception); - SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp) + SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Object_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp, + CORBA::String_out anErrorText) throw (SALOME::SALOME_Exception); - SMESH::Hypothesis_Status RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, + SMESH::Hypothesis_Status RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShape, SMESH::SMESH_Hypothesis_ptr anHyp) throw (SALOME::SALOME_Exception); - SMESH::ListOfHypothesis* GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject) + SMESH::ListOfHypothesis* GetHypothesisList(GEOM::GEOM_Object_ptr aSubShape) throw (SALOME::SALOME_Exception); SMESH::submesh_array* GetSubMeshes() throw (SALOME::SALOME_Exception); - SMESH::SMESH_subMesh_ptr GetSubMesh(GEOM::GEOM_Object_ptr aSubShapeObject, const char* theName) + SMESH::SMESH_subMesh_ptr GetSubMesh(GEOM::GEOM_Object_ptr aSubShape, const char* theName) throw (SALOME::SALOME_Exception); void RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) @@ -404,10 +405,11 @@ public: // Internal methods not available through CORBA // They are called by corresponding interface methods - SMESH_Hypothesis::Hypothesis_Status addHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp); + SMESH_Hypothesis::Hypothesis_Status addHypothesis(GEOM::GEOM_Object_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp, + std::string* anErrorText=0); - SMESH_Hypothesis::Hypothesis_Status removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, + SMESH_Hypothesis::Hypothesis_Status removeHypothesis(GEOM::GEOM_Object_ptr aSubShape, SMESH::SMESH_Hypothesis_ptr anHyp); static SMESH::Hypothesis_Status diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py index a51e40ce8..886682b52 100644 --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -207,12 +207,15 @@ def GetName(obj): raise RuntimeError, "Null or invalid object" ## Prints error message if a hypothesis was not assigned. -def TreatHypoStatus(status, hypName, geomName, isAlgo): +def TreatHypoStatus(status, hypName, geomName, isAlgo, mesh): if isAlgo: hypType = "algorithm" else: hypType = "hypothesis" pass + reason = "" + if hasattr( status, "__getitem__" ): + status,reason = status[0],status[1] if status == HYP_UNKNOWN_FATAL : reason = "for unknown reason" elif status == HYP_INCOMPATIBLE : @@ -235,17 +238,24 @@ def TreatHypoStatus(status, hypName, geomName, isAlgo): elif status == HYP_HIDING_ALGO: reason = "it hides algorithms of lower dimensions by generating elements of all dimensions" elif status == HYP_NEED_SHAPE: - reason = "Algorithm can't work without shape" + reason = "algorithm can't work without shape" + elif status == HYP_INCOMPAT_HYPS: + pass else: return - hypName = '"' + hypName + '"' - geomName= '"' + geomName+ '"' - if status < HYP_UNKNOWN_FATAL and not geomName =='""': - print hypName, "was assigned to", geomName,"but", reason - elif not geomName == '""': - print hypName, "was not assigned to",geomName,":", reason + where = geomName + if where: + where = '"%s"' % geomName + if mesh: + meshName = GetName( mesh ) + if meshName and meshName != NO_NAME: + where = '"%s" in "%s"' % ( geomName, meshName ) + if status < HYP_UNKNOWN_FATAL and where: + print '"%s" was assigned to %s but %s' %( hypName, where, reason ) + elif where: + print '"%s" was not assigned to %s : %s' %( hypName, where, reason ) else: - print hypName, "was not assigned:", reason + print '"%s" was not assigned : %s' %( hypName, reason ) pass ## Private method. Add geom (sub-shape of the main shape) into the study if not yet there @@ -1592,7 +1602,7 @@ class Mesh: if geom: geom_name = geom.GetName() isAlgo = hyp._narrow( SMESH_Algo ) - TreatHypoStatus( status, hyp_name, geom_name, isAlgo ) + TreatHypoStatus( status, hyp_name, geom_name, isAlgo, self ) return status ## Return True if an algorithm of hypothesis is assigned to a given shape @@ -1878,7 +1888,7 @@ class Mesh: # @param UnaryOp FT_LogicalNOT or FT_Undefined # @param Tolerance the tolerance used by FT_BelongToGeom, FT_BelongToSurface, # FT_LyingOnGeom, FT_CoplanarFaces criteria - # @return SMESH_Group + # @return SMESH_GroupOnFilter # @ingroup l2_grps_create def MakeGroup(self, groupName, @@ -1895,7 +1905,7 @@ class Mesh: ## Creates a mesh group by the given criterion # @param groupName the name of the mesh group # @param Criterion the instance of Criterion class - # @return SMESH_Group + # @return SMESH_GroupOnFilter # @ingroup l2_grps_create def MakeGroupByCriterion(self, groupName, Criterion): aFilterMgr = self.smeshpyD.CreateFilterManager() @@ -1910,7 +1920,7 @@ class Mesh: ## Creates a mesh group by the given criteria (list of criteria) # @param groupName the name of the mesh group # @param theCriteria the list of criteria - # @return SMESH_Group + # @return SMESH_GroupOnFilter # @ingroup l2_grps_create def MakeGroupByCriteria(self, groupName, theCriteria): aFilterMgr = self.smeshpyD.CreateFilterManager() @@ -1923,12 +1933,13 @@ class Mesh: ## Creates a mesh group by the given filter # @param groupName the name of the mesh group # @param theFilter the instance of Filter class - # @return SMESH_Group + # @return SMESH_GroupOnFilter # @ingroup l2_grps_create def MakeGroupByFilter(self, groupName, theFilter): - group = self.CreateEmptyGroup(theFilter.GetElementType(), groupName) - theFilter.SetMesh( self.mesh ) - group.AddFrom( theFilter ) + #group = self.CreateEmptyGroup(theFilter.GetElementType(), groupName) + #theFilter.SetMesh( self.mesh ) + #group.AddFrom( theFilter ) + group = self.GroupOnFilter( theFilter.GetElementType(), groupName, theFilter ) return group ## Removes a group diff --git a/src/SMESH_SWIG/smesh_algorithm.py b/src/SMESH_SWIG/smesh_algorithm.py index cac705e12..3623b5176 100644 --- a/src/SMESH_SWIG/smesh_algorithm.py +++ b/src/SMESH_SWIG/smesh_algorithm.py @@ -214,7 +214,7 @@ class Mesh_Algorithm: ## Private method def Hypothesis (self, hyp, args=[], so="libStdMeshersEngine.so", - UseExisting=0, CompareMethod=""): + UseExisting=0, CompareMethod="", toAdd=True): from salome.smesh.smeshBuilder import TreatHypoStatus, GetName hypo = None if UseExisting: @@ -243,8 +243,9 @@ class Mesh_Algorithm: geomName="" if self.geom: geomName = GetName(self.geom) - status = self.mesh.mesh.AddHypothesis(self.geom, hypo) - TreatHypoStatus( status, GetName(hypo), geomName, 0 ) + if toAdd: + status = self.mesh.mesh.AddHypothesis(self.geom, hypo) + TreatHypoStatus( status, GetName(hypo), geomName, 0, self.mesh ) return hypo ## Returns entry of the shape to mesh in the study @@ -275,11 +276,13 @@ class Mesh_Algorithm: if faces and isinstance( faces[0], geomBuilder.GEOM._objref_GEOM_Object ): faces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in faces ] hyp = self.Hypothesis("ViscousLayers", - [thickness, numberOfLayers, stretchFactor, faces]) + [thickness, numberOfLayers, stretchFactor, faces, isFacesToIgnore], + toAdd=False) hyp.SetTotalThickness(thickness) hyp.SetNumberLayers(numberOfLayers) hyp.SetStretchFactor(stretchFactor) hyp.SetFaces(faces, isFacesToIgnore) + self.mesh.AddHypothesis( hyp, self.geom ) return hyp ## Defines "ViscousLayers2D" hypothesis to give parameters of layers of quadrilateral @@ -303,12 +306,13 @@ class Mesh_Algorithm: if edges and isinstance( edges[0], geomBuilder.GEOM._objref_GEOM_Object ): edges = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in edges ] hyp = self.Hypothesis("ViscousLayers2D", - [thickness, numberOfLayers, stretchFactor, - edges, isEdgesToIgnore]) + [thickness, numberOfLayers, stretchFactor, edges, isEdgesToIgnore], + toAdd=False) hyp.SetTotalThickness(thickness) hyp.SetNumberLayers(numberOfLayers) hyp.SetStretchFactor(stretchFactor) hyp.SetEdges(edges, isEdgesToIgnore) + self.mesh.AddHypothesis( hyp, self.geom ) return hyp ## Transform a list of either edges or tuples (edge, 1st_vertex_of_edge) diff --git a/src/StdMeshers/StdMeshers_FaceSide.cxx b/src/StdMeshers/StdMeshers_FaceSide.cxx index b543928dc..c2596b4b6 100644 --- a/src/StdMeshers/StdMeshers_FaceSide.cxx +++ b/src/StdMeshers/StdMeshers_FaceSide.cxx @@ -1012,7 +1012,8 @@ TSideVector StdMeshers_FaceSide::GetFaceWires(const TopoDS_Face& theFace, SMESH_Mesh & theMesh, const bool theIgnoreMediumNodes, TError & theError, - SMESH_ProxyMesh::Ptr theProxyMesh) + SMESH_ProxyMesh::Ptr theProxyMesh, + const bool theCheckVertexNodes) { list< TopoDS_Edge > edges, internalEdges; list< int > nbEdgesInWires; @@ -1037,17 +1038,18 @@ TSideVector StdMeshers_FaceSide::GetFaceWires(const TopoDS_Face& theFace, // as StdMeshers_FaceSide::GetUVPtStruct() requires if ( wireEdges.front().Orientation() != TopAbs_INTERNAL ) // Issue 0020676 { - while ( !SMESH_Algo::VertexNode( TopExp::FirstVertex( wireEdges.front(), true), - theMesh.GetMeshDS())) - { - wireEdges.splice(wireEdges.end(), wireEdges, - wireEdges.begin(), ++wireEdges.begin()); - if ( from->IsSame( wireEdges.front() )) { - theError = TError - ( new SMESH_ComputeError(COMPERR_BAD_INPUT_MESH,"No nodes on vertices")); - return TSideVector(0); + if ( theCheckVertexNodes ) + while ( !SMESH_Algo::VertexNode( TopExp::FirstVertex( wireEdges.front(), true), + theMesh.GetMeshDS())) + { + wireEdges.splice(wireEdges.end(), wireEdges, + wireEdges.begin(), ++wireEdges.begin()); + if ( from->IsSame( wireEdges.front() )) { + theError = TError + ( new SMESH_ComputeError(COMPERR_BAD_INPUT_MESH,"No nodes on vertices")); + return TSideVector(0); + } } - } } else if ( *nbE > 1 ) // Issue 0020676 (Face_pb_netgen.brep) - several internal edges in a wire { diff --git a/src/StdMeshers/StdMeshers_FaceSide.hxx b/src/StdMeshers/StdMeshers_FaceSide.hxx index 4b8bf1d33..30166d441 100644 --- a/src/StdMeshers/StdMeshers_FaceSide.hxx +++ b/src/StdMeshers/StdMeshers_FaceSide.hxx @@ -141,7 +141,8 @@ public: SMESH_Mesh & theMesh, const bool theIgnoreMediumNodes, TError & theError, - SMESH_ProxyMesh::Ptr theProxyMesh = SMESH_ProxyMesh::Ptr()); + SMESH_ProxyMesh::Ptr theProxyMesh = SMESH_ProxyMesh::Ptr(), + const bool theCheckVertexNodes=true); /*! * \brief Change orientation of side geometry */ diff --git a/src/StdMeshers/StdMeshers_Hexa_3D.cxx b/src/StdMeshers/StdMeshers_Hexa_3D.cxx index dad048753..8c54ad4e8 100644 --- a/src/StdMeshers/StdMeshers_Hexa_3D.cxx +++ b/src/StdMeshers/StdMeshers_Hexa_3D.cxx @@ -124,23 +124,17 @@ bool StdMeshers_Hexa_3D::CheckHypothesis return true; } + // only StdMeshers_ViscousLayers can be used aStatus = HYP_OK; for ( ; h != hyps.end(); ++h ) { - string hypName = (*h)->GetName(); - if ( find( _compatibleHypothesis.begin(),_compatibleHypothesis.end(),hypName ) - != _compatibleHypothesis.end() ) - { - _viscousLayersHyp = dynamic_cast< const StdMeshers_ViscousLayers*> ( *h ); - } - else - { - aStatus = HYP_INCOMPATIBLE; - } + if ( !(_viscousLayersHyp = dynamic_cast< const StdMeshers_ViscousLayers*> ( *h ))) + break; } - if ( !_viscousLayersHyp ) aStatus = HYP_INCOMPATIBLE; + else + error( _viscousLayersHyp->CheckHypothesis( aMesh, aShape, aStatus )); return aStatus == HYP_OK; } diff --git a/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx b/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx index 75db56313..34003c6c9 100644 --- a/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx +++ b/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx @@ -122,6 +122,9 @@ bool StdMeshers_MEFISTO_2D::CheckHypothesis _edgeLength = 0; _maxElementArea = 0; + if ( !error( StdMeshers_ViscousLayers2D::CheckHypothesis( aMesh, aShape, aStatus ))) + return false; + list ::const_iterator itl; const SMESHDS_Hypothesis *theHyp; diff --git a/src/StdMeshers/StdMeshers_Propagation.cxx b/src/StdMeshers/StdMeshers_Propagation.cxx index c56715d7e..49177ddf0 100644 --- a/src/StdMeshers/StdMeshers_Propagation.cxx +++ b/src/StdMeshers/StdMeshers_Propagation.cxx @@ -114,7 +114,17 @@ TopoDS_Edge StdMeshers_Propagation::GetPropagationSource(SMESH_Mesh& the return PropagationMgr::GetSource( theMesh.GetSubMeshContaining( theEdge ), isPropagOfDistribution); } - +const SMESH_HypoFilter& StdMeshers_Propagation::GetFilter() +{ + static SMESH_HypoFilter propagHypFilter; + if ( propagHypFilter.IsEmpty() ) + { + propagHypFilter. + Init( SMESH_HypoFilter::HasName( StdMeshers_Propagation::GetName ())). + Or ( SMESH_HypoFilter::HasName( StdMeshers_PropagOfDistribution::GetName ())); + } + return propagHypFilter; +} //============================================================================= //============================================================================= // PROPAGATION MANAGEMENT @@ -226,14 +236,8 @@ namespace { */ const SMESH_Hypothesis* getProagationHyp (SMESH_subMesh* theSubMesh) { - static SMESH_HypoFilter propagHypFilter; - if ( propagHypFilter.IsEmpty() ) - { - propagHypFilter. - Init( SMESH_HypoFilter::HasName( StdMeshers_Propagation::GetName ())). - Or ( SMESH_HypoFilter::HasName( StdMeshers_PropagOfDistribution::GetName ())); - } - return theSubMesh->GetFather()->GetHypothesis( theSubMesh, propagHypFilter, true ); + return theSubMesh->GetFather()->GetHypothesis + ( theSubMesh, StdMeshers_Propagation::GetFilter(), true ); } //================================================================================ /*! diff --git a/src/StdMeshers/StdMeshers_Propagation.hxx b/src/StdMeshers/StdMeshers_Propagation.hxx index fa6acfda3..064661558 100644 --- a/src/StdMeshers/StdMeshers_Propagation.hxx +++ b/src/StdMeshers/StdMeshers_Propagation.hxx @@ -35,6 +35,7 @@ #include +class SMESH_HypoFilter; // ======================================================================= /*! @@ -42,7 +43,7 @@ */ // ======================================================================= -class STDMESHERS_EXPORT StdMeshers_Propagation:public SMESH_Hypothesis +class STDMESHERS_EXPORT StdMeshers_Propagation : public SMESH_Hypothesis { public: StdMeshers_Propagation(int hypId, int studyId, SMESH_Gen * gen); @@ -53,6 +54,12 @@ class STDMESHERS_EXPORT StdMeshers_Propagation:public SMESH_Hypothesis static std::string GetName (); + /*! + * \brief Returns a filter selecting both StdMeshers_Propagation and + * StdMeshers_PropagOfDistribution hypotheses + */ + static const SMESH_HypoFilter& GetFilter(); + /*! * \brief Set EventListener managing propagation of hypotheses * \param subMesh - edge submesh to set event listener on diff --git a/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx b/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx index e73f7bb11..a9990e5e7 100644 --- a/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx +++ b/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx @@ -199,7 +199,9 @@ bool StdMeshers_Quadrangle_2D::CheckHypothesis } } - return isOk; + error( StdMeshers_ViscousLayers2D::CheckHypothesis( aMesh, aShape, aStatus )); + + return aStatus == HYP_OK; } //============================================================================= diff --git a/src/StdMeshers/StdMeshers_Regular_1D.cxx b/src/StdMeshers/StdMeshers_Regular_1D.cxx index 1c97ebc36..cc964cfac 100644 --- a/src/StdMeshers/StdMeshers_Regular_1D.cxx +++ b/src/StdMeshers/StdMeshers_Regular_1D.cxx @@ -112,7 +112,7 @@ StdMeshers_Regular_1D::~StdMeshers_Regular_1D() //============================================================================= /*! - * + * */ //============================================================================= @@ -127,13 +127,18 @@ bool StdMeshers_Regular_1D::CheckHypothesis( SMESH_Mesh& aMesh, const list & hyps = GetUsedHypothesis(aMesh, aShape, /*ignoreAuxiliaryHyps=*/false); + const SMESH_HypoFilter & propagFilter = StdMeshers_Propagation::GetFilter(); + // find non-auxiliary hypothesis const SMESHDS_Hypothesis *theHyp = 0; + set< string > propagTypes; list ::const_iterator h = hyps.begin(); for ( ; h != hyps.end(); ++h ) { if ( static_cast(*h)->IsAuxiliary() ) { if ( strcmp( "QuadraticMesh", (*h)->GetName() ) == 0 ) _quadraticMesh = true; + if ( propagFilter.IsOk( static_cast< const SMESH_Hypothesis*>( *h ), aShape )) + propagTypes.insert( (*h)->GetName() ); } else { if ( !theHyp ) @@ -293,11 +298,48 @@ bool StdMeshers_Regular_1D::CheckHypothesis( SMESH_Mesh& aMesh, ASSERT(_adaptiveHyp); _hypType = ADAPTIVE; _onlyUnaryInput = false; + aStatus = SMESH_Hypothesis::HYP_OK; } else + { aStatus = SMESH_Hypothesis::HYP_INCOMPATIBLE; + } + + if ( propagTypes.size() > 1 && aStatus == HYP_OK ) + { + // detect concurrent Propagation hyps + _usedHypList.clear(); + list< TopoDS_Shape > assignedTo; + if ( aMesh.GetHypotheses( aShape, propagFilter, _usedHypList, true, &assignedTo ) > 1 ) + { + // find most simple shape and a hyp on it + int simpleShape = TopAbs_COMPOUND; + const SMESHDS_Hypothesis* localHyp = 0; + list< TopoDS_Shape >::iterator shape = assignedTo.begin(); + list< const SMESHDS_Hypothesis *>::iterator hyp = _usedHypList.begin(); + for ( ; shape != assignedTo.end(); ++shape ) + if ( shape->ShapeType() > simpleShape ) + { + simpleShape = shape->ShapeType(); + localHyp = (*hyp); + } + // check if there a different hyp on simpleShape + shape = assignedTo.begin(); + hyp = _usedHypList.begin(); + for ( ; hyp != _usedHypList.end(); ++hyp, ++shape ) + if ( shape->ShapeType() == simpleShape && + !localHyp->IsSameName( **hyp )) + { + aStatus = HYP_INCOMPAT_HYPS; + return error( SMESH_Comment("Hypotheses of both \"") + << StdMeshers_Propagation::GetName() << "\" and \"" + << StdMeshers_PropagOfDistribution::GetName() + << "\" types can't be applied to the same edge"); + } + } + } - return ( _hypType != NONE ); + return ( aStatus == SMESH_Hypothesis::HYP_OK ); } static bool computeParamByFunc(Adaptor3d_Curve& C3d, double first, double last, diff --git a/src/StdMeshers/StdMeshers_ViscousLayers.cxx b/src/StdMeshers/StdMeshers_ViscousLayers.cxx index a2a44a238..34762cc2a 100644 --- a/src/StdMeshers/StdMeshers_ViscousLayers.cxx +++ b/src/StdMeshers/StdMeshers_ViscousLayers.cxx @@ -355,6 +355,7 @@ namespace VISCOUS_3D bool IsOnEdge() const { return _2neibors; } gp_XYZ Copy( _LayerEdge& other, SMESH_MesherHelper& helper ); void SetCosin( double cosin ); + int NbSteps() const { return _pos.size() - 1; } // nb inlation steps }; struct _LayerEdgeCmp { @@ -414,6 +415,36 @@ namespace VISCOUS_3D bool CheckPrisms() const; }; + //-------------------------------------------------------------------------------- + /*! + * \brief Layers parameters got by averaging several hypotheses + */ + struct AverageHyp + { + AverageHyp( const StdMeshers_ViscousLayers* hyp = 0 ) + :_nbLayers(0), _nbHyps(0), _thickness(0), _stretchFactor(0) + { + Add( hyp ); + } + void Add( const StdMeshers_ViscousLayers* hyp ) + { + if ( hyp ) + { + _nbHyps++; + _nbLayers = hyp->GetNumberLayers(); + //_thickness += hyp->GetTotalThickness(); + _thickness = Max( _thickness, hyp->GetTotalThickness() ); + _stretchFactor += hyp->GetStretchFactor(); + } + } + double GetTotalThickness() const { return _thickness; /*_nbHyps ? _thickness / _nbHyps : 0;*/ } + double GetStretchFactor() const { return _nbHyps ? _stretchFactor / _nbHyps : 0; } + int GetNumberLayers() const { return _nbLayers; } + private: + int _nbLayers, _nbHyps; + double _thickness, _stretchFactor; + }; + //-------------------------------------------------------------------------------- typedef map< const SMDS_MeshNode*, _LayerEdge*, TIDCompare > TNode2Edge; @@ -424,12 +455,15 @@ namespace VISCOUS_3D */ struct _SolidData { + typedef const StdMeshers_ViscousLayers* THyp; TopoDS_Shape _solid; - const StdMeshers_ViscousLayers* _hyp; - TopoDS_Shape _hypShape; + TGeomID _index; // SOLID id _MeshOfSolid* _proxyMesh; - set _reversedFaceIds; - set _ignoreFaceIds; // WOL FACEs and FACEs of other SOLIDS + list< THyp > _hyps; + list< TopoDS_Shape > _hypShapes; + map< TGeomID, THyp > _face2hyp; // filled if _hyps.size() > 1 + set< TGeomID > _reversedFaceIds; + set< TGeomID > _ignoreFaceIds; // WOL FACEs and FACEs of other SOLIDs double _stepSize, _stepSizeCoeff, _geomSize; const SMDS_MeshNode* _stepSizeNodes[2]; @@ -439,7 +473,7 @@ namespace VISCOUS_3D // map to find _n2eMap of another _SolidData by a shrink shape shared by two _SolidData's map< TGeomID, TNode2Edge* > _s2neMap; // edges of _n2eMap. We keep same data in two containers because - // iteration over the map is 5 time longer than over the vector + // iteration over the map is 5 times longer than over the vector vector< _LayerEdge* > _edges; // key: an id of shape (EDGE or VERTEX) shared by a FACE with @@ -462,15 +496,16 @@ namespace VISCOUS_3D vector< int > _endEdgeOnShape; int _nbShapesToSmooth; - double _epsilon; // precision for SegTriaInter() + // data of averaged StdMeshers_ViscousLayers parameters for each shape with _LayerEdge's + vector< AverageHyp > _hypOnShape; + double _maxThickness; // of all _hyps + double _minThickness; // of all _hyps - TGeomID _index; // SOLID id, for debug + double _epsilon; // precision for SegTriaInter() - _SolidData(const TopoDS_Shape& s=TopoDS_Shape(), - const StdMeshers_ViscousLayers* h=0, - const TopoDS_Shape& hs=TopoDS_Shape(), - _MeshOfSolid* m=0) - :_solid(s), _hyp(h), _hypShape(hs), _proxyMesh(m) {} + _SolidData(const TopoDS_Shape& s=TopoDS_Shape(), + _MeshOfSolid* m=0) + :_solid(s), _proxyMesh(m) {} ~_SolidData(); Handle(Geom_Curve) CurveForSmooth( const TopoDS_Edge& E, @@ -496,7 +531,7 @@ namespace VISCOUS_3D iEnd = _endEdgeOnShape[ end ]; } - bool GetShapeEdges(const TGeomID shapeID, size_t& edgeEnd, int* iBeg=0, int* iEnd=0 ) const; + bool GetShapeEdges(const TGeomID shapeID, size_t& iEdgeEnd, int* iBeg=0, int* iEnd=0 ) const; void AddShapesToSmooth( const set< TGeomID >& shapeIDs ); }; @@ -563,6 +598,9 @@ namespace VISCOUS_3D // does it's job SMESH_ComputeErrorPtr Compute(SMESH_Mesh& mesh, const TopoDS_Shape& shape); + // check validity of hypotheses + SMESH_ComputeErrorPtr CheckHypotheses( SMESH_Mesh& mesh, + const TopoDS_Shape& shape ); // restore event listeners used to clear an inferior dim sub-mesh modified by viscous layers void RestoreListeners(); @@ -573,7 +611,11 @@ namespace VISCOUS_3D private: bool findSolidsWithLayers(); - bool findFacesWithLayers(); + bool findFacesWithLayers(const bool onlyWith=false); + void getIgnoreFaces(const TopoDS_Shape& solid, + const StdMeshers_ViscousLayers* hyp, + const TopoDS_Shape& hypShape, + set& ignoreFaces); bool makeLayer(_SolidData& data); bool setEdgeData(_LayerEdge& edge, const set& subIds, SMESH_MesherHelper& helper, _SolidData& data); @@ -832,6 +874,27 @@ bool StdMeshers_ViscousLayers::SetParametersByMesh(const SMESH_Mesh* theMesh, { // TODO return false; +} // -------------------------------------------------------------------------------- +SMESH_ComputeErrorPtr +StdMeshers_ViscousLayers::CheckHypothesis(SMESH_Mesh& theMesh, + const TopoDS_Shape& theShape, + SMESH_Hypothesis::Hypothesis_Status& theStatus) +{ + VISCOUS_3D::_ViscousBuilder bulder; + SMESH_ComputeErrorPtr err = bulder.CheckHypotheses( theMesh, theShape ); + if ( err && !err->IsOK() ) + theStatus = SMESH_Hypothesis::HYP_INCOMPAT_HYPS; + else + theStatus = SMESH_Hypothesis::HYP_OK; + + return err; +} +// -------------------------------------------------------------------------------- +bool StdMeshers_ViscousLayers::IsShapeWithLayers(int shapeIndex) const +{ + bool isIn = + ( std::find( _shapeIds.begin(), _shapeIds.end(), shapeIndex ) != _shapeIds.end() ); + return IsToIgnoreShapes() ? !isIn : isIn; } // END StdMeshers_ViscousLayers hypothesis //================================================================================ @@ -1313,6 +1376,34 @@ SMESH_ComputeErrorPtr _ViscousBuilder::Compute(SMESH_Mesh& theMesh, return _error; } +//================================================================================ +/*! + * \brief Check validity of hypotheses + */ +//================================================================================ + +SMESH_ComputeErrorPtr _ViscousBuilder::CheckHypotheses( SMESH_Mesh& mesh, + const TopoDS_Shape& shape ) +{ + _mesh = & mesh; + + if ( _ViscousListener::GetSolidMesh( _mesh, shape, /*toCreate=*/false)) + return SMESH_ComputeErrorPtr(); // everything already computed + + + findSolidsWithLayers(); + bool ok = findFacesWithLayers(); + + // remove _MeshOfSolid's of _SolidData's + for ( size_t i = 0; i < _sdVec.size(); ++i ) + _ViscousListener::RemoveSolidMesh( _mesh, _sdVec[i]._solid ); + + if ( !ok ) + return _error; + + return SMESH_ComputeErrorPtr(); +} + //================================================================================ /*! * \brief Finds SOLIDs to compute using viscous layers. Fills _sdVec @@ -1336,22 +1427,28 @@ bool _ViscousBuilder::findSolidsWithLayers() // TODO: check if algo is hidden const list & allHyps = algo->GetUsedHypothesis(*_mesh, allSolids(i), /*ignoreAuxiliary=*/false); + _SolidData* soData = 0; list< const SMESHDS_Hypothesis *>::const_iterator hyp = allHyps.begin(); const StdMeshers_ViscousLayers* viscHyp = 0; - for ( ; hyp != allHyps.end() && !viscHyp; ++hyp ) - viscHyp = dynamic_cast( *hyp ); - if ( viscHyp ) - { - TopoDS_Shape hypShape; - filter.Init( filter.Is( viscHyp )); - _mesh->GetHypothesis( allSolids(i), filter, true, &hypShape ); + for ( ; hyp != allHyps.end(); ++hyp ) + if ( viscHyp = dynamic_cast( *hyp )) + { + TopoDS_Shape hypShape; + filter.Init( filter.Is( viscHyp )); + _mesh->GetHypothesis( allSolids(i), filter, true, &hypShape ); - _MeshOfSolid* proxyMesh = _ViscousListener::GetSolidMesh( _mesh, - allSolids(i), - /*toCreate=*/true); - _sdVec.push_back( _SolidData( allSolids(i), viscHyp, hypShape, proxyMesh )); - _sdVec.back()._index = getMeshDS()->ShapeToIndex( allSolids(i)); - } + if ( !soData ) + { + _MeshOfSolid* proxyMesh = _ViscousListener::GetSolidMesh( _mesh, + allSolids(i), + /*toCreate=*/true); + _sdVec.push_back( _SolidData( allSolids(i), proxyMesh )); + soData = & _sdVec.back(); + soData->_index = getMeshDS()->ShapeToIndex( allSolids(i)); + } + soData->_hyps.push_back( viscHyp ); + soData->_hypShapes.push_back( hypShape ); + } } if ( _sdVec.empty() ) return error @@ -1366,7 +1463,7 @@ bool _ViscousBuilder::findSolidsWithLayers() */ //================================================================================ -bool _ViscousBuilder::findFacesWithLayers() +bool _ViscousBuilder::findFacesWithLayers(const bool onlyWith) { SMESH_MesherHelper helper( *_mesh ); TopExp_Explorer exp; @@ -1377,56 +1474,99 @@ bool _ViscousBuilder::findFacesWithLayers() { solids.Add( _sdVec[i]._solid ); - vector ids = _sdVec[i]._hyp->GetBndShapes(); - if ( _sdVec[i]._hyp->IsToIgnoreShapes() ) // FACEs to ignore are given + // get faces to ignore defined by each hyp + typedef const StdMeshers_ViscousLayers* THyp; + typedef std::pair< set, THyp > TFacesOfHyp; + list< TFacesOfHyp > ignoreFacesOfHyps; + list< THyp >::iterator hyp = _sdVec[i]._hyps.begin(); + list< TopoDS_Shape >::iterator hypShape = _sdVec[i]._hypShapes.begin(); + for ( ; hyp != _sdVec[i]._hyps.end(); ++hyp, ++hypShape ) { - for ( size_t ii = 0; ii < ids.size(); ++ii ) - { - const TopoDS_Shape& s = getMeshDS()->IndexToShape( ids[ii] ); - if ( !s.IsNull() && s.ShapeType() == TopAbs_FACE ) - _sdVec[i]._ignoreFaceIds.insert( ids[ii] ); - } + ignoreFacesOfHyps.push_back( TFacesOfHyp( set(), *hyp )); + getIgnoreFaces( _sdVec[i]._solid, *hyp, *hypShape, ignoreFacesOfHyps.back().first ); } - else // FACEs with layers are given + + // fill _SolidData::_face2hyp and check compatibility of hypotheses + const int nbHyps = _sdVec[i]._hyps.size(); + if ( nbHyps > 1 ) { - exp.Init( _sdVec[i]._solid, TopAbs_FACE ); - for ( ; exp.More(); exp.Next() ) + // check if two hypotheses define different parameters for the same FACE + list< TFacesOfHyp >::iterator igFacesOfHyp; + for ( exp.Init( _sdVec[i]._solid, TopAbs_FACE ); exp.More(); exp.Next() ) + { + const TGeomID faceID = getMeshDS()->ShapeToIndex( exp.Current() ); + THyp hyp = 0; + igFacesOfHyp = ignoreFacesOfHyps.begin(); + for ( ; igFacesOfHyp != ignoreFacesOfHyps.end(); ++igFacesOfHyp ) + if ( ! igFacesOfHyp->first.count( faceID )) + { + if ( hyp ) + return error(SMESH_Comment("Several hypotheses define " + "Viscous Layers on the face #") << faceID ); + hyp = igFacesOfHyp->second; + } + if ( hyp ) + _sdVec[i]._face2hyp.insert( make_pair( faceID, hyp )); + else + _sdVec[i]._ignoreFaceIds.insert( faceID ); + } + + // check if two hypotheses define different number of viscous layers for + // adjacent faces of a solid + set< int > nbLayersSet; + igFacesOfHyp = ignoreFacesOfHyps.begin(); + for ( ; igFacesOfHyp != ignoreFacesOfHyps.end(); ++igFacesOfHyp ) { - TGeomID faceInd = getMeshDS()->ShapeToIndex( exp.Current() ); - if ( find( ids.begin(), ids.end(), faceInd ) == ids.end() ) - _sdVec[i]._ignoreFaceIds.insert( faceInd ); + nbLayersSet.insert( igFacesOfHyp->second->GetNumberLayers() ); } + if ( nbLayersSet.size() > 1 ) + { + for ( exp.Init( _sdVec[i]._solid, TopAbs_EDGE ); exp.More(); exp.Next() ) + { + PShapeIteratorPtr fIt = helper.GetAncestors( exp.Current(), *_mesh, TopAbs_FACE ); + THyp hyp1 = 0, hyp2 = 0; + while( const TopoDS_Shape* face = fIt->next() ) + { + const TGeomID faceID = getMeshDS()->ShapeToIndex( *face ); + map< TGeomID, THyp >::iterator f2h = _sdVec[i]._face2hyp.find( faceID ); + if ( f2h != _sdVec[i]._face2hyp.end() ) + { + ( hyp1 ? hyp2 : hyp1 ) = f2h->second; + } + } + if ( hyp1 && hyp2 && + hyp1->GetNumberLayers() != hyp2->GetNumberLayers() ) + { + return error("Two hypotheses define different number of " + "viscous layers on adjacent faces"); + } + } + } + } // if ( nbHyps > 1 ) + else + { + _sdVec[i]._ignoreFaceIds.swap( ignoreFacesOfHyps.back().first ); } - // ignore internal FACEs if inlets and outlets are specified + // fill _SolidData::_reversedFaceIds { - TopTools_IndexedDataMapOfShapeListOfShape solidsOfFace; - if ( _sdVec[i]._hyp->IsToIgnoreShapes() ) - TopExp::MapShapesAndAncestors( _sdVec[i]._hypShape, - TopAbs_FACE, TopAbs_SOLID, solidsOfFace); - exp.Init( _sdVec[i]._solid.Oriented( TopAbs_FORWARD ), TopAbs_FACE ); for ( ; exp.More(); exp.Next() ) { const TopoDS_Face& face = TopoDS::Face( exp.Current() ); - if ( helper.NbAncestors( face, *_mesh, TopAbs_SOLID ) < 2 ) - continue; - - const TGeomID faceInd = getMeshDS()->ShapeToIndex( face ); - if ( _sdVec[i]._hyp->IsToIgnoreShapes() ) + const TGeomID faceID = getMeshDS()->ShapeToIndex( face ); + if ( //!sdVec[i]._ignoreFaceIds.count( faceID ) && ??????? + helper.NbAncestors( face, *_mesh, TopAbs_SOLID ) > 1 && + helper.IsReversedSubMesh( face )) { - int nbSolids = solidsOfFace.FindFromKey( face ).Extent(); - if ( nbSolids > 1 ) - _sdVec[i]._ignoreFaceIds.insert( faceInd ); - } - - if ( helper.IsReversedSubMesh( face )) - { - _sdVec[i]._reversedFaceIds.insert( faceInd ); + _sdVec[i]._reversedFaceIds.insert( faceID ); } } } - } + } // loop on _sdVec + + if ( onlyWith ) // is called to check hypotheses compatibility only + return true; // Find faces to shrink mesh on (solution 2 in issue 0020832); TopTools_IndexedMapOfShape shapes; @@ -1642,6 +1782,60 @@ bool _ViscousBuilder::findFacesWithLayers() return true; } +//================================================================================ +/*! + * \brief Finds FACEs w/o layers for a given SOLID by an hypothesis + */ +//================================================================================ + +void _ViscousBuilder::getIgnoreFaces(const TopoDS_Shape& solid, + const StdMeshers_ViscousLayers* hyp, + const TopoDS_Shape& hypShape, + set& ignoreFaceIds) +{ + TopExp_Explorer exp; + + vector ids = hyp->GetBndShapes(); + if ( hyp->IsToIgnoreShapes() ) // FACEs to ignore are given + { + for ( size_t ii = 0; ii < ids.size(); ++ii ) + { + const TopoDS_Shape& s = getMeshDS()->IndexToShape( ids[ii] ); + if ( !s.IsNull() && s.ShapeType() == TopAbs_FACE ) + ignoreFaceIds.insert( ids[ii] ); + } + } + else // FACEs with layers are given + { + exp.Init( solid, TopAbs_FACE ); + for ( ; exp.More(); exp.Next() ) + { + TGeomID faceInd = getMeshDS()->ShapeToIndex( exp.Current() ); + if ( find( ids.begin(), ids.end(), faceInd ) == ids.end() ) + ignoreFaceIds.insert( faceInd ); + } + } + + // ignore internal FACEs if inlets and outlets are specified + if ( hyp->IsToIgnoreShapes() ) + { + TopTools_IndexedDataMapOfShapeListOfShape solidsOfFace; + TopExp::MapShapesAndAncestors( hypShape, + TopAbs_FACE, TopAbs_SOLID, solidsOfFace); + + for ( exp.Init( solid, TopAbs_FACE ); exp.More(); exp.Next() ) + { + const TopoDS_Face& face = TopoDS::Face( exp.Current() ); + if ( SMESH_MesherHelper::NbAncestors( face, *_mesh, TopAbs_SOLID ) < 2 ) + continue; + + int nbSolids = solidsOfFace.FindFromKey( face ).Extent(); + if ( nbSolids > 1 ) + ignoreFaceIds.insert( getMeshDS()->ShapeToIndex( face )); + } + } +} + //================================================================================ /*! * \brief Create the inner surface of the viscous layer and prepare data for infation @@ -1940,7 +2134,6 @@ void _ViscousBuilder::limitStepSize( _SolidData& data, const double minSize ) void _ViscousBuilder::limitStepSizeByCurvature( _SolidData& data ) { const int nbTestPnt = 5; // on a FACE sub-shape - const double minCurvature = 0.9 / data._hyp->GetTotalThickness(); BRepLProp_SLProps surfProp( 2, 1e-6 ); SMESH_MesherHelper helper( *_mesh ); @@ -1975,8 +2168,9 @@ void _ViscousBuilder::limitStepSizeByCurvature( _SolidData& data ) else continue; // check concavity and curvature and limit data._stepSize + const double minCurvature = 0.9 / data._hypOnShape[ edgesEnd ].GetTotalThickness(); int nbLEdges = iEnd - iBeg; - int iStep = Max( 1, nbLEdges / nbTestPnt ); + int iStep = Max( 1, nbLEdges / nbTestPnt ); for ( ; iBeg < iEnd; iBeg += iStep ) { gp_XY uv = helper.GetNodeUV( F, data._edges[ iBeg ]->_nodes[0] ); @@ -2069,7 +2263,16 @@ bool _ViscousBuilder::sortEdges( _SolidData& data, { // define allowed thickness computeGeomSize( data ); // compute data._geomSize - const double tgtThick = Min( 0.5 * data._geomSize, data._hyp->GetTotalThickness() ); + + data._maxThickness = 0; + data._minThickness = 1e100; + list< const StdMeshers_ViscousLayers* >::iterator hyp = data._hyps.begin(); + for ( ; hyp != data._hyps.end(); ++hyp ) + { + data._maxThickness = Max( data._maxThickness, (*hyp)->GetTotalThickness() ); + data._minThickness = Min( data._minThickness, (*hyp)->GetTotalThickness() ); + } + const double tgtThick = /*Min( 0.5 * data._geomSize, */data._maxThickness; // Find shapes needing smoothing; such a shape has _LayerEdge._normal on it's // boundry inclined to the shape at a sharp angle @@ -2200,6 +2403,45 @@ bool _ViscousBuilder::sortEdges( _SolidData& data, //eVec.clear(); } + // compute average StdMeshers_ViscousLayers parameters for each shape + + data._hypOnShape.clear(); + if ( data._hyps.size() == 1 ) + { + data._hypOnShape.resize( data._endEdgeOnShape.size(), AverageHyp( data._hyps.back() )); + } + else + { + data._hypOnShape.resize( data._endEdgeOnShape.size() ); + map< TGeomID, const StdMeshers_ViscousLayers* >::iterator f2hyp; + for ( size_t i = 0; i < data._endEdgeOnShape.size(); ++i ) + { + int iEnd = data._endEdgeOnShape[i]; + _LayerEdge* LE = data._edges[ iEnd-1 ]; + TGeomID iShape = LE->_nodes[0]->getshapeId(); + const TopoDS_Shape& S = getMeshDS()->IndexToShape( iShape ); + if ( S.ShapeType() == TopAbs_FACE ) + { + if (( f2hyp = data._face2hyp.find( iShape )) != data._face2hyp.end() ) + { + data._hypOnShape[ i ].Add( f2hyp->second ); + } + } + else + { + PShapeIteratorPtr fIt = SMESH_MesherHelper::GetAncestors( S, *_mesh, TopAbs_FACE ); + while ( const TopoDS_Shape* face = fIt->next() ) + { + TGeomID faceID = getMeshDS()->ShapeToIndex( *face ); + if (( f2hyp = data._face2hyp.find( faceID )) != data._face2hyp.end() ) + { + data._hypOnShape[ i ].Add( f2hyp->second ); + } + } + } + } + } + return ok; } @@ -2912,9 +3154,9 @@ bool _ViscousBuilder::inflate(_SolidData& data) if ( data._stepSize > 0.3 * data._geomSize ) limitStepSize( data, 0.3 * data._geomSize ); - const double tgtThick = data._hyp->GetTotalThickness(); - if ( data._stepSize > tgtThick ) - limitStepSize( data, tgtThick ); + const double tgtThick = data._maxThickness; + if ( data._stepSize > data._minThickness ) + limitStepSize( data, data._minThickness ); if ( data._stepSize < 1. ) data._epsilon = data._stepSize * 1e-7; @@ -2923,21 +3165,26 @@ bool _ViscousBuilder::inflate(_SolidData& data) double avgThick = 0, curThick = 0, distToIntersection = Precision::Infinite(); int nbSteps = 0, nbRepeats = 0; - while ( 1.01 * avgThick < tgtThick ) + int iBeg, iEnd, iS; + while ( avgThick < 0.99 ) { // new target length curThick += data._stepSize; if ( curThick > tgtThick ) { - curThick = tgtThick + ( tgtThick-avgThick ) * nbRepeats; + curThick = tgtThick + tgtThick*( 1.-avgThick ) * nbRepeats; nbRepeats++; } // Elongate _LayerEdge's dumpFunction(SMESH_Comment("inflate")<SetNewLength( curThick, helper ); + const double shapeCurThick = Min( curThick, data._hypOnShape[ iS ].GetTotalThickness() ); + for ( iEnd = data._endEdgeOnShape[ iS ]; iBeg < iEnd; ++iBeg ) + { + data._edges[iBeg]->SetNewLength( shapeCurThick, helper ); + } } dumpFunctionEnd(); @@ -2962,16 +3209,22 @@ bool _ViscousBuilder::inflate(_SolidData& data) // Evaluate achieved thickness avgThick = 0; - for ( size_t i = 0; i < data._edges.size(); ++i ) - avgThick += data._edges[i]->_len; + for ( iBeg = 0, iS = 0; iS < data._endEdgeOnShape.size(); ++iS ) + { + const double shapeTgtThick = data._hypOnShape[ iS ].GetTotalThickness(); + for ( iEnd = data._endEdgeOnShape[ iS ]; iBeg < iEnd; ++iBeg ) + { + avgThick += Min( 1., data._edges[iBeg]->_len / shapeTgtThick ); + } + } avgThick /= data._edges.size(); - debugMsg( "-- Thickness " << avgThick << " reached" ); + debugMsg( "-- Thickness " << avgThick*100 << "% reached" ); - if ( distToIntersection < avgThick*1.5 ) + if ( distToIntersection < tgtThick*avgThick*1.5 ) { debugMsg( "-- Stop inflation since " << " distToIntersection( "<GetSubMeshContaining( data._index )) { SMESH_ComputeErrorPtr& smError = sm->GetComputeError(); @@ -2994,14 +3247,13 @@ bool _ViscousBuilder::inflate(_SolidData& data) ( new SMESH_ComputeError (COMPERR_WARNING, SMESH_Comment("Thickness ") << tgtThick << " of viscous layers not reached," - " average reached thickness is " << avgThick )); + " average reached thickness is " << avgThick*100 << "%.")); } // Restore position of src nodes moved by infaltion on _noShrinkShapes dumpFunction(SMESH_Comment("restoNoShrink_So")<NbSteps() >= nbSteps+1; + // if ( !toSmooth ) + // { + // if ( iS+1 == data._nbShapesToSmooth ) + // data._nbShapesToSmooth--; + // continue; // target length reached some steps before + // } + if ( !data._edges[ iBeg ]->_sWOL.IsNull() && data._edges[ iBeg ]->_sWOL.ShapeType() == TopAbs_FACE ) { @@ -3089,10 +3351,10 @@ bool _ViscousBuilder::smoothAndCheck(_SolidData& data, badNb = 0; moved = false; if ( step % 2 ) - for ( int i = iBeg; i < iEnd; ++i ) + for ( int i = iBeg; i < iEnd; ++i ) // iterate forward moved |= data._edges[i]->Smooth(badNb); else - for ( int i = iEnd-1; i >= iBeg; --i ) + for ( int i = iEnd-1; i >= iBeg; --i ) // iterate backward moved |= data._edges[i]->Smooth(badNb); improved = ( badNb < oldBadNb ); @@ -3330,14 +3592,14 @@ void _SolidData::SortOnEdge( const TopoDS_Edge& E, //================================================================================ bool _SolidData::GetShapeEdges(const TGeomID shapeID, - size_t & edgesEnd, + size_t & iEdgesEnd, int* iBeg, int* iEnd ) const { int beg = 0, end = 0; - for ( edgesEnd = 0; edgesEnd < _endEdgeOnShape.size(); ++edgesEnd ) + for ( iEdgesEnd = 0; iEdgesEnd < _endEdgeOnShape.size(); ++iEdgesEnd ) { - end = _endEdgeOnShape[ edgesEnd ]; + end = _endEdgeOnShape[ iEdgesEnd ]; TGeomID sID = _edges[ beg ]->_nodes[0]->getshapeId(); if ( sID == shapeID ) { @@ -4699,7 +4961,7 @@ void _LayerEdge::SetNewLength( double len, SMESH_MesherHelper& helper ) { if ( _len - len > -1e-6 ) { - _pos.push_back( _pos.back() ); + //_pos.push_back( _pos.back() ); return; } @@ -4809,6 +5071,8 @@ bool _ViscousBuilder::refine(_SolidData& data) // Create intermediate nodes on each _LayerEdge + int iS = 0, iEnd = data._endEdgeOnShape[ iS ]; + for ( size_t i = 0; i < data._edges.size(); ++i ) { _LayerEdge& edge = *data._edges[i]; @@ -4816,6 +5080,11 @@ bool _ViscousBuilder::refine(_SolidData& data) if ( edge._nodes.size() < 2 ) continue; // on _noShrinkShapes + // get parameters of layers for the edge + if ( i == iEnd ) + iEnd = data._endEdgeOnShape[ ++iS ]; + const AverageHyp& hyp = data._hypOnShape[ iS ]; + // get accumulated length of segments vector< double > segLen( edge._pos.size() ); segLen[0] = 0.0; @@ -4826,7 +5095,7 @@ bool _ViscousBuilder::refine(_SolidData& data) const SMDS_MeshNode* tgtNode = edge._nodes.back(); if ( edge._nodes.size() == 2 ) { - edge._nodes.resize( data._hyp->GetNumberLayers() + 1, 0 ); + edge._nodes.resize( hyp.GetNumberLayers() + 1, 0 ); edge._nodes[1] = 0; edge._nodes.back() = tgtNode; } @@ -4875,8 +5144,8 @@ bool _ViscousBuilder::refine(_SolidData& data) // calculate height of the first layer double h0; const double T = segLen.back(); //data._hyp.GetTotalThickness(); - const double f = data._hyp->GetStretchFactor(); - const int N = data._hyp->GetNumberLayers(); + const double f = hyp.GetStretchFactor(); + const int N = hyp.GetNumberLayers(); const double fPowN = pow( f, N ); if ( fPowN - 1 <= numeric_limits::min() ) h0 = T / N; @@ -4995,10 +5264,12 @@ bool _ViscousBuilder::refine(_SolidData& data) TopExp_Explorer exp( data._solid, TopAbs_FACE ); for ( ; exp.More(); exp.Next() ) { - if ( data._ignoreFaceIds.count( getMeshDS()->ShapeToIndex( exp.Current() ))) + const TGeomID faceID = getMeshDS()->ShapeToIndex( exp.Current() ); + if ( data._ignoreFaceIds.count( faceID )) continue; - SMESHDS_SubMesh* fSubM = getMeshDS()->MeshElements( exp.Current() ); - SMDS_ElemIteratorPtr fIt = fSubM->GetElements(); + const bool isReversedFace = data._reversedFaceIds.count( faceID ); + SMESHDS_SubMesh* fSubM = getMeshDS()->MeshElements( exp.Current() ); + SMDS_ElemIteratorPtr fIt = fSubM->GetElements(); while ( fIt->more() ) { const SMDS_MeshElement* face = fIt->next(); @@ -5011,14 +5282,15 @@ bool _ViscousBuilder::refine(_SolidData& data) for ( int iN = 0; iN < nbNodes; ++iN ) { const SMDS_MeshNode* n = nIt->next(); - nnVec[ iN ] = & data._n2eMap[ n ]->_nodes; - if ( nnVec[ iN ]->size() < 2 ) + const int i = isReversedFace ? nbNodes-1-iN : iN; + nnVec[ i ] = & data._n2eMap[ n ]->_nodes; + if ( nnVec[ i ]->size() < 2 ) degenEdgeInd.insert( iN ); else - nbZ = nnVec[ iN ]->size(); + nbZ = nnVec[ i ]->size(); if ( helper.HasDegeneratedEdges() ) - nnSet.insert( nnVec[ iN ]); + nnSet.insert( nnVec[ i ]); } if ( nbZ == 0 ) continue; diff --git a/src/StdMeshers/StdMeshers_ViscousLayers.hxx b/src/StdMeshers/StdMeshers_ViscousLayers.hxx index 5fe0a7b80..9c26048b6 100644 --- a/src/StdMeshers/StdMeshers_ViscousLayers.hxx +++ b/src/StdMeshers/StdMeshers_ViscousLayers.hxx @@ -28,6 +28,7 @@ #include "SMESH_Hypothesis.hxx" #include "SMESH_ProxyMesh.hxx" +#include "SMESH_ComputeError.hxx" #include @@ -39,7 +40,7 @@ class STDMESHERS_EXPORT StdMeshers_ViscousLayers : public SMESH_Hypothesis public: StdMeshers_ViscousLayers(int hypId, int studyId, SMESH_Gen* gen); - // Set boundary shapes, faces in 3D, edges in 2D, either to exclude from + // Set boundary shapes (faces in 3D, edges in 2D) either to exclude from // treatment or to make the Viscous Layers on void SetBndShapes(const std::vector& shapeIds, bool toIgnore); std::vector GetBndShapes() const { return _shapeIds; } @@ -63,6 +64,15 @@ public: const TopoDS_Shape& theShape, const bool toMakeN2NMap=false) const; + // Checks compatibility of assigned StdMeshers_ViscousLayers hypotheses + static SMESH_ComputeErrorPtr + CheckHypothesis(SMESH_Mesh& aMesh, + const TopoDS_Shape& aShape, + SMESH_Hypothesis::Hypothesis_Status& aStatus); + + // Checks if viscous layers should be constructed on a shape + bool IsShapeWithLayers(int shapeIndex) const; + virtual std::ostream & SaveTo(std::ostream & save); virtual std::istream & LoadFrom(std::istream & load); diff --git a/src/StdMeshers/StdMeshers_ViscousLayers2D.cxx b/src/StdMeshers/StdMeshers_ViscousLayers2D.cxx index 2f7ff1793..013e2d9d9 100644 --- a/src/StdMeshers/StdMeshers_ViscousLayers2D.cxx +++ b/src/StdMeshers/StdMeshers_ViscousLayers2D.cxx @@ -256,6 +256,7 @@ namespace VISCOUS_2D _PolyLine* _rightLine; int _firstPntInd; // index in vector of _wire int _lastPntInd; + int _index; // index in _ViscousBuilder2D::_polyLineVec vector< _LayerEdge > _lEdges; /* _lEdges[0] is usually is not treated as it is equal to the last one of the _leftLine */ @@ -325,6 +326,7 @@ namespace VISCOUS_2D //-------------------------------------------------------------------------------- typedef map< const SMDS_MeshNode*, _LayerEdge*, TIDCompare > TNode2Edge; + typedef StdMeshers_ViscousLayers2D THypVL; //-------------------------------------------------------------------------------- /*! @@ -335,14 +337,17 @@ namespace VISCOUS_2D public: _ViscousBuilder2D(SMESH_Mesh& theMesh, const TopoDS_Face& theFace, - const StdMeshers_ViscousLayers2D* theHyp); + vector< const THypVL* > & theHyp, + vector< TopoDS_Shape > & theHypShapes); SMESH_ComputeErrorPtr GetError() const { return _error; } // does it's job - SMESH_ProxyMesh::Ptr Compute(const TopoDS_Shape& theShapeHypAssignedTo); + SMESH_ProxyMesh::Ptr Compute(); private: - bool findEdgesWithLayers(const TopoDS_Shape& theShapeHypAssignedTo); + friend class ::StdMeshers_ViscousLayers2D; + + bool findEdgesWithLayers(); bool makePolyLines(); bool inflate(); bool fixCollisions(); @@ -362,9 +367,13 @@ namespace VISCOUS_2D GeomAPI_ProjectPointOnSurf* faceProj); void adjustCommonEdge( _PolyLine& LL, _PolyLine& LR ); void calcLayersHeight(const double totalThick, - vector& heights); + vector& heights, + const THypVL* hyp); bool removeMeshFaces(const TopoDS_Shape& face); + const THypVL* getLineHypothesis(int iPL); + double getLineThickness (int iPL); + bool error( const string& text ); SMESHDS_Mesh* getMeshDS() { return _mesh->GetMeshDS(); } _ProxyMeshOfFace* getProxyMesh(); @@ -377,7 +386,8 @@ namespace VISCOUS_2D // input data SMESH_Mesh* _mesh; TopoDS_Face _face; - const StdMeshers_ViscousLayers2D* _hyp; + vector< const THypVL* > _hyps; + vector< TopoDS_Shape > _hypShapes; // result data SMESH_ProxyMesh::Ptr _proxyMesh; @@ -388,11 +398,12 @@ namespace VISCOUS_2D SMESH_MesherHelper _helper; TSideVector _faceSideVec; // wires (StdMeshers_FaceSide) of _face vector<_PolyLine> _polyLineVec; // fronts to advance + vector< const THypVL* > _hypOfEdge; // a hyp per an EDGE of _faceSideVec bool _is2DIsotropic; // is same U and V resoulution of _face vector _clearedFaces; // FACEs whose mesh was removed by shrink() - double _fPowN; // to compute thickness of layers - double _thickness; // required or possible layers thickness + //double _fPowN; // to compute thickness of layers + double _maxThickness; // max possible layers thickness // sub-shapes of _face set _ignoreShapeIds; // ids of EDGEs w/o layers @@ -409,15 +420,32 @@ namespace VISCOUS_2D /*! * \brief Returns StdMeshers_ViscousLayers2D for the FACE */ - const StdMeshers_ViscousLayers2D* findHyp(SMESH_Mesh& theMesh, - const TopoDS_Face& theFace, - TopoDS_Shape* assignedTo=0) + bool findHyps(SMESH_Mesh& theMesh, + const TopoDS_Face& theFace, + vector< const StdMeshers_ViscousLayers2D* > & theHyps, + vector< TopoDS_Shape > & theAssignedTo) { + theHyps.clear(); + theAssignedTo.clear(); SMESH_HypoFilter hypFilter ( SMESH_HypoFilter::HasName( StdMeshers_ViscousLayers2D::GetHypType() )); - const SMESH_Hypothesis * hyp = - theMesh.GetHypothesis( theFace, hypFilter, /*ancestors=*/true, assignedTo ); - return dynamic_cast< const StdMeshers_ViscousLayers2D* > ( hyp ); + list< const SMESHDS_Hypothesis * > hypList; + list< TopoDS_Shape > hypShapes; + int nbHyps = theMesh.GetHypotheses + ( theFace, hypFilter, hypList, /*ancestors=*/true, &hypShapes ); + if ( nbHyps ) + { + theHyps.reserve( nbHyps ); + theAssignedTo.reserve( nbHyps ); + list< const SMESHDS_Hypothesis * >::iterator hyp = hypList.begin(); + list< TopoDS_Shape >::iterator shape = hypShapes.begin(); + for ( ; hyp != hypList.end(); ++hyp, ++shape ) + { + theHyps.push_back( static_cast< const StdMeshers_ViscousLayers2D* > ( *hyp )); + theAssignedTo.push_back( *shape ); + } + } + return nbHyps; } //================================================================================ @@ -436,7 +464,7 @@ namespace VISCOUS_2D const SMESHDS_Mesh* theMesh, set< int > & theEdgeIds) { - int nbToEdgesIgnore = 0; + int nbEdgesToIgnore = 0; vector ids = theHyp->GetBndShapes(); if ( theHyp->IsToIgnoreShapes() ) // EDGEs to ignore are given { @@ -448,20 +476,20 @@ namespace VISCOUS_2D SMESH_MesherHelper::IsSubShape( E, theFace )) { theEdgeIds.insert( ids[i] ); - ++nbToEdgesIgnore; + ++nbEdgesToIgnore; } } } else // EDGEs to make the Viscous Layers on are given { TopExp_Explorer E( theFace, TopAbs_EDGE ); - for ( ; E.More(); E.Next(), ++nbToEdgesIgnore ) + for ( ; E.More(); E.Next(), ++nbEdgesToIgnore ) theEdgeIds.insert( theMesh->ShapeToIndex( E.Current() )); for ( size_t i = 0; i < ids.size(); ++i ) - nbToEdgesIgnore -= theEdgeIds.erase( ids[i] ); + nbEdgesToIgnore -= theEdgeIds.erase( ids[i] ); } - return nbToEdgesIgnore; + return nbEdgesToIgnore; } } // namespace VISCOUS_2D @@ -489,12 +517,12 @@ StdMeshers_ViscousLayers2D::Compute(SMESH_Mesh& theMesh, { SMESH_ProxyMesh::Ptr pm; - TopoDS_Shape hypAssignedTo; - const StdMeshers_ViscousLayers2D* vlHyp = VISCOUS_2D::findHyp( theMesh, theFace, &hypAssignedTo ); - if ( vlHyp ) + vector< const StdMeshers_ViscousLayers2D* > hyps; + vector< TopoDS_Shape > hypShapes; + if ( VISCOUS_2D::findHyps( theMesh, theFace, hyps, hypShapes )) { - VISCOUS_2D::_ViscousBuilder2D builder( theMesh, theFace, vlHyp ); - pm = builder.Compute( hypAssignedTo ); + VISCOUS_2D::_ViscousBuilder2D builder( theMesh, theFace, hyps, hypShapes ); + pm = builder.Compute(); SMESH_ComputeErrorPtr error = builder.GetError(); if ( error && !error->IsOK() ) theMesh.GetSubMesh( theFace )->GetComputeError() = error; @@ -510,6 +538,38 @@ StdMeshers_ViscousLayers2D::Compute(SMESH_Mesh& theMesh, return pm; } // -------------------------------------------------------------------------------- +SMESH_ComputeErrorPtr +StdMeshers_ViscousLayers2D::CheckHypothesis(SMESH_Mesh& theMesh, + const TopoDS_Shape& theShape, + SMESH_Hypothesis::Hypothesis_Status& theStatus) +{ + SMESH_ComputeErrorPtr error = SMESH_ComputeError::New(COMPERR_OK); + theStatus = SMESH_Hypothesis::HYP_OK; + + TopExp_Explorer exp( theShape, TopAbs_FACE ); + for ( ; exp.More() && theStatus == SMESH_Hypothesis::HYP_OK; exp.Next() ) + { + const TopoDS_Face& face = TopoDS::Face( exp.Current() ); + vector< const StdMeshers_ViscousLayers2D* > hyps; + vector< TopoDS_Shape > hypShapes; + if ( VISCOUS_2D::findHyps( theMesh, face, hyps, hypShapes )) + { + VISCOUS_2D::_ViscousBuilder2D builder( theMesh, face, hyps, hypShapes ); + builder._faceSideVec = + StdMeshers_FaceSide::GetFaceWires( face, theMesh, true, error, + SMESH_ProxyMesh::Ptr(), + /*theCheckVertexNodes=*/false); + if ( error->IsOK() && !builder.findEdgesWithLayers()) + { + error = builder.GetError(); + if ( error && !error->IsOK() ) + theStatus = SMESH_Hypothesis::HYP_INCOMPAT_HYPS; + } + } + } + return error; +} +// -------------------------------------------------------------------------------- void StdMeshers_ViscousLayers2D::RestoreListeners() const { StudyContextStruct* sc = _gen->GetStudyContext( _studyId ); @@ -547,19 +607,22 @@ using namespace VISCOUS_2D; */ //================================================================================ -_ViscousBuilder2D::_ViscousBuilder2D(SMESH_Mesh& theMesh, - const TopoDS_Face& theFace, - const StdMeshers_ViscousLayers2D* theHyp): - _mesh( &theMesh ), _face( theFace ), _hyp( theHyp ), _helper( theMesh ) +_ViscousBuilder2D::_ViscousBuilder2D(SMESH_Mesh& theMesh, + const TopoDS_Face& theFace, + vector< const THypVL* > & theHyps, + vector< TopoDS_Shape > & theAssignedTo): + _mesh( &theMesh ), _face( theFace ), _helper( theMesh ) { + _hyps.swap( theHyps ); + _hypShapes.swap( theAssignedTo ); + _helper.SetSubShape( _face ); _helper.SetElementsOnShape( true ); _face.Orientation( TopAbs_FORWARD ); // 2D logic works only in this case _surface = BRep_Tool::Surface( _face ); - if ( _hyp ) - _fPowN = pow( _hyp->GetStretchFactor(), _hyp->GetNumberLayers() ); + _error = SMESH_ComputeError::New(COMPERR_OK); _nbLE = 0; } @@ -593,14 +656,14 @@ bool _ViscousBuilder2D::error(const string& text ) */ //================================================================================ -SMESH_ProxyMesh::Ptr _ViscousBuilder2D::Compute(const TopoDS_Shape& theShapeHypAssignedTo) +SMESH_ProxyMesh::Ptr _ViscousBuilder2D::Compute() { - _error = SMESH_ComputeError::New(COMPERR_OK); - _faceSideVec = StdMeshers_FaceSide::GetFaceWires( _face, *_mesh, true, _error ); + _faceSideVec = StdMeshers_FaceSide::GetFaceWires( _face, *_mesh, true, _error); + if ( !_error->IsOK() ) return _proxyMesh; - if ( !findEdgesWithLayers(theShapeHypAssignedTo) ) // analysis of a shape + if ( !findEdgesWithLayers() ) // analysis of a shape return _proxyMesh; if ( ! makePolyLines() ) // creation of fronts @@ -629,21 +692,79 @@ SMESH_ProxyMesh::Ptr _ViscousBuilder2D::Compute(const TopoDS_Shape& theShapeHypA */ //================================================================================ -bool _ViscousBuilder2D::findEdgesWithLayers(const TopoDS_Shape& theShapeHypAssignedTo) +bool _ViscousBuilder2D::findEdgesWithLayers() { - // collect all EDGEs to ignore defined by hyp - int nbMyEdgesIgnored = getEdgesToIgnore( _hyp, _face, getMeshDS(), _ignoreShapeIds ); + // collect all EDGEs to ignore defined by _hyps + typedef std::pair< set, const THypVL* > TEdgesOfHyp; + vector< TEdgesOfHyp > ignoreEdgesOfHyp( _hyps.size() ); + for ( size_t i = 0; i < _hyps.size(); ++i ) + { + ignoreEdgesOfHyp[i].second = _hyps[i]; + getEdgesToIgnore( _hyps[i], _face, getMeshDS(), ignoreEdgesOfHyp[i].first ); + } // get all shared EDGEs TopTools_MapOfShape sharedEdges; + TopTools_IndexedMapOfShape hypFaces; // faces with VL hyps + for ( size_t i = 0; i < _hypShapes.size(); ++i ) + TopExp::MapShapes( _hypShapes[i], TopAbs_FACE, hypFaces ); TopTools_IndexedDataMapOfShapeListOfShape facesOfEdgeMap; - TopExp::MapShapesAndAncestors( theShapeHypAssignedTo, - TopAbs_EDGE, TopAbs_FACE, facesOfEdgeMap); + for ( int iF = 1; iF <= hypFaces.Extent(); ++iF ) + TopExp::MapShapesAndAncestors( hypFaces(iF), TopAbs_EDGE, TopAbs_FACE, facesOfEdgeMap); for ( int iE = 1; iE <= facesOfEdgeMap.Extent(); ++iE ) if ( facesOfEdgeMap( iE ).Extent() > 1 ) sharedEdges.Add( facesOfEdgeMap.FindKey( iE )); - // check all EDGEs of the _face + // fill _hypOfEdge + if ( _hyps.size() > 1 ) + { + // check if two hypotheses define different parameters for the same EDGE + for ( size_t iWire = 0; iWire < _faceSideVec.size(); ++iWire ) + { + StdMeshers_FaceSidePtr wire = _faceSideVec[ iWire ]; + for ( int iE = 0; iE < wire->NbEdges(); ++iE ) + { + const THypVL* hyp = 0; + const TGeomID edgeID = wire->EdgeID( iE ); + if ( !sharedEdges.Contains( wire->Edge( iE ))) + { + for ( size_t i = 0; i < ignoreEdgesOfHyp.size(); ++i ) + if ( ! ignoreEdgesOfHyp[i].first.count( edgeID )) + { + if ( hyp ) + return error(SMESH_Comment("Several hypotheses define " + "Viscous Layers on the edge #") << edgeID ); + hyp = ignoreEdgesOfHyp[i].second; + } + } + _hypOfEdge.push_back( hyp ); + if ( !hyp ) + _ignoreShapeIds.insert( edgeID ); + } + // check if two hypotheses define different number of viscous layers for + // adjacent EDGEs + const THypVL *hyp, *prevHyp = _hypOfEdge.back(); + size_t iH = _hypOfEdge.size() - wire->NbEdges(); + for ( ; iH < _hypOfEdge.size(); ++iH ) + { + hyp = _hypOfEdge[ iH ]; + if ( hyp && prevHyp && + hyp->GetNumberLayers() != prevHyp->GetNumberLayers() ) + { + return error("Two hypotheses define different number of " + "viscous layers on adjacent edges"); + } + prevHyp = hyp; + } + } + } + else if ( _hyps.size() == 1 ) + { + _ignoreShapeIds.swap( ignoreEdgesOfHyp[0].first ); + } + + // check all EDGEs of the _face to fill _ignoreShapeIds and _noShrinkVert + int totalNbEdges = 0; for ( size_t iWire = 0; iWire < _faceSideVec.size(); ++iWire ) { @@ -674,9 +795,9 @@ bool _ViscousBuilder2D::findEdgesWithLayers(const TopoDS_Shape& theShapeHypAssig for ( ; hyp != allHyps.end() && !viscHyp; ++hyp ) viscHyp = dynamic_cast( *hyp ); - set neighbourIgnoreEdges; - if (viscHyp) - getEdgesToIgnore( viscHyp, neighbourFace, getMeshDS(), neighbourIgnoreEdges ); + // set neighbourIgnoreEdges; + // if (viscHyp) + // getEdgesToIgnore( viscHyp, neighbourFace, getMeshDS(), neighbourIgnoreEdges ); for ( int iV = 0; iV < 2; ++iV ) { @@ -688,12 +809,22 @@ bool _ViscousBuilder2D::findEdgesWithLayers(const TopoDS_Shape& theShapeHypAssig PShapeIteratorPtr edgeIt = _helper.GetAncestors( vertex, *_mesh, TopAbs_EDGE ); while ( const TopoDS_Shape* edge = edgeIt->next() ) if ( !edge->IsSame( wire->Edge( iE )) && - _helper.IsSubShape( *edge, neighbourFace ) && - ( neighbourIgnoreEdges.count( getMeshDS()->ShapeToIndex( *edge )) || - sharedEdges.Contains( *edge ))) + _helper.IsSubShape( *edge, neighbourFace )) { - _noShrinkVert.insert( getMeshDS()->ShapeToIndex( vertex )); - break; + const TGeomID neighbourID = getMeshDS()->ShapeToIndex( *edge ); + bool hasVL = !sharedEdges.Contains( *edge ); + if ( hasVL ) + { + hasVL = false; + for ( hyp = allHyps.begin(); hyp != allHyps.end() && !hasVL; ++hyp ) + if ( viscHyp = dynamic_cast( *hyp )) + hasVL = viscHyp->IsShapeWithLayers( neighbourID ); + } + if ( !hasVL ) + { + _noShrinkVert.insert( getMeshDS()->ShapeToIndex( vertex )); + break; + } } } } @@ -702,18 +833,20 @@ bool _ViscousBuilder2D::findEdgesWithLayers(const TopoDS_Shape& theShapeHypAssig } } + int nbMyEdgesIgnored = _ignoreShapeIds.size(); + // add VERTEXes w/o layers to _ignoreShapeIds (this is used by toShrinkForAdjacent()) - for ( size_t iWire = 0; iWire < _faceSideVec.size(); ++iWire ) - { - StdMeshers_FaceSidePtr wire = _faceSideVec[ iWire ]; - for ( int iE = 0; iE < wire->NbEdges(); ++iE ) - { - TGeomID edge1 = wire->EdgeID( iE ); - TGeomID edge2 = wire->EdgeID( iE+1 ); - if ( _ignoreShapeIds.count( edge1 ) && _ignoreShapeIds.count( edge2 )) - _ignoreShapeIds.insert( getMeshDS()->ShapeToIndex( wire->LastVertex( iE ))); - } - } + // for ( size_t iWire = 0; iWire < _faceSideVec.size(); ++iWire ) + // { + // StdMeshers_FaceSidePtr wire = _faceSideVec[ iWire ]; + // for ( int iE = 0; iE < wire->NbEdges(); ++iE ) + // { + // TGeomID edge1 = wire->EdgeID( iE ); + // TGeomID edge2 = wire->EdgeID( iE+1 ); + // if ( _ignoreShapeIds.count( edge1 ) && _ignoreShapeIds.count( edge2 )) + // _ignoreShapeIds.insert( getMeshDS()->ShapeToIndex( wire->LastVertex( iE ))); + // } + // } return ( nbMyEdgesIgnored < totalNbEdges ); } @@ -772,6 +905,7 @@ bool _ViscousBuilder2D::makePolyLines() for ( int iE = 0; iE < wire->NbEdges(); ++iE ) { _PolyLine& L = _polyLineVec[ iPoLine++ ]; + L._index = iPoLine-1; L._wire = wire.get(); L._edgeInd = iE; L._advancable = !_ignoreShapeIds.count( wire->EdgeID( iE )); @@ -846,13 +980,16 @@ bool _ViscousBuilder2D::makePolyLines() // Evaluate max possible _thickness if required layers thickness seems too high // ---------------------------------------------------------------------------- - _thickness = _hyp->GetTotalThickness(); + _maxThickness = _hyps[0]->GetTotalThickness(); + for ( size_t iH = 1; iH < _hyps.size(); ++iH ) + _maxThickness = Max( _maxThickness, _hyps[iH]->GetTotalThickness() ); + _SegmentTree::box_type faceBndBox2D; for ( iPoLine = 0; iPoLine < _polyLineVec.size(); ++iPoLine ) faceBndBox2D.Add( *_polyLineVec[ iPoLine]._segTree->getBox() ); - double boxTol = 1e-3 * sqrt( faceBndBox2D.SquareExtent() ); - // - if ( _thickness * maxLen2dTo3dRatio > sqrt( faceBndBox2D.SquareExtent() ) / 10 ) + const double boxTol = 1e-3 * sqrt( faceBndBox2D.SquareExtent() ); + + if ( _maxThickness * maxLen2dTo3dRatio > sqrt( faceBndBox2D.SquareExtent() ) / 10 ) { vector< const _Segment* > foundSegs; double maxPossibleThick = 0; @@ -885,7 +1022,7 @@ bool _ViscousBuilder2D::makePolyLines() } } if ( maxPossibleThick > 0. ) - _thickness = Min( _hyp->GetTotalThickness(), maxPossibleThick ); + _maxThickness = Min( _maxThickness, maxPossibleThick ); } // Adjust _LayerEdge's at _PolyLine's extremities @@ -930,13 +1067,14 @@ bool _ViscousBuilder2D::makePolyLines() for ( iPoLine = 0; iPoLine < _polyLineVec.size(); ++iPoLine ) { lineBoxes[ iPoLine ] = *_polyLineVec[ iPoLine ]._segTree->getBox(); - lineBoxes[ iPoLine ].Enlarge( maxLen2dTo3dRatio * _thickness * + lineBoxes[ iPoLine ].Enlarge( maxLen2dTo3dRatio * getLineThickness( iPoLine ) * ( _polyLineVec[ iPoLine ]._advancable ? 2. : 1.2 )); } // _reachableLines for ( iPoLine = 0; iPoLine < _polyLineVec.size(); ++iPoLine ) { _PolyLine& L1 = _polyLineVec[ iPoLine ]; + const double thick1 = getLineThickness( iPoLine ); for ( size_t iL2 = 0; iL2 < _polyLineVec.size(); ++iL2 ) { _PolyLine& L2 = _polyLineVec[ iL2 ]; @@ -950,7 +1088,7 @@ bool _ViscousBuilder2D::makePolyLines() { _LayerEdge& LE = L1._lEdges[iLE]; if ( !lineBoxes[ iL2 ].IsOut ( LE._uvOut, - LE._uvOut + LE._normal2D *_thickness * LE._len2dTo3dRatio )) + LE._uvOut + LE._normal2D * thick1 * LE._len2dTo3dRatio )) { L1._reachableLines.push_back( & L2 ); break; @@ -1024,9 +1162,9 @@ void _ViscousBuilder2D::adjustCommonEdge( _PolyLine& LL, _PolyLine& LR ) // during inflate(). // // find max length of the VERTEX-based _LayerEdge whose direction is normAvg - double maxLen2D = _thickness * EL._len2dTo3dRatio; - const gp_XY& pCommOut = ER._uvOut; - gp_XY pCommIn = pCommOut + normAvg * maxLen2D; + double maxLen2D = _maxThickness * EL._len2dTo3dRatio; + const gp_XY& pCommOut = ER._uvOut; + gp_XY pCommIn = pCommOut + normAvg * maxLen2D; _Segment segCommon( pCommOut, pCommIn ); _SegmentIntersection intersection; vector< const _Segment* > foundSegs; @@ -1067,7 +1205,7 @@ void _ViscousBuilder2D::adjustCommonEdge( _PolyLine& LL, _PolyLine& LR ) _SegmentIntersection lastIntersection; for ( ; iLE < L._lEdges.size(); ++iLE, eIt += dIt ) { - gp_XY uvIn = eIt->_uvOut + eIt->_normal2D * _thickness * eIt->_len2dTo3dRatio; + gp_XY uvIn = eIt->_uvOut + eIt->_normal2D * _maxThickness * eIt->_len2dTo3dRatio; _Segment segOfEdge( eIt->_uvOut, uvIn ); if ( !intersection.Compute( segCommon, segOfEdge )) break; @@ -1148,7 +1286,7 @@ void _ViscousBuilder2D::setLayerEdgeData( _LayerEdge& lEdge, gp_Vec faceNorm = du ^ dv; gp_Vec normal = faceNorm ^ tangent; normal.Normalize(); - p = pOut.XYZ() + normal.XYZ() * /*1e-2 * */_hyp->GetTotalThickness() / _hyp->GetNumberLayers(); + p = pOut.XYZ() + normal.XYZ() * /*1e-2 * */_hyps[0]->GetTotalThickness() / _hyps[0]->GetNumberLayers(); faceProj->Perform( p ); if ( !faceProj->IsDone() || faceProj->NbPoints() < 1 ) return setLayerEdgeData( lEdge, u, pcurve, curve, p, reverse, NULL ); @@ -1205,7 +1343,7 @@ bool _ViscousBuilder2D::inflate() { // Limit size of inflation step by geometry size found by // itersecting _LayerEdge's with _Segment's - double minSize = _thickness, maxSize = 0; + double minSize = _maxThickness, maxSize = 0; vector< const _Segment* > foundSegs; _SegmentIntersection intersection; for ( size_t iL1 = 0; iL1 < _polyLineVec.size(); ++iL1 ) @@ -1233,29 +1371,30 @@ bool _ViscousBuilder2D::inflate() } } if ( minSize > maxSize ) // no collisions possible - maxSize = _thickness; + maxSize = _maxThickness; #ifdef __myDEBUG cout << "-- minSize = " << minSize << ", maxSize = " << maxSize << endl; #endif double curThick = 0, stepSize = minSize; int nbSteps = 0; - if ( maxSize > _thickness ) - maxSize = _thickness; + if ( maxSize > _maxThickness ) + maxSize = _maxThickness; while ( curThick < maxSize ) { curThick += stepSize * 1.25; - if ( curThick > _thickness ) - curThick = _thickness; + if ( curThick > _maxThickness ) + curThick = _maxThickness; // Elongate _LayerEdge's for ( size_t iL = 0; iL < _polyLineVec.size(); ++iL ) { _PolyLine& L = _polyLineVec[ iL ]; if ( !L._advancable ) continue; + const double lineThick = Min( curThick, getLineThickness( iL )); bool lenChange = false; for ( size_t iLE = L.FirstLEdge(); iLE < L._lEdges.size(); ++iLE ) - lenChange |= L._lEdges[iLE].SetNewLength( curThick ); + lenChange |= L._lEdges[iLE].SetNewLength( lineThick ); // for ( int k=0; k_index ); vector& uvVec = L._lEdges.front()._uvRefined; - for ( int i = 0; i < _hyp->GetNumberLayers(); ++i ) { + for ( int i = 0; i < hyp->GetNumberLayers(); ++i ) { const UVPtStruct& uvPt = points[ iPFrom + i + 1 ]; L._leftNodes.push_back( uvPt.node ); uvVec.push_back ( pcurve->Value( uvPt.param ).XY() ); } + iPFrom += hyp->GetNumberLayers(); } if ( isShrinkableR ) { + const THypVL* hyp = getLineHypothesis( L._rightLine->_index ); vector& uvVec = L._lEdges.back()._uvRefined; - for ( int i = 0; i < _hyp->GetNumberLayers(); ++i ) { + for ( int i = 0; i < hyp->GetNumberLayers(); ++i ) { const UVPtStruct& uvPt = points[ iPTo - i - 1 ]; L._rightNodes.push_back( uvPt.node ); uvVec.push_back ( pcurve->Value( uvPt.param ).XY() ); } + iPTo -= hyp->GetNumberLayers(); } // make proxy sub-mesh data of present nodes // - if ( isShrinkableL ) iPFrom += _hyp->GetNumberLayers(); - if ( isShrinkableR ) iPTo -= _hyp->GetNumberLayers(); UVPtStructVec nodeDataVec( & points[ iPFrom ], & points[ iPTo + 1 ]); double normSize = nodeDataVec.back().normParam - nodeDataVec.front().normParam; @@ -1723,14 +1864,14 @@ bool _ViscousBuilder2D::shrink() ( isR ? L._leftLine->_lEdges.back() : L._rightLine->_lEdges.front() ); length2D = neighborLE._length2D; if ( length2D == 0 ) - length2D = _thickness * nearLE._len2dTo3dRatio; + length2D = _maxThickness * nearLE._len2dTo3dRatio; } } // move u to the internal boundary of layers // u --> u // x-x-x-x-----x-----x---- - double maxLen3D = Min( _thickness, edgeLen / ( 1 + nbAdvancable )); + double maxLen3D = Min( _maxThickness, edgeLen / ( 1 + nbAdvancable )); double maxLen2D = maxLen3D * nearLE._len2dTo3dRatio; if ( !length2D ) length2D = length1D / len1dTo2dRatio; if ( Abs( length2D ) > maxLen2D ) @@ -1746,7 +1887,8 @@ bool _ViscousBuilder2D::shrink() // compute params of layers on L vector heights; - calcLayersHeight( u - u0, heights ); + const THypVL* hyp = getLineHypothesis( L2->_index ); + calcLayersHeight( u - u0, heights, hyp ); // vector< double > params( heights.size() ); for ( size_t i = 0; i < params.size(); ++i ) @@ -1756,13 +1898,13 @@ bool _ViscousBuilder2D::shrink() // x-x-x-x--- vector< const SMDS_MeshNode* >& layersNode = isR ? L._rightNodes : L._leftNodes; vector& nodeUV = ( isR ? L._lEdges.back() : L._lEdges[0] )._uvRefined; - nodeUV.resize ( _hyp->GetNumberLayers() ); - layersNode.resize( _hyp->GetNumberLayers() ); + nodeUV.resize ( hyp->GetNumberLayers() ); + layersNode.resize( hyp->GetNumberLayers() ); const SMDS_MeshNode* vertexNode = nodeDataVec[ iPEnd ].node; const SMDS_MeshNode * prevNode = vertexNode; for ( size_t i = 0; i < params.size(); ++i ) { - gp_Pnt p = curve.Value( params[i] ); + const gp_Pnt p = curve.Value( params[i] ); layersNode[ i ] = helper.AddNode( p.X(), p.Y(), p.Z(), /*id=*/0, params[i] ); nodeUV [ i ] = pcurve->Value( params[i] ).XY(); helper.AddEdge( prevNode, layersNode[ i ] ); @@ -1773,7 +1915,7 @@ bool _ViscousBuilder2D::shrink() if ( !L2->_advancable ) { isRShrinkedForAdjacent = isR; - nodeDataForAdjacent.resize( _hyp->GetNumberLayers() ); + nodeDataForAdjacent.resize( hyp->GetNumberLayers() ); size_t iFrw = 0, iRev = nodeDataForAdjacent.size()-1, *i = isR ? &iRev : &iFrw; nodeDataForAdjacent[ *i ] = points[ isR ? L._lastPntInd : L._firstPntInd ]; @@ -1890,11 +2032,11 @@ bool _ViscousBuilder2D::shrink() { // refine the not shared _LayerEdge vector layersHeight; - calcLayersHeight( LE2._length2D, layersHeight ); + calcLayersHeight( LE2._length2D, layersHeight, getLineHypothesis( L2._index )); vector& nodeUV2 = LE2._uvRefined; - nodeUV2.resize ( _hyp->GetNumberLayers() ); - layerNodes2.resize( _hyp->GetNumberLayers() ); + nodeUV2.resize ( layersHeight.size() ); + layerNodes2.resize( layersHeight.size() ); for ( size_t i = 0; i < layersHeight.size(); ++i ) { gp_XY uv = LE2._uvOut + LE2._normal2D * layersHeight[i]; @@ -1952,12 +2094,13 @@ bool _ViscousBuilder2D::toShrinkForAdjacent( const TopoDS_Face& adjFace, if ( _noShrinkVert.count( getMeshDS()->ShapeToIndex( V )) || adjFace.IsNull() ) return false; - TopoDS_Shape hypAssignedTo; - if ( const StdMeshers_ViscousLayers2D* vlHyp = findHyp( *_mesh, adjFace, &hypAssignedTo )) + vector< const StdMeshers_ViscousLayers2D* > hyps; + vector< TopoDS_Shape > hypShapes; + if ( VISCOUS_2D::findHyps( *_mesh, adjFace, hyps, hypShapes )) { - VISCOUS_2D::_ViscousBuilder2D builder( *_mesh, adjFace, vlHyp ); + VISCOUS_2D::_ViscousBuilder2D builder( *_mesh, adjFace, hyps, hypShapes ); builder._faceSideVec = StdMeshers_FaceSide::GetFaceWires( adjFace, *_mesh, true, _error ); - builder.findEdgesWithLayers( hypAssignedTo ); + builder.findEdgesWithLayers(); PShapeIteratorPtr edgeIt = _helper.GetAncestors( V, *_mesh, TopAbs_EDGE ); while ( const TopoDS_Shape* edgeAtV = edgeIt->next() ) @@ -2180,7 +2323,8 @@ bool _ViscousBuilder2D::refine() } // normalized height of layers - calcLayersHeight( 1., layersHeight ); + const THypVL* hyp = getLineHypothesis( iL ); + calcLayersHeight( 1., layersHeight, hyp); // Create layers of faces @@ -2192,11 +2336,11 @@ bool _ViscousBuilder2D::refine() for ( int i = L._firstPntInd; i <= L._lastPntInd; ++i ) outerNodes[ i-L._firstPntInd ] = points[i].node; - L._leftNodes .reserve( _hyp->GetNumberLayers() ); - L._rightNodes.reserve( _hyp->GetNumberLayers() ); + L._leftNodes .reserve( hyp->GetNumberLayers() ); + L._rightNodes.reserve( hyp->GetNumberLayers() ); int cur = 0, prev = -1; // to take into account orientation of _face if ( isReverse ) std::swap( cur, prev ); - for ( int iF = 0; iF < _hyp->GetNumberLayers(); ++iF ) // loop on layers of faces + for ( int iF = 0; iF < hyp->GetNumberLayers(); ++iF ) // loop on layers of faces { // create innerNodes of a current layer for ( size_t i = iN0; i < iNE; ++i ) @@ -2358,6 +2502,30 @@ bool _ViscousBuilder2D::removeMeshFaces(const TopoDS_Shape& face) return thereWereElems; } +//================================================================================ +/*! + * \brief Returns a hypothesis for a _PolyLine + */ +//================================================================================ + +const StdMeshers_ViscousLayers2D* _ViscousBuilder2D::getLineHypothesis(int iPL) +{ + return iPL < (int)_hypOfEdge.size() ? _hypOfEdge[ iPL ] : _hyps[0]; +} + +//================================================================================ +/*! + * \brief Returns a layers thickness for a _PolyLine + */ +//================================================================================ + +double _ViscousBuilder2D::getLineThickness(int iPL) +{ + if ( const StdMeshers_ViscousLayers2D* h = getLineHypothesis( iPL )) + return Min( _maxThickness, h->GetTotalThickness() ); + return _maxThickness; +} + //================================================================================ /*! * \brief Creates a _ProxyMeshOfFace and store it in a sub-mesh of FACE @@ -2384,21 +2552,23 @@ _ProxyMeshOfFace* _ViscousBuilder2D::getProxyMesh() //================================================================================ void _ViscousBuilder2D::calcLayersHeight(const double totalThick, - vector& heights) + vector& heights, + const THypVL* hyp) { - heights.resize( _hyp->GetNumberLayers() ); + const double fPowN = pow( hyp->GetStretchFactor(), hyp->GetNumberLayers() ); + heights.resize( hyp->GetNumberLayers() ); double h0; - if ( _fPowN - 1 <= numeric_limits::min() ) - h0 = totalThick / _hyp->GetNumberLayers(); + if ( fPowN - 1 <= numeric_limits::min() ) + h0 = totalThick / hyp->GetNumberLayers(); else - h0 = totalThick * ( _hyp->GetStretchFactor() - 1 )/( _fPowN - 1 ); + h0 = totalThick * ( hyp->GetStretchFactor() - 1 )/( fPowN - 1 ); double hSum = 0, hi = h0; - for ( int i = 0; i < _hyp->GetNumberLayers(); ++i ) + for ( int i = 0; i < hyp->GetNumberLayers(); ++i ) { hSum += hi; heights[ i ] = hSum; - hi *= _hyp->GetStretchFactor(); + hi *= hyp->GetStretchFactor(); } } diff --git a/src/StdMeshers/StdMeshers_ViscousLayers2D.hxx b/src/StdMeshers/StdMeshers_ViscousLayers2D.hxx index a7b6c9c45..f9fab2b33 100644 --- a/src/StdMeshers/StdMeshers_ViscousLayers2D.hxx +++ b/src/StdMeshers/StdMeshers_ViscousLayers2D.hxx @@ -35,9 +35,10 @@ class STDMESHERS_EXPORT StdMeshers_ViscousLayers2D : public StdMeshers_ViscousLa { public: StdMeshers_ViscousLayers2D(int hypId, int studyId, SMESH_Gen* gen); - - // Computes temporary 2D mesh to be used by 2D algorithm. - // Return SMESH_ProxyMesh for the given FACE, or NULL in case of error + /*! + * \brief Computes temporary 2D mesh to be used by 2D algorithm. + * Return SMESH_ProxyMesh for the given FACE, or NULL in case of error + */ static SMESH_ProxyMesh::Ptr Compute(SMESH_Mesh& theMesh, const TopoDS_Face& theShape); /*! @@ -46,13 +47,19 @@ public: */ void RestoreListeners() const; + /*! + * \brief Checks compatibility of assigned StdMeshers_ViscousLayers2D hypotheses + */ + static SMESH_ComputeErrorPtr CheckHypothesis(SMESH_Mesh& aMesh, + const TopoDS_Shape& aShape, + Hypothesis_Status& aStatus); /*! * \brief Initialize my parameter values by the mesh built on the geometry - * \param theMesh - the built mesh - * \param theShape - the geometry of interest - * \retval bool - true if parameter values have been successfully defined - * - * Just return false as this hypothesis does not have parameters values + * \param theMesh - the built mesh + * \param theShape - the geometry of interest + * \retval bool - true if parameter values have been successfully defined + * + * Just return false as this hypothesis does not have parameters values */ virtual bool SetParametersByMesh(const SMESH_Mesh* theMesh, const TopoDS_Shape& theShape); -- 2.39.2