From bb40f7c1d3542da1ff59b6c3bface0574789dded Mon Sep 17 00:00:00 2001 From: eap Date: Tue, 3 Mar 2015 15:03:38 +0300 Subject: [PATCH] IMP 22635: EDF 8345 - Creation of group based on groups + allow concatenating sub-meshes and groups + fix bugs in PythonDump --- doc/salome/examples/creating_meshes_ex07.py | 16 +- doc/salome/examples/grouping_elements_ex08.py | 17 +- doc/salome/gui/SMESH/images/buildcompound.png | Bin 24270 -> 23672 bytes .../gui/SMESH/images/buildcompound_groups.png | Bin 0 -> 8071 bytes doc/salome/gui/SMESH/images/dimgroup_2d.png | Bin 8089 -> 5978 bytes doc/salome/gui/SMESH/images/dimgroup_dlg.png | Bin 18647 -> 21863 bytes doc/salome/gui/SMESH/images/image160.gif | Bin 5504 -> 5963 bytes doc/salome/gui/SMESH/input/about_meshes.doc | 2 +- .../gui/SMESH/input/building_compounds.doc | 40 +- .../input/group_of_underlying_elements.doc | 35 +- idl/SMESH_Gen.idl | 18 +- idl/SMESH_Mesh.idl | 34 +- src/SMESH/SMESH_MeshEditor.cxx | 4 +- src/SMESH/SMESH_MeshEditor.hxx | 2 +- src/SMESHDS/SMESHDS_Group.cxx | 12 +- src/SMESHDS/SMESHDS_Group.hxx | 2 + src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx | 35 +- src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h | 6 +- src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx | 111 ++-- src/SMESHGUI/SMESHGUI_GroupOpDlg.h | 14 +- src/SMESHGUI/SMESH_msg_en.ts | 42 +- src/SMESH_I/SMESH_2smeshpy.cxx | 12 +- src/SMESH_I/SMESH_Filter_i.cxx | 9 +- src/SMESH_I/SMESH_Gen_i.cxx | 531 ++++++++---------- src/SMESH_I/SMESH_Gen_i.hxx | 26 +- src/SMESH_I/SMESH_MeshEditor_i.cxx | 4 +- src/SMESH_I/SMESH_Mesh_i.cxx | 181 ++++-- src/SMESH_I/SMESH_Mesh_i.hxx | 8 +- src/SMESH_SWIG/smeshBuilder.py | 48 +- 29 files changed, 698 insertions(+), 511 deletions(-) mode change 100755 => 100644 doc/salome/gui/SMESH/images/buildcompound.png create mode 100644 doc/salome/gui/SMESH/images/buildcompound_groups.png mode change 100755 => 100644 doc/salome/gui/SMESH/images/image160.gif diff --git a/doc/salome/examples/creating_meshes_ex07.py b/doc/salome/examples/creating_meshes_ex07.py index 65a4f742e..3b003961e 100644 --- a/doc/salome/examples/creating_meshes_ex07.py +++ b/doc/salome/examples/creating_meshes_ex07.py @@ -1,5 +1,4 @@ # Building a compound of meshes -# Note: it is a copy of 'SMESH_BuildCompound.py' from SMESH_SWIG import salome salome.salome_init() @@ -69,11 +68,14 @@ Gsup2=Mesh_sup.Group(Fsup2, "Sup") Ginf2=Mesh_sup.Group(Finf2, "Inf") ## create compounds -# create a compound of two meshes with renaming groups with the same names and +# create a compound of two meshes with renaming namesake groups and # merging of elements with the given tolerance -Compound1 = smesh.Concatenate([Mesh_inf.GetMesh(), Mesh_sup.GetMesh()], 0, 1, 1e-05) -smesh.SetName(Compound1, 'Compound_with_RenamedGrps_and_MergeElems') -# create a compound of two meshes with uniting groups with the same names and +Compound1 = smesh.Concatenate([Mesh_inf, Mesh_sup], 0, 1, 1e-05, + name='Compound_with_RenamedGrps_and_MergeElems') +# create a compound of two meshes with uniting namesake groups and # creating groups of all elements -Compound2 = smesh.Concatenate([Mesh_inf.GetMesh(), Mesh_sup.GetMesh()], 1, 0, 1e-05, True) -smesh.SetName(Compound2, 'Compound_with_UniteGrps_and_GrpsOfAllElems') +Compound2 = smesh.Concatenate([Mesh_inf, Mesh_sup], 1, 0, 1e-05, True, + name='Compound_with_UniteGrps_and_GrpsOfAllElems') + +if salome.sg.hasDesktop(): + salome.sg.updateObjBrowser(1) diff --git a/doc/salome/examples/grouping_elements_ex08.py b/doc/salome/examples/grouping_elements_ex08.py index fa78d72f3..92dd71ce0 100644 --- a/doc/salome/examples/grouping_elements_ex08.py +++ b/doc/salome/examples/grouping_elements_ex08.py @@ -1,4 +1,4 @@ -# Creating groups of entities from existing groups of superior dimensions +# Creating groups of entities basing on nodes of other groups import SMESH_mechanic import SMESH @@ -10,22 +10,17 @@ salome = SMESH_mechanic.salome # Criterion : AREA > 100 aFilter = smesh.GetFilter(SMESH.FACE, SMESH.FT_Area, SMESH.FT_MoreThan, 100.) -anIds = mesh.GetIdsFromFilter(aFilter) - -print "Criterion: Area > 100, Nb = ", len(anIds) - # create a group by adding elements with area > 100 -aSrcGroup1 = mesh.MakeGroupByIds("Area > 100", SMESH.FACE, anIds) +aSrcGroup1 = mesh.GroupOnFilter(SMESH.FACE, "Area > 100", aFilter) +print "Criterion: Area > 100, Nb = ", aSrcGroup1.Size() # Criterion : AREA < 30 aFilter = smesh.GetFilter(SMESH.FACE, SMESH.FT_Area, SMESH.FT_LessThan, 30.) -anIds = mesh.GetIdsFromFilter(aFilter) - -print "Criterion: Area < 30, Nb = ", len(anIds) - # create a group by adding elements with area < 30 -aSrcGroup2 = mesh.MakeGroupByIds("Area < 30", SMESH.FACE, anIds) +aSrcGroup2 = mesh.GroupOnFilter(SMESH.FACE, "Area < 30", aFilter) +print "Criterion: Area < 30, Nb = ", aSrcGroup2.Size() + # Create group of edges using source groups of faces aGrp = mesh.CreateDimGroup( [aSrcGroup1, aSrcGroup2], SMESH.EDGE, "Edges" ) diff --git a/doc/salome/gui/SMESH/images/buildcompound.png b/doc/salome/gui/SMESH/images/buildcompound.png old mode 100755 new mode 100644 index a6183515ecd46f881ffc9861f005f5d9cddf0e2f..d3534fe53e631086c20e03cef70046c139cb3d27 GIT binary patch literal 23672 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 literal 24270 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

@HcX~l}% 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 diff --git a/doc/salome/gui/SMESH/images/buildcompound_groups.png b/doc/salome/gui/SMESH/images/buildcompound_groups.png new file mode 100644 index 0000000000000000000000000000000000000000..ee12892044a2dde22fcd9ad98b724057a36ffd55 GIT binary patch literal 8071 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 bTb!rI_jyEZTJgXsIYeGsS*lFZIPgCJvx4cq literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/dimgroup_2d.png b/doc/salome/gui/SMESH/images/dimgroup_2d.png index 6ca49a6a9157d1e18176b2408877be28708ed9a8..bbfa059d8779b64d44e6557adb47028c5207e46d 100644 GIT binary patch literal 5978 zcmZ8lc|278_t$Rgrb3n(rP5+-Jy}OmJa&mNjgisSQ$5Vsw-_pg`;;Zg*jl746~o2M zNEynFER{@|nFt|@8BsBb@Vn#t-*4tM%RTpe&Uv5rIp_2F+|LzP7rXVcYO+#NQtKV; z|2`%qwbD{bYK4sSN>nnvrt1j$vm*SMot0F@8_XDbvDVMY?r*6j$@?y+^ad)C39mnSE*sL2^wMtG+_1+We9Vsd09*4gVdz|Z;=yM3$VNq=Zwu&Y) zQd;-sWWM`o?Vt92ZPv6q_5R^usfPWJv^#cgblc=Yel|F3|13_YBkX5mTwL5a-9vVN z3XWft;mmyhJ~`jG_N+2h|uubKqXbH=@7ni?NCm6}4tP0y| zM%VH{5Jza!s*j8(b(jyLG6f6j`fTPSqaF!dgLLK@3iCM{c42a@t!Kx~r7zXD z&cAqu3Q#9P#(}1BjfO*5pHt?jr{8xs5Eo&}}m<{T8TtS|ZRd!O-#u?nBXLUD9 zJY>Nv)^gxU)%~RXr6!eif_)d&{f$1<3Y)-Rl3>M`;BFmia}0hN60ZkV@?2Zm(60?8 zaNY{MiciyNMbY0CXB#Fg#~NhfGEuE43J~wU}l?r7eS3g4l@eO;^9k4GR2W+tAmzN{BvtG#C{#s|!c1g%9{nCP@U4FGhFLkO{Idak+$H$P zc1Gc^i8n7T8PQPWYBV9^Net=k{+qTp%N3HNi4}K$`g}t3jD~2P$Z*>VCo=dS2KUMEwvC31s!23){PDAEs0^FT=-2n~uoip-O?XsdRJ0E4oaDM~lbUIrbI%S~)-0DwzQ<`AUmtben%n$Xa(L|>03??~LRJ;L1 z5>EHk;vT<a)P5dqaPl;TB!HSxUeBTqzt*V8p|m`Ge9`+ zpSDS>(=PLf8-&f_oix))aWA`)hX`;_m@PPBE;|{XaAVwDIuRrp)yG=mKPDqJVGK`W{4+^7MP4B@nI>Nin z%S0~WskOOgshqXf2@7w-YZyj?2A?ZUzeISipKgIz-o`MMGqpK^jC~sL$G^11f2jGUQq$?*-VtE~U*P(@vEkuc7Kt3=vIRKbFB=h1<~!%U*fq+C$Qt1l3d!2x z`q3wG{8K?{nh;CH7^*rBLe2h}MKM9EA*D=0%gc`oVJ#s<{hKkE7P9+i13twlTF@EY ztt052&aE5zBn1eifm4DVn3Vr+3erDkg}Or)lpl&O!4JbH3wz1jWQ{!q6X$o;uE7F`qL@^G zR3N;Q(P%k^O*=x0Ou^tS$0)~Fv$@_&PtYnBbr&Pkn$&ObjH7h-Pm>-K4MQB%ok~X? zKp0!n>$Bqc3sog96?BE)>>Q7xbyv?{2~(jpM+o+QRq|Vxa&Y{d@IRMo=f^f!_C0Rl z!c$$7Oc!i+1LaR9>uVQrZvA z#HibnT zz_5Y%>KGgskJpA6+kmHTR-gSKxRz6IBvj#)_~CWz%Rj?06RcZN-wLoNoOJ$a&|#@W z_TWFpg+1_t!a@xu1NHZYY{)9;_j$f$!-#=%7UwU#P8QSgXiRS}-mpV95{DHVI;9S* z(y|bA{W&m|=cy!kh;WaaX`!{d0l>v`2n&wT`wGF}lkQ;TbB@r6aK5&TcDEIzhp8k~ z@r~2E>n*8Xi!XwOFfCCD6J*$`#)5 zd4spcj2cwI)sW|`SjWPZTiCu0DBIYC78g4St_Nt3txO$?t=oM>3SuVj=>3O=$2Vlf z{$;8X5i2rk2CGD#j4oR}XhK<#AC~H%jZHr=c3tMz7bkU3{OT~GSaaqMVnugv(2$4P z$mUq~&8g zxTybp$EL*h&rBrvS*9W_EPmvwSq*H|0jlSnA1ev?j~D!tWK0efTYrzHxgX$G{I#b- zJ}7$(MIT^}?i$i`PBk>-dlg&vo7D#Xz!}!#EnJU1mh=5=0H}A7`@X;(xz+@mvkxQe zN9MUDcE#61G1(Ttn-8m!5L2o%Epigp%0PY)@I{${*h|yJ>s`k}-YlwJHWhs_it3%Z zw;$5&aJZ5F{?TX#64iMy=}d8|dw;AJGm6abg;ec-!T;TXW^TfsJ zh*j@h#Q{UG&iq*hhH$pYqCY3jV^A7n^IZIx+jBZp53k_O>f9ueR3Tlg;PZs`EAtXlv#pjxV0im9mCD%BzZ- za^mQRYrepAKV|llHZq1CRwA9LG*rNI^zp>McjGtgem!HgHiXD3vLSJL%H$x6kCx_N z;Z{0;jrafK2zkVR2zhyfP&ZY)8}iB5%2sD9HHC^$LW0h}tu?0(FuNadHP?J|x*7W* z!X8XlC{mywF3`FV6#lJ%PIOXaC$sphO)cI|Iw1)*X^zn7PmwbnnCTA`%K47=Y%tej zj9f#=w*|QM%&p3eTyVtB=+@ausLS~G=_S4cD_ULDl(QGZ)+z1q*Nvel)6xdv_twSM zvL{3ap~Xnu3yQp#s^S~4ldz3%{z_JpHZuvoJ2rQYiuQ*`6$6>3179{(?sI_~mex7) z%~F{H9J=E%e01SDvfWf?a@u35DF) zM$eX+gAqsRrMQdkay5q=T}GcyjU2fi8`b8s<+SS-8ht(f#&mwqug>0GK*x{Hse6EW zF}JV^(I%{oC;Yy$pv3O!mw(vR^67)H5ZSKyx>E7yE~q(JI2DrEg~^UTutFP~kL`X$ zR`sZisknMr9B{wtI&ahd#h>hmD(j4QBzA<0`PvB!CROd=2!xHZEFU$| zxD|q?P4q6Xi*J7H^xLDKpPZ2M=bqIEQcOnu09sgr%{HjHGUD8Pf?ix3jScoA6sl?#0$3DsVu1s#+fy~d{*x~4OKkbn?6VXmFOF?+A6klHp@U)ll z|LO=$*H2fyl=Ib2WU!SkXIu0NC@N5-@n{;5GQcaWej>IwQ&GF`XOccadb0TRKt(Yp zHd?Z4Pz%!iJ{x4m@`GmSz}~4O{p+;5MSYYjo9$B`+!K^lBR}-st!Hn|j*fjaz&l)w zZ2Seu@`Sj{yJXM@4L+Ik1(pVScaBn^KIfx_qaUzlC3HkDtz@Y5hT?2f&J6wVDtqA! zI}h&8Z|!@#1V?%KWKRA2qjlWho64ic9{9C+D^)Wn+=k8g+8kHRBN zkKFKJQY-&=OT=R?C>#j%9#arEZ81vR;y<>}vVmhtZN-#uH7jfL(X^TA#pRt%GC&$` z+p2Q}6niKsz{B^oB)g9CZAtp7#oY&3RP041E0piKC_#rL*dMtC$E-yv4_wSA&ZP(Y(h#;cVSVZ(% zW9qV2s-6Nj>4M`m%hA|9>LdlE4EgyAuPqW z4XherF!dl6nS_H zlr{)Pl*YMEEg$Ye1`^q_ycE_xyX;70y;!+Cun+8`KSKj?qyPU8+wykSJH zT9Y)`!B(Y(5_4W}GBKkTp(O=`a|o;b6F6$-IwiZ4$BgJcQX93gBr}~7X8z7=LM1CZ zmcR*+%SWC>5etvp-$e%sV;37_(%GzMsP#%jt)<;H9^dagt-j=U1nSF;>?Yk)vO;0D zf!27P#U%Ys+t~nJHvxW1Y5hQd4&A8dWMw?i@zb4n@N0-*}6hBR# z5{LXjDis!gU94{=hY_C-Ffo2XU*Y`q6^_2MnHE%=8w2QbC_39?cog7iD!T+Z#*j_H z0`9X1y#*2i;0CN@Yjhm1$SI~4Anz5(onxyC#7b-dWji!MEE$HkI7)kt>QVd7Tp#>3 zffmzecm+o6`syW?Z7cH{YfGwqHz$~nlDLR^0a|dzCxG56hUWnIi*bJ7Pg~mN(4Td* z5vlhI=o&%2i6o11&beBmd$nNRFUl1c)#&+%AlozgK*t<~fk#{NpJ zbbL*j=4zCEwuHF99LvyM2VVi;foyaCK%ZEaRV(?vna<)$p8)_@pH|xo21p0j*at6z zsWC6NQ$-tj^*%dcj%g~hy7knj+qzu8%Dot#TYTbA@F_O?S5|1F-R+7k2iA#|{j2yV z%u*4@4Ky=dy7v~6W?VKixvzFuLQ!Djf$mkeFl=KR#tEm0_FU#Oa+ts#z-f+#0kkLs z;TUPVzmXa_JKmh@ryoKbFcUS)4!&c(DA}T}JSV1e)lLqi*9zpSFi|_dI)8;3U+$tM zC^d1~*I77cmcTKv0)%6p!4ZP?@eRGC%fvjUK<=lhh^w>jO)mdMdo9pQvNj#RrAI|o zod991uG=8(0ql8dARSc<$BXb^U%^|A=}g=H+8w&$l~7tfq7hp*N+r8%RPa~Q3d<4v zjpz21EBRk!y-(_6LUYew@x-3-PC>(Hy@}X{5uLTJJrUk0M>F&cJoN>x`0|}%)9tHC ztqHaxiINhqJcF;VhT&~%Xawo!Jry!c0VUox|4qW8N*H1x#)py95m=6`vjya~1A zbOB1biKm+Bg8FiLifk*3ZK$cK5xBuB7h_z?JSQhgD%I2(dNmWbl#1YeG*8q8+LBJ{ zQ^SeAYtEx2{8u}a)8UO)%b+VT3@5h@+bBC+*4reBI7HxTCfeoiLrG;yiJMvh;rIF) zHLHtgutm+ww}o|ko!{>5(yyAmwHQ2wW^pC$FyJkOooZeTBYL48G46u#s^=9&Yfy4W z+Q5y;6IuJ7kw3wAFviwftx#={4AFZnDMN4-B4OYeXgva}`?D+}TX>ih$FOip`m*#nv%cBlz=pm$wAxXgg>zKF)8z z1}AW&0Pnrm*bbE6H5sVdp05UuIszTlGe#4Oc@mRvO`#7PcIZl+aRSEBHC1Vu zq39sfH5R2hRP?+P5bnKtU0D+M8}t}V0`HvMN&SmRn0gAz>q>}q{Vng_1_xB;JPvDI z)0Xp==-8vzcdenBAzkiDf!x<^kPIqbaT=Rl)wR|iwK|=Jlq;+ht%(>m041vGki^F! z6F`FH;vLKx@Bc}chxMV2jJiT;QL>Uc^l$cQuWYS_Nug!j!f`37C!s3n(f0p)z0Fu! Y_k{e4pIc-SE4k%h|Gu5VF;N&yC|e<;B!w2E&yq5d9U-uJjWN@4PG~a0&8X9&TZH;?0G;}I7 zG_Ov_z&K4UM3lj)t1CU)DypONpI{f5(J<##OYw z&DGK=Ir%m<4Mc9(9CGOUqYJ_X=A>X%Y1@3k!bTBA93e8ow2} z_i3Q&827cCCi%AI1j($pSobOy4Zhu#@E?t;F`ui+SVC#j`I6!{*%R)(&jBLOS+$4G zH8ZQBWE!tflF$=V-S^A@{UF*HH?|k@S>TGWNsZFpS>2)uVJ|w6wiBFUt!%BK@X>;_ z+Dte#z%SX9Lx4$$Yn`z^eMH!q9+Ygs(hO_clv{qfqOeiTv+>1$HJVGj|K|Ss>%fJ9 zD<7;37ZlgO{LT>1IXdpoF48*B(*P^`-*}zE4>r8lDdLa!>&-|%TUmW)gSMuo#yD>I z?JNFhKrJzx_nW&`^xvOM+1nAncL^pF%<}{PmNA!HP2QqZ%-`JdpB^(i>FT?2LQXO~ z-YT=?kt-KeId1LGE_XbBWb%nauyJp%yvbvK^DoD(gAI<5gLcmW(sz^c`dwy~g8?f0 zgr)Dn*R4jMtr_27YSsQ;Gwd)P8!ARk^eAbgd!1APxOJysVn&C7Py#ICoyvlKy z>{8jMM!&_BwEu$tyqpU8`&lMS1;s@?iY>Cz_5)n@=8Z$IJ$8I1MQKtUI;i4TDyf zL+RJPhLBE3axp{mL;_4hY-_Czx zZ8M)IcybU8rTu0~dEkp2{z#Ku!u93S`dbnmPZZdMu3oqb&i)y1+MM(pzf_bpd|Y?( z#dE-WcFDFywye{YMXvJa@79E}UUlEIubhwe?go_v8nIhwg|`1j8p*ZSN; zLve#FO4W~&xHzQ%!O5nOEz*AQ-V>F>9K9OTWFBsQ3OP9@d2XJON>38jXFbHy z$m%@8A)sW-_6`0vl5_k$Pn{Wa^nJuovEa{&VaT&sMW6MY>@v^8jht)kM?b;WD!YUG z`y05Rt;e(5uj+37Y$gjHQp7m~%(tW^UHyCbn-0H*oJ>tLjvehO&Hk=i;&5`}5xf;> zJKOjxPWF(R9dht9p{9n^jxP^fe4GJ)bp#g^YEXCJAZa{T5UHB5OG7Bk$LjSfdv5&7 zIVma+-s``K>n|=|ofkZL-y;*U1r3^aTktPO(fgZwqvf+dBkRgb|E`GN+OCrc`MtG! zyjMMf*{!X!4Cp}YKl1FG#+~dAr)}2%`0ru)r_G;}PaacO&6@TKGoQI&W+4yRy#7m= zT()@l>7b$`cz6^ufx(f<94f;NPbPC(&SwI7T5i0m4*Ap@blINfCZ7tjb2}Bmc|U&( zr{l)7za!o6%c^d9WY=SE>~hiuUbLQN?aupDnzGT__#_32lSS5V6 z)-$$7(kZYt%P3M<+Y%R)#k=N^G>@%hSi)xJa13s|&4EOo146U4lX9gj9YBv)H^wEj z^`smOciT_1fwcPJQ>^xC;2`mnq~RLgP+FcI0-8R;WZP35Co6y}i6HHkdV7q{53b>BXE z`;~>AE`gBAs|91F--u{UZGSjz_`uorIhn>dj1*G{b4*{np)i6?;+Vpp0_dADFY@cv zKX^<#7gPrrfwXVwaVan2AG5+=VZgyt0!+Cq>n0309T)ejQ=KZVqdCF8E!FQx3HJ3A z#bTuh$!&?!^8stbdQ1n_h>jv@cskl9qEU$iTpPv4D^VmRPbZ{q6J3AgUVva4ww`i| zifCO(e|d^)Sx2&~G5a(qy_xe3*?DfgAQK%Ut>|0SihVhU?BrN4NJJCt2s2g_*qCN) zJQqa|Zp)%MWP8Ns&8zA~Oatman+6*?!P5ZjPSB_GP}mZmlQb?8)tAlAuf~+xK|blU zlF5@=gXz9kE=-844$${BFMbpJ(2duD0oR4Ls#r{TR4^8fViTgH=rQ=~^*GOtcYDk} zJ0rjZJG-93do?1#{icJBm@dLzem+@&Z6S;_9A8X{sdACOP^wJbcoaR4+&X+RiWP#d zpG(O{MGUGtA|lDEViZZH(rW!e$xqDy)!Y z<(Sel{tJJT-8;I$SXu9&mqYXPdSJA!bVjMbX&~Iqs$4c;IOBH`Zl~KOVO=TWq3NyB zAXytw2l7s9C@C^e{cQ%O;(Dh5Sa8`3sv}nFl-7Af>zSBU*pw=Qn_Yk@xCPUG_M-Hg zBPMC;hI7FfJy;WQMbe%3Am0mjZcMm0VD?#lUA==Z{(>8CZ;=u1jzn!@`Bww3Ty=$X zJn+k8*_rWZSro07Y$t!6x#JOfi1?m6=ru4tw-8>$+AFZtkZ*Na&t=W z#+Y=iS9X*xsBpJhIB_%82gkJK zo7*XSw#@LQ3{GmMp}x$Qe#oFsAeN_`7S!RiwGbds3SZ3rQ7p<2#S2)wg(a zu{cR>7CQ_SZ-tU`UtYzXyXSnWL235ThxTFMHH7@P@N`9e1qC)fFN);HYP4%+sZ_1; z*0eY7zi8{t_slg?wI#P7Nz)6z0G`|ly+@dq{8$%uPa7nzg%e&sWoJV@hGr;COA;+5 zHz-`sz`L7wvDBo^K4!fHt3aS-V!c>KZWWImdVWxp@WxNF9SrF)Fm_g&&7`Duktmh3 z{=GgB)0 z!eC4~N=p2~7-np!`)z46_u^gciWKD)+d{Xv|fwWrxtlCzm z7gYjt{M>;NKYt^xRnd9!dQykXxo#RT^ajHi#+4WU&FcskDT16^K5Y6!05 zS#fpVK5P%*p9lfxV($LdxP2sAV98>64vCKy!@<{3B@dk)LoA$NkKwI@I$%qWu7lO9 z0pws5m)qYDFz{m-*@~`veT>+P<*Td7V%cprJtBn9s%<3vjICn7))zxY6H7|kuQ^cy4VnOY7?Oqo%W8&t76Y ztz<5a;0&xI@yxRo8!;)cF&RC^c_(;czRPJ{E?ro2mV4dbbl@dA=Nc7Z8*+;uzU-vA{5c?3`~)2rQZE z52#P~2g1g&Bp`2rKt8}VaICg3HqyRr(iWP|bedTTz zf!vu}reG-?P0q;C&X05W;(DzaF0pNktQs8h8$SzVs;c5Nm7ra_lq|;DEA}ek3-+s7 zKKrWNmn_CQgxuX>wRm!ap$-lqcG*Dj7F=LSW2nX~t*c47H{Of4_1NHMYWRjrz{#^T zOZnd%qBmbhW=8&V1xYj@8qRr;Mc$ioK6hiM!d0Zd7sj3FWv=KD)fJ(QDrqp@*^;07 zpo?e^HcySHG25r{iv!la?T4146M>iETIOzyB8ae%I?_+=dfWI%@ZBjd1*vP+UceKS z^Nt$7=kj?u?;XuVpeljOQ_%K!7adX;Zh!8ldNcs%6-Yg^O(mV3!1iTn7Uq*g5QRZs z5?kQ9p7?!_!9(Bo-`UPeUqvcNv04|&pH(X1UO+bKF!!ig!av$4;t#(^LGk4R-TwL& z+r|%x(Z3nTdXxHv5n?7wFffk&?9COThmrVtO8huhhp9%;eMuxqB)q=dDIv7N4Iked zbja|~n^4U0^bfmHsCGL3^*U1K@X0#??k6qTRSS3i!|H?H;$3iwBzTh$Nu$ZDAjL;) zSo@?QtsT{i-~5GbNmIEiyRX@xFY}g65JNEOai3h<&Sa}>=(GhPKBJ-N?8&F?bSiIs zF<>xK3uG)Mry_Plu-O~^9b3sqe43iWdHdE`YFwh>4CmzL89eX>_)E1?I#89hU@uB) z?s&^j6%HLKnIwBH8wk-E_^z(8b~R(qs9Kak+g-RD$iA7==Y?M&gy*X*iX&1jACLO- zFEgJd0ZxFPTub2{Xusy%7#sA)bBifBPgSN|UV*s`a%ZZY6NQZLxB6yYfS(=22Ja7` zcR4TB+FzK!NRJKaIwRzx;>ZmpXSb7pJZ4KRB?lcH&~Mfy`+%p>p_tt34ECj&2E~J< z*t=Mni;Zatow?)%afFmiid(j2me$~zJKqWF&HRtDM1U&nEAnap$=~8-fYUA1`dIE) ztd{z4%gTHL!qjcJ+4i8_&jR21?r?AHJ?e zzZt`@$E*>(0M`1sfCrF~6#wXlFYk_Q2P-8dz0JwGjuk75FNLTc|BnZc%W>Y(0KFfd z>h2}d>wsrWXWr%84jznEE5riW%U%;0%VbnF@lK%hhXOIg1%G4JtJ?A8 zcvFv^3Nv*F@C8MMb%FRf1>KMOLz$%xV(kNbPua|P7Nn4!xf$rn?zm^Tth0TI|9FM3DW9- za_qed>bKn>n2B%871*gW)3g5}8gR5N??u7>%-EioOdzO#P-M|YwH-XO6A4#Pu9G@l znbu{eA~jgNu>GCN`pg0pg+urv-02dd&m^j(%yZ#>1S!C!URi+qX)gTzfURgX1Or?3 zb*7l%mVxYULncMFNTW-d6epN~y!;@6NbbGF*mnWA@}Y}oQbPw^nV3jqyUJZb7WvFQ zZGV2-wY-zrrI!IJ+3Kfz+l_OHUQzOIN8GxT)CB&^6hGcDF&SHGE!JRapTg$fdwB{W zrm}+kHvcXW*sf?AX-HJNy#lk>itoq%Qb3mhNm}03iALZlxcgFArpU@*&`p2(YsJ_=Dg&ojTjewizg}c+81cA z5ocbyGxbTWAQd9y!05}h!(vR1IBHY|exMm^fnP%Y?m%gnnz;(~Oz-ZwL>QphFs5jF z&%nr=m0PgdVe8ql+hIRQyQmUHsiEcc+5+;@mX8LjQl}xxFUK&E5Dp<*k~=u)oMt+e z9wj&U{r!WjCt^SU@x`%4bc<7>n zzSSS)$&^tTQ4J9#!83GN{~}u!em=*pbdV;KSK;!gs9H01dw|Q^DCo5tkd))aB3q!U18%<;{YQn*JSs?OcOu_#0%H z6#E#IeyEisQ~7U0)aoUKcc@uD2&8%TS?QYPNP?-{DCNB{J?MxnBunvpSpZ(jZ&oX1 z|L)T`2;gaIA0xF1qN9ML{IA7mtM+V578 z=5W<=5~BI&0uo>HIM!Zr>4s;&?70ua*qB6s^io{rxKI?K46Jr9uwm`Rd+WI$cI|KM zs6(Pic^O?D|Droh8-E!!CYH0k3tt zx-sm00~xx@L`6Hh>L*!uAhMXkqd(JJ@+kP5o@2{?FLmRpkUH*qH88^S^FD+L9{7Ah z_@ZW_LP<+$8os8E@D;)AB9&N5;v?*Fx)>KvV9)gH^M2 z%)7JsG%zH7gbWpXnY@9u7)1v}>iyxC`P{NteGg(9er@Vbq>+p!7@dX!? zy?#cmWhV+d>zF%NxNwI--9YXXHl{MU{WDfk6wz9-V^AX)_w5WS;^Vz)5}zqbzfinV z(W&@z8jXku6cAMF_uQ)mDTJM6AC{^wb@b~s(W|K5<@BltZsxgn-iYWh3j_S(TY&Ji z#o}{P?cEGAXKG4*|B88gHAlOb`9O&&sZBr48x>IyN@9}e!=6f5LH=&~X*bE%5fGhz zW$g?E zJG8sG#;;*PwUS|mDhOhyFLl7&rh*cv+3bYL%Q@9o{~5S=_F+;BreDOD5+RQOoOq4H z-r|)$o9ayqkCv64JM__Zx=eAp(1nnv{SEM+{S^pKN(g@>*O$i{MOEul|2>zdIB`!Q z3ZqT|nZ(j_v)Grn|Cad`&7-pdH)^v~Aty1p{-($ItJaWh{|m2S(*yfP4H-b`3~z54 z*)_YHTc74{Tm)%w{_5Fe3s;>@QJ}IH8+Z$Tx;q#+?8*VYrFNYajC!y{mx3ZOI&>EtLQ+j0GCR9b3zkP<-@5)j#-zTh>$zXH3m zAu9Iwb7ZJiU9u_Dp^u-Q6h%_@oq&AN;H5!q*?`)_o-`b)1MPNNba=IKC`lui1l*5! zPnH@HAEllYpzgsvm zr9z_TPg7benUsZ94JB1-dL!(2dlg}liwXPp+r{@c;<=@0aduFkHLu3c5d$nW z7Av%a5v`C8(ZUJo!X_pwms?}mz^*))BfNoe+^YOue4zRF&SN-me@eLei@dr8625N2 z&Bvi9SAcSURTp7cZAf<*~nLla1&0W5$Kb`YY-)PU`i{Nwcs~!;%yf^$qg4zBjbFz3qhc z&(^71!1&e~gLcQUeb{JwYPGs@@w%~dmm%8~bOB>R3kDgB0pU8NHc00@`!N3WI-|`T zvFq(J%z(*J&4b8OBKDTtx{)L5Za(vwdzenqN{09X=lG6Bq-UF-V@f zKvhQ<_JuaI_CZM9SAp`SK`BC;bvKOEEDl%b<-L!1$I1QB9WCg^qNYS)J$myMtN4Nm zXXLCV4;?SOfO=7ZL&$!I9;asBju88i`{z*}#FxWJLQDZ`NN+h8!x-t#^XrV;5-nKA z{a!xDF=i(M<77BVNM3g!gA+iYA>E$Q(E+h!xAva$_Zlj~NQ%OG?;cu4mO-192B#L_ zX5Q270^O%!r?3))TCjWdgFlil)zSo5$;7{40J~@%X{G3Kp&D+y2=sGzB2Q<5KKMNCbXq;}%Y9&Tt-ObAf_!%5&59n~A zre4`;+90f1hQjJ~u>p8Pp<`j7h6()qj(pARA|(BM&`PG0`IPs+nG~SEaU%arqM)EF zL)trm@n7&1xjM1htU}O1%udG}GG&|&Mn?_1ho48rNYgl4$w;t@gTm4@P;ev?Qh+z= zEHpIv@1Ubkr(dr#Lnud*G&IixM`wfgc6L_ghVO5F9;hy%3{GRbIZf5v$;ucaC41*>o1@k~{U zvslC(NV>9{j#Io8hBEykmhfYUZ~N^s49Jg!eBAju6S&2yh^9c)E(TRB0Ri{g zBRzpVPa!HJkMaFY!LuWtHy3?`q#FIt{2x+0QnTem=)pEQ%SDOO_JIn)>_q<@AhAmHf@s&Ru<TvJ1ISw55CpA>?o`L z78dfrA|7X9WmPa+%h8JNSWs7`U$@lh>XLD9EN+##TVY;mU7@*)CWXNmJ+wVh1{71^H!B}!s<3L1>@hMUJLN+epDSt! zvGNQFlloztzw=LzK07-g3dBCrP*o}Jz2mRcqF}u(%OUt6xi9rP6}Q}_bw-)yTwBY< zqnj-ulMi1)-oy0wIJK$0j-%WMAdENqt2YY!@kk+I=(*!i)i$TJ*UeUhi+G4%Wl z*3(dFa>ZsSdFHfkcD*7RAJ2RdX``kly5l|fh*P2ky8z+gS?5j2F$f+1(9i2}UbHxM zHlnt1ECkb%!`Sn#(EeSyH>&>eK>#&dv)x8S^Yz)u^SVOc!KR&1QX})hvTxruOMO^N zr@vR%d<(^GSt0e|w+yyL=?z^-pkt?a^BZQLQFtWn-BF4TLvYbe+O>^MaT zZakIX=GHy~@yp=0PCh)`0qx|M~k%c=cP|X2YYm{aSgB!*>CxY=T+-A9F)nI@$s*LK*)>fOy34Z8I_;0)CniaLYH?ge`c zss{lL>se`H;kNO~kER`I-KVdt+~$g0^MCkKP(>$;5WhOw@+##%F+tzHTdm+K(-m|4 z@o|{&lgqg)6JF@=@*2Ki%k?4agjj1frpZ*H;l5*qnI6%dpOj&BZhQL~Vu5VWcfeYX zo*}+``}wYCX7u|0e7>Gs+;FgmGyWVr#X(yN8jW=NCA5coA{W)Q7dzqRU zU-}b;5$#&vU1vX}2)c@}MpgYGA`<=$u3(|#yf4_RIUs*fQP3sZbc#gS;fF>AZKqN8 zg8-q^EM+nDBiQlg1Z78rg174nVg2XI1!1|!fD}TZWh8u~w$>o9FD^}i^6lkiM*H(2 zO>jd6KIIx_R2HKP$D8#xEgXh=U%U6Ob6c*7>R2O(p3BC0c^;_OAzp zEg{OtXp|Pf*66_9D0We`q0zfO*sGWEcEMw{ly{s*hEQN4ZXvKlF``JNYggn>rJ3H&i zDr*15>3Y+dK8JM0{^zp|LV2id&q(5G$JI5kXp3HJBI?4@)xL%=87p?6KYZpd-W!U9 zTSjPz&c30;Mh|tr2$^uyuBvjM$X7YbY&ey0XFrH}8^>nSdu_b);m;p)OLaEPCkxHH zUyW1zbqm5Rj*0ZQr(Ivrui_yr(6PxoyBg-^ttP9iCqpME`ucRwPkcD(4)B;JDTFAh zYidphGW=Y3gnxH7GBL67Sex4zAlIkwi(ya^u_m*zFi6XGuTSPilqxm{@3So?V~gE8 zqVgA)kU*86{D>{A9xc+#;ZfCsV_qOM9C@s!gbc)ge7F+yI9`qW3hV33utogK{oHfi zm`QmNgZr4WS?FXN?Z9R9ycCPvdZj0^+J0fVdZN3;@UJx*$Zqxf>tWZ#)d8DENp`W` zSqgHtq-3`2yvUSgr23D5vlY>Sv(hH2c=XWSr}nCCZuis0$<9bwN|gd8B|bU-xvO!u z3Yr$ ztjN-GFu}Hq#$Sod1~FDLgNK{BsJzUO7*#SxaqLuYfOzYUnj5a@9J8Itchi|u{b`O8 zZ&|VnU5cp14;*4A6>~p4H4i*qrjBe|n3tOOj4Bqr=5X#3hyG5PlxEYb%-KlhcdW`9 z$cJ_G9S(<+_ui*kTU)y=8y`i)fg<<3T~YvCe9av)$){=m;1++^vl%v ze+efS6oD}lXx6BctEsEU{b-RWMmCh1gknC))GAghRDa$kfgea(ZD6^2=z4tF5Q4kE zxKa=e8s2$QnT^I+W!z$Cgu*w@Z-#~;_w zaAAMQlmvB1Qnv)w=S;2FC9H@3BXJ#V6G3(PR~Wm zI2WwOMn^_ceYb<1Up8kOj(Yv0o_5R^t>$m=TzQ>Ye9Ecr?Zys#czn&wrR3VokvJa_ z-C0n)>MqR2I(qu)TYf`<{Vo~wb3>-X&&(tDvy+Z+Vm_nKu5aBZn*8XhuH5p`w)>L?`Z}IfS58iAazgVl zKor@k)cHkU2Bm6xdwTfrJ0?0yEHtpOvAwQIt9S_gzqGVKB?9EEg#-%1ye8vuIjoTn z-wg9gMqsB~sxvb3;nVG%Ch}f{Rk_+-Umjpo@D$Uuintxu_=?$Y6Nym!%cYQ5Sy{=5 zl9AP29`qAS1Z=(^#Df#Fi>bj@H8ty+bXaXC%2`%sBm7m~=GzBxsSgj


~O(pzu5 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 diff --git a/doc/salome/gui/SMESH/input/about_meshes.doc b/doc/salome/gui/SMESH/input/about_meshes.doc index a69bd1223..ebab52e8b 100644 --- a/doc/salome/gui/SMESH/input/about_meshes.doc +++ b/doc/salome/gui/SMESH/input/about_meshes.doc @@ -65,7 +65,7 @@ the the element basing on elements of lower dimension is NOT supported. \anchor mesh_entities -The mesh can include the following entities: +The mesh can include the following entities (also referred as \a elements):
  • \b Node — an entity of a mesh defining a position in 3D space with coordinates (x, y, z).
  • diff --git a/doc/salome/gui/SMESH/input/building_compounds.doc b/doc/salome/gui/SMESH/input/building_compounds.doc index 8a89df1a7..fb48fdb26 100644 --- a/doc/salome/gui/SMESH/input/building_compounds.doc +++ b/doc/salome/gui/SMESH/input/building_compounds.doc @@ -1,13 +1,15 @@ /*! -\page building_compounds_page Building Compounds +\page building_compounds_page Building Compound Meshes \n Compound Mesh is a combination of several meshes. All elements and groups present in input meshes are present in the compound mesh. Neither geometry nor hypotheses of initial meshes are used by -the compound mesh. +the compound mesh. No link between input meshes and a compound mesh is +supported, so that modification of an input mesh does not lead to +update of the compound mesh. -To Build a compound: +To Build a compound mesh: \par From the \b Mesh menu select Build Compound or click "Build @@ -24,23 +26,25 @@ The following dialog box will appear: \par
    • \b Name - allows selecting the name of the resulting \b Compound mesh.
    • -
    • \b Meshes - allows selecting the meshes which will be - concatenated. They can be chosen in the Object Browser while holding -\b Ctrl button.
    • +
    • Meshes, sub-meshes, groups - allows selecting the meshes, + sub-meshes and groups which will be concatenated. They can be + chosen in the Object Browser while holding \b Ctrl button.
    • Processing identical groups - allows selecting the method - of processing the namesake groups existing in the united meshes. -\n They can be either
    • -
        -
      • \b United - all elements of Group1 of Mesh_1 and Group1 of Mesh_2 - become the elements of Group1 of the Compound_Mesh, or
      • -
      • \b Renamed - Group1 of Mesh_1 becomes Group1_1 and Group1 of Mesh_2 - becomes Group1_2.
      • -
      - See \ref grouping_elements_page "Creating Groups" for more information - about groups. -
    • Create common groups for initial meshes check-box permits to + of processing the namesake groups existing in the input meshes. + They can be either
        +
      • \b United - all elements of Group1 of Mesh_1 and Group1 of Mesh_2 + become the elements of Group1 of the Compound_Mesh, or
      • +
      • \b Renamed - Group1 of Mesh_1 becomes Group1_1 and Group1 of Mesh_2 + becomes Group1_2.
      • +
      + See \ref grouping_elements_page "Creating Groups" for more information + about groups.
    • +
    • Create groups from input objects check-box permits to automatically create groups corresponding to every initial mesh. -
    • + +\image html buildcompound_groups.png "Groups created from input meshes 'Box_large' and 'Box_small'" + +

    • You can choose to additionally \ref merging_nodes_page "Merge coincident nodes" \ref merging_elements_page "and elements" in the compound mesh, in diff --git a/doc/salome/gui/SMESH/input/group_of_underlying_elements.doc b/doc/salome/gui/SMESH/input/group_of_underlying_elements.doc index a6a1b91ff..e24cebd3e 100755 --- a/doc/salome/gui/SMESH/input/group_of_underlying_elements.doc +++ b/doc/salome/gui/SMESH/input/group_of_underlying_elements.doc @@ -1,22 +1,39 @@ /*! -\page group_of_underlying_elements_page Create Group of Underlying Elements +\page group_of_underlying_elements_page Group Based on Nodes of Other Groups -To create groups of entities from existing groups of superior dimensions, in the \b Mesh menu select Group of underlying entities.
      +To create a standalone group of entities basing on nodes of existing +reference groups, in the \b Mesh menu select Group of underlying entities. The following dialog box will appear: \image html dimgroup_dlg.png -In this dialog box specify the name of the resulting group, types of entities and set of source groups. - -In the figure below, there are two source Volume groups: +In this dialog box specify
        +
      • the resulting Group name,
      • +
      • the Elements Type of entities of the resulting group,
      • +
      • the criterion of inclusion of a mesh entity to the result group, + which is Number of common nodes of the entity and the + reference groups:
          +
        • \b All - include if all nodes are common;
        • +
        • \b Main - include if all corner nodes are common (meaningful for + a quadratic mesh)
        • +
        • At least one - include if one or more node is common
        • +
        • \b Majority - include if half of nodes or more is common
        +
      • +
      • select reference groups,
      • +
      • Include underlying entities only option if activated + allows inclusion of an entity provided that it is based on nodes of + one element of a reference group.
      • +
      + +In the figure below, there are two reference Volume groups: \image html dimgroup_src.png -
      Source groups
      +
      Reference groups
      -In this case the following results for Faces, Edges and Nodes are obtained: +In this case the following results for Faces, Edges and Nodes are obtained: \image html dimgroup_2d.png
      Faces
      @@ -27,8 +44,8 @@ In this case the following results for Faces, Edges and Nodes are obtained: \image html dimgroup_0d.png
      Nodes
      -See Also a sample TUI Script of a -\ref tui_create_dim_group "Creating groups of entities from existing groups of superior dimensions" +See Also a sample TUI Script of a +\ref tui_create_dim_group "Creating groups basing on nodes of other groups" operation. */ diff --git a/idl/SMESH_Gen.idl b/idl/SMESH_Gen.idl index 3a3cb2db6..ef962582e 100644 --- a/idl/SMESH_Gen.idl +++ b/idl/SMESH_Gen.idl @@ -276,16 +276,16 @@ module SMESH raises ( SALOME::SALOME_Exception ); /*! - * Concatenate the given meshes into one mesh. + * Concatenate the given meshes or groups into one mesh. * Union groups with the same name and type if * theUniteIdenticalGroups flag is true. * Merge coincident nodes and elements if * theMergeNodesAndElements flag is true. */ - SMESH_Mesh Concatenate(in mesh_array theMeshesArray, - in boolean theUniteIdenticalGroups, - in boolean theMergeNodesAndElements, - in double theMergeTolerance) + SMESH_Mesh Concatenate(in ListOfIDSources theMeshesArray, + in boolean theUniteIdenticalGroups, + in boolean theMergeNodesAndElements, + in double theMergeTolerance) raises ( SALOME::SALOME_Exception ); /*! @@ -296,10 +296,10 @@ module SMESH * theMergeNodesAndElements flag is true. * Create the groups of all elements from initial meshes. */ - SMESH_Mesh ConcatenateWithGroups(in mesh_array theMeshesArray, - in boolean theUniteIdenticalGroups, - in boolean theMergeNodesAndElements, - in double theMergeTolerance) + SMESH_Mesh ConcatenateWithGroups(in ListOfIDSources theMeshesArray, + in boolean theUniteIdenticalGroups, + in boolean theMergeNodesAndElements, + in double theMergeTolerance) raises ( SALOME::SALOME_Exception ); /*! diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index aa7b848d4..bb193bcc1 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -150,7 +150,8 @@ module SMESH Geom_PENTA, Geom_HEXAGONAL_PRISM, Geom_POLYHEDRA, - Geom_BALL + Geom_BALL, + Geom_LAST }; /*! @@ -252,6 +253,14 @@ module SMESH long major, minor, release; //!< MED file version }; + /*! + * Enumeration for CreateDimGroup() + */ + enum NB_COMMON_NODES_ENUM + { + ALL_NODES, MAIN, AT_LEAST_ONE, MAJORITY + }; + /*! * Auxilary flags for advanced extrusion. * BOUNDARY: create or not boundary for result of extrusion @@ -497,14 +506,21 @@ module SMESH raises (SALOME::SALOME_Exception); /*! - * Create groups of entities from existing groups of superior dimensions - * New group is created. System - * 1) extracts all nodes from each group, - * 2) combines all elements of specified dimension laying on these nodes. - */ - SMESH_Group CreateDimGroup( in ListOfGroups aListOfGroups, - in ElementType anElemType, - in string name ) + * Create a group of entities basing on nodes of other groups. + * \param [in] aListOfGroups - list of either groups, sub-meshes or filters. + * \param [in] anElemType - a type of elements to include to the new group. + * \param [in] name - a name of the new group. + * \param [in] nbCommonNodes - criterion of inclusion of an element to the new group. + * \param [in] underlyingOnly - if \c True, an element is included to the + * new group provided that it is based on nodes of an element of + * \a aListOfGroups + * \return SMESH_Group - the created group + */ + SMESH_Group CreateDimGroup( in ListOfIDSources aListOfGroups, + in ElementType anElemType, + in string name, + in NB_COMMON_NODES_ENUM nbCommonNodes, + in boolean underlyingOnly ) raises (SALOME::SALOME_Exception); /*! diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index 20aeb54af..b3401c601 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -131,7 +131,7 @@ SMESH_MeshEditor::SMESH_MeshEditor( SMESH_Mesh* theMesh ) */ //================================================================================ -void SMESH_MeshEditor::CrearLastCreated() +void SMESH_MeshEditor::ClearLastCreated() { myLastCreatedNodes.Clear(); myLastCreatedElems.Clear(); @@ -10338,7 +10338,7 @@ SMESH_MeshEditor::FindMatchingNodes(set& theSide1, void SMESH_MeshEditor::DoubleElements( const TIDSortedElemSet& theElements ) { - CrearLastCreated(); + ClearLastCreated(); SMESHDS_Mesh* mesh = GetMeshDS(); // get an element type and an iterator over elements diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index 4d9f8078b..23f3977aa 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -70,7 +70,7 @@ public: const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; } const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; } - void CrearLastCreated(); + void ClearLastCreated(); SMESH_ComputeErrorPtr & GetError() { return myError; } /*! diff --git a/src/SMESHDS/SMESHDS_Group.cxx b/src/SMESHDS/SMESHDS_Group.cxx index 3f2fa3c13..6e30e008b 100644 --- a/src/SMESHDS/SMESHDS_Group.cxx +++ b/src/SMESHDS/SMESHDS_Group.cxx @@ -98,7 +98,17 @@ bool SMESHDS_Group::Contains (const SMDS_MeshElement* elem) bool SMESHDS_Group::Add (const int theID) { - const SMDS_MeshElement* aElem = findInMesh (theID); + return Add( findInMesh( theID )); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +bool SMESHDS_Group::Add (const SMDS_MeshElement* aElem ) +{ if (!aElem || myGroup.Contains(aElem)) return false; diff --git a/src/SMESHDS/SMESHDS_Group.hxx b/src/SMESHDS/SMESHDS_Group.hxx index 366f53aab..08ff29bac 100644 --- a/src/SMESHDS/SMESHDS_Group.hxx +++ b/src/SMESHDS/SMESHDS_Group.hxx @@ -60,6 +60,8 @@ class SMESHDS_EXPORT SMESHDS_Group : public SMESHDS_GroupBase bool Add (const int theID); + bool Add (const SMDS_MeshElement* theElem ); + bool Remove (const int theID); void Clear(); diff --git a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx index 9b440ea5f..90f42ee45 100644 --- a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx @@ -200,11 +200,11 @@ void SMESHGUI_BuildCompoundDlg::Init() { mySMESHGUI->SetActiveDialogBox((QDialog*)this); - myMesh = SMESH::SMESH_Mesh::_nil(); + myMesh = SMESH::SMESH_IDSource::_nil(); - myMeshFilter = new SMESH_TypeFilter (SMESH::MESH); + myMeshFilter = new SMESH_TypeFilter (SMESH::IDSOURCE); - myMeshArray = new SMESH::mesh_array(); + myMeshArray = new SMESH::ListOfIDSources(); // signals and slots connections connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); @@ -289,7 +289,7 @@ bool SMESHGUI_BuildCompoundDlg::ClickOnApply() if (!isValid()) return false; - SMESH::SMESH_Mesh_var aCompoundMesh; + SMESH::SMESH_Mesh_var aMesh; if (!myMesh->_is_nil()) { @@ -300,22 +300,23 @@ bool SMESHGUI_BuildCompoundDlg::ClickOnApply() try { SUIT_OverrideCursor aWaitCursor; - myMeshArray[0]->SetParameters( aParameters.join(":").toLatin1().constData() ); + aMesh = myMeshArray[0]->GetMesh(); + aMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen(); // concatenate meshes if(CheckBoxCommon->isChecked()) - aCompoundMesh = aSMESHGen->ConcatenateWithGroups(myMeshArray, - !(ComboBoxUnion->currentIndex()), - CheckBoxMerge->isChecked(), - SpinBoxTol->GetValue()); + aMesh = aSMESHGen->ConcatenateWithGroups(myMeshArray, + !(ComboBoxUnion->currentIndex()), + CheckBoxMerge->isChecked(), + SpinBoxTol->GetValue()); else - aCompoundMesh = aSMESHGen->Concatenate(myMeshArray, - !(ComboBoxUnion->currentIndex()), - CheckBoxMerge->isChecked(), - SpinBoxTol->GetValue()); + aMesh = aSMESHGen->Concatenate(myMeshArray, + !(ComboBoxUnion->currentIndex()), + CheckBoxMerge->isChecked(), + SpinBoxTol->GetValue()); - _PTR(SObject) aSO = SMESH::FindSObject( aCompoundMesh ); + _PTR(SObject) aSO = SMESH::FindSObject( aMesh ); if( aSO ) { SMESH::SetName( aSO, LineEditName->text() ); anEntryList.append( aSO->GetID().c_str() ); @@ -332,7 +333,7 @@ bool SMESHGUI_BuildCompoundDlg::ClickOnApply() mySelectionMgr->clearSelected(); SMESH::UpdateView(); - _PTR(SObject) aSO = SMESH::FindSObject(aCompoundMesh.in()); + _PTR(SObject) aSO = SMESH::FindSObject(aMesh.in()); if ( SMESH_Actor* anActor = SMESH::CreateActor(aSO->GetStudy(), aSO->GetID().c_str()) ) { SMESH::DisplayActor(SMESH::GetActiveWindow(), anActor); SMESH::UpdateView(); @@ -412,12 +413,12 @@ void SMESHGUI_BuildCompoundDlg::SelectionIntoArgument() for (int i = 0; nbSel != 0; i++, nbSel--) { Handle(SALOME_InteractiveObject) IO = aList.First(); aList.RemoveFirst(); - myMesh = SMESH::IObjectToInterface(IO); + myMesh = SMESH::IObjectToInterface(IO); myMeshArray[i] = myMesh; } } else { - myMesh = SMESH::SMESH_Mesh::_nil(); + myMesh = SMESH::SMESH_IDSource::_nil(); aString = ""; } diff --git a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h index 4f17bed19..161d2183f 100644 --- a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h +++ b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h @@ -80,9 +80,9 @@ private: SMESHGUI* mySMESHGUI; /* Current SMESHGUI object */ LightApp_SelectionMgr* mySelectionMgr; /* User shape selection */ - SMESH::SMESH_Mesh_var myMesh; - SUIT_SelectionFilter* myMeshFilter; - SMESH::mesh_array_var myMeshArray; + SMESH::SMESH_IDSource_var myMesh; + SUIT_SelectionFilter* myMeshFilter; + SMESH::ListOfIDSources_var myMeshArray; // Widgets QGroupBox* GroupConstructors; diff --git a/src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx b/src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx index 3462495c8..bfcf31895 100644 --- a/src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx @@ -30,37 +30,34 @@ #include "SMESHGUI.h" #include "SMESHGUI_Utils.h" #include "SMESHGUI_VTKUtils.h" - -#include - -// SALOME GUI includes -#include -#include -#include -#include +#include "SMESH_TypeFilter.hxx" #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include - -// SALOME KERNEL includes -#include // Qt includes -#include -#include +#include +#include +#include #include -#include #include +#include +#include #include #include -#include #include -#include -#include -#include +#include +#include #define SPACING 6 #define MARGIN 11 @@ -110,7 +107,7 @@ QWidget* SMESHGUI_GroupOpDlg::createMainFrame( QWidget* theParent ) aLay->setSpacing(SPACING); // ------------------------------------------------------ - QGroupBox* aNameGrp = new QGroupBox(tr("NAME"), aMainGrp); + QGroupBox* aNameGrp = new QGroupBox(tr("RESULT"), aMainGrp); QHBoxLayout* aNameGrpLayout = new QHBoxLayout(aNameGrp); aNameGrpLayout->setMargin(MARGIN); aNameGrpLayout->setSpacing(SPACING); @@ -312,6 +309,7 @@ bool SMESHGUI_GroupOpDlg::isValid( const QList& theL */ void SMESHGUI_GroupOpDlg::onOk() { + SUIT_OverrideCursor oc; setIsApplyAndClose( true ); if ( onApply() ) reject(); @@ -951,35 +949,55 @@ void SMESHGUI_CutGroupsDlg::onSelectionDone() \param theModule module */ SMESHGUI_DimGroupDlg::SMESHGUI_DimGroupDlg( SMESHGUI* theModule ) -: SMESHGUI_GroupOpDlg( theModule ) + : SMESHGUI_GroupOpDlg( theModule ) { setWindowTitle( tr( "CREATE_GROUP_OF_UNDERLYING_ELEMS" ) ); setHelpFileName( "group_of_underlying_elements_page.html" ); QGroupBox* anArgGrp = getArgGrp(); - QLabel* aLbl = new QLabel( tr( "ELEMENTS_TYPE" ), anArgGrp ); - - myCombo = new QComboBox( anArgGrp ); - static QStringList anItems; - if ( anItems.isEmpty() ) + QLabel* aTypeLbl = new QLabel( tr( "ELEMENTS_TYPE" ), anArgGrp ); + + myTypeCombo = new QComboBox( anArgGrp ); + QStringList anItems; { - anItems.append( tr( "NODE" ) ); - anItems.append( tr( "EDGE" ) ); - anItems.append( tr( "FACE" ) ); - anItems.append( tr( "VOLUME" ) ); + anItems.append( tr( "MESH_NODE" ) ); + anItems.append( tr( "SMESH_EDGE" ) ); + anItems.append( tr( "SMESH_FACE" ) ); + anItems.append( tr( "SMESH_VOLUME" ) ); + anItems.append( tr( "SMESH_ELEM0D" ) ); + anItems.append( tr( "SMESH_BALL" ) ); } - myCombo->addItems( anItems ); - myCombo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - + myTypeCombo->addItems( anItems ); + myTypeCombo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + + QLabel* aNbNoLbl = new QLabel( tr( "NUMBER_OF_COMMON_NODES" ), anArgGrp ); + + myNbNoCombo = new QComboBox( anArgGrp ); + anItems.clear(); + { + anItems.append( tr( "ALL" ) ); + anItems.append( tr( "MAIN" ) ); + anItems.append( tr( "AT_LEAST_ONE" ) ); + anItems.append( tr( "MAJORITY" ) ); + } + myNbNoCombo->addItems( anItems ); + myNbNoCombo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myListWg = new QListWidget( anArgGrp ); + myUnderlOnlyChk = new QCheckBox( tr("UNDERLYING_ENTITIES_ONLY"), anArgGrp ); + myUnderlOnlyChk->setChecked( false ); + // layout QGridLayout* aLay = new QGridLayout( anArgGrp ); aLay->setSpacing( SPACING ); - aLay->addWidget( aLbl, 0, 0 ); - aLay->addWidget( myCombo, 0, 1 ); - aLay->addWidget( myListWg, 1, 0, 1, 2 ); + aLay->addWidget( aTypeLbl, 0, 0 ); + aLay->addWidget( myTypeCombo, 0, 1 ); + aLay->addWidget( aNbNoLbl, 1, 0 ); + aLay->addWidget( myNbNoCombo, 1, 1 ); + aLay->addWidget( myListWg, 2, 0, 1, 2 ); + aLay->addWidget( myUnderlOnlyChk, 3, 0 ); } /*! @@ -1007,7 +1025,7 @@ void SMESHGUI_DimGroupDlg::reset() */ SMESH::ElementType SMESHGUI_DimGroupDlg::getElementType() const { - return (SMESH::ElementType)( myCombo->currentIndex() + 1 ); + return (SMESH::ElementType)( myTypeCombo->currentIndex() + 1 ); } /*! @@ -1017,7 +1035,7 @@ SMESH::ElementType SMESHGUI_DimGroupDlg::getElementType() const */ void SMESHGUI_DimGroupDlg::setElementType( const SMESH::ElementType& theElemType ) { - myCombo->setCurrentIndex( theElemType - 1 ); + myTypeCombo->setCurrentIndex( theElemType - 1 ); } /*! @@ -1047,10 +1065,19 @@ bool SMESHGUI_DimGroupDlg::onApply() QStringList anEntryList; try { - SMESH::ListOfGroups_var aList = convert( myGroups ); + SMESH::ListOfIDSources_var aList = new SMESH::ListOfIDSources(); + aList->length( myGroups.count() ); + QList::const_iterator anIter = myGroups.begin(); + for ( int i = 0; anIter != myGroups.end(); ++anIter, ++i ) + aList[ i ] = SMESH::SMESH_IDSource::_narrow( *anIter ); + SMESH::ElementType anElemType = getElementType(); - SMESH::SMESH_Group_var aNewGrp = - aMesh->CreateDimGroup( aList, anElemType, aName.toLatin1().constData() ); + SMESH::NB_COMMON_NODES_ENUM aNbCoNodes = + (SMESH::NB_COMMON_NODES_ENUM) myNbNoCombo->currentIndex(); + + SMESH::SMESH_Group_var aNewGrp = + aMesh->CreateDimGroup( aList, anElemType, aName.toLatin1().constData(), + aNbCoNodes, myUnderlOnlyChk->isChecked() ); if ( !CORBA::is_nil( aNewGrp ) ) { aNewGrp->SetColor( getColor() ); @@ -1092,5 +1119,3 @@ void SMESHGUI_DimGroupDlg::onSelectionDone() myListWg->clear(); myListWg->addItems( aNames ); } - - diff --git a/src/SMESHGUI/SMESHGUI_GroupOpDlg.h b/src/SMESHGUI/SMESHGUI_GroupOpDlg.h index 3386c53ca..4acb86821 100644 --- a/src/SMESHGUI/SMESHGUI_GroupOpDlg.h +++ b/src/SMESHGUI/SMESHGUI_GroupOpDlg.h @@ -37,14 +37,15 @@ #include #include CORBA_SERVER_HEADER(SMESH_Group) -class QPushButton; -class QtxColorButton; +class LightApp_SelectionMgr; +class QCheckBox; class QComboBox; -class QListWidget; class QGroupBox; class QLineEdit; +class QListWidget; +class QPushButton; +class QtxColorButton; class SMESHGUI; -class LightApp_SelectionMgr; class SVTK_Selector; /* @@ -235,8 +236,11 @@ protected slots: virtual void onSelectionDone(); private: - QComboBox* myCombo; + QComboBox* myTypeCombo; + QComboBox* myNbNoCombo; QListWidget* myListWg; + QCheckBox* myUnderlOnlyChk; + QList myGroups; }; diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index ca99ab64a..a33acb178 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -1038,7 +1038,7 @@ MEN_UNDERLYING_ELEMS - Group of underlying entities + Group based on nodes of other groups MEN_UPDATE @@ -3398,7 +3398,7 @@ Use Display Entity menu command to show them. STB_UNDERLYING_ELEMS - Create groups of entities from existing groups of superior dimensions + Create groups of entities basing on nodes of other groups STB_UPDATE @@ -4050,7 +4050,7 @@ Use Display Entity menu command to show them. TOP_UNDERLYING_ELEMS - Create groups of entities from existing groups of superior dimensions + Create groups of entities basing on nodes of other groups TOP_UPDATE @@ -4714,7 +4714,7 @@ Please, create VTK viewer and try again CREATE_COMMON_GROUPS - Create common groups for initial meshes + Create groups from input objects MERGE_NODES_AND_ELEMENTS @@ -4722,7 +4722,7 @@ Please, create VTK viewer and try again MESHES - Meshes + Meshes, sub-meshes, groups PROCESSING_IDENTICAL_GROUPS @@ -5810,8 +5810,8 @@ Please specify non-empty name and try again Please specify them and try again - NAME - Name + RESULT + Result OBJECT_1 @@ -5823,7 +5823,7 @@ Please specify them and try again RESULT_NAME - Result name + Group name TOOL_OBJECT @@ -5845,27 +5845,35 @@ Please specify them and try again SMESHGUI_DimGroupDlg CREATE_GROUP_OF_UNDERLYING_ELEMS - Create group of underlying entities + Group based on nodes of other groups ELEMENTS_TYPE Elements type - NODE - Node + UNDERLYING_ENTITIES_ONLY + Include underlying entities only - EDGE - Edge + NUMBER_OF_COMMON_NODES + Number of common nodes - FACE - Face + ALL + All - VOLUME - Volume + MAIN + Main + + + AT_LEAST_ONE + At least one + + + MAJORITY + Majority diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index 0924a5c80..c680de4e6 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -888,18 +888,22 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand if ( Type == "SMESH.FT_ElemGeomType" ) { // set SMESH.GeometryType instead of a numerical Threshold - const int nbTypes = SMESH::Geom_BALL+1; + const int nbTypes = SMESH::Geom_LAST; const char* types[nbTypes] = { "Geom_POINT", "Geom_EDGE", "Geom_TRIANGLE", "Geom_QUADRANGLE", "Geom_POLYGON", "Geom_TETRA", "Geom_PYRAMID", "Geom_HEXA", "Geom_PENTA", "Geom_HEXAGONAL_PRISM", "Geom_POLYHEDRA", "Geom_BALL" }; if ( -1 < iGeom && iGeom < nbTypes ) Threshold = SMESH + types[ iGeom ]; +#ifdef _DEBUG_ + // is types complete? (compilation failure mains that enum GeometryType changed) + int _assert[( sizeof(types) / sizeof(const char*) == nbTypes ) ? 1 : -1 ]; +#endif } if (Type == "SMESH.FT_EntityType") { // set SMESH.EntityType instead of a numerical Threshold - const int nbTypes = SMESH::Entity_Ball+1; + const int nbTypes = SMESH::Entity_Last; const char* types[nbTypes] = { "Entity_Node", "Entity_0D", "Entity_Edge", "Entity_Quad_Edge", "Entity_Triangle", "Entity_Quad_Triangle", "Entity_BiQuad_Triangle", @@ -911,6 +915,10 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand "Entity_Polyhedra", "Entity_Quad_Polyhedra", "Entity_Ball" }; if ( -1 < iGeom && iGeom < nbTypes ) Threshold = SMESH + types[ iGeom ]; +#ifdef _DEBUG_ + // is types complete? (compilation failure mains that enum EntityType changed) + int _assert[( sizeof(types) / sizeof(const char*) == nbTypes ) ? 1 : -1 ]; +#endif } } if ( ThresholdID.Length() != 2 ) // neither '' nor "" diff --git a/src/SMESH_I/SMESH_Filter_i.cxx b/src/SMESH_I/SMESH_Filter_i.cxx index 91a858a62..a0d3c0a15 100644 --- a/src/SMESH_I/SMESH_Filter_i.cxx +++ b/src/SMESH_I/SMESH_Filter_i.cxx @@ -3790,7 +3790,7 @@ string_array* FilterLibrary_i::GetAllNames() static const char** getFunctNames() { - static const char* functName[ SMESH::FT_Undefined + 1 ] = { + static const char* functName[] = { // IT's necessary to update this array according to enum FunctorType (SMESH_Filter.idl) // The order is IMPORTANT !!! "FT_AspectRatio", @@ -3840,6 +3840,13 @@ static const char** getFunctNames() "FT_LogicalAND", "FT_LogicalOR", "FT_Undefined"}; + +#ifdef _DEBUG_ + // check if functName is complete, compilation failure mains that enum FunctorType changed + const int nbFunctors = sizeof(functName) / sizeof(const char*); + int _assert[( nbFunctors == SMESH::FT_Undefined + 1 ) ? 1 : -1 ]; +#endif + return functName; } diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 3b7cc5516..715d6656a 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -2345,10 +2345,11 @@ SMESH_Gen_i::FindGeometryByMeshElement( SMESH::SMESH_Mesh_ptr theMesh, */ //================================================================================ -SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, - CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance) +SMESH::SMESH_Mesh_ptr +SMESH_Gen_i::Concatenate(const SMESH::ListOfIDSources& theMeshesArray, + CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theMergeNodesAndElements, + CORBA::Double theMergeTolerance) throw ( SALOME::SALOME_Exception ) { return ConcatenateCommon(theMeshesArray, @@ -2368,10 +2369,10 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe //================================================================================ SMESH::SMESH_Mesh_ptr -SMESH_Gen_i::ConcatenateWithGroups(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, - CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance) +SMESH_Gen_i::ConcatenateWithGroups(const SMESH::ListOfIDSources& theMeshesArray, + CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theMergeNodesAndElements, + CORBA::Double theMergeTolerance) throw ( SALOME::SALOME_Exception ) { return ConcatenateCommon(theMeshesArray, @@ -2390,14 +2391,13 @@ SMESH_Gen_i::ConcatenateWithGroups(const SMESH::mesh_array& theMeshesArray, //================================================================================ SMESH::SMESH_Mesh_ptr -SMESH_Gen_i::ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, - CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance, - CORBA::Boolean theCommonGroups) +SMESH_Gen_i::ConcatenateCommon(const SMESH::ListOfIDSources& theMeshesArray, + CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theMergeNodesAndElements, + CORBA::Double theMergeTolerance, + CORBA::Boolean theCommonGroups) throw ( SALOME::SALOME_Exception ) { - typedef map TIDsMap; typedef list TListOfNewGroups; typedef map< pair, TListOfNewGroups > TGroupsMap; @@ -2407,304 +2407,262 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, // create mesh SMESH::SMESH_Mesh_var aNewMesh = CreateEmptyMesh(); - SMESHDS_Mesh* aNewMeshDS = 0; - if ( !aNewMesh->_is_nil() ) { - SMESH_Mesh_i* aNewImpl = dynamic_cast( GetServant( aNewMesh ).in() ); - if ( aNewImpl ) { - ::SMESH_Mesh& aLocMesh = aNewImpl->GetImpl(); - aNewMeshDS = aLocMesh.GetMeshDS(); - - TGroupsMap aGroupsMap; - TListOfNewGroups aListOfNewGroups; - ::SMESH_MeshEditor aNewEditor(&aLocMesh); - SMESH::ListOfGroups_var aListOfGroups = new SMESH::ListOfGroups(); - - // loop on meshes - for ( int i = 0; i < theMeshesArray.length(); i++) { - SMESH::SMESH_Mesh_var anInitMesh = theMeshesArray[i]; - if ( !anInitMesh->_is_nil() ) { - SMESH_Mesh_i* anInitImpl = dynamic_cast( GetServant( anInitMesh ).in() ); - if ( anInitImpl ) { - ::SMESH_Mesh& aInitLocMesh = anInitImpl->GetImpl(); - aInitLocMesh.Load(); - SMESHDS_Mesh* anInitMeshDS = aInitLocMesh.GetMeshDS(); - - TIDsMap nodesMap; - TIDsMap elemsMap; - - // loop on elements of mesh - SMDS_ElemIteratorPtr itElems = anInitMeshDS->elementsIterator(); - const SMDS_MeshElement* anElem = 0; - const SMDS_MeshElement* aNewElem = 0; - int anElemNbNodes = 0; - - int anNbNodes = 0; - int anNbEdges = 0; - int anNbFaces = 0; - int anNbVolumes = 0; - int aNbBalls = 0; - - SMESH::long_array_var anIDsNodes = new SMESH::long_array(); - SMESH::long_array_var anIDsEdges = new SMESH::long_array(); - SMESH::long_array_var anIDsFaces = new SMESH::long_array(); - SMESH::long_array_var anIDsVolumes = new SMESH::long_array(); - SMESH::long_array_var anIDsBalls = new SMESH::long_array(); - - if( theCommonGroups ) { - anIDsNodes->length( anInitMeshDS->NbNodes() ); - anIDsEdges->length( anInitMeshDS->NbEdges() ); - anIDsFaces->length( anInitMeshDS->NbFaces() ); - anIDsVolumes->length( anInitMeshDS->NbVolumes() ); - anIDsBalls->length( anInitMeshDS->NbBalls() ); - } + if ( aNewMesh->_is_nil() ) + return aNewMesh._retn(); - for ( int j = 0; itElems->more(); j++) { - anElem = itElems->next(); - SMDSAbs_ElementType anElemType = anElem->GetType(); - anElemNbNodes = anElem->NbNodes(); - std::vector aNodesArray (anElemNbNodes); - - // loop on nodes of element - const SMDS_MeshNode* aNode = 0; - const SMDS_MeshNode* aNewNode = 0; - SMDS_ElemIteratorPtr itNodes = anElem->nodesIterator(); - - for ( int k = 0; itNodes->more(); k++) { - aNode = static_cast(itNodes->next()); - if ( nodesMap.find(aNode->GetID()) == nodesMap.end() ) { - aNewNode = aNewMeshDS->AddNode(aNode->X(), aNode->Y(), aNode->Z()); - nodesMap.insert( make_pair(aNode->GetID(), aNewNode->GetID()) ); - if( theCommonGroups ) - anIDsNodes[anNbNodes++] = aNewNode->GetID(); - } - else - aNewNode = aNewMeshDS->FindNode( nodesMap.find(aNode->GetID())->second ); - aNodesArray[k] = aNewNode; - }//nodes loop - - // creates a corresponding element on existent nodes in new mesh - switch ( anElem->GetEntityType() ) { - case SMDSEntity_Polyhedra: - if ( const SMDS_VtkVolume* aVolume = - dynamic_cast (anElem)) - { - aNewElem = aNewMeshDS->AddPolyhedralVolume(aNodesArray, - aVolume->GetQuantities()); - elemsMap.insert(make_pair(anElem->GetID(), aNewElem->GetID())); - if( theCommonGroups ) - anIDsVolumes[anNbVolumes++] = aNewElem->GetID(); - } - break; - case SMDSEntity_Ball: - if ( const SMDS_BallElement* aBall = - dynamic_cast (anElem)) - { - aNewElem = aNewEditor.AddElement(aNodesArray, SMDSAbs_Ball, - /*isPoly=*/false, /*id=*/0, - aBall->GetDiameter() ); - elemsMap.insert(make_pair(anElem->GetID(), aNewElem->GetID())); - if( theCommonGroups ) - anIDsBalls[aNbBalls++] = aNewElem->GetID(); - } - break; - default: - { - aNewElem = aNewEditor.AddElement(aNodesArray, - anElemType, - anElem->IsPoly()); - elemsMap.insert(make_pair(anElem->GetID(), aNewElem->GetID())); - if( theCommonGroups ) { - if( anElemType == SMDSAbs_Edge ) - anIDsEdges[anNbEdges++] = aNewElem->GetID(); - else if( anElemType == SMDSAbs_Face ) - anIDsFaces[anNbFaces++] = aNewElem->GetID(); - else if( anElemType == SMDSAbs_Volume ) - anIDsVolumes[anNbVolumes++] = aNewElem->GetID(); - } - } - } - } //elems loop + SMESH_Mesh_i* aNewImpl = SMESH::DownCast( aNewMesh ); + if ( !aNewImpl ) + return aNewMesh._retn(); - aNewEditor.CrearLastCreated(); // forget the history + ::SMESH_Mesh& aLocMesh = aNewImpl->GetImpl(); + SMESHDS_Mesh* aNewMeshDS = aLocMesh.GetMeshDS(); - // copy orphan nodes - SMDS_NodeIteratorPtr itNodes = anInitMeshDS->nodesIterator(); - while ( itNodes->more() ) - { - const SMDS_MeshNode* aNode = itNodes->next(); - if ( aNode->NbInverseElements() == 0 ) - { - const SMDS_MeshNode* aNewNode = - aNewMeshDS->AddNode(aNode->X(), aNode->Y(), aNode->Z()); - nodesMap.insert( make_pair(aNode->GetID(), aNewNode->GetID()) ); - if( theCommonGroups ) - anIDsNodes[anNbNodes++] = aNewNode->GetID(); - } - } + TGroupsMap aGroupsMap; + TListOfNewGroups aListOfNewGroups; + ::SMESH_MeshEditor aNewEditor(&aLocMesh); + SMESH::ListOfGroups_var aListOfGroups; + std::vector aNodesArray; - aListOfGroups = anInitImpl->GetGroups(); - SMESH::SMESH_GroupBase_ptr aGroup; + // loop on sub-meshes + for ( int i = 0; i < theMeshesArray.length(); i++) + { + SMESH::SMESH_Mesh_var anInitMesh = theMeshesArray[i]->GetMesh(); + if ( anInitMesh->_is_nil() ) continue; + SMESH_Mesh_i* anInitImpl = SMESH::DownCast( anInitMesh ); + if ( !anInitImpl ) continue; + anInitImpl->Load(); + + ::SMESH_Mesh& aInitLocMesh = anInitImpl->GetImpl(); + SMESHDS_Mesh* anInitMeshDS = aInitLocMesh.GetMeshDS(); + + // remember nb of elements before filling in + SMESH::long_array_var prevState = aNewMesh->GetNbElementsByType(); + + typedef std::map TEEMap; + TEEMap elemsMap, nodesMap; + + // loop on elements of a sub-mesh + SMDS_ElemIteratorPtr itElems = anInitImpl->GetElements( theMeshesArray[i], SMESH::ALL ); + const SMDS_MeshElement* anElem; + const SMDS_MeshElement* aNewElem; + const SMDS_MeshNode* aNode; + const SMDS_MeshNode* aNewNode; + int anElemNbNodes; + + while ( itElems->more() ) + { + anElem = itElems->next(); + anElemNbNodes = anElem->NbNodes(); + aNodesArray.resize( anElemNbNodes ); - // loop on groups of mesh - SMESH::long_array_var anInitIDs = new SMESH::long_array(); - SMESH::long_array_var anNewIDs = new SMESH::long_array(); - SMESH::SMESH_Group_var aNewGroup; + // loop on nodes of an element + SMDS_ElemIteratorPtr itNodes = anElem->nodesIterator(); + for ( int k = 0; itNodes->more(); k++) + { + aNode = static_cast( itNodes->next() ); + TEEMap::iterator n2nnIt = nodesMap.find( aNode ); + if ( n2nnIt == nodesMap.end() ) + { + aNewNode = aNewMeshDS->AddNode(aNode->X(), aNode->Y(), aNode->Z()); + nodesMap.insert( make_pair( aNode, aNewNode )); + } + else + { + aNewNode = static_cast( n2nnIt->second ); + } + aNodesArray[k] = aNewNode; + } - SMESH::ElementType aGroupType; - CORBA::String_var aGroupName; - if ( theCommonGroups ) { - for(aGroupType=SMESH::NODE;aGroupType<=SMESH::BALL;aGroupType=(SMESH::ElementType)(aGroupType+1)) { - string str = "Gr"; - SALOMEDS::SObject_wrap aMeshSObj = ObjectToSObject( myCurrentStudy, anInitMesh ); - if(aMeshSObj) - str += aMeshSObj->GetName(); - str += "_"; + // creates a corresponding element on existent nodes in new mesh + aNewElem = 0; + switch ( anElem->GetEntityType() ) + { + case SMDSEntity_Polyhedra: + if ( const SMDS_VtkVolume* aVolume = + dynamic_cast (anElem)) + { + aNewElem = aNewMeshDS->AddPolyhedralVolume( aNodesArray, + aVolume->GetQuantities() ); + } + break; + case SMDSEntity_Ball: + if ( const SMDS_BallElement* aBall = + dynamic_cast (anElem)) + { + aNewElem = aNewEditor.AddElement( aNodesArray, SMDSAbs_Ball, + /*isPoly=*/false, /*id=*/0, + aBall->GetDiameter() ); + } + break; + case SMDSEntity_Node: + break; + default: + aNewElem = aNewEditor.AddElement( aNodesArray, anElem->GetType(), anElem->IsPoly() ); + } + if ( aNewElem ) + elemsMap.insert( make_pair( anElem, aNewElem )); - int anLen = 0; + } //elems loop - switch(aGroupType) { - case SMESH::NODE: - str += "Nodes"; - anIDsNodes->length(anNbNodes); - anLen = anNbNodes; - break; - case SMESH::EDGE: - str += "Edges"; - anIDsEdges->length(anNbEdges); - anLen = anNbEdges; - break; - case SMESH::FACE: - str += "Faces"; - anIDsFaces->length(anNbFaces); - anLen = anNbFaces; - break; - case SMESH::VOLUME: - str += "Volumes"; - anIDsVolumes->length(anNbVolumes); - anLen = anNbVolumes; - break; - case SMESH::BALL: - str += "Balls"; - anIDsBalls->length(aNbBalls); - anLen = aNbBalls; - break; - default: - break; - } + aNewEditor.ClearLastCreated(); // forget the history - if(anLen) { - aGroupName = str.c_str(); - // add a new group in the mesh - aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName); + // create groups of just added elements + SMESH::SMESH_Group_var aNewGroup; + SMESH::ElementType aGroupType; + if ( theCommonGroups ) + { + SMESH::long_array_var curState = aNewMesh->GetNbElementsByType(); - switch(aGroupType) { - case SMESH::NODE: - aNewGroup->Add( anIDsNodes ); - break; - case SMESH::EDGE: - aNewGroup->Add( anIDsEdges ); - break; - case SMESH::FACE: - aNewGroup->Add( anIDsFaces ); - break; - case SMESH::VOLUME: - aNewGroup->Add( anIDsVolumes ); - break; - case SMESH::BALL: - aNewGroup->Add( anIDsBalls ); - break; - default: - break; - } + for( aGroupType = SMESH::NODE; + aGroupType < SMESH::NB_ELEMENT_TYPES; + aGroupType = (SMESH::ElementType)( aGroupType + 1 )) + { + if ( curState[ aGroupType ] <= prevState[ aGroupType ]) + continue; - aListOfNewGroups.clear(); - aListOfNewGroups.push_back(aNewGroup); - aGroupsMap.insert(make_pair( make_pair(aGroupName, aGroupType), aListOfNewGroups )); - } + // make a group name + const char* typeNames[] = { "All","Nodes","Edges","Faces","Volumes","0DElems","Balls" }; + { // check of typeNames, compilation failure mains that NB_ELEMENT_TYPES changed: + const int nbNames = sizeof(typeNames) / sizeof(const char*); + int _assert[( nbNames == SMESH::NB_ELEMENT_TYPES ) ? 1 : -1 ]; + } + string groupName = "Gr"; + SALOMEDS::SObject_wrap aMeshSObj = ObjectToSObject( myCurrentStudy, theMeshesArray[i] ); + if ( aMeshSObj ) { + CORBA::String_var name = aMeshSObj->GetName(); + groupName += name; + } + groupName += "_"; + groupName += typeNames[ aGroupType ]; + + // make and fill a group + TEEMap & e2neMap = ( aGroupType == SMESH::NODE ) ? nodesMap : elemsMap; + aNewGroup = aNewImpl->CreateGroup( aGroupType, groupName.c_str() ); + if ( SMESH_Group_i* grp_i = SMESH::DownCast( aNewGroup )) + { + if ( SMESHDS_Group* grpDS = dynamic_cast( grp_i->GetGroupDS() )) + { + TEEMap::iterator e2neIt = e2neMap.begin(); + for ( ; e2neIt != e2neMap.end(); ++e2neIt ) + { + aNewElem = e2neIt->second; + if ( aNewElem->GetType() == grpDS->GetType() ) + { + grpDS->Add( aNewElem ); + + if ( prevState[ aGroupType ]++ >= curState[ aGroupType ] ) + break; } } + } + } + aListOfNewGroups.clear(); + aListOfNewGroups.push_back(aNewGroup); + aGroupsMap.insert(make_pair( make_pair(groupName, aGroupType), aListOfNewGroups )); + } + } - // check that current group name and type don't have identical ones in union mesh - for (int iG = 0; iG < aListOfGroups->length(); iG++) { - aGroup = aListOfGroups[iG]; - aListOfNewGroups.clear(); - aGroupType = aGroup->GetType(); - aGroupName = aGroup->GetName(); - - TGroupsMap::iterator anIter = aGroupsMap.find(make_pair(aGroupName, aGroupType)); - - // convert a list of IDs - anInitIDs = aGroup->GetListOfID(); - anNewIDs->length(anInitIDs->length()); - if ( aGroupType == SMESH::NODE ) - for (int j = 0; j < anInitIDs->length(); j++) { - anNewIDs[j] = nodesMap.find(anInitIDs[j])->second; - } - else - for (int j = 0; j < anInitIDs->length(); j++) { - anNewIDs[j] = elemsMap.find(anInitIDs[j])->second; - } + if ( SMESH_Mesh_i* anSrcImpl = SMESH::DownCast( theMeshesArray[i] )) + { + // copy orphan nodes + if ( anSrcImpl->NbNodes() > nodesMap.size() ) + { + SMDS_ElemIteratorPtr itNodes = anInitImpl->GetElements( theMeshesArray[i], SMESH::NODE ); + while ( itNodes->more() ) + { + const SMDS_MeshNode* aNode = static_cast< const SMDS_MeshNode* >( itNodes->next() ); + if ( aNode->NbInverseElements() == 0 ) + { + aNewNode = aNewMeshDS->AddNode(aNode->X(), aNode->Y(), aNode->Z()); + nodesMap.insert( make_pair( aNode, aNewNode )); + } + } + } - // check that current group name and type don't have identical ones in union mesh - if ( anIter == aGroupsMap.end() ) { - // add a new group in the mesh - aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName); - // add elements into new group - aNewGroup->Add( anNewIDs ); + // copy groups - aListOfNewGroups.push_back(aNewGroup); - aGroupsMap.insert(make_pair( make_pair(aGroupName, aGroupType), aListOfNewGroups )); - } + SMESH::SMESH_GroupBase_ptr aGroup; + CORBA::String_var aGroupName; + SMESH::long_array_var anNewIDs = new SMESH::long_array(); - else if ( theUniteIdenticalGroups ) { - // unite identical groups - TListOfNewGroups& aNewGroups = anIter->second; - aNewGroups.front()->Add( anNewIDs ); - } + // loop on groups of a source mesh + aListOfGroups = anSrcImpl->GetGroups(); + for (int iG = 0; iG < aListOfGroups->length(); iG++) + { + aGroup = aListOfGroups[iG]; + aGroupType = aGroup->GetType(); + aGroupName = aGroup->GetName(); + + // convert a list of IDs + anNewIDs->length( aGroup->Size() ); + TEEMap & e2neMap = ( aGroupType == SMESH::NODE ) ? nodesMap : elemsMap; + SMDS_ElemIteratorPtr itGrElems = anSrcImpl->GetElements( aGroup, SMESH::ALL ); + int iElem = 0; + while ( itGrElems->more() ) + { + anElem = itGrElems->next(); + TEEMap::iterator e2neIt = e2neMap.find( anElem ); + if ( e2neIt != e2neMap.end() ) + anNewIDs[ iElem++ ] = e2neIt->second->GetID(); + } + anNewIDs->length( iElem ); + + // check a current group name and type don't have identical ones in final mesh + aListOfNewGroups.clear(); + TGroupsMap::iterator anIter = aGroupsMap.find( make_pair( aGroupName, aGroupType )); + if ( anIter == aGroupsMap.end() ) { + // add a new group in the mesh + aNewGroup = aNewImpl->CreateGroup( aGroupType, aGroupName ); + // add elements into new group + aNewGroup->Add( anNewIDs ); + + aListOfNewGroups.push_back(aNewGroup); + aGroupsMap.insert(make_pair( make_pair(aGroupName, aGroupType), aListOfNewGroups )); + } - else { - // rename identical groups - aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName); - aNewGroup->Add( anNewIDs ); + else if ( theUniteIdenticalGroups ) { + // unite identical groups + TListOfNewGroups& aNewGroups = anIter->second; + aNewGroups.front()->Add( anNewIDs ); + } - TListOfNewGroups& aNewGroups = anIter->second; - string aNewGroupName; - if (aNewGroups.size() == 1) { - aNewGroupName = string(aGroupName) + "_1"; - aNewGroups.front()->SetName(aNewGroupName.c_str()); - } - char aGroupNum[128]; - sprintf(aGroupNum, "%u", aNewGroups.size()+1); - aNewGroupName = string(aGroupName) + "_" + string(aGroupNum); - aNewGroup->SetName(aNewGroupName.c_str()); - aNewGroups.push_back(aNewGroup); - } - }//groups loop + else { + // rename identical groups + aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName); + aNewGroup->Add( anNewIDs ); + + TListOfNewGroups& aNewGroups = anIter->second; + string aNewGroupName; + if (aNewGroups.size() == 1) { + aNewGroupName = string(aGroupName) + "_1"; + aNewGroups.front()->SetName(aNewGroupName.c_str()); } + char aGroupNum[128]; + sprintf(aGroupNum, "%u", aNewGroups.size()+1); + aNewGroupName = string(aGroupName) + "_" + string(aGroupNum); + aNewGroup->SetName(aNewGroupName.c_str()); + aNewGroups.push_back(aNewGroup); } - }//meshes loop - - if (theMergeNodesAndElements) { - // merge nodes - TIDSortedNodeSet aMeshNodes; // no input nodes - SMESH_MeshEditor::TListOfListOfNodes aGroupsOfNodes; - aNewEditor.FindCoincidentNodes( aMeshNodes, theMergeTolerance, aGroupsOfNodes ); - aNewEditor.MergeNodes( aGroupsOfNodes ); - // merge elements - aNewEditor.MergeEqualElements(); - } - } + } //groups loop + } // if an IDSource is a mesh + } //meshes loop + + if (theMergeNodesAndElements) { + // merge nodes + TIDSortedNodeSet aMeshNodes; // no input nodes + SMESH_MeshEditor::TListOfListOfNodes aGroupsOfNodes; + aNewEditor.FindCoincidentNodes( aMeshNodes, theMergeTolerance, aGroupsOfNodes ); + aNewEditor.MergeNodes( aGroupsOfNodes ); + // merge elements + aNewEditor.MergeEqualElements(); } // Update Python script - aPythonDump << aNewMesh << " = " << this; - if( !theCommonGroups ) - aPythonDump << ".Concatenate("; - else - aPythonDump << ".ConcatenateWithGroups("; - aPythonDump << "["; + aPythonDump << aNewMesh << " = " << this << "." + << ( theCommonGroups ? "ConcatenateWithGroups" : "Concatenate" ) + << "(["; for ( int i = 0; i < theMeshesArray.length(); i++) { if (i > 0) aPythonDump << ", "; aPythonDump << theMeshesArray[i]; @@ -2728,6 +2686,7 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, if (aNewMeshDS) aNewMeshDS->Modified(); + return aNewMesh._retn(); } diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index e95895df1..1c33f73e5 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -356,26 +356,26 @@ public: throw ( SALOME::SALOME_Exception ); // Concatenate the given meshes into one mesh - SMESH::SMESH_Mesh_ptr ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, - CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance, - CORBA::Boolean theCommonGroups) + SMESH::SMESH_Mesh_ptr ConcatenateCommon(const SMESH::ListOfIDSources& meshesArray, + CORBA::Boolean uniteIdenticalGroups, + CORBA::Boolean mergeNodesAndElements, + CORBA::Double mergeTolerance, + CORBA::Boolean commonGroups) throw ( SALOME::SALOME_Exception ); // Concatenate the given meshes into one mesh - SMESH::SMESH_Mesh_ptr Concatenate(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, - CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance) + SMESH::SMESH_Mesh_ptr Concatenate(const SMESH::ListOfIDSources& meshesArray, + CORBA::Boolean uniteIdenticalGroups, + CORBA::Boolean mergeNodesAndElements, + CORBA::Double mergeTolerance) throw ( SALOME::SALOME_Exception ); // Concatenate the given meshes into one mesh // Create the groups of all elements from initial meshes - SMESH::SMESH_Mesh_ptr ConcatenateWithGroups(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, - CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance) + SMESH::SMESH_Mesh_ptr ConcatenateWithGroups(const SMESH::ListOfIDSources& meshesArray, + CORBA::Boolean uniteIdenticalGroups, + CORBA::Boolean mergeNodesAndElements, + CORBA::Double mergeTolerance) throw ( SALOME::SALOME_Exception ); // Get MED version of the file by its name diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index 534580ccb..ba4962656 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -513,7 +513,7 @@ void SMESH_MeshEditor_i::initData(bool deleteSearchers) TSearchersDeleter::Delete(); } getEditor().GetError().reset(); - getEditor().CrearLastCreated(); + getEditor().ClearLastCreated(); } //================================================================================ @@ -712,7 +712,7 @@ SMESH::long_array* SMESH_MeshEditor_i::GetLastCreatedElems() void SMESH_MeshEditor_i::ClearLastCreated() throw (SALOME::SALOME_Exception) { SMESH_TRY; - getEditor().CrearLastCreated(); + getEditor().ClearLastCreated(); SMESH_CATCH( SMESH::throwCorbaException ); } diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index 5669a0b22..0e1a130f1 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -1568,25 +1568,52 @@ SMESH_Mesh_i::CutListOfGroups(const SMESH::ListOfGroups& theMainGroups, return aResGrp._retn(); } +namespace // functions making checks according to SMESH::NB_COMMON_NODES_ENUM +{ + bool isAllNodesCommon(int nbChecked, int nbCommon, int nbNodes, int nbCorners, + bool & toStopChecking ) + { + toStopChecking = ( nbCommon < nbChecked ); + return nbCommon == nbNodes; + } + bool isMainNodesCommon(int nbChecked, int nbCommon, int nbNodes, int nbCorners, + bool & toStopChecking ) + { + toStopChecking = ( nbCommon < nbChecked || nbChecked >= nbCorners ); + return nbCommon == nbCorners; + } + bool isAtLeastOneNodeCommon(int nbChecked, int nbCommon, int nbNodes, int nbCorners, + bool & toStopChecking ) + { + return nbCommon > 0; + } + bool isMajorityOfNodesCommon(int nbChecked, int nbCommon, int nbNodes, int nbCorners, + bool & toStopChecking ) + { + return nbCommon >= nbNodes / 2; + } +} + //============================================================================= /*! - \brief Create groups of entities from existing groups of superior dimensions - System - 1) extract all nodes from each group, - 2) combine all elements of specified dimension laying on these nodes. - \param theGroups list of source groups - \param theElemType dimension of elements - \param theName name of new group - \return pointer on new group - * - IMP 19939 + * Create a group of entities basing on nodes of other groups. + * \param [in] theGroups - list of either groups, sub-meshes or filters. + * \param [in] anElemType - a type of elements to include to the new group. + * \param [in] theName - a name of the new group. + * \param [in] theNbCommonNodes - criterion of inclusion of an element to the new group. + * \param [in] theUnderlyingOnly - if \c True, an element is included to the + * new group provided that it is based on nodes of an element of \a aListOfGroups + * \return SMESH_Group - the created group */ +// IMP 19939, bug 22010, IMP 22635 //============================================================================= SMESH::SMESH_Group_ptr -SMESH_Mesh_i::CreateDimGroup(const SMESH::ListOfGroups& theGroups, - SMESH::ElementType theElemType, - const char* theName ) +SMESH_Mesh_i::CreateDimGroup(const SMESH::ListOfIDSources& theGroups, + SMESH::ElementType theElemType, + const char* theName, + SMESH::NB_COMMON_NODES_ENUM theNbCommonNodes, + CORBA::Boolean theUnderlyingOnly) throw (SALOME::SALOME_Exception) { SMESH::SMESH_Group_var aResGrp; @@ -1602,6 +1629,17 @@ SMESH_Mesh_i::CreateDimGroup(const SMESH::ListOfGroups& theGroups, SMDSAbs_ElementType anElemType = (SMDSAbs_ElementType)theElemType; + bool (*isToInclude)(int nbChecked, int nbCommon, int nbNodes, int nbCorners, bool & toStop); + SMESH_Comment nbCoNoStr( "SMESH."); + switch ( theNbCommonNodes ) { + case SMESH::ALL_NODES : isToInclude = isAllNodesCommon; nbCoNoStr<<"ALL_NODES" ;break; + case SMESH::MAIN : isToInclude = isMainNodesCommon; nbCoNoStr<<"MAIN" ;break; + case SMESH::AT_LEAST_ONE: isToInclude = isAtLeastOneNodeCommon; nbCoNoStr<<"AT_LEAST_ONE";break; + case SMESH::MAJORITY : isToInclude = isMajorityOfNodesCommon; nbCoNoStr<<"MAJORITY" ;break; + default: return aResGrp._retn(); + } + int nbChecked, nbCommon, nbNodes, nbCorners; + // Create a group TPythonDump pyDump; @@ -1614,14 +1652,19 @@ SMESH_Mesh_i::CreateDimGroup(const SMESH::ListOfGroups& theGroups, SMESH::DownCast( aResGrp )->GetGroupDS(); SMDS_MeshGroup& resGroupCore = static_cast< SMESHDS_Group* >( groupBaseDS )->SMDSGroup(); + vector isNodeInGroups; + for ( int g = 0, n = theGroups.length(); g < n; g++ ) // loop on theGroups { - SMESH::SMESH_GroupBase_var aGrp = theGroups[ g ]; + SMESH::SMESH_IDSource_var aGrp = theGroups[ g ]; if ( CORBA::is_nil( aGrp ) ) continue; + SMESH::SMESH_Mesh_var mesh = aGrp->GetMesh(); + if ( mesh->_is_nil() || mesh->GetId() != this->GetId() ) + continue; - groupBaseDS = SMESH::DownCast( aGrp )->GetGroupDS(); - SMDS_ElemIteratorPtr elIt = groupBaseDS->GetElements(); + SMDS_ElemIteratorPtr elIt = GetElements( aGrp, SMESH::ALL ); + if ( !elIt ) continue; if ( theElemType == SMESH::NODE ) // get all nodes of elements { @@ -1632,30 +1675,93 @@ SMESH_Mesh_i::CreateDimGroup(const SMESH::ListOfGroups& theGroups, resGroupCore.Add( nIt->next() ); } } - else // get elements of theElemType based on nodes of every element of group + // get elements of theElemType based on nodes of every element of group + else if ( theUnderlyingOnly ) { while ( elIt->more() ) { - const SMDS_MeshElement* el = elIt->next(); // an element of group + const SMDS_MeshElement* el = elIt->next(); // an element of ref group TIDSortedElemSet elNodes( el->begin_nodes(), el->end_nodes() ); TIDSortedElemSet checkedElems; - SMDS_ElemIteratorPtr nIt = el->nodesIterator(); + SMDS_NodeIteratorPtr nIt = el->nodeIterator(); while ( nIt->more() ) { - const SMDS_MeshNode* n = static_cast( nIt->next() ); + const SMDS_MeshNode* n = nIt->next(); SMDS_ElemIteratorPtr elOfTypeIt = n->GetInverseElementIterator( anElemType ); // check nodes of elements of theElemType around el while ( elOfTypeIt->more() ) { const SMDS_MeshElement* elOfType = elOfTypeIt->next(); if ( !checkedElems.insert( elOfType ).second ) continue; - + nbNodes = elOfType->NbNodes(); + nbCorners = elOfType->NbCornerNodes(); + nbCommon = 0; + bool toStopChecking = false; SMDS_ElemIteratorPtr nIt2 = elOfType->nodesIterator(); - bool allNodesOK = true; - while ( nIt2->more() && allNodesOK ) - allNodesOK = elNodes.count( nIt2->next() ); - if ( allNodesOK ) - resGroupCore.Add( elOfType ); + for ( nbChecked = 1; nIt2->more() && !toStopChecking; ++nbChecked ) + if ( elNodes.count( nIt2->next() ) && + isToInclude( nbChecked, ++nbCommon, nbNodes, nbCorners, toStopChecking )) + { + resGroupCore.Add( elOfType ); + break; + } + } + } + } + } + // get all nodes of elements of groups + else + { + while ( elIt->more() ) + { + const SMDS_MeshElement* el = elIt->next(); // an element of group + SMDS_NodeIteratorPtr nIt = el->nodeIterator(); + while ( nIt->more() ) + { + const SMDS_MeshNode* n = nIt->next(); + if ( n->GetID() >= isNodeInGroups.size() ) + isNodeInGroups.resize( n->GetID() + 1, false ); + isNodeInGroups[ n->GetID() ] = true; + } + } + } + } + + // Get elements of theElemType based on a certain number of nodes of elements of groups + if ( !theUnderlyingOnly && !isNodeInGroups.empty() ) + { + const SMDS_MeshNode* n; + vector isElemChecked( aMeshDS->MaxElementID() + 1 ); + const int isNodeInGroupsSize = isNodeInGroups.size(); + for ( int iN = 0; iN < isNodeInGroupsSize; ++iN ) + { + if ( !isNodeInGroups[ iN ] || + !( n = aMeshDS->FindNode( iN ))) + continue; + + // check nodes of elements of theElemType around n + SMDS_ElemIteratorPtr elOfTypeIt = n->GetInverseElementIterator( anElemType ); + while ( elOfTypeIt->more() ) + { + const SMDS_MeshElement* elOfType = elOfTypeIt->next(); + vector::reference isChecked = isElemChecked[ elOfType->GetID() ]; + if ( isChecked ) + continue; + isChecked = true; + + nbNodes = elOfType->NbNodes(); + nbCorners = elOfType->NbCornerNodes(); + nbCommon = 0; + bool toStopChecking = false; + SMDS_ElemIteratorPtr nIt = elOfType->nodesIterator(); + for ( nbChecked = 1; nIt->more() && !toStopChecking; ++nbChecked ) + { + const int nID = nIt->next()->GetID(); + if ( nID < isNodeInGroupsSize && isNodeInGroups[ nID ] && + isToInclude( nbChecked, ++nbCommon, nbNodes, nbCorners, toStopChecking )) + { + resGroupCore.Add( elOfType ); + break; } } } @@ -1665,7 +1771,8 @@ SMESH_Mesh_i::CreateDimGroup(const SMESH::ListOfGroups& theGroups, // Update Python script pyDump << aResGrp << " = " << SMESH::SMESH_Mesh_var( _this()) << ".CreateDimGroup( " - << theGroups << ", " << theElemType << ", '" << theName << "' )"; + << theGroups << ", " << theElemType << ", '" << theName << "', " + << nbCoNoStr << ", " << theUnderlyingOnly << ")"; SMESH_CATCH( SMESH::throwCorbaException ); @@ -5168,7 +5275,7 @@ namespace /* Iterators used in SMESH_Mesh_i::GetElements(SMESH::SMESH_IDSource_v _elem = _mesh->FindNode( *_idPtr++ ); } else if ((_elem = _mesh->FindElement( *_idPtr++ )) && - _elem->GetType() != _type ) + (_elem->GetType() != _type && _type != SMDSAbs_All )) { _elem = 0; } @@ -5248,7 +5355,7 @@ SMDS_ElemIteratorPtr SMESH_Mesh_i::GetElements(SMESH::SMESH_IDSource_ptr theObje if ( sm ) { elemIt = sm->GetElements(); - if ( elemType != SMDSAbs_Node ) + if ( elemType != SMDSAbs_Node && elemType != SMDSAbs_All ) { typeOK = ( elemIt && elemIt->more() && elemIt->next()->GetType() == elemType ); elemIt = typeOK ? sm->GetElements() : SMDS_ElemIteratorPtr(); @@ -5258,15 +5365,19 @@ SMDS_ElemIteratorPtr SMESH_Mesh_i::GetElements(SMESH::SMESH_IDSource_ptr theObje else if ( SMESH_GroupBase_i* group_i = SMESH::DownCast( theObject )) { SMESHDS_GroupBase* groupDS = group_i->GetGroupDS(); - if ( groupDS && ( groupDS->GetType() == elemType || elemType == SMDSAbs_Node )) + if ( groupDS && ( elemType == groupDS->GetType() || + elemType == SMDSAbs_Node || + elemType == SMDSAbs_All )) { elemIt = groupDS->GetElements(); - typeOK = ( groupDS->GetType() == elemType ); + typeOK = ( groupDS->GetType() == elemType || elemType == SMDSAbs_All ); } } else if ( SMESH::Filter_i* filter_i = SMESH::DownCast( theObject )) { - if ( filter_i->GetElementType() == theType || elemType == SMDSAbs_Node ) + if ( filter_i->GetElementType() == theType || + elemType == SMDSAbs_Node || + elemType == SMDSAbs_All) { SMESH::Predicate_i* pred_i = filter_i->GetPredicate_i(); if ( pred_i && pred_i->GetPredicate() ) @@ -5274,7 +5385,7 @@ SMDS_ElemIteratorPtr SMESH_Mesh_i::GetElements(SMESH::SMESH_IDSource_ptr theObje SMDSAbs_ElementType filterType = SMDSAbs_ElementType( filter_i->GetElementType() ); SMDS_ElemIteratorPtr allElemIt = meshDS->elementsIterator( filterType ); elemIt = SMDS_ElemIteratorPtr( new PredicateIterator( allElemIt, pred_i->GetPredicate() )); - typeOK = ( filterType == elemType ); + typeOK = ( filterType == elemType || elemType == SMDSAbs_All ); } } } @@ -5282,7 +5393,7 @@ SMDS_ElemIteratorPtr SMESH_Mesh_i::GetElements(SMESH::SMESH_IDSource_ptr theObje { SMESH::array_of_ElementType_var types = theObject->GetTypes(); const bool isNodes = ( types->length() == 1 && types[0] == SMESH::NODE ); - if ( isNodes && elemType != SMDSAbs_Node ) + if ( isNodes && elemType != SMDSAbs_Node && elemType != SMDSAbs_All ) return elemIt; if ( SMESH_MeshEditor_i::IsTemporaryIDSource( theObject )) { @@ -5295,7 +5406,7 @@ SMDS_ElemIteratorPtr SMESH_Mesh_i::GetElements(SMESH::SMESH_IDSource_ptr theObje SMESH::long_array_var ids = theObject->GetIDs(); elemIt = SMDS_ElemIteratorPtr( new IDSourceIterator( meshDS, ids._retn(), elemType )); } - typeOK = ( isNodes == ( elemType == SMDSAbs_Node )); + typeOK = ( isNodes == ( elemType == SMDSAbs_Node )) || ( elemType == SMDSAbs_All ); } if ( elemIt && elemIt->more() && !typeOK ) diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index 987f80ff1..45d01b10e 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -160,9 +160,11 @@ public: const char* theName ) throw (SALOME::SALOME_Exception); - SMESH::SMESH_Group_ptr CreateDimGroup( const SMESH::ListOfGroups& theGroups, - SMESH::ElementType theElemType, - const char* theName ) + SMESH::SMESH_Group_ptr CreateDimGroup( const SMESH::ListOfIDSources& theGroups, + SMESH::ElementType theElemType, + const char* theName, + SMESH::NB_COMMON_NODES_ENUM theNbCommonNodes, + CORBA::Boolean theUnderlyingOnly ) throw (SALOME::SALOME_Exception); diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py index b4f79d735..9e4386da5 100644 --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -604,7 +604,7 @@ class smeshBuilder(object, SMESH._objref_SMESH_Gen): ## Concatenate the given meshes into one mesh. All groups of input meshes will be # present in the new mesh. - # @param meshes the meshes to combine into one mesh + # @param meshes the meshes, sub-meshes and groups to combine into one mesh # @param uniteIdenticalGroups if true, groups with same names are united, else they are renamed # @param mergeNodesAndElements if true, equal nodes and elements are merged # @param mergeTolerance tolerance for merging nodes @@ -738,7 +738,9 @@ class smeshBuilder(object, SMESH._objref_SMESH_Gen): if not name: name = "%s_%s"%(aThreshold.GetShapeType(), id(aThreshold)%10000) aCriterion.ThresholdID = self.geompyD.addToStudy( aThreshold, name ) - #raise RuntimeError, "Threshold shape must be published" + # or a name of GEOM object + elif isinstance( aThreshold, str ): + aCriterion.ThresholdStr = aThreshold else: print "Error: The Threshold should be a shape." return None @@ -1960,7 +1962,8 @@ class Mesh: def RemoveGroupWithContents(self, group): self.mesh.RemoveGroupWithContents(group) - ## Gets the list of groups existing in the mesh in the order of creation (starting from the oldest one) + ## Gets the list of groups existing in the mesh in the order + # of creation (starting from the oldest one) # @return a sequence of SMESH_GroupBase # @ingroup l2_grps_create def GetGroups(self): @@ -1982,7 +1985,7 @@ class Mesh: names.append(group.GetName()) return names - ## Produces a union of two groups + ## Produces a union of two groups. # A new group is created. All mesh elements that are # present in the initial groups are added to the new one # @return an instance of SMESH_Group @@ -1990,7 +1993,7 @@ class Mesh: def UnionGroups(self, group1, group2, name): return self.mesh.UnionGroups(group1, group2, name) - ## Produces a union list of groups + ## Produces a union list of groups. # New group is created. All mesh elements that are present in # initial groups are added to the new one # @return an instance of SMESH_Group @@ -1998,7 +2001,7 @@ class Mesh: def UnionListOfGroups(self, groups, name): return self.mesh.UnionListOfGroups(groups, name) - ## Prodices an intersection of two groups + ## Prodices an intersection of two groups. # A new group is created. All mesh elements that are common # for the two initial groups are added to the new one. # @return an instance of SMESH_Group @@ -2006,7 +2009,7 @@ class Mesh: def IntersectGroups(self, group1, group2, name): return self.mesh.IntersectGroups(group1, group2, name) - ## Produces an intersection of groups + ## Produces an intersection of groups. # New group is created. All mesh elements that are present in all # initial groups simultaneously are added to the new one # @return an instance of SMESH_Group @@ -2014,7 +2017,7 @@ class Mesh: def IntersectListOfGroups(self, groups, name): return self.mesh.IntersectListOfGroups(groups, name) - ## Produces a cut of two groups + ## Produces a cut of two groups. # A new group is created. All mesh elements that are present in # the main group but are not present in the tool group are added to the new one # @return an instance of SMESH_Group @@ -2022,22 +2025,35 @@ class Mesh: def CutGroups(self, main_group, tool_group, name): return self.mesh.CutGroups(main_group, tool_group, name) - ## Produces a cut of groups + ## Produces a cut of groups. # A new group is created. All mesh elements that are present in main groups # but do not present in tool groups are added to the new one # @return an instance of SMESH_Group # @ingroup l2_grps_operon def CutListOfGroups(self, main_groups, tool_groups, name): - return self.mesh.CutListOfGroups(main_groups, tool_groups, name) + return self.mesh.CutListOfGroups(main_groups, tool_groups, name) - ## Produces a group of elements of specified type using list of existing groups - # A new group is created. System - # 1) extracts all nodes on which groups elements are built - # 2) combines all elements of specified dimension laying on these nodes + ## + # Create a standalone group of entities basing on nodes of other groups. + # \param groups - list of groups, sub-meshes or filters, of any type. + # \param elemType - a type of elements to include to the new group. + # \param name - a name of the new group. + # \param nbCommonNodes - a criterion of inclusion of an element to the new group + # basing on number of element nodes common with reference \a groups. + # Meaning of possible values are: + # - SMESH.ALL_NODES - include if all nodes are common, + # - SMESH.MAIN - include if all corner nodes are common (meaningful for a quadratic mesh), + # - SMESH.AT_LEAST_ONE - include if one or more node is common, + # - SMEHS.MAJORITY - include if half of nodes or more are common. + # \param underlyingOnly - if \c True (default), an element is included to the + # new group provided that it is based on nodes of one element of \a groups. # @return an instance of SMESH_Group # @ingroup l2_grps_operon - def CreateDimGroup(self, groups, elem_type, name): - return self.mesh.CreateDimGroup(groups, elem_type, name) + def CreateDimGroup(self, groups, elemType, name, + nbCommonNodes = SMESH.ALL_NODES, underlyingOnly = True): + if isinstance( groups, SMESH._objref_SMESH_IDSource ): + groups = [groups] + return self.mesh.CreateDimGroup(groups, elemType, name, nbCommonNodes, underlyingOnly) ## Convert group on geom into standalone group -- 2.39.2