From 10bf139e7d68631bd457d90bccd0c42c78683975 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 22 Jan 2009 13:39:09 +0000 Subject: [PATCH] Merge from BR_V5_IMP_P8 --- doc/salome/gui/GEOM/images/3dsketch1.png | Bin 0 -> 4079 bytes doc/salome/gui/GEOM/images/3dsketch2.png | Bin 0 -> 23548 bytes doc/salome/gui/GEOM/images/3dsketch3.png | Bin 0 -> 23948 bytes doc/salome/gui/GEOM/images/arc.png | Bin 18490 -> 18635 bytes doc/salome/gui/GEOM/images/arc2.png | Bin 19787 -> 19986 bytes doc/salome/gui/GEOM/images/arcofellipse1.png | Bin 0 -> 2429 bytes doc/salome/gui/GEOM/images/arcofellipse2.png | Bin 0 -> 18834 bytes doc/salome/gui/GEOM/images/fillet2d_1.png | Bin 0 -> 1593 bytes doc/salome/gui/GEOM/images/fillet2d_2.png | Bin 0 -> 16404 bytes .../gui/GEOM/images/transformation12.png | Bin 0 -> 7522 bytes .../gui/GEOM/images/transformation13.png | Bin 0 -> 29512 bytes .../gui/GEOM/images/transformation14.png | Bin 0 -> 3544 bytes .../gui/GEOM/images/transformation5.png | Bin 22296 -> 22783 bytes .../gui/GEOM/images/transformation6.png | Bin 24265 -> 24458 bytes .../gui/GEOM/input/creating_3dsketcher.doc | 31 + doc/salome/gui/GEOM/input/creating_arc.doc | 17 + .../gui/GEOM/input/creating_geom_objects.doc | 5 +- .../gui/GEOM/input/creating_sketcher.doc | 5 + .../gui/GEOM/input/fillet2d_operation.doc | 27 + doc/salome/gui/GEOM/input/index.doc | 2 +- .../GEOM/input/modify_location_operation.doc | 21 +- .../GEOM/input/transformation_operations.doc | 1 + doc/salome/gui/GEOM/input/tui_3dsketcher.doc | 20 + .../gui/GEOM/input/tui_basic_geom_objs.doc | 33 + .../input/tui_transformation_operations.doc | 29 + idl/GEOM_Gen.idl | 51 ++ idl/GEOM_Superv.idl | 11 + resources/3dsketch.png | Bin 0 -> 685 bytes resources/GEOMCatalog.xml.in | 32 + resources/GEOM_en.xml | 1 + resources/GEOM_fr.xml | 1 + resources/Makefile.am | 9 +- resources/arcofellipse.png | Bin 0 -> 513 bytes resources/fillet2d.png | Bin 0 -> 980 bytes resources/position3.png | Bin 0 -> 891 bytes src/BasicGUI/BasicGUI_ArcDlg.cxx | 136 +++- src/BasicGUI/BasicGUI_ArcDlg.h | 1 + src/DlgRef/DlgRef.cxx | 14 + src/DlgRef/DlgRef.h | 16 + src/DlgRef/DlgRef.pro | 1 + src/DlgRef/DlgRef_4Sel1Spin2Check_QTD.ui | 93 ++- src/DlgRef/DlgRef_4Sel1Spin3Check_QTD.ui | 265 ++++++++ src/DlgRef/Makefile.am | 1 + src/EntityGUI/EntityGUI.cxx | 4 + src/EntityGUI/EntityGUI_3DSketcherDlg.cxx | 629 ++++++++++++++++++ src/EntityGUI/EntityGUI_3DSketcherDlg.h | 111 ++++ src/EntityGUI/Makefile.am | 3 + src/GEOMGUI/GEOM_images.ts | 20 + src/GEOMGUI/GEOM_msg_en.po | 4 + src/GEOMGUI/GEOM_msg_en.ts | 54 +- src/GEOMGUI/GeometryGUI.cxx | 8 +- src/GEOMImpl/GEOMImpl.pro | 1 + src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx | 145 ++++ src/GEOMImpl/GEOMImpl_3DSketcherDriver.hxx | 158 +++++ src/GEOMImpl/GEOMImpl_ArcDriver.cxx | 32 +- src/GEOMImpl/GEOMImpl_Fillet2dDriver.cxx | 152 +++++ src/GEOMImpl/GEOMImpl_Fillet2dDriver.hxx | 158 +++++ src/GEOMImpl/GEOMImpl_Gen.cxx | 4 + src/GEOMImpl/GEOMImpl_I3DSketcher.hxx | 43 ++ src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx | 132 ++++ src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx | 5 + src/GEOMImpl/GEOMImpl_IFillet2d.hxx | 51 ++ src/GEOMImpl/GEOMImpl_ILocalOperations.cxx | 71 ++ src/GEOMImpl/GEOMImpl_ILocalOperations.hxx | 2 + src/GEOMImpl/GEOMImpl_IPosition.hxx | 18 +- .../GEOMImpl_ITransformOperations.cxx | 69 ++ .../GEOMImpl_ITransformOperations.hxx | 6 + src/GEOMImpl/GEOMImpl_PositionDriver.cxx | 191 ++++++ src/GEOMImpl/GEOMImpl_Types.hxx | 16 +- src/GEOMImpl/Makefile.am | 6 + src/GEOM_I/GEOM_Gen_i.cc | 152 ++++- src/GEOM_I/GEOM_Gen_i.hh | 6 +- src/GEOM_I/GEOM_ICurvesOperations_i.cc | 62 ++ src/GEOM_I/GEOM_ICurvesOperations_i.hh | 6 + src/GEOM_I/GEOM_ILocalOperations_i.cc | 35 + src/GEOM_I/GEOM_ILocalOperations_i.hh | 3 + src/GEOM_I/GEOM_ITransformOperations_i.cc | 41 ++ src/GEOM_I/GEOM_ITransformOperations_i.hh | 6 + src/GEOM_I_Superv/GEOM_Superv_i.cc | 70 ++ src/GEOM_I_Superv/GEOM_Superv_i.hh | 11 + src/GEOM_SWIG/GEOM_ObjectInfo.py | 60 ++ src/GEOM_SWIG/GEOM_TestAll.py | 11 +- src/GEOM_SWIG/Makefile.am | 4 +- src/GEOM_SWIG/geompyDC.py | 57 +- src/GroupGUI/GroupGUI_GroupDlg.cxx | 17 +- src/GroupGUI/GroupGUI_GroupDlg.h | 4 +- src/OperationGUI/Makefile.am | 3 + src/OperationGUI/OperationGUI.cxx | 2 + src/OperationGUI/OperationGUI_Fillet2dDlg.cxx | 400 +++++++++++ src/OperationGUI/OperationGUI_Fillet2dDlg.h | 75 +++ .../TransformationGUI_PositionDlg.cxx | 278 +++++++- .../TransformationGUI_PositionDlg.h | 10 +- 92 files changed, 4102 insertions(+), 127 deletions(-) create mode 100755 doc/salome/gui/GEOM/images/3dsketch1.png create mode 100755 doc/salome/gui/GEOM/images/3dsketch2.png create mode 100755 doc/salome/gui/GEOM/images/3dsketch3.png create mode 100644 doc/salome/gui/GEOM/images/arcofellipse1.png create mode 100644 doc/salome/gui/GEOM/images/arcofellipse2.png create mode 100755 doc/salome/gui/GEOM/images/fillet2d_1.png create mode 100755 doc/salome/gui/GEOM/images/fillet2d_2.png create mode 100644 doc/salome/gui/GEOM/images/transformation12.png create mode 100644 doc/salome/gui/GEOM/images/transformation13.png create mode 100644 doc/salome/gui/GEOM/images/transformation14.png create mode 100755 doc/salome/gui/GEOM/input/creating_3dsketcher.doc create mode 100755 doc/salome/gui/GEOM/input/fillet2d_operation.doc create mode 100755 doc/salome/gui/GEOM/input/tui_3dsketcher.doc create mode 100755 resources/3dsketch.png create mode 100755 resources/arcofellipse.png create mode 100755 resources/fillet2d.png create mode 100644 resources/position3.png create mode 100755 src/DlgRef/DlgRef_4Sel1Spin3Check_QTD.ui create mode 100755 src/EntityGUI/EntityGUI_3DSketcherDlg.cxx create mode 100755 src/EntityGUI/EntityGUI_3DSketcherDlg.h create mode 100755 src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx create mode 100755 src/GEOMImpl/GEOMImpl_3DSketcherDriver.hxx create mode 100755 src/GEOMImpl/GEOMImpl_Fillet2dDriver.cxx create mode 100755 src/GEOMImpl/GEOMImpl_Fillet2dDriver.hxx create mode 100755 src/GEOMImpl/GEOMImpl_I3DSketcher.hxx create mode 100755 src/GEOMImpl/GEOMImpl_IFillet2d.hxx create mode 100644 src/GEOM_SWIG/GEOM_ObjectInfo.py create mode 100755 src/OperationGUI/OperationGUI_Fillet2dDlg.cxx create mode 100755 src/OperationGUI/OperationGUI_Fillet2dDlg.h diff --git a/doc/salome/gui/GEOM/images/3dsketch1.png b/doc/salome/gui/GEOM/images/3dsketch1.png new file mode 100755 index 0000000000000000000000000000000000000000..087ea15dc6c23e5820ba2ca6180b5c72176d6541 GIT binary patch literal 4079 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 Xk@W*t<%&wEkcSZtk{qjW0jd81{iA`n literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/3dsketch2.png b/doc/salome/gui/GEOM/images/3dsketch2.png new file mode 100755 index 0000000000000000000000000000000000000000..51f171d9f16d5d32fba0322c9e4c496c4f28f7a7 GIT binary patch literal 23548 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
}rmJcl-MP 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/3dsketch3.png b/doc/salome/gui/GEOM/images/3dsketch3.png new file mode 100755 index 0000000000000000000000000000000000000000..feb56e7cb04e6871248f3fee5174f9839e7d3b16 GIT binary patch literal 23948 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 literal 18490 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 R1D^H9;OXk;vd$@?2>>b&D((OP literal 19787 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 J%Q~loCICVh%Mt(p diff --git a/doc/salome/gui/GEOM/images/arcofellipse1.png b/doc/salome/gui/GEOM/images/arcofellipse1.png new file mode 100644 index 0000000000000000000000000000000000000000..cd50fff1c7273354590f1ecef43d0897aad0ff61 GIT binary patch literal 2429 zcmeHJ`Bzg(77pn|6P5ub+UzK;kc?4DAkZvE9)d_P@JJMhw(Nm6E-a30qCfyeM3j>! zkk~+k0Lg$r&}K&HAuVzSd2O3+2%DoaFam<4k+2Jad7L??PyaA8f54nMr|PS^U)8<$ ztEwOB-UR)940O$OQ7Dvw?=deH3Z)Z|^avapVa8`;f>0>Dm#-IaBIO(Po5QTJLDRoR zj7%l|GK3~)c8n2hiYa(K``u;7-(fssboPX9*;eL%@^iiKPdClow0PZ;J`uY9l_a>w z#YbsOAu!KLdm0rp@6kS8e_FEi=%^@eM~N-@=uVuj(HBII0x^p6Z;UzaT5ZacC)XCV zcFFC2xc!SsBO`anT(2psVwoU#%Pb+R9V`8}mMUjiA3+xJG zB66vKd>VCT4{`Nb-Ylk{wCD=?`-Cr`ft5wA>_cl^*Tigvu2fX({u>1jPDI0!+M*9A zGo$+;gl$5?{VMH+R6K3b=~|L|&*8yu=uP?0vYY3Q$Ig9L?EXHBwz(=4e|3m{pP3m5 z%wCGlx)5ZwD`whn#(?Az7Y@F4p(K=|>$qb&ksW|s=c#CK_UH(u{`E(($ zNu+<)S_v&@o#$yZ3tdY(<*(EJf?wDM*~~xk z9WH7om;D(u1UPT&?!Qd(>dZZbgFAlb;+#r50DER(xW1qHN2tA^9omkgwusE0ExC zt4LFa?eVI^jPI*^T%0L0-yvL6Y57PM}ufa?+TjC9tfNTy5Fk`!TRBRRF z3T7;dMJtN={iSgnjN{zIAQM8_vK9S9V_Uo*P< ztq3$(Q4Qf-A3~&^WeEGt5uz;W75bqgk=L`O>v1(F3RFobB35A^)|)Akka9zU5h6mw z;_uibYDu?F`+=(Hy^dT?9WGx~pI<|kYQ@rS-Lo*u%n%`pYsi&j2mzmk*F*;SqMy#f z)35ZAu@`conGk4M)sJ@)Xb}~=xlT+ZV#=+W7gc3qDSoCGGIiWepp6)bsNe47SK5Mk zQ`wca>G`|4tjk-ynI<0W8g>Gx!Z6t9KvfP!pJXhf5_ugdB5LlZ&F%Ftf*4cQC{H(E zWK>Jy^kKZ2;`GZ1mKN^bE9E0eRF(4xI@n7j1WQCpD}4W#UcO1_(h%aUOzWO$!C`bVQ3t9*<~2o3gf?Mzo-BbI1s)IkpHg zPwgV|JXb8L^c|9son}smYRoIAuuU&#HsUq)#cGABpJ&w{-8M!vk3Y2DQj{ZKM{DZp+H~ck$)E0)G!EE(@k>$i z`HMo!;5*781(z)lw5_JD3$0U#Z7ZjcPb@AYu)(S#>}BiA_9Od3FE+F_8edy4bCX_q zNG@Hl;_QjZaOxmXwf~yb+)J zNxj+|Gy5|kW%!y|=$mZ%TIq77dc9r@L zOq!TdDi0JUeva8UJFlG_ogQUdXDn}BVh+&{2}i<~vVfuCd8bcHB@Wq7!v%$dvf1dW zyKWbs!@VSeoz*NFSE;;^rX?|4HNwoKlRFBi3_CWB!z#M7FQYA z2&vag2h$X~_6pmXGC830e*Z?>?W~ypTBiKx0tQ)mk)eYMlO#=A-ad(xRVZI?f3F75 HaQ;65ylUoL literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/arcofellipse2.png b/doc/salome/gui/GEOM/images/arcofellipse2.png new file mode 100644 index 0000000000000000000000000000000000000000..24172dfae940ab1d51a8c1a2d632915b4dbf81c8 GIT binary patch literal 18834 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/fillet2d_2.png b/doc/salome/gui/GEOM/images/fillet2d_2.png new file mode 100755 index 0000000000000000000000000000000000000000..58579c47d685c858073289482c6c508a1336c5aa GIT binary patch literal 16404 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 G77|qAHTKhf|+RoqWKp62Y0zhYQ&MXa2Xh0 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
%@)a&2OLgRK>osHdb)o^s& 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 Pv26ft?9ioFXJh^kermuS literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/transformation5.png b/doc/salome/gui/GEOM/images/transformation5.png index 81813504c2f5028c6f4af2cf8fe95b3ebd38758c..48b632622bed3ce4a3c2f11ec6c7486a8fcb0ed7 100755 GIT binary patch literal 22783 zcmcG$1yogSpEnF5Al+RG(jW-ZrPAHfT}pR{igZag2#82`cSv{F;n3aPd>8lqJoC=X zGc)V`-nGWHIN&*ZZ}z_SzW)DTT?8q}iK8JCBg4SJph-%ID8azMW`nPRX9(b(CMV-W z7?|fUk|OU^TvK)-E}qJ3%UwtEV#yUTuQHyKnDqFMj+SMhzQYtD{r#Mdp=bxD`uTH8 z2B9pU9KQPR#QjS zPysuL^385<>1;rsZ)Qj_?8n@dK3kiQOG|6$cJ9Gi*dM19=ItpSuZM|>?fv5I#iAiE zgXSLS*e5FLXevZfbkfi51~36+LUQ_TVuwo@-Fb7-4J}o;yfV|I-rUE^NWDHoaRy613X*@f%-bN(|XeauX zf6kL$yx269Z_zw4>9AzU(HMVYf?vRQa@@y|mFXrb)5#_#6^2bx?e~0!VS6sE`abvfZrLQpg~I|xZ{DoWag<5DZbGl?u8fL{Ta&Jh=;Jvqx3LnA zp*P*&+;gMTz=?49AEhqtrN7{)UO$gzIq#V%;tfxcJ%B%%#FZDC?(lF02;zi=ymuy9$YDHPp-yR9KXH{pG-#zOYhd>e=tp8om4GT^7>27d_BD{J_@Z604&4>r&8 za#x|4N}J<8H-dd@pUY(ZO?X>HuS53t?&O|LXxQZ`bHrnWUzrEJ>S@uMX4VRF8mt&+ zef-XYcdS*WYIkXUVwx!!%9;1JQy275mgQNp8mxMIi#3y%HQVy;4wVg$j2O?`++c@u z5*_sL&lKxVe&{)D1nx(y9G=N-cr)Zxe{8PZc__QyP1dos${D*cURf%eV@^w~Ec@zq zH?&LatHGFR@|itQO0GVig7zdoTLc14Y8 zR4;Lz8;dE}4C{QWZcgybhp+c}&g1Q5w+RUq558x&miv|)c?i`}n0jIWTe4Cdo#ANz zlYNP@oB12<6z{{y!Z7@GrEQbzmlGW;xflGUojg9vJrCVi=c5O2d<3@nZ|yxW66)7i zL;Q&RwPCQ{{n=pP<@(&Lw6qyCYBe|%Fy+J0DEM}zZt$jRqqUinkD|Gt@Z`^V?7*Pg z%B=4QjC>aydQA}ys`=LZ{_(l2+d(*FFM@HFPj6RmcGJ_2kEKOJu8B;^elb-q_2S*V zt*Qs%4DrI8=1~=1Wp-v=$gIwY_wW9ymgl&bH6ZA#!NIo|8AeJ9u5pSd>u z9NJK3n%MH-x#=#{HM=0O+_d(s$n#5k6-uc{vxG>N1nT`4To`!K{Asy`jzWd}lY3hl zQi*_Ht%C$DVF9TJwyiTP@9qcN=^duHp-WFZZwNvy5Yz9MJY77uZx3AB!*o)25VcYw zOxAhy=z_PIlW2x`%C<>ieMlXeY#l8&nd%ER{(Rbrcikz8HP;F;OtA3hn=7dXc;UT>rky)3ft;PS9v6hTPs-bU?`^x%uQep#&XQgFI{`68+ zySo0)mceCi*;-GO) z9{Rj=Oc;q22-tTecV(1TJZWw18{~UD8IwV8-pj)2dyq zKfk1~lt&s{uQEr=OW9)b)Fw2)UsbnBvJ}u<;)8`3RmefpfNBu#;qt zO(b{rh!sdK2xAmoz23SpmEI#pJn(;ZruPQzZ$mMyoyf~-S*mJC;b`T}iBoAuArp!n zko#vsSB42u%FZ|SZ*0Tg?;!HdnXz)SFdVUeXs}8<^#hl?eI?+sRy#)!J3}Ks7o)5& zUzHg`9Q;&kQN(-8%Bh+q`1)t&eev%h{u%FFQkUWj>ys9^=;Q-t4uR}Hx(f?aZCOqO zi=JOUbih=+xfMxv-(u3KCKaFRdkz0hwJCeqkQEpD;Eh_ez3AEH2FB6+iCMF8s%IoO z%a2Rax2`b8YpSeJ%?9rt_ueFg4TJhs(v4@i4&NLq)_?47h-&PpohFPZ@E?1a7oH5u z~m*+cnLx&`&>!u4_TmGT2evSo$%!G?-7;H^)Uy;h^^S&3wEz zvpQLm*!ai|PjqLCXMN{!X;XzSc4g>w_CHw-2{r1v-03N%*Uow8^1Iv|$y}VA4V>5A zd%O6cOr5T-d$@rgs&`11R{4_ct-Wza=SvgGJ0CE~vEKa<2#WbORhqruuHEWhSKExY z=Mey>3qhr@7VugK^1Nh+7prjA{fKG!J8f$FQpi&5(Jpti;Ks%hBGzV7#)R_`>y{&jPvAY-w-WB%*_WT&zI zYTud~Zp#;rnUyHzLbS-HYRc+vu-ygkJ})YxDp3il z{5tk&txNo3LRG0JKQjim{Ac3%d;ko$?0?J#!J`%Xzp^JA%ii?&EhN5xjzX^$8y1)VXQcWc6L!i|N!4_f3g> zC8sM|*r_*dko(J1jE$iCPo;x(N)Ag|(3E({!+|^@bi~bd=VO(FimO3_gN}SvVP;+5 zY<13lfO73z-0^k3gr@GFIh9z>JqdpdZ@*RoZkD$tJo+|CC&&Yt8)Aw?KEK+$8dC`9 zZ@p2y>CE(Mb{>MScgF=Kxz#(vF(Y)Q9Buqg7zg2oJRN_F=GqJLj(u7VNY&&Wgc+S@GT9)p5~Rs#_f;uhx>5{Nrs_A%Z7Hv^9_LgM9k$% z{$!z$J^tj64h;$n96H==F9-0E;~f<>7S<7w>1XIUO`Vn;z=`>F+QXQ_x03?l{%7xz z(8?yAJw!xSNn_(;rI(N1I6_hZqD1w3#FhV7ujSQ@>gkvVdkhVEW-^vmT<=6yQIv`De}|bl{&`xU_n;Qo%f82*fr~tSXHPkPahjA_k}J} zwvl-B;l+j7+jK%~POBp^yjL0;8cg?xaKGmH@jl0_8t>PgI4?Zd+Eq@BRA{inM+Zuv z{XS0na3vb><8sfY9erH2Up<4ANcZp8GPvYSQ| zvFdZi7g2I>#0ovk|Jm&8G<-u`dz_a~#O3_Pv^??j)Y1ED&8+FpAlIVN{cIby#K4Px zh}qS@VAqlq9Wj@_$7E93zAm$_pN1VjKUP{S{7Fi@x6oDa7RT-xhW-maIF%kZ)2 z*|V3gTjo*R} ztXhJHQ7d;X|BX_fB{j95pWjHH6G_wEx`kMHT?~uhL#S@!4GbnW_WSDn$cCfY{CW2q zvcbC1QC4C!TzuT&!`l;B*8@nk&KmqvgsAvb0C1N;|G=DNzHa?WWa{iHYxSI0@>kv&7N6Ov{gYEo=@?Z{0e?oM^ovnx+G3JK9~Q zD`9>IC5}B9BI3>&@|JIGn(i5#wx7P)=#5v~gQ?rUnmY zA0h+05<}g~c}4=>)wR^rfC}fm@yEH|(8HKfVX+~X#A&e~mT58Y&Dd4MYiT|9-m{u-g*!LnV{o$48gl3ottn>!o{IgM*lIe zMOi!x)kg(wD=zs42```h+z|z2w6eG)xxVAw0GJ3ef!?wyz3idL_BY7LlpF%7LusC0 z3-}I}b7XfuEo8!fuz;b7?jae7Gq;rCjSWWQh&Z`ypt6+E`{bM1H=PAQd3kB}PX#V& z_~ydqCKAkIW3wEq*~{w+B;q zn|$i77sPW9vKbo4rKrm4VT4geN0_Twk4bbsp7{c^p4ymJfx&_OfTO&hY=DIBIYoc zxeI)Ddw17Z%cF#3a(0)?B9(T2R|*k|jz3``MJGY851T)InN;;j=It*HuLIxl3ws)K z1VpE%?v2#{T4&Z|JsL?YP_K#!4RvgpIlRWgQZM}QcTu~ z?$==582-JRn}gatW2hMqMFGy^Z~m$j)uRZ#VLEG6@tYFPUBxMHa5HuIGw=)*^`|`4 zTb&udth`(&BEZitGA-%7uI{T(x%8J;R|eH{JkD=|guJ0r#e#RB&9*=dbIduz8Ha5Rv-aXzBqYPutWJyWM z7ySIBpXcYbBhnIJyuH1(9Y;jpSdHQ)53IZ2c1N~*UL6cgH~UcROciGQ`0*KsRt|G6 zp9>LvcVn^DSKIjtucBe`eX&(~%z=zv%#YiqYMUG1GlcHzT^#J@%h0y3Pwd&*iRJ~O zQlLIY2a#0Tmo38MHqh4OWV$s4sI;mZN6cuM{ipew*If}5E&@c-q>)aw>Y$vUDagkd!ybcdHGf_knJ?7#+)EdhNP~7dtu$m1LTOiFA>Mkl zGF}{67#sE1{XI=lGJ(>^nw|CH{mjlDsnYQ{K0eN!V@kSx&sWv(WP3er@j|Ff;%?2X zGps)9`}bk+Tqh|`J(olJeF#y~01u%?dP(?r3~m%Q&g-9MMvUEAtOrm1YBjh+?{Qbx z$M!SNwa1&hDy<`22T8orafqd^xgMw?OA62%R`C3&hK0rir+F${*Jby2G3Gz~Xl2r> zdzuW9^Y#{W)1aR|wl7&r|G_F0uuIi!^o+yy^dlv~%-L#z>;&W@h@ISMW|UfFytugO z!fx9mH<TmJmpzYitS`CVH$nkA!Aw&rUY398J!#JWoUT>Q1q zjf3x_0x90^oQIQT8y1x|0 z|F>6_EiIIri}2iiXCPgw2tM8hf%~rlK+)_SUIKmahzR*FjQX#yx(_dI&XA54ik5AP z{{b#LXkD3Os;q8&Lr)#Q3cqhq{i9*@H@JMt;y1bvsqc}H&+!(4v%&S5%%w0;Weo~k z%vRuaeuL!WaD!@A(Tgt6v;-V{MP;wsS%6p0#vQcy;4M3>h5d=&88G z!d%{H!IY>M{QULvczvhX?k3g6Bm0%jr-`~SfPDu)>DFEknpYZ@YPRUNfbW%>TT?zT zU^2VNrgKLQRMa0Bj|Uor5)yX}aLG|Jb4+mfEF~AS8!HHjp;Pn*X4o|}9?F9DvpHGY zXpuNRjtj0vu(0VrV$r%dmRel^M%}jjHi-D#U&7s-8;*6N677mHDilaQZ0dS}Z1B0f?vg=A`cms@AE{S{WiKXg= z+HCf?iw!StG7x{&$3aU3(>Cz=g+DlRq6hen#~7>C0&uJtAKt0YiaA4t?AzKBC@uB` z6Auy%Zh%`w*#2o~&_o757SDzXZ_In&0&*4-T$Ok*TFUC`-Ch?91GjDtZf9rJC39qi zVPbJidVYTld8`D$alrG}UEF-zCZEj3<}%2X#A(%;#co!sI}K}pV$V3|Nf6>=*9dTh zszXmP7oj-TBhgCE*pRLNiuE?H!FmllT>D5&-}S+YvAdMz1L;E18+| z?Tg1$iRo4Au*(x`FRTy0v+bauqpz2ht^{r`Bpx1~TpDZz zkM8khTMd3PgDrw5ZI{G;d5d54t8IQRhX@G zpalizLTtpW67J@L{_*X7v52Q3)Sxj#@(!s9IrC#{Y zTKNZdL)*}zX^xhgbI${rtz)CW^E*n>!h174BMmby1qE#n z#;&|t>0WBzC)uQH!n>0Ux{0c?oOy42vG2G&9ocGU_mYODZha5hoGvXE`a}5U+;MNz zuhwDX$>DDK&?q}^k{lTyHW}WZgXRbH7P4xnoT(`dq|TZ8mzg{|IlqMZ$KP{x!Eqjz z>oS>HnKeI5q~l)cXfDwt4VWTekjtp6C*0hD3W zz3XTnk%9*RZL$!dyZOkZ#1+?@M$z!@Zt@~0MD$<>&*Pb9ow4HPt16@Jk`Rcsbkl$v zBcK3&&H+XT_i*9gzhedr?AuP0Wjk#Sw;pZfr1O%Z2ds>UQ#fgR>{S-Im6n!E@DQzz-*>Vd$+&YMBYp1k>pV3KeCzV&nw~n`YZ5Kbo*?OK$sG$e6FR3@UmQpb= z^ezP{?_gr(7VOYyAJ`!{?$7^OF}Wa>bn38yto)8dAp@AtZE;E5)$?3N_j<}Ad%aMr zKIuOc?kWC|iQdOrJzS{ef=Wo}eDn;4lFFmR2CCcQMrS$Ei$}`m9Lhs0ZtPs&2v7k~ zDaiPoS)F&)VLBryh7On7VI`!cjZW4F3N$NwD?LYk8&Bk^@?Wh+1B3ytKtfJVu<=l8 z93IF~L>%V0Ft1;~-i6dxYgQ?W{H&Uoo^Vl%XpSRD^C=pCQT<=aC$;NZx6FicX)v!7 zWz-Atr}(3LR*}i;Azwy58uuKlsx$rR8?Q=9AuXz1C!Q?O5U#d{OjlWvc-^F3{XwO! zE?xD;#JZ}_FJ&?2AP(zywd6cmAG8yQ)B7%O@D3JjNQmO|#e!G8lu5w1Z^QNSdTBa` zZ^EO~{Rf7IHmVDo)7;wSkuflGtmdjbuh!yWJa3P>PIsm-J`WEoWM*c%Ze_=7_vQTh z6_uVY|Lz@Z7%|6_#Q`p;;{XOK>Ps%J__nq-sR?RId(Qk38>D9ARXR%IH@32fhyk`x zIE;~Ic~oJ9b1H7`pS>o{XM;Dp(B_DQ-}|RQVZUsO)0p(C3ZzU-jE#p2KH(&BetI8G zBTLBd$_fK!hhT)zJvX=$#sf(l{3reFMNarEy8RbWpCM5K9g(Rb9k;buwP#332A!cq zjt2{=2?>Pn-v?K-fTo{c+?3?JH#<^p_SBj(^q*OPp|M#7MIBWvJUmeq6eAXb$fd<^cVt&WY27Op`=`9$Cdg&uY*?(Qe2xSyukclNkPvBxILn{ngHlaWB)U{ z{#U&H_dBZBVgW!M%c~~?0&*l8EeHQ;H>!<_8Wlit>bFaXGPQ2z*^?Ht1&IJ%cL@7m z7J87P?f7968yChsnWF6&1DfH~X}t~0OQ7C)FC63KuW&7HY^bff0~itAqrz-;=-)vl zPAKSzsa0j2KYH!6Kbs4rXnOH~^k|2()CqGZNYmvl&i-YWj^qBQUo2x>ExEj`Y=+jx zIg{(P3of7^u%&@Ar3iH9#p&yJgZa zl$2?QQgj+j_&`7AbFrkQr43l{x@Nmi+PO47GMwTEbO^}afuW&>pjyb(Ug7_OIuJw* zr1b%z`L|Z}D+IVA6Ey1Hvx^HB4i5$vk9-LyTDm5DbNBkf6MR z0w&|s%fpqj*wyv*W1zC$mN-)9PZgShePxn7v+~o*tRn?7ab+ke@xWyy4wwSfn!>9l z@MuaqV8+sPJUeUVc#I~TOkg|3hHYhIqifnuO`kKlr@!BLC=C)?=lG~%_jT&(YRC1U z5^AsU=7el$6nvO+2S)|cP-u~2PtkZ| zH5(eQ>o%}=jtf6l(h3K8#YlPV5*HV{=XjP%8|!&9FjZ0iTL9{Lk+oAAMl#8M z_KQR(Lj?eFLS`-97MF(`f2{b>{@W%CReG3#0@MPtH2M(`@1d~t#=wv{vPZ%%-;+cfJbdK~?k>l2EEIJvV zU0)0dzq$Cxglp^`6INt%G^j5Ocgo_rwJ+yQ%S$)!T!=ibxGg!8caHWW1xjZ23Un)@ z@R_xqge#q-`yA=b+szH|pNxCDpNF;@mKv7Nuo8#y-*@l>*8XmVMmCUyze6=*z?xAt z+#$(6N6%-6%#{E3`D;bUA^VM@f_h8klmLJ-4g(^u^Z0E@UFlA_Lc|#DQmc<@^M$he-v4UGD3hOs6hAV3;yrD z9&WP?rG@P`SeX}2J^+GHIB_j1(jb|k0?#GeSovXlZz`YmlSXZ&Qgxt&tOA|tmyzFD zX`qMxP{?}{jp48K@q1-e@^i|KXEx-eis0ko@R;MhK@Z_QPGONjLoS)5)d`0=jz~L^Q0I(bavujm`-=pfD$$XnooT)1^kJ6vQrK zPG*2>+?JyZ{ti`64DFPH>~fMcKb(_LFkgQTOXkFO))m%tX-J3=yp94e-Ca98Cm4N( zjNcX0M+gT}?~*OOA?Ntf2Mg+bB3rp15(P>Kq2R6Iqdw2iG;VPg*gew+2+x$RTjGQF z8AX#`S?J;-Ci*UPC_$0x89MrlDzyXTsY1PG!G{}zEux9^#K<0phw9Ju2dUm-YcVQ` zC}igcb6sZXUUFh$FA8Tx?It?9kWj6qoWq009oeC`hh&KwM5sh;-vD{%EB7Y~K0xKh zSehu*if7jHMu20|Df_0CBexb68K0sdu*RA!E0ZpmihxEuTx!UY(_Z7FFX}pmK>IhOH^b1A2 zmB~n^=(N>2a-Tz=q9@~ZH1@^T*4B8jUh_DER+Z(8G7lGCr`_(w8g6VH9N6h5FTQ~! zP7`R87fgSeK=P5Ao{qs8=pe1Wh&cH8>qkwvSoA&lRM{~=M~5zBsXeRWBV^k(gb}=ReeH6$;w*Tz3x%0y z{qzJFh+T!%P}sMcn#8na+wx@tN z_a?kHQg3wUXl-qsn0$p5S?0gj-eGAz99s|TPh}7JC7XOS%2@2C?N3WUwz{#lY@5(62n(P1X?MCVyV0yH-Ogn^z~(zlwf||-DL_V6_f#z zUZUrUEI-@I>&YSwom?xnq)=;{jfs53bM0{2oT#`Y3HNQ-?Mbv2*l$l~2-%ETfp@Vv zSxAyv@0_s)&y0kG);a_&o@dK%cY%6|=YJ@K*+}-UvYIU4i>s!|5j z7>f_ZhW8D%>P+{ZhfB0YZqyO?jes}u9}nMkh&Xi(4MlwY`lKk?w$TE&>M-@A#VcSgmVZ3Tc?^Y=m6Zc(eR-9raX2r;SSg!Es+$iU zFInRBt|H-PdQs>CAWmY<6e=Fyp(?lZ)bLf@DB_>K< zSnI%UxE0aJCLK;{+0?E#KiuEUyRL-wC%pCrg|p=22qnz@N%}*H;UDD5V!en7^R?10 za--YJBPPA3hPEM9QBhI5!^L;NTK+it6A6sUdaBDp?xYoVWO@9***HFZj-Z2fdXGIm zr1k?7YKJ=qeC9s|<$p+Vk#G8IT!eys_K~ol9xRJ*wj)O-g`}Qpi z%!m95Jc<1`mY9nBO#t#JDJ-LCpi#fV*jTN2#g7@u&S8+bq1Qdz?1IWTMdMmw`8P}Q zyx16yzrTc2({tl-fwC7?CEF8cjckq-s^)*_INxnK5b_djL@1OPsECe_7YDJ34Zi?~ z1-A_>Qqs`$^mOsHpum(p&vOg^Wq;JQYO8wldLonK(Ee04H4$S5c$r?A z=4f5(pw!~vwNezB=hZ|t5SLWP!Cjmkdf}!eBJxxSh)Pym0ADEa(x||vkvFjuhk??V z#AVaUu~PiJ&H^qeg+c_#`8+&4(|hMqu|Tq@8k5LHX1L+WZ21f`TWKY&kjg9K{15`V za6b)|v(^hSpND41M?gun9#P1QV#vtHmoHy_1Ckf7V}4VT8JNP?;70roTm&ZtD)r~vOj8~yK~3}J7v>&yiO-* ztmZji)FC0+{u1lRP8Th^Jpg?q*NbGCKy%2k#rN?7poz#-wJzB^-1u9bev{ zQ^(cr6Quie_OS@cdwauPU0uDgnhbT57Zgpd+LH*>>*^P$prN9I`-|vpv<6U^^qUwl zT1MnhWea$mmu%jNl1dLQwN*uiHk#6WX_f66d>xr$x|}uCL`%)#2ZB{Uz3;BcV>Pf4 zvmJWu*b+#o+qT9>qJc4TbS*(o_xlyV1Q*U6CfBwjHw|Z<7EITh%EW0tf-oR|_MDzR z2%ni{aW=nrvE1h&-WpO5_dPOF&fdOk&R(E)*x=@TkN>#aD74m{7*6xzIaU7micoEI z@}B1$YtL%kYM)M748=n&7lE89lgx=GB=o>OtLvNL`dwu==0uwJGcBcH!6Z5qFU;1u z_KY*`_EMmyE81;oO>I+1|2a%DmyO|e49T-R5|L(axIC3EU}jw{w##dOc{)tRK>QiB zn#YnhU6Ns;3u<_4>kI3?$~h~%K^A~!uFBR>pRd2oCII#Kgu*LUjdn z#sK}=@Qc@jO`(e3kBsEM-IM`Mk$t^CsdW_30;a}mdw~CX+EOf{Hk6h;U1!T(86R%Yim50UD#hoCcWuyK5lRS5E9uTa!$rSC>rT2$(z=f z2H~5jF@4<=)VxH2`K9m>WComp7R87BfCHuvj070XPr(%U2#`7=H{4pWkjv}s(Gi%?`eiBnrYrZ#>b+8+ySUGh zb#xW4#HUx=j)g@hytxu1cioIco^o)>Xa};=^sZQ${M&b?#C%n+Xzw=V6VTvS*M2E= zMTwWk$p(EK#spEsnW4~;j~z?4Ds$DMDg87X(C}pslc>PUGR?;8!DSn}J1e$CZI*6- zb~0ud0|Nt*Hy>Lj^?b6GHwM>UP5m$s?$qXtdmSHUGM;Ue;0l>ABbCZ{kuhyW%bk`I z+-~q(;0)&7yANz^$4KZ5#%~|qfp880B%dI^(10NPOD>fcc!=q@$W*`&T8@TdlY>$A zE7UyMg@z!Ge6>i2<)_l#mucWoQw@6F_d)9e zS~bj5rsZm`DCkJpitVi7&~Te~)BY_j)D!_d z*k}M}2#0(muI|M~bXt7?a8@*{8a~71pY$m+e_;Iba2F}v+9)jA(ufdJwC15FqV2V6uVE}UoR3wDE}A|f*A4487soFzF#MvO{L*Nz9R zP5!&fGF|Q#P1DW3xRSC`2_C+?w%mv;h;HT_H06KoCAGE~E_o3jO4yqhn}3Dl12o&7 z{@zSE1x(X&=Vky}-Bk;~R#NQA18*!ALR*Cq$Ie^4w-MlhHv)og?fR@LeQO7xF{1b> z;i;V8%DsL2oLQ^tr%7L2Hu)4D(7>}F8>Cua(BBQx^K4_-CWXKDQ9-a511)7SB;G8? zWbOD-h;w)2kO; z!$c{(q}or05cNSW2>voAQ0H1)0+|qX9ol4Rz5JS|B=YISZU-i6z`V(E8~Yd1Vm~WctJpP2_@%A$&!?W zDYEhc;gZMSV*QpvO-uK3!$GF`!dh)cJc2xX0DhpG$1bzYi;;4f(VQ-39xrTzF(SD;&+M$PyEu7-I>Wi3`Gj)X>5fA~jh0kpyo9Of}O1Y=#h zg|MG`4|7Dqi34Hx7pHJ58Lv9uh6I2O2ywZ-C9;zv=(lx9-d^ zJE55@&~=(Ed-380;Cu0A1pHy`OEAxcgwml^_uIGi&(lHBaq21;w28S&>$m#P-P~$H z!pmJ{GM9m&zQEaehrEZRxN+N^30O%bC9Im2*6r0$Pc-gg-rb4%h)0gxrgUQHappW= z0nMOVT3X^iZE^fH?Qc`Ne^VH9tnrmu5Wyf&}U-pQ3C{q>j&*&$-E(Zx2LtrDr6xr3OrLZ@f7D&TegZ8T!5MUh*MHsI*U={6 zRr&iQnNXl^>DkggFL}!ty*$p0LGBCgaFztcZ9Nyn&&8uKo5Q;{1U2%)LH8S>O&o?=?<(T=c(TO*T-PCRJqd5?ecnB0qxTH0%#f9E+F`L|?kyWJ z+BgQvWPllj+jA2W%&T3#81;QN7pNN_^Q#&l5+;7|Wd^c$;eSd2y1D#R!PQNB8dcx! zvaGutNd?ZT%&5!Ry2-@cic4JN=cxJWdqfxL`13T2@fy3@te^fH>GHS!103^|SdrT+ zX9}ZB+#u-}6Q20LD?52-afFgTuQg;EX0M)yn|H? zHEd;_gf=oRX}c=b1ad!L8S*;IpWSd;zo^-oKaq$idzRB?pY+jB1wL!-b^^Nv!pzK! zwtEk2r;c;3g@$||lZ^*K(-p5U!kN+PVa8+Nat;N`R1EY!<=55EecDT>ud2c~s9ro7Z^-H5#Tlh73zt_x61bH$yd;bZY%U2niKoqi#x@ z>r3(diH!^m4$vTqo3Eon#6zDmF`^9x8CH`TbXH81FIv< zBL^}x`z;K_3fF?V%;L?ppiOt`m7HH{T7_MYgSvp=#ecGU@)RDv)L!<9&?~K=$Hhq4 zHzPWUCRR4q*01D;(z`IE)ymurOVCd-l_92;yg(<|~%}u)=8f(t;uYgDlfyD*Pq6H2h-A{T=EyG+D<3 z{d-!PTrx_M9UVPUdF|zIknTcYPUc(&4xe_!%$_q07+=S^!KhwM=lSUo%R3|5$HPc> zIj;?dgoPVJGekZsjqUe>=YR|yFn(joyj5Ba}9}!+rm+x*+$I`#)AZts*BJPw%0Jicv|& z6}K6drf@=a_$;*C<}6qVFW2iSuFm51EN-HM%>kDFnqi31e{m4tuT zVh=ykK^OqY?6~4lKlC(}W5Agnlj@!)kcgr#PHXj{@nmb`SuYIC|HG*soBi!g$dGiQ z5WoTaw~Jm4r^`aM>vc#)w%sh*-<-C0*O&qIcU9K!Ztz&aD@0Y>CmFe{Fa?dh4A zm^gw@e)b<5o0&zX#mPOUL`N$b$#|WY z2b+Vz_T=BQoS&iekk8o2U-j-3u%6<@6lPOr`&Gs0d@p?NX-!x3tm$`mQ^>PtnPnk# zAqt$ZCW`p6qI90Yy)^0!CRTlvxsZ&3{u^;C31OPV3ibi|`R1J@>3*4Y{tbS!V`G}F zj<0xq@tJ1D++aHHV3UrL;!CzI2-JfKci5BSMkwTrYp5yyoR+rhT07*=6Fngz$L)Fe z{1vs#i)gRH2(=>8&(%<(@ZZmHW;-juA8LqA9*SmySxvT*iZi^?KE1;BYq{@cxU4zP7!vbI3iIJY!z72i^3 z@}=&J=4!?UTU*%-_D|4bgQKMu#UBI@eh+_0{3e9`&=#beW5>3IiY=f1CwJ9Bg4Y2y zXGlln_zE|r_WQb{9wPR6mY3xlnT*ztGnqW#+jNaVV;(mfJNw~C0J{`~Lf($n`^KtR zyY{Qxp3xa{p*Ee(m3*x$7RF>z_SU`m6!PdDkIARSe3lm#8bH)1G>{S6!%4PSXUrZ`93*mC^_^`E+s+loDNLF;!%+;(x|{*k_}DZF0-JBibGR z>@|1RnnmVhZwVa_iv)tNy<%@q&pR7kRjas9E^HLg>{hM z$p-Jd3zm54^v2A{Oq^0v%9$*^uG*c7dH&BXxyXV78OQx${Hc>;Oh}$dY17<#-vqxJ zU-51&d$rH~gYUK1}2Yf^n~2m2Pmvphxh-?Dn_?ejD^&DQfYjWwJt zv|x^VezMyyZ^%5f&k)$xqm!99m=<~78b?{a`Jg&~aTG1d z2IICBe^kc9u13yl`HggHqsMRupGBi6uaKQ!)Y#_#E9E+)nrOFf5ET^#1*Aw*i3$P+ zq=_^O2qMxn0t!eEEmY|VARu7CM6sX(B26g@MtTSd#So+yDM5<#5@LYRLIU~5_pbH6 z_t&@XUH4xmGs!%2W^(q)-uoP1Uri>WFbLUAv?J}iguY*D3M{ZCDODjg_UaX($;uJV z*P}&K`E#NPKZiIRnM21~0EjAEF9kB4T?M@(v>MeOsbB|Zxw4N@(%;BKw$IxaTNk9@ zJ!w{d&bi}6IiLy74f`wL2L2aY3$`Z;^^7N3OEQO0(|LeVif^MtC@BXoLTj`kq|-WW z@WopNsv5@Oi-VndEW%KyycNTih7ZsnRw)07nsW?ew)FjVF=}qMSVUFJ%R3Bvniond za5y8+fAVx;8o^77>kDIKml z*LwhOmgT6Z^q!-Vh<^M?PFn)lx=os!rDM<;Qam648OMhyrKsiKW0fMMZir~0N4ojz zK}I>zZoS)EU1t9FNt|wXyQAKS#~3A4GpRioh#wXBbO$Dc3#95Le31L#To+aabR3+k z+3`+?yDrFdv4AqFZkm^V5eOc-X~0{3vLyEwX=Q~8%e**Dv{cZfP*B@@UNEM;qdI0{ zOC!&gLwlSJ5B)?GyqWc!c`4<S4)@wlYurM0-FT<>sAfx9Ag5oUI*l#;H1&l%JO~ z_B@bM+W7*-HZwnr+n9U&TPHl5Dmb#d*o#y~Ot~AS9E3n1i)?>>;BSK}hUi2xURpVe z@0l-DjIEDW9HZ4eYfMK3KJ8( zAMwLX49AZ)Hb4v|w8D3T%(0fIY>Drz7Mbh7@n3>k-9U9)CH*Jxu5pbt+wzwg8IOLv z5K{FR66)j+-Je57lL?vYIK(@Z_2sc<;=>p=V)sZOKgfa70}-k$hkm}R_M?bnj*YBH zPJBQi$QVyfE2u~O_NFG+Fhev%j5YfT^#B4m^ou=`8tP-sc{x#Gj2(vN>;+$MDEOww z1p-<>71y=%5Cya}t$(E?bWK_MY{l?*-*V4B^N*%>hz*)BsP2O=p`tkOrF?lA;%2w! zV)?J`){u%l-}`Dvogz{3<8=HX4(jN$%uEcA^rwVsULX4jYrKml;Gg@G(Gdv5Q()J} z%rHKTnrAW)nJk#CZ`>Y@%WDgL*ua6$v2fKpB(sPOhlLm4mlzCEs{DX#)5NFGpV}1u z0GEp^EC;yjOUuhm$u`n8Ks3-3QLs%TeS^1tzMmtyi?14z;HjUjq2Bj-MUd$F5@O88 zXhvcUogkhh4DlbT5Xf6Tf2`_PdWkUJm&|V zav(9E;|0bCaH$oE>8y}T5AQw6J>b+B*F(_Iy6OoM6 zqZzQ@21%g{y$uXre~B35g8uvfn?6DF#1UY|2BaG|F9!rO(TVwZ3Xy)sL{v{0_?0N# zQF9uHovP7Be(YW|+5ZdZvPt}XyCFl4OW{1=xt1z<^FNk8|5hpG=!fjbpp-l$d4TU^ z8OZ6#o2}8E0ouDdHkJPW)K=r`mGoWQ?6t($#6+K~^EP2V@cY@sTLG28h&miY-{AG| zj^Igqg3NzkslAv(^LZ}6(x146)8Yx7C49yA?q^Kub_CJpGzWqdjX@4r>s6l^<9rT- zTPb367iq06BfPlDlD`cTo=zR=jwq(uzW`tFsoCGNKk$tDjG>mq4gW8)&rZ&mdbeSM zFT9%Q;;cwMxARdBadM6Z#|xog z)9oPK57t=^7ThV@f2C8O1SgDEaRFwjt2~h ztlaNk?Jx^_Ta*VCh8d%0KE53|29OfIta+l2-s0X`%l!@1;-twrl9=;MORc-qOrz zc=4+{Hmjs=_Jg&z;|t76nGrgmsR@%@p=@Kky5Dg?X-f93^eNYkT%OpYy=tzLET(e+ zxRUMy=ZM@~+XvOADd1*Kg=R>Hce1E*8?N(4YERc3Hom!|BS5q@hRNsx4%9a+ze47t z`AvM2CJm*j(~u7qyZ9WlP7Id9QrE(WQd@hDDBhgwA}9(gZvF7cgdvn9dq0?wM?wb5 zbOEo~Ex_3!l4O^na3Nqy2{2Z~&gI`pOrkz6E4xj_QA+i$wfYG}hTFI~L zc(SC{2kVF@;u`fI6z?fJP05;s`J#eGo@yjG3@#lR#IN1k+}xC1XVSd}{Fp1Qs_uj4 z{w64=N+W^2{Kw)h$BxyZ=~0)AjP{+rnZ7RxT%Z09J>UCbJgq$qizJ&avd0azDJ9Yh zDRB?E?_b5(*Zx`SpLYSYm!uy=-m9(^m@!QN+SOP-fD z)O0r$uoVb*3|)f?lhHHCeL2FvTLRz zBR2i7VyKkjJ@PR#Q+nuI)0Gr3;E)iSg`_8duN#?}8LrItx{r;!DYT|41`fuN^&=k{N+X2;PhRNPko2HT0)fy!E9MZ*rsqC&W%gSOZF#F6 zvnX}D3ABwJJS47;cdgx?y0st!`c`5eJ4puS7> zX-7WGK7PenF)kszAXneL>)KtM)8NIjzI^#%uRnIApW<&mIv>UCI63mwo8=?E&{u+~ zWeI%o>NFcHpFN{sgF8s=FIF7Bmf|QUTL*aV9I!@%tL+-@QpY}cX28?d7WCrk3Lm~! z_22a_d`m0=pa=z4R*Gfx^rY21f5eeaIzkcJE@FHe9?x8;xajD!`HV}FUJ7X%a2!*c zr<`R3tAASI=fptN~@@pK21qM0ZK`>?--}? zsm54CJvWbebpWX0ZdqMArPRXQ0lQA!#7?4?Uw}jIDr8UJPa+AfE@IpRp>+0~=Bs|v zPWjXr8D+0xi%z03G9-B}Lc$r%Z+ZaZ-BM_3F{xk8qemzOJYM&3_i$7c{C0um9v(q~ zrSD|v`hfwFz*)sF1eL&w4njN71M{o#jmqJplAkxvWd}^Rgd)2f9#Dt&YzznT1Ktj< zX1)!Z&9OAP(FcEDGG+<+e~27JA_t*!3;!;%wc&WPI|JzMwlr?}v0(>U<;*K6Hp zLZez-9xQZ8jp~ldHbX9zR9(2;T9)62A3tGs^N}qj@Cd_y(EaL0cA0xUqBiY# zhSJ})LUE-SFlATE>bj3gF3YX~;F*3n{da_vY&SeU`=rTT@?}6+inK89Y`KN}xews9 zLY7t}|3mWXuL>?+1hjkaX2eB4U_lL97jt3LVSiqq4CPkJwY!?Q~R3s!MbXge*RV1Vb`QTsiQxx!y@l3=564GlV zSqV{f@65enN&fy!I;NLup9pYO?0(;j^|HBV5ux?>ys{FXo6{Nv`3o#Eh|>u|l7 z<3_sMVLD-l1>8SHz;AI~N%b!^A;IhpRc+IT#=OA7I%Y@C zte*DdkdTm23RV43Rh#jKoO}hHO3Q&q9K0t)g@yI(^$y*q2$?n&WmyS{hhe^Qn>kW% zSW8Ko%8`jCK8!jnt!FI>o(X!{p=Ob{n}3|VS(33lo48m>E!^cb(tqiCeqU@edFQVY zegc8LopCzpao1GtTN_5MBj#E1ByQXPEyhfp`SI?Yd)A|jyjAHXM%}YQXmI1}m_NbU zY`m4U-=TO`TlqEBbU}=YV#@_09iIec<~)2Gx*n-D`rZfm694*fWI!CN#`5s767QF1 zBaR|MWwDP<3!jZ2LCB@%fb(MewO6-{HvpxEQ?C8XrEp`tc*GV|fP; z;_T8WBzn2c0$IiF4;n7EYn_~`aBlfBnR{!oQU~$7qDp=@CCHLk@e!gro;1zcut(sc z(z8N6vr+)r_6i>ID1r`3)Y{RsX3w>GwVJ!Kc16HCFFM^FMKz0MwUzCua%07c$WfK| z-H;&*(HDcI>@p41 z3ma*;=m-&zqQmd7&PksnK4{`AE{UN zQv`NfhmW4{jGh&tp4?XiBtCRt2{vLEjDzw78_>P*`?TrfQvas&q4@oy)G1gd>Z}{u z)ZL?DwGV33s1)CFBzg1J+lS3ZP9GL-W^KTC(c%J7Qm4b;X?btlozain4z<3WE-2qB z9(O1vLmO{scN2Ks-20?BWDw$2vT*i5nE$DCmEeV*WLr(iYr&_no4>_KI5@=_0E_^OigoE(&maZvy zDP_YIPqp>>#svO9{YmI$&KF8OF>Y`*UixfpD{njmxiP<$yc zx;>q4uAEpB7ZwnQir&)fuQX>(`QeExpM*aAsvok(}}annreQT}FEiD-FY z=0p6a% z8532Dqk)O26uD7kTB#EuR-WEsR;Ew3#!;v4z0cjW7hpzz-89GC$Ttg`Ab;x5lStCGGr1K)UGnU$YtVR6^T z%YWn6SuEaa@i9%7?&1;IykYF_AB^YhgVa(v_$bkXGOZo5L)n76v}^DIh1?_6Z0 zh~&L;;0Ho2$U;~xetT|q`ypQ;)Z5KZyRy*K!#laUS@I&huJlSz>0&9;u_u=Nu#!W$ znYcAKYBNv=nv#s!o>IBX>?D#|)Z{?tWTbAHK|fA?^eWY=#Y{M5bsGzp$!q<-3VMHd z7*z+gWWKp#+2w2GZMxl0jl9_i7dPLi`*Cs``Q_XwZDQy1;c+X5#?Qg1VCB$+K9%7F z4WT4>VF?+s5}-i=)^*!YANPP^0#u4_lDi1fPk zTY3&|yP{<_e78B(mtiTxC_6cqzEfifqk+je28DM+47Vgb1ot@z1ViK)yDRHT$VVi7 zZk7jk{nnGU7Fxa!a%)s8f?Yy4NG6tWEkovlSD?BJEl0vM7D8|fAuHV3z@p3(!^450 z5Y)7p6P1ddL|qc{<5W#t-Dxxkay28$5_ZS*ZIKBIajoO;d6$<3OTNiYMVACd-2 z*QLDPh`_KJAH)#H8>#a2OlA)}((qeL1W8uD+UqdVR#Yp4bx8L@xImk_SB>rB5 zZv5Xp0!FNR#?BQ-ZPq6Z76N(IeAbieScW|^tDc_@X1c*gI1?CTY7NxNLONv^pYD}u#}ps=+-UUMddG) z8i+*l0&}G%T=HFAZw7eB1KahxeH)U4UrIx9kB>m91wBChs7k zgw!FMS>Em;l@~EX>bI6$DXk(Ws6s5m6uCKupRIIPUyMXqeeQ!j(ONp%gQ2vuE>({2 zGde;0iyNEnoHt6y*OO~n`c&?@HEI>9kts>u-=~UB%P2e1_oCe~A7`5CU8o(iqZn?~ z^X@y`lwzMt`iunWjOf^md~(!iOuq0nTDU!NltkX%?DQi>!_t*y^|YRh2OgSzLywf zADIigIRAZ?+7Y1TXSl@C@u?`W8G zr2Gbc`*aoRqvS*~aD0l&QoN~CM-J80oTu7{a$Izz_d`?0AS`94x0Q88^bUW$9xmMD zT^sBWzF%_h$Z;Qes(4tj%(U9WnKs|SA+vn5Xc9mN4zt<%b8~NS)BGkL+w-IPj3N_8 zGGFVS;P*7I*jjqcVF779wwBo()MO`b-wbHL1}#JV5y4R=%qZv&N59;fJ|`wjzc90E z`&1<${)F>~+UN%i*9E)jUYOENP>+XTZ@ryn-Q|1Y_()aSXBX#3nWj25BW?y_Jt3J< zSfdb3Tll6liM*;$SYciLJXMeqK!bT3A7|+~|A>O$EVoXxA|f6|qXu|ufQMgB%uw4IV% zRs0rPE*yh|9DI^16?YV^$wL9E1qa2)lP08m5HX-i1Ds$H*UxhwmY=!d^9}f zYC=;GhtgoanSusJFn_r=W^>Q11Nk02)NiCCr}5OEZ2y}xGQ&WQ1e8=>H#Ngd6V#=*yz*3~6q zn>Xt(8EBmQCK-j;3>gK@cyl<*;ykTjj!jaC8VgJ0#E#bIFxw|X$d21<-UFYQ+wrSj zoulB{np%s`#asYp!1bxgI8BB&eAL&md0%scuKE{m!W3nN$tp^LVs`gxoXEkm{43bg zXU|OTuFoi`sIoMiY&>*IG%G7Bx5nz9+f9`&w?83U+x}QMAe79rTE_8Gft);WB~^tz zV<>IN5)CEfu;n5pD{H7diBzW>GVBM0kuLUi}fGL)ppad$WJg>{b!Ecn5QkPt`0I3sP&n( zLZ{DA)cpN#`Rc?a*8Gz*6ZDJLi#aKqDwAL0Vqvvgq#ATLcTkN^$k6~>boVjdLZ?S%Z6li-k$3g|xXD{y6Qp}YKA3nnX@ zl`Ikx!&am3MsLdx!{tg=Q^&oO3ULa@Wi>VNvIIQN=euJGqsF(_(yg*h+Q*-7jW=Q% z`5!;V9P;U{8;*KzWIo=lc)Bwi6vg5*W;s2i?3uFAeNc zn00=<1^cS9#iTm?UVVFeyTjZt#b{Kk{{c)dM!jI!0T z0GXScCwGbA6@DqRf&1QoPrj5`-_4WRA~hN$1!^4X#6F(pCXqji+feDOrA>`8TaHLvWs@t@pkuW!i?egc#u= zgA?kne0+HKJzbxp_A)Y3varP6-uk1WKIiqnWPS7IjW#1*kW+$8sQPq8(4GYURJGvA z^XGkaoAKGHL$SRwfAjN>#5TW+1#fMcwmLC6H8i(e1?M}Yoo|uS= zf)ggEps?|NC*G`<^#0vgMUdrdjnf(U-4f5*CR69W=ZYs^g;n0zUS;>Aj3NH>^(Hk6 zp?nVHXI}&FuGiMq)VD}hyYP(^=Jsao@7+0c(skZ%B5R_v*vhD=yl8K4pRwl##Z81q zJa4QYH7}C%=0YJ$dvAt@_G1`67bT}qmIBF*E9BUZ7WXcf(E&26@5!+wYIUQs;wd;C4~Z7MCw4-@oLZPMTc-{(~cYww|&HJ! zOt${yRNGIEIYDVuzqp}O(%#KjEef}wxN4SdRB_n}PN#y}4_zKvgC7RHl2a;JpZ6Mn zt((1^D1z4-rV1{w)?t2w*v6baJu<5jcK_~tYczKdO9mz6!{^U0#KgpqW*RIQ@avk= znwkW`lnh@_5dNj_c=9ULyur=I2_77!XQ+_H@4@SO8X+cYt1sIVDEmQu)=UImQpe`C zBO~g{UcBd->F~ra_U=}Uy~^!M*o7bHI*=K|kJ~Xf8Qf-2cusL8RPAnE_BKC;#@9HK^vpAZ zQDXQb9+Gf@Sq6qPl~UPHQX$`RADAWREuoJ?*Q~NT)3d{?UgJxPlFqj7FMnf2?ujL# z;OD>2gtDk=Oa|(^MmMYTbB_3}Mwbu8zi?u3 zw%GQc9C6ALB~t(o?`iLwIBZX8A16jU4MfdfA4tK0vZUCRwuB9^w7vq>&DojNjSM2c zJ5_S`j;g4rD4K*LWhmQ`nuaF)V$m=A84k^5K66k+BbySyp!iL;nEC$=H|~6#FzI^2 zfTUe(PpB+>OzG5eX6d2z?ER1>a>ynebOLN6<+XFVx*M>EbnjgWa1#1|K%1?cwbw4u zL?aM1d7vL~Hp%Gkl5^++03rPHM&$Cihs=fd6{pieW)EplG-KS<^8qz8qvNStdY6swx-|HZ{-PpLT?E#Ye_TSJBHw-On;sFk~ zDTT8%iM3$0ZIwuX_m(Zh#l^2KSL48#5WH*)q3onNnuCojdp5EW#r!mAoSN>S>o;aC zUkSn8o2?2rX!Jbp#8Lk9(}&}r^)L|8FY5jM0xdEQSA}Ap8ndVSum9cmEKtho@7G|k znJy)Hg7M1uvV6H~ih}^HpgR`zOfHh1mbPu#`Lgte(V((gb=NO6G&H$B z26uU%PQx=OD&kS_*7q$r_(Z&s(js4$Ql=7(V;ynf__Md5qkAbeCial|WqRG;VX(AZ zk|So))_fxmUR9`=^qbXt_So-RwCo%l>F!WUS65fobcHk~OVaEMUa8#pddv}vy|fBW zhrdanprmLU%{O=ua@!LKm2Jy5`<`iMRbT%+$92#fg^P=crLmcz0E(#$8b|&4Upx8v zf|Gj|JK_P@V6c_@j*8KKu3-4^?L#Jk>s+jKr5vWqVa*<_0o!S2Z~j|&-^+9}u707dZr z2fUktD*k^9-j}DH+@HEbYaNRbJpFdL^EBdEZx-L3_5r8$3{prt5||IPXDtyCZD8_O z`ggguCI_{LC-C^Ap&(1;9-o@!KFDp~%Ah7EzxQen$9CrbsPy>r=+-le#J;sg7VvJN zN-%avuQ|I3cSgX4q(mp2`BH`5d1oT4J)+P0WKQXE!mNF_`HA2Zogfw#9A-yLMME>5 z?}oqP7)>E8yuedpWG~XPc+)IWTv~4W!JOR%%xbAUCp7KL?VO;B=CLR5bO-8AVlB^sH&OX@xO&MzK)RiSil@O!=F@rxi9; z1-F~6@S-XHrf6yk1cArrYKUkLK{2b*xl@gc=&c7(M28XYpb4gQ&j-(Ly6qpZ8VUl( z(7sxhJ2^Rdii)}dsO1}a`pC64^Xv2Nfjrs7nO`mxHa0ebXA^4v=T}z#=i649ye`3o z_<}=|T1MyyeC@N96F$=#B%&0ah{vRRq<*W$X)~5LcuvSG)IaQZjnQUWX5FKaqM1t(STE?25+ z12FVhs8cJ+`x?7xcCQ2d1;0ZfBruh2rdvp=EJsWMv6^!oU}6lkVZ#(WLMqlOvs_q( zX;*ooBOz3TleNCi?(T=>rd_C(BVUH}oLV&;Z-!rOAweJslRM9-iYFsM6&}lz6+G#s zK=f8=QlF1}ZW~7%8BPybO@2S>jwbAgCgebpk(ciP1>Rt;p8F4%dgCcTakuAIHcrw^owTI_b?{)m5jJBMcMQ(_xR)ZXJmBWswQjtT zWPu-8vWhVu6S_>7A?X*aLHCH>sA9ix?f~_ucZlOiW4H$gl$139B&@5(&S1 zn=z~NyvOu|KY(}!-koW+xdm7bZ0aF~Gi-C@3Fui`4Ox;Rta_YzfR=)hvbWfp4MZn1 zPNGjyQD%R>B1rDo`1ln7z*l=!BmOy42-sL_Kl}Uk3f4C~+`aGV2BwZt`rA+NY(byO zi3YGAz>U#}xzXMObjxbi9gQ0ELa>S%JTf)2+(X120u^nh(jv;~%e=YZ5&7 z|GF%-JqW`jKFDyYn)QEU0w_gu2T!`fFMVdDIY%B)d%-g`tw9++O8{hIWo6|O%$)6s zA{_Y5B7AGMYLhQj?{DA>tgGDO3gu9u7^#Dxr9g=93Eg6KFrbSV;fD=_V^s3R>Ym!# z1oLJMu(>MG8U1`^K7V=GlxFAl>d7!B2+D)Cw^?8%e@D-W4?<^dGKkjmJQRa(fQb`p+x?qo*Pr zBV%;y!kyOj#o@^3-EbA2pN`1`hE3jV;h1Cv%7?;W)Qz#!l4Xd@>*rTiR#k1!g^h@878NQz*=vR0IROOLgR7-43Rr?pwKdlA^73Go zKQ9v6w?FDAywx%-#a*%=L6eNNMl{j z?8m`6e$r8U80g7kLm(<){laI~X1(;qEM>x4(i)NV7dQ|{VgOSGN?SP=CU#JJ(t_m;9tk!h+eYDMKPPjmH-5m=>7BN{s;LI*n~C>TwFU#4gf%JfKJ8+ z$VJdgcsSxG!1pp#msCk9EP6_FF)m2v=H{$l;Yd<3q+I}<-Mur20mx|i?qb2}cjvQY zT^69rA-?kXeARhAb)_&h9HhhWSPT{BE_qSVUv+{p=(Bu< zj}W%sKR}+Tu}gKDpPSQ1;7o+{ePq&+?zzbcDoa#yjrAybcO3BuV!L`bn*Uk+4j-~y zjhS9F?mZJH;BtN05stoD!m~(UyD#aac97;Oih2D4tLSNK*jU_?z)r_H92}gEvux3{gs10`b+GZg<%gyZAbt`!Owt>8kt*KG>V0Gkw&9s`7O$xMM|YpKXXXZ!;%aJluAT$n>j%hB0L0iH zt9cG84A^sGYHAOt7Ct9^G=#j)uR(<}KmOK5NkfCrV7K)31CZ|#LO(-mCsBYFCG(3a^3I-d`h&lV!lt<${L5$Q? zslo1UKvq$;$A~#Af%b7b>iOPmN2x)h_sS<4>!~Kf=Xi{?UVcsOFUiP^4l2pXgUtKr z`jT~9;97cfMqozGM2vTCwPGD_A{)$hU1C8XFJC`c4h3_wX#6o1Wb-qZ%|P9@Yocp zmSBY^nETF~oIL;g>E|P$@1o>#E)o?wE#OUZ`fJLk5 z=i6%QW%9=fz;C1ft47aHIR_|lp%ZPwPbaQ~HT4Q7TvTW)gXH2yzl{u_>OW9uCwN24Ex5_kx`} zu^RL)zQFig%`c1C>{;N=Hfn&3dMj`mRdoXI;zgQiqatK19vw`(Mn&{Kmd^SACpC4H zEp9mr6LGn!mrS+#cb({#7)f+yzm(HBx(K>$*4!EDAN-N*D=A?cDOQ9UEtPfl5;Vt9 zRopa%g1?Txb%5rn2~~U%|6BqHpsmRzDnEkXqEWp^K_@n5B|u^&K+9ji$13`feld8u zTjPNEUi1e-xrHM(0(1g&sec&GD9^l~kp!g*UDA&>Yt%VAIg}8Z&(YoEJR$Ax`^-;- z@UWh#qvq3p-`N%bQt@Cq2OTZvF`ODs2F6|4)Mwhi6zoJX0Gb&Q_#8gjDU!y*QlZt5 z)d&GYXROviZ>~U-vSd~U$W;jTZ0U9;h>oHZp3rCg+n)UzXO~1IFjKZpait@fOtby~C>{&mcj&+} z)LdsDR-avvGBJ5`6FAdTw-_)moMnU~@Ld24UGM0ivPOTt85tSnv@FFFSIA=%{dH8= z%5$LofS&${zBPOd_@Bu&c2kwElXAa*|K@dFdurAbO9f_PacRSkK@VbXdvB!=k3IuK z@i|MAN^_3-rw|JDQ)5`FyCy*qLrGR^gwsk|pi!8G*sb zTj*Jj?#Q}AxMj@lyYMJY`3Zo|?e^RZNfMOCS3*g6%=*20PR)`44I%+a)oNof9dM0u zZQ3CKp-S}XOsoESGaYk%;k0qpWZ7BkOB6i)BM#s(Sz(846dsc|{XHG{>|q-~%k_r~ zHwXq~8I_(R9)2>!vj|RFu{H3nT*m<+Md2HH$LAk1QuX3}9N#wIGwNpd*qK0eQj>hb z|BBc7ebBwzgIvd^)B#;DDh{ZqZ$TDCUwU4aLN~;T=G!{~ZvX4YJ%R8nfrGT*F4H1s zfni&Gsb~}m>X1U|9idPw?(~W@CT%87M!YD1eIBM5iPM3e4ZP+*1r8ae;{skggSS4g zfH)2gj_rkJ0R)gl=#Pk>K>b+JSy#;BPX?12Q$FBz@%ojJ98_4QWB9{&Tvb^h$APy>3yJ z&)u0vhp;u#X=KBDC(gX^PGWIk{#UJ&5$bbPaMl`R(Z;+Us3U89p_}_}fSK`Av-q$; z1v~!j`UON)(hz9~G(r^ghsKu?%X0)?t2zU~P^wsmF}(sq@(L#OVZ*aN00u7X%JZVm z|ET>*iw(fQYa1JQ428fqcHbTgrK?lU(Kcnf)~$eKl2$dhZ7j=*|TRwDOj#8BaF$cM9QGp zeCRLBQ7Lx^R>Q zMXNT3w9Ab}LkGV1Za3Zr`|CU6@YSoNB@ee8a>qj&aBxD`piCdN_c>eh_+p5;sA+kh z>U~C!nhfrK_=s7cM>#JZk|HMc*W~vO$|}ll@mHt2 zUQAjBKDZ~ch}(_OJcge)>MUjgj|$aq)qOe52P{303U0?`f>PAA=L zvY;DCnBrgKim3;6F%@Rr&R6THIQldM?~lrzzi`{_2sjj~*^#@xDUKhZQ%q;i*B<%) zy|=d)TO{|dN+X{M|pE$^lR%|)a7{gy@Yc)O;T`h$al5E*cKa6iH}J4QsIgj+-!bR z_63Vv&9xb>DUlGl#@myDPxY1P&=$k4{CCZ~{?5dYA3p|hgsb0EH(YPY$+6pVCIB92 z`Fo||z>_P1OA=wsrIUU<-6#XU5yZH=##PkwTo>8p8E;f}+Lu>8?uPY`$VPL`GbOgHEhjs;>k3E*2jPT@t-)VXuV5Ee&hg3<3ej z{yPK!(4h@<%ArO#NFgrm1RopgDnyl5qa83I+x!KHke{tgLqz5@ILwl3y=~(&a`H_o za2~u_!-z(2dsF=_LZA26hfow;#|HvABy=KfB;LCl1r%0eUb`<5G8*#&yN0cXQlR^O z7{^V^SwklcXFRK^90x*%Exgu+=fHH? zjFo_uKnPBZF7=P71-=mc1Jbe!WDT2HEXtN+X3gSchSFaTqqd;CBBoDA!|mYHy|@M4Buh>E|G0v=jw%YE*iaB|9Lz>`=8)$k>Po zd~hruzHuolkSgh6VLnGO@yt$C3GxYNn|i^ZBDT6Z5sg$ZEsD9}yO>2v-}^)LES~p3 zDuq+$K1=L-SuV29O#YDTj~XgE`Z|axoqKUn`2vRFvwFq@QZjiiiQPyDXB!}g(H|NN z)Jkc+V_qp^IpR+cvLBz%iFy6Hruo;77P50TtApHV0+FbelE#Ge{ntX{!|`hhV@lL! zBXu}a<>Y&zY5v+b^o?wuH})fHOvs0-WbX&d13&sYx5=1!nl`I$fy?#Qp-W8 z2#6a3PI0z|t9p8JgB$=%=m5}IaAxldt;Rrz$#PL313Wr5rv<^Odn+a+FZh`wLKzD~ zBmAAHEU2^XJ3cdU>nAH4Z&B71LwDB6J;KE-Oq* z`0~3n=w2K-_L7> z0OC^k!ubibmZN#EMVHMiFV}HJ9yZYT*ryo|zaTDIDK$P*pLS5rYSAl0MtT0zC$W=# zJh7jiU+Qd?R;6NqSoKdd4VgK0H&Zxmw>w~}nj<{I?rTWIqe@+p0HBrnUno*1I;rb< z__uL@3I$Z{U<^E>;6EyuxEw6Dax!@g5_*gXa(^+UtP$G1uuA4(Mz! zF$zXg$8^XDH9V<muenn8 z0bDG;#mP%9sy2LX3m@P1afNK*tW8KjY;jqA!=ObK5I^RMst%9WOIS96P;KTv=N%jz zoaQ|62$dw17nP*t%`%cx%M~>Oaq!ZnfsxBxe~OJKSoL+TRwIuG!4)=yDn6scC}R2E~9f}$GsyE~g6unjDtcbzYkjKXujhUM?w z`{Jfbovln~3pQ7M{rVbY_pRp`L+0#JFqt`8dNzblmGzgv|;Bl2d-4ya8Iapd6Rt2f^?$H68Fp8Yw` zLav%*h+F)Xy&12nPa$f9DWbU+^PP0;3nHRO=sNWxB<_t&s}mr!NuagS`vuU@@84@(d$N^t+8Aki6g8iN5q1nWyc(Era~ zAF?NXk>V~vbZ8l-@9|FVz~I-b9{_&d1B7dc&)yoIAO_Z+(E~)hw*Mxe2F3uI07^)^ zmjKKqgW>Px)D6>B9rl1;jVo>xK1;#Z^7p@k#lG-34KLo`^XS$&8aOx%_xGS-5f_SDDzSo?mNeWd-~FoP{XUzfPtCkw=&XSN$uuhY6z7vQ*@IuJ7^Y@s+aQJs_Zo-CCnT)s zUF4@4nu7ep>Hc`CDDsmEr$u2TQtzb)2t|InjBFaSh4kxO<*>T$EEOU^#WU}X)9iOf z&CQ)+1@S?7FXVTQ$ZI0L4Iri~kh+l;Yk?A)Iy0kFgG$%{Ql(u)>VlauZ}g79Sa3S8va8tuk{5RDJ@w8$xBuovHOaT*yKv z=KfQtOhy`T`VI;BF4|R==zM&9NKJR=&}ag-;H9M{)m?n7XOvv7*TYcpht|`zB!2L^ zi=S^#hRf)qx_*Pm4bq554pX)hLd_h^79m5b8!)iH+K1L6+|U0CJd||0GN?|a)9ZQy zfo<{NJ_S?wvWlU4i^ZVU!P>}(M+rpD1#23ruW_@2z`%M+#AVwFK2wI)I>_r&^YYH%+k;p@ z?r87d8avP_teEWTpa}1gL8~MW)L{fUU+xG?)pqo;$daGEciwfVW8WXPK`=ugrn>dz zr%q_k1I+kCN_lbrZgIhMJPJisC+CqfKqzkTfQ!U0Uv@HT?WUOl$?=`41fAbKZhP2m zL^vF}zdiX953lmVPx%gDH;^PI;yKsP)&;J;(>(ByL97`gJXg#jtLSH?ysZ^5cw`k6 zP8A1wdl4vlfVnXmAg>3Icj5DmUKdP&y+sZ+?))hBhn4c}uACMKAGzt$uysc0Qg&*j-(-K_x9|0XyUG(8}97|Kow*Rq=2cpzup!zBG z0C!9B@tU$$L_}}sza=97j-dRT_jBbIu}ibRfpxn<-`#1c3MsX=QXhc@z5lc-AYdU% z-v91Z-A2aS0_1)!8&QkC0U$o*i32YDSdSJ6hjDq6vS@_-okkkHd~y-WDy*Mm-X6=- z0-HDjd=gD0)KAtW&qc`Pn-mOmq(~z%o2$z8&Uu0-2mp(GjcE)ba)S_|#t9EqH8n!8 z2!WW#;Z!>DM~ukd^u)xDo5SXjkDqXmcmXo5vKrc$oHi_}<(I?pGRs8lPpT$dRm}e( zj#Ji_-|gsi9I$L@$V%W5HwTTFfZeS4a%Z3e^>fIw_<&l2A*h-|NGPjw8V6xUAxTI{ zot!7s6_?zeC^UI|L+mctNNRD`o_le>15*SMn?r<$gm3n$OkwAD<#9RUVF+Q|8z4si z-InVztxs`r7fh+Z1mV&$3K>}c4g3o8K5XDTkgsU;WC8&d8glZ78ADR~`maFFZKm7> zdAvY*6{H7yEUQdvbo>6-*xaPo$ovJO>?8WY8Cl8Z6x0!1GaC$&9!<*e1-xUmS`ZUW zz!x08DXi}(Am1;6^5EN5jn*qN9grmVe62T*`TMQg#h_+_O;U{meyOhFCNd4knnmC z|1ZE8&%80~OTFQnUrmT74#ca`e0ltWdA=AeL!Z$3#k~U1)2M12xBg?TOA%LcOTo)o z%1W^T+?OwpmYI_PS^$Qx*O)&TeeGxHbd21p(yf0tATyo~M23+es%TYfL9-h>{`kgsYp5I%U z8v|1MAAt=vU_b%`1zh{9nV|RF4$vg%@Hddr__bF#;6G5RTOSGXGdCLouVPJMO`^oF zUPaG4_AEOCE0jUQ(guY25Sa&rZwKscZmnvQ>(g!Azgi2Tn8`xGsgI0|jVwJ?Cb?Qa z%>sJm;^A!uaoGI(@$J)je$SnVfo)U3Pk6JGR&Z8)_C|XMc#U7z`_#91WGT@AndTn( z8i7HiVqa}%kYZ#1205UuAcLS%GJhd}z`CZ~8t1!q82JyoLRl(pR;hi@_9Q`nrKG0z zEoi+YM;IH;eizi|f3*QBy;@6D_TNpO9OiHu5xhZr4l#V2y%2B-NFXAz+TsJ6zXizg zL^N}!0CaZL7J_+MfJw|94VgYQ2l&;>L0ZQmrM5XeJzb%}0UPM4Z@_*@zrbF^jrcW9 zc=|aJh0>7M^p)>7X3r}UNxi@#k}&ktt!I$n{=^6)aR+tUOQAWJAL?x=0}{c1+C=xR zEx|gOeD!}VB9f^ovR0=1Z*6q5qsp^!o~-LWXMJ;XwVR~;hWfZh0yu^f{H-5VK|ry^ z$^AtffDGJD3ktvkbl_QMluu>Ucnvzx_j8q#*g4crd?P;SiNye}3}7bztS(Ayc_Ua( zRiXqIErC7-Ro2=PPy3+!0jTfYWg;hq_(E7%MQC@g8vZLF^52I={_FQ!`1ye_{SVti zXP{%ybTCjJ?rAs}h}obT`Yx#f8>@ z4W7+G-WOQULL@<2{bTz#AO!q2eg}rANjWVRRy?bA5@1pUjB=oTqv25j8WvXCioHO~ zLo>ZCoO{py1D716QR24^lNvnsH^%PsyH&Fg?~HEyUX>oBZ8s(^F00?utz{4QY;zR4 zZ0r%fe2Mq9{QC>ZE=k(^7J^N=VLtm^(5_@;WZtgL$VkLQiGd%$HYtkCt*pcrQ1z_# z7If%JzI3=~c3np;P=I{XvUY5rKXKwDI&ORagwuf~FDT+*#6}T3>fc*Oqu#c|Y7Qik zde~QK*2yDDfm2t#juJ%0J4hx?+{9?gx z#KZ{c=sI>9iwDO~Q`2$SI05m^Y*N#+3d|l;uz2(GTEvK<8xFD<az z&X={5l9FcTr_V{8fb~h;snGVT*CmZD03{H9=T&&u$ZiyCTE&w(d_Lb~!vPM;YP&}3 zf0tcWVbX!p+0|`=*elrIm#iSJ`tn#cy29Gb7-^e87!1b7@6SmJxn%XsKdgj$QutNO zY|Jjqrl_{OiczF9v|3f)DX#BP%KhED+6UfM{Ah$|wRyUkl0QZ)9pY#Ea=$%Gk^ zKPzYRF=g}lNiowhetsT>y8dm2y#DgW^h&>vuYN5Y`zjnJ(z_WX$bzh5Z+9PjRhgZg z{fdoS48r3C@!vYip@vd)OZ6Te1WdaI_3R3)ZEacCPiWI;3wo%YUtDO}->elSvLo>^ z2`MsjrSt<2H36rPntL|o%aYk*Jpg45*V;?f{x zH;*vAo!T!vluMP4BXsaGg5CgFle#G9H^4p&2r>WuV)B(MUdFyYKh*02+PJQ2R+O0n zp}x7k?)O`;i8vgpTSx-&_zc8dw~iivr{v%?+?~tW3N%x@gjA(0{#gejIy^rgC;N_f zEw5@eX%Y8Zmv~6X(|$U8U)y0i`Ja1S|HWvR;QD-@;qY&>JmNaw+ShT^SI#L6B~#6R zr(bGK{bJyeE^C~sJL%WGN~q8uX8J{0*I##-ne~Qi!D}rP->@x{&&?TxCPCXXzQ4Un z*MD~A^e6E zDf4_1$h*KBGC3G`!(!up2$E6KGvX#cOgRbABGO+VBM}gBzXXBYDAOjNdLK~7MLj&Y z%yp!EeCo&9G}YCYfEW=G6;&mmq;>7Zi5RmGd8->DG!%tQUMwU;#0adEdQDyMrUgW$ zZUIq8%G~Ts`EpmXs@`8DG~8|G6v#kN?+h3twa;voRowh}vME>-^X?VP*Gv}aeLh{x z*zTeUEw?xluAi`c%dBD@t@G~&P+VNx%k9E!#=Fj*9tt5QgGudb{R`W;?Ucc0#DuRo z<;a%;0xF_@iHSV~dIRfb(1tNM%4Z8g2n5nQJRBAm7q@W?9;|L;K~;;Opx{w^IN8_o z@)uWESKi=%nfP;eZ~#P#m~jGhl#umBAZ!DqSlei1U_i1llo1|1h$eWs6v7*H-$ZR> zsRC`K82+zIA84?iF3mFaFWoR2x}S2PUk9O_66P2KxT6bb$ zEMFdX)#2dU?x4aqY$4h~GfY<~_i z8v|xmBM`|Eh|mL0{}xUFQtg8r1kCG~v%~@dgd(FNA8<0JG&D3&kJMQJkha!~h4j|) z|Ec8K!%Nu{VnlglZE6>)U@;UwknA6V@ zjJ&VeIXL7M6i5R2Yy>$Z`LRWs66!E}WJ(KIWqy|cM(StS}FS%Fhjl~m)4usRy2r>68dk2PtFkI9|0O-qY zLXuWTWz}*X-bK+ogT1nG*K}sP@u?I(Cv(4W!@70#2D6-KPb_&A0_ZV~-t1wVhK8F> zS!TFKSYB;^}r%(!=CtI}H?h9};4KZi&Mvon< zYidg7A9t+u`6|LhGX6BzKcUsNwmrEu6_3GCGQ&qJaMY{*dYTU3=w5tT@RDo-nu+mz zkfH9a(FPB7p{q?uU5#^TWq=x)bHgGiFb%PKj)wJ1onot2ttH$nX?dFem6LteG7G(d zIk1gd71LFUWut}c(&KrXVelMTs%|17g>7NNq8oI!-${i<3yClWm>;;#Ik7s}?hMD?RK@ z4fMt#5+wmnH5s{pa`E?gWo@D~oD}vC;0-t>aiJ%cHx+V$vI?r%yMy)9A~glvyX#$R zmH!40u?A}SavVFdZhZV_+4Jh!Rb`}7(Y+LE&Zf<8$M(R_WG&x}Pn-B381+vst99N? zoE8)uB)FV==)f0L-l!pPq*gwfg8IdZ8ctxdwm(r?^`nxQ@Lg5RGvcHW8Et#T#CxbU*2-Odtx*ASwCU* zvMunR-R`zn{z~^4Z+x|QF)mn5YRSkZCA6^99Yq}- z8G%4h5xImJuU+sja4KE9g1Y7C2E@AX>W*&%J=1Muy}}NPZ<4lZINzrAQfwY?AfabE zQ3?*tFt)Yb3dWGhhD20-Z!evB?ez=J1>_m@47Gh3M7k32vW)iE?1Uzbh=SC_gVA!W z>DoL()+>K}h&1c&?HaA8^- zv^|NV480o=h34MD?mFh`x+@|g;x>g63k+ynuiS!`#Rc%{40XAYn6N=25DrCWk6Btu z!XEdL&kwgzhrj|Xbf(Z-d&&dIu#tu*J`>{DXOZjxqkgRA_{~l zk7dyk82fIkNPye335a#P;EP?s8QS+e_Pw~*=Z(p`44&h;$H6;Ezg@C(S~ThKXpydL zFva!1M0p2I?cIb3$m&UBVWwWIO4lH1y zA!`UoKys&{WOy<5bM!$>gTdJ>DiMDo>z1fKOI_*o5W288iuS>o^?Y;>~6PoAql;9P(3z@)_e<##_xA(NiRHLU1&Kr(HqJW@HwZANy(s!*S_ zF(50v<}8~(`fzwaVMIrkaF(jkA-9CPAOY;^(at6(N>g)l^Cly;T`4LL^7ESqs~y?& zl}ez!9;QRmNqN8a`nA!k#5c;9>4$t?GC6_6`4Vya4;wJ;YBtn+mhNIe?t@In^xcGc ze&3s%8^V1?r80sOa~TjrJODi9*^0nb+TLwtWg}d!XIQSdzB~G`zGjve)A6#9FpYJ0 zS4{XmF>rZlc7NN?nIVu6NE{mS$TkRza1R zlvPK6cS(J`!rmDd!y^1b{FxDUI$XYjj;@R#On0B2t|>;#esXCUE?m` zgq%!TQjq`-C;B{P^6MU?vbwru2bvF${8)5U6aor*m-aH+=IfQR@iQ(A!DPMW?G|Y% zdHpw!6ngQ8`e*r{<6LXPojimp3tN~6EiOoyo0~h*d}W#=_m}EZNEjrrE{AEokox+; zGXmmkP$IVWb`RSf6K*e<9DsvqCPy2*R}y_!Cizk47;%G1IRW)58S319`!uD;Q(`X) z32_#3g&D}rUHSdOx51iz+#iXSt<{IZYV$lBle&mm*=pAU=fq%H)A@kD_)!ro1QA)Y z8pN5=TgeJ~L!if-K?{Rk1@Wv9mYz1Y_wqtE+D{HV1F`W3Hz!OeVK{GB!BwYc>dJr* z9?VbA%RGC38C$w~sq38Z+wciMK!C|)nj{h6!<+p2_1HU(3SdKct=PbUW}-jqgD{)N zaC2(t7_I9~Ww1ARavACwr-h_c$GK7C_V)Jr_wTp#_xC$i2C25B?8rLocRVOaYiJLX z!D6ld;b#eG&1Q8A^UusXPEHfMRL_X|QggZZa$1jdVF?=ga&MD-YoeewIa!RryW<>a zE;TM4g{Yf(TDXreA5-+w<(#^9zOVk_J=;Lcy2m;OYF_|2ZcMGLk}Y~ioj?R6PJg}* zz@IMPR5%WZ-hPq3x3x7#mUD19`IGfVzYHWn<;$4>O$V}=M&*l6lli!hut+{x5YAsU zHnUS`F0zdmMi&5=jfeuy^F!Y_kH;(PW2K>#ef*^XmX(CQ9zxR_huWqyOW*8%U^RQX zxkR8UiS>_LEcc51c8bS;M{xE@5Kfe|?ZssG%?;sM6Vb1+A z{9Q;FpeFp?T7?4lU+fQBr#N>(CkmAV@z2aX7O?AJ#?J!Baub;>Mhxa&U~9AooIZo^f>Km R2%LC}FgLR@Ei!h$@oyIkq(T4y diff --git a/doc/salome/gui/GEOM/images/transformation6.png b/doc/salome/gui/GEOM/images/transformation6.png index 2060c935eaf8fe229b15818bc92bc84b52e6376e..b77c7450f27746a40fbd0ec5e60c3ae53863f8da 100755 GIT binary patch literal 24458 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 literal 24265 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 diff --git a/doc/salome/gui/GEOM/input/creating_3dsketcher.doc b/doc/salome/gui/GEOM/input/creating_3dsketcher.doc new file mode 100755 index 000000000..bb914ea55 --- /dev/null +++ b/doc/salome/gui/GEOM/input/creating_3dsketcher.doc @@ -0,0 +1,31 @@ +/*! + +\page create_3dsketcher_page 3D Sketcher + +3D Sketcher allows creating a closed or unclosed 3D wire from a list of points. + +To create a 3D Sketch, select in the main menu New Entity -> 3D Sketch. + +\image html 3dsketch2.png + +The position of each coordinates can be defined by absolute coordinates X, Y, Z or +by relative coordinates DX, DY, DZ with respect to the previous Applied point. +Type of coordinates can be selected by the Coordinates Type radio buttons. +\n "Sketch Validation" button applies the wire, only red part will be built by "Sketch Validation". +\n "Sketch Closure" will close the Sketch by straight line from last red part and apply it. +To make a closed wire using the TUI command, the first and the last point shoul +have the same coordinates. + +The Result of the operation will be a \b GEOM_Object. + +TUI Command: geompy.Make3DSketcher( [ PointsList ] ) +This algorithm creates a wire, from the list of real values which define XYZ +coordinates of points. + +Example: + +\image html 3dsketch1.png + +Our TUI Scripts provide you with useful examples of the use of +\ref tui_3dsketcher_page "3D Sketcher". +*/ diff --git a/doc/salome/gui/GEOM/input/creating_arc.doc b/doc/salome/gui/GEOM/input/creating_arc.doc index 8ee49ca23..4537a8a0f 100644 --- a/doc/salome/gui/GEOM/input/creating_arc.doc +++ b/doc/salome/gui/GEOM/input/creating_arc.doc @@ -29,6 +29,17 @@ Point, End Point, boolean Sense) \image html arc2.png +Finally, it is possible to create an Arc of Ellipse, which is also done by three points: +the Arguments Point 1, Point 2 and the Center Point. The arc is built on the Ellipse that +lies in the plane defined by the three points, with the center in the Center point. +The major radius of the Ellipse is defined by the distance between the Center Point and +the most remote Argument point. The minor radius is defined by the shortest distance between the +other Argument point and the major radius. +\n TUI Command: geompy.MakeArcOfEllipse(Center Point, First Point, Second Point) +\n Arguments: Name + 3 vertices. + +\image html arcofellipse2.png + \n Examples: \image html arcsn.png @@ -40,4 +51,10 @@ Point, End Point, boolean Sense) \image html arcsn2.png
Reversed arc.
+\image html arcofellipse1.png +
Arc Of Ellipse.
+ +Our TUI Scripts provide you with useful examples of creation of +\ref tui_creation_arc "Basic Geometric Objects". */ + diff --git a/doc/salome/gui/GEOM/input/creating_geom_objects.doc b/doc/salome/gui/GEOM/input/creating_geom_objects.doc index 3bf780994..ae5dfb8c7 100644 --- a/doc/salome/gui/GEOM/input/creating_geom_objects.doc +++ b/doc/salome/gui/GEOM/input/creating_geom_objects.doc @@ -15,7 +15,10 @@ extrusion, rotation, interpolation of other objects. lower dimension, which belong to the objects of higher dimension.
  • \subpage build_by_blocks_page "Build by blocks" faces from edges and solids from faces.
  • -
  • create line segments and arcs using \subpage create_sketcher_page "Sketcher".
  • +
  • create line segments and arcs using \subpage create_sketcher_page +"Sketcher".
  • +
  • create a closed or unclosed 3D wire from a list of points using +\subpage create_3dsketcher_page "3D Sketcher".
  • \subpage create_explode_page "Explode" objects of higher dimension into sub-objects of lower dimension.
  • create \subpage create_adv_obj_page "Advanced geometrical objects" - edges, wires, shells...
  • diff --git a/doc/salome/gui/GEOM/input/creating_sketcher.doc b/doc/salome/gui/GEOM/input/creating_sketcher.doc index 52c85df09..ce1a6e78d 100644 --- a/doc/salome/gui/GEOM/input/creating_sketcher.doc +++ b/doc/salome/gui/GEOM/input/creating_sketcher.doc @@ -52,6 +52,11 @@ is predefined and is equal to 90 degrees);
  • Parameters of an element (for segment : length or target X or Y coordinate value, for arc : radius and angle).
  • +\b Buttons: + +"Sketch Validation" button applies the wire, only red part will be built by "Sketch Validation". +\n "Sketch Closure" will close the Sketch by straight line from last red part and apply it. + \n Dialog Box: \image html neo-scetcher1.png diff --git a/doc/salome/gui/GEOM/input/fillet2d_operation.doc b/doc/salome/gui/GEOM/input/fillet2d_operation.doc new file mode 100755 index 000000000..43701ed90 --- /dev/null +++ b/doc/salome/gui/GEOM/input/fillet2d_operation.doc @@ -0,0 +1,27 @@ +/*! + +\page fillet2d_operation_page Fillet 2D + +This operation creates fillets on the corners of a 2D Planar Face. + +\image html fillet2d_2.png + +To produce a \b Fillet 2D in the Main Menu select +Operations - > Transformation - > Fillet 2D + +Define the Planar Face to create a fillet on, select the necessary +vertexes on this face in the OCC Viewer and define the \b Radius of the Fillet. + +\b Note: This Operation Works for the Planar 2D Faces Only. + +TUI Command: geompy.MakeFillet(Shape, R, ListVertexes) +\n Arguments: Name + 1 shape + one or several vertexes + 1 value (Fillet radius). + +Examples: + +\image html fillet2d_1.png + +Our TUI Scripts provide you with useful examples of the use of +\ref tui_fillet2d "Transformation Operations". + +*/ diff --git a/doc/salome/gui/GEOM/input/index.doc b/doc/salome/gui/GEOM/input/index.doc index e0eb5cc8f..6ae767547 100644 --- a/doc/salome/gui/GEOM/input/index.doc +++ b/doc/salome/gui/GEOM/input/index.doc @@ -22,4 +22,4 @@ Almost all geometry module functionalities are accessible via \image html image3.jpg "Example of Geometry module usage for engineering tasks" -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/GEOM/input/modify_location_operation.doc b/doc/salome/gui/GEOM/input/modify_location_operation.doc index 87c958845..9ce13b3f8 100644 --- a/doc/salome/gui/GEOM/input/modify_location_operation.doc +++ b/doc/salome/gui/GEOM/input/modify_location_operation.doc @@ -54,12 +54,31 @@ translated cube at the position (-100;0;0) \image html image4.gif +The third algorithm modifies the location of an object using the Path object (Wire or Edge) +and the Distance parameter (ranging from 0 to 1) defining how far the object will move along the path. +\n Create a copy checkbox allows to keep the initial object, +otherwise it will be removed. +\n Select Unpublished edges checkbox allows to select subshape edges on +the other objects. +\n Reverse Direction checkbox allows to REVERSE the direction of the object movement along its path. + +Arguments: Name + one or several objects + Translation path. +\n Advanced option: + \ref restore_presentation_parameters_page "Set presentation + parameters and subshapes from arguments". + +\image html transformation13.png + +\image html transformation12.png + +\image html transformation14.png + \n TUI Command: geompy.MakePosition(theObject, theStartLCS, theEndLCS), where \em theObject is a shape, location of which is modified, \em theStartLCS is a location to move the shape from, \em theEndLCS is a location to move the shape to. \n Our TUI Scripts provide you with useful examples of the use -of \ref tui_translation "Transformation Operations". +of \ref tui_modify_location "Transformation Operations". */ diff --git a/doc/salome/gui/GEOM/input/transformation_operations.doc b/doc/salome/gui/GEOM/input/transformation_operations.doc index 875bb9c7c..faa58dc93 100644 --- a/doc/salome/gui/GEOM/input/transformation_operations.doc +++ b/doc/salome/gui/GEOM/input/transformation_operations.doc @@ -20,6 +20,7 @@ factors.
  • Create a simultaneous \subpage multi_rotation_operation_page
  • "Rotation in several directions".
  • Produce a \subpage fillet_operation_page "Fillet" on the selected edges of the object.
  • +
  • Produce a \subpage fillet2d_operation_page "2D Fillet" on the corners of a Planar Face.
  • Produce a \subpage chamfer_operation_page "Chamfer" on the selected edges of the object.
  • diff --git a/doc/salome/gui/GEOM/input/tui_3dsketcher.doc b/doc/salome/gui/GEOM/input/tui_3dsketcher.doc new file mode 100755 index 000000000..c9760fbcf --- /dev/null +++ b/doc/salome/gui/GEOM/input/tui_3dsketcher.doc @@ -0,0 +1,20 @@ +/*! + +\page tui_3dsketcher_page 3D Sketcher + +\code +import geompy +import salome +gg = salome.ImportComponentGUI("GEOM") + +# create a 3D sketcher (wire) of the given points coordinates +sketcher1 = geompy.Make3DSketcher([ 0,0,0, 50,50,50, 0,50,0, 50,0,50, 10,20,100, 0,0,0 ]) + +# add object in the study +id_sketcher1 = geompy.addToStudy(sketcher1,"Sketcher1") + +# display the sketcher +gg.createAndDisplayGO(id_sketcher1) +\endcode + +*/ \ No newline at end of file diff --git a/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc b/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc index d9c30a23b..89baf140d 100644 --- a/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc +++ b/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc @@ -132,6 +132,39 @@ id_ellipse = geompy.addToStudy(ellipse,"Ellipse") gg.createAndDisplayGO(id_vector) gg.createAndDisplayGO(id_ellipse) \endcode + +\anchor tui_creation_arc +

    Creation of an Arc

    + +\code +import geompy +import salome +gg = salome.ImportComponentGUI("GEOM") + +# create vertices +p0 = geompy.MakeVertex(0., 0., 0.) +p1 = geompy.MakeVertex(100., 0., 0.) +p2 = geompy.MakeVertex(50., 0., 50.) + +# create an arc from a three points +arc1 = geompy.MakeArc(p0, p1, p2) + +# create an arc from a center point, a start point and end point +arc2 = geompy.MakeArcCenter(p0, p1, p2, 1) + +# create an arc from a center point, a major point and minor point +arc3 = geompy.MakeArcOfEllipse(p0, p1, p2) + +# add objects in the study +id_arc1 = geompy.addToStudy(arc1, "Arc 1") +id_arc2 = geompy.addToStudy(arc2, "Arc 2") +id_arc3 = geompy.addToStudy(arc3, "Arc 3") + +# display the arcs +gg.createAndDisplayGO(id_arc1) +gg.createAndDisplayGO(id_arc2) +gg.createAndDisplayGO(id_arc3) +\endcode \anchor tui_creation_curve

    Creation of a Curve

    diff --git a/doc/salome/gui/GEOM/input/tui_transformation_operations.doc b/doc/salome/gui/GEOM/input/tui_transformation_operations.doc index a4863b537..7fd356e7c 100644 --- a/doc/salome/gui/GEOM/input/tui_transformation_operations.doc +++ b/doc/salome/gui/GEOM/input/tui_transformation_operations.doc @@ -115,6 +115,7 @@ v = geompy.MakeVector(p1, p2) height = 35 radius1 = 20 cylinder = geompy.MakeCylinder(p1, v, radius1, height) +circle = geompy.MakeCircle(p2, v, radius1) # create local coordinate systems cs1 = geompy.MakeMarker( 0, 0, 0, 1,0,0, 0,1,0) @@ -122,18 +123,25 @@ cs2 = geompy.MakeMarker(30,40,40, 1,0,0, 0,1,0) # modify the location of the given object position = geompy.MakePosition(cylinder, cs1, cs2) +position2 = geompy.PositionAlongPath(position, circle, 0.75, 1, 1) # add objects in the study id_cs1 = geompy.addToStudy(cs1, "Coordinate system 1") id_cs2 = geompy.addToStudy(cs2, "Coordinate system 2") id_cylinder = geompy.addToStudy(cylinder, "Cylinder") +id_circle = geompy.addToStudy(circle, "Circle") id_position = geompy.addToStudy(position, "Position") +id_position2 = geompy.addToStudy(position2, "PositionAlongPath") # display the results gg.createAndDisplayGO(id_cylinder) gg.setDisplayMode(id_cylinder,1) gg.createAndDisplayGO(id_position) gg.setDisplayMode(id_position,1) +gg.createAndDisplayGO(id_circle) +gg.setDisplayMode(id_circle,1) +gg.createAndDisplayGO(id_position2) +gg.setDisplayMode(id_position2,1) \endcode \anchor tui_mirror @@ -341,6 +349,27 @@ gg.createAndDisplayGO(id_rot2d) gg.setDisplayMode(id_rot2d,1) \endcode +\anchor tui_fillet2d +

    Fillet 2D

    + +\code +import geompy +import salome +gg = salome.ImportComponentGUI("GEOM") + +# create a face in OXY plane +face = geompy.MakeFaceHW(100, 100, 1) +fillet2d = geompy.MakeFillet2D(face, 30, [7, 9]) + +# add objects in the study +id_face = geompy.addToStudy(face,"Face_1") +id_fillet2d = geompy.addToStudy(fillet2d,"Fillet 2D_1") + +# display disks +gg.createAndDisplayGO(id_face) +gg.createAndDisplayGO(id_fillet2d) +\endcode + \anchor tui_fillet

    Fillet

    diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 06d72325d..25e732748 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -795,6 +795,22 @@ module GEOM in GEOM_Object theStartLCS, in GEOM_Object theEndLCS); + /*! + * Modify the Location of the given object by Path, + * \param theObject The object to be displaced. + * \param thePath Wire or Edge along that the object will be translated. + * \param theDistance progress of Path (0 = actual location, 1 = end of path location). + * \param theCopy is a true or false parameter. true is to create a copy, false to move the object. + * \param theCopy is a true or false parameter. true is to reverse direction, false is to move normal direction. + * \return New GEOM_Object, containing the displaced shape. + */ + + GEOM_Object PositionAlongPath (in GEOM_Object theObject, + in GEOM_Object thePath, + in double theDistance, + in boolean theCopy, + in boolean theReverse); + /*! * Recompute the shape from its arguments. * \param theObject The object to be recomputed. @@ -2097,6 +2113,17 @@ module GEOM in GEOM_Object thePnt1, in GEOM_Object thePnt2, in boolean theSense); + + /*! + * Create an arc of ellipse of center C and two points P1 P2. + * \param theCenter Center point of the arc. + * \param thePnt1 Major radius is distance from center to Pnt1. + * \param thePnt2 define a plane and Minor radius as a shortest distance from Pnt2 to vector Center->Pnt1. + * \return New GEOM_Object, containing the created arc. + */ + GEOM_Object MakeArcOfEllipse (in GEOM_Object theCenter, + in GEOM_Object thePnt1, + in GEOM_Object thePnt2); /*! @@ -2155,6 +2182,16 @@ module GEOM * \return New GEOM_Object, containing the created wire. */ GEOM_Object MakeSketcher (in string theCommand, in ListOfDouble theWorkingPlane); + + /*! + * Create a 3D sketcher, following the numerical description, + * passed through points created by \a theCoordinates argument. \n + * Format of the description string have to be the following: + * + * "Make3DSketcher[x1, y1, z1, x2, y2, z2, ..., xN, yN, zN]" + */ + + GEOM_Object Make3DSketcher (in ListOfDouble theCoordinates); /*! * Create a sketcher (wire or face), following the textual description, @@ -2211,10 +2248,24 @@ module GEOM GEOM_Object MakeFilletFaces (in GEOM_Object theShape, in double theR, in ListOfLong theFaces); + GEOM_Object MakeFilletFacesR1R2 (in GEOM_Object theShape, in double theR1, in double theR2, in ListOfLong theFaces); + + /*! + * Perform a fillet on face of the specified vertexes of the given shape. + * \param theShape Shape, to perform fillet on. + * \param theR Fillet radius. + * \param theVertexes Global indices of vertexes to perform fillet on. + * \note Global index of sub-shape can be obtained, using method + * GEOM_IShapesOperations.GetSubShapeIndex(). + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeFillet2D (in GEOM_Object theShape, + in double theR, + in ListOfLong theVertexes); /*! * Perform a symmetric chamfer on all edges of the given shape. diff --git a/idl/GEOM_Superv.idl b/idl/GEOM_Superv.idl index fd54d2bde..4690e7e7e 100644 --- a/idl/GEOM_Superv.idl +++ b/idl/GEOM_Superv.idl @@ -343,6 +343,11 @@ module GEOM GEOM_Object PositionShapeCopy (in GEOM_Object theObject, in GEOM_Object theStartLCS, in GEOM_Object theEndLCS) ; + GEOM_Object PositionAlongPath (in GEOM_Object theObject, + in GEOM_Object thePath, + in double theDistance, + in boolean theCopy, + in boolean theReverse); //-----------------------------------------------------------// // ShapesOperations // @@ -480,6 +485,9 @@ module GEOM in GEOM_Object thePnt1, in GEOM_Object thePnt2, in boolean theSense) ; + GEOM_Object MakeArcOfEllipse (in GEOM_Object theCenter, + in GEOM_Object thePnt1, + in GEOM_Object thePnt2) ; GEOM_Object MakePolyline (in GEOM_List thePoints) ; GEOM_Object MakeSplineBezier (in GEOM_List thePoints) ; GEOM_Object MakeSplineInterpolation (in GEOM_List thePoints) ; @@ -505,6 +513,9 @@ module GEOM in double theR1, in double theR2, in GEOM_List theFaces) ; + GEOM_Object MakeFillet2D (in GEOM_Object theShape, + in double theR, + in GEOM_List theVertexes) ; GEOM_Object MakeChamferAll (in GEOM_Object theShape, in double theD) ; GEOM_Object MakeChamferEdge (in GEOM_Object theShape, diff --git a/resources/3dsketch.png b/resources/3dsketch.png new file mode 100755 index 0000000000000000000000000000000000000000..f34ec05166209a7188f7b8c3fc2ee9c842af99a3 GIT binary patch literal 685 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`j)FbFd;%$g$s6l6(v z^mSxl*w|O|J8&|PuaN8!@0H0E#$$S>hnXyA}sap26EKOhn2 z35PdCh;VN8U;;_ZC}@?wuzHfiGL=ai6fQI*I}|#u=uS9zfRUR`fPq7SM_g&A19OVm zmDI+7!U;2&Ja{_abA~d1Gjd=!$m_zz&o@I&gZFck!X#EM54I?$SRONWg@%X?KOz{j zUa%|FF<$v0`@+{%<$d$f#Dfe+-Y-l_U=VQlVDRV9&&?_V)r`D5_@4Z8FzOLr^~74h zp1qSf_7k(_pE`w)k_=27mOQEp9y0RjKe^%Z$&S5zb1+fDVq?$kT1>A90I0am$I#Evp_om~ksKJkV=Vi(|`}p{a12 zPh>L_tK9{bCo&A5P8LsCJ#n)(Fj5Z1uxrnAXl1y-;G7{))3D2dL2B^{O-7bJ=CAe* zk{m`LGuWEC)FLvOzT7j~@am{%Pk`l&g-jQoC^w2c)1R=HN5J7mlBJMTwbX)w=BKGE zr1(}?u})!PJm~;*ZJ8o_(8nW;pOr3bNLG*vQEQ566}!xH!d3i)P6Goo!-oCRZIKUT R>wrm%!PC{xWt~$(69CN?_5lC@ literal 0 HcmV?d00001 diff --git a/resources/GEOMCatalog.xml.in b/resources/GEOMCatalog.xml.in index 9747c4e20..7bf6f0297 100644 --- a/resources/GEOMCatalog.xml.in +++ b/resources/GEOMCatalog.xml.in @@ -4247,6 +4247,38 @@ + + MakeArcOfEllipse + + + unknown + 0 + + + thePnt1 + GEOM_Object + unknown + + + thePnt2 + GEOM_Object + unknown + + + thePnt3 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + MakePolyline diff --git a/resources/GEOM_en.xml b/resources/GEOM_en.xml index fd2e4054e..eda6f84a0 100644 --- a/resources/GEOM_en.xml +++ b/resources/GEOM_en.xml @@ -104,6 +104,7 @@ + diff --git a/resources/GEOM_fr.xml b/resources/GEOM_fr.xml index 866184523..66a33d5f7 100644 --- a/resources/GEOM_fr.xml +++ b/resources/GEOM_fr.xml @@ -94,6 +94,7 @@ + diff --git a/resources/Makefile.am b/resources/Makefile.am index 27dbdf8b6..4dd5020f5 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -22,8 +22,7 @@ # -* Makefile *- # Author : Patrick GOLDBRONN (CEA) # Date : 28/06/2001 -# Modified by : Alexander BORODIN (OCN) - autotools usage -# $Header$ +# Modified by : Alexander BORODIN (OCN) - autotools usage # include $(top_srcdir)/adm_local/unix/make_common_starter.am @@ -36,8 +35,11 @@ Plugin \ GEOMDS_Resources \ ImportExport \ ShHealing \ +3dsketch.png \ angle.png \ arc.png \ +arccenter.png \ +arcofellipse.png \ archimede.png \ axisinertia.png \ basicproperties.png \ @@ -84,6 +86,7 @@ eraseall.png \ face_hw.png \ face_vechw.png \ fillet.png \ +fillet2d.png \ filletall.png \ filletedge.png \ filletface.png \ @@ -182,6 +185,7 @@ marker2.png \ marker3.png \ position.png \ position2.png \ +position3.png \ free_bound.png \ point_coord.png \ point3.png \ @@ -203,7 +207,6 @@ free_faces.png \ propagate.png \ redo.png \ undo.png \ -arccenter.png \ glue2.png \ remove_extra_edges.png \ coordsys.png \ diff --git a/resources/arcofellipse.png b/resources/arcofellipse.png new file mode 100755 index 0000000000000000000000000000000000000000..3f15b6ef9888199327ae6ad449f8cf09b432e87c GIT binary patch literal 513 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`j)5C}6~x?A@LD9DoT z=}1{rUgjp4pVqfx*x)K$3w);3_W*hXPwoTv}3+lBEp;QwQh#M7NE5 z4V-s&nhGd1eAqcbIxE6PAX+$E!+~MrgNcuSet#d&G{LOl(|d-G;ZAH!ECR|WT6=nW zB!u*HbN=1tj9S=n_s*T89w!_c7!GABTv>m1dKZ0zRuaNuQLIh}z+K}6hXawnHbcud1F6-RNUrPr;2*3QeBGLdJGx0B*w xUT-fTKhC1Sc`}#z&ZCOJ;0@Z%#lT^}AZ|5zY5VGeXTa!U@O1TaS?83{1OP}tsjC10 literal 0 HcmV?d00001 diff --git a/resources/fillet2d.png b/resources/fillet2d.png new file mode 100755 index 0000000000000000000000000000000000000000..a17cef65b6d0f236f816b0d74582dd8d6698f2f1 GIT binary patch literal 980 zcmV;_11tQAP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ|{`&mV>YW@Z!v7=ir%|Nb%j|Nfof z&)c^Qzn?y3;Mw+q;g;Zi2K(>dRe(xf00a;VNTH-n3Iit_GXpCN6WF!C|Ndk63&iz1 zCc_O2%d7<%$pCV|&tHETzWn&j;Aj=Va8>XD!}lHB3_ue-fC_d11Q6JT#j{WT=KvbW z1~ia~i4kbne}+FGmmmf2wGFLcI<~ln;rq`&44=OJVtD)Z4TE&17emsI9|wR^7l3#H zKmdWmurJNR;N9n+3~xSx@DGM}Uw$$`_&*rle1u>z$6_$9N%Lj+@D(Wk?j6J1mrod8 z04)ZBFCg!NXn+7>fjZ#Jd!Qjq(8&1*bQ;*(|NaBR3^gKTgL)YXLrfU*+ZQu@{_u{0 z3nKgi>cSTQ0mKAV_u}i1KMbG0{|4hPKn&u8Xi!)o#k|DT~CrI2N zs*_=1Zy5sHpA#Ph8>$2q3rxAaDQp^_$@bFwy?_ z_J!dW5dZn{mErHt?+kx`|77_0_cu@tD2Dzs;LEK50fge>{hhuBe|~@r`@rz?>pO;@ zU*3Z8udnYJet-MK0FwLr^Bd6cUqJkqLCdd#p%s{;kO4pdp@-?0KR@`^a_xDd21_A^SiVH#E2#kO`m)15_0J%0QPRTz1{``W(EYOvV zOw5ol1Vt7wO#l7+%Ya_|0R#{WmT(27`XeC5oqcmbYzZLdk+%qO09y)1BCpEP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;@kvBMRCwBA{Qv(y12q9a0I|RrE-o(rfBpK!0Kz9u zoM0r^K!5-O8|dcd_CF~piQ&(mKVSoum6iYByLXT0xQ)%1e}DfnF#P++z`)1|#*9F0 zdGshw3jqR%(bm@Xe`;zf!(X7r-@kt|{P^($jLXW(K=Kkm%mc-6aKzmF0?1&i^cw)GVJ^J?=X2AD2-yE&B>D?K$Y?Hk;6FpQ+} z1yJ!tlyG8X({SvjAS5I0MZD=cY(|cR!5K8 z9J8{z0JVStAb`N~=$M(A8OH7hVtr6r#f5=D`IwCjh+z%H+yDW@1P!MN3w3otk_SK- z7~=<^Y+}F*P>jQZ03d)s27UnrIy)pRUO*$@0ux3v3)GMuY!E@1 zA+T8e0+q)PK#3m;00M{w8r^rd8XLo1h#spT;N;}=pN)+T%mzgoD7n3V|DFMuqZt1I zGXx9(1Q0wg`o3EXAAcA=fBywaLjR!| zKn0`@Ab^;V^nBrfh6Oa8p#V^h`ttoZ!^f|`7~X&R3C5qlerK@BTgm`U{Gj0Z0uVsR z2EK4OecI-zg~bu%Gz9}6KYj!o_U`jfhPOcc_46l&Utiuc{QmY4#a@5_VnT^6prN4b z1Wc%RPB=KA6qK)Dzh-y`auq1=e}2pG^Xof?U*A43{Qmxh0hn$XpkC$y2p|^pGzE$j zt7FGJK(+y03r@QKfFvk4{rL2j;m@yc41a$D@$VlD|Ni`9xU#O90h(^XB@;jZF`}2) z(C|}%1v1oloadPixmap( "GEOM", tr( "ICON_DLG_ARC" ) ) ); QPixmap image1( aResMgr->loadPixmap( "GEOM", tr( "ICON_DLG_ARC_CENTER" ) ) ); QPixmap image2( aResMgr->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + QPixmap image3( aResMgr->loadPixmap( "GEOM", tr( "ICON_DLG_ARC_OF_ELLIPSE" ) ) ); setWindowTitle( tr( "GEOM_ARC_TITLE" ) ); @@ -65,8 +66,7 @@ BasicGUI_ArcDlg::BasicGUI_ArcDlg( GeometryGUI* theGeometryGUI, QWidget* parent, mainFrame()->GroupConstructors->setTitle( tr( "GEOM_ARC" ) ); mainFrame()->RadioButton1->setIcon( image0 ); mainFrame()->RadioButton2->setIcon( image1 ); - mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); - mainFrame()->RadioButton3->close(); + mainFrame()->RadioButton3->setIcon( image3 ); Group3Pnts = new DlgRef_3Sel( centralWidget() ); @@ -109,10 +109,30 @@ BasicGUI_ArcDlg::BasicGUI_ArcDlg( GeometryGUI* theGeometryGUI, QWidget* parent, Group3Pnts2->CheckButton1->setText( tr( "GEOM_REVERSE" ) ); + Group3Pnts3 = new DlgRef_3Sel( centralWidget() ); + + Group3Pnts3->GroupBox1->setTitle( tr( "GEOM_POINTS" ) ); + Group3Pnts3->TextLabel1->setText( tr( "GEOM_CENTER_POINT" ) ); + Group3Pnts3->TextLabel2->setText( tr( "GEOM_POINT_I" ).arg( 1 ) ); + Group3Pnts3->TextLabel3->setText( tr( "GEOM_POINT_I" ).arg( 2 ) ); + + Group3Pnts3->LineEdit1->setReadOnly( true ); + Group3Pnts3->LineEdit2->setReadOnly( true ); + Group3Pnts3->LineEdit3->setReadOnly( true ); + + Group3Pnts3->LineEdit1->setEnabled(true); + Group3Pnts3->LineEdit2->setEnabled(false); + Group3Pnts3->LineEdit3->setEnabled(false); + + Group3Pnts3->PushButton1->setIcon(image2); + Group3Pnts3->PushButton2->setIcon(image2); + Group3Pnts3->PushButton3->setIcon(image2); + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); layout->addWidget( Group3Pnts ); layout->addWidget( Group3Pnts2 ); + layout->addWidget( Group3Pnts3 ); setHelpFileName( "create_arc_page.html" ); @@ -166,9 +186,17 @@ void BasicGUI_ArcDlg::Init() connect( Group3Pnts2->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); connect( Group3Pnts2->LineEdit2, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); connect( Group3Pnts2->LineEdit3, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); - + connect( Group3Pnts2->CheckButton1, SIGNAL( toggled( bool ) ), this, SLOT( ReverseSense() ) ); + connect( Group3Pnts3->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + connect( Group3Pnts3->PushButton2, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + connect( Group3Pnts3->PushButton3, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + + connect( Group3Pnts3->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); + connect( Group3Pnts3->LineEdit2, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); + connect( Group3Pnts3->LineEdit3, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); + connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); @@ -211,9 +239,6 @@ bool BasicGUI_ArcDlg::ClickOnApply() //================================================================================= void BasicGUI_ArcDlg::SelectionIntoArgument() { - if ( getConstructorId() != 0 && getConstructorId() != 1 ) - return; - myEditCurrentArgument->setText( "" ); LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); @@ -234,6 +259,12 @@ void BasicGUI_ArcDlg::SelectionIntoArgument() else if ( myEditCurrentArgument == Group3Pnts2->LineEdit3 ) myPoint3 = GEOM::GEOM_Object::_nil(); return; break; + case 2: + if ( myEditCurrentArgument == Group3Pnts3->LineEdit1 ) myPoint1 = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == Group3Pnts3->LineEdit2 ) myPoint2 = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == Group3Pnts3->LineEdit3 ) myPoint3 = GEOM::GEOM_Object::_nil(); + return; + break; } } // nbSel == 1 @@ -314,6 +345,23 @@ void BasicGUI_ArcDlg::SelectionIntoArgument() Group3Pnts2->PushButton1->click(); } break; + case 2: + if ( myEditCurrentArgument == Group3Pnts3->LineEdit1 ) { + myPoint1 = aSelectedObject; + if ( !myPoint1->_is_nil() && myPoint2->_is_nil() ) + Group3Pnts3->PushButton2->click(); + } + else if ( myEditCurrentArgument == Group3Pnts3->LineEdit2 ) { + myPoint2 = aSelectedObject; + if ( !myPoint2->_is_nil() && myPoint3->_is_nil() ) + Group3Pnts3->PushButton3->click(); + } + else if ( myEditCurrentArgument == Group3Pnts3->LineEdit3 ) { + myPoint3 = aSelectedObject; + if ( !myPoint3->_is_nil() && myPoint1->_is_nil() ) + Group3Pnts3->PushButton1->click(); + } + break; } } @@ -384,6 +432,32 @@ void BasicGUI_ArcDlg::SetEditCurrentArgument() Group3Pnts2->LineEdit3->setEnabled(true); } break; + case 2: + if ( send == Group3Pnts3->PushButton1 ) { + myEditCurrentArgument = Group3Pnts3->LineEdit1; + Group3Pnts3->PushButton2->setDown(false); + Group3Pnts3->PushButton3->setDown(false); + Group3Pnts3->LineEdit1->setEnabled(true); + Group3Pnts3->LineEdit2->setEnabled(false); + Group3Pnts3->LineEdit3->setEnabled(false); + } + else if ( send == Group3Pnts3->PushButton2 ) { + myEditCurrentArgument = Group3Pnts3->LineEdit2; + Group3Pnts3->PushButton1->setDown(false); + Group3Pnts3->PushButton3->setDown(false); + Group3Pnts3->LineEdit1->setEnabled(false); + Group3Pnts3->LineEdit2->setEnabled(true); + Group3Pnts3->LineEdit3->setEnabled(false); + } + else if ( send == Group3Pnts3->PushButton3 ) { + myEditCurrentArgument = Group3Pnts3->LineEdit3; + Group3Pnts3->PushButton1->setDown(false); + Group3Pnts3->PushButton2->setDown(false); + Group3Pnts3->LineEdit1->setEnabled(false); + Group3Pnts3->LineEdit2->setEnabled(false); + Group3Pnts3->LineEdit3->setEnabled(true); + } + break; } myEditCurrentArgument->setFocus(); // SelectionIntoArgument(); @@ -400,7 +474,8 @@ void BasicGUI_ArcDlg::LineEditReturnPressed() { QLineEdit* send = (QLineEdit*)sender(); if ( send == Group3Pnts->LineEdit1 || send == Group3Pnts->LineEdit2 || send == Group3Pnts->LineEdit3 || - send == Group3Pnts2->LineEdit1 || send == Group3Pnts2->LineEdit2 || send == Group3Pnts2->LineEdit3 ) { + send == Group3Pnts2->LineEdit1 || send == Group3Pnts2->LineEdit2 || send == Group3Pnts2->LineEdit3 || + send == Group3Pnts3->LineEdit1 || send == Group3Pnts3->LineEdit2 || send == Group3Pnts3->LineEdit3 ) { myEditCurrentArgument = send; GEOMBase_Skeleton::LineEditReturnPressed(); } @@ -474,6 +549,14 @@ bool BasicGUI_ArcDlg::isValid( QString& msg ) return false; break; } + case 2: + { + if (Group3Pnts3->LineEdit1->text().trimmed().isEmpty() || + Group3Pnts3->LineEdit2->text().trimmed().isEmpty() || + Group3Pnts3->LineEdit3->text().trimmed().isEmpty()) + return false; + break; + } } return !myPoint1->_is_nil() && !myPoint2->_is_nil() && !myPoint3->_is_nil() && !isEqual( myPoint1, myPoint2 ) && !isEqual( myPoint1, myPoint3 ) && !isEqual( myPoint2, myPoint3 ); @@ -506,6 +589,14 @@ bool BasicGUI_ArcDlg::execute( ObjectList& objects ) } break; } + case 2: + { + if ( !CORBA::is_nil( myPoint1 ) && !CORBA::is_nil( myPoint2 ) && !CORBA::is_nil( myPoint3 ) ) { + anObj = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeArcOfEllipse( myPoint1, myPoint2, myPoint3 ); + res = true; + } + break; + } } if ( !anObj->_is_nil() ) { objects.push_back( anObj._retn() ); @@ -527,8 +618,9 @@ void BasicGUI_ArcDlg::ConstructorsClicked( int constructorId ) globalSelection(); // close local contexts, if any localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); //Select Vertex on All Shapes - Group3Pnts2->hide(); Group3Pnts->show(); + Group3Pnts2->hide(); + Group3Pnts3->hide(); Group3Pnts->PushButton1->setDown(true); Group3Pnts->PushButton2->setDown(false); Group3Pnts->PushButton3->setDown(false); @@ -550,6 +642,7 @@ void BasicGUI_ArcDlg::ConstructorsClicked( int constructorId ) Group3Pnts->hide(); Group3Pnts2->show(); + Group3Pnts3->hide(); Group3Pnts2->PushButton1->setDown(true); Group3Pnts2->PushButton2->setDown(false); Group3Pnts2->PushButton3->setDown(false); @@ -564,6 +657,28 @@ void BasicGUI_ArcDlg::ConstructorsClicked( int constructorId ) myEditCurrentArgument = Group3Pnts2->LineEdit1; break; } + case 2: + { + globalSelection(); // close local contexts, if any + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); //Select Vertex on All Shapes + + Group3Pnts->hide(); + Group3Pnts2->hide(); + Group3Pnts3->show(); + Group3Pnts3->PushButton1->setDown(true); + Group3Pnts3->PushButton2->setDown(false); + Group3Pnts3->PushButton3->setDown(false); + Group3Pnts3->LineEdit1->setText( "" ); + Group3Pnts3->LineEdit2->setText( "" ); + Group3Pnts3->LineEdit3->setText( "" ); + Group3Pnts3->LineEdit1->setEnabled(true); + Group3Pnts3->LineEdit2->setEnabled(false); + Group3Pnts3->LineEdit3->setEnabled(false); + myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); + + myEditCurrentArgument = Group3Pnts3->LineEdit1; + break; + } } qApp->processEvents(); @@ -608,6 +723,11 @@ void BasicGUI_ArcDlg::addSubshapesToStudy() objMap[Group3Pnts2->LineEdit2->text()] = myPoint2; objMap[Group3Pnts2->LineEdit3->text()] = myPoint3; break; + case 2: + objMap[Group3Pnts3->LineEdit1->text()] = myPoint1; + objMap[Group3Pnts3->LineEdit2->text()] = myPoint2; + objMap[Group3Pnts3->LineEdit3->text()] = myPoint3; + break; } addSubshapesToFather( objMap ); } diff --git a/src/BasicGUI/BasicGUI_ArcDlg.h b/src/BasicGUI/BasicGUI_ArcDlg.h index 3100b2a61..49828b720 100644 --- a/src/BasicGUI/BasicGUI_ArcDlg.h +++ b/src/BasicGUI/BasicGUI_ArcDlg.h @@ -59,6 +59,7 @@ private: DlgRef_3Sel* Group3Pnts; DlgRef_3Sel1Check* Group3Pnts2; + DlgRef_3Sel* Group3Pnts3; private slots: void ClickOnOk(); diff --git a/src/DlgRef/DlgRef.cxx b/src/DlgRef/DlgRef.cxx index e4e078c98..42bb09e08 100644 --- a/src/DlgRef/DlgRef.cxx +++ b/src/DlgRef/DlgRef.cxx @@ -702,6 +702,20 @@ void DlgRef_4Sel1Spin2Check::ShowRows( int fromRow, int toRow, bool toShow ) } } +////////////////////////////////////////// +// DlgRef_4Sel1Spin3Check +////////////////////////////////////////// + +DlgRef_4Sel1Spin3Check::DlgRef_4Sel1Spin3Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_4Sel1Spin3Check::~DlgRef_4Sel1Spin3Check() +{ +} + ////////////////////////////////////////// // DlgRef_6Sel ////////////////////////////////////////// diff --git a/src/DlgRef/DlgRef.h b/src/DlgRef/DlgRef.h index 005ff9427..d786fe841 100644 --- a/src/DlgRef/DlgRef.h +++ b/src/DlgRef/DlgRef.h @@ -763,6 +763,22 @@ public: void ShowRows( int, int, bool = true ); }; +////////////////////////////////////////// +// DlgRef_4Sel1Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_4Sel1Spin3Check_QTD.h" + +class DLGREF_EXPORT DlgRef_4Sel1Spin3Check : public QWidget, + public Ui::DlgRef_4Sel1Spin3Check_QTD +{ + Q_OBJECT + +public: + DlgRef_4Sel1Spin3Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_4Sel1Spin3Check(); +}; + ////////////////////////////////////////// // DlgRef_6Sel ////////////////////////////////////////// diff --git a/src/DlgRef/DlgRef.pro b/src/DlgRef/DlgRef.pro index 3a8def56f..1abf89059 100644 --- a/src/DlgRef/DlgRef.pro +++ b/src/DlgRef/DlgRef.pro @@ -78,6 +78,7 @@ HEADERS += DlgRef_3Spin_QTD.h HEADERS += DlgRef_3Spin1Check_QTD.h HEADERS += DlgRef_3Sel3Spin1Check_QTD.h HEADERS += DlgRef_4Sel1Spin2Check_QTD.h +HEADERS += DlgRef_4Sel1Spin3Check_QTD.h HEADERS += DlgRef_SpinBox.h HEADERS += DlgRef_1Sel1Spin.h HEADERS += DlgRef_1Sel2Spin.h diff --git a/src/DlgRef/DlgRef_4Sel1Spin2Check_QTD.ui b/src/DlgRef/DlgRef_4Sel1Spin2Check_QTD.ui index 43217034f..131736af7 100644 --- a/src/DlgRef/DlgRef_4Sel1Spin2Check_QTD.ui +++ b/src/DlgRef/DlgRef_4Sel1Spin2Check_QTD.ui @@ -5,30 +5,18 @@ 0 0 - 131 - 196 + 225 + 306 - + 0 - - 0 - - - 0 - - - 0 - - - 6 - - + 6 @@ -37,44 +25,12 @@ - - 9 - - - 9 - - - 9 - - + 9 - - 6 - - + 6 - - - - - - - - - - - - 0 - 0 - - - - - - - @@ -229,7 +185,43 @@ + + + + + + + + + + + + 0 + 0 + + + + + + + + SpinBox_DX + TextLabel3 + TextLabel5 + TextLabel4 + TextLabel2 + TextLabel1 + PushButton2 + LineEdit5 + LineEdit1 + PushButton5 + PushButton4 + PushButton1 + LineEdit4 + LineEdit2 + CheckButton1 + CheckButton2 @@ -253,7 +245,6 @@ PushButton5 LineEdit5 SpinBox_DX - CheckButton2 CheckButton1 diff --git a/src/DlgRef/DlgRef_4Sel1Spin3Check_QTD.ui b/src/DlgRef/DlgRef_4Sel1Spin3Check_QTD.ui new file mode 100755 index 000000000..4e6e09c64 --- /dev/null +++ b/src/DlgRef/DlgRef_4Sel1Spin3Check_QTD.ui @@ -0,0 +1,265 @@ + + DlgRef_4Sel1Spin3Check_QTD + + + + 0 + 0 + 225 + 306 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + + + + + SpinBox_DX + TextLabel3 + TextLabel5 + TextLabel4 + TextLabel2 + TextLabel1 + PushButton2 + LineEdit5 + LineEdit1 + PushButton5 + PushButton4 + PushButton1 + LineEdit4 + LineEdit2 + CheckButton1 + CheckButton2 + + + + + + qPixmapFromMimeSource + + + QtxDoubleSpinBox + QDoubleSpinBox +
    QtxDoubleSpinBox.h
    +
    +
    + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton4 + LineEdit4 + PushButton5 + LineEdit5 + SpinBox_DX + CheckButton1 + + + +
    diff --git a/src/DlgRef/Makefile.am b/src/DlgRef/Makefile.am index ca035ed28..3a4606f02 100644 --- a/src/DlgRef/Makefile.am +++ b/src/DlgRef/Makefile.am @@ -83,6 +83,7 @@ UIC_FILES = \ ui_DlgRef_4Sel1List1Check_QTD.h \ ui_DlgRef_4Sel1List_QTD.h \ ui_DlgRef_4Sel1Spin2Check_QTD.h \ + ui_DlgRef_4Sel1Spin3Check_QTD.h \ ui_DlgRef_6Sel_QTD.h \ ui_DlgRef_Skeleton_QTD.h diff --git a/src/EntityGUI/EntityGUI.cxx b/src/EntityGUI/EntityGUI.cxx index 626569ed7..25e0103f6 100644 --- a/src/EntityGUI/EntityGUI.cxx +++ b/src/EntityGUI/EntityGUI.cxx @@ -37,6 +37,7 @@ #include #include "EntityGUI_SketcherDlg.h" // Sketcher +#include "EntityGUI_3DSketcherDlg.h" // Sketcher #include "EntityGUI_SubShapeDlg.h" // Method SUBSHAPE //======================================================================= @@ -75,6 +76,9 @@ bool EntityGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent ) getGeometryGUI()->ActiveWorkingPlane(); aDlg = new EntityGUI_SketcherDlg( getGeometryGUI(), parent ); break; + case 405: // 3D SKETCHER + aDlg = new EntityGUI_3DSketcherDlg( getGeometryGUI(), parent ); + break; case 407: // EXPLODE : use ic aDlg = new EntityGUI_SubShapeDlg( getGeometryGUI(), parent ); break; diff --git a/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx b/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx new file mode 100755 index 000000000..134cbd3cf --- /dev/null +++ b/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx @@ -0,0 +1,629 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : EntityGUI_3DSketcherDlg.cxx +// Author : DMV, OCN +// + +#include "EntityGUI_3DSketcherDlg.h" +#include "EntityGUI_Widgets.h" +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +class Locker +{ +public: + Locker( bool& l ) : myLock( l ) { myLock = true; } + ~Locker() { myLock = false; } +private: + bool& myLock; +}; + +//================================================================================= +// class : EntityGUI_3DSketcherDlg() +// purpose : Constructs a EntityGUI_3DSketcherDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +EntityGUI_3DSketcherDlg::EntityGUI_3DSketcherDlg( GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal, Qt::WindowFlags fl, + const double lineWidth ) + : GEOMBase_Skeleton( theGeometryGUI, parent, modal, fl ), + myGeometryGUI( theGeometryGUI ), + myLineWidth( lineWidth ) +{ + QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_UNDO" ) ) ); + QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_REDO" ) ) ); + QPixmap image3( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICO_3DSKETCH" ) ) ); + + setWindowTitle( tr( "GEOM_3DSKETCHER_TITLE" ) ); + + /***************************************************************/ + + mainFrame()->GroupConstructors->setTitle( tr( "GEOM_3DSKETCHER" ) ); + mainFrame()->RadioButton1->setIcon( image3 );; + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->close(); + + GroupType = new DlgRef_3Radio(centralWidget()); + GroupType->GroupBox1->setTitle(tr("GEOM_COORDINATES_TYPE")); + GroupType->RadioButton1->setText(tr("GEOM_SKETCHER_ABS")); + GroupType->RadioButton2->setText(tr("GEOM_SKETCHER_REL")); + GroupType->RadioButton3->close(); + + Group3Spin = new EntityGUI_3Spin( centralWidget() ); + Group3Spin->GroupBox1->setTitle( tr( "GEOM_SKETCHER_VALUES" ) ); + Group3Spin->buttonApply->setText( tr( "GEOM_SKETCHER_APPLY" ) ); + Group3Spin->buttonUndo->setIcon( image1 ); + Group3Spin->buttonRedo->setIcon( image2 ); + Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_X2" ) ); + Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_Y2" ) ); + Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_Z2" ) ); + + buttonOk()->setText( tr( "GEOM_BUT_END_SKETCH" ) ); + buttonApply()->setText( tr( "GEOM_BUT_CLOSE_SKETCH" ) ); + + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); + layout->setMargin( 0 ); layout->setSpacing( 6 ); + layout->addWidget( GroupType ); + layout->addWidget( Group3Spin ); + + setHelpFileName( "create_3dsketcher_page.html" ); + + resize(0,0); + Init(); +} + + + +//================================================================================= +// function : ~EntityGUI_3DSketcherDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +EntityGUI_3DSketcherDlg::~EntityGUI_3DSketcherDlg() +{ + myGeomGUI->SetActiveDialogBox( 0 ); +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::Init() +{ + myOK = false; + + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + + /* Get setting of step value from file configuration */ + double step = SUIT_Session::session()->resourceMgr()->doubleValue( "Geometry", "SettingsGeomStep", 100.0 ); + + /* min, max, step and decimals for spin boxes */ + initSpinBox( Group3Spin->SpinBox_DX, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY + initSpinBox( Group3Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY + initSpinBox( Group3Spin->SpinBox_DZ, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY + + /* signals and slots connections */ + connect( this, SIGNAL( constructorsClicked( int ) ), this, SLOT( PointClicked( int ) ) ); + + connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + + connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + + connect( Group3Spin->buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnAddPoint() ) ); + connect( Group3Spin->buttonUndo, SIGNAL( clicked() ), this, SLOT( ClickOnUndo() ) ); + connect( Group3Spin->buttonRedo, SIGNAL( clicked() ), this, SLOT( ClickOnRedo() ) ) ; + + connect( GroupType->RadioButton1, SIGNAL( clicked() ), this, SLOT( TypeClicked() ) ); + connect( GroupType->RadioButton2, SIGNAL( clicked() ), this, SLOT( TypeClicked() ) ); + + connect( Group3Spin->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); + connect( Group3Spin->SpinBox_DY, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); + connect( Group3Spin->SpinBox_DZ, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); + + connect( myGeomGUI, SIGNAL( SignalDefaultStepValueChanged( double ) ), this, SLOT( SetDoubleSpinBoxStep( double ) ) ); + + connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ); + connect( myGeomGUI, SIGNAL( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ); + + initName( tr( "GEOM_3DSKETCHER" ) ); + + UpdateButtonsState(); + GEOMBase_Helper::displayPreview( false, true, true, myLineWidth ); +} + +//================================================================================= +// function : TypeClicked() +// purpose : Radio button management +//================================================================================= +void EntityGUI_3DSketcherDlg::TypeClicked() +{ + bool blocked = Group3Spin->SpinBox_DX->signalsBlocked(); + Group3Spin->SpinBox_DX->blockSignals(true); + Group3Spin->SpinBox_DY->blockSignals(true); + Group3Spin->SpinBox_DZ->blockSignals(true); + // Get setting of step value from file configuration + double x, y, z; + GetLastPoints(x, y, z); + if ( GroupType->RadioButton1->isChecked() ) { // XY + Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_X2" ) ); + Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_Y2" ) ); + Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_Z2" ) ); + Group3Spin->SpinBox_DX->setValue( x + Group3Spin->SpinBox_DX->value() ); + Group3Spin->SpinBox_DY->setValue( y + Group3Spin->SpinBox_DY->value() ); + Group3Spin->SpinBox_DZ->setValue( z + Group3Spin->SpinBox_DZ->value() ); + Group3Spin->buttonApply->setFocus(); + } else if ( GroupType->RadioButton2->isChecked() ) { // DXDY + Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_DX2" ) ); + Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_DY2" ) ); + Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_DZ2" ) ); + Group3Spin->SpinBox_DX->setValue( Group3Spin->SpinBox_DX->value() - x ); + Group3Spin->SpinBox_DY->setValue( Group3Spin->SpinBox_DY->value() - y ); + Group3Spin->SpinBox_DZ->setValue( Group3Spin->SpinBox_DZ->value() - z ); + Group3Spin->buttonApply->setFocus(); + } + Group3Spin->SpinBox_DX->blockSignals(blocked); + Group3Spin->SpinBox_DY->blockSignals(blocked); + Group3Spin->SpinBox_DZ->blockSignals(blocked); +} + +//================================================================================= +// function : ClickOnAddPoint() +// purpose : called when the point coordinates is Applyed +//================================================================================= +void EntityGUI_3DSketcherDlg::ClickOnAddPoint() +{ + Locker lock( myOK ); + + double x, y, z; + GetCurrentPoints(x, y, z); + myPointsList.append(x); + myPointsList.append(y); + myPointsList.append(z); + + myRedoList.clear(); + + if ( GroupType->RadioButton2->isChecked() ) { + Group3Spin->SpinBox_DX->setValue( 0.0 ); + Group3Spin->SpinBox_DY->setValue( 0.0 ); + Group3Spin->SpinBox_DZ->setValue( 0.0 ); + } + GEOMBase_Helper::displayPreview( false, true, true, myLineWidth ); + UpdateButtonsState(); +} + +//================================================================================= +// function : UpdateButtonsState() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::UpdateButtonsState() +{ + if ( !myPointsList.count() ) + GroupType->RadioButton1->setChecked( true ); + GroupType->RadioButton2->setEnabled( myPointsList.count() > 2 ); + Group3Spin->buttonUndo->setEnabled( myPointsList.count() > 2 ); + Group3Spin->buttonRedo->setEnabled( myRedoList.count() > 2 ); +} + +//================================================================================= +// function : ClickOnUndo() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::ClickOnUndo() +{ + if (myPointsList.count() > 2) { + double x, y, z; + GetLastPoints(x, y, z); + myRedoList.append(x); + myRedoList.append(y); + myRedoList.append(z); + myPointsList.removeLast(); + myPointsList.removeLast(); + myPointsList.removeLast(); + + UpdateButtonsState(); + GEOMBase_Helper::displayPreview( false, true, true, myLineWidth ); + } +} + +//================================================================================= +// function : ClickOnRedo() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::ClickOnRedo() +{ + int count = myRedoList.count(); + if ( count > 2 ) { + myPointsList.append( myRedoList[count-3] ); + myPointsList.append( myRedoList[count-2] ); + myPointsList.append( myRedoList[count-1] ); + myRedoList.removeLast(); + myRedoList.removeLast(); + myRedoList.removeLast(); + + UpdateButtonsState(); + GEOMBase_Helper::displayPreview( false, true, true, myLineWidth ); + } +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed +//================================================================================= +void EntityGUI_3DSketcherDlg::SelectionIntoArgument() +{ + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + int nbSel = aSelList.Extent(); + if ( nbSel == 1 ) { + Standard_Boolean aRes = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aRes); + if (!CORBA::is_nil(aSelectedObject) && aRes) { + TopoDS_Shape aShape; + if (GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE)) { // Explore the shape if its a local selection + TColStd_IndexedMapOfInteger aMap; + aSelMgr->GetIndexes(aSelList.First(), aMap); + if (aMap.Extent() == 1) + { + int anIndex = aMap(1); + GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations(getStudyId()); + aSelectedObject = aShapesOp->GetSubShape(aSelectedObject, anIndex); + } + } + bool isOk = true; + if ( aShape.ShapeType() != TopAbs_VERTEX ) + isOk = GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_VERTEX); + if (isOk) { + gp_Pnt aPnt; + if ( GEOMBase::VertexToPoint( aShape, aPnt ) ) { + // set coordinates to the Spin Boxes + double aX, aY, aZ; + aX = aPnt.X(); + aY = aPnt.Y(); + aZ = aPnt.Z(); + bool blocked = Group3Spin->SpinBox_DX->signalsBlocked(); + Group3Spin->SpinBox_DX->blockSignals(true); + Group3Spin->SpinBox_DY->blockSignals(true); + Group3Spin->SpinBox_DZ->blockSignals(true); + if ( GroupType->RadioButton1->isChecked() ) { + Group3Spin->SpinBox_DX->setValue( aX ); + Group3Spin->SpinBox_DY->setValue( aY ); + Group3Spin->SpinBox_DZ->setValue( aZ ); + } else if ( GroupType->RadioButton2->isChecked() ) { + double x, y, z; + GetLastPoints(x, y, z); + Group3Spin->SpinBox_DX->setValue( aX - x ); + Group3Spin->SpinBox_DY->setValue( aY - y ); + Group3Spin->SpinBox_DZ->setValue( aZ - z ); + } + Group3Spin->SpinBox_DX->blockSignals(blocked); + Group3Spin->SpinBox_DY->blockSignals(blocked); + Group3Spin->SpinBox_DZ->blockSignals(blocked); + } + } + } + } + GEOMBase_Helper::displayPreview( false, true, true, myLineWidth ); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::DeactivateActiveDialog() +{ + setEnabled( false ); + globalSelection(); + disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 ); + myGeomGUI->SetActiveDialogBox( 0 ); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::ActivateThisDialog() +{ + myGeomGUI->EmitSignalDeactivateDialog(); + setEnabled( true ); + myGeomGUI->SetActiveDialogBox( this ); + + connect( myGeomGUI->getApp()->selectionMgr(), + SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + GEOMBase_Helper::displayPreview( false, true, true, myLineWidth ); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::ValueChangedInSpinBox( double newValue ) +{ + GEOMBase_Helper::displayPreview( false, true, true, myLineWidth ); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::enterEvent( QEvent* ) +{ + if ( !mainFrame()->GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr EntityGUI_3DSketcherDlg::createOperation() +{ + return getGeomEngine()->GetICurvesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool EntityGUI_3DSketcherDlg::isValid( QString& msg ) +{ + return true; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool EntityGUI_3DSketcherDlg::execute( ObjectList& objects ) +{ + GEOM::ListOfDouble_var aCoordsArray = new GEOM::ListOfDouble; + if (!myOK || myPointsList.size() == 0) + aCoordsArray->length(myPointsList.size()+3); + else + aCoordsArray->length(myPointsList.size()); + + int i = 0; + QList::const_iterator it; + for(it = myPointsList.begin(); it != myPointsList.end(); ++it ) { + aCoordsArray[i] = *it; + i++; + } + + if (!myOK || myPointsList.size() == 0) { + double x, y, z; + GetCurrentPoints(x, y, z); + aCoordsArray[i] = x; + aCoordsArray[i+1] = y; + aCoordsArray[i+2] = z; + } + + GEOM::GEOM_Object_var anObj = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->Make3DSketcher( aCoordsArray ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + +//================================================================================= +// function : initSpinBox() +// purpose : +//================================================================================= + +void EntityGUI_3DSketcherDlg::initSpinBox( QDoubleSpinBox* spinBox, + double min, double max, + double step, int decimals ) +{ + spinBox->setDecimals( decimals ); + spinBox->setRange( min, max ); + spinBox->setSingleStep( step ); +} + +//================================================================================= +// function : SetDoubleSpinBoxStep() +// purpose : Double spin box management +//================================================================================= +void EntityGUI_3DSketcherDlg::SetDoubleSpinBoxStep( double step ) +{ + Group3Spin->SpinBox_DX->setSingleStep(step); + Group3Spin->SpinBox_DY->setSingleStep(step); + Group3Spin->SpinBox_DZ->setSingleStep(step); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void EntityGUI_3DSketcherDlg::ClickOnOk() +{ + Locker lock( myOK ); + + if ( !onAccept() ) + return; + + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool EntityGUI_3DSketcherDlg::ClickOnApply() +{ + if (myPointsList.count() > 3) { + myPointsList.append(myPointsList[0]); + myPointsList.append(myPointsList[1]); + myPointsList.append(myPointsList[2]); + } + + Locker lock( myOK ); + + if ( !onAccept() ) + return false; + + ClickOnCancel(); + return true; +} + +//================================================================================= +// function : GetLastPoints() +// purpose : return last points from list +//================================================================================= +void EntityGUI_3DSketcherDlg::GetLastPoints(double& x, double& y, double& z) +{ + int count = myPointsList.count(); + x = count > 2 ? myPointsList[count-3] : 0.0; + y = count > 2 ? myPointsList[count-2] : 0.0; + z = count > 2 ? myPointsList[count-1] : 0.0; +} + +//================================================================================= +// function : GetCurrentPoints() +// purpose : returns current points +//================================================================================= +void EntityGUI_3DSketcherDlg::GetCurrentPoints(double& x, double& y, double& z) +{ + if ( GroupType->RadioButton1->isChecked() ) { + x = Group3Spin->SpinBox_DX->value(); + y = Group3Spin->SpinBox_DY->value(); + z = Group3Spin->SpinBox_DZ->value(); + } else { // if (GroupType->RadioButton2->isChecked()) + GetLastPoints(x, y, z); + x += Group3Spin->SpinBox_DX->value(); + y += Group3Spin->SpinBox_DY->value(); + z += Group3Spin->SpinBox_DZ->value(); + } +} + +//================================================================ +// Function : displayPreview +// Purpose : Method for displaying preview of resulting shape +// Redefined from GEOMBase_Helper. +//================================================================ +void EntityGUI_3DSketcherDlg::displayPreview( GEOM::GEOM_Object_ptr object, + const bool append, + const bool activate, + const bool update, + const double lineWidth, + const int displayMode, + const int color ) +{ + // Set color for preview shape + getDisplayer()->SetColor( Quantity_NOC_RED ); + + // set width of displayed shape + getDisplayer()->SetWidth( (lineWidth == -1)?myLineWidth:lineWidth ); + + // Disable activation of selection + getDisplayer()->SetToActivate( activate ); + + // Make a reference to GEOM_Object + CORBA::String_var objStr = myGeometryGUI->getApp()->orb()->object_to_string( object ); + getDisplayer()->SetName( objStr.in() ); + + // Create wire from applayed object + TopoDS_Shape anApplyedWire, aLastSegment; + if ( !createShapes( object, anApplyedWire, aLastSegment ) ) + return; + + // Build prs + SALOME_Prs* aPrs = getDisplayer()->BuildPrs( anApplyedWire ); + if ( aPrs != 0 && !aPrs->IsNull() ) + GEOMBase_Helper::displayPreview( aPrs, append, update ); + + getDisplayer()->SetColor( Quantity_NOC_VIOLET ); + aPrs = getDisplayer()->BuildPrs( aLastSegment ); + if ( aPrs != 0 && !aPrs->IsNull() ) + GEOMBase_Helper::displayPreview( aPrs, append, update ); + + getDisplayer()->UnsetName(); + + // Enable activation of displayed objects + getDisplayer()->SetToActivate( true ); +} + +//================================================================ +// Function : createShapes +// Purpose : Create applyed wire, and last segment from entry object +//================================================================ +bool EntityGUI_3DSketcherDlg::createShapes( GEOM::GEOM_Object_ptr theObject, + TopoDS_Shape& theApplyedWire, + TopoDS_Shape& theLastSegment ) +{ + TopoDS_Shape aShape; + if ( !GEOMBase::GetShape( theObject, aShape ) || + aShape.ShapeType() != TopAbs_WIRE && aShape.ShapeType() != TopAbs_VERTEX ) + return false; + + if ( myOK ) { + theApplyedWire = aShape; + return true; + } + + BRepBuilderAPI_MakeWire aBuilder; + TopExp_Explorer anExp( aShape, TopAbs_EDGE ); + while ( 1 ) { + TopoDS_Shape anEdge = anExp.Current(); + anExp.Next(); + if ( anExp.More() ) // i.e. non-last edge + aBuilder.Add( TopoDS::Edge( anEdge ) ); + else { + theLastSegment = anEdge; + break; + } + } + + if ( aBuilder.IsDone() ) + theApplyedWire = aBuilder.Shape(); + + return true; +} diff --git a/src/EntityGUI/EntityGUI_3DSketcherDlg.h b/src/EntityGUI/EntityGUI_3DSketcherDlg.h new file mode 100755 index 000000000..19cdb327d --- /dev/null +++ b/src/EntityGUI/EntityGUI_3DSketcherDlg.h @@ -0,0 +1,111 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : EntityGUI_3DSketcherDlg.h +// Author : DMV, OCN +// + +#ifndef ENTITYGUI_3DSKETCHERDLG_H +#define ENTITYGUI_3DSKETCHERDLG_H + +#include + +class QDoubleSpinBox; +class EntityGUI_3Spin; +class DlgRef_3Radio; + +#ifndef COORD_MIN +# define COORD_MIN -1e+15 +# define COORD_MAX +1e+15 +# define MAX_NUMBER 100000 +# define DBL_DIGITS_DISPLAY 16 +#endif // COORD_MIN + +//================================================================================= +// class : EntityGUI_Dlg +// purpose : +//================================================================================= +class EntityGUI_3DSketcherDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + EntityGUI_3DSketcherDlg( GeometryGUI*, QWidget* = 0, bool = false, Qt::WindowFlags = 0, const double = 2. ); + ~EntityGUI_3DSketcherDlg(); + +protected: + void initSpinBox( QDoubleSpinBox*, + double, double, double = 0.1, + int = 3 ); + + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid( QString& ); + virtual bool execute( ObjectList& ); + +private: + void Init(); + void enterEvent( QEvent* ); + + virtual void displayPreview( GEOM::GEOM_Object_ptr, + const bool = false, + const bool = false, + const bool = true, + const double = -1, + const int = -1, + const int = -1); + + bool createShapes( GEOM::GEOM_Object_ptr, + TopoDS_Shape&, + TopoDS_Shape& ); + +private: + QList myPointsList; + QList myRedoList; + + EntityGUI_3Spin* Group3Spin; + DlgRef_3Radio* GroupType; + + bool myOK; + double myLineWidth; + GeometryGUI* myGeometryGUI; + +private slots: + void ClickOnOk(); + void ClickOnAddPoint(); + bool ClickOnApply(); + // bool isSameAsPrevious(); + void UpdateButtonsState(); + void GetLastPoints(double&, double&, double&); + void GetCurrentPoints(double&, double&, double&); + + void ClickOnUndo(); + void ClickOnRedo(); + + void SelectionIntoArgument(); + void DeactivateActiveDialog(); + void ActivateThisDialog(); + void TypeClicked(); + void ValueChangedInSpinBox( double ); + void SetDoubleSpinBoxStep( double ); +}; + +#endif // ENTITYGUI_SKETCHERDLG_H diff --git a/src/EntityGUI/Makefile.am b/src/EntityGUI/Makefile.am index a949edea6..f54555614 100644 --- a/src/EntityGUI/Makefile.am +++ b/src/EntityGUI/Makefile.am @@ -34,17 +34,20 @@ salomeinclude_HEADERS = \ EntityGUI.h \ EntityGUI_Widgets.h \ EntityGUI_SketcherDlg.h \ + EntityGUI_3DSketcherDlg.h \ EntityGUI_SubShapeDlg.h dist_libEntityGUI_la_SOURCES = \ EntityGUI.cxx \ EntityGUI_Widgets.cxx \ EntityGUI_SketcherDlg.cxx \ + EntityGUI_3DSketcherDlg.cxx \ EntityGUI_SubShapeDlg.cxx MOC_FILES = \ EntityGUI_Widgets_moc.cxx \ EntityGUI_SketcherDlg_moc.cxx \ + EntityGUI_3DSketcherDlg_moc.cxx \ EntityGUI_SubShapeDlg_moc.cxx nodist_libEntityGUI_la_SOURCES = \ diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index e724f8b7c..a4c96d025 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -41,6 +41,10 @@ ICON_DLG_ARC_CENTER arccenter.png + + ICON_DLG_ARC_OF_ELLIPSE + arcofellipse.png + ICON_DLG_BASICPROPERTIES basicproperties.png @@ -221,6 +225,10 @@ ICON_DLG_FILLET fillet.png + + ICON_DLG_FILLET_2D + fillet2d.png + ICON_DLG_FILLET_ALL filletall.png @@ -381,6 +389,10 @@ ICON_DLG_POSITION2 position2.png + + ICON_DLG_POSITION3 + position3.png + ICON_DLG_PRISM prism.png @@ -753,6 +765,10 @@ ICO_FILLET fillet.png + + ICO_FILLET_2D + fillet2d.png + ICO_FILLING filling.png @@ -909,6 +925,10 @@ ICO_SKETCH sketch.png + + ICO_3DSKETCH + 3dsketch.png + ICO_SOLID build_solid.png diff --git a/src/GEOMGUI/GEOM_msg_en.po b/src/GEOMGUI/GEOM_msg_en.po index 02bab1ae8..74caf6b0e 100644 --- a/src/GEOMGUI/GEOM_msg_en.po +++ b/src/GEOMGUI/GEOM_msg_en.po @@ -684,6 +684,10 @@ msgstr "Edge" msgid "GEOM_FACE" msgstr "Face" +#Face +msgid "GEOM_PLANAR_FACE" +msgstr "Planar Face" + #Faces msgid "GEOM_FACES" msgstr "Faces" diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index df22e5db2..7c625e86f 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -611,6 +611,10 @@ Please, select face, shell or solid and try again GEOM_FILLET Fillet + + GEOM_FILLET_2D + Fillet 2D + GEOM_FILLET_ABORT Fillet can't be computed with radius %1 @@ -627,10 +631,18 @@ Please, select face, shell or solid and try again GEOM_FILLET_FACES Fillet On Faces From Shape + + GEOM_FILLET_VERTEXES + Fillet On Vertexes From Face + GEOM_FILLET_TITLE Fillet Construction + + GEOM_FILLET_2D_TITLE + 2D Fillet Construction + GEOM_FILLING Filling @@ -1327,6 +1339,10 @@ Please, select face, shell or solid and try again GEOM_REVERSE Reverse + + GEOM_REVERSE_DIRECTION + Reverse Direction + GEOM_REVERSE_PLANE Reverse the plane normal @@ -1467,6 +1483,10 @@ Please, select face, shell or solid and try again GEOM_SKETCHER_DY2 DY : + + GEOM_SKETCHER_DZ2 + DZ : + GEOM_SKETCHER_EL Element Type @@ -1515,6 +1535,10 @@ Please, select face, shell or solid and try again GEOM_SKETCHER_TITLE Sketch Construction + + GEOM_3DSKETCHER_TITLE + 3D Sketch Construction + GEOM_SKETCHER_TYPE Type @@ -1563,6 +1587,18 @@ Please, select face, shell or solid and try again GEOM_SKETCHER_Y3 Abs. Y : + + GEOM_SKETCHER_Z2 + Z : + + + GEOM_3DSKETCHER + 3D Sketcher + + + GEOM_COORDINATES_TYPE + Coordinates Type + GEOM_SOLID Solid @@ -1599,6 +1635,10 @@ Please, select face, shell or solid and try again GEOM_START_LCS Start LCS + + SELECT_UNPUBLISHED_EDGES + Select unpublished edges + GEOM_STEP Step : @@ -1823,6 +1863,10 @@ Please, select face, shell or solid and try again GEOM_VERTEX Vertex + + GEOM_VERTEXES + Vertexes + GEOM_WATER_DENSITY Water Density : @@ -2131,6 +2175,10 @@ Please, select face, shell or solid and try again MEN_FILLET Fillet + + MEN_FILLET_2D + Fillet 2D + MEN_FILLING Filling @@ -2355,6 +2403,10 @@ Please, select face, shell or solid and try again MEN_SKETCH Sketch + + MEN_3DSKETCH + 3D Sketch + MEN_SOLID Solid @@ -3597,7 +3649,7 @@ Please, select face, shell or solid and try again GEOM_PLANAR_FACE - Planar face + Planar Face GEOM_POLYGON diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index 69446fee3..8c1114274 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -441,6 +441,7 @@ void GeometryGUI::OnGUIEvent( int id ) #endif } else if( id == 404 || // MENU ENTITY - SKETCHER + id == 405 || // MENU ENTITY - 3D SKETCHER id == 407 ) { // MENU ENTITY - EXPLODE #ifndef WNT library = getLibrary( "libEntityGUI.so" ); @@ -490,7 +491,8 @@ void GeometryGUI::OnGUIEvent( int id ) id == 505 || // MENU OPERATION - FILLET id == 506 || // MENU OPERATION - CHAMFER id == 507 || // MENU OPERATION - CLIPPING RANGE - id == 508 ) { // MENU OPERATION - GET SHAPES ON SHAPE + id == 508 || // MENU OPERATION - GET SHAPES ON SHAPE + id == 509 ) { // MENU OPERATION - FILLET 2D #ifndef WNT library = getLibrary( "libOperationGUI.so" ); #else @@ -797,6 +799,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( 9999, "HEX_SOLID" ); createGeomAction( 404, "SKETCH" ); + createGeomAction( 405, "3DSKETCH" ); createGeomAction( 407, "EXPLODE" ); createGeomAction( 4081, "EDGE" ); @@ -826,6 +829,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( 506, "CHAMFER" ); //createGeomAction( 507, "CLIPPING" ); createGeomAction( 508, "GET_SHAPES_ON_SHAPES" ); + createGeomAction( 509, "FILLET_2D" ); createGeomAction( 9998, "MUL_TRANSFORM" ); createGeomAction( 9995, "EXPLODE_BLOCKS" ); @@ -945,6 +949,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( separator(), newEntId, -1 ); createMenu( 404, newEntId, -1 ); + createMenu( 405, newEntId, -1 ); createMenu( separator(), newEntId, -1 ); createMenu( 407, newEntId, -1 ); @@ -979,6 +984,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( 504, operId, -1 ); createMenu( 508, operId, -1 ); createMenu( separator(), operId, -1 ); + createMenu( 509, transId, -1 ); createMenu( 505, transId, -1 ); createMenu( 506, transId, -1 ); //createMenu( 507, transId, -1 ); diff --git a/src/GEOMImpl/GEOMImpl.pro b/src/GEOMImpl/GEOMImpl.pro index 03b27a4b7..87d10eaee 100644 --- a/src/GEOMImpl/GEOMImpl.pro +++ b/src/GEOMImpl/GEOMImpl.pro @@ -108,6 +108,7 @@ SOURCES += GEOMImpl_ArcDriver.cxx SOURCES += GEOMImpl_SplineDriver.cxx SOURCES += GEOMImpl_SketcherDriver.cxx SOURCES += GEOMImpl_FilletDriver.cxx +SOURCES += GEOMImpl_Fillet2dDriver.cxx SOURCES += GEOMImpl_ChamferDriver.cxx SOURCES += GEOMImpl_BooleanDriver.cxx SOURCES += GEOMImpl_PartitionDriver.cxx diff --git a/src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx b/src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx new file mode 100755 index 000000000..ccf53fdfb --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx @@ -0,0 +1,145 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + +#include +#include +#include +#include + +#include + +// OCCT Includes +#include +#include +#include +#include +#include +#include + +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_3DSketcherDriver::GetID() +{ + static Standard_GUID a3DSketcherDriver("FF2BBB54-5D24-4df3-210B-3A678263EA26"); + return a3DSketcherDriver; +} + + +//======================================================================= +//function : GEOMImpl_3DSketcherDriver +//purpose : +//======================================================================= +GEOMImpl_3DSketcherDriver::GEOMImpl_3DSketcherDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_3DSketcherDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_I3DSketcher aCI (aFunction); + + TopoDS_Shape aShape; + + Handle(TColStd_HArray1OfReal) aCoordsArray = aCI.GetCoordinates(); + + BRepBuilderAPI_MakePolygon aMakePoly; + int anArrayLength = aCoordsArray->Length(); + double x, y, z; + gp_Pnt aPnt; + for (int i = 0; i <=(anArrayLength - 3); i+=3) { + x = aCoordsArray->Value(i+1); + y = aCoordsArray->Value(i+2); + z = aCoordsArray->Value(i+3); + aPnt = gp_Pnt(x, y, z); + aMakePoly.Add(aPnt); + } + if ( anArrayLength == 3) { // Only Start Point + BRepBuilderAPI_MakeVertex mkVertex (aPnt); + aShape = mkVertex.Shape(); + } + else { // Make Wire + if (aCoordsArray->Value(1) == x && aCoordsArray->Value(2) == y && aCoordsArray->Value(3) == z) + aMakePoly.Close(); + + if (aMakePoly.IsDone()) + aShape = aMakePoly.Wire(); + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + log.SetTouched(Label()); + return 1; +} + + +//======================================================================= +//function : GEOMImpl_3DSketcherDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_3DSketcherDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_3DSketcherDriver", + sizeof(GEOMImpl_3DSketcherDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_3DSketcherDriver) Handle(GEOMImpl_3DSketcherDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_3DSketcherDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_3DSketcherDriver))) { + _anOtherObject = Handle(GEOMImpl_3DSketcherDriver)((Handle(GEOMImpl_3DSketcherDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_3DSketcherDriver.hxx b/src/GEOMImpl/GEOMImpl_3DSketcherDriver.hxx new file mode 100755 index 000000000..f0f2476f8 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_3DSketcherDriver.hxx @@ -0,0 +1,158 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : GEOMImpl_3DSketcherDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_3DSketcherDriver_HeaderFile +#define _GEOMImpl_3DSketcherDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_3DSketcherDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_3DSketcherDriver); + +class Handle(GEOMImpl_3DSketcherDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_3DSketcherDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_3DSketcherDriver)(const Handle(GEOMImpl_3DSketcherDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_3DSketcherDriver)(const GEOMImpl_3DSketcherDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_3DSketcherDriver)& operator=(const Handle(GEOMImpl_3DSketcherDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_3DSketcherDriver)& operator=(const GEOMImpl_3DSketcherDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_3DSketcherDriver* operator->() + { + return (GEOMImpl_3DSketcherDriver *)ControlAccess(); + } + + GEOMImpl_3DSketcherDriver* operator->() const + { + return (GEOMImpl_3DSketcherDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_3DSketcherDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_3DSketcherDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_3DSketcherDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_3DSketcherDriver(); +Standard_EXPORT virtual Standard_Integer Execute(TFunction_Logbook& log) const; +Standard_EXPORT virtual void Validate(TFunction_Logbook&) const {} +Standard_EXPORT Standard_Boolean MustExecute(const TFunction_Logbook&) const { return Standard_True; } +Standard_EXPORT static const Standard_GUID& GetID(); +Standard_EXPORT ~GEOMImpl_3DSketcherDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_3DSketcherDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_3DSketcherDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_3DSketcherDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ArcDriver.cxx b/src/GEOMImpl/GEOMImpl_ArcDriver.cxx index d8789a7ef..ad099022f 100644 --- a/src/GEOMImpl/GEOMImpl_ArcDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ArcDriver.cxx @@ -37,12 +37,16 @@ #include #include +#include +#include #include #include #include #include #include +#include #include +#include #include "utilities.h" @@ -78,7 +82,7 @@ Standard_Integer GEOMImpl_ArcDriver::Execute(TFunction_Logbook& log) const Standard_Integer aType = aFunction->GetType(); TopoDS_Shape aShape; - if ((aType == CIRC_ARC_THREE_PNT) || (aType == CIRC_ARC_CENTER)) + if ((aType == CIRC_ARC_THREE_PNT) || (aType == CIRC_ARC_CENTER) || (aType == ELLIPSE_ARC_CENTER_TWO_PNT)) { Handle(GEOM_Function) aRefPoint1 = aCI.GetPoint1(); Handle(GEOM_Function) aRefPoint2 = aCI.GetPoint2(); @@ -108,9 +112,7 @@ Standard_Integer GEOMImpl_ArcDriver::Execute(TFunction_Logbook& log) const { GC_MakeArcOfCircle arc (aP1, aP2, aP3); aShape = BRepBuilderAPI_MakeEdge(arc).Edge(); - } - else // CIRC_ARC_CENTER - { + } else if ( aType == CIRC_ARC_CENTER ) { // CIRC_ARC_CENTER Standard_Boolean sense = aCI.GetSense(); Standard_Real aRad = aP1.Distance(aP2); @@ -126,9 +128,29 @@ Standard_Integer GEOMImpl_ArcDriver::Execute(TFunction_Logbook& log) const GC_MakeArcOfCircle arc (aGeomCirc->Circ(), aP2, aP3, Standard_True); aShape = BRepBuilderAPI_MakeEdge(arc).Edge(); + } else if ( aType == ELLIPSE_ARC_CENTER_TWO_PNT ) { // ELLIPSE_ARC_CENTER_TWO_PNT + if ( aP1.Distance(aP2) <= aP1.Distance(aP3) ) { + // Standard_ConstructionError::Raise("Arc creation aborted: the distance from Center Point to Point 1 needs to be bigger than the distance from Center Point to Point 2"); + cout << "aP1.Distance(aP2) <= aP1.Distance(aP3)" << endl; + gp_Pnt aTmpP = aP2; + aP2 = aP3; + aP3 = aTmpP; + } + + GC_MakeEllipse ellipse (aP2, aP3, aP1); + Handle(Geom_Ellipse) aGeomEllipse = ellipse.Value(); + + gp_Vec aV1 (aP1, aP2); + gp_Vec aV2 (aP1, aP3); + + double alpha = fabs(aV1.Angle(aV2)); + + GC_MakeArcOfEllipse arc (aGeomEllipse->Elips(), aP2, aP3, Standard_True); + aShape = BRepBuilderAPI_MakeEdge(arc).Edge(); } } - } else { + } + else { } if (aShape.IsNull()) return 0; diff --git a/src/GEOMImpl/GEOMImpl_Fillet2dDriver.cxx b/src/GEOMImpl/GEOMImpl_Fillet2dDriver.cxx new file mode 100755 index 000000000..f7f2050ae --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_Fillet2dDriver.cxx @@ -0,0 +1,152 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_Fillet2dDriver::GetID() +{ + static Standard_GUID aFillet2dDriver("FF1AAB41-2A14-4df2-581B-3A568163BA46"); + return aFillet2dDriver; +} + + +//======================================================================= +//function : GEOMImpl_Fillet2dDriver +//purpose : +//======================================================================= +GEOMImpl_Fillet2dDriver::GEOMImpl_Fillet2dDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Fillet2dDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IFillet2d aCI (aFunction); + + TopoDS_Shape aShape; + + Handle(GEOM_Function) aRefShape = aCI.GetShape(); + TopoDS_Face aFaceShape = TopoDS::Face(aRefShape->GetValue()); + + if (aFaceShape.ShapeType() != TopAbs_FACE) + Standard_ConstructionError::Raise("Wrong arguments: two faces must be given"); + + BRepFilletAPI_MakeFillet2d fillet2d (aFaceShape); + + int aLen = aCI.GetLength(); + int ind = 1; + double rad = aCI.GetR(); + for (; ind <= aLen; ind++) { + TopoDS_Shape aShapeVertex; + if (GEOMImpl_ILocalOperations::GetSubShape + (aFaceShape, aCI.GetVertex(ind), aShapeVertex)) { + fillet2d.AddFillet(TopoDS::Vertex(aShapeVertex), rad); + } + } + + fillet2d.Build(); + if (!fillet2d.IsDone()) { + StdFail_NotDone::Raise("2D Fillet can't be computed on the given shape with the given radius"); + } + aShape = fillet2d.Shape(); + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_Fillet2dDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_Fillet2dDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_Fillet2dDriver", + sizeof(GEOMImpl_Fillet2dDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_Fillet2dDriver) Handle(GEOMImpl_Fillet2dDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_Fillet2dDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_Fillet2dDriver))) { + _anOtherObject = Handle(GEOMImpl_Fillet2dDriver)((Handle(GEOMImpl_Fillet2dDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_Fillet2dDriver.hxx b/src/GEOMImpl/GEOMImpl_Fillet2dDriver.hxx new file mode 100755 index 000000000..a5448db66 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_Fillet2dDriver.hxx @@ -0,0 +1,158 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : GEOMImpl_Fillet2dDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_Fillet2dDriver_HeaderFile +#define _GEOMImpl_Fillet2dDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_Fillet2dDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_Fillet2dDriver); + +class Handle(GEOMImpl_Fillet2dDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_Fillet2dDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_Fillet2dDriver)(const Handle(GEOMImpl_Fillet2dDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_Fillet2dDriver)(const GEOMImpl_Fillet2dDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_Fillet2dDriver)& operator=(const Handle(GEOMImpl_Fillet2dDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_Fillet2dDriver)& operator=(const GEOMImpl_Fillet2dDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_Fillet2dDriver* operator->() + { + return (GEOMImpl_Fillet2dDriver *)ControlAccess(); + } + + GEOMImpl_Fillet2dDriver* operator->() const + { + return (GEOMImpl_Fillet2dDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_Fillet2dDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_Fillet2dDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_Fillet2dDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_Fillet2dDriver(); +Standard_EXPORT virtual Standard_Integer Execute(TFunction_Logbook& log) const; +Standard_EXPORT virtual void Validate(TFunction_Logbook&) const {} +Standard_EXPORT Standard_Boolean MustExecute(const TFunction_Logbook&) const { return Standard_True; } +Standard_EXPORT static const Standard_GUID& GetID(); +Standard_EXPORT ~GEOMImpl_Fillet2dDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_Fillet2dDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_Fillet2dDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_Fillet2dDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_Gen.cxx b/src/GEOMImpl/GEOMImpl_Gen.cxx index 6e3dd0111..b01b3f88a 100644 --- a/src/GEOMImpl/GEOMImpl_Gen.cxx +++ b/src/GEOMImpl/GEOMImpl_Gen.cxx @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -61,6 +62,7 @@ #include #include #include +#include #include #include #include @@ -102,6 +104,7 @@ GEOMImpl_Gen::GEOMImpl_Gen() TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PolylineDriver::GetID(), new GEOMImpl_PolylineDriver()); TFunction_DriverTable::Get()->AddDriver(GEOMImpl_SplineDriver::GetID(), new GEOMImpl_SplineDriver()); TFunction_DriverTable::Get()->AddDriver(GEOMImpl_SketcherDriver::GetID(), new GEOMImpl_SketcherDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_3DSketcherDriver::GetID(), new GEOMImpl_3DSketcherDriver()); // 3D Primitives TFunction_DriverTable::Get()->AddDriver(GEOMImpl_BoxDriver::GetID(), new GEOMImpl_BoxDriver()); @@ -131,6 +134,7 @@ GEOMImpl_Gen::GEOMImpl_Gen() // Local Operations TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ChamferDriver::GetID(), new GEOMImpl_ChamferDriver()); TFunction_DriverTable::Get()->AddDriver(GEOMImpl_FilletDriver::GetID(), new GEOMImpl_FilletDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_Fillet2dDriver::GetID(), new GEOMImpl_Fillet2dDriver()); TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ArchimedeDriver::GetID(), new GEOMImpl_ArchimedeDriver()); // Geometrical Transformations, Offset, Scale diff --git a/src/GEOMImpl/GEOMImpl_I3DSketcher.hxx b/src/GEOMImpl/GEOMImpl_I3DSketcher.hxx new file mode 100755 index 000000000..dc4ea30f6 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_I3DSketcher.hxx @@ -0,0 +1,43 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +//NOTE: This is an interface to a function for the Sketcher creation. + + +#include "GEOM_Function.hxx" + +#include + +#define SKETCH_ARG_COORDS 1 + +class GEOMImpl_I3DSketcher +{ + public: + + GEOMImpl_I3DSketcher(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetCoordinates(const Handle(TColStd_HArray1OfReal)& theValue) + { _func->SetRealArray(SKETCH_ARG_COORDS, theValue); } + + Handle(TColStd_HArray1OfReal) GetCoordinates() { return _func->GetRealArray(SKETCH_ARG_COORDS); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx index 8d71452a5..6a6b8f9ef 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx @@ -23,6 +23,8 @@ #include +#include + #include #include @@ -34,6 +36,7 @@ #include #include #include +#include #include #include @@ -41,6 +44,7 @@ #include #include #include +#include #include "utilities.h" @@ -511,6 +515,67 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeArcCenter (Handle(GEOM_Objec return anArc; } +//============================================================================= +/*! + * MakeArcOfEllipse + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeArcOfEllipse (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2, + Handle(GEOM_Object) thePnt3) +{ + SetErrorCode(KO); + + if (thePnt1.IsNull() || thePnt2.IsNull() || thePnt3.IsNull()) return NULL; + + //Add a new Circle Arc object + Handle(GEOM_Object) anArc = GetEngine()->AddObject(GetDocID(), GEOM_ELLIPSE_ARC); + + //Add a new Circle Arc function + Handle(GEOM_Function) aFunction = + anArc->AddFunction(GEOMImpl_ArcDriver::GetID(), ELLIPSE_ARC_CENTER_TWO_PNT); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ArcDriver::GetID()) return NULL; + GEOMImpl_IArc aCI (aFunction); + + Handle(GEOM_Function) aRefPnt1 = thePnt1->GetLastFunction(); + Handle(GEOM_Function) aRefPnt2 = thePnt2->GetLastFunction(); + Handle(GEOM_Function) aRefPnt3 = thePnt3->GetLastFunction(); + + + if (aRefPnt1.IsNull() || aRefPnt2.IsNull() || aRefPnt3.IsNull()) return NULL; + + aCI.SetPoint1(aRefPnt1); + aCI.SetPoint2(aRefPnt2); + aCI.SetPoint3(aRefPnt3); + + //Compute the Arc value + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Arc driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << anArc << " = geompy.MakeArcOfEllipse(" + << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << ")"; + + SetErrorCode(OK); + return anArc; +} + //============================================================================= /*! * MakeSplineBezier @@ -709,6 +774,73 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcher (const char* theCom return aSketcher; } +//============================================================================= +/*! + * Make3DSketcher + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::Make3DSketcher (list theCoordinates) +{ + SetErrorCode(KO); + + //Add a new Sketcher object + Handle(GEOM_Object) a3DSketcher = GetEngine()->AddObject(GetDocID(), GEOM_3DSKETCHER); + + //Add a new Sketcher function + Handle(GEOM_Function) aFunction = + a3DSketcher->AddFunction(GEOMImpl_3DSketcherDriver::GetID(), GEOM_3DSKETCHER); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_3DSketcherDriver::GetID()) return NULL; + + GEOMImpl_I3DSketcher aCI (aFunction); + + int nbOfCoords = 0; + list::iterator it = theCoordinates.begin(); + for (; it != theCoordinates.end(); it++) + nbOfCoords++; + + Handle(TColStd_HArray1OfReal) aCoordsArray = new TColStd_HArray1OfReal (1, nbOfCoords); + + it = theCoordinates.begin(); + int ind = 1; + for (; it != theCoordinates.end(); it++, ind++) + aCoordsArray->SetValue(ind, *it); + + aCI.SetCoordinates(aCoordsArray); + + //Compute the Sketcher value + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("3D Sketcher driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump pd (aFunction); + pd << a3DSketcher << " = geompy.Make3DSketcher(["; + + it = theCoordinates.begin(); + pd << (*it++); + while (it != theCoordinates.end()) { + pd << ", " << (*it++); + } + pd << "])"; + + SetErrorCode(OK); + return a3DSketcher; +} + //============================================================================= /*! * MakeSketcherOnPlane diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx index 104418ec4..7380a0977 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx @@ -62,11 +62,16 @@ class GEOMImpl_ICurvesOperations : public GEOM_IOperations { Handle(GEOM_Object) thePnt3, bool theSense); + Standard_EXPORT Handle(GEOM_Object) MakeArcOfEllipse (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2, + Handle(GEOM_Object) thePnt3); + Standard_EXPORT Handle(GEOM_Object) MakeSplineBezier (list thePoints); Standard_EXPORT Handle(GEOM_Object) MakeSplineInterpolation (list thePoints); Standard_EXPORT Handle(GEOM_Object) MakeSketcher (const char* theCommand, list theWorkingPlane); + Standard_EXPORT Handle(GEOM_Object) Make3DSketcher (list theCoordinates); Standard_EXPORT Handle(GEOM_Object) MakeSketcherOnPlane (const char* theCommand, Handle(GEOM_Object) theWorkingPlane); }; diff --git a/src/GEOMImpl/GEOMImpl_IFillet2d.hxx b/src/GEOMImpl/GEOMImpl_IFillet2d.hxx new file mode 100755 index 000000000..ba67a6a18 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IFillet2d.hxx @@ -0,0 +1,51 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +//NOTE: This is an interface to a function for the Fillet2d and creation. + + +#include "GEOM_Function.hxx" + +#define FILLET2D_ARG_SH 1 +#define FILLET2D_ARG_R 2 +#define FILLET2D_ARG_LENG 3 +#define FILLET2D_ARG_LAST 4 + +class GEOMImpl_IFillet2d +{ + public: + + GEOMImpl_IFillet2d(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetShape(Handle(GEOM_Function) theRef) { _func->SetReference(FILLET2D_ARG_SH, theRef); } + Handle(GEOM_Function) GetShape() { return _func->GetReference(FILLET2D_ARG_SH); } + + void SetR(double theR) { _func->SetReal(FILLET2D_ARG_R, theR); } + void SetLength(int theLen) { _func->SetInteger(FILLET2D_ARG_LENG, theLen); } + void SetVertex(int theInd, int theVertex) + { _func->SetInteger(FILLET2D_ARG_LAST + theInd, theVertex); } + + double GetR() { return _func->GetReal(FILLET2D_ARG_R); } + int GetLength() { return _func->GetInteger(FILLET2D_ARG_LENG); } + int GetVertex(int theInd) { return _func->GetInteger(FILLET2D_ARG_LAST + theInd); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ILocalOperations.cxx b/src/GEOMImpl/GEOMImpl_ILocalOperations.cxx index 36109f527..9e552229a 100644 --- a/src/GEOMImpl/GEOMImpl_ILocalOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ILocalOperations.cxx @@ -29,9 +29,11 @@ #include #include +#include #include #include +#include #include #include @@ -410,6 +412,75 @@ Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeFilletFacesR1R2 return aFillet; } +//============================================================================= +/*! + * MakeFillet2D + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeFillet2D + (Handle(GEOM_Object) theShape, double theR, std::list theVertexes) +{ + SetErrorCode(KO); + + //Add a new Fillet object + Handle(GEOM_Object) aFillet2D = GetEngine()->AddObject(GetDocID(), GEOM_FILLET_2D); + + //Add a new Fillet function + Handle(GEOM_Function) aFunction = + aFillet2D->AddFunction(GEOMImpl_Fillet2dDriver::GetID(), FILLET_2D_SHAPE_VERTEXES); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_Fillet2dDriver::GetID()) return NULL; + + GEOMImpl_IFillet2d aCI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aCI.SetShape(aRefShape); + aCI.SetR(theR); + int aLen = theVertexes.size(); + aCI.SetLength(aLen); + + int ind = 1; + std::list::iterator it = theVertexes.begin(); + for (; it != theVertexes.end(); it++, ind++) { + aCI.SetVertex(ind, (*it)); + } + + //Compute the Fillet value + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("2D Fillet driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump pd (aFunction); + pd << aFillet2D << " = geompy.MakeFillet2D(" << theShape + << ", " << theR << ", ["; + + it = theVertexes.begin(); + pd << (*it++); + while (it != theVertexes.end()) { + pd << ", " << (*it++); + } + pd << "])"; + + SetErrorCode(OK); + return aFillet2D; +} + //============================================================================= /*! * MakeChamferAll diff --git a/src/GEOMImpl/GEOMImpl_ILocalOperations.hxx b/src/GEOMImpl/GEOMImpl_ILocalOperations.hxx index b973caa04..15acc6eaf 100644 --- a/src/GEOMImpl/GEOMImpl_ILocalOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ILocalOperations.hxx @@ -46,6 +46,8 @@ class GEOMImpl_ILocalOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) MakeFilletFacesR1R2 (Handle(GEOM_Object) theShape, double theR1, double theR2, std::list theFaces); + Standard_EXPORT Handle(GEOM_Object) MakeFillet2D (Handle(GEOM_Object) theShape, double theR, + std::list theVertexes); Standard_EXPORT Handle(GEOM_Object) MakeChamferAll (Handle(GEOM_Object) theShape, double theD); Standard_EXPORT Handle(GEOM_Object) MakeChamferEdge (Handle(GEOM_Object) theShape, diff --git a/src/GEOMImpl/GEOMImpl_IPosition.hxx b/src/GEOMImpl/GEOMImpl_IPosition.hxx index b2aafe56c..5d42d5d92 100644 --- a/src/GEOMImpl/GEOMImpl_IPosition.hxx +++ b/src/GEOMImpl/GEOMImpl_IPosition.hxx @@ -23,9 +23,12 @@ // #include "GEOM_Function.hxx" -#define POSITION_ARG_SHAPE 1 +#define POSITION_ARG_SHAPE 1 #define POSITION_ARG_START_LCS 2 -#define POSITION_ARG_END_LCS 3 +#define POSITION_ARG_END_LCS 3 +#define POSITION_ARG_PATH 5 +#define POSITION_ARG_DISTANCE 6 +#define POSITION_ARG_REVERSE 7 class GEOMImpl_IPosition { @@ -47,6 +50,17 @@ class GEOMImpl_IPosition Handle(GEOM_Function) GetEndLCS() { return _func->GetReference(POSITION_ARG_END_LCS); } + void SetPath(Handle(GEOM_Function) thePath) { _func->SetReference(POSITION_ARG_PATH, thePath); } + + Handle(GEOM_Function) GetPath() { return _func->GetReference(POSITION_ARG_PATH); } + + void SetDistance(double theDistance) { _func->SetReal(POSITION_ARG_DISTANCE, theDistance); } + + double GetDistance() { return _func->GetReal(POSITION_ARG_DISTANCE); } + + void SetReverse(bool theReverse) { _func->SetReal(POSITION_ARG_REVERSE, theReverse); } + bool GetReverse() { return _func->GetReal(POSITION_ARG_REVERSE); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx index 673b1fb0d..dd08ea611 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx @@ -1336,6 +1336,75 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionShapeCopy return aCopy; } +//============================================================================= +/*! + * PositionAlongPath + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionAlongPath + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePath, + double theDistance, bool theCopy, bool theReverse) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || thePath.IsNull()) return NULL; + + Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); + if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be set in position + + //Add a position function + Handle(GEOM_Function) aFunction; + Handle(GEOM_Object) aCopy; + + if (theCopy) { + aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + aFunction = aCopy->AddFunction(GEOMImpl_PositionDriver::GetID(), POSITION_ALONG_PATH); + } + else + aFunction = theObject->AddFunction(GEOMImpl_PositionDriver::GetID(), POSITION_ALONG_PATH); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PositionDriver::GetID()) return NULL; + + GEOMImpl_IPosition aTI (aFunction); + aTI.SetShape(anOriginal); + aTI.SetPath(thePath->GetLastFunction()); + aTI.SetDistance(theDistance); + aTI.SetReverse(theReverse); + + //Compute the position + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Position driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + if (theCopy) { + GEOM::TPythonDump(aFunction) << aCopy << " = geompy.PositionAlongPath(" + << theObject << ", " << thePath << ", " << theDistance << ", " << theCopy << ", " << theReverse << ")"; + SetErrorCode(OK); + return aCopy; + } + + GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.PositionAlongPath(" + << theObject << ", " << thePath << ", " << theDistance << ", " << theCopy << ", " << theReverse << ")"; + + SetErrorCode(OK); + return theObject; +} + //============================================================================= /*! * Rotate diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx index 0cde70037..99c52595e 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx @@ -119,6 +119,12 @@ class GEOMImpl_ITransformOperations : public GEOM_IOperations Handle(GEOM_Object) theStartLCS, Handle(GEOM_Object) theEndLCS); + Standard_EXPORT Handle(GEOM_Object) PositionAlongPath (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) thePath, + double theDistance, + bool theCopy, + bool theReverse); + Standard_EXPORT Handle(GEOM_Object) Rotate (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theAxis, double theAngle); diff --git a/src/GEOMImpl/GEOMImpl_PositionDriver.cxx b/src/GEOMImpl/GEOMImpl_PositionDriver.cxx index a6688c07b..2bdec65f3 100644 --- a/src/GEOMImpl/GEOMImpl_PositionDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PositionDriver.cxx @@ -30,19 +30,33 @@ // OCCT Includes #include +#include +#include #include +#include +#include #include #include #include +#include +#include #include #include +#include #include #include +#include #include #include +#include +#include +#include +#include #include #include +#include +#include //======================================================================= //function : GetID @@ -131,6 +145,183 @@ Standard_Integer GEOMImpl_PositionDriver::Execute(TFunction_Logbook& log) const BRepBuilderAPI_Transform aBRepTrsf (aShapeBase, aTrsf, Standard_False); aShape = aBRepTrsf.Shape(); } + else if (aType == POSITION_ALONG_PATH) { + Handle(GEOM_Function) aRefShape = aCI.GetShape(); + Handle(GEOM_Function) aPathShape = aCI.GetPath(); + double aValue = aCI.GetDistance(); + bool aReversed = aCI.GetReverse(); + + TopoDS_Shape aShapeBase = aRefShape->GetValue(); + TopoDS_Shape aPath = aPathShape->GetValue(); + + if (aShapeBase.IsNull() || aPath.IsNull()) + return 0; + + //Get a Center Of Mass Of Base Object + GProp_GProps aSystem; + gp_Pnt aCenterMass; + if (aShapeBase.ShapeType() == TopAbs_VERTEX) { + aCenterMass = BRep_Tool::Pnt(TopoDS::Vertex(aShapeBase)); + } else if (aShapeBase.ShapeType() == TopAbs_EDGE || aShapeBase.ShapeType() == TopAbs_WIRE) { + BRepGProp::LinearProperties(aShapeBase, aSystem); + aCenterMass = aSystem.CentreOfMass(); + } else if (aShapeBase.ShapeType() == TopAbs_FACE || aShapeBase.ShapeType() == TopAbs_SHELL) { + BRepGProp::SurfaceProperties(aShapeBase, aSystem); + aCenterMass = aSystem.CentreOfMass(); + } else { + BRepGProp::VolumeProperties(aShapeBase, aSystem); + aCenterMass = aSystem.CentreOfMass(); + } + + TopoDS_Shape aTrimmedPath; + gp_Trsf aTrsf; + Handle(Geom_Curve) aCurve; + Standard_Real aFirst =0.,aLast=0.; + Standard_Real aParam = 0.; + Standard_Real aLength = 0.; + + gp_Pnt aPFirst, aPLast; + + if ( aPath.ShapeType() == TopAbs_EDGE ) { // The Path is Edge + TopoDS_Edge anEdge = TopoDS::Edge(aPath); + + BRep_Tool::Range(anEdge,aFirst,aLast); + aCurve = BRep_Tool::Curve(anEdge,aFirst,aLast); + if (aReversed) + aCurve = aCurve->Reversed(); + + aCurve->D0(aFirst, aPFirst); + aCurve->D0(aLast, aPLast); + + // Translate a CenterMass of Base Shape to the start of the path + if ( !aPFirst.IsEqual(aCenterMass, gp::Resolution()) ) { + gp_Trsf aCurTrsf; + aCurTrsf.SetTranslation(aCenterMass, aPFirst); + aTrsf.PreMultiply(aCurTrsf); + } + aParam = aFirst + aValue*(aLast - aFirst); // Calculate parameter + } else if ( aPath.ShapeType() == TopAbs_WIRE ) { // The path Shape is Wire + TopoDS_Wire aWire = TopoDS::Wire(aPath); + + // fix edges order + Handle(ShapeFix_Wire) aFixWire = new ShapeFix_Wire; + aFixWire->Load(aWire); + aFixWire->FixReorder(); + aWire = aFixWire->Wire(); + + TopExp_Explorer ex; + TopTools_SequenceOfShape Edges; + Standard_Real nbEdges = 0.; + BRepTools_WireExplorer aWE (aWire); + for (; aWE.More(); aWE.Next(), nbEdges++) // Explore a Wire on Edges + Edges.Append(aWE.Current()); + + Standard_Real aSummOfLen =0.; + Standard_Real aCurLen =0.; + GeomAdaptor_Curve aAdC; + + for(int i=1; i<=Edges.Length(); i++) { // Calculate summary Lenght of edges + TopoDS_Edge anEdge = TopoDS::Edge(Edges.Value(i)); + BRep_Tool::Range(anEdge,aFirst,aLast); + aCurve = BRep_Tool::Curve(anEdge,aFirst,aLast); + aAdC.Load(aCurve,aFirst,aLast); + aCurLen = GCPnts_AbscissaPoint::Length(aAdC,aFirst,aLast); + aSummOfLen += aCurLen; + } + + // Move BaseShape to the Start Of the Curve + TopoDS_Edge anEdge; + if (!aReversed) + anEdge = TopoDS::Edge(Edges.Value(1)); + else + anEdge = TopoDS::Edge(Edges.Value(Edges.Length())); + + BRep_Tool::Range(anEdge,aFirst,aLast); + aCurve = BRep_Tool::Curve(anEdge,aFirst,aLast); + aCurve->D0(aFirst, aPFirst); + aCurve->D0(aLast, aPLast); + if ( !aPFirst.IsEqual(aCenterMass, gp::Resolution()) ) { + gp_Trsf aCurTrsf; + if (aReversed && anEdge.Orientation() == TopAbs_FORWARD) + aPFirst = aPLast; + + aCurTrsf.SetTranslation(aCenterMass, aPFirst); + aTrsf.PreMultiply(aCurTrsf); + } + + Standard_Real aWireLen = aSummOfLen*aValue; + aSummOfLen = 0; + for(int i=1; i<=Edges.Length(); i++) { + TopoDS_Edge anEdge; + if (!aReversed) + anEdge = TopoDS::Edge(Edges.Value(i)); + else + anEdge = TopoDS::Edge(Edges.Value(Edges.Length() - i + 1)); + + aCurve = BRep_Tool::Curve(anEdge,aFirst,aLast); + BRep_Tool::Range(anEdge,aFirst,aLast); + + if (!aReversed && anEdge.Orientation() == TopAbs_REVERSED) + aCurve = aCurve->Reversed(); + + if (aReversed && anEdge.Orientation() == TopAbs_FORWARD) + aCurve = aCurve->Reversed(); + + aAdC.Load(aCurve,aFirst,aLast); + aCurLen = GCPnts_AbscissaPoint::Length(aAdC,aFirst,aLast); + + if ( aWireLen > (aSummOfLen + aCurLen) ) { // Transform a Base object along this Edge + aSummOfLen += aCurLen; + gp_Pnt aP1, aP2; + gp_Vec aStartVec1, aStartVec2, aDestVec1, aDestVec2; + aCurve->D2(aFirst, aP1, aStartVec1, aStartVec2 ); + aCurve->D2(aLast, aP2, aDestVec1, aDestVec2 ); + gp_Trsf aCurTrsf; + if (aStartVec2.Magnitude() > gp::Resolution() && aDestVec2.Magnitude() > gp::Resolution()) { + gp_Ax3 aStartAx3(aP1, aStartVec1, aStartVec2); + gp_Ax3 aDestAx3(aP2, aDestVec1, aDestVec2); + aCurTrsf.SetDisplacement(aStartAx3, aDestAx3); + } else + aCurTrsf.SetTranslation(aP1, aP2); + + aTrsf.PreMultiply(aCurTrsf); + } + else { + aLength = aWireLen - aSummOfLen; + GCPnts_AbscissaPoint anAbsc(aAdC,aLength,aFirst); + if(anAbsc.IsDone()) + aParam = anAbsc.Parameter(); + break; + } + } + } else + return 0; // Unknown Type + + gp_Trsf aCurTrsf; + gp_Pnt aP1, aP2; + gp_Vec aStartVec1, aStartVec2, aDestVec1, aDestVec2; + aCurve->D2(aFirst, aP1, aStartVec1, aStartVec2 ); + aCurve->D2(aParam, aP2, aDestVec1, aDestVec2 ); + + if (aStartVec2.Magnitude() > gp::Resolution() && aDestVec2.Magnitude() > gp::Resolution()) { + gp_Ax3 aStartAx3(aP1, aStartVec1, aStartVec2); + gp_Ax3 aDestAx3(aP2, aDestVec1, aDestVec2); + aCurTrsf.SetDisplacement(aStartAx3, aDestAx3); + } else + aCurTrsf.SetTranslation(aP1, aP2); + + aTrsf.PreMultiply(aCurTrsf); + + if ( !aPFirst.IsEqual(aCenterMass, gp::Resolution()) ) { + gp_Trsf aCurTrsf; + aCurTrsf.SetTranslation(aPFirst, aCenterMass); + aTrsf.PreMultiply(aCurTrsf); + } + + // Perform transformation + BRepBuilderAPI_Transform aBRepTrsf (aShapeBase, aTrsf, Standard_False); + aShape = aBRepTrsf.Shape(); + } else return 0; diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 0c5f1d577..49cf5542f 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -47,8 +47,9 @@ #define GEOM_ELLIPSE 18 #define GEOM_CIRC_ARC 19 -#define GEOM_FILLET 20 -#define GEOM_CHAMFER 21 +#define GEOM_FILLET 20 +#define GEOM_FILLET_2D 45 +#define GEOM_CHAMFER 21 #define GEOM_EDGE 22 #define GEOM_WIRE 23 @@ -87,6 +88,9 @@ #define GEOM_SHAPES_ON_SHAPE 42 +#define GEOM_ELLIPSE_ARC 43 + +#define GEOM_3DSKETCHER 44 //GEOM_Function types @@ -153,6 +157,7 @@ #define POSITION_SHAPE_COPY 2 #define POSITION_SHAPE_FROM_GLOBAL 3 #define POSITION_SHAPE_FROM_GLOBAL_COPY 4 +#define POSITION_ALONG_PATH 5 #define TORUS_RR 1 #define TORUS_PNT_VEC_RR 2 @@ -215,8 +220,9 @@ #define ELLIPSE_PNT_VEC_RR 1 -#define CIRC_ARC_THREE_PNT 1 -#define CIRC_ARC_CENTER 2 +#define CIRC_ARC_THREE_PNT 1 +#define CIRC_ARC_CENTER 2 +#define ELLIPSE_ARC_CENTER_TWO_PNT 3 #define FILLET_SHAPE_ALL 1 #define FILLET_SHAPE_EDGES 2 @@ -224,6 +230,8 @@ #define FILLET_SHAPE_EDGES_2R 4 #define FILLET_SHAPE_FACES_2R 5 +#define FILLET_2D_SHAPE_VERTEXES 1 + #define CHAMFER_SHAPE_ALL 1 #define CHAMFER_SHAPE_EDGE 2 #define CHAMFER_SHAPE_FACES 3 diff --git a/src/GEOMImpl/Makefile.am b/src/GEOMImpl/Makefile.am index 91224152a..eb02b2929 100644 --- a/src/GEOMImpl/Makefile.am +++ b/src/GEOMImpl/Makefile.am @@ -56,11 +56,13 @@ salomeinclude_HEADERS = \ GEOMImpl_ISpline.hxx \ GEOMImpl_IEllipse.hxx \ GEOMImpl_IFillet.hxx \ + GEOMImpl_IFillet2d.hxx \ GEOMImpl_IChamfer.hxx \ GEOMImpl_ICopy.hxx \ GEOMImpl_IArchimede.hxx \ GEOMImpl_IArc.hxx \ GEOMImpl_ISketcher.hxx \ + GEOMImpl_I3DSketcher.hxx \ GEOMImpl_IVector.hxx \ GEOMImpl_IDisk.hxx \ GEOMImpl_IFace.hxx \ @@ -124,7 +126,9 @@ salomeinclude_HEADERS = \ GEOMImpl_ArcDriver.hxx \ GEOMImpl_SplineDriver.hxx \ GEOMImpl_SketcherDriver.hxx \ + GEOMImpl_3DSketcherDriver.hxx \ GEOMImpl_FilletDriver.hxx \ + GEOMImpl_Fillet2dDriver.hxx \ GEOMImpl_ChamferDriver.hxx \ GEOMImpl_BooleanDriver.hxx \ GEOMImpl_PartitionDriver.hxx \ @@ -185,7 +189,9 @@ dist_libGEOMimpl_la_SOURCES = \ GEOMImpl_ArcDriver.cxx \ GEOMImpl_SplineDriver.cxx \ GEOMImpl_SketcherDriver.cxx \ + GEOMImpl_3DSketcherDriver.cxx \ GEOMImpl_FilletDriver.cxx \ + GEOMImpl_Fillet2dDriver.cxx \ GEOMImpl_ChamferDriver.cxx \ GEOMImpl_BooleanDriver.cxx \ GEOMImpl_PartitionDriver.cxx \ diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc index 39bd1c8fe..9743e8614 100644 --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -161,7 +161,6 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, Unexpect aCatch(SALOME_SalomeException); SALOMEDS::SObject_var aResultSO; if(CORBA::is_nil(theObject) || theStudy->_is_nil()) return aResultSO; - GEOM::GEOM_Object_var aShape = GEOM::GEOM_Object::_narrow(theObject); if(aShape->_is_nil()) return aResultSO; @@ -1308,6 +1307,157 @@ GEOM::GEOM_Object_ptr GEOM_Gen_i::GetObject (CORBA::Long theStudyID, const char* return obj._retn(); } +//================================================================================= +// function : hasObjectInfo() +// purpose : shows if module provides information for its objects +//================================================================================= +bool GEOM_Gen_i::hasObjectInfo() +{ + return true; +} + +//================================================================================= +// function : getObjectInfo() +// purpose : returns an information for a given object by its entry +//================================================================================= +char* GEOM_Gen_i::getObjectInfo(CORBA::Long studyId, const char* entry) +{ + GEOM::GEOM_Object_var aGeomObject; + + CORBA::Object_var aSMObject = name_service->Resolve( "/myStudyManager" ); + SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow( aSMObject ); + SALOMEDS::Study_var aStudy = aStudyManager->GetStudyByID( studyId ); + SALOMEDS::SObject_var aSObj = aStudy->FindObjectID( entry ); + SALOMEDS::SObject_var aResultSObj; + if (aSObj->ReferencedObject(aResultSObj)) + aSObj = aResultSObj; + + SALOMEDS::GenericAttribute_var anAttr; + if (!aSObj->_is_nil() && aSObj->FindAttribute(anAttr, "AttributeIOR")) { + SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + CORBA::String_var aVal = anIOR->Value(); + CORBA::Object_var anObject = aStudy->ConvertIORToObject(aVal); + aGeomObject = GEOM::GEOM_Object::_narrow(anObject); + } + + char* aTypeInfo = "Object"; + if ( !aGeomObject->_is_nil() ) { + GEOM::GEOM_IKindOfShape::shape_kind aKind; + GEOM::ListOfLong_var anInts; + GEOM::ListOfDouble_var aDbls; + + GEOM::GEOM_IMeasureOperations_var anOp = GetIMeasureOperations( studyId ); + aKind = anOp->KindOfShape( aGeomObject, anInts, aDbls ); + + if ( anOp->IsDone() ) { + switch ( aKind ) { + case GEOM::GEOM_IKindOfShape::COMPOUND: + aTypeInfo = "Compound"; + break; + case GEOM::GEOM_IKindOfShape::COMPSOLID: + aTypeInfo = "CompSolid"; + break; + case GEOM::GEOM_IKindOfShape::SHELL: + aTypeInfo = "Shell"; + break; + case GEOM::GEOM_IKindOfShape::WIRE: + if ( anInts[0] == 1 ) + aTypeInfo = "Closed Wire"; + else if ( anInts[0] == 2 ) + aTypeInfo = "Opened Wire"; + else + aTypeInfo = "Wire"; + break; + // SOLIDs + case GEOM::GEOM_IKindOfShape::SPHERE: + aTypeInfo = "Sphere"; + break; + case GEOM::GEOM_IKindOfShape::CYLINDER: + aTypeInfo = "Cylinder"; + break; + case GEOM::GEOM_IKindOfShape::BOX: + case GEOM::GEOM_IKindOfShape::ROTATED_BOX: + aTypeInfo = "Box"; + break; + case GEOM::GEOM_IKindOfShape::TORUS: + aTypeInfo = "Torus"; + break; + case GEOM::GEOM_IKindOfShape::CONE: + aTypeInfo = "Cone"; + break; + case GEOM::GEOM_IKindOfShape::POLYHEDRON: + aTypeInfo = "Polyhedron"; + break; + case GEOM::GEOM_IKindOfShape::SOLID: + aTypeInfo = "Solid"; + break; + // FACEs + case GEOM::GEOM_IKindOfShape::SPHERE2D: + aTypeInfo = "Spherical Face"; + break; + case GEOM::GEOM_IKindOfShape::CYLINDER2D: + aTypeInfo = "Cylindrical Face"; + break; + case GEOM::GEOM_IKindOfShape::TORUS2D: + aTypeInfo = "Toroidal Face"; + break; + case GEOM::GEOM_IKindOfShape::CONE2D: + aTypeInfo = "Conical Face"; + break; + case GEOM::GEOM_IKindOfShape::DISK_CIRCLE: + aTypeInfo = "Disk"; + break; + case GEOM::GEOM_IKindOfShape::DISK_ELLIPSE: + aTypeInfo = "Elliptical Face"; + break; + case GEOM::GEOM_IKindOfShape::POLYGON: + aTypeInfo = "Polygon"; + break; + case GEOM::GEOM_IKindOfShape::PLANE: + aTypeInfo = "Plane"; + break; + case GEOM::GEOM_IKindOfShape::PLANAR: + aTypeInfo = "Planar Face"; + break; + case GEOM::GEOM_IKindOfShape::FACE: + aTypeInfo = "Face"; + break; + // EDGEs + case GEOM::GEOM_IKindOfShape::CIRCLE: + aTypeInfo = "Circle"; + break; + case GEOM::GEOM_IKindOfShape::ARC_CIRCLE: + aTypeInfo = "Ark"; + break; + case GEOM::GEOM_IKindOfShape::ELLIPSE: + aTypeInfo = "Ellipse"; + break; + case GEOM::GEOM_IKindOfShape::ARC_ELLIPSE: + aTypeInfo = "Arc Ellipse"; + break; + case GEOM::GEOM_IKindOfShape::LINE: + aTypeInfo = "Line"; + break; + case GEOM::GEOM_IKindOfShape::SEGMENT: + aTypeInfo = "Segment"; + break; + case GEOM::GEOM_IKindOfShape::EDGE: + aTypeInfo = "Edge"; + break; + case GEOM::GEOM_IKindOfShape::VERTEX: + aTypeInfo = "Vertex"; + break; + default: + break; + } + } + } + + char anInfo [strlen("Module ") + strlen(ComponentDataType()) + strlen(", ") + strlen(aTypeInfo)]; + sprintf(anInfo, "Module %s, %s", ComponentDataType(), aTypeInfo); + + return CORBA::string_dup(anInfo); +} //===================================================================================== // EXPORTED METHODS diff --git a/src/GEOM_I/GEOM_Gen_i.hh b/src/GEOM_I/GEOM_Gen_i.hh index cf594f49e..aba3b6aa6 100644 --- a/src/GEOM_I/GEOM_Gen_i.hh +++ b/src/GEOM_I/GEOM_Gen_i.hh @@ -232,7 +232,11 @@ class GEOM_I_EXPORT GEOM_Gen_i: virtual public POA_GEOM::GEOM_Gen, virtual publi char* GetDumpName (const char* theStudyEntry); GEOM::string_array* GetAllDumpNames(); - + + // Object information + virtual bool hasObjectInfo(); + virtual char* getObjectInfo(CORBA::Long studyId, const char* entry); + //-----------------------------------------------------------------------// // Internal methods // //-----------------------------------------------------------------------// diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.cc b/src/GEOM_I/GEOM_ICurvesOperations_i.cc index 661b4898d..2b15af49f 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.cc +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.cc @@ -275,6 +275,43 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeArcCenter return GetObject(anObject); } + +//============================================================================= +/*! + * MakeArc + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeArcOfEllipse + (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt1 == NULL || thePnt2 == NULL || thePnt3 == NULL) return aGEOMObject._retn(); + + //Get the reference points + Handle(GEOM_Object) aPnt1 = GetOperations()->GetEngine()->GetObject + (thePnt1->GetStudyID(), thePnt1->GetEntry()); + Handle(GEOM_Object) aPnt2 = GetOperations()->GetEngine()->GetObject + (thePnt2->GetStudyID(), thePnt2->GetEntry()); + Handle(GEOM_Object) aPnt3 = GetOperations()->GetEngine()->GetObject + (thePnt3->GetStudyID(), thePnt3->GetEntry()); + + if (aPnt1.IsNull() || aPnt2.IsNull() || aPnt3.IsNull()) return aGEOMObject._retn(); + + // Make Arc + Handle(GEOM_Object) anObject = + GetOperations()->MakeArcOfEllipse(aPnt1, aPnt2, aPnt3); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * MakePolyline @@ -409,6 +446,31 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcher return GetObject(anObject); } +//============================================================================= +/*! + * Make3DSketcher + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::Make3DSketcher + (const GEOM::ListOfDouble& theCoordinates) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + int ind = 0; + int aLen = theCoordinates.length(); + list aCoords; + for (; ind < aLen; ind++) + aCoords.push_back(theCoordinates[ind]); + + // Make Sketcher + Handle(GEOM_Object) anObject = + GetOperations()->Make3DSketcher(aCoords); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return GEOM::GEOM_Object::_nil(); + + return GetObject(anObject); +} //============================================================================= /*! diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.hh b/src/GEOM_I/GEOM_ICurvesOperations_i.hh index f26eef628..24179fc1f 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.hh +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.hh @@ -65,6 +65,10 @@ class GEOM_I_EXPORT GEOM_ICurvesOperations_i : GEOM::GEOM_Object_ptr thePnt2, GEOM::GEOM_Object_ptr thePnt3, bool theSense); + + GEOM::GEOM_Object_ptr MakeArcOfEllipse (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); GEOM::GEOM_Object_ptr MakePolyline (const GEOM::ListOfGO& thePoints); @@ -73,6 +77,8 @@ class GEOM_I_EXPORT GEOM_ICurvesOperations_i : GEOM::GEOM_Object_ptr MakeSplineInterpolation (const GEOM::ListOfGO& thePoints); GEOM::GEOM_Object_ptr MakeSketcher (const char* theCommand, const GEOM::ListOfDouble& theWorkingPlane); + + GEOM::GEOM_Object_ptr Make3DSketcher (const GEOM::ListOfDouble& theCoordinates); GEOM::GEOM_Object_ptr MakeSketcherOnPlane (const char* theCommand, GEOM::GEOM_Object_ptr theWorkingPlane); diff --git a/src/GEOM_I/GEOM_ILocalOperations_i.cc b/src/GEOM_I/GEOM_ILocalOperations_i.cc index d7c5f74d8..c71a24780 100644 --- a/src/GEOM_I/GEOM_ILocalOperations_i.cc +++ b/src/GEOM_I/GEOM_ILocalOperations_i.cc @@ -221,6 +221,41 @@ GEOM::GEOM_Object_ptr GEOM_ILocalOperations_i::MakeFilletFacesR1R2 return GetObject(anObject); } +//============================================================================= +/*! + * MakeFillet2D + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ILocalOperations_i::MakeFillet2D + (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, + const GEOM::ListOfLong& theVertexes) +{ + GEOM::GEOM_Object_var aGEOMObject; + + if (theShape == NULL) return aGEOMObject._retn(); + + //Get the reference shape + Handle(GEOM_Object) aShapeRef = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + if (aShapeRef.IsNull()) return aGEOMObject._retn(); + + //Get the reference vertex + int ind = 0; + int aLen = theVertexes.length(); + list aVertexes; + for (; ind < aLen; ind++) { + aVertexes.push_back(theVertexes[ind]); + } + + //Create the Fillet + Handle(GEOM_Object) anObject = + GetOperations()->MakeFillet2D(aShapeRef, theR, aVertexes); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * MakeChamferAll diff --git a/src/GEOM_I/GEOM_ILocalOperations_i.hh b/src/GEOM_I/GEOM_ILocalOperations_i.hh index eaf73c6b5..e13d37f49 100644 --- a/src/GEOM_I/GEOM_ILocalOperations_i.hh +++ b/src/GEOM_I/GEOM_ILocalOperations_i.hh @@ -59,6 +59,9 @@ class GEOM_I_EXPORT GEOM_ILocalOperations_i : CORBA::Double theR1, CORBA::Double theR2, const GEOM::ListOfLong& theFaces); + + GEOM::GEOM_Object_ptr MakeFillet2D (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, + const GEOM::ListOfLong& theVertexes); GEOM::GEOM_Object_ptr MakeChamferAll (GEOM::GEOM_Object_ptr theShape, CORBA::Double theD); diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.cc b/src/GEOM_I/GEOM_ITransformOperations_i.cc index 0985505c7..ac359856d 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.cc +++ b/src/GEOM_I/GEOM_ITransformOperations_i.cc @@ -989,6 +989,47 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::PositionShapeCopy return GetObject(anObject); } +//============================================================================= +/*! + * PositionAlongPath + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::PositionAlongPath + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePath, + CORBA::Double theDistance, + CORBA::Boolean theCopy, + CORBA::Boolean theReverse) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL || thePath == NULL) + return aGEOMObject._retn(); + + //Get the basic object + CORBA::String_var anEntry = theObject->GetEntry(); + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), anEntry); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the path object + CORBA::String_var aPathEntry = thePath->GetEntry(); + Handle(GEOM_Object) aPathObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), aPathEntry); + if (aPathObject.IsNull()) return aGEOMObject._retn(); + + //Perform the position + Handle(GEOM_Object) anObject = + GetOperations()->PositionAlongPath(aBasicObject, aPathObject, theDistance, theCopy, theReverse); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * MultiTranslate1D diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.hh b/src/GEOM_I/GEOM_ITransformOperations_i.hh index b250f0a91..e46758e01 100644 --- a/src/GEOM_I/GEOM_ITransformOperations_i.hh +++ b/src/GEOM_I/GEOM_ITransformOperations_i.hh @@ -142,6 +142,12 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i : GEOM::GEOM_Object_ptr theStartLCS, GEOM::GEOM_Object_ptr theEndLCS); + GEOM::GEOM_Object_ptr PositionAlongPath (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePath, + CORBA::Double theDistance, + CORBA::Boolean theCopy, + CORBA::Boolean theReverse); + GEOM::GEOM_Object_ptr RotateThreePoints (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr theCentPoint, GEOM::GEOM_Object_ptr thePoint1, diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 6bbfeb988..159bb6f49 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -1821,6 +1821,23 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::PositionShapeCopy (GEOM::GEOM_Object_ptr th return anObj; } +//============================================================================= +// PositionAlongPath: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::PositionAlongPath (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePath, + CORBA::Double theDistance, + CORBA::Boolean theCopy, + CORBA::Boolean theReverse) +{ + beginService( " GEOM_Superv_i::PositionAlongPath" ); + MESSAGE("GEOM_Superv_i::PositionAlongPath"); + getTransfOp(); + GEOM::GEOM_Object_ptr anObj = myTransfOp->PositionAlongPath(theObject, thePath, theDistance, theCopy, theReverse); + endService( " GEOM_Superv_i::PositionAlongPath" ); + return anObj; +} + //=============================== ShapesOperations ============================ //============================================================================= // Make: @@ -2546,6 +2563,21 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeArcCenter (GEOM::GEOM_Object_ptr theCen return anObj; } +//============================================================================= +// MakeArcOfEllipse: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeArcOfEllipse (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3) +{ + beginService( " GEOM_Superv_i::MakeArcOfEllipse" ); + MESSAGE("GEOM_Superv_i::MakeArcOfEllipse"); + getCurvesOp(); + GEOM::GEOM_Object_ptr anObj = myCurvesOp->MakeArcOfEllipse(thePnt1, thePnt2, thePnt3); + endService( " GEOM_Superv_i::MakeArcOfEllipse" ); + return anObj; +} + //============================================================================= // MakePolyline: //============================================================================= @@ -2619,6 +2651,24 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSketcher (const char* theCommand, return NULL; } +//============================================================================= +// Make3DSketcher: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::Make3DSketcher ( GEOM::GEOM_List_ptr theCoordinates) +{ + beginService( " GEOM_Superv_i::Make3DSketcher" ); + MESSAGE("GEOM_Superv_i::Make3DSketcher"); + if (GEOM_List_i* aListImpl = + dynamic_cast*>(GetServant(theCoordinates, myPOA).in())) { + getCurvesOp(); + GEOM::GEOM_Object_ptr anObj = myCurvesOp->Make3DSketcher(aListImpl->GetList()); + endService( " GEOM_Superv_i::Make3DSketcher" ); + return anObj; + } + endService( " GEOM_Superv_i::Make3DSketcher" ); + return NULL; +} + //=============================== LocalOperations ============================= //============================================================================= // MakeFilletAll: @@ -2718,6 +2768,26 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeFilletFacesR1R2 (GEOM::GEOM_Object_ptr return NULL; } +//============================================================================= +// MakeFillet2D: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeFillet2D (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theR, + GEOM::GEOM_List_ptr theVertexes) +{ + beginService( " GEOM_Superv_i::MakeFillet2D" ); + MESSAGE("GEOM_Superv_i::MakeFillet2D"); + if (GEOM_List_i* aListImplV = + dynamic_cast*>(GetServant(theVertexes, myPOA).in())) { + getLocalOp(); + GEOM::GEOM_Object_ptr anObj = myLocalOp->MakeFillet2D(theShape, theR, aListImplV->GetList()); + endService( " GEOM_Superv_i::MakeFillet2D" ); + return anObj; + } + endService( " GEOM_Superv_i::MakeFillet2D" ); + return NULL; +} + //============================================================================= // MakeChamferAll: //============================================================================= diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh index a061ce3ba..b34c13214 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.hh +++ b/src/GEOM_I_Superv/GEOM_Superv_i.hh @@ -421,6 +421,11 @@ public: GEOM::GEOM_Object_ptr PositionShapeCopy (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr theStartLCS, GEOM::GEOM_Object_ptr theEndLCS); + GEOM::GEOM_Object_ptr PositionAlongPath (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePath, + CORBA::Double theDistance, + CORBA::Boolean theCopy, + CORBA::Boolean theReverse); //-----------------------------------------------------------// // ShapesOperations // @@ -559,11 +564,15 @@ public: GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2, CORBA::Boolean theSense); + GEOM::GEOM_Object_ptr MakeArcOfEllipse (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); GEOM::GEOM_Object_ptr MakePolyline (GEOM::GEOM_List_ptr thePoints); GEOM::GEOM_Object_ptr MakeSplineBezier (GEOM::GEOM_List_ptr thePoints); GEOM::GEOM_Object_ptr MakeSplineInterpolation (GEOM::GEOM_List_ptr thePoints); GEOM::GEOM_Object_ptr MakeSketcher (const char* theCommand, GEOM::GEOM_List_ptr theWorkingPlane); + GEOM::GEOM_Object_ptr Make3DSketcher (GEOM::GEOM_List_ptr theCoordinates); //-----------------------------------------------------------// // LocalOperations // @@ -578,6 +587,8 @@ public: GEOM::GEOM_List_ptr theFaces); GEOM::GEOM_Object_ptr MakeFilletFacesR1R2 (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR1, CORBA::Double theR2, GEOM::GEOM_List_ptr theFaces); + GEOM::GEOM_Object_ptr MakeFillet2D (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, + GEOM::GEOM_List_ptr theVertexes); GEOM::GEOM_Object_ptr MakeChamferAll (GEOM::GEOM_Object_ptr theShape, CORBA::Double theD); GEOM::GEOM_Object_ptr MakeChamferEdge (GEOM::GEOM_Object_ptr theShape, CORBA::Double theD1, CORBA::Double theD2, diff --git a/src/GEOM_SWIG/GEOM_ObjectInfo.py b/src/GEOM_SWIG/GEOM_ObjectInfo.py new file mode 100644 index 000000000..a5c57e9e0 --- /dev/null +++ b/src/GEOM_SWIG/GEOM_ObjectInfo.py @@ -0,0 +1,60 @@ +# GEOM GEOM_SWIG : binding of C++ omplementaion with Python +# +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# +# +# File : GEOM_ObjectInfo.py +# Author : Michael ZORIN +# Module : GEOM +# $Header: + +import salome +import geompy + +geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") + +# Create several objects +obj1 = geompy.MakeVertex(0.,0.,0.) +obj2 = geompy.MakeCircleR(150.) +obj3 = geompy.MakeBoxDXDYDZ(300.,400.,500.) +obj4 = geompy.MakeCylinderRH(100.,200.) +ShapeListCompound = [] +ShapeListCompound.append(obj3) +ShapeListCompound.append(obj4) +obj5 = geompy.MakeCompound(ShapeListCompound) + +obj1_entry = geompy.addToStudy(obj1, "Object1") +obj2_entry = geompy.addToStudy(obj2, "Object2") +obj3_entry = geompy.addToStudy(obj3, "Object3") +obj4_entry = geompy.addToStudy(obj4, "Object4") +obj5_entry = geompy.addToStudy(obj5, "Object5") + +# Get information about objects +hasInfo = geom.hasObjectInfo() +print "Check if GEOM module provides information about its objects: ", hasInfo +if hasInfo == True: + print "Information about first object: ", geom.getObjectInfo(salome.myStudyId, obj1_entry) + print "Information about second object: ", geom.getObjectInfo(salome.myStudyId, obj2_entry) + print "Information about third object: ", geom.getObjectInfo(salome.myStudyId, obj3_entry) + print "Information about fourth object: ", geom.getObjectInfo(salome.myStudyId, obj4_entry) + print "Information about fifth object: ", geom.getObjectInfo(salome.myStudyId, obj5_entry) + +salome.sg.updateObjBrowser(1) diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index 60b2b0e32..317f1dc40 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -23,7 +23,7 @@ # File : GEOM_usinggeom.py # Author : Damien COQUERET, Open CASCADE # Module : GEOM -# $Header$ +# # ! Please, if you edit this example file, update also # ! GEOM_SRC/doc/salome/gui/GEOM/input/tui_test_all.doc # ! as some sequences of symbols from this example are used during @@ -92,6 +92,7 @@ def TestAll (geompy, math): Arc = geompy.MakeArc(py, pz, px) #(3 GEOM_Object_ptr)->GEOM_Object_ptr Arc2 = geompy.MakeArcCenter(py, pz, px,0) #(3 GEOM_Object_ptr,Boolean)->GEOM_Object_ptr + Arc3 = geompy.MakeArcOfEllipse(p0, px, pz) #(3 GEOM_Object_ptr,Boolean)->GEOM_Object_ptr Circle = geompy.MakeCircle(p0, vz, radius1) #(2 GEOM_Object_ptr, Double)->GEOM_Object_ptr Circle1 = geompy.MakeCircleThreePnt(p0, pxyz, px) #(3 GEOM_Object_ptr)->GEOM_Object_ptr Circle2 = geompy.MakeCircleCenter2Pnt(p0, pxyz, py) #(3 GEOM_Object_ptr)->GEOM_Object_ptr @@ -101,6 +102,7 @@ def TestAll (geompy, math): Interpol = geompy.MakeInterpol([px, py, p200, pxyz]) #(List of GEOM_Object_ptr)->GEOM_Object_ptr Sketcher = geompy.MakeSketcher("Sketcher:F -100 -100:TT 250 -100:R 0:C 100 150:R 0:L 300:WW", [100,0,0, 1,1,1, -1,1,0]) #(String, List of Doubles)->GEOM_Object_ptr + Sketcher3d = geompy.Make3DSketcher([0,0,0, 50,50,50, 0,50,50, 10,0,0]) #Test point on curve creation p_on_arc = geompy.MakeVertexOnCurve(Arc, 0.25) #(GEOM_Object_ptr, Double)->GEOM_Object_ptr @@ -205,6 +207,7 @@ def TestAll (geompy, math): MirrorAxis = geompy.MakeMirrorByAxis(Box, Line1) # MirrorPnt = geompy.MakeMirrorByPoint(Box, p200) # Position = geompy.MakePosition(Box, cs1, cs2) #(3 GEOM_Object_ptr)->GEOM_Object_ptr + Position2 = geompy.PositionAlongPath(Box, Arc, 0.5, 1, 0) #(2 GEOM_Object_ptr, 1 Double, 2 Bool)->GEOM_Object_ptr Offset = geompy.MakeOffset(Box, 10.) #(GEOM_Object_ptr, Double)->GEOM_Object_ptr Orientation = geompy.ChangeOrientation(Box) @@ -232,6 +235,7 @@ def TestAll (geompy, math): IDlist_f = [f_ind_1, f_ind_2] #Local operations + Fillet2d = geompy.MakeFillet2D(Face3, radius, [4, 7, 9]) #(GEOM_Object_ptr, Double, ListOfLong)->GEOM_Object_ptr Fillet = geompy.MakeFillet (Prism, radius, ShapeTypeEdge, IDlist_e) #(GEOM_Object_ptr, Double, Short, ListOfLong)->GEOM_Object_ptr Fillet2 = geompy.MakeFilletR1R2 (Prism, 7., 13., ShapeTypeEdge, @@ -292,6 +296,8 @@ def TestAll (geompy, math): id_Plane1 = geompy.addToStudy(Plane1, "Plane by 3 points") id_Arc = geompy.addToStudy(Arc, "Arc") + id_Arc2 = geompy.addToStudy(Arc2, "Arc2") + id_Arc3 = geompy.addToStudy(Arc3, "Arc3") id_Circle = geompy.addToStudy(Circle, "Circle") id_Circle1 = geompy.addToStudy(Circle1, "Circle by 3 points") id_Circle2 = geompy.addToStudy(Circle2, "Circle by center and 2 points") @@ -300,6 +306,7 @@ def TestAll (geompy, math): id_Bezier = geompy.addToStudy(Bezier, "Bezier") id_Interpol = geompy.addToStudy(Interpol, "Interpol") id_Sketcher = geompy.addToStudy(Sketcher, "Sketcher") + id_Sketcher3d = geompy.addToStudy(Sketcher3d, "Sketcher 3D") id_p_on_arc = geompy.addToStudy(p_on_arc, "Vertex on Arc (0.25)") id_p_on_l1l2 = geompy.addToStudy(p_on_l1l2, "Vertex on Lines Intersection") @@ -369,11 +376,13 @@ def TestAll (geompy, math): id_MirrorAxis = geompy.addToStudy(MirrorAxis, "Mirror by Axis") id_MirrorPnt = geompy.addToStudy(MirrorPnt, "Mirror by Point") id_Position = geompy.addToStudy(Position, "Positioned box") + id_Position2 = geompy.addToStudy(Position2, "Positioned box along path") id_Offset = geompy.addToStudy(Offset, "Offset") id_Orientation = geompy.addToStudy(Orientation, "Orientation") id_Fillet = geompy.addToStudy(Fillet, "Fillet") id_Fillet2 = geompy.addToStudy(Fillet2, "Fillet2") + id_Fillet2d = geompy.addToStudy(Fillet2d, "Fillet2D") id_Chamfer = geompy.addToStudy(Chamfer, "Chamfer on Edge") id_Chamfer2 = geompy.addToStudy(Chamfer2, "Chamfer on Faces") diff --git a/src/GEOM_SWIG/Makefile.am b/src/GEOM_SWIG/Makefile.am index 17cc3288d..3b7c921fb 100644 --- a/src/GEOM_SWIG/Makefile.am +++ b/src/GEOM_SWIG/Makefile.am @@ -24,7 +24,8 @@ # Author : Nicolas REJNERI, Paul RASCLE # Modified by : Alexander BORODIN (OCN) - autotools usage # Module : GEOM -# $Header$ + + # Libraries targets # include $(top_srcdir)/adm_local/unix/make_common_starter.am @@ -64,6 +65,7 @@ dist_salomescript_DATA = \ GEOM_tube_geom_gg2.py \ GEOM_Nut.py \ GEOM_Sketcher.py \ + GEOM_ObjectInfo.py \ PAL_MESH_019_020_geometry.py \ PAL_MESH_028_geometry.py \ PAL_MESH_030_geometry.py \ diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 4603c1af7..787ccc005 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -23,8 +23,7 @@ # File : geompy.py # Author : Paul RASCLE, EDF # Module : GEOM -# $Header$ -# + """ \namespace geompy \brief Module geompy @@ -491,6 +490,19 @@ class geompyDC(GEOM._objref_GEOM_Gen): anObj = self.CurvesOp.MakeArcCenter(thePnt1, thePnt2, thePnt3, theSense) RaiseIfFailed("MakeArcCenter", self.CurvesOp) return anObj + + ## Create an arc of ellipse, of center and two points. + # @param theCenter Center of the arc. + # @param thePnt1 defines major radius of the arc by distance from Pnt1 to Pnt2. + # @param thePnt2 defines plane of ellipse and minor radius as distance from Pnt3 to line from Pnt1 to Pnt2. + # @return New GEOM_Object, containing the created arc. + # + # @ref swig_MakeArc "Example" + def MakeArcOfEllipse(self,theCenter, thePnt1, thePnt2): + # Example: see GEOM_TestAll.py + anObj = self.CurvesOp.MakeArcOfEllipse(theCenter, thePnt1, thePnt2) + RaiseIfFailed("MakeArcOfEllipse", self.CurvesOp) + return anObj ## Create a circle with given center, normal vector and radius. # @param thePnt Circle center. @@ -656,6 +668,18 @@ class geompyDC(GEOM._objref_GEOM_Gen): anObj = self.CurvesOp.MakeSketcherOnPlane(theCommand, theWorkingPlane) RaiseIfFailed("MakeSketcherOnPlane", self.CurvesOp) return anObj + + ## Create a sketcher wire, following the numerical description, + # passed through theCoordinates argument. \n + # @param theCoordinates double values, defining points to create a wire, + # passing from it. + # @return New GEOM_Object, containing the created wire. + # + # @ref tui_sketcher_page "Example" + def Make3DSketcher(self, theCoordinates): + anObj = self.CurvesOp.Make3DSketcher(theCoordinates) + RaiseIfFailed("Make3DSketcher", self.CurvesOp) + return anObj # end of l3_sketcher ## @} @@ -2217,6 +2241,21 @@ class geompyDC(GEOM._objref_GEOM_Gen): RaiseIfFailed("PositionShapeCopy", self.TrsfOp) return anObj + ## Modify the Location of the given object by Path, + # @param theObject The object to be displaced. + # @param thePath Wire or Edge along that the object will be translated. + # @param theDistance progress of Path (0 = start location, 1 = end of path location). + # @param theCopy is to create a copy objects if true. + # @param theReverse - 0 for usual direction, 1 to reverse path direction. + # @return New GEOM_Object, containing the displaced shape. + # + # @ref tui_modify_location "Example" + def PositionAlongPath(self,theObject, thePath, theDistance, theCopy, theReverse): + # Example: see GEOM_TestAll.py + anObj = self.TrsfOp.PositionAlongPath(theObject, thePath, theDistance, theCopy, theReverse) + RaiseIfFailed("PositionAlongPath", self.TrsfOp) + return anObj + ## Create new object as offset of the given one. # @param theObject The base object for the offset. # @param theOffset Offset value. @@ -2369,6 +2408,20 @@ class geompyDC(GEOM._objref_GEOM_Gen): anObj = self.LocalOp.MakeFilletFacesR1R2(theShape, theR1, theR2, theListShapes) RaiseIfFailed("MakeFilletFacesR1R2", self.LocalOp) return anObj + + ## Perform a fillet on the specified edges/faces of the given shape + # @param theShape - Face Shape to perform fillet on. + # @param theR - Fillet radius. + # @param theListOfVertexes Global indices of vertexes to perform fillet on. + # \note Global index of sub-shape can be obtained, using method geompy.GetSubShapeID(). + # @return New GEOM_Object, containing the result shape. + # + # @ref tui_fillet2d "Example" + def MakeFillet2D(self,theShape, theR, theListOfVertexes): + # Example: see GEOM_TestAll.py + anObj = self.LocalOp.MakeFillet2D(theShape, theR, theListOfVertexes) + RaiseIfFailed("MakeFillet2D", self.LocalOp) + return anObj ## Perform a symmetric chamfer on all edges of the given shape. # @param theShape Shape, to perform chamfer on. diff --git a/src/GroupGUI/GroupGUI_GroupDlg.cxx b/src/GroupGUI/GroupGUI_GroupDlg.cxx index a4867effc..e17b859aa 100644 --- a/src/GroupGUI/GroupGUI_GroupDlg.cxx +++ b/src/GroupGUI/GroupGUI_GroupDlg.cxx @@ -48,7 +48,7 @@ #include #include -enum { ALL_SUBSHAPES = 0, GET_IN_PLACE, SUBSHAPES_OF_SHAPE2 }; +enum { ALL_SUBSHAPES = 0, GET_IN_PLACE, SUBSHAPES_OF_SHAPE2, SUBSHAPES_OF_INVISIBLE_SHAPE2 }; GroupGUI_GroupDlg::GroupGUI_GroupDlg( Mode mode, GeometryGUI* theGeometryGUI, QWidget* parent ) : GEOMBase_Skeleton( theGeometryGUI, parent, false ), @@ -383,7 +383,10 @@ void GroupGUI_GroupDlg::onGetInPlace() setInPlaceObj( aGetInPlaceObj ); } else { - setInPlaceObj( anObj ); + bool isVisible = true; + if ( SALOME_View* view = GEOM_Displayer::GetActiveView() ) + isVisible = view->isVisible( aSelList.First() ); + setInPlaceObj( anObj, isVisible ); } myEditCurrentArgument = 0; //myBusy = true; // just activate but do not select in the list @@ -398,14 +401,16 @@ void GroupGUI_GroupDlg::onGetInPlace() //purpose : temporarily add an object to study and remove old InPlaceObj //======================================================================= -void GroupGUI_GroupDlg::setInPlaceObj( GEOM::GEOM_Object_var theObj ) +void GroupGUI_GroupDlg::setInPlaceObj( GEOM::GEOM_Object_var theObj, const bool isVisible ) { if ( ! myInPlaceObj->_is_equivalent( theObj ) ) { const char* tmpName = "__InPlaceObj__"; // remove old InPlaceObj if ( !myInPlaceObj->_is_nil() ) { - if ( myInPlaceObjSelectWay == GET_IN_PLACE ) { // hide temporary object + if ( myInPlaceObjSelectState == GET_IN_PLACE || + myInPlaceObjSelectState == SUBSHAPES_OF_INVISIBLE_SHAPE2 ) { + // hide temporary object or initially invisible shape 2 (issue 0014047) GEOM_Displayer aDisplayer(getStudy()); aDisplayer.Erase( myInPlaceObj, true ); } @@ -437,7 +442,9 @@ void GroupGUI_GroupDlg::setInPlaceObj( GEOM::GEOM_Object_var theObj ) myMain2InPlaceIndices.Bind( aMainIndex, aPlaceIndex ); } } - myInPlaceObjSelectWay = subSelectionWay(); + myInPlaceObjSelectState = subSelectionWay(); + if ( myInPlaceObjSelectState == SUBSHAPES_OF_SHAPE2 && !isVisible ) + myInPlaceObjSelectState = SUBSHAPES_OF_INVISIBLE_SHAPE2; } //================================================================================= diff --git a/src/GroupGUI/GroupGUI_GroupDlg.h b/src/GroupGUI/GroupGUI_GroupDlg.h index 59da63d49..5edccedcd 100644 --- a/src/GroupGUI/GroupGUI_GroupDlg.h +++ b/src/GroupGUI/GroupGUI_GroupDlg.h @@ -86,7 +86,7 @@ private: void updateState(); void highlightSubShapes(); void onGetInPlace(); - void setInPlaceObj( GEOM::GEOM_Object_var ); + void setInPlaceObj( GEOM::GEOM_Object_var, const bool isVisible=1); private: Mode myMode; @@ -94,7 +94,7 @@ private: GEOM::GEOM_Object_var myMainObj; GEOM::GEOM_Object_var myGroup; GEOM::GEOM_Object_var myInPlaceObj; - int myInPlaceObjSelectWay; + int myInPlaceObjSelectState; TColStd_DataMapOfIntegerInteger myMain2InPlaceIndices; QPushButton* mySelBtn; diff --git a/src/OperationGUI/Makefile.am b/src/OperationGUI/Makefile.am index 8111cc81b..3afc05013 100644 --- a/src/OperationGUI/Makefile.am +++ b/src/OperationGUI/Makefile.am @@ -32,6 +32,7 @@ salomeinclude_HEADERS = \ OperationGUI_ArchimedeDlg.h \ OperationGUI_PartitionDlg.h \ OperationGUI_FilletDlg.h \ + OperationGUI_Fillet2dDlg.h \ OperationGUI_ChamferDlg.h \ OperationGUI_GetShapesOnShapeDlg.h \ OperationGUI_ClippingDlg.h @@ -45,6 +46,7 @@ dist_libOperationGUI_la_SOURCES = \ OperationGUI_PartitionDlg.cxx \ OperationGUI_GetShapesOnShapeDlg.cxx \ OperationGUI_FilletDlg.cxx \ + OperationGUI_Fillet2dDlg.cxx \ OperationGUI_ChamferDlg.cxx \ OperationGUI_ClippingDlg.cxx @@ -53,6 +55,7 @@ MOC_FILES = \ OperationGUI_PartitionDlg_moc.cxx \ OperationGUI_GetShapesOnShapeDlg_moc.cxx\ OperationGUI_FilletDlg_moc.cxx \ + OperationGUI_Fillet2dDlg_moc.cxx \ OperationGUI_ChamferDlg_moc.cxx \ OperationGUI_ClippingDlg_moc.cxx diff --git a/src/OperationGUI/OperationGUI.cxx b/src/OperationGUI/OperationGUI.cxx index 70dd8f444..ebc81748d 100644 --- a/src/OperationGUI/OperationGUI.cxx +++ b/src/OperationGUI/OperationGUI.cxx @@ -38,6 +38,7 @@ #include "OperationGUI_PartitionDlg.h" // Method PARTITION #include "OperationGUI_ArchimedeDlg.h" // Method ARCHIMEDE #include "OperationGUI_FilletDlg.h" // Method FILLET +#include "OperationGUI_Fillet2dDlg.h" // Method FILLET 2D #include "OperationGUI_ChamferDlg.h" // Method CHAMFER #include "OperationGUI_ClippingDlg.h" // Clipping dialog box #include "OperationGUI_GetShapesOnShapeDlg.h" @@ -78,6 +79,7 @@ bool OperationGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent ) case 506: ( new OperationGUI_ChamferDlg ( getGeometryGUI(), parent ) )->show(); break; case 507: ( new OperationGUI_ClippingDlg ( getGeometryGUI(), parent ) )->show(); break; case 508: ( new OperationGUI_GetShapesOnShapeDlg( getGeometryGUI(), parent ) )->show(); break; + case 509: ( new OperationGUI_Fillet2dDlg ( getGeometryGUI(), parent ) )->show(); break; default: app->putInfo( tr( "GEOM_PRP_COMMAND" ).arg( theCommandID ) ); } diff --git a/src/OperationGUI/OperationGUI_Fillet2dDlg.cxx b/src/OperationGUI/OperationGUI_Fillet2dDlg.cxx new file mode 100755 index 000000000..b33cfc3ee --- /dev/null +++ b/src/OperationGUI/OperationGUI_Fillet2dDlg.cxx @@ -0,0 +1,400 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : OperationGUI_Fillet2dDlg.cxx +// Author : DMV, OCN. +// + +#include "OperationGUI_Fillet2dDlg.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +// OCCT Includes +#include +#include + +#include + +//================================================================================= +// class : OperationGUI_Fillet2dDlg() +// purpose : Constructs a OperationGUI_Fillet2dDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +OperationGUI_Fillet2dDlg::OperationGUI_Fillet2dDlg (GeometryGUI* theGeometryGUI, QWidget* parent) + : GEOMBase_Skeleton(theGeometryGUI, parent, false) +{ + SUIT_ResourceMgr* aResMgr = myGeomGUI->getApp()->resourceMgr(); + QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_FILLET_2D"))); + QPixmap iconSelect (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT"))); + + setWindowTitle(tr("GEOM_FILLET_2D_TITLE")); + + /***************************************************************/ + mainFrame()->GroupConstructors->setTitle(tr("GEOM_FILLET_2D")); + mainFrame()->RadioButton1->setIcon(image0); + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->close(); + + GroupVertexes = new DlgRef_2Sel1Spin(centralWidget()); + GroupVertexes->GroupBox1->setTitle(tr("GEOM_FILLET_2D")); + GroupVertexes->TextLabel1->setText(tr("GEOM_PLANAR_FACE")); + GroupVertexes->TextLabel2->setText(tr("GEOM_VERTEXES")); + GroupVertexes->TextLabel3->setText(tr("GEOM_RADIUS")); + GroupVertexes->PushButton1->setIcon(iconSelect); + GroupVertexes->PushButton2->setIcon(iconSelect); + GroupVertexes->LineEdit1->setReadOnly(true); + GroupVertexes->LineEdit2->setReadOnly(true); + + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); + layout->setMargin(0); layout->setSpacing(6); + layout->addWidget(GroupVertexes); + + /***************************************************************/ + + // Set range of spinboxes + double SpecificStep = 10.0; + initSpinBox(GroupVertexes->SpinBox_DX, 0.00001, COORD_MAX, SpecificStep, 5); // VSR: TODO: DBL_DIGITS_DISPLAY + + setHelpFileName("fillet2d_operation_page.html"); + + // Initialisation + Init(); + resize(0,0); +} + +//================================================================================= +// function : ~OperationGUI_Fillet2dDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +OperationGUI_Fillet2dDlg::~OperationGUI_Fillet2dDlg() +{ +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void OperationGUI_Fillet2dDlg::Init() +{ + // Set Initial values of spinboxes + GroupVertexes->SpinBox_DX->setValue(5); + + // Clear line edits + GroupVertexes->LineEdit1->setText(""); + GroupVertexes->LineEdit2->setText(""); + + myShape = GEOM::GEOM_Object::_nil(); + + myVertexes.Clear(); + + // signals and slots connections + + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk() )); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + // connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); + + connect(GroupVertexes->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupVertexes->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupVertexes->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupVertexes->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupVertexes->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + initName(tr("GEOM_FILLET_2D")); + GroupVertexes->PushButton1->click(); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void OperationGUI_Fillet2dDlg::ClickOnOk() +{ + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool OperationGUI_Fillet2dDlg::ClickOnApply() +{ + if (!onAccept()) + return false; + + initName(); + // Reset dialog state + GroupVertexes->LineEdit1->setText(""); + GroupVertexes->LineEdit2->setText(""); + myShape = GEOM::GEOM_Object::_nil(); + myVertexes.Clear(); + GroupVertexes->PushButton1->click(); + + return true; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection is changed or on dialog initialization or activation +//================================================================================= +void OperationGUI_Fillet2dDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + // If selection of main object is activated + if (myEditCurrentArgument == GroupVertexes->LineEdit1) { + myShape = GEOM::GEOM_Object::_nil(); + if (aSelList.Extent() == 1) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aResult); + + if (aResult && !anObj->_is_nil()) { + QString aName = GEOMBase::GetName( anObj ); + TopoDS_Shape aShape; + if ( GEOMBase::GetShape( anObj, aShape, TopAbs_SHAPE ) && !aShape.IsNull() ) { + TColStd_IndexedMapOfInteger aMap; + aSelMgr->GetIndexes(aSelList.First(), aMap); + if ( aMap.Extent() == 1 ) { // Local Selection + int anIndex = aMap( 1 ); + aName += QString( ":face_%1" ).arg( anIndex ); + + //Find SubShape Object in Father + GEOM::GEOM_Object_var aFindedObject = GEOMBase_Helper::findObjectInFather( anObj, aName ); + + if ( aFindedObject == GEOM::GEOM_Object::_nil() ) { // Object not found in study + GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() ); + anObj = aShapesOp->GetSubShape( anObj, anIndex ); + } + else + anObj = aFindedObject; // get Object from study + } + else { // Global Selection + if ( aShape.ShapeType() != TopAbs_FACE ) { + anObj = GEOM::GEOM_Object::_nil(); + aName = ""; + } + } + } + myShape = anObj; + myEditCurrentArgument->setText(aName +); + displayPreview(); + } + } + } else if (myEditCurrentArgument == GroupVertexes->LineEdit2) { + myVertexes.Clear(); + if (aSelList.Extent() == 1) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aResult); + + if (aResult && !anObj->_is_nil()) { + TColStd_IndexedMapOfInteger anIndexes; + aSelMgr->GetIndexes(aSelList.First(), anIndexes); + + if (anIndexes.Extent() > 0) { + QString aName; + if (anIndexes.Extent() == 1) { + int anIndex = anIndexes(1); + aName = QString(GEOMBase::GetName(anObj)) + QString(":vertex_%1").arg(anIndex); + } + else + aName = tr("GEOM_MEN_POPUP_NAME").arg(anIndexes.Extent()); + + myEditCurrentArgument->setText(aName); + myVertexes = anIndexes; + displayPreview(); + } + } + } + } + + if (myEditCurrentArgument == GroupVertexes->LineEdit1) { + if (!myShape->_is_nil() && myVertexes.Extent() == 0) + GroupVertexes->PushButton2->click(); + } +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void OperationGUI_Fillet2dDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if (send == GroupVertexes->PushButton1) { + myEditCurrentArgument = GroupVertexes->LineEdit1; + GroupVertexes->PushButton2->setDown(false); + GroupVertexes->LineEdit2->setEnabled(false); + } + else if (send == GroupVertexes->PushButton2) { + myEditCurrentArgument = GroupVertexes->LineEdit2; + GroupVertexes->PushButton1->setDown(false); + GroupVertexes->LineEdit1->setEnabled(false); + } + + // enable line edit + myEditCurrentArgument->setEnabled(true); + myEditCurrentArgument->setFocus(); + // after setFocus(), because it will be setDown(false) when loses focus + send->setDown(true); + + activateSelection(); + + // seems we need it only to avoid preview disappearing, caused by selection mode change + displayPreview(); +} + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void OperationGUI_Fillet2dDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + + if (send == GroupVertexes->LineEdit1) + myEditCurrentArgument = GroupVertexes->LineEdit1; + else if (send == GroupVertexes->LineEdit2) + myEditCurrentArgument = GroupVertexes->LineEdit2; + else + return; + + GEOMBase_Skeleton::LineEditReturnPressed(); +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void OperationGUI_Fillet2dDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void OperationGUI_Fillet2dDlg::enterEvent (QEvent*) +{ + if (!mainFrame()->GroupConstructors->isEnabled()) + this->ActivateThisDialog(); +} + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void OperationGUI_Fillet2dDlg::ValueChangedInSpinBox (double) +{ + displayPreview(); +} + +//================================================================================= +// function : activateSelection +// purpose : Activate selection in accordance with myEditCurrentArgument +//================================================================================= +void OperationGUI_Fillet2dDlg::activateSelection() +{ + disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); + globalSelection(); + if (myEditCurrentArgument == GroupVertexes->LineEdit1) + globalSelection( GEOM_FACE ); // localSelection(myShape, TopAbs_FACE); + else if (!myShape->_is_nil() && myEditCurrentArgument == GroupVertexes->LineEdit2) + localSelection(myShape, TopAbs_VERTEX); + + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr OperationGUI_Fillet2dDlg::createOperation() +{ + return getGeomEngine()->GetILocalOperations(getStudyId()); +} + +//================================================================================= +// function : isValid() +// purpose : Verify validity of input data +//================================================================================= +bool OperationGUI_Fillet2dDlg::isValid (QString&) +{ + return !myShape->_is_nil() && myVertexes.Extent() > 0; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool OperationGUI_Fillet2dDlg::execute (ObjectList& objects) +{ + GEOM::GEOM_Object_var anObj; + + GEOM::ListOfLong_var aListOfIndexes = new GEOM::ListOfLong; + aListOfIndexes->length(myVertexes.Extent()); + + for (int i = 1, n = myVertexes.Extent(); i <= n; i++) + aListOfIndexes[ i - 1 ] = myVertexes(i); + + anObj = GEOM::GEOM_ILocalOperations::_narrow(getOperation())-> + MakeFillet2D(myShape, getRadius(), aListOfIndexes); + + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); + + return true; +} + +//================================================================================= +// function : getRadius +// purpose : Get radius +//================================================================================= +double OperationGUI_Fillet2dDlg::getRadius() const +{ + return GroupVertexes ->SpinBox_DX->value(); +} diff --git a/src/OperationGUI/OperationGUI_Fillet2dDlg.h b/src/OperationGUI/OperationGUI_Fillet2dDlg.h new file mode 100755 index 000000000..523dbad04 --- /dev/null +++ b/src/OperationGUI/OperationGUI_Fillet2dDlg.h @@ -0,0 +1,75 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : OperationGUI_Fillet2dDlg.h +// Author : DMV, OCN +// + +#ifndef OPERATIONGUI_FILLET2DDLG_H +#define OPERATIONGUI_FILLET2DDLG_H + +#include + +#include + +class DlgRef_2Sel1Spin; + +//================================================================================= +// class : OperationGUI_Fillet2dDlg +// purpose : +//================================================================================= +class OperationGUI_Fillet2dDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + OperationGUI_Fillet2dDlg( GeometryGUI*, QWidget* ); + ~OperationGUI_Fillet2dDlg(); + +protected: + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid( QString& ); + virtual bool execute( ObjectList& ); + +private slots: + void ClickOnOk(); + bool ClickOnApply(); + void ActivateThisDialog(); + void LineEditReturnPressed(); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); + void ValueChangedInSpinBox( double ); + +private: + void Init(); + void enterEvent( QEvent* ); + void activateSelection(); + double getRadius() const; + +private: + GEOM::GEOM_Object_var myShape; + TColStd_IndexedMapOfInteger myVertexes; + + DlgRef_2Sel1Spin* GroupVertexes; +}; + +#endif // OPERATIONGUI_FILLET2DDLG_H diff --git a/src/TransformationGUI/TransformationGUI_PositionDlg.cxx b/src/TransformationGUI/TransformationGUI_PositionDlg.cxx index fd8452404..bbbd6b6be 100644 --- a/src/TransformationGUI/TransformationGUI_PositionDlg.cxx +++ b/src/TransformationGUI/TransformationGUI_PositionDlg.cxx @@ -33,6 +33,7 @@ #include #include #include +#include // OCCT Includes #include @@ -54,6 +55,7 @@ TransformationGUI_PositionDlg::TransformationGUI_PositionDlg SUIT_ResourceMgr* aResMgr = myGeomGUI->getApp()->resourceMgr(); QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POSITION"))); QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POSITION2"))); + QPixmap image2 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POSITION3"))); QPixmap imageselect (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT"))); setWindowTitle(tr("GEOM_POSITION_TITLE")); @@ -62,24 +64,22 @@ TransformationGUI_PositionDlg::TransformationGUI_PositionDlg mainFrame()->GroupConstructors->setTitle(tr("GEOM_POSITION")); mainFrame()->RadioButton1->setIcon(image0); mainFrame()->RadioButton2->setIcon(image1); - mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); - mainFrame()->RadioButton3->close(); - - Group1 = new DlgRef_3Sel3Spin1Check(centralWidget()); - Group1->SpinBox1->hide(); - Group1->SpinBox2->hide(); - Group1->SpinBox3->hide(); - Group1->TextLabel4->hide(); - Group1->TextLabel5->hide(); - Group1->TextLabel6->hide(); + mainFrame()->RadioButton3->setIcon(image2); + + Group1 = new DlgRef_4Sel1Spin3Check(centralWidget()); Group1->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); Group1->TextLabel1->setText(tr("GEOM_OBJECTS")); Group1->TextLabel2->setText(tr("GEOM_START_LCS")); - Group1->TextLabel3->setText(tr("GEOM_END_LCS")); + Group1->TextLabel3->setText(tr("GEOM_DISTANCE")); + Group1->TextLabel4->setText(tr("GEOM_END_LCS")); + Group1->TextLabel5->setText(tr("GEOM_PATH_OBJECT")); Group1->PushButton1->setIcon(imageselect); Group1->PushButton2->setIcon(imageselect); - Group1->PushButton3->setIcon(imageselect); - Group1->CheckBox1->setText(tr("GEOM_CREATE_COPY")); + Group1->PushButton4->setIcon(imageselect); + Group1->PushButton5->setIcon(imageselect); + Group1->CheckButton1->setText(tr("GEOM_CREATE_COPY")); + Group1->CheckButton2->setText(tr("SELECT_UNPUBLISHED_EDGES")); + Group1->CheckButton3->setText(tr("GEOM_REVERSE_DIRECTION")); QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); @@ -89,7 +89,8 @@ TransformationGUI_PositionDlg::TransformationGUI_PositionDlg setHelpFileName("modify_location_operation_page.html"); // Activate Create a Copy mode - Group1->CheckBox1->setChecked(true); + Group1->CheckButton1->setChecked(true); + Group1->CheckButton1->setChecked(false); CreateCopyModeChanged(true); Init(); @@ -113,11 +114,18 @@ void TransformationGUI_PositionDlg::Init() // init variables Group1->LineEdit1->setReadOnly(true); Group1->LineEdit2->setReadOnly(true); - Group1->LineEdit3->setReadOnly(true); + Group1->LineEdit4->setReadOnly(true); + Group1->LineEdit5->setReadOnly(true); Group1->LineEdit1->setText(""); Group1->LineEdit2->setText(""); - Group1->LineEdit3->setText(""); + Group1->LineEdit4->setText(""); + Group1->LineEdit5->setText(""); + + initSpinBox(Group1->SpinBox_DX, 0, 1, 0.05, 6); // VSR:TODO : DBL_DIGITS_DISPLAY + Group1->SpinBox_DX->setValue(0); + + Group1->CheckButton2->setEnabled(false); myStartLCS = myEndLCS = GEOM::GEOM_Object::_nil(); @@ -131,13 +139,19 @@ void TransformationGUI_PositionDlg::Init() connect(Group1->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(Group1->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(Group1->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group1->PushButton4, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group1->PushButton5, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(Group1->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); connect(Group1->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); - connect(Group1->LineEdit3, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group1->LineEdit4, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group1->LineEdit5, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); - connect(Group1->CheckBox1, SIGNAL(toggled(bool)), this, SLOT(CreateCopyModeChanged(bool))); + connect(Group1->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(CreateCopyModeChanged(bool))); + connect(Group1->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + + connect(Group1->CheckButton2, SIGNAL(toggled(bool)), this, SLOT(SelectionTypeButtonClicked())); + connect(Group1->CheckButton3, SIGNAL(toggled(bool)), this, SLOT(ValueChangedInSpinBox())); initName(tr("GEOM_POSITION")); @@ -153,9 +167,11 @@ void TransformationGUI_PositionDlg::ConstructorsClicked (int constructorId) disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); Group1->LineEdit2->clear(); - Group1->LineEdit3->clear(); + Group1->LineEdit4->clear(); + Group1->LineEdit5->clear(); myStartLCS = GEOM::GEOM_Object::_nil(); myEndLCS = GEOM::GEOM_Object::_nil(); + myPath = GEOM::GEOM_Object::_nil(); switch (constructorId) { case 0: @@ -164,7 +180,21 @@ void TransformationGUI_PositionDlg::ConstructorsClicked (int constructorId) Group1->TextLabel2->hide(); Group1->PushButton2->hide(); + Group1->LineEdit5->hide(); + Group1->TextLabel5->hide(); + Group1->PushButton5->hide(); + + Group1->SpinBox_DX->hide(); + Group1->TextLabel3->hide(); + + Group1->LineEdit4->show(); + Group1->TextLabel4->show(); + Group1->PushButton4->show(); + Group1->PushButton1->click(); + + Group1->CheckButton2->hide(); + Group1->CheckButton3->hide(); } break; case 1: @@ -173,7 +203,40 @@ void TransformationGUI_PositionDlg::ConstructorsClicked (int constructorId) Group1->TextLabel2->show(); Group1->PushButton2->show(); + Group1->LineEdit5->hide(); + Group1->TextLabel5->hide(); + Group1->PushButton5->hide(); + + Group1->SpinBox_DX->hide(); + Group1->TextLabel3->hide(); + + Group1->PushButton1->click(); + + Group1->CheckButton2->hide(); + Group1->CheckButton3->hide(); + } + break; + case 2: + { + Group1->LineEdit4->hide(); + Group1->TextLabel4->hide(); + Group1->PushButton4->hide(); + + Group1->LineEdit2->hide(); + Group1->TextLabel2->hide(); + Group1->PushButton2->hide(); + + Group1->LineEdit5->show(); + Group1->TextLabel5->show(); + Group1->PushButton5->show(); + + Group1->SpinBox_DX->show(); + Group1->TextLabel3->show(); + Group1->PushButton1->click(); + + Group1->CheckButton2->show(); + Group1->CheckButton3->show(); } break; } @@ -191,6 +254,31 @@ void TransformationGUI_PositionDlg::ConstructorsClicked (int constructorId) } } +//================================================================================= +// function : SelectionBittonClicked() +// purpose : Selection type Radio button management +//================================================================================= +void TransformationGUI_PositionDlg::SelectionTypeButtonClicked() +{ + if ( Group1->CheckButton2->isChecked() ) { + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_EDGE ); + } else { + TColStd_MapOfInteger aMap; + aMap.Add(GEOM_WIRE); + aMap.Add(GEOM_LINE); + globalSelection(aMap); + } +} + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void TransformationGUI_PositionDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + //================================================================================= // function : ClickOnOk() // purpose : @@ -207,7 +295,7 @@ void TransformationGUI_PositionDlg::ClickOnOk() //================================================================================= bool TransformationGUI_PositionDlg::ClickOnApply() { - if (!onAccept(Group1->CheckBox1->isChecked())) + if (!onAccept(Group1->CheckButton1->isChecked())) return false; initName(); @@ -229,8 +317,10 @@ void TransformationGUI_PositionDlg::SelectionIntoArgument() myObjects.length(0); else if (myEditCurrentArgument == Group1->LineEdit2) myStartLCS = GEOM::GEOM_Object::_nil(); - else if (myEditCurrentArgument == Group1->LineEdit3) + else if (myEditCurrentArgument == Group1->LineEdit4) myEndLCS = GEOM::GEOM_Object::_nil(); + else if (myEditCurrentArgument == Group1->LineEdit5) + myPath = GEOM::GEOM_Object::_nil(); LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); SALOME_ListIO aSelList; @@ -248,6 +338,9 @@ void TransformationGUI_PositionDlg::SelectionIntoArgument() return; else myEditCurrentArgument->setText(aName); + + if (getConstructorId() == 2) + Group1->PushButton5->click(); } else if (myEditCurrentArgument == Group1->LineEdit2) { if (aSelList.Extent() != 1) @@ -263,9 +356,9 @@ void TransformationGUI_PositionDlg::SelectionIntoArgument() myEditCurrentArgument->setText(aName); if (!myStartLCS->_is_nil() && myEndLCS->_is_nil()) - Group1->PushButton3->click(); + Group1->PushButton4->click(); } - else if (myEditCurrentArgument == Group1->LineEdit3) { + else if (myEditCurrentArgument == Group1->LineEdit4) { myEndLCS = GEOM::GEOM_Object::_nil(); if (aSelList.Extent() != 1) return; @@ -281,6 +374,55 @@ void TransformationGUI_PositionDlg::SelectionIntoArgument() if (!myEndLCS->_is_nil() && !myObjects.length()) Group1->PushButton1->click(); } + else if (myEditCurrentArgument == Group1->LineEdit5) { + myPath = GEOM::GEOM_Object::_nil(); + if (aSelList.Extent() != 1) + return; + + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_ptr aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First(), testResult); + if (!testResult || aSelectedObject->_is_nil()) + return; + + aName = GEOMBase::GetName(myPath); + // Local Selection + TopoDS_Shape S; + if (!GEOMBase::GetShape(aSelectedObject, S)) + return; + + TColStd_IndexedMapOfInteger aMap; + aSelMgr->GetIndexes(aSelList.First(), aMap); + aName = GEOMBase::GetName(aSelectedObject); + if (aMap.Extent() == 1) { + int anIndex = aMap(1); + aName.append(":edge_" + QString::number(anIndex)); + + //Find SubShape Object in Father + GEOM::GEOM_Object_var aFindedObject = GEOMBase_Helper::findObjectInFather(aSelectedObject, aName); + + if (aFindedObject == GEOM::GEOM_Object::_nil()) { // Object not found in study + GEOM::GEOM_IShapesOperations_var aShapesOp = + getGeomEngine()->GetIShapesOperations(getStudyId()); + aSelectedObject = aShapesOp->GetSubShape(aSelectedObject, anIndex); + } + else { // get Object from study + aSelectedObject = aFindedObject; + } + } + else { + if (S.ShapeType() != TopAbs_EDGE && S.ShapeType() != TopAbs_WIRE) { + aSelectedObject = GEOM::GEOM_Object::_nil(); + aName = ""; + return; + } + } + + myEditCurrentArgument->setText(aName); + myPath = aSelectedObject; + + if (!myPath->_is_nil() && !myObjects.length()) + Group1->PushButton1->click(); + } // clear selection disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); @@ -306,9 +448,13 @@ void TransformationGUI_PositionDlg::SetEditCurrentArgument() globalSelection(); Group1->PushButton2->setDown(false); - Group1->PushButton3->setDown(false); + Group1->PushButton4->setDown(false); + Group1->PushButton5->setDown(false); Group1->LineEdit2->setEnabled(false); - Group1->LineEdit3->setEnabled(false); + Group1->LineEdit4->setEnabled(false); + Group1->LineEdit5->setEnabled(false); + + Group1->CheckButton2->setEnabled(false); } else if (send == Group1->PushButton2) { myEditCurrentArgument = Group1->LineEdit2; @@ -319,12 +465,16 @@ void TransformationGUI_PositionDlg::SetEditCurrentArgument() globalSelection(aMap); Group1->PushButton1->setDown(false); - Group1->PushButton3->setDown(false); + Group1->PushButton4->setDown(false); + Group1->PushButton5->setDown(false); Group1->LineEdit1->setEnabled(false); - Group1->LineEdit3->setEnabled(false); + Group1->LineEdit4->setEnabled(false); + Group1->LineEdit5->setEnabled(false); + + Group1->CheckButton2->setEnabled(false); } - else if (send == Group1->PushButton3) { - myEditCurrentArgument = Group1->LineEdit3; + else if (send == Group1->PushButton4) { + myEditCurrentArgument = Group1->LineEdit4; TColStd_MapOfInteger aMap; aMap.Add(GEOM_PLANE); @@ -333,8 +483,33 @@ void TransformationGUI_PositionDlg::SetEditCurrentArgument() Group1->PushButton1->setDown(false); Group1->PushButton2->setDown(false); + Group1->PushButton5->setDown(false); + Group1->LineEdit1->setEnabled(false); + Group1->LineEdit2->setEnabled(false); + Group1->LineEdit5->setEnabled(false); + + Group1->CheckButton2->setEnabled(false); + } + else if (send == Group1->PushButton5) { + myEditCurrentArgument = Group1->LineEdit5; + + Group1->CheckButton2->setEnabled(true); + + if ( Group1->CheckButton2->isChecked() ) { + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_EDGE ); + } else { + TColStd_MapOfInteger aMap; + aMap.Add(GEOM_WIRE); + aMap.Add(GEOM_LINE); + globalSelection(aMap); + } + + Group1->PushButton1->setDown(false); + Group1->PushButton2->setDown(false); + Group1->PushButton4->setDown(false); Group1->LineEdit1->setEnabled(false); Group1->LineEdit2->setEnabled(false); + Group1->LineEdit4->setEnabled(false); } connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); @@ -358,10 +533,16 @@ void TransformationGUI_PositionDlg::LineEditReturnPressed() QLineEdit* send = (QLineEdit*)sender(); if (send == Group1->LineEdit1 || send == Group1->LineEdit2 || - send == Group1->LineEdit3) { + send == Group1->LineEdit4 || + send == Group1->LineEdit5 ) { myEditCurrentArgument = send; GEOMBase_Skeleton::LineEditReturnPressed(); } + + if (send == Group1->LineEdit5) + Group1->CheckButton2->setEnabled(true); + else + Group1->CheckButton2->setEnabled(false); } //================================================================================= @@ -374,6 +555,9 @@ void TransformationGUI_PositionDlg::ActivateThisDialog() connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), + this, SLOT( SelectionIntoArgument() ) ); + ConstructorsClicked( getConstructorId() ); } @@ -405,8 +589,10 @@ bool TransformationGUI_PositionDlg::isValid (QString& /*msg*/) bool res; if (getConstructorId() == 0) res = !(myObjects.length() == 0 || myEndLCS->_is_nil()); - else + else if ( getConstructorId() == 1 ) res = !(myObjects.length() == 0 || myStartLCS->_is_nil() || myEndLCS->_is_nil()); + else if ( getConstructorId() == 2 ) + res = !(myObjects.length() == 0 || myPath->_is_nil()); return res; } @@ -418,7 +604,7 @@ bool TransformationGUI_PositionDlg::isValid (QString& /*msg*/) bool TransformationGUI_PositionDlg::execute (ObjectList& objects) { bool res = false; - bool toCreateCopy = IsPreview() || Group1->CheckBox1->isChecked(); + bool toCreateCopy = IsPreview() || Group1->CheckButton1->isChecked(); GEOM::GEOM_Object_var anObj; switch (getConstructorId()) { @@ -453,6 +639,19 @@ bool TransformationGUI_PositionDlg::execute (ObjectList& objects) res = true; break; } + case 2: + { + double aDistance = Group1->SpinBox_DX->value(); + bool toReverse = Group1->CheckButton3->isChecked(); + for (int i = 0; i < myObjects.length(); i++) { + anObj = GEOM::GEOM_ITransformOperations::_narrow(getOperation())-> + PositionAlongPath(myObjects[i], myPath, aDistance, toCreateCopy, toReverse); + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); + } + res = true; + break; + } } return res; @@ -481,3 +680,16 @@ void TransformationGUI_PositionDlg::CreateCopyModeChanged (bool isCreateCopy) { mainFrame()->GroupBoxName->setEnabled(isCreateCopy); } + +//================================================================================= +// function : addSubshapeToStudy +// purpose : virtual method to add new SubObjects if local selection +//================================================================================= +void TransformationGUI_PositionDlg::addSubshapesToStudy() +{ + QMap objMap; + + objMap[Group1->LineEdit5->text()] = myPath; + + addSubshapesToFather(objMap); +} diff --git a/src/TransformationGUI/TransformationGUI_PositionDlg.h b/src/TransformationGUI/TransformationGUI_PositionDlg.h index 9a75d3ecc..a48959b92 100644 --- a/src/TransformationGUI/TransformationGUI_PositionDlg.h +++ b/src/TransformationGUI/TransformationGUI_PositionDlg.h @@ -28,7 +28,7 @@ #include -class DlgRef_3Sel3Spin1Check; +class DlgRef_4Sel1Spin3Check; //================================================================================= // class : TransformationGUI_PositionDlg @@ -49,6 +49,7 @@ protected: virtual bool isValid( QString& ); virtual bool execute( ObjectList& ); virtual void restoreSubShapes( SALOMEDS::Study_ptr, SALOMEDS::SObject_ptr ); + virtual void addSubshapesToStudy(); private: void Init(); @@ -58,11 +59,12 @@ private: GEOM::GEOM_Object_var myStartLCS; GEOM::GEOM_Object_var myEndLCS; GEOM::ListOfGO myObjects; + GEOM::GEOM_Object_var myPath; // to initialize the first selection field with a selected object on the dialog creation bool myInitial; - - DlgRef_3Sel3Spin1Check* Group1; + + DlgRef_4Sel1Spin3Check* Group1; private slots: void ClickOnOk(); @@ -73,6 +75,8 @@ private slots: void SetEditCurrentArgument(); void ConstructorsClicked( int ); void CreateCopyModeChanged( bool ); + void ValueChangedInSpinBox(); + void SelectionTypeButtonClicked(); }; #endif // TRANSFORMATIONGUI_POSITIONDLG_H -- 2.39.2