From bb545186fa0ae02fa021337e6ecbedaba96e620e Mon Sep 17 00:00:00 2001 From: vsr Date: Wed, 18 Dec 2013 14:23:59 +0000 Subject: [PATCH] Merge from V7_3_BR branch 18/12/2013 --- CMakeLists.txt | 2 +- doc/salome/gui/GEOM/images/isos.png | Bin 0 -> 1360 bytes doc/salome/gui/GEOM/images/pipe.png | Bin 19011 -> 18720 bytes doc/salome/gui/GEOM/images/pipe2.png | Bin 21289 -> 20855 bytes .../gui/GEOM/input/common_operation.doc | 38 +- .../gui/GEOM/input/creating_isoline.doc | 27 +- .../GEOM/input/creating_smoothingsurface.doc | 13 +- doc/salome/gui/GEOM/input/cut_operation.doc | 37 +- doc/salome/gui/GEOM/input/fuse_operation.doc | 46 +- .../gui/GEOM/input/geometry_preferences.doc | 32 +- doc/salome/gui/GEOM/input/import_export.doc | 2 + doc/salome/gui/GEOM/input/index.doc | 13 +- doc/salome/gui/GEOM/input/material.doc | 19 +- doc/salome/gui/GEOM/input/partition.doc | 50 +- .../gui/GEOM/input/remove_webs_operation.doc | 6 +- .../gui/GEOM/input/repairing_operations.doc | 6 +- .../gui/GEOM/input/section_operation.doc | 32 +- .../gui/GEOM/input/sewing_operation.doc | 30 +- .../gui/GEOM/input/union_faces_operation.doc | 21 +- .../GEOM/input/using_boolean_operations.doc | 16 +- .../GEOM/input/using_measurement_tools.doc | 7 +- .../gui/GEOM/input/viewing_geom_obj.doc | 12 +- doc/salome/gui/GEOM/input/xao_format.doc | 20 +- resources/pipesections.png | Bin 855 -> 860 bytes src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.cxx | 27 + src/AdvancedGUI/AdvancedGUI_msg_en.ts | 24 + src/AdvancedGUI/AdvancedGUI_msg_fr.ts | 24 + src/AdvancedGUI/AdvancedGUI_msg_ja.ts | 154 +-- src/BlockFix/BlockFix_UnionFaces.cxx | 39 +- src/BuildGUI/BuildGUI_ShellDlg.cxx | 12 +- src/DisplayGUI/DisplayGUI.cxx | 3 + src/EntityGUI/EntityGUI_3DSketcherDlg.cxx | 6 +- .../EntityGUI_FeatureDetectorDlg.cxx | 43 +- src/EntityGUI/EntityGUI_FeatureDetectorDlg.h | 2 +- src/EntityGUI/EntityGUI_PictureImportDlg.cxx | 6 +- src/EntityGUI/EntityGUI_SubShapeDlg.cxx | 54 +- src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cxx | 4 +- src/GEOMAlgo/GEOMAlgo_FinderShapeOn2.cxx | 4 +- src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx | 41 +- src/GEOMGUI/GEOM_Displayer.cxx | 53 +- src/GEOMGUI/GEOM_msg_en.ts | 63 +- src/GEOMGUI/GEOM_msg_fr.ts | 177 +-- src/GEOMGUI/GEOM_msg_ja.ts | 1027 ++++++++++++----- src/GEOMGUI/GeometryGUI.cxx | 15 + src/GEOMGUI/GeometryGUI_Operations.h | 1 + src/GEOMImpl/GEOMImpl_GlueDriver.cxx | 55 +- src/GEOMImpl/GEOMImpl_GlueDriver.hxx | 5 +- src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx | 135 ++- src/GEOMImpl/GEOMImpl_TranslateDriver.cxx | 16 +- src/GEOMToolsGUI/GEOMToolsGUI.cxx | 6 +- src/GEOMToolsGUI/GEOMToolsGUI_1.cxx | 2 +- src/GEOM_I/GEOM_Gen_i.cc | 140 ++- src/GroupGUI/GroupGUI_GroupDlg.cxx | 53 +- src/MeasureGUI/MeasureGUI_AngleDlg.cxx | 2 +- src/OBJECT/GEOM_Constants.cxx | 2 + src/OBJECT/GEOM_Constants.h | 3 +- .../ShapeRec_FeatureDetector.cxx | 96 +- .../TransformationGUI_MultiRotationDlg.cxx | 19 +- .../TransformationGUI_MultiTranslationDlg.cxx | 86 +- src/XAO/tests/CMakeLists.txt | 5 +- src/XAO/tests/TestUtils.hxx | 3 +- 61 files changed, 1894 insertions(+), 942 deletions(-) create mode 100644 doc/salome/gui/GEOM/images/isos.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 9bebba4c6..f858e7c26 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ CMAKE_POLICY(SET CMP0003 NEW) STRING(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UC) SET(${PROJECT_NAME_UC}_MAJOR_VERSION 7) -SET(${PROJECT_NAME_UC}_MINOR_VERSION 2) +SET(${PROJECT_NAME_UC}_MINOR_VERSION 3) SET(${PROJECT_NAME_UC}_PATCH_VERSION 0) SET(${PROJECT_NAME_UC}_VERSION ${${PROJECT_NAME_UC}_MAJOR_VERSION}.${${PROJECT_NAME_UC}_MINOR_VERSION}.${${PROJECT_NAME_UC}_PATCH_VERSION}) diff --git a/doc/salome/gui/GEOM/images/isos.png b/doc/salome/gui/GEOM/images/isos.png new file mode 100644 index 0000000000000000000000000000000000000000..86433e164693dbeb7aef0434573da477182d6024 GIT binary patch literal 1360 zcmV-W1+V&vP)lWN&vMLu_Glb2=bVbS-mrVqtJ_ zY-wX*bZKvHhgL;V0000TbVXQnRB3cGULDIyoTpY>8k*wEi z^DD2+uh=RY2ObWT)nm4?Z*h4nGUvedtIL>pgUe&bI2e;Awz4f0oJbQhRCb`GiGP4N zP}0N;)k?xFX+i`V3Io00i(Mb!!1k-_Iwsc8bTnaQY&Hn%6N{_lWOoSaKtrLF0{%23 zIx;bKKu9kp)+f9Ul=ge4jaw*W@3a&@2OhL(B9;TCK@%JLk}ykCCL)HyKqHgg=2WD< zgPiOpY)+%b!I;=x>=h&wo`-YWuP*8?o2yf~0);{;C3o3~;Nn1@L&0h3U?zZZAkO;3 zn81cYg>?g%Xf+*8pf=Ho1BG`t=Jgr7gZ6i0UZ06HT@q&DGJ$n~T3TT-(X#`E!UU=$ z2s9l{0Gr5A7Lv}|dpc8F3+)V`$$LByD>X);DM!y+bjtOU}FLp3cz)3F`MjAn~v)9 zvTo4H&X93Bs_bLv%FNddW&&6eyqAu&8xu7pY;!=}#X5lvh1_K$f_6}IX=)Q}>BtpQ z6R1!Ch9I4Z9!kP2M7>kEl3?9Cai|Dc655-wAsX238zSHC(%miss?0nN6iiHDZyX6z zC=38hge(dER5j7zl(3viU2Kz6La;l4;id!>zVk%mB_YH-(PTPu#ok1wqx~>8(Re!Y z#LPsdqXRMPV!H~3JXPogt2eZG)}^=?yA!RZ!AK_B?#fu66uk*!R~BNjGo;mYG=bxFai93gonZa*aY^*5oGCYz)oZw z9MpeZ&gu=V@Fy~6NtmU!i9S2jCDb#Ko1I>#hKZi1gyr~}$da%eM-y2RcEaUeY$xf6 z`d)0NqrI_wX4hRh;+*XA4Xpz)+hxC^2FJ+m(4cP}ogiL!piXh1W#$>1YDuZcMy`U-eh!iwST^KsZo{dM9is zJm4HC6fpr$M{o^7Vxn^g3erUV{WasIc^oL6o+`wqK_I(qB-7CxRp$w8hx+id{>nSh z#i>G{xE(0%pDGkWgLv<gfq)FwJ{pb+gS z7^4n8_TfNbjEPc8R}K^|6CH-a0Lx_e4ix;ULg_$(^-h|O?oz`u zuv3N7!34l>ccp__s-7y84ql<&sY0pYb!wa{ln$2QIN6m_?!I|lygeLG75b1GcEROT zp>(hZ#=qT_4)(^(L^?PSn^T2S!{J2z6}9$A6D*KE$L`& literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/pipe.png b/doc/salome/gui/GEOM/images/pipe.png index e7caa83948a41088c1acab9c4a9e19cbba1effca..c1b77a98068b67449c3f42718c8834e3231911d5 100755 GIT binary patch literal 18720 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

kvA48kxjj+)Oyr{@tvmPgH?-uMh4N7k zDP%DT{07n+jrA9_bYH(?u>1ZLuSLS|HeybePPke6ke`pKu*GfA&cL79-4uVddFP>? zye-yr7kM5*a(DZ1dpdM-VjnL_7A^kl=@W&6NS*3HUsH~4{m_QBT?GrjxvdX%8K z`|pwY7L5iQu9yoi6&C#JW{PS{=_)F|Te6FDCo;n4n)KkSQC|>hM=^*n!7qKHC{D=7^~G zaCLWg8y{CD@t>QUv(<`?j|X?4e_%kUGiUvxXv;4;oX=&+?qT$4!8XFqH zJ(;PrfF(jgl4G#3AvV!$@Csb)?|*M?UG=>pjms-ga3%~H4xjb<`uDD6p8ZCD@=U$I zn6S?6zUSMwPZIkO;PJ^&dF#s^TwK(;*SEK~spF{$8G|V;Y5sYmR!PY3?JgojzllPp zadY{NO(^H*YZF&*YelJYy>9PvimEA7c&8DDjGB;8pj?D08bOPhu>ImAN&9aBESi6~w_+iiYb;BL=mt*dEN+Q(#DWdN$zU;VysUg>t*R z+-aC6>66RkyPH@cySttxgw83$jwo<@Sd-hvF`7we!#M&%!+SV)WZDT9aJ($W%_$0)e5u~CbB^Q2~-SYbJqLKOqU zF9_br-qH8sH>KnCnOS-wb(Tx^+MFBWM@P39LD)j&qPpwrlarI8Udgg|VT|x*Z%j-~ zs-U2!W@j}u)ywp{(-fm}GjQV4xEp!JT}Y|?kt0?m;`M9vo2 z`X1uDFgR7}ASof6jK`ZA^CjvDk=zrAcvxqkyMkGW8$X_dXB7<@r*TW`^Ly`mSR%I6 z{ey!hw^I{2208zz=1iXm!h8oSu9G&DZY7BCmpToY{154Jic~#Rp^3Djux=i1{I{ps zg4vhbmvYUwCsI2-%BwgRLln#COFf|rnCDeU;%8ZG+7 zJ~9kOco+@x|bo(@e?U(XkfuSlawTeLqkI|?N2&hTK21{sR_qnw|5E&3ID+J z9P-|0X|AOyUHu$cFaj~cl5MuH&qD45f4{PCLEFUIy2+s9(^8h+XVQK1nL=IJZ#tE) ziE>T(Xo%&=C@89D!98XmqsH7`{F&u)F%wRV{sO@YMG%$XsQ;{7}NO02ODMb!`p^5a)loILO9*E57kR_X%G6}f5^!&ke zUQ1 z*XlrQey|GS_ySkVmh3qsi_@I1-W1+gglyIta%HHX015>2O82FoA9(OfVQ|iQKFA*6 z4-aW)Z^kNjAcYeA+ zs+VHk=fYaI%dqXz=Ei5&wJf$pvC1Z*#uA@gMec5I zlcdQ355SxZLUTc*TJ`yy&5s|1HDOB{NgE4>P{UNK{x@ zI^_+OyK_Ybo(xHs;e_g>OijE>yg|qmpX)(DtOt@VXZ-OUd6#c;cz8Ici#-55RAxpt zFyIUYJEo^0hhBj-x}Q=n#(G@KQL{3+!+TvWG@1(5e%x!nc^%&0)AO}KkUqA)wvIJ{ z_bB~`x$03EQ*45L|FxZE&?|KGf^l;=oax!O6fQ_xrq@}75-2`y-IyZ_3kwqy37#KH zb(>2z50Mi4*8RirsFXC`Y4`^O_1xE~4>4P;XiTf|tM;T0zy$Dt_@GSPaolvzs8%d% z?Y1F6p#*!K99U2rW1gHHjQaBBOQHLFJ*JLg_LHdr4tj$Q0dZia5rw39d{eG&75)btg*^(`CTw%WnzeR#rIpCFTUMf zB%Y`w3kz|uI^%VWyW{9?teSngZEa2KQUZ=c#pZYz4t((IeSv8?eP(O48al< z6dD;F?U__0kFD&N&(6*+q)?ijsivaQ+}NN^2o@n$ptBxW(?meIvm2Vj7OUC17hz{- zr}*cCt>6j>*S66t!HBaYWjw!wR~Gu%Suv)scyLS-dZ;P2f@B(zteN45#M z8|z%ZNZM)Ql~cLv-EUlHr>C*+^Y>~eMba(vCJJbZlMv6fXD)U8i@Y;bDBSy(5`Qw3 zquBQH>&@L;Oh4@#cqNf)<=OzKB^cK_WgaTM)TCgQqE69lPBBCFpVr+=L?B_0RUL5( zs8HPKN&2MeUx-=XrF#r$Ax^fmc>iiGv2ZRm^yFtRRCWqCKI*f~&A7#QMxVI5veLS2 zD=j0_X433=8QVyPbWm)UW@@(0XcP>heO^3S!z%+)-gF+;v3LpN0i#e`z&-m6vPHtf%X4~iI-@bGtZBHp^{f!@ zUvU$S2?9_+$^Q(ee}Zgai-!jUa^1T87*%cltTGvf3FGDEsjtHWfa2wXcMNKL=$YqJ zWC)}VeeU32sDkj{0OQYM_{T#IISE-NK3Lw4_Rcd$G|1L&n9O5NFV8Vm8i`Bj^pB7j z63^$c6w4#c7sz;;Wm*Z*`L-=!y?VE5t> zzgU!z#826G-)*0)Q9<0J6iyGo0cdr8B)#*#+!O*>|JuP^QE`N!`BqS3)s;u5H~_!Q zwZ{NJi!;I;=)o&bKD)-Y%~LvB+KquswX=%g{{smWk`fZmPx=$ZBCt5kR&rVLhmZpn zbQW%#qx*!VZ5V9)qpA~K`mDO?kO;VVs9lwfjMfHH*)v>uknyGJY@zoeW7Uow@_w)&1nb|B1CX2b_1p?z%5WHV zhQS~aw0Cq^&DBIx&eiCz4r+4~yyD|>x*lufKd78*9A_>gM1O%IC>SkIiE96VDG1wj zjQdtrP*BjofLNU#{e_gI)cL_|J)J&IZJuaO56YTn#cGbqVW}Xj@nVmxv?TZ$868tK zFfe??Q6yNuD_LI=XW#d{bxP>!>_laM3t)_JNMz(t^`h7A)>bg`$?rj)Ko%7#=+qs!K+uS^p?0~6Te!b#YO27D={_f9Bn-{&f@yki^k2>Fx80fD=REs zym%215FnWs(_@qnmryY?;+DlyySK3;YME7D$ORrEDF8y17?9x??i={lMc=TOmfjC1 zDc7@Ly%cHf?d@GZq{oDPCL9BTHX-uV^larEt+$k?o!xQ3BK@Akg2V0QF%%3Ep+6(M zQt`Mnxe|FS_6QcLU3|L{GwW*vg&!sZDe2rUfdN5O@sbz%2Q!*gTB^n4?HcJaPZc1 zh*4Jr-c0t4#>DiPs@@*1Z-#+#Obn=T3*)pHSy(i`>$P--I@TRV=bk*`50mK+mQzm z>tTDh{kqCSdJlF3PyfQgLg#|21Shu2Jg7{3U-;(&a!l`~i@tf_u5cF8Ti|HpUM<4{ z;9vLgezp-YOrkQtb*PvogCjpOwvd8I=*h5O*xft$tA*RKf zua6a|4-f6vVzvovA6E*eDky=m>fzzOn$Tw3pMd`2(1EyqY19ultx9smXT1?XG>gxJO z#l|YBt0zal;^gE+dD$8C6yg}HF#5IH9wea;4uv1qcXdPjH)(zA2UE2q3=D@LthjpWNJ>f?8IcMWeEG8Bhs4+2-|gt^ zEGsK%Ree0K*Z3Hr0hGG7z|C9 zt)ru-vo_66PELS!S5qr}SGEF}gOZXG7(`rHSlD5oFkxwkfXioEiAJu?aj?V6N=GOf zg{+Myi$Scs<-*l$V$PCLqCvgA7|?Ik5tv;q#!3nFuj- zwl{b)o!j}|`}pF6EK~?nVM*!*4-3iYbVqXAvMmQLeqz_MEi@u-F!G8mM^jT%rq8{b zo*toKaEl)D=oJ%ISX~_#4NdX&_4QjnXq00sOG|Te^X^aGoZ(IvV~g1k2s9i5!uUg) za=ntq^bEKB)xkopL@eLUg(-z>8lhC3d5_nOm26o`fFMwtVbrHGj|&j0%~L{K!Pb4FfN$1%aghUWx2*4E~U)FyrE2 zd-q&mXop6kS0E||l7(|=A`3QX5r&6A+;=;wJ&G4}$46zr%&%QY$$gyN4;nxmzH8Zk zEav_K5kjtq>7SlJj&A*E{!K}U_BTl&y1YnXZz@k z(m^PQFa7gsfMqoNNI@ycDh^Ka_r;tgsY5_vgdvUif&AxQ_X6U}Ru*=gmPd;^F?f zjCI?CW?yS5q7SS4*w%MDeKRw&pe7!4W-d|#&vq~?gAsBSx4{wpp8A2At|BilaNu+~ zysXfYLrg+qv(O+BN9f7!;S3j`&mGEBEwQ$BKy`s zLhDOpfPsMl%zVUa)*Uc;g^2{WdSWS>AMQPpzlZg$larCl1g8pF{aZiUxJpQyphlGT%nDo0I9lh1kngcnnr_mO72xW~FyvWHx3eFY>Lh2`f z!RV;Ib?dqBcAF*Xk#Gd*TwXg11Q#`R?d_caIQm-85X9PlcNtd4$H9@BBN)hJ_qn$? z)pg&_1IP{c?s%)ruC(+}&MKvD*QN zdH23{Z)@qYVv8!VPo;Q#5GuXLm|d+pW(3tgDzaKmTN|$oGf+RzIPcrJy^|f;%bv?w z)T+Gv{F|E_F%gmQmpJ+PVql=e#Ks~V2ta%lfXZ5>$~rzV1^=Dpy|koU+^0{UKqSk} z%cJu!#TJBZ`~K+!j@yIVA2~UD=A(X+#y1n@Wai|r#+-J>kC}_Uc--88E@JiR2j2q0 zO`X@_qV*-0bjKYX9hlzr-znUNj#s;oaCx%ICEB~=GFG2MNV-Y^HJ83DPH`Sx7v2^5o(EqS?a20?E_eS8IK5#dG5ZV{v3u1U78V*>TG9j{s^$)iT$K(if)O20qqbJ}bBYu4 z#t0yp9wUG?Mopy?@2oV&D#pf?S9--KS^=10&~89S#~K?R)-y0T`D%N2Z8cjJj?bEs zq!LPLS(`Jsj)21sh~(g76bGGjG!*P?(?0e^PnN#`4RdmT->Ai}&mw=JA0j3ug)i$r z^I-^uo(Kqqr4$tv^*VRv&eYuzWyUfCUY5ssZwg#j)BW`>Vs%AmOO7IlWOvmbcv!LK zFOQv*KFFm-zQFU-p8|y?yHAZeb^L23hIQF58UFB(bMa=H_r&U^P(kUpjoa~vh<&oE z#LnEbLsT{-iw=%YPkOD;!E^|lph!$0@Tu=0rMM#OpaVo8@xx*4BY`SijtGLz-#F9% z!>c}0tX|8H80d}I0NUnIb$?hteK-NCWDb=x2%F-H&~Dp#iFK6r@7}%J=^3MkLlh_t zT8+wu|2$FP0m9Xp!sD{S?&X3bM1Wn7=vn511pz05@Ws}S0wbg@{8*^OmdqGAon_dO z3I_)V+V8_7HNN(g_#P@N5wLqq-rcWa;@-kH#EiUubGkW{D9&n^Y6t}d6{23t74iXj zRXy+;=A2gl$*{}!CDkG1K%}(DGaPk>s{4)lOb)Gx#6(OcLk9|EsuzZO@X%0g-%a@q zusVIkW(5{cc(f!c(+X=sE4Xb-l&KFFn|(G1({b2Gx@6vs*!b?6>fSO^F|VyBnmX4h z!s`p`5XYbg>SLj`F^Vf@*<_PTaB^{=zVzhtnfk7u%4P-k5-Eq&UWy-xLkn`}32|{8 z+}x#CdNPiV75C&$ln&dAIuH9g0Fp>&wr(9WhJAm z9QW#Ew^QBvAHoe(ymG!OkG)f)iRm%M zU|VR;Xr@CCnfR(czkI{jxk$1OAgciunxO$8^vuRMFd>cdiE{_)@7_iAff5T;_0!XC zlLy+uvYa00dl~Z{8GK$`dOv-~i`AN|mRSAeWn>0m2t1>bqqq0=($Zq~Ha91!H<}u6 zs(dQE_G-#tvq69(Cnp27UZk`lxaNnU$pNYeKSNpb?Iwhd>(`Sl{l-EUT%yv#9*}3;U?cKl7 zh)Ku{LJAAbf=*ugH6$45Nry>jiIyeN{<(*=645T60Ih(shNLfmI9oKQ)@gU*+G)2` zyEzc~Q+UYTHNP&*vuDbxs@}K9UBWS+LPNoWoyisovYx9!!NKv^9?4TZ1|9}M!F#tQ z;x}*JZ20+nDbO#U`dI%F3I?>IOwffE`36Y`4=d1AGg7i=L+lnL`w>rw8|SaMTpn zU#)i-vo3syr71F&%S1Pt=TKG3=vzjTFHVUcu~$>;^1i#4AdMlnLksHL9&UpgS{S&w z!HDd6lqG?PV!(&g77W3P2(UF@SR}EzXu3O}#p8BHMiSGKs!xcDl7IKEK$*Hn%Gd35 z!zyHPp{zY4c`*&aAc(E#pKNr*9kG*;0jg1Wed0`RZtSco=*TTZWQ=BTcy7%NCE zw%D;v`z5btVA5-4shE^X+1l1xt5p&oKMn#sE*_qYwDj4tCy=eT$C@I{$$MMTIRL_w z`MhCa2ksd#MaZkwtDVy|@^sENK3~>c{;7teqoYBJXJus-%(lHcS)YkkYid4eL*kc~ zlS>pQ#m2_ABk26*=|fg~emca58QKAZgpZ5ITsI!UMG}e4vN0;h4;bn-6L3dCs+75Dm~I{U*kfRB8$Jk& zx2p@e#{bln>&lZ+S_*)!M@TE3W_3g3niX5>-8D{WtR`T23|c-uCywqO7@%8UHLdoL zn2lw#S>SQ*e1UH6)RH#mPi6Vt$Iem zbPYi4!&1-1wt1mKWmNVesYP`zz#jqBj);&(;@=rb&}?{NdbiIrK!>-JN^ntru(`3* zxq2MDz_^^shzvEk#NjE3>MN_StfmV7Xq+7`PGBIOBYw75aH;BXeg6FUukxJ3&4qkY z4HMCgVSS-ljbhbeBrms1ohHlgV((--T}u0LaX5)a`uoFhrA7!mr@8wo_~+u1qsjCW36 zaUEcD%gnR+4}WG~v@KJEd+4>de_0pfTwGZ8qRS2>mDQRIyqUZC#=;FDiEihC~>0mbH0m$OQ4-e2(~UX(~|RY`+E6DP(`uDMtr7H=j*+Qv=3a zk0yv9?gBB);s%Nam?G8%Hd~*&Av^?x64?GBEx;gq1`l$6OA@0ijKGi{(PbwIl;i2z z1|UM_)$t(O6r^u*@50YM(op$18Ymi*0DXXYW_W<^N!F<9Hx1+48$kdEMh4UrVTsxW z;P)~)Cwc-7h54SYMt8 z=0XFGHZk#{i@;~DHWrQ3I4(Z?v@G+Uo7|{9jw%+x2K9v@$kJz)sD|XRK%_~Q#!7hV z1s9!5>FOs(iAs(B>9F~RZ^JJM3@AoELP1J8I;$=*?(_Xw_7R&kP#>$6YFHT>qT%D0 zyM#3Z`rxAH+C!S_f~R7r8t2Z z+LC2S(ipKFCefo`0XO9Z7hmmxi)ac8ifWrh*#r(Q4rVNPQ`1fDdY6EpAT&&^_J%45Wli0sA0xvZwuEyq&k6FTMvFVOq_n~Wk z{_d24&&AH}EnP_%pcMEnm;Cy}q`{%r;(#*9?;j;js?q5F`&()?I$VG}>6mpG{I| z%M>kJXpcep6fPT3z5e=C5|V|=_pWDMAP2{g0SYG#a-R+$r4=>MWMd1EXAUO zwYgf)D|_J2aE|Hi>wEd)YLh5*cz8Go$)KBHnzm}G1c<3n$H&JY8_V?Jt*)$mkx6w1 zLj}|}?VX)Eb&fBHD%?g*2y8NKnyvzeHqoqhf9~tdswo1gi)B@{eT^OOe_@WA1G}}$ zrS4$Z0Ie32G6VtzbEo<)lX6a6#KgV;(&yK&dt>4NIhHzbesVGs+Ym%qo8U}GM3fD9 z)!@Fk_ZeyfY2i5psX1$swg(g_vWm0A2%OcLCODT zf-Z;{aUfGsQczOWIYe7iP@wa;&L!OKEK51jLiF*~82=iVP+!M!UcJo#+%j;rg~?_x z8Cs@19)6|k-_ajA#1DJ{KS=YuB>tOc=DJw1uZ1N7h7AV;ZaKN3)MR#w2i~K!kj68uCsgQgxTX>*(LW0L9`54hOWN;mW_rq?O6A)AM>e9~7Tx;ra&s zRrk|p)h(uG31f30oTk3#G^L^*8(ej8(f@}&0C=Gj}TC#$JgQqIXb|=2k&{5%S@z?^M z8f4ftjXX(C`*v}IrH1i{|4zc>FBf&Mnu6+s6bnhs*&CSLtw${_t9HdbR1tG99F};Na_?m;0GdU%tH3tgf_%vcQtmxB8N|9vfJ)4!)n%*HHHKvnk zIahvG7NNWI+1=btoLEE#UV2K=;i(u%wW%x4H(?qYC#0HMP7Z^`3}6+CpDqu6WVgK4 zerj@Z;oS?6W&1x2Lb++-2elD(_5q_vB#fbA7UqjbLU5W_4r!?2wxMc*ZDQhV*XH!r zlh$M>uCUC)u%5E!zAP6=1_2Q#J>8rvQzT#4B)$k{f3E;Gsqci&{&KTV^ujhNBzV0~ zYIZ;F%Dn**==Y9_lVk7%y|01Xzxf&mrw0c1Y-^hY%J*PNt`VfrrWb|=CDtXS1Ce|#2Z9HFCS}6J@e-^x zfde}~l{O#{E09PGy33!Ed!or9$+0MvLmnsqQ$kBFl{2A-3*TA$gb|vQ$`8w4x6_FE z+tEw747U?2s^9s9`8u|0PMl3Fbn!sK6Oc z`WTx3h=MtU5|v1SK>$}CF;e`C0{mlC`il+x@5KT)S!xy%r3dJl#i*AMNFcBb7@HW0 ziiuU%Cr3ME;qXP9UW`t&LE+5RuI>yrLben*jOEfcVeJ{=4J!ohgY}aJ-7WzC5`!9R zJzqCIHnz68S?$?zA`wfjFphtn7IkL!0@8?LY^dnYtgN|sU3Ipfx4^fcHd=zgL;bGW zd){TyTTI39{c~Vr>CB>)*zS?HA}a(5hSOmK05&i+{r&wtAKEU2-9X*;StN8Ws8$Z} zVaTu=`*{xE#7R@QT}o1mQ$YX|48G+r8&>Q?wV(dgavUqicYJmPe}q)yxQ(h_1Ng;k zp+HfYaNqXjeoU^zdg)i6OG*yTzs&;9jzURJ zHiOx1^otBE5lAI~k2ipVZ)YfidTQaCas2B}U=k zAYcds7QW?eOFMd?)qaVol)b)YYt`AAqmR!+K|z6?{%SYjj7qgr7+?d@DqY=O%?Z+% zJ+^7bYU>BtpakNb$zi?~mK`i+{`la)i!C|ia;TxHDF-g=B(CQrCOs}1SD?5eN5so# zPXUjYUcaR~OAp^RX3iSh6W3!z*9YW8!QdVv^EWB7d)C4KgS#769Z%;LCGim5Jg}<7 z_O%we`&m1P;+S6FaD0uEoSbZ5+fY_^JQdl6i zWw<-xuNM5u>DCCFqoJhS>SJg^5ADdjyJ5Mj$5{YR47S5i(Wh!XM~Cw|BP)$vW=}6(ew&POd9=ftESiTz{T0BN~QVrq}Wm=(HA-B{EkWB65vf zkxWcX$AHBk5eu{2)fhTztg@PQK3?gFCK3HaW}u{`#QTqn1jFi`rnc2>lCq9>Mn*m| zG#A32(_uUR#SlAHd~a#f_0DbWX})ac&UTeAUy){4F4u7y`qrb~EloZ;-{!U0?p>%nzmJPyW*_`N-=1Uk~N~``Ym3 zz=6Ny3%b9_7dCmIRqQYMVx|@4aqoeD^N0T=4S}RW)x(IV*#%heKarI6U3X0~7NDI? z#D*rC2a<-Fwz0Q6$3{4LRcz|PY9R9K5$2TS{%-{%UGwD1(~x@Sjp5Gki&H?tzh}U) z0XE90d#zC?_M*5|;pVOMAmq(30cYc<-x>azR%y{^uEp~3CLlMgo+hhnfj>nBmah?on* z-qFPN3JM9X+jC|PU7VksAD<`RuB`3tSsHu;`p2?Rkl6FcPhnvVZl~l5Q}T;P=d(7E zxJ)CneW{e7z3cCm&JTm`R~qIP7K`qu-+uo5>C^Zd7(cmwbpEFg^zEas6m2{@zN)g` z*>7}YL?`3wq#K2VLMF{|;|zO0p`rSO7i$nIOIx(Dz6%H+S_eRf^Yiob^70Z3f9CgmuC&d$yXqo2L6wCr5H3ar?vJQ~2>9`dgBgT{|2B!3Rr~j?cm5Gc1o%a3zkhA2>ipa+ zqp8U;#l1xv86Hk{pt>=X%KuP##n5;*l00e}0ZM|YGDBD*fL&(QtAR%bAP5j(1BjQ~ zV308BwOqM(*&I;Vxr1s4HR?RmNSmSfG8(9lqZTW5W_lMLXkCE#!s*o=5o zTkxTmI5&U*d2oS=FvHq6~ zBb+_xu1U;(>G+VJ1G)h$h%VspUrD0_LgW<&MwPj!X1xVF2RXUu3~lAn^vv8 zNIjW-EpF%FllO@V5|ZSxd0)QBW-@7?SDPt}Dk>=f3Oo=2XQbrI^XJf1ac~AwfEdNV zSJhF_(NVz1zz~i5s@Z%nZ+s{k7RkuMO7iClZKi6LOO{FwZ5Q8K`*ownOTJ>_GZ-v( zASNcsc(qehohOsZHecsPL&-?V&F#_Fi9l!Z0uH_oaIwHx5YqaWwu7#K2h!=mw}eKX zMhrTQH*=|>OhWv$vGR! z^>S$!aEgT$+{M7SjS8??Ame$t$6D%^QqC8}Ul|#8$0HpF(u$jd8Gi83eLqlM`Z7iT z#2N6$;HLB0hQCV z_lQG>Xh21L51$7U)Rqh$IGBzrVq!2|zyinolmBPWuNOqhN=oJLe-VRpibhNU`|RWO zwL61c>CB9V!7BL6hT#ybu>V;+eh!g49IIWh$UI1)q-X3ahPhsB$tkqG$4-oF8rAzZ-9T2Cx$NN!V; z_i)x*Wjt<3)~-AoxdHl!FIWIohD(G<9?rg5uejO*H~bG9{?geTwHv9Z_nGQV=y^zxt(bV34el? z3%Ozl);=amlTq$A}^buB>vccr2-*=D$B(sNS9d ziaPW1DgaYw>yqdx#2q3!UY^#jtZN zTf@t3L6{8cmfh!1?w>5)ZsHhx`Uz~0w?}PA3}L>c&jk(zj+1~W2Gs8ChXMIc(!&3A zZ)6Unup0NqfzA=|qEh;T^`p_pmp@P+KpSeo_k(GiSb^B5HBgW&ZYE*lJkThWp4yTm zz|)_cm^nG21dA1j;P@I=?gj8fn7Ke3O6_`U->1bz1HXhXU&O}`r+^amkGf%WSrvK$ z5uh1ssE4Vx2Z-e9A_eeLu;9i#wvqh1I_uP1;Qbdw>92?R|4}~sqS!Cslh2+*Ae2Ek zCv>onhK;`=p1->^{+f5a8=wurw`BOf-UE=~^TVJeU@_OHlgDUD7=B;$3B*@+7#RPb zbUymYpdT%+|CpYCt`MHw0MN02HMjh6p=kWeRq`aJrv?In)qDJ20LXC4Te-B|M8K4L zMm3QGwpB%fU|W>KRxy+JDB?4r1d+dv`!<>6${C8jzCQ3$SN3JzSo=fS4MKtxQo~zhS+7xd--X!!Bk_XmDCA1ok68} zd$}43K!9>b?x(>e&=b=K+&f^BuB@$9n2#6LI&3-%NzGWPPz={@)|YhR`&@B-n5p9A z;(`lkt@7U6nW>k>BrgQ!Emv1pUm1}5h1W1cPr$HPY7v#Y``nTfS8Gn4uI=i(Pw}YFwxQXK${+5 zy4ITD0)XMh5Y(|oKY=YL0*{-Gg{Ax(G}z?Xvu9g-#s)-ud;$ur&Y(--xJ|S0 z1EU(F`|@v}A@cJqugva58jssayqd0p#Tbj}AP=CurC2g~?;j?b7gkb_KtRI9Mv*wk zE0_PKPzngd2|CSu>GW1T#zzx{*Ud#`5hX9L7f^ZSGI>;}z|(1x&Ej!w$$4r&?Uhu2Pcrgg zAwZzbOb)zn@yW?u~|=HHIwnZd83@C_#FCKjDaw!2 z;d40#cT>5;g#>^~!{>b3R2T2we4AUUl7ZZqIr+t+FnuCuY{jgs@w9TQl%NHJCaUs1 z`@3(d4BB;XsF=2ag9_x%f`a#>oig7@F8M=kfz1oho1Yo^=ykH?`_sAE$=Nml_7YyM zv0FXgTTs$g(N5+K8j z9~yJGZaJO;2G7^U?-{gVDHxRwU4xU0u6RVb%9LF}kpw(Oj7$|0z|kG`?&$QQoUwZ8 z^y=W?V5SQf4X51ww>d^C>*hG8_+%!mz1#dX;2%ov4rUKGhB8a%^#IiPm9q$37h8`+aPX~+wDf!> z#a+VhKgJl6UQhpAdb91eTKs;uAVimO=JR)(@a-olnOgISxz-DHg$`Y*)z(#&+_f(U zxTC4#aK8+CPhh9<@!ELO1ro4+lb>pkz3|P@g-XfVHodt1@{gn=uJ~rev>pW!ck7A7 zKk|(q8?YE{)@aH_B6|miCxwr(n|Jbi zx;+2@fDl4zji#)ujL1-eJK1u%A~QRWSuVEjZ;lNa?Ap`K0|4}OBB4-lC)>q!kd>8{ zi|Zg3$0Xt7<4hNih-;ZS3TcB0m)YN@e@{0O0MK`tnwhz{4svyKyC)Ew|2=)no*&Gu aocp7;CC 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 WMlxniY~Daa7(8A5T-G@yGywox7y-5b diff --git a/doc/salome/gui/GEOM/images/pipe2.png b/doc/salome/gui/GEOM/images/pipe2.png index 5dbf37736cfa6334ef94a3d28337ecdd011c15f4..a94f2934ff970bd553fe8dba5dc1ea8589bf367f 100755 GIT binary patch literal 20855 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 A4*&oF diff --git a/doc/salome/gui/GEOM/input/common_operation.doc b/doc/salome/gui/GEOM/input/common_operation.doc index b317eed99..804fcfafb 100644 --- a/doc/salome/gui/GEOM/input/common_operation.doc +++ b/doc/salome/gui/GEOM/input/common_operation.doc @@ -2,29 +2,38 @@ \page common_operation_page Common -To produce a \b Common operation in the Main Menu select Operations - > Boolean - > Common +\b Common operation cuts the common part of a list of shapes and transforms it into an independent geometrical object. -This operation cuts the common part of a list of shapes and transforms it into an independent geometrical object. - -The \b Result will be a \b GEOM_Object. - -TUI Command: geompy.MakeCommonList(theShapesList, checkSelfInte)\n -Arguments: Name + a list of shapes + an optional flag for self-intersection check.\n -Advanced option: -\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". +To produce it, select in the main menu Operations - > Boolean - > Common. \image html bool2.png "Common dialog" -\note This algorithm doesn't find all types of self-intersections. It is tuned +In this dialog: +- Input or accept the default \b Name of the resulting shape. +- Click the arrow button and select in the Object Browser or in the Viewer the Objects the common part which of should be found. +- Activate the corresponding check-box if you wish to Detect Self-intersections +- Activate \ref restore_presentation_parameters_page "Advanced options" if required. +- Press "Apply" or "Apply & Close" button to get the result (GEOM_Object). + + +\note This algorithm does not find all types of self-intersections. It is tuned to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face intersections. Face/face intersections detection is switched off as it is a time-consuming operation that gives an impact on performance. To find - all self-intersections please use \ref check_self_intersections_page + all self-intersections use \ref check_self_intersections_page "Detect Self-intersection tool". + + +This operation can be performed using a TUI Command: -For a particular case with two shapes for the Common operation there is the following TUI command: +geompy.MakeCommonList(theShapesList, checkSelfInte) + +Arguments: Name + a list of shapes + an optional flag for self-intersection check. + +There is also a special TUI Command for the Common operation on two shapes : + +geompy.MakeCommon(s1, s2, checkSelfInte) -TUI Command: geompy.MakeCommon(s1, s2, checkSelfInte)\n Arguments: Name + 2 shapes + an optional flag for self-intersection check. Example: @@ -38,8 +47,7 @@ Our TUI Scripts provide you with useful examples of the use of More details -For a detailed description of the Boolean operations please refer to -this document. +Please, refer to this document for a detailed description of Boolean operations. It provides a general review of the Partition and Boolean operations algorithms, describes the usage methodology and highlights major limitations of these operations. diff --git a/doc/salome/gui/GEOM/input/creating_isoline.doc b/doc/salome/gui/GEOM/input/creating_isoline.doc index 2aac337f1..c69418547 100644 --- a/doc/salome/gui/GEOM/input/creating_isoline.doc +++ b/doc/salome/gui/GEOM/input/creating_isoline.doc @@ -2,21 +2,30 @@ \page create_isoline_page Isoline -To create an \b Isoline in the Main Menu select New Entity - > -Basic - > Isoline +\b Isoline is a 3D curve built on a bounded face limited by [Umin, Umax] and [Vmin, Vmax] +values of U and V parameters. For all points of the isoline U or V parameter value is constant. -\n The \b Result of this operation will be a GEOM_Object. -It may be either an edge or a compound of several edges. - -\n You can define an Isoline by a \b Face, \b Type and \b Parameter. -\n TUI Command: geompy.MakeIsoline(theFace, IsUIsoline, theParameter) -\n Arguments: Name + Face + Type (True for U-Isoline; False for V-Isoline) + Parameter. +To create an \b Isoline of a face in the Main Menu select New Entity - > Basic - > Isoline. \image html isoline1.png +In this dialog: +- Input or accept the default \b Name of the resulting shape. +- Click the arrow button and select in the Object Browser or in the Viewer the \b Face, for which the Isoline is built. +- Select along which coordinate: \b U-Isoline or \b V-Isoline the Isoline is built; +- Set \b Parameter (ranging from 0 to 1), which defines the proportion, at which a face is divided by the isoline. +If Parameter=0.5, the isoline is a median. +- Press "Apply" or "Apply & Close" button to get the result (an edge or a compound of several edges). + +This operation can be performed using a TUI Command: + +geompy.MakeIsoline(theFace, IsUIsoline, theParameter) + +Arguments: Name + Face + Type (True for U-Isoline; False for V-Isoline) + Parameter. + Example: -\image html isoline2.png "Isoline on face" +\image html isoline2.png "Isoline on a rectangle face" Our TUI Scripts provide you with useful examples of creation of \ref tui_creation_curve "Basic Geometric Objects". diff --git a/doc/salome/gui/GEOM/input/creating_smoothingsurface.doc b/doc/salome/gui/GEOM/input/creating_smoothingsurface.doc index 5f899eef4..a4b42cee3 100644 --- a/doc/salome/gui/GEOM/input/creating_smoothingsurface.doc +++ b/doc/salome/gui/GEOM/input/creating_smoothingsurface.doc @@ -1,18 +1,15 @@ /*! -\page create_smoothingsurface_page SmoothingSurface +\page create_smoothingsurface_page Smoothing Surface -To create a \b SmoothingSurface in the Main Menu select New Entity - > +To create a Smoothing Surface in the Main Menu select New Entity - > Advanced - > SmoothingSurface -Specify the parameters of the SmoothingSurface object creation in the opened dialog -box and press "Apply" or "Apply & Close" button. -Result of each operation will be a GEOM_Object. +Specify the \b Name of the surface and the list of \b Points, from which it is approximated and press "Apply" or "Apply & Close" button. -TUI Command: geompy.MakeSmoothingSurface(lPoints) +The result of the operation will be a GEOM_Object(Surface). -Arguments: -- \b Points - list of points +TUI Command: geompy.MakeSmoothingSurface(Points) \image html smoothingsurface_dlg.png diff --git a/doc/salome/gui/GEOM/input/cut_operation.doc b/doc/salome/gui/GEOM/input/cut_operation.doc index f4050a318..30235d6de 100644 --- a/doc/salome/gui/GEOM/input/cut_operation.doc +++ b/doc/salome/gui/GEOM/input/cut_operation.doc @@ -2,29 +2,37 @@ \page cut_operation_page Cut -To produce a \b Cut operation in the Main Menu select Operations - > Boolean - > Cut +\b Cut operation cuts a shape with a list of other shapes. -This operation cuts a shape with a list of other shapes. - -The \b Result will be a \b GEOM_Object. - -TUI Command: geompy.MakeCutList(theMainShape, theShapesList, checkSelfInte)\n -Arguments: Name + a main shape + a list of other shapes + an optional flag for self-intersection check.\n -Advanced option: -\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". +To produce it, select in the main menu Operations - > Boolean - > Cut \image html bool3.png "Cut dialog" -\note This algorithm doesn't find all types of self-intersections. It is tuned +In this dialog: +- Input or accept the default \b Name of the resulting shape. +- Click the arrow button and select in the Object Browser or in the Viewer the Main Object, which will be cut by tool objects. +- Select the Tool objects, which will cut the main object. +- Activate the corresponding check-box if you wish to Detect Self-intersections . +- Activate \ref restore_presentation_parameters_page "Advanced options" if required. +- Press "Apply" or "Apply & Close" button to get the result (GEOM_Object). + +\note This algorithm does not find all types of self-intersections. It is tuned to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face intersections. Face/face intersections detection is switched off as it is a time-consuming operation that gives an impact on performance. To find - all self-intersections please use \ref check_self_intersections_page + all self-intersections use \ref check_self_intersections_page "Detect Self-intersection tool". -For a particular case with two shapes (object and tool) for the Cut operation there is the following TUI command: +This operation can be performed using a TUI Command: + +geompy.MakeCutList(theMainShape, theShapesList, checkSelfInte) + +Arguments: Name + a main shape + a list of other shapes + an optional flag for self-intersection check. + +There is also a special TUI Command: for the Cut operation on two shapes (object and tool) : + +geompy.MakeCut(s1, s2, checkSelfInte) -TUI Command: geompy.MakeCut(s1, s2, checkSelfInte)\n Arguments: Name + the object + the tool + an optional flag for self-intersection check. Example: @@ -38,8 +46,7 @@ Our TUI Scripts provide you with useful examples of the use of More details -For a detailed description of the Boolean operations please refer to -this document. +Please refer to this document for a detailed description of Boolean operations. It provides a general review of the Partition and Boolean operations algorithms, describes the usage methodology and highlights major limitations of these operations. diff --git a/doc/salome/gui/GEOM/input/fuse_operation.doc b/doc/salome/gui/GEOM/input/fuse_operation.doc index a2779fb00..95dc6ce06 100644 --- a/doc/salome/gui/GEOM/input/fuse_operation.doc +++ b/doc/salome/gui/GEOM/input/fuse_operation.doc @@ -2,30 +2,36 @@ \page fuse_operation_page Fuse -To produce a \b Fuse operation in the Main Menu select -Operations - > Boolean - > Fuse. +\b Fuse operation creates one shape from a list of shapes. -This operation creates one shape from a list of shapes. - -The \b Result will be a \b GEOM_Object. - -TUI Command: geompy.MakeFuseList(theShapesList, checkSelfInte)\n -Arguments: Name + a list of shapes + an optional flag for self-intersection check.\n -Advanced option: -\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". +To produce it, select in the Main Menu Operations - > Boolean - > Fuse. \image html bool1.png "Fuse dialog" -\note This algorithm doesn't find all types of self-intersections. It is tuned +In this dialog: +- Input or accept the default \b Name of the resulting shape. +- Click the arrow button and select in the Object Browser or in the Viewer the Objects to be fused. +- Activate the corresponding check-box if you wish to Detect Self-intersections . +- Activate \ref restore_presentation_parameters_page "Advanced options" if required. +- Press "Apply" or "Apply & Close" button to get the result (GEOM_Object). + +\note This algorithm does not find all types of self-intersections. It is tuned to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face intersections. Face/face intersections detection is switched off as it is a time-consuming operation that gives an impact on performance. To find - all self-intersections please use \ref check_self_intersections_page + all self-intersections use \ref check_self_intersections_page "Detect Self-intersection tool". + +This operation can be performed using a TUI Command: -For a particular case with two shapes to be fused there is the following TUI command: +geompy.MakeFuseList(theShapesList, checkSelfInte) + +Arguments: Name + a list of shapes + an optional flag for self-intersection check. + +There is also a special TUI Command for \b Fuse operation on two shapes : + +geompy.MakeFuse(s1, s2, checkSelfInte) -TUI Command: geompy.MakeFuse(s1, s2, checkSelfInte)\n Arguments: Name + 2 shapes + an optional flag for self-intersection check. Example: @@ -38,13 +44,13 @@ Our TUI Scripts provide you with useful examples of the use of \ref tui_fuse "Boolean Operations". More details -

    -
  • For a detailed description of the Boolean operations please refer to -this document. + +Please, refer to this document for a detailed description of Boolean operations. + It provides a general review of the Partition and Boolean operations algorithms, describes the usage methodology and highlights -major limitations of these operations.
  • -
  • Perhaps you also ask yourself : \ref partition_explanation "What is the difference between partition, compounds and fuse operation ?"
  • -
+major limitations of these operations. + +Perhaps you also ask yourself : \ref partition_explanation "What is the difference between partition, compounds and fuse operation ?" */ diff --git a/doc/salome/gui/GEOM/input/geometry_preferences.doc b/doc/salome/gui/GEOM/input/geometry_preferences.doc index 81090266a..bfce50129 100644 --- a/doc/salome/gui/GEOM/input/geometry_preferences.doc +++ b/doc/salome/gui/GEOM/input/geometry_preferences.doc @@ -44,32 +44,32 @@ predefined materials.
  • Isolines width - allows to define default width of the isolines.
  • Preview edges width - allows to define width of the edges for preview.
  • Measures line width - allows to define lines width of measurements tools.
  • -
  • Automatic bring to front - when option is ON: the objects selected by the user will be automatically -made "top-level".
  • +
  • Automatic bring to front - when the option is on, the objects selected by the user automatically become "top-level".
    • -
    • Number of isolines
    • - this submenu allows to specify the -number of isolines along the axes of coordinates: -
        -
      • Along U -
      • Along V -
      +
    • Number of isolines - allows to specify the number of isolines along Along U and Along V coordinate axes. They are shown on each selected face. For example: + +\image html isos.png + +This preference is not related with Create Isoline operation. +By default Along U and Along V are null and isolines are not drawn.
    • +
    • Input fields precision
      • -
      • Length precision - allows to ajust input precision of coordinates and dimensions.
      • -
      • Angular precision - allows to ajust input precision of angles.
      • -
      • Length tolerance precision - allows to ajust input precision of tolerance of coordinates and dimensions.
      • -
      • Angular tolerance precision - allows to ajust input precision of tolerance of angles.
      • -
      • Weight precision - allows to ajust input precision of weight and mass.
      • -
      • Density precision - allows to ajust input precision of density.
      • -
      • Parametric precision - allows to ajust input precision of parametric values.
      • -
      • Parametric tolerance precision - allows to ajust input precision of tolerance in parametric space.
      • +
      • Length precision - allows to adjust input precision of coordinates and dimensions.
      • +
      • Angular precision - allows to adjust input precision of angles.
      • +
      • Length tolerance precision - allows to adjust input precision of tolerance of coordinates and dimensions.
      • +
      • Angular tolerance precision - allows to adjust input precision of tolerance of angles.
      • +
      • Weight precision - allows to adjust input precision of weight and mass.
      • +
      • Density precision - allows to a just input precision of density.
      • +
      • Parametric precision - allows to adjust input precision of parametric values.
      • +
      • Parametric tolerance precision - allows to adjust input precision of tolerance in parametric space.
    diff --git a/doc/salome/gui/GEOM/input/import_export.doc b/doc/salome/gui/GEOM/input/import_export.doc index 775be618f..ccc5c6a7e 100644 --- a/doc/salome/gui/GEOM/input/import_export.doc +++ b/doc/salome/gui/GEOM/input/import_export.doc @@ -8,6 +8,8 @@ are implemented via plug-ins, which gives the opportunity to expand the range of available formats by adding more plug-ins (for example, CATIA 5). +The \subpage xao_format_page "import and export of shapes in XAO format" is implemented differently. + To import geometrical objects from a BREP, IGES, STEP, ACIS or STL file: \par diff --git a/doc/salome/gui/GEOM/input/index.doc b/doc/salome/gui/GEOM/input/index.doc index 7a9035091..00c1bf700 100644 --- a/doc/salome/gui/GEOM/input/index.doc +++ b/doc/salome/gui/GEOM/input/index.doc @@ -14,17 +14,14 @@ - \subpage transform_geom_obj_page "transformation of geometrical objects" using various algorithms; - \subpage repairing_operations_page "optimization of geometrical objects"; -- viewing \subpage geometrical_obj_prop_page "geometrical object properties" - and other information about geometrical objects using +- viewing information about geometrical objects using \subpage using_measurement_tools_page "measurement tools"; - \subpage pictures_page "designing shapes from pictures"; -- easily setting parameters via the variables predefined in + +It is possible to easily set parameters via the variables predefined in \subpage using_notebook_geom_page "SALOME notebook". - -The possibility to classify the created geometrical objects by moving it into early created container (folder) is detailed on -\subpage arranging_study_objects_page section. - -XAO format describing a shape with its topology, groups and fields is detailed on \subpage xao_format_page section. +Also, there is a possibility to customize an +\subpage arranging_study_objects_page "arrangement of the geometrical objects in the SALOME study". Geometry module preferences are described in the \subpage geometry_preferences_page section of SALOME Geometry Help. diff --git a/doc/salome/gui/GEOM/input/material.doc b/doc/salome/gui/GEOM/input/material.doc index 59a022351..d67becaaa 100644 --- a/doc/salome/gui/GEOM/input/material.doc +++ b/doc/salome/gui/GEOM/input/material.doc @@ -1,6 +1,6 @@ /*! -\page material_page Material properties +\page material_page Material
    • \ref material_general_description_anchor "General Description"
    • @@ -16,12 +16,11 @@ be changed in the future versions of SALOME Geometry module. You can change the material properties of the selected shape(s) in -the dedicated dialog box. This dialog box can be invoked from the -context popup menu. The layout of context menu can be customized via +the context menu dialog. The layout of context menu can be customized via "Show predefined materials in popup menu" preferences option. If this option is switched off, only "Material properties" item will be shown in the popup menu. If this option is on (by default), "Material -properties" item in the popup menu will open a submenu with list of predefined +properties" item in the popup menu will open a sub-menu with a list of predefined materials: \image html hide_predef_material.png @@ -44,9 +43,9 @@ the materials is different: - shape presentation in OCC and VTK viewers is not fully identical; - some material attributes can affect the presentation in a different way. -\anchor material_opengl_model_anchor

      OpenGL ligthing model

      +\anchor material_opengl_model_anchor

      OpenGL lighting model

      -The material is specifed by several attributes of the lighting +The material is specified by several attributes of the lighting model. More details can be found in the documentation related to the OpenGL programming, for example, here: http://www.glprogramming.com/red/chapter05.html. @@ -54,7 +53,7 @@ In the OpenGL lighting model, the light in a scene comes from several light sources; the light sources have an effect only when there are surfaces that absorb and reflect light. Each surface is assumed to be composed of a material with various properties. A material might emit -its own light (like headlights on an automobile), it might scatter +its own light (like headlights of a vehicle), it might scatter some incoming light in all directions, and it might reflect a portion of the incoming light in a preferential direction like a mirror or other shiny surface. @@ -120,7 +119,7 @@ predefined and custom. models are specified by the user and can be modified at any moment. -
    • The widgets to the right allow modifyng different properties of the material model: +
    • The widgets to the right allow modifying different properties of the material model: - \b Ambient color and coefficient (floating point value between 0 and 1) - \b Diffuse color and coefficient (floating point value between 0 and 1) - \b Specular color and coefficient (floating point value between 0 and 1) @@ -143,7 +142,7 @@ to change the name of material model.
    • \image html material.png In addition to the functionality of Materials library, this -dialog provides objects selection mechanizm and \b Color property. +dialog provides objects selection mechanism and \b Color property. If the material model is specified as a \em physical (\em Gold, for example), the shape color (more precisely its \em ambient color) @@ -151,7 +150,7 @@ cannot be modified. If you assign a physical material model to the shape, the "Color" menu item will not be available in the popup menu. If the model is non-physical (\em artificial), the color can be changed -to any appopriate one, only other attributes will be constant. In the +to any appropriate one, only other attributes will be constant. In the dialog box you will be able to modify the color of the shape via the "Color" button. "Ambient color" button will be disabled to signalize that this attribute of the model is ignored. Also, it will be possible diff --git a/doc/salome/gui/GEOM/input/partition.doc b/doc/salome/gui/GEOM/input/partition.doc index 13b09a791..30ac52bbe 100644 --- a/doc/salome/gui/GEOM/input/partition.doc +++ b/doc/salome/gui/GEOM/input/partition.doc @@ -2,15 +2,11 @@ \page partition_page Partition -
        -
      • For a detailed description of the Partition operation please refer to -this document. -It provides a general review of the Partition and Boolean -operations algorithms, describes the usage methodology and highlights -major limitations of these operations.
      • - -
      • Perhaps you also ask yourself : \ref partition_explanation "What's the difference between partition, compounds and fuse operation ?"
      • -
      +For a detailed description of the Partition operation please refer to this document. +It provides a general review of the Partition and Boolean operations algorithms, describes the usage methodology and highlights +major limitations of these operations. + +Perhaps you also ask yourself : \ref partition_explanation "What's the difference between partition, compounds and fuse operation ?" To produce a \b Partition in the Main Menu select Operations - > Partition @@ -28,7 +24,7 @@ Resulting Type of shape. As far as the intersection of two objects can produce any type of geometrical objects, Resulting type box allows choosing the -preferrable result, i.e. a solid, a shell, a list of faces, etc. +preferable result, i.e. a solid, a shell, a list of faces, etc. The Resulting type has to be equal or lower than the type of the \em Objects. In other words, if the \em Objects don't contain any @@ -47,28 +43,27 @@ face (there will be a hole in the resulting face, where the original face intersects with the box, see the corresponding \ref partition_picture_3 "picture" below). No sub-shapes intersection (Compounds only) check box affects -only input shapes of the Compound type. If this option is switched off (default -behavior) each input compound will be automatically exploded into -sub-shapes and the intersection between these shapes will be also -computed. If this option is switched on, the intersection between -sub-shapes will not be performed. In this case the Partition algorithm -will work faster, but the result might differ from the default behavior. +only input shapes of the Compound type. +- If this option is switched off (default behavior) each input compound will be automatically +exploded into sub-shapes and the intersection between these shapes will be also computed. +- If this option is switched on, the intersection between sub-shapes will not be performed. +In this case the Partition algorithm will work faster, but the result might differ from the +default behavior. -Detect Self-intersections check box is used to check arguments -self-intersections. If this option is switched on (default behavior) -each input shape is checked for self-intersection. In case of its detection -the operation is aborted. If this option is switched off, the partition -algorithm is performed without self-intersection checks. +Detect Self-intersections check box is used to check self-intersection of arguments. +- If this option is switched on (by default), each input shape is checked for self-intersection. +If self-intersection is detected, the operation is aborted. +- If this option is switched off, the partition algorithm is performed without self-intersection +checks. -\note This algorithm doesn't find all types of self-intersections. It is tuned +\note This algorithm does not find all types of self-intersections. It is tuned to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face intersections. Face/face intersections detection is switched off as it is a time-consuming operation that gives an impact on performance. To find all self-intersections please use \ref check_self_intersections_page "Detect Self-intersection tool". - Advanced option: - \ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". +- Activate \ref restore_presentation_parameters_page "Advanced options" if required. \note Partition is a complex operation, so its result of it depends on the quality of the initial shapes. Sometimes, if partition fails, @@ -95,7 +90,7 @@ Here, - \em Limit is a Type of resulting shapes - \em KeepNonlimitShapes is a flag that allows to preserve standalone shapes of low dimension (than \em Limit) in the result. -- \em checkSelfInte is a flag that tells if the arguments should +- \em checkSelfInte is a flag that indicates if the arguments should be checked for self-intersection prior to the operation. - Other parameters are obsolete and kept only for compatibility with previous versions of SALOME. @@ -106,15 +101,14 @@ previous versions of SALOME. Arguments: Name + 1 shape to be intersected + 1 cutting plane. -Advanced option: -\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". +Activate \ref restore_presentation_parameters_page "Advanced options" if required. TUI Command: geompy.MakeHalfPartition(Shape, Plane, checkSelfInte), where: - \em Shape is a source shape to be intersected by the \em Plane - \em Plane is a tool shape, to intersect the \em Shape. -- \em checkSelfInte is a flag that tells if the arguments should +- \em checkSelfInte is a flag that indicates if the arguments should be checked for self-intersection prior to the operation. Examples: diff --git a/doc/salome/gui/GEOM/input/remove_webs_operation.doc b/doc/salome/gui/GEOM/input/remove_webs_operation.doc index 8c91ae20b..26ab2efb1 100644 --- a/doc/salome/gui/GEOM/input/remove_webs_operation.doc +++ b/doc/salome/gui/GEOM/input/remove_webs_operation.doc @@ -6,7 +6,7 @@ Repair - > Remove internal faces. \n This operation removes all shared faces from a compound to obtain -one or more bigger solids from the set of smaller solids. +one or more bigger solids from a set of smaller solids. \image html remove_webs.png @@ -15,8 +15,8 @@ one or more bigger solids from the set of smaller solids. \ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". \note Only shared faces will be removed. Coincident but not shared -faces will stay as is, use GlueFaces or MakePartition before -RemoveInternalFaces if you need to remove them. +faces will stay as is, use Glue Faces or Partition before +Remove Internal Faces if you need to remove them. \n TUI Command: geompy.RemoveInternalFaces(theCompound), where theCompound is a compound of solids. diff --git a/doc/salome/gui/GEOM/input/repairing_operations.doc b/doc/salome/gui/GEOM/input/repairing_operations.doc index 4cbb1ed1b..d0559d764 100644 --- a/doc/salome/gui/GEOM/input/repairing_operations.doc +++ b/doc/salome/gui/GEOM/input/repairing_operations.doc @@ -26,15 +26,15 @@ splits an edge in two.
    • \subpage change_orientation_operation_page "Change orientation" - reverses the normals of the selected faces.
    • \subpage remove_webs_operation_page "Remove internal faces" - -rebuilds the topology of a compound of solids by removing of the faces -that are shared by several solids.
    • +rebuilds the topology of a compound of solids by removing the faces +are shared by several solids.
    • \subpage remove_extra_edges_operation_page "Remove extra edges" - removes seam and degenerated edges from the given shape.
    • \subpage fuse_edges_operation_page "Fuse Collinear Edges within a Wire" - removes selected vertices from a given wire in case if adjacent edges are C1 continuous.
    • \subpage union_faces_operation_page "Union faces" - -unites all faces sharing one surface on a given shape.
    • +unites on a given shape all faces sharing the same surface.
    */ diff --git a/doc/salome/gui/GEOM/input/section_operation.doc b/doc/salome/gui/GEOM/input/section_operation.doc index b5909be83..0b741eed4 100644 --- a/doc/salome/gui/GEOM/input/section_operation.doc +++ b/doc/salome/gui/GEOM/input/section_operation.doc @@ -2,26 +2,31 @@ \page section_opeartion_page Section -To produce a \b Section operation in the Main Menu select -Operations - > Boolean - > Section +\b Section operation creates an edge or a wire representing the intersection of surfaces of two shapes. -This operation creates the section between 2 shapes. - -The \b Result will be any \b GEOM_Object (EDGE or WIRE). - -TUI Command: geompy.MakeSection(s1, s2, checkSelfInte)\n -Arguments: Name + 2 shapes + an optional flag for self-intersection check.\n -Advanced option: -\ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". +To produce it, select in the main menu Operations - > Boolean - > Section \image html neo-section.png "Section dialog" -\note This algorithm doesn't find all types of self-intersections. It is tuned +In this dialog: +- Input or accept the default \b Name of the resulting shape. +- Click the arrow button and select in the Object Browser or in the Viewer the intersecting Objects. +- Activate the corresponding check-box if you wish to Detect Self-intersections . +- Activate \ref restore_presentation_parameters_page "Advanced options" if required. +- Press "Apply" or "Apply & Close" button to get the result (EDGE or WIRE). + +\note This algorithm does not find all types of self-intersections. It is tuned to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face intersections. Face/face intersections detection is switched off as it is a time-consuming operation that gives an impact on performance. To find - all self-intersections please use \ref check_self_intersections_page + all self-intersections use \ref check_self_intersections_page "Detect Self-intersection tool". + +This operation can be performed using a TUI Command: + +geompy.MakeSection(s1, s2, checkSelfInte) + +Arguments: Name + 2 shapes + an optional flag for self-intersection check. Example: @@ -34,8 +39,7 @@ Our TUI Scripts provide you with useful examples of the use of More details -For a detailed description of the Boolean operations please refer to -this document. +Please refer to this document for a detailed description of Boolean operations. It provides a general review of the Partition and Boolean operations algorithms, describes the usage methodology and highlights major limitations of these operations. diff --git a/doc/salome/gui/GEOM/input/sewing_operation.doc b/doc/salome/gui/GEOM/input/sewing_operation.doc index 2af3989cd..18d95e881 100644 --- a/doc/salome/gui/GEOM/input/sewing_operation.doc +++ b/doc/salome/gui/GEOM/input/sewing_operation.doc @@ -2,26 +2,28 @@ \page sewing_operation_page Sewing -\n To produce a \b Sewing operation in the Main Menu select Repair - > Sewing. +To produce a \b Sewing operation in the Main Menu select Repair - > Sewing. -\n It is possible to sew only compounds of faces or shells. - -\n The \b Result will be a \b GEOM_Object. - -\n TUI Command: geompy.MakeSewing(ListOfShape, Precision, AllowNonManifold=False), - where \em ListOfShape is list of faces or shells to be sewed, \em Precision is a -precision for sewing, \em AllowNonManifold flag that allows non-manifold sewing. +The \b Result will be a \b GEOM_Object. \image html repair6.png -\n Arguments: Name + 1 or more shapes + 1 value (sew -precision). -\n \b Detect button allows to display the number of free boundaries in -your shape: +In this dialog: +- Click on the "Arrow" button and select in the Object Browser or in the viewer one or more \b Shapes (faces or shells) to be sewn. +- Activate Allow Non Manifold check-box to produce non-manifold sewing, if required. +- Define precision for sewing in \b Tolerance field. +- Activate Detect Free boundaries button to display the number of free boundaries in the shape: +\image html neo-detect2.png +- Click \b Apply or Apply and Close button. -\image html neo-detect2.png +This operation can be also launched using a TUI Command: -\n Example: +geompy.MakeSewing(ListOfShape, Precision, AllowNonManifold=False), + +where \em ListOfShape is a list of faces or shells to be sewn, \em Precision is a +precision for sewing, \em AllowNonManifold is a flag that allows non-manifold sewing. + +Example: \image html image112.png "The initial faces" diff --git a/doc/salome/gui/GEOM/input/union_faces_operation.doc b/doc/salome/gui/GEOM/input/union_faces_operation.doc index 65cbd4307..802f2213e 100755 --- a/doc/salome/gui/GEOM/input/union_faces_operation.doc +++ b/doc/salome/gui/GEOM/input/union_faces_operation.doc @@ -2,20 +2,21 @@ \page union_faces_operation_page Union Faces -\n To Union Faces in the Main Menu select -Repair - > Union Faces. -\n This operation unites all faces sharing one surface on a given -shape. +This operation unites on a given shape all faces sharing the same surface. -\n TUI Command: geompy.UnionFaces(theShape), -where theShape is a compound or a single solid. -\n Arguments: Name + one shape + a flag. -\n Advanced option: - \ref restore_presentation_parameters_page "Set presentation parameters and sub-shapes from arguments". +To Union Faces in the Main Menu select Repair - > Union Faces. \image html union_faces.png -\n Example: +In this dialog: +- Click on the "Arrow" button and select in the Object Browser or in the viewer one or more \b Shapes (compounds or single solids). +- If necessary, activate \ref restore_presentation_parameters_page "Advanced Transformation Options". +- Click \b Apply or Apply and Close button. + +This operation can be also launched using a TUI Command: geompy.UnionFaces(theShape), +where theShape is a compound or a single solid. + +Example: \image html union_faces1.png
    Shape with not united faces
    diff --git a/doc/salome/gui/GEOM/input/using_boolean_operations.doc b/doc/salome/gui/GEOM/input/using_boolean_operations.doc index 26b90020e..74acd1e8b 100644 --- a/doc/salome/gui/GEOM/input/using_boolean_operations.doc +++ b/doc/salome/gui/GEOM/input/using_boolean_operations.doc @@ -2,10 +2,10 @@ \page using_boolean_operations_page Boolean Operations -For detail description of the Boolean operations please refer to +For a detailed description of Boolean operations refer to this document. It provides a general review of the Partition and Boolean -operations algorithms, describes the usage methodology and highlighs +operations algorithms, describes the usage methodology and highlights major limitations of these operations. You can use the following boolean operations for construction of more @@ -44,7 +44,7 @@ operation. \par geompy.MakeBoolean(Shape1, Shape2, Operation, checkSelfInte), where \em Shape1 is the first argument and \em Shape2 is the second argument of -Boolean operation, \em Operation is a type of the Boolean operation (1 +a Boolean operation, \em Operation is the type of a Boolean operation (1 — Common, 2 — Cut, 3 — Fuse, 4 — Section). @@ -60,17 +60,17 @@ argument and \em Shape2 is the second argument of Common operation; geompy.MakeCut(Shape1, Shape2, checkSelfInte), where \em Shape1 is the first argument and \em Shape2 is the second argument of Cut operation; -The flag \em checkSelfInte tells whether arguments should be checked for -self-intersection prior to an operation. Its default value is \em False which +The flag \em checkSelfInte indicates whether the arguments should be checked for +self-intersection prior to an operation. Its default value is \em False, which means that there is no need to check it. This option is provided to ensure that -an operation is performed on not self-intersected shapes as these shapes are +an operation is performed on not self-intersected shapes as they are not valid for boolean operations. -\note This algorithm doesn't find all types of self-intersections. It is tuned +\note This algorithm does not find all types of self-intersections. It is tuned to detect vertex/vertex, vertex/edge, edge/edge, vertex/face and edge/face intersections. Face/face intersections detection is switched off as it is a time-consuming operation that gives an impact on performance. To find - all self-intersections please use \ref check_self_intersections_page + all self-intersections use \ref check_self_intersections_page "Detect Self-intersection tool". Our TUI Scripts provide you with useful examples of the use of diff --git a/doc/salome/gui/GEOM/input/using_measurement_tools.doc b/doc/salome/gui/GEOM/input/using_measurement_tools.doc index 513f6077f..238b12a08 100644 --- a/doc/salome/gui/GEOM/input/using_measurement_tools.doc +++ b/doc/salome/gui/GEOM/input/using_measurement_tools.doc @@ -1,9 +1,10 @@ /*! -\page using_measurement_tools_page Measuring objects properties +\page using_measurement_tools_page Object properties -\n Measurement tools in GEOM are necessary for getting different data -concerning created or imported geometrical objects : +\n The key property of an object is its \subpage geometrical_obj_prop_page "Geometrical Type" + +\n There are also various Measurement tools for getting data about created or imported geometrical objects :
    • \subpage point_coordinates_page "Point coordinates"
    • diff --git a/doc/salome/gui/GEOM/input/viewing_geom_obj.doc b/doc/salome/gui/GEOM/input/viewing_geom_obj.doc index a5882fcfb..774dbaac2 100644 --- a/doc/salome/gui/GEOM/input/viewing_geom_obj.doc +++ b/doc/salome/gui/GEOM/input/viewing_geom_obj.doc @@ -101,10 +101,9 @@ and then displays only the children of the selected object(s). Switch the checkbox near the appropriate object and click Publish or Publish And Close button. - "Eye" icons in this dialog box allow previewing unpublished objects in the viewer. All - unpublished objects are by default sorted by the name in ascending order. It is possible - to change order of sorting (ascending / descending) by clicking the corresponding title - bar of the objects list. + "Eye" icons in this dialog box allow previewing unpublished objects in the viewer. By default all + unpublished objects are sorted by name in ascending order. It is possible + to change the order (ascending / descending) by clicking the corresponding title bar of the objects list.
    @@ -115,8 +114,7 @@ window providing some information on a selected geometric object: - Creation operation shows a name of the operation used to create the selected object. -- In a table under Creation operation, \b Parameter and \b -Value are a name and a value of a parameter used to create the -selected object. +- The table below lists \b Parameters used to create the +selected object and their \b Values. */ diff --git a/doc/salome/gui/GEOM/input/xao_format.doc b/doc/salome/gui/GEOM/input/xao_format.doc index b5c60a92d..00d810973 100644 --- a/doc/salome/gui/GEOM/input/xao_format.doc +++ b/doc/salome/gui/GEOM/input/xao_format.doc @@ -1,10 +1,24 @@ /*! -\page xao_format_page The XAO format +\page xao_format_page Import and export of shapes in XAO format XAO is a file format which describes a shape with its topology, groups and fields. -- \subpage export_xao_page "Export" -- \subpage import_xao_page "Import" +To import a shape in the \b XAO format, in the Main Menu select New Entity -> +Import / Export -> Import XAO. + +To export a shape in the \b XAO format, in the Main Menu select New Entity -> +Import / Export -> Export XAO. + +\image html exportxao_dlg.png + +In this dialog: +- Click the arrow button and select in the Object Browser or in the Viewer the Shape to be exported. +- Input the File name to create a new file or click browse button to save in an existing file. +- Select the \b Groups of the chosen shape to be exported. +- Select the \b Fields of the chosen shape to be exported. +- Press "Apply" or "Apply & Close" button to get the result. + +It also possible to export a shape using the TUI Command: geompy.MakeExportXAO(Shape, FileName, Groups, Fields) */ diff --git a/resources/pipesections.png b/resources/pipesections.png index 410282221cc8a833516d8362b49cf3cdfba269c7..5e384ce3008ce1499881a20c597cb1ecb6ce86ca 100644 GIT binary patch delta 791 zcmV+y1L*wM2HXaaQhy8#1~4siM&aB500QYrL_t(I%dM16Xw+yJ$A3u%RAz9!jE#rA zR1dYqIx51_gD%$MDxxbbR)kU!JQNg)!d6jN*xMfbM#P(!mDXLq@B;<0ju*v)RyaJC$d=?A0N-eJ#m?} zSOSm(Y=E}5HaVzd8cYTFS~C#@^ffFY`e=Giz{fi}B@7h#uI~Fl2B1=@aH8bSfX%Zk zDq8c$o7eGcxqm895g`#wdU)Hf0t^6~fOK4qiY&I*YR7%z#x-OBN z0buD|9%dvIBDpq@sZ=WXLCDJ93-mp|$nOmsu@){t`Cj~v9jmG5VR6HqTfaQoy1gH8 zfa2KLST29A2c?CREBA5i-)p#^|3e2pKkd5&(EqJaN`FAXFwNL-fTB5lMJIDSS1$k_10%p?5qV|KPCH_ki6j?I(`2;g6aZ_o*%`2_D|XHJ9{XK? zu&0^YQGb(T7zQH3v(7&WwPtX6C)ZZ>A}W}%C}QZ;0Oq^8W!>OkxtL*VYin`!p7R7M z3Rz5EWkH&IihNYTNM5!vdp65~a6`rpM%4O7)hhbWTfnQf{72u=I zTc!Q}-DOc2j&0k8*4~RapWbog{SA)TKcmYohJTr2WaxOzu1andU^varj(u@mm(L&H za_qw`T&39m@gBa`oLQ7hvMWTVR5REe4<9T`hT(Z0hYL5EQ~{GJpr{lRLBKBOS=}(^ z{Ph4wL`pzz`;%dcN>NgZveHb2VZ3E(!l<`x($Qi~NB5=CCXrcZ7`UC>GD)oe0j=YP VQxG(5KvDnz002ovPDHLkV1n&8a2R*Lk}izo`VR;ps57}tv;NTnD{ z+cfs(KrS+wo!!~@d+*o7&ZM)+rl&r5%shDSJHOBOJMZVIDu4gyDCaMp=K*kgX0L9& zc-~vRadL7}t+ljTEutu5etv$<9##EUaMc(9VxS2yF)^XD9ZOS$We4eo3dd_TU0PbI z=6mu{TC1f1bszv3A0O9GM7v^QNUi0mF&r2eB>QM(UBO##?@?!j#`Me$pbF4#w>jR7 zR>Yq1ecIM?;(y_<`LTMBsH##3rZV^DTM8TmUI!{8BP06$sfG>@59`p-kk)E7Etku> z?bGiy!#N0STF=9(IwivmfNHzlCN+*N`@ZJDy)zse*n$7tAd)8enINa>=VAQX)hln@ zoZ3ALgh0HwxL9v|^)6zSlUw$4^pEd|p8Sb5DX;AR27h4ozd~sO3tp*|8x9bcx@%N3 zi>%m1Gr&ZIc$6oU!+3O1%^;_a6&)iYnJqobqo zs~>y|z{mGabL^!lHf$WkS;PIap8?z|`dC_>c2-?AL+;{w9!^0;a8_{A!CAB7d+v9C zxFYUZag+N7Qg)7X^c2Ny7MJR zUfjjA&%c0`lwU3!$#L@vn?20|x=2ObBuQwcLXrxm)j~Q6UdhLqv@dRt;LV*=I&tIL z<}9%=2!e&NeP;;&{*A-GU*>SI9ovfVN@X5g{C_;Jt_QbA&~>W|a$lk-;>qJj9R2GG zkq93?zD{Z_Uu>)wt6RusbIp%E`SVYki(w>5!l8v9SQf*w7-A8g8pAu`-M(S0d-Z@& zRhvM4_w6}i5t<^j#L{st?=ow`=+|v3S!1na>rGiF(N%K}__5e!idz2wCw7=l6n)(| Q01E&B07*qoM6N<$f@PC|>Hq)$ diff --git a/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.cxx b/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.cxx index 4e686ea82..489ee5c8b 100644 --- a/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.cxx +++ b/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.cxx @@ -871,18 +871,45 @@ bool AdvancedGUI_PipeTShapeDlg::isValid (QString& msg) ok = LReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; ok = LReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; ok = LReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; + if(MainTubeGroupParams->SpinBox_DX->value() == LReductionGroupParams->SpinBox1->value()) { + msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_RADII_L") + "\n"; + ok = false; + } + if(MainTubeGroupParams->SpinBox_DX->value() + MainTubeGroupParams->SpinBox_DY->value() == + LReductionGroupParams->SpinBox1->value() + LReductionGroupParams->SpinBox2->value()) { + msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_L") + "\n"; + ok = false; + } } if (RReductionGroupParams->GroupBox1->isChecked()) { ok = RReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok; ok = RReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; ok = RReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; ok = RReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; + if(MainTubeGroupParams->SpinBox_DX->value() == RReductionGroupParams->SpinBox1->value()) { + msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_RADII_R") + "\n"; + ok = false; + } + if(MainTubeGroupParams->SpinBox_DX->value() + MainTubeGroupParams->SpinBox_DY->value() == + RReductionGroupParams->SpinBox1->value() + RReductionGroupParams->SpinBox2->value()) { + msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_R") + "\n"; + ok = false; + } } if (IReductionGroupParams->GroupBox1->isChecked()) { ok = IReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok; ok = IReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; ok = IReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; ok = IReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; + if(IncidentTubeGroupParams->SpinBox_DX->value() == IReductionGroupParams->SpinBox1->value()) { + msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_RADII_I") + "\n"; + ok = false; + } + if(IncidentTubeGroupParams->SpinBox_DX->value() + IncidentTubeGroupParams->SpinBox_DY->value() == + IReductionGroupParams->SpinBox1->value() + IReductionGroupParams->SpinBox2->value()) { + msg += tr("GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_I") + "\n"; + ok = false; + } } ok = fabs(MainTubeGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; diff --git a/src/AdvancedGUI/AdvancedGUI_msg_en.ts b/src/AdvancedGUI/AdvancedGUI_msg_en.ts index e7524147c..2aab6e88a 100644 --- a/src/AdvancedGUI/AdvancedGUI_msg_en.ts +++ b/src/AdvancedGUI/AdvancedGUI_msg_en.ts @@ -246,6 +246,30 @@ GEOM_PIPETSHAPE_GROUPPOS Position + + GEOM_PIPETSHAPE_ERR_EQUAL_RADII_L + Main pipe Radius can't be equal to Left thickness reduction Radius (rL)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_L + Main pipe external Radius (Radius + Width) can't be equal to Left thickness reduction external Radius (rL + wL)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_RADII_R + Main pipe Radius can't be equal to Right thickness reduction Radius (rR)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_R + Main pipe external Radius (Radius + Width) can't be equal to Right thickness reduction external Radius (rR + wR)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_RADII_I + Incident pipe Radius can't be equal to Incident pipe thickness reduction Radius (rI)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_I + Incident pipe external Radius (Radius + Width) can't be equal to Incident pipe thickness reduction external Radius (rI + wI)! + AdvancedGUI_SmoothingSurfaceDlg diff --git a/src/AdvancedGUI/AdvancedGUI_msg_fr.ts b/src/AdvancedGUI/AdvancedGUI_msg_fr.ts index 69c38cbc9..74bce4882 100644 --- a/src/AdvancedGUI/AdvancedGUI_msg_fr.ts +++ b/src/AdvancedGUI/AdvancedGUI_msg_fr.ts @@ -246,6 +246,30 @@ GEOM_PIPETSHAPE_GROUPPOS Position + + GEOM_PIPETSHAPE_ERR_EQUAL_RADII_L + Main pipe Radius can't be equal to Left thickness reduction Radius (rL)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_L + Main pipe external Radius (Radius + Width) can't be equal to Left thickness reduction external Radius (rL + wL)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_RADII_R + Main pipe Radius can't be equal to Right thickness reduction Radius (rR)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_R + Main pipe external Radius (Radius + Width) can't be equal to Right thickness reduction external Radius (rR + wR)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_RADII_I + Incident pipe Radius can't be equal to Incident pipe thickness reduction Radius (rI)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_I + Incident pipe external Radius (Radius + Width) can't be equal to Incident pipe thickness reduction external Radius (rI + wI)! + AdvancedGUI_SmoothingSurfaceDlg diff --git a/src/AdvancedGUI/AdvancedGUI_msg_ja.ts b/src/AdvancedGUI/AdvancedGUI_msg_ja.ts index 6bb1122f6..e2535d2dc 100644 --- a/src/AdvancedGUI/AdvancedGUI_msg_ja.ts +++ b/src/AdvancedGUI/AdvancedGUI_msg_ja.ts @@ -5,269 +5,293 @@ @default GEOM_ADVANCED - GEOM_ADVANCED + 高度な形状: タイプ %1 GEOM_ADVANCED_201 - GEOM_ADVANCED_201 + T型パイプ GEOM_ADVANCED_202 - GEOM_ADVANCED_202 + カット済みディスク GEOM_ADVANCED_203 - GEOM_ADVANCED_203 + カット シリンダー GEOM_DIVIDEDDISK - GEOM_DIVIDEDDISK + Divided_Disk GEOM_DIVIDEDDISK_TITLE - GEOM_DIVIDEDDISK_TITLE + 分割ディスクの構築 GEOM_DIVIDEDCYLINDER - GEOM_DIVIDEDCYLINDER + Divided_Cylinder GEOM_DIVIDEDCYLINDER_TITLE - GEOM_DIVIDEDCYLINDER_TITLE + 分割シリンダの構築 MEN_DIVIDEDCYLINDER - MEN_DIVIDEDCYLINDER + 分割シリンダ TOP_DIVIDEDCYLINDER - TOP_DIVIDEDCYLINDER + 分割シリンダ STB_DIVIDEDCYLINDER - STB_DIVIDEDCYLINDER + 分割シリンダ MEN_DIVIDEDDISK - MEN_DIVIDEDDISK + 分割ディスク TOP_DIVIDEDDISK - TOP_DIVIDEDDISK + 分割ディスク STB_DIVIDEDDISK - STB_DIVIDEDDISK + 分割ディスク TOP_PIPETSHAPE - TOP_PIPETSHAPE + T型パイプを作成 MEN_PIPETSHAPE - MEN_PIPETSHAPE + T型パイプを作成 STB_PIPETSHAPE - STB_PIPETSHAPE + T型パイプを作成 TOP_SMOOTHINGSURFACE - TOP_SMOOTHINGSURFACE + 表面のスムージング MEN_SMOOTHINGSURFACE - MEN_SMOOTHINGSURFACE + 表面の平滑化 STB_SMOOTHINGSURFACE - STB_SMOOTHINGSURFACE + 表面のスムージング HALF_LENGTH_MAIN_PIPE - HALF_LENGTH_MAIN_PIPE + 半分の長さのパイプを作成 HALF_LENGTH_INCIDENT_PIPE - HALF_LENGTH_INCIDENT_PIPE + 入射管長さ半分 CIRCULAR_QUARTER_PIPE - CIRCULAR_QUARTER_PIPE + パイプの1/4形状 THICKNESS - THICKNESS + 厚み FLANGE - FLANGE + フランジ CHAMFER_OR_FILLET - CHAMFER_OR_FILLET + 面取り 又は フィレット CHAMFER - CHAMFER + 面取り FILLET - FILLET + フィレット JUNCTION_FACE_1 - JUNCTION_FACE_1 + Junction 1 JUNCTION_FACE_2 - JUNCTION_FACE_2 + Junction 2 JUNCTION_FACE_3 - JUNCTION_FACE_3 + Junction 3 INTERNAL_FACES - INTERNAL_FACES + 内部の顔 AdvancedGUI_PipeTShapeDlg + + GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_I + Incident pipe external Radius (Radius + Width) can't be equal to Incident pipe thickness reduction external Radius (rI + wI)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_RADII_I + Incident pipe Radius can't be equal to Incident pipe thickness reduction Radius (rI)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_R + Main pipe external Radius (Radius + Width) can't be equal to Right thickness reduction external Radius (rR + wR)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_RADII_R + Main pipe Radius can't be equal to Right thickness reduction Radius (rR)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_EXT_RADII_L + Main pipe external Radius (Radius + Width) can't be equal to Left thickness reduction external Radius (rL + wL)! + + + GEOM_PIPETSHAPE_ERR_EQUAL_RADII_L + Main pipe Radius can't be equal to Left thickness reduction Radius (rL)! + GEOM_PIPE_TSHAPE_TITLE - GEOM_PIPE_TSHAPE_TITLE + T型パイプの作成 GEOM_PIPE_TSHAPE - GEOM_PIPE_TSHAPE + PipeTShape GEOM_PIPE_TSHAPE_MPIPE - GEOM_PIPE_TSHAPE_MPIPE + メインパイプ GEOM_PIPE_TSHAPE_R - GEOM_PIPE_TSHAPE_R + 半径 GEOM_PIPE_TSHAPE_W - GEOM_PIPE_TSHAPE_W + 幅 GEOM_PIPE_TSHAPE_L - GEOM_PIPE_TSHAPE_L + 半分の長さ GEOM_PIPE_TSHAPE_IPIPE - GEOM_PIPE_TSHAPE_IPIPE + 付随パイプ GEOM_PIPE_TSHAPE_CHAMFER - GEOM_PIPE_TSHAPE_CHAMFER + 面取り GEOM_PIPE_TSHAPE_CHAMFER_H - GEOM_PIPE_TSHAPE_CHAMFER_H + 高さ GEOM_PIPE_TSHAPE_CHAMFER_W - GEOM_PIPE_TSHAPE_CHAMFER_W + 幅 GEOM_PIPE_TSHAPE_FILLET - GEOM_PIPE_TSHAPE_FILLET + フィレット GEOM_PIPE_TSHAPE_HEX - GEOM_PIPE_TSHAPE_HEX + 六面体メッシュの準備 GEOM_PIPE_TSHAPE_POSITION - GEOM_PIPE_TSHAPE_POSITION + 位置を設定 GEOM_PIPE_TSHAPE_POSITION_P1 - GEOM_PIPE_TSHAPE_POSITION_P1 + 接続部 P1 GEOM_PIPE_TSHAPE_POSITION_P2 - GEOM_PIPE_TSHAPE_POSITION_P2 + 接続部 P2 GEOM_PIPE_TSHAPE_POSITION_P3 - GEOM_PIPE_TSHAPE_POSITION_P3 + 接続部 P3 GEOM_PIPE_TSHAPE_POSITION_LBL_L1 - GEOM_PIPE_TSHAPE_POSITION_LBL_L1 + New L1 GEOM_PIPE_TSHAPE_POSITION_LBL_L2 - GEOM_PIPE_TSHAPE_POSITION_LBL_L2 + New L2 GEOM_PIPE_TSHAPE_LEFT_TR - GEOM_PIPE_TSHAPE_LEFT_TR + 左側肉厚変更 GEOM_PIPE_TSHAPE_RIGHT_TR - GEOM_PIPE_TSHAPE_RIGHT_TR + 右側肉厚変更 GEOM_PIPE_TSHAPE_INCI_TR - GEOM_PIPE_TSHAPE_INCI_TR + 付随パイプ肉厚変更 GEOM_PIPE_TSHAPE_TR_R - GEOM_PIPE_TSHAPE_TR_R + 半径 (r%1) GEOM_PIPE_TSHAPE_TR_W - GEOM_PIPE_TSHAPE_TR_W + 厚み (w%1) GEOM_PIPE_TSHAPE_TR_L_TRANS - GEOM_PIPE_TSHAPE_TR_L_TRANS + 拡張部長さ (ltrans %1) GEOM_PIPE_TSHAPE_TR_L_THIN - GEOM_PIPE_TSHAPE_TR_L_THIN + 接続部長さ (lthin %1) GEOM_PIPETSHAPE_GROUPMAIN - GEOM_PIPETSHAPE_GROUPMAIN + メインの設定 GEOM_PIPETSHAPE_GROUPREDUCT - GEOM_PIPETSHAPE_GROUPREDUCT + 接続部詳細設定 GEOM_PIPETSHAPE_GROUPPOS - GEOM_PIPETSHAPE_GROUPPOS + 位置による設定 AdvancedGUI_SmoothingSurfaceDlg GEOM_SMOOTHINGSURFACE_TITLE - GEOM_SMOOTHINGSURFACE_TITLE + 滑らかな表面の構造 GEOM_SMOOTHINGSURFACE - GEOM_SMOOTHINGSURFACE + 表面 lissee GEOM_SMOOTHINGSURFACE_RESULT - GEOM_SMOOTHINGSURFACE_RESULT + 結果の名前 GEOM_SMOOTHINGSURFACE_ARG - GEOM_SMOOTHINGSURFACE_ARG + 節点 GEOM_SMOOTHINGSURFACE_ARG_POINTS - GEOM_SMOOTHINGSURFACE_ARG_POINTS + ポイント diff --git a/src/BlockFix/BlockFix_UnionFaces.cxx b/src/BlockFix/BlockFix_UnionFaces.cxx index 292286276..34f0e2faf 100644 --- a/src/BlockFix/BlockFix_UnionFaces.cxx +++ b/src/BlockFix/BlockFix_UnionFaces.cxx @@ -233,6 +233,41 @@ static Standard_Boolean IsFacesOfSameSolids return isSame; } +//======================================================================= +//function : IsEdgeValidToMerge +//purpose : Edge is valid if it is not seam or if it is a seam and the face +// has another seam edge. +//======================================================================= +static Standard_Boolean IsEdgeValidToMerge(const TopoDS_Edge &theEdge, + const TopoDS_Face &theFace) +{ + Standard_Boolean isValid = Standard_True; + + if (BRep_Tool::IsClosed(theEdge, theFace)) { + // This is a seam edge. Check if there are another seam edges on the face. + TopExp_Explorer anExp(theFace, TopAbs_EDGE); + + for (; anExp.More(); anExp.Next()) { + const TopoDS_Shape &aShEdge = anExp.Current(); + + // Skip same edge. + if (theEdge.IsSame(aShEdge)) { + continue; + } + + // Check if this edge is a seam. + TopoDS_Edge anEdge = TopoDS::Edge(aShEdge); + + if (BRep_Tool::IsClosed(anEdge, theFace)) { + isValid = Standard_False; + break; + } + } + } + + return isValid; +} + //======================================================================= //function : Perform //purpose : @@ -302,7 +337,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) Standard_Integer i; for (i = 1; i <= edges.Length(); i++) { TopoDS_Edge edge = TopoDS::Edge(edges(i)); - if (BRep_Tool::Degenerated(edge) || BRep_Tool::IsClosed(edge, aFace)) + if (BRep_Tool::Degenerated(edge) || !IsEdgeValidToMerge(edge, aFace)) continue; const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge); @@ -315,7 +350,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) if (aProcessed.Contains(anCheckedFace)) continue; - if (BRep_Tool::IsClosed(edge, anCheckedFace)) { + if (!IsEdgeValidToMerge(edge, anCheckedFace)) { // Skip seam edge. continue; } diff --git a/src/BuildGUI/BuildGUI_ShellDlg.cxx b/src/BuildGUI/BuildGUI_ShellDlg.cxx index e4b12199c..37b892930 100644 --- a/src/BuildGUI/BuildGUI_ShellDlg.cxx +++ b/src/BuildGUI/BuildGUI_ShellDlg.cxx @@ -32,6 +32,7 @@ #include +#include #include #include #include @@ -260,8 +261,17 @@ bool BuildGUI_ShellDlg::execute( ObjectList& objects ) GEOM::GEOM_Object_var anObj = anOper->MakeShell( objlist.in() ); - if ( !anObj->_is_nil() ) + if ( !anObj->_is_nil() ) { + TopoDS_Shape aShell; + GEOMBase::GetShape(anObj, aShell, TopAbs_SHELL); + + if (aShell.IsNull()) { + SUIT_MessageBox::warning(this, + QObject::tr("GEOM_WRN_WARNING"), + QObject::tr("GEOM_WRN_FACES_NOT_SHELL")); + } objects.push_back( anObj._retn() ); + } return true; } diff --git a/src/DisplayGUI/DisplayGUI.cxx b/src/DisplayGUI/DisplayGUI.cxx index c4432718c..230c751a3 100644 --- a/src/DisplayGUI/DisplayGUI.cxx +++ b/src/DisplayGUI/DisplayGUI.cxx @@ -105,6 +105,9 @@ bool DisplayGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - DISPLAY MODE - SHADING WITH EDGES SetDisplayMode( 2 ); break; + case GEOMOp::OpDMTexture: // MENU VIEW - DISPLAY MODE - TEXTURE + SetDisplayMode( 3 ); + break; case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL getGeometryGUI()->EmitSignalDeactivateDialog(); DisplayAll(); diff --git a/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx b/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx index 64e1e5e12..88b730307 100755 --- a/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx +++ b/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx @@ -1701,8 +1701,8 @@ Handle(AIS_AngleDimension) EntityGUI_3DSketcherDlg::createAISAngleDimension(doub std::string Angle_str = doubleToString(theAngle); // Construction of the plane - gce_MakePln gce_MP2(P0, P1, P2); - Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP2.Value()); + //gce_MakePln gce_MP2(P0, P1, P2); + //Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP2.Value()); TopoDS_Vertex V0 = BRepBuilderAPI_MakeVertex(P0); TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(P1); @@ -1725,7 +1725,7 @@ Handle(AIS_AngleDimension) EntityGUI_3DSketcherDlg::createAISAngleDimension(doub // todo : port - Handle(AIS_AngleDimension) anIO = new AIS_AngleDimension( anEdge1, anEdge2, aPlane->Pln() ); + Handle(AIS_AngleDimension) anIO = new AIS_AngleDimension( anEdge1, anEdge2 ); anIO->SetCustomValue( theAngle ); diff --git a/src/EntityGUI/EntityGUI_FeatureDetectorDlg.cxx b/src/EntityGUI/EntityGUI_FeatureDetectorDlg.cxx index cbb5645fd..96bbb34fe 100644 --- a/src/EntityGUI/EntityGUI_FeatureDetectorDlg.cxx +++ b/src/EntityGUI/EntityGUI_FeatureDetectorDlg.cxx @@ -282,7 +282,16 @@ EntityGUI_FeatureDetectorDlg::EntityGUI_FeatureDetectorDlg( GeometryGUI* theGeom myWidgets.insert( HIST_TYPE, histType ); QDoubleSpinBox* thresholdValue = new QDoubleSpinBox(); thresholdValue->setRange( 0, 254 ); - thresholdValue->setValue( 128 ); + // 1 is a good default value for the threshold. It means that we are very permissive + // about what will be considered INSIDE the zone we want to find the frontier of + // This makes the algorithm more robust against a bit inhomogeneous parts in the zone + // that we want to delimitate. + // The drawback is if we want to delimitate a zone wich color is very similar to the zone + // we consider as the OUTSIDE, the result will be bad. + // The current use cases are more of the first form : + // - Strongly contrasted INSIDE and OUTSIDE zones + // - Small inhomogenities in each zone + thresholdValue->setValue( 1 ); myWidgets.insert( THRESHOLD_VALUE, thresholdValue ); QDoubleSpinBox* maxThreshold = new QDoubleSpinBox(); maxThreshold->setRange( 1, 255 ); @@ -327,7 +336,7 @@ EntityGUI_FeatureDetectorDlg::EntityGUI_FeatureDetectorDlg( GeometryGUI* theGeom // mainFrame()->GroupBoxName->hide(); // Build an instance of detection used to perform image processing operations - aDetector = new ShapeRec_FeatureDetector(); + myDetector = new ShapeRec_FeatureDetector(); setHelpFileName( "shape_recognition_page.html" ); @@ -341,7 +350,7 @@ EntityGUI_FeatureDetectorDlg::EntityGUI_FeatureDetectorDlg( GeometryGUI* theGeom //================================================================================= EntityGUI_FeatureDetectorDlg::~EntityGUI_FeatureDetectorDlg() { - + delete myDetector; } //================================================================================= @@ -447,9 +456,9 @@ void EntityGUI_FeatureDetectorDlg::SelectionIntoArgument() return ; // Setting the image caracteristics - aDetector->SetPath( theImgFileName ); - height = aDetector->GetImgHeight(); - width = aDetector->GetImgWidth(); + myDetector->SetPath( theImgFileName ); + height = myDetector->GetImgHeight(); + width = myDetector->GetImgWidth(); pictureLeft = -0.5 * width; // X coordinate of the top left corner of the background image in the view pictureTop = 0.5 * height; // Y coordinate of both top corners @@ -674,7 +683,7 @@ void EntityGUI_FeatureDetectorDlg::setEndPnt(const gp_Pnt& theEndPnt) { myEndPnt = theEndPnt; MESSAGE("myEndPnt = ("<GetImgHeight() > 0) + if (setSelectionRect() && myDetector->GetImgHeight() > 0) showImageSample(); } @@ -705,8 +714,8 @@ bool EntityGUI_FeatureDetectorDlg::setSelectionRect() void EntityGUI_FeatureDetectorDlg::showImageSample() { // Cropp the image to the selection rectangle given by the user - aDetector->SetROI( myRect ); - std::string samplePicturePath = aDetector->CroppImage(); + myDetector->SetROI( myRect ); + std::string samplePicturePath = myDetector->CroppImage(); // Display the result QPixmap pixmap(QString(samplePicturePath.c_str())); @@ -753,9 +762,9 @@ bool EntityGUI_FeatureDetectorDlg::execute( ObjectList& objects ) subPictureLeft = pictureLeft; subPictureTop = pictureTop; } - aDetector->ComputeCorners( useROI, parameters ); - CvPoint2D32f* corners = aDetector->GetCorners(); - int cornerCount = aDetector->GetCornerCount(); + myDetector->ComputeCorners( useROI, parameters ); + CvPoint2D32f* corners = myDetector->GetCorners(); + int cornerCount = myDetector->GetCornerCount(); int i; // Build the geom objects associated to the detected corners and returned by execute @@ -794,9 +803,9 @@ bool EntityGUI_FeatureDetectorDlg::execute( ObjectList& objects ) { GEOM::GEOM_ICurvesOperations_var aCurveOperations = myGeomGUI->GetGeomGen()->GetICurvesOperations( getStudyId() ); - aDetector->ComputeContours( useROI, parameters ); - std::vector< std::vector > contours = aDetector->GetContours(); - std::vector hierarchy = aDetector->GetContoursHierarchy(); + myDetector->ComputeContours( useROI, parameters ); + std::vector< std::vector > contours = myDetector->GetContours(); + std::vector hierarchy = myDetector->GetContoursHierarchy(); std::vector< cv::Point > contour; int idx = 0; @@ -914,8 +923,8 @@ bool EntityGUI_FeatureDetectorDlg::execute( ObjectList& objects ) // else if(myConstructorId ==LINES) // { -// aDetector->ComputeLines(); -// std::vector lines = aDetector->GetLines(); +// myDetector->ComputeLines(); +// std::vector lines = myDetector->GetLines(); // GEOM::GEOM_Object_var Pnt1; // GEOM::GEOM_Object_var Pnt2; // GEOM::GEOM_Object_var aLine; diff --git a/src/EntityGUI/EntityGUI_FeatureDetectorDlg.h b/src/EntityGUI/EntityGUI_FeatureDetectorDlg.h index fdc850d8d..ca0461d5d 100644 --- a/src/EntityGUI/EntityGUI_FeatureDetectorDlg.h +++ b/src/EntityGUI/EntityGUI_FeatureDetectorDlg.h @@ -84,7 +84,7 @@ private slots: private: - ShapeRec_FeatureDetector* aDetector; + ShapeRec_FeatureDetector* myDetector; gp_Ax3 myWPlane; gp_Ax3 aGlobalCS; diff --git a/src/EntityGUI/EntityGUI_PictureImportDlg.cxx b/src/EntityGUI/EntityGUI_PictureImportDlg.cxx index 3feaf26ad..3e521dfdb 100644 --- a/src/EntityGUI/EntityGUI_PictureImportDlg.cxx +++ b/src/EntityGUI/EntityGUI_PictureImportDlg.cxx @@ -184,12 +184,15 @@ bool EntityGUI_PictureImportDlg::execute( ObjectList& objects ) int height = pixmap->height(); int width = pixmap->width(); + delete pixmap; + GEOM::GEOM_Object_var P1 = aBasicOperations->MakePointXYZ( -0.5*width, -0.5*height, 0 ); GEOM::GEOM_Object_var P2 = aBasicOperations->MakePointXYZ( -0.5*width, 0.5*height, 0 ); GEOM::GEOM_Object_var P3 = aBasicOperations->MakePointXYZ( 0.5*width, 0.5*height, 0 ); GEOM::GEOM_Object_var P4 = aBasicOperations->MakePointXYZ( 0.5*width, -0.5*height, 0 ); GEOM::GEOM_Object_var aFace = aBlocksOperations->MakeQuad4Vertices(P1,P2,P3,P4); + getDisplayer()->SetDisplayMode(3); getDisplayer()->SetTexture(theImgFileName.toStdString()); if ( !aFace->_is_nil() ) @@ -198,8 +201,7 @@ bool EntityGUI_PictureImportDlg::execute( ObjectList& objects ) } res=true; - - + return res; } diff --git a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx index 682dec272..268d90677 100644 --- a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx +++ b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx @@ -589,10 +589,58 @@ void EntityGUI_SubShapeDlg::showOnlySelected() Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO"); if (view->isVisible(io)) myIsHiddenMain = true; - } - aDisplayer->EraseAll(/*forced = false, updateViewer = true*/); - aDisplayer->Display(aSelList, true); + //keep the selected entry and IO in the map for checking + std::map aSelEntriesMap; + SALOME_ListIteratorOfListIO aSelIt(aSelList); + for ( ; aSelIt.More(); aSelIt.Next() ) { + //fill map + Handle(SALOME_InteractiveObject) anSelIO = aSelIt.Value(); + aSelEntriesMap[anSelIO->getEntry()] = anSelIO; + } + //get the displayed sub-shapes + SALOME_ListIO displayed; + view->GetVisible(displayed); + // Erase all, except the selected shapes + std::map::iterator + aSelDispIter = aSelEntriesMap.end(); + SALOME_ListIteratorOfListIO aDispIt( displayed ); + for ( ; aDispIt.More(); aDispIt.Next() ) { + Handle(SALOME_InteractiveObject) anIO = aDispIt.Value(); + aSelDispIter = aSelEntriesMap.find( anIO->getEntry() ); + if ( aSelDispIter != aSelEntriesMap.end() ) { + //sub-shape is selected, so erase it's record from map to keep in it not displayed, but selected sub-shapes only + aSelEntriesMap.erase(aSelDispIter); + } else { + //sub-shape is not in the map of selected, then erase it from view + aDisplayer->Erase( anIO, /*forced = */false, /*updateViewer = */false ); + } + } + + if ( !aSelEntriesMap.empty() ) { + // Build a presentation of the selected, but not displayed sub-shapes + TopTools_IndexedMapOfShape aSubShapesMap; + TopExp::MapShapes(myShape, aSubShapesMap); + QString anEntryBase = aMainEntry.in(); + + TopExp_Explorer anExp (myShape, (TopAbs_ShapeEnum)shapeType()); + for (; anExp.More(); anExp.Next()) + { + TopoDS_Shape aSubShape = anExp.Current(); + int index = aSubShapesMap.FindIndex(aSubShape); + QString anEntry = QString( "TEMP_" ) + anEntryBase + QString("_%1").arg(index); + if ( aSelEntriesMap.find( anEntry ) == aSelEntriesMap.end() ) { + //skip not selected sub-shapes + continue; + } + SALOME_Prs* aPrs = aDisplayer->buildSubshapePresentation(aSubShape, anEntry, view); + if (aPrs) { + displayPreview(aPrs, true, false); // append, do not update + } + } + } + aDisplayer->UpdateViewer(); + } // Mantis issue 0021421: do not hide main shape, if explode on VERTEX if ((TopAbs_ShapeEnum)shapeType() == TopAbs_VERTEX && myIsHiddenMain) { diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cxx b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cxx index 4b7520984..0cf6e5ba0 100644 --- a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cxx +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cxx @@ -635,12 +635,10 @@ void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF, aP2=aNodes(aN2).Transformed(aTrsf); // if (aType==GeomAbs_Cylinder) { - Standard_Real aTolSM; gp_Cylinder aCyl; // - aTolSM=1.523e-6;//~1.-cos(0.1 deg) aCyl=aGAS.Cylinder(); - if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, aTolSM)) { + if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, myTolerance)) { continue; } } diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn2.cxx b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn2.cxx index 06fdbeff9..3ede89403 100644 --- a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn2.cxx +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn2.cxx @@ -881,12 +881,10 @@ if (!aNb && myNbPntsMin) { aP2=aNodes(aN2).Transformed(aTrsf); // if (aType==GeomAbs_Cylinder) { - Standard_Real aTolSM; gp_Cylinder aCyl; // - aTolSM=1.523e-6;//~1.-cos(0.1 deg) aCyl=aGAS.Cylinder(); - if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, aTolSM)) { + if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, myTolerance)) { continue; } } diff --git a/src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx b/src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx index e50fc4c7c..21e6877b8 100644 --- a/src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx +++ b/src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx @@ -140,21 +140,34 @@ Standard_Boolean GEOMAlgo_SurfaceTools::IsCoaxial(const gp_Pnt& aP1, const gp_Cylinder& aCyl, const Standard_Real aTol) { - Standard_Boolean bRet=Standard_False; - Standard_Real aSM; - // - gp_Vec aV12(aP1, aP2); - gp_Dir aD12(aV12); - // - const gp_Ax1& aAxis=aCyl.Axis(); - const gp_Dir& aDAxis=aAxis.Direction(); - // - aSM=fabs(aD12*aDAxis); - if (fabs(1.-aSM) > aTol) { - return bRet; + const gp_XYZ &aLoc = aCyl.Location().XYZ(); + const gp_Ax1 &aAxis = aCyl.Axis(); + const gp_XYZ &aDAxis = aAxis.Direction().XYZ(); + gp_XYZ aDP1 = aP1.XYZ().Subtracted(aLoc); + gp_XYZ aDP2 = aP2.XYZ().Subtracted(aLoc); + Standard_Real aDot1 = aDP1.Dot(aDAxis); + Standard_Real aDot2 = aDP1.Dot(aDAxis); + Standard_Real aTol2 = aTol*aTol; + + // Project P1 and P2 onto a plane with location aLoc and Norm aDAxis. + aDP1.Subtract(aDAxis.Multiplied(aDot1)); + aDP2.Subtract(aDAxis.Multiplied(aDot2)); + + Standard_Real aRadius1 = aDP1.Modulus(); + Standard_Real aRadius2 = aDP2.Modulus(); + Standard_Boolean isOn = Standard_False; + + if (fabs(aRadius1 - aRadius2) <= aTol) { + // Check the deflection of the middle point. + gp_XYZ aMidP = 0.5*(aDP1 + aDP2); + Standard_Real aMidRadius1 = aMidP.Modulus(); + + if (fabs(aRadius1 - aRadius2) <= aTol) { + isOn = Standard_True; + } } - // - return !bRet; + + return isOn; } //======================================================================= //function : IsAnalytic diff --git a/src/GEOMGUI/GEOM_Displayer.cxx b/src/GEOMGUI/GEOM_Displayer.cxx index 25ad93b5a..566e42c19 100644 --- a/src/GEOMGUI/GEOM_Displayer.cxx +++ b/src/GEOMGUI/GEOM_Displayer.cxx @@ -673,8 +673,7 @@ void GEOM_Displayer::updateShapeProperties( const Handle(GEOM_AISShape)& AISShap AISShape->SetDisplayVectors( propMap.value( GEOM::propertyName( GEOM::EdgesDirection ) ).toBool() ); // set transparency - // VSR: ??? next line is commented: transparency property is set in the AfterDisplay() function - //AISShape->SetTransparency( propMap.value( GEOM::propertyName( GEOM::Transparency ) ).toDouble() ); + AISShape->SetTransparency( propMap.value( GEOM::propertyName( GEOM::Transparency ) ).toDouble() ); // set iso properties int uIsos = propMap.value( GEOM::propertyName( GEOM::NbIsos ) ).toString().split( GEOM::subSectionSeparator() )[0].toInt(); @@ -697,12 +696,36 @@ void GEOM_Displayer::updateShapeProperties( const Handle(GEOM_AISShape)& AISShap AISShape->SetOwnDeviationCoefficient( qMax( propMap.value( GEOM::propertyName( GEOM::Deflection ) ).toDouble(), GEOM::minDeflection() ) ); // set texture + bool textureAdded = false; if ( HasTexture() ) { // predefined display texture, manually set to displayer via GEOM_Displayer::SetTexture() function AISShape->SetTextureFileName( TCollection_AsciiString( GetTexture().c_str() ) ); + if ( ! entry.isEmpty() ) { + // check that study is active + SalomeApp_Study* study = getActiveStudy(); + if ( study ) { + // Store the texture in object properties for next displays + study->setObjectProperty( aMgrId, entry, GEOM::propertyName( GEOM::Texture ), QString( GetTexture().c_str() ) ); + study->setObjectProperty( aMgrId, entry, GEOM::propertyName( GEOM::DisplayMode ), 3 ); + + // Update porpeties map + propMap = getObjectProperties( study, entry, myViewFrame ); + } + } + textureAdded = true; + } + else { + // Texture from properties + QString aTexture = propMap.value( GEOM::propertyName( GEOM::Texture ) ).toString(); + if ( !aTexture.isEmpty() ) { + AISShape->SetTextureFileName( TCollection_AsciiString( aTexture.toStdString().c_str() ) ); + textureAdded = true; + } + } + + if ( textureAdded ){ AISShape->SetTextureMapOn(); AISShape->DisableTextureModulate(); - AISShape->SetDisplayMode( 3 ); } // set line width @@ -1569,30 +1592,6 @@ void GEOM_Displayer::BeforeDisplay( SALOME_View* v, const SALOME_OCCPrs* ) void GEOM_Displayer::AfterDisplay( SALOME_View* v, const SALOME_OCCPrs* p ) { - SalomeApp_Study* aStudy = getStudy(); - if (!aStudy) return; - SOCC_Viewer* vf = dynamic_cast( v ); - if ( vf && !p->IsNull() ) { - int aMgrId = getViewManagerId( vf ); - Handle(AIS_InteractiveContext) ic = vf->getAISContext(); - const SOCC_Prs* prs = dynamic_cast( p ); - if ( !ic.IsNull() && prs ) { - AIS_ListOfInteractive objects; - prs->GetObjects( objects ); - AIS_ListIteratorOfListOfInteractive it( objects ); - for ( ; it.More(); it.Next() ) { - Handle(GEOM_AISShape) sh = Handle(GEOM_AISShape)::DownCast( it.Value() ); - if ( sh.IsNull() ) continue; - Handle(SALOME_InteractiveObject) IO = sh->getIO(); - if ( IO.IsNull() ) continue; - PropMap aPropMap = aStudy->getObjectPropMap( aMgrId, IO->getEntry() ); - if ( aPropMap.contains( GEOM::propertyName( GEOM::Transparency ) ) ) { - double transparency = aPropMap.value(GEOM::propertyName( GEOM::Transparency )).toDouble(); - ic->SetTransparency( sh, transparency, true ); - } - } - } - } UpdateColorScale(false,false); } diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index a56f0efd8..add4553bd 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -2316,6 +2316,10 @@ Please, select face, shell or solid and try again GEOM_WRN_WARNING Warning + + GEOM_WRN_FACES_NOT_SHELL + Unable to create a shell. Result is a compound of faces. + WRN_SHAPE_UNCLOSED Unable to create solid from unclosed shape %1 @@ -3004,6 +3008,10 @@ Please, select face, shell or solid and try again MEN_MATERIALS_LIBRARY Materials library + + MEN_TEXTURE + Texture + MEN_TORUS Torus @@ -3280,7 +3288,6 @@ Please, select face, shell or solid and try again PREF_SCALAR_BAR_NUMBER_OF_INTERVALS Number of intervals - PROCESS_SHAPE_NEW_OBJ_NAME ProcessShape @@ -4571,27 +4578,27 @@ Please, select face, shell or solid and try again GEOM_REMOVE_WEBS_TITLE - Remove internal faces + Remove internal faces GEOM_REMOVE_WEBS - Compound of solids + Compound of solids REMOVE_WEBS_NEW_OBJ_NAME - NoInternalFaces + NoInternalFaces TOP_REMOVE_WEBS - Remove internal faces + Remove internal faces MEN_REMOVE_WEBS - Remove Internal Faces + Remove Internal Faces STB_REMOVE_WEBS - Remove internal faces + Remove internal faces GEOM_REMOVE_EXTRA_EDGES_TITLE @@ -4976,7 +4983,7 @@ Ignoring units will cause model scaling (as dimensions are supposed to be specif TOP_SMOOTHINGSURFACE - Smoothing Surface + Smoothing Surface GEOM_SELECT_IMAGE @@ -5031,12 +5038,12 @@ Ignoring units will cause model scaling (as dimensions are supposed to be specif Import / Export - CC_PNT_ITEM_X_Y - X=%1, Y=%2 + CC_PNT_ITEM_X_Y + X=%1, Y=%2 - CC_PNT_ITEM_X_Y_Z - X=%1, Y=%2, Z=%3 + CC_PNT_ITEM_X_Y_Z + X=%1, Y=%2, Z=%3 @@ -5656,7 +5663,7 @@ Number of sketch points too small LOWTHRESHOLD - Low theshold + Low threshold RATIO @@ -5878,7 +5885,7 @@ Number of sketch points too small WRN_NOT_SUBSHAPE - The selected shape is not a sub-shape of the main shape. Hide all extra shapes in the viewer for more suitable selection. + The selected shape is not a sub-shape of the main shape. Hide all extra shapes in the viewer for more suitable selection. @@ -5914,10 +5921,6 @@ Number of sketch points too small DATA_TYPE Type - - - - BOOL Boolean @@ -6032,11 +6035,11 @@ Number of sketch points too small WRN_NOT_SUBSHAPE - The selected shape is not a sub-shape of the main shape. Hide all extra shapes in the viewer for more suitable selection. + The selected shape is not a sub-shape of the main shape. Hide all extra shapes in the viewer for more suitable selection. ERR_STEP_EXISTS - Step with such ID already exists. + Step with such ID already exists. @@ -6509,23 +6512,23 @@ Do you want to create new material? Step - + EntityGUI_IsolineDlg - GEOM_ISOLINE_TITLE - Isoline Construction + GEOM_ISOLINE_TITLE + Isoline Construction - GEOM_ISOLINE - Isoline + GEOM_ISOLINE + Isoline - GEOM_ISOLINE_U - U-Isoline + GEOM_ISOLINE_U + U-Isoline - GEOM_ISOLINE_V - V-Isoline + GEOM_ISOLINE_V + V-Isoline - + diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index 371635ac4..5d3f8d802 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -4,12 +4,12 @@ @default - MEN_POP_CONCEAL_CHILDREN - Retirer les sous-éléments + MEN_TEXTURE + Texture - MEN_POP_DISCLOSE_CHILDREN - Publier les sous-éléments + GEOM_WRN_FACES_NOT_SHELL + Unable to create a shell. Result is a compound of faces. BRep_API: command not done @@ -37,8 +37,10 @@ DEP_OBJECT - L'objet choisi a été utilisé pour créer un autre objet. -La suppression de cet objet peut entrainer un export python invalide. + L'objet choisi a été utilisé pour créer un autre objet ou est référencé par un autre module. +La suppression de cet objet peut entrainer un export python invalide. + +Voulez-vous tout de même supprimer ces objets ? DEVIDE_EDGE_NEW_OBJECT_NAME @@ -1676,7 +1678,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau GEOM_ALLOW_NON_MANIFOLD - Allow Non Manifold + Non conformes autorisés GEOM_SHAPE @@ -2356,7 +2358,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau MEN_CURVE_CREATOR - Curve creator + Créateur de courbe MEN_ALL_SEL_ONLY @@ -2799,12 +2801,12 @@ Choisissez une face, une coque ou un solide et essayez de nouveau Editer champ - MEN_POP_SHOW_CHILDREN - Montrer les enfants + MEN_POP_DISCLOSE_CHILDREN + Publier les sous-éléments - MEN_POP_HIDE_CHILDREN - Cacher les enfants + MEN_POP_CONCEAL_CHILDREN + Retirer les sous-éléments MEN_POP_UNPUBLISH_OBJ @@ -2966,6 +2968,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau MEN_3DSKETCH Esquisse 3D + + MEN_ISOLINE + Isoligne + MEN_SOLID Solide @@ -3654,6 +3660,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau STB_POP_CREATE_GROUP Créer un groupe + + STB_POP_EDIT_FIELD + Editer un champ + STB_POP_UNPUBLISH_OBJ Dépublier l'objet @@ -3786,6 +3796,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau STB_3DSKETCH Créer une esquisse 3D + + STB_ISOLINE + Créer une U ou V isoligne + STB_SOLID Construire un solide @@ -4178,6 +4192,14 @@ Choisissez une face, une coque ou un solide et essayez de nouveau TOP_GROUP_CUT Découpe de groupes + + TOP_FIELD_CREATE + Créer un champ + + + TOP_FIELD_EDIT + Editer un champ + TOP_HEX_SOLID Solide hexaédrique @@ -4290,6 +4312,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau TOP_POP_CREATE_GROUP Créer un groupe + + TOP_POP_EDIT_FIELD + Editer un champ + TOP_POP_UNPUBLISH_OBJ Dépublier l'objet @@ -4390,6 +4416,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau TOP_3DSKETCH Esquisse 3D + + TOP_ISOLINE + Isoligne + TOP_SOLID Créer un solide @@ -4955,14 +4985,6 @@ le paramètre '%1' aux préférences du module Géométrie.TOP_SMOOTHINGSURFACE Surface lissée - - MEN_SMOOTHINGSURFACE - Surface lissée - - - STB_SMOOTHINGSURFACE - Surface lissée - GEOM_SELECT_IMAGE Sélectionner une image... @@ -4971,6 +4993,10 @@ le paramètre '%1' aux préférences du module Géométrie.MEN_IMPORTEXPORT Import / Export XAO + + TOOL_IMPORTEXPORT + Import / Export XAO + TOP_EXPORTXAO Export XAO @@ -5012,12 +5038,12 @@ le paramètre '%1' aux préférences du module Géométrie.Import / Export XAO - CC_PNT_ITEM_X_Y - X=%1, Y=%2 + CC_PNT_ITEM_X_Y + X=%1, Y=%2 - CC_PNT_ITEM_X_Y_Z - X=%1, Y=%2, Z=%3 + CC_PNT_ITEM_X_Y_Z + X=%1, Y=%2, Z=%3 @@ -5453,19 +5479,19 @@ le paramètre '%1' aux préférences du module Géométrie. SET_SECTIONS_POLYLINE - Set polyline + Définir la polyligne SET_SECTIONS_POLYLINE_TLT - Set selected section type to polyline + Affecter le type de section sélectionné à la polyligne SET_SECTIONS_SPLINE - Set spline + Définir la spline SET_SECTIONS_SPLINE_TLT - Set selected section type to spline + Affecter le type de section sélectionné à la spline REMOVE @@ -5593,7 +5619,7 @@ Le nombre de points n'est pas suffisant USE_ROI - Use region of interest + Utiliser la région d'intérêt KERNEL_SIZE @@ -5609,75 +5635,75 @@ Le nombre de points n'est pas suffisant TYPE_CRITERIA - Type criteria + Critère de type CV_TERMCRIT_ITER - Max number of iteration + Nombre max d'itérations CV_TERMCRIT_EPS - Epsilon + Epsilon CV_TERMCRIT_ITER | CV_TERMCRIT_EPS - Max number of iteration or epsilon + Nombre max d'itérations ou epsilon MAX_ITER - Max iteration + Iteration max EPSILON - Epsilon + Epsilon L2GRADIENT - L2 gradient + Gradient L2 LOWTHRESHOLD - Low theshold + Niveau bas RATIO - Ratio + Ratio SMOOTH_SIZE - Smooth size + Adoucissement HBINS - Hbins + Hbins SBINS - Sbins + Sbins HIST_TYPE - Histogram type + Type d'histogramme CV_HIST_ARRAY - Multi-dimensional dense array + Tableau dense multi-dimensionnel CV_HIST_SPARSE - Multi-dimensional sparse array + Tableau clairsemé multi-dimensionnel THRESHOLD_VALUE - Threshold value + Seuil MAX_THRESHOLD - Max threshold + Seuil max FIND_CONTOURS_METHOD - Chain approximation method + Méthode d'approximation des chaînes CV_CHAIN_APPROX_NONE @@ -5689,11 +5715,11 @@ Le nombre de points n'est pas suffisant CV_CHAIN_APPROX_TC89_KCOS - TC89 KCOS + TC89 KCOS CV_CHAIN_APPROX_TC89_L1 - TC89 L1 + TC89 L1 @@ -5859,7 +5885,7 @@ Le nombre de points n'est pas suffisant WRN_NOT_SUBSHAPE - La forme sélectionnée n'est pas un sous-élémént de la forme principale. Pour choisir plus facilement, cacher les formes en trop dans la vue. + La forme sélectionnée n'est pas un sous-élémént de la forme principale. Pour choisir plus facilement, cacher les formes en trop dans la vue. @@ -5913,7 +5939,7 @@ Le nombre de points n'est pas suffisant SHAPE_TYPE - Type d'objet + Type d'objet VERTEX @@ -5973,7 +5999,7 @@ Le nombre de points n'est pas suffisant GEOM_NO_STUDY - Pas d'étude disponible + Pas d'étude disponible NO_SHAPE @@ -6009,7 +6035,7 @@ Le nombre de points n'est pas suffisant WRN_NOT_SUBSHAPE - La forme sélectionnée n'est pas un élément de la forme principale. + La forme sélectionnée n'est pas un élément de la forme principale. Pour choisir plus facilement, cacher les formes en trop dans la vue. ERR_STEP_EXISTS @@ -6400,24 +6426,24 @@ Voulez-vous en créer un nouveau ? GEOMGUI_CreationInfoWdg - NO_INFO - (aucune information disponible) - - - VALUE - Valeur - - - PARAMETER - Paramètre + CREATION_INFO_TITLE + Information OPERATION Création - CREATION_INFO_TITLE - Information + PARAMETER + Paramètre + + + VALUE + Valeur + + + NO_INFO + (aucune information disponible) @@ -6486,6 +6512,23 @@ Voulez-vous en créer un nouveau ? Pas + + EntityGUI_IsolineDlg + + GEOM_ISOLINE_TITLE + Construction d'isoligne + + + GEOM_ISOLINE + Isoligne + + + GEOM_ISOLINE_U + U-Isoligne + + + GEOM_ISOLINE_V + V-Isoligne + + - - diff --git a/src/GEOMGUI/GEOM_msg_ja.ts b/src/GEOMGUI/GEOM_msg_ja.ts index 77b266efc..8a673fc1b 100644 --- a/src/GEOMGUI/GEOM_msg_ja.ts +++ b/src/GEOMGUI/GEOM_msg_ja.ts @@ -3,6 +3,14 @@ @default + + MEN_TEXTURE + Texture + + + GEOM_WRN_FACES_NOT_SHELL + Unable to create a shell. Result is a compound of faces. + BRep_API: command not done エラー: オブジェクトをビルドできませんでした @@ -13,7 +21,7 @@ CHANGE_ORIENTATION_NEW_OBJ_NAME - 反転 + Invert EDGE_WIDTH_TLT @@ -25,15 +33,15 @@ CLOSE_CONTOUR_NEW_OBJ_NAME - 閉じた輪郭 + CloseContour DEP_OBJECT - 選択したオブジェクトは、別のオブジェクトの作成に使用されました。 削除することはできません。 + 選択したオブジェクトは、別のオブジェクトの作成に使用されました。このオブジェクトを削除する、python にエクスポートが無効になっている可能性があります。 DEVIDE_EDGE_NEW_OBJECT_NAME - 新しいオブジェクト + NewObject ERROR_SHAPE_TYPE @@ -105,7 +113,7 @@ GEOM_ADD_POINT - ポイントを追加 + ポイントを追加します。 GEOM_ANGLE @@ -125,19 +133,19 @@ GEOM_ANGLE_STEP - GEOM_ANGLE_STEP + 角度ピッチ: GEOM_ARC_ELLIPSE - 楕円弧 + 楕円の弧 GEOM_ARC - Arc + 円弧 GEOM_ARCHIMEDE - らせん + Archimede GEOM_ARCHIMEDE_TITLE @@ -177,11 +185,11 @@ GEOM_BINORMAL - BiNormal + 従法線ベクトル GEOM_BLOCK - Hexahedral_Solid + 六面体のソリッド GEOM_BLOCKS_COMPOUND @@ -197,7 +205,7 @@ GEOM_BLOCK_MULTITRSF - ブロック multi-transformation + Block Multi-Transformation GEOM_BLOCK_MULTITRSF_DOUBLE @@ -209,7 +217,7 @@ GEOM_BLOCK_MULTITRSF_TITLE - ブロック multi-transformation + ブロックの複数回移動 GEOM_BLOCK_TITLE @@ -217,7 +225,7 @@ GEOM_BNDBOX - 境界ボックス + Bounding Box GEOM_BNDBOX_OBJDIM @@ -313,7 +321,7 @@ GEOM_CHAMFER - 面取り + Chamfer GEOM_CHAMFER_ABORT @@ -413,7 +421,7 @@ GEOM_CIRCLE - 円 + Circle GEOM_CIRCLE_TITLE @@ -421,7 +429,7 @@ GEOM_CLOSECONTOUR_TITLE - 輪郭を閉じる + スケッチを終了 GEOM_CMASS @@ -433,11 +441,11 @@ GEOM_COMMON - 交差点 + Common GEOM_COMMON_TITLE - 交差部分を取り出す + オブジェクトの交差部分 GEOM_COMPOUND @@ -505,7 +513,7 @@ GEOM_CUT_TITLE - オブジェクトの切断 + オブジェクトの切り抜き GEOM_CYLINDER @@ -625,7 +633,7 @@ GEOM_EXTRUDED_BOSS_TITLE - 押し出しボス + 押出し GEOM_EXTRUDED_BOSS @@ -671,6 +679,10 @@ GEOM_LCS ローカル座標系 + + GEOM_LOCATIONS + 位置 + GEOM_FACES Faces @@ -681,11 +693,11 @@ GEOM_FACE_OPT - 平らなフェースを作成してください + 平らなフェースを作成 MAKE_FACE_TOLERANCE_TOO_BIG - 平面顔を構築できませんでした: \n 作成顔が高すぎるの公差 + 平坦な面を作成できません: 作成された顔があまりにも高い耐性 GEOM_FACE_OR_LCS @@ -701,7 +713,7 @@ GEOM_RECTANGLE_TITLE - 四角形の構築 + 四角形の作成 GEOM_RECTANGLE @@ -737,7 +749,7 @@ GEOM_FILLET_FACES - 顔に残す + 選択した面にフィレット GEOM_FILLET_TITLE @@ -821,7 +833,7 @@ GEOM_FixFaceSize - 顔のサイズを修正します。 + 面のサイズを修正します GEOM_FixShape @@ -869,7 +881,7 @@ GEOM_IMPORT - Objet_importe + 形状をインポート GEOM_INCORRECT_INPUT @@ -969,7 +981,7 @@ GEOM_MEN_ALL_FILES - すべてのファイル (※) + すべてのファイル (*) GEOM_MEN_ANGLE @@ -1013,7 +1025,7 @@ GEOM_MEN_SHADING_WITH_EDGES - 陰影とエッジ + エッジ+シェーディング GEOM_MEN_SKETCHER_X @@ -1057,11 +1069,11 @@ GEOM_MINDIST_NAME - GEOM_MINDIST_NAME + DistMin GEOM_MINDIST_NO_SOL - GEOM_MINDIST_NO_SOL + 解決策を見つけた GEOM_MINDIST_OBJ @@ -1069,11 +1081,11 @@ GEOM_MINDIST_PUBLISH_TITLE - GEOM_MINDIST_PUBLISH_TITLE + いくつかのソリューション GEOM_MINDIST_PUBLISH_TEXT - GEOM_MINDIST_PUBLISH_TEXT + 研究で発見したすべてのソリューションを発行しますか。ない場合は、現在選択されている唯一のソリューションが公開されます。 GEOM_MINDIST_TITLE @@ -1081,7 +1093,7 @@ GEOM_MIRROR - ミラー + Mirror GEOM_MIRROR_TITLE @@ -1105,7 +1117,7 @@ GEOM_MULTIROTATION_TITLE - Multi-rotation + オブジェクトの複数回回転 GEOM_MULTITRANSLATION @@ -1177,7 +1189,7 @@ GEOM_OFFSET - オフセット + Offset GEOM_OFFSET_TITLE @@ -1189,7 +1201,7 @@ GEOM_PROJECTION - 投影 + Projection GEOM_PROJECTION_TITLE @@ -1201,16 +1213,24 @@ GEOM_SOLUTION - GEOM_SOLUTION + 解決方法: GEOM_SOLUTION_I - GEOM_SOLUTION_I + %1 のソリューション GEOM_TARGET_OBJECT 目的面 + + GEOM_WITH_CONTACT + 接触している + + + GEOM_WITH_CORRECTION + 補正している + GEOM_OPERATIONS 操作 @@ -1385,7 +1405,7 @@ GEOM_POSITION - 位置 + Position GEOM_POSITION_TITLE @@ -1509,11 +1529,11 @@ GEOM_RECONSTRUCTION_LIMIT_EDGE - エッジ + Edge GEOM_RECONSTRUCTION_LIMIT_FACE - フェース + Face GEOM_RECONSTRUCTION_LIMIT_SHAPE @@ -1565,7 +1585,7 @@ GEOM_REVERSE - 反転 + 裏返し GEOM_REVERSE_DIRECTION @@ -1597,7 +1617,7 @@ GEOM_ROTATION - 回転 + Rotation GEOM_ROTATION_TITLE @@ -1605,7 +1625,7 @@ GEOM_SCALE - スケール + Scale GEOM_SCALE_FACTOR @@ -1617,7 +1637,7 @@ GEOM_SECTION - セクション + Section GEOM_SECTION_TITLE @@ -1645,7 +1665,7 @@ GEOM_SEWING - つなぎ合わせ + Sewing GEOM_SEWING_TITLE @@ -1653,7 +1673,7 @@ GEOM_ALLOW_NON_MANIFOLD - GEOM_ALLOW_NON_MANIFOLD + 非多様体を許可します。 GEOM_SHAPE @@ -1717,7 +1737,7 @@ GEOM_SKETCHER_ARC - 円弧 + Arc GEOM_SKETCHER_CENTER @@ -1905,7 +1925,7 @@ GEOM_SOLID - Solid + ソリッド GEOM_SOLID_TITLE @@ -1961,7 +1981,7 @@ GEOM_STEP_R - GEOM_STEP_R + 放射状のステップ: GEOM_STEP_TITLE @@ -2089,7 +2109,7 @@ GEOM_THICKNESS - GEOM_THICKNESS + 厚み GEOM_TOLERANCE @@ -2201,7 +2221,7 @@ GEOM_VERTEXES - Vertexes + 頂点 GEOM_WATER_DENSITY @@ -2217,7 +2237,7 @@ GEOM_WHATIS - Whatis + 選択対象の情報 GEOM_WHATIS_OBJECT @@ -2225,7 +2245,7 @@ GEOM_WHATIS_TITLE - Whatis + 選択対象の情報 GEOM_WIRE @@ -2325,12 +2345,16 @@ GLUE_NEW_OBJ_NAME - 固着 + Glue LIMIT_TOLERANCE_NEW_OBJ_NAME Limit_tolerance + + MEN_CURVE_CREATOR + カーブの作成 + MEN_ALL_SEL_ONLY すべてを選択 @@ -2341,7 +2365,7 @@ MEN_ARCHIMEDE - アルキメデス法 + アルキメデスの螺旋 MEN_BASIC @@ -2373,11 +2397,11 @@ MEN_FEATURE_DETECTION - パターン認識 + 形状認識 MEN_PICTURE_IMPORT - ビュー内へのイメージの取り込み + ビューアーにイメージをインポート MEN_CHAMFER @@ -2409,7 +2433,7 @@ MEN_CHECK_FREE_FACES - フリーフェースの確認 + フリー面の確認 MEN_CHECK_GEOMETRY @@ -2421,7 +2445,7 @@ MEN_CLIPPING - 面で切断 + クリップの範囲 MEN_CLOSE_CONTOUR @@ -2433,11 +2457,11 @@ MEN_COMPOUND - コンパウンド + 結合 MEN_COMPOUND_SEL_ONLY - アセンブリ + 結合 MEN_CONE @@ -2449,7 +2473,7 @@ MEN_CUT - カット(&t) + カット MEN_CYLINDER @@ -2505,7 +2529,7 @@ MEN_CLS_BRING_TO_FRONT - フォア グラウンドでオブジェクトを削除します。 + トップ レベルの状態をクリア TOP_CLS_BRING_TO_FRONT @@ -2533,7 +2557,7 @@ MEN_ERASE - 消去 + 非表示 MEN_ERASE_ALL @@ -2541,7 +2565,7 @@ MEN_EXPLODE - 分解 + 展開 MEN_EXPLODE_BLOCKS @@ -2553,11 +2577,11 @@ MEN_EXTRUSION - 面の押出し + 押出 MEN_EXTRUDED_CUT - 押込み + 押出しカット MEN_EXTRUDED_BOSS @@ -2565,11 +2589,11 @@ MEN_FACE - フェース + 面 MEN_FACE_SEL_ONLY - フェース + 面 MEN_FILE @@ -2597,15 +2621,15 @@ MEN_GENERATION - ジェネレーション + 生成 MEN_GLUE_FACES - フェース固着 + 面の固着 MEN_GLUE_EDGES - エッジ固着 + エッジの固着 MEN_GROUP @@ -2617,35 +2641,35 @@ MEN_GROUP_EDIT - 編集 + グループの編集 MEN_GROUP_UNION - グループの連合 + グループの結合 MEN_GROUP_INTERSECT - グループの交差点 + グループの交差 MEN_GROUP_CUT - 切断グループ + グループのカット MEN_FIELD - MEN_FIELD + フィールド: MEN_FIELD_CREATE - MEN_FIELD_CREATE + フィールドを作成します。 MEN_FIELD_EDIT - MEN_FIELD_EDIT + フィールドの編集 MEN_ADD_FIELD_STEP - MEN_ADD_FIELD_STEP + フィールドステップの追加 MEN_RELOAD_IMPORTED @@ -2689,23 +2713,23 @@ MEN_MIN_DIST - 最小距離 + 最短距離 MEN_MIRROR - オブジェクトの反転 + ミラー MEN_MODIFY_LOCATION - 位置を変更します。 + 位置変更 MEN_MUL_ROTATION - Multi-rotation + 複数回回転 MEN_MUL_TRANSFORM - Multi-transformation + 複数回移動 MEN_MUL_TRANSLATION @@ -2713,7 +2737,7 @@ MEN_NEW_ENTITY - 新しいオブジェクト + 新しいエンティティ MEN_OFFSET @@ -2729,7 +2753,7 @@ MEN_ORIGIN_AND_VECTORS - 原点とベースベクトル + 起源と基本ベクトル MEN_PARTITION @@ -2749,7 +2773,7 @@ MEN_POINT - 基準点 + 点 MEN_POINT_COORDS @@ -2769,11 +2793,11 @@ MEN_POP_EDIT_FIELD - MEN_POP_EDIT_FIELD + フィールドの編集 MEN_POP_DISCLOSE_CHILDREN - 子項目を開示します。 + 子項目を開示 MEN_POP_CONCEAL_CHILDREN @@ -2801,11 +2825,11 @@ MEN_POP_SHADING - 網かけ + シェーディング MEN_POP_SHADING_WITH_EDGES - 陰影とエッジ + エッジ+シェーディング MEN_POP_TEXTURE @@ -2853,7 +2877,7 @@ MEN_POP_VECTORS - エッジの方向を表示します。 + ベクトル方向表示 MEN_PREFERENCES @@ -2869,7 +2893,7 @@ MEN_ADVANCED - 高度な + 高度な処理 MEN_PROPAGATE @@ -2909,7 +2933,7 @@ MEN_SHADING - 表面 + 網かけ MEN_SHADING_WITH_EDGES @@ -2939,6 +2963,10 @@ MEN_3DSKETCH 3D スケッチ + + MEN_ISOLINE + 等高線 + MEN_SOLID ソリッド @@ -2977,7 +3005,7 @@ MEN_MATERIALS_LIBRARY - MEN_MATERIALS_LIBRARY + 材料の特性 MEN_TORUS @@ -2989,7 +3017,7 @@ MEN_TRANSLATION - 移動 + 変換 MEN_VECTOR @@ -3005,7 +3033,7 @@ MEN_WHAT_IS - Whatis + 選択対象の情報 MEN_WIRE @@ -3033,15 +3061,15 @@ MEN_POP_POINT_MARKER - ポイント マーカー + ポイント マーカ MEN_POP_MATERIAL_PROPERTIES - 材料の特性 + 材料特性 MEN_POP_PREDEF_MATER_CUSTOM - MEN_POP_PREDEF_MATER_CUSTOM + カスタム... NAME_LBL @@ -3189,11 +3217,11 @@ PREF_PREDEF_MATERIALS - PREF_PREDEF_MATERIALS + コンテキスト メニューからプリセット マテリアルを表示します。 PREF_EDITGROUP_COLOR - PREF_EDITGROUP_COLOR + グループの編集中にスロット形状の色 PREF_EDGE_WIDTH @@ -3213,27 +3241,55 @@ PREF_AUTO_BRING_TO_FRONT - PREF_AUTO_BRING_TO_FRONT + フォア グラウンドで自動的に表示されます。 PREF_ISOS - PREF_ISOS + 輪郭の数 PREF_ISOS_U - PREF_ISOS_U + U によると PREF_ISOS_V - PREF_ISOS_V + よると V + + + PREF_GROUP_SCALAR_BAR + 場の分布表示についてのスカラバー + + + PREF_SCALAR_BAR_X_POSITION + X座標 + + + PREF_SCALAR_BAR_Y_POSITION + Y座標 + + + PREF_SCALAR_BAR_WIDTH + 幅 + + + PREF_SCALAR_BAR_HEIGHT + 高さ + + + PREF_SCALAR_BAR_TEXT_HEIGHT + 文字高さ + + + PREF_SCALAR_BAR_NUMBER_OF_INTERVALS + 間隔の数 PROCESS_SHAPE_NEW_OBJ_NAME - FormeRetraitee + ProcessShape MATERIAL_LIBRARY_TLT - MATERIAL_LIBRARY_TLT + 図書館資料 REMOVE_HOLES_NEW_OBJ_NAME @@ -3245,7 +3301,7 @@ SEWING_NEW_OBJ_NAME - つなぎ合わせ + Sewing STB_ALL_SEL_ONLY @@ -3257,7 +3313,7 @@ STB_ARCHIMEDE - らせん操作 + アルキメデス法で水位面を作成します。 STB_BASIC_PROPS @@ -3277,7 +3333,7 @@ STB_PICTURE_IMPORT - ビュー内のイメージをインポートします。 + ビューアーにイメージをインポートします。 STB_CHAMFER @@ -3329,7 +3385,7 @@ STB_COMMON - 交差点 + 共有領域 STB_COMPOUND @@ -3349,7 +3405,7 @@ STB_CUT - 切断 + Cut STB_CYLINDER @@ -3425,7 +3481,7 @@ STB_EXTRUDED_BOSS - 押し出しの上司 + 押出し STB_FACE @@ -3477,7 +3533,7 @@ STB_GROUP_INTERSECT - グループの交差点 + グループの共有領域 STB_GROUP_CUT @@ -3485,11 +3541,11 @@ STB_FIELD_CREATE - STB_FIELD_CREATE + フィールドを作成します。 STB_FIELD_EDIT - STB_FIELD_EDIT + フィールドを編集します。 STB_RELOAD_IMPORTED @@ -3497,7 +3553,7 @@ STB_HEX_SOLID - 六面体ソリッド + Hexahedral_Solid STB_IMPORT @@ -3541,11 +3597,11 @@ STB_MUL_ROTATION - Multi-rotation を実行 + 複数回回転を実行します。 STB_MUL_TRANSFORM - Multi-transformation を実行 + 複数回移動を実行します。 STB_MUL_TRANSLATION @@ -3601,7 +3657,7 @@ STB_POP_EDIT_FIELD - STB_POP_EDIT_FIELD + フィールドを編集します。 STB_POP_UNPUBLISH_OBJ @@ -3657,15 +3713,15 @@ STB_POP_WIREFRAME - ワイヤー + Wires STB_MATERIALS_LIBRARY - STB_MATERIALS_LIBRARY + 材料のライブラリの内容を表示します。 STB_POP_PREDEF_MATER_CUSTOM - STB_POP_PREDEF_MATER_CUSTOM + カスタム. STB_PROPAGATE @@ -3697,7 +3753,7 @@ STB_WIREFRAME - ワイヤー + Wires STB_SHADING @@ -3735,6 +3791,10 @@ STB_3DSKETCH 3Dスケッチを作成 + + STB_ISOLINE + UまたはV方向等高線の作成 + STB_SOLID ソリッドを構築 @@ -3869,11 +3929,11 @@ TOOL_BASIC - 基本オブジェクト + 基礎オブジェクト TOOL_BLOCKS - ブロック + ブロック分割 TOOL_BOOLEAN @@ -3881,11 +3941,11 @@ TOOL_FEATURES - 変更 + フィーチャー TOOL_GENERATION - ジェネレーション + 押し出し/回転 TOOL_PRIMITIVES @@ -3893,11 +3953,11 @@ TOOL_TRANSFORMATION - 変形 + 変形/移動/回転 TOOL_BUILD - ビルド + 構築 TOOL_OPERATIONS @@ -3909,11 +3969,11 @@ TOOL_ADVANCED - 高度な + 高度なツール TOOL_MEASURES - 情報 + 情報/測定 TOP_ARC @@ -3921,7 +3981,7 @@ TOP_ARCHIMEDE - らせん + アルキメデス法で水位面を作成 TOP_BASIC_PROPS @@ -3985,7 +4045,7 @@ TOP_COMMON - 交差点 + 共有領域 TOP_COMPOUND @@ -4001,7 +4061,7 @@ TOP_CUT - 切断 + Cut TOP_CYLINDER @@ -4069,11 +4129,11 @@ TOP_EXTRUDED_BOSS - 押し出しの上司 + 押出し TOP_EXTRUDED_CUT - 押出成形材料の除去 + 押出しカット TOP_FACE @@ -4121,7 +4181,7 @@ TOP_GROUP_INTERSECT - グループの交差点 + グループの共有領域 TOP_GROUP_CUT @@ -4129,15 +4189,15 @@ TOP_FIELD_CREATE - TOP_FIELD_CREATE + フィールドを作成します。 TOP_FIELD_EDIT - TOP_FIELD_EDIT + フィールドを編集します。 TOP_HEX_SOLID - 六面体ソリッド + Hexahedral_Solid TOP_IMPORT @@ -4177,15 +4237,15 @@ TOP_MODIFY_LOCATION - 位置を変更します。 + 座標系変更 TOP_MUL_ROTATION - Multi-rotation + 複数回回転 TOP_MUL_TRANSFORM - Multi-transformation + 複数回移動 TOP_MUL_TRANSLATION @@ -4193,7 +4253,7 @@ TOP_PICTURE_IMPORT - ビュー内のイメージをインポートします。 + ビューアーにイメージをインポート TOP_FEATURE_DETECTION @@ -4249,7 +4309,7 @@ TOP_POP_EDIT_FIELD - TOP_POP_EDIT_FIELD + フィールドを編集します。 TOP_POP_UNPUBLISH_OBJ @@ -4297,7 +4357,7 @@ TOP_POP_WIREFRAME - ワイヤー + Wires TOP_PROPAGATE @@ -4317,7 +4377,7 @@ TOP_SCALE - サイズを変更 + サイズ変更 TOP_SECTION @@ -4349,7 +4409,11 @@ TOP_3DSKETCH - 3Dスケッチャー + 3D_Sketcher + + + TOP_ISOLINE + 等高線 TOP_SOLID @@ -4509,27 +4573,27 @@ GEOM_REMOVE_WEBS_TITLE - GEOM_REMOVE_WEBS_TITLE + 内部面の削除 GEOM_REMOVE_WEBS - 梁を削除 + 固体の混合物 REMOVE_WEBS_NEW_OBJ_NAME - REMOVE_WEBS_NEW_OBJ_NAME + NoInternalFaces TOP_REMOVE_WEBS - TOP_REMOVE_WEBS + 内部面を削除します。 MEN_REMOVE_WEBS - MEN_REMOVE_WEBS + 内部面の削除 STB_REMOVE_WEBS - STB_REMOVE_WEBS + 内部面を削除します。 GEOM_REMOVE_EXTRA_EDGES_TITLE @@ -4569,7 +4633,7 @@ FUSE_EDGES_NEW_OBJ_NAME - Fusionaretes + FuseEdges TOP_FUSE_EDGES @@ -4585,15 +4649,15 @@ TOP_UNION_FACES - TOP_UNION_FACES + 連合に直面しています。 MEN_UNION_FACES - MEN_UNION_FACES + 連合に直面しています。 STB_UNION_FACES - STB_UNION_FACES + 連合に直面しています。 TOP_NORMALE @@ -4637,7 +4701,7 @@ MEN_POP_DISABLE_AUTO_COLOR - 自動カラー補正を無効にします。 + 自動色無効 STB_POP_DISABLE_AUTO_COLOR @@ -4645,23 +4709,23 @@ MEN_POP_CREATE_FOLDER - MEN_POP_CREATE_FOLDER + フォルダ作成 STB_POP_CREATE_FOLDER - STB_POP_CREATE_FOLDER + 新しいフォルダーを作成します。 NEW_FOLDER_NAME - NEW_FOLDER_NAME + 新規フォルダー MEN_POP_SORT_CHILD_ITEMS - MEN_POP_SORT_CHILD_ITEMS + 子供の並べ替え STB_POP_SORT_CHILD_ITEMS - STB_POP_SORT_CHILD_ITEMS + 子アイテムを並べ替える GEOM_RESULT_NAME_GRP @@ -4697,7 +4761,7 @@ GEOM_SHAPES_ON_SHAPE - オブジェクトの要素を見つける + Shapes_On_Shape GEOM_SHAPES_ON_SHAPE_ESHAPE @@ -4729,7 +4793,7 @@ GEOM_DISK_CIRCLE - ディスク + Disk GEOM_DISK_ELLIPSE @@ -4877,7 +4941,7 @@ EXPORT_IGES_HETEROGENEOUS_COMPOUND - 異なるモードの sauvegardees\ndans をある必要がありますエンティティを含んでいるのでこのアセンブリ IGES\nsans 損失の形式でエクスポートできません。頂点、エッジと et\nles シェルの輪郭と別の固体。 + このアセンブリは異なるモードでバックアップする必要がありますエンティティを含んでいるので損失なし IGES フォーマットでエクスポートできません。頂点、エッジと 1 つの側面およびシェルとソリッドから別に輪郭です。 GEOM_PUBLISH_NAMED_SHAPES @@ -4885,11 +4949,11 @@ GEOM_SCALE_DIMENSIONS - 単位を考慮したいと思うか? \nIf ないモデルになる (メートル単位として解釈されます) ジオメトリをスケーリングします。 + インポートしたファイルの単位をミリメートルからメートルに変換しますか?いいえを選んだ場合、メートル単位として解釈します。 GEOM_PRECISION_HINT - ジオメトリモジュールの設定でパラメーター '%1' を入力することで精度を調整することが可能です。 + パラメーターの入力値の精度を調整することは '%1' の好みにジオメトリ モジュールの。 GEOM_PLUGINS_OTHER @@ -4909,7 +4973,7 @@ TOP_SMOOTHINGSURFACE - TOP_SMOOTHINGSURFACE + 表面 lissee GEOM_SELECT_IMAGE @@ -4917,51 +4981,59 @@ MEN_IMPORTEXPORT - MEN_IMPORTEXPORT + インポート/エクスポート TOOL_IMPORTEXPORT - TOOL_IMPORTEXPORT + インポート/エクスポート TOP_EXPORTXAO - TOP_EXPORTXAO + エクスポートしました。 MEN_EXPORTXAO - MEN_EXPORTXAO + エクスポートしました。 STB_EXPORTXAO - STB_EXPORTXAO + ソテーした形式でフォームをエクスポートします。 TOP_IMPORTXAO - TOP_IMPORTXAO + インポートしました。 MEN_IMPORTXAO - MEN_IMPORTXAO + インポートしました。 STB_IMPORTXAO - STB_IMPORTXAO + ソテーしたフォームをインポートします。 GEOM_IMPORTEXPORT_204 - GEOM_IMPORTEXPORT_204 + エクスポートしました。 GEOM_SELECT_EXPORT_XAO - GEOM_SELECT_EXPORT_XAO + エクスポートしました。 XAO_FILES - XAO_FILES + ファイルした (*.xao) TOOLS_IMPORTEXPORT - TOOLS_IMPORTEXPORT + インポート/エクスポート + + + CC_PNT_ITEM_X_Y + X=%1, Y=%2 + + + CC_PNT_ITEM_X_Y_Z + X=%1, Y=%2, Z=%3 @@ -4980,19 +5052,19 @@ GEOM_INTERPOL_TANGENTS - GEOM_INTERPOL_TANGENTS + 接線 GEOM_INTERPOL_FIRST_VEC - GEOM_INTERPOL_FIRST_VEC + 最初の接線ベクトル GEOM_INTERPOL_LAST_VEC - GEOM_INTERPOL_LAST_VEC + 最後の接線ベクトル GEOM_BOTH_TANGENTS_REQUIRED - GEOM_BOTH_TANGENTS_REQUIRED + 2 つの接線ベクトルを定義する必要があります。 GEOM_CURVE_CRMODE @@ -5204,11 +5276,267 @@ フェース 2 V + + CurveCreator_NewPointDlg + + ADD_NEW_POINT + 新しい点の追加 + + + X_COORD + X + + + Y_COORD + Y + + + Z_COORD + Z + + + ADD_BTN + 追加 + + + ADD_CONTINUE_BTN + 追加して継続 + + + ADD_NEW_POINT_TO_%1 + 新しい点を%1に追加 + + + SET_POINT_COORDINATES + 点座標の設定 + + + + CurveCreator_NewSectionDlg + + NAME + 名前 + + + LINE_TYPE + ライン + + + POLYLINE_TYPE + ポリライン + + + SPLINE_TYPE + スプライン + + + LINE_CLOSED + 閉じたライン + + + OK + Ok + + + ADD_BTN + 追加 + + + ADD_CONTINUE_BTN + 追加して継続 + + + ADD_NEW_SECTION + 新しい断面の追加 + + + SET_SECTION_PARAMETERS + 断面パラメータの設定 + + + + CurveCreator_TreeViewModel + + X=%1, Y=%2 + X=%1, Y=%2 + + + X=%1, Y=%2, Z=%3 + X=%1, Y=%2, Z=%3 + + + + CurveCreator_Widget + + CURVE_NAME_TLT + カーブの名前 + + + SECTION_GROUP_TLT + 断面グループ + + + UNDO + 元に戻す + + + UNDO_TLT + 元に戻す + + + REDO + 前に進む + + + REDO_TLT + 前に進む + + + NEW_SECTION + 新しい断面 + + + NEW_SECTION_TLT + 新しい断面の挿入 + + + INSERT_SECTION_BEFORE + 前に断面を挿入 + + + INSERT_SECTION_BEFORE_TLT + 前に断面を挿入 + + + INSERT_SECTION_AFTER + 後に断面の挿入 + + + INSERT_SECTION_AFTER_TLT + 後に断面の挿入 + + + ADDITION_MODE + 追加モード + + + ADDITION_MODE_TLT + 追加モード + + + MODIFICATION_MODE + 修正モード + + + MODIFICATION_MODE_TLT + 修正モード + + + DETECTION_MODE + 検出モード + + + DETECTION_MODE_TLT + 検出モード + + + INSERT_POINT_BEFORE + 前に点の挿入 + + + INSERT_POINT_BEFORE_TLT + 前に点の挿入 + + + INSERT_POINT_AFTER + 後に点の挿入 + + + CLOSE_SECTIONS + 断面を閉じる + + + CLOSE_SECTIONS_TLT + 断面を閉じる + + + UNCLOSE_SECTIONS + 断面を開く + + + UNCLOSE_SECTIONS_TLT + 選択した断面を開く + + + SET_SECTIONS_POLYLINE + 断面のポリラインを設定 + + + SET_SECTIONS_POLYLINE_TLT + 断面のポリラインを設定 + + + SET_SECTIONS_SPLINE + 断面のスプラインを設定 + + + SET_SECTIONS_SPLINE_TLT + 選択した断面をスプラインに設定 + + + REMOVE + 削除 + + + REMOVE_TLT + 削除 + + + JOIN + 結合 + + + JOIN_TLT + 選択した断面を結合 + + + STEP_UP + 上昇 + + + STEP_UP_TLT + 選択したオブジェクトを上昇 + + + STEP_DOWN + 下降 + + + STEP_DOWN_TLT + 選択したオブジェクトを下降 + + + CLEAR_ALL + すべて消去 + + + CLEAR_ALL_TLT + すべてのオブジェクトを削除 + + + JOIN_ALL + すべての断面を結合 + + + JOIN_ALL_TLT + すべての断面を結合 + + EntityGUI_SketcherDlg CANNOT_CLOSE - スケッチを閉じることができません\nスケッチのポイント数が少なすぎます + 閉じるには、アウトライン番号のポイントは十分ではないことはできません。 @@ -5239,7 +5567,7 @@ GEOM_CONTOURS - ワイヤー + Wires GEOM_FEATURES @@ -5247,7 +5575,7 @@ GEOM_DETECT_ZONE - Detection\n (すべて、既定のイメージ) の領域を選択します。 + 検出ゾーン (すべての既定のイメージ) を選択します GEOM_DETECT_OUTPUT @@ -5277,6 +5605,110 @@ GEOM_LEFT 左 (X - Z) + + USE_ROI + 希望の領域を使用 + + + KERNEL_SIZE + カーネルサイズ + + + QUALITY_LEVEL + クオリティレベル + + + MIN_DISTANCE + 最短距離 + + + TYPE_CRITERIA + タイプの基準 + + + CV_TERMCRIT_ITER + イタレーションの最大数 + + + CV_TERMCRIT_EPS + 許容範囲 + + + CV_TERMCRIT_ITER | CV_TERMCRIT_EPS + イタレーションまたは許容範囲の最大数 + + + MAX_ITER + 最大イタレーション + + + EPSILON + 許容範囲 + + + L2GRADIENT + L2 gradient + + + LOWTHRESHOLD + 低しきい値 + + + RATIO + 比 + + + SMOOTH_SIZE + 平滑サイズ + + + HBINS + Hbins + + + SBINS + Sbins + + + HIST_TYPE + ヒストグラムのタイプ + + + CV_HIST_ARRAY + 多次元高密度配列 + + + CV_HIST_SPARSE + 多次元スパース配列 + + + THRESHOLD_VALUE + しきい値 + + + MAX_THRESHOLD + 最大しきい値 + + + FIND_CONTOURS_METHOD + 輪郭取得法 + + + CV_CHAIN_APPROX_NONE + チェーン近似がない + + + CV_CHAIN_APPROX_SIMPLE + チェーン近似はSimple + + + CV_CHAIN_APPROX_TC89_KCOS + チェーン近似はTC90 KCOS + + + CV_CHAIN_APPROX_TC89_L1 + チェーン近似はTC90 L1 + EntityGUI_PictureImportDlg @@ -5290,7 +5722,7 @@ GEOM_IMPORT_PICT_TITLE - ビューアーのイメージをインポートします。 + ビューアーにイメージをインポート @@ -5304,15 +5736,15 @@ GenerationGUI_PrismDlg GEOM_THICKENING - GEOM_THICKENING + Epaississement GEOM_ADD_THICKNESS - GEOM_ADD_THICKNESS + 厚み追加(エッジまたはワイヤーのみ) GEOM_TOWARDS_INSIDE - GEOM_TOWARDS_INSIDE + 内側に向かって厚く @@ -5338,7 +5770,7 @@ GEOM_INTERSECT_TITLE - グループの交差点 + グループの共有領域 GEOM_CUT @@ -5346,7 +5778,7 @@ GEOM_CUT_TITLE - オブジェクトの切断 + 切断グループ GEOM_GROUPS @@ -5354,11 +5786,11 @@ GEOM_MAIN_GROUPS - 主なグループ + メイングループ GEOM_TOOL_GROUPS - グループ ツール + ツール グループ @@ -5413,7 +5845,7 @@ SELECT_ALL - すべてを選択 + 全選択 SHAPE_SEL_RESTR @@ -5441,41 +5873,41 @@ WRN_NOT_SUBSHAPE - WRN_NOT_SUBSHAPE + 選択した図形は、主要な図形のサブ図形ではありません。適切な選択については、ビューアー内のすべての余分な図形を非表示します。 EntityGUI NO_FIELD - NO_FIELD + 編集するフィールドを選択してください。 EntityGUI_FieldDlg CREATE_FIELD_TITLE - CREATE_FIELD_TITLE + フィールドを作成します。 EDIT_FIELD_TITLE - EDIT_FIELD_TITLE + フィールドを編集します。 FIELD_NAME - FIELD_NAME + フィールド名 PROPERTIES - PROPERTIES + オブジェクト インスペクター SHAPE - SHAPE + オブジェクト DATA_TYPE - DATA_TYPE + タイプ @@ -5483,107 +5915,123 @@ BOOL - BOOL + ブーリアン INT - INT + 整数 DOUBLE - DOUBLE + ダブル STRING - STRING + 文字列 SHAPE_TYPE - SHAPE_TYPE + SubShape VERTEX - VERTEX + 基準点 EDGE - EDGE + Edge FACE - FACE + Face SOLID - SOLID + ソリッド WHOLE - WHOLE + 図形全体 NB_COMPS - NB_COMPS + 注意コンポーネント VALUES - VALUES + 値 PREV_STEP - PREV_STEP + 前の手順 STEP - STEP + ステップ NEXT_STEP - NEXT_STEP + 次のステップ ADD_STEP - ADD_STEP + ステップを追加します。 STAMP - STAMP + スタンプ REMOVE_STEP - REMOVE_STEP + ステップを削除します。 FIELD_PREFIX - FIELD_PREFIX + フィールド: GEOM_NO_STUDY - GEOM_NO_STUDY + ない研究桁 NO_SHAPE - NO_SHAPE + 図形が選択されていません NO_FIELD - NO_FIELD + 選択されていないフィールド EMPTY_NAME - EMPTY_NAME + 空でないフィールド名を指定してください。 NO_VALUES - NO_VALUES + フィールドに追加手順なし SUB_SHAPE_HEADER - SUB_SHAPE_HEADER + SubShape WHOLE_SHAPE_VHEADER - WHOLE_SHAPE_VHEADER + オブジェクト + + + RENAME_COMPONENT + コンポーネントの名前変更 + + + COMPONENT_NAME + コンポーネント名 + + + WRN_NOT_SUBSHAPE + 選択した形状は主要な図形のサブ図形ではありません。適切な選択については、ビューアー内のすべての余分な図形を非表示します。 + + + ERR_STEP_EXISTS + そのIDのステップはすでに存在します。 @@ -5597,7 +6045,7 @@ MeasureGUI_PointDlg CAPTION - 点の座標 + 軸に目盛り付け COORDINATES @@ -5636,25 +6084,25 @@ SELECTED_FACES - フェース + 選択面 OperationGUI_FilletDlg SELECTED_EDGES - エッジ + 選択エッジ SELECTED_FACES - フェース + Faces RepairGUI_FreeBoundDlg CAPTION - フリー境界チェック + 自由境界をチェック FREE_BOUND @@ -5670,22 +6118,22 @@ NAME_CLOSED - NAME_CLOSED + Frontiere_Libre_Lermee_ %1 NAME_OPEN - NAME_OPEN + Frontiere_Libre_Ouverte_ %1 RepairGUI_GlueDlg FACES_FOR_GLUING_ARE_DETECTED - 固着できる%1 のフェースがあります。それらは赤で強調表示されます。\nこのメッセージボックスを閉じ、固着するフェースを選択してください。 + %1 の顔 (s) で強調表示された赤の色をピックアップするがあります。この警告ボックスを閉じるし、をピックアップする面を選択 EDGES_FOR_GLUING_ARE_DETECTED - %1 のエッジが固着できます。それらはスクリーン上で赤く表示されます。\nこのメッセージボックスを閉じ、固着エッジを選択して下さい。 + %1 のエッジ (s) で強調表示されている赤をピックアップするがあります。この警告ボックスを閉じるし、ピックアップするエッジを選択します。、 GLUE_FACES @@ -5728,7 +6176,7 @@ TIME_CONSUMING - このオプションを有効にすると、いくつかの形状入力に非常に時間のかかる操作になることがあります。\n続行しますか? + このオプションを有効にすると、特定のオブジェクトを時間の無駄が可能性があります。続行しますか。 @@ -5796,7 +6244,7 @@ OK_BTN - OK(&O) + わかりました(&O) CANCEL_BTN @@ -5819,11 +6267,11 @@ FRONT_FACE - FRONT_FACE + フロント パネル BACK_FACE - BACK_FACE + 背面の色 REFLECTION_0 @@ -5875,11 +6323,11 @@ QUE_CREATE_NEW_MATERIAL - 事前のプロパティを変更することはできません-defini.\nvoulez-あなたは材料を新しいを作成するか? + 定義済みのマテリアル プロパティを変更することはできません。新しいものを作成したいですか? QUE_REMOVE_MATERIAL - %1 の材料を削除しますか? + %1 のプロパティを削除しますか? OK_BTN @@ -5910,7 +6358,7 @@ MSG_SHARED_SHAPES_TOO_FEW_SHAPES - 十分なアイテムが選択されていない + 必要なアイテムが選択されていない GEOM_SHARED_SHAPE @@ -5933,11 +6381,11 @@ UNSELECT_ALL - すべての選択を解除(&n) + 全選択解除(&n) SELECT_ALL - すべて選択します。 + 全選択(&A) GEOM_PUBLISH_BTN @@ -5952,96 +6400,123 @@ RepairGUI_UnionFacesDlg GEOM_UNION_FACES_TITLE - GEOM_UNION_FACES_TITLE + 共有面 GEOM_UNION_FACES - GEOM_UNION_FACES + オブジェクト面の共有 UNION_FACES_NEW_OBJ_NAME - UNION_FACES_NEW_OBJ_NAME + UnionFaces GEOMGUI_CreationInfoWdg CREATION_INFO_TITLE - CREATION_INFO_TITLE + 情報 OPERATION - OPERATION + 操作 PARAMETER - PARAMETER + パラメーター VALUE - VALUE + 値 NO_INFO - NO_INFO + (有効情報なし) ImportExportGUI_ExportXAODlg GEOM_EXPORTXAO_TITLE - GEOM_EXPORTXAO_TITLE + エクスポートしました。 GEOM_EXPORTXAO - GEOM_EXPORTXAO + エクスポートしました。 GEOM_EXPORTXAO_EXPORTINGSHAPE - GEOM_EXPORTXAO_EXPORTINGSHAPE + オブジェクト GEOM_EXPORTXAO_FILENAME - GEOM_EXPORTXAO_FILENAME + ファイル GEOM_EXPORTXAO_AUTHOR - GEOM_EXPORTXAO_AUTHOR + 作成者 GEOM_EXPORTXAO_LGROUPS - GEOM_EXPORTXAO_LGROUPS + グループ GEOM_EXPORTXAO_LFIELDS - GEOM_EXPORTXAO_LFIELDS + フィールド + + + EXPORT_DLG_ACCEPT + OK ImportExportGUI_ImportXAODlg GEOM_IMPORTXAO_TITLE - GEOM_IMPORTXAO_TITLE + インポートしました。 GEOM_IMPORTXAO - GEOM_IMPORTXAO + インポートしました。 GEOM_IMPORTXAO_IMPORTINGSHAPE - GEOM_IMPORTXAO_IMPORTINGSHAPE + オブジェクト GEOM_IMPORTXAO_FILENAME - GEOM_IMPORTXAO_FILENAME + ファイル GEOM_IMPORTXAO_LGROUPS - GEOM_IMPORTXAO_LGROUPS + グループ GEOM_IMPORTXAO_LFIELDS - GEOM_IMPORTXAO_LFIELDS + フィールド + + + STEP + Step + + + + EntityGUI_IsolineDlg + + GEOM_ISOLINE_TITLE + 等高線の構築 + + + GEOM_ISOLINE + Isoline + + + GEOM_ISOLINE_U + U-Isoline + + + GEOM_ISOLINE_V + V-Isoline diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index bdf31b968..b334172ed 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -503,6 +503,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpDMWireframe: // MENU VIEW - WIREFRAME case GEOMOp::OpDMShading: // MENU VIEW - SHADING case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING + case GEOMOp::OpDMTexture: // MENU VIEW - TEXTURE case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL case GEOMOp::OpShowOnly: // MENU VIEW - DISPLAY ONLY case GEOMOp::OpShowOnlyChildren: // MENU VIEW - SHOW ONLY CHILDREN @@ -847,6 +848,11 @@ void GeometryGUI::createGeomAction( const int id, const QString& label, const QS void GeometryGUI::createOriginAndBaseVectors() { SalomeApp_Study* appStudy = dynamic_cast( application()->activeStudy() ); + bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked(); + if ( aLocked ) { + SUIT_MessageBox::warning ( application()->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") ); + return; + } if ( appStudy ) { _PTR(Study) studyDS = appStudy->studyDS(); if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) { @@ -1019,6 +1025,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpDMWireframe, "WIREFRAME" ); createGeomAction( GEOMOp::OpDMShading, "SHADING" ); createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" ); + createGeomAction( GEOMOp::OpDMTexture, "TEXTURE" ); createGeomAction( GEOMOp::OpShowAll, "DISPLAY_ALL" ); createGeomAction( GEOMOp::OpHideAll, "ERASE_ALL" ); createGeomAction( GEOMOp::OpShow, "DISPLAY" ); @@ -1291,6 +1298,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpDMWireframe, dispmodeId, -1 ); createMenu( GEOMOp::OpDMShading, dispmodeId, -1 ); createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 ); + createMenu( GEOMOp::OpDMTexture, dispmodeId, -1 ); createMenu( separator(), dispmodeId, -1 ); createMenu( GEOMOp::OpSwitchVectors, dispmodeId, -1 ); @@ -2663,6 +2671,11 @@ void GeometryGUI::storeVisualParameters (int savePoint) param = occParam + GEOM::propertyName( GEOM::Color ); ip->setParameter(entry, param.toStdString(), val.join( GEOM::subSectionSeparator()).toStdString()); } + + if (aProps.contains(GEOM::propertyName( GEOM::Texture ))) { + param = occParam + GEOM::propertyName( GEOM::Texture ); + ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Texture )).toString().toStdString()); + } if (vType == SVTK_Viewer::Type()) { if (aProps.contains(GEOM::propertyName( GEOM::Opacity ))) { @@ -2813,6 +2826,8 @@ void GeometryGUI::restoreVisualParameters (int savePoint) QColor c = QColor::fromRgbF(rgb[0].toDouble(), rgb[1].toDouble(), rgb[2].toDouble()); aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Color ), c); } + } else if (paramNameStr == GEOM::propertyName( GEOM::Texture )) { + aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Texture ), val ); } else if (paramNameStr == GEOM::propertyName( GEOM::EdgesDirection )) { aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1"); } else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) { diff --git a/src/GEOMGUI/GeometryGUI_Operations.h b/src/GEOMGUI/GeometryGUI_Operations.h index 965e9e445..304220b0b 100644 --- a/src/GEOMGUI/GeometryGUI_Operations.h +++ b/src/GEOMGUI/GeometryGUI_Operations.h @@ -68,6 +68,7 @@ namespace GEOMOp { OpDMWireframe = 2010, // MENU VIEW - DISPLAY MODE - WIREFRAME OpDMShading = 2011, // MENU VIEW - DISPLAY MODE - SHADING OpDMShadingWithEdges = 2012, // MENU VIEW - DISPLAY MODE - SHADING WITH EDGES + OpDMTexture = 2013, // MENU VIEW - DISPLAY MODE - TEXTURE OpShow = 2100, // POPUP MENU - SHOW OpShowOnly = 2101, // POPUP MENU - SHOW ONLY OpHide = 2102, // POPUP MENU - HIDE diff --git a/src/GEOMImpl/GEOMImpl_GlueDriver.cxx b/src/GEOMImpl/GEOMImpl_GlueDriver.cxx index c0ace0308..2e45e7ba5 100644 --- a/src/GEOMImpl/GEOMImpl_GlueDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_GlueDriver.cxx @@ -18,6 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include @@ -38,7 +39,6 @@ #include "utilities.h" #include -#include #include #include @@ -47,8 +47,6 @@ #include #include -#include - #include #include @@ -423,8 +421,7 @@ TopoDS_Shape GEOMImpl_GlueDriver::GlueWithWarnings (const TopoDS_Shape& theShape const Standard_Real theTolerance, const TopAbs_ShapeEnum theShapeType, const Standard_Boolean doKeepNonSolids, - TCollection_AsciiString& theWarning, - const TopTools_DataMapOfShapeShape& aCopyMap) const + TCollection_AsciiString& theWarning) const { TopoDS_Shape aRes; @@ -554,18 +551,10 @@ TopoDS_Shape GEOMImpl_GlueDriver::GlueWithWarnings (const TopoDS_Shape& theShape TDF_Label anArgumentHistoryLabel = aFunction->GetArgumentHistoryEntry(anArgumentRefLabel, Standard_True); - TopTools_ListOfShape aModified; for (Standard_Integer ie = 1; ie <= nbArgumentEntities; ie++) { TopoDS_Shape anEntity = anArgumentIndices.FindKey(ie); - if (aCopyMap.IsBound(anEntity)) { - anEntity = aCopyMap.Find(anEntity); - } - aModified = aGA.Modified(anEntity); + const TopTools_ListOfShape& aModified = aGA.Modified(anEntity); Standard_Integer nbModified = aModified.Extent(); - if (!nbModified && aResIndices.Contains(anEntity)) { - aModified.Append(anEntity); - nbModified = 1; - } if (nbModified > 0) { TDF_Label aWhatHistoryLabel = anArgumentHistoryLabel.FindChild(ie, Standard_True); @@ -754,35 +743,18 @@ Standard_Integer GEOMImpl_GlueDriver::Execute(TFunction_Logbook& log) const Standard_Boolean aKeepNonSolids = aCI.GetKeepNonSolids(); - // Copy initial shape to prevent its modification by gluing algorithm - TopoDS_Shape aShapeCopy; - TColStd_IndexedDataMapOfTransientTransient aMapTShapes; - TNaming_CopyShape::CopyTool(aShapeBase, aMapTShapes, aShapeCopy); - // - // map sub-shapes - TopTools_IndexedMapOfShape aShapeBase_inds, aShapeCopy_inds; - TopTools_DataMapOfShapeShape aCopyMap; - Standard_Integer aNbInd, i; - // - TopExp::MapShapes(aShapeBase, aShapeBase_inds); - TopExp::MapShapes(aShapeCopy, aShapeCopy_inds); - // - aNbInd = aShapeBase_inds.Extent(); - for (i = 1; i <= aNbInd; ++i) { - aCopyMap.Bind(aShapeBase_inds(i), aShapeCopy_inds(i)); - } - // if (aType == GLUE_FACES) { - aShape = GlueWithWarnings(aShapeCopy, tol3d, TopAbs_FACE, aKeepNonSolids, aWrn, aCopyMap); + //aShape = GlueFacesWithWarnings(aShapeBase, tol3d, aKeepNonSolids, aWrn); + aShape = GlueWithWarnings(aShapeBase, tol3d, TopAbs_FACE, aKeepNonSolids, aWrn); } else if (aType == GLUE_EDGES) { - aShape = GlueWithWarnings(aShapeCopy, tol3d, TopAbs_EDGE, aKeepNonSolids, aWrn, aCopyMap); + aShape = GlueWithWarnings(aShapeBase, tol3d, TopAbs_EDGE, aKeepNonSolids, aWrn); } else if (aType == GLUE_FACES_BY_LIST || aType == GLUE_EDGES_BY_LIST) { Handle(TColStd_HSequenceOfTransient) SF = aCI.GetFaces(); TopTools_MapOfShape aFaces; - - for (i = 1; i <= SF->Length(); i++) { + int i = 1; + for (; i <= SF->Length(); i++) { Handle(Standard_Transient) anItem = SF->Value(i); if (anItem.IsNull()) continue; @@ -792,14 +764,7 @@ Standard_Integer GEOMImpl_GlueDriver::Execute(TFunction_Logbook& log) const TopoDS_Shape aFace = aRefSh->GetValue(); if (aFace.IsNull()) continue; - - // get copy of face to correspond to aShapeCopy - if (aShapeBase_inds.Contains(aFace)) { - int ind = aShapeBase_inds.FindIndex(aFace); - aFace = aShapeCopy_inds.FindKey(ind); - - aFaces.Add(aFace); - } + aFaces.Add(aFace); } Standard_Boolean aGlueAllEdges = Standard_False; @@ -807,7 +772,7 @@ Standard_Integer GEOMImpl_GlueDriver::Execute(TFunction_Logbook& log) const aGlueAllEdges = aCI.GetGlueAllEdges(); //aShape = GlueFacesByList(aShapeBase, tol3d, aKeepNonSolids, aFaces); - aShape = GlueByList(aShapeCopy, tol3d, aKeepNonSolids, aFaces, aGlueAllEdges); + aShape = GlueByList(aShapeBase, tol3d, aKeepNonSolids, aFaces, aGlueAllEdges); } if (aShape.IsNull()) return 0; diff --git a/src/GEOMImpl/GEOMImpl_GlueDriver.hxx b/src/GEOMImpl/GEOMImpl_GlueDriver.hxx index 6e0c60bbb..1e1a3100e 100644 --- a/src/GEOMImpl/GEOMImpl_GlueDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_GlueDriver.hxx @@ -48,7 +48,7 @@ #endif #include -#include + #ifndef _TFunction_Driver_HeaderFile #include @@ -104,8 +104,7 @@ Standard_EXPORT TopoDS_Shape GlueWithWarnings (const TopoDS_Shape& theShape, const Standard_Real theTolerance, const TopAbs_ShapeEnum theShapeType, const Standard_Boolean doKeepNonSolids, - TCollection_AsciiString& theWarning, - const TopTools_DataMapOfShapeShape& aCopyMap) const; + TCollection_AsciiString& theWarning) const; Standard_EXPORT static TopoDS_Shape GlueByList (const TopoDS_Shape& theShape, const Standard_Real theTolerance, diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx index 2879a1b9f..aaa0b4ed8 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx @@ -60,6 +60,7 @@ #include #include #include +#include #include #include #include @@ -85,6 +86,7 @@ #include #include +#include #include @@ -1551,40 +1553,116 @@ TCollection_AsciiString GEOMImpl_IMeasureOperations::WhatIs (Handle(GEOM_Object) * AreCoordsInside */ //============================================================================= -std::vector GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Object) theShape, - const std::vector& coords, - double tolerance) +std::vector +GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Object) theShape, + const std::vector& coords, + double tolerance) { - std::vector res; + std::vector isInsideRes; if (!theShape.IsNull()) { Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (!aRefShape.IsNull()) { TopoDS_Shape aShape = aRefShape->GetValue(); - if (!aShape.IsNull()) { - unsigned int nb_points = coords.size()/3; - for (int i = 0; i < nb_points; i++) { - double x = coords[3*i]; - double y = coords[3*i+1]; - double z = coords[3*i+2]; - gp_Pnt aPnt(x, y, z); - if ( aShape.ShapeType() == TopAbs_COMPOUND || aShape.ShapeType() == TopAbs_COMPSOLID || - aShape.ShapeType() == TopAbs_SOLID ) { - TopExp_Explorer anExp; - bool isFound = false; - for ( anExp.Init( aShape, TopAbs_SOLID ); anExp.More() && !isFound; anExp.Next() ) { - BRepClass3d_SolidClassifier SC( anExp.Current() ); + if (!aShape.IsNull()) + { + TopTools_IndexedMapOfShape mapShape; + { + TopExp_Explorer anExp; + for ( anExp.Init( aShape, TopAbs_SOLID ); anExp.More(); anExp.Next() ) + mapShape.Add( anExp.Current() ); + for ( anExp.Init( aShape, TopAbs_FACE, TopAbs_SOLID ); anExp.More(); anExp.Next() ) + mapShape.Add( anExp.Current() ); + for ( anExp.Init( aShape, TopAbs_EDGE, TopAbs_FACE ); anExp.More(); anExp.Next() ) + mapShape.Add( anExp.Current() ); + for ( anExp.Init( aShape, TopAbs_VERTEX, TopAbs_EDGE ); anExp.More(); anExp.Next() ) + mapShape.Add( anExp.Current() ); //// ????????? + } + size_t nb_points = coords.size()/3, nb_points_inside = 0; + isInsideRes.resize( nb_points, false ); + + for ( int iS = 1; iS <= mapShape.Extent(); ++iS ) + { + if ( nb_points_inside == nb_points ) + break; + aShape = mapShape( iS ); + switch ( aShape.ShapeType() ) { + case TopAbs_SOLID: + { + BRepClass3d_SolidClassifier SC( TopoDS::Solid( aShape )); + for ( size_t i = 0; i < nb_points; i++) + { + if ( isInsideRes[ i ]) continue; + gp_Pnt aPnt( coords[3*i], coords[3*i+1], coords[3*i+2] ); SC.Perform( aPnt, tolerance ); - isFound = ( SC.State() == TopAbs_IN ) || ( SC.State() == TopAbs_ON ); + isInsideRes[ i ] = (( SC.State() == TopAbs_IN ) || ( SC.State() == TopAbs_ON )); + nb_points_inside += isInsideRes[ i ]; } - res.push_back( isFound ); + break; } - else - res.push_back( false ); + case TopAbs_FACE: + { + Standard_Real u1,u2,v1,v2; + const TopoDS_Face& face = TopoDS::Face( aShape ); + Handle(Geom_Surface) surf = BRep_Tool::Surface( face ); + surf->Bounds( u1,u2,v1,v2 ); + GeomAPI_ProjectPointOnSurf project; + project.Init(surf, u1,u2, v1,v2, tolerance ); + for ( size_t i = 0; i < nb_points; i++) + { + if ( isInsideRes[ i ]) continue; + gp_Pnt aPnt( coords[3*i], coords[3*i+1], coords[3*i+2] ); + project.Perform( aPnt ); + if ( project.IsDone() && + project.NbPoints() > 0 && + project.LowerDistance() <= tolerance ) + { + Quantity_Parameter u, v; + project.LowerDistanceParameters(u, v); + gp_Pnt2d uv( u, v ); + BRepClass_FaceClassifier FC ( face, uv, tolerance ); + isInsideRes[ i ] = (( FC.State() == TopAbs_IN ) || ( FC.State() == TopAbs_ON )); + nb_points_inside += isInsideRes[ i ]; + } + } + break; + } + case TopAbs_EDGE: + { + Standard_Real f,l; + const TopoDS_Edge& edge = TopoDS::Edge( aShape ); + Handle(Geom_Curve) curve = BRep_Tool::Curve( edge, f, l ); + GeomAPI_ProjectPointOnCurve project; + project.Init( curve, f, l ); + for ( size_t i = 0; i < nb_points; i++) + { + if ( isInsideRes[ i ]) continue; + gp_Pnt aPnt( coords[3*i], coords[3*i+1], coords[3*i+2] ); + project.Perform( aPnt ); + isInsideRes[ i ] = ( project.NbPoints() > 0 && + project.LowerDistance() <= tolerance ); + nb_points_inside += isInsideRes[ i ]; + } + break; + } + case TopAbs_VERTEX: + { + gp_Pnt aVPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape )); + for ( size_t i = 0; i < nb_points; i++) + { + if ( isInsideRes[ i ]) continue; + gp_Pnt aPnt( coords[3*i], coords[3*i+1], coords[3*i+2] ); + isInsideRes[ i ] = ( aPnt.SquareDistance( aVPnt ) <= tolerance * tolerance ); + nb_points_inside += isInsideRes[ i ]; + } + break; + } + default:; + } // switch ( aShape.ShapeType() ) } } } } - return res; + return isInsideRes; } //============================================================================= @@ -1592,10 +1670,15 @@ std::vector GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Objec * GetMinDistance */ //============================================================================= -Standard_Real GEOMImpl_IMeasureOperations::GetMinDistance - (Handle(GEOM_Object) theShape1, Handle(GEOM_Object) theShape2, - Standard_Real& X1, Standard_Real& Y1, Standard_Real& Z1, - Standard_Real& X2, Standard_Real& Y2, Standard_Real& Z2) +Standard_Real +GEOMImpl_IMeasureOperations::GetMinDistance (Handle(GEOM_Object) theShape1, + Handle(GEOM_Object) theShape2, + Standard_Real& X1, + Standard_Real& Y1, + Standard_Real& Z1, + Standard_Real& X2, + Standard_Real& Y2, + Standard_Real& Z2) { SetErrorCode(KO); Standard_Real MinDist = 1.e9; diff --git a/src/GEOMImpl/GEOMImpl_TranslateDriver.cxx b/src/GEOMImpl/GEOMImpl_TranslateDriver.cxx index 693111163..a25a16004 100644 --- a/src/GEOMImpl/GEOMImpl_TranslateDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_TranslateDriver.cxx @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -175,10 +176,7 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const Handle(GEOM_Function) aVector = TI.GetVector(); gp_Vec Vec = gp::DX(); if (!aVector.IsNull()) { - TopoDS_Shape aV = aVector->GetValue(); - if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0; - TopoDS_Edge anEdge = TopoDS::Edge(aV); - Vec = gp_Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge))); + Vec = GEOMUtils::GetVector( aVector->GetValue(), Standard_False ); Vec.Normalize(); } @@ -211,18 +209,12 @@ Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const gp_Vec Vec2 = gp::DY(); if (!aVector.IsNull()) { - TopoDS_Shape aV = aVector->GetValue(); - if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0; - TopoDS_Edge anEdge = TopoDS::Edge(aV); - Vec1 = gp_Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge))); + Vec1 = GEOMUtils::GetVector( aVector->GetValue(), Standard_False ); Vec1.Normalize(); } if (!aVector2.IsNull()) { - TopoDS_Shape aV = aVector2->GetValue(); - if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0; - TopoDS_Edge anEdge = TopoDS::Edge(aV); - Vec2 = gp_Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge))); + Vec2 = GEOMUtils::GetVector( aVector2->GetValue(), Standard_False ); Vec2.Normalize(); } diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index f774f3000..8ac38a4bb 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -725,8 +725,8 @@ bool GEOMToolsGUI::Import() app->putInfo( tr( "GEOM_PRP_LOADING" ).arg( SUIT_Tools::file( fileName, /*withExten=*/true ) ) ); anOp->start(); - CORBA::String_var fileN = fileName.toLatin1().constData(); - CORBA::String_var fileT = aCurrentType.toLatin1().constData(); + CORBA::String_var fileN = fileName.toUtf8().constData(); + CORBA::String_var fileT = aCurrentType.toUtf8().constData(); // jfa 21.08.2012 for mantis issue 21511 (STEP file units) CORBA::String_var aUnits = aInsOp->ReadValue(fileN, fileT, "LEN_UNITS"); @@ -945,7 +945,7 @@ bool GEOMToolsGUI::Export() anOp->start(); - aInsOp->Export( anObj, file.toStdString().c_str(), fileType.toLatin1().constData() ); + aInsOp->Export( anObj, file.toUtf8().constData(), fileType.toUtf8().constData() ); if (aInsOp->IsDone()) anOp->commit(); diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx index eb95c26bc..d557d098c 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx @@ -298,9 +298,9 @@ void GEOMToolsGUI::OnTexture() QString aTexture = QFileDialog::getOpenFileName( dynamic_cast< SUIT_ViewWindow* >( window ),tr("GEOM_SELECT_IMAGE"),QString(), tr("OCC_TEXTURE_FILES")); if( !aTexture.isEmpty() ) { - displayer.SetTexture( aTexture.toStdString() ); for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { Handle( SALOME_InteractiveObject ) io = It.Value(); + appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::Texture ), aTexture ); appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::DisplayMode ), 3 ); if ( window->isVisible( io ) ) displayer.Redisplay( io, false ); } diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc index 29aa20836..ff48a03e9 100644 --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -42,6 +42,7 @@ #include "GEOM_PythonDump.hxx" #include "GEOMImpl_Types.hxx" #include "GEOMImpl_CopyDriver.hxx" +#include "GEOMImpl_IInsertOperations.hxx" #include "GEOM_wrap.hxx" // Cascade headers @@ -240,10 +241,9 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, CORBA::String_var aGeomObjIOR = _orb->object_to_string(theObject); aResultSO->SetAttrString("AttributeIOR",aGeomObjIOR); - TCollection_AsciiString anObjectName("Shape_"); + TCollection_AsciiString anObjectName, aNamePrefix("Shape_"); // BEGIN: try to find existed name for current shape - bool HasName = false; if ( !aShape->_is_nil() ) { // recieve current TopoDS shape @@ -263,7 +263,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, // check all named shapes using iterator TDF_ChildIDIterator anIt (aMainLbl, TNaming_NamedShape::GetID(), Standard_True); - for (; anIt.More() && !HasName; anIt.Next()) { + for (; anIt.More() && anObjectName.IsEmpty(); anIt.Next()) { Handle(TNaming_NamedShape) anAttr = Handle(TNaming_NamedShape)::DownCast(anIt.Value()); if (anAttr.IsNull()) continue; @@ -271,10 +271,8 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, if (S.IsEqual(TopoSh)) { TDF_Label L = anAttr->Label(); Handle(TDataStd_Name) aName; - if (L.FindAttribute(TDataStd_Name::GetID(), aName)) { + if (L.FindAttribute(TDataStd_Name::GetID(), aName)) anObjectName = aName->Get(); - HasName = true; - } } } } @@ -286,32 +284,32 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, switch ( (TopAbs_ShapeEnum)anOp->GetType( aShape )) { case TopAbs_VERTEX: aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_PNT" ); - anObjectName = "Group_Of_Vertices_"; + aNamePrefix = "Group_Of_Vertices_"; break; case TopAbs_EDGE: aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_EDGE"); - anObjectName = "Group_Of_Edges_"; + aNamePrefix = "Group_Of_Edges_"; break; case TopAbs_FACE: aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_FACE"); - anObjectName = "Group_Of_Faces_"; + aNamePrefix = "Group_Of_Faces_"; break; case TopAbs_SOLID: aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_SOLID"); - anObjectName = "Group_Of_Solids_"; + aNamePrefix = "Group_Of_Solids_"; break; } } else if ( mytype == GEOM_MARKER ) { aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_LCS"); - anObjectName = "LocalCS_"; + aNamePrefix = "LocalCS_"; } else if ( mytype > ADVANCED_BASE ) { char buf[20]; sprintf( buf, "%d", aBaseObj->GetType() ); std::string advId = "ICON_OBJBROWSER_ADVANCED_"; advId += buf; aResultSO->SetAttrString("AttributePixMap",advId.c_str()); - anObjectName = "Advanced_"; + aNamePrefix = "Advanced_"; } else if ( mytype == GEOM_FIELD ) { - anObjectName = "Field_"; + aNamePrefix = "Field_"; GEOM::GEOM_Field_var aField = GEOM::GEOM_Field::_narrow(theObject); if ( !aField->_is_nil() ) switch( aField->GetDimension() ) { @@ -327,38 +325,38 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_FIELD_SOLID"); } } else if ( mytype == GEOM_FIELD_STEP ) { - anObjectName = "Step_"; + aNamePrefix = "Step_"; } else if ( !aShape->_is_nil() ) { GEOM::shape_type myshapetype=aShape->GetShapeType(); if ( myshapetype == GEOM::COMPOUND ) { aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPOUND" ); - anObjectName = "Compound_"; + aNamePrefix = "Compound_"; } else if ( myshapetype == GEOM::COMPSOLID ) { aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPSOLID"); - anObjectName = "Compsolid_"; + aNamePrefix = "Compsolid_"; } else if ( myshapetype == GEOM::SOLID ) { aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SOLID"); - anObjectName = "Solid_"; + aNamePrefix = "Solid_"; } else if ( myshapetype == GEOM::SHELL ) { aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SHELL"); - anObjectName = "Shell_"; + aNamePrefix = "Shell_"; } else if ( myshapetype == GEOM::FACE ) { aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_FACE"); - anObjectName = "Face_"; + aNamePrefix = "Face_"; } else if ( myshapetype == GEOM::WIRE ) { aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_WIRE"); - anObjectName = "Wire_"; + aNamePrefix = "Wire_"; } else if ( myshapetype == GEOM::EDGE ) { aResultSO->SetAttrString("AttributePixMap", "ICON_OBJBROWSER_EDGE"); - anObjectName = "Edge_"; + aNamePrefix = "Edge_"; } else if ( myshapetype == GEOM::VERTEX ) { aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_VERTEX" ); - anObjectName = "Vertex_"; + aNamePrefix = "Vertex_"; } } - if (!HasName) + if ( anObjectName.IsEmpty() ) { - //if (strlen(theName) == 0) anObjectName += TCollection_AsciiString(aResultSO->Tag()); + //if (strlen(theName) == 0) aNamePrefix += TCollection_AsciiString(aResultSO->Tag()); //else anObjectName = TCollection_AsciiString(CORBA::string_dup(theName)); // asv : 11.11.04 Introducing a more sofisticated method of name creation, just as @@ -368,16 +366,15 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, if ( strlen( theName ) == 0 ) { // MOST PROBABLY CALLED FROM BATCHMODE OR SUPERVISOR int i = 0; // (WITH EMPTY NEW NAME) SALOMEDS::SObject_var obj; - TCollection_AsciiString aNewObjectName; do { - aNewObjectName = anObjectName + TCollection_AsciiString(++i); - obj = theStudy->FindObject( aNewObjectName.ToCString() ); + anObjectName = aNamePrefix + TCollection_AsciiString(++i); + obj = theStudy->FindObject( anObjectName.ToCString() ); } while ( !obj->_is_nil() ); - anObjectName = aNewObjectName; } - else // MOST PROBABLY CALLED FROM GEOM GUI (ALREADY WITH VALID NAME) + else { // MOST PROBABLY CALLED FROM GEOM GUI (ALREADY WITH VALID NAME) anObjectName = theName; + } } //Set the study entry as a name of the published GEOM_Object @@ -750,6 +747,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream, // Find the current Study and StudyBuilder SALOMEDS::Study_var aStudy = theObject->GetStudy(); SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + SALOMEDS::UseCaseBuilder_var anUseCaseBuilder = aStudy->GetUseCaseBuilder(); SALOMEDS::SObject_var aNewSO; // Retrieve a TopoDS_Shape from byte stream TopoDS_Shape aTopology; @@ -786,6 +784,10 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream, anIOR->SetValue(objStr.in()); anIOR->UnRegister(); + // add object to the use case tree + // (to support tree representation customization and drag-n-drop) + anUseCaseBuilder->AppendTo( aNewSO->GetFather(), aNewSO ); + // Return the created in the Study SObject return aNewSO._retn(); } @@ -2905,11 +2907,11 @@ Engines::ListOfIdentifiers* GEOM_Gen_i::importData( if (aFileName.rfind("/") != std::string::npos) { // remove folders from the name aFileName = aFileName.substr(aFileName.rfind("/") + 1); } + std::string anExtension(data->extension()); aFileName += "." + anExtension; // convert extension to upper case std::transform(anExtension.begin(), anExtension.end(), anExtension.begin(), ::toupper); - std::string aFullPath = aTmpDir + aFileName; Engines::TMPFile* aFileStream = data->get(); @@ -2922,16 +2924,30 @@ Engines::ListOfIdentifiers* GEOM_Gen_i::importData( aFile.write(aBuffer, aFileStream->length()); aFile.close(); - GEOM::GEOM_Object_var anObj = aInsOp->ImportFile(aFullPath.c_str(), anExtension.c_str()); - if ( !anObj->_is_nil() && aInsOp->IsDone() ) { - SALOMEDS::SObject_var aSO = PublishInStudy(aStudy, SALOMEDS::SObject::_nil(), anObj, data->name()); - aResult->length(1); + GEOM::GEOM_Object_var aShapeObj; + GEOM::ListOfGO_var aSubShape = new GEOM::ListOfGO; + GEOM::ListOfGO_var aGroups = new GEOM::ListOfGO; + GEOM::ListOfFields_var aFields = new GEOM::ListOfFields; + + CORBA::Boolean isResultOK = aInsOp->ImportXAO(aFullPath.c_str(), aShapeObj.out(), aSubShape.out(), aGroups.out(), aFields.out()); + + if ( isResultOK && !aShapeObj->_is_nil() && aInsOp->IsDone() ) { + SALOMEDS::SObject_var aSO = PublishInStudy(aStudy, SALOMEDS::SObject::_nil(), aShapeObj, aShapeObj->GetName()); + aResult->length(aGroups->length() + 1); aResult[0] = aSO->GetID(); // unioque identifer of the object in GEOM is entry of SObject - } else { - if (anObj->_is_nil()) + //Iteration for objects of the group. + for (int i = 0; i < aGroups->length(); i++) { + SALOMEDS::SObject_var aSOChild = AddInStudy(aStudy, aGroups[i], aGroups[i]->GetName(), aShapeObj); + aResult[i+1] = aSOChild->GetID(); + } + } + else { + if (aShapeObj->_is_nil()) MESSAGE("Result of the import operation is incorrect for file "<IsDone()) MESSAGE("Import operation is not done for file "<DocumentModified(studyId, false); return aResult._retn(); } @@ -2965,10 +2981,16 @@ Engines::ListOfData* GEOM_Gen_i::getModifiedData(CORBA::Long studyId) if (CORBA::is_nil(aComponent)) return aResult._retn(); SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(aComponent); // check only published shapes - TopoDS_Compound aResultComp; - BRep_Builder aBB; - aBB.MakeCompound(aResultComp); - int aNumInComp = 0; // number of shapes in resulting compound + + GEOM::GEOM_Object_var shapeObj; + GEOM::ListOfGO_var groups = new GEOM::ListOfGO; + GEOM::ListOfFields_var fields = new GEOM::ListOfFields; + std::string anAuthorName = "SIMAN Author"; + + GEOM::GEOM_IShapesOperations_var aShapesOp = GetIShapesOperations(aStudy->StudyId()); + GEOM::GEOM_IInsertOperations_var aInsOp = GetIInsertOperations(aStudy->StudyId()); + + int aSeqLength = 0; // the sequence length for(; anIter->More(); anIter->Next()) { SALOMEDS::SObject_var aSO = anIter->Value(); SALOMEDS::SObject_var aRefSO; @@ -2979,30 +3001,42 @@ Engines::ListOfData* GEOM_Gen_i::getModifiedData(CORBA::Long studyId) GEOM::GEOM_Object_var aCORBAMainShape = GEOM::GEOM_Object::_narrow(anObj); if(!aCORBAMainShape->_is_nil()) { CORBA::String_var entry = aCORBAMainShape->GetEntry(); - Handle(GEOM_Object) aMainShape = Handle(GEOM_Object)::DownCast( _impl->GetObject(studyId, entry) ); - if (!aMainShape.IsNull()) { - TopoDS_Shape aMainSh = aMainShape->GetValue(); - if (!aMainSh.IsNull()) { - aBB.Add(aResultComp, aMainSh); - aNumInComp++; + Handle(GEOM_Object) aMainShape = Handle(GEOM_Object)::DownCast(_impl->GetObject(studyId, entry)); + + GEOM::shape_type aCORBAShapeType = aCORBAMainShape->GetShapeType(); + if (!aMainShape.IsNull() && !(aCORBAShapeType == GEOM::VERTEX) && !(aCORBAShapeType == GEOM::EDGE)) { + aSeqLength++; + shapeObj = aCORBAMainShape; + if (aShapesOp->_is_nil()) { + MESSAGE("No shapes operations!"); + return aResult._retn(); } + groups = aShapesOp->GetExistingSubObjects(aCORBAMainShape, true); + break; } } } } } - if (aNumInComp > 0) { // compund is correct, write it to the temporary file - std::string aFullPath = Kernel_Utils::GetTmpFileName() + ".brep"; - BRepTools::Write(aResultComp, aFullPath.c_str()); - MESSAGE("Write compound of "<_is_nil()) { + MESSAGE("No insert operations!"); + return aResult._retn(); + } + + if (aSeqLength > 0) { // Shape is correct, write it to the temporary file + + std::string aFullXaoPath = Kernel_Utils::GetTmpFileName() + ".xao"; + CORBA::Boolean isResultOK = aInsOp->ExportXAO(shapeObj.in(), groups.in(), fields.in(), anAuthorName.c_str(), aFullXaoPath.c_str()); + aResult->length(1); Engines::DataContainer_var aData = (new Engines_DataContainer_i( - aFullPath.c_str(), "", "", true))->_this(); + aFullXaoPath.c_str(), "", "", true))->_this(); aResult[0] = aData; } else { MESSAGE("No shapes to export"); } - + return aResult._retn(); } diff --git a/src/GroupGUI/GroupGUI_GroupDlg.cxx b/src/GroupGUI/GroupGUI_GroupDlg.cxx index 2bb576966..31bef761a 100644 --- a/src/GroupGUI/GroupGUI_GroupDlg.cxx +++ b/src/GroupGUI/GroupGUI_GroupDlg.cxx @@ -674,10 +674,57 @@ void GroupGUI_GroupDlg::showOnlySelected() Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO"); if (view->isVisible(io)) myIsHiddenMain = true; - } + + //keep the selected entry and IO in the map for checking + std::map aSelEntriesMap; + SALOME_ListIteratorOfListIO aSelIt(aSelList); + for ( ; aSelIt.More(); aSelIt.Next() ) { + Handle(SALOME_InteractiveObject) anSelIO = aSelIt.Value(); + aSelEntriesMap[anSelIO->getEntry()] = anSelIO; + } + //get the displayed sub-shapes + SALOME_ListIO displayed; + view->GetVisible(displayed); + // Erase all, except the selected sub-shapes + std::map::iterator + aSelDispIter = aSelEntriesMap.end(); + SALOME_ListIteratorOfListIO aDispIt( displayed ); + for ( ; aDispIt.More(); aDispIt.Next() ) { + Handle(SALOME_InteractiveObject) anIO = aDispIt.Value(); + aSelDispIter = aSelEntriesMap.find( anIO->getEntry() ); + if ( aSelDispIter != aSelEntriesMap.end() ) { + //sub-shape is selected, so erase it's record from map to keep in it not displayed, but selected sub-shapes only + aSelEntriesMap.erase(aSelDispIter); + } else { + //sub-shape is not in the map of selected, then erase it from view + aDisplayer->Erase( anIO, /*forced = */false, /*updateViewer = */false ); + } + } - aDisplayer->EraseAll(/*forced = false, updateViewer = true*/); - aDisplayer->Display(aSelList, true); + if ( !aSelEntriesMap.empty() ) { + // Build a presentation of the selected, but not displayed sub-shapes + TopoDS_Shape aMainShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), myMainObj); + TopTools_IndexedMapOfShape aSubShapesMap; + TopExp::MapShapes(aMainShape, aSubShapesMap); + QString anEntryBase = aMainEntry.in(); + + TopExp_Explorer anExp (aMainShape, getShapeType()); + for (; anExp.More(); anExp.Next()) { + TopoDS_Shape aSubShape = anExp.Current(); + int index = aSubShapesMap.FindIndex(aSubShape); + QString anEntry = QString( "TEMP_" ) + anEntryBase + QString("_%1").arg(index); + if ( aSelEntriesMap.find( anEntry ) == aSelEntriesMap.end() ) { + //skip not selected sub-shapes + continue; + } + SALOME_Prs* aPrs = aDisplayer->buildSubshapePresentation(aSubShape, anEntry, view); + if (aPrs) { + displayPreview(aPrs, true, false); // append, do not update + } + } + } + aDisplayer->UpdateViewer(); + } // Mantis issue 0021421: do not hide main shape, if explode on VERTEX if (getShapeType() == TopAbs_VERTEX && myIsHiddenMain) { diff --git a/src/MeasureGUI/MeasureGUI_AngleDlg.cxx b/src/MeasureGUI/MeasureGUI_AngleDlg.cxx index afb373a9d..8dfeeea01 100644 --- a/src/MeasureGUI/MeasureGUI_AngleDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_AngleDlg.cxx @@ -347,7 +347,7 @@ SALOME_Prs* MeasureGUI_AngleDlg::buildPrs() gce_MakePln gce_MP(aP11, aP12, aP3); Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP.Value()); - Handle(AIS_AngleDimension) anIO = new AIS_AngleDimension( anEdge1, anEdge2, aPlane->Pln() ); + Handle(AIS_AngleDimension) anIO = new AIS_AngleDimension( anEdge1, anEdge2 ); Handle(Prs3d_DimensionAspect) aDimensionStyle = new Prs3d_DimensionAspect; diff --git a/src/OBJECT/GEOM_Constants.cxx b/src/OBJECT/GEOM_Constants.cxx index 95a5840c2..8b89a773f 100644 --- a/src/OBJECT/GEOM_Constants.cxx +++ b/src/OBJECT/GEOM_Constants.cxx @@ -95,6 +95,8 @@ namespace GEOM "IsosColor", // - // outlines color "OutlineColor", // - + // texture + "Texture", // - }; return ( type >= GEOM::Visibility && type <= GEOM::LastProperty ) ? names[type] : QString(); } diff --git a/src/OBJECT/GEOM_Constants.h b/src/OBJECT/GEOM_Constants.h index 19b0c514f..aee0709b4 100644 --- a/src/OBJECT/GEOM_Constants.h +++ b/src/OBJECT/GEOM_Constants.h @@ -54,7 +54,8 @@ namespace GEOM PointColor, IsosColor, OutlineColor, - LastProperty = OutlineColor, + Texture, + LastProperty = Texture, }; GEOM_OBJECT_EXPORT double minDeflection(); diff --git a/src/ShapeRecognition/ShapeRec_FeatureDetector.cxx b/src/ShapeRecognition/ShapeRec_FeatureDetector.cxx index b452a9c67..2bf97cb55 100644 --- a/src/ShapeRecognition/ShapeRec_FeatureDetector.cxx +++ b/src/ShapeRecognition/ShapeRec_FeatureDetector.cxx @@ -59,14 +59,16 @@ void ShapeRec_FeatureDetector::SetPath( const std::string& thePath ) { IplImage* src = cvLoadImage(imagePath.c_str(),CV_LOAD_IMAGE_COLOR); imgHeight = src->height; - imgWidth = src->width; + imgWidth = src->width; + cvReleaseImage(&src); } } /*! Computes the corners of the image located at imagePath */ -void ShapeRec_FeatureDetector::ComputeCorners( bool useROI, ShapeRec_Parameters* parameters ){ +void ShapeRec_FeatureDetector::ComputeCorners( bool useROI, ShapeRec_Parameters* parameters ) +{ ShapeRec_CornersParameters* aCornersParameters = dynamic_cast( parameters ); if ( !aCornersParameters ) aCornersParameters = new ShapeRec_CornersParameters(); @@ -105,8 +107,8 @@ void ShapeRec_FeatureDetector::ComputeCorners( bool useROI, ShapeRec_Parameters* /*! Computes the contours of the image located at imagePath */ -bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters* parameters ){ - +bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters* parameters ) +{ // Initialising images cv::Mat src, src_gray; cv::Mat detected_edges; @@ -135,40 +137,44 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters } else //COLORFILTER { - IplImage* find_image = cvLoadImage(imagePath.c_str(),CV_LOAD_IMAGE_COLOR); + // Load the input image where we want to detect contours + IplImage* input_image = cvLoadImage(imagePath.c_str(),CV_LOAD_IMAGE_COLOR); ShapeRec_ColorFilterParameters* aColorFilterParameters = dynamic_cast( parameters ); if ( !aColorFilterParameters ) aColorFilterParameters = new ShapeRec_ColorFilterParameters(); // Reduce noise - cvSmooth( find_image, find_image, CV_GAUSSIAN, aColorFilterParameters->smoothSize, aColorFilterParameters->smoothSize ); + cvSmooth( input_image, input_image, CV_GAUSSIAN, aColorFilterParameters->smoothSize, aColorFilterParameters->smoothSize ); - // Crop the image to build an histogram from the selected part - cvSetImageROI(find_image, rect); - IplImage* test_image = cvCreateImage(cvGetSize(find_image), - find_image->depth, - find_image->nChannels); - cvCopy(find_image, test_image, NULL); - cvResetImageROI(find_image); + // Crop the image to the selected part only (sample_image) + cvSetImageROI(input_image, rect); + IplImage* sample_image = cvCreateImage(cvGetSize(input_image), + input_image->depth, + input_image->nChannels); + cvCopy(input_image, sample_image, NULL); + cvResetImageROI(input_image); - IplImage* test_hsv = cvCreateImage(cvGetSize(test_image),8,3); - IplImage* h_plane = cvCreateImage( cvGetSize(test_image), 8, 1 ); - IplImage* s_plane = cvCreateImage( cvGetSize(test_image), 8, 1 ); - CvHistogram* hist; + IplImage* sample_hsv = cvCreateImage( cvGetSize(sample_image),8,3 ); + IplImage* sample_h_plane = cvCreateImage( cvGetSize(sample_image), 8, 1 ); + IplImage* sample_s_plane = cvCreateImage( cvGetSize(sample_image), 8, 1 ); + CvHistogram* sample_hist; - cvCvtColor(test_image, test_hsv, CV_BGR2HSV); + cvCvtColor(sample_image, sample_hsv, CV_BGR2HSV); - cvCvtPixToPlane(test_hsv, h_plane, s_plane, 0, 0); - IplImage* planes[] = { h_plane, s_plane }; + cvCvtPixToPlane(sample_hsv, sample_h_plane, sample_s_plane, 0, 0); + IplImage* sample_planes[] = { sample_h_plane, sample_s_plane }; - //create hist + // Create the hue / saturation histogram of the SAMPLE image. + // This histogramm will be representative of what is the zone + // we want to find the frontier of. Indeed, the sample image is meant to + // be representative of this zone float hranges[] = { 0, 180 }; float sranges[] = { 0, 256 }; float* ranges[] = { hranges, sranges }; - hist = cvCreateHist( 2, aColorFilterParameters->histSize, aColorFilterParameters->histType, ranges ); + sample_hist = cvCreateHist( 2, aColorFilterParameters->histSize, aColorFilterParameters->histType, ranges ); //calculate hue /saturation histogram - cvCalcHist(planes, hist, 0 ,0); + cvCalcHist(sample_planes, sample_hist, 0 ,0); // // TEST print of the histogram for debugging // IplImage* hist_image = cvCreateImage(cvSize(320,300),8,3); @@ -194,18 +200,37 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters // cvNamedWindow("hist", 1); cvShowImage("hist",hist_image); - //calculate back projection of hue and saturation planes of input image - IplImage* backproject = cvCreateImage(cvGetSize(test_image), 8, 1); - IplImage* binary_backproject = cvCreateImage(cvGetSize(test_image), 8, 1); - cvCalcBackProject(planes, backproject, hist); + // Calculate the back projection of hue and saturation planes of the INPUT image + // by mean of the histogram of the SAMPLE image. + // + // The pixels which (h,s) coordinates correspond to high values in the histogram + // will have high values in the grey image result. It means that a pixel of the INPUT image + // which is more probably in the zone represented by the SAMPLE image, will be whiter + // in the back projection. + IplImage* backproject = cvCreateImage(cvGetSize(input_image), 8, 1); + IplImage* binary_backproject = cvCreateImage(cvGetSize(input_image), 8, 1); + IplImage* input_hsv = cvCreateImage(cvGetSize(input_image),8,3); + IplImage* input_hplane = cvCreateImage(cvGetSize(input_image),8,1); + IplImage* input_splane = cvCreateImage(cvGetSize(input_image),8,1); - // Threshold in order to obtain binary image + // Get hue and saturation planes of the INPUT image + cvCvtColor(input_image, input_hsv, CV_BGR2HSV); + cvCvtPixToPlane(input_hsv, input_hplane, input_splane, 0, 0); + IplImage* input_planes[] = { input_hplane, input_splane }; + + // Compute the back projection + cvCalcBackProject(input_planes, backproject, sample_hist); + + // Threshold in order to obtain a binary image cvThreshold(backproject, binary_backproject, aColorFilterParameters->threshold, aColorFilterParameters->maxThreshold, CV_THRESH_BINARY); - cvReleaseImage(&test_image); - cvReleaseImage(&test_hsv); - cvReleaseImage(&h_plane); - cvReleaseImage(&s_plane); - cvReleaseImage(&find_image); + cvReleaseImage(&sample_image); + cvReleaseImage(&sample_hsv); + cvReleaseImage(&sample_h_plane); + cvReleaseImage(&sample_s_plane); + cvReleaseImage(&input_image); + cvReleaseImage(&input_hsv); + cvReleaseImage(&input_hplane); + cvReleaseImage(&input_splane); cvReleaseImage(&backproject); detected_edges = cv::Mat(binary_backproject); @@ -218,7 +243,7 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters // _detectAndRetrieveContours( detected_edges, parameters->findContoursMethod ); detected_edges = detected_edges > 1; - findContours( detected_edges, contours, hierarchy, CV_RETR_CCOMP, parameters->findContoursMethod, useROI ? cvPoint(rect.x,rect.y) : cvPoint(0,0) ); + findContours( detected_edges, contours, hierarchy, CV_RETR_CCOMP, parameters->findContoursMethod); return true; @@ -269,6 +294,9 @@ std::string ShapeRec_FeatureDetector::CroppImage() cvSaveImage ("/tmp/cropped_image.bmp", cropped_image); + cvReleaseImage(&src); + cvReleaseImage(&cropped_image); + return "/tmp/cropped_image.bmp"; } diff --git a/src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx b/src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx index 8c8e3cbe4..fa4fa14b6 100644 --- a/src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx +++ b/src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx @@ -174,11 +174,11 @@ void TransformationGUI_MultiRotationDlg::ConstructorsClicked (int constructorId) { disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); - myBase.nullify(); - myVector.nullify(); + //myBase.nullify(); + //myVector.nullify(); - GroupArgs->LineEdit1->setText(""); - GroupArgs->LineEdit2->setText(""); + //GroupArgs->LineEdit1->setText(""); + //GroupArgs->LineEdit2->setText(""); GroupArgs->SpinBox_DX1->setValue(myAng); GroupArgs->SpinBox_DY1->setValue(myNbTimes1); @@ -275,7 +275,8 @@ void TransformationGUI_MultiRotationDlg::SelectionIntoArgument() // angular step double diag = sqrt((Xmax-Xmin)*(Xmax-Xmin) + (Ymax-Ymin)*(Ymax-Ymin)); double d = sqrt((0.5*(Xmax+Xmin))*(0.5*(Xmax+Xmin)) + (0.5*(Ymax+Ymin))*(0.5*(Ymax+Ymin))); - myAng = floor(2.0 * atan(diag/d) * 180.0 / M_PI); + if ( fabs(d) > 1.e-16 ) + myAng = floor(2.0 * atan(diag/d) * 180.0 / M_PI); GroupArgs->SpinBox_DX1->setValue(myAng); // radial step @@ -293,10 +294,10 @@ void TransformationGUI_MultiRotationDlg::SelectionIntoArgument() } // clear selection - disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); - myGeomGUI->getApp()->selectionMgr()->clearSelected(); - connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), - this, SLOT(SelectionIntoArgument())); + // disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); + // myGeomGUI->getApp()->selectionMgr()->clearSelected(); + // connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + // this, SLOT(SelectionIntoArgument())); } else { if ( myEditCurrentArgument == GroupArgs->LineEdit1 ) diff --git a/src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx b/src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx index 286e2dc00..1cb934f8a 100644 --- a/src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx +++ b/src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx @@ -239,15 +239,21 @@ void TransformationGUI_MultiTranslationDlg::ConstructorsClicked (int constructor GroupDimensions->hide(); GroupPoints->show(); - GroupPoints->LineEdit1->setText(""); - GroupPoints->LineEdit2->setText(""); - myBase.nullify(); - myVectorU.nullify(); + //GroupPoints->LineEdit1->setText(""); + //GroupPoints->LineEdit2->setText(""); + //myBase.nullify(); + //myVectorU.nullify(); + + if ( myBase ) GroupDimensions->LineEdit1->setText( GEOMBase::GetName( myBase.get() ) ); + if ( myVectorU ) GroupDimensions->LineEdit2->setText( GEOMBase::GetName( myVectorU.get() ) ); GroupPoints->SpinBox_DX->setValue(myStepU); GroupPoints->SpinBox_DY->setValue(myNbTimesU); - GroupPoints->PushButton1->click(); + if ( !myBase ) + GroupPoints->PushButton1->click(); + else if ( !myVectorU ) + GroupPoints->PushButton2->click(); break; } case 1: // Translate double @@ -255,19 +261,28 @@ void TransformationGUI_MultiTranslationDlg::ConstructorsClicked (int constructor GroupPoints->hide(); GroupDimensions->show(); - GroupDimensions->LineEdit1->setText(""); - GroupDimensions->LineEdit2->setText(""); - GroupDimensions->LineEdit3->setText(""); - myBase.nullify(); - myVectorU.nullify(); - myVectorV.nullify(); + //GroupDimensions->LineEdit1->setText(""); + //GroupDimensions->LineEdit2->setText(""); + //GroupDimensions->LineEdit3->setText(""); + //myBase.nullify(); + //myVectorU.nullify(); + //myVectorV.nullify(); + + if ( myBase ) GroupDimensions->LineEdit1->setText( GEOMBase::GetName( myBase.get() ) ); + if ( myVectorU ) GroupDimensions->LineEdit2->setText( GEOMBase::GetName( myVectorU.get() ) ); + if ( myVectorV ) GroupDimensions->LineEdit3->setText( GEOMBase::GetName( myVectorV.get() ) ); GroupDimensions->SpinBox_DX1->setValue(myStepU); GroupDimensions->SpinBox_DY1->setValue(myNbTimesU); GroupDimensions->SpinBox_DX2->setValue(myStepV); GroupDimensions->SpinBox_DY2->setValue(myNbTimesV); - GroupDimensions->PushButton1->click(); + if ( !myBase ) + GroupDimensions->PushButton1->click(); + else if ( !myVectorU ) + GroupDimensions->PushButton2->click(); + else if ( !myVectorV ) + GroupDimensions->PushButton3->click(); break; } } @@ -329,7 +344,7 @@ void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument() QString aName = GEOMBase::GetName( aSelectedObject.get() ); myEditCurrentArgument->setText( aName ); - if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) { + if ( myEditCurrentArgument == GroupPoints->LineEdit1 || myEditCurrentArgument == GroupDimensions->LineEdit1 ) { myBase = aSelectedObject; // recompute myStepU (Mantis issue 0021718) @@ -338,36 +353,26 @@ void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument() anOper->GetBoundingBox(myBase.get(), true, Xmin, Xmax, Ymin, Ymax, Zmin, Zmax); if (anOper->IsDone()) { myStepU = floor(1.5 * (Xmax - Xmin)); + myStepV = floor(1.5 * (Ymax - Ymin)); GroupPoints->SpinBox_DX->setValue(myStepU); + GroupDimensions->SpinBox_DX1->setValue(myStepU); + GroupDimensions->SpinBox_DX2->setValue(myStepV); } - if (!myVectorU) + if ( myEditCurrentArgument == GroupPoints->LineEdit1 && !myVectorU ) GroupPoints->PushButton2->click(); + if ( myEditCurrentArgument == GroupDimensions->LineEdit1 ) { + if ( !myVectorU ) + GroupDimensions->PushButton2->click(); + else if ( !myVectorV ) + GroupDimensions->PushButton3->click(); + } } else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) { myVectorU = aSelectedObject; if ( !myBase ) GroupPoints->PushButton1->click(); } - else if ( myEditCurrentArgument == GroupDimensions->LineEdit1 ) { - myBase = aSelectedObject; - - // recompute myStepU and myStepV (Mantis issue 0021718) - GEOM::GEOM_IMeasureOperations_var anOper = getGeomEngine()->GetIMeasureOperations(getStudyId()); - double Xmin, Xmax, Ymin, Ymax, Zmin, Zmax; - anOper->GetBoundingBox(myBase.get(), true, Xmin, Xmax, Ymin, Ymax, Zmin, Zmax); - if (anOper->IsDone()) { - myStepU = floor(1.5 * (Xmax - Xmin)); - myStepV = floor(1.5 * (Ymax - Ymin)); - GroupDimensions->SpinBox_DX1->setValue(myStepU); - GroupDimensions->SpinBox_DX2->setValue(myStepV); - } - - if ( !myVectorU ) - GroupDimensions->PushButton2->click(); - else if ( !myVectorV ) - GroupDimensions->PushButton3->click(); - } else if ( myEditCurrentArgument == GroupDimensions->LineEdit2 ) { myVectorU = aSelectedObject; if ( !myVectorV ) @@ -384,10 +389,10 @@ void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument() } // clear selection - disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); - myGeomGUI->getApp()->selectionMgr()->clearSelected(); - connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), - this, SLOT(SelectionIntoArgument())); + // disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); + // myGeomGUI->getApp()->selectionMgr()->clearSelected(); + // connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + // this, SLOT(SelectionIntoArgument())); } else { if ( myEditCurrentArgument == GroupPoints->LineEdit1 || @@ -668,8 +673,8 @@ bool TransformationGUI_MultiTranslationDlg::execute (ObjectList& objects) createPathPreview(myVectorU.get()); createPathPreview(myVectorV.get()); anObj = anOper->MultiTranslate2D(myBase.get(), - myVectorU.get(), myStepU, myNbTimesU, - myVectorV.get(), myStepV, myNbTimesV); + myVectorU.get(), myStepU, myNbTimesU, + myVectorV.get(), myStepV, myNbTimesV); if (!IsPreview()) { aParameters << GroupDimensions->SpinBox_DX1->text(); aParameters << GroupDimensions->SpinBox_DY1->text(); @@ -743,10 +748,11 @@ void TransformationGUI_MultiTranslationDlg::createPathPreview ( GEOM::GEOM_Objec ShapeAnalysis_Edge aShapeAnal; TopoDS_Vertex aFirst = aShapeAnal.FirstVertex( anEdge ); TopoDS_Vertex aLast = aShapeAnal.LastVertex( anEdge ); + if ( BRep_Tool::Pnt(aFirst).IsEqual( BRep_Tool::Pnt(aLast), Precision::Confusion() ) ) return; TopoDS_Shape aVector = BRepBuilderAPI_MakeEdge(BRep_Tool::Pnt(aFirst), BRep_Tool::Pnt(aLast)).Shape(); const char* aName = "tmpVector"; Handle(GEOM_AISVector) anIO = new GEOM_AISVector( aVector, aName ); - + // add Prs to preview SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); SOCC_Prs* aPrs = dynamic_cast(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0)); diff --git a/src/XAO/tests/CMakeLists.txt b/src/XAO/tests/CMakeLists.txt index 9a1a748e8..79355ed77 100644 --- a/src/XAO/tests/CMakeLists.txt +++ b/src/XAO/tests/CMakeLists.txt @@ -55,7 +55,10 @@ SET(TestXAO_SOURCES ADD_EXECUTABLE(TestXAO ${TestXAO_SOURCES}) TARGET_LINK_LIBRARIES(TestXAO ${_link_LIBRARIES}) + +SALOME_GENERATE_TESTS_ENVIRONMENT(tests_env) + ADD_TEST(TestXAO TestXAO) -SET_TESTS_PROPERTIES(TestXAO PROPERTIES ENVIRONMENT "GEOM_SRC_DIR=${PROJECT_SOURCE_DIR}") +SET_TESTS_PROPERTIES(TestXAO PROPERTIES ENVIRONMENT "GEOM_SRC_DIR=${PROJECT_SOURCE_DIR};${tests_env}") INSTALL(TARGETS TestXAO DESTINATION ${SALOME_INSTALL_BINS}) diff --git a/src/XAO/tests/TestUtils.hxx b/src/XAO/tests/TestUtils.hxx index 83e343680..1221c9582 100644 --- a/src/XAO/tests/TestUtils.hxx +++ b/src/XAO/tests/TestUtils.hxx @@ -25,8 +25,9 @@ namespace XAO rstr.seekg(0, rstr.end); // go to the end length = rstr.tellg(); // report location (this is the length) rstr.seekg(0, rstr.beg); // go back to the beginning - char* txt = new char[length]; // allocate memory for a buffer of appropriate dimension + char* txt = new char[length+1]; // allocate memory for a buffer of appropriate dimension rstr.read(txt, length); // read the whole file into the buffer + txt[length] = '\0'; rstr.close(); return txt;