From 8bfdc37bff468c18f58126f74488be97d60a2288 Mon Sep 17 00:00:00 2001 From: skv Date: Thu, 22 Jan 2015 12:14:55 +0300 Subject: [PATCH] 0022775: [CEA 1091] Add an option on GetNonBlocks to retrieve quadrangular faces defined on C1 edges --- doc/salome/gui/GEOM/images/measures2.png | Bin 21135 -> 24967 bytes doc/salome/gui/GEOM/images/measures2a.png | Bin 11085 -> 8572 bytes doc/salome/gui/GEOM/input/get_non_blocks.doc | 37 +- idl/GEOM_Gen.idl | 7 +- src/GEOMGUI/GEOM_msg_en.ts | 4 + src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx | 466 ++++++------------ src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx | 9 +- src/GEOM_I/GEOM_IBlocksOperations_i.cc | 4 +- src/GEOM_I/GEOM_IBlocksOperations_i.hh | 1 + src/GEOM_SWIG/geomBuilder.py | 34 +- src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx | 103 +++- src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h | 15 +- 12 files changed, 323 insertions(+), 357 deletions(-) mode change 100755 => 100644 src/GEOM_I/GEOM_IBlocksOperations_i.cc diff --git a/doc/salome/gui/GEOM/images/measures2.png b/doc/salome/gui/GEOM/images/measures2.png index 21e5218a40ea5f27255b8b25ccf88bde62af74ef..a9e064b5e852679d46b4477b1f71e6770a487c9e 100644 GIT binary patch literal 24967 zcmb5W1yq#X+c!Fh0@BhTp>!kNpdcXK-QC@d0)ir-)X+U3E!`kUNOyO4cc0Dk{NMGS zFV6YSSuU5(J^+~I?!GX#R(_V^brmI3`GxQOT?DJzD!0Edf= zh{TKc!US9*bP>~V5w*9qHMMhrh&q`Xx|o{0a<_D`cqJhztDyc79UlUD1(AIJPQ_z- zcg|Bso(o`glihBfKN|~Dn4V1gwnrmArHb7 z`6Pz)IzR51d3;ChCX%t3_D=dseKKRq@z19{e+G?9s|(ssun~q~(JXRj zBtu)sHCX~HVEa7u5$O=Qw&%oUJ?-&D#S0dJ3usX| z5BVsqzy1Oxj?Z;hqkLO6`Q_+qR@MYreVd%OxiHa?^V5SHf{cue8jjOEms%SCnJ;={ zNJ(0*qycJg(kHB~|2k_{&SbI-CdBA!)ml{|rxY*FKa)nA&GEj|QLXT2?stWYzuGR) z`6k=rDLb4?MjeiHc z!`Z~0+gdjU@hb}7C+0%NW#|Cw5;0Rlhamc24{GcW zQT%|o?3@fJ?J#M%iCyBOl8%N`%j(qLnzPxn+`+$`DQF z&(}ST;r<;8wRhvi^;|yceD38*)R*WPQ)lOSBe>Yr-3E6*`vXjAxDNZEJ@n8u#mAPHnsgnmSUloKYO*EsoGQ(L_<^axI|q)-97T0 zQeW2era$d#8Y11GWw>pXS07#~>2Tm@w3ma8@(^UPHT}u;-I+PNXkOQNXJQR4t;3Q8 zmce>+?_$`j$xMW=Od8+(Di0I=MmuzVS)>;?k<)b}>+D2II1WuAePpP~mc6`sAeoEh zo{x{%b1>V^dHV?gUkxIduJ)`SD9^kE@r{Zxc}#yybt+EuN3wb@TM*UqXED&e5?Ug9 zLFV5#@W8L;7%8Uzd-`mK*LfccZ7vx}pDQr!{6Q_to6$e5vj+uF&>%g}TvSK{SLE-` z5_L&mj@~|__A#>S&b0ITENrH%rNKZkZw&WBqptE6yAs)^@b|cu7=<~*?oQ3(>TKN0 zE&8aaC?2O}WdF9=%qn`4Gz7QXAB!KM&Ug};)^pJYThmvpkhssEGZi#PhO6y$0EPBLqfK)HF9O+y=yTx1l(>j@T=E(ppTUDx=OeIas z!(|JE)19`noxIz_J3H!cFST|BET;L9JdP}z<{Bdx{6?G@o!IyI1eLc|I+K0tXKeFj zZerbuFPq;)eZ1p$J~1N__GwNse>l2uoApah6{=10@r6J2g0ewb4c?Yas9N3hTAm#1 zNvw}@nz{Ik_>+{xqqMl)BYhjTYB0ct@{ua`-_0)mGmVPT_Zq<-zej zzp~}TcoK$MW4E<^;qv5>v%q`?l{8+{r||I43x2{q&1S(1RRgi8akI(Vrp!40Ol09O zQuX?z3dg>jlw5vvW}%-iPswSxQFJ?~P^UInP3B(d8g{im{oB{Kcr7biyQW4ZAu-cx z+vpU`=lXKETAd${<<|SH>uh<;`?TgZux9v8HGYCpZfbbu1091~UuZVx3SQRDP7KoT zlv{M&bl|_&m}FbNm&uTu6JOi!X?_q4IvRU&ui9Vm8jjkP8EwYk*kinqw@|k}wFOpa-S5ZZ zcOg1mY1#Gi!4EfBq{V&V;cv)}a2qTG13?sS#@$c4H(0si)b3kW7RAs8%ktjbCsIK^ z=dD)h8g4sn)0yGs1?*s3JhtePDw~bVFYFEYO{XR787-@|9w&X(8cjyHZs+}z)BJNo ztmgeqb9-E>Id|Rs=m_TrHnR~dO}AfHXa=yFoFwyRKDNBov!nK`O`sl;(#~Oe=c1>wYp~dBgwg^aOFdh+K+^UuKpDM%M&SN=<+?K zFgNy&mg}I#Od@B;@b5fk=Y>P_`I)6PVr~C4hgd02d9>|!@VRxkr0x?+N>^?d4}&{s zrU=qzYE_z@6-KSK?9R;7*k>W#(7Z8x9k*T`2>SLeunf&eX{d~tN7e%bg2FJST{@6ObdbsI}79Pf9Wf~jh!wrFGM zlarA<&B2s}IRA+=S(_qY`7x!zF!=J+EcRqqIF&2U+3c@154VkJnOz{;IH!5@2)pX; z?KRC4{cDM(u2&p5+TJwVqb#URybtImqoMay^fh%{-yR_ZznDisFYH2?|IN{xJ zMn$=ya}yJ@IB!2@qq^kG)>6tMxdCkyA1<<^a4#&sG$lmXz7uu&PgB|rl(D!vc63mQVjgMCn za@hoRy>(Ny>p2^(Xx(X)O)@f7P3j=Eqe|@|_w@7}E!G`a^*plKjW9QM=ZI4?6XY^q z*mq0H&%aYD#z(L6^76_YnvAO>5rf}GM@Of{m1;=hrgPQ~BULxMk(y~f)+4J)u_l7`Q;(oV6v;lWp`|i{0XxoOvN|<~eLno#<u|chXLXcu)H%YC4sk-6xn@ssOr+e+pzz(18$F6gnP2~M+9~1(;M>Usr4{1U&Q~s)tKQlEgE8H%+b6`jzy@08gr1~_Th|1l*2<+(2zYN8tjj@@p z3t7w?DED&Zp%4$xN`EU^Zbs_C;RN$eJJQg?JEvB%pUu?MMZ{zB3u()CQ7gVLyG2u= zRiGV9SD53HZ6Dtge#2?;q$e);=q|E(uu+=^(sXTw!aZWQG+h&?xdss!cf2IA6&1TF z8X8^R^HeS^Ev0ri#!20sfSRWgiv30rz4GaS!|_iUoYhH*=Q*OfJ|mN977~=2>!_c@ zla_wzcgY%M-icvoxmmw^Ll*^i=MB|{D#5rCs%%e?AsyfRgC}cNk;#(E?cM8TRmc3i zn}q+O44@fb9h*M>JWblJrcr|P5cKfOvU|BbjK^(R;DLa>Vz#a(aO2|qu3+=*qll%> zd~zL^?R}hjpuS00l-Q}Sldz{J0_nkKPblk%0xgaiiG+8PUT5iw`3G6qEX|SD1JT~U zA86?AQC;u1;Z#SBHSg}#&2~2y%$wmu=kVgZrYqR`5bF(&)2t6>9`Fr+CdO z%eR~WdSYZ8eR>(0?pu$S4KqJ%zH1&SP)GDSw~3TxvgY!uK+*joZ5X>(N*fznS816X zE>8ikrXva)Rrk8fZ*sYPvI~8@{r`QwB#n_G{Urs{lsZK&QA9Rsgn<_^w%%8g5)y0^+&k$uu%TT zVx}W0&F?-q{3Ul8<*8_~zP#yl1=MoYDqJaVwdfg{!~N~E=?c$paZCc9=8hU)yz-5- z!2qqfZPtYA&kfA2dsaw%Jnhf4*thAYs2%Ymqtc+NOUC~e$oy&hyAIpk$t$!<>xoQV zZF{v~e+3>&Z3P1zGs#Ku{$$=xpz2lx0+lKrB`wb7@Q73OhQa!uZYIMcv`D*oo-$w0*{@XmYBwsti!DeSz zzgYUK<3qZpt8;_k>OUb_5V2re3p?$k`tV9y>lXsPPxfXiU-8pK#ujjuo6hKgK}pKV zk&^INP+rC!jTYNFOKccJ#3E^E2xSm1x?k?86CJvBnM`8SjaEw1xH$81A14pd%?&XW z)-JeA3q)b{N2SIEsU?Le<+Vx~hcyPW116-9KN_5NS%cSeRsfo-mLXj8 z>Nx-Aqz|<+%dyIv_jM{``(G4cOD+Wa($UhWdPJsY!mWP@ABmg8kKl~xl} z3>2}#EO&BxdU)gGZll(V?P<`6gi&SOnJ4KJ_=o1ZtadOeBSS-3K^l3i;$-^j;^XP; z%+7xpjX(1u3faF~c=1x)yZW{RT zN+#Fsx@ZTg{MovFlN)-a@#FPT)l0r_6l>dJPR?xL_-V{cjx?y+mq%tvcko>E`E~6|-Q1Af$|(zFczDp5znlo;u-RtfV8c7!1w6me9d1X2kLBffs$H&G^rZFa{HaQDFf z85aADBIFF_#$*lP)k4EVOUPx#OU7^)2`jT-4P-*mucG~x7*hZ!LhR`!TtV?(+Hs3= zD=^7z9U6-3!j||BEupfxg2tlbN%u4h;pV8&uGL^I!+lRp74y>*8i?>mu9RwrN&6qS zBytw|9S9P6Rm4sl`#z7`X4<$rOjs{69Ct2xWitg`D|TjJ3Tr>`)BD0Eod@fTjz)d< z?3gM>M1c1AxU9xwAHq9j*&&Sq_Kt&-C3E=6_cM+CrsVDEfwDXm|GU7|J$PG@(8QkU zX}kqDc}Y2O7+O#!>+nQ3Bv|vmTk-V?nvF~4qASuFdItTRFKClCM<|n-s?d>+A zwl&K3^h6Zi}WCDF8$Wha&u4@f$yQjbzi(9s$h&%ulb)u78 z?M>Qq7B6uS_38GN3q`?Y#J$A8@xNXBTGVR(6U1BZ!?{U?S_83`HL=>F5yqt78Z!>sfU~3y*63GH-5^B1516mC*U!7MKbNac(swb(H+asaYY~db#PF@>tb8>K(FyR8k!hPDWUOxk2^qK_$o$E z(0iy++dYm^?~_&$SAxCWTwGjSp=SAKxI4tbN@;bWhuagSo?4G1^1JIZ;}d8S80q@u z(aJXx{y6kK{x=T4-@5HhtFE6TG!j#;=!%3Q@@sGqp%I0D{u6@1?sMs|vNCL!=6g*j z5lL#=GtTs$Gy)7Blaw?FP$ddKc_hW)Jf|+T52~g232VTu3ox1sFqSq;B*J%an6&ZK@zv#$1wKYcV?%g(c`qxDU!N;6LUj4umsaG3 zay(DgA<6vi=>Ed~=whU7)_23(H=Yjz9mknjSx4SO1KACkw#7dIqN^`+ToG?*Y?LlC zU*bp6thB;?@!~~=?aVk&iE&88(`V0EH}l>B?lM1gLIKW3`|xz}>4Gt9NLYE;R1Y5y zkHg+H=j_~^Y-_g1@3zj)k$QD|2r2@+S0gE`?3g4ERQ@`jn4~0YpXB7^Zy_NeM~>0d zvLB?R*u3wCaac+mS30P=*{k=n+b9z`ES1azcgBm2cPC4!GoD}`DL(CiGSM(Hq9RHl zt`DTiFEru$zalp=Ljs2&==0}phIdGYaozW7&^kVPRsv-Iy&C6@{@wY;B&eQOUa#rw z?Chn_$VSIut#6Y^#+!NW-2UMlUVeUTe0=j=&bE$@<=thQGC9v3XpV=cqobo~oVwy% zad9ztCT`joZnDbv<-j*T1aE$CYD8Hsxr?(i(?1<(1gHq-dvl%N772-k9UEHRwD79F zeNT9OoMk71RPIrIxUO?rD^;Y-WXxDwTf4fx&cjnjW2q`rcVyXFvodNyY@NPHE>oR?wJ}n}3fLs3!<|S4r|l zL`2wJ8(}AL*&1CPuXT8W=_lV-!AVF+ShYS;q{UgQQna%xW>pEo%;Zz;c_>|7T_s?7 z5!{U5-;K+l`Nkg(ArNk1Joum@ERK-f4YlqG$;ap?k{>?&&MHMz&Xwcr$G9|yfO-1- z?Hg*QoP?@|x#h?${H-RK7DIUqc!R<8cb7LeNrlSu*D%l9qfSCT7h1lQh+G8W;IuUT zyfsyoi<1Fic`q-%m5y)<8k&&bT_35sOUuiRjoZX;?{2&L`l#N#`3_15E1d(D;M0$KTv9bw(@WP;EcY0H$6!q5dn%e{M(Tn*{#vMXn{Zxq$65H>D7!6 z(Ve<=Zh0y{ZLZewkr{1SWtZbswTlV~KZ!xxpv#hEpJ zgsyVTTnI0x(fz&%H)+b|cHVzf%7eTu7>l+_X=%S~eE)C`58mdO5#@E;pK)V4CY7(k z#i4poiS;p!s8R~u1M%W2h-?cJF`F^#=5grV3VzJjR)emdi72N#1i~w1#^i=ILOie} zg<8V6YNOh8q~!hm{i7xN3zQ~)S8Mp(mguov#!@tfn>@Z@<-Q3*3QA`}O);t`y z5#hdv#xXUP4m5w%DiY6iByXR`$FHx;p0HJ(EFTI~%B2$aN15JrL3X(Uhut$S7<1VW zIc`}nx@=w5!6y>{5vwru*kgZ+}xMBJ1%_XA~4#3RKIIW@r&aQuC-U1G+d5nt9GMO z&yaC8&k&GZ_)ezU3t*0CK z1$KcB>LDtx>WIX>H5bj#w4vtLs~|gG980cr_HnL*z8e6n_^)sGe|r26Sp3Q6eyVFY&(r{0dqk76zbL6_9GS0^ zE0Tc$sMG~}^ItIXpR(}JE&qj;`{h=5mdn2e-&ij3{|83CZgKMd`Hh(KxM^4A!fuY& z;qW*7U0YD_XUQ6**OVGx({MWF3FHAv3?JFu+q0aj<75{x8~mx5WwpQ>E)M_pKll-2 z7W+T2G3cqZ;!gk?3CScT$M?}pQy+Idvm_5;{b!z7k z=H*RDc+I{wU&Non?`qcZjqvf97B)Nn5wCOGl1iKR1@-O~neXX~xq8>!hv++A*XVP&F;4W4ch4lQBnqNjpRBrUla4Y z?Jtg!P+-XmAR;9-RUB_o;f<-ItK(W*7d8(sFB~{L zf$|JwMl9`dbw1+a2#wxn>yrna-*(b?y%7)*5syz!EO&<{R~=8x`o7c?BPuNUCCyX; zS`@9JHS^;~78Mgy(XlZjb3b#emJlo5i@=uOYdz2eAzMC0Ma7!>dTcT>d4TWX-VmT} zo_WP|H}fk1eEQ30%Bi)r)xp8V;QsdNbZ@45ng~X#@|8JjZGD}HEKR^ODi{UNX?v8; zZm#ZGfE0{PbD^aruxdiT!0zVHEV--!Bp@4TJs>+3SZ6$DfSM1*1G|H=Zu-<@1+CAW3D;L zCSvwkqb_5|{)_deGdwHDnR7@#&ug|<+#!7+(>DWG72mD@buJVXj!bovwWj>z0cGBxCN0+q1sOO z$&)9SN1bHSMcj*Na02YtgaD3yBl9h`NU~2mAD^)=_2@Fnkx38%=fHF5KXN_pQe z?#!cil67t0-IAP3{KHRBnF(S^8{8e;=q{9GhJ+=)<{!1^uuuX}c@bU68&yPb9BeW7BtGSZWomF9 z11(ErjAzbmu^2Bz6a#2gyIUO;=@sZ>Xk(?y{h@l`#jaS4{&dI~Fr_b2F#3iE_1`~L z=vC-rIiemLg-T|%h~dF|mX7;R+S`Sd8SLJzNd=D-?`%IO1`0b7Ns)wG9T>-#oRR9KjwUCht40azuYUPHXT|6T0ut&fkdZvuxUmgr~HAL`#Rm+wzC zKv$SLOVdStDO5=9u8G{Kq9PSzMMdwr1Y-du!0lkFZ*wS17U7Voh_Rq>J7$LtVq#`i z<~Qe+Bb(F_>Fr;5T(_T{45$>VVe3;p-#t~eVy!R09Q04V4Ft5JXFwk1wUmFB9}9f~ zzdf_`yzVEU?7RBe*f6r(olt32+K7d%Ga(&fEOvyyq;5>YWl&q3YfY-Moj$&EU%+mn zPgY~n9x4@;KqnKj(NQazC^u?H<`W$H5;xEE937pSpTB(70z+Myk$P!?@D2ZuM&@H8t!f8qJH`Rm*d`tkLB49g<~}tx3YMGqnQhfeCtR#I9P=|G2OlZL1L9z-ILQ$y zcupYbeNIVE{t1Ap*qXu$k0T=>281uIZ)|ja#bt=+cQ1CFO7pw^(&&AmRH7%SR;bbP zjgb9vD>qFlCicgV77zv59LxypGG%by(Q5MH{qf_+?cpB`9zMP@hox4mHJ_WkYVetU zU|5S&JhL&lNk^%_)Pqrt;57&?Sb!q?UkhzN)+YrU=% zL-}Pzn*V)5mPF(eOiaw*KvjAquniI_OOW)9Ys@^E!FQ~Q7B~JP^TQN%#SdQi6LO_4~M!@x7%KwK(=dy>cjLTy&}h*10DwoQ9XegK_pkKncF;5o12j?KV%E7(r?jlC;jv%2 z^=fE&Rkw|`$Kv&AKk7Qsrr@(8bI%W#wXJ|kv*L7gbac8u_VVKMK8K6-hosKw@9`e) zWLOSPPRlT;p3zckFx5I0HTCk=mZi^Zh2;nq{Eb+~69Z#oQ8~GYE}y`bfEI&S{QOCe z*pramET)bGcMKOm3c!hbW+P2|;*MHTSmJ|_e*Ej*XzH?!dO;vVCCQ`_^CYkucVc?-L@^wx z^EjUaz4@8DN=Q=D%Mfx5N2+_|qvuBeLSdz0`cKS|5)=3O-=B~%>o?g6f&7GE7pH*lvnGd7_CFHQUdJYT;Ov_Qn zOZ#{kGGRXfFn<(6LaCRR9*-p)2&V@>Ba)Meg>DZ;AEmt%eMMcCrb}`l*HCeB#U*ju zV-XYEl==Pnj5gKmFZ`0r=8Y$MM{)3U(op^fCyob*KLR?zhX8*_Um}-rcaJgwZ>E(H9=~C05SHMl zsdDp?GE-?jx7`omkbrGxI9{k3OJBWNV6r`4)B|QdG&Gdfwf5__*V&l*)^sI9qt{t$ zPftPHT3%*q8{jp)paON@UY)=Z2>I}2iHEn&&!_S_uOEW(5kl=j+pTxoTkc_LZtLj@ zyFS|~H)wfszCWkEF9a6Ldc4r^Vt;P5Ks{2(_xg>+U^%7K^z!{>^CWppT@;Nt)Q=4TxVP!hdXpXK1)#Zx=LY;qR&Ij<0B0046{}&NG`dyp#&~Rb5#Kc4cWIU@+RCK&u zg=D^f!yZ{gNgDzx``^6tUuyf$<5}~uYf*h5rVh7WC<1}V@+pvTupcdkNBWszQ?Wl+ z=e)T1kv~;m^(_8`_yZuIq+bo5qo5hz1|30?BZUUG#|n5Im!E1C;n~~Ur+V-6UZ3w+ zt7($(yR23lH;>hP9K1R54G*ti=BYZE-|i2&O)u=W;Nf zLKOy0S1XWRPtvZ2!Kfbh$=e4wm%ZUwu;Us=otX6+J~aE?P2R4Vfsyk1-SU7M4+Df3 zmH5qfP>o}28{e@Yc6mTCms=hWf1r5Q(&5q{R5GDip!m+1r}=dZWl2nxxuX0Cp#Xyq z3JJ*?vH-jk0*L9yptc~k9>^mh{-3GoqYPx!EB5GK2rld`fo)%?UERNXCS7nam?7%( z@aJN8t{PfX!!ur@ZO^taTgUBF^AQZK)OAM4(P3#6&5c(M#BSA z9TXJw#`oH#Uo6eIv!5jSdPSvnPk_SY^FIrs@ISU>RVTW_&9X3WQFkNe4g*uuX8{Fa z1&+0C+3z7<=bMsk5-&VFJ>kAbMYVnhIiTwu#T7oWp15|@~APO@&V-gryPM{t{^{e3$u>UMZ)P)xx_fH!zUFt~FDatsF_Kyq$qEel8t zD=Vw3CISKi-y)MZEJc)*qNe`w4?u!|SuwTNm4=FX2-HNj9nESt5-`P_&v63)o7ZTv z;Wacg~AvS~#s`^|4DUQK0>H(U(_VVF^^yw)S>HZ#0le;i>2OS7E2q)6>z>NdT&P zbwL3Gcm{T^0jaWGc&xlF^Zlt^@1ny;e0_bVemTM;1b+1OzF?*BKa@vojFkO`Qf!TGfM3h9t;dkdY1aC2>#HyO(saVN=Vz zG7(1t_y^!FhvQXAYPn>K)My*Z{hl4v+sw(0$mv&uyZeh)GDMPTQ%uY^U3f z*LuQFsAUu1kLJ;`v9otgtOH`#ZTq-7#(;~ycg>G`Fz)K=V$~x@_Gd|sWl$?KxPJm% zsiq>71xtJ;cC%dqmuGxWXr4uV{~jP=i~;C@RWjM(03?<04i$*m?^7c3e*v@T3h}a> z(T4C(Dk;M6^ml=W7Z==`xeaI1CzmUc?7*4<3cEa-AF{A;vr8qHhPG|7A)1V`=~2EQm^IQsQyHu>gN12_VlRM}JrXfADka^C8{3V-$3+*Bp>)1l&z{5X_;w-jfzfwbq2 z^ybC#JEaukSS-fnelN!B#3|!E{bnKL;LO=1%*Z;xNK|(;U{Awp%mwip^#%Zf>FOS0 zHy@V)2p|-s|EJNE14Q!PW~ijA&??f$=3IbI^3(0{W}nv35f5gntfjSbD9C(|apTnD zDr}~(P*B41dvIY-0C87>0frt6xcg)GItG%jBNZ#1Vrn?z2UCQDN-d^bxs>I}Qe$Es zhwr3!_mU(u7(yC1gm*V?hHarss#UsDF(4PGf{aTKLynaSmeSpAk~;hQEG##d1{^P^ z!LK0<8h)2ci1V74=->iyr`W8|8B=|ZySzySunbfujag5WG=PBz$j!4n?vq2Sp&yFa z>xRY~a%vG@M>%kls{K2|U*@5b3d92-qOKVUtn&=Df^dHfVxG4a7PPFatiXR|1C_WV zg5>6}fIbjn*ZSR^o!RH*KYaKOuQR%9!0UXC%Kpjxm(3I#pZiwt(w~s$sieK?`o3a4 zYD|6fqOIu&2w{ZKRzUaw#)G5i9LTmWkH|LP{vbU-B}A8!#2xjwucy6OkD+PaIi@X} z@>5{$!kH;+@N&r!?wCIG_b5Gco6ch8gr2eGrqcE4)*rw-pQE6x)NZ7Co20TxGxRuZ z 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 literal 21135 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

!>ppD`ycB)$;_JS?M%p8#Y$vf+ zd^`Y6ziMXZ7Ukv^feY2oWVQl!R@Sf!9=eyBRy;mlu_XzRPigqPW{j$wwXqWSD6-4L_yGiztGNsBh9Wwz&O8WP>c__Q@GLj`749ME z@9US~SHN0$#pfHNN)3iYEsPkk)h`;+b$%8oB>(!L<5AAWL)nnPTnQcATqiCG%on*o zO(s5VF7%Tn-I~{X>#oflOB=P<|NP@2a0|DH4osdsVaOO>TLtE!+&hiM`nGkG!hp$~ z)6JTRr_ri_Z}ad70%8+>CN!k0-Zc8FzUK3H=<7o^fxC#TKHXRel?sXEQSN=%#pR!& zr%LEw7k9bdaida!_g{pt1DPy}T}PHe*C2Y+c)B<{yFP62p;Rh;@xrCo7pVW&(vb5$JS#fK9;ktd{g}}m#%81n$s3-U_tU7smXNL zi%V|JNemGT0C!`g21rZ+`vRm*ch=Y~ypQR5X8L|?a4dMUt%`%l<`heR4ZP{X#@Y=I zdY})HV<~>Nbv%{BQ$&Ds@B>|3Oa8UGczSkr=Jz6ZDH(}C1ZYb25GghHA@2WW%imqzlFZ$BfGaDq*Mj2>Gri>c zLs|Cmc~}G@Ph}i}Uw_}g|K1>Wb{n9 diff --git a/doc/salome/gui/GEOM/images/measures2a.png b/doc/salome/gui/GEOM/images/measures2a.png index 3068f49b196e2092a190ac13b284bb72b49b41bd..718c60f9044d47e8b0ccb09697c44ee201867b63 100644 GIT binary patch literal 8572 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 literal 11085 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 W38f+4B-oi&IH0tWRH=lK|NjDYUse C1 criterion option and to set the Angular Tolerance +to check C1 continuity between neighbor edges in a wire. -Press \b Apply or Apply and Close button to publish non block solids and faces in the Object -Browser under the processed object. Solids and faces are published separately in two groups. +\b Preview option shows non-block solids and non-quadrangular faces in the viewer. + +Press \b Apply or Apply and Close button to publish non-block solids +and non-quadrangular faces in the Object Browser under the processed object. +Solids and faces are published separately in two groups. If no bad sub-shapes have been found, the corresponding warning is shown. \image html measures2a.png \n TUI Command: -geompy.GetNonBlocks(Compound). Returns a tuple of two GEOM_Objects. - -The first object is a group of all non block solids; the second object is a group of all non -quadrangular faces. +geompy.GetNonBlocks(theShape, theIsUseC1 = False, theAngTolerance = 1.e-12). \n +where \n +\em theShape is the shape to explore, \n +\em theIsUseC1 is the flag to check if there are 4 bounds on a face + taking into account C1 continuity, \n +\em theAngTolerance the angular tolerance to check if two neighbor edges are + codirectional in the common vertex with this tolerance. This parameter is + used only if \em theIsUseC1 is set to True. + +This command returns a tuple of two GEOM_Objects. + +The first object is a group of all non-block solids; the second object is a group +of all non-quadrangular faces. See also a \ref tui_get_non_blocks_page "TUI example". diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 8863bae26..890d9b52b 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -2781,12 +2781,17 @@ module GEOM * \brief Retrieve all non blocks solids and faces from a shape. * * \param theShape The shape to explore. + * \param theToleranceC1 the tolerance to check if two neighbor edges are + * collinear in the common vertex with this tolerance. Negative + * value means that C1 criterion is not used (old implementation). * \param theNonQuads Output parameter. Group of all non quadrangular faces. * * \return Group of all non block solids (= not 6 faces, or with 6 * faces, but with the presence of non-quadrangular faces). */ - GEOM_Object GetNonBlocks (in GEOM_Object theShape, out GEOM_Object theNonQuads); + GEOM_Object GetNonBlocks (in GEOM_Object theShape, + in double theToleranceC1, + out GEOM_Object theNonQuads); /*! * \brief Remove all seam and degenerated edges from \a theShape. diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 06cb15a74..22961d63e 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -407,6 +407,10 @@ Please, select face, shell or solid and try again GEOM_NONBLOCKS NonBlocksGroup + + GEOM_USE_C1_CRITERION + Use C1 criterion + GEOM_CHECK_INFOS Object And Its Topological Information diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx index cca9f381f..8eb8f09da 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx @@ -88,6 +88,7 @@ #include #include +#include #include #include @@ -103,6 +104,147 @@ #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +/** + * This function returns Standard_True if the face is quadrangular. It means + * that it has only 1 wire with 4 edges. If there are more then 4 edges in + * the wire and theToleranceC1 is not negative the new implementation is used. + * According to it the face is quadrangular if it is quadrangular according to + * an old implementation or if it has a single wire with more then 4 edges + * that form exactly 4 bounds of C1 continuity with the given tolerance. + * + * \param theFace the face to be checked + * \param theToleranceC1 if negative, it is not used; otherwise it is used + * to check if two neighbor edges of face have C1 continuity. + * \return Standard_True if the face is quadrangular; Standard_False otherwise. + */ +static Standard_Boolean IsQuadrangle(const TopoDS_Face &theFace, + const Standard_Real theToleranceC1) +{ + TopExp_Explorer aFExp (theFace, TopAbs_WIRE); + + if (!aFExp.More()) { + // no wire in the face + return Standard_False; + } + + TopoDS_Shape aWire = aFExp.Current(); + + aFExp.Next(); + + if (aFExp.More()) { + // multiple wires in the face + return Standard_False; + } + + // Check number of edges in the face + Standard_Integer aNbEdges = 0; + TopTools_MapOfShape aMapEdges; + TopExp_Explorer aWExp(aWire, TopAbs_EDGE); + + for (; aWExp.More(); aWExp.Next()) { + if (aMapEdges.Add(aWExp.Current())) { + aNbEdges++; + + if (aNbEdges > 4) { + break; + } + } + } + + if (aNbEdges < 4) { + return Standard_False; + } + + if (aNbEdges > 4) { + if (theToleranceC1 < 0.) { + return Standard_False; + } + + // Check if a wire has 4 bounds of C1 continuity. + BRepTools_WireExplorer aWireExp(TopoDS::Wire(aWire), theFace); + TopTools_ListOfShape anEdges; + + for (aNbEdges = 0; aWireExp.More(); aWireExp.Next()) { + const TopoDS_Edge &anEdge = aWireExp.Current(); + + // Skip degenerated edges. + if (!BRep_Tool::Degenerated(anEdge)) { + anEdges.Append(anEdge); + ++aNbEdges; + } + } + + if (aNbEdges < 4) { + return Standard_False; + } + + // Compute number of sharp corners. + anEdges.Append(anEdges.First()); // To make a loop. + + TopTools_ListIteratorOfListOfShape anIter(anEdges); + Standard_Real aPar[2]; + Standard_Integer aNbCorners = 0; + TopoDS_Edge anEdge1 = TopoDS::Edge(anEdges.First()); + Handle(Geom_Curve) aCurve1 = BRep_Tool::Curve(anEdge1, aPar[0], aPar[1]); + Handle(Geom_Curve) aCurve2; + TopoDS_Edge anEdge2; + TopoDS_Vertex aCommonVtx; + gp_Pnt aPnt; + gp_Vec aVec1; + gp_Vec aVec2; + Standard_Boolean isReversed1 = (anEdge1.Orientation() == TopAbs_REVERSED); + Standard_Boolean isReversed2; + + for (anIter.Next(); anIter.More(); anIter.Next()) { + TopoDS_Edge anEdge2 = TopoDS::Edge(anIter.Value()); + + if (!TopExp::CommonVertex(anEdge1, anEdge2, aCommonVtx)) { + // NEVERREACHED + return Standard_False; + } + + // Check the angle between tangent vectors of 2 curves at this point. + Standard_Real aParam1 = BRep_Tool::Parameter(aCommonVtx, anEdge1); + Standard_Real aParam2 = BRep_Tool::Parameter(aCommonVtx, anEdge2); + + aCurve2 = BRep_Tool::Curve(anEdge2, aPar[0], aPar[1]); + isReversed2 = (anEdge2.Orientation() == TopAbs_REVERSED); + aCurve1->D1(aParam1, aPnt, aVec1); + aCurve2->D1(aParam2, aPnt, aVec2); + + if (isReversed1) { + aVec1.Reverse(); + } + + if (isReversed2) { + aVec2.Reverse(); + } + const Standard_Real anAngle = aVec1.Angle(aVec2); + + if (anAngle > theToleranceC1) { + ++aNbCorners; + + if (aNbCorners > 4) { + break; + } + } + + // Go to the next couple of edges. + anEdge1 = anEdge2; + aCurve1 = aCurve2; + isReversed1 = isReversed2; + } + + // Check the total number of corners. + if (aNbCorners != 4) { + return Standard_False; + } + } + + return Standard_True; +} + //============================================================================= /*! * constructor: @@ -1647,7 +1789,8 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, TopTools_ListOfShape& BLO, TopTools_ListOfShape& NOT, TopTools_ListOfShape& EXT, - TopTools_ListOfShape& NOQ) + TopTools_ListOfShape& NOQ, + const Standard_Real theToleranceC1) { TopAbs_ShapeEnum aType = theShape.ShapeType(); switch (aType) { @@ -1656,7 +1799,7 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, { TopoDS_Iterator It (theShape); for (; It.More(); It.Next()) { - AddBlocksFrom(It.Value(), BLO, NOT, EXT, NOQ); + AddBlocksFrom(It.Value(), BLO, NOT, EXT, NOQ, theToleranceC1); } } break; @@ -1676,41 +1819,12 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, TopExp_Explorer expF (theShape, TopAbs_FACE); for (; expF.More(); expF.Next()) { - if (mapFaces.Add(expF.Current())) { - nbFaces++; - //0021483//if (nbFaces > 6) break; + TopoDS_Face aF = TopoDS::Face(expF.Current()); - // get wire - TopoDS_Shape aF = expF.Current(); - TopExp_Explorer wires (aF, TopAbs_WIRE); - if (!wires.More()) { - // no wire in the face - hasNonQuadr = Standard_True; - NOQ.Append(aF);//0021483 - //0021483//break; - continue; - } - TopoDS_Shape aWire = wires.Current(); - wires.Next(); - if (wires.More()) { - // multiple wires in the face - hasNonQuadr = Standard_True; - NOQ.Append(aF);//0021483 - //0021483//break; - continue; - } + if (mapFaces.Add(aF)) { + nbFaces++; - // Check number of edges in the face - Standard_Integer nbEdges = 0; - TopTools_MapOfShape mapEdges; - TopExp_Explorer expW (aWire, TopAbs_EDGE); - for (; expW.More(); expW.Next()) { - if (mapEdges.Add(expW.Current())) { - nbEdges++; - if (nbEdges > 4) break; - } - } - if (nbEdges != 4) { + if (!IsQuadrangle(aF, theToleranceC1)) { hasNonQuadr = Standard_True; NOQ.Append(aF);//0021483 } @@ -1732,34 +1846,10 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, TopTools_MapOfShape mapFaces; TopExp_Explorer expF (theShape, TopAbs_FACE); for (; expF.More(); expF.Next()) { - if (mapFaces.Add(expF.Current())) { - // get wire - TopoDS_Shape aF = expF.Current(); - TopExp_Explorer wires (aF, TopAbs_WIRE); - if (!wires.More()) { - // no wire in the face - NOQ.Append(aF);//0021483 - continue; - } - TopoDS_Shape aWire = wires.Current(); - wires.Next(); - if (wires.More()) { - // multiple wires in the face - NOQ.Append(aF);//0021483 - continue; - } + TopoDS_Face aF = TopoDS::Face(expF.Current()); - // Check number of edges in the face - Standard_Integer nbEdges = 0; - TopTools_MapOfShape mapEdges; - TopExp_Explorer expW (aWire, TopAbs_EDGE); - for (; expW.More(); expW.Next()) { - if (mapEdges.Add(expW.Current())) { - nbEdges++; - if (nbEdges > 4) break; - } - } - if (nbEdges != 4) { + if (mapFaces.Add(aF)) { + if (!IsQuadrangle(aF, theToleranceC1)) { NOQ.Append(aF);//0021483 } } @@ -1771,99 +1861,6 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, } } -void AddBlocksFromOld (const TopoDS_Shape& theShape, - TopTools_ListOfShape& BLO, - TopTools_ListOfShape& NOT, - TopTools_ListOfShape& DEG, - TopTools_ListOfShape& SEA) -{ - TopAbs_ShapeEnum aType = theShape.ShapeType(); - switch (aType) { - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: - { - TopoDS_Iterator It (theShape); - for (; It.More(); It.Next()) { - AddBlocksFromOld(It.Value(), BLO, NOT, DEG, SEA); - } - } - break; - case TopAbs_SOLID: - { - TopTools_MapOfShape mapFaces; - TopExp_Explorer expF (theShape, TopAbs_FACE); - Standard_Integer nbFaces = 0; - Standard_Boolean hasNonQuadr = Standard_False; - Standard_Boolean hasDegenerated = Standard_False; - Standard_Boolean hasSeam = Standard_False; - for (; expF.More(); expF.Next()) { - if (mapFaces.Add(expF.Current())) { - nbFaces++; - if (nbFaces > 6) break; - - // Check number of edges in the face - Standard_Integer nbEdges = 0; - TopTools_MapOfShape mapEdges; - - // get wire - TopoDS_Shape aF = expF.Current(); - TopExp_Explorer wires (aF, TopAbs_WIRE); - if (!wires.More()) { - // no wire in the face - hasNonQuadr = Standard_True; - break; - } - TopoDS_Shape aWire = wires.Current(); - wires.Next(); - if (wires.More()) { - // multiple wires in the face - hasNonQuadr = Standard_True; - break; - } - - // iterate on wire - BRepTools_WireExplorer aWE (TopoDS::Wire(aWire), TopoDS::Face(aF)); - for (; aWE.More(); aWE.Next(), nbEdges++) { - if (BRep_Tool::Degenerated(aWE.Current())) { - // degenerated edge found - hasDegenerated = Standard_True; -// break; - } - if (mapEdges.Contains(aWE.Current())) { - // seam edge found - hasSeam = Standard_True; -// break; - } - mapEdges.Add(aWE.Current()); - } - if (nbEdges != 4) { - hasNonQuadr = Standard_True; - } - } - } - if (nbFaces == 6) { - if (hasDegenerated || hasSeam) { - if (hasDegenerated) { - DEG.Append(theShape); - } - if (hasSeam) { - SEA.Append(theShape); - } - } else if (hasNonQuadr) { - NOT.Append(theShape); - } else { - BLO.Append(theShape); - } - } else { - NOT.Append(theShape); - } - } - break; - default: - NOT.Append(theShape); - } -} - #define REL_NOT_CONNECTED 0 #define REL_OK 1 #define REL_NOT_GLUED 2 @@ -2086,158 +2083,6 @@ Standard_Boolean HasAnyConnection (const Standard_Integer theBlockIndex, return Standard_False; } -//============================================================================= -/*! - * CheckCompoundOfBlocksOld - */ -//============================================================================= -Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocksOld - (Handle(GEOM_Object) theCompound, - std::list& theErrors) -{ - SetErrorCode(KO); - - if (theCompound.IsNull()) return Standard_False; - TopoDS_Shape aBlockOrComp = theCompound->GetValue(); - - Standard_Boolean isCompOfBlocks = Standard_True; - - // Map sub-shapes and their indices - TopTools_IndexedMapOfShape anIndices; - TopExp::MapShapes(aBlockOrComp, anIndices); - - // 1. Report non-blocks - TopTools_ListOfShape NOT; // Not blocks - TopTools_ListOfShape DEG; // Hexahedral solids, having degenerated edges - TopTools_ListOfShape SEA; // Hexahedral solids, having seam edges - TopTools_ListOfShape BLO; // All blocks from the given compound - AddBlocksFromOld(aBlockOrComp, BLO, NOT, DEG, SEA); - - if (NOT.Extent() > 0) { - isCompOfBlocks = Standard_False; - BCError anErr; - anErr.error = NOT_BLOCK; - TopTools_ListIteratorOfListOfShape it (NOT); - for (; it.More(); it.Next()) { - anErr.incriminated.push_back(anIndices.FindIndex(it.Value())); - } - theErrors.push_back(anErr); - } - - if (DEG.Extent() > 0 || SEA.Extent() > 0) { - isCompOfBlocks = Standard_False; - BCError anErr; - anErr.error = EXTRA_EDGE; - - TopTools_ListIteratorOfListOfShape itDEG (DEG); - for (; itDEG.More(); itDEG.Next()) { - anErr.incriminated.push_back(anIndices.FindIndex(itDEG.Value())); - } - - TopTools_ListIteratorOfListOfShape itSEA (SEA); - for (; itSEA.More(); itSEA.Next()) { - anErr.incriminated.push_back(anIndices.FindIndex(itSEA.Value())); - } - - theErrors.push_back(anErr); - } - - Standard_Integer nbBlocks = BLO.Extent(); - if (nbBlocks == 0) { - isCompOfBlocks = Standard_False; - SetErrorCode(OK); - return isCompOfBlocks; - } - if (nbBlocks == 1) { - SetErrorCode(OK); - return isCompOfBlocks; - } - - // Convert list of blocks into array for easy and fast access - Standard_Integer ibl = 1; - TopTools_Array1OfShape aBlocks (1, nbBlocks); - TopTools_ListIteratorOfListOfShape BLOit (BLO); - for (; BLOit.More(); BLOit.Next(), ibl++) { - aBlocks.SetValue(ibl, BLOit.Value()); - } - - // 2. Find relations between all blocks, - // report connection errors (NOT_GLUED and INVALID_CONNECTION) - TColStd_Array2OfInteger aRelations (1, nbBlocks, 1, nbBlocks); - aRelations.Init(REL_NOT_CONNECTED); - - Standard_Integer row = 1; - for (row = 1; row <= nbBlocks; row++) { - TopoDS_Shape aBlock = aBlocks.Value(row); - - Standard_Integer col = row + 1; - for (; col <= nbBlocks; col++) { - Standard_Integer aRel = BlocksRelation(aBlock, aBlocks.Value(col)); - if (aRel != REL_NOT_CONNECTED) { - aRelations.SetValue(row, col, aRel); - aRelations.SetValue(col, row, aRel); - if (aRel == REL_NOT_GLUED) { - // report connection error - isCompOfBlocks = Standard_False; - BCError anErr; - anErr.error = NOT_GLUED; - anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(row))); - anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(col))); - theErrors.push_back(anErr); - } else if (aRel == REL_COLLISION_VV || - aRel == REL_COLLISION_FF || - aRel == REL_COLLISION_EE || - aRel == REL_UNKNOWN) { - // report connection error - isCompOfBlocks = Standard_False; - BCError anErr; - anErr.error = INVALID_CONNECTION; - anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(row))); - anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(col))); - theErrors.push_back(anErr); - } else { - } - } - } - } - - // 3. Find largest set of connected (good connection or not glued) blocks - TColStd_MapOfInteger aProcessedMap; - TColStd_MapOfInteger aLargestSet; - TColStd_MapOfInteger aCurrentSet; - for (ibl = 1; ibl <= nbBlocks; ibl++) { - if (!aProcessedMap.Contains(ibl)) { - aCurrentSet.Clear(); - FindConnected(ibl, aRelations, aProcessedMap, aCurrentSet); - if (aCurrentSet.Extent() > aLargestSet.Extent()) { - aLargestSet = aCurrentSet; - } - } - } - - // 4. Report all blocks, isolated from - BCError anErr; - anErr.error = NOT_CONNECTED; - Standard_Boolean hasIsolated = Standard_False; - for (ibl = 1; ibl <= nbBlocks; ibl++) { - if (!aLargestSet.Contains(ibl)) { - aProcessedMap.Clear(); - if (!HasAnyConnection(ibl, aLargestSet, aRelations, aProcessedMap)) { - // report connection absence - hasIsolated = Standard_True; - anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(ibl))); - } - } - } - if (hasIsolated) { - isCompOfBlocks = Standard_False; - theErrors.push_back(anErr); - } - - SetErrorCode(OK); - return isCompOfBlocks; -} - //============================================================================= /*! * PrintBCErrors @@ -2312,7 +2157,7 @@ Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges TopTools_ListOfShape BLO; // All blocks from the given compound TopTools_ListOfShape NOQ; // All non-quadrangular faces - AddBlocksFrom(aBlockOrComp, BLO, NOT, EXT, NOQ); + AddBlocksFrom(aBlockOrComp, BLO, NOT, EXT, NOQ, -1.); // Report non-blocks if (NOT.Extent() > 0) { @@ -2478,7 +2323,8 @@ Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks */ //============================================================================= Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetNonBlocks - (Handle(GEOM_Object) theShape, + (Handle(GEOM_Object) theShape, + const Standard_Real theToleranceC1, Handle(GEOM_Object)& theNonQuads) { SetErrorCode(KO); @@ -2491,7 +2337,7 @@ Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetNonBlocks TopTools_ListOfShape NOT; // Not blocks TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges TopTools_ListOfShape NOQ; // All non-quadrangular faces - AddBlocksFrom(aShape, BLO, NOT, EXT, NOQ); + AddBlocksFrom(aShape, BLO, NOT, EXT, NOQ, theToleranceC1); if (NOT.IsEmpty() && EXT.IsEmpty() && NOQ.IsEmpty()) { SetErrorCode("NOT_FOUND_ANY"); diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx index 8a03b6e23..34162d6ed 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx @@ -125,16 +125,14 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { std::list incriminated; }; - Standard_EXPORT Standard_Boolean CheckCompoundOfBlocksOld (Handle(GEOM_Object) theCompound, - std::list& theErrors); - Standard_EXPORT Standard_Boolean CheckCompoundOfBlocks (Handle(GEOM_Object) theCompound, std::list& theErrors); Standard_EXPORT TCollection_AsciiString PrintBCErrors (Handle(GEOM_Object) theCompound, const std::list& theErrors); - Standard_EXPORT Handle(GEOM_Object) GetNonBlocks (Handle(GEOM_Object) theShape, + Standard_EXPORT Handle(GEOM_Object) GetNonBlocks (Handle(GEOM_Object) theShape, + const Standard_Real theToleranceC1, Handle(GEOM_Object)& theNonQuads); Standard_EXPORT Handle(GEOM_Object) RemoveExtraEdges (Handle(GEOM_Object) theShape, @@ -148,7 +146,8 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { TopTools_ListOfShape& BLO, TopTools_ListOfShape& NOT, TopTools_ListOfShape& EXT, - TopTools_ListOfShape& NOQ); + TopTools_ListOfShape& NOQ, + const Standard_Real theToleranceC1 = -1.); // Extract blocks from blocks compounds Standard_EXPORT Handle(TColStd_HSequenceOfTransient) ExplodeCompoundOfBlocks diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.cc b/src/GEOM_I/GEOM_IBlocksOperations_i.cc old mode 100755 new mode 100644 index 55a9c3c70..572cdd7f9 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.cc +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.cc @@ -749,6 +749,7 @@ char* GEOM_IBlocksOperations_i::PrintBCErrors //============================================================================= GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetNonBlocks (GEOM::GEOM_Object_ptr theShape, + const CORBA::Double theToleranceC1, GEOM::GEOM_Object_out theNonQuads) { GEOM::GEOM_Object_var aGEOMObject; @@ -765,7 +766,8 @@ GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetNonBlocks //Get the result Handle(GEOM_Object) aFaces; - Handle(GEOM_Object) anObject = GetOperations()->GetNonBlocks(aShape, aFaces); + Handle(GEOM_Object) anObject = + GetOperations()->GetNonBlocks(aShape, theToleranceC1, aFaces); if (!GetOperations()->IsDone()) return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.hh b/src/GEOM_I/GEOM_IBlocksOperations_i.hh index fa457b566..482ea8a8e 100644 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.hh +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.hh @@ -122,6 +122,7 @@ class GEOM_I_EXPORT GEOM_IBlocksOperations_i : const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors); GEOM::GEOM_Object_ptr GetNonBlocks (GEOM::GEOM_Object_ptr theShape, + const CORBA::Double theToleranceC1, GEOM::GEOM_Object_out theNonQuads); GEOM::GEOM_Object_ptr RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape, diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index 93e6da907..652b4173b 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -80,7 +80,7 @@ ## # create and publish cylinder ## cyl = geompy.MakeCylinderRH(100, 100, "cylinder") ## # get non blocks from cylinder -## g1, g2 = geompy.GetNonBlocks(cyl, "nonblock") +## g1, g2 = geompy.GetNonBlocks(cyl, theName="nonblock") ## @endcode ## ## Above example will publish both result compounds (first with non-hexa solids and @@ -88,7 +88,7 @@ ## However, if second command is invoked as ## ## @code -## g1, g2 = geompy.GetNonBlocks(cyl, ("nonhexa", "nonquad")) +## g1, g2 = geompy.GetNonBlocks(cyl, theName=("nonhexa", "nonquad")) ## @endcode ## ## ... the first compound will be published with "nonhexa" name, and second will be named "nonquad". @@ -11431,6 +11431,12 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): ## Retrieve all non blocks solids and faces from \a theShape. # @param theShape The shape to explore. + # @param theIsUseC1 Flag to check if there are 4 bounds on a face + # taking into account C1 continuity. + # @param theAngTolerance the angular tolerance to check if two neighbor + # edges are codirectional in the common vertex with this + # tolerance. This parameter is used only if + # theIsUseC1 is set to True. # @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. @@ -11438,17 +11444,27 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): # @return A tuple of two GEOM_Objects. The first object is a group of all # non block solids (= not 6 faces, or with 6 faces, but with the # presence of non-quadrangular faces). The second object is a - # group of all non quadrangular faces. + # group of all non quadrangular faces (= faces with more then + # 1 wire or, if theIsUseC1 is set to True, faces + # with 1 wire with not 4 edges that do not form 4 bounds of + # C1 continuity). # # @ref tui_measurement_tools_page "Example 1" # \n @ref swig_GetNonBlocks "Example 2" @ManageTransactions("BlocksOp") - def GetNonBlocks (self, theShape, theName=None): + def GetNonBlocks (self, theShape, theIsUseC1 = False, + theAngTolerance = 1.e-12, theName=None): """ Retrieve all non blocks solids and faces from theShape. Parameters: theShape The shape to explore. + theIsUseC1 Flag to check if there are 4 bounds on a face + taking into account C1 continuity. + theAngTolerance the angular tolerance to check if two neighbor + edges are codirectional in the common vertex with this + tolerance. This parameter is used only if + theIsUseC1 is set to True. 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. @@ -11457,13 +11473,19 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): A tuple of two GEOM_Objects. The first object is a group of all non block solids (= not 6 faces, or with 6 faces, but with the presence of non-quadrangular faces). The second object is a - group of all non quadrangular faces. + group of all non quadrangular faces (= faces with more then + 1 wire or, if theIsUseC1 is set to True, faces + with 1 wire with not 4 edges that do not form 4 bounds of + C1 continuity). Usage: (res_sols, res_faces) = geompy.GetNonBlocks(myShape1) """ # Example: see GEOM_Spanner.py - aTuple = self.BlocksOp.GetNonBlocks(theShape) + aTolerance = -1.0 + if theIsUseC1: + aTolerance = theAngTolerance + aTuple = self.BlocksOp.GetNonBlocks(theShape, aTolerance) RaiseIfFailed("GetNonBlocks", self.BlocksOp) self._autoPublish(aTuple, theName, ("groupNonHexas", "groupNonQuads")) return aTuple diff --git a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx index 5c04f273a..6ef248017 100644 --- a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx @@ -25,7 +25,6 @@ #include "MeasureGUI_GetNonBlocksDlg.h" -#include #include #include @@ -33,9 +32,18 @@ #include #include #include +#include #include #include +#include +#include +#include +#include +#include +#include +#include + //================================================================================= // class : MeasureGUI_GetNonBlocksDlg() // purpose : Constructs a MeasureGUI_GetNonBlocksDlg which is a child of 'parent', @@ -44,7 +52,12 @@ // true to construct a modal dialog. //================================================================================= MeasureGUI_GetNonBlocksDlg::MeasureGUI_GetNonBlocksDlg (GeometryGUI* theGeometryGUI, QWidget* parent) - : GEOMBase_Skeleton(theGeometryGUI, parent, false) + : GEOMBase_Skeleton(theGeometryGUI, parent, false), + myObjectName (0), + mySelButton (0), + myUseC1Check (0), + myTolLbl (0), + mySpinTol (0) { QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GETNONBLOCKS"))); QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); @@ -58,16 +71,36 @@ MeasureGUI_GetNonBlocksDlg::MeasureGUI_GetNonBlocksDlg (GeometryGUI* theGeometry mainFrame()->RadioButton2->close(); mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); mainFrame()->RadioButton3->close(); - - myGrp = new DlgRef_1Sel (centralWidget()); - myGrp->GroupBox1->setTitle(tr("GEOM_GETNONBLOCKS")); - myGrp->TextLabel1->setText(tr("GEOM_OBJECT")); - myGrp->PushButton1->setIcon(image1); - myGrp->LineEdit1->setReadOnly(true); + + QGroupBox *aGrpParams = + new QGroupBox(tr("GEOM_GETNONBLOCKS"), centralWidget()); + QGridLayout *aParamsLayout = new QGridLayout(aGrpParams); + QLabel *anObjLbl = new QLabel(tr("GEOM_OBJECT"), aGrpParams); + + myObjectName = new QLineEdit(aGrpParams); + mySelButton = new QPushButton(aGrpParams); + myUseC1Check = new QCheckBox(tr("GEOM_USE_C1_CRITERION"), aGrpParams); + myTolLbl = new QLabel(tr("GEOM_ANGULAR_TOLERANCE"), aGrpParams); + mySpinTol = new SalomeApp_DoubleSpinBox(aGrpParams); + + myObjectName->setReadOnly(true); + mySelButton->setIcon(image1); + mySelButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + myUseC1Check->setText(tr("GEOM_USE_C1_CRITERION")); + myUseC1Check->setChecked(true); + + aParamsLayout->setMargin(9); + aParamsLayout->setSpacing(6); + aParamsLayout->addWidget(anObjLbl, 0, 0); + aParamsLayout->addWidget(mySelButton, 0, 1); + aParamsLayout->addWidget(myObjectName, 0, 2); + aParamsLayout->addWidget(myUseC1Check, 1, 0, 1, 3); + aParamsLayout->addWidget(myTolLbl, 2, 0); + aParamsLayout->addWidget(mySpinTol, 2, 1, 1, 2); QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); - layout->addWidget(myGrp); + layout->addWidget(aGrpParams); /***************************************************************/ @@ -94,14 +127,20 @@ void MeasureGUI_GetNonBlocksDlg::Init() showOnlyPreviewControl(); /* init variables */ - myEditCurrentArgument = myGrp->LineEdit1; + double SpecificStep = 0.0001; + double aDefaultTol = Precision::Angular(); - /* signals and slots connections */ - connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + initSpinBox(mySpinTol, aDefaultTol, MAX_NUMBER, SpecificStep, "ang_tol_precision"); + mySpinTol->setValue(aDefaultTol); + myEditCurrentArgument = myObjectName; - connect(myGrp->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); - connect(myGrp->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + /* signals and slots connections */ + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(myUseC1Check, SIGNAL(clicked()), this, SLOT(SetUseC1Tolerance())); + connect(mySpinTol, SIGNAL(valueChanged(double)), this, SLOT(processPreview())); + connect(myObjectName, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(mySelButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); @@ -171,11 +210,22 @@ void MeasureGUI_GetNonBlocksDlg::SelectionIntoArgument() //================================================================================= void MeasureGUI_GetNonBlocksDlg::SetEditCurrentArgument() { - myGrp->LineEdit1->setFocus(); - myEditCurrentArgument = myGrp->LineEdit1; + myObjectName->setFocus(); + myEditCurrentArgument = myObjectName; SelectionIntoArgument(); } +//================================================================================= +// function : SetUseC1Tolerance() +// purpose : +//================================================================================= +void MeasureGUI_GetNonBlocksDlg::SetUseC1Tolerance() +{ + myTolLbl->setEnabled(myUseC1Check->isChecked()); + mySpinTol->setEnabled(myUseC1Check->isChecked()); + processPreview(); +} + //================================================================================= // function : LineEditReturnPressed() // purpose : @@ -183,8 +233,8 @@ void MeasureGUI_GetNonBlocksDlg::SetEditCurrentArgument() void MeasureGUI_GetNonBlocksDlg::LineEditReturnPressed() { QLineEdit* send = (QLineEdit*)sender(); - if (send == myGrp->LineEdit1) { - myEditCurrentArgument = myGrp->LineEdit1; + if (send == myObjectName) { + myEditCurrentArgument = myObjectName; GEOMBase_Skeleton::LineEditReturnPressed(); } } @@ -211,10 +261,11 @@ void MeasureGUI_GetNonBlocksDlg::ActivateThisDialog() void MeasureGUI_GetNonBlocksDlg::processObject() { if (myObj->_is_nil()) { + myObjectName->setText(""); erasePreview(); } else { - myGrp->LineEdit1->setText(GEOMBase::GetName(myObj)); + myObjectName->setText(GEOMBase::GetName(myObj)); processPreview(); } @@ -243,9 +294,9 @@ GEOM::GEOM_IOperations_ptr MeasureGUI_GetNonBlocksDlg::createOperation() // function : isValid // purpose : //================================================================================= -bool MeasureGUI_GetNonBlocksDlg::isValid (QString&) +bool MeasureGUI_GetNonBlocksDlg::isValid (QString &msg) { - return !myObj->_is_nil(); + return !myObj->_is_nil() && mySpinTol->isValid(msg, !IsPreview()); } //================================================================================= @@ -256,7 +307,13 @@ bool MeasureGUI_GetNonBlocksDlg::execute (ObjectList& objects) { GEOM::GEOM_IBlocksOperations_var anOper = GEOM::GEOM_IBlocksOperations::_narrow(getOperation()); GEOM::GEOM_Object_var aNonQuads; - GEOM::GEOM_Object_var anObj = anOper->GetNonBlocks(myObj, aNonQuads); + double aC1Tol = -1.; + + if (myUseC1Check->isChecked()) { + aC1Tol = mySpinTol->value(); + } + + GEOM::GEOM_Object_var anObj = anOper->GetNonBlocks(myObj, aC1Tol, aNonQuads); //mainFrame()->ResultName->setText(tr("GEOM_NONBLOCKS")); if (!anObj->_is_nil()) diff --git a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h index 5282c8cd6..f6f59b680 100644 --- a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h +++ b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h @@ -28,7 +28,11 @@ #include -class DlgRef_1Sel; +class QCheckBox; +class QLabel; +class QLineEdit; +class QPushButton; +class SalomeApp_DoubleSpinBox; //================================================================================= // class : MeasureGUI_GetNonBlocksDlg @@ -45,7 +49,7 @@ public: protected: // redefined from GEOMBase_Helper virtual GEOM::GEOM_IOperations_ptr createOperation(); - virtual bool isValid (QString&); + virtual bool isValid (QString &msg); virtual bool execute (ObjectList&); virtual GEOM::GEOM_Object_ptr getFather (GEOM::GEOM_Object_ptr); @@ -56,6 +60,7 @@ private slots: void LineEditReturnPressed(); void SelectionIntoArgument(); void SetEditCurrentArgument(); + void SetUseC1Tolerance(); private: void Init(); @@ -64,7 +69,11 @@ private: private: GEOM::GEOM_Object_var myObj; - DlgRef_1Sel* myGrp; + QLineEdit *myObjectName; + QPushButton *mySelButton; + QCheckBox *myUseC1Check; + QLabel *myTolLbl; + SalomeApp_DoubleSpinBox *mySpinTol; }; #endif // MEASUREGUI_GETNONBLOCKSDLG_H -- 2.39.2