From 633ecb2c6133ab4f266d218ff13da5e46310c90f Mon Sep 17 00:00:00 2001 From: nicolas Date: Mon, 25 Mar 2013 14:32:53 +0000 Subject: [PATCH] =?utf8?q?Suivi=20de=20fronti=C3=83=C2=A8res=202D=20sur=20?= =?utf8?q?des=20c=C3=83=C2=B4nes=20(suite)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- doc/gui_create_boundary.rst | 21 +- doc/images/create_boundary_an_co_1.png | Bin 0 -> 24514 bytes doc/images/create_boundary_an_co_2.png | Bin 0 -> 24414 bytes doc/images/create_boundary_an_cy.png | Bin 23041 -> 20877 bytes doc/images/create_boundary_an_sp.png | Bin 21176 -> 19424 bytes doc/intro.rst | 3 + doc/tui_create_boundary.rst | 25 + doc/tui_create_iteration.rst | 2 +- idl/HOMARD_Boundary.idl | 9 + idl/HOMARD_Gen.idl | 8 + resources/Makefile.am | 3 + resources/cone.png | Bin 0 -> 830 bytes resources/conedxyz.png | Bin 0 -> 861 bytes resources/conepointvector.png | Bin 0 -> 863 bytes src/HOMARD/HOMARD_Boundary.cxx | 63 +- src/HOMARD/HOMARD_Boundary.hxx | 7 + src/HOMARD/HOMARD_DriverTools.cxx | 4 + src/HOMARD/HomardDriver.cxx | 95 ++- src/HOMARD/HomardDriver.hxx | 2 +- src/HOMARDGUI/CreateBoundaryAn.h | 945 +++++++++++++++---------- src/HOMARDGUI/CreateBoundaryAn.ui | 863 ++++++++++++++-------- src/HOMARDGUI/HOMARDGUI.cxx | 12 +- src/HOMARDGUI/HOMARD_msg_fr.ts | 158 ++++- src/HOMARDGUI/HomardQtCommun.cxx | 4 +- src/HOMARDGUI/MonCreateBoundaryAn.cxx | 464 +++++++++++- src/HOMARDGUI/MonCreateBoundaryAn.h | 11 +- src/HOMARDGUI/MonCreateBoundaryDi.cxx | 2 +- src/HOMARDGUI/MonCreateCase.cxx | 3 +- src/HOMARDGUI/MonCreateHypothesis.cxx | 5 +- src/HOMARDGUI/MonCreateIteration.cxx | 5 +- src/HOMARDGUI/MonCreateZone.cxx | 142 ++-- src/HOMARDGUI/MonEditBoundaryAn.cxx | 135 ++++ src/HOMARDGUI/MonEditBoundaryAn.h | 8 +- src/HOMARDGUI/MonEditBoundaryDi.cxx | 2 +- src/HOMARDGUI/MonIterInfo.cxx | 2 +- src/HOMARDGUI/MonMeshInfo.cxx | 2 +- src/HOMARD_I/HOMARD_Boundary_i.cxx | 12 + src/HOMARD_I/HOMARD_Boundary_i.hxx | 4 + src/HOMARD_I/HOMARD_Gen_i.cxx | 331 +++++++-- src/HOMARD_I/HOMARD_Gen_i.hxx | 6 + 40 files changed, 2494 insertions(+), 864 deletions(-) create mode 100644 doc/images/create_boundary_an_co_1.png create mode 100644 doc/images/create_boundary_an_co_2.png create mode 100644 resources/cone.png create mode 100644 resources/conedxyz.png create mode 100644 resources/conepointvector.png diff --git a/doc/gui_create_boundary.rst b/doc/gui_create_boundary.rst index 9fb18473..1fa7c415 100644 --- a/doc/gui_create_boundary.rst +++ b/doc/gui_create_boundary.rst @@ -71,10 +71,11 @@ Cette op Inversement, une frontière peut très bien n'être retenue par aucun groupe. Cela arrive si elle a été définie pour un cas précédent et qu'elle est sans objet pour le cas en cours de définition. -Il existe deux types de frontière analytique : +Il existe trois types de frontière analytique : - Cylindre - Sphère + - Cône, décrit par un axe et un angle ou par deux rayons .. note:: Les valeurs numériques proposées par défaut tiennent compte de la géométrie du maillage. @@ -100,6 +101,24 @@ La sph .. index:: single: arbre d'étude +Ue cône +""""""" +.. index:: single: cone + +Un cône est défini de deux manières différentes : le centre, l'axe et l'angle d'ouverture en degré ou par deux points centrés sur l'axe et le rayon associé. Un nom de frontière est proposé automatiquement : Boun_1, Boun_2, etc. Ce nom peut être modifié. Il ne doit pas avoir déjà été utilisé pour une autre frontière. + +Création par une origine, un axe et un angle d'ouverture : + +.. image:: images/create_boundary_an_co_1.png + :align: center + +Création par deux points centrés sur l'axe et le rayon associé : + +.. image:: images/create_boundary_an_co_2.png + :align: center + +.. index:: single: arbre d'étude + L'arbre d'étude """"""""""""""" A l'issue de cette création de frontières, l'arbre d'études a été enrichi. On y trouve toutes les frontières créées, identifiées par leur nom, avec la possibilité de les éditer. diff --git a/doc/images/create_boundary_an_co_1.png b/doc/images/create_boundary_an_co_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7212cba31f1a584a8e2253786a04efbb64cc44cc GIT binary patch literal 24514 zcmbTe1z43|*Y3Lj1*9beNf)A&bho5*Bhnz<-Klh!NOvp&De3N#mhSHEhBN)Y-+Rux z_t|@&?>fM>Kv?Tp&-2VV$GFFD+|yur*$?O_geVXQ1YJU0L=ggkhlfDm+>pT|WUUES z0KOsE3rQ#=BO}i)%PoO_zH|`%LS9x_u{=+Xq60ZoEUXO`{PMFNc-NoDmt|LQf;jG=R-qQ~2 z_L1BK>9Ogk^x&==IkVx=$*#Sv?Q34~d*ti-ETYfw*}+zG1yKtJoSP+$yz{t-j3Ht) zF-=jb^0Y@AN0$8)Uu6pv@@kSEf2^6(N&JyU3D6@Q)Ozc8v)k_t&OkDgw}JD>`zhNd zSphDM(Bob66?I^0+U1VC5xMgzvY-4>ffU^fYXql_y#+t5;^36NMzV=+z0Qs_D<^m~ z7WI1dJ?@yS1)@>Mu;$T}GmT~~24a%6(>qkQx)+m3Hr7`Q!~w(00`5V{!V?AD{~i20mK79zzv*EK8BO#9ldT;*so*@N{te*t~x z1z!|uX6^bjXA+4&w}ao72)4H@GXO3(Li=D^&Hh@nf@d^PU3_s9%L8inYOjT`%9 z9jol3@G<0}R-13d&S55Q-E!3)_Xt`=&$}xzRa`ktc2MXwwDZZaggD8m388*eiDB>D zd`JcINQh0te1oN^ou98SMq_n*L{CWuWprS^?2~4; zc1o)8Q9<6SgTJJT{N33?wj|z2MdfKtO?q{qH|Axwv9+0Mi+T^{v#o;--M+ji+&K5m z-s}^?B&(`KNxb9zX`;Qpm#f-}-uXD?uThS?#t7KY^J&dHnq6Gp9gec4#;M)2yn zkfz8VT(CfCXoh`-Qr?cNs;lR(_28Yge+c);{AHb?EJ&mLBoHAGu}fK9q1vb*QVRc} zPTzl$bOQ4TFHU9ra1g70W|lwyr(wj%r`AIH`8pkL^BR*4MmbD(!AgLNOeymE#Pp*^@ zI?RpxLw4iRwX4gmC6|-=c*O(1R_a6}pUM8RIsL*tO~~nF1Jm&A{IZ1M{mtW=>kY>6 zl`ibs)TfPVL!GgEI&tf>9R7SOuA+2i&Q2Wj;ey>{u_T@%7KH~PBX>yNhbt~}Kl%mF z30Qq$&$R5CMR&t_&adx@oKCsC=gMWu66AgxVS9BBLXqiqv{esROQ|FC-y2qB6wkaF z;+-#Ta-Q$c`CmHC3}m60uDy@X`LUo$tl|7KYM$~}xAV?{Kz<7T1l`-V+dkCX+oA6r zA}-w`E~Bj64hsDn*ULAf-l;B}KdXgLW<4jxu4N@^i@iQ6yen4Y9o#){J=h~Qio_~A zWJWbS9c2|FP-JHbslZphsu7Zl9goi{4>!~LFob$)X328yoSIg*UEtH?2;R5WaEVW{~tc{$xcv5(NmImFeu5~n90`quf;kEAS$l_!_ z!P09x^~Z}0%f~@&KKr2R`u5m@o1E9RR(!Y76y&|lMcK_lbuq8vp5&8@hvYpM!bSQZ z`R1dVSg=%Zx7D;s>Sg8T9aJ)= z9bpfXb8ZIwdaSB)!jjOR)EfhY&=uXOtM~YR!;dHCypOzlCdG+v6AZ$e+-wG&t?ADn zkwcue7o6|Ct>+nvjvWqu@i=*4Vg`2OIhr>$9W1TO$$MLt?{WXRWA$MS$pU%$SB{^O zjgq>;ygVJ0D0kvXYb>p;0;XDzNl0GYlVHvx)0UnzwgSz%BND&4-^SRa_>+V3v?}PQ z&!Z{)vFxfhU;BZD6685K+KK{oD3|AL>3hrGHaj%hl@!SW)7dX_C4_l7k_Obz96uMT z#E#S9hxJ9}-IC_! zKA@aCoEMu5vm__e71q{m|MY>PGa2xiO^&uydf)45dF4}N6k6`NSd($=79g&Z$q^#n zg#0epJ?AK|JuejN=C<4qK^Phu%$~e>+#uHEhihl_8y>VS`BZ!HRvaatjHPVb)U@hH*q0ejS?Nvo0===By^Z)P%4oTanUGN#7V@kU|&78OEVan9nnbl z@mjcKQkNNF4uQ~)^8vY^2?{keHdI*~wzXq|S9UI0DRRE)jw~ER(YtSbVY}U?bE6`7 z(P+#WVOWAXJ{3QLJkCM$^Gfr~Sp}WO*}ch^uH?!zH5MHcs;p2l*3&+MMrqdWBNnG_ zKO7yNh>5hS`$x$iKbF=PuEq|ke#5n23DKZmX72s#lBe%(EDNMrb}K4rF?cCMvIzT7IR-E~ z8N>2S(c1Yv>_4r3*JKQ?FL z+EMsKM_e%|%Op3%;Iutm;bG6B=+Dr1WhrGT$}{8xJ=K$nnURo)$i0uW*Ry4Kv5BGf z52-2vSn4N|k@O!miQxF#hL}9Pyfg74#e#hGkfFh0SVx?Pk(VDC=%ZtiGp%Gla-d4t zTL~z7qi*U_p3qW%YQ6;X?f)bm%67gb6t!3pwC6b(`mYjwSdyvHQuJh7*Iu zT7n}HgWA3QFp=E#^^8?bf8(ZbrpjpNkeknOwAkkh`baZrav|(XE^kVGO05>1SDvo+ z!$*02bIaUU$oB&sTvNS7Nm|`zR;h$j+E*+S>C*WYRQ2`SWWEXZf~d~-Z7C!(+|CJm z+kE+&nT=&zSF9QGijvq+KjdN`3{pvjpq%F<+yNO_63~lLNbsu|qS$0#%jg<2*_#2; z)jDg}?8t2N5(U9IJdUj9^fBX)vE{x4(eFSIYGmqP?f(sx{91SX<6##ymo?l5qiQGF zovdkQck~j`gc$KN0e6Dh$-<|S^c6&CQJ+tQ(*zQ;lnqAGRm`k_SP%`-w{2s|CeF)_ z&ep1xM3HQGZXNC^l+mGYoHIuY#2eRxKZ*woSM83^yALUwHez}EnrnTn_QACJ^(7rK zA>PtF@1b~9iDMsyU#5$4-8bXqva_Wt?~_MxMfqtLE@Z_qodYRV&dDAY@eCI2*HtI02VbtewwvL%om z{OEW*aV70jrb9+cLnDTKY`e3rof4esX+roMmz+xEPtdFA5Hq*@tl`d|Kj%=OUo?_) zQ&R~9<;NYdgEjM;Zn02YnEgXMw`T|Z6MtBLn;erGXRttV;Wc(Q_uC2~d?u(cQ~kA` zb4qzqV%zB8=3;wCQHiq1{F{Qe(UJ|Ly9O;K&n}YO12^j4?7;d%EY1GSD?gJYubZEO zomI(uayvh{ra-nH2hB7{ zx!A&rZ)f{WbZ9Cx*UgQa&rO|ZYT)A3A3^p}JMJjGo?lCg5p7)3!0khjeJ6{AuW~PG zQfW1wqhqBtm|!(4J_*zDd`!4=Bf@TfMLwg3s zs|K*_hn;Dglu^xr|GN6Zp}DAns?0=j>%SL1h(hoOiynWnob-HbG)fV(&kQ69oV>Fv z6Nf#?TAv}6XbSKqAtla!@?dsGILUN-zgZuesy_RvgrG{yi1IbZoCwdw&~wgM&2G1t zK=gHp2=YkPJpWZQZLfV`6l+lq*5)B!i7O22OJ*PD`g&YEXHbr*hyt!Clu&^+oGK}g zN?kN2(p;H24QZuK#S6ksk>Z;wi<}>eP1IcPUHM~hWblT|dghC}mp1OlVlt8@|JO;s zj$4okp_S*K*RLOpCr$hqiJWsDH9C+pDJ2JE-5M!9YLG{eTV44e+;3yD5>Fop0xbOQ z*cU6>wRwHY?-;PYpnkz3H_7q5{ zkVE*r*vzJ52+HLIV(%8T^LX|6pyxNPIv({C$PmbT_e9*({=NNa>+nXKA#s2YhSOf5 zfofdTml3?=1$rBJ{KSfk0Dy0)^@ zwrs_H@_S4* zdp}yvR-GR%E(R4LKz#5&%wiT>FEk`3Cle79TXf9a`Hwm%B6r)S1g7)ZJ8cf8)?ePHoAF4 z1nV@0!Nko-+fc@kD{j{lic`fFd=u%d<8xIV797+CjZ)89C*cq<)jo_}Ff!_I zgdredfcM#0kJmB6!NI`>uq49UnU{@?jR|^u6x}XeCz=0ypl_hRKTMmL1P8}{|E6-$ z>z0n1I=_~&rIqt4-Gx`%%j@BXLiUwM)BB_9`C~HgJ0`0+PIlY58r#RKZh@)z(~SWs zDXBhijIb~fTKfv|-P;<;Zoa=rzOaLXWZ1hD z&mO%dC*RxO2fv$rVbAziimEFU6u0*GK&w@mUj+E18sn&jTDjv)oB2JqOw*WAE zdAPa3Bh=?YS>tB+&zk7Rw!AE4|BvrlV z?L|&b&IG+JxRiJmu9FJlt2nt*w`XBn?iZ519IJPl4rS66qY zsbaHOJ62W4GwxMTLP7!(CaH_Ndx>^ql0-VcXPpRnB8#!Ct*tGX!7(v0Q$%8F;N*yS zU2G&Io+W2JgyIf(lIy*IVh1P0qobo&RaJGFVL%`aoHGQ7W6f_`yxbwsv25eWbh(G0 zl=k+cbZ)ER97aQFbhs#Nf54sMaX!%8zuURJ)bEbimY!@s!U3dkII~sm?4O{vX!L%j zSsjJ!DFpHzp$)Qk1_xrCEDGHJ9q{&_@=;eUnad2s!5PSZ zKJ$MO8d-W%g{XU}^Ad_WLqa22obe!#)bGdb?m7}CXX((wK0$!ODXdL`H3`2#45O}MK0>km&i(uhtdRFee+~fZz}GnPm4v!)k<|+ zTUx%vzLl->yseV&8$E$3!DLBrc}<4W`1XFOzsuDwggp9yud-$Ra(Y8k1JonT4AVND z_sx(;$i{l~>knNKB(n?|>GD+I%v^Q{s^O8IG~G|ks;H<~M9T?WJ8VT|W{X8|dq42T ze#QFyy{%zPNg`adVk&CtQhzxM71FX5MvVBx3`E(Hc zCB#0#4z52MhkUX`XQ&~$g5C7yY}@}5mBVT#;Yi`@`@Wm=T}rv66rCvRH>IEB$3Ih_ zs|WXW$VsN>>`Tp->iLSXZz!0oFqhRx_kW{tRgQ^{R-mCb{EkgZs_oKj<1n?AQz@~R zVwyBK&^Q0fv2Q~r*>O-r?oB0rW-}E2%PV?*jK9NDQ<{-aizT#*Z^h;LKq!QaNBroT zzM(YF=Hj;HCF$HH?o8|K@&7g9{)?~x4+3@ko1 zXV%mtP)OW!C2qIf`m?jM_xEY@xzE?Qwu9pp7t?c6CFGa(D4msFWxjv)O5#_&sfEjrPVB3Q}@RE@%jy@vv+;8o?qY+*w(% zTj_X~DZjP4y1KbJsVSS3cY1O%$2X^;g3~V5SrjyzSjY12oph%B)wxv_;X5a!A|!kH z$kiI4h*(u6&P9Rd-#~%02+z1b-ygjkoafmne#*%IIvrQ>hn^0-S{((*8T+dhTL~r? zMIbf>1O!x6R76E#y=8j$&SEt$91jn#v$Jy~G#gJH5tFq4`)A{Yzax5leFvUeq)~0A ztil5m3jnWh8W9da8;RAS!d+thVhf}csRBvqR4?Cu1jld#)&^+#um{jQ)Wmgc=a?fvov z!SGMB5qNKQV@;1a_roT9?ssD|GwRs|gj{TShRo9i1R%b=>H(Z7jduoKiPXxiR>J6rFH8pxB z;+`k(e))po?McuEVSLR=J;p__Kl9!`K|^hw>y~R%9cKwaZ zQvDtar<-ex4hnF+m?9#aGyG9C2gd}un6f@=X4VZ(&Oj?xB!$W3fW*+Z0 z@4~28!>|!W(#UNSr^ZCXdXD%Fv>I%VW#6o*@zg(kLiJ3tnA{L0>&RB`!nZp&H+>+L z2fzDx^Jm;3zl4lTqmqsBf$Va#<MhvREpf&J!ftvrUe}!FjBrec`U!$5dLg(ki_3EGkJ+ zMVc7J0&)M4HExIMN^C=1gYo@^Mu%<1eQ}$|hkNv04$WFSQTlkKr%y$@MLvj#R1~!J z#WTp=a$4Tko$pSRm}@D?6IizKDP4n9Mworn;I^!F*p z2bGuq^8NaCteTIwyS=>~sHi+qnNc;7VhR&l7(IXXT)?0mO2R9Lt#L~akH}tgPaW6A z--CFY8Zs`Ti_>ATlyX*!O`fwCmX~C60w;&BmPtOwe+! z{Tf9rp8wV4TOoyAmSA2%e8CP89&t6Cz#5y!%{C0E!R$SO&3hIKiZ#WFTzCIV{=2Pq zVI5L4;Y$6_`r1DTh6DHw;^N}8dfd0B_@cxrhDQqhj&2U>57+E!)5t9e0wD?UriZwS zix*Sd8_a#{DEToKf8Q)lgeHDciZBNy_h)pJ6tce``Lp}JnfNMeaLPc`tslGaxt)p6 z$0fzZv6-z=g=8h5N#@$gA7!irc3M1-h6SaH%gF4{!mO8kT9jZ(q)8X0Tgx?Ns~&FG z77Gn(jXkZtNJvjHcW8D(unIt)Jssd^tapzjW;)p!FSOjw{$5dlNkm9^AmAo>yqAk2 zM6No{@q33b#}WOH@p%mRnz=#Dm(GjfII<+RJ2}9`!!yNYprcD=_e?4;XGtHzL`T2h z*)5s+2&$oJSo{!pYtk2d2B+rENrM=skFuk~1^mj+)km3ezCk%AUvpF_!e?FQ8g6T9 zYCg$5-?#0_!Nm3mQkGf*q_#uS8Aw%>SEwk4b?)qs{HbzFvDkJ`9bFe{Nu4znjd41a)@s=RioE=f`@n(o;foS2!sh&Gycd#@i}@--A$KU{x9tUV(z1E?%-eASyAkg z299_qbtqp_`zr4~a9GU^Q<381U!K&&FD9N2*5x?;$)qf45+`u^Mz4Xe2Yqi!|@8=1M?;`27Nj`uhc^0mWO2 z0Du2^+6E50v7Qb;5%&2b{wFOW(vFrHwfFI92u%Kp`Q+4ig89fHufR%`&k1>}!kV8Y zj(5K)=vmm|jg_7d#kpQdO%Ol=s)7<ULLYVBdNsp?e@FNJ!x@I_~b11TgXCMP+1z7YiA z;1-dOOl1m0zPw1~u+8L_9Tvw9r^)?B@l1rQgo>^~^@jp4_gl9OB9;=Z`j0LpHXtf& zJ~&74HJ&bfy-X-ZcB2j&D491Ma1^h1OhP;-XvvwHp6*?@6XwSvzB!4?_V!a2?7=ng zl^%bkBw>g$B8BsZ|C)xE7Yuxn3R`b)FPF`c&-+)O8eD8`e0+SsC6|^mo_7on%j4t6gSs8rUxzkZ#xu1cCC5xEvsC=?f1D^Ez|{O(fsvo*_6p2+?AEE?zM&z}{j zJH&x*1PdU_1mzc_S2#WTW5x8YGe3pK;b4QsLW_s;5*m+nA|?cVqhgmte$HTPd$!^i ziCwJSSfH365*i9B#lf8J&hGt%N*+(0n_ugF>f?S;;Q$Z2Bb;1CS6%P&bZA?9d$q;1 zqN*z8i%@<2&l+rxFDf%Ji;9X;EslPlC~|ei(MQvK~vw{(*^-hesn*er$5m8$_cWck(LQ01T1>7<_<3kOYqm!ffFA`METT zAXb1T!PQ3dqBt>pp&1cP!7goqxw%|pDT?YAwJT$e``7II*0t)`^lr__DB+eJS|Cb({DY&h>40cacsW{cjG|RO^X`G zv3r*Jt&#xoty~)Mqo9X}WAs`y(XH%$3A zRa}Z9HL~dIOp|ZQxICXmfZ!+W+-zVm?!F-Lyt_d|A^qmce!A4^yQg92Ki6FHn6Ct5 zw_M19&4638%`M|AM)rH%?wnv)lZ@QYYOY2>KF=h_Z;0?4x}Ex4)#oTL^P|`tGa3Y; zXLrlDWDX0=V{@DUEtwk`<$)`@KHaRgn9qXE>`w?l7^SZo;o2khUILw!C|w*ik#7K^ z8m!VT_-9oLI8#M`Jp!33EJQ4!(L8|2WKOfv0bDpaQLk`$p4_%TS-_XcKVPU?(!a=@ zXnIliql+(3R#rCM^Fb{X&%Au%0{Tz&IM7rD)AoqBwv?mF$x#%eG6WCUC`s}PxcM;? zc7&1*NN4A}*{&gb01tUxug5zMx`ME{gCD5ClA2d8JX1T$`cIzr_xHy%H^Fx%%2h6i z;V4);r&05j{3u6bh%5L?WK^h{R<)#o|J*Tk5jxC;;eNJveA=7NhK+tG43X|u)_djP zvPE0c@D;1hX8G&QF}~1`T46>tePMkWYME%NV~fBmP&>@ee5SYD684ifFfcecADFay2tg&Ofj5tn&iZ_y{`MP9tsnU}zpH}X z8e5QiG_|y@J-lu!oV^2n!p<{|f>;gv#)by8pJIUrUF>IIlw#k?&`8KJyraq`af_wl5~ZRRl2D*1{;?btj&Or% zV{5zpdGhJO8eFPRueZ{VPML^GYHFyd?2opmSWyy^>I35=ofevA_Yw>{t+~;lK z2`Ws*)5Oqlyu`b?_H@H2Ww2*xD4yyKg}p5Htp?f6)zy(pQv5XBmW_6X4uPYcoqDrg zorsGCHYX@cQ zJm1`h2x8NNItOur0H7PuF<$a=8kE-V!uy!Ej&?&JEm?vDpdt!I)B}(22>n2nRce9- zIQD<@59&nV{#vIubrm6j1C*Oc5m3=G)Z1T1j1&S;pK;$R0sTK7@vSSep`=|1wb3p7 zzj4%3Er9@94h2j^CY1TcLhW@xWX(6n-cR<~RA%Qp>=k+YO&7J93Vnhwd;rbTjRkL(~hTVYHBadKZ3B~HOSTfFZA@j z+i*>)Lnu?83fJrS8b7((f|ScHCp9%yhpag@pC|DwBqXGI!GqT3{nD&;qZWwvluRuG zOFhxA0iD{%AC{xS<)`xoXFCP})y3X)JAH2L*L1Iw?O~|!hj3!YhdWokVC-On)~`GA({3Gg|9ft5Ib& z-C$at)&V%tC`^u_L8r!cv(+Qbd&+!hsSX%Z5$60))ri|!B~*}R_( z{c|cN{t_d-Jpw4uj{G_ql?74DCiaZxX*f7IE-o%W<1CZ8e8b_2I*A`vIb}yH(nS8v zg2wxHq&1uMJZ)`{6T?_~se2#qH=0dNO}XRyG@)Cc5a2=62XstlN4(8Odno;ZP7}&> zIc&V-zd6d5il=8|XJ4pyw%(4(m39*s7k6`W6BZU$SD%T33ZGH@D*uc|%9}9I-ZcJM z&`I6+^QTW!T{1+V$qVF7HvWfQi7@b;YNx1rQBqvIhch*E_-QdV0)(6Dbs$`=CVhNg zdv`#0M;C?1x245N??Hi$CzvQke^g766U+RyZ^<66tcy(CC(0a1@v#i0GI3P?z9HLw|M=(xQ>IoWdr;0 zTt4Q7JHm_gqsc%h8bmjddrktHtwm&lVc#Am(JXqG#pSif*#WvK-G+B$vAWi&VJQTr zXNk=w|HWvAGZWWf>j~mEJ8RTR{dfNGfZGg@BvPQgni7DAyhnl?BKrRql8g$hpYKjW z(OgucPy)RVx6FSAl$~6C#{05$WZ?D z!~K0e`;C6nQP?)M-BAmuKQS-P4@0p~Fi-#}wWO!KEp}tS7d=a0bAJKQ^LyB2vEC~{ zxBfEg?YplYagyh^MT?U^)!J82jRsSuHS<9Pi2thnS!z46`KJEk$BzNHBi7*A(7$1) z`l3nX-QRfvWzjP>=J>o8R5V-la4GO;_~#9F@7JfOh=>>|thRslXRG~%^nAP_GNWK9 z_sC*dKoA*~<0s)Z*!mHjJ(w;q^p^SYwck{~MfCqG;u!Pqd|r&)$5Lemf!K0}2MzfN z{FnDFvdB-q0*MT2Vy02BYVzdL|8ik~BA=1H0ne~aB!E)Tb1*pfP0%HC zSbj_|a(jMm_@+n(1rrm*1Ws-Xhd(nEe5WHV{Nf<=bCboU;GUcvS!lEZqce!ZX48KR zk)deqXU5w9S(>3Gy2{E9e(^pSRH=51H0{5iU2R7KW}9~0LQ+^Dhq0M_|e@|uk)zxA~IGgE0ki9y8O-`Qz+eX?$0KS!;L^LGgf-XW14-q+|ndVveP*=)Z#i5?gVGpCP-Iy5{iA?kj2bTX?VhN}zxbO^37#xz6qLi;6sr;~D zJM1d1_?3?^xD9pl!X{A*vF=EcK#<6{=K7EHvG?xdqj6r(dT$5tIG*7CU5PN`wDj-# zM~T2!epoeu6*sgL}fG2D;r$EvNtejQ_vY2&4kZhxjaWI}v1rhL&)!OVVq_Nak)7hh7_|3?`7r!w#fDG3GB0fiOl*d+B|P zON|?l4aC5-RGHqLERK}V_quurEIn8dvW5nZmSq#VMJ)UaBwlN!*z6YnCrE64OD-2( zBW+Q4jR2Vm=W2(P_o1SowArTgt*>wbE%(OY=-?0}QdJeF`Mr4*tsAx!PNu{3Qws}= zvo(BI;8Ng>xICD5zm3?3LZMwIej~ib*2*d>64bQxIz9FWj=K~2pc5Y|LJsCNZmrAm zN`E5D<9)h!puhji+-D#M_E-cCO{+}{3JUJH|0nx1FRM|^|M|m1Y>Aych~fKdGoV-pl3})icN_dhlGrdQPkR7Y&%zLZ7kkUJoejClGyt~Iczx2;)Z{f?p*TEP0J?yl znpzJvFE8(6f0P5rn0zHMml*YA_f@N9VOpf;5+fCox#XsEgR2|!-JpZv7SdzzOUL`3 z&C}aWObpT8P}Df|V6j<%-Qy?d^9&?&u%!POQ&CoKxZX%!m~Z?LLEs9++{fyd5M8T{ zX9)eRC4-Hm5v%z0nkL6sSKjz`eg|GCcoM%2?B4V`A2+(3E(3Rfh9-E^n~h{^&=PCU z3;K80OQYOq0MyF!b8}vI%O5t1^gl$RqmoR34s3^CM`>v(0H0zJgoz1JJ>TCbcbw1d z0=cFgUr|g)@&)V94mu_#rmE`X$Mdf1pM^q~3zA|iNYEY*KznI-vL?Ytr(S6`4tx+Ns3)$PX%`;!*6@aw-?7uM0s3p){f*zeG zdk;@op)(7qsOnIvC<;wx{V@hgO)^(ejyf9F14v>f1E%N2wXw9Mm{=Ex?hWy=q3wkO=xcWt`45E5EU-3-%Fki;-^zVvnojI>v8QIA+jPG%3vwUS52ORH zvn`!X{|XI<^WWo_FB&MZkYCVg=kTTf-N2$z_cPEra=P3I9}lmxY8fbg77YTIG=iuK z_Fm5^o*|0gJ8rdirlOX@*$vBTmr#Y>s(m_I+EM$GoEm8lp!hy~=mxELCTd&Sm6(Y) zczo~bR9zye3I5%R3kE&sEAVlBy`2wu-h1R_&W98ZlV5xpsXv-^4Gq_QyWb8u99Zr`$7&w!dY91EZr(3eE<|J)rxVv$yJRWo1j1Ur<{sq%Ok%j~c< zEQjHhrA&jlC%|YiRk~?jhhbq2$Po+m6G4JMM2mNqM8U$kDwe{cj-H~9mReekXNjLa zUMi2skF%Mq6l>Lk{z8TGR(B*>I+HzO`QeNB;6=CHqSZwbYpdtJ!ie4g?gOq7>zi)U zOhiiB1PnoSb=+m2h>37!lf)1p+Q?u@Wwr}5Xw{8rq7m?WT$QbMC(+*aHfLtUeW`hLv{T@*Uwd`DcVNKs;qJPh`eEGs<4`h>^-)Ia z#l?lU3Iprd!oosVSDyFdgY<8(Hdt6#JUu;z(gm6gcVE1A_(B-I5Y@N7!}MOx8u(nY zGo(kvpQW==5v^577Z)Vwy~1Ob%zcF$?)PunQz3vw%;)CN74~wk56r*(bo@W1rlWae z-d7{dCEk`=bdfMuSKaPrCvl3HjQFovd19iVE0cQH8bw?YAK zIE|^Nza$s`Zd4eB3U069S)`-m)A~zgFL#Hfh<$cG_X2$7$GXuw=glEd#R-{!x~trH z$OwCNCFy`%C0|)vTYCrA_HPhlmc`$``ADxq5U>Quy3Idh!Fmh`ypj6<`5}-kT3F#e86{VPU8Lb;!-dRfew)fsjN` zx4qvw8U{@LDb!)P?dkbz9lxlwNOT+`L&&$-J^u{l% zS0FA*{uxC@l{5`p$dUAFXh|dYf>B|sj@k5d!QCSPgzQkZoAtQcLHBhr9Fl><@@S3n z^4G4avAOx|{pDi23vY98?18u;K>*V&ClOJyHh&{LJbazQHaRYemX?-`lFq1^iuETo zwe#IY>w|{cmoS!-)6+MS5~G(tnARxloa|2z=j$&4H}drGs2JJ?UEuaRy^KmuVvJxt zcJI68ncUFZDH{$Bj*WLA!;(}xG_(a_FXzj$r!~pK@Y%RI)JUWf|l3$pW z0*wM{`<9mX3=9k!8XBh)IFKXqT^HaS9D5Xaw3>B&97Jko1O;s?)E6lbjon!b46|0G#NF3(Flv2Al%5X%y;;GDh-+qBL)rv0YN|+ zPU(K)b3rWbQA-O8&~2HmW!?|))n#pZ|IQwZ@Q0E=oL^?%0LJDLamw_L4Y6@#kB{2c z9Q^+N{^mfkvA(_%NW%{*W|+i&dIU(1=B&)Z&&9IUK5e~Xm4=}p5FqJSancWV+G>(V zcXW2HYY%}&kj+dJtGl~<_+4dXWm#F-WU)38F*7G!5w$NhHeJfai>9UdljA5-k9<4}vl=?A@rH-=`AXaHa0=w;f5>;m4d|Z%Jk!z9F(mNVP+Tng_k39C z4fX`5dK1=iqKb+v-P~^GoHs~sc7{Q@b+w+!07kx|oGDO?l$3O~+B%YeEIJ{IfSH1V zh6V+CcJI8X)8yd_n#92NBK7@U@8Iu?lM~7LI6`dfEbCT+wy}uT-@ku1G&X{Y3)u0% z&%iz@=2Z4+u27YMG;(uwwcUtOG|OMVnhJvTXkQ2T3+U=&>3zs;7o+m)9zzAu-`Y`M)J*!BJ<3RBbk!RPR=N4LUwka=DzX%Qi#p=s8b zEawErek@k!(rtmHx^@_T4#@%>>N|r5DHH$a_AYcFP3;_QJ8Q3ibqs@yD-26gT0ATy zgd1oC5a(6j>DVr>Jmo_*Ebd`SCXVj|+e)||J}($zps<2k92hs3ZN~l?wK9z*-z+4= zjj@u>k+>s;wx~?u2vVNktH%l7HW0Bh$%{9&f%{Q2zJi{aIcEBtCE8cvEMv=|%hcG| zn2%*7f4h7;J$qz!Hd!JaNG#9<{SZ#*k3~aAXKCfv0tPi3vu&`$FFr^`5-&i{PtrNv z=s%oT8zCO5E&ux17j{|^n9n&3cxZuen7dn3Z1^-<>Tw?>$|_d z2i3+{kp{)O;Mq#-#)Oc*0PW^(E5tawI1nDj$H&8C@_1Z<^X>l;f~JK# zM<;y@u-sgU+&{pFBPu3lX8gB{3|yMIil$~}G|6Bwzlh+Q-kHQkkn5}BtgE;j89=Al z$ROyp-S=b?z7HEc4HJ7I5p$NF;A*z{CEC_`+;R6ahw!-d9ry>`U63Z6)1UiUZk&WGIG-2b|@`qhO%T0{Msc+U*Y%yxFz z3bV7b7hO)ngMxwteG#F4U?>cGUYPW3p`fGBS6hSD*k>g)GI62I(wrQTO^qQILX9V{ zM|1v}-+<u2JUlEM zDL+`iv`|{iva`4M_4Nflhj&W$fK1QLX(Dj&3X4rnSZV+cdU;nvDXP#P?A4C+2MD;p z$Y=4r20NuR8h)_bBn%#th)@J|k0u(%i_mfCHDM)$&kt zzr6kc_2X2j&i`HiBi1vNpdq0m677Jo#GE_oNOS?prZ-#fgKI8=2k>~cXXp|90J2ux>!4KdSIi3g;C2M_<1D1 z4RYE@dL#rK(Q@j^1_$a1t$*G~4QM?b?)VH68n+w)G70HS<{{m7$2*(G788$=mYrb) zD@`DY{`Xy<3D*PM--Ex|o$-8_{4p@uobhHb#Pm0ZGm$cv!4cmh*VfeOrsQ?Y|819H zTu|Dp4%qS0yYjl8tWA6;WHFNd(A+-MIq+1NfCc$^m{|F*DM6DASv*8eg1}%nw2Q7c5lmFW*7)>gMJKsD#45!SIc++0dgtCl8mLt7S;#usRihl5O|5mpnXN=4&J6 z-(~pffblN7Kk!;NWR;VJ5acAVcG7$)u#izuP%y~&?{*4HcJ^2a61)7v_&`#M^&p(8 zv)l!aq}#J?7Tp#f5D#)aQ!YS;mo9sS-oHI5kPW#6!9Ng_tg5;?GB`Mq%l_@{u>MCQ zqYVJINQjAn{oc4gq1E7TtOkn`2GNJvPi9W8tn)*(@^(OvE) z^PbC;^pUb=QZ#_8_!p!66|+$exe$m%!MuQ01v1D%u(IMhdtULHAeD zIXA%1Z%czQAn5?7jf*oPJ}%DH-Tn0X4me#wiaEaa2;ci$R-;;?%}YAe-5off8zO?* zZS@733fr=sXn>hWF<#gomde-kSADn^@Zm+~YcVjx-?lYLj;sbV|VY>|Fe(aFlaU~13GK$H^y19T_(Vc zuY1upF)4%EoCx3EF+C&ho_?$Zo^C1ic;&OwE$wAK zCzc;SfBXccU2(D1H`e)HsZj@Q?X(){cl0>b7Zvk;49zLuzrT%>1dbiNmoM{E^;SB9 zL3aBlnVX-VZ-J;pq0V`cl&m9#*31p_b}&86P9_rX7i5Z9ow@ytNQ7|KpQ9oklk?co zuf&5HCY{aF`D%}~{~}rF-x8oSz92`@6zq&hYjkI~oT<=lh4=rzI=K>PDEqcQ@?>A5 z>@g)6F)3MG=UCkUd34ti!X#(j4PQT{i;Q^@e1b7*5 zy5k#Nw{AE%I6x-ngJDp5`V`PZOC=jdbM*Ill?)1xMf1F&tMPV1AK`nbJZq8wq)D5dR?gXPK|FBx$38{{cCR z;1`K5#RA_6TKi0XFpHo`Q6D4|ZwtBsUfu`_0E_mS_4lbXpHB=@hJRwB&ZChXkA{@c zzsWgDbta)efq>M5NG7a4laCs$vxWoNIn`pD0qSfMGsqEUKrsxncnS!CMS7dWuBu+ybxudlb!wi4eKim#xCtqAs~4_ zB_d%$O|2k923$|w=)L~0m09NWFaQz_pBG?`W~HaEv-3hNX8Oq|?X--wkFADa6Cb&h zobeL%XNiCz3OIo@KFCo;t28bp_SIR7^Z&wm-+6;$)uzE2{sh!Z;FA~IaO`eRJv{92 zHL~X33g#&DW;FW!d%mEqZM=^kEMq@f2HFiA1UK}(t*sYb^=wpBLYIRdyq}jt&ODKf z6no(Rd8)AUoGzFwy?!nEqVs@~eOZGS}f|0}yL z9br&*Ne}?Wr`BLX1^l-$k}J+a-UxYBu8XTTn!L2i6&71p&6AW*PVZtB+gwEomIE)^l45rN08ujWgdN;Ryc?h5{B%GKr5=c3mALt5SFg&y{v?X$GM z4JpZjWH{rhu4=j!+o2>J_m5jbetv(rjgjTur>!zTX)#(+b##Q%((inU*E9Rv zPZMzE|6_Wig5SyZTY_V@6B z)m5kTZb=wdAe<2#64JZ!s*x{NvNu&VygyR1YSZ&@qNqWggl?39-^*4)QH!6SA0oPw z#`lhD4pLLOj$Y|cU?Ktn0zmxo{82JE#6VoErE~5!3ePpk8MBkOE>>;o_x?MbW)jD! zJ0s&6%tc>Bduy8<5w+eFwGwD}<`S z>)K{DB=|rgOf6h>POLF30IUi|$NCez|$Y@@GR@A?P=3k;fTQ=iMq z%0O#-uE*!xwwUwbLj>LWL?La7p}nbZvf&5Q-K8(zzkeSZ(nqNn871QMQgOqlIXUm^ z>Pmp2GnOnx1>8*#B%JkbE*zEwf6GbAGcxPV=fSGX>9a|15;{D0StBK=Mj`$k7wO+Q!^JA=12AtB-D=qOGv zM}*Df(|k(JB0c%S1Wv<qo&Pjv2l~}eI`-^1V`gn23 zklaHuOA~c}@~%65pp|)TL(kQDhDiqPUTs?&o6Xyvk84g6>(z6A4`4=gJJ;Y?S=ml8 z@koeEsO(OY3J0n-6N@6!ihr`^N*nR6z2+>Z;z80jB0^~{i8)EDqt42mCf?+b9oG_P zyop9-YvgOEc5}E2&eu8D*=>q5)12K=^F$z22?0A5 zR&#K5^bpc*FaHAH2U;Azn{g+mre*9l!YWKN)ZLu{!CmKW?oYQKB7by)hx3S44HXLI z;4rZ&k;mj}K3>1ZyP~=iBvN|03DR*^*qc8SFdYcijihmv6Wc|u#8!9ibgk4LFHe3# z_@7P*BRY4!0hx-v_?<$E7)Yw5Kb9RZF3z8DLxmO~0>b?cb#r!)hX?_(BYjBlU)NRz z6Vx-&{EUAFr+h8gY8^T4XG+h;khrGvDR_o5_GMbEj-%#EWyzxD@!*oH?cmR!TiwBN z@|e?inu|Xx9Uz0K-jICog|uze`tU2bi=Xa31?%J^J*Tap6Np5Ga3Yg*VL|b{ni^B= zZG9Fwjtun014gN&WnjCHw?-X{i;7Ae#?%OzyLa#2iCMPoOoVV+w#9218mbjK>0U>6 zo@Jvi+&PjT2^uHQew-aZ6aX86*9vx{13uDqHI}eKTyJES^gZy<(dkw{9=a&y!P8aR&tj|24hTwmT~A zcURz5LG{rH_=L%kdiln~AAK8uyBNqf^4ci~`B1Y;aI=7|_x2uuly^RNrTvb)Yd(Bw zUY!ks^Ntd=9}!2XI619CD*u(*1!SX{h zXGB3Ni`uG0KKO8c;Rs7RI6RzR`6COTYdDeTk4l!6ILAXGmG4HDM~)CaKcM0AK1ldj9TNgG1m* z^a|D;V~@=E4(GX~$iX6dg|!`25&&`9*;KT&S@<4Ss=uI4U7)l&$+*5$NKcPa59IOk z!${B*nQ^Bz;vk0WA~lv7kywvv0F;(t+c&m=Rg_n#P150Gv@AAg&S|qGOmji46j*0n z{FYyl_!%&w0+U2Va&urt zaKb(`GEzfLEi5$D+Rjb}=EE>4|Cizc&s7;CZ1C;9x7G21UPeZ2$nOmnoHivR*aMjo z!)kcIz@7&3Sr8h!Z7{zrw#?)YX^9w=}TNTfkPm#r^maU`B_-<40$jTr)L(@KR@t&?OPzL=)+&nxpuO{^>tE#G2 zXpVd5T>z@bxk@;G3zz31GDQkpUiiGlIW|TiEqIrcyL&!}ZZ~Nqq;llB%Ii>DTU(*y z{UM8}?hA1#C(Ppj1lQyo+nAX_|L8rCXP_HJLQ49YQ-~=&di=6(SzwZ*9OqSejSsrp zn_KW+aH-sApLK3!_OJ42_Bw_5p!N^yVd*WSCr|zu6h&OtkuNM_d-+pFuDVa#Mp> zmg_Mg4E=x90dV{IXI%4Oa@Khm`(zZBbC^(}VwR5h_S0S(fFmVgdWipBJ$|pXuKKo1 z^{s{@Da=y9A|0{p@NC<8wT5WP7O^U>6|J=+SViolP4++Q&aXB9&91RyU&P;!seyj) znGjSo-3zB!PPkx@!;uYh&rcBtq5JxDq6esSPcbmae>jLWS>CwmA88bA_xV9=V;E6P z3wO_(8(b|kL{c#ETbNN2FT>nh8G#SQ>TVf{^?)p_Mi->Hthq-IsrBi034RGAS&Qz2%wgZB8fpz1tN+V4J zZj_Xipm~9UJv+(tw%8n(OBx(wK`i>^aJ(_jqhn@hzj5HYm&)cd3u9JdkUas>z+cKU zf=(VukhgRi#7up4u(Fy3cEuRaZPnyoMoW=sA;dE6>tudQ#_GwEkGXBCtkq^6k@=x0 zd2g*~EA3gC_b>~BkPzH=yFbeCbEsEp_l%9%>FJ{}81LyXr;|~ZvI4KdOw0eACQO8& zprGLFEPA(DP+!>H%`G2nYa@R@2DS$8y+OS(2fhE~$vj!FDR|w5!3k7X>5~kUk)>8fa@@wjF>Bg_Yl06H~pBZAr*(h<^wZHN~j4 zl(3V$b;$_Kpwf{bHrtnd_aJzQ=CTlrk7m=NB(2eYkm*Nu>!W0;=!TH<c+w_X?vTgls0U}3oF>+1tu@ZjJ8 z#HPzpZZ0n1(iA1VLQ>_ctW0WBo1WfKlzFcLO-&DdmiNxj!TU^S&RAMm(Na;(xm2bR zUgsu0T+j$3y2Q#@+U;UI?mM@#GPw8?#%*wmU-m;*1!^p1dvMG?uubWr#1OX+-{oap z`$!x~|0AOd-C|QwRCIZ2o~jqk50?Rc?27%)r|m13^42!CTa6Pdoa#_B2AE)7%63qq zM^06aOf-ZH_s36v`t%7v83x0S3RUN^5Lo(J0?DhcBDr>5AGh1Ne+ICPls`VNsP!U6 z|0^EfDd;#{)RaFkVnbDRPX=p!C+Nv|Md=o?tdu6Vd~{Nh{S|LrIJc+Pylk4D=bkIw zChxpHy1?%t$z;Mdx3B>I+n#xs(Nc%=LCw>Drgt-+I)x%*xl9dR8L}5WY-gF=WMExl zCXtw6qyAQ%XK`f(;GB<-Pu!J7wuSk2gZz**zK$~H(uGk^`TAJOujrH%&W-z)3G>;w zSK&J|){PY3uJF|l@4F-);?8n(pgL$OQ?qn2KKU`-(4Wb4?)b$bU14AHF83h zFMq5mKFjHhq0myt7>GmFIlj6Ri4*H`+Z?=^WC?qcyZSe z9nYu5o*Mv|OKm>2MLez^639TO5Nod4#Cf?Edy4HBtQgV+RAV3A!F+Re42T>(b(-a; z#eS5qZPaVSOgWXbUUKBRG@jPAgh8|XMf`>q>C5{zj%SpXR;=AZ^=QNTEKl4l;t0|D z^9dDZe};Wus{`drBhxhcoQe3G9G`X~IaP}ryHd+xEw#Ue!l6Ab_brUX&WcplZsAUa zMC|^|A5U_Seta<}dgs8VP$dy9+2}7cC+TmpdLdTsRuK&A#6u@V$BVh8{~&w{pcz_6 z82V4Bx{-A`BdS7A5fIOT`&0j+--}c??pZ)sV*K=fLplGU+6bU{gNrCRurDM9F59?7 zK=pe~k;ItO?Q}5gr)-WJdfdq5djjD>Z^Uw)P{?qzqAVY876%^k0h+?SHn2p@mJks( z(OL8b(XoLdlvzACH!&IEYhGtdL_Re@uV){qa3zFqKF1K1OTZ3JEwv+_0SH@VIsbc+ z9YG`u?y3EC3HK&9RP)P-rhaNBGURvdcNa(D2lCIr%zM%JUElY)Np$CI?d?sr*Oi0N zbDPyb)%^Kn3bu7c_}(d$u&?g9mF4BkTU74Lipt7WC0ej8o1)5MSJ26;zSN{1UpltP z@M8M|fk;d1JV{Sj0Yw(=bMN@o<1TR#N%X!(i4hw#4f!{%5J-iAt|1XgN$blA>O8$T o9Ij@)c-fu>fd~yFM~oa3`D{JE7d)5*b522Lp{Svdk1~7q4|DEvvH$=8 literal 0 HcmV?d00001 diff --git a/doc/images/create_boundary_an_co_2.png b/doc/images/create_boundary_an_co_2.png new file mode 100644 index 0000000000000000000000000000000000000000..017b56d943ea8485f5f2b3909202a757af57ab26 GIT binary patch literal 24414 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 LE;e-QfYkp0Ch|Uc literal 23041 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 diff --git a/doc/images/create_boundary_an_sp.png b/doc/images/create_boundary_an_sp.png index 27b944307b6e21a77e8ed6b57e80fc77aa648930..be7b28b7b592b3c0c74f55175471966b2d4cae45 100644 GIT binary patch literal 19424 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 E01>v3egFUf literal 21176 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 diff --git a/doc/intro.rst b/doc/intro.rst index efc780bf..5964b53f 100644 --- a/doc/intro.rst +++ b/doc/intro.rst @@ -183,6 +183,9 @@ SALOME VERSION 7.1 : ``cas.LastIteration()`` : retourne la dernière itération de la descendance du cas (voir :ref:`tui_create_iteration`) - Analyse de maillages (voir :ref:`gui_mesh_info`) +SALOME VERSION 7.2 : + - Possibilité d'utiliser un cone comme support de frontiere 2D (voir :ref:`tui_create_boundary`) + diff --git a/doc/tui_create_boundary.rst b/doc/tui_create_boundary.rst index aed6017d..842717f9 100644 --- a/doc/tui_create_boundary.rst +++ b/doc/tui_create_boundary.rst @@ -46,6 +46,29 @@ Ces m | - ``Xcen``, ``Ycen``, ``Zcen`` : coordonnées du centre de la sphère | | - ``R`` : rayon de la sphère | +----------------------------------------------------------------------------------------+ +| .. module:: CreateBoundaryConeA | +| | +| **CreateBoundaryConeA(boundary_name, Xaxe, Yaxe, Zaxe, Angle, Xcen, Ycen, Zcen)** | +| Retourne une instance de la classe ``boundary`` analytique de type conique | +| après sa création | +| | +| - ``boundary_name`` : le nom de la frontière analytique basée sur un cone | +| - ``Xaxe``, ``Yaxe``, ``Zaxe`` : vecteur de l'axe | +| - ``Angle`` : angle d'ouverture du cone en degre (entre 0 et 90) | +| - ``Xcen``, ``Ycen``, ``Zcen`` : coordonnées du centre du cone | ++----------------------------------------------------------------------------------------+ +| .. module:: CreateBoundaryConeR | +| | +| **CreateBoundaryConeR(boundary_name, Xc1, Yc1, Zc1, R1, Xc2, Yc2, Zc2, R2)** | +| Retourne une instance de la classe ``boundary`` analytique de type conique | +| après sa création | +| | +| - ``boundary_name`` : le nom de la frontière analytique basée sur un cone | +| - ``Xc1``, ``Yc1``, ``Zc1`` : coordonnées du premier centre du cone | +| - ``R1`` : rayon du cone à la hauteur du premier centre | +| - ``Xc2``, ``Yc2``, ``Zc2`` : coordonnées du second centre du cone | +| - ``R2`` : rayon du cone à la hauteur du second centre | ++----------------------------------------------------------------------------------------+ +---------------------------------------------------------------+ +---------------------------------------------------------------+ @@ -108,6 +131,8 @@ M | * 0 : discrète | | * 1 : cylindre | | * 2 : sphère | +| * 3 : cone défini par un axe et un angle | +| * 4 : cone défini par deux rayons | +---------------------------------------------------------------+ | .. module:: GetCoords | | | diff --git a/doc/tui_create_iteration.rst b/doc/tui_create_iteration.rst index afb8b964..e17607b8 100644 --- a/doc/tui_create_iteration.rst +++ b/doc/tui_create_iteration.rst @@ -148,7 +148,7 @@ G | | | **GetLogFile()** | | Retourne le nom du fichier retraçant le déroulement de | -| l'exécuion de HOMARD | +| l'exécution de HOMARD | +---------------------------------------------------------------+ | .. module:: GetFileInfo | | | diff --git a/idl/HOMARD_Boundary.idl b/idl/HOMARD_Boundary.idl index 78954a34..ef93fb73 100644 --- a/idl/HOMARD_Boundary.idl +++ b/idl/HOMARD_Boundary.idl @@ -66,6 +66,15 @@ module HOMARD void SetSphere (in double Xcentre, in double Ycentre, in double Zcentre, in double rayon) raises (SALOME::SALOME_Exception); + void SetConeR (in double Xcentre1, in double Ycentre1, in double Zcentre1, in double Rayon1, + in double Xcentre2, in double Ycentre2, in double Zcentre2, in double Rayon2) + raises (SALOME::SALOME_Exception); + + void SetConeA(in double Xaxe,in double Yaxe,in double Zaxe,in double Angle, + in double Xcentre,in double Ycentre,in double ZCentre) + raises (SALOME::SALOME_Exception); + + HOMARD::double_array GetCoords() raises (SALOME::SALOME_Exception); void SetLimit (in double Xincr, in double Yincr, in double Zincr) diff --git a/idl/HOMARD_Gen.idl b/idl/HOMARD_Gen.idl index b91f3524..14716c63 100644 --- a/idl/HOMARD_Gen.idl +++ b/idl/HOMARD_Gen.idl @@ -58,6 +58,14 @@ module HOMARD in double Xcentre, in double Ycentre, in double Zcentre, in double Radius) raises (SALOME::SALOME_Exception); + HOMARD_Boundary CreateBoundaryConeR (in string BoundaryName, + in double Xcentre1, in double Ycentre1, in double Zcentre1, in double Radius1, + in double Xcentre2, in double Ycentre2, in double Zcentre2, in double Radius2) + raises (SALOME::SALOME_Exception); + HOMARD_Boundary CreateBoundaryConeA (in string BoundaryName, + in double Xaxis, in double Yaxis, in double Zaxis, in double Angle, + in double Xcentre, in double Ycentre, in double Zcentre) + raises (SALOME::SALOME_Exception); HOMARD_Cas CreateCase(in string CaseName, in string MeshName, in string FileName ) raises (SALOME::SALOME_Exception); HOMARD_Hypothesis CreateHypothesis(in string HypoName ) diff --git a/resources/Makefile.am b/resources/Makefile.am index 5c8decf0..09f1d0b3 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -28,6 +28,9 @@ dist_salomeres_DATA = \ boxdxyz_2.png \ cas_calcule.png \ cas_non_calcule.png \ + conedxyz.png \ + cone.png \ + conepointvector.png \ cylinderpointvector.png \ cylinderpointvector_2.png \ delete.png \ diff --git a/resources/cone.png b/resources/cone.png new file mode 100644 index 0000000000000000000000000000000000000000..677e2c729d1513d07a93f16018755b5c1840975c GIT binary patch literal 830 zcmV-E1Ht@>P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;v`IukRCwBA`2YVu0|?^-&d$#G6+i*V9Do2~BBUrN zDCoawOb3IFjSa|9ZbIq-0*Ii2EG#Sx%uI|7jEsyRt^pxK0RjlGfe8r-|Mi2a7=Xqx z7{_!o=<4bo0SZgt(*qDdcnxG?LP&%B`|saB5K{%8D**xsr-5l{Y5%pn3!#Pq;lKY3 zrb*KoL`6k+;BzHF05K7YHJ~{Re}TjwDE{^97hYEa1Q1pOQ&Lj?tGVYw4Ep;Ih#~Z^ zKYtl4^HzbB;B+NG0AV!{o3F4Um*Tpm@=%c1PCAu1A~Ku z|0}u`Fns^@hvDmwKMY@f{AT$4{Wp+?u>bt{!eE`X0H-Sf0*D1&;PdCtV1s@Gy$EvE z_n&_lK7E52`uqDQApXqo_xBHESH1w^uP_0C0Ahq?J5a*4w6y$h6w?bd>_5Zjk8i<- zefjZ=;oJA041a!p1-tIg&+iN@tn9#8|I2WGMK#ROyRb+E2p|*}e*E~6;mzCE;BflK z!pHFK{~v}wz(mc&_?v+dXfGp}&BXBS1JF_b|6z3{KmfsAC@(Mn-ypW1fsu`$;m7Yk zz=-+H@b}j@uowUQ{078d!1TXAzZm}i{SDUh``34d+q-ALT?sM^Ab{X5eE&cY z*#RK_f@~l_03jR54K1ELptKL3TzLRWgABU>O_LXZW_<++Ammv73YCN@d;v|kJXj2b z$=`vx?gA{90Rjjm9YO&&)F2h8OR?qI7f?g)ASW4+SpWeB05gAurc3%$wg3PC07*qo IM6N<$g6P9(umAu6 literal 0 HcmV?d00001 diff --git a/resources/conedxyz.png b/resources/conedxyz.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4683429d14a0deb1bade17c9169852c0eafff6 GIT binary patch literal 861 zcmV-j1ETziP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;(@8`@RCwBA`2YVu0}SH=_kDeFOQHdQ0AeCWQS#TX zAW9sFxe2KS2p~pemoYLjVkmf=l=T1K_wNk2@pUy4NOT%`LE?&$N&yvXeuyEp1~j{CWhCQ00D&4z`uY0GW`Ab zAB_M1`o-|)?>~m$K>QsTLHJw=5I|TBjEai-uk4o3@Zk4PyWK@fD^Ft1AHl2*W@( zH@E+)zSRt0e}D}9&G6~lFNVKw--7Ai-@h>Y{_&Z?Jb4;UR{{hO3%bA;U;+ji_VYKy ziy-#z_wN~geftD7@H4}opWhh%{rQRP$`>F{!2|#T2*rhZdV2rWLOQ^%dGYcE!?Wkl z7~Z^m%sOMn1E@$!cc9~gcB<^D2!XZZc)9ndA9 zF#7^_VdVBshHpT_egQEkd9wiXeGAC1K>lSaPROEn3e;r{QM5pA3uW3J_5vd00IczKxH5m z0>m~z?1Lv)9)QIm5(atw0zd$v8_2y)RP>A2>(>=i1qC~@-@o4i6z0KV;1_7@-ht8# zFg`#4VU&lPL`DC91V%#a+qVfoAp@v^U(gJE0S%fvNOBz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;)k#D_RCwBA`2YVu0|?^-&d$#G6+i*V9Do2~BBUrN zDCqxuad8G48yk?J+=SEv1Q0<3Sy)&=1Op=@BZzB2$WVX)!fRkcLc)LjpeiuiIHsFH zS6BB4kST#r4?qCnHIRu3Ar12HzkmNgOci{t1PCCU2BxK@{nzp?L>Tz*KZ9w~bOupT z(H;0)2@pU`gktR<$Z3E6F#G{BK={|MUwB;!5I|TBOi4-kujZc1@E2sr-+v7MfBy#4 zzyADXu*_QpQi9W!00D&6K#(hb{rLyMzyC4(`~IEb$FIK(KYxMve__h7x)LCOFboV1 z4*sv`R>1K6*B^$jKmIU$`SF|K@5hfo8p8hb;|qgz)&iWa1PCA&bb-&GKZ6bW4fG<& zRo{R9Vfg#z4a3K;zZiah{{+OJ8UFtMf$Yi`K>QUZ01!YZF0{0?{IBZY!0_qYZ-!T| zUNO9U`I6z;i{}i#K73&K{Q5q_mp2a?zP@`3cBNrND^^zm1Q3b~KLWk>=Iv{6IQ?Vc zWBB$T7`qIN3~&DaWncuxHX{%+F)}fH`|tvkj&>${` zPhYi0L}Ue5J1SW{1qw*Q}_ZJ*gRMagvsB5y6yrjmH`3?*@ZC0+)#s5 ppf1IhXJ0@Kxr3Z!KxP317y#hiY0IT%3iAK}002ovPDHLkV1jsUgh&7Y literal 0 HcmV?d00001 diff --git a/src/HOMARD/HOMARD_Boundary.cxx b/src/HOMARD/HOMARD_Boundary.cxx index f73659de..f39ac47f 100644 --- a/src/HOMARD/HOMARD_Boundary.cxx +++ b/src/HOMARD/HOMARD_Boundary.cxx @@ -93,11 +93,25 @@ std::string HOMARD_Boundary::GetDumpPython() const } case 2: { - aScript << "sphere" << _Name << "\n"; + aScript << "sphere " << _Name << "\n"; aScript << "\t" << _Name << " = homard.CreateBoundarySphere(\"" << _Name << "\", "; aScript << _Xcentre << ", " << _Ycentre << ", " << _Zcentre << ", " << _rayon << ")\n"; break ; } + case 3: + { + aScript << "cone " << _Name << "\n"; + aScript << "\t" << _Name << " = homard.CreateBoundaryConeA(\"" << _Name << "\", "; + aScript << _Xaxe << ", " << _Yaxe << ", " << _Zaxe << ", " << _Angle << ", " << _Xcentre << ", " << _Ycentre << ", " << _Zcentre << ")\n"; + break ; + } + case 4: + { + aScript << "cone " << _Name << "\n"; + aScript << "\t" << _Name << " = homard.CreateBoundaryConeR(\"" << _Name << "\", "; + aScript << _Xcentre1 << ", " << _Ycentre1 << ", " << _Zcentre1 << ", " << _Rayon1 << ", " << _Xcentre2 << ", " << _Ycentre2 << ", " << _Zcentre2 << ", " << _Rayon2 << ")\n"; + break ; + } } return aScript.str(); @@ -140,9 +154,8 @@ std::string HOMARD_Boundary::GetMeshFile() const void HOMARD_Boundary::SetCylinder( double X0, double X1, double X2, double X3, double X4, double X5, double X6 ) { - _Xcentre = X0; _Ycentre = X1; - _Zcentre = X2; _Xaxe = X3; - _Yaxe = X4; _Zaxe = X5; + _Xcentre = X0; _Ycentre = X1; _Zcentre = X2; + _Xaxe = X3; _Yaxe = X4; _Zaxe = X5; _rayon = X6; } //====================================================================== @@ -151,6 +164,23 @@ void HOMARD_Boundary::SetSphere( double X0, double X1, double X2, double X3 ) _Xcentre = X0; _Ycentre = X1; _Zcentre = X2; _rayon = X3; } +//====================================================================== +void HOMARD_Boundary::SetConeR( double Xcentre1, double Ycentre1, double Zcentre1, double Rayon1, + double Xcentre2, double Ycentre2, double Zcentre2, double Rayon2) +{ + _Xcentre1 = Xcentre1; _Ycentre1 = Ycentre1; _Zcentre1 = Zcentre1; + _Rayon1 = Rayon1; + _Xcentre2 = Xcentre2; _Ycentre2 = Ycentre2; _Zcentre2 = Zcentre2; + _Rayon2 = Rayon2; +} +//====================================================================== +void HOMARD_Boundary::SetConeA( double Xaxe, double Yaxe, double Zaxe, double Angle, + double Xcentre, double Ycentre, double Zcentre) +{ + _Xaxe = Xaxe; _Yaxe = Yaxe; _Zaxe = Zaxe; + _Angle = Angle; + _Xcentre = Xcentre; _Ycentre = Ycentre; _Zcentre = Zcentre; +} //======================================================================================= std::vector HOMARD_Boundary::GetCoords() const { @@ -179,6 +209,31 @@ std::vector HOMARD_Boundary::GetCoords() const mesCoor.push_back( _rayon ); break ; } +// Cone defini par un axe et un angle + case 3: + { + mesCoor.push_back( _Xaxe ); + mesCoor.push_back( _Yaxe ); + mesCoor.push_back( _Zaxe ); + mesCoor.push_back( _Angle ); + mesCoor.push_back( _Xcentre ); + mesCoor.push_back( _Ycentre ); + mesCoor.push_back( _Zcentre ); + break ; + } +// Cone defini par les 2 rayons + case 4: + { + mesCoor.push_back( _Xcentre1 ); + mesCoor.push_back( _Ycentre1 ); + mesCoor.push_back( _Zcentre1 ); + mesCoor.push_back( _Rayon1 ); + mesCoor.push_back( _Xcentre2 ); + mesCoor.push_back( _Ycentre2 ); + mesCoor.push_back( _Zcentre2 ); + mesCoor.push_back( _Rayon2 ); + break ; + } ASSERT ( _Type == -1 ) ; } return mesCoor; diff --git a/src/HOMARD/HOMARD_Boundary.hxx b/src/HOMARD/HOMARD_Boundary.hxx index 5cf972aa..87b4970d 100644 --- a/src/HOMARD/HOMARD_Boundary.hxx +++ b/src/HOMARD/HOMARD_Boundary.hxx @@ -63,6 +63,10 @@ public: void SetCylinder( double X0, double X1, double X2, double X3, double X4, double X5, double X6 ); void SetSphere( double X0, double X1, double X2, double X3 ); + void SetConeR( double Xcentre1, double Ycentre1, double Zcentre1, double Rayon1, + double Xcentre2, double Ycentre2, double Zcentre2, double Rayon2); + void SetConeA( double Xaxe, double Yaxe, double Zaxe, double Angle, + double Xcentre, double Ycentre, double ZCentre); std::vector GetCoords() const; @@ -87,6 +91,9 @@ private: double _Xaxe, _Yaxe, _Zaxe; double _Xcentre, _Ycentre, _Zcentre, _rayon; double _Xincr, _Yincr, _Zincr; + double _Xcentre1, _Ycentre1, _Zcentre1, _Rayon1; + double _Xcentre2, _Ycentre2, _Zcentre2, _Rayon2; + double _Angle; std::list _ListGroupSelected; diff --git a/src/HOMARD/HOMARD_DriverTools.cxx b/src/HOMARD/HOMARD_DriverTools.cxx index b6211887..ab29a7df 100644 --- a/src/HOMARD/HOMARD_DriverTools.cxx +++ b/src/HOMARD/HOMARD_DriverTools.cxx @@ -730,6 +730,10 @@ namespace HOMARD { boundary.SetCylinder(coords[0],coords[1],coords[2],coords[3],coords[4],coords[5],coords[6]); } else if ( BoundaryType == 2 ) { boundary.SetSphere( coords[0], coords[1], coords[2], coords[3]); } + else if ( BoundaryType == 3 ) + { boundary.SetConeA( coords[0], coords[1], coords[2], coords[3], coords[4], coords[5], coords[6]); } + else if ( BoundaryType == 4 ) + { boundary.SetConeR( coords[0], coords[1], coords[2], coords[3], coords[4], coords[5], coords[6], coords[7]); } // Remarque : la taille de coords est suffisante pour les limites for ( int i = 0; i < 3; i++ ) { chunk = getNextChunk( stream, start, ok ); diff --git a/src/HOMARD/HomardDriver.cxx b/src/HOMARD/HomardDriver.cxx index 1cfa5f32..b24af8e9 100644 --- a/src/HOMARD/HomardDriver.cxx +++ b/src/HOMARD/HomardDriver.cxx @@ -666,12 +666,12 @@ void HomardDriver::TexteBoundaryDiGr( const std::string GroupName ) // } //=============================================================================== -void HomardDriver::TexteBoundaryAn( const std::string NameBoundary, int NumeBoundary, int BoundaryType, double x0, double x1, double x2, double x3, double x4, double x5, double x6 ) +void HomardDriver::TexteBoundaryAn( const std::string NameBoundary, int NumeBoundary, int BoundaryType, double x0, double x1, double x2, double x3, double x4, double x5, double x6, double x7 ) { MESSAGE("TexteBoundaryAn, NameBoundary = "< #include #include -#include +#include #include #include #include #include +QT_BEGIN_NAMESPACE + class Ui_CreateBoundaryAn { public: - QGridLayout *gridLayout; - QGroupBox *GBButtons; - QGridLayout *gridLayout1; - QPushButton *buttonHelp; - QPushButton *buttonCancel; - QPushButton *buttonApply; - QPushButton *buttonOk; + QGridLayout *gridLayout_4; QLabel *Name; QLineEdit *LEBoundaryName; QGroupBox *TypeBoundary; - QHBoxLayout *hboxLayout; + QGridLayout *gridLayout; QRadioButton *RBCylindre; QRadioButton *RBSphere; - QGroupBox *gBSphere; - QGridLayout *gridLayout2; - QDoubleSpinBox *SpinBox_Rayon; - QDoubleSpinBox *SpinBox_Zcentre; - QLabel *TLRayon; - QLabel *TLZcentre; - QLabel *TLYcentre; - QDoubleSpinBox *SpinBox_Ycentre; - QDoubleSpinBox *SpinBox_Xcentre; - QLabel *TLXcentre; + QRadioButton *RBCone; QGroupBox *gBCylindre; - QGridLayout *gridLayout3; + QGridLayout *gridLayout1; QDoubleSpinBox *SpinBox_Xcent; QLabel *TLXcent; QDoubleSpinBox *SpinBox_Radius; @@ -66,373 +53,563 @@ public: QDoubleSpinBox *SpinBox_Zaxis; QDoubleSpinBox *SpinBox_Yaxis; QDoubleSpinBox *SpinBox_Xaxis; + QGroupBox *gBSphere; + QGridLayout *gridLayout2; + QDoubleSpinBox *SpinBox_Rayon; + QDoubleSpinBox *SpinBox_Zcentre; + QLabel *TLRayon; + QLabel *TLZcentre; + QLabel *TLYcentre; + QDoubleSpinBox *SpinBox_Ycentre; + QDoubleSpinBox *SpinBox_Xcentre; + QLabel *TLXcentre; + QGroupBox *gBCone; + QGridLayout *gridLayout_3; + QGroupBox *groupBox; + QGridLayout *gridLayout_2; + QRadioButton *RB_Def_radius; + QRadioButton *RB_Def_angle; + QLabel *TLCone_X1; + QDoubleSpinBox *SpinBox_Cone_X1; + QLabel *TLCone_X2; + QDoubleSpinBox *SpinBox_Cone_X2; + QLabel *TLCone_Y1; + QDoubleSpinBox *SpinBox_Cone_Y1; + QLabel *TLCone_Y2; + QDoubleSpinBox *SpinBox_Cone_Y2; + QLabel *TLCone_Z1; + QDoubleSpinBox *SpinBox_Cone_Z1; + QLabel *TLCone_Z2; + QDoubleSpinBox *SpinBox_Cone_Z2; + QLabel *TLCone_V1; + QDoubleSpinBox *SpinBox_Cone_V1; + QLabel *TLCone_V2; + QDoubleSpinBox *SpinBox_Cone_V2; + QGroupBox *GBButtons; + QGridLayout *gridLayout3; + QPushButton *buttonHelp; + QPushButton *buttonCancel; + QPushButton *buttonApply; + QPushButton *buttonOk; void setupUi(QDialog *CreateBoundaryAn) { - CreateBoundaryAn->setObjectName(QString::fromUtf8("CreateBoundaryAn")); - CreateBoundaryAn->setAutoFillBackground(true); - CreateBoundaryAn->setSizeGripEnabled(true); - gridLayout = new QGridLayout(CreateBoundaryAn); - gridLayout->setSpacing(6); - gridLayout->setMargin(9); - gridLayout->setObjectName(QString::fromUtf8("gridLayout")); - GBButtons = new QGroupBox(CreateBoundaryAn); - GBButtons->setObjectName(QString::fromUtf8("GBButtons")); - QSizePolicy sizePolicy(static_cast(0), static_cast(0)); - sizePolicy.setHorizontalStretch(0); - sizePolicy.setVerticalStretch(0); - sizePolicy.setHeightForWidth(GBButtons->sizePolicy().hasHeightForWidth()); - GBButtons->setSizePolicy(sizePolicy); - gridLayout1 = new QGridLayout(GBButtons); - gridLayout1->setSpacing(6); - gridLayout1->setMargin(9); - gridLayout1->setObjectName(QString::fromUtf8("gridLayout1")); - buttonHelp = new QPushButton(GBButtons); - buttonHelp->setObjectName(QString::fromUtf8("buttonHelp")); - - gridLayout1->addWidget(buttonHelp, 0, 3, 1, 1); - - buttonCancel = new QPushButton(GBButtons); - buttonCancel->setObjectName(QString::fromUtf8("buttonCancel")); - - gridLayout1->addWidget(buttonCancel, 0, 2, 1, 1); - - buttonApply = new QPushButton(GBButtons); - buttonApply->setObjectName(QString::fromUtf8("buttonApply")); - - gridLayout1->addWidget(buttonApply, 0, 1, 1, 1); - - buttonOk = new QPushButton(GBButtons); - buttonOk->setObjectName(QString::fromUtf8("buttonOk")); - - gridLayout1->addWidget(buttonOk, 0, 0, 1, 1); - - - gridLayout->addWidget(GBButtons, 4, 0, 1, 2); - - Name = new QLabel(CreateBoundaryAn); - Name->setObjectName(QString::fromUtf8("Name")); - - gridLayout->addWidget(Name, 0, 0, 1, 1); - - LEBoundaryName = new QLineEdit(CreateBoundaryAn); - LEBoundaryName->setObjectName(QString::fromUtf8("LEBoundaryName")); - LEBoundaryName->setMaxLength(32); - - gridLayout->addWidget(LEBoundaryName, 0, 1, 1, 1); - - TypeBoundary = new QGroupBox(CreateBoundaryAn); - TypeBoundary->setObjectName(QString::fromUtf8("TypeBoundary")); - QSizePolicy sizePolicy1(static_cast(0), static_cast(0)); - sizePolicy1.setHorizontalStretch(0); - sizePolicy1.setVerticalStretch(0); - sizePolicy1.setHeightForWidth(TypeBoundary->sizePolicy().hasHeightForWidth()); - TypeBoundary->setSizePolicy(sizePolicy1); - TypeBoundary->setMinimumSize(QSize(340, 0)); - hboxLayout = new QHBoxLayout(TypeBoundary); - hboxLayout->setSpacing(6); - hboxLayout->setMargin(9); - hboxLayout->setObjectName(QString::fromUtf8("hboxLayout")); - RBCylindre = new QRadioButton(TypeBoundary); - RBCylindre->setObjectName(QString::fromUtf8("RBCylindre")); - RBCylindre->setIcon(QIcon(QString::fromUtf8("../../resources/cylinderpointvector.png"))); - RBCylindre->setCheckable(true); - RBCylindre->setChecked(true); - - hboxLayout->addWidget(RBCylindre); - - RBSphere = new QRadioButton(TypeBoundary); - RBSphere->setObjectName(QString::fromUtf8("RBSphere")); - RBSphere->setIcon(QIcon(QString::fromUtf8("../../resources/zone_spherepoint.png"))); - - hboxLayout->addWidget(RBSphere); - - - gridLayout->addWidget(TypeBoundary, 1, 0, 1, 2); - - gBSphere = new QGroupBox(CreateBoundaryAn); - gBSphere->setObjectName(QString::fromUtf8("gBSphere")); - QSizePolicy sizePolicy2(static_cast(0), static_cast(0)); - sizePolicy2.setHorizontalStretch(0); - sizePolicy2.setVerticalStretch(0); - sizePolicy2.setHeightForWidth(gBSphere->sizePolicy().hasHeightForWidth()); - gBSphere->setSizePolicy(sizePolicy2); - gridLayout2 = new QGridLayout(gBSphere); - gridLayout2->setSpacing(6); - gridLayout2->setMargin(9); - gridLayout2->setObjectName(QString::fromUtf8("gridLayout2")); - SpinBox_Rayon = new QDoubleSpinBox(gBSphere); - SpinBox_Rayon->setObjectName(QString::fromUtf8("SpinBox_Rayon")); - SpinBox_Rayon->setDecimals(5); - SpinBox_Rayon->setMaximum(1e+09); - SpinBox_Rayon->setMinimum(0); - SpinBox_Rayon->setValue(0); - - gridLayout2->addWidget(SpinBox_Rayon, 1, 3, 1, 1); - - SpinBox_Zcentre = new QDoubleSpinBox(gBSphere); - SpinBox_Zcentre->setObjectName(QString::fromUtf8("SpinBox_Zcentre")); - SpinBox_Zcentre->setDecimals(5); - SpinBox_Zcentre->setMaximum(1e+09); - SpinBox_Zcentre->setMinimum(-1e+09); - SpinBox_Zcentre->setValue(0); - - gridLayout2->addWidget(SpinBox_Zcentre, 2, 1, 1, 1); - - TLRayon = new QLabel(gBSphere); - TLRayon->setObjectName(QString::fromUtf8("TLRayon")); - QSizePolicy sizePolicy3(static_cast(0), static_cast(0)); - sizePolicy3.setHorizontalStretch(0); - sizePolicy3.setVerticalStretch(0); - sizePolicy3.setHeightForWidth(TLRayon->sizePolicy().hasHeightForWidth()); - TLRayon->setSizePolicy(sizePolicy3); - TLRayon->setWordWrap(false); - - gridLayout2->addWidget(TLRayon, 1, 2, 1, 1); - - TLZcentre = new QLabel(gBSphere); - TLZcentre->setObjectName(QString::fromUtf8("TLZcentre")); - QSizePolicy sizePolicy4(static_cast(0), static_cast(0)); - sizePolicy4.setHorizontalStretch(0); - sizePolicy4.setVerticalStretch(0); - sizePolicy4.setHeightForWidth(TLZcentre->sizePolicy().hasHeightForWidth()); - TLZcentre->setSizePolicy(sizePolicy4); - TLZcentre->setWordWrap(false); - - gridLayout2->addWidget(TLZcentre, 2, 0, 1, 1); - - TLYcentre = new QLabel(gBSphere); - TLYcentre->setObjectName(QString::fromUtf8("TLYcentre")); - QSizePolicy sizePolicy5(static_cast(0), static_cast(0)); - sizePolicy5.setHorizontalStretch(0); - sizePolicy5.setVerticalStretch(0); - sizePolicy5.setHeightForWidth(TLYcentre->sizePolicy().hasHeightForWidth()); - TLYcentre->setSizePolicy(sizePolicy5); - TLYcentre->setWordWrap(false); - - gridLayout2->addWidget(TLYcentre, 1, 0, 1, 1); - - SpinBox_Ycentre = new QDoubleSpinBox(gBSphere); - SpinBox_Ycentre->setObjectName(QString::fromUtf8("SpinBox_Ycentre")); - SpinBox_Ycentre->setDecimals(5); - SpinBox_Ycentre->setMaximum(1e+09); - SpinBox_Ycentre->setMinimum(-1e+09); - SpinBox_Ycentre->setValue(0); - - gridLayout2->addWidget(SpinBox_Ycentre, 1, 1, 1, 1); - - SpinBox_Xcentre = new QDoubleSpinBox(gBSphere); - SpinBox_Xcentre->setObjectName(QString::fromUtf8("SpinBox_Xcentre")); - SpinBox_Xcentre->setDecimals(5); - SpinBox_Xcentre->setMaximum(1e+09); - SpinBox_Xcentre->setMinimum(-1e+09); - SpinBox_Xcentre->setValue(0); - - gridLayout2->addWidget(SpinBox_Xcentre, 0, 1, 1, 1); - - TLXcentre = new QLabel(gBSphere); - TLXcentre->setObjectName(QString::fromUtf8("TLXcentre")); - QSizePolicy sizePolicy6(static_cast(0), static_cast(0)); - sizePolicy6.setHorizontalStretch(0); - sizePolicy6.setVerticalStretch(0); - sizePolicy6.setHeightForWidth(TLXcentre->sizePolicy().hasHeightForWidth()); - TLXcentre->setSizePolicy(sizePolicy6); - TLXcentre->setWordWrap(false); - - gridLayout2->addWidget(TLXcentre, 0, 0, 1, 1); - - - gridLayout->addWidget(gBSphere, 3, 0, 1, 2); - - gBCylindre = new QGroupBox(CreateBoundaryAn); - gBCylindre->setObjectName(QString::fromUtf8("gBCylindre")); - QSizePolicy sizePolicy7(static_cast(0), static_cast(0)); - sizePolicy7.setHorizontalStretch(0); - sizePolicy7.setVerticalStretch(0); - sizePolicy7.setHeightForWidth(gBCylindre->sizePolicy().hasHeightForWidth()); - gBCylindre->setSizePolicy(sizePolicy7); - gridLayout3 = new QGridLayout(gBCylindre); - gridLayout3->setSpacing(6); - gridLayout3->setMargin(9); - gridLayout3->setObjectName(QString::fromUtf8("gridLayout3")); - SpinBox_Xcent = new QDoubleSpinBox(gBCylindre); - SpinBox_Xcent->setObjectName(QString::fromUtf8("SpinBox_Xcent")); - SpinBox_Xcent->setDecimals(5); - SpinBox_Xcent->setMaximum(1e+09); - SpinBox_Xcent->setMinimum(-1e+09); - SpinBox_Xcent->setValue(0); - - gridLayout3->addWidget(SpinBox_Xcent, 0, 1, 1, 1); - - TLXcent = new QLabel(gBCylindre); - TLXcent->setObjectName(QString::fromUtf8("TLXcent")); - QSizePolicy sizePolicy8(static_cast(0), static_cast(0)); - sizePolicy8.setHorizontalStretch(0); - sizePolicy8.setVerticalStretch(0); - sizePolicy8.setHeightForWidth(TLXcent->sizePolicy().hasHeightForWidth()); - TLXcent->setSizePolicy(sizePolicy8); - TLXcent->setWordWrap(false); - - gridLayout3->addWidget(TLXcent, 0, 0, 1, 1); - - SpinBox_Radius = new QDoubleSpinBox(gBCylindre); - SpinBox_Radius->setObjectName(QString::fromUtf8("SpinBox_Radius")); - SpinBox_Radius->setDecimals(5); - SpinBox_Radius->setMaximum(1e+09); - - gridLayout3->addWidget(SpinBox_Radius, 3, 1, 1, 2); - - SpinBox_Zcent = new QDoubleSpinBox(gBCylindre); - SpinBox_Zcent->setObjectName(QString::fromUtf8("SpinBox_Zcent")); - SpinBox_Zcent->setDecimals(5); - SpinBox_Zcent->setMaximum(1e+09); - SpinBox_Zcent->setMinimum(-1e+09); - SpinBox_Zcent->setValue(0); - - gridLayout3->addWidget(SpinBox_Zcent, 2, 1, 1, 1); - - TLradius = new QLabel(gBCylindre); - TLradius->setObjectName(QString::fromUtf8("TLradius")); - QSizePolicy sizePolicy9(static_cast(0), static_cast(0)); - sizePolicy9.setHorizontalStretch(0); - sizePolicy9.setVerticalStretch(0); - sizePolicy9.setHeightForWidth(TLradius->sizePolicy().hasHeightForWidth()); - TLradius->setSizePolicy(sizePolicy9); - TLradius->setWordWrap(false); - - gridLayout3->addWidget(TLradius, 3, 0, 1, 1); - - TLZcent = new QLabel(gBCylindre); - TLZcent->setObjectName(QString::fromUtf8("TLZcent")); - QSizePolicy sizePolicy10(static_cast(0), static_cast(0)); - sizePolicy10.setHorizontalStretch(0); - sizePolicy10.setVerticalStretch(0); - sizePolicy10.setHeightForWidth(TLZcent->sizePolicy().hasHeightForWidth()); - TLZcent->setSizePolicy(sizePolicy10); - TLZcent->setWordWrap(false); - - gridLayout3->addWidget(TLZcent, 2, 0, 1, 1); - - TLYcent = new QLabel(gBCylindre); - TLYcent->setObjectName(QString::fromUtf8("TLYcent")); - QSizePolicy sizePolicy11(static_cast(0), static_cast(0)); - sizePolicy11.setHorizontalStretch(0); - sizePolicy11.setVerticalStretch(0); - sizePolicy11.setHeightForWidth(TLYcent->sizePolicy().hasHeightForWidth()); - TLYcent->setSizePolicy(sizePolicy11); - TLYcent->setWordWrap(false); - - gridLayout3->addWidget(TLYcent, 1, 0, 1, 1); - - SpinBox_Ycent = new QDoubleSpinBox(gBCylindre); - SpinBox_Ycent->setObjectName(QString::fromUtf8("SpinBox_Ycent")); - SpinBox_Ycent->setDecimals(5); - SpinBox_Ycent->setMaximum(1e+09); - SpinBox_Ycent->setMinimum(-1e+09); - SpinBox_Ycent->setValue(0); - - gridLayout3->addWidget(SpinBox_Ycent, 1, 1, 1, 1); - - TLXaxis = new QLabel(gBCylindre); - TLXaxis->setObjectName(QString::fromUtf8("TLXaxis")); - QSizePolicy sizePolicy12(static_cast(0), static_cast(0)); - sizePolicy12.setHorizontalStretch(0); - sizePolicy12.setVerticalStretch(0); - sizePolicy12.setHeightForWidth(TLXaxis->sizePolicy().hasHeightForWidth()); - TLXaxis->setSizePolicy(sizePolicy12); - TLXaxis->setWordWrap(false); - - gridLayout3->addWidget(TLXaxis, 0, 2, 1, 1); - - TLYaxis = new QLabel(gBCylindre); - TLYaxis->setObjectName(QString::fromUtf8("TLYaxis")); - QSizePolicy sizePolicy13(static_cast(0), static_cast(0)); - sizePolicy13.setHorizontalStretch(0); - sizePolicy13.setVerticalStretch(0); - sizePolicy13.setHeightForWidth(TLYaxis->sizePolicy().hasHeightForWidth()); - TLYaxis->setSizePolicy(sizePolicy13); - TLYaxis->setWordWrap(false); - - gridLayout3->addWidget(TLYaxis, 1, 2, 1, 1); - - TLZaxis = new QLabel(gBCylindre); - TLZaxis->setObjectName(QString::fromUtf8("TLZaxis")); - QSizePolicy sizePolicy14(static_cast(0), static_cast(0)); - sizePolicy14.setHorizontalStretch(0); - sizePolicy14.setVerticalStretch(0); - sizePolicy14.setHeightForWidth(TLZaxis->sizePolicy().hasHeightForWidth()); - TLZaxis->setSizePolicy(sizePolicy14); - TLZaxis->setWordWrap(false); - - gridLayout3->addWidget(TLZaxis, 2, 2, 1, 1); - - SpinBox_Zaxis = new QDoubleSpinBox(gBCylindre); - SpinBox_Zaxis->setObjectName(QString::fromUtf8("SpinBox_Zaxis")); - SpinBox_Zaxis->setDecimals(5); - SpinBox_Zaxis->setMaximum(1e+09); - SpinBox_Zaxis->setMinimum(-1e+09); - SpinBox_Zaxis->setValue(0); - - gridLayout3->addWidget(SpinBox_Zaxis, 2, 3, 1, 1); - - SpinBox_Yaxis = new QDoubleSpinBox(gBCylindre); - SpinBox_Yaxis->setObjectName(QString::fromUtf8("SpinBox_Yaxis")); - SpinBox_Yaxis->setDecimals(5); - SpinBox_Yaxis->setMaximum(1e+09); - SpinBox_Yaxis->setMinimum(-1e+09); - SpinBox_Yaxis->setValue(0); - - gridLayout3->addWidget(SpinBox_Yaxis, 1, 3, 1, 1); - - SpinBox_Xaxis = new QDoubleSpinBox(gBCylindre); - SpinBox_Xaxis->setObjectName(QString::fromUtf8("SpinBox_Xaxis")); - SpinBox_Xaxis->setDecimals(5); - SpinBox_Xaxis->setMaximum(1e+09); - SpinBox_Xaxis->setMinimum(-1e+09); - SpinBox_Xaxis->setValue(0); - - gridLayout3->addWidget(SpinBox_Xaxis, 0, 3, 1, 1); - - - gridLayout->addWidget(gBCylindre, 2, 0, 1, 2); - - - retranslateUi(CreateBoundaryAn); + if (CreateBoundaryAn->objectName().isEmpty()) + CreateBoundaryAn->setObjectName(QString::fromUtf8("CreateBoundaryAn")); + CreateBoundaryAn->resize(527, 701); + CreateBoundaryAn->setAutoFillBackground(true); + CreateBoundaryAn->setSizeGripEnabled(true); + gridLayout_4 = new QGridLayout(CreateBoundaryAn); + gridLayout_4->setObjectName(QString::fromUtf8("gridLayout_4")); + Name = new QLabel(CreateBoundaryAn); + Name->setObjectName(QString::fromUtf8("Name")); + + gridLayout_4->addWidget(Name, 0, 0, 1, 1); + + LEBoundaryName = new QLineEdit(CreateBoundaryAn); + LEBoundaryName->setObjectName(QString::fromUtf8("LEBoundaryName")); + LEBoundaryName->setMaxLength(32); + + gridLayout_4->addWidget(LEBoundaryName, 0, 1, 1, 1); + + TypeBoundary = new QGroupBox(CreateBoundaryAn); + TypeBoundary->setObjectName(QString::fromUtf8("TypeBoundary")); + QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(TypeBoundary->sizePolicy().hasHeightForWidth()); + TypeBoundary->setSizePolicy(sizePolicy); + TypeBoundary->setMinimumSize(QSize(340, 0)); + gridLayout = new QGridLayout(TypeBoundary); + gridLayout->setObjectName(QString::fromUtf8("gridLayout")); + RBCylindre = new QRadioButton(TypeBoundary); + RBCylindre->setObjectName(QString::fromUtf8("RBCylindre")); + QIcon icon; + icon.addFile(QString::fromUtf8("../../resources/cylinderpointvector.png"), QSize(), QIcon::Normal, QIcon::Off); + RBCylindre->setIcon(icon); + RBCylindre->setCheckable(true); + RBCylindre->setChecked(true); + + gridLayout->addWidget(RBCylindre, 0, 0, 1, 1); + + RBSphere = new QRadioButton(TypeBoundary); + RBSphere->setObjectName(QString::fromUtf8("RBSphere")); + QIcon icon1; + icon1.addFile(QString::fromUtf8("../../resources/zone_spherepoint.png"), QSize(), QIcon::Normal, QIcon::Off); + RBSphere->setIcon(icon1); + + gridLayout->addWidget(RBSphere, 0, 1, 1, 1); + + RBCone = new QRadioButton(TypeBoundary); + RBCone->setObjectName(QString::fromUtf8("RBCone")); + QIcon icon2; + icon2.addFile(QString::fromUtf8("../../resources/cone.png"), QSize(), QIcon::Normal, QIcon::Off); + RBCone->setIcon(icon2); + + gridLayout->addWidget(RBCone, 0, 2, 1, 1); + + + gridLayout_4->addWidget(TypeBoundary, 1, 0, 1, 2); + + gBCylindre = new QGroupBox(CreateBoundaryAn); + gBCylindre->setObjectName(QString::fromUtf8("gBCylindre")); + sizePolicy.setHeightForWidth(gBCylindre->sizePolicy().hasHeightForWidth()); + gBCylindre->setSizePolicy(sizePolicy); + gridLayout1 = new QGridLayout(gBCylindre); +#ifndef Q_OS_MAC + gridLayout1->setSpacing(6); +#endif +#ifndef Q_OS_MAC + gridLayout1->setContentsMargins(9, 9, 9, 9); +#endif + gridLayout1->setObjectName(QString::fromUtf8("gridLayout1")); + SpinBox_Xcent = new QDoubleSpinBox(gBCylindre); + SpinBox_Xcent->setObjectName(QString::fromUtf8("SpinBox_Xcent")); + SpinBox_Xcent->setDecimals(5); + SpinBox_Xcent->setMinimum(-1e+09); + SpinBox_Xcent->setMaximum(1e+09); + SpinBox_Xcent->setValue(0); + + gridLayout1->addWidget(SpinBox_Xcent, 0, 1, 1, 1); + + TLXcent = new QLabel(gBCylindre); + TLXcent->setObjectName(QString::fromUtf8("TLXcent")); + sizePolicy.setHeightForWidth(TLXcent->sizePolicy().hasHeightForWidth()); + TLXcent->setSizePolicy(sizePolicy); + TLXcent->setWordWrap(false); + + gridLayout1->addWidget(TLXcent, 0, 0, 1, 1); + + SpinBox_Radius = new QDoubleSpinBox(gBCylindre); + SpinBox_Radius->setObjectName(QString::fromUtf8("SpinBox_Radius")); + SpinBox_Radius->setDecimals(5); + SpinBox_Radius->setMaximum(1e+09); + + gridLayout1->addWidget(SpinBox_Radius, 3, 1, 1, 2); + + SpinBox_Zcent = new QDoubleSpinBox(gBCylindre); + SpinBox_Zcent->setObjectName(QString::fromUtf8("SpinBox_Zcent")); + SpinBox_Zcent->setDecimals(5); + SpinBox_Zcent->setMinimum(-1e+09); + SpinBox_Zcent->setMaximum(1e+09); + SpinBox_Zcent->setValue(0); + + gridLayout1->addWidget(SpinBox_Zcent, 2, 1, 1, 1); + + TLradius = new QLabel(gBCylindre); + TLradius->setObjectName(QString::fromUtf8("TLradius")); + sizePolicy.setHeightForWidth(TLradius->sizePolicy().hasHeightForWidth()); + TLradius->setSizePolicy(sizePolicy); + TLradius->setWordWrap(false); + + gridLayout1->addWidget(TLradius, 3, 0, 1, 1); + + TLZcent = new QLabel(gBCylindre); + TLZcent->setObjectName(QString::fromUtf8("TLZcent")); + sizePolicy.setHeightForWidth(TLZcent->sizePolicy().hasHeightForWidth()); + TLZcent->setSizePolicy(sizePolicy); + TLZcent->setWordWrap(false); + + gridLayout1->addWidget(TLZcent, 2, 0, 1, 1); + + TLYcent = new QLabel(gBCylindre); + TLYcent->setObjectName(QString::fromUtf8("TLYcent")); + sizePolicy.setHeightForWidth(TLYcent->sizePolicy().hasHeightForWidth()); + TLYcent->setSizePolicy(sizePolicy); + TLYcent->setWordWrap(false); + + gridLayout1->addWidget(TLYcent, 1, 0, 1, 1); + + SpinBox_Ycent = new QDoubleSpinBox(gBCylindre); + SpinBox_Ycent->setObjectName(QString::fromUtf8("SpinBox_Ycent")); + SpinBox_Ycent->setDecimals(5); + SpinBox_Ycent->setMinimum(-1e+09); + SpinBox_Ycent->setMaximum(1e+09); + SpinBox_Ycent->setValue(0); + + gridLayout1->addWidget(SpinBox_Ycent, 1, 1, 1, 1); + + TLXaxis = new QLabel(gBCylindre); + TLXaxis->setObjectName(QString::fromUtf8("TLXaxis")); + sizePolicy.setHeightForWidth(TLXaxis->sizePolicy().hasHeightForWidth()); + TLXaxis->setSizePolicy(sizePolicy); + TLXaxis->setWordWrap(false); + + gridLayout1->addWidget(TLXaxis, 0, 2, 1, 1); + + TLYaxis = new QLabel(gBCylindre); + TLYaxis->setObjectName(QString::fromUtf8("TLYaxis")); + sizePolicy.setHeightForWidth(TLYaxis->sizePolicy().hasHeightForWidth()); + TLYaxis->setSizePolicy(sizePolicy); + TLYaxis->setWordWrap(false); + + gridLayout1->addWidget(TLYaxis, 1, 2, 1, 1); + + TLZaxis = new QLabel(gBCylindre); + TLZaxis->setObjectName(QString::fromUtf8("TLZaxis")); + sizePolicy.setHeightForWidth(TLZaxis->sizePolicy().hasHeightForWidth()); + TLZaxis->setSizePolicy(sizePolicy); + TLZaxis->setWordWrap(false); + + gridLayout1->addWidget(TLZaxis, 2, 2, 1, 1); + + SpinBox_Zaxis = new QDoubleSpinBox(gBCylindre); + SpinBox_Zaxis->setObjectName(QString::fromUtf8("SpinBox_Zaxis")); + SpinBox_Zaxis->setDecimals(5); + SpinBox_Zaxis->setMinimum(-1e+09); + SpinBox_Zaxis->setMaximum(1e+09); + SpinBox_Zaxis->setValue(0); + + gridLayout1->addWidget(SpinBox_Zaxis, 2, 3, 1, 1); + + SpinBox_Yaxis = new QDoubleSpinBox(gBCylindre); + SpinBox_Yaxis->setObjectName(QString::fromUtf8("SpinBox_Yaxis")); + SpinBox_Yaxis->setDecimals(5); + SpinBox_Yaxis->setMinimum(-1e+09); + SpinBox_Yaxis->setMaximum(1e+09); + SpinBox_Yaxis->setValue(0); + + gridLayout1->addWidget(SpinBox_Yaxis, 1, 3, 1, 1); + + SpinBox_Xaxis = new QDoubleSpinBox(gBCylindre); + SpinBox_Xaxis->setObjectName(QString::fromUtf8("SpinBox_Xaxis")); + SpinBox_Xaxis->setDecimals(5); + SpinBox_Xaxis->setMinimum(-1e+09); + SpinBox_Xaxis->setMaximum(1e+09); + SpinBox_Xaxis->setValue(0); + + gridLayout1->addWidget(SpinBox_Xaxis, 0, 3, 1, 1); + + + gridLayout_4->addWidget(gBCylindre, 2, 0, 1, 2); + + gBSphere = new QGroupBox(CreateBoundaryAn); + gBSphere->setObjectName(QString::fromUtf8("gBSphere")); + sizePolicy.setHeightForWidth(gBSphere->sizePolicy().hasHeightForWidth()); + gBSphere->setSizePolicy(sizePolicy); + gridLayout2 = new QGridLayout(gBSphere); +#ifndef Q_OS_MAC + gridLayout2->setSpacing(6); +#endif +#ifndef Q_OS_MAC + gridLayout2->setContentsMargins(9, 9, 9, 9); +#endif + gridLayout2->setObjectName(QString::fromUtf8("gridLayout2")); + SpinBox_Rayon = new QDoubleSpinBox(gBSphere); + SpinBox_Rayon->setObjectName(QString::fromUtf8("SpinBox_Rayon")); + SpinBox_Rayon->setDecimals(5); + SpinBox_Rayon->setMinimum(0); + SpinBox_Rayon->setMaximum(1e+09); + SpinBox_Rayon->setValue(0); + + gridLayout2->addWidget(SpinBox_Rayon, 1, 3, 1, 1); + + SpinBox_Zcentre = new QDoubleSpinBox(gBSphere); + SpinBox_Zcentre->setObjectName(QString::fromUtf8("SpinBox_Zcentre")); + SpinBox_Zcentre->setDecimals(5); + SpinBox_Zcentre->setMinimum(-1e+09); + SpinBox_Zcentre->setMaximum(1e+09); + SpinBox_Zcentre->setValue(0); + + gridLayout2->addWidget(SpinBox_Zcentre, 2, 1, 1, 1); + + TLRayon = new QLabel(gBSphere); + TLRayon->setObjectName(QString::fromUtf8("TLRayon")); + sizePolicy.setHeightForWidth(TLRayon->sizePolicy().hasHeightForWidth()); + TLRayon->setSizePolicy(sizePolicy); + TLRayon->setWordWrap(false); + + gridLayout2->addWidget(TLRayon, 1, 2, 1, 1); + + TLZcentre = new QLabel(gBSphere); + TLZcentre->setObjectName(QString::fromUtf8("TLZcentre")); + sizePolicy.setHeightForWidth(TLZcentre->sizePolicy().hasHeightForWidth()); + TLZcentre->setSizePolicy(sizePolicy); + TLZcentre->setWordWrap(false); + + gridLayout2->addWidget(TLZcentre, 2, 0, 1, 1); + + TLYcentre = new QLabel(gBSphere); + TLYcentre->setObjectName(QString::fromUtf8("TLYcentre")); + sizePolicy.setHeightForWidth(TLYcentre->sizePolicy().hasHeightForWidth()); + TLYcentre->setSizePolicy(sizePolicy); + TLYcentre->setWordWrap(false); + + gridLayout2->addWidget(TLYcentre, 1, 0, 1, 1); + + SpinBox_Ycentre = new QDoubleSpinBox(gBSphere); + SpinBox_Ycentre->setObjectName(QString::fromUtf8("SpinBox_Ycentre")); + SpinBox_Ycentre->setDecimals(5); + SpinBox_Ycentre->setMinimum(-1e+09); + SpinBox_Ycentre->setMaximum(1e+09); + SpinBox_Ycentre->setValue(0); + + gridLayout2->addWidget(SpinBox_Ycentre, 1, 1, 1, 1); + + SpinBox_Xcentre = new QDoubleSpinBox(gBSphere); + SpinBox_Xcentre->setObjectName(QString::fromUtf8("SpinBox_Xcentre")); + SpinBox_Xcentre->setDecimals(5); + SpinBox_Xcentre->setMinimum(-1e+09); + SpinBox_Xcentre->setMaximum(1e+09); + SpinBox_Xcentre->setValue(0); + + gridLayout2->addWidget(SpinBox_Xcentre, 0, 1, 1, 1); + + TLXcentre = new QLabel(gBSphere); + TLXcentre->setObjectName(QString::fromUtf8("TLXcentre")); + sizePolicy.setHeightForWidth(TLXcentre->sizePolicy().hasHeightForWidth()); + TLXcentre->setSizePolicy(sizePolicy); + TLXcentre->setWordWrap(false); + + gridLayout2->addWidget(TLXcentre, 0, 0, 1, 1); + + + gridLayout_4->addWidget(gBSphere, 3, 0, 1, 2); + + gBCone = new QGroupBox(CreateBoundaryAn); + gBCone->setObjectName(QString::fromUtf8("gBCone")); + sizePolicy.setHeightForWidth(gBCone->sizePolicy().hasHeightForWidth()); + gBCone->setSizePolicy(sizePolicy); + gridLayout_3 = new QGridLayout(gBCone); + gridLayout_3->setObjectName(QString::fromUtf8("gridLayout_3")); + groupBox = new QGroupBox(gBCone); + groupBox->setObjectName(QString::fromUtf8("groupBox")); + gridLayout_2 = new QGridLayout(groupBox); + gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2")); + RB_Def_radius = new QRadioButton(groupBox); + RB_Def_radius->setObjectName(QString::fromUtf8("RB_Def_radius")); + QIcon icon3; + icon3.addFile(QString::fromUtf8("../../resources/conedxyz.png"), QSize(), QIcon::Normal, QIcon::Off); + RB_Def_radius->setIcon(icon3); + RB_Def_radius->setChecked(true); + + gridLayout_2->addWidget(RB_Def_radius, 0, 0, 1, 1); + + RB_Def_angle = new QRadioButton(groupBox); + RB_Def_angle->setObjectName(QString::fromUtf8("RB_Def_angle")); + QIcon icon4; + icon4.addFile(QString::fromUtf8("../../resources/conepointvector.png"), QSize(), QIcon::Normal, QIcon::Off); + RB_Def_angle->setIcon(icon4); + + gridLayout_2->addWidget(RB_Def_angle, 0, 1, 1, 1); + + + gridLayout_3->addWidget(groupBox, 0, 0, 1, 2); + + TLCone_X1 = new QLabel(gBCone); + TLCone_X1->setObjectName(QString::fromUtf8("TLCone_X1")); + sizePolicy.setHeightForWidth(TLCone_X1->sizePolicy().hasHeightForWidth()); + TLCone_X1->setSizePolicy(sizePolicy); + TLCone_X1->setWordWrap(false); + + gridLayout_3->addWidget(TLCone_X1, 1, 0, 1, 1); + + SpinBox_Cone_X1 = new QDoubleSpinBox(gBCone); + SpinBox_Cone_X1->setObjectName(QString::fromUtf8("SpinBox_Cone_X1")); + SpinBox_Cone_X1->setDecimals(5); + SpinBox_Cone_X1->setMinimum(-1e+09); + SpinBox_Cone_X1->setMaximum(1e+09); + SpinBox_Cone_X1->setValue(0); + + gridLayout_3->addWidget(SpinBox_Cone_X1, 1, 1, 1, 1); + + TLCone_X2 = new QLabel(gBCone); + TLCone_X2->setObjectName(QString::fromUtf8("TLCone_X2")); + sizePolicy.setHeightForWidth(TLCone_X2->sizePolicy().hasHeightForWidth()); + TLCone_X2->setSizePolicy(sizePolicy); + TLCone_X2->setWordWrap(false); + + gridLayout_3->addWidget(TLCone_X2, 1, 2, 1, 1); + + SpinBox_Cone_X2 = new QDoubleSpinBox(gBCone); + SpinBox_Cone_X2->setObjectName(QString::fromUtf8("SpinBox_Cone_X2")); + SpinBox_Cone_X2->setDecimals(5); + SpinBox_Cone_X2->setMinimum(-1e+09); + SpinBox_Cone_X2->setMaximum(1e+09); + SpinBox_Cone_X2->setValue(0); + + gridLayout_3->addWidget(SpinBox_Cone_X2, 1, 3, 1, 1); + + TLCone_Y1 = new QLabel(gBCone); + TLCone_Y1->setObjectName(QString::fromUtf8("TLCone_Y1")); + sizePolicy.setHeightForWidth(TLCone_Y1->sizePolicy().hasHeightForWidth()); + TLCone_Y1->setSizePolicy(sizePolicy); + TLCone_Y1->setWordWrap(false); + + gridLayout_3->addWidget(TLCone_Y1, 2, 0, 1, 1); + + SpinBox_Cone_Y1 = new QDoubleSpinBox(gBCone); + SpinBox_Cone_Y1->setObjectName(QString::fromUtf8("SpinBox_Cone_Y1")); + SpinBox_Cone_Y1->setDecimals(5); + SpinBox_Cone_Y1->setMinimum(-1e+09); + SpinBox_Cone_Y1->setMaximum(1e+09); + SpinBox_Cone_Y1->setValue(0); + + gridLayout_3->addWidget(SpinBox_Cone_Y1, 2, 1, 1, 1); + + TLCone_Y2 = new QLabel(gBCone); + TLCone_Y2->setObjectName(QString::fromUtf8("TLCone_Y2")); + sizePolicy.setHeightForWidth(TLCone_Y2->sizePolicy().hasHeightForWidth()); + TLCone_Y2->setSizePolicy(sizePolicy); + TLCone_Y2->setWordWrap(false); + + gridLayout_3->addWidget(TLCone_Y2, 2, 2, 1, 1); + + SpinBox_Cone_Y2 = new QDoubleSpinBox(gBCone); + SpinBox_Cone_Y2->setObjectName(QString::fromUtf8("SpinBox_Cone_Y2")); + SpinBox_Cone_Y2->setDecimals(5); + SpinBox_Cone_Y2->setMinimum(-1e+09); + SpinBox_Cone_Y2->setMaximum(1e+09); + SpinBox_Cone_Y2->setValue(0); + + gridLayout_3->addWidget(SpinBox_Cone_Y2, 2, 3, 1, 1); + + TLCone_Z1 = new QLabel(gBCone); + TLCone_Z1->setObjectName(QString::fromUtf8("TLCone_Z1")); + sizePolicy.setHeightForWidth(TLCone_Z1->sizePolicy().hasHeightForWidth()); + TLCone_Z1->setSizePolicy(sizePolicy); + TLCone_Z1->setWordWrap(false); + + gridLayout_3->addWidget(TLCone_Z1, 3, 0, 1, 1); + + SpinBox_Cone_Z1 = new QDoubleSpinBox(gBCone); + SpinBox_Cone_Z1->setObjectName(QString::fromUtf8("SpinBox_Cone_Z1")); + SpinBox_Cone_Z1->setDecimals(5); + SpinBox_Cone_Z1->setMinimum(-1e+09); + SpinBox_Cone_Z1->setMaximum(1e+09); + SpinBox_Cone_Z1->setValue(0); + + gridLayout_3->addWidget(SpinBox_Cone_Z1, 3, 1, 1, 1); + + TLCone_Z2 = new QLabel(gBCone); + TLCone_Z2->setObjectName(QString::fromUtf8("TLCone_Z2")); + sizePolicy.setHeightForWidth(TLCone_Z2->sizePolicy().hasHeightForWidth()); + TLCone_Z2->setSizePolicy(sizePolicy); + TLCone_Z2->setWordWrap(false); + + gridLayout_3->addWidget(TLCone_Z2, 3, 2, 1, 1); + + SpinBox_Cone_Z2 = new QDoubleSpinBox(gBCone); + SpinBox_Cone_Z2->setObjectName(QString::fromUtf8("SpinBox_Cone_Z2")); + SpinBox_Cone_Z2->setDecimals(5); + SpinBox_Cone_Z2->setMinimum(-1e+09); + SpinBox_Cone_Z2->setMaximum(1e+09); + SpinBox_Cone_Z2->setValue(0); + + gridLayout_3->addWidget(SpinBox_Cone_Z2, 3, 3, 1, 1); + + TLCone_V1 = new QLabel(gBCone); + TLCone_V1->setObjectName(QString::fromUtf8("TLCone_V1")); + sizePolicy.setHeightForWidth(TLCone_V1->sizePolicy().hasHeightForWidth()); + TLCone_V1->setSizePolicy(sizePolicy); + TLCone_V1->setWordWrap(false); + + gridLayout_3->addWidget(TLCone_V1, 4, 0, 1, 1); + + SpinBox_Cone_V1 = new QDoubleSpinBox(gBCone); + SpinBox_Cone_V1->setObjectName(QString::fromUtf8("SpinBox_Cone_V1")); + SpinBox_Cone_V1->setDecimals(14); + SpinBox_Cone_V1->setMaximum(1e+09); + + gridLayout_3->addWidget(SpinBox_Cone_V1, 4, 1, 1, 1); + + TLCone_V2 = new QLabel(gBCone); + TLCone_V2->setObjectName(QString::fromUtf8("TLCone_V2")); + sizePolicy.setHeightForWidth(TLCone_V2->sizePolicy().hasHeightForWidth()); + TLCone_V2->setSizePolicy(sizePolicy); + TLCone_V2->setWordWrap(false); + + gridLayout_3->addWidget(TLCone_V2, 4, 2, 1, 1); - QSize size(458, 500); - size = size.expandedTo(CreateBoundaryAn->minimumSizeHint()); - CreateBoundaryAn->resize(size); - - - QMetaObject::connectSlotsByName(CreateBoundaryAn); + SpinBox_Cone_V2 = new QDoubleSpinBox(gBCone); + SpinBox_Cone_V2->setObjectName(QString::fromUtf8("SpinBox_Cone_V2")); + SpinBox_Cone_V2->setDecimals(14); + SpinBox_Cone_V2->setMaximum(1e+09); + + gridLayout_3->addWidget(SpinBox_Cone_V2, 4, 3, 1, 1); + + + gridLayout_4->addWidget(gBCone, 4, 0, 1, 2); + + GBButtons = new QGroupBox(CreateBoundaryAn); + GBButtons->setObjectName(QString::fromUtf8("GBButtons")); + sizePolicy.setHeightForWidth(GBButtons->sizePolicy().hasHeightForWidth()); + GBButtons->setSizePolicy(sizePolicy); + gridLayout3 = new QGridLayout(GBButtons); +#ifndef Q_OS_MAC + gridLayout3->setSpacing(6); +#endif +#ifndef Q_OS_MAC + gridLayout3->setContentsMargins(9, 9, 9, 9); +#endif + gridLayout3->setObjectName(QString::fromUtf8("gridLayout3")); + buttonHelp = new QPushButton(GBButtons); + buttonHelp->setObjectName(QString::fromUtf8("buttonHelp")); + + gridLayout3->addWidget(buttonHelp, 0, 3, 1, 1); + + buttonCancel = new QPushButton(GBButtons); + buttonCancel->setObjectName(QString::fromUtf8("buttonCancel")); + + gridLayout3->addWidget(buttonCancel, 0, 2, 1, 1); + + buttonApply = new QPushButton(GBButtons); + buttonApply->setObjectName(QString::fromUtf8("buttonApply")); + + gridLayout3->addWidget(buttonApply, 0, 1, 1, 1); + + buttonOk = new QPushButton(GBButtons); + buttonOk->setObjectName(QString::fromUtf8("buttonOk")); + + gridLayout3->addWidget(buttonOk, 0, 0, 1, 1); + + + gridLayout_4->addWidget(GBButtons, 5, 0, 1, 2); + + + retranslateUi(CreateBoundaryAn); + + QMetaObject::connectSlotsByName(CreateBoundaryAn); } // setupUi void retranslateUi(QDialog *CreateBoundaryAn) { - CreateBoundaryAn->setWindowTitle(QApplication::translate("CreateBoundaryAn", "Create an analytical boundary", 0, QApplication::UnicodeUTF8)); - GBButtons->setTitle(QString()); - buttonHelp->setText(QApplication::translate("CreateBoundaryAn", "Help", 0, QApplication::UnicodeUTF8)); - buttonCancel->setText(QApplication::translate("CreateBoundaryAn", "Cancel", 0, QApplication::UnicodeUTF8)); - buttonApply->setText(QApplication::translate("CreateBoundaryAn", "Apply", 0, QApplication::UnicodeUTF8)); - buttonOk->setText(QApplication::translate("CreateBoundaryAn", "OK", 0, QApplication::UnicodeUTF8)); - Name->setText(QApplication::translate("CreateBoundaryAn", "Name", 0, QApplication::UnicodeUTF8)); - TypeBoundary->setTitle(QApplication::translate("CreateBoundaryAn", "Type of boundary", 0, QApplication::UnicodeUTF8)); - RBCylindre->setText(QApplication::translate("CreateBoundaryAn", "Cylinder", 0, QApplication::UnicodeUTF8)); - RBSphere->setText(QApplication::translate("CreateBoundaryAn", "Sphere", 0, QApplication::UnicodeUTF8)); - gBSphere->setTitle(QApplication::translate("CreateBoundaryAn", "Coordinates", 0, QApplication::UnicodeUTF8)); - TLRayon->setText(QApplication::translate("CreateBoundaryAn", "Radius", 0, QApplication::UnicodeUTF8)); - TLZcentre->setText(QApplication::translate("CreateBoundaryAn", "Z centre", 0, QApplication::UnicodeUTF8)); - TLYcentre->setText(QApplication::translate("CreateBoundaryAn", "Y centre", 0, QApplication::UnicodeUTF8)); - TLXcentre->setText(QApplication::translate("CreateBoundaryAn", "X centre", 0, QApplication::UnicodeUTF8)); - gBCylindre->setTitle(QApplication::translate("CreateBoundaryAn", "Coordinates", 0, QApplication::UnicodeUTF8)); - TLXcent->setText(QApplication::translate("CreateBoundaryAn", "X centre", 0, QApplication::UnicodeUTF8)); - TLradius->setText(QApplication::translate("CreateBoundaryAn", "Radius", 0, QApplication::UnicodeUTF8)); - TLZcent->setText(QApplication::translate("CreateBoundaryAn", "Z centre", 0, QApplication::UnicodeUTF8)); - TLYcent->setText(QApplication::translate("CreateBoundaryAn", "Y centre", 0, QApplication::UnicodeUTF8)); - TLXaxis->setText(QApplication::translate("CreateBoundaryAn", "X axis", 0, QApplication::UnicodeUTF8)); - TLYaxis->setText(QApplication::translate("CreateBoundaryAn", "Y axis", 0, QApplication::UnicodeUTF8)); - TLZaxis->setText(QApplication::translate("CreateBoundaryAn", "Z axis", 0, QApplication::UnicodeUTF8)); - Q_UNUSED(CreateBoundaryAn); + CreateBoundaryAn->setWindowTitle(QApplication::translate("CreateBoundaryAn", "Create an analytical boundary", 0, QApplication::UnicodeUTF8)); + Name->setText(QApplication::translate("CreateBoundaryAn", "Name", 0, QApplication::UnicodeUTF8)); + TypeBoundary->setTitle(QApplication::translate("CreateBoundaryAn", "Type of boundary", 0, QApplication::UnicodeUTF8)); + RBCylindre->setText(QApplication::translate("CreateBoundaryAn", "Cylinder", 0, QApplication::UnicodeUTF8)); + RBSphere->setText(QApplication::translate("CreateBoundaryAn", "Sphere", 0, QApplication::UnicodeUTF8)); + RBCone->setText(QApplication::translate("CreateBoundaryAn", "Cone", 0, QApplication::UnicodeUTF8)); + gBCylindre->setTitle(QApplication::translate("CreateBoundaryAn", "Coordinates", 0, QApplication::UnicodeUTF8)); + TLXcent->setText(QApplication::translate("CreateBoundaryAn", "X centre", 0, QApplication::UnicodeUTF8)); + TLradius->setText(QApplication::translate("CreateBoundaryAn", "Radius", 0, QApplication::UnicodeUTF8)); + TLZcent->setText(QApplication::translate("CreateBoundaryAn", "Z centre", 0, QApplication::UnicodeUTF8)); + TLYcent->setText(QApplication::translate("CreateBoundaryAn", "Y centre", 0, QApplication::UnicodeUTF8)); + TLXaxis->setText(QApplication::translate("CreateBoundaryAn", "X axis", 0, QApplication::UnicodeUTF8)); + TLYaxis->setText(QApplication::translate("CreateBoundaryAn", "Y axis", 0, QApplication::UnicodeUTF8)); + TLZaxis->setText(QApplication::translate("CreateBoundaryAn", "Z axis", 0, QApplication::UnicodeUTF8)); + gBSphere->setTitle(QApplication::translate("CreateBoundaryAn", "Coordinates", 0, QApplication::UnicodeUTF8)); + TLRayon->setText(QApplication::translate("CreateBoundaryAn", "Radius", 0, QApplication::UnicodeUTF8)); + TLZcentre->setText(QApplication::translate("CreateBoundaryAn", "Z centre", 0, QApplication::UnicodeUTF8)); + TLYcentre->setText(QApplication::translate("CreateBoundaryAn", "Y centre", 0, QApplication::UnicodeUTF8)); + TLXcentre->setText(QApplication::translate("CreateBoundaryAn", "X centre", 0, QApplication::UnicodeUTF8)); + gBCone->setTitle(QApplication::translate("CreateBoundaryAn", "Coordinates", 0, QApplication::UnicodeUTF8)); + groupBox->setTitle(QApplication::translate("CreateBoundaryAn", "Definition", 0, QApplication::UnicodeUTF8)); + RB_Def_radius->setText(QApplication::translate("CreateBoundaryAn", "Radius", 0, QApplication::UnicodeUTF8)); + RB_Def_angle->setText(QApplication::translate("CreateBoundaryAn", "Angle", 0, QApplication::UnicodeUTF8)); + TLCone_X1->setText(QApplication::translate("CreateBoundaryAn", "X 1", 0, QApplication::UnicodeUTF8)); + TLCone_X2->setText(QApplication::translate("CreateBoundaryAn", "X 2", 0, QApplication::UnicodeUTF8)); + TLCone_Y1->setText(QApplication::translate("CreateBoundaryAn", "Y 1", 0, QApplication::UnicodeUTF8)); + TLCone_Y2->setText(QApplication::translate("CreateBoundaryAn", "Y 2", 0, QApplication::UnicodeUTF8)); + TLCone_Z1->setText(QApplication::translate("CreateBoundaryAn", "Z 1", 0, QApplication::UnicodeUTF8)); + TLCone_Z2->setText(QApplication::translate("CreateBoundaryAn", "Z 2", 0, QApplication::UnicodeUTF8)); + TLCone_V1->setText(QApplication::translate("CreateBoundaryAn", "V 1", 0, QApplication::UnicodeUTF8)); + TLCone_V2->setText(QApplication::translate("CreateBoundaryAn", "V 2", 0, QApplication::UnicodeUTF8)); + GBButtons->setTitle(QString()); + buttonHelp->setText(QApplication::translate("CreateBoundaryAn", "Help", 0, QApplication::UnicodeUTF8)); + buttonCancel->setText(QApplication::translate("CreateBoundaryAn", "Cancel", 0, QApplication::UnicodeUTF8)); + buttonApply->setText(QApplication::translate("CreateBoundaryAn", "Apply", 0, QApplication::UnicodeUTF8)); + buttonOk->setText(QApplication::translate("CreateBoundaryAn", "OK", 0, QApplication::UnicodeUTF8)); } // retranslateUi }; @@ -441,4 +618,6 @@ namespace Ui { class CreateBoundaryAn: public Ui_CreateBoundaryAn {}; } // namespace Ui +QT_END_NAMESPACE + #endif // CREATEBOUNDARYAN_H diff --git a/src/HOMARDGUI/CreateBoundaryAn.ui b/src/HOMARDGUI/CreateBoundaryAn.ui index 0750df02..b35422c3 100644 --- a/src/HOMARDGUI/CreateBoundaryAn.ui +++ b/src/HOMARDGUI/CreateBoundaryAn.ui @@ -1,558 +1,823 @@ - + + CreateBoundaryAn - - + + 0 0 - 458 - 500 + 527 + 701 - + Create an analytical boundary - + true - + true - - - 9 - - - 6 - - - - - - 0 - 0 - 0 - 0 - - - - - - - - 9 - - - 6 - - - - - Help - - - - - - - Cancel - - - - - - - Apply - - - - - - - OK - - - - - - - - - + + + + Name - - - + + + 32 - - - - - 0 - 0 + + + + 0 0 - + 340 0 - + Type of boundary - - - 9 - - - 6 - - - - + + + + Cylinder - - ../../resources/cylinderpointvector.png + + + ../../resources/cylinderpointvector.png../../resources/cylinderpointvector.png - + true - + true - - - + + + Sphere - - ../../resources/zone_spherepoint.png + + + ../../resources/zone_spherepoint.png../../resources/zone_spherepoint.png + + + + + + + Cone + + + + ../../resources/cone.png../../resources/cone.png - - - - - 0 - 0 + + + + 0 0 - + Coordinates - - + + 9 - + 6 - - - + + + 5 - + + -999999999.000000000000000 + + 999999999.000000000000000 - + 0.000000000000000 - - 0.000000000000000 + + + + + + + 0 + 0 + + + + X centre + + + false - - - + + + 5 - - 999999999.000000000000000 + + 1000000000.000000000000000 + + + + + + + 5 - + -999999999.000000000000000 - + + 999999999.000000000000000 + + 0.000000000000000 - - - - - 0 - 0 + + + + 0 0 - + Radius - + false - - - - - 0 - 0 + + + + 0 0 - + Z centre - + false - - - - - 0 - 0 + + + + 0 0 - + Y centre - + false - - - + + + 5 - - 999999999.000000000000000 - - + -999999999.000000000000000 - + + 999999999.000000000000000 + + 0.000000000000000 - - - - 5 + + + + + 0 + 0 + - - 999999999.000000000000000 + + X axis - - -999999999.000000000000000 + + false - - 0.000000000000000 + + + + + + + 0 + 0 + + + + Y axis + + + false - - - - - 0 - 0 + + + + 0 0 - - X centre + + Z axis - + false + + + + 5 + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + 0.000000000000000 + + + + + + + 5 + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + 0.000000000000000 + + + + + + + 5 + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + 0.000000000000000 + + + - - - - - 0 - 0 + + + + 0 0 - + Coordinates - - + + 9 - + 6 - - - + + + 5 - + + 0.000000000000000 + + 999999999.000000000000000 - + + 0.000000000000000 + + + + + + + 5 + + -999999999.000000000000000 - + + 999999999.000000000000000 + + 0.000000000000000 - - - - - 0 - 0 + + + + 0 0 - - X centre + + Radius - + false - - - - 5 + + + + + 0 + 0 + - - 1000000000.000000000000000 + + Z centre + + + false - - - + + + + + 0 + 0 + + + + Y centre + + + false + + + + + + 5 - + + -999999999.000000000000000 + + 999999999.000000000000000 - + + 0.000000000000000 + + + + + + + 5 + + -999999999.000000000000000 - + + 999999999.000000000000000 + + 0.000000000000000 - - - - - 0 - 0 + + + + 0 0 - - Radius + + X centre - + false - - - - - 0 - 0 + + + + + + + + 0 + 0 + + + + Coordinates + + + + + + Definition + + + + + + Radius + + + + ../../resources/conedxyz.png../../resources/conedxyz.png + + + true + + + + + + + Angle + + + + ../../resources/conepointvector.png../../resources/conepointvector.png + + + + + + + + + + 0 0 - - Z centre + + X 1 - + false - - - - - 0 - 0 + + + + 5 + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + 0.000000000000000 + + + + + + + 0 0 - - Y centre + + X 2 - + false - - - + + + 5 - - 999999999.000000000000000 - - + -999999999.000000000000000 - + + 999999999.000000000000000 + + 0.000000000000000 - - - - - 0 - 0 + + + + 0 0 - - X axis + + Y 1 - + false - - - - - 0 - 0 + + + + 5 + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + 0.000000000000000 + + + + + + + 0 0 - - Y axis + + Y 2 - + false - - - - - 0 - 0 + + + + 5 + + + -999999999.000000000000000 + + + 999999999.000000000000000 + + + 0.000000000000000 + + + + + + + 0 0 - - Z axis + + Z 1 - + false - - - + + + 5 - - 999999999.000000000000000 - - + -999999999.000000000000000 - + + 999999999.000000000000000 + + 0.000000000000000 - - - - 5 + + + + + 0 + 0 + - - 999999999.000000000000000 + + Z 2 - + + false + + + + + + + 5 + + -999999999.000000000000000 - + + 999999999.000000000000000 + + 0.000000000000000 - - - - 5 + + + + + 0 + 0 + - - 999999999.000000000000000 + + V 1 - - -999999999.000000000000000 + + false - - 0.000000000000000 + + + + + + 14 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + V 2 + + + false + + + + + + + 14 + + + 1000000000.000000000000000 + + + + + + + + + + + 0 + 0 + + + + + + + + 9 + + + 6 + + + + + Help + + + + + + + Cancel + + + + + + + Apply + + + + + + + OK diff --git a/src/HOMARDGUI/HOMARDGUI.cxx b/src/HOMARDGUI/HOMARDGUI.cxx index 610157b3..1009c23e 100644 --- a/src/HOMARDGUI/HOMARDGUI.cxx +++ b/src/HOMARDGUI/HOMARDGUI.cxx @@ -287,7 +287,7 @@ bool HOMARDGUI::OnGUIEvent (int theCommandID) catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); getApp()->updateObjectBrowser(); return false; } @@ -370,7 +370,7 @@ bool HOMARDGUI::OnGUIEvent (int theCommandID) catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); getApp()->updateObjectBrowser(); return false; } @@ -383,7 +383,7 @@ bool HOMARDGUI::OnGUIEvent (int theCommandID) catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); getApp()->updateObjectBrowser(); return false; } @@ -396,7 +396,7 @@ bool HOMARDGUI::OnGUIEvent (int theCommandID) catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); getApp()->updateObjectBrowser(); return false; } @@ -409,7 +409,7 @@ bool HOMARDGUI::OnGUIEvent (int theCommandID) catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); getApp()->updateObjectBrowser(); return false; } @@ -422,7 +422,7 @@ bool HOMARDGUI::OnGUIEvent (int theCommandID) catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); getApp()->updateObjectBrowser(); return false; } diff --git a/src/HOMARDGUI/HOMARD_msg_fr.ts b/src/HOMARDGUI/HOMARD_msg_fr.ts index 4d0509b9..40abcbdb 100644 --- a/src/HOMARDGUI/HOMARD_msg_fr.ts +++ b/src/HOMARDGUI/HOMARD_msg_fr.ts @@ -351,6 +351,74 @@ Previous iteration Itération précédente + + Invalid boundary + Frontière non valable + + + Invalid case + Cas non valable + + + Invalid case context + Cas contextuel non valable + + + Invalid hypothesis + Hypothèse non valable + + + Invalid iteration + Itération non valable + + + Invalid zone + Zone non valable + + + This boundary has already been defined. + Cette frontière est déjà définie. + + + This case has already been defined. + Ce cas est déjà défini. + + + This hypothesis has already been defined. + Cette hypothèse est déjà définie. + + + This iteration has already been defined. + Cette itération est déjà définie. + + + This zone has already been defined. + Cette zone est déjà définie. + + + The parent iteration is not defined. + L'itération parent n'est pas définie. + + + Unable to create the iteration. + Impossible de créer l'itération. + + + This iteration is the first of the case and cannot be computed. + Cette itération définit le point de départ du cas. Elle ne peut pas être calculée. + + + This iteration does not have any associated hypothesis. + Cette itération n'est associée à aucune hypothèse. + + + The mesh file does not exist. + Le fichier du maillage n'existe pas. + + + The mesh file cannot be deleted. + Impossible de supprimer le fichier du maillage. + Mesh n Maillage n @@ -603,6 +671,14 @@ Radius Rayon + + Radius 1 + Rayon 1 + + + Radius 2 + Rayon 2 + External radius Rayon externe @@ -641,7 +717,7 @@ HOM_AXE - L'axe doit être un vecteur non nul. + L'axe doit être un vecteur non nul. HOM_BOUN_A_EDIT_WINDOW_TITLE @@ -655,6 +731,58 @@ HOM_GROU_EDIT_WINDOW_TITLE Groupes choisis + + The height must be positive. + La hauteur doit être positive. + + + The radius must be positive. + Un rayon doit être positif. + + + The axis must be a non 0 vector. + L'axe doit être un vecteur non nul. + + + The angle must be included higher than 0 degree and lower than 90 degrees. + L'angle doit être compris entre 0 et 90 degrés. + + + The radius must be different. + Les rayons doivent être différents. + + + The centers must be different. + Les centres doivent être différents. + + + The external radius must be higher than the internal radius. + Le rayon externe doit être supérieur au rayon interne. + + + The X coordinates are not coherent. + Les coordonnées en X ne sont pas cohérentes. + + + The Y coordinates are not coherent. + Les coordonnées en Y ne sont pas cohérentes. + + + The Z coordinates are not coherent. + Les coordonnées en Z ne sont pas cohérentes. + + + The first coordinates are not coherent. + Les premières coordonnées ne sont pas cohérentes. + + + The second coordinates are not coherent. + Les secondes coordonnées ne sont pas cohérentes. + + + The orientation must be 1, 2 or 3. + L'orientation vaut 1, 2 ou 3. + HOM_MESH_INFO_0 Analyse de maillage @@ -707,6 +835,30 @@ Entanglement Interpénétration + + No change is allowed in a boundary. Ask for evolution. + Impossible de changer une donnée dans une frontière. Demander une évolution. + + + This boundary is used in a case and cannot be deleted. + Cette frontière est utilisée dans un cas ; elle ne peut pas être détruite. + + + This hypothesis is used and cannot be deleted. + Cette hypothèse est utilisée dans une itération ; elle ne peut pas être détruite. + + + This iteration cannot be deleted. + Cette itération ne peut pas être détruite. + + + This zone is used in an hypothesis and cannot be deleted. + Cette zone est utilisée dans une hypothèse ; elle ne peut pas être détruite. + + + The directory for the calculation cannot be cleared. + Menage du repertoire de calcul impossible + Edit a file Affichage d'un fichier @@ -715,5 +867,9 @@ Print Imprimer + + Invalid study context + Etude contextuelle non valable + diff --git a/src/HOMARDGUI/HomardQtCommun.cxx b/src/HOMARDGUI/HomardQtCommun.cxx index f0168645..6f00f3ce 100644 --- a/src/HOMARDGUI/HomardQtCommun.cxx +++ b/src/HOMARDGUI/HomardQtCommun.cxx @@ -310,7 +310,7 @@ std::list HOMARD_QT_COMMUN::GetListeChamps(QString aFile) if (ncha < 1 ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QObject::tr("HOM_MED_FILE_5") ); + QObject::tr("HOM_MED_FILE_5") ); MEDfileClose(medIdt); return ListeChamp; } @@ -364,7 +364,7 @@ std::list HOMARD_QT_COMMUN::GetListeComposants(QString aFile, QString a if (ncha < 1 ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QObject::tr("HOM_MED_FILE_5") ); + QObject::tr("HOM_MED_FILE_5") ); MEDfileClose(medIdt); return ListeComposants; } diff --git a/src/HOMARDGUI/MonCreateBoundaryAn.cxx b/src/HOMARDGUI/MonCreateBoundaryAn.cxx index 57fa3090..5a2425b8 100644 --- a/src/HOMARDGUI/MonCreateBoundaryAn.cxx +++ b/src/HOMARDGUI/MonCreateBoundaryAn.cxx @@ -36,6 +36,8 @@ using namespace std; #include #include +#include "math.h" +#define PI 3.141592653589793 // ------------------------------------------------------------------------------------------------------------------------ MonCreateBoundaryAn::MonCreateBoundaryAn(MonCreateCase* parent, bool modal, HOMARD::HOMARD_Gen_var myHomardGen, @@ -49,11 +51,15 @@ MonCreateBoundaryAn::MonCreateBoundaryAn(MonCreateCase* parent, bool modal, _parent(parent), _aName (""), _aCaseName(caseName), + _Xmin(0), _Xmax(0), _Xincr(0), _Ymin(0), _Ymax(0), _Yincr(0), _Zmin(0), _Zmax(0), _Zincr(0), _DMax(0), _Type(1), _BoundaryAnXcentre(0), _BoundaryAnYcentre(0), _BoundaryAnZcentre(0), _BoundaryAnRayon(0), _BoundaryAnXaxis(0), _BoundaryAnYaxis(0), _BoundaryAnZaxis(0), _Xcentre(0), _Ycentre(0), _Zcentre(0), _Rayon(0), - _Xmin(0), _Xmax(0), _Xincr(0), _Ymin(0), _Ymax(0), _Yincr(0), _Zmin(0), _Zmax(0), _Zincr(0), _DMax(0), + _BoundaryAnXcone1(0), _BoundaryAnYcone1(0), _BoundaryAnZcone1(0), _BoundaryAnRayon1(0), + _BoundaryAnXcone2(0), _BoundaryAnYcone2(0), _BoundaryAnZcone2(0), _BoundaryAnRayon2(0), + _BoundaryAnXaxisCone(0), _BoundaryAnYaxisCone(0), _BoundaryAnZaxisCone(0), + _BoundaryAngle(0), Chgt (false) { MESSAGE("Constructeur") ; @@ -69,6 +75,15 @@ MonCreateBoundaryAn::MonCreateBoundaryAn(MonCreateCase* parent, bool modal, QPixmap pix2 = resMgr->loadPixmap( "HOMARD", "cylinderpointvector.png" ); QIcon IS2=QIcon(pix2); RBCylindre->setIcon(IS2); + QPixmap pix3 = resMgr->loadPixmap( "HOMARD", "cone.png" ); + QIcon IS3=QIcon(pix3); + RBCone->setIcon(IS3); + QPixmap pix4 = resMgr->loadPixmap( "HOMARD", "conepointvector.png" ); + QIcon IS4=QIcon(pix4); + RB_Def_angle->setIcon(IS4); + QPixmap pix5 = resMgr->loadPixmap( "HOMARD", "conedxyz.png" ); + QIcon IS5=QIcon(pix5); + RB_Def_radius->setIcon(IS5); InitConnect( ); @@ -106,6 +121,15 @@ MonCreateBoundaryAn::MonCreateBoundaryAn(MonCreateCase* parent, QPixmap pix2 = resMgr->loadPixmap( "HOMARD", "cylinderpointvector.png" ); QIcon IS2=QIcon(pix2); RBCylindre->setIcon(IS2); + QPixmap pix3 = resMgr->loadPixmap( "HOMARD", "cone.png" ); + QIcon IS3=QIcon(pix3); + RBCone->setIcon(IS3); + QPixmap pix4 = resMgr->loadPixmap( "HOMARD", "conepointvector.png" ); + QIcon IS4=QIcon(pix4); + RB_Def_angle->setIcon(IS4); + QPixmap pix5 = resMgr->loadPixmap( "HOMARD", "conedxyz.png" ); + QIcon IS5=QIcon(pix5); + RB_Def_radius->setIcon(IS5); setModal(true); InitConnect(); } @@ -120,8 +144,11 @@ MonCreateBoundaryAn::~MonCreateBoundaryAn() void MonCreateBoundaryAn::InitConnect() // ------------------------------------------------------------------------ { - connect( RBCylindre, SIGNAL(clicked()) , this, SLOT(SetCylinder()) ) ; - connect( RBSphere, SIGNAL(clicked()) , this, SLOT(SetSphere()) ) ; + connect( RBCylindre, SIGNAL(clicked()) , this, SLOT(SetCylinder()) ) ; + connect( RBSphere, SIGNAL(clicked()) , this, SLOT(SetSphere()) ) ; + connect( RBCone, SIGNAL(clicked()) , this, SLOT(SetCone()) ) ; + connect( RB_Def_radius, SIGNAL(clicked()) , this, SLOT(SetConeR()) ); + connect( RB_Def_angle, SIGNAL(clicked()) , this, SLOT(SetConeA()) ); connect( buttonOk, SIGNAL( pressed() ), this, SLOT( PushOnOK() ) ); connect( buttonApply, SIGNAL( pressed() ), this, SLOT( PushOnApply() ) ); connect( buttonCancel, SIGNAL( pressed() ), this, SLOT( close() ) ); @@ -164,20 +191,77 @@ void MonCreateBoundaryAn::InitValBoundaryAn() void MonCreateBoundaryAn::InitMinMax() // ------------------------------------------------------------------------ { -// en X + // Cylindre + // . X du centre + SpinBox_Xcent->setValue(_Xcentre); + SpinBox_Xcent->setSingleStep(_Xincr); + // . Y du centre + SpinBox_Ycent->setValue(_Ycentre); + SpinBox_Ycent->setSingleStep(_Yincr); + // . Z du centre + SpinBox_Zcent->setValue(_Zcentre); + SpinBox_Zcent->setSingleStep(_Zincr); + // . X de l'axe + SpinBox_Xaxis->setValue(0.); SpinBox_Xaxis->setSingleStep(0.1); - SpinBox_Xcentre->setSingleStep(_Xincr); -//en Y + // . Y de l'axe + SpinBox_Yaxis->setValue(0.); SpinBox_Yaxis->setSingleStep(0.1); - SpinBox_Ycentre->setSingleStep(_Yincr); -//en Z + // . Z de l'axe + SpinBox_Zaxis->setValue(1.); SpinBox_Zaxis->setSingleStep(0.1); - SpinBox_Zcentre->setSingleStep(_Zincr); -// Rayon + // . Rayon + SpinBox_Radius->setValue(_Rayon); SpinBox_Radius->setSingleStep(_Rayon/10.); SpinBox_Radius->setMinimum(0.); + + // Sphere + // . X du centre + SpinBox_Xcentre->setValue(_Xcentre); + SpinBox_Xcentre->setSingleStep(_Xincr); + // . Y du centre + SpinBox_Ycentre->setValue(_Ycentre); + SpinBox_Ycentre->setSingleStep(_Yincr); + // . Z du centre + SpinBox_Zcentre->setValue(_Zcentre); + SpinBox_Zcentre->setSingleStep(_Zincr); + // . Rayon + SpinBox_Rayon->setValue(_Rayon); SpinBox_Rayon->setSingleStep(_Rayon/10.); SpinBox_Rayon->setMinimum(0.); + + // Cone en rayons + // . X des centres + _BoundaryAnXcone1 = _Xcentre ; + SpinBox_Cone_X1->setSingleStep(_Xincr); + _BoundaryAnXcone2 = _Xcentre ; + SpinBox_Cone_X2->setSingleStep(_Xincr); + // . Y des centres + _BoundaryAnYcone1 = _Ycentre ; + SpinBox_Cone_Y1->setSingleStep(_Yincr); + _BoundaryAnYcone2 = _Ycentre ; + SpinBox_Cone_Y2->setSingleStep(_Yincr); + // . Z des centres + _BoundaryAnZcone1 = _Zmin ; + SpinBox_Cone_Z1->setSingleStep(_Zincr); + _BoundaryAnZcone2 = _Zmax ; + SpinBox_Cone_Z2->setSingleStep(_Zincr); + // . Rayons/Angles + _BoundaryAnRayon1 = 0. ; + SpinBox_Cone_V1->setMinimum(0.); + _BoundaryAnRayon2 = _Rayon ; + SpinBox_Cone_V2->setSingleStep(_Rayon/10.); + SpinBox_Cone_V2->setMinimum(0.); + + // Cone en angle + convertRayonAngle(1) ; + SpinBox_Cone_X1->setValue(_BoundaryAnXaxisCone); + SpinBox_Cone_Y1->setValue(_BoundaryAnYaxisCone); + SpinBox_Cone_Z1->setValue(_BoundaryAnZaxisCone); + SpinBox_Cone_V1->setValue(_BoundaryAngle); + SpinBox_Cone_X2->setValue(_BoundaryAnXorigCone); + SpinBox_Cone_Y2->setValue(_BoundaryAnYorigCone); + SpinBox_Cone_Z2->setValue(_BoundaryAnZorigCone); } // ------------------------------------------------------------------------ bool MonCreateBoundaryAn::PushOnApply() @@ -213,13 +297,6 @@ bool MonCreateBoundaryAn::PushOnApply() _BoundaryAnYcentre=SpinBox_Ycent->value(); _BoundaryAnZcentre=SpinBox_Zcent->value(); _BoundaryAnRayon=SpinBox_Radius->value(); - double daux = _BoundaryAnXaxis*_BoundaryAnXaxis + _BoundaryAnYaxis*_BoundaryAnYaxis + _BoundaryAnZaxis*_BoundaryAnZaxis ; - if ( daux < 0.0000001 ) - { - QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QObject::tr("HOM_AXE") ); - return false; - } } break; } @@ -239,9 +316,58 @@ bool MonCreateBoundaryAn::PushOnApply() } break; } - } + + case 3 : // il s agit d un cone defini par un axe et un angle + { + if ((_BoundaryAnXaxisCone != SpinBox_Cone_X1->value()) or + (_BoundaryAnYaxisCone != SpinBox_Cone_Y1->value()) or + (_BoundaryAnZaxisCone != SpinBox_Cone_Z1->value()) or + (_BoundaryAnXorigCone != SpinBox_Cone_X2->value()) or + (_BoundaryAnYorigCone != SpinBox_Cone_Y2->value()) or + (_BoundaryAnZorigCone != SpinBox_Cone_Z2->value()) or + (_BoundaryAngle != SpinBox_Cone_V1->value()) ) + { + Chgt = true; + _BoundaryAnXaxisCone = SpinBox_Cone_X1->value() ; + _BoundaryAnYaxisCone = SpinBox_Cone_Y1->value() ; + _BoundaryAnZaxisCone = SpinBox_Cone_Z1->value() ; + _BoundaryAnXorigCone = SpinBox_Cone_X2->value() ; + _BoundaryAnYorigCone = SpinBox_Cone_Y2->value() ; + _BoundaryAnZorigCone = SpinBox_Cone_Z2->value() ; + _BoundaryAngle = SpinBox_Cone_V1->value() ; + } + break; + } + + case 4 : // il s agit d un cone defini par les 2 rayons + { + if ((_BoundaryAnXcone1 != SpinBox_Cone_X1->value()) or + (_BoundaryAnYcone1 != SpinBox_Cone_Y1->value()) or + (_BoundaryAnZcone1 != SpinBox_Cone_Z1->value()) or + (_BoundaryAnRayon1 != SpinBox_Cone_V1->value()) or + (_BoundaryAnXcone2 != SpinBox_Cone_X2->value()) or + (_BoundaryAnYcone2 != SpinBox_Cone_Y2->value()) or + (_BoundaryAnZcone2 != SpinBox_Cone_Z2->value()) or + (_BoundaryAnRayon2 != SpinBox_Cone_V2->value()) ) + { + Chgt = true; + _BoundaryAnXcone1 = SpinBox_Cone_X1->value() ; + _BoundaryAnYcone1 = SpinBox_Cone_Y1->value() ; + _BoundaryAnZcone1 = SpinBox_Cone_Z1->value() ; + _BoundaryAnRayon1 = SpinBox_Cone_V1->value() ; + _BoundaryAnXcone2 = SpinBox_Cone_X2->value() ; + _BoundaryAnYcone2 = SpinBox_Cone_Y2->value() ; + _BoundaryAnZcone2 = SpinBox_Cone_Z2->value() ; + _BoundaryAnRayon2 = SpinBox_Cone_V2->value() ; + } + break; + } + } bool bOK = CreateOrUpdateBoundaryAn(); + + if ( bOK ) { HOMARD_UTILS::updateObjBrowser() ; } + return bOK; } @@ -250,31 +376,81 @@ bool MonCreateBoundaryAn:: CreateOrUpdateBoundaryAn() //---------------------------------------------------- // Creation de l'objet boundary { - if (_aName != LEBoundaryName->text().trimmed()) - { +// if (_aName != LEBoundaryName->text().trimmed()) +// { _aName = LEBoundaryName->text().trimmed(); switch (_Type) { case 1 : // il s agit d un cylindre { - aBoundaryAn = _myHomardGen->CreateBoundaryCylinder(CORBA::string_dup(_aName.toStdString().c_str()), \ - _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnXaxis, _BoundaryAnYaxis, _BoundaryAnZaxis, _BoundaryAnRayon ); + try + { + aBoundaryAn = _myHomardGen->CreateBoundaryCylinder(CORBA::string_dup(_aName.toStdString().c_str()), \ + _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnXaxis, _BoundaryAnYaxis, _BoundaryAnZaxis, _BoundaryAnRayon ); + } + catch( SALOME::SALOME_Exception& S_ex ) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; + } break; } case 2 : // il s agit d une sphere { - aBoundaryAn = _myHomardGen->CreateBoundarySphere(CORBA::string_dup(_aName.toStdString().c_str()), \ - _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnRayon); + try + { + aBoundaryAn = _myHomardGen->CreateBoundarySphere(CORBA::string_dup(_aName.toStdString().c_str()), \ + _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnRayon); + } + catch( SALOME::SALOME_Exception& S_ex ) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; + } + break; + } + case 3 : // il s agit d un cone defini par un axe et un angle + { + try + { + aBoundaryAn = _myHomardGen->CreateBoundaryConeA(CORBA::string_dup(_aName.toStdString().c_str()), \ + _BoundaryAnXaxisCone, _BoundaryAnYaxisCone, _BoundaryAnZaxisCone, _BoundaryAngle, \ + _BoundaryAnXorigCone, _BoundaryAnYorigCone, _BoundaryAnYorigCone); + } + catch( SALOME::SALOME_Exception& S_ex ) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; + } + break; + } + case 4 : // il s agit d un cone defini par les 2 rayons + { + try + { + aBoundaryAn = _myHomardGen->CreateBoundaryConeR(CORBA::string_dup(_aName.toStdString().c_str()), \ + _BoundaryAnXcone1, _BoundaryAnYcone1, _BoundaryAnZcone1, _BoundaryAnRayon1, \ + _BoundaryAnXcone2, _BoundaryAnYcone2, _BoundaryAnZcone2, _BoundaryAnRayon2); + } + catch( SALOME::SALOME_Exception& S_ex ) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; + } break; } } _parent->AddBoundaryAn(_aName); - } // Mise en place des attributs - aBoundaryAn->SetLimit(_Xincr, _Yincr, _Zincr); + aBoundaryAn->SetLimit(_Xincr, _Yincr, _Zincr); - HOMARD_UTILS::updateObjBrowser(); - return true; + return true; +// } +// else { return false ; } } // ------------------------------------------------------------------------ void MonCreateBoundaryAn::PushOnOK() @@ -321,15 +497,9 @@ void MonCreateBoundaryAn::SetCylinder() MESSAGE("Debut de SetCylinder") gBCylindre->setVisible(1); gBSphere->setVisible(0); + gBCone->setVisible(0); adjustSize(); _Type=1; - SpinBox_Xcent->setValue(_Xcentre); - SpinBox_Xaxis->setValue(0.); - SpinBox_Ycent->setValue(_Ycentre); - SpinBox_Yaxis->setValue(0.); - SpinBox_Zcent->setValue(_Zcentre); - SpinBox_Zaxis->setValue(1.); - SpinBox_Radius->setValue(_Rayon); // MESSAGE("Fin de SetCylinder") } // ------------------------------------------------------------------------ @@ -339,13 +509,229 @@ void MonCreateBoundaryAn::SetSphere() MESSAGE("Debut de SetSphere") gBCylindre->setVisible(0); gBSphere->setVisible(1); + gBCone->setVisible(0); adjustSize(); _Type=2; - SpinBox_Xcentre->setValue(_Xcentre); - SpinBox_Ycentre->setValue(_Ycentre); - SpinBox_Zcentre->setValue(_Zcentre); - SpinBox_Rayon->setValue(_Rayon); // MESSAGE("Fin de SetSphere") } +// ------------------------------------------------------------------------ +void MonCreateBoundaryAn::SetConeR() +// ------------------------------------------------------------------------ +{ + MESSAGE("Debut de SetConeR") +// +// Stockage et conversion des valeurs si elles ont change + if ((_BoundaryAnXaxisCone != SpinBox_Cone_X1->value()) or + (_BoundaryAnYaxisCone != SpinBox_Cone_Y1->value()) or + (_BoundaryAnZaxisCone != SpinBox_Cone_Z1->value()) or + (_BoundaryAnXorigCone != SpinBox_Cone_X2->value()) or + (_BoundaryAnYorigCone != SpinBox_Cone_Y2->value()) or + (_BoundaryAnZorigCone != SpinBox_Cone_Z2->value()) or + (_BoundaryAngle != SpinBox_Cone_V1->value()) ) + { + MESSAGE("Stockage et conversion") + _BoundaryAnXaxisCone = SpinBox_Cone_X1->value() ; + _BoundaryAnYaxisCone = SpinBox_Cone_Y1->value() ; + _BoundaryAnZaxisCone = SpinBox_Cone_Z1->value() ; + _BoundaryAnXorigCone = SpinBox_Cone_X2->value() ; + _BoundaryAnYorigCone = SpinBox_Cone_Y2->value() ; + _BoundaryAnZorigCone = SpinBox_Cone_Z2->value() ; + _BoundaryAngle = SpinBox_Cone_V1->value() ; + convertRayonAngle(-1) ; + } +// + _Type=4; +// + TLCone_X1->setText(QApplication::translate("CreateBoundaryAn", "X centre 1", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_X1->setValue(_BoundaryAnXcone1); + TLCone_Y1->setText(QApplication::translate("CreateBoundaryAn", "Y centre 1", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Y1->setValue(_BoundaryAnYcone1); + TLCone_Z1->setText(QApplication::translate("CreateBoundaryAn", "Z centre 1", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Z1->setValue(_BoundaryAnZcone1); +// + TLCone_V1->setText(QApplication::translate("CreateBoundaryAn", "Radius 1", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_V1->setSingleStep(_Rayon/10.); + SpinBox_Cone_V1->setMaximum(100000.*_DMax); + SpinBox_Cone_V1->setValue(_BoundaryAnRayon1); +// + TLCone_X2->setText(QApplication::translate("CreateBoundaryAn", "X centre 2", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_X2->setValue(_BoundaryAnXcone2); + TLCone_Y2->setText(QApplication::translate("CreateBoundaryAn", "Y centre 2", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Y2->setValue(_BoundaryAnYcone2); + TLCone_Z2->setText(QApplication::translate("CreateBoundaryAn", "Z centre 2", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Z2->setValue(_BoundaryAnZcone2); +// + TLCone_V2->setVisible(1); + SpinBox_Cone_V2->setVisible(1); + TLCone_V2->setText(QApplication::translate("CreateBoundaryAn", "Radius 2", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_V2->setValue(_BoundaryAnRayon2); +// +// MESSAGE("Fin de SetConeR") +} +// ------------------------------------------------------------------------ +void MonCreateBoundaryAn::SetConeA() +// ------------------------------------------------------------------------ +{ + MESSAGE("Debut de SetConeA") +// Stockage et conversion des valeurs si elles ont change + if ((_BoundaryAnXcone1 != SpinBox_Cone_X1->value()) or + (_BoundaryAnYcone1 != SpinBox_Cone_Y1->value()) or + (_BoundaryAnZcone1 != SpinBox_Cone_Z1->value()) or + (_BoundaryAnRayon1 != SpinBox_Cone_V1->value()) or + (_BoundaryAnXcone2 != SpinBox_Cone_X2->value()) or + (_BoundaryAnYcone2 != SpinBox_Cone_Y2->value()) or + (_BoundaryAnZcone2 != SpinBox_Cone_Z2->value()) or + (_BoundaryAnRayon2 != SpinBox_Cone_V2->value()) ) + { + MESSAGE("Stockage et conversion") + _BoundaryAnXcone1 = SpinBox_Cone_X1->value() ; + _BoundaryAnYcone1 = SpinBox_Cone_Y1->value() ; + _BoundaryAnZcone1 = SpinBox_Cone_Z1->value() ; + _BoundaryAnRayon1 = SpinBox_Cone_V1->value() ; + _BoundaryAnXcone2 = SpinBox_Cone_X2->value() ; + _BoundaryAnYcone2 = SpinBox_Cone_Y2->value() ; + _BoundaryAnZcone2 = SpinBox_Cone_Z2->value() ; + _BoundaryAnRayon2 = SpinBox_Cone_V2->value() ; + convertRayonAngle(1) ; + } +// + _Type=3; +// + TLCone_X1->setText(QApplication::translate("CreateBoundaryAn", "X axis", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_X1->setValue(_BoundaryAnXaxisCone); + TLCone_Y1->setText(QApplication::translate("CreateBoundaryAn", "Y axis", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Y1->setValue(_BoundaryAnYaxisCone); + TLCone_Z1->setText(QApplication::translate("CreateBoundaryAn", "Z axis", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Z1->setValue(_BoundaryAnZaxisCone); +// + TLCone_X2->setText(QApplication::translate("CreateBoundaryAn", "X centre", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_X2->setValue(_BoundaryAnXorigCone); + TLCone_Y2->setText(QApplication::translate("CreateBoundaryAn", "Y centre", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Y2->setValue(_BoundaryAnYorigCone); + TLCone_Z2->setText(QApplication::translate("CreateBoundaryAn", "Z centre", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Z2->setValue(_BoundaryAnZorigCone); +// + TLCone_V1->setText(QApplication::translate("CreateBoundaryAn", "Angle", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_V1->setValue(_BoundaryAngle); + SpinBox_Cone_V1->setSingleStep(1.); + SpinBox_Cone_V1->setMaximum(90.); +// + TLCone_V2->setVisible(0); + SpinBox_Cone_V2->setVisible(0); +// MESSAGE("Fin de SetConeA") +} + + +// ------------------------------------------------------------------------ +void MonCreateBoundaryAn::SetCone() +// ------------------------------------------------------------------------ +{ + MESSAGE("Debut de SetCone") + gBCylindre->setVisible(0); + gBSphere->setVisible(0); + gBCone->setVisible(1); +// + adjustSize(); + if ( RB_Def_radius->isChecked() ) + { + SetConeR(); + } + else + { + SetConeA(); + } +// MESSAGE("Fin de SetCone") +} +// ------------------------------------------------------------------------ +void MonCreateBoundaryAn::convertRayonAngle(int option) +// ------------------------------------------------------------------------ +// Conversion entre les deux formulations du cone : +// par deux rayons ou avec un axe et un angle. +// Voir sfcoi1 de HOMARD +{ + MESSAGE("Debut de convertRayonAngle, option = "< BO = AB*RB/(RA-RB) +// Angle : tg(alpha) = RA/AO +// + double daux ; +// De rayon vers angle : + if ( option == 1 ) + { + double xa, ya, za, ra ; + double xb, yb, zb, rb ; +// Positionnement de A vers B, avec RA>RB + if ( _BoundaryAnRayon1 > _BoundaryAnRayon2 ) + { + xa = _BoundaryAnXcone1 ; + ya = _BoundaryAnYcone1 ; + za = _BoundaryAnZcone1 ; + ra = _BoundaryAnRayon1 ; + xb = _BoundaryAnXcone2 ; + yb = _BoundaryAnYcone2 ; + zb = _BoundaryAnZcone2 ; + rb = _BoundaryAnRayon2 ; + } + else + { + xa = _BoundaryAnXcone2 ; + ya = _BoundaryAnYcone2 ; + za = _BoundaryAnZcone2 ; + ra = _BoundaryAnRayon2 ; + xb = _BoundaryAnXcone1 ; + yb = _BoundaryAnYcone1 ; + zb = _BoundaryAnZcone1 ; + rb = _BoundaryAnRayon1 ; + } +// Axe : relie les deux centres, de A vers B. L'axe est normalise + _BoundaryAnXaxisCone = xb - xa ; + _BoundaryAnYaxisCone = yb - ya ; + _BoundaryAnZaxisCone = zb - za ; + daux = sqrt ( _BoundaryAnXaxisCone*_BoundaryAnXaxisCone + _BoundaryAnYaxisCone*_BoundaryAnYaxisCone + _BoundaryAnZaxisCone*_BoundaryAnZaxisCone ) ; + _BoundaryAnXaxisCone = _BoundaryAnXaxisCone/daux ; + _BoundaryAnYaxisCone = _BoundaryAnYaxisCone/daux ; + _BoundaryAnZaxisCone = _BoundaryAnZaxisCone/daux ; +// Origine + daux = daux * rb / (ra-rb) ; + _BoundaryAnXorigCone = xb + daux*_BoundaryAnXaxisCone ; + _BoundaryAnYorigCone = yb + daux*_BoundaryAnYaxisCone ; + _BoundaryAnZorigCone = zb + daux*_BoundaryAnZaxisCone ; +// Angle en degre + daux = ra / sqrt((_BoundaryAnXorigCone-xa)*(_BoundaryAnXorigCone-xa) + (_BoundaryAnYorigCone-ya)*(_BoundaryAnYorigCone-ya) + (_BoundaryAnZorigCone-za)*(_BoundaryAnZorigCone-za) ) ; + _BoundaryAngle = atan(daux)*180./PI ; + } +// D'angle vers rayon : + else + { + double xax, yax, zax ; +// L'axe est normalise + daux = sqrt ( _BoundaryAnXaxisCone*_BoundaryAnXaxisCone + _BoundaryAnYaxisCone*_BoundaryAnYaxisCone + _BoundaryAnZaxisCone*_BoundaryAnZaxisCone ) ; + xax = _BoundaryAnXaxisCone/daux ; + yax = _BoundaryAnYaxisCone/daux ; + zax = _BoundaryAnZaxisCone/daux ; +// Centre 1 : l'origine + _BoundaryAnXcone1 = _BoundaryAnXorigCone ; + _BoundaryAnYcone1 = _BoundaryAnYorigCone ; + _BoundaryAnZcone1 = _BoundaryAnZorigCone ; +// Rayon 1 : nul + _BoundaryAnRayon1 = 0. ; +// Centre 2 : l'origine decalee d'une longueur arbitraire le long de l'axe + _BoundaryAnXcone2 = _BoundaryAnXorigCone + _DMax*xax ; + _BoundaryAnYcone2 = _BoundaryAnYorigCone + _DMax*yax ; + _BoundaryAnZcone2 = _BoundaryAnZorigCone + _DMax*zax ; +// Rayon 2 : a calculer + _BoundaryAnRayon2 = _DMax*tan(_BoundaryAngle*PI/180.) ; + } +// MESSAGE("Fin de convertRayonAngle") +} diff --git a/src/HOMARDGUI/MonCreateBoundaryAn.h b/src/HOMARDGUI/MonCreateBoundaryAn.h index f9c9f22d..1467da11 100644 --- a/src/HOMARDGUI/MonCreateBoundaryAn.h +++ b/src/HOMARDGUI/MonCreateBoundaryAn.h @@ -52,11 +52,16 @@ protected : QString _aName; QString _aCaseName; + double _Xmin, _Xmax, _Xincr, _Ymin, _Ymax, _Yincr, _Zmin, _Zmax, _Zincr, _DMax ; int _Type; double _BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnRayon; double _BoundaryAnXaxis, _BoundaryAnYaxis, _BoundaryAnZaxis; - double _Xmin, _Xmax, _Xincr, _Ymin, _Ymax, _Yincr, _Zmin, _Zmax, _Zincr, _DMax ; double _Xcentre, _Ycentre, _Zcentre, _Rayon ; + double _BoundaryAnXcone1, _BoundaryAnYcone1, _BoundaryAnZcone1, _BoundaryAnRayon1; + double _BoundaryAnXcone2, _BoundaryAnYcone2, _BoundaryAnZcone2, _BoundaryAnRayon2; + double _BoundaryAnXaxisCone, _BoundaryAnYaxisCone, _BoundaryAnZaxisCone; + double _BoundaryAnXorigCone, _BoundaryAnYorigCone, _BoundaryAnZorigCone; + double _BoundaryAngle; bool Chgt; @@ -68,11 +73,15 @@ protected : virtual void InitValBoundaryAn(); virtual void InitMinMax(); virtual void SetNewBoundaryAnName(); + virtual void convertRayonAngle(int option); virtual bool CreateOrUpdateBoundaryAn(); public slots: virtual void SetCylinder(); virtual void SetSphere(); + virtual void SetCone(); + virtual void SetConeR(); + virtual void SetConeA(); virtual void PushOnOK(); virtual bool PushOnApply(); virtual void PushOnHelp(); diff --git a/src/HOMARDGUI/MonCreateBoundaryDi.cxx b/src/HOMARDGUI/MonCreateBoundaryDi.cxx index 08d9799a..635e8548 100644 --- a/src/HOMARDGUI/MonCreateBoundaryDi.cxx +++ b/src/HOMARDGUI/MonCreateBoundaryDi.cxx @@ -115,7 +115,7 @@ bool MonCreateBoundaryDi::PushOnApply() catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); return false; } } diff --git a/src/HOMARDGUI/MonCreateCase.cxx b/src/HOMARDGUI/MonCreateCase.cxx index 1d9fafc5..40e97c74 100644 --- a/src/HOMARDGUI/MonCreateCase.cxx +++ b/src/HOMARDGUI/MonCreateCase.cxx @@ -224,7 +224,7 @@ bool MonCreateCase::PushOnApply() catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); try { aCase = _myHomardGen->GetCase(_aCaseName.toStdString().c_str()); @@ -288,6 +288,7 @@ bool MonCreateCase::PushOnApply() } HOMARD_UTILS::updateObjBrowser(); + return true; } // --------------------------- diff --git a/src/HOMARDGUI/MonCreateHypothesis.cxx b/src/HOMARDGUI/MonCreateHypothesis.cxx index 6f0dc14b..5711dcdf 100644 --- a/src/HOMARDGUI/MonCreateHypothesis.cxx +++ b/src/HOMARDGUI/MonCreateHypothesis.cxx @@ -186,7 +186,8 @@ bool MonCreateHypothesis::PushOnApply() _aHypothesis->SetLevelOutput(_LevelOutput); } - HOMARD_UTILS::updateObjBrowser(); + HOMARD_UTILS::updateObjBrowser() ; + return true; } @@ -318,7 +319,7 @@ void MonCreateHypothesis::PushZoneDelete() { MESSAGE("Debut de MonCreateHypothesis::PushZoneDelete") QMessageBox::warning( 0, QObject::tr("HOM_WARNING"), - QObject::tr("HOM_INACTIVE_BUTTON") ); + QObject::tr("HOM_INACTIVE_BUTTON") ); return; } diff --git a/src/HOMARDGUI/MonCreateIteration.cxx b/src/HOMARDGUI/MonCreateIteration.cxx index b5da354d..378f78b7 100644 --- a/src/HOMARDGUI/MonCreateIteration.cxx +++ b/src/HOMARDGUI/MonCreateIteration.cxx @@ -158,7 +158,7 @@ bool MonCreateIteration::PushOnApply() catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); return false; } } @@ -179,7 +179,8 @@ bool MonCreateIteration::PushOnApply() _myHomardGen->AssociateIterHypo (IterName, monHypoName.toStdString().c_str()); aIter->SetMeshName(CORBA::string_dup(aMeshName_np1.toStdString().c_str())); - HOMARD_UTILS::updateObjBrowser(); + HOMARD_UTILS::updateObjBrowser() ; + return true; } diff --git a/src/HOMARDGUI/MonCreateZone.cxx b/src/HOMARDGUI/MonCreateZone.cxx index 1445a8a0..ff865ad1 100644 --- a/src/HOMARDGUI/MonCreateZone.cxx +++ b/src/HOMARDGUI/MonCreateZone.cxx @@ -477,6 +477,9 @@ bool MonCreateZone::PushOnApply() } } bool bOK = CreateOrUpdateZone() ; + + if ( bOK ) { HOMARD_UTILS::updateObjBrowser() ; } + return bOK; } @@ -489,81 +492,90 @@ bool MonCreateZone:: CreateOrUpdateZone() if (_aZoneName != LEZoneName->text().trimmed()) { _aZoneName = LEZoneName->text().trimmed() ; - switch (_Type) + try { - case 11 : // il s agit d un rectangle - { aZone = _myHomardGen->CreateZoneBox2D(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneXmin, _ZoneXmax, _ZoneYmin, _ZoneYmax, _Orient ); - break; - } - case 12 : // il s agit d un rectangle - { aZone = _myHomardGen->CreateZoneBox2D(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneYmin, _ZoneYmax, _ZoneZmin, _ZoneZmax, _Orient ); - break; - } - case 13 : // il s agit d un rectangle - { aZone = _myHomardGen->CreateZoneBox2D(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneZmin, _ZoneZmax, _ZoneXmin, _ZoneXmax, _Orient ); - break; - } - case 2 : // il s agit d un parallelepipede - { aZone = _myHomardGen->CreateZoneBox(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneXmin, _ZoneXmax, _ZoneYmin, _ZoneYmax, _ZoneZmin, _ZoneZmax ); - break; - } - case 4 : // il s agit d une sphere - { aZone = _myHomardGen->CreateZoneSphere(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneXcentre, _ZoneYcentre, _ZoneZcentre, _ZoneRayon ); - break; - } - case 31 : // il s agit d un disque issu d'un cylindre - { aZone = _myHomardGen->CreateZoneDisk(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneXcentre, _ZoneYcentre, _ZoneRayon, _Orient ); - break; + switch (_Type) + { + case 11 : // il s agit d un rectangle + { aZone = _myHomardGen->CreateZoneBox2D(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneXmin, _ZoneXmax, _ZoneYmin, _ZoneYmax, _Orient ); + break; } - case 32 : // il s agit d un disque issu d'un cylindre - { aZone = _myHomardGen->CreateZoneDisk(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneYcentre, _ZoneZcentre, _ZoneRayon, _Orient ); - break; - } - case 33 : // il s agit d un disque issu d'un cylindre - { aZone = _myHomardGen->CreateZoneDisk(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneZcentre, _ZoneXcentre, _ZoneRayon, _Orient ); - break; - } - case 5 : // il s agit d un cylindre - { aZone = _myHomardGen->CreateZoneCylinder(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneXcentre, _ZoneYcentre, _ZoneZcentre, _ZoneXaxis, _ZoneYaxis, _ZoneZaxis, _ZoneRayon, _ZoneHaut ); - break; - } - case 61 : // il s agit d un disque avec trou - { aZone = _myHomardGen->CreateZoneDiskWithHole(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneXcentre, _ZoneYcentre, _ZoneRayon, _ZoneRayonInt, _Orient ); - break; + case 12 : // il s agit d un rectangle + { aZone = _myHomardGen->CreateZoneBox2D(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneYmin, _ZoneYmax, _ZoneZmin, _ZoneZmax, _Orient ); + break; } - case 62 : // il s agit d un disque avec trou - { aZone = _myHomardGen->CreateZoneDiskWithHole(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneYcentre, _ZoneZcentre, _ZoneRayon, _ZoneRayonInt, _Orient ); - break; + case 13 : // il s agit d un rectangle + { aZone = _myHomardGen->CreateZoneBox2D(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneZmin, _ZoneZmax, _ZoneXmin, _ZoneXmax, _Orient ); + break; } - case 63 : // il s agit d un disque avec trou - { aZone = _myHomardGen->CreateZoneDiskWithHole(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneZcentre, _ZoneXcentre, _ZoneRayon, _ZoneRayonInt, _Orient ); - break; + case 2 : // il s agit d un parallelepipede + { aZone = _myHomardGen->CreateZoneBox(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneXmin, _ZoneXmax, _ZoneYmin, _ZoneYmax, _ZoneZmin, _ZoneZmax ); + break; } - case 7 : // il s agit d un tuyau - { aZone = _myHomardGen->CreateZonePipe(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ - _ZoneXcentre, _ZoneYcentre, _ZoneZcentre, _ZoneXaxis, _ZoneYaxis, _ZoneZaxis, _ZoneRayon, _ZoneHaut, _ZoneRayonInt ); - break; + case 4 : // il s agit d une sphere + { aZone = _myHomardGen->CreateZoneSphere(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneXcentre, _ZoneYcentre, _ZoneZcentre, _ZoneRayon ); + break; } + case 31 : // il s agit d un disque issu d'un cylindre + { aZone = _myHomardGen->CreateZoneDisk(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneXcentre, _ZoneYcentre, _ZoneRayon, _Orient ); + break; + } + case 32 : // il s agit d un disque issu d'un cylindre + { aZone = _myHomardGen->CreateZoneDisk(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneYcentre, _ZoneZcentre, _ZoneRayon, _Orient ); + break; + } + case 33 : // il s agit d un disque issu d'un cylindre + { aZone = _myHomardGen->CreateZoneDisk(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneZcentre, _ZoneXcentre, _ZoneRayon, _Orient ); + break; + } + case 5 : // il s agit d un cylindre + { aZone = _myHomardGen->CreateZoneCylinder(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneXcentre, _ZoneYcentre, _ZoneZcentre, _ZoneXaxis, _ZoneYaxis, _ZoneZaxis, _ZoneRayon, _ZoneHaut ); + break; + } + case 61 : // il s agit d un disque avec trou + { aZone = _myHomardGen->CreateZoneDiskWithHole(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneXcentre, _ZoneYcentre, _ZoneRayon, _ZoneRayonInt, _Orient ); + break; + } + case 62 : // il s agit d un disque avec trou + { aZone = _myHomardGen->CreateZoneDiskWithHole(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneYcentre, _ZoneZcentre, _ZoneRayon, _ZoneRayonInt, _Orient ); + break; + } + case 63 : // il s agit d un disque avec trou + { aZone = _myHomardGen->CreateZoneDiskWithHole(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneZcentre, _ZoneXcentre, _ZoneRayon, _ZoneRayonInt, _Orient ); + break; + } + case 7 : // il s agit d un tuyau + { aZone = _myHomardGen->CreateZonePipe(CORBA::string_dup(_aZoneName.toStdString().c_str()), \ + _ZoneXcentre, _ZoneYcentre, _ZoneZcentre, _ZoneXaxis, _ZoneYaxis, _ZoneZaxis, _ZoneRayon, _ZoneHaut, _ZoneRayonInt ); + break; + } + } + } + catch( SALOME::SALOME_Exception& S_ex ) + { + QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); + return false ; } _parent->addZoneinTWZone(_aZoneName) ; - } // Mise en place des attributs - aZone->SetLimit(_Xincr, _Yincr, _Zincr) ; + aZone->SetLimit(_Xincr, _Yincr, _Zincr) ; - HOMARD_UTILS::updateObjBrowser() ; - return true; + return true; + } + else { return false ; } } // ------------------------------------------------------------------------ void MonCreateZone::PushOnOK() diff --git a/src/HOMARDGUI/MonEditBoundaryAn.cxx b/src/HOMARDGUI/MonEditBoundaryAn.cxx index 4703c6c8..63082733 100644 --- a/src/HOMARDGUI/MonEditBoundaryAn.cxx +++ b/src/HOMARDGUI/MonEditBoundaryAn.cxx @@ -72,6 +72,18 @@ void MonEditBoundaryAn::InitValEdit() SetSphere(); break; } + case 3: // il s agit d un cone defini par un axe et un angle + { + InitValBoundaryAnConeA(); + SetConeA(); + break; + } + case 4: // il s agit d un cone defini par les 2 rayons + { + InitValBoundaryAnConeR(); + SetConeR(); + break; + } }; } // ------------------------------------------------------------------------ @@ -110,15 +122,48 @@ void MonEditBoundaryAn::InitValBoundaryAnSphere() _BoundaryAnRayon=mesCoordBoundary[3]; } // ------------------------------------------------------------------------ +void MonEditBoundaryAn::InitValBoundaryAnConeA() +// ------------------------------------------------------------------------ +{ + HOMARD::double_array_var mesCoordBoundary = aBoundaryAn->GetCoords(); + ASSERT(mesCoordBoundary->length() == 7 ); + _BoundaryAnXaxisCone=mesCoordBoundary[0]; + _BoundaryAnYaxisCone=mesCoordBoundary[1]; + _BoundaryAnZaxisCone=mesCoordBoundary[2]; + _BoundaryAngle=mesCoordBoundary[3]; + _BoundaryAnXorigCone=mesCoordBoundary[4]; + _BoundaryAnYorigCone=mesCoordBoundary[5]; + _BoundaryAnZorigCone=mesCoordBoundary[6]; + convertRayonAngle(-1) ; +} +// ------------------------------------------------------------------------ +void MonEditBoundaryAn::InitValBoundaryAnConeR() +// ------------------------------------------------------------------------ +{ + HOMARD::double_array_var mesCoordBoundary = aBoundaryAn->GetCoords(); + ASSERT(mesCoordBoundary->length() == 8 ); + _BoundaryAnXcone1=mesCoordBoundary[0]; + _BoundaryAnYcone1=mesCoordBoundary[1]; + _BoundaryAnZcone1=mesCoordBoundary[2]; + _BoundaryAnRayon1=mesCoordBoundary[3]; + _BoundaryAnXcone2=mesCoordBoundary[4]; + _BoundaryAnYcone2=mesCoordBoundary[5]; + _BoundaryAnZcone2=mesCoordBoundary[6]; + _BoundaryAnRayon2=mesCoordBoundary[7]; + convertRayonAngle(1) ; +} +// ------------------------------------------------------------------------ void MonEditBoundaryAn::SetCylinder() // ------------------------------------------------------------------------ { gBCylindre->setVisible(1); gBSphere->setVisible(0); + gBCone->setVisible(0); RBCylindre->setChecked(1); adjustSize(); _Type=1; RBSphere->setDisabled(true); + RBCone->setDisabled(true); adjustSize(); SpinBox_Xcent->setValue(_BoundaryAnXcentre); @@ -148,7 +193,9 @@ void MonEditBoundaryAn::SetSphere() gBCylindre->setVisible(0); gBSphere->setVisible(1); RBSphere->setChecked(1); + gBCone->setVisible(0); RBCylindre->setDisabled(true); + RBCone->setDisabled(true); adjustSize(); _Type=2 ; @@ -167,6 +214,80 @@ void MonEditBoundaryAn::SetSphere() SpinBox_Rayon->setMinimum(0.); SpinBox_Rayon->setValue(_BoundaryAnRayon); } +// ------------------------------------------------------------------------ +void MonEditBoundaryAn::SetConeA() +// ------------------------------------------------------------------------ +{ + gBCylindre->setVisible(0); + gBSphere->setVisible(0); + gBCone->setVisible(1); + RBCone->setChecked(1); + RB_Def_angle->setChecked(1); + RBCylindre->setDisabled(true); + RBSphere->setDisabled(true); + adjustSize(); + _Type=3; +// + TLCone_X1->setText(QApplication::translate("CreateBoundaryAn", "X axis", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_X1->setValue(_BoundaryAnXaxisCone); + TLCone_Y1->setText(QApplication::translate("CreateBoundaryAn", "Y axis", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Y1->setValue(_BoundaryAnYaxisCone); + TLCone_Z1->setText(QApplication::translate("CreateBoundaryAn", "Z axis", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Z1->setValue(_BoundaryAnZaxisCone); +// + TLCone_X2->setText(QApplication::translate("CreateBoundaryAn", "X centre", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_X2->setValue(_BoundaryAnXorigCone); + TLCone_Y2->setText(QApplication::translate("CreateBoundaryAn", "Y centre", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Y2->setValue(_BoundaryAnYorigCone); + TLCone_Z2->setText(QApplication::translate("CreateBoundaryAn", "Z centre", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Z2->setValue(_BoundaryAnZorigCone); +// + TLCone_V1->setText(QApplication::translate("CreateBoundaryAn", "Angle", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_V1->setValue(_BoundaryAngle); + SpinBox_Cone_V1->setSingleStep(1.); + SpinBox_Cone_V1->setMaximum(90.); +// + TLCone_V2->setVisible(0); + SpinBox_Cone_V2->setVisible(0); +} +// ------------------------------------------------------------------------ +void MonEditBoundaryAn::SetConeR() +// ------------------------------------------------------------------------ +{ + gBCylindre->setVisible(0); + gBSphere->setVisible(0); + gBCone->setVisible(1); + RBCone->setChecked(1); + RB_Def_radius->setChecked(1); + RBCylindre->setDisabled(true); + RBSphere->setDisabled(true); + adjustSize(); + _Type=4; +// + TLCone_X1->setText(QApplication::translate("CreateBoundaryAn", "X centre 1", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_X1->setValue(_BoundaryAnXcone1); + TLCone_Y1->setText(QApplication::translate("CreateBoundaryAn", "Y centre 1", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Y1->setValue(_BoundaryAnYcone1); + TLCone_Z1->setText(QApplication::translate("CreateBoundaryAn", "Z centre 1", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Z1->setValue(_BoundaryAnZcone1); +// + TLCone_V1->setText(QApplication::translate("CreateBoundaryAn", "Radius 1", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_V1->setSingleStep(_Rayon/10.); + SpinBox_Cone_V1->setMaximum(100000.*_DMax); + SpinBox_Cone_V1->setValue(_BoundaryAnRayon1); +// + TLCone_X2->setText(QApplication::translate("CreateBoundaryAn", "X centre 2", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_X2->setValue(_BoundaryAnXcone2); + TLCone_Y2->setText(QApplication::translate("CreateBoundaryAn", "Y centre 2", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Y2->setValue(_BoundaryAnYcone2); + TLCone_Z2->setText(QApplication::translate("CreateBoundaryAn", "Z centre 2", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_Z2->setValue(_BoundaryAnZcone2); +// + TLCone_V2->setVisible(1); + SpinBox_Cone_V2->setVisible(1); + TLCone_V2->setText(QApplication::translate("CreateBoundaryAn", "Radius 2", 0, QApplication::UnicodeUTF8)); + SpinBox_Cone_V2->setValue(_BoundaryAnRayon2); +} // --------------------------------------------------- bool MonEditBoundaryAn::CreateOrUpdateBoundaryAn() //---------------------------------------------------- @@ -184,6 +305,20 @@ bool MonEditBoundaryAn::CreateOrUpdateBoundaryAn() aBoundaryAn->SetSphere(_BoundaryAnXcentre, _BoundaryAnYcentre, _BoundaryAnZcentre, _BoundaryAnRayon); break; } + case 3 : // il s agit d un cone defini par un axe et un angle + { + aBoundaryAn = _myHomardGen->CreateBoundaryConeA(CORBA::string_dup(_aName.toStdString().c_str()), \ + _BoundaryAnXaxisCone, _BoundaryAnYaxisCone, _BoundaryAnZaxisCone, _BoundaryAngle, \ + _BoundaryAnXorigCone, _BoundaryAnYorigCone, _BoundaryAnYorigCone); + break; + } + case 4 : // il s agit d un cone defini par les 2 rayons + { + aBoundaryAn = _myHomardGen->CreateBoundaryConeR(CORBA::string_dup(_aName.toStdString().c_str()), \ + _BoundaryAnXcone1, _BoundaryAnYcone1, _BoundaryAnZcone1, _BoundaryAnRayon1, \ + _BoundaryAnXcone2, _BoundaryAnYcone2, _BoundaryAnZcone2, _BoundaryAnRayon2); + break; + } } if (Chgt) _myHomardGen->InvalideBoundary(_aName.toStdString().c_str()); HOMARD_UTILS::updateObjBrowser(); diff --git a/src/HOMARDGUI/MonEditBoundaryAn.h b/src/HOMARDGUI/MonEditBoundaryAn.h index 7e027564..01959470 100644 --- a/src/HOMARDGUI/MonEditBoundaryAn.h +++ b/src/HOMARDGUI/MonEditBoundaryAn.h @@ -38,13 +38,17 @@ public: virtual ~MonEditBoundaryAn(); protected : - void SetCylinder(); - void SetSphere(); bool CreateOrUpdateBoundaryAn(); void InitValEdit(); void InitValBoundaryAnLimit(); + void SetCylinder(); + void SetSphere(); + void SetConeR(); + void SetConeA(); void InitValBoundaryAnCylindre(); void InitValBoundaryAnSphere(); + void InitValBoundaryAnConeR(); + void InitValBoundaryAnConeA(); public slots: diff --git a/src/HOMARDGUI/MonEditBoundaryDi.cxx b/src/HOMARDGUI/MonEditBoundaryDi.cxx index 56fe257e..8f3a5ee3 100644 --- a/src/HOMARDGUI/MonEditBoundaryDi.cxx +++ b/src/HOMARDGUI/MonEditBoundaryDi.cxx @@ -51,7 +51,7 @@ MonEditBoundaryDi::MonEditBoundaryDi( MonCreateCase* parent, bool modal, catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); return; } diff --git a/src/HOMARDGUI/MonIterInfo.cxx b/src/HOMARDGUI/MonIterInfo.cxx index 4709685e..4ce72d2d 100644 --- a/src/HOMARDGUI/MonIterInfo.cxx +++ b/src/HOMARDGUI/MonIterInfo.cxx @@ -106,7 +106,7 @@ bool MonIterInfo::PushOnApply() catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); return false; } diff --git a/src/HOMARDGUI/MonMeshInfo.cxx b/src/HOMARDGUI/MonMeshInfo.cxx index ffffad6e..d6b66531 100644 --- a/src/HOMARDGUI/MonMeshInfo.cxx +++ b/src/HOMARDGUI/MonMeshInfo.cxx @@ -150,7 +150,7 @@ bool MonMeshInfo::PushOnApply() catch( SALOME::SALOME_Exception& S_ex ) { QMessageBox::critical( 0, QObject::tr("HOM_ERROR"), - QString(CORBA::string_dup(S_ex.details.text)) ); + QObject::tr(CORBA::string_dup(S_ex.details.text)) ); return false; } } diff --git a/src/HOMARD_I/HOMARD_Boundary_i.cxx b/src/HOMARD_I/HOMARD_Boundary_i.cxx index d10e2ade..84346e0d 100644 --- a/src/HOMARD_I/HOMARD_Boundary_i.cxx +++ b/src/HOMARD_I/HOMARD_Boundary_i.cxx @@ -161,6 +161,18 @@ void HOMARD_Boundary_i::SetSphere( double Xcentre, double Ycentre, double ZCentr myHomardBoundary->SetSphere( Xcentre, Ycentre, ZCentre, rayon ); } //============================================================================= +void HOMARD_Boundary_i::SetConeR( double Xcentre1, double Ycentre1, double Zcentre1, double Rayon1, double Xcentre2, double Ycentre2, double Zcentre2, double Rayon2) +{ + ASSERT( myHomardBoundary ); + myHomardBoundary->SetConeR( Xcentre1, Ycentre1, Zcentre1, Rayon1, Xcentre2, Ycentre2, Zcentre2, Rayon2 ); +} +//============================================================================= +void HOMARD_Boundary_i::SetConeA( double Xaxe, double Yaxe, double Zaxe, double Angle, double Xcentre, double Ycentre, double Zcentre) +{ + ASSERT( myHomardBoundary ); + myHomardBoundary->SetConeA( Xaxe, Yaxe, Zaxe, Angle, Xcentre, Ycentre, Zcentre ); +} +//============================================================================= HOMARD::double_array* HOMARD_Boundary_i::GetCoords() { ASSERT( myHomardBoundary ); diff --git a/src/HOMARD_I/HOMARD_Boundary_i.hxx b/src/HOMARD_I/HOMARD_Boundary_i.hxx index 4752c866..4a41cc92 100644 --- a/src/HOMARD_I/HOMARD_Boundary_i.hxx +++ b/src/HOMARD_I/HOMARD_Boundary_i.hxx @@ -78,6 +78,10 @@ public: double rayon ); void SetSphere( double Xcentre, double Ycentre, double ZCentre, double rayon ); + void SetConeR( double Xcentre1, double Ycentre1, double Zcentre1, double Rayon1, + double Xcentre2, double Ycentre2, double Zcentre2, double Rayon2); + void SetConeA( double Xaxe, double Yaxe, double Zaxe, double Angle, + double Xcentre, double Ycentre, double ZCentre); HOMARD::double_array* GetCoords(); diff --git a/src/HOMARD_I/HOMARD_Gen_i.cxx b/src/HOMARD_I/HOMARD_Gen_i.cxx index 19835e13..c6902e95 100755 --- a/src/HOMARD_I/HOMARD_Gen_i.cxx +++ b/src/HOMARD_I/HOMARD_Gen_i.cxx @@ -38,6 +38,7 @@ #include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog) #include CORBA_CLIENT_HEADER(SMESH_Gen) +#include #include #include #include @@ -175,7 +176,7 @@ void HOMARD_Gen_i::SetEtatIter(const char* nomIter, const CORBA::Boolean EtatCal { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Iteration "; + es.text = "Invalid iteration"; throw SALOME::SALOME_Exception(es); return ; }; @@ -212,11 +213,9 @@ CORBA::Long HOMARD_Gen_i::DeleteBoundary(const char* BoundaryName) HOMARD::HOMARD_Boundary_var myBoundary = myContextMap[GetCurrentStudyID()]._mesBoundarys[BoundaryName]; if (CORBA::is_nil(myBoundary)) { -// const char* message = "Invalid Boundary " ; -// SALOMEException(message) ; SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Boundary "; + es.text = "Invalid boundary"; throw SALOME::SALOME_Exception(es); return 1 ; }; @@ -270,7 +269,7 @@ CORBA::Long HOMARD_Gen_i::DeleteCase(const char* nomCas) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Case Context "; + es.text = "Invalid case context"; throw SALOME::SALOME_Exception(es); return 1; }; @@ -301,7 +300,7 @@ CORBA::Long HOMARD_Gen_i::DeleteHypo(const char* nomHypo) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Hypothesis "; + es.text = "Invalid hypothesis"; throw SALOME::SALOME_Exception(es); return 1 ; }; @@ -313,7 +312,7 @@ CORBA::Long HOMARD_Gen_i::DeleteHypo(const char* nomHypo) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "This hypothesis is used and cannot be deleted."; + es.text = "This hypothesis is used in an iteration and cannot be deleted."; throw SALOME::SALOME_Exception(es); return 2 ; }; @@ -364,7 +363,7 @@ CORBA::Long HOMARD_Gen_i::DeleteIterationOption(const char* nomIter, CORBA::Long { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Iteration "; + es.text = "Invalid iteration"; throw SALOME::SALOME_Exception(es); return 1 ; }; @@ -406,7 +405,7 @@ CORBA::Long HOMARD_Gen_i::DeleteIterationOption(const char* nomIter, CORBA::Long { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Iteration "; + es.text = "Invalid iteration"; throw SALOME::SALOME_Exception(es); return 3 ; }; @@ -449,7 +448,7 @@ CORBA::Long HOMARD_Gen_i::DeleteZone(const char* nomZone) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Zone "; + es.text = "Invalid zone"; throw SALOME::SALOME_Exception(es); return 1 ; }; @@ -462,7 +461,7 @@ CORBA::Long HOMARD_Gen_i::DeleteZone(const char* nomZone) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "This zone is used and cannot be deleted."; + es.text = "This zone is used in an hypothesis and cannot be deleted."; throw SALOME::SALOME_Exception(es); return 2 ; }; @@ -492,7 +491,7 @@ void HOMARD_Gen_i::InvalideBoundary(const char* BoundaryName) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Boundary "; + es.text = "Invalid boundary"; throw SALOME::SALOME_Exception(es); return ; } @@ -514,7 +513,7 @@ void HOMARD_Gen_i::InvalideHypo(const char* nomHypo) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Hypothesis "; + es.text = "Invalid hypothesis"; throw SALOME::SALOME_Exception(es); return ; }; @@ -547,7 +546,7 @@ void HOMARD_Gen_i::InvalideIterOption(const char* nomIter, CORBA::Long Option) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Iteration "; + es.text = "Invalid iteration"; throw SALOME::SALOME_Exception(es); return ; }; @@ -587,7 +586,7 @@ void HOMARD_Gen_i::InvalideIterOption(const char* nomIter, CORBA::Long Option) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Case Context "; + es.text = "Invalid case context"; throw SALOME::SALOME_Exception(es); return ; }; @@ -599,11 +598,11 @@ void HOMARD_Gen_i::InvalideIterOption(const char* nomIter, CORBA::Long Option) MESSAGE ( "commande = " << commande ); if ((system(commande.c_str())) != 0) { - SALOME::ExceptionStruct es; - es.type = SALOME::BAD_PARAM; - es.text = "Menage du repertoire de calcul impossible" ; - throw SALOME::SALOME_Exception(es); - return ; + SALOME::ExceptionStruct es; + es.type = SALOME::BAD_PARAM; + es.text = "The directory for the calculation cannot be cleared." ; + throw SALOME::SALOME_Exception(es); + return ; } // Suppression du maillage publie dans SMESH const char* MeshName = myIteration->GetMeshName() ; @@ -620,7 +619,7 @@ void HOMARD_Gen_i::InvalideIterInfo(const char* nomIter) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Iteration "; + es.text = "Invalid iteration"; throw SALOME::SALOME_Exception(es); return ; }; @@ -648,7 +647,7 @@ void HOMARD_Gen_i::InvalideIterInfo(const char* nomIter) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Case Context "; + es.text = "Invalid case context"; throw SALOME::SALOME_Exception(es); return ; }; @@ -661,7 +660,7 @@ void HOMARD_Gen_i::InvalideIterInfo(const char* nomIter) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Menage du repertoire de calcul impossible" ; + es.text = "The directory for the calculation cannot be cleared." ; throw SALOME::SALOME_Exception(es); return ; } @@ -676,7 +675,7 @@ void HOMARD_Gen_i::InvalideZone(const char* ZoneName) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Zone "; + es.text = "Invalid zone"; throw SALOME::SALOME_Exception(es); return ; }; @@ -707,7 +706,7 @@ void HOMARD_Gen_i::AssociateCaseIter(const char* nomCas, const char* nomIter, co { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Case "; + es.text = "Invalid case"; throw SALOME::SALOME_Exception(es); return ; }; @@ -717,7 +716,7 @@ void HOMARD_Gen_i::AssociateCaseIter(const char* nomCas, const char* nomIter, co { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid iteration "; + es.text = "Invalid iteration"; throw SALOME::SALOME_Exception(es); return ; }; @@ -728,7 +727,7 @@ void HOMARD_Gen_i::AssociateCaseIter(const char* nomCas, const char* nomIter, co { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Case "; + es.text = "Invalid case"; throw SALOME::SALOME_Exception(es); return ; }; @@ -1084,7 +1083,7 @@ HOMARD::HOMARD_Cas_ptr HOMARD_Gen_i::CreateCase(const char* nomCas, const char* { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "This case has already been defined"; + es.text = "This case has already been defined."; throw SALOME::SALOME_Exception(es); return 0; }; @@ -1166,7 +1165,7 @@ HOMARD::HOMARD_Hypothesis_ptr HOMARD_Gen_i::CreateHypothesis(const char* nomHypo { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "This hypothesis is already defined."; + es.text = "This hypothesis has already been defined."; throw SALOME::SALOME_Exception(es); return 0; } @@ -1210,7 +1209,7 @@ HOMARD::HOMARD_Iteration_ptr HOMARD_Gen_i::CreateIteration(const char* NomIterat { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Case Context "; + es.text = "Invalid case context"; throw SALOME::SALOME_Exception(es); return 0; }; @@ -1219,7 +1218,7 @@ HOMARD::HOMARD_Iteration_ptr HOMARD_Gen_i::CreateIteration(const char* NomIterat { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "This iteration is already defined. "; + es.text = "This iteration has already been defined."; throw SALOME::SALOME_Exception(es); return 0; }; @@ -1229,7 +1228,7 @@ HOMARD::HOMARD_Iteration_ptr HOMARD_Gen_i::CreateIteration(const char* NomIterat { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Unable to create Iteration "; + es.text = "Unable to create the iteration"; throw SALOME::SALOME_Exception(es); return 0; }; @@ -1278,6 +1277,7 @@ HOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundary(const char* BoundaryNam if ((myContextMap[GetCurrentStudyID()]._mesBoundarys).find(BoundaryName)!=(myContextMap[GetCurrentStudyID()]._mesBoundarys).end()) { + MESSAGE ("CreateBoundary : la frontiere " << BoundaryName << " existe deja"); SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; es.text = "This boundary has already been defined"; @@ -1309,12 +1309,29 @@ HOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryDi(const char* BoundaryN //============================================================================= HOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryCylinder(const char* BoundaryName, CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre, - CORBA::Double Xaxis, CORBA::Double Yaxis, CORBA::Double Zaxis, + CORBA::Double Xaxe, CORBA::Double Yaxe, CORBA::Double Zaxe, CORBA::Double Rayon) { MESSAGE ("CreateBoundaryCylinder : BoundaryName = " << BoundaryName ) ; +// + SALOME::ExceptionStruct es; + int error = 0 ; + if ( Rayon <= 0.0 ) + { es.text = "The radius must be positive." ; + error = 1 ; } + double daux = fabs(Xaxe) + fabs(Yaxe) + fabs(Zaxe) ; + if ( daux < 0.0000001 ) + { es.text = "The axis must be a non 0 vector." ; + error = 2 ; } + if ( error != 0 ) + { + es.type = SALOME::BAD_PARAM; + throw SALOME::SALOME_Exception(es); + return 0; + }; +// HOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 1) ; - myBoundary->SetCylinder( Xcentre, Ycentre, Zcentre, Xaxis, Yaxis, Zaxis, Rayon ) ; + myBoundary->SetCylinder( Xcentre, Ycentre, Zcentre, Xaxe, Yaxe, Zaxe, Rayon ) ; return HOMARD::HOMARD_Boundary::_duplicate(myBoundary) ; } @@ -1324,12 +1341,85 @@ HOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundarySphere(const char* Bound CORBA::Double Rayon) { MESSAGE ("CreateBoundarySphere : BoundaryName = " << BoundaryName ) ; +// + SALOME::ExceptionStruct es; + int error = 0 ; + if ( Rayon <= 0.0 ) + { es.text = "The radius must be positive." ; + error = 1 ; } + if ( error != 0 ) + { + es.type = SALOME::BAD_PARAM; + throw SALOME::SALOME_Exception(es); + return 0; + }; +// HOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 2) ; myBoundary->SetSphere( Xcentre, Ycentre, Zcentre, Rayon ) ; return HOMARD::HOMARD_Boundary::_duplicate(myBoundary) ; } //============================================================================= +HOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryConeA(const char* BoundaryName, + CORBA::Double Xaxe, CORBA::Double Yaxe, CORBA::Double Zaxe, CORBA::Double Angle, + CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre) +{ + MESSAGE ("CreateBoundaryConeA : BoundaryName = " << BoundaryName ) ; +// + SALOME::ExceptionStruct es; + int error = 0 ; + if ( Angle <= 0.0 or Angle >= 90.0 ) + { es.text = "The angle must be included higher than 0 degree and lower than 90 degrees." ; + error = 1 ; } + double daux = fabs(Xaxe) + fabs(Yaxe) + fabs(Zaxe) ; + if ( daux < 0.0000001 ) + { es.text = "The axis must be a non 0 vector." ; + error = 2 ; } + if ( error != 0 ) + { + es.type = SALOME::BAD_PARAM; + throw SALOME::SALOME_Exception(es); + return 0; + }; +// + HOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 3) ; + myBoundary->SetConeA( Xaxe, Yaxe, Zaxe, Angle, Xcentre, Ycentre, Zcentre ) ; + + return HOMARD::HOMARD_Boundary::_duplicate(myBoundary) ; +} +//============================================================================= +HOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryConeR(const char* BoundaryName, + CORBA::Double Xcentre1, CORBA::Double Ycentre1, CORBA::Double Zcentre1, CORBA::Double Rayon1, + CORBA::Double Xcentre2, CORBA::Double Ycentre2, CORBA::Double Zcentre2, CORBA::Double Rayon2) +{ + MESSAGE ("CreateBoundaryConeR : BoundaryName = " << BoundaryName ) ; +// + SALOME::ExceptionStruct es; + int error = 0 ; + if ( Rayon1 < 0.0 or Rayon2 < 0.0 ) + { es.text = "The radius must be positive." ; + error = 1 ; } + double daux = fabs(Rayon2-Rayon1) ; + if ( daux < 0.0000001 ) + { es.text = "The radius must be different." ; + error = 2 ; } + daux = fabs(Xcentre2-Xcentre1) + fabs(Ycentre2-Ycentre1) + fabs(Zcentre2-Zcentre1) ; + if ( daux < 0.0000001 ) + { es.text = "The centers must be different." ; + error = 3 ; } + if ( error != 0 ) + { + es.type = SALOME::BAD_PARAM; + throw SALOME::SALOME_Exception(es); + return 0; + }; +// + HOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 4) ; + myBoundary->SetConeR( Xcentre1, Ycentre1, Zcentre1, Rayon1, Xcentre2, Ycentre2, Zcentre2, Rayon2 ) ; + + return HOMARD::HOMARD_Boundary::_duplicate(myBoundary) ; +} +//============================================================================= HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::CreateZone(const char* ZoneName, CORBA::Long ZoneType) { MESSAGE ("CreateZone : ZoneName = " << ZoneName << ", ZoneType = " << ZoneType); @@ -1362,6 +1452,25 @@ HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::CreateZoneBox(const char* ZoneName, CORBA::Double Zmini, CORBA::Double Zmaxi) { MESSAGE ("CreateZoneBox : ZoneName = " << ZoneName ) ; +// + SALOME::ExceptionStruct es; + int error = 0 ; + if ( Xmini > Xmaxi ) + { es.text = "The X coordinates are not coherent." ; + error = 1 ; } + if ( Ymini > Ymaxi ) + { es.text = "The Y coordinates are not coherent." ; + error = 2 ; } + if ( Zmini > Zmaxi ) + { es.text = "The Z coordinates are not coherent." ; + error = 3 ; } + if ( error != 0 ) + { + es.type = SALOME::BAD_PARAM; + throw SALOME::SALOME_Exception(es); + return 0; + }; +// HOMARD::HOMARD_Zone_var myZone = CreateZone(ZoneName, 2) ; myZone->SetBox ( Xmini, Xmaxi, Ymini, Ymaxi, Zmini, Zmaxi) ; @@ -1372,6 +1481,19 @@ HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::CreateZoneSphere(const char* ZoneName, CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre, CORBA::Double Rayon) { MESSAGE ("CreateZoneSphere : ZoneName = " << ZoneName ) ; +// + SALOME::ExceptionStruct es; + int error = 0 ; + if ( Rayon <= 0.0 ) + { es.text = "The radius must be positive." ; + error = 1 ; } + if ( error != 0 ) + { + es.type = SALOME::BAD_PARAM; + throw SALOME::SALOME_Exception(es); + return 0; + }; +// HOMARD::HOMARD_Zone_var myZone = CreateZone(ZoneName, 4) ; myZone->SetSphere( Xcentre, Ycentre, Zcentre, Rayon ) ; @@ -1384,6 +1506,26 @@ HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::CreateZoneCylinder(const char* ZoneName, CORBA::Double Rayon, CORBA::Double Haut) { MESSAGE ("CreateZoneCylinder : ZoneName = " << ZoneName ) ; +// + SALOME::ExceptionStruct es; + int error = 0 ; + if ( Rayon <= 0.0 ) + { es.text = "The radius must be positive." ; + error = 1 ; } + double daux = fabs(Xaxe) + fabs(Yaxe) + fabs(Zaxe) ; + if ( daux < 0.0000001 ) + { es.text = "The axis must be a non 0 vector." ; + error = 2 ; } + if ( Haut <= 0.0 ) + { es.text = "The height must be positive." ; + error = 3 ; } + if ( error != 0 ) + { + es.type = SALOME::BAD_PARAM; + throw SALOME::SALOME_Exception(es); + return 0; + }; +// HOMARD::HOMARD_Zone_var myZone = CreateZone(ZoneName, 5) ; myZone->SetCylinder( Xcentre, Ycentre, Zcentre, Xaxe, Yaxe, Zaxe, Rayon, Haut ) ; @@ -1396,6 +1538,29 @@ HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::CreateZonePipe(const char* ZoneName, CORBA::Double Rayon, CORBA::Double Haut, CORBA::Double Rayonint) { MESSAGE ("CreateZonePipe : ZoneName = " << ZoneName ) ; +// + SALOME::ExceptionStruct es; + int error = 0 ; + if ( Rayon <= 0.0 or Rayonint <= 0.0 ) + { es.text = "The radius must be positive." ; + error = 1 ; } + double daux = fabs(Xaxe) + fabs(Yaxe) + fabs(Zaxe) ; + if ( daux < 0.0000001 ) + { es.text = "The axis must be a non 0 vector." ; + error = 2 ; } + if ( Haut <= 0.0 ) + { es.text = "The height must be positive." ; + error = 3 ; } + if ( Rayon <= Rayonint ) + { es.text = "The external radius must be higher than the internal radius." ; + error = 4 ; } + if ( error != 0 ) + { + es.type = SALOME::BAD_PARAM; + throw SALOME::SALOME_Exception(es); + return 0; + }; +// HOMARD::HOMARD_Zone_var myZone = CreateZone(ZoneName, 7) ; myZone->SetPipe( Xcentre, Ycentre, Zcentre, Xaxe, Yaxe, Zaxe, Rayon, Haut, Rayonint ) ; @@ -1411,7 +1576,25 @@ HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::CreateZoneBox2D(const char* ZoneName, // MESSAGE ("Umini = " << Umini << ", Umaxi =" << Umaxi ) ; // MESSAGE ("Vmini = " << Vmini << ", Vmaxi =" << Vmaxi ) ; // MESSAGE ("Orient = " << Orient ) ; - +// + SALOME::ExceptionStruct es; + int error = 0 ; + if ( Umini > Umaxi ) + { es.text = "The first coordinates are not coherent." ; + error = 1 ; } + if ( Vmini > Vmaxi ) + { es.text = "The second coordinates are not coherent." ; + error = 2 ; } + if ( Orient < 1 or Orient > 3 ) + { es.text = "The orientation must be 1, 2 or 3." ; + error = 3 ; } + if ( error != 0 ) + { + es.type = SALOME::BAD_PARAM; + throw SALOME::SALOME_Exception(es); + return 0; + }; +// double Xmini, Xmaxi ; double Ymini, Ymaxi ; double Zmini, Zmaxi ; @@ -1450,6 +1633,22 @@ HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::CreateZoneDisk(const char* ZoneName, CORBA::Long Orient) { MESSAGE ("CreateZoneDisk : ZoneName = " << ZoneName ) ; +// + SALOME::ExceptionStruct es; + int error = 0 ; + if ( Rayon <= 0.0 ) + { es.text = "The radius must be positive." ; + error = 1 ; } + if ( Orient < 1 or Orient > 3 ) + { es.text = "The orientation must be 1, 2 or 3." ; + error = 3 ; } + if ( error != 0 ) + { + es.type = SALOME::BAD_PARAM; + throw SALOME::SALOME_Exception(es); + return 0; + }; +// double Xcentre ; double Ycentre ; double Zcentre ; @@ -1479,6 +1678,25 @@ HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::CreateZoneDiskWithHole(const char* ZoneNam CORBA::Long Orient) { MESSAGE ("CreateZoneDiskWithHole : ZoneName = " << ZoneName ) ; +// + SALOME::ExceptionStruct es; + int error = 0 ; + if ( Rayon <= 0.0 or Rayonint <= 0.0 ) + { es.text = "The radius must be positive." ; + error = 1 ; } + if ( Orient < 1 or Orient > 3 ) + { es.text = "The orientation must be 1, 2 or 3." ; + error = 3 ; } + if ( Rayon <= Rayonint ) + { es.text = "The external radius must be higher than the internal radius." ; + error = 4 ; } + if ( error != 0 ) + { + es.type = SALOME::BAD_PARAM; + throw SALOME::SALOME_Exception(es); + return 0; + }; +// double Xcentre ; double Ycentre ; double Zcentre ; @@ -1733,7 +1951,7 @@ CORBA::Long HOMARD_Gen_i::ComputeAdap(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOM { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text= "This iteration does not have any associated hypothesis."; + es.text = "This iteration does not have any associated hypothesis."; throw SALOME::SALOME_Exception(es); return 2; }; @@ -1795,8 +2013,7 @@ CORBA::Long HOMARD_Gen_i::ComputeAdap(HOMARD::HOMARD_Cas_var myCase, HOMARD::HOM { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - std::string text = "PB with meshfile destruction "; - es.text = CORBA::string_dup(text.c_str()); + es.text = "The mesh file cannot be deleted."; throw SALOME::SALOME_Exception(es); return 5; } @@ -2101,12 +2318,22 @@ void HOMARD_Gen_i::DriverTexteBoundary(HOMARD::HOMARD_Cas_var myCase, HomardDriv HOMARD::double_array* coor = myBoundary->GetCoords(); if (BoundaryType == 1) // Cas d un cylindre { - myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], (*coor)[4], (*coor)[5], (*coor)[6]); + myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], (*coor)[4], (*coor)[5], (*coor)[6], 0.); BoundaryOption = BoundaryOption*3 ; } else if (BoundaryType == 2) // Cas d une sphere { - myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], 0., 0., 0.); + myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], 0., 0., 0., 0.); + BoundaryOption = BoundaryOption*3 ; + } + else if (BoundaryType == 3) // Cas d un cone defini par un axe et un angle + { + myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], (*coor)[4], (*coor)[5], (*coor)[6], 0.); + BoundaryOption = BoundaryOption*3 ; + } + else if (BoundaryType == 4) // Cas d un cone defini par les 2 rayons + { + myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], (*coor)[4], (*coor)[5], (*coor)[6], (*coor)[7]); BoundaryOption = BoundaryOption*3 ; } } @@ -2201,7 +2428,7 @@ SALOMEDS::SObject_ptr HOMARD_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Study Context "; + es.text = "Invalid study context"; throw SALOME::SALOME_Exception(es); return 0; }; @@ -2415,6 +2642,16 @@ SALOMEDS::SObject_ptr HOMARD_Gen_i::PublishBoundaryInStudy(SALOMEDS::Study_ptr t icone = "spherepoint_2.png" ; break; } + case 3 : + { value = "BoundaryAnHomard" ; + icone = "conepointvector.png" ; + break; + } + case 4 : + { value = "BoundaryAnHomard" ; + icone = "conedxyz.png" ; + break; + } } PublishInStudyAttr(aStudyBuilder, aResultSO, theName, value, icone, _orb->object_to_string(theObject)); return aResultSO._retn(); @@ -2526,7 +2763,7 @@ void HOMARD_Gen_i::PublishResultInSmesh(const char* NomFich, CORBA::Long Option) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Study Context "; + es.text = "Invalid study context"; throw SALOME::SALOME_Exception(es); return ; }; @@ -2606,7 +2843,7 @@ void HOMARD_Gen_i::DeleteResultInSmesh(const char* NomFich, const char* MeshName { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Study Context "; + es.text = "Invalid study context"; throw SALOME::SALOME_Exception(es); return ; }; @@ -2653,7 +2890,7 @@ void HOMARD_Gen_i::PublishFileUnderIteration(const char* NomIter, const char* No { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Study Context "; + es.text = "Invalid study context"; throw SALOME::SALOME_Exception(es); return ; }; @@ -2663,7 +2900,7 @@ void HOMARD_Gen_i::PublishFileUnderIteration(const char* NomIter, const char* No { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Iteration "; + es.text = "Invalid iteration"; throw SALOME::SALOME_Exception(es); return ; }; @@ -2672,7 +2909,7 @@ void HOMARD_Gen_i::PublishFileUnderIteration(const char* NomIter, const char* No { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Iteration Study Object"; + es.text = "Invalid iterationStudy Object"; throw SALOME::SALOME_Exception(es); return ; }; @@ -3267,7 +3504,7 @@ void HOMARD_Gen_i::IsValidStudy( ) { SALOME::ExceptionStruct es; es.type = SALOME::BAD_PARAM; - es.text = "Invalid Study Context"; + es.text = "Invalid study context"; throw SALOME::SALOME_Exception(es); }; return ; diff --git a/src/HOMARD_I/HOMARD_Gen_i.hxx b/src/HOMARD_I/HOMARD_Gen_i.hxx index 72d74caf..c3cef187 100644 --- a/src/HOMARD_I/HOMARD_Gen_i.hxx +++ b/src/HOMARD_I/HOMARD_Gen_i.hxx @@ -66,6 +66,12 @@ public: HOMARD::HOMARD_Boundary_ptr CreateBoundarySphere (const char* nomBoundary, CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre, CORBA::Double Rayon); + HOMARD::HOMARD_Boundary_ptr CreateBoundaryConeR (const char* nomBoundary, + CORBA::Double Xcentre1, CORBA::Double Ycentre1, CORBA::Double Zcentre1, CORBA::Double Rayon1, + CORBA::Double Xcentre2, CORBA::Double Ycentre2, CORBA::Double Zcentre2, CORBA::Double Rayon2); + HOMARD::HOMARD_Boundary_ptr CreateBoundaryConeA (const char* nomBoundary, + CORBA::Double Xaxis, CORBA::Double Yaxis, CORBA::Double Zaxis, CORBA::Double Angle, + CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre); HOMARD::HOMARD_Cas_ptr CreateCase (const char* nomCas, const char* MeshName, const char* FileName); -- 2.39.2