From 939f3cca95870d93e333f2b4dfdea41ed1ba9092 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 21 Dec 2017 19:13:17 +0300 Subject: [PATCH] GPUSPHGUI: add an option to Offset Surface opreation definig a mode of filling the gap between adjacent translated surfaces: - by pipes or - by intersection --- .../transformation_operations_ex06.py | 7 ++- .../gui/GEOM/images/transformation11.png | Bin 12250 -> 17700 bytes .../gui/GEOM/input/offset_operation.doc | 14 ++++- idl/GEOM_Gen.idl | 10 +++- src/GEOMGUI/GEOM_msg_en.ts | 7 +++ src/GEOMImpl/GEOMImpl_IOffset.hxx | 5 ++ .../GEOMImpl_ITransformOperations.cxx | 22 ++++--- .../GEOMImpl_ITransformOperations.hxx | 6 +- src/GEOMImpl/GEOMImpl_OffsetDriver.cxx | 19 ++++-- src/GEOM_I/GEOM_Gen_i.cc | 28 ++++----- src/GEOM_I/GEOM_Gen_i.hh | 3 +- src/GEOM_I/GEOM_ITransformOperations_i.cc | 19 +++--- src/GEOM_I/GEOM_ITransformOperations_i.hh | 6 +- src/GEOM_SWIG/geomBuilder.py | 54 +++++++++++++++-- .../TransformationGUI_OffsetDlg.cxx | 55 ++++++++++-------- .../TransformationGUI_OffsetDlg.h | 3 +- src/XAOPlugin/XAOPlugin_IOperations_i.cc | 2 +- 17 files changed, 182 insertions(+), 78 deletions(-) mode change 100755 => 100644 doc/salome/gui/GEOM/images/transformation11.png diff --git a/doc/salome/examples/transformation_operations_ex06.py b/doc/salome/examples/transformation_operations_ex06.py index 64f8b6615..f448d4a4e 100644 --- a/doc/salome/examples/transformation_operations_ex06.py +++ b/doc/salome/examples/transformation_operations_ex06.py @@ -11,13 +11,16 @@ gg = salome.ImportComponentGUI("GEOM") box = geompy.MakeBox(20, 20, 20, 200, 200, 200) # create a new object as offset of the given object -offset = geompy.MakeOffset(box, 70.) +offset = geompy.MakeOffset(box, 70.) +offset2 = geompy.MakeOffsetIntersectionJoin(box, 70.) # add objects in the study id_box = geompy.addToStudy(box, "Box") id_offset = geompy.addToStudy(offset, "Offset") +id_offset2 = geompy.addToStudy(offset2, "Offset_intersection_join") # display the results gg.createAndDisplayGO(id_box) gg.setDisplayMode(id_box,1) -gg.createAndDisplayGO(id_offset) +gg.createAndDisplayGO(id_offset) +gg.createAndDisplayGO(id_offset2) diff --git a/doc/salome/gui/GEOM/images/transformation11.png b/doc/salome/gui/GEOM/images/transformation11.png old mode 100755 new mode 100644 index 922071e1d368849fd385c85a3bc75d58c17f8cfb..9473333980e946b6229cbbec66d1cc52703d04b0 GIT binary patch literal 17700 zcmb`v1z1$yzCONDX#u5Fx{(G6X%M6vq`MoG7$gQ%Km`OuN@75|yIZ=u8B!XChN0oN z`JQ`!_ndR@xxe%LpZ|VfGsDbUYxY`ef7bhX-*-)rs75E49t*ovq`1&OH8-!x@Xgd`Er~tXwuim^*+?n$*AXukF-)F=O76;U3 zLzwM|URiK3R-=ar>Q_|^DaQA*zFtwD=&)3|>hB-pYCuk1JfYEgl?ca!*g@ zO1^ynIF6X=#w7lzy^K_;a>lG6!Bq`qb@{fmFruZP~t87UI4HthILFd zk98+4Jyz3-iJ=vlZT;l`vt?y0%C+f+r1~8Jb--ZfdJ`}NOnowRc0D>KeMb8k&wSoU zrD+&Go7f4_N>beWo_($V(XVL=)r#rDTjj~r+ngoK0}_^od)G@w^&F+8!q zZ{K9h!NGBR?R8N}E)>JA+ct0T*5>DHnm7^H%&OSQ@fC~Ax5WweV})}Z!6C^a-fPQG zeiLE^qJb@tOrrrG^h(I5Yieo>^-5^?d06+lBiUg>MMgCv{o~OM0@&Cg8NJ%XgoJL} zGrX+)KbdA1_p02z&%lwC{``4+vcM8+eGn$(e(`OxsQ2wOE>QkqXH*CHV0EAJ2>>us zO`-g^Q}LXax|*7r`h_~xBa8=MgMguIIXXfqxo@H0j*pKCwM?)f?erOF7ZpziOM65j~~KY z1ppi7_W{KQu6e6wWCKPhzj92%wa->i0DhEa+<)uzirdrt=m;AN3rk)>0h79;qk~+q z+h*X5?g)z{hZy_tnj< z=fw+s1EoUwItJfP#7y$3x+|UZT)rIocGHU&O*a>LPKGnX0Z&Ot>`X3!58O7vxrK!j z+J|2mD+;GqpAbHM`n0yX=CQ=?d_&#)gFo#dPi{{pjRPK4QA_G=ZW9p`b`_16TJ}yZ zcM^{tlc((a8qIG`5t>$gj2@3#)C>wWwLe;7k!%VJzqnezMizCB&9?6Y^gs4KI$<8yCJFpZ<-z?jPsB+v10_Hrr zA{HrPfk}0@TG1Q^@&f5=#;Wvz(iY5ug4%OXPEH$mr6c%*^Y9@J z4Gji0xgdmsXI7 zVITE}0EtF2N?>NtVW)!o)>uwzsk)6Q!pS;B)I+1gnq18Kh3cDw(%RJYvjO@t3M(rs zk*#+Qz;7-)R3UTouXHv^Yil#Y3ZH`Hdf{y&zv-P z?dUkfKlkLguyXh1?%wDg;k>VpNT&9n#|3g{d2K6oUq$_sTTEcj_=7?Y*yT$W^KSU~2{(a~+=rM0`}xRA&~MA1TFDCb&BTv97> zL{_-8m~!r;pg*A(qSUp2f@3YE!ci@2U>8WlWKnWZ5ax(6Sgq|MDPcpOH}T37BLxK} zHYR%Eq>>1=EL`%H@Xe>n5Pu^gF)?r7(}h&xxceO&Sn%LpmY(37RJw7^TRNoo=^P3% zG1Mzzd#mz|p9uh{$DcbnT;lG`c-UmgD~(n%l#?a4aBRWFA~NdSXQU4q8;76K>cDQQZT^KE7u4J-Kj)^Enc-w^tDY z9|#^H{+}m1ObCyXy)_vC*qMcEJ2WfPq&(UJe&zhajF5e9sW9D$#qc-;963y-qxZtX zZ!rN9wshqU)>6{FTo6oe`mH|FQ#V?3xXM+ZXVUrWf*;YUt%^e`8r3W1F zmxLGM<07A1zVf@7gUk>ek7C!CiI4r__qwu^ofekCftZ`-?ZgB10wJ z^hj%=$HETjb@zN2xe&gD!RLo;OiY$N=RUp=D>Q04m-Rw$-L5JvC)-@wMXWqGG@PkE zuDHTJSH7+GRnpehmQcIzi1>-rP#>j9g^0dCQ>DYlJiE&8`$odcR^XUkQ~ce1Bey&#@*XGt1zQh9`QK{=on_Qd(e?I4jZtq<1L)wu8g@?SB#tQTK8E>UJ`wXq_H}Z6$RQvjVTh2m8cf{WS#{?X zh+{&`R46z&7)VLAYa3JkaMpUx)79Ur@h(bJGg{()iVo|Ig>iXs-g8oB;BBP*>2zFt z`~Zww$gP)8q6^JWOkxxSiv#-AQ?1Yk8qF;&W}Ao6;HP>;onqSDteBDBr zpdeNl<==qFLn3GKgA=6Dc7^XOor<|Rt>zXtAubV69kdfq4v3e1EDHG-bG&%&jlq8a z6LDrKzy?8wADl{e7s6d=N>S_n{7}CSg&NMq$o{|qLZ3y_)z#{~QCHWCHOWd#OM}Z- zNre!fa0>%K=$`|f#>5_oFY}}Qcl_vp5^DIP7<;D*gKw?VEC3G?;s7fdeB1vBj{dsY z#(wyxJ_ZMk1;lmCtack8fe$f1E4hibu!TG})0JtJSf^IkRyRqX3i8+R9E$_ud8JNs zJ>G}u3hM*zPANgCb%%$CT+0kR$Ik(A_-9;F$e*dft@5F^!s#Uh(TB3Jt0QMK5D5Kp z`YZaxTNewtZ@sB+i8$YW1Tn^mr^lC##$nK=gs!fuCOP zHO0mh88_W*45#rZO};M>L@suDr#ZEv0Xw6=Bj$GC;Qeozw=e*&eSctPVq)Uvc6_ux zc)GVh`Sd9WFQlx7TfgAJV6atVd#od!H~p2Ez={0*W~cT;%eqrUG)Gl=WeJIekkwUN z)Yu!_?sa3I%@^-Cz+oIL90M7E-nsw zz8b426c`v7$)NP&#S1X7UtFIqbSJb5lGUN`FoMu7l0o@76Pr@4ONO+kmX-8c=(fIu ze=99bMj%bZ^W8sz;(lUHAH+*uyKJ_2iWw)9s|m$rEIp2(pxBked}m}o@!-qnlG6kj zOvG(NbrWvd`q|Rjnn2>GIr{|;jVl#$=?kT_j7*c)2{RKD6B}Eo?z{eY-qB1Y7FO2T z67$Y4l)gG?s1=!L00|Dx?3=#zqem+o8joGCGfo*g{Dbpb>>NsV zqx?MhNGr6>E7@+-o>I)u%2r-}>)e>bVV1CsC+}v;PN(|qQmy+o898~DGK^WI^bYn# z(8>_A>Zq!~?uncKifh_QkwhbX_6#QAt)*AW^n7JmGf%z9NKTJ_EW zesdFS#LdWv!j+6MLiWvq9bhBD1EE^3uYao{3kbOg2nZ(gbqO9l`rX(gLkXoL4$;ondHn2|=TZx5 z=3B&6Nn>LpII!WAVoBWAxEeMV7RQUt_s3;$fzZT`Pq66dj6f;BO?_u)j-nG$0+Fnz zq|b8ZWj`e2DUA{cXR+$kw?W(9B74j`zF}fwo^PaugXp!)ZF2-%^0~}Aii^ywtzSYA zI<&ND849uTD&}J6D+KYGVBRX^wlTz{k;xfoWMnikG0`LX>$@-HBOVtJkM)npfG70} zYI=G)yJ2H$iVO;Xv$%L;^W;e-yo=84AaAk=UTK^5mZ`AwKETM6npW8%cf(3_ng;Ml zVL&RxZSLDp#827g+X{_-rnm?2JmkH-O3*1L*usv)Cm{7A1b#Wj65t1*Nx19Tm}Ql~ z>fFFEvC>wOe9&bE>~cCN*0cG)j zb;_onT1rR(hTar+vQ(NdMyO)AgHMJ6Wa*+xGaMFvegE1%t~nl%c_3^A*!2A*d!ea0 zZdRhBOI~R*SzGaLvo|(c^WH}w776@PiMn@O5(j@DzLmMyc9x%lBzeAG0 z#Y=p|NTK1jvn4F?M=oqQJG&{`T@nw(Ge7k{&24g9dnY6$i+XDbrJ(@Xj1J9(rKK-K z4-N;q$b*7nL1_E41q2sgnl63Mx`v7Gqd%6Q5c3r_N0RBwtQ&eG#mQ(S3c31fB!Vrsg(F-DwQz$ZM=$M~&KP=zWot_@4K>GO(4YxajHOgrh z%9A3TE&J=M2}xht_VCyXp@(yshr{?&YT{5nSOv08wRg0`AC~g%jrVp~4P{L6+n!%v z-jdy(XTe|IQUy4`A1|$Kc?qz`3>IAcqT` zzv{*(#^YDNi>!dP%CKl%L-&#pdKVWLU1n)KD=sg#pJXp7c}GMD{({fu+t8<5$lbevfA zw&cqtMoj$C`T$H2igtto#;o>{RhAu?p}&L#NFQnLfy6~%r@@+bq%7UVO(!kLuq{yf zhDZtkK!IlnEr;cWzApBekE`pEqrQZF5e_i)h{x3e9T@6bsw?>i-p+wi_05|%QBjSA z7~ka|10+I00jbY}N+Kdk6TgCYM|Jv`xUn%9-+x%#7dP*q>nKW3%W92~~13GSc-tKWa%8tQx9><)|7@WhgLO?!?B% zKFJvt1?q`LA(;|TQ)_y^AIx@6&AacM3L8Hzbq$-3JFMHOtItO=8VY(8swE}FW;vT| zEUu(lT>|@BAS6;hW6Y^tBS!SFFbhkEs{Q=Q2R6Hzru!SyIyEpn8bGD*mzF+KgYZUx#iVPK2^=RqB}^`O#z z;)|{U(@*PBWx@EiydtT3)9t}t{?-%J}}U;Wo>DdJ#Aj_b99O%@NN$K zoVz1oiG?Eh3Cf^qx6^89Qn}r) z)|DSGuIo+@cW>fgu3~A3laL=HJ>R~GF*7rR3ju_P*BZn+MDG4`4c@0a4vrblJ39`0 zb9Ee0xP%O&C^9uNayhIkn}p@F%xkar)r|CQo&~yK?$JT$gdM&CuTpVQr*Q?IU&ner zCL^ij;#}108F$8oy0fq-On+Y~Y6RzVTVf+;hpQ#80t*kPPPxgAO^x@cy1M${t(WO?CKZ@Y-8%O* zBqdQ0-A12> zd{mPO9^tal9NwEt`Yd7U>FFsYRg;pEB2M+4Pkp@r?Sr)JoQbv5{I;}o$G&On&#KLr zPCpY))h(sszgH_XRX9&7pETAtOsuZ1($g8;uwMMm`N_QmuY8`*;Ab$A8mR2W zi%tUr93Lytm01nw>{ajy2js#v|KRKD9BCn9Ft=X9Q{9TokVb=RFn6Pbq z18j~e;T1@k8`ilEPfo5MyuZ~)mw^ENA+<6Pr$TlXZB}d?c#n^x<7&^UQ{nC9e6}nr z#V%K__F$6Q<0W3LhxuqFQck>eW+Ul-3B(iqBb2j2)Xrb~-RM@IwWbH~EAc+(pr?25DYwNBN|*N3 z)tyeoo2=O5Doy=k>3*OoCYDSwSGT>ff$`uTIXU^cF!{ZYiz^4q?CiXIDROdhhP6IY z*P)a^lt8tZ-i?ZS%-?ZG<6CnUWotggHqBQTyHZO9j2B*B3dDWy502x9vZ3AfH`h&j z2cGpYYI=(v`pTAuN?}%pP0EvCt+yIn)NSMaHF|GO=2X^k;7GAcef4mU zKGuuV<;U$=dBP+wiSF~T^zS@Y33wE&~2njau>(M82;O)Kt;UvLbe?s??qo}?XpeSJNJh}Rt`oKe>FH0dik|Q}VbKKapZD)@n*k|+B+_kj2{DJh9rOSS9~Fps6A zV58@e=O`*!%ro z8d=JC6vF$br`A}O&RA+X;4IsOGFGFYiWBvf!0T&V>)dwaM_*rzX4p@jE+m6<>7u!? zhJN-x;;dx&Jz&12`Fc2#;dU?IW;C;(!?=Ma;OR4x&w+t20{;rk1nlestUJYwv&~?Z zKD2L9)E^k|U>n2D?SUXQbu&r5)nruI3;;rf$Gs55lu?@Mbpj7~D|0(e7N&dw0O!!_ z-=Tx+A?<%EGc&i`hG&({agK3*{4Gu2hk*QRFP@UxOKxY9XC%3!Qm&UDK0W$zx+15m zE0A>ZV924I*U{d>W-LcT25E<&ROKm;VdDBvFF=WSW-zGQ5=dMe^Ercbp*ZabSUn0r zDDkgy_kT+2RkukA1@I^v*;&ksXn8m{Osz7NIRIcwgJr6LorUzJTC;zb6iozpTOI|> zA6c7?ZGH-rb_quTWU{?U?6bRe=j!I>=0ZY3aEL@QK3sEc+ldA=;Fd4Y0yfEOln+$Z z)ZQ(E_e_D_oxFydXMbyg^W_U*@ar7!x$o6MXKHHdc%F8Z&G4s&wa6@$C+s(O$@B1! z43%UNbF7R`-Ixi!WXh|SX~(af8ztI>Mw(MCyA8?w{B;Aqeqj1Ae{y^r6qzMYiK1g@ zxWnaz05yNhZGAm>S0T+p+SSOPKYzyUCj@J7lLVpCS`a>sr=(BBEN9&G(X)olJ1NE9 z9Tu#Cu{OZ!6YMq3N?5(^3*lsthYl6kzAo`z4yRXTbvRfY7Wf_W!=X3A}EBGi%yi5B-` z|Enw>-YJL;ig@imNw)rMSsW@3{fIKDUg+z(k*BY#Tj9h6@bH82IzOLPL7~^V@%-~6 zd`ik>kU8|bx#E*gN@fJ_f65Tzz9%G4S&gcxt~+qfvF-@JqN2T}-5dUw+NRh?>-|LF zt9qPb*V1Uz7OTOQ=uKxoQlH0XHeKF)$)IE}bdT1H%}h^snkBT@UM%++-|{})A;ApKMUS^F)y|NrGrq!e?@wL!N z;Z9D_<|_FPD{xHUb7XJtsIVLF>C2ZXN)j2Tyssn+cH7LYpB=VykvoWQF@s{oLPXy( zuPL5YvTb=hxTAh$AfUhw@?>Cqnk}~-oi4NP3?skXt=r2jO)cpE)wt1g=!Q;4AJ@72QVn!&;85nx(%K zLcfW9_WoAuc@)!>tU`W46x7}-BAt<8cyx4NC691$4E^@)_~iJK3A6ezub2a8|0u=Q z3(V_KLt^jTD1>@{q08vVJbl@XnC~Wu9rt)p?C57}pqI!#0ZPsyNePKh{{EQMgi>5p z1l(aaXAOaYs7HFN#L2+|P{dhKvhS4nQjtj!j(F4#Dv7^olm4G7OO{Ghhrk zM?n;L*48UT>p{n0RG6J@g5`R2Xw~PrFfr^onbZ*QePl$Pv5LB#p1yD7&ky|dW=VxR zPsnva{@*0X`s3flP0=SegLs0q)i{&_f}1^>nVe!`eg`Ar`8#Ck=(?cs1`Jx}dk8_# znPU)}1YY0Ku$xy>Av=i%#H>b#$D7=?;dMwvg}Yl4*ZMVx5)ao@3!9=Vj!`eS4(~Vq zGjn+O=DxV388!qIMELyk`@K&}OP;wg@r5zXQcx_d{c*V?3)cxGzJ-R$cvauJAfA>T zuN#Mjx_P|h<6{Vzt%;61=?pC}O@Vv7mW30Bv}2Y$xrWwf1nO6QX@XZd&y3S;zMA+a zcT;wY@2cY*g=p7|AQ$pSbjB)ZH%eax>4Mm0Gtj|Ox%ZXM8Fv-5jOD*m%yMu)M{&l* zoU7;J6k%JfllxTE$#*tI-skhyZY zy-5kJPS?!S8WHTyVfsk=QWq}ZQ*JiCaJtL1UG@3++c&Uwj6gInyRA?1mDFQ5WC25G zAWLZxyVzn*q)01mYGt5|a9=kjHm;d10YHM6fp_mYE33Rh9cW40T3uGaSUNgK4Gi3Y zS40*~S2-s;&DCB*Hu054K}WzgJPVK7qIK<8Kk0q2FWSsX8p`s@OA8CxsbBwI*N7VF zR37G$`&O4;%&`+mSv=@f1ac_>ZEeuuVMcQ^no4K;A(VR`QY6xP}+j4=0x2E-_ur)h1;{{%d)s1xw-NwA5~e2{Yp9F zp$|aVZ0vL5ZmAhvZt>rYU(5*Y7+5Hd#?oB~g-^@(X4p?p-{?OlB;lOgd!uV;^iSR~ zWWoIp(h|0yeGi$q-WD`cMZow?42mS9ru)5cYA4_G{V_%97pq-bX+lC`VnX8D@TbjD zXI|b#CwgK|Ke9?n9$#Ycon2ZkH0~@Sn6L9q{F^9KHs2A5tg{&)mTsK=u`aKhAos4E zEi4{BTZ-^Jvig;rTyDThj0ZmZ5ktJV-Wt`HEaU;Id%RA9YL&IZe{-bG2-Tql27E?E zFLNdbc<}4jpnFn&EZb`hAAw&qK86ng{**Y%X%v9-El7bTelYpZ)9)C=d=PDiY_Y}aXfk;iZNPp_P| z&I~B2s#(7$(cXSO?(`Z#S-wDoZQ7*=?3?n7I z2AB5XWWV7#QvXSu`l$iM`j*8-!WCzuy( z@!G=-&{bffv@Aji^+BiL=RN$mFfwCxIOXlUIe_Hs|D)*j?botti(&5w2RUR7d| z(gn12w5!DN%}q4h9#0)~swBRd;2oV=M{jxyA^igay68M@qOi`9nGU<}J3kKyG}JX# zS!DA>JTKgq{@{@t&JwffUK~$zTkhnQh91ItoU2O(ll=}ddKXhbvc03Do$~DJ*Y`oLt^3bE#6hO74Scn>i)9`Y z-Q>TS4%||N|0Qa3TlMRfY%O=e>Iw}n4fQA}9&au!B}F}2udq^jYxC68)gmf7E@l5w zPGFd_4?>EOv6DPPZKUPS+ZCJaTYu7t6NrN^0pb8YG&BQ+nv4FFB2Zvw+K#9GdldRs z7@Qb!FAJS9ad5-GT0GlF?vqbU++SwDwz3tV@{vg|MQYA=ko>K4{*`L2ndoO(MhCBG z*(`WZmcjm?kJ}=MkR!PevqD-A+Vvm~;p z)8cO^wIfe(6CQAqWWVtWoAv?AuX@}Mgff90=Z&qw#=yBe|V zlD z-QD%?gfvkpwL_>Q7S{CBr;CUcP#I4&K%X=%N9?eq|L4WQTK?|Ja=$gfCRn5KRmTX?bCDX}Eu!&`i-XPHxa^gP``Yr9gW1nYooyCk_WQ7 z#S3!NZ!|SQ7sJ*{&QH+x^aA8)3+o_zZ0zj5NY(`os_#sMBu}5$cS&FfTT1A9QNNUPL}o>IapXO*Y>MMBrMB%3Z4A4wiMM0%E=K{1Ml}n z2U88v@SX{oj({0v7dbrc@Ly38Eh?E(W(RM>)og7iuYBr>AnC=gutRQowF_Nb+_5p| z@bT;8GBPDfmk*H0L%lujVb@?#acjZ4B@Oz=TqB&hEZyOMxUefI^oNG}7w>QCko>G- z4$8d~AsUacrvkMd6;F^2855?Hg1+Z>Q|`^1^@i+;=HA1j6XjYL%j(YT(nA+06q>0D z&bAkeg4en^+)@>GAM7Dp_TNcGE52dFr-XT$7NS61@t{lP02A{I9&~QV+*2rY7j#VV z=z$^JM|5Gfellk0`)7)f&*Rr!y9a49AVXs2Jl8c;tbe*|hw}&!=RI+^`0^YLP{N=% zc<}d&?td-6|N2q=okkfyNXmjA=CJLvI9h!$W@Ea|6wl4pxn&EwFmrCt&<2)Qo<$U z-$zWBDZ>Pr@?6&t0-#6=igC7;_T$}F>nj7dTU~NkWLZllr(jk~Ohi;*)KCkWxv*H? zXlXGRG?LYrd;eKY4-Ur4R5krEq{sbbg3UYM2cj&|72^mWgozE7zrC5nHr1~h-}u^< zUis!{bD1=BTqA6P`rN9ZhIds)$2`yeTP5x}L^F;+Q*X`0SI6c#Xez=Fdd*5qAYl_f zUuGTN*m(1UULi^|EF_%LLS(33n4sEmMfLpK)>|SJr5u zVO>&^@1K=!K+JgB$SyyX)jx~%@7wH33aGkkF)>n4|8FgBt^Mli>4_I`&5Vtm1ls~x z5s>hW;V`BkC+{DN7<_dwd>E~frAQ%Sw-UI(p2Y9DwfNB{l}^s4AWm{S5p12J?+J$y z=!tp#`-zX|zBuT*UcLNLn9AvI9omzdMOGkr*stem&)mz^lN1nZ*xSVTl39BfcI3?>$iSUiZc!bwz`yKH05!EC&HZ&hAIjD36HRq-$Kt)vbTQc`bE zPZ6K9x1e{*dN2ue9U(|7FS?G=C z%t!dER|&;UyuLGCq;+5tk|g4d`;=3hZv+M4q39yT2KpZycH9FNAFBYr|LrY1f9>kI zE1WpAaaVc_-ElqC@=$GhN(iLbcKvRSvIHAwotc2_LX^V}D@&_%dgC}wUjtRyY(eOf zTrluU@U8#|23@wIx^IQw|E{-G;ndU9+Y+?Uc_)XdQB$4X=D4vBrqY`cFrVFla{Eaz z@oix(^>ATgXJ-ib_Dqb6kx`}$jtwXURvvY{cug}5QhHvEM`7gw^v&5NC7?m#t9fS_ zH?N-nWVRI=0RG3#@O&0_AMIha_bEqk>Oi89v7sRpc~t}oml+uua|aJafkO4u5=5z| z`SS8|Sy@>uhw;30ccjEKFs6aZ)y5oL*yc#ub_p~BXH1^`m!x~h(7Bj6U8a?P@qV}k zl}Cy4`aJgfQZ(98wXt#N_b>A=xOlEE%I$6Wx(!=z6#K+k@*1I+i#Z2CV#auV$-}_O znJI#A$eqzF{i?zz9PJ}Ka|Qa7qEN5i!aPootmx=fj?OR*d^@miuB^dC0oRFC<0e4| zDu4%1ub(uJCa{Koy)XXc8c*zMe>r?_FsVQu$^t4jV&pJBM`mh^nev<_GO_t4F;Io_ zu;q2m4<=mu<3`C<|Esw8SFx(-bzaNG{Q_3hd(G*X%b3(j1dJFDKKb&O-d`+cNPI~Q zh!fw9F_kkb!1Ls8&_BosqW~}e%jo^TKN`bFfKuoHKLCuiQ4~#qoT&u$7>c;YD*~Db z)t;DA=u0gcVr^|rg7~$A_wN%i!6k%8X_UuMQ?q}iRqZR=RE3kH!NsAaWwbce?+g*Z zW{eJBo+jdFIiHr+N4BZWzmDyOt*szg}l5m)&toL z3?LM|D7C1zsV-Sv<=2%a+6L-&zlw_T;P`T-D8IPOe^_X1hsevzZ{s7t)yhqOv(jcb z)%Pe$ z38ivI<+lF=6X(UPG7|)ICH)_@%vC?g{hAL>j@Hr z+FeJXza#wG$E`S0G8XAbj;2d~ej^kb9-wu&0Dv>tRW?5;IpFL;$`B_XUnTA~z61~d zk9e_}3+%B)A5iHVo1afnN~ny9(OU33h4ER*?VOJxc3*2msoHcMR(6CV8Dw_mPRci&uB$bRIuj4G3VPepQF`wOe0QRsG)Nu|BX_W@QVZ z6Hc|*^C8gW{R0|zz${0|Wu*%=glrYpqRFWHPwXy@jrnwRb~?|K9Zxr^fPMndk^`Dj ztp=0&S#z6o)nTP~pQSB(n9BQdCXVdHgVA08yK2R&e|K+k39Zv@flN#JF^bD~=g&!36BRE)IKM&<}Z_avN-cK;0a&x4x zAg%vbKsCQ@cVXApMv;Dp0yKk*9U6_Z{bv6XiruxjIwwp_hJZ1f*EA_eMDR>0^vm`l zb!}|{hy@;3tP^a?{(K@JAfUmhv@w?kFP9^r6!B^!OcH^5{mcu|T@S;ZxZiY(nzeVa94 z_!*D#V6j;;MnXbXeS}Cz$h$gbA-A31?af0&AFA{>C`iS}_jP5%A|5}M{DNyg zE?*>rR|eAca#f!^BO;G%X3sD||17zf>7O*2@VJ(rKS#rq2SA%InThR5|B`cD%coB* zab;E>n=}2>?I&IrI7*?#jUHJfaQ)?ime3#Un$`ZcJ|(JWrX(SA>pheCy6^`7 z;*zQ*!aUX={v}2P1;LP<7qjyN#7Z!-|P*y$ufg+QN@d_ z68TTCHOPli>j8d2!Q)MMXLt9(aongPHTCOXX|C%7JJgb2F3=woKdG&*E#Dggg?RAe z4kw4#R`Vw`m}f>T<oG+T>I?o>^LtBR8~|R9D#c6WWFJ2 zGmncr0wFs0WRbBo*7f}>M&-o)Nn<}$R7ayStI$koorSu{@+Xmej_G0}?1WBHZaFRF zip%#kzDSFPW?)cv`rdegxSmi-DGoV5Oe?0GBp8}gypk4vjPo#t-I!}?_?1_6Uh((T z?22tDAL>PDGJjC#GSqYbcjJBIF@A~0csEZ4*?qCoy`a}LAH}H*Yt2qNYin!MI=&fJ zI526vXXABWpI7;5BzkF4luGNUC-}Z5G!=uoDJz4E?T%(vUH9u0fUe~a^^+E$Plr8w z$u8`|sPQxE=Ofp{whP`oOllv|TR;7D#4>kqDzDoL=$=v8Yq}LxQX9=uxdrY2nN6n@ z8jWV>FH$}>Z)vhPI_#uFnOM`AdIl#aJ13n>*Xbz2tNdYZg>l(e?SJMaKnKk?ZK$AkREYgT+5 z#H38^n=C18OsU6ryDy{~9-VXd%tJ43l4AJGR%8Q7r7)-id`IumvmL{$nNAPVrb3>0 zNJ(9}9B09j5uodm2lnFzy{w@W%5;79O^eK8LCe?ISA8TpAfSz2L6q+9au`*T+z?X{ zU1Z((aSF^mSg^!IMR;XskU&9J(PUn%C%A={_l0n3g^D>ZPx9UUtfW9HVi)y^-EM%o zKXLpKsKfDr>exn$b5r2n)Vr0gh>eXw3~C;!h1$68EB3FMg?8gdyT^Wx%(Yfo4rx;! zoT0Y+D&|b_sn40$+73V)%58LH?^XRvSFOJ8<-Q4DPm|j`Z4R;UdF#CmIv7S^U|-0% zeFG9&x*l?WxL4bc)h|p}S2xGmMAgu+g2m;F8xhURUP7s9AwhZXhytn#hw)D81U>_$ zS_3UDEa+CFaXKeISKdZf!K0>GcqntwG{y3q*mv5I>+a5^$OaQ+i;6dZv z_X1?T?J8bc(w7Lq!aj0woh;NlXcCPgdp~-ZmJ?|lMxMZBeo>aC@-tbW%$ic@X0KdE zX3y{Za5d`^35H+!Dg{&OqZYXLb>Upy>CUCY&I~UJ32Y7TWz_JPPoZuZ0~Hk~*MSS@ zWfQx-Iy#8=%aRaO0Br$%WV@FR$wvu>X4hVOU{Jd9JmPbnA$&qPNEr5%i-wM_yttV2 z<;&AF%U+%r!j?xlIsLITx3{M>(7d;4U;C0%u5dG7ZS5(?*I0RMoxK~((a30x=lAT% zdFkg)qgD|D11Ucil!Q;|k*USsJx$jaO&l!pi=6kJnr;qB5lyC}Tb2qkIHYD44vISd zhKp;9EU^TJ2#4oE0nf1@h5qP82S{A(84ICb3#m1GaG|lQ%Y~<8Ue~Ag><~V`+3FJ0 zqo(EZ;&Ou*xBjoLFP)B0=kO_-37s&oQf$1&_Nn&owTf}^ZEzdM_eGOU2otM?5g0MSboANAw*Ij;=Z<^k+I$9$QYd8O zJGF0PBPpK~Vl-ObhzFPY;j>^UsL7 z2|*uvFFja|S=?Rja#bD#g}zk`oCk_G4}ikA#Wh#55+aHj<-wrd&u zlpg>J?-tf8aT}9f#(i%gag*g(>_RYMQAQU`Q(fWpdlDr z)kSW~VU%#bjAZM(*rrUq@|iDHQE3!^RLfQ$Tl1Nnl=r!1!mpeV);X`A-A_aZJhSud zEn$#tQ-((vG_*7qHd}V&)B%quj1@d)Y%N5Ilo>p^lS4n=K^I;j_q7zGTdVN}*cc9^ z{LsYXXwdsGkWgyw>d2@dkH=qD#zHhBSGO=|a2S(X0Pi+}Bi)91eM#(ahlMqNI80ia zzI}3{fRQ9lB`{KsM}%=pl`lDd2KLlF2|b2fk#-EM7YjlR3(cc9qe$k^@@44N1+~p_ z{1PeaWs=nbCB2Y#Gl};n7oiboo$J_bX7B7HCr;)b{{@k6wZO6s@GWS}TaWXhdBJ;) zrHnpriP$2(rV-rwPQEGXxR>(LbfP~WC5HH(BW#ryBlw4fr6nmA&UPK`UwHPmAo~Ob zm3jqEsypL*!1O=}SbXrWP62wK3~9U1&;eBz;$w%NmzK&?Jz5;00C?>1 zG3g^@74;^42EG&O7mwZ@dFMm8z=uqXe{JK!W2oMN3 zh=PRP0we)}fj~k)YJ^b!!_0T@{Qr07dG7Z=57{|qpObwyXYci{_g!m6J=IocKXK^< z008V7k00s+z#%mFDLcjj_8>~n>HvTMpz%;uKOlon4)HOcwWh30X710CFyC zCHQz@N4mj7DXoO{%_qq8L%_WkbKx$SzdF}D0N_!+Ity^?666jL)<6IL_hZ>xpGeCp zTUm^nZR0RB=M;o6YVWSZti#y zTi+ggVie^(y4zHj?QK00a9-B#T2 zbB?x8=XMnFe!aTm8}$}Wk>B46{qeqmHUM8VmvtHMcHUKYPfw>9H1osK1uR456(|k( zAEiVTa}J+zNHXm-nqq$3s4p&mG0ySjfYD>*|Gv9cw}IPXvV)us3;b#J zg@*ln9l8Z?>h$Yb6S-c_$7qt=d%klggT8XscOQ`S%ql~S*ROi?uY(UMzaCruuEzC) z5aRwNYmK0kS~G&UGSb0cxo8K=OmZ_j*MbO(nDk|+^Jlh@a22ray1hxoxR#&MUj}>H z;dZYetl_VcI32e5Lww+{{rUWU;w3w)m-Vd`*`pTVS0;MsNKAtk|yu_Q0owJ<+Dy-@0`P&We$0beww(` zrMN~SIF3rw%$JOGGFBJ;wrYn_8I`loHoMDC`kO5-++cQ|Qt=F(R+@xvc}9*}wKPLt zI4{-R{iBtd&0~6U#}F+%>+@mHQdWbmyE(~saBiFUMP z;J)L6G(}V6kwLQH3kg!jb`bL& zrk3EHdy-6~~2DRa3Bk$|bn8brWKlesUF;Kjk5|~7H z2w1xX&X?sKukD!Kn9%qc5wR|j-#Mzq%`o}}N}xxunX#!Fkt|W?GSpDcW&~e$fKX~6 zLh~oZD7SJ6@zz5!auCeMZFYCQ*pSnQfTaGGLMv7dzPGhnS06+V4h|+1Jjj1DG)SI- zRlmVydGoZqXjFp1C|)Rq)=n?jj%M85@?!uCRH&n{u<%42gFY#{{3ter$vBUknfMB! z`!btx!IOI-mo8seFaK;Wxz@ve{)y3 zLjt#lJ@`=2)egPXPcMH+K0gddWj$2cop80KJnmob+s^GE_H=bQQWYnkQFjs*WOg6* zqg_K8rxfIq1`H&3qLty3?X|Yw65iEt15fu$&)WKhkppI8phbhPvojU_q34t3=`9|ff1a+98pYp6(lu9jBX_8-@iw!i7DQ%m&FXMIusZ3!qCWeeB-?+Y~5(2QR-(iapQZDN{OP|e!N@#RAhlaC-79z02bH9 z`@E<9SzXI&si?2@ulKCnorkv^vJD1(KG+W;)36>I;ze=J25#BS6MKB!HDUuB**`5p zHk>7?YuU`;Ru~IVjCdH)wG<=&KrFr6>081zwU?W%Y?AYPIwXEmOBk%N9Hv}&-kIR! zt{H83S+Q_4wMn>0vV=BzCdQ&t3T|!au9Gzo)o)>XOYsaXL=FfGJiGk9;X&8P*x1EJ zqhu%|vD?fKHh<#b1L6)KF7Rf;}$_B+M97LY#H#6{4rejVo+~iO|raMEp^ANv-c0*z0qPW z8O_6lQ}g*PKl`Ed6F?4!0YcsW)Ripd5bUk}=`Yb$51u4g!nf>p$=)g>3I3B6Y}^h~ zA)b#=$a-y#J1@gGY7Kz))2LFaBf7;o@)m|AKp zEELw#(dnf{A+1`Je^h*_n+VbjZKS&=K@scY`bAuu@W&24Ey!;R(WcCC&7h@s!wPwZ zywu>j0ZEmTBvB)3nsY_JuXDv<_))e5k{WO?#$a~81B%n@$834GppNdg2x)YRnU)T6 z>ZJuS6DF8nH5C-nNA?OOEHaeKQtOI*zW;HPeEX-eg+JMsy0CDwgun{iQlCbxKA^qv zp=A0)6D$L!UI#*MYvk@f*fdLr8?@|Y!!6j1_M66yn$%n1)7LEOeV!>QRt)~0tZktn zn_JhLIk3XNU(HfMe`aNsJyKy&CR$N{wSo6AF!Z|A$7nGJyD?%0p}aA{`jo(J2Hocu zin2$XCj+%Z>sJk>C5=llK5w*nw_i$RsUUZ@Y^V!RT3QleKC)JJo?3=7RLHFO*$lo& zO@nrF9!m<*z{mn|3jQO4N?jai;rnTXTOZI=*qb}b%hY&eWb80(-(8BsSr9B?$jHdZ z^$A9^5uHvy?*;*K_%5!n=z^eah_XaxW$|q=7-cAw4h&wS{^rrCo0-(1gln2ZV`C*W z)(V1n9Vri?nbL_aHy-X1DaHlPU~0;plPCqd>N z#(m&3rT%}KngnI%s!**^1QGPF8qZnBMt^?fxU3Za&S){_4Q*J}wKmFRj0|NcEXBO{&fBE};NKd=)=+Ezu zT2BJcO9SFv$!LRgzH$AJ%2GkaKk89+C`W~xuCA_GaaxssImEX3$8qJgwZm&wFlglDsXy;U%PfQpQKMmt%*@Q#h?^Umfys1Ik0rsP(2BT&0ZCpb91FR#a}4x(XRe*K zO|}bE_S5$N%Pop~_pF&N8ND&eY^XAKyf|Rq5ioplNCrjEAikojC;EX-PPhvY2p?5V zwn&btZQi{q8TjVGD8^dy=j;g)mEw>kI#m4nTV8uJjLXdzFyL1I=uhMF4NdC%*9Hl_ z6t=j`&u-+gr95kC)D;<+87%egkqnw5%|nL?;czbV9(VqErifuIxk^>K%qp z;;zqsxz;n_E7#N0%Q|qaMIgJN6I*nco6CdX>z}eeNl{2pawpf}(fBCcB3#y_>(3tF z%t24;G12ReDmbN;+3Uw{18+P2jb_cWfK=gAt^`xC$UESDg)$<36~mP+P}-j_SsxX3?l=o`J#1fV9>VgZ!cfXHU zE`fJIKg<*Ae@veQ9$&I5KMo2@)dO|;zc;3N*^AGXANj=&VUGhICKpUq5{<`FeB(6+ zrmscYnIxAdA`+9*V2j&_fW)P#UZwIPj7pO6R!T_x*i;f)7mApJi{V9-v=J9Vj)n#K zjj^VR-AsaCuNhcaZ<++cwtc}KGLL4_0JMm*FC}fU`Q{iv9k<&TvACf7r0B%&cKf4) z@Z}F1>+6pbV)-DZ>lc8hkSJCYe~ei|B1pHoy|oGYP;c3w0zIfKBFPO}c5|?xd7?RQ zIF?t%PzqiQ&;cQ>{m9YiiEHHN6i_5B2xwvT;kCE2M9@JWFoC z`?+zpS?~eo5>69>YbOL-tRJK9tpzO_C12NkO{CKm&!wlOoxt5z>~QJs?(U?lfm7QG z-phP`zc9LV-Ppc&O+@kC+}xZo?eM+)V$=993rP)iY-zEk+TyQXUj%Z3rI+6aZhV3o z$jZh)ehqlDB;OsH-mC|JiPG(=^F55lgr`yH$$%MlaSN=^#ExzxQ|Npo8?N&(kcgUt zprNnREwpdS2G`?2xTh{IiluSOwvkk4mtq1#V)L00Ol43eQQd?exb$pVm1`Cv(NcMw zDAU7q@XS;WF$HJr^y035==UTU40IBk} za2FpReMQW2Ur2VnWQoXcRlayb5J=A^JdU6Bl0SfG9=_4|hbv#letcs2*9BLYSGtUH zebp_9+^riL<8`4{XNL`jL0r&aR;~OV14<5|oM}}IIFf6S;|B^F)FV(MBTmFpd*K_I zGxoq!>!|e(QxIk2U|5)sl)wG~@UD^ZLJN*dj@Hc(SJaI8BraqKP4ZO?OrjYXTDfOa zf>CG^-$nQ<&>5TnNxv9AO*WGUU!q7vl8h@HO?3Qq`jsdOAV>zzg5ty=8He;9r&Sr@ zEbYKOoyGiaVE7UIufe(LKVB5TOW+?_5;#5xs9yP%Rb77x9p1?yDyuD*#Cd?gQMJ5) z6t-%m%9xfiB*<1Kl-at_-+XSKT?j5j4WAjeJ9iYx@0)tydK@f?P}hj{ z9ypfKi=VLy%CJ@gisK)KyEr+OdZcd;4JCqdr+t7VzP;IfZpk-1IWTEf7U#aN%+7JL zM-(4u7V^|&)6Y+S=}yz;*k)Twwm=(@6aLTYh67YLrMmkkL)NrpX{?R#r|;2DuEY;S z5T=iv{vY@&99cP4E5MJPeek+n63+O7?kwd7cL_MYz#-6`j9dE=$o@$+yLH*Sep8-; zuSWj`%CG(c<(E1wtYJdewxuPS!VUuoU%8!s0e*WFf9OAIlIO3(q|)AJ3Q8kG9e1B< z(OAQR9>#z1S;jF&3MS0laR#8IC>8cSd=Dbn@jNXxwZxYb0631AJUMa^7~&2WD;yge zGnKW@GHvl^1*{W-7?3nw0k&tjWP^-Jm!+?`i}sxgUVgy@}BM5~p`_Z}69UHdnz1XWn#mT>0uN z>oiTe8Zx`TlWCe}w!Y-wVwU=((2HGD!;qT!9sK;4Fi`r zQEs=@aAPw+rao_{w~Q5X7D*JlcXwm=Cn2Rrc}0EPM39`EFLoz+CkIOOuKO~`{?4Gp zv8%&_f+qsMS5*|4ee#}QscAeY=A#R}Z5jgcSlI-a>oX*lZ(v;h071M|kvHt5~LP=}m-> zo~c%9g8<(4&XJ2@kp@WuYbWC6a&@ClmnBxFLnJJliYd)&P0Bm{R?isHvefx>N)jGd z@;P5+U~I76$2v&2eR4-uOZ)NwZ{4YdO`=NPH}4Oo^&ZwH%Qhy-h?*qB&NLp&E-AaA zL^oaULX*@dk5ZpR3LNf>KYQv<%cstm**S6V&2iG&?ua*vR!7Qm*vHfz7sZR0tIH@W zR}f;e`aX60Q@dvdgM8PoZ|_BimT}H7he#OxyD2@i>7jZ<%R!`?k;FiQH$^JYPZvb_ zm$Q*o|spu9Kmw?7pyGLKtqY zRCDNQMv8JZA&G7{Epc&iDwR4w9WEOtlaa64xH=OIR*}1ahy2|;9U>c9se~WT8y*~J z0#i)Q1NGRY!Gy)IJKb!F%|m%{`>S*+jiv_@Uu&F;Oxb}7O@a>3s#_fjJAQV*o|VGX z)1D=%UKkN%Gh0gL!K=C9yB43!_qy^oYc=#QJNo%OGV-xcGOFgXXm~7YgdCCu@dUvX|vy@6SQzX6t0cFf|2z4Pl7ZJdJDR^U` z%$K6BlE-azx!k$&7K(Ug+g$ZjVp-mEm{QJN+cIX za>xa4ILKW%>{PoNY5_(FLBR2RvvuGC{Y4a3_AUVWEUH|3IF`Q8*@5*VT0mHuK*#ga zb{@&dky9XwP6JPSkD)(OZ+8ISy&lDX(MLUq20R)-PzhRRiyHyCE5I5q#xfE8OW3v^ zBl{o%dOG|c1m2SAZ`NS22$>E>p)P`4H-HzM2#AWwb|&7Ft1gHWahWQ>uV{i5%z~de z+TJNa`OLrPVX$WxB@lfRp?{@Kx1@m|k3JDccMoL&K7iEfrpH$6Yc}5{QiDjX@C8*a zBPd$e`}ZX6qUc}5GPOlBwF%hQz*9_)0Bvz`=xYp5t;f`TkV0YKAy*BJR7W!D$x;kt zUr+mnkR2isB&^V)L^r5tCY1Y^@{*D$(6~?UgfEtsRSXm#0 zixR1;Fdh!?;t)<(%)wTZ*X9gF+L}5gk|51iQU%t%q1$i~KF+@j4=Q~zI z!e4^TNe~D)IyP)%g@i5RjM%uuo|>7ZkB^V9JB02zV5y~L>vQSuBRNUlV1&$4Rri}m zi7<1w(nkad;@e?D@9R-#6t3`za6V`#pfKlEfd@}uqPZoL3tG`%qPe+|>FZvUo#f=? zcf6cHOgpbF1Oma%#44URG%`M7daMQ&vg?f9rj|KxvU*Lc&T$)W{>b&d&`);ucIO!? zTQi%JXe9j*BV~R>pZNS%J@)c5J-rVg>(cFGWa%iExzhcVaux{SRjeg4mTFW?%76!AWXrbf< z7_2-G_gkJoS~U6(3$+!9aEM19eLT7!|AnmFgP9GYA?t=nr1FuGk-%k0L&Q}vxdd}< z$3t&BMH8DDtBm!RjL>`OGOhz#YZPf|X#}@b@UuzS7EGG$_O~1c80{UN;eIkn-m)O0 z_qfR5h6|cYbyz27P9k5t)d1%1*W<^TZbS;da8U)z1Ye}5@74kmS7PJ%g=f8=e+Ke?UV$Y|*Wk*8Na zr@wI~9|7KqR|)X&@(zQ+8=uMROPZx8^hd$$#PPepR}G;KP&*zZMA%QcJkARcvi*FR z2TU;>T);pYw0QVQ#vl1EUq}=JgA9@$jbK!#&zGvE>*||gMz=x#r780Dl{zqPW2IWB zTvyG(_29yWB>r_%GR$%P=~dq&W9xmwttZ27pIvxgi@|X5F?<;Fj!VTsSlGKc#T1yU zvpYqi-I)iqvFMwD&vT*Gi4`L)p(X8ElLVsC$7SEk;ho~XljOft#;>m)hIgUM0|y(b zGC*_z>BWgPTwx|LC`quykq6}kj(TFS$BsPa)=S5A{uq}jMlR7aHhe&8HU5WNgaw9h z+iS@`(JNw;?A#J@^3MR!5bm!4P*cTjtC>Vg{0irKIB!k4F5Q=4!>TXc$xdw1{p^BI z7GD7i1Fl`-;g7C`pUL190f19U2ekki5OgJUbt|~PX6*~+K#dg4S`xC9!E8=Vg*OB> zB}4IQxr0lV4`i=Z6PI;tthf8(8k*=z5An{5&dF6H+L-YVf?29jZZ04(@Bfu3qaoGz zt=z5py(lv|3&ph8;N@4Kl>Jk#L8xT8UAp zTPbaCfG67dk*(=*=;h6pdp}(%|B^2ke*edik+txjAtT37*-4*jcqNUs)-4j{s^ccu z1`ItM%Kh@+nY*Y?M#p0M;nql`g#SiR@L!plTTn2iPdgj-jVJreXzk3&wrq8~M}!(Z z_|ozfq3ecS5vFfXRkYC#0Yh=R&0i62FxyubfRANq5cES8sZklUw~$XJ7;;w|1gj!G znGXl=YAbbs+pTJ(H)d9-U+^&S!JztXf@Ay`q>8LU5(k~HN{N2w+DaO2q21`Bsg&#?*(cF zBC9JWqDzcYYC~Tcm1LJZC8v^p9q5pd9uH%y;khf;u>*;?)`LGshDwgLm|$4 zB0tfH>P1noB!ph;g~|6uS9)bqZp`l(Py^2(%H`TCuE1=quW*69683C^R&}7%C8sT0 zv*xWo`>1kT4q;f5W^4HoOVxy<7ZL369ZYm}wkLrx{w8OWg*UyP(&o;ig2-@h+1N?E zJ7h!+WSGgigw70c7eRVf^Rx6EV0lWXNHk_`Q3ma155J`6xbZhaR;72p2LyfN${fcX zRK$1RgnZ?1`19*V+1WQ#&lWZ31VN|Z)=}e)Z$*nkJmbn>yKf{RDmvm{#&b1uf-tJ13lQWlFpvscdOWBj#>|=s#Y*m$fsd|ZSuF?+| za(}*d)0H&Whzz_rjX@0y<*Vq*!)O>J(Mx-}+>8qUGA7X}&22}_v3xk>TrjlV8EBc5H_&?+g%+)X zOJ{SdX7r|3-YFdu)LgITQum9U-(xNlUPiFqf6#>%LmD^ddE6@9{l=%!ROiv~ee?=P zMT(;YVMf2xL0ouTuv*1W1p4+%VBAUI();7fyK2K8{^ANMRf45XjE*NQj!scFZ{+GN zcccfZUKBGrppe^tng_c-;rY$dt@8j7)>&%rP~aBfLOA6=ypyg4S{+!?F*&ei8!*A}e zK@I^3O{tE>tkEU@rOjQAJ5100w7pipXU$2nV&}q}6D!iJj42gmLs&_I>JF>nqQRq?V|77L0p!RdnZ|R zo%l72zeWk_-ff|6jDs_0hc_#|S~tfm9E{VaF=NgaEi+RSGCd6^N~;rRtV*^c5`!#` zZrJBzBzrbE5ly-&hjq_Kh$TT6B7f(p*>7h;9xV3FU)k8$R1@iizkIuG%WgVn1nj1-w!vA{tc&6{pE$@MduR-N+BmG>@#9m|>FN|_NlN;o@SrCMk&WXt zc-33ZK1y%$cxT$}<@~)Iae7xztm{^C4 zDg z)sEkR8GqX=;hx=-Hif!>ws6O-8|T*uQnxgp?>mv3q1i=3S!~0>aD&z0@2dvGxoUXy z`iJbjhXiD^o8?=C?q2F81m*lW7SD*QJyv0UV~FOP^x*6(ov?G8Sj&y%wJeQmmcM?E zRm-r^|F&DE&+LTkS#Pwoqf|F=IiIDz59+*&+!US&b_~C|L#MI@Ly6oa6!Dx537fOw}LAI(ahH|!5y~%f!KpYc@%wb%58F4z+0JP8=K+; zHxsjBIR?xXclJF`JRQCIC2a|1rz7G5#t?6*8@O%0J^Q>we?hAX=6sN>%1VdOvzAF; zoyVO`61`ff0HAL<9CU#92z9PD@`E*MRnkCov{@|fwrV1?m23Q0p4hGCErCmy>eUB$KGTN0Vlj zUf%|bLWT`Ca@AT+i&E@QN&4lyB4hZu6rSO))B`y(PC?9&jC4qAtMHPHCnnmABbNmj z{xIK{w_Bz6?7mnOn8&;~QwEI_o99#nfE()5s$XyM00J7pF>L>9DbN9(|HqP{Yaxyv zAY?%64g+BcZ5-&TmD{{>0RmANuo#I4RPz5!*1t46-)jmWKUL=OZV6XD@lr6|3*>E zQx(==ki2yU404{-k^R!M#`hAJy?U&DtlQBeaw+{QO~n}n+1y~YM_1RA0RsW+jL%o<&Dsjp*@zoiw>>`ml6iSHV02cFSbK1?fvsaFX3LeXSl+{#v&Kk#+m%@v zmrw_D!~TFgEzavnhAVqe&&N`G2zpO?cP+V*z@8S1?Shm3s<1k?BiiZq!AO3|b*4s< ziq26uby+C~yipBrWYuU2mSFu5YX`ww&p%Pdz!YN18YA{!51{$*v!P~Y4WkI6dP6&q zI}QQss0G3v|1yItv&1$E9!QGZEfxpMQ_c-TJa+GCNPe{5XbVKMvR@x{_2pA>U}nbU zkMJV2G)huvIsL<$@x%C9i`bw`rY9AJkC>!}a|~qRVDAbE6P1{&Q&W~Q9=lp-mNPpo`RSeR6^vCg$hmV!QxP;J1C}HV1oqsnvnU1zvQoODk;# zdb;hB^Gd`GmQ3f0h@S~^EYEsu1WUid4Yo%gh4g$Zl!!RF@%nG0`!}0x`rW#Ah1^pXx6tyVolBCMLq$ME){<+d5`3M7qVrGX*2A>+&sEdbHGSdF09rC)6O<0sw@-=>GpmWB%>E{yst$ z#1&Jm2CWvr^3JCTqpC8X&s~^#006}-|7l{?Iia9p(@;a#jG31v!vciWrwP4y4wkXg z!7_Fst?a#`(3-vNl%;M0_6h*BZ7hUttJC%m7ykO~S=AHSO|WJk&`{HUSaJW?@c#oS Cx@r{w diff --git a/doc/salome/gui/GEOM/input/offset_operation.doc b/doc/salome/gui/GEOM/input/offset_operation.doc index b1baac12b..d3d1fd197 100644 --- a/doc/salome/gui/GEOM/input/offset_operation.doc +++ b/doc/salome/gui/GEOM/input/offset_operation.doc @@ -7,7 +7,12 @@ \n This operation translates each point of an \b Object (a set of Objects) along a local normal by a given \b Offset distance (signed -number, negative value meaning inner offset). +number, negative value meaning inner offset). Gaps between translated +adjacent surfaces are filled in either of two ways: +- if Join by pipes is activated, they are filled with pipes; +- else the surfaces are extended and intersected, so that sharp edges + are preserved. + \n \b Offset operation is applicable to faces, shells and solids. \n \ref restore_presentation_parameters_page "Advanced options". @@ -16,9 +21,12 @@ number, negative value meaning inner offset). \n Example: -\image html offsetsn.png "The box and its offset surface" +\image html offsetsn.png "The box and its offset surface (Join by pipes activated)" + +\n TUI Command: +- Gaps filled by pipes: geompy.MakeOffset(Shape, Offset), +- Gaps filled by intersection: geompy.MakeOffsetIntersectionJoin(Shape, Offset), -\n TUI Command: geompy.MakeOffset(Shape, Offset), where Shape is a shape(s) which has to be an offset, Offset is a value of the offset. \n Arguments: Name + Object (face(s), shell(s), solid(s)) + diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index cb8a07058..7241c256d 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -1300,17 +1300,23 @@ module GEOM * \brief Replace the given object by its offset. * \param theObject The base object for the offset. * \param theOffset Offset value. + * \param theJoinByPipes To join offset surfaces by pipes or by intersection. * \return theObject. */ - GEOM_Object OffsetShape (in GEOM_Object theObject, in double theOffset); + GEOM_Object OffsetShape (in GEOM_Object theObject, + in double theOffset, + in boolean theJoinByPipes); /*! * \brief Create new object as offset of the given one. * \param theObject The base object for the offset. * \param theOffset Offset value. + * \param theJoinByPipes To join offset surfaces by pipes or by intersection. * \return New GEOM_Object, containing the offset object. */ - GEOM_Object OffsetShapeCopy (in GEOM_Object theObject, in double theOffset); + GEOM_Object OffsetShapeCopy (in GEOM_Object theObject, + in double theOffset, + in boolean theJoinByPipes); /*! * \brief Create new object as projection of the given one on a 2D surface. diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 69e84b9f9..e1010522b 100755 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -7816,6 +7816,13 @@ Do you want to create new material? Rotation angle + + TransformationGUI_OffsetDlg + + GEOM_JOIN_BY_PIPES + Join by pipes + + OperationGUI_ExtractionDlg diff --git a/src/GEOMImpl/GEOMImpl_IOffset.hxx b/src/GEOMImpl/GEOMImpl_IOffset.hxx index 200797cb9..fea75eac9 100644 --- a/src/GEOMImpl/GEOMImpl_IOffset.hxx +++ b/src/GEOMImpl/GEOMImpl_IOffset.hxx @@ -29,6 +29,7 @@ #define OFF_ARG_VALUE 2 #define OFF_ARG_IDS 3 #define OFF_ARG_PARAM 4 +#define OFF_ARG_JOIN 5 class GEOMImpl_IOffset { @@ -48,6 +49,10 @@ class GEOMImpl_IOffset Standard_Boolean GetParam() { return _func->GetInteger(OFF_ARG_PARAM); } + void SetJoinByPipes(Standard_Boolean theValue) { _func->SetInteger(OFF_ARG_JOIN, theValue); } + + Standard_Boolean GetJoinByPipes() { return _func->GetInteger(OFF_ARG_JOIN); } + void SetFaceIDs(const Handle(TColStd_HArray1OfInteger)& theFaceIDs) { _func->SetIntegerArray(OFF_ARG_IDS, theFaceIDs); } diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx index 598096391..2e3f57ba2 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx @@ -1036,8 +1036,10 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorAxisCopy * OffsetShape */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape - (Handle(GEOM_Object) theObject, double theOffset) +Handle(GEOM_Object) +GEOMImpl_ITransformOperations::OffsetShape (Handle(GEOM_Object) theObject, + double theOffset, + bool theJoinByPipes) { SetErrorCode(KO); @@ -1055,8 +1057,9 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape if (aFunction->GetDriverGUID() != GEOMImpl_OffsetDriver::GetID()) return NULL; GEOMImpl_IOffset aTI (aFunction); - aTI.SetShape(anOriginal); - aTI.SetValue(theOffset); + aTI.SetShape( anOriginal ); + aTI.SetValue( theOffset ); + aTI.SetJoinByPipes( theJoinByPipes ); //Compute the offset try { @@ -1084,8 +1087,10 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape * OffsetShapeCopy */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShapeCopy - (Handle(GEOM_Object) theObject, double theOffset) +Handle(GEOM_Object) +GEOMImpl_ITransformOperations::OffsetShapeCopy( Handle(GEOM_Object) theObject, + double theOffset, + bool theJoinByPipes) { SetErrorCode(KO); @@ -1106,8 +1111,9 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShapeCopy if (aFunction->GetDriverGUID() != GEOMImpl_OffsetDriver::GetID()) return NULL; GEOMImpl_IOffset aTI (aFunction); - aTI.SetShape(anOriginal); - aTI.SetValue(theOffset); + aTI.SetShape( anOriginal ); + aTI.SetValue( theOffset ); + aTI.SetJoinByPipes( theJoinByPipes ); //Compute the offset try { diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx index 46fb60dcb..db5adae66 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx @@ -105,10 +105,12 @@ class GEOMImpl_ITransformOperations : public GEOM_IOperations Handle(GEOM_Object) thePoint); Standard_EXPORT Handle(GEOM_Object) OffsetShape (Handle(GEOM_Object) theObject, - double theOffset); + double theOffset, + bool theJoinByPipes); Standard_EXPORT Handle(GEOM_Object) OffsetShapeCopy (Handle(GEOM_Object) theObject, - double theOffset); + double theOffset, + bool theJoinByPipes); Standard_EXPORT Handle(GEOM_Object) ProjectShapeCopy (Handle(GEOM_Object) theSource, Handle(GEOM_Object) theTarget); diff --git a/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx b/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx index 413ccff7c..cb80023a6 100644 --- a/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx @@ -86,11 +86,20 @@ Standard_Integer GEOMImpl_OffsetDriver::Execute(Handle(TFunction_Logbook)& log) StdFail_NotDone::Raise(aMsg.ToCString()); } - if (aType == OFFSET_SHAPE || aType == OFFSET_SHAPE_COPY) { - BRepOffsetAPI_MakeOffsetShape MO (aShapeBase, - aCI.GetValue(), - aTol); - if (MO.IsDone()) { + if ( aType == OFFSET_SHAPE || aType == OFFSET_SHAPE_COPY ) + { + BRepOffsetAPI_MakeOffsetShape MO; + BRepOffset_Mode aMode = BRepOffset_Skin; + Standard_Boolean anIntersection = Standard_False, aSelfInter = Standard_False; + MO.PerformByJoin( aShapeBase, + aCI.GetValue(), + aTol, + aMode, + anIntersection, + aSelfInter, + aCI.GetJoinByPipes() ? GeomAbs_Arc : GeomAbs_Intersection ); + + if ( MO.IsDone() ) { aShape = MO.Shape(); if ( !GEOMUtils::CheckShape(aShape, true) && !GEOMUtils::FixShapeTolerance(aShape) ) Standard_ConstructionError::Raise("Boolean operation aborted : non valid shape result"); diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc index e487554d5..34365e199 100644 --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -313,6 +313,8 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_SOLID"); aNamePrefix = "Group_Of_Solids_"; break; + default: + aNamePrefix = "Group_"; } } else if ( mytype == GEOM_MARKER ) { aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_LCS"); @@ -2548,7 +2550,7 @@ GEOM::GEOM_Object_ptr GEOM_Gen_i::AddSubShape (GEOM::GEOM_Object_ptr theMainSh if (aMainShape.IsNull()) return GEOM::GEOM_Object::_nil(); Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1, theIndices.length()); - for(Standard_Integer i = 0; iSetValue(i+1, theIndices[i]); + for(CORBA::ULong i = 0; iSetValue(i+1, theIndices[i]); Handle(::GEOM_Object) anObject = _impl->AddSubShape(aMainShape, anArray, true); if(anObject.IsNull()) return GEOM::GEOM_Object::_nil(); @@ -2933,7 +2935,7 @@ void GEOM_Gen_i::Move( const GEOM::object_list& what, } } - for ( int i = 0; i < what.length(); i++ ) { + for ( CORBA::ULong i = 0; i < what.length(); i++ ) { SALOMEDS::SObject_var sobj = what[i]; if ( CORBA::is_nil( sobj ) ) continue; // skip bad object // insert the object to the use case tree @@ -2954,7 +2956,7 @@ SALOMEDS::TMPFile* GEOM_Gen_i::GetDependencyTree( SALOMEDS::Study_ptr theStudy, GEOMUtils::TreeModel tree; std::string entry; - for ( int i = 0; i < theObjectEntries.length(); i++ ) { + for ( CORBA::ULong i = 0; i < theObjectEntries.length(); i++ ) { // process objects one-by-one entry = theObjectEntries[i].in(); GEOM::GEOM_BaseObject_var anObj = GetObject( theStudy->StudyId(), entry.c_str() ); @@ -2997,7 +2999,7 @@ void GEOM_Gen_i::getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo, GEOMUtils::NodeLinks anEntries; GEOMUtils::LevelInfo aLevelMap; if ( level > 0 ) { - if ( level-1 >= upLevelList.size() ) { + if ( level-1 >= (int)upLevelList.size() ) { // create a new map upLevelList.push_back( aLevelMap ); } else { @@ -3011,7 +3013,7 @@ void GEOM_Gen_i::getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo, // get objects on that the current one depends GEOM::ListOfGBO_var depList = gbo->GetDependency(); std::string aDepEntry; - for( int j = 0; j < depList->length(); j++ ) { + for( CORBA::ULong j = 0; j < depList->length(); j++ ) { if ( depList[j]->_is_nil() ) continue; aDepEntry = depList[j]->GetEntry(); @@ -3067,7 +3069,7 @@ void GEOM_Gen_i::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo, continue; std::string aGoEntry = geomObj->GetEntry(); // go through dependencies of current object to check whether it depends on the given object - for( int i = 0; i < depList->length(); i++ ) { + for( CORBA::ULong i = 0; i < depList->length(); i++ ) { if ( depList[i]->_is_nil() ) continue; if ( depList[i]->_is_equivalent( gbo ) ) { @@ -3081,7 +3083,7 @@ void GEOM_Gen_i::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo, GEOMUtils::NodeLinks anEntries; GEOMUtils::LevelInfo aLevelMap; anEntries.push_back( aGboEntry ); - if ( level >= downLevelList.size() ) { + if ( level >= (int)downLevelList.size() ) { downLevelList.push_back( aLevelMap ); } else { aLevelMap = downLevelList.at(level); @@ -3105,13 +3107,13 @@ void GEOM_Gen_i::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo, // purpose : Fills 3 lists that is used to clean study of redundant objects //============================================================================== void GEOM_Gen_i::GetEntriesToReduceStudy(SALOMEDS::Study_ptr theStudy, - GEOM::string_array& theSelectedEntries, - GEOM::string_array& theParentEntries, - GEOM::string_array& theSubEntries, - GEOM::string_array& theOtherEntries) + GEOM::string_array& theSelectedEntries, + GEOM::string_array& theParentEntries, + GEOM::string_array& theSubEntries, + GEOM::string_array& theOtherEntries) { std::set aSelected, aParents, aChildren, anOthers; - for ( int i = 0; i < theSelectedEntries.length(); i++ ) { + for ( CORBA::ULong i = 0; i < theSelectedEntries.length(); i++ ) { aSelected.insert( CORBA::string_dup( theSelectedEntries[i] ) ); } @@ -3237,7 +3239,7 @@ void GEOM_Gen_i::includeParentDependencies(GEOM::GEOM_BaseObject_ptr geomObj, return; // go through dependencies of current object to check whether it depends on the given object std::string aDepEntry; - for( int i = 0; i < depList->length(); i++ ) { + for( CORBA::ULong i = 0; i < depList->length(); i++ ) { aDepEntry = depList[i]->GetEntry(); if ( depList[i]->_is_nil() || aDepEntry == anEntry || // skip self-depending diff --git a/src/GEOM_I/GEOM_Gen_i.hh b/src/GEOM_I/GEOM_Gen_i.hh index 3413d9d97..778d57197 100644 --- a/src/GEOM_I/GEOM_Gen_i.hh +++ b/src/GEOM_I/GEOM_Gen_i.hh @@ -68,7 +68,7 @@ //===================================================================== class GEOM_I_EXPORT GEOM_GenericOperationsCreator { -public: + public: // Create operations virtual GEOM_IOperations_i* Create (PortableServer::POA_ptr thePOA, int theStudyId, @@ -76,6 +76,7 @@ public: ::GEOMImpl_Gen* theGenImpl) = 0; // return the name of IDL module //virtual std::string GetModuleName() = 0; + virtual ~GEOM_GenericOperationsCreator() {} }; //===================================================================== diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.cc b/src/GEOM_I/GEOM_ITransformOperations_i.cc index 55aa0eb3f..7d2993f2b 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.cc +++ b/src/GEOM_I/GEOM_ITransformOperations_i.cc @@ -609,9 +609,10 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorPointCopy * OffsetShape */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShape - (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theOffset) +GEOM::GEOM_Object_ptr +GEOM_ITransformOperations_i::OffsetShape (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset, + CORBA::Boolean theJoinByPipes) { GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); @@ -631,7 +632,7 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShape if (aBasicObject.IsNull()) return aGEOMObject._retn(); //Create the offset shape - GetOperations()->OffsetShape(aBasicObject, theOffset); + GetOperations()->OffsetShape( aBasicObject, theOffset, theJoinByPipes ); // Update GUI. UpdateGUIForObject(theObject); @@ -644,9 +645,10 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShape * OffsetShapeCopy */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShapeCopy - (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theOffset) +GEOM::GEOM_Object_ptr +GEOM_ITransformOperations_i::OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset, + CORBA::Boolean theJoinByPipes) { GEOM::GEOM_Object_var aGEOMObject; @@ -658,7 +660,8 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShapeCopy if (aBasicObject.IsNull()) return aGEOMObject._retn(); //Create the offset shape - Handle(::GEOM_Object) anObject = GetOperations()->OffsetShapeCopy(aBasicObject, theOffset); + Handle(::GEOM_Object) anObject = + GetOperations()->OffsetShapeCopy(aBasicObject, theOffset, theJoinByPipes); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.hh b/src/GEOM_I/GEOM_ITransformOperations_i.hh index 3e06acfb8..b4b4f9a05 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.hh +++ b/src/GEOM_I/GEOM_ITransformOperations_i.hh @@ -135,10 +135,12 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i : GEOM::GEOM_Object_ptr thePoint); GEOM::GEOM_Object_ptr OffsetShape (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theOffset); + CORBA::Double theOffset, + CORBA::Boolean theJoinByPipes); GEOM::GEOM_Object_ptr OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject, - CORBA::Double theOffset); + CORBA::Double theOffset, + CORBA::Boolean theJoinByPipes); GEOM::GEOM_Object_ptr ProjectShapeCopy (GEOM::GEOM_Object_ptr theSource, GEOM::GEOM_Object_ptr theTarget); diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index d8945d2fc..79dd09036 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -9228,14 +9228,15 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): """ theOffset, Parameters = ParseParameters(theOffset) if theCopy: - anObj = self.TrsfOp.OffsetShapeCopy(theObject, theOffset) + anObj = self.TrsfOp.OffsetShapeCopy(theObject, theOffset, True) else: - anObj = self.TrsfOp.OffsetShape(theObject, theOffset) + anObj = self.TrsfOp.OffsetShape(theObject, theOffset, True) RaiseIfFailed("Offset", self.TrsfOp) anObj.SetParameters(Parameters) return anObj - ## Create new object as offset of the given one. + ## Create new object as offset of the given one. Gap between two adjacent + # offset surfaces is filled by a pipe. # @param theObject The base object for the offset. # @param theOffset Offset value. # @param theName Object name; when specified, this parameter is used @@ -9244,11 +9245,13 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): # # @return New GEOM.GEOM_Object, containing the offset object. # + # @sa MakeOffsetIntersectionJoin # @ref tui_offset "Example" @ManageTransactions("TrsfOp") def MakeOffset(self, theObject, theOffset, theName=None): """ - Create new object as offset of the given one. + Create new object as offset of the given one. Gap between adjacent + offset surfaces is filled by a pipe. Parameters: theObject The base object for the offset. @@ -9267,7 +9270,48 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): """ # Example: see GEOM_TestAll.py theOffset, Parameters = ParseParameters(theOffset) - anObj = self.TrsfOp.OffsetShapeCopy(theObject, theOffset) + anObj = self.TrsfOp.OffsetShapeCopy( theObject, theOffset, True ) + RaiseIfFailed("OffsetShapeCopy", self.TrsfOp) + anObj.SetParameters(Parameters) + self._autoPublish(anObj, theName, "offset") + return anObj + + ## Create new object as offset of the given one. Gap between adjacent + # offset surfaces is filled by extending and intersecting them. + # @param theObject The base object for the offset. + # @param theOffset Offset value. + # @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 offset object. + # + # @sa MakeOffset + # @ref tui_offset "Example" + @ManageTransactions("TrsfOp") + def MakeOffsetIntersectionJoin(self, theObject, theOffset, theName=None): + """ + Create new object as offset of the given one. Gap between adjacent + offset surfaces is filled by extending and intersecting them. + + Parameters: + theObject The base object for the offset. + theOffset Offset value. + 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 offset object. + + Example of usage: + box = geompy.MakeBox(20, 20, 20, 200, 200, 200) + # create a new box extended by 70 + offset = geompy.MakeOffsetIntersectionJoin(box, 70.) + """ + # Example: see GEOM_TestAll.py + theOffset, Parameters = ParseParameters( theOffset ) + anObj = self.TrsfOp.OffsetShapeCopy( theObject, theOffset, False ) RaiseIfFailed("OffsetShapeCopy", self.TrsfOp) anObj.SetParameters(Parameters) self._autoPublish(anObj, theName, "offset") diff --git a/src/TransformationGUI/TransformationGUI_OffsetDlg.cxx b/src/TransformationGUI/TransformationGUI_OffsetDlg.cxx index f4157b6bd..2e2916f03 100644 --- a/src/TransformationGUI/TransformationGUI_OffsetDlg.cxx +++ b/src/TransformationGUI/TransformationGUI_OffsetDlg.cxx @@ -58,26 +58,24 @@ TransformationGUI_OffsetDlg::TransformationGUI_OffsetDlg( GeometryGUI* theGeomet mainFrame()->RadioButton2->close(); mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); mainFrame()->RadioButton3->close(); - + GroupPoints = new DlgRef_1Sel1Spin1Check( centralWidget() ); GroupPoints->GroupBox1->setTitle( tr( "GEOM_ARGUMENTS" ) ); GroupPoints->TextLabel1->setText( tr( "GEOM_OBJECTS" ) ); GroupPoints->TextLabel2->setText( tr( "GEOM_OFFSET" ) ); - GroupPoints->CheckButton1->setText( tr( "GEOM_CREATE_COPY" ) ); - - // san -- modification of an exisitng object by offset is not allowed - GroupPoints->CheckButton1->hide(); + GroupPoints->CheckButton1->setText( tr( "GEOM_JOIN_BY_PIPES" ) ); + GroupPoints->CheckButton1->setChecked( true ); GroupPoints->PushButton1->setIcon( image1 ); - + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); layout->addWidget( GroupPoints ); - + /***************************************************************/ setHelpFileName( "offset_operation_page.html" ); - + Init(); } @@ -97,37 +95,33 @@ TransformationGUI_OffsetDlg::~TransformationGUI_OffsetDlg() // purpose : //================================================================================= void TransformationGUI_OffsetDlg::Init() -{ +{ /* init variables */ myEditCurrentArgument = GroupPoints->LineEdit1; GroupPoints->LineEdit1->setReadOnly( true ); myObjects.clear(); - + /* Get setting of step value from file configuration */ double step = 1; - + /* min, max, step and decimals for spin boxes & initial values */ initSpinBox( GroupPoints->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision" ); GroupPoints->SpinBox_DX->setValue( 1e-05 ); - - // Activate Create a Copy mode - GroupPoints->CheckButton1->setChecked( true ); - CreateCopyModeChanged(); mainFrame()->GroupBoxPublish->show(); /* signals and slots connections */ connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); - + connect( GroupPoints->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); - connect( myGeomGUI->getApp()->selectionMgr(), + connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); connect( GroupPoints->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox() ) ); - connect( GroupPoints->CheckButton1, SIGNAL( toggled( bool ) ), this, SLOT( CreateCopyModeChanged() ) ); - + connect( GroupPoints->CheckButton1, SIGNAL( toggled( bool ) ), this, SLOT( JoinModeChanged() ) ); + initName( tr( "GEOM_OFFSET" ) ); globalSelection( GEOM_ALLSHAPES ); @@ -271,10 +265,10 @@ bool TransformationGUI_OffsetDlg::execute( ObjectList& objects ) GEOM::GEOM_ITransformOperations_var anOper = GEOM::GEOM_ITransformOperations::_narrow(getOperation()); - if ( GroupPoints->CheckButton1->isChecked() || IsPreview() ) { + if ( true /*GroupPoints->CheckButton1->isChecked() || IsPreview()*/ ) { for ( int i = 0; i < myObjects.count(); i++ ) { - anObj = anOper->OffsetShapeCopy( myObjects[i].get(), GetOffset() ); + anObj = anOper->OffsetShapeCopy( myObjects[i].get(), GetOffset(), GetIsJoinByPipes() ); if ( !anObj->_is_nil() ) { if(!IsPreview()) { anObj->SetParameters(GroupPoints->SpinBox_DX->text().toLatin1().constData()); @@ -285,7 +279,7 @@ bool TransformationGUI_OffsetDlg::execute( ObjectList& objects ) } else { for ( int i = 0; i < myObjects.count(); i++ ) { - anObj = anOper->OffsetShape( myObjects[i].get(), GetOffset() ); + anObj = anOper->OffsetShape( myObjects[i].get(), GetOffset(), GetIsJoinByPipes() ); if ( !anObj->_is_nil() ) objects.push_back( anObj._retn() ); } @@ -320,13 +314,24 @@ double TransformationGUI_OffsetDlg::GetOffset() const return GroupPoints->SpinBox_DX->value(); } +//======================================================================= +//function : GetIsJoinByPipes +//purpose : +//======================================================================= + +bool TransformationGUI_OffsetDlg::GetIsJoinByPipes() const +{ + return GroupPoints->CheckButton1->isChecked(); +} + //================================================================================= -// function : CreateCopyModeChanged() +// function : JoinModeChanged() // purpose : //================================================================================= -void TransformationGUI_OffsetDlg::CreateCopyModeChanged() +void TransformationGUI_OffsetDlg::JoinModeChanged() { - mainFrame()->GroupBoxName->setEnabled( GroupPoints->CheckButton1->isChecked() ); + processPreview(); + //mainFrame()->GroupBoxName->setEnabled( GroupPoints->CheckButton1->isChecked() ); } //================================================================================= diff --git a/src/TransformationGUI/TransformationGUI_OffsetDlg.h b/src/TransformationGUI/TransformationGUI_OffsetDlg.h index c2ec78c41..54295bf29 100644 --- a/src/TransformationGUI/TransformationGUI_OffsetDlg.h +++ b/src/TransformationGUI/TransformationGUI_OffsetDlg.h @@ -57,6 +57,7 @@ private: void Init(); void enterEvent( QEvent* ); double GetOffset() const; + bool GetIsJoinByPipes() const; private: QList myObjects; @@ -70,7 +71,7 @@ private slots: void SelectionIntoArgument(); void SetEditCurrentArgument(); void ValueChangedInSpinBox(); - void CreateCopyModeChanged(); + void JoinModeChanged(); }; #endif // TRANSFORMATIONGUI_OFFSETDLG_H diff --git a/src/XAOPlugin/XAOPlugin_IOperations_i.cc b/src/XAOPlugin/XAOPlugin_IOperations_i.cc index 20581c9b9..76ea046e0 100644 --- a/src/XAOPlugin/XAOPlugin_IOperations_i.cc +++ b/src/XAOPlugin/XAOPlugin_IOperations_i.cc @@ -74,7 +74,7 @@ CORBA::Boolean XAOPlugin_IOperations_i::ExportXAO( GEOM::GEOM_Object_ptr shape, Handle(GEOM_Object) reference = GetObjectImpl( shape ); // Get the reference groups - int ind = 0; + CORBA::ULong ind = 0; std::list groupsObj; for (; ind < groups.length(); ind++) { -- 2.39.2