From 3e638dba7a098ec5ee4132628e818e5922cefdb2 Mon Sep 17 00:00:00 2001 From: prascle Date: Wed, 20 Mar 2013 10:05:47 +0000 Subject: [PATCH] PR: synchro V7_main tag mergefrom_V6_main_19Mar13 --- doc/salome/examples/CMakeLists.txt | 23 + .../examples/advanced_geom_objs_ex01.py | 39 +- doc/salome/gui/GEOM/images/pipetshape_dlg.png | Bin 40204 -> 50402 bytes .../gui/GEOM/images/pipetshape_pos_dlg.png | Bin 0 -> 28941 bytes .../gui/GEOM/images/pipetshape_thr_dlg.png | Bin 0 -> 66253 bytes doc/salome/gui/GEOM/images/pipetshapethr.png | Bin 0 -> 22965 bytes .../gui/GEOM/input/creating_pipetshape.doc | 49 +- doc/salome/gui/GEOM/static/header.html.in | 2 + doc/salome/gui/GEOM/static/header_py.html.in | 2 + doc/salome/tui/static/header.html.in | 2 + idl/GEOM_Gen.idl | 252 +++ idl/Makefile.am | 3 +- resources/Makefile.am | 2 +- resources/pipetshape_section.png | Bin 0 -> 12959 bytes src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.cxx | 1828 ++++++++++------- src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.h | 135 +- src/GEOMGUI/GEOM_images.ts | 4 + src/GEOMGUI/GEOM_msg_en.ts | 40 + src/GEOMGUI/GEOM_msg_fr.ts | 40 + src/GEOMImpl/GEOMImpl_BooleanDriver.cxx | 48 +- src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx | 1159 ++++++++--- src/GEOMImpl/GEOMImpl_IAdvancedOperations.hxx | 89 + src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx | 69 +- src/GEOMImpl/GEOMImpl_IPipeTShape.hxx | 51 +- src/GEOMImpl/GEOMImpl_PipeTShapeDriver.cxx | 87 +- src/GEOMImpl/GEOMImpl_PipeTShapeDriver.hxx | 27 +- src/GEOMUtils/GEOMUtils.cxx | 101 + src/GEOMUtils/GEOMUtils.hxx | 22 + src/GEOM_I/GEOM_IAdvancedOperations_i.cc | 424 +++- src/GEOM_I/GEOM_IAdvancedOperations_i.hh | 107 +- 30 files changed, 3213 insertions(+), 1392 deletions(-) create mode 100644 doc/salome/examples/CMakeLists.txt create mode 100644 doc/salome/gui/GEOM/images/pipetshape_pos_dlg.png create mode 100644 doc/salome/gui/GEOM/images/pipetshape_thr_dlg.png create mode 100644 doc/salome/gui/GEOM/images/pipetshapethr.png create mode 100644 resources/pipetshape_section.png diff --git a/doc/salome/examples/CMakeLists.txt b/doc/salome/examples/CMakeLists.txt new file mode 100644 index 000000000..1e4a02716 --- /dev/null +++ b/doc/salome/examples/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (C) 2012 CEA/DEN, EDF R&D, OPEN CASCADE +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +SET(docdir ${CMAKE_INSTALL_PREFIX}/share/doc/salome) +FILE(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.py") +INSTALL(FILES ${files} DESTINATION ${docdir}/examples/GEOM) + diff --git a/doc/salome/examples/advanced_geom_objs_ex01.py b/doc/salome/examples/advanced_geom_objs_ex01.py index a3b2d5968..b2499e906 100644 --- a/doc/salome/examples/advanced_geom_objs_ex01.py +++ b/doc/salome/examples/advanced_geom_objs_ex01.py @@ -30,6 +30,16 @@ id_pipetshape_position = geompy.addToStudy(pipetshape_position[0],"PipeTShape_po for g in pipetshape_position[1:]: geompy.addToStudyInFather(pipetshape_position[0], g, g.GetName()) +# create PipeTShape object with left thickness reduction +pipetshape_thr = geompy.MakePipeTShape(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, + theRL=60, theWL=20, theLtransL=40, theLthinL=20) + +# add object in the study +id_pipetshape_thr = geompy.addToStudy(pipetshape_thr[0],"PipeTShape_left_thickness_reduction") +# add groups in the study +for g in pipetshape_thr[1:]: + geompy.addToStudyInFather(pipetshape_thr[0], g, g.GetName()) + # create PipeTShape with chamfer object pipetshapechamfer = geompy.MakePipeTShapeChamfer(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 20.0, 20.0) @@ -48,6 +58,17 @@ id_pipetshapechamfer_position = geompy.addToStudy(pipetshapechamfer_position[0], for g in pipetshapechamfer_position[1:]: geompy.addToStudyInFather(pipetshapechamfer_position[0], g, g.GetName()) +# create PipeTShape with chamfer object with left and right thickness reductions +pipetshapechamfer_thr = geompy.MakePipeTShapeChamfer(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 20.0, 20.0, + theRL=60, theWL=20, theLtransL=40, theLthinL=20, + theRR=40, theWR=10, theLtransR=60, theLthinR=30) + +# add object in the study +id_pipetshapechamfer_thr = geompy.addToStudy(pipetshapechamfer_thr[0],"PipeTShapeChamfer_two_thickness_reductions") +# add groups in the study +for g in pipetshapechamfer_thr[1:]: + geompy.addToStudyInFather(pipetshapechamfer_thr[0], g, g.GetName()) + # create PipeTShape with fillet object pipetshapefillet = geompy.MakePipeTShapeFillet(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 5.0) @@ -65,12 +86,28 @@ id_pipetshapefillet_position = geompy.addToStudy(pipetshapefillet_position[0],"P # add groups in the study for g in pipetshapefillet_position[1:]: geompy.addToStudyInFather(pipetshapefillet_position[0], g, g.GetName()) - + +# create PipeTShape with fillet object with three thickness reductions +pipetshapefillet_thr = geompy.MakePipeTShapeFillet(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, + 5.0, True, None, None, None, + 60, 20, 40, 20, + 40, 10, 60, 30, + 20, 10, 30, 30) + +# add object in the study +id_pipetshapefillet_thr = geompy.addToStudy(pipetshapefillet_thr[0],"PipeTShapeFillet_three_thickness_reductions") +# add groups in the study +for g in pipetshapefillet_thr[1:]: + geompy.addToStudyInFather(pipetshapefillet_thr[0], g, g.GetName()) + # display pipetshapes gg.createAndDisplayGO(id_pipetshape) gg.createAndDisplayGO(id_pipetshape_position) +gg.createAndDisplayGO(id_pipetshape_thr) gg.createAndDisplayGO(id_pipetshapechamfer) gg.createAndDisplayGO(id_pipetshapechamfer_position) +gg.createAndDisplayGO(id_pipetshapechamfer_thr) gg.createAndDisplayGO(id_pipetshapefillet) gg.createAndDisplayGO(id_pipetshapefillet_position) +gg.createAndDisplayGO(id_pipetshapefillet_thr) diff --git a/doc/salome/gui/GEOM/images/pipetshape_dlg.png b/doc/salome/gui/GEOM/images/pipetshape_dlg.png index c59e012e570abfd99aa0e201ee74c9374d7d8a22..54d9abdc58aaf64080ae01b98aa48397fde8ad0a 100644 GIT binary patch literal 50402 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 literal 40204 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

9UJl1oEKjAi8%v&oi4 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 RuK;@J=IZ%3mdoEy{R@ZRp^E?j diff --git a/doc/salome/gui/GEOM/images/pipetshape_pos_dlg.png b/doc/salome/gui/GEOM/images/pipetshape_pos_dlg.png new file mode 100644 index 0000000000000000000000000000000000000000..243fe8cb0878c826009c39aa69adbee41352e8fe GIT binary patch literal 28941 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Ν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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/pipetshape_thr_dlg.png b/doc/salome/gui/GEOM/images/pipetshape_thr_dlg.png new file mode 100644 index 0000000000000000000000000000000000000000..618a167dbc41932ddb4cce4e2beae0bcbd1c5aec GIT binary patch literal 66253 zcmb@u1yEewwk=GI5G1%JK=9xW!AaxpZo!=n?ht}|aCc}dxLcFp?(XicjsKhPoOA!G z_io*KzjQUVcCT$~FPU@9G3F*%URDeRkpK}64h}^^Tv!nf?xi8{H;(WUsG0m0tp^nE zzKd(v!@<4pc>a44NBjN*P)X|`qV6DUY;S01{@uYGYy+oeZes*?{v>3jZ*R~2Nx^~M z-qAq+`*$mIL;dIdfvO@3z-dI!rzx8|SQ*2~n}0X{q^xA74-`UR8+!*kN5khM=jGCB z;ov^ONeF*cc1b;0bXLbwn}$1S@~@QA3ULrlb`VjBB8~q{s-7*XH`>vGVQHn1Lz#gQ z9$b;F9%II)P|>v{ST2u6tJ~u}0|SFK;X9yWgs798avUAx!CzKF_5!Gwqvi$$bz7S4GXXz- zIE6%@t(||%zyN-5St!wj&KodD41!l*Js%Y4DVgb3j9dT7?|sG)4K=tQ<#(FjXwn~= z!=gqfh@YqAN$(W>z7R6!iEsmWAKZnbta^?HLXGZAr%YeQhMK}=9J?S+Gza2i0p;X= zzi?vs?Sk^sYDyvSH9k}{WgCkPda-G0V#+*N{Qd3D`seLt7&0<*nJ*v_PHt}8d!*>9 z>U|CNWuMD3bvFrDX}5P{4cq zfztYfG-{?gJL_PgCoZPpnx|A7N)E+MHX0G~F6Ehe3jvK0TaO+-X?V}RFK-F0xx+DS|lNrh%B3B#VtLSPZxK-k=wUFeiod!+U6*Zj#llm*Ld_w(D8-u>RoIgb-aD_ zq#rNSX5&@ro6XNva=`=P1)v3(kKC})n8>y&k$nGV7|%vx&R!VVs8T^Y1+z8UMwYYqi}Nl;Yo z6GgbJo+QTnW|}!Huasl=}c!3mSm;t3LT*tQ~*yQ~lj4gr(bX(^XuS6!pUJX1K0EnLszln{*2@ zw>*3(HX(+9vSYZlZLDwA(b1v))%GF1HKvEa`>FTLwOLLbXN1|a$JN5&z`{XQ_iG7o zg{A41XkDCsWt(u%zUy8oFNkpB%z(P-ks8C>$QDu#UVF^LS-r*`i{fqU3CRuqN@)o- z!!_sNo*TWav@2r*k%5sv)ok*deChGE{GoYD{U!9&O?Py8bQB44>)V$OoD7{W9SVEj zpfvW;VeeEkZ7gw`?fiOyK!V)9v}HUKzqO(?^w`uk#r`^r1c8JRb+O~ET+7=p*S4Il zj|WRRYHS2Lp5=9y9V_YBaWzzOkJICSyNX-$6ZOu9XXzYKAj(t^oyXFEY+n;z1{Ni%CWa8) zN$RBIpOG+|2-noeEi2rS^wmq(7hbc<(w?zfdEF5W^x_ex;vFNwf%GAH_QUcQu>i`4 z`y1NJOLm)524gVhcuc?h3~IeSqjOLsJ80)(w`y|}`)%#R7yDD&=CoB`Iz!C#^LiC; zf0>kuox}~QvB42SV!m?gwSms=hnA97yu;5ppV@Tt4@;o`GJxJKSd`9E5}gdK4Ik*Sis6&9N)!xU$Eb=tbD8~81nXqjCqYdy#N!QFXl!i$o!3-}_C_{hViqqMGxR4^`|z=y+u?;m*d z$1cd;)-^WqEC=7a_4J5DaU!Mjt*R$m5a8h%Z^wV(zWO+_?0NK4<<�jn|*KISYiW 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℞pE;C`JB-Lynq|zi?)89 z#f4j!iz(%Nr2?!9^#OAc6w=IRy181 z#~tw&>m4#45gwCv(JxR|*gGP2N*86Riy&a^iPKxnW*-;zqm{N9HASWUO)ubp=Kkf+ zn>f4&Mb$^Niy^!dHh8fu1ivP+F!6WuUHx(X2@F)|By8|oca4juBg`W!=)P1;KtMpo z5qL|<*#4%{rNAo{znz7oYsL=+vco3rztp5*_pW*4U@K;$_^K zKe&~fe1o#+90|)O{3^chg|FW2!eZP^hIJ6+#NWdG^1W92$?)}v)y>3%N3Ry`*@q$; zNsd$={FeYY&lKw|I-GOoe0Z3541ELVVEl{vYya7YjYu?Zg3+$)Guo#xqGu7%1P<;G z5DwE1fqw~X5Wxv{PfnKYJV%;6K<#rO_}>+OYRWP@fy@&V6O(F3tiGR3!f7ZgBc6#N0a zdM5Sjj&d9Dper&%a6d#H6Qvux9&Rb)q=F+uLxaAYn(Gip28oLYJypAYuM;A>2CEEihiw*jra zN#&;790p_QY4hY%e^XKcXQaulWHVnY^ZEY7u3IUepO;#DL;iX zDMcQ6zNUtTMk0az&C9c7yAPafEG(>?!{Tx|Y&C|TT>+@E@?wrP*EjKYKTJtePz?Ya(^2`SkfpN^OeXb%2a413so@v5pf4H_Iy zeCQx;22LQ;EEpC9i9nN-kpO6Dn9GWDeP2DzW`+6V84 z%atslyu7^12OKP%xj6@11QCR+#nn|~-53J=IDH*v8R`>W9QrEIp_m`H_CPS$tw=T;S>4PS_6);j} zP|ws7G`HZ-L`QB>K$sX8(jdRzqoothEjw0FV^pU>;ugE$&xW zPB1fD2?=LfDUX@HzRLPsVSi8RCrVRz->f#T7jS8U#U_#j;ah8KxA&c){OJ!sVER++ zjczMCzF;1|_vymoq>N1Xkg<3D`r&3M?s&d;-tgEu8^TLbc$1@fs@d3$7h@8b{L@BE z4IcWfkFRVNq5UKB#oK2Tw1#-1S&B?PcqB$((}c6zntan%Tt>a3QFCf)YKEgDu7-wm zPu|z0m1*ygNf5Dzl#2!`<1EoYb8~Z2I797HF1%34R+G{MvWyH-WZCyEh|(jlOaX&c zlfk>Px@vnf<`1k^PBylgIrS>8kI0w;-d7$LJx{OOA~95CbkYhd&=aW83=^SHeu)%r zZtfbZbiDQ*2X-Gp!5oR>8vs#EPfZkAT9EizSy|a=x60-#07)P>ow%4sU0s()>!-ln z`qhi+PwKz@$#Q?sp}HoeVnI-IW=aMHrJ1L~mP$55r}`TMNc?}nAFx=YIBbPSd_L?r z_JrXyt7am&%zm@O_FxEv5-%WKz}rM$|7(^!-2gqt5!Kkl&Xg*S$6v8vNgyeyvIwyi zKEJ3a`g1~)7FB$`tYYm?{{~klr}t1XfTJ85oA$okiz5g>I@%+}3St=>2ao_hvP{;R zXW#w32f$!R2P6IbamL2Z4oqD)E%~6x{H6IjS-MSW)E7fPeg*)k;TWKgeYFWt1 z0drqh@U0R@E~5V+}F z?grJA{6R1jl^1Hb+uo6BpQ-7`M@OA(?NT|6F?5gkz6**NZ(gOXB9LVG=<2?@Ei6~+ zZ4xFY<`IP1>>_%={S#JxFp{LFv_G7yanmHIu_BU+tg%_tB!q|#-dVZ^-HYXqzk21{ z75O1wHlNfl;Jxd0hXwf9N9g{6ZPFYIF|SdVTdz+h14t`dT6)E(*TO+TE=<=YEhFRg z9%WL$Xu8}L5H0qnO2)^>3f50fW{or4zw?szbx)^c73%h@?xD~BNEKsrj?_J>+{8jO zmOd$9{+pwjt#psi2RpeJ>CYwNXYw9pF`(hic?&Ef>m`bx`gpddMe1P^i@S_meb2CB z95eFi=!T!y=NA=PUkM{m2w)DzmGj5VlsOV2(J+ELh1q+*Z4B{S?B?;|9t01B$V{LdjaZsXT-A4Vg4fzz&60Ic|f%b|-}tyU=~-kmYQ>V5=r z0dd3q_}H9*;qVTI&8O(k3Qc3wLI6DTr#CDVW*S#l?*Sr!i<`UF8V`WS+oKOnKovb9 zDqQBPXF4Gs$UF5L84coqCg|OmUd+t%tS|%FJ@0{YZM}T&Nv;8wq?Exy1W3DvJ9+m% zCBv@Fsg11tSH_R=Uma2a=sts&w($+PVSa18_I4_XzSiEGp1%Skck_ZT;H+2>s{WG; z0QZb#P~>9x`Tu<+FEprIX-|deZ-yMyZI$hr6n`=F4|+;TZLhWY`J9AA@FuC!e5y=u znP@KZAE+^!tD!k`8WiN`2dfRwQm8z}c()A2C&7YxvNlV-h7&BsG?5fZ5>mkzxl$P} znl!t6`QpjTU~Pu^t7h_E2_{CvziA7}CNEE_M@rK+0BQtDxI5Xzq`rR6uo5?)Jdd@r zR{_Wf3-@;@D8}ZNs?(gm^;&f+ZL_s&7TIHzfAxt=$kqUhiHW`R4(6DWF`}&0d)PM8 z(=)KZOU5@i^jG4>s@J5d?r=dzM+dXk5mWc4{!E-D=aGPm_*blBAKkw>FF#|26pFa}MO5^mc4WxaC6UXe8@Ynr)8F=suz^h}Tr$6id-s8! zk#Cu5-YWj##Gajjr_NubNFYF#3-Hi~mU?+-Q@5A2l~v(={|Iz z0Z+HcQ*k<7rjx>DA0Qr<*81JX;d^;t6H-cha5H{RspvYA@IRDUdSDQr8n4j$oe%(K zjE(a`p<0=uIijh&=buiYWy_zMlNWS10@4y;pE#+u=fS4C7OafAjTpEe?q*L`@gU_< z_4W0D@(R2HSvXoiCHEwTVPxUP?TUP9#UT~hiR*dc%TQMsuU==jySFnjH920`mwpBO zUjogQ9(0R~NRHOE=;$NWcvyK{oUyG$aC8Z^&p6ZUSv*crEwQ@v zc3i_5Aj8ukkw80LkR0Rg26d^<`AOK3JCI5cK_>a6fzr2k6Y1`f`1}5qPC$SrUxHko zqN}!(hzg;S6zvx?wlv92vRys&D>P|nYqZ&xZ#pC@%-*USoYh(EP{`v~0yf2X5?BG?2KMSbqEbd+oE&x3BA*zkI|; zony`s_x-EM`)V}S(JQ(b6f4%-Oh&N)gB-JP&x@Uxu<=QgV>F8rLv|ITD5YDr&q(ufUkUGkaj3Y5O`p_T|_Er0$u=%tHQ zQuG~n)7*am8!#iwA|f_MqO6%6E1fU5hSMwx%9-7YtlxkysZLJf%MkrVbzXbmY_Mu1 zrkI;=b2l~_l90s3mCicut4aC#wgu%<=B-H7#%5)$E#5zoiiHj~%gD-{oh|de;~@_` z`=^qknMelhrWk5!{@;B@|62JB7MkCN@k8b&PCSvIN8Q++`SX2wLrzXa=lTgORv>P& z<#**I88bgseLJ4-Tx)NF}+Oxy8jqCsov0Yg{M?`%{!A zo4T3HDM3FJuO5qo-SP0TgzqEX&SgYeJyg&c* zQ6)GSKTZnW7&nsHb{@TcwsX!5*T9hd^t&$H+1%+ZX2o{zF zg%gDcWNiuy9he3rTwgcB2e2&*#{Nw1{1X;~e*^tVL1r8Qjx0Dh89z-+L&Y1ky8FI5 zqQn%E$fu{L0K&=-3|y&K;cRLt(ydqedGL5{mqNTK9)432KOD2jB?y$vDS~7^+efW2 z`NIX}<+_Qq`;VTfCIV;n>u;P z2X^UPs813ME8g50U0#0XpH(=FVwth}kI*rcJ)p_tNn;s%(bmpjb&}52!aNmK`Y^w^ zvt7&4SZ;`Iyb{zG%v5mR9XF*mH(zUn3j0hE`g3$tUO7!JTX9yWjcxF&@?jIDObV~+ z*US;jFLUSX2NW4&0cgq92CSz!={zs7rR6^R{AC8NTrO&zjCU)a?)HBuP&hj}67pN- z2>sa*Y5RWi)ny*B?z5N09BO}ddBdy|4)KHW@j>Iu+ySz`poCDKHNPIri#yb_Nril6 zGz^4po%CNZ$wHf8-kSH+pPRn?udk^(Mozif{;x%%)M6qy3CRC~Lz`TEBxKI)S>eZ< z>R{6WUw0n@ELZ@jA5%g7*vAicpJE?=4^SgQKHB~NEE4g{rv*Cxzl+5GDhzD^ZuBo~ z>VKe5GKfvEjiWxVmfJi|&s3FyP8QUEXn_Z*Uas>ig!-BJgKYRg?#>S%OC0qJP^Yz( zijYo>uhP!?dh6(X=t4ZxR3X^=r(kq{%{dc%;ub3LKS?eHM)&|jD=XlLaD!=q|K0+R zTVsAmu1xN6{6g%IHeldYImbNC|AYFX&JYc=ZGG7IOl2{dUGC^tE+QiGdJ^@Y z8gsxWu5zGMzdfDeJLfU|e|WK@b*}exvnttEO1AHU#l+0Ew(xc>Tv6ochT;n?cI%J2 z%(ge!l90`*dqD$JlPD927Hp_qw%G8zLI$VU^1>4?66uEmP0^mpne0f{yHvz`w~%4Y zio}A#BDweKQyo?}Y$j(np)u?n?AYG*4W*q>!{ea%d~Ov(VAO7;0$7WwnME3Vs8wyr z1ENoEe*UGS8)g_wr3SA#Ex0O|jk@)X~t zPw3ys5Xpo{{m&n7LQ`gE&C?eHA2*ZIJbL;XY$_{^sn?c#@`q2z0%WPypArLr67kxne1p&E5BEJ%eCr3=uVi;aGNCGa7R+a2 zxl(bI7#7b^Bpe@SSZ=#t$~TM9po#Kl_1@`OxBBotSsz4aYn7IH-<~aIWj#DT{-paI z8WC|cmn*$c7{mFx1pLN!In(E1*F9n#cx2`)jRS9^g)A-ifZ~Wmz_ZIi$KKu^G|(z^ z9Mi|RW2{dyEmUth83e$d1<7Y+>fvT$IvVemX176j^>TlqF-C~gd5yS}<%N-v?NYc-tk5r}Z(fLuxq%@I}1nrIvc%1kT z;Z_fG8@~CprbV$hcG>IaPFG@5UmwqNS^2_nq5e=sSnC$E!ou;M9e$U%x6BPsUJ(gmlv92giFKg~+(i$sTNb6<}2;v{m1RTNKBEck9w+WU(= zvUrJ0u{_BMGw}%GgfFmj2dEp4r4R^zv-s^T&D&RbDCp=ZoHm}%t!}Tx%z!TosZc^b zMI+v7@hUBj-uG6hZ!||1^1Ik8R%bPLnB9?Enl9B%QLn+>@I)Nuaqz}$JkRyG_StEY zM3+~5&w`5jx=go~)49(ex4wSKz;c;vO-{Iuk7LSa)6*5#_yd`>BjM3Te=NN^oAw0c zi{t#cuvNN%^jw?O=ni`4ke$UGjjs=8^p|e-!=d7qwL7U1*w2`1<#*Xu^~Au>H(YBr zVYVup5|mOeDWo$_%Oq8(K*Q$D9>SWz%#tL-mu`a=V+98}IX|DAph7Xu9TzVhK|Aw+ ze-jfM>%8+j6PS?qU%^9u(1eZV`@=&N=vq0{*plciYdufDXE55K3quQxmc*hg4*s?r zh`W4i(wM{Wdv|aXZx1Q3$Qwg*xZF?t4xPL-pX$S zmOc|U$ZrB<@Hu?AF+H1FHFxRpn2L*2mc{`$yvKYr9sY%S?Q-rkLEp|!ebic3EX1Hx z14SfJhdw8-h=Pq7A|Wk(u0%5w{abLpuGXtw_whZ9i4vmhg#K`{NGq{oC|cEwGv!Am zPmf4qj-k=sUeV{)jj);v=V%o}*FsWrbuyNd)lPB4+WnOS{@mMUg+{fCsKi8#Oe4`$ zr)%q{2ItMa5nZnkR3bu^%FnqK-i?m(7#UN@FX8;Vy7D&%!rL!jmddUX8I75h*7PyYhKGngPAW#f z&DpkHGNvb`{=w_He?p~}Y4vGc)oP08xU^Kcek4NI%Z0a8EITwjd{|kV^G^Y~=jI;A z{dUkTOB^-W8dT{SVjYUz3Ew$5UZ+1Ai-%XlOF}-*HH@{vR2CN1sHo0?55vjquEyD0 z==^05Z=`Nr&rVhYS|Su$o$jYrMP9t@ClRj9!tIWQ%NM(}Y=62U7_4yF`xE-{xy+-% z?Amtm>L^lDwQ$4Hqgaj6ZmDVWWJaxY{-Naor*&z?#Qu|iy~lYxyJ~WIhW`Ea zQd}q;Zvbunoy~k5zdMWBW?0;ptY0Y{UNA;W?7@d1nj*5F#~vbd(V%zy>+G9J>TwY z3J59OF`Rd&L~@l1qYzR7d{phJT7SgvcDNv5vSUwOH&vpy+47l#v-;Z6)2e;7LI9E| z{%J4#n??r=7e8`Fs(seB%6yR#F%kM~Zqy;V&g>89x| zG8W9ckDp(bDHSS*T)%a8Zfn+`2G?_nybE0IJMZiZ)QW3kAF8Y?U4mHGmoKVWsgw`e zh-@E*6&y0D1xSPh1xY$sErC~yYViHj2ykd)7RXys!b;GyYcO=%6%gq`S|da*~bwV zX+ zmuYMQs*;z>nxD66`K2^XG_}t^xSwy?%-3Kb-Xe6EOp?ja7!hvm;NA7(-V0~N9vMvp zUpBj1m!oN{?rV-gD(sHay9F5^yzjmx>HFcKk5&2x1ZT*nEwqZ4Td9|OUq3#uF%2m& zs08~wD2D&82ohvOEK;H6;Fy$@)z@!F#H1FKm04&s_7V~jDqr#m8CUoH{`}7$RP=ktegf&0C{GUYF6Xj5dcy zPkVb%rR#CnV3$d$!l{?K?)~YHaiI3Rxa+818cBaUjX~<^<#oM#o_T)vI^eU|H^N*w z5K1zQke;tXOPPr~-XyCHx$z1J**=n!>Dta%XEO3I2c?*7?Lqm zvQR5mr77T~L_#U!br?4nWWL?)%M5@-MQ5tfv{<7wI&O{^$Ok(RUV|BbxyR99|MU=a zzWuVZ-WLY`?)LU|u<2*ag~C`evdR7?pFpM2@dp2H z>0&9c!VUox!NV`;;~9y#d_U*6+P^MUBOoBaRI84cV1Nh5_sC(sT$*>gPl%uE!EB2| zK!$!&l`DOQyN8G0?WK&J-DYM0D_5Dm)ncAattA<;L%ITPL*sRv$qjfUS2-;*S2Zth zH-0{PDHU4(%%W^-Yim?PDN?c6Igtk{ZXOr52pUt1&wTm+JV4L@GU;Xy&4cYCkjpMQ zzq5E6p;WK4b8rZK;U(U^6e(I5Eqv=!MyWPS&sKf2+aW`;YmhKmC<5YCR3exi9fKPi z%f7mJvxQEe#JjDoa2q}PiZcQu)Oz=->3U}uyL=?=-8-Y1-s9S12t*zebNacJvq;;m zUc)s);O+U@rZl5g9o^?Thyge(l9G}jCxC?J5bg}iQxr}oWd&0P^6a>o&gWqr-*hvP ze`c5oQhEq`@sK^a!ZhdI=7z)4F&~GgAr&_JTklCw9TH5pP4+IIAKl76&O!V4E9V_9 zHD>#SAdts&V`KcCCJ;y6 zrKF_5?ZsV(e?>sW@8!C7!`di3#!*Bds)#@q=D2-)teD-)X{*7-LRw)d(U<73zW8zW z%|g51aeKA-;NAU8*v}w6Vr8YM-fr<=vKbZ9aNPv%>8&+bWY`Fw5)$e&GW6~3Rm0WZ z87?GtQOjdsV1RuWTdjKP!a})BzgbH0Prk7@zq@_Ae7P;Cbuao>-HxgFyplB}m?U$? z<;5b}>{q>2>WP6oJxZ(cJq?yhA%+fa{Nuxb^qj)m(Q*P4p^~G2~jIK!e@gUXHZb$k%Vng%fw>?s_Y~ef2tW!p}u|+ zhw6pOf}pjhj=NEXz;Rx_Mk=>m^x|gk7HPVOwSbm_HK^=y?8v@Eg~Hz03soviS zGMBa_C<(q=Yk?#bNJ-Ezp)$D;mO@{&67MId2vG)ubXl2DsAifN$nQpJEQks+5?lKr zmw`dLHz^kX2U`ej&QnqqFGQhX)^Mid#sjY1 z$QiGqtb}Q{>>*cdh!EV0&ctyOHehS|v-$y@_ympAt1?H=4qb{;lsyAuJGe93yESLa zk4%;BYXAJ_R8 zUy<4so10=(8VmU`(5GT*lHTlI3m&PlxQ`P15?GnzurH$cVZ8&u1t9XR@ErK$5~5^L z#$tyxDAB7;&J)1~>A_2S{#cD`|g09YHc_TW$4>Mz~Hd?SZ_fzGVbyww+a!59EhMQ-mE|zN7=kYwO zw(R)%vPsr$M$&$I)=qE-%X1ldkF`}#+-(nQ=M_QG|fQR6YH3C(0aY(_Av|&o5yoQ(r92@wqIeOrluwX=UJs$%_ik6Nbo5t z@n+*s(s?gn`XflHmt26eXz||YNKncefECq}m@6*SnLHA;mFxBit#DSpdM!IL54&kz zSNct^`?u%jQ_V&w2mAN$ui?I8M-tx`Vk);e)VuT6gGI%|9`a)G|M?z0Cu%FzYmlk7ApNV*U_fCFl zgt(?=HCaN2h7dWF(q zSzyTt;$D=)x{OkISg_qYs_|~_cq5@gX{F!V5|25t9d&_(DJX-!->Xxbjh2RT8f$Tm zn}fZCyq4A1;9TakyRY{afx_x)lE%5m-E(fuu?1LW%P z$$Q3qS7N2v+1{idjw8aJW3hXJKF_r`^4{N)CE&Dsg@6p}PvWaHQ{;CQdG<#9Q84v%Qid9Y)%~r17R*>FC~`c(uE~EW+W*72w{KHAp(~9W1=1Tq z%$od-*dYKKV!&!L$OrL<0?Y6_C$8;M%WOq-Kqxt(J=RvGL5hbzSV9DDbh(;THtgdv zZE;F*(V?sW$6IX}dsD90s8pzAy5Bmg&sVO}80Il=_9OYW4H<$__~*y;cDBVfb~+`0 zu~u#JqayI=?N9stsFm3=p<_LjbYF*$=Z%kpowAv!I_dQgd^%~3j680+eK`k;-@@PU zgCESOdt%b5HJM^Xo^|HYZq9xDoMNynl_{^&PMWp19vBuO8>g})*(m`+S(%%=5dYUp52TJdrc?cZok~-J^D1G z`>sw~5PB%|N7(y>@?|zR<03XT{amZz%}WCI8?Vl-W>n1WCzj_4hwL;gUY?-TZ!h3s zwV3{NhM+QBiW*f4ye;Os1Sie;#L%u5Tr6q@uHVUuuYr(38BQhz8vrDndJ%uV&T4Xz z_dWF<%zO3zecUh0sk78KQ@?_T@pl!d(gL8)txdnf3FVyEIxBzR@jN3^)+)fo`jaI( z2<9j%5$7+ZnPRt$^0o(~-Ksdq$z_86hGp02DD&!wO~_y_FBs1gj9{{W&A|BUcA7YW zms@^zyGh6;3Wi{GN4oDSk>7d@uv23PqmZy#JT!m_r$O1U*V>E-I?L11Nh>IWu8PQf zpC?iKNlSy*FL@b;LQYZdE*>p=E==it;ryA~Zx)o=-vRo zZHt71gq|eTFL36;2D*D^iuhn6+yETT?IY4DtdK*;ta-KZd1iCqci~V)DG2Vx>2IE~ zWexhxn$h+|Rv)dwlOE_#23>t))K#c^mF8<3g+%l1#cIWe;@N*6>?tPozH?Jq8abOw zQ(=brzA_yNT7{RsOnq4zZm`4nBD>>-#@|BX;CbUT+mdXu{egEsT5o$q_XX;~GsUUo z$B#R9eh;IPnV61j0;Y2pVC*fb=TzXoTnLo>yUr4xYfN^#PS>%YYkn^;`>o}SULDV` zZ?HQxsZ9tx8%=TPw_nTALw3fBum4y~I9VB8d6n?XA?oSb+0lG?yNH#M1y|5? z8S*6ullGpvRCzNa)-k%|9i&P(DNq4PD8ZIrg)R;$w4>iL%Sx?$Z>kk2f#=f%RRK5_ z*NFsvgwM*J5ajZt^QaC*qPf`Mdzk%1qSxeFO)7=}tKPR;EY}zMnIYxU@K_HR-U;t_ zZ+3W=w{H!u^u+dNkcUmbR*)G$(WLvIo$ph{Gk5%`5JWJxW=jeb&NNOL+EQn3pE56E z)v$K-kJeb*Jbb53dW%L@#pZ-)FubQ)YdP8GaULAgZW?dO;i(K#y%f7*U*WUgIbG^E zPW5M;mYaDCIE-T@=e0kbeI3zl-Wo;tBt(v?w~=xb_Mg4uJp}??-asg(=+l z`&%AWVb(l}*eXL2E;GS;GMa*MuS2brZ#^TrS#9Y&%~4t)ZH?G)_j`8$JnC%a`m$at zAPHQD>z9X}PKDwd%N2b}#ungY$ch^yak&d?T9kMKItLyayBtZQ{R-IAWtE9GxUu~` z(`sKJ!|Ntn#-p-8@BV(kqsEe#dMMJ)?)9}yT9GG3lfryqjN(q;+I)TB0jg23fb3I? zleW3H>f|`&vK#L`k9zjizjb3!sLQ>0FU_=FiD^_x!!R_vA`pL$+20Ja6xd)0?$OG`g%mOo6|Gy`x~EGZV)%jW^2M%fCyRLI9j_hx*VLm#wiCEXF}5 z;zeXUU*q&8#N>=j*nw*spDL#R4X>-?5>lkP<`KU(=|!bpDlCMBG$S}vJBYR8 z;RnQSqO4f(4_|b!a@AO5Sk$QVFwMiFAqy!=FcoK=Bz=lnXhaV-EHQum4*oPK3q@c6 zikxiJjExfhheaAMM>4B5xsfI>>0fX|3X#F-tq6x^cH^(gtuobO(G>Lfemai?%@M<6 zox_63J=qk_4Xsx&@*5mKwP(Y7LHKISB)iS;0;OyVe)Pd{$X}F3fzIG~cf7}{R-Fe0 zGJDk=7K9P%O}fV6;8whZack1pmEjrFu;-GEFacl6d#K%0fq2$Xhm+ax4=5AsuCe9d zx!1e*ZC_`qiV{012f|Gp`P~ckd!H`R9d(Qph?v|oGL0x&-MmlHVDQrQ*Uyj1g>dsK z7khGioqA5IKPSU_`xo&E{Qk=9$WjG{J=x12T^JWi%pc7F77IQ;%Uy3t)-)`W(3OMC zUxVCYye4TMk?#Yg-LEVT3l1PdM;2K7yR-sPTpwQQ2#*8T=UH}pSuxIwwxHz3uu za)`0kGL~wc$v(bKZ4h1>N}l2@+GEt1jGOx9)o*s6?JLIVeJ2f?SYN8>+I3~SH)j~h*ynt0xo}%m@%W~rtsH%$wElzjx$`429l%hdf z7L}v`Lcw$*l_xf0`0nXL7R@E387Wb13isUHalgj5lFMtu0Mq6s@duVOaFuhBiUd`Q(+zEYQsy46GG3@5|MEr1v=? z?q;IMfN$#AL_*8K{q`j#)g`4a{p#}ya^UgqpY@tK0#0dt&CP+I+3o!ey5&S;&RnevG%@4(>Dv$co_nMuy{BH)m!(Io3?*~{@*6AYrUGgbdo5Tva& zg!x5@#yf8!IL34ClT7lqCO-1qpV(O_D1nYhI!{!@TY&Xt{$?FC8H{J--|T37neg$A z^h6DPT=T_Fvs*8AR&3dXUx)aJQ-Xf8>m{hu4Lb!->6PElx%?Su`I zu71U5gW%E8P0q7+L0>^Ux3#`#5g0-IgWxS1vJCOc)Jrttef76+dy`$b)jB`(oo4RM z9xX@YglO<$E71AJ#*TJ7Se@9IY&(O)J$OwXgI@tK&N&-3Fbm3fsIug;J@@MtOvkwB zxeb8bn-X529%b-jl1!G~S7wWY!z-m^i$d_|FBVg#liOkDc!u`r(l7A45TddaL}8$N z1*M-o>D#IKi1XJy2F#bbf^=-;Ycdab#N>kT(zv+BQ=n+X)^cUkulntYLnXB+Wl3p+qtszHPpe7in)2Lud+(0{T#+!N%`J(5|DU?bKwIEw`juj8a`uAZu_ zPx~q{88{Zl$)O;whYJp%TZ9v2y!DlHPAE7MWY$Z(XJz_S(sSG(ShB$_mp?&=b(=(E z6m-6%E-d*AW|S6(Iq?OgX=n)3A>Z|Qfy4TSWu$*^oktlh3D!R_@ZII!l%Ynd@;=Y4 zX0dCj6_;($WQmQ5gi(?A_wQ$Wk&}Kdhgdu}*-z}U$Fp7?C9$XGqm&D+T&Cl&5RGbA zT|B|%tyS5@@vO${$rk?q=q(l{BGX$vFAhwXuCA{$-W`kACwB7;Y@}$C!&PR)$JhBT z&H>T^XJ}Z5@52Y?G$Xd8E#G(A#S{HGN`X=1z1tIrF^)bodJ^t=lg_13{+8nm4?Cya zg%Up|2|y}9B%#2=$=I8S_0ItT*;!dRO0oEzpDU5l^;sr~Hf=1Fsn~8?FK! z87Q+?e~MJn(w1*HYR+@o5O7$6xLfd^p)y_GWW8ctXJ_Z$FA=BaYaDoZ%PpKAkEtQB zaByjS4xdN!zbI{`z*L4T`CX^=gyTc}Rmkz!D>51%+Rt&`iHqIb-T~Ei-Rha4B-qYqj3$X{1k6I9mPq}hSJ}1RirNa;gqQqXq*NRE54?O zzdX9n6i+>!nNe@m^V=H2^Yil~j)e9v)vk9vTCgy9ZbLW$QkULH;=_en`oGE%xwvFr zk2QAzRGXQa$+^$D*OPe!QxC595q{0CyW>A>8FkIfhJJPmLydkMpt9CVliMw2ud=iK zI+{)yLG-q$BqMTC$*Im4+CM=!I&SeD3(6jJj`VBnHaWm65VbKvQ4D?T!C30aQ-6oD@bH~H@ z1M4e&4mrP#k!G38yqj9t%_a<)U<{{jv!~0+%6kE+W0?TjEaQ#VxH2lCESj*XeWeL@ zrKA$+?K1B$Het@(F5EXrh7&361$v9w8%WGHdC{HR)PmI!a6(wO@!KS6Ov<@ZDV!eA zkcVccQNXg_`^^vl;+zKCe3Lllub`stB5}UH#3_OHbMGotH+sV{jLsnJKhIC8I1iR8BGthTWFA+F0f5M8-6=V z%i2>&H`y~huk>BNZvzP;Atl8NR2G1Rx`c;;C}4GOD+>i^Wz!z(i^->Oe*+F39lPA+ zkVm-;0X$4E5HtTl%oVv%Z!zz)Fw>}lIl^*DJCamx{TAq>H>e>dAK8%_TS(RYNwJWc z-1f;6`XN8muge4(bc~pALIdFg-c!Xu`7arug`Tl6%<=%$0wDF>o}2r14>6Enrr!7F z$#OPBheq|Acs}tJD&-EqIZZflHgkmrhKb@hux0^38VE~_N6XUKW$l(4R$H%^69!*H zSWNe}^W}PM7MnB=8lQ+qy;UrUhH?7ADsKb=z9|!Ef4@2#tC@)HXa4^FfDujQa1t9m(seytVqBR`w+QO! z0Kv+dA;Ab_U;h~{1r?QAfd=}v6&A)%83Q3mOWU8RgqDBlGm`5uF*D+s)kkz0$Hh2B zVs-}v&r+*cZrnAV#tV3ZU&OvauNsNc`|(a&Osps3@ELnXHiUIEWjmH4ug3iM3fXj- z?xVx%8qEE*nDc@2?Kow`I#60HAEg{%AxY)$_L zV*=C~B~@<8a?P+(zT9HdJJ+Kz%UZxQeu81W5`%_;jv##ZGx3|n?kH+s365u4)r%)BYv&F@ zzH!-WGbX$LMdYFW_1_{7OMq%}gho>Ps`X)=Av-L2-fyVw0(rmZw%ymFeBZuFbOZuoj20k@4iN1%}5_bsmE+RjY*DzvUmwgilz~bU?S1 zlbicoVUM`gpjG?J^Mea(LjA`j2Gv}x8WUPbjWsdxQb}mDR!uskQJQPVul$(2WUent z*nUX&Je0x`9rcekX>NT^1ANM?GzCTqXpj%i2e6QMS~1A)Dpjk8)$e8gG@mt?B=0R-jW1_ddRi@1SW6BS! zj$U$_9muBsG;NTr%UfKbK1HEoL~nX^<1N$1?v zKh6yQ7ETo3sa4GPE*>TvdEa}$7`WiTbw-NsUWj@165jFHcR-RpNTg_-#a5XZrU84K zSVWpZ|DU&x2eA9Pl;n9b($dl%Njh)XhbAK2;gM*VthD-4x_K)m|2(a+Ky{iGVnUE& zZeuCq>mS9#fA;MVnpQh~ma}8WUB0>;kS4ss8y`;c6#Is+j`239UB=g8^}$2lYn8P@ zSPm;8J^iU&(2uzyNr#UC#Zk^4y=o78wY0-9B0V$XTO~6Cy3}oa00fC6gKn@&E3FI^ zb*E8Xv6Ki|v4O&X{l5d{Eif(e?*#1gcs_jR(#RmzI_u;gK0C@W$`8JVBdDgY;J= zu(53e10}84-_giOnTa=)r>r?~_0oZZKBk`n4a+`Df(ca_PmVHJ{K$R^DG-fr&|Zlv z#b^H?24?{^h&y;GHTmv!=_ss8g3^n58NUyZnfDwkP+L{Sr0_p*nGy=a;B;K*fz*Pi z*p^3zB9=osuv_EOQPXokX?hf2;b@XZfHGk+hNeg9mjp!d=L2=istpNXg|WDBgOm8r zi={qo=E^>gV4kP%Wg|4=95-F# zp2-*5Hxen$#jrRh7uTUeq$VMw+oS1k6V@9fWAb5P;XUWl_yW+Z*h(bTeag8^poI;n zac7vyQ#?8|pEPp|1EvX3%rBbXrld(wI0MWBAV-TLmeET$} zm%D4BqI zF@+O8Z}+w3-^IzJRZw*K#0c*}8K z%<9`C^PyDNj73Gea^7~=sE@vI%u7SiBUAacg7|#bhDW>-xxZ z?qveaohCU@G~o%D{EjkwQ)j!>wSEdsuTrtpY%{pER;E+4 zPFp|?R8K=hgMgsX)1dgcCmrzVy`AUFpKM0mtGWcUBcJX0^PC%^Bsg7u68n_}b`*x( zexY>|v{KK(F*ad$km-R-d-^V;rG3N?b@~Pk!)uQ>4vX*6ha4>oHiVvsS&t>MWJ5;? z&FJ#(xlpNXd^a3{8yNwn$De@!LI{my>KDW{xpE0#S03#D%g*|9cb*SNO5RIcWuQ{| z8x;9Ny(cN8F`Z+iSF>5|6^jA(o0w?je0{%5qZ+lz#T@<70CFv|q`X}~b7(K6zw^rb zILAmzDMkxkvwW^%+u7gH0O;1OW?&BDOyzZ9TMohGi+I!`m&O@>;SZYJgs$2TVTfCZ zWW1B!0qL%>G`*6+`18Lfg4A(rw2EFM2(+&}+8ps(ae;ZAXOTQ8(O%-o^XAZ$WT57? zQxSBA3)8{ElihV$^k3=q>BFsl@w562V^fe(eym)qJgwV;Xq0jzTueW%-VS(U>m0nbcaEd{b|M6~W*<_F zWaoYG!spI4eD7&6Y!g!Pxa_xNx18w@@4|anQr_;J?{Z$=o+{wArJfOiceyu74=93g zav!-y`_*4SU!>_=8Tlpo+FHo381ZPXO&sCaoj!HZrzEU%}A z=ik47|9arw%27LPJZnNJG)K7mN5o(4yDwx#Jx@l+U}Z7z-DFV+dMyJtm)$at9@%-OCI6~w0m3iy;YSUNdFWVWk`M?1wEn8os(e%C}8QF?sR}lX~ zi%TkYJueId$SdjPV)-3SKrw6?xkvU7WCuZ~V@YUtK}DOwZ@R5BPO zf(T`5Fpvw+$Fz5d9r&N9Vf_K?sg7KPr7=bQW@6_9)i8I0k{1TX(Vt@N5JT49&8JE* z=TRZfNlDaeazL14HFILPm2Ej$=5p9mT9I4}Y6H&+*bqW~*R?dxQsE-iT$;U^&=^0v z8Ftq{2#_y=UQDY;t+X*zkdEZq{ehcXPE@{&dQFcIE&B-S7mt19z;|lY$vgpZ9H(nbEe<}nRT=YcJMOz{ zx3kM5aQ->w^0oM{gh9Gp!^bX{Fcn&YKXyP_){URZA&Z=H!;WtJ0N#-NgHDz8Z-$^P zG4V)+`_;khR#ddLAv_R#EZk zsqW<&|lmg8`S_v)hx=Hb9Q_NkA+ep2NwBA{SlmW7aURW$Y5d zB8%9m<@$=4<3nC2VQh4oJt@+~iG=ul_iEL#pVq|b>2^?iW&B}6EatSu-!FX-KlrP{ z)D6S8DtK}-6c#vxG6Uss;Tw}weNQtggI54X5J^18k6NL9#@(roqYYxD66hv#2=nZYNAj97Se zGM2q!IjK_g4YV*WRv}5EeS~a1-Q9&s%HV}ZquZIUQtFZ!hmtwyd3omuuinS!{5%W{ zjD8b*PuCie#@*<*+-BGrTs3PfUMiP=vBzt7^

5HGEAJNKtSgg`l5Wn@(em^JUxP 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 FzW|zIg;)Rp literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/pipetshapethr.png b/doc/salome/gui/GEOM/images/pipetshapethr.png new file mode 100644 index 0000000000000000000000000000000000000000..119e7331ea7b7f944cb688aeb77541559b461d0d GIT binary patch literal 22965 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/input/creating_pipetshape.doc b/doc/salome/gui/GEOM/input/creating_pipetshape.doc index b7f448ed9..44124f52e 100644 --- a/doc/salome/gui/GEOM/input/creating_pipetshape.doc +++ b/doc/salome/gui/GEOM/input/creating_pipetshape.doc @@ -8,6 +8,16 @@ Specify the parameters of the PipeTShape object in the opened dialog box and press "Apply" or "Apply & Close" button. The result of the operation will be a GEOM_Object. +\n Main parameters: + +\image html pipetshape_dlg.png + +\n Position parameters: + +\image html pipetshape_pos_dlg.png + +\n Advanced options \ref preview_anchor "Preview" + TUI Command: geompy.MakePipeTShape(R1, W1, L1, R2, W2, L2, HexMesh=True, P1=None, P2=None, P3=None) Arguments: @@ -18,19 +28,17 @@ The result of the operation will be a GEOM_Object. - \b W2 - Thickness of the incident T-shape pipe. - \b L2 - Length of the incident T-shape pipe. - \b HexMesh - If True, the shape is splitted into blocks (suitable for hexaedral mesh). + +Position arguments: - \b P1 - First junction point of the main pipe (GEOM Vertex). - \b P2 - Second junction point of the main pipe (GEOM Vertex). - \b P3 - Junction point of the incident pipe (GEOM Vertex). -\n Advanced options \ref preview_anchor "Preview" - -\image html pipetshape_dlg.png - Example: \image html pipetshape.png -A Pipe T-Shape can be created with a chamfer at the junction of the main and the incident pipes: +

A Pipe T-Shape can be created with a chamfer at the junction of the main and the incident pipes:

TUI Command: geompy.MakePipeTShapeChamfer(R1, W1, L1, R2, W2, L2, H, W, HexMesh=True, P1=None, P2=None, P3=None) @@ -42,7 +50,7 @@ Example: \image html pipetshapechamfer.png -A Pipe T-Shape can be created with a fillet at the junction of the main and the incident pipes: +

A Pipe T-Shape can be created with a fillet at the junction of the main and the incident pipes:

TUI Command: geompy.MakePipeTShapeFillet(R1, W1, L1, R2, W2, L2, RF, HexMesh=True, P1=None, P2=None, P3=None) @@ -53,6 +61,35 @@ Example: \image html pipetshapefillet.png +

All three types of T-Shape (basic, with chamfer and with fillet) can +have thickness reductions at its open ends (two ends of the main pipe +and one end of the incident pipe):

+ +\image html pipetshape_thr_dlg.png + +TUI Commands: +\ngeompy.MakePipeTShape(R1, W1, L1, R2, W2, L2, HexMesh=True, P1=None, P2=None, P3=None, theRL=0, theWL=0, theLtransL=0, theLthinL=0, theRR=0, theWR=0, theLtransR=0, theLthinR=0, theRI=0, theWI=0, theLtransI=0, theLthinI=0) +\ngeompy.MakePipeTShapeChamfer(R1, W1, L1, R2, W2, L2, H, W, HexMesh=True, P1=None, P2=None, P3=None, theRL=0, theWL=0, theLtransL=0, theLthinL=0, theRR=0, theWR=0, theLtransR=0, theLthinR=0, theRI=0, theWI=0, theLtransI=0, theLthinI=0) +\ngeompy.MakePipeTShapeFillet(R1, W1, L1, R2, W2, L2, RF, HexMesh=True, P1=None, P2=None, P3=None, theRL=0, theWL=0, theLtransL=0, theLthinL=0, theRR=0, theWR=0, theLtransR=0, theLthinR=0, theRI=0, theWI=0, theLtransI=0, theLthinI=0) + +The additional arguments are: +- \b theRL - Internal radius of left thickness reduction. +- \b theWL - Width of left thickness reduction. +- \b theLtransL - Length of left transition part. +- \b theLthinL - Length of left thin part. +- \b theRR - Internal radius of right thickness reduction. +- \b theWR - Width of right thickness reduction. +- \b theLtransR - Length of right transition part. +- \b theLthinR - Length of right thin part. +- \b theRI - Internal radius of incident thickness reduction. +- \b theWI - Width of incident thickness reduction. +- \b theLtransI - Length of incident transition part. +- \b theLthinI - Length of incident thin part. + +Example: + +\image html pipetshapethr.png + Our TUI Scripts provide you with useful examples of creation of \ref tui_creation_pipetshape "Advanced objects". diff --git a/doc/salome/gui/GEOM/static/header.html.in b/doc/salome/gui/GEOM/static/header.html.in index 4571b4363..d434d830d 100755 --- a/doc/salome/gui/GEOM/static/header.html.in +++ b/doc/salome/gui/GEOM/static/header.html.in @@ -5,6 +5,8 @@ $title + + $treeview $search $mathjax diff --git a/doc/salome/gui/GEOM/static/header_py.html.in b/doc/salome/gui/GEOM/static/header_py.html.in index 61414bb57..22abb143c 100644 --- a/doc/salome/gui/GEOM/static/header_py.html.in +++ b/doc/salome/gui/GEOM/static/header_py.html.in @@ -5,6 +5,8 @@ $title + + $treeview $search $mathjax diff --git a/doc/salome/tui/static/header.html.in b/doc/salome/tui/static/header.html.in index 4571b4363..d434d830d 100755 --- a/doc/salome/tui/static/header.html.in +++ b/doc/salome/tui/static/header.html.in @@ -5,6 +5,8 @@ $title + + $treeview $search $mathjax diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index d16392a9f..1e3a7c076 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -3935,6 +3935,8 @@ module GEOM */ interface GEOM_IAdvancedOperations : GEOM_IOperations { + // T-Shape WITHOUT Thickness reduction + /*! * \brief Create a T-shape object with specified caracteristics for the main and * the incident pipes (radius, width, half-length). @@ -4062,6 +4064,256 @@ module GEOM in double theR2, in double theW2, in double theL2, in double theRF, in boolean theHexMesh, in GEOM_Object theP1, in GEOM_Object theP2, in GEOM_Object theP3); + + // T-Shape WITH Thickness reduction + + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTR (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in boolean theHexMesh); + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTRWithPosition + (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in boolean theHexMesh, + in GEOM_Object theP1, in GEOM_Object theP2, in GEOM_Object theP3); + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). A chamfer is created + * on the junction of the pipes. + * + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theH Height of the chamfer. + * \param theW Width of the chamfer. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTRChamfer + (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in double theH, in double theW, in boolean theHexMesh); + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * + * A chamfer is created on the junction of the pipes. + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theH Height of the chamfer. + * \param theW Width of the chamfer. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTRChamferWithPosition + (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in double theH, in double theW, in boolean theHexMesh, + in GEOM_Object theP1, in GEOM_Object theP2, in GEOM_Object theP3); + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * + * A fillet is created on the junction of the pipes. + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theRF Radius of curvature of fillet. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTRFillet + (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in double theRF, in boolean theHexMesh); + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * + * A fillet is created on the junction of the pipes. + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theRF Radius of curvature of fillet. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTRFilletWithPosition + (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in double theRF, in boolean theHexMesh, + in GEOM_Object theP1, in GEOM_Object theP2, in GEOM_Object theP3); + /*! * This function allows to create a disk already divided into blocks. It * can be use to create divided pipes for later meshing in hexaedra. diff --git a/idl/Makefile.am b/idl/Makefile.am index b2cc80f0c..170e93658 100644 --- a/idl/Makefile.am +++ b/idl/Makefile.am @@ -53,8 +53,7 @@ OMNIORB_IDLPYFLAGS = @OMNIORB_IDLPYFLAGS@ -I$(top_builddir)/idl/salome -I$(KERN IDLCXXFLAGS = -bcxx @IDLCXXFLAGS@ -I$(top_builddir)/idl/salome -I$(KERNEL_ROOT_DIR)/idl/salome IDLPYFLAGS = @IDLPYFLAGS@ -I$(KERNEL_ROOT_DIR)/idl/salome -SUFFIXES = .idl .hh SK.cc -%SK.cc %.hh :: %.idl +%SK.cc %.hh : %.idl $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< install-exec-local: $(BASEIDL_FILES:%=$(top_srcdir)/idl/%) diff --git a/resources/Makefile.am b/resources/Makefile.am index 57c92dd2d..efee8ce49 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -244,7 +244,7 @@ coordsys.png \ translation.png ADVANCED_RESOURCES = -ADVANCED_RESOURCES += pipetshape.png tree_pipetshape.png pipetshape_import_icon.png +ADVANCED_RESOURCES += pipetshape.png tree_pipetshape.png pipetshape_import_icon.png pipetshape_section.png ADVANCED_RESOURCES += dlg_pipetshape.png dlg_pipetshapechamfer.png dlg_pipetshapefillet.png ADVANCED_RESOURCES += dlg_pipetshapel1.png dlg_pipetshaper1.png dlg_pipetshapew1.png ADVANCED_RESOURCES += dlg_pipetshapel2.png dlg_pipetshaper2.png dlg_pipetshapew2.png diff --git a/resources/pipetshape_section.png b/resources/pipetshape_section.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e93c4a7c7f5f64dd4ea11b7df41342ccca1133 GIT binary patch literal 12959 zcmZv?2RK|^*FSu;6e3cT=qZSpK_Xf(N<h5na^LCF0g1!Hnp2qBFYaB?zKq z^d2=ti*B^}j{AP^_j}&w`p&OqoOnGM)6;@)w=_W?(PQ@_^O@tqS}tdX@`L}Bh90gq>azDe5bCe&TmAV z-i(;Op|48|yt3RxxeF02OF>(^TL~V$=BPKpY4mQO6n4~(zU!K>!a+v<`7Kw=3_w6u z;JQAk_M8CVq?$K0OCe2mrgq*8;I0Nz0Dx$pEs6q2BMA@jzCdMx(gqYX%t-nb!kanh zWGI~20x6_ts9ltSt9NnWkYCpk0p_BMbik`;rX&E+JO7DS{YqrQI;QvowT_Pz5nQ}} zu`g3COqFH2VH~yLV>hVWBU?!%oN;5H5z9W7m1)uo6NC`gcGm!>Hp0m5eWpLRpoYbCj~ zPgDTbrgwnbL^+Ll%*@38fNwlQ<*JhDtdnwm&7TAkrsg|$2JO>&+@llErYoy>wY_g; z+IM+g>5_0AaJAqE6s{wFhTWy3a(~&QPtVtNDV|&zNWG0~qF}+ijH}7JP0j!?T!OwF z|7@MK;9t2ha5{H~)7^FPkIW(wf(REG1LNn$Z2Byp{rzOia;#?&J}C9}qXSz7Hn zqW^-NyVlxdS5>El{@#4=4&^TG-?EQtA_agX1=B#=Wf2mYUL;2K^6WIf z<$GzW<74<#WsSgq{g}J2p{F4UzHNdA67*6;*; z_piKlH;h)y#U<&D>;dRCC zyfDGBL8>%!kRWpW^L9DZbWK09lgJuG)qkCwzB;0nZ%Rvn^X*Sk*DIij7$t~W$~uvV z1;sm%4BDhwJtdQ&c=?2sDxgM?l_{aY7Z3+cf%|4UAkBFR+=5MBQ!E`mVL zwLl64e-AGSAT(dTw_<5k9q_cFzD0=J_6Ba zrcF9kRn2ecy~k9e(Y|-L-!$^=S3kXdeUm-O_$ZRtx0K2v1!AfxG`G7+JLfiw$45Uy z{H(`jmTOK<*Sb&Jvp36BFo4oi)0HSB^Pq}I-l|^|RkvBuYH^^ClS$>;kp&VKV za`jGR+l}gc=HGcV6QW)SZl8n5j9j#3)|h{xF!Scj5xjwY@XWA%D{=6kv43^m5pO@N z8{IDZpqkL=RxA*}bRBU7L1zi}>{q>!nLUkJO~>Z#Id3&6MQ1E~y;_%LRMX5@GfH`R zI;!Z-19z6Sm9&WBENedEd%rpr-D9#tkj3^ka0T$)#<{*QV(ulZ7bGI6-ITIMm10&p zl-_>)lA}<-)Gb^y9Gx}N7{LJ_ezgvcU1XGFPq95AylEe1m9AJev&q(uEZ*7DrY?O= z_8`AtArI31IlYfKangq=Y|WdI8Ip+6zAZSj!oM-88@0G%{^d!rX7vXV4(a|*5YRSgFM)22O_ak?+?1pC1&UU2) zJ^RG(SLHaFi#A&j#+7G6ik|Go;)@aDI`x6b}zv#Acjdg8J|D4OU% zzebh^F-ZHL@d?`6^m&lP4Dj_LNKPydGV$+ohL2G2?=Jdk%(Z_QeeIRqD2KiKG2)}$ z4WY6*hAI;rI4b)(Lj7HNP;nm7k8yQmR}6Z}6h+j`3E{j2$J;aV_g|&dZH*AYxEeI) zAZWrX8rMpv0Tu;Q8O95AzS@K;52NC|P4D#LhZ2K{#0bmmiM@b`cbWyYqp10Z6v68&;FDI1@x1;l7zes2udg_GQ0{g=rx#wx8I6Xh)PbrGwdlp zU*Ew*gD%_@-s$29hw-wok=6t>k=j|6)MRiHO;%O62D-X1J4Lr*wAmdb8Dm|!b6np9 zN?i)NPZr-Hz-0m-vonq_$PO+G3E*>bk)`-v?V|Y7*}BTJFw@607ipCF=V9b$3Y3mj z_s<&I`!m18Pl>taz7Q{#>7@X&&tzNY&OO61s-S7b;t_6!ZK?>0 zpjE>eulZ59l_`#X(;j*Z7W?mHJ|3qJx;F zUP<`<{5@ZzNefeJJ)q&FYa|NJk*>=HQ@jjJ_SWI(ETh~{sT3$s#Cx8YUR#5q>&y@Q zORmSI(5Lxcf(C&4ZtJ^{5Y?kDKxrv|z*NhQeAwzec6!UfgBX_r+YRg|Ex#N{;e(7+`P5l7O zOQg-M`X8%o7?6|LQ)|0@WRcX+VOg!41g1j5`UgAz3-5i!kFbwx`%zRdUg=|XGZGdp z`Mxl;Ae)j#sfjKkw+Ho~zwfT=)*F=#a-yXVSi8B%zUy7q4#q~Lpb0KMMoiSH-R#7; z{3sKfIjJ+WDi;l{io4I`vJFWRc*r|R>%k!M(Ts3>RrHwST+v|PMBMIrOK$IOIbifP z`%-lQ10BYzud5eL$A7#XGV`kZKwK#| zreC!5N_5)0P0*e@B@tO1{b#AhosCONbf5BRQ#)2V9X&YslahbeP0f2eQniY#25mX1 z<<6b7PcE%W8HR{4hYPxJCT1Inni*Gw&6;|ce-C?v!huiudUkV{e{Q@B}&NILOFG9wIER(vU=^w~!8U8(x7>6j8g{Bq12@ zwdn}7x|oVGoD<$Ky3TF6neqDn-d-Opi%PNNbRuMH5)Dy;7zw)G`GWYs5{Lc%WvpT zkc%|LMVp3nc*E7Y1y^lCC0RbNcqvs-5W#rwT7Dy~Zdu+*i@s*h$yB#~1J$JW6%3Uy!S#UzLza$V5&qiPpUqx_^Vq)v~MT6*yk)G68f^jczq_S3Env-B3tCM>1$7Z|kt z@!kx3S_s(PQk;CL8Vv012|fH2z}Bw z5y(dG(cem14#rVM2nP9aU1WMl8!LFQ7lIK4 z+LiCEq^>t$&<*fTGOBgX4uOb&x?&Dp$dq&L;z*7<<1uyLS^vsbcE?W}N4L z=Ibu`vGXO$`VUosiK2dWs9;GJ^`j#M?xEoJE}bDlF7Z}BNf{kQmD&x!uO2$+G=f-l0LEcB##?N&6A;eD-I z@K4lB;`12(!c%N18|D!m=G^FRY7exUuk(k^>)H$y*WxkJ5ezS#c%62xv7Brniby4jkg=ya2`X`p%Cus8Z_PJSnSG( zLA-_d$B6er@e=rjwe*%h{XL8kKOjXHFs^M3Vt3!qWOX#cJ``I7TkAwy{$lRVx@Uo& zc`QStEJL@4``!^vR$LX`aT6kEt!Zb%ox<|qN~209ja1f_*Z0a>kxoLmE3RJ(lGrob z=5`)Z&q(!qdS*BYtdgh;rTWy0es0l}*6fjh`rewbp*OZP;qf6NW;Z=(<%rJ*c0T+J z(*MGQ=+|&Q;i8_Ij;p&F9J4L8vTyc07#k3_WVSLODp6Kemhn_B`=Z#{xOAiCF9=hrl#DW89Ryea;~RUtX#?UD>fy*V7Q^2w_&EZrJg4q6B4vRSSVONt(&TG(1>%K?qs z$%IkcRwG{2Pu5B1!LpeQl5elzc_NWx6#e(YJXCjaT2d(o)rcPB)O0Ru8rlY8qNvte zfk9RTeLnOJ=e){Ri-)1`8(tVhJ0cfHD@~(ZXaO&U56_#&#Fg%cs?MF}_CVhv!!EOnHz zF^Ko1+_1PC{5RYA8Os+@hB!<<9ew$CIRq$>?SBN~{7NF#r&pE3)}%|7eRY8s##hZ0 zNFiRktoP#)3?dZ4T8yjKJIxAd8!Ney`RDoe-qRlo>KcdkOfEXtF}HE1_s_LTI1P+Q zw+4M>$dA^!6VW8ZgO3?2%5s~j%ZDSyw8Sknl%b^lfvD@5vw2xa%Th=npB2t+Eyh5% z!=eh*Wr8+>>(v>-!lzC2qab<#-X2by!lu}1e{Oe?U$UDkN)qYnem`o?%fY4HM(HG+ z+YY!$ok+CeO~_cTWsHenyyTj9RCmn>e0T@e5ned5QV!jrV)QF0fI8SAbn35w*DcAR z!yPgPlWx_9jtrVUO>y6^s}*hCKOTDXb+mey*5u#zT$@}ixUgd?(7$+~KeSmZKs@7` zeYIk*Vb-j(WY+fSCJ%%<@*gd)cEseOla+q#24@V&))V^H1;bLZomuuXYMg>Ar-<4w z5*Mr+iR6heJ7}Ten zDk7$3_2V}KU(o8 zJDt@@Tb5$Sy?^BB4Wpy_YN_T;{qL?Q9pg%15gNu8SQD|d3on(+Bn>B5~n5SqnR#7)qK9M%pi-cEk4cza7kbhza} zgN2UXP+(KN3nC>8X&QWxrX1BEE+*Xrwf$=w;_11~`o z8CmB)wwB#H^RgxJQ@0W)lhYTO(OAZzs5!%*kj-OCh zB!r-&V2~mA17-Q`EHI2y*?74&Wju<|CkRC7M%>q7qHg3N(DmE5`(QhFn?ipTt5~dH z+r96H^>QR?Rl$}!sy$%PeA3>UpJm&>v=B~&r|*Qcb-+-%w0LV;HuBv?-v&zCkw0v! zA4L6B$YO9q-4q+Cp=2T2XA66mYlZZsm1bal?-(9bf~VCsib76izXl z{z8AGj#q!~r}|;ug$Nky+`C1cKOyPr4DEq*k5bTK*lg$Wx_7#ioL1v~h>#SjG&#`E zCMWswkEPPxzdts3SV^FKx2ntoT}*4izt~Bkd(j~Q2}N&ZZKZImL#kyEB;(&2>8}L+ zWPej{z|XlExG**BsV0!(0^@Vg5;kPCojvA$PpM2ZG*u?Rq~!jpoVaKKpXnk-;7DC% zSQ_EzldPC3H6b>+Fs`wK6=(3u7hI%^81A_|yOeaDE`j~R_Uf`8yg**Qbl5T^K+;>{ zb^$Oodu(#$q>qheztM;9u|(acekaSx9J^`(jHHgfx?vmy+FfK7->7n5)57TYh8`m| zXX35(8BZ=^8S!_|{N(F;l-g{ms9(%@C-K|3b(lT3S9G$l$?QuMJQ&MjRD>(=cJkIX z%B`@L(`ioOh^%N-K#&}@95mjFcyk|IWiiL&Rp&2!jG4v<)i1&2IV7@n){L!GYU`RC z)R8XC*^7O=wW@C2*X6_0V!D|gLBQbfQuSUYX7!?1Ux=S-%&t797`Yd0U6$<8hce8; z#ablBJBT!pyHf3bu5q!cIeiS7*A~gltXtbW9-#pv8b`8~TKSE~fXJa=@$OIOKW^7^~8mVo9yz7Xt+;(lBntt~9;t~UWuXy+~EOB1|dikbRZL#bo{ zfnuku654ZbK)kGk*Xuq~StLFa1COHi)-Z1!iOwsWGZLEDPBOO!sneL}q>Qn`UfAW` z&Nfb1jZ~;@~QaV#8)< ztI?{MRMvE0k#v~0M*b&)A!EWjIMeo5ewVnE@iBTH$6r4>)1}e|eWYDY**{3p&?Zq2 zZqaFK))DYx{r-3?-W z+{*iS^RZ&W&Pg|0-=>`tEWcoF{nT^I<|2^r)8F0tAsf*RN6gk`iej^on2f6<1nW$V z`SDGpxSO(Jz%!lY#&|Tk)Y5-NZbdbk-`4J3w5x&hHhSODx41c=ixRZ(kK-X4P}QS26MjWGd61wuuf={-^rwWrY&&YC1*5k%ag1BaLyJ z{&MOhKg-*~q3;#a%{!t49kYHeWvvXo9Pd58LE4Quzd;h#ZQ+&Zso$#@D{jIxYvjIP zwWz}t!2TL>iwDinH6CS9xhAW(Gr!jQv%d5QSS><{I`6ZGysZ@6H0xX>CRfG~osviXMzn^72aU(Hjq{w?ID!Z2VqltR=^g z+6frs5jJ*`+e3$5a>FgwXHcK{_x+i!>EJS_?IcJp?!NNwxsy%`?#1r9(i@YWst@RZ z$+%Qs_pRgPnRhSD#_)9lcb;fH7;}O4@!WzBC#+q&W<~*w=ZQ=>g3BA9ZjC;*&O&&U z`>)<7q)x5(gtG$rb_1&?ZaT?<$f-AD2^VV%VbJZ;R=wtFk0WzpTL8#iAbhX@D8MsyfA8cW+eNa1fYc&QUw zrHntaSV~(OK?0PkCtF|UH6}QZsg}`+;<)b~34{;$yyV;+7_F%{$;$olg8&+aeXOl(}X+&yabU$cC^@91c2XEpy!@4ot7g7F*h zA|CBX8b2G@o_bTK|1Z^~%a_WflQ)I#PmgF9NU!E`)q3uv9;*}wade7kCXtUfx@9$| z#dgP$$%&Sjk)hH&0<^8&6^!0 zQy=}MM2^lJ?&3uEK(ITYf=P-A?;4EVx(L4cm>WMI{oH}obh}9Zi|rgf|2TbsQ%8~j zO|1E0RD{%#yxyj{1v0RQuV8|~qv6{JJ|A8`exf)CQSu^v8^Ah&8*=Bh0QECc2WKF9 zo<@;0YEla(bUy-UMs&&OSHM~up^1>QAW^fKp7b}(&cmo*9t_R|G{<@$zShy9*6ab3WuJfg_ zp2o(X2=RF*^F{As*X@0hbPAyVGRTu2l8zoub;qov>T9I4=nrT)3pdOk{rT4;5Mb}u z|HtQu>FDX{*p%#JRi|eLR#q(9-qM4{=!{V(vD(l1q7K&+SLIOQq)vrr4@vR`u-NpH z^~1Cfm4oltFlz0g=wwCb?dP+dnSv@HgaZgKeGR$B12s4rZ8fjTcNKk@qN}euqYS1H z_fCtGJg<|2MG|0`J&tcJEyoL>Gddp!Z*KBjIfs7${lF$o>3kGod){lbR8s<`d5i5j zXyu@a>~hgCs4@?)(o*{3hknxY!Uv=>yElR*KZ*91$y<8woQD$sWG#$-Fi?Odjv>{b zXf3t0yNUGWwN^M<9GM8q_yw*j;PoXaMR`pKrwE3lr$|8%^wvk}8oO#wseq;jNyBwm zFPgu$w$W4rM_ZOWk?%BJ-P6FF!TSyx?oG0nk;|3c&A)RKY&@g+@#07@DlQ|Ju8a9t)^J5NZkaf~O z*o*O7)*hZQBu?@yA-TKy9gS0HS|#I3qpNCViTn(yHqFd;O!uof7>U^P=7&d$X;p3*x^$gsW^d>wIq zn0=fSo5+sdTDx-h0r*+^-KSIm7vyF&j+UlQ2gf@~JC)_E@n4r{`ov354R8H@ix(hb zj`~|m?QGsf({hg=7XZo5GfT=nKod+U8q zl{DJ(O{nU6vdRko7}3c?Hyf`%A^X=9&UsAp{AxKMYcs4*cVDOBSG#5ycENg#P-3XP z12>b1HJ{ROnrBR<2V!|t<_A^%K?}%SsE@XqC==E#&&9>Qq3p(3WgpfU?yJruMP$K+ z(DX5iv+>$ar|6cdi%Na1u1(C>q%XJp;f8s6-=6XQD0Ft;K})`iaiFynlHefzP2{4$ zJ?#$k2}KF zs2;@c<>Z{KYsXlGvS9?A6m#C3*p4wu%+@O8zUwQMpUg^7yLuB6`J98ZPv}XvRkG!8 z8z4XHm&U7g<>b10{*}WyS#&acySoz`+NcBHp+psy*@8D~?#U)IDN_p1JLY&)qVwZf z*!t__I{&OgiKQ390cy{{{F~Y|`%3}XhiHojHXRZ?weKtb_|kUVpEXZ%s2OUh!P+FH zq)6)6rFI%?>C?|VU*zjijBXe@D`bz)$EF(kIi}s24cUAVQ>QNIdj~$YD5W*!{;h)3 z`ZD?rrE&-Lg|oDx6naP^+AUjZb@$XLc-H@g4GD@zl4gMW$ognW$|U>8@qKXhV=Lwe zn}%(T5yTO~M#dRT=NX>SesP&<@rc5U=BDEXYA?k*a>Of82KiSXAxOCOz$-L($N#f# zF}Com{pBnzQiO+13o#x_sT@Tvl6sYohd1v}jGQ^rUf9>&F7lSIyswQ$)3um$uyPLFt2+QeHG>%>KPXbe#gFgQg8h4fmBO z%@wqzzfRI_u|hDVGAswT``z>>jl8$Q*n*4DZn>hSAm{{N1aCIL!OX3?J&D+D$tXPN zbKae|l*zX3Tg%1x?dKFQE3;RHaKF#eeQpbZhQC_1iJwYggbynp;N4N9j|nY}ht5ddK+~rgm4sLM#@L6;Y%-&SQK{hzKRh96T3gWB_VgA5^8|<1 z!>$H<>luizcmJCbD~q*vO{8%AZU5%4q4d)}biUh);CbeizQFk4M}g}r#wxotZ}}2f zkMVP3(c=d3)sE`XQBO@z;r!~gBfrhl(Hna1&usEOsj}Ya%CF51MjprM1uv#YjKx)` z(WZPUF^1~ZfY~%GOA_Z>wYBvjkM%q4Q@6Tf=DsRL&t(zz%)XCe|7HSIT{Z-&DcrNa zf|obMK&6a&Ay9$i8+7y-C_nGto`(v)LLx>3Mx(H_|# zb?zrXb8~HIDP7LUUevtDr;K5b+o4o;+7S=ll-EKagiB*%Z4ccoAAm;)2_1cb+m8W( z8!+C8xc4h&W|PaKF$;P&!ZYwnSG%P87dWzL<45&*IK{GjiB$YRiwhx|lB)YNrdctJ z3$JUUM(cYhlQ|3HefNg&piL#pmk7by6f`$^xXsK;ESWXSUm)}UkdnQ!lAARjAeWwXfu+hZZok#_Q=!^ivAw!5B-|7nr}4OOLZ!a@0`llHIa7UL1NtbN{y z44RpN)|Tp%tpWw4U~E>2d}}tP!wK$|PCuE%SX*^c>`0-(lb!M`XR#-~8GnJ3+}Oe4 z3hbVMDJCAq$HShR>i2dcFPt%SSDNuT#&I5u^m%C^B+-06ZYnkhHV^+?Tslhk*}U_3 zPQZ$dzJ0MFg(KdKUdPhGw(j6ra~ybrv0u@7OScQCon&Ly2X~@ky5U}9HH(`sgm%i+ zZC2K!Z7-KVZJ!84OGR65Doxu{h%`>PdN2OFq~OIDWV|!8RV8!LCY#6uduuS`x)9Fj zd@KP1>FudRuzaa~BFY-Z)9lvC6)3-?o>|Xcbs4fuVti$_kdmiJ(mhe@udYUoBG}+6 z=rv2ArLmQxeut6s>!Eui0SGRbCJ`Um?kD@_{k0)L(Y+6G_X)nphNZe)WuT zb}}j*k9(vhIPTpp!81z9j~Ob;(*l(gS2$t*GtZi{dSAU5^S!mjWlS?VqH~&vM;uqZ zw+uVTDVYBciP;zA6uj_mLp}s4t640WnI*9&rkCaqc?AYBD}aSeCfh3-%~w5VeO|@T zuDNI$S2}Ns_6g}%l0Qw?%M_X z2ONo$m`zxQ0tI%yO)H`sJ~rl-iN{ZYqTYM`0N$>+&0$LhhUa%J8h-rLzZc@0G_~Jz zF6_*fpz*bJR;v(dklN%YFT|0Euq-^fpq2~Nue3gwK)MoFf0!hEuE<}gW3BE|$yBaa&(YkAr7pf?QEP7EWd`B93I}gP?M8)aL<>C`=n;O%P{-~-51%lHK55J z>6ksCRrpO8VQ8#-AH+8S0D&|L59l6dwP~Uxr@tx(Am>is^4NoQ+6tXz0%YDRVu zs8)&#QetaH%DO#gi32NDk=g0I$MtPnrK!coBKc?QMKRa5f=B~UZoc?Fz8MkI+)9>? z9@|yayg*8a!^`=dP1gA)WfFAqtw{@MH_7iKho#};2 zlGR{=2#{tZOiiv$9^$jJbNhf(d$3p*jOo*u!^ne&lYGH)Jg^q|Es*eoZ~*Q+FwHQb zy^{=bgbZ=e@$HMhyq*JAmiIe!qm;HWDuXp^2VnK|E0>XznI5%vr2$?5;LcL~Yjj}- zYTHss9tc*fujOs$TipZ;HFLM-CxMz!Fkv8FCFs_EZ3iS2K&6{ZSDvRK%zhV7CpEJ$ zv*2&7C#|>V`}3)R$?e1f4}(qSeqno`;x7%oMa8K*Ik@ufQr8Iv-?~2guRCDA;W^8Q zaqsh`7mwTnz!HDuZbLW2Qrl)ucC8wBA^;fN#+46nQES_SxjDcmBR>!e5#P)hM-g@1 z65;}Xk^#KKLrwUq*eesK#+ny8|88Rbp*hj5oRwp0l8^7ojG5_ zhR~TEkN_-e+(T(3FS%>6lPM?8`~|4fkI=+#hW*4p0;?qQYvy(wCr_wO@-$a!{AELc;N!jg7ylQ;QChk^W>r0=~muV`jtg*Df#4 z?k>A|rI$tVG3HAAl`Ol_H{cC@JPuE^`Mi)sb0Fwjl zU-HJQdq+vt_<-BRk>W&^k+Hpj8p3TbqJB3%Dpl1Zw&`+1&Pb=wf_b?9hVLe5-qOEq zF1@@7rd!fBFF|z-mQ_LdLS#>rM>jXEO<~+mrXlSv&31#i;z2ZsBy~nCAeY z2K8lg>BBVu(6!x;<|R!0Mj}3**Q?WN9B>*`#y952oWI#+cPdxz(t~y#5M|h4sa%{7 tt%uQH0G6?p#-+%CJuo@+e|})a7W;+`x?uE5T>N #include #include +#include #include #include -#include // OCCT Includes +#include +#include #include #include #include #include -#include #include -#include + +#include #include //================================================================================= // Constructor //================================================================================= -AdvancedGUI_PipeTShapeDlg::AdvancedGUI_PipeTShapeDlg(GeometryGUI* theGeometryGUI, QWidget* parent) : - GEOMBase_Skeleton(theGeometryGUI, parent, false) { - QPixmap imageOp(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPETSHAPE"))); - QPixmap imageSel(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); - imageImp = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICO_PIPETSHAPE_IMPORT")); - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); - - setWindowTitle(tr("GEOM_PIPE_TSHAPE_TITLE")); - - /***************************************************************/ - mainFrame()->GroupConstructors->setTitle(tr("GEOM_PIPE_TSHAPE")); - mainFrame()->RadioButton1->setIcon(imageOp); - mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose); - mainFrame()->RadioButton2->close(); - mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); - mainFrame()->RadioButton3->close(); - - QGridLayout* myMainLayout = new QGridLayout(centralWidget()); - myMainLayout->setMargin(0); - myMainLayout->setSpacing(6); - - tshapeScreenShotLabel = new QLabel(); - tshapeScreenShotLabel->setSizePolicy(QSizePolicy::Expanding, - QSizePolicy::Expanding); - tshapeScreenShotLabel->setAlignment(Qt::AlignCenter); - tshapeScreenShotLabel->setMinimumSize(100, 100); - - MainTubeGroupParams = new DlgRef_3Spin(); - MainTubeGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_MPIPE")); - MainTubeGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); - MainTubeGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_W")); - MainTubeGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_L")); - - IncidentTubeGroupParams = new DlgRef_3Spin(); - IncidentTubeGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_IPIPE")); - IncidentTubeGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); - IncidentTubeGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_W")); - IncidentTubeGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_L")); - - ChamferGroupParams = new DlgRef_2Spin(); - ChamferGroupParams->GroupBox1->setCheckable(true); - ChamferGroupParams->GroupBox1->setChecked(false); - ChamferGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_CHAMFER")); - ChamferGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_CHAMFER_H")); - ChamferGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_CHAMFER_W")); - - FilletGroupParams = new DlgRef_1Spin(); - FilletGroupParams->GroupBox1->setCheckable(true); - FilletGroupParams->GroupBox1->setChecked(false); - FilletGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_FILLET")); - FilletGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); - - HexMeshCheckBox = new QCheckBox(); - HexMeshCheckBox->setText(tr("GEOM_PIPE_TSHAPE_HEX")); - HexMeshCheckBox->setChecked(true); - - JunctionPointsSel = new DlgRef_6Sel(); - JunctionPointsSel->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_POSITION")); - JunctionPointsSel->GroupBox1->setCheckable(true); - JunctionPointsSel->GroupBox1->setChecked(false); - JunctionPointsSel->PushButton1->setIcon(imageSel); - JunctionPointsSel->LineEdit1->setReadOnly(true); - JunctionPointsSel->LineEdit1->setText(""); - JunctionPointsSel->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P1")); - - JunctionPointsSel->PushButton2->setIcon(imageSel); - JunctionPointsSel->LineEdit2->setReadOnly(true); - JunctionPointsSel->LineEdit2->setText(""); - JunctionPointsSel->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P2")); - - JunctionPointsSel->PushButton3->setIcon(imageSel); - JunctionPointsSel->LineEdit3->setReadOnly(true); - JunctionPointsSel->LineEdit3->setText(""); - JunctionPointsSel->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P3")); - - JunctionPointsSel->PushButton4->setIcon(imageImp); - JunctionPointsSel->LineEdit4->setReadOnly(true); - JunctionPointsSel->LineEdit4->setText(""); - JunctionPointsSel->TextLabel4->setText(tr("GEOM_PIPE_TSHAPE_POSITION_LBL_L1")); - - JunctionPointsSel->PushButton5->setIcon(imageImp); - JunctionPointsSel->LineEdit5->setReadOnly(true); - JunctionPointsSel->LineEdit5->setText(""); - JunctionPointsSel->TextLabel5->setText(tr("GEOM_PIPE_TSHAPE_POSITION_LBL_L2")); - - JunctionPointsSel->PushButton6->setAttribute(Qt::WA_DeleteOnClose); - JunctionPointsSel->PushButton6->close(); - JunctionPointsSel->LineEdit6->setAttribute(Qt::WA_DeleteOnClose); - JunctionPointsSel->LineEdit6->close(); - JunctionPointsSel->TextLabel6->setAttribute(Qt::WA_DeleteOnClose); - JunctionPointsSel->TextLabel6->close(); - - // 1st row, height = 1, colspan = 3 - int rowPict = 0, colPict = 0, rowspanPict = 1, colspanPict = 3; - // 2nd row, height = 4, col 1 - int rowMain = rowspanPict, colMain = 0, rowspanMain = 2, colspanMain = 1; - int rowCham = rowspanPict + rowspanMain, colCham = 0, rowspanCham = 2, colspanCham = 1; - // 2nd row, height = 4, col 2 - int rowInc = rowspanPict, colInc = 1, rowspanInc = 2, colspanInc = 1; - int rowFill = rowspanPict + rowspanInc, colFill = 1, rowspanFill = 1, colspanFill = 1; - int rowHex = rowspanPict + rowspanInc + rowspanFill, colHex = 1, rowspanHex = 1, colspanHex = 1; - // 2nd row, height = 4, col 3 - int rowNewPosVal = rowspanPict, colNewPosVal = 2, rowspanNewPosVal = 4, colspanNewPosVal = 1; - - myMainLayout->addWidget(tshapeScreenShotLabel, rowPict, colPict, rowspanPict, colspanPict); - - myMainLayout->addWidget(MainTubeGroupParams, rowMain, colMain, rowspanMain, colspanMain); - myMainLayout->addWidget(FilletGroupParams, rowFill, colFill, rowspanFill, colspanFill); - myMainLayout->addWidget(HexMeshCheckBox, rowHex, colHex, rowspanHex, colspanHex); - - myMainLayout->addWidget(IncidentTubeGroupParams, rowInc, colInc, rowspanInc, colspanInc); - myMainLayout->addWidget(ChamferGroupParams, rowCham, colCham, rowspanCham, colspanCham); - - myMainLayout->addWidget(JunctionPointsSel, rowNewPosVal, colNewPosVal, rowspanNewPosVal, colspanNewPosVal); - /***************************************************************/ - - setHelpFileName("create_pipetshape_page.html"); - - Init(); +AdvancedGUI_PipeTShapeDlg::AdvancedGUI_PipeTShapeDlg (GeometryGUI* theGeometryGUI, QWidget* parent) + : GEOMBase_Skeleton(theGeometryGUI, parent, false) +{ + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + //QPixmap imageOp = aResMgr->loadPixmap("GEOM", tr("ICON_DLG_PIPETSHAPE")); + QPixmap imageSel = aResMgr->loadPixmap("GEOM", tr("ICON_SELECT")); + QPixmap imageImp = aResMgr->loadPixmap("GEOM", tr("ICO_PIPETSHAPE_IMPORT")); + imagePipeTShape = aResMgr->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); + imageReduction = aResMgr->loadPixmap("GEOM", tr("IMG_PIPETSHAPE_SECT")); + + setWindowTitle(tr("GEOM_PIPE_TSHAPE_TITLE")); + + /***************************************************************/ + mainFrame()->GroupConstructors->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->GroupConstructors->close(); + + QTabWidget* aTabWidget = new QTabWidget (centralWidget()); + + QGridLayout* myMainLayout = new QGridLayout (centralWidget()); + myMainLayout->setMargin(0); + myMainLayout->setSpacing(6); + + // Main parameters + QGroupBox* GroupMain = new QGroupBox(); + QGridLayout* layoutGroupMain = new QGridLayout (GroupMain); + + MainTubeGroupParams = new DlgRef_3Spin(); + MainTubeGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_MPIPE")); + MainTubeGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); + MainTubeGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_W")); + MainTubeGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_L")); + MainTubeGroupParams->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); // ?? + + IncidentTubeGroupParams = new DlgRef_3Spin(); + IncidentTubeGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_IPIPE")); + IncidentTubeGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); + IncidentTubeGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_W")); + IncidentTubeGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_L")); + + ChamferGroupParams = new DlgRef_2Spin(); + ChamferGroupParams->GroupBox1->setCheckable(true); + ChamferGroupParams->GroupBox1->setChecked(false); + ChamferGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_CHAMFER")); + ChamferGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_CHAMFER_H")); + ChamferGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_CHAMFER_W")); + + FilletGroupParams = new DlgRef_1Spin(); + FilletGroupParams->GroupBox1->setCheckable(true); + FilletGroupParams->GroupBox1->setChecked(false); + FilletGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_FILLET")); + FilletGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); + + HexMeshCheckBox = new QCheckBox(); + HexMeshCheckBox->setText(tr("GEOM_PIPE_TSHAPE_HEX")); + HexMeshCheckBox->setChecked(true); + + LabelImgPipeTShape = new QLabel(); + LabelImgPipeTShape->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + LabelImgPipeTShape->setAlignment(Qt::AlignCenter); + LabelImgPipeTShape->setMinimumSize(300, 300); + + layoutGroupMain->addWidget(MainTubeGroupParams, 0, 0, 1, 1); + layoutGroupMain->addWidget(IncidentTubeGroupParams, 1, 0, 1, 1); + layoutGroupMain->addWidget(ChamferGroupParams, 2, 0, 1, 1); + layoutGroupMain->addWidget(FilletGroupParams, 3, 0, 1, 1); + layoutGroupMain->addWidget(HexMeshCheckBox, 4, 0, 1, 1); + + layoutGroupMain->addWidget(LabelImgPipeTShape, 0, 1, 5, 1); + layoutGroupMain->setColumnStretch(1, 1); // stretch of column 0 is supposed 0 by default + + // Thickness reduction parameters + QGroupBox* GroupReduct = new QGroupBox(); + QGridLayout* layoutGroupReduct = new QGridLayout (GroupReduct); + + LReductionGroupParams = new AdvancedGUI_4Spin(); + LReductionGroupParams->GroupBox1->setCheckable(true); + LReductionGroupParams->GroupBox1->setChecked(false); + LReductionGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_LEFT_TR")); + LReductionGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_TR_R").arg("L")); + LReductionGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_TR_W").arg("L")); + LReductionGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_TR_L_TRANS").arg("L")); + LReductionGroupParams->TextLabel4->setText(tr("GEOM_PIPE_TSHAPE_TR_L_THIN").arg("L")); + + RReductionGroupParams = new AdvancedGUI_4Spin(); + RReductionGroupParams->GroupBox1->setCheckable(true); + RReductionGroupParams->GroupBox1->setChecked(false); + RReductionGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_RIGHT_TR")); + RReductionGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_TR_R").arg("R")); + RReductionGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_TR_W").arg("R")); + RReductionGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_TR_L_TRANS").arg("R")); + RReductionGroupParams->TextLabel4->setText(tr("GEOM_PIPE_TSHAPE_TR_L_THIN").arg("R")); + + IReductionGroupParams = new AdvancedGUI_4Spin(); + IReductionGroupParams->GroupBox1->setCheckable(true); + IReductionGroupParams->GroupBox1->setChecked(false); + IReductionGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_INCI_TR")); + IReductionGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_TR_R").arg("I")); + IReductionGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_TR_W").arg("I")); + IReductionGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_TR_L_TRANS").arg("I")); + IReductionGroupParams->TextLabel4->setText(tr("GEOM_PIPE_TSHAPE_TR_L_THIN").arg("I")); + + LabelImgReduction = new QLabel(); + LabelImgReduction->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + LabelImgReduction->setAlignment(Qt::AlignCenter); + LabelImgReduction->setMinimumSize(300, 300); + + layoutGroupReduct->addWidget(LReductionGroupParams->GroupBox1, 0, 0, 1, 1); + layoutGroupReduct->addWidget(RReductionGroupParams->GroupBox1, 1, 0, 1, 1); + layoutGroupReduct->addWidget(IReductionGroupParams->GroupBox1, 2, 0, 1, 1); + + layoutGroupReduct->addWidget(LabelImgReduction, 0, 1, 3, 1); + layoutGroupReduct->setColumnStretch(1, 1); // stretch of column 0 is supposed 0 by default + + // Position parameters + QGroupBox* GroupPos = new QGroupBox(); + QVBoxLayout* layoutGroupPos = new QVBoxLayout (GroupPos); + + JunctionPointsSel = new DlgRef_6Sel(); + JunctionPointsSel->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_POSITION")); + JunctionPointsSel->GroupBox1->setCheckable(true); + JunctionPointsSel->GroupBox1->setChecked(false); + JunctionPointsSel->PushButton1->setIcon(imageSel); + JunctionPointsSel->LineEdit1->setReadOnly(true); + JunctionPointsSel->LineEdit1->setText(""); + JunctionPointsSel->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P1")); + + JunctionPointsSel->PushButton2->setIcon(imageSel); + JunctionPointsSel->LineEdit2->setReadOnly(true); + JunctionPointsSel->LineEdit2->setText(""); + JunctionPointsSel->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P2")); + + JunctionPointsSel->PushButton3->setIcon(imageSel); + JunctionPointsSel->LineEdit3->setReadOnly(true); + JunctionPointsSel->LineEdit3->setText(""); + JunctionPointsSel->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P3")); + + JunctionPointsSel->PushButton4->setIcon(imageImp); + JunctionPointsSel->LineEdit4->setReadOnly(true); + JunctionPointsSel->LineEdit4->setText(""); + JunctionPointsSel->TextLabel4->setText(tr("GEOM_PIPE_TSHAPE_POSITION_LBL_L1")); + + JunctionPointsSel->PushButton5->setIcon(imageImp); + JunctionPointsSel->LineEdit5->setReadOnly(true); + JunctionPointsSel->LineEdit5->setText(""); + JunctionPointsSel->TextLabel5->setText(tr("GEOM_PIPE_TSHAPE_POSITION_LBL_L2")); + + JunctionPointsSel->PushButton6->setAttribute(Qt::WA_DeleteOnClose); + JunctionPointsSel->PushButton6->close(); + JunctionPointsSel->LineEdit6->setAttribute(Qt::WA_DeleteOnClose); + JunctionPointsSel->LineEdit6->close(); + JunctionPointsSel->TextLabel6->setAttribute(Qt::WA_DeleteOnClose); + JunctionPointsSel->TextLabel6->close(); + + layoutGroupPos->addWidget(JunctionPointsSel); + layoutGroupPos->addStretch(); + + //aTabWidget->addTab(GroupMain, imageOp, tr("GEOM_PIPETSHAPE_GROUPMAIN")); + aTabWidget->addTab(GroupMain, tr("GEOM_PIPETSHAPE_GROUPMAIN")); + aTabWidget->addTab(GroupReduct, tr("GEOM_PIPETSHAPE_GROUPREDUCT")); + aTabWidget->addTab(GroupPos, tr("GEOM_PIPETSHAPE_GROUPPOS")); + + myMainLayout->addWidget(aTabWidget, 0, 0, 1, 1); + connect(aTabWidget, SIGNAL(currentChanged(int)), this, SLOT(currentChanged(int))); + /***************************************************************/ + + setHelpFileName("create_pipetshape_page.html"); + + Init(); } //================================================================================= // Destructor //================================================================================= AdvancedGUI_PipeTShapeDlg::~AdvancedGUI_PipeTShapeDlg() { - // no need to delete child widgets, Qt does it all for us + // no need to delete child widgets, Qt does it all for us } //================================================================================= // function : Init() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::Init() { - // Get setting of step value from file configuration - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); - - myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); - myOkPoint1 = myOkPoint2 = myOkPoint3 = false; - - pipeTShapeGroupObjects.clear(); - - // min, max, step and decimals for spin boxes - initSpinBox(MainTubeGroupParams->SpinBox_DX, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(MainTubeGroupParams->SpinBox_DY, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(MainTubeGroupParams->SpinBox_DZ, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(IncidentTubeGroupParams->SpinBox_DX, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(IncidentTubeGroupParams->SpinBox_DY, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(IncidentTubeGroupParams->SpinBox_DZ, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(ChamferGroupParams->SpinBox_DX, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(ChamferGroupParams->SpinBox_DY, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(FilletGroupParams->SpinBox_DX, Precision::Approximation(), COORD_MAX, step, "length_precision"); - - // init variables - MainTubeGroupParams->SpinBox_DX->setValue(80); - MainTubeGroupParams->SpinBox_DY->setValue(20); - MainTubeGroupParams->SpinBox_DZ->setValue(200); - IncidentTubeGroupParams->SpinBox_DX->setValue(50); - IncidentTubeGroupParams->SpinBox_DY->setValue(20); - IncidentTubeGroupParams->SpinBox_DZ->setValue(200); - ChamferGroupParams->SpinBox_DX->setValue(20); - ChamferGroupParams->SpinBox_DY->setValue(10); - FilletGroupParams->SpinBox_DX->setValue(20); - - CssNormal = QString("QDoubleSpinBox {"); - CssNormal.append(MainTubeGroupParams->SpinBox_DZ->styleSheet()); - CssNormal.append("}"); - CssNormal.append("\nQPushButton {"); - CssNormal.append(JunctionPointsSel->PushButton4->styleSheet()); - CssNormal.append("}"); - CssAcceptable = "QDoubleSpinBox, QPushButton {background-color: rgb(85, 170, 127)}"; - CssRefused = "QDoubleSpinBox, QPushButton {background-color: rgb(255, 0, 0)}"; - - showOnlyPreviewControl(); - - // Signal/slot connections - connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double))); - // ValueChangedInSpinBox - connect(MainTubeGroupParams->SpinBox_DX, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(MainTubeGroupParams->SpinBox_DY, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(IncidentTubeGroupParams->SpinBox_DX, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(IncidentTubeGroupParams->SpinBox_DY, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(ChamferGroupParams->SpinBox_DX, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(ChamferGroupParams->SpinBox_DY, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(FilletGroupParams->SpinBox_DX, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - // ChamferOrFillet - connect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); - connect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); - // Preview -// connect(PreviewPushButton, SIGNAL(clicked()), this, SLOT(DisplayPreview())); - // Position - connect(JunctionPointsSel->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(SetPosition(bool))); - connect(JunctionPointsSel->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(JunctionPointsSel->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(JunctionPointsSel->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - // ApplyNewDimensions - connect(JunctionPointsSel->PushButton4, SIGNAL(clicked()), this, SLOT(ApplyNewDimensions())); - connect(JunctionPointsSel->PushButton5, SIGNAL(clicked()), this, SLOT(ApplyNewDimensions())); - connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(UpdatePicture(QWidget*, QWidget*))); - //@@ put additional signal/slot connections here @@// - - initName(tr("GEOM_PIPE_TSHAPE")); - updateTshapeScreenshotLabel(); - processPreview(); +void AdvancedGUI_PipeTShapeDlg::Init() +{ + // Get setting of step value from file configuration + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); + double minValue = Precision::Approximation(); + + myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); + myOkPoint1 = myOkPoint2 = myOkPoint3 = false; + + pipeTShapeGroupObjects.clear(); + + // min, max, step and decimals for spin boxes + initSpinBox(MainTubeGroupParams->SpinBox_DX, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(MainTubeGroupParams->SpinBox_DY, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(MainTubeGroupParams->SpinBox_DZ, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IncidentTubeGroupParams->SpinBox_DX, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IncidentTubeGroupParams->SpinBox_DY, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IncidentTubeGroupParams->SpinBox_DZ, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(ChamferGroupParams->SpinBox_DX, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(ChamferGroupParams->SpinBox_DY, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(FilletGroupParams->SpinBox_DX, minValue, COORD_MAX, step, "length_precision"); + + initSpinBox(LReductionGroupParams->SpinBox1, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(LReductionGroupParams->SpinBox2, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(LReductionGroupParams->SpinBox3, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(LReductionGroupParams->SpinBox4, 0., COORD_MAX, step, "length_precision"); + + initSpinBox(RReductionGroupParams->SpinBox1, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(RReductionGroupParams->SpinBox2, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(RReductionGroupParams->SpinBox3, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(RReductionGroupParams->SpinBox4, 0., COORD_MAX, step, "length_precision"); + + initSpinBox(IReductionGroupParams->SpinBox1, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IReductionGroupParams->SpinBox2, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IReductionGroupParams->SpinBox3, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IReductionGroupParams->SpinBox4, 0., COORD_MAX, step, "length_precision"); + + // init variables + MainTubeGroupParams->SpinBox_DX->setValue(80); + MainTubeGroupParams->SpinBox_DY->setValue(20); + MainTubeGroupParams->SpinBox_DZ->setValue(200); + IncidentTubeGroupParams->SpinBox_DX->setValue(50); + IncidentTubeGroupParams->SpinBox_DY->setValue(20); + IncidentTubeGroupParams->SpinBox_DZ->setValue(200); + ChamferGroupParams->SpinBox_DX->setValue(20); + ChamferGroupParams->SpinBox_DY->setValue(10); + FilletGroupParams->SpinBox_DX->setValue(20); + + LReductionGroupParams->SpinBox1->setValue(60); + LReductionGroupParams->SpinBox2->setValue(30); + LReductionGroupParams->SpinBox3->setValue(40); + LReductionGroupParams->SpinBox4->setValue(20); + + RReductionGroupParams->SpinBox1->setValue(60); + RReductionGroupParams->SpinBox2->setValue(30); + RReductionGroupParams->SpinBox3->setValue(40); + RReductionGroupParams->SpinBox4->setValue(20); + + IReductionGroupParams->SpinBox1->setValue(40); + IReductionGroupParams->SpinBox2->setValue(10); + IReductionGroupParams->SpinBox3->setValue(30); + IReductionGroupParams->SpinBox4->setValue(15); + + CssNormal = QString("QDoubleSpinBox {"); + CssNormal.append(MainTubeGroupParams->SpinBox_DZ->styleSheet()); + CssNormal.append("}"); + CssNormal.append("\nQPushButton {"); + CssNormal.append(JunctionPointsSel->PushButton4->styleSheet()); + CssNormal.append("}"); + CssAcceptable = "QDoubleSpinBox, QPushButton {background-color: rgb(85, 170, 127)}"; + CssRefused = "QDoubleSpinBox, QPushButton {background-color: rgb(255, 0, 0)}"; + + showOnlyPreviewControl(); + + // Signal/slot connections + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double))); + //connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); + // ValueChangedInSpinBox + connect(MainTubeGroupParams->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(MainTubeGroupParams->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(IncidentTubeGroupParams->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(IncidentTubeGroupParams->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(ChamferGroupParams->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(ChamferGroupParams->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(FilletGroupParams->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + // ChamferOrFillet + connect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); + connect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); + // Preview + //connect(PreviewPushButton, SIGNAL(clicked()), this, SLOT(DisplayPreview())); + // Position + connect(JunctionPointsSel->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(SetPosition(bool))); + connect(JunctionPointsSel->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(JunctionPointsSel->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(JunctionPointsSel->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + // ApplyNewDimensions + connect(JunctionPointsSel->PushButton4, SIGNAL(clicked()), this, SLOT(ApplyNewDimensions())); + connect(JunctionPointsSel->PushButton5, SIGNAL(clicked()), this, SLOT(ApplyNewDimensions())); + connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(UpdatePicture(QWidget*, QWidget*))); + //@@ put additional signal/slot connections here @@// + + initName(tr("GEOM_PIPE_TSHAPE")); + + qApp->processEvents(); + updateGeometry(); + resize(minimumSizeHint()); + + updateLabelImgPipeTShape(); + LabelImgReduction->setPixmap(imageReduction.scaled(LabelImgReduction->size(), + Qt::KeepAspectRatio, + Qt::SmoothTransformation)); + processPreview(); +} + +//================================================================================= +// function : currentChanged() +// purpose : Tab widget management +//================================================================================= +void AdvancedGUI_PipeTShapeDlg::currentChanged (int tabId) +{ + if (tabId == 0 || tabId == 1) + resizeEvent(NULL); } //================================================================================= // function : ApplyNewDimensions() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::ApplyNewDimensions() { - QPushButton* send = (QPushButton*) sender(); - - bool ok = false; - double newVal; - if (send == JunctionPointsSel->PushButton4) { - if (!JunctionPointsSel->LineEdit4->text().isEmpty()) { - newVal = JunctionPointsSel->LineEdit4->text().toDouble(&ok); - if (ok) { - disconnect(MainTubeGroupParams->SpinBox_DZ, 0, this, 0); - MainTubeGroupParams->SpinBox_DZ->setValue(newVal); - connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - MainTubeGroupParams->SpinBox_DZ->setToolTip(""); - MainTubeGroupParams->SpinBox_DZ->setStyleSheet("background-color: rgb(255, 255, 255);"); - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); - } - } +void AdvancedGUI_PipeTShapeDlg::ApplyNewDimensions() +{ + QPushButton* send = (QPushButton*) sender(); + + bool ok = false; + double newVal; + if (send == JunctionPointsSel->PushButton4) { + if (!JunctionPointsSel->LineEdit4->text().isEmpty()) { + newVal = JunctionPointsSel->LineEdit4->text().toDouble(&ok); + if (ok) { + disconnect(MainTubeGroupParams->SpinBox_DZ, 0, this, 0); + MainTubeGroupParams->SpinBox_DZ->setValue(newVal); + connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); + MainTubeGroupParams->SpinBox_DZ->setToolTip(""); + MainTubeGroupParams->SpinBox_DZ->setStyleSheet("background-color: rgb(255, 255, 255);"); + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); + } } - else if (send == JunctionPointsSel->PushButton5) { - if (!JunctionPointsSel->LineEdit5->text().isEmpty()) { - newVal = JunctionPointsSel->LineEdit5->text().toDouble(&ok); - if (ok) { - disconnect(IncidentTubeGroupParams->SpinBox_DZ, 0, this, 0); - IncidentTubeGroupParams->SpinBox_DZ->setValue(newVal); - connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - IncidentTubeGroupParams->SpinBox_DZ->setToolTip(""); - IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet("background-color: rgb(255, 255, 255);"); - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); - } - } + } + else if (send == JunctionPointsSel->PushButton5) { + if (!JunctionPointsSel->LineEdit5->text().isEmpty()) { + newVal = JunctionPointsSel->LineEdit5->text().toDouble(&ok); + if (ok) { + disconnect(IncidentTubeGroupParams->SpinBox_DZ, 0, this, 0); + IncidentTubeGroupParams->SpinBox_DZ->setValue(newVal); + connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); + IncidentTubeGroupParams->SpinBox_DZ->setToolTip(""); + IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet("background-color: rgb(255, 255, 255);"); + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); + } } + } } //================================================================================= // function : UpdatePicture() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::UpdatePicture(QWidget* old, QWidget* now) { - - if (ChamferGroupParams->GroupBox1->isChecked()) - if (now == MainTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_R1")); - else if (now == MainTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W1")); - else if (now == MainTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_L1")); - else if (now == IncidentTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_R2")); - else if (now == IncidentTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W2")); - else if (now == IncidentTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_L2")); - else if (now == ChamferGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_H")); - else if (now == ChamferGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W")); - else - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER")); - else if (FilletGroupParams->GroupBox1->isChecked()) - if (now == MainTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_R1")); - else if (now == MainTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_W1")); - else if (now == MainTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_L1")); - else if (now == IncidentTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_R2")); - else if (now == IncidentTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_W2")); - else if (now == IncidentTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_L2")); - else if (now == FilletGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_RF")); - else - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET")); - else - if (now == MainTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_R1")); - else if (now == MainTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_W1")); - else if (now == MainTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_L1")); - else if (now == IncidentTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_R2")); - else if (now == IncidentTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_W2")); - else if (now == IncidentTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_L2")); - else - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); - - updateTshapeScreenshotLabel(); +void AdvancedGUI_PipeTShapeDlg::UpdatePicture (QWidget* old, QWidget* now) +{ + if (ChamferGroupParams->GroupBox1->isChecked()) + if (now == MainTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_R1")); + else if (now == MainTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W1")); + else if (now == MainTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_L1")); + else if (now == IncidentTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_R2")); + else if (now == IncidentTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W2")); + else if (now == IncidentTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_L2")); + else if (now == ChamferGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_H")); + else if (now == ChamferGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W")); + else + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER")); + else if (FilletGroupParams->GroupBox1->isChecked()) + if (now == MainTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_R1")); + else if (now == MainTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_W1")); + else if (now == MainTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_L1")); + else if (now == IncidentTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_R2")); + else if (now == IncidentTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_W2")); + else if (now == IncidentTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_L2")); + else if (now == FilletGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_RF")); + else + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET")); + else + if (now == MainTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_R1")); + else if (now == MainTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_W1")); + else if (now == MainTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_L1")); + else if (now == IncidentTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_R2")); + else if (now == IncidentTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_W2")); + else if (now == IncidentTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_L2")); + else + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); + + updateLabelImgPipeTShape(); } //================================================================================= // function : SetPosition() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::SetPosition(bool isChecked) { - if (isChecked) { - erasePreview(); - JunctionPointsSel->LineEdit4->setText(""); - JunctionPointsSel->LineEdit5->setText(""); -// connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT( -// SelectionIntoArgument())); - JunctionPointsSel->PushButton1->click(); - SelectionIntoArgument(); - } else { - disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); - JunctionPointsSel->LineEdit4->setText(""); - JunctionPointsSel->LineEdit5->setText(""); - processPreview(); - } +void AdvancedGUI_PipeTShapeDlg::SetPosition (bool isChecked) +{ + if (isChecked) { + erasePreview(); + JunctionPointsSel->LineEdit4->setText(""); + JunctionPointsSel->LineEdit5->setText(""); + //connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT( + //SelectionIntoArgument())); + JunctionPointsSel->PushButton1->click(); + SelectionIntoArgument(); + } + else { + disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); + JunctionPointsSel->LineEdit4->setText(""); + JunctionPointsSel->LineEdit5->setText(""); + processPreview(); + } } //================================================================================= // function : ValueChangedInSpinBox() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::ValueChangedInSpinBox(double newValue) +void AdvancedGUI_PipeTShapeDlg::ValueChangedInSpinBox (double newValue) { - if (JunctionPointsSel->GroupBox1->isChecked() && myOkPoint1 && myOkPoint2 && myOkPoint3) - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); + if (JunctionPointsSel->GroupBox1->isChecked() && myOkPoint1 && myOkPoint2 && myOkPoint3) + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); } //================================================================================= // function : SelectionIntoArgument() // purpose : Called when selection as changed or other case //================================================================================= -void AdvancedGUI_PipeTShapeDlg::SelectionIntoArgument() { - - erasePreview(); -// myEditCurrentArgument->setText(""); - - LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); - SALOME_ListIO aSelList; - aSelMgr->selectedObjects(aSelList); - - if (aSelList.Extent() != 1) { - if (myEditCurrentArgument == JunctionPointsSel->LineEdit1) - myOkPoint1 = false; - else if (myEditCurrentArgument == JunctionPointsSel->LineEdit2) - myOkPoint2 = false; - else if (myEditCurrentArgument == JunctionPointsSel->LineEdit3) - myOkPoint3 = false; - return; - myEditCurrentArgument->setText(""); - } - - // nbSel == 1 - if (aSelList.Extent() == 1) { - Handle(SALOME_InteractiveObject) anIO = aSelList.First(); - GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(anIO); - if (!CORBA::is_nil(aSelectedObject)) { - QString aName = GEOMBase::GetName(aSelectedObject); - TopoDS_Shape aShape; - if (GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE) && !aShape.IsNull()) { - - TColStd_IndexedMapOfInteger aMap; - aSelMgr->GetIndexes(anIO, aMap); - if (aMap.Extent() == 1) { // Local Selection - int anIndex = aMap(1); - aName += QString(":vertex_%1").arg(anIndex); - - //Find SubShape Object in Father - GEOM::GEOM_Object_var aFindedObject = GEOMBase_Helper::findObjectInFather(aSelectedObject, aName); - - if (aFindedObject->_is_nil()) { // Object not found in study - GEOM::GEOM_IShapesOperations_var aShapesOp = - getGeomEngine()->GetIShapesOperations(getStudyId()); - aSelectedObject = aShapesOp->GetSubShape(aSelectedObject, anIndex); - } else { - aSelectedObject = aFindedObject; // get Object from study - } - GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE); - } else { // Global Selection - if (aShape.ShapeType() != TopAbs_VERTEX) { - aSelectedObject = GEOM::GEOM_Object::_nil(); - aName = ""; - } - } - } - - if (aShape.IsNull() || aShape.ShapeType() != TopAbs_VERTEX) { - return; - } - myEditCurrentArgument->setText(aName); - if (myEditCurrentArgument == JunctionPointsSel->LineEdit1) { - myPoint1 = aSelectedObject; - myOkPoint1 = true; - if (!myOkPoint2) - JunctionPointsSel->PushButton2->click(); - } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit2) { - myPoint2 = aSelectedObject; - myOkPoint2 = true; - if (!myOkPoint3) - JunctionPointsSel->PushButton3->click(); - } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit3) { - myPoint3 = aSelectedObject; - myOkPoint3 = true; - if (!myOkPoint1) - JunctionPointsSel->PushButton1->click(); - } - } - } - - if (myOkPoint1 && myOkPoint2 && myOkPoint3) { - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); +void AdvancedGUI_PipeTShapeDlg::SelectionIntoArgument() +{ + erasePreview(); + //myEditCurrentArgument->setText(""); + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + if (aSelList.Extent() != 1) { + if (myEditCurrentArgument == JunctionPointsSel->LineEdit1) + myOkPoint1 = false; + else if (myEditCurrentArgument == JunctionPointsSel->LineEdit2) + myOkPoint2 = false; + else if (myEditCurrentArgument == JunctionPointsSel->LineEdit3) + myOkPoint3 = false; + return; + myEditCurrentArgument->setText(""); + } + + // nbSel == 1 + if (aSelList.Extent() == 1) { + Handle(SALOME_InteractiveObject) anIO = aSelList.First(); + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(anIO); + if (!CORBA::is_nil(aSelectedObject)) { + QString aName = GEOMBase::GetName(aSelectedObject); + TopoDS_Shape aShape; + if (GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE) && !aShape.IsNull()) { + + TColStd_IndexedMapOfInteger aMap; + aSelMgr->GetIndexes(anIO, aMap); + if (aMap.Extent() == 1) { // Local Selection + int anIndex = aMap(1); + aName += QString(":vertex_%1").arg(anIndex); + + //Find SubShape Object in Father + GEOM::GEOM_Object_var aFindedObject = GEOMBase_Helper::findObjectInFather(aSelectedObject, aName); + + if (aFindedObject->_is_nil()) { // Object not found in study + GEOM::GEOM_IShapesOperations_var aShapesOp = + getGeomEngine()->GetIShapesOperations(getStudyId()); + aSelectedObject = aShapesOp->GetSubShape(aSelectedObject, anIndex); + } + else { + aSelectedObject = aFindedObject; // get Object from study + } + GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE); + } else { // Global Selection + if (aShape.ShapeType() != TopAbs_VERTEX) { + aSelectedObject = GEOM::GEOM_Object::_nil(); + aName = ""; + } + } + } + + if (aShape.IsNull() || aShape.ShapeType() != TopAbs_VERTEX) { + return; + } + myEditCurrentArgument->setText(aName); + if (myEditCurrentArgument == JunctionPointsSel->LineEdit1) { + myPoint1 = aSelectedObject; + myOkPoint1 = true; + if (!myOkPoint2) + JunctionPointsSel->PushButton2->click(); + } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit2) { + myPoint2 = aSelectedObject; + myOkPoint2 = true; + if (!myOkPoint3) + JunctionPointsSel->PushButton3->click(); + } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit3) { + myPoint3 = aSelectedObject; + myOkPoint3 = true; + if (!myOkPoint1) + JunctionPointsSel->PushButton1->click(); + } } + } -// GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First()); -// if (aSelectedObject->_is_nil()) -// return; -// -// myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject)); -// -// // clear selection -// disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); -// myGeomGUI->getApp()->selectionMgr()->clearSelected(); -// connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); -// -// if (myEditCurrentArgument == JunctionPointsSel->LineEdit1) { -// myPoint1 = aSelectedObject; -// myOkPoint1 = true; -// if (!myOkPoint2) -// JunctionPointsSel->PushButton2->click(); -// // P2GroupParams->PushButton1->click(); -// } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit2) { -// // } else if (myEditCurrentArgument == P2GroupParams->LineEdit1) { -// myPoint2 = aSelectedObject; -// myOkPoint2 = true; -// if (!myOkPoint3) -// JunctionPointsSel->PushButton3->click(); -// // P3GroupParams->PushButton1->click(); -// } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit3) { -// // } else if (myEditCurrentArgument == P3GroupParams->LineEdit1) { -// myPoint3 = aSelectedObject; -// myOkPoint3 = true; -// if (!myOkPoint1) -// JunctionPointsSel->PushButton1->click(); -// } + if (myOkPoint1 && myOkPoint2 && myOkPoint3) { + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); + } } //================================================================================= // function : SetEditCurrentArgument() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::SetEditCurrentArgument() { - QPushButton* send = (QPushButton*) sender(); - - if (send == JunctionPointsSel->PushButton1) { - myEditCurrentArgument = JunctionPointsSel->LineEdit1; - JunctionPointsSel->PushButton2->setDown(false); - JunctionPointsSel->LineEdit2->setEnabled(false); - JunctionPointsSel->PushButton3->setDown(false); - JunctionPointsSel->LineEdit3->setEnabled(false); - } else if (send == JunctionPointsSel->PushButton2) { - myEditCurrentArgument = JunctionPointsSel->LineEdit2; - JunctionPointsSel->PushButton1->setDown(false); - JunctionPointsSel->LineEdit1->setEnabled(false); - JunctionPointsSel->PushButton3->setDown(false); - JunctionPointsSel->LineEdit3->setEnabled(false); - } else if (send == JunctionPointsSel->PushButton3) { - myEditCurrentArgument = JunctionPointsSel->LineEdit3; - JunctionPointsSel->PushButton1->setDown(false); - JunctionPointsSel->LineEdit1->setEnabled(false); - JunctionPointsSel->PushButton2->setDown(false); - JunctionPointsSel->LineEdit2->setEnabled(false); - } - - // enable line edit - myEditCurrentArgument->setEnabled(true); - myEditCurrentArgument->setFocus(); - myEditCurrentArgument->setText(""); - // after setFocus(), because it will be setDown(false) when loses focus - send->setDown(true); - - JunctionPointsSel->LineEdit4->setText(""); - JunctionPointsSel->LineEdit5->setText(""); - - disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); -// globalSelection(GEOM_POINT); - globalSelection(); // close local contexts, if any - localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); - connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); +void AdvancedGUI_PipeTShapeDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*) sender(); + + if (send == JunctionPointsSel->PushButton1) { + myEditCurrentArgument = JunctionPointsSel->LineEdit1; + JunctionPointsSel->PushButton2->setDown(false); + JunctionPointsSel->LineEdit2->setEnabled(false); + JunctionPointsSel->PushButton3->setDown(false); + JunctionPointsSel->LineEdit3->setEnabled(false); + } + else if (send == JunctionPointsSel->PushButton2) { + myEditCurrentArgument = JunctionPointsSel->LineEdit2; + JunctionPointsSel->PushButton1->setDown(false); + JunctionPointsSel->LineEdit1->setEnabled(false); + JunctionPointsSel->PushButton3->setDown(false); + JunctionPointsSel->LineEdit3->setEnabled(false); + } + else if (send == JunctionPointsSel->PushButton3) { + myEditCurrentArgument = JunctionPointsSel->LineEdit3; + JunctionPointsSel->PushButton1->setDown(false); + JunctionPointsSel->LineEdit1->setEnabled(false); + JunctionPointsSel->PushButton2->setDown(false); + JunctionPointsSel->LineEdit2->setEnabled(false); + } + + // enable line edit + myEditCurrentArgument->setEnabled(true); + myEditCurrentArgument->setFocus(); + myEditCurrentArgument->setText(""); + // after setFocus(), because it will be setDown(false) when loses focus + send->setDown(true); + + JunctionPointsSel->LineEdit4->setText(""); + JunctionPointsSel->LineEdit5->setText(""); + + disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); + //globalSelection(GEOM_POINT); + globalSelection(); // close local contexts, if any + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); } //================================================================================= // function : SetDoubleSpinBoxStep() // purpose : Double spin box management //================================================================================= -void AdvancedGUI_PipeTShapeDlg::SetDoubleSpinBoxStep(double step) { - MainTubeGroupParams->SpinBox_DX->setSingleStep(step); - MainTubeGroupParams->SpinBox_DY->setSingleStep(step); - MainTubeGroupParams->SpinBox_DZ->setSingleStep(step); - IncidentTubeGroupParams->SpinBox_DX->setSingleStep(step); - IncidentTubeGroupParams->SpinBox_DY->setSingleStep(step); - IncidentTubeGroupParams->SpinBox_DZ->setSingleStep(step); - ChamferGroupParams->SpinBox_DX->setSingleStep(step); - ChamferGroupParams->SpinBox_DY->setSingleStep(step); - FilletGroupParams->SpinBox_DX->setSingleStep(step); +void AdvancedGUI_PipeTShapeDlg::SetDoubleSpinBoxStep (double step) +{ + MainTubeGroupParams->SpinBox_DX->setSingleStep(step); + MainTubeGroupParams->SpinBox_DY->setSingleStep(step); + MainTubeGroupParams->SpinBox_DZ->setSingleStep(step); + IncidentTubeGroupParams->SpinBox_DX->setSingleStep(step); + IncidentTubeGroupParams->SpinBox_DY->setSingleStep(step); + IncidentTubeGroupParams->SpinBox_DZ->setSingleStep(step); + ChamferGroupParams->SpinBox_DX->setSingleStep(step); + ChamferGroupParams->SpinBox_DY->setSingleStep(step); + FilletGroupParams->SpinBox_DX->setSingleStep(step); + + LReductionGroupParams->SpinBox1->setSingleStep(step); + LReductionGroupParams->SpinBox2->setSingleStep(step); + LReductionGroupParams->SpinBox3->setSingleStep(step); + LReductionGroupParams->SpinBox4->setSingleStep(step); + + RReductionGroupParams->SpinBox1->setSingleStep(step); + RReductionGroupParams->SpinBox2->setSingleStep(step); + RReductionGroupParams->SpinBox3->setSingleStep(step); + RReductionGroupParams->SpinBox4->setSingleStep(step); + + IReductionGroupParams->SpinBox1->setSingleStep(step); + IReductionGroupParams->SpinBox2->setSingleStep(step); + IReductionGroupParams->SpinBox3->setSingleStep(step); + IReductionGroupParams->SpinBox4->setSingleStep(step); } //================================================================================= // function : ClickOnOk() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::ClickOnOk() { +void AdvancedGUI_PipeTShapeDlg::ClickOnOk() +{ setIsApplyAndClose( true ); - if (ClickOnApply()) - ClickOnCancel(); + if (ClickOnApply()) + ClickOnCancel(); } //================================================================================= // function : ClickOnApply() // purpose : //================================================================================= -bool AdvancedGUI_PipeTShapeDlg::ClickOnApply() { - if (!onAccept()) - return false; +bool AdvancedGUI_PipeTShapeDlg::ClickOnApply() +{ + if (!onAccept()) + return false; - initName(); + initName(); - return true; + return true; } //================================================================================= // function : ActivateThisDialog() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::ActivateThisDialog() { - GEOMBase_Skeleton::ActivateThisDialog(); - // globalSelection( GEOM_POINT); - // connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL( - // currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - if (myOkPoint1 && myOkPoint2 && myOkPoint3) - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); +void AdvancedGUI_PipeTShapeDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + //globalSelection( GEOM_POINT); + //connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL( + // currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + if (myOkPoint1 && myOkPoint2 && myOkPoint3) + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); } //================================================================================= // function : enterEvent [REDEFINED] // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::enterEvent(QEvent*) { - if (!mainFrame()->GroupConstructors->isEnabled()) - ActivateThisDialog(); +void AdvancedGUI_PipeTShapeDlg::enterEvent (QEvent*) +{ + if (!mainFrame()->GroupButtons->isEnabled()) + ActivateThisDialog(); } //================================================================================= // function : resizeEvent [REDEFINED] // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::resizeEvent(QResizeEvent */*event*/) { - QSize scaledSize = imagePipeTShape.size(); - scaledSize.scale(tshapeScreenShotLabel->size(), Qt::KeepAspectRatio); - if (!tshapeScreenShotLabel->pixmap() - || scaledSize != tshapeScreenShotLabel->pixmap()->size()) - updateTshapeScreenshotLabel(); +void AdvancedGUI_PipeTShapeDlg::resizeEvent (QResizeEvent */*event*/) +{ + QSize scaledSize1 = imagePipeTShape.size(); + scaledSize1.scale(LabelImgPipeTShape->size(), Qt::KeepAspectRatio); + if (!LabelImgPipeTShape->pixmap() || scaledSize1 != LabelImgPipeTShape->pixmap()->size()) + updateLabelImgPipeTShape(); + + QSize scaledSize2 = imageReduction.size(); + scaledSize2.scale(LabelImgReduction->size(), Qt::KeepAspectRatio); + if (!LabelImgReduction->pixmap() || scaledSize2 != LabelImgReduction->pixmap()->size()) + LabelImgReduction->setPixmap(imageReduction.scaled(LabelImgReduction->size(), + Qt::KeepAspectRatio, + Qt::SmoothTransformation)); } //================================================================================= -// function : updateTshapeScreenshotLabel +// function : updateLabelImgPipeTShape // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::updateTshapeScreenshotLabel() { - tshapeScreenShotLabel->setPixmap(imagePipeTShape.scaled(tshapeScreenShotLabel->size(), - Qt::KeepAspectRatio, - Qt::SmoothTransformation)); +void AdvancedGUI_PipeTShapeDlg::updateLabelImgPipeTShape() +{ + LabelImgPipeTShape->setPixmap(imagePipeTShape.scaled(LabelImgPipeTShape->size(), + Qt::KeepAspectRatio, + Qt::SmoothTransformation)); } //================================================================================= // function : ChamferOrFillet() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::ChamferOrFillet(bool) { - QGroupBox* send = (QGroupBox*) sender(); - - if (send == ChamferGroupParams->GroupBox1) { - if (send->isChecked()) { - disconnect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, 0); - FilletGroupParams->GroupBox1->setChecked(false); - connect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER")); - } - else - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); - updateTshapeScreenshotLabel(); - if (myOkPoint1 && myOkPoint2 && myOkPoint3) - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); - } else if (send == FilletGroupParams->GroupBox1) { - if (send->isChecked()) { - disconnect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, 0); - ChamferGroupParams->GroupBox1->setChecked(!send->isChecked()); - connect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET")); - } - else - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); - updateTshapeScreenshotLabel(); - if (myOkPoint1 && myOkPoint2 && myOkPoint3) - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); - } +void AdvancedGUI_PipeTShapeDlg::ChamferOrFillet (bool) +{ + QGroupBox* send = (QGroupBox*) sender(); + + if (send == ChamferGroupParams->GroupBox1) { + if (send->isChecked()) { + disconnect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, 0); + FilletGroupParams->GroupBox1->setChecked(false); + connect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER")); + } + else + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); + + updateLabelImgPipeTShape(); + if (myOkPoint1 && myOkPoint2 && myOkPoint3) + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); + } + else if (send == FilletGroupParams->GroupBox1) { + if (send->isChecked()) { + disconnect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, 0); + ChamferGroupParams->GroupBox1->setChecked(!send->isChecked()); + connect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET")); + } + else + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); + updateLabelImgPipeTShape(); + if (myOkPoint1 && myOkPoint2 && myOkPoint3) + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); + } } //================================================================================= // function : DisplayPreview() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::DisplayPreview(const bool activate, const bool update, const bool toRemoveFromEngine, - const double lineWidth, const int displayMode, const int color) { - isPreview = true; - QString msg; - if (!isValid(msg)) { - erasePreview(update); - isPreview = false; - return; - } - - erasePreview(false); - - try { - SUIT_OverrideCursor wc; - ObjectList objects; - bool hexMeshState = HexMeshCheckBox->isChecked(); - HexMeshCheckBox->setChecked(false); - if (!executeNoCheck(objects) || !getOperation()->IsDone()) { - wc.suspend(); - } else { - ObjectList::iterator it = objects.begin(); - GEOM::GEOM_Object_var obj = *it; - displayPreview(obj, true, activate, false, lineWidth, displayMode, color); - if (toRemoveFromEngine) - obj->UnRegister(); - } - HexMeshCheckBox->setChecked(hexMeshState); - } catch (const SALOME::SALOME_Exception& e) { - SalomeApp_Tools::QtCatchCorbaException(e); - } - - isPreview = false; - - if (update) - updateViewer(); +void AdvancedGUI_PipeTShapeDlg::DisplayPreview (const bool activate, const bool update, + const bool toRemoveFromEngine, const double lineWidth, + const int displayMode, const int color) +{ + QString msg; + if (!isValid(msg)) { + erasePreview(update); + return; + } + + erasePreview(false); + + try { + SUIT_OverrideCursor wc; + ObjectList objects; + bool hexMeshState = HexMeshCheckBox->isChecked(); + HexMeshCheckBox->setChecked(false); + if (!executeNoCheck(objects) || !getOperation()->IsDone()) { + wc.suspend(); + } + else { + ObjectList::iterator it = objects.begin(); + GEOM::GEOM_Object_var obj = *it; + displayPreview(obj, true, activate, false, lineWidth, displayMode, color); + if (toRemoveFromEngine) + obj->UnRegister(); + } + HexMeshCheckBox->setChecked(hexMeshState); + } catch (const SALOME::SALOME_Exception& e) { + SalomeApp_Tools::QtCatchCorbaException(e); + } + + if (update) + updateViewer(); } + //================================================================================= // function : createOperation // purpose : //================================================================================= -GEOM::GEOM_IOperations_ptr AdvancedGUI_PipeTShapeDlg::createOperation() { - return getGeomEngine()->GetIAdvancedOperations(getStudyId()); +GEOM::GEOM_IOperations_ptr AdvancedGUI_PipeTShapeDlg::createOperation() +{ + return getGeomEngine()->GetIAdvancedOperations(getStudyId()); } //================================================================================= // function : isValid // purpose : //================================================================================= -bool AdvancedGUI_PipeTShapeDlg::isValid(QString& msg) { - bool ok = true; - - ok = MainTubeGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; - ok = MainTubeGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; - ok = MainTubeGroupParams->SpinBox_DZ->isValid(msg, !IsPreview()) && ok; - ok = IncidentTubeGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; - ok = IncidentTubeGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; - ok = IncidentTubeGroupParams->SpinBox_DZ->isValid(msg, !IsPreview()) && ok; - ok = ChamferGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; - ok = ChamferGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; - ok = FilletGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; - - ok = fabs(MainTubeGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; - ok = fabs(MainTubeGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; - ok = fabs(MainTubeGroupParams->SpinBox_DZ->value()) > Precision::Confusion() && ok; - ok = fabs(IncidentTubeGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; - ok = fabs(IncidentTubeGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; - ok = fabs(IncidentTubeGroupParams->SpinBox_DZ->value()) > Precision::Confusion() && ok; - ok = fabs(ChamferGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; - ok = fabs(ChamferGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; - ok = fabs(FilletGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; - - if (JunctionPointsSel->GroupBox1->isChecked()) - ok = myOkPoint1 && myOkPoint2 && myOkPoint3 && ok; - - return ok; +bool AdvancedGUI_PipeTShapeDlg::isValid (QString& msg) +{ + bool ok = true; + + ok = MainTubeGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; + ok = MainTubeGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; + ok = MainTubeGroupParams->SpinBox_DZ->isValid(msg, !IsPreview()) && ok; + ok = IncidentTubeGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; + ok = IncidentTubeGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; + ok = IncidentTubeGroupParams->SpinBox_DZ->isValid(msg, !IsPreview()) && ok; + ok = ChamferGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; + ok = ChamferGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; + ok = FilletGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; + + if (LReductionGroupParams->GroupBox1->isChecked()) { + ok = LReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok; + ok = LReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; + ok = LReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; + ok = LReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; + } + if (RReductionGroupParams->GroupBox1->isChecked()) { + ok = RReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok; + ok = RReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; + ok = RReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; + ok = RReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; + } + if (IReductionGroupParams->GroupBox1->isChecked()) { + ok = IReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok; + ok = IReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; + ok = IReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; + ok = IReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; + } + + ok = fabs(MainTubeGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; + ok = fabs(MainTubeGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; + ok = fabs(MainTubeGroupParams->SpinBox_DZ->value()) > Precision::Confusion() && ok; + ok = fabs(IncidentTubeGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; + ok = fabs(IncidentTubeGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; + ok = fabs(IncidentTubeGroupParams->SpinBox_DZ->value()) > Precision::Confusion() && ok; + ok = fabs(ChamferGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; + ok = fabs(ChamferGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; + ok = fabs(FilletGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; + + if (JunctionPointsSel->GroupBox1->isChecked()) + ok = myOkPoint1 && myOkPoint2 && myOkPoint3 && ok; + + return ok; } //================================================================================= // function : CheckCompatiblePosition() // purpose : //================================================================================= -bool AdvancedGUI_PipeTShapeDlg::CheckCompatiblePosition(GEOM::GEOM_Object_var theP1, - GEOM::GEOM_Object_var theP2, GEOM::GEOM_Object_var theP3, double theTolerance) { +bool AdvancedGUI_PipeTShapeDlg::CheckCompatiblePosition + (GEOM::GEOM_Object_var theP1, GEOM::GEOM_Object_var theP2, GEOM::GEOM_Object_var theP3, + double theTolerance) +{ + MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); + IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); + JunctionPointsSel->PushButton4->setStyleSheet(CssNormal); + JunctionPointsSel->PushButton5->setStyleSheet(CssNormal); - MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); - IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); - JunctionPointsSel->PushButton4->setStyleSheet(CssNormal); - JunctionPointsSel->PushButton5->setStyleSheet(CssNormal); + CORBA::Double theL1 = MainTubeGroupParams->SpinBox_DZ->value(); + CORBA::Double theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); - CORBA::Double theL1 = MainTubeGroupParams->SpinBox_DZ->value(); - CORBA::Double theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); + JunctionPointsSel->LineEdit4->setText(""); + JunctionPointsSel->LineEdit5->setText(""); - JunctionPointsSel->LineEdit4->setText(""); - JunctionPointsSel->LineEdit5->setText(""); + MainTubeGroupParams->SpinBox_DZ->setToolTip(""); + IncidentTubeGroupParams->SpinBox_DZ->setToolTip(""); + + TopoDS_Shape aShape; + gp_Pnt P1, P2, P3; + if ( GEOMBase::GetShape( theP1, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) + P1 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); + else + return false; + + if ( GEOMBase::GetShape( theP2, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) + P2 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); + else + return false; - MainTubeGroupParams->SpinBox_DZ->setToolTip(""); - IncidentTubeGroupParams->SpinBox_DZ->setToolTip(""); - - TopoDS_Shape aShape; - gp_Pnt P1, P2, P3; - if ( GEOMBase::GetShape( theP1, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) - P1 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); - else - return false; - - if ( GEOMBase::GetShape( theP2, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) - P2 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); - else - return false; - - if ( GEOMBase::GetShape( theP3, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) - P3 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); - else - return false; - - double d12 = P1.Distance(P2); - double d13 = P1.Distance(P3); - double d23 = P2.Distance(P3); - - if (Abs(d12) <= Precision::Confusion()) { -// SetErrorCode("Junctions points P1 and P2 are identical"); - return false; + if ( GEOMBase::GetShape( theP3, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) + P3 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); + else + return false; + + double d12 = P1.Distance(P2); + double d13 = P1.Distance(P3); + double d23 = P2.Distance(P3); + + if (Abs(d12) <= Precision::Confusion()) { + //SetErrorCode("Junctions points P1 and P2 are identical"); + return false; + } + if (Abs(d13) <= Precision::Confusion()) { + //SetErrorCode("Junctions points P1 and P3 are identical"); + return false; + } + if (Abs(d23) <= Precision::Confusion()) { + //SetErrorCode("Junctions points P2 and P3 are identical"); + return false; + } + + long double newL1 = 0.5 * d12; + long double newL2 = sqrt(pow(d13,2)-pow(newL1,2)); + + JunctionPointsSel->LineEdit4->setText(QString::number(newL1,'f',7)); + JunctionPointsSel->LineEdit5->setText(QString::number(newL2,'f',7)); + + if (fabs(newL1 - theL1) > Precision::Approximation()) { + if ((newL1 * (1 - theTolerance) - theL1 <= Precision::Approximation()) && + (newL1 * (1 + theTolerance) - theL1 >= Precision::Approximation())) { + disconnect(MainTubeGroupParams->SpinBox_DZ, 0, this, 0); + MainTubeGroupParams->SpinBox_DZ->setValue(newL1); + connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged(double)), + this, SLOT(ValueChangedInSpinBox(double))); + MainTubeGroupParams->SpinBox_DZ->setToolTip("Value was recomputed to fit with position"); + MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssAcceptable); + JunctionPointsSel->PushButton4->setStyleSheet(CssAcceptable); } - if (Abs(d13) <= Precision::Confusion()) { -// SetErrorCode("Junctions points P1 and P3 are identical"); - return false; + else { + MainTubeGroupParams->SpinBox_DZ->setToolTip("Value is incompatible with position"); + MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssRefused); + JunctionPointsSel->PushButton4->setStyleSheet(CssRefused); } - if (Abs(d23) <= Precision::Confusion()) { -// SetErrorCode("Junctions points P2 and P3 are identical"); - return false; + } + else { + MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); + JunctionPointsSel->PushButton4->setStyleSheet(CssNormal); + } + + if (fabs(newL2 - theL2) > Precision::Approximation()) { + if ((newL2 * (1 - theTolerance) - theL2 <= Precision::Approximation()) && + (newL2 * (1 + theTolerance) - theL2 >= Precision::Approximation())) { + disconnect(IncidentTubeGroupParams->SpinBox_DZ, 0, this, 0); + IncidentTubeGroupParams->SpinBox_DZ->setValue(newL2); + connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); + IncidentTubeGroupParams->SpinBox_DZ->setToolTip("Value was recomputed to fit with position"); + IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssAcceptable); + JunctionPointsSel->PushButton5->setStyleSheet(CssAcceptable); } - - long double newL1 = 0.5 * d12; - long double newL2 = sqrt(pow(d13,2)-pow(newL1,2)); - - JunctionPointsSel->LineEdit4->setText(QString::number(newL1,'f',7)); - JunctionPointsSel->LineEdit5->setText(QString::number(newL2,'f',7)); - - if (fabs(newL1 - theL1) > Precision::Approximation()) { - if ((newL1 * (1 - theTolerance) - theL1 <= Precision::Approximation()) && - (newL1 * (1 + theTolerance) - theL1 >= Precision::Approximation())) { - disconnect(MainTubeGroupParams->SpinBox_DZ, 0, this, 0); - MainTubeGroupParams->SpinBox_DZ->setValue(newL1); - connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - MainTubeGroupParams->SpinBox_DZ->setToolTip("Value was recomputed to fit with position"); - MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssAcceptable); - JunctionPointsSel->PushButton4->setStyleSheet(CssAcceptable); - } - else { - MainTubeGroupParams->SpinBox_DZ->setToolTip("Value is incompatible with position"); - MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssRefused); - JunctionPointsSel->PushButton4->setStyleSheet(CssRefused); - } - } else { - MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); - JunctionPointsSel->PushButton4->setStyleSheet(CssNormal); - } - - if (fabs(newL2 - theL2) > Precision::Approximation()) { - if ((newL2 * (1 - theTolerance) - theL2 <= Precision::Approximation()) && - (newL2 * (1 + theTolerance) - theL2 >= Precision::Approximation())) { - disconnect(IncidentTubeGroupParams->SpinBox_DZ, 0, this, 0); - IncidentTubeGroupParams->SpinBox_DZ->setValue(newL2); - connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - IncidentTubeGroupParams->SpinBox_DZ->setToolTip("Value was recomputed to fit with position"); - IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssAcceptable); - JunctionPointsSel->PushButton5->setStyleSheet(CssAcceptable); - } - else { - IncidentTubeGroupParams->SpinBox_DZ->setToolTip("Value is incompatible with position"); - IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssRefused); - JunctionPointsSel->PushButton5->setStyleSheet(CssRefused); - } - } - else { - IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); - JunctionPointsSel->PushButton5->setStyleSheet(CssNormal); + IncidentTubeGroupParams->SpinBox_DZ->setToolTip("Value is incompatible with position"); + IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssRefused); + JunctionPointsSel->PushButton5->setStyleSheet(CssRefused); } + } + else { + IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); + JunctionPointsSel->PushButton5->setStyleSheet(CssNormal); + } - return true; + return true; } -bool AdvancedGUI_PipeTShapeDlg::execute(ObjectList& objects) { - - if (JunctionPointsSel->GroupBox1->isChecked() && myOkPoint1 && myOkPoint2 && myOkPoint3) - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool AdvancedGUI_PipeTShapeDlg::execute (ObjectList& objects) +{ + if (JunctionPointsSel->GroupBox1->isChecked() && myOkPoint1 && myOkPoint2 && myOkPoint3) + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - return executeNoCheck(objects); + return executeNoCheck(objects); } //================================================================================= -// function : execute +// function : executeNoCheck // purpose : //================================================================================= -bool AdvancedGUI_PipeTShapeDlg::executeNoCheck(ObjectList& objects) { - bool res = false; - - // GEOM::GEOM_Object_var anObj; - GEOM::ListOfGO_var anObj; - - GEOM::GEOM_IAdvancedOperations_var anOper = GEOM::GEOM_IAdvancedOperations::_narrow(getOperation()); - - //@@ retrieve input values from the widgets here @@// - CORBA::Double theR1 = MainTubeGroupParams->SpinBox_DX->value(); - CORBA::Double theW1 = MainTubeGroupParams->SpinBox_DY->value(); - CORBA::Double theL1 = MainTubeGroupParams->SpinBox_DZ->value(); - CORBA::Double theR2 = IncidentTubeGroupParams->SpinBox_DX->value(); - CORBA::Double theW2 = IncidentTubeGroupParams->SpinBox_DY->value(); - CORBA::Double theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); - CORBA::Double theH = ChamferGroupParams->SpinBox_DX->value(); - CORBA::Double theW = ChamferGroupParams->SpinBox_DY->value(); - CORBA::Double theRF = FilletGroupParams->SpinBox_DX->value(); - CORBA::Boolean theHexMesh = HexMeshCheckBox->isChecked(); - -// if (JunctionPointsSel->GroupBox1->isChecked()) { -// CheckCompatiblePosition(theL1, theL2, myPoint1, myPoint2, myPoint3, 0.01); -// theL1 = MainTubeGroupParams->SpinBox_DZ->value(); -// theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); -// } - - // call engine function - if (ChamferGroupParams->GroupBox1->isChecked()) { - if (JunctionPointsSel->GroupBox1->isChecked()) - anObj = anOper->MakePipeTShapeChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, - theHexMesh, myPoint1, myPoint2, myPoint3); - else - anObj = anOper->MakePipeTShapeChamfer(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, theHexMesh); - } - else if (FilletGroupParams->GroupBox1->isChecked()) { - if (JunctionPointsSel->GroupBox1->isChecked()) - anObj = anOper->MakePipeTShapeFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theRF, - theHexMesh, myPoint1, myPoint2, myPoint3); - else - anObj = anOper->MakePipeTShapeFillet(theR1, theW1, theL1, theR2, theW2, theL2, theRF, theHexMesh); - } - else { - if (JunctionPointsSel->GroupBox1->isChecked()) - anObj = anOper->MakePipeTShapeWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theHexMesh, myPoint1, - myPoint2, myPoint3); - else - anObj = anOper->MakePipeTShape(theR1, theW1, theL1, theR2, theW2, theL2, theHexMesh); - } - - res = anObj->length(); - if (!res) - return false; - - // res = !anObj->_is_nil(); - if (res && !IsPreview()) { - QStringList aParameters; - //@@ put stringified input parameters to the string list here to store in the data model for notebook @@// - aParameters << MainTubeGroupParams->SpinBox_DX->text(); // R1 parameter - aParameters << MainTubeGroupParams->SpinBox_DY->text(); // W1 parameter - aParameters << MainTubeGroupParams->SpinBox_DZ->text(); // L1 parameter - aParameters << IncidentTubeGroupParams->SpinBox_DX->text(); // R2 parameter - aParameters << IncidentTubeGroupParams->SpinBox_DY->text(); // W2 parameter - aParameters << IncidentTubeGroupParams->SpinBox_DZ->text(); // L2 parameter - if (ChamferGroupParams->GroupBox1->isChecked()) {// Chamfer parameter - aParameters << ChamferGroupParams->SpinBox_DX->text(); // H parameter - aParameters << ChamferGroupParams->SpinBox_DY->text(); // W parameter - } - if (FilletGroupParams->GroupBox1->isChecked()) // Fillet parameter - aParameters << FilletGroupParams->SpinBox_DX->text(); // RF parameter - - if (aParameters.count() > 0) - anObj[0]->SetParameters(aParameters.join(":").toLatin1().constData()); - } - - objects.push_back(anObj[0]._retn()); - pipeTShapeGroupObjects.clear(); - for (int i = 1, n = anObj->length(); i < n; i++) { - pipeTShapeGroupObjects.push_back(anObj[i]._retn()); - } - - return objects.size() > 0; +bool AdvancedGUI_PipeTShapeDlg::executeNoCheck (ObjectList& objects) +{ + bool res = false; + + // GEOM::GEOM_Object_var anObj; + GEOM::ListOfGO_var anObj; + + GEOM::GEOM_IAdvancedOperations_var anOper = GEOM::GEOM_IAdvancedOperations::_narrow(getOperation()); + + //@@ retrieve input values from the widgets here @@// + CORBA::Double theR1 = MainTubeGroupParams->SpinBox_DX->value(); + CORBA::Double theW1 = MainTubeGroupParams->SpinBox_DY->value(); + CORBA::Double theL1 = MainTubeGroupParams->SpinBox_DZ->value(); + CORBA::Double theR2 = IncidentTubeGroupParams->SpinBox_DX->value(); + CORBA::Double theW2 = IncidentTubeGroupParams->SpinBox_DY->value(); + CORBA::Double theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); + CORBA::Double theH = ChamferGroupParams->SpinBox_DX->value(); + CORBA::Double theW = ChamferGroupParams->SpinBox_DY->value(); + CORBA::Double theRF = FilletGroupParams->SpinBox_DX->value(); + CORBA::Boolean theHexMesh = HexMeshCheckBox->isChecked(); + + // Thickness reductions + CORBA::Double theRL = 0., theWL = 0., theLtransL = 0., theLthinL = 0.; + CORBA::Double theRR = 0., theWR = 0., theLtransR = 0., theLthinR = 0.; + CORBA::Double theRI = 0., theWI = 0., theLtransI = 0., theLthinI = 0.; + + if (LReductionGroupParams->GroupBox1->isChecked()) { + theRL = LReductionGroupParams->SpinBox1->value(); + theWL = LReductionGroupParams->SpinBox2->value(); + theLtransL = LReductionGroupParams->SpinBox3->value(); + theLthinL = LReductionGroupParams->SpinBox4->value(); + } + if (RReductionGroupParams->GroupBox1->isChecked()) { + theRR = RReductionGroupParams->SpinBox1->value(); + theWR = RReductionGroupParams->SpinBox2->value(); + theLtransR = RReductionGroupParams->SpinBox3->value(); + theLthinR = RReductionGroupParams->SpinBox4->value(); + } + if (IReductionGroupParams->GroupBox1->isChecked()) { + theRI = IReductionGroupParams->SpinBox1->value(); + theWI = IReductionGroupParams->SpinBox2->value(); + theLtransI = IReductionGroupParams->SpinBox3->value(); + theLthinI = IReductionGroupParams->SpinBox4->value(); + } + + //if (JunctionPointsSel->GroupBox1->isChecked()) { + // CheckCompatiblePosition(theL1, theL2, myPoint1, myPoint2, myPoint3, 0.01); + // theL1 = MainTubeGroupParams->SpinBox_DZ->value(); + // theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); + //} + + // call engine function + if (ChamferGroupParams->GroupBox1->isChecked()) { + if (JunctionPointsSel->GroupBox1->isChecked()) + anObj = anOper->MakePipeTShapeTRChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theH, theW, theHexMesh, myPoint1, myPoint2, myPoint3); + else + anObj = anOper->MakePipeTShapeTRChamfer(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theH, theW, theHexMesh); + } + else if (FilletGroupParams->GroupBox1->isChecked()) { + if (JunctionPointsSel->GroupBox1->isChecked()) + anObj = anOper->MakePipeTShapeTRFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theRF, theHexMesh, myPoint1, myPoint2, myPoint3); + else + anObj = anOper->MakePipeTShapeTRFillet(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theRF, theHexMesh); + } + else { + if (JunctionPointsSel->GroupBox1->isChecked()) + anObj = anOper->MakePipeTShapeTRWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theHexMesh, myPoint1, myPoint2, myPoint3); + else + anObj = anOper->MakePipeTShapeTR(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theHexMesh); + } + + res = anObj->length(); + if (!res) + return false; + + //res = !anObj->_is_nil(); + if (res && !IsPreview()) { + QStringList aParameters; + //@@ put stringified input parameters to the string list here to store in the data model for notebook @@// + aParameters << MainTubeGroupParams->SpinBox_DX->text(); // R1 parameter + aParameters << MainTubeGroupParams->SpinBox_DY->text(); // W1 parameter + aParameters << MainTubeGroupParams->SpinBox_DZ->text(); // L1 parameter + aParameters << IncidentTubeGroupParams->SpinBox_DX->text(); // R2 parameter + aParameters << IncidentTubeGroupParams->SpinBox_DY->text(); // W2 parameter + aParameters << IncidentTubeGroupParams->SpinBox_DZ->text(); // L2 parameter + + if (ChamferGroupParams->GroupBox1->isChecked()) { // Chamfer parameter + aParameters << ChamferGroupParams->SpinBox_DX->text(); // H parameter + aParameters << ChamferGroupParams->SpinBox_DY->text(); // W parameter + } + if (FilletGroupParams->GroupBox1->isChecked()) // Fillet parameter + aParameters << FilletGroupParams->SpinBox_DX->text(); // RF parameter + + // Thickness reductions + if (LReductionGroupParams->GroupBox1->isChecked()) { + aParameters << LReductionGroupParams->SpinBox1->text(); + aParameters << LReductionGroupParams->SpinBox2->text(); + aParameters << LReductionGroupParams->SpinBox3->text(); + aParameters << LReductionGroupParams->SpinBox4->text(); + } + else { + aParameters << "0" << "0" << "0" << "0"; + } + if (RReductionGroupParams->GroupBox1->isChecked()) { + aParameters << RReductionGroupParams->SpinBox1->text(); + aParameters << RReductionGroupParams->SpinBox2->text(); + aParameters << RReductionGroupParams->SpinBox3->text(); + aParameters << RReductionGroupParams->SpinBox4->text(); + } + else { + aParameters << "0" << "0" << "0" << "0"; + } + if (IReductionGroupParams->GroupBox1->isChecked()) { + aParameters << IReductionGroupParams->SpinBox1->text(); + aParameters << IReductionGroupParams->SpinBox2->text(); + aParameters << IReductionGroupParams->SpinBox3->text(); + aParameters << IReductionGroupParams->SpinBox4->text(); + } + else { + aParameters << "0" << "0" << "0" << "0"; + } + + if (aParameters.count() > 0) + anObj[0]->SetParameters(aParameters.join(":").toLatin1().constData()); + } + + objects.push_back(anObj[0]._retn()); + pipeTShapeGroupObjects.clear(); + for (int i = 1, n = anObj->length(); i < n; i++) { + pipeTShapeGroupObjects.push_back(anObj[i]._retn()); + } + + return objects.size() > 0; } //================================================================================= // function : restoreSubShapes // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::restoreSubShapes(SALOMEDS::Study_ptr theStudy, SALOMEDS::SObject_ptr theSObject) { - SALOMEDS::GenericAttribute_var anAttr; - if (!theSObject->FindAttribute(anAttr, "AttributeIOR")) - return; - - SALOMEDS::AttributeIOR_var anAttrIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - CORBA::String_var anIORso = anAttrIOR->Value(); +void AdvancedGUI_PipeTShapeDlg::restoreSubShapes (SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject) +{ + SALOMEDS::GenericAttribute_var anAttr; + if (!theSObject->FindAttribute(anAttr, "AttributeIOR")) + return; - // get Object from SObject - GEOM::GEOM_Object_var theFather = GEOM::GEOM_Object::_narrow(myGeomGUI->getApp()->orb()->string_to_object(anIORso)); - if (CORBA::is_nil(theFather)) - return; + SALOMEDS::AttributeIOR_var anAttrIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + CORBA::String_var anIORso = anAttrIOR->Value(); - ObjectList::iterator it = pipeTShapeGroupObjects.begin(); + // get Object from SObject + GEOM::GEOM_Object_var theFather = + GEOM::GEOM_Object::_narrow(myGeomGUI->getApp()->orb()->string_to_object(anIORso)); + if (CORBA::is_nil(theFather)) + return; - for (int i = 0; it != pipeTShapeGroupObjects.end(); it++, i++) { - getGeomEngine()->AddInStudy(theStudy, (*it), tr((*it)->GetName()).toStdString().c_str(), theFather); - } + ObjectList::iterator it = pipeTShapeGroupObjects.begin(); + for (int i = 0; it != pipeTShapeGroupObjects.end(); it++, i++) { + getGeomEngine()->AddInStudy(theStudy, (*it), tr((*it)->GetName()).toStdString().c_str(), theFather); + } } //================================================================================= // function : processPreview() // purpose : Display preview if CheckBoxPreview is checked //================================================================================= -void AdvancedGUI_PipeTShapeDlg::processPreview() { - if(mainFrame()->CheckBoxPreview->isChecked()) +void AdvancedGUI_PipeTShapeDlg::processPreview() +{ + if (mainFrame()->CheckBoxPreview->isChecked()) DisplayPreview(); else erasePreview(true); } + +//================================================================================= +// function : AdvancedGUI_4Spin +// purpose : +//================================================================================= +AdvancedGUI_4Spin::AdvancedGUI_4Spin() +{ + GroupBox1 = new QGroupBox (); + + gridLayout1 = new QGridLayout (GroupBox1); + gridLayout1->setSpacing(6); + gridLayout1->setContentsMargins(11, 11, 11, 11); + gridLayout1->setHorizontalSpacing(6); + gridLayout1->setVerticalSpacing(6); + gridLayout1->setContentsMargins(9, 9, 9, 9); + + TextLabel1 = new QLabel (GroupBox1); + TextLabel2 = new QLabel (GroupBox1); + TextLabel3 = new QLabel (GroupBox1); + TextLabel4 = new QLabel (GroupBox1); + + SpinBox1 = new SalomeApp_DoubleSpinBox (GroupBox1); + SpinBox2 = new SalomeApp_DoubleSpinBox (GroupBox1); + SpinBox3 = new SalomeApp_DoubleSpinBox (GroupBox1); + SpinBox4 = new SalomeApp_DoubleSpinBox (GroupBox1); + + SpinBox1->setMinimumWidth(60); + SpinBox2->setMinimumWidth(60); + SpinBox3->setMinimumWidth(60); + SpinBox4->setMinimumWidth(60); + + gridLayout1->addWidget(TextLabel1, 0, 0, 1, 1); + gridLayout1->addWidget(TextLabel2, 1, 0, 1, 1); + gridLayout1->addWidget(TextLabel3, 2, 0, 1, 1); + gridLayout1->addWidget(TextLabel4, 3, 0, 1, 1); + + gridLayout1->addWidget(SpinBox1, 0, 1, 1, 1); + gridLayout1->addWidget(SpinBox2, 1, 1, 1, 1); + gridLayout1->addWidget(SpinBox3, 2, 1, 1, 1); + gridLayout1->addWidget(SpinBox4, 3, 1, 1, 1); +} + +//================================================================================= +// function : ~AdvancedGUI_4Spin() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +AdvancedGUI_4Spin::~AdvancedGUI_4Spin() +{ + // no need to delete child widgets, Qt does it all for us +} diff --git a/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.h b/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.h index 04147ea96..670c2f9d0 100644 --- a/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.h +++ b/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.h @@ -15,7 +15,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef ADVANCEDGUI_PIPETSHAPEDLG_H #define ADVANCEDGUI_PIPETSHAPEDLG_H @@ -25,72 +24,114 @@ class DlgRef_1Spin; class DlgRef_2Spin; class DlgRef_3Spin; +class DlgRef_4Spin; class DlgRef_3Sel; class DlgRef_6Sel; class QCheckBox; class QLineEdit; class QLabel; +class QGridLayout; +class QGroupBox; +class SalomeApp_DoubleSpinBox; + +//================================================================================= +// class : AdvancedGUI_4Spin +// purpose : +//================================================================================= +class AdvancedGUI_4Spin : public QWidget +{ + Q_OBJECT + + public: + AdvancedGUI_4Spin (); + ~AdvancedGUI_4Spin(); + + public: + QGroupBox *GroupBox1; + QGridLayout *gridLayout1; + + QLabel *TextLabel1; + QLabel *TextLabel2; + QLabel *TextLabel3; + QLabel *TextLabel4; + SalomeApp_DoubleSpinBox *SpinBox1; + SalomeApp_DoubleSpinBox *SpinBox2; + SalomeApp_DoubleSpinBox *SpinBox3; + SalomeApp_DoubleSpinBox *SpinBox4; +}; //================================================================================= // class : AdvancedGUI_PipeTShapeDlg // purpose : //================================================================================= -class AdvancedGUI_PipeTShapeDlg: public GEOMBase_Skeleton { -Q_OBJECT +class AdvancedGUI_PipeTShapeDlg: public GEOMBase_Skeleton +{ + Q_OBJECT public: - AdvancedGUI_PipeTShapeDlg(GeometryGUI*, QWidget* = 0); - ~AdvancedGUI_PipeTShapeDlg(); + AdvancedGUI_PipeTShapeDlg (GeometryGUI*, QWidget* = 0); + ~AdvancedGUI_PipeTShapeDlg(); protected: - // redefined from GEOMBase_Helper - virtual GEOM::GEOM_IOperations_ptr createOperation(); - virtual bool isValid(QString&); - virtual bool execute(ObjectList&); - virtual void restoreSubShapes(SALOMEDS::Study_ptr, SALOMEDS::SObject_ptr); + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid (QString&); + virtual bool execute (ObjectList&); + virtual void restoreSubShapes (SALOMEDS::Study_ptr, SALOMEDS::SObject_ptr); private: - void Init(); - void enterEvent(QEvent*); - void resizeEvent(QResizeEvent *event); - void updateTshapeScreenshotLabel(); - bool CheckCompatiblePosition(GEOM::GEOM_Object_var theP1, - GEOM::GEOM_Object_var theP2, - GEOM::GEOM_Object_var theP3, double theTolerance); + void Init(); + void enterEvent (QEvent*); + void resizeEvent (QResizeEvent *event); + void updateLabelImgPipeTShape(); + bool CheckCompatiblePosition (GEOM::GEOM_Object_var theP1, + GEOM::GEOM_Object_var theP2, + GEOM::GEOM_Object_var theP3, double theTolerance); private: - QPixmap imagePipeTShape; - QLabel* tshapeScreenShotLabel; - DlgRef_3Spin* MainTubeGroupParams; - DlgRef_3Spin* IncidentTubeGroupParams; - DlgRef_2Spin* ChamferGroupParams; - DlgRef_1Spin* FilletGroupParams; - DlgRef_6Sel* JunctionPointsSel; - QPixmap imageImp; - QString CssNormal, CssAcceptable, CssRefused; - QCheckBox* HexMeshCheckBox; - GEOM::GEOM_Object_var myPoint1, myPoint2, myPoint3; - bool myOkPoint1, myOkPoint2, myOkPoint3; - bool isPreview; - ObjectList pipeTShapeGroupObjects; + QPixmap imagePipeTShape; + QPixmap imageReduction; + QLabel* LabelImgPipeTShape; + QLabel* LabelImgReduction; + + // Main parameters + DlgRef_3Spin* MainTubeGroupParams; + DlgRef_3Spin* IncidentTubeGroupParams; + DlgRef_2Spin* ChamferGroupParams; + DlgRef_1Spin* FilletGroupParams; + QCheckBox* HexMeshCheckBox; + + // Thickness reduction parameters + AdvancedGUI_4Spin* LReductionGroupParams; + AdvancedGUI_4Spin* RReductionGroupParams; + AdvancedGUI_4Spin* IReductionGroupParams; + + // Position parameters + DlgRef_6Sel* JunctionPointsSel; + + QString CssNormal, CssAcceptable, CssRefused; + GEOM::GEOM_Object_var myPoint1, myPoint2, myPoint3; + bool myOkPoint1, myOkPoint2, myOkPoint3; + ObjectList pipeTShapeGroupObjects; private slots: - void ClickOnOk(); - bool ClickOnApply(); - void ActivateThisDialog(); - void SelectionIntoArgument(); - void SetEditCurrentArgument(); - void DisplayPreview(const bool activate = false, const bool update = true, - const bool toRemoveFromEngine = true, const double lineWidth = -1, - const int displayMode = -1, const int color = -1); - virtual void processPreview(); - void SetPosition(bool); - void ChamferOrFillet(bool); - void SetDoubleSpinBoxStep(double); - void ValueChangedInSpinBox( double ); - void UpdatePicture(QWidget* old, QWidget* now); - void ApplyNewDimensions(); - bool executeNoCheck( ObjectList& objects ); + void ClickOnOk(); + bool ClickOnApply(); + void ActivateThisDialog(); + void currentChanged (int); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); + void DisplayPreview (const bool activate = false, const bool update = true, + const bool toRemoveFromEngine = true, const double lineWidth = -1, + const int displayMode = -1, const int color = -1); + virtual void processPreview(); + void SetPosition (bool); + void ChamferOrFillet (bool); + void SetDoubleSpinBoxStep (double); + void ValueChangedInSpinBox (double); + void UpdatePicture (QWidget* old, QWidget* now); + void ApplyNewDimensions(); + bool executeNoCheck (ObjectList& objects); }; #endif // ADVANCEDGUI_PIPETSHAPEDLG_H diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index e375fc5d5..f0bfad5a7 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -1207,6 +1207,10 @@ DLG_PIPETSHAPE dlg_pipetshape.png + + IMG_PIPETSHAPE_SECT + pipetshape_section.png + DLG_PIPETSHAPE_L1 dlg_pipetshapel1.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 87d23adbe..28275e13c 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -5801,6 +5801,46 @@ Do you want to create new material? GEOM_PIPE_TSHAPE_POSITION_LBL_L2 New L2 + + GEOM_PIPE_TSHAPE_LEFT_TR + Left thickness reduction + + + GEOM_PIPE_TSHAPE_RIGHT_TR + Right thickness reduction + + + GEOM_PIPE_TSHAPE_INCI_TR + Incident thickness reduction + + + GEOM_PIPE_TSHAPE_TR_R + Radius (r%1) + + + GEOM_PIPE_TSHAPE_TR_W + Width (w%1) + + + GEOM_PIPE_TSHAPE_TR_L_TRANS + Transition length (ltrans%1) + + + GEOM_PIPE_TSHAPE_TR_L_THIN + Thin part length (lthin%1) + + + GEOM_PIPETSHAPE_GROUPMAIN + Main parameters + + + GEOM_PIPETSHAPE_GROUPREDUCT + Thickness reduction + + + GEOM_PIPETSHAPE_GROUPPOS + Position + GEOMToolsGUI_PublishDlg diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index d07b791f5..70fb7487d 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -5784,6 +5784,46 @@ Voulez-vous en créer un nouveau ? GEOM_PIPE_TSHAPE_POSITION_LBL_L2 Nouvelle L2 + + GEOM_PIPE_TSHAPE_LEFT_TR + Left thickness reduction + + + GEOM_PIPE_TSHAPE_RIGHT_TR + Right thickness reduction + + + GEOM_PIPE_TSHAPE_INCI_TR + Incident thickness reduction + + + GEOM_PIPE_TSHAPE_TR_R + Radius (r%1) + + + GEOM_PIPE_TSHAPE_TR_W + Width (w%1) + + + GEOM_PIPE_TSHAPE_TR_L_TRANS + Transition length (ltrans%1) + + + GEOM_PIPE_TSHAPE_TR_L_THIN + Thin part length (lthin%1) + + + GEOM_PIPETSHAPE_GROUPMAIN + Main parameters + + + GEOM_PIPETSHAPE_GROUPREDUCT + Thickness reduction + + + GEOM_PIPETSHAPE_GROUPPOS + Position + GEOMToolsGUI_PublishDlg diff --git a/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx index 1582f9126..78d277f2a 100644 --- a/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx @@ -18,13 +18,13 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include #include #include #include #include +#include #include @@ -72,30 +72,6 @@ GEOMImpl_BooleanDriver::GEOMImpl_BooleanDriver() { } -void AddSimpleShapes(TopoDS_Shape theShape, TopTools_ListOfShape& theList) -{ - if (theShape.ShapeType() != TopAbs_COMPOUND && - theShape.ShapeType() != TopAbs_COMPSOLID) { - theList.Append(theShape); - return; - } - - TopTools_MapOfShape mapShape; - TopoDS_Iterator It (theShape, Standard_True, Standard_True); - - for (; It.More(); It.Next()) { - TopoDS_Shape aShape_i = It.Value(); - if (mapShape.Add(aShape_i)) { - if (aShape_i.ShapeType() == TopAbs_COMPOUND || - aShape_i.ShapeType() == TopAbs_COMPSOLID) { - AddSimpleShapes(aShape_i, theList); - } else { - theList.Append(aShape_i); - } - } - } -} - //======================================================================= //function : Execute //purpose : @@ -131,8 +107,8 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const B.MakeCompound(C); TopTools_ListOfShape listShape1, listShape2; - AddSimpleShapes(aShape1, listShape1); - AddSimpleShapes(aShape2, listShape2); + GEOMUtils::AddSimpleShapes(aShape1, listShape1); + GEOMUtils::AddSimpleShapes(aShape2, listShape2); Standard_Boolean isCompound = (listShape1.Extent() > 1 || listShape2.Extent() > 1); @@ -174,7 +150,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const if (isCompound) { /* TopTools_ListOfShape listShapeC; - AddSimpleShapes(C, listShapeC); + GEOMUtils::AddSimpleShapes(C, listShapeC); TopTools_ListIteratorOfListOfShape itSubC (listShapeC); bool isOnlySolids = true; for (; itSubC.More(); itSubC.Next()) { @@ -203,8 +179,8 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const B.MakeCompound(C); TopTools_ListOfShape listShapes, listTools; - AddSimpleShapes(aShape1, listShapes); - AddSimpleShapes(aShape2, listTools); + GEOMUtils::AddSimpleShapes(aShape1, listShapes); + GEOMUtils::AddSimpleShapes(aShape2, listTools); Standard_Boolean isCompound = (listShapes.Extent() > 1); @@ -245,7 +221,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const if (isCompound) { /* TopTools_ListOfShape listShapeC; - AddSimpleShapes(C, listShapeC); + GEOMUtils::AddSimpleShapes(C, listShapeC); TopTools_ListIteratorOfListOfShape itSubC (listShapeC); bool isOnlySolids = true; for (; itSubC.More(); itSubC.Next()) { @@ -272,8 +248,8 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const /* Fix for NPAL15379: refused // Check arguments TopTools_ListOfShape listShape1, listShape2; - AddSimpleShapes(aShape1, listShape1); - AddSimpleShapes(aShape2, listShape2); + GEOMUtils::AddSimpleShapes(aShape1, listShape1); + GEOMUtils::AddSimpleShapes(aShape2, listShape2); Standard_Boolean isIntersect = Standard_False; @@ -360,8 +336,8 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const B.MakeCompound(C); TopTools_ListOfShape listShape1, listShape2; - AddSimpleShapes(aShape1, listShape1); - AddSimpleShapes(aShape2, listShape2); + GEOMUtils::AddSimpleShapes(aShape1, listShape1); + GEOMUtils::AddSimpleShapes(aShape2, listShape2); Standard_Boolean isCompound = (listShape1.Extent() > 1 || listShape2.Extent() > 1); @@ -433,7 +409,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const // as boolean operations always produce compound, lets simplify it // for the case, if it contains only one sub-shape TopTools_ListOfShape listShapeRes; - AddSimpleShapes(aShape, listShapeRes); + GEOMUtils::AddSimpleShapes(aShape, listShapeRes); if (listShapeRes.Extent() == 1) { aShape = listShapeRes.First(); if (aShape.IsNull()) return 0; diff --git a/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx b/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx index 9b982e735..58e8f837e 100644 --- a/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx @@ -19,20 +19,7 @@ // File : GEOMImpl_IAdvancedOperations.cxx // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -#include - -#include "GEOMImpl_Types.hxx" #include "GEOMImpl_IAdvancedOperations.hxx" -#include "GEOMImpl_IBasicOperations.hxx" -#include "GEOMImpl_IBooleanOperations.hxx" -#include "GEOMImpl_IShapesOperations.hxx" -#include "GEOMImpl_ITransformOperations.hxx" -#include "GEOMImpl_IBlocksOperations.hxx" -#include "GEOMImpl_I3DPrimOperations.hxx" -#include "GEOMImpl_ILocalOperations.hxx" -#include "GEOMImpl_IHealingOperations.hxx" - -#include "GEOMImpl_Gen.hxx" #include @@ -42,37 +29,65 @@ #include "GEOM_Function.hxx" #include "GEOM_PythonDump.hxx" +#include "GEOMUtils.hxx" +#include "GEOMAlgo_Splitter.hxx" +#include "GEOMImpl_Gen.hxx" +#include "GEOMImpl_Types.hxx" + +#include "GEOMImpl_IBasicOperations.hxx" +#include "GEOMImpl_IBooleanOperations.hxx" +#include "GEOMImpl_IShapesOperations.hxx" +#include "GEOMImpl_ITransformOperations.hxx" +#include "GEOMImpl_IBlocksOperations.hxx" +#include "GEOMImpl_I3DPrimOperations.hxx" +#include "GEOMImpl_ILocalOperations.hxx" +#include "GEOMImpl_IHealingOperations.hxx" + +#include "GEOMImpl_GlueDriver.hxx" #include "GEOMImpl_PipeTShapeDriver.hxx" #include "GEOMImpl_IPipeTShape.hxx" -#include -#include -// #include -// #include +#include "GEOMImpl_DividedDiskDriver.hxx" +#include "GEOMImpl_IDividedDisk.hxx" +// #include "GEOMImpl_DividedCylinderDriver.hxx" +// #include "GEOMImpl_IDividedCylinder.hxx" /*@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@*/ +#include +#include +#include +#include +#include + #include #include #include #include #include +#include #include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include -#include +#include +#include + +#include +#include +#include +#include #include -#include -#include -#include -#include -#include +#include #include +#include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC #define HALF_LENGTH_MAIN_PIPE "Main pipe half length" //"Tuyau principal - demi longueur" @@ -85,6 +100,8 @@ #define JUNCTION_FACE_2 "Junction 2" //"Face de jonction 2" #define JUNCTION_FACE_3 "Junction 3" //"Face de jonction 3" +#define FIND_GROUPS_BY_POINTS 1 + //============================================================================= /*! * Constructor @@ -242,6 +259,7 @@ bool GEOMImpl_IAdvancedOperations::CheckCompatiblePosition(double& theL1, double bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int shapeType, double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theH, double theW, double theRF, Handle(TColStd_HSequenceOfTransient) theSeq, gp_Trsf aTrsf) { @@ -411,6 +429,7 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int // == BEGIN } // == END + ///////////////////////// //// Groups of Edges //// ///////////////////////// @@ -424,10 +443,153 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int SetErrorCode("Propagation groups not found"); return false; } - Standard_Integer nbEdges, aNbGroups = aSeqPropagate->Length(); + Standard_Integer aNbGroups = aSeqPropagate->Length(); // Recover previous description to get rid of Propagate dump aFunction->SetDescription(theDesc); +#ifdef FIND_GROUPS_BY_POINTS + // BEGIN: new groups search + + // W2 R2 + // .----.-----.----. + // e| | | | | + // | | | | | + // . | | | . + // g / ''..| | |..'' \ + // f / ''''''' \ + // .---.--'.. | | | ..'--.---. + // |a \ '''...........''' / | + // |-------\------' | '------/-------. + // | \ | / | + // c| \ | / | + // | R1 \ | / | + // | \ | / | + // ._________________|_________________. + // | L1 | | + // | | | + // | | | + // b| | | + // | | | + // |-----------------|-----------------| + // | W1 | | + // '-----------------'-----------------' + // d + + // "Thickness" group (a) + gp_Pnt aPntA (-theL1, 0, theR1 + theW1/2.); + aPntA.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexA (aPntA); + TopoDS_Vertex aVertA = TopoDS::Vertex(mkVertexA.Shape()); + TopoDS_Shape anEdgeA = GEOMUtils::GetEdgeNearPoint(aShape, aVertA); + + // "Circular quarter of pipe" group (b) + gp_Pnt aPntB (-theL1, -aR1Ext * sin(M_PI/4.), -aR1Ext * sin(M_PI/4.)); + aPntB.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexB (aPntB); + TopoDS_Vertex aVertB = TopoDS::Vertex(mkVertexB.Shape()); + TopoDS_Shape anEdgeB = GEOMUtils::GetEdgeNearPoint(aShape, aVertB); + + // "Circular quarter of pipe" group (c) + gp_Pnt aPntC (-theL1, -aR1Ext * sin(M_PI/4.), aR1Ext * sin(M_PI/4.)); + aPntC.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexC (aPntC); + TopoDS_Vertex aVertC = TopoDS::Vertex(mkVertexC.Shape()); + TopoDS_Shape anEdgeC = GEOMUtils::GetEdgeNearPoint(aShape, aVertC); + + // "Main pipe half length" group (d) + gp_Pnt aPntD (-theL1/2., 0, -aR1Ext); + aPntD.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexD (aPntD); + TopoDS_Vertex aVertD = TopoDS::Vertex(mkVertexD.Shape()); + TopoDS_Shape anEdgeD = GEOMUtils::GetEdgeNearPoint(aShape, aVertD); + + // "Incident pipe half length" group (e) + double aTol10 = Precision::Confusion() * 10.; + gp_Pnt aPntE (-aR2Ext, 0, theL2 - aTol10); + aPntE.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexE (aPntE); + TopoDS_Vertex aVertE = TopoDS::Vertex(mkVertexE.Shape()); + TopoDS_Shape anEdgeE = GEOMUtils::GetEdgeNearPoint(aShape, aVertE); + + // "Flange" group (f) + double aFx = - aR2Ext - aTol10; + if (shapeType == TSHAPE_CHAMFER) + aFx -= theW; + else if (shapeType == TSHAPE_FILLET) + aFx -= theRF; + gp_Pnt aPntF (aFx, 0, aR1Ext); + aPntF.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexF (aPntF); + TopoDS_Vertex aVertF = TopoDS::Vertex(mkVertexF.Shape()); + TopoDS_Shape anEdgeF = GEOMUtils::GetEdgeNearPoint(aShape, aVertF); + + // "Chamfer or Fillet" group (g) + TopoDS_Shape anEdgeG; + if (shapeType == TSHAPE_CHAMFER) { + gp_Pnt aPntG (-aR2Ext - theW/2., 0, aR1Ext + theH/2.); + aPntG.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexG (aPntG); + TopoDS_Vertex aVertG = TopoDS::Vertex(mkVertexG.Shape()); + anEdgeG = GEOMUtils::GetEdgeNearPoint(aShape, aVertG); + } + else if (shapeType == TSHAPE_FILLET) { + gp_Pnt aPntG (-aR2Ext - theRF/2., 0, aR1Ext + theRF/2.); + aPntG.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexG (aPntG); + TopoDS_Vertex aVertG = TopoDS::Vertex(mkVertexG.Shape()); + anEdgeG = GEOMUtils::GetEdgeNearPoint(aShape, aVertG); + } + + for (int i = 1 ; i <= aNbGroups; i++) { + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(aSeqPropagate->Value(i)); + if (aGroup.IsNull()) + continue; + + TopoDS_Shape aGroupShape = aGroup->GetValue(); + TopTools_IndexedMapOfShape anEdgesMap; + TopExp::MapShapes(aGroupShape, TopAbs_EDGE, anEdgesMap); + + if (anEdgesMap.Contains(anEdgeA)) { // a + aGroup->SetName("THICKNESS"); + theSeq->Append(aGroup); + } + else if (anEdgesMap.Contains(anEdgeB)) { // b + aGroup->SetName("CIRCULAR_QUARTER_PIPE"); + theSeq->Append(aGroup); + } + else if (anEdgesMap.Contains(anEdgeC)) { // c + aGroup->SetName("CIRCULAR_QUARTER_PIPE"); + theSeq->Append(aGroup); + } + else if (anEdgesMap.Contains(anEdgeD)) { // d + aGroup->SetName("HALF_LENGTH_MAIN_PIPE"); + theSeq->Append(aGroup); + } + else if (anEdgesMap.Contains(anEdgeE)) { // e + aGroup->SetName("HALF_LENGTH_INCIDENT_PIPE"); + theSeq->Append(aGroup); + } + else if (anEdgesMap.Contains(anEdgeF)) { // f + aGroup->SetName("FLANGE"); + theSeq->Append(aGroup); + } + else if (shapeType == TSHAPE_CHAMFER) { // g + if (anEdgesMap.Contains(anEdgeG)) { + aGroup->SetName("CHAMFER"); + theSeq->Append(aGroup); + } + } + else if (shapeType == TSHAPE_FILLET) { // g + if (anEdgesMap.Contains(anEdgeG)) { + aGroup->SetName("FILLET"); + theSeq->Append(aGroup); + } + } + else { + } + } + // END: new groups search +#else bool addGroup; bool circularFoundAndAdded = false; bool circularFound10 = false; @@ -439,23 +601,23 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int bool flangeFoundAndAdded = false; bool chamferOrFilletFound = false; - for (int i=1 ; i<= aNbGroups; i++) { + for (int i = 1 ; i <= aNbGroups; i++) { addGroup = false; Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(aSeqPropagate->Value(i)); - if(aGroup.IsNull()) + if (aGroup.IsNull()) continue; TopoDS_Shape aGroupShape = aGroup->GetValue(); - BRepBuilderAPI_Transform aTransformationShapeInv(aGroupShape, aTrsfInv, Standard_False); + BRepBuilderAPI_Transform aTransformationShapeInv (aGroupShape, aTrsfInv, Standard_False); TopoDS_Shape aGroupShapeTrsfInv = aTransformationShapeInv.Shape(); TopTools_IndexedMapOfShape anEdgesMap; TopExp::MapShapes(aGroupShapeTrsfInv,TopAbs_EDGE, anEdgesMap); - nbEdges = anEdgesMap.Extent(); + Standard_Integer nbEdges = anEdgesMap.Extent(); if (shapeType == TSHAPE_BASIC) { - if ((nbEdges == 21) || /*R1Ext = R2Ext*/(nbEdges == 17)){ + if ((nbEdges >= 21) || /*R1Ext = R2Ext*/(nbEdges == 17)) { // 17, 17+8*{1,2,3}, 21, 21+8*{1,2,3} addGroup = true; aGroup->SetName("THICKNESS"); } @@ -469,7 +631,7 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int else if (nbEdges == 8) { incidentPipeFound = true; mainPipeFound = false; - radialFound =false; + radialFound = false; flangeFound = false; TopExp_Explorer Ex(aGroupShapeTrsfInv,TopAbs_VERTEX); @@ -522,7 +684,7 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int continue; } else if (shapeType == TSHAPE_CHAMFER || shapeType == TSHAPE_FILLET) { - if (nbEdges == 25) { + if (nbEdges >= 25) { // 25, 25+8, 25+16, 25+24 addGroup = true; aGroup->SetName("THICKNESS"); } @@ -622,6 +784,7 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int if (addGroup) theSeq->Append(aGroup); } +#endif SetErrorCode(OK); return true; @@ -1078,7 +1241,8 @@ bool GEOMImpl_IAdvancedOperations::MakePipeTShapePartition(Handle(GEOM_Object) t TopoDS_Shape aShape = Te3->GetValue(); theShape->GetLastFunction()->SetValue(aShape); - } catch (Standard_Failure) { + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return false; @@ -1193,6 +1357,224 @@ bool GEOMImpl_IAdvancedOperations::MakePipeTShapeMirrorAndGlue(Handle(GEOM_Objec return true; } +//======================================================================= +//function : MakePipeTShapeThicknessReduction +//purpose : Static method. Add thiskness reduction elements at the three +// open ends of the T-Shape. +//======================================================================= +TopoDS_Shape GEOMImpl_IAdvancedOperations::MakePipeTShapeThicknessReduction + (TopoDS_Shape theShape, + double r1, double w1, double l1, + double r2, double w2, double l2, + double rL, double wL, double ltransL, double lthinL, + double rR, double wR, double ltransR, double lthinR, + double rI, double wI, double ltransI, double lthinI, + bool fuseReductions) +{ + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + // + // ---------------------. + // W \ + // ---------------------. \ + // ^ \ '-----------------. + // |R \ Wthin | + // | '-----------------' + // v Rthin + // --.--.--.--.--.--.--.--.--.--.--.--.--.--.-- + // Ltrans Lthin + + TopoDS_Shape aResult = theShape; + double aTol = Precision::Confusion(); + + gp_Vec aVX = gp::DX(), aVZ = gp::DZ(); + + // Left reduction (rL, wL, ltransL, lthinL) + if (rL > aTol && wL > aTol && ltransL > aTol) { + gp_Pnt aPLeft (-l1, 0, 0); + gp_Ax2 anAxesLeft (aPLeft, -aVX, aVZ); + TopoDS_Shape aReductionLeft = GEOMImpl_IAdvancedOperations::MakeThicknessReduction + (anAxesLeft, r1, w1, rL, wL, ltransL, lthinL, fuseReductions); + + if (fuseReductions) { + BRepAlgoAPI_Fuse fuseL (aResult, aReductionLeft); + if (!fuseL.IsDone()) + StdFail_NotDone::Raise("Cannot fuse Te with left reduction"); + aResult = fuseL.Shape(); + } + else { + BRep_Builder B; + TopoDS_Compound C; + B.MakeCompound(C); + B.Add(C, aResult); + B.Add(C, aReductionLeft); + aResult = C; + } + } + + // Right reduction + if (rR > aTol && wR > aTol && ltransR > aTol) { + gp_Pnt aPRight (l1, 0, 0); + gp_Ax2 anAxesRight (aPRight, aVX, aVZ); + TopoDS_Shape aReductionRight = GEOMImpl_IAdvancedOperations::MakeThicknessReduction + (anAxesRight, r1, w1, rR, wR, ltransR, lthinR, fuseReductions); + + if (fuseReductions) { + BRepAlgoAPI_Fuse fuseR (aResult, aReductionRight); + if (!fuseR.IsDone()) + StdFail_NotDone::Raise("Cannot fuse Te with right reduction"); + aResult = fuseR.Shape(); + } + else { + BRep_Builder B; + TopoDS_Compound C; + B.MakeCompound(C); + B.Add(C, aResult); + B.Add(C, aReductionRight); + aResult = C; + } + } + + // Incident reduction + if (rI > aTol && wI > aTol && ltransI > aTol) { + gp_Pnt aPInci (0, 0, l2); + gp_Ax2 anAxesInci (aPInci, aVZ, aVX); + TopoDS_Shape aReductionInci = GEOMImpl_IAdvancedOperations::MakeThicknessReduction + (anAxesInci, r2, w2, rI, wI, ltransI, lthinI, fuseReductions); + + if (fuseReductions) { + BRepAlgoAPI_Fuse fuseInci (aResult, aReductionInci); + if (!fuseInci.IsDone()) + StdFail_NotDone::Raise("Cannot fuse Te with incident reduction"); + aResult = fuseInci.Shape(); + } + else { + BRep_Builder B; + TopoDS_Compound C; + B.MakeCompound(C); + B.Add(C, aResult); + B.Add(C, aReductionInci); + aResult = C; + } + } + + // Get rid of extra compounds + TopTools_ListOfShape listShapeRes; + GEOMUtils::AddSimpleShapes(aResult, listShapeRes); + aResult = listShapeRes.First(); // useful for the case "fuseReductions == true" + + if (!fuseReductions && listShapeRes.Extent() > 1) { + // Simplify T-Shape compound (get rid of sub-compounds) and glue duplicated faces + BRep_Builder B; + TopoDS_Compound C; + B.MakeCompound(C); + + TopTools_ListIteratorOfListOfShape itSub (listShapeRes); + for (; itSub.More(); itSub.Next()) + B.Add(C, itSub.Value()); + + // GlueFaces + aResult = GEOMImpl_GlueDriver::GlueFaces(C, Precision::Confusion(), Standard_True); + } + + return aResult; +} + +//======================================================================= +//function : MakeThicknessReduction +//purpose : Static method. Create one thickness reduction element. +//======================================================================= +TopoDS_Shape GEOMImpl_IAdvancedOperations::MakeThicknessReduction (gp_Ax2 theAxes, + const double R, const double W, + const double Rthin, const double Wthin, + const double Ltrans, const double Lthin, + bool fuse) +{ + double aTol = Precision::Confusion(); + if (Rthin < aTol || Wthin < aTol || Ltrans < aTol) { + StdFail_NotDone::Raise("Cannot build thickness reduction: too small values"); + } + bool isThinPart = (Lthin > aTol); + + // . + // W |\ + // . \ + // ^ \ '-----------------. + // |R \| | Wthin + // | '-----------------' + // v Rthin + // --.--.--.--.--.--.--.--.--.--.--.--.--> theAxes.Direction() + // Ltrans Lthin + + double RExt = R + W; + double RthinExt = Rthin + Wthin; + + gp_Dir aNormal = theAxes.Direction(); + gp_Dir anXDir = theAxes.XDirection(); + gp_Pnt aPntCyl (theAxes.Location().XYZ() + aNormal.XYZ()*Ltrans); + gp_Ax2 anAxesCyl (aPntCyl, aNormal, anXDir); + + // Build the transition part + BRepPrimAPI_MakeCone ConeExt (theAxes, RExt, RthinExt, Ltrans); + BRepPrimAPI_MakeCone ConeInt (theAxes, R, Rthin, Ltrans); + ConeExt.Build(); + ConeInt.Build(); + if (!ConeExt.IsDone() || !ConeInt.IsDone()) + StdFail_NotDone::Raise("Cannot build cones of thickness reduction"); + BRepAlgoAPI_Cut cut1 (ConeExt.Shape(), ConeInt.Shape()); + if (!cut1.IsDone()) + StdFail_NotDone::Raise("Coudn't build transition part of thickness reduction"); + TopoDS_Shape aReduction = cut1.Shape(); + + // Build the thin part, if required + TopoDS_Shape aThinPart; + if (isThinPart) { + BRepPrimAPI_MakeCylinder CExt (anAxesCyl, RthinExt, Lthin); + BRepPrimAPI_MakeCylinder CInt (anAxesCyl, Rthin, Lthin); + CExt.Build(); + CInt.Build(); + if (!CExt.IsDone() || !CInt.IsDone()) + StdFail_NotDone::Raise("Cannot build cylinders of thickness reduction"); + BRepAlgoAPI_Cut cut2 (CExt.Shape(), CInt.Shape()); + if (!cut2.IsDone()) + StdFail_NotDone::Raise("Coudn't build thin part of thickness reduction"); + aThinPart = cut2.Shape(); + } + + // Join parts + if (fuse) { + if (isThinPart) { + BRepAlgoAPI_Fuse fuse1 (aReduction, aThinPart); + if (!fuse1.IsDone()) + StdFail_NotDone::Raise("Cannot fuse parts of thickness reduction"); + aReduction = fuse1.Shape(); + } + } + else { + // Partition the reduction on blocks + gp_Ax3 anAxesPln1 (aPntCyl, theAxes.XDirection(), aNormal); + gp_Ax3 anAxesPln2 (aPntCyl, theAxes.YDirection(), aNormal); + gp_Pln aPln1 (anAxesPln1); + gp_Pln aPln2 (anAxesPln2); + double aSize = Ltrans + Lthin + R + Rthin + Wthin; // to guarantee enough size in all directions + TopoDS_Shape aTool1 = BRepBuilderAPI_MakeFace(aPln1, -aSize, +aSize, -aSize, +aSize).Shape(); + TopoDS_Shape aTool2 = BRepBuilderAPI_MakeFace(aPln2, -aSize, +aSize, -aSize, +aSize).Shape(); + + GEOMAlgo_Splitter PS; + PS.AddShape(aReduction); + if (isThinPart) + PS.AddShape(aThinPart); + PS.AddTool(aTool1); + PS.AddTool(aTool2); + PS.SetLimit(TopAbs_SOLID); + PS.Perform(); + + aReduction = PS.Shape(); + } + + return aReduction; +} + //============================================================================= /*! * MakePipeTShape @@ -1212,6 +1594,9 @@ bool GEOMImpl_IAdvancedOperations::MakePipeTShapeMirrorAndGlue(Handle(GEOM_Objec Handle(TColStd_HSequenceOfTransient) GEOMImpl_IAdvancedOperations::MakePipeTShape(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, bool theHexMesh) { MESSAGE("GEOMImpl_IAdvancedOperations::MakePipeTShape"); @@ -1226,7 +1611,7 @@ Handle(TColStd_HSequenceOfTransient) //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_PipeTShapeDriver::GetID()) return NULL; - GEOMImpl_IPipeTShape aData(aFunction); + GEOMImpl_IPipeTShape aData (aFunction); aData.SetR1(theR1); aData.SetW1(theW1); @@ -1236,6 +1621,10 @@ Handle(TColStd_HSequenceOfTransient) aData.SetL2(theL2); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -1245,28 +1634,40 @@ Handle(TColStd_HSequenceOfTransient) SetErrorCode("TShape driver failed"); return NULL; } + if (theHexMesh) { if (!MakePipeTShapePartition(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) return NULL; if (!MakePipeTShapeMirrorAndGlue(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) return NULL; } - } catch (Standard_Failure) { + + if (isTRL || isTRR || isTRI) { + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); + } + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } - Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); if (theHexMesh) { - /* - * Get the groups: BEGIN - */ + // Get the groups try { - if (!MakeGroups(aShape, TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + if (!MakeGroups(aShape, TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., aSeq, gp_Trsf())) return NULL; } catch (Standard_Failure) { @@ -1274,38 +1675,43 @@ Handle(TColStd_HSequenceOfTransient) SetErrorCode(aFail->GetMessageString()); return NULL; } + } - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() << "] = geompy.MakePipeTShape(" - << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " - << theHexMesh << ")"; - } - /* - * Get the groups: END - */ - else { + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShape(" << theR1 << ", " << theW1 << ", " - << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theHexMesh << ")"; + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShape(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theHexMesh; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); @@ -1333,12 +1739,16 @@ Handle(TColStd_HSequenceOfTransient) */ //============================================================================= Handle(TColStd_HSequenceOfTransient) -GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double theW1, double theL1, - double theR2, double theW2, double theL2, - bool theHexMesh, - Handle(GEOM_Object) theP1, - Handle(GEOM_Object) theP2, - Handle(GEOM_Object) theP3) +GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition + (double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, + bool theHexMesh, + Handle(GEOM_Object) theP1, + Handle(GEOM_Object) theP2, + Handle(GEOM_Object) theP3) { SetErrorCode(KO); //Add a new object @@ -1368,6 +1778,10 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double th aData.SetL2(theL2); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -1377,19 +1791,32 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double th SetErrorCode("TShape driver failed"); return NULL; } - } catch (Standard_Failure) { + + if (theHexMesh) { + if (!MakePipeTShapePartition(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) + return NULL; + if (!MakePipeTShapeMirrorAndGlue(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) + return NULL; + } + + if (isTRL || isTRR || isTRI) { + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); + } + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } - if (theHexMesh) { - if (!MakePipeTShapePartition(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) - return NULL; - if (!MakePipeTShapeMirrorAndGlue(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) - return NULL; - } - TopoDS_Shape Te = aShape->GetValue(); // Set Position @@ -1397,15 +1824,15 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double th BRepBuilderAPI_Transform aTransformation(Te, aTrsf, Standard_False); TopoDS_Shape aTrsf_Shape = aTransformation.Shape(); aFunction->SetValue(aTrsf_Shape); + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); if (theHexMesh) { - // - // Get the groups: BEGIN - // + // Get the groups try { - if (!MakeGroups(aShape,TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) { + if (!MakeGroups(aShape,TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., aSeq, aTrsf)) { return NULL; } } @@ -1414,40 +1841,43 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double th SetErrorCode(aFail->GetMessageString()); return NULL; } - - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() << "] = geompy.MakePipeTShape(" - << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " - << theHexMesh << ", " << theP1 << ", " << theP2 << ", " << theP3 << ")"; } - // - // Get the groups: END - // - else { + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShape(" << theR1 << ", " << theW1 << ", " - << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theHexMesh << ", " << theP1 - << ", " << theP2 << ", " << theP3 << ")"; + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShape(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theHexMesh << ", " << theP1 << ", " << theP2 << ", " << theP3; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); @@ -1474,10 +1904,14 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double th */ //============================================================================= Handle(TColStd_HSequenceOfTransient) -GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, double theL1, - double theR2, double theW2, double theL2, - double theH, double theW, - bool theHexMesh) +GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer + (double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, + double theH, double theW, + bool theHexMesh) { SetErrorCode(KO); //Add a new object @@ -1501,6 +1935,10 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, aData.SetW(theW); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -1510,7 +1948,8 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, SetErrorCode("TShape driver failed"); return NULL; } - } catch (Standard_Failure) { + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; @@ -1578,39 +2017,43 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, aFunction->SetValue(aChamferShape); // END of chamfer - // bool doMesh = false; if (theHexMesh) { - // doMesh = true; - if (!MakePipeTShapePartition(aShape, theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, 0, false)) { - MESSAGE("PipeTShape partition failed"); - // doMesh = false; + if (!MakePipeTShapePartition(aShape, theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, 0, false)) return NULL; - } - if (!MakePipeTShapeMirrorAndGlue(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) { - MESSAGE("PipeTShape mirrors and glue failed"); - // doMesh = false; + if (!MakePipeTShapeMirrorAndGlue(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) return NULL; + } + + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + if (isTRL || isTRR || isTRI) { + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); } } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); - // if (doMesh) { if (theHexMesh) { - // - // Get the groups: BEGIN - // - //if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) { - // //Make a Python command - // GEOM::TPythonDump(aFunction) - // << "[" << aShape << "] = geompy.MakePipeTShapeChamfer(" << theR1 << ", " << theW1 - // << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theH << ", " << theW - // << ", " << theHexMesh << ")"; - //} - //else { + // Get the groups try { - if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, + theH, theW, 0., aSeq, gp_Trsf())) return NULL; } catch (Standard_Failure) { @@ -1618,40 +2061,43 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, SetErrorCode(aFail->GetMessageString()); return NULL; } - - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() - << "] = geompy.MakePipeTShapeChamfer(" << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 - << ", " << theW2 << ", " << theL2 << ", " << theH << ", " << theW << ", " << theHexMesh << ")"; - //} } - // - // Get the groups: END - // - else { + + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShapeChamfer(" << theR1 << ", " << theW1 - << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theH << ", " << theW - << ", " << theHexMesh << ")"; + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShapeChamfer(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theH << ", " << theW << ", " << theHexMesh; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); @@ -1682,13 +2128,17 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, */ //============================================================================= Handle(TColStd_HSequenceOfTransient) -GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, double theW1, double theL1, - double theR2, double theW2, double theL2, - double theH, double theW, - bool theHexMesh, - Handle(GEOM_Object) theP1, - Handle(GEOM_Object) theP2, - Handle(GEOM_Object) theP3) +GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition + (double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, + double theH, double theW, + bool theHexMesh, + Handle(GEOM_Object) theP1, + Handle(GEOM_Object) theP2, + Handle(GEOM_Object) theP3) { SetErrorCode(KO); //Add a new object @@ -1717,6 +2167,10 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, do aData.SetW(theW); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -1726,7 +2180,8 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, do SetErrorCode("TShape driver failed"); return NULL; } - } catch (Standard_Failure) { + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; @@ -1799,21 +2254,42 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, do return NULL; } - TopoDS_Shape Te = aShape->GetValue(); + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + if (isTRL || isTRR || isTRI) { + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } // Set Position gp_Trsf aTrsf = GetPositionTrsf(theL1, theL2, theP1, theP2, theP3); - BRepBuilderAPI_Transform aTransformation(Te, aTrsf, Standard_False); + BRepBuilderAPI_Transform aTransformation (aShape->GetValue(), aTrsf, Standard_False); TopoDS_Shape aTrsf_Shape = aTransformation.Shape(); aFunction->SetValue(aTrsf_Shape); + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); + if (theHexMesh) { - /* - * Get the groups: BEGIN - */ + // Get the groups try { - if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) + if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, + theH, theW, 0., aSeq, aTrsf)) return NULL; } catch (Standard_Failure) { @@ -1821,40 +2297,44 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, do SetErrorCode(aFail->GetMessageString()); return NULL; } + } - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() - << "] = geompy.MakePipeTShapeChamfer(" << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 - << ", " << theW2 << ", " << theL2 << ", " << theH << ", " << theW << ", " << theHexMesh << ", " - << theP1 << ", " << theP2 << ", " << theP3 << ")"; - } - /* - * Get the groups: END - */ - else { + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShapeChamfer(" << theR1 << ", " << theW1 - << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theH << ", " << theW - << ", " << theHexMesh << ", " << theP1 << ", " << theP2 << ", " << theP3 << ")"; + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShapeChamfer(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theH << ", " << theW << ", " << theHexMesh << ", " + << theP1 << ", " << theP2 << ", " << theP3; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); @@ -1880,9 +2360,13 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, do */ //============================================================================= Handle(TColStd_HSequenceOfTransient) -GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, double theL1, - double theR2, double theW2, double theL2, - double theRF, bool theHexMesh) +GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet + (double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, + double theRF, bool theHexMesh) { SetErrorCode(KO); //Add a new object @@ -1905,6 +2389,10 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d aData.SetRF(theRF); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -1914,7 +2402,8 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d SetErrorCode("TShape driver failed"); return NULL; } - } catch (Standard_Failure) { + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; @@ -2003,14 +2492,36 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d return NULL; } + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + if (isTRL || isTRR || isTRI) { + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); + if (theHexMesh) { - /* - * Get the groups: BEGIN - */ + // Get the groups try { - if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., theRF, aSeq, gp_Trsf())) return NULL; } catch (Standard_Failure) { @@ -2018,39 +2529,43 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d SetErrorCode(aFail->GetMessageString()); return NULL; } + } - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() - << "] = geompy.MakePipeTShapeFillet(" << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 - << ", " << theW2 << ", " << theL2 << ", " << theRF << ", " << theHexMesh << ")"; - } - /* - * Get the groups: END - */ - else { + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShapeFillet(" << theR1 << ", " << theW1 - << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theRF << ", " - << theHexMesh << ")"; + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShapeFillet(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theRF << ", " << theHexMesh; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); @@ -2080,12 +2595,16 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d */ //============================================================================= Handle(TColStd_HSequenceOfTransient) -GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition(double theR1, double theW1, double theL1, - double theR2, double theW2, double theL2, - double theRF, bool theHexMesh, - Handle(GEOM_Object) theP1, - Handle(GEOM_Object) theP2, - Handle(GEOM_Object) theP3) +GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition + (double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, + double theRF, bool theHexMesh, + Handle(GEOM_Object) theP1, + Handle(GEOM_Object) theP2, + Handle(GEOM_Object) theP3) { SetErrorCode(KO); //Add a new object @@ -2113,6 +2632,10 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition(double theR1, dou aData.SetRF(theRF); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -2122,7 +2645,8 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition(double theR1, dou SetErrorCode("TShape driver failed"); return NULL; } - } catch (Standard_Failure) { + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; @@ -2210,21 +2734,42 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition(double theR1, dou return NULL; } - TopoDS_Shape Te = aShape->GetValue(); + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + if (isTRL || isTRR || isTRI) { + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } // Set Position gp_Trsf aTrsf = GetPositionTrsf(theL1, theL2, theP1, theP2, theP3); - BRepBuilderAPI_Transform aTransformation(Te, aTrsf, Standard_False); + BRepBuilderAPI_Transform aTransformation (aShape->GetValue(), aTrsf, Standard_False); TopoDS_Shape aTrsf_Shape = aTransformation.Shape(); aFunction->SetValue(aTrsf_Shape); + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); + if (theHexMesh) { - /* - * Get the groups: BEGIN - */ + // Get the groups try { - if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) + if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., theRF, aSeq, aTrsf)) return NULL; } catch (Standard_Failure) { @@ -2232,40 +2777,44 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition(double theR1, dou SetErrorCode(aFail->GetMessageString()); return NULL; } + } - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() - << "] = geompy.MakePipeTShapeFillet(" << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 - << ", " << theW2 << ", " << theL2 << ", " << theRF << ", " << theHexMesh << ", " << theP1 << ", " - << theP2 << ", " << theP3 << ")"; - } - /* - * Get the groups: END - */ - else { + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShapeFillet(" << theR1 << ", " << theW1 - << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theRF << ", " - << theHexMesh << ", " << theP1 << ", " << theP2 << ", " << theP3 << ")"; - } + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; + } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShapeFillet(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theRF << ", " << theHexMesh << ", " + << theP1 << ", " << theP2 << ", " << theP3; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); diff --git a/src/GEOMImpl/GEOMImpl_IAdvancedOperations.hxx b/src/GEOMImpl/GEOMImpl_IAdvancedOperations.hxx index a7c11d6ff..5611824cb 100644 --- a/src/GEOMImpl/GEOMImpl_IAdvancedOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IAdvancedOperations.hxx @@ -27,6 +27,8 @@ #include "GEOM_Engine.hxx" #include "GEOM_Object.hxx" +#include + class GEOMImpl_IBasicOperations; class GEOMImpl_IBooleanOperations; class GEOMImpl_IShapesOperations; @@ -43,23 +45,36 @@ private: double theR2, double theW2, double theL2, double theH = 0, double theW = 0, double theRF = 0, bool isNormal = true); + bool MakePipeTShapeMirrorAndGlue(Handle(GEOM_Object) theShape, double theR1, double theW1, double theL1, double theR2, double theW2, double theL2); + + bool MakePipeTShapeThicknessReduction (Handle(GEOM_Object) theShape, + double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI); + bool MakeGroups(Handle(GEOM_Object) theShape, int shapType, double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theH, double theW, double theRF, Handle(TColStd_HSequenceOfTransient) theSeq, gp_Trsf aTrsf); + gp_Trsf GetPositionTrsf(double theL1, double theL2, Handle(GEOM_Object) P1 = 0, Handle(GEOM_Object) P2 = 0, Handle(GEOM_Object) P3 = 0); + bool CheckCompatiblePosition(double& theL1, double& theL2, Handle(GEOM_Object) theP1, Handle(GEOM_Object) theP2, Handle(GEOM_Object) theP3, double theTolerance); + private: GEOMImpl_IBasicOperations* myBasicOperations; GEOMImpl_IBooleanOperations* myBooleanOperations; @@ -70,6 +85,57 @@ private: GEOMImpl_ILocalOperations* myLocalOperations; GEOMImpl_IHealingOperations* myHealingOperations; +public: + + /*! + * \brief Add three thickness reductions at the open ends of the pipe T-Shape + * + * \param theShape - the pipe T-Shape + * \param r1 - the internal radius of main pipe + * \param w1 - the thickness of main pipe + * \param l1 - the half-length of main pipe + * \param r2 - the internal radius of incident pipe + * \param w2 - the thickness of incident pipe + * \param l2 - the half-length of main pipe + * \param r*, w*, ltrans* and lthin* - internal radius, thickness, length of transition part + * and length of thin part of left(L), right(R) and + * incident(I) thickness reduction correspondingly + * \param fuseReductions - boolean flag (use true to generate single solid, + * false to obtain parts, useful for hexameshing) + * \retval TopoDS_Shape - Resulting shape + */ + Standard_EXPORT static TopoDS_Shape MakePipeTShapeThicknessReduction + (TopoDS_Shape theShape, + double r1, double w1, double l1, + double r2, double w2, double l2, + double rL, double wL, double ltransL, double lthinL, + double rR, double wR, double ltransR, double lthinR, + double rI, double wI, double ltransI, double lthinI, + bool fuseReductions); + + /*! + * \brief Create one thickness reduction element + * + * This method is called three times from MakePipeTShapeThicknessReduction + * to create three thickness reductions (one per each open end of a pipe T-Shape) + * + * \param theAxes - the position + * \param R - the internal radius of main pipe + * \param W - the thickness of main pipe + * \param Rthin - the internal radius of thin part + * \param Wthin - the thickness of thin part + * \param Ltrans - the length of transition part + * \param Lthin - the length of thin part + * \param fuse - boolean flag (use true to generate single solid, + * false to obtain parts, useful for hexameshing) + * \retval TopoDS_Shape - Resulting shape + */ + Standard_EXPORT static TopoDS_Shape MakeThicknessReduction (gp_Ax2 theAxes, + const double R, const double W, + const double Rthin, const double Wthin, + const double Ltrans, const double Lthin, + bool fuse); + public: Standard_EXPORT GEOMImpl_IAdvancedOperations(GEOM_Engine* theEngine, int theDocID); Standard_EXPORT ~GEOMImpl_IAdvancedOperations(); @@ -77,34 +143,57 @@ public: Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShape(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, bool theHexMesh = true); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShapeWithPosition(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, bool theHexMesh = true, Handle(GEOM_Object) P1 = 0, Handle(GEOM_Object) P2 = 0, Handle(GEOM_Object) P3 = 0); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShapeChamfer(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, double theH, double theW, bool theHexMesh = true); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShapeChamferWithPosition(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, double theH, double theW, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, bool theHexMesh = true, Handle(GEOM_Object) P1 = 0, Handle(GEOM_Object) P2 = 0, Handle(GEOM_Object) P3 = 0); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShapeFillet(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, double theRF, bool theHexMesh = true); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShapeFilletWithPosition(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, double theRF, bool theHexMesh = true, Handle(GEOM_Object) P1 = 0, Handle(GEOM_Object) P2 = 0, diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx index 65b2ea018..27d432337 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx @@ -794,71 +794,14 @@ Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetEdgeNearPoint #if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; #endif - TopoDS_Shape aShape; - TopoDS_Vertex aVert = TopoDS::Vertex(anArg); + TopoDS_Shape aShape = GEOMUtils::GetEdgeNearPoint(aBlockOrComp, aVert); - // 1. Explode blocks on edges - TopTools_MapOfShape mapShape; - Standard_Integer nbEdges = 0; - TopExp_Explorer exp (aBlockOrComp, TopAbs_EDGE); - for (; exp.More(); exp.Next()) { - if (mapShape.Add(exp.Current())) { - nbEdges++; - } - } - - if (nbEdges == 0) { - SetErrorCode("Given shape contains no edges"); - return NULL; - } - - mapShape.Clear(); - Standard_Integer ind = 1; - TopTools_Array1OfShape anEdges (1, nbEdges); - TColStd_Array1OfReal aDistances (1, nbEdges); - for (exp.Init(aBlockOrComp, TopAbs_EDGE); exp.More(); exp.Next()) { - if (mapShape.Add(exp.Current())) { - TopoDS_Shape anEdge = exp.Current(); - anEdges(ind) = anEdge; - - // 2. Classify the point relatively each edge - BRepExtrema_DistShapeShape aDistTool (aVert, anEdges(ind)); - if (!aDistTool.IsDone()) { - SetErrorCode("Can not find a distance from the given point to one of edges"); - return NULL; - } - aDistances(ind) = aDistTool.Value(); - ind++; - } - } - - // 3. Define edge, having minimum distance to the point - Standard_Real nearest = RealLast(), nbFound = 0; - Standard_Real prec = Precision::Confusion(); - for (ind = 1; ind <= nbEdges; ind++) { - if (Abs(aDistances(ind) - nearest) < prec) { - nbFound++; - } else if (aDistances(ind) < nearest) { - nearest = aDistances(ind); - aShape = anEdges(ind); - nbFound = 1; - } else { - } - } - if (nbFound > 1) { - SetErrorCode("Multiple edges near the given point are found"); - return NULL; - } else if (nbFound == 0) { - SetErrorCode("There are no edges near the given point"); - return NULL; - } else { - TopTools_IndexedMapOfShape anIndices; - TopExp::MapShapes(aBlockOrComp, anIndices); - Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); - anArray->SetValue(1, anIndices.FindIndex(aShape)); - aResult = GetEngine()->AddSubShape(theShape, anArray); - } + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aShape)); + aResult = GetEngine()->AddSubShape(theShape, anArray); } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); diff --git a/src/GEOMImpl/GEOMImpl_IPipeTShape.hxx b/src/GEOMImpl/GEOMImpl_IPipeTShape.hxx index 8048d0313..981280427 100644 --- a/src/GEOMImpl/GEOMImpl_IPipeTShape.hxx +++ b/src/GEOMImpl/GEOMImpl_IPipeTShape.hxx @@ -15,34 +15,13 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_IPipeTShape_HXX_ #define _GEOMImpl_IPipeTShape_HXX_ #include "GEOM_Function.hxx" -#define TSHAPE_ARG_R1 1 -#define TSHAPE_ARG_W1 2 -#define TSHAPE_ARG_L1 3 -#define TSHAPE_ARG_R2 4 -#define TSHAPE_ARG_W2 5 -#define TSHAPE_ARG_L2 6 - -// chamfer -#define TSHAPE_ARG_H 7 -#define TSHAPE_ARG_W 8 - -// fillet -#define TSHAPE_ARG_RF 9 - -// partition -#define TSHAPE_ARG_HEXMESH 10 - -// junction points -#define TSHAPE_ARG_P1 11 -#define TSHAPE_ARG_P2 12 -#define TSHAPE_ARG_P3 13 +#include class GEOMImpl_IPipeTShape { @@ -88,6 +67,34 @@ public: void SetP3(const Handle(GEOM_Function)& theP3){_func->SetReference(TSHAPE_ARG_P3, theP3); } Handle(GEOM_Function) GetP3() { return _func->GetReference(TSHAPE_ARG_P3); } +private: + enum { + // main pipe + TSHAPE_ARG_R1 = 1, + TSHAPE_ARG_W1 = 2, + TSHAPE_ARG_L1 = 3, + + // incident pipe + TSHAPE_ARG_R2 = 4, + TSHAPE_ARG_W2 = 5, + TSHAPE_ARG_L2 = 6, + + // chamfer + TSHAPE_ARG_H = 7, + TSHAPE_ARG_W = 8, + + // fillet + TSHAPE_ARG_RF = 9, + + // partition + TSHAPE_ARG_HEXMESH = 10, + + // junction points + TSHAPE_ARG_P1 = 11, + TSHAPE_ARG_P2 = 12, + TSHAPE_ARG_P3 = 13 + }; + private: Handle(GEOM_Function) _func; }; diff --git a/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.cxx b/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.cxx index f28ff1f27..700c1163c 100644 --- a/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.cxx @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,7 @@ #include #include +#include #include #include #include @@ -251,19 +253,19 @@ Handle(TColStd_HSequenceOfInteger) // along OX and OZ //======================================================================= void GEOMImpl_PipeTShapeDriver::GetCommonShapesOnCylinders(const TopoDS_Shape& theShape, - TopAbs_ShapeEnum theShapeType, - double r1, - double r2, - Handle(TopTools_HSequenceOfShape)& commonShapes) const + TopAbs_ShapeEnum theShapeType, + double r1, + double r2, + Handle(TopTools_HSequenceOfShape)& commonShapes) const { gp_Pnt aP0 (0, 0, 0); gp_Vec aVX = gp::DX(), aVZ = gp::DZ(); - gp_Ax3 anAxis1 (aP0, aVX), anAxis2 (aP0, aVZ); + gp_Ax3 anAxis1 (aP0, aVX, aVZ), anAxis2 (aP0, aVZ, aVX); TopTools_IndexedMapOfShape aMapOfShapes; aMapOfShapes.Clear(); TopExp::MapShapes(theShape, aMapOfShapes); - + commonShapes->Clear(); int myID; @@ -289,9 +291,9 @@ void GEOMImpl_PipeTShapeDriver::GetCommonShapesOnCylinders(const TopoDS_Shape& t for (int j=1; j<=aSeqExt1->Length();j++) { // std::cerr << "aSeqExt1->Value(j): " << aSeqExt1->Value(j) << std::endl; if (aSeqExt1->Value(j) == aSeqExt2->Value(i)) { - myID = aSeqExt1->Value(j); - commonShapes->Append(aMapOfShapes.FindKey(myID)); - found = true; + myID = aSeqExt1->Value(j); + commonShapes->Append(aMapOfShapes.FindKey(myID)); + found = true; } } } @@ -303,8 +305,8 @@ void GEOMImpl_PipeTShapeDriver::GetCommonShapesOnCylinders(const TopoDS_Shape& t //function : MakePipeTShape //purpose : //======================================================================= -TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakePipeTShape(const double r1, const double w1, const double l1, - const double r2, const double w2, const double l2) const +TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakePipeTShape (const double r1, const double w1, const double l1, + const double r2, const double w2, const double l2) const { double r1Ext = r1 + w1; double r2Ext = r2 + w2; @@ -312,8 +314,8 @@ TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakePipeTShape(const double r1, const do gp_Pnt aP0 (0, 0, 0); gp_Pnt aP1 (-l1, 0, 0); gp_Vec aVX = gp::DX(), aVY = gp::DY(), aVZ = gp::DZ(); - gp_Ax2 anAxes1 (aP1, aVX); - gp_Ax2 anAxes2 (aP0, aVZ); + gp_Ax2 anAxes1 (aP1, aVX, aVZ); + gp_Ax2 anAxes2 (aP0, aVZ, aVX); // Build the initial pipes BRepPrimAPI_MakeCylinder C1Int (anAxes1, r1, Abs(2 * l1)); @@ -325,13 +327,13 @@ TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakePipeTShape(const double r1, const do C2Int.Build(); C2Ext.Build(); if (!C1Int.IsDone() || !C1Ext.IsDone() || !C2Int.IsDone() || !C2Ext.IsDone()) { - StdFail_NotDone::Raise("Couldn't build cylinders"); + StdFail_NotDone::Raise("Cannot build cylinders"); } // Fuse the 2 pipes BRepAlgoAPI_Fuse fuse1 (C1Ext.Shape(), C2Ext.Shape()); if (!fuse1.IsDone()) { - StdFail_NotDone::Raise("Couldn't fuse cylinders"); + StdFail_NotDone::Raise("Cannot fuse cylinders"); } // Remove small radius main pipe @@ -353,17 +355,17 @@ TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakePipeTShape(const double r1, const do //function : MakeQuarterPipeTShape //purpose : //======================================================================= -TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakeQuarterPipeTShape(const double r1, const double w1, const double l1, - const double r2, const double w2, const double l2) const +TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakeQuarterPipeTShape (const double r1, const double w1, const double l1, + const double r2, const double w2, const double l2) const { - double r1Ext = r1 + w1; TopoDS_Shape Te = MakePipeTShape(r1, w1, l1, r2, w2, l2); if (Te.IsNull()) StdFail_NotDone::Raise("Couldn't build Pipe TShape"); // Get a quarter of shape => Te2 - BRepPrimAPI_MakeBox box1 (gp_Pnt(0,-2*r1Ext,-2*r1Ext),gp_Pnt(Abs(2 * l1), 2*r1Ext, Abs(2*l2))); - BRepPrimAPI_MakeBox box2 (gp_Pnt(0,2*r1Ext,-2*r1Ext),gp_Pnt(-Abs(2 * l1), 0, Abs(2*l2))); + double r1Ext = r1 + w1; + BRepPrimAPI_MakeBox box1 (gp_Pnt(0, -2*r1Ext, -2*r1Ext), gp_Pnt( Abs(2 * l1), 2*r1Ext, Abs(2*l2))); + BRepPrimAPI_MakeBox box2 (gp_Pnt(0, 2*r1Ext, -2*r1Ext), gp_Pnt(-Abs(2 * l1), 0, Abs(2*l2))); box1.Build(); box2.Build(); if (!box1.IsDone() || !box2.IsDone()) { @@ -385,7 +387,7 @@ TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakeQuarterPipeTShape(const double r1, c //function : Execute //purpose : //======================================================================= -Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) const +Standard_Integer GEOMImpl_PipeTShapeDriver::Execute (TFunction_Logbook& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); @@ -394,20 +396,20 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons Standard_Integer aType = aFunction->GetType(); TopoDS_Shape aShape, Te4, Te4Part; -// TopoDS_Edge arete_intersect_int; -// Handle(TopTools_HSequenceOfShape) edges_e = new TopTools_HSequenceOfShape; + //TopoDS_Edge arete_intersect_int; + //Handle(TopTools_HSequenceOfShape) edges_e = new TopTools_HSequenceOfShape; Handle(TColStd_HSequenceOfInteger) edges_e; -// Handle(TopTools_HSequenceOfShape) edges_i = new TopTools_HSequenceOfShape; -// gp_Pnt aP0 (0, 0, 0); -// gp_Vec aVX = gp::DX(), aVY = gp::DY(), aVZ = gp::DZ(); + //Handle(TopTools_HSequenceOfShape) edges_i = new TopTools_HSequenceOfShape; + //gp_Pnt aP0 (0, 0, 0); + //gp_Vec aVX = gp::DX(), aVY = gp::DY(), aVZ = gp::DZ(); bool hexMesh = (bool) aData.GetHexMesh(); // Useful values -// double aSize = 2*(aData.GetL1() + aData.GetL2()); + //double aSize = 2*(aData.GetL1() + aData.GetL2()); double epsilon = Precision::Approximation(); double aR1Ext = aData.GetR1() + aData.GetW1(); double aR2Ext = aData.GetR2() + aData.GetW2(); - + if (aData.GetR2() > aData.GetR1() + epsilon) { StdFail_NotDone::Raise("TShape cannot be computed if R2 > R1"); } @@ -415,7 +417,7 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons if (aR2Ext > aR1Ext + epsilon) { StdFail_NotDone::Raise("TShape cannot be computed if R2+W2 > R1+W1"); } - + // external radius are equal if (fabs(aR2Ext - aR1Ext) < epsilon) { if (aType == TSHAPE_CHAMFER) @@ -428,11 +430,10 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons } } - if (aR1Ext >= aData.GetL2() + epsilon) { StdFail_NotDone::Raise("TShape cannot be computed if R1+W1 >= L2"); } - if (aR2Ext >= aData.GetL1() + epsilon) { + if (aR2Ext >= aData.GetL1() + epsilon) { StdFail_NotDone::Raise("TShape cannot be computed if R2+W2 >= L1"); } @@ -446,22 +447,22 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons } if (aType == TSHAPE_FILLET) { - if (aData.GetRF() >= (aData.GetL2() - aR1Ext + epsilon) || - aData.GetRF() >= (aData.GetL1() - aR2Ext + epsilon)) + if (aData.GetRF() >= (aData.GetL2() - aR1Ext + epsilon) || + aData.GetRF() >= (aData.GetL1() - aR2Ext + epsilon)) StdFail_NotDone::Raise("TShape cannot be computed: radius of fillet is too high"); } if (hexMesh) { // Create a quarter of a basic T-Shape pipe -// std::cerr << "Create a quarter of a basic T-Shape pipe" << std::endl; + //std::cerr << "Create a quarter of a basic T-Shape pipe" << std::endl; Te4 = MakeQuarterPipeTShape(aData.GetR1(), aData.GetW1(), aData.GetL1(), - aData.GetR2(), aData.GetW2(), aData.GetL2()); + aData.GetR2(), aData.GetW2(), aData.GetL2()); } else { // No need to cut pipe t-shape -// std::cerr << "Create a basic T-Shape pipe" << std::endl; + //std::cerr << "Create a basic T-Shape pipe" << std::endl; Te4 = MakePipeTShape(aData.GetR1(), aData.GetW1(), aData.GetL1(), - aData.GetR2(), aData.GetW2(), aData.GetL2()); + aData.GetR2(), aData.GetW2(), aData.GetL2()); } aShape = Te4; /* @@ -502,7 +503,6 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons if (edges_e.IsNull() || edges_e->Length() == 0) { StdFail_NotDone::Raise("Common edges not found"); } - TopTools_IndexedDataMapOfShapeListOfShape M; GEOMImpl_Block6Explorer::MapShapesAndAncestors(Te4, TopAbs_EDGE, TopAbs_FACE, M); @@ -547,10 +547,9 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons if (!chamfer.IsDone()) { StdFail_NotDone::Raise("Chamfer can not be computed on the given shape with the given parameters"); } - + // BB.Add(CC, chamfer.Shape()); - - + // aShape = CC; aShape = chamfer.Shape(); } @@ -558,10 +557,10 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons // TShape with fillet // Create fillet on the edge arete_intersect_ext BRepFilletAPI_MakeFillet fill (Te4); - + TopTools_IndexedMapOfShape anIndices; TopExp::MapShapes(Te4, anIndices); - + TopoDS_Shape theBox; if (hexMesh) { BRepPrimAPI_MakeBox aBox (gp_Pnt(0,0,0),gp_Pnt(-aR2Ext, -aR2Ext, aR1Ext)); @@ -584,7 +583,7 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons if (edges_e.IsNull() || edges_e->Length() == 0) { StdFail_NotDone::Raise("Common edges not found"); } - + // fill.Add(TopoDS::Edge(edges_e->Value(1))); // if (!hexMesh) { for (int i=1;i<=edges_e->Length();i++) { diff --git a/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.hxx b/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.hxx index 90d8f35ec..19196fedf 100644 --- a/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.hxx @@ -15,7 +15,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_PipeTShapeDriver_HXX #define _GEOMImpl_PipeTShapeDriver_HXX @@ -24,11 +23,12 @@ #include "GEOMAlgo_State.hxx" +#include #include #include #include -#include #include +#include #include @@ -125,32 +125,33 @@ public: return (STANDARD_TYPE(GEOMImpl_PipeTShapeDriver) == AType || TFunction_Driver::IsKind(AType)); } private: + /*! * \brief Create a T-Shape based on pipes * \param r1 - the internal radius of main pipe - * \param w1 - the thickness main pipe + * \param w1 - the thickness of main pipe * \param l1 - the half-length of main pipe * \param r2 - the internal radius of incident pipe - * \param w2 - the thickness incident pipe + * \param w2 - the thickness of incident pipe * \param l2 - the half-length of main pipe * \retval TopoDS_Shape - Resulting shape */ - TopoDS_Shape MakePipeTShape(double r1, double w1, double l1, double r2, double w2, double l2) const; + TopoDS_Shape MakePipeTShape(double r1, double w1, double l1, + double r2, double w2, double l2) const; /*! * \brief Create a quarter of a T-Shape based on pipes * \param r1 - the internal radius of main pipe - * \param w1 - the thickness main pipe + * \param w1 - the thickness of main pipe * \param l1 - the half-length of main pipe * \param r2 - the internal radius of incident pipe - * \param w2 - the thickness incident pipe + * \param w2 - the thickness of incident pipe * \param l2 - the half-length of main pipe * \retval TopoDS_Shape - Resulting shape */ - TopoDS_Shape MakeQuarterPipeTShape(double r1, double w1, double l1, double r2, double w2, double l2) const; + TopoDS_Shape MakeQuarterPipeTShape(double r1, double w1, double l1, + double r2, double w2, double l2) const; -//======================================================================= -//function : GetShapesOnSurfaceIDs /*! * \brief Find IDs of sub-shapes complying with given status about surface * \param theSurface - the surface to check state of sub-shapes against @@ -164,8 +165,7 @@ private: const TopoDS_Shape& theShape, TopAbs_ShapeEnum theShapeType, GEOMAlgo_State theState) const; -//======================================================================= -//function : getShapesOnBoxIDs + /*! * \brief Find IDs of sub-shapes complying with given status about surface * \param theBox - the box to check state of sub-shapes against @@ -174,7 +174,6 @@ private: * \param theState - required state * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found sub-shapes */ -//======================================================================= Handle(TColStd_HSequenceOfInteger) GetShapesOnBoxIDs(const TopoDS_Shape& aBox, const TopoDS_Shape& aShape, @@ -188,7 +187,7 @@ private: //======================================================================= void GetCommonShapesOnCylinders(const TopoDS_Shape& theShape, TopAbs_ShapeEnum theShapeType, - double r, double r2, + double r, double r2, Handle(TopTools_HSequenceOfShape)& commonShapes) const; }; diff --git a/src/GEOMUtils/GEOMUtils.cxx b/src/GEOMUtils/GEOMUtils.cxx index 292ab5c44..0b02a04a6 100644 --- a/src/GEOMUtils/GEOMUtils.cxx +++ b/src/GEOMUtils/GEOMUtils.cxx @@ -32,6 +32,8 @@ // OCCT Includes #include +#include + #include #include #include @@ -53,6 +55,7 @@ #include #include #include +#include #include #include @@ -63,6 +66,8 @@ #include #include +#include + #include #include @@ -427,6 +432,34 @@ TopoDS_Shape GEOMUtils::CompsolidToCompound (const TopoDS_Shape& theCompsolid) return aCompound; } +//======================================================================= +//function : AddSimpleShapes +//purpose : +//======================================================================= +void GEOMUtils::AddSimpleShapes (const TopoDS_Shape& theShape, TopTools_ListOfShape& theList) +{ + if (theShape.ShapeType() != TopAbs_COMPOUND && + theShape.ShapeType() != TopAbs_COMPSOLID) { + theList.Append(theShape); + return; + } + + TopTools_MapOfShape mapShape; + TopoDS_Iterator It (theShape, Standard_True, Standard_True); + + for (; It.More(); It.Next()) { + TopoDS_Shape aShape_i = It.Value(); + if (mapShape.Add(aShape_i)) { + if (aShape_i.ShapeType() == TopAbs_COMPOUND || + aShape_i.ShapeType() == TopAbs_COMPSOLID) { + AddSimpleShapes(aShape_i, theList); + } else { + theList.Append(aShape_i); + } + } + } +} + //======================================================================= //function : CheckTriangulation //purpose : @@ -497,3 +530,71 @@ TopAbs_ShapeEnum GEOMUtils::GetTypeOfSimplePart (const TopoDS_Shape& theShape) } return TopAbs_SHAPE; } + +//======================================================================= +//function : GetEdgeNearPoint +//purpose : +//======================================================================= +TopoDS_Shape GEOMUtils::GetEdgeNearPoint (const TopoDS_Shape& theShape, + const TopoDS_Vertex& thePoint) +{ + TopoDS_Shape aResult; + + // 1. Explode the shape on edges + TopTools_MapOfShape mapShape; + Standard_Integer nbEdges = 0; + TopExp_Explorer exp (theShape, TopAbs_EDGE); + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + nbEdges++; + } + } + + if (nbEdges == 0) + Standard_NullObject::Raise("Given shape contains no edges"); + + mapShape.Clear(); + Standard_Integer ind = 1; + TopTools_Array1OfShape anEdges (1, nbEdges); + TColStd_Array1OfReal aDistances (1, nbEdges); + for (exp.Init(theShape, TopAbs_EDGE); exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + TopoDS_Shape anEdge = exp.Current(); + anEdges(ind) = anEdge; + + // 2. Classify the point relatively each edge + BRepExtrema_DistShapeShape aDistTool (thePoint, anEdges(ind)); + if (!aDistTool.IsDone()) + Standard_ConstructionError::Raise("Cannot find a distance from the given point to one of edges"); + + aDistances(ind) = aDistTool.Value(); + ind++; + } + } + + // 3. Define edge, having minimum distance to the point + Standard_Real nearest = RealLast(), nbFound = 0; + Standard_Real prec = Precision::Confusion(); + for (ind = 1; ind <= nbEdges; ind++) { + if (Abs(aDistances(ind) - nearest) < prec) { + nbFound++; + } + else if (aDistances(ind) < nearest) { + nearest = aDistances(ind); + aResult = anEdges(ind); + nbFound = 1; + } + else { + } + } + if (nbFound > 1) { + Standard_ConstructionError::Raise("Multiple edges near the given point are found"); + } + else if (nbFound == 0) { + Standard_ConstructionError::Raise("There are no edges near the given point"); + } + else { + } + + return aResult; +} diff --git a/src/GEOMUtils/GEOMUtils.hxx b/src/GEOMUtils/GEOMUtils.hxx index d6b10816f..37e06bbf9 100644 --- a/src/GEOMUtils/GEOMUtils.hxx +++ b/src/GEOMUtils/GEOMUtils.hxx @@ -23,6 +23,7 @@ #define _GEOMUtils_HXX_ #include +#include #include @@ -89,6 +90,17 @@ class GEOMUtils { */ Standard_EXPORT static TopoDS_Shape CompsolidToCompound (const TopoDS_Shape& theCompsolid); + /*! + * \brief Recursively extract all shapes from compounds and compsolids of the given shape into theList. + * + * If theShape is not compound or compsolid, theList will contain only theShape itself. + * + * \param theShape The shape to be exploded. + * \param theList Output parameter. + */ + Standard_EXPORT static void AddSimpleShapes (const TopoDS_Shape& theShape, + TopTools_ListOfShape& theList); + /*! * \brief Build a triangulation on \a theShape if it is absent. * \param theShape The shape to check/build triangulation on. @@ -103,6 +115,16 @@ class GEOMUtils { */ Standard_EXPORT static TopAbs_ShapeEnum GetTypeOfSimplePart (const TopoDS_Shape& theShape); + /*! + * \brief Find an edge of theShape, closest to thePoint. + * + * \param theShape The shape to explore. + * \param thePoint The point near the required edge. + * \retval TopoDS_Shape Returns the found edge or an empty shape if multiple edges found. + */ + Standard_EXPORT static TopoDS_Shape GetEdgeNearPoint (const TopoDS_Shape& theShape, + const TopoDS_Vertex& thePoint); + }; #endif diff --git a/src/GEOM_I/GEOM_IAdvancedOperations_i.cc b/src/GEOM_I/GEOM_IAdvancedOperations_i.cc index 77310827f..9897b9785 100644 --- a/src/GEOM_I/GEOM_IAdvancedOperations_i.cc +++ b/src/GEOM_I/GEOM_IAdvancedOperations_i.cc @@ -15,11 +15,10 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // File : GEOM_IAdvancedOperations.cc // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// + #include #include "GEOM_IAdvancedOperations_i.hh" @@ -68,8 +67,10 @@ GEOM_IAdvancedOperations_i::~GEOM_IAdvancedOperations_i() * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShape (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, CORBA::Boolean theHexMesh) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShape + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Boolean theHexMesh) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -77,10 +78,13 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShape (CORBA::Double theR1, GetOperations()->SetNotDone(); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShape(theR1, theW1, theL1, theR2, theW2, theL2, theHexMesh); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShape(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theHexMesh); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -109,9 +113,11 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShape (CORBA::Double theR1, * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -125,10 +131,13 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeWithPosition (CORBA::D if (aP1.IsNull() || aP2.IsNull() || aP3.IsNull())return aSeq._retn(); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShapeWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theHexMesh, aP1, aP2, aP3); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theHexMesh, aP1, aP2, aP3); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -156,9 +165,10 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeWithPosition (CORBA::D * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamfer(CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamfer + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -166,10 +176,13 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamfer(CORBA::Double GetOperations()->SetNotDone(); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShapeChamfer(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, theHexMesh); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeChamfer(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theH, theW, theHexMesh); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -201,10 +214,11 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamfer(CORBA::Double * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamferWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamferWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -217,11 +231,13 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamferWithPosition (C Handle(GEOM_Object) aP3 = GetObjectImpl(theP3); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShapeChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, - theHexMesh, aP1, aP2, aP3); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theH, theW, theHexMesh, aP1, aP2, aP3); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -248,9 +264,10 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamferWithPosition (C * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFillet (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theRF, CORBA::Boolean theHexMesh) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFillet + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRF, CORBA::Boolean theHexMesh) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -258,10 +275,13 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFillet (CORBA::Double GetOperations()->SetNotDone(); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShapeFillet(theR1, theW1, theL1, theR2, theW2, theL2, theRF, theHexMesh); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeFillet(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theRF, theHexMesh); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -292,10 +312,332 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFillet (CORBA::Double * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFilletWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theRF, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFilletWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRF, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference vertices + Handle(GEOM_Object) aP1 = GetObjectImpl(theP1); + Handle(GEOM_Object) aP2 = GetObjectImpl(theP2); + Handle(GEOM_Object) aP3 = GetObjectImpl(theP3); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theRF, theHexMesh, aP1, aP2, aP3); + 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(); +} + +//============================================================================= +/*! + * MakePipeTShapeTR + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTR + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Boolean theHexMesh) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShape(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theHexMesh); + 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(); +} + +//============================================================================= +/*! + * MakePipeTShapeTRWithPosition + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTRWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference vertices + Handle(GEOM_Object) aP1 = GetObjectImpl(theP1); + Handle(GEOM_Object) aP2 = GetObjectImpl(theP2); + Handle(GEOM_Object) aP3 = GetObjectImpl(theP3); + if (aP1.IsNull() || aP2.IsNull() || aP3.IsNull()) return aSeq._retn(); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theHexMesh, aP1, aP2, aP3); + 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(); +} + +//============================================================================= +/*! + * MakePipeTShapeTRChamfer + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). A chamfer is created + * on the junction of the pipes. + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theH Height of chamfer. + * \param theW Width of chamfer. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTRChamfer + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeChamfer(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theH, theW, theHexMesh); + 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(); +} + +//============================================================================= +/*! + * MakePipeTShapeTRChamferWithPosition + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). A chamfer is created + * on the junction of the pipes. + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theH Height of the chamfer. + * \param theW Width of the chamfer. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTRChamferWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference vertices + Handle(GEOM_Object) aP1 = GetObjectImpl(theP1); + Handle(GEOM_Object) aP2 = GetObjectImpl(theP2); + Handle(GEOM_Object) aP3 = GetObjectImpl(theP3); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theH, theW, theHexMesh, aP1, aP2, aP3); + 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(); +} + +//============================================================================= +/*! + * MakePipeTShapeTRFillet + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). A fillet is created + * on the junction of the pipes. + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theRF Radius of curvature of fillet. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTRFillet + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theRF, CORBA::Boolean theHexMesh) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeFillet(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theRF, theHexMesh); + 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(); +} + +//============================================================================= +/*! + * MakePipeTShapeTRFilletWithPosition + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). A fillet is created + * on the junction of the pipes. + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theRF Radius of curvature of fillet + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTRFilletWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theRF, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -308,11 +650,15 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFilletWithPosition (CO Handle(GEOM_Object) aP3 = GetObjectImpl(theP3); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShapeFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theRF, - theHexMesh, aP1, aP2, aP3); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theRF, theHexMesh, aP1, aP2, aP3); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -330,8 +676,8 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFilletWithPosition (CO * \return New GEOM_Object, containing the created shape. */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDisk (CORBA::Double theR, - CORBA::Double theRatio, +GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDisk (CORBA::Double theR, + CORBA::Double theRatio, CORBA::Short theOrientation, GEOM::pattern thePattern) { @@ -353,7 +699,7 @@ GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDisk (CORBA::Double * MakeDividedDiskPntVecR */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDiskPntVecR (GEOM::GEOM_Object_ptr thePnt, +GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDiskPntVecR (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec, CORBA::Double theR, CORBA::Double theRatio, @@ -387,7 +733,7 @@ GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDiskPntVecR (GEOM:: * \return New GEOM_Object, containing the created shape. */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedCylinder (CORBA::Double theR, +GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedCylinder (CORBA::Double theR, CORBA::Double theH, GEOM::pattern thePattern) { diff --git a/src/GEOM_I/GEOM_IAdvancedOperations_i.hh b/src/GEOM_I/GEOM_IAdvancedOperations_i.hh index fde5fcfa5..b341a9fed 100644 --- a/src/GEOM_I/GEOM_IAdvancedOperations_i.hh +++ b/src/GEOM_I/GEOM_IAdvancedOperations_i.hh @@ -15,11 +15,10 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // File : GEOM_IAdvancedOperations.hh // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// + #ifndef _GEOM_IAdvancedOperations_i_HeaderFile #define _GEOM_IAdvancedOperations_i_HeaderFile @@ -39,43 +38,91 @@ class GEOM_I_EXPORT GEOM_IAdvancedOperations_i : { public: GEOM_IAdvancedOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, - ::GEOMImpl_IAdvancedOperations* theImpl); + ::GEOMImpl_IAdvancedOperations* theImpl); ~GEOM_IAdvancedOperations_i(); - GEOM::ListOfGO* MakePipeTShape (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Boolean theHexMesh); - GEOM::ListOfGO* MakePipeTShapeWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); - GEOM::ListOfGO* MakePipeTShapeChamfer (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh); - GEOM::ListOfGO* MakePipeTShapeChamferWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); - GEOM::ListOfGO* MakePipeTShapeFillet (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theRF, CORBA::Boolean theHexMesh); - GEOM::ListOfGO* MakePipeTShapeFilletWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theRF, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); - - GEOM::GEOM_Object_ptr MakeDividedDisk (CORBA::Double theR, - CORBA::Double theRatio, + // PipeTShape without thickness reduction + GEOM::ListOfGO* MakePipeTShape (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + GEOM::ListOfGO* MakePipeTShapeChamfer (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeChamferWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + GEOM::ListOfGO* MakePipeTShapeFillet (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRF, CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeFilletWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRF, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + + // PipeTShape with thickness reduction + GEOM::ListOfGO* MakePipeTShapeTR + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeTRWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + GEOM::ListOfGO* MakePipeTShapeTRChamfer + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeTRChamferWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + GEOM::ListOfGO* MakePipeTShapeTRFillet + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theRF, CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeTRFilletWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theRF, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + + GEOM::GEOM_Object_ptr MakeDividedDisk (CORBA::Double theR, + CORBA::Double theRatio, CORBA::Short theOrientation, GEOM::pattern thePattern); - + GEOM::GEOM_Object_ptr MakeDividedDiskPntVecR (GEOM::GEOM_Object_ptr theCenter, GEOM::GEOM_Object_ptr theVector, CORBA::Double theR, CORBA::Double theRatio, GEOM::pattern thePattern); - - GEOM::GEOM_Object_ptr MakeDividedCylinder (CORBA::Double theR, + + GEOM::GEOM_Object_ptr MakeDividedCylinder (CORBA::Double theR, CORBA::Double theH, GEOM::pattern thePattern); /*@@ insert new functions before this line @@ do not remove this line @@*/ -- 2.39.2