From 27b76ed1590e44a36b904ed7ef530c4b94ece2ed Mon Sep 17 00:00:00 2001 From: gdd Date: Mon, 15 Oct 2012 11:36:19 +0000 Subject: [PATCH] Merge V6_main to BR_meshgems --- .../images/ghs3d_parameters_advanced.png | Bin 30526 -> 40859 bytes .../gui/GHS3DPLUGIN/input/ghs3d_hypo.doc | 3 + idl/GHS3DPlugin_Algorithm.idl | 5 + src/GHS3DPlugin/GHS3DPlugin_Hypothesis.cxx | 48 +- src/GHS3DPlugin/GHS3DPlugin_Hypothesis.hxx | 7 + src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.cxx | 25 + src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.hxx | 5 + src/GHS3DPlugin/Makefile.am | 32 +- src/GHS3DPlugin/libmesh5.c | 1346 ----------------- src/GHS3DPlugin/libmesh5.h | 153 -- src/GUI/GHS3DPluginGUI_Enums.h | 2 +- src/GUI/GHS3DPluginGUI_HypothesisCreator.cxx | 63 +- src/GUI/GHS3DPluginGUI_HypothesisCreator.h | 2 + src/GUI/GHS3DPlugin_msg_en.ts | 4 + src/GUI/GHS3DPlugin_msg_fr.ts | 4 + 15 files changed, 158 insertions(+), 1541 deletions(-) delete mode 100644 src/GHS3DPlugin/libmesh5.c delete mode 100755 src/GHS3DPlugin/libmesh5.h diff --git a/doc/salome/gui/GHS3DPLUGIN/images/ghs3d_parameters_advanced.png b/doc/salome/gui/GHS3DPLUGIN/images/ghs3d_parameters_advanced.png index 74b2be1038da5c6d32952d98819d7a2e547885d1..e99409e914a274836798494e7f542535ba65c4fb 100644 GIT binary patch literal 40859 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 V#n|QjO@snGbhQjME7k47{s%82R=fZJ literal 30526 zcmb4r1yogE+vlZ0y1NljTDns}P(qMyL_k2gyFpr{q(McbJEh?wNOyO4H_X2N=Y8j! zcV>OFW-YA4x#t}A-sgFKwGCHMlEZvN_6P!jV7`!-c@2TUqd_2Wk*LVvh{^>Q7Wf0r zPF~v)e18J`3Ws}#vy%f3aydQMa*{D~Gk(e^-^IQf=xRwp6KS-6#F((DzZ zKX5)5y!+y+ceg+gg*-kvR@apmKW{_If`ONr4|Gtww_0l zX?hB;$R&vXdLX1MOp>?|&DXpO3QX`okX^KYL#uMq7f*Aws<(4Lz zKhjhh;CCozjMU^ISxHE{=pl$J-4=f7t^P(gShFcJRug7h!bT%=wUvLu7%>Y*vWttc zo+dnM^6^p0f`94$T(IDcRo0NjzC!(V@xsSfQL=$Qe?C>87;TYz8Z7fPSf?mN;ah-j z1kvHeMW_rNuC;O)cEA}0DdC~I(D~*h_wgWxEWX<@JB53x+8!A~Q2HW>#hi6%`yWFRvC7{t%^?f^G_Or5T}l z6s$eMxGJ?WU5n|$!4J5&2~2C1>Z_>uWkpj8 z&Lr;kc$pbJefo5A`U{zl!Urt8mhvA(MV*ySD;5_vh}u>si|&NxDg1>DTta`WD5QOby40_ASXn{!pUmbEO0 zrO*Re5}M=$XIH<)u;>U`+{uvpt*$8YFrrEE-+_UzZkXCDPbEv^y)&z5ByAhMensRG z^_Z-_TX>-R(OPZ1U>#PH$&q|~>`+}?JzmK$N5cGL?7d#^fLu(5C=K3N$@j`2E!Gf? zg7)AAU%8F`blL=k^pg=abP~!T$BW89(PJtMfexM;LW9v6!IWd^+s?!_Dd*JK(3W`2 zh?;sns=m7c<1uk#(^dRO6FDOOiI6jIR*asOMBbRcu@#&K%Gy=B1t~!&kxgz^Ac-GI z6)&NRCXv(|Pn05I*<9xv&I%Xp#Lm5$nxS$t#Zn<6-YzxDF49mkF)^{jlaqGXH_A-q zBHD!lz9?o#OtEgFDnTcMa75`BW^?G(=U)m=v7kF16ZI@~R7Z7siMYd|KkUYBT(J*U zQ)NVxiUy02^emHmQLgk@u3TeaVM!fDiId~;7fnV->j(tVrA!ek^f^)o`LhDY>%7;RfvD8Bza@x%AoMrKh{NqIRQn{G8vS<%6bkk;mnTeWW0 zvh_eFKej(5{L!?Pnn2yFRKBG@Q`}k!RX^ulB8bj>TsMt|s=HsWKh)P!`rfr{0Q^7gE2Hiob9;a>7g!Oz{5G$iOPYoDyP@;OI2Ye~Cv*Za;j zKJG@L>@{f*!IW20kg=c!aw9{My<{>*lWu zhWh$Zi;G67clhQrFBe=l2Wc4?8I3M7=HA^j&3McZ9seAAud1UFVuUag&!jBdpCPJs zHvbf?_S>74n4=*%@>o9ls0y~EUR4c^ciS~^L~?ixJ`NIj0XlEOS%_mKbB%t3j@ad7Rdq;Pf;fxl3 z1gN;PxSlc|!|&gpc`&-(YrH)>+`mPd{ibU(Y90A5d1U0rSRy`mY0ZbZ(8*s`#C%?- zxE`mQ;X4!PWhR}EM2NWLjvr;FLLhzGt|J3+&b*z)-3E9vb{S3EvR{kDCCD zt61?Q(o+Rm7;;AQP(?>d3FK_RQ>J<-&Hol~m{_T7Y!PfcWcBL)M6M*#@QrdUL^hLH<;-J z4iE{Z;Itb|h_<$NSoD5$Mw#eQC$S-fHA0b?V>!Fb6o-oFqvQo<$8UTl2!!PsH||UY z6T$J~wJO>uc6$Zn88`P(g}HL~TI;M>d&6yv_&v!%kq>p5sA($%6&DJmWVKk}GqSNXTeomngG-M?HXNSBzt7(*MT?ExTYkAVVaR2D$r%(JY@#JSwcYFd zMuW&Cr-7cYnyKmbSn*zPA}RQr)$dv7weBDOD(SKYp}R%49+aM|ecN@aPy^8-4fH5k zuwW9|y-}*Fs*;7ApFU+N;JhfRvAa^B(kS+bSrE@38{E8M;SxC-=Be26sZ;z&F`h|Xeui9F0QNuqA9;@QD*XOOD@CCwn^oy z^}eajw`td;Au;BXAEYNz9Q!Ozt@OHUN*!$D}XX)jlnAKxB4 zG=)tVDx;tqT}N(RZj3y1Bs3QM{j<_?q;~1J`NRA&W_pd~4AFz=gRt1`qBN^cEriuC zUoCGj#hhvR{XOs7x2&y^m83@6L{<~Ut+REGs&2o2%!kbTIzl6vHJ;)U5+dnK%jKJD zgK;d@`>vGQbK>4Jny=?x#dm1G6j0L&uVwl<5sF#&_7}Byt-VD;5ZtKlh&%f)gSR0OSFkl=1;yr6naJJ zGkLG9jv^8nXPSxk-P}*%TU#(X@t_zd4jnS%2uh?p; zeAY!y^01jJPr?bIrA@axdoT9&^%M2?y!Fm|0k>92n-o+bib*9BPZM$gIG$^8etusC zALR6U(If7YVuKnJ(&rwNQdaahdBi#qlIJ}pL7~CN1{PhM7{$a-%3N)+_zDeU6qDGO zu80j-g*}2Bzei)~qs;e3LLBAm@D+}jQ zaHCHvO>Y2hI1M&dz-#SDiojC?3wh=2Sm}J$b?c`D4g>}q0rKj;57`%lKT3A8Y13H%a28IG_wg1rMK2NMcjI{7e<*-qY2H3gAn)X zjylUg`#f0p&y{Uvs@Kkx0p5@*)r%g=y^o&rbg(-q!BchJu)U@3f9ofOzL8Tz7^|*dheO{3+Ba!eN(A{eVINXbAp~j+0ryW zpB8Ys>{>*U@scTvT``#7tQYBqMTh&x9K{Fz@U3rMmxpgA&<-o`mDZY3(7W98oUK#) zkR+sHm{p`x)wVT~M;m`7RrLCZ?~P5-Z?TjZY^4m5aE&4zNo!-Ju1V#VXkl9f%6-FZ zq3CEV0YNFFq-ark^mqGSh4XBJ4oRzR!jB_dCHQ1XAX(qPBUd4l=V8-`h)~$uA5Avf zQXij`&~b6ajm*^Bu)Ke7b#%3%J6NU5?`Jmj%}UdH=34Om`}c=eiENwWzl0&M{odZc;x68=X+W=ex=b3!Wn(uuvjpSH-Cd>N&18eCxRkWi{`CD;p2rMb zZ?>O|oooC17WI3qg^$vkUr~e3q0NVxzfw8fHU*q8u*!-C%w&UFTFzs81LItIu^rqw z!Rle{sX4uXb}A;}k`aY~Z{kEehrcs}i=>GVMlKZ^xl2LtL9U9R1oHAFvaC4Ja+YyCKDDm`^2ZKt41f7UIK*`lr zOhx;v%z;4}Di&7PG`1Kby3yFr3r^>4f08-FfH8!-H&icy=l|yQ&QKHj`GA9-nSdyk_-a07`hZWn!<8& z=$y7k(YS|)Yfl9;7d&=~2VC0`@u^=8OMBmcipNvc)s3M0HvDy#m{rS9)6kPpCki>9 z@zr{CbIrAA4@p#g>#hxQo0ffD7^XVI^z0WHuDoUB(@0077&`UjTJPN-t z#mU#+Zkb^?V~$K%@Wje9{3s|w%H=2taVQ4Y>X6b7$9Rj`J8rE_)+|~LCwY-|j#Ys^ zSS9%0I3_wN50hfZUR&pbUZ_!Fu4;k(N*87tm@OZlrZ5NNhp#|XnI;;%7~8TzK|-sr zk!#k`)QzAL^`PngxOdIZK26R5VMizU7!jeWq7~-2(Vy+>B_f3E>=%YB3EloX$k(H! zr`u!b#>U36y=&(vsIp?h!~PATEu6#nUw7J!TE7=ZIEloCRCt8c8yjcCcx}D&4(D6> zM|tE#WC5U11y~Dg2de0qc54eOsPyomy4B0L8$sh4Qi>OyW@^ZM_~jhmx_Ii1Mr7$9J!0MF zTW;~oJAf0Fri{3YMOy43EB*L9>_2(tY6H*f)51u}MRcplNLj9Gelm7c(@0mBu+}(V z79Ub8U2gQmA;F!`;^9mVo;l%|s4b}KD@T(F{M=~kpZTPpG{aYZP-ruOga#>*HeCu4 z_H{);hahs;@$?iJ`C=$#(6@%$f8jgRr{F{#t{J={-}$oHkbhD$%42suPKGTEkJ|rz zu&Y~XCgA0Cd{e5O;&!wP279@US`IEUKHnL+yHU%C>pQ34^HxyIGw6^P5AqEj(OElg zaoAgd*|8MQHnCnIB36Orn2KCy}x;dYbMgmR+|3wTtgfp+asM#q=Ho6o)qalb=Zr2J6aGEJxXh zBykWWaYDi(KaA~qvT^_Y*98Uv1MDcGG0`JD)BqaP08YjBFNiuK5`T}1Q`t?)xAhRR zlsR-NXr|D^&S>l91X856P2ZgB&`u$$uF2ZRgzi6oR_`^5Sc>HFVHX=B;i3>cv;xJj z-v1)(TNKLKSuPUy@H-GS^mHNXs3-7G|9iTT^5c?k`~v8zg7c z)6+BgWxK%&PYZ4Yb09_m;TCcUFS@*{XT<5^!!dtwA{Sx5zU!W*O7(RM8Fq1tRZip) zOtxFyN%2pd^ft(1Vx{mumQYaFnG1^SnI!~#ZUv}(ckP|_h6!=g=>ZVb+FfYQ6fVx} z=j^as0Q~ysk9ek}(}jf-)B(lL65fI0WRy&=v8;bKPPFEtIl zgNtUWmt!J)je0&mal2Yea=-2|dCYE5ANEZ#$>gs7Y_ie4VzCkp3_(sE&86B<2<0!4 zwrkV?+9sRJ>uOoTXG!MEbFTB93skq{H6;&z_mcufxhk5f>gqv9G0}22=X-FF-@kv$ zD=Do@VPtFoPB7y4`=g9{4_ zYgwcXjQjM-M57tt{mGPHBRNI2wE}u|UY*~?|E{@N9FaL3Qrb`vsSj%Xc0H2Huh>-5 zun9IMrgx}oWLpH7Rft&JQ)%NFmD|b=qL+UAiiDr<&6u{%pdX&!*1S4>sJ%qF-|&4v zsW9)Wp5gerJoZr^;ib7h`}?HUuNfQ?tl|o8C%+d>8kAiwg;Li(^dZ4Xp<-ZkbjQ&j zO@E$<{lzk~3*Q0oz47qZ7Xps!k&$!|;bVXi*- zr zVtr1A$B&VExsy!Ce!g+r`j*tfiQ#dv9|fq5Olg#PhBtEWynYC`c|RZvbnNU{I};@v z(HCJ`{$L&F7FJ>);2|#>K3o$k8`5gFK%pqA`ZUnqhm5Y{VESx z{ADu~o6d3)TcD?CtIq%%FWE@@SfdL~n%YU@r=u;oBQ_C%H* zjUD};LTRx~f`sPci}dO5nVty$s-NgcXn!xA92|i7_fvmNF6d*^a%A8Q4GlG~hj&%; z)q%UCVfI7sRklNeYnG$8E!}D({=B5g^_iTpGXLfEb(`FFV12z%jllS<5ef3%bTv%i z&wj02jM3E86noXJl9%Ivw9CR@PnF8&RDAF%D8sc)?XVen?@%5dqCTOX8#!Ocn!LUJ z-f4Fdm)~|SNH({OSu^jaw3*pA6j7_$AL>slttR^4)eW6Zp5p4rZR+uJz^-v3K*#`8 z88W(ZgaieoD2>3yETh?aZ*-la@fmhrwC(L}6%B)s^S$Yn^`caw-l$^e_n1K;sf~Jf zNgLCZ&U_llyfMiljfS2i&w%0K*M3L=0ReUmr+jaa{YS^gr8>d}oAf;+qEPi?`VeTH zgZiCM0;jvW!X4?+gxKDwqcC3;AkxL5QVKa`^%$Xy@s8nyv!Xn566K?|9>W!y=)-?c zPEL(idaEowee(L<$92lQLl0W5Qt$%GXltiHp9V@5TZ~dKmaiF_y;++JR+9aDCv>a7 zck0x&p;wJD7HMhweZf#_)LLFCSWieqw7lMzii(QrC%-z&!qW7x?+Gfk*Uesy(v;<+ z+5E;pK$R*j=R!0;WYkk(Q;S75$J`3z;p6>s*>mIG>r#OY-NC8;6dzvy($TQE`!T~O zym-6i4m4$^z1QHcdM0^4exRCtGqV_}$0X@Gim}?8EJGL?8k#&>!%Dgwo6Il#8KhGr zJHux~$zJodgCYJE>OqMQ^+D4OyN}3GuJjfkVPtRnn~BC>wK>s)bss!xf7&plwXaCF z`C{FpsH&<8xE*HY#eev`=_CZC6&Yt|-swt9gsx(=ObCfA#Do71qZR#A=bu`F4!EI8D}G4!D^b`Fo~ z;9;upK2_BGFOQS{m9w3RqeE$IdL9OXM|A-+hOb`-py4yph_F%w?vn=rCqm~;8I`qn zS!sb`8`ZKF2}Q^l zz&cr;EHl-rbi;+s#^~s%9TbdXsq>D82+uh!1Jh#!Nb#CsyV`@>BWYyp)-SwPZbQvg z4QXKPfa~FF+Hr_Wa(1D5xxQmtYQG{INg@VMFBjcWW(pOU(yjSm++(E%>&{1)rZFoM zhCa-%+h_ij1z4N9a$A9th*=BViya?auBY0%S(47jQ3yI9#)zK_?324uQ@LN_uI~QE z)nf;CNK%QOtiDaUwCyKhw?i5{JiNhQo~{fG42v!P2(x8^j_XFFKU4)CZrtS`zlKPp z^4V~{KV`PQx8`QL03g74bW_!0yv-Y zMswd@=2;gj0|O(?!FwuO{nlOWinuRdJ}M@07%$}nCv$m+ym<&}D`)NL>4gv-o}5)E zP7savi}scSYihmUd+3Z#!LY49xy&O#)mvT@92$lD#>h7eyYtK?gIR51V@dNR*6bz2$<7YJw!5fAxOqpKr zQL+eCI#EF6Y(pPthGaE4EQoLV0EN`lYuk;0i0F7Y^_lad+q*li_oK{u%|7WfzPFe5 zjn~@+u?kn|cQp$>5teFs*^X}JB6p)B-MzgPTbU|aiO(&ypMaDH{0z!;k*y7?&Ssrq zwKXXoKED0wPA&(r8^4cCikyF-M)vWFI*O6w^+*ZtYnuqFE1kBOg?I|`ga9+)08E={^ZfzyEi2HpQR zg8Rb)|DjkhULMAar6>zdjCM-yYSSO)Y4<-1-w1e~v%=){#n!;M*jSocJq$E7G)cgx z7x~%muQoC_7fQrSmI%US1b}=M5D&WZss^hC3x zt-MS+Pfb2ZmTSqpR!S9KAPTlDP!@p{-nB&{?rn7GtNxZiDN`^Cs6{7Uksl-5j#i+! z1Qc(Vn|U90B_BGZ!PFd|oFHwHWJ<4?N)6mCq96m6-P>a9C*l5VU0|7M*K(?D^U~Ws z{Rt0u=|cSoSlOBP_N?Q<*a@IbV%Kkr+~O|v9QaVm8UZ+f^!QI!r>)`6^{NlMc~wH| z@>F`-a$1R11$&m!8`EhA(bdl5{ZUoNM;%w=^mySo_>>5oE$PCpY30wgLdLdh7w*~a z(mj;}L}we_@tKq}z)EG}H1DT?oH5yn+)&(tp*pi;gJ#dT(l=oo@kZ7MI&O@2?Mbk*56tIzC~BW5UsNTnCQ1R zJYzBQolQzw`jxCWh2&;kP4JPkjpc{2@hWBjP8;YL7!c)RsE~TgQNfY`Ba1jyQ*)ov zu0uBelU~Z=`tT)CInm8Z7hJx@KHe=*s;ulI*T2*ItU z6mufUg+_LTXDZpvNMnlzwTEIk68_f8b3K^9G`S%L!rNq%x3DrJGczj8|9x*|RafVH z$7QNJey^;g)HTg(rK+tR{^=85qv(T;qz8aq%Y#9T>&BcM-OQ*=+P&L_Tig0rN4~rnhLL%tEQ1eh! zXS-AvK9KF(e9xE*KdyD%|C-`qNq|mB?vRL`UAGA%At51bhdgxDKA(ik1kv@+7vJ+7 z!`wmIQUox3Hi^7O9(`zn7hTZn^SuZF4yB7UOm{YPafyk|d7~~b-K^&uNy(x@Y8Ixe zCi9f3*`sW9YqZbqj-b@gYMYr-?;97Gn~tTw1FP$#a>t83LMF;HBWVLwybDneuBWrL z?ca0Bd&_Ixw&+0KXb_}M@}|+HNHFQqqM!HEm36n1}v z&q+kz^S~n@9Bo^bJSsm~jaOd&ji#JaT}=c?udKB-tAWSX+ywz zAu3&LUNt}5h{t=sc=2NPzPnqV;_jN+^`-bngi&9Iiw!mL)J^fb(-F7pt-QL25ujHu zbg99GJcNdXm>e|yVmzO&vI>o&w&mFYb$~)LZzQ|2kbqLy2@wIA|Gv@qjTjeg+{MEd zcV6AXcrk7Jf^EM$zT+oa6A_HmIQNS0w5HiIe=}ORVmU}vByq-h` z%D$AT;xmzG%1WG8ngfTp?Pc4)-ptzGQGWk5QGdkyfq4a#1%0{QF&j`55)VQigdIQ3 z8jp~&8`ebvCk+nbjWMuxxZ)qei{^@+f*XO9VmVd*`29~Sm1E6t#X0U!ouaM{T`_33 zbm-yL_`qC72LIM%HvO&6*6ElCNvY@$M_EIq@zB4T2& zgvg!NbhLAq@g-Aa^%s!-Ie7+%ac^J;Vcp{l`XvPKEuubS`azY3O(| zCLh=JBei5C16WiG#?I&;VHzeB6cwFSD+a}H?x0qQBC3ez*zKINRoYHa`6k|O*|>h8 z#433ai_$x{HX^Eg6lG%DFle27zC=h9J7{;MWwGt0w>9cmlv|Dllmo8filV~gOzK01`P2u0xe z^j9n&-@mA3~GQKGVD|=Z#xVBJPN2zY^lu+ALPuxEr^NH zt>u3<;;icMTBbvb*eq&E0q=Dl+xrQ-u!%$0iw|>b)33V;FBb!`4-e_F9dFKe z=L0nj+&lAo6cZMN-O6W4N0oWQo|}L#`3^j<+au`g5pYb^ViytD1A^u}T~ZU~${bN( zkUMn5K~s1U>xT{P7div&cp3%?oMCx$Gc)5|X;WIf@T`%o*o1_&N?Y~tUx7@$b9QV2 zGIahjbgiqu<7q*;p7%VEWQ^YdPAUBm2ZkimT+=EEsoVl%uqDjFc z#&uU)fk@qCY6UT*l;51=?X#5dNU35!sbUE)J&|Y%F?dL_s1;v%MTKC>T!V}0IC+JD zyYw6gLeYXXb$z-Y2up>m^(2IaM@yDW8VH8Ll1JcZZ6G6Eyp~FO?q~P{TnBp6;HWwpn+_ zS8qReD(G?4NAp@u812tqub>mNb%2g@I9GOH2avKCfOvr0#ZB>yKIMhMvdG7z$)`OG z7Q8yQUfbrZ-sVr%2QoPX2Kpy)e+qk!TYvrjeR+6IQLEO1_T9_OrPB1)K$I1rcak_g z(EQ2ZO*LmaP@ux17Q`?s!vg^hnf?rl{mFhx;keIfLH)Stua3DK*I&LZ?glv)mdPql zVx@F3GrC+>4TqVW=MkJfw{DW|6(}LbGNSe$#Oj)wj`bl| zRZyk3G7SCq4n%Npa4Bj?E)4=V~(M@T>GUM^nkZj?|Cm8-bnblPB3Vp;{^4i zHS=DuMS9sWU{Uf>mMf>mg(PURaJd~C0e>!AccOuE!tk+gHV{A{z$)%ULhIT*h=$e2 zhr-qhI*fLSf-xypqTK50abw~BOAyoVPZJExTBOO_os^=cfk-$wJOiMm%yvQS^6HBA z>C+x-KL`Z)@e)2hVogHFgwHhJ0;D-p_O6c%zYfGxjBcud_Tz}+>T1hkE3?vS$FO*F z&`ey&Z!t&{I#M}~CE&5AWhKsPtn6L7o-|l5g|pvfWrb&rgenynl$=bW$5I=zxoHt^ z3gYgtbx}~zUT)S~dp9;Vmds;`2V-mz#2j4_z@-P;Vczjq6=u7|7C11|o<+~{zJ4|O z{pm57;?URm9R=}*&fQ8TCUks-3y=hbU}x%L>DRA6y}7D9<$>{PuhMgbm#JcXIkSHz z%t4^tXxR~;%XVMH%XyUrKV@&G+H`Na>eBkeywRxRjXV8p%u=O)k(Hb>xJLU3rr()M z%XHO5v@IIwwng5R?aA-(*8eqd|bx;f8GtMO<8b{+i0l2Q8lkaS5#vj{y`E zJ+9fC@!6Wg*^Z6DW<%e~4|88;#6b-ZIr+m)^6V`tmB%G*q#|YLRE4>2+1u1B+W}~5 z#exi2vo(233cEM0gWG{P~nU)p_$YA@z0(DtgV(6Ef z)4f0#Z1{Da?%U0vNAtf?(Ck54@}-9`J9ksPp|2>b}p@Kqt9lNV`_J} zD9PHd^=Gd}o!a0slQ{Mn!}CF2wy&_ddf4+N2;En&l#~X5ufbRq4~8d2w>VD z-MgOs@TUhND0qsnFw{aH->Q-7A7VItXeE&mx}NcLLzP)^RBa?yl)g?*JnVY4ew&+{ zvbZ#m;$I>8;55t_6g2g4)Esxyf|G;cZ;H8SIH&=oSl&;+(4Zzs!9gT>s2h*-EdmZ1 zN51R$yo|St25LTxWZ5E*6%)YWq6?Fu z+s`!#`HQ)9ZS`gw&A2mswk@&UrE!9|-5$&1JX=+ijtZJFQW5_&h(i$8X%fExgHBa6 z#xv(OkZpuukOe*btcWNn5C*~q!Ft9?UZ$5cpMi2s;Db}_|Np{USXF2pzXId}5${mj z06B3#X%3NY3~4U%eywBinD;aHc=kv3v~_h2jO{$K4mvLI#bAOac7JKQe|fq!@KaI3>G#7(okU`Yp4w_Vk?y8-~|pIO_)rZzFIdS zfDTfCbAXqP95BjNO745B#sL)#T1^@;b}C?u;ijGcd{clkCrak+anTCeYpKJULWc}A zOVgTz;(CBqsT$-V@EKo9xM>N%a1jtqoVt}j6_$-5i#jZ|izF3AMnXao5e9aaT=S(5 ztef}_-ht%JtUV}xK1X-4zPt+z9Izif>js&Yl?MY20S^S{2Ko|nkKVD^Mqwd027d(L z01zv@7v6tZ6BL$KR-{uA$W^ErHu-ho0y2Q)a&)>2Yj2*8=kSp8_1)l?j4PBiE;a^D zUZm1$A#_ilJt8F~b*VxFzXSEXtu(vcj`!ecG`0ALvZfR(-$H<|*ztmxaN*7}Lq=^g zB;@^!4${+Pi(2zX@_?GqzMJ>{%(bn@?425yhr`)4a*TuEmR$WB(198u;Cp z!AqW>pI_^Ag$Gk+NJq>Ctj!M>TVdoLc}^S^H2C$Y-wmHaVXCZlp$s&dGOmItRJhs^ zs>JY^Dce!TJl+dd_keh7|M=jM%iesjTAp$W8~t6i#SmR2wYY)GJQ+S{nG8hsJJ<|( zXdu@2b@-YitLN>rX^L5hPb{a`q+M%ju4G%I`w4*RNMK(USPXyCp(PFD#eFcT{B(2Z zAF2GiVN2CG<7JPR{r$y>8(5fJK>fm?5EwM^=AO9MI#HAd)}U)k1j=NH@^j74NsjQZ zQ(|bOqrILAUAVD##ZbpA^xwVXmH+}-9Bv$uu+vHv^8dm^U~-@L&{a4jjx)e?eRN`0 z8L(0+b=XKkxUAaKs6#A6LxOZpzx@j%by=cT;gjNqS2U+R2kD!h-dtPcxdILz!m3pZxw^W#-0s%w){6_@Gqi>R zkLKlSwe?g03^@P>IXhQV)QEe56+#cU;QR2)=$B+5vS8Y}uH!;mH;UZy;F2^Wl;Rg3 zr6vAuzU}xeo(?fu+g#Xo^X1#xI%-+T0#)&6u-)hT>Cz!Vy7{CoJZ##(%Q{7}8K70_kr`Noe`>@u6YIrro2!!{}WEl0i^ zyRSRor&Lz*==C*xgn4*G#&u6^=Rw9}p%c&`$mjq{US6K(RPOf(WAl3E)@v|X z_?+Lq)kKXmbQgv#bOPK#d|zwy_l3-+&FN)<_aG}Y&uSY3Ws4sWn15CB8wWkNgweud~CcXOkS(L@g$r{G&=o_$+!D^uR z#bEP$ZFxV5f&2#KU_H1pt;j!wDWgWXRIS7E52Bk$kviy z*SE27$pYZxYJKoe_``#KB1yX8J;Ed7c-6$K-c1N1IR|x>XizSS=OC*(YuLU}$?i`h z5~?95DP`K3D=F3HhiE-lO$cmmh#yxj)Cl-85WmJok(X{J@IFFU@ruL8PAL1)r_8AK z*ck1jD345VWlV58@VFRWqk+i|J*{-QwYx=e+8xC8oxAO2+XBucS;?GG%DZZRNZQEZl1ipmBf6jRuDD+aP}jlbbv)wxfXEEVJ2N$R|k&ze~8C?I< zok2fXO+)$dxSb^6AguIZk zZ1$NIo3^mpPi3nVVzYtgS8kte@=j&rU|DnNzP&|!(i6DG+@xyl8gO@W28~V^K0H?B zpf|V0LT1G707aAQ-6=`h?G*zZJ)Qk|QUyr9NPt$kys`|#b$-_kYamwuKt*On9>{;- zlKO+50Tj67^BrN$U_JkWD^1$?-(c$$E)iLm^L)tG8+CP>de6$v{Jkz-GEqQd^r;$ay;mIFOK*RNE#r2=FAsH@KB?3{1fKBQpH{*;9lV z?8^3-%>CZ$h@V+;GlThW6=~=F``QJY>FTrF5ljGZU_2Y-2>{*?^tro+`Ju6Cth)so zA(SNwv$1PIpXBEEzx5(~ZOx*u{4co$1xfw={U>W| zsc&y@aR>>W2T)MQVgJ0pJMh&_I66B+g6xYv3VA^P_1$HEHXKa9(9#o09&w9TQY)P+ zC5hw$b~He+@%xPLlas@MTMH7He;@Ai=eHy4Va-u3sgCm<_%Y(G zsd>aw4{H!!s%IH&y@Q^O1&56`V>N?JkTQ6j5$0N5$doS@JsboFLm3y50d#ro(~ zI(;KYCnqaw(E0KgipuSt1@rAFR^lzdPToDfFj&4=@C^mAbx=)fz1egsTgD1BDXZ(= zk39v_nlY#awGa0Rprd_l&WMImdr|}k2M63~H@a~-oUhU_ z3L%@VnZ+uwmGHunG61a5gF{cN6zs?#rPf!^!2Ve}AQ!%delzI^!<{YrcEH+sL>*0^ zev6F(ud<6AXS>1c=M-q(9JYh4(lldH9`l(kE&Fu9`V(uHjQ&IpRf&A_OTC5VA3` z?KjvJFI||~uSEn$KtF1{?db*oSHe-Xa1^|w72f@MP4f~gQwiG7(u!L1K*|%E5aT~e z;(!k!WO^N=fml)6Z+J-_LF=LySx94T?#{;reV(tROl4>_{ftRuWMquaZVG-P3ig8fGnauZ$@3hxj6f!lXMmWN7b?O_C{o6m2quMqfydw< zudDIVKRp{}dzDB@{ylp+!*u&|{=5r7CB$<^K-H6Y5zZ-u3>b()G)4nT)T6pK zc6YO~VH=;?-fI5Cw?43Gt62wZ{^O%~o>bjBJVeRaUN;{3!5Eq}F-J0tcDq!0hG#bo zo;CaL_O#G>egrPBL@Rl2efoCk08QE)D@d9dh5@n07|rkGL5RSr(;DU9jr|c=9xdFn z4$N*nzr|u6*a#l1B*@VOBcjs9-4(C>XNNaZ+W--s zT&uLgDpL@<``@&JpHrtz!snD=MLSr^J(pbqSAh6|*xTyb+SH#2U>04U?F?}=Q42j0 z((a2{`T-6}XlM}SG|1(Ga16)^(zxy(ul2%;u4^s1*?A!luA){oI zz3z|@8JWo@GfB3r2-$liTV$6RLWPLzO|r5=$)3sHWo7=)>v^8{eV^xjp5J>Me}}{2 zzV3D1*L{6I=XriUpYyyR=mWD&=7?>_7gF|Ph*Axl8x~{Ah1GERC6{*urqIV&p;ZiD*3pl}M4)-5WrgZM~{M}=LK z^S%;MI1JuIPIFznDfcET>xF!e#lRN@aEAv>4Ai*Lw23hC#Kgq@KVsc35Qaq2%Ec6a zw0iiYFGoPgWuNRyyxGRJ9uc4fp3sX^!wVAT%2-u(QOgm4@MK#OSoR}X*ohUm_ir~Q z$X7<{&Sa~m7h8rPXXd#sFiH%69<8XPdw6{8Pd3}=NH)n{eyM0|rV2WP#U6_8rgWqH zU`@%%jL>!nKDP~h652d$^obd~N3*lDp;6&&pdwLhGc&V9gE<{CAzNR-Do|+VjxEjy zFNeOR13C*)Dj+3#k(qf4$~Ml|saMe0%UAQ;Ixp8ffv1?QceKK{P~_fc0{@mLQ9@k( zE$B|^>vTjJ{{re&zqZ!PwPU?*SEp4_g-mjgBGDJ^J~v)D2*~Q zSRfjWjIJSgY1n${@~z@6)|S`GPUmGU&v_syryl|w^-?GTXPNh>0MCA}Ne};BsQw3^ ztx3eT{s44p-b43Ce`DZfPZ8EfCLym19ux<$>nwlR7#M&V!Xr#N4bek^)-VeJc#)=D3Pa^SG>`VL8-E}r6`LiIByvT_Em#PMWm4s;0z_HEBkiZ6 zUv^z5l0{+nw9&!ZHXd1wjSigHc%rUrQ%4QptPm49zNuCzLll?_7HAax!x1ME%j z5kks6weu_?!L-*WU}JoDG6P28&~FA*Rv4>Gd}X9~%mly0O1&^kV{H$N)*g~lkj^3w zs6%L_QBY6-ls}oA7!Q%XJ$HiX+rz^{ebifT&B4;6?mvea;7>@Fx!js59y(YaUv7MF zR{Dk(Rz@a!^xYSuYRb-|x4#tZ$1mD;a3|L2NSXORc*TxUl7ksjIi+@!KKR#BqoeET zp666|6REb2s<{j9tvRJ196$GZ?Q|{8sYkf#JileMxYRmjb8KKh$hokAqlKBM4e(L# zx+ut)@gDhdU-h;-=p-ny=xGIIGm6sCU6S1kdYE{?yh{^D=;TINDhC2Jy z>@4;xjr&j0h!L^=V66#x5?~WEFhHQNxsIJ`8xT<3+uF#E-6o_L2^}u+lo*Z)&2QRp z3{Y8*d$;$iWvI@p!k#*-u8s~N@14TarGW|rmn4qeWxGH%g0}WJwxDgzH4bQ{VV0ru zCw@aL$x6rBF!gnCO`a#`$0r~l5MK+=zkWLFaTtEkDOFWfb#@WQ zdlnWJm6esazMwm3S2S5@*h=3npG>Z1JfSh4}^5!+cPjI*cfO>TxxPNS1)0QB0Dm2ipHidm^WUL+@QRmudn|?lOxC% zj}Y4LMN&VpE806aG{Q=qURilEFrYQ&vpa5SYg;~}B~$=rpea9I!maAmAqx|abS&me zc(hcZ#ZKlFU+Y}AIUYsIG=Ayq+-a~y=FJQg>O~zk%+AbrO0XO@+M^yB79w-2f(aN{ ztJ94Aduf($4M=D8O<6YHw0UUFcWrM2(`K~1JM+9UZ`njnUluZGrYW61*sw4JEPnoS z*xPR|7mE`T5*{uaogjV7P>P9(iLKDZO7n@aAav5>Wz zzRgpbE`ENceK=;4!FlBh$^HBHEp2Q9wenhin0I!Um+-l<>FVmfn@Obu!iTh@>BEO7 z@hZvuirN$>x?-@lO(Vt?&Qo|F^w?pbd`FJh%*-vA?z@m6`u!x7NQscsfvk<18ufkH zDU2s`?jyJ2hnXmebI?=O^*D*;skzy`Dadqi=^36R3iHClUk|(53Qo$X-zEC-dQ+sV5=d2X#8dS8XjnfZB4Qi*%Ha7k1cOrcMs`=0n}tPo*=QJjXi~BmJ4CZY~Ln zxtPNV=cFgnrxnXDC;e{hbs4P|tVatwjcC6$A$YqLx(^SQzuqxwss8S=b1on>Uq;Kw zsIcMCDOG*Lm(#nN&UgH}jLi4F>YvNOCxb)mwe@ZbbvspRryye&zQ&3NQrMvzm?xCb)atVa2hnCG!Jwi3_V* z(%DCN@B%S)Lt=_kk|#T_9Pdc#WtF)>scUutAJsc*IbkwS6&U-O1h~g(HSUDTA0qZ< zFWwmrVn%6ZPAlMCr00Jenj_IiBXM!$S^|w{9HTSWj9+4CXpY^G`M1nhcv5cn`Ki0Y z(y$>)fQO6*6g1Xl!&-OZDDnOCV&Y;EpOkaPZh!3VmJJobV$ozlp`fQe5n3;6>uQOw z3DAPT%x|SMTj1YefbH^*8v7TvRMPYnrIE#vd#_PD4n7wjQhg*Zt-6BJQ};x0ij?2M{rP2ys12MZ0C&q`+Yifl zxCCcpp#zS~f|=tIM~qQ)l+uWjR1G*t*iVXRFVbkdTbjKsw_PTnt6%F(JnC3(+?^~S zr8DmK{VM{m!GsMmNo!Jx#Z%o$RHZ?>GBogJeO+=B__D7KQIrjAtJMb$z(1SdRn?${-0NiIN18vzM>_ z4b)lV2;k1AY1}O@xT9LNs`Av2O@;Lh41$VLCn#8ic^6m(Pui{HZtClw1$GCd12MAAXiI$=nSQTv56!Kw z!KbIUdo!dn7Ak9EAFNjnc|6XD)AqkxSzBnr)50T(Le&{YL8IhZnrkcZ)rI+<*gC^H zuuQHyIq|JEtUrufy-~&@m#cXS_5Ats7grNin7>Af$VAk6?Mh{TF&_S5zPHgtxY>8| zFc8|?c5({SV#6GKIy@oirR5R|>$ZE)io@{m5j0G1SF15IFLB{i&X~+!2rfv9fOryz zX5!>LE9&Hy`RWz6=)|y}VjOEyzNp6!GhpUll$Cw8sfme+QBYEnHZ^5|vM~O#9yh1; z{ri4-d6$w?Qs6%0(h2Bvizt{@D*HmGu^N~oy^$?(jQ5kW3kTI@#KW*&w@cp|8K+93 z97Fx3w^u#OJihh(-=c(k5i#-2$zrA0yF$jB-oHFh6|A_99=p;?YHDrpv52M^9?i5x zv2clZJC9%ea??GNsQz00z4h_vm?S@tXPMl+c}(V-?}GL6L-AK@EmPwaDP`Ow`_5P4 zvOQc<-%AxTd~#i@rQguGgikY=eqM3pdlj=ARVrTrxB3YL z>$v!)v@29tnVB!Z5*D(P=i%=Z`t`8Z!A1&rD;wP;Opz# zeQ(C6KDlGJkLLIm)QU)mw{ZmP;3WAozJ}KeZY$i+m6=f$QqcC~;m;p*p_3PTu`{1Y z%j?RVxyJViXT`CqF%}Cv)=B!4eT1$)-Je&Vy>ZKq&{1=E9=f1k9^@}Bc zBDwgP3Bw7*NDVEiDg(Ex@}fa_BXYr&%aKE&pv#!YZbHo6%Y((+N(km<-PiO5$qbfT zsDo+SG_=|yh9L;-tztZOo~W}$Iq?AqZ5^gUVcI+#{M@Hv+Fbz zXOjHF{#E(14xP_HN*eHkp);nK2|Lfw&|I^j>=pTiR~Hmilv<#ZB*Xg4bjqzs#-na$ zG#i^zD`HZW=?QD~@|q-FS{<*U>?_Gcww3rO-M40yEOB_-mSlXAhFQ$Mb0~15TRP!CVedgC8OKT zpx2bI=8Hh>*wp-T$d}2qV93F#X=pOeX=P;=fB5b>D-qxH_3Lf+GaH20Z{3R9Fl3Fx z!(oHtc{`Z{^ad!4-96o@>vn%^kt`*L&HP_EIC{9EU(hY0ljoe$Jo?X2KF&4zV2Ka* zLK-mnEH(efoLbQtOAfe;dx3NrK#U6}8sn(2p@#k!NLw ztFDAE3F_xk8WPg1*-i@MY2ZnzeL_1YOgG}7wmikbu8jk9k$y` zY5`9&=!df3`_k0AyuGoxDcPID7``9>d0eR4)BNkDj~$<+fL8&0bU5+Z)hkWQ?a6_? z;-2{J$d|=WL<$h!^!-MZK+`<2i&lgby6Mwcs^$IrjgfAycVTG6xUR&1C*3u40aZe2 z23wqnDr8XOYTV}(o5yCLPuzVJvcR@h`lpJz$a=|SRV8Kuc3kzF5cp$*BzF4l% zGBm1CgPBVN(-5K^7-?Z z>avG&_fA7sUN96@p-H3xNqiQrqNkl4AScd%-YgJALc_v}JttptdfE~*XUm4E=Ihnn z6QF42ZVrsbtI!vTjy=97g0DvQVX$p5XFSa|T=Pj?1Uc$2Y59zAMOMNjjgl!Fv!k=Y zPmE#cNZ6L3>f)-Lr}U9v%UID*8b)xX5g>NZqn$&@;!)_D=6F)v#`^xrC&lw?Yqq1E zFpyFgKE}J2=Lim7>3;2|zhbte8YbftWI-Gn%9(N1^TAJ}tM(QufV&bKH~aq2EcGu5 ztOlyQhK>(OYzqp0Ju}e!}{R40RfMP*kSIpkckCsj%>E{*Ufjh=O z(UP+TOIkt?`8zF=>;Gc21LIzsTjM%u0Iv-LY!H`c~A__#6E0>MxHU z;n4yHyH<_eRrH4@1myy|N~hUR@%t$y((|x?p}bUogHO-MQJIc4BaV}XL6<8pIqc~;RDeAcIT;hrF5Thbuq30VrbZtuwhQXyHGFc2-ltC*b#3x| zea#NyEh~=5+PnT=7H1%MXjqUaD=I6%k;VFykS@O$Fs-1huyWITb8~a(aNwS%rq)zk zK>Czs`^Btl;LAc%K@Gu|cY!EDk5a#&eFQzkQ!ukd4)M90JopQWN_l8#kbsE`h67Ov zU3zY(qo$Wd-#*liLQ&j9t`X4EqC{E5WkEBLuVY%8|2wMp4p{O!FQ^~>>P-(aXYk$P zWmQSTVlZOpa~Bz`1H`vU$>qKA9|YbXEFE%32KE7xZ%$0?26}q!uE}oYTf(-X6^p*{ z2gO>xsWXh*;#bVpYVI!mWMwWE%<{fY_>tS_SjXsRdMY*Q@Y_TNg~0b~V{`�^>`y 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 diff --git a/doc/salome/gui/GHS3DPLUGIN/input/ghs3d_hypo.doc b/doc/salome/gui/GHS3DPLUGIN/input/ghs3d_hypo.doc index 88f50c4..9cececf 100644 --- a/doc/salome/gui/GHS3DPLUGIN/input/ghs3d_hypo.doc +++ b/doc/salome/gui/GHS3DPLUGIN/input/ghs3d_hypo.doc @@ -107,6 +107,9 @@ Note: when using this option, the speed of the meshing process may decrease, quality may change, and the smallest volume may be smaller. By default, the FEM correction is not used. +- Volumic gradation - Defines the volumic ratio between 2 consecutive elements. +WARNING: Changing the default value of this parameter may dramatically decrease the quality of the resulting mesh. + - Option as text - allows to input in the command line any text for ghs3d, for example, advanced options. diff --git a/idl/GHS3DPlugin_Algorithm.idl b/idl/GHS3DPlugin_Algorithm.idl index 7a44669..f930af5 100644 --- a/idl/GHS3DPlugin_Algorithm.idl +++ b/idl/GHS3DPlugin_Algorithm.idl @@ -141,6 +141,11 @@ module GHS3DPlugin */ void SetTextOption(in string option); string GetTextOption(); + /*! + * To define the volumic gradation + */ + void SetGradation(in double gradation); + double GetGradation(); /*! * To set an enforced vertex */ diff --git a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.cxx b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.cxx index ef8349a..cb402ee 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.cxx +++ b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.cxx @@ -52,6 +52,7 @@ GHS3DPlugin_Hypothesis::GHS3DPlugin_Hypothesis(int hypId, int studyId, SMESH_Gen myToUseBoundaryRecoveryVersion(DefaultToUseBoundaryRecoveryVersion()), myToUseFemCorrection(DefaultToUseFEMCorrection()), myToRemoveCentralPoint(DefaultToRemoveCentralPoint()), + myGradation(DefaultGradation()), _enfVertexList(DefaultGHS3DEnforcedVertexList()), _enfVertexCoordsSizeList(DefaultGHS3DEnforcedVertexCoordsValues()), _enfVertexEntrySizeList(DefaultGHS3DEnforcedVertexEntryValues()), @@ -328,6 +329,27 @@ std::string GHS3DPlugin_Hypothesis::GetTextOption() const return myTextOption; } +//======================================================================= +//function : SetGradation +//======================================================================= + +void GHS3DPlugin_Hypothesis::SetGradation(double gradation) +{ + if ( myGradation != gradation ) { + myGradation = gradation; + NotifySubMeshesHypothesisModification(); + } +} + +//======================================================================= +//function : GetGradation +//======================================================================= + +double GHS3DPlugin_Hypothesis::GetGradation() const +{ + return myGradation; +} + //======================================================================= //function : SetEnforcedVertex //======================================================================= @@ -839,6 +861,15 @@ bool GHS3DPlugin_Hypothesis::DefaultToRemoveCentralPoint() return false; } +//======================================================================= +//function : DefaultGradation +//======================================================================= + +double GHS3DPlugin_Hypothesis::DefaultGradation() +{ + return 1.05; +} + // //======================================================================= // //function : DefaultID2SizeMap // //======================================================================= @@ -866,6 +897,7 @@ std::ostream & GHS3DPlugin_Hypothesis::SaveTo(std::ostream & save) save << (int)myToUseBoundaryRecoveryVersion << " "; save << (int)myToUseFemCorrection << " "; save << (int)myToRemoveCentralPoint << " "; + save << myGradation << " "; if (!myTextOption.empty()) { save << "__OPTIONS_BEGIN__ "; save << myTextOption << " "; @@ -949,6 +981,7 @@ std::istream & GHS3DPlugin_Hypothesis::LoadFrom(std::istream & load) { bool isOK = true; int i; + double d; isOK = (load >> i); if (isOK) @@ -1026,6 +1059,12 @@ std::istream & GHS3DPlugin_Hypothesis::LoadFrom(std::istream & load) else load.clear(ios::badbit | load.rdstate()); + isOK = (load >> d); + if (isOK) + myGradation = d; + else + load.clear(ios::badbit | load.rdstate()); + std::string separator; bool hasOptions = false; bool hasEnforcedVertices = false; @@ -1271,7 +1310,7 @@ bool GHS3DPlugin_Hypothesis::SetParametersByDefaults(const TDefaults& /*dflts*/ //================================================================================ std::string GHS3DPlugin_Hypothesis::CommandToRun(const GHS3DPlugin_Hypothesis* hyp, - const bool hasShapeToMesh) + const bool hasShapeToMesh) { TCollection_AsciiString cmd; cmd = "mg-tetra.exe"; @@ -1285,6 +1324,7 @@ std::string GHS3DPlugin_Hypothesis::CommandToRun(const GHS3DPlugin_Hypothesis* h bool v = hyp ? ( hyp->myTextOption.find("-v") == std::string::npos ) : true; bool fem = hyp ? ( hyp->myTextOption.find("-FEM")== std::string::npos ) : true; bool rem = hyp ? ( hyp->myTextOption.find("-no_initial_central_point")== std::string::npos ) : true; + bool gra = hyp ? ( hyp->myTextOption.find("-Dcpropa")== std::string::npos ) : true; // if use boundary recovery version, few options are allowed bool useBndRecovery = !C; @@ -1367,6 +1407,12 @@ std::string GHS3DPlugin_Hypothesis::CommandToRun(const GHS3DPlugin_Hypothesis* h cmd += (char*) hyp->myTextOption.c_str(); } + // to define volumic gradation. + if ( gra && hyp) { + cmd += " -Dcpropa="; + cmd += hyp->myGradation; + } + #ifdef WNT cmd += " < NUL"; #endif diff --git a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.hxx b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.hxx index db3830d..2e1acc5 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.hxx +++ b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.hxx @@ -191,6 +191,11 @@ public: */ void SetTextOption(const std::string& option); std::string GetTextOption() const; + /*! + * To define the volumic gradation + */ + void SetGradation(double gradation); + double GetGradation() const ; // struct TEnforcedEdge { @@ -269,6 +274,7 @@ public: static bool DefaultToUseBoundaryRecoveryVersion(); static bool DefaultToUseFEMCorrection(); static bool DefaultToRemoveCentralPoint(); + static double DefaultGradation(); static TGHS3DEnforcedVertex DefaultGHS3DEnforcedVertex() {return TGHS3DEnforcedVertex();} static TGHS3DEnforcedVertexList DefaultGHS3DEnforcedVertexList() {return TGHS3DEnforcedVertexList();} @@ -316,6 +322,7 @@ private: bool myToUseFemCorrection; bool myToRemoveCentralPoint; std::string myTextOption; + double myGradation; TGHS3DEnforcedVertexList _enfVertexList; TGHS3DEnforcedVertexCoordsValues _enfVertexCoordsSizeList; diff --git a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.cxx b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.cxx index c1922ad..b4bf07a 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.cxx +++ b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.cxx @@ -351,6 +351,31 @@ char* GHS3DPlugin_Hypothesis_i::GetTextOption() return CORBA::string_dup( this->GetImpl()->GetTextOption().c_str() ); } +//======================================================================= +//function : SetToRemoveCentralPoint +//======================================================================= + +void GHS3DPlugin_Hypothesis_i::SetGradation(CORBA::Double gradation) +{ + if (gradation <= 1) + THROW_SALOME_CORBA_EXCEPTION( "The volumic gradation must be > 1",SALOME::BAD_PARAM ); + ASSERT(myBaseImpl); + if (gradation != GetGradation()) { + this->GetImpl()->SetGradation(gradation); + SMESH::TPythonDump() << _this() << ".SetGradation( " << gradation << " )"; + } +} + +//======================================================================= +//function : GetToRemoveCentralPoint +//======================================================================= + +CORBA::Double GHS3DPlugin_Hypothesis_i::GetGradation() +{ + ASSERT(myBaseImpl); + return this->GetImpl()->GetGradation(); +} + //======================================================================= //function : SetEnforcedVertex //======================================================================= diff --git a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.hxx b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.hxx index 62ae16e..6b1539c 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.hxx +++ b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.hxx @@ -122,6 +122,11 @@ class GHS3DPLUGIN_EXPORT GHS3DPlugin_Hypothesis_i: */ void SetTextOption(const char* option); char* GetTextOption(); + /*! + * To define the volumic gradation + */ + void SetGradation(CORBA::Double gradation); + CORBA::Double GetGradation(); /*! * To set an enforced vertex */ diff --git a/src/GHS3DPlugin/Makefile.am b/src/GHS3DPlugin/Makefile.am index a6e0509..182512d 100644 --- a/src/GHS3DPlugin/Makefile.am +++ b/src/GHS3DPlugin/Makefile.am @@ -27,23 +27,21 @@ include $(top_srcdir)/adm_local/unix/make_common_starter.am # header files salomeinclude_HEADERS = \ - libmesh5.h \ - GHS3DPlugin_Defs.hxx \ - GHS3DPlugin_GHS3D.hxx \ - GHS3DPlugin_GHS3D_i.hxx \ - GHS3DPlugin_Hypothesis.hxx \ - GHS3DPlugin_Hypothesis_i.hxx + GHS3DPlugin_Defs.hxx \ + GHS3DPlugin_GHS3D.hxx \ + GHS3DPlugin_GHS3D_i.hxx \ + GHS3DPlugin_Hypothesis.hxx \ + GHS3DPlugin_Hypothesis_i.hxx # Libraries targets lib_LTLIBRARIES = libGHS3DEngine.la dist_libGHS3DEngine_la_SOURCES = \ - libmesh5.c \ - GHS3DPlugin_GHS3D.cxx \ - GHS3DPlugin_GHS3D_i.cxx \ - GHS3DPlugin_i.cxx \ - GHS3DPlugin_Hypothesis.cxx \ - GHS3DPlugin_Hypothesis_i.cxx + GHS3DPlugin_GHS3D.cxx \ + GHS3DPlugin_GHS3D_i.cxx \ + GHS3DPlugin_i.cxx \ + GHS3DPlugin_Hypothesis.cxx \ + GHS3DPlugin_Hypothesis_i.cxx libGHS3DEngine_la_CPPFLAGS = \ $(KERNEL_CXXFLAGS) \ @@ -58,11 +56,11 @@ libGHS3DEngine_la_CPPFLAGS = \ -I$(top_builddir)/idl libGHS3DEngine_la_LDFLAGS = \ - ../../idl/libSalomeIDLGHS3DPLUGIN.la \ - $(CAS_KERNEL) -lTKBRep -lTKG2d -lTKG3d -lTKTopAlgo -lTKGeomBase -lTKGeomAlgo -lTKCDF \ - $(MED_LDFLAGS) -lSalomeIDLMED \ - $(SMESH_LDFLAGS) -lSMESHimpl -lSMESHEngine -lSMESHDS -lSMDS -lStdMeshers \ - $(KERNEL_LDFLAGS) -lSalomeGenericObj -lSALOMELocalTrace -lSALOMEBasics -lSalomeNS -lOpUtil + ../../idl/libSalomeIDLGHS3DPLUGIN.la \ + $(CAS_KERNEL) -lTKBRep -lTKG2d -lTKG3d -lTKTopAlgo -lTKGeomBase -lTKGeomAlgo -lTKCDF \ + $(MED_LDFLAGS) -lSalomeIDLMED \ + $(SMESH_LDFLAGS) -lSMESHimpl -lSMESHEngine -lSMESHDS -lSMDS -lStdMeshers -lMeshDriverGMF \ + $(KERNEL_LDFLAGS) -lSalomeGenericObj -lSALOMELocalTrace -lSALOMEBasics -lSalomeNS -lOpUtil # Scripts to be installed. dist_salomescript_DATA= GHS3DPluginDC.py diff --git a/src/GHS3DPlugin/libmesh5.c b/src/GHS3DPlugin/libmesh5.c deleted file mode 100644 index b16c39c..0000000 --- a/src/GHS3DPlugin/libmesh5.c +++ /dev/null @@ -1,1346 +0,0 @@ - - -/*----------------------------------------------------------*/ -/* */ -/* LIBMESH V 5.46 */ -/* */ -/*----------------------------------------------------------*/ -/* */ -/* Description: handle .meshb file format I/O */ -/* Author: Loic MARECHAL */ -/* Creation date: feb 16 2007 */ -/* Last modification: apr 03 2012 */ -/* */ -/*----------------------------------------------------------*/ - - -/*----------------------------------------------------------*/ -/* Includes */ -/*----------------------------------------------------------*/ - -#include -#include -#include -#include -#include -#include -#include -#include "libmesh5.h" - - -/*----------------------------------------------------------*/ -/* Defines */ -/*----------------------------------------------------------*/ - -#define Asc 1 -#define Bin 2 -#define MshFil 4 -#define SolFil 8 -#define MaxMsh 100 -#define InfKwd 1 -#define RegKwd 2 -#define SolKwd 3 -#define WrdSiz 4 -#define BufSiz 10000 - - -/*----------------------------------------------------------*/ -/* Structures */ -/*----------------------------------------------------------*/ - -typedef struct -{ - int typ, SolSiz, NmbWrd, NmbLin, NmbTyp, TypTab[ GmfMaxTyp ]; - long pos; - char fmt[ GmfMaxTyp*9 ]; -}KwdSct; - -typedef struct -{ - int dim, ver, mod, typ, cod, pos; - long NexKwdPos, siz; - KwdSct KwdTab[ GmfMaxKwd + 1 ]; - FILE *hdl; - int *IntBuf; - float *FltBuf; - unsigned char *buf; - char FilNam[ GmfStrSiz ]; - double DblBuf[1000/8]; - unsigned char blk[ BufSiz + 1000 ]; -}GmfMshSct; - - -/*----------------------------------------------------------*/ -/* Global variables */ -/*----------------------------------------------------------*/ - -static int GmfIniFlg=0; -static GmfMshSct *GmfMshTab[ MaxMsh + 1 ]; -static const char *GmfKwdFmt[ GmfMaxKwd + 1 ][4] = -{ {"Reserved", "", "", ""}, - {"MeshVersionFormatted", "", "", "i"}, - {"Reserved", "", "", ""}, - {"Dimension", "", "", "i"}, - {"Vertices", "Vertex", "i", "dri"}, - {"Edges", "Edge", "i", "iii"}, - {"Triangles", "Triangle", "i", "iiii"}, - {"Quadrilaterals", "Quadrilateral", "i", "iiiii"}, - {"Tetrahedra", "Tetrahedron", "i", "iiiii"}, - {"Prisms", "Prism", "i", "iiiiiii"}, - {"Hexahedra", "Hexahedron", "i", "iiiiiiiii"}, - {"IterationsAll", "IterationAll","","i"}, - {"TimesAll", "TimeAll","","r"}, - {"Corners", "Corner", "i", "i"}, - {"Ridges", "Ridge", "i", "i"}, - {"RequiredVertices", "RequiredVertex", "i", "i"}, - {"RequiredEdges", "RequiredEdge", "i", "i"}, - {"RequiredTriangles", "RequiredTriangle", "i", "i"}, - {"RequiredQuadrilaterals", "RequiredQuadrilateral", "i", "i"}, - {"TangentAtEdgeVertices", "TangentAtEdgeVertex", "i", "iii"}, - {"NormalAtVertices", "NormalAtVertex", "i", "ii"}, - {"NormalAtTriangleVertices", "NormalAtTriangleVertex", "i", "iii"}, - {"NormalAtQuadrilateralVertices", "NormalAtQuadrilateralVertex", "i", "iiii"}, - {"AngleOfCornerBound", "", "", "r"}, - {"TrianglesP2", "TriangleP2", "i", "iiiiiii"}, - {"EdgesP2", "EdgeP2", "i", "iiii"}, - {"SolAtPyramids", "SolAtPyramid", "i", "sr"}, - {"QuadrilateralsQ2", "QuadrilateralQ2", "i", "iiiiiiiiii"}, - {"ISolAtPyramids", "ISolAtPyramid", "i", "iiiii"}, - {"SubDomainFromGeom", "SubDomainFromGeom", "i", "iiii"}, - {"TetrahedraP2", "TetrahedronP2", "i", "iiiiiiiiiii"}, - {"Fault_NearTri", "Fault_NearTri", "i", "i"}, - {"Fault_Inter", "Fault_Inter", "i", "i"}, - {"HexahedraQ2", "HexahedronQ2", "i", "iiiiiiiiiiiiiiiiiiiiiiiiiiii"}, - {"ExtraVerticesAtEdges", "ExtraVerticesAtEdge", "i", "in"}, - {"ExtraVerticesAtTriangles", "ExtraVerticesAtTriangle", "i", "in"}, - {"ExtraVerticesAtQuadrilaterals", "ExtraVerticesAtQuadrilateral", "i", "in"}, - {"ExtraVerticesAtTetrahedra", "ExtraVerticesAtTetrahedron", "i", "in"}, - {"ExtraVerticesAtPrisms", "ExtraVerticesAtPrism", "i", "in"}, - {"ExtraVerticesAtHexahedra", "ExtraVerticesAtHexahedron", "i", "in"}, - {"VerticesOnGeometricVertices", "VertexOnGeometricVertex", "i", "iir"}, - {"VerticesOnGeometricEdges", "VertexOnGeometricEdge", "i", "iirr"}, - {"VerticesOnGeometricTriangles", "VertexOnGeometricTriangle", "i", "iirrr"}, - {"VerticesOnGeometricQuadrilaterals", "VertexOnGeometricQuadrilateral", "i", "iirrr"}, - {"EdgesOnGeometricEdges", "EdgeOnGeometricEdge", "i", "iir"}, - {"Fault_FreeEdge", "Fault_FreeEdge", "i", "i"}, - {"Polyhedra", "Polyhedron", "i", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"}, - {"Polygons", "Polygon", "", "iiiiiiiii"}, - {"Fault_Overlap", "Fault_Overlap", "i", "i"}, - {"Pyramids", "Pyramid", "i", "iiiiii"}, - {"BoundingBox", "", "", "drdr"}, - {"Body","i", "drdrdrdr"}, - {"PrivateTable", "PrivateTable", "i", "i"}, - {"Fault_BadShape", "Fault_BadShape", "i", "i"}, - {"End", "", "", ""}, - {"TrianglesOnGeometricTriangles", "TriangleOnGeometricTriangle", "i", "iir"}, - {"TrianglesOnGeometricQuadrilaterals", "TriangleOnGeometricQuadrilateral", "i", "iir"}, - {"QuadrilateralsOnGeometricTriangles", "QuadrilateralOnGeometricTriangle", "i", "iir"}, - {"QuadrilateralsOnGeometricQuadrilaterals", "QuadrilateralOnGeometricQuadrilateral", "i", "iir"}, - {"Tangents", "Tangent", "i", "dr"}, - {"Normals", "Normal", "i", "dr"}, - {"TangentAtVertices", "TangentAtVertex", "i", "ii"}, - {"SolAtVertices", "SolAtVertex", "i", "sr"}, - {"SolAtEdges", "SolAtEdge", "i", "sr"}, - {"SolAtTriangles", "SolAtTriangle", "i", "sr"}, - {"SolAtQuadrilaterals", "SolAtQuadrilateral", "i", "sr"}, - {"SolAtTetrahedra", "SolAtTetrahedron", "i", "sr"}, - {"SolAtPrisms", "SolAtPrism", "i", "sr"}, - {"SolAtHexahedra", "SolAtHexahedron", "i", "sr"}, - {"DSolAtVertices", "DSolAtVertex", "i", "sr"}, - {"ISolAtVertices", "ISolAtVertex", "i", "i"}, - {"ISolAtEdges", "ISolAtEdge", "i", "ii"}, - {"ISolAtTriangles", "ISolAtTriangle", "i", "iii"}, - {"ISolAtQuadrilaterals", "ISolAtQuadrilateral", "i", "iiii"}, - {"ISolAtTetrahedra", "ISolAtTetrahedron", "i", "iiii"}, - {"ISolAtPrisms", "ISolAtPrism", "i", "iiiiii"}, - {"ISolAtHexahedra", "ISolAtHexahedron", "i", "iiiiiiii"}, - {"Iterations", "","","i"}, - {"Time", "","","r"}, - {"Fault_SmallTri", "Fault_SmallTri","i","i"}, - {"CoarseHexahedra", "CoarseHexahedron", "i", "i"} - }; - - -/*----------------------------------------------------------*/ -/* Prototypes of local procedures */ -/*----------------------------------------------------------*/ - -static void ScaWrd(GmfMshSct *, unsigned char *); -static void ScaDblWrd(GmfMshSct *, unsigned char *); -static void ScaBlk(GmfMshSct *, unsigned char *, int); -static long GetPos(GmfMshSct *); -static void RecWrd(GmfMshSct *, unsigned char *); -static void RecDblWrd(GmfMshSct *, unsigned char *); -static void RecBlk(GmfMshSct *, unsigned char *, int); -static void SetPos(GmfMshSct *, long); -static int ScaKwdTab(GmfMshSct *); -static void ExpFmt(GmfMshSct *, int); -static void ScaKwdHdr(GmfMshSct *, int); - - -/*----------------------------------------------------------*/ -/* Open a mesh file in read or write mod */ -/*----------------------------------------------------------*/ - -int GmfOpenMesh(const char *FilNam, int mod, ...) -{ - int i, KwdCod, res, *PtrVer, *PtrDim, MshIdx=0; - char str[ GmfStrSiz ]; - va_list VarArg; - GmfMshSct *msh; - char *ptr; - int k; - - if(!GmfIniFlg) - { - for(i=0;i<=MaxMsh;i++) - GmfMshTab[i] = NULL; - - GmfIniFlg = 1; - } - - /*---------------------*/ - /* MESH STRUCTURE INIT */ - /*---------------------*/ - - for(i=1;i<=MaxMsh;i++) - if(!GmfMshTab[i]) - { - MshIdx = i; - break; - } - - if( !MshIdx || !(msh = calloc(1, sizeof(GmfMshSct))) ) - return(0); - - /* Copy the FilNam into the structure */ - - if(strlen(FilNam) + 7 >= GmfStrSiz) - { - free (msh); - return(0); - } - - strcpy(msh->FilNam, FilNam); - - /* Store the opening mod (read or write) and guess the filetype (binary or ascii) depending on the extension */ - - msh->mod = mod; - msh->buf = (unsigned char *)msh->DblBuf; - msh->FltBuf = (float *)msh->DblBuf; - msh->IntBuf = (int *)msh->DblBuf; - - k = strlen(msh->FilNam) - 6; - if(k < 0) - k = 0; - ptr = msh->FilNam+k; - if(strstr(ptr, ".meshb")) - msh->typ |= (Bin | MshFil); - else if(strstr(ptr, ".mesh")) - msh->typ |= (Asc | MshFil); - else if(strstr(ptr, ".solb")) - msh->typ |= (Bin | SolFil); - else if(strstr(ptr, ".sol")) - msh->typ |= (Asc | SolFil); - else { - free (msh); - return(0); - } - - /* Open the file in the required mod and initialyse the mesh structure */ - - if(msh->mod == GmfRead) - { - - /*-----------------------*/ - /* OPEN FILE FOR READING */ - /*-----------------------*/ - - va_start(VarArg, mod); - PtrVer = va_arg(VarArg, int *); - PtrDim = va_arg(VarArg, int *); - va_end(VarArg); - - /* Create the name string and open the file */ - - if(!(msh->hdl = fopen(msh->FilNam, "rb"))) - { - free (msh); - return(0); - } - - /* Read the endian coding tag, the mesh version and the mesh dimension (mandatory kwd) */ - - if(msh->typ & Bin) - { - fread((unsigned char *)&msh->cod, WrdSiz, 1, msh->hdl); - - if( (msh->cod != 1) && (msh->cod != 16777216) ) - { - free (msh); - return(0); - } - - ScaWrd(msh, (unsigned char *)&msh->ver); - - if( (msh->ver < 1) || (msh->ver > 3) ) - { - free (msh); - return(0); - } - - if( (msh->ver == 3) && (sizeof(long) == 4) ) - { - free (msh); - return(0); - } - - ScaWrd(msh, (unsigned char *)&KwdCod); - - if(KwdCod != GmfDimension) - { - free (msh); - return(0); - } - - GetPos(msh); - ScaWrd(msh, (unsigned char *)&msh->dim); - } - else - { - do - { - res = fscanf(msh->hdl, "%s", str); - }while( (res != EOF) && strcmp(str, "MeshVersionFormatted") ); - - if(res == EOF) - { - free (msh); - return(0); - } - - fscanf(msh->hdl, "%d", &msh->ver); - - if( (msh->ver < 1) || (msh->ver > 3) ) - { - free (msh); - return(0); - } - - do - { - res = fscanf(msh->hdl, "%s", str); - }while( (res != EOF) && strcmp(str, "Dimension") ); - - if(res == EOF) - { - free (msh); - return(0); - } - - fscanf(msh->hdl, "%d", &msh->dim); - } - - if( (msh->dim != 2) && (msh->dim != 3) ) - { - free (msh); - return(0); - } - - (*PtrVer) = msh->ver; - (*PtrDim) = msh->dim; - - /*------------*/ - /* KW READING */ - /*------------*/ - - /* Read the list of kw present in the file */ - - if(!ScaKwdTab(msh)) - { - free (msh); - return(0); - } - - GmfMshTab[ MshIdx ] = msh; - - return(MshIdx); - } - else if(msh->mod == GmfWrite) - { - - /*-----------------------*/ - /* OPEN FILE FOR WRITING */ - /*-----------------------*/ - - msh->cod = 1; - - /* Check if the user provided a valid version number and dimension */ - - va_start(VarArg, mod); - msh->ver = va_arg(VarArg, int); - msh->dim = va_arg(VarArg, int); - va_end(VarArg); - - if( (msh->ver < 1) || (msh->ver > 3) ) - { - free (msh); - return(0); - } - - if( (msh->ver == 3) && (sizeof(long) == 4) ) - { - free (msh); - return(0); - } - - if( (msh->dim != 2) && (msh->dim != 3) ) - { - free (msh); - return(0); - } - - /* Create the mesh file */ - - if(!(msh->hdl = fopen(msh->FilNam, "wb"))) - { - free (msh); - return(0); - } - - GmfMshTab[ MshIdx ] = msh; - - - /*------------*/ - /* KW WRITING */ - /*------------*/ - - /* Write the mesh version and dimension */ - - if(msh->typ & Asc) - { - fprintf(msh->hdl, "%s %d\n\n", GmfKwdFmt[ GmfVersionFormatted ][0], msh->ver); - fprintf(msh->hdl, "%s %d\n", GmfKwdFmt[ GmfDimension ][0], msh->dim); - } - else - { - RecWrd(msh, (unsigned char *)&msh->cod); - RecWrd(msh, (unsigned char *)&msh->ver); - GmfSetKwd(MshIdx, GmfDimension, 0); - RecWrd(msh, (unsigned char *)&msh->dim); - } - - return(MshIdx); - } - else - { - free (msh); - return(0); - } -} - - -/*----------------------------------------------------------*/ -/* Close a meshfile in the right way */ -/*----------------------------------------------------------*/ - -int GmfCloseMesh(int MshIdx) -{ - int res = 1; - GmfMshSct *msh; - - if( (MshIdx < 1) || (MshIdx > MaxMsh) ) - return(0); - - msh = GmfMshTab[ MshIdx ]; - RecBlk(msh, msh->buf, 0); - - /* In write down the "End" kw in write mode */ - - if(msh->mod == GmfWrite){ - if(msh->typ & Asc) - fprintf(msh->hdl, "\n%s\n", GmfKwdFmt[ GmfEnd ][0]); - else - GmfSetKwd(MshIdx, GmfEnd, 0); - } - /* Close the file and free the mesh structure */ - - if(fclose(msh->hdl)) - res = 0; - - free(msh); - GmfMshTab[ MshIdx ] = NULL; - - return(res); -} - - -/*----------------------------------------------------------*/ -/* Read the number of lines and set the position to this kwd*/ -/*----------------------------------------------------------*/ - -int GmfStatKwd(int MshIdx, int KwdCod, ...) -{ - int i, *PtrNmbTyp, *PtrSolSiz, *TypTab; - GmfMshSct *msh; - KwdSct *kwd; - va_list VarArg; - - if( (MshIdx < 1) || (MshIdx > MaxMsh) ) - return(0); - - msh = GmfMshTab[ MshIdx ]; - - if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) ) - return(0); - - kwd = &msh->KwdTab[ KwdCod ]; - - if(!kwd->NmbLin) - return(0); - - /* Read further arguments if this kw is a sol */ - - if(kwd->typ == SolKwd) - { - va_start(VarArg, KwdCod); - - PtrNmbTyp = va_arg(VarArg, int *); - *PtrNmbTyp = kwd->NmbTyp; - - PtrSolSiz = va_arg(VarArg, int *); - *PtrSolSiz = kwd->SolSiz; - - TypTab = va_arg(VarArg, int *); - - for(i=0;iNmbTyp;i++) - TypTab[i] = kwd->TypTab[i]; - - va_end(VarArg); - } - - return(kwd->NmbLin); -} - - -/*----------------------------------------------------------*/ -/* Set the current file position to a given kwd */ -/*----------------------------------------------------------*/ - -int GmfGotoKwd(int MshIdx, int KwdCod) -{ - GmfMshSct *msh; - KwdSct *kwd; - - if( (MshIdx < 1) || (MshIdx > MaxMsh) ) - return(0); - - msh = GmfMshTab[ MshIdx ]; - - if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) ) - return(0); - - kwd = &msh->KwdTab[ KwdCod ]; - - if(!kwd->NmbLin) - return(0); - - return(fseek(msh->hdl, kwd->pos, SEEK_SET)); -} - - -/*----------------------------------------------------------*/ -/* Write the kwd and set the number of lines */ -/*----------------------------------------------------------*/ - -int GmfSetKwd(int MshIdx, int KwdCod, ...) -{ - int i, NmbLin=0, *TypTab; - long CurPos; - va_list VarArg; - GmfMshSct *msh; - KwdSct *kwd; - - if( (MshIdx < 1) || (MshIdx > MaxMsh) ) - return(0); - - msh = GmfMshTab[ MshIdx ]; - RecBlk(msh, msh->buf, 0); - - if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) ) - return(0); - - kwd = &msh->KwdTab[ KwdCod ]; - - /* Read further arguments if this kw has a header */ - - if(strlen(GmfKwdFmt[ KwdCod ][2])) - { - va_start(VarArg, KwdCod); - NmbLin = va_arg(VarArg, int); - - if(!strcmp(GmfKwdFmt[ KwdCod ][3], "sr")) - { - kwd->NmbTyp = va_arg(VarArg, int); - TypTab = va_arg(VarArg, int *); - - for(i=0;iNmbTyp;i++) - kwd->TypTab[i] = TypTab[i]; - } - - va_end(VarArg); - } - - /* Setup the kwd info */ - - ExpFmt(msh, KwdCod); - - if(!kwd->typ) - return(0); - else if(kwd->typ == InfKwd) - kwd->NmbLin = 1; - else - kwd->NmbLin = NmbLin; - - /* Store the next kwd position in binary file */ - - if( (msh->typ & Bin) && msh->NexKwdPos ) - { - CurPos = ftell(msh->hdl); - fseek(msh->hdl, msh->NexKwdPos, SEEK_SET); - SetPos(msh, CurPos); - fseek(msh->hdl, CurPos, SEEK_SET); - } - - /* Write the header */ - - if(msh->typ & Asc) - { - fprintf(msh->hdl, "\n%s\n", GmfKwdFmt[ KwdCod ][0]); - - if(kwd->typ != InfKwd) - fprintf(msh->hdl, "%d\n", kwd->NmbLin); - - /* In case of solution field, write the extended header */ - - if(kwd->typ == SolKwd) - { - fprintf(msh->hdl, "%d ", kwd->NmbTyp); - - for(i=0;iNmbTyp;i++) - fprintf(msh->hdl, "%d ", kwd->TypTab[i]); - - fprintf(msh->hdl, "\n\n"); - } - } - else - { - RecWrd(msh, (unsigned char *)&KwdCod); - msh->NexKwdPos = ftell(msh->hdl); - SetPos(msh, 0); - - if(kwd->typ != InfKwd) - RecWrd(msh, (unsigned char *)&kwd->NmbLin); - - /* In case of solution field, write the extended header at once */ - - if(kwd->typ == SolKwd) - { - RecWrd(msh, (unsigned char *)&kwd->NmbTyp); - - for(i=0;iNmbTyp;i++) - RecWrd(msh, (unsigned char *)&kwd->TypTab[i]); - } - } - - /* Reset write buffer position */ - msh->pos = 0; - - /* Estimate the total file size and check whether it crosses the 2GB threshold */ - - msh->siz += kwd->NmbLin * kwd->NmbWrd * WrdSiz; - - if(msh->siz > 2E9) - return(0); - else - return(kwd->NmbLin); -} - - -/*----------------------------------------------------------*/ -/* Read a full line from the current kwd */ -/*----------------------------------------------------------*/ - -void GmfGetLin(int MshIdx, int KwdCod, ...) -{ - int i, j; - float *FltSolTab; - double *DblSolTab; - va_list VarArg; - GmfMshSct *msh = GmfMshTab[ MshIdx ]; - KwdSct *kwd = &msh->KwdTab[ KwdCod ]; - - /* Start decoding the arguments */ - - va_start(VarArg, KwdCod); - - if(kwd->typ != SolKwd) - { - int k, nb_repeat = 0; - - if(msh->ver == 1) - { - if(msh->typ & Asc) - { - for(i=0;iSolSiz;i++) - if(kwd->fmt[i] == 'r') - fscanf(msh->hdl, "%f", va_arg(VarArg, float *)); - else if(kwd->fmt[i] == 'n') { - fscanf(msh->hdl, "%d", &nb_repeat); - *(va_arg(VarArg, int *)) = nb_repeat; - for(k=0;khdl, "%d", va_arg(VarArg, int *)); - } - else - fscanf(msh->hdl, "%d", va_arg(VarArg, int *)); - } - else - { - for(i=0;iSolSiz;i++) - if(kwd->fmt[i] == 'r') - ScaWrd(msh, (unsigned char *)va_arg(VarArg, float *)); - else if(kwd->fmt[i] == 'n') { - ScaWrd(msh, (unsigned char *)&nb_repeat); - *(va_arg(VarArg, int *)) = nb_repeat; - for(k=0;ktyp & Asc) - { - for(i=0;iSolSiz;i++) - if(kwd->fmt[i] == 'r') - fscanf(msh->hdl, "%lf", va_arg(VarArg, double *)); - else if(kwd->fmt[i] == 'n') { - fscanf(msh->hdl, "%d", &nb_repeat); - *(va_arg(VarArg, int *)) = nb_repeat; - for(k=0;khdl, "%d", va_arg(VarArg, int *)); - } - else - fscanf(msh->hdl, "%d", va_arg(VarArg, int *)); - } - else - for(i=0;iSolSiz;i++) - if(kwd->fmt[i] == 'r') - ScaDblWrd(msh, (unsigned char *)va_arg(VarArg, double *)); - else if(kwd->fmt[i] == 'n') { - ScaWrd(msh, (unsigned char *)&nb_repeat); - *(va_arg(VarArg, int *)) = nb_repeat; - for(k=0;kver == 1) - { - FltSolTab = va_arg(VarArg, float *); - - if(msh->typ & Asc) - for(j=0;jSolSiz;j++) - fscanf(msh->hdl, "%f", &FltSolTab[j]); - else - ScaBlk(msh, (unsigned char *)FltSolTab, kwd->NmbWrd); - } - else - { - DblSolTab = va_arg(VarArg, double *); - - if(msh->typ & Asc) - for(j=0;jSolSiz;j++) - fscanf(msh->hdl, "%lf", &DblSolTab[j]); - else - for(j=0;jSolSiz;j++) - ScaDblWrd(msh, (unsigned char *)&DblSolTab[j]); - } - } - - va_end(VarArg); -} - - -/*----------------------------------------------------------*/ -/* Write a full line from the current kwd */ -/*----------------------------------------------------------*/ - -void GmfSetLin(int MshIdx, int KwdCod, ...) -{ - int i, j, pos, *IntBuf; - float *FltSolTab; - double *DblSolTab, *DblBuf; - va_list VarArg; - GmfMshSct *msh = GmfMshTab[ MshIdx ]; - KwdSct *kwd = &msh->KwdTab[ KwdCod ]; - - /* Start decoding the arguments */ - - va_start(VarArg, KwdCod); - - if(kwd->typ != SolKwd) - { - int k, nb_repeat = 0; - - if(msh->ver == 1) - { - if(msh->typ & Asc) - { - for(i=0;iSolSiz;i++) - if(kwd->fmt[i] == 'r') - fprintf(msh->hdl, "%g ", (float)va_arg(VarArg, double)); - else if(kwd->fmt[i] == 'n') { - nb_repeat = va_arg(VarArg, int); - fprintf(msh->hdl, "%d ", nb_repeat); - for(k=0;khdl, "%d ", va_arg(VarArg, int)); - } - else - fprintf(msh->hdl, "%d ", va_arg(VarArg, int)); - } - else - { - int size_of_block = kwd->SolSiz; - for(i=0;iSolSiz;i++) - if(kwd->fmt[i] == 'r') - msh->FltBuf[i] = va_arg(VarArg, double); - else if(kwd->fmt[i] == 'n') { - nb_repeat = va_arg(VarArg, int); - msh->FltBuf[i] = nb_repeat; - for(k=0;kIntBuf[i+1+k] = va_arg(VarArg, int); - size_of_block ++; - } - } - else - msh->IntBuf[i] = va_arg(VarArg, int); - - RecBlk(msh, msh->buf, size_of_block); - } - } - else - { - if(msh->typ & Asc) - { - for(i=0;iSolSiz;i++) - if(kwd->fmt[i] == 'r') - fprintf(msh->hdl, "%.15lg ", va_arg(VarArg, double)); - else if(kwd->fmt[i] == 'n') { - nb_repeat = va_arg(VarArg, int); - fprintf(msh->hdl, "%d ", nb_repeat); - for(k=0;khdl, "%d ", va_arg(VarArg, int)); - } - else - fprintf(msh->hdl, "%d ", va_arg(VarArg, int)); - } - else - { - pos = 0; - - for(i=0;iSolSiz;i++) - if(kwd->fmt[i] == 'r') - { - DblBuf = (double *)&msh->buf[ pos ]; - *DblBuf = va_arg(VarArg, double); - pos += 8; - } - else if(kwd->fmt[i] == 'n') - { - IntBuf = (int *)&msh->buf[ pos ]; - nb_repeat = va_arg(VarArg, int); - *IntBuf = nb_repeat; - pos += 4; - for(k=0;kbuf[ pos ]; - *IntBuf = va_arg(VarArg, int); - pos += 4; - } - } - else - { - IntBuf = (int *)&msh->buf[ pos ]; - *IntBuf = va_arg(VarArg, int); - pos += 4; - } - RecBlk(msh, msh->buf, pos/4); - } - } - } - else - { - if(msh->ver == 1) - { - FltSolTab = va_arg(VarArg, float *); - - if(msh->typ & Asc) - for(j=0;jSolSiz;j++) - fprintf(msh->hdl, "%g ", FltSolTab[j]); - else - RecBlk(msh, (unsigned char *)FltSolTab, kwd->NmbWrd); - } - else - { - DblSolTab = va_arg(VarArg, double *); - - if(msh->typ & Asc) - for(j=0;jSolSiz;j++) - fprintf(msh->hdl, "%.15lg ", DblSolTab[j]); - else - RecBlk(msh, (unsigned char *)DblSolTab, kwd->NmbWrd); - } - } - - va_end(VarArg); - - if(msh->typ & Asc) - fprintf(msh->hdl, "\n"); -} - - -/*----------------------------------------------------------*/ -/* Private procedure for transmesh : copy a whole line */ -/*----------------------------------------------------------*/ - -void GmfCpyLin(int InpIdx, int OutIdx, int KwdCod) -{ - double d; - float f; - int i, a; - GmfMshSct *InpMsh = GmfMshTab[ InpIdx ], *OutMsh = GmfMshTab[ OutIdx ]; - KwdSct *kwd = &InpMsh->KwdTab[ KwdCod ]; - - for(i=0;iSolSiz;i++) - { - if(kwd->fmt[i] == 'r') - { - if(InpMsh->ver == 1) - { - if(InpMsh->typ & Asc) - fscanf(InpMsh->hdl, "%f", &f); - else - ScaWrd(InpMsh, (unsigned char *)&f); - - d = f; - } - else - { - if(InpMsh->typ & Asc) - fscanf(InpMsh->hdl, "%lf", &d); - else - ScaDblWrd(InpMsh, (unsigned char *)&d); - - f = (float)d; - } - - if(OutMsh->ver == 1) - if(OutMsh->typ & Asc) - fprintf(OutMsh->hdl, "%g ", f); - else - RecWrd(OutMsh, (unsigned char *)&f); - else - if(OutMsh->typ & Asc) - fprintf(OutMsh->hdl, "%.15g ", d); - else - RecDblWrd(OutMsh, (unsigned char *)&d); - } - else if(kwd->fmt[i] == 'n') - { - int k, nb_repeat = 0; - - if(InpMsh->typ & Asc) - fscanf(InpMsh->hdl, "%d", &a); - else - ScaWrd(InpMsh, (unsigned char *)&a); - - nb_repeat = a; - - if(OutMsh->typ & Asc) - fprintf(OutMsh->hdl, "%d ", a); - else - RecWrd(OutMsh, (unsigned char *)&a); - - for(k=0;ktyp & Asc) - fscanf(InpMsh->hdl, "%d", &a); - else - ScaWrd(InpMsh, (unsigned char *)&a); - - if(OutMsh->typ & Asc) - fprintf(OutMsh->hdl, "%d ", a); - else - RecWrd(OutMsh, (unsigned char *)&a); - } - } - else - { - if(InpMsh->typ & Asc) - fscanf(InpMsh->hdl, "%d", &a); - else - ScaWrd(InpMsh, (unsigned char *)&a); - - if(OutMsh->typ & Asc) - fprintf(OutMsh->hdl, "%d ", a); - else - RecWrd(OutMsh, (unsigned char *)&a); - } - } - - if(OutMsh->typ & Asc) - fprintf(OutMsh->hdl, "\n"); -} - - -/*----------------------------------------------------------*/ -/* Find every kw present in a meshfile */ -/*----------------------------------------------------------*/ - -static int ScaKwdTab(GmfMshSct *msh) -{ - int KwdCod; - long NexPos, CurPos, EndPos; - char str[ GmfStrSiz ]; - - if(msh->typ & Asc) - { - /* Scan each string in the file until the end */ - - while(fscanf(msh->hdl, "%s", str) != EOF) - { - /* Fast test in order to reject quickly the numeric values */ - - if(isalpha(str[0])) - { - /* Search which kwd code this string is associated with, - then get its header and save the curent position in file (just before the data) */ - - for(KwdCod=1; KwdCod<= GmfMaxKwd; KwdCod++) - if(!strcmp(str, GmfKwdFmt[ KwdCod ][0])) - { - ScaKwdHdr(msh, KwdCod); - break; - } - } - else if(str[0] == '#') - while(fgetc(msh->hdl) != '\n'); - } - } - else - { - /* Get file size */ - - CurPos = ftell(msh->hdl); - fseek(msh->hdl, 0, SEEK_END); - EndPos = ftell(msh->hdl); - fseek(msh->hdl, CurPos, SEEK_SET); - - /* Jump through kwd positions in the file */ - - do - { - /* Get the kwd code and the next kwd position */ - - ScaWrd(msh, (unsigned char *)&KwdCod); - NexPos = GetPos(msh); - - if(NexPos > EndPos) - return(0); - - /* Check if this kwd belongs to this mesh version */ - - if( (KwdCod >= 1) && (KwdCod <= GmfMaxKwd) ) - ScaKwdHdr(msh, KwdCod); - - /* Go to the next kwd */ - - if(NexPos) - fseek(msh->hdl, NexPos, SEEK_SET); - }while(NexPos && (KwdCod != GmfEnd)); - } - - return(1); -} - - -/*----------------------------------------------------------*/ -/* Read and setup the keyword's header */ -/*----------------------------------------------------------*/ - -static void ScaKwdHdr(GmfMshSct *msh, int KwdCod) -{ - int i; - KwdSct *kwd = &msh->KwdTab[ KwdCod ]; - - if(!strcmp("i", GmfKwdFmt[ KwdCod ][2])) - { - if(msh->typ & Asc) - fscanf(msh->hdl, "%d", &kwd->NmbLin); - else - ScaWrd(msh, (unsigned char *)&kwd->NmbLin); - } - else - kwd->NmbLin = 1; - - if(!strcmp("sr", GmfKwdFmt[ KwdCod ][3])) - { - if(msh->typ & Asc) - { - fscanf(msh->hdl, "%d", &kwd->NmbTyp); - - for(i=0;iNmbTyp;i++) - fscanf(msh->hdl, "%d", &kwd->TypTab[i]); - } - else - { - ScaWrd(msh, (unsigned char *)&kwd->NmbTyp); - - for(i=0;iNmbTyp;i++) - ScaWrd(msh, (unsigned char *)&kwd->TypTab[i]); - } - } - - ExpFmt(msh, KwdCod); - kwd->pos = ftell(msh->hdl); -} - - -/*----------------------------------------------------------*/ -/* Expand the compacted format and compute the line size */ -/*----------------------------------------------------------*/ - -static void ExpFmt(GmfMshSct *msh, int KwdCod) -{ - int i, j, TmpSiz=0; - char chr; - const char *InpFmt = GmfKwdFmt[ KwdCod ][3]; - KwdSct *kwd = &msh->KwdTab[ KwdCod ]; - - /* Set the kwd's type */ - - if(!strlen(GmfKwdFmt[ KwdCod ][2])) - kwd->typ = InfKwd; - else if(!strcmp(InpFmt, "sr")) - kwd->typ = SolKwd; - else - kwd->typ = RegKwd; - - /* Get the solution-field's size */ - - if(kwd->typ == SolKwd) - for(i=0;iNmbTyp;i++) - switch(kwd->TypTab[i]) - { - case GmfSca : TmpSiz += 1; break; - case GmfVec : TmpSiz += msh->dim; break; - case GmfSymMat : TmpSiz += (msh->dim * (msh->dim+1)) / 2; break; - case GmfMat : TmpSiz += msh->dim * msh->dim; break; - } - - /* Scan each character from the format string */ - - i = kwd->SolSiz = kwd->NmbWrd = 0; - - while(i < strlen(InpFmt)) - { - chr = InpFmt[ i++ ]; - - if(chr == 'd') - { - chr = InpFmt[i++]; - - for(j=0;jdim;j++) - kwd->fmt[ kwd->SolSiz++ ] = chr; - } - else if(chr == 's') - { - chr = InpFmt[i++]; - - for(j=0;jfmt[ kwd->SolSiz++ ] = chr; - } - else - kwd->fmt[ kwd->SolSiz++ ] = chr; - } - - for(i=0;iSolSiz;i++) - if(kwd->fmt[i] == 'i') - kwd->NmbWrd++; - else if(msh->ver >= 2) - kwd->NmbWrd += 2; - else - kwd->NmbWrd++; -} - - -/*----------------------------------------------------------*/ -/* Read a four bytes word from a mesh file */ -/*----------------------------------------------------------*/ - -static void ScaWrd(GmfMshSct *msh, unsigned char *wrd) -{ - unsigned char swp; - - fread(wrd, WrdSiz, 1, msh->hdl); - - if(msh->cod == 1) - return; - - swp = wrd[3]; - wrd[3] = wrd[0]; - wrd[0] = swp; - - swp = wrd[2]; - wrd[2] = wrd[1]; - wrd[1] = swp; -} - - -/*----------------------------------------------------------*/ -/* Read an eight bytes word from a mesh file */ -/*----------------------------------------------------------*/ - -static void ScaDblWrd(GmfMshSct *msh, unsigned char *wrd) -{ - int i; - unsigned char swp; - - fread(wrd, WrdSiz, 2, msh->hdl); - - if(msh->cod == 1) - return; - - for(i=0;i<4;i++) - { - swp = wrd[7-i]; - wrd[7-i] = wrd[i]; - wrd[i] = swp; - } -} - - -/*----------------------------------------------------------*/ -/* Read ablock of four bytes word from a mesh file */ -/*----------------------------------------------------------*/ - -static void ScaBlk(GmfMshSct *msh, unsigned char *blk, int siz) -{ - int i, j; - unsigned char swp, *wrd; - - fread(blk, WrdSiz, siz, msh->hdl); - - if(msh->cod == 1) - return; - - for(i=0;iver >= 3) - ScaDblWrd(msh, (unsigned char*)&pos); - else - { - ScaWrd(msh, (unsigned char*)&IntVal); - pos = IntVal; - } - - return(pos); -} - - -/*----------------------------------------------------------*/ -/* Write a four bytes word to a mesh file */ -/*----------------------------------------------------------*/ - -static void RecWrd(GmfMshSct *msh, unsigned char *wrd) -{ - fwrite(wrd, WrdSiz, 1, msh->hdl); -} - - -/*----------------------------------------------------------*/ -/* Write an eight bytes word to a mesh file */ -/*----------------------------------------------------------*/ - -static void RecDblWrd(GmfMshSct *msh, unsigned char *wrd) -{ - fwrite(wrd, WrdSiz, 2, msh->hdl); -} - - -/*----------------------------------------------------------*/ -/* Write a block of four bytes word to a mesh file */ -/*----------------------------------------------------------*/ - -static void RecBlk(GmfMshSct *msh, unsigned char *blk, int siz) -{ - /* Copy this line-block into the main mesh buffer */ - - if(siz) - { - memcpy(&msh->blk[ msh->pos ], blk, siz * WrdSiz); - msh->pos += siz * WrdSiz; - } - - /* When the buffer is full or this procedure is called with a 0 size, flush the cache on disk */ - - if( (msh->pos > BufSiz) || (!siz && msh->pos) ) - { - fwrite(msh->blk, 1, msh->pos, msh->hdl); - msh->pos = 0; - } -} - - -/*----------------------------------------------------------*/ -/* Write a 4 or 8 bytes position in a mesh file */ -/*----------------------------------------------------------*/ - -static void SetPos(GmfMshSct *msh, long pos) -{ - int IntVal; - - if(msh->ver >= 3) - RecDblWrd(msh, (unsigned char*)&pos); - else - { - IntVal = pos; - RecWrd(msh, (unsigned char*)&IntVal); - } -} diff --git a/src/GHS3DPlugin/libmesh5.h b/src/GHS3DPlugin/libmesh5.h deleted file mode 100755 index eddf200..0000000 --- a/src/GHS3DPlugin/libmesh5.h +++ /dev/null @@ -1,153 +0,0 @@ - - -/*----------------------------------------------------------*/ -/* */ -/* LIBMESH V 5.46 */ -/* */ -/*----------------------------------------------------------*/ -/* */ -/* Description: handle .meshb file format I/O */ -/* Author: Loic MARECHAL */ -/* Creation date: feb 16 2007 */ -/* Last modification: dec 09 2011 */ -/* */ -/*----------------------------------------------------------*/ - - -/*----------------------------------------------------------*/ -/* Defines */ -/*----------------------------------------------------------*/ - -#define GmfStrSiz 1024 -#define GmfMaxTyp 1000 -#define GmfMaxKwd 80 -#define GmfMshVer 1 -#define GmfRead 1 -#define GmfWrite 2 -#define GmfSca 1 -#define GmfVec 2 -#define GmfSymMat 3 -#define GmfMat 4 -#define GmfFloat 1 -#define GmfDouble 2 - -enum GmfKwdCod -{ - GmfReserved1, \ - GmfVersionFormatted, \ - GmfReserved2, \ - GmfDimension, \ - GmfVertices, \ - GmfEdges, \ - GmfTriangles, \ - GmfQuadrilaterals, \ - GmfTetrahedra, \ - GmfPrisms, \ - GmfHexahedra, \ - GmfIterationsAll, \ - GmfTimesAll, \ - GmfCorners, \ - GmfRidges, \ - GmfRequiredVertices, \ - GmfRequiredEdges, \ - GmfRequiredTriangles, \ - GmfRequiredQuadrilaterals, \ - GmfTangentAtEdgeVertices, \ - GmfNormalAtVertices, \ - GmfNormalAtTriangleVertices, \ - GmfNormalAtQuadrilateralVertices, \ - GmfAngleOfCornerBound, \ - GmfTrianglesP2, \ - GmfEdgesP2, \ - GmfSolAtPyramids, \ - GmfQuadrilateralsQ2, \ - GmfISolAtPyramids, \ - GmfSubDomainFromGeom, \ - GmfTetrahedraP2, \ - GmfFault_NearTri, \ - GmfFault_Inter, \ - GmfHexahedraQ2, \ - GmfExtraVerticesAtEdges, \ - GmfExtraVerticesAtTriangles, \ - GmfExtraVerticesAtQuadrilaterals, \ - GmfExtraVerticesAtTetrahedra, \ - GmfExtraVerticesAtPrisms, \ - GmfExtraVerticesAtHexahedra, \ - GmfVerticesOnGeometricVertices, \ - GmfVerticesOnGeometricEdges, \ - GmfVerticesOnGeometricTriangles, \ - GmfVerticesOnGeometricQuadrilaterals, \ - GmfEdgesOnGeometricEdges, \ - GmfFault_FreeEdge, \ - GmfPolyhedra, \ - GmfPolygons, \ - GmfFault_Overlap, \ - GmfPyramids, \ - GmfBoundingBox, \ - GmfBody, \ - GmfPrivateTable, \ - GmfFault_BadShape, \ - GmfEnd, \ - GmfTrianglesOnGeometricTriangles, \ - GmfTrianglesOnGeometricQuadrilaterals, \ - GmfQuadrilateralsOnGeometricTriangles, \ - GmfQuadrilateralsOnGeometricQuadrilaterals, \ - GmfTangents, \ - GmfNormals, \ - GmfTangentAtVertices, \ - GmfSolAtVertices, \ - GmfSolAtEdges, \ - GmfSolAtTriangles, \ - GmfSolAtQuadrilaterals, \ - GmfSolAtTetrahedra, \ - GmfSolAtPrisms, \ - GmfSolAtHexahedra, \ - GmfDSolAtVertices, \ - GmfISolAtVertices, \ - GmfISolAtEdges, \ - GmfISolAtTriangles, \ - GmfISolAtQuadrilaterals, \ - GmfISolAtTetrahedra, \ - GmfISolAtPrisms, \ - GmfISolAtHexahedra, \ - GmfIterations, \ - GmfTime, \ - GmfFault_SmallTri, \ - GmfCoarseHexahedra -}; - - -/*----------------------------------------------------------*/ -/* External procedures */ -/*----------------------------------------------------------*/ - -extern int GmfOpenMesh(const char *, int, ...); -extern int GmfCloseMesh(int); -extern int GmfStatKwd(int, int, ...); -extern int GmfGotoKwd(int, int); -extern int GmfSetKwd(int, int, ...); -extern void GmfGetLin(int, int, ...); -extern void GmfSetLin(int, int, ...); - - -/*----------------------------------------------------------*/ -/* Fortran 77 API */ -/*----------------------------------------------------------*/ - -#if defined(F77_NO_UNDER_SCORE) -#define call(x) x -#else -#define call(x) x ## _ -#endif - - -/*----------------------------------------------------------*/ -/* Transmesh private API */ -/*----------------------------------------------------------*/ - -#ifdef TRANSMESH - -extern char *GmfKwdFmt[ GmfMaxKwd + 1 ][4]; -extern int GmfCpyLin(int, int, int); - -#endif diff --git a/src/GUI/GHS3DPluginGUI_Enums.h b/src/GUI/GHS3DPluginGUI_Enums.h index 2a2aca8..87c2563 100644 --- a/src/GUI/GHS3DPluginGUI_Enums.h +++ b/src/GUI/GHS3DPluginGUI_Enums.h @@ -58,7 +58,7 @@ enum { // Enforced vertices widget inputs enum { ENF_VER_WARNING = 0, - ENF_VER_VERTEX /*= 0*/, + ENF_VER_VERTEX,// = 0, ENF_VER_X_COORD, ENF_VER_Y_COORD, ENF_VER_Z_COORD, diff --git a/src/GUI/GHS3DPluginGUI_HypothesisCreator.cxx b/src/GUI/GHS3DPluginGUI_HypothesisCreator.cxx index 0d67752..eab4b29 100644 --- a/src/GUI/GHS3DPluginGUI_HypothesisCreator.cxx +++ b/src/GUI/GHS3DPluginGUI_HypothesisCreator.cxx @@ -445,28 +445,35 @@ QFrame* GHS3DPluginGUI_HypothesisCreator::buildFrame() myBoundaryRecoveryCheck = new QCheckBox( tr( "RECOVERY_VERSION" ), myAdvGroup ); myFEMCorrectionCheck = new QCheckBox( tr( "FEM_CORRECTION" ), myAdvGroup ); + + QLabel* myGradationLabel = new QLabel( tr( "GHS3D_GRADATION" ), myAdvGroup ); + myGradation = new SMESHGUI_SpinBox(myAdvGroup); + myGradation->RangeStepAndValidator(1.05, 5.0, 0.05, "length_precision"); QLabel* aTextOptionLabel = new QLabel( tr( "TEXT_OPTION" ), myAdvGroup ); myTextOption = new QLineEdit( myAdvGroup ); - anAdvLayout->addWidget( myMaximumMemoryCheck, 0, 0, 1, 1 ); - anAdvLayout->addWidget( myMaximumMemorySpin, 0, 1, 1, 1 ); - anAdvLayout->addWidget( aMegabyteLabel, 0, 2, 1, 1 ); - anAdvLayout->addWidget( myInitialMemoryCheck, 1, 0, 1, 1 ); - anAdvLayout->addWidget( myInitialMemorySpin, 1, 1, 1, 1 ); - anAdvLayout->addWidget( aMegabyteLabel2, 1, 2, 1, 1 ); - anAdvLayout->addWidget( aWorkinDirLabel, 2, 0, 1, 1 ); - anAdvLayout->addWidget( myWorkingDir, 2, 1, 1, 2 ); - anAdvLayout->addWidget( dirBtn, 2, 3, 1, 1 ); - anAdvLayout->addWidget( myKeepFiles, 3, 0, 1, 4 ); - anAdvLayout->addWidget( aVerboseLevelLabel, 4, 0, 1, 1 ); - anAdvLayout->addWidget( myVerboseLevelSpin, 4, 1, 1, 1 ); - anAdvLayout->addWidget( myToCreateNewNodesCheck, 5, 0, 1, 4 ); - anAdvLayout->addWidget( myRemoveInitialCentralPointCheck, 6, 0, 1, 4 ); - anAdvLayout->addWidget( myBoundaryRecoveryCheck, 7, 0, 1, 4 ); - anAdvLayout->addWidget( myFEMCorrectionCheck, 8, 0, 1, 4 ); - anAdvLayout->addWidget( aTextOptionLabel, 9, 0, 1, 1 ); - anAdvLayout->addWidget( myTextOption, 9, 1, 1, 2 ); + row = 0; + anAdvLayout->addWidget( myMaximumMemoryCheck, row, 0, 1, 1 ); + anAdvLayout->addWidget( myMaximumMemorySpin, row, 1, 1, 1 ); + anAdvLayout->addWidget( aMegabyteLabel, row++, 2, 1, 1 ); + anAdvLayout->addWidget( myInitialMemoryCheck, row, 0, 1, 1 ); + anAdvLayout->addWidget( myInitialMemorySpin, row, 1, 1, 1 ); + anAdvLayout->addWidget( aMegabyteLabel2, row++, 2, 1, 1 ); + anAdvLayout->addWidget( aWorkinDirLabel, row, 0, 1, 1 ); + anAdvLayout->addWidget( myWorkingDir, row, 1, 1, 2 ); + anAdvLayout->addWidget( dirBtn, row++, 3, 1, 1 ); + anAdvLayout->addWidget( myKeepFiles, row++, 0, 1, 4 ); + anAdvLayout->addWidget( aVerboseLevelLabel, row, 0, 1, 1 ); + anAdvLayout->addWidget( myVerboseLevelSpin, row++, 1, 1, 2 ); + anAdvLayout->addWidget( myToCreateNewNodesCheck, row++, 0, 1, 4 ); + anAdvLayout->addWidget( myRemoveInitialCentralPointCheck, row++, 0, 1, 4 ); + anAdvLayout->addWidget( myBoundaryRecoveryCheck, row++, 0, 1, 4 ); + anAdvLayout->addWidget( myFEMCorrectionCheck, row++, 0, 1, 4 ); + anAdvLayout->addWidget( myGradationLabel, row, 0, 1, 1 ); + anAdvLayout->addWidget( myGradation, row++, 1, 1, 2 ); + anAdvLayout->addWidget( aTextOptionLabel, row, 0, 1, 1 ); + anAdvLayout->addWidget( myTextOption, row++, 1, 1, 2 ); // Enforced vertices parameters myEnfGroup = new QWidget(); @@ -478,10 +485,10 @@ QFrame* GHS3DPluginGUI_HypothesisCreator::buildFrame() myEnforcedTableWidget->setColumnCount( ENF_VER_NB_COLUMNS ); myEnforcedTableWidget->setSortingEnabled(true); QStringList enforcedHeaders; - enforcedHeaders << tr( "GHS3D_ENF_NAME_COLUMN" ) - << tr( "GHS3D_ENF_VER_X_COLUMN" )<< tr( "GHS3D_ENF_VER_Y_COLUMN" ) << tr( "GHS3D_ENF_VER_Z_COLUMN" ) + enforcedHeaders << tr( "GHS3D_ENF_NAME_COLUMN" ) + << tr( "GHS3D_ENF_VER_X_COLUMN" )<< tr( "GHS3D_ENF_VER_Y_COLUMN" ) << tr( "GHS3D_ENF_VER_Z_COLUMN" ) << tr( "GHS3D_ENF_SIZE_COLUMN" ) << tr("GHS3D_ENF_ENTRY_COLUMN") << tr("GHS3D_ENF_VER_COMPOUND_COLUMN") << tr( "GHS3D_ENF_GROUP_COLUMN" ); - + myEnforcedTableWidget->setHorizontalHeaderLabels(enforcedHeaders); myEnforcedTableWidget->verticalHeader()->hide(); myEnforcedTableWidget->horizontalHeader()->setStretchLastSection(true); @@ -1431,11 +1438,12 @@ void GHS3DPluginGUI_HypothesisCreator::retrieveParams() const myRemoveInitialCentralPointCheck ->setChecked ( data.myRemoveInitialCentralPoint ); myBoundaryRecoveryCheck ->setChecked ( data.myBoundaryRecovery ); myFEMCorrectionCheck ->setChecked ( data.myFEMCorrection ); + myGradation ->setValue ( data.myGradation ); myTextOption ->setText ( data.myTextOption ); TEnfVertexList::const_iterator it; int rowCount = 0; - myEnforcedTableWidget->clear(); + myEnforcedTableWidget->clearContents(); myEnforcedTableWidget->setSortingEnabled(false); myEnforcedTableWidget->disconnect(SIGNAL( itemChanged(QTableWidgetItem *))); for(it = data.myEnforcedVertices.begin() ; it != data.myEnforcedVertices.end(); it++ ) @@ -1515,7 +1523,7 @@ void GHS3DPluginGUI_HypothesisCreator::retrieveParams() const // Update Enforced meshes QTableWidget TEnfMeshList::const_iterator itMesh; rowCount = 0; - myEnforcedMeshTableWidget->clear(); + myEnforcedMeshTableWidget->clearContents(); myEnforcedMeshTableWidget->setSortingEnabled(false); // myEnforcedMeshTableWidget->disconnect(SIGNAL( itemChanged(QTableWidgetItem *))); for(itMesh = data.myEnforcedMeshes.begin() ; itMesh != data.myEnforcedMeshes.end(); itMesh++ ) @@ -1619,6 +1627,11 @@ QString GHS3DPluginGUI_HypothesisCreator::storeParams() const if ( data.myFEMCorrection ) valStr += " -FEM"; + if ( data.myGradation != 1.05 ) { + valStr += " -Dcpropa="; + valStr += QString::number( data.myGradation ); + } + valStr += " "; valStr += data.myTextOption; @@ -1666,6 +1679,7 @@ bool GHS3DPluginGUI_HypothesisCreator::readParamsFromHypo( GHS3DHypothesisData& h_data.myRemoveInitialCentralPoint = h->GetToRemoveCentralPoint(); h_data.myBoundaryRecovery = h->GetToUseBoundaryRecoveryVersion(); h_data.myFEMCorrection = h->GetFEMCorrection(); + h_data.myGradation = h->GetGradation(); h_data.myTextOption = h->GetTextOption(); GHS3DPlugin::GHS3DEnforcedVertexList_var vertices = h->GetEnforcedVertices(); @@ -1749,6 +1763,8 @@ bool GHS3DPluginGUI_HypothesisCreator::storeParamsToHypo( const GHS3DHypothesisD h->SetToUseBoundaryRecoveryVersion( h_data.myBoundaryRecovery ); if ( h->GetFEMCorrection() != h_data.myFEMCorrection ) h->SetFEMCorrection( h_data.myFEMCorrection ); + if ( h->GetGradation() != h_data.myGradation ) + h->SetGradation ( h_data.myGradation ); if ( h->GetTextOption() != h_data.myTextOption ) h->SetTextOption ( h_data.myTextOption.toLatin1().constData() ); @@ -1848,6 +1864,7 @@ bool GHS3DPluginGUI_HypothesisCreator::readParamsFromWidgets( GHS3DHypothesisDat h_data.myRemoveInitialCentralPoint = myRemoveInitialCentralPointCheck->isChecked(); h_data.myBoundaryRecovery = myBoundaryRecoveryCheck->isChecked(); h_data.myFEMCorrection = myFEMCorrectionCheck->isChecked(); + h_data.myGradation = myGradation->value(); h_data.myTextOption = myTextOption->text(); // Enforced vertices diff --git a/src/GUI/GHS3DPluginGUI_HypothesisCreator.h b/src/GUI/GHS3DPluginGUI_HypothesisCreator.h index 0aab3e9..5e311ec 100644 --- a/src/GUI/GHS3DPluginGUI_HypothesisCreator.h +++ b/src/GUI/GHS3DPluginGUI_HypothesisCreator.h @@ -143,6 +143,7 @@ typedef struct bool myToMeshHoles,myKeepFiles,myToCreateNewNodes,myBoundaryRecovery,myFEMCorrection,myRemoveInitialCentralPoint; int myMaximumMemory,myInitialMemory,myOptimizationLevel; QString myName,myWorkingDir,myTextOption; + double myGradation; short myVerboseLevel; TEnfVertexList myEnforcedVertices; TEnfMeshList myEnforcedMeshes; @@ -222,6 +223,7 @@ private: QCheckBox* myRemoveInitialCentralPointCheck; QCheckBox* myBoundaryRecoveryCheck; QCheckBox* myFEMCorrectionCheck; + SMESHGUI_SpinBox* myGradation; QLineEdit* myTextOption; QWidget* myEnfGroup; diff --git a/src/GUI/GHS3DPlugin_msg_en.ts b/src/GUI/GHS3DPlugin_msg_en.ts index 65569d8..9c8884b 100644 --- a/src/GUI/GHS3DPlugin_msg_en.ts +++ b/src/GUI/GHS3DPlugin_msg_en.ts @@ -79,6 +79,10 @@ FEM_CORRECTION To use FEM correction + + GHS3D_GRADATION + Volumic gradation + SELECT_DIR ... diff --git a/src/GUI/GHS3DPlugin_msg_fr.ts b/src/GUI/GHS3DPlugin_msg_fr.ts index 86452f3..922e2cc 100755 --- a/src/GUI/GHS3DPlugin_msg_fr.ts +++ b/src/GUI/GHS3DPlugin_msg_fr.ts @@ -79,6 +79,10 @@ FEM_CORRECTION Utiliser correction FEM + + GHS3D_GRADATION + Gradation volumique + SELECT_DIR ... -- 2.39.2