From 8180539548a5038e52445454e88c1a170ee64e56 Mon Sep 17 00:00:00 2001 From: vsr Date: Mon, 8 Oct 2012 11:16:36 +0000 Subject: [PATCH] Merge from V6_main (04/10/2012) --- doc/salome/gui/GEOM/doxyfile_py.in | 4 +- doc/salome/gui/GEOM/images/3dsketch2.png | Bin 23548 -> 30461 bytes doc/salome/gui/GEOM/images/bool1.png | Bin 12304 -> 24196 bytes doc/salome/gui/GEOM/images/bool2.png | Bin 12532 -> 24845 bytes doc/salome/gui/GEOM/images/bool3.png | Bin 12393 -> 24399 bytes .../GEOM/images/divided_disk_PntVecR_dlg.png | Bin 23619 -> 27330 bytes .../gui/GEOM/images/divided_disk_dlg.png | Bin 22648 -> 25802 bytes .../gui/GEOM/images/dividedcylinder_dlg.png | Bin 21866 -> 24985 bytes doc/salome/gui/GEOM/images/groups_cut_dlg.png | Bin 0 -> 18001 bytes .../gui/GEOM/images/groups_intersect_dlg.png | Bin 0 -> 15774 bytes .../gui/GEOM/images/groups_union_dlg.png | Bin 0 -> 14922 bytes doc/salome/gui/GEOM/images/measures2.png | Bin 0 -> 21135 bytes doc/salome/gui/GEOM/images/neo-section.png | Bin 12571 -> 25213 bytes doc/salome/gui/GEOM/images/ob_popup_menu.png | Bin 15017 -> 35819 bytes doc/salome/gui/GEOM/images/partition1.png | Bin 15841 -> 33038 bytes doc/salome/gui/GEOM/images/partition2.png | Bin 13868 -> 26366 bytes .../gui/GEOM/input/creating_3dsketcher.doc | 49 +- .../GEOM/input/creating_dividedcylinder.doc | 10 +- .../gui/GEOM/input/creating_divideddisk.doc | 19 +- doc/salome/gui/GEOM/input/creating_point.doc | 2 +- doc/salome/gui/GEOM/input/get_non_blocks.doc | 23 + doc/salome/gui/GEOM/input/tui_3dsketcher.doc | 35 +- .../gui/GEOM/input/tui_basic_geom_objs.doc | 2 + .../gui/GEOM/input/tui_get_non_blocks.doc | 32 + .../gui/GEOM/input/tui_measurement_tools.doc | 1 + doc/salome/gui/GEOM/input/tui_test_all.doc | 3 + doc/salome/gui/GEOM/input/tui_test_others.doc | 3 + .../gui/GEOM/input/tui_test_spanner.doc | 5 + .../GEOM/input/tui_working_with_groups.doc | 110 +- .../GEOM/input/using_measurement_tools.doc | 3 +- .../gui/GEOM/input/viewing_geom_obj.doc | 9 +- .../gui/GEOM/input/working_with_groups.doc | 107 +- idl/GEOM_Gen.idl | 160 ++- resources/Makefile.am | 1 + resources/SalomeApp.xml.in | 2 +- resources/get_non_blocks.png | Bin 0 -> 1004 bytes src/BooleanGUI/BooleanGUI_Dialog.cxx | 9 + src/DisplayGUI/DisplayGUI.cxx | 63 +- src/DisplayGUI/DisplayGUI.h | 5 +- src/EntityGUI/EntityGUI_3DSketcherDlg.cxx | 1176 ++++++++++------- src/EntityGUI/EntityGUI_3DSketcherDlg.h | 15 +- src/EntityGUI/EntityGUI_Controls_QTD.ui | 125 +- src/EntityGUI/EntityGUI_SketcherDlg.cxx | 51 +- src/GEOM/GEOM_Engine.cxx | 106 +- src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cxx | 8 +- src/GEOMGUI/GEOMGUI_Selection.cxx | 33 +- src/GEOMGUI/GEOMGUI_Selection.h | 8 +- src/GEOMGUI/GEOM_Displayer.cxx | 113 +- src/GEOMGUI/GEOM_Displayer.h | 1 + src/GEOMGUI/GEOM_images.ts | 20 + src/GEOMGUI/GEOM_msg_en.ts | 151 ++- src/GEOMGUI/GeometryGUI.cxx | 86 +- src/GEOMGUI/GeometryGUI_Operations.h | 47 +- src/GEOMGUI/GeometryGUI_Swig.i | 72 - src/GEOMGUI/Makefile.am | 5 +- src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx | 250 +++- src/GEOMImpl/GEOMImpl_BlockDriver.cxx | 3 +- src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx | 19 +- src/GEOMImpl/GEOMImpl_I3DSketcher.hxx | 25 +- src/GEOMImpl/GEOMImpl_IBasicOperations.cxx | 38 +- src/GEOMImpl/GEOMImpl_IBasicOperations.hxx | 6 +- src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx | 155 ++- src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx | 13 +- src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx | 142 +- src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx | 12 +- src/GEOMImpl/GEOMImpl_IGroupOperations.cxx | 754 ++++++++++- src/GEOMImpl/GEOMImpl_IGroupOperations.hxx | 17 +- src/GEOMImpl/GEOMImpl_IInsertOperations.cxx | 89 +- src/GEOMImpl/GEOMImpl_IInsertOperations.hxx | 7 +- src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx | 77 +- src/GEOMImpl/GEOMImpl_ImportDriver.cxx | 61 +- src/GEOMImpl/GEOMImpl_ImportDriver.hxx | 10 +- src/GEOMImpl/GEOMImpl_PipeDriver.cxx | 9 +- src/GEOMImpl/GEOMImpl_PointDriver.cxx | 39 +- src/GEOMImpl/GEOMImpl_ShapeDriver.cxx | 27 +- src/GEOMImpl/GEOMImpl_Types.hxx | 9 +- src/GEOMToolsGUI/GEOMToolsGUI.cxx | 46 +- src/GEOMToolsGUI/GEOMToolsGUI.h | 22 +- src/GEOMToolsGUI/GEOMToolsGUI_1.cxx | 372 ++++-- src/GEOM_I/GEOM_IBasicOperations_i.cc | 24 +- src/GEOM_I/GEOM_IBasicOperations_i.hh | 3 +- src/GEOM_I/GEOM_IBlocksOperations_i.cc | 34 +- src/GEOM_I/GEOM_IBlocksOperations_i.hh | 4 +- src/GEOM_I/GEOM_ICurvesOperations_i.cc | 95 +- src/GEOM_I/GEOM_ICurvesOperations_i.hh | 61 +- src/GEOM_I/GEOM_IGroupOperations_i.cc | 173 ++- src/GEOM_I/GEOM_IGroupOperations_i.hh | 19 +- src/GEOM_I/GEOM_IInsertOperations_i.cc | 74 +- src/GEOM_I/GEOM_IInsertOperations_i.hh | 7 +- src/GEOM_SWIG/GEOM_Spanner.py | 10 +- src/GEOM_SWIG/GEOM_TestAll.py | 21 +- src/GEOM_SWIG/GEOM_TestOthers.py | 47 + src/GEOM_SWIG/Makefile.am | 1 + src/GEOM_SWIG/geompy.py | 27 +- src/GEOM_SWIG/geompyDC.py | 313 ++++- src/GEOM_SWIG/gsketcher.py | 182 +++ src/GEOM_SWIG_WITHIHM/Makefile.am | 31 +- .../libGEOM_Swig.cxx} | 101 +- .../libGEOM_Swig.h} | 4 +- src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i | 48 +- src/GroupGUI/GroupGUI.cxx | 59 +- src/GroupGUI/GroupGUI_BooleanDlg.cxx | 320 +++++ src/GroupGUI/GroupGUI_BooleanDlg.h | 76 ++ src/GroupGUI/Makefile.am | 12 +- src/IGESImport/IGESImport.cxx | 75 +- src/MeasureGUI/Makefile.am | 4 +- src/MeasureGUI/MeasureGUI.cxx | 5 +- src/MeasureGUI/MeasureGUI_BndBoxDlg.cxx | 127 +- src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx | 2 +- .../MeasureGUI_CheckSelfIntersectionsDlg.cxx | 10 +- src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx | 277 ++++ src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h | 69 + src/OBJECT/GEOM_AISShape.cxx | 2 +- src/OBJECT/GEOM_TopWireframeShape.cxx | 2 +- src/OBJECT/GEOM_TopWireframeShape.hxx | 2 +- .../OperationGUI_PartitionDlg.cxx | 8 + src/STEPImport/STEPImport.cxx | 146 +- 117 files changed, 5842 insertions(+), 1509 deletions(-) create mode 100644 doc/salome/gui/GEOM/images/groups_cut_dlg.png create mode 100644 doc/salome/gui/GEOM/images/groups_intersect_dlg.png create mode 100644 doc/salome/gui/GEOM/images/groups_union_dlg.png create mode 100644 doc/salome/gui/GEOM/images/measures2.png create mode 100644 doc/salome/gui/GEOM/input/get_non_blocks.doc create mode 100644 doc/salome/gui/GEOM/input/tui_get_non_blocks.doc create mode 100644 resources/get_non_blocks.png delete mode 100644 src/GEOMGUI/GeometryGUI_Swig.i create mode 100644 src/GEOM_SWIG/gsketcher.py rename src/{GEOMGUI/GeometryGUI_Swig.cxx => GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx} (87%) rename src/{GEOMGUI/GeometryGUI_Swig.hxx => GEOM_SWIG_WITHIHM/libGEOM_Swig.h} (95%) create mode 100644 src/GroupGUI/GroupGUI_BooleanDlg.cxx create mode 100644 src/GroupGUI/GroupGUI_BooleanDlg.h create mode 100644 src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx create mode 100644 src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h diff --git a/doc/salome/gui/GEOM/doxyfile_py.in b/doc/salome/gui/GEOM/doxyfile_py.in index c35ee2024..bd50daa50 100755 --- a/doc/salome/gui/GEOM/doxyfile_py.in +++ b/doc/salome/gui/GEOM/doxyfile_py.in @@ -99,8 +99,8 @@ EXAMPLE_RECURSIVE = NO #--------------------------------------------------------------------------- #Input related options #--------------------------------------------------------------------------- -INPUT = . @top_srcdir@/idl -FILE_PATTERNS = geompy.py GEOM_Gen.idl +INPUT = geompy.py @top_srcdir@/src/GEOM_SWIG/gsketcher.py @top_srcdir@/idl/GEOM_Gen.idl +FILE_PATTERNS = IMAGE_PATH = @srcdir@/images EXAMPLE_PATH = @top_srcdir@/src/GEOM_SWIG RECURSIVE = NO diff --git a/doc/salome/gui/GEOM/images/3dsketch2.png b/doc/salome/gui/GEOM/images/3dsketch2.png index 51f171d9f16d5d32fba0322c9e4c496c4f28f7a7..1925ecfd833e23971b95dc5315e1435cabecde15 100755 GIT binary patch literal 30461 zcmbTe1yEdHnLg{ z0WDAyEu~D)EmF4Cl;?l(zWv!Z0-RQ4@ov&)J{bc<5~9FwN8T65TdOsm2VT%y5;r&E zTDigro7<$VFmP!EzNnmE=R5hxZ!UNK78H4aC$QhK8HO5)`Uc^J)%;rs#8lMQ_ZR;k zn_X)NgrDmhv9Is*DHB)-v#=MmbEQg6B4+3P!XGq&=Y)Gq-i$GW+kU7wt5>HHCnzU{ zURyW&_`zR-2a|(;59NwTk+CvNjmklL43|QP?8MdELNZqh=dgX{uEJ;yal*y4G#BF% zbuV=##Eq1hz7I|O`Elb^xl=q~D0lrlJ&CHuy?}zeL}iA+{C08>riqEM)LgHmTlw(* z)Xq*_P;#a^lQ%NZ?UJdqa&%-Q{jG22?l0yw5e1^!CRPAoTTjyuJwdAVt(eX#wyw9I~S!F2Y#}sVW$Py_gCr5N}wYmHxeuF2e8}1DW8iL>9 zZTp8go`ULIDM5oEmnu&auPV6xMDYt;ZDTv}j#8fz1q$D0sEwDfzKlvnyxZaBj`Hh| zJKQ2!sQQ7}LD1S?PCUz1Y4JFrOkDSxtI`vuzmEblEGwAp5HnJmBQCehj3PVD#X4Ce zd7`RyN_n^UvldbbcJ@kebCn#g+Q)XV)Aj`GID^fgm+x4Ay5RSkmMs|T88Wh#&wf*c zed9~=^aDrRp8JOB&RjS{x-qkWUx*Z*^3CKnL!a%q9QgqmzesO&&MC!Pc<-4g+k-W1 zLE^p)a%-(C54I4Idc4Qk)bN5HIL+#PQ`DV9%*IU+A=VpuvZhR}|i@E*|M@ z%lwbt@pbxH*Sg7S`So)&0aF8C{Mzw>$6_L1^x`^+hv}gX$5c@aVi=@AH3d1X%h?Ad zvzK#oT0VDn0d5#FW*mpzJ^ksU?zIDm2wQ_AMhlG|K59$wN!foZ>&Id~kfX{Mrx}=h zHr!t|J6N~QE@&&DH5K{uLkI!frkc(_^$Pz;j2s>(ren8S3k^FwJ#4 z{|$TYj5o-z_dpQD0!OH-8vDZ`1_?fnTr;gs334w0Mb`XS&L7H$PSBmtNiZ^<`ysJb3exXT-vV1d;5PXqVqKYlgL_ zyG!;Rc;9bnUS!)L_8WOj73A;=n2v1>B+O{TbkTO%ater1lkHeg!MVqU;_54F_Ho&h zbb6%zaCtm9XQ3O^$tRj6@b$lPto1&9w%FS)k$vSWUqwyky)(Y(kC z4Q1DRz&WMx?b7`D&A{z9|6VW6Y^ld(S^JGZ!Phh%vW(*{B#(2A3_?Aflpkd#u-GO_ z-p{7{Ps({5lNHqn@K%?>5t6*o3keZ&NJ~pGMASwr$=$wS5!5NEzRuX*Z(h8Eb^AX3xz?mTItC@rEArYHV{ZcZ)eqZrreOz%@E}?&Mo`*n0#D=6tc&Jgf{} zdR+{YEFZq$pqMUAPR8b_HZ{n{D1IHOfHtPSj;B+TBC9TrM@XLj;{Baj&Cyp*+RDmJ zILix~_WYqhH9}2FNi~`XK}TC$xEq7eHy}SfRu)rAdVA#-Sv!$odSGg*duj@vaGc`J zK9?;AgCCXEZ<9-#36;+J3tTOFAL}8V2bHP?-urqY--yUJ78Vv|4nODT!%ciPv-(sM zXM?ZqKYxWzPQs@RXjUmt3{!i!+x5NnyhY)Mr_rv`-yGyI-Uv;sx>wfJCi5coEea0) z$;s?IR{_&(W9wMa?7l47oW|E}otjOCL>LttYoa&bT$jIBWaV=B4OQd!=a%ERvF~tU z9B!VQ!!0^g#G-yO*~8d#LGM){&G3nNwxlP9bssdVV~qdhzA99hUhcgkIz!Fonnl$-Mn-f&w zrLP|md25=e;|)(37?&!?P&S{;b$L_sB2n|2$al-pUAaTDHm9a4rlcTaq|!n)Ws3iR zkcWp=VCy*2MCQJ8C*GaNm*U+|H8p_%;n5Wt>x{LZ_<@aYx!cKZhG5{+X6pP`?eZqy zKouy;4*S`X$>*gS_Lmr2C-jDA4P?{w*+VXjD;ScpJq;3RWG2k!t5QP+d9ld74m?kw zFV#7s2dp*<3hf+N@tIaW=oVOzkhqMkF^2v`%`YlYWc&gKMoNT1z~{~>r=r35^W#DB zpm77-LZxQyCLM1i0b-jG^cY?1YYV;Bat1pL!#ABb-Y>$S*nIT~U4OeOx^||WGd?4l zxgiL|eOu=ugoD9=7lKdIGf)l0dgqJ!{S%#gcsGOlxkj2Cs=pq)%xkReZ>SRDwTklc z#Vr$&Ug(z8NKm~RwK=A9JDHBbsbtMqb2BrZhRf>cdH%ANaAHw%*%a4{y*wyuvIU8) zubk2Qp)YL@8?)*@_fElIyw)j{3ur1Zv$cFDFP(2K4Xd$=a!W%@avBCjje7= zen4!?Q~IfPmkmQCpJ9g~x##38M&dgcL_*UzZ1d$j>{P&K22+$*C{2#t9sB*MDR{Fbh+I&x&_k@wh z+K;_@?wA=is-2aal`7bEN2C@;{yr0Z9V66i%?RQojeAn40_xM#Ln%DvcJAkCzwkHx z?1L>oxS!KAjOG_?4kTC0Ep{t>FCy18oNj3G6P}xkWeEw zbQY&5{1_=R0NrnPo0Mi4t??wbxTDC~pRJNgV0@dio8U6Sz%YJeeBfP`%`1?b9aEAq zpmlm`o+3we;K?dLu{={QZlFC;e7`NS;ze0(vN&csE$gGWxF;fSi~ap(gGD0TBRr|` zmzhD@`tovAs_eE7WycI4w5P@RQQH$FnOnh ztDXiyAxWY`vzkUimjH@>ZOD!DsC5k2)SJ+s!=iueKqKw9DyKMk#ayuAlw2KAnlhPc z2r?zT8aZhCYklOgR&W zLEfI%B7=PmqHQo*o^b3xJ0j*VUU*z~Jb0XJz8dopgiq#$auB8dXl|wxpx{2ixO^5_ zOxolcf9X195(;y}1y0BrvVY_#H9yOA8oj~vH&D{r7^-$x8zP>tYTPlMr#Ji!jrBm$ zGg!^&FU+0a?ajx;D2b0k=fUBfaylZI%-@+=%#fkgtg84?`BG9)RQ$LQw>XdRU~fuz zoI*lcQn$gBA!Lw9b*AFf=C9j)DKYus57-1QPEOO`x_f-6w{1z{qbm}uDsIO?lVzHv z|1l_z&ci<8C0mhFHjD?;4hvj6O;`-qRP?k=U6|GzGlOrGudrF!EljX ziWoh)-+z*_C@smMtf);yCL|S8Wj49sb?Y-Yu}0vFe76{Dh=bV1GUcAF?apz5G&*Xw z!6f^UE$khJ;e=A`PwW>`F)FdvUUM&{4CyN~g}-$@X6D#^Y*A&x*Y5L-lT%g~%hJd7 zI{ov@cKQbQyY<{j15=l3FD;SepArw-ODUbf#v4vr{}Dt)4|b1W7S>8(v51tL!^pF~ zbEo&EYicxWQCJsi-`A8s_!~NBs~hK zf*jAJirkTF9CoL;*s5N1XqMA_=;(ULyqr|56BTZj8&}#G+2E}dObf-c?j6aPoD8DX z`dCoteI72tqdfzLp$blA@O{cdb#9M)Vp^7gka`(eUQ_Y*57uXpB?I!+vp{1XTpFc+ zJ|@ym=nJo(K%?h(%|-rh-u8(<&l}FMg(DndDH95-u>cPDo6LR&N!G#fdR0j}nZ4-HIAF2;9uva9 zIaYf}@hPiy6YUv<(p)>(vp;Jgqtzpe8Uk@dh#K!tsycvyKq~0i1;kWURfB}bCch5Z zz(6=Ff9~AO_;=>#=d-D11^o<)0w+K|;3c2$`2Vy`L4!cnJ~2LreBl-ofk1w}?16_s zP6)7`LHO}Vh#`>f?}o4th}*AVpa{rXUE)iMi_5F#Irq)aHx|`HAXk{^6@{_^ezuLm4GRd)Ey+%N&(JGFQFPlB8lCicv@I8JT5fM2f%fiIO1TPBVgi($x z{r!8mwUy}Dc*P$HM?ykEh)5okbqs2?rO`=Ja&i-;BMS5&;VcCf78Y%7?dIg`qUdPl zF(NE1tmcOsi;WB^#I`!e?UVb<#oO!Kk!?rNkXuZ}+3fA@JA?5eo%y8YzhCBO`}+C4 z@Fj+PNRjA?i-^#-u?a)9-&=KET6$(+U=S|mcs0E2_ZnkCs-fpIJw0Om;}R(Mb#*sF z{efnRIUjhO$2&Vks>BQoRxcO59_L*ag+)abDWZad5!2+l4H>Zz;rs;j7~^TSd$@3# zRaw+wKYgCkWUH;HuKod@gn{Du40B|UA!Gc;#>RZT3;AlWNXGfr$anD47NQvp_}Igy zN9&dLKo93by{4kFvaMecG$s#|Z2N4q! z@!Yu8)YcUtYKm{nSLBVsf3tPAcXqZP9PC9$@RLNRvvY8A*x#+wzeX^te9J)2ed}>^ zbH(d<^{a5svhrK(iwoxqJ3G6FhlfS)TblA$7#OjGwjHm&$VmP*Y}f4@>T}uJ|7>Lh zo~_R#);)RXDrRU8>mNJMsUtm?gSnPPV{2<`b93w)!L8^%RWP|SPqTvXIqVHjHwMV{ zWv6DQSJ?5Yhzg5~X+LsoA2il$(Yo}-(6EO>19-mbsi`=ts5r+&mXECn2fcXy$zH;~ zGb7kcSBAI%4OU)3A;Ostw2)(q$zsyUQA?JxkQ{y{o1 zA+D)B#4oF3l{~Cg%X$kXt@-YxZ;0=4t|BBQMaRjha!v|6#F_G7+=k0LC?LS~c*U>2 z{&u2B(?jiy0RP^q%O*!AnbT<}Dm)xbAfRitqoac~hs46%oXA%|P;j$9{w+E>nda}R zs*Ahp)9OfTKz4|IwY0UfPzDlsUbp>5`$U|cp1z=N)zbQ6Z5r??TSPppyTO)ckP3X7 zS_~`6A*QOMrYc-ylZS8Dx>DEa(}rvIwVa%s(wi>36Z?}$%|yPvy}hk%Z9ee#%X`!1 z@Pwsm4IY;V@2OONl?I?v($KsQ6!LEJUW2{~^p%KS+%KXi`6Wi8UGE&77^a6=>kOvD zJA`P}HhL*tUES->2os#;&}N9Iz@Ftk9-rIYpmDxVB6^^Zy@T&_LO%htKq23NUlyo7 zgbM=$McYIQ?(Xj84{R25HFj$&N|Y=&VrS!Y**iPi$avhCgqZ~eL3&gBnX_v;DHSNN z$Hv-q?se}F);oeQwCfzhtHSq#9X0eS$#`riSyXlQ>DN91D_z+~35Rr}Yco1VPQ6%}V;Fh1<; z>|z+zWo0wtkSigUVGwp!N9-}w-QT8O7{HKuJ!aA+GL8C`bJ>y;LyYR{UwS{ zqq&oto12%H7nna+Xo&Eh%yijO#G>iA#6>q4Q2wVs= z8=G#8DIs(S10ELk6Z^THy`3`_8aojU&HnJR;C!7+q$HNFoQQj8jom8l2i%v}C@U(q zs*e>3T3STm;D#(LcK2ti=`<>~PS*Q8d3}toBoMp&5%E^`*0|k9*F@vPt~_}Y2U3{L z6qb(uG|_sEjgGbwx1znccD+4wIK;R&sjy_R$8JP!GA;mDO9`}-7Pc49wuUM4;yKoA zULxR_zhhx!VNiBtr6DC<7xa9VJx@tZErc2b@hppinq-z&tov~NcIw_OPhOTBQvk0! zx|-Ky_?|_2VPj+Gt6B`Xa^tlVL6X0^9|(x}6NhyvN>)0*)<^pyBVcuD;yVty2d1s8 z&HttLqeT4sMxj$L*;)9{QFZVFlB%dU`+;=a$a+hwRL%3I-wZoMBu#FnjtlZ-Q0%_P zmFhUgab~RVv@xbJMT6abFLO6f`1<-9RL5SQ@pljiFRBw6aeN>xE$x&=U|?Ww$F(b0 zV`lnKwlyYb{fq6atSmAzvPT!9)6T%ZVANAsJYukKUqK+fdHdX}MeUm4#In+W)tcsJ zAAWxR?x|lcv=0rbWE_pd5>Sk5pIBqWk+4kL|^ns{hHPia;7oFn=PWT;$!{Z zYa_oTO}->8?Ne4&ecu-3OQ?jE9Wh1_JmH5A$u0-1WF#cM!AK(+%IC}(guZZynEVWQ zhE_sb7R+y8kJ-Zx^)oEY_47+gP(aJRG96C}wkNzA%rGle>t8+YmFNS*E+|M&Sjjq- zljy|e1@~Rg&`>C21WbxEq%(Eun7SMA&<-=JEXGD1g8u&f3u+R4T4!gcON!yy`8f+K zD=$>(Tgox2^onJMMJ_4&+qxUL8#;*>G1=4tLc`mRQ+luvPpKVoTv@uI_I9CdYhvh7 zY=|%&9i1>a76T#^Jw4`z9)b!+{{dD)Im|koyuELlHK^b zd@EU^sgck_L=;uYpFvVd$FDzNGCuS2^jzDZ7-{slOcVT}Bi&Q9QEo|%=%Il*F*!L# zMY%DAsiZR@Iz{2j6b$(iCVRh_=xu`CYwzS_R6Y%6t*{ePe64aUtxi6rcZ2!g{GA=1uF%)|i|4-|l*YFV2mkwaIFjg2i?XY1tKizF z-x@MAJ{?4lxWhg^vllNR5IL>}2O0qBIR3BD?B6U;jhjX@F3ozB85CgG@M%N^3wH>I zLAf7>wVy%0I6n^sp!C1OynlUG-u@)Af`Y=ha(<(oi;K-JEm)b9EF=cb&aAP0>$dFq zvF1?lcLLmJTS}m^e*5;EHrB$}I6G!RY<*)x29uBQBZqjSk!DwaKVmB=Ho|`msX^U> zudS~wSEDXfv(z&~!^1mRT1wSd=S&Vo)u+eg;NUP22@|h}X6t`?udb%X&;ESaEjKFo zNAivgFI997^k z={83e%F7=5qX@pBpg>YWrq1J#HnwlR%;S3XE>4BrR4lEu?hS1BP8m61@|2d4U55Y>-Vd-WS=pexwctr zG03a}QBO{v4hu`m;GaJeSUdo}tOl3$2^9&LL)b+X6-vcqpHN4QjKp!eWmHvEXtm4E zx^+cwE)O4~CF^8@WTvX+ak1M_Z@fva@4k#R8 zYA>FD6(S1n6crN_JA;n&#n83cT6QlHf|U?SF6|w49RR?dYr}_G7uT~>+nrTMqK)>1 zN{cJcCNUC?217en*Q;MGf&e+8VVRUzluhr6N0PljM%mjPWdjgPnz6Sqiko8N^jbqh zL)Yj29H1l2R z;9ltr5dSCY=fioqo3w_8>?f|=l}Z*i1nAGUEXSRFL;_GC{6C&up27VG1O7K<_P@|& z^IK%8#F}W=f+vn_s>|KTtxR`fMouiy{b%@#K$={hlEho9c^1f@E><>2>%AVezq_6% zJrp6rl+l!2X?N9Hz)=rGjtEwwjQ%OlKq-=?z_9n1#8boRKe7Oivvn4bFS5!%#6%F@ zXXsm2_bq;u-z81%l1ut@DAtSH~@G}hf^CG8l2UTAV-9`}GK zQ>!z%0Ifg8+tSujD9ml~Q1-})h=_1=*aUpIq`0^^^*28a%QJ}itVyOq9tN$JT7zLJ z7@s=xD%cnDx$h{W1v==1{l~y83d83Ev@;ZSrrza{ZPD}eY+I2tBven$&W=FZ5DE+eoz0kbesqrmiF<_7lKjvz|L_er&RwW}Lo$iGp_rNTU|* z~bx)rAKT3WcDP%}is z7OJd3dqYG(AcAilAAd*aczv>t$K&3g$aV-QeY6-!hDgXvwGF=dKBz$jswLTD+dok7 z@#sH81aha%WmC9;Ixt=9usKs{QB+j)cz>x|JHW=q2IcX%h$NTI+ zU=vn2_9&#u#YH6ndt#$MrChJg|M&0T8T7-~}zV-ZZ-je*1xt=iEHQ54@{ zFkOgI;ej+n@vb*hJaVE?{S=I~R;_(UOG_H4hFYv7B(Q{0iHUv2<%e^%g3kT~0V^vj zfZYcK1OPTpLPkcJFT(15wA3<|BTM=wQ0qrlf;9nz|NYM0Ff=f*#{}wiu?h9*9Xz`@ zo){a;7%?3)k!p51OmTbwyq*E^H6kK4Eo}N`|9V_zodsQA@@DJi zeE0G2@!=5sHlzli_3?aCH<8U|VsvzLd|a!^^ZIzTYaL-?e7wD*!)l>HT~zdC*D+`a zlK8+%1&fuCkZ^l@`>+rl3k%3!aZ<*8F9AA6V9`xX;W4?0>QVIc^vrZf&&U9xkGhUZ zD5|-oC5eeXW_Cu#chvL|Ge=HsNy(rjba+_!G|-j))s|Uf#7K&+rmDVv{UjtL^!fAB z#r|v}uZE6JaZb*pW0Rj>M+%Pzs+*C)LW9{@b~u+Kz;t8T(ttRzF)$EnO3q1nghEO&(FV|qzRn4Vg1@;gQbO=*%hA8(ch!R(h#nOAI|ngViAhqpJ-R)F$B zNT>%0g}=XlOG^tpp`f53V%y2dNkwI)5k{1DMrkR7pFmGv-|j?F;z==OJ{-jK?am{@ zeA3|tF1PKkBp|uLe%jjJ0leuTY-X_)0W`FhjBmum#9%d`3XqbLKF(j2`1R@3*ruhX zLI{<>Dn&zMaIf%02YA4Gy3A;?$*V7xF4iMAGt&^v_BC>(g8Y2v{h9Th9ZIk9>FH~z z&%^b_tW8fJ!OYCeTQaFQJ|Ayo<@W-)xw%`TS(5O;a^?9(pwr|jZru%*2Rf*uii*T< z0zs*L=cFlL8MAbHy%tIieNty=v=AVvzBiF004{ZQ`X{lnvOYZgIQ;(Y8)yrA9@A91 zaub~)IPr)Zf1bfu6CSC7qBTr9m0aI|>Qe*%% zsz^%q4Gqx|6T=W18XBGf+41sVUQ<=|2_^suvdeA`9K*xExMfr`r_E_v^h=YHl3<@d z3+m7>Rr}|5U`bh+ME_B~-?ENVm>ZhwYba@*G1UJRsD5MP#B$i1%7lpsmwXo{L(Z4o z_L+XknG52`s-vURdst~;VsUxZV;~$hsy|H^D^`zO)?E?LU6O%pR-(!)SDz3@w%*@;ZCGxd{gM|rg z2&5s+->`phaKpY97g_XNAz4L20s+AL{U7-~YI1Ua*6j!S`^QIdNP&cwBb8#$bZo4n zvk*Jh)L?(!`$K27%h1>uZW*5cHqD$79UWamO^v`;;V|o9rjm+>Cz$}AimHGv+ZzoN zGdC2kNg!toO#l%NOeeBql@$+~#K=e{ZGq0i}7)VJw78dXb9d9T0hlhu|ySsDm)6|Y9fJbaI+@!}u zd;;^9!Ypv#Kc&fOR2Polzq~{f0PGM24@*j>Ai1%T=jj%|0?-~WMHbm}=hRjLgy+}S z+(H1P2nx2%&U)-t6-kkmr={sFG`M+b-?*QhUaiOK+TxPWvT-#p8GUU`_R`WyYHof6 z9Ujc%-Q8W2dz+Z@$kQXew!?)+$>LB;vSfBNht~4uoRYA^wjU@xD+~+_58e+lUP)xZ zP&qBFenZ9_>0}X9-}1=v@<<0~l`1vr(BOcxtF_xa-_bHvpEf z!_{qYEe$P}aTjr)+pbZ}kqIwovz6lfgeoL1E$w|CN+~sh7-M$t8zZScO{CrAJqbpFF%b+H@ z_1*(rlR4WP-Njx&WmYZGSwD7V4<+^;OyXeDYlSV71j}>&>aeqDwwe*&=-_VuFBx0? zsBvw5y&w<(sx%y#t$@z8CQlnHnI@N@lUQ6-)EH;Wz(E@SwDb$FUvG#C2~n&4<{$C2 z&wKG2<5$kR9^;QL3f;+hU@qA-J!Egsm<*)&=}iTsqRGq4ui@I@+t};h1aAX9UZ9vK ztScxeNK!@|^hhCiKY#zhcqVdc>R_3iRrZwRWGfS!8~}g7;VBgy62imHJ($A7Wz-u* zrCMyup2X{QV`yYV=o>?$D`GtpcItzOf&v8PwDf37N*RBHqwde^UI3O0$lHx@%~qUo zXGCZK#T_)YvN8pr3pjfVyS)&|m5ilbg8~KAD9cDiIaSVjIw6)y-)&rqjS~Wy3 zE;JNbAfU$(!B4>6*wOK9Fqx~buNO@qBqYQ>C@LoArw|dJF5ii4ppZb80-6A55c0Pf z7YFk=cz6o{+5!Bf%BH$*!03H|7MZ_+E5NCycKu_o>>ZP{MzP4`5S_wi;HTeiy8V%m_HvpyrG2+Cv0pKOTHkR2BHaDxC2WFlOm)6#S zM7A(oj)!uPLOzi?3R%k=^zff4}6*%JKCw6>793|&wbVS4n zS`%c!GL8b{y2a*7BKKVDjf0Xo)&4od+{^OuE7_3qx@ zljDn#;bGLE4zL88t*`!0PuITRjsBnjnqWYO?AAWSFz?#*MrDNt0|R4v@>%FAAX)(1 z5gG_aQO5yg>2QI^3+Dbc25oM&WU}0D$_vD{vNE6>ls|v|9GwOLE3P^Dmf7X8^G}0J zy-moOZ+kI-U2}YV4EVBE|1swDwdf<~&c@EfSoS9H@NjT&dg6WVj(=F_s!~Z(0Wr(# z_9C2#ii*m_n`^8p$Ldh05tw^GYqCr(ETldy-Wc5mVm^Uyrx!0!sw}81fRK51=7<+o zZMvMk(C9upJu?91gWeJTkyWKidEtv1ErEoK78e`)1J!-=3of_o@ch7h?5k9o7~rYbr@-7j&=mM3iZe3&4nyIFlOFI=X6C3Sf@0m~;4Q~DT&9yxj&A9Cht*PaXnD(%$b6cTB07x3VH<8`zA1nV+WqWsJr^}}ch>owEt?dy& zNI=X8L`|2Y0A4uZtRqm{3o8%_GmDBoRPvbvmt#G|0;pBAR986v} zT8Agxt_?K~!Qvu2Py#?|733C#59pmUpQ&a#$@->O!}#kxd3c0mk>U?!9M@&B2Yzw! z@jcQ1nzrM0+feRva^mYVK#?Mc^bHI$P9~p0hxj};s6U|s1d1x~{A+4<_J({XG3R&M za4`e~gzg3^3JOp&Nibf)KOLr)mUGoMi$KkYRE#)BI_qIITm|kuHa1pov7bl=8tll_ zlvu_HB_(Bd{5u5U8Gc<|{I=gwTps}$Hpl(NI`Y#c<6Yvw!*&i76cIAnltNE_pl`*} zs=M!9G04gef#w#5$AaC+lUXJbid#!*uPiS=(){?~adB9lYk*WkROCt&)$k#Kl}z^n zBsG9S2A|g2DsT<=^JVRJqF6M|zU%mPNkvYqiN1dN*)|}$|G0ziJ<8&V=T09}auo8O z)>lp3FI$G?n~+^RJUj-55*hBtvWHlIe>mFMdZ#`Wd)5E}U&uD&PbWn>7V3dzf(sS~;?*#aIb zEsZ1q2>n_!&SRdPEiZPh$)|()+%5HAf7{Z3B-YOYJQa-+AV)z0FCeR0Qd(-~GwyAl zz4xnkbaL|Y&dp;xM(hqmekQrKbgYO*YVa1oFxh{R*oN^D0p#&tJeEJwu$nFz5`ewY%?(D>cY;;2ixzmEKt` zSia9@wV2q3s58ty7ZJ>Ms9dspqYH>oz54cwZWP5 z-ASWIHzD{&2h|t3Xxy*&+q*o8-mJVOA|iTYLz>@cFRE{1k+b$1-Z946O3*-AIr^p< zMv!-%mzUSx;ZGOrkO0?l8Z-cyasVLX;3NXP2oMu+Z1YQ9O)k=!*pLp}E+8p>&MR#^ zXaFg@hwIp|0p3K#?B;?wOjuscsQD55mCMy%%^gpX3cf6Xxa_mK|s+x6sD1@O$>97RkS58_Ha^N-0#ka0J#_U7sN#iIg|}zh2LFW~ci9GO32_p# zefaOPZ-8C+l^`ybo5)_A?g7pE`s!v0q2?c=3sIU(&oBdq);dxra5=1YDnPYi#0&d@lT@uy>n$$wj{##ShgUWj(8q`SHL3rU zD!cXsTJQr%GhTT<1YyvvtgZs>R)`2KL?nX%p_v1GTRsX%Wf1(0WME>7L?i=AGZPaN zyfC)Ue;~Zj5|C{H+ItudoAuVOv>26`04b5L{QqcP;bIl8Ju62?M}*&huyeAfPrj;W z^d$8+5QIaqbGA?6Hap4a7xmTkAchCEOD5|Li0Nw+kNxkDHPR`Pv9aaO@J|M&=8n&8VW*SvER6ixrf z{}j&s$N#+SSUr9^X(ubC{#W>N_v-Pu!oHX4{jn+nWNYfl0u`h9f44vpA^2lO?Hh+W zh+lGIb9RIYuv&7=K}N@F{>AXY)y+*ONJupzlMr7i1$L|e@pS9=j67rOF`B7FPdM5q zRQz)CR7Eq)wrOKoPlJps7^H`xAqqmPlxQxnNBMdU;Y;vyfc zlDEfl%BS~s5_VL^eZ54EmMcmOGl`yD$6PhVU%^o3lblW?JN6{t`Ttfce6L64Sm9Ko zb>K1SYY2-kbt@rq!k-WiauAR}dDboBb>?q%7Mk*3R9WM+zCVM)p5<*9C+m2&d(QWXPivYs3W|w1N;}#VvNgh8x|b{>MIN!vaOvn;GkHno|pm@TwESt9a>Bl&DR-O03rd(w{n5X zh$*x1Y0oiXd;0>9hoYjQ%l?9}3UIeGl&4o`}}$vml5~c6D0meMn}^}Oo0U^EBoYQJN6##r6K&`mYo53 zD$LB|J=10Y^#K0|U^<;Zxa^H6CUZv0i;CvtSPgM~bn$bx~c)gvcJCvnm6E zN6Flr564~jATRZO@CxWuPwr?N3LgcOj;tN-1`c@cn-3gpppX}+7Vm6tpO+o}{VFO; zGaesYT3SkXs_TC1T5|0+K-c_`uFnEYFCLyoQ0$+05rWOKvo(?dd`#e11MlvG>(;oiRgW6bAkpwjO%Cxu zWSdX7xs=cVXtzp*8~_$O?M{5)agQ3>w3(^+$jGShf#-!4|Ai^%zIOu9_=haKH`tDF zbU?&F2Pol}oLdLEn^-SATY&lX>Ki7zErEa-#XIomczZpCa>hvC^z?m;1^om*E%pT+ zs5h?|2x9`?4~o9AkGi|RS1r;wzv@{9BJ7|peRBqKGIkyfmMXO_gXI;y{i8K7$zNko zH#lBL{LFa)xKxv2&l@lU$Re+S116gQi;>NzY!5YQaJURjESLqW!|XZ)WC9}S!otE}*9GN!Yrcn9776Yk9}lPnJ}z$3uV1!Y+ZVT; zL_0O2z%7U3v6x5gvGjuqdI!Wu5d8*051{`bAtM7d{{y38_oS|mG^(!}wF)zSPw;2} z8nH|YH`wMeE#D>GI35|?2KI-rTE^`q#l2;aPE^;>sNzQdBs#h`-3G1>8IyhqIQ=wy z)mJJ5$nIh_UR};-7ZYCSN7E+HpdgJ%x4pMcEuJ&=? zmd{rxCx^MK**g2XvtLs)6da!)gN$9#1HY`v?4|r!atyln@HaF3yLm7T>0 zF_9yNij~jT$(*xXS_fNK$){N$SNjwvXJuWeF*7j1sZaqMXYkv8h;6J)QOiM3om;DC_5$2d9s)A5HF%vAA0KMWR}I^i9uwy9iSe84d(W5I z>h#p+&%k#mqdpt>rY9c+uEzE!EOXXc655=6`qN)WLL<-!4L=+5r^$iHPF7&m0k&!5 zUBg{!YN`tL*5+mocN8inlB@P%*PEJ-AliiIf zmVZ_oPxm4vPAA&2!1Nb?l=U~zbV07rDd+p1l~Kgxb>qmIsI9Fy|1%-~&a_O7q<3Hd z#908jU|$$qc#$u^Y9k)hv2t=^kKhOF|HWzVi5jm)vRtrtR*r#k;vLBzYo$p)~b`&`!nLdAsOetm!5n%#SA0uNceW4RebYE{THnXW5a7uqr(290E zC9buArlPGa{RCeHFHSAf_)P&%+S$opumzhvULxZHtG)@_B0tv#c* z0tg8nEX;d!8H6_5B!#~mHGH?iE`tgJ6GFfl|K0*T{LZ=BBPs?cWo?ETF>%Jy(r2JX zpg&;<=lz9_Wm^z4S}ZW$rDXy8Vr<(wrDu5H&TgpBI?7*;JkG_4!7~u9+3D7Cs(GKU zR{$x1SsREgeT$2He0;jjGW`6IYn)-4y`8RF*7RNtu!9G9F|;2)j*O3IDu5B}0QQQi z>LtjCf^`UlVbH$qgKTT(o`epO3~`b-$Um4|k3PSB8yRys1`OMpnwq~K9&Ev4#bLFM z!{MBq?b4K$J(Tav`2G@EC!l%wXCpU)TMSx;KD+<&R1A$Kxcb9|`q|-Odgp#MDvN?r zgRcCnwk6_7X%Qx-@|N!}BjdXb8G1aqZ!gus-2(<5Gili|C=WJm&BZ&^tecj9RqX4i zsR;@UP2)q#G5;M0)*v0eb~2|!%T2&F=*I)alFlJCchQ?F%qsE)lMz7GUT*b!NV&hg z*r!5;_Z1-ggsNX!la|&pJS_JI0|arfF)_RMRo=pW%2Jpt(j-R@T3uZQMVZ@aM=4Ei z>cqQhNK#}+T*Sxcap*bkYhA1+r`d@YuhFU1YEnT;r6~7wC*rjqi0om@1OczmaSK&6 z>^sg1z}i3y=QLX(sdU8jG#ot*p6{d40p;xfZ6_{~9*QtP9Et4_Q8T_H#^V)njecUhK?{)pI-*sKT>$>lM?jAiJm2u9; z>GOV#=Q^-J(OkHYH)sVbl10Ft$H`s=dYUilnb~ox0C^7|V$z1R$^jphUn+KNXn#}IFj_=hsp?%=*yP+? zpQB#u8Y&#XS@d{SrS)<#Y})|1;xS{)JHh;u4WOkM)4Dh6m{res(&v>D&6abQHB;!$ zc2KU1)i|YyAcmSDS$^3+wX{_0@&zD*S5{WOnmx7>h*3@_-Sw%c5Tgl9P0up3uxK8a1LKuSf*9}xKkW{iW;ssZIozENDv^P%+EV>hTguG`^KeLr1`CA>JEp|YCmatQTa1!9qVPyXV0vQ#NZ1faL_C;ofK{aT9VY&t!y%&eL@ z+Mr6ClR)k4ZcNX}oNO<`N3tRTwUf3&KsCW+-Q9YuvhQ6A2Gr(J7#7{vD@(j;-D1vc z$c=I+Hc!(8ySge7!Lr00kCr=D_OEYZ;+%eemq?&``rAGURK= zc{)~N)+mF5&zPS-qDHI4U%f=uj`+(+OP?krG(yfTEXY$xTij!7_KK3y?;d2)VE4D^ zp>MjAqnXt^o~)f+#~bvW#OE?E*|g{;N$fXKOmR>T(B&dJNbyg$7XAJ2ZqxuNLHt%`L9HTGKpXDb#%Y%UryWF*q8y=R#ep6+?3qZzFR0R^906 z=;2&uRu%~3xb-V``>Sygjm9?PReHz7Dp|eZ;{t+$E{=|u{g@~{e6ZE5x?iki^aOgj{0b`QF-Z#+aT)059z|%K- zN=SKP6er^PXE@n3lxSeaQr4V~Nn62hn5ZfUGn8gfwdH71=3e?NOw-%do#^0kq3Nop zcdj&h4awnTO28#gY^M(asVyEW#!vHL_(yp&pYtDQP~3tAK;s7W`3!(wuI_K`q_3eL zVH7`yt4Qn_d$k;{oqai0AS5h0C^`V}q_B{X*y7H$$a)ip0W0#D8e>dR@ht63jCL3! z-{VuF?xHR(J1{EPjZNo(barQK)Ih_a9DIarsrDp|-k8e&~H1zW8Kw9qj!~K~PuXyQfeq7wekZAxB0Mf-R z{d_cjbRddGqwRBJV{_qD#f!NvPNh;_l@&W!DYP%E7{*T`xLQ3^1-I;Y$Y_Su&7ybT z@2WmBkn3l;-`LWCrJshWuauD+>Yx4b4v*{dZ5398TLU=cw4W{os z&fU(|`PP;vB=9k{u&{7Jzw>D6VAXoHoV#|`Ud}x@Uc`yrb*_^lw4Q38g!Bw)16og4 zS2mPh@1gb;3SwP7-DssW?QENH@UGuthHb8I;O0}HVWBX@T)Uql7tHd=I3E^sePs{U zY)y{$jh4TPM!yMIV>tKyynb{QJXFiIUy0R@SOO^&&OM%zj77GcX{_Ao*$~D85Z{8s zk*P~YLwUZu?tfO^yrcrZ3{+B#eDiHGn!wqG1tCl9jZITi`W*?kXs&30|0hpRe(6jB zCeqA|bub1==3iM^8QrkDx>~Y6(&xz$p^*BJO=5F7iAjxBEWWxl!3f&ew()k7x} zc14>hfOtPCez);QTi63t8f|P!8}SQ`L;@syGl8QluWF59%E`xXo1MnjP>KDh+!|S*_!7cx!&{d;C!|?6gH(Tr99SixU&S zOK0uY(@(#kJIX@wQNC|{Vx-hU;aGR7^|$K@48>Emn;aK6TD&?O8y9O*Q01{Ag1CTj zk~O$waD?u)ERs#hpzhbE_7i)@qQe~c>xZ3~u<#xXjF3Lio2h}WIF&Far1~HvO)i9y zj)CDB8m%JnY3;Y4;f7G{=%eFcKi+YSflGF6Z-YU;NT31T9`ij4Nm{El z@DiU0tYhf$vTSwsNKXB!>E%MeY|76QR^F>dfwm9ig8?gV#6+0}FXiH@vjFS35ctb8 z>KZ~s+@8PEqMN1tLHwJT^VxbEC5qf+EOkEzIR8MngL1482t(`WYZT<=g^pSmBc~?9 zy79x;#HNwCH;I!l82*$%(6vi=VDomm@V=kk7oE;;51E~v(^LFriY4jX$y%%b`SZf@ zLn}wU0#vwMH~77{BLn>WY=s#A(omGU@7Qoh?#o~0y}Zzd0)71WkL#xv?()0T4VR$T z2Mgz022t<=%hDp}#oN?%q|4_8`J$2jFy0XQ*354WS_uTy+BrEvaMbc~yBv|M(?Mqj z0!tzynxe#_b2PLBMI6NQLrkqTHFvUlfy^mjC@w16*z*{!^^r&tZ5O&DRC5@9J@vYH z0y#o2F&lOMG_0{hc^QUT`g$^o-~ZKwAg^fLao||r05}tXSM}9m-0vF!Inrf`R7jn{ zf|Kv<+qa;w#u8yXlYino4}KL*0j<CR! zR$|^n1a&U3ixCe~4WGsY*q7cN=G`b@<8r(ZY8&R z43$>Fj|fWrU-k6?_0!n~)wsX=luTK|&2{Io4;^eE*3`IhK_PV$&?wiEEu~6diWg&Y zI%b&PX*N*xNr$gUy>6amf(#D8^%=?Q7b0wURgun>Af^R((7?a|27>`rt$ARg!J@%B z`Dx#X&cXmFe4hlYhv2y-(r=JiT%|wp4*x5}E=Zi*gjcO%`z1By5>u75WX*3224BUoQ z#rwA|UAk1Rwu;(W9}k!#{;v8x-@#HN6Q0j{$gHKcH4X@4a8LLfzH%X@l!Epw;k|a) z+-xA>IfsQ^!=kA;^nMiYsXvUTkPofEOgy~-eOI_v!NlB107u_nN z@}qL3ns1Mzg&j{u90p~Nr5Uy`d47kwmZ@YTdp)1a55v`dr2DIo#1%X}ASd+Q2%x?y zU1-`??y}BQ_B$G7X4)D{&3HlV>3-0AgM^-O8c1nik3d)L&CR@PoK&kl-U#*1)8fpM zqB}!ELiZsu3W1Ov9HM*7NmKWufh5jsUOXl;GX3~`-49#FT=W;78#i8qra3eeZDYfI zLa zScT-18fAkWC($4yD|gwR4gy!S&nwEYycZS~RWk*xe4DYu0IF6)WX2NU*B%=p>N6O+*B8(Q))Tx?Tp%+DqS-kF>n$8_dm6gK=A@=;XKz+bDrV!-KADODM za-R|s&e0kokXNk4+rK=_5D^h=Ac;`u?dY)G{XGeS{cQb8?Z2O*Q0puBnrGq~VJl^i zSb{C6-@D4jauUWG-EYp>;BHRo1R#dcNL307>8cmHM3aeMQNEcoWORv3ssN=yln*R~~cr zL6**=9Bm7BqLic?PoX?Z__&bZF!ln|`P8M;A6>N5mfo%`ob zK5`%939+)2i0_G~5>5oY>i>`R?(aG1Uw?70U|gpfZk9&-u$5>gru4~z=ZVoyK zGIB>}S$p(`GVWsCdX!Qc&aXp7o|`R)YB^U+ODn1ZwFf{6(%&_BV`#JQV_ADk>dkzw zhT-9F{n{F68`2jwFL5ar&xQdM(66%E1M60MoFpI*ph6rT9K7eQi9kFN-p~CWg%0$G z!z_K}ak&*+Oluu4=e29s#Kd%WmfldYvJfhh#W8+*|Nd@USo3U_fzImAXM-2sw>R62 zgJpdwL>%^8-bOxpM=C8Vo8x7DOZcLQFs8ILs^Aw`X8EiXqC!hlS`MR@4tj}`fYi(F z)b}3-slMWIK~I0ZOC6SuRXO&#(F)ZE)ibY*9J=NZ$B3i^-kUeWJc4e$QfJqzvJ$2{ zAwXx8>;v~>$Uh-32wdmn5nL}!Ng%jS_KA^Cm`AX^MN?_^@E5ItpECLO#vc+A5@9#& z7hJKDM*F5Jf{aqUiw>H{&+l*it@8^qyKG&-WAXBKo`9G2P!azd>Ez?{A=6G%z5KR&v^Dk&sm&~orO$sU45zNu( z1YSctlfbd*iriE^4la)EKYzyZp9Vx*U$;?mba3Ec=idL*R04S*d`h@gE_6w8vFW_= zc$I?=dsr1nf&H7oMJggJN=;3xhx@Y$V;>pqcRO89nt9rp`d`0Jjx@`AShoQJRFCw} z$VSd_hRH+KK2c0+YHFmVpM*rj6>z2WF6-Yw5Z>Guy*hZ7QtA}$)Q4jEw)7{3gOS_@ zpqmE;F**4eeT*$-*(Et`s%pa8yuF)S%?iyFQeb3}OglO;IEadVgH4dtM&X)!E6gKs z*53vOg1{RbuK@n4vsrhVn@JM~)1ge) z58NrG000NzWaM4mB*fDbGs7+$7kA>R4HetF@$dEe5%#ZoeI;Gy$^&5Ww~s6zd~O&V z6h@)8oX4yozPGdt6kT428};EVBvSI(n(tBftrag*yd!FO$Oz-`Bp53BU3;udIsAo1g@rF391cLUb6y)+TwkvSdb5Kq z>4R~QX8RD_nl|E2{Mp_&)%$7gJIThu%KufTB&Xu*NDp4E|GB%wy?uS*`b&&k}r}=u?yHCL>INRTx`eY+kDPio(*;a(|&iZYJRwI5Z>ctHDstM;+Tf zf8x9aize*Q>=8`z;=f12=Nlpcny$+x1CWz~7$VJbk3ICbBZ&wJA6{{EcAgSiTbjz$ z%#xJ+Qx^Rag2B>3X1?x@8|&<3j%=31Ej+CyFruvk3nSbSm;HduvBB-6b^7hBjHNux z`227&$v2?Is#Bd_&qgM_stN~=X8>(EX`08z;vd?gdJ6^qx>@vMSPm|ya?y{P0rv(! zAt*!OxYnloH_vXKJLhE%Dc>)9$Tj3_ReuL9qNG>?u2pOdN1vcFL_|cJ9z(HIV9AT5_Z#2M^y(VH}C$_s_0r=@`qWPg7*Uf6T4L#{{GD${M0 znBe>6x(1%I^{J^JB~M-0b(FZS{if*Y?SFi}O>N?_rhb}tKlv<6d}oTR+L{^Tjjo*3 zlXyg9Q>@b!#EUfmV_GXVUOt`g$y5i2ez!M4-TFPrp{IW$fCDA;z3FxM9JV01Z(vNQ zg6+P8!F(+U-_g6{0{|^&mj&fd$UG`>NjJ5ww7);UFmA@E1P1$0aqma_A0rTM47#@e z^JegW>6Br0^$#JLa&^IboPV#!B1Jmv%4us#M8|sP2%W`>8_Yv6HE(~JqtrX)&Tl1n z<lC2)5jKP03N!@=m$=Y*YQ^oWnHVsW)y?WIs`W{sO0ftfi$XqV8b@V}tE7w_5$0!Q4T!xO+5D)wcxe4zHRAXM z3|=t$F+0v-qp5jvFVnsb3er6qva}a*v^Tf2%g?yaap7(2y%_vMd;qy1DQlB04Sr<( zluEJ^h!FpXGsyr8Dcp*H0BrmmfG{9$FI+oJPWvE{+oc)h;QN#(k)dAhF=)@%09#-~ z^bF0m;6?tMH>?!2^liq>I1_@0Pjr|FJa+ZV~T6eHtAag1hEq!^n`{2lq?Npv_dBw4h)~@>DW9*Ta2r>bm`0 z+15NSS=N`YU%q@LjzyX~%6NiqOSw%M&TC|KrN`tCf?5JwMi^4}2=+kM1L~QNjmGeI zFiQ5y6pER>kuLBY{-Yv!gel166BqXcU)=|5x@_YesZ+cS*d8^Fe`|{7*uj@p0ta2Q ziU4giHa6DWsR^Xv&a5)Xc6a*s#e;`~>n?FoaWO9H&veK|Q6Tal2tB@(Eo_D7X?=*3 zt?dnN?zSe-DZPbo2{79?G_{-wB^KNkQhg<52bmflTplvQX2Hk^d~S|@nWgEslLe~J zTE|r^J|a9c9}6q|;TNr|Im<_CFU<@$PSL(7dDoD|Q` zIC>J*@&eK72gvMI6$ypw5B)m6JVK*VPO#w*WX@{k(C9`8GeBw zK+P3IYJc}Q*kd|Wb|b3~UwI@JMz5YZjc0#KMP)j2;_RayIl|6tQ8%nPigMte+nz=n zTw%S0r1Rv|tB%GbsB~3vF2lTZDG`{HQmmqK@&2*_qSt!~v*#oigv_@YE#EA#S0g23 zkRUtp+$eehA%ilSA-31Pz}5t&@3uBbo1sj8%`G|&FA^_Vb89mM2b}!o;Nf87x>-HC zzwfrG1EybwuX~hqa8+3huc#@%HqtTk10-B%)=ooB+Zrv(Dj_lUpDqK14B9kk?z}Xd z+=)L7Qms&OPifqnVhqN^^{_cH@v>SC5Y*5Rp%?(Fm-=w=WeYnjo(S z@8xANvBUlL{#kq1Cr=WiRr5)of`q+cGzZXznBz(d)5-tV&g`oS3sEp{I?;#+#VC2T zuZaUH2F+5$e7kTpyQ%EI_An3Bf4p$-J>PZF1g{y|m5so;iHbt5+l>JbFl)aTKqSde zCAoduG9dG+(2eIXSHseEer$KuDz2oY#Mc+!RWGJ}9@a|%PEJ6mQAx1I)=zJysl-T( zxg0tu#&d9_#MAYZNIH4nz3Y2?`uG+6C^SC-UhwOH_#Bwr0rphw3lCC=YET*7|J=V2 z%fv^1reiDr0B9DgyNCboUqrLBvt)!%Aqf@&LLeyuCQDC%s}s{ZM(BuYaEWZKt*s1w zXvjkaqneu+HtqBMfBQTnGH8M6Muwe4V_5_3ecRbGPHZ88&>RB(x!Q6S*p7 zUgJaH_zI6W3Ftz-(&sg{5(nue+CGDi*)gX7 z=a1bnV|hCvpX^qf76Hj7^zR$ADGJ*k6%A|#Cn`31%0Z$-CFgoAx*+mMAHTuV%= zlBxs$@m-g8pRnVtK7H9H^!;|6#ZBX8;7rWlwW4;&j-qFEpcQODPRa{JD zv(b^^O1bLO1muBYBai>hRJ2z0TA?i0aR6@L0b8`ul$uMHU zW73KW_~sQNj;knoTpPH-TH;V8OI{Is_jiWIUj;9G!}C3!B>Qr*iF@oZpeyY5u@;2B zcCd;=e&7i?+h=R2R<2vxOc3wAwg)LiHej5pdGgMIJGMFx)F&*y_Z~ObSwFtTt%GeB zx#|b20LXDcd65ILK~Iq%V`8Az4Ze7RXztF7l}$-HtT*KvR$FS_=#rNd)Y;@ej7Xd< z`7&&NPI34k%?_{sI5Q&~)S*0el?_k$DDYvGMv7ej;Bl|ycWQGaz-XGdXTr)8+1A-; zYgZ0P-sR=xWn;USq&{)_WR{o`;)dirsmW1ym)X`$m?^;Z4pumrWArdo260jR7F|8R zGav%|1HWl|G*@JEVL@R7+Qfb^R1#MTt_L0!4?0T9$@zI&1_m8)BqV6<<<7$Nb#wM+qEns-!V66bT`?qf+plwW-d38jXNdT)rGkz`Vd^gfM9wx$+>f| z>;L#zQu0Ma-O;2gc+BL2XWT|8z`vj)J}+?Xvz{X4{q=ai(cOjIDUo+>6Ir>{Zc}eq zZ5hXlt#x2o^6olz*y_9gMmoG)lDd8)w+eTrHV+KEW0fwCZd|A;+T%)n7!9Dqx--~a zW4RNxINMs9bPJ3d0jy=S$QxW)*y{w%Eo(KnNHar2+uy552t(uNc$7OsJ0p2>?G0GC zj(%cU!NAutzvW=>pbW+q7_UY>YJ1r-mOd&eC>ZfYML&){aod3)vF0uj*S+DEq&vr7 z3w619*x5g!TtYfuMzP6&q)x%U35d{j>d^zp0lIqS%8h3a(qO2L{PT1Oc3P$2RCf~$ z&FXZKF{kFD{X{Ws4X=+)NXFzsZnz!CwDwTZ@^KkXaf2s-oGF=uDoZqy1V}kNR%~?? z*<6NNI@o!E>!GG(+L$8c8Otrt6>SndY@E!k-rt{Td>@aeg2y^EJd~?nw(pHTPPo_} zQa@XX+h0CW4q(rbki?q1j)Z^w_y^*TL$Jy-n(No=X(Mpv>-AaN{(%v4r&(BNz?op8S0v@CbP^3+NJ%tYYN9uOLUJ20E60uLg}AkL6N>S2Z>EY~1z#z7bz z1k(^tfe2|FWAPq@4P~01p5h_X&)_j$JGkzelZ@i|edLX(^BFji z*ynuBj1}ATEyuPZ;b6In^Xv7UvR0M1@3l4-SrPR|6pWP2bxqGW9m`{e+vI5XfO! z1bW7*F$nJ~!aM`&*iN@M$*6Gfe1_jhtQWayosl~o*PZp}){KD~*xI22lBQ7n#UrCA z`nF5BpO~Rz>hxk$2qY5-iTq=~-P7r)_O!e6s@$_@mL##yM-F$fg6T&`N8ZDuy~(Wg zl6zp@U|mmsCK#oL266vrHVDH$5m0 zJIeaHXZ5UIV7Z!}mg<*4&>#Kqi6Q_~Gf-KfdK8Ki(gB(9a8*~U@AlelF264?a!hJC zd2}GGylf}%Q>EA<nfPl7D7W#c+H+zsQ>4!RL+hfa7E9q^zWLIPskb zlrP`NH3DR_%N!2cinE8yIb}Tcj=a%_k5bid(kU^8)<5BeRZ!UIv#;-60Ba*2ZntKj z$-Hly)^%0#IZp@HZD-b1l)r4s#%k-cEUt#s&?+ z*Vi{fVK#^kWy|Q|;Gk1xKU-kZ4Ebvd%gc&6sXBU+ZIIVv!Z!$C0UhrqypMr>RcG(E z8W*UoW#pBW*A^C@FJ+{I?*$U>!7yTCIE0_m2C8A8&?EumguFEH)IdGpIR6GqE1-R* zNZS)gAQ$e8bQ?-psD#? zpCnnoV2eHe8KpD_r57syd~3}7^z;^_Ck};^ndoAk{4=?lMsxl-@zTW1F&7=uluyGE8dwDd&4sCZZsbxOA-OR(S``ZH@`^!1_b7Sm&$E>+_R4PAgizWAM{l8Q zH&7y9KFc}&-d}WZm7RR*K2c1l5E&OSLPF5%(J;fKp`meco9!EU%kX6)1*X&M4XtiK z4<-(!1SaM}x~XneH2I3>k6`|^kw$~aWsP-*t994 zfaDD}{MHiVRI>RJ8daiB?kp!NfQ^fc3+4S88jkx?H~ou0B--vzy)BvWe1fYtMp7%W zfH}rc?Y8trb_8UMIO!~@+ECFa^Orq+7R|)uk4B;$uNm7J5){Sp)F#G-BP1sd^WX5{ zkuW%stH)S91JsTCoNB2KvN}>b7N!pL_(SjbA4723xE2SyW2g+r0}=YG3Qg57ev{U` zVzPyeCeqz(Z4R(JE;}i$l(T)x%MXo{Q^M0uy8Uu+taf!et!!Pgx0y(tQJ@F=%U<7E z&Y{EICy9rE^K^8Mz_Nl>N*K>SqYpOLPju`;_~*BU-rk_x-$9iEvBx;ANp4?FII#SE zy#E-I=a?q7L8%UZ=8rj1uV@^*UgN5x`55HcK(O6@`gI*Cfgf5!WoHVV;-)>jn{;+y zd1;nfTTT_B89628MdQ--nqe_hvJUL#)*kiacePP7YFWkCthn>2mufyF5(1&9YLg?G zUY{n0$>j?Mv9v{8q7g^rSKEj3tnWKLRPBQ6xTlG*51VgX?Q`@tIp^Ycr8B7rGNd+A z2fmT6x1lC{Xfs->dv%z+C_M=gRL~=<+|8%ZWVO`!E3rQ)R(1Gg zm!0R&e)Lx`#^m?KuoWjSU@fVjS%mSHr5BG(7VMo_*M|?bS4OZbrP^9J(+Xot9pWNk zmhWxKi?R+!sz1~iz2SM?#0xvkFhCLo?aROo z`QtL?1gArBDUQiuoGA~?I%kZA@MkCaMP6yn!CBd^G7b6qFzq2?9Xu`M?6%?le1aBf zy)0oY2+zVbU$H+;ivYXWPsTS{BT;#1FL&M2p0 zZ<#~uo1+Qikdn)htfCX&1F^RSJo>I)bdaR0hC`0$64b3{@cO9WIgEEMOd_IQQnNOh|9ik-@)Pa96rp}1x(jEODCE$ z3v*K(&c3FR-PCAH>Q>1m+BNIT399vm3AMAk>5=)?x0xA%3wx>?583OQJ(Nt6 zsIomu%3`X!_r}Gi&SLTh(t}GVNO!m-IHJHUpnD6Y`DcqnOh4BiZ*wO^hfow=nfe?@BPQ7zYRhc zy4`elEL0h>cWG$IUrJ6$c>J#8GnN<^rK_HJt*T`_j+C`cqES*HM%PX7IaBUec~%we z9!tAXWTju+0(!-uvs_tj8#cKvzP}&wAu_=e^k&G7DC|y95`nq#`XFXz664GGlGS1Y zh_RNb>U#YtE9%n6D-Rm;^BNiRnDw+zP2s}`P0BGp2ykQ$2C944yO0dNEA(Ds7Np4M z6goGScI#UhAP2W0`cW-TbeTA8)#Qip%9dHg#7Cmg8n2(7?uiZiN`?~nO9)r7_^nAA zteB?XJW$8Q#@LiMlugM}edMIbG*g{?pmrA%JdoCa`<3_#+cCA*_w8^tOJhqnPNGUh zA!6`*6=h65#!hJ!r>v5*6?5dr3~7$3T*q&|gEDh?#R8P{OI)oXDV@V1o}4ST-*2{& zaW%C(>JcPunTs@~4mtf-(uTUyGBk(qw=7wjCoP#g<1)6swU z;j}fE90Q{`9>OZI&t~E7F=l~GG-21^B;M8jYRo3^P*d41xxxImoc%~Mp4f?htbJ^w z*{TyPtE{11YW*m&;@}_$m5Uf=;NC1))zMc^ijz;vA|Z5f#2)yI6X*9{6gbyRbw;)G z^Q|Ec-!jE6H^w_GeTwXt*H;fh6g)yYelqVw(xy}CaK@WD81Flu&Ha*rc3^8C!M6N( zxy9i-j1*18WbJjwf$Q&AmCUSJl$~+%w%$MEq&AA%)oniCIlEb~ybNptw{W89`YiT$3f4Xq` z3YXc=6}PHoa%=c;nzE7D1iSH|SKMsRgO_I3iVfi3P)8Dz2Jnm^XU^Gu`*qT$;wKZm#6Sj>Yc`>>jPc|7=GeNk6H zwPgT(J;>5H^u)ZyrngH&;aV>a+wkN1v`2^olKDM>U!{+McgXxZz4lw)pecF!xAKn3 zZ3Fa^zL+|Rx64KiyPx$88rV0E*lHrp7tGr=yU^pt`yCY*PE1N3TzelF6|);L;HsJ6 z{FB-o-S&cbL;42}G+UG6eft@;Oxu4dbg{xJGOkDkpG@8Uc%V9nQxm6a4$a$7snww} z_P=wZ{Z-qrA6znU86r%W>b%L;`~Nv`R;a!soxclln(GaAZEtezT6{P2vORKNTX z1z1VEe5Z())CYY{p>#zb@%fLbh_vSc7IDAF|0hhM^5muKSlY7(pFt|L~Wd#eqWD@xO@2fgDUr z`?^!yKMQMWLV@4#RaERt;nd1XDjZ*7(TqQYf}G-HHDQvA$ILk%B46cdW6MD#npxJ< z0KQN}3BXxAg;x zTe`UW7ViPqRl%Z;j*(1R;RGh5zB5Kmt%Q&?UbcV6F%1esjjwGDXOiDHL%$OAFn=etXyezk0khua0aE6T$<7tD6yh0cz< z_PCq2AgG!A{g;S{Td|t%`W@;H88W#e5R{qO*;1V=jdJeFKq=0J1&v&}gtneY4nm?z zY=2DLr>5t{@%iCSE_V=A1Cz+{a_S2AOuxsEx$kIcQA316f`X`_mObuJh}<4T)t^?p z9vYgoh)sAO2lh`32Elnlz$wZUiOR~d!$gGbUv^GZ9_H=dczJa)nhmkE zu_1d`0pB0sKcMn#FcyYo;*BeJrxa@ZZV!RIe;k9Mcf zA6i&j$KR=F5JgLmWaRC5ysK-zNH1V*-!f5p5--Bc zR@%UGB%vxQDjpIu`*{vEokJF3k|es}N!;3oh~^RY*Mto%-;fkJEz7yDUSjU&OJq}* zhhogfF!q+Dpz|-tt(wRk4ka)wZwd?fDAwVSt_(-LfA_}+y}B^)Jcr6Hqz{9gok2|= z&mcYhc{m+6|HWi{4y7wTYpKv^b>X*B9C9$+7Ho``_oIIDkD^{JWV%S?D_Er;3dS<1 z5U6i9&QCM5{(OBN!YjCBCV|x^@1r0k_d(Yy-@|#|7gPc|PF`ejI?jL51pZBb_)nV( zr{KXa9RD4_;g+8W+Dw~h!EIUv^XjN@7O3_&cJs7^goNPQSJ#O=w>{~Q%bbNIX2Gny zxraO0LwwGcSDbekL~aoa3k$}EnV@&6%8-4QM;F^3PT9V{Ir}0k{QC84*~}J><8HmR zCR*7dbxWMpLA z<;;_O&OrI7$d`Moh?u3?0gYR-C)V^=H_qfFrW{>AlO3!dt=~=;sgseCLN{tyge-yv zDJ@`ZyHjlWHCK*md_9oEog+pl`LaNzHaJPM>1)&H&J!f|7dJ~@Lh*vxPu$;Pi=fq- zv8g|U(_Hym-a9Xq6_!;XPdY=0$#5j~tCrh!t8tKvJVDjHZ~heO6E^Mn{-S>_+7pS( zTB&`CpcKv4v~C8$c9gndSP>^Gy>`4xbcR3gXLGO3T4*$r2o=XJC5C4Y=52KANZ+6lB~<+`@FPV}AuySF_U67VWdUzI=)?&yl-~t`m9Il@4-8 zO~7UDA4`^lc5!hzG@J?7M9pNdbCh*mD6bi33=`+1J3j1+GF?2SPAPT_^r1GeDqauG z$jFGk6ha{VB3^boqG|2SBFS^X1V!RrQujp?k+PZ<_INg%z7oA(J!d+G-I|**AsjL(JA-uzzRHDh$7T+xD7J&=Wacwk^z=nL)SBqgKHnWpYWH_%rFq(q3d41qw)8{Z8_tPn|Jmf2)?r zP@&vyUV+2*n3>xH0Iiqx7F;f9Uo798((4?d=m6xFrjXw|G^Br$?rS<<>+c3n#*Xe3 z*Neublr9Dj504obdC>@P-O$j`{wzuBrMin41ZRnshB>+j+H3#bjHGxVzMr6&j-Dok zeizz)f2rT=rvTT(KJr$>sZ7MdJ*S<1_hDlLivu*8SVPLnA?f~1V=TMPcDdmySI}i? zLGHI{sAnot(@Hg+BS(crl^J+`ZhL!Lq!9{P2E>u-_FON66{XHdrN@%U?K3 zZ#!ez;^=aX#F)ZZ_~fF?)*ss-;w%IQwDCV3FJx z!<~nym@f0_=|a%<(rmaiLwI+hmXS1#Td7L-Q@MV#4}aPlKtyuJvv)>DV}pZjWg=yd z&#tbJ?j7#W09*yi z^>VixYp%&NF;O-C&M@EyvAkedH9&ZI0O4Uh=27M&KkV9a*g6ww@nw%gr;f6nPB0FC z+K$G#x%5v_F28)Ok<1;G>L~#*Z*Tvw&i%t{qxmB454|768axQ`c6TYGMddCpKWfww za&mHR(J1xwXbTw5D2*VfPGtlJX+AA~Lwh)|GEHLZZ?y?32*vY<2 z3{3&f8+n*I4Aw5X@JJJZI>OAmFG0%z;gX z>VZv^&%>Q^E>c(vxfG3gfwk@j2|mBj`Qx;siRC{l^}f$mrC=r(6yo{=MAvxM^OkEPQomKm#!;#IG=?OGm={iGxG`qe9G{n@*#qxVdIIEgqb zx`(UDz>C3nS4b8E_g;-+O=E6uZbPY|bS)s}_klg2E?pmMSD4KEg%Zt;XFJeIBys3X za`>V@5h)x=vl~~MF5Xfb3@4`v2E|Mj6|G^idQd_YPDQBK+plkIyg&afnwFN9@NOM#e5>B!Xe+r?N2ysGCM_+EJaBk$P;X+<;RF&xV|y@%<@xIu=GywY zG^IHzD>jM!M@bbGDvO5FpUQLtR4!Lk%1!KmNPtya6`Gymp3vlW2g-)y)5BH#X^U=K z|4U2I`g|szR;D%dhR?H8^d3!$6VxAv@~U^HIe)FR(4HS)wdHy|!Ub~|Q=mZ3ZhttP zLx@DPLl0)o=FPW;oP6CI1x`$s{oGux;`&6seqCvWr@#QDNQ%$k5YL8Hu~_XxvzK3D z6tvXLY?_@l!$paVjEv#fACcU|tKD(`+Ow_bxq8rM-jI{~!lB^DZPnJ+jy5=*VL-Mv zHqh;l8o9XLIGh`k0meQgU`6%d<>jcb7%oW@2nYy(UJ2+Xc~3(VBJue6!VUt*XKTwO z;E$Z-oABJv&})r6^)1G#C0X^2<00QTum2e* zKyGxtVwuQS93IIMClD|-EojxE$E8)T(*?|z5!2!J+{imDOfujGR)6TXk)@T@CuCgu z7J8j7neS16I{Ruj(UEu`4y_I&qkBMZ1U0`co1bfycAODd%eJ(lYB z3fQvQV*346>esh7uYmgC4S&fcAlO$O;A!^t^;sJ&Lrz} zE>)&X??kTb?oy*mJcNkL5nWSrnPJ*!Bo$hxJ5+CfrZgCzIdC*XIPpi{(h{ir=Zv3pc`SHa$ukydL0QeprPcqZX^$v8!O}A8Z4aYxbH{;{u z@4gqbf`X5_v8Qh6odb8exBCu zx2|5Cyjz=}Pr#_(#8*7>2JU<}AU|I@Bn&17g zw4?Qkk{ma8qjmDsZ^_7%>+K7ToK#fsA0HoW4;Sz>H8mBA)Ox!@2>SQ!8lN8TD$M4w z!Qfn#SwFau+PX<_Q1k%mQnhFlgiICUefs_aXpUfMcp>4?jx@Qs+~40HUtJm8T^>L= zIy$0bV+(;xv17lk9|)FGi5)}%94V-|nfIviN~88pRe>lbFeGF%-XNKjnK|11;db@t z$ig`4x#7OO-*6IelXM8;60&z!>%acoTVqdr*3~!t3+3y$daB5$TS|CrB=WVpmS@{iW;@BG#LE%ieIH( z206O8oC&8%Zh*#|@K(U%e`IP8+r`r2@mx0wte-)n#(Nz99Q`}l?4
}rmJcl-MP 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 diff --git a/doc/salome/gui/GEOM/images/bool1.png b/doc/salome/gui/GEOM/images/bool1.png index 5dac3ca2440916ce5cbd0365510641eee1df295a..704a7a37db235057f37284279a6f39b6e5d66131 100755 GIT binary patch literal 24196 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 TaM^=nNBl+Zk!=3G=db<)RO`cM literal 12532 zcmbt*2Ut_vw(e3?lx{^jiUp|x0!oX3NKrxQMZ%^x1JWfxVCxnYqzgzdf}w>-385vZ zh#p@QjsI;T`}G2Mn)in?J~=Qz8QIPC8C6QgZ}w!#Z`3U=>N! z#EX`13SKAPR<}8L<`#EYa@rer?73TJ19Qy5l|PQHy9iYe_xh+(nAUSDS@-Mcx%V4k zekQBGA!p8g#~hOJ#u(l_SociW$?>4*voF65cZh!K@17GI=LxBtAH`;<2Q2(xE%x<| zVy8prySfPkB`c+mZzI>uC}CatH}(SJj#@h(+_@(Tl1x2WnQp54fvB(7&lQ>12<-u` z$|@$Wj0DzXfrpm`3>(cof|UT^pu1K_Opgz^xo^D^Y`_^oO-0~pVc*{l-@eoL&D_}< zj`Z1#A zxS>g&4en072PHL|lN(gKLZn(@85eT=ee^vU3*2BjjnBo8`BuG{pfMSVkPiKtv)qDW zt-n>D&XZwApjC_<9nb>pC{fno{nvv}pyAnJEQU998af$LEDU#<9-z6NR5Bvu4m?hw z4yJy5dO!s|w3Mp;qG6oUY2whko{mR96VoW>H)$@5pC1yWHR;eP$e|%j^eWkD?wwr` zdtOQP+_O%`Xqx8QwMn%pe`Kg5wzOEpxSMfeaPhhTZ*xtx#{K3gh1(JPTbmnAK-F-!HnPgk+Izy0vyB%|?;cS3h_bWtbYa@dy3nVHS! z1BJDNW705Iy|M51ty|4&FxklQn$F_~1{aw-l|#cqF17M~6-71yDer|KPi3bA>}Nvo zw(DyF>eAR6xsWU?0&KIc6}HpNq%@8a{QT`mW1k81icQ!gCJ!+iP)RmPyM`3jv|t@O4aWBH zCuw)r<#kk!_e_OWmRC6EOkcuR)Wy9z;8OD-aeKoQ~pmSM4 zF|Ml-sOp=`55z+s-VJc1kKM0!+K>=3nN8wX-561kFuag({bX|GrCj2WG-1Z>2_Ds7 z*YslE_Hc8thZ;J-9wtK5Ku^YveDuwLc5Tzbwo>WXQR>!4ct+&Ljpc-%NhZ}NNUuR` zC~aq+grjke$a!Z>EnZ!EpegoH!y!BT!PcjxiI#9r=TP`+bjn6ox(eJUFL`R9cEluW zs| z#5Z(*|8>d6Tbg7?${38gm3Fkqn6>?dwp5d6OlLHSF@q@a1$GTXBVMwt*}j!K?F&pF zvE*+gVosnvG-0`MXYgZ;KQnKn#6IGDM5?dGB~z)bIVXA?kSG%wn6>gO@?NlX)JO$% zeASH?kbO3-WxGfFfQ(Mdj@--u^;<&%@hh!T4?s<>=6wxKAby(wM*-up1$rR-DbyYW z3@*W4fT(L-2K{|0M|*tO0pRzoyE}pc68ca{lug6kt|s-=JT>y1${yfrX?fV=bI8}q zer~3t=-sIgxqw8EeFA`Z-@#otJ-oY;L%XhNDl04n2OM<+_}G&6*~q02ykld>(B|#$924Vgnjh19 zx#ud^wIePpF$$WpIwxo1OR2^GS~mV5yL@X7DL#i3C#K zFf0Rhdbj=%04^Dx!BT~yPqki@5>?-NshuQ5xS*Pwa!KqokXQ zsoSSzf+-o3@VLEY=`uJ=fp7T90qh3V;;<9I$D4$Rr*8Hnc(kUn85K_jU~fy7Sj&`|Cr`P#r{?8aYUPohO(%F$@sPeClKuJCi}f!AyJp+nIOZ_Mhd zR;g)KQHnExCciyS2yEq6y@tyIqRx4K=`Ga!P?3N;#_>2N*UFA?e1!Qf!uMwC83ChW zuAH^0o!-dp2@_f-4FN57x|7$ugI#$gw)GU;#)%U%^i?qZZ zNMj4JkVTrySTsXasGLejE`ewl11T^gN-c7#%FoCU=;`U185YwLnv~lMTEJ3^M9q_z zp2O9y_%K(cbT{+Ctc8Ts7`;?*Lu1le3+1Us%c^0=Zs_&gB>Wg}y8zCfec#5}M;8Y2 zXHJXR269Tb=*IHP-8HYW-re>NOTn<%R69B;&82y9%*OEX`*4%F@ixv*hvxi-VH?cy zc`DG`FW4`k^n{O)qi&T8QCFu)e>ig?uchRM(m?05yqBAs?WEsz_BI{uHYe?XfB>n~ zvWk6xhd>guqi*3#rS21+)CJ>i7sbrnTxjo6a+UKFntiN%PPlg7NRvKzmlU~rvLUDm zhe+$_q|C^GIqnpQW|>n#{`=AFn8$lTi;caiJ8#PsfGiw3ueInGF+rpD&I};W8b;u} zSMo$R>z|t&na;!|lxObX;J46nH*u9SGtE;R0jALjWqYG6PlP7Is8#mh<9~5x_m*?Q zos#c{IVT4W+)^#ImhtlUH%(q?laJ8bvf@n(bEv7Qkt!|GDJY5MpMG-6-Q8VTRb4u$ zR=?IAh`Q`ykkHLlmgS2d_QR($Xe95pnB$pQSt(~kHd*rCYLR!+-P|rIDZLuLp(K?S zBX#0NW>cVHz+;=^v3kcj!r!w4wT;mTVj=ZwHEnLr99%qfBX!YCaJ$vS%g4uOJLMk*H&IZC-z7oaFm)E> z&!xf;mS@PHQEKg&VWL3vx3w>7IrJVW)!cGxx18zPW?K>Cps9}mxvmDwrzXsicI523 z8lMS_7-B@ZHst9=Hb87I`)-iBO3RX8N)EXE07hdxbdbg_QAXUUa`&$IbYCQ6eH}{Z zd&Hl8JpYjmC03?CwHv9VAay)Vu3CD$wmHVM2F#GRT}#*80D?I%|BV3YesdaF`xVYY+uQXMM24>JM8%7$mw}PZYxkCC zDOAu5{F{TQGF>w5COK2^A)i)krFRaG=@Y9fKCGGVN%9&xPxnNbeC$Z#H}bZWBQ4Dv zPa;3VeR`W-lY&aRHVve_ z5W|@yh&+&~UgD2P%=nh7XbOhGNUl~%h;i}Bi2YHQ?N+qU=^7PNxln;>xUZ{D%fxrs zS^Za#UDtb?t|#W=<|~t9B%K3YOZg=8S$D8+tPi|wlzi;6#Ymw>(M#jhM_ro=Nd5_y zi-^cRfhd=!8XeU*8$(kc4J!qL8pZrV5A{cq@r4{iY4CR-t?%m2)iy6AA=}54?NyD} zWZ9B4Ya0_%tJ-)4;Oi`0ND_cMd-NGd=NOgC4!r(-drw?KLOBX`3kHKJa_MSnYN|zU zhu37;Sxs%PtgOhKG;;AceAV>QnGXMnhBDm6nszsPQe*chv9Y@}ecHlOnOV^G`|o=| z55-_Gr8t~DolXbWQBqQxgw3`3FkN?#g1TLqGx@Y=6iGg8m`irALCovbj_mg(BNvOz z@~>!CTBb?pPLk<8>c^BaZZ@d89k2;ysEVc=6)y$q>+6Twnzq#rZ2U^_f-=&X%wUoy z7`vnQ+ay9WBGj>-Et7*O%Hl@F{SULW=k|=BkaQ$5%;W)?1Gg5Et}x!dkLlq)14Ko8 z{%E(frY^+jXm%pjC(|)-#_ay(oM?V}!Yg70e2@6&%rS{_tNM(|KN`NZ&bvcc8ELY1 zmI?&nI;AHo725qzPvInIgTfYgf#lOm;>*jTR+u-7BPty%ckLYY5MyxTvp;?uT!FqI zg+ZCC4exz~YM~G^aP`RIvwASU^4{n@U1&kaU4lCUw)?e-;k5@yIHHA9Vojz z|3x(ZB{BH!P;sT%_wuZilP`!AHCX^4D_t!vBqX#;0D`93=bx9wd^kC#dJ`l7*G?a* zzAJ}(#LnXdLUEy_mR~Rh7Yio-PyfOUERq9PzVu0!d6%H<>Y_&yK*n&c8xY?c#9Ix5 z`$)ioXuB(j!i>tw3-9OKLAt=_2HbW}TIo;&;Whz;UbR&9V*EXaws4lBA$V+&>ua1v z15wU*0V@+mu{55vl=jY#eCvldvk6}1rI>&pPDJmBOSGfR%g=GsFa8F^AheagbhkfG z&a%IqYc_1`nnAWj=7_2f(abG$}U%va6 zj+4Pw<2t#I7-Rkz#z(OB!q@?nPq>pt??wUK1)BQ8s5r*c+rtG!VqITmP|lPMvQ@6e zM4fx*acR3udt-u+ZtUwP(PI6*V+C)|a{;!)U#H%^rM@}xsds#3C2)NgfRA?_*kG4R zvlFw*ny$lBL1)3=qdu&A412UPg&0{Sd}_^$eCenMl%yCul*uEc`2&YV z5ag1XyQb<7`vIDoup8ox1#bJ~#z!Ha!ByVK7CBdC^0xl!Q77Q*`-NU7t5uF$#<#r3 zyIr=zT&8YuL0i3j#@6FQ(!?N)o!qk0iu%hBzKWkZ033em;?c)dLtd!Y9Ar{AiK<-* zcBejw?sQK4aT2(8=1*`A-_QiEUFb*qecLY#@G0Z1kN%Im^`8(r2~n+I-UOz?%9!nT z9u4B)#vXB=gVlmt?;@NimjA`6QWYlp1-|1puW4%UAihlHp;SxcK^X!bQoD5Ypm@O*15#iz0rh1p+?o&qKdq&6L+(PfriD=hm*`uMB0AX zBfBd^l?{}dI<)_HHiyA=QtZeI5lgdzZ2HK~*dRIAYd`1u4opzP@1jj|NMU2k zqV^zo;=6*Jik`27n=mR3G@7|-n^E^%G2{8j$jFONE};4#TX0Hy>X^9p`%=+UCyGSF zel#wI)wC}YAZWs7-<$c3ukFfjX0GStWe$8__rz%+pzaPrq?PX4H1t@RujV2_En?$2 zbCc-{1}51-ghBEtT~7(rizL%?Ti2spr`RfRD4a&~LBNndG|_^yV)TK}yJ|1Z(^$qF z&C<^2vr;5UT6k-v!wpQx6_*H&jC6$VFoQ%Jl;%(E!WE`CLk4Nn#@=plBX{Wfv)7+< zdtnRkCZ8sTrF~;ysm8vO(T?4#ANyxisbb#V-ez`oS!!x(yStLGTu5qooK6m>HG64K z9?NEYovv)NatO6Ro;!z`gk>>0Gdyt@na&Xlr7c6{NA-usFt(2yVl#V8JX$v@1l)*ML7k@dq4oX@2dHjjoM6n0P0E}C$PG*{yyE09 z9wwa++U&q8uh+C13Dsm~_zd(jJyA{mIhGDpwjh4a&dtfJemp1y+)wWi_jb7*x~Q~* z^`A6KjS0;OWmFiQ)t&ylZLUeNR|`Q{b~R3~REAJqfBtNYvc~IJIYeNpBWxHeD&%@|u)F(VFfOrsF*)Grb3i_-ofo&32|776vV> z?2FIdNHa)=!{LJ@60-P4x__7kur`<|n!#}6q-m%_uq|1x7SaUIhJm=#PzDQk;lo1D z$z6t>lDBab=gM%iudA>!LpltWS(FDdhOElV%WotPf>zF>07OB!g=|+i{t(wJdE+`% z!+ox0!O=cw$YR8A;DiW#iIX1#su~+wKW~2L zfD~0G4SE09lpEjeWBrbN_rBX-TC3vorG$5T zwxxd}A<|wyuc?I7j6anyZ6THR!gC@JxO%(UpD6j`A{F%WOP4Q~%+LE!E~>oF%@uW3 z6aXooR+1>7Bi`Y4Y-Q@Xxm2-hSK2OdAE|b|aSfF`-?V`5=sXa0`4l*yT}XZxwq{5% zY*(}ST$E#+6ZgDz(n%b8+QQl!HFdhf3uLH>s^MEelwO>8`JM&cJy(|%!pu<@WvOG2*lj?h zth8?mRB-5zT>GBr)4cexF;e8YXI?kMHZol6;$>Dg2f{Fix@iYm+5yc?_sC+0W>^zq(hAYwLsxW>EPk_8FdeV!`i^~1QgJDw za$y3`*^5H=f!J=4cxAsq;{7uHr(n`yB82l{zRbxP!nQ2`F~%6g>?7S6&OYsQ06KJyYjv9V0BI$EtNeRjGH7X6EJVi!QaF5{UuBsqk-ZCNf~O z%P|h9VUJ4VD_`vxecuJc2SG9U{v4m-Kj8^;Ig3o zYk2yR%?ZV`H10os~k9$mDVm z9znsbZRr&n5RX5-<8+J0GPA^REr&8Xn$yByLPhqEo!%`^r-e`oN56!a%bW-tu7;)# zRv!1YDc}}T_1KDL*tR(0h%1$MNXc@a5@U)B-7`QDn|mhd%3~YMYRhPvU00c9?tnj1 zNN;p@b$}-&kGw!a*&$&h`%?G3?c@zrYDK!Su&Gv_6)1N!HZ^srx`H|E7eufG@WG-r z`UGz8DFb=Qdp3-Fk3JFj@*PiZ#8E*vBIhBX4g4)ge4Ot(bmwgV zm}=X0OSrzJ5NNGEFVpPAI1c75c8ozY2|;PsK*!laxtsR4SNnZj6{{e}0lpi}aH3>K z96y+Bc#}{=Ff668+yP;8qba@2TFMLVW}9>Ud?aZq5UJ0;_H#lu5jf>qBWyZ5b=cH+>FcP5Z8 zzZ8J$i9=DVg+Ttg)6OSR0H{Cpe-~B$DLMU1_2vJUi`_mC79TPx`+$Qof8%0>PjBx4 z03Uj{7vR5m8OPx8PrT!MuB+o9{c5;t3<@NJl}#afcQj5{gO!^<1fo7XJJZ30G&(db z4BO|9HM*9cnE|!3N-~U6Jrs~r|FjIn^cRY_`DghiQSvYJESJo(IWJe}RgM`w>U{om zX=~4)OznuoFUib(-Or)U1nG|)+@)E*_Vcx5l=OOt(}aLh7{oEjw(Gl)h=3it*%% zE30#W=sG-BF~Kx;y$qufEm^@t_%5ib43mFLqX#~(V9}9xu@NC7zN+B;0;Rz!{>vR; z*<=Gs3jc<(z$BJ_r0*xgY;a&o-p*BW{RIsZ>DYRYijQ~)wp^TwGkMN#3o%dVE>AWs zHCKQ|RP`|3q@!!+Xqf}xwxo!d%IQm^ZuU^rO{A-(u`UeJ6-1Wvu+b(jxZ4F#E2iJW zJo;98f9eX3s2^KSDR9}_-slr`)Of6`uoIjqKok{$V@o8hVqdSYOIU04M zsa`Y>YrOXJS^o?>=zc2V9Gj zC;mHW_+M!gfAz1^TfM&xbQByW1c7R;sI*J{LFCjn_Cgfccb_rHDvtwy(#|y z{5pANys{3}AfuXV_XbB+L3DE2d=6@s0R0hXPtO zgB0t95w!zVi?!2GRJ_;Zy1?szrk|U2Lns;K*1;x%F@I5>in$rANt`7R7=etq?~Nu` z9fBK|!OU*GT(*bdyu1W94uy@CqiC2G?OD!#QSWsGp%kNu$Yp0T$}z|^+J%lt=)>Bo zT(lTr36&&#W{JIJ6j8#s0i(Z@`x?* z9SP=FIgil$9&voy1L@B@iacJe)RO_eYa==qQ3TG-$<&vGFe z;sLj|IoTblGU%_+$k2GS?b|GBQkzfGeHn1Xh4O}V+(jKi%FcsP;D-_Dq&JMArDl#- zV+1y2HLVIEk;m^-LCA1Rcxv;P0zR!ldm$4F;toqH9IQXiH`3(dM8z0f3auAwedvv^ zMV{9`XPi6S&ZB)Fw^n1FFz|Isdw0NH^xsRqiX);K>s4k5or+z3Fww>DLCb|_f}qVZ zo{9Lq)jKNsYqEKJ)uHoC;u9YLpzs5!9{5kIJhn2A?kR+y=L7P!1eXflNj$l(K~jKR z$m3%J_8ksQJbZJ^;m0B1pnSi$Qkav;&exeTs;Mu9?eE?QoQHTQzb! zZ-|W7qNfM5s#iJ6Va}gJ?BNILaFwI*8U&gD`^KUf^vh(_;9Kz<#iotHG>jT^RH2g^u9CxQRT8(o$ip-gbMLHsgPmPDJ&&}w zR3oN6!p~eI*|v}(yWitWnsUgJm3iWf$2jPldgU`6-CvW7WJ&k>ek}IwKjkKeJ}0Ld zSI>C)o`dxVrp0>SArGX=8U?KKO!>F41OswK@X3hOQBT$PtJYi&P=eW4#zTI=gA z&`U9U8oEE@6AC#bcTNl=2opv%Qcz7OCGM6(h95J*U z{@bG0kKRHs=UZHc5QnlVp?prI=8T(+fn|TrNBP=^zeh&74Led_)ZqzVr!_eO?2&Nq zP(qQY{2OTd=?;am>FuHN2#jbXdgD>dOvK-;fhpY4e&c`dg_mADPj$m>0r#4fY72F5);($_xKPXvYfKC2RH}{|C}3-G0^&~%9(B(>)7*N5EJv_sFsjHT z+@&S5)4JkSz#u-FOLpUs0>q)hbH|oh@;;i6E$X{RM~^5%M<$hndaMQu#w*K}(QZ#x zI8DWPz_@Gk#e@YrkiRWRlmJ}-qN%9L6wNeCki97{=W%69G5Y+Tdm4C^K0TdTOu~SMgZ{B z`Tp{6Um=T59*6%Eak)TixD}nGD{<#Ug4zh)xoIN&v*Z1tc-I;~xknSBcOZAPmO> z8!L~uR`8{dU?xL*e40|O*OjJLKDr#U^zzK&NTps)9>4aiFUHxIG$>A6SRjGL`wbS0 zzk)=iIw)wWs7!fhV2o?R!y<-8#x3)PjgcF3WJ|JpjWElfra@CgZ&gg5+<%ynB5q95 zE{~nPdyWAvn*C6wBj6njSLC%3=JMD{o3Qgel(D)>ThG&QsOnaOIn38}+aht>Ui2yw zOnyKO7STLYcI!9|*65W&(_&o_b-O|g-hJVXW5RIE^G~lg^Yf+C@`v;qsD{mT-hCb3 z9imr>8(YFhz3nKuN`^zVqPz8&{atig<1Lo`uh>-r;%4PetRnfld3*#}oX%|OMtug) z34-=n6+U2*bqO9mSS7sNcG`e~7%}(tYv!@FdBMv0;N5g0u3`WolO3OKuL(sb7tSms z*|dU|m>;hhQZZYn?eKQ@pztQP?p}l24Lu6j8+&AS|3G=JxJfYf+rAnUal#$e!lt;8s|r7oy!$uTM`aD67H&#L)XDjh4|iyV3FGD5~gP9?xM$BpzVK% zmnRL#mXYgV14;yqiTZ9eLi5|Rver~s24fLC^9n|;3mubUbt@6fUwF#5<8fE$n4CO# z1s$8#1in|sYS{e`GBfYbyb@*P=MxV^Y8xe2A=}emVOGzemA@rVdTzy*Ml4#9QgVTZ}g$=dN} z-bE$xdE`(PT97*FF8ez@Kd#N}cFV!1TV<1 z`~>wVzy>1Rwf1zoQV-9gvG|WO`T7S;{^6v2EjF<5)8HP@Q+o$vcR&--jb73HNc(1_8HkdQE>--&-fLV8dMeiEM| zgCo0y)munNuaKn0MO55VcIQ3ZaaI4EAKIy&CgsFpiN1Kn@bIBOmg|Ej#!`=;q$s_G zK)y>j*po-B&_~o^@DbZPcSvD7ki3<6GFm?H=~0xZy*Tb;f7+)HUc3_({U+Z4lWFz~ zvG(kz;nw&pr%co$)PYzJidmS0Z&IE$XiwA+ah^eVo_^xw zXd0a=3SsV1{LaTs5r~y#u$tcgQzpL1S2dDJr_}KNbAW~oc4UjLgttiUyRWF^;=hz| zb98Rs^Pw76;^^EJyf5j3Fk&#gv_q@E-`H)vJRrD^7k_`hTtTg*kL+Piz&UfTV z%Q@2PQme?PzYJ`nWz-$KFc$fw@@eoUVxuYZDQ&Ha^yWQA>+;b~ENpVLoY>{WI0X1o z1{|v3<*Bi}dzR7rqhsyoG^FnI^|!jJ8E*9S^O^}3#KoD9XdLHmuBG_%hII0Uo0M7R zwKRCXt{bm>zG36cJ;BVj`H4*{WK9J9RKR17nm1p&< zvQBv5>K-*szDo_W?qkgCT$UUtMzqvM^ZiZ7XEEXII?`wRPE=4mH#`|(VTl$pm94`i zwYZ%>C>1ut!_!$w@z<^N0l6&oX0*0tL)Z70iMMZpmFDD;JN4SeGw0o1w1_=)>B&vw zd`n6MT0FU1UkZjXvL$WS5)8GK{YjOv?6XC4tkgLA#WU&M5>I*^rF4WthClD0P^+^I z_bISwHToT4OyE9!oGw?r?<1JhwpygL8q`rj=aZ%{_vf zfd>Y7dwf>`RxSNzmivmh z&U=uFFHl$hx1)VGpPpOTNvPtc>0R>bLW4(g87m$KJFw`{tchc)b2}VW&Hwstm9%uW zJ;z@7=ziLOa@eSSg|1z{^1@PrBb>5S4kfEy?A>5Btau_WP+WYJce3xRyaB_t0zPtV z&;uJr?S;0!EI*U%osovn&#b8d8kcfHlzbm8@Ut@M(1={0OAAlGv5$jngSfjF+ROBq zH8o!6lTKg@JaZVd_tc*k;@_$#`=V#jncr5hLdx=ntjifSbMR8h#IiOy5(VAf!&!8I zE}I`^l&$F^eeZ9qypXW=JLi10y<7MsMTpfO4MkiQ3pC-McopzGQNO#85M)Jx4+R%) z@Leu3IaGh38j80;VU=pM?D`I`Q19r7KjA zp;KT?Lx56ZrNUWr4;6CdpTO6ZON!nXPiDVr2)y^MgeCn7qo|b%KQ>95q4& zmsrgBVXsL?2HlCZ#d_S&+q&?u5Q`~{fYDE*#!nVCe94fto(=w%v%cELW{cVwDR!YT zv?it*#;-KGR=cWw**h%dX8=F*A(R!V-uEC)fzVjcorJMh-K4+4fdnC@QP;U8h<3w%C?9$Fi8bozM(mlrK@ zOgM?%!xq1#`H`0`{<++yl(#sxp4sE$Mt2fnGamQD0A^PA-5Zmxr+1CQk?fa)yeYbi zUVdVt)&mfqM}9i@l)@09zzOrkD5ZJY0RcJ1alH854atl24{af49*#l_wp!2M4wJ7W z`pWf4bbr5}*XDDkyPltS>bbDI%KGl9?b5u~d)eZvifc#!RaI@Z%zSUKe`aFrK8rPTU*>Fu9c@|pgJ0Hg_XwM`FtY&7>x}FbUFjq0Y;5I`AV|wA zEt~;-_CafEOj6#@mJzg=O(XhIseA#Z95^Jl%fe>p6%sWW(z5hnXy`2IW!P5qrT3>$ zVXVT+$a%BnL z&*FD(JibK1Rrco_24v_(6*@#HK zM5m<+kLNN+Yh%MBWYwimeiVI{BqiJ@a;m)c3<30612>LcQB|+f6Kd5BSWp7m-oo(V z<;WjF9l!jm*Qvh*zh8&(_Oy#}S5pY;nJI_i=%7fjXJq#m-1m#CQpSzF7tNX)L5-Wt zOv3)?0@oIxC@TFs@6(U@N!P;|&CXlraBKgYCtf`Zg|d~9uVty9g0>3NtgEkxY;-aU zvZ`>l#N*nR!BL(0FK~#$vI@;5v+cANcqlDAbSaAI%p7$x=n@7*0+C6~U;I3R9di7s zwvqbW-=8>8RUKs;ZOZZEGO=GsPnb>Mv4pBpB=YxTqpK(-s{GtQ4HaLZ zA72=21(QtkPt3TfRgBJC7zRYh^Eb|&Jj2Zhb$uk**^cLLyf3i+3JqG|lgV}`yh_tZ z9EkLpRn*w*u*Q&_;E2Gdw@D&=$D0&fXt}8yT{f6>*64ISiCZVY^Aa;@HpvhTE!QP5 z2I4CuR+R9xa+e8>RNkM#)b-Z=%haTIlqpLp#DvaW(Du&ETJPuxPRK}3TlgTE@o6k_ znCBD5_DI~i6SjT37Ol0aW?t{3Q&j3xyUtJ3`rmd92nXX7daxhlCtX*o-AuJ{YY8J~ zoR^2HPASFF?MzVj6c)Lur=w3*n+Z4exuwGQTGYU4N*?!gibdBwxbt$=ZV;Wg*UtvC zSiIPHDpnW`z2^OELS<`OQ`Y#F-fEJc%Wn?n39qiGsDL?}s%9G#`mnN3^4!2`_L&6K zkOg0Xh0xaoE66sLJ(2g>Cc#ksL+(P;U-~SWL=h&w>qESY`kLfbUFRk+aug;B%AWiY zUQHu?E6Sp8FrN5inX)v&9;Sn@dWvsV6rUE3YAg+xiUjq%ic439v7*e3RHI+xHR#{e z=uB6izfLm!wWdlmx`X!ZxtSvuWh#3VJ&{LHrseV3j&!_z^S|a}(boqN{9QOy4=(2(4B##m45~L{ zeH^5`>S}+~eOq1M013;|NrJpwa+{dX<1B%OHeSgt4cZmn5w<7IovZ4|e@{(O@@Teb zX4W=iB6`zuDHpSU*?6VVcM2UkkBQsQiGf)v+({@r4UmTw3X5wCalLee37)*X=P&22 z)klBAlnPPc_c;44n8M@wEW&4Na&92j4I}55)pD`eMn|Gke$so%mU!wm;%GUNp~gmZ z#fhWVcd;L|JA!8tU2UA&{TXo^oTE(ZJv?9vHwU+F;$5|wCOGtYm868vBvn)y$zoIw zs%9BfI*Wc+#O8%=jl7(&H)wqrAC*PB%YQ&AXQ;VyL|1J|*43YGO~u3TEg&yEq}rI> z&rujRAoO8;Ul_A|Ok#{g|4{Q#aQTNKU#Nwp!EqXnEYWCce$P{t!5%NYbn@F1qCXt_ z{T0>LvOo0C@_0il-8J03{6->h8}Ni~nPO95G(0b7!Z#zl@#RRKhJA*x3l{%Ph%l{m zq&~8w@E>S7=cW=f(;#8i41T3DA^BszKWrE?BU@QT@e@_YdMgCiL0Z)nGShk2xF&WL zaiJ6ELf5#D&NLufoXgHxib5b-{8P_v&y}?#zM}oEkH#y+Gn1ZL=)SkJVKsGn*ks9} zaU{aDnB1VFwizv0%j8o1V~RjEio^pMMZ$(c{p!cDzC)eLJ5k?~DoJ8F6QX>izL%9H z&RoSNN4xF*e09Eic_mp)zQkcQ@j0XXU5m6bZ>%>~HWi`7grch06TzSp0e8#aZ<=&j zl1m7mQ7;T%%q}$Wl&_$31cbiQdaM=gu5q~Kx;tZL;iG!^tY=kOck<4RAjo5e7WonK z;5*}fSHcKt+4V)XdtJ-1{pj;X-iC7|8M_d)@Np`P4@AQ{auTWbU>YzE@T~I-xyEYR?0Jc+k zBw#S*fzz}-gVeOe(oasc3|NvvLu^9}iG0|xIkQn^$}v>g^~1wJsJ)obFFx9sG{&T; zou8l$(`>SPGg`uLQ2sdEoH(gX9EPusHOhe5so!DDh*_9lcUG5zxp4Y+P`{n{#h0u& zh}`7Qg&4-NU*?sI4)xws7!;xd;>aYIhvvk&)QpN4k`a^oNwwArfwQ57c&(Cf?^b|t zRQl-;-RE0kGJCB%tr=S|HLh-LUciuJsR#$nnOZFK=m;Y_{S=P&Z;zB>huLa!5y+%i-w`n^XL8pV_)HjKE)n+-4po#_7UA3Tb^evkAp+=q)bA*V%aI;Or}=k znHWkbjq5{AYS|RUG8Y0GrXMWeRu3*%d*oC3I{!pZv3c~ZdX@=#^ckbFgAqSL0<2F9 zCuAF~h>@hFrJIh=`0KQp=4`ncwQ5(Ff+4wbvs`gx>GAR1*ZZx*CtEQ3IU#td#S2sL zS~obx;Wz~B*DW(hP4{=##hUeDQ+j@>n+fJfEw^V{j>nD_nk8|QJ$-%4k!yA=W|u;ON4j&cN#A3GvB6mbcR;j!v37keR}YSP{5sqh={18yZbtgxmoCb z^l}>R+BMG;<-i^F+nnR-jJ|n5E9}E_?8@&=+n^yK9^nbzRd5MkPYa^aLnLGpM-Cgo(tS`2YZ~>sE0-|rR`Rj z4U=gz5gZ;K*3H|V?Jp=ay239uv!mZK3#q|4QZQ*;8%gD0h1NT9Ib}V8&k>V#r1cdK zAOE5KabWT&N8}bPZ^gC#(6hPPeAHi9=tfF_?D_Hf;L6#o9Ss-PkI#>gv$B;nG(sjU zO->RzjC7}Ae`rJww2sq$a zyB}rcHx?47-wB>&%?`gMQCSi3l`hONt#|Gw9Rl<}+NJX{hnNv;(WgraN1aI^gdQe6 z1`87M=^vqwB10NTb%9UKUl{*?`snhu3V)|R)$Ol@Icz<@FswA7d!=m!EEFG8e0cjq zlr#T_Y_O=q?J%pH|oA5zXt4&*U^1y>C88Tyjw_S#+zkYA;iAgsc>)$wffXm3rGIC?E@9ea0vl4sx^@nATN~#!1k;Cgf_L7$U>b-+WnLi0{3#VphGZf-pwD7|dpebE zL7XiWy`CK{Tv#nBVnF^xo*RrCKihvsV3$3Jr~Yv9)Klbv+(dapIFE1pK$FyZwwH@9 zuVVt(ppm-Go;qRibRYy?H2%!PXU41;i!NGm@bac)hIY#oaltR`oepUgrd$>}qE0BU zpGMmTQSm&R-!ZwH`}k78T@jI^n3R3fef8Lg=}8SMDk{V!B;ru3nOiRWrEzFfHM@&; z2pBur@nwP&qA_*LQ1W1*vvAY>bFbSQIxzDb-(?&DMj=-NB(1nBn=SbF=ih5>TStnk zhs&q#hn~!VA5nEs%Jw?9>^~@ejh=*}A+T7f(^TF%s4&{^1Cn45=xd<@6so2wJl zJvq*1E$a@*wNSJaU!Q2k#p6BPv_(VTt1d$sLX^rl=dcHXvMau78g@b|o z2s1c)?w$3oPY+awH3#HZM%HsWH!wesWQoe(od_ZihGfxY5Gb?`5BGKuzWf}&{7)7S z>7S)auF;5349gL`?Ra>1I_wt{6NCCmj9niiQgk8=C5~#U-+CQOn~53I>;a|}xotGb zvm+%{(Wege4X;He{oeXXMw4OuBGB_zvVD!L!b|*UbE*uYTNa;^@)BvXWB~~o$2J-z zdN#6uO|(0_dnKnQQ7Q)Zxqq!4?)Z6THBTMv%&bhEO6-r)iWtNk`RyA;utHUO3JMDQ z#(AXT+t;X41`j0UY2@>8)MIeUbZ;tD_p&JF$Ov@H2%@Egmc+nXo5kN$;ad@F6I5w1 zXfWU}Ty0gyGWdE5*+NO8yOq5KBbEy;8q}qxnvq@#Ie)sFIw^>60o%pg`{6olpZN@= zwv<-WA4+S!qe?LvC6hAa^oaS@{DnM2>NeK~env;;5xMi%s+s}#YOmj>`|t3(zDf8peM25=680hni(Md&Mjmu*~-5&Ku)#NJMHn3x=W z??n_#B@|!u%84R1cE|B|S7%!?!I-3A{xwR}(%g?w`CNB5l1bTl;$G(%7r)Fl3 zK40)l2YLQFhtV&=b&3N~GxMohAI~gzbPlxGanZ=9yyD?Wz#!p9I*9hW3CK(LO?obT zGXfbjtk6(YEY~an74fj^h&zGZEK2XsQT)vLAOZ@6Xde8}x;tZyoO4mpX=re;*!Gi5 z;k0BH?n>r)K;9Ka+Mh6Ll)!3)%*)H$0`LF9Xf!=y&;qwBb&rjRc(%N<;&c67mwEp0 zjnsw_be70%g$LAT%nRq6X<-pKqWE=@Pjjorqt@X=t)N&~uh+EnpKaL_3 z)ZD8BNrKgVME_fCtjAVPd;*8Vi-1y+4(b(j3(3EjO zX7{Hqv{a|@YI47M1GI5=_AhUahi7ViNLIR|X$)*1hGl(CO_f_d4z-@E9)fha53fzvvI6Wg(89`XQ z9soNGdE42Nm5aKz>w0}-gWdbWzOu5?9+&T8qxBB;t-L&DZ*Q;hhH;hoCYrgONp%6F4khx7jNuIaw>7NxjFKi`{VbDbli6M{H8k_UswJH5Dgo zIk>pEAhGuj3@|v&Dk>1@6j! zKG+g{nqHb`HC6iarR>r=D);qv(g3v{hN^0RN&I-h9;cdF?=scv0hxT5UNL}fN%Exp z6I;ouH?EeWOZJP-d?L)gyN>l2E0Fu1TASJFdM6sSqBu~lVlKQXo;-O1#H6F6qv|5I%tCMk*hT^@~tPYDdUj~tz8nn zA_y2nb7?5|f1jrZ_tSSrr{QxIRhf;iKpm*LdvtYOb7v>igOnu6DWQamt16XFRZ^N*mQec67EOiNdk)`T1uSDHxRQ5p$kCr` zAm9lx4Jz9~WEUWOFgjgCmH6i*^gP@eaAKQ25a_;pFd&-Ck+BN_44j;CzCPEiCfm4R z>-Y>u5(@c$7khJO+hVE`M&oHtmn0&_ZcZ41{7pz^IgQ~))j#v6;9)@aT&n9zd~ zvJ^&NT8Aq)8P#+=`_^TxqWx4&X$LEe%B=6v46VkOcF){ zG0kKoLj>t1ziWh$&z1f9K%(Q0)A|6puyDFn8RMR^qa#~VZk!biBss^`cK}{}$)Zgd zM1X!Jg7{tH8Gz(_clvcVf+4=I074w7El|#5^E$Ienk>^B_J4xzeNMW%zCM;?MF415 z`CaVkoX^xegOACZ=l5F%lO;Oc$_j#=>wdP#i)kOv?e}-Ri1?goks#g&51b%L{e=@n zg?lOfb`8zB7RF{~v2k${(PV-w#E}WI)GDX#!5QEUkYuTq>re6M)vzFtVNi+nvd`C+ zH4&k>@$E@suQ3HV`DZhH!QWMWKD7h2Wi3}>In2yC85u}rQ!=Kexpv7j)~4h6N=VK- ze=*9YcC@1Rv4;;=x*zoP_LB4RChn$K<1=bL{xr4HxpJr-7Ec4>^RxEY$8hM)9{vv| zo%fE8mHWJn^FuyW`zx?vp&XD=0r38c%B^r^y#KfP1O(+AA~Ab5x3~oVJ}mkJz_XHD{E1iqr`(D{^iAkSy4T-xZ6zga zvgqK=O>-o*lEQTkeJTJ8H(`0tnHfCV2-pC7dUXAKyx{L#y_3ggX7D>1nPWkKI|l$5 z6>)avu!San|GxY&e!uxV%`Sa$Q6J=7TWF&^91UQVRGGW2bEEDkDmJz;C>b_(+oR_K zzj|UQ>m7C@1A~L7>dz{t;vJ4wrN2BQYcDtWO(Exd3@X&*vwJ)QnZ$3u-LMg*duuAx;HJ| zU-u(H&Q#V^c}7@{dcf4FzLyNK;HCiYbKZ?CB1+Zf-SU(heV}BQJ;j>VnP0tbOEkze z;`*`C`A6B{ky#v9dmM-LoCZ0Yt}HLFw}3n`p7uBq!f7=bvEOoCn%RiJz5ha|TTg%g%I*1r+11Hb4WI2F9T);mwLiak@h@$ux}BC*r2(3oy?WB&aG(`c+in&D$p;KjuS+qIsz_f|Io&4Pmn zG`qTLtn0Z&g}|~IJIIHF+zS^`HM4MmlSQ!zQvM&T+1)HgUC$gH9s4Gdcnl~4P%umZ zdIW4~U6>C7wsIXwH|t)P14u4E7`3{}Gk<&6{M9}*O`Ov6OiX4u=N7&Mv}8MW!Cw{> zK#8Tz(d?ICsttaBahP45)o8Y?u}jXPU0qurEpVdw_U#*@&?w>t1(SJ(2n(N?aaqrO znz5E#YQHlf)2mL4PnP;`p=*oJe~qI>6E)`>UCdT;BL%KDvl*`XDR3nW4!?B<1_qX! z?BLg0&x_jHGKCJ)R08a*S5g2~V4Up^{}Jec`VYrZ_;(Oo3ba5}9BO?Q!p&JIGany- zzuI71Ac5DnZMigExJyh-OnE2Rh5)gIUMm_unDunCYX?lL_Umlt8<$Q!eRd87mwA0} zc#r@Kc}+tTn;JWqB@vEv;MwFZkj7Rc8S!$7pNo^Trk(5e@84UaRVe2J4Z$J-D5FpX zJERh1FCHxV9v z>e)$Q#kMaWXIUh7|=n48mrOniHN4lC8+7rNS{T&NAVQmwJA(cGFSA^?kZ zv?%sGtB?+)^K{><(4ka*b&uj)3m#JWU0433Tm$HA?{I$}NY&1}(=l8&vtL=bGY701 zrs-w$Vo)KVZYbQ~8v|HdtXq>r()IT(0LJ?sS_zSR^Nq(#NzdzTM_hn_Qu|2Yay<6N zqb>dNdf{IF{9-R*&~!oQKgyCz z7aVC6P4sQDW)pEa6N-q4+}y6U#h17f5$v^Z6>b97L!>Bvr?UjYYM-=ZoU7# z{|PQi3DDA+Km^2~?D_rLkL`WkLyRqFlOmF<_)@JfE32@OdE`AAcUR0$tYxT}e=)XF zO~VuasU0f7$mQeviWBdD1LCSvwv?4mASwf^W_yrpp_xr8jYjTE0&W%4fb5@Z;k@KU(ywK35|8>V$Gz59& z{FRKHT#nv?uWSO(=Ny^%t279k`_rwht)DO77aU!{w(=4=t?+k*KC0)P#kaPks1~VZ zTGAC}ef#?LSN>?Ww+{)cw|J1xMGgER0H8-hv-=0ZyngwkcQr&Yq{6-_(Zae?wrTO0 zsn?FPslT6Ab{a5`_Y84XI`m5(9XSyRdGi46&&3C|bNo1ufD=zuIXqz3`x8;5B+!V( z0~%gaR*sA)Vv_N^6A^g;f`50R6_P!wk!_T1l;x)yLPbSYu@~zyZO!#TS^09Fv6XTh zzYnxaZYFI*oi>IJkNTOX1bQraW>yZCelvKQvc~2L$u?p(_YS(n#_lYNYckE4!R&cR z1G#tlCgF`eJw3)}&F7OBx1}M4`7NCpL@btF%fc9vvXVHG*-C&#jp{Q=0|BPJM~QN# z$$}k+T7GdQTF7+yXK2#}l)&e@>8Ow1`)tb$s1l%vx&uD3>8-lKmYw^po85FkA1Fr% z4a$4@_!*f%UAt>MlTKe>9DT)%H4@-9ha+>r?j~FGCjQn-M(CGEMa-;3a!nP>7)jiA zy0+CnKr`p&@|gE##Q-!n92^`3(k}#9Sy_>O=HwjqP(~m0kLs}yVmy1v^Y#08+@s@T z#Oxv^bK8|Vj;qFEC-$!yZVc&Y3vc^b{4GSGQ6RA29=Gu2JreZTV6*2t>J_-fxttMZ zcYde$Mb}SILPCNtvWrhIfIcyEvys|V0AffTYZn8$a6qeejkI3w2o*S8Ri1M`mb0F3 zh+DH`V8$_4&XYGe+nqrISvc(pI=+hgz6dCeAnAiX)5D#~(iLWf`<(Vy{R0E9`T3KJ z8nji{FVh6Qj&|9He-unX_4E+Z-`&-&p2txr4Wc>JKhbD5DLBV}t@{O&6zvxZ#QWD= z@Oq`?DIJpOP(m+;k=-I3x`6zOh9rXHzKJU@RewB(o|Z!9-^QD|JumgT+;A9I+kf9ve3I&{;W1IGrzuD6#gi)UJpZW~N!x?><)3pq$Dv(GWo;f(Nq;%a_1biyJ1^bmJ-|P_?gy`MY||7C zBF7%&TM##ts@LhMsNfnH7`&YJ%NWSt1;Px-0!(;r<=^IDE~KieGvx-4KqU`Tzt|aH z9oGX;bF?|g*c8}g(KafTD}pq5<98?+ItIUzi&bbahzCm9uf?g4HAy&Gb0tS40c>9) zbJe;DopVI@OE^YBe#XE*nw6jbG`d?1&?TfIK(gY`Oc%J5LAZQP*1F-ODkvyGpaHMF z=58oxbeMv2iS*j%hd96@eG{P}AsGtkLQUnXPk{8M=v}h?>+Vqte7?cW=<;Z-#R!1S zr)X&HKsj@5v>Ml2@X=IdP?F0IvBK_6RK6Z{VU|?JGOY^I^1JsUtMkLWE!$Fvz94hn znT&LW{~6_|e4`d#e^AT*c4TKK zr#X?`3^dfZBU@1iGcq#}by(XAUen@Z%|+7q%`GM&VKaGGDaNFXdF3!Dn%(#SD}tKR zHa>ZldSRUe4w}gk!S@#|^!F7nfXL-CrQ6-!P2dQV<7VA#5PAFrWuo8s`KQrrspHP{ z^la&>sK76s-_ji-^7Cm+n~vTWtI;FjhX(}%puXgzNg$lg!u%P4 zDS}Cy7kzNIL)N$nCL4h529h|7)O-S#KZa3Nkv>S`uxOX@^D7v0H8e8vIEU>2@Ve`a z*DcoH51Tk4R=Ylf6OELi^S9^>VV`aHpCT9pX)=%*p|gm?UR7=v2prZC~wjPi0UATyi#OUdB_l4bnD7>|(O zm0@A`?h6RF+i$g6N4-RxAAwsHmbW0CjISGp#?BL)bKILp(la>7c>Lxi=SR?&_}Xj6 z$VE|;=$=_XY@-P^*tUU|JFEy_F1>wlcJmMo9euQ!4>|j00#Qm=p*oZwW?|l-WH@h+ zhkpHvCpiMr%=ynDLLkeGPD_8~q;On_|A)_hq^z`^FT1`&bnzL#y|Q|} z%J&_i52p0L_}`coK%Szk0C)r0rWFi>@uvk`76%{+oA1p9vV|KEjo5DWo?@3HU`BK| zY(xjq8m0tD<)5!`z!49jTL#T+RFoIfYs3+KEaayb5dX?boOmas*g{1a30LCHU8VdJ zT-*f$w>|=QG;%tC9ozP&76GWij)tCzte<)&3V5(R3F1Rvrx|H<+xNWZOZYZYXem+& z%H3PUxMg{^dH7x(=dZfS+Gh8Q+pO7O^-g9Hl18^KyEpS+!U{9;(F(KhQ8apuR7GN5 zg9?F#m|3nod>tkN5J*Pnd-FFN{meuh-pF!EHS2Lxe@!|@?&iFYl^P zxYfrCOf4ro0DbVeeG1q=VIDCDJ^f=yF={c}&xF)=y0 zpWm+aH)Q=LQ>}Z#Slo4Ug#7Mi8YY_{5S>Zt8JoOMO*7RNTCH6LmOUv$WBv3mP$Se+n7F$H`U2;*@MlCGG=o~Fi>q4? zf$THLEY(7@uZ=7(C6t)wM7!8;9zRY+rF zWA3XlQWtBR%s@Lv#(en>pw`RF%a+m2^}%E-+}9J4J!3E!uP<9TQ?ry4AFOSZQut_r zd4ZDt7DaZ_)P3$r9U9DHzK|DNj-q@PzPhny#FkiS(?}QQxioILg`~`h2S6@Bw?L^1 zL5Asza5;6!Qp+dxfGT|8F7SFlZZWhweX)Kcy=e5T&)C%TTWac{s!l20vG;JApvPIF zna@sref#ShKlr zY8Y_9Um%rXAlh1>c)Jk$sJTTJ|I+<5m2JR`q^^q@e0H0h0&5(#Uvefy<>ED;$)y_1 zN;cq141Xl4I^uGxzF-Ycwk*@FQ&VFj23QR%i=6Y_*Hl5TACFKl54OzGA7)q(137Iq zihnPE^sI2RK{s2k5INv8t5FwHCuEZUzW^6uc|GwFDV0@KGeFC+nkqRZ#UUe;*VWan zfvf*)*g6MA-(B#@zn5}URIb=$b#Ze=Y#`KhS#u#y1}$0hzfHVtB5ky^E@^)Np^DVW zPOQ<;xfnmWzsSzYdWw#|0xGbHq{)KsHKR_0bHPvdPKBL@s6vE}u%w=zRusA|&-llh z%P?t%$Mpy$%dk7iT*YmWyKzS?LTRw2`hA=*Q~LXkhOj``HG%)aiV!*5?3_j z?WFz!*6p9lscEo@#gLyHjJO264erJlQd@zmCh|H_XG=ye=N@vi0=;4{$&~;dqSsS1 zrMolRZCX`9??LeU3x?6oWQo9;MrTcYb4x@ljRG40312Wsx(*C}&)jvMq0h!Mt`sr1 zE;m?}8C@JKAvgw*vsZJIZ4JR-ghJl#k#^2!?gA4`fDUxHS@qx9O~E)C1nZyB0d)c> zZNTpJ6!ibBxw3aWBeyvxhuy$~Cp8%7;jb(&_sv1^2naTkS(Ik(;%r*$)Fey?lR81W z&C6sO<>qCJNZ%rM)JVAmmJd}#jNi^Y6Jb^`uoqg6-Fe*w|@p0B5d&oH)E!b z*W&qkvq;J}2=s@cI4@rMx4rT!5e-?uyo{U*88=-HG957|n);S0hT^mqit{-5@ybLq zPYNbOn8e=B3(*_Xcc5z42o9Q6Xn3>Z$;9p$fooqNN>&9jpkV7<&ICXO`S8Lx@|{tN z`zY|6wED@_1Ct!_KZl+H_mcVUKS;pSQVBHH*ukZ%0OD~YuA^84cYoo?_#Oxil0q}U zEAoHhUHq?H8%4)7Ue4Ro1wz+AA{QN(PW5MC6pRF2xYKz8a3pJTbv)~TV-$0hZqaaZ zSYDPHjkv%Aogt2Y-c0^~wQFFX>N_kO0zZZLTi`E9<#P!`=-I%gac3zyo(;rnnFLhw zhu;?b|J@fU9~|2zh72py6V~-U?0g^1>v8lN_yQ?-d1v(I3kmMF&2)9iK(9{-mZyNS z2$bjnnS^fs{TAgixQgk&DcTRZnL$B!V6ECuhHEWUJKzX7uFKV(%^w2Rgnu3{Y{8UK6F6}yO$Ui{ z=Q$$*bguHfy<(dM`bjqsmlJ>lU8G(HEFRM)WsF8k?LjTK&yqfaE~f+EEeF8TKtSvL z85&E-?)eN*q+j5AKxmAOjS&s6u^gGi|3|`Z;hUM6nPcA}lZ+-Fj5M-aO_Uf0bRQI? z|Ezr%!p$UPKqK63!G+sMGTLA@Bu3!so(y!kzHcp54GZ*x>y3duBt_5*KfJU3KR8ID zfcz2~9bKk6-=}+CY0^)~<(#m8+FZXp`2JcLVF>}g!N<@3F?-U6wSx!dbzFT4(#lG0 zFSNpQ!g7I2LdhLes>D`(Arfwz4nrogEpTE9biU6l-S-P@OI!)}?y}6!5kc86{Q}psHrv_I z0(w1xgi_skn%CuRN$bY(u&~+enN0*lI4!Uqb>gfl%VcukqqgvgC&Elp3!fcvNu^15 zuav#NI@{@=9EP$P_h6-Y9=-WrwRL~fk-lo>*ap1jz1>~w7wHPdK!|Ud;yyhqh&$6$ z!UZw?4iTH8sq&0nT^*C|3##<$tOo6mpCLc;xjvJSq5-`{tJ3-}0|T=1KhyLF5?GNU zNVuaw9}@`+2S=<-w;4bXL(o@if?f&QCVMBB?EzzJ=U9CF2hb4)x*a<^3_AE9yeDXH zU0u0=7sLeK0LUJY+JTb)pIVqmDl^03|8@O7fE%$8de?MCLx#T>C>Q!btUf?1r$|A$ zjZPD+19HbRVu6qrpR2JVw=&CFhJVbsmgm5`a`hj*E8TF%DiG_SwG5UV38-(CmTPoZ zr#r!=J1ssw(e(!xle4yKCD6Zyi@!ea{%uYMOjK;j1t{GAl`AFTf4Wi*xBph!eD{0? zSdx-T(9fT*5pCZoB^_brzpdIN?-m32EUQn*w~(;qGp=(|3HXnpt~^XQ;B)9Yy<@B0F>wJihbk=pNTD@S3sGq zt}PkR_m=le3P614{1`8cqO6Hq}xLDHfLBm9_BBqXvs#NP#Y zk63YUp%~yZS?2neaVGnZ?+;yYWOJ^bo&K-J=if^i85y6{@Ap-|XbX2tL7=lbxoZ1D z%?>;-&Hv3f6Tjmnx2<;8P*qvUv?xB-JOJaX=CfqD%Y1U|f9sqg7>vqXG6|d)P&C&+xF6)H!^|vA*uGi^Rk3 z)a$;rx$${;;lMT0UCW0U8xq@GTI3gl?YYFWSNgmAaY9mT;4_A)p&E? zt(3nH2Fh{BDARq!=zPn4@_F*{sZu}g0o5!9KFbrlCraxB9(MXs0%c?SzQM-A|Tvkq$a>>zeR_I|e5+xpZaJr3rrQag z0h^N!ZQGnvt+^2mH5B#RVO~ydMF@6`VV%U_d#t?Hm=L|~&sr0zAtci`j)|;(!hTip z$PkwV-!LnP_=@;i1sjf;5v7AGm5RQ4SvVX^b2}fMig|3kN#U;?X7!WG z^@@EfCKf=Mq+ShZ@WW3sLxb^NEymcC6rB#!G+vuwiF}gqd?wriK*Duqw zOGJd=_GUte2U;aQVB)hVi$sUK3JvLrx#&z17yoI_VEq60f6V(4{nYmCApCO= zpjT%1*lb`?!a*C|luBCW2K zcf*p3i2@E=)C)`X=g?PP;w5F#Ixv2Ziz6>L%aExt+fUfF5xIE?I>CgnTzM$d0_?(|F|~G5ME4DrnMhC0oW+2TYwe_;1d1=!0$3#YWStI6Y- z#qi=O5GeJps<-kB3m+me=r$2T?G_}BjbBqxQYJH!%~$mY;-M0<8a^H$wNz12A+(lx z|GpjgG`}{mP8j+jl`q|50LBBeQ;?CVa!)BObLrj5h*G2Ec#R9Jc;AeG8$=8QKbX*v zs4z)shtOW1`^#ZJVgWBEdivkrVCDFi1qTa8#{T*KP82*n=Vez$g#`VGEE_c=W}^EOMdpm z#p;TJY;B1V9sY{CY_6_|^qQRfHQ$FrEn=w3LT#ElUrkMoJCOS7-1f)HFV zPw@F_F|W~N=`FBGQZg_+1KYS*w^=it-pQkS!@~e>6g_vkkE>MmqJwlHeECXLNxQ!F zLvem_xjT-8(xfk59NseMbxI&DpPRK1`0-o^xS!2^JOlw&@v~Z-K~Rq_t<_$)$^Ova z9XJM-qvQQ>AH1vOG#h$ZAr_3eJaUk^TvXOVXL`p7)4$FT3Fsi@ciY^*U%PD$0i?|k z1ho6^1?y;cw^SwEs5?3osbf%!D;$h!=8bSg^6N4q&x<7nNyo4Y9pa^uD{?klVBJZuPsrTkaDs!KJ68@2EUt za{#q}x!MB8(4{}v^f7FBJVo=5-%hvIzTNeKSOtiqt7{7j3&VvL9~)hCN5?S^HK$9? zmXE}-;{xaImBGHc1PmIl>V0zzS)s@bYjU>N>&s9M+kzGw!Lo>{oWp6k5^mm&&vTq+ zHh&|HwhoP-A7+<8LJ<=P8sN_yP2NPG@iDIoooQ6vmDDGCMc8_3fvMKkqYVoe5_%&E zGF<9esf0{f2ZIi4PE~Nyv zRiq5OYPDwT^Miv=nkC3c9bH|9edBMgY|_%w2)Xx!Ta7Bm7bv3z{4*9`4J7kF7yBJd z0iyU(IuR|syq%q0#7oW>NGz|+k^1`jUK`zkZ_&gwu;PKtJYrc>=L%2ibeJ3;�>- zoVnh=_f^XIU@(-zn;_)VAjg`J%+O-Qmt8XclRmd!Nui9 z`U8!jNLJo!5=1yFGeq`|3+OevVyv00U3q{y%1~=NZ&~S6pkZlcCAU{*#AN3<%MFzu zh}0^y(;BAdjc}qp7x-GWE?Z#=-#IF=@&e!I0Sr96*kR_l>8saY=1O-JwkPgzM_uhqzfD}bUs(^3-k&bi_5QWft2We4y?-0tI+`HDB zd2imEHE$+=WUVhN$(Qfs{C;PjefIvk?xaZhJXBQ;*uXT6@o5SsdR6iZ+9~>aH^Gwj zgGl-$U61)R;-eQnn1AlCYo6@ye;kPU8GaYNESV@K^oNmFnKd26$F~m3&OMRdKaK&c zT91~TNAS5UK5kDE>odUu{T35G`Kff|4_pi|9wLpR!B=ndJ1{kCIW^_#VP`9`1KKS1xk(y9VLVab$}z@QTQWi-RBL|FuS&q0RUeiXh@nAiQ)2v1_&>B>LdG9Tn#T zIcO(A=gj9ct2|;{YBsLwGv=v3(l9Y6t2Q|M1>QXmLiE}b>=42qOd!X?N*-_9l3$^A z+XGQ0tr_y!Y-X!;FS%as?_*vSc^^1R{ye6D{VUku^l)gn@M)lL%67+sqOzi#oIAec z7s(G6{f3)u(LFhC$o<2^84!imceCE^slDw5l0%B?F|DcO%*@P;+~O|)3AuZCPQ#Lp zzY<+}V*8^iXymh5dTlM!>UB5wkCKJL9(j$Jc7CB3`}^+U^g_fxlILGM{T6%|cA|JA zwZp45$Ae?TwLTJp^khJq6tX=H8ac^O?9iF(e9wUqXdFH6D01b|Or&x;C>@GZRaGrC z{Cd{Aa2oITprE^}oYY~lv6nS|%dLmLwL8yC1gaY?Bd6P!wktV87~!Gvytx>jWe+An zQ>BTatXyjhOje}`l}z#gO*e^S*T3{oJ$HCJzwk)@j7$H&Jhx>2d>CoEODxuopu3TfNk z*?m}zo1F|=VOC8g5^k%huzw=_`y;YNU6*Og{Hnghq&w!SmIHF^F1_a=rI}GI~qmCLo!QFd~Fzz3IJ#+j?Qwx8b(dq%2CrS%y=Lbl2z)n=yc2Irs6l)#t~h~!Vo?4DTbe(?ka z^v+|eV0pRztD;A}X{#~A*?n2|ht+-itJt;m2eM~E2*d*5C7k$18S9jzSs!l~vciVkdl%Q(`G9OTP z2t-z#-T7_+OY`U&EP>01J8Oi9_4W0_1uGldiJH&|2CZhq)Z#!6&gV&7d#xTiwHvEQ z5tYmm=Lwx&5y}?K_ARsQ5Un>w0(hWnkSP(TkFUN-R`y=h;VjU~4;6AYTF@!Y6N7J8 zW4aex0-oG#gLb=lK?rIlh!*q z4>WXz_rXnsAs8G&A|itBq+8Go%`}ENV0UeN7y?*QAq~~^lLJE5iAd=r@kuW8%IWF7 zA92W2(kFyQ;{)plE-tQa9C-UXly>(s#;Bj4i0r()udmc#O*sL8q2DE`0@zPQ)9ldW zx`_H0dm^B^R<1+w@Z7(tuV$Q+m)EF7rQh(yYmb7OI%sEUNGWn4LGo^+*-FjWX!-cg zHR`Ml?yG7Asmgg4l`BibRla{5mJNA+AWT#viLb7f0J{^n)_32Uqx2DBUW3~3wpgSw zh}Ys^5C;#^GBg^En`bwpUXwrx85s*77#w8V9(l+p?o0##X}_;kn$DVpl=S;a!7e6Z zUj%{Jn(h1sPAU8Ob=IGke;QjaYu?bVAVR#}jJ<@Ye~w4^8hS7oCCra`ZVsu;{7_$G zA8=21B z`;1uxyPYHXPot4yQ=AObcdS2KEh;)O@F>8$M)*{yW~)AQma6W)#aDhY9d$0~eAz7zc@Pt&dK*?K#BfG3AZ*_3kw& zg<;p!vgXS@JUxxZD;y57BDUi)pa;*NtcV0A1mUmI-CFyHpy#$ZH10+XVN``SSmAvv zwoN=gGn1gPv9Wm~g$%LBY&h5c6$TF+uQqmfn?Naa27wnq0LiIbw*o^V`NgKk{X;{y za|UMM*ASpVXmbXETY-5RId#$ixqMF!o@qJZ6g@0lqC~hq7Vt8pXJh>{f>BfJrreI` z$JT)AHPB`@lY_Y`l@9a*<(a?A?3NCr7RU6Lf|@OYl--|I&)n zdKWQdw@TOLQWpe#V(y)Lbm0^UW=S8UNJT&h z_YbhFAW&^I7BI6({=-NI=0yWVrS1`Nbe|q4fjBA<*xog_y;VJ}m1kyVMj$pptk!)> z5Od1>Df#Cja{UR5D69|3LtiIRWI-vgXSlO7Wbkcrk~vEyrD=l-?Qrzn0Tuweh{$CK z(R^N&)^c#k zpMBp#KG`k-EPC z>>5}l`7QgooW0T*UXU@HxiE;&&dvBOO|gcp~Vrt=+xgIn>eqK6W!(fWVJD8Wt1 zN^bS=?aRKlHWKcO8ipV~$9epKt{{z!uFlMBiHgkFG0wO1%De1YSox2X5SO-O^JEuu zjQS>TAT<-u_utP`J@l;Y|0!`f!jGmKRi9a&HKqjR_RgJ1>)qBOj(bWjO65YF(pc2D8HdTExl4j85u+h z>f*@xE>1^+tV_j%HID&X+9bC5Mvwp&Vf_CyLc)IL_J%6H)aNNFOQjNtwM^AH>Jk8{ z=$=LLT>Kx<&d7GYJTPQlXjwVA-&;T3%Xw9Fu-0t75FQeucn_{M@uVaymL@bru}8BR zUivqltxrtID~Vsxh*yym2hM#<7CCU5?ebK08cB##SlUP`WL8L_x_~r6@VPE)K6Ab; zOiWIWUPV=NlneN6Y9+J{ewS=TJ2m(wIXn=}czr%#D%`eNHmR+zu&}ToKrRA3 zq~*YHMqFD8s-#qC>JwwULPp-gJI8IYGjaOp!Q2(X1xfQAr7#e}+=d}HR3iIdt<=s7 zy&3X83llVB+Q?&`ol|IwL2iBpH%dM_Izk{gRg&e@)v2r8)@*l&2WRHpM@Q-H)gu$g zIr8DVo7|Q2jI9QD1D%;lJXv8U>!P@PIT+3C#|Y-Q2B1vOAb$P&MT_zjy!s$11e_iX zeSK8SzWc04$HyJEeLEaPXNB!1!ow~jjld0pSe4#lh8v84Z)BTOQw_wwV9NRm(0giS zB?62(EPQ+qCnvcJY63t{lMba0?utTt(}c($%enG~Lum?w37kvz>RgUfQ&oMPoE(W} z@=~tr0vYbMv8|`IhlkjN$J~|28XC7K@bL)=+4=b?!HY$RldZA}2vCuuwke=Tys8}M z52L+Q_7_0qAGlLOM0)KYcPd<#XaN64eUWCk{etu>pj%U$ zz8x`#UO7f7Z`uK&0g95d#k*!tVOX;6*Dz@!iM;Q9zIt!@&I8*EGqc}W`T2WN>%fov zv@6!D(4^&J&EAC9A?Do;tpIRoQ+d^n8z;z<+Gee&WSUEV(!6}*m#<6pX5aP}lpi#e6P#5WdK`;2_M?S)U zy!BmsVBW!JbjQG;jFMe`J0-?tKxk!NQhYPXT-*)na0uO%^tuk<2~z!>wtAgcJKiHB zYsGHo)Ush`!jODs?X(D)hYxWuIXOEvo?c$;l9G&oy4_MHxRA(T z79v3NcRV}}{ER|hHe`)S3ymoBJyW!`we2Vu2?eLo5*H6o5dnUc7jhs z*5mHpfGZ4K))epu@dE_1w6wIJ`FDc>{YSuk#c;IkPO{N53Hds51Wm8jvEP?2f_aGG(;8;;@l zA}ST>V?kcs3jax!(=WC6kw|19M($BRl0I8A9JSfZjvF0yCZoc@nSHl2I@SQYdr5=xV7*m~MUT=pak+Iiahmskt#LdqIK6^@$Fi&3pEy+U7kJ5YM-e1nHEZ-K*kn5~0**~Qk*~W>^oL5GvJ%Tswr>4#@in=2V%zQ#Y_&i?Y zp>~?fhD1U{r>33<9ukTujX86^U?IZY-o%SkK~>q;qqs#AU$!2WHlU5Er6m$s ziuLmLI=V|anKr^-PS?MYr|az55)=vk7}^(pw#t~RtQ-2N_4;ua4!;3a%uuofiyai( zfOzoW&nqgT94oW=*8Sl&E74it>mI4A2i0fc@muu%R&zL-BYIHB*^{ltiGS`KD-RD@ zL_`E695lLIyu9ziTizXwU}i0?>X}5I%zosro=I?ZX1Y@O!dV34Vtpi_1et8$G#8d` z*V%1pS2y|DiyR!_q-8D}D*?4WSR=n(U(nFg0%7>QOwG-KFN$DcjNi6ze=;VNyU3`K*m|Vq zT$kil_|G_(B6lwj47uMv9QD0SG$zBx_0=SECtR~38O3uZP~C< zxSL6hJOAoqO|;kd?SZ(wAQxa#j*ECX3fbH%SYKAn)%9xz(1Ov>x3wFQF#ClF?xKPg!yrd!D z+}lzxRnN%10EIRU9gWJpkeilv7OCP(2Xhh4(hew8mjHINOG!;EiZbCBbouFRVgsx@ zQczqDWO0dYgZ&8}kJ+A}IIT@r4vbU=lc=7f@E!pmn(<9ksrnFIz}%{&GCdyUlXtr7 zb^5?UJJHyseRAS>(!Yzz9pZnTlP9?$?#;9V7A9sG&VmdDEx-e z-;Nr^*0g^P1#r`E4GHtT+Wl7P%;PP8hlbzJ25-w;I!S4$;nsgWnt6NcUEJ&We}EV6 ztX?o#i#@`7^d|Uk0D~#ZdyozAT6*EX$smm!wJ@uax^ZRI|3Dx%h9NCHx@QFN7KVw8v34}gfMVW x96DxqawL^prO96A$^vg5tlAz^_;Etc5M{!A8a%uXH_Aucm46_Yf6Fl7KL9z1-<1FW literal 12393 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

!>ppD`ycB)$;_JS?M%p8#Y$vf+ zd^`Y6ziMXZ7Ukv^feY2oWVQl!R@Sf!9=eyBRy;mlu_XzRPigqPW{j$wwXqWSD6-4L_yGiztGNsBh9Wwz&O8WP>c__Q@GLj`749ME z@9US~SHN0$#pfHNN)3iYEsPkk)h`;+b$%8oB>(!L<5AAWL)nnPTnQcATqiCG%on*o zO(s5VF7%Tn-I~{X>#oflOB=P<|NP@2a0|DH4osdsVaOO>TLtE!+&hiM`nGkG!hp$~ z)6JTRr_ri_Z}ad70%8+>CN!k0-Zc8FzUK3H=<7o^fxC#TKHXRel?sXEQSN=%#pR!& zr%LEw7k9bdaida!_g{pt1DPy}T}PHe*C2Y+c)B<{yFP62p;Rh;@xrCo7pVW&(vb5$JS#fK9;ktd{g}}m#%81n$s3-U_tU7smXNL zi%V|JNemGT0C!`g21rZ+`vRm*ch=Y~ypQR5X8L|?a4dMUt%`%l<`heR4ZP{X#@Y=I zdY})HV<~>Nbv%{BQ$&Ds@B>|3Oa8UGczSkr=Jz6ZDH(}C1ZYb25GghHA@2WW%imqzlFZ$BfGaDq*Mj2>Gri>c zLs|Cmc~}G@Ph}i}Uw_}g|K1>Wb{n9 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/neo-section.png b/doc/salome/gui/GEOM/images/neo-section.png index 532d1f835329a2bb8ae77ffe4d2fd129bff2c5c9..901b1f3c2526e6cac1a79587717413cd0d559031 100755 GIT binary patch literal 25213 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 baK5WI$-C0;p*Y~rN+52l+*Qs|H1YorSTQFl literal 12571 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 diff --git a/doc/salome/gui/GEOM/images/ob_popup_menu.png b/doc/salome/gui/GEOM/images/ob_popup_menu.png index 51ae305d72372e5db3a74aad35957f109464b0e4..1d9f0e321674d3df40f8b16843a05637b8be76fc 100644 GIT binary patch literal 35819 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Ξ~{uy$}}{cY}Mwx=>ITN=D|jgt(yt7P!9Qdm3ppC_W(uvEUs- zmo_W7GCs6q07a|Ndn*S;1rCQvr2%NZ@&D(LKFq}yClZM;PkcF2>Yk;BnUOc`&FJ8}b`aRguh= ze6Dh+iX)7pc6*YFQsZnl_~!O^{C7 zkH3F@oGg-hg7_3lh#L*{>|@1%x-(3J{l-{N!ZjP|cQ4qHmRet#wa#17I?Njb)B%%i zZPe-v&9j_hQgE)RX1J!cN6y?*g6J&poBtRj!>E7 z1F?YHd+|Ng;IuSc|5~v5qasa#8VH~&5zWS=KANKHzpDp7IB{%Q8a_Nk-Cdu3-xthM zFroWVHJZ+H4yi$`C3t@Q@fz&aiooEqi&5S&l^Kv0;LwSeCqH)v9i}U4-gDJArR3&T z-K*Ox-30iK`+EaSm-um(Pz7>=r+E*usWeQmwIUN`X+9z4ZX{hWS@A;>dKO3gS_;!4^nu0}KkRzPDn0)<4*w z8>#G0(-)5V_mm`{FsR@NibM@ydFm5_E!3#ZU780h8xD8?i%Pp$(~-b>4hKlyZv89P z6xdt4aiI_wu2GvBx}Idk=VRGc1UMOTT1-jZ*-{Z?5Q7hHO@}gM?>!qwjnCt9-s^oC z-*@o!(yB+iv|@w~8K&gJ!t~?d`!knQ(@P%K{WYf{TANR%8`DqyqEN-ptRD>P3NFM- z@^PI^Qb2&NU>r!l7$E~0+c*e9uy3JZq=)MN8b$!Xw*t08{|^BEkH_B{W-dMOaFO6U zBf-_j2Q8crlwF$7#n@PNoK6dZD`G-;AS>SZAc!sg6U2Trk&k`x>KDTP8?vJGAlCV` zrhcZ&Y~Tcsps1ie2p#|RzvK}=ngZ)2R=MF(|DJCHC;0J6SJBq1SugxL81P3yMpgQQ IqT&Cy7+^X_H5m@acksx!zYFabj&484~>w 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 literal 13868 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 XFpcs0n}T0~0cuaQ9-|(;eEa_Z`c^RI diff --git a/doc/salome/gui/GEOM/input/creating_3dsketcher.doc b/doc/salome/gui/GEOM/input/creating_3dsketcher.doc index fcc0ba56d..651ebc461 100755 --- a/doc/salome/gui/GEOM/input/creating_3dsketcher.doc +++ b/doc/salome/gui/GEOM/input/creating_3dsketcher.doc @@ -2,41 +2,56 @@ \page create_3dsketcher_page 3D Sketcher -3D Sketcher allows creating a closed or unclosed 3D wire from a list of points. +3D Sketcher allows creating a closed or unclosed 3D wire, made of +consequent straight segments. To create a 3D Sketch, select in the main menu New Entity -> Basic -> 3D Sketch. \image html 3dsketch2.png -In this dialog it is possible to define the coordinates of the points. +The first sketcher point can be defined by \b Absolute coordinates X, Y and Z. +When the first point is defined, it is possible to add straight segments. +Each segment will start at the end point of previous segment or at the +sketcher first point, if there are no validated segments. -The position of each point can be defined by \b Absolute coordinates X, Y, Z or -by \b Relative coordinates DX, DY, DZ with respect to the previous Applied point. -The type of coordinates can be selected by the Coordinates Type +Segment can be defined by: + - \b Absolute coordinates X, Y and Z of its second end, + - \b Relative coordinates DX, DY and DZ of its second end with + respect to the previous applied point, + - \b Direction and \b Length of the segment. Direction is set by two + \b Angles in selected coordinate system. + +The way of segment construction can be selected by the Coordinates Type radio buttons. -To add the point in the list of points and to proceed with the -definition of the next point, click Apply button. \b Undo and -\b Redo buttons, respectively, remove or restore the last point in the list. +To validate the segment and to proceed with the definition of the next +segment, click Apply button. \b Undo and \b Redo buttons, +respectively, remove or restore the last segment in the wire. \n "Sketch Validation" button applies the wire, built by the user, "as is". \n "Sketch Closure" closes the Sketch by a straight line from the start to the end point and applies it. -To make a closed wire using the TUI command, the first and the last point should -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 +TUI Command: geompy.Make3DSketcher( [ PointsList ] ) +This algorithm creates a wire from the list of real values, which +define absolute XYZ coordinates of points. The Result of the operation +will be a \b GEOM_Object. + +\note To make a closed wire using this TUI command, the first and the +last point should have the same coordinates. + +\n Another way to create the 3D Sketcher in TUI is using Sketcher3D +interface. +TUI Command: sk = geompy.Sketcher3D() +Returns an instance of Sketcher3D interface sk. +Use the below examples and see the \ref gsketcher.Sketcher3D "Sketcher3D" +interface documentation for more information. + 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_dividedcylinder.doc b/doc/salome/gui/GEOM/input/creating_dividedcylinder.doc index 1b9de1e2d..169666a39 100644 --- a/doc/salome/gui/GEOM/input/creating_dividedcylinder.doc +++ b/doc/salome/gui/GEOM/input/creating_dividedcylinder.doc @@ -2,7 +2,12 @@ \page create_dividedcylinder_page DividedCylinder -The Divided cylinder object is a cylinder divided into \b blocks for easy hexaedral meshing. +The Divided cylinder object is a cylinder divided into \b blocks for easy hexaedral meshing.Two division patterns are available : + +

\image html dividedcylinder.png @@ -13,11 +18,12 @@ Specify the parameters of the DividedCylinder object creation in the opened dial box and press "Apply" or "Apply & Close" button. Result of each operation will be a GEOM_Object. -TUI Command: geompy.MakeDividedCylinder(R, H) +TUI Command: geompy.MakeDividedCylinder(R, H, Pattern) Arguments: - \b R - Radius of the cylinder - \b H - Height of the cylinder +- \b Pattern - Division pattern \image html dividedcylinder_dlg.png diff --git a/doc/salome/gui/GEOM/input/creating_divideddisk.doc b/doc/salome/gui/GEOM/input/creating_divideddisk.doc index b42460f40..2d471e6a1 100644 --- a/doc/salome/gui/GEOM/input/creating_divideddisk.doc +++ b/doc/salome/gui/GEOM/input/creating_divideddisk.doc @@ -2,10 +2,17 @@ \page create_divideddisk_page DividedDisk -The Divided disk object is a disk divided into \b blocks. It means that it's a shape prepared for hexaedral meshing. +The Divided disk object is a disk divided into \b blocks. It means that it's a shape prepared for hexaedral meshing. Two division patterns are available : + +
    +
  • A square pattern which is frequently used
  • +
  • An hexagonal pattern which ensures a better mesh quality and especially less acute or obtuse angles
  • +
+ \n Moreover this shape can be used as a basis in an \ref create_extrusion_alongpath_page "Extrusion along a path" operation in order to obtain any tube shape prepared for hexaedral meshing -(see example below). +(see example below). (Another alternative is to create a 2D mesh on the divided disk and create a 3D mesh by extrusion in the SMESH module.) + Example: @@ -18,27 +25,29 @@ Advanced - > DividedDisk

!@_*hdb%X2Mhu4x78BzQ*a{PExEaAQf4znqSQ8*Au6gZFO)||_q`q)s6sY1oW|`)5(h_;6)}o8 zxqWqEHZ;i>`r{XgSec%~ra9@PFtfkHUCpmwzZUC$tEXV&belR~hb7{Vlw!e`k4V1% zBkNa_kI1xqC2<+F8D%vmE?)DbyY=Z4VwRvg;{L>LzGqbq9ScJ;6IYY) z0PF>_f7}{BvZ?$ECnvH+(VVOSsgV&hG;Bdl0VEK=kilV`_J}8`3@W85Dz=bz+xb3s z_m2`8ggR!5?UqH}wrseY{Q2ZjRp{HF?$9F5?CVU;eFU4Ep3!wswE-eXv@F*V9X> zs-Y7+ipS#gr-w2#-`WbyY}642G=YM;Qp>>aGlim=JdUJEgcmN4M3uOt9PgO zv-zN3sqk$hSe_4#Y-F&k>I3g>XBJfAFl9Uz!*+@qg;FUb=Dw82Bsr~6_Kds@qo*LX zXL;)6pfa`p6ID@@4T8*`GtN#l?_x)Ud6?g1SgvHvN4iWU;WZ0HO_~V};o)lp(}X^` zZ+J4Pbm~iMqkNc#LCJ4KmV7$P_IhBg^Zks)%3N7-+v-9i+Vr?yo|!4+S1#KDq0&Qj zc06PDFHZND)K8iI$nV47H&uAD;MLp~=+s(K(NGoWaAYdFI9n=8VKL+3QV0kT_V@QY zoES)&a{&Fz(=q2LQJ?7*y4kj5&jfB_K_uXTOx<5}uw0CX%*B;d<9W6k8Wm+Jqi_&3 zWH}CG^-GSBI$RtgP710%mlPb)?bzzs z+XLz*@17!zGsdRh+1cAtnZp1cOTo;Hsybc}Hi`Jx=?~G4sdlsejCYakF@IzockFLc z9<`M#ODdPy1`lTU@Y)m4ZFnjQbNTe6=w=1lVhgCvJ?@Kd?kq~=AA>E_X8Wgl7IRwB z@CZIQ2l**WI&^1AX7!={Ac+>w50a_~?(7svL8J~?Z70M{dyl^Eu(P}AG)H>y`v=F? zwk{?8r;j|^vK1g)6*_Q1WR32`cx}iVib2#(AS8F0>C^t_`Crk z_^s_0_R5%)iS3y$yw53ie_KD{QD1i@3Opxz$f!-o^vI0# z5985^%;%|-^V1U$#K9^`WQuDU#J3mXumLiI5|cU((T$NTtUq zC@3he$&4sy(~rzraV=?B{BXV=EWyuGo zYm)xFlWEbeZYZ9=@)4phD>Grs%vYh$S6wz|NU0%|iz(aF_r$fVon6z=(CW4$JXLkA z**(s#`+z>&usBm%N}r)munq?t5%BhjZWPxV4T=rGBn|h6t#h$%IT@E z{XC+IHnePZTQt1n<4wD9_ou};fhL~XVswA|#dCHB4|=wrT!x-{Ce8$WlsT9}Z}ppC zP-wvDL)Rx8DmAr{L=I%AA~~2ixqhKM(0QgHNs}i&l*6nZLXjL45Yo=H=T2~!PqQFt z^?rn@6$URg49$=j>X~Z^`zjD;L6P~d%bj7I2D?@xV1s?%y~FGw5-UG}yB(z¥O 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 diff --git a/doc/salome/gui/GEOM/images/groups_cut_dlg.png b/doc/salome/gui/GEOM/images/groups_cut_dlg.png new file mode 100644 index 0000000000000000000000000000000000000000..248eebaa567d35b2d08c44c8230323f58ceceb8e GIT binary patch literal 18001 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 W9W}`?5$M{7D9Ncmt&n*c@;?B9S}vae literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/groups_union_dlg.png b/doc/salome/gui/GEOM/images/groups_union_dlg.png new file mode 100644 index 0000000000000000000000000000000000000000..9df9cd651a9c7f123a87c5da66f63fd2c8b2a2cc GIT binary patch literal 14922 zcmbVy1z1$y+V6k}BPB=*NGlD}4Fb~L&Co5~sR&4j2oll)QqtXBD$)(o-5o>CUH;EG z-*@hL&bi;ccRw=^!-BnL@4eRh{^EVZRg|Q$&`HoC5D1p6%u6*01SuZ8X`#qq#JW_l z3H*5AB%|vJfnaz2c_YO$VUvPECO1hPx0e>KW-c~PZZ?h%5N#U=b4O1~340S)R{=^@ zHx^fSQxhjAdmA&8KYxFxC8-Kdd-Uft4I4Lm3y7uz7^akVaddZbb%}?`LLih7*_UD( zUa5O?-Uj$*2(-gNGGAwAjPEvIyqv?3(Wx1sYY*m=t=4MwZxZ5@Z5Ti2#9P_kGRha0 zN_)S3l3=A56oJ0}hW;JpMLl!b#jl$?Vng03Ln04;)P+H`hZL2S8FrQliJX<3_a;t0 zv5e-oLm?2pHA?3T6CitUXvF%^KR>nZ7;^n62J0XzQmNdBH zwgkI@NNt8*uIQtCs`43YEJEVc!5X$xh;7=0frl@k{KCS#1U<0GCAI(1y zgT7kuZ>$m@KFwh#8f7Xm;;XRO*`RqwTi0+=>&TDFE9v~xb721mh zxfRj%sahwPv3L!A;B-U?!yR1Ar6a_HF6XM9#WcMnJp@bm+r@7zYjOEf_O}f^a_H*2N3$6Qo)fdN({QXC0?Q2Yr&CGgnzs{-8U71a(3dXDtqzS&E za<->wP5u6WVsW@zw#s_khK%lcu!85$5B;Na4of?k(9CX%n*!gRjTL^}%=Aa)i$0d! zciFo3EQt95XBwY6xAIJeh6+9BW&1nPB!c3WdH!|PM@KU2lb`DEOIENdWqG?^=fT)s zsnxNZw~_~#Vr>waT0hjjp3Hc7>2ZNImp3rlzaPJW+~si-M4e{;#JXWJ!eKbUEo%Dk4pi(%w=r=3F zG{1xSdoi6IG-#f7AJ-6ma&jMUdTZK_ch-V&W~!V&rCkW_wQo_5Fhesl=6@8=m(xiU zPw;F_zD9#<8tRUnHk%UkbXK2l)-+1DWPD2OGNa$((a5y7&TmpxztomAB5223=-(&| zfm3IeHO#-jXmjCG9GC0EmAcz`Dh|zDV|vswchos%wGn{Wy9&6yLEM-*oNn@-MPgy? zMBwOESr6ac`=K12>gR@>Wzg}uLP9fck98ZuhR?1YedVVlP}BC zvhWKE`=jwf(U~i_wz50Mu@_@mLxr{V)br7_3bRkb2I$GTZWOIK@`)6(B0Ow&#nGaA zLfc90DYXL!yvAf7vahbLXr!?L?ZJ#7oATCBFi?v!43T`UO-KlZKQGVE68ND&ZF{KaP_H175sMoJW z_Ok`)I82C8|Co;foDwFMANBbI|Gu#cq=|mtLyZ zM~g%@7#4ck=C~`Lc-Y{Ed?ET-4RR>n*X(Q-@lB73xi4bsWWv-q;^11hIU**Khmpmh znB3 z5SGVxa7JyaATEmL9NI;vpePzF}k{e1*wUzJ{z{vv_6V-9in)?&gDczm#PJK?IE|qJ@ zn3xj`TLU8d*=qc2-s=^+>`X{&55LUAm&8M1jp4&V8SZb4oL8Y3+Z!*Gj{iM3I)_W8 zVPur4Hi3uYy(QP4E-V^PU_>lTZF{ngHA;6rTkY!@Eh16W)KFjS956kLTYI2I3U3bh z2-S;-9Uo6|&@LSJr@f1ZRW$glWM(2t3Jxfo$wsXyqTYM4Vt)iu*~ z#Nc3h$vN@VmgGgDI3(C(6eMEwL}O3YEsYj6hBW*5Pz49T*LahP28?!(%b-%nD3{sM zxVg1Y*vaS+3O~{WN)|%TGQJu#3Da}oP`NEGniNz`Oq4`EW}yro8VoeQI*)rPg?)0o zodEl~eDZF)wlrn^D7YcwnE(rY+?AWFUZbV^zJK>r43(nbt=FD(;;3tOXb5F6Hn|XU z6)ql%`pBje3yEx(;x`sVDoz1uJ^vi4oGkV}>Cr1V=tz!=#QJs8vpX<7} z_x^6bZ=2h*!s6j9TswgKJHaz?iN7`p&Q#cvp|4xzr|}<-mgA>quBQhpZ5u0j1Mwwou$ijfFgqE5K%j?H~LPQ_)vhkVm8KJgR#$(7lUSPLVO zd%;=Kuy`C4S)rdXfv=>4D3#Ou8QAItJyzRdlpn@TO!zmh99CG!H(sCcM?F;+8vMthX4S2&-0~c%+ zJzc-ijS>L6XSB(?^ay^rL?bPFV_mF#u!PdyH&A%)MD_OCecZNc>oIRaQ)6&1QPN4c ze=OHP>Eerxo9mvEbnm#Ao~~=rHW$NI*++2S(Udl~fCngDo5Z}H+A(s92luCCg^V7`~4E-3>FjbnsK3&iuSxj8GpKj>!e@LFr^z(39WP z-qb{Rny)p7xZGLxWIQIkCEv!em7Q&qlkwQ|WH`RXxw=EFQwKj&KnxW`db(S*58pE3 ziX)N`64|vlrVd{z`Wl=YGF#;6D-I?&?Tx!IV^>ogGI2wi&S%!XUSDwFW2ptL3iA1Q zxnp2M$vambAm$Q33@a5fogf6Nn`?5r+K02PGBOj@FUr#bj<)!MRl0_(VRSV=@{@K_J><0Z5R#pSFXHvhwnkTI#tWAtBX@(va8K1L*Mh zPoLBc4fj@8&ArvvW#r}GLhnH+`%Vh;^Ya@TW=2QHI*Cac=;=RScl_oIOt;aE2C#!; z0)d!&2M`bu(FAv(g;*K%4fX%(>+|)PsZ1<2;L*wPJeX%FU`TM=URk+^iwY^DZygyK zxw*Y{b#-OO#6u5hfFr+wP<<8c-3EhH9T2Y$-K*Pd6?*(bim&k>9F$Z|Vp=m0?f1}V zP^B@WNdj)K+~*W(zKUmhUGLSR1!F=f@b9+rGGb|MinP?JsHk3@=O978+^gVfm5HU5 z2}&Cp?x&Io%F3^(sCaMpcr;HL*68sn`#6$_?V0THjOgS*x}Y!r-Z2r(&!i|p%*4b5 z+>ucEFM)tlr;D<$(cVWV(4a6|40IyE~n7YEzttEbXK4msuf^gwLKmW7Vtr z?p7={1x(lFE)+BL`vmrEro%bag!q;pUlO_O5hybrl&kH+=p2vOvSq%F6L~opVRm1GyZv9IbMT(>!-PT3IP+=~BbW zn%vynx;n4XT*Z~%XkM+t0x*?)A~~eZB4J(I(lS@Az~FYtHb#caQQlOeeay>oO+O3RaIqa=;uhVD_MzS1aZ^K9Sl5@T8x?}uLL4kh!Kg3Vr9AXODb)&_6p&PH)IaCZ^QkAR!`Fp8s)$j3GF5VWh zciJ%f{e@Q1P?J4A8OV!wejHWR+CWWDjw#r#gb&l?4(S#q`zvh;ipNLvs*`gI0!wbq;xoZFVig)9awv>; z$pPWmdJo1epDmJqk>loDzivTjjud{bK zY^;$a5>Qm?s6t<@7hy?Eq6!`{u@q%6JEkd)#4uMD7iOo5?Nf<%T|dYRvx(mb(`Z6F zJG*IqlBk}SUR1%W=plO9xmApMg(k!#?1+FAF-%2H%i_{$yDa0oE-Y~ zD;n8YaAkpmcHcizg|-G3G5ok%!RQKDk~wbfcxKA?#)McXwv-T%-f85Y+&lF)alRJdE-|%;(&yI5{P|I7~%-=Tyk+ zfp*)CR_f4~?;mrbQn~H_=D!tY3;x)i#ulvN<;ABss#btcbqfFB5A7sQwzQ7OtqwCG z4z;WzNgf%BOUPWhA%c8iw=+U?uWNuKo4?1)*H=(L0A#1&p^b&Rmo{TuIhoZYp=z9A zVwfkC^~9kje*h&)7jY*&nv|nVkB=TA?xCj%i}&3}^FTzJSO-s`n3X~$u;TASz4iS8 zIw{!=ZYXc+SNg1luh20vGGex}>@z+JpYeDJ0<$E0b@F6T6mfGhSbISakP3MacK`nf zUH^wDwb;Ln4rmD|7QhB(8*Alp;n%8FkBPkra^S~tVUUR;L+bwh*+u6!n^jd@cHHB` z!2k{~a3By=9jaCr7ng5^g=wj&%#Pp8kfixu?Du~bSy|4B zoOo4ZAtWpeAZ+tBbARdbvT3l2j`e35+AN!yym!jt;^M}}Uqbqi;eNp%Ur>JU>q`-` zap|eX#2~Hu7#;oaB{Aellq5VpAz}UCAR{G39;d51uwozvBn%vLN;Ju=o$Iw z`M`@#Q2G)_e`oQ{Timxaq0(5b0k;Bzh_*NP*oWD{B$f&ps(N}?rLnlUV1U>0_wPn4 z$Coc(YM77plk!gM^+?UifP?NX85uHA{trZc0lmGNExocAlv-?DY)|i8hOg9CI$Z2dpS;zi*py31h_^I1|CP$mDI#LT_}Awo zPHFAFMQbc{3=F_>zPx?Db2$v)#|&EXE?CP|%xg)&ZH5YF+wUL}Ec@GZ{Xy$zk z!e1Gpf!z@Vej*vPKT=c4L<2?3b(jewS;%giF1=C2x}qXy%gxXP={Oi;)4Yyyh%!=6 zQcKMJ{Dj1C%FD}1c^%$oAdG#k&-b8IX4%{m45TJ_J<4THhY$#!oSZzleh**`xwF*J zWw3EWLqokw2WPA8CVwSyR_nbwJ+wYI3^j2glZJ+OFFz6Vv|nfu28@T2(imLQJqfgA ze#qN20X{y;V6a8>iY=}7rzQ6(_&3I(rWcWh14RiheAN4%oYSlaGl-Japs8(tcvFr#I4k?l z!A;Wt;fdgS_n^F@Vz+Z@7JZ0#`^wSJzCO}wS=G3b5)nhB+pXl}=H%sdGWbCRpz?!(4DoXDdfiI&@p7J?7au=x+X7et)R~jrENU3efq&aMO)M?ehnhdk21A<&(iQX1G|JmG z`Jz@(Ra+YfUrWsJKc61Xmb%!S&Q?{wdP=HTs-QFNRuyG#X-Qp|2z~tl1rVf9GPLK^ z>HkHMw$eeeDunqhAPLtg5OrX@<}tatA%fACs9S$kE6CYsonl)NIO>lU_(Pw#wCV!& zJ!RvfqN3J{-CwxWlYtYkzY7cwn$Re)ChF%@e?SEzAAbCyNH7=33(~h6rT;Ng{s%QN zxlkK97B_ZIjtu$o6rhpLJhb)%gKBkoJLvK7yu>{S@%cnhE%p-;b8o@aLAGF=6fM3F zD|{c8i0_OaVMiftuJUET>d1pAosfIkQz@ZAlrz58kk=F4@S6^tP&2+acqn2YX~XfN zb7%iP4s)4HCrZ(6co0iV;fv19%gf8dbAGz&`;an$!o9#HzPnzEKxS{p@W{x>>KU*Qm~>9d?Nqc%l)+wL zvXvvaA7eg1oMn>TLT%Iq;ISOvSlB?}_iWVqwpe;AYeed7DFV?S(rLFhB zJ|8Mm3I1rns;nS$vsb%79}y81d3(7MeIL2AzAfP7J2}s>mryWH#^A=07f@K8&qXq# zaUMZYbaiz>&iJ$Mw#N(Mes?8?jiK02eh!#Z_!??zp7oGArV4ojth}6Ok_1B<`E6J zyE@y^F48e6Q=jVw>s>afP=*%0dzToH1!mFH(^FH6{rtJk4}J`&?pz}@a}pLf*VB{x z_3PJ`77O@bGX{yT|%|w-XS^tF~k!+4{yt(UV`Cjh+V+8IKtr$$_OA7TyDy1Qc!2)Id|cFoGl za&tWgAk<9+)6mkO4(1}k68uC71-vyFCwg$@1b%*gzRPvZTi(~#_qY6B^Stx9rP2F{ z6~4~rSFZFCBZg2ZoZ#$i8gUugM+M`yx29`rYfvgjN5^xEi~Tuyd3g$b49HMRQ7X*; z>hu8=DkCRn3Y!=kWA=C4YPr3prltn#%VV=l>q_G6;qeSgz2`!bVz=(<>}*23es_B< z?0as$vAVYA?d2s@lT}#AB%c4}%j>AJn;SongDu^$AlAMUtv@X90yhwcw-0x#^on!o zf2uC$4_kZePuW;vfLp+OrleDC8?W$80vaD5e|tN*V5vpMZ9Dceo~iKLHym+qZ|_2_ zVxK$s28F&VGhuIcH;aA^$UWK`8bFQu45ac~en`mCV4QB|1YBN&F-4OIGQ=@4SbBJP zIN$7BIqKlx;MfH3sdHY*qRzg#chm1^-WiG|{>Eu)$fVi#EM35Y@p?R+zsA3%e||oo z?KP5VIUf+rtgHi5;Rq=J2Vl~uXR$I#Q$%jBqqzod?l87pc4 zUQ7E3=LyjD&0%?3-`^7)J6+H-u-NpOBr$M59iN>|K>z}^dNi$W>zAnljs61pVn)JY z9=5fidgOw2bL<24=b#=(Mv+5G%GpgeoR zfR&1uA%HQ%I&cuk-C+0ta=5za5g>^fUiMSH3JGF>(i{DM;pO}jrRBJ|@)d=(YCS;% zgf~$auBoPHx~yvofef)OUgG{IbI784gD5vAN4K!R1D}v^VqO9Q`P}!vn?ZZ5EG$^m zn2?e(uGW8IzsVjOTU!r+siUov4D0Uh77-EIJ(Xu`iHnbSUmxW36Iob(qpNOYG`}kQ ziL=Dwv-(tTFB+Ie>Ay^%=`9c>JCmipUS6r9fdRWywrmPyKbpDRGR6pW&nT zGavko==NFxqTBH<0Bj_an9f{bK^A`gq%?I6oz;Vl43HG?@J_Z1OVL9*La#z6jr>{o z=)HD7mji&t+$GIt$}P+iJ^4dq|2Iw@?JqWEVvq18=Ni0sZr~@49(&ZX$8(+w?j9a3&L>jG!>hn`s}T@; z)ZpPZYCktpF#=LO$d*05z4AGKKJ&Y-7a2Atur!&%BS5JOBu%4wpPYsUpOf|eh6n&v zk0&{Dl`{qiMgEB+8)j@XYHHtyKpv<3=>{6BJnT6{ zfTQvQh461-1)@5)Ej4H7qkPruE>q_Nk>+SJ{^J?D(sD-@y{0hXCtBLto`4zkX|q-e z@;S14o#YU~IOgpCEx)ZdNRNwiW7vyLOM4=2-5zxRWMdFkZhBwe+2}?nh;q57dvB^d zTQ%ihxwIlC$UhHO=suIvLE5(ei51TPU30j(WKXE@`MC+=?$$m47iDR8_g6x}w<2+< zx0g^@M{j_IEKcy-xA(-udN%+N`}+EN=;f$U1p`w0-x-$g1MfGWT*qzQvn{(#k3OUc z);KPt0~-Ygr_8iF;!WngsHiu>7?uM*C=i{PjM5DL!KU)lYw2RGLJh{~XB0U$4S}t9 zP^xM@mQO$aq%|a18=AG|5Rf<1p3Y=>^uYc)^lCajcJX+YljG)& zr6f=L=FdvC|B$xe zm7*-g0iS3elai)<{-|SQRHDInu+SQ~e)`xfBt)D_QWb!TI%7OA5__X55`UQM z6({trm_XG@V$;(dmXd*k#v^~i#L0QG*!~uePRY&1r6SO}=htKDPtiZuTtZDwC8*fh z%ZsX*nYrwHP9M`qy{CkV7XVjk=IH^8tc(mXw~Iz=TR>PpTfCfhqOh^OKr@HQQ?W*!c}h;dvzx>-P1&yS}EgGkee>@)yG- z5kxmp_zpe^xUela+c~KKr(-~q=K*I$YK&aYNC#3CDlirK+R-l@ zcS=50l$Wy`0weht5Tlq08E-!$5d9!B-KuV4`_=&6b_#J%&*+r;Y{1HESR@@yzB{hZ z9Faw?pA#kKh15o+<$FhTvwjaULo5_X@SpPWznb-bOYmBacP;mlfkjqW6S#Spsr8Bi zVytI1z!p5T{ZPABt*=5aJDL<3QWd3?4%@qwrbB`hV;%P;tEpp(%27auWV${=`$)G| z;W^jYFJJX^kKd;XULyXmG}T&tBm>zjo7X!`&{U%EJif6_T#+X01>PZrX&&%0${GgJ zVP5(hiL5nF$aGFYlu*o0Xpk{YQ54#}7aJ2lPB7?x2?qeLVYow*5$o>Cj_nlW^KP_s z;tnT3jDxV)VriYp=)%y%CMtN4AgJ!gHynt|7|O7gH~uzFvuv&DHRa`7*L02W|xzq>aZjkwnhaWkFxRSL{}$N4Jw z`Q9vw7zzqXS8s1L8TUxUUhQlCMpcrib?}EtM127KXS`KUuzZ8pZ53iN^X*%y=*Q!+ ztQ32%K`r`^5Fp`~yGT^5v7hF!Ii@`!T{-fGQnkEZux`m{g*g~GxW4lMQSsd*CdVSD zzZm+W*Sz{h!1<=DBLsstu!dhifP~6zsUu`GPl@*@Td~$`MOreU@9v$pm{|K#r)-5l zLoMPmM=(S7?G!{KQXmohwH;;tT#4a~rcFiE=rnXh#61VE$*CZ?if4@9uy;vJ;)>b03IJZgFr4KRxDffETY#pfX7f=GDV=iq z>XBEa)!^OgCuNz~)e|^0lOpiusPmy{QE_n^yIBvo1Gry+mX?-`4D@<3g@lA;9$e7Z zue1?a&lHoZEcysDRl;z9uj&YdQ@L3$acB~NSl$IcPKV!o5m`b)LO9}i${8(AOC1gF zJGQpAWMpK7EPAKwDUQjlpCN826F=ArG?J5&_+7p(WlKh6mB3o>F5sb!jUCgg9UU9SMUq%mJRx78Yv}YfQ19K1pYOWKRa*bB2l#6?*2TCI6B2uJXr+vUBB=@(e5Q@h$X8jAvnr~qxpj`tCSkSZ2= zVeYI4aT7A^n81M8?E?;m-}U7c{AvrG8IXa&4Gff^hK7bubV?-#^=h<_+_y$7ma;4Z{=WGKg)D=8`Y`#0+_pI=+1=?Q%Xtk zg&(gK6%~2Td-oc%Cn=owv9%WI*ADdb^o);lv$H#cpl$G+EHSh*Gh10+2F6U8=Yi2} z1bAekcb6-Yae5U^d4H`QTU?$tZ+Z&FoN4|g7)dt$IMzrMjvpF&(AGk z9tZQyRaF|bsBR~X?mM|DgN!UJ+`>+2gDM&Y=)x^_M<8V(_fVqFZ2j1=@fHkXv_zC2p7 z>Q5f8c#8bxiSFKc8|V}ZDBFGuFhU()a`Y7V(O86)wY3!Nrd>1Db_D2>nwsP5iYe21 zZr(mVGt<+z=R1zJ)mM!NEu*E!TXY$W_z~ON+k-rTJYfD{6&sr^K*z^yxn*O4$^Ps- zl-xktcC$ApGE!T6<9Im*Q{v>32l5kc#SNao4WR-}R7^~wH;0|ml~%mp_&}vD1cRtT zu=VNFr@IJhpuRuRDH}C;l`A|OwXG&%GkOUHh@^(EsiPBy1F9`ow-*b*>W%KLtge1_ zO)800mO3s{o!$F>zRqSPH!1~~-N-lhT0nvW?Smu6KNM4V3*x>3Uo)nYS^_ng*~<!g_~n>#ypj*b*hp7@`vzeVu3+@9;l(l$3W85kIVl7e0E$HKxLQpcut za(knC7mKs)aj=tt)%FMbfLHR%fEprz%`D8ROdT^7>17)-jCSl@=L=dbs@BSMu81_N z+Qt~vfh;o3daYG>yIaY^pk3&5DV3AAe>IrO4orU2a$>5k^b-!%3xJ@C6p+~D*zLVN zknJy#TV7BaBbNU7ajyqA^qnc_I5|1__;hmAbPL5GGb10VBossgI|e5YJQ9Xyrd!iFW%<_byILv%WpWv%e;n#lFP>>^9lBaQ zk$eQQPbuZA@{0wKLoXI;C%hnwCD>`O1kQ~YgCGwN4h{|sI2b#W=rBK%jm@?3G9ZFH zfzb`Jxhf^C@a-@DIfiN-VST;^WyWvTq9Bl8!#_?6qm-+pF~eVrqCa?%^5#z`izYaw zu88clQW3bd@@vrFk@f;mUp|8SFE&u$Y5%{QB)6hc7@%$D%|9%XtN+O&nYf51-zP5? z29?DjZ8g2)DUNj`goTnm1Y%48N{;IWmG}RD%$iX(b+zIV>@ea-!`1_M6%Hot?&(wa z9g%iciNvjME{`T`x5K&pE)Rj5z@4_RHOa#4MWehM#G5#N9GPol$92KIk{Cl#=-uw;;Fy zTI%yUS{U>#p1@fgYBUjo9K+op?eaLzq{hUEscHcK0Or3o-WKqtSeV?5rplmqfe_WV zN(F5?tlzY_ocp$wUr^9@?7M2ccYSW-{&yznjI)6Sb<_bqLPEk^m?CIkxmmdoU0z<+ z8)BB=>>;ToG&2N#@2?czgY0OLtGnxi2SK1uX|^>maG}Lt-&aUcH%Cy(K2nPLpm4>$ z%d&i8D%qi;*P*Ls;b%hG%xyHjBKIx7(_-6@iA0`4lFMQnlE*+=qo<#rU%<^)@8O|S zU?Acmp(Rg)LGhQB=U0a0tK&X4nC~99VILEo)-&2?T-*Ea5Vz004vk^3g$H=gR@c|J zlW!MF5ckp00KT~$ElbvzOImb;j0KVtNKpt8L~Z*~;OVfmd;)VgDbYJTzPF!;%7)x` zCbxPdhBYiS*LF^f9zvl|baXx7qJpyBM&QM*=i3f6_|;WtNQnQ*9`Ek2hN}jkpdSEn zfQe}U(!Bwdv-~VJRN`!@y z3AoV%E&aLNY#?1&UrQ@DCBsEz4HQYO?u1--){9^1*CwS8@`wa@wV30@tuip$1$i+lo<96cwfwU0xrdtV|Zn= zpe&6|VIyz{DB7QDCmDCemiQJrn^6;S@8K9mK`Y|OS5I$d;*~x_1S1<8EWXZmXQFu0 z(ExE9y@2+R{1+i$r}YZYu1|I|0y7Ye6%{U{J&LIMJb`mO+N6$=mNq%}9TTIbn2Q^_ z-3^IT%

\n For both operations : Specify the parameters of the DividedDisk object creation in the opened dialog box and press "Apply" or "Apply & Close" button. -Result of each operation will be a GEOM_Object. +The result of each operation will be a GEOM_Object. \n First way : by radius and orientation (plane "OXY", "OYZ" or "OZX"). The resulting disk is located at the origin of coordinates -TUI Command: geompy.MakeDividedDisk(Radius, Orientation) +TUI Command: geompy.MakeDividedDisk(Radius, Orientation, Pattern) Arguments: - \b Radius - Radius of the disk - \b Orientation - Plane on wich the disk will be built +- \b Pattern - Division pattern \image html divided_disk_dlg.png \n Second way : by giving its center, normal and radius. TUI Command: geompy.MakeDividedDiskPntVecR(Center, Vector, -Radius) +Radius, Pattern) Arguments: - \b Center - Center of the disk - \b Vector - Normal to the plane of the disk - \b Radius - Radius of the disk +- \b Pattern - Division pattern \image html divided_disk_PntVecR_dlg.png diff --git a/doc/salome/gui/GEOM/input/creating_point.doc b/doc/salome/gui/GEOM/input/creating_point.doc index 9844a3cff..46da86628 100644 --- a/doc/salome/gui/GEOM/input/creating_point.doc +++ b/doc/salome/gui/GEOM/input/creating_point.doc @@ -73,7 +73,7 @@ position of the point on the given face. \image html point5.png Alternatively, it is possible to define 3D coordinates of the point projected on the given face. -\n TUI Command: geompy.MakeVertexOnSurface(myFace,X,Y,Z). +\n TUI Command: geompy.MakeVertexOnSurfaceByCoord(myFace,X,Y,Z). \n Arguments: Name + 1 face + 3 coordinate values to project point on the given face. diff --git a/doc/salome/gui/GEOM/input/get_non_blocks.doc b/doc/salome/gui/GEOM/input/get_non_blocks.doc new file mode 100644 index 000000000..8df0e324c --- /dev/null +++ b/doc/salome/gui/GEOM/input/get_non_blocks.doc @@ -0,0 +1,23 @@ +/*! + +\page get_non_blocks_page Get Non Blocks + +\image html measures2.png + +Retrieve all non blocks solids and faces from the given shape. +Collect them in two groups: solids and faces separately. + +\n Result: Two or less groups are published in the Object + Browser under the processed object. Reports error if + no bad sub-shapes (solids and faces) have been found. + +\n TUI Command: +geompy.GetNonBlocks(Compound). Returns a tuple of two + GEOM_Objects. The first object is a group of all non block solids + (= not 6 faces, or with 6 faces, but with the presence of + non-quadrangular faces). The second object is a group of all non + quadrangular faces. + +See also a \ref tui_get_non_blocks_page "TUI example". + +*/ diff --git a/doc/salome/gui/GEOM/input/tui_3dsketcher.doc b/doc/salome/gui/GEOM/input/tui_3dsketcher.doc index c9760fbcf..4916dfce2 100755 --- a/doc/salome/gui/GEOM/input/tui_3dsketcher.doc +++ b/doc/salome/gui/GEOM/input/tui_3dsketcher.doc @@ -7,14 +7,43 @@ import geompy import salome gg = salome.ImportComponentGUI("GEOM") -# create a 3D sketcher (wire) of the given points coordinates +# Create a 3D sketcher (wire) on 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") +id_sketcher1 = geompy.addToStudy(sketcher1, "Sketcher1") # display the sketcher gg.createAndDisplayGO(id_sketcher1) + +# Create a 3D sketcher (wire) with Sketcher3D interface + +# get the interface instance +sk = geompy.Sketcher3D() + +# add three points with absolute coordinates +# the first point will be the start point of sketcher +# two segments will be added by this command +sk.addPointsAbsolute(1,2,3, 7,0,0, 10,-3.5,-11) + +# add one segment, defined by two angles in "OXY" coordinate system and length +sk.addPointAnglesLength("OXY", 45, 0, 100) + +# add three points with relative coordinates +# three segments will be added by this command +sk.addPointsRelative(20,0,0, 20,0,100, -40,0,-50) + +# set to close the sketcher +sk.close() + +# obtain the sketcher result +sketcher2 = sk.wire() + +# add object in the study +id_sketcher2 = geompy.addToStudy(sketcher2, "Sketcher2") + +# display the sketcher +gg.createAndDisplayGO(id_sketcher2) \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 0cb092228..7f230b142 100644 --- a/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc +++ b/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc @@ -37,6 +37,7 @@ Add_line = geompy.MakeLineTwoPnt(px, py) arc_face = geompy.MakeFaceWires([Arc, Add_line], 1) p_on_face1 = geompy.MakeVertexOnSurface(arc_face, 0.5, 0.5) p_on_face2 = geompy.MakeVertexOnSurfaceByCoord(arc_face, 35, 35, 35) +p_on_face3 = geompy.MakeVertexInsideFace(arc_face) # add objects in the study @@ -54,6 +55,7 @@ id_p_on_arc3 = geompy.addToStudy(p_on_arc3, "Vertex on Arc by point projection" id_p_inter = geompy.addToStudy(p_inter, "Vertex on Lines Intersection") id_p_on_face1 = geompy.addToStudy(p_on_face1, "Vertex on face by parameter") id_p_on_face2 = geompy.addToStudy(p_on_face2, "Vertex on face by point projection") +id_p_on_face3 = geompy.addToStudy(p_on_face3, "Vertex inside face") # display vertices gg.createAndDisplayGO(id_p0) diff --git a/doc/salome/gui/GEOM/input/tui_get_non_blocks.doc b/doc/salome/gui/GEOM/input/tui_get_non_blocks.doc new file mode 100644 index 000000000..6f648f9a0 --- /dev/null +++ b/doc/salome/gui/GEOM/input/tui_get_non_blocks.doc @@ -0,0 +1,32 @@ +/*! + +\page tui_get_non_blocks_page Get Non Blocks + +\code +import geompy +import salome + +# create solids +box = geompy.MakeBoxDXDYDZ(100, 100, 100) +cyl = geompy.MakeCylinderRH(100, 200) + +geompy.addToStudy(box, 'box') +geompy.addToStudy(cyl, 'cyl') + +# make a compound +compound = geompy.MakeCompound([box1, box2]) +geompy.addToStudy(compound, 'compound') + +# explore the compound +pair = geompy.GetNonBlocks(compound) + +if pair[0] is not None: + geompy.addToStudyInFather(compound, pair[0], "GrNonBlocks") + pass + +if pair[1] is not None: + geompy.addToStudyInFather(compound, pair[1], "GrNonQuads") + pass +\endcode + +*/ diff --git a/doc/salome/gui/GEOM/input/tui_measurement_tools.doc b/doc/salome/gui/GEOM/input/tui_measurement_tools.doc index 4ce9b4239..583f3de0f 100644 --- a/doc/salome/gui/GEOM/input/tui_measurement_tools.doc +++ b/doc/salome/gui/GEOM/input/tui_measurement_tools.doc @@ -17,6 +17,7 @@
  • \subpage tui_free_faces_page
  • \subpage tui_check_shape_page
  • \subpage tui_check_compound_of_blocks_page
  • +
  • \subpage tui_get_non_blocks_page
  • \subpage tui_check_self_intersections_page
  • diff --git a/doc/salome/gui/GEOM/input/tui_test_all.doc b/doc/salome/gui/GEOM/input/tui_test_all.doc index 2fe8d7623..56beffc5d 100644 --- a/doc/salome/gui/GEOM/input/tui_test_all.doc +++ b/doc/salome/gui/GEOM/input/tui_test_all.doc @@ -40,6 +40,9 @@ \anchor swig_MakeVertexOnSurfaceByCoord \until p_on_face2 +\anchor swig_MakeVertexInsideFace +\until p_on_face3 + \until S = geompy.MakeRotation \anchor swig_MakeLineTwoFaces diff --git a/doc/salome/gui/GEOM/input/tui_test_others.doc b/doc/salome/gui/GEOM/input/tui_test_others.doc index 2b1b44c7c..e89f89957 100644 --- a/doc/salome/gui/GEOM/input/tui_test_others.doc +++ b/doc/salome/gui/GEOM/input/tui_test_others.doc @@ -79,6 +79,9 @@ \anchor swig_UnionIDs \until print " ", ObjectID +\anchor swig_bop_on_groups +\until Box, Group_CL_2_4 + \anchor swig_GetType \until Type of elements diff --git a/doc/salome/gui/GEOM/input/tui_test_spanner.doc b/doc/salome/gui/GEOM/input/tui_test_spanner.doc index 5c9df4651..81b212de6 100644 --- a/doc/salome/gui/GEOM/input/tui_test_spanner.doc +++ b/doc/salome/gui/GEOM/input/tui_test_spanner.doc @@ -35,6 +35,11 @@ \anchor swig_GetOppositeFace \until id_face41 +\until id_glueALL + +\anchor swig_GetNonBlocks +\until Spanner is a + \anchor spanner_continue \until return Spanner diff --git a/doc/salome/gui/GEOM/input/tui_working_with_groups.doc b/doc/salome/gui/GEOM/input/tui_working_with_groups.doc index e608a0923..37813417c 100644 --- a/doc/salome/gui/GEOM/input/tui_working_with_groups.doc +++ b/doc/salome/gui/GEOM/input/tui_working_with_groups.doc @@ -2,7 +2,9 @@ \page tui_working_with_groups_page Working with Groups -

    Creation of a group

    +
    +\anchor tui_create_groups_anchor +

    Creation of a group

    \code import geompy @@ -42,6 +44,8 @@ gg.createAndDisplayGO(id_group1) salome.sg.updateObjBrowser(1) \endcode +\anchor tui_edit_groups_anchor +

    Adding an object to the group

    \code @@ -107,4 +111,108 @@ gg.createAndDisplayGO(id_group1) salome.sg.updateObjBrowser(1) \endcode +
    +\anchor tui_union_groups_anchor +

    Union Groups

    + +\code +import geompy +import salome + +# create a box and some groups of faces on it +Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200) +Group_1 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_1, [13, 23]) +Group_2 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_2, [3, 27]) +Group_3 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_3, [33, 23]) +Group_4 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_4, [31, 27]) + +# union groups +Group_U_1_2 = geompy.UnionGroups(Group_1, Group_2) +Group_UL_3_4 = geompy.UnionListOfGroups([Group_3, Group_4]) + +# publish shapes +geompy.addToStudy(Box_1, 'Box_1') +geompy.addToStudyInFather(Box_1, Group_1, 'Group_1') +geompy.addToStudyInFather(Box_1, Group_2, 'Group_2') +geompy.addToStudyInFather(Box_1, Group_3, 'Group_3') +geompy.addToStudyInFather(Box_1, Group_4, 'Group_4') +geompy.addToStudyInFather(Box_1, Group_U_1_2, 'Group_U_1_2') +geompy.addToStudyInFather(Box_1, Group_UL_3_4, 'Group_UL_3_4') +salome.sg.updateObjBrowser(1) +\endcode + +
    +\anchor tui_intersect_groups_anchor +

    Intersect Groups

    + +\code +import geompy +import salome + +# create a box and some groups of faces on it +Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200) +Group_1 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_1, [13, 23]) +Group_2 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_2, [3, 27]) +Group_3 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_3, [33, 23]) +Group_4 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_4, [31, 27]) + +# intersect groups +Group_I_1_3 = geompy.IntersectGroups(Group_1, Group_3) +Group_IL_1_3 = geompy.IntersectListOfGroups([Group_1, Group_3]) + +# publish shapes +geompy.addToStudy(Box_1, 'Box_1') +geompy.addToStudyInFather(Box_1, Group_1, 'Group_1') +geompy.addToStudyInFather(Box_1, Group_2, 'Group_2') +geompy.addToStudyInFather(Box_1, Group_3, 'Group_3') +geompy.addToStudyInFather(Box_1, Group_4, 'Group_4') +geompy.addToStudyInFather(Box_1, Group_I_1_3, 'Group_I_1_3') +geompy.addToStudyInFather(Box_1, Group_IL_1_3, 'Group_IL_1_3') +salome.sg.updateObjBrowser(1) + +\endcode + +
    +\anchor tui_cut_groups_anchor +

    Cut Groups

    + +\code +import geompy +import salome + +# create a box and some groups of faces on it +Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200) +Group_1 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_1, [13, 23]) +Group_2 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_2, [3, 27]) +Group_3 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_3, [33, 23]) +Group_4 = geompy.CreateGroup(Box_1, geompy.ShapeType["FACE"]) +geompy.UnionIDs(Group_4, [31, 27]) + +# cut groups +Group_C_2_4 = geompy.CutGroups(Group_2, Group_4) +Group_CL_2_4 = geompy.CutListOfGroups([Group_2], [Group_4]) + +# publish shapes +geompy.addToStudy(Box_1, 'Box_1') +geompy.addToStudyInFather(Box_1, Group_1, 'Group_1') +geompy.addToStudyInFather(Box_1, Group_2, 'Group_2') +geompy.addToStudyInFather(Box_1, Group_3, 'Group_3') +geompy.addToStudyInFather(Box_1, Group_4, 'Group_4') +geompy.addToStudyInFather(Box_1, Group_C_2_4, 'Group_C_2_4') +geompy.addToStudyInFather(Box_1, Group_CL_2_4, 'Group_CL_2_4') +salome.sg.updateObjBrowser(1) + +\endcode + */ diff --git a/doc/salome/gui/GEOM/input/using_measurement_tools.doc b/doc/salome/gui/GEOM/input/using_measurement_tools.doc index 7e18a1ddf..513f6077f 100644 --- a/doc/salome/gui/GEOM/input/using_measurement_tools.doc +++ b/doc/salome/gui/GEOM/input/using_measurement_tools.doc @@ -25,6 +25,7 @@ concerning created or imported geometrical objects :
  • \subpage free_faces_page "Check Free Faces"
  • \subpage check_shape_page "Check Shape"
  • \subpage check_compound_of_blocks_page "Check compound of blocks"
  • +
  • \subpage get_non_blocks_page "Get non blocks"
  • \subpage check_self_intersections_page "Detect Self-intersections"
  • @@ -32,4 +33,4 @@ concerning created or imported geometrical objects : \ref tui_measurement_tools_page "Measurement Tools" with TUI commands. -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/GEOM/input/viewing_geom_obj.doc b/doc/salome/gui/GEOM/input/viewing_geom_obj.doc index 44cea48a6..ada09fef1 100644 --- a/doc/salome/gui/GEOM/input/viewing_geom_obj.doc +++ b/doc/salome/gui/GEOM/input/viewing_geom_obj.doc @@ -74,18 +74,23 @@ on the viewer background:
  • Select Only provides a filter for exclusive selection of objects of a certain type.
  • -The the following commands appear in the Object Browser context menu +The following commands appear in the Object Browser context menu under certain conditions: \image html ob_popup_menu.png
    • \ref work_with_groups_page "Create Group" - allows creating groups of geometrical objects.
    • -
    • Hide Children / Show Children - hides / shows child + +
    • Conceal child items / Disclose child items - hides / shows child sub-objects in the Object Browser, if the selected geometric object has child objects. When some child objects are hidden, the name of the parent object is hilghlighted with bold font.
    • +
    • Show Only Children - erase in current viewer all objects +and then display only children of the selected object(s). +
    • +
    • Unpublish - unpublish the selected geometric object from the Object Browser and erase it from all viewers. To publish unpublished geometric objects select in the context menu of the Geometry root object Publish... item. diff --git a/doc/salome/gui/GEOM/input/working_with_groups.doc b/doc/salome/gui/GEOM/input/working_with_groups.doc index 07838d585..a09865efa 100644 --- a/doc/salome/gui/GEOM/input/working_with_groups.doc +++ b/doc/salome/gui/GEOM/input/working_with_groups.doc @@ -3,13 +3,25 @@ \page work_with_groups_page Working with groups Creation and editing groups of sub-shapes of a geometrical object makes -handling sub-shapes much easier. This functionality is available in OCC -viewer only. +handling sub-shapes much easier. Also some Boolean operations on +groups are available. -

      Create a group

      +
        +
      • \ref create_groups_anchor "Create a Group"
      • +
      • \ref edit_groups_anchor "Edit a Group"
      • +
      • \ref union_groups_anchor "Union Groups"
      • +
      • \ref intersect_groups_anchor "Intersect Groups"
      • +
      • \ref cut_groups_anchor "Cut Groups"
      • +
      + +
      +\anchor create_groups_anchor +

      Create a group

      \image html image56.png +This functionality is available in OCC viewer only. + To create a group of sub-shapes of a geometrical object in the main menu select New entity > Group > Create \n The following menu will appear: @@ -72,19 +84,29 @@ ShapeType), where MainShape is a shape for which the group is created, ShapeType is a type of shapes in the created group. \n Arguments: 1 Shape + Type of sub-shape. +Our TUI Scripts provide you with useful examples of +\ref tui_create_groups_anchor "Create a Group" operation. + Example: \image html image193.png "Groups on a cylinder" - -

      Edit a group

      +
      +\anchor edit_groups_anchor +

      Edit a group

      \image html image57.png +This functionality is available in OCC viewer only. + To \b Edit an existing group in the main menu select New entity > Group > Edit. This menu is designed in the same way as the Create a group menu. +\n Dialog Box: + +\image html editgroup.png + \n The \b Result of the operation will be a \b GEOM_Object. \n TUI Command: @@ -101,11 +123,80 @@ the sub-shape to be removed from the group.
    • \n Arguments: 1 Shape + its sub-shapes. -\n Dialog Box: +Our TUI Scripts provide you with useful examples of +\ref tui_edit_groups_anchor "Edit a Group" operation. -\image html editgroup.png +
      +\anchor union_groups_anchor +

      Union of groups

      + +This operation allows to create a new group in such a way that all +sub-shapes that are present in the initial groups will be added to +the new one. + +To union groups: +
        +
      1. In the New Entity menu select the \b Group - Union Groups item. +The following dialog box will appear: + +\image html groups_union_dlg.png + +In this dialog box you should specify the name of the resulting group +and set of groups which will be united. +
      2. +
      3. Click the \b Apply or Apply and Close button to confirm creation of the group.
      4. +
      + +See Also a sample TUI Script of a +\ref tui_union_groups_anchor "Union of Groups" operation. + +
      +\anchor intersect_groups_anchor +

      Intersection of groups

      + +This operation allows to create a new group in such a way that only +sub-shapes that are present in all initial groups together are added to the +new one. + +To intersect groups: +
        +
      1. In the New Entity menu select the \b Group - Intersect Groups item. +The following dialog box will appear: + +\image html groups_intersect_dlg.png + +In this dialog box you should specify the name of the resulting group +and set of groups which will be intersected. +
      2. +
      3. Click the \b Apply or Apply and Close button to confirm creation of the group.
      4. +
      + +See Also a sample TUI Script of an +\ref tui_intersect_groups_anchor "Intersection of Groups" operation. + +
      +\anchor cut_groups_anchor +

      Cut of groups

      + +This operation allows to create a new group in such a way that all +sub-shapes that are present in the main groups but are absent in the +tool groups are added to the new one. + +To cut groups: +
        +
      1. In the New Entity menu select the \b Group - Cut Groups item. +The following dialog box will appear: + +\image html groups_cut_dlg.png + +In this dialog box you should specify the name of the resulting group +and groups which will be cut. +
      2. +
      3. Click the \b Apply or Apply and Close button to confirm creation of the +group.
      4. +
      Our TUI Scripts provide you with useful examples of -\ref tui_working_with_groups_page "Working with Groups". +\ref tui_cut_groups_anchor "Cut of Groups" operation. */ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index f3a41ad16..8f90021eb 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -360,7 +360,8 @@ module GEOM // # Internal methods (For sub-shape identification) // ###################################################################### /*! - * \brief Get geometric shape of the object as a byte stream + * \brief Get geometric shape of the object as a byte stream in BRep format + * \note GEOM_IInsertOperations::RestoreShape() method can be used to restore shape from a BRep stream. */ SALOMEDS::TMPFile GetShapeStream(); @@ -540,6 +541,16 @@ module GEOM in double theYParameter, in double theZParameter); + /*! + * \brief Create a point, which lays on the given face. + * The point will lay in arbitrary place of the face. + * The only condition on it is a non-zero distance to the face boundary. + * Such point can be used to uniquely identify the face inside any + * shape in case, when the shape does not contain overlapped faces. + * \param theFace The referenced face. + * \return New GEOM_Object, containing the created point. + */ + GEOM_Object MakePointOnFace (in GEOM_Object theFace); /*! * \brief Create a point, on two lines intersection. @@ -2403,6 +2414,17 @@ module GEOM string PrintBCErrors (in GEOM_Object theCompound, in BCErrors theErrors); + /*! + * \brief Retrieve all non blocks solids and faces from a shape. + * + * \param theShape The shape to explore. + * \param theNonQuads Output parameter. Group of all non quadrangular faces. + * + * \return Group of all non block solids (= not 6 faces, or with 6 + * faces, but with the presence of non-quadrangular faces). + */ + GEOM_Object GetNonBlocks (in GEOM_Object theShape, out GEOM_Object theNonQuads); + /*! * \brief Remove all seam and degenerated edges from \a theShape. * @@ -2774,10 +2796,10 @@ module GEOM /*! * \brief Create a sketcher (wire or face), following the textual description, - * passed through \a theCommand argument. + * passed through \a theCommand argument. * * Edges of the resulting wire or face will be arcs of circles and/or linear segments. \n - * Format of the description string have to be the following: + * Format of the description string has to be the following: * * "Sketcher[:F x1 y1]:CMD[:CMD[:CMD...]]" * @@ -2805,32 +2827,60 @@ module GEOM * coordinates of the working plane. * \param theWorkingPlane Nine double values, defining origin, * OZ and OX directions of the working plane. - * \return New GEOM_Object, containing the created wire. + * \return New GEOM_Object, containing the created wire or face. */ GEOM_Object MakeSketcher (in string theCommand, in ListOfDouble theWorkingPlane); /*! - * \brief Create a 3D sketcher, following the numerical description, - * passed through points created by \a theCoordinates argument. + * \brief Create a sketcher (wire or face), following the textual description, + * passed through \a theCommand argument. * - * Format of the description string have to be the following: + * For format of the description string see the previous method.\n * - * "Make3DSketcher[x1, y1, z1, x2, y2, z2, ..., xN, yN, zN]" + * \param theCommand String, defining the sketcher in local + * coordinates of the working plane. + * \param theWorkingPlane Planar Face or LCS(Marker) of the working plane. + * \return New GEOM_Object, containing the created wire or face. */ + GEOM_Object MakeSketcherOnPlane (in string theCommand, in GEOM_Object theWorkingPlane); - GEOM_Object Make3DSketcher (in ListOfDouble theCoordinates); - - /*! - * \brief Create a sketcher (wire or face), following the textual description, - * passed through \a theCommand argument. + /*! + * \brief Create a 3D sketcher, following the textual description, + * passed through \a theCommand argument. + * + * Format of the description string has to be the following: + * + * "3DSketcher:CMD[:CMD[:CMD...]]" + * + * Where CMD is one of + * - "TT x y z" : Create segment by point at X & Y or set the first point + * - "T dx dy dz" : Create segment by point with DX & DY + * . + * \n + * - "OXY angleX angle2 length" : Create segment by two angles and length + * - "OYZ angleY angle2 length" : Create segment by two angles and length + * - "OXZ angleX angle2 length" : Create segment by two angles and length + * . + * \n + * - "WW" : Close Wire (to finish) * - * For format of the description string see the previous method.\n * \param theCommand String, defining the sketcher in local * coordinates of the working plane. - * \param theWorkingPlane Planar Face or LCS(Marker) of the working plane. * \return New GEOM_Object, containing the created wire. */ - GEOM_Object MakeSketcherOnPlane (in string theCommand, in GEOM_Object theWorkingPlane); + GEOM_Object Make3DSketcherCommand (in string theCommand); + + /*! + * \brief Create a 3D sketcher, made of a straight segments, joining points + * with coordinates passed through \a theCoordinates argument. + * + * Order of coordinates has to be the following: + * x1, y1, z1, x2, y2, z2, ..., xN, yN, zN + * + * \param theCoordinates List of double values. + * \return New GEOM_Object, containing the created wire. + */ + GEOM_Object Make3DSketcher (in ListOfDouble theCoordinates); }; // # GEOM_ILocalOperations: @@ -3200,6 +3250,17 @@ module GEOM */ GEOM_Object ImportFile (in string theFileName, in string theFormatName); + /*! + * \brief Read a value of parameter from a file, containing a shape. + * \param theFileName The file, containing the shape. + * \param theFormatName Specify format for the file reading. + * Available formats can be obtained with ImportTranslators() method. + * \param theParameterName Specify the parameter. For example, pass "LEN_UNITS" + * to obtain length units, in which the file is written. + * \return Value of requested parameter in form of text string. + */ + string ReadValue (in string theFileName, in string theFormatName, in string theParameterName); + /*! * \brief Get the supported import formats and corresponding patterns for File dialog. * \param theFormats Output. List of formats, available for import. @@ -3218,6 +3279,14 @@ module GEOM void ExportTranslators (out string_array theFormats, out string_array thePatterns); + /*! + * \brief Read a shape from the binary stream, containing its bounding representation (BRep). + * \note GEOM_Object::GetShapeStream() method can be used to obtain the shape's BRep stream. + * \param theStream The BRep binary stream. + * \return New GEOM_Object, containing the shape, read from theStream. + */ + GEOM_Object RestoreShape (in SALOMEDS::TMPFile theStream); + /*! * \brief Load texture from file * \param theTextureFile texture file name @@ -3635,6 +3704,65 @@ module GEOM */ void DifferenceIDs (in GEOM_Object theGroup, in ListOfLong theSubShapes); + /*! + * \brief Union of two groups. + * New group is created. It will contain all entities + * which are present in groups theGroup1 and theGroup2. + * \param theGroup1, theGroup2 are the initial GEOM groups + * to create the united group from. + * \return a newly created GEOM group. + */ + GEOM_Object UnionGroups (in GEOM_Object theGroup1, in GEOM_Object theGroup2); + + /*! + * \brief Intersection of two groups. + * New group is created. It will contain only those entities + * which are present in both groups theGroup1 and theGroup2. + * \param theGroup1, theGroup2 are the initial GEOM groups to get common part of. + * \return a newly created GEOM group. + */ + GEOM_Object IntersectGroups (in GEOM_Object theGroup1, in GEOM_Object theGroup2); + + /*! + * \brief Cut of two groups. + * New group is created. It will contain entities which are + * present in group theGroup1 but are not present in group theGroup2. + * \param theGroup1 is a GEOM group to include elements of. + * \param theGroup2 is a GEOM group to exclude elements of. + * \return a newly created GEOM group. + */ + GEOM_Object CutGroups (in GEOM_Object theGroup1, in GEOM_Object theGroup2); + + /*! + * \brief Union of list of groups. + * New group is created. It will contain all entities that are + * present in groups listed in theGList. + * \param theGList is a list of GEOM groups to create the united group from. + * \return a newly created GEOM group. + */ + GEOM_Object UnionListOfGroups (in ListOfGO theGList); + + /*! + * \brief Intersection of list of groups. + * New group is created. It will contain only entities + * which are simultaneously present in the groups listed in theGList. + * \param theGList is a list of GEOM groups to get common part of. + * \return a newly created GEOM group. + */ + GEOM_Object IntersectListOfGroups (in ListOfGO theGList); + + /*! + * \brief Cut of lists of groups. + * New group is created. It will contain only entities + * which are present in groups listed in theGList1 but + * are not present in groups from theGList2. + * \param theGList1 is a list of GEOM groups to include elements of. + * \param theGList2 is a list of GEOM groups to exclude elements of. + * \return a newly created GEOM group. + */ + GEOM_Object CutListOfGroups (in ListOfGO theGList1, + in ListOfGO theGList2); + /*! * \brief Returns a type of sub-objects stored in the group * \param theGroup is a GEOM group which type is returned. diff --git a/resources/Makefile.am b/resources/Makefile.am index d5aab779c..57c92dd2d 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -232,6 +232,7 @@ group_new.png \ group_edit.png \ glue.png \ check_blocks_compound.png \ +get_non_blocks.png \ check_self_intersections.png \ free_faces.png \ propagate.png \ diff --git a/resources/SalomeApp.xml.in b/resources/SalomeApp.xml.in index dd0dfdfd2..6fb716e5a 100644 --- a/resources/SalomeApp.xml.in +++ b/resources/SalomeApp.xml.in @@ -43,7 +43,7 @@ - + diff --git a/resources/get_non_blocks.png b/resources/get_non_blocks.png new file mode 100644 index 0000000000000000000000000000000000000000..b13b294f21933b19b982b85add00ee6b12bc2d7f GIT binary patch literal 1004 zcmVz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZGPUI82S=kI^8fxmwL zW2jwp1}vA8lf%Hu%F4jZ%naA~>(?)aFJHbeeE9Hz;mw;j3@={1V7PhnCL=%qfo%WZ zy!<=^D>Ea5#J39!fByVo`1$iE!|&g}86I+3FtD*OF&vp&$l#heiGhiU5o7@KWw&Ga|Mw5b84QfT@KXADh~bp5KZBOmYlfH7p$v@BMD`!3m+SW*hDS5w z7=8i``~B@B11voQ1P}`-7C{03HGMXN!mG_-n^;&_!1%h5Hv2C z_lpByahMAM0*D1I?|ubRcR_41F)@ZeKfW+XK3~UhliP;j&%bX#1AYL*@ejja#vcrS z7{3Df#~5BR$uYdXu?>`r4uJFl1P}|ZJPER0^zkZ&+Z<*Le?Gim`1A8C!(UL~1HJqg z=;eREATE4$aVx|3@83a&eF5nM2p~pW<)M&}(0`By7>21sSC3@a1)y9lKmg%%Autyh z0I38ZHXu;IfDHrU9Uu-s0I?8Ic!!7*3lxb*poTI41Q1Ry17n;Ulzc!jPJ|0zKqHg^ aAiw|{nb#QiH{cck0000 #include +// VSR 22/08/2012: issue 0021787: remove "Preview" button from BOP and Partition operations +// Comment next line to enable preview in BOP dialog box +#define NO_PREVIEW + //================================================================================= // class : BooleanGUI_Dialog() // purpose : Constructs a BooleanGUI_Dialog which is a child of 'parent', with the @@ -110,6 +114,10 @@ BooleanGUI_Dialog::BooleanGUI_Dialog (const int theOperation, GeometryGUI* theGe layout->addWidget(myGroup); /***************************************************************/ +#ifdef NO_PREVIEW + mainFrame()->CheckBoxPreview->setChecked( false ); + mainFrame()->CheckBoxPreview->hide(); +#endif // Initialisation Init(); } @@ -224,6 +232,7 @@ void BooleanGUI_Dialog::SelectionIntoArgument() if (myEditCurrentArgument == myGroup->LineEdit1) myObject1.nullify(); else if (myEditCurrentArgument == myGroup->LineEdit2) myObject2.nullify(); } + processPreview(); } //================================================================================= diff --git a/src/DisplayGUI/DisplayGUI.cxx b/src/DisplayGUI/DisplayGUI.cxx index 07613982f..67665f66e 100644 --- a/src/DisplayGUI/DisplayGUI.cxx +++ b/src/DisplayGUI/DisplayGUI.cxx @@ -18,12 +18,11 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // GEOM GEOMGUI : GUI for Geometry component // File : DisplayGUI.cxx // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// + #include "DisplayGUI.h" #include #include "GeometryGUI_Operations.h" @@ -110,6 +109,10 @@ bool DisplayGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) getGeometryGUI()->EmitSignalDeactivateDialog(); DisplayOnly(); break; + case GEOMOp::OpShowOnlyChildren: // POPUP MENU - SHOW ONLY CHILDREN + getGeometryGUI()->EmitSignalDeactivateDialog(); + DisplayOnlyChildren(); + break; case GEOMOp::OpHideAll: // MENU VIEW - HIDE ALL EraseAll(); break; @@ -217,6 +220,62 @@ void DisplayGUI::DisplayOnly() Display(); } +//===================================================================================== +// function : DisplayGUI::DisplayOnlyChildren() +// purpose : Display only children of selected GEOM objects and erase other +//===================================================================================== +void DisplayGUI::DisplayOnlyChildren() +{ + EraseAll(); + + SALOME_ListIO listIO; + + SalomeApp_Application* app = getGeometryGUI()->getApp(); + if (!app) return; + + SalomeApp_Study* anActiveStudy = dynamic_cast(app->activeStudy()); + if (!anActiveStudy) return; + + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + if (!aSelMgr) return; + + // get selection + SALOME_ListIO aList; + //aSelMgr->selectedObjects(aList); + aSelMgr->selectedObjects(aList, "ObjectBrowser", false); + SALOME_ListIteratorOfListIO It (aList); + + SUIT_OverrideCursor(); + + for (; It.More(); It.Next()) { + Handle(SALOME_InteractiveObject) anIObject = It.Value(); + if (anIObject->hasEntry()) { + _PTR(SObject) SO (anActiveStudy->studyDS()->FindObjectID(anIObject->getEntry())); + if (SO) { + _PTR(SComponent) SC (SO->GetFatherComponent()); + if (QString(SO->GetID().c_str()) == QString(SO->GetFatherComponent()->GetID().c_str())) { + // if component is selected, pass it + } + else { + _PTR(ChildIterator) anIter (anActiveStudy->studyDS()->NewChildIterator(SO)); + anIter->InitEx(true); + while (anIter->More()) { + _PTR(SObject) valSO (anIter->Value()); + _PTR(SObject) refSO; + if (!valSO->ReferencedObject(refSO)) { + listIO.Append(new SALOME_InteractiveObject(valSO->GetID().c_str(), + SC->ComponentDataType().c_str(), + valSO->GetName().c_str())); + } + anIter->Next(); + } + } + } + } + } + GEOM_Displayer(anActiveStudy).Display(listIO, true); +} + //===================================================================================== // function : DisplayGUI::Display() // purpose : Display selected GEOM objects diff --git a/src/DisplayGUI/DisplayGUI.h b/src/DisplayGUI/DisplayGUI.h index a52fe0352..74de0e22f 100644 --- a/src/DisplayGUI/DisplayGUI.h +++ b/src/DisplayGUI/DisplayGUI.h @@ -18,12 +18,11 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // GEOM GEOMGUI : GUI for Geometry component // File : DisplayGUI.h // Author : Damien COQUERET, Open CASCADE S.A.S. -// + #ifndef DISPLAYGUI_H #define DISPLAYGUI_H @@ -53,6 +52,8 @@ public: void Display(); // Display selected GEOM objects and erase other void DisplayOnly(); + // Display only children of selected GEOM objects and erase other + void DisplayOnlyChildren(); // Erase selected GEOM objects void Erase(); diff --git a/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx b/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx index 53b0694e9..b44cbd49c 100755 --- a/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx +++ b/src/EntityGUI/EntityGUI_3DSketcherDlg.cxx @@ -15,12 +15,11 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // GEOM GEOMGUI : GUI for Geometry component // File : EntityGUI_3DSketcherDlg.cxx // Author : DMV, OCN -// + #include #include #include @@ -31,7 +30,7 @@ #include #include -#include +#include #include #include @@ -49,14 +48,8 @@ #include //OCCT includes -//#include -//#include -//#include -//#include #include #include -//#include -//#include #include #include #include @@ -86,11 +79,18 @@ enum TYPE_TWO_ANGLES }; +enum +{ + OXY, + OYZ, + OXZ +}; + class Locker { public: - Locker( bool& l ) : myLock( l ) { myLock = true; } - ~Locker() { myLock = false; } + Locker(bool& l) : myLock(l) { myLock = true; } + ~Locker() { myLock = false; } private: bool& myLock; }; @@ -102,27 +102,28 @@ private: // 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, +EntityGUI_3DSketcherDlg::EntityGUI_3DSketcherDlg (GeometryGUI* theGeometryGUI, QWidget* parent, bool modal, Qt::WindowFlags fl, - const double lineWidth ) - : GEOMBase_Skeleton( theGeometryGUI, parent, modal, fl ), - myMode( -1 ), - myOK( false ), - myLineWidth( lineWidth ), - myGeometryGUI( theGeometryGUI ), + const double lineWidth) + : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl), + myMode(-1), + myOK(false), + myLineWidth(lineWidth), + myGeometryGUI(theGeometryGUI), myLengthIORedoList() +// myLastAngleNormal() { - 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" ) ) ); + 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" ) ); + setWindowTitle(tr("GEOM_3DSKETCHER_TITLE")); /***************************************************************/ - mainFrame()->GroupConstructors->setTitle( tr( "GEOM_3DSKETCHER" ) ); - mainFrame()->RadioButton1->setIcon( image3 );; + mainFrame()->GroupConstructors->setTitle(tr("GEOM_3DSKETCHER")); + mainFrame()->RadioButton1->setIcon(image3);; mainFrame()->RadioButton2->close(); mainFrame()->RadioButton3->close(); @@ -132,48 +133,59 @@ EntityGUI_3DSketcherDlg::EntityGUI_3DSketcherDlg( GeometryGUI* theGeometryGUI, Q GroupType->RadioButton2->setText(tr("GEOM_SKETCHER_REL")); GroupType->RadioButton3->setText(tr("Angles")); //TODO translation // GroupType->RadioButton3->close(); - myTypeGroup = new QButtonGroup( this ); - myTypeGroup->addButton( GroupType->RadioButton1, 0 ); - myTypeGroup->addButton( GroupType->RadioButton2, 1 ); - myTypeGroup->addButton( GroupType->RadioButton3, 2 ); - - 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" ) ); - - GroupAngles = new EntityGUI_Angles( centralWidget() ); - GroupAngles->buttonApply->setText( tr( "GEOM_SKETCHER_APPLY" ) ); - GroupAngles->buttonUndo->setIcon( image1 ); - GroupAngles->buttonRedo->setIcon( image2 ); - GroupAngles->checkBox->setText( tr( "Angle 2" ) ); //TODO translation - - GroupControls = new EntityGUI_Controls( centralWidget() ); + myTypeGroup = new QButtonGroup(this); + myTypeGroup->addButton(GroupType->RadioButton1, 0); + myTypeGroup->addButton(GroupType->RadioButton2, 1); + myTypeGroup->addButton(GroupType->RadioButton3, 2); + + 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")); + + GroupAngles = new EntityGUI_Angles(centralWidget()); + GroupAngles->buttonApply->setText(tr("GEOM_SKETCHER_APPLY")); + GroupAngles->buttonUndo->setIcon(image1); + GroupAngles->buttonRedo->setIcon(image2); + GroupAngles->checkBox->setText(tr("Angle 2")); //TODO translation + + GroupControls = new EntityGUI_Controls(centralWidget()); GroupControls->GroupBox1->setTitle(tr("GEOM_CONTROLS")); - GroupControls->CheckBox1->setText( tr( "Show length dimensions" ) ); //TODO translation - GroupControls->CheckBox2->setText( tr( "Show angle dimensions" ) ); //TODO translation - - 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 ); - layout->addWidget( GroupAngles ); - layout->addWidget( GroupControls ); - - setHelpFileName( "create_3dsketcher_page.html" ); + GroupControls->CheckBox1->setText(tr("Show length dimensions")); //TODO translation + GroupControls->CheckBox2->setText(tr("Show angle dimensions")); //TODO translation + GroupControls->CheckBox3->setText(tr("Show start/end point coordinates")); //TODO translation + GroupControls->lineEdit_1->setReadOnly(true); + GroupControls->lineEdit_2->setReadOnly(true); + GroupControls->lineEdit_3->setReadOnly(true); + GroupControls->lineEdit_4->setReadOnly(true); + GroupControls->lineEdit_5->setReadOnly(true); + GroupControls->lineEdit_6->setReadOnly(true); + GroupControls->label_1->setText(tr("X:")); + GroupControls->label_2->setText(tr("Y:")); + GroupControls->label_3->setText(tr("Z:")); + GroupControls->label_4->setText(tr("X:")); + GroupControls->label_5->setText(tr("Y:")); + GroupControls->label_6->setText(tr("Z:")); + + 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); + layout->addWidget(GroupAngles); + layout->addWidget(GroupControls); + + setHelpFileName("create_3dsketcher_page.html"); resize(100,100); Init(); -} - - +} //================================================================================= // function : ~EntityGUI_3DSketcherDlg() @@ -181,7 +193,7 @@ EntityGUI_3DSketcherDlg::EntityGUI_3DSketcherDlg( GeometryGUI* theGeometryGUI, Q //================================================================================= EntityGUI_3DSketcherDlg::~EntityGUI_3DSketcherDlg() { - myGeomGUI->SetActiveDialogBox( 0 ); + myGeomGUI->SetActiveDialogBox(0); } //================================================================================= @@ -191,152 +203,160 @@ EntityGUI_3DSketcherDlg::~EntityGUI_3DSketcherDlg() void EntityGUI_3DSketcherDlg::Init() { myOK = false; - myOrientation = 1; + myOrientation = OXY; myPrsType = NONE; - + SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); myAnglePrs = dynamic_cast(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0)); myLengthPrs = dynamic_cast(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0)); - + //TEST - localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); // globalSelection(GEOM_PREVIEW); +// setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); /* Get setting of step value from file configuration */ - double step = SUIT_Session::session()->resourceMgr()->doubleValue( "Geometry", "SettingsGeomStep", 100.0 ); + 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, "length_precision" ); - initSpinBox( Group3Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision" ); - initSpinBox( Group3Spin->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision" ); - - initSpinBox( GroupAngles->SpinBox_DA , -180.0, 180.0, step, "angular_precision" ); - initSpinBox( GroupAngles->SpinBox_DA2, -90.0, 90.0, step, "angular_precision" ); - initSpinBox( GroupAngles->SpinBox_DL , COORD_MIN, COORD_MAX, step, "length_precision" ); + initSpinBox(Group3Spin->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision"); + initSpinBox(Group3Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision"); + initSpinBox(Group3Spin->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision"); + + initSpinBox(GroupAngles->SpinBox_DA , -180.0, 180.0, step, "angular_precision"); + initSpinBox(GroupAngles->SpinBox_DA2, -90.0, 90.0, step, "angular_precision"); + initSpinBox(GroupAngles->SpinBox_DL , COORD_MIN, COORD_MAX, step, "length_precision"); Group3Spin->SpinBox_DX->setValue(0.0); Group3Spin->SpinBox_DY->setValue(0.0); Group3Spin->SpinBox_DZ->setValue(0.0); - + GroupAngles->SpinBox_DA->setValue(0.0); GroupAngles->SpinBox_DA2->setValue(0.0); GroupAngles->SpinBox_DL->setValue(0.0); - + GroupAngles->radioButton_1->setChecked(true); GroupAngles->checkBox->setChecked(false); - GroupAngles->SpinBox_DA2->setEnabled(false); + GroupAngles->SpinBox_DA2->setEnabled(false); + + GroupControls->CheckBox1->setChecked(true); + GroupControls->CheckBox2->setChecked(true); + GroupControls->CheckBox3->setChecked(true); - GroupControls->CheckBox1->setChecked( true ); - GroupControls->CheckBox2->setChecked( true ); isLengthVisible = true; isAngleVisible = true; - + GroupAngles->hide(); /* signals and slots connections */ - connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); - connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + 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( GroupAngles->buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnAddPoint() ) ); - connect( GroupAngles->buttonUndo, SIGNAL( clicked() ), this, SLOT( ClickOnUndo() ) ); - connect( GroupAngles->buttonRedo, SIGNAL( clicked() ), this, SLOT( ClickOnRedo() ) ) ; + 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( myTypeGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( TypeClicked( int ) ) ); + connect(GroupAngles->buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnAddPoint())); + connect(GroupAngles->buttonUndo, SIGNAL(clicked()), this, SLOT(ClickOnUndo())); + connect(GroupAngles->buttonRedo, SIGNAL(clicked()), this, SLOT(ClickOnRedo())) ; - 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( GroupAngles->SpinBox_DA, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); - connect( GroupAngles->SpinBox_DA2, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); - connect( GroupAngles->SpinBox_DL, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) ); - - connect( GroupAngles->radioButton_1, SIGNAL( clicked ( bool ) ), this, SLOT( ButtonClicked(bool) ) ) ; - connect( GroupAngles->radioButton_2, SIGNAL( clicked ( bool ) ), this, SLOT( ButtonClicked(bool) ) ) ; - connect( GroupAngles->radioButton_3, SIGNAL( clicked ( bool ) ), this, SLOT( ButtonClicked(bool) ) ) ; - - connect( GroupAngles->checkBox, SIGNAL( clicked ( bool ) ), this, SLOT( BoxChecked (bool) ) ) ; - connect( GroupControls->CheckBox1, SIGNAL( clicked ( bool ) ), this, SLOT( BoxChecked (bool) ) ) ; - connect( GroupControls->CheckBox2, SIGNAL( clicked ( bool ) ), this, SLOT( BoxChecked (bool) ) ) ; + connect(myTypeGroup, SIGNAL(buttonClicked(int)), this, SLOT(TypeClicked(int))); + + 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(GroupAngles->SpinBox_DA, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupAngles->SpinBox_DA2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupAngles->SpinBox_DL, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(GroupAngles->radioButton_1, SIGNAL(clicked (bool)), this, SLOT(ButtonClicked(bool))) ; + connect(GroupAngles->radioButton_2, SIGNAL(clicked (bool)), this, SLOT(ButtonClicked(bool))) ; + connect(GroupAngles->radioButton_3, SIGNAL(clicked (bool)), this, SLOT(ButtonClicked(bool))) ; + + connect(GroupAngles->checkBox, SIGNAL(clicked (bool)), this, SLOT(BoxChecked (bool))) ; + connect(GroupControls->CheckBox1, SIGNAL(clicked (bool)), this, SLOT(BoxChecked (bool))) ; + connect(GroupControls->CheckBox2, SIGNAL(clicked (bool)), this, SLOT(BoxChecked (bool))) ; + connect(GroupControls->CheckBox3, SIGNAL(clicked (bool)), this, SLOT(BoxChecked (bool))) ; - connect( myGeomGUI, SIGNAL( SignalDefaultStepValueChanged( double ) ), this, SLOT( SetDoubleSpinBoxStep( double ) ) ); + connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double))); - connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ); - connect( myGeomGUI, SIGNAL( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ); + connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - initName( tr( "GEOM_3DSKETCHER" ) ); + initName(tr("GEOM_3DSKETCHER")); + + GroupControls->CheckBox3->click(); UpdateButtonsState(); - GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); + GEOMBase_Helper::displayPreview(true, false, true, true, myLineWidth); } //================================================================================= // function : TypeClicked() // purpose : Radio button management //================================================================================= -void EntityGUI_3DSketcherDlg::TypeClicked( int mode ) +void EntityGUI_3DSketcherDlg::TypeClicked (int mode) { - if ( mode == myMode ) return; + if (mode == myMode) return; GroupAngles->hide(); Group3Spin->show(); - + 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 XYZ xyz = getLastPoint(); bool okx, oky, okz; - Group3Spin->SpinBox_DX->text().toDouble( &okx ); - Group3Spin->SpinBox_DY->text().toDouble( &oky ); - Group3Spin->SpinBox_DZ->text().toDouble( &okz ); - if ( mode == 0 ) { // 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->text().toDouble(&okx); + Group3Spin->SpinBox_DY->text().toDouble(&oky); + Group3Spin->SpinBox_DZ->text().toDouble(&okz); + + if (mode == 0) { // XYZ + Group3Spin->TextLabel1->setText(tr("GEOM_SKETCHER_X2")); + Group3Spin->TextLabel2->setText(tr("GEOM_SKETCHER_Y2")); + Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_Z2")); if (myMode == 1) { - if ( okx ) Group3Spin->SpinBox_DX->setValue( xyz.x + Group3Spin->SpinBox_DX->value() ); - if ( oky ) Group3Spin->SpinBox_DY->setValue( xyz.y + Group3Spin->SpinBox_DY->value() ); - if ( okz ) Group3Spin->SpinBox_DZ->setValue( xyz.z + Group3Spin->SpinBox_DZ->value() ); + if (okx) Group3Spin->SpinBox_DX->setValue(xyz.x + Group3Spin->SpinBox_DX->value()); + if (oky) Group3Spin->SpinBox_DY->setValue(xyz.y + Group3Spin->SpinBox_DY->value()); + if (okz) Group3Spin->SpinBox_DZ->setValue(xyz.z + Group3Spin->SpinBox_DZ->value()); } Group3Spin->buttonApply->setFocus(); } - else if ( mode == 1) { // DXDY - Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_DX2" ) ); - Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_DY2" ) ); - Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_DZ2" ) ); + else if (mode == 1) { // DXDYDZ + Group3Spin->TextLabel1->setText(tr("GEOM_SKETCHER_DX2")); + Group3Spin->TextLabel2->setText(tr("GEOM_SKETCHER_DY2")); + Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_DZ2")); if (myMode == 0) { - if ( okx ) Group3Spin->SpinBox_DX->setValue( Group3Spin->SpinBox_DX->value() - xyz.x ); - if ( oky ) Group3Spin->SpinBox_DY->setValue( Group3Spin->SpinBox_DY->value() - xyz.y ); - if ( okz ) Group3Spin->SpinBox_DZ->setValue( Group3Spin->SpinBox_DZ->value() - xyz.z ); + if (okx) Group3Spin->SpinBox_DX->setValue(Group3Spin->SpinBox_DX->value() - xyz.x); + if (oky) Group3Spin->SpinBox_DY->setValue(Group3Spin->SpinBox_DY->value() - xyz.y); + if (okz) Group3Spin->SpinBox_DZ->setValue(Group3Spin->SpinBox_DZ->value() - xyz.z); } Group3Spin->buttonApply->setFocus(); } - else if (mode == 2){ // Angles + else if (mode == 2) { // Angles and Length Group3Spin->hide(); GroupAngles->show(); GroupAngles->buttonApply->setFocus(); } - + Group3Spin->SpinBox_DX->blockSignals(blocked); Group3Spin->SpinBox_DY->blockSignals(blocked); Group3Spin->SpinBox_DZ->blockSignals(blocked); myMode = mode; - + updateGeometry(); resize(minimumSizeHint()); - - GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); + + GEOMBase_Helper::displayPreview(true, false, true, true, myLineWidth); } //================================================================================= @@ -344,72 +364,113 @@ void EntityGUI_3DSketcherDlg::TypeClicked( int mode ) // purpose : called when the point coordinates is Applyed //================================================================================= void EntityGUI_3DSketcherDlg::ClickOnAddPoint() -{ +{ QString msg; - if ( !isValid( msg ) ) { - showError( msg ); + if (!isValid(msg)) { + showError(msg); return; } - + // Display and store angle dimensions interactive objects in Prs - if( GroupType->RadioButton3->isChecked() ) + if (GroupType->RadioButton3->isChecked()) // ANGLES { double anAngle2 = 0.0; if (GroupAngles->checkBox->isChecked()) anAngle2 = GroupAngles->SpinBox_DA2->value(); - - // Store length dimensions - displayLength(GroupAngles->SpinBox_DL->value(), /*store =*/true); + // Store angle dimensions - displayAngle(GroupAngles->SpinBox_DA->value(), anAngle2, - GroupAngles->SpinBox_DL->value(), myOrientation, /*store =*/true); + displayAngle(GroupAngles->SpinBox_DA->value(), anAngle2, + GroupAngles->SpinBox_DL->value(), myOrientation, /*store =*/true); + // Store length dimensions + displayLength(GroupAngles->SpinBox_DL->value(), /*store =*/true, /*type=*/myPrsType); } - + // Display and store store length dimension interactive object in Prs - if (GroupType->RadioButton1->isChecked() || + if (GroupType->RadioButton1->isChecked() || // ABSOLUTE or RELATIVE coordinates GroupType->RadioButton2->isChecked()) { displayLength(-1, /*store=*/true); } - - myPointsList.append( getCurrentPoint() ); - myPrsTypeList.push_back( myPrsType ); - + + myPointsList.append(getCurrentPoint()); + myPrsTypeList.push_back(myPrsType); + // Clean redo lists myRedoList.clear(); myPrsTypeRedoList.clear(); myLengthIORedoList.Clear(); myAngleIORedoList.Clear(); - - if ( myMode == 1 ) { - Group3Spin->SpinBox_DX->setValue( 0.0 ); - Group3Spin->SpinBox_DY->setValue( 0.0 ); - Group3Spin->SpinBox_DZ->setValue( 0.0 ); + + if (myMode == 1) + { + Group3Spin->SpinBox_DX->setValue(0.0); + Group3Spin->SpinBox_DY->setValue(0.0); + Group3Spin->SpinBox_DZ->setValue(0.0); } - else if ( myMode == 2 ) + else if (myMode == 2) { - GroupAngles->SpinBox_DA->setValue( 0.0 ); - GroupAngles->SpinBox_DL->setValue( 0.0 ); - GroupAngles->SpinBox_DA2->setValue( 0.0 ); + GroupAngles->SpinBox_DA->setValue(0.0); + GroupAngles->SpinBox_DL->setValue(0.0); + GroupAngles->SpinBox_DA2->setValue(0.0); } - UpdateButtonsState(); - GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); + UpdatePointCoordinates(); + + UpdateButtonsState(); + GEOMBase_Helper::displayPreview(true, false, true, true, myLineWidth); } //================================================================================= // function : UpdateButtonsState() -// purpose : +// purpose : //================================================================================= void EntityGUI_3DSketcherDlg::UpdateButtonsState() { - if ( myPointsList.count() == 0 ) GroupType->RadioButton1->click(); - GroupType->RadioButton2->setEnabled( myPointsList.count() > 0 ); - GroupType->RadioButton3->setEnabled( myPointsList.count() > 0 ); - Group3Spin->buttonUndo->setEnabled( myPointsList.count() > 0 ); - Group3Spin->buttonRedo->setEnabled( myRedoList.count() > 0 ); - GroupAngles->buttonUndo->setEnabled( myPointsList.count() > 0 ); - GroupAngles->buttonRedo->setEnabled( myRedoList.count() > 0 ); + if (myPointsList.count() == 0) GroupType->RadioButton1->click(); + GroupType->RadioButton2->setEnabled(myPointsList.count() > 0); + GroupType->RadioButton3->setEnabled(myPointsList.count() > 0); + Group3Spin->buttonUndo->setEnabled(myPointsList.count() > 0); + Group3Spin->buttonRedo->setEnabled(myRedoList.count() > 0); + GroupAngles->buttonUndo->setEnabled(myPointsList.count() > 0); + GroupAngles->buttonRedo->setEnabled(myRedoList.count() > 0); +} + +//================================================================================= +// function : UpdatePointCoordinates() +// purpose :Update point coordinates in the control groupbox +//================================================================================= +void EntityGUI_3DSketcherDlg::UpdatePointCoordinates() +{ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue("Geometry", "length_precision", 6); + + if (myPointsList.count() == 0) + { + GroupControls->lineEdit_1->setText(""); + GroupControls->lineEdit_2->setText(""); + GroupControls->lineEdit_3->setText(""); + + GroupControls->lineEdit_4->setText(""); + GroupControls->lineEdit_5->setText(""); + GroupControls->lineEdit_6->setText(""); + } + else if (myPointsList.count() == 1) + { + GroupControls->lineEdit_1->setText(DlgRef::PrintDoubleValue(getLastPoint().x, aPrecision)); + GroupControls->lineEdit_2->setText(DlgRef::PrintDoubleValue(getLastPoint().y, aPrecision)); + GroupControls->lineEdit_3->setText(DlgRef::PrintDoubleValue(getLastPoint().z, aPrecision)); + + GroupControls->lineEdit_4->setText(""); + GroupControls->lineEdit_5->setText(""); + GroupControls->lineEdit_6->setText(""); + } + else + { + GroupControls->lineEdit_4->setText(DlgRef::PrintDoubleValue(getLastPoint().x, aPrecision)); + GroupControls->lineEdit_5->setText(DlgRef::PrintDoubleValue(getLastPoint().y, aPrecision)); + GroupControls->lineEdit_6->setText(DlgRef::PrintDoubleValue(getLastPoint().z, aPrecision)); + } + } //================================================================================= @@ -419,42 +480,45 @@ void EntityGUI_3DSketcherDlg::UpdateButtonsState() void EntityGUI_3DSketcherDlg::ClickOnUndo() { if (myPointsList.count() > 0) { - myRedoList.append( myPointsList.takeLast() ); + myRedoList.append(myPointsList.takeLast()); UpdateButtonsState(); - GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); - + GEOMBase_Helper::displayPreview(true, false, true, true, myLineWidth); + // Erase dimensions presentations SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); - ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Erase(myLengthPrs, true); + ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Erase(myLengthPrs, true); ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Erase(myAnglePrs, true); - + if (myPrsTypeList.back() != NONE) { // Remove last prepended IO - removeLastIOFromPrs( TYPE_LENGTH ); - } - if ( myPrsTypeList.back() == TYPE_ANGLE || - myPrsTypeList.back() == TYPE_TWO_ANGLES ) + removeLastIOFromPrs(TYPE_LENGTH); + } + if (myPrsTypeList.back() == TYPE_ANGLE || + myPrsTypeList.back() == TYPE_TWO_ANGLES) { // Remove first Angle IO from presentation - removeLastIOFromPrs( TYPE_ANGLE ); - if ( myPrsTypeList.back() == TYPE_TWO_ANGLES ) + removeLastIOFromPrs(TYPE_ANGLE); + if (myPrsTypeList.back() == TYPE_TWO_ANGLES) { // Remove second Angle IO - removeLastIOFromPrs( TYPE_ANGLE ); + removeLastIOFromPrs(TYPE_ANGLE); } } - + // Erase last action type and store it in redo list myPrsTypeRedoList.push_back(myPrsTypeList.back()); myPrsTypeList.pop_back(); - + // Display modified presentation if (isLengthVisible) ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Display(myLengthPrs); if (isAngleVisible) ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Display(myAnglePrs); + // Update of point coordinates in the control groupbox + UpdatePointCoordinates(); + updateViewer(); } } @@ -465,41 +529,44 @@ void EntityGUI_3DSketcherDlg::ClickOnUndo() //================================================================================= void EntityGUI_3DSketcherDlg::ClickOnRedo() { - if ( myRedoList.count() > 0) { - myPointsList.append( myRedoList.takeLast() ); + if (myRedoList.count() > 0) { + myPointsList.append(myRedoList.takeLast()); UpdateButtonsState(); - GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); - + GEOMBase_Helper::displayPreview(true, false, true, true, myLineWidth); + // Erase dimensions presentations SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Erase(myLengthPrs, true); ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Erase(myAnglePrs, true); - - if ( myPrsTypeRedoList.back() != NONE ) - restoreLastIOToPrs( TYPE_LENGTH ); - - if ( myPrsTypeRedoList.back() == TYPE_ANGLE || - myPrsTypeRedoList.back() == TYPE_TWO_ANGLES ) + + if (myPrsTypeRedoList.back() != NONE) + restoreLastIOToPrs(TYPE_LENGTH); + + if (myPrsTypeRedoList.back() == TYPE_ANGLE || + myPrsTypeRedoList.back() == TYPE_TWO_ANGLES) { // Add a first IO from the Redo list - restoreLastIOToPrs( TYPE_ANGLE ); - if ( myPrsTypeRedoList.back() == TYPE_TWO_ANGLES ) + restoreLastIOToPrs(TYPE_ANGLE); + if (myPrsTypeRedoList.back() == TYPE_TWO_ANGLES) { // Add a second IO from the Redo list - restoreLastIOToPrs( TYPE_ANGLE ); + restoreLastIOToPrs(TYPE_ANGLE); } } - + // Record last prs type myPrsTypeList.push_back(myPrsTypeRedoList.back()); myPrsTypeRedoList.pop_back(); - + // Display modified presentation if (isLengthVisible) ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Display(myLengthPrs); if (isAngleVisible) ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Display(myAnglePrs); + // Update of point coordinates in the control groupbox + UpdatePointCoordinates(); + updateViewer(); } } @@ -508,40 +575,40 @@ void EntityGUI_3DSketcherDlg::ClickOnRedo() // function : removeLastIO() // purpose : //================================================================================= -void EntityGUI_3DSketcherDlg::removeLastIOFromPrs(int type) +void EntityGUI_3DSketcherDlg::removeLastIOFromPrs (int type) { AIS_ListOfInteractive anIOList; - + if (type == TYPE_LENGTH) { myLengthPrs->GetObjects(anIOList); myLengthIORedoList.Prepend(anIOList.First()); // Store last prepended Length IO in redo list myLengthPrs->RemoveFirst(); // Remove it from myLengthPrs - } + } if (type == TYPE_ANGLE) { myAnglePrs->GetObjects(anIOList); myAngleIORedoList.Prepend(anIOList.First()); // Store last prepended Angle IO in redo list myAnglePrs->RemoveFirst(); // Remove it from myAnglePrs - } + } } //================================================================================= // function : restoreLastIO() // purpose : //================================================================================= -void EntityGUI_3DSketcherDlg::restoreLastIOToPrs(int type) +void EntityGUI_3DSketcherDlg::restoreLastIOToPrs (int type) { if (type == TYPE_LENGTH) { myLengthPrs->PrependObject(myLengthIORedoList.First()); // Restore last removed IO myLengthIORedoList.RemoveFirst(); // Remove it from redo list - } + } if (type == TYPE_ANGLE) { myAnglePrs->PrependObject(myAngleIORedoList.First()); // Restore last removed IO myAngleIORedoList.RemoveFirst(); // Remove it from redo list - } + } } //================================================================================= @@ -555,26 +622,26 @@ void EntityGUI_3DSketcherDlg::SelectionIntoArgument() aSelMgr->selectedObjects(aSelList); int nbSel = aSelList.Extent(); - if ( nbSel == 1 ) { - GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( aSelList.First() ); - if ( !CORBA::is_nil(aSelectedObject) ) { + if (nbSel == 1) { + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First()); + if (!CORBA::is_nil(aSelectedObject)) { TopoDS_Shape aShape; - if (GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE)) { // Explore the shape if its a local selection + 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); - } + 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 ) + if (aShape.ShapeType() != TopAbs_VERTEX) isOk = GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_VERTEX); if (isOk) { gp_Pnt aPnt; - if ( GEOMBase::VertexToPoint( aShape, aPnt ) ) { + if (GEOMBase::VertexToPoint(aShape, aPnt)) { // set coordinates to the Spin Boxes double aX, aY, aZ; aX = aPnt.X(); @@ -584,15 +651,16 @@ void EntityGUI_3DSketcherDlg::SelectionIntoArgument() 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() ) { + if (GroupType->RadioButton1->isChecked()) { + Group3Spin->SpinBox_DX->setValue(aX); + Group3Spin->SpinBox_DY->setValue(aY); + Group3Spin->SpinBox_DZ->setValue(aZ); + } + else if (GroupType->RadioButton2->isChecked()) { XYZ xyz = getLastPoint(); - Group3Spin->SpinBox_DX->setValue( aX - xyz.x ); - Group3Spin->SpinBox_DY->setValue( aY - xyz.y ); - Group3Spin->SpinBox_DZ->setValue( aZ - xyz.z ); + Group3Spin->SpinBox_DX->setValue(aX - xyz.x); + Group3Spin->SpinBox_DY->setValue(aY - xyz.y); + Group3Spin->SpinBox_DZ->setValue(aZ - xyz.z); } Group3Spin->SpinBox_DX->blockSignals(blocked); Group3Spin->SpinBox_DY->blockSignals(blocked); @@ -601,7 +669,7 @@ void EntityGUI_3DSketcherDlg::SelectionIntoArgument() } } } - GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); + GEOMBase_Helper::displayPreview(true, false, true, true, myLineWidth); } //================================================================================= @@ -610,13 +678,12 @@ void EntityGUI_3DSketcherDlg::SelectionIntoArgument() //================================================================================= void EntityGUI_3DSketcherDlg::DeactivateActiveDialog() { - setEnabled( false ); + setEnabled(false); globalSelection(); - disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 ); - myGeomGUI->SetActiveDialogBox( 0 ); + disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); + myGeomGUI->SetActiveDialogBox(0); } - //================================================================================= // function : ActivateThisDialog() // purpose : @@ -624,43 +691,41 @@ void EntityGUI_3DSketcherDlg::DeactivateActiveDialog() void EntityGUI_3DSketcherDlg::ActivateThisDialog() { myGeomGUI->EmitSignalDeactivateDialog(); - setEnabled( true ); - myGeomGUI->SetActiveDialogBox( this ); + setEnabled(true); + myGeomGUI->SetActiveDialogBox(this); - connect( myGeomGUI->getApp()->selectionMgr(), - SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + connect(myGeomGUI->getApp()->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); - GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); + GEOMBase_Helper::displayPreview(true, false, true, true, myLineWidth); } - //================================================================================= // function : ValueChangedInSpinBox() // purpose : //================================================================================= -void EntityGUI_3DSketcherDlg::ValueChangedInSpinBox( double newValue ) +void EntityGUI_3DSketcherDlg::ValueChangedInSpinBox (double newValue) { - GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); + GEOMBase_Helper::displayPreview(true, false, true, true, myLineWidth); } - //================================================================================= // function : BoxChecked() // purpose : ChecBoxes management //================================================================================= -void EntityGUI_3DSketcherDlg::BoxChecked( bool checked ) +void EntityGUI_3DSketcherDlg::BoxChecked (bool checked) { QCheckBox* send = (QCheckBox*) sender(); SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); - + if (send == GroupAngles->checkBox) - GroupAngles->SpinBox_DA2->setEnabled(checked); - + GroupAngles->SpinBox_DA2->setEnabled(checked); + else if (send == GroupControls->CheckBox1) { ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Erase(myLengthPrs, true); - if(checked){ + if (checked){ ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Display(myLengthPrs); isLengthVisible=true; } @@ -669,8 +734,8 @@ void EntityGUI_3DSketcherDlg::BoxChecked( bool checked ) } else if (send == GroupControls->CheckBox2) { - ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Erase(myAnglePrs, true); - if(checked) + ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Erase(myAnglePrs, true); + if (checked) { ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Display(myAnglePrs); isAngleVisible=true; @@ -678,33 +743,57 @@ void EntityGUI_3DSketcherDlg::BoxChecked( bool checked ) else isAngleVisible=false; } + else if (send == GroupControls->CheckBox3) + { + GroupControls->lineEdit_1->setVisible(checked); + GroupControls->lineEdit_2->setVisible(checked); + GroupControls->lineEdit_3->setVisible(checked); + GroupControls->lineEdit_4->setVisible(checked); + GroupControls->lineEdit_5->setVisible(checked); + GroupControls->lineEdit_6->setVisible(checked); + + GroupControls->label_1->setVisible(checked); + GroupControls->label_2->setVisible(checked); + GroupControls->label_3->setVisible(checked); + GroupControls->label_4->setVisible(checked); + GroupControls->label_5->setVisible(checked); + GroupControls->label_6->setVisible(checked); + GroupControls->label_7->setVisible(checked); + GroupControls->label_8->setVisible(checked); + + GroupControls->updateGeometry(); + GroupControls->resize(minimumSizeHint()); + } - GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); + updateGeometry(); + resize(minimumSizeHint()); + + GEOMBase_Helper::displayPreview(true, false, true, true, myLineWidth); } //================================================================================= // function : ButtonClicked() // purpose : //================================================================================= -void EntityGUI_3DSketcherDlg::ButtonClicked( bool checked ) +void EntityGUI_3DSketcherDlg::ButtonClicked (bool checked) { if (GroupAngles->radioButton_1->isChecked()) - myOrientation = 1; + myOrientation = OXY; else if (GroupAngles->radioButton_2->isChecked()) - myOrientation = 2; + myOrientation = OYZ; else - myOrientation = 3; - - GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); + myOrientation = OXZ; + + GEOMBase_Helper::displayPreview(true, false, true, true, myLineWidth); } //================================================================================= // function : enterEvent() // purpose : //================================================================================= -void EntityGUI_3DSketcherDlg::enterEvent( QEvent* ) +void EntityGUI_3DSketcherDlg::enterEvent (QEvent*) { - if ( !mainFrame()->GroupConstructors->isEnabled() ) + if (!mainFrame()->GroupConstructors->isEnabled()) ActivateThisDialog(); } @@ -714,19 +803,19 @@ void EntityGUI_3DSketcherDlg::enterEvent( QEvent* ) //================================================================================= GEOM::GEOM_IOperations_ptr EntityGUI_3DSketcherDlg::createOperation() { - return getGeomEngine()->GetICurvesOperations( getStudyId() ); + return getGeomEngine()->GetICurvesOperations(getStudyId()); } //================================================================================= // function : isValid // purpose : //================================================================================= -bool EntityGUI_3DSketcherDlg::isValid( QString& msg ) +bool EntityGUI_3DSketcherDlg::isValid (QString& msg) { bool ok = true; - ok = Group3Spin->SpinBox_DX->isValid( msg, !IsPreview() ) && ok; - ok = Group3Spin->SpinBox_DY->isValid( msg, !IsPreview() ) && ok; - ok = Group3Spin->SpinBox_DZ->isValid( msg, !IsPreview() ) && ok; + ok = Group3Spin->SpinBox_DX->isValid(msg, !IsPreview()) && ok; + ok = Group3Spin->SpinBox_DY->isValid(msg, !IsPreview()) && ok; + ok = Group3Spin->SpinBox_DZ->isValid(msg, !IsPreview()) && ok; return ok; } @@ -734,43 +823,44 @@ bool EntityGUI_3DSketcherDlg::isValid( QString& msg ) // function : execute // purpose : //================================================================================= -bool EntityGUI_3DSketcherDlg::execute( ObjectList& objects ) +bool EntityGUI_3DSketcherDlg::execute (ObjectList& objects) { - GEOM::ListOfDouble_var aCoordsArray = new GEOM::ListOfDouble; - if (!myOK || myPointsList.size() == 0) - aCoordsArray->length((myPointsList.size()+1)*3); - else - aCoordsArray->length(myPointsList.size()*3); - + //GEOM::ListOfDouble_var aCoordsArray = new GEOM::ListOfDouble; + //if (!myOK || myPointsList.size() == 0) + // aCoordsArray->length((myPointsList.size()+1)*3); + //else + // aCoordsArray->length(myPointsList.size()*3); + + QStringList aCommands; + aCommands << "3DSketcher"; QStringList aParameters; - int i = 0; + //int i = 0; QList::const_iterator it; - for(it = myPointsList.begin(); it != myPointsList.end(); ++it ) { - aCoordsArray[i++] = (*it).x; - aCoordsArray[i++] = (*it).y; - aCoordsArray[i++] = (*it).z; - aParameters << (*it).xt; - aParameters << (*it).yt; - aParameters << (*it).zt; + for (it = myPointsList.begin(); it != myPointsList.end(); ++it) { + //aCoordsArray[i++] = (*it).x; + //aCoordsArray[i++] = (*it).y; + //aCoordsArray[i++] = (*it).z; + aCommands << (*it).command; + aParameters << (*it).params; } if (!myOK || myPointsList.size() == 0) { XYZ xyz = getCurrentPoint(); - aCoordsArray[i++] = xyz.x; - aCoordsArray[i++] = xyz.y; - aCoordsArray[i++] = xyz.z; - aParameters << xyz.xt; - aParameters << xyz.yt; - aParameters << xyz.zt; - } + //aCoordsArray[i++] = xyz.x; + //aCoordsArray[i++] = xyz.y; + //aCoordsArray[i++] = xyz.z; + aCommands << xyz.command; + aParameters << xyz.params; + } GEOM::GEOM_ICurvesOperations_var anOper = GEOM::GEOM_ICurvesOperations::_narrow(getOperation()); - GEOM::GEOM_Object_var anObj = anOper->Make3DSketcher( aCoordsArray ); + //GEOM::GEOM_Object_var anObj = anOper->Make3DSketcher(aCoordsArray); + GEOM::GEOM_Object_var anObj = anOper->Make3DSketcherCommand(aCommands.join(":").toLatin1().constData()); - if ( !anObj->_is_nil() ) { - if ( !IsPreview() ) anObj->SetParameters(aParameters.join(":").toLatin1().constData()); - objects.push_back( anObj._retn() ); + if (!anObj->_is_nil()) { + if (!IsPreview()) anObj->SetParameters(aParameters.join(":").toLatin1().constData()); + objects.push_back(anObj._retn()); } return true; @@ -780,7 +870,7 @@ bool EntityGUI_3DSketcherDlg::execute( ObjectList& objects ) // function : SetDoubleSpinBoxStep() // purpose : Double spin box management //================================================================================= -void EntityGUI_3DSketcherDlg::SetDoubleSpinBoxStep( double step ) +void EntityGUI_3DSketcherDlg::SetDoubleSpinBoxStep (double step) { Group3Spin->SpinBox_DX->setSingleStep(step); Group3Spin->SpinBox_DY->setSingleStep(step); @@ -796,9 +886,9 @@ void EntityGUI_3DSketcherDlg::SetDoubleSpinBoxStep( double step ) //================================================================================= void EntityGUI_3DSketcherDlg::ClickOnOk() { - Locker lock( myOK ); + Locker lock(myOK); - if ( !onAccept() ) + if (!onAccept()) return; ClickOnCancel(); @@ -811,19 +901,19 @@ void EntityGUI_3DSketcherDlg::ClickOnOk() bool EntityGUI_3DSketcherDlg::ClickOnApply() { QString msg; - if ( !isValid( msg ) ) { - showError( msg ); + if (!isValid(msg)) { + showError(msg); return false; } if (myPointsList.count() > 0) myPointsList.append(myPointsList[0]); - Locker lock( myOK ); + Locker lock(myOK); - if ( !onAccept() ) + if (!onAccept()) return false; - + ClickOnCancel(); return true; } @@ -849,59 +939,94 @@ EntityGUI_3DSketcherDlg::XYZ EntityGUI_3DSketcherDlg::getPenultimatePoint() cons //================================================================================= // function : getCurrentPoint() -// purpose : returns current points +// purpose : returns current point //================================================================================= EntityGUI_3DSketcherDlg::XYZ EntityGUI_3DSketcherDlg::getCurrentPoint() const { - XYZ xyz; - // Temporary way of doing this. To be changed with ordered improvement of the sketcher - if ( myMode == 2 ) - { - double anAngle = GroupAngles->SpinBox_DA->value() * M_PI/180.0; - double anAngle2 = 0.0; + XYZ xyz; + + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue("Geometry", "length_precision", 7); + + if (myMode == 2) { + if (GroupAngles->radioButton_1->isChecked()) + xyz.command = "OXY "; + else if (GroupAngles->radioButton_2->isChecked()) + xyz.command = "OYZ "; + else + xyz.command = "OXZ "; + + double anAngle = GroupAngles->SpinBox_DA->value(); double aLength = GroupAngles->SpinBox_DL->value(); - - if (GroupAngles->checkBox->isChecked()) - anAngle2 = GroupAngles->SpinBox_DA2->value() * M_PI/180.0; - + + double anAngle2 = 0.0; + QString da2 = "0"; + if (GroupAngles->checkBox->isChecked()) { + anAngle2 = GroupAngles->SpinBox_DA2->value(); + da2 = GroupAngles->SpinBox_DA2->text(); + } + + xyz.command += + QString::number(anAngle, 'g', aPrecision) + " " + + QString::number(anAngle2, 'g', aPrecision) + " " + + QString::number(aLength, 'g', aPrecision); + xyz.params = + GroupAngles->SpinBox_DA->text() + ":" + + da2 + ":" + + GroupAngles->SpinBox_DL->text(); + + // Calculate point coordinates for preview + anAngle = anAngle * M_PI/180.0; + anAngle2 = anAngle2 * M_PI/180.0; double aProjectedLength = aLength * cos(anAngle2); - - xyz = getLastPoint(); - if (GroupAngles->radioButton_1->isChecked()) + + XYZ xyzP = getLastPoint(); + if (GroupAngles->radioButton_1->isChecked()) // OXY { - xyz.x += aProjectedLength * cos(anAngle); - xyz.y += aProjectedLength * sin(anAngle); - xyz.z += aLength * sin(anAngle2); + xyz.x = xyzP.x + aProjectedLength * cos(anAngle); + xyz.y = xyzP.y + aProjectedLength * sin(anAngle); + xyz.z = xyzP.z + aLength * sin(anAngle2); } - else if (GroupAngles->radioButton_2->isChecked()) + else if (GroupAngles->radioButton_2->isChecked()) // OYZ { - xyz.y += aProjectedLength * cos(anAngle); - xyz.z += aProjectedLength * sin(anAngle); - xyz.x += aLength * sin(anAngle2); + xyz.y = xyzP.y + aProjectedLength * cos(anAngle); + xyz.z = xyzP.z + aProjectedLength * sin(anAngle); + xyz.x = xyzP.x + aLength * sin(anAngle2); } - else + else // OXZ { - xyz.z += aProjectedLength * sin(anAngle); - xyz.x += aProjectedLength * cos(anAngle); - xyz.y += aLength * sin(anAngle2); + xyz.z = xyzP.z + aProjectedLength * sin(anAngle); + xyz.x = xyzP.x + aProjectedLength * cos(anAngle); + xyz.y = xyzP.y + aLength * sin(anAngle2); } } - else - { - if ( myMode == 0 ) { + else { + if (myMode == 0) { // XYZ xyz.x = Group3Spin->SpinBox_DX->value(); xyz.y = Group3Spin->SpinBox_DY->value(); xyz.z = Group3Spin->SpinBox_DZ->value(); - } - else{ + xyz.command = "TT "; + } + else { // DXDYDZ xyz = getLastPoint(); xyz.x += Group3Spin->SpinBox_DX->value(); xyz.y += Group3Spin->SpinBox_DY->value(); xyz.z += Group3Spin->SpinBox_DZ->value(); + xyz.command = "T "; } - xyz.xt = Group3Spin->SpinBox_DX->text(); - xyz.yt = Group3Spin->SpinBox_DY->text(); - xyz.zt = Group3Spin->SpinBox_DZ->text(); + + double aX = Group3Spin->SpinBox_DX->value(); + double aY = Group3Spin->SpinBox_DY->value(); + double aZ = Group3Spin->SpinBox_DZ->value(); + + xyz.command += + QString::number(aX, 'g', aPrecision) + " " + + QString::number(aY, 'g', aPrecision) + " " + + QString::number(aZ, 'g', aPrecision); + xyz.params = + Group3Spin->SpinBox_DX->text() + ":" + + Group3Spin->SpinBox_DY->text() + ":" + + Group3Spin->SpinBox_DZ->text(); } return xyz; } @@ -911,97 +1036,97 @@ EntityGUI_3DSketcherDlg::XYZ EntityGUI_3DSketcherDlg::getCurrentPoint() const // Purpose : Method for displaying preview of resulting shape // Redefined from GEOMBase_Helper. //================================================================ -void EntityGUI_3DSketcherDlg::displayPreview( GEOM::GEOM_Object_ptr object, +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 ) -{ - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - + const int color) +{ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + QColor aColor = resMgr->colorValue("Geometry","line_color",QColor(255,0,0)); - Quantity_NameOfColor line_color = SalomeApp_Tools::color( aColor ).Name(); - + Quantity_NameOfColor line_color = SalomeApp_Tools::color(aColor).Name(); + // set width of displayed shape int lw = lineWidth; - if(lw == -1) { + if (lw == -1) { lw = resMgr->integerValue("Geometry", "preview_edge_width", -1); } - getDisplayer()->SetWidth( lw ); + getDisplayer()->SetWidth(lw); // Disable activation of selection - getDisplayer()->SetToActivate( activate ); + getDisplayer()->SetToActivate(activate); // Make a reference to GEOM_Object - CORBA::String_var objStr = myGeometryGUI->getApp()->orb()->object_to_string( object ); - getDisplayer()->SetName( objStr.in() ); + CORBA::String_var objStr = myGeometryGUI->getApp()->orb()->object_to_string(object); + getDisplayer()->SetName(objStr.in()); // Create wire from applied object TopoDS_Shape anApplyedWire, aLastSegment; - if ( !createShapes( object, anApplyedWire, aLastSegment ) ) + if (!createShapes(object, anApplyedWire, aLastSegment)) return; // Set color for preview shape - getDisplayer()->SetColor( line_color ); - + getDisplayer()->SetColor(line_color); + // Build prs - SALOME_Prs* aPrs = getDisplayer()->BuildPrs( anApplyedWire ); - if ( aPrs != 0 && !aPrs->IsNull() ) - GEOMBase_Helper::displayPreview( aPrs, append, update ); + 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()->SetColor(line_color); - getDisplayer()->SetColor( Quantity_NOC_VIOLET ); - aPrs = getDisplayer()->BuildPrs( aLastSegment ); - - if ( aPrs != 0 && !aPrs->IsNull() ) - GEOMBase_Helper::displayPreview( aPrs, append, update ); - - getDisplayer()->SetColor( line_color ); - // Display local trihedron if the mode is relatives coordinates or angles if (myMode == 1 || myMode == 2) displayTrihedron(2); - + // Display preview of suitable dimension presentations - if(myMode == 2) // ANGLES + if (myMode == 2) // ANGLES { double anAngle2 = 0.0; if (GroupAngles->checkBox->isChecked()) anAngle2 = GroupAngles->SpinBox_DA2->value(); - + displayAngle(GroupAngles->SpinBox_DA->value(), anAngle2, GroupAngles->SpinBox_DL->value(), myOrientation); - displayLength(GroupAngles->SpinBox_DL->value()); + displayLength(GroupAngles->SpinBox_DL->value(), /*store=*/false, /*type=*/myPrsType); } - if( myMode == 0 || myMode == 1 ) // COORDINATES - displayLength(); - + if (myMode == 0 || myMode == 1) // COORDINATES + displayLength(); + getDisplayer()->UnsetName(); // Enable activation of displayed objects - getDisplayer()->SetToActivate( true ); + getDisplayer()->SetToActivate(true); } //================================================================ // Function : displayTrihedron() // Purpose : Method for displaying trihedron //================================================================ -void EntityGUI_3DSketcherDlg::displayTrihedron(int selMode) +void EntityGUI_3DSketcherDlg::displayTrihedron (int selMode) { // Add trihedron to preview SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); - + gp_Pnt P(getLastPoint().x,getLastPoint().y,getLastPoint().z); Handle(Geom_Axis2Placement) anAxis = new Geom_Axis2Placement(P,gp::DZ(),gp::DX()); Handle(AIS_Trihedron) anIO = new AIS_Trihedron(anAxis); anIO->SetSelectionMode(selMode); - - SOCC_Prs* aSPrs = dynamic_cast(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0)); - - if (aSPrs) - { + + SOCC_Prs* aSPrs = dynamic_cast + (((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0)); + + if (aSPrs) { aSPrs->PrependObject(anIO); - GEOMBase_Helper::displayPreview( aSPrs, true, true ); + GEOMBase_Helper::displayPreview(aSPrs, true, true); } } @@ -1009,51 +1134,52 @@ void EntityGUI_3DSketcherDlg::displayTrihedron(int selMode) // Function : displayAngle() // Purpose : Method for displaying angle dimensions //================================================================ -void EntityGUI_3DSketcherDlg::displayAngle(double theAngle1, double theAngle2, double theLength, int theOrientation, bool store) +void EntityGUI_3DSketcherDlg::displayAngle (double theAngle1, double theAngle2, + double theLength, int theOrientation, bool store) { - if( Abs(theAngle2 - 90.0) < Precision::Angular() || - theLength < Precision::Confusion() ) + if (Abs(theAngle2 - 90.0) < Precision::Angular() || + theLength < Precision::Confusion()) return; - SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); - + SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); + XYZ Last = getLastPoint(); XYZ Current = getCurrentPoint(); - + gp_Pnt Last_Pnt(Last.x,Last.y,Last.z); gp_Pnt Current_Pnt(Current.x,Current.y,Current.z); gp_Pnt P1, P2; - + bool twoAngles = GroupAngles->checkBox->isChecked(); - + switch(theOrientation) { - case 1: //OXY - { + case OXY: + { P1 = gp_Pnt(Last.x + theLength,Last.y,Last.z); // X direction P2 = gp_Pnt(Last.x + theLength * cos(theAngle1 * M_PI / 180.), Last.y + theLength * sin(theAngle1 * M_PI / 180.), - Last.z); + Last.z); break; } - case 2: //OYZ + case OYZ: { P1 = gp_Pnt(Last.x, Last.y + theLength,Last.z); // Y direction - P2 = gp_Pnt(Last.x, + P2 = gp_Pnt(Last.x, Last.y + theLength * cos(theAngle1 * M_PI / 180.), - Last.z + theLength * sin(theAngle1 * M_PI / 180.)); + Last.z + theLength * sin(theAngle1 * M_PI / 180.)); break; } - case 3: //OXZ + case OXZ: { - P1 = gp_Pnt( Last.x + theLength,Last.y,Last.z); // X direction - P2 = gp_Pnt( Last.x + theLength * cos(theAngle1 * M_PI / 180.) , - Last.y, - Last.z + theLength * sin(theAngle1 * M_PI / 180.)); + P1 = gp_Pnt(Last.x + theLength,Last.y,Last.z); // X direction + P2 = gp_Pnt(Last.x + theLength * cos(theAngle1 * M_PI / 180.) , + Last.y, + Last.z + theLength * sin(theAngle1 * M_PI / 180.)); break; } } - + TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(P1); TopoDS_Vertex V2 = BRepBuilderAPI_MakeVertex(P2); TopoDS_Vertex LastV = BRepBuilderAPI_MakeVertex(Last_Pnt); @@ -1061,77 +1187,79 @@ void EntityGUI_3DSketcherDlg::displayAngle(double theAngle1, double theAngle2, d TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(LastV, V1); TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(LastV, V2); TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(LastV, CurV); - - gce_MakePln gce_MP(Last_Pnt, P1, P2); - Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP.Value()); - - // Covert angles to string + + gce_MakePln gce_MP (Last_Pnt, P1, P2); + Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP.Value()); + + // Convert angles to string std::string Angle1_str = doubleToString(theAngle1); std::string Angle2_str = doubleToString(theAngle2); - + // Create interactive object - Handle(AIS_AngleDimension) anAngleIO = new AIS_AngleDimension(anEdge1, anEdge2, aPlane, theAngle1 * M_PI / 180., - TCollection_ExtendedString(Angle1_str.c_str())); - anAngleIO->SetArrowSize( (theAngle1 * M_PI / 180) * (theLength/20) ); - + Handle(AIS_AngleDimension) anAngleIO = new AIS_AngleDimension + (anEdge1, anEdge2, aPlane, theAngle1 * M_PI / 180., + TCollection_ExtendedString(Angle1_str.c_str())); + anAngleIO->SetArrowSize((theAngle1 * M_PI / 180) * (theLength/20)); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); int w = resMgr->integerValue("Geometry", "measures_line_width", 1); - + Handle(Prs3d_AngleAspect) asp = new Prs3d_AngleAspect(); asp->LineAspect()->SetWidth(w); anAngleIO->Attributes()->SetAngleAspect(asp); - - SOCC_Prs* aSPrs = dynamic_cast(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0)); - + + SOCC_Prs* aSPrs = dynamic_cast + (((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0)); + if (store) { // Erase dimensions presentations ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Erase(myAnglePrs, true); - myAnglePrs->PrependObject(anAngleIO); - myPrsType = TYPE_ANGLE; // Overwrite type with ANGLE - + // Display modified presentation if (isAngleVisible) ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Display(myAnglePrs); } - else if(aSPrs) + else if (aSPrs) { aSPrs->AddObject(anAngleIO); } + myPrsType = TYPE_ANGLE; // Overwrite type with ANGLE if (twoAngles) { gce_MakePln gce_MP2(Last_Pnt, P2, Current_Pnt); Handle(Geom_Plane) aPlane2 = new Geom_Plane(gce_MP2.Value()); - - Handle(AIS_AngleDimension) anAngle2IO = new AIS_AngleDimension(anEdge2, anEdge3, aPlane2, theAngle2 * M_PI / 180., - TCollection_ExtendedString(Angle2_str.c_str())); - anAngle2IO->SetArrowSize( (theAngle2 * M_PI / 180) * (theLength/20) ); - + + Handle(AIS_AngleDimension) anAngle2IO = + new AIS_AngleDimension(anEdge2, anEdge3, aPlane2, theAngle2 * M_PI / 180., + TCollection_ExtendedString(Angle2_str.c_str())); + anAngle2IO->SetArrowSize((theAngle2 * M_PI / 180) * (theLength/20)); + anAngle2IO->Attributes()->SetAngleAspect(asp); - + if (store) { // Erase dimensions presentations ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Erase(myAnglePrs, true); - myAnglePrs->PrependObject(anAngle2IO); - myPrsType = TYPE_TWO_ANGLES; // Overwrite type with TWO_ANGLES - + // Display modified presentation if (isAngleVisible) ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Display(myAnglePrs); } else if (aSPrs) { - aSPrs->AddObject(anAngle2IO); + aSPrs->AddObject(anAngle2IO); } + + myPrsType = TYPE_TWO_ANGLES; // Overwrite type with TWO_ANGLES } - - if(!store && isAngleVisible) - { - GEOMBase_Helper::displayPreview( aSPrs, true, true ); + + if (!store && isAngleVisible) + { + GEOMBase_Helper::displayPreview(aSPrs, true, true); } } @@ -1139,152 +1267,178 @@ void EntityGUI_3DSketcherDlg::displayAngle(double theAngle1, double theAngle2, d // Function : displayLength() // Purpose : Method for displaying length dimensions //================================================================ -void EntityGUI_3DSketcherDlg::displayLength(double theLength, bool store) +void EntityGUI_3DSketcherDlg::displayLength (double theLength, bool store, int type) { SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); - + XYZ Last = getLastPoint(); XYZ Current = getCurrentPoint(); XYZ Penultimate = getPenultimatePoint(); - double aLength = 0.0; + bool withAngle = (type == TYPE_ANGLE || type == TYPE_TWO_ANGLES); + bool twoAngles = (type == TYPE_TWO_ANGLES); - if( theLength < 0) // Calculate length if not given + double aLength = 0.0; + + if (theLength < 0) // Calculate length if not given { aLength = sqrt((Last.x - Current.x)*(Last.x - Current.x) + - (Last.y - Current.y)*(Last.y - Current.y) + + (Last.y - Current.y)*(Last.y - Current.y) + (Last.z - Current.z)*(Last.z - Current.z)); } else aLength = theLength; - + if (aLength the plane is orthogonal to the angle presentation + // plane and contains the current edge + if (twoAngles) // If two angles + { + gp_XYZ Vec1_XY(Vec1.X(),Vec1.Y(),0.0);// --> define Vec3 as the projection of the current + Vec3 = gp_Vec(Vec1_XY); // edge on the plane chosen for the first angle + } + break; + } + case OYZ: + { + aNormal = gp::DX().Crossed(gp_Dir(Vec1)); + if (twoAngles) + { + gp_XYZ Vec1_YZ(0.0,Vec1.Y(),Vec1.Z()); + Vec3 = gp_Vec(Vec1_YZ); + } + break; + } + case OXZ: + { + aNormal = gp::DY().Crossed(gp_Dir(Vec1)); + if (twoAngles) + { + gp_XYZ Vec1_XZ(Vec1.X(),0.0,Vec1.Z()); + Vec3 = gp_Vec(Vec1_XZ); + } + break; + } } - } - - // Normal to the representation plane - gp_Dir Normal(Vec2.Crossed(Vec1)); - -// // Check orientation of plane in order to avoid it to change during an Angle preview -// MESSAGE("repere0 abs = "<< Abs(Normal.Dot(gp::DZ()) )) -// if ( Abs(Normal.Dot(gp::DZ())) > Precision::Confusion() ) -// { -// MESSAGE("repere1") -// if ( Normal.Dot(gp::DZ()) < 0.0 ){ -// MESSAGE("REVERSE on OZ basis") -// Normal.Reverse(); -// } -// } -// else if ( Abs(Normal.Dot(gp::DX())) > Precision::Confusion() ) -// { -// MESSAGE("repere2") -// if ( Normal.Dot(gp::DX()) < 0.0 ){ -// MESSAGE("REVERSE on OX basis") -// Normal.Reverse(); -// } -// } -// else if ( Abs(Normal.Dot(gp::DY())) > Precision::Confusion() ) -// { -// MESSAGE("repere3") -// if ( Normal.Dot(gp::DY()) < 0.0 ){ -// MESSAGE("REVERSE on OY basis") -// Normal.Reverse(); -// } -// } + if(twoAngles // If two angles + && Abs(Vec1.CrossMagnitude(Vec3)) > Precision::Confusion()) + { + aNormal = gp_Dir(Vec1.Crossed(Vec3));// --> set the normal as the cross product of + } // the current edge with its projection + } // it ensures that the dimension changes + else + { + // Check colinearity + if (Abs(Vec1.CrossMagnitude(Vec2)) < Precision::Confusion()) + { + Vec2 = gp_Vec(gp::DX()); + if (Abs(Vec1.CrossMagnitude(Vec2)) < Precision::Confusion()) + { + Vec2 = gp_Vec(gp::DY()); + } + } + aNormal = gp_Dir(Vec1.Crossed(Vec2)); // If no angles --> the plane is the one formed by + } // the last edge and the current one - gce_MakePln gce_MP(P1, Normal); + // Plane construction + gce_MakePln gce_MP(P1, aNormal); Handle(Geom_Plane) aPlane = new Geom_Plane(gce_MP.Value()); - - Handle(AIS_LengthDimension) anIO = new AIS_LengthDimension(aVert1, - aVert2, - aPlane, - aLength, - TCollection_ExtendedString(aLength_str.c_str())); + + Handle(AIS_LengthDimension) anIO = + new AIS_LengthDimension(aVert1, + aVert2, + aPlane, + aLength, + TCollection_ExtendedString(aLength_str.c_str())); anIO->SetArrowSize(aLength/20); - + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); int w = resMgr->integerValue("Geometry", "measures_line_width", 1); Handle(Prs3d_LengthAspect) asp = new Prs3d_LengthAspect(); asp->LineAspect()->SetWidth(w); anIO->Attributes()->SetLengthAspect(asp); - + if (store) { // Erase length dimensions presentation ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Erase(myLengthPrs, true); - myLengthPrs->PrependObject(anIO); - myPrsType = TYPE_LENGTH; - + // Display modified presentation if (isLengthVisible) ((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->Display(myLengthPrs); } - else if( isLengthVisible ) + else if (isLengthVisible) { - SOCC_Prs* aSPrs = dynamic_cast(((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0)); + SOCC_Prs* aSPrs = dynamic_cast + (((SOCC_Viewer*)(vw->getViewManager()->getViewModel()))->CreatePrs(0)); if (aSPrs) { aSPrs->PrependObject(anIO); - GEOMBase_Helper::displayPreview( aSPrs, true, true ); + GEOMBase_Helper::displayPreview(aSPrs, true, true); } } + + myPrsType = TYPE_LENGTH; } //================================================================ // Function : createShapes // Purpose : Create applyed wire, and last segment from entry object //================================================================ -bool EntityGUI_3DSketcherDlg::createShapes( GEOM::GEOM_Object_ptr /*theObject*/, +bool EntityGUI_3DSketcherDlg::createShapes (GEOM::GEOM_Object_ptr /*theObject*/, TopoDS_Shape& theApplyedWire, - TopoDS_Shape& theLastSegment ) + TopoDS_Shape& theLastSegment) { QList points; - foreach( XYZ xyz, myPointsList) { + foreach (XYZ xyz, myPointsList) { gp_Pnt p(xyz.x, xyz.y, xyz.z); - if ( points.isEmpty() || points.last().Distance(p) > gp::Resolution()) + if (points.isEmpty() || points.last().Distance(p) > gp::Resolution()) points << p; - } - - if ( points.count() == 1 ) { + } + + if (points.count() == 1) { // only one point is created BRepBuilderAPI_MakeVertex mkVertex (points.last()); theApplyedWire = mkVertex.Shape(); } - else if ( points.count() > 1 ) { + else if (points.count() > 1) { // wire is created BRepBuilderAPI_MakePolygon mkWire; - foreach( gp_Pnt p, points ) + foreach(gp_Pnt p, points) mkWire.Add(p); theApplyedWire = mkWire.Shape(); } XYZ curxyz = getCurrentPoint(); gp_Pnt curpnt(curxyz.x, curxyz.y, curxyz.z); - - if ( points.isEmpty() || points.last().Distance(curpnt) <= gp::Resolution() ) { + + if (points.isEmpty() || points.last().Distance(curpnt) <= gp::Resolution()) { BRepBuilderAPI_MakeVertex mkVertex (curpnt); theLastSegment = mkVertex.Shape(); } @@ -1295,34 +1449,34 @@ bool EntityGUI_3DSketcherDlg::createShapes( GEOM::GEOM_Object_ptr /*theObject*/, /* VSR: old algorithm does not work properly, see bug 0020899 TopoDS_Shape aShape; - if ( !GEOMBase::GetShape( theObject, aShape ) ) + if (!GEOMBase::GetShape(theObject, aShape)) return false; - if( aShape.ShapeType() != TopAbs_WIRE && aShape.ShapeType() != TopAbs_VERTEX ) + if (aShape.ShapeType() != TopAbs_WIRE && aShape.ShapeType() != TopAbs_VERTEX) return false; theApplyedWire = aShape; - if ( myOK ) + if (myOK) return true; BRepBuilderAPI_MakeWire aBuilder; - TopExp_Explorer edgeExp( aShape, TopAbs_EDGE ); - while ( 1 ) { + TopExp_Explorer edgeExp(aShape, TopAbs_EDGE); + while (1) { TopoDS_Shape anEdge = edgeExp.Current(); edgeExp.Next(); - if ( edgeExp.More() ) // i.e. non-last edge - aBuilder.Add( TopoDS::Edge( anEdge ) ); + if (edgeExp.More()) // i.e. non-last edge + aBuilder.Add(TopoDS::Edge(anEdge)); else { theLastSegment = anEdge; break; } } - if ( aBuilder.IsDone() ) { + if (aBuilder.IsDone()) { theApplyedWire = aBuilder.Shape(); } - else if ( !theLastSegment.IsNull() ) { - TopExp_Explorer vertexExp( theLastSegment, TopAbs_VERTEX ); + else if (!theLastSegment.IsNull()) { + TopExp_Explorer vertexExp(theLastSegment, TopAbs_VERTEX); theApplyedWire = vertexExp.Current(); } */ @@ -1334,11 +1488,11 @@ bool EntityGUI_3DSketcherDlg::createShapes( GEOM::GEOM_Object_ptr /*theObject*/, // Function : doubleToString // Purpose : converts double to string //================================================================ -std::string EntityGUI_3DSketcherDlg::doubleToString(double num) +std::string EntityGUI_3DSketcherDlg::doubleToString (double num) { // truncate num int digNum = 5; char format = 'g'; // truncated to a number of significant digits - - return QString::number( num, format, digNum).toStdString(); + + return QString::number(num, format, digNum).toStdString(); } diff --git a/src/EntityGUI/EntityGUI_3DSketcherDlg.h b/src/EntityGUI/EntityGUI_3DSketcherDlg.h index af81a199d..8888cf065 100755 --- a/src/EntityGUI/EntityGUI_3DSketcherDlg.h +++ b/src/EntityGUI/EntityGUI_3DSketcherDlg.h @@ -15,12 +15,11 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // GEOM GEOMGUI : GUI for Geometry component // File : EntityGUI_3DSketcherDlg.h // Author : DMV, OCN -// + #ifndef ENTITYGUI_3DSKETCHERDLG_H #define ENTITYGUI_3DSKETCHERDLG_H @@ -53,14 +52,15 @@ class EntityGUI_3DSketcherDlg : public GEOMBase_Skeleton struct XYZ { - XYZ() { x = y = z = 0.0; xt = yt = zt = "0.0"; } - double x, y, z; - QString xt, yt, zt; + XYZ() { x = y = z = 0.0; command = params = ""; } + double x, y, z; // for preview only + QString command; + QString params; }; typedef QList XYZList; public: - EntityGUI_3DSketcherDlg( GeometryGUI*, QWidget* = 0, bool = false, Qt::WindowFlags = 0, const double = 2. ); + EntityGUI_3DSketcherDlg (GeometryGUI*, QWidget* = 0, bool = false, Qt::WindowFlags = 0, const double = 2.); ~EntityGUI_3DSketcherDlg(); protected: @@ -85,7 +85,7 @@ private: void displayTrihedron( int ); void displayAngle( double, double, double, int, bool store = false ); - void displayLength( double theLength = -1.0, bool store = false ); + void displayLength( double theLength = -1.0, bool store = false, int type = 1); bool createShapes( GEOM::GEOM_Object_ptr, TopoDS_Shape&, @@ -132,6 +132,7 @@ private slots: bool ClickOnApply(); // bool isSameAsPrevious(); void UpdateButtonsState(); + void UpdatePointCoordinates(); void ClickOnUndo(); void ClickOnRedo(); diff --git a/src/EntityGUI/EntityGUI_Controls_QTD.ui b/src/EntityGUI/EntityGUI_Controls_QTD.ui index 0c3222bea..b58621ea5 100644 --- a/src/EntityGUI/EntityGUI_Controls_QTD.ui +++ b/src/EntityGUI/EntityGUI_Controls_QTD.ui @@ -6,8 +6,8 @@ 0 0 - 327 - 50 + 278 + 181 @@ -19,23 +19,118 @@ + + + 0 + 0 + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + Start: + + + + + + + X + + + + + + + + + + Y + + + + + + + + + + Z + + + + + + + + + + End: + + + + + + + X + + + + + + + + + + Y + + + + + + + + + + Z + + + + + + + diff --git a/src/EntityGUI/EntityGUI_SketcherDlg.cxx b/src/EntityGUI/EntityGUI_SketcherDlg.cxx index d0333cd59..b884d9067 100644 --- a/src/EntityGUI/EntityGUI_SketcherDlg.cxx +++ b/src/EntityGUI/EntityGUI_SketcherDlg.cxx @@ -674,6 +674,13 @@ void EntityGUI_SketcherDlg::DestClicked( int constructorId ) GroupD2->show(); Group3Spin->checkBox->hide(); Group4Spin->checkBox->hide(); + if (myConstructorId == 1) { + myRadius = 100.0; + myLength = 30.0; + myAngle = 0.0; + myDX = 0.0; + myDY = 0.0; + } Dir1Clicked( 2 ); // Angle } resize( minimumSizeHint() ); @@ -899,8 +906,18 @@ void EntityGUI_SketcherDlg::Dir1Clicked( int constructorId ) void EntityGUI_SketcherDlg::Dir2Clicked( int constructorId ) { InitClick(); - myAngle = 0.0; - + Group3Spin->SpinBox_DX->blockSignals(true); // Block signals in order not to modify + Group3Spin->SpinBox_DY->blockSignals(true); // defaut values + Group3Spin->SpinBox_DZ->blockSignals(true); + + Group2Spin->SpinBox_DX->blockSignals(true); + Group2Spin->SpinBox_DY->blockSignals(true); + + Group4Spin->SpinBox_DX->blockSignals(true); + Group4Spin->SpinBox_DY->blockSignals(true); + Group4Spin->SpinBox_DZ->blockSignals(true); + Group4Spin->SpinBox_DS->blockSignals(true); + // Get setting of step value from file configuration double step = SUIT_Session::session()->resourceMgr()->doubleValue( "Geometry", "SettingsGeomStep", 100.0 ); @@ -980,9 +997,7 @@ void EntityGUI_SketcherDlg::Dir2Clicked( int constructorId ) initSpinBox( Group3Spin->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision" ); Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_VX2" ) ); Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_VY2" ) ); - myDX = 0.0; Group3Spin->SpinBox_DX->setValue( myDX ); - myDY = 0.0; Group3Spin->SpinBox_DY->setValue( myDY ); Group3Spin->show(); Group3Spin->buttonApply->setFocus(); @@ -1015,9 +1030,7 @@ void EntityGUI_SketcherDlg::Dir2Clicked( int constructorId ) Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_RADIUS2" ) ); Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_ANGLE2" )); Group3Spin->SpinBox_DX->setValue( myAngle ); - myRadius = 100.0; Group3Spin->SpinBox_DY->setValue( myRadius ); - myLength = 30.0; Group3Spin->SpinBox_DZ->setValue( myLength ); Group3Spin->show(); Group3Spin->buttonApply->setFocus(); @@ -1030,9 +1043,9 @@ void EntityGUI_SketcherDlg::Dir2Clicked( int constructorId ) initSpinBox( Group2Spin->SpinBox_DY, COORD_MIN, COORD_MAX, 5., "angle_precision" ); Group2Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_RADIUS2" ) ); Group2Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_ANGLE2" ) ); - myRadius = 100.0; +// myRadius = 100.0; Group2Spin->SpinBox_DX->setValue( myRadius ); - myLength = 30.0; +// myLength = 30.0; Group2Spin->SpinBox_DY->setValue( myLength ); Group2Spin->show(); Group2Spin->buttonApply->setFocus(); @@ -1045,9 +1058,9 @@ void EntityGUI_SketcherDlg::Dir2Clicked( int constructorId ) initSpinBox( Group2Spin->SpinBox_DY, COORD_MIN, COORD_MAX, 5., "angle_precision" ); Group2Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_RADIUS2" ) ); Group2Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_ANGLE2" ) ); - myRadius = 100.0; +// myRadius = 100.0; Group2Spin->SpinBox_DX->setValue( myRadius ); - myLength = 30.0; +// myLength = 30.0; Group2Spin->SpinBox_DY->setValue( myLength ); Group2Spin->show(); Group2Spin->buttonApply->setFocus(); @@ -1064,19 +1077,29 @@ void EntityGUI_SketcherDlg::Dir2Clicked( int constructorId ) initSpinBox( Group4Spin->SpinBox_DX, COORD_MIN, COORD_MAX, 0.1, "length_precision" ); initSpinBox( Group4Spin->SpinBox_DY, COORD_MIN, COORD_MAX, 0.1, "length_precision" ); initSpinBox( Group4Spin->SpinBox_DS, COORD_MIN, COORD_MAX, 5., "length_precision" ); - myDX = 0.0; Group4Spin->SpinBox_DX->setValue( myDX ); - myDY = 0.0; Group4Spin->SpinBox_DY->setValue( myDY ); - myRadius = 100.0; +// myRadius = 100.0; Group4Spin->SpinBox_DZ->setValue( myRadius ); - myLength = 30.0; +// myLength = 30.0; Group4Spin->SpinBox_DS->setValue( myLength ); Group4Spin->show(); Group4Spin->buttonApply->setFocus(); } } } + Group3Spin->SpinBox_DX->blockSignals(false); // Restore signals + Group3Spin->SpinBox_DY->blockSignals(false); + Group3Spin->SpinBox_DZ->blockSignals(false); + + Group2Spin->SpinBox_DX->blockSignals(false); + Group2Spin->SpinBox_DY->blockSignals(false); + + Group4Spin->SpinBox_DX->blockSignals(false); + Group4Spin->SpinBox_DY->blockSignals(false); + Group4Spin->SpinBox_DZ->blockSignals(false); + Group4Spin->SpinBox_DS->blockSignals(false); + resize( minimumSizeHint() ); GEOMBase_Helper::displayPreview( true, false, true, true, myLineWidth ); } diff --git a/src/GEOM/GEOM_Engine.cxx b/src/GEOM/GEOM_Engine.cxx index 6efcaf7e0..32d3e97c2 100644 --- a/src/GEOM/GEOM_Engine.cxx +++ b/src/GEOM/GEOM_Engine.cxx @@ -674,12 +674,13 @@ TCollection_AsciiString GEOM_Engine::DumpPython(int theDocID, // add function description before dump if (!aCurScript.IsEmpty()) { - if ( aFunction->GetDriverGUID() == GEOM_Object::GetSubShapeID() ) + if ( aFunction->GetDriverGUID() == GEOM_Object::GetSubShapeID() && + aFuncScript.Length() > aCurScript.Length() ) // avoid repeated SubShape...() command at the end if (aFuncScript.Location( aCurScript, aFuncScript.Length() - aCurScript.Length(), aFuncScript.Length())) - continue; + continue; // aCurScript is already at the end of aFuncScript aFuncScript += aCurScript; } if (isDumpCollected ) { @@ -960,7 +961,7 @@ std::list GEOM_Engine::getAllTextures(int theDocID) //============================================================================= /*! - * ProcessFunction: Dump fucntion description into script + * ProcessFunction: Dump function description into script */ //============================================================================= bool ProcessFunction(Handle(GEOM_Function)& theFunction, @@ -1022,6 +1023,16 @@ bool ProcessFunction(Handle(GEOM_Function)& theFunction, //Check if its internal function which doesn't requires dumping if(aDescr == "None") return false; + //Check the very specific case of RestoreShape function, + //which is not dumped, but the result can be published by the user. + //We do not publish such objects to decrease danger of dumped script failure. + if(aDescr.Value(1) == '#') { + TCollection_AsciiString anObjEntry; + TDF_Tool::Entry(theFunction->GetOwnerEntry(), anObjEntry); + theIgnoreObjs.insert(anObjEntry); + return false; + } + // 0020001 PTv, check for critical functions, which require dump of objects if (theIsPublished) { @@ -1035,6 +1046,95 @@ bool ProcessFunction(Handle(GEOM_Function)& theFunction, //Replace parameter by notebook variables ReplaceVariables(aDescr,theVariables); + + //Process sketcher functions, replacing string command by calls to Sketcher interface + if (aDescr.Search( "Make3DSketcher" ) != -1) { + TCollection_AsciiString aNewDescr; + int i = 1; + TCollection_AsciiString aSubStr = aDescr.Token("\n\t", i); + for (; !aSubStr.IsEmpty(); aSubStr = aDescr.Token("\n\t", i)) { + if (aSubStr.Search( "Make3DSketcherCommand" ) != -1) { + TCollection_AsciiString aResult = aSubStr.Token(" ", 1); + // "3DSketcher:CMD[:CMD[:CMD...]]" + TCollection_AsciiString aCommand = aSubStr.Token("\"", 2); + + // Split the command string to separate CMDs + int icmd = 2; + TColStd_SequenceOfAsciiString aSequence; + if (aCommand.Length()) { + TCollection_AsciiString aToken = aCommand.Token(":", icmd); + while (aToken.Length() > 0) { + aSequence.Append(aToken); + aToken = aCommand.Token(":", ++icmd); + } + } + + if (aSequence.Length() > 0) { + if (i > 1) + aNewDescr += "\n\t"; + + aNewDescr += "sk = geompy.Sketcher3D()"; + int nbCMDs = aSequence.Length(); + for (icmd = 1; icmd <= nbCMDs; icmd++) { + aNewDescr += "\n\t"; + + TCollection_AsciiString aCMD = aSequence.Value(icmd); + + // Split the CMD into string values + TColStd_SequenceOfAsciiString aStrVals; + int ival = 1; + TCollection_AsciiString aToken = aCMD.Token(" ", ival); + while (aToken.Length() > 0) { + aStrVals.Append(aToken); + aToken = aCMD.Token(" ", ++ival); + } + + TCollection_AsciiString aCMDpref = aStrVals.Value(1); + if (aCMDpref == "TT") { + aNewDescr += "sk.addPointsAbsolute("; + aNewDescr += aStrVals.Value(2) + ", " + aStrVals.Value(3) + ", " + aStrVals.Value(4) + ")"; + } + else if (aCMDpref == "T") { + aNewDescr += "sk.addPointsRelative("; + aNewDescr += aStrVals.Value(2) + ", " + aStrVals.Value(3) + ", " + aStrVals.Value(4) + ")"; + } + else if (aCMDpref == "WW") { + aNewDescr += "sk.close()"; + } + else { + aNewDescr += "sk.addPointAnglesLength(\""; + aNewDescr += aCMDpref + "\", " + + aStrVals.Value(2) + ", " + aStrVals.Value(3) + ", " + aStrVals.Value(4) + ")"; + } + } + aNewDescr += "\n\t"; + aNewDescr += aResult + " = sk.wire()"; + } + } // Make3DSketcherCommand + else if (aSubStr.Search( "Make3DSketcher" ) != -1) { + TCollection_AsciiString aResult = aSubStr.Token(" ", 1); + TCollection_AsciiString aCommand = aSubStr.Token("[", 2); + aCommand = aCommand.Token("]", 1); + if (i > 1) + aNewDescr += "\n\t"; + aNewDescr += "sk = geompy.Sketcher3D()"; + aNewDescr += "\n\t"; + aNewDescr += "sk.addPointsAbsolute("; + aNewDescr += aCommand + ")"; + aNewDescr += "\n\t"; + aNewDescr += aResult + " = sk.wire()"; + } + else { + if (i > 1) + aNewDescr += "\n\t"; + aNewDescr += aSubStr; + } + + i++; + } + aDescr = aNewDescr; + } + if ( theIsDumpCollected ) { int i = 1; bool isBefore = true; diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cxx b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cxx index a599ca89e..5bfdb55cb 100644 --- a/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cxx +++ b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cxx @@ -570,9 +570,11 @@ void GEOMAlgo_ShapeInfoFiller::FillEdge(const TopoDS_Shape& aS) aPc.SetXYZ(aXYZc); aInfo.SetLocation(aPc); // - gp_Vec aVec(aPc, aP2); - gp_Dir aDir(aVec); - aInfo.SetDirection(aDir); + if ( aLength >= gp::Resolution() ) { + gp_Vec aVec(aPc, aP2); + gp_Dir aDir(aVec); + aInfo.SetDirection(aDir); + } } //modified by NIZNHY-PKV Tue Jul 03 10:19:06 2012t // Line diff --git a/src/GEOMGUI/GEOMGUI_Selection.cxx b/src/GEOMGUI/GEOMGUI_Selection.cxx index 734234269..0aa1da20a 100644 --- a/src/GEOMGUI/GEOMGUI_Selection.cxx +++ b/src/GEOMGUI/GEOMGUI_Selection.cxx @@ -18,11 +18,10 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // File : GEOMGUI_Selection.cxx // Author : Alexander SOLOVYOV, Open CASCADE S.A.S. (alexander.solovyov@opencascade.com) -// + #include "GEOMGUI_Selection.h" #include "GeometryGUI.h" @@ -159,10 +158,12 @@ QVariant GEOMGUI_Selection::parameter( const int idx, const QString& p ) const v = isVectorsMode( idx ); else if ( p == "topLevel" ) v = topLevel( idx ); - else if ( p == "hasHiddenChildren" ) - v = hasHiddenChildren( idx ); - else if ( p == "hasShownChildren" ) - v = hasShownChildren( idx ); + else if ( p == "hasChildren" ) + v = hasChildren( idx ); + else if ( p == "hasConcealedChildren" ) + v = hasConcealedChildren( idx ); + else if ( p == "hasDisclosedChildren" ) + v = hasDisclosedChildren( idx ); else if ( p == "compoundOfVertices" ) v = compoundOfVertices( idx ); else if ( p == "imported" ) @@ -446,7 +447,23 @@ bool GEOMGUI_Selection::isCompoundOfVertices( GEOM::GEOM_Object_ptr obj ) return ret; } -bool GEOMGUI_Selection::hasHiddenChildren( const int index ) const +bool GEOMGUI_Selection::hasChildren( const int index ) const +{ + bool ok = false; + SalomeApp_Study* appStudy = dynamic_cast( study() ); + + if ( appStudy ) { + QString anEntry = entry( index ); + _PTR(Study) study = appStudy->studyDS(); + if ( study && !anEntry.isEmpty() ) { + _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) ); + ok = hasChildren( aSO ); + } + } + return ok; +} + +bool GEOMGUI_Selection::hasConcealedChildren( const int index ) const { bool OK = false; SalomeApp_Study* appStudy = dynamic_cast( study() ); @@ -462,7 +479,7 @@ bool GEOMGUI_Selection::hasHiddenChildren( const int index ) const return OK; } -bool GEOMGUI_Selection::hasShownChildren( const int index ) const +bool GEOMGUI_Selection::hasDisclosedChildren( const int index ) const { bool OK = false; SalomeApp_Study* appStudy = dynamic_cast( study() ); diff --git a/src/GEOMGUI/GEOMGUI_Selection.h b/src/GEOMGUI/GEOMGUI_Selection.h index c6e9b59da..acef7e196 100644 --- a/src/GEOMGUI/GEOMGUI_Selection.h +++ b/src/GEOMGUI/GEOMGUI_Selection.h @@ -18,11 +18,10 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // File : GEOMGUI_Selection.h // Author : Alexander SOLOVYOV, Open CASCADE S.A.S. (alexander.solovyov@opencascade.com) -// + #ifndef GEOMGUI_SELECTION_H #define GEOMGUI_SELECTION_H @@ -66,8 +65,9 @@ private: QString displayMode( const int ) const; QString selectionMode() const; bool isVectorsMode( const int ) const; - bool hasHiddenChildren( const int ) const; - bool hasShownChildren( const int ) const; + bool hasChildren( const int ) const; + bool hasConcealedChildren( const int ) const; + bool hasDisclosedChildren( const int ) const; bool compoundOfVertices( const int ) const; bool topLevel( const int ) const; bool isPhysicalMaterial( const int ) const; diff --git a/src/GEOMGUI/GEOM_Displayer.cxx b/src/GEOMGUI/GEOM_Displayer.cxx index 15f36281d..7edbae5b2 100644 --- a/src/GEOMGUI/GEOM_Displayer.cxx +++ b/src/GEOMGUI/GEOM_Displayer.cxx @@ -114,6 +114,13 @@ #include #endif +// If the next macro is defined, autocolor feature works for all sub-shapes; +// if it is undefined, autocolor feature works for groups only +//#define GENERAL_AUTOCOLOR +// Below macro, when uncommented, switches on simplified (more performant) algorithm +// of auto-color picking up +//#define SIMPLE_AUTOCOLOR + //================================================================ // Function : getActiveStudy // Purpose : Get active study, returns 0 if no open study frame @@ -1823,6 +1830,40 @@ int GEOM_Displayer::UnsetDisplayMode() return aPrevMode; } +SALOMEDS::Color GEOM_Displayer::getPredefinedUniqueColor() +{ + static QList colors; + + if ( colors.isEmpty() ) { + const int rfactor = 4; // red color component split factor, must be > 0 + const int gfactor = 4; // green color component split factor, must be > 0 + const int bfactor = 3; // blue color component split factor, must be > 0 + // - + // total number of pre-defined colors is defined as + // nbcolors = rfactor * gfactor * bfactor + // NB: all three factors should not have same values + // otherwise all colors will be greyish + + for ( int g = 0; g < gfactor; g++ ) { + for ( int r = 0; r < rfactor; r++ ) { + for ( int b = 0; b < bfactor; b++ ) + colors.append( QColor( qRgb( r * 255 / (rfactor-1), g * 255 / (gfactor-1), b * 255 / (bfactor-1) ) ) ); + } + } + } + + static int currentColor = 0; + + SALOMEDS::Color color; + color.R = (double)colors[currentColor].red() / 255.0; + color.G = (double)colors[currentColor].green() / 255.0; + color.B = (double)colors[currentColor].blue() / 255.0; + + currentColor = (currentColor+1) % colors.count(); + + return color; +} + SALOMEDS::Color GEOM_Displayer::getUniqueColor( const QList& theReservedColors ) { int aHue = -1; @@ -2003,48 +2044,50 @@ SALOMEDS::Color GEOM_Displayer::getColor(GEOM::GEOM_Object_var theGeomObject, bo hasColor = false; SUIT_Session* session = SUIT_Session::session(); - SUIT_Application* app = session->activeApplication(); + SalomeApp_Application* app = dynamic_cast( session->activeApplication() ); if ( app && !theGeomObject->_is_nil()) { SalomeApp_Study* study = dynamic_cast( app->activeStudy() ); if ( study ) { + _PTR(Study) aStudy = study->studyDS(); aSColor = theGeomObject->GetColor(); hasColor = aSColor.R >= 0 && aSColor.G >= 0 && aSColor.B >= 0; - if( !hasColor && theGeomObject->GetType() == GEOM_GROUP ) { // auto color for group - GEOM::GEOM_Gen_var theGeomGen = GeometryGUI::GetGeomGen(); - GEOM::GEOM_IGroupOperations_var anOperations = theGeomGen->GetIGroupOperations( study->id() ); - GEOM::GEOM_Object_var aMainObject = anOperations->GetMainShape( theGeomObject ); - if ( !aMainObject->_is_nil() && aMainObject->GetAutoColor() ) - { - QList aReservedColors; - - SalomeApp_Application* app = dynamic_cast( app ); - CORBA::String_var IOR = app->orb()->object_to_string( aMainObject ); - if ( strcmp(IOR.in(), "") != 0 ) - { - _PTR(Study) aStudy = study->studyDS(); - _PTR(SObject) aMainSObject( aStudy->FindObjectIOR( std::string(IOR) ) ); - _PTR(ChildIterator) it( aStudy->NewChildIterator( aMainSObject ) ); - for( ; it->More(); it->Next() ) - { - _PTR(SObject) aChildSObject( it->Value() ); - GEOM::GEOM_Object_var aChildObject = - GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aChildSObject)); - if( CORBA::is_nil( aChildObject ) ) - continue; - - if( aChildObject->GetType() != GEOM_GROUP ) - continue; - - SALOMEDS::Color aReservedColor = aChildObject->GetColor(); - aReservedColors.append( aReservedColor ); - } - } - - aSColor = getUniqueColor( aReservedColors ); - hasColor = true; - } + if ( !hasColor ) { +#ifdef GENERAL_AUTOCOLOR // auto-color for all sub-shapes + bool general_autocolor = true; +#else // auto-color for groups only + bool general_autocolor = false; +#endif // GENERAL_AUTOCOLOR + if ( general_autocolor || theGeomObject->GetType() == GEOM_GROUP ) { + GEOM::GEOM_Object_var aMainObject = theGeomObject->GetMainShape(); + if ( !CORBA::is_nil( aMainObject ) && aMainObject->GetAutoColor() ) { +#ifdef SIMPLE_AUTOCOLOR // simplified algorithm for auto-colors + aSColor = getPredefinedUniqueColor(); + hasColor = true; +#else // old algorithm for auto-colors + QList aReservedColors; + CORBA::String_var IOR = app->orb()->object_to_string( aMainObject ); + _PTR(SObject) aMainSObject( aStudy->FindObjectIOR( IOR.in() ) ); + if ( aMainSObject ) { + _PTR(ChildIterator) it( aStudy->NewChildIterator( aMainSObject ) ); + for ( ; it->More(); it->Next() ) { + _PTR(SObject) aChildSObject( it->Value() ); + GEOM::GEOM_Object_var aChildObject = + GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aChildSObject)); + if ( CORBA::is_nil( aChildObject ) ) + continue; + + SALOMEDS::Color aReservedColor = aChildObject->GetColor(); + if ( aReservedColor.R >= 0 && aReservedColor.G >= 0 && aReservedColor.B >= 0 ) + aReservedColors.append( aReservedColor ); + } + } + aSColor = getUniqueColor( aReservedColors ); + hasColor = true; +#endif // SIMPLE_AUTOCOLOR + } + } } } } diff --git a/src/GEOMGUI/GEOM_Displayer.h b/src/GEOMGUI/GEOM_Displayer.h index 07305f66b..656612776 100644 --- a/src/GEOMGUI/GEOM_Displayer.h +++ b/src/GEOMGUI/GEOM_Displayer.h @@ -169,6 +169,7 @@ public: SalomeApp_Study* getStudy() const; static SALOMEDS::Color getUniqueColor( const QList& ); + static SALOMEDS::Color getPredefinedUniqueColor(); static PropMap getDefaultPropertyMap(const QString& viewer_type); diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index d15ade1d2..96b164f7b 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -167,6 +167,10 @@ ICON_DLG_CHECK_COMPOUND_OF_BLOCKS check_blocks_compound.png + + ICON_DLG_GETNONBLOCKS + get_non_blocks.png + ICON_DLG_CHECK_SELF_INTERSECTIONS check_self_intersections.png @@ -739,6 +743,10 @@ ICO_CHECK_COMPOUND check_blocks_compound.png + + ICO_GET_NON_BLOCKS + get_non_blocks.png + ICO_CHECK_SELF_INTERSECTIONS check_self_intersections.png @@ -763,6 +771,10 @@ ICO_COMMON common.png + + ICO_GROUP_INTERSECT + common.png + ICO_COMPOUND build_compound.png @@ -783,6 +795,10 @@ ICO_CUT cut.png + + ICO_GROUP_CUT + cut.png + ICO_CYLINDER cylinder.png @@ -887,6 +903,10 @@ ICO_FUSE fuse.png + + ICO_GROUP_UNION + fuse.png + ICO_GLUE_FACES glue.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index cf4c13db2..d0ec111bb 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -7,6 +7,10 @@ BRep_API: command not done Error: can't build object + + PAL_NOT_DONE_ERROR + Operation aborted + CHANGE_ORIENTATION_NEW_OBJ_NAME Invert @@ -357,6 +361,18 @@ Please, select face, shell or solid and try again GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES Incriminated Sub-shapes + + GEOM_GETNONBLOCKS_TITLE + Get non-hexahedral solids and non-quadrangular faces + + + GEOM_GETNONBLOCKS + Get non blocks + + + GEOM_NONBLOCKS + NonBlocksGroup + GEOM_CHECK_INFOS Object And Its Topological Information @@ -1830,6 +1846,10 @@ Please, select face, shell or solid and try again GEOM_COORDINATES_TYPE Coordinates Type + + GEOM_CONTROLS + Dimensions + GEOM_SOLID Solid @@ -2310,6 +2330,10 @@ Please, select face, shell or solid and try again MEN_CHECK_COMPOUND Check Compound of Blocks + + MEN_GET_NON_BLOCKS + Get Non Blocks + MEN_CHECK_SELF_INTERSECTIONS Detect Self-intersections @@ -2422,6 +2446,10 @@ Please, select face, shell or solid and try again MEN_DISPLAY_ONLY Show Only + + MEN_SHOW_ONLY_CHILDREN + Show Only Children + MEN_BRING_TO_FRONT Bring To Front @@ -2550,6 +2578,18 @@ Please, select face, shell or solid and try again MEN_GROUP_EDIT Edit + + MEN_GROUP_UNION + Union Groups + + + MEN_GROUP_INTERSECT + Intersect Groups + + + MEN_GROUP_CUT + Cut Groups + MEN_RELOAD_IMPORTED Reload From Disk @@ -2667,12 +2707,12 @@ Please, select face, shell or solid and try again Create Group - MEN_POP_SHOW_CHILDREN - Show Children + MEN_POP_DISCLOSE_CHILDREN + Disclose child items - MEN_POP_HIDE_CHILDREN - Hide Children + MEN_POP_CONCEAL_CHILDREN + Conceal child items MEN_POP_UNPUBLISH_OBJ @@ -3154,6 +3194,10 @@ Please, select face, shell or solid and try again STB_CHECK_COMPOUND Check compound of blocks + + STB_GET_NON_BLOCKS + Get non blocks + STB_CHECK_SELF_INTERSECTIONS Detect Self-intersections @@ -3234,6 +3278,10 @@ Please, select face, shell or solid and try again STB_DISPLAY_ONLY Show only + + STB_SHOW_ONLY_CHILDREN + Show Only Children + STB_EDGE Build an edge @@ -3322,6 +3370,18 @@ Please, select face, shell or solid and try again STB_GROUP_EDIT Edit a group + + STB_GROUP_UNION + Union Groups + + + STB_GROUP_INTERSECT + Intersect Groups + + + STB_GROUP_CUT + Cut Groups + STB_RELOAD_IMPORTED Reload imported shape from its original place on disk @@ -3426,10 +3486,6 @@ Please, select face, shell or solid and try again STB_POP_CREATE_GROUP Create Group - - STB_POP_SHOW_CHILDREN - Show child objects - STB_POP_UNPUBLISH_OBJ Unpublish object @@ -3439,8 +3495,12 @@ Please, select face, shell or solid and try again Publish object - STB_POP_HIDE_CHILDREN - Hide child objects + STB_POP_DISCLOSE_CHILDREN + Disclose child items + + + STB_POP_CONCEAL_CHILDREN + Conceal child items STB_POP_ISOS @@ -3762,6 +3822,10 @@ Please, select face, shell or solid and try again TOP_CHECK_COMPOUND Check compound of blocks + + TOP_GET_NON_BLOCKS + Get non blocks + TOP_CHECK_SELF_INTERSECTIONS Detect Self-intersections @@ -3838,6 +3902,10 @@ Please, select face, shell or solid and try again TOP_DISPLAY_ONLY Show only + + TOP_SHOW_ONLY_CHILDREN + Show Only Children + TOP_EDGE Build edge @@ -3918,6 +3986,18 @@ Please, select face, shell or solid and try again TOP_GROUP_EDIT Edit a group + + TOP_GROUP_UNION + Union Groups + + + TOP_GROUP_INTERSECT + Intersect Groups + + + TOP_GROUP_CUT + Cut Groups + TOP_HEX_SOLID Hexahedral Solid @@ -4026,10 +4106,6 @@ Please, select face, shell or solid and try again TOP_POP_CREATE_GROUP Create Group - - TOP_POP_SHOW_CHILDREN - Show Children - TOP_POP_UNPUBLISH_OBJ Unpublish object @@ -4039,8 +4115,12 @@ Please, select face, shell or solid and try again Publish object - TOP_POP_HIDE_CHILDREN - Hide Children + TOP_POP_DISCLOSE_CHILDREN + Disclose child items + + + TOP_POP_CONCEAL_CHILDREN + Conceal child items TOP_POP_ISOS @@ -5037,6 +5117,45 @@ Number of sketch points too small Please, select a group to edit + + GroupGUI_BooleanDlg + + GEOM_UNION + Union + + + GEOM_UNION_TITLE + Union Groups + + + GEOM_INTERSECT + Intersect + + + GEOM_INTERSECT_TITLE + Intersect Groups + + + GEOM_CUT + Cut + + + GEOM_CUT_TITLE + Cut Groups + + + GEOM_GROUPS + Groups + + + GEOM_MAIN_GROUPS + Main Groups + + + GEOM_TOOL_GROUPS + Tool Groups + + GroupGUI_GroupDlg diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index 23694246d..cfb646deb 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -376,8 +376,9 @@ void GeometryGUI::OnGUIEvent( int id ) NotViewerDependentCommands << GEOMOp::OpDelete << GEOMOp::OpShow << GEOMOp::OpShowOnly - << GEOMOp::OpShowChildren - << GEOMOp::OpHideChildren + << GEOMOp::OpShowOnlyChildren + << GEOMOp::OpDiscloseChildren + << GEOMOp::OpConcealChildren << GEOMOp::OpUnpublishObject << GEOMOp::OpPublishObject << GEOMOp::OpPointMarker; @@ -419,8 +420,8 @@ void GeometryGUI::OnGUIEvent( int id ) case GEOMOp::OpDecrNbIsos: // SHORTCUT - DECREASE NB ISOS case GEOMOp::OpAutoColor: // POPUP MENU - AUTO COLOR case GEOMOp::OpNoAutoColor: // POPUP MENU - DISABLE AUTO COLOR - case GEOMOp::OpShowChildren: // POPUP MENU - SHOW CHILDREN - case GEOMOp::OpHideChildren: // POPUP MENU - HIDE CHILDREN + case GEOMOp::OpDiscloseChildren: // POPUP MENU - DISCLOSE CHILD ITEMS + case GEOMOp::OpConcealChildren: // POPUP MENU - CONCEAL CHILD ITEMS case GEOMOp::OpUnpublishObject: // POPUP MENU - UNPUBLISH case GEOMOp::OpPublishObject: // ROOT GEOM OBJECT - POPUP MENU - PUBLISH case GEOMOp::OpPointMarker: // POPUP MENU - POINT MARKER @@ -436,6 +437,7 @@ void GeometryGUI::OnGUIEvent( int id ) case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL case GEOMOp::OpShowOnly: // MENU VIEW - DISPLAY ONLY + case GEOMOp::OpShowOnlyChildren: // MENU VIEW - SHOW ONLY CHILDREN case GEOMOp::OpHideAll: // MENU VIEW - ERASE ALL case GEOMOp::OpHide: // MENU VIEW - ERASE case GEOMOp::OpShow: // MENU VIEW - DISPLAY @@ -549,6 +551,7 @@ void GeometryGUI::OnGUIEvent( int id ) case GEOMOp::OpWhatIs: // MENU MEASURE - WHATIS case GEOMOp::OpCheckShape: // MENU MEASURE - CHECK case GEOMOp::OpCheckCompound: // MENU MEASURE - CHECK COMPOUND OF BLOCKS + case GEOMOp::OpGetNonBlocks: // MENU MEASURE - Get NON BLOCKS case GEOMOp::OpPointCoordinates: // MENU MEASURE - POINT COORDINATES case GEOMOp::OpCheckSelfInters: // MENU MEASURE - CHECK SELF INTERSECTIONS libName = "MeasureGUI"; @@ -556,6 +559,9 @@ void GeometryGUI::OnGUIEvent( int id ) case GEOMOp::OpGroupCreate: // MENU GROUP - CREATE case GEOMOp::OpGroupCreatePopup: // POPUP MENU - CREATE GROUP case GEOMOp::OpGroupEdit: // MENU GROUP - EDIT + case GEOMOp::OpGroupUnion: // MENU GROUP - UNION + case GEOMOp::OpGroupIntersect: // MENU GROUP - INTERSECT + case GEOMOp::OpGroupCut: // MENU GROUP - CUT libName = "GroupGUI"; break; case GEOMOp::OpHexaSolid: // MENU BLOCKS - HEXAHEDRAL SOLID @@ -748,6 +754,9 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" ); createGeomAction( GEOMOp::OpGroupEdit, "GROUP_EDIT" ); + createGeomAction( GEOMOp::OpGroupUnion, "GROUP_UNION" ); + createGeomAction( GEOMOp::OpGroupIntersect, "GROUP_INTERSECT" ); + createGeomAction( GEOMOp::OpGroupCut, "GROUP_CUT" ); createGeomAction( GEOMOp::OpReimport, "RELOAD_IMPORTED" ); @@ -829,6 +838,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpWhatIs, "WHAT_IS" ); createGeomAction( GEOMOp::OpCheckShape, "CHECK" ); createGeomAction( GEOMOp::OpCheckCompound, "CHECK_COMPOUND" ); + createGeomAction( GEOMOp::OpGetNonBlocks, "GET_NON_BLOCKS" ); createGeomAction( GEOMOp::OpCheckSelfInters, "CHECK_SELF_INTERSECTIONS" ); #ifdef _DEBUG_ // PAL16821 @@ -851,6 +861,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpSelectCompound, "COMPOUND_SEL_ONLY", "", 0, true ); createGeomAction( GEOMOp::OpSelectAll, "ALL_SEL_ONLY", "", 0, true ); createGeomAction( GEOMOp::OpShowOnly, "DISPLAY_ONLY" ); + createGeomAction( GEOMOp::OpShowOnlyChildren, "SHOW_ONLY_CHILDREN" ); createGeomAction( GEOMOp::OpBringToFront, "BRING_TO_FRONT", "", 0, true ); createGeomAction( GEOMOp::OpClsBringToFront, "CLS_BRING_TO_FRONT" ); createGeomAction( GEOMOp::OpHide, "ERASE" ); @@ -870,8 +881,8 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpAutoColor, "POP_AUTO_COLOR" ); createGeomAction( GEOMOp::OpNoAutoColor, "POP_DISABLE_AUTO_COLOR" ); createGeomAction( GEOMOp::OpGroupCreatePopup, "POP_CREATE_GROUP" ); - createGeomAction( GEOMOp::OpShowChildren, "POP_SHOW_CHILDREN" ); - createGeomAction( GEOMOp::OpHideChildren, "POP_HIDE_CHILDREN" ); + createGeomAction( GEOMOp::OpDiscloseChildren, "POP_DISCLOSE_CHILDREN" ); + createGeomAction( GEOMOp::OpConcealChildren, "POP_CONCEAL_CHILDREN" ); createGeomAction( GEOMOp::OpUnpublishObject, "POP_UNPUBLISH_OBJ" ); createGeomAction( GEOMOp::OpPublishObject, "POP_PUBLISH_OBJ" ); createGeomAction( GEOMOp::OpPointMarker, "POP_POINT_MARKER" ); @@ -947,8 +958,11 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( separator(), newEntId, -1 ); int groupId = createMenu( tr( "MEN_GROUP" ), newEntId, -1 ); - createMenu( GEOMOp::OpGroupCreate, groupId, -1 ); - createMenu( GEOMOp::OpGroupEdit, groupId, -1 ); + createMenu( GEOMOp::OpGroupCreate, groupId, -1 ); + createMenu( GEOMOp::OpGroupEdit, groupId, -1 ); + createMenu( GEOMOp::OpGroupUnion, groupId, -1 ); + createMenu( GEOMOp::OpGroupIntersect, groupId, -1 ); + createMenu( GEOMOp::OpGroupCut, groupId, -1 ); createMenu( separator(), newEntId, -1 ); @@ -1059,6 +1073,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpWhatIs, measurId, -1 ); createMenu( GEOMOp::OpCheckShape, measurId, -1 ); createMenu( GEOMOp::OpCheckCompound, measurId, -1 ); + createMenu( GEOMOp::OpGetNonBlocks, measurId, -1 ); createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 ); #ifdef _DEBUG_ // PAL16821 @@ -1196,8 +1211,9 @@ void GeometryGUI::initialize( CAM_Application* app ) createTool( GEOMOp::OpWhatIs, measureTbId ); createTool( GEOMOp::OpCheckShape, measureTbId ); createTool( GEOMOp::OpCheckCompound, measureTbId ); + createTool( GEOMOp::OpGetNonBlocks, measureTbId ); createTool( GEOMOp::OpCheckSelfInters, measureTbId ); - + int picturesTbId = createTool( tr( "TOOL_PICTURES" ) ); createTool( GEOMOp::OpPictureImport, picturesTbId ); #ifdef WITH_OPENCV @@ -1229,11 +1245,11 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group'} and selcount>0"), QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule ); - mgr->insert( action( GEOMOp::OpShowChildren ), -1, -1 ); // show children - mgr->setRule( action( GEOMOp::OpShowChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasHiddenChildren=true"), QtxPopupMgr::VisibleRule ); + mgr->insert( action( GEOMOp::OpDiscloseChildren ), -1, -1 ); // disclose child items + mgr->setRule( action( GEOMOp::OpDiscloseChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasConcealedChildren=true"), QtxPopupMgr::VisibleRule ); - mgr->insert( action( GEOMOp::OpHideChildren ), -1, -1 ); // hide children - mgr->setRule( action( GEOMOp::OpHideChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasShownChildren=true"), QtxPopupMgr::VisibleRule ); + mgr->insert( action( GEOMOp::OpConcealChildren ), -1, -1 ); // conceal shild items + mgr->setRule( action( GEOMOp::OpConcealChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasDisclosedChildren=true"), QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpGroupEdit ), -1, -1 ); // edit group mgr->setRule( action( GEOMOp::OpGroupEdit ), QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule ); mgr->insert( separator(), -1, -1 ); // ----------- @@ -1340,6 +1356,8 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->setRule(action(GEOMOp::OpSelectAll), selectOnly + " and selectionmode='ALL'", QtxPopupMgr::ToggleRule); mgr->insert( action(GEOMOp::OpShowOnly ), -1, -1 ); // display only mgr->setRule(action(GEOMOp::OpShowOnly ), rule.arg( types ).arg( "true" ), QtxPopupMgr::VisibleRule ); + mgr->insert( action(GEOMOp::OpShowOnlyChildren ), -1, -1 ); // display only children + mgr->setRule(action(GEOMOp::OpShowOnlyChildren ), (canDisplay + "and ($type in {%1}) and client='ObjectBrowser' and hasChildren=true").arg( types ), QtxPopupMgr::VisibleRule ); mgr->insert( separator(), -1, -1 ); // ----------- mgr->insert( action( GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object @@ -1663,41 +1681,19 @@ LightApp_Selection* GeometryGUI::createSelection() const void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title ) { SalomeApp_Module::contextMenuPopup( client, menu, title ); - - /* SALOME_ListIO lst; - getApp()->selectionMgr()->selectedObjects(lst); - if (lst.Extent() < 1) - return; - - SalomeApp_Study* appStudy = dynamic_cast(application()->activeStudy()); - _PTR(Study) study = appStudy->studyDS(); - - bool isImported = true; - SALOME_ListIteratorOfListIO anIt (lst); - for (; anIt.More() && isImported; anIt.Next()) { - Handle(SALOME_InteractiveObject) io = anIt.Value(); - _PTR(SObject) aSObj = study->FindObjectID(io->getEntry()); - if (aSObj) { - if (lst.Extent() == 1) { - // Set context menu title - if (client == "OCCViewer" || client == "VTKViewer") - title = QString(aSObj->GetName().c_str()); - } - - CORBA::Object_var anObj = GeometryGUI::ClientSObjectToObject(aSObj); - GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow(anObj); - if (CORBA::is_nil(aGeomObj) || aGeomObj->GetType() != GEOM_IMPORT) - isImported = false; - } else { - isImported = false; + getApp()->selectionMgr()->selectedObjects( lst ); + if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) { + Handle(SALOME_InteractiveObject) io = lst.First(); + SalomeApp_Study* appStudy = dynamic_cast( application()->activeStudy() ); + _PTR(Study) study = appStudy->studyDS(); + _PTR(SObject) obj = study->FindObjectID( io->getEntry() ); + if ( obj ) { + QString aName = QString( obj->GetName().c_str() ); + aName.remove( QRegExp("\\s+$") ); + title = aName; } } - - if (isImported) { - menu->addAction(action(GEOMOp::OpReimport)); // Reload imported shape - } - */ } void GeometryGUI::createPreferences() diff --git a/src/GEOMGUI/GeometryGUI_Operations.h b/src/GEOMGUI/GeometryGUI_Operations.h index 3d8a41d4e..75e45e43f 100644 --- a/src/GEOMGUI/GeometryGUI_Operations.h +++ b/src/GEOMGUI/GeometryGUI_Operations.h @@ -24,7 +24,7 @@ namespace GEOMOp { enum { - // ToolsGUI ------------------//-------------------------------- + // ToolsGUI --------------------//-------------------------------- OpImport = 1000, // MENU FILE - IMPORT OpExport = 1001, // MENU FILE - EXPORT OpDelete = 1020, // MENU EDIT - DELETE @@ -50,14 +50,13 @@ namespace GEOMOp { OpPointMarker = 1210, // POPUP MENU - POINT MARKER OpSetTexture = 1211, // POPUP MENU - SETTEXTURE OpMaterialProperties = 1212, // POPUP MENU - MATERIAL PROPERTIES - OpShowChildren = 1250, // POPUP MENU - SHOW CHILDREN - OpHideChildren = 1251, // POPUP MENU - HIDE CHILDREN + OpDiscloseChildren = 1250, // POPUP MENU - DISCLOSE CHILD ITEMS + OpConcealChildren = 1251, // POPUP MENU - CONCEAL CHILD ITEMS OpUnpublishObject = 1253, // POPUP MENU - UNPUBLISH OpPublishObject = 1254, // GEOM ROOT OBJECT - POPUP MENU - PUBLISH OpEdgeWidth = 1260, // POPUP MENU - LINE WIDTH - EDGE WIDTH OpIsosWidth = 1261, // POPUP MENU - LINE WIDTH - ISOS WIDTH - - // DisplayGUI ----------------//-------------------------------- + // DisplayGUI ------------------//-------------------------------- OpSwitchVectors = 2001, // MENU VIEW - DISPLAY MODE - SHOW/HIDE EDGE DIRECTION OpShowAll = 2002, // MENU VIEW - SHOW ALL OpHideAll = 2003, // MENU VIEW - HIDE ALL @@ -67,6 +66,7 @@ namespace GEOMOp { OpShow = 2100, // POPUP MENU - SHOW OpShowOnly = 2101, // POPUP MENU - SHOW ONLY OpHide = 2102, // POPUP MENU - HIDE + OpShowOnlyChildren = 2103, // POPUP MENU - SHOW ONLY CHILDREN OpWireframe = 2200, // POPUP MENU - DISPLAY MODE - WIREFRAME OpShading = 2201, // POPUP MENU - DISPLAY MODE - SHADING OpShadingWithEdges = 2202, // POPUP MENU - DISPLAY MODE - SHADING WITH EDGES @@ -74,7 +74,7 @@ namespace GEOMOp { OpTexture = 2204, // POPUP MENU - DISPLAY MODE - TEXTURE OpBringToFront = 2205, // POPUP MENU - BRING TO FRONT OpClsBringToFront = 2206, - // BasicGUI ------------------//-------------------------------- + // BasicGUI --------------------//-------------------------------- OpPoint = 3000, // MENU NEW ENTITY - BASIC - POINT OpLine = 3001, // MENU NEW ENTITY - BASIC - LINE OpCircle = 3002, // MENU NEW ENTITY - BASIC - CIRCLE @@ -85,7 +85,7 @@ namespace GEOMOp { OpCurve = 3007, // MENU NEW ENTITY - BASIC - CURVE OpLCS = 3008, // MENU NEW ENTITY - BASIC - LOCAL COORDINATE SYSTEM OpOriginAndVectors = 3009, // MENU NEW ENTITY - BASIC - ORIGIN AND BASE VECTORS - // PrimitiveGUI --------------//-------------------------------- + // PrimitiveGUI ----------------//-------------------------------- OpBox = 3100, // MENU NEW ENTITY - PRIMITIVES - BOX OpCylinder = 3101, // MENU NEW ENTITY - PRIMITIVES - CYLINDER OpSphere = 3102, // MENU NEW ENTITY - PRIMITIVES - SPHERE @@ -93,12 +93,12 @@ namespace GEOMOp { OpCone = 3104, // MENU NEW ENTITY - PRIMITIVES - CONE OpRectangle = 3105, // MENU NEW ENTITY - PRIMITIVES - FACE OpDisk = 3106, // MENU NEW ENTITY - PRIMITIVES - DISK - // GenerationGUI -------------//-------------------------------- + // GenerationGUI ---------------//-------------------------------- OpPrism = 3200, // MENU NEW ENTITY - GENERATION - EXTRUSION OpRevolution = 3201, // MENU NEW ENTITY - GENERATION - REVOLUTION OpFilling = 3202, // MENU NEW ENTITY - GENERATION - FILLING OpPipe = 3203, // MENU NEW ENTITY - GENERATION - EXTRUSION ALONG PATH - // EntityGUI -----------------//-------------------------------- + // EntityGUI -------------------//-------------------------------- Op2dSketcher = 3300, // MENU NEW ENTITY - SKETCHER Op3dSketcher = 3301, // MENU NEW ENTITY - 3D SKETCHER OpExplode = 3302, // MENU NEW ENTITY - EXPLODE @@ -106,20 +106,19 @@ namespace GEOMOp { OpFeatureDetect = 3303, // MENU NEW ENTITY - FEATURE DETECTION #endif OpPictureImport = 3304, // MENU NEW ENTITY - IMPORT PICTURE IN VIEWER - - // BuildGUI ------------------//-------------------------------- + // BuildGUI --------------------//-------------------------------- OpEdge = 3400, // MENU NEW ENTITY - BUILD - EDGE OpWire = 3401, // MENU NEW ENTITY - BUILD - WIRE OpFace = 3402, // MENU NEW ENTITY - BUILD - FACE OpShell = 3403, // MENU NEW ENTITY - BUILD - SHELL OpSolid = 3404, // MENU NEW ENTITY - BUILD - SOLID OpCompound = 3405, // MENU NEW ENTITY - BUILD - COMPOUND - // BooleanGUI ----------------//-------------------------------- + // BooleanGUI ------------------//-------------------------------- OpFuse = 3500, // MENU OPERATIONS - BOOLEAN - FUSE OpCommon = 3501, // MENU OPERATIONS - BOOLEAN - COMMON OpCut = 3502, // MENU OPERATIONS - BOOLEAN - CUT OpSection = 3503, // MENU OPERATIONS - BOOLEAN - SECTION - // TransformationGUI ---------//-------------------------------- + // TransformationGUI -----------//-------------------------------- OpTranslate = 3600, // MENU OPERATIONS - TRANSFORMATION - TRANSLATION OpRotate = 3601, // MENU OPERATIONS - TRANSFORMATION - ROTATION OpChangeLoc = 3602, // MENU OPERATIONS - TRANSFORMATION - LOCATION @@ -130,7 +129,7 @@ namespace GEOMOp { OpMultiRotate = 3607, // MENU OPERATIONS - TRANSFORMATION - MULTI-ROTATION OpReimport = 3608, // POPUP MENU - RELOAD IMPORTED OpProjection = 3609, // MENU OPERATIONS - TRANSFORMATION - PROJECTION - // OperationGUI + // OperationGUI ----------------//-------------------------------- OpPartition = 3700, // MENU OPERATION - PARTITION OpArchimede = 3701, // MENU OPERATION - ARCHIMEDE OpFillet3d = 3702, // MENU OPERATION - FILLET @@ -142,7 +141,7 @@ namespace GEOMOp { OpSharedShapes = 3708, // MENU OPERATION - GET SHARED SHAPES OpExtrudedBoss = 3709, // MENU OPERATION - ETRUDED BOSS OpExtrudedCut = 3710, // MENU OPERATION - ETRUDED CUT - // RepairGUI -----------------//-------------------------------- + // RepairGUI -------------------//-------------------------------- OpSewing = 4000, // MENU REPAIR - SEWING OpSuppressFaces = 4001, // MENU REPAIR - SUPPRESS FACES OpSuppressHoles = 4002, // MENU REPAIR - SUPPRESS HOLES @@ -158,7 +157,7 @@ namespace GEOMOp { OpLimitTolerance = 4012, // MENU REPAIR - LIMIT TOLERANCE OpGlueEdges = 4013, // MENU REPAIR - GLUE EDGES OpFuseEdges = 4014, // MENU REPAIR - FUSE COLLINEAR EDGES - // MeasureGUI ----------------//-------------------------------- + // MeasureGUI ------------------//-------------------------------- OpProperties = 5000, // MENU MEASURES - PROPERTIES OpCenterMass = 5001, // MENU MEASURES - CENTRE OF MASS OpInertia = 5002, // MENU MEASURES - INERTIA @@ -172,22 +171,26 @@ namespace GEOMOp { OpCheckCompound = 5010, // MENU MEASURES - CHECK COMPOUND OF BLOCKS OpPointCoordinates = 5011, // MENU MEASURES - POINT COORDINATES OpCheckSelfInters = 5012, // MENU MEASURES - CHECK SELF INTERSECTIONS - // GroupGUI ------------------//-------------------------------- + OpGetNonBlocks = 5013, // MENU MEASURES - GET NON BLOCKS + // GroupGUI --------------------//-------------------------------- OpGroupCreate = 6000, // MENU GROUP - CREATE OpGroupEdit = 6001, // MENU GROUP - EDIT OpGroupCreatePopup = 6002, // POPUP MENU - CREATE GROUP - // BlocksGUI -----------------//-------------------------------- + OpGroupUnion = 6003, // POPUP MENU - UNION GROUPS + OpGroupIntersect = 6004, // POPUP MENU - INTERSECT GROUPS + OpGroupCut = 6005, // POPUP MENU - CUT GROUPS + // BlocksGUI -------------------//-------------------------------- OpHexaSolid = 6100, // MENU BLOCKS - HEXAHEDRAL SOLID OpMultiTransform = 6101, // MENU BLOCKS - MULTI-TRANSFORMATION OpQuadFace = 6102, // MENU BLOCKS - QUADRANGLE FACE OpPropagate = 6103, // MENU BLOCKS - PROPAGATE OpExplodeBlock = 6104, // MENU BLOCKS - EXPLODE ON BLOCKS - // AdvancedGUI ---------------//-------------------------------- + // AdvancedGUI -----------------//-------------------------------- OpAdvancedNoOp = 10000, // NO OPERATION (advanced operations base) OpPipeTShape = 10001, // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE -// OpPipeTShapeGroups = 10002, // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS - OpDividedDisk = 10003, // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK - OpDividedCylinder = 10004, // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER + //OpPipeTShapeGroups = 10002, // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS + OpDividedDisk = 10003, // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK + OpDividedCylinder = 10004, // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER //@@ insert new functions before this line @@ do not remove this line @@// }; } diff --git a/src/GEOMGUI/GeometryGUI_Swig.i b/src/GEOMGUI/GeometryGUI_Swig.i deleted file mode 100644 index d5bdfdf1a..000000000 --- a/src/GEOMGUI/GeometryGUI_Swig.i +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 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 -// - -// GEOM GEOMGUI : GUI for Geometry component -// File : GeometryGUI_Swig.i -// Author : Nicolas REJNERI, Paul RASCLE -// -%{ -#include "GeometryGUI_Swig.hxx" -%} - -/* - managing C++ exception in the Python API -*/ -%exception -{ - class PyAllowThreadsGuard { - public: - // Py_BEGIN_ALLOW_THREADS - PyAllowThreadsGuard() { _save = PyEval_SaveThread(); } - // Py_END_ALLOW_THREADS - ~PyAllowThreadsGuard() { PyEval_RestoreThread(_save); } - private: - PyThreadState *_save; - }; - - PyAllowThreadsGuard guard; - - $action -} - -class GEOM_Swig -{ - public: - GEOM_Swig(); - ~GEOM_Swig(); - - void createAndDisplayGO(const char* Entry, bool isUpdated =true); - void eraseGO(const char* Entry, bool allWindows); - void createAndDisplayFitAllGO(const char* Entry); - void UpdateViewer(); - int getIndexTopology(const char *SubEntry, const char *Entry); - const char* getShapeTypeString(const char *Entry); - - void setDisplayMode(const char* Entry, int mode, bool isUpdated =true); - void setVectorsMode(const char* Entry, bool isSet, bool isUpdated =true); - void setColor(const char* Entry, int red, int green, int blue, bool isUpdated =true); - void setTransparency(const char* Entry, float transp, bool isUpdated =true); - void setDeflection(const char* Entry, float deflect); - const char* getShapeTypeIcon(const char *Ior); - - bool initGeomGen(); -}; diff --git a/src/GEOMGUI/Makefile.am b/src/GEOMGUI/Makefile.am index 2ac3a347b..71f187ae0 100644 --- a/src/GEOMGUI/Makefile.am +++ b/src/GEOMGUI/Makefile.am @@ -35,8 +35,6 @@ salomeinclude_HEADERS = \ GEOM_Displayer.h \ GEOMGUI_OCCSelector.h \ GEOMGUI_Selection.h \ - GeometryGUI_Swig.hxx \ - GeometryGUI_Swig.i \ GEOM_GEOMGUI.hxx dist_libGEOM_la_SOURCES = \ @@ -44,8 +42,7 @@ dist_libGEOM_la_SOURCES = \ GEOMGUI.cxx \ GEOM_Displayer.cxx \ GEOMGUI_OCCSelector.cxx \ - GEOMGUI_Selection.cxx \ - GeometryGUI_Swig.cxx + GEOMGUI_Selection.cxx MOC_FILES = \ GeometryGUI_moc.cxx diff --git a/src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx b/src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx index 5c00c4655..d50aec791 100755 --- a/src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_3DSketcherDriver.cxx @@ -15,7 +15,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -26,9 +25,13 @@ #include +#include + // OCCT Includes #include #include +#include +#include #include #include #include @@ -63,41 +66,234 @@ Standard_Integer GEOMImpl_3DSketcherDriver::Execute(TFunction_Logbook& log) cons { 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(); - int anArrayLength = aCoordsArray->Length(); + if (aFunction->GetType() == SKETCHER3D_COORDS) { + Handle(TColStd_HArray1OfReal) aCoordsArray = aCI.GetCoordinates(); + int anArrayLength = aCoordsArray->Length(); - std::list points; - - for (int i = 0; i <= (anArrayLength-3); i += 3) { - gp_Pnt aPnt = gp_Pnt(aCoordsArray->Value(i+1), aCoordsArray->Value(i+2), aCoordsArray->Value(i+3)); - if (points.empty() || aPnt.Distance(points.back()) > gp::Resolution()) - points.push_back(aPnt); - } + std::list points; + + for (int i = 0; i <= (anArrayLength-3); i += 3) { + gp_Pnt aPnt = gp_Pnt(aCoordsArray->Value(i+1), aCoordsArray->Value(i+2), aCoordsArray->Value(i+3)); + if (points.empty() || aPnt.Distance(points.back()) > gp::Resolution()) + points.push_back(aPnt); + } + + if ( points.size() == 1) { // Only Start Point + BRepBuilderAPI_MakeVertex mkVertex (points.back()); + aShape = mkVertex.Shape(); + } + else if ( points.size() > 1) { // Make Wire + BRepBuilderAPI_MakePolygon aMakePoly; + std::list::iterator it; + for (it = points.begin(); it != points.end(); ++it) { + aMakePoly.Add(*it); + } - if ( points.size() == 1) { // Only Start Point - BRepBuilderAPI_MakeVertex mkVertex (points.back()); - aShape = mkVertex.Shape(); + if (points.size() > 2 && + points.back().X() == points.front().X() && + points.back().Y() == points.front().Y() && + points.back().Z() == points.front().Z()) + aMakePoly.Close(); + + if (aMakePoly.IsDone()) + aShape = aMakePoly.Wire(); + } } - else if ( points.size() > 1) { // Make Wire - BRepBuilderAPI_MakePolygon aMakePoly; - std::list::iterator it; - for (it = points.begin(); it != points.end(); ++it) { - aMakePoly.Add(*it); + else if (aFunction->GetType() == SKETCHER3D_COMMAND) { + Kernel_Utils::Localizer loc; + + TCollection_AsciiString aCommand = aCI.GetCommand(); + // "3DSketcher:CMD[:CMD[:CMD...]]" + + // Split the command string to separate CMDs + int icmd = 2; + TColStd_SequenceOfAsciiString aSequence; + if (aCommand.Length()) { + TCollection_AsciiString aToken = aCommand.Token(":", icmd); + while (aToken.Length() > 0) { + aSequence.Append(aToken); + aToken = aCommand.Token(":", ++icmd); + } } - if (points.size() > 2 && - points.back().X() == points.front().X() && - points.back().Y() == points.front().Y() && - points.back().Z() == points.front().Z()) - aMakePoly.Close(); - - if (aMakePoly.IsDone()) - aShape = aMakePoly.Wire(); + int nbEdges = 0; + bool isFirstPointSet = false; + gp_XYZ p = gp::Origin().XYZ(); + BRepBuilderAPI_MakeVertex MV0 (p); + TopoDS_Vertex V = TopoDS::Vertex(MV0.Shape()); + + gp_XYZ p0 = p; + TopoDS_Vertex V0 = V; + + bool doClose = false; + BRepBuilderAPI_MakeWire MW; + + int nbCMDs = aSequence.Length(); + for (icmd = 1; icmd <= nbCMDs; icmd++) { + TCollection_AsciiString aCMD = aSequence.Value(icmd); + + // Split the CMD into string values + TColStd_SequenceOfAsciiString aStrVals; + int ival = 1; + TCollection_AsciiString aToken = aCMD.Token(" ", ival); + while (aToken.Length() > 0) { + aStrVals.Append(aToken); + aToken = aCMD.Token(" ", ++ival); + } + + // "TT x y z" : Create segment by point at X & Y or set the first point + // "T dx dy dz" : Create segment by point with DX & DY + // + // "OXY angleX angle2 length" : Create segment by two angles and length + // "OYZ angleY angle2 length" : Create segment by two angles and length + // "OXZ angleX angle2 length" : Create segment by two angles and length + // + // "WW" : Close Wire (to finish) + + switch (aStrVals.Value(1).Value(1)) + { + case 'T': + { + if (aStrVals.Length() != 4) + Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command."); + + gp_XYZ vp; + vp.SetX(aStrVals.Value(2).RealValue()); + vp.SetY(aStrVals.Value(3).RealValue()); + vp.SetZ(aStrVals.Value(4).RealValue()); + + if (aStrVals.Value(1) == "TT") { // absolute coordinates + if (!isFirstPointSet) { + p = vp; + BRepBuilderAPI_MakeVertex MV (p); + V = TopoDS::Vertex(MV.Shape()); + + p0 = p; + V0 = V; + + isFirstPointSet = true; + } + else { + if ((vp - p).SquareModulus() > Precision::Confusion()) { + BRepBuilderAPI_MakeVertex MV (vp); + TopoDS_Vertex VV = TopoDS::Vertex(MV.Shape()); + BRepBuilderAPI_MakeEdge ME (V, VV); + MW.Add(ME); + nbEdges++; + + p = vp; + V = VV; + } + } + } + else if (aStrVals.Value(1) == "T") { // relative coordinates + if (vp.SquareModulus() > Precision::Confusion()) { + vp = p + vp; + + BRepBuilderAPI_MakeVertex MV (vp); + TopoDS_Vertex VV = TopoDS::Vertex(MV.Shape()); + BRepBuilderAPI_MakeEdge ME (V, VV); + MW.Add(ME); + nbEdges++; + + p = vp; + V = VV; + } + } + else + Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command."); + } + break; + case 'O': + { + if (aStrVals.Length() != 4) + Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command."); + + double anAngle = aStrVals.Value(2).RealValue() * M_PI/180.0; + double anAngle2 = aStrVals.Value(3).RealValue() * M_PI/180.0; + double aLength = aStrVals.Value(4).RealValue(); + + double aProjectedLength = aLength * cos(anAngle2); + + gp_XYZ vp; + vp.SetX(aStrVals.Value(2).RealValue()); + vp.SetY(aStrVals.Value(3).RealValue()); + vp.SetZ(aStrVals.Value(4).RealValue()); + + if (aStrVals.Value(1) == "OXY") { + vp.SetX(p.X() + aProjectedLength * cos(anAngle)); + vp.SetY(p.Y() + aProjectedLength * sin(anAngle)); + vp.SetZ(p.Z() + aLength * sin(anAngle2)); + } + else if (aStrVals.Value(1) == "OYZ") { + vp.SetX(p.X() + aLength * sin(anAngle2)); + vp.SetY(p.Y() + aProjectedLength * cos(anAngle)); + vp.SetZ(p.Z() + aProjectedLength * sin(anAngle)); + } + else if (aStrVals.Value(1) == "OXZ") { + vp.SetX(p.X() + aProjectedLength * cos(anAngle)); + vp.SetY(p.Y() + aLength * sin(anAngle2)); + vp.SetZ(p.Z() + aProjectedLength * sin(anAngle)); + } + else + Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command."); + + if ((vp - p).SquareModulus() > Precision::Confusion()) { + BRepBuilderAPI_MakeVertex MV (vp); + TopoDS_Vertex VV = TopoDS::Vertex(MV.Shape()); + BRepBuilderAPI_MakeEdge ME (V, VV); + MW.Add(ME); + nbEdges++; + + p = vp; + V = VV; + } + } + break; + case 'W': + { + if (aStrVals.Length() != 1) + Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command."); + + if (aStrVals.Value(1) == "WW") + doClose = true; + else + Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command."); + } + break; + default: + { + Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command."); + } + } + } + + if (doClose && + nbEdges > 1 && // as 3D sketcher has only straight edges + (p - p0).SquareModulus() > Precision::Confusion()) { + BRepBuilderAPI_MakeEdge ME (V, V0); + MW.Add(ME); + nbEdges++; + } + + if (nbEdges > 0) { + if (!MW.IsDone()) + Standard_ConstructionError::Raise("3D Sketcher error: Wire construction failed."); + + aShape = MW; + } + else { + if (isFirstPointSet) { + aShape = V0; + } + } + } + else { } if (aShape.IsNull()) return 0; diff --git a/src/GEOMImpl/GEOMImpl_BlockDriver.cxx b/src/GEOMImpl/GEOMImpl_BlockDriver.cxx index 95c2dbf08..d50d24858 100644 --- a/src/GEOMImpl/GEOMImpl_BlockDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_BlockDriver.cxx @@ -600,7 +600,8 @@ Standard_Integer GEOMImpl_BlockDriver::Execute(TFunction_Logbook& log) const TopTools_ListOfShape BLO; // All blocks from the given compound TopTools_ListOfShape NOT; // Not blocks TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges - GEOMImpl_IBlocksOperations::AddBlocksFrom(aFixedExtra, BLO, NOT, EXT); + TopTools_ListOfShape NOQ; // All non-quadrangular faces + GEOMImpl_IBlocksOperations::AddBlocksFrom(aFixedExtra, BLO, NOT, EXT, NOQ); if (NOT.Extent() > 0) { MESSAGE("Some non-blocks have been removed"); diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index 12d2e4df2..dc2ab3599 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -1611,14 +1611,17 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling //Make a Python command GEOM::TPythonDump pd (aFunction); - pd << aFilling << " = geompy.MakeFilling(" - << theShape << ", " << theMinDeg << ", " << theMaxDeg << ", " - << theTol2D << ", " << theTol3D << ", " << theNbIter << ", "; - if( theMethod==1 ) pd << "GEOM.FOM_UseOri"; - else if( theMethod==2 ) pd << "GEOM.FOM_AutoCorrect"; - else pd << "GEOM.FOM_Default"; - if(isApprox) - pd << ", " << isApprox ; + pd << aFilling << " = geompy.MakeFilling(" << theShape ; + if ( theMinDeg != 2 ) pd << ", theMinDeg=" << theMinDeg ; + if ( theMaxDeg != 5 ) pd << ", theMaxDeg=" << theMaxDeg ; + if ( fabs(theTol2D-0.0001) > Precision::Confusion() ) + pd << ", theTol2D=" << theTol2D ; + if ( fabs(theTol3D-0.0001) > Precision::Confusion() ) + pd << ", theTol3D=" << theTol3D ; + if ( theNbIter != 0 ) pd << ", theNbIter=" << theNbIter ; + if ( theMethod==1 ) pd << ", theMethod=GEOM.FOM_UseOri"; + else if( theMethod==2 ) pd << ", theMethod=GEOM.FOM_AutoCorrect"; + if(isApprox) pd << ", isApprox=" << isApprox ; pd << ")"; SetErrorCode(OK); diff --git a/src/GEOMImpl/GEOMImpl_I3DSketcher.hxx b/src/GEOMImpl/GEOMImpl_I3DSketcher.hxx index fa6e04639..4f4c9664d 100755 --- a/src/GEOMImpl/GEOMImpl_I3DSketcher.hxx +++ b/src/GEOMImpl/GEOMImpl_I3DSketcher.hxx @@ -15,28 +15,35 @@ // 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: +public: - GEOMImpl_I3DSketcher(Handle(GEOM_Function) theFunction): _func(theFunction) {} + GEOMImpl_I3DSketcher (Handle(GEOM_Function) theFunction): _func(theFunction) {} - void SetCoordinates(const Handle(TColStd_HArray1OfReal)& theValue) - { _func->SetRealArray(SKETCH_ARG_COORDS, theValue); } + void SetCoordinates (const Handle(TColStd_HArray1OfReal)& theValue) + { _func->SetRealArray(SKETCH_ARG_COORDS, theValue); } Handle(TColStd_HArray1OfReal) GetCoordinates() { return _func->GetRealArray(SKETCH_ARG_COORDS); } - private: + void SetCommand (const TCollection_AsciiString& theCommand) + { _func->SetString(SKETCH_ARG_COMMAND, theCommand); } + + TCollection_AsciiString GetCommand() { return _func->GetString(SKETCH_ARG_COMMAND); } + +private: + + enum { + SKETCH_ARG_COORDS = 1, + SKETCH_ARG_COMMAND = 2 + }; Handle(GEOM_Function) _func; }; diff --git a/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx b/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx index e29905bd3..ae1d5959f 100644 --- a/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -212,6 +211,7 @@ Handle(GEOM_Object) GEOMImpl_IBasicOperations::makePointOnGeom case PointOn_CurveByCoord: fType = POINT_CURVE_COORD; break; case PointOn_SurfaceByParam: fType = POINT_SURFACE_PAR; break; case PointOn_SurfaceByCoord: fType = POINT_SURFACE_COORD; break; + case PointOn_Face: fType = POINT_FACE_ANY; break; default: break; } Handle(GEOM_Function) aFunction = aPoint->AddFunction(GEOMImpl_PointDriver::GetID(), fType); @@ -254,6 +254,10 @@ Handle(GEOM_Object) GEOMImpl_IBasicOperations::makePointOnGeom aPI.SetX(theParam1); aPI.SetY(theParam2); aPI.SetZ(theParam3); + break; + case PointOn_Face: + aPI.SetSurface(aRefFunction); + break; default: break; } @@ -285,19 +289,24 @@ Handle(GEOM_Object) GEOMImpl_IBasicOperations::makePointOnGeom << theGeomObj << ", " << theParam1 << ", " << theRefPoint << ")"; break; case PointOn_CurveByCoord: - GEOM::TPythonDump(aFunction) << aPoint << " = geompy.MakeVertexOnCurveByCoord(" - << theGeomObj << ", " << theParam1 - << ", " << theParam2 << ", " << theParam3 << ")"; + GEOM::TPythonDump(aFunction) << aPoint << " = geompy.MakeVertexOnCurveByCoord(" + << theGeomObj << ", " << theParam1 + << ", " << theParam2 << ", " << theParam3 << ")"; break; case PointOn_SurfaceByParam: - GEOM::TPythonDump(aFunction) << aPoint << " = geompy.MakeVertexOnSurface(" - << theGeomObj << ", " << theParam1 - << ", " << theParam2 << ")"; + GEOM::TPythonDump(aFunction) << aPoint << " = geompy.MakeVertexOnSurface(" + << theGeomObj << ", " << theParam1 + << ", " << theParam2 << ")"; break; case PointOn_SurfaceByCoord: - GEOM::TPythonDump(aFunction) << aPoint << " = geompy.MakeVertexOnSurfaceByCoord(" - << theGeomObj << ", " << theParam1 - << ", " << theParam2 << ", " << theParam3 << ")"; + GEOM::TPythonDump(aFunction) << aPoint << " = geompy.MakeVertexOnSurfaceByCoord(" + << theGeomObj << ", " << theParam1 + << ", " << theParam2 << ", " << theParam3 << ")"; + break; + case PointOn_Face: + GEOM::TPythonDump(aFunction) << aPoint << " = geompy.MakeVertexInsideFace(" + << theGeomObj << ")"; + break; default: break; } @@ -370,6 +379,15 @@ Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakePointOnSurfaceByCoord return makePointOnGeom(theSurface, theXParam, theYParam, theZParam, PointOn_SurfaceByCoord); } +//============================================================================= +/*! + * MakePointOnFace + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakePointOnFace (Handle(GEOM_Object) theFace) +{ + return makePointOnGeom(theFace, 0., 0., 0., PointOn_Face); +} //============================================================================= /*! diff --git a/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx b/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx index 1e743415f..736e8afc0 100644 --- a/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_IBasicOperations_HXX_ #define _GEOMImpl_IBasicOperations_HXX_ @@ -64,6 +63,8 @@ class GEOMImpl_IBasicOperations : public GEOM_IOperations { double theYParam, double theZParam); + Standard_EXPORT Handle(GEOM_Object) MakePointOnFace (Handle(GEOM_Object) theFace); + // Vector Standard_EXPORT Handle(GEOM_Object) MakeVectorDXDYDZ (double theDX, double theDY, double theDZ); @@ -128,7 +129,8 @@ class GEOMImpl_IBasicOperations : public GEOM_IOperations { PointOn_CurveByCoord, PointOn_CurveByLength, PointOn_SurfaceByParam, - PointOn_SurfaceByCoord + PointOn_SurfaceByCoord, + PointOn_Face }; Handle(GEOM_Object) makePointOnGeom (Handle(GEOM_Object) theGeomObj, diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx index 42aaa4260..efb69f42c 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifdef WNT #pragma warning( disable:4786 ) @@ -1735,7 +1734,8 @@ Standard_Boolean GEOMImpl_IBlocksOperations::IsCompoundOfBlocks void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, TopTools_ListOfShape& BLO, TopTools_ListOfShape& NOT, - TopTools_ListOfShape& EXT) + TopTools_ListOfShape& EXT, + TopTools_ListOfShape& NOQ) { TopAbs_ShapeEnum aType = theShape.ShapeType(); switch (aType) { @@ -1744,7 +1744,7 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, { TopoDS_Iterator It (theShape); for (; It.More(); It.Next()) { - AddBlocksFrom(It.Value(), BLO, NOT, EXT); + AddBlocksFrom(It.Value(), BLO, NOT, EXT, NOQ); } } break; @@ -1766,7 +1766,7 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, for (; expF.More(); expF.Next()) { if (mapFaces.Add(expF.Current())) { nbFaces++; - if (nbFaces > 6) break; + //0021483//if (nbFaces > 6) break; // get wire TopoDS_Shape aF = expF.Current(); @@ -1774,14 +1774,18 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, if (!wires.More()) { // no wire in the face hasNonQuadr = Standard_True; - break; + NOQ.Append(aF);//0021483 + //0021483//break; + continue; } TopoDS_Shape aWire = wires.Current(); wires.Next(); if (wires.More()) { // multiple wires in the face hasNonQuadr = Standard_True; - break; + NOQ.Append(aF);//0021483 + //0021483//break; + continue; } // Check number of edges in the face @@ -1796,6 +1800,7 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, } if (nbEdges != 4) { hasNonQuadr = Standard_True; + NOQ.Append(aF);//0021483 } } } @@ -1808,6 +1813,47 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, } } break; + case TopAbs_SHELL: //0021483 + case TopAbs_FACE: //0021483 + { + // Count edges in each face + TopTools_MapOfShape mapFaces; + TopExp_Explorer expF (theShape, TopAbs_FACE); + for (; expF.More(); expF.Next()) { + if (mapFaces.Add(expF.Current())) { + // get wire + TopoDS_Shape aF = expF.Current(); + TopExp_Explorer wires (aF, TopAbs_WIRE); + if (!wires.More()) { + // no wire in the face + NOQ.Append(aF);//0021483 + continue; + } + TopoDS_Shape aWire = wires.Current(); + wires.Next(); + if (wires.More()) { + // multiple wires in the face + NOQ.Append(aF);//0021483 + continue; + } + + // Check number of edges in the face + Standard_Integer nbEdges = 0; + TopTools_MapOfShape mapEdges; + TopExp_Explorer expW (aWire, TopAbs_EDGE); + for (; expW.More(); expW.Next()) { + if (mapEdges.Add(expW.Current())) { + nbEdges++; + if (nbEdges > 4) break; + } + } + if (nbEdges != 4) { + NOQ.Append(aF);//0021483 + } + } + } + } + break; default: NOT.Append(theShape); } @@ -2353,7 +2399,8 @@ Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks TopTools_ListOfShape NOT; // Not blocks TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges TopTools_ListOfShape BLO; // All blocks from the given compound - AddBlocksFrom(aBlockOrComp, BLO, NOT, EXT); + TopTools_ListOfShape NOQ; // All non-quadrangular faces + AddBlocksFrom(aBlockOrComp, BLO, NOT, EXT, NOQ); // Report non-blocks if (NOT.Extent() > 0) { @@ -2513,6 +2560,100 @@ Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks return isCompOfBlocks; } +//============================================================================= +/*! + * GetNonBlocks + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetNonBlocks + (Handle(GEOM_Object) theShape, + Handle(GEOM_Object)& theNonQuads) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + TopoDS_Shape aShape = theShape->GetValue(); + + // Separate blocks from non-blocks + TopTools_ListOfShape BLO; // All blocks from the given compound + TopTools_ListOfShape NOT; // Not blocks + TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges + TopTools_ListOfShape NOQ; // All non-quadrangular faces + AddBlocksFrom(aShape, BLO, NOT, EXT, NOQ); + + if (NOT.IsEmpty() && EXT.IsEmpty() && NOQ.IsEmpty()) { + SetErrorCode("NOT_FOUND_ANY"); + return NULL; + } + + // Map sub-shapes and their indices + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aShape, anIndices); + + // Non-blocks + Handle(GEOM_Object) aNonBlocks; + if (NOT.Extent() > 0 || EXT.Extent() > 0) { + Handle(TColStd_HArray1OfInteger) anArray = + new TColStd_HArray1OfInteger (1, NOT.Extent() + EXT.Extent()); + Standard_Integer ii = 1; + TopTools_ListIteratorOfListOfShape it1 (NOT); + for (; it1.More(); it1.Next(), ii++) { + anArray->SetValue(ii, anIndices.FindIndex(it1.Value())); + } + TopTools_ListIteratorOfListOfShape it2 (EXT); + for (; it2.More(); it2.Next(), ii++) { + anArray->SetValue(ii, anIndices.FindIndex(it2.Value())); + } + + aNonBlocks = GetEngine()->AddSubShape(theShape, anArray); + if (aNonBlocks.IsNull()) { + SetErrorCode("Error in algorithm: result found, but cannot be returned."); + return NULL; + } + aNonBlocks->SetType(GEOM_GROUP); + TDF_Label aFreeLabel = aNonBlocks->GetFreeLabel(); + TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)TopAbs_SOLID); + } + + // Non-quadrangles + if (NOQ.Extent() > 0) { + Handle(TColStd_HArray1OfInteger) anArray = + new TColStd_HArray1OfInteger (1, NOQ.Extent()); + Standard_Integer ii = 1; + TopTools_ListIteratorOfListOfShape it1 (NOQ); + for (; it1.More(); it1.Next(), ii++) { + anArray->SetValue(ii, anIndices.FindIndex(it1.Value())); + } + + theNonQuads = GetEngine()->AddSubShape(theShape, anArray); + if (theNonQuads.IsNull()) { + SetErrorCode("Error in algorithm: result found, but cannot be returned."); + return NULL; + } + theNonQuads->SetType(GEOM_GROUP); + TDF_Label aFreeLabel = theNonQuads->GetFreeLabel(); + TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)TopAbs_FACE); + } + + //Make a Python command + Handle(GEOM_Function) aMainShape = theShape->GetLastFunction(); + GEOM::TPythonDump pd (aMainShape, /*append=*/true); + pd << "("; + if (aNonBlocks.IsNull()) + pd << "no_bad_solids"; + else + pd << aNonBlocks; + pd << ", "; + if (theNonQuads.IsNull()) + pd << "no_bad_faces"; + else + pd << theNonQuads; + pd << ") = geompy.GetNonBlocks(" << theShape << ")"; + + SetErrorCode(OK); + return aNonBlocks; +} + //============================================================================= /*! * RemoveExtraEdges diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx index f702da402..8a34d5510 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_IBlocksOperations_HXX_ #define _GEOMImpl_IBlocksOperations_HXX_ @@ -126,14 +125,17 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { }; Standard_EXPORT Standard_Boolean CheckCompoundOfBlocksOld (Handle(GEOM_Object) theCompound, - std::list& theErrors); + std::list& theErrors); Standard_EXPORT Standard_Boolean CheckCompoundOfBlocks (Handle(GEOM_Object) theCompound, - std::list& theErrors); + std::list& theErrors); - Standard_EXPORT TCollection_AsciiString PrintBCErrors (Handle(GEOM_Object) theCompound, + Standard_EXPORT TCollection_AsciiString PrintBCErrors (Handle(GEOM_Object) theCompound, const std::list& theErrors); + Standard_EXPORT Handle(GEOM_Object) GetNonBlocks (Handle(GEOM_Object) theShape, + Handle(GEOM_Object)& theNonQuads); + Standard_EXPORT Handle(GEOM_Object) RemoveExtraEdges (Handle(GEOM_Object) theShape, const Standard_Integer theOptimumNbFaces = 6); @@ -142,7 +144,8 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { Standard_EXPORT static void AddBlocksFrom (const TopoDS_Shape& theShape, TopTools_ListOfShape& BLO, TopTools_ListOfShape& NOT, - TopTools_ListOfShape& EXT); + TopTools_ListOfShape& EXT, + TopTools_ListOfShape& NOQ); // Extract blocks from blocks compounds Standard_EXPORT Handle(TColStd_HSequenceOfTransient) ExplodeCompoundOfBlocks diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx index ca1ac5db0..f4508d35b 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifdef WNT // E.A. : On windows with python 2.6, there is a conflict @@ -1168,39 +1167,36 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcher (const char* theCom //============================================================================= /*! - * Make3DSketcher + * MakeSketcherOnPlane */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_ICurvesOperations::Make3DSketcher (std::list theCoordinates) +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcherOnPlane + (const char* theCommand, + Handle(GEOM_Object) theWorkingPlane) { SetErrorCode(KO); + if (!theCommand || strcmp(theCommand, "") == 0) return NULL; + //Add a new Sketcher object - Handle(GEOM_Object) a3DSketcher = GetEngine()->AddObject(GetDocID(), GEOM_3DSKETCHER); + Handle(GEOM_Object) aSketcher = GetEngine()->AddObject(GetDocID(), GEOM_SKETCHER); //Add a new Sketcher function Handle(GEOM_Function) aFunction = - a3DSketcher->AddFunction(GEOMImpl_3DSketcherDriver::GetID(), GEOM_3DSKETCHER); + aSketcher->AddFunction(GEOMImpl_SketcherDriver::GetID(), SKETCHER_PLANE); 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; - std::list::iterator it = theCoordinates.begin(); - for (; it != theCoordinates.end(); it++) - nbOfCoords++; + if (aFunction->GetDriverGUID() != GEOMImpl_SketcherDriver::GetID()) return NULL; - Handle(TColStd_HArray1OfReal) aCoordsArray = new TColStd_HArray1OfReal (1, nbOfCoords); + GEOMImpl_ISketcher aCI (aFunction); - it = theCoordinates.begin(); - int ind = 1; - for (; it != theCoordinates.end(); it++, ind++) - aCoordsArray->SetValue(ind, *it); + TCollection_AsciiString aCommand((char*) theCommand); + aCI.SetCommand(aCommand); - aCI.SetCoordinates(aCoordsArray); + Handle(GEOM_Function) aRefPlane = theWorkingPlane->GetLastFunction(); + if (aRefPlane.IsNull()) return NULL; + aCI.SetWorkingPlane( aRefPlane ); //Compute the Sketcher value try { @@ -1208,7 +1204,7 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::Make3DSketcher (std::listComputeFunction(aFunction)) { - SetErrorCode("3D Sketcher driver failed"); + SetErrorCode("Sketcher driver failed"); return NULL; } } @@ -1219,52 +1215,99 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::Make3DSketcher (std::listAddObject(GetDocID(), GEOM_SKETCHER); + Handle(GEOM_Object) aSketcher = GetEngine()->AddObject(GetDocID(), GEOM_3DSKETCHER); //Add a new Sketcher function Handle(GEOM_Function) aFunction = - aSketcher->AddFunction(GEOMImpl_SketcherDriver::GetID(), SKETCHER_PLANE); + aSketcher->AddFunction(GEOMImpl_3DSketcherDriver::GetID(), SKETCHER3D_COMMAND); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly - if (aFunction->GetDriverGUID() != GEOMImpl_SketcherDriver::GetID()) return NULL; + if (aFunction->GetDriverGUID() != GEOMImpl_3DSketcherDriver::GetID()) return NULL; - GEOMImpl_ISketcher aCI (aFunction); + GEOMImpl_I3DSketcher aCI (aFunction); - TCollection_AsciiString aCommand((char*) theCommand); + TCollection_AsciiString aCommand ((char*) theCommand); aCI.SetCommand(aCommand); - Handle(GEOM_Function) aRefPlane = theWorkingPlane->GetLastFunction(); - if (aRefPlane.IsNull()) return NULL; - aCI.SetWorkingPlane( aRefPlane ); + //Compute the 3D Sketcher value + try { +#if OCC_VERSION_LARGE > 0x06010000 + 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 << aSketcher << " = geompy.Make3DSketcherCommand(\"" << aCommand.ToCString() << "\")"; + + SetErrorCode(OK); + return aSketcher; +} + +//============================================================================= +/*! + * Make3DSketcher + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::Make3DSketcher (std::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(), SKETCHER3D_COORDS); + 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; + std::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 { @@ -1272,7 +1315,7 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcherOnPlane OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { - SetErrorCode("Sketcher driver failed"); + SetErrorCode("3D Sketcher driver failed"); return NULL; } } @@ -1283,9 +1326,16 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcherOnPlane } //Make a Python command - GEOM::TPythonDump (aFunction) << aSketcher << " = geompy.MakeSketcherOnPlane(\"" - << aCommand.ToCString() << "\", " << theWorkingPlane << " )"; + GEOM::TPythonDump pd (aFunction); + pd << a3DSketcher << " = geompy.Make3DSketcher(["; + + it = theCoordinates.begin(); + pd << (*it++); + while (it != theCoordinates.end()) { + pd << ", " << (*it++); + } + pd << "])"; SetErrorCode(OK); - return aSketcher; + return a3DSketcher; } diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx index 2e71bbd38..829f9cc5d 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_ICurvesOperations_HXX_ #define _GEOMImpl_ICurvesOperations_HXX_ @@ -78,16 +77,17 @@ class GEOMImpl_ICurvesOperations : public GEOM_IOperations { bool theIsClosed = false, bool theDoReordering = false); - Standard_EXPORT Handle(GEOM_Object) MakeCurveParametric(const char* thexExpr, const char* theyExpr, const char* thezExpr, - double theParamMin, double theParamMax, double theParamStep, - CurveType theCurveType, - int theParamNbStep=0, bool theNewMethod=false); + Standard_EXPORT Handle(GEOM_Object) MakeCurveParametric + (const char* thexExpr, const char* theyExpr, const char* thezExpr, + double theParamMin, double theParamMax, double theParamStep, + CurveType theCurveType, int theParamNbStep=0, bool theNewMethod=false); Standard_EXPORT Handle(GEOM_Object) MakeSketcher (const char* theCommand, std::list theWorkingPlane); - Standard_EXPORT Handle(GEOM_Object) Make3DSketcher (std::list theCoordinates); Standard_EXPORT Handle(GEOM_Object) MakeSketcherOnPlane (const char* theCommand, Handle(GEOM_Object) theWorkingPlane); + Standard_EXPORT Handle(GEOM_Object) Make3DSketcherCommand (const char* theCommand); + Standard_EXPORT Handle(GEOM_Object) Make3DSketcher (std::list theCoordinates); }; #endif diff --git a/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx b/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx index db55c72b6..dc47e1f0e 100644 --- a/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -511,10 +510,10 @@ void GEOMImpl_IGroupOperations::DifferenceList (Handle(GEOM_Object) theGroup, if ( aLength - aRemLength > 0 ) { aNewSeq = new TColStd_HArray1OfInteger(1, aLength - aRemLength); for (j = 1; j <= aLength; j++) { - if (!mapIDsToRemove.Contains(aSeq->Value(j))) { - aNewSeq->SetValue(k, aSeq->Value(j)); - k++; - } + if (!mapIDsToRemove.Contains(aSeq->Value(j))) { + aNewSeq->SetValue(k, aSeq->Value(j)); + k++; + } } } else { @@ -716,10 +715,10 @@ void GEOMImpl_IGroupOperations::DifferenceIDs (Handle(GEOM_Object) theGroup, if ( aLength - aRemLength > 0 ) { aNewSeq = new TColStd_HArray1OfInteger(1, aLength - aRemLength); for (j = 1; j <= aLength; j++) { - if (!mapIDsToRemove.Contains(aSeq->Value(j))) { - aNewSeq->SetValue(k, aSeq->Value(j)); - k++; - } + if (!mapIDsToRemove.Contains(aSeq->Value(j))) { + aNewSeq->SetValue(k, aSeq->Value(j)); + k++; + } } } else { @@ -750,6 +749,743 @@ void GEOMImpl_IGroupOperations::DifferenceIDs (Handle(GEOM_Object) theGroup, SetErrorCode(OK); } +//============================================================================= +/*! + * UnionGroups + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IGroupOperations::UnionGroups (Handle(GEOM_Object) theGroup1, + Handle(GEOM_Object) theGroup2) +{ + SetErrorCode(KO); + if (theGroup1.IsNull() || theGroup2.IsNull()) return NULL; + + // Get group type + TopAbs_ShapeEnum aType1 = GetType(theGroup1); + TopAbs_ShapeEnum aType2 = GetType(theGroup2); + TopAbs_ShapeEnum aType = aType1; + if (aType1 != aType2) { + if (aType1 != TopAbs_SHAPE && aType1 != TopAbs_COMPOUND) { + if (aType2 == TopAbs_SHAPE || aType2 == TopAbs_COMPOUND) + aType = aType2; + else { + SetErrorCode("Error: UnionGroups cannot be performed on groups of different type"); + return NULL; + } + } + } + + // Get Main Shape + Handle(GEOM_Function) aFunction1 = theGroup1->GetLastFunction(); + Handle(GEOM_Function) aFunction2 = theGroup2->GetLastFunction(); + if (aFunction1.IsNull() || aFunction2.IsNull()) return NULL; + + GEOM_ISubShape aSSI1 (aFunction1); + GEOM_ISubShape aSSI2 (aFunction2); + + Handle(GEOM_Function) aMainShapeFunc1 = aSSI1.GetMainShape(); + Handle(GEOM_Function) aMainShapeFunc2 = aSSI2.GetMainShape(); + if (aMainShapeFunc1.IsNull() || aMainShapeFunc2.IsNull()) return NULL; + + TDF_Label aLabel1 = aMainShapeFunc1->GetOwnerEntry(); + TDF_Label aLabel2 = aMainShapeFunc2->GetOwnerEntry(); + if (aLabel1.IsRoot() || aLabel2.IsRoot()) { + SetErrorCode("Error: UnionGroups can be performed only on groups"); + return NULL; + } + + if (aLabel1 != aLabel2) { + SetErrorCode("Error: UnionGroups cannot be performed on groups, built on different main shapes"); + return NULL; + } + + Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel1); + if (aMainObj.IsNull()) return NULL; + + // New contents of the group + TColStd_ListOfInteger aNewIDs; + TColStd_MapOfInteger mapIDs; + + Handle(TColStd_HArray1OfInteger) aSeq1 = aSSI1.GetIndices(); + Handle(TColStd_HArray1OfInteger) aSeq2 = aSSI2.GetIndices(); + if (aSeq1.IsNull() || aSeq2.IsNull()) return NULL; + + Standard_Integer j, val_j; + Standard_Integer aLength1 = aSeq1->Length(); + Standard_Integer aLength2 = aSeq2->Length(); + + for (j = 1; j <= aLength1; j++) { + val_j = aSeq1->Value(j); + if (val_j > 0 && mapIDs.Add(val_j)) { + aNewIDs.Append(val_j); + } + } + for (j = 1; j <= aLength2; j++) { + val_j = aSeq2->Value(j); + if (val_j > 0 && mapIDs.Add(val_j)) { + aNewIDs.Append(val_j); + } + } + + if (aNewIDs.Extent() < 1) { + SetErrorCode("Error: UnionGroups cannot be performed on two empty groups"); + return NULL; + } + + // Put new indices from the list into an array + Standard_Integer k = 1; + TColStd_ListIteratorOfListOfInteger aNewIDsIter (aNewIDs); + Handle(TColStd_HArray1OfInteger) aNewArr = new TColStd_HArray1OfInteger (1, aNewIDs.Extent()); + for (; aNewIDsIter.More(); aNewIDsIter.Next(), k++) { + aNewArr->SetValue(k, aNewIDsIter.Value()); + } + + // Create the Group + Handle(GEOM_Object) aGroup = GetEngine()->AddSubShape(aMainObj, aNewArr); + aGroup->SetType(GEOM_GROUP); + TDF_Label aFreeLabel = aGroup->GetFreeLabel(); + TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)aType); + + // Make a Python command + Handle(GEOM_Function) aFunction = aGroup->GetFunction(1); + GEOM::TPythonDump(aFunction) << aGroup << " = geompy.UnionGroups(" + << theGroup1 << ", " << theGroup2 << ")"; + + SetErrorCode(OK); + return aGroup; +} + +//============================================================================= +/*! + * IntersectGroups + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IGroupOperations::IntersectGroups (Handle(GEOM_Object) theGroup1, + Handle(GEOM_Object) theGroup2) +{ + SetErrorCode(KO); + if (theGroup1.IsNull() || theGroup2.IsNull()) return NULL; + + // Get group type + TopAbs_ShapeEnum aType1 = GetType(theGroup1); + TopAbs_ShapeEnum aType2 = GetType(theGroup2); + TopAbs_ShapeEnum aType = aType1; + if (aType1 != aType2) { + if (aType1 != TopAbs_SHAPE && aType1 != TopAbs_COMPOUND) { + if (aType2 == TopAbs_SHAPE || aType2 == TopAbs_COMPOUND) + aType = aType2; + else { + SetErrorCode("Error: IntersectGroups cannot be performed on groups of different type"); + return NULL; + } + } + } + + // Get Main Shape + Handle(GEOM_Function) aFunction1 = theGroup1->GetLastFunction(); + Handle(GEOM_Function) aFunction2 = theGroup2->GetLastFunction(); + if (aFunction1.IsNull() || aFunction2.IsNull()) return NULL; + + GEOM_ISubShape aSSI1 (aFunction1); + GEOM_ISubShape aSSI2 (aFunction2); + + Handle(GEOM_Function) aMainShapeFunc1 = aSSI1.GetMainShape(); + Handle(GEOM_Function) aMainShapeFunc2 = aSSI2.GetMainShape(); + if (aMainShapeFunc1.IsNull() || aMainShapeFunc2.IsNull()) return NULL; + + TDF_Label aLabel1 = aMainShapeFunc1->GetOwnerEntry(); + TDF_Label aLabel2 = aMainShapeFunc2->GetOwnerEntry(); + if (aLabel1.IsRoot() || aLabel2.IsRoot()) { + SetErrorCode("Error: UnionGroups can be performed only on groups"); + return NULL; + } + + if (aLabel1 != aLabel2) { + SetErrorCode("Error: IntersectGroups cannot be performed on groups, built on different main shapes"); + return NULL; + } + + Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel1); + if (aMainObj.IsNull()) return NULL; + + // New contents of the group + TColStd_ListOfInteger aNewIDs; + TColStd_MapOfInteger mapIDs; + + Handle(TColStd_HArray1OfInteger) aSeq1 = aSSI1.GetIndices(); + Handle(TColStd_HArray1OfInteger) aSeq2 = aSSI2.GetIndices(); + if (aSeq1.IsNull() || aSeq2.IsNull()) return NULL; + + Standard_Integer j, val_j; + Standard_Integer aLength1 = aSeq1->Length(); + Standard_Integer aLength2 = aSeq2->Length(); + + for (j = 1; j <= aLength1; j++) { + mapIDs.Add(aSeq1->Value(j)); + } + for (j = 1; j <= aLength2; j++) { + val_j = aSeq2->Value(j); + if (val_j > 0 && !mapIDs.Add(val_j)) { + // add index, if it is in mapIDs (filled from Group_1) + aNewIDs.Append(val_j); + } + } + + Handle(TColStd_HArray1OfInteger) aNewArr; + if (aNewIDs.Extent() < 1) { + aNewArr = new TColStd_HArray1OfInteger (1, 1); + aNewArr->SetValue(1, -1); + } + else { + // Put new indices from the list into an array + Standard_Integer k = 1; + TColStd_ListIteratorOfListOfInteger aNewIDsIter (aNewIDs); + aNewArr = new TColStd_HArray1OfInteger (1, aNewIDs.Extent()); + for (; aNewIDsIter.More(); aNewIDsIter.Next(), k++) { + aNewArr->SetValue(k, aNewIDsIter.Value()); + } + } + + // Create the Group + Handle(GEOM_Object) aGroup = GetEngine()->AddSubShape(aMainObj, aNewArr); + aGroup->SetType(GEOM_GROUP); + TDF_Label aFreeLabel = aGroup->GetFreeLabel(); + TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)aType); + + // Make a Python command + Handle(GEOM_Function) aFunction = aGroup->GetFunction(1); + GEOM::TPythonDump(aFunction) << aGroup << " = geompy.IntersectGroups(" + << theGroup1 << ", " << theGroup2 << ")"; + + SetErrorCode(OK); + return aGroup; +} + +//============================================================================= +/*! + * CutGroups + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IGroupOperations::CutGroups (Handle(GEOM_Object) theGroup1, + Handle(GEOM_Object) theGroup2) +{ + SetErrorCode(KO); + if (theGroup1.IsNull() || theGroup2.IsNull()) return NULL; + + // Get group type + TopAbs_ShapeEnum aType1 = GetType(theGroup1); + TopAbs_ShapeEnum aType2 = GetType(theGroup2); + TopAbs_ShapeEnum aType = aType1; + if (aType1 != aType2) { + if (aType1 != TopAbs_SHAPE && aType1 != TopAbs_COMPOUND) { + if (aType2 == TopAbs_SHAPE || aType2 == TopAbs_COMPOUND) + aType = aType2; + else { + SetErrorCode("Error: CutGroups cannot be performed on groups of different type"); + return NULL; + } + } + } + + // Get Main Shape + Handle(GEOM_Function) aFunction1 = theGroup1->GetLastFunction(); + Handle(GEOM_Function) aFunction2 = theGroup2->GetLastFunction(); + if (aFunction1.IsNull() || aFunction2.IsNull()) return NULL; + + GEOM_ISubShape aSSI1 (aFunction1); + GEOM_ISubShape aSSI2 (aFunction2); + + Handle(GEOM_Function) aMainShapeFunc1 = aSSI1.GetMainShape(); + Handle(GEOM_Function) aMainShapeFunc2 = aSSI2.GetMainShape(); + if (aMainShapeFunc1.IsNull() || aMainShapeFunc2.IsNull()) return NULL; + + TDF_Label aLabel1 = aMainShapeFunc1->GetOwnerEntry(); + TDF_Label aLabel2 = aMainShapeFunc2->GetOwnerEntry(); + if (aLabel1.IsRoot() || aLabel2.IsRoot()) { + SetErrorCode("Error: UnionGroups can be performed only on groups"); + return NULL; + } + + if (aLabel1 != aLabel2) { + SetErrorCode("Error: CutGroups cannot be performed on groups, built on different main shapes"); + return NULL; + } + + Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel1); + if (aMainObj.IsNull()) return NULL; + + // New contents of the group + TColStd_ListOfInteger aNewIDs; + TColStd_MapOfInteger mapIDs; + + Handle(TColStd_HArray1OfInteger) aSeq1 = aSSI1.GetIndices(); + Handle(TColStd_HArray1OfInteger) aSeq2 = aSSI2.GetIndices(); + if (aSeq1.IsNull() || aSeq2.IsNull()) return NULL; + + Standard_Integer j, val_j; + Standard_Integer aLength1 = aSeq1->Length(); + Standard_Integer aLength2 = aSeq2->Length(); + + for (j = 1; j <= aLength2; j++) { + mapIDs.Add(aSeq2->Value(j)); + } + for (j = 1; j <= aLength1; j++) { + val_j = aSeq1->Value(j); + if (val_j > 0 && mapIDs.Add(val_j)) { + // add index, if it is not in mapIDs (filled from Group_2) + aNewIDs.Append(val_j); + } + } + + Handle(TColStd_HArray1OfInteger) aNewArr; + if (aNewIDs.Extent() < 1) { + aNewArr = new TColStd_HArray1OfInteger (1, 1); + aNewArr->SetValue(1, -1); + } + else { + // Put new indices from the list into an array + Standard_Integer k = 1; + TColStd_ListIteratorOfListOfInteger aNewIDsIter (aNewIDs); + aNewArr = new TColStd_HArray1OfInteger (1, aNewIDs.Extent()); + for (; aNewIDsIter.More(); aNewIDsIter.Next(), k++) { + aNewArr->SetValue(k, aNewIDsIter.Value()); + } + } + + // Create the Group + Handle(GEOM_Object) aGroup = GetEngine()->AddSubShape(aMainObj, aNewArr); + aGroup->SetType(GEOM_GROUP); + TDF_Label aFreeLabel = aGroup->GetFreeLabel(); + TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)aType); + + // Make a Python command + Handle(GEOM_Function) aFunction = aGroup->GetFunction(1); + GEOM::TPythonDump(aFunction) << aGroup << " = geompy.CutGroups(" + << theGroup1 << ", " << theGroup2 << ")"; + + SetErrorCode(OK); + return aGroup; +} + +//============================================================================= +/*! + * UnionListOfGroups + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IGroupOperations::UnionListOfGroups + (const Handle(TColStd_HSequenceOfTransient)& theGList) +{ + SetErrorCode(KO); + if (theGList.IsNull()) return NULL; + + Standard_Integer i, aLen = theGList->Length(); + if (aLen < 1) { + SetErrorCode("UnionListOfGroups error: the list of groups is empty"); + return NULL; + } + + TopAbs_ShapeEnum aType, aType_i; + TDF_Label aLabel, aLabel_i; + TColStd_ListOfInteger aNewIDs; + TColStd_MapOfInteger mapIDs; + + // Iterate on the initial groups + for (i = 1; i <= aLen; i++) { + Handle(GEOM_Object) aGr_i = Handle(GEOM_Object)::DownCast(theGList->Value(i)); + + // Get group type + aType_i = GetType(aGr_i); + if (i == 1) + aType = aType_i; + else { + if (aType_i != aType) { + if (aType != TopAbs_SHAPE && aType != TopAbs_COMPOUND) { + if (aType_i == TopAbs_SHAPE || aType_i == TopAbs_COMPOUND) + aType = aType_i; + else { + SetErrorCode("Error: UnionListOfGroups cannot be performed on groups of different type"); + return NULL; + } + } + } + } + + // Get Main Shape + Handle(GEOM_Function) aFunction_i = aGr_i->GetLastFunction(); + if (aFunction_i.IsNull()) return NULL; + GEOM_ISubShape aSSI (aFunction_i); + Handle(GEOM_Function) aMainShapeFunc = aSSI.GetMainShape(); + if (aMainShapeFunc.IsNull()) return NULL; + aLabel_i = aMainShapeFunc->GetOwnerEntry(); + if (aLabel_i.IsRoot()) { + SetErrorCode("Error: UnionGroups can be performed only on groups"); + return NULL; + } + if (i == 1) + aLabel = aLabel_i; + else { + if (aLabel_i != aLabel) { + SetErrorCode("Error: UnionListOfGroups cannot be performed on groups, built on different main shapes"); + return NULL; + } + } + + // New contents of the group + Handle(TColStd_HArray1OfInteger) aSeq = aSSI.GetIndices(); + if (aSeq.IsNull()) return NULL; + + Standard_Integer j, val_j, aLength = aSeq->Length(); + for (j = 1; j <= aLength; j++) { + val_j = aSeq->Value(j); + if (val_j > 0 && mapIDs.Add(val_j)) { + aNewIDs.Append(val_j); + } + } + } + + // Check the resulting list of indices + if (aNewIDs.Extent() < 1) { + SetErrorCode("Error: UnionListOfGroups cannot be performed on all empty groups"); + return NULL; + } + + Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel); + if (aMainObj.IsNull()) return NULL; + + // Put new indices from the list into an array + Standard_Integer k = 1; + TColStd_ListIteratorOfListOfInteger aNewIDsIter (aNewIDs); + Handle(TColStd_HArray1OfInteger) aNewArr = new TColStd_HArray1OfInteger (1, aNewIDs.Extent()); + for (; aNewIDsIter.More(); aNewIDsIter.Next(), k++) { + aNewArr->SetValue(k, aNewIDsIter.Value()); + } + + // Create the Group + Handle(GEOM_Object) aGroup = GetEngine()->AddSubShape(aMainObj, aNewArr); + aGroup->SetType(GEOM_GROUP); + TDF_Label aFreeLabel = aGroup->GetFreeLabel(); + TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)aType); + + //Make a Python command + Handle(GEOM_Function) aFunction = aGroup->GetFunction(1); + GEOM::TPythonDump pd (aFunction); + pd << aGroup << " = geompy.UnionListOfGroups(["; + for (i = 1; i <= aLen; i++) { + Handle(GEOM_Object) aGr_i = Handle(GEOM_Object)::DownCast(theGList->Value(i)); + pd << aGr_i << ((i < aLen) ? ", " : "])"); + } + + SetErrorCode(OK); + return aGroup; +} + +//============================================================================= +/*! + * IntersectListOfGroups + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IGroupOperations::IntersectListOfGroups + (const Handle(TColStd_HSequenceOfTransient)& theGList) +{ + SetErrorCode(KO); + if (theGList.IsNull()) return NULL; + + Standard_Integer i, aLen = theGList->Length(); + if (aLen < 1) { + SetErrorCode("IntersectListOfGroups error: the list of groups is empty"); + return NULL; + } + + TopAbs_ShapeEnum aType, aType_i; + TDF_Label aLabel, aLabel_i; + TColStd_ListOfInteger aNewIDs; + TColStd_MapOfInteger mapIDs; + + // Iterate on the initial groups + for (i = 1; i <= aLen; i++) { + Handle(GEOM_Object) aGr_i = Handle(GEOM_Object)::DownCast(theGList->Value(i)); + + // Get group type + aType_i = GetType(aGr_i); + if (i == 1) + aType = aType_i; + else { + if (aType_i != aType) { + if (aType != TopAbs_SHAPE && aType != TopAbs_COMPOUND) { + if (aType_i == TopAbs_SHAPE || aType_i == TopAbs_COMPOUND) + aType = aType_i; + else { + SetErrorCode("Error: IntersectListOfGroups cannot be performed on groups of different type"); + return NULL; + } + } + } + } + + // Get Main Shape + Handle(GEOM_Function) aFunction_i = aGr_i->GetLastFunction(); + if (aFunction_i.IsNull()) return NULL; + GEOM_ISubShape aSSI (aFunction_i); + Handle(GEOM_Function) aMainShapeFunc = aSSI.GetMainShape(); + if (aMainShapeFunc.IsNull()) return NULL; + aLabel_i = aMainShapeFunc->GetOwnerEntry(); + if (aLabel_i.IsRoot()) { + SetErrorCode("Error: UnionGroups can be performed only on groups"); + return NULL; + } + if (i == 1) + aLabel = aLabel_i; + else { + if (aLabel_i != aLabel) { + SetErrorCode("Error: IntersectListOfGroups cannot be performed on groups, built on different main shapes"); + return NULL; + } + } + + // New contents of the group + Handle(TColStd_HArray1OfInteger) aSeq = aSSI.GetIndices(); + if (aSeq.IsNull()) return NULL; + + Standard_Integer j, val_j, aLength = aSeq->Length(); + for (j = 1; j <= aLength; j++) { + val_j = aSeq->Value(j); + if (val_j > 0) { + if (i == 1) { + // get all elements of the first group + if (mapIDs.Add(val_j)) + aNewIDs.Append(val_j); + } + else { + // get only elements, present in all previously processed groups + if (!mapIDs.Add(val_j)) + aNewIDs.Append(val_j); + } + } + } + + // refill the map with only validated elements + if (i > 1) { + mapIDs.Clear(); + TColStd_ListIteratorOfListOfInteger aNewIDsIter (aNewIDs); + for (; aNewIDsIter.More(); aNewIDsIter.Next()) { + mapIDs.Add(aNewIDsIter.Value()); + } + } + // clear the resulting list before starting the next sycle + if (i < aLen) { + aNewIDs.Clear(); + } + } + + Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel); + if (aMainObj.IsNull()) return NULL; + + Handle(TColStd_HArray1OfInteger) aNewArr; + if (aNewIDs.Extent() < 1) { + aNewArr = new TColStd_HArray1OfInteger (1, 1); + aNewArr->SetValue(1, -1); + } + else { + // Put new indices from the list into an array + Standard_Integer k = 1; + TColStd_ListIteratorOfListOfInteger aNewIDsIter (aNewIDs); + aNewArr = new TColStd_HArray1OfInteger (1, aNewIDs.Extent()); + for (; aNewIDsIter.More(); aNewIDsIter.Next(), k++) { + aNewArr->SetValue(k, aNewIDsIter.Value()); + } + } + + // Create the Group + Handle(GEOM_Object) aGroup = GetEngine()->AddSubShape(aMainObj, aNewArr); + aGroup->SetType(GEOM_GROUP); + TDF_Label aFreeLabel = aGroup->GetFreeLabel(); + TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)aType); + + //Make a Python command + Handle(GEOM_Function) aFunction = aGroup->GetFunction(1); + GEOM::TPythonDump pd (aFunction); + pd << aGroup << " = geompy.IntersectListOfGroups(["; + for (i = 1; i <= aLen; i++) { + Handle(GEOM_Object) aGr_i = Handle(GEOM_Object)::DownCast(theGList->Value(i)); + pd << aGr_i << ((i < aLen) ? ", " : "])"); + } + + SetErrorCode(OK); + return aGroup; +} + +//============================================================================= +/*! + * CutListOfGroups + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IGroupOperations::CutListOfGroups + (const Handle(TColStd_HSequenceOfTransient)& theGList1, + const Handle(TColStd_HSequenceOfTransient)& theGList2) +{ + SetErrorCode(KO); + if (theGList1.IsNull() || theGList2.IsNull()) return NULL; + + Standard_Integer i; + Standard_Integer aLen1 = theGList1->Length(); + Standard_Integer aLen2 = theGList2->Length(); + if (aLen1 < 1) { + SetErrorCode("CutListOfGroups error: the first list of groups is empty"); + return NULL; + } + + TopAbs_ShapeEnum aType, aType_i; + TDF_Label aLabel, aLabel_i; + TColStd_ListOfInteger aNewIDs; + TColStd_MapOfInteger mapIDs; + + // 1. Collect indices to be excluded (from theGList2) into the mapIDs + for (i = 1; i <= aLen2; i++) { + Handle(GEOM_Object) aGr_i = Handle(GEOM_Object)::DownCast(theGList2->Value(i)); + + // Get group type + aType_i = GetType(aGr_i); + if (i == 1) + aType = aType_i; + else { + if (aType_i != aType) { + if (aType != TopAbs_SHAPE && aType != TopAbs_COMPOUND) { + if (aType_i == TopAbs_SHAPE || aType_i == TopAbs_COMPOUND) + aType = aType_i; + else { + SetErrorCode("Error: CutListOfGroups cannot be performed on groups of different type"); + return NULL; + } + } + } + } + + // Get Main Shape + Handle(GEOM_Function) aFunction_i = aGr_i->GetLastFunction(); + if (aFunction_i.IsNull()) return NULL; + GEOM_ISubShape aSSI (aFunction_i); + Handle(GEOM_Function) aMainShapeFunc = aSSI.GetMainShape(); + if (aMainShapeFunc.IsNull()) return NULL; + aLabel_i = aMainShapeFunc->GetOwnerEntry(); + if (aLabel_i.IsRoot()) { + SetErrorCode("Error: UnionGroups can be performed only on groups"); + return NULL; + } + if (i == 1) + aLabel = aLabel_i; + else { + if (aLabel_i != aLabel) { + SetErrorCode("Error: CutListOfGroups cannot be performed on groups, built on different main shapes"); + return NULL; + } + } + + // Indiced to exclude + Handle(TColStd_HArray1OfInteger) aSeq = aSSI.GetIndices(); + if (aSeq.IsNull()) return NULL; + + Standard_Integer j, aLength = aSeq->Length(); + for (j = 1; j <= aLength; j++) { + mapIDs.Add(aSeq->Value(j)); + } + } + + // 2. Collect indices from theGList1, avoiding indices from theGList2 (mapIDs) + for (i = 1; i <= aLen1; i++) { + Handle(GEOM_Object) aGr_i = Handle(GEOM_Object)::DownCast(theGList1->Value(i)); + + // Get group type + aType_i = GetType(aGr_i); + if (i == 1 && aLen2 < 1) + aType = aType_i; + else { + if (aType_i != aType) { + if (aType != TopAbs_SHAPE && aType != TopAbs_COMPOUND) { + if (aType_i == TopAbs_SHAPE || aType_i == TopAbs_COMPOUND) + aType = aType_i; + else { + SetErrorCode("Error: CutListOfGroups cannot be performed on groups of different type"); + return NULL; + } + } + } + } + + // Get Main Shape + Handle(GEOM_Function) aFunction_i = aGr_i->GetLastFunction(); + if (aFunction_i.IsNull()) return NULL; + GEOM_ISubShape aSSI (aFunction_i); + Handle(GEOM_Function) aMainShapeFunc = aSSI.GetMainShape(); + if (aMainShapeFunc.IsNull()) return NULL; + aLabel_i = aMainShapeFunc->GetOwnerEntry(); + if (aLabel_i.IsRoot()) { + SetErrorCode("Error: UnionGroups can be performed only on groups"); + return NULL; + } + if (i == 1 && aLen2 < 1) + aLabel = aLabel_i; + else { + if (aLabel_i != aLabel) { + SetErrorCode("Error: CutListOfGroups cannot be performed on groups, built on different main shapes"); + return NULL; + } + } + + // New contents of the group + Handle(TColStd_HArray1OfInteger) aSeq = aSSI.GetIndices(); + if (aSeq.IsNull()) return NULL; + + Standard_Integer j, val_j, aLength = aSeq->Length(); + for (j = 1; j <= aLength; j++) { + val_j = aSeq->Value(j); + if (val_j > 0 && mapIDs.Add(val_j)) { + // get only elements, not present in mapIDs (theGList2) + aNewIDs.Append(val_j); + } + } + } + + Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel); + if (aMainObj.IsNull()) return NULL; + + Handle(TColStd_HArray1OfInteger) aNewArr; + if (aNewIDs.Extent() < 1) { + aNewArr = new TColStd_HArray1OfInteger (1, 1); + aNewArr->SetValue(1, -1); + } + else { + // Put new indices from the list into an array + Standard_Integer k = 1; + TColStd_ListIteratorOfListOfInteger aNewIDsIter (aNewIDs); + aNewArr = new TColStd_HArray1OfInteger (1, aNewIDs.Extent()); + for (; aNewIDsIter.More(); aNewIDsIter.Next(), k++) { + aNewArr->SetValue(k, aNewIDsIter.Value()); + } + } + + // Create the Group + Handle(GEOM_Object) aGroup = GetEngine()->AddSubShape(aMainObj, aNewArr); + aGroup->SetType(GEOM_GROUP); + TDF_Label aFreeLabel = aGroup->GetFreeLabel(); + TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)aType); + + //Make a Python command + Handle(GEOM_Function) aFunction = aGroup->GetFunction(1); + GEOM::TPythonDump pd (aFunction); + pd << aGroup << " = geompy.CutListOfGroups(["; + for (i = 1; i <= aLen1; i++) { + Handle(GEOM_Object) aGr_i = Handle(GEOM_Object)::DownCast(theGList1->Value(i)); + pd << aGr_i << ((i < aLen1) ? ", " : "], ["); + } + for (i = 1; i <= aLen2; i++) { + Handle(GEOM_Object) aGr_i = Handle(GEOM_Object)::DownCast(theGList2->Value(i)); + pd << aGr_i << ((i < aLen2) ? ", " : "])"); + } + + SetErrorCode(OK); + return aGroup; +} + //============================================================================= /*! * GetType diff --git a/src/GEOMImpl/GEOMImpl_IGroupOperations.hxx b/src/GEOMImpl/GEOMImpl_IGroupOperations.hxx index 0b6a89110..6b8d485ec 100644 --- a/src/GEOMImpl/GEOMImpl_IGroupOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IGroupOperations.hxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_IGroupOperations_HXX_ #define _GEOMImpl_IGroupOperations_HXX_ @@ -28,7 +27,7 @@ #include "GEOM_Engine.hxx" #include "GEOM_Object.hxx" #include -#include +#include #include #include @@ -55,6 +54,20 @@ class GEOMImpl_IGroupOperations : public GEOM_IOperations { Standard_EXPORT void DifferenceIDs (Handle(GEOM_Object) theGroup, const Handle(TColStd_HSequenceOfInteger)& theSubShapes); + Standard_EXPORT Handle(GEOM_Object) UnionGroups (Handle(GEOM_Object) theGroup1, + Handle(GEOM_Object) theGroup2); + Standard_EXPORT Handle(GEOM_Object) IntersectGroups (Handle(GEOM_Object) theGroup1, + Handle(GEOM_Object) theGroup2); + Standard_EXPORT Handle(GEOM_Object) CutGroups (Handle(GEOM_Object) theGroup1, + Handle(GEOM_Object) theGroup2); + + Standard_EXPORT Handle(GEOM_Object) UnionListOfGroups + (const Handle(TColStd_HSequenceOfTransient)& theGList); + Standard_EXPORT Handle(GEOM_Object) IntersectListOfGroups + (const Handle(TColStd_HSequenceOfTransient)& theGList); + Standard_EXPORT Handle(GEOM_Object) CutListOfGroups (const Handle(TColStd_HSequenceOfTransient)& theGList1, + const Handle(TColStd_HSequenceOfTransient)& theGList2); + Standard_EXPORT TopAbs_ShapeEnum GetType(Handle(GEOM_Object) theGroup); Standard_EXPORT Handle(GEOM_Object) GetMainShape(Handle(GEOM_Object) theGroup); diff --git a/src/GEOMImpl/GEOMImpl_IInsertOperations.cxx b/src/GEOMImpl/GEOMImpl_IInsertOperations.cxx index 3bb7cec61..6aca179a1 100644 --- a/src/GEOMImpl/GEOMImpl_IInsertOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IInsertOperations.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -47,7 +46,9 @@ #include #include +#include #include +#include #include #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1 @@ -61,10 +62,9 @@ //============================================================================= /*! - * constructor: + * constructor */ //============================================================================= - GEOMImpl_IInsertOperations::GEOMImpl_IInsertOperations(GEOM_Engine* theEngine, int theDocID) : GEOM_IOperations(theEngine, theDocID) { @@ -76,20 +76,17 @@ GEOMImpl_IInsertOperations::GEOMImpl_IInsertOperations(GEOM_Engine* theEngine, i * destructor */ //============================================================================= - GEOMImpl_IInsertOperations::~GEOMImpl_IInsertOperations() { MESSAGE("GEOMImpl_IInsertOperations::~GEOMImpl_IInsertOperations"); } - - //============================================================================= /*! * MakeCopy */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_IInsertOperations::MakeCopy(Handle(GEOM_Object) theOriginal) +Handle(GEOM_Object) GEOMImpl_IInsertOperations::MakeCopy (Handle(GEOM_Object) theOriginal) { SetErrorCode(KO); @@ -231,7 +228,6 @@ Handle(GEOM_Object) GEOMImpl_IInsertOperations::Import aCI.SetFileName(theFileName); aCI.SetFormatName(theFormatName); aCI.SetPluginName(aLibName); - //cout<<"IIO: theFormatName = "<GetValue(); TopoDS_Vertex V = TopoDS::Vertex(S); gp_Pnt P = BRep_Tool::Pnt(V); @@ -270,10 +267,42 @@ Handle(GEOM_Object) GEOMImpl_IInsertOperations::Import //cout<<"IIO: aUnitName = "<String(); + + aValue = GEOMImpl_ImportDriver::ReadValue(theFileName, aLibName, theParameterName, anError); + if (anError.IsEmpty()) + SetErrorCode(OK); + else + SetErrorCode(anError.ToCString()); + + return aValue; +} + //============================================================================= /*! * ImportTranslators @@ -554,6 +583,48 @@ Standard_Boolean GEOMImpl_IInsertOperations::InitResMgr() myResMgrUser->Find("Import") || myResMgrUser->Find("Export")); } +//============================================================================= +/*! + * RestoreShape + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IInsertOperations::RestoreShape (std::istringstream& theStream) +{ + SetErrorCode(KO); + + //Add a new result object + Handle(GEOM_Object) result = GetEngine()->AddObject(GetDocID(), GEOM_COPY); + + //Add a Copy function + Handle(GEOM_Function) aFunction = result->AddFunction(GEOMImpl_CopyDriver::GetID(), COPY_WITHOUT_REF); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_CopyDriver::GetID()) return NULL; + + //Read a shape from the stream + TopoDS_Shape aShape; + BRep_Builder B; + BRepTools::Read(aShape, theStream, B); + if (aShape.IsNull()) { + SetErrorCode("RestoreShape error: BREP reading failed"); + } + + //Set function value + aFunction->SetValue(aShape); + + //Special dump to avoid restored shapes publication. + //See correcponding code in GEOM_Engine.cxx (method ProcessFunction) + //GEOM::TPythonDump(aFunction) << "#"; + + GEOM::TPythonDump(aFunction) << result + << " = geompy.RestoreShape(\"\") # the shape string has not been dump for performance reason"; + + SetErrorCode(OK); + + return result; +} + int GEOMImpl_IInsertOperations::LoadTexture(const TCollection_AsciiString& theTextureFile) { SetErrorCode(KO); diff --git a/src/GEOMImpl/GEOMImpl_IInsertOperations.hxx b/src/GEOMImpl/GEOMImpl_IInsertOperations.hxx index e60c22b32..56ea89d42 100644 --- a/src/GEOMImpl/GEOMImpl_IInsertOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IInsertOperations.hxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_IInsertOperations_HXX_ #define _GEOMImpl_IInsertOperations_HXX_ @@ -55,6 +54,10 @@ class GEOMImpl_IInsertOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) Import (const TCollection_AsciiString& theFileName, const TCollection_AsciiString& theFormatType); + Standard_EXPORT TCollection_AsciiString ReadValue (const TCollection_AsciiString& theFileName, + const TCollection_AsciiString& theFormatType, + const TCollection_AsciiString& theParameterName); + Standard_EXPORT void Export (const Handle(GEOM_Object) theOriginal, const TCollection_AsciiString& theFileName, const TCollection_AsciiString& theFormatType); @@ -69,6 +72,8 @@ class GEOMImpl_IInsertOperations : public GEOM_IOperations { const TCollection_AsciiString& theFormat, Handle(TCollection_HAsciiString)& theLibName); + Standard_EXPORT Handle(GEOM_Object) RestoreShape (std::istringstream& theStream); + Standard_EXPORT int LoadTexture(const TCollection_AsciiString& theTextureFile); Standard_EXPORT int AddTexture(int theWidth, int theHeight, diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx index 98abba29c..df3a87a49 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -40,10 +39,8 @@ #include #include #include -//#include #include #include -//#include #include #include @@ -58,22 +55,23 @@ #include #include +#include +#include #include #include +#include #include #include #include #include #include +#include #include #include #include #include -#include -#include - #include #include #include @@ -81,48 +79,48 @@ #include #include #include +#include #include #include #include #include #include +#include +#include +#include + +#include +#include + #include -#include + +#include +#include +#include +#include +#include +#include +#include #include +#include #include -#include -#include -#include +#include #include #include -#include -#include -#include -#include -#include - -#include -#include +#include -#include #include #include -#include -#include -#include -#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC +#include +#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC //============================================================================= /*! @@ -794,10 +792,10 @@ gp_Ax3 GEOMImpl_IMeasureOperations::GetPosition (const TopoDS_Shape& theShape) if(theShape.Orientation() == TopAbs_REVERSED) { gp_Dir Vx = aResult.XDirection(); - gp_Dir N = aResult.Direction().Mirrored(Vx); + gp_Dir N = aResult.Direction().Mirrored(Vx); gp_Pnt P = aResult.Location(); aResult = gp_Ax3(P, N, Vx); - } + } } } @@ -1206,6 +1204,17 @@ void GEOMImpl_IMeasureOperations::GetBoundingBox #if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; #endif + BRepBuilderAPI_Copy aCopyTool (aShape); + if (!aCopyTool.IsDone()) { + SetErrorCode("GetBoundingBox Error: Bad shape detected"); + return; + } + + aShape = aCopyTool.Shape(); + + // remove triangulation to obtain more exact boundaries + BRepTools::Clean(aShape); + BRepBndLib::Add(aShape, B); B.Get(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax); } @@ -1386,7 +1395,7 @@ bool GEOMImpl_IMeasureOperations::CheckSelfIntersections const NMTDS_ShapesDataStructure& aDS = *(aCSI.DS()); Standard_Integer aNbS = aDS.NumberOfShapesOfTheObject(); - // 3. Get the pairs of interfered shapes + // 3. Get the pairs of interfered shapes NMTDS_PInterfPool pIP = aCSI.IP(); //const NMTDS_ListOfPassKeyBoolean& aLPKB = pIP->Get(); const NMTDS_ListOfPairBoolean& aLPKB = pIP->Get(); diff --git a/src/GEOMImpl/GEOMImpl_ImportDriver.cxx b/src/GEOMImpl/GEOMImpl_ImportDriver.cxx index ee1495f0e..748a5a735 100644 --- a/src/GEOMImpl/GEOMImpl_ImportDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ImportDriver.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -27,10 +26,12 @@ #include #include -#include "utilities.h" - #include +#include + +#include "utilities.h" + #include #include @@ -57,6 +58,10 @@ typedef TopoDS_Shape (*funcPoint)(const TCollection_AsciiString&, TCollection_AsciiString&, const TDF_Label&); +typedef Handle(TCollection_HAsciiString) (*pGetValue)(const TCollection_AsciiString&, + const TCollection_AsciiString&, + TCollection_AsciiString&); + //======================================================================= //function : GetID //purpose : @@ -67,7 +72,6 @@ const Standard_GUID& GEOMImpl_ImportDriver::GetID() return aImportDriver; } - //======================================================================= //function : GEOMImpl_ImportDriver //purpose : @@ -97,6 +101,8 @@ Standard_Integer GEOMImpl_ImportDriver::Execute(TFunction_Logbook& log) const // load plugin library LibHandle anImportLib = LoadLib( aLibName.ToCString() ); //This is workaround of BUG OCC13051 + + // Get Import method funcPoint fp = 0; if ( anImportLib ) fp = (funcPoint)GetProc( anImportLib, "Import" ); @@ -129,6 +135,53 @@ Standard_Integer GEOMImpl_ImportDriver::Execute(TFunction_Logbook& log) const return 1; } +//======================================================================= +//function : ReadValue +//purpose : +//======================================================================= +TCollection_AsciiString GEOMImpl_ImportDriver::ReadValue(const TCollection_AsciiString& theFileName, + const TCollection_AsciiString& theLibName, + const TCollection_AsciiString& theParameterName, + TCollection_AsciiString& theError) +{ + TCollection_AsciiString aValue; + + if (theFileName.IsEmpty() || theLibName.IsEmpty() || theParameterName.IsEmpty()) + return aValue; + + // load plugin library + LibHandle anImportLib = LoadLib(theLibName.ToCString()); //This is workaround of BUG OCC13051 + if (!anImportLib) { + theError = theLibName + " library was not installed"; + return aValue; + } + + // Get GetValue method + pGetValue pGV = (pGetValue)GetProc(anImportLib, "GetValue"); + + if (!pGV) { + theError = theLibName + " library doesn't support GetValue method"; + return aValue; + } + + Handle(TCollection_HAsciiString) aHValue = pGV(theFileName, theParameterName, theError); + + if (aHValue.IsNull()) { + if (theError.IsEmpty()) + theError = theFileName + " doesn't contain requested parameter"; + return aValue; + } + + aValue = aHValue->String(); + + // unload plugin library + // commented by enk: + // the bug was occured: using ACIS Import/Export plugin + //UnLoadLib( anImportLib ); //This is workaround of BUG OCC13051 + + return aValue; +} + //======================================================================= //function : GEOMImpl_ImportDriver_Type_ diff --git a/src/GEOMImpl/GEOMImpl_ImportDriver.hxx b/src/GEOMImpl/GEOMImpl_ImportDriver.hxx index 0c625e05c..265e5ac4c 100644 --- a/src/GEOMImpl/GEOMImpl_ImportDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_ImportDriver.hxx @@ -18,11 +18,10 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // File : GEOMImpl_ImportDriver.ixx // Module : GEOMImpl -// + #ifndef _GEOMImpl_ImportDriver_HeaderFile #define _GEOMImpl_ImportDriver_HeaderFile @@ -119,6 +118,8 @@ class Handle(GEOMImpl_ImportDriver) : public Handle(TFunction_Driver) { #include #endif +#include + class TColStd_SequenceOfExtendedString; @@ -148,6 +149,11 @@ Standard_EXPORT Standard_Boolean MustExecute(const TFunction_Logbook&) const { r Standard_EXPORT static const Standard_GUID& GetID(); Standard_EXPORT ~GEOMImpl_ImportDriver() {}; + // Static method + Standard_EXPORT static TCollection_AsciiString ReadValue (const TCollection_AsciiString& theFileName, + const TCollection_AsciiString& theLibName, + const TCollection_AsciiString& theParameterName, + TCollection_AsciiString& theError); // Type management // diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx index e3c734a10..21475ee42 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx @@ -2222,6 +2222,11 @@ static TopoDS_Shape CreatePipeBiNormalAlongVector(const TopoDS_Wire& aWirePath, Standard_NullObject::Raise("MakePipe aborted : null base argument"); } + // Make copy to prevent modifying of base object: 0021525 + BRepBuilderAPI_Copy Copy (aShapeBase); + if (Copy.IsDone()) + aShapeBase = Copy.Shape(); + TopoDS_Shape aProf; if (aShapeBase.ShapeType() == TopAbs_VERTEX) { aProf = aShapeBase; @@ -2233,14 +2238,14 @@ static TopoDS_Shape CreatePipeBiNormalAlongVector(const TopoDS_Wire& aWirePath, aProf = aShapeBase; } else if (aShapeBase.ShapeType() == TopAbs_FACE) { - TopExp_Explorer wexp(aShapeBase,TopAbs_WIRE); + TopExp_Explorer wexp (aShapeBase,TopAbs_WIRE); aProf = wexp.Current(); } else { Standard_TypeMismatch::Raise ("MakePipe aborted : invalid type of base"); } - BRepOffsetAPI_MakePipeShell PipeBuilder(aWirePath); + BRepOffsetAPI_MakePipeShell PipeBuilder (aWirePath); PipeBuilder.Add(aProf); if (aShapeVec.IsNull()) { diff --git a/src/GEOMImpl/GEOMImpl_PointDriver.cxx b/src/GEOMImpl/GEOMImpl_PointDriver.cxx index b25807bd0..9fa9cf9c0 100644 --- a/src/GEOMImpl/GEOMImpl_PointDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PointDriver.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -26,6 +25,7 @@ #include #include #include +#include #include @@ -124,8 +124,8 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const aPnt = gp_Pnt(aPI.GetX(), aPI.GetY(), aPI.GetZ()); } else if (aType == POINT_XYZ_REF) { - Handle(GEOM_Function) aRefPoint = aPI.GetRef(); - TopoDS_Shape aRefShape = aRefPoint->GetValue(); + Handle(GEOM_Function) aRefFunc = aPI.GetRef(); + TopoDS_Shape aRefShape = aRefFunc->GetValue(); if (aRefShape.ShapeType() != TopAbs_VERTEX) { Standard_TypeMismatch::Raise ("Point creation aborted : referenced shape is not a vertex"); @@ -134,8 +134,8 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const aPnt = gp_Pnt(P.X() + aPI.GetX(), P.Y() + aPI.GetY(), P.Z() + aPI.GetZ()); } else if (aType == POINT_CURVE_PAR) { - Handle(GEOM_Function) aRefCurve = aPI.GetCurve(); - TopoDS_Shape aRefShape = aRefCurve->GetValue(); + Handle(GEOM_Function) aRefFunc = aPI.GetCurve(); + TopoDS_Shape aRefShape = aRefFunc->GetValue(); if (aRefShape.ShapeType() != TopAbs_EDGE) { Standard_TypeMismatch::Raise ("Point On Curve creation aborted : curve shape is not an edge"); @@ -146,8 +146,8 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const aPnt = aCurve->Value(aP); } else if (aType == POINT_CURVE_COORD) { - Handle(GEOM_Function) aRefCurve = aPI.GetCurve(); - TopoDS_Shape aRefShape = aRefCurve->GetValue(); + Handle(GEOM_Function) aRefFunc = aPI.GetCurve(); + TopoDS_Shape aRefShape = aRefFunc->GetValue(); if (aRefShape.ShapeType() != TopAbs_EDGE) { Standard_TypeMismatch::Raise ("Point On Curve creation aborted : curve shape is not an edge"); @@ -160,12 +160,12 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const } else if (aType == POINT_CURVE_LENGTH) { // RefCurve - Handle(GEOM_Function) aRefCurve = aPI.GetCurve(); - if (aRefCurve.IsNull()) { + Handle(GEOM_Function) aRefFunc = aPI.GetCurve(); + if (aRefFunc.IsNull()) { Standard_NullObject::Raise ("Point On Curve creation aborted : curve object is null"); } - TopoDS_Shape aRefShape1 = aRefCurve->GetValue(); + TopoDS_Shape aRefShape1 = aRefFunc->GetValue(); if (aRefShape1.ShapeType() != TopAbs_EDGE) { Standard_TypeMismatch::Raise ("Point On Curve creation aborted : curve shape is not an edge"); @@ -222,8 +222,8 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const aPnt = AdapCurve.Value(aParam); } else if (aType == POINT_SURFACE_PAR) { - Handle(GEOM_Function) aRefCurve = aPI.GetSurface(); - TopoDS_Shape aRefShape = aRefCurve->GetValue(); + Handle(GEOM_Function) aRefFunc = aPI.GetSurface(); + TopoDS_Shape aRefShape = aRefFunc->GetValue(); if (aRefShape.ShapeType() != TopAbs_FACE) { Standard_TypeMismatch::Raise ("Point On Surface creation aborted : surface shape is not a face"); @@ -238,8 +238,8 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const aPnt = aSurf->Value(U,V); } else if (aType == POINT_SURFACE_COORD) { - Handle(GEOM_Function) aRefCurve = aPI.GetSurface(); - TopoDS_Shape aRefShape = aRefCurve->GetValue(); + Handle(GEOM_Function) aRefFunc = aPI.GetSurface(); + TopoDS_Shape aRefShape = aRefFunc->GetValue(); if (aRefShape.ShapeType() != TopAbs_FACE) { Standard_TypeMismatch::Raise ("Point On Surface creation aborted : surface shape is not a face"); @@ -250,6 +250,17 @@ Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const ("Point On Surface creation aborted : cannot project point"); } } + else if (aType == POINT_FACE_ANY) { + Handle(GEOM_Function) aRefFunc = aPI.GetSurface(); + TopoDS_Shape aRefShape = aRefFunc->GetValue(); + if (aRefShape.ShapeType() != TopAbs_FACE) { + Standard_TypeMismatch::Raise + ("Point On Surface creation aborted : surface shape is not a face"); + } + TopoDS_Face F = TopoDS::Face(aRefShape); + gp_Pnt2d aP2d; + GEOMAlgo_Tools3D::PntInFace(F, aPnt, aP2d); + } else if (aType == POINT_LINES_INTERSECTION) { Handle(GEOM_Function) aRef1 = aPI.GetLine1(); Handle(GEOM_Function) aRef2 = aPI.GetLine2(); diff --git a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx index e1ef28022..9f2ec8081 100644 --- a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -349,7 +348,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const unsigned int ind, nbshapes = aShapes->Length(); // add faces - BRepBuilderAPI_Sewing aSewing(Precision::Confusion()*10.0); + BRepBuilderAPI_Sewing aSewing (Precision::Confusion()*10.0); for (ind = 1; ind <= nbshapes; ind++) { Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); TopoDS_Shape aShape_i = aRefShape->GetValue(); @@ -362,7 +361,8 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const aSewing.Perform(); TopoDS_Shape sh = aSewing.SewedShape(); - if( sh.ShapeType()==TopAbs_FACE && nbshapes==1 ) { + + if (sh.ShapeType()==TopAbs_FACE && nbshapes==1) { // case for creation of shell from one face - PAL12722 (skl 26.06.2006) TopoDS_Shell ss; B.MakeShell(ss); @@ -378,8 +378,25 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const ish++; } - if (ish != 1) - aShape = aSewing.SewedShape(); + if (ish != 1) { + // try the case of one face (Mantis issue 0021809) + TopExp_Explorer expF (sh, TopAbs_FACE); + Standard_Integer ifa = 0; + for (; expF.More(); expF.Next()) { + aShape = expF.Current(); + ifa++; + } + + if (ifa == 1) { + TopoDS_Shell ss; + B.MakeShell(ss); + B.Add(ss,aShape); + aShape = ss; + } + else { + aShape = aSewing.SewedShape(); + } + } } } diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 2e5f871b8..5182f8cdc 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // GEOM_Object types @@ -116,7 +115,8 @@ #define POINT_SURFACE_PAR 5 #define POINT_CURVE_COORD 6 #define POINT_SURFACE_COORD 7 -#define POINT_CURVE_LENGTH 8 +#define POINT_CURVE_LENGTH 8 +#define POINT_FACE_ANY 9 // Vector #define VECTOR_TWO_PNT 1 @@ -295,7 +295,10 @@ #define GLUE_EDGES_BY_LIST 4 #define SKETCHER_NINE_DOUBLS 1 -#define SKETCHER_PLANE 2 +#define SKETCHER_PLANE 2 + +#define SKETCHER3D_COORDS 1 +#define SKETCHER3D_COMMAND 2 // Measures #define CDG_MEASURE 1 diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index f0acaa34f..e83523ea4 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -355,9 +355,9 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) case GEOMOp::OpNoAutoColor: // POPUP - DISABLE AUTO COLOR OnDisableAutoColor(); break; - case GEOMOp::OpShowChildren: // POPUP - SHOW CHILDREN - case GEOMOp::OpHideChildren: // POPUP - HIDE CHILDREN - OnShowHideChildren( theCommandID == GEOMOp::OpShowChildren ); + case GEOMOp::OpDiscloseChildren: // POPUP - SHOW CHILDREN + case GEOMOp::OpConcealChildren: // POPUP - HIDE CHILDREN + OnDiscloseConcealChildren( theCommandID == GEOMOp::OpDiscloseChildren ); break; case GEOMOp::OpPointMarker: // POPUP - POINT MARKER OnPointMarker(); @@ -647,6 +647,42 @@ bool GEOMToolsGUI::Import() CORBA::String_var fileN = fileName.toLatin1().constData(); CORBA::String_var fileT = aCurrentType.toLatin1().constData(); + // jfa 21.08.2012 for mantis issue 21511 (STEP file units) + CORBA::String_var aUnits = aInsOp->ReadValue(fileN, fileT, "LEN_UNITS"); + TCollection_AsciiString aUnitsStr (aUnits.in()); + bool needConvert = true; + if (aUnitsStr.IsEmpty() || aUnitsStr == "UNIT_M") + needConvert = false; + + if (needConvert) { + if (igesAnswer == SUIT_MessageBox::NoToAll) { + // converting for all files is already approved + fileT = (aCurrentType + "_SCALE").toLatin1().constData(); + } + else if (igesAnswer != SUIT_MessageBox::YesToAll) { + SUIT_MessageBox::StandardButtons btns = SUIT_MessageBox::Yes | SUIT_MessageBox::No; + if (i < fileNames.count() - 1) btns = btns | SUIT_MessageBox::YesToAll | SUIT_MessageBox::NoToAll; + igesAnswer = SUIT_MessageBox::question(app->desktop(), + "Question",//tr("WRN_WARNING"), + tr("GEOM_SCALE_DIMENSIONS"), + btns | SUIT_MessageBox::Cancel, + SUIT_MessageBox::No); + switch (igesAnswer) { + case SUIT_MessageBox::Cancel: + return false; // cancel (break) import operation + case SUIT_MessageBox::Yes: + case SUIT_MessageBox::YesToAll: + break; // scaling is confirmed + case SUIT_MessageBox::No: + case SUIT_MessageBox::NoAll: + fileT = (aCurrentType + "_SCALE").toLatin1().constData(); + default: + break; // scaling is rejected + } // switch ( igesAnswer ) + } // if ( igeAnswer != NoToAll ) + } // if ( needConvert ) + + /* // skl 29.05.2009 if ( aCurrentType == "IGES" ) { GEOM::GEOM_Object_var anObj = aInsOp->ImportFile( fileN, "IGES_UNIT" ); @@ -684,6 +720,9 @@ bool GEOMToolsGUI::Import() } // if ( needConvert ) } // if ( aCurrentType == "IGES" ) else if ( aCurrentType == "ACIS" ) { + */ + + if ( aCurrentType == "ACIS" ) { if ( acisAnswer != SUIT_MessageBox::YesToAll && acisAnswer != SUIT_MessageBox::NoToAll ) { SUIT_MessageBox::StandardButtons btns = SUIT_MessageBox::Yes | SUIT_MessageBox::No; if ( i < fileNames.count()-1 ) btns = btns | SUIT_MessageBox::YesToAll | SUIT_MessageBox::NoToAll; @@ -697,6 +736,7 @@ bool GEOMToolsGUI::Import() } // if ( acisAnswer != YesToAll && acisAnswer != NoToAll ) } // else if ( aCurrentType == "ACIS" ) + // IMPORT GEOM::GEOM_Object_var anObj = aInsOp->ImportFile( fileN, fileT ); if ( !anObj->_is_nil() && aInsOp->IsDone() ) { diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.h b/src/GEOMToolsGUI/GEOMToolsGUI.h index 4241124f6..8b6c32c78 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.h +++ b/src/GEOMToolsGUI/GEOMToolsGUI.h @@ -30,12 +30,16 @@ #include "GEOM_ToolsGUI.hxx" #include - #include class GEOM_Displayer; class SALOME_View; class SALOME_ListIO; +class SalomeApp_Study; +class SVTK_View; +class QColor; +class Handle_SALOME_InteractiveObject; +class Handle_AIS_InteractiveContext; #include @@ -54,6 +58,8 @@ public: enum ActionType { SHOWDLG, INCR, DECR }; + static void SetColor( const QString&, const QColor&, bool ); + private: // Import and export topology methods bool Import(); @@ -71,7 +77,7 @@ private: void OnNbIsos( ActionType actionType = SHOWDLG ); void OnDeflection(); void OnSelectOnly(int mode); - void OnShowHideChildren( bool ); + void OnDiscloseConcealChildren( bool ); void OnUnpublishObject(); void OnPublishObject() ; void OnPointMarker(); @@ -89,6 +95,18 @@ private: _PTR(Study), QList, GEOM_Displayer* ); + + static void setVtkColor( SalomeApp_Study* study, + int mgrId, + SVTK_View* view, + const Handle_SALOME_InteractiveObject& IO, + const QColor& color ); + + static void setOccColor( SalomeApp_Study* study, + int mgrId, + const Handle_AIS_InteractiveContext& ic, + const Handle_SALOME_InteractiveObject& IO, + const QColor& color ); }; #endif // GEOMTOOLSGUI_H diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx index 64983d176..c73767ca2 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx @@ -109,6 +109,13 @@ // VTK includes #include +// If the next macro is defined, autocolor feature works for all sub-shapes; +// if it is undefined, autocolor feature works for groups only +//#define GENERAL_AUTOCOLOR +// Below macro, when uncommented, switches on simplified (more performant) algorithm +// of auto-color picking up +//#define SIMPLE_AUTOCOLOR + void GEOMToolsGUI::OnCheckGeometry() { SalomeApp_Application* app = @@ -163,12 +170,18 @@ void GEOMToolsGUI::OnAutoColor() if( CORBA::is_nil( aChildObject ) ) continue; +#ifndef GENERAL_AUTOCOLOR // auto-color for groups only if( aChildObject->GetType() != GEOM_GROUP ) continue; +#endif // GENERAL_AUTOCOLOR +#ifdef SIMPLE_AUTOCOLOR // simplified algorithm for auto-colors + SALOMEDS::Color aColor = GEOM_Displayer::getPredefinedUniqueColor(); +#else // old algorithm for auto-colors SALOMEDS::Color aColor = GEOM_Displayer::getUniqueColor( aReservedColors ); - aChildObject->SetColor( aColor ); aReservedColors.append( aColor ); +#endif // SIMPLE_AUTOCOLOR + aChildObject->SetColor( aColor ); QColor c( (int)( aColor.R * 255.0 ), (int)( aColor.G * 255.0 ), (int)( aColor.B * 255.0 ) ); @@ -267,151 +280,246 @@ void GEOMToolsGUI::OnDisableAutoColor() return; aMainObject->SetAutoColor( false ); +} + +void GEOMToolsGUI::SetColor( const QString& entry, const QColor& color, bool updateViewer ) +{ + if ( entry.isEmpty() || !color.isValid() ) return; + + // get active application + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) return; + + // get current study + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + if ( !appStudy ) return; + + // get active view + SUIT_ViewWindow* window = app->desktop()->activeWindow(); + if ( !window ) return; + + bool isOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ); + bool isVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ); + + // get view id + int mgrId = window->getViewManager()->getGlobalId(); + + Handle(SALOME_InteractiveObject) IO = + new SALOME_InteractiveObject( entry.toLatin1().data(), "GEOM", ""); + if ( isVTK ) { + SVTK_ViewWindow* vtkVW = dynamic_cast( window ); + if ( !vtkVW ) return; + SVTK_View* aView = vtkVW->getView(); + + GEOMToolsGUI::setVtkColor( appStudy, mgrId, aView, IO, color ); + if ( updateViewer ) aView->Repaint(); + } + else if ( isOCC ) { + OCCViewer_Viewer* vm = dynamic_cast ( window->getViewManager()->getViewModel() ); + Handle (AIS_InteractiveContext) ic = vm->getAISContext(); + GEOMToolsGUI::setOccColor( appStudy, mgrId, ic, IO, color ); + if ( updateViewer ) ic->UpdateCurrentViewer(); + } + + // mark study as modified + GeometryGUI::Modified(); + + // update actions + app->updateActions(); //SRN: To update a Save button in the toolbar } void GEOMToolsGUI::OnColor() { - SALOME_ListIO selected; + // get active application SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) return; + + // get current study SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); - if ( app && appStudy ) { - LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); - if ( aSelMgr ) { - aSelMgr->selectedObjects( selected ); - if ( !selected.IsEmpty() ) { - SUIT_ViewWindow* window = app->desktop()->activeWindow(); - bool isOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ); - bool isVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ); - int mgrId = window->getViewManager()->getGlobalId(); - if ( isVTK ) { - SVTK_ViewWindow* vtkVW = dynamic_cast( window ); - if ( !vtkVW ) - return; - SVTK_View* aView = vtkVW->getView(); - QColor initcolor = aView->GetColor( selected.First() ); - QColor c = QColorDialog::getColor( initcolor, app->desktop() ); - if ( c.isValid() ) { - SUIT_OverrideCursor(); - for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { - QString matProp; - matProp = appStudy->getObjectProperty(mgrId,It.Value()->getEntry(), MATERIAL_PROP, matProp).toString(); - Material_Model material; - material.fromProperties( matProp ); - if ( !material.isPhysical() ) { - aView->SetColor( It.Value(), c ); - appStudy->setObjectProperty(mgrId,It.Value()->getEntry(),COLOR_PROP, c); - } - // store color to GEOM_Object - _PTR(Study) aStudy = appStudy->studyDS(); - _PTR(SObject) aSObject( aStudy->FindObjectID( It.Value()->getEntry() ) ); - GEOM::GEOM_Object_var anObject = - GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObject)); - SALOMEDS::Color aSColor; - aSColor.R = (double)c.red() / 255.0; - aSColor.G = (double)c.green() / 255.0; - aSColor.B = (double)c.blue() / 255.0; - anObject->SetColor( aSColor ); - anObject->SetAutoColor( false ); - } - GeometryGUI::Modified(); - } - } // if ( isVTK ) - else if ( isOCC ) { - Handle(AIS_InteractiveObject) io = GEOMBase::GetAIS( selected.First() ); - if ( !io.IsNull() ) { - Quantity_Color aColor; - io->Color( aColor ); - QColor ic = QColor((int )( aColor.Red() * 255.0 ), - (int)( aColor.Green() * 255.0 ), - (int)( aColor.Blue() * 255.0 )); - - QVariant v = appStudy->getObjectProperty(mgrId,selected.First()->getEntry(), COLOR_PROP, ic); - - QColor initcolor = v.value(); - QColor c = QColorDialog::getColor( initcolor, app->desktop() ); - if ( c.isValid() ) { - SUIT_OverrideCursor(); - aColor = Quantity_Color( c.red() / 255., c.green() / 255., c.blue() / 255., Quantity_TOC_RGB ); - OCCViewer_Viewer* vm = dynamic_cast ( window->getViewManager()->getViewModel() ); - Handle (AIS_InteractiveContext) ic = vm->getAISContext(); - for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { - QString matProp; - matProp = appStudy->getObjectProperty(mgrId,It.Value()->getEntry(), MATERIAL_PROP, matProp).toString(); - Material_Model material; - material.fromProperties( matProp ); - io = GEOMBase::GetAIS( It.Value(), true ); - if ( !io.IsNull() && !material.isPhysical() ) { // change color only for shapes with not physical type of material - - if ( io->IsKind( STANDARD_TYPE(AIS_Shape) ) ) { - TopoDS_Shape theShape = Handle(AIS_Shape)::DownCast( io )->Shape(); - bool onlyVertex = (theShape.ShapeType() == TopAbs_VERTEX || GEOM_Displayer::isCompoundOfVertices( theShape )); - if (onlyVertex) { - // Set color for a point - - Handle(AIS_Drawer) aCurDrawer = io->Attributes(); - Handle(Prs3d_PointAspect) aCurPointAspect = aCurDrawer->PointAspect(); - Quantity_Color aCurColor; - Standard_Real aCurScale; - Aspect_TypeOfMarker aCurTypeOfMarker; - aCurPointAspect->Aspect()->Values( aCurColor, aCurTypeOfMarker, aCurScale ); - if ( aCurTypeOfMarker != Aspect_TOM_USERDEFINED ) { - aCurDrawer->SetPointAspect(new Prs3d_PointAspect(aCurTypeOfMarker, aColor, aCurScale)); - } - else { - Standard_Integer aWidth, aHeight; - aCurPointAspect->GetTextureSize( aWidth, aHeight ); + if ( !appStudy ) return; -#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1 - Handle(TColStd_HArray1OfByte) aTexture = aCurPointAspect->GetTexture(); -#else - Handle(Graphic3d_HArray1OfBytes) aTexture = aCurPointAspect->GetTexture(); -#endif + // get selection manager + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + if ( !aSelMgr ) return; - aCurDrawer->SetPointAspect(new Prs3d_PointAspect(aColor, 1, aWidth, aHeight, aTexture)); - } - ic->SetLocalAttributes(io, aCurDrawer, Standard_False); - } - } - - io->SetColor( aColor ); - if ( io->IsKind( STANDARD_TYPE(GEOM_AISShape) ) ) { - Handle(GEOM_AISShape) aGAISShape = Handle(GEOM_AISShape)::DownCast( io ); - aGAISShape->SetShadingColor( aColor ); - aGAISShape->storeBoundaryColors(); - } - - appStudy->setObjectProperty(mgrId,It.Value()->getEntry(), COLOR_PROP, c); - - io->Redisplay( Standard_True ); - - // store color to GEOM_Object - _PTR(Study) aStudy = appStudy->studyDS(); - _PTR(SObject) aSObject( aStudy->FindObjectID( It.Value()->getEntry() ) ); - GEOM::GEOM_Object_var anObject = - GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObject)); - - - SALOMEDS::Color aSColor; - aSColor.R = (double)c.red() / 255.0; - aSColor.G = (double)c.green() / 255.0; - aSColor.B = (double)c.blue() / 255.0; - anObject->SetColor( aSColor ); - anObject->SetAutoColor( false ); - } - } // for - ic->UpdateCurrentViewer(); - GeometryGUI::Modified(); - } // if c.isValid() - } // first IO is not null - } // if ( isOCC ) - } // if ( selection not empty ) + // get selection + SALOME_ListIO selected; + aSelMgr->selectedObjects( selected ); + if ( selected.IsEmpty() ) return; + + // get active view + SUIT_ViewWindow* window = app->desktop()->activeWindow(); + bool isOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ); + bool isVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ); + + // get view id + int mgrId = window->getViewManager()->getGlobalId(); + + if ( isVTK ) { + SVTK_ViewWindow* vtkVW = dynamic_cast( window ); + if ( !vtkVW ) return; + + // get initial color (use first object from selection) + SVTK_View* aView = vtkVW->getView(); + QColor color = aView->GetColor( selected.First() ); + QVariant v = appStudy->getObjectProperty( mgrId, selected.First()->getEntry(), COLOR_PROP, color ); + + // show Choose Color dialog box + color = QColorDialog::getColor( v.value(), app->desktop() ); + if ( !color.isValid() ) return; + + // iterate through list of objects and assign new color + SUIT_OverrideCursor(); + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + GEOMToolsGUI::setVtkColor( appStudy, mgrId, aView, It.Value(), color ); + } + aView->Repaint(); + } + else if ( isOCC ) { + // find AIS interactive object (for first item in selection) + Handle(AIS_InteractiveObject) io = GEOMBase::GetAIS( selected.First() ); + if ( io.IsNull() ) return; + + // get initial color (use first object from selection) + Quantity_Color aColor; + io->Color( aColor ); + QColor color = QColor((int)( aColor.Red() * 255.0 ), + (int)( aColor.Green() * 255.0 ), + (int)( aColor.Blue() * 255.0 )); + QVariant v = appStudy->getObjectProperty( mgrId, selected.First()->getEntry(), COLOR_PROP, color ); + + // show Choose Color dialog box + color = QColorDialog::getColor( v.value(), app->desktop() ); + if ( !color.isValid() ) return; + + // iterate through list of objects and assign new color + SUIT_OverrideCursor(); + OCCViewer_Viewer* vm = dynamic_cast ( window->getViewManager()->getViewModel() ); + Handle (AIS_InteractiveContext) ic = vm->getAISContext(); + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + GEOMToolsGUI::setOccColor( appStudy, mgrId, ic, It.Value(), color ); } + ic->UpdateCurrentViewer(); } + // mark study as modified + GeometryGUI::Modified(); + + // update actions app->updateActions(); //SRN: To update a Save button in the toolbar } + +void GEOMToolsGUI::setVtkColor( SalomeApp_Study* study, // study + int mgrId, // view window id + SVTK_View* view, // VTK view + const Handle(SALOME_InteractiveObject)& IO, // interactive object + const QColor& color ) // color +{ + // get material property + QString matProp; + matProp = study->getObjectProperty( mgrId, IO->getEntry(), MATERIAL_PROP, matProp ).toString(); + Material_Model material; + material.fromProperties( matProp ); + + // change color only for shapes with not physical type of material + if ( !material.isPhysical() ) { + view->SetColor( IO, color ); + study->setObjectProperty( mgrId, IO->getEntry(), COLOR_PROP, color ); + } + + // store color to GEOM_Object + _PTR(Study) aStudy = study->studyDS(); + _PTR(SObject) aSObject( aStudy->FindObjectID( IO->getEntry() ) ); + if ( !aSObject ) return; + + GEOM::GEOM_Object_var anObject = + GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObject)); + + if ( CORBA::is_nil( anObject ) ) return; + + SALOMEDS::Color aSColor; + aSColor.R = (double)color.red() / 255.0; + aSColor.G = (double)color.green() / 255.0; + aSColor.B = (double)color.blue() / 255.0; + anObject->SetColor( aSColor ); + anObject->SetAutoColor( false ); +} + +void GEOMToolsGUI::setOccColor( SalomeApp_Study* study, // study + int mgrId, // view window id + const Handle(AIS_InteractiveContext)& ic, // OCC interactive context + const Handle(SALOME_InteractiveObject)& IO, // interactive object + const QColor& color ) // color +{ + // get AIS object + Handle(AIS_InteractiveObject) io = GEOMBase::GetAIS( IO, true ); + if ( io.IsNull() ) return; + + // get material property + QString matProp; + matProp = study->getObjectProperty( mgrId, IO->getEntry(), MATERIAL_PROP, matProp ).toString(); + Material_Model material; + material.fromProperties( matProp ); + + Quantity_Color aColor = Quantity_Color( color.red() / 255., color.green() / 255., color.blue() / 255., Quantity_TOC_RGB ); + + // change color only for shapes with not physical type of material + if ( !material.isPhysical() ) { + if ( io->IsKind( STANDARD_TYPE(AIS_Shape) ) ) { + TopoDS_Shape theShape = Handle(AIS_Shape)::DownCast( io )->Shape(); + bool onlyVertex = (theShape.ShapeType() == TopAbs_VERTEX || GEOM_Displayer::isCompoundOfVertices( theShape )); + if ( onlyVertex ) { + // set color for a point + Handle(AIS_Drawer) aCurDrawer = io->Attributes(); + Handle(Prs3d_PointAspect) aCurPointAspect = aCurDrawer->PointAspect(); + Quantity_Color aCurColor; + Standard_Real aCurScale; + Aspect_TypeOfMarker aCurTypeOfMarker; + aCurPointAspect->Aspect()->Values( aCurColor, aCurTypeOfMarker, aCurScale ); + if ( aCurTypeOfMarker != Aspect_TOM_USERDEFINED ) { + aCurDrawer->SetPointAspect( new Prs3d_PointAspect( aCurTypeOfMarker, aColor, aCurScale ) ); + } + else { + Standard_Integer aWidth, aHeight; + aCurPointAspect->GetTextureSize( aWidth, aHeight ); +#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1 + Handle(TColStd_HArray1OfByte) aTexture = aCurPointAspect->GetTexture(); +#else + Handle(Graphic3d_HArray1OfBytes) aTexture = aCurPointAspect->GetTexture(); +#endif + aCurDrawer->SetPointAspect( new Prs3d_PointAspect( aColor, 1, aWidth, aHeight, aTexture ) ); + } + ic->SetLocalAttributes( io, aCurDrawer, Standard_False ); + } + } + + io->SetColor( aColor ); + if ( io->IsKind( STANDARD_TYPE(GEOM_AISShape) ) ) { + Handle(GEOM_AISShape) aGAISShape = Handle(GEOM_AISShape)::DownCast( io ); + aGAISShape->SetShadingColor( aColor ); + aGAISShape->storeBoundaryColors(); + } + + io->Redisplay( Standard_True ); + + study->setObjectProperty( mgrId, IO->getEntry(), COLOR_PROP, color ); + } + + // store color to GEOM_Object + _PTR(Study) aStudy = study->studyDS(); + _PTR(SObject) aSObject( aStudy->FindObjectID( IO->getEntry() ) ); + GEOM::GEOM_Object_var anObject = + GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObject)); + SALOMEDS::Color aSColor; + aSColor.R = (double)color.red() / 255.0; + aSColor.G = (double)color.green() / 255.0; + aSColor.B = (double)color.blue() / 255.0; + anObject->SetColor( aSColor ); + anObject->SetAutoColor( false ); +} + void GEOMToolsGUI::OnTexture() { SALOME_ListIO selected; @@ -844,7 +952,7 @@ void GEOMToolsGUI::OnSelectOnly(int mode) } } -void GEOMToolsGUI::OnShowHideChildren( bool show ) +void GEOMToolsGUI::OnDiscloseConcealChildren( bool show ) { SALOME_ListIO selected; SalomeApp_Application* app = diff --git a/src/GEOM_I/GEOM_IBasicOperations_i.cc b/src/GEOM_I/GEOM_IBasicOperations_i.cc index 47979c7b0..b5d674b7f 100644 --- a/src/GEOM_I/GEOM_IBasicOperations_i.cc +++ b/src/GEOM_I/GEOM_IBasicOperations_i.cc @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -277,6 +276,29 @@ GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePointOnSurfaceByCoord return GetObject(anObject); } +//============================================================================= +/*! + * MakePointOnFace + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePointOnFace (GEOM::GEOM_Object_ptr theFace) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference face + Handle(GEOM_Object) aReference = GetObjectImpl(theFace); + if (aReference.IsNull()) return aGEOMObject._retn(); + + //Create the point + Handle(GEOM_Object) anObject = GetOperations()->MakePointOnFace(aReference); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} //============================================================================= /*! diff --git a/src/GEOM_I/GEOM_IBasicOperations_i.hh b/src/GEOM_I/GEOM_IBasicOperations_i.hh index 841a08221..7861a06bc 100644 --- a/src/GEOM_I/GEOM_IBasicOperations_i.hh +++ b/src/GEOM_I/GEOM_IBasicOperations_i.hh @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOM_IBasicOperations_i_HeaderFile #define _GEOM_IBasicOperations_i_HeaderFile @@ -73,6 +72,8 @@ class GEOM_I_EXPORT GEOM_IBasicOperations_i : CORBA::Double theYParameter, CORBA::Double theZParameter); + GEOM::GEOM_Object_ptr MakePointOnFace (GEOM::GEOM_Object_ptr theFace); + GEOM::GEOM_Object_ptr MakePointOnLinesIntersection (GEOM::GEOM_Object_ptr theLine1, GEOM::GEOM_Object_ptr theLine2); diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.cc b/src/GEOM_I/GEOM_IBlocksOperations_i.cc index 0c1917d46..c71432528 100644 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.cc +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.cc @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -742,6 +741,39 @@ char* GEOM_IBlocksOperations_i::PrintBCErrors return CORBA::string_dup(aDescr.ToCString()); } +//============================================================================= +/*! + * GetNonBlocks + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetNonBlocks + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_out theNonQuads) +{ + GEOM::GEOM_Object_var aGEOMObject; + GEOM::GEOM_Object_var aNonQuads; + + theNonQuads = aNonQuads._retn(); + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference Objects + Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + if (aShape.IsNull()) return aGEOMObject._retn(); + + //Get the result + Handle(GEOM_Object) aFaces; + Handle(GEOM_Object) anObject = GetOperations()->GetNonBlocks(aShape, aFaces); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + if (!aFaces.IsNull()) + theNonQuads = GetObject(aFaces); + + return GetObject(anObject); +} + //============================================================================= /*! * RemoveExtraEdges diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.hh b/src/GEOM_I/GEOM_IBlocksOperations_i.hh index a801a1e7e..6f5765092 100644 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.hh +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.hh @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOM_IBlocksOperations_i_HeaderFile #define _GEOM_IBlocksOperations_i_HeaderFile @@ -121,6 +120,9 @@ class GEOM_I_EXPORT GEOM_IBlocksOperations_i : char* PrintBCErrors (GEOM::GEOM_Object_ptr theCompound, const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors); + GEOM::GEOM_Object_ptr GetNonBlocks (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_out theNonQuads); + GEOM::GEOM_Object_ptr RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape, CORBA::Long theOptimumNbFaces); diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.cc b/src/GEOM_I/GEOM_ICurvesOperations_i.cc index b5109c9bb..3f1a67800 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.cc +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.cc @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -433,13 +432,15 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineInterpolation * MakeCurveParametric */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric(const char* thexExpr, const char* theyExpr, const char* thezExpr, - double theParamMin, double theParamMax, double theParamStep, - GEOM::curve_type theCurveType) { +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric + (const char* thexExpr, const char* theyExpr, const char* thezExpr, + double theParamMin, double theParamMax, double theParamStep, + GEOM::curve_type theCurveType) +{ GEOM::GEOM_Object_var aGEOMObject; //Set a not done flag GetOperations()->SetNotDone(); - + GEOMImpl_ICurvesOperations::CurveType aType; switch(theCurveType) { case GEOM::Polyline: @@ -453,18 +454,17 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric(const char* break; default: break; - } - + } // Make Polyline Handle(GEOM_Object) anObject = - GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr, - theParamMin, theParamMax, - theParamStep, aType); - + GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr, + theParamMin, theParamMax, + theParamStep, aType); + if (!GetOperations()->IsDone() || anObject.IsNull()) - return aGEOMObject._retn(); - + return aGEOMObject._retn(); + return GetObject(anObject); } @@ -473,13 +473,15 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric(const char* * MakeCurveParametricNew */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametricNew(const char* thexExpr, const char* theyExpr, const char* thezExpr, - double theParamMin, double theParamMax, CORBA::Long theParamNbStep, - GEOM::curve_type theCurveType) { +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametricNew + (const char* thexExpr, const char* theyExpr, const char* thezExpr, + double theParamMin, double theParamMax, CORBA::Long theParamNbStep, + GEOM::curve_type theCurveType) +{ GEOM::GEOM_Object_var aGEOMObject; //Set a not done flag GetOperations()->SetNotDone(); - + GEOMImpl_ICurvesOperations::CurveType aType; switch(theCurveType) { case GEOM::Polyline: @@ -493,18 +495,17 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametricNew(const cha break; default: break; - } - + } // Make Polyline Handle(GEOM_Object) anObject = - GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr, - theParamMin, theParamMax, + GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr, + theParamMin, theParamMax, 0.0, aType, theParamNbStep, true); - + if (!GetOperations()->IsDone() || anObject.IsNull()) - return aGEOMObject._retn(); - + return aGEOMObject._retn(); + return GetObject(anObject); } @@ -536,24 +537,20 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcher //============================================================================= /*! - * Make3DSketcher + * MakeSketcherOnPlane */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::Make3DSketcher - (const GEOM::ListOfDouble& theCoordinates) +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcherOnPlane + (const char* theCommand, GEOM::GEOM_Object_ptr theWorkingPlane) { //Set a not done flag GetOperations()->SetNotDone(); - int ind = 0; - int aLen = theCoordinates.length(); - std::list aCoords; - for (; ind < aLen; ind++) - aCoords.push_back(theCoordinates[ind]); + Handle(GEOM_Object) aWorkingPlane = GetObjectImpl(theWorkingPlane); // Make Sketcher Handle(GEOM_Object) anObject = - GetOperations()->Make3DSketcher(aCoords); + GetOperations()->MakeSketcherOnPlane(theCommand, aWorkingPlane); if (!GetOperations()->IsDone() || anObject.IsNull()) return GEOM::GEOM_Object::_nil(); @@ -562,20 +559,42 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::Make3DSketcher //============================================================================= /*! - * MakeSketcherOnPlane + * Make3DSketcherCommand */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcherOnPlane - (const char* theCommand, GEOM::GEOM_Object_ptr theWorkingPlane) +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::Make3DSketcherCommand (const char* theCommand) { //Set a not done flag GetOperations()->SetNotDone(); - Handle(GEOM_Object) aWorkingPlane = GetObjectImpl(theWorkingPlane); + // Make 3D Sketcher + Handle(GEOM_Object) anObject = GetOperations()->Make3DSketcherCommand(theCommand); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return GEOM::GEOM_Object::_nil(); + + 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(); + std::list aCoords; + for (; ind < aLen; ind++) + aCoords.push_back(theCoordinates[ind]); // Make Sketcher Handle(GEOM_Object) anObject = - GetOperations()->MakeSketcherOnPlane(theCommand, aWorkingPlane); + GetOperations()->Make3DSketcher(aCoords); if (!GetOperations()->IsDone() || anObject.IsNull()) return GEOM::GEOM_Object::_nil(); diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.hh b/src/GEOM_I/GEOM_ICurvesOperations_i.hh index 5fc09cc55..e50ab2111 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.hh +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.hh @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOM_ICurvesOperations_i_HeaderFile #define _GEOM_ICurvesOperations_i_HeaderFile @@ -33,49 +32,49 @@ #include "GEOMImpl_ICurvesOperations.hxx" -class GEOM_I_EXPORT GEOM_ICurvesOperations_i : +class GEOM_I_EXPORT GEOM_ICurvesOperations_i : public virtual POA_GEOM::GEOM_ICurvesOperations, public virtual GEOM_IOperations_i { public: GEOM_ICurvesOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, - ::GEOMImpl_ICurvesOperations* theImpl); + ::GEOMImpl_ICurvesOperations* theImpl); ~GEOM_ICurvesOperations_i(); GEOM::GEOM_Object_ptr MakeCirclePntVecR (GEOM::GEOM_Object_ptr theCenter, - GEOM::GEOM_Object_ptr theVector, - double theR); + GEOM::GEOM_Object_ptr theVector, + double theR); GEOM::GEOM_Object_ptr MakeCircleThreePnt (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2, - GEOM::GEOM_Object_ptr thePnt3); + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); GEOM::GEOM_Object_ptr MakeCircleCenter2Pnt (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2, - GEOM::GEOM_Object_ptr thePnt3); + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); GEOM::GEOM_Object_ptr MakeEllipse (GEOM::GEOM_Object_ptr theCenter, - GEOM::GEOM_Object_ptr theVector, - double theRMajor, double theRMinor); + GEOM::GEOM_Object_ptr theVector, + double theRMajor, double theRMinor); GEOM::GEOM_Object_ptr MakeEllipseVec (GEOM::GEOM_Object_ptr theCenter, - GEOM::GEOM_Object_ptr theVector, - double theRMajor, double theRMinor, - GEOM::GEOM_Object_ptr theVectorMajor); + GEOM::GEOM_Object_ptr theVector, + double theRMajor, double theRMinor, + GEOM::GEOM_Object_ptr theVectorMajor); GEOM::GEOM_Object_ptr MakeArc (GEOM::GEOM_Object_ptr thePnt1, - GEOM::GEOM_Object_ptr thePnt2, - GEOM::GEOM_Object_ptr thePnt3); - + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); + GEOM::GEOM_Object_ptr MakeArcCenter (GEOM::GEOM_Object_ptr thePnt1, 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 thePnt2, + GEOM::GEOM_Object_ptr thePnt3); + GEOM::GEOM_Object_ptr MakePolyline (const GEOM::ListOfGO& thePoints, CORBA::Boolean theIsClosed); @@ -86,20 +85,24 @@ class GEOM_I_EXPORT GEOM_ICurvesOperations_i : CORBA::Boolean theIsClosed, CORBA::Boolean theDoReordering); - GEOM::GEOM_Object_ptr MakeCurveParametric(const char* thexExpr, const char* theyExpr, const char* thezExpr, - double theParamMin, double theParamMax, double theParamStep, - GEOM::curve_type theCurveType); - - GEOM::GEOM_Object_ptr MakeCurveParametricNew(const char* thexExpr, const char* theyExpr, const char* thezExpr, - double theParamMin, double theParamMax, CORBA::Long theParamNbStep, - GEOM::curve_type theCurveType); + GEOM::GEOM_Object_ptr MakeCurveParametric + (const char* thexExpr, const char* theyExpr, const char* thezExpr, + double theParamMin, double theParamMax, double theParamStep, + GEOM::curve_type theCurveType); + + GEOM::GEOM_Object_ptr MakeCurveParametricNew + (const char* thexExpr, const char* theyExpr, const char* thezExpr, + double theParamMin, double theParamMax, CORBA::Long theParamNbStep, + GEOM::curve_type theCurveType); 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); + GEOM::GEOM_Object_ptr Make3DSketcherCommand (const char* theCommand); + + GEOM::GEOM_Object_ptr Make3DSketcher (const GEOM::ListOfDouble& theCoordinates); + ::GEOMImpl_ICurvesOperations* GetOperations() { return (::GEOMImpl_ICurvesOperations*)GetImpl(); } }; diff --git a/src/GEOM_I/GEOM_IGroupOperations_i.cc b/src/GEOM_I/GEOM_IGroupOperations_i.cc index 3a8cef597..60a26e129 100644 --- a/src/GEOM_I/GEOM_IGroupOperations_i.cc +++ b/src/GEOM_I/GEOM_IGroupOperations_i.cc @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include @@ -202,7 +201,6 @@ void GEOM_IGroupOperations_i::UnionIDs (GEOM::GEOM_Object_ptr theGroup, //Perform the operation GetOperations()->UnionIDs(aGroupRef, aSubShapes); - return; } //============================================================================= @@ -230,7 +228,176 @@ void GEOM_IGroupOperations_i::DifferenceIDs (GEOM::GEOM_Object_ptr theGroup, //Perform the operation GetOperations()->DifferenceIDs(aGroupRef, aSubShapes); - return; +} + +//============================================================================= +/*! + * UnionGroups + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IGroupOperations_i::UnionGroups (GEOM::GEOM_Object_ptr theGroup1, + GEOM::GEOM_Object_ptr theGroup2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference groups + Handle(GEOM_Object) aGroupRef1 = GetObjectImpl(theGroup1); + Handle(GEOM_Object) aGroupRef2 = GetObjectImpl(theGroup2); + if (aGroupRef1.IsNull() || aGroupRef2.IsNull()) return aGEOMObject._retn(); + + //Perform the operation + Handle(GEOM_Object) anObject = GetOperations()->UnionGroups(aGroupRef1, aGroupRef2); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * IntersectGroups + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IGroupOperations_i::IntersectGroups (GEOM::GEOM_Object_ptr theGroup1, + GEOM::GEOM_Object_ptr theGroup2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference groups + Handle(GEOM_Object) aGroupRef1 = GetObjectImpl(theGroup1); + Handle(GEOM_Object) aGroupRef2 = GetObjectImpl(theGroup2); + if (aGroupRef1.IsNull() || aGroupRef2.IsNull()) return aGEOMObject._retn(); + + //Perform the operation + Handle(GEOM_Object) anObject = GetOperations()->IntersectGroups(aGroupRef1, aGroupRef2); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * CutGroups + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IGroupOperations_i::CutGroups (GEOM::GEOM_Object_ptr theGroup1, + GEOM::GEOM_Object_ptr theGroup2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference groups + Handle(GEOM_Object) aGroupRef1 = GetObjectImpl(theGroup1); + Handle(GEOM_Object) aGroupRef2 = GetObjectImpl(theGroup2); + if (aGroupRef1.IsNull() || aGroupRef2.IsNull()) return aGEOMObject._retn(); + + //Perform the operation + Handle(GEOM_Object) anObject = GetOperations()->CutGroups(aGroupRef1, aGroupRef2); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * UnionListOfGroups + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IGroupOperations_i::UnionListOfGroups (const GEOM::ListOfGO& theGList) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference groups + Handle(TColStd_HSequenceOfTransient) aGroups = new TColStd_HSequenceOfTransient; + + int ind, aLen = theGList.length(); + for (ind = 0; ind < aLen; ind++) { + Handle(GEOM_Object) aGr = GetObjectImpl(theGList[ind]); + if (aGr.IsNull()) return aGEOMObject._retn(); + aGroups->Append(aGr); + } + + //Perform the operation + Handle(GEOM_Object) anObject = GetOperations()->UnionListOfGroups(aGroups); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * IntersectListOfGroups + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IGroupOperations_i::IntersectListOfGroups (const GEOM::ListOfGO& theGList) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference groups + Handle(TColStd_HSequenceOfTransient) aGroups = new TColStd_HSequenceOfTransient; + + int ind, aLen = theGList.length(); + for (ind = 0; ind < aLen; ind++) { + Handle(GEOM_Object) aGr = GetObjectImpl(theGList[ind]); + if (aGr.IsNull()) return aGEOMObject._retn(); + aGroups->Append(aGr); + } + + //Perform the operation + Handle(GEOM_Object) anObject = GetOperations()->IntersectListOfGroups(aGroups); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * CutListOfGroups + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IGroupOperations_i::CutListOfGroups (const GEOM::ListOfGO& theGList1, + const GEOM::ListOfGO& theGList2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference groups + Handle(TColStd_HSequenceOfTransient) aGroups1 = new TColStd_HSequenceOfTransient; + Handle(TColStd_HSequenceOfTransient) aGroups2 = new TColStd_HSequenceOfTransient; + + int ind, aLen = theGList1.length(); + for (ind = 0; ind < aLen; ind++) { + Handle(GEOM_Object) aGr = GetObjectImpl(theGList1[ind]); + if (aGr.IsNull()) return aGEOMObject._retn(); + aGroups1->Append(aGr); + } + aLen = theGList2.length(); + for (ind = 0; ind < aLen; ind++) { + Handle(GEOM_Object) aGr = GetObjectImpl(theGList2[ind]); + if (aGr.IsNull()) return aGEOMObject._retn(); + aGroups2->Append(aGr); + } + + //Perform the operation + Handle(GEOM_Object) anObject = GetOperations()->CutListOfGroups(aGroups1, aGroups2); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); } //============================================================================= diff --git a/src/GEOM_I/GEOM_IGroupOperations_i.hh b/src/GEOM_I/GEOM_IGroupOperations_i.hh index b3871e0fe..f213e8be2 100644 --- a/src/GEOM_I/GEOM_IGroupOperations_i.hh +++ b/src/GEOM_I/GEOM_IGroupOperations_i.hh @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOM_IGroupOperations_i_HeaderFile #define _GEOM_IGroupOperations_i_HeaderFile @@ -33,17 +32,17 @@ #include "GEOMImpl_IGroupOperations.hxx" -class GEOM_I_EXPORT GEOM_IGroupOperations_i : +class GEOM_I_EXPORT GEOM_IGroupOperations_i : public virtual POA_GEOM::GEOM_IGroupOperations, public virtual GEOM_IOperations_i { public: GEOM_IGroupOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, - ::GEOMImpl_IGroupOperations* theImpl); + ::GEOMImpl_IGroupOperations* theImpl); ~GEOM_IGroupOperations_i(); - GEOM::GEOM_Object_ptr CreateGroup (GEOM::GEOM_Object_ptr theMainShape, CORBA::Long theShapeType); - + GEOM::GEOM_Object_ptr CreateGroup (GEOM::GEOM_Object_ptr theMainShape, CORBA::Long theShapeType); + void AddObject (GEOM::GEOM_Object_ptr theGroup, CORBA::Long theSubShapeId); void RemoveObject (GEOM::GEOM_Object_ptr theGroup, CORBA::Long theSubShapeId); @@ -56,8 +55,16 @@ class GEOM_I_EXPORT GEOM_IGroupOperations_i : void DifferenceIDs (GEOM::GEOM_Object_ptr theGroup, const GEOM::ListOfLong& theSubShapes); + GEOM::GEOM_Object_ptr UnionGroups (GEOM::GEOM_Object_ptr theGroup1, GEOM::GEOM_Object_ptr theGroup2); + GEOM::GEOM_Object_ptr IntersectGroups (GEOM::GEOM_Object_ptr theGroup1, GEOM::GEOM_Object_ptr theGroup2); + GEOM::GEOM_Object_ptr CutGroups (GEOM::GEOM_Object_ptr theGroup1, GEOM::GEOM_Object_ptr theGroup2); + + GEOM::GEOM_Object_ptr UnionListOfGroups (const GEOM::ListOfGO& theGList); + GEOM::GEOM_Object_ptr IntersectListOfGroups (const GEOM::ListOfGO& theGList); + GEOM::GEOM_Object_ptr CutListOfGroups (const GEOM::ListOfGO& theGList1, const GEOM::ListOfGO& theGList2); + CORBA::Long GetType (GEOM::GEOM_Object_ptr theGroup); - + GEOM::GEOM_Object_ptr GetMainShape (GEOM::GEOM_Object_ptr theGroup); GEOM::ListOfLong* GetObjects (GEOM::GEOM_Object_ptr theGroup); diff --git a/src/GEOM_I/GEOM_IInsertOperations_i.cc b/src/GEOM_I/GEOM_IInsertOperations_i.cc index e27a6876b..57a20c3b3 100644 --- a/src/GEOM_I/GEOM_IInsertOperations_i.cc +++ b/src/GEOM_I/GEOM_IInsertOperations_i.cc @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifdef WNT #pragma warning( disable:4786 ) @@ -47,7 +46,7 @@ //============================================================================= /*! - * constructor: + * constructor */ //============================================================================= GEOM_IInsertOperations_i::GEOM_IInsertOperations_i (PortableServer::POA_ptr thePOA, @@ -155,6 +154,32 @@ GEOM::GEOM_Object_ptr GEOM_IInsertOperations_i::ImportFile return GetObject(anObject); } +//============================================================================= +/*! + * ReadValue + */ +//============================================================================= +char* GEOM_IInsertOperations_i::ReadValue(const char* theFileName, + const char* theFormatName, + const char* theParameterName) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + char* aFileName = strdup(theFileName); + char* aFormatName = strdup(theFormatName); + char* aParameterName = strdup(theParameterName); + + TCollection_AsciiString aUnits = GetOperations()->ReadValue + (aFileName, aFormatName, aParameterName); + + free(aFileName); + free(aFormatName); + free(aParameterName); + + return CORBA::string_dup(aUnits.ToCString()); +} + //============================================================================= /*! * ImportTranslators @@ -225,12 +250,47 @@ void GEOM_IInsertOperations_i::ExportTranslators thePatterns = aPatternsArray._retn(); } +//============================================================================= +/*! + * RestoreShape + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IInsertOperations_i::RestoreShape (const SALOMEDS::TMPFile& theStream) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theStream.length() < 1) + return aGEOMObject._retn(); + + char* buf = (char*)theStream.NP_data(); + std::istringstream aStream (buf); + + Handle(GEOM_Object) anObject = GetOperations()->RestoreShape(aStream); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * LoadTexture + */ +//============================================================================= CORBA::Long GEOM_IInsertOperations_i::LoadTexture(const char* theTextureFile) { GetOperations()->SetNotDone(); return GetOperations()->LoadTexture( theTextureFile ); } +//============================================================================= +/*! + * AddTexture + */ +//============================================================================= CORBA::Long GEOM_IInsertOperations_i::AddTexture(CORBA::Long theWidth, CORBA::Long theHeight, const SALOMEDS::TMPFile& theTexture) { @@ -255,6 +315,11 @@ CORBA::Long GEOM_IInsertOperations_i::AddTexture(CORBA::Long theWidth, CORBA::Lo return GetOperations()->AddTexture( theWidth, theHeight, aTexture ); } +//============================================================================= +/*! + * GetTexture + */ +//============================================================================= SALOMEDS::TMPFile* GEOM_IInsertOperations_i::GetTexture(CORBA::Long theID, CORBA::Long& theWidth, CORBA::Long& theHeight) @@ -278,6 +343,11 @@ SALOMEDS::TMPFile* GEOM_IInsertOperations_i::GetTexture(CORBA::Long theID, return aTexture._retn(); } +//============================================================================= +/*! + * GetAllTextures + */ +//============================================================================= GEOM::ListOfLong* GEOM_IInsertOperations_i::GetAllTextures() { std::list localIDs = GetOperations()->GetAllTextures(); diff --git a/src/GEOM_I/GEOM_IInsertOperations_i.hh b/src/GEOM_I/GEOM_IInsertOperations_i.hh index a7f8cf1dd..97ca19c70 100644 --- a/src/GEOM_I/GEOM_IInsertOperations_i.hh +++ b/src/GEOM_I/GEOM_IInsertOperations_i.hh @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOM_IInsertOperations_i_HeaderFile #define _GEOM_IInsertOperations_i_HeaderFile @@ -52,12 +51,18 @@ class GEOM_I_EXPORT GEOM_IInsertOperations_i : GEOM::GEOM_Object_ptr ImportFile (const char* theFileName, const char* theFormatName); + char* ReadValue (const char* theFileName, + const char* theFormatName, + const char* theParameterName); + void ImportTranslators (GEOM::string_array_out theFormats, GEOM::string_array_out thePatterns); void ExportTranslators (GEOM::string_array_out theFormats, GEOM::string_array_out thePatterns); + GEOM::GEOM_Object_ptr RestoreShape (const SALOMEDS::TMPFile& theStream); + CORBA::Long LoadTexture(const char* theTextureFile); CORBA::Long AddTexture(CORBA::Long theWidth, CORBA::Long theHeight, const SALOMEDS::TMPFile& theTexture); diff --git a/src/GEOM_SWIG/GEOM_Spanner.py b/src/GEOM_SWIG/GEOM_Spanner.py index 05c23aed6..7c17db76a 100644 --- a/src/GEOM_SWIG/GEOM_Spanner.py +++ b/src/GEOM_SWIG/GEOM_Spanner.py @@ -20,18 +20,17 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # - # GEOM GEOM_SWIG : binding of C++ implementaion with Python # File : GEOM_Spanner.py # Author : Julia DOROVSKIKH # Module : GEOM -# $Header$ +# # ! Please, if you edit this example file, update also # ! GEOM_SRC/doc/salome/gui/GEOM/input/tui_test_spanner.doc # ! as some sequences of symbols from this example are used during # ! documentation generation to identify certain places of this file -############# MakeSpanner ############# # +############# MakeSpanner ############# def MakeSpanner (geompy, math, isBlocksTest = 0, isMeshTest = 0, smesh = None): ### Variables ### @@ -304,6 +303,11 @@ def MakeSpanner (geompy, math, isBlocksTest = 0, isMeshTest = 0, smesh = None): isCompOfBlocks6 = BlocksOp.CheckCompoundOfBlocks(Spanner) if isCompOfBlocks6 == 0: print "Spanner is not a compound of hexahedral solids" + (NonBlocks, NonQuads) = geompy.GetNonBlocks(Spanner) + if NonBlocks is not None: + geompy.addToStudyInFather(Spanner, NonBlocks, "Group of non-hexahedral solids") + if NonQuads is not None: + geompy.addToStudyInFather(Spanner, NonQuads, "Group of non-quadrangular faces") else: print "Spanner is a compound of hexahedral solids" diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index 3e7c14dc2..b74b80816 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -19,7 +19,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -# # GEOM GEOM_SWIG : binding of C++ omplementaion with Python # File : GEOM_usinggeom.py @@ -105,8 +104,18 @@ def TestAll (geompy, math): Interpol = geompy.MakeInterpol([px, py, p200, pxyz], True) #(List of GEOM_Object,Boolean)->GEOM_Object 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 - Sketcher3d = geompy.Make3DSketcher([0,0,0, 50,50,50, 0,50,50, 10,0,0]) - + + #Create 3D wires with 3D Sketcher + sk = geompy.Sketcher3D() + sk.addPointsAbsolute(0,0,0, 70,0,0) + sk.addPointsRelative(0, 0, 130) + sk.addPointAnglesLength("OXY", 50, 0, 100) + sk.addPointAnglesLength("OXZ", 30, 80, 130) + sk.close() + Sketcher3d_1 = sk.wire() + + Sketcher3d_2 = geompy.Make3DSketcher([0,0,0, 50,50,50, 0,50,50, 10,0,0]) + #Create local coordinate system from shape cs4 = geompy.MakeMarkerFromShape(Plane) @@ -183,6 +192,7 @@ def TestAll (geompy, math): #Test point on surface creation p_on_face = geompy.MakeVertexOnSurface(Face, 0.1, 0.8) #(GEOM_Object, Double, Double)->GEOM_Object p_on_face2 = geompy.MakeVertexOnSurfaceByCoord(Face, 0., 0., 0.) #(GEOM_Object, Double, Double, Double)->GEOM_Object + p_on_face3 = geompy.MakeVertexInsideFace(Face) #(GEOM_Object)->GEOM_Object # Test plane from existing face creation Plane2 = geompy.MakePlaneFace(Face, trimsize) #(GEOM_Object, Double)->GEOM_Object @@ -330,7 +340,9 @@ 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_Sketcher3d_1 = geompy.addToStudy(Sketcher3d_1, "Sketcher 3D by interface") + id_Sketcher3d_2 = geompy.addToStudy(Sketcher3d_2, "Sketcher 3D by list") id_p_on_arc = geompy.addToStudy(p_on_arc, "Vertex on Arc (0.25)") id_p_on_arc2 = geompy.addToStudy(p_on_arc2, "Vertex on Arc at(100, -10, 10)" ) @@ -374,6 +386,7 @@ def TestAll (geompy, math): id_p_on_face = geompy.addToStudy(p_on_face, "Vertex on Face (0.1, 0.8)") id_p_on_face2 = geompy.addToStudy(p_on_face2, "Vertex on Face at(0., 0., 0.)") + id_p_on_face3 = geompy.addToStudy(p_on_face3, "Vertex inside Face") id_Prism1 = geompy.addToStudy(Prism1, "Prism by Two Pnt") id_Shell1 = geompy.addToStudy(Shell1, "Shell from Prism1 faces") diff --git a/src/GEOM_SWIG/GEOM_TestOthers.py b/src/GEOM_SWIG/GEOM_TestOthers.py index 8e65788e2..4db5841a0 100644 --- a/src/GEOM_SWIG/GEOM_TestOthers.py +++ b/src/GEOM_SWIG/GEOM_TestOthers.py @@ -95,6 +95,11 @@ def TestExportImport (geompy, shape): os.remove(fileExportImportIGES) os.remove(fileExportImportSTEP) + # Test RestoreShape from binary BRep stream + aStream = shape.GetShapeStream() + aNewShape = geompy.RestoreShape(aStream) + geompy.addToStudy(aNewShape, "aNewShape") + print "OK" @@ -144,6 +149,7 @@ def TestOtherOperations (geompy, math): # OrientationChange Box = geompy.MakeBoxDXDYDZ(200, 200, 200) + geompy.addToStudy(Box, "Box") Orientation = geompy.OrientationChange(Box) id_Orientation = geompy.addToStudy(Orientation, "OrientationChange") @@ -243,6 +249,11 @@ def TestOtherOperations (geompy, math): IsValid = geompy.CheckCompoundOfBlocks(Compound1) if IsValid == 0: print "The Blocks Compound is NOT VALID" + (NonBlocks, NonQuads) = geompy.GetNonBlocks(Compound1) + if NonBlocks is not None: + geompy.addToStudyInFather(Compound1, NonBlocks, "Group of non-hexahedral solids") + if NonQuads is not None: + geompy.addToStudyInFather(Compound1, NonQuads, "Group of non-quadrangular faces") else: print "The Blocks Compound is VALID" @@ -311,6 +322,42 @@ def TestOtherOperations (geompy, math): for ObjectID in GetObjectIDs: print " ", ObjectID + # Boolean Operations on Groups (Union, Intersection, Cut) + Group_1 = geompy.CreateGroup(Box, geompy.ShapeType["FACE"]) + geompy.UnionIDs(Group_1, [13, 23]) + Group_2 = geompy.CreateGroup(Box, geompy.ShapeType["FACE"]) + geompy.UnionIDs(Group_2, [3, 27]) + Group_3 = geompy.CreateGroup(Box, geompy.ShapeType["FACE"]) + geompy.UnionIDs(Group_3, [33, 23]) + Group_4 = geompy.CreateGroup(Box, geompy.ShapeType["FACE"]) + geompy.UnionIDs(Group_4, [31, 27]) + + geompy.addToStudyInFather(Box, Group_1, 'Group_1') + geompy.addToStudyInFather(Box, Group_2, 'Group_2') + geompy.addToStudyInFather(Box, Group_3, 'Group_3') + geompy.addToStudyInFather(Box, Group_4, 'Group_4') + + # union groups + Group_U_1_2 = geompy.UnionGroups(Group_1, Group_2) + Group_UL_3_4 = geompy.UnionListOfGroups([Group_3, Group_4]) + + geompy.addToStudyInFather(Box, Group_U_1_2, 'Group_U_1_2') + geompy.addToStudyInFather(Box, Group_UL_3_4, 'Group_UL_3_4') + + # intersect groups + Group_I_1_3 = geompy.IntersectGroups(Group_1, Group_3) + Group_IL_1_3 = geompy.IntersectListOfGroups([Group_1, Group_3]) + + geompy.addToStudyInFather(Box, Group_I_1_3, 'Group_I_1_3') + geompy.addToStudyInFather(Box, Group_IL_1_3, 'Group_IL_1_3') + + # cut groups + Group_C_2_4 = geompy.CutGroups(Group_2, Group_4) + Group_CL_2_4 = geompy.CutListOfGroups([Group_2], [Group_4]) + + geompy.addToStudyInFather(Box, Group_C_2_4, 'Group_C_2_4') + geompy.addToStudyInFather(Box, Group_CL_2_4, 'Group_CL_2_4') + # ----------------------------------------------------------------------------- # enumeration ShapeTypeString as a dictionary # ----------------------------------------------------------------------------- diff --git a/src/GEOM_SWIG/Makefile.am b/src/GEOM_SWIG/Makefile.am index 3fe82e1a4..c9742d239 100644 --- a/src/GEOM_SWIG/Makefile.am +++ b/src/GEOM_SWIG/Makefile.am @@ -35,6 +35,7 @@ include $(top_srcdir)/adm_local/unix/make_common_starter.am dist_salomescript_DATA = \ geompy.py \ geompyDC.py \ + gsketcher.py \ batchmode_geompy.py \ GEOM_Spanner.py \ GEOM_blocks.py \ diff --git a/src/GEOM_SWIG/geompy.py b/src/GEOM_SWIG/geompy.py index 13df41063..f715dc8a4 100644 --- a/src/GEOM_SWIG/geompy.py +++ b/src/GEOM_SWIG/geompy.py @@ -31,13 +31,22 @@ import salome import geompyDC from salome import * -geom = lcc.FindOrLoadComponent("FactoryServer", "GEOM") -geom.init_geom(salome.myStudy) - -# Export the methods of geompyDC -for k in dir(geom): - if k[0] == '_':continue - globals()[k]=getattr(geom,k) -del k -from geompyDC import ShapeType, GEOM, kind, info, PackData, ReadTexture, EnumToLong +# retrieve GEOM engine in try/except block +# to avoid problems in some cases, e.g. when generating documentation +try: + # get GEOM engine + geom = lcc.FindOrLoadComponent( "FactoryServer", "GEOM" ) + # initialize GEOM with current study + geom.init_geom( salome.myStudy ) + # export the methods of geompyDC + for k in dir( geom ): + if k[0] == '_': continue + globals()[k] = getattr( geom, k ) + pass + del k + from geompyDC import ShapeType, GEOM, kind, info, PackData, ReadTexture, EnumToLong + pass +except: + geom = None + pass diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index ca34d8893..0dd628e5a 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -73,9 +73,14 @@ ## @} -import salome -salome.salome_init() -from salome import * +# initialize SALOME session in try/except block +# to avoid problems in some cases, e.g. when generating documentation +try: + import salome + salome.salome_init() + from salome import * +except: + pass from salome_notebook import * @@ -83,6 +88,8 @@ import GEOM import math import os +from gsketcher import Sketcher3D + ## Enumeration ShapeType as a dictionary. \n ## Topological types of shapes (like Open Cascade types). See GEOM::shape_type for details. # @ingroup l1_geompy_auxiliary @@ -481,6 +488,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): # Example: see GEOM_TestAll.py try: aSObject = self.AddInStudy(self.myStudy, aShape, aName, None) + if aSObject and aName: aSObject.SetAttrString("AttributeName", aName) if doRestoreSubShapes: self.RestoreSubShapesSO(self.myStudy, aSObject, theArgs, theFindMethod, theInheritFirstArg, True ) @@ -511,6 +519,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): # Example: see GEOM_TestAll.py try: aSObject = self.AddInStudy(self.myStudy, aShape, aName, aFather) + if aSObject and aName: aSObject.SetAttrString("AttributeName", aName) except: print "addToStudyInFather() failed" return "" @@ -813,7 +822,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): New GEOM.GEOM_Object, containing the created point. Example of usage: - p_on_face = geompy.MakeVertexOnSurface(Face, 0.1, 0.8) #(GEOM_Object, Double, Double)->GEOM_Object + p_on_face = geompy.MakeVertexOnSurface(Face, 0.1, 0.8) """ theUParameter, theVParameter, Parameters = ParseParameters(theUParameter, theVParameter) # Example: see GEOM_TestAll.py @@ -844,7 +853,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): New GEOM.GEOM_Object, containing the created point. Example of usage: - p_on_face2 = geompy.MakeVertexOnSurfaceByCoord(Face, 0., 0., 0.) #(GEOM_Object, Double, Double, Double)->GEOM_Object + p_on_face2 = geompy.MakeVertexOnSurfaceByCoord(Face, 0., 0., 0.) """ theX, theY, theZ, Parameters = ParseParameters(theX, theY, theZ) # Example: see GEOM_TestAll.py @@ -853,6 +862,37 @@ class geompyDC(GEOM._objref_GEOM_Gen): anObj.SetParameters(Parameters); return anObj + ## Create a point, which lays on the given face. + # The point will lay in arbitrary place of the face. + # The only condition on it is a non-zero distance to the face boundary. + # Such point can be used to uniquely identify the face inside any + # shape in case, when the shape does not contain overlapped faces. + # @param theFace The referenced face. + # @return New GEOM.GEOM_Object, containing the created point. + # + # @ref swig_MakeVertexInsideFace "Example" + def MakeVertexInsideFace (self, theFace): + """ + Create a point, which lays on the given face. + The point will lay in arbitrary place of the face. + The only condition on it is a non-zero distance to the face boundary. + Such point can be used to uniquely identify the face inside any + shape in case, when the shape does not contain overlapped faces. + + Parameters: + theFace The referenced face. + + Returns: + New GEOM.GEOM_Object, containing the created point. + + Example of usage: + p_on_face = geompy.MakeVertexInsideFace(Face) + """ + # Example: see GEOM_TestAll.py + anObj = self.BasicOp.MakePointOnFace(theFace) + RaiseIfFailed("MakeVertexInsideFace", self.BasicOp) + return anObj + ## Create a point on intersection of two lines. # @param theRefLine1, theRefLine2 The referenced lines. # @return New GEOM.GEOM_Object, containing the created point. @@ -891,7 +931,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): New GEOM.GEOM_Object, containing the created tangent. Example of usage: - tan_on_arc = geompy.MakeTangentOnCurve(Arc, 0.7) #(GEOM_Object, Double)->GEOM_Object + tan_on_arc = geompy.MakeTangentOnCurve(Arc, 0.7) """ anObj = self.BasicOp.MakeTangentOnCurve(theRefCurve, theParameter) RaiseIfFailed("MakeTangentOnCurve", self.BasicOp) @@ -1615,7 +1655,6 @@ class geompyDC(GEOM._objref_GEOM_Gen): # - "C radius length" : Create arc by direction, radius and length(in degree) # - "AA x y": Create arc by point at X & Y # - "A dx dy" : Create arc by point with DX & DY - # - "A dx dy" : Create arc by point with DX & DY # - "UU x y radius flag1": Create arc by point at X & Y with given radiUs # - "U dx dy radius flag1" : Create arc by point with DX & DY with given radiUs # - "EE x y xc yc flag1 flag2": Create arc by point at X & Y with given cEnter coordinates @@ -1665,7 +1704,6 @@ class geompyDC(GEOM._objref_GEOM_Gen): - "C radius length" : Create arc by direction, radius and length(in degree) - "AA x y": Create arc by point at X & Y - "A dx dy" : Create arc by point with DX & DY - - "A dx dy" : Create arc by point with DX & DY - "UU x y radius flag1": Create arc by point at X & Y with given radiUs - "U dx dy radius flag1" : Create arc by point with DX & DY with given radiUs - "EE x y xc yc flag1 flag2": Create arc by point at X & Y with given cEnter coordinates @@ -1722,8 +1760,10 @@ class geompyDC(GEOM._objref_GEOM_Gen): Returns: New GEOM.GEOM_Object, containing the created wire. """ + theCommand,Parameters = ParseSketcherCommand(theCommand) anObj = self.CurvesOp.MakeSketcherOnPlane(theCommand, theWorkingPlane) RaiseIfFailed("MakeSketcherOnPlane", self.CurvesOp) + anObj.SetParameters(Parameters) return anObj ## Create a sketcher wire, following the numerical description, @@ -1732,7 +1772,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): # passing from it. # @return New GEOM.GEOM_Object, containing the created wire. # - # @ref tui_sketcher_page "Example" + # @ref tui_3dsketcher_page "Example" def Make3DSketcher(self, theCoordinates): """ Create a sketcher wire, following the numerical description, @@ -1751,6 +1791,26 @@ class geompyDC(GEOM._objref_GEOM_Gen): anObj.SetParameters(Parameters) return anObj + ## Obtain a 3D sketcher interface + # @return An instance of @ref gsketcher.Sketcher3D "Sketcher3D" interface + # + # @ref tui_3dsketcher_page "Example" + def Sketcher3D (self): + """ + Obtain a 3D sketcher interface. + + Example of usage: + sk = geompy.Sketcher3D() + sk.addPointsAbsolute(0,0,0, 70,0,0) + sk.addPointsRelative(0, 0, 130) + sk.addPointAnglesLength("OXY", 50, 0, 100) + sk.addPointAnglesLength("OXZ", 30, 80, 130) + sk.close() + a3D_Sketcher_1 = sk.wire() + """ + sk = Sketcher3D (self) + return sk + # end of l3_sketcher ## @} @@ -1764,7 +1824,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): # # @return New GEOM.GEOM_Object, containing the created box. # @ref tui_creation_box "Example" - def MakeBox(self,x1,y1,z1,x2,y2,z2): + def MakeBox (self, x1,y1,z1, x2,y2,z2): """ Create a box by coordinates of two opposite vertices. @@ -1954,7 +2014,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): New GEOM.GEOM_Object, containing the created disk. Example of usage: - Disk3 = geompy.MakeDiskR(100., 1) #(1 Doubles, 1 Int)->GEOM_Object + Disk3 = geompy.MakeDiskR(100., 1) """ # Example: see GEOM_TestAll.py theR,Parameters = ParseParameters(theR) @@ -2109,11 +2169,11 @@ class geompyDC(GEOM._objref_GEOM_Gen): theR2 Radius of the second cone base. theH Cone height. - Note: + Note: If both radiuses are non-zero, the cone will be truncated. If the radiuses are equal, a cylinder will be created instead. - Returns: + Returns: New GEOM.GEOM_Object, containing the created cone. """ # Example: see GEOM_TestAll.py @@ -2149,7 +2209,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): If both radiuses are non-zero, the cone will be truncated. If the radiuses are equal, a cylinder will be created instead. - Returns: + Returns: New GEOM.GEOM_Object, containing the created cone. """ # Example: see GEOM_TestAll.py @@ -4063,7 +4123,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): List of sub-shapes of type theShapeType, contained in theShape. """ # Example: see GEOM_TestAll.py - ListObj = self.ShapesOp.MakeAllSubShapes(aShape, aType, False) + ListObj = self.ShapesOp.MakeAllSubShapes(aShape, EnumToLong( aType ), False) RaiseIfFailed("SubShapeAll", self.ShapesOp) return ListObj @@ -4084,7 +4144,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): Returns: List of IDs of sub-shapes. """ - ListObj = self.ShapesOp.GetAllSubShapesIDs(aShape, aType, False) + ListObj = self.ShapesOp.GetAllSubShapesIDs(aShape, EnumToLong( aType ), False) RaiseIfFailed("SubShapeAllIDs", self.ShapesOp) return ListObj @@ -4113,7 +4173,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): """ # Example: see GEOM_TestAll.py ListOfIDs = [] - AllShapeIDsList = self.SubShapeAllIDs(aShape, aType) + AllShapeIDsList = self.SubShapeAllIDs(aShape, EnumToLong( aType )) for ind in ListOfInd: ListOfIDs.append(AllShapeIDsList[ind - 1]) anObj = self.GetSubShape(aShape, ListOfIDs) @@ -4141,7 +4201,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): List of sub-shapes of type theShapeType, contained in theShape. """ # Example: see GEOM_TestAll.py - ListObj = self.ShapesOp.MakeAllSubShapes(aShape, aType, True) + ListObj = self.ShapesOp.MakeAllSubShapes(aShape, EnumToLong( aType ), True) RaiseIfFailed("SubShapeAllSortedCentres", self.ShapesOp) return ListObj @@ -4164,7 +4224,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): Returns: List of IDs of sub-shapes. """ - ListIDs = self.ShapesOp.GetAllSubShapesIDs(aShape, aType, True) + ListIDs = self.ShapesOp.GetAllSubShapesIDs(aShape, EnumToLong( aType ), True) RaiseIfFailed("SubShapeAllIDs", self.ShapesOp) return ListIDs @@ -4193,7 +4253,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): """ # Example: see GEOM_TestAll.py ListOfIDs = [] - AllShapeIDsList = self.SubShapeAllSortedCentresIDs(aShape, aType) + AllShapeIDsList = self.SubShapeAllSortedCentresIDs(aShape, EnumToLong( aType )) for ind in ListOfInd: ListOfIDs.append(AllShapeIDsList[ind - 1]) anObj = self.GetSubShape(aShape, ListOfIDs) @@ -4219,7 +4279,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): List of sub-shapes of type aType, contained in aShape. """ # Example: see GEOM_TestAll.py - ListObj = self.ShapesOp.ExtractSubShapes(aShape, aType, isSorted) + ListObj = self.ShapesOp.ExtractSubShapes(aShape, EnumToLong( aType ), isSorted) RaiseIfFailed("ExtractSubShapes", self.ShapesOp) return ListObj @@ -4260,7 +4320,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): It works like geompy.SubShapeAllSortedCentres, but wrongly defines centres of faces, shells and solids. """ - ListObj = self.ShapesOp.MakeExplode(aShape, aType, True) + ListObj = self.ShapesOp.MakeExplode(aShape, EnumToLong( aType ), True) RaiseIfFailed("MakeExplode", self.ShapesOp) return ListObj @@ -4273,7 +4333,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): It works like geompy.SubShapeAllSortedCentresIDs, but wrongly defines centres of faces, shells and solids. """ - ListIDs = self.ShapesOp.SubShapeAllIDs(aShape, aType, True) + ListIDs = self.ShapesOp.SubShapeAllIDs(aShape, EnumToLong( aType ), True) RaiseIfFailed("SubShapeAllIDs", self.ShapesOp) return ListIDs @@ -4287,7 +4347,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): (wrongly defines centres of faces, shells and solids). """ ListOfIDs = [] - AllShapeIDsList = self.SubShapeAllSortedIDs(aShape, aType) + AllShapeIDsList = self.SubShapeAllSortedIDs(aShape, EnumToLong( aType )) for ind in ListOfInd: ListOfIDs.append(AllShapeIDsList[ind - 1]) anObj = self.GetSubShape(aShape, ListOfIDs) @@ -7280,6 +7340,31 @@ class geompyDC(GEOM._objref_GEOM_Gen): # Example: see GEOM_TestOthers.py return self.ImportFile(theFileName, "STEP") + ## Read a shape from the binary stream, containing its bounding representation (BRep). + # @note This method will not be dumped to the python script by DumpStudy functionality. + # @note GEOM.GEOM_Object.GetShapeStream() method can be used to obtain the shape's BRep stream. + # @param theStream The BRep binary stream. + # @return New GEOM_Object, containing the shape, read from theStream. + # + # @ref swig_Import_Export "Example" + def RestoreShape (self, theStream): + """ + Read a shape from the binary stream, containing its bounding representation (BRep). + + Note: + shape.GetShapeStream() method can be used to obtain the shape's BRep stream. + + Parameters: + theStream The BRep binary stream. + + Returns: + New GEOM_Object, containing the shape, read from theStream. + """ + # Example: see GEOM_TestOthers.py + anObj = self.InsertOp.RestoreShape(theStream) + RaiseIfFailed("RestoreShape", self.InsertOp) + return anObj + ## Export the given shape into a file with given name. # @param theObject Shape to be stored in the file. # @param theFileName Name of the file to store the given shape in. @@ -7774,6 +7859,36 @@ class geompyDC(GEOM._objref_GEOM_Gen): print Descr return IsValid + ## Retrieve all non blocks solids and faces from \a theShape. + # @param theShape The shape to explore. + # @return A tuple of two GEOM_Objects. The first object is a group of all + # non block solids (= not 6 faces, or with 6 faces, but with the + # presence of non-quadrangular faces). The second object is a + # group of all non quadrangular faces. + # + # @ref tui_measurement_tools_page "Example 1" + # \n @ref swig_GetNonBlocks "Example 2" + def GetNonBlocks (self, theShape): + """ + Retrieve all non blocks solids and faces from theShape. + + Parameters: + theShape The shape to explore. + + Returns: + A tuple of two GEOM_Objects. The first object is a group of all + non block solids (= not 6 faces, or with 6 faces, but with the + presence of non-quadrangular faces). The second object is a + group of all non quadrangular faces. + + Usage: + (res_sols, res_faces) = geompy.GetNonBlocks(myShape1) + """ + # Example: see GEOM_Spanner.py + aTuple = self.BlocksOp.GetNonBlocks(theShape) + RaiseIfFailed("GetNonBlocks", self.BlocksOp) + return aTuple + ## Remove all seam and degenerated edges from \a theShape. # Unite faces and edges, sharing one surface. It means that # this faces must have references to one C++ surface object (handle). @@ -8180,6 +8295,156 @@ class geompyDC(GEOM._objref_GEOM_Gen): RaiseIfFailed("DifferenceIDs", self.GroupOp) pass + ## Union of two groups. + # New group is created. It will contain all entities + # which are present in groups theGroup1 and theGroup2. + # @param theGroup1, theGroup2 are the initial GEOM groups + # to create the united group from. + # @return a newly created GEOM group. + # @ref tui_union_groups_anchor "Example" + def UnionGroups (self, theGroup1, theGroup2): + """ + Union of two groups. + New group is created. It will contain all entities + which are present in groups theGroup1 and theGroup2. + + Parameters: + theGroup1, theGroup2 are the initial GEOM groups + to create the united group from. + + Returns: + a newly created GEOM group. + """ + # Example: see GEOM_TestOthers.py + aGroup = self.GroupOp.UnionGroups(theGroup1, theGroup2) + RaiseIfFailed("UnionGroups", self.GroupOp) + return aGroup + + ## Intersection of two groups. + # New group is created. It will contain only those entities + # which are present in both groups theGroup1 and theGroup2. + # @param theGroup1, theGroup2 are the initial GEOM groups to get common part of. + # @return a newly created GEOM group. + # @ref tui_intersect_groups_anchor "Example" + def IntersectGroups (self, theGroup1, theGroup2): + """ + Intersection of two groups. + New group is created. It will contain only those entities + which are present in both groups theGroup1 and theGroup2. + + Parameters: + theGroup1, theGroup2 are the initial GEOM groups to get common part of. + + Returns: + a newly created GEOM group. + """ + # Example: see GEOM_TestOthers.py + aGroup = self.GroupOp.IntersectGroups(theGroup1, theGroup2) + RaiseIfFailed("IntersectGroups", self.GroupOp) + return aGroup + + ## Cut of two groups. + # New group is created. It will contain entities which are + # present in group theGroup1 but are not present in group theGroup2. + # @param theGroup1 is a GEOM group to include elements of. + # @param theGroup2 is a GEOM group to exclude elements of. + # @return a newly created GEOM group. + # @ref tui_cut_groups_anchor "Example" + def CutGroups (self, theGroup1, theGroup2): + """ + Cut of two groups. + New group is created. It will contain entities which are + present in group theGroup1 but are not present in group theGroup2. + + Parameters: + theGroup1 is a GEOM group to include elements of. + theGroup2 is a GEOM group to exclude elements of. + + Returns: + a newly created GEOM group. + """ + # Example: see GEOM_TestOthers.py + aGroup = self.GroupOp.CutGroups(theGroup1, theGroup2) + RaiseIfFailed("CutGroups", self.GroupOp) + return aGroup + + ## Union of list of groups. + # New group is created. It will contain all entities that are + # present in groups listed in theGList. + # @param theGList is a list of GEOM groups to create the united group from. + # @return a newly created GEOM group. + # @ref tui_union_groups_anchor "Example" + def UnionListOfGroups (self, theGList): + """ + Union of list of groups. + New group is created. It will contain all entities that are + present in groups listed in theGList. + + Parameters: + theGList is a list of GEOM groups to create the united group from. + + Returns: + a newly created GEOM group. + """ + # Example: see GEOM_TestOthers.py + aGroup = self.GroupOp.UnionListOfGroups(theGList) + RaiseIfFailed("UnionListOfGroups", self.GroupOp) + return aGroup + + ## Cut of lists of groups. + # New group is created. It will contain only entities + # which are present in groups listed in theGList1 but + # are not present in groups from theGList2. + # @param theGList1 is a list of GEOM groups to include elements of. + # @param theGList2 is a list of GEOM groups to exclude elements of. + # @return a newly created GEOM group. + # @ref tui_intersect_groups_anchor "Example" + def IntersectListOfGroups (self, theGList): + """ + Cut of lists of groups. + New group is created. It will contain only entities + which are present in groups listed in theGList1 but + are not present in groups from theGList2. + + Parameters: + theGList1 is a list of GEOM groups to include elements of. + theGList2 is a list of GEOM groups to exclude elements of. + + Returns: + a newly created GEOM group. + """ + # Example: see GEOM_TestOthers.py + aGroup = self.GroupOp.IntersectListOfGroups(theGList) + RaiseIfFailed("IntersectListOfGroups", self.GroupOp) + return aGroup + + ## Cut of lists of groups. + # New group is created. It will contain only entities + # which are present in groups listed in theGList1 but + # are not present in groups from theGList2. + # @param theGList1 is a list of GEOM groups to include elements of. + # @param theGList2 is a list of GEOM groups to exclude elements of. + # @return a newly created GEOM group. + # @ref tui_cut_groups_anchor "Example" + def CutListOfGroups (self, theGList1, theGList2): + """ + Cut of lists of groups. + New group is created. It will contain only entities + which are present in groups listed in theGList1 but + are not present in groups from theGList2. + + Parameters: + theGList1 is a list of GEOM groups to include elements of. + theGList2 is a list of GEOM groups to exclude elements of. + + Returns: + a newly created GEOM group. + """ + # Example: see GEOM_TestOthers.py + aGroup = self.GroupOp.CutListOfGroups(theGList1, theGList2) + RaiseIfFailed("CutListOfGroups", self.GroupOp) + return aGroup + ## Returns a list of sub-objects ID stored in the group # @param theGroup is a GEOM group for which a list of IDs is requested # diff --git a/src/GEOM_SWIG/gsketcher.py b/src/GEOM_SWIG/gsketcher.py new file mode 100644 index 000000000..11cb0771c --- /dev/null +++ b/src/GEOM_SWIG/gsketcher.py @@ -0,0 +1,182 @@ +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# File : gsketcher.py +# Author : Julia DOROVSKIKH, Open CASCADE S.A.S. +# Module : GEOM_SWIG + +""" + \namespace geompy + \brief 3D Sketcher interface +""" + +# This method is used by 3D Sketcher functionality +def printVar (var): + if isinstance(var, str): + return "\'%s\'"%var + else: + return "%.7f"%var + +## An interface to build a 3D Sketcher step-by-step. +# Use geompy.Sketcher3D() method to obtain an instance of this class. +# +# @ref tui_3dsketcher_page "Example" +class Sketcher3D: + """ + 3D sketcher interface. + + Example of usage: + sk = geompy.Sketcher3D() + sk.addPointsAbsolute(0,0,0, 70,0,0) + sk.addPointsRelative(0, 0, 130) + sk.addPointAnglesLength("OXY", 50, 0, 100) + sk.addPointAnglesLength("OXZ", 30, 80, 130) + sk.close() + a3D_Sketcher_1 = sk.wire() + """ + + def __init__(self, geompyD): + self.geompyD = geompyD + self.myCommand = "3DSketcher" + pass + + ## Add one or more points, sequentially connected with straight segments. + # Coordinates are considered as absolute. + # If the first point of sketcher is not yet defined, the first point + # from the listCoords will become the first sketcher point. + # @param X1, Y1, Z1, X2, Y2, Z2, ... Coordinates of points + def addPointsAbsolute (self, *listCoords): + """ + Add one or more points, sequentially connected with straight segments. + Coordinates are considered as absolute. + If the first point of sketcher is not yet defined, the first point + from the listCoords will become the first sketcher point. + + Parameters: + X1, Y1, Z1, X2, Y2, Z2, ... Coordinates of points + + Example of usage: + sk = geompy.Sketcher3D() + sk.addPointsAbsolute(0,0,0, 70,0,0) + a3D_Sketcher_1 = sk.wire() + """ + ii = 1 + for cc in listCoords: + if ii == 1: + self.myCommand = self.myCommand + ":TT" + self.myCommand = self.myCommand + " %s"%printVar(cc) + if ii == 3: + ii = 1 + else: + ii = ii + 1 + pass + + ## Add one or more points, sequentially connected with straight segments. + # Coordinates are considered relative to the previous point. + # If the first point of sketcher is not yet defined, the + # origin (0, 0, 0) will become the first sketcher point. + # @param X1, Y1, Z1, X2, Y2, Z2, ... Coordinates of points + def addPointsRelative (self, *listCoords): + """ + Add one or more points, sequentially connected with straight segments. + Coordinates are considered relative to the previous point. + If the first point of sketcher is not yet defined, the + origin (0, 0, 0) will become the first sketcher point. + + Parameters: + X1, Y1, Z1, X2, Y2, Z2, ... Relative coordinates of points + + Example of usage: + sk = geompy.Sketcher3D() + sk.addPointsRelative(0,0,130, 70,0,-130) + a3D_Sketcher_1 = sk.wire() + """ + ii = 1 + for cc in listCoords: + if ii == 1: + self.myCommand = self.myCommand + ":T" + self.myCommand = self.myCommand + " %s"%printVar(cc) + if ii == 3: + ii = 1 + else: + ii = ii + 1 + pass + + ## Add one straight segment, defined by two angles and length. + # If the first point of sketcher is not yet defined, the + # origin (0, 0, 0) will become the first sketcher point. + # @param axes can be: "OXY", "OYZ" or "OXZ" + # @param angle1 angle in a plane, defined by the \a axes + # @param angle2 angle from the plane, defined by the \a axes + # @param length length of the segment + def addPointAnglesLength (self, axes, angle1, angle2, length): + """ + Add one straight segment, defined by two angles and length. + If the first point of sketcher is not yet defined, the + origin (0, 0, 0) will become the first sketcher point. + + Parameters: + axes can be: "OXY", "OYZ" or "OXZ" + angle1 angle in a plane, defined by the \a axes + angle2 angle from the plane, defined by the \a axes + length length of the segment + + Example of usage: + sk = geompy.Sketcher3D() + sk.addPointAnglesLength("OXY", 50, 0, 100) + a3D_Sketcher_1 = sk.wire() + """ + self.myCommand = self.myCommand + ":%s %s %s %s" % (axes, printVar(angle1), printVar(angle2), printVar(length)) + pass + + ## Set to close the wire + def close (self): + """ + Set to close the wire + + Example of usage: + sk = geompy.Sketcher3D() + sk.addPointsRelative(0,0,130, 70,0,-130) + sk.close() + a3D_Sketcher_1 = sk.wire() + """ + self.myCommand = self.myCommand + ":WW" + pass + + ## Obtain the sketcher result. + # @return New GEOM_Object, containing the created wire + def wire (self): + """ + Obtain the sketcher result. + + Returns: + New GEOM_Object, containing the created wire. + + Example of usage: + sk = geompy.Sketcher3D() + sk.addPointsRelative(0,0,130, 70,0,-130) + a3D_Sketcher_1 = sk.wire() + """ + from geompyDC import ParseSketcherCommand, RaiseIfFailed + Command,Parameters = ParseSketcherCommand(self.myCommand) + wire = self.geompyD.CurvesOp.Make3DSketcherCommand(Command) + self.myCommand = "3DSketcher" + RaiseIfFailed("Sketcher3D", self.geompyD.CurvesOp) + wire.SetParameters(Parameters) + return wire diff --git a/src/GEOM_SWIG_WITHIHM/Makefile.am b/src/GEOM_SWIG_WITHIHM/Makefile.am index e468bfb0d..59166af81 100644 --- a/src/GEOM_SWIG_WITHIHM/Makefile.am +++ b/src/GEOM_SWIG_WITHIHM/Makefile.am @@ -17,14 +17,6 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -# GEOM GEOM_SWIG : binding of C++ omplementaion with Python -# File : Makefile.in -# 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 # =============================================================== @@ -40,28 +32,24 @@ include $(top_srcdir)/adm_local/unix/make_common_starter.am # Step 2: build the dynamic library from cpp built source files and # dependant libraries. # -# swig_wrap.cpp -- gcc --> swig_wrap.o |-- link --> _libSALOME_Swig.la +# swig_wrap.cpp -- gcc --> swig_wrap.o |-- link --> _libGEOM_Swig.la # + | # dependant libs | # -# The file libGEOM_Swig.py will be installed to the -# /bin/salome directory. -# The library _libGEOM_Swig.so will be installed to the +# The files libGEOM_Swig.py and _libGEOM_Swig.so will be installed to the # /lib/python/site-package/salome directory. # SWIG_FLAGS = @SWIG_FLAGS@ -I$(srcdir) -I$(srcdir)/../GEOMGUI SWIG_SOURCES = libGEOM_Swig.i +salomeinclude_HEADERS = $(SWIG_SOURCES) libGEOM_Swig.h + salomepython_PYTHON = libGEOM_Swig.py salomepyexec_LTLIBRARIES = _libGEOM_Swig.la -libGEOM_Swig.py: swig_wrap.cpp -BUILT_SOURCES = swig_wrap.cpp -_libGEOM_Swig_la_SOURCES = $(SWIG_SOURCES) -nodist__libGEOM_Swig_la_SOURCES = $(BUILT_SOURCES) - -salomeinclude_HEADERS = $(SWIG_SOURCES) +_libGEOM_Swig_la_SOURCES = $(SWIG_SOURCES) libGEOM_Swig.h libGEOM_Swig.cxx +nodist__libGEOM_Swig_la_SOURCES = swig_wrap.cpp _libGEOM_Swig_la_CPPFLAGS = \ $(QT_INCLUDES) \ @@ -73,16 +61,23 @@ _libGEOM_Swig_la_CPPFLAGS = \ $(GUI_CXXFLAGS) \ $(CORBA_CXXFLAGS) \ $(CORBA_INCLUDES) \ + $(BOOST_CPPFLAGS) \ + -I$(srcdir)/../GEOMClient \ + -I$(srcdir)/../OBJECT \ -I$(srcdir)/../GEOMGUI \ + -I$(srcdir)/../GEOMToolsGUI \ -I$(top_builddir)/idl _libGEOM_Swig_la_LDFLAGS = -module _libGEOM_Swig_la_LIBADD = \ ../GEOMGUI/libGEOM.la \ + ../GEOMToolsGUI/libGEOMToolsGUI.la \ $(PYTHON_LIBS) swig_wrap.cpp : $(SWIG_SOURCES) $(SWIG) $(SWIG_FLAGS) -o $@ $< +libGEOM_Swig.py: swig_wrap.cpp + CLEANFILES = swig_wrap.cpp libGEOM_Swig.py diff --git a/src/GEOMGUI/GeometryGUI_Swig.cxx b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx similarity index 87% rename from src/GEOMGUI/GeometryGUI_Swig.cxx rename to src/GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx index 59410211f..616fd5097 100644 --- a/src/GEOMGUI/GeometryGUI_Swig.cxx +++ b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx @@ -21,12 +21,13 @@ // // GEOM GEOMGUI : GUI for Geometry component -// File : GeometryGUI_Swig.cxx +// File : libGEOM_Swig.cxx // Author : Nicolas REJNERI, Paul RASCLE // -#include "GeometryGUI_Swig.hxx" +#include "libGEOM_Swig.h" #include "GeometryGUI.h" +#include "GEOMToolsGUI.h" #include "SUIT_Desktop.h" #include "SUIT_Session.h" @@ -51,6 +52,7 @@ #include "GEOM_AISShape.hxx" #include "GEOM_InteractiveObject.hxx" #include "GEOM_Displayer.h" +#include "GEOM_Constants.h" #include "SALOME_Event.h" @@ -60,6 +62,7 @@ #include #include #include +#include #include // IDL Headers @@ -448,7 +451,7 @@ void GEOM_Swig::setVectorsMode(const char* theEntry, bool isOn, bool isUpdated) void GEOM_Swig::setColor(const char* theEntry, int red, int green, int blue, bool isUpdated) { class TEvent: public SALOME_Event { - std::string myEntry; + QString myEntry; int myRed; int myGreen; int myBlue; @@ -460,44 +463,82 @@ void GEOM_Swig::setColor(const char* theEntry, int red, int green, int blue, boo virtual void Execute() { SUIT_Application* anApp = SUIT_Session::session()->activeApplication(); if (!anApp) return; + GEOMToolsGUI::SetColor( myEntry, QColor( myRed, myGreen, myBlue), myUpdateViewer ); + } + }; + ProcessVoidEvent(new TEvent(theEntry, red, green, blue, isUpdated)); +} + +void GEOM_Swig::setIsos(const char* Entry, int nbU, int nbV, bool isUpdated ) +{ + class TEvent: public SALOME_Event { + std::string myEntry; + int myNbU, myNbV; + bool myUpdateViewer; + public: + TEvent(const char* theEntry, int theNbU, int theNbV, bool theUpdated): + myEntry(theEntry), myNbU(theNbU), myNbV(theNbV), myUpdateViewer(theUpdated) + {} + virtual void Execute() { + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if (!app) return; + SalomeApp_Study* study = dynamic_cast(app->activeStudy()); + if (!study) return; Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); - if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)){ - SVTK_View* aView = aViewWindow->getView(); - QColor aColor (myRed, myGreen, myBlue); - aView->SetColor(anIO, aColor); - if (myUpdateViewer) + if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) { + SVTK_Viewer* aView = dynamic_cast(aViewWindow->getViewManager()->getViewModel()); + SVTK_Prs* vtkPrs = dynamic_cast( aView->CreatePrs( myEntry.c_str() ) ); + if ( vtkPrs ) { + vtkActorCollection* anActors = vtkPrs->GetObjects(); + anActors->InitTraversal(); + GEOM_Actor* anActor = GEOM_Actor::SafeDownCast( anActors->GetNextActor() ); + if ( anActor ) { + int aIsos[2]={myNbU,myNbV}; + anActor->SetNbIsos(aIsos); + anActor->StoreIsoNumbers(); + QString anIsos = QString("%1%2%3").arg(myNbU).arg(DIGIT_SEPARATOR).arg(myNbV); + int aMgrId = aView->getViewManager()->getGlobalId(); + study->setObjectProperty(aMgrId, myEntry.c_str(), ISOS_PROP, anIsos); + } + } + + if (myUpdateViewer) aView->Repaint(); - } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { + } + else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app)) { Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); SOCC_Viewer* soccViewer = dynamic_cast(occViewer); - if (soccViewer) - { - SALOME_Prs* prs= soccViewer->CreatePrs( myEntry.c_str() ); - const SOCC_Prs* anOCCPrs = dynamic_cast( prs ); - if ( !anOCCPrs || anOCCPrs->IsNull() ) - return; - - // get objects to be displayed - AIS_ListOfInteractive anAISObjects; - anOCCPrs->GetObjects( anAISObjects ); - AIS_ListIteratorOfListOfInteractive ite( anAISObjects ); - Quantity_Color CSFColor = Quantity_Color(myRed/255., myGreen/255., myBlue/255., Quantity_TOC_RGB); - for ( ; ite.More(); ite.Next() ) - { - if(!ic->IsDisplayed(ite.Value()))continue; //only displayed ais - ite.Value()->SetColor(CSFColor); - if (ite.Value()->IsKind(STANDARD_TYPE(GEOM_AISShape))) Handle(GEOM_AISShape)::DownCast(ite.Value())->SetShadingColor(CSFColor); - ite.Value()->Redisplay(Standard_True); // as in OnColor - } - if (myUpdateViewer) occViewer->update(); + if (soccViewer) { + int aMgrId = soccViewer->getViewManager()->getGlobalId(); + SOCC_Prs* occPrs = dynamic_cast( soccViewer->CreatePrs( myEntry.c_str() ) ); + if ( occPrs && !occPrs->IsNull() ) { + AIS_ListOfInteractive shapes; occPrs->GetObjects( shapes ); + AIS_ListIteratorOfListOfInteractive interIter( shapes ); + for ( ; interIter.More(); interIter.Next() ) { + Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast( interIter.Value() ); + if ( !aSh.IsNull() ) { + Handle(AIS_Drawer) drawer = aSh->Attributes(); + QVariant v = study->getObjectProperty( aMgrId, myEntry.c_str(), EDGE_WIDTH_PROP, QVariant() ); + int width = v.isValid() ? v.toInt() : 1; + drawer->SetUIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, width, myNbU) ); + drawer->SetVIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, width, myNbV) ); + aSh->storeIsoNumbers(); + ic->SetLocalAttributes(aSh, drawer); + ic->Redisplay(aSh); + QString anIsos = QString("%1%2%3").arg(myNbU).arg(DIGIT_SEPARATOR).arg(myNbV); + study->setObjectProperty(aMgrId, myEntry.c_str(), ISOS_PROP, anIsos); + } + } } + } } } }; - ProcessVoidEvent(new TEvent(theEntry, red, green, blue, isUpdated)); + + ProcessVoidEvent(new TEvent (Entry, nbU, nbV, isUpdated)); } void GEOM_Swig::setTransparency(const char* theEntry, float transp, bool isUpdated) diff --git a/src/GEOMGUI/GeometryGUI_Swig.hxx b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.h similarity index 95% rename from src/GEOMGUI/GeometryGUI_Swig.hxx rename to src/GEOM_SWIG_WITHIHM/libGEOM_Swig.h index 0f93ab727..5f85b568b 100644 --- a/src/GEOMGUI/GeometryGUI_Swig.hxx +++ b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.h @@ -21,9 +21,10 @@ // // GEOM GEOMGUI : GUI for Geometry component -// File : GeometryGUI_Swig.hxx +// File : libGEOM_Swig.h // Author : Nicolas REJNERI, Paul RASCLE // + #ifndef GEOMETRYGUI_SWIG_HXX #define GEOMETRYGUI_SWIG_HXX @@ -49,6 +50,7 @@ public: void setVectorsMode(const char* Entry, bool isSet, bool isUpdated = true); void setColor(const char* Entry, int red, int green, int blue, bool isUpdated = true); void setTransparency(const char* Entry, float transp, bool isUpdated = true); + void setIsos(const char* Entry, int nbU, int nbV, bool isUpdated =true); void setDeflection(const char* Entry, float deflect); int getIndexTopology(const char *SubEntry, const char *Entry); diff --git a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i index fc1b8fea4..6bf220c2d 100644 --- a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i +++ b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i @@ -26,5 +26,51 @@ // %module libGEOM_Swig -%include "GeometryGUI_Swig.i" +%{ +#include "libGEOM_Swig.h" +%} + +/* + managing C++ exception in the Python API +*/ +%exception +{ + class PyAllowThreadsGuard { + public: + // Py_BEGIN_ALLOW_THREADS + PyAllowThreadsGuard() { _save = PyEval_SaveThread(); } + // Py_END_ALLOW_THREADS + ~PyAllowThreadsGuard() { PyEval_RestoreThread(_save); } + private: + PyThreadState *_save; + }; + + PyAllowThreadsGuard guard; + + $action +} + +class GEOM_Swig +{ + public: + GEOM_Swig(); + ~GEOM_Swig(); + + void createAndDisplayGO(const char* Entry, bool isUpdated =true); + void eraseGO(const char* Entry, bool allWindows); + void createAndDisplayFitAllGO(const char* Entry); + void UpdateViewer(); + int getIndexTopology(const char *SubEntry, const char *Entry); + const char* getShapeTypeString(const char *Entry); + + void setDisplayMode(const char* Entry, int mode, bool isUpdated =true); + void setVectorsMode(const char* Entry, bool isSet, bool isUpdated =true); + void setColor(const char* Entry, int red, int green, int blue, bool isUpdated =true); + void setTransparency(const char* Entry, float transp, bool isUpdated =true); + void setIsos(const char* Entry, int nbU, int nbV, bool isUpdated =true); + void setDeflection(const char* Entry, float deflect); + const char* getShapeTypeIcon(const char *Ior); + + bool initGeomGen(); +}; diff --git a/src/GroupGUI/GroupGUI.cxx b/src/GroupGUI/GroupGUI.cxx index 990263407..d8f92294f 100644 --- a/src/GroupGUI/GroupGUI.cxx +++ b/src/GroupGUI/GroupGUI.cxx @@ -18,14 +18,14 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // GEOM GEOMGUI : GUI for Geometry component // File : GroupGUI.cxx // Author : Sergey ANIKIN, Open CASCADE S.A.S. (sergey.anikin@opencascade.com) -// + #include "GroupGUI.h" #include "GroupGUI_GroupDlg.h" +#include "GroupGUI_BooleanDlg.h" #include #include "GeometryGUI_Operations.h" @@ -44,8 +44,8 @@ // function : GroupGUI() // purpose : Constructor //======================================================================= -GroupGUI::GroupGUI( GeometryGUI* parent ) - : GEOMGUI( parent ) +GroupGUI::GroupGUI (GeometryGUI* parent) + : GEOMGUI(parent) { } @@ -62,60 +62,67 @@ GroupGUI::~GroupGUI() // function : OnGUIEvent() // purpose : //======================================================================= -bool GroupGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent ) +bool GroupGUI::OnGUIEvent (int theCommandID, SUIT_Desktop* parent) { SalomeApp_Application* app = getGeometryGUI()->getApp(); - if ( !app ) return false; + if (!app) return false; getGeometryGUI()->EmitSignalDeactivateDialog(); QDialog* aDlg = 0; - SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); - if ( !appStudy ) return false; + SalomeApp_Study* appStudy = dynamic_cast(app->activeStudy()); + if (!appStudy) return false; _PTR(Study) aStudy = appStudy->studyDS(); - if ( aStudy->GetProperties()->IsLocked() ) { - SUIT_MessageBox::warning( parent, - tr( "WRN_WARNING" ), - tr( "WRN_STUDY_LOCKED" ) ); + if (aStudy->GetProperties()->IsLocked()) { + SUIT_MessageBox::warning(parent, tr("WRN_WARNING"), tr("WRN_STUDY_LOCKED")); return false; } - switch ( theCommandID ) { + switch (theCommandID) { case GEOMOp::OpGroupCreate: case GEOMOp::OpGroupCreatePopup: // CREATE GROUP - aDlg = new GroupGUI_GroupDlg( GroupGUI_GroupDlg::CreateGroup, getGeometryGUI(), parent ); + aDlg = new GroupGUI_GroupDlg (GroupGUI_GroupDlg::CreateGroup, getGeometryGUI(), parent); break; - case GEOMOp::OpGroupEdit: // EDIT GROUP + case GEOMOp::OpGroupEdit: // EDIT GROUP { SALOME_ListIO aList; aList.Clear(); LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); - if ( aSelMgr ) - aSelMgr->selectedObjects( aList ); + if (aSelMgr) + aSelMgr->selectedObjects(aList); - if ( aList.Extent() == 1 ) { + if (aList.Extent() == 1) { GEOM::GEOM_Object_var anObj = - GEOMBase::ConvertIOinGEOMObject( aList.First() ); + GEOMBase::ConvertIOinGEOMObject(aList.First()); - if ( !CORBA::is_nil( anObj ) && anObj->GetType() == GEOM_GROUP ) { - aDlg = new GroupGUI_GroupDlg( GroupGUI_GroupDlg::EditGroup, getGeometryGUI(), parent ); + if (!CORBA::is_nil(anObj) && anObj->GetType() == GEOM_GROUP) { + aDlg = new GroupGUI_GroupDlg (GroupGUI_GroupDlg::EditGroup, getGeometryGUI(), parent); break; } } - SUIT_MessageBox::warning( parent, tr( "WRN_WARNING" ), tr( "NO_GROUP" ) ); - break; + SUIT_MessageBox::warning(parent, tr("WRN_WARNING"), tr("NO_GROUP")); } + break; + case GEOMOp::OpGroupUnion: // UNION GROUPS + aDlg = new GroupGUI_BooleanDlg (GroupGUI_BooleanDlg::UNION, getGeometryGUI(), parent); + break; + case GEOMOp::OpGroupIntersect: // INTERSECT GROUPS + aDlg = new GroupGUI_BooleanDlg (GroupGUI_BooleanDlg::INTERSECT, getGeometryGUI(), parent); + break; + case GEOMOp::OpGroupCut: // CUT GROUPS + aDlg = new GroupGUI_BooleanDlg (GroupGUI_BooleanDlg::CUT, getGeometryGUI(), parent); + break; default: - app->putInfo( tr( "GEOM_PRP_COMMAND" ).arg( theCommandID ) ); + app->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); break; } - if ( aDlg ) { + if (aDlg) { aDlg->updateGeometry(); - aDlg->resize( aDlg->minimumSizeHint() ); + aDlg->resize(aDlg->minimumSizeHint()); aDlg->show(); } diff --git a/src/GroupGUI/GroupGUI_BooleanDlg.cxx b/src/GroupGUI/GroupGUI_BooleanDlg.cxx new file mode 100644 index 000000000..3c227e0c7 --- /dev/null +++ b/src/GroupGUI/GroupGUI_BooleanDlg.cxx @@ -0,0 +1,320 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 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 + +// GEOM GEOMGUI : GUI for Geometry component +// File : GroupGUI_BooleanDlg.cxx +// Author : Lucien PIGNOLONI, Open CASCADE S.A.S. + +#include "GroupGUI_BooleanDlg.h" + +#include +#include +#include + +#include +#include +#include +#include + +#include + +//================================================================================= +// class : GroupGUI_BooleanDlg() +// purpose : Constructs a GroupGUI_BooleanDlg 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. +//================================================================================= +GroupGUI_BooleanDlg::GroupGUI_BooleanDlg (const int theOperation, GeometryGUI* theGeometryGUI, + QWidget* parent, bool modal, Qt::WindowFlags fl) + : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl), + myOperation(theOperation) +{ + QPixmap image0; + QString aTitle, aCaption; + switch (myOperation) { + case UNION: + image0 = QPixmap(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_FUSE"))); + aTitle = tr("GEOM_UNION"); + aCaption = tr("GEOM_UNION_TITLE"); + setHelpFileName("work_with_groups_page.html#union_groups_anchor"); + break; + case INTERSECT: + image0 = QPixmap(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_COMMON"))); + aTitle = tr("GEOM_INTERSECT"); + aCaption = tr("GEOM_INTERSECT_TITLE"); + setHelpFileName("work_with_groups_page.html#intersect_groups_anchor"); + break; + case CUT: + image0 = QPixmap(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_CUT"))); + aTitle = tr("GEOM_CUT"); + aCaption = tr("GEOM_CUT_TITLE"); + setHelpFileName("work_with_groups_page.html#cut_groups_anchor"); + break; + } + QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + + setWindowTitle(aCaption); + + /***************************************************************/ + mainFrame()->GroupConstructors->setTitle(aTitle); + mainFrame()->RadioButton1->setIcon(image0); + mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton3->close(); + + myGroup = new DlgRef_2Sel (centralWidget()); + + myGroup->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + if (myOperation == CUT) { + myGroup->TextLabel1->setText(tr("GEOM_MAIN_GROUPS")); + myGroup->TextLabel2->setText(tr("GEOM_TOOL_GROUPS")); + } + else { + myGroup->TextLabel1->setText(tr("GEOM_GROUPS").arg(1)); + myGroup->TextLabel2->hide(); + myGroup->PushButton2->hide(); + myGroup->LineEdit2->hide(); + } + + myGroup->PushButton1->setIcon(image1); + myGroup->PushButton2->setIcon(image1); + myGroup->LineEdit1->setReadOnly(true); + myGroup->LineEdit2->setReadOnly(true); + + QVBoxLayout* layout = new QVBoxLayout (centralWidget()); + layout->setMargin(0); layout->setSpacing(6); + layout->addWidget(myGroup); + /***************************************************************/ + + // Initialisation + Init(); +} + +//================================================================================= +// function : ~GroupGUI_BooleanDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +GroupGUI_BooleanDlg::~GroupGUI_BooleanDlg() +{ +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void GroupGUI_BooleanDlg::Init() +{ + // init variables + myEditCurrentArgument = myGroup->LineEdit1; + + myGroup->LineEdit1->setText(""); + myGroup->LineEdit2->setText(""); + myListShapes.length( 0 ); + myListTools.length( 0 ); + + // signals and slots connections + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(myGroup->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(myGroup->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName(mainFrame()->GroupConstructors->title()); + + setTabOrder(mainFrame()->GroupConstructors, mainFrame()->GroupBoxName); + setTabOrder(mainFrame()->GroupBoxName, mainFrame()->GroupMedium); + setTabOrder(mainFrame()->GroupMedium, mainFrame()->GroupButtons); + + mainFrame()->RadioButton1->setFocus(); + + globalSelection(GEOM_GROUP); + + myGroup->PushButton1->click(); + SelectionIntoArgument(); + resize(100,100); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void GroupGUI_BooleanDlg::ClickOnOk() +{ + setIsApplyAndClose(true); + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool GroupGUI_BooleanDlg::ClickOnApply() +{ + if (!onAccept()) + return false; + + initName(); + // activate selection and connect selection manager + myGroup->PushButton1->click(); + return true; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection is changed or on dialog initialization or activation +//================================================================================= +void GroupGUI_BooleanDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + QString aString = ""; + GEOMBase::GetNameOfSelectedIObjects(aSelList, aString, true); + + if (myEditCurrentArgument == myGroup->LineEdit1) { + GEOMBase::ConvertListOfIOInListOfGO(aSelList, myListShapes, true); + } + else if ( myEditCurrentArgument == myGroup->LineEdit2 ) { + GEOMBase::ConvertListOfIOInListOfGO(aSelList, myListTools, true); + } + + myEditCurrentArgument->setText(aString); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void GroupGUI_BooleanDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if (send == myGroup->PushButton1) { + myEditCurrentArgument = myGroup->LineEdit1; + + myGroup->PushButton2->setDown(false); + myGroup->LineEdit2->setEnabled(false); + } + else if (send == myGroup->PushButton2) { + myEditCurrentArgument = myGroup->LineEdit2; + + myGroup->PushButton1->setDown(false); + myGroup->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); +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void GroupGUI_BooleanDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); +} + +//================================================================================= +// function : enterEvent() +// purpose : when mouse enter onto the QWidget +//================================================================================= +void GroupGUI_BooleanDlg::enterEvent (QEvent*) +{ + if (!mainFrame()->GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr GroupGUI_BooleanDlg::createOperation() +{ + return getGeomEngine()->GetIGroupOperations(getStudyId()); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool GroupGUI_BooleanDlg::isValid (QString&) +{ + return (myListShapes.length() > 0); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool GroupGUI_BooleanDlg::execute (ObjectList& objects) +{ + GEOM::GEOM_Object_var anObj; + + GEOM::GEOM_IGroupOperations_var anOper = GEOM::GEOM_IGroupOperations::_narrow(getOperation()); + switch (myOperation) { + case UNION: + anObj = anOper->UnionListOfGroups(myListShapes); + break; + case INTERSECT: + anObj = anOper->IntersectListOfGroups(myListShapes); + break; + case CUT: + anObj = anOper->CutListOfGroups(myListShapes, myListTools); + break; + default: + ; + } + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); + + return true; +} + +//================================================================ +// Function : getFather +// Purpose : Get father object for object to be added in study +// (called with addInStudy method) +//================================================================ +GEOM::GEOM_Object_ptr GroupGUI_BooleanDlg::getFather(GEOM::GEOM_Object_ptr theObj) +{ + GEOM::GEOM_Object_var aFatherObj; + if (theObj->GetType() == GEOM_GROUP) { + GEOM::GEOM_IGroupOperations_var anOper = GEOM::GEOM_IGroupOperations::_narrow(getOperation()); + aFatherObj = anOper->GetMainShape(theObj); + } + return aFatherObj._retn(); +} diff --git a/src/GroupGUI/GroupGUI_BooleanDlg.h b/src/GroupGUI/GroupGUI_BooleanDlg.h new file mode 100644 index 000000000..467130eec --- /dev/null +++ b/src/GroupGUI/GroupGUI_BooleanDlg.h @@ -0,0 +1,76 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 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 + +// GEOM GEOMGUI : GUI for Geometry component +// File : GroupGUI_BooleanDlg.h +// Author : Lucien PIGNOLONI, Open CASCADE S.A.S. + +#ifndef GROUPGUI_BOOLEANDLG_H +#define GROUPGUI_BOOLEANDLG_H + +#include "GEOMBase_Skeleton.h" +#include "GEOM_GenericObjPtr.h" + +class DlgRef_2Sel; + +//================================================================================= +// class : GroupGUI_BooleanDlg +// purpose : +//================================================================================= +class GroupGUI_BooleanDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + enum Operation { UNION = 1, INTERSECT = 2, CUT = 3 }; + + GroupGUI_BooleanDlg (const int, GeometryGUI*, QWidget* = 0, + bool = false, Qt::WindowFlags = 0); + ~GroupGUI_BooleanDlg(); + +protected: + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid (QString&); + virtual bool execute (ObjectList&); + virtual GEOM::GEOM_Object_ptr getFather (GEOM::GEOM_Object_ptr); + +private: + void Init(); + void enterEvent (QEvent*); + +private slots: + void ClickOnOk(); + bool ClickOnApply(); + void SetEditCurrentArgument(); + void SelectionIntoArgument(); + void ActivateThisDialog(); + +private: + int myOperation; + + GEOM::ListOfGO myListShapes; + GEOM::ListOfGO myListTools; + + DlgRef_2Sel* myGroup; +}; + +#endif // GROUPGUI_BOOLEANDLG_H diff --git a/src/GroupGUI/Makefile.am b/src/GroupGUI/Makefile.am index 068c3587a..78e540589 100755 --- a/src/GroupGUI/Makefile.am +++ b/src/GroupGUI/Makefile.am @@ -15,13 +15,11 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -# -# GEOM GROUPGUI : # File : Makefile.am # Author : Alexander BORODIN, Open CASCADE S.A.S. (alexander.borodin@opencascade.com) # Package : GroupGUI -# + include $(top_srcdir)/adm_local/unix/make_common_starter.am # Libraries targets @@ -30,16 +28,20 @@ lib_LTLIBRARIES = libGroupGUI.la # header files salomeinclude_HEADERS = \ GroupGUI.h \ + GroupGUI_BooleanDlg.h \ GroupGUI_GroupDlg.h dist_libGroupGUI_la_SOURCES = \ GroupGUI.h \ + GroupGUI_BooleanDlg.h \ GroupGUI_GroupDlg.h \ GroupGUI.cxx \ + GroupGUI_BooleanDlg.cxx \ GroupGUI_GroupDlg.cxx -MOC_FILES = \ - GroupGUI_moc.cxx \ +MOC_FILES = \ + GroupGUI_moc.cxx \ + GroupGUI_BooleanDlg_moc.cxx \ GroupGUI_GroupDlg_moc.cxx nodist_libGroupGUI_la_SOURCES = \ diff --git a/src/IGESImport/IGESImport.cxx b/src/IGESImport/IGESImport.cxx index cff70de18..e9c73ac4a 100644 --- a/src/IGESImport/IGESImport.cxx +++ b/src/IGESImport/IGESImport.cxx @@ -51,6 +51,8 @@ #include #include +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + #ifdef WNT #if defined IGESIMPORT_EXPORTS || defined IGESImport_EXPORTS #if defined WIN32 @@ -77,37 +79,90 @@ extern "C" { + IGESIMPORT_EXPORT + Handle(TCollection_HAsciiString) GetValue (const TCollection_AsciiString& theFileName, + const TCollection_AsciiString& theParameterName, + TCollection_AsciiString& theError) + { + Handle(TCollection_HAsciiString) aValue; + + if (theParameterName != "LEN_UNITS") { + theError = theParameterName + " parameter reading is not supported by IGES plugin"; + return aValue; + } + + // Set "C" numeric locale to save numbers correctly + Kernel_Utils::Localizer loc; + + IGESControl_Reader aReader; + + Interface_Static::SetCVal("xstep.cascade.unit","M"); + + try { + OCC_CATCH_SIGNALS; + + IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); + if (status == IFSelect_RetDone) { + Handle(IGESData_IGESModel) aModel = + Handle(IGESData_IGESModel)::DownCast(aReader.Model()); + if (!aModel.IsNull()) { + aValue = aModel->GlobalSection().UnitName(); + + if (!aValue.IsNull()) { + Handle(TCollection_HAsciiString) aPrefix = new TCollection_HAsciiString ("UNIT_"); + aValue->Prepend(aPrefix); + } + } + } + else { + theError = theFileName + " reading failed"; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + theError = aFail->GetMessageString(); + } + + return aValue; + } + IGESIMPORT_EXPORT TopoDS_Shape Import (const TCollection_AsciiString& theFileName, const TCollection_AsciiString& theFormatName, TCollection_AsciiString& theError, const TDF_Label& theShapeLabel) { + TopoDS_Shape aResShape; + // Set "C" numeric locale to save numbers correctly Kernel_Utils::Localizer loc; IGESControl_Reader aReader; - TopoDS_Shape aResShape; + Interface_Static::SetCVal("xstep.cascade.unit","M"); + try { + OCC_CATCH_SIGNALS; + IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); if (status == IFSelect_RetDone) { + // BEGIN: old code if (theFormatName == "IGES_UNIT") { Handle(IGESData_IGESModel) aModel = Handle(IGESData_IGESModel)::DownCast(aReader.Model()); - gp_Pnt P(1.0,0.0,0.0); + gp_Pnt P (1.0, 0.0, 0.0); if (!aModel.IsNull()) { Handle(TCollection_HAsciiString) aUnitName = aModel->GlobalSection().UnitName(); - //cout<<"aUnitName = "<ToCString()<String()=="CM") { - P = gp_Pnt(0.01,0.0,0.0); + if (!aUnitName.IsNull()) { + if (aUnitName->String()=="MM") { + P = gp_Pnt(0.001,0.0,0.0); + } + else if (aUnitName->String()=="CM") { + P = gp_Pnt(0.01,0.0,0.0); + } } } BRep_Builder B; @@ -116,6 +171,8 @@ IGESIMPORT_EXPORT aResShape = V; return aResShape; } + // END: old code + if (theFormatName == "IGES_SCALE") { //cout<<"need re-scale a model"< #include -#include -#include - #include -#include -#include -#include -#include -#include -#include #include #include -#include - -// #include -// #include -// #include -// #include -// #include -// #include //================================================================================= // class : MeasureGUI_BndBoxDlg() -// purpose : Constructs a MeasureGUI_BndBoxDlg which is a child of 'parent', with the +// purpose : Constructs a MeasureGUI_BndBoxDlg 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. //================================================================================= -MeasureGUI_BndBoxDlg::MeasureGUI_BndBoxDlg( GeometryGUI* GUI, QWidget* parent ) - : MeasureGUI_Skeleton( GUI, parent ) +MeasureGUI_BndBoxDlg::MeasureGUI_BndBoxDlg (GeometryGUI* GUI, QWidget* parent) + : MeasureGUI_Skeleton(GUI, parent) { QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_BOUNDING_BOX" ) ) ); @@ -72,7 +54,7 @@ MeasureGUI_BndBoxDlg::MeasureGUI_BndBoxDlg( GeometryGUI* GUI, QWidget* parent ) setWindowTitle( tr( "GEOM_BNDBOX_TITLE" ) ); /***************************************************************/ - + mainFrame()->GroupConstructors->setTitle( tr( "GEOM_BNDBOX" ) ); mainFrame()->RadioButton1->setIcon( image0 ); @@ -102,7 +84,7 @@ MeasureGUI_BndBoxDlg::MeasureGUI_BndBoxDlg( GeometryGUI* GUI, QWidget* parent ) QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); layout->addWidget( myGrp ); - + /***************************************************************/ myHelpFileName = "using_measurement_tools_page.html#bounding_box_anchor"; @@ -111,7 +93,6 @@ MeasureGUI_BndBoxDlg::MeasureGUI_BndBoxDlg( GeometryGUI* GUI, QWidget* parent ) Init(); } - //================================================================================= // function : ~MeasureGUI_BndBoxDlg() // purpose : Destroys the object and frees any allocated resources @@ -120,7 +101,6 @@ MeasureGUI_BndBoxDlg::~MeasureGUI_BndBoxDlg() { } - //================================================================================= // function : Init() // purpose : @@ -140,14 +120,14 @@ void MeasureGUI_BndBoxDlg::processObject() { double aXMin, aXMax, aYMin, aYMax, aZMin, aZMax; - if ( !getParameters( aXMin, aXMax, aYMin, aYMax, aZMin, aZMax ) ) { - mySelEdit->setText( "" ); - myGrp->LineEdit11->setText( "" ); - myGrp->LineEdit12->setText( "" ); - myGrp->LineEdit21->setText( "" ); - myGrp->LineEdit22->setText( "" ); - myGrp->LineEdit31->setText( "" ); - myGrp->LineEdit32->setText( "" ); + if (!getParameters(aXMin, aXMax, aYMin, aYMax, aZMin, aZMax)) { + mySelEdit->setText(""); + myGrp->LineEdit11->setText(""); + myGrp->LineEdit12->setText(""); + myGrp->LineEdit21->setText(""); + myGrp->LineEdit22->setText(""); + myGrp->LineEdit31->setText(""); + myGrp->LineEdit32->setText(""); } else { SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); @@ -168,71 +148,17 @@ void MeasureGUI_BndBoxDlg::processObject() // function : getParameters // purpose : //================================================================================= -bool MeasureGUI_BndBoxDlg::getParameters( double& theXmin, double& theXmax, +bool MeasureGUI_BndBoxDlg::getParameters (double& theXmin, double& theXmax, double& theYmin, double& theYmax, - double& theZmin, double& theZmax ) + double& theZmin, double& theZmax) { - if ( myObj->_is_nil() ) + if (myObj->_is_nil()) return false; - else { - GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow( getOperation() ); - try { - Handle(Poly_Triangulation) Trtn = 0; - - GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen(); - if ( CORBA::is_nil(aGeomGen) ) - return false; - - QString IOR = GEOMBase::GetIORFromObject( myObj ); - GEOM::GEOM_Object_var anObject = aGeomGen->GetIORFromString( IOR.toLatin1().constData() ); - if ( CORBA::is_nil(anObject) ) - return false; - - TopoDS_Shape aShape; - GEOMBase::GetShape(anObject, aShape, TopAbs_SHAPE); - if ( aShape.IsNull() ) - return false; - - TopLoc_Location l; - Handle(Poly_Triangulation) T; - TopExp_Explorer ex; - for (ex.Init(aShape,TopAbs_FACE); ex.More(); ex.Next()) { - const TopoDS_Face& F = TopoDS::Face(ex.Current()); - BRepAdaptor_Surface surf(F); - if (surf.GetType() == GeomAbs_Sphere) { - T = BRep_Tool::Triangulation(F, l); - if (!T.IsNull()) { - Handle(Poly_Triangulation) NullTrtn = 0; - (*((Handle(BRep_TFace)*)&F.TShape()))->Triangulation(NullTrtn); - Trtn = T; - break; - } - } - else - break; - } - - anOper->GetBoundingBox( myObj, theXmin, theXmax, theYmin, theYmax, theZmin, theZmax ); - - if (!Trtn.IsNull()) { - TopLoc_Location l; - Handle(Poly_Triangulation) T; - TopExp_Explorer ex; - for (ex.Init(aShape,TopAbs_FACE); ex.More(); ex.Next()) { - const TopoDS_Face& F = TopoDS::Face(ex.Current()); - (*((Handle(BRep_TFace)*)&F.TShape()))->Triangulation(Trtn); - break; - } - } - - } - catch( const SALOME::SALOME_Exception& e ) { - SalomeApp_Tools::QtCatchCorbaException( e ); - return false; - } - - return anOper->IsDone(); - } + + GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow(getOperation()); + anOper->GetBoundingBox(myObj, theXmin, theXmax, theYmin, theYmax, theZmin, theZmax); + + return anOper->IsDone(); } //================================================================================= @@ -243,12 +169,11 @@ SALOME_Prs* MeasureGUI_BndBoxDlg::buildPrs() { double aXMin, aYMin, aZMin, aXMax, aYMax, aZMax; - if ( myObj->_is_nil() || !getParameters( aXMin, aXMax, aYMin, aYMax, aZMin, aZMax ) ) + if (!getParameters(aXMin, aXMax, aYMin, aYMax, aZMin, aZMax)) return 0; - TopoDS_Shape aShape = BRepPrimAPI_MakeBox( gp_Pnt( aXMin, aYMin, aZMin ), - gp_Pnt( aXMax, aYMax, aZMax ) ).Shape(); - - return !aShape.IsNull() ? getDisplayer()->BuildPrs( aShape ) : 0; + TopoDS_Shape aShape = BRepPrimAPI_MakeBox(gp_Pnt(aXMin, aYMin, aZMin), + gp_Pnt(aXMax, aYMax, aZMax)).Shape(); + return !aShape.IsNull() ? getDisplayer()->BuildPrs(aShape) : 0; } diff --git a/src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx b/src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx index 84676e669..df20f449c 100644 --- a/src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx @@ -84,7 +84,7 @@ MeasureGUI_CenterMassDlg::MeasureGUI_CenterMassDlg( GeometryGUI* theGeometryGUI, /***************************************************************/ - myHelpFileName = "using_measurement_tools_page.html#center_mass_anchor"; + myHelpFileName = "center_mass_page.html"; /* Initialisation */ Init(); diff --git a/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx b/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx index df12686dd..e94f29d68 100644 --- a/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx @@ -18,11 +18,9 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // GEOM GEOMGUI : GUI for Geometry component // File : MeasureGUI_CheckSelfIntersectionsDlg.cxx -// Author : Vladimir KLYACHIN, Open CASCADE S.A.S. (vladimir.klyachin@opencascade.com) #include "MeasureGUI_CheckSelfIntersectionsDlg.h" #include "MeasureGUI_Widgets.h" @@ -144,7 +142,13 @@ void MeasureGUI_CheckSelfIntersectionsDlg::processObject() SalomeApp_Tools::QtCatchCorbaException(e); isFailed = true; } - if (isFailed) { + + if (!anOper->IsDone()) { + aMsg += tr(anOper->GetErrorCode()); + myGrp->TextView1->setText(aMsg); + return; + } + else if (isFailed) { aMsg += tr("GEOM_CHECK_SELF_INTERSECTIONS_FAILED"); myGrp->TextView1->setText(aMsg); return; diff --git a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx new file mode 100644 index 000000000..517f5974f --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx @@ -0,0 +1,277 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 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 + +// GEOM GEOMGUI : GUI for Geometry component +// File : MeasureGUI_GetNonBlocksDlg.cxx + +#include "MeasureGUI_GetNonBlocksDlg.h" + +#include +#include + +#include + +#include +#include +#include +#include +#include + +//================================================================================= +// class : MeasureGUI_GetNonBlocksDlg() +// purpose : Constructs a MeasureGUI_GetNonBlocksDlg 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. +//================================================================================= +MeasureGUI_GetNonBlocksDlg::MeasureGUI_GetNonBlocksDlg (GeometryGUI* theGeometryGUI, QWidget* parent) + : GEOMBase_Skeleton(theGeometryGUI, parent, false) +{ + QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GETNONBLOCKS"))); + QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + + setWindowTitle(tr("GEOM_GETNONBLOCKS_TITLE")); + + /***************************************************************/ + mainFrame()->GroupConstructors->setTitle(tr("GEOM_GETNONBLOCKS")); + mainFrame()->RadioButton1->setIcon(image0); + mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton3->close(); + + myGrp = new DlgRef_1Sel (centralWidget()); + myGrp->GroupBox1->setTitle(tr("GEOM_GETNONBLOCKS")); + myGrp->TextLabel1->setText(tr("GEOM_OBJECT")); + myGrp->PushButton1->setIcon(image1); + myGrp->LineEdit1->setReadOnly(true); + + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); + layout->setMargin(0); layout->setSpacing(6); + layout->addWidget(myGrp); + + /***************************************************************/ + + myHelpFileName = "get_non_blocks_page.html"; + + /* Initialisation */ + Init(); +} + +//================================================================================= +// function : ~MeasureGUI_GetNonBlocksDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +MeasureGUI_GetNonBlocksDlg::~MeasureGUI_GetNonBlocksDlg() +{ +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void MeasureGUI_GetNonBlocksDlg::Init() +{ + showOnlyPreviewControl(); + + /* init variables */ + myEditCurrentArgument = myGrp->LineEdit1; + + /* signals and slots connections */ + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(myGrp->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(myGrp->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + //initName(tr("GEOM_NONBLOCKS")); + mainFrame()->ResultName->setText(tr("GEOM_NONBLOCKS")); + globalSelection(); + SelectionIntoArgument(); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void MeasureGUI_GetNonBlocksDlg::ClickOnOk() +{ + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool MeasureGUI_GetNonBlocksDlg::ClickOnApply() +{ + if (!onAccept()) + return false; + + //initName(); + return true; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void MeasureGUI_GetNonBlocksDlg::SelectionIntoArgument() +{ + erasePreview(); + myObj = GEOM::GEOM_Object::_nil(); + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + if (aSelList.Extent() != 1) { + processObject(); + return; + } + + GEOM::GEOM_Object_var aSelectedObject = + GEOMBase::ConvertIOinGEOMObject(aSelList.First()); + + if (aSelectedObject->_is_nil()) { + processObject(); + return; + } + + myObj = aSelectedObject; + processObject(); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void MeasureGUI_GetNonBlocksDlg::SetEditCurrentArgument() +{ + myGrp->LineEdit1->setFocus(); + myEditCurrentArgument = myGrp->LineEdit1; + SelectionIntoArgument(); +} + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void MeasureGUI_GetNonBlocksDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if (send == myGrp->LineEdit1) { + myEditCurrentArgument = myGrp->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void MeasureGUI_GetNonBlocksDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + globalSelection(); + processPreview(); +} + +//================================================================================= +// function : processObject() +// purpose : Fill dialog fields in accordance with myObj +//================================================================================= +void MeasureGUI_GetNonBlocksDlg::processObject() +{ + if (myObj->_is_nil()) { + erasePreview(); + } + else { + myGrp->LineEdit1->setText(GEOMBase::GetName(myObj)); + + processPreview(); + } +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void MeasureGUI_GetNonBlocksDlg::enterEvent (QEvent*) +{ + if (!mainFrame()->GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr MeasureGUI_GetNonBlocksDlg::createOperation() +{ + return getGeomEngine()->GetIBlocksOperations(getStudyId()); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool MeasureGUI_GetNonBlocksDlg::isValid (QString&) +{ + return !myObj->_is_nil(); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool MeasureGUI_GetNonBlocksDlg::execute (ObjectList& objects) +{ + GEOM::GEOM_IBlocksOperations_var anOper = GEOM::GEOM_IBlocksOperations::_narrow(getOperation()); + GEOM::GEOM_Object_var aNonQuads; + GEOM::GEOM_Object_var anObj = anOper->GetNonBlocks(myObj, aNonQuads); + //mainFrame()->ResultName->setText(tr("GEOM_NONBLOCKS")); + + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); + if (!aNonQuads->_is_nil()) + objects.push_back(aNonQuads._retn()); + + return true; +} + +//================================================================ +// Function : getFather +// Purpose : Get father object for object to be added in study +// ( called with addInStudy method ) +//================================================================ +GEOM::GEOM_Object_ptr MeasureGUI_GetNonBlocksDlg::getFather (GEOM::GEOM_Object_ptr) +{ + return myObj; +} diff --git a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h new file mode 100644 index 000000000..438a4ec45 --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h @@ -0,0 +1,69 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 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 + +// GEOM GEOMGUI : GUI for Geometry component +// File : MeasureGUI_GetNonBlocksDlg.h + +#ifndef MEASUREGUI_GETNONBLOCKSDLG_H +#define MEASUREGUI_GETNONBLOCKSDLG_H + +#include + +class DlgRef_1Sel; + +//================================================================================= +// class : MeasureGUI_GetNonBlocksDlg +// purpose : +//================================================================================= +class MeasureGUI_GetNonBlocksDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + MeasureGUI_GetNonBlocksDlg (GeometryGUI*, QWidget*); + ~MeasureGUI_GetNonBlocksDlg(); + +protected: + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid (QString&); + virtual bool execute (ObjectList&); + virtual GEOM::GEOM_Object_ptr getFather (GEOM::GEOM_Object_ptr); + +private slots: + void ClickOnOk(); + bool ClickOnApply(); + void ActivateThisDialog(); + void LineEditReturnPressed(); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); + +private: + void Init(); + void enterEvent (QEvent*); + void processObject(); + +private: + GEOM::GEOM_Object_var myObj; + DlgRef_1Sel* myGrp; +}; + +#endif // MEASUREGUI_GETNONBLOCKSDLG_H diff --git a/src/OBJECT/GEOM_AISShape.cxx b/src/OBJECT/GEOM_AISShape.cxx index 7cba7edbe..4b5b686e4 100644 --- a/src/OBJECT/GEOM_AISShape.cxx +++ b/src/OBJECT/GEOM_AISShape.cxx @@ -513,4 +513,4 @@ Standard_Boolean GEOM_AISShape::switchTopLevel() { Standard_Boolean GEOM_AISShape::toActivate() { return Standard_True; -} \ No newline at end of file +} diff --git a/src/OBJECT/GEOM_TopWireframeShape.cxx b/src/OBJECT/GEOM_TopWireframeShape.cxx index b3db3ddda..f22b3197f 100755 --- a/src/OBJECT/GEOM_TopWireframeShape.cxx +++ b/src/OBJECT/GEOM_TopWireframeShape.cxx @@ -99,4 +99,4 @@ Standard_Boolean GEOM_TopWireframeShape::switchTopLevel() { void GEOM_TopWireframeShape::setIO(const Handle(SALOME_InteractiveObject)& io){ SetOwner( io ); -} \ No newline at end of file +} diff --git a/src/OBJECT/GEOM_TopWireframeShape.hxx b/src/OBJECT/GEOM_TopWireframeShape.hxx index b15f3c670..90e8d7b38 100755 --- a/src/OBJECT/GEOM_TopWireframeShape.hxx +++ b/src/OBJECT/GEOM_TopWireframeShape.hxx @@ -107,4 +107,4 @@ private: // other inline functions and methods (like "C++: function call" methods) // -#endif \ No newline at end of file +#endif diff --git a/src/OperationGUI/OperationGUI_PartitionDlg.cxx b/src/OperationGUI/OperationGUI_PartitionDlg.cxx index 5c940f1ea..c6dd6c14b 100644 --- a/src/OperationGUI/OperationGUI_PartitionDlg.cxx +++ b/src/OperationGUI/OperationGUI_PartitionDlg.cxx @@ -42,6 +42,10 @@ #include #include +// VSR 22/08/2012: issue 0021787: remove "Preview" button from BOP and Partition operations +// Comment next line to enable preview in Partition dialog box +#define NO_PREVIEW + //================================================================================= // class : OperationGUI_PartitionDlg() // purpose : Constructs a OperationGUI_PartitionDlg which is a child of 'parent', with the @@ -89,6 +93,10 @@ OperationGUI_PartitionDlg::OperationGUI_PartitionDlg( GeometryGUI* theGeometryGU setHelpFileName( "partition_page.html" ); +#ifdef NO_PREVIEW + mainFrame()->CheckBoxPreview->setChecked( false ); + mainFrame()->CheckBoxPreview->hide(); +#endif Init(); } diff --git a/src/STEPImport/STEPImport.cxx b/src/STEPImport/STEPImport.cxx index f3f0c06c1..8a4015043 100644 --- a/src/STEPImport/STEPImport.cxx +++ b/src/STEPImport/STEPImport.cxx @@ -18,7 +18,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // File: STEPImport.cxx // Created: Wed May 19 14:41:10 2004 @@ -29,7 +28,12 @@ #include #include -#include +#include +#include +#include +#include +#include + #include #include #include @@ -39,23 +43,23 @@ #include #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include + +#include + #include #include #include #include #include #include -#include -#include -#include -#include -#include + +#include +#include #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC @@ -86,35 +90,135 @@ extern "C" { + STEPIMPORT_EXPORT + Handle(TCollection_HAsciiString) GetValue (const TCollection_AsciiString& theFileName, + const TCollection_AsciiString& theParameterName, + TCollection_AsciiString& theError) + { + Handle(TCollection_HAsciiString) aValue; + + if (theParameterName != "LEN_UNITS") { + theError = theParameterName + " parameter reading is not supported by STEP plugin"; + return aValue; + } + + // Set "C" numeric locale to save numbers correctly + Kernel_Utils::Localizer loc; + + STEPControl_Reader aReader; + + Interface_Static::SetCVal("xstep.cascade.unit","M"); + Interface_Static::SetIVal("read.step.ideas", 1); + Interface_Static::SetIVal("read.step.nonmanifold", 1); + + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); + if (status == IFSelect_RetDone) { + TColStd_SequenceOfAsciiString anUnitLengthNames; + TColStd_SequenceOfAsciiString anUnitAngleNames; + TColStd_SequenceOfAsciiString anUnitSolidAngleNames; + aReader.FileUnits(anUnitLengthNames, anUnitAngleNames, anUnitSolidAngleNames); + if (anUnitLengthNames.Length() > 0) { + TCollection_AsciiString aLenUnits = anUnitLengthNames.First(); + if (aLenUnits == "millimetre") + aValue = new TCollection_HAsciiString ("UNIT_MM"); + else if (aLenUnits == "centimetre") + aValue = new TCollection_HAsciiString ("UNIT_CM"); + else if (aLenUnits == "metre") + aValue = new TCollection_HAsciiString ("UNIT_M"); + else if (aLenUnits == "INCH") + aValue = new TCollection_HAsciiString ("UNIT_INCH"); + // TODO + //else if (aLenUnits == "") + // aValue = new TCollection_HAsciiString (""); + + // tmp begin + //std::cout << "$$$ --- " << anUnitLengthNames.First(); + //for (int ii = 2; ii <= anUnitLengthNames.Length(); ii++) + // std::cout << ", " << anUnitLengthNames.Value(ii); + //std::cout << std::endl; + // tmp end + } + } + else { + theError = theFileName + " reading failed"; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + theError = aFail->GetMessageString(); + } + + return aValue; + } + STEPIMPORT_EXPORT TopoDS_Shape Import (const TCollection_AsciiString& theFileName, - const TCollection_AsciiString& /*theFormatName*/, + const TCollection_AsciiString& theFormatName, TCollection_AsciiString& theError, const TDF_Label& theShapeLabel) { - MESSAGE("Import STEP model from file " << theFileName.ToCString()); + TopoDS_Shape aResShape; + // Set "C" numeric locale to save numbers correctly Kernel_Utils::Localizer loc; - TopoDS_Shape aResShape; - //VRV: OCC 4.0 migration + STEPControl_Reader aReader; + //VSR: 16/09/09: Convert to METERS Interface_Static::SetCVal("xstep.cascade.unit","M"); Interface_Static::SetIVal("read.step.ideas", 1); Interface_Static::SetIVal("read.step.nonmanifold", 1); - //VRV: OCC 4.0 migration - TopoDS_Compound compound; + BRep_Builder B; + TopoDS_Compound compound; B.MakeCompound(compound); + try { -#if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; -#endif + IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); if (status == IFSelect_RetDone) { + + // Regard or not the model units + if (theFormatName == "STEP_SCALE") { + // set UnitFlag to units from file + TColStd_SequenceOfAsciiString anUnitLengthNames; + TColStd_SequenceOfAsciiString anUnitAngleNames; + TColStd_SequenceOfAsciiString anUnitSolidAngleNames; + aReader.FileUnits(anUnitLengthNames, anUnitAngleNames, anUnitSolidAngleNames); + if (anUnitLengthNames.Length() > 0) { + TCollection_AsciiString aLenUnits = anUnitLengthNames.First(); + if (aLenUnits == "millimetre") + Interface_Static::SetCVal("xstep.cascade.unit", "MM"); + else if (aLenUnits == "centimetre") + Interface_Static::SetCVal("xstep.cascade.unit", "CM"); + else if (aLenUnits == "metre") + Interface_Static::SetCVal("xstep.cascade.unit", "M"); + else if (aLenUnits == "INCH") + Interface_Static::SetCVal("xstep.cascade.unit", "INCH"); + else { + theError = "The file contains not supported units."; + return aResShape; + } + // TODO + //else if (aLenUnits == "") + // Interface_Static::SetCVal("xstep.cascade.unit", ""); + } + } + else { + //cout<<"need re-scale a model"<