From e4a7d5ed70bfb67f1edbd9a86f58e28aa006ed1f Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 15 Oct 2014 17:00:48 +0400 Subject: [PATCH] 22748: [EDF] Improvement of Filling operation --- doc/salome/examples/complex_objs_ex03.py | 10 +- doc/salome/gui/GEOM/images/filling.png | Bin 14839 -> 26588 bytes .../gui/GEOM/input/creating_filling.doc | 27 ++-- idl/GEOM_Gen.idl | 20 +-- src/GEOMGUI/GEOM_msg_en.ts | 2 +- src/GEOMGUI/GeometryGUI.h | 4 +- src/GEOMImpl/GEOMImpl_FillingDriver.cxx | 117 ++++++++++-------- src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx | 35 +++--- src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx | 18 +-- src/GEOMImpl/GEOMImpl_IFilling.hxx | 51 +++++--- src/GEOM_I/GEOM_I3DPrimOperations_i.cc | 23 ++-- src/GEOM_I/GEOM_I3DPrimOperations_i.hh | 2 +- src/GEOM_I_Superv/GEOM_Superv_i.cc | 20 ++- src/GEOM_SWIG/geomBuilder.py | 79 ++++++------ .../GenerationGUI_FillingDlg.cxx | 78 +++++++----- src/GenerationGUI/GenerationGUI_FillingDlg.h | 3 +- 16 files changed, 273 insertions(+), 216 deletions(-) mode change 100755 => 100644 doc/salome/gui/GEOM/images/filling.png diff --git a/doc/salome/examples/complex_objs_ex03.py b/doc/salome/examples/complex_objs_ex03.py index 35ccf0857..0c56c81e8 100644 --- a/doc/salome/examples/complex_objs_ex03.py +++ b/doc/salome/examples/complex_objs_ex03.py @@ -20,14 +20,12 @@ p3 = geompy.MakeVertex( -30., -30., 10.) # create an arc from three points arc = geompy.MakeArc(p1, p2, p3) -ShapeListCompound = [] -i = 0 -while i <= 3 : +ContoursList = [] +for i in range(4): S = geompy.MakeTranslation(arc, i * 50., 0., 0.) - ShapeListCompound.append(S) - i = i + 1 + ContoursList.append(S) -compound = geompy.MakeCompound(ShapeListCompound) +compound = geompy.MakeCompound(ContoursList) # create a filling filling = geompy.MakeFilling(compound, mindeg, maxdeg, tol3d, tol2d, nbiter) diff --git a/doc/salome/gui/GEOM/images/filling.png b/doc/salome/gui/GEOM/images/filling.png old mode 100755 new mode 100644 index 2efb1c8ea7ef2d8538e6f6b708c74309df3785c5..9235f7a959955325e25d2d177ea6969e25e98d57 GIT binary patch literal 26588 zcma&O1yqz>xHdd0Aks)TBOs-8NGmDbUD6HG4JuuNq;yJmH_|22-Q6*C^KagFoqwJ9 z&bPk31czbfnJ4zX@2ehy5D2RHM_~mB!@!O{pKYG!F^W^F>Q=xArGXJACGYUW@{E@Eh6WM31~ z`xU$tA};(v$t7uT-dPK4lL&Hj!9q|T@U;}v5a}s{);qbm+D^3R${5dI6{|ccns|Zs z`Nn>1n)`Rrc)d~W=P!uCmMPC5U`s`ZlP_zn^%q;C`~O?o#V+-|M68 zNvU=bA^;9mpL-7RirRxg@0z~c;MjOQR zISs1WADghMo`i+=7Vr`;ZEYd9TiiQOuBXs7PVfGPP%ZVoA|4I-V(lV4xKK{Ep;o57 zoG$~16-XNH!nq6cRNZ%GW~~cERfteF7vaxX4dw;S`xpo&dcL!hul&prT;9G%Oy+Z@ z7NB0gUgvZ3pNCzWg#RV4hp&^e&Ybzs5JWLNqL8@DS=>-il%KC4BI4*Iv)oD%hn3o5 zre*WhzMF_}i{Ay~;`ZufH|_%eXKg{QIlHZ|{vDgam~#|g$-|wg=Owf6P@5}Ocj#W? zkN8a=sPx@OpGN+GUFn7&-Edyi zyZ^B~R;m7ggxki1B82z??&+}6s}OQu_Bk@|r0df>M8@uUuA$7s@LA{k__G6M!5wV6 zvs9I*D|pWsqh{GW)=}4;Q^JR|i{oa`WpOE;95)bb~9#+0|Lj-)GA2?zp&2 zfBEHuq0wmA+YtH`NBJ$12pR?UuF**1;cIuN@*&SCyY6y(8+RUi--vkHUF{uIR(f=I zO;+EbD*EBxK?a+}UYvPt#+0O0MQJ6a-Y1g3H|=*xinb(0b^10jCkehexm7+8sf>*) zs}>!N5386knKoQ>&V_hFN7T@udkbO7BbpZ{NjHmC_kMa~o;-01dC}|i7udL-P)2>n zv4vVE8As`&huhCTHgUrJF;>QdT;<~(njz4y5a<&H`Ik(l*m$G2p@LNz!D!=E9t^7Q zbH>XYYb6}Kyn_1Tkm^r!G>0>h~^>fdP&B(ersrF9#QNcPi_@k@N4J2NpegI};)J8H)2 zMrC7XUV>fOj8@!j7Ip77iMdM=bM^!l>8h)HUU;qi<;$U`E9hrB`2JBWmi;X`Y79~$7D893DWTMf2i{LzI7mo$mfR7Sjk!Myo<}kIn>t|-H2}F z+WS+g>zHbk_qrb2VR_h-yHrv|cF2UV1MX9Q1SbcuZ&>TNT1HvD{4PP4+kZ)nzN zwEC2UBrJMNNcf%idH?AM z+8E2t_Z>!i>9^`J=%Y$T({v(bro)0M@BKtgUinswl2V@!7T~FJ-F|mb{{rXXm24V6 zXIy>wvtQL(4}UU0YF(@4N5!)Vx&qTbNgPhOCWDN+64qKR*YnXoT>86hskPjsD8rXW zb6!4+Js37<>F#X#=oy8D_pqX9`y#v>hY%&zhJ427@Kj#4c){)1_lE6$u$b@lt?S11 z+6y5JLGN3b$#9OWizLb0syi-Uy~Sgq&HDU5I=L{}BF{u~n4mGo|b_1%#>X}I_H zNX*Jg#@A=ho4u~$s_uS^WAWm>y=*Q$8XY#E-rM62C!Lnn4y#{_OIF%x@%}9#A+gvp z$j-@W=eVCSI{f9Eo@R~Ze1o&|U<#l0oQyHi&I`D2z5y@lNg5(*1oseO2t*u(4cC*} z+$29P(%&$~AD+U55Y8@7^Dev23KXfsDRpQ`!|B(lBFe+)V+Z6E6}cR_>+|z7LNYUv zDl%$m6cuMbZnWpC-w~vT?a3hh`QE&MzOVD?w1IYVL!^} zu6VH)865)?Q**(aW@LgnFOMON-#^=mnje1W<;kgxt0<^o zkw{r!pox;4ISP8m6P#N_*Del}eE2Guj(V~)E3Yf2kmD!P2`2XH3H(~s(Pn;bVdSx< ztOlJI1Gs2oHr7*py0_2WPSqOR{&q^%h=vn(;2jzKUDT?vWsH;b@{!j-G+>G`LxhG3 z;%J}qCi+Eu@i(Jx9B}r4kxWo;GPjGPg5R8CgAl)f0ju}4H1gqBd@6JFP~e_t$~YwTU<#@ zQFNB73SE|0cxY7&Mg2M7PHSWrmQMWdu5rtK?dX-OPnRgh`ok1@ho+RlVhLdLBB z&h@R8bj-IE4FpBMT-SRRtE3AI=L?;2_PNkMg)4)psVyF>T)8IK4Ht;%mzQwa<%C}K z!j|x^vq6|IZ%Q+J__601hT~8c2e-Gk5k#GgVjhZL-90Y5WlePWOX=H_a4f|1$dU4W zp6{JW4@9Z%*3W!}rXo98o%U}iV6F+Z^Jk8KQheq&;V(ZP#rE^NPsAewftU!h*+P2J30Ads8@1D?t*N<8pP3D%dkU9n`*@#N!;)yLZI0Jut=WLoH1hfDs%LqN+TOJEM&q z`U(S)38kGW6hA%Mlcrw#;~LeCl2%4Z&U~I?&Y%&O;Ej5pB)Jh$iMIFWwH|pXITrm| zRl~LFv@3yIugk#L?`2c1mG724Gjd9jBO)l*Rf(V->k~0Csvph1V652Hy-JqD5HwoH zQQ(eij>dlrpE))T3uHdpalsD##>8x+C;^4N2@MU;#c`C1-3X{<^F$MQF292u8jRMC zA&Oa{$%KN*7;0%0Dky{>a~k2c@3vQYC}uNXzdo^l+3Iui1Mf%b&hG{G!wS1d-KK(~ z_0yeYUyOR!6Wnms0QuZJvv{=gWDZNUhtsP>S}d{P?I-OtN(ou8)iaUQ=2Fx%lfe}B z9{bC*C!W2@NtY*mk!jmRoW*4CF0HMK(h?JWE;`<$wBPgEzcsx_=W!Nw4Nv^DDqmPA zB`u8tAd4Q8Qjct8l5mOx#|)H#pfR@WkI@hWtRxOp2KAT))P zr5R448aC7EDVzEW8!t}Hk>vwoOkCXhW|rx0d=OeTJ7RZ8a)XTcebfE*?hW|?d^qFK z1nx-=q3UfN8x$(O<`Mi2Bfl^|_9f>>NvagT;cd3X_yq=Sp1A0k#fHSGmKKW^F9y2& zzUSz=xi^D;S#M1Au+7p5Hw{&+ZC=&hmPUx_A!8IRoCkjwOb?uYyCy-du4g~tJ}J@%OHW+H|iP1>9Xl^ z9HPXxuCQ?J`ge5n^kVySEi0SkF9zwoZe8wnsv7VZlXlj|{8~R1&tjBOdAuE7I-TB4 z6|#x$fu539Rn7XWW?XW%k%1WY?Cluh~VDC6pW^c3AM^)bVcqy*>m53}1aQnmhi`~E=S>t@Vz3l0|CtMl`-o4?+%HaGj+-6y}q4UoW`!dD7C(8HHZ^+kXj%v^kw=>KhT(PM+@E+;fKdR#i17`}LwQqT@cljChc|X1nXd zfo*TxTzs>@{!H2a-OWX^)n0N#7!INMK|maiQL4EG{UtAH*k8HHPXr0?ModwBE(*sVxb=k^R6?FqWWCzWFHynCbyi;9#~R3`ULub?Ni!!HDLYqvayyPes` z*YW*n3ry8!U6;;Mky!aX|K#T7{bmZy8~dQxAJJKjGanXjgC)_t2KBWh;e&A8PC;?-jMj~)$H#3utdU*Gf<1eCjyOE{4~4o$Mbc{zE+yW-xD za2PjB=jPwGtxtTy7f~1SvD(Yce{IXqXjFAtRMg(?F5 zyUP+tT~7@^R+?Ty_h?P@VKgL>ie4nML)@5cXqZl|iE(wn#LvB?@L`pekZYpTg) z@Gl8Zs8sT@vMKXEjLLMbC$Vw@Yhs~C9ZEZCgXN$(Tkn7H)SQ`@O#77j!_p32S3Zxe@bHts*R&K_=o83H zwGErE9=@OdLkX1cDFj=CUdxf=10Ub}qo)uWroHLiKNF7CDk`dn1(Q_Wh{fP%K(Lr*zQ5vq^T+QA1RLL%3G(Hs&wuC>5F`{q ze8~H+9}u5`EhFkdAn*uK6iC|dwG*5X%wCxo!o zBp+Rv83HL5hrW5mtKapfM7%djmnsVH2N{wdQ+jL|lfec`pgsgLcDn6h^v}q6|GCr| zLqixlPz3E9jd_?^C;-LL(e`fnhOE4z0_H{+Q*S+A&);<8a(eO3ZH;C)<;^GS_mVQd z!8y#%_Gbd;;dV}9yG0l;=xs+=S4tRv;w_!)P}+xdXu8W?3ZFaDF|zf1v*TUYnXfP0 z@L$`IZ+IWDpDhuAqw%NyA%<9nI^BV;BlIRxVXD;DCnzW=KYu6b3zxXKxXWGLPx}Iu z68$o@H@FsOB?Up}8Q<`p3xRiQz8=;3`J_K>fy4F6HO$4$)6=stt*}r_@r2#m=EH}t zK|wEcIM~@^7M_uIwzX4bSAug-qu$&hH?i#@?g{jf^l#B33P@`KZ*b}9=?fHdWDwIY z4i`iAlS--dC687k2X5}ngTw)&!5zUmovo_b#N;2I< zOc#2N{^9oN5>Wu3dvZ|D!;(^*xVhnP77X`a{)>|{N$o;5i_NHLk4Wd6++8mgHPq|L z(0B2c2t%3z*)K(0LgXg1&1+fuXE^rT09sIi_O z8z0wne+T(eEqM=p!_SaHb76NlJ~UpU)qH$R;gex(&&7P#dqVMsq{?hGr`Pcd;$JEpmt?=IgM>`J+b#k zjXJ5JdkUF(Qa9k&+1&~HU<`3fuF}qzC(n5K_`1W17$woy*VpU(bX}y1%+bPC)en+j zOHT^ObZ1rS1|xAazdPISzAi}zn?U7~-HckrlaIBX@95|#M8c60Zz#|Hu6*=5r2Y2y zuW=O*+J0%HBf93Bd!8#a9LNw_54G=d&L`nNVD7rPxe32%@P6=WqSo*1>||V6n;wRn zuUO49(lw<@9rlZ#;a0|IBgkWOLAtfDV$z_hVKapUZ2ReP?Hw<(89tZ zZig-Mf6vvGZ>i2flfHq$a}@k9sZQf#V-bTbbMy0qqNzCA^!hgo=)~H-5%sng$0G?l z8pWO6s+GaA&dPsk$Jcpf#*=RwzaB6ElJ@%bYX@#^1|fJzCH1j~SY&N%H0*k~v-eRa03*Rq+aT#)lP)n>bKiRy8~{6tVj531r`Yj)Bs> z?t+lpfktra{_bY&gwZ!*N|DJ|PSvEFYm_=k!1=!StS9{0rb4u-QoY@Hx0JQCk)vKc z8XZRsle3)@3nyoQBB<$V$BjH>=*nxZ&f=}eIhmQO8#`TwETfCriwzehZ$+fjj63K( zsB#NN#)kF`t@d{|b~ZM$v$J1!e*jYm>&jbH!ENf*?ohgq0iKwF!Rm$6;lQ5(oo1K# zl$2uQzZ1j5+i5ec6BE@oEzOo3n&*iIPaum4D)-q)ucPu7<#jd1X2Il}nBbtI`n4t* z)a28Yl0q8N$->0+1uXf9jI$QY=j}|~$=079$54)J>I5ko6@YPtVedo1%|$I z;^Mt!ncXTSI-a+ewp^iT&{J7N3OtQ@@Cx$aCquYwj@&>N1tXpYA0Hp?59&urX+;$k zW0v^m=)|XlJL9uW7x|^iPrpKJPWGlN#G_u<)z_ktu$;E}A-nwYY4Txt0mC?)Ze0M( z_R}HxSg0v67743EkDMyrBw6zVl!u3?gpr0ujkvK^_K=^?{Zy;cR9;#db@+bitIt8x z+;bO{z_2hrkIT=g3!c2s-Ct8tEu&I~C4uJpo0I(+;``aLF^uf2EZPiX`cZ;VS^BEFqj7W?N z!RQ<49~kIYe)$z67N}@3|Mcn8Mt@fV!uy8U^sjn4 zUMX8b!{2Cxp0#f>rtI$SQuyW<6zuQsv9hrG&P2z>xu0IRBwS+Kq#kpNC@My^FaL~B zz%;U;-@Q;j#1xDaW$>hiKr~Q<)SDU;Gyx9!Pr%^mS8{rK3%#YbwKYSqOG!z@;rFD7 z(68@*Z=TRbmza12ppnhg8(9bo`)0>(B(Pf`pb<~`qFy0|>movpjMftp2pex#IztvG z?qj2)l{7ShF)|eLgx#g3rGd)dN*>2WjMl6)($k5gLrjcGib+bka9RX`M6BbjP0ot` z2h^}@9UF7#{!2n37P>c@gPu6R@3m4}R#qlw@cenev*+lDaNjgJZQdejobFw*`eH=& z7Ut)-QMVu=Ba66qF@@&-U_m(+^7eiZ`4Dn`Fk6tFt)io2ZDYbXmXlSU^&_O}U%;Y% z&JKC+#F1=ec=atQ`>!7;yGtf~><>f3!?uo&e4aa}V|j``c<|KJ)NyffEiN$q^Sx=8 zX95B(Yguc-!ANLvK6>~%+e=HO6z1KVgQ=h|G#J8O4yROARz^leS#&@Jc&_x6jc}rR zv*c(94q3k8!H19(O+D^H+o~$o1r(AtoZzPW5BzxoWpkRFveK-%gKd&IHgbClJj~5$ zDYA}UooudJU0>`TZXU*^#@XoUm3g(hHQE{V^eO8VI2|q&fvUQ@dvmeqjeNFu6Lshd z!|Lnrhc$3gqWau^1`v?ba*oMn0rc;tZPskv1}Et~Q;~iwYH4g9J7@qJ>92j~$j=2|w3JkF1xz|6^V+^#!GjElUHcifXP;2Dnv^FVj*3{RNI9T%FhXX&W$S!g zk++;W(z7E76RdSxr+a)Bk;~%`QMf)RQ}XX`pQi0c494yMwqb{)DgRa_1(f0c73cp` z5Py0c{I$`B*}{tW;2`gP&H&^&m6;Jj6hhqI-qpkRXA*9unewhWAA&&i;TRBki9D;f z?<%7({4v^|;rdCWf6{$e)^OK?d@&xA5yW37Q=*FzOkesMD)B2)(F+2ZNp*VJ#^fu{ zgmh*x2Ii0T^5m8YDKrH06?2z^R5&Qv!YVufTsS{P$5Uab{Bn}nK9LZ(N zZ%XEKHM6#6NF4Y(FwjZH5-(-Kx{h5M`8}^K(G~%b4#NO7M62F%J7wM-)Oil8ndsQqYWE9k z9Gn;u9_Q1&X)I{R<_QG_g>1?@brqEj_CLEdi(ZQI@|ZVcx+Sle>B1y36}J(g++i{~ zqXZ}jq-_9e_V+b!aO$!ATzgvfQCr({ccKWGe6)0Qb`B1q!NGvz2qBJ7Ofcv+^Kx@1 z$m9$rax${9MQ=>%mm7Fk=O+EgkjVsGJ+@bVefjdGSMjxg$LY~Xr({8!iuTPep`hu*{hh6?EhyU)LqlqH z`s*9giR~(WL7wI)?MKMsbTJZ{qZooH2tG17tnpGS%}D9HVr71_H8zWlu8OLv&a>54 zA-HerJ#RP!P4BMHxVX50ts{hZcRDJ&b{;u43+#D3X^A#b|3MEN9GozG{*}W-?}CDY zkYr?fM#hV+Ll_&3wppTY7aJ5Wv;YHRbJ6IcqQXU!CNadb-PyyTWue&ESVU;!CMeTE z{Ei-4jetY>w5G9c0b>aTp*_$_*qR&zG4SQDk&@fDk#uY zR`$avudHnJxGE0|LlvZfuchejEiG+cWhFLLxOw=4q9VB7pO|`#&;ooI2YP#9TZdmUULwMI@V9*6 zbd8CQX2M4SSO{T$KDZk|I#9%Z+;cE84$jRHGis`-^(+uU(&~C2{tixiRg~O0zNMxP z$ch8g1vxEb4}BhD7x^bgld;f@6}$`?j`Ld%_TM70_QU6deRKR-`_tzKHi1k zpdFGX{lgnkQ9%I-4Na%Tiw}4W%D(`z%g6wgu>w@d>4pR_TOT_`vuFRhooS+R?#+Y+wiNDP4t zA+q?D-hT6-UF1Um+lFVLeDc3C(Y2G9fPXZUoP9(c;<*_iAZ^J02f~~XSD5v9)kg6M z_|AKykyL~K1(q(Zb5pj6>03WdUD4!<0U}A^^?YTp8bvK5i2W?h>XpJW$M&0l^%DY@ zE6}o(=y0IXu?ZV%dz1mp9OyvuAkh5#lk3^vPKfDh0(WxBZMb9{gY?gLdbhr?I0oHU zbR>HuGAX=VE<>Nho{IsU<-e&Yxjs$LhNa?twY-mhf4I;&c*ctWv=dT(k4LbW;=>me z8F_>t_4)*0MIE6gw}uNHoN5Vj3=H}%;cgT#GsZj50uH@<{{HQv#}ovzjqn4g28nED zkp&^ULr@_`t=hCVuYgQ*leqCLjnB;daqfbVAxGn_ePeOF)~lE;Rp)d@=qK2^izz5e zDo|&4CLv?}Ju-6SzbiKSjv3^q7*M6#y365JvHn;_WDR_!+q`$ndV)tQOQ49aqJAgg zJKq}495s>YrtUz7`<9zaqu)6-HB~We0>meDLN*#UN+oe|T24khXmny+BEY4b$Y3Sa ze%3SBF#l8cGb>J9V&x5z4xBv77mk8FC@@}ty>PwD*v;@AtU@r*zN1Z+=yrphwU{W@ zD^t5{w`bl|DbneD)P^Q@bXBnmu;9}J{;^l{3JPR@GNtF|oA-`Txp1+w*;M|p)SI!0P+~3? zfDnM12F4q=^4ka^E8tbQy{|_iMBdizwUz8c-_FwR*S{R(mt@+CLrx3P)?1dQ( z(7rcL<5Rt_>gwwga*3JsJFd@mJv}^*5QOif7UPK~Y>o(bL^6l7y*Sx{aG_hzVz>@S z956uuxrUvc-Q66v1XcAEgv3(IB&c;4oLrm?4h*ofvnC68H&5XN1vCp>$>0m5H#YKK zDTA}--E!}B?{(#Rg^P>3%UOu00q?xE1P#=MRI0Pg&zL_dcBmrFB~|GQ&7MTW#2(9S zeqBWiEK3I}5RH&iWbv!HnP6Ev&aF|AA3uI9dSCDb^uItyKb*}e$qG8JCV$P108puw zmLel1jE2MVl8In;cW3AN`r58e>tf+RK<1`wz`wLWwOH^Gep-z9QKsL`bHKxpzfAli z*IoKOhg2e6_6hwz$<6<%5=RZrU%kf#V02){oAE+tU`7C9h2dL@%kFl%WxP`d+LuY@ zAcx{6I8KZ<4eanii+w0$sQ5jig}eu83!w4u8=gW7MPM#(-Eb%7Dr_KZep<#hP~R#V z{+3^ZZKtQFl^}iJLv`cOY_GZ*iB!}sCd2#_1&E5=$qTh6l&^4OB!0=! zVAJ`1lh0K$k7|1bu|fcEP(F0vkL#C~kZ`*`-S&B2=K1_CtH`F_{g8R^Yg1!WH`@UL zZ6Np%C8U_(=L|EGPs1j9;uhN4UQtkF+U`Cjcm5Y513~$Cr-+N&a{0b9(hGV86rmPCA;!BBAR15BDh@=J+4l8GN zLm)Eu_VobYi+v~FUMOm)i@(bKkqMFuLD$+m&W^Tw`X&}ND{(kl3~{-58p*f1>A!00 z>+1&+Ie^4zJUVR*+J_5OK>G_+RL7l_wXsfG0D;?=KN5tSJ}9W*k&x<4)!3vKgwW4M zgkiXSerUxQgl-sb%r`g+*xvePCAV+FI`79O#un;42Mv1IgrbV;$O=Xlj0Hj;Zq`Tp zw@VJGsC7Kf)_kLq4}iHyPfu4zTs%ce$wxs7F1nxSujPEYf;P?ofNFqIZpcJ+NB#r} z^+i=pMNLfwI_e9NZzW-vf(_35)fH70)#W;{ek2q zfvVl@yLs5=mm5dLf3Q2Cw28iD4a!b!^VRG*?*b!Mt$%gaEDhqFI_vB-4yPKA~knduZ-n0dhFUiQf z*ZX4T8nt|fKoayB9zu4LcnBBX2^%agOWDOEWh(VsI6RqM2>WTFfLFfj$?N^|Dn8kR z{Xq|`xa1#l=d{y-MR`R<+Ca3@k^ft?8od8ugmvXmWaZ=nXyP(CHdCdoi;Ih`txupG z(UyScn3g0V`}pei zYv_;?xUn6Jq^t#miVfwD#Y}e$Dz?U02DFr`>V~iwl=^}s9(R9ARv`< zIJ@`i{mAc1iD_ouJM{bLDr6IsGQ{+q9dmb{o6tWfjrV`&d4RC{7|^LC7&YnW?1ui} zqO}u<+{g#=Fghu(seyq|@!ojFNybTXI0>*1CxSj0_Sd41M0pWAIuPY+^= zv%MoSBH|I@hLI`FMkOX58Q$UA8l}@PDD>ZnTMU=q`SmNh5ngNtaH>Xp(F`!lV=+HH zb>Mc|o2s)nAtE9IO&YMEGFF(t?UB!xHV3GLU9Y=PxSt7_ZlPQktf}hh=>elcK}987 zj^^pt_amln-@awkX*4x43BZt$kvTs0@8#yc#mC@RTV7k78CCz6EtrexsYe=Xv@ zHX!Xa=0a{?g%|t?WXYrwpa5bs{)~@b-<-t4`qeYo&&kP&m;Z)_hWr{lqP}1><7Fvk zcmdEyAJDPfj+VY|ei~e8a$l@>lpLYseF3`hWn;c;aZcC=UTL0aD$GMsr|(vxS` z4M5+2_ik!>nt*^HFE{t&PS(Qkii&?BAjFaD*`=WWAtNI<&gCgmA7}B%+nAZraucM+ z#2DGwgtyrI)-QW>2CtKnl4O#(#l1)DH~-GpI~G_>7K5v+TA~wUoB6w@P~_0&Pha0F zBtRTo;(HBMR8?2k+u8&(%A#kxQKuiNm0-*p+>k8+R@SI3-IwY2R7DJCE`ogTxVcGr z9hiVlxiemX2mdzmG%J#Ua-4lk{d$MYJ_`ORe{y=;C#I&R?#r7&CtJrd=hB+0Ds~QL zl}Wjrkz9`_Eg$eA1ygvvMw;B6Z?UBus3Qmn314!`X658Wt+LCf{`m2sxI6ymPw?~P z_&Cgk_v`!jzN!WW2DctzQl=0F1_owkW)Tq)%^K@uF8l0IBKT&bw}fEV+mZem;6Yay zQGlw`_K4BN!Mw7vG8w;zTD=49u$rdk&HikS{!Kiu*>N8ZeMNb>grsDglg--#i&( zLxBrSFZyL=Y;J6>Zw~%_`jnPY_zf!c8}Flr_I1}wq!1)Y2?-#Z!kj68X??r~Au|Mo zjkU)C9)KS)LcV?bW@rC6e7=2azB%9-)@BA+6JTolcS%`US+t7TOJ}3NG7#|g5*6)= zW7Gw2IFiuTo(C_9N@b&>g7+?X&MyEl9L^9E2P`+h1&v^d`S+hcmLHa$HrlObht=53 zSJzaeGI_NDgDtS@WMhzs-7b2{nQ{~EkL~UThxJ}<3ZGkfSaS;e8x##w0DsxX`Ym$f z98GqA`+XgGPBGS!HBN;p8#pP)xES9IqLGOl)-z=W0a?b8f7?KPEDN%oWWX(X$++dT zr=%j1S6mE2i#ur(AEdRz@;b1|zeYPIuJU-O6lBVXEPqCn2fM@O&Tzid{*Ml!ms z9d;vJXOAJ1?AxBSnY%w;M-K0fYQ`;gtl6EeFv*AlR0LAX(;_l{Gx4aVO%6RlKj=0= zG{uRD0jdvRGGX_;nW4h6-C2Kr1hIem{Y5&Fqt`|l(v!a~IK}CO6I9^5kSzL(fQSH{ zxTo}Q?=~=_zA%DxYiD%A#cmTJVW}{18vBhXA#B)5epNK;8}l*IF;W9k(gRXKgw0>V z69^3YVjiJUg~ahNW7p^&|4N zPT!6+L5zp0jcKYhu}|Z9Z-VY*C_Z!Bk|-N>h`F(c}KMPCZrI8v1AG z_h^jrP^mm0<}XGJBxcdMk40K(5Ysz4grB^`_IlF@CU~XU=yx)Kg(?eGTId^U z>Ku^n3u_*sjBJtYd+H5a=>#YSOWkj0UyLDPDsgI@XvPGqn>+!b))wUX0#FF-wnu&u zup0OLYR6US#`4Ck28I617l^pzx=0GAGBJ-^=&dwLgVRBz!R9_3Jk%Ee?5JM08Yc9g zcudrv{(ev9!Iwht=}j9p1Mbk)bU{v2)7=VH$gYbc%4?qi1yRsGpe$-G?3ngIP(C%s|Y5y(v@nfKmk55I#N%P&!k-Yff=2EK<=vb^Q zERp5hSI?o9&Wk$07Xfz6(2$%jl-3=`hS4cEL&)vsyr`jpC;3A+(GY=yv$HcVA5)oQ zfw%Vl-s5Pzo*eH`lysB#t^VF>7z!h`KiQBT4l};Wl+io!w^CZR^a`!!#1T=X7BSDjF@Z9BK=B2%(q@&d@tb|KL8~fWa%f1wS)A8t;0QTHui!10k#--&CO27 zlD~lG*9i8s!oB98x3@QgX#Ct8L(p-B+?S4?j_Pg9>S_Gk@kc^J{MWovKl!b$2Q)dE zQHc00T?~~BTbl2Vc00h<78+eyf!ZP@WUw9_19*{ML0d$RUsn3p^tiZ5ATI50Z2`o) zd63+&$(SUDXthvz)jLWJAhi(U+n+6IV&SAAac@KsMSR70-EK`m;Q#5@Pp!A`z~i&J zDrW<|p{FMoya*7B;cW*5pAR{s@E%{|pd>gtbYH39wyrl6mnAK0C)lQ7o! zKLBVCqxJXoB_$`rw(-+BIv!n8W#w_uH@K6(3jhp_f`&%Q=T-@5iD|$Y+A7HKk?=SP zBLYAI01q%M$$bGF&CJZSva-SyEYWGQv$e(Cm(EQErozj~>hi+BhAg1pf3E>iD*^#8 z-V|!BJ{=q$r81$J3X?&QjSMFf_>Pgl?P%WO1(xMqkSEA=U}0eiq1d$fzPMDBbd~SX z48U0V{0@);(0=qUK5GI@M1`lyTu}+wA+U`p+9+5SO@g&;^9Pmc)_z2rAolkUCIZ8! zBM6JYp$inA@YHuQ!nyxvv)C58_diI4uUtt=lb66Tj~6x&;QuBuvoi3bLDv@g?~V=w zg08FdhKs1kfOG`uHuU zn1;uRxKRL#VbpB~wmj4qD2vfCF)%mUyQ3=){cG8g9YcJ7WmQ!yD{!d*Hp3Jw-%~yo zDiflkrDbMk_q;ereowvy{Zz`Lc%{XEiQWOOv>7+v6Y2v>3W`tRv{vz5Dx%VptoMbD!*M0&>;8WtKh zB`TwxbbL&SK*;L_^#yxpVQzk82jX#g+moUE03Tgl>8_f2dGXijG|!H(09FX72&_CP zNE~FAv_UAp8w(Lmzh%X-FPe5VTe>|F2M-U+3RrVT{r0|cU^`pE3Ja)PU;+c^7!>f| zk@FOQb3!jU5~Ukm!Gh&czlI8AW{vw{Sh29M1dcV9?~S{0N-HYbcLZXBgg(E=Lt1@8=v2S zHy@PY9Ro-#p8X?Ya8W&}+D&gA7%F5Q3shOGhtzLvtNu)U82!Q|Zh|vPtAGP%%I$)$#R#iFvLx+IC zq+6yBucLby@(mY-n$dL!Ha`w$?v*@y1c5P+aANNG#QbDn`HbB zmq*L(V9J(OR%+EdY|E9TBc_AOZ9QLJ1-h!uYi@Rb0Z`GkLDA?$#={iM6b(mu@uKx` zYx(m#5R3)nBWHB`-u`y7Sbg?WRSl~faho1v4yky98@l!drC9Kw!< zg~aI@P_$^`Fea+`Kfyud-bEH88LaASF0Dp^Tc;t?PsvUYAT*^D(nlyDlRQNE8TTAj z9iIl4@*09Y4E#*MT{UbW0K=mho*?Wi?2?WjiSh&Y??1)E{tYw#qb^U?+m8rdSUNIQvE$`vo(Ca@k@3+^8hrnpY`?jgmxkUw)*Y(qt}Z>)s`m6FE)-VgPDQ?dgRE+h_Ty(iVUm7)#g!}mvj?aKtS#UHwWU|Xrvme z?8Z)}&|vvIY&r&h{(EpCf%-W*G<0-yq*iVDc;lW$c$qZDUBV|4t7PEh13#k#MLjP) zUH-OC?R=q!>jE*1hu3%_ZP?AZ>wo z&E1mi8^~M$YmLLG51TF~Sb#F8&B_Oc3_U$V3B6`7SOp<4lYxZs3KLm|I3iNgW{2$& z3bF5%=lHX5=`EEcXFT6YSv9~N0so}jT)`o7&v26=8x1rI5u->yv{ySH>O64W1LX)T zzlBCK`=xKcDa67t2HVzwP+$ktu6JH@mx?*EjsT#1NM6nP1R^IAAT3hKYVsGrIIvLT z?O7gU>Hq#+0Eu7MS6Av98bA_KHjM$dYISvX-knYABBq1hie*Kp5$^rsUE)Bj4Z_(5 z`JzE4CV<38O0}!q;bIS2ZDAoH?Rc2a3(~(X`-c%Z3GdT@fX3&~;D(>+t}fABGH{5v zgiZiHb0;5cKG=-F@u!jz5V#(9^a6XUL{F#X?mQ86_v_8w9AJLF&l$bDy`3nIIor*F zO{3EJNn{QmVff>1Ia~wl9Dw(k`zK>8Jpr_{5&PTQL1bxtbh;1PjSgj*Ufpwzb6sbH z%bzETwcYRMTz!Y|51B#1Fl53nFTCs~^In1n^9uwPOmZG5pJa?~8*dn&;Qi@ldK6p( z&`8XOaszuA31a{R|C=h%;;^kCDJjXF+^pXjT%=j^_b0QEX$(MD#cE}3eSJt!Ve8Q$ zH^Etfr-?UHxpBNgQ>O%=l_v6A&%HxwuNJlp3Ju0~$F<))PX=Zx%&?|EmZ3drK2ih# z;W*gA#J;A>H_Z$$&>Q~EmUNwLTQ5`+4CXXg?N$SQ4%BoC->j?}%x6MV0$9~-gs1{| z22A*Dgm3xz7skhxyL7Xh!ruX!Cxs~p#9oZqP^+H5*Ae4^_cb=NDY3Cm`z02L>F_6b z0C{&Pl5l?9^HCFb{UiFFu+C(Vbl7b>=j&x9pKZ$h#sJZ6MB1<^xZfDawm5vezlaltUR0^xDgv+i8t8H0x?@;< z2CcNch0M524KbbFViJY;h+Xdw%%B^cgx`1bJsK)939|d6nO9ev$y(zv(yM9V7mb&h>O@ygX5!v!|9{KY`}<<-?vLv$?y7r7J=Tt?Ro7$@%qawy^i*Y*V~*drEV5*4a~hhOnGdgPjVh+WQ8EDs*nCjG41lgLsi&CnwnWt2+-{x0kFwYy z2!beHo0$Z*q+XEC#VwTEq&A0bk;yuSwydlvb(hzEz89RzFJ1J0(C)Lm1MLmqh=stf zKOWgFGc$-?V?a+qptQ_;d2fFo+@s42z;Ze`S*qk6WqKwi)J;YpQDl$u{{F&mzR9^J zh;QkIb&d6GFvctD$@Y`&V(o^BKY!lv@p%FwbqN-nT-ZegcT#NSu z5Zy^gND^yb?4#KJJl~n7=l`%mZR2*fH(nb8&pQqS#TG*l>@S>nlnNk>cZ>HA$^4!g zdxatZw8_Z)1v?Hl1pIv3VFXk+Ne7UM0K$gj=g(=Q+hD;bv6`Ui08QsT`R{%KaNlrW z3_Z*_w+9rmlJ|kCw}3}$*E?L@^&F;#Je(YY*gi1AJ+F>`>1%!L6Ip8eJrptYg!I`F zT+PLy=UuL6m^1?JGP5vZd5)sYTZlWS13nBi<@$K*L z=W*B?sw^@??|H7vSz{fZ%8P3?I#8sU89way0eP}eeU*I-8OmmUnhS(emf~8sadTfe zKxP9IYPM})yDUP_gy>=bUC7>Cnf@^#^0Zqj-FCxQvu{cl!&O?DByk`dRq!ksvzo9JUF^j z6Ux=ql`!d0n1N5LA=8#FI?6lVo(@tXU?ZX0bDF#E3sdc z4dXIW617fEx%`}DVu*V@p+^02Rp*~)h{^(zi;DIE&IJ$``pL7uqxt&cU~zY{X0hq! zf;_RN&@16=RJOv)d|$p&GZIZ0wEsZe#dqS*e;3WxXlzWGQbSSL=mQnsN2&-sViklS zGo#_1IvGvLrKjqP_;IMO%(rMV_zK=Rok^c22vs@ASenB5&{weGK4%JAt_zb zD1snEhcqf7ASm4+Eg%dbDIq0DN_R^)4qd-J&-4B9{=V;h*Lr8UW*sNaocliaz2myB zy&*)rpsUVx0`bxW)4x=G{T(R%BON_-w959<&1@%8nK~WU>%J^S*?v0@Z7tnEGL)ad3wU8k@u^oNBkpEDV{r9mh}izvRWBIGVo## zA{dTh7+)4;S?{il^Ss>o0vwX+op9KG?Ih81ZneB=b?9rjANjYUO<@R6JUu;0Nl9^4 zrK2F-e5ck{HrL_L7EVNk^fo0->schLYsOs>2!zO=gTNy}$T2iZjCJ(tMs8YN!u^;1 zn3|L8#kT_hJ0C5x0pJPBnUF}N-MP8(y~7K>fW~O7j(yYoTyN6pe>eeGjWji#2U?Mb zrwDM#w%GfD{HaGjijURG0QvwC@Y2|~(!q2X=)M~a6qpr%DhRM6ISqm{-+nDEb+WgA zU_FTd2Z*^Ec3cgVe&?JEHVV?06tGVTN(*citT8+6O z$#LHLEd#(Ske3(MymqpJGV9t~J3*H@QR-x%q@>hVPF-*;&N^zcg`1EW5#|@lzW}Q2 z?d=8e^QuLSN&6_!?@37p4i4KL2|_?kvi9n*%{71u0)0wq7-+U;pZQqEClGkexK$Jm z9eawK-@h*t*O3TbS5^iO2i}fd{~8sQrj{1JbBpn7(aG6apZU;Rn7%pz8;F=9IrPj; zO>y8FR1+w~@@6Fqf7NVHSo_+QWlhy)z~x!%26LX0l9C|gRPpT_F$oPwE z+oJCYyI=>unyHePl<6T&e*roZzcceSdx^DRQGq7v#Y>}KVz{6^Ss%o6Uxaj86Nv`w z-euO*crv#tq)G+l&Gbt?I(D71dSUp&(&Vpx*A+l6I}(MLCntY>Li!(UHqjjd6abMm z@T`i8iZWT&`2VDp)6-(OfNlC50(}~WXm_{h%^CC9w67AdfsOb+_Wqbz93E`UGg;QN zq_)$1ej18SM8jXePEaiJgcf?mm$g4!F&YS6RCpNIx775=mDuPbd8vT3AeqkHF_sra z+Q)-0tiZb9|BH2j({)|#PADOg_R+zVSX+D@!I>1IRT_7xD~OH9um5eCX};BN22r!a z@F;~KC5IBlge3v&drdwxa*PEL>ehq2s4~?e-FGMN%tykG&|Cl2=b0G;eG@AcnjO;)S|}d#SU7rbSm|ec0skdaP9Sc+!L(yG2Ut z7Loh&y?av}Q9M`-lr897K#rL7z`?-|jlFt5c(k6R0h19n|Ckcw<1{GrZ`<;eK*!b5 zzQ%&Ugxs+J1C4j+TST2-p1&}Z{*9Ucvk#c;a#xjKZV(!_mAX1*mo0FWc^r8b;*M`G z+zls+YIZPx{=68XamZr0&V>1&92Pr5t|Tk#H2euu9CoE9E&d3&1oQ4R8FFTY2M$XU z>vbqzE(%vKnJi{Ht{az_d3k%Y0>f0PGJz`qVKN!?o@s&ou(1OnxX8)I?SuK~24c95 zqD70DmEUg1m}TV7E_H>MsYr zkPs2Y!Uj^lErs+R^tBigj}G5sWbwA)k8h3Q{D7l$8wdgNr}yX#`F&1aMR?x}d1X`o zaCvw+d>~}xHuOqCBEd-8l#c@71wk5=U9s~>UGz&Vo`{Ny);7KI`#^gEAD>*t z6dGXNcmIKHF!hJ`O|Iobyy@3)v-^C(v+rZ&?(-JdAx##{g^M@xEf!Blz8&T><++hg zHr=w)leDMuKF=ntPNDQs`^@D#+7fu#h7WZdDPQzutDkrLR_ryb-^igvnb+TU(2tir zsnd0!t*wmgCt8xllemSw{ASWcuYg1hx%9s|g7S z;=UJ?NwF7)eugoRjgEayU|Y()lL0^d(&)5uTQTDZ2wX&ya&R_H9)N);)Gn}A-XFn- zeE$6T<43Z(%C`j#lup!~ikNc-H$DZZ1C1lmq|`XBv!7TLSR{JuMfF5{c)WziH`DRF zGPIf5(D=BeNH^3B^0>TD(@*JLf%ZdCnA2UTQs>70K8pmdJSYwYs1+fSJEqOK(hjYc zTQc${lh;iZuc<~_`^gi)644_S>;jBW?kSMkn_F37Rz)*;GcH>bBI!d8RHZwb1nNsG#f7a5$!2xc$q-0~^^VSNqd}*MPM34h(h%|(tp`oEyIrYEnS9YQf zh@zsHM^?4<6ZM75;xRiF)#m#Ull#IMsX{+@9--#wgdE==BMdilfey6`@#*FMYURN4Xa`&z1-Ad;_3=UTsn}OXuYe4MQ zcdG8{dZ?bGX{OcLva8{H-tU*$JG1k;c`vy8vy4=ZvTU|m!}=m)j<$?*Jwl9s8knnU z>FeuD{I>d`sd=OqYKGrq+@vZ*W>q@FTcj$q!=pTuJ~V=ejN`i^JJ&SfFwayg& z#(7cH|Dnhn$#s>uP{49Em6h)S#DVskN=fuIt~jL?Ws^4gC7i*4Q=lf2+-_dozp0Am z59B=$FIRcctxUiV7(r($PY6-cix2#4W70B|LHU+%!4-R&dD@drSOl@za}0demUJp%YTo3 z?`#Cs=*v8P^R}C_`Y1hVDq&r2go--U6p@9rrMf~cg-0fSV zXoCo~48|BDAnOw$($P@egdc-8_JH*aI`N_$eer8LBcn)#zYndmhcu zL7{a;#gm6cV1%;H0?kzP#zcnUN|st|^v4BgBw-g|dKCLAM*b0{wT+_yOn%$<7}~H0 zuBeFUBqjI~-SRZ*d5y^0cWz4I}oe zy{CvL{45-Rq6#$`$XUJdXZuggQjzl?6QKB6r3q|oKp5ee9O$6)VK^B0D9OspQ}=#8 zGns6AgCSC**;(6ivdOyaC1a%;4GLO#goJbfd`NXyE8lSH4Y+LTYuA)F0c1K=J5`-3 z^)c;8EVp00f;0wq4dxn{7q!=b{U(e1L3oOBu~G*if!UKq2w^1XyCM}!mGB6VjE#&^ z!L%%=1#UmE*I<7uZvvqf85sf97ke$cnzRpIiQ?H6+If^6h@VWkZBiEKa&#U{+|4kF z&KU#=1<=wlMW!9`!giSl9S|umUU(83M4E zSy80}0NhjNKzh5q`-hXAjnSI`?Srx$&o3!q@@_Wfp5N>!b}05H18xT>3qgV7xhcB| zv+Bd0bvt`|25(?1+hT<0mq;~ZVv~ER{>QzvHb^vuzmxlXLHACDXk*UbPO!(OQFZ}y zcl+~db1N+;@SqP~Xna(<(`$`B=jC56nezpQQD4_1E-Ef~&iOGZith5|hmWNsB!17& zs3#9PdM-W`z(wp4BiAjbwKZ@r*efzhlj=SJZ&II zuQQKJ?!8PCcNz&A-{OMeLK9hJ(;aLK&^FswIj1TbC(A&bNnpRs?N8A&tMWT|DCi?rYUbzw) z8n42cg^B8AW@c2K9T^_3tE&e+r=6`W9DHu(6gdTrAuAby`Ac*1Y4U|otatZ7{zg9R zA&rTwYG`8toH(W1pLP_y3+XA03^MF;QpUHHuRUThYlZ+X{iUJ(p{ zJd;qoCqDy&M1~=RXMTT3Ta62&qp5Y0aiP7nbv}^3>iSG!z!rkc3Lf9e%aub&=+J{l zKTV(rA2QeqMcYidZgN?J)4e7Ug=j7$H+T0$=R`|O08#bjO-Slin0)o8;SxbV1j^P73;#HS!^ShG;+aE$^PJd+Fbaf_Ft%G1H@6?6C(1ccSFRloLvdgJ`yz_ z?6Ku&#HWBb3MP)retv#0wY2U@DakzSq-(WTgbvemDb@YMSI;vQ(wsR3kVZ$A{gzODSapzdFkq8vC2G z&N__;0x$I(4NxYk8u*mdK@GFB{1zFZr1wW4LV;CLaDLvxpJ@Z&`~GZ{f#vC|k=7nL z8#f*>T>&GMSfhlcyMJ3dDCZZGh86EU>SsM&|_Pn4e^4 zg!RNmL7W>$+{dh)>C5I zF0s=q=BAsVdq3b>oKN!PU}qoO9JICP{3WeNs7?MlEpcd^$5Elb{JEfPVtGUw2W!yV1AB^%Llp5P- z-5`1uYmV-E#>?`hQ%dlkmxo}%iwvc93W&ibL}VXKMfe>Y($6Nf zGF3k`xZ!hVLr$c!m=f_x=NK3KdIck)^Vo;~;>qkFx^ziY0)aSINTpyxhZc@5k|KT? zSkn_C9{5sR_&-k>U7Vp{z1+txArOqQm1gQahjknM8i-$vJEbMv|M6@8_Ed{w`zsBM zPZgHVh`oy{jZ$e4)!-CV;28|wMW9&TlU=!fy+vK!w{2ixx4G+f_U63DcFK(G#gduf z>AOA-j*hnKl%Kf=`vQZ{38is)aQ*M2H5DzY{#SJW^N9`>ElpD@P4(BTZ}qAc`15CK z{nP%@e9)@NWj52)=bEUvhYxOhp$z0G;P`15M-Rn7LI;$leMRzj+EDlTEsMBf}& zV?}S>^46_#>8r1QJJKSMSrHCoEQs(9!W93CfnxEu_@uy4@p+!O>GAoeqlLd?+G~Fn zVoiz71MBCqH2To9F4eXaHalL*rka^c%pi1yC|~Opp8~>vP1vw}j6!Kl8ta)|*w~sagfsc>-8v%>c;7);@%ao6S0(o&fA&=ET$YnD# zGa=3Z?Za}IMjxYju}kssg00<)!^OXE!IDf9<+5o2mxCY2_phYZeOwCGQFUs~#)V)s zYoHhys!W6(mcr$kQm4H?22yb*@;guWE~?&ldRbUlSP_IPGv?>#XBP4c0BM3V7?DVE zc1o(ToBbN#Fo#^gKo?UNT;-x@&B51Iw{jaq!Q2W&jhSY-~*hsR8W ztB)wwD|7ynQBzZ69?ub9&Rztt&!oh|TK_iyEPQD*MF;ELECm!X?zGbR&bpG>6Bf!N zx7~Th=}>4M06@|3$Vg95PhbC+sinTiV3c3U!RMKZi8sSb-`EufIw_2nF6nuh(M@I> z#ZSW8c5q~I??@1yUsx{h9AjwGorHwdJN%l$8~9#A=mp=5^#PEG&$U zj_zcx>LuuzcE-C4V;#~P6COC*wy>$nzklqpTem(vGZPpPurP$O7`*kBGBzf*@khgn z*2!&35yutksxs(>Q>^#G(vsF(K<&N))n6V*WltGF#*#S=i3UI(?CtD)^=Llys01EF zwq+h;E+I<1uYOI|oNQxE6_S*7ihOf4M?T;NmGswA*;?tRM0?$W6Xi>(6e9Ms@?*)w zT&w4F@4qK^f5pB6fC?EI2hgUW;jL}vWF_fFN%}4jQ!YBkOal%kmi())ZyP9r zL>|*%t-Btl$GZ`cu+VV=1mJ+-+Q`Kq8(uhD?@N-J0fiZ$H~qW_5PeS|r~*|-@SuYq z(Be=|m2tv{La}Lxl{&-sKyBXK)^-D=VJa%27z`&eEjif;RD9lK<+>n#U?d~pJ@r&x zKgFcawAV)HYvhRNDCykjhepQfdk!FSQ=7dzw&+Ori_Sfw4#w`O2hubsZNGOfBmmM- zXta(?OPIZT2L^-$1y#tQ_6b`lZ(~jmL^^2K`1tr>djQZUEB8JyP^a2$KayPs)M+?s z95!>`YVuy+@Nletyac^6`yJjp$=c!;*qDl%7B^G+8UTRV45gKp%k?VWKjBJ6|*qNkQ@{?ZX9gUs>a7!JKE6lTTj9jE{L#r7;_I1 zb5ezk!~0QNa!8cGnIvezG=J%<_Bp?ilK7dW9G{edG9DJUpFpG@^EpoiS^peG5&%KSJs?ZERbXxhR0Ff%Y5 z)h>}j{2&O*!b4>(fCq*ry64&xP}Y;*B?GVOT{ck8{gWQ0Kb&tQZlYl#CiW&Mw>{J; z@=o8iL&ueVcAeX|=?RgqU%$Rr&^f#^zfM&usK6QlwR9GvUqgsgoERE&gI~UQK`mhW zJAjhS-jO2X5VyAazu?xEAV1NwMTOEsuM_Hj&G_%BB6VnV%*aQotf#LOKwCH8Ky37H zWo?aYXWcH4NYl_<*UZ&VpDKK13i9-9PUUX%ZF4zAKEE}gJZ5b9Ozg@z;f#`*fcPJR z>Kf|Y$9)Z>DeC>3(2?Q9`B7*Vmn)-U;)9<*JBG^bnEgadHzboBpCqCD&RD(-fSs!t zTPrruDGh?(D`HHFiC-vcY-fpF8G(6&?pa9W>l5d$PuRlNUUSXH>fvo8JFHpL_BG9y z5oRQ0?HX@RPIY>=TO9-BdPNcjhWei9sf(QFQ!1l34H8%(s8vj4PKg@f|pi4*6r0A{>LMJIiux)-1%%)rRVuMR5$S*M@NT= z5Z~EJtkAP7*JKcgF>#`E2-^SRsRw)Jc4mQs`|u@%7wxY*J~DA>cbyK-A+S{O(r5px z*y(t;UxVB((8B^BAxio{&M3Dq_ymnRzIemZ%;gm3+wua!tKU~A_C#d)vEZ{B0a85p Q6FUeQNd<{KF~c|i4{Q}qssI20 literal 14839 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 diff --git a/doc/salome/gui/GEOM/input/creating_filling.doc b/doc/salome/gui/GEOM/input/creating_filling.doc index 874cac94b..5050ed8a1 100644 --- a/doc/salome/gui/GEOM/input/creating_filling.doc +++ b/doc/salome/gui/GEOM/input/creating_filling.doc @@ -6,19 +6,18 @@ To generate a \b Filling in the Main Menu select New Entity - > Genera To create a curvilinear face from several edges you need to define the following parameters: -\n Input Compound - the list of edges/wires used for creation -of the surface. To prepare for the filling each wire of the compound -is converted to an edge created on a BSpline curve built using curves -from all edges of the wire. +\n Input Contours - the list of edges/wires to use for creation +of the surface. You can select either several edges/wires or a +compound of them. To prepare for the filling, each input wire +is converted into a single BSpline curve by concatenating its edges. \n \b Minimum and Maximum Degree of equation of the resulting -BSpline or Besier curves describing the surface; +BSpline or Besier curves describing the surface. \n \b Tolerance for \b 2D and for \b 3D - minimum distance between the -created surface and the reference edge; +created surface and the input contours. \n Number of Iterations - defines the maximum number of iterations. The iterations are repeated until the required tolerance is reached. So, a greater number of iterations allows producing a better surface. \n Method - Kind of method to perform filling operation -
  1. Default - the standard behaviour.
  2. Use edges orientation - the edges orientation is used: if an edge is @@ -28,7 +27,7 @@ algorithm.
  3. minimize the sum of distances between ends points of edges.
-\n Approximation - if checked, BSpline curves are generated in +Approximation - if checked, BSpline curves are generated in the process of surface construction (using GeomAPI_PointsToBSplineSurface functionality). By default the surface is created using Besier curves. The usage of Approximation @@ -36,11 +35,11 @@ slows the algorithm, but allows building the surface for complex cases. \n The \b Result of the operation will be a GEOM_Object (face). -\n TUI Command: geompy.MakeFilling(Edges, MinDegree, MaxDegree, Tol2D, Tol3D, NbIter) -\n Arguments: Name + 1 List of edges + 7 Parameters -(Min. degree, Max. degree, Number of iterations, 2D tolerance, 3D -tolerance, Number of iterations, Method, Approximation). -\n Advanced options \ref preview_anchor "Preview" +\n TUI Command: geompy.MakeFilling(Contours, MinDegree, MaxDegree, Tol2D, Tol3D, NbIter)
+Arguments: List/compound of edges/wires + 7 Parameters +(Min. degree, Max. degree, 2D tolerance, 3D tolerance, Number of +iterations, Method, Approximation). +\n Advanced options: \ref preview_anchor "Preview" \image html filling.png @@ -50,7 +49,7 @@ tolerance, Number of iterations, Method, Approximation). \image html fillingsn.png "Resulting surface" -Our TUI Scripts provide you with useful examples of creation of +Sample TUI Scripts provide you with useful examples of creation of \ref tui_creation_filling "Complex Geometric Objects". */ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index ca234133f..7253abf9f 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -1680,18 +1680,18 @@ module GEOM in double theAngle); /*! - * \brief Create a filling from the given compound of contours. - * \param theShape Initial shape on which to perform the feature. - * \param theMinDeg a minimal degree of BSpline surface to create - * \param theMaxDeg a maximal degree of BSpline surface to create - * \param theTol2D a 2d tolerance to be reached - * \param theTol3D a 3d tolerance to be reached - * \param theNbIter a number of iteration of approximation algorithm + * \brief Create a face from a given set of contours. + * \param theContours either a list or a compound of edges/wires. + * \param theMinDeg a minimal degree of BSpline surface to create. + * \param theMaxDeg a maximal degree of BSpline surface to create. + * \param theTol2D a 2d tolerance to be reached. + * \param theTol3D a 3d tolerance to be reached. + * \param theNbIter a number of iteration of approximation algorithm. * \param theMethod Kind of method to perform filling operation. - * \param theApprox Boolean indicating if result should be approximated - * \return New GEOM_Object, containing the created filling surface. + * \param theApprox Boolean indicating if result should be approximated. + * \return New GEOM_Object (face), containing the created filling surface. */ - GEOM_Object MakeFilling (in GEOM_Object theShape, + GEOM_Object MakeFilling (in ListOfGO theContours, in long theMinDeg, in long theMaxDeg, in double theTol2D, in double theTol3D, in long theNbIter, diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 7922a998d..a732e5004 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -790,7 +790,7 @@ Please, select face, shell or solid and try again GEOM_FILLING_COMPOUND - Input compound + Input contours GEOM_FILLING_MAX_DEG diff --git a/src/GEOMGUI/GeometryGUI.h b/src/GEOMGUI/GeometryGUI.h index 5dde1ed7f..f4fb8a393 100644 --- a/src/GEOMGUI/GeometryGUI.h +++ b/src/GEOMGUI/GeometryGUI.h @@ -145,8 +145,8 @@ public: virtual bool isDraggable( const SUIT_DataObject* what ) const; virtual bool isDropAccepted( const SUIT_DataObject* where ) const; virtual void dropObjects( const DataObjectList& what, - SUIT_DataObject* where, - const int row, Qt::DropAction action ); + SUIT_DataObject* where, + const int row, Qt::DropAction action ); public slots: virtual bool deactivateModule( SUIT_Study* ); diff --git a/src/GEOMImpl/GEOMImpl_FillingDriver.cxx b/src/GEOMImpl/GEOMImpl_FillingDriver.cxx index 57d0317cb..4ac14da7e 100644 --- a/src/GEOMImpl/GEOMImpl_FillingDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_FillingDriver.cxx @@ -30,44 +30,43 @@ #include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include #include -#include -#include -#include -#include -#include +#include +#include +#include #include #include +#include #include #include #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -#include - #include //======================================================================= @@ -101,19 +100,9 @@ Standard_Integer GEOMImpl_FillingDriver::Execute(TFunction_Logbook& log) const if (aFunction->GetType() != BASIC_FILLING) return 0; GEOMImpl_IFilling IF (aFunction); - Handle(GEOM_Function) aShapeFunction = IF.GetShape(); - if (aShapeFunction.IsNull()) return 0; - - TopoDS_Shape aShape; - BRepBuilderAPI_Copy Copy (aShapeFunction->GetValue()); - if (Copy.IsDone()) - aShape = Copy.Shape(); - - if (aShape.IsNull() || aShape.ShapeType() != TopAbs_COMPOUND) return 0; - - Standard_Integer mindeg = IF.GetMinDeg(); - Standard_Integer maxdeg = IF.GetMaxDeg(); - Standard_Real tol3d = IF.GetTol3D(); + Standard_Integer mindeg = IF.GetMinDeg(); + Standard_Integer maxdeg = IF.GetMaxDeg(); + Standard_Real tol3d = IF.GetTol3D(); Standard_Boolean isApprox = IF.GetApprox(); if (mindeg > maxdeg) { @@ -130,32 +119,56 @@ Standard_Integer GEOMImpl_FillingDriver::Execute(TFunction_Logbook& log) const BRep_Builder B; B.MakeCompound(aComp); + // input is either a list or compound of contours + TopTools_SequenceOfShape contours; + Handle(TColStd_HSequenceOfTransient) aShapeFunctions = IF.GetShapes(); + if ( aShapeFunctions.IsNull() || aShapeFunctions->IsEmpty() ) return 0; + for ( int i = 1; i <= aShapeFunctions->Length(); ++i ) + { + Handle(GEOM_Function) fun = Handle(GEOM_Function)::DownCast( aShapeFunctions->Value( i )); + if ( fun.IsNull() ) return 0; + TopoDS_Shape s = fun->GetValue(); + if ( s.IsNull() ) return 0; + BRepBuilderAPI_Copy Copy (s); + if ( Copy.IsDone() ) + contours.Append( Copy.Shape() ); + } + // 1. Convert argument wires, if any, into BSpline edges - TopoDS_Iterator It (aShape); - for (; It.More(); It.Next()) { - Scurrent = It.Value(); + for ( int i = 1; i <= contours.Length(); ++i ) + { + Scurrent = contours.Value( i ); if (Scurrent.ShapeType() != TopAbs_EDGE) { - TopoDS_Edge NewEdge; + if (Scurrent.ShapeType() == TopAbs_WIRE) { const TopoDS_Wire& CurWire = TopoDS::Wire(Scurrent); - NewEdge = BRepAlgo::ConcatenateWireC0(CurWire); + TopoDS_Edge NewEdge = BRepAlgo::ConcatenateWireC0(CurWire); + if (NewEdge.IsNull()) + Standard_ConstructionError::Raise("Failed to join several edges into one"); + Scurrent = NewEdge; } - if (NewEdge.IsNull()) { - Standard_ConstructionError::Raise("The argument compound must contain only edges"); + else if (Scurrent.ShapeType() == TopAbs_COMPOUND) + { + for ( TopoDS_Iterator It( Scurrent ); It.More(); It.Next() ) + contours.Append( It.Value() ); + continue; + } + else + { + Standard_ConstructionError::Raise("Input must contain only edges or/and wires"); } - Scurrent = NewEdge; } B.Add(aComp,Scurrent); } - aShape = aComp; + TopoDS_Shape aShape = aComp; // 2. The surface construction if (!isApprox) { // make filling as in old version of SALOME (before 4.1.1) - Standard_Real tol2d = IF.GetTol2D(); - Standard_Integer nbiter = IF.GetNbIter(); + Standard_Real tol2d = IF.GetTol2D(); + Standard_Integer nbiter = IF.GetNbIter(); Standard_Integer aMethod = IF.GetMethod(); GeomFill_SectionGenerator Section; @@ -324,7 +337,7 @@ GetCreationInformation(std::string& theOperationName, switch ( aType ) { case BASIC_FILLING: { - AddParam( theParams, "Input compound", aCI.GetShape() ); + AddParam( theParams, "Input compound", aCI.GetShapes() ); AddParam( theParams, "Method", aCI.GetMethod() ); const char* method[3] = { "Standard", "Use edges orientation", "Correct edges orientation" }; diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index 27c366d8e..7483e2263 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -626,8 +626,8 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderPntVecRH (Handle(GEO */ //============================================================================= Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderPntVecRHA (Handle(GEOM_Object) thePnt, - Handle(GEOM_Object) theVec, - double theR, double theH, double theA) + Handle(GEOM_Object) theVec, + double theR, double theH, double theA) { SetErrorCode(KO); @@ -1615,15 +1615,19 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeRevolutionAxisAngle2Ways * MakeFilling */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling - (Handle(GEOM_Object) theShape, int theMinDeg, int theMaxDeg, - double theTol2D, double theTol3D, int theNbIter, - int theMethod, bool isApprox) +Handle(GEOM_Object) +GEOMImpl_I3DPrimOperations::MakeFilling (std::list< Handle(GEOM_Object)> & theContours, + int theMinDeg, int theMaxDeg, + double theTol2D, double theTol3D, int theNbIter, + int theMethod, bool isApprox) { SetErrorCode(KO); - if (theShape.IsNull()) return NULL; - + Handle(TColStd_HSequenceOfTransient) contours = GEOM_Object::GetLastFunctions( theContours ); + if ( contours.IsNull() || contours->IsEmpty() ) { + SetErrorCode("NULL argument shape"); + return NULL; + } //Add a new Filling object Handle(GEOM_Object) aFilling = GetEngine()->AddObject(GetDocID(), GEOM_FILLING); @@ -1635,12 +1639,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling if (aFunction->GetDriverGUID() != GEOMImpl_FillingDriver::GetID()) return NULL; GEOMImpl_IFilling aFI (aFunction); - - Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); - - if (aRefShape.IsNull()) return NULL; - - aFI.SetShape(aRefShape); + aFI.SetShapes(contours); aFI.SetMinDeg(theMinDeg); aFI.SetMaxDeg(theMaxDeg); aFI.SetTol2D(theTol2D); @@ -1668,17 +1667,17 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling //Make a Python command GEOM::TPythonDump pd (aFunction); - pd << aFilling << " = geompy.MakeFilling(" << theShape ; + pd << aFilling << " = geompy.MakeFilling(" << theContours ; if ( theMinDeg != 2 ) pd << ", theMinDeg=" << theMinDeg ; if ( theMaxDeg != 5 ) pd << ", theMaxDeg=" << theMaxDeg ; if ( fabs(theTol2D-0.0001) > Precision::Confusion() ) - pd << ", theTol2D=" << theTol2D ; + { pd << ", theTol2D=" << theTol2D ; } if ( fabs(theTol3D-0.0001) > Precision::Confusion() ) - pd << ", theTol3D=" << theTol3D ; + { pd << ", theTol3D=" << theTol3D ; } if ( theNbIter != 0 ) pd << ", theNbIter=" << theNbIter ; if ( theMethod==1 ) pd << ", theMethod=GEOM.FOM_UseOri"; else if( theMethod==2 ) pd << ", theMethod=GEOM.FOM_AutoCorrect"; - if(isApprox) pd << ", isApprox=" << isApprox ; + if ( isApprox ) pd << ", isApprox=" << isApprox ; pd << ")"; SetErrorCode(OK); diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx index de227452e..c7f427b39 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx @@ -50,17 +50,17 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) MakeDiskR (double theR, int theOrientation); Standard_EXPORT Handle(GEOM_Object) MakeCylinderRH (double theR, double theH); Standard_EXPORT Handle(GEOM_Object) MakeCylinderPntVecRH (Handle(GEOM_Object) thePnt, - Handle(GEOM_Object) theVec, - double theR, double theH); + Handle(GEOM_Object) theVec, + double theR, double theH); Standard_EXPORT Handle(GEOM_Object) MakeCylinderRHA (double theR, double theH, double theA); Standard_EXPORT Handle(GEOM_Object) MakeCylinderPntVecRHA (Handle(GEOM_Object) thePnt, - Handle(GEOM_Object) theVec, - double theR, double theH, double theA); + Handle(GEOM_Object) theVec, + double theR, double theH, double theA); Standard_EXPORT Handle(GEOM_Object) MakeConeR1R2H (double theR1, double theR2, double theH); Standard_EXPORT Handle(GEOM_Object) MakeConePntVecR1R2H (Handle(GEOM_Object) thePnt, - Handle(GEOM_Object) theVec, - double theR1, double theR2, double theH); + Handle(GEOM_Object) theVec, + double theR1, double theR2, double theH); Standard_EXPORT Handle(GEOM_Object) MakeSphereR (double theR); Standard_EXPORT Handle(GEOM_Object) MakeSpherePntR (Handle(GEOM_Object) thePnt, double theR); @@ -68,8 +68,8 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) MakeTorusRR (double theRMajor, double theRMinor); Standard_EXPORT Handle(GEOM_Object) MakeTorusPntVecRR (Handle(GEOM_Object) thePnt, - Handle(GEOM_Object) theVec, - double theRMajor, double theRMinor); + Handle(GEOM_Object) theVec, + double theRMajor, double theRMinor); Standard_EXPORT Handle(GEOM_Object) MakePrismVecH (Handle(GEOM_Object) theBase, Handle(GEOM_Object) theVec, @@ -109,7 +109,7 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { Handle(GEOM_Object) theAxis, double theAngle); - Standard_EXPORT Handle(GEOM_Object) MakeFilling (Handle(GEOM_Object) theShape, + Standard_EXPORT Handle(GEOM_Object) MakeFilling (std::list< Handle(GEOM_Object)> & theContours, int theMinDeg, int theMaxDeg, double theTol2D, double theTol3D, int theNbIter, int theMethod, diff --git a/src/GEOMImpl/GEOMImpl_IFilling.hxx b/src/GEOMImpl/GEOMImpl_IFilling.hxx index a8fabe3bb..c130b162e 100644 --- a/src/GEOMImpl/GEOMImpl_IFilling.hxx +++ b/src/GEOMImpl/GEOMImpl_IFilling.hxx @@ -23,44 +23,61 @@ //NOTE: This is an intreface to a function for the Filling operation. // #include "GEOM_Function.hxx" +#include -#define FILL_ARG_MINDEG 1 -#define FILL_ARG_MAXDEG 2 -#define FILL_ARG_TOL2D 3 -#define FILL_ARG_TOL3D 4 -#define FILL_ARG_SHAPE 5 -#define FILL_ARG_NBITER 6 -#define FILL_ARG_APPROX 7 -#define FILL_ARG_METHOD 8 +enum GEOMImpl_IFilling_Arg { + FILL_ARG_MINDEG = 1, + FILL_ARG_MAXDEG = 2, + FILL_ARG_TOL2D = 3, + FILL_ARG_TOL3D = 4, + FILL_ARG_SHAPE = 5, + FILL_ARG_NBITER = 6, + FILL_ARG_APPROX = 7, + FILL_ARG_METHOD = 8 +}; class GEOMImpl_IFilling { - public: +public: GEOMImpl_IFilling(Handle(GEOM_Function) theFunction): _func(theFunction) {} - + void SetTol2D(double theTol2D) { _func->SetReal(FILL_ARG_TOL2D, theTol2D); } - void SetTol3D(double theTol3D) { _func->SetReal(FILL_ARG_TOL3D, theTol3D); } + void SetTol3D(double theTol3D) { _func->SetReal(FILL_ARG_TOL3D, theTol3D); } double GetTol2D() { return _func->GetReal(FILL_ARG_TOL2D); } - double GetTol3D() { return _func->GetReal(FILL_ARG_TOL3D); } - + double GetTol3D() { return _func->GetReal(FILL_ARG_TOL3D); } + void SetMinDeg(int theMinDeg) { _func->SetInteger(FILL_ARG_MINDEG, theMinDeg); } void SetMaxDeg(int theMaxDeg) { _func->SetInteger(FILL_ARG_MAXDEG, theMaxDeg); } int GetMinDeg() { return _func->GetInteger(FILL_ARG_MINDEG); } int GetMaxDeg() { return _func->GetInteger(FILL_ARG_MAXDEG); } void SetNbIter(int theNbIter) { _func->SetInteger(FILL_ARG_NBITER, theNbIter); } - int GetNbIter() { return _func->GetInteger(FILL_ARG_NBITER); } + int GetNbIter() { return _func->GetInteger(FILL_ARG_NBITER); } void SetApprox(bool theApprox) { _func->SetInteger(FILL_ARG_APPROX, theApprox); } - bool GetApprox() { return _func->GetInteger(FILL_ARG_APPROX); } + bool GetApprox() { return _func->GetInteger(FILL_ARG_APPROX); } void SetMethod(int theMethod) { _func->SetInteger(FILL_ARG_METHOD, theMethod); } - int GetMethod() { return _func->GetInteger(FILL_ARG_METHOD); } + int GetMethod() { return _func->GetInteger(FILL_ARG_METHOD); } + void SetShapes(const Handle(TColStd_HSequenceOfTransient)& theShapes) + { _func->SetReferenceList(FILL_ARG_SHAPE, theShapes); } + Handle(TColStd_HSequenceOfTransient) GetShapes() + { + Handle(TColStd_HSequenceOfTransient) aSeq = _func->GetReferenceList(FILL_ARG_SHAPE); + if ( aSeq.IsNull() ) { + Handle(GEOM_Function) fun = GetShape(); + if ( !fun.IsNull() ) { + aSeq = new TColStd_HSequenceOfTransient; + aSeq->Append( fun ); + } + } + return aSeq; + } void SetShape(Handle(GEOM_Function) theShape) { _func->SetReference(FILL_ARG_SHAPE, theShape); } Handle(GEOM_Function) GetShape() { return _func->GetReference(FILL_ARG_SHAPE); } - private: +private: Handle(GEOM_Function) _func; }; diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc index ef874e824..e302bdb1e 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc @@ -880,14 +880,14 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeRevolutionAxisAngle2Ways */ //============================================================================= GEOM::GEOM_Object_ptr -GEOM_I3DPrimOperations_i::MakeFilling(GEOM::GEOM_Object_ptr theShape, - CORBA::Long theMinDeg, - CORBA::Long theMaxDeg, - CORBA::Double theTol2D, - CORBA::Double theTol3D, - CORBA::Long theNbIter, +GEOM_I3DPrimOperations_i::MakeFilling(const GEOM::ListOfGO& theContours, + CORBA::Long theMinDeg, + CORBA::Long theMaxDeg, + CORBA::Double theTol2D, + CORBA::Double theTol3D, + CORBA::Long theNbIter, GEOM::filling_oper_method theMethod, - CORBA::Boolean theApprox) + CORBA::Boolean theApprox) { GEOM::GEOM_Object_var aGEOMObject; @@ -895,9 +895,9 @@ GEOM_I3DPrimOperations_i::MakeFilling(GEOM::GEOM_Object_ptr theShape, GetOperations()->SetNotDone(); //Get the reference objects - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - - if (aShape.IsNull()) return aGEOMObject._retn(); + std::list< Handle(GEOM_Object) > aShapes; + if (! GetListOfObjectsImpl( theContours, aShapes )) + return aGEOMObject._retn(); int aMethod = 0; switch (theMethod) { @@ -925,8 +925,7 @@ GEOM_I3DPrimOperations_i::MakeFilling(GEOM::GEOM_Object_ptr theShape, //Create the Solid Handle(GEOM_Object) anObject = GetOperations()->MakeFilling - (aShape, theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter, - aMethod, theApprox); + (aShapes, theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter, aMethod, theApprox); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh index 56c1cbc7b..844067dd4 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh @@ -166,7 +166,7 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i : GEOM::GEOM_Object_ptr theAxis, CORBA::Double theAngle); - GEOM::GEOM_Object_ptr MakeFilling(GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr MakeFilling(const GEOM::ListOfGO& theContours, CORBA::Long theMinDeg, CORBA::Long theMaxDeg, CORBA::Double theTol2D, CORBA::Double theTol3D, CORBA::Long theNbIter, diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 867a5c6f7..98cc96638 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -1453,8 +1453,11 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeFilling (GEOM::GEOM_Object_ptr theShape beginService( " GEOM_Superv_i::MakeFilling" ); MESSAGE("GEOM_Superv_i::MakeFilling"); get3DPrimOp(); + GEOM::ListOfGO_var objList = new GEOM::ListOfGO; + objList->length( 1 ); + objList[0] = theShape; GEOM::GEOM_Object_ptr anObj = - my3DPrimOp->MakeFilling(theShape, theMinDeg, theMaxDeg, theTol2D, theTol3D, + my3DPrimOp->MakeFilling(objList, theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter, theMethod, theApprox); endService( " GEOM_Superv_i::MakeFilling" ); return anObj; @@ -2348,8 +2351,11 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeGlueFaces (GEOM::GEOM_Object_ptr theSha beginService( " GEOM_Superv_i::MakeGlueFaces" ); MESSAGE("GEOM_Superv_i::MakeGlueFaces"); getShapesOp(); + GEOM::ListOfGO_var objList = new GEOM::ListOfGO; + objList->length( 1 ); + objList[0] = theShape; GEOM::GEOM_Object_ptr anObj = - myShapesOp->MakeGlueFaces(theShape, theTolerance, doKeepNonSolids); + myShapesOp->MakeGlueFaces(objList, theTolerance, doKeepNonSolids); endService( " GEOM_Superv_i::MakeGlueFaces" ); return anObj; } @@ -2363,7 +2369,10 @@ GEOM::GEOM_List_ptr GEOM_Superv_i::GetGlueFaces (GEOM::GEOM_Object_ptr theShape, beginService( " GEOM_Superv_i::GetGlueFaces" ); MESSAGE("GEOM_Superv_i::GetGlueFaces"); getShapesOp(); - GEOM::ListOfGO* aList = myShapesOp->GetGlueFaces(theShape, theTolerance); + GEOM::ListOfGO_var objList = new GEOM::ListOfGO; + objList->length( 1 ); + objList[0] = theShape; + GEOM::ListOfGO* aList = myShapesOp->GetGlueFaces(objList, theTolerance); GEOM_List_i* aListPtr = new GEOM_List_i(*(aList)); MESSAGE(" List of "<GetList().length()<<" element(s)"); endService( " GEOM_Superv_i::GetGlueFaces" ); @@ -2382,8 +2391,11 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeGlueFacesByList (GEOM::GEOM_Object_ptr beginService( " GEOM_Superv_i::MakeGlueFacesByList" ); MESSAGE("GEOM_Superv_i::MakeGlueFacesByList"); getShapesOp(); + GEOM::ListOfGO_var objList = new GEOM::ListOfGO; + objList->length( 1 ); + objList[0] = theShape; GEOM::GEOM_Object_ptr anObj = - myShapesOp->MakeGlueFacesByList(theShape, theTolerance, theFaces, + myShapesOp->MakeGlueFacesByList(objList, theTolerance, theFaces, doKeepNonSolids, doGlueAllEdges); endService( " GEOM_Superv_i::MakeGlueFacesByList" ); return anObj; diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index cc2926c64..b37da651a 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -3706,14 +3706,15 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): self._autoPublish(anObj, theName, "revolution") return anObj - ## Create a filling from the given compound of contours. - # @param theShape the compound of contours - # @param theMinDeg a minimal degree of BSpline surface to create - # @param theMaxDeg a maximal degree of BSpline surface to create - # @param theTol2D a 2d tolerance to be reached - # @param theTol3D a 3d tolerance to be reached - # @param theNbIter a number of iteration of approximation algorithm - # @param theMethod Kind of method to perform filling operation(see GEOM::filling_oper_method()) + ## Create a face from a given set of contours. + # @param theContours either a list or a compound of edges/wires. + # @param theMinDeg a minimal degree of BSpline surface to create. + # @param theMaxDeg a maximal degree of BSpline surface to create. + # @param theTol2D a 2d tolerance to be reached. + # @param theTol3D a 3d tolerance to be reached. + # @param theNbIter a number of iteration of approximation algorithm. + # @param theMethod Kind of method to perform filling operation + # (see GEOM.filling_oper_method enum). # @param isApprox if True, BSpline curves are generated in the process # of surface construction. By default it is False, that means # the surface is created using given curves. The usage of @@ -3723,41 +3724,42 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. # - # @return New GEOM.GEOM_Object, containing the created filling surface. + # @return New GEOM.GEOM_Object (face), containing the created filling surface. # # @ref tui_creation_filling "Example" @ManageTransactions("PrimOp") - def MakeFilling(self, theShape, theMinDeg=2, theMaxDeg=5, theTol2D=0.0001, + def MakeFilling(self, theContours, theMinDeg=2, theMaxDeg=5, theTol2D=0.0001, theTol3D=0.0001, theNbIter=0, theMethod=GEOM.FOM_Default, isApprox=0, theName=None): """ - Create a filling from the given compound of contours. + Create a face from a given set of contours. Parameters: - theShape the compound of contours - theMinDeg a minimal degree of BSpline surface to create - theMaxDeg a maximal degree of BSpline surface to create - theTol2D a 2d tolerance to be reached - theTol3D a 3d tolerance to be reached - theNbIter a number of iteration of approximation algorithm - theMethod Kind of method to perform filling operation(see GEOM::filling_oper_method()) + theContours either a list or a compound of edges/wires. + theMinDeg a minimal degree of BSpline surface to create. + theMaxDeg a maximal degree of BSpline surface to create. + theTol2D a 2d tolerance to be reached. + theTol3D a 3d tolerance to be reached. + theNbIter a number of iteration of approximation algorithm. + theMethod Kind of method to perform filling operation + (see GEOM.filling_oper_method enum). isApprox if True, BSpline curves are generated in the process of surface construction. By default it is False, that means the surface is created using given curves. The usage of Approximation makes the algorithm work slower, but allows - building the surface for rather complex cases + building the surface for rather complex cases. 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. Returns: - New GEOM.GEOM_Object, containing the created filling surface. + New GEOM.GEOM_Object (face), containing the created filling surface. Example of usage: filling = geompy.MakeFilling(compound, 2, 5, 0.0001, 0.0001, 5) """ # Example: see GEOM_TestAll.py theMinDeg,theMaxDeg,theTol2D,theTol3D,theNbIter,Parameters = ParseParameters(theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter) - anObj = self.PrimOp.MakeFilling(theShape, theMinDeg, theMaxDeg, + anObj = self.PrimOp.MakeFilling(ToList(theContours), theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter, theMethod, isApprox) RaiseIfFailed("MakeFilling", self.PrimOp) @@ -3766,43 +3768,43 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): return anObj - ## Create a filling from the given compound of contours. - # This method corresponds to MakeFilling with isApprox=True - # @param theShape the compound of contours - # @param theMinDeg a minimal degree of BSpline surface to create - # @param theMaxDeg a maximal degree of BSpline surface to create - # @param theTol3D a 3d tolerance to be reached + ## Create a face from a given set of contours. + # This method corresponds to MakeFilling() with isApprox=True. + # @param theContours either a list or a compound of edges/wires. + # @param theMinDeg a minimal degree of BSpline surface to create. + # @param theMaxDeg a maximal degree of BSpline surface to create. + # @param theTol3D a 3d tolerance to be reached. # @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 New GEOM.GEOM_Object, containing the created filling surface. + # @return New GEOM.GEOM_Object (face), containing the created filling surface. # # @ref tui_creation_filling "Example" @ManageTransactions("PrimOp") - def MakeFillingNew(self, theShape, theMinDeg=2, theMaxDeg=5, theTol3D=0.0001, theName=None): + def MakeFillingNew(self, theContours, theMinDeg=2, theMaxDeg=5, theTol3D=0.0001, theName=None): """ Create a filling from the given compound of contours. - This method corresponds to MakeFilling with isApprox=True + This method corresponds to MakeFilling() with isApprox=True. Parameters: - theShape the compound of contours - theMinDeg a minimal degree of BSpline surface to create - theMaxDeg a maximal degree of BSpline surface to create - theTol3D a 3d tolerance to be reached + theContours either a list or a compound of edges/wires. + theMinDeg a minimal degree of BSpline surface to create. + theMaxDeg a maximal degree of BSpline surface to create. + theTol3D a 3d tolerance to be reached. 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. Returns: - New GEOM.GEOM_Object, containing the created filling surface. + New GEOM.GEOM_Object (face), containing the created filling surface. Example of usage: filling = geompy.MakeFillingNew(compound, 2, 5, 0.0001) """ # Example: see GEOM_TestAll.py theMinDeg,theMaxDeg,theTol3D,Parameters = ParseParameters(theMinDeg, theMaxDeg, theTol3D) - anObj = self.PrimOp.MakeFilling(theShape, theMinDeg, theMaxDeg, + anObj = self.PrimOp.MakeFilling(theContours, theMinDeg, theMaxDeg, 0, theTol3D, 0, GEOM.FOM_Default, True) RaiseIfFailed("MakeFillingNew", self.PrimOp) anObj.SetParameters(Parameters) @@ -4481,7 +4483,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): New GEOM.GEOM_Object, containing the created face. """ # Example: see GEOM_TestAll.py - anObj = self.ShapesOp.MakeFaceWires(theWires, isPlanarWanted) + anObj = self.ShapesOp.MakeFaceWires(ToList(theWires), isPlanarWanted) if isPlanarWanted and anObj is not None and self.ShapesOp.GetErrorCode() == "MAKE_FACE_TOLERANCE_TOO_BIG": print "WARNING: Cannot build a planar face: required tolerance is too big. Non-planar face is built." else: @@ -4555,6 +4557,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): New GEOM.GEOM_Object, containing the created solid. """ # Example: see GEOM_TestAll.py + theShells = ToList(theShells) if len(theShells) == 1: descr = self._IsGoodForSolid(theShells[0]) #if len(descr) > 0: @@ -4590,7 +4593,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): New GEOM.GEOM_Object, containing the created compound. """ # Example: see GEOM_TestAll.py - anObj = self.ShapesOp.MakeCompound(theShapes) + anObj = self.ShapesOp.MakeCompound(ToList(theShapes)) RaiseIfFailed("MakeCompound", self.ShapesOp) self._autoPublish(anObj, theName, "compound") return anObj diff --git a/src/GenerationGUI/GenerationGUI_FillingDlg.cxx b/src/GenerationGUI/GenerationGUI_FillingDlg.cxx index 141b9598f..cb85fad52 100644 --- a/src/GenerationGUI/GenerationGUI_FillingDlg.cxx +++ b/src/GenerationGUI/GenerationGUI_FillingDlg.cxx @@ -35,7 +35,8 @@ #include #include -#include +#include + #include //================================================================================= @@ -105,7 +106,7 @@ void GenerationGUI_FillingDlg::Init() myEditCurrentArgument = GroupPoints->LineEdit1; GroupPoints->LineEdit1->setReadOnly(true); - globalSelection(GEOM_COMPOUND); + initSelection(); int SpecificStep1 = 1; double SpecificStep2 = 0.0001; @@ -186,9 +187,24 @@ bool GenerationGUI_FillingDlg::ClickOnApply() return false; initName(); + initSelection(); + return true; } +//================================================================================= +// function : initSelection +// purpose : +//================================================================================= +void GenerationGUI_FillingDlg::initSelection() +{ + TColStd_MapOfInteger aTypes; + aTypes.Add( GEOM_EDGE ); + aTypes.Add( GEOM_WIRE ); + aTypes.Add( GEOM_COMPOUND ); + globalSelection( aTypes ); +} + //================================================================================= // function : SelectionIntoArgument() // purpose : Called when selection as changed or other case @@ -199,18 +215,13 @@ void GenerationGUI_FillingDlg::SelectionIntoArgument() myEditCurrentArgument->setText(""); if (myEditCurrentArgument == GroupPoints->LineEdit1) { - myCompound = getSelected(TopAbs_COMPOUND); - if (myCompound) { - if (myCompound->GetMaxShapeType() < GEOM::WIRE || myCompound->GetMinShapeType() > GEOM::EDGE) { - myCompound.nullify(); - } - else { - QString aName = GEOMBase::GetName(myCompound.get()); - myEditCurrentArgument->setText(aName); - } + QList objs = getSelected(TopAbs_SHAPE, -1); + GEOMBase::Synchronize(myObjects, objs); + if ( !myObjects.isEmpty() ) { + QString aName = myObjects.count() > 1 ? QString( "%1_objects").arg( myObjects.count() ) : GEOMBase::GetName( myObjects[0].get() ); + myEditCurrentArgument->setText( aName ); } } - processPreview(); } @@ -240,7 +251,7 @@ void GenerationGUI_FillingDlg::ActivateThisDialog() GEOMBase_Skeleton::ActivateThisDialog(); connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - globalSelection(GEOM_COMPOUND); + initSelection(); processPreview(); } @@ -319,12 +330,12 @@ GEOM::GEOM_IOperations_ptr GenerationGUI_FillingDlg::createOperation() //================================================================================= bool GenerationGUI_FillingDlg::isValid(QString& msg) { - bool ok = GroupPoints->SpinBox1->isValid(msg, !IsPreview()) && - GroupPoints->SpinBox2->isValid(msg, !IsPreview()) && - GroupPoints->SpinBox3->isValid(msg, !IsPreview()) && - GroupPoints->SpinBox4->isValid(msg, !IsPreview()) && - GroupPoints->SpinBox5->isValid(msg, !IsPreview()) && - myCompound; + bool ok = ( GroupPoints->SpinBox1->isValid(msg, !IsPreview()) && + GroupPoints->SpinBox2->isValid(msg, !IsPreview()) && + GroupPoints->SpinBox3->isValid(msg, !IsPreview()) && + GroupPoints->SpinBox4->isValid(msg, !IsPreview()) && + GroupPoints->SpinBox5->isValid(msg, !IsPreview()) && + myObjects.count() ); return ok; } @@ -340,21 +351,26 @@ bool GenerationGUI_FillingDlg::execute(ObjectList& objects) GEOM::filling_oper_method aMethod; switch (GroupPoints->ComboBox1->currentIndex()) { - case 0: aMethod = GEOM::FOM_Default; break; - case 1: aMethod = GEOM::FOM_UseOri; break; - case 2: aMethod = GEOM::FOM_AutoCorrect; break; - default: break; + case 0: aMethod = GEOM::FOM_Default; break; + case 1: aMethod = GEOM::FOM_UseOri; break; + case 2: aMethod = GEOM::FOM_AutoCorrect; break; + default: break; } + GEOM::ListOfGO_var objList = new GEOM::ListOfGO; + objList->length( myObjects.count() ); + for ( int i = 0; i < myObjects.count(); ++i ) + objList[i] = myObjects[i].copy(); + GEOM::GEOM_Object_var anObj = - anOper->MakeFilling(myCompound.get(), - GroupPoints->SpinBox1->value(), - GroupPoints->SpinBox4->value(), - GroupPoints->SpinBox2->value(), - GroupPoints->SpinBox5->value(), - GroupPoints->SpinBox3->value(), - aMethod, - GroupPoints->CheckBox1->isChecked()); + anOper->MakeFilling(objList, + GroupPoints->SpinBox1->value(), + GroupPoints->SpinBox4->value(), + GroupPoints->SpinBox2->value(), + GroupPoints->SpinBox5->value(), + GroupPoints->SpinBox3->value(), + aMethod, + GroupPoints->CheckBox1->isChecked()); if (!anObj->_is_nil()) { if (!IsPreview()) diff --git a/src/GenerationGUI/GenerationGUI_FillingDlg.h b/src/GenerationGUI/GenerationGUI_FillingDlg.h index a6a828a04..f849cc468 100644 --- a/src/GenerationGUI/GenerationGUI_FillingDlg.h +++ b/src/GenerationGUI/GenerationGUI_FillingDlg.h @@ -53,9 +53,10 @@ protected: private: void Init(); void enterEvent( QEvent* ); + void initSelection(); private: - GEOM::GeomObjPtr myCompound; /* compound of curves */ + QList myObjects;/* lit or compound of curves */ DlgRef_1Sel5Spin1Check* GroupPoints; private slots: