From d02f4dc56755302c58f68b51daec391c8c1eaa8b Mon Sep 17 00:00:00 2001 From: skv Date: Mon, 23 Mar 2015 13:02:48 +0300 Subject: [PATCH] 0022869: EDF 7482 GEOM: Automatically create groups with the generation operations --- .../gui/GEOM/images/gen_group_disabled.png | Bin 0 -> 29027 bytes doc/salome/gui/GEOM/images/gen_group_dlg.png | Bin 0 -> 23977 bytes .../gui/GEOM/images/gen_group_other.png | Bin 0 -> 9001 bytes .../gui/GEOM/images/gen_group_sides.png | Bin 0 -> 10709 bytes doc/salome/gui/GEOM/images/gen_group_tree.png | Bin 0 -> 4786 bytes doc/salome/gui/GEOM/images/pipe.png | Bin 18720 -> 26947 bytes doc/salome/gui/GEOM/images/pipe2.png | Bin 20855 -> 28891 bytes doc/salome/gui/GEOM/images/pipe3.png | Bin 20513 -> 29124 bytes .../gui/GEOM/input/creating_complex_obj.doc | 11 +- .../input/creating_extrusion_alongpath.doc | 25 +- doc/salome/gui/GEOM/input/creating_groups.doc | 76 ++ idl/GEOM_Gen.idl | 79 +- src/GEOMGUI/GEOM_msg_en.ts | 28 + src/GEOMImpl/GEOMImpl_GlueDriver.cxx | 28 +- src/GEOMImpl/GEOMImpl_GlueDriver.hxx | 9 +- src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx | 357 +++++- src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx | 78 +- src/GEOMImpl/GEOMImpl_IPipe.hxx | 53 +- src/GEOMImpl/GEOMImpl_IPipeBiNormal.hxx | 7 +- src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx | 13 +- src/GEOMImpl/GEOMImpl_IPipeShellSect.hxx | 8 +- src/GEOMImpl/GEOMImpl_PipeDriver.cxx | 1059 +++++++++++++---- src/GEOMImpl/GEOMImpl_PipeDriver.hxx | 11 +- src/GEOMUtils/GEOMUtils.cxx | 51 + src/GEOMUtils/GEOMUtils.hxx | 13 + src/GEOM_I/GEOM_I3DPrimOperations_i.cc | 172 +-- src/GEOM_I/GEOM_I3DPrimOperations_i.hh | 57 +- src/GEOM_I_Superv/GEOM_Superv_i.cc | 27 +- src/GEOM_SWIG/geomBuilder.py | 231 +++- src/GenerationGUI/CMakeLists.txt | 2 + src/GenerationGUI/GenerationGUI_PipeDlg.cxx | 280 ++++- src/GenerationGUI/GenerationGUI_PipeDlg.h | 20 + 32 files changed, 2157 insertions(+), 538 deletions(-) create mode 100644 doc/salome/gui/GEOM/images/gen_group_disabled.png create mode 100644 doc/salome/gui/GEOM/images/gen_group_dlg.png create mode 100644 doc/salome/gui/GEOM/images/gen_group_other.png create mode 100644 doc/salome/gui/GEOM/images/gen_group_sides.png create mode 100644 doc/salome/gui/GEOM/images/gen_group_tree.png mode change 100755 => 100644 doc/salome/gui/GEOM/images/pipe.png mode change 100755 => 100644 doc/salome/gui/GEOM/images/pipe2.png create mode 100644 doc/salome/gui/GEOM/input/creating_groups.doc diff --git a/doc/salome/gui/GEOM/images/gen_group_disabled.png b/doc/salome/gui/GEOM/images/gen_group_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..7c97c857c6e931d7cfe77511888553d4ab408d3c GIT binary patch literal 29027 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 F{{h8++cE$E literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/gen_group_dlg.png b/doc/salome/gui/GEOM/images/gen_group_dlg.png new file mode 100644 index 0000000000000000000000000000000000000000..e70e6e288fa0b80f2027ee7fe24c16b692b584d1 GIT binary patch literal 23977 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 D@Kgac literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/gen_group_other.png b/doc/salome/gui/GEOM/images/gen_group_other.png new file mode 100644 index 0000000000000000000000000000000000000000..77610660f05951a275d9195d8accb9e31a5d28d4 GIT binary patch literal 9001 zcmV+^Bi7uBP)Px#32;bRa{vGi!~g&e!~vBn4jTXf00(qQO+^Ra1P2Z?A@z5{M*si-8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9bAOJ~3K~#9!?OkoGEme7b-?i4vJ{JrT zZut6PqDe_x8{25B(h~hw`49xFqI`)L&=S0WUNJ`7LJ_T0?X{4`3&Q0BA}AF_<(py? zBgV8^eppS~*!W961Qnxj&)GAxR)4%RYu2p!IJ3{5nZ3`R_sQgBpTptoefM6^Jn#Fg z_k9;W_JjcjgV6;9zXc3NS5St$PkhTn`ct1sul|=>rak&Yexp|($RG1OMDqC4fG2h{shCcTDk8OK5tC|Mbb5q8 z+7@`z>~gdzsra2|Ix&&D0W)ev>GT8sL~DrjXT1=~BNe~@OsBDMsXrq5GR2?5YS8In z{veAuaVR2rq~Z^P>9m4e8kk7TD5evO5;KZXMW=`UlRrN=>9vdJl4TTsB1|VH5;KZ1 z?uzmy-@X&Yf`cKjJt)ply2Lga0wQ zF#Y7$;nEVxOQOy@57yV=f)8^l#laqPX>NoetgXR;&vMkaJuo75I{9@=9pKdo)I}G; zbP5|A@ci@efooW%mKtMeZa-xka)}TGfCz|i_~CHlKj8a5#*E@%kGZr}Ph#Ib2!b@~ z+pz;~`VSKP%#t*W-31QsF~V0FY`FBHVl}Ui1;xC{`!t(v}43`s*PG(rYq- z9XnwEr&*&ocN!LN-u_(j1j^N@TRwxk*g$7>8iq)##3eE$>=lL(hOlD?+{y+z(`gt{ zS|u(4z_r(cQt9O~>h`_ND7GT{H~l;eh$z307rexp-wASG_{hT z8-!IS5-1z^O(t;1bzIuF6qj0=HFxUq+jVnk3+jYea3%oY&g=2)%UGj0ck22szQS~J z1cV5qV)S`1IzM*YXb#gVz;!D@z*_ZQ2%2vdDIPK4IwWSFF!Z0@>JlLNY z19yB5&t+$VgFQwap4bhy-IfP+)`zh1o*VeBt-%*R$59{CiKVGgn!L*r$zJqBV$^N_ z#EjzHiBX$4A%H3GJCz?($fq^j`dK{x3jTOmofySP@4ov)5I`7W5TLd4+_Iyx*EgBK z+8XS?mNkm42!{6|DMSQBQYS<-t|EEcP*$Kwqxkb>b(#&|{GOq6C{|LM9(hCx0ZO4# zB9kU8r&6R>-e%N}9lROExf3Jf(gP1jtw9J70<+tnK{TXMqD*BeDAg!;%Z+{E#;dVo| zBHH5{kDJp^*xrnKVmI7=J0uCvP*LwIF-j>!#4PH|13!T3kk4LhOK|Qq8}5DFoN>ao zoTo?Fzn{27l*qY6v>`^3GvVY*6{%Duo$mfTzT*<6RG-1#y^pWp`%8>kep0!HfNCnGxf|HBu zuFHv3W)x*jQi4)m9)*aYwZ|x!PL0bV``D7|g%^OU&Y4bI#9i0pSH1$vz$=$UpZN?3 zkp^b;pv)-CD`FAFcp0OR+;c=ol3b=ppr%t}`BN4sV$``GWJdLoJFWV=`mRe20A`C4 zZY^#2_C&Dq&hjTenUe>yeIYXIAS<-1xZ$M|YXC4wY&HefoKT8NC2ZDY0MHoYW=*z8 zg1)Y;fnhfFp-x}_?kL{Z8?M2fJ8kTgjZ?jO^Z#*EvNaTBTy>Sd$68jTx^KOxkK#S6 zRGvl&fm)~Tc@&xH)L4NkhkWFlA3O+WzMm<@blNIDe>EO?WX>qNcImp|hPnRuM?YF! zpio)3(1ui1Q6IXoU*=Ds5UDv~3~ffGjM~_!VAT40`jz%}If?3+PG9@(xZcpOejZ)l z%p+AL8OjeD9&gGek5nF)>PY2kR7NW6Pq-Qd#Hi_1S2D^KsP%RD`Oo3~S2Lr!%bmvd z4}SY4=I(#NAjp3rgqxx?-g~Nk$Cy_CulxI6%H)1a58VGs*^bSiFn=;HkAf_fN~`;f z(Z)bs5=Gb1M>7Swgc#v8v@_ptHZ}^Y3Y_iEmMm)dUn{v}pANjLh5B#pOV!%g$4O$y z)=Ls&X+sg9QW%EzDzr$sMd)j5@P$tx56J848fp9ByDl{^zL>AnB*|U1241yiQA^*< zrA^(p&5Y98(2LjFs*oW%1%U_x^cp%Wqb#qEI*LW5J9QfEt>moB%?mF;9Onx+NxHF* zXZ<5B1*%9YV_k2pO-3qXe_tt~ln6tSajC#4_rYWWU){$;WV^XW-Q0fGx{kXHJIS5K zjdxyZk_4vH!osx)RflMntcEbJ@>|O&D^L{jQ62?=^!k;;Fce`ZgMb*7%8{2rg&`br z2y=n0h%T;oTw-2)5#rcSnKo6bncTlNG;1kP^^7t$_9Km=ZjK-jVJLzCClf3)%7%RR z>|;-2ZYzS{1j?fh9!zs5ch$P9c}`DnRvoLOmS^`B8D)EQwJ}s`1c(>}7>1JaD9fnw zwYCO#@<|+=J9UCHcboO~bb(gNLLXsXLpD{(qO!wYWR!79WlXA3LRf*y8D(QX*PJ-? zP+ka}J9UKhb=cU*8C71&Tky@dM#Tn2D*w=0e3?I42>D2(gvbTT)hO3Dr*o|D*~gv) z)2R!b^Fgz|4so2POqGnZiVO8UqwlMqN6QMgMI2kb*#D z0iY%`kghn+AH*?y<0gE|MZ7Fnow~r=FG*X($?GedZ*7>Z1|OZm?(d%HC5LOs9GA*1tA%pSFzhyuSGbYNnu|O~_}fB^*z}xL5jG5Q2a_3E@`s zxs^whL@}67ond1m9a!h?N6lHtx3z?-nM>vE-IB|v>9QNsQi_aGSU%y#YShM;GQJbQ}*sp<0bu#6Y^Q9r5*6C&x00e;y0!h^pVTf*+=bpi_?`qzL zn)T#%&N*xFR~MVF--xz>&$9vMVN3fKDfc(aRz#gYp>;ZWFLNgHz>nsNQOKvYnM_2I z=rBxsJ?!lxjv)-;*kgIpB?o)GB~fJ?pj%PeRQfgz{2ZgtxEp9$2~t`k3jj({yeBJ9 z;;>)8@Cgq2W&od{u?eh$j0jfr81zBuShk z5XUAA3j!6#aLh5RPpnQI3e?56KQB+Bnq{ghm%P%JXrDxpSMCawz3A9AA*?{9ryG{b zj=~VW%)J{-rw;L!_vVc9I^jKP%_BYh zp9(`!cT(tmx3FW*4H})|)C*IWZwrj-oLY5^D#v~x*=T6<@*=K8O`L=*gsMUs1?#8a;NoX?7=_n5JB(fx`LZI%yg$)U&Q>S?Mhwb^9 zg+XF73DlNtz4lxxG0J2zWt(Bv_zYSrOczF%wSNWgfmAX&cI3&9+3Z zsPjdWd<{{}w!D7cUo9r%pi| zyY4nrrDzOBs%DKU7RwrUREyTy&Jq(s2!WG{oJ>?0<{_W0i)DdgI`t(`w(*Y6v8{`; zdU7DP%qyql++@R#sE<(7uC7vU232TC^-P1cC7diq{MWd)?yQANBNY7s1x|uU5rc>8=`e~?S6u@E_)v`3!VU+9gr59Oz)UG?3s34#rvYbJ2?$q;j z{zvjtVaS$fn0L7-a}NNF!ICFo+)8s>e3a3N;yoFL%4LyKpj4VlefrGr2sqEa#pbr`B3h{F&vTOy|xuN=;u`pTf(GV^A8 zpe1IdR>L&Eh9U`PAhYo@D5Yq+r3^z!id1&Y`P28+iElA;;@m6DV_!lyaca|FI6x9r zd`5ddO~Fa0`aNUN7%)!6r&Is{Or7v&CwPPv)LNj$X)Sem@3oHxa}Km z1|Iinctv0!&3P%nE~S|lNa?*{-Zrg5YBhqfqI2pTDo_q`{H2?CUo zGAKEjsP*+Y3==ofBVO_PVRh;rXYZl$#f2^1Io*gJg1tI{$~U0g(pZZ3$S$wk(hWnn zpA8A7Qy+NdnS2}{HEz_kLiHEjZOW)J&z*S^g)UvKH6kiS0+rIqn-R`c<-P?JozNN{N?$)Shr=P4;IaI3`esy zVkd`XfuD8+N=lh-KusoUI*oz=scVC_cY}Z{BskdX0q0&}ESKyAW@yo(J1{DThuL8g z&g^BabsF!LGbqa?j`x^Oec>0sDA1`~d9?68s2Xk?SD>1u6`KB+)@2gFpp= zR4P#llrol4TyVtd)E8**a#^4n4%(QLFmncb_Ob1QDn@#?Hu?q?I8c5}A(*EO`n2*(H%mkl=W)5bUu+_k`d54qp1w zf<{#q_~269(A^h-#b7V5;*&BYe~;29rKX-;&gBt27_6`Bx##@xMho;Iit=M=Q|nTA zt%P zc`1p~L7*~qlI3_W2;lykkgFmXz2M+McmCFLg?Y_2gx&^Jw)o&Yk+jiMz}XzKPx;0OiHq zVd+ClWhzz}RdngPjZZe-vjUZ!0j0uFDiwPf)MytKtJ6R+RRf*2ocYY}7B;*j&nvg? zo-sNIR1hd?D9qx$La_JXSgVb=Dq@IukLIy>ylOwxvJXG7ILCs-%DR2%#(T~gP-!_V zqM&#$Q>Q{XEXmY3*A=T%?|AXWjs>a{E_sPlntHJOajjo{pA z2t4;39DaBj0xi`Eg>~oF6vvolM?)3rB!Et&Rw})u)UG;7ImR0`2YW-{tPhzeY8BTl zVX?Uz>{(I)7$GE`SVKcC%kduPPK>?~ML>*N2-@pj%^^C*J-3D^g($OlkJJe~Mlqcj zeIbq^iu@^D087+a*r-nVS)gwEWp;!?l#aP4J#`u(o!BT}NH&r`Scbu1ZPe1S z_Ht)JN|nWXvNGNq+v;L=WabYu^+{IdHUp5?v1n5h}CI0y!~>!6S_Rd=AuoU znxDPs>E(EY9L=RP@mxRvIf5TekjA?3K*G&pw}6n12}y=~XE8}%bc zGYhFtsNxYD^nlVQt4>0olxCb;PaNzGis`ggo#rowm}OWWw#nIyDUX0oQzp8cQX^%( z@-c5cF`Wj5TT~9U-4Mgr56xLqtu{Hi6S(OUSrL{|R-GO>fJ`SwUvvVfm8NAlNv;0b zu~-6|7nlp7vfZb=)X2TYlsj?qG$7uz%l!Be1ZWyz*|QsgEm-A}%6L;Oz4VC+VeRgd zlmZdli;m%8bz<~_Bxy=)dKRdb>@)yP6V+|{l-&yu(fgYI1Bp%?>@oVK6Tp%jGCfad z=n)l#K$lKdotRFH9_gg@k~0b$DP+oyg)2?@UvXq=G`SNm@WJV11!`HPrrxP=xP<8Z z7%=5j3S)^R#E7<@xGG`+bc$opdf9H{~(1_!dPL)OF%bZ6w3{`i+yj+*;HJ&xb>a>9SdYcNPrA(j74e*6?b%h{v zFJ~0MxU2}K)8Kb|+}@T~afdhMm?KT-{Ts*S?6DQGKswDdZLh!aV6za()UeBS_Da$; znl;9`)57TFhJ2O=L*C2lpR3m8E1wEwf8WiWyo+-u#tCs?yT8ui)oxSu&m@VX2rqbE- z9x$C4-Q%s7nwHYEoY7w;<%(7WdW8|3J284h<>}7L%%9Dq35s0ubElm<$MVVYzSCmp zwA`n6Hh*j9ML@C0$hHqw)R?dc!B@zN)QJRc*hSeL-HX~VP9PBNIPFA4W6Up`Z>K+dzPUu8>R-d#- zr~G0og3%wH?47$VUti)#51iuhoKY0)=@e#(52$B4tsE%WTZVPk$Xm0SI;FW2A_aRo zlO|*D7fbTbWIC-fm%I+#0d)yC`}^4V8n8-E?diIP(kClQ+hkNzx49E1PXph;vZKV7 zZ2;Y7#=Y@ea#yB|(G=_%qdiY=R0757v;aC0m%PfoO?`+S!nszzRvhhuB`HHhNR=t` zA#60uxf7#b*we)9I-9kCpm~Az7cM&LgiiWIUyU`&owEr!cVY|`>aUg1X<+s^bYo9T5S4~vh61CH!2GD-0L^LVJm{s z8=X7}svMF!uuQclcJ`ZCwDoMYUS1VpHR|N|jp&BWxzn(3w<;ahvP2V$a3=aW^Yq+J zr-BJFs>F%aY4LPgru|&gNTJGV^t=@}b@hso-l!5Mrqj>}g8V%5%8_)vW=HcRF^>1( zO?!27C+&4QjmjklZqOL|?j>>}wVx8vDZ5PjpswsgxGbWfdWfiXqID8QNgV4Wp$*+! zowx*+(F-2FDWB(9$0!)Q+NiY&;SQtBp>?8ltaThkNfaeXVv+=sBu$*grcO+!;c&ze z1uj)C=s~z-+N)ym@*of~NfND-IM#8T#BoAgaxbP6qu<1-(u5dHlrk@__Sq{-AH35s zTy;v4B#x6zoeErvBv3T+$TdxmQr9qi?GYfogiOZ!CMtV%A0mA^5wmGFE@Qp7`3*67$^r?&IV&u}4BwFi)q$!FLH_{uS z55c+9viJ}SN3&FV!JZI>#3_z-6y>&F9OvpZw$;Vzv;aCmV^911Ol$ua+IaMCj8{Cd zlU(wcq^WF?k1*I{D`Fr_CQa3POA_fd+Im>IhnpmMJ%pD#{rcBzMKJn77*=p;Nlv4w zYq|9{aJ}Q%lO)OZa4UR>B!Ls(JGxsn=T1Z5hhM{^k8Wboa_3H1X_V8Xl{ijwC+kDd zgApc9tWE=AZEYF*GTM}7lp;OI4wFu+^+=k$@}jW~Fk(6_CUF8-KvhH&p*CYwS(h>^ zLb%m>>_e~>F=*oCWhR4#YON`SH3Y-DPN(7quJ1#<`gAkGrNy~Z@A&osJnp!D!@M~= zHtm}8peLqO{>cf)r>d5R=506@vsE96eEd8--cx?*+e7l$3@ zhk0IrH-K+G)5>;*D`OF96bOM*3MoY#r`t`_X%Uz&MWMINsQZH#XuZf;dhuOQ+E;Dpsc+@jnk^S(;`lD({tSo0{X+if|Gq%m%Fx zouW84acrUp?DfZQ8SgEct0MY*b5*r8RW0Ay_~Y)|&bo)&z~QV63IV|L^sEmN#}w(& zmAFKrYs@Q()v3=ncMe?|KHe+EqBhclOq~z_oJcQ~CW`ckOVjDNZ=ftr{ee!ErgPfs zD#{l=^R;UC7TidWq=`H|Dl3{!)5OWLh^~<*POMHn;{P5)%cVMLnkirE;dE-O3;&9q z9!i;xhe#3~#|cGxQKT(}?DZ$7kNW=1bm~!>l*&(_8Q5l+-FvWElYc;l&6*G)j^ijI zb@C&}y?`q(Y`y;8k&uwIfRb&*~wO``|XseAnN-;kuKvY~xBW`H47&7ifD^fG@u^&!ZF zh@zNwZ>LjT9qI9Hl;48R5d^t30aQ!^``E{NdEQ%Y*@{wSKS|HNb&5(MaGNt#yK3Klsj?q)G7Y^K0M-xyb|J5pQ`?~J)J)3UH|~N;DXJ6^X|I~($pB~ z75bgBNH5vgh=_TY{Qv*}0*XmQK~zhgK)vcT!)uAvsbd^+2;6vMU$m*ip4OB*^Gv96 z-^@b~$;^8|XD3%=S(Cfn9r>U`X@eO~RJ8fqPX{O^r(4ZRl8UZZz3NwQc*BOh~Z3 z>{&%#0l*n&m;(pEYjENv#Ol-|qbRdK;hvYSq*(3R1(#jsM0)J$6>=v=Ka6_Y+YkW0 z^PN}R`^KNG7^C(AM|#!3s}AtprAJ)73jyHq$A9mh6Mni%|E|3N7hep&`W5`)$-I6z zcNz*;9xwoK!U^alAuE6zZh$Kfa9vSRovvhc8W11fwK}}oo82rJoI5R2tUPM%;rE5< z#OQ=tAK!(0x1nC`<cDcqKFAt^@qZPXvz^h`bbh??}I0mDm+=Px#32;bRa{vGi!~g&e!~vBn4jTXf00(qQO+^Ra1P2Z@Ak8sk761SM8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9bAOJ~3K~#9!?R{ymWmk3HTIas^_~)d` zt~f)bsMv9(GL(ZSKp>2$!Z8VG1X&USG)qWABM8kS-I`iMcT26FTWU?vYPDtw5JDtI zGA0OB5@)P9Hp!n<{$wDrs{HP|XXVEk_F8N2eeQkT{kqS2?_0XOKJ&fYbH2OQ`qsoh z_}4-Z2xMhsj({%+WW}VwR{((kU=YYKO+;9T5C}9F1Tstw29g5;fr$u#z(j;VAOIKy z0)RmvtHTF_69$1mgFzqw7z6^bCL+FqLzL}*%H0QC^mk!}uU+Bqy^Gs_FtTGBu99*g zz_#W9_EX&QWkTz}@F8B|!e7OA4uC;c09wEpd@#t$LJP9CG}!CVV4bpa8niz0zg`up z{}T}sA`)r-ipV>^d~(O>7eJK(V1QOEAN}925fM=nsBhub{8s~vq>^gs-M{f!U~G*6 z>>b?Q2wH#E1+8QM&$nA8RZFuHG*`Q=hF60#5fXX#Z+^~W>{oCX;DfDsXnpMG-ytGm z5)oz&;Hp+ci2dn8)NW$t3S+ zfz+58X3jISUKud9%6+gkUaqqH&pD^HBmpl{E|sX&dYP#r5Sxw6)gC4iCKeK|R=Eah z^yW`&x%vy2Jb>qN^=Po~{6qk)ptb(udm2$EoAGq60x5v5R*w6NH)^fIwQgbJ>gBdujmFHZ{;4!nyT+}Um0Ajph{w6P zx%q|py$@f3rxO}%m7uGJ7ERY(-8xMo{bkl{BswTEk)Qmv6ZLg|;Rn}^7spGJ$(JsD z5YOnqeXzCk|8`GOalQ9Ote0wUss0txc)*h_a*x8Tm%N;LF!tF6`p|&20s$*)~(aNYO zMny3{KR-V=_v9m2ubq3e`d<9)f4L@f*q)z7X5o9^?>Zr3S0%GI-md7!bXd&(t&PVY z|I+dLO27ESo6E8+%W_hdi;Ih2xERzTNRGZjD@NBR-uwQPBzb1@avVqJ_IlO)FD%qr zt2wgS>OT$_MNt&RXfzs)-uJ%uJ+N9uEqF}CdS+TIN@HF(;;8?`9GhOAl_uh>0GNal`gN>LpaW8g@ zP?fw8>^yt-{kS%h>K><&4$GsJL^r_Tm5es=o67IOdju3!}$I#lphE{QUgh zhcCyoI}8oB>J`}j{X#_hiMD+D2Zzsf<&^6c6jc*OQ>)yBp6l8%X@h1YTqP~WXy<~t zEQrdYAd&jlaA9GAh#q_B^0O|39)kw!0lF%=^wm$qswktDmgkaLj9EoxNW^fgI?K3Y z@f%d?t4^#cf;J8H?$kxlQcB?Mr5umPlgZ?a3&Gv@7+|mb@tU9!KXd;wG1i4XnFh>s5X_yPtIzzS z48}?k5-Cdw5R-B|9xp9T&bSB|gNb-l<&`Labjd5n9W24Y`DmEV?(nP5GE@uNjO5%K z7R-%H#m|U}RC4pnNsJvbwmS;vJ$(3m5O)a}@dwTn?{1biF-+uQVvi;sP z=~0$amZgX+E-sekWISFv^Wu%r8!!=%vb=nCtja#VOf|;I4EvOE=)Es%SQ_suVDgQ93y!eNWU&3O|sjj=+d1JBRT z7ez5QH~+*IBvQc#>%r@#t7Ef|J74DXR61krVrj)@SFQJ@mYY;zI`-$^(^vejAGjt2 zp(B7%gRzQUoL^X|kOt?cC$F_W1l?h58mE!T6ZQ=TR3oays;BTN6svHiaa9AZ1jeee z7Ot~ADvXUr`*xtPr5D04{SjKp5)qwXTgz-c{twg4hRj5GOd~e*r9>}R3vd0xC#&^m zPNhHCPw)R%_vr?~uFHK{mO>=DHnS`j7Z;b7CTCoPMg#D{dZNm%a{k!wPIbm8r^2Qa z8)S7DyExdfKY!!cpMURH{^WrQW6Vy0wO0;1>Iifr^Yim_bEBuWUWq$L{a$;4Yi_*H3~Omy14}99pSo4f(s(?XOcoax z&%6XxEzn>?`9V@TtV4nM1Bh}tRPE`iG_!Tb%oR4Q|61EeSU1iwoPAg>=H})r!UJ~= z0PBmq=nch>b(BD-P}F%q)Sx5Sd5RIyU~{rz{nt2wu_7k#xnORJT=wli7S&NS5#NT1 z7#WH-7h>B9Z^;Y=EZxW0y^`lS%)ugZ`FWpom%8T0`|Q-Q$}qG!_obBOWIP_1WjUFY zOG`^+r$8_TF7Bc%y>WLgf+g{ zcyX~RYne_SRDDIu$pVg5nK+GRi!ozW_O%-} zSYpwbii>}_SV}2nZ80t_O-{QIkuhknzUr|rzjSPZ?1(~R*#mMcV%+Af)o7u^HWSh2 z-G0o{eRp1ClNH-=7%}nu!hE5!7DuDeH@6`&c4Pr2LU?t&p1;CljM`j8r?ymjV)}qK zQ?Xf9s*Oolq`fkexD)H+H>EH}Z1aYRnG0fKE~qIRtNxvvo5MXlk}qhmgEFiWYAQV% zlidg;?`!$2Md!#dCFuJYWB1?rbxLF@G7~M#FKF_#^MvW6ZRJW7jsgp*#xaf=8p#w|2l#JYpsyY6@m}J?Am@QSr4cDZV}o z=p#3{PZXp?d0=K&_3ojbC3t2P#y0MHL%)|EiBwO2W+tYE`FUcc;0hj%M!2U(sAa%& zZ-GUeRZg*Cq-`g@P3ipl+=wG{KxQ>sRwujRN7a@q&o|WK)z{xkO}x2c6RYHUm8e*j zWx2Gp^amG!QCxX%;<+CJV9UYSW=Gt=JtINy4@k98oU&{>lm@_w$dwoTp2664_f+H7 zHECaAtm#==PRepT9-n?88hF45>ytcpxwjRQ1by75!!jMIyu_)?Hvczt@L=A!(-c8J zaQC(Ko}yrz@u>Py@!V*H8www+cdv{o5Qsy6nA#Zck{Om&TY+Y5OM5^&T0JH`Y?pzB zg$2zfR9GgzzLpvz zk*w`n6!nB!gvH>44aHV;bt-OSx;d#ODa^D!GP5JdHUPGJ0@=Y2>@XPHc+a(MF7U#_ zg3GBY3NDJ#{#{q$_Q411mv|-i!ZA7g%mOn9PS-baW{lM*dW_wBT|;;TzN2-m~z5Rg$@X7ZMZ?V;l_M!OCO-o6s_Guo#=;qsG9jhBUK- z5nBqy;7KBoHQU>bNhM}fp45qpMNy1Kcq$It3nt=WlV>iCl$eQb#k_pAm2C$Bb}WXA zhQ&iMlQt%|U8$N&IgD-FbgOMFV1m!j?m^rcCSw0y`#i=zsCxmZ7!6Cf#fNqN)3lhjMS9vC&k8|;Rp3m;eSXzVbECj?Zu{6YX-7Brm4bo3ZxV!|DZV zCI;psVMnG#T0jSTu~uTZn}gYO?3vokj-tTh0UvA-ju>+s3e&72$7#H#K|MR-Fl{s@-&G&cTxdgt zv0%M&;&VsNuVw$t}Dk~Wj(^qJ=-|H~;@a-z-7Gh%icV33u2NSV(;*{9= z2YxHvua|7pi>F|WyCY*sjInDokPe|~3z6D6v<1)2&EswYV8hU2jy$v&qd0-XA%r9M ztD8zpyIJbAoDyq$b`)H2!MJq?dBdN66MYd^RzAPgtnT{UPj%M-F+)~V>q80yASjG^ z2&af?kr-yLh&r_0>rPkaN;QV%+Dm?4f5`JLy;;gIjb&0!#*5=q&O`6SWy>4^Uq_xt z445D$ZsF7}bInFbLtqFK2{Drh)rYaLkTj<-g-#t|dvy%eCo(q}tG7%0VK`+d5{b0- zVqL=mfr&T_h}qGV%I!+^%~qq(*|}FK*KC@N>hctsnC^MxyGG4!xuZU!?L1W!&+bNF zHvp`E^7NN2)$#0aY5=(@%q9akYG^YP#*(S^_FRwT6yFgV3N(vzXo+(W07JIeQON#n zxOrg~R&~$KqpqjOn)Jmu&roF>ssqRtiP`FBjW1PNcK4RF6044^sE%iLUWU7gT*ThV zQ%;HP{|z=8%=eHoh0GL?5cRalE~f2LZ%FD6JCy5Hs%ASE^Jq@GY!eYbGDk~`)u|O> zG=pW*gKDd%tm}&93LQq$VzhrU&(Ul<7oj2cmPGlUT9q zm3q+!bg}e~hY$VR(%bdk8fzkn1mk*FaNL-S(Fo5BSj0hq%ZxZ7GVM1^qXFB{x0|KU zbmnl0^_tsbE@MCN?`v zLWNiZwHF>m73S~|m}#|L6a^j|l&kbop19B{v0vAuyjrl;l&nbl>C}936J$6zG_V1rO%`+i-s@>Al; zU5=M+hcg@e$il2;Rq|G1{TomecyeYE(DeOMWg=9w@NLFDR}NB>Okd^JtBm<}mtxcF zy%HGwIwL=LXYH!u>g(gPY4hzI7N(N%8p7tlI7|fJ^nOZK= zC17T+Ee|6RiFSokBz1kgP%U5o6;mX3&c!!LDP>ts%CekH#^dpcXQM(4CgNZeSb7p{ zYECSryfdFYA4SGY?xEG3b|X(=@tbjCcz6J?p`gn|kYo4CMwxR5Bu77_X4S^KIFyNxaj~xLgrC^>S&p&!OZY9c9hQ@Tb?5A{3-{e1*Cv>Cx$X_#2+tQ>LYZl)dhqaa? zW*!yj`#aS{#E(pGM$VGbGG0~bz0FV+_6jHzU9!HWnB%L9xLp=cA&(?sCAMB#WhLT1 zqFiNIj+kqjm?}z%Lc=i|!mM@>+2Ki1B#dIxqciH<6tTe#gAdl**JI~9H|!tAb^a7w zre?0J9T?k!s69Zp8?gQu+1>%sfLRWTt=%QW>o*%E_Sm*{T7$i~_e$JK_+SH~>eJnL zXF0}AybLuiuFrPVwAA2LP2yzkU^?nSVyIpLO+RRa`LwC@aV|#YHgdu`^j9;k9>?CH zw`GG4!y^QeV`w~ww*`ebPvOIC;paJ34JlZTOoxnEEQ;yUMsZC@8m#e(NX zBiu^(U;~PSxdt|l9pu~rlxzmLStLfz6lnTkwM&d1cZqC8X49!x+Er~pnk|j(XODC?VVo`1l{TgM z$AVva>U<6z%&M@^Bx+5tZtI49>B+xWr%L3fn(JBk*VX072d(>*KWhT*2AG#Gw# zdaA=J{X|3}5)DbIm)r3uZ1k0cnJi4KJ5nh(uhx7%{6(qcDKhM%7isW`X9*gtr?TrD zv--s+e=Q8`vORp`v?#?P8sdRsw=0>G5%u_G<{W`|hjqjDZeOP-IluZiMu!1lgE0|_ zA|BpYg$X!$Q;?IPt_+r9e6q1ub4+4=XaO@3B**YzCWgtVFjQH0)vl&FZ*3p8gZt_Z zy_JU3DW;{;t!G@;DL@csu2TeD@j?mFgtZY4` z8Y9YUVhuaVY}A)cLX2y`)?sfvPB0OBDm%|Mt6zBH*J64hCJ~h}*I1FMoQyVUu+z%3 z)}{);wJijg_>PU%4coC^;R_}r05&i;Oh5jqLX%XBDAi^oJ($IU(ABdX$_EC(0I)$p zj1pbxQ~j=e500S64C+{IQHj4PWKz@&zf1MC>g(0VFUM`OJ{YX#zDgaH3YmiK?39|P zXm>U9Q!3|)#mr){ZkCuVjdtit*x1q;!2{#;_}iqB$pxM$Xs|))uXti*WJ5;%vC}cJ z#u4K#b2L9^ww2o-{I*_weCPVW`ol^Dzy{}p`BW!sH9DBFPV_a!U7Wyg%6qdLT`oO$ zX)m~8F~Cqz(4W`#v&_Bu!sEYMJ?OewFR8MBmDyyP2xu52xpf=pVt1CLDxSqOdh2RO ziu;Iil>zB6qk(kS-kA1Cj@6^kCp1=IS%uRvRSZPp@<&lcifg?;^ zRvVkcYK_$9VTie)&+Vm_KM9xBTS7&QByd$X(F3Z?MbBk!Ur2j`vBF-n(gRhZg#P5s}_<6wJE4(TdGcMz8b|$zEtf4 z#J8U!BD&2IiBIfYPt9a9X2yMl4>la8J|^et$tDp$KP?@Dvn`@H#nJ1o1ZqEbM4ZuK z3MS$JnfkWVE^|!FlO7lw^Bbx~Zw6GEnAx;XHPdW$2uO|rD6uNPJ+#WGV^d8tjylVu zNo)^k^frZ_oSmoA?CWb2LX$VdY6aO-Yt9eJW ztjkr}kJQ%A)LVpZz2Ahw9^HC-8(-t*YIs3|4MTnDmBg0F+9RIT*C(yO5Fw{XXZ)wz=o>FD6Pj1(fyfSQ{^#?ShE+z!G@v3 zg5OoQ(T=td`3RWu%F-E+_IP(dG8z_MY%}gNr$CU&F$4+2Q@G_E%oc?JHvC5dXSxHa zhg5t(3>TRVKzOcTA`VA^c^-mOkze1L(2syU%!#seQ5gmSnIcJs0K`W-&<>vcd)2okf zzXNv(CgPxNMZ07nw{q{c{NDixNRFZL94R|Y66x^=VJS+KPA?f|P^a)y$7ETM91Xzm zJq!q6xe=8fO3h4`?q&orJD5bYc~c^H<&6G9#R^QsRbwtDcQDUltFbSCUfx?HpbUVm zaax2|$dTfe@ZJD0$Weq!$J5`P{C9*?14p9~?w9hxU@Q;90n=q8(F_#h5s4Y3l4_!% z8f!NWRYh+!IUzOGp+>Z*_Z5{oBI%DSM0l>C!3L+qGAu;T^(_Df8Ja?yhOK2j-aLB= zGz0)!lNMwIufyqh0d$7|Fl3AMzkxR8BEu5Lvbclam>Oqxy|rm-8a-!i+3!AmIqst% zlVeCa$|T`RVpkS1bwkA|!@}D3qcNUb0taP(3{0vd9xa%NgX1@379%ltkt4@FFj5i$ zu(b)*Y32TTY{PFm2th955G+J71& zDBwFF0?9EXo}+C`+O1`}ljoC6qU5h2xvn=vMC-5lr}|CKy69G-viYcjM++umALXij zX7$Ol{#)GpsT*IN;F5#D7tIhzpcJ(Ufr+>}wA*1n@=#78BKqX%n{i_RuvLkopii1U z@|}uDW^|lnwl}TPgrU6vuvNc0 z?8S4-%d+`u7Yqmkz*ZB|I<-|W?q(o40y+^*IK!*|ekdoMirQ=`h#l>N`x88LN* zwjF>>&6Y|qCykcGb5#Qj-^36QrqejYs2!OpwCpK+$)tujoo0{GG)dYI3rE68go!vX z+fceqvQ*SdI#DY#7tq#;BZ8x3L zlpj+bJ7UYo? zy)X{dBi>qyVhS95Hemn&2{uVYK~yh0m^(8uEJsRA@v72t_jQIsJmZ`jiDPu{(+4k-Y zsB%ZPb^esDPcb&+Obvs>iCw{fibR}DkSC=8hM${WJ70=4l#m@Ldd!MwBTz+`Z60De zr9)a9GYWf2_r#Xu#}yKhkAH469x9lKLs4R;$&(nPP|r|K6^W(Nres-fI#1D#oLSv@+MkJ145TVVRB^Ke*GPg@ zNH)4GQLtIe)tn!tG*WbAb&yheqhzZuNpl-sh3PG(xv!32=L6U+ zj6ZhDMm$l_U<1)#hS;zw%;c`8=PG+dh^Z!VA?)N9nlXrEEo>F3-?Q(6my9NHG^)i(BlZeK6=Rn25tsVA`S+{g)CktK_8RpqL^@j_mfN0h#l} z62)Tr^FaWxfx*oD^-sS<$|`J+K@ug(C*UMWZQ7;3Yzhek0PCCF@Pb+0`q}^Nab*ft zD1{$UQ8CJ>xR}n6jw6$JaSX?4XW!V;_n;6nJ{W#?`blu4tV1N{EVD%@ zR&3-4wMa^VW$73o3>s`e4%jl$MXFbZ)>QEj2C?r!_hyo^1sN0L5rPjk2nS3kGj*~n-mFy#=>cLs z>a4?G5{-puYyJ~7NUXcs*q6u>8f8z>V359;hX!fsN@mKiiMrQsDz0Ta4d~@~gr9BB zks%P<_n%BAxOecudMCG7`*7p&|2}~(N#|9>dy`qf$zF#JNJQB{b0v=6IQ`t44amy! zqbG01-Gl}kjER^=mqg=*5@w|`4s|j|M%S6QbU^MLIU8oESM7WuQ+zOdMg2gRn9<8V zB9`1CVXvAjtIADuO8^Oj#Nu71nW@;0*&fj?1yagnX$j8{OvK*Ft*@BX2R{ApB#H-5 zM;ApZ&V-XAZr>+vh#SiyuDg!NeK-8Rw-42a5|NLb{1EOYOvHf@9Em7b7rN~HJ$Jgl zyd=V7VOJa$OXqMX?Ij`;lrRHeL&2AS{8OzEQxRt(Z7piFBtp}a*lE<4ZD*gtscsNZ zPL^=%X7IuA9UNJ?&Dw|e|FeH<2foJb(}J3d>sWM7z4pe^-Ev$6EVP2tO+RXE-52qP zx5ode-n9M+E&c;M)X52ZQI0D`bRpVWv^l&-_@i|$`aNgOvGW>hh!V^imM{d zpv%q<%b?5llS*LET}7*}O0KlO2M3=*s({&;t%*#I67&Xqu-?9If6c&5_VYCte89Ri)(6v$nJ?F}yPA|= zwb6{mbbAemOm38(nJyx7naxUm@mm{8DRC>|gY{SVRH>9$CD&f~8`Z+yJKnVwClt>{ zk$9xn3?YE&n_WJ=nWFBm@WIc3KU~i3zU5Kq`y(x8)}pD&GDjpOcXseWV)+*s*?w zLX@y2LCWKqfd(4}%w|E_O_%;oedNPGrViFV)f*@8o2diR5wH-VM%!KhY)v5Tmalv$ zIC7hRGy}UKndq~xXb!w#gh1(<%nSj*R-Nfs(+rm%6HeUtb|MJfrMu#z#I|cA3aMBa zO>{`YH|@dK*GKurxd+oP_ofGaD3U9Q7KsX4Y=ikW6{^nYt^V77*D3lfZpH(%Jb>-S z_tkHtop-36sjs{D2P9E5MaRyoCW~dm&_A;N#Q17AT2JEFu|BWAQ0rfx~e{~wgRUwm=?I6ZP?HQ z3(aHwduY)6UidQbgAu20`WOU)w*Nb6(r!UHflUVdeXY9;({v2XvT{-W(mKG_HT+!@ zJjT=A-N6G7!gxE_;vMXH{G9Pvo_qJTbdAHIS3#gl-1k*g44zD^TLv0D?EI9=r|=Xv zrxj*mb^l7z9=u|7tbpfk?Y#ojioP<1%aR1o%i*|K8Z6Y5SDVZ$a(A_^y!$ZprHn7W}*bZOQA&lD^8$J~4GhU_osrWI|5t zhRuRMnoSq<`v}*XrEOcCKWHT|7@{FvAw7iCgN=!vvwM zhx3Bo^q)CDs-<%OJXjmI6I{*kLAn2|Pua?KO=F>}7cVtW@VSY%WXe`MGC-dXr5j@VZ7YLL;@G>LAZ+A(r!J-MjJUBS0 z@9F88F_UagExB^b=wvI68Ww&#|7DZtn_jhseVyI+(o;`v@bgEKe=B^<%$$$&nHIWn zgP>7xhgxcoKhQPro%ulE`PW)A(ZtzNMti0KJv=FPrn9sz+Up-K~xSXJ~3%EW|#)~mUN1-1MEGzKGjxF*(` zM+!WU%>15t+ldx*b{zWN{fw`2N#g`oSovik4%nly_&hq~}k>FcgwERg3;Cd(pp z>C&H&6H4=(U#LDfR1ZlNkHF~}*oNo{RThUso3^ zn2sZA>+qzu7HK@&e;c(|W!H&1*(4_>Lcf?CC_T%Bk&hmXCOj-=TX-qhoi6I?;n5U) z{6Ud=TPH_hORwZpmWu+K3dRe=htSx!zXI|H)OX^O&yKsJS-7D^)P~24+Szi36=OvO z1;HmA;?HOTr95omyw|gf zGG8c{b5FkAQsCN%T#P7NjI#<@E+8t2`?7F(_LnfrNqO|E2xWMUwWKsZ$gY0s5(ip@$1Qh#`M;Y(Y|1sLkyr4KT9G`5P}Ej?^dj-4B_ECVo)G6 zOIUOHDoa7t#2H=b^W%9%9ER(i#2_99{3L5s$!UGyRWWPmIoe-8s&M0yf0y*8kvxY} z)sh_77?<%fuIzI=*IjRsM-JqoW?07GpPE$BmRYm3Kf+N_Hj=IPxc9^`!6M%};)#Xy zUG_Guw8@#vZpPQH5pA879wZFado4g1L6sy@QJKDqxVT^qMy$%(v2@d}aw3US+D8A< z?!iXh)da^B4B<^oz8AQ|fgCgT!!0@Mg1&xOg?Mteij9p9r*Pf9QJGqao`I%~@RK}S zeL>?a2`hGy_(U`H2*Gepc55oTZk>I6Gf3f@Frts5{5Jx1} zIWa@uo9no}I=4zE^BY73sejn$=7tqMpIVIkztDC8@R3I{^9cyhf?Ql&+-?%P=gq1} z3Dc`DZ#yLxD2euduPGS+C#PZ-GQMjja@nZB{k7+UI;exWb0AQCLj!=(3X6vAg`O;I z1zF5SgXb0&iv=?>%Hn>7sqzkBk;WBPmLJ^4cNSSASjm-v2Y=@0=K--9869m>hmH&n z8yFY_?Tr`%OoQ^@o&#tZ-o0gwvs$}LBGt3GnsKG2k|zCP<}dq%xG@$F*7k$OA1AkW${a_5u3kS33$2F z&EI5Ie{vK=)l)M=%-!AHP&nJF@?sX`x}j~_>G<{#Yd-@lJwUWvSLHD+oecg4^^I4#4F z^zHV!jp=4Apr}XP2Od$oxJbo!=nJs{b^tI4P%v1x*g#KDPgPTM z=bCb-iJ{^A>?}s%V`*OA@9p_+z#<|!m;*>w6=Rp(aq#AVy%mYv*V~QTEs9B{lEEHV zDmVLuFKJe9Q}y;!_FkO<-SDogtXA@JHJpn}8`YvA#FolZ`DSR@rS6rGW`X|D$E@IA zBVjULGwrSwBu58baq)@_>ySghq5$Pl?`od`?1|>ixGhvs8(sP5h z8JA!2@$ios*EcOYW3TpbQSBzbVY-?<6 z3=0eU^hs`&@MpStdTcBsh8{&dd2DSxotk=S)ptN3bZK{aXk=vM%9ShAq102q>EMGN z>1nvU@7iK+C@Nrg>8f?mZyc&_-8EB`t~!w%^0mY>6?d^fW0ANGHF^=2A8Df?$o}L?PYkX~bIyySA1a>yI+Mq-4=+QuvfpCCn z_U|iaS+*TX2SRUEpL+7i{I=>$&UHlzaf7|O4EN>SBKGRPr`Nd|)bu%Kh#oh@VyDkC z-N)M7RU3Zs>hZXCwOu%jptNz+rXzSxSqE7Vr>vitfPn!r2F=_H5xK&uYq3xZLz+L5 zd#l3v-}RUpmwqd7^!HU*X61jJvJu*9ZlV|%Qm~&0DSw_~+MP__Ba6ghR_*Dwhxz&WE1Hgk39UFk zzfOs=&z~t|GNxz<@YbM~H+SO|6ck)sU9-h2B_Q=>>MTVRh9hpvuj_3y;~ztT3VW!+-3bA^J70hZZ|=4!n&mj!BJTG_Uawk_w=H| z!X;HzDJOGyvIj=_M%Vd_c|VQc;BE$91GIKSFJIvjfQR9rnh zLl?9C0DrEis0akpm!s&aC{)A$swM@Y-nqmFtM%Vmn4gZ}Zy)ni=Wo z=>dU(EFNEh@+|ff`T6*8GVtyG$TQ3JA60~R z)`@@Vx&(P;Al&o)yS-#)Q&Ur^Q8}-vrfR3_7phM&g$Y6w&S#v;;S+$K^#wcLF-Vs04hdWw{Y2 za}+=oEiKAV?ExK~^KL*O5c_?3XYo&q%_ln>1Qh0J80~M$)&lZ$a&mIxULqcke>bwS zvf`pyqXEpO-VG6<kUfvuKO}{wHHFXIeU}EwkaDycH{HuilVL@(@m{3peKGo>*|)&tHNn!;mEQ` z6g8`TS6B!S!;jM;L(BM&p3~Y|TKuPP zV`9MJ$`V*D)W5)A6$D#EqQj9`bwbpBx0vu@Vp{c|*4 e;8uq%>N6gJwkGzYG~oXv(EYpGs_)S@PyYvEd?nKW literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/pipe.png b/doc/salome/gui/GEOM/images/pipe.png old mode 100755 new mode 100644 index c1b77a98068b67449c3f42718c8834e3231911d5..a02cc341d1ac7446ecd7e9cad48815b28681bfb0 GIT binary patch literal 26947 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

kvA48kxjj+)Oyr{@tvmPgH?-uMh4N7k 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 literal 20855 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 z�)V=IznGJdHvEQc}|4YC~T8jger8J~?Vfj&6qCvB9B2$JdBiwd!h1&&c61(G4zC zPjDF+7=c{cjtV9p`fJxYhL762u12URKi7qieHgB=yZbxz zcScrDLp>_mmRg;O@ya)c4Xv^uYZ0_$oW+-;$Ty;CYqmvszT9#~RLYcL@%1=9Qi^h2 zDw40US$G=ppfg@r+k_m1lH_a&mEgJJ^a+4*)lM6u#WJ^u1DlW@@aj{Sf_3v?i794+ zHuv)*L)Y?Y8A!LfgCkfMJHi)UsI`QURM8) zuCAvh(db` zS||vpB!HtAVIbf+j+3#eo;3NsPuOJ&x_2ovm@3ZWII^RDdiN_oa6D3gWgA&o%R;o zBEDFpm+0x~i}zv$UGBZ=h<*dp#}eV~yT!ud16*ixT+%u_EJ(zIi7F?>6&ztW>qzMc zCVcddxZ5qnMMR_))r5qEsFqvb1o9VoXll>*@{#jvHZvo5Oa|))2TP>2{5uP0O9$PO zSg5eZmfiQ5Z6{ay7_mpRN1UcSaf(4BXaui*X4ErfDu~*!?@ND{e*@M7vI!7uNd7~1 z^HW0aQA&2zyhZw(r|jI^--`^|m6|h8-v4;X&ch>tHj9HKJYil@#8HNN{Ai`s9_5s@}RH-9zteL>qb&wet$Y8#{G#V)pWYI$qKydHQc9rp%Q ze72#PQ=_x$-J|VC8PCoSGx#2@5H=St!YR+B;Yw_pJ$M zVX#8G*sse4_S=DDl9`8Dd)$HCT+rN*wntNXyqj8n2VCIP`I>sw+5Q;9Qz2P$CU|J- zp@hU0&=v5>$g((t^R`DlE{?iAn!yIkVLHqnym77ObXx|-2q9I zZ0aG>gxR%$?Cz(I-oAob+CYzXeBmK~mU$g``NLN|yrM5U4~Snun1Rih0Giz4Vsfb3 z0I7`01k>oR%GHtzZ9z;!=HqYDV*5iSZ8SGoWQ=rmQMd@{TMe2XFclP*yy2FsWkUr@ zGAYU}UsBohuwaHS$~CWN&aSDsneN~zE6Bp=Qk5~(o&AUE*m6Zr;+53Lnbb_wt!rJ6 z$tr3~l+*|3{8^S#DBp@wP?Zyq3NC7*m;W$wrCm^HPuO zDwXK$?7IjZ7zbqB4*NXyph{Cyla?R=7{tWw09IqoC<^0}a>irxostqcfzFcO?jzsU zMx#sIo`*il-7YzT=)L@T;fHs)b7$p#m81Gvdg&8&y-%f0ZoiC*ZyvO#Sq%9OicFnF z)c1m6)sXo+AdY{-5M_l&ml#WKj(q@VUZb&jQ~l`w0FDp$I*+eNga2`iZ0CwJ{-e$gDL<3?{KVwnb3R?fh?B((L66-igUt)dU6CFEeI{=B QJVk`G#8dG+QJuH{1qxRv1^@s6 literal 20513 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 I?TI)31;q0Wt^fc4 diff --git a/doc/salome/gui/GEOM/input/creating_complex_obj.doc b/doc/salome/gui/GEOM/input/creating_complex_obj.doc index 6630dfa72..1fbb1d6a2 100644 --- a/doc/salome/gui/GEOM/input/creating_complex_obj.doc +++ b/doc/salome/gui/GEOM/input/creating_complex_obj.doc @@ -3,23 +3,26 @@ \page create_complex_obj_page Creating Complex Objects New entity -> Generation sub-menu allows creating new geometric -objects by modification and multiplication of the existing objects: +objects by modification and multiplication of the existing objects:

New entity -> Advanced sub-menu allows creating new geometric -objects using advanced algorithms: +objects using advanced algorithms:
  • \subpage create_smoothingsurface_page "Smoothing surface" from a diff --git a/doc/salome/gui/GEOM/input/creating_extrusion_alongpath.doc b/doc/salome/gui/GEOM/input/creating_extrusion_alongpath.doc index 8c5430232..078089362 100644 --- a/doc/salome/gui/GEOM/input/creating_extrusion_alongpath.doc +++ b/doc/salome/gui/GEOM/input/creating_extrusion_alongpath.doc @@ -14,13 +14,17 @@ is created so that the angle between the normal vector to the base shape and the tangent to the path wire remains constant at any point of the given path. \n Select unpublished edges checkbox - if checked, allows to select an edge of any other shape as the path object. +\n Generate groups checkbox - if checked allows to create groups of +sub-shapes. For more details on groups creation please refer to +\ref create_groups_page "this description". \n The \b Result of the operation will be a GEOM_Object (edge, face, shell, solid or compsolid). -\n TUI Command: geompy.MakePipe(baseShape, pathShape) +\n TUI Command: geompy.MakePipe(baseShape, pathShape, + IsGenerateGroups=False) \n Arguments: Name + 1 shape (vertex, edge, planar wire, face or shell) serving as base object + 1 shape (edge or wire) for -definition of the path. +definition of the path + 1 boolean parameter (IsGenerateGroups). \n Advanced options \ref preview_anchor "Preview" \image html pipe.png @@ -39,14 +43,19 @@ wire). to preserve the constant angle between the normal vector to the base shape and the BiNormal vector given as the third argument. \n Select unpublished edges checkbox - if checked, allows to select an edge of any other shape as the path object. +\n Generate groups checkbox - if checked allows to create groups of +sub-shapes. For more details on groups creation please refer to +\ref create_groups_page "this description". \n The \b Result of the operation will be a GEOM_Object (edge, face, shell, solid or compsolid). -\n TUI Command: geompy.MakePipeBiNormalAlongVector(baseShape, pathShape, binormalShape) +\n TUI Command: geompy.MakePipeBiNormalAlongVector(baseShape, pathShape, binormalShape, + IsGenerateGroups=False) \n Arguments: Name + 1 shape (edge, planar wire or face) serving as base object + 1 shape (edge or wire) for definition of the path + 1 shape (edge or wire) to set a fixed -BiNormal direction to perform the extrusion. +BiNormal direction to perform the extrusion + 1 boolean parameter +(IsGenerateGroups). \image html pipe2.png @@ -64,13 +73,17 @@ Additional controls: - If With correction is checked, the section is rotated to be orthogonal to the spine tangent in the corresponding point. +Generate groups checkbox - if checked allows to create groups of +sub-shapes. For more details on groups creation please refer to +\ref create_groups_page "this description". \n The \b Result of the operation will be a shell or a solid. -\n TUI Command: geompy.MakePipeWithDifferentSections(baseShape, locations, pathShape, withContact, withCorrection) +\n TUI Command: geompy.MakePipeWithDifferentSections(baseShape, locations, pathShape, withContact, withCorrection, + IsGenerateGroups=False) \n Arguments: Name + list of shapes (edges, planar wires, faces or shells) serving as base object + list of locations (vertices) on the path corresponding specified list of the shapes + 1 shape (edge or wire) for definition of the path + -2 Boolean parameters (withContact, withCorrection). +3 Boolean parameters (withContact, withCorrection, IsGenerateGroups). \n Advanced options \ref preview_anchor "Preview" \image html pipe3.png diff --git a/doc/salome/gui/GEOM/input/creating_groups.doc b/doc/salome/gui/GEOM/input/creating_groups.doc new file mode 100644 index 000000000..c86b804e0 --- /dev/null +++ b/doc/salome/gui/GEOM/input/creating_groups.doc @@ -0,0 +1,76 @@ +/*! + +\page create_groups_page Generation of Groups + +This option is available in some dialogs. To activate it please check +Generate Groups check box. When it is checked, it is possible to define +the prefix for generated groups names using Group Names Prefix input +field. + +\image html gen_group_dlg.png "Generate groups option in a dialog" + +The groups are created along with the result of the operation when +\b Apply or Apply and Close button is clicked. Each generated group +represents a set of sub-shapes of the result that satisfies certain conditions. +The groups of the following types can be generated: + - \b Down - sub-shapes starting the result, e.g. bottom lid +for the pipe creation operation. + - \b Up - sub-shapes ending the result, e.g. top lid +for the pipe creation operation. + - \b Side1, \b Side2 - sub-shapes corresponding to each side +of the result. + - \b Other - faces generated from the bounding edges of +\b Down group. + +The groups are named according to the following naming rule: +If Group Names Prefix is set _, otherwise +the name is \b . The following figure shows group names created with +the prefix \b Group: + +\image html gen_group_tree.png "Group_Down, Group_Up, Group_Side1 and Group_Side2 are generated" + + +The general behavior of this functionality is the following: +
      +
    • If Generate Groups option is not set, the groups are not generated.
    • +
    • If starting and ending sub-shapes of the result are the same, e.g. if there is +a closed path for pipe construction, Generate Groups option is disabled +in the dialog box:
    • + +\image html gen_group_disabled.png "Disabled option in the Pipe Construction dialog if the path is closed" +\n +
    • Otherwise If the path is not closed edge/wire, the groups are created depending +on the profile:
    • +
        +
      • Profile is unclosed edge or wire: \b Down, \b Up, \b Side1, \b Side2:
      • + +\image html gen_group_sides.png "Pipe with created groups Down(Red), Up(Green), Side1(Blue) and Side2(Yellow)" +\n +
      • Profile is closed edge or wire, face or shell: \b Down, \b Up, \b Other:
      • + +\image html gen_group_other.png "Created groups Down(Red), Up(Green) and Other(Yellow)" +
      +
    + +\b Down and \b Up groups contain: +- Edges if the profile is edge or wire; +- Faces if the profile is face or shell. + +\b Side1 and \b Side2 groups contain edges generated from the first and +last vertices of the profile edge or wire correspondingly. The first and +last vertices are determined taking into account edge/wire orientation. + +\b Other group represents faces generated from the bounding edges of profile. + +The behavior in TUI is the following: +- Each Python function that supports groups generation has a flag +\b IsGenerateGroups which is equal to \b False by default. +- If \b IsGenerateGroups is not set the groups are not created; the returned +value is GEOM_Object that represents a result of the operation. +- If \b IsGenerateGroups is set the operation returns a list of GEOM_Object. +Its first element is a result, the remaining ones are the groups in the order: +\b Down, \b Up, \b Side1, \b Side2 for opened profile or \b Down, \b Up, +\b Other for closed profile. +- If \b IsGenerateGroups is set and the path is closed an error occurs. + +*/ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 42d188d54..f63819e97 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -1726,9 +1726,16 @@ module GEOM * the path shape. The path shape can be a wire or an edge. * \param theBase Base shape to be extruded. * \param thePath Path shape to extrude the base shape along it. - * \return New GEOM_Object, containing the created pipe. + * \param IsGenerateGroups flag that tells if it is necessary to + * return groups (true) or not (false). + * \return The list of objects. The first one is a result pipe, + * the other ones are the created groups. If \a IsGenerateGroups + * is not set the returned list contains a single object, which + * is the operation result. */ - GEOM_Object MakePipe (in GEOM_Object theBase, in GEOM_Object thePath); + ListOfGO MakePipe (in GEOM_Object theBase, + in GEOM_Object thePath, + in boolean IsGenerateGroups); /*! * \brief Create a shape by revolution of the base shape around the axis @@ -1796,13 +1803,19 @@ module GEOM * contact with the spine. * \param theWithCorrection - defining that the section is rotated to be * orthogonal to the spine tangent in the correspondent point - * \return New GEOM_Object, containing the created pipe. + * \param IsGenerateGroups flag that tells if it is necessary to + * return groups (true) or not (false). + * \return The list of objects. The first one is a result pipe, + * the other ones are the created groups. If \a IsGenerateGroups + * is not set the returned list contains a single object, which + * is the operation result. */ - GEOM_Object MakePipeWithDifferentSections (in ListOfGO theSeqBases, - in ListOfGO theLocations, - in GEOM_Object thePath, - in boolean theWithContact , - in boolean theWithCorrection ); + ListOfGO MakePipeWithDifferentSections (in ListOfGO theSeqBases, + in ListOfGO theLocations, + in GEOM_Object thePath, + in boolean theWithContact , + in boolean theWithCorrection, + in boolean IsGenerateGroups); /*! * \brief Create a shape by extrusion of the profile shape along @@ -1820,23 +1833,35 @@ module GEOM * contact with the spine. * \param theWithCorrection - defining that the section is rotated to be * orthogonal to the spine tangent in the correspondent point - * \return New GEOM_Object, containing the created pipe. - */ - GEOM_Object MakePipeWithShellSections (in ListOfGO theSeqBases, - in ListOfGO theSeqSubBases, - in ListOfGO theLocations, - in GEOM_Object thePath, - in boolean theWithContact , - in boolean theWithCorrection ); + * \param IsGenerateGroups flag that tells if it is necessary to + * return groups (true) or not (false). + * \return The list of objects. The first one is a result pipe, + * the other ones are the created groups. If \a IsGenerateGroups + * is not set the returned list contains a single object, which + * is the operation result. + */ + ListOfGO MakePipeWithShellSections (in ListOfGO theSeqBases, + in ListOfGO theSeqSubBases, + in ListOfGO theLocations, + in GEOM_Object thePath, + in boolean theWithContact, + in boolean theWithCorrection, + in boolean IsGenerateGroups); /*! * \brief Create solids between given sections * \param theSeqBases - list of sections (shell or face). * \param theLocations - list of corresponding vertexes - * \return New GEOM_Object, containing the created solids. + * \param IsGenerateGroups flag that tells if it is necessary to + * return groups (true) or not (false). + * \return The list of objects. The first one is a result pipe, + * the other ones are the created groups. If \a IsGenerateGroups + * is not set the returned list contains a single object, which + * is the operation result. */ - GEOM_Object MakePipeShellsWithoutPath (in ListOfGO theSeqBases, - in ListOfGO theLocations); + ListOfGO MakePipeShellsWithoutPath (in ListOfGO theSeqBases, + in ListOfGO theLocations, + in boolean IsGenerateGroups); /*! * \brief Create a shape by extrusion of the base shape along @@ -1848,11 +1873,17 @@ module GEOM * \param theVec Vector defines a constant binormal direction to keep the * same angle beetween the Direction and the sections * along the sweep surface. - * \return New GEOM_Object, containing the created pipe. - */ - GEOM_Object MakePipeBiNormalAlongVector (in GEOM_Object theBase, - in GEOM_Object thePath, - in GEOM_Object theVec); + * \param IsGenerateGroups flag that tells if it is necessary to + * return groups (true) or not (false). + * \return The list of objects. The first one is a result pipe, + * the other ones are the created groups. If \a IsGenerateGroups + * is not set the returned list contains a single object, which + * is the operation result. + */ + ListOfGO MakePipeBiNormalAlongVector (in GEOM_Object theBase, + in GEOM_Object thePath, + in GEOM_Object theVec, + in boolean IsGenerateGroups); /*! diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 5142eb365..c1e7addb1 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -1412,6 +1412,14 @@ Please, select face, shell or solid and try again GEOM_SELECT_UNPUBLISHED_EDGES Select unpublished edges + + GEOM_GENERATE_GROUPS + Generate Groups + + + GEOM_GROUP_NAME_PREFIX + Group Names Prefix + GEOM_PLANE Plane @@ -2420,6 +2428,26 @@ Please, select face, shell or solid and try again WRN_NULL_OBJECT_OR_SHAPE Shape %1 for solid creation is null + + GROUP_DOWN + Down + + + GROUP_UP + Up + + + GROUP_SIDE1 + Side1 + + + GROUP_SIDE2 + Side2 + + + GROUP_OTHER + Other + GEOM_X X : diff --git a/src/GEOMImpl/GEOMImpl_GlueDriver.cxx b/src/GEOMImpl/GEOMImpl_GlueDriver.cxx index 3e5ed2b83..42c064f74 100644 --- a/src/GEOMImpl/GEOMImpl_GlueDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_GlueDriver.cxx @@ -323,9 +323,11 @@ TopoDS_Shape GEOMImpl_GlueDriver::GlueFacesByList (const TopoDS_Shape& theShape, //function : GlueFaces //purpose : //======================================================================= -TopoDS_Shape GEOMImpl_GlueDriver::GlueFaces (const TopoDS_Shape& theShape, - const Standard_Real theTolerance, - const Standard_Boolean doKeepNonSolids) +TopoDS_Shape GEOMImpl_GlueDriver::GlueFaces + (const TopoDS_Shape &theShape, + const Standard_Real theTolerance, + const Standard_Boolean doKeepNonSolids, + TopTools_DataMapOfShapeListOfShape *pMapModif) { TopoDS_Shape aRes; @@ -409,6 +411,26 @@ TopoDS_Shape GEOMImpl_GlueDriver::GlueFaces (const TopoDS_Shape& theShape, // 5. Result aRes = aGA.Shape(); + if (pMapModif) { + // Fill the map of modified shapes. + TopTools_IndexedMapOfShape aMapSubShapes; + + TopExp::MapShapes(theShape, aMapSubShapes); + pMapModif->Clear(); + + const Standard_Integer aNbShapes = aMapSubShapes.Extent(); + Standard_Integer i; + + for (i = 1; i <= aNbShapes; ++i) { + const TopoDS_Shape &aSubShape = aMapSubShapes.FindKey(i); + const TopTools_ListOfShape &aModif = aGA.Modified(aSubShape); + + if (!aModif.IsEmpty()) { + pMapModif->Bind(aSubShape, aModif); + } + } + } + return aRes; } diff --git a/src/GEOMImpl/GEOMImpl_GlueDriver.hxx b/src/GEOMImpl/GEOMImpl_GlueDriver.hxx index 2339100b0..7ebcbad8e 100644 --- a/src/GEOMImpl/GEOMImpl_GlueDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_GlueDriver.hxx @@ -63,6 +63,7 @@ #include class TColStd_SequenceOfExtendedString; +class TopTools_DataMapOfShapeListOfShape; #include "GEOM_BaseDriver.hxx" @@ -86,9 +87,11 @@ Standard_EXPORT ~GEOMImpl_GlueDriver() {}; bool GetCreationInformation(std::string& theOperationName, std::vector& params); -Standard_EXPORT static TopoDS_Shape GlueFaces (const TopoDS_Shape& theShape, - const Standard_Real theTolerance, - const Standard_Boolean doKeepNonSolids = Standard_True); +Standard_EXPORT static TopoDS_Shape GlueFaces + (const TopoDS_Shape &theShape, + const Standard_Real theTolerance, + const Standard_Boolean doKeepNonSolids = Standard_True, + TopTools_DataMapOfShapeListOfShape *pMapModif = NULL); /* Standard_EXPORT TopoDS_Shape GlueFacesWithWarnings (const TopoDS_Shape& theShape, const Standard_Real theTolerance, diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index eb9eb15aa..017447071 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -61,6 +61,7 @@ #include #include #include +#include #include #include #include @@ -75,6 +76,8 @@ #include #include +#include +#include #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC @@ -88,6 +91,7 @@ GEOMImpl_I3DPrimOperations::GEOMImpl_I3DPrimOperations (GEOM_Engine* theEngine, : GEOM_IOperations(theEngine, theDocID) { MESSAGE("GEOMImpl_I3DPrimOperations::GEOMImpl_I3DPrimOperations"); + myGroupOperations = new GEOMImpl_IGroupOperations(GetEngine(), GetDocID()); } //============================================================================= @@ -98,6 +102,7 @@ GEOMImpl_I3DPrimOperations::GEOMImpl_I3DPrimOperations (GEOM_Engine* theEngine, GEOMImpl_I3DPrimOperations::~GEOMImpl_I3DPrimOperations() { MESSAGE("GEOMImpl_I3DPrimOperations::~GEOMImpl_I3DPrimOperations"); + delete myGroupOperations; } @@ -1451,8 +1456,10 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeDraftPrism * MakePipe */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipe (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) thePath) +Handle(TColStd_HSequenceOfTransient) GEOMImpl_I3DPrimOperations::MakePipe + (const Handle(GEOM_Object) &theBase, + const Handle(GEOM_Object) &thePath, + const bool IsGenerateGroups) { SetErrorCode(KO); @@ -1478,6 +1485,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipe (Handle(GEOM_Object) th aCI.SetBase(aRefBase); aCI.SetPath(aRefPath); + aCI.SetGenerateGroups(IsGenerateGroups); //Compute the Pipe value try { @@ -1493,12 +1501,31 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipe (Handle(GEOM_Object) th return NULL; } + // Create the sequence of objects. + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + aSeq->Append(aPipe); + createGroups(aPipe, &aCI, aSeq); + //Make a Python command - GEOM::TPythonDump(aFunction) << aPipe << " = geompy.MakePipe(" - << theBase << ", " << thePath << ")"; + GEOM::TPythonDump pyDump(aFunction); + + if (IsGenerateGroups) { + pyDump << aSeq; + } else { + pyDump << aPipe; + } + + pyDump << " = geompy.MakePipe(" << theBase << ", " << thePath; + + if (IsGenerateGroups) { + pyDump << ", True"; + } + + pyDump << ")"; SetErrorCode(OK); - return aPipe; + return aSeq; } @@ -1794,22 +1821,23 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThruSections( * MakePipeWithDifferentSections */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( - const Handle(TColStd_HSequenceOfTransient)& theBases, - const Handle(TColStd_HSequenceOfTransient)& theLocations, - const Handle(GEOM_Object)& thePath, - bool theWithContact, - bool theWithCorrections) +Handle(TColStd_HSequenceOfTransient) + GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections + (const Handle(TColStd_HSequenceOfTransient) &theBases, + const Handle(TColStd_HSequenceOfTransient) &theLocations, + const Handle(GEOM_Object) &thePath, + const bool theWithContact, + const bool theWithCorrections, + const bool IsGenerateGroups) { - Handle(GEOM_Object) anObj; SetErrorCode(KO); if(theBases.IsNull()) - return anObj; + return NULL; Standard_Integer nbBases = theBases->Length(); if (!nbBases) - return anObj; + return NULL; Standard_Integer nbLocs = (theLocations.IsNull() ? 0 :theLocations->Length()); //Add a new Pipe object @@ -1819,16 +1847,16 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( Handle(GEOM_Function) aFunction = aPipeDS->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_DIFFERENT_SECTIONS); - if (aFunction.IsNull()) return anObj; + if (aFunction.IsNull()) return NULL; //Check if the function is set correctly - if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return anObj; + if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return NULL; GEOMImpl_IPipeDiffSect aCI (aFunction); Handle(GEOM_Function) aRefPath = thePath->GetLastFunction(); if(aRefPath.IsNull()) - return anObj; + return NULL; Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient; Handle(TColStd_HSequenceOfTransient) aSeqLocs = new TColStd_HSequenceOfTransient; @@ -1864,31 +1892,45 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( } if(!aSeqBases->Length()) - return anObj; + return NULL; aCI.SetBases(aSeqBases); aCI.SetLocations(aSeqLocs); aCI.SetPath(aRefPath); aCI.SetWithContactMode(theWithContact); aCI.SetWithCorrectionMode(theWithCorrections); + aCI.SetGenerateGroups(IsGenerateGroups); //Compute the Pipe value try { OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Pipe with defferent section driver failed"); - return anObj; + return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); - return anObj; + return NULL; } + // Create the sequence of objects. + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + aSeq->Append(aPipeDS); + createGroups(aPipeDS, &aCI, aSeq); + //Make a Python command GEOM::TPythonDump pyDump(aFunction); - pyDump << aPipeDS << " = geompy.MakePipeWithDifferentSections(["; + + if (IsGenerateGroups) { + pyDump << aSeq; + } else { + pyDump << aPipeDS; + } + + pyDump << " = geompy.MakePipeWithDifferentSections(["; for(i =1 ; i <= nbBases; i++) { @@ -1920,10 +1962,16 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( } } - pyDump<< "], "<Length(); if (!nbBases) - return anObj; + return NULL; Standard_Integer nbSubBases = (theSubBases.IsNull() ? 0 :theSubBases->Length()); @@ -1961,17 +2010,17 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections( Handle(GEOM_Function) aFunction = aPipeDS->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_SHELL_SECTIONS); - if (aFunction.IsNull()) return anObj; + if (aFunction.IsNull()) return NULL; //Check if the function is set correctly - if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return anObj; + if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return NULL; //GEOMImpl_IPipeDiffSect aCI (aFunction); GEOMImpl_IPipeShellSect aCI (aFunction); Handle(GEOM_Function) aRefPath = thePath->GetLastFunction(); if(aRefPath.IsNull()) - return anObj; + return NULL; Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient; Handle(TColStd_HSequenceOfTransient) aSeqSubBases = new TColStd_HSequenceOfTransient; @@ -2020,7 +2069,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections( } if(!aSeqBases->Length()) - return anObj; + return NULL; aCI.SetBases(aSeqBases); aCI.SetSubBases(aSeqSubBases); @@ -2028,24 +2077,38 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections( aCI.SetPath(aRefPath); aCI.SetWithContactMode(theWithContact); aCI.SetWithCorrectionMode(theWithCorrections); + aCI.SetGenerateGroups(IsGenerateGroups); //Compute the Pipe value try { OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Pipe with shell sections driver failed"); - return anObj; + return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); - return anObj; + return NULL; } + // Create the sequence of objects. + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + aSeq->Append(aPipeDS); + createGroups(aPipeDS, &aCI, aSeq); + //Make a Python command GEOM::TPythonDump pyDump(aFunction); - pyDump << aPipeDS << " = geompy.MakePipeWithShellSections(["; + + if (IsGenerateGroups) { + pyDump << aSeq; + } else { + pyDump << aPipeDS; + } + + pyDump << " = geompy.MakePipeWithShellSections(["; for(i =1 ; i <= nbBases; i++) { @@ -2093,10 +2156,16 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections( } } - pyDump<< "], "<Length(); if (!nbBases) - return anObj; + return NULL; Standard_Integer nbLocs = (theLocations.IsNull() ? 0 :theLocations->Length()); @@ -2129,10 +2199,10 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeShellsWithoutPath( Handle(GEOM_Function) aFunction = aPipeDS->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_SHELLS_WITHOUT_PATH); - if (aFunction.IsNull()) return anObj; + if (aFunction.IsNull()) return NULL; //Check if the function is set correctly - if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return anObj; + if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return NULL; GEOMImpl_IPipeShellSect aCI (aFunction); @@ -2169,28 +2239,42 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeShellsWithoutPath( } if(!aSeqBases->Length()) - return anObj; + return NULL; aCI.SetBases(aSeqBases); aCI.SetLocations(aSeqLocs); + aCI.SetGenerateGroups(IsGenerateGroups); //Compute the Pipe value try { OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Pipe with shell sections without path driver failed"); - return anObj; + return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); - return anObj; + return NULL; } + // Create the sequence of objects. + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + aSeq->Append(aPipeDS); + createGroups(aPipeDS, &aCI, aSeq); + //Make a Python command GEOM::TPythonDump pyDump(aFunction); - pyDump << aPipeDS << " = geompy.MakePipeShellsWithoutPath(["; + + if (IsGenerateGroups) { + pyDump << aSeq; + } else { + pyDump << aPipeDS; + } + + pyDump << " = geompy.MakePipeShellsWithoutPath(["; for(i =1 ; i <= nbBases; i++) { @@ -2222,10 +2306,16 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeShellsWithoutPath( } } - pyDump<< "])"; + pyDump<< "]"; + + if (IsGenerateGroups) { + pyDump << ", True"; + } + + pyDump << ")"; SetErrorCode(OK); - return aPipeDS; + return aSeq; } @@ -2234,9 +2324,12 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeShellsWithoutPath( * MakePipeBiNormalAlongVector */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeBiNormalAlongVector (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) thePath, - Handle(GEOM_Object) theVec) +Handle(TColStd_HSequenceOfTransient) + GEOMImpl_I3DPrimOperations::MakePipeBiNormalAlongVector + (const Handle(GEOM_Object) &theBase, + const Handle(GEOM_Object) &thePath, + const Handle(GEOM_Object) &theVec, + const bool IsGenerateGroups) { SetErrorCode(KO); @@ -2264,6 +2357,7 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeBiNormalAlongVector (Han aCI.SetBase(aRefBase); aCI.SetPath(aRefPath); aCI.SetVector(aRefVec); + aCI.SetGenerateGroups(IsGenerateGroups); //Compute the Pipe value try { @@ -2279,12 +2373,32 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeBiNormalAlongVector (Han return NULL; } + // Create the sequence of objects. + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + aSeq->Append(aPipe); + createGroups(aPipe, &aCI, aSeq); + //Make a Python command - GEOM::TPythonDump(aFunction) << aPipe << " = geompy.MakePipeBiNormalAlongVector(" - << theBase << ", " << thePath << ", " << theVec << ")"; + GEOM::TPythonDump pyDump(aFunction); + + if (IsGenerateGroups) { + pyDump << aSeq; + } else { + pyDump << aPipe; + } + + pyDump << " = geompy.MakePipeBiNormalAlongVector(" + << theBase << ", " << thePath << ", " << theVec; + + if (IsGenerateGroups) { + pyDump << ", True"; + } + + pyDump << ")"; SetErrorCode(OK); - return aPipe; + return aSeq; } //============================================================================= @@ -2546,3 +2660,122 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::RestorePath SetErrorCode(OK); return aPath; } + +//============================================================================= +/*! + * createGroup + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::createGroup + (const Handle(GEOM_Object) &theBaseObject, + const Handle(TColStd_HArray1OfInteger) &theGroupIDs, + const TCollection_AsciiString &theName, + const TopTools_IndexedMapOfShape &theIndices) +{ + if (theBaseObject.IsNull() || theGroupIDs.IsNull()) { + return NULL; + } + + // Get the Shape type. + const Standard_Integer anID = theGroupIDs->Value(theGroupIDs->Lower()); + const Standard_Integer aNbShapes = theIndices.Extent(); + + if (anID < 1 || anID > aNbShapes) { + return NULL; + } + + const TopoDS_Shape aSubShape = theIndices.FindKey(anID); + + if (aSubShape.IsNull()) { + return NULL; + } + + // Create a group. + const TopAbs_ShapeEnum aGroupType = aSubShape.ShapeType(); + Handle(GEOM_Object) aGroup = + myGroupOperations->CreateGroup(theBaseObject, aGroupType); + + if (aGroup.IsNull() == Standard_False) { + aGroup->GetLastFunction()->SetDescription(""); + aGroup->SetName(theName.ToCString()); + + Handle(TColStd_HSequenceOfInteger) aSeqIDs = new TColStd_HSequenceOfInteger; + Standard_Integer i; + + for (i = theGroupIDs->Lower(); i <= theGroupIDs->Upper(); ++i) { + // Get and check the index. + const Standard_Integer anIndex = theGroupIDs->Value(i); + + if (anIndex < 1 || anIndex > aNbShapes) { + return NULL; + } + + // Get and check the sub-shape. + const TopoDS_Shape aSubShape = theIndices.FindKey(anIndex); + + if (aSubShape.IsNull()) { + return NULL; + } + + // Check the shape type. + if (aSubShape.ShapeType() != aGroupType) { + return NULL; + } + + aSeqIDs->Append(anIndex); + } + + myGroupOperations->UnionIDs(aGroup, aSeqIDs); + aGroup->GetLastFunction()->SetDescription(""); + } + + return aGroup; +} + +//============================================================================= +/*! + * createGroups + */ +//============================================================================= +void GEOMImpl_I3DPrimOperations::createGroups + (const Handle(GEOM_Object) &theBaseObject, + GEOMImpl_IPipe *thePipe, + Handle(TColStd_HSequenceOfTransient) &theSequence) +{ + if (theBaseObject.IsNull() || thePipe == NULL || theSequence.IsNull()) { + return; + } + + TopoDS_Shape aShape = theBaseObject->GetValue(); + + if (aShape.IsNull()) { + return; + } + + TopTools_IndexedMapOfShape anIndices; + Handle(TColStd_HArray1OfInteger) aGroupIDs; + TopoDS_Shape aShapeType; + const Standard_Integer aNbGroups = 5; + Handle(GEOM_Object) aGrps[aNbGroups]; + Standard_Integer i; + + TopExp::MapShapes(aShape, anIndices); + + // Create groups. + aGroupIDs = thePipe->GetGroupDown(); + aGrps[0] = createGroup(theBaseObject, aGroupIDs, "GROUP_DOWN", anIndices); + aGroupIDs = thePipe->GetGroupUp(); + aGrps[1] = createGroup(theBaseObject, aGroupIDs, "GROUP_UP", anIndices); + aGroupIDs = thePipe->GetGroupSide1(); + aGrps[2] = createGroup(theBaseObject, aGroupIDs, "GROUP_SIDE1", anIndices); + aGroupIDs = thePipe->GetGroupSide2(); + aGrps[3] = createGroup(theBaseObject, aGroupIDs, "GROUP_SIDE2", anIndices); + aGroupIDs = thePipe->GetGroupOther(); + aGrps[4] = createGroup(theBaseObject, aGroupIDs, "GROUP_OTHER", anIndices); + + for (i = 0; i < aNbGroups; ++i) { + if (aGrps[i].IsNull() == Standard_False) { + theSequence->Append(aGrps[i]); + } + } +} diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx index 80c8ff4f8..a0ae56e37 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx @@ -30,6 +30,11 @@ #include #include +class GEOMImpl_IGroupOperations; +class GEOMImpl_IPipe; +class TopTools_IndexedMapOfShape; + + class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { public: Standard_EXPORT GEOMImpl_I3DPrimOperations(GEOM_Engine* theEngine, int theDocID); @@ -98,8 +103,10 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) MakeDraftPrism (Handle(GEOM_Object) theInitShape, Handle(GEOM_Object) theBase, double theHeight, double theAngle, bool theFuse, bool theInvert = false ); - Standard_EXPORT Handle(GEOM_Object) MakePipe (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) thePath); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipe + (const Handle(GEOM_Object) &theBase, + const Handle(GEOM_Object) &thePath, + const bool IsGenerateGroups); Standard_EXPORT Handle(GEOM_Object) MakeRevolutionAxisAngle (Handle(GEOM_Object) theBase, Handle(GEOM_Object) theAxis, @@ -121,28 +128,34 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { double thePreci, bool theRuled); - Standard_EXPORT Handle(GEOM_Object) MakePipeWithDifferentSections( - const Handle(TColStd_HSequenceOfTransient)& theBases, - const Handle(TColStd_HSequenceOfTransient)& theLocations, - const Handle(GEOM_Object)& thePath, - bool theWithContact, - bool theWithCorrections); - - Standard_EXPORT Handle(GEOM_Object) MakePipeWithShellSections( - const Handle(TColStd_HSequenceOfTransient)& theBases, - const Handle(TColStd_HSequenceOfTransient)& theSubBases, - const Handle(TColStd_HSequenceOfTransient)& theLocations, - const Handle(GEOM_Object)& thePath, - bool theWithContact, - bool theWithCorrections); - - Standard_EXPORT Handle(GEOM_Object) MakePipeShellsWithoutPath - (const Handle(TColStd_HSequenceOfTransient)& theBases, - const Handle(TColStd_HSequenceOfTransient)& theLocations); - - Standard_EXPORT Handle(GEOM_Object) MakePipeBiNormalAlongVector (Handle(GEOM_Object) theBase, - Handle(GEOM_Object) thePath, - Handle(GEOM_Object) theVec); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) + MakePipeWithDifferentSections + (const Handle(TColStd_HSequenceOfTransient) &theBases, + const Handle(TColStd_HSequenceOfTransient) &theLocations, + const Handle(GEOM_Object) &thePath, + const bool theWithContact, + const bool theWithCorrections, + const bool IsGenerateGroups); + + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeWithShellSections + (const Handle(TColStd_HSequenceOfTransient) &theBases, + const Handle(TColStd_HSequenceOfTransient) &theSubBases, + const Handle(TColStd_HSequenceOfTransient) &theLocations, + const Handle(GEOM_Object) &thePath, + const bool theWithContact, + const bool theWithCorrections, + const bool IsGenerateGroups); + + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeShellsWithoutPath + (const Handle(TColStd_HSequenceOfTransient) &theBases, + const Handle(TColStd_HSequenceOfTransient) &theLocations, + const bool IsGenerateGroups); + + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeBiNormalAlongVector + (const Handle(GEOM_Object) &theBase, + const Handle(GEOM_Object) &thePath, + const Handle(GEOM_Object) &theVec, + const bool IsGenerateGroups); Standard_EXPORT Handle(GEOM_Object) MakeThickening (Handle(GEOM_Object) theObject, @@ -158,6 +171,23 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) RestorePath (Handle(GEOM_Object) theShape, const Handle(TColStd_HSequenceOfTransient)& theBase1, const Handle(TColStd_HSequenceOfTransient)& theBase2); + +private: + + Handle(GEOM_Object) createGroup + (const Handle(GEOM_Object) &theBaseObject, + const Handle(TColStd_HArray1OfInteger) &theGroupIDs, + const TCollection_AsciiString &theName, + const TopTools_IndexedMapOfShape &theIndices); + + void createGroups(const Handle(GEOM_Object) &theBaseObject, + GEOMImpl_IPipe *thePipe, + Handle(TColStd_HSequenceOfTransient) &theSequence); + +private: + + GEOMImpl_IGroupOperations *myGroupOperations; + }; #endif diff --git a/src/GEOMImpl/GEOMImpl_IPipe.hxx b/src/GEOMImpl/GEOMImpl_IPipe.hxx index 22ace08b3..fc346c5f1 100644 --- a/src/GEOMImpl/GEOMImpl_IPipe.hxx +++ b/src/GEOMImpl/GEOMImpl_IPipe.hxx @@ -27,20 +27,69 @@ #include "GEOM_Function.hxx" -#define PIPE_ARG_BASE 1 -#define PIPE_ARG_PATH 2 +#include + +// ---- GEOMImpl_IPipe +#define PIPE_ARG_BASE 1 +#define PIPE_ARG_PATH 2 + +// ---- GEOMImpl_IPipeBiNormal +#define PIPE_ARG_VEC 3 + +// ---- GEOMImpl_IPipeDiffSect +#define PIPEDS_LIST_BASES 1 +//#define PIPEDS_ARG_PATH 2 +#define PIPEDS_LIST_LOCATIONS 3 +#define PIPEDS_ARG_WITHCONTACT 4 +#define PIPEDS_ARG_WITHCORRECT 5 + +// ---- GEOMImpl_IPipeShellSect +#define PIPEDS_LIST_SUBBASES 6 + +// ---- Generate groups block (common) +#define PIPE_GENERATE_GROUPS 7 +#define PIPE_GROUP_DOWN 8 +#define PIPE_GROUP_UP 9 +#define PIPE_GROUP_SIDE1 10 +#define PIPE_GROUP_SIDE2 11 +#define PIPE_GROUP_OTHER 12 + class GEOMImpl_IPipe { public: GEOMImpl_IPipe(Handle(GEOM_Function) theFunction): _func(theFunction) {} + virtual ~GEOMImpl_IPipe() {} void SetBase (Handle(GEOM_Function) theBase) { _func->SetReference(PIPE_ARG_BASE, theBase); } void SetPath (Handle(GEOM_Function) thePath) { _func->SetReference(PIPE_ARG_PATH, thePath); } + void SetGenerateGroups (int theGenerateGroups) + { _func->SetInteger(PIPE_GENERATE_GROUPS, theGenerateGroups); } + void SetGroupDown (const Handle(TColStd_HArray1OfInteger) &theGroup) + { _func->SetIntegerArray(PIPE_GROUP_DOWN, theGroup); } + void SetGroupUp (const Handle(TColStd_HArray1OfInteger) &theGroup) + { _func->SetIntegerArray(PIPE_GROUP_UP, theGroup); } + void SetGroupSide1 (const Handle(TColStd_HArray1OfInteger) &theGroup) + { _func->SetIntegerArray(PIPE_GROUP_SIDE1, theGroup); } + void SetGroupSide2 (const Handle(TColStd_HArray1OfInteger) &theGroup) + { _func->SetIntegerArray(PIPE_GROUP_SIDE2, theGroup); } + void SetGroupOther (const Handle(TColStd_HArray1OfInteger) &theGroup) + { _func->SetIntegerArray(PIPE_GROUP_OTHER, theGroup); } Handle(GEOM_Function) GetBase() { return _func->GetReference(PIPE_ARG_BASE); } Handle(GEOM_Function) GetPath() { return _func->GetReference(PIPE_ARG_PATH); } + int GetGenerateGroups () { return _func->GetInteger(PIPE_GENERATE_GROUPS); } + Handle(TColStd_HArray1OfInteger) GetGroupDown () + { return _func->GetIntegerArray(PIPE_GROUP_DOWN); } + Handle(TColStd_HArray1OfInteger) GetGroupUp () + { return _func->GetIntegerArray(PIPE_GROUP_UP); } + Handle(TColStd_HArray1OfInteger) GetGroupSide1 () + { return _func->GetIntegerArray(PIPE_GROUP_SIDE1); } + Handle(TColStd_HArray1OfInteger) GetGroupSide2 () + { return _func->GetIntegerArray(PIPE_GROUP_SIDE2); } + Handle(TColStd_HArray1OfInteger) GetGroupOther () + { return _func->GetIntegerArray(PIPE_GROUP_OTHER); } protected: diff --git a/src/GEOMImpl/GEOMImpl_IPipeBiNormal.hxx b/src/GEOMImpl/GEOMImpl_IPipeBiNormal.hxx index 8d3780f1a..e6b154c16 100644 --- a/src/GEOMImpl/GEOMImpl_IPipeBiNormal.hxx +++ b/src/GEOMImpl/GEOMImpl_IPipeBiNormal.hxx @@ -22,15 +22,10 @@ #ifndef _GEOMImpl_IPIPEBINORMAL_HXX_ #define _GEOMImpl_IPIPEBINORMAL_HXX_ -#include "GEOM_Function.hxx" -#ifndef _GEOMImpl_IPIPE_HXX_ #include "GEOMImpl_IPipe.hxx" -#endif -#define PIPE_ARG_BASE 1 -#define PIPE_ARG_PATH 2 -#define PIPE_ARG_VEC 3 +// Position definitions are declared in the base class. class GEOMImpl_IPipeBiNormal : public GEOMImpl_IPipe { diff --git a/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx b/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx index 563d32633..902f0cf4d 100644 --- a/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx +++ b/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx @@ -25,20 +25,11 @@ #ifndef _GEOMImpl_IPIPEDIFFSECT_HXX_ #define _GEOMImpl_IPIPEDIFFSECT_HXX_ -#include "GEOM_Function.hxx" -#include - -#ifndef _GEOMImpl_IPIPE_HXX_ #include "GEOMImpl_IPipe.hxx" -#endif - -#define PIPEDS_LIST_BASES 1 -#define PIPEDS_LIST_LOCATIONS 3 -//#define PIPEDS_ARG_PATH 2 -#define PIPEDS_ARG_WITHCONTACT 4 -#define PIPEDS_ARG_WITHCORRECT 5 +#include +// Position definitions are declared in the base class. class GEOMImpl_IPipeDiffSect : public GEOMImpl_IPipe { diff --git a/src/GEOMImpl/GEOMImpl_IPipeShellSect.hxx b/src/GEOMImpl/GEOMImpl_IPipeShellSect.hxx index e65a60b1f..f162a0b97 100644 --- a/src/GEOMImpl/GEOMImpl_IPipeShellSect.hxx +++ b/src/GEOMImpl/GEOMImpl_IPipeShellSect.hxx @@ -22,16 +22,12 @@ #ifndef _GEOMImpl_IPIPESHELLSECT_HXX_ #define _GEOMImpl_IPIPESHELLSECT_HXX_ -#include "GEOM_Function.hxx" -#ifndef _GEOMImpl_IPIPEDIFFSECT_HXX_ #include "GEOMImpl_IPipeDiffSect.hxx" -#endif - +#include "GEOM_Function.hxx" #include -#define PIPEDS_LIST_SUBBASES 6 - +// Position definitions are declared in the base class GEOMImpl_IPipe. class GEOMImpl_IPipeShellSect : public GEOMImpl_IPipeDiffSect { diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx index 029595cbf..4768d35f1 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx @@ -62,11 +62,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include @@ -98,6 +100,24 @@ #include "utilities.h" +#define GROUP_DOWN 0 +#define GROUP_UP 1 +#define GROUP_SIDE1 2 +#define GROUP_SIDE2 3 +#define GROUP_OTHER 4 + +static bool FillGroups(const TopTools_SequenceOfShape *theGroups, + const TopTools_IndexedMapOfShape &theIndices, + Handle(TColStd_HArray1OfInteger) *theGroupIds); + +static void StoreGroups(GEOMImpl_IPipe *theCI, + Handle(TColStd_HArray1OfInteger) *theGroups); + +static bool DoGroups(BRepOffsetAPI_MakePipeShell &theSweep, + TopTools_SequenceOfShape *theGroups); + +static bool CreateGroups(BRepOffsetAPI_MakePipeShell &theSweep, + GEOMImpl_IPipe *theCI); //======================================================================= //function : GetID @@ -277,15 +297,6 @@ static bool FillCorrespondingEdges(const TopoDS_Shape& FS1, BuildPipeShell(aBuilder); TopoDS_Shape aShape = aBuilder.Shape(); - /* - TopoDS_Compound C; - BRep_Builder B; - B.MakeCompound(C); - B.Add(C,aShape); - B.Add(C,FS1); - B.Add(C,FS2); - BRepTools::Write(C,"/dn02/users_Linux/skl/work/Bugs/14857/comp.brep"); - */ ShapeAnalysis_Edge sae; double tol = Max(BRep_Tool::Tolerance(TopoDS::Face(FS1)), BRep_Tool::Tolerance(TopoDS::Face(FS2))); @@ -680,11 +691,12 @@ static void FindFirstPairFaces(const TopoDS_Shape& S1, const TopoDS_Shape& S2, //purpose : //======================================================================= TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections - (const TopoDS_Wire& theWirePath, - const Handle(TopTools_HSequenceOfShape) theHSeqBases, - const Handle(TopTools_HSequenceOfShape) theHSeqLocs, - const Standard_Boolean theWithContact, - const Standard_Boolean theWithCorrect) + (const TopoDS_Wire &theWirePath, + const Handle(TopTools_HSequenceOfShape) theHSeqBases, + const Handle(TopTools_HSequenceOfShape) theHSeqLocs, + const Standard_Boolean theWithContact, + const Standard_Boolean theWithCorrect, + Handle(TColStd_HArray1OfInteger) *theGroups) { TopoDS_Shape aShape; @@ -916,8 +928,12 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections P1 = P2; } + bool isCreateGroups = (theGroups != NULL); + if (SplitLocNums.Length()==SplitEdgeNums.Length() && SplitEdgeNums.Length()>0) { - TopTools_SequenceOfShape aSeqRes; + TopTools_SequenceOfShape aSeqRes; + TopTools_DataMapOfShapeSequenceOfShape aMapResGroups[5]; + Standard_Integer iGrp; int nn, num1 = 1, num2 = 1; for (nn=1; nn<=SplitEdgeNums.Length(); nn++) { // create wirepath and sequences of shapes @@ -954,6 +970,21 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections TopoDS_Shape resShape = aBuilder.Shape(); aSeqRes.Append(resShape); + + // Create groups. + if (isCreateGroups) { + // Make groups. + TopTools_SequenceOfShape aGroups[5]; + + if (!DoGroups(aBuilder, aGroups)) { + Standard_ConstructionError::Raise("Generate groups failure"); + } + + // Get shapes from all groups. + for (iGrp = 0; iGrp < 5; ++iGrp) { + aMapResGroups[iGrp].Bind(resShape, aGroups[iGrp]); + } + } } // create wirepath and sequences of shapes for last part BRep_Builder B; @@ -987,6 +1018,22 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections TopoDS_Shape resShape = aBuilder.Shape(); aSeqRes.Append(resShape); + + // Create groups. + if (isCreateGroups) { + // Make groups. + TopTools_SequenceOfShape aGroups[5]; + + if (!DoGroups(aBuilder, aGroups)) { + Standard_ConstructionError::Raise("Generate groups failure"); + } + + // Get shapes from all groups. + for (iGrp = 0; iGrp < 5; ++iGrp) { + aMapResGroups[iGrp].Bind(resShape, aGroups[iGrp]); + } + } + // make sewing for result Handle(BRepBuilderAPI_Sewing) aSewing = new BRepBuilderAPI_Sewing; aSewing->SetTolerance(Precision::Confusion()); @@ -998,6 +1045,56 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections } aSewing->Perform(); aShape = aSewing->SewedShape(); + + if (isCreateGroups) { + // Replase Group shapes by modified ones. + TopTools_SequenceOfShape aSeqGroups[5]; + + // For each group. + for (iGrp = 0; iGrp < 5; ++iGrp) { + // For each pipe + for (i = 1; i <= aSeqRes.Length(); ++i) { + if (iGrp == GROUP_DOWN && i > 1) { + // For DOWN group we use only the first pipe. + continue; + } + + if (iGrp == GROUP_UP && i < aSeqRes.Length()) { + // For UP group we use only the last pipe. + continue; + } + + const TopTools_SequenceOfShape &aShapes = + aMapResGroups[iGrp].Find(aSeqRes.Value(i)); + Standard_Integer j; + + // For each sub-shape of pipe + for (j = 1; j <= aShapes.Length(); ++j) { + const TopoDS_Shape &aGrpShape = aShapes.Value(j); + + if (aSewing->IsModifiedSubShape(aGrpShape)) { + // Use the shape modified by sewing. + const TopoDS_Shape &aModifGrpShape = + aSewing->ModifiedSubShape(aGrpShape); + + aSeqGroups[iGrp].Append(aModifGrpShape); + } else { + // Use the shape as it is. + aSeqGroups[iGrp].Append(aGrpShape); + } + } + } + } + + // Fill groups + TopTools_IndexedMapOfShape anIndices; + + TopExp::MapShapes(aShape, anIndices); + + if (!FillGroups(aSeqGroups, anIndices, theGroups)) { + Standard_ConstructionError::Raise("Generate groups failure"); + } + } } else { // old implementation without splitting @@ -1047,6 +1144,26 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections Standard_ConstructionError::Raise("Pipe construction failure"); } aShape = aBuilder.Shape(); + + if (isCreateGroups) { + // Make groups. + TopTools_SequenceOfShape aSeqGroups[5]; + + if (!DoGroups(aBuilder, aSeqGroups)) { + Standard_ConstructionError::Raise("Generate groups failure"); + } + + // Fill the groups. + Handle(TColStd_HArray1OfInteger) aGroupIds[5]; + TopTools_IndexedMapOfShape anIndices; + const TopoDS_Shape aResult = aBuilder.Shape(); + + TopExp::MapShapes(aResult, anIndices); + + if (!FillGroups(aSeqGroups, anIndices, theGroups)) { + Standard_ConstructionError::Raise("Generate groups failure"); + } + } aSeqFaces.Append(aShape); for (j = 1; j <=usedBases.Length(); j++) aBuilder.Delete(usedBases.Value(j)); @@ -1063,8 +1180,6 @@ TopoDS_Shape GEOMImpl_PipeDriver::CreatePipeWithDifferentSections static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, GEOMImpl_IPipe* aCI) { - //cout<<"CreatePipeForShellSections"<GetLocations(); Standard_Boolean aWithContact = (aCIDS->GetWithContactMode()); Standard_Boolean aWithCorrect = (aCIDS->GetWithCorrectionMode()); + Standard_Boolean isGenerateGroups = aCIDS->GetGenerateGroups(); Standard_Integer nbBases = aBasesObjs->Length(), nbSubBases = (aSubBasesObjs.IsNull() ? 0 :aSubBasesObjs->Length()), @@ -1088,8 +1204,6 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, Standard_ConstructionError::Raise("Number of sections is not equal to number of subsections "); } - //BRepOffsetAPI_MakePipeShell aBuilder(aWirePath); - TopTools_SequenceOfShape VLocs; for (i=1; i<=nbBases; i++) { Handle(Standard_Transient) anItemLoc = aLocObjs->Value(i); @@ -1261,7 +1375,6 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, for (; i<=Edges.Length(); i++) B.Add(W,Edges.Value(i)); Wires.Append(W); - //cout<<"Wires.Length()="<D0(fp,P1); - if (P1.Distance(PLoc) < tol) { - C->D0(fp+(lp-fp)/100,P2); - } - else { - C->D0(lp,P1); - C->D0(lp+(fp-lp)/100,P2); - } - PathNorm = gp_Vec(P1,P2); - break; - } - else { - TopoDS_Vertex VL = sae.LastVertex(edge); - gp_Pnt PL = BRep_Tool::Pnt(VL); - if (PL.Distance(PLoc) < tol) { - double fp,lp; - Handle(Geom_Curve) C = BRep_Tool::Curve(edge,fp,lp); - gp_Pnt P1,P2; - C->D0(fp,P1); - if (P1.Distance(PLoc) < tol) { - C->D0(fp+(lp-fp)/100,P2); - } - else { - C->D0(lp,P1); - C->D0(lp+(fp-lp)/100,P2); - } - PathNorm = gp_Vec(P2,P1); - break; - } - } - } - cout<<"VN("<PI/2.) { - NeedReverse = true; - aShBase1.Reverse(); - } - } - { - // second section - anExp.Init(aShBase2, TopAbs_FACE); - TopoDS_Shape aFace = anExp.Current(); - TColgp_SequenceOfPnt aPnts; - double xc=0, yc=0, zc=0; - for (anExp.Init(aFace, TopAbs_VERTEX); anExp.More(); anExp.Next()) { - TopoDS_Vertex V = TopoDS::Vertex(anExp.Current()); - aPnts.Append(BRep_Tool::Pnt(V)); - xc += aPnts.Last().X(); - yc += aPnts.Last().Y(); - zc += aPnts.Last().Z(); - } - gp_Pnt PC(xc/aPnts.Length(), yc/aPnts.Length(), zc/aPnts.Length()); - gp_Vec V1(PC,aPnts.Value(1)); - gp_Vec V2(PC,aPnts.Value(2)); - gp_Vec VN = V1.Crossed(V2); - for (int ip=2; ipD0(fp,P1); - if (P1.Distance(PLoc) < tol) { - C->D0(fp+(lp-fp)/100,P2); - } - else { - C->D0(lp,P1); - C->D0(lp+(fp-lp)/100,P2); - } - PathNorm = gp_Vec(P2,P1); - break; - } - else { - TopoDS_Vertex VL = sae.LastVertex(edge); - gp_Pnt PL = BRep_Tool::Pnt(VL); - if (PL.Distance(PLoc) < tol) { - double fp,lp; - Handle(Geom_Curve) C = BRep_Tool::Curve(edge,fp,lp); - gp_Pnt P1,P2; - C->D0(fp,P1); - if (P1.Distance(PLoc) < tol) { - C->D0(fp+(lp-fp)/100,P2); - } - else { - C->D0(lp,P1); - C->D0(lp+(fp-lp)/100,P2); - } - PathNorm = gp_Vec(P2,P1); - break; - } - } - } - //cout<<"VN("<PI/2.) - aShBase2.Reverse(); - } - */ - if (!CreateFewSolids) { // we can create only one solid TopoDS_Shape aWire1, aWire2; @@ -1536,7 +1498,22 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, BuildPipeShell(aBuilder); - TopoDS_Shape aShape = aBuilder.Shape(); + TopoDS_Shape aShape = aBuilder.Shape(); + TopTools_SequenceOfShape aLocalGroups[5]; + + // Create groups. + if (isGenerateGroups) { + // Make groups. + if (!DoGroups(aBuilder, aLocalGroups)) { + if (aCI) delete aCI; + Standard_ConstructionError::Raise("Generate groups failure"); + } + + // Clear the groups Down and Up. + aLocalGroups[GROUP_DOWN].Clear(); + aLocalGroups[GROUP_UP].Clear(); + } + TopoDS_Shell aShell; B.MakeShell(aShell); for (anExp.Init(aShape, TopAbs_FACE); anExp.More(); anExp.Next()) { @@ -1544,9 +1521,17 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, } for (anExp.Init(aShBase1, TopAbs_FACE); anExp.More(); anExp.Next()) { B.Add(aShell,anExp.Current()); + + if (isGenerateGroups && i == 1) { + aLocalGroups[GROUP_DOWN].Append(anExp.Current()); + } } for (anExp.Init(aShBase2, TopAbs_FACE); anExp.More(); anExp.Next()) { B.Add(aShell,anExp.Current()); + + if (isGenerateGroups && i == nbBases - 1) { + aLocalGroups[GROUP_UP].Append(anExp.Current()); + } } // make sewing for this shell Handle(BRepBuilderAPI_Sewing) aSewing = new BRepBuilderAPI_Sewing; @@ -1579,6 +1564,30 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, else { B.Add(aComp,aShell); } + + if (isGenerateGroups) { + Standard_Integer iGrp; + + for (iGrp = 0; iGrp < 5; ++iGrp) { + Standard_Integer j; + + // For each sub-shape of pipe + for (j = 1; j <= aLocalGroups[iGrp].Length(); ++j) { + const TopoDS_Shape &aGrpShape = aLocalGroups[iGrp].Value(j); + + if (aSewing->IsModifiedSubShape(aGrpShape)) { + // Use the shape modified by sewing. + const TopoDS_Shape &aModifGrpShape = + aSewing->ModifiedSubShape(aGrpShape); + + aGroups[iGrp].Append(aModifGrpShape); + } else { + // Use the shape as it is. + aGroups[iGrp].Append(aGrpShape); + } + } + } + } } } else { @@ -1776,7 +1785,30 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, BuildPipeShell(aBuilder); - TopoDS_Shape aShape = aBuilder.Shape(); + TopoDS_Shape aShape = aBuilder.Shape(); + TopTools_SequenceOfShape aLocalGroups[5]; + + // Create groups. + if (isGenerateGroups) { + // Make groups. + if (!DoGroups(aBuilder, aLocalGroups)) { + if (aCI) delete aCI; + Standard_ConstructionError::Raise("Generate groups failure"); + } + + // Clear the groups Down and Up. + aLocalGroups[GROUP_DOWN].Clear(); + aLocalGroups[GROUP_UP].Clear(); + + if (i == 1) { + aLocalGroups[GROUP_DOWN].Append(F1); + } + + if (i == nbBases - 1) { + aLocalGroups[GROUP_UP].Append(F2); + } + } + TopoDS_Shell aShell; B.MakeShell(aShell); for (anExp.Init(aShape, TopAbs_FACE); anExp.More(); anExp.Next()) { @@ -1817,13 +1849,52 @@ static TopoDS_Shape CreatePipeForShellSections(const TopoDS_Wire& aWirePath, else { B.Add(aComp,aShell); } + + if (isGenerateGroups) { + // Replase Group shapes by modified ones. + Standard_Integer iGrp; + + // For each group. + for (iGrp = 0; iGrp < 5; ++iGrp) { + Standard_Integer j; + + // For each sub-shape of pipe + for (j = 1; j <= aLocalGroups[iGrp].Length(); ++j) { + const TopoDS_Shape &aGrpShape = aLocalGroups[iGrp].Value(j); + + if (aSewing->IsModifiedSubShape(aGrpShape)) { + // Use the shape modified by sewing. + const TopoDS_Shape &aModifGrpShape = + aSewing->ModifiedSubShape(aGrpShape); + + aGroups[iGrp].Append(aModifGrpShape); + } else { + // Use the shape as it is. + aGroups[iGrp].Append(aGrpShape); + } + } + } + } } } + } + } + + if (isGenerateGroups) { + // Fill the groups. + Handle(TColStd_HArray1OfInteger) aGroupIds[5]; + TopTools_IndexedMapOfShape anIndices; + + TopExp::MapShapes(aComp, anIndices); + if (!FillGroups(aGroups, anIndices, aGroupIds)) { + if (aCI) delete aCI; + Standard_ConstructionError::Raise("Generate groups failure"); } + + StoreGroups(aCI, aGroupIds); } - //BRepTools::Write(aComp,"/dn02/users_Linux/skl/work/Bugs/14857/comp.brep"); return aComp; } @@ -1842,6 +1913,7 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) Handle(TColStd_HSequenceOfTransient) aBasesObjs = aCIDS->GetBases(); // vertex for recognition Handle(TColStd_HSequenceOfTransient) VObjs = aCIDS->GetLocations(); + Standard_Boolean isGenerateGroups = aCIDS->GetGenerateGroups(); Standard_Integer nbBases = aBasesObjs->Length(), nbv = (VObjs.IsNull() ? 0 :VObjs->Length()); @@ -1851,6 +1923,7 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) Standard_ConstructionError::Raise("Number of shapes for recognition is invalid"); } + TopTools_SequenceOfShape aGroups[5]; TopTools_SequenceOfShape SecVs,Bases; for (i=1; i<=nbBases; i++) { // vertex @@ -1902,8 +1975,23 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) } TopTools_MapOfShape aFaces1,aFaces2; + TopTools_MapOfShape aBndEdges1; + for (anExp.Init(aShBase1, TopAbs_FACE); anExp.More(); anExp.Next()) { - aFaces1.Add(anExp.Current()); + const TopoDS_Shape &aBaseFace1 = anExp.Current(); + + if (aFaces1.Add(aBaseFace1)) { + // Get boundary edges. + TopExp_Explorer anExpE(aBaseFace1, TopAbs_EDGE); + + for (; anExpE.More(); anExpE.Next()) { + const TopoDS_Shape &aBaseEdge1 = anExpE.Current(); + + if (!aBndEdges1.Add(aBaseEdge1)) { + aBndEdges1.Remove(aBaseEdge1); + } + } + } } for (anExp.Init(aShBase2, TopAbs_FACE); anExp.More(); anExp.Next()) { aFaces2.Add(anExp.Current()); @@ -1991,6 +2079,8 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) TopExp_Explorer anExpE(F1,TopAbs_EDGE); TopTools_SequenceOfShape aNewFs; + TopTools_SequenceOfShape aLocalGroups[5]; + //int nbee=0; for (; anExpE.More(); anExpE.Next()) { TopoDS_Edge E1 = TopoDS::Edge(anExpE.Current()); @@ -2071,8 +2161,6 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) B.Add(W,E2); B.Add(W,E3); B.Add(W,E4.Reversed()); - //cout<<" wire for edge "<Degree()<3) CE4->IncreaseDegree(3); - //cout<<"CE1->Degree()="<Degree()<<" CE2->Degree()="<Degree() - // <<" CE3->Degree()="<Degree()<<" CE4->Degree()="<Degree()<Face(); aNewFs.Append(FixedFace); VPE.Add(E1,FixedFace); - //cout<<" face for edge "<SetTolerance(Precision::Confusion()); @@ -2242,7 +2337,6 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) aSewing->Perform(); MESSAGE (" shell for face "<SewedShape(); - //BRepTools::Write(aSewShape,"/dn02/users_Linux/skl/work/Bugs/14857/sew.brep"); if (aSewShape.ShapeType() == TopAbs_SHELL) { aShell = TopoDS::Shell(aSewShape); GProp_GProps aSystem; @@ -2267,32 +2361,48 @@ static TopoDS_Shape CreatePipeShellsWithoutPath(GEOMImpl_IPipe* aCI) B.Add(aComp,aShell); MESSAGE (" solid for face "<Perform(); - //TopoDS_Shell FixedShell = sfs->Shell(); - /* - GProp_GProps aSystem; - BRepGProp::VolumeProperties(FixedShell, aSystem); - if (aSystem.Mass()<0) { - //cout<<"aSewShape is reversed"<IsModifiedSubShape(aGrpShape)) { + // Use the shape modified by sewing. + const TopoDS_Shape &aModifGrpShape = + aSewing->ModifiedSubShape(aGrpShape); + + aGroups[iGrp].Append(aModifGrpShape); + } else { + // Use the shape as it is. + aGroups[iGrp].Append(aGrpShape); + } + } + } } - */ } } - //BRepTools::Write(aComp,"/dn02/users_Linux/skl/work/Bugs/14857/comp.brep"); + if (isGenerateGroups) { + // Fill the groups. + Handle(TColStd_HArray1OfInteger) aGroupIds[5]; + TopTools_IndexedMapOfShape anIndices; + + TopExp::MapShapes(aComp, anIndices); + + if (!FillGroups(aGroups, anIndices, aGroupIds)) { + if (aCI) delete aCI; + Standard_ConstructionError::Raise("Generate groups failure"); + } + + StoreGroups(aCI, aGroupIds); + } + return aComp; } @@ -2365,9 +2475,397 @@ static TopoDS_Shape CreatePipeBiNormalAlongVector(const TopoDS_Wire& aWirePath, PipeBuilder.MakeSolid(); } + if (!CreateGroups(PipeBuilder, aCIBN)) { + if (aCIBN) delete aCIBN; + Standard_ConstructionError::Raise("Generate groups failure"); + } + return PipeBuilder.Shape(); } +//======================================================================= +//function : FillGroups +//purpose : auxilary for DoGroups() +//======================================================================= +bool FillGroups(const TopTools_SequenceOfShape *theGroups, + const TopTools_IndexedMapOfShape &theIndices, + Handle(TColStd_HArray1OfInteger) *theGroupIds) +{ + Standard_Integer i; + + for (i = 0; i < 5; ++i) { + if (!theGroups[i].IsEmpty()) { + const Standard_Integer aNbShapes = theGroups[i].Length(); + Standard_Integer j; + + theGroupIds[i] = new TColStd_HArray1OfInteger(1, aNbShapes); + + for (j = 1; j <= aNbShapes; ++j) { + const TopoDS_Shape &aShape = theGroups[i].Value(j); + const Standard_Integer anIndex = theIndices.FindIndex(aShape); + + if (anIndex == 0) { + return false; + } + + theGroupIds[i]->SetValue(j, anIndex); + } + } + } + + return true; +} + +//======================================================================= +//function : StoreGroups +//purpose : auxilary for CreateGroups() +//======================================================================= +void StoreGroups(GEOMImpl_IPipe *theCI, + Handle(TColStd_HArray1OfInteger) *theGroups) +{ + if (theGroups[GROUP_DOWN].IsNull() == Standard_False) { + theCI->SetGroupDown(theGroups[GROUP_DOWN]); + } + + if (theGroups[GROUP_UP].IsNull() == Standard_False) { + theCI->SetGroupUp(theGroups[GROUP_UP]); + } + + if (theGroups[GROUP_SIDE1].IsNull() == Standard_False) { + theCI->SetGroupSide1(theGroups[GROUP_SIDE1]); + } + + if (theGroups[GROUP_SIDE2].IsNull() == Standard_False) { + theCI->SetGroupSide2(theGroups[GROUP_SIDE2]); + } + + if (theGroups[GROUP_OTHER].IsNull() == Standard_False) { + theCI->SetGroupOther(theGroups[GROUP_OTHER]); + } +} + +//======================================================================= +//function : CreateDownUpGroups +//purpose : auxilary for DoGroups() +//======================================================================= +static bool CreateDownUpGroups(BRepPrimAPI_MakeSweep *theSweep, + TopTools_SequenceOfShape *theGroups, + Standard_Boolean &IsDoSides) +{ + const TopoDS_Shape aDownShape = theSweep->FirstShape(); + const TopAbs_ShapeEnum aType = aDownShape.ShapeType(); + TopAbs_ShapeEnum anUpDownType = TopAbs_SHAPE; + + IsDoSides = Standard_False; + + switch (aType) { + case TopAbs_EDGE: + case TopAbs_WIRE: + anUpDownType = TopAbs_EDGE; + + if (GEOMUtils::IsOpenPath(aDownShape)) { + IsDoSides = Standard_True; + } + break; + case TopAbs_FACE: + case TopAbs_SHELL: + anUpDownType = TopAbs_FACE; + break; + default: + break; + } + + if (anUpDownType == TopAbs_SHAPE) { + // Invalid Up and Down group type. + return false; + } + + TopExp_Explorer anExp(aDownShape, anUpDownType); + TopTools_MapOfShape aMapFence; + + // Create Down group. + for (; anExp.More(); anExp.Next()) { + const TopoDS_Shape &aShape = anExp.Current(); + + if (aMapFence.Add(aShape)) { + theGroups[GROUP_DOWN].Append(aShape); + } + } + + // Create Up group + const TopoDS_Shape anUpShape = theSweep->LastShape(); + + aMapFence.Clear(); + anExp.Init(anUpShape, anUpDownType); + + for (; anExp.More(); anExp.Next()) { + const TopoDS_Shape &aShape = anExp.Current(); + + if (aMapFence.Add(aShape)) { + theGroups[GROUP_UP].Append(aShape); + } + } + + return true; +} + +//======================================================================= +//function : DoGroups +//purpose : auxilary for CreateGroups() +//======================================================================= +bool DoGroups(BRepOffsetAPI_MakePipeShell &theSweep, + TopTools_SequenceOfShape *theGroups) +{ + Standard_Boolean isDoSides = Standard_False; + + if (!CreateDownUpGroups(&theSweep, theGroups, isDoSides)) { + // Up and Down groups creation failure + return false; + } + + const TopoDS_Shape aDownShape = theSweep.FirstShape(); + + if (isDoSides) { + // Create Side1 and Side2 groups. + const TopAbs_ShapeEnum aType = aDownShape.ShapeType(); + TopoDS_Vertex aV[2]; + Standard_Integer i; + + if (aType == TopAbs_EDGE) { + TopExp::Vertices(TopoDS::Edge(aDownShape), aV[0], aV[1], Standard_True); + } else { // aType == TopAbs_WIRE + TopExp::Vertices(TopoDS::Wire(aDownShape), aV[0], aV[1]); + } + + for (i = 0; i < 2; ++i) { + if (aV[i].IsNull() == Standard_False) { + const TopTools_ListOfShape &aLstSide = theSweep.Generated(aV[i]); + + if (!aLstSide.IsEmpty()) { + TopTools_ListIteratorOfListOfShape aSideIt(aLstSide); + TopTools_MapOfShape aMapFence; + const Standard_Integer anIdSide = + (i == 0 ? GROUP_SIDE1 : GROUP_SIDE2); + + for (; aSideIt.More(); aSideIt.Next()) { + const TopoDS_Shape &aSideShape = aSideIt.Value(); + + if (aSideShape.ShapeType() == TopAbs_EDGE) { + if (aMapFence.Add(aSideShape)) { + theGroups[anIdSide].Append(aSideShape); + } + } else { + // Only edges can be is Side1 and Side2 groups. + return false; + } + } + } + } + } + } else { + // Create Other group. Get boudnary edges of the profile. + TopTools_MapOfShape aMapBndEdges; + TopExp_Explorer anExp(aDownShape, TopAbs_EDGE); + + for (; anExp.More(); anExp.Next()) { + const TopoDS_Shape &anEdge = anExp.Current(); + + if (!aMapBndEdges.Add(anEdge)) { + aMapBndEdges.Remove(anEdge); + } + } + + // Fill the map of faces generated from profile's boundary edges. + TopTools_MapIteratorOfMapOfShape anIter(aMapBndEdges); + TopTools_MapOfShape aMapFence; + + for (; anIter.More(); anIter.Next()) { + const TopTools_ListOfShape &aLstOther = theSweep.Generated(anIter.Key()); + + if (!aLstOther.IsEmpty()) { + TopTools_ListIteratorOfListOfShape anOtherIt(aLstOther); + + for (; anOtherIt.More(); anOtherIt.Next()) { + const TopoDS_Shape &anOtherShape = anOtherIt.Value(); + + if (anOtherShape.ShapeType() == TopAbs_FACE) { + if (aMapFence.Add(anOtherShape)) { + theGroups[GROUP_OTHER].Append(anOtherShape); + } + } else { + // Only faces can be in Other group. + return false; + } + } + } + } + } + + return true; +} + +//======================================================================= +//function : CreateGroups +//purpose : auxilary for Execute() +//======================================================================= +bool CreateGroups(BRepOffsetAPI_MakePipeShell &theSweep, + GEOMImpl_IPipe *theCI) +{ + if (!theCI->GetGenerateGroups()) { + // Nothing to do. + return true; + } + + // Make groups. + TopTools_SequenceOfShape aGroups[5]; + + if (!DoGroups(theSweep, aGroups)) { + return false; + } + + // Fill the groups. + Handle(TColStd_HArray1OfInteger) aGroupIds[5]; + TopTools_IndexedMapOfShape anIndices; + const TopoDS_Shape aResult = theSweep.Shape(); + + TopExp::MapShapes(aResult, anIndices); + + if (!FillGroups(aGroups, anIndices, aGroupIds)) { + return false; + } + + // Store groups. + StoreGroups(theCI, aGroupIds); + + return true; +} + +//======================================================================= +//function : DoGroups +//purpose : auxilary for CreateGroups() +//======================================================================= +static bool DoGroups(const TopoDS_Shape &theProfile, + const TopoDS_Shape &thePath, + BRepOffsetAPI_MakePipe &theSweep, + TopTools_SequenceOfShape *theGroups) +{ + Standard_Boolean isDoSides = Standard_False; + + if (!CreateDownUpGroups(&theSweep, theGroups, isDoSides)) { + // Up and Down groups creation failure + return false; + } + + if (isDoSides) { + // Create Side1 and Side2 groups. + const TopAbs_ShapeEnum aType = theProfile.ShapeType(); + TopoDS_Vertex aV[2]; + Standard_Integer i; + + if (aType == TopAbs_EDGE) { + TopExp::Vertices(TopoDS::Edge(theProfile), aV[0], aV[1], Standard_True); + } else { // aType == TopAbs_WIRE + TopExp::Vertices(TopoDS::Wire(theProfile), aV[0], aV[1]); + } + + for (i = 0; i < 2; ++i) { + if (aV[i].IsNull() == Standard_False) { + TopExp_Explorer anExpP(thePath, TopAbs_EDGE); + TopTools_MapOfShape aMapFence; + const Standard_Integer anIdSide = + (i == 0 ? GROUP_SIDE1 : GROUP_SIDE2); + + for (; anExpP.More(); anExpP.Next()) { + const TopoDS_Shape aSideShape = + theSweep.Generated(anExpP.Current(), aV[i]); + + if (aSideShape.ShapeType() == TopAbs_EDGE) { + if (aMapFence.Add(aSideShape)) { + theGroups[anIdSide].Append(aSideShape); + } + } else { + // Only edges can be is Side1 and Side2 groups. + return false; + } + } + } + } + } else { + // Create Other group. Get boudnary edges of the profile. + TopTools_MapOfShape aMapBndEdges; + TopExp_Explorer anExp(theProfile, TopAbs_EDGE); + + for (; anExp.More(); anExp.Next()) { + const TopoDS_Shape &anEdge = anExp.Current(); + + if (!aMapBndEdges.Add(anEdge)) { + aMapBndEdges.Remove(anEdge); + } + } + + TopExp_Explorer anExpP(thePath, TopAbs_EDGE); + TopTools_MapOfShape aMapFence; + + for (; anExpP.More(); anExpP.Next()) { + TopTools_MapIteratorOfMapOfShape anIter(aMapBndEdges); + + for (; anIter.More(); anIter.Next()) { + const TopoDS_Shape anOtherShape = + theSweep.Generated(anExpP.Current(), anIter.Key()); + + if (anOtherShape.ShapeType() == TopAbs_FACE) { + if (aMapFence.Add(anOtherShape)) { + theGroups[GROUP_OTHER].Append(anOtherShape); + } + } else { + // Only faces can be in Other group. + return false; + } + } + } + } + + return true; +} + +//======================================================================= +//function : CreateGroups +//purpose : auxilary for Execute() +//======================================================================= +static bool CreateGroups(const TopoDS_Shape &theProfile, + const TopoDS_Shape &thePath, + BRepOffsetAPI_MakePipe &theSweep, + GEOMImpl_IPipe *theCI) +{ + if (!theCI->GetGenerateGroups()) { + // Nothing to do. + return true; + } + + // Make groups. + TopTools_SequenceOfShape aGroups[5]; + + if (!DoGroups(theProfile, thePath, theSweep, aGroups)) { + return false; + } + + // Fill the groups. + Handle(TColStd_HArray1OfInteger) aGroupIds[5]; + TopTools_IndexedMapOfShape anIndices; + const TopoDS_Shape aResult = theSweep.Shape(); + + TopExp::MapShapes(aResult, anIndices); + + if (!FillGroups(aGroups, anIndices, aGroupIds)) { + return false; + } + + // Store groups. + StoreGroups(theCI, aGroupIds); + + return true; +} + //======================================================================= //function : Execute //purpose : @@ -2434,6 +2932,16 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const if (aCI) delete aCI; Standard_TypeMismatch::Raise("MakePipe aborted : path shape is neither a wire nor an edge"); } + + // Check if it is possible to create groups. + if (aCI->GetGenerateGroups() && !GEOMUtils::IsOpenPath(aWirePath)) { + if (aCI) { + delete aCI; + } + + Standard_ConstructionError::Raise + ("Can't create groups if the path is closed"); + } } TopoDS_Shape aShape; @@ -2481,7 +2989,11 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const } else aShape = Sweep.Shape(); //result is good - + + if (!CreateGroups(Sweep, aCI)) { + if (aCI) delete aCI; + Standard_ConstructionError::Raise("Generate groups failure"); + } } else { @@ -2490,6 +3002,11 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const if (aMkPipe.IsDone()) { aShape = aMkPipe.Shape(); + + if (!CreateGroups(aShapeBase, aWirePath, aMkPipe, aCI)) { + if (aCI) delete aCI; + Standard_ConstructionError::Raise("Generate groups failure"); + } } else if (theBestMode != GeomFill_IsDiscreteTrihedron) { // Try to use Descrete Trihedron mode. BRepOffsetAPI_MakePipe aMkPipeDescrete @@ -2497,6 +3014,11 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const if (aMkPipeDescrete.IsDone()) { aShape = aMkPipeDescrete.Shape(); + + if (!CreateGroups(aShapeBase, aWirePath, aMkPipeDescrete, aCI)) { + if (aCI) delete aCI; + Standard_ConstructionError::Raise("Generate groups failure"); + } } } } @@ -2509,6 +3031,8 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const Handle(TColStd_HSequenceOfTransient) aLocObjs = aCIDS->GetLocations (); Standard_Boolean aWithContact = (aCIDS->GetWithContactMode()); Standard_Boolean aWithCorrect = (aCIDS->GetWithCorrectionMode()); + Standard_Boolean isGenerateGroups = aCIDS->GetGenerateGroups(); + if (aCI) { delete aCI; aCI = 0; @@ -2545,7 +3069,24 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const aHSeqLocs->Append(aShapeLoc); } - aShape = CreatePipeWithDifferentSections(aWirePath, aHSeqBases, aHSeqLocs, aWithContact, aWithCorrect); + + Handle(TColStd_HArray1OfInteger) *pGroups = NULL; + Handle(TColStd_HArray1OfInteger) aGroups[5]; + + if (isGenerateGroups) { + pGroups = aGroups; + } + + aShape = CreatePipeWithDifferentSections + (aWirePath, aHSeqBases, aHSeqLocs, + aWithContact, aWithCorrect, pGroups); + + if (isGenerateGroups) { + // Store created groups. + GEOMImpl_IPipeDiffSect aPipeDS(aFunction); + + StoreGroups(&aPipeDS, aGroups); + } } //building pipe with shell sections @@ -2563,6 +3104,8 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const aShape = CreatePipeBiNormalAlongVector(aWirePath, aCI); } + const Standard_Boolean isGenerateGroups = aCI->GetGenerateGroups(); + if (aCI) { delete aCI; aCI = 0; @@ -2585,11 +3128,99 @@ Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const aVertMaxTol = aTol; } aVertMaxTol += Precision::Confusion(); - aShape = GEOMImpl_GlueDriver::GlueFaces(aShape, aVertMaxTol, Standard_True); - //aShape = GEOMImpl_GlueDriver::GlueFaces(aShape, Precision::Confusion(), Standard_True); + + TopTools_DataMapOfShapeListOfShape aMapModif; + TopTools_DataMapOfShapeListOfShape *pMapModif = NULL; + + if (isGenerateGroups) { + pMapModif = &aMapModif; + } + + TopoDS_Shape aNewShape = GEOMImpl_GlueDriver::GlueFaces + (aShape, aVertMaxTol, Standard_True, pMapModif); + + if (isGenerateGroups && !aMapModif.IsEmpty()) { + // Update groups. + GEOMImpl_IPipe aCI(aFunction); + Handle(TColStd_HArray1OfInteger) aGroupIDs[5] = + { aCI.GetGroupDown(), aCI.GetGroupUp(), aCI.GetGroupSide1(), + aCI.GetGroupSide2(), aCI.GetGroupOther() }; + TopTools_IndexedMapOfShape anIndices; + TopTools_IndexedMapOfShape aNewIndices; + TopTools_SequenceOfShape aNewShapes[5]; + TopTools_MapOfShape aMapReplaced; + TopTools_MapOfShape aMapGlued; + Standard_Integer iGrp; + Standard_Integer i; + + TopExp::MapShapes(aShape, anIndices); + TopExp::MapShapes(aNewShape, aNewIndices); + + for (iGrp = 0; iGrp < 5; ++iGrp) { + if (aGroupIDs[iGrp].IsNull() == Standard_False) { + const Standard_Integer aLower = aGroupIDs[iGrp]->Lower(); + const Standard_Integer anUpper = aGroupIDs[iGrp]->Upper(); + + for (i = aLower; i <= anUpper; ++i) { + const Standard_Integer anIndex = aGroupIDs[iGrp]->Value(i); + const TopoDS_Shape &aSubShape = anIndices.FindKey(anIndex); + + if (aMapModif.IsBound(aSubShape)) { + const TopTools_ListOfShape &aListModif = + aMapModif.Find(aSubShape); + TopTools_ListIteratorOfListOfShape anIter(aListModif); + + for (; anIter.More(); anIter.Next()) { + const TopoDS_Shape &aNewShape = anIter.Value(); + + if (aMapReplaced.Add(aNewShape)) { + aNewShapes[iGrp].Append(aNewShape); + } else { + // This is a glued shape. It means that it is internal + // one and should be removed from groups later. + aMapGlued.Add(aNewShape); + } + } + } else { + // Shape is not modified. + aNewShapes[iGrp].Append(aSubShape); + } + } + } + } + + if (!aMapGlued.IsEmpty()) { + // Remove glued (internal) shapes from groups. + for (iGrp = 0; iGrp < 5; ++iGrp) { + Standard_Integer aNbShapes = aNewShapes[iGrp].Length(); + + for (i = 1; i < aNbShapes; ++i) { + const TopoDS_Shape &aNewShape = aNewShapes[iGrp].Value(i); + + if (aMapGlued.Contains(aNewShape)) { + aNewShapes[iGrp].Remove(i); + --i; + --aNbShapes; + } + } + } + } + + // Store modified groups. + Handle(TColStd_HArray1OfInteger) aNewGroupIDs[5]; + + if (!FillGroups(aNewShapes, aNewIndices, aNewGroupIDs)) { + Standard_ConstructionError::Raise("Generate groups failure"); + } + + StoreGroups(&aCI, aNewGroupIDs); + } + + aShape = aNewShape; } } + // Note: group indices should not be changed after the next call. TopoDS_Shape aRes = GEOMUtils::CompsolidToCompound(aShape); aFunction->SetValue(aRes); diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.hxx b/src/GEOMImpl/GEOMImpl_PipeDriver.hxx index ef69fd7ba..3a4deca6f 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.hxx @@ -83,11 +83,12 @@ public: Standard_EXPORT ~GEOMImpl_PipeDriver() {}; Standard_EXPORT static TopoDS_Shape CreatePipeWithDifferentSections - (const TopoDS_Wire& theWirePath, - const Handle(TopTools_HSequenceOfShape) theBases, - const Handle(TopTools_HSequenceOfShape) theLocs, - const Standard_Boolean theWithContact, - const Standard_Boolean theWithCorrect); + (const TopoDS_Wire &theWirePath, + const Handle(TopTools_HSequenceOfShape) theBases, + const Handle(TopTools_HSequenceOfShape) theLocs, + const Standard_Boolean theWithContact, + const Standard_Boolean theWithCorrect, + Handle(TColStd_HArray1OfInteger) *theGroups = NULL); Standard_EXPORT virtual bool GetCreationInformation(std::string& theOperationName, diff --git a/src/GEOMUtils/GEOMUtils.cxx b/src/GEOMUtils/GEOMUtils.cxx index 9b7ca2d97..3e0b18977 100644 --- a/src/GEOMUtils/GEOMUtils.cxx +++ b/src/GEOMUtils/GEOMUtils.cxx @@ -1236,3 +1236,54 @@ double GEOMUtils::DefaultDeflection() { return 0.001; } + +//======================================================================= +//function : IsOpenPath +//purpose : +//======================================================================= +bool GEOMUtils::IsOpenPath(const TopoDS_Shape &theShape) +{ + bool isOpen = true; + + if (theShape.IsNull() == Standard_False) { + if (theShape.Closed()) { + // The shape is closed + isOpen = false; + } else { + const TopAbs_ShapeEnum aType = theShape.ShapeType(); + + if (aType == TopAbs_EDGE || aType == TopAbs_WIRE) { + // Check if path ends are coinsident. + TopoDS_Vertex aV[2]; + + if (aType == TopAbs_EDGE) { + // Edge + TopExp::Vertices(TopoDS::Edge(theShape), aV[0], aV[1]); + } else { + // Wire + TopExp::Vertices(TopoDS::Wire(theShape), aV[0], aV[1]); + } + + if (aV[0].IsNull() == Standard_False && + aV[1].IsNull() == Standard_False) { + if (aV[0].IsSame(aV[1])) { + // The shape is closed + isOpen = false; + } else { + const Standard_Real aTol1 = BRep_Tool::Tolerance(aV[0]); + const Standard_Real aTol2 = BRep_Tool::Tolerance(aV[1]); + const gp_Pnt aPnt1 = BRep_Tool::Pnt(aV[0]); + const gp_Pnt aPnt2 = BRep_Tool::Pnt(aV[1]); + + if (aPnt1.Distance(aPnt2) <= aTol1 + aTol2) { + // The shape is closed + isOpen = false; + } + } + } + } + } + } + + return isOpen; +} diff --git a/src/GEOMUtils/GEOMUtils.hxx b/src/GEOMUtils/GEOMUtils.hxx index d8a839940..8ffa25be2 100644 --- a/src/GEOMUtils/GEOMUtils.hxx +++ b/src/GEOMUtils/GEOMUtils.hxx @@ -328,6 +328,19 @@ namespace GEOMUtils * \return default deflection value */ Standard_EXPORT double DefaultDeflection(); + + /** + * \brief Check if the shape is not a closed wire or edge. + * + * This function is used for pipe creation algorithm to test if + * the pipe path is not closed. It returns false if theShape is a wire or + * an edge with coincident end vertices. Otherwise it returns true. + * + * \param theShape the shape to be tested. + * \return true if theShape is not a closed wire or edge. + */ + Standard_EXPORT bool IsOpenPath(const TopoDS_Shape &theShape); + }; #endif diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc index 66e4b809f..3d5969f71 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc @@ -794,10 +794,12 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeDraftPrism * MakePipe */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipe - (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr thePath) +GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipe + (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean IsGenerateGroups) { - GEOM::GEOM_Object_var aGEOMObject; + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; //Set a not done flag GetOperations()->SetNotDone(); @@ -806,15 +808,20 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipe Handle(GEOM_Object) aBase = GetObjectImpl(theBase); Handle(GEOM_Object) aPath = GetObjectImpl(thePath); - if (aBase.IsNull() || aPath.IsNull()) return aGEOMObject._retn(); + if (aBase.IsNull() || aPath.IsNull()) return aSeq._retn(); //Create the Pipe - Handle(GEOM_Object) anObject = - GetOperations()->MakePipe(aBase, aPath); - if (!GetOperations()->IsDone() || anObject.IsNull()) - return aGEOMObject._retn(); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipe(aBase, aPath, IsGenerateGroups); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); - return GetObject(anObject); + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); } //============================================================================= @@ -974,14 +981,15 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeThruSections(const GEOM::Lis * MakePipeWithDifferentSections */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections - (const GEOM::ListOfGO& theBases, - const GEOM::ListOfGO& theLocations, - GEOM::GEOM_Object_ptr thePath, - CORBA::Boolean theWithContact, - CORBA::Boolean theWithCorrections) +GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections + (const GEOM::ListOfGO &theBases, + const GEOM::ListOfGO &theLocations, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean theWithContact, + CORBA::Boolean theWithCorrections, + CORBA::Boolean IsGenerateGroups) { - GEOM::GEOM_Object_var aGEOMObject; + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; //Set a not done flag GetOperations()->SetNotDone(); @@ -994,11 +1002,11 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections aNbLocs = theLocations.length(); if (aNbLocs && aNbBases != aNbLocs) - return aGEOMObject._retn(); + return aSeq._retn(); Handle(GEOM_Object) aPath = GetObjectImpl(thePath); if (aPath.IsNull()) - return aGEOMObject._retn(); + return aSeq._retn(); for (ind = 0; ind < aNbBases; ind++) { Handle(GEOM_Object) aBase = GetObjectImpl(theBases[ind]); @@ -1014,16 +1022,23 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections aSeqBases->Append(aBase); } if (!aSeqBases->Length()) - return aGEOMObject._retn(); + return aSeq._retn(); // Make pipe - Handle(GEOM_Object) anObject = - GetOperations()->MakePipeWithDifferentSections(aSeqBases,aSeqLocations ,aPath, - theWithContact,theWithCorrections); - if (!GetOperations()->IsDone() || anObject.IsNull()) - return aGEOMObject._retn(); - - return GetObject(anObject); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeWithDifferentSections + (aSeqBases, aSeqLocations, + aPath, theWithContact, + theWithCorrections, IsGenerateGroups); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); } @@ -1032,15 +1047,16 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections * MakePipeWithShellSections */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithShellSections - (const GEOM::ListOfGO& theBases, - const GEOM::ListOfGO& theSubBases, - const GEOM::ListOfGO& theLocations, - GEOM::GEOM_Object_ptr thePath, - CORBA::Boolean theWithContact, - CORBA::Boolean theWithCorrections) +GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipeWithShellSections + (const GEOM::ListOfGO &theBases, + const GEOM::ListOfGO &theSubBases, + const GEOM::ListOfGO &theLocations, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean theWithContact, + CORBA::Boolean theWithCorrections, + CORBA::Boolean IsGenerateGroups) { - GEOM::GEOM_Object_var aGEOMObject; + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; //Set a not done flag GetOperations()->SetNotDone(); @@ -1055,11 +1071,11 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithShellSections aNbLocs = theLocations.length(); if (aNbLocs && aNbBases != aNbLocs) - return aGEOMObject._retn(); + return aSeq._retn(); Handle(GEOM_Object) aPath = GetObjectImpl(thePath); if (aPath.IsNull()) - return aGEOMObject._retn(); + return aSeq._retn(); for (ind = 0; ind < aNbBases; ind++) { Handle(GEOM_Object) aBase = GetObjectImpl(theBases[ind]); @@ -1084,17 +1100,23 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithShellSections } } if (!aSeqBases->Length()) - return aGEOMObject._retn(); + return aSeq._retn(); // Make pipe - Handle(GEOM_Object) anObject = - GetOperations()->MakePipeWithShellSections(aSeqBases, aSeqSubBases, - aSeqLocations, aPath, - theWithContact, theWithCorrections); - if (!GetOperations()->IsDone() || anObject.IsNull()) - return aGEOMObject._retn(); - - return GetObject(anObject); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeWithShellSections + (aSeqBases, aSeqSubBases, + aSeqLocations, aPath, + theWithContact, theWithCorrections, IsGenerateGroups); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); } @@ -1103,11 +1125,12 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithShellSections * MakePipeShellsWithoutPath */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeShellsWithoutPath - (const GEOM::ListOfGO& theBases, - const GEOM::ListOfGO& theLocations) +GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipeShellsWithoutPath + (const GEOM::ListOfGO &theBases, + const GEOM::ListOfGO &theLocations, + CORBA::Boolean IsGenerateGroups) { - GEOM::GEOM_Object_var aGEOMObject; + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; //Set a not done flag GetOperations()->SetNotDone(); @@ -1120,7 +1143,7 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeShellsWithoutPath aNbLocs = theLocations.length(); if (aNbLocs && aNbBases != aNbLocs) - return aGEOMObject._retn(); + return aSeq._retn(); for (ind = 0; ind < aNbBases; ind++) { Handle(GEOM_Object) aBase = GetObjectImpl(theBases[ind]); @@ -1136,16 +1159,22 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeShellsWithoutPath } if (!aSeqBases->Length()) - return aGEOMObject._retn(); + return aSeq._retn(); // Make pipe - Handle(GEOM_Object) anObject = - GetOperations()->MakePipeShellsWithoutPath(aSeqBases,aSeqLocations); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeShellsWithoutPath + (aSeqBases, aSeqLocations, IsGenerateGroups); - if (!GetOperations()->IsDone() || anObject.IsNull()) - return aGEOMObject._retn(); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); - return GetObject(anObject); + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); } //============================================================================= @@ -1153,12 +1182,13 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeShellsWithoutPath * MakePipeBiNormalAlongVector */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeBiNormalAlongVector - (GEOM::GEOM_Object_ptr theBase, - GEOM::GEOM_Object_ptr thePath, - GEOM::GEOM_Object_ptr theVec) +GEOM::ListOfGO *GEOM_I3DPrimOperations_i::MakePipeBiNormalAlongVector + (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath, + GEOM::GEOM_Object_ptr theVec, + CORBA::Boolean IsGenerateGroups) { - GEOM::GEOM_Object_var aGEOMObject; + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; //Set a not done flag GetOperations()->SetNotDone(); @@ -1168,15 +1198,21 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeBiNormalAlongVector Handle(GEOM_Object) aPath = GetObjectImpl(thePath); Handle(GEOM_Object) aVec = GetObjectImpl(theVec); - if (aBase.IsNull() || aPath.IsNull() || aVec.IsNull()) return aGEOMObject._retn(); + if (aBase.IsNull() || aPath.IsNull() || aVec.IsNull()) return aSeq._retn(); //Create the Pipe - Handle(GEOM_Object) anObject = - GetOperations()->MakePipeBiNormalAlongVector(aBase, aPath, aVec); - if (!GetOperations()->IsDone() || anObject.IsNull()) - return aGEOMObject._retn(); - - return GetObject(anObject); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeBiNormalAlongVector + (aBase, aPath, aVec, IsGenerateGroups); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); } //============================================================================= diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh index 733e62833..d5d8ea847 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh @@ -155,9 +155,10 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i : CORBA::Double theAngle, CORBA::Boolean theFuse, CORBA::Boolean theInvert); - - GEOM::GEOM_Object_ptr MakePipe (GEOM::GEOM_Object_ptr theBase, - GEOM::GEOM_Object_ptr thePath); + + GEOM::ListOfGO* MakePipe (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean IsGenerateGroups); GEOM::GEOM_Object_ptr MakeRevolutionAxisAngle (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theAxis, @@ -178,27 +179,35 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i : CORBA::Boolean theModeSolid, CORBA::Double thePreci, CORBA::Boolean theRuled); - - GEOM::GEOM_Object_ptr MakePipeWithDifferentSections(const GEOM::ListOfGO& theBases, - const GEOM::ListOfGO& theLocations, - GEOM::GEOM_Object_ptr thePath, - CORBA::Boolean theWithContact, - CORBA::Boolean theWithCorrections); - - GEOM::GEOM_Object_ptr MakePipeWithShellSections(const GEOM::ListOfGO& theBases, - const GEOM::ListOfGO& theSubBases, - const GEOM::ListOfGO& theLocations, - GEOM::GEOM_Object_ptr thePath, - CORBA::Boolean theWithContact, - CORBA::Boolean theWithCorrections); - - GEOM::GEOM_Object_ptr MakePipeShellsWithoutPath(const GEOM::ListOfGO& theBases, - const GEOM::ListOfGO& theLocations); - - GEOM::GEOM_Object_ptr MakePipeBiNormalAlongVector (GEOM::GEOM_Object_ptr theBase, - GEOM::GEOM_Object_ptr thePath, - GEOM::GEOM_Object_ptr theVec); - + + GEOM::ListOfGO* MakePipeWithDifferentSections + (const GEOM::ListOfGO &theBases, + const GEOM::ListOfGO &theLocations, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean theWithContact, + CORBA::Boolean theWithCorrections, + CORBA::Boolean IsGenerateGroups); + + GEOM::ListOfGO* MakePipeWithShellSections + (const GEOM::ListOfGO &theBases, + const GEOM::ListOfGO &theSubBases, + const GEOM::ListOfGO &theLocations, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean theWithContact, + CORBA::Boolean theWithCorrections, + CORBA::Boolean IsGenerateGroups); + + GEOM::ListOfGO* MakePipeShellsWithoutPath + (const GEOM::ListOfGO &theBases, + const GEOM::ListOfGO &theLocations, + CORBA::Boolean IsGenerateGroups); + + GEOM::ListOfGO* MakePipeBiNormalAlongVector + (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath, + GEOM::GEOM_Object_ptr theVec, + CORBA::Boolean IsGenerateGroups); + GEOM::GEOM_Object_ptr MakeThickening (GEOM::GEOM_Object_ptr theObject, const GEOM::ListOfLong &theFacesIDs, CORBA::Double theOffset, diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 2108c89b8..8501474d8 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -1403,9 +1403,9 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipe (GEOM::GEOM_Object_ptr theBase, beginService( " GEOM_Superv_i::MakePipe" ); MESSAGE("GEOM_Superv_i::MakePipe"); get3DPrimOp(); - GEOM::GEOM_Object_ptr anObj = my3DPrimOp->MakePipe(theBase, thePath); + GEOM::ListOfGO_var aList = my3DPrimOp->MakePipe(theBase, thePath, false); endService( " GEOM_Superv_i::MakePipe" ); - return anObj; + return aList[0]; } //============================================================================= @@ -1512,9 +1512,9 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeWithDifferentSections beginService( " GEOM_Superv_i::MakePipeWithDifferentSections" ); MESSAGE("GEOM_Superv_i::MakePipeWithDifferentSections"); get3DPrimOp(); - GEOM::GEOM_Object_ptr anObj = my3DPrimOp->MakePipeWithDifferentSections(theBases,theLocations, thePath,theWithContact,theWithCorrections); + GEOM::ListOfGO_var aList = my3DPrimOp->MakePipeWithDifferentSections(theBases,theLocations, thePath,theWithContact,theWithCorrections, false); endService( " GEOM_Superv_i::MakePipeWithDifferentSections" ); - return anObj; + return aList[0]; } @@ -1532,12 +1532,13 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeWithShellSections beginService( " GEOM_Superv_i::MakePipeWithShellSections" ); MESSAGE("GEOM_Superv_i::MakePipeWithShellSections"); get3DPrimOp(); - GEOM::GEOM_Object_ptr anObj = + GEOM::ListOfGO_var aList = my3DPrimOp->MakePipeWithShellSections(theBases, theSubBases, theLocations, thePath, - theWithContact, theWithCorrections); + theWithContact, theWithCorrections, + false); endService( " GEOM_Superv_i::MakePipeWithShellSections" ); - return anObj; + return aList[0]; } @@ -1551,10 +1552,10 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeShellsWithoutPath beginService( " GEOM_Superv_i::MakePipeShellsWithoutPath" ); MESSAGE("GEOM_Superv_i::MakePipeShellsWithoutPath"); get3DPrimOp(); - GEOM::GEOM_Object_ptr anObj = - my3DPrimOp->MakePipeShellsWithoutPath(theBases,theLocations); + GEOM::ListOfGO_var aList = + my3DPrimOp->MakePipeShellsWithoutPath(theBases,theLocations, false); endService( " GEOM_Superv_i::MakePipeShellsWithoutPath" ); - return anObj; + return aList[0]; } @@ -1569,10 +1570,10 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeBiNormalAlongVector beginService( " GEOM_Superv_i::MakePipeBiNormalAlongVector" ); MESSAGE("GEOM_Superv_i::MakePipeBiNormalAlongVector"); get3DPrimOp(); - GEOM::GEOM_Object_ptr anObj = - my3DPrimOp->MakePipeBiNormalAlongVector(theBase, thePath, theVec); + GEOM::ListOfGO_var aList = + my3DPrimOp->MakePipeBiNormalAlongVector(theBase, thePath, theVec, false); endService( " GEOM_Superv_i::MakePipeBiNormalAlongVector" ); - return anObj; + return aList[0]; } diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index fabb95341..e2bf0b10b 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -3869,41 +3869,97 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): return anObj ## Create a shape by extrusion of the base shape along - # the path shape. The path shape can be a wire or an edge. + # the path shape. The path shape can be a wire or an edge. It is + # possible to generate groups along with the result by means of + # setting the flag \a IsGenerateGroups.
    + # If \a thePath is a closed edge or wire and \a IsGenerateGroups is + # set, an error is occured. If \a thePath is not closed edge/wire, + # the following groups are returned: + # - If \a theBase is unclosed edge or wire: "Down", "Up", "Side1", + # "Side2"; + # - If \a theBase is closed edge or wire, face or shell: "Down", "Up", + # "Other". + # . + # "Down" and "Up" groups contain: + # - Edges if \a theBase is edge or wire; + # - Faces if \a theBase is face or shell.
    + # . + # "Side1" and "Side2" groups contain edges generated from the first + # and last vertices of \a theBase. The first and last vertices are + # determined taking into account edge/wire orientation.
    + # "Other" group represents faces generated from the bounding edges of + # \a theBase. + # # @param theBase Base shape to be extruded. # @param thePath Path shape to extrude the base shape along it. + # @param IsGenerateGroups flag that tells if it is necessary to + # create groups. It is equal to False by default. # @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 pipe. + # @return New GEOM.GEOM_Object, containing the created pipe if + # \a IsGenerateGroups is not set. Otherwise it returns new + # GEOM.ListOfGO. Its first element is the created pipe, the + # remaining ones are created groups. # # @ref tui_creation_pipe "Example" @ManageTransactions("PrimOp") - def MakePipe(self, theBase, thePath, theName=None): + def MakePipe(self, theBase, thePath, + IsGenerateGroups=False, theName=None): """ Create a shape by extrusion of the base shape along - the path shape. The path shape can be a wire or an edge. + the path shape. The path shape can be a wire or an edge. It is + possible to generate groups along with the result by means of + setting the flag IsGenerateGroups. + If thePath is a closed edge or wire and IsGenerateGroups is + set, an error is occured. If thePath is not closed edge/wire, + the following groups are returned: + - If theBase is unclosed edge or wire: "Down", "Up", "Side1", + "Side2"; + - If theBase is closed edge or wire, face or shell: "Down", "Up", + "Other". + "Down" and "Up" groups contain: + - Edges if theBase is edge or wire; + - Faces if theBase is face or shell. + "Side1" and "Side2" groups contain edges generated from the first + and last vertices of theBase. The first and last vertices are + determined taking into account edge/wire orientation. + "Other" group represents faces generated from the bounding edges of + theBase. Parameters: theBase Base shape to be extruded. thePath Path shape to extrude the base shape along it. + IsGenerateGroups flag that tells if it is necessary to + create groups. It is equal to False by default. 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 pipe. + New GEOM.GEOM_Object, containing the created pipe if + IsGenerateGroups is not set. Otherwise it returns new + GEOM.ListOfGO. Its first element is the created pipe, the + remaining ones are created groups. """ # Example: see GEOM_TestAll.py - anObj = self.PrimOp.MakePipe(theBase, thePath) + aList = self.PrimOp.MakePipe(theBase, thePath, IsGenerateGroups) RaiseIfFailed("MakePipe", self.PrimOp) - self._autoPublish(anObj, theName, "pipe") - return anObj + + if IsGenerateGroups: + self._autoPublish(aList, theName, "pipe") + return aList + + self._autoPublish(aList[0], theName, "pipe") + return aList[0] ## Create a shape by extrusion of the profile shape along # the path shape. The path shape can be a wire or an edge. # the several profiles can be specified in the several locations of path. + # It is possible to generate groups along with the result by means of + # setting the flag \a IsGenerateGroups. For detailed information on + # groups that can be created please see the method MakePipe(). # @param theSeqBases - list of Bases shape to be extruded. # @param theLocations - list of locations on the path corresponding # specified list of the Bases shapes. Number of locations @@ -3913,21 +3969,30 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): # contact with the spine. # @param theWithCorrection - defining that the section is rotated to be # orthogonal to the spine tangent in the correspondent point + # @param IsGenerateGroups - flag that tells if it is necessary to + # create groups. It is equal to False by default. # @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 pipe. + # @return New GEOM.GEOM_Object, containing the created pipe if + # \a IsGenerateGroups is not set. Otherwise it returns new + # GEOM.ListOfGO. Its first element is the created pipe, the + # remaining ones are created groups. # # @ref tui_creation_pipe_with_diff_sec "Example" @ManageTransactions("PrimOp") def MakePipeWithDifferentSections(self, theSeqBases, theLocations, thePath, - theWithContact, theWithCorrection, theName=None): + theWithContact, theWithCorrection, + IsGenerateGroups=False, theName=None): """ Create a shape by extrusion of the profile shape along the path shape. The path shape can be a wire or an edge. the several profiles can be specified in the several locations of path. + It is possible to generate groups along with the result by means of + setting the flag IsGenerateGroups. For detailed information on + groups that can be created please see the method geompy.MakePipe(). Parameters: theSeqBases - list of Bases shape to be extruded. @@ -3939,23 +4004,37 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): contact with the spine(0/1) theWithCorrection - defining that the section is rotated to be orthogonal to the spine tangent in the correspondent point (0/1) + IsGenerateGroups - flag that tells if it is necessary to + create groups. It is equal to False by default. 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 pipe. + New GEOM.GEOM_Object, containing the created pipe if + IsGenerateGroups is not set. Otherwise it returns new + GEOM.ListOfGO. Its first element is the created pipe, the + remaining ones are created groups. """ - anObj = self.PrimOp.MakePipeWithDifferentSections(theSeqBases, + aList = self.PrimOp.MakePipeWithDifferentSections(theSeqBases, theLocations, thePath, - theWithContact, theWithCorrection) + theWithContact, theWithCorrection, + IsGenerateGroups) RaiseIfFailed("MakePipeWithDifferentSections", self.PrimOp) - self._autoPublish(anObj, theName, "pipe") - return anObj + + if IsGenerateGroups: + self._autoPublish(aList, theName, "pipe") + return aList + + self._autoPublish(aList[0], theName, "pipe") + return aList[0] ## Create a shape by extrusion of the profile shape along - # the path shape. The path shape can be a wire or a edge. + # the path shape. The path shape can be a wire or an edge. # the several profiles can be specified in the several locations of path. + # It is possible to generate groups along with the result by means of + # setting the flag \a IsGenerateGroups. For detailed information on + # groups that can be created please see the method MakePipe(). # @param theSeqBases - list of Bases shape to be extruded. Base shape must be # shell or face. If number of faces in neighbour sections # aren't coincided result solid between such sections will @@ -3974,21 +4053,30 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): # contact with the spine. # @param theWithCorrection - defining that the section is rotated to be # orthogonal to the spine tangent in the correspondent point + # @param IsGenerateGroups - flag that tells if it is necessary to + # create groups. It is equal to False by default. # @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 solids. + # @return New GEOM.GEOM_Object, containing the created solids if + # \a IsGenerateGroups is not set. Otherwise it returns new + # GEOM.ListOfGO. Its first element is the created solids, the + # remaining ones are created groups. # # @ref tui_creation_pipe_with_shell_sec "Example" @ManageTransactions("PrimOp") def MakePipeWithShellSections(self, theSeqBases, theSeqSubBases, theLocations, thePath, - theWithContact, theWithCorrection, theName=None): + theWithContact, theWithCorrection, + IsGenerateGroups=False, theName=None): """ Create a shape by extrusion of the profile shape along - the path shape. The path shape can be a wire or a edge. + the path shape. The path shape can be a wire or an edge. the several profiles can be specified in the several locations of path. + It is possible to generate groups along with the result by means of + setting the flag IsGenerateGroups. For detailed information on + groups that can be created please see the method geompy.MakePipe(). Parameters: theSeqBases - list of Bases shape to be extruded. Base shape must be @@ -4009,19 +4097,30 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): contact with the spine (0/1) theWithCorrection - defining that the section is rotated to be orthogonal to the spine tangent in the correspondent point (0/1) + IsGenerateGroups - flag that tells if it is necessary to + create groups. It is equal to False by default. 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 solids. + New GEOM.GEOM_Object, containing the created solids if + IsGenerateGroups is not set. Otherwise it returns new + GEOM.ListOfGO. Its first element is the created solids, the + remaining ones are created groups. """ - anObj = self.PrimOp.MakePipeWithShellSections(theSeqBases, theSeqSubBases, + aList = self.PrimOp.MakePipeWithShellSections(theSeqBases, theSeqSubBases, theLocations, thePath, - theWithContact, theWithCorrection) + theWithContact, theWithCorrection, + IsGenerateGroups) RaiseIfFailed("MakePipeWithShellSections", self.PrimOp) - self._autoPublish(anObj, theName, "pipe") - return anObj + + if IsGenerateGroups: + self._autoPublish(aList, theName, "pipe") + return aList + + self._autoPublish(aList[0], theName, "pipe") + return aList[0] ## Create a shape by extrusion of the profile shape along # the path shape. This function is used only for debug pipe @@ -4031,7 +4130,8 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): @ManageTransactions("PrimOp") def MakePipeWithShellSectionsBySteps(self, theSeqBases, theSeqSubBases, theLocations, thePath, - theWithContact, theWithCorrection, theName=None): + theWithContact, theWithCorrection, + IsGenerateGroups=False, theName=None): """ Create a shape by extrusion of the profile shape along the path shape. This function is used only for debug pipe @@ -4050,16 +4150,17 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): tmpLocations = [ theLocations[i-1], theLocations[i] ] tmpSeqSubBases = [] if nbsubsect>0: tmpSeqSubBases = [ theSeqSubBases[i-1], theSeqSubBases[i] ] - anObj = self.PrimOp.MakePipeWithShellSections(tmpSeqBases, tmpSeqSubBases, + aList = self.PrimOp.MakePipeWithShellSections(tmpSeqBases, tmpSeqSubBases, tmpLocations, thePath, - theWithContact, theWithCorrection) + theWithContact, theWithCorrection, + IsGenerateGroups) if self.PrimOp.IsDone() == 0: print "Problems with pipe creation between ",i," and ",i+1," sections" RaiseIfFailed("MakePipeWithShellSections", self.PrimOp) break else: print "Pipe between ",i," and ",i+1," sections is OK" - res.append(anObj) + res.append(aList[0]) pass pass @@ -4069,57 +4170,92 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): self._autoPublish(resc, theName, "pipe") return resc - ## Create solids between given sections + ## Create solids between given sections. + # It is possible to generate groups along with the result by means of + # setting the flag \a IsGenerateGroups. For detailed information on + # groups that can be created please see the method MakePipe(). # @param theSeqBases - list of sections (shell or face). # @param theLocations - list of corresponding vertexes + # @param IsGenerateGroups - flag that tells if it is necessary to + # create groups. It is equal to False by default. # @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 solids. + # @return New GEOM.GEOM_Object, containing the created solids if + # \a IsGenerateGroups is not set. Otherwise it returns new + # GEOM.ListOfGO. Its first element is the created solids, the + # remaining ones are created groups. # # @ref tui_creation_pipe_without_path "Example" @ManageTransactions("PrimOp") - def MakePipeShellsWithoutPath(self, theSeqBases, theLocations, theName=None): + def MakePipeShellsWithoutPath(self, theSeqBases, theLocations, + IsGenerateGroups=False, theName=None): """ - Create solids between given sections + Create solids between given sections. + It is possible to generate groups along with the result by means of + setting the flag IsGenerateGroups. For detailed information on + groups that can be created please see the method geompy.MakePipe(). Parameters: theSeqBases - list of sections (shell or face). theLocations - list of corresponding vertexes + IsGenerateGroups - flag that tells if it is necessary to + create groups. It is equal to False by default. 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 solids. + New GEOM.GEOM_Object, containing the created solids if + IsGenerateGroups is not set. Otherwise it returns new + GEOM.ListOfGO. Its first element is the created solids, the + remaining ones are created groups. """ - anObj = self.PrimOp.MakePipeShellsWithoutPath(theSeqBases, theLocations) + aList = self.PrimOp.MakePipeShellsWithoutPath(theSeqBases, theLocations, + IsGenerateGroups) RaiseIfFailed("MakePipeShellsWithoutPath", self.PrimOp) - self._autoPublish(anObj, theName, "pipe") - return anObj + + if IsGenerateGroups: + self._autoPublish(aList, theName, "pipe") + return aList + + self._autoPublish(aList[0], theName, "pipe") + return aList[0] ## Create a shape by extrusion of the base shape along # the path shape with constant bi-normal direction along the given vector. # The path shape can be a wire or an edge. + # It is possible to generate groups along with the result by means of + # setting the flag \a IsGenerateGroups. For detailed information on + # groups that can be created please see the method MakePipe(). # @param theBase Base shape to be extruded. # @param thePath Path shape to extrude the base shape along it. # @param theVec Vector defines a constant binormal direction to keep the # same angle beetween the direction and the sections # along the sweep surface. + # @param IsGenerateGroups flag that tells if it is necessary to + # create groups. It is equal to False by default. # @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 pipe. + # @return New GEOM.GEOM_Object, containing the created pipe if + # \a IsGenerateGroups is not set. Otherwise it returns new + # GEOM.ListOfGO. Its first element is the created pipe, the + # remaining ones are created groups. # # @ref tui_creation_pipe "Example" @ManageTransactions("PrimOp") - def MakePipeBiNormalAlongVector(self, theBase, thePath, theVec, theName=None): + def MakePipeBiNormalAlongVector(self, theBase, thePath, theVec, + IsGenerateGroups=False, theName=None): """ Create a shape by extrusion of the base shape along the path shape with constant bi-normal direction along the given vector. The path shape can be a wire or an edge. + It is possible to generate groups along with the result by means of + setting the flag IsGenerateGroups. For detailed information on + groups that can be created please see the method geompy.MakePipe(). Parameters: theBase Base shape to be extruded. @@ -4127,18 +4263,29 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): theVec Vector defines a constant binormal direction to keep the same angle beetween the direction and the sections along the sweep surface. + IsGenerateGroups flag that tells if it is necessary to + create groups. It is equal to False by default. 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 pipe. + New GEOM.GEOM_Object, containing the created pipe if + IsGenerateGroups is not set. Otherwise it returns new + GEOM.ListOfGO. Its first element is the created pipe, the + remaining ones are created groups. """ # Example: see GEOM_TestAll.py - anObj = self.PrimOp.MakePipeBiNormalAlongVector(theBase, thePath, theVec) + aList = self.PrimOp.MakePipeBiNormalAlongVector(theBase, thePath, + theVec, IsGenerateGroups) RaiseIfFailed("MakePipeBiNormalAlongVector", self.PrimOp) - self._autoPublish(anObj, theName, "pipe") - return anObj + + if IsGenerateGroups: + self._autoPublish(aList, theName, "pipe") + return aList + + self._autoPublish(aList[0], theName, "pipe") + return aList[0] ## Makes a thick solid from a shape. If the input is a surface shape # (face or shell) the result is a thick solid. If an input shape is diff --git a/src/GenerationGUI/CMakeLists.txt b/src/GenerationGUI/CMakeLists.txt index 181522a3c..5f7afb3a1 100755 --- a/src/GenerationGUI/CMakeLists.txt +++ b/src/GenerationGUI/CMakeLists.txt @@ -37,6 +37,7 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/src/GEOMImpl ${PROJECT_SOURCE_DIR}/src/GEOMGUI ${PROJECT_SOURCE_DIR}/src/GEOMBase + ${PROJECT_SOURCE_DIR}/src/GEOMUtils ${PROJECT_SOURCE_DIR}/src/DlgRef ${PROJECT_BINARY_DIR}/src/DlgRef ${CMAKE_CURRENT_SOURCE_DIR} @@ -55,6 +56,7 @@ SET(_link_LIBRARIES GEOMClient GEOMImpl GEOMBase + GEOMUtils GEOM DlgRef ) diff --git a/src/GenerationGUI/GenerationGUI_PipeDlg.cxx b/src/GenerationGUI/GenerationGUI_PipeDlg.cxx index fe972a26c..33b43b09f 100644 --- a/src/GenerationGUI/GenerationGUI_PipeDlg.cxx +++ b/src/GenerationGUI/GenerationGUI_PipeDlg.cxx @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -36,10 +37,6 @@ #include #include -#include -#include -#include -#include #include #include @@ -53,7 +50,13 @@ //================================================================================= GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidget* parent, bool modal, Qt::WindowFlags fl) - : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl) + : GEOMBase_Skeleton (theGeometryGUI, parent, modal, fl), + myGenGroupCheckGP (0), + myPrefixLblGP (0), + myPrefixEditGP (0), + myGenGroupCheckGMP (0), + myPrefixLblGMP (0), + myPrefixEditGMP (0) { QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPE"))); QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); @@ -81,6 +84,19 @@ GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidg GroupPoints->PushButton3->setIcon(image1); GroupPoints->CheckButton1->setText(tr("GEOM_SELECT_UNPUBLISHED_EDGES")); + // Add widgets for group generation + QGridLayout *aLayoutGP = (QGridLayout *)GroupPoints->GroupBox1->layout(); + + myGenGroupCheckGP = + new QCheckBox(tr("GEOM_GENERATE_GROUPS"), GroupPoints->GroupBox1); + myPrefixLblGP = + new QLabel (tr("GEOM_GROUP_NAME_PREFIX"), GroupPoints->GroupBox1); + myPrefixEditGP = new QLineEdit(GroupPoints->GroupBox1); + + aLayoutGP->addWidget(myGenGroupCheckGP, 4, 0, 1, 3); + aLayoutGP->addWidget(myPrefixLblGP, 5, 0, 1, 2); + aLayoutGP->addWidget(myPrefixEditGP, 5, 2); + GroupMakePoints = new DlgRef_3Sel2Check3Spin(centralWidget()); GroupMakePoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); @@ -92,6 +108,12 @@ GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidg GroupMakePoints->PushButton3->setIcon(image1); GroupMakePoints->CheckBox1->setText(tr("GEOM_WITH_CONTACT")); GroupMakePoints->CheckBox2->setText(tr("GEOM_WITH_CORRECTION")); + GroupMakePoints->SpinBox1->setAttribute(Qt::WA_DeleteOnClose); + GroupMakePoints->SpinBox2->setAttribute(Qt::WA_DeleteOnClose); + GroupMakePoints->SpinBox3->setAttribute(Qt::WA_DeleteOnClose); + GroupMakePoints->TextLabel4->setAttribute(Qt::WA_DeleteOnClose); + GroupMakePoints->TextLabel5->setAttribute(Qt::WA_DeleteOnClose); + GroupMakePoints->TextLabel6->setAttribute(Qt::WA_DeleteOnClose); GroupMakePoints->SpinBox1->close(); GroupMakePoints->SpinBox2->close(); GroupMakePoints->SpinBox3->close(); @@ -99,6 +121,19 @@ GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidg GroupMakePoints->TextLabel5->close(); GroupMakePoints->TextLabel6->close(); + // Add widgets for group generation + QGridLayout *aLayoutGMP = (QGridLayout *)GroupMakePoints->GroupBox1->layout(); + + myGenGroupCheckGMP = + new QCheckBox(tr("GEOM_GENERATE_GROUPS"), GroupMakePoints->GroupBox1); + myPrefixLblGMP = + new QLabel (tr("GEOM_GROUP_NAME_PREFIX"), GroupMakePoints->GroupBox1); + myPrefixEditGMP = new QLineEdit(GroupMakePoints->GroupBox1); + + aLayoutGMP->addWidget(myGenGroupCheckGMP, 8, 0, 1, 3); + aLayoutGMP->addWidget(myPrefixLblGMP, 9, 0, 1, 2); + aLayoutGMP->addWidget(myPrefixEditGMP, 9, 2); + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); layout->addWidget(GroupPoints); @@ -166,6 +201,8 @@ void GenerationGUI_PipeDlg::Init() connect(GroupMakePoints->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupMakePoints->CheckBox1, SIGNAL(clicked()), this, SLOT(processPreview())); connect(GroupMakePoints->CheckBox2, SIGNAL(clicked()), this, SLOT(processPreview())); + connect(myGenGroupCheckGP, SIGNAL(toggled(bool)), this, SLOT(GenGroupClicked(bool))); + connect(myGenGroupCheckGMP, SIGNAL(toggled(bool)), this, SLOT(GenGroupClicked(bool))); initName(tr("GEOM_PIPE")); resize(100,100); @@ -177,6 +214,7 @@ void GenerationGUI_PipeDlg::Init() GroupPoints->PushButton1->click(); SelectionIntoArgument(); + updateGenGroup(); } //================================================================================= @@ -195,6 +233,8 @@ void GenerationGUI_PipeDlg::ConstructorsClicked( int constructorId ) GroupPoints->PushButton3->hide(); GroupPoints->LineEdit3->hide(); GroupPoints->PushButton1->click(); + myGenGroupCheckGP->setChecked(false); + resetGenGroup(myGenGroupCheckGP, false, true); break; case 1: GroupMakePoints->hide(); @@ -203,11 +243,15 @@ void GenerationGUI_PipeDlg::ConstructorsClicked( int constructorId ) GroupPoints->PushButton3->show(); GroupPoints->LineEdit3->show(); GroupPoints->PushButton1->click(); + myGenGroupCheckGP->setChecked(false); + resetGenGroup(myGenGroupCheckGP, false, true); break; case 2: GroupPoints->hide(); GroupMakePoints->show(); GroupMakePoints->PushButton1->click(); + myGenGroupCheckGMP->setChecked(false); + resetGenGroup(myGenGroupCheckGMP, false, true); break; default: break; @@ -240,6 +284,7 @@ void GenerationGUI_PipeDlg::SelectionTypeButtonClicked() if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) { myEditCurrentArgument->setText(""); myPath.nullify(); + updateGenGroup(); } processPreview(); } @@ -306,6 +351,7 @@ void GenerationGUI_PipeDlg::SelectionIntoArgument() else if ( myBaseObjects.isEmpty() ) GroupPoints->PushButton1->click(); } + updateGenGroup(); } else if (myEditCurrentArgument == GroupPoints->LineEdit3) { myVec = getSelected( TopAbs_EDGE ); @@ -345,6 +391,7 @@ void GenerationGUI_PipeDlg::SelectionIntoArgument() QString aName = GEOMBase::GetName( myPath.get() ); myEditCurrentArgument->setText( aName ); } + updateGenGroup(); } processPreview(); @@ -480,24 +527,42 @@ bool GenerationGUI_PipeDlg::isValid (QString&) //================================================================================= bool GenerationGUI_PipeDlg::execute (ObjectList& objects) { - GEOM::GEOM_Object_var anObj; + GEOM::ListOfGO_var aList; GEOM::GEOM_I3DPrimOperations_var anOper = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation()); + bool doGroups = !IsPreview(); + + myGroupObjectsMap.clear(); + switch( getConstructorId() ) { case 0: case 1: + if (doGroups) { + doGroups = myGenGroupCheckGP->isEnabled() && + myGenGroupCheckGP->isChecked(); + } + for (int i = 0; i < myBaseObjects.count(); i++) { switch ( getConstructorId() ) { case 0 : - anObj = anOper->MakePipe(myBaseObjects[i].get(), myPath.get()); - break; + aList = anOper->MakePipe(myBaseObjects[i].get(), + myPath.get(), doGroups); + break; case 1 : - anObj = anOper->MakePipeBiNormalAlongVector(myBaseObjects[i].get(), myPath.get(), myVec.get()); - break; + aList = anOper->MakePipeBiNormalAlongVector + (myBaseObjects[i].get(), myPath.get(), myVec.get(), doGroups); + break; + } + + if (aList->length() > 0) { + if (doGroups) { + addGroups(aList); + } + + if (!aList[0]->_is_nil()) { + objects.push_back(aList[0]._retn()); + } } - - if (!anObj->_is_nil()) - objects.push_back(anObj._retn()); } break; case 2: @@ -507,17 +572,31 @@ bool GenerationGUI_PipeDlg::execute (ObjectList& objects) myBaseGO->length( myBaseObjects.count() ); myLocationsGO->length( myLocations.count() ); for (int i = 0; i < myBaseObjects.count(); i++) { - myBaseGO[i] = myBaseObjects[i].copy(); + myBaseGO[i] = myBaseObjects[i].copy(); } for (int i = 0; i < myLocations.count(); i++) { - myLocationsGO[i] = myLocations[i].copy(); + myLocationsGO[i] = myLocations[i].copy(); + } + + if (doGroups) { + doGroups = myGenGroupCheckGMP->isEnabled() && + myGenGroupCheckGMP->isChecked(); + } + + aList = anOper->MakePipeWithDifferentSections + (myBaseGO.in(), myLocationsGO.in(), myPath.get(), + GroupMakePoints->CheckBox1->isChecked(), + GroupMakePoints->CheckBox2->isChecked(), doGroups); + + if (aList->length() > 0) { + if (doGroups) { + addGroups(aList); + } + + if (!aList[0]->_is_nil()) { + objects.push_back(aList[0]._retn()); + } } - - anObj = anOper->MakePipeWithDifferentSections(myBaseGO.in(), myLocationsGO.in(), myPath.get(), - GroupMakePoints->CheckBox1->isChecked(), - GroupMakePoints->CheckBox2->isChecked()); - if (!anObj->_is_nil()) - objects.push_back(anObj._retn()); } break; default: @@ -545,6 +624,66 @@ bool GenerationGUI_PipeDlg::extractPrefix() const return myBaseObjects.count() > 1; } +//================================================================================= +// function : restoreSubShapes +// purpose : virtual method to restore tree of argument's sub-shapes under +// the resulting shape. Redefined from GEOMBase_Helper class. +//================================================================================= +void GenerationGUI_PipeDlg::restoreSubShapes + (SALOMEDS::Study_ptr theStudy, SALOMEDS::SObject_ptr theSObject) +{ + QCheckBox *aGenGroupCheck = NULL; + QLineEdit *aPrefixEdit = NULL; + + switch (getConstructorId()) { + case 0 : + case 1 : + aGenGroupCheck = myGenGroupCheckGP; + aPrefixEdit = myPrefixEditGP; + break; + case 2 : + aGenGroupCheck = myGenGroupCheckGMP; + aPrefixEdit = myPrefixEditGMP; + break; + default: + break; + } + + if (aGenGroupCheck == NULL || !aGenGroupCheck->isChecked()) { + return; + } + + // get Object from SObject + GEOM::GEOM_Object_var aFather = GEOM::GEOM_Object::_narrow + (theSObject->GetObject()); + + if (CORBA::is_nil(aFather)) { + return; + } + + ObjectMap::const_iterator anIter = + myGroupObjectsMap.find(aFather->GetEntry()); + QString aPrefix = aPrefixEdit->text(); + bool hasPrefix = !aPrefix.isEmpty(); + + if (anIter != myGroupObjectsMap.end()) { + QList::const_iterator it = anIter->second.begin(); + + for (; it != anIter->second.end(); it++) { + // Compose the name + QString aName; + + if (hasPrefix) { + aName = aPrefix + "_"; + } + + aName += tr((*it)->GetName()); + getGeomEngine()->AddInStudy(theStudy, (*it).get(), + aName.toStdString().c_str(), aFather); + } + } +} + //================================================================================= // function : getSourceObjects // purpose : virtual method to get source objects @@ -557,3 +696,102 @@ QList GenerationGUI_PipeDlg::getSourceObjects() res << myLocations[i]; return res; } + +//================================================================================= +// function : GenGroupClicked +// purpose : Slot to treat checking "Generate groups" check box. +//================================================================================= +void GenerationGUI_PipeDlg::GenGroupClicked(bool isChecked) +{ + resetGenGroup((QCheckBox *)sender(), isChecked, false); +} + +//================================================================================= +// function : updateGenGroup +// purpose : Update "Generate groups" widgets depending on the path. +//================================================================================= +void GenerationGUI_PipeDlg::updateGenGroup() +{ + bool isEnable = true; + + if (myPath) { + // Check if the path is closed. + TopoDS_Shape aShapePath; + + if (GEOMBase::GetShape(myPath.get(), aShapePath)) { + isEnable = GEOMUtils::IsOpenPath(aShapePath); + } + } + + QCheckBox *aGenGroupCheck = NULL; + + switch (getConstructorId()) { + case 0 : + case 1 : + aGenGroupCheck = myGenGroupCheckGP; + break; + case 2 : + aGenGroupCheck = myGenGroupCheckGMP; + break; + default: + break; + } + + if (aGenGroupCheck != NULL) { + const bool isChecked = aGenGroupCheck->isChecked(); + + aGenGroupCheck->setEnabled(isEnable); + resetGenGroup(aGenGroupCheck, isEnable && isChecked, false); + } +} + +//================================================================================= +// function : resetGenGroup +// purpose : Resets data of "Generate groups" widgets. +//================================================================================= +void GenerationGUI_PipeDlg::resetGenGroup(QCheckBox *theGenGroup, + const bool isChecked, + const bool isClearPrefix) +{ + QLabel *aPrefixLbl = NULL; + QLineEdit *aPrefixEdit = NULL; + + if (theGenGroup == myGenGroupCheckGP) { + aPrefixLbl = myPrefixLblGP; + aPrefixEdit = myPrefixEditGP; + } else if (theGenGroup == myGenGroupCheckGMP) { + aPrefixLbl = myPrefixLblGMP; + aPrefixEdit = myPrefixEditGMP; + } + + if (aPrefixLbl != NULL) { + aPrefixLbl->setEnabled(isChecked); + aPrefixEdit->setEnabled(isChecked); + + if (isClearPrefix) { + aPrefixEdit->setText(""); + } + } +} + +//================================================================================= +// function : addGroups +// purpose : Add result groups to the list of groups. +//================================================================================= +void GenerationGUI_PipeDlg::addGroups(GEOM::ListOfGO_var &theResult) +{ + const int aNbObj = theResult->length(); + + if (aNbObj > 0) { + if (!theResult[0]->_is_nil()) { + QString anEntry = theResult[0]->GetEntry(); + int i; + + for (i = 1; i < aNbObj; ++i) { + if (!theResult[i]->_is_nil()) { + myGroupObjectsMap[anEntry].append(GEOM::GeomObjPtr(theResult[i])); + } + } + } + } +} diff --git a/src/GenerationGUI/GenerationGUI_PipeDlg.h b/src/GenerationGUI/GenerationGUI_PipeDlg.h index 868b465af..4b2d88efd 100644 --- a/src/GenerationGUI/GenerationGUI_PipeDlg.h +++ b/src/GenerationGUI/GenerationGUI_PipeDlg.h @@ -30,6 +30,9 @@ #include "GEOMBase_Skeleton.h" #include "GEOM_GenericObjPtr.h" +typedef std::map > ObjectMap; + + class DlgRef_3Sel1Check; class DlgRef_3Sel2Check3Spin; @@ -52,11 +55,20 @@ protected: virtual bool execute( ObjectList& ); virtual void addSubshapesToStudy(); virtual bool extractPrefix() const; + virtual void restoreSubShapes + (SALOMEDS::Study_ptr, SALOMEDS::SObject_ptr); virtual QList getSourceObjects(); private: void Init(); void enterEvent( QEvent* ); + void updateGenGroup(); + void resetGenGroup + (QCheckBox *theGenGroup, + const bool isChecked, + const bool isClearPrefix); + void addGroups + (GEOM::ListOfGO_var &theResult); private: QList myBaseObjects; /* Base shapes */ @@ -66,6 +78,13 @@ private: DlgRef_3Sel1Check* GroupPoints; DlgRef_3Sel2Check3Spin* GroupMakePoints; + QCheckBox *myGenGroupCheckGP; + QLabel *myPrefixLblGP; + QLineEdit *myPrefixEditGP; + QCheckBox *myGenGroupCheckGMP; + QLabel *myPrefixLblGMP; + QLineEdit *myPrefixEditGMP; + ObjectMap myGroupObjectsMap; private slots: void ClickOnOk(); @@ -75,6 +94,7 @@ private slots: void SetEditCurrentArgument(); void ConstructorsClicked( int ); void SelectionTypeButtonClicked(); + void GenGroupClicked(bool); }; #endif // GENERATIONGUI_PIPEDLG_H -- 2.39.2