From 528f4842f4018924640fb8a56dbe625f439abfec Mon Sep 17 00:00:00 2001 From: vsr Date: Fri, 26 Dec 2014 11:52:00 +0300 Subject: [PATCH] 0022747: [EDF] Improvement of Get Shared Shapes operation Additional improvements: - Add multi-share parameter to allow searching not sub-shapes which are shared either by all or by couples of input shapes - Avoid raising exception if no sub-shapes is found; return empty result instead - Add test script --- doc/salome/examples/CMakeLists.txt | 1 + doc/salome/examples/basic_operations_ex04.py | 40 +++++ doc/salome/gui/GEOM/images/shared_shapes.png | Bin 10423 -> 18600 bytes doc/salome/gui/GEOM/input/shared_shapes.doc | 27 ++- .../gui/GEOM/input/tui_basic_operations.doc | 4 + idl/GEOM_Gen.idl | 14 +- src/GEOMGUI/GEOM_msg_en.ts | 4 + src/GEOMGUI/GEOM_msg_fr.ts | 4 + src/GEOMGUI/GEOM_msg_ja.ts | 4 + src/GEOMImpl/GEOMImpl_IShapesOperations.cxx | 163 +++++++++++------- src/GEOMImpl/GEOMImpl_IShapesOperations.hxx | 3 +- src/GEOM_I/GEOM_IShapesOperations_i.cc | 5 +- src/GEOM_I/GEOM_IShapesOperations_i.hh | 3 +- src/GEOM_SWIG/geomBuilder.py | 34 +++- .../OperationGUI_GetSharedShapesDlg.cxx | 13 +- 15 files changed, 228 insertions(+), 91 deletions(-) create mode 100644 doc/salome/examples/basic_operations_ex04.py diff --git a/doc/salome/examples/CMakeLists.txt b/doc/salome/examples/CMakeLists.txt index 0817e5fb4..74a84d124 100644 --- a/doc/salome/examples/CMakeLists.txt +++ b/doc/salome/examples/CMakeLists.txt @@ -41,6 +41,7 @@ SET(GOOD_TESTS basic_operations_ex01.py basic_operations_ex02.py basic_operations_ex03.py + basic_operations_ex04.py basic_properties.py blocks_operations_ex01.py blocks_operations_ex02.py diff --git a/doc/salome/examples/basic_operations_ex04.py b/doc/salome/examples/basic_operations_ex04.py new file mode 100644 index 000000000..287ce39ca --- /dev/null +++ b/doc/salome/examples/basic_operations_ex04.py @@ -0,0 +1,40 @@ +# Get shared sub-shapes + +import salome +salome.salome_init() +import GEOM +from salome.geom import geomBuilder +geompy = geomBuilder.New(salome.myStudy) +import SALOMEDS + +# create a box and partigion it by two planes +box = geompy.MakeBoxDXDYDZ(200, 200, 200) +p = geompy.MakeVertex(100, 100, 100) +v1 = geompy.MakeVectorDXDYDZ(1, 1, 0) +v2 = geompy.MakeVectorDXDYDZ(1, -1, 0) +pln1 = geompy.MakePlane(p, v1, 2000) +pln2 = geompy.MakePlane(p, v2, 2000) +partition = geompy.MakePartition([box], [pln1, pln2]) + +# extract solids from result of partition +solids = geompy.SubShapeAllSorted(partition, geompy.ShapeType['SOLID']) + +# get shared shapes from the partition (compound of 4 solids) +# a) faces that are shared by all 4 solids (0 found) +pF_T = geompy.GetSharedShapesMulti(partition, geompy.ShapeType['FACE']) +# b) faces that are shared by any couple of solids (4 found) +pF_F = geompy.GetSharedShapesMulti(partition, geompy.ShapeType['FACE'], False) +# c) edges that are shared by all 4 solids (1 found) +pE_T = geompy.GetSharedShapesMulti(partition, geompy.ShapeType['EDGE']) +# d) edges that are shared by any couple of solids (13 found) +pE_F = geompy.GetSharedShapesMulti(partition, geompy.ShapeType['EDGE'], False) + +# get shared shapes from the list of solids +# a) faces that are shared by all 4 solids (0 found) +sF_T = geompy.GetSharedShapesMulti(solids, geompy.ShapeType['FACE']) +# b) faces that are shared by 1st/2nd, 1st/3rd and 1st/4th solids (2 found) +sF_F = geompy.GetSharedShapesMulti(solids, geompy.ShapeType['FACE'], False) +# c) edges that are shared by all 4 solids (1 found) +sE_T = geompy.GetSharedShapesMulti(solids, geompy.ShapeType['EDGE']) +# d) edges that are shared by 1st/2nd, 1st/3rd and 1st/4th solids (7 found) +sE_F = geompy.GetSharedShapesMulti(solids, geompy.ShapeType['EDGE'], False) diff --git a/doc/salome/gui/GEOM/images/shared_shapes.png b/doc/salome/gui/GEOM/images/shared_shapes.png index 400a42ba5a1c18a6af0652595dd4f7f8f531ca9d..40dc7cc656fce2d68784cff0faecd40d2991c299 100644 GIT binary patch literal 18600 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 BoRa_m literal 10423 zcmch7cU)6j_U{4lDpmvqm8M89Qlv;11tEy^-g4oT)05BwjFT~N`z@9Ru+(Q6x34my7nBLE&j7Qw#nt3?40`1G;cXB?2af&}7pB#VI zi;HcIRdED>T$OH|_Iy~;EXOJDc9Xk7@UY@^m$!~f2gT0C2g`5VDPc=lGAl#f`GKl< z&)0a|neE$IQ^zxoY=>kr{aNH|v>DeNv=QZIb}t=8qUAfaRD4zx&Z(dx?mB0+r`u zOSO|nF^+NQX6HGGin_qeTGySfxsxIVCdO`OEzBudyq=R|6>@dO+Wy;bYPXA5-AMfd zb?C0lFax)~@v_B%DkaskObuZ+^O%Pb?})!laOIL=k?{d8i}LBNVdC!IGxk2_8j(JE zqrsjXsGhTlind9`xX725-qzB+9uOHc#@T-Eqrqzl->NT^I2d2>4IvWZrX-g#s(&T3 z)`#1eq%AoVM)o#YKt+TGGiwZ-SlWKFo(J6_Eqx-#Y~&mC?8AIE^9{}t;KgE7eoh{r zaF3$U7tz>pVhofp3mdPXV=_C=b0RAam33Piua?P&+S@{Sba<%TNtGUE(}rvZOJ%eOdpU~Vaw@$s;b?F@T8d$(}o8J z-%iLkv$-j=#Q9~;KwmL+wzf;Z?Nt`XenxsCU8fcHr9XnjbsNXclkw&5Ak!Sbiu-hKp_PAv=Jcb_EQJ(mc z+VaUd5jQz(->8HraFUfr&(&J@HEdt3T^(HN!fc{-^!u)#!LF0{kULM!5iSbKG|`x+f}>T{9J^v5&kz4gcN+1iFhA1ntU7(u^| zovUvhYifY2PgO5Z1@Gb`a=XZM%f*@DQ2Vc3r+Cy}4_+gSUfm>DsHb_`1lL#ZsVDBh z>R9-FJDmCiILb;kW382`n@YYLQ`UYfyr$PpWslMP5d`(VeOhbZxr`BmOns^*@{7z$AH6m3@l#!s^T*~;N0MYJ$uDIRK6jW`bN_S4;An-^+hVM%J- zDBD|U2+XHC4TNW>(IB4su(cxrT8n4$+C9_Kr|k(ugZoc(lp&RPz4Kq6y5Y{gD3Z8y*kMf}vA#Ylt)$Rz}z}t4e3GWEiHxxIS zZWM8GcYS7ENftYTTX8eciKKfh@7PZ%5Np(a3u^}Nqdtu(#C~sQaB1q6|MozXwq19{ z%Gi=(O;uT*su12od(H?-;oLkqx8{?}tbP<2Ua=@hZd;M0@*Mu&_gVnqgE>?tf)MK0 zJIeZ!VMRIGb&_mn19;A5PId2|3} z8laP?OANr1n=e3kyQ~8`X5j}O7_u4#OI?>bAIR}ysJ*#;;ucV?qs7i&R8(|vRJoYb zyXErhtG`QMm(s}u%3^gM@uzgUyDz^88f&={GyCIrT(9y`HX!f}uS?m_U-bxQ8&>ra{8@d`h`(SMT04Zw*;zttG1X}a=t51;ZXA}3} z&`@gest;YR8$}x>XrGENYpx*H^psD0esu;u`lh@%VcXmey-~S1RfW$)x!~nnKP}1e zG#`olb?GvAs~GotHxh=qt4suDEed}*d~mezYQ0H2y_ncipn95eSrahrSsqHK`d}>R zF&|pqk>#kh=d~jAo^G5v!v}a?O)i(XrdPGUOEr=urSe2huIN0TuF>Ybq6rLXIYUR? zpE7$sW??XtOhUw~2q^%TTU#CG;IcbHX1htudq5 zHLZIlweOC9U0rr|J|4Ua_KK^uzx}p%J4eAM-Qj#7j~pO=>h2l-3UeeCwH)4F?M)w? z+ukIsCGV|rLI-0d+seR~C51wf;}rtLZ_Axb{t?lkMUEiugb(NBMng@>>~AyR)$JnP0ttE!@G_a2KS zqUPo8lJic-+FrGAr)l!Nno-U0+$@MR*|xRU)=vD%yZ2+cK9Gzr;}rzNt>tn?Yo9$2 z9JwQ(Bhj>Ksjgh{!wcV*(w5x^qeVm_?jQVdfolp6VE3~vuHaeb zfByX1l_nO;I8%`fcaBmbwMZ_B@%Lb(ITot<64t z1o)k8dnnz;aw~5%J6EO1_NqGX*~Z*lCucPsS65fiwz%|*o~L(^xrmw{Gm!MU^IWuI z6m_Y2nH|&j<;%{oGmz|TrJ}lPg9jg3SssK4|B*_+#>&~**)ID=0C+7lAeP()j~K=J zK!1!|MQh$192^v|;3Hz-{t*N`OdC3k4O%u<%SbtK3k_)+cW6iQ+okl1Dk~suqidl-?}X>D6+ptD48D4==K<1ICWRQ z1vx)2((5u;%mhti1dL)-bapUQ584JLxfq!r`g&SdGnqX6oZl{jI@~qmrxdu5%0HjP ztNyy`PH0-#{(@6bka@^VYVRyK`CZv>i;I=Bu5KmirkaT-fJ?(5jGTxuK&+-D5L;~n z`n8mnTh?S16oeobclr%vRReFkxw*<-yH+$(cdcv2ziVbSTRF_!f5d9WPtk=^Ajbfh z+TCr3b^F}=)_}ph29dRTZ|58H$vuLPr?qon=v z@plj3l{H(k>;!KT!j1xlNuM7%2Lzbj3VRmN5wD;*{PB^@A0*|jo5TbWOzHnRahdWa zMEh*7q>i%pghnQCaG*2)*@pWZO1S~#s6xt>XSWM~R(&pw&pAf7%*c87#U_|l5Xjaa ze(Zejcf;nTZ)TQ}AVacVf9pwV8s+5DyfL6NyAg2u~NG(Pq(LK?HRKJD8u!D^mflQbW&`eCzV{-aa_MM&dq{Fx zuE7`kz*hY?4vh`V@@iqNxUu(1 zF-ty_jy8Mm5m+TY5IKJh8#Im|=RxNDgO?0M0n^u5q{1(S7HydZIaO7=+TE_7Vhc+P zS4GKs!J!l33f+`IRQJqIz-S-5(ms%$K0=_Y=r9YO$3rrBCTRDZDUv&vqD9P)CRuvz;iTf;`-y*A#&HDSZLtlH)(+sNQtos_%30C z(UT}ozsXJZLxoVsCnl-}kp>xF$7Njop<&7zI7j^HQS}G2#wnLN<6OGzqcSbT@ewE& zS36kNpjm>2&CJ<}SLYJXEj`P;JTNd&=qyv7m6cVfBq1T;>5-)_ZQb1i7YrNe>CuCz zVwLn~HUfn-h~gIB35q?Iq9YtP{L5+QqD{`H=KSV=>@0G|53VQ@{&boi?7^*$u$^BI zR|gqDx5QXrQ^(rcI<;@^IJMVh4GJUT;rLL{8+^mBLn>9b#Fp1Utw1u4Fo79)+R!5v zm+Wgrlgbdg5Nq}#ftKl`~XjTLsT<%GFtAN(oMF{uLM^fy^Zic2AKneFz1hid1p4A5eYPwbk!-o#$fVk@Oj(vq zGxHwphE=8|e5ACUd@#!%@?xtIXSC$JY^Ly;&eop5t6pU)YW7Cku^r;2ekK%U(KPN8 zB0y`VOa(~_$J7Asi0~_yflH}P2Jp*o{7m$yZy4Q+Yk;!TkBXV)1|UsIpBP`N{Q0%5rx}3k(ZW*)drw7!RUI4H+e+*RNV{HU0R+S-4R6 z3e*rFP_vi(n;hXBNXQ9h`P%{KzFT4Spz0W{_f5HdDqgccivO@TX?ZU#Aq>QS5J+SH z8RmUpu!=aqR4ZBn$zsWPJU)5mO8`>eS-d{>A1GBo3BoUOpgit~T4OS- zh*E@WPFczH#l@NVgn(BPVXFR6WKcJSTpAgy?!frF(NQjb?h0kmr5^IM4Gc8lr)Bp@ zT{wUKs4WMu;Nlf7{&nx1UDEx)M>{IF8_Z8d2V(GB$0rR_eTc)gDIR!o=o5pXa32Ugu z-T#OetKWZ%Akh?R|E3#cCE87F;CK24%cDKw+e2ROSn$uDbVZl*Hov4P6oS9!lcNu` zg#OeIZ5xrh(YPEn9iFgt>6=V%3(t;Z$Y(p$TC(r~>=iogxARlP0P*l$2eJP<5JBh8{Oe7C@8_;bmghm0dX38IvaFeEw-%=BrF;-k=&w zF9eaM4yfHDCF6szIna@u1;*a;WzoZ{I^>dJj#;=~^SSZ-r zG+19rjL<9~?u{(Ob>|Mm^g$o;voZ^?Mi(Ajt~L8NkUs2cC9b85q-J%Op)XnRqgyw! zHqj%Vlr-iYl%>jA_oLF8oUT!3++>R#qV&UI8@`0TZ&?~jhZKPg_i%}H6w zoQ!@0HrCGV1A1a&HWZRO&We0_?-=_~0V#)~oxs%}yyt1CKwlvYxBfVmm!COUJ~*hP z7G%BLqFOqi#qaRRmQy=|EiDZ+lkiB}5-fSQ@ zcZB|OYnbu1LAKB}D#>Fq&tknCh8{pxHS4?e<(tW5Rc`Ub4Gx*hWSNSl8G}tGi(lt~ zQkm5Y=T9;TmmOSMJ!`Hi=k08Ait(++tH5XA1zFlWBWgTW@%~AR0#x*xLS^uEhbK69?!ylBk+1|jliRTwU zfovEi*UDFu|CT~r><&uPe;hJ=MNfBI@j_ouk8pv3`)ZslZ9=4V_q}AmLj0i^&bsU@ z{e|42`l~HlH&HuZMM1tg;H-Oc?>l)cEf-`OX3h$GFAC8vy_#fawSR}P+|CNMu5pZ7 zZ4_zU#w&yQ>{i;B<>9vayUY3c!?h*;O&g;Ipa-)#33Y=ETfgXmJdXw}RxC}|_ZFAs z@9ew8NV=^r(@9L!m%iQ&Fr-*`|K)f9zrT){IrO!&XLMY6#U8z#SVbihV4cYV$;BHR zL4iR*3%UMZe)#jeWi%TMhL3F1N$u3V7z^S?d2N7p)8ffM?|S96uxsITZqBPLyTcC7?__B*OO}<;VB-2sV>xh>{(WgJGdBen6qJd zgtww%E@g-Qvl^6|LtvN!UL7)-f3*7OFU|zknKs0Sy+JVkKu1unM!XR#sUd8LwQd}v zue%v|czWtaYZm_et+{{~=q;ar{G=jgA@-wFTcowMO#l%N#W#J){i2^Y#OX6bE!tlz z(=Sl7+dA7s0L0?9A+s8Vmeb0;fxW5aWPpkx#zJ8+x=tjwUKYa8XZWID>4dNkBug+2B_c3We- zvgEzT&i9uUqsOTYpGSW)R0P4~;>xFB5~eMCx6=@K2O>cKa}CCqzTlU4b7}yS28eW5 z5>*h8%!aTi$yGIQ1eP_PQ70}$ zN!kYNFtEgv+Bd=?ejJCE>DmzN!{B!(1`I&t)LUadipZU zBc>8Z(PJ!YlIJfzHQE|%WMXE?YZTXbB*j)5ccYCP;+DczZuEAs>cbkT3S#J{woY(oMRZR<`+~G?vS)-qT zExEH8Wb!mm$o4T-h;BnMKSYS6G7nP+)>;@H{rm<9hz8@jOTJ1EoAa)7wiXCm;_Uj~ zUc2=^cS2V%8Ejq7GP(jLQ6Av(+9(V~8Wdc$_JK6$B##n_v0aPQ9y-vo)}$>Xt@s1h zZe30uN+(7SdW@Ibe?=@((#ThItmL}J-*D#$@5r6F)lR4QG=!|VLI!G_aH)ENX<*YW z0ly66@q&=-tgIydhWh%l*4EZ)Z|^!uY<+#|qSN^42Q*byNOo@KdIJ-w>ns4(;g^FkAoB;Tz|U};{D^- zI=TRltJ=%V-=hwmJj2IoVsrO$PxCk+%ZsLQx9<$2FV3RcSv4kYR1GF=eSz3Jt;-=y zT43txu}7+iSUb3J-KChAvnT9=C(OVd9*bWZZw_3>E~7T37%%G>7W>#h@9xP8Jy^}A z1WTDOGXOv~=l|!#&5gA6<)uHus#pJ(xH)!7#q!?H%`8AR|on`BT4-z(KwAP+~ z{#!WD7|X8%%6x5QpK&Wo5*W|(drW_Q4r{&3sSvU>C|r24qIKMwHzg0d#IFZ18B;G^ z;5t79W@!}DLE;O+Z`K(UJ@>4{2SG1H2qdeGEjBrEI557&>Qw1i+t?iM&YRcI`P--+%Q&NWz{#4V8V^0_e4~>AQsZa{5dO9ba$k&!NGwX7-jAw*dVcp#h~C#(%nqp zmq79*=@UiHs@Kwuny#RFEK94$J;tpG<=hahz}(S!ylq?iRQ@CQm*cjZS0{Op<7{D<;@k%#oXx74f#s?L6M@YY8!8jlnHAj zSfT=RcWRcFkv)q<*e-&nd7FLFkGjaS`|k0RqX0DS2Zwzx+P=oNI|JkCImz933{*?D zNW~ts=8ul&Gj=u9V-)r3_K6N*7^ne{p7}j#Rk>jpv#yetor&MdLB5XEa-7JeX3JYG zUZifFpm6hP0!*x(L+KX;36Xm{!r4BdiRvr&Z~fN!w=B_7@mfi^YzI^CK@}tVK!&if z{Xff)KdNv71E9l`%bXiyNN{JKyv+!dVLm_RA5S_}AL%O2)(@8EjGoKt^oS+7Mbauy zbO`T$aFoW)5x((f~BP*l@T^R;5+oLH-^TX zWLdfTD$_y?l#l&sv5np&Z`4%%lIbjx8?6TXe);vtxoC^$TaA3aPVF~+n;grhMFriJ zT`vqe0qn8aOwk1_D{TDu{U1bw0evBOy9JZIP=q?g@(>fio{~Lr#rJs9%T1l#dqnlm zW```;0Ym%VrKI~&I^W7Agoc}x?!j<~bMNcfAABsGHL;nw$=}l(Bs9xBPKI}Ye%dK4 zT%ew7YNIQB?hQhxM0{1!SU3!SX2?*Tsj1Z9f}ntxk9PDt4zRRl+a|qgixI@6#OJKH|kpk_X(|HsGW-(5+s~g8BJ|`*ylta92OC z*gnTiR5_GlUWa5^FW<4p?h&f&Dx7c$=ioMVu6G@5T5(Io=}y)<=tDwA3FQ}{HV#9y zzzfCuQ9+B8g^T=lc6JxJxy>vrEIJY3cP%nlnr`c=jL4=CX<`cO*u5TKC8`_RW=T4S z@(rxrSGw3IUh9!Q#U0Yyvc~}o|%b! zdv3&bHF@8$M;d%K1I_6?hUgyKQQ2K}04pNwX+D4-PqTlqXCupP=E;L(#KcKAfi~HPckNEkK*q`u`TCF3ec>=`iystsOC+ltm zi`8A_1>+|hjMqwd#rJoQkHn7FW1Y}GRbj(xgNcE=_#mv;i1CK6_egDt7pHz;FD32y z0z5r_OX<0FDqUd;9JIAshBw+s9rs}whOru+aiu+UJH0iE_&##Tg(za->f=P##-?*W zGuhX73chI3=({s7rlUSHN?jPVUvjgZ(F`=HGlCv5ifP(+4TDD+RjB3JBkge}tHFz8 zdT3>O6X}Yt-*B1*WaoPZX(5ZGGSzHXm*<99>v{AhyfULKA#Zy(b!x8B8$-}IOQ)$O z9KS1(-z}T~Z-qWKa{qkk0-|ZRpufkp?jj=en?gMl{{s+F|Oy>Xq diff --git a/doc/salome/gui/GEOM/input/shared_shapes.doc b/doc/salome/gui/GEOM/input/shared_shapes.doc index 7b201137a..95ff27113 100755 --- a/doc/salome/gui/GEOM/input/shared_shapes.doc +++ b/doc/salome/gui/GEOM/input/shared_shapes.doc @@ -4,7 +4,7 @@ This operation is a special case of Explode operation. It produces sub-shapes of the exploded shape (the first shape in the list -of argument shapes), which are shared with all other shapes in the +of argument shapes), which are shared with other shapes in the arguments. The argument shapes can also be contained in a compound or group. @@ -13,19 +13,28 @@ Shared Shapes. The following dialog box will appear. \image html shared_shapes.png -
    -
  • Name is the base name of the resulting shapes.
  • -
  • Shapes are the shapes to fing shared sub-shapes of.
  • -
  • Sub-shapes Type is the type of required sub-shapes.
  • -
+In this dialog: +- Name is the base name of the resulting shapes. +- Shapes are the shapes to fing shared sub-shapes of. +- Sub-shapes Type is the type of required sub-shapes. +- Multi-shares only option specifies what type of shared sub-shapes should be checked: + - \b On: causes to search sub-shapes from the first input shape shared with all other input shapes; + - \b Off: causes to search sub-shapes shared between couples of input shapes. + +\note For the case when "Multi-shares only" option is switched off - if an input list of shapes +contains single compound, the sub-shapes shared between all possible couples of its top-level shapes +are searched; otherwise, only sub-shapes that are shared between first input shape and all rest input +shapes are searched. + +Advanced options: \ref preview_anchor "Preview" -\n Advanced options: \ref preview_anchor "Preview" -

TUI Command: geompy.GetSharedShapesMulti( Shapes, Type ),
where \em Shapes is a list or compound of shapes to fing shared sub- shapes of and \em Type is the type of required sub-shapes. Our TUI Scripts provide you with useful examples of the use of -\ref swig_GetSharedShapes "Get Shared Shapes" functionality. +Get Shared Shapes functionality: +- \ref tui_shared_shapes "Example 1" +- \ref swig_GetSharedShapes "Example 2" */ diff --git a/doc/salome/gui/GEOM/input/tui_basic_operations.doc b/doc/salome/gui/GEOM/input/tui_basic_operations.doc index 743b75dc2..7905440f9 100644 --- a/doc/salome/gui/GEOM/input/tui_basic_operations.doc +++ b/doc/salome/gui/GEOM/input/tui_basic_operations.doc @@ -14,4 +14,8 @@

Restore presentation parameters and sub-shapes

\tui_script{basic_operations_ex03.py} +\anchor tui_shared_shapes +

Get shared shapes

+\tui_script{basic_operations_ex04.py} + */ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index e9805e23d..26412f7e5 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -2267,13 +2267,21 @@ module GEOM in long theShapeType); /*! - * \brief Get all sub-shapes, shared by all shapes in the list \a theShapes. + * \brief Get sub-shapes, shared by input shapes. * \param theShapes Shapes to find common sub-shapes of. * \param theShapeType Type of sub-shapes to be retrieved. - * \return List of objects, that are sub-shapes of all given shapes. + * \param theMultiShare Specifies what type of shares should be checked: + * - \c TRUE: search sub-shapes from 1st input shape shared with all other input shapes; + * - \c FALSE: causes to search sub-shapes shared between couples of input shapes. + * \note If \a theShapes contains single compound, the shares between all possible couples of + * its top-level shapes are returned; otherwise, only shares between 1st input shape + * and all rest input shapes are returned. + * + * \return List of all found sub-shapes. */ ListOfGO GetSharedShapesMulti (in ListOfGO theShapes, - in long theShapeType); + in long theShapeType, + in boolean theMultiShare); /*! * \brief Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 4ca9cf642..2c6d81b7a 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -6955,6 +6955,10 @@ Do you want to create new material? GEOM_SHARED_SHAPE Shared_%1 + + GEOM_SHARED_SHAPES_MULTISHARE + Multi-shares only + GEOMToolsGUI_PublishDlg diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index 58a357fb7..325276b2f 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -6883,6 +6883,10 @@ Voulez-vous en créer un nouveau ? GEOM_SHARED_SHAPE Partagé_%1 + + GEOM_SHARED_SHAPES_MULTISHARE + Multi-shares only + GEOMToolsGUI_PublishDlg diff --git a/src/GEOMGUI/GEOM_msg_ja.ts b/src/GEOMGUI/GEOM_msg_ja.ts index 754712ae7..fbd9e19c9 100644 --- a/src/GEOMGUI/GEOM_msg_ja.ts +++ b/src/GEOMGUI/GEOM_msg_ja.ts @@ -6860,6 +6860,10 @@ GEOM_SHARED_SHAPE Shared_%1 + + GEOM_SHARED_SHAPES_MULTISHARE + Multi-shares only + GEOMToolsGUI_PublishDlg diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx index fec403a59..9f1ee5e88 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx @@ -2252,7 +2252,7 @@ Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetSharedShapes } if (aSeq->IsEmpty()) { - SetErrorCode("The given shapes have no shared sub-shapes of the requested type"); + SetErrorCode(NOT_FOUND_ANY); return aSeq; } @@ -2272,121 +2272,168 @@ Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetSharedShapes //======================================================================= //function : GetSharedShapes //purpose : +// +// NOTE on the implementation +// +// 1) Resulting sub-shapes are published as a children of the 1st input shape +// from theShapes list. Due to this reason only direct sub-shapes of the 1st +// shape can be contained in the result of the operation (i.e. shares between +// 2nd/3rd, etc couples cannot be retrieved. +// 2) An exception from above case is when a single compound is specified as an +// input. In this case we search shares between its top-level content, so we +// are able to search shares between all possible couples of shapes. +// 3) Parameter theMultiShare controls what types of shares to search: +// - True: get sub-shapes that are shared between ALL input shapes; +// - False: get shares between couples of input sub-shapes (see points 1 and 2). +// +// Thus, we have the following cases: +// [1] theShapes = N shapes (N>1), theMultiShare = True +// Result: sub-shapes that are shared by all theShapes +// [2] theShapes = N shapes (N>1), theMultiShare = False +// Result: sub-shapes of 1st shape from theShapes that are shared with any shape +// from theShapes +// [3] theShapes = 1 shape, theMultiShare = True +// Result: sub-shapes that are shared by all top-level sub-objects of theShapes[0] +// [4] theShapes = 1 shape, theMultiShare = False +// Result: sub-shapes of all possible couples of all top-level sub-objects of +// theShapes[0]. //======================================================================= Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetSharedShapes (std::list & theShapes, - const Standard_Integer theShapeType) + const Standard_Integer theShapeType, + const bool theMultiShare) { SetErrorCode(KO); int aLen = theShapes.size(); if (aLen < 1) return NULL; - int ind = 1; std::list::iterator it = theShapes.begin(); + // main object is always first in the input list + // it is the object from which sub-shapes indices are taken + // and where results are published Handle(GEOM_Object) aMainObj = *it; Handle(GEOM_Function) aMainShape = aMainObj->GetLastFunction(); + // collect all shapes from the input list (including first one) for processing TopTools_SequenceOfShape shapeSeq; - for (; it != theShapes.end(); it++, ind++) { + for (; it != theShapes.end(); it++) { Handle(GEOM_Function) aRefShape = (*it)->GetLastFunction(); if (aRefShape.IsNull()) { SetErrorCode("NULL shape for GetSharedShapes"); return NULL; } - TopoDS_Shape aShape2 = aRefShape->GetValue(); - if (aShape2.IsNull()) return NULL; - shapeSeq.Append( aShape2 ); + TopoDS_Shape aShape = aRefShape->GetValue(); + if (aShape.IsNull()) { + SetErrorCode("NULL shape for GetSharedShapes"); + return NULL; + } + shapeSeq.Append( aShape ); } - TopoDS_Shape aShape1 = shapeSeq.First(); - + // if only single shape is specified as input + // collect all ites top-level sub-shapes for processing if ( shapeSeq.Length() == 1 ) { + TopoDS_Shape aShape = shapeSeq.First(); shapeSeq.Clear(); - for ( TopoDS_Iterator it( aShape1); it.More(); it.Next() ) + for ( TopoDS_Iterator it( aShape ); it.More(); it.Next() ) shapeSeq.Append( it.Value() ); - aShape1 = shapeSeq.First(); } + // map all sub-shapes in a main shape to their indices TopTools_IndexedMapOfShape anIndices; TopExp::MapShapes(aMainShape->GetValue(), anIndices); + TopTools_MapOfShape mapShape; - TopTools_IndexedMapOfShape mapSelected; - TopExp::MapShapes(aShape1, TopAbs_ShapeEnum(theShapeType), mapSelected); - - // Find shared shapes - BRep_Builder B; - TopoDS_Compound aCurrSelection; - - for ( ind = 2; ind <= shapeSeq.Length(); ind++) { - - TopoDS_Compound aCompound; - B.MakeCompound(aCompound); + // find shared shapes - const TopoDS_Shape& aShape2 = shapeSeq.Value( ind ); + // here we will collect all shares + TopTools_ListOfShape aShared; - TopTools_MapOfShape mapShape2; - TopExp_Explorer exp (aShape2, TopAbs_ShapeEnum(theShapeType)); - for (; exp.More(); exp.Next()) { - const TopoDS_Shape& aSS = exp.Current(); - if (mapShape2.Add(aSS) && mapSelected.Contains(aSS)) { - B.Add(aCompound, aSS); + // number of iterations + int nbIters = theMultiShare || theShapes.size() > 1 ? 1 : shapeSeq.Length()-1; + // numShares factor to search (i.e. by what nb of shapes each found sub-shape should be shared) + int nbShares = theMultiShare ? shapeSeq.Length()-1 : 1; + + for ( int iter = 1; iter <= nbIters; iter++) { + for ( int ind = iter+1; ind <= shapeSeq.Length(); ind++) { + if ( ind-1+nbShares > shapeSeq.Length() ) break; + TopoDS_Compound aCurrSelection; + TopoDS_Shape aShape1 = shapeSeq.Value( iter ); + TopTools_IndexedMapOfShape mapSelected; + TopExp::MapShapes(aShape1, TopAbs_ShapeEnum(theShapeType), mapSelected); + for ( int s = 0; s < nbShares; s++ ) { + BRep_Builder B; + TopoDS_Compound aCompound; + B.MakeCompound(aCompound); + const TopoDS_Shape& aShape2 = shapeSeq.Value( ind+s ); + TopTools_MapOfShape mapShape2; + TopExp_Explorer exp (aShape2, TopAbs_ShapeEnum(theShapeType)); + for (; exp.More(); exp.Next()) { + const TopoDS_Shape& aSS = exp.Current(); + if (mapShape2.Add(aSS) && mapSelected.Contains(aSS)) { + B.Add(aCompound, aSS); + } + } + mapSelected.Clear(); + aCurrSelection = aCompound; + TopExp::MapShapes(aCurrSelection, TopAbs_ShapeEnum(theShapeType), mapSelected); + } + TopoDS_Iterator itSel(aCurrSelection, Standard_True, Standard_True); + for (; itSel.More(); itSel.Next()) { + const TopoDS_Shape& aSS = itSel.Value(); + if (mapShape.Add(aSS) ) + aShared.Append(aSS); } } - - mapSelected.Clear(); - TopExp::MapShapes(aCompound, TopAbs_ShapeEnum(theShapeType), mapSelected); - aCurrSelection = aCompound; } - // Create GEOM_Object for each found shared shape (collected in aCurrSelection) - Handle(GEOM_Object) anObj, aLastCreated; - Handle(TColStd_HArray1OfInteger) anArray; Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; - TCollection_AsciiString anAsciiList, anEntry; - TopoDS_Iterator itSel (aCurrSelection, Standard_True, Standard_True); - for (; itSel.More(); itSel.Next()) { - anArray = new TColStd_HArray1OfInteger(1,1); - anArray->SetValue(1, anIndices.FindIndex(itSel.Value())); + if (aShared.IsEmpty()){ + SetErrorCode(NOT_FOUND_ANY); + return aSeq; + } + + // create GEOM_Object for each found shared shape (collected in aShared) + TCollection_AsciiString anAsciiList; + Handle(GEOM_Object) anObj; + TopTools_ListIteratorOfListOfShape itSub (aShared); + for (; itSub.More(); itSub.Next()) { + TopoDS_Shape aValue = itSub.Value(); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aValue)); anObj = GetEngine()->AddSubShape(aMainObj, anArray); aSeq->Append(anObj); - aLastCreated = GEOM::GetCreatedLast( aLastCreated, anObj ); - // for python command + TCollection_AsciiString anEntry; TDF_Tool::Entry(anObj->GetEntry(), anEntry); anAsciiList += anEntry; anAsciiList += ","; } - if (aSeq->IsEmpty()) { - SetErrorCode("The given shapes have no shared sub-shapes of the requested type"); - return aSeq; - } - - // Make a Python command + // make a Python command anAsciiList.Trunc(anAsciiList.Length() - 1); - // IPAL22904: TC6.5.0: order of python commands is wrong after dump study - // Get the function of the latest published object - Handle(GEOM_Function) aFunction = aLastCreated->GetLastFunction(); - if( aFunction.IsNull() ) // just in case - aFunction = aMainShape; - - GEOM::TPythonDump pd (aFunction, /*append=*/true); + GEOM::TPythonDump pd (anObj->GetLastFunction()); pd << "[" << anAsciiList.ToCString() - << "] = geompy.GetSharedShapesMulti(["; + << "] = geompy.GetSharedShapesMulti("; + + if ( aLen > 1 ) + pd << "["; it = theShapes.begin(); pd << (*it++); while (it != theShapes.end()) { pd << ", " << (*it++); } + if ( aLen > 1 ) + pd << "]"; - pd << "], " << TopAbs_ShapeEnum(theShapeType) << ")"; + pd << ", " << TopAbs_ShapeEnum(theShapeType) << ", " << theMultiShare << ")"; SetErrorCode(OK); return aSeq; diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx index d1827ee9c..002f338e6 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx @@ -176,7 +176,8 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetSharedShapes (std::list& theShapes, - const Standard_Integer theShapeType); + const Standard_Integer theShapeType, + const bool theMultiShare = true); Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetShapesOnPlane (const Handle(GEOM_Object)& theShape, diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.cc b/src/GEOM_I/GEOM_IShapesOperations_i.cc index 334846938..1fa7f1fb9 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.cc +++ b/src/GEOM_I/GEOM_IShapesOperations_i.cc @@ -1155,7 +1155,8 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetSharedShapes //============================================================================= GEOM::ListOfGO* GEOM_IShapesOperations_i::GetSharedShapesMulti (const GEOM::ListOfGO& theShapes, - const CORBA::Long theShapeType) + const CORBA::Long theShapeType, + CORBA::Boolean theMultiShare) { //Set a not done flag GetOperations()->SetNotDone(); @@ -1168,7 +1169,7 @@ GEOM::ListOfGO* GEOM_IShapesOperations_i::GetSharedShapesMulti return aSeq._retn(); Handle(TColStd_HSequenceOfTransient) aHSeq = - GetOperations()->GetSharedShapes(aShapes, theShapeType); + GetOperations()->GetSharedShapes(aShapes, theShapeType, theMultiShare); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.hh b/src/GEOM_I/GEOM_IShapesOperations_i.hh index 944096750..9d0dbb464 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.hh +++ b/src/GEOM_I/GEOM_IShapesOperations_i.hh @@ -165,7 +165,8 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : CORBA::Long theShapeType); GEOM::ListOfGO* GetSharedShapesMulti (const GEOM::ListOfGO& theShapes, - CORBA::Long theShapeType); + CORBA::Long theShapeType, + CORBA::Boolean theMultiShare); GEOM::ListOfGO* GetShapesOnPlane (GEOM::GEOM_Object_ptr theShape, CORBA::Long theShapeType, diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index fd3cecc0e..b5d4c2406 100755 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -4920,33 +4920,49 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): self._autoPublish(aList, theName, "shared") return aList - ## Get all sub-shapes, shared by all shapes in the list theShapes. + ## Get sub-shapes, shared by input shapes. # @param theShapes Either a list or compound of shapes to find common sub-shapes of. - # @param theShapeType Type of sub-shapes to be retrieved (see ShapeType()) + # @param theShapeType Type of sub-shapes to be retrieved (see ShapeType()). + # @param theMultiShare Specifies what type of shares should be checked: + # - @c True (default): search sub-shapes from 1st input shape shared with all other input shapes; + # - @c False: causes to search sub-shapes shared between couples of input shapes. # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. # - # @return List of objects, that are sub-shapes of all given shapes. + # @note If @a theShapes contains single compound, the shares between all possible couples of + # its top-level shapes are returned; otherwise, only shares between 1st input shape + # and all rest input shapes are returned. # - # @ref swig_GetSharedShapes "Example" + # @return List of all found sub-shapes. + # + # Examples: + # - @ref tui_shared_shapes "Example 1" + # - @ref swig_GetSharedShapes "Example 2" @ManageTransactions("ShapesOp") - def GetSharedShapesMulti(self, theShapes, theShapeType, theName=None): + def GetSharedShapesMulti(self, theShapes, theShapeType, theMultiShare=True, theName=None): """ - Get all sub-shapes, shared by all shapes in the list theShapes. + Get sub-shapes, shared by input shapes. Parameters: theShapes Either a list or compound of shapes to find common sub-shapes of. - theShapeType Type of sub-shapes to be retrieved (see geompy.ShapeType) + theShapeType Type of sub-shapes to be retrieved (see geompy.ShapeType). + theMultiShare Specifies what type of shares should be checked: + - True (default): search sub-shapes from 1st input shape shared with all other input shapes; + - False: causes to search sub-shapes shared between couples of input shapes. theName Object name; when specified, this parameter is used for result publication in the study. Otherwise, if automatic publication is switched on, default value is used for result name. + Note: if theShapes contains single compound, the shares between all possible couples of + its top-level shapes are returned; otherwise, only shares between 1st input shape + and all rest input shapes are returned. + Returns: - List of GEOM.GEOM_Object, that are sub-shapes of all given shapes. + List of all found sub-shapes. """ # Example: see GEOM_TestOthers.py - aList = self.ShapesOp.GetSharedShapesMulti(ToList(theShapes), theShapeType) + aList = self.ShapesOp.GetSharedShapesMulti(ToList(theShapes), theShapeType, theMultiShare) RaiseIfFailed("GetSharedShapesMulti", self.ShapesOp) self._autoPublish(aList, theName, "shared") return aList diff --git a/src/OperationGUI/OperationGUI_GetSharedShapesDlg.cxx b/src/OperationGUI/OperationGUI_GetSharedShapesDlg.cxx index 2c0d98c73..95d0d6724 100644 --- a/src/OperationGUI/OperationGUI_GetSharedShapesDlg.cxx +++ b/src/OperationGUI/OperationGUI_GetSharedShapesDlg.cxx @@ -75,7 +75,7 @@ OperationGUI_GetSharedShapesDlg::OperationGUI_GetSharedShapesDlg GroupPoints->LineEdit1->setReadOnly(true); GroupPoints->LineEdit2->hide(); GroupPoints->LineEdit1->setEnabled(true); - GroupPoints->CheckButton1->hide(); + GroupPoints->CheckButton1->setText(tr("GEOM_SHARED_SHAPES_MULTISHARE")); QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); @@ -308,12 +308,9 @@ GEOM::GEOM_IOperations_ptr OperationGUI_GetSharedShapesDlg::createOperation() //================================================================================= bool OperationGUI_GetSharedShapesDlg::isValid (QString& msg) { - bool isOK = true; - if (myListShapes.length() < 2) { - isOK = false; - if ( myListShapes.length() == 1 ) - isOK = ( myListShapes[0]->GetShapeType() == GEOM::COMPOUND ); - } + bool isOK = myListShapes.length() > 1 || + ( myListShapes.length() > 0 && myListShapes[0]->GetShapeType() == GEOM::COMPOUND ); + if ( !isOK ) msg = tr("MSG_SHARED_SHAPES_TOO_FEW_SHAPES"); @@ -327,7 +324,7 @@ bool OperationGUI_GetSharedShapesDlg::isValid (QString& msg) bool OperationGUI_GetSharedShapesDlg::execute (ObjectList& objects) { GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation()); - GEOM::ListOfGO_var aList = anOper->GetSharedShapesMulti(myListShapes, GetType()); + GEOM::ListOfGO_var aList = anOper->GetSharedShapesMulti(myListShapes, GetType(), GroupPoints->CheckButton1->isChecked()); if (!aList->length()) return false; -- 2.39.2