From d2c909178edea381a99889edd7d75b57f4cdf4d3 Mon Sep 17 00:00:00 2001 From: nds Date: Mon, 28 Aug 2017 12:29:29 +0300 Subject: [PATCH] 0029018: Documentation - Provide user guide for Qt browser Documentation is added in a new "Inspector" page of "User Guides". Inspector plugins has some improvements by the documentation needs. New DRAW scripts are implemented for 'tinspector' command. --- dox/FILES_HTML.txt | 1 + dox/FILES_PDF.txt | 1 + dox/dev_guides/building/cmake/cmake.md | 1 + .../draw_test_harness/draw_test_harness.md | 81 +++ dox/user_guides/inspector/images/3DView.png | Bin 0 -> 5286 bytes .../inspector/images/3DView_elements.svg | 224 +++++++ .../inspector/images/TStandaloneEXE.png | Bin 0 -> 22492 bytes .../inspector/images/TStandaloneEXE_open.png | Bin 0 -> 18552 bytes .../inspector/images/VStudio_projects.png | Bin 0 -> 22604 bytes .../inspector/images/dfbrowser.png | Bin 0 -> 38879 bytes .../inspector/images/dfbrowser_elements.svg | 284 +++++++++ .../dfbrowser_selection_in_tree_view.svg | 204 +++++++ .../display_additional_presentation.png | Bin 0 -> 7589 bytes .../images/display_main_presentation.png | Bin 0 -> 7587 bytes .../inspector/images/drawexe_tinspector.png | Bin 0 -> 13479 bytes .../inspector/images/dump_attribute.png | Bin 0 -> 8186 bytes .../inspector/images/property_panel_array.png | Bin 0 -> 2776 bytes .../images/property_panel_item_selection.svg | 159 +++++ .../inspector/images/property_panel_label.png | Bin 0 -> 5789 bytes .../images/property_panel_named_data.png | Bin 0 -> 4329 bytes .../images/property_panel_simple_type.png | Bin 0 -> 1791 bytes .../property_panel_tnaming_named_shape.png | Bin 0 -> 10430 bytes .../images/property_panel_tnaming_naming.png | Bin 0 -> 4645 bytes .../property_panel_tnaming_used_shapes.png | Bin 0 -> 6110 bytes .../images/property_panel_tree_node.png | Bin 0 -> 4399 bytes dox/user_guides/inspector/images/search.png | Bin 0 -> 33841 bytes .../inspector/images/shapeview.png | Bin 0 -> 32945 bytes .../inspector/images/shapeview_elements.svg | 142 +++++ .../inspector/images/tinspector_elements.svg | 244 ++++++++ .../inspector/images/vinspector.png | Bin 0 -> 40535 bytes .../inspector/images/vinspector_elements.svg | 200 ++++++ dox/user_guides/inspector/inspector.md | 578 ++++++++++++++++++ dox/user_guides/user_guides.md | 3 +- samples/tools/TStandalone/CMakeLists.txt | 2 +- tests/tools/dfbrowser/A2 | 36 +- tests/tools/dfbrowser/A3 | 2 + tests/tools/dfbrowser/A4 | 150 +++++ tests/tools/dfbrowser/A5 | 78 +++ tests/tools/dfbrowser/A6 | 76 +++ tests/tools/grids.list | 2 + tests/tools/shapeview/A1 | 11 + tests/tools/shapeview/A2 | 5 + tests/tools/vinspector/A1 | 18 + tests/tools/vinspector/A2 | 9 + .../DFBrowser/DFBrowser_HighlightDelegate.cxx | 4 +- tools/DFBrowser/DFBrowser_ItemRole.hxx | 4 +- tools/DFBrowser/DFBrowser_SearchLine.cxx | 3 +- tools/DFBrowser/DFBrowser_SearchView.cxx | 5 +- tools/DFBrowser/DFBrowser_TreeLevelLine.cxx | 10 +- .../DFBrowser_TreeLevelLineDelegate.cxx | 4 +- tools/DFBrowser/DFBrowser_TreeLevelView.cxx | 7 +- .../DFBrowser_TreeLevelViewModel.cxx | 14 +- tools/DFBrowser/DFBrowser_TreeModel.cxx | 2 +- tools/DFBrowser/DFBrowser_Window.cxx | 28 +- tools/DFBrowser/DFBrowser_Window.hxx | 4 - .../DFBrowserPane_AttributePane.cxx | 31 +- .../DFBrowserPane_AttributePane.hxx | 15 +- .../DFBrowserPane_AttributePaneModel.cxx | 14 + .../DFBrowserPane_AttributePaneModel.hxx | 32 +- .../DFBrowserPane_HelperArray.cxx | 33 +- .../DFBrowserPane_HelperArray.hxx | 3 +- .../DFBrowserPane_HelperExport.cxx | 4 + .../DFBrowserPane_HelperGroupContent.cxx | 49 -- .../DFBrowserPane_HelperGroupContent.hxx | 53 -- .../DFBrowserPane/DFBrowserPane_ItemRole.hxx | 7 +- .../DFBrowserPane_OcctEnumType.hxx | 3 +- .../DFBrowserPane_TDFReference.cxx | 11 +- .../DFBrowserPane_TDFTagSource.cxx | 1 + .../DFBrowserPane_TDataStdAsciiString.cxx | 7 +- .../DFBrowserPane_TDataStdBooleanArray.cxx | 16 +- .../DFBrowserPane_TDataStdBooleanList.cxx | 3 + .../DFBrowserPane_TDataStdComment.cxx | 1 + .../DFBrowserPane_TDataStdCurrent.cxx | 1 + .../DFBrowserPane_TDataStdExpression.cxx | 1 + .../DFBrowserPane_TDataStdExtStringList.cxx | 3 + .../DFBrowserPane_TDataStdIntPackedMap.cxx | 6 +- .../DFBrowserPane_TDataStdInteger.cxx | 1 + .../DFBrowserPane_TDataStdIntegerList.cxx | 3 + .../DFBrowserPane_TDataStdName.cxx | 1 + .../DFBrowserPane_TDataStdNamedData.cxx | 55 +- .../DFBrowserPane_TDataStdNamedData.hxx | 8 - .../DFBrowserPane_TDataStdReal.cxx | 1 + .../DFBrowserPane_TDataStdRealList.cxx | 3 + .../DFBrowserPane_TDataStdReferenceArray.cxx | 2 +- .../DFBrowserPane_TDataStdReferenceList.cxx | 5 +- .../DFBrowserPane_TDataStdTreeNode.cxx | 37 +- .../DFBrowserPane_TDataStdTreeNodeItem.cxx | 2 + .../DFBrowserPane_TDataStdTreeNodeItem.hxx | 6 +- .../DFBrowserPane_TDataStdTreeNodeModel.cxx | 34 ++ .../DFBrowserPane_TDataStdTreeNodeModel.hxx | 7 +- .../DFBrowserPane_TDataStdUAttribute.cxx | 1 + .../DFBrowserPane_TDocStdOwner.cxx | 91 ++- .../DFBrowserPane_TDocStdXLink.cxx | 2 + .../DFBrowserPane_TFunctionFunction.cxx | 1 + .../DFBrowserPane_TNamingNamedShape.cxx | 145 +++-- .../DFBrowserPane_TNamingNaming.cxx | 42 +- .../DFBrowserPane_TNamingUsedShapes.cxx | 33 +- .../DFBrowserPane_TNamingUsedShapes.hxx | 5 + .../DFBrowserPane_TPrsStdAISPresentation.cxx | 14 +- .../DFBrowserPane_TPrsStdAISViewer.cxx | 14 +- .../DFBrowserPane/DFBrowserPane_TableView.cxx | 29 +- .../DFBrowserPane/DFBrowserPane_TableView.hxx | 7 +- tools/DFBrowserPane/DFBrowserPane_Tools.cxx | 26 + tools/DFBrowserPane/DFBrowserPane_Tools.hxx | 4 + tools/DFBrowserPane/FILES | 2 - .../DFBrowserPaneXDE_XCAFDocArea.cxx | 1 + .../DFBrowserPaneXDE_XCAFDocCentroid.cxx | 7 +- .../DFBrowserPaneXDE_XCAFDocColor.cxx | 9 +- .../DFBrowserPaneXDE_XCAFDocDatum.cxx | 1 - .../DFBrowserPaneXDE_XCAFDocShapeMapTool.cxx | 1 + tools/ShapeView/ShapeView_Window.cxx | 7 +- tools/TInspector/TInspector_Window.cxx | 4 +- tools/ToolsDraw/ToolsDraw.cxx | 10 +- tools/TreeModel/TreeModel_ItemRole.hxx | 3 +- tools/TreeModel/TreeModel_MessageDialog.cxx | 2 + tools/VInspector/VInspector_ToolBar.cxx | 2 - tools/VInspector/VInspector_Window.cxx | 113 +++- 117 files changed, 3167 insertions(+), 464 deletions(-) create mode 100644 dox/user_guides/inspector/images/3DView.png create mode 100644 dox/user_guides/inspector/images/3DView_elements.svg create mode 100644 dox/user_guides/inspector/images/TStandaloneEXE.png create mode 100644 dox/user_guides/inspector/images/TStandaloneEXE_open.png create mode 100644 dox/user_guides/inspector/images/VStudio_projects.png create mode 100644 dox/user_guides/inspector/images/dfbrowser.png create mode 100644 dox/user_guides/inspector/images/dfbrowser_elements.svg create mode 100644 dox/user_guides/inspector/images/dfbrowser_selection_in_tree_view.svg create mode 100644 dox/user_guides/inspector/images/display_additional_presentation.png create mode 100644 dox/user_guides/inspector/images/display_main_presentation.png create mode 100644 dox/user_guides/inspector/images/drawexe_tinspector.png create mode 100644 dox/user_guides/inspector/images/dump_attribute.png create mode 100644 dox/user_guides/inspector/images/property_panel_array.png create mode 100644 dox/user_guides/inspector/images/property_panel_item_selection.svg create mode 100644 dox/user_guides/inspector/images/property_panel_label.png create mode 100644 dox/user_guides/inspector/images/property_panel_named_data.png create mode 100644 dox/user_guides/inspector/images/property_panel_simple_type.png create mode 100644 dox/user_guides/inspector/images/property_panel_tnaming_named_shape.png create mode 100644 dox/user_guides/inspector/images/property_panel_tnaming_naming.png create mode 100644 dox/user_guides/inspector/images/property_panel_tnaming_used_shapes.png create mode 100644 dox/user_guides/inspector/images/property_panel_tree_node.png create mode 100644 dox/user_guides/inspector/images/search.png create mode 100644 dox/user_guides/inspector/images/shapeview.png create mode 100644 dox/user_guides/inspector/images/shapeview_elements.svg create mode 100644 dox/user_guides/inspector/images/tinspector_elements.svg create mode 100644 dox/user_guides/inspector/images/vinspector.png create mode 100644 dox/user_guides/inspector/images/vinspector_elements.svg create mode 100644 dox/user_guides/inspector/inspector.md create mode 100644 tests/tools/dfbrowser/A3 create mode 100644 tests/tools/dfbrowser/A4 create mode 100644 tests/tools/dfbrowser/A5 create mode 100644 tests/tools/dfbrowser/A6 create mode 100644 tests/tools/shapeview/A1 create mode 100644 tests/tools/shapeview/A2 create mode 100644 tests/tools/vinspector/A1 create mode 100644 tests/tools/vinspector/A2 delete mode 100644 tools/DFBrowserPane/DFBrowserPane_HelperGroupContent.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_HelperGroupContent.hxx diff --git a/dox/FILES_HTML.txt b/dox/FILES_HTML.txt index 9afdceab39..2c1be0ed01 100644 --- a/dox/FILES_HTML.txt +++ b/dox/FILES_HTML.txt @@ -32,6 +32,7 @@ user_guides/xde/xde.md user_guides/ocaf/ocaf.md user_guides/tobj/tobj.md user_guides/draw_test_harness/draw_test_harness.md +user_guides/inspector/inspector.md user_guides/brep_wp/brep_wp.md user_guides/vis/vis.md diff --git a/dox/FILES_PDF.txt b/dox/FILES_PDF.txt index aad07226cc..f7cbb0ef9c 100644 --- a/dox/FILES_PDF.txt +++ b/dox/FILES_PDF.txt @@ -14,6 +14,7 @@ user_guides/shape_healing/shape_healing.md user_guides/ocaf/ocaf.md user_guides/step/step.md user_guides/draw_test_harness/draw_test_harness.md +user_guides/inspector/inspector.md user_guides/tobj/tobj.md user_guides/visualization/visualization.md user_guides/xde/xde.md diff --git a/dox/dev_guides/building/cmake/cmake.md b/dox/dev_guides/building/cmake/cmake.md index bdfa189b01..a1cfdac17f 100644 --- a/dox/dev_guides/building/cmake/cmake.md +++ b/dox/dev_guides/building/cmake/cmake.md @@ -97,6 +97,7 @@ The following table gives the full list of environment variables used at the con | BUILD_ADDITIONAL_TOOLKITS | String | Semicolon-separated individual toolkits to include into build process. If you want to build some particular libraries (toolkits) only, then you may uncheck all modules in the corresponding *BUILD_MODUE_\* options and provide the list of necessary libraries here. Of course, all dependencies will be resolved automatically | | BUILD_YACCLEX | Boolean flag | Enables Flex/Bison lexical analyzers. OCCT source files relating to STEP reader and ExprIntrp functionality are generated automatically with Flex/Bison. Checking this option leads to automatic search of Flex/Bison binaries and regeneration of the mentioned files | | BUILD_MODULE_MfcSamples | Boolean flag | Indicates whether MFC samples should be built together with OCCT. This option is only relevant to Windows platforms | +| BUILD_Inspector | Boolean flag | Indicates whether Inspector should be built together with OCCT. | | BUILD_DOC_Overview | Boolean flag | Indicates whether OCCT overview documentation project should be created together with OCCT. It is not built together with OCCT. Checking this option leads to automatic search of Doxygen binaries. Its building calls Doxygen command to generate the documentation in HTML format | | BUILD_PATCH | Path | Points to the directory recognized as a "patch" for OCCT. If specified, the files from this directory take precedence over the corresponding native OCCT sources. This way you are able to introduce patches to Open CASCADE Technology not affecting the original source distribution | | BUILD_WITH_DEBUG | Boolean flag | Enables extended messages of many OCCT algorithms, usually printed to cout. These include messages on internal errors and special cases encountered, timing, etc. | diff --git a/dox/user_guides/draw_test_harness/draw_test_harness.md b/dox/user_guides/draw_test_harness/draw_test_harness.md index 295afa8ac0..a39b506a02 100644 --- a/dox/user_guides/draw_test_harness/draw_test_harness.md +++ b/dox/user_guides/draw_test_harness/draw_test_harness.md @@ -10687,6 +10687,87 @@ Example: mdist ~~~~~ +@section occt_draw_13 Inspector commands + + +This section describes commands that make possible to use Inspector. + +@subsection occt_draw_13_1 tinspector + +Syntax: +~~~~~ +tinspector [-plugins {name1 ... [nameN] | all}] + [-activate name] + [-shape object [name1] ... [nameN]] + [-open file_name [name1] ... [nameN]] + [-update] + [-select {object | name1 ... [nameN]}] + [-show {0|1} = 1] +~~~~~ +Starts tool of inspection. +Options: +* *plugins* enters plugins that should be added in the inspector. +Available names are: dfbrowser, vinspector and shapeview. +Plugins order will be the same as defined in arguments. +'all' adds all available plugins in the order: +DFBrowser, VInspector and ShapeView. +If at the first call this option is not used, 'all' option is applyed; +* *activate* activates the plugin in the tool view. +If at the first call this option is not used, the first plugin is activated; +* *shape* initializes plugin/s by the shape object. If 'name' is empty, initializes all plugins; +* *open* gives the file to the plugin/s. If the plugin is active, after open, update content will be done; +* *update* updates content of the active plugin; +* *select* sets the parameter that should be selected in an active tool view. +Depending on active tool the parameter is: +ShapeView: 'object' is an instance of TopoDS_Shape TShape, +DFBrowser: 'name' is an entry of TDF_Label and name2(optionaly) for TDF_Attribute type name, +VInspector: 'object' is an instance of AIS_InteractiveObject; +* *show* sets Inspector view visible or hidden. The first call of this command will show it. + +**Example:** +~~~~~ +pload DCAF INSPECTOR + +NewDocument Doc BinOcaf + +set aSetAttr1 100 +set aLabel 0:2 +SetInteger Doc ${aLabel} ${aSetAttr1} + +tinspector -plugins dfbrowser -select 0:2 TDataStd_Integer +~~~~~ + +**Example:** +~~~~~ +pload ALL INSPECTOR + +box b1 200 100 120 +box b2 100 200 220 100 120 100 + +tinspector -plugins shapeview -shape b1 -shape b2 -select b1 +~~~~~ + +**Example:** +~~~~~ +pload ALL INSPECTOR + +tinspector -plugins vinspector + +vinit +box box_1 100 100 100 +vdisplay box_1 + +box box_2 180 120 200 150 150 150 +vdisplay box_2 + +vfit +vselmode box_1 1 1 +vselmode box_1 3 1 + +tinspector -update -select box_1 +~~~~~ + + @section occt_draw_11 Extending Test Harness with custom commands diff --git a/dox/user_guides/inspector/images/3DView.png b/dox/user_guides/inspector/images/3DView.png new file mode 100644 index 0000000000000000000000000000000000000000..0caf4efb29a09e5d87c554c07cef352f98745cc0 GIT binary patch literal 5286 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 qx>iL3qW*e+j@fMp+$4!?MdGqG`_}g(tT + + + + + + + + + image/svg+xml + + + + + + + + + + + + Single + Clean + + + 3D view + + View + + Multi + + diff --git a/dox/user_guides/inspector/images/TStandaloneEXE.png b/dox/user_guides/inspector/images/TStandaloneEXE.png new file mode 100644 index 0000000000000000000000000000000000000000..33df1cc038a007a34bfa5091a1e1c341120befeb GIT binary patch literal 22492 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 Ba(w^* literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/TStandaloneEXE_open.png b/dox/user_guides/inspector/images/TStandaloneEXE_open.png new file mode 100644 index 0000000000000000000000000000000000000000..8f08f8f2e5826ed7489be252849e8a1da1534e49 GIT binary patch literal 18552 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∾fRB1=DLKPuwd?U! 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 G*xvx+7&CAH literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/dfbrowser.png b/dox/user_guides/inspector/images/dfbrowser.png new file mode 100644 index 0000000000000000000000000000000000000000..0b5a96e1bb2b55d96c87c81d551a833cbe937367 GIT binary patch literal 38879 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 Z+|YjJUwP?u4|jo&nK9bvDa!TwKLK9u7F7TM literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/dfbrowser_elements.svg b/dox/user_guides/inspector/images/dfbrowser_elements.svg new file mode 100644 index 0000000000..ffa7c0a169 --- /dev/null +++ b/dox/user_guides/inspector/images/dfbrowser_elements.svg @@ -0,0 +1,284 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + Update + Search + Tree Navigation + + OCAF tree view + + + + Property Panel + 3D View + Dump View + + diff --git a/dox/user_guides/inspector/images/dfbrowser_selection_in_tree_view.svg b/dox/user_guides/inspector/images/dfbrowser_selection_in_tree_view.svg new file mode 100644 index 0000000000..c935963ea8 --- /dev/null +++ b/dox/user_guides/inspector/images/dfbrowser_selection_in_tree_view.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/dox/user_guides/inspector/images/display_additional_presentation.png b/dox/user_guides/inspector/images/display_additional_presentation.png new file mode 100644 index 0000000000000000000000000000000000000000..8b4eda8716084dfcabc666a6891a46bf9da00f94 GIT binary patch literal 7589 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

    CYz zmt?Or=7Wd#*JaWJz356M{Q>oeqtR|bhtpqOP3@7zcOvoCDG+S7?IFUiOWSPFtrbG9 z>eFZkb~ozpU+YhEJnl&NI2`fQxt-DBEQiO9fI1F=NLlSpZ%BM|kqU&RvI6px=y#{X zcS`%y`;Nenf2Zhvk+g~W3f8k}We&7t@2Y_Xd44j$2*f zuX|}|;YOPB=1QZG09x|T^{fwv3e4#QGNXOCI5f?(qp)FcmRkT8RX8*)pmCQ~75Z81 z{Dm$gy$uxpc1&ZLG!^Pd_CWIdb-sgig5pwwkEAZpBJdg8Me31e^Ht81#L;nSYK72D z^Nar31=JsTScF~n(BxJcJjbcJgOmgyH7Q|Y`zpr~jJE(_V*bU$-8WMoJ31NntVpy{ z$m$&BO~rNHJBAFjg)TBTU9}6sjA=!ckmv)u=y4QRP92HkvDLg^J#RWq69J5LyvX5E zxgD239JiLIO${Sgk|sz;DO!ay72bm@75!0lzy)rS-vJE+3uY(B&35}d%+&A0?kq$6h?mYJ7?>U^9io~N#QjO&QjC=ML=!ua0ohOEx6Vb$S--P%t`B@>)4E_Ro_RbC-d$)K~nH=a5 zfcVFHIJ9Fr@SeV@P*pvLV{ZQ8?4uWXt`fd1k5z2|yRba9nIRSG#tQfrJ>YbQ9VJ6J zQqkcxt+_8u(u?bkjmMu;~gx`P+T38t~@PjxKyjpk(ZJ{xwkT_|0ZbBB)I$vY>LUelmw!BSNw?62WaYV%fI=YPMnddg00sT>lX_J7z9b;- z=8ru%8BIkJQ26ugJhyb01PYHNDo{vtB9}k~W86d#glEl#Aqs%Kg!y_^(DR9-|HIk# zT&c5a0CB$ zYDE7Pl!5({sNQrq4!IY58#rDNHz~kume<$A?}KU^)GvTc$_L+7n+;u)>^T=IXpv3GqZVRHOg@h57e@i zj;DV+;<@J?L`G^-p;6claqTn|5?N9{s#G=-(m`i1g5iPq#yUWpY|1FHO7JCi z6hN(KERXG7ITz_@%N&By<9N@}1Jh+k~M>j5mcu)&D;dtUhL?RA{$ zuWZT%r!$D}lB7<&_Jr$v1TR3I9>N>VgT(hs@Sl^uuz*RaL&xBziy-Tkrl|mpK<9 z>4*C1elnXHq>_{pS~89ddEtTY*w_9}KD{I8eJeXGJKwVdygd)U=QIj_+H!Hgm*}}1 z_s$$Rp%YNOBU_6Ymg(Zq!}t1x2DGmVCy3$30zg z4T4dGrK;ZOxn5Z;xa;K0T(UU==fG+eL3KwQc^?!|8uToQL?z7Fd5bS zBUT?q63+EN>ReBBoIc0c`n>qy=|Ja(n@;ZL3-pVMJkcSi5HfJqsw zvsBIv)y<B=D8I_mPI{!{U2;OuU(x?Y-GhGKtEv*^H>|e0-;fn?FCW{Sk$b=-T!{ zT<2)|T1V5buJx#0*RO;LPT&mBO0kor zc#d(L?c6?q9TNm>my1FRM!EbI)uY5-qTbCVbQ(3NN3GcI1|`*7=Nx^$Xzh`WuA`{j9a-bE&=2=L zAkmEiU7x+8rxL_VIa$}|-8*9EUG(ps z5g^DlguSfJZAsQ=yxGXLuF(F{ zZ~p4I`pX)vWgpj{@v^SVBFNoSbzxtC8VHEpH#x5YnyccnBAVtDZlKA8t^evv#ekYL z4UB{|asiXXEp~ALWS9fxz{ZYl936Ari(w!cbZ}0jpdJ8WFa*L7HdUM}*asvom4Dt| b6K^?xTbO#&>IVFaN~HQ+>scwx;{E>sj?xic literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/display_main_presentation.png b/dox/user_guides/inspector/images/display_main_presentation.png new file mode 100644 index 0000000000000000000000000000000000000000..63d3079b51bb596749229b8496033bbd565d1021 GIT binary patch literal 7587 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 literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/dump_attribute.png b/dox/user_guides/inspector/images/dump_attribute.png new file mode 100644 index 0000000000000000000000000000000000000000..e86f09658e6ac61558e245f6fcdb750cf7b339e7 GIT binary patch literal 8186 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 UP3f`Zd^~}^p3&tB9p^iL17f}=E&u=k literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/property_panel_item_selection.svg b/dox/user_guides/inspector/images/property_panel_item_selection.svg new file mode 100644 index 0000000000..4caaf9782e --- /dev/null +++ b/dox/user_guides/inspector/images/property_panel_item_selection.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/dox/user_guides/inspector/images/property_panel_label.png b/dox/user_guides/inspector/images/property_panel_label.png new file mode 100644 index 0000000000000000000000000000000000000000..9b8abedbaf46f0064b5ddbf9bbd3ca796c45c9e1 GIT binary patch literal 5789 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 literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/property_panel_named_data.png b/dox/user_guides/inspector/images/property_panel_named_data.png new file mode 100644 index 0000000000000000000000000000000000000000..ac5ba1b978accb4c11f914f8aaffe96004f50f5a GIT binary patch literal 4329 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 literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/property_panel_simple_type.png b/dox/user_guides/inspector/images/property_panel_simple_type.png new file mode 100644 index 0000000000000000000000000000000000000000..f9832d6e79ed7a94f6b5305ed6117300f85c4252 GIT binary patch literal 1791 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

    1eq!-dr-j*w} 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 B(#Ze- literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/property_panel_tree_node.png b/dox/user_guides/inspector/images/property_panel_tree_node.png new file mode 100644 index 0000000000000000000000000000000000000000..a0e6f617e4051bd1382ad221c598a4441585f893 GIT binary patch literal 4399 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 literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/search.png b/dox/user_guides/inspector/images/search.png new file mode 100644 index 0000000000000000000000000000000000000000..55dfd3207bb118f8b09c0a32b863eded8d69ac7a GIT binary patch literal 33841 zcmZs?WmH^E&@M_8354Jd!QI`1yA#~q26s(x7~I|6-8E>i!QI_qa0zgSL3N%|)})SdR5Od56@7&9oFU_oCp|Jf38oNYyA zmTX=k=$vx2w{oXi#fnL^C6nc~10+TX8FtJ}<;X#ij=Msk|!H)W7_zb678}z{1^4Jq+8y3?z!So`e?4OAIInAQ1t9hOCIH#FS3rRqSus+ozI)9g zk4r{Yyur!>064Urrtco#e1nUH1gfvK7Hb#SKS{%BO{|YycHR=rTM5{#=ab{8?1bsG zJX$p&63km`AYvJ)@6TF`x)ge5RTbUVZbHeIL7L!psuRgQ1j~P~Bg$qC#J8EhuCRSv z`hwxyUPEvA@OagjQbn0J{y4c?`-_ir@8V$Ue$2rNj%23(1=QI}YD;5shcSb5pqoAzsT*))#qt@oG= zdQfBhFP_V8d+B5WUj$(Y^IX1=pwE?Q1DR#{@fug%sVAqVWRNDOr~L=;J>UrlxC2|! zX&8zj6T%P{Mf zhM0$7wX20KM!9sZ0EaQoAVJ3WoCNkd+kajs^S@$?Q)97E*hupd`o#A7B5GAUN)2_{ zU(tsB-(x5;(8TMjU#i;SiRkN|CN*J?0<8gna4TpP!-ptB%+0Dz+UUzbc*_0+v!$yq zxq2j!b&A`Nc3AJLkf!ukcAXZGwdYAsouU=BUu!M5&XCG2-P)!vvAxuPgkC@w{ z1Rh$qm;^d-6w7y6pj5ie{Ag{k!?LQHKvnULk!d2Mg`yY+(4s=QLntLqsrR%ohmSAXi|Nf(#pKsVXykkj=GJ?ADd+1|#G zu2mm%d92+EfPQ1WTLrg_!0)Jo3637%)lbE5LLwT58Nzt?p@Zvz?|TDU?2Gn^(uL!q zSr~fi4c_sB5l!|UHd{Y@1?*c6KQC{Di_|{YU zeO{yRhS?tO;;Om@YoyVdB3u*oj6^6v&oRO^X@21+EX21J|x z0nG(XD1-fF*@qEy`JZ(sO+F9r2DNO1kb&85{en}CHhqSf*x^Xo2N;pcL>F)VfSjqH zFK$NX9gduuR08NTJW;AF&MM;{@|B6|2FfeLm0aCP z1IDI5^=c1~eMQuDLo0WBWV5vGvqLzH$j_Zn>@xV-Tg0LdV6_zrY4mCeH^f!5MF(Ok z8+RC8Y$UD32KurA>gYwxp8pVL-ngv3?UQH3nLw)SoJvL)pFeks93FEwXo;g zZX3M+w>3cCXqrc4=bsIqfyH`DM!hbmkz{6QzmEt^3)}k>xvqb}19qFeurz8_U3ti_ zILqT>GGRQ~)sz0NLv_6^wQ^Drs+ zBIkYeL*nn633~;BeIPF|-OHJGM?VSDKj?~Ttd<8n4-E|2ZVw{G3jaL?7zWpKy*!zh zy~?}BKZiaZ>1v*?GR?5BBTknc=F-W8#m|Hxb3IStJ)3%8PBB!g>F7j2^qv&xtu;MU z>%*T*&_KG2`(yPJ_@0-e;)Yymwhki`6f`yM&CmQS8M_$~-1pe2Ze;MfRED*CYjf%9 z`S{zR!*^ommxmwQ9&Qw31>LEMK{)>OyCz>OOwSDF>Nze)Y)83UGpZ;9O-!eAo613gVK5{&COML%LnPz4k&^Z%X$C5Anc-xIt zc-_;*{HWg>U`i|#0NP&)EoFw@IIbNVzpl_~M!sEf$t+$;2XL3zJ;h0IxL?6wWjH6J)cZoOuhuBX~?0PHyP zSvob&(gHEaAR2P8ECwMWk2;j>O3kXA<_foiO8wI>nBxP`PObiO)@g);?IXkOioFKU zXnV<+2PZr&j|jBrCr7sXE2Pg}u5b6!JhboWk`_R?f!uJL=r`S_fXJfAy%@_xpys(5qv`=`mDgVET#b0Z*~gY*i2WU?*K zt)!q}b!ATk@(I^fI+xSrdq1RVR>yNJj=KkiKU*u2;N9pg*S&d4EjA07U2kjnU9VFn zEqCx&T$Ro9azxqn(cA%WAeGB`crGSG7X9;0Kclu-Th2*Y?bzfeKOp9x{oF{~<9S9} zsJ_^w`1kg^wq~bd@J!VC^bb z3$~A-b6acy=>2D4jK$NzlG(fAQK;>HmGO`D8qzfWGbSx<`A>icoH^a9!el$i=0k`x z-b0Fdo2ubKydpE>lAzMTQ}*ag{f)08wtkFSh(nc(+-N>kJMa$DS*%B}FxIz4}mfq70uQ zWk#vLTIE_uA*ULgtK_N#xQ$*c;N^z`qlSJ%WjAwhsJ;0b`kN-RrG*PG0gT7V$%)DB zToxha24)H^vZ9Z_oVuD)ERvxCL}`t<$eewRzr=GIQ}qD*))^DE9qSNGdD_(X_gAk4 zDoS6?2PTo!RKQp*)b#lqO#GM(0eceQwbHdU3{TZ#-SB#J%JNK@uf=L|qs-hyxoi2@ z!1BrEsS@3CHDjc6c*7e8WkhgpjST=)wfsHo>3_Y9G=F)yNk(a6I6+wNNwnMdbEyVj zGoMGszMJN)*mFaZ00~}2C&`#CODI>*FIt2r!-%lC?>(V#JZua!F&Q$PKJ8h-@6UK+gkw*k_ZTxRJVGi8!Ic&2| zou9YK`9tKq4wW91zPzCv6vp`7`R8Kz+Pk-PKALjN?Wl~PY^@V3U{FM&9c@kB$cbEu{&Dv*Ys& zT54g2JDks-EdnqE?kRDDEOBE(c4H<_Uek%wU)QE?mpYD!GMwF-*&Hk{qO11avUA;g z96Ay`ufiN)+Vd{lwp=-U-16NJnyA#}PbWtt^8@jr=%%>CT7!5|{EVKvqm;U;RMy+3 z#!EtfH=H!9Y7DMTjYDUd6#nQW0fUNFs^F}L<* zTy!exHQ4@iB?meY%gn9ZYWR(ze-||+O*P&aiTL6;DsuO*N7u8$+^^^DP1aHJeoNH` zGo(Xott&HQC5Tpzz3yn!#>}iMTPTRZVwytB>w4x*>u!qWRiP^yK$u~u7ab`98WCR@ z04V=`V0BSd(eb|77>D-{2eG^^@Nn76D5YpQ40s{U@rK2!1PTsaU*U~>b@A=XD?{UlBrN2AUz1iq%M=-N?zWv5kT<(GJXsPq- zh?RalpfJN?4srdYajn1gtOGcw>$9TNSR;MueUP7czME=u2%;l4{0L`1Ts83wIJD+^ zgr%qL9o{-#WpQ(3R#4Lpa}%)Ucaw}GFlP;A{;uANEVhCobyQYY6nw7m)<856omY~U zOV}TL{GIEl&LMY)lX2&*I^94a%pu=Qi1h%5qH6D@*-(6g6RG>jMf=mu(zQ?^46|E_ zeIb7RO!HvFjBr2ZcGgFynokEER}XP`?%KlLnyoxB>i(ph*>g%b8*2fw2#+14!!7Fm z8HRhes9UWtEjm(uooh{YoejQ~C_!SRlQwt$upADRPb&`{DSy4@pmlw(dvSB ztFw7*RURjv4VyxrK_1V_%F;k21e#rQQdHG9s-W!Z13cc#yAz@CrbZ)T*-mdxPo+2+ z4LIG?M%&9qs`2v-0&}m&t~H-LbbIGUJD%V}uhZtet3`p^H6Q*2I_(kw#P!pV9=a1| zR5#h%<9}(EMWN4?_C3I#9wn~Dzd@9;MouoGC~CZjE1%*&NUSMK%Rw4BeAMEhngBGp!;R^^}&QjgZq%oc*SbTHelaV- z-t>5j_N<)*zjs?cX0Gmyy<1#LbHf>NrCqn>9xl2w)HM#pcoY-uRYbjf`n(2THV%yn zShMbAPhEFd=P{AnquqBw&IVKr2q?a39tiQ<>hodQ;D4F$rJuX*8wE9d_1Sv7>+gSe zr`dzkbe>i#&q9iV=zU|r<9KrKx}M_rXH6~xCngAK9@(D9KDluu zh6HgAlI2_iwcqC<4nUh~{~(QgLg*|j>01g)J)a0V+j?1!3x`z=`#7fLG6%H(@hKib z$?iM;0mgcr1Kqd}>ekNHl-!(iKbGmfv11ASG{`w=D@G9 zG1^`m2o`3Y&K8yU`Uor6(v*OzlB?ofPqbX}sk+yxO7&x?vj%%Awo|P0HJkWKGpU-< z;TVNR&J8MF=_mKV679hs92h`VE^1W+fLC<F2h98y2~O3K&_m= zYp4}S7uCor%k@+^DukS#3+ZrJ6Z%EgL6&FZTwe5RhqIdqY|bbr;aWZ6rpv}%$2I5Z z48FO{v;*!&tJ%OccKnFdcEV1O>*+R^f`Lril)d!5aZv)0WVeI(X;l#Pb1SJmtubrO z!@r>!4_X3iTjlnqxWo0-kI?mbTyMJFos7>FB`Jyz3ImZ>lbhKHHF={P{`9TFjlwiz7>OA)12fSOP>o(itYPIk~9 z?Ul>sWJB;QAc0N0i{Ku2d4B$fLfQKA z8$z;cN0_IoZOlX|ceLmV0yhdQes7)vnbZQAUpIb|6cZIa!3GK(x4xHli!fmHjG#KH z{`K@v4)V`6h;pYsh(1pP3V*JN3C0F71KtpeK@rm_NS?jD;eJVT;`;!5t6#T@4&yaSkrFeTWq(yPn?2qBGyK_fu$@S{WYjw*KVPZ?R$q+kv6$}a z8SOIUqk#JFiJ=Y8lO_h0F^-%>=+no82PUbK zeL%P>p$)vnyKCb^u=K1V#RYWN@i0}elL<|7TzZgi(TaOK&TtgYzHb8(;r3PDHc{d1 zg>7CyNUE8ewJ=wQ2!#M66DdH4*8Z(d^7vo1@63lKa#XJ>dy}rN@WWkhwZv>rgk7J< z^bL_WM!JCKTxnFJEbqwtiBf`YF23_|Eav`4bVRoZtW!O0^21)}3xj7BhM(lFB05t$XlK^n=d=l#Cyl=RjtSQq8Ve1)w~_+=ls#H!_S%4mivck?Eu}e&diSgtORi&3Ww#|~jFxbV zw=gPKfIh?%uRCG@jF3A#Ir)^&zQY0hNABqDL1@E=D?-n>Cy6TpR$N*>f~ zN|ErTyI3HQGL2mlbn^jrrT5chH~L;|sR#&ec9K z1tNB>={!N<=(r+!yx8HM)x&=~I`FgIJ@8^Y9Er4B5gB0IQrg=%{@HDK+`dfh(%}hz zubO6RuoAQ!xkPL&Vc_O?i*vVZ{O;YHzSth%c%^mjnhTf5wQ8T%GW$e+Tae={ZAzZQ z4rXk%9gE;>J|v7;!}dDg3;cV+i@{l$AWSJ!HT)1b3{pY9IHTX#KJyOcwtv_R9U*l0 zSlSe5N#}n$kULs1ez_aquUk@X3)_^ali4I95g{28#&FZEqeb;VwC`cc0RC`OkBg70 z5OSeBs?gG@Bw?*Svm+imh%EagJ7E6wxH%*R>i=ba&~)2UtKcd_;CYQg4yISF&$?S= z2H%&`_jc8e!L*1iii&$k^j@Pt4EnWQGAdDRgK)4mgmA-jdse@D2pd*Nn1m{V2!un^4cFVRe>FS53c0;23@yu~9A$w#bKVJcP zLojCC&mc{@A4aN1R%4=jUdJ>U z;?W4kl1cG)J0WlE`t|$EVYq5_5Xs)Pq$1*8yW%N_{Zh4i`=qV@gL)Fv4bMojEq({X zGwyPn7djpHi*y=amhL+KLWYMi)7MVj7@m2EkRY*jf!F5L+~dnlVWD43_FRQ_smNR! zr$b#~W&0pz&j5jsR%f71x9uFZA=#1uN5tuC=h<^_Sumhm)jYazU_`3_i6o| z^zU>%#h!!qm2pVG-}a>xr=|2P-hPd!H$*El-3w2W-Ek4Enf*bx%$rJ_2CfFGfnr3d zP&PU44#|lsR{pf((K;46{e-(5YZ}kZ0?8&Y%s7n;JVn-r_q-3`J9>#y)KFV4bR@{3 z?KVA=4*rsMa@roTFZ7@%K53d)9+Si^ON~U8^930; zv$LL;dH@CTl=o;?@$HK-CsjLxXINtuNeTP`lTo?3n@4)s_v8JvNVB^?-k~C|UnHND z=aTD;78e%ul0dlV(P=j5-4=DTbR$9j9_Yw=0cWJ1sPR6xjjyJ5J?ZZNF@yHKw(+)a z{Dz`$?1$L`T`_jz%e?RAMp^9G|Bbo%>h|+DG=b-j-QC@>OPU*S{=?=BWVPZ{ijj+l zT1KWRX8(efNfDZrJ`}0=v@pS(p(tx1ooJejzDWM(CM8~=`4;)wzR&YQp*(~kg~SEP zMuIS~yV*hblb%2Tz`_P+1b1V)c zL2D%P+}|&Hb+Ux<^ceKQ7~Kt?^diiZEfcsjcjpPS!jPb`KVcW-B0z%PFqoiR&Vl8m zC!$v{7FYc`*Q5SUgVCTD#>m+C0K^R9LGgOHVkG5?I2P*7vFZBpOh(B!Td8X!_$s;s zcc$ocOJ6}DJc}qlMpQeJ?z@LZC7Q8Rc98$8I47@-^hDptw@s!@PF5Aaoe5wrr!$XG zCxPuHhj=2suE>V!G*o+<+8Wtx3iR_N6@bR8&qNsRSz{EI@*fBR;D(4ezJjWJxJ960 zCqjNwQc-;wvN{IgiN2J^EhZtQtmuS$-1PR5hn9)Ro5MNvT#TivIsFkatP+K^;$Qlk zuRAJ}&IX+Bw#DD(82=C4!%@eS)_27__%Z*gLUXM_|3tO;t1{FjPLPZ^_oC(imuMyN|mNonPWkRl!(N@>l8h59{cDDRo{=zRai>r0t!_6zo#)-#2g zzsQGgePn#Puf#gZ^*QNv%Q6uRSV{&?}Kjm zz@&5TQas0DhMIHRJ3+`JCz8f+cNS`QE9KwI+ee7`MHn&3BU?IPm7oj)A+!BIK z9x>Rqx;Z*!^6`STxB$E%5u`#v`*5w2!Bo1(g?RMmnxbfM`lL=cIu9U9Xs@71UpgVx zz1}jHD;QFa$zr9L50_P!Lu&DzX1=+ocM;ABUs_Xv2SoTMXQvtI;BI=Ntaj6zv!Dj8 z1pohzDvKMw7KgzIA0#|q74nz!Q({8a$N{F5`GV1)W|xBEv23tuB9%IGa2*2`z+l5V zsXZhGSE`^{`Rl)^>PLo~NHn@g_Nutwbh@UmNWp1X4k_cBm${PwhyfV)5hPwKZvbdl z@10&yk*VXs$idUqdmHJB!u#cf$3l7O7=6wB#Mk%jNCq#?)eg`b)%-ltmQ5?2{fuuL>X7i7R6XZst=HIHx^^jw^{N zBJ1)fD)bYI*7WL;8Sj5mNboktNi7_}PN^_T&s6{E>;CAKG&$3T#rat-vm^MjKZ{LX zx1fXYcv`#JElGVp4JzkwRV$cD>6Qmo_{mVGxf;ItC!HD2L8!AkokO$|H)yd@>B{0C zcF?om_YKCesQ)5gSBK~2BcB)}K9Cud+B5!LX5;g?)O6CYWV;p4Zg8>vy9q+;F&Gb_ z)-^Pw#1w~Je^EEfNHD6=xPyZ?p%`vSCOZ|)8Tx`upnY4FTeM8#cR~vt(qZbZ-I{de zIBDJC)$uYHS+UicjS@OS6;U^)U&kZJ1zk~#88W_>ORU3BU`}15&^Z-G@BDZYN=}Ak z3BJU8AB2``hl||*?S*d-a;sy$*b6{g^jj*t{>=7|rtzac+ ziAL@~n$SL7IG8_$;|cRt90z)2-%0MF5u3tR9{IztdvztLLN0^`3^7jR)fk*k#2BR44Fg>? zS)*cfF~Wmfzy|raqq^qi4}~eI@f17(5T`OClJ5bA!1FE|*^eL#!UVQG_oqHYjx7bP z&MuKqm+zS*%fnzSo4aM<;TT|4 zNJ&aDZa^K*>$gMa^%(83hctT^*dsczNv0-Nu?LH@FnYM7@xw*i9V>;@r zJ^g@TLSaTL62~I4D-55K59#vI1}kna+mroCc=5^We*4#_phZ}(e3tc>a`eg|FoGo{ z@%Hq3AhQPdyV_P1WBzVI97sh^GejkhP#@{xqQt36Uw2>jzd~(;$58M=N!ZRZh*gSk zGD?!jIU@Ft8Y4d0UBbBYdD>s3^YN1sTtFV6{&X)2J^3lR9)-Yd8)+n+Ta|x&(4Ld2 zc~pmMZ*U^ljL(=hlNjhUyrgNAD&Y4q=OGfLKX%M1@%Ryg`~g5`_tbA(6LR%_9?>=1 zj-1NI01y2Dx}T%bVHC1r*|s=BUIe$)kA$)42}!S2*%iPuhM2Yv{-T|@t{12lhdJPQQ>}JB` zHOgJ(yb=~(9%7uwQe=B@R`A!%IRu(!`hVGs?rP2Uf^}3SLkYpZH2c)I_KYsTW`B_= z4J#-vM^XU`hzOyqZe$*w&)dlz$$-M(f+d}}cB2x4Ap~zICFxm2?_G5zYmmU{GZg7_x*bEOf%! zv?H23FQ!|7j{eT`jb zGk`mWW3oQB5)DH9%+Y8`y#*nMxSkstL^vXvvMhhWQG-Emi)JFAy|6=#XY6bUmeeahooz$e zarkKXW;VrojJw(c+yfA#fvI1SV%8eMLb`0K@2q!4-r;IbxAMXS))KG-_{;7`_{$gD@pJ~Xceosp3sY`Omr?FaRiIZ&9AAvPX#=0fQHFCD zJ|j2cM0P}6l6~r@dhaYM-C&$&i(1j0tZ>sE>k~k*;N@bk zV71ms*Tda7!&@n6p5rCQGb%gPQenGPJ$PQ|2*VruRne6I5tq|I7D9uidyxt zMH1tGUe90oY?E`tB#M0bYKrXFV;eu@5moa9P1tJwcm$$|z4vm)&$XS?0H<;C=#Txz zgU->*KGB9gP)sj)VlgN{1v`4(fU>KyC%lk~PnLT(SHf77|7=ATVpo3}Xkz zOsid&xC9bZM3IPuh;(%KNsv?;upn2X8-D3`K>x-guNFp~uj$w=HF&BF%5ekPj2kWXg7L7D%Qgh`Qe&7JM(ebSod`vu)b$fsOjWc{Ja!PiqhHYO z@vEHPf?i6%5B)ZM>5NdLThr$6cg^t|nb?}RZuFXiNM9}xsoSQdt`L~iaF{@Mb^i3q zko=a==$`A?sJsK;D*U4jUTeL`N?mNP_7zZSgfo}aM38_DViQuyae^)Om7cJ`h`gAh zh0x7zYP*FD;RgF_ zjTji0E90`uEt#Zr2W&b+dB`nN>MlE>QH=Q2KkV#98JLEf(}&^BLB{(exPN&ZaDIM~ zniVKX#N$G;h_f}jJ?>!PeI+?Z;U8I^4iOWCwI9fPd5C~xK|l{5|H+lgAv+|a2RRD~ zzDeuOqts`yIZyVTmh8UT`Dh6`Yvu3X^$(|u$xNb4q!6R01zX};>v7zr*k$szT7VGF z!TRmWxcKPr@pLj&5gabs@20URF=n#bPI85>dl(BiqH*s<4~0MyhOix$Kv5Zrbh4IW zRS52t8S=jp^(=p$_GWh!i$2|pP~_y7`7|bIjs4;@l~5J2W$=k9ngnY;=|*giXt1T#aw(UV-a26F25}0>SfFQ(o9j@ zxXBG zNwYl`n{-*~I)m4xhxp2w2p15AoYMrlqlr+2-kC+}UCH9l&Lnf-%=UxBqM&6L4w^WHLV1G9fXbG z>X@CKMg{(xoRr3AJ>5KAupb_EJ3&9UIr_bm;ZZBl^~0q?parVwqPg`B>i?7nxX|C8 z)MHFq@mJT4NdiSokP^22XV(HPQ?H(95bA3HJ~1=$T#WK;MN9J&70xbrL1{{YR@jnz z*&L>|-e1b-iv_&bx#}6;+T`9<5^v;(<=Dr%$FSm`jRsH*@5#dmieGG5%GiMn%0S}6 z*roFaf)fE**2gty6oA1VF4M#tuHo;PI`=iz1;DE zGDSsW-I&cG?`7nR#Uv`elfcvOFojm>7{@t@>RSCvYJwMUk_NZYihGj4dHn&GX~@XJ zE?O7}6zQsAX{5V9Lm=~GX0}|X=vg2QJ76L-erPI$B*d;3+~!xhkFrRk9ehL4d5~=h z6`O|?#pWt!b`p+ubxECj47)|4Lyvtc zss0_lp{O&bXuD>&ffO2HcLYe@?%GwexnU(Bt(`4Li@DzrkL(L?f_ipEi^UdzefPJ5 zEDYgFu$;bcv4{r`@Mb$+-oaVOgECgb-~FIB25_9YA{vR``vW@O5Hn=`>IZi}`p153 zt_wizuv1+a6BiaN;qM6gaybGNY1+jt^|;^E**=4P#}c&8?DetZkmwAeR*U^Xi8&CK zAsOK$(19m+Di0^*%cNIbMyjzOp_XkS>?@TFBS~FQFn<7vnyn#tCGmIU|9{1^>sDrn zgPb|?BqVM~X9kx^>MH(%kaAaKNsAi+YUCaDs|FHTN2EiUPvlsbE z_ttHa!5s+G;sXWb)Jd}M6lV+*C_n~gx3w*x0U14Bp%;^<&)YHX)Yh~Sv~~Fs$++r2 zT8NL#-?y8{se7>rD-Nv~ZiJnDs$*1M_~+`#qPm{Rgdc#lSCu zJUP7vrLYC)|6>7$!aI0#;lM@nq`yZh)gf7F7ggrG)*o8B8!eHFe8COF4p+Ne_XKnG*$Gk86CUgV9*`?efB0UeY? zAhyC_Xp#0fcI8@#q?5BxB4_JlZhGzD-#sZnGEvJ7!%T+o_IkW``xRP`v@{pCUs%ez zx16KJ9ldmhAZ|A|xOfQ&!AXNDum{59)F-MylmWZ0787%YCRAcXT zJ!yYWR-bVZ`{Y-ry#&4JV(wfsiQ|gWLk%ZQhn_l!P%ICxWJ>J~5#SO~gEf@xz-dq) z-sBg&k7+jqw=A%WdbRaW705bkcqbcL=~Wnd*q9-X!5xulG%LcEknWaaGukaT5r17J zc$`0sqxu}@avcVT-+>|!$sP+3(v`s6NfUX*|L#SC&54O}nIpfp5|b9CkD${46#mDZ z^d#nJFc$1FU|Soa?KpXF)>rG^&J~*>C1v3RAtyo#dzRX~@CX%e%WB&dKcdY~%ZG%s zen^TYwX%RJ)|49*V{a@TH>C0r_N|Mj0yYd75TD(dmqvt%bmh zb_plB7a8F7OpE2{3%gMKoV&t``v#gogl5BU1PT)!UAD+U7*A+E$K=8?%a9$;u)w9a z%Qr`VxL)eLofC7Auv)mOT>ossc@PC4*#K7RK9Ytl#*|gdH(OgX6}PrvQp>C${bT*l2c~Oy zDa&Mhte(9z>FmQ*noSTDH{yrt*6cpNYOF!_$Jh!*D`&cQc^af}k|DUQ!)lwX#;o|Q zQRQ3T!&$DE04GpxK=~M);#Qqt=jYs9aw69Q{M(0gaZQCVX-f7=bj}POphAb35|opGD7G4oS=&pC4||DmVRXmE)Z*&Qt7{Uq*>gfL#eJX)TBNC(ysOo$ zv%-w+e@v`l4^K|Dko2f)mNu~|x#f7nhb|PV8&ZGDICq5CrjZF;_tit70`7O|&&1QJUk-&IxkEl0KJ2+@HjL|8SYR>M*7=-d_fNi?z*LCma_vk2|G2~)2luk=r;#aWa}&WNNrK(_CZu&7L5(b+TD@OMO(OyUgEc1-$5 zZ3P;lu-ZsOb$hLQi?$#@evIi6DEI3 zy$(Zn+-oBsjD)tQIGDZZmC8ykUS5EFn*@Ak)TT}KHKSK;)@v{Z6W;`F_yQwsLP`-y zeXO7~3^KnUxW1uaj6fAkCR%fvm+hFLfdqi4!=h2k4v~;SGy8GQY# zsPRJ`*p99-U(<#B{K|CLjLk?CER-9rln|;G(w!PnnV;VWS!T>$eK5kjvO@T;RL1Xfws>*{}3h)$&@)nr<>o)}+WH`oFd z+J`xRX7L$eX?_a>g)PD^3n^TIF{4-h?O95M?`w7dvbm4CMR$b1WyxwBWaQ0?lpsB; zqOV(a{LIIXp>ZXA5qt#|omw=p2z-&t zViOj2VEy{`?^yT$oi5m4>+B3g{H5@H_IHovklhPAQ2O<%mYk=bC2TGMfg4hn;OlXn z{UUY+e?6MNO}!Fqo|3dFUqeKLOt^uKqwXbfxAhL?mjdR z-aa!3%q&S>Va5Z28Ps2xY4J>`%VF<|l?A^JZbu_U=M<$w-jsPw*a#i)pzc}C9_`FP zI#T$hcd(F}UXfOzY^_)_@4i;=<3KockqZM+zYvs4dS$B)7iLk<%YS;jNCn@|` zt_de3qJJmC9S^0&KGjPcrRq=gm_F&o9A8x?fTz3hI`9j$=ZbF3`WbT<+!dacmuTMK zK7}!si7>{&Y7rf=RfLt-DE{q8Ro~xR7yJvlq_1dx>ppF__x}MuSTv{q0%(yel~0KnfwqwiP4Lb9_boV=AYt=2g4}u~eMi>&ZSw+>*L(W8&mfZc z9W&gI&G^~4gg_azBDyqK+Urfc+M-{tC@z#gjt|4*Mvoo>J`c$dIzjZ4>bE~w-S zkyN%?Sg3Eg^j);UjXRc%)Md`|5U14$)--CZzVBRc?A^d#K8Yp038`ZLV}dWVfQwY=K^MTEWLDKWr%yjrs+$O<`D+;9bR`{AAvnOrA;R@{xpCfKIMdFRj^W29HYzH41yq?Y_%)#oB>Mb*`|S= zVSXGV|EBJRzqNOQ)%(%Horo>WtMs&+wg;0Z0;1jGM0SwMh0V*%7oLJrxuuF^hBt{3 z*v68t=tl)+NH~LXXi;IozK%jZTe>gw6|K+iT23=FgG1OrMnk%R0E~#P1ye+Qb{2>T zp-_SN66m0u_TKQMaQ{Twr3${EB~(%jl4{bE<*w(Ja1v()kV12Exs2Wr6!Lfmo}ah; zcTi%H9g(-I+`cYrUWf$VchQs*5R2C+1X-&Qn8tby|CCp&!K&mru8mTuz#^JrFcp@R zK0$uDQ=c<|91iJpj?sr*V;!Tj@dXTN~T7O9U!a za%ZI_$n}bX^xyKvK+5GHvn56C(88a1>vSw5N5~4Unc_*#mgSdxu6`TVV=Jxs{}uO^ zQE_csw`deXun;t8aDqb!F2P-cySuv+2=49@9D-ZnRFHz;Py{U`KnU*cZ&kAQKIc2% z{aU;Cwf64gClqVdnrqHE`W&P8KFlGwGEy9r!A2L$&jU9rMB@38kdqnT>!%AgsAu@6K9_Uu@G7d`mu)%1>;}g=z z2$Qn|ca2wq7)?YKyolE7YMJ*GezNC|`|woRpw8jK1ArVb8c+>*m1umXW8ny&+rd?m zCo3%MMWjaEb7pH8W@Q(B37wZ+QvMLBb=f0RY28lFoeK46YGxR1*-8kA4@UJRKmqp7 zv^nuZp7|s@3SIRX2f=lP$ZJ8%&pwDE^Zl^f+!4dhv$elSeo8~`*2(>XZAN1=p{Rtn z%GvO`P={M3>Og`eba;Sw>SothHMz6ok|}cFR4IkOC@_?@DwCDJa%z^arND z1rsox4_7uLLe8etR8&laa9FQr!}v_caUyLO`_SUvy_yiBj(8&bT|LyITh@~mTDnUz z&8{J8txEX#MN(5ng=?D|I3m_%rMW`ZoZC789-|RItDl78%IopgH}b#wv~hzq-xdOW z$^g9aiJ5UEMw%hE+KS+WoL|iW~8%-NQHE zW!tlY^=Era%Ns(rUA_&g%fgQ*bmqh6ri5o2my}D6d&52`{p&g4%QBQ-gJ*oo7rIM7 zxGB-nULM`PmzP*GKqWE;FMd-L;B_RH>s>}_X7jQ4%J+v{Luq`7fX-O$P>}P> z0Jn#`EZ5$>XC}UESFEy_=UJ_0jhViud7p9#VK#3M?DeJS@a~tEkPe zEM$FFC7dmXp6kdDJ+e|z0%MB4qGEVv#`mRY*tguNjK-9YV%)h%9SHjIEhxmisS9Je zl0B)SrQ`r}=r598MCesK{?E}WHZFFuM-#Ci#R6k2T8=j=JJY8Z9JqP(e*6JeN9ySC z?;4K)-`zZi43EbCDo!*%c>5QK{x}_#cD3t-2y^hGt z!aeyZo^U`Ep9mj5#cW7@eLb_2;eK)cwbgGj(7p-F9$}>9#!M$d;s~ACNIaRn1n>r4 zKO|@R$&=w$yw>}{2uAoLh@lz~^RnJqO|L{w$oEw=E{2~tr?^qa6H9;ifJyAN z!{Y6|gSV#%cynkL44f11;stF#Pciz+wZ7`K$^?n^FV6P^`x@|R^I=@Jx*mOhQ(trn z$@jY;kZZffxl;gr{|SmK+2@+_kfWr*X^s7f9ntxSNn)p8y&HSBWXZyfx;2#7EUo$o zf$20>F35142c7re0S<#^!Toz;0pIz8c;z2}4McYwxp=kXn$$cHt*IuvcD+)T#OnZY zO`cs2|G{Ov6`NYU5mqIGW)zd$NY7->H?iIl>B)U=m!7OEuKKKTM8)v;*+o`e z(L^=z;Uwf6n-L2nKyCR@37vFdu=GQ*J;0_@pecHNlr`W+x8y)$yL4SUC4&CxZy^u;1%aW=*jin z-8q=VxF*yi`vZz6ju#oy8GZcskZjR?dM%KQ7c&3dg;9c#QrO!OPGPU)pI)vjXYKbb zTU<8>HK-RuO*K@7QMlV%4#$aBhYe{tZ{PF_7XU+Z+v{fpNvZ0_&iOX(04t+eCxpEq|tooZdyE7W~KN&8p{`}e_;QYEt4bYaal1U(bCBzV!#m( z%zpTj`*QpF!6JI4+93lCT74m&miB;nEd#_dV-s``svPrH$GSzhiRkOrCM|WaVnXA^pWCFs9pwirOxv5S^)4Xf^6=bnjefdnk6x-;VZxz1PYd(yUii^@J*x zLsI!}L(J_5omebla7A7`my5}JtF6+YgDh4PAOF(kFmqiw01n@NX`mF=_3|<5-Oaux zr%3!{l^C1;nAi7bDDeTq87F&gmLtoXSOS0N@rW>mwypk*!*#dCPM$ep;i<+-Xuvq* zM5*agri{0=!^4{x4V%m3$JYv1>_vVz`dy(0h03Fxm2aI|OYt=$2`@8TZ_<`^>E7eoZX^gwE>2 z_`Mm{s1#OW76V5o?xT^jP&eLCt5)O z_7@z{x5RE-J;4Z(P8mp0$xvjDSIG8!>25BMWXtTZjBxs-a&=|X$vvk2BikbQ-HIZM zM>6@*>nVEm$c0wiRjDL)pW)8f-D2VR&z2Z5i6gkqulghE+uL=#H!^Dd=!iSe)oY{{ z5?!=+xV`PppX;ygJN)>HKkqz&zq+Zo?6eP2)%o>cYQCV0%5S)ReP!N>q1CNSC#L%Z z#9vv+{?;k&qgQM?n7p5J26*SO`dU7_vrj5L~31>Z@7Iq1dwM0Dm{_F&v8D`@E>!oL< zf1&nCNZ6BHk%gp)xZ9>RoB3k}hF>!a6H;UCY~Ai;Bw)-ny25RDtUb-^7nRMwNOu%B zwf49_gZz*pA{&psWosS$eDuccvD6vw6MA3uUBM?S2~8%WIP>ploxP^TJj9k>pt0%S zUt~CR7fub6>Zh2#-oE4}tQSz3^Jf5yO=;^NPbmF*y~T`R`S!;pWyzqOh*5s6-Uvj# zqj72t!EX1%qs~nmkIJ=2*J_VkQ(jg}`vw*#m8iEKOgDK6>J zYblD$&2(xD)D9Mdja-FnP455WNR^jn^izMci!fApu(wMCRM>#+S6bHBzNA;Unuvap{*K>W|rfDFd{F2+dc9saspAkO5Mel#G0ERW#nGXxc}T)pP{4C?V=W6#5cfq;pEf45m z^Dov&_RiO6?4MPU8oh>w?Y~Dg{z!M6;M&t|*cLUeAeG?UFdV-wzRKG^tkMMTAU>V*jU1QW6AI(*AZNNmAkZu_3P^0WWVQA3ee6rV zS-JkLevt59wUvK%U5C=0WzK=ngQQPW(|*T?XEa0dR*qs%Rjvaj@ub7e$cT}b1ljBs zv+`C11VRoeGCB!bC*`0<*2`ugO3`yB)%CqaZM*xWwZ+>O(=EHd(KG`KK}VdNbj|*m zu4t(3gPXs;WT`_QPwYv&03{C+rk`VZ?y{ftRS%5>z1ByT+CC3Lk_@bJf?0M>pXZF3 zw*oZ$_s%jGDNCS2u+wvrcR5}Bmp8{`Hyt*`kdkU9~1Q@*j?jO}2$RV&mJ?g&gjK*VH?B=co3}R^|&=qnE=q~Dp@p%z{MNLclHgtpU8^%{Me^+a);pJ?LYpy1d&7Xtn{;t;{ zHLARgQzlw8R=&}@27qK}1gv;D?MDd@Tiq`dA{8Gw3>5R{uEOq*)V#03(?-JyU`VBp zUtg8m4aWUt-E(@~Yq0yTATYvY;T`&SflInA?^RW8f!Q=$zu@FXflu4d&=9rg%lGD{ zUR&APs3b}1+I!L`*cijcP6j(p(R`c4XMf77AM}%|AM9(@Ps_KgYW+OMMAx4)levsw zbto+WE5&eRZjKzec6ffgiTh4{c4@c#BZ6s}q0g5g!UrvLT{1BD_$|KP%?d7G&L8|! zx}}lHY7&m5vDh`Xx4t&m?Z;c=OQBJh{Dr&cIWt-}i%l-J9&^8M1JoWxK--_WJxKye zZO{pQ`fP_a*IDoy_UYNr=bzu_c$pxFe7LqET^xjQ7|H*VSU_8-ta@nT$0Ypg@%^t{MwqVHCAfh|e*5g&0bB|` zUE7^$qsAm>@_hy4*zc?`@tfYqnNoG7JF{MlPU+sNACdnRz%$oVoYm+iax6(}jxv;$rp3?kP)}lfxm=#pP1Us-{^>>Pu)<>d{pu=kZRh>nk(QP)ScV5rr&s zG*H5TvW>xJjSMKxX5pyb=L&qF*XkE0e{YF-H%DJ+LULBDGt#5yfwXl<&bx4V8HRoF zYfnt2*ycWH-2W)K|4>wTBqo!Z;E*cVcWzl>`OuB>k*tswPPjNLs$6Q|dCWB6L?JbhBF zjt=a^Okt$h;&3Xtrq1ZZbR^oGZiX(7I8{@q5*AbbT;J-fjo~}<>*!{lU4pJqCcf~c zCFL*zCNN=&6Km^jXr7(EKHaB!cN zf-iO&G~6IP-Kl5Zu-1$Cw#Ig|fwukm($uczmnYvE)LR%a(HAdll)1JsoTgMxZJc;H z@{Wp@8i__B`3h!R;G15=xHm2xwM0qkkxY8qCEIfrG#Ap8AaL&1&ETi#<2r_mnq=+ix!}lWj`;R!Q7f?aA-% zwyZ7=W>_NelB0K|8GB>>%>=LX03d!z+zl1?MnY$(6wc*RTeAMvQ%teYoJCvr`3H;6 zFJyv6hbnmudbx&r8h>0vDgFM+E~ruJqL>Xq;@uJc%|T~Hv^&uveu}@K)VKa~Puc?u zJEN6VyRHkcP0wPAFm!kHSlnP^DftIF&yKfS!fHfNW^q73K(&`1J(CeHa8&<6pdETf zGbezThCwCZixC_T@@YjmYdFemA6@LpbBS3f0K-lt~MynNh1j4RM}QlCjl{P=Qe(pyd2g%|VhU2)2QhOTh--^pH0We6hQz zx4;A0=t*Q`IjdY_N4u8B)2MSJYhH_5SAEy>?;hc1y9O8+Gyt2P{D}P@>(n<3LskNi zl#Zvo7j-=LHIh;`y4~^>k9&!-?7sr8iAc%x8hKzdYTb@=@OPrG(pBvShVLgMyy7Z- z$&HxWpA@5S#K=eWkLgSn#@O{xuA}x1C-56dxiZ8>E5>p(d3&xTH8CGMCKw)ej=LTH zyszw;_ab3^vv|>ujBIU5SwF>g#9aVUl!zz<+l>93A5RCqSV+rv_ zlV9zgB$ICTo_X`-(y5(#$A+0Fo$Ls!_kxD*fUm);M@*WD-mS#l0$cad0=x5=hp3Dr z`Qh$f6P~Hk_hF{mB&i$ z@QXw;eh&BY&)_rRWWjtbruie^>0ErlSKgG$Yv4exOJ?ku@hLk=g%oU4?Hh3NJzKEa z3OQf#do4gMzJQzK(l1ZswMMNcBqzszw<>yi-b*QffrH#=V}0GTAnnjD5utQRSt)DdiV*9k(s z_|BZfzeCs5enQ7NcvnBjv#Q2F16mMnd`!-S%E+|*zI`C`6c0XUkF{q5m{mDW$~Ed% zxc@qe45Y$~94`!L1n`T|5?LZf+&4a`_9?6s>EnU;w(~3>VZNgk>VetIWbh%)*(E0x z_K8Ffv+A-D2}Dxi9u_rbSYH`ut$h~=36cMlmBeomK5#5W4bq#V>~c&>D_5$)4KenJ zP2H94D|jj;!I&8gR2Gz&LFmm7siLBqh_>&q)NWLE?!w^d7_s?|MeY%BW#2CO{2)aa z*|O@CMF1}ij7mtiEs7w!V(P5yOP0IgwG-z-Oyfx{kFASyl4$;HA%SL#r+hYNuz=bv zBV&Ti35fKxVS1~>jitjYs|He$>N09P?KmzI&4fR4>^#WOXkOFh055Viq6C+Mx*{|e#Uu?u(51!{a8PlAm%$9!#Vqe>_}(J>%#5X zqt})bII1#2078AsEtY_GDXk;+p2aN@_WUU!xtt)>r!tvr7*)zT-m7GeB zCkeaJHwM)w#_@_P#>gw1M(U1T2&B}1#p6xms(=!3=zB~m&}%azZF0-E811rnjM(Hu z$b%LJEKCr`4P|+zgx*0c#Xk?r32iGmYhEw(k%(E_t)lJVarb|p{GIe)QlIUJGs0Qb z-<@lKyRiQnO3RN)DL`}F1=4@3S97}6`u>s)5=r}f0JLuOz3y|r22hyK2jZ)fO=N(y z(CIhtMe8UZFUediw>%22>hUlGwso-Iu<<|HSmPlwAZgZvxlu?rO&3;KMNaQVpF+Mc zGV*FnsQl(zU^r(9H)ok8k5XmFrd=<)38S%LK4i{3EimY?5{2_v z0Zxeq{2$18{guQiw&ng3jbvXa=qY`=VSZ}%WKrz%SV5Cgvt+5^@yHNdG2(`itve8# zXfXD<^Wm|S7u-}F>H(aK3%vOJvLqj~t0?E&n`TFw4AH!|o$Y<`FvUMFOKQF%!(s*F z8=a71Fj01Cpb6@hPE^*r*t*4-7YmqNMv-DhWA7RO{PQpX11+hj*GTxA9T2_0LBtE06+=hOgTP~#uN z$9JHvq;D%I71K)q>DU;JEsup3qb1;YsuTP+IMwOR2QGmRG5*?Sr`BF{!b-##ey(ax zaJyAtXfEL?1D8H}Q!<|ECr>x=_dXWa{E_|N(a?@bzlv`WIij8G8K4F}+W;TN;wX(1 zIRsOz5`q&cD=FzeYK6dLhr?(M<>lW#0O9ZdkemLLjWDwR6ubaMf}&DFRiAtdGMAT4 zk9T4&J|vBnkcvzt4cp|s3kxgJD$6H$F(J5syQU>|_NgqOiW8k9(z{Q-FBb580nnqa zAUA)A9~QI!#*RWK#+3A=hD+JVV|W9aoz}M;Y5_y#0nM>F+MEhb#}k@#`FHuv8s%`_ z!*>`8KHG~)KW{WA(^0|uyIU3S7tvp8<>sMz7&ZYBFX)!U?sR2S$IdhdJ3lou0t6pt zgcIPYTig9|LtjLi1X9q&1!k$iRqqAc@VBQFrGaIat42-{_9CvydX|-t%Wyan?HycK zCdm(HI#>fMle^4kFvXAk8&J{)0aUBJ*Imrtfu%t~!asKTGt4*#b>Y=6rbCnS=GkkY z7sGCD0fjn^Sit@#Du9vLyS%BY<4w8op zoEw^ayqeDKXKPEZJ{$q|c3(vEUXNnO<4V))Emac^ri8%eh-Bj*5lHdo1z*e@1`^*; z8G9fLx8|fUH3sGE?J(w@_edUAaC(UXgdz$o?=BO3Q`eC}=SwIXSvA%3&18{AGzQkxaA2UCfPT@Ba z0zk+2(n05@{BGP{xwPPJ6`rxR=%y!eiMw{zJ-N%mEZ;>$ndJvq4dA;`)&<`S>suR%- z{I#b`3J?IAUEz=GKwA7xfat#o6foSzXKd~db7sJ=wAJtXV z()yai>TL38pZx_Ef2i7YS3k1ytE)lxa`Ck0ZoGw7`rui$9H_i2fhLJq+2NQn=!Di> zt6GqzIWPPKwr)=f!hh}$K-Co;=dJgz>NX<9w<>K(q~@_uxqq?eI6}+JxrOTS}wMcn3sM1@f z4gfKH0={|U8-44}Z*<#pnV`|^brvo>~iRBneQ0;KPJ z%=J|oUD=?uEeA&4Vfiuo1-XGGA_EMZUXV4^t$7}rdF{(uul zy(o2q-dv$&eM>fxh}HfbQS{y()s7kuF+Usg0=&VC1uj43LpW^_m>OhP#=9a~*OHBO z^u^?xXSLjCEfGq+v>87TQC6QKzh30F?xx-J^~uBN=ANvh(dnO>5!~GKd1SP@5zOu^ zb*<8hBlj4jv5MYcac+`$W?Gm(z6a9ncn%B3=1iu8TL#RD&k6X{jNNDCq~!h^(;a6M zwW*?PLz_|jK#9sEmhq=bRBEkra=b}tH$dMy_(mS1zc=5kxzku*Piy6mA{=+{zsGW4 zNuI*~wp0d30(i{s%(%zEJ~Q%l{rHqc@MV+torD+M4@Wn<8Y5eP9J=Vb&9n6dKCs|1ko8E8q7w$N69M3R#q8_IF7epswoQE>Gg;i zZ>)3i!V4sc0p`lj&c4Q5O2j`54fO@P(~^o2QP-j{(?~%yO9g73VQ2+!jdFiKjR?(z zLdzqQptlB+3PRlI;exi&niIIV#0Gvq_{ZGDu_ zP`S>ddu}OF=({ElY@56_0K9E_(f}HGyoq&Y>az<-V3ZM|xrmW+BsEK7o6EsIy^u1| zE9G8iwLypB`4SQGzCV6`c;OIY@qb9tEDy8A_)J*>o>5YCifo6QasZ5S3S6uRzUaTm z()?fHY*J7kzN`Ka87)U1edB|-FQM(S62>#bGS5i)ki#J~oYTqxo1Eg0rBFppFhDp( zC$KV)5&g&6?a_F%YJRP^zEe4)wb08@m}YpKsU#p5*yM-q0Se2rZaJb7*kcRyLc#rNs?(dzi-~VOG)Q3eSkQaa1g_kn4%T>kG*v8&Q#8-KK198)=z2)u!{8hzGFJcC z3R6SxBcmnQOz5oD@6&3gokBBrO~xEtZxXl)_zMalab*K^<&HcPy_-jAJ+Hk6}URGdp5hOTm z{hHMODKB-YieIa|+JwP8iOmGQUqB2w;Jb(|v6#Uo)J*2vR&X}=WV*`SculEMu}t^! z7ov^Qk;(#VKO=H9RFd#qD%t=KrDPh=b-ysU5qu_k(_K# zO2rssA4%1u2_W$<{qTHR>KmHpMatUR1#?#w!)l+>-T9w{8}3#)u8L-io9*ozYtb^@}s*_*_PihBPkV)S;p||I|5$${jp%{Ij$I zx%i>KQ3HsO%aJ16Yme(@XFO*a7ktA-T;`5~9U~Cjms9d}Kj%x&RB=w%guGoR35YMs z40QicWt9I@a4*a}p$YDY0#SHyhX2m}A{C?54&0VSteho9O)6wPS34OCd`SiS_ zHfY#xiffpj8^kU{5PJUp@vjzl}d2P8(t>DoIEh-*(KX z&r(ITm|HwZctoa*WstMzU$QA0krttHZ1zhOgZ#8%#@IC)4k+)HS8PFZhl{t2LQ`Su zAokqNY9zR3hv?&e@E%p0JK91lOX!Gv=dc%z&hJSW6_!yR8!cG}LH>1M$wh6+w%gYs z%-!H5A>UUm4AbX9%y3l>a-TLFmjs@(6u+X<3~_v})h{F;xf$ttGCBkuRmRPM+ENSM zV9EDG?g#<3oa6!m9Iv)tK)t{J**yLQf}9zo{_l}jbMCwD5AV-#@1y<;_5W4e>`3l5 zEqBTwMq8rfs{$=o74jnbh9E^dQBz?xAO(KjKr5fg>Hm)(>iKkCZq~OaG#(|-vYt^o z)Bv`J+q(#;_<{N2G3naKjrEo9?{vBPKA;f~X~2NB^XlTNBm;5N6A-tfVEYI3P%iXJ zrzsoW*TG~O%R?z)(qeK%2UtjyF1!)4Gc~T* zpr^fC{RQ!hdn#BP8U=7f#2r$v1wKQ)HxjtxhZy3LXG6~9909fC@4i$()2u2$RZpQK z84|dH<02f>2iyWch+*=jqVV5(nF+%HVPba4l;=ZSB`V-g5`Bk3t~_y-{yK1t!Lv=I zi}y7%l>a~?^C($q>5Leu1bneI?<4_?LR2c^@R7!C$?h8oY{-{Ct=KvrBbgYOs;o#8+bYmP-j%5FdaeAOS|ABFGDNFvvLv>{tVetX| z7nz?sQ-s61eq{HX8Q-~He$y#Nf4{7?3LrWPNsI;=)`kc|9;Vcp7o3_FEJNt)-L&Lz!@Hb=~n&iFv8wPvihE zz<-xqpPs+o~>HV4)H1}yL=21xTeR4@7DYW`u?!GF6SU|5qOadQ2c z=igzNH(&q0a@2pzKX4}NM?z-aOxQPBBDTz9q`dw|a}u0h^6ZzS1{Dw^0)ezC#Fk8h z_y1DzL4n>CGiwcAr~3aV`2Zg)GY=diA2H#;TzA|oZUummzZ%z41`Bz~@wB^oR|8iC zGqpq!gKRO_Xl_SxOc(=_P_$xHH}qBHf2Rs`NUypB$?X+G|BoUN{6*0KHxC4aA8HE! zr%I9uYJ=awIBwD~hu>!m?B{0#*l;6z&rw}wL4I_8lKn=;2AHY9les%UaK37J^mj($ ze<3X4wf`T4CE2aH4BVx+P)3z}xUZR}*ZID^vm1v2c<%5Z*MF1IAQTVKwvkmftvt6; z({aJJ1sYGmS;*>jrl{T>Be%!;$RfX!j<&$A69x#k!Z#8cFl}}Lepqd0bOCH|Yi65K z>Q$L_USM9Qd*`FjMl@KpREu7Yc~7<6DZP|h?K@Y67O$MIGn_5Cs98|o$;zOKk2X^m z!Zve0uL|2WHqGl>D^jYuKn72v*TTCjEG#-lvUnO4hK7eB42|;vt$QuVdKX=|CuUYw zWpC2l0Rz=M0h?U&K46ofAo(9eDD4j$U9htT*Pa1o3lwNj+ZT)v$s4$iJ`N9s zoIMwXpUb+QVCIJa5<+fd_$Frz*k=9DnT^fdnUzs?j37fY98oszAVag4TZ#o^fPLrB zplpb4bjF6$F@116cQ%A-N4@nq?9u9T6D3JY5A3I~I(MLpuf@LMhC3i5h{vJDvQhK^ zyq*I+ak30qlsP?v;A)jkeBiwx9nw<`!m}SUhKEBy_n} z0`Q;(!ByA|ljvo*)^}81V)CBXi^3ea=EeQR6Wo|uuR-E8@afDAWL~Jae`+W{I{2<~ zo*K&IvpDy3DWkRg+sTtrT`E2_SRIY-dkzd53)Vrt`1dy#t1;xBIBWZ2Zi1tLLcW8*_C`^CcjEeff^oM5UbHdfi@3j8v_z2?nCJoKcMZJx zF>sI#N|_za=8HnYjesXy!d5Jia1HDHh>n~+pCui~CF^~PzsjN+V78ER_Du^bNoT*V zVJs(G?;uMe4eP~;c#MF;{N@l-l76oI`Y^xA>rR`EjV(1XyE|Dx`P{sQ^WLg418{7k zz}aj-!i*5O=tP%cC#6t{b$N;Dk6Yt@@Ix>G>U42CwGKy1Jx|qYn#{+^5{O7f8a=;3 z3E`a@K=;9WZiI&05Bxqw~5DkY3#oIPw1Rg{+lB$p^(+yJ_2 z2r8N|&oVeWrJ905!+}l<%jIL0Zn~pLz=(8VbOnN8Wow%YG3bh#u=~of$KZp7?wg(AlYC2!ndfTVueh$z3TBEU6 z$80w*7Yma*InQRVap)u`6k04ifdm*WtZD#-j>B-e%C9Ag`7)ODH|8n<<45$+6&8%S z6_>OUTYlSRdG8fW?i~;VL-4D8L)wFJagyahy}MeRNL}I|EstPY>y|!0<)bajh)7Pc zc{_G}zgOHL>H6JLH=U}UTCC4H++NyvUr)&xo0`%ZTyp!qdim6GA3KsVr2~+){&INj&q5 zJXkjwiMX9<5Vjq1mY3@gQK1HnHWn=9g`#>XWS|cZU*XhxUpn3r?AmtH_|X~vauMNi z`e?cOAahfOfCGoiOBb>{#>>N)vbb*_1nW7@7tv1pTHc_(sKO_P*+WC+$LU6V1A69l; zSt_flf|jI{-wU<6e;TfcObV{%<*B@T<@dHIM%5y}SHJBoVLB5`Cnu(PCMGyVcK%aC zN+b(cNoB?K@<5cyw^yqt)T)NQrVPm?Aum0c52tZI8)m-@156w~=pfI2G5GM*@wtDL zCh1f@&g{2Dz@vczBYTe?-s&6Zd{-}iIPWwH*(}bnb<898dtJd2vA5c59w$4JAzNP! z1J%z=wz$jHl!%gLbuc4bj*ZM?f&ySDQ^>R-LdhM+&3irO6?T=(e(M*?HJ zC*y`3VoOc+hL-O|jKMCI9o6$ec3O>@k1gp!L(UyhCAnztXoNf3bA}9+t>RJvFS&Om zRxiwq(M%Z!#G*<>-{iavUYHJyE$FUO$Lgf6dIZ>n7i9ZyK9#1Qi0JH<#tu`Q;sNh2lOf5$b+)^!0^np<*NQ6 zpyAf8#&^?pskd(lN-C;)deg0q2WI;4DLJ>T;xG%?f%-Dn!Ht^IRAB z!0U#gX5cLJ2(vl*6 z#*yi-&zxXR?TyX7Uxww*uL4s^KM|>wzmJM^U^61&uvK2k@fia|*A%!mj7v1M->A7WeKz+XcR3Zl-|Ey)0vK@YnwG`d4tq1UOsDcv z#z+fbiYd7Zl$_q~+^+kJlSU9j8ae-s`bw;bdre;OHe|(rvPrjRWx~y--!7=Halpq}`>8t@_TiEk5%L1JY+})EA`1m_6S{<+IFhxbt9AtVTL+h; zev1Vs)`BOn2T0=)1F{K_)96 z$Dg5+loZV`9#UGV%B3=Q7En-w4vvLN6tG$}>CZ$u)M}&Quta;zu;z!=(t+B|#r4A) znuzO{P*~`?K}lJdIK5b2S&yN7F#Ka(j+Iy literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/shapeview.png b/dox/user_guides/inspector/images/shapeview.png new file mode 100644 index 0000000000000000000000000000000000000000..842fd1bc0452e92de70f1b3be04c4c774937a41c GIT binary patch literal 32945 zcmaI71yo$kwk_O1@ZjzQlHl$xp>YWW_dsw9(6~cz3&FLKAi>=w1Zli+mjrir{hNH} z-1EPC?|Y2Fpm$T%yJ~mUnrqIvD*U~&3tnIVFz5JXWtaE)M_A+otG~l<%nN{lhw;IqRcA z^yg8DqbkxIJdXT9DVTC)`x32ab#hXllE}qr7#6;*eQ8hq!fTf{soyrG5xpx-GWi4+vJT+Rkung17xh1+!=5Ybhd)EXjJ)c4=n~0igULvB>?iaLDyDMe z_jET!`27E$pr0lu6uVr{uVLS*I5Yg;7fjf&uNC(56Rn%(?~BUuHf`?>M?tqkM^B*L z-$wrZIU-ekzm7x5wvh-%L_`7Mv((Z?IS^=O9^{Hz4eq($trD5Zi9qw`y$>KrkJiqV zmVoW(&hDVK5mnO(^OA(hSdA`0`)TQHbI{1hih_!$2isCn?%$r`M^+OUK56z&Q*(Cb zeY6cfpi)r7B0X|8;jQkr(`x~~!w|BOIBqFl?9*w%l~358{iTc2z& zj!{_bNKdR1gABVK(IpQDFg*3wD{5Z+osH`}c4WiYft!fLmd@9vUFDPD&?3*4YJU4g zpo;e*juqeX-S=uqr+X_;OM}d-;AHw+jf%lc=$CRuJ(+#Cz|@{QW{`2WK?;!OUfY6wVaxU#Pmd$B6Tdgo0*klU zJ`&*~9z%F4=sMSEZTI5_Ag`rthSSPS$g1XdCQk1r&oq0Zm~n+t!kg;}zD^&E=euGD z@-B@=EKuU)I=(~YM`y+#=7=GpDvFdPlLQ$~5=xR#;(Uu${dLr2vGZf1p@bh{&_l98 z?P6nVdnY*;gcs}MEthb$!I*hjr1W4pH3{A!E=&s3g~X-A0<9%9TR258fJN= zW&K{;oU^;fwo<7BFW8GIVP*Oiscy@;IUjrQof<=8{W1(!Iby8$*Ctf(fPaFXqXqy4 z=w3z7;=DznRROvZ1-f~c_S>$L9p%Sn_=eeQK>TVwo9%V*SCt_vpR+9AjaauwQ#M@# z+CYXq&g@3fv`bT>M77`hJtSqTCEMOHXfAuN=36cyV*VX#8mIH+$m9vv0@-@%@$~hp+(Dr4|14m@ad=N^Dha{g?*LGc+12%~LfiYA zs{DrmthsdJ-H}j*C>%ii=_CvYCzaZfb{oNh=gnnUlDsaCZI$0?A&1sR)kw=&{-}R9K0EM!gz8>vey&9--|y;(?3eP**?IoTU9li;lu*aHLdQC4CVUkN zth*x49b1QddW*`0-{UD0#>c%CQJD^drra2Ezh(C|jN7_GHz73d!^Yg6KX=Plq6BNB zKPHn>mOn_%0bRjc>g(=jF{vcYH@!#S(SK0cp;$bQ5APOjXal; zPbUyRsq~Iprt_(%(>psv(NHJ_pJH6!pBnH(Y1GUDIi>sW&Uzs2^Z26xbGDj3yZ$SE z(;AHadfBv&(Uy>d9j8nG~6_4y))fZl;5oo%f;D)wPyUn=DrAxufU(l~gNkcHU11 zpDM|x&4wqD2gq*nHkQ=gP21D$%C=ZIH2Lu?@?8C}37 zV1sA3swCE?o)-}wv>2KQ>d<@3k7Q9}XGr$2 za72zdJ_s*L$Lf3gZ~w5^A?N@O)Sb6U#)9#{Q;(3jfqZ6>W>HxeMop=x_zW*PAl%e>xnC=h#$7t@fL4;w#lJ7#e#e-dzwt5amrY_5RT9RsgX@@tt}MG`vDM7#lhD%dN0DO)7c*pk6H( z0hWIB^eIsOD2;|$GF3@)s3gYB?H5PzM+p>RC859*E-*N+uVpF(`PJ^SbHJwPfi@YN zShb2+?$U(hXj^R&a~xPyg{)*>(3fxNDl&HT%4dZZq|+_tvy$9>!#0LS)%E8TYr?`e zF!l~Wz$zvQ`lA|$fZh!q#WM0uJM?OJy8kIzH>}XGC}HtnUO?uMJ7H8bK6qOZ=D9If zxP5LQrJ}$=FO}+^=CB$o`9U~(_4HMkmX!F--X5Xw_Ay!ejtL6>! zlL49|tLBF(neH+8H!*3QW|+SSsgf!psmzV;$CGz{i9Hr_dLN2;$7QwLgSV-kb}PpG z+c7?h%Ct z19f!4_i+vyCwT)#xkm{YkvG&2L4N0*&1R|(4~ZQ{4Z@EZkB+M~vh6bt;ph7u(Z0cC zF35|{P!WvPBZ-UHrIDes2Hxf$dSjkLCfx6uw3F15z^nOYUBR1a)Ke9wxGnY>KCLD7 zyj1(v-&iR#W1ODg*ky4QB)=opoizvd+jeknUoJy0_v98lV#pN-lW$u!-L?dwL=d+3 zaRUj_5!VG9F5}vUn>OU5T-pmcWlm{H_qoE=viudQ{OXA0;3> zgM7c+x!0G-S@4xQiPMgRl<1~pu#C#b+Oh4gnBv!3#IC!}eaHqx?7AoVC(eC#^N>Zs zyxTIhW~wMqsNdt8TiheBE1&a7W>J;aP|>rl4*D;-!g)B3ixZ*Ducut0P0{updv82- ziaL@@3U@9y=-axjPZE=N@+bHNre$AACe@i86Fw`FFTN1Bq^TXwMTYtnPt3Jm#fJB-~u?Ha}X332lk%548*aNd4(Z>IbB zM`$}~qHr7Q>Fy~zZ{{iNaebI?CwBQ7uW2}-A?T0S$&1X6i&ugVaX7BDZav65(;W{g z3|)bTM^DWWXD9ct6pSxn|W@eU>XdQe#dp_ERN&JzaNanLOUp>KJvM zJB(*{+P=h1Kx9r2OdqK-Y1!As>`t};MSh#ds8dM5I@v%IcaR%xb_(zmdJ>EqGHff0 z^lRBGb@E*BwXyMF?2WIbXR*t0O)_a=Jg^R6L=Q1Oq0VY}c%y;z;C;g5sFRr9V&*ZZ zp1NiMGRP31RW@VPD4Wq>-}U9|pDMVL@gj2S?^m$tTr+(#P)0Xp5bgf%)Zd$FOnaCoaiw z;9T5cFMSK?apD%H@|Mx++to-{u6NZ?(~{^}WkHebdCjDt`GD*1zMam3=&M)WZOH&* ze<}K!LZK()&c1{skI#9ytRhw&7iW2M#0Q5zwxkQ}w3lf}2J)3~%xJP22wbvnyl<>@ z4cAC0@Hc$W%FFnNn;6H{$_Zz1i$#g|+){#*uHJYr^M0I-F>VEm{5n!y!y)L1BUm_! zL3!m7K&c_re!mCKfr5=dJy`@Zp4%cTgAVUCm5Xn#cYo)b@Cyf%f*N~kzO+K_Io6niIf!0S9$ygmwsYOhQUdHAAhjT=`&UL5$ zCN^QXtvq|(3Sr+)*<^_Dvg8;hQp1Hj{k;3#9^~A@?~<_X#==k9&;5Lb;k0~j$6@4& z2bQamZ6mi|wd{0-cPOvi61As3La3gq1Ze?QIU4q^cs%O==OJC$ZOmW z!A~~xA5=9BJ>uGnM0IgYPPyi*>AUDG4G(tl>)+l!?LrT5)tJ$6nbeO}Tt8|>2{B~L z2RBAIq=S4+;6g);P602m$8H=Vdi57EA02DOTh{Gzm+FnoI=^jU{VL|8fu@7_h<@ax z<$DQA7fS9-vsUC=tbFWRTe=cCh?1E+G{N!xqKz+TihkwS9qt7U7PtlF1gm>r`P4cs zJBqA4&dNb=IQwQ+k6#dJM%bF+dw6@6vucWLUG*+{thK3(_XuTuTf58Xrx>war>g^B zN#~#i-!{I(uw5UfGmPMkao)#i5UG{`Ei(+3VPzIzT)7D9vl7ZTjM0)6?&RoY_Vemz zh1&BBKE7Tea|#@!zPY+%8yCCddrI>4xUwpKJUkjZdhGPeXR2tGujn{ITDl(TkX^y^ z;4|R6V>zXWw)@k(l__{_c>!8`4{#iknGI&S1mB%g75CwMfe@r6Nm+5+v)(G#S#8vJ z$ZcgkY231;leRO+$8BkCfAI7+O@0xrXA2o1mU6EuLdw!2j51o;{0_K5WHVi$b&4>d z0XAlJzGo;SvF|252gr(xA%B9D^p&0!p6BosAy_O|_lldx0| zIqgoP`;W?TUGA$@UBMg7J&4Z^E@705Ruzga{s2diC=n+_#D}V>3&m%Fik=@bh{~9C z2K)*^4WJioX+A>;_MCT`@bkSgCDdWBHd6|{-8YdA<8p5OV;4JGay!LjyTfVJwYoAb z8>v0Z5t#vIjjYcVaI|k~eCY|k-)CwmBY(H*cb9cka1<@Q{wc|(qAAJTd|5)PZH?l* zY~_^Y9KlaOdhEzOS&-A;+@*MR`0i?*HkSXS{mkA=>cHqmOs3dgcrhUxtF`v~+nmal zYporGCx;ZBQL68L$3Hrx#GVjB(sd3TvF~63-kM7DPT+i7L)cdC8Ds3ifC1Hwjg@tA z)%a#a%GO{LiU&rO(PnR>FfL6+r1U2&f8RKM;N5(t0A9YWZStk}k=(~CXVrVX(F0J{ z3hpQjp}!BaI;NJBgJ;S&I3yITHi{EBNUOG3s#qbU%`Sqp!`>J!REl&nt0h>lSkbYp z=;>(mQ#;3;Rb>E;)z|)}oc`eeE6b&8=g6DL=gAG)54{(ppqxNSi9gRt*8PvN%$t5UXj+f$n7@rxOwih3kS=hx$qfYx~x@`Na2)Tn1S zbrUr6NcNBkzLgWa;(IKJK!wCVZ5mCm-S0yu8Vs()N>UDI@9tJ)Q~k<$w;`5gT^!*@ z!;hR4zNhc3OJWX0_mb_>kMz!4ih{axb)Z{nsk|)DB9`E$g3+xS1kPXLWN9pYTd!k- zZS<()GBoRFyy3FXgV2=fS||9az~MVpvxtO)&qG-~Jh*G?63vaU?&Xq-Au2k$gh+^L zWH&q8?j^z?O^Tqg4!Lk8v!H&vw~miBIG#@BS2ar7IMd)N{Y1H$YeG7VbnOg6Ta&68apu4uNG6WQ;>?22qFXOU7?3?toEeic z3>fMg)-yM!b755}{BS-2+8iRO1D=XR0sQ*|je>$vSpficxMSu$31q;}b3heJLCi;; z#)7$Oq>^XG%l1E%yMOpO08mOzXyhAO5eaoWC14VIlUu#nv) z_mC)|2q>6t?42!5$sJ_=_bYAs;XA_OD>{^JzVYAH>MZo7cm`N(2)b-M3Zv$q-0O zLIFQP@yMm&+uWFKo(o}qs5Y-W*PuM^^t7dKfTh+UUXGv)GH>1NNEK|{CPO1xpWkT< z3Lpd6=d^oP7aTg2*xIjY44OgVPE8q1#5ZgX&i9E-TI-H^N`ccQh!I2$6eY$k;DHl? zhykBK*$__Di#Zh`2t43tm=g$8Bs#@_kA@L|Do6-mUxIz0hL!;kOYFYVd#9K%%Axfn zgb80j6bv0)YYr@PD^GU|sf8PLxk%c*6FK~}=K&{0$Uwq2&Px@qoeL6B_`xo^t_jf$ z8r*bjX+gBv@~mxXk+wM#Ebrlg2Z#fhAMZ6K2}9;=>tB5qrb6#T0kB)`hO}>{*?gy- z4CF{v^!&0qrDaqWvycBOJ69*-z?#nimUnGx|Kv0~lS;RyGW%d{RC1OUmwmCu_@*KE z)eG$!)9C7hf*%Z0pYJ+r5gb_w;Di$m%)VELJ%9{qI=~3Lc8*H>*O^ zNxspN4g0V_(P@;OUHmxBF3CGJbu8Zy+d)XpOwqs7j|C70AAV0kWGto+HJ_pV@=09> zhbTgQlVVIDf{5sr8wWN~rONAx@=eVzBA5Vn3fMx5B8<9PbdCinT}jc`D@9{6?wYnt zx>}Zy=Y4p*;g+nlBV1Kac-$fUA~MazP$0jGkN&tPH$yl6*_bQ0&soKL`MWv_6FmS> z+iR{dSv!vfND+nQU?GUBOKvMH1`{IBDD=G-ms8SmBQm7t>p*Q?Ua7U(@ekNExW-ub zT)wp^*o5dcN(VTWGnmM3iU>UsiE!wWY0O z5{#CRPY;ftFHC_{&)$1Vd0qfg2z8rM{sbZcu2TiPEOxI` z4>0Nkp4S(Dj}G{N&*>;3WP+ooioC!Z~isIL8eW(o?5A7#_r z>A!!~&R2}ZQ}EC!|89!{D3XSThJsiVN$SlU)s0^jGJD!vR#l_Jwm1XtMFWEpz0(*-ZtN*(FYFL z&J}IlVv9Jcg3}|^xffun7M7i}<&VrYJgk_i_JgUT>^D&xFNjcpqb&D92>w>90m#45 zfxY^q*Z@FE6>jAAwnW2kWaJd-c^p6N2mn9~fhbaVf*(b%HM}s-&o$Nl=8}XU$w~#N zAbe-Oot4{kDi`j1xv;ept~FVJ4%q`;J3rj_a{p``KSvI=bcm{-Z;hVX4j0-z zII#e0jFrt>ck#@Pzna%WmGAQPzOF_d)3#6LE%bnpKEybG{W1vSkb{;;79DStY=rYJ z%dU+QdQPHO@Hn5oLSo=;-%P$@&dfjnq}U?;UqT*U)WTRtwe-~@@O=A-YJ!OW{*t_{ zxZ}R5rl~|y>}J7wX1c!C%;%=O+23@sQAO@6zj zVS+8nvCA3xM$^z5`Wd1D$c9t7@p?z=@QGHrejH@(v(PQu(FD zo{`(3n%jp|yGwPj@XycAUgbWep*7ZpCB|$4wd%a?C39$$j9WXqX%!v`Sr|J@emK*) zwd$xlPNcYv-kLZUZJ7A5*eFZoUeVxeNtP-dC%Q0j3y@AzC9Sy@szdWp;V!NZYp2D{ zW7A}lkIc3~#rizx8LUgBJ@I3F5DM8wxo@{Gm8=Otm>YHo z30Ju?^ZL%D#BSW?hoMOYIMA7#-N{eBb>TvpeqrBmQ|`Os>bLp+L?8haQ4zque+9lr z@0~I76RCawsgzFa2is>n7D==zkv9O>E}n?o0N_;iVw zOE+yWc1f`#VliZ3q8CQ#EE#NoBf-hg~ub zb$@%#?1IbDv-)*=qg}blP8R0plDc=W0ll+;4aj$)XFvj)-N^S3pU;N(V z6q3}<`|%~$Hr^{kO!%MTBoW%5w5gYUu9n7mCw z?jCe#y2_?Sl}T~B1`vAVA8Q?4fZ|7+kfl&w$Q`E*DV(0sAu7@Crq?0N3a&<$UItKtGW9= zAKXoBK8jrXe!T-b+E|@9O?&@EL!OvdgrO_s4G>7zpw|$RVNl2>OO&+?Ef?;n>lW%| zx~>!4To zX1Z2>?@E%moeYd{3-o5Sy+KM^>ZcKohW=Sb6N83W65QNhhem?@wr4bhJ?b;(7Bq<( zPBkqr<$<@9Gl*p$wQ5f-Wq+-s`%|!BT9{|pJr2U<;zYq~laT@dNI%)9Lk{UYopOL4hpZ(K$bA%t*p8NCPk~9?NBq0!%_W2T(#fwZnm+^K8B2AOrxr zt@bgZ4pvt-BCQlH@oQ5HoykBPzmtaa4j5ipD#p!*zn|PbdqvurO`OgFqXO)Q#zU*1 zTtoxyfFeXQ?Rh0C|H`P1zmDGlhY&grpJMItUg6h?ovs0tTf}GoNReKb{&Yn$=QnDU zm@=|9YD;LaUJKzb`>{ZrT%2=Km~jV4c^?ylxzsUdJB_D}f4fHfc=tO9YXF+Ymu0>=)8|~PDAS-96ymPub%C28WBdSm?~AM;z~AQY?J|GC z=^j+mF;_#34=wV+Nc?#ceIUL`bvmp1CnuCN7)%)9%O7(Ua5=WB$W2EQ63vSIf_59x zl;!`D*ayy&4zpn&L=;8{t1xpOPMWb;!YFdUc0v_Fq(jF8Z`<{1q?5EEYqB#U?bC)`Oo!7(gmC$r zDIZ42R+v_Dk`!k`!0&V#`C2=aZvm?F1ty;183jq%1Y@BN2i#h(>gt5AE+v;OX%gn} z;4OXR>}+gLL}?1?r3nPttL=um)Wj$f#9pGty?=A0O{7qw6S2X$YV9d&B8Q@M#6#zN zA#6A4THhVORQqjz*ab75x+J$?PV_f0vQia4{H<;uYy~Kj==}$*jFz$y*T@`N|DXY5 zpj&6BjY*%kR7cdTGlmhfowd)qFRe7Z)8+Z{S9%uctdR*KpiN?`U+g1QJ)UxFQJPr| zCRp_J@+N&_rinJPmZ=eq%I)Pa24I8i+^8rnW5pJm=8e}&NCOul&L6bpXI0Q;eFuIB zkmgE=XPnqL> zF{M>PtM_lVQq6VVoCmWEij~JP(ACwwD27bod!qx!3bk_tHVQuRZ6Evc>#L-SxbBok zxPD)3^|I9|8Pm0n{KnMwURl~}HAAuib27P zZ`uy4@)ZYPi%4XQr3rfqSx7C`Ot`eT7bjh7`*4S4LmYw0RDn2O%=YOTD`9l&1SUxw ziPKvrEGWnP;Y7@Hdzpae-kK2ZG1Tld7*O@Aviwcbcw5z1m#FKLYK7Y0^a68P);0|D z^7faO%=u%6CC&+2@my(}W68HwVtj8j`*(=VJ{;(J*jW|3pLjze7m}zz`bRV>Za+U! zKoHxCUYLKGZ6pRQ@&ovsEyCXNT>fhfTK3LH0;SP=y$+jXnhO?)B9QjsnYw>8ieyp1 z5mVjU>viZg#Blxjp5em0!ZpU6IH(hG`O9ELv)VoNvgBY3r~TeeO}8LeK0tF?t4O@} zQ?em7_y}#oE@|vbU(Ltr$O?O@u+taRCEMg!fy?=p>2E}aEjfCAS>yiMTLp}vq;cSw z#C;5Kzglurm;o&$OuwALi&bL0Dwsf6gNxN+*(E9G(H$gWXyXRleFps-hfXXkk~q?d z<`M_GUf0$s>OfWzi;)`D7DARvHu#5u>FXa$sBCUp0wyZne~hnSkxU)Vo||8KWw1D% zx*(`xS`<#cM!);36uibrunHuFtRyhw-iSoBMiE86;}WNz#%a(&Vkvk_5hgtv6^;{W z@GN~D@)y#>*lceJ|1aa1c+M5R8GB)3Oi6l;_}Vu|;m%LUr?+{sA(!7=LBb|G;+)v!OV{-%?h;YNfqOpOs-#J*W?LF0zRg{qWfr*StGYEU)m%WpCpH0GvgE?j#mP62}`=n z)prqIVm-F=ClCCrh9%qa%0iNH9=`*2bPr>JafFuG(k>vM?OV7B^uMUW?-`ZbE2cU2 zvZf}ca?+2EB&_?hIQKI(0~m|HoWNMZWX6w;Nz;1;S;8m-uF`W3n3+nqd1t%*#DGRaj>^9PGRr<@xF`=Yf}fOpkDe$K5d+!?Mqs~ET0%&{zFDpZAzaj z#Neo)#i>L42$d&HFxKvv)*vPNl78;7vkzSBn@wkcs z)7eJ%n-FOO8rwK6$KXQ{q}JBqs*2q24jOiPh>Q{{g8KeXF6E+NXAw!?B*`R~TSiec zgOmFvF@LsP<%Kj1gy{EaaR&BLajM$C*CW5E5Xdm3*_swq81+~Pk_*Ib#*k80RrIMf z6`v(-?O zzEZ5gcvk#%%-aIX7i$>ZxvRw`<+-6$zS`}4is-$3%kEtS5#(U#)`sJfD(&1Bvow7* zy;r6uvc^BI@8Sr#B4=F?TF+LlbtI2L)W984e&U479#W%On9vwtqnNQDmM?%~HD(k!7xg&ciB+Vqbi_6JRLgJbArP`~JLXIOJ%$>H{gQ^GLt=>= zw5oJ!dNcE`y-f;2iAbnW?VJ}dZB+IKVN#`ZQa}#E-6rKTQ*q|$Vc3k~r3ce?Dfv|J% zg7uUeECU>bjq9bOjoIibLKM;8QJDaA*_UBu0OLGM?eA+I^Dd_*8M?-gW9>N|S0$|$H8XyZMBAZA$a ztWpUX5p{Kpa^Okg4Lspm8iVOa78Zw5<1D&9B@;qfh>5Yo8izKueRt%f2c8kQWxj`e~ol|1Y3RQXjLOR-^V((K={paFpn8Leg|(y42y+%- zHHc#p=xhSkw>CrcfM1LBjf5)|V`SA{{0* z%Am_G$&E?)_df87CAlj+WmP&9Ucra!uW%*!wy8+5qk|Ak9L0|#y=7@gy zi64#~k*y`pjfol719$ujoo%!yl4xho2v!tf6+2$-03^DBH*+pClCVlOUzccAsc`?; zYN-?KDL8zo#8y}5k@hFqxa6R{>q=?LuY^cou)680B;9Mj6l2M~HCxAHU3A5o(Jo;n zGT$~MtKzZgVXyY4#v=xE#CPE$q=;7K4LkXfSMQ6zx*d%#k@H$g?{ehxbR0l;fyVn( z*pWUVED;rLm!v)iHb!|+pF?K~)ZT8jd2I&C_d?ldiB>j+%R+NAo6#R~ij(LUHu7H# zk1Ws9{qn5YSSog;x6`3G^3HfI7QdGc!%~byl>ZzXihh zN|7o2nHAE;6YsTA-iiIuAHuqvBw#6CI3x1+%|)c0*EF-UYBu1aLq7yYB~a;uV`b zQ`X+N%ThIuVA13ZReiH}zCYKrrhV|M>%hT0zpvcmhbK9I>QethWqO3R1;Whfi3ZgM ztT{`cs3V!>>t@xpV`!Lhsl1ORn!Jh7-}xP*_ZY^Satk>EZZV`x9Rjq;v6+dtfLm?{ zbu;pv?i&LHb#yOr1PPd!-sNJ4ND8t_IWBJ?xk>~) zx(arxPWdy%-|@-|hbUV>T0IZ%?F~Jk2`(z$dpynF(RY0iuStz#5m$(qQ~GujDSBkv z1CUbyS1Ak4ZUqkpKHgoD$A3ttmk&5`LJ{|C^5@sVH zBLpp^+dF4F!yfGmJ>09y%k5#ll?1}xbcc4G1JqC<`?%nb`w9Eoxy~^{L!yRps-|_t zh!HJGve5$VgX9Q&29wijwTX)_9isPyP;r}s3CTBzJ{w(!1`3!@HO5W}40yfOd$F=6 zYYq+9niO){kz{9q4*M zz?eW4!$|xwLyl#`R^2;wXjG9~VZ$jY7a;}bz-@t-=pnj0u$Q88imAM8^wn?FHeQyy3T&1arJjxUI@<7gw zYo>!dLpBwqqrm)`1vxfc`)XK9=n4e;t6znefjK-%qRp6CWEjY}-fo8pJMH9-4t>f}FsGX0K;Tqes{cMtxOqKy^O5CLL0@yPcXolkozp0XQUJij;KpF`RN2P%NCr4X8ss6@D;A3i^;OUFIcft8R`fLxXC7y=+S9>#} z=pma9!pxp?MwdqVyM`4bVb%KTtq+$A=c|!y0~)CR&8=TjTbQGfFCUfvW@!W2cllx| zccNx5ibLH0zIPEx zj)AIKG=r=cWoM-Go(9|X6?p=vapM1oZmS-B7w(yd-QTd&mIdYiO?dEA-ot{4wIiRN4W983e*I`i<*cbk;G6o|x$U>-0mT$Y%E`P3N&Z&12^WV^o4 zY0P<~DKt@E?w~KrC})~+8JynERx|RO-Q7+6HLR`IM6l{^L1C@uQEWXZ1H-x#nv?N9 zyG$Y^!*qcr;Ex**-Rz}hJ!n&muuUm?F3CVobwYL8%XHxe<4+typTnftQQp?U79gp< z^DvJZ%&AXNd@CY(vRhK2DHD>jT;2X<>_5hAdavX2v{Q>J$II1f^R2oa z*v6_#Kd^;gyk$MtgeCS?-FC@vfjBSWYuc3L(}T3nJOAbIw7tvedl8%Iq^}cMoEL#j z#!!6-V3F_ur!9OM0u4Lb7(2;+9c6)uXC3}t8QJ-uxzE9*cDaHw9?(ybZx4bI-^9S4SeogodVcJQ`?7KPyYt0>^rT?_R^USI5svc0B+ryuPg{i^V2+tvzN)DamHad7! zR5mu>cq#u=`Twt*xx#cagb>o>(#71KVmhEcaU_@v3F@3tC+sVAlPip)pmQh*CPISn z7|yDfUnxE9AO58`QU676T<>KIkFqO#qPLUu3O=xN!t9%`QC?m_+T_&v2Q)nfT1g=W zx{i#yhICcshJLxdT8^?fEX_#N&Wf6|Zu0?gufOGp?AUL5F(A{az5P{jqVqmp+1(t* zbJkxFy&461eU*%k)!0d~qiF{A7n^}mE-uybeauKesLZkRTXJ+N&Kjn@z7uC@W7_rO zP6^coHu~Q)6^Me(F-r!12~&+k*_A}<=~As()2=&{F|LgLhWOooxqfx;hXb9u8x4Jg z^I4~zU?L`QZ29DG{37V5t;5>n=6{d^9st-T`hQkB9D6S`WM+$92feGC67@U|UStXq*a|4VRvx`u z@e33^38yNo@XOqe2jA<|A+zV%U%tl`IaanemaLiP`*@uOai-Re(*VkUpsn%IEuC3n>-`ej z2T!dPwz|oz?#5WB3$W(ZY!+K&&b__{g+qDws*;7up=HH=^ost5Fc0&;VIIq$I=6rGvMR{{%Z_5xb-@mnnKdQmaLjs1 zWYfj5i}-onEZIpLpPUBKE*s3kX%zLOhoL&}+NeKc>ZA~PQQ zaYCFUCGqiLbnUfq<_dMAb1dDD#DWZYYnz05=-6%UJSD)_=JUGxvk+)yx4gBPXg^0v zp}xC^rDxEt_LIbh2^l-1;`&eLRxix2`p&jg$Fg`b4QdXaF;})%wf4;-v~0K{Jj&jp zPRr3}R$wUUuY3$*uBM+dnP^5uU|X4CJV(zu7^?XW_M?=nqIy}3fb9S0vS2~K!(V%! z_J1jlC<`0?p{+xL8_bSB?#S^iJHNI%#+_N%cNgB&+$%ihN|7nL3QB>%7Y)nM>wx`< zh9%#W8?!jQ_QwqfuHH3yY=}gLxgQu_wEUa3rC&8ZTUX^~Zl4W=Q+HBKADcT3>t)}{ z~FS7a_ak8zS*6^R18&jc*J3OKO${6D22Qm(_{dZwgHllz1BKc})~P^dO5O zlfp_S3WbcTW7Yx<)#14$ZS`LYVgkgT0p+{|7XL5-EW}4mTa-I#_FDAvlZ`#!utRp< z6rv{_Rz75YUL%;R(<*wuylbAW`42l2Hs<2S8&+$|$lnH-OWiHi4+H&ZtFj%DZ7(8h zm_Y1Hno70-dA|kPZ-?lF1Kv=(Tld zvvh_L#lU};^-;VsFw)WOQ}g+TpkhvM&Om0~nk(LXIiFP}xbxc5Kv-_x4~|RZ2NnZOtTzz`N zg%Qr?C>S2KAxyW9=B3jHUdxV_2W@m%Af?yuyvCP?F4&&omZp3B9$o{DY1RJZp?EZ~ z)(H*n$044cnCYo@VvGk>o?b$!?qxXjk)v_DcPaMB)N8x`wY-Grx)gmAB|7G3M&{h! z`+_1)hSdN+O`wz!eWKt28h~ZxQwj}dvm@#;Ei@P<-SQ~y7)OKRqQqL#{IkaFywd-x zuJAu5m6Q3qhE-T?^S9e|@~8h!!FU7qGdFsXs%oi*b(U=VjCT z=g+H51v6uv=L5JQsBZJ*f_1lmQA~3$^o7l5I0E?N0ALy8H`nKU4F>7}T6ni*MIlWp zfFQ7;O4IHy9)$p6Wo!w4o}1|UP?JiC{dUb?&|&&l?;iYUz&ZQ_!s{s6$$x!9%(MBF z{Q*{(0Xz8gPcsg2w^P`A6wNr{q+vZAL0YjWu!DF}CxI3O8E%w(y~yqQjrG!Jn~sO$ z?)4xU@VHak5Q0yRla&CdeR!~s?X3K0=IVPruTiWsLPZ$vs-fP1Ig1S03=JlxJyS-A z!w=wyN}CLwX1cN^}`(RRqGeto8J+eEqj1AtBx-LbOgQO4kqk&%J^ z{6h5HD{D}XLV%SbZ*Ia0(cfjDP2HZFT_g$)T^mH4cs81E^+~Fhch{=n;6v6!Qd;-s2v7hb>9_C+Opi{`Td{~DS1+yzrgq^i``+1kp7aoH6r(ojj}S!NCpQQ@4kR+2 zHZFG#b`V5e_}SDZowD&jD6X4vsZ8ZxzazPV&*j!K+9~TePU|{UiypxR=?M`Mn6Tuv z(}{jO6fo@CHNFL38P2%Yhv}T1D_13oWjsk*!N;gO-B|}I^2!b*wArjIJQqtW> zOC!<}5(3iUFi3->(jXloAu)tV35xry-=KTz`|RiayyqPLa)trMncu8?-S_pqt|j(T z$(y?nC9U>69AYAz+3IYkVb#U?ksH&bOe<-E`S9ceQL;TpYyaMDVG$avGUd{KJZZaykSf85?bA$7-Gdvod&!GXL7N zDNMX%Xf>@})Fyh)0zbR9@UdrGn?6sBIX;o{89`yAlep>rcvKzdnqrOXL49IX$W@wy zHbvl`CFgK`!`Pm|h1Ghqfa^wzvw_AwisbDgJ8LCZF*3ClewW1;)G;5Icb7&}U-xUp z$B`s+6}FEGQ&VcOOMIOR+%(7Qe2Wlppk}1Xf9xABeXeaj`S(UH*`!XpCU#+wChFbZ zc37XgFoT%ckYa645Wm!=8ybQgP3Izh$ydFi$oRq6Z0efpZH^fqv07ewrEBIt%wm4m zeEJFyt%k3CD5|ZjCa1`bk5(2MnHHQ5h2JILqE`R-7_GOsdOo>$;dLfuLUSY$EoERd zt(qqL!-}p4ue3xR=COkouyb%&FdE6!JKq$1-%$;@^cb^^zSFRowUY92>|uZ_rx-_n5G$wK(32;S z>qaVZ47@wSC+~vLz43OqwEgTSTgA}pw5)ZXHT$n7c$|Jh*3VByKJ|b+JqOU$XQ^M` zGV<^82Z)5bJNpeM-6s}{JI(H`%%`&*z6>0we)u2-s}RmBm#qJ`S(j^7`zYQ*UR=Uz1&xoYo1Dr@(WSJI4@jHTuy!{YY1%_&}aD34TCMH0VTbayS=5=2x9 zYCBb@Z@czZrT(Q)Yq8xSX1!FdFJFhp_Y8t4X4>W_g$V9%_vmgitj?qQMn^rkm6Y3s zP3Q>jlYi)ocK@W5dlN5K!WyE<46_kA6ye`BbQr3dvEv}Yx%t5E3FeZl0`GFq!F8^Aqq(hdNFR2?cbebPza7ZXfuyjPw^7rp6@FZOSCG6- zGJm18s7cX74cf#3gEP;WwVk(8ZH5$IdBNLq6uYUeS(X$vTREsy4v(wLbt{)qk*|Il zLS&`17FP0Z+&f;WsCk{cSFz~|Y8BAqG6mPeqg4mhA{GWWt9S_m;8FD-Sb1B%vOLQp z1R~;NiX-p8LRxwz#8f-`t?e-BA;HZ46{*$yA4q7!6 zDtXLB*0S6D#t$n38-AyGC37pH@m}j0Ov^+EC%Wi9C*`@4gt3Yii^TX zjqV&$bNG$XfJKXNWPLul-UsdS7-r1x3bq);lfh~-95ABF?(OlSI=n~l!%N~FRQ{Ud zv)Eo+Fw#7h=WpRv7|iPyh^%KzcYw+s1Q9YrAm@5Wh!P!xHa3ccFwcTE#Gck{HZG*J z^W;GTg1Jk6NkmDBpm)17;a>9!zwcXu&9z0LO@I+6Xx^R|2kUY9%EI1Z;Dcn3d#7t>oyDVRi2xc+B5&DW+e}#I8S6U6 z9IcwAZNOR5C>KiH)Ga?Ma{5w5Y0OM6(m}xoKJT|nf=1Hvj}n)bD1*Y*JK7yeNX&F~ zvC_A%YBDL4-(i%a)Z|_cW`bGDWN#+#tMUbh-rJZcUgXE;yQj|tTKHadzCyKom^PZpx5FUw zV?m~D^ROJW=Q9ghl*t@}u6%b()d_DI%R2uc7hTCFRV>DHh;u7e$sOTpckCl^VIhFH z43+F|tpHoAd=H%WqhG$4k}}zm-5n0aEymT$sUj;oWrNQl1xja4dS*~`Oj>sG(F)NM z@R|;UH-6~!LnT5zoALq4hnCZ}nKmSQu}< zS#FC%jz@9M3Htn!y!OJgh=azoqG{KzIC9D?9Y+kETd#GxTWxI$Qs)`Y0p(Ug^n=t@@I=n~9M?*)o()9|kgknVpd=4x5;{A{7V{PL~vyDfvgrlCXq-Fh#qqjykYb#lKSC zMhM*c$@%q_5eF*>!c)$8 z@P70H9q&1dSONS1|88Ec!441fceZrp+T~+x@V4NY+GusrP$Yl8Q*EMA+DlWi1X`U3 z2gX5HQ)g4^S;EYXi3mu{73dzhno+&-h%I9RI@eTJMIr}UvtCloHCKC>cTTGwVY5N* z61OnXJPW+dd{*^(#>>?qY@9d>5BY`(;vVVj{v{z~XC>MXykJ!3kvT8zb{Ob13W(I5 z1H*0$oTWzIp&?fo>@XT2ghxZ1F(7L5J-!Wv=9fuE@6(3~4FIkJHgn zs|ksq`B_@CoxBqQDNx!h)2R_xH-Wfi@R%-*{ayc-h;F8w5#l}Gm~1eG_ZIywQSzBB zq5##A3p&guw)Ko)02-0A?*!(bmHk3M;i9Kx6}S3fw9@IbE~P{2VM{T6_{ovbw*DjT z6Mn_&mBM!3!vI+mUF<;a=iFP2)Mm5Ck_L|(OD&B)t)~|(n4_+}X9bOoufrkO%NO`4 zW?Ywzkw8fud~nlm7w+ln8yXypour{l;?~RNH}881&n9K7m&dzWtC}v|aX1;G<@$cg z!nh6vf}BKuRv%bUu-J$L+W+t2X*nvJ-rV@Z=W}B?lNiLj*SZ>Rk+cFyMjqc5Y;(f@%s(^#b-S zmRgB3Oq1V}Jr1rsn%)6s(|}SAIBtE=Yor4I7sR`c?ld*~*)r=0w;}!o7yB>eX`P3M z`ug;mrOJWbC8aqYT8E}HjaG>QqmSbhKW_teqrXCtSL4oh2Ic+yJ_(cFm4PwCp$VV$ zmo}OU)Kz6*IQX^0rNZScYBpfF4kvC+Gox?NX~oz9|7f<7A8lcViiuj%&0e$k1h>Wp*=@{p~S z^A~F6VY`YQ)b*tMNMvl%yQY;h{at}oVo_Q0>3*GyisCpIFTP!`>2!EWF;A9M)Q%^e z4oPVS&pVCcEN+{&-Q>8Tq4q5@LGPwP;Pd@0liN18jN52!dZpe={ZUSKTeCm=<1!Eu z4zp4rRG&yi5D(C)A|0p%8oG3z$9T<3Kuh>_G!}n-p8Yf35~`54rz_vDI1eD$(lm*) z*|#)vkI2otaH;AllOjLt%g#PB7}AgQle>Pmh>Qpa@*y&D-t@bI z|K-pJ>@3yo;^#;{*y!C7KJvYYHK~17qkmY&#$2B6_0219H_IHTEV3+2w6R&RZ@H~_ z4(|!y5$)BvSk{k=d12Y0^p@CZQ%CXB%$K|sugjk6maE1pTTPwLe*gVCe4tcgH=vx}P|bt9FGk;?ONX{W2SP8qoJ6K-sJ*g*>g;&uex$x=4(V0f`kDk!;o_szBH;;P_*WX#sRHMJt1pF~4xO})dLCr)S{F|(kkUq* zgV(F<&h`Sy^PJjsf=pTosk?rA5wiCUwND%&Fg z{ZTXcI-WOQR@TaOvZp@WRH3sWx#Ua$?t`?Nf*0~J6P=3o z9Y{W)IjBDXivvSeF`PiF^)xBNs;jjXYstmV678Qw<_C2vOX#0PMp^GxSo#o6hU8-P z?2(0MJ^znBuf~_J==w>746d*M^^C@D=f#uk44fX9k`NlrvMkl3M;BA81u>vsB!5SR zq}m|XL-fYBLjpd1sMWwDMv})D#>7A1o;SSudsT7oe2>!<(Vrqq+qW^EtZykIr!`zc z138?@w5@`?oRm8tK@9yQkQ8wktoh79iS*uUMNVXMoNP93yvCT$4fR}7>ERQAmE*5N zKo35n_sPKH$VOQDDGYcD%IZ|k)|8I4#Wh>aEwm2Ad>ao$v6jR*RJCYV+}RGfDA^}G zlU+p7x=3&oM!}YS)PmQ1;19a82fV++1s{^aV3JL*y$>so-b=9E%Xo47;#4LS@MlbC zW^TT^vU0~}!g6noE`+TXw8>Q?Y4SCeQgo3LM-rBUcpbp_3l?}29O?P5fEklsa6bi!VXCmYq={bZ9D2&# z@&RTnW{3L0n->9n+YDKpsEAtWUcIb&BRmx`LtfWdu-#6y|SWYV5h5er`aP25)t0IZX0>QyT;xo>QnE+*W5wJ$MBiK ze55YVj-cZeaoYT#r_rXz~-#>wht2+A$7f7V#}rD1S2 z_24aGpRdk0t5NO|iT+?dx-Ff1I*dCPJh&__gi0G`Po0upumCN+Svg|6YD_<;3_yUp zHT^!N1T9qgH>(=GQ*@(l8Fy@{M2@uziruCN2Mi6(@@B_=L8E9ne1=#?cev##H@|_? zweIt%K+GVI_fUQHzG8xMX{9l~xLx{|N1~F$s9E0u9$2%C}PXR6eu#P;@dy3P`>yotbiOLkd zk5QTM%AD>3t5bOD&$gus)3(f1DT;BykV@E@)EG__7Yt|@>9^cF=P=OUHuKxd_Eus@ zHO1klSBhDQyKCS2Ks?1)-TO8b6en(_?=`kFU^1uiQZNf8Q*caI!c(|m%lG9Rx7SSL zH2FV+xrgW0^xupT-+O9)cE=*bv4ShNn6;HgwuD`AUT`2-+nSS0$_cvC@ZMxk5lAo0 zfkCILCU0Lv-|nPUSwg@zm~TG3rwIzm8lP^Sd@0Vh$PkHCba32q>Oz&Mf}1ouoJT1a zMAL-sMg1homEGQr)Gcd{P9M$cXPd+XTt(}~bedfGOmSIbvgT=~^RuNX_{n%qos|=* z=G*bhHhZaJwk^HyM*N+#3O`O=Mj7f_Uj*nWf%7+iLpnO52owDOWcMOOP(=x}B8sKN z1-ciXQ@vdebMjbEmK9r#Ch5~`{H{B4?UNnVr8_GW+Q~+_nq{~08xalMHW55>s+rfK zhl@&bEw0q8QgaVHo7?u?_pWQ7Ro6tSiposfcN(*2K?$hUn`;JN{5LIVoVdDeWAW4q z4g^vk;}|;-8fA5rnxoh&l^!Gs=+Jx%a2CH(T}=1t6Fpjxx*P+JvpwFWY(kH2O;){$ zlN>Uw^zuoUg_~xiU242*o~^~1^one+?$uO#SM@^W8rNZmgATniB#RHGuZ@c=C%}zy89hfRHO<0Y3oaN~Yie&^{3Nxt7%rNb1UTUaM(-XtzG zYHJ?wx4;g>-Y5~r{A?s4hE4FdAjAcO>NjP5r+}CHC)zhe2dyQ+l=_(wlsxZD{}RoS z?w&6g;34`nSHJU`PvY~^n<~L)*J7NKVqfKo9mOZ2O&L}Q66Cv?c3ehFM>|K+BfkCC zV-Ffe%}iszd0#0A;`Sm+M7^;*O1!-I<&0h&b=vXADVJNvf&%xW?R0TgAVjD#AH#^Oe~2vUS|GS%#sX?3(y z`A3{BK!2igxQi=a+vDAf%ANC!`n@<*tQmmjW7*NiYD!S6ETLOPc{O=k?u9LBuE%h0 zdgTdcy3@YJoQuH@!6xa`&-^QJYP!g9LPa) zYUSG3*daV<+OJNm|0yQv8(N~p~`etZsqDp+hJVCs^h)k$GLq;q+5&)j7#!-4ha|`NUwY}$vsC= z$J8z+=uYudx8jIgwZU0O`eMtONC>_Ar%Fsskl+H`uhMM{e-aAWAgI%CU`Zy%sBewrY048}|s1Q(kC+vFBGJ$^U(>b=*(oi%T#diBSv z(RjH_IE7^DlSIZ1pPu<34Wb`(QlSa{@o8zf zu;XjBQ7mJYjztUGWZDtMUM(1EAr<^>Y4gqN^8CI6*LHrWkQ$BrR8;n>gYhYR0ZqC3ZrNC)@a z4P&QmbGTPE9$)H-1hYSJ$sX1J)cu|lbSib(yz~X0>c=fMUBEL=kqqU|U{Wv-Owc@gcu}wB= z2Z9HFV8Jz{nVkAZW8vj4cL@}`3~T;s|9_uyDZadygX=c;wKna%%tw8z7GXu3K6Sg3 z_#uB&2VH-N)wcgUcG)eY769$f?Y)L=Y*j#uhVh-!3xo6p?6?z*4W@982=FHga^Tg2 zzU_h`LCmI4^0@s9Oi79*485twE^=Tzs(H^Gs*n7(O{OPle-#PXfLO=K8c5D?IEn>v z<{|aKVdT6$kEmHUFpsy;LMk1fHag!Y7DKy$Wx(Bo#!Kzomd{x_uTz_I&$34UlYgU9 z4U+Dvfv=XEQp4m{%HFfnJJya{Hl~D-N7V)-FHgl`89Y|}P|wOQ{LN;gOsnqxHyRqw z&Q!FWSl9Pk3^^qkp#tW87bb-@E7+I?yxj`nmEf;zrHw;6 zk3I@M9+ofMOuM{-a<%5XBz0D=1Au7-G3wT1_r)^huFLja?K`V2mt@&gx=UM;Q1OQo z)xu6hpRM-srNp3t;sJl<=?A4Cs%Nq1+vBsQ0@-<*%UZV-fjCp%Uc3jv9FH&-UdVdpH}SuUL71+ zI^PO1C!iNdSyIFuxMS$~E!k$2-=s)BeGZb#K7=43F$Cv%veTN*do*ySe&NNb1qnRO zg4@Z%WP^F4u9j0|!6@gW;D(a&=3M8<%7Ra&A7!jT;6Z;m{*8YLJD^KG{}Y8A$Gm_4 z**#cMvc@FrL_<>keOVkqrK}aVnIpYAb$60GMHL~5R$syy7#frEvgu5SB1N&SR3pX!7Ja^8q@a{1e0gx?Rn^G$*Yb zV@>?tgitF@!@{5Kwe$t{t;Bm5i-yiNd)^ImDP*l?FPwKjEvstv(2zQ{tr}qhyim6r zm^BvTeu3J^8+$pOpXL)sJCEYsIbNQ#D#ohIUIO8+>|Y1&sHqv2s=VFfwv0ycwhr;J&K^27%n?OwPCv{ zzS=&p&%@}Sw+UgxYgmJLM|XLC{s6D!$qx_=;z8pq7@@zumJbZ?)-?#zgMTiv1o!#* z4iOYxfNc!Of&xQ0_je1ihiM^fS15PSG`y%ra?O|U(72B7y7Vt6UG4t*o4?1oxoEiS zdb-yH0H1-LaWLND7-GjSdU4{6kHgdEtAdtZHoCXyam;G(s%H}DuPI(pU@>n{iJDF#3E@!;*}q=xLE zP<{=q7*&OxFRR=)5fjUbyV>;BkG|wtm6o0sMVu}9kNASVte=)1&$BX8sWvhwghOA; z(`f!LpOD3-_z%4{^a7LocHL(%<0fx)U^mTpjtSA3E;>5gTkhWXrrNHv^mle8fL#aA9e;mNK#hB-n&L1#0!B$w@vhdM0g^ zdWu(=%mTh@shBV&vwNYTdzY)k8Qpt7?mi{)0g%}2{v4Zy_{#aINb^VWpWd&zR@%JF zJ(EIY`tTc#b{tXI{V&lj6-drfcqdx=;K{G&UTrZlc(bpcaI zGa7zyk9YJxojSQ@>DQB~+>bx~Vbu})$Eq{)Ax=mY!-u(Kb_JAW6{19geqzY_rFt90 zEe(D+w*MJWka^FZ?ff8~XA}oXD<0yE@!)BK4v#@CJ+F-_6<+-sN5sZi`394N$k_S5 z^!vBTwaA{Mx=db#_A3W&cLk^uIUXi-=D!*+M@LdycJ8xEx z5#9OEd;+RJ@(EyAA!6P$hgbuIs+SyB$iPQ#T6X_7JN}|(!D%%FgQ9s)mK;v?s~9EL zPJTh3(l`H>PXHM_=QfwLY7pWRxvfH~P)~7NB7FrBfih#2MhiNJ6IDRq2dQxLv`zZ^bLZ)^u>4`rLQ8{W_rDOKqX+B9iPwdB>J*Gj}PxU%l)1E zhRcVX>)%pgsT1~st*^nR$+pChir|Od zBF@0+niq4nsvG}020RH^vy&MaY4QW5LIJS|)dgOEa3v{F1d^PvPcXv(Oi0N0!2<^+ zh;f6Keg)x4e4IhyjAUkqft#@>5_leVXvelmGV~A&e}i=BWF`e>5O$IiMzPyU2Jyo% zeRpsenEQ6N?tU46BqeRp+#^{#ORY8?1A+D833LXJ!Mh%TJlZ3@_DsQCQ|0^yJ@|{u zSMM$Bqda4s052tu((ij>(_0yH);0n@bgr;SsPr4Djevdz^D&#-N)ONkJ1S`P8^=s(OX{} zZ4v;wd)RSaW=yN=ySc>qK^A($aF^aH&f@Z)3A1UlH*QTGiV-&f_*Oi;prTf zm)jM=QzRA!TfkwoFi6$iBp#ihTu z48OTI^SS@ky*cw5a&L}d+?(KJxuPJq9Z!z1Hel#BJtjpyj6exZ^RL^8{F)zWa7+#f z%!6T*=4e4un`fM-jg|&Xfnnakp`CCAo_A-FckTa8LFi0geFh4`;uC0U^iM&UenbAS zwm97(*FDW5n8D0Q_Em0$*U!y6W2pKYFxq)bZ(!zhF+jErL-y(r7k!Is==w-F zIn#5K4}n}weK1l8-i_+9`F|G?%qB4LXYzJvd_MNkTsZMhIVf7xyAwtppQHb6qsn za)M&2%@e-C+-B2wGx+Y3=LasO%P-H@O4hzEvGqQQrRfLHgHMJ)<~$=^ZDWV>|6$<| zGJLNdnL;+0jlQ=N&0=*dA;w$z`@+9APV%yo;!E+#!haKcZJ)875i|kY$gu0ZYEecP zaLGxUB!HZ3pL%wLVv6ar_IrsdQ8r+>u@|lrYm0G^Sf@aiP3sfOCVIG|b%Z=ao>x4S zl^aXi1Sn=*Mrpsrn+aHp&++&GgC;pJ>#wPrgR|u@2L7rgVBnu}sZFy5G-RCr7IIICuXtjUZ2DL5nmpq)z_4_NBZ0+Qo{`f-vJCnB*A1 zVxzK^4Gvy}{ao*1o&l)ByAc)wi1`=zV4DS%1emxfjr4-RuaW>e3gDn&!-4zdOPxTs zpnK3j8q%2$T7Sq=Q z{B^k@*Ob`KXR!QLVwqQ?HwXW4vh9i+dEjV#A|id?wdzUYAG?1~ky|LiZV4})osO|7 zt+?-#uM;z!A26ha=$ygjZc^;8r+}tJ{kLB&%WPP=KN0qAG)hRqM47=PdFNx}jOe5n zkP+a2ntcJq-nc($L~OpEY_6xTUt01s&-wC)@s>~@4BAR9A7MkX@%lLK znqGqn?#h|Vk*KgCPBUJ-Sf-@C1+SW^2WLeeulc47)g8?iEq%ZA=YrprW2tij#gbh` zI4e!rZfVn2fT^7Pp(It)smk$kmG0UHp?v!D}v ztw5Kj_w!QrPdZ#!`tk3bKz!K1P&u2a@!Q`%|Maninx*2soTJ% z&eC6m#OOh}sWD?VCdJZ4dbF{nT0Gw$Jwej1o&W|VW3q?Js9w6sJ__wI#{xH>8y3f| zJ5jIzk4A%HLtx>?fV#+Cd9&qntQ7jyBDOD^e#Ob;cUE2b6(?i6_9==><*NRRj>{RC z;4%(%{SBmG3=tvgSM9=wMR)&+FLU*>6JJJ$vB_Q!_@@BGL9daZcG@|4ft#0vaQ~Oq zK=IlA+wJMK<6o#a=AGV8yFbVio7;9VgkhpE7fQpuigfEh6sGFvy=@zc*kQ==HDb-Hh>kY|u*LM!4@IsJ9Z2h9E77K~JI=|}&*YtMJ z+5giGz;?;tR3f_s=@Qb$R^W4J_=m1smoHs30eLY3EYj(+jZ>$$O@$7alBK_wYByb} zCg)qdcV4nKIiXGqza7k_?4GKL*+j9W<2g+B6ishbxwHQn{9;JymUYu3RZ9pXD-X@r z;J|iqC>-cK;WT$+yG|khvm_*7O2P*6B&+PXRT)agY9)a+=5GhbLVsV6u@KK0LcuxE z3QRqqbg+$QD`hXzwoIt3pi2=Q1j@se3Q}FwY#S?Id~_8uf~fjuTQGcsw9e~A#MD~H z7{^5lo(t{GkpK>OBUmv%?3wc*}d{V&UWcGa&<+aoy9&5<;tHNMdCc)c6RTq z-;W%eoTk*#Y$X%1^Fa%rKR@Zqy;{yS3FW$g<4s97vqj3O-UkdwccK?0-A;g5L$0$V zQAA-47`YhmOHmx>nMk}a(lTL~wNR0SM@2gp>={mmiW-G!Ay`g{T`|h64-Pb)k|vO{PlONr8(T-!23|eERSzy zV2kri2?snvbYtTo6Fk;K^q_JiBF)NbXR~6@F~r*H+&As#Y?d!c?WT5-O;8K)D1{>b zBg*Yx3&O1Kg(;@5HRmLRxO|NOp#q~4{O{ZUFaO*2e=R{&@*4XoB$S*Cx+S0(T>Q{I z!zw=@a{r(^es<(QAHK}SH-()~T0%fGm~lR_$H$D}Zr`g>*#yN^6owA1yDSi>6ken>==Y)SHyi8q&P>9no8DeONWbf^-CsssgW5_+dx5!&ulzXMLGxC^obP5VVgmhM?B(Qnn}lH`wvjOT=h|L}TgM2+ z_LudKl(lztua%+`O9rKK8-LiVUbDl*wbXP|)Sc)HLQAIN{Q*owfn~XcsL5XwB8*Xe z)QQ{e_W@CrK1gr@t?EZ;zuh9tBU)rt)}W5xaYdu_rMOXn+j_>&*ve^<2zX2^v&8M* zsM}_>SPTZZXPWooCrqww7QU{2S5?=UC}_H>$~|sxtIu;eRx`IeyZBN1LUj7He)d9X zd|Cti_SF;ObtBIX7|xd+Poj`d7JXQ!Cn^9sg4^d6NSu={xW0y-QCLW2nQ!Z5%t3s#ecn zn?!w3L%S`Zn9X+Bx_{s5lLsx=6McR_#-x2nQrkdr;a@cX)z^O~Q9}LyKgWPYH8unotie|xD^hb2vFQT->9>Ud$D|X#y;^DWzBFYW zX*R_)rRN};_|3^Ke$6fu524k@F#dD1Ta_+xL07k%D#R6n)kxBfr_u4 zf1OKM=s4Zwh%;DN%zqSf)Z9b$T<4<*GHORR@-&LGsMfZ>Dx_ZGMh1EW=`sV4-it3% zV-l2kWIw$dt(D75VY&QvIuI2P5nmC6C;0 m>>sMUxzV|Yg?=9TC&5q0sjw*bFJzC literal 0 HcmV?d00001 diff --git a/dox/user_guides/inspector/images/shapeview_elements.svg b/dox/user_guides/inspector/images/shapeview_elements.svg new file mode 100644 index 0000000000..4997a05de7 --- /dev/null +++ b/dox/user_guides/inspector/images/shapeview_elements.svg @@ -0,0 +1,142 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + TopoDS_Shape View + 3D View + + diff --git a/dox/user_guides/inspector/images/tinspector_elements.svg b/dox/user_guides/inspector/images/tinspector_elements.svg new file mode 100644 index 0000000000..b8602bb7b5 --- /dev/null +++ b/dox/user_guides/inspector/images/tinspector_elements.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dox/user_guides/inspector/images/vinspector.png b/dox/user_guides/inspector/images/vinspector.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b741712f95212afdf58e0b2c246eedbf4b4c29 GIT binary patch literal 40535 zcma&Nby$>L*FHRiQVIehAuuW}sg#le0@B?r(gI4?3?ZE=-3=m0cZYNj-AK;RF)%PN z%y0C*ectDv=R3ZA958#X*n6*a?Q5OqiV0Iymc2_zLkIu>?#jJ+tquU-bN~QYM)W3m>Enkn0n7Sz9pZ8fnwy#$3 zF)ClbTDcOFW4idME%6cyqsl)GFV;MnLV=*Q&L>Sd?L~H)KhV)<{oxe%-}4ip3IsRv zGpz+_{)u?>9sqfsf6pksEWynz1mpa@5RaY}^LYPhmbd>$Kln)gXx)9H!rXmgeMj@f z*ivuw_|ifrDx4ik=(#9?C@#K|m!1DRjGuBRdxs8vekzQXHy)

    0f{1~3G17BHY}ij(6BweCbzx6}lI8fLM|y5%Zv2dNdMKAv@Dz z>oy->`fOPDudr0?qCW^)PrlnhJ9^Ad5U9*6J|kzX5W@G5??ZZ0Tjfnq-(N(xrHi3} z96<<>yOC7yoDywsna$@runt)^BaWY1lB4Gv`9f4;Am$4( zVZL)^DZ>=<`=3Y%^Yv0p?aZ!@>+5wQ&;z-G6RyvPu|8h59gpfu}z<^H{g z1;QJh#@fLuOzP&I zrs-dSUpvb>_E#Tp0t?GP`*s61K(kv&&}-nA@WYLhb{vwihbtE{u75Y5Db33SJ(xK& z)!)05)O(6?O*|i_CmreiXGlD}A>6;aD2Y1jzxruW6@OkpKj19YU;Pz4T&5aS3o!Bc zb!+p^-*IV04CRj&7t@^n&I}-?mqd3f{(Uk1=GytmBl$a)V6|Kq%if1tZS9PZ{mYh< znVVSTt;XYP;I+yQa1l{o_}ww)NqtDo*4Gi2?ivuo~*UcG#e;VD#I3|7px2{&B00 zZ7vBnTf(nvD2c~2#ZR9ja~+!_g*&vM@8 z5&o+y(`I-+t~mO~A;iRYU(f3%xezwBf}}yUwV@~)H;(DNZv16o$sujZXR@s-ZRkWw zh*3NxO#Eh30lpz9%SV2FvE;Hhy9BQnO4lcr7qg7-1!p=KAVJ7Rp?@V*;LD6c^{_@FDk%!dTxcLa&n$?%XOX zkflHBew!NWr*(Cnm&@#>S?rS^_YO$&+T#RO7Ih3i;w_bN?X#N=8Y3vrGt|1m_r-mv zjmn}IZdTcMI`6@9M0`;s4lZjzJ(_>?mh{X^J79Zj3%Zth$<}xciGYn|OSvq2ZjWDX zXR3&wg#!!Gmz3zo`REWScq}DBKB5r(%BBBhP9{ptmM%rZeUuO}K_|EF0?R`yeU2r0<2~iD^Ci%Z`p0Q#u{CB(a#$;=(1pmrunKm6&AvKAd%Y4+RNSm0Z z;!H_^7JobZC`4xD_OgUKt=*{QvYCp-PF0%VqBM!nNH1+0MkA3WVKcwYGl4kCva}$+ z`^$&LD~A^kZ_SKpMKilIfS^)>`r=L9j?G;6?RwJ(yI35V{}{)P+oH^aXAX^5#Kcm= z#1Ge;;|s+UcF%SRCxl9@rjlD#N3GY&=~V*?{}EMoUqj^qaBd|B7&G%VRQ`S6c&Xdhu7pYKr@ z5K`BA^+Xh%P6=ypYKt@wttUacXZVTGBwhazYWI?u~0m(v)Zbcf`thw_A4 z8$iR0uc~QU05i`cwQ%syjD8z^z$5sKt8uH|N!*pisIb|@bAf<=ci^ThyGcNA zr|ql5Rp?Q!rL@Z8c~X6wM4Q=_uq*G?5`$0O4=qz&ie1bNo9aW;TbjiA8o0xCn(`s{&C^&H!J;-7cMA44$)oyqu zB6W@5vXGIE>MR@EUMXe|E!Ztd<01vgH$<$vJ2a<&&vGBaPiGwa=9Zg$_iZVHS1WGw zm!T<;(y|0Ph7|dII5A^0du^StT?9Dz37Tk}O^;9M%l6Dz@nxZEDe#JkVx@3diG?sN z+7B*#K! zZ6|ZUG4%OmTYj0?DQ8OCiBluPB|0ajpfvkhNn94#@JkEchUyg0%WT_=hrDlODgBMR zUUZ}HAi3~aj4}A8nvgJ+_nindeKf5?E{aSlFnmf+iHKEKzFbXym+@FDF{D2Vs4hRB zDrVK)O=wtmp)><*i#d2K)vEL@S&Mi(*xR8%qc*I<7+i2s+8kc`l;uBk@V(2Aj*wsBSF=0UWt~y>(P<3^ zXP|HAn;=HzYvESIge+nl_sw^IGk#3dP>D%_(TbjR5y6Oj(elW)n{x^{be+4DFDHP=K1 zdc{PSxz~0}`)S|F5o_pDX^6xK92|TD5f);w3jLA1tRveEThGkbhzUO}{^~N3`vept zF8Reo-Ex6hGXHQGE_^c2J;7GQv#>S&k5r1{qN!582=CV`*ZL90UM14-p_g9Ahucu} zCGw@$P7sh4XzxLHG*`7fnT(gw;C)2jsFF(PbKU9(+sF|%!vcX3u9fw%5NwMlAT)J?{1>r8MjE4u8og?@|7r3-L? z)sbGJ1)ZXvvv;{7f9(Fyv-(E^#Mr+f?=U@gT4N=b2z?;@8sk=g5Le<^J0l8kNA#(0 zA##0mJYvN=49t3eWgC6d1lKw1g|(sgtAdp(0xLUr=Gt5;qbIe_-FW6uCXmydIpXt4KQ2aX09gw-kQo^Oj+y!}m!Rr#cm^Uz=_WhC=!xQZ$SSMWVP-O>P zg5Mi=Odw5D^X7-8qh-jNE7+*xP2?iqU}LYo#$E~C142&GS1uC|f1K)siL=myl(vQ5 zQZ7NtR?EfjX@K9tFH_NeV16FMe>7MS^2a4aB*aXFk+VRNyJb2fH)+B%IcOx*9mea6 z0wICiXsq-X&IxWA7hJF#5hWjdU#XneCg<4D=_o zT>3xWAde{RUuj z^7sE8&9A>ZAGhtOlW2hY@Axk~>f=^PZWaRmn~$USBhc;!1h)Z-4^%{sagD&2n>+8( zR65PE!~@;HI0X+?Z9Ga5gE)VJI3hq-hl4^_x$#!A>HGEnFjq@Ivj5+G9>95zZ1cy# zl7Qz&c$?Vm@38-6>;OQ!X6)eRWZ3~OYloJ8Mrv-u=69hwGXyS0%Fca2d7EaUP4q&6 zNP=|4eLkW%Dw`%vl)rOeq}>KA1#q2#hm@0QNTPb{sbrLXTKnVWj>kT6Y(|Dc3~oG% z1Aa?F(W&8ZrV7?@Cjfa%qba$zwT>4UCPB6`T19()y1mT->;ZUI?aJr88a5M~P@8ep zS#CLor^YfY!(Q8|yFM?9si0Ub5C4#uy!xVhw`jceGZx_2uV_YTO`Do;-LmHX z=k*{NZR@5QC3e!m1?y0aRPF_>sdi(C9?o;37j8+&&WIuGc2dhE z`1U!_)++aXs?yVv8MZcC@ksCqGbHh;dhL^gIpge(uM}}JW;3pi%ZOOx)3;z{{}ZD& zR|_DLs%-6{4C#R_ak?=%_r}@1PA-5coX_ps1Cy+8LYvVR7I#qg?<}G!Ysk{m&Z5mE zGkSmeJHayh%)-^u&t=AIj|_Wo2IwsAr7+qPaxxlo5NVka+GOOZzaP$GJo{Srg7ZbZ zg*^VyRUql-X`8r1mmtARO8w@X)F+D|r4KGa({Eo6P-&j;R0;$gL>{nmw&`aDHufZ@ z1O=|oSdeuv1P*|pmXZKk#;*!F&L?&;`(OB5()+s{5_8{Mm6p3YD}#Qjpt!1))=I#B zOB$MaG@Ch{qC73yRD*+Qy#!G9$Wf_r>urg{)6VnMUsrOD)Znj#1TlJ?sba7K3s5)t z*DNOj^44(`jjcha?d!`ax_EJ6TOD07*Q#8x=w#dE@VVL#YbH9)o2J6L?SaQ_M1(wiSS2d#bB>4GAMw))As6R>3j8@Gnj#a6cWuSBRE7w`v)SNMtF z270<@cM=`bE8jnl%ayLTddica!EI9mnM-KUY?PXgAGvC_p?eEtD5o$rA|>8{awaE; z$7?67{qSLc)J`oK9JV#NyZ0;R;Wij^U!LOBB9X+##g(w8r-Pmw*cPG<3UQLV2O(x(#Eoq@`rc6sYeKc4_ z>zX$6(D^uKVgKN4y`=!NLZo8rfheMY>GiVE!NjN%Lid-@=va10`Nk#dX=zi@5%x|k zU3^@fQ0Lp`Uof!9w(`q<@{hx5+TxcZpfY-^51z?~&V`)sf#!AD+nK)0u8Ur~Kj<7J z4t&aQ9y+;08SS;-#x0C#x!$tdbHerG_fCJYSr^AC9s>wJh3C-BCu|Qa7B{efi%7AE zS+w%zmAg*x07s7{*%vr#+{SnV3e=3YZt14xoDl{?M&=Q+&dhi)afYRCsXoDzbAHNk&sgaTVseH6_X8SEG zLmOXUx2B-fwi!+GsuM|0rgvnZw|m1gxE9%urRvEh*F(yZeqyyMCYSqHzq%?O*;?VoWGB^VwGKaJw-AcY4|HDy# z0c>=V{_~M@5NnxgrT%Oqt)IvQzy9)?etBRE_dNVI9bNI*f z&n*G``lVf7803so&^0}|J1$r7ZEcSA-IyD*(B30|bEu+T+da65izFgdX}-8P^Q-Y7 zgIw{Y&<`TB20h(EFE2IkBG?@o6-uE2CdCVl^SzKTKFaE#$5KY57LA;XwX6(53FqDo zAx^uy4c1f>_kyz;J=-%;KNFh5zy~l%S?a*<1)U%>sxzC+-8@a`TbEfj>$VFik;LqN zsG0RZR6^rZ(d?7yC=i(5=y=dO?m_b=XS|H)q0r-9H5ibW-@U#{^}# z5sW|HA4AgxPO=6S?Xtdjp{jTU(X==s!-Y@`` zWX;^N*kpPj>(xH1Q(2icOn;o>aW>I8_KyNqcJn-ZWu5O={iw%YJ4A9^eHqvC5k(}^ zf@hSnJGX~JVHx0M664?$1U_B#lwlKxj-Zp~AeRlHWxIEM0>i>Z0!3HG8JEV(ATQ;| zu)1a+DtX`po+xVvHow<)dsSClE~`q7l^g5y3~OwS0qt=ujFuSKa@QW4N0^ahBHDiW zIc2_KiR41Ya^!GU#9CY2QpUz@9E^svXWuU~cSR+zE27@}}#zF_7 zU3p^zuv%%ngzvkGT+&XsIk8o8sUG%+&`LUJgU6B5C*?6`((}ZIaRS)vedWlWjWM}&xusynQ z7=>JvQiC&XmaU6Mo2j2IO{`pXfb8o%RU8E7H@TxVMOE(3l(=HF2XP>$K8{NlAVnr4 z6Ez%D-Cc9rPIeTFO{qYNz@g*LRqw&xDK>zqy2n}=3-n}=TgU3Ew|*_%MaG1y+3pDu zK^M|E_tqh!o-yQB%&(qLNHY4ksgCU|vGoz~&pSH};&^q2KZThpWQ%cpC){aZf`_@D zD|ozfqil-5Z6BqvheQK>v|>m;hWB@-qySGqg~poUA)tNe6BrlwYu<3OreCtnz!h#` zO|RG%yUFFitB|{KrU1Z;58n=%Dm}lpTrmOwa9kuQpq-W45s34f=D7bJ3N1r(Q`gG?nK?Oi#Lg>BTpmt)4%UZqQD+IyV zcV79<^8Oq2^ZWH&orx+y1c36#!U*uY$w=ui)lbwS859mA&Qu$JD$qzAo8`IndWs5P|C(7nLGHjRVec_i^6ZO-Sg2-?D z$?gs=Vie$q>YiZXBO=%aO^ab8@3gi_fiK;%BbmuIu}ef)EF;wbtl(DcWC3__KP(Qo4)*za6s&YdK2`d9@NTRgQ) zjPv`PH|6t67~AyyYikPwe9KgY9a;d-LLiL%d-a!y@f0}?`#)q<_6vWIQNEL?ia~7Q zWi7#}vf$;j<%k5CqKBw;&)s!2}pS_x-9;mJ(ID%dEMl(k@>(z#T{Lfip``OB2 zTrMV}-!l1&0NPh^Q=~8nmmu}=8j4>oLi_4|-1V#2n-jpqN2Bs|`EtS3tIF<#Y@1;WMo9*#q{*+9%ihj=sXx*hA2OW(&d=);KX{ zNfGL_1se~vxqn(LG*zk6Lq0k?k{w8|wg|!}jkRIz#wl9v~ zb#bsw(MKlazl{eiPh`PJI9JtAnaX{hSOvYIIBbBSi&g-&0V#Nymiuzi6`RN(wK;XPEIoJJD?9Ae;v=j1!-EJH z?b#lv9dOn0V8at-x5$6mUoKZY%Hepzvp-wV;H);#{j_??`EZ-*H+-M4^A9lE3!E_0 zrX|~~L}h#}jw_^8lx&e%iA~hf4CRW)!50{jjYc zY^}EZerekp_&xGE4B%U=tPQV!yuz4!y3Hi#zGSW8;SDq16=Ku4OwGYv?FikYp`52}X zQ$Ec-*J&=KNmt*<9vw@;G*fRO(~my~D=?Q<(;j}Nb9S!J8x zILwW!t82o4Hq+1@x%sqbw~{uOoWvCt002>5btVswfMzJZ(Qepfdvy2eDmKyY*tF@i zsVC(LC*Z21&nm!Pn#%W>($^dPZ_bs9i^1s6aDNtb=TnjH|9w*=Qw{hhR0aSH-7(h) z@N{PXbJ_1f#i=96e71(Dg7KOl=<8F3LP`dnTX#-MhOi*V(Ika)~i^vZqXZIH6y zxRi0@+JXtI;Y{<#WaRyp!<__o%(NOxNr*4MLG45z|D`|5wQnpy0>bpUvY~le+D)K) zG;kOP0IEEc=NScvBNmy0~0~P=f7CKJo!GGscp+KmQf^q zwnpg(l4bMxjaYNQz~@`l5ttB3a(kk_d7;c)xUCejkiH%?ENx>o+{zrynG;(X^^w+f zKyY^Hp{!wpLGO7u()OLHN90wjQu62J6S6m|z8&0-EaEc6`3^+=@tc_C(TIxyh){H5%QETOht&aOKuKdY2 z6-t&7mT^kvSJAdg>HVdW0=3DVv6K+XQTO;~1XvDY$)Ixl*3<8IKv5CbY+06ByvN)7 zGkFS2(S3tmO?9a}g@KhzEugs8)0xw1i)o*Qq%~k-365oSMUqse`?9B$YG5j(tLbBY z*$4R#I1GK>aH-WM9Z_d3wUhxKR+I`a+$XTu30Y_>TgABp}kA=IIhH!y#4y~ z8*~cm3#Md%STTNxu#f&<+C}(p6~DvNQ=5=n7Gw&aOyb@DL;vbD-p zN0>?h{SB2TKUz2XKe2%U=Mfe5k=@}Ro_xuY3L%!0_HcLCF(M!!N|Ah@z$?pzHLvhh zAfD}sV4tZ%=c6{saub&Mx2Mta3AXc*%1*ILVi(_3Yrmyh+9CK(UN=%JXyz>oIG5b} z;eE>nz??E@W09(qRZqt{QM6AHKFd)5U9^7a8(eRK*rPzR`fZVjvuO%7e;q@pnG3^hue_b7r>8seFE})y(vO9BN!R*U7lY-7v;rDbU+)$1b+ zd(#?7zNSw0&2(R7ZqDA>|GBmk@MuBcqcWETYI8wi9nTa$QkuZ>R+3Vd=j|j4Q-LT< z@yyW?zIv2xvs~nRKj-@t+mrS`(o|p9oqYVoIhH7`+g3V^MZ@Uutlctar;xGuKrO`1 zi~$h)Y3BZb-P5V4S+iq-y|+EP^plmwY5w+QDpjizr*B^$ax2=zT0)+!twB@G0x_1) zbT7~on0$TboU2M8Z*4OW9C%l_vhv5fS$qAQl(SM2=?~X{J<6+6T<1^JidYYhQa=60 zPBJzMRbWSz{@73~XY5^b+3^UIhahKKwk&y_AOWI+GV(~;0xAkK?7Ib@paHei6eOxPuD0T2sIFwbZ&1b*e57%2`y{{k$8K3dgwee52M?J@PZ*B5 zuUVlIH@PwP<0pe8&rj@wNKeyUG4&)oTDUC+`zl13RiAK~drrDbJ(W&!foUePX^qA% zZX|OurCa#h#=a>VcCNd?nq@gRBG}Sf$h=I>gqdJHc!Q;v%3o<3Yn_?Auwgb|F&w>} z6BnU1pQ(Eci7-jsc)H0ZtJca=CDka6pUT(|u$W_)$>d!KV$MGlOYkYG7# zsI$3da(qI@UH4i(nfG|)v#WgnU7ic3qMhoJ(|O|lex=^`vqcE%9O=uo#XOnDcQp(j z^H>!Zi11a`j1@QpVJE{8C(G;-s9S}@VZG4`SIx0MSwM79@bsn-J5>}W%#ZbG=&EnS z%FkVI=5CQ>(2thge99WQ%0S)u4gIwD_|-^fu&$|klCYOTfve+Xz0i`l$9clT(T*Tt z{0I7Y_bUH^H7Y_$0j0h1@43|ng6q*hT3mWB=;O0u@zPeLtx$p<^-7QKx|UxJDaUrZ zRXAq5VkVYgl1nw$deuuO4zTYjz>T3C{|9b`g#Vn!IIqy5Z)DBD@|?RG*8d(#V(h79 z#-yaZ}Q zc!E7OVb|=^+K100+vz&@@Z)u@zRkc>_Xq`8?%k`D7c_$EhDOIR>-yhk!Bc8quu>K| zD=8LGqHs0g0Q!@ADLa*?B0^$STa5y;VUij~rWd^S1WqsIW|xQyPc-4hXm$mhZAxa$Jv`i)FlDA86+Qr`h1D3_ykM<4H3oJYHXf&=UN0};OiGlAA9NG zUBDaF2Hm5VO^){VY>A&mjI+dNhanY9u2lg~ubX%GU$-IZIK4i{aC4369BRxo!+#@p zp+v~cBufj8=l8<%-TcS*N0i72=Zw~*T?1$u>S`$zfNy6E8JBJL5@X0H;)S~%^JI42 z8ZEmpP=058;eGxzRc}?CO7)@KODtql6?QWc$`W_g3vJ57~>1RV03SVIv-`*O}xUfVtXxp(mN z>1)9@PHW~fJ+JCgu#llVa7jq=ZZ>UQyspGP*o!+8K^qcgXT#=|^8E1ZJ&Snt5kHNv zW(2pYX1e;jAnlFQUzA`q)^#KcNpQsgT#` zOGc29(Z`Q2VbP+Wb5}TN;@+h@fYAl74%G`Fhmh+xvF{fG=bsI0GfyHeR~W3)_q`jF zt#MYn&%V-d9$!WjT|y^z6rn$wMpZXbLisR=6+Snqn<8K$e>xt)TDSj9_`$&1@E4<} zyM*PzzO;$os_0EE>OMaE!B%Cpu;^v|YnL&R)nHJqNBH#!_qBdPLNf`=?`%!_xulD< z%sVRSrz*&I7;@zID#hFN*w!Ujjm_zWOig;QP!-Q5fwQAv3X8)1T@SS&g~U9)tf3Ja zd#>-!I0YU6D#0sTV$iQ3N_puS?Z63GwE|Y_Y5-B(=sgkeS1}bEFI4;*B0j=}JRVBa z$~-QIG(p!&2%@&XX}&-sUY%||YU4*DfRB+g@0n3B4$(v#MJYz6ROmnGmI_ z8t>L57UWW7BlGHZZcIZw%AYiRVR zMSjWXy{2z!F;2go51x0kkuRrT>OM?irg+XI@1FF+o0^XvAk*9Gh~ZPEKk$987FG^a zupa0Zj77kodOpaWL2KmrqMuE`-vlm$WAZ}YT}$R@Y-S z20vuqXR%_fQIsSVVdgWn-!JQ;eyYQ5n@T6kbubZVU~*O5YyP1uLwnaREPQjR!^#Io zZOhOpsxR@>0#_YS zD0Od9NO^tuxeMO1o^{7EEe(z@Jsh3hnOF{RN^`010e5ZHHY4y8V)Z4Ka zjn8(DJVlQ%sku0Zag!v)g#2WeNMd(#ngA-9--WC_(KAD{cELkQ*MSW)ku_>sUgKzK zi0FGe-Vz$e$-V@eaoQ={m*H-E_vmOz0PB_<@;qJPhr%nD$~I4ycoFfipJ$#=cjfam zUq!%InyZ=-6nv-ejAadTGh=9k!i}%zp{X_%VdppyEj2sGS*9`z*xlyw>G%*fN$I3l zpO(LAcNg~-$ZxKR4dYK|W?MQLCqFb%uzQ)~eG?~`QR!|dCQ%JT-T(Rs%mxm6BFziXXrNi&K$!^zK4OR;!{n|Olso`p{W1?@|C>U{1meL7}J!H zpJRtOc*;p6;eVTkw5~HWOtSYgres0!<@hc8Tq$i1Ikw20vO3NdMQ|h{xV>I2KF6-n zgH3g?QhxoD;QPq!qKcL$%V3(NH7wJiNF@ULzOI0Q4 zo?VW!O?CfNE3U@KnqbZKF(pTmw08P9+&luRG8a83NW3e6m^VQ^Yy%%yvBuA4r{-Vn z$JwQoyX6w!X;b+cV#8u99>co%mSVmZ_{J$#pCTu2*Ry7RhKYaRB_g%8``eXXVUSEj zPvd=B46peRS~6C9n!)os2-~@6m$fUSg%kMW)7^^pJYIKrg5vJ-$wybA1`)p1yy2U! zCaJOsEtAE9y3;Kq0K7w-ekw!RXw|hgi(I=FL#_N^dGdo{qWWhe^Tg?>aJ-=>B%<)o z$SI(X35cI=utafN@o2R?;Jc-1I!-1V_8n194iF^3QFO02u?|62eIU=AzN`%k>W)U6}M^zX%4vj1Id{@?wPwjF*n6ek(& zDVMIyf~jTR+S;0=2H>SGk-LxgDilH|i)5kKvu7^dgHyN4(R&$LO=8AmqXC({f-s2S z&_s8&0?PsNj_AVi`|G96)5Vs!Wgg!OC$rhZ-Xg}XGcmiv8V&fc!pf`CghWq znVFcz9I>lg$e%Lt#)~roW?s{PY8%Ad)#QWrxGdy=Bk~M=wODr4v`4gorcVikV`Uv< z0vF#+P{$MEs0n!H0NMg+6)>9ilEH*ydn8?h3)CKkE^V6pD9LyDsQ%bDp!KLkhz_4v z;iqS(c#l=v5y6)Xvu-9T9WlKZbe3Y4R1XT2jjrh%Pe+8iKMJ?pJaNU^6E`eVcx`jZ z@$)z%0yeiQGZluvJ~=T1sZq&1u>mGR#u2(^ZQHElAm8&_w%#@->+7@4P8n2ics}gw zm6+w;HnMj@)(Gy^*m5ZFYzRyTxI5mHnLe}7nVFq|6{P@!6e{q+4=PwP^10KzQljaP zy}u|*A^}u)HGbfp-Z^p}6=jjdRn8P!%6uYnM?!!P9Pq%M2aJ8hmEL;DcIJ&A$(xBo zP?$B$wJ!#WTMiFMyOZG=oY4q>>(tXLE$R!38Gu$bnJ|0plM0>a=WrjUFs(-z`{Ec~ zO(wFn590Ew^aeigg;A^d#uEW}KNXwYLv`oxumHkmmOsR0h~<+w9q>w0U7s)sQdv}2 z6q5LnKAV!~Nqq%;=@iJ-v{!jU@#`^u{*Jq+7}Dw4YLrOP{I}iPevu=6HJT=Udei8XRS%#b^;4 z2)&qoT3Qrh1tZF|HW7Y|E%Z?*Y-CKsWu^Ch+xcqh=8UVbLC3dq2z7{wF18enD?-Io zo&^4r7e1tsI3`Wiiz`Igmf=v(xN5Yv69I2kI`cHKHn?m+GHL*~{PE1WNe_7$%$0$F z+_yV3xK&TCcXZlPS}%tk<$otnJfZxZlI+)8{oc^B>uJ~roTV4aESrr2-YuE;3{^n! z;5~HiwB!Zyiy)E2`%lrC)zes@Q;32MVx7Yp6heQ+{)>4=H_vVvkq*VDg5`yl6!zw5_#&<$HzBT`9Ji{Sj6cWKOrx2v9mMv$aBx=1e> zcHn3RnqLUKsBaZ^ra?1$04ci4ESUAap=jYfyWI%4>n%cZ3|RRXDxNxqjz>(z^dnbF zdl%hqxRGQtzFNIM)(7Eys24_?)kSzkjm`v1A2tZRE(d)hjeS<{i+blbZrS*bf`9S4 zjJlgBu$?cEwl34NV5zJ;zT^V!`?uvB8uwc;&R_PJjK_bcZ~Fx?LJl!d4tn_{VQ zO&B`mInx$9YhXnyhs=)?L$CdC%wliT&iAIzJ?Fjk$Zv@pSeQP$ zz#2Ay&A8us(zwet^-idTWV7|#(suJ>H?efGo01li$)?rbl~?XJ5q06~coHc%LT9uU2nwf!y z2gkz`*EL9vey%W8n`M6ep^r6#(q}mNskd; zagNL2f-$eDjDtppiakp63lD@j4* z+j!6OpbW~#Jd~s=w^!Wt%l2(8)vIS>mfQ*Q9erC)2BE)F=dbfVvJot4y}Q=)(jQzf z%IDqp+S@Z|$FU(iAjxb@aDZA+14bdjTQk$ov8@_XO=yi3ZQdai7R=;$U3XakSVv8e z`O#l)99CGZ_;YNaux+|WpF!g_i}`wn82j~WzHqi)zPYXs?i|nE$&EsiZ2Oxx-oxDoHrb5J zSwzj)(d?=hjhZQ1w|Q@T^v%x3&9Hg;L%pu2a}y!SV>lnCQ_zJTU91ioYZp|9SgZPi z!cpO+SaUj1%dDAN1k36tyun$?pL2DqqKx6rfGt?xc;Tk$QkBUIX_bXfcSXB@#mWG@ zf+<$T8N7DWRsAG*PGzA`Rl)3?>5#BS&mGvk%G|dr6L{^`$zDvDXqhq55N~@40Atr) zkK92>hdg>%;7?pcdYbYQ`F#K2#Gzuoq??t>N=yQMl+{k{P0kPYOwYFSra!`xlB%An zz13A!eYIH#Rew1}jXi!oV(1mOoLk3M6le3`G2ZP3q!inUBzbG#h>L!jNbbJDqj*c0 z?O9Zgp%ABLK*O8TDlw(PHXk|ftdaX6lo~X1sG_UBj5}tx7G9*@0aSUX91zXA;QI+s zj_7 znX1D^HiH$Qtq@R3Sl;bk{?H?Swo6U3vqdxP4iP%0V6KmrHgf^eAWON+I?E>>)M4Shj<%A-92wcXiTJ(){j?#198xrMq9D$6 zHa!Pl=C^(?`S91~tTLI^%;wMD(9WvfrBaK%Z(q_H`UCL}^+jQ#Q}=cC8 zCpLu(sWCj4|In{rq$g7ttY#=}VFn}-|A~VQ&QldX#8hSIOmY*oZtGfFAmdGgtpcSE zZ-Z1nhi~w@bXAv8;Qm9n{O;XRAjm-ScMJ`&wPP=f44y5S;AMzv6)=tXAC~=1A~`>@ z46woxh`*sazFqmCS&hQd|KC$pSVP%ZFS10A?a%)Gx!|LQ>)vc!65P1IRToM0&GH|_ zX}|Gz{N;GBsQ#PRVfs8uKH%h=4wa$)^@JF~cm^sw1gc<^cXj(TRqHrc{!nMMUu+re zd2Z@d*EzAY-xc2V0od!V;ZGm?Sofm9PO(p<{{;G}>^?Lh^UavA3->1VGs6+kPqu~4 z=SzjkSkU&uXsA6s>XIV|c@`~JISRJEm*$>0f}4+_4?Gz9;0v53iESdibgDFwS;9>= z698-AnIF&gl0OlZ+OzJ7AFaTz!XrIajGltw_%7u*`V>o+dHUYA5R!?$aY~@~$jct# zIJk;bg_0Q^M3*JsE!Le_Wm+#uVx;PO)3SM=@D7Ui;1D!k~D z79`0AS)3+p@*EIGM3N>aaGtNTRpvYGIk~E2o_yX6F+Ud@%84M&v}> zqvIjKQJ1Rh>#K_a?z#mLHw0AVWT`W1={~BO2<_m z;1&thkT1XPG2tH5k(r)F;qo4sUI+es3R*+)|0Qx&?Z4Q);eFhBm|9>bMM&z3R_@kH zAG;~-^&++rI>f@Br${~%)y2^=r{*U0VdCq($lZ;(`f`@&(hb-bU#sEUD>{ASc3|(I z(n_wV_+BxCCtib3mu?>9c#CvfG%_|2ILy8z{9M$QKA@Y5?Z7gFq$E%5F>Je4}vL}l|-9Q0F)0`0jV1)5&VPT8f^Xp)oo(@r zXJ*3jRc+lA^$MENry?H`a>NU0K&wCkK^r=Ak^()j5ijZcshpv9Bg>5u&~iDh$UW<; z2~IOUgn?LVA+4zOF&2*x&E)mlNJ$?U4()5OLy-2Ca~yB-&n6^S3%4d{qjy0Y%vI&3 zk-6=U$6>Or%X7)Ig?Xk=3)Bh3FjY;kPr&O(EeEb;&i8*&n)r;X`OSeqAS2{1;pk7F z@v-_YKGobz9?1-8Oj)<_>CIh43xuzm*Quo2b+DI6{?!JNw(RN6%DYn=DWTpJl_}Es zDx=bJFDQ>y20rRkB@af=rK8s4^0rDai0Do-J}S2EC+thGmh4i&SfnjZCD*RKj59id z3E8vVHL{q}$l{h+;w!p?foxa6blx6r>3EdsnJm zp)9dhjKYKprfHF#MBH(|qgI6zHi_6i9k(c1GnY*LizEcmo|=S-TtOvvIQ*9|tv>S! zZF?Cx%13mIbV`Ng+PSjERZOMH_jBd?Sk^~mFNn$eIzBCgoqR7@xu!%qkvTU?nVOkmuU^w9WLhRVUoC8H?wQ>7y!3gw z0T@bx;I-o???hGT{w@`A#02g@tnC7}!_k_3ac@cg0P^DvSEHHUkGBZzKH7Lu4PBht z1Wn0?5Qu~aedBH0%b>$CZ_n7gZeD5EqMVJq>^kd^Z3`m1Al4@Ib&MB#HP5VP-ZekE z>W?tMaqzi*a_Be~+j+<&S65u=wYRY9*+9fW?S&L7G#M+L1juDQWc|AoeRtgK%$vk7x?ka%WW9<*^T7WZv*qvKk^T>F#KRi5K8V#Z%5J$^QP;QcnO>D zp9+ETZ;-Pz`BsR2Xea!CyuEc;R*Smzje;N@(k&$o(%s$NDc#-OAs|SDba!``bayvM zBPsn(bgjMDT6^tt_W9oPe)A8mM=yN}=43qM{*7_ho|x0kfcfd3-@xATv>OWOpjO;j z4;KnvYFdc%z9kHthwq-+-Lp=cm&aM!1%3cON>KRJt_Up$m#LjaK3tETpWs^Yf$ZOyC)%p5!)@T*+Vts=~q;; z=GJ0PdGldP753CYj@ukptSn9W>X=Lw9}=ZHrjE~+f%cR^)5BdTizXnXe6N;0~rH{?aKGx_94yoZRN-@f%Pu5zmqlg`bH%H?k2l6N= zwRVmFDuX25?Afo_K;*w}b4y)}@xvEXJ=Wju7wxGSz7ji~B0%ZKQG0Lc|9j*g!cUjH z1ELe#6?J{MN@MlGVQpUCKy3qCPm2&JA^CZ{c^R`-&~Y2%TQUbcv#JX+ZTdJOkGYz+ zuy_enzem2ncg8>@Sj=yK38MC5zkli+L-1lCTJ_uE3ic=j?sZP8u^kTpC>gA1c_tB@xmnWWnTvJ7M90^ zyoKWC+^!M^@YaM0O#2cFeuPf&P%lhGgE)f1YPBg-MbfxIu$`6)`7HB*hqDS%(QV6E z^%%#QL$i%J0yeTiZL%r=(z#g5Z98QdekO1dm1R+-O(-s=#yvF9d*^0Kmz1Vw1Uax>AvI(7?^zeYfJ-~!Sb%L^ppao1au4kdW*F(Ev@8}Jm!Qty8b(!_2gCQMWF?deFnY}A4a z)8P1C4{VW=#HcE}e5}-n+C@~GM;+C(6J=}KBW&Kmo!&H2iy0*q6`#ix^{Clx21C$H zcdno`^_Gks=%Hj~vqt|c&PQ52xdL+ej*L!LyUx(B2rE-!MoGZLw;=r|N5ne4Xadhk z8%8T6x<%U~;o!b@OLOaUNnk*6d&hG@te&a6%T!&PwJAXc=EdXQk7=C_?*rgZRs`*V5iRNFQ%rU&;L#g|k9-oOne;%K!|;Le12Sx2(fV z+4HvgTIm-%tKLsg)`_}Z0$HpX$|k!Om(OA~xF`amY3qWhWRk>{NxbT;m!sloauB_U zG;;HC)tXR_B0q42U+=#ezp9-e9w0)B$rKCbO_A;N<0B*g>}nV{T#HSrre!FOoO*c< zhwU=r;w`Cag6%vhs`L_oajT*E*OUWamS`Xaa1Mrlhvi4ir409+I!tM-)nLpn!m89P zzJXVBJ!rF1Q+UYVzfpE!yacVZP#a)O#;%Lrm!GX>QzJ!}kO!TZE}iuoOHWY?gM*)d z_ulI|eSRO{Wqdim0HBi}S?3%4NXp_;*&#-#k*sZpfihPi-I{u&0ACVpf9HnlFQfQx zyONn5q~wuT50Z;>`^t5OSMwB=(>~SKW@HJN8&*G^8jN&0BjeC1OC;Uzwl7 zWMh7huR6p%r}h{lVt5Gbt>WctUfU%|MO0*<-_JnI=&}E@Z;Cl+0X3ZOIxhRfaD9eU zqu&tFft)JRA8LHgh-BfugrxA9$-&N2n6OONLsy)m%W{-=D#tivBBFtEyips^PG{|` za>(hXLCqsb8^g9iB@SMLTAk0Dx>7kr8(kuylHq2(l~F9mzRMP^*Kp#({9$ar(A=|8 zTmAuFtgPNB#rWeg7RMk~E?&9ewDUaQIBo%wm=os;E|Fy_We8fXM_sU#2`+Xi=Zxem)6?qVlH!{8+I)W@wB0#A}P&PqxQ&Ul?zb+CO5>wH* zVZL+qm*y%-?0C`q4~;ELcl~+1efgF$)Jhdg1}oV{f-+n^(E5^Ztij|Eqju6YC)SH3 ze&o>9e_5Vg!HG=u3+`(posIdvZIS52ssvesgE=%&6m;qgLX_oiXhRvx>Gy`8pfbTQ zM6FsTwc;wtqR92_WP1E3TeQyRUy@9Kb5l0hT;dyeG}{_do_)feB@_JAqEX@8lf=VR zI=JiBf+{~}tYNfEWiN~KSeM20<{P2scTJYQ*vzAhb$s7c&u3;kJ)=>-@X2Qn<=VW! zlcAE&tZ_cS0#D{BDxPZUTE8hj?jT0XtWI^tXYo?5TNka|GIyC+Gh@F7(G1_oBO{~a z0fN4Zt0fNv~ zdNxIcL$cjX_qsL$x~}`{l)7ysbAJbY1kZAQeiO}XmI9s%oW>w za;eKP>{^fM(Ps#!4a96X7d3J?Op^5_sphY=K;7$wd*G-mxw-5JXYLdEXefxN(aFZCabnPCblZdj1p!{L;?g+PL<@rn;4 zd~G5;{X&AQ6gJ)2kJ0TayUXHN&u?mRc&P0-CzVR*sKsL?--Z*F&)-&t-xwu%## zgODaxQ%~zQKr%DLmJCB?bW|xjf!`P6HwKkGpmNI+Pra~KFSE%6o2eBZ zkl`afY?!b4_?Ylsj2;!A4e1Yi$pjAO%;2uAwf2zF%cJWKOl%30#q+zs$-TW?T#^#V zntcL-d8qiNGIMG!I@h4CDRsqPNUf65)GexGD(>{S%H&=2-f1M`D5k`q$^_O-=#bF1 z0^jDlmoYl9N-^L{-tUC)b=UC?QAb#*qh(M6dCyGnD=Q^oGb9$xD7!u+W?PO4k>3X#C#VJahE4yGE!{Kz4fsOQ?Syb+uWg;}V+tq`qw1-!KFp&PyD^ENI`_a42P6 zF+R(ZS8dCRNJ;}@fW zQMu{K2)eBth$Ff|nMO^+7rOQ|;?a2D!?u#1YMUI)>Ws{?rWG3~d!|M%Zt-GPSb7|b zdF6`m#weZZ@vIjZ@ND%*7@NrNw$z%qcg|faa4WrVB~$b%kiYXR>V{^~n32-9BmmbD z?}znoR2Ug|FOq}sJnJ2v9TyrLnIz`2iOC0nm1~kWjG~aupr-bERU%#p}$qDITdRE)S)_UKCBEsZvkJ%2>-~5|M|AZ+He{O2!48u-68j$EVG@X)$@F26cc)vY4Cg9x;&_$0!E$ z>v;Jf9j*^0(%bJ(k+C@) zf3e;3tAHdDYo`@K8Rp~5HVW>PmcBVee6*|}E8(4Oqyu|vp8g{*%B-MLG;`?~Y5ON( zHX*!>ng4N)5iO*!!}Er;ri~D@Eef+_aWCnarlS+E(xXzc2dR&b=o$nQv7OV4+zjKG!@phVU#o|S1L%TTD)s8xhs)TIeO-G z^;yG%@)-l?evDE4U8CkFZGrI}xQBw`Tcdo9mf+HmkTlNS{vaSV^3gyR)VxrE+OU7z zrz=teiBC7>3Ot{?Uok_!SiP#_zU5>NlWUZbk->3k)dkj>2tx=xiwFp=-H#DmnvPV!#cad`fa3R)nq4_a}*oHX^dnc<& z4=g{&RWhE16}a9ndi0 zKkj>`+%HTVNG=AKjYw@J1(NXC4ZF?NC?z9la&Eo}#w=bXV0>(}wbNH74Vf{ajUQu- zGBS=wnYFxjXwq8Da5MH<$u;zf{~V|N#G#ov!iS`qZQo3aZ010{I45VdI=176{Wf1( zU~y3_o-|rSCY1awxPuTRP-vJh0&wuV43no|R5Vq@P@}gl5D^@^9PK+QrZDrJ`V%_D z<#AbIX2`>3Ft5}ah@jl!ur{#*2_#f8AL`qP+y0IGea^%U8?A}fN{TlaMsGUGdF&@C z2}8f~Gco09T)1>az^s=4IKIw%`-0ZPnllGUbwdr$FCWC)#~V1on$JhDBoI?UeDrl4 z!atPCTH{ic$$L)ILlyPJk|Hy#<983X?7D+PVyrY*B%iHb4CZ+ZH%bpS))RHs&58t) zSwYC(`fgln-RWDq!XbM}pM+Ope20yxk^Go-{qeK2SpA}5KQ8^|4*k@7-b4Oc+px?V z`AiLzWS!i0E?0HlpvC$AH_|0O_jT;pggH!DQ_$^{W0P;uOU7@zXr!~X9gMf zpd)j5R;2p7jkt{H!qjjBPI$A>WdPN87^Wr|q+li#D%pki@x*G^2YPTY8d`BT)ZEHN zC#Mwr)bZFoNf^c(0ZrCLV zJdZ-71unPoOQx%*Lpp6cL#GlnA8gzaFB9_A3y>>B(hjb2f-fRO-vFg7hq$u5tf<^c z3;7ZfkRDdWu7ErkVxVEvexm#7N7wYm`Tx!RF3JaCaMTX(>7jJ=0dW(EC?2{ z8>8MkRV2BeK+_mGHame68RgxA$%zw<>3HvFYmx~35PyyO7(x{_tdgu=!gUK7+Img4 zP4dlAd(1(LrdcpX)+}I9-08D(H9z4m@jOOy1i7~ml}B8t)#qALN4QPx?^4I=z$~#I z;!5IgJn+@ulC}Vp+D0rW@!0U3r^O>T6z8B69(O=Np)}p(p zVbDRWtY(q&p#8{|Y@-}ng?aM$bE(YbLNH@wQ|s8+%%fkT55zvbskJb+xB>qi1V|Xr z9m91xbaHjY)N(N)ZY$*M>8Yg&Ir!t%=h6c()>57f@}a?&S$9l-n1))qZ6>QgOBR9b(7(%PbA^M=^gfjC!z&e29vN>VWRs9cEqi_X`01A*I$OX;h;}G|fH{YurD!+D z9H#H`crWGCjW|-W{6V-d_%c=+*5;}9v`!GCp!|vnDJff#ScDP!Kw(ykGz(Fq5iur} zEawr1G5S1{A<@i)>fOZvw}IgFitY{Ac&Db~zcXueNW5dRTp+^u2UTC&{=#L(J>+PexS32@ng23a=-c zr+7y`3vLDS9H%(HLtFt9kq>p&%)d3U$W*{~*U?c!c(7wH;-FW}s$cxl?)z_rxSFU+ z{l1rutJ#qU^;CL!%^A;>OKq#ow9DW?$XTsR#k7z(#jly-;*C_?5jxQhb=v)!h!VSdsFStV0I9H(R)h-{U{4F)#+bN; z8>mo5Pr)vb_AFFwXCZ0ujY)m7G-d7qegoz+xYf>1drFWNaoCxaEpIQ!(&S1uypNL! zo33+GUu-s`zf)XC7H5cOk(A9SUs&C>ut0n$$am&=Bi^rP;bg;-Z2D?x_Oh`)uHML} zHujDrrQ9&d<6QsMEX95E=0@9yQHd%+aM$XD4}_$1h#va0(OWnuTZfOMD?d(<^VL+| z=*X6Qaz7bP-A2~M#)FBNY#$LVxMqkCS8sSQSQIxGXE*VzsyJVj*9s%lwxD{Dl7Asx zo(Fw-aAGT{#QjG!m4(y6jOFNzP*IVsYN!dbSIZ+r4zpARj#;F=6!qpfrSs=x+XnH0 zR^ieT`_a+?F4bzQrtmYD78Uq;?oYW=OfGCq38q105v|1;?H2_5mV}y_`L2)66>p1Q zg3NL6M67%^SytyNm3razE`d9G>IueL(IPIpPicWZviXs}xgAGUU28M3+Ci;608E?P zy^VdT*tx%o{=_};c^vMqA}eA(wr-)WvqoEeaCR4}6buOY*BrlG;1}lwc{$@!L8p{k zXi{bDu*>HrkY1(pT6%2N_Rt$HTA!wA^UA~lIbWDPFWEe%v6o2T{6P85AH@W)`jB=! zfC0FUlJmEWpsBKd+Qj8}9E3wzw)6oC=uXCx32^CPqm(mw80I}pibHZe*KRoo_MKS+F|+OSY3G0}rv!f^U(br$v z{hmbuc>@nj+J95--nc&>{pX)_{?fp82x|2R1~Rs0B~~Okg%pr$dy%Iq!s5y9gydw^ z#{`5p(4ZfSV~$oZg7#WRmIvbn{f`;ug2cq(T_AlY7j3wMh9POQ2M;X+@|qTdP=eOE zBBUw!zcOp;*pBb({YbfP;3DdC8R86BZ*cmSaNvAe^TK-Di|?RKBI|A*?AiqaAq^0u z)r}uLvAiE%iIoS@8;y(=$me}qYOou~f&WSpN&2D-Ur{Br10f(S^=zK-e))sEnqR4d z!E3%bp6}9xnL}~{C=K+^fV`E^S;1mw98hw1M2g==%}HSdlzDBilL+#hb*kjteYEZaYi#)E-tO_2tGu11Z zz^}AIymR&@4mDAEjfI=2kC$y$KR9Cw%`CEjXuZ8JG8Ch?@=h748Q7%@1RNkmIqtbC z5B_UWPT>D=+bAupmJ_Za`GET}Ys5%Dpf+XngY(&5;|x64fB-)4_aGFgyoBe1D&m|W z5)(#g1vZSBbrvdncWbrRyouO7{;GPiAc)Mc za1(UaYn;0njZA%f6#}rWkzm>DGHQlx2qvniRv3Zwh=%UrIUE7-3B=*IIO@zY5tV`2 z7KZXGkT3+&4onUT=dC`(#>2|NTV?-uJoq6!?qF_Y_eMd?Q0#lYXy};3Eo?oEB}_k~ z7V@_GtBDrt^XMjVi`gx%;kL47amx)W9HKdDDz7Sd*=x{o3_H^E?qGr&wd1SWbDJ;7 z90X9waQ+i>xe)Yk%;n*VDfG&K{_GAh9V%grS<)nJ45(^bQRFL1=C8~!f`IRLD_iBX zzhFBZS!&tmSh2%xyjSwnY9f1?Rk+(G-bS#Po1;;)7UBO-bJ@G_^^lSpvF3^V_Q~CslEyS#kwJz(`pXFuInNTB zc#sNa$6ZKCAh|5ccylu@9k@&-+p%N1gzrPEXG$6Gd~XeIME z-bk=oH3ZXgbNI@PbU2XmPtTSq%DMmnZx9^L=g`yR>zsuEQK zRB|KqYg+Wy@{KV~2s_I=Q_Hlw(EqddhZQ^YKFD!O{O;su{1C|L> z;ybr6KM2kxCC+~cWb$}~ivT5MEa+-#2-s<2z>}8%JbCfUETEraa#$$*!O!$lvw24A zyG6kojl2uBrr}DsrP6o;xF&B0`XlN+Ompwyv0a~e@Bc@-n50W9dc(4N?(3)-+tLeY zKRHZmXg|#p=s+Xa4-1Ef=`MTiOh!ewunZ19!wKgOX&vRb1=RAP2lG4R+oFp^W~TkM z*O+TvoaBzyQI~IzF$E41BWOEgwu1-NYjx9VB3duGCDfeTMIRV0;m=YEhCUuKEo?oi zRF4y-LHEo%SNnDux z-M>iOkjjOP7i4Kh?`2O(c#`D05BR2~&EDi}tbu|~`hH7WRNcN+JI9Mzw=JlFV5zsV z85lzTHDegqmPz$f5P4u4d^7&-lAE?ANiYNxx%O-A;UjO^d0gz9ZHw~{Md5LDj$T8% z4&+vc{$^EKh0$NR;D?}WWq>nYrF?si$FCB^JN3Viwx>oGKjfLNFbB(3ND8p3W#!mG z#Cs7Tsoxss8Ogjd<6Gl}GPxS6+AqF5lPc!;s9UC2h5QtwaYqRzvnP!`v81(F!`QH= z0^4`st{;pVkUaocNuMp6K6X{WysjVROa4B4a=vK(m6>K=E$#F?;!aHpxZLO+$>5BH zHPAQj+fGr5e7r9)_!zTqL1faWVt7hd(z<61Z{F8j&z1Z+Tk?Bx&#)91zg0U!_;VB3 zxx|gC(o}JJ9gNE!Z_^N6jAgv)FAXcqLD;a@L>PW81_ zkspV2YcNaPIVdzNIA$qS-!(gPm1&*_ZU(V)a_-7=&rZDU*0t%eOBrq4nQYC~l?d7) ziKvf#ZFl>F65sQh5qfV&66k{U#{GUZ4Cp$;L-0^a5Z|iek-hh6Nu7&Y-&u!n zKsjPy7`d63-#%z23`^HX>(8b$*MDL<1B((wR7^I99WZgy%;sr$cR_SdexTn@G6N5M z|C_FbrfE+1yo9IdPuS8l<1C1l7&HN2V$7n$?v)@PAznZQG>!}KD!L8cLUqlAcTD!7$ zuCwT8=UyZ(m7Ll;-IZ_9F7ONVM)>T{(Em3@>!lFq&{YTRVk$GbFUe7(f zpCXn#ykBzBDxfkc&B7?2G41qovO>tVaaU)#)Et)9A(D$Xtl{l-O@>XZ)Qp-p{T*u^1&0nm_BxBk*5 zh!!{yS{EM3nYH+FAp0XM&2>YR!sXG(E$DpsQuNElr9)c8lynHX_ivUm^KoqXU|nvJ>LSAw5m!d`QttZWzxn$TF{G}@IHc^O+oU-&$Z&?aFDB; zuX#NP7FLuR1rh~(W5JCSf>oOWfp}{S+ ztcs+eS)e4!)E`kzqPL(lw_*uEQoU|9j=u=0TI$jU^tzV+8J5VqH&f7_LvqMmyzUd! z3=Q2qN*F{cxx0K10ZvUb=pLU|H0|^w_HFz}1JRD{N@B2G0=L*70UbYG%VYH{1u`NtB(p-Cr(%)aI zPJ&_kC6iy^Bw9Ml--@;O?TnqZy&dXA$JPt5w1qei;y0 z1y`%u7wp<*K;FK)y)P$C50WOb?Y6+_ns$FFEI_3%A*FW*02t9M&9LkZtB(6(^fGi7My2T4Yy^ zg3^P*PZ>?EMXg~5P@Cn_pjFJg9~LTM3)gLsfA>vwT&nuH1Z9_L>=v|0OlP*m_7 zhIB~38MZ665lrL6k30EFgR%^VLu^)H^xR21E?<>Y`*;w)&8=ozJuX0#>NJuQ8G?H0?D=g}ZvsY!%w5 zTx}#gUEJc7EB=G*w4oaOv=nPA(edc!`;aV$bU6O`Iysin;wdJD1ydh0yx(uixBOp} zFWt(2qkI$llb+UK;>Ali+dDiy${Xea`ah@tlN@!>8Fn_`ew}J+uuvI5)=X21{q%O* zkCiXjtW;TLSD0vO7mUgDu6y0J^3J|W)ibddvh6MI`l#~3jffS2LDynq4Xjau;3ESQ zP?a%Ul^3b#KK=oI392l+^%8uF=-~Z%FPQW!UK=cE>0zJ_5;^!WiB(*g-{gbEBUDe) zQwo|5o#F>Dxb3Jq%(%L|Q%dbApRG_0^%5HygLXzdd6SCbMc zrY53%Heb}lUZw)APV`*#vi~%bLVH*ZRo3cK&WC~QxniR|2$^=_pmU_~NAc@k3W#6K zBFPj3a2mkAjkxj-9{PAtMJBp{>>#joxJ7>fE-@(rbmg&(#-tet4nw&PM#kel+qZj; ziLd;}TPP(xyXilhJuV*4lq{!~gexg;S0c;1O&)m3xNagZR)C9^cnVgnt$X&EEV}na zvCbYA9!8rTJtmAE^tkptx-d9YwsFB@lL{x0L;6RQ+XH>HLPu^eLm=r~ffgFdC0rt~PQ9`@3TCufS)^5!3Rx=ZT|BYf0!LDQzy zXWxshYrbog>8G4-+%!85V@2Q{UtD~Ve$WsPLI~0s zS>^p>d6qIenVA#NhOXU<%z%VUFi7=!yzzmb@!I{726Wv9z`&ae+ziMzB>FNN2Op0m z*$`5WLEo!JoXI6vA%KEB&(-jn*<0agcrmWn{Wn$fUTvDw0a{vhBLGcHrtKEUK)u=- z^Bnr}l5*`A>pM22o}xD~iyeWX1?>jH)D76O^rF{E9xgh7Sp(8;4?^s0Siv={Ls47s zLCIrx8X7F+^e<|c78>w>b?SK_Q&pWe-;maJ^-#;dHvgq?CCL8_Q~d7R4#E8S?>*KS zD?vcQ_baPH)H25uA|8QK*j}q$sf}aU`5mNJ>mNGOVk?&~S;E#aCiJ25;yL_%Huqi! zZK~`bJ02HO{~7+Rrqg$yd_{s*q7}I6l6JuF`=xhD9zE49D54<(LK_Q2`SD%#;~+z0 zT6jenTmFxjj-jk+&5K2lLz-uAiq$SqDuqq(S4y3h$wvSZ9lW4ZjwF!u{vu`+cl`u4 z`Cr)IKG-R8q(S#q({Z`v)vVf_MZo}H5Sz?mzQmR1R04$zyGpw zh7h2>tHBLg+|t-zsn+Z6PSYfkUXB`Ml9YFGwt{}xpo!GfRTG~gxZX2otU`* zX>dGHGf439=3GNvZ#gmiH{h3PeMpNs zo9kpvm((vYXjR;Cne&?iP&N)KRu0}4mg)wiP0sq??Op6mK9F_lp^0oDmzCYwXDcrB zO;4S?rQHWyGULU0gZXIb*&5GNS(2BKq1?qXEIkT?3PaRn+w`JEE}0Yk=`g(}8Jm8S zel1b)TyN>X`&V)v$i4%k^|En*HPbM0bc-zQ`HMDvcQL=un zA%tOFa7snQMSY)+f=QQMY zL)*Dd(t+2hn%5wF>70aWuq-(tS1XiiqX^Re+6S0U}p?cHx+vcI==+_tTH70 zH)59WKNhoO=s$vX(@4rL#^Bz4dBP2$lw;G%uB0+)LOzN-<%~d>dY5@*ks}@>N<=Cc zi{QtWCDpTD&6i3Q&u#3ZT_T?NTxpIQ#G&lOEiZwwCZ2ueJA)cC2 z8Fp_!&>YR|(JyZ0_9Piqk-O0KQBh0szfiK@Ja7{*>Qm)HC~ZnU@hX6{^8iMoHITN3 z&3z`GE6W>&-p`V$?wEB0!&t^Hs%obqHK%`cAEM9CQ(YYAn0#fp(IGm zYw)LZ=5h7;d2v8=@BkPKl%g|4z!wgOjR<9Zd0Eqe7$zD&vRpNsiN7andn?6a1Na4u zGI_MUBFzQMC*RPRO&A#(%m8up8BW`vlg6WC`>^%u*!u!o zK;TiZAvcW1YOr~*LM;DC=5(ouF~8z@`rond+(|z{^<^Ds!v|d04_g>!W%IR#Xq8$A z+gVEiv?ok?$AM%VvZKz(1XynxJF?;GyUB128ZWW8g%+ktFAtOi9_MtfEO4jp3I(R>UsLBp z(9wHKE2~Lynie7>|J~i)>DclxZT!7PsmM(zf#_P%nW@hfCyebuZVHEM1PA;}jKMSXH~^yu~h`h{jHm_gCgO;N-l$L*W0)iX{>Ldn>jh>8BM-{co*U z-R1Of+@Dv|Fc)-WrVx^W9DQ$2ZnNi{S428rHl1hmU^JR%)fXCXJT1)w2-u9UktwG zz(ptUkxyeI#i{!wGD1Yh6YbhA&UMX~F-pWkd;5PYMQf@5pGi@k zKSR;=%>^YV7x_jlFU{8=bVolDPEXWbWO8N&9)mbww^kaVT+(q46+v>Lu$Zr%gb z+8E(VD^Nq#PI(Sg+`$72VE&B*3%<0Cq;hJ+Iv}pw$_wbh$=B*8r^i3on!ya_P7orD zQc%OH`TJ zIMj}bd^*4K_&Rd`9u)wd@XzBJAvgpri+TlOtPr2__tZeV)U`p{QLjOL#1qp!YaweJ z7BbHDWn?@)%Syx@t9fGFh~{(&QPLkhSC@hA{|p=WX5mS)P%I71%+;0!+hE%t0oI}` zk=_Vsbdt9}USi#zfY5s*6638KNlv+~|Mz$=qO2iVX6O=6315W<3GGRE3Z?-C7glM% z?MGnk0T8597kFoI!~CuMXr)h{bGt6!Sx0Z4-!g0%TtR4kA)XOi~jO>J>x3roHvwir2Km5S@`CS z)r|||sSp2Zxq6rVljuFy@fhFI`>9Wb|9gFUt@s*7OrR}{Ee+^yb#zp{`ui|iqU1lr zXy1OURU`P)v4%o!&nd2CQYvq`eEwYP24u#jq>~MGQ%KX$-Zq(}QX=Lkn=l@wodWdXYVzk?HWhDYqudc@N2}~-Jz7* zH=k#OK;MmN>R*&b9lH$rfXu zr^Rbggu>q{2dNLVpLtXw5{6*74lSss`StKlsm8TefkJj=QZ|xB;n)$f7P~Rn^G=59 z&P+l{+e{{9T3H%XNd``(%+hiNsB*maWQD$lK6LD6)eZS0I7!ca*1Q7Geby+v5NUV! z=M#BTh|kQfh=KaVRW3V>`zJ!M%MfEX^*tm5BuFt?;_mbj(skYpWE9cq7lVfCaLE74 z>#~Tm?3E*_09BKWp*#PYS8EnWhWQ_hR|exe)T}PQ3s9ZgHCHj>%I+F2aM>3ipf7+E z#bq~zIe~!V#moNAeas$>tThfbt-Sj}BV?tI6tbkooxH*EZlgCaNOa9Edd%Bxd-1?W zaEG)w2b+GSuVA_Ziybko=|5U#xiG$@g7$1zR}Sx}Ym5r8mMgY1jq>cTrd=gC?fH># zv6zJnici@xuznAtCl)Ka6#=INfkxzm8l%?rg{-$S{#Q+#a!w8a2Dzsy@TeB8LYd*8 z)P2P!axF)WIC`I#O9-TVyW+H!jnCX@VBM({IPmls^6?oQq+8wIHNC{~H0ay@pekqG zU>?$_rC)~BMw{@g%ep+wV#M|Wx2b`}czg4=8Pkf#SQ?&^m)xX)ICIFPa%UZ-KqW)$AJHowdgXeW z%76;n9u*rQ3=1Vm?)2ksuJOXxDSndvm2Da>FTGs$2Chvi=?>GWR51U&#x+y_tP=c3 ziTeR|tCWVJy5>p8aLwm7408#wS8jgn@dXIs3$b!|j`OD9%9p+%rlzGSD|ga)`eYxl z@d8~-`B3M!CyW4~!CzV;(J(yP3C!($6=DY*V)HEbXvyAr?j5|6cg;mF>o1?puE%;` z`~5r#4x%HOQ}peuTCdiiDkzoRuL{h8M2AsE8v&Q$CQ7$+4+b4AwsNENB2Q3BO&$6j z_hlp6V&THUm<`w31~Hcjrv4m9vly{8r_UHCzFJ zKSm|(0BlFYH^!+io=eZOTny`JzLG_T(?U6CYo5*vXkuw#oT%gDqVvl60~iu2+y}$;FPn6b zin{1TY2b6%wf}~@9ZiRt@o)D-o;XZ2(oj9vPEm0|?b7NsBzq)djEz2od#x_Av$y_fPD``4d{qJnL2WsH zHT(`N|KMw>&g$Z*KoT^=nGdx^V>l~u z?q$5fv)aarL-XPeW7k+z?GxN7R|B>|rlOQGr5?l%Khq@{Psmi%evsV6t5Q`I!SY7*DwDV ziTlMG02{}khBAz>%#6eqktr0BUxt-U#Mzfs#6TeHcqt@SLZ-JQlL5PUSWdNoho)`O zA$e}eeLmW|{StM4-U7b-`vTE)FswC6uHXM1Hf1{4o%NpVTj>?imu8mt66tC!D&FVWHkmWAFOj@s)0mZvCgt z^Oz8;#`diVWxRn)-UBaJs4lycvG=pz*UUiI2A=$9yb^`3tHu}aC8|~b3D-XMZQJh0 zV?{RstJmN;K=1z?`7(S(Ca6%sjRnZimZ-~H&zF+Vqk6ozdBDPnq+3ofp_I`+D2uv7 zD}L9Xu<5hVZS1L-zih(g{eH*k=jY#-cK(Ipr@OoG?CySuFS+VRX0=AhNvUxJ3fhCE z2G}OkyK3DCr7vTYWzGtkJOXCbwS51ajdP5Ubdazs(=W)Mh+C?DP$Dh5nRg^_kaq5u zEbO+e)5Qu!34Mloj)<1i+W_5#Ic51B>cYsI^{@>GxNmh4M-X zN{!^IUBsw_yxzC*q^Xo1CB=~7Mc#)Tezet68#B1Sy;C#5d?at=1TN=rs^X|cZLJtZEnxTa} z99_S)rss~H{!wY)sk%+#fVcJ{`rZn>p8SW>_E+p8eP0*rsQsZ1=K$``wTa?e&af0~ zt4BUS>1udfrfz?gXul&tn5Uk(FL7+XTxF&z^i;UKciL0dU#yNXV`8;@H=S2%;xP5J zO!Qhrd5xWp0d}FF=i4d%14shbvlCowGxt+Qe|G08^K3xTSzd-G?EnX6@vk$^{t(G} zE=d2}LnAp0&GPKNLJ3u`ysb~TFXutZk!#Et%5w$}+Z>m8r#V6MiQM!h8#HuglLPc3 zc06P9*L4d>JVA$^%;!j&jU>H^!?-k807y+$_EMEX70Ts4I8gIEsJSEQssy%8&qraV zO3sFX!doF)_yzXhGh9x7!z=W*i&ybgcMDCR6LyjHUzBR+-9HWr$IvJ1S=!-F2e-LL zJQqsT4nP=D*{H^}$$!mUG3ut*xGeDT2w;{Vs7{EG*Ob(2kjzN*W;1NETliTh0i@>4 zkc&d#R?EIzp~$Q6&BV`v)y(?^Yvb)J2l9H<{8kmQcj>VySX8vcTz{Xm56l*OI1dEW z4_DSyS7;wX8H>ISqJDW)c^24%jJ(+4_*nV==R$`DYX5`=#= zjMJrmKRwO8|F!rah7Nz0pRB`QQrrFozT)AR0Jl;>!b55;94fGyTC~N|7eX zoXwbHHo<8#;LS7;&QI=&rjrin@JmH79^NNh$l0>FYDud+N>h^*D35 zez>4X7ittKlkBIPtcLBsCl022+XosXjklj;rp@_y9gg)g+qOLY2y@w{?$wgBqWwF! z>uvh!-m>6C^`zrZPVxQiBlRAXVp+IK)zJYoti=&`0>)e?{y)uP9#Zoj=CGGTKapo0 zCZ8P)9bov+kYp5i=PQYFZew9cySUQs55GEoLF>tLvT1|=r zE8D1<@WGy-XiThy~6*UvR;5GimNiL-^pYxoVGnS1rGb>96C4@4O?ps^P!hw7!44Sop^@Thi@|f^LfQ4^81rEcu$8SRF6W1i|PjwCS638naRS!*eaG7l+y;7rDsLIknb9tvS3KDcGzjjWJrMP&y zK-&6gn1-<<+9+bf#dOYamNV#`C+7JCjX9F!4%5u5f7r}5K>wpeOh4)<7+fQl&D1}D z-%*>|`3jwV{uZ#y={M)C@9|OO%3}QketF5HvQ<;hUNYX;0Y@^;$E$?8;g2OuY6Eki zpZ@?iki~;w%!v6V^1ux|^9@>Z^keCiAnDA{*611W*uPk#CBE9J-|iHRnw(*Uim+I$F(5J7qhg!>6NeS)tWEKwq^49K}35d1p@tbEJJu8TF`d zN1VwH+Sgo@?{^KVol}eAW+S+W%gdBJ9iGChR9#bpDw>zqYopgMcYC67XREHesjR1; zye|x^I@4@Vf)_3yPaBRcvR2L`>|I8>V)T^fyzVq9&r5>H;F`EO>+1(WocDbyBwv8o z|Cu5XyaQ#+49kJsk?1&(&t$J=S|h=0_jMwsqH$q;Hm_=7+MJze!YHI;xZ4xCs$epKK7)x!X&&^7#Zx*)@CG^pp5Y|n?cAIuEcFV_}; zATa*fk;-!F4s^#wd8IIRTscmbIrmU(X@j&oyZmMSuMG8Lx&{wTdMj{W=dN=^@jvl6yf;9HI|+Ovi(S4LDQyBKq|6q z&U7X!Uihnp%_|JmjH4N*5&=r9thWF{fMP``9W#iWUv&S5O;es+CNZ^FC83=TdAmw$ zRIawwQcC$7T{rNcm1Rf92}jwY0hess%F+AH&|SxQLBQr^G@~k z)gR}qb^bs5kG=MK*Is+={oC)}&+mPI@AEvC|1@{PAgmp99SgR%L#IoBYp-XQzOq!i z*M9{00Vv3M%7&shDteT#oHKP(y-YC^=P23-%ofgj-)N^B_9O1}s;ekAi5nxguXdVx z+F1-Cc>$fTj|+ZTlaFH>|9HT`76P;Dsv71Zwxmn9;#mrNu(VIQCYnfeD0O$ZDMo)H zaRx`8HxR+6%;NTJokYIDpBjjT#~d2h-~bQIl0#x5lmM7>f}#rbly6RN!e(Vzmps>+ zra2x{GHm9cAxX3^LA#6drhM;E!t&+9>m%W`n4+mC!y8kK`2(q9xYNfQeFc@8yur{E zbP)QC4=#?AqPUizPKM-~12kM`G12Wi+jm|-87g1h4c*Un4qJ!e z1o!|y)J-ojGD{ipoQHM{S_^jU8g*_hT8f4qaIweKd=h!MvD}gD7GWI-NJ_(n{zRiT z>qqlJ?-M2uYI!$d1}|UtdrH01AoLCz9wfJ)iBe!OgOZhtj`4=&GF;A@?_M}w)ygWy_nmcKJaycC@sT24b`C8J=F%U zw}@OsR`*b2PE1}z^DZenmho&jb7GL0ou>PSOrhEBbQes8=KLN*8bj_2l@#XkJAU}kEVD1^UedM5RhaV~Sq*hxjbw`_v`o88{ z$M{iH-to-@`7DtR*{H`vv(Fv5&3C4umNyLp65c;<{#UtFGHyHU5OVFwj&4_dx3e#o zTZ~7r@L=(@cRe&$dQ@!R1bUmfaa}&@wWn$i0sA7N*ToEtfiq^7Gype&q-(0yoCv(+ z8Yww7nDjcbMbg{_{s??f2A5H~>05m=WWC%J!)?O>A^`%%>PG1E`J{CWu5ku?@j_uWl zvL$B^8r}@;1zq*bBcFc3a(}9GE<#@4>Jj*fiCvjFrk&M|on6b+YpDu6w-e=Y)h|$J zrIkE@85M=RDF!yUNL=UHjL~%u!*z*jF1dG$p6j-U(_6y5ol4Rfn_1)+v8007oxSrj z(1E~yp2E>;v>G>BKK2+ zW%=1FT&a6YTX844>F&AxR2|8 z`-h8Hop`C_KdN>M!srG<&Om0R^PZK(?Ob@@9ZGdQgRC&+zbNq>QinH}qZLj&Vg%PQHJ#toLmQ8%eOtUgPNm4N$Uh zz_2R%Ds9yZ4@ZAHvls=mobJ}!3O!-XEpa(zeMq};m3j~e;TGkUnCFS7HvqlRvvUvH zg7d4tsmY`a1v`#-k!=Ml>OMvcK0i6=i=(TY7pq!)plrV#^ae!Rc>nteS#(+@{AcfR za7Ab;-XSr6)%Cs15c?bNN`&;u6xZ&zbrzHdDgkV@ysHL$g_eNa*Dc93g-$!h>5mwM z(C+(HH=UL(N5e+f?@B^OxonOL%0Zzo~XY9 z3V$BMjoyQ)?TCARgIigC0*ioi17_Yj)(*Vl3>lVBng|J2mSR3c^HL_<{#GD2skWlaF!1XTMZjtP zGu9qR3oW%eTk`S*@qJ69KzuR7niWzd?XS6QpS=!SZe|M%0+VO|UID$@8x>V4insq> zXMf)I;|m&Zrr$=Q_^Knm#}9mci(p3*r$&y73zN2o-V`(GO?ri`!p!pPrrpB@jJ`Vu zxUah1KB&ulZ{_O3i$zhsXDNr;lHcY2b*g}y`9tC>o-Fo@>g + + + + + + + + + image/svg+xml + + + + + + + + + + + + Update + Selection controls + + Presentations tree view + + + History view + + diff --git a/dox/user_guides/inspector/inspector.md b/dox/user_guides/inspector/inspector.md new file mode 100644 index 0000000000..9b15cee1c6 --- /dev/null +++ b/dox/user_guides/inspector/inspector.md @@ -0,0 +1,578 @@ +Inspector {#occt_user_guides__inspector} +=============================== + +@tableofcontents + +@section occt_inspector_1 Introduction + +This manual explains how to use Inspector. + +@subsection occt_inspector_1_1 Overview +Inspector is a Qt-based library that provides functionality to interactively inspect low-level content of the OCAF data model, OCCT viewer and Modelisation Data. +This component is aimed to assist the developers of OCCT-based applications to debug the problematic situations that occur in their applications. + +Inspector has a plugin-oriented architecture. The current release contains the following plugins: + +| Plugin | OCCT component | Root class of OCCT investigated component | +| :----- | :----- | :----- | +| @ref occt_inspector_2_2 "DFBrowser"| OCAF | TDocStd_Application | +| @ref occt_inspector_2_3 "VInspector"| Visualization | AIS_InteractiveContext | +| @ref occt_inspector_2_4 "ShapeView"| Modelisation Data | TopoDS_Shape | + + +Each plugin implements logic of a corresponding OCCT component. + +Each of the listed plugins is embeded in the common framework. +The user is able to manage which plugins should be loaded by Inspector. +Also he can extend number of plugins by implementing a new plugin. + + +@subsection occt_inspector_1_3 Getting started + +There are two launch modes: +1. Launch **TInspectorEXE** executable sample. For more details see @ref occt_inspector_6 "TInspectorEXE" section; +2. Launch DRAW, load plugin INSPECTOR, and use **tinspector** command. + For more details see @ref occt_inspector_7 "Launch in DRAW Test Harness" section. + + +Note. If you have no Inspector library in your build directory, please make sure that OCCT is compiled with *BUILD_Inspector* +option ON. For more details see @ref occt_inspector_4 "Build procedure". + + +@section occt_inspector_2 Inspector + +@subsection occt_inspector_2_1 Overview + +Inspector consists of the following components: + * buttons to activate the corresponding plugin; + * view area to visualize the plugin content. + +@figure{tinspector_elements.svg,"Plugins placement in Inspector",360} + +@subsection occt_inspector_2_2 DFBrowser Plugin + +@subsubsection occt_inspector_2_2_1 Overview + +@figure{dfbrowser.png, "DFBrowser"} + +This plugin visualizes content of TDocStd_Application in a tree view. It shows documents of the application, +hierarchy of TDF_Labels, content of TDF_Attributes and interconnection between attributes (e.g. references). +Additionally it has 3D view to visualize TopoDS_Shape elements stored in the document. + +@subsubsection occt_inspector_2_2_2 Elements + +@figure{dfbrowser_elements.svg, "DFBrowser Elements",360} + +OCAF tree view + +Each OCAF element has own tree view item: + +| Type | Tree item | Text | Description | +| :----- | :----- | :----- | :----- | +| TDocStd_Application | Application | TDocStd_Application | It is the root of tree view. Children are documents.| +| TDocStd_Document | Document | entry : name | It is a child of Application item. Children are Labels and Attributes items.
    Text view is an entry of the root label and the value of TDataStd_Name attribute for the label if it exists. | +| TDF_Label | Label | entry : name | It is a child of a Document or another Label item. Children and text view are the same as for Document item. | +| TDF_Attribute | Attribute | attribute type [additional information] | It is a child of a Label. It has no children.
    Text view is the attribute type (DynamicType()->Name() of TDF_Attribute) and additional information (a combination of attribute values) | + + +Additional information of TDF_Attributes: + +| Type | Text | +| :----- | :----- | +| TDocStd_Owner | [storage format] | +| TDataStd_AsciiString,
    TDataStd_Name,
    TDataStd_Real,
    @ref occt_attribute_simple_types "other Simple types" | [value] | +| TDataStd_BooleanList,
    TDataStd_ExtStringList,
    @ref occt_attribute_list_types "other List types" | [value_1 ... value_n] | +| TDataStd_BooleanArray,
    TDataStd_ByteArray,
    @ref occt_attribute_array_types "other Array types" | [value_1 ... value_n] | +| TDataStd_TreeNode | [tree node ID ==> Father()->Label()] (if it has father) or
    [tree node ID <== First()->Label()] (if it has NO father)| +| TDataStd_TreeNode(XDE) | [@ref occt_attribute_xde_tree_node_id "XDE tree node ID" ==> Father()->Label()] (if it has father),
    [@ref occt_attribute_xde_tree_node_id "XDE tree Node ID" <== label_1, ..., label_n] (if it has NO father)| +| TNaming_NamedShape | [shape type : evolution] | +| TNaming_UsedShapes | [map extent] | + + +Custom color of items: + +| OCAF element Type | Color | +| :----- | :----- | +| TDF_Label | dark green, if the label has TDataStd_Name attribute,
    light grey if the label is empty (has no attributes on all levels of hierarchy),
    black otherwise | +| TNaming_NamedShape | dark gray for TopAbs_FORWARD orientation of TopoDS_Shape,
    gray for TopAbs_REVERSED orientation of TopoDS_Shape,
    black for other orientation | + + +Context popup menu: +| Action | Functionality | +| :----- | :----- | +| Expand | Expands the next two levels under the selected item | +| Expand All | Expands the whole tree of the selected item | +| Collapse All | Collapses the whole tree of the selected item | + + +Property Panel + +Property panel is used to display content of Label or Attribute tree view items. +This control is used for content of Label or Attribute tree view items or Search result view. +Information is usually shown in one or several tables. + +TDF_Attribute has the following content in Property Panel: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeDescriptionContent
    TDF_Label a table of [entry or attribute name, value]@figure{property_panel_label.png, "",140}
    TDocStd_Owner,
    @ref occt_attribute_simple_types "Simple types",
    @ref occt_attribute_list_types "List types"
    a table of [method name, value]@figure{property_panel_simple_type.png, "",140}
    TDataStd_BooleanArray,
    TDataStd_ByteArray,
    @ref occt_attribute_array_types "other Array types"
    2 controls:
    * a table of [array bound, value],
    * table of [method name, value]
    @figure{property_panel_array.png, "",140}
    TDataStd_TreeNode2 controls:
    * a table of [Tree ID, value] (visible only if Tree ID() != ID()),
    * a tree view of tree nodes starting from Root() of the tree node. The current tree node has dark blue text.
    @figure{property_panel_tree_node.png, "",140}
    TDataStd_NamedDatatab bar of attribute elements, each tab has a table of [name, value]@figure{property_panel_named_data.png, "",140}
    TNaming_UsedShapesa table of all the shapes handled by the framework@figure{property_panel_tnaming_used_shapes.png, "",140}
    TNaming_NamedShape2 controls:
    * a table of [method name, value] including CurrentShape/OriginalShape methods result of TNaming_Tools,
    * an evolution table.
    Tables contain buttons for @ref occt_shape_export "TopoDS_Shape export".
    @figure{property_panel_tnaming_named_shape.png, "",140}
    TNaming_Naming2 controls:
    * a table of TNaming_Name vlaues,
    * a table of [method name, value]
    @figure{property_panel_tnaming_naming.png, "",140}
    + + +Dump view + +@figure{dump_attribute.png, "Dump of TDF_Attribute"} + +Dump view shows result of TDF_Attribute::Dump() or TDF_Label::Dump() of selected tree view item. + +3D view + +3D View visualizes TopoDS_Shape elements of OCAF attribute via AIS facilities. + +DFBrowser creates two kinds presentations depending on the selection place: + + + + + + + + + + + +
    KindSource objectVisualization propetiesView
    Main presentationTree view item:
    TPrsStd_AISPresentation,
    TNaming_NamedShape,
    TNaming_Naming
    Color: a default color for shape type of the current TopoDS_Shape@figure{display_main_presentation.png, "",100}
    Additional presentationReferences in Property panelColor: white@figure{display_additional_presentation.png, "",100}
    + + + +Tree Navigation + +Tree Navigation shows a path to the item selected in the tree view. +The path is a sequence of label entries and attribute type name. +Each element in the path is selectable - the user can click on it to select the corresponding tree view item. + +Navigation control has buttons to go to the previous and the next selected tree view items. + + +Update Button + +Update button synchronizes content of tree view to the current content of OCAF document that could be modified outside. + +Search + +The user can search OCAF element by typing: + * TDF_Label entry, + * TDF_Attribute name, + * TDataStd_Name and TDataStd_Comment attributes value. + +@figure{search.png,"Search"} + +As soon as the user confirms the typed criteria, the Property panel is filled by all satisfied values. +The user can click a value to hightligt the corresponding tree view item. By double click the item will be selected. + + +@subsubsection occt_inspector_2_2_3 Elements cooperation + +Tree item selection + +Selection of tree view item updates content of the following controls: + * Navigation line + * Property Panel + * 3D View (if it is possible to create an interactive presentation) + * Dump View + +@figure{dfbrowser_selection_in_tree_view.svg,"",360} + +Property Panel item selection + +If property panel shows content of TDF_Label: + * selection of the table row hightlights the corresponding item in tree view, + * double click on the table row selects this item in tree view. + +If property panel shows content of TDF_Attribute that has reference to another attribute, selection of this reference: + * highlights the referenced item in TreeView, + * displays additional presentation in 3D view if it can be created. + +@figure{property_panel_item_selection.svg,"",360} + +Attributes having references: + +| Type | Reference | Additional presentation +| :----- | :----- | :----- | +| TDF_Reference | TDF_Label | | +| TDataStd_ReferenceArray,
    TDataStd_ReferenceList,
    TNaming_Naming | one or several TDF_Label in a container | | +| TDataStd_TreeNode | TDF_Label | | +| TNaming_NamedShape | TDF_Label in Evolution table | selected TopoDS_Shapes in property panel tables | +| TNaming_UsedShapes | one or several TNaming_NamedShape | TopoDS_Shapes of selected TNaming_NamedShape | + + +@subsubsection occt_shape_export TopoDS_Shape export + +Property panel of TNaming_NamedShape attribute has controls to export TopoDS_Shape to: + * BREP. The save file dialog is started to enter the result file name, + * @ref occt_inspector_2_4 "ShapeView" plugin. Dialog about exporting element to ShapeView is shown with a possibility to activate this plugin immediatelly. + + +@subsection occt_inspector_2_3 VInspector Plugin + +@subsubsection occt_inspector_2_3_1 Overview + +@figure{vinspector.png, "VInspector"} + +It visualizes interactive objects displayed in AIS_InteractiveContext in a tree view with columputed selection +components for each presentation. It shows the selected elements in the context and allows to select these elements. + +@subsubsection occt_inspector_2_3_2 Elements + +@figure{vinspector_elements.svg,"VInspector Elements",360} + +Presentations tree view + +It shows presentations and selection computed of them. Also, the view has columns with information about state of visualization elements. + +VInspector tree items. + +| Type | Description | +| :----- | :----- | +| AIS_InteractiveContext | It is the root of tree view. Children are interactive objects obtained by *DisplayedObjects* and *ErasedObjects* methods.| +| AIS_InteractiveObject | It is a child of AIS_InteractiveContext item. Children are SelectMgr_Selection obtained by iteration on *CurrentSelection* | +| SelectMgr_Selection | It is a child of AIS_InteractiveObject. Children are SelectMgr_SensitiveEntity obtaining by iteration on *Sensitive* | +| SelectMgr_SensitiveEntity | It is a child of SelectMgr_Selection. Children are SelectMgr_SensitiveEntity obtaining by iteration on *OwnerId* | +| SelectBasics_EntityOwner | It is a child SelectMgr_SensitiveEntity. It has no children. | + + +Custom color of tree view items: + +| OCAF element Type | Column | What | Color | +| :----- | :----- | :----- | :----- | +| AIS_InteractiveObject | 0 | Text | dark gray, it is in *ErasedObjects* list of AIS_InteractiveContext,
    black otherwise | +| AIS_InteractiveObject,
    SelectMgr_SensitiveEntity,
    SelectBasics_EntityOwner| 1 | Background | dark blue, if there is a selected owner under the item,
    black otherwise | +| SelectMgr_Selection,
    SelectMgr_SensitiveEntity,
    SelectBasics_EntityOwner| all | Text | dark gray, if *SelectionState* of SelectMgr_Selection is not *SelectMgr_SOS_Activated*,
    black otherwise | + + +Context popup menu in tree view: +| Action | Item | Functionality | +| :----- | :----- | :----- | +| Export to ShapeView | AIS_InteractiveObject | Exports TopoDS_Shape of AIS_Interactive presentation to ShapeView plugin.
    It should be AIS_Shape presentation and ShapeView plugin should be registered in Inspector
    Dialog about exporting element to ShapeView is shown with a possibility to activate this plugin immediatelly. | +| Show | AIS_InteractiveObject | *Display* presentation in AIS_InteractiveContext | +| Hide | AIS_InteractiveObject | *Erase* presentation from AIS_InteractiveContext | + +Update + +It synchronizes content of the plugin to the current state of AIS_InteractiveContext. +It updates the presence of items and the current selection for the items. + +Selection controls + +Selection controls switch on/off the posibility to set selection in the context from VInspector plugin. + +| Action | Tree view item | Functionality | +| :----- | :----- | :----- | +| Select Presentations | AIS_InteractiveObject | Calls *AddOrRemoveSelected* of interactive object for the selected item | +| Select Owners | SelectMgr_EntityOwner or
    SelectMgr_SensitiveEntity | Calls *AddOrRemoveSelected* of SelectMgr_EntityOwner for the selected item | + +Please note, that the initial selection in context will be cleared. +If the button is toggled, the button selection is active. Only one button may be toggled at the moment. + + +History view + +At present the History view is under implementation and may be used only in a custom application where Inspector is loaded. + +To fill this view, VInspectorAPI_CallBack should be redefined in the application and send signals about some actions applyed to context. +After, the call back should be given as parameter in the plugin. +If done, new items will be created in the history view for each action. + +@subsubsection occt_inspector_2_3_3 Elements cooperation + +Vinspector markes current selected presentations in AIS_InteractiveContext with blue background in tree items. Use "Update" button to synchronize VInspector selected items state to the context. + +It is also possible to perform selection in context using "Selection controls" VInspector. However, it should be performed carefully as +it clears the current selection in AIS_InteractiveContext. + +Selection change: +| From | To | Action | Result | +| :----- | :----- | :----- | :----- | +| AIS_InteractiveContext | VInspector | perform selection in AIS_InteractiveContext | Click "Update" button in VInspector and check "Selection" column:
    AIS_InteractiveContext item has anount of selected objects,
    some of AIS_InteractiveObject have filled value if it selection happens for this presentation or entity owner of it | +| VInspector | AIS_InteractiveContext | activate one of Selection controls and select one or several elements in tree view | The objects become selected in AIS_InteractiveContext | + +@subsection occt_inspector_2_4 ShapeView Plugin + +@subsubsection occt_inspector_2_4_1 Overview + +@figure{shapeview.png, "ShapeView"} + +This plugin visualizes content of TopoDS_Shape in a tree view. + +@subsubsection occt_inspector_2_4_2 Elements + +@figure{shapeview_elements.svg,"ShapeView Elements",360} + +TopoDS_Shape View + +Elements of the view are TopoDS_Shape objects. +This shape is exploded into sub-shapes using TopoDS_Iterator of the TopoDS_Shape. +Child sub-shapes are presented in the view as children of the initial shape. +Iterating recursively by all shapes we obtain a tree view of items shown in the ShapeView. + + +Columns of the View show some information about TopoDS_Shape of the item. +The most informative column is the last column of TopoDS_Vertex and TopoDS_Edge shape types. + +For TopoDS_Vertex it contains the point coordinates, + +for TopoDS_Edge it contains the first and the last point coordinates, the edge length and some other parameters. + + +Context popup menu in tree view: +| Action | Functionality | +| :----- | :----- | +| Load BREP file | Opens selected file and appends the result TopoDS_Shape into tree view | +| Remove all shape items | Clears tree view | +| BREP view | Shows text view with BREP content of the selected item. It creates BREP file in temporary directory of the plugin. | +| Close All BREP views | Closes all opened text views | +| BREP directory | Displays folder where temporary BREP files have been stored. | + +@subsubsection occt_inspector_2_4_3 Elements cooperation + +Selection of one or several items in TopoDS_Shape View creates AIS_Shape presentation for it and displays it in the 3D View. + + + +@section occt_inspector_3 Common controls +@subsection occt_inspector_3_1 3D View + +@subsubsection occt_inspector_3_1_1 Overview + +@figure{3DView.png, "3D View"} + +Control for OCCT 3D viewer. It creates visualization view components with possibilities to perform some +user actions for the view. + + +@subsubsection occt_inspector_3_1_2 Elements + +@figure{3DView_elements.svg,"3DView Elements"} + +3D View contains: +| Element | Functionality | +| :----- | :----- | +| 3D view | V3d viewer with mouse events processing | +| Context | choice of another context that should be used in the plugin.
    It is possible to use the next contexts:
    Own - context of this view,
    External - context come in parameters which intializes plugin,
    None - do not perform visualization at all | +| Multi/Single | Buttons defined what to do with the previous displayed objects:
    Multi displays new presentations in additional to already displayed,
    Single removes all previuos displayed presentations | +| Clean | Removes all displayed presentations | +| Fit All,
    Fit Area,
    Zoom,
    Pan,
    Rotation | Scene manipulation actions | +| Display Mode | Sets *AIS_Shading* or *AIS_WireFrame* display mode for all presentations | + + +@section occt_inspector_6 TInspectorEXE sample + +Inspector functionality can be tried using this sample. + +Use *inspector.bat* script file placed in binary directory of OCCT to launch it. + +This script accepts the names of plugin's DLL that should be loaded. By default it loads all described above plugins. + + +@figure{TStandaloneEXE.png, "TStandaloneEXE"} + +Click on the Open button shows the dialog to select a file. The user is able to select one of the sample files or load own one. +@figure{TStandaloneEXE_open.png, ""} + +Depending on the active plugin, the following files should be selected in the dialog: +OCAF document or STEP files for DFBRowser and BREP files for VInspector and ShapeView plugins. + +It is possible to click the file name in the proposed directory, enter it manually or using Browser button. +The last Loading icon becomes enabled if file name is correct. + + +By default TInspectorEXE opens the next files for plugins: +| Plugin DLL library name | Files | +| :----- | :----- | +| TKDFBrowser | step/screw.step | +| TKVInspector | occ/hammer.brep | +| TKShapeView | occ/face1.brep,
    occ/face2.brep | + +These files are found relatively *CSF_OCCTDataPath*. + + +Source code of TIspectorEXE is a good sample for @ref occt_inspector_8 "Using Inspector in a custom application". + + +@section occt_inspector_7 Launch in DRAW Test Harness + +TKToolsDraw plugin is created to provide DRAW commands for Qt tools. Use INSPECTOR parameter of @ref occt_draw_1_3_3 "pload" +command to download commands of this library. It contains tinspector command to start Inspector under DRAW. +See more detailed description of the @ref occt_draw_13_1 "tinspector" command. + +The simple code to start Inspector with all plugins loaded: + +~~~~~ +pload INSPECTOR +tinspector +~~~~~ + +@figure{drawexe_tinspector.png,"tinspector"} + +Result of this command is the next: +- all available Plugins are presented in the Inspector. These are @ref occt_inspector_2_2 "DFBrowser", @ref occt_inspector_2_3 "VInspector" and @ref occt_inspector_2_4 "ShapeView". +- DFBrowser is an active plugin +- tree of OCAF is empty. + +After, we should create objects in DRAW and update tinspector. + +@section occt_inspector_8 Using in a custom application + +To use Inspector in an application, the next steps should be done: +* Set dependencies to OCCT and Qt in application (Header and Link) +* Create an instance of TInspector_Communicator. +* Register plugins of interest in the communicator by DLL library name +* Initialize communicator with objects that will be investigated +* Set visible true for commumicator + + +C++ code is similar: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} + +#include + +static TInspector_Communicator* MyTCommunicator; + +void CreateInspector() +{ + NCollection_List aParameters; + //... append parameters in the list + + if (!MyTCommunicator) + { + MyTCommunicator = new TInspector_Communicator(); + + MyTCommunicator->RegisterPlugin ("TKDFBrowser"); + MyTCommunicator->RegisterPlugin ("TKVInspector"); + MyTCommunicator->RegisterPlugin ("TKShapeView"); + + MyTCommunicator->Init (aParameters); + MyTCommunicator->Activate ("TKDFBrowser"); + } + MyTCommunicator->SetVisible (true); +} + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +| Plugin | to be initialized by | +| :----- | :----- | +| TKDFBrowser | TDocStd_Application | +| TKVInspector | AIS_InteractiveContext | +| TKShapeView | TopoDS_TShape | + + + +@section occt_inspector_4 Build procedure + +By default the Inspector compilation is off. +To compile it, set the BUILD_Inspector flag to "ON". See @ref build_cmake_conf "Configuration process". + +When this option is switched On, MS Visual Studio project has an additional tree of folders: + +@figure{VStudio_projects.png,"Inspector packages in MS Visual Studio"} + + +@section occt_inspector_5 Sources and packaging + +OCCT sources are extended by the /tools directory. + +Distribution of packages participated in plugins: +| Sources packages| Plugin | +| :----- | :----- | +| DFBrowser,
    DFBrowserPane,
    DFBrowserPaneXDE,
    TKDFBrowser | DFBrowser | +| VInspector,
    TKVInspector | VInspector | +| ShapeView,
    TKShapeView | ShapeView | + +Other packages: +| Sources packages| Used in | +| :----- | :----- | +| TInspectorAPI,
    TKInspectorAPI | Iterface for connection to plugin. | +| TreeModel,
    TKTreeView | Items-oriented model to simplify work with GUI tree control. | +| View,
    TKView | 3D View component | +| TInspector,
    TKTInspector | Inspector window where plugins are placed | +| ToolsDraw,
    TKToolsDraw | Plugin for DRAW to start Inspector | + + +In MSVC studio the separate folder contains Inspector projects. + +@section occt_inspector_9 Glossary +* **Component** -- OCCT part, e.g. OCAF, VISUALIZATION, MODELING and others. +* **Plugin** -- library that is loaded in some executable/library. Here, the plugins are: + * DFBrowser, + * ShapeView, + * VInspector. + +@subsection occt_attribute_simple_types TDF_Attribute Simple types +Types where the content is a single value + +| Type | Kind of value | +| :----- | :----- | +| TDataStd_AsciiString | TDataStd_AsciiString | +| TDataStd_Comment | TCollection_ExtendedString | +| TDataStd_Integer | Standard_Integer | +| TDataStd_Name | TCollection_ExtendedString | +| TDataStd_Real | Standard_Real | +| TDF_Reference | TDF_Label | +| TDF_TagSource | Standard_Integer | + + +@subsection occt_attribute_list_types TDF_Attribute List types + +| Type | Kind of value (container of) | +| :----- | :----- | +| TDataStd_BooleanList | Standard_Boolean | +| TDataStd_ExtStringList | TCollection_ExtendedString | +| TDataStd_IntegerList | Standard_Integer | +| TDataStd_RealList | Standard_Real | +| TDataStd_ReferenceList | TDF_Label | + +@subsection occt_attribute_array_types TDF_Attribute Array types + +| Type | Kind of value (container of) | +| :----- | :----- | +| TDataStd_BooleanArray | Standard_Boolean | +| TDataStd_ByteArray | Standard_Byte | +| TDataStd_ExtStringArray | TCollection_ExtendedString | +| TDataStd_IntegerArray | Standard_Integer | +| TDataStd_RealArray | Standard_Real | +| TDataStd_ReferenceArray | TDF_Label | + +@subsection occt_attribute_xde_tree_node_id XDE tree node ID description +| GUID | Text | +| :----- | :----- | +| XCAFDoc::ShapeRefGUID() | Shape Instance Link | +| XCAFDoc::ColorRefGUID (XCAFDoc_ColorGen) | Generic Color Link | +| XCAFDoc::ColorRefGUID (XCAFDoc_ColorSurf) | Surface Color Link | +| XCAFDoc::ColorRefGUID (XCAFDoc_ColorCurv) | Curve Color Link | +| XCAFDoc::DimTolRefGUID() | DGT Link | +| XCAFDoc::DatumRefGUID() | Datum Link | +| XCAFDoc::MaterialRefGUID() | Material Link | + diff --git a/dox/user_guides/user_guides.md b/dox/user_guides/user_guides.md index aa9ff98082..3571044a14 100644 --- a/dox/user_guides/user_guides.md +++ b/dox/user_guides/user_guides.md @@ -17,4 +17,5 @@ OCCT User Guides are organized by OCCT modules: * @subpage occt_user_guides__xde "Extended Data Exchange (XDE)" * @subpage occt_user_guides__ocaf "Open CASCADE Application Framework (OCAF)" * @subpage occt_user_guides__tobj "TObj package" -* @subpage occt_user_guides__test_harness "DRAW Test Harness" \ No newline at end of file +* @subpage occt_user_guides__test_harness "DRAW Test Harness" +* @subpage occt_user_guides__inspector "Inspector" \ No newline at end of file diff --git a/samples/tools/TStandalone/CMakeLists.txt b/samples/tools/TStandalone/CMakeLists.txt index a48dfe8c91..8810073fe7 100644 --- a/samples/tools/TStandalone/CMakeLists.txt +++ b/samples/tools/TStandalone/CMakeLists.txt @@ -101,7 +101,7 @@ set (BUILD_TOOLKITS string(TIMESTAMP CURRENT_TIME "%H:%M:%S") message (STATUS "\nInfo: \(${CURRENT_TIME}\) Start collecting all header files into ${CMAKE_BINARY_DIR}/inc ...") # collect all the headers to /inc folder -COLLECT_AND_INSTALL_OCCT_HEADER_FILES ("${CMAKE_BINARY_DIR}" "${BUILD_TOOLKITS}" "${CASROOT_SOURCE_FILES}/tools" "${INSTALL_DIR_INCLUDE}") +COLLECT_AND_INSTALL_OCCT_HEADER_FILES ("${CMAKE_BINARY_DIR}" "${BUILD_TOOLKITS}" "${CASROOT_SOURCE_FILES}/tools" "${INSTALL_DIR_INCLUDE}/inspector") OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/standalone_macros") OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/qt_macro") diff --git a/tests/tools/dfbrowser/A2 b/tests/tools/dfbrowser/A2 index 3d4fb130b5..e138425ac3 100644 --- a/tests/tools/dfbrowser/A2 +++ b/tests/tools/dfbrowser/A2 @@ -1,53 +1,23 @@ -pload DCAF -pload VISUALIZATION -pload INSPECTOR +pload DCAF VISUALIZATION INSPECTOR -chrono qat start -# Create a new document and set UndoLimit NewDocument D BinOcaf tinspector -plugins dfbrowser -#NewDocument D cpulimit 300 UndoLimit D 100 -# Open a transaction NewCommand D -#1 - create box using more flexible set of commands NewCommand D -# add object + set B2 [AddObject D] -# add function set F2 [AddFunction D $B2 Box] -# set argumets of this function BoxDX D $B2 190 BoxDY D $B2 290 BoxDZ D $B2 390 -# initialize (clean) internal maps of labels + InitLogBook D AddDriver D Box Attach Cyl -# compute the function ComputeFun D $F2 -# check result -set IsDone [catch {GetShape D $F2:2 Box2} aResult] -if { ${IsDone} != 0 } { - puts "Error: Get a value of TNaming_NamedShape attribute from restoring document" -} else { - puts "OK: Value of TNaming_NamedShape attribute from restoring document was got" -} -if { [regexp "SOLID FORWARD" [whatis Box2] ] != 1 } { - puts "Error: Box2 is not a solid forward" -} else { - puts "OK: Box2 is a solid forward" -} - -# referes to result NS -GetReference D $B2; - tinspector -update -vinit -vdisplay Box2 -vfit -checkview -screenshot -3d -path ${imagedir}/${test_image}.png \ No newline at end of file diff --git a/tests/tools/dfbrowser/A3 b/tests/tools/dfbrowser/A3 new file mode 100644 index 0000000000..8e83cd5b23 --- /dev/null +++ b/tests/tools/dfbrowser/A3 @@ -0,0 +1,2 @@ +pload INSPECTOR +tinspector -plugins dfbrowser -open $env(CSF_OCCTDataPath)/step/screw.step -select 0:1:1:1 diff --git a/tests/tools/dfbrowser/A4 b/tests/tools/dfbrowser/A4 new file mode 100644 index 0000000000..4733e9440a --- /dev/null +++ b/tests/tools/dfbrowser/A4 @@ -0,0 +1,150 @@ +pload DCAF INSPECTOR TOPTEST + +# Create the first document and set UndoLimit +NewDocument Doc1 BinOcaf +UndoLimit Doc1 100 + +# Add an attribute to a data framework +set aSetAttr1 100 +set aLabel 0:2 +SetInteger Doc1 ${aLabel} ${aSetAttr1} + + +# Create the second document +set test_name "OCC26961" +set test_int 123 +set test_real 123.456e-7 +set test_int_arr {10 20} +set test_real_arr {1.1 3.14 5.4e18} +set test_extstr_arr {"sample string 1" "string 2"} +set test_bool_arr {0 1} +set test_ref_arr {"0:1:2:3:2" "0:1:2:3:1"} +set test_byte_arr {15 25} +set test_map {1 5 2 10} +set test_map_sorted {1 2 5 10} +set test_named_ints {i1 1 i2 2} +set test_named_reals {r1 1.1 r2 2.2} +set test_named_strings {s1 string1 s2 string2 s3 string3_string_extended s4 string4_double_extended s5 string5} +set test_named_bytes {b1 65 b2 66} +set test_ref "0:1:1" +set test_guid "00000000-0000-0000-2222-000000000000" +set test_comment "Sample document containing various attributes" +set test_string "Sample string" +set test_expr "2*pi*r" +set test_var1 "0:1:2:3:2" +set test_var2 "0:1:2:3:1" +set test_point "111 222 333" +set test_axisPos "10 10 30" +set test_axisDir "11 22 33" +set test_plane "15 25 35" +set test_boxXYZ "10 20 30" +set test_boxDX 100 +set test_boxDY 200 +set test_boxDZ 300 +set test_geom_t "cir" +set test_failure 1 +set test_driver "G" +set test_driver_id "2a96b604-ec8b-11d0-bee7-080009dc3333" +set test_transp 0.5 +set test_color 11 +set test_material 22 +set test_positionX 100 +set test_positionY 200 +set test_positionZ 300 + +puts "Creating document" +NewDocument D BinOcaf + +# Simple values +SetInteger D 0:1:1 $test_int +SetReal D 0:1:1 $test_real +SetName D 0:1:1 $test_name +SetComment D 0:1:1 $test_comment +SetAsciiString D 0:1:1 $test_string + +# TagSource +SetTagger D 0:1:2 + +# Reference +SetReference D 0:1:3 $test_ref + +# Directory +#NewDirectory D 0:1:2:1 + +# UAttribute +#SetUAttribute D 0:1:2:2 $test_guid + +# Variable +SetVariable D $test_var2 0 mm +SetVariable D $test_var1 1 "" + +# Relation +SetRelation D 0:1:2:3 "2*pi*r" $test_var1 $test_var2 + +# TreeNode +SetNode D 0:1:2:4 + +# Arrays +eval SetIntArray D 0:1:1 1 1 2 $test_int_arr +eval SetRealArray D 0:1:1 1 1 3 $test_real_arr +eval SetExtStringArray D 0:1:1 1 1 2 $test_extstr_arr +eval SetRefArray D 0:1:1 1 2 $test_ref_arr +eval SetByteArray D 0:1:1 1 1 2 $test_byte_arr + +# Lists +eval SetIntegerList D 0:1:1 $test_int_arr +eval SetRealList D 0:1:1 $test_real_arr +eval SetExtStringList D 0:1:1 $test_extstr_arr +eval SetBooleanList D 0:1:1 $test_bool_arr +eval SetReferenceList D 0:1:1 $test_ref_arr + +# IntPackedMap +eval SetIntPackedMap D 0:1:1 1 $test_map + +# NamedData +eval SetNDataIntegers D 0:1:4 2 $test_named_ints +eval SetNDataReals D 0:1:4 2 $test_named_reals +eval SetNDataStrings D 0:1:4 5 $test_named_strings +eval SetNDataBytes D 0:1:4 2 $test_named_bytes +eval SetNDataIntArrays D 0:1:4 ia 2 $test_int_arr +eval SetNDataRealArrays D 0:1:4 ra 3 $test_real_arr + +# NamedShape +eval box Box $test_boxXYZ $test_boxDX $test_boxDY $test_boxDZ +SetShape D 0:1:6 Box + +# Point +eval point Point $test_point +SetPoint D 0:1:5:1 Point + +# Axis +eval line Axis $test_axisPos $test_axisDir +SetAxis D 0:1:5:2 Axis + +# Plane +eval plane Plane $test_plane +SetPlane D 0:1:5:3 Plane + +# Geometry +SetGeometry D 0:1:6 $test_geom_t + +# Constraint +SetConstraint D 0:1:1 equal 0:1:6 + +# PatternStd +SetPattern D 0:1:1 5 0:1:6 + +# Function +SetFunction D 0:1:1 $test_guid $test_failure + +# AISPresentation +AISInitViewer D +AISSet D 0:1:1 $test_driver +AISTransparency D 0:1:1 $test_transp +AISColor D 0:1:1 $test_color +AISMaterial D 0:1:1 $test_material + +# Position +SetPosition D 0:1:1 $test_positionX $test_positionY $test_positionZ + +tinspector -plugins dfbrowser diff --git a/tests/tools/dfbrowser/A5 b/tests/tools/dfbrowser/A5 new file mode 100644 index 0000000000..6fdadd115b --- /dev/null +++ b/tests/tools/dfbrowser/A5 @@ -0,0 +1,78 @@ +pload TOPTEST +pload VISUALIZATION +pload XDE +pload QAcommands +pload DCAF + +set Test "TNaming_Builder test" +set IsDone 1 +set TestError "" + +puts "Creating document" +NewDocument D MDTV-Standard +set TestLab 0:1 + +#################### PRIMITIVE EVOLUTION #################### +box b 100 200 300 + +explode b E +if {[catch {BuildNamedShape D $TestLab:1 PRIMITIVE b}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build solid as primitive" +} +if {[catch {BuildNamedShape D [set TestLab]:1:1 PRIMITIVE b_1}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build edge as alone primitive" +} +if {[catch {BuildNamedShape D [set TestLab]:1:1 PRIMITIVE b_1 b_2 b_3}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build several edges as primitive over the old one" +} +if {[catch {BuildNamedShape D [set TestLab]:1:2 PRIMITIVE b_4 b_5 b_6}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build several edges as primitive" +} + + +#################### GENERATED EVOLUTION #################### +box b2 200 300 400 +explode b2 F +if {[catch {BuildNamedShape D $TestLab:2 GENERATED b b2}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build solid as generation" +} +if {[catch {BuildNamedShape D [set TestLab]:2:1 GENERATED b_1 b2_1}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build face as alone generation" +} +if {[catch {BuildNamedShape D [set TestLab]:2:2 GENERATED b_2 b2_2 b_2 b2_3 b_3 b2_4}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build face as generation n:m" +} +if {[catch {BuildNamedShape D [set TestLab]:2:1 GENERATED b_3 b2_1 b_3 b2_3 b_4 b2_4}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build face as generation n:m to the exists named shape" +} + +#################### MODIFY EVOLUTION #################### +box b3 300 400 500 +explode b3 F +if {[catch {BuildNamedShape D $TestLab:3 MODIFY b2 b3}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build solid as modification" +} +if {[catch {BuildNamedShape D [set TestLab]:3:1 MODIFY b2_1 b3_1}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build face as alone modification" +} +if {[catch {BuildNamedShape D [set TestLab]:3:2 MODIFY b2_5 b3_2 b2_2 b3_3 b2_3 b3_4}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build face as modification n:m" +} +if {[catch {BuildNamedShape D [set TestLab]:3:1 MODIFY b2_3 b3_1 b_3 b3_3 b2_4 b3_4}] == 1} { + set IsDone 0 + set TestError "$TestError # Can't build face as modification n:m to the exists named shape" +} + +pload INSPECTOR +tinspector -select 0:1:3:2 TNaming_NamedShape diff --git a/tests/tools/dfbrowser/A6 b/tests/tools/dfbrowser/A6 new file mode 100644 index 0000000000..7395f50e98 --- /dev/null +++ b/tests/tools/dfbrowser/A6 @@ -0,0 +1,76 @@ +pload DCAF + +chrono qat start +# Create a new document and set UndoLimit +NewDocument D BinOcaf + +#NewDocument D +cpulimit 300 +UndoLimit D 100 + +# Open a transaction +NewCommand D + +puts "caf005-I3" +set QA_DUP 0 + +# Add an attribute to a data framework +set aLabel_Root 0:2 +set aName_Root Label_1 +Label D ${aLabel_Root} +SetName D ${aLabel_Root} ${aName_Root} + +set aName1 Label_1_1 +###set aChild1 [NewChild D ${aLabel_Root}] +set aChild1 0:2:1 +Label D ${aChild1} +SetName D ${aChild1} ${aName1} + +set aName2 Label_1_2 +###set aChild2 [NewChild D ${aLabel_Root}] +set aChild2 0:2:2 +Label D ${aChild2} +SetName D ${aChild2} ${aName2} + +set aName3 Label_1_1_1 +###set aChild3 [NewChild D ${aLabel_Root}] +set aChild3 0:2:3 +Label D ${aChild3} +SetName D ${aChild3} ${aName3} + +set aName4 Label_1_1_2 +###set aChild4 [NewChild D ${aLabel_Root}] +set aChild4 0:2:4 +Label D ${aChild4} +SetName D ${aChild4} ${aName4} + +set aName5 Label_1_1_3 +###set aChild5 [NewChild D ${aLabel_Root}] +set aChild5 0:2:5 +Label D ${aChild5} +SetName D ${aChild5} ${aName5} + +set aName6 Label_1_2_1 +###set aChild6 [NewChild D ${aLabel_Root}] +set aChild6 0:2:6 +Label D ${aChild6} +SetName D ${aChild6} ${aName6} + +set aName7 Label_1_2_2 +###set aChild7 [NewChild D ${aLabel_Root}] +set aChild7 0:2:7 +Label D ${aChild7} +SetName D ${aChild7} ${aName7} + +SetNode D ${aLabel_Root} +AppendNode D ${aLabel_Root} ${aChild1} +AppendNode D ${aLabel_Root} ${aChild2} +AppendNode D ${aChild1} ${aChild3} +AppendNode D ${aChild1} ${aChild4} +AppendNode D ${aChild1} ${aChild5} +AppendNode D ${aChild2} ${aChild6} +AppendNode D ${aChild2} ${aChild7} + +pload INSPECTOR + +tinspector -plugins dfbrowser -select 0:2:6 TDataStd_TreeNode diff --git a/tests/tools/grids.list b/tests/tools/grids.list index 80a8f9607e..c8ade14958 100644 --- a/tests/tools/grids.list +++ b/tests/tools/grids.list @@ -1 +1,3 @@ 001 dfbrowser +001 shapeview +001 vinspector diff --git a/tests/tools/shapeview/A1 b/tests/tools/shapeview/A1 new file mode 100644 index 0000000000..5093256077 --- /dev/null +++ b/tests/tools/shapeview/A1 @@ -0,0 +1,11 @@ +pload ALL INSPECTOR + +tinspector -plugins shapeview + +box b1 200 100 120 +tinspector -shape b1 + +box b2 100 200 220 100 120 100 +tinspector -shape b2 + +tinspector -activate shapeview -select b1 diff --git a/tests/tools/shapeview/A2 b/tests/tools/shapeview/A2 new file mode 100644 index 0000000000..0e78f445b9 --- /dev/null +++ b/tests/tools/shapeview/A2 @@ -0,0 +1,5 @@ +pload ALL INSPECTOR + +tinspector -plugins shapeview + +tinspector -open $env(CSF_OCCTDataPath)/occ/solid.brep shapeview diff --git a/tests/tools/vinspector/A1 b/tests/tools/vinspector/A1 new file mode 100644 index 0000000000..abc11f94f7 --- /dev/null +++ b/tests/tools/vinspector/A1 @@ -0,0 +1,18 @@ +pload ALL INSPECTOR + +tinspector -plugins vinspector + +vinit + +box box_1 0 0 200 100 100 100 +vdisplay box_1 +vselmode box_1 1 1 +vselmode box_1 3 1 + +box box_2 180 120 200 150 150 150 +vdisplay box_2 + +vfit + +tinspector -update -select box_1 + diff --git a/tests/tools/vinspector/A2 b/tests/tools/vinspector/A2 new file mode 100644 index 0000000000..54c60660ff --- /dev/null +++ b/tests/tools/vinspector/A2 @@ -0,0 +1,9 @@ +pload ALL INSPECTOR + +tinspector -plugins vinspector + +vinit + +tinspector -open $env(CSF_OCCTDataPath)/occ/solid.brep +vfit + diff --git a/tools/DFBrowser/DFBrowser_HighlightDelegate.cxx b/tools/DFBrowser/DFBrowser_HighlightDelegate.cxx index fd5a1a132a..3d7b55e692 100644 --- a/tools/DFBrowser/DFBrowser_HighlightDelegate.cxx +++ b/tools/DFBrowser/DFBrowser_HighlightDelegate.cxx @@ -15,7 +15,7 @@ #include -#include +#include #include // ======================================================================= @@ -28,7 +28,7 @@ void DFBrowser_HighlightDelegate::paint (QPainter* thePainter, const QStyleOptio // highlight cell if (theOption.state & QStyle::State_MouseOver) { - QColor aHighlightColor = DFBrowser_Window::LightHighlightColor(); + QColor aHighlightColor = DFBrowserPane_Tools::LightHighlightColor(); thePainter->fillRect (theOption.rect, aHighlightColor); } // default paint diff --git a/tools/DFBrowser/DFBrowser_ItemRole.hxx b/tools/DFBrowser/DFBrowser_ItemRole.hxx index 96b09a457b..d06f24d792 100644 --- a/tools/DFBrowser/DFBrowser_ItemRole.hxx +++ b/tools/DFBrowser/DFBrowser_ItemRole.hxx @@ -16,12 +16,14 @@ #ifndef DFBrowser_ItemRole_H #define DFBrowser_ItemRole_H +#include + #include //! Additional data item role for DFBrowser tree item enum DFBrowser_ItemRole { - DFBrowser_ItemRole_AdditionalInfo = Qt::UserRole + 1 //!< an attribute additional information + DFBrowser_ItemRole_AdditionalInfo = DFBrowserPane_ItemRole_LastTreeRole + 1 //!< an attribute additional information }; #endif diff --git a/tools/DFBrowser/DFBrowser_SearchLine.cxx b/tools/DFBrowser/DFBrowser_SearchLine.cxx index 101eb37055..d0981894ed 100644 --- a/tools/DFBrowser/DFBrowser_SearchLine.cxx +++ b/tools/DFBrowser/DFBrowser_SearchLine.cxx @@ -65,8 +65,7 @@ public: QRect aLineRect = rect(); Qt::Alignment anAlignment = QStyle::visualAlignment (layoutDirection(), Qt::AlignLeft); - QColor aColor = palette().text().color(); - aColor.setAlpha (128); + QColor aColor = Qt::gray; QPen anOldpen = aPainter.pen(); aPainter.setPen (aColor); aLineRect.adjust (4, 4, 0, 0); diff --git a/tools/DFBrowser/DFBrowser_SearchView.cxx b/tools/DFBrowser/DFBrowser_SearchView.cxx index c0416aa30c..54d694dcaa 100644 --- a/tools/DFBrowser/DFBrowser_SearchView.cxx +++ b/tools/DFBrowser/DFBrowser_SearchView.cxx @@ -82,10 +82,11 @@ void DFBrowser_SearchView::InitModels() // function : onTableSelectionChanged // purpose : // ======================================================================= -void DFBrowser_SearchView::onTableSelectionChanged (const QItemSelection& theSelected, +void DFBrowser_SearchView::onTableSelectionChanged (const QItemSelection&, const QItemSelection&) { - QModelIndexList aSelectedIndices = theSelected.indexes(); + QItemSelectionModel* aSelectionModel = myTableView->selectionModel(); + QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); QModelIndex aSelectedIndex = DFBrowser_Window::SingleSelected (aSelectedIndices, 2); if (!aSelectedIndex.isValid()) return; diff --git a/tools/DFBrowser/DFBrowser_TreeLevelLine.cxx b/tools/DFBrowser/DFBrowser_TreeLevelLine.cxx index 8714f4f357..24ed7d294b 100644 --- a/tools/DFBrowser/DFBrowser_TreeLevelLine.cxx +++ b/tools/DFBrowser/DFBrowser_TreeLevelLine.cxx @@ -34,6 +34,7 @@ #include const int HISTORY_SIZE = 10; +const int MARGIN_SIZE = 2; // ======================================================================= // function : Constructor @@ -44,7 +45,7 @@ DFBrowser_TreeLevelLine::DFBrowser_TreeLevelLine (QWidget* theParent) { myMainWindow = new QWidget (theParent); QGridLayout* aLayout = new QGridLayout (myMainWindow); - aLayout->setContentsMargins (0, 0, 0, 0); + aLayout->setContentsMargins (MARGIN_SIZE, MARGIN_SIZE, MARGIN_SIZE, MARGIN_SIZE); myBackwardButton = new QToolButton (myMainWindow); myBackwardButton->setIcon (QIcon (":/icons/treeline_backward.png")); @@ -64,13 +65,12 @@ DFBrowser_TreeLevelLine::DFBrowser_TreeLevelLine (QWidget* theParent) aVHeader->setVisible (false); int aDefCellSize = aVHeader->minimumSectionSize() + DFBrowserPane_Tools::HeaderSectionMargin(); aVHeader->setDefaultSectionSize (aDefCellSize); - aLayout->addWidget (myTableView, 0, 2, 2, 1); + aLayout->addWidget (myTableView, 0, 2); - int aScrollHeight = myTableView->horizontalScrollBar()->sizeHint().height(); - myTableView->setFixedHeight (aDefCellSize + aScrollHeight); + myTableView->setFixedHeight (aDefCellSize); myTableView->horizontalHeader()->setMinimumSectionSize (5); // it will be resized by context myTableView->setHorizontalScrollMode (QAbstractItemView::ScrollPerItem); - myTableView->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOn); //! TEMPORARY + myTableView->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff); //! TEMPORARY myTableView->setShowGrid (false); DFBrowser_TreeLevelLineModel* aHModel = new DFBrowser_TreeLevelLineModel (myTableView); diff --git a/tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.cxx b/tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.cxx index 9eb9cc5646..1b1be9f4ba 100644 --- a/tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.cxx +++ b/tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.cxx @@ -14,7 +14,7 @@ // commercial license or contractual agreement. #include -#include +#include #include @@ -36,7 +36,7 @@ void DFBrowser_TreeLevelLineDelegate::paint (QPainter* thePainter, const QStyleO { // highlight cell if (theOption.state & QStyle::State_MouseOver) - thePainter->fillRect (theOption.rect, DFBrowser_Window::LightHighlightColor()); + thePainter->fillRect (theOption.rect, DFBrowserPane_Tools::LightHighlightColor()); // action icon for all indices before the last one if (theIndex.column() < theIndex.model()->columnCount()-1) diff --git a/tools/DFBrowser/DFBrowser_TreeLevelView.cxx b/tools/DFBrowser/DFBrowser_TreeLevelView.cxx index 60e899812c..855aacdf2b 100644 --- a/tools/DFBrowser/DFBrowser_TreeLevelView.cxx +++ b/tools/DFBrowser/DFBrowser_TreeLevelView.cxx @@ -28,7 +28,7 @@ #include #include -const int DEFAULT_COLUMN_WIDTH = 300; +const int LABEL_OR_ATTRIBUTECOLUMN_WIDTH = 160; // ======================================================================= // function : Constructor @@ -43,11 +43,12 @@ DFBrowser_TreeLevelView::DFBrowser_TreeLevelView (QWidget* theParent) myTableView = new QTableView (myMainWindow); myTableView->setModel (new DFBrowser_TreeLevelViewModel (myTableView)); - myTableView->setColumnWidth (0, DEFAULT_COLUMN_WIDTH); + myTableView->setColumnWidth (0, LABEL_OR_ATTRIBUTECOLUMN_WIDTH); myTableView->setEditTriggers (QAbstractItemView::DoubleClicked); + myTableView->horizontalHeader()->setVisible (false); QHeaderView* aVHeader = myTableView->verticalHeader(); aVHeader->setVisible (false); - aVHeader->setDefaultSectionSize (aVHeader->minimumSectionSize() + DFBrowserPane_Tools::HeaderSectionMargin()); + aVHeader->setDefaultSectionSize (aVHeader->minimumSectionSize()); myTableView->horizontalHeader()->setStretchLastSection (true); aLayout->addWidget (myTableView); diff --git a/tools/DFBrowser/DFBrowser_TreeLevelViewModel.cxx b/tools/DFBrowser/DFBrowser_TreeLevelViewModel.cxx index e618568d51..9f442d061d 100644 --- a/tools/DFBrowser/DFBrowser_TreeLevelViewModel.cxx +++ b/tools/DFBrowser/DFBrowser_TreeLevelViewModel.cxx @@ -26,6 +26,9 @@ #include #include +#include +#include +#include #include // ======================================================================= @@ -84,7 +87,7 @@ QVariant DFBrowser_TreeLevelViewModel::data (const QModelIndex& theIndex, int th QVariant aValue; TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex); - if (anIndex.column() == 0) + if (theIndex.column() == 0) { DFBrowser_ItemBasePtr aDBrowserItem = itemDynamicCast (anItemBase); bool aPrevValue = aDBrowserItem->SetUseAdditionalInfo (false); @@ -99,6 +102,15 @@ QVariant DFBrowser_TreeLevelViewModel::data (const QModelIndex& theIndex, int th aValue = anItem->GetAttributeInfo (DFBrowser_ItemRole_AdditionalInfo); } } + if (theIndex.column() == 0 && theRole == Qt::FontRole) // method name is in italic + { + QFont aFont = qApp->font(); + aFont.setItalic (true); + return aFont; + } + if (theIndex.column() == 0 && theRole == Qt::ForegroundRole) // method name is light gray + return QColor (Qt::darkGray).darker(150); + return aValue; } diff --git a/tools/DFBrowser/DFBrowser_TreeModel.cxx b/tools/DFBrowser/DFBrowser_TreeModel.cxx index ce91e80566..c23a43f413 100644 --- a/tools/DFBrowser/DFBrowser_TreeModel.cxx +++ b/tools/DFBrowser/DFBrowser_TreeModel.cxx @@ -252,6 +252,6 @@ void DFBrowser_TreeModel::ConvertToIndices (const NCollection_List #include #include -#if QT_VERSION < 0x050000 -#include -#endif #include #include #include @@ -85,9 +82,9 @@ #include #endif -const int DFBROWSER_DEFAULT_WIDTH = 1200; -const int DFBROWSER_DEFAULT_HEIGHT = 850; -const int DFBROWSER_DEFAULT_TREE_VIEW_WIDTH = 300; +const int DFBROWSER_DEFAULT_WIDTH = 650; +const int DFBROWSER_DEFAULT_HEIGHT = 350; +const int DFBROWSER_DEFAULT_TREE_VIEW_WIDTH = 325; const int DFBROWSER_DEFAULT_TREE_VIEW_HEIGHT = 500; const int DFBROWSER_DEFAULT_VIEW_WIDTH = 400; const int DFBROWSER_DEFAULT_VIEW_HEIGHT = 300; @@ -96,7 +93,7 @@ const int DFBROWSER_DEFAULT_POSITION_X = 200; const int DFBROWSER_DEFAULT_POSITION_Y = 60; const int OCAF_BROWSER_COLUMN_WIDTH_0 = 300; -const int DEFAULT_PROPERTY_PANEL_HEIGHT = 100; +const int DEFAULT_PROPERTY_PANEL_HEIGHT = 200; const int DEFAULT_BROWSER_HEIGHT = 800; // ======================================================================= @@ -119,6 +116,7 @@ DFBrowser_Window::DFBrowser_Window() myTreeView->setSortingEnabled (Standard_False); QDockWidget* aTreeViewWidget = new QDockWidget (tr ("TreeView"), myMainWindow); + aTreeViewWidget->setTitleBarWidget (new QWidget(myMainWindow)); aTreeViewWidget->setFeatures (QDockWidget::NoDockWidgetFeatures); aTreeViewWidget->setWidget (myTreeView); myMainWindow->addDockWidget (Qt::LeftDockWidgetArea, aTreeViewWidget); @@ -137,6 +135,7 @@ DFBrowser_Window::DFBrowser_Window() connect (myTreeLevelLine, SIGNAL (updateClicked()), this, SLOT (onUpdateClicked())); QDockWidget* aTreeLineDockWidget = new QDockWidget (tr ("Tree Level Line"), myMainWindow); + aTreeLineDockWidget->setTitleBarWidget (new QWidget(myMainWindow)); aTreeLineDockWidget->setFeatures (QDockWidget::NoDockWidgetFeatures); aTreeLineDockWidget->setWidget (myTreeLevelLine->GetControl()); myMainWindow->addDockWidget (Qt::TopDockWidgetArea, aTreeLineDockWidget); @@ -148,6 +147,7 @@ DFBrowser_Window::DFBrowser_Window() myDumpView = new DFBrowser_DumpView (aDumpWidget); aDumpLay->addWidget (myDumpView->GetControl()); QDockWidget* aDumpDockWidget = new QDockWidget (tr ("Dump"), myMainWindow); + aDumpDockWidget->setWidget (aDumpWidget); myMainWindow->addDockWidget (Qt::BottomDockWidgetArea, aDumpDockWidget); @@ -178,18 +178,16 @@ DFBrowser_Window::DFBrowser_Window() myViewWindow->GetView()->SetPredefinedSize (DFBROWSER_DEFAULT_VIEW_WIDTH, DFBROWSER_DEFAULT_VIEW_HEIGHT); QDockWidget* aViewDockWidget = new QDockWidget (tr ("View"), myMainWindow); + aViewDockWidget->setTitleBarWidget (myViewWindow->GetViewToolBar()->GetControl()); aViewDockWidget->setWidget (myViewWindow); myMainWindow->addDockWidget (Qt::BottomDockWidgetArea, aViewDockWidget); - QColor aHColor = DFBrowser_Window::LightHighlightColor(); + QColor aHColor (229, 243, 255); myViewWindow->GetDisplayer()->SetAttributeColor (Quantity_Color(aHColor.red() / 255., aHColor.green() / 255., aHColor.blue() / 255., Quantity_TOC_RGB), View_PresentationType_Additional); myMainWindow->tabifyDockWidget (aDumpDockWidget, aViewDockWidget); - myMainWindow->resize (DFBROWSER_DEFAULT_WIDTH, DFBROWSER_DEFAULT_HEIGHT); - myMainWindow->move (DFBROWSER_DEFAULT_POSITION_X, DFBROWSER_DEFAULT_POSITION_Y); - - aTreeViewWidget->resize (DFBROWSER_DEFAULT_TREE_VIEW_WIDTH, DFBROWSER_DEFAULT_HEIGHT); + aTreeViewWidget->resize (DFBROWSER_DEFAULT_TREE_VIEW_WIDTH, DFBROWSER_DEFAULT_TREE_VIEW_HEIGHT); myThread = new DFBrowser_Thread (this); @@ -792,6 +790,7 @@ void DFBrowser_Window::onPaneSelectionChanged (const QItemSelection&, if (!aPresentation.IsNull()) aDisplayer->DisplayPresentation (aPresentation, View_PresentationType_Additional); else { + aDisplayer->ErasePresentations (View_PresentationType_Additional, false); AIS_ListOfInteractive aDisplayed; findPresentations (anIndices, aDisplayed); for (AIS_ListIteratorOfListOfInteractive aDisplayedIt (aDisplayed); aDisplayedIt.More(); aDisplayedIt.Next()) @@ -904,7 +903,7 @@ void DFBrowser_Window::highlightIndices (const QModelIndexList& theIndices) aTreeModel->SetHighlighted (theIndices); QModelIndex anIndexToScroll; - if (theIndices.size() > 0) + if (!theIndices.isEmpty()) anIndexToScroll = theIndices.last(); // scroll to last selected index else { @@ -917,6 +916,9 @@ void DFBrowser_Window::highlightIndices (const QModelIndexList& theIndices) if (anIndexToScroll.isValid()) myTreeView->scrollTo (anIndexToScroll); + if (theIndices.isEmpty()) + myTreeView->setFocus(); // to see the selected item in active palette color + aTreeModel->EmitLayoutChanged(); } diff --git a/tools/DFBrowser/DFBrowser_Window.hxx b/tools/DFBrowser/DFBrowser_Window.hxx index 20dd55b6f6..8eb8e603d7 100644 --- a/tools/DFBrowser/DFBrowser_Window.hxx +++ b/tools/DFBrowser/DFBrowser_Window.hxx @@ -110,10 +110,6 @@ public: //! \return string value Standard_EXPORT static TCollection_AsciiString TmpDirectory(); - //! Returns light highlight color - //! \returns Qt color - static QColor LightHighlightColor() { return QColor (229, 243, 255); } - //! Returns single selected item in the cell of given orientation. If the orientation is Horizontal, //! in the cell id colum, one row should be selected. //! \param theIndices a container of selected indices diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePane.cxx b/tools/DFBrowserPane/DFBrowserPane_AttributePane.cxx index bdcc8a3d9e..1b1326efc5 100644 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePane.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_AttributePane.cxx @@ -32,13 +32,12 @@ // purpose : // ======================================================================= DFBrowserPane_AttributePane::DFBrowserPane_AttributePane() -: DFBrowserPane_AttributePaneAPI(), myMainWidget (0), myTableView (0), myPaneModel (0) +: DFBrowserPane_AttributePaneAPI(), myMainWidget (0), myTableView (0) { myPaneModel = new DFBrowserPane_AttributePaneModel(); - QList aHeaderValues; - aHeaderValues << "Values"; - getPaneModel()->SetHeaderValues (aHeaderValues, Qt::Horizontal); + getPaneModel()->SetColumnCount (getColumnCount()); + getPaneModel()->SetHeaderValues (getHeaderValues(Qt::Horizontal), Qt::Horizontal); mySelectionModels.push_back (new QItemSelectionModel (myPaneModel)); } @@ -66,6 +65,14 @@ QWidget* DFBrowserPane_AttributePane::CreateWidget (QWidget* theParent) myTableView = new DFBrowserPane_TableView (aMainWidget, getTableColumnWidths()); myTableView->SetModel (myPaneModel); QTableView* aTableView = myTableView->GetTableView(); + DFBrowserPane_AttributePaneModel* aPaneModel = dynamic_cast(myPaneModel); + if (aPaneModel) + { + if (aPaneModel->GetOrientation() == Qt::Vertical) + aTableView->horizontalHeader()->setVisible (!aPaneModel->HeaderValues (Qt::Horizontal).isEmpty()); + else + aTableView->verticalHeader()->setVisible (!aPaneModel->HeaderValues (Qt::Vertical).isEmpty()); + } aTableView->setSelectionModel (mySelectionModels.front()); aTableView->setSelectionBehavior (QAbstractItemView::SelectRows); @@ -85,6 +92,9 @@ void DFBrowserPane_AttributePane::Init (const Handle(TDF_Attribute)& theAttribut QList aValues; GetValues (theAttribute, aValues); getPaneModel()->Init (aValues); + + if (myTableView) + myTableView->GetTableView()->resizeColumnToContents (0); } // ======================================================================= @@ -111,6 +121,19 @@ QVariant DFBrowserPane_AttributePane::GetAttributeInfo (const Handle(TDF_Attribu } } +// ======================================================================= +// function : GetShortAttributeInfo +// purpose : +// ======================================================================= +void DFBrowserPane_AttributePane::GetShortAttributeInfo (const Handle(TDF_Attribute)& theAttribute, QList& theValues) +{ + QList aValues; + GetValues(theAttribute, aValues); + + for (int aValuesEvenId = 1; aValuesEvenId < aValues.size(); aValuesEvenId = aValuesEvenId + 2) + theValues.append (aValues[aValuesEvenId]); +} + // ======================================================================= // function : GetAttributeInfoByType // purpose : diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePane.hxx b/tools/DFBrowserPane/DFBrowserPane_AttributePane.hxx index 972ad80ca7..8ad949d290 100644 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePane.hxx +++ b/tools/DFBrowserPane/DFBrowserPane_AttributePane.hxx @@ -84,11 +84,10 @@ public: //! \return value, interpreted by tree model depending on the role Standard_EXPORT virtual QVariant GetAttributeInfo(const Handle(TDF_Attribute)& theAttribute, int theRole, int theColumnId); - //! Returns brief attribute information. In general case, it returns GetValues() result. + //! Returns brief attribute information. In general case, it returns even values of GetValues() result. //! \param theAttribute a current attribute //! \param theValues a result list of values - virtual void GetShortAttributeInfo (const Handle(TDF_Attribute)& theAttribute, QList& theValues) - { GetValues(theAttribute, theValues); } + Standard_EXPORT virtual void GetShortAttributeInfo (const Handle(TDF_Attribute)& theAttribute, QList& theValues); //! Returns list of selection models. In default implementation it contains a selection model for the table view //! \returns container of models @@ -102,6 +101,16 @@ protected: //! Returns converted table view DFBrowserPane_TableView* getTableView() const { return myTableView; } + //! Returns header text values for 0...n table cells in parameter orientation + //! \param theOrientation defines horizontal or vertical values + //! \param theValues output container of values + virtual QList getHeaderValues (const Qt::Orientation theOrientation) + { (void)theOrientation; return QList(); } + + //! Retuns number of columns in internal table. By default it returns 2 : method name for method value. + //! \return integer value + virtual int getColumnCount() const { return 2; } + //! Defines widths of table columns //! \return container of widths Standard_EXPORT virtual QMap getTableColumnWidths() const; diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.cxx b/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.cxx index ff6aac7f01..3b306b4224 100644 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.cxx @@ -15,6 +15,10 @@ #include +#include +#include +#include + // ======================================================================= // function : Constructor // purpose : @@ -22,6 +26,7 @@ DFBrowserPane_AttributePaneModel::DFBrowserPane_AttributePaneModel (QObject* theParent) : QAbstractTableModel (theParent), myOrientation (Qt::Vertical), myColumnCount (1) { + myItalicColumns.append (0); } // ======================================================================= @@ -120,6 +125,15 @@ QVariant DFBrowserPane_AttributePaneModel::data (const QModelIndex& theIndex, in aValue = aColValues.at (theIndex.row()); } } + if (myItalicColumns.contains (theIndex.column()) && theRole == Qt::FontRole) + { + QFont aFont = qApp->font(); + aFont.setItalic (true); + return aFont; + } + if (myItalicColumns.contains (theIndex.column()) && theRole == Qt::ForegroundRole) + return QColor (Qt::darkGray).darker(150); + return aValue; } diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.hxx b/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.hxx index 8177df3fc8..047ea67d21 100644 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.hxx +++ b/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.hxx @@ -46,35 +46,53 @@ public: //! \param theOrientation if horizontal, the values are applyed by rows, otherwise by columns void SetOrientation (const Qt::Orientation& theOrientation) { myOrientation = theOrientation; } + //! Returns table orientation for setting data values + //! \return thye current orientation + Qt::Orientation GetOrientation() const { return myOrientation; } + //! Sets number of columns //! \param theColumnCount a column count void SetColumnCount (const int theColumnCount) { myColumnCount = theColumnCount; } //! Fills the model with the values. Store the values in a cache. //! \param theValues a container of values - Standard_EXPORT void Init(const QList& theValues); + Standard_EXPORT void Init (const QList& theValues); //! Fills the model header values for orientation. //! \param theValues a container of header text values //! \param theOrientation an orientation of header - Standard_EXPORT void SetHeaderValues(const QList& theValues, Qt::Orientation theOrientation); + Standard_EXPORT void SetHeaderValues (const QList& theValues, Qt::Orientation theOrientation); + + //! Returns header values for orientation. + //! \param theValues a container of header text values + //! \param theOrientation an orientation of header + const QList& HeaderValues (Qt::Orientation theOrientation) + { return theOrientation == Qt::Horizontal ? myHorizontalHeaderValues : myVerticalHeaderValues; } + + //! Returns indices of italic columns + //! \return indices of columns + const QList& GetItalicColumns() const { return myItalicColumns; } + + //! Sets indices of italic columns + //! \param theValues indices of columns + void SetItalicColumns (const QList& theValues) { myItalicColumns = theValues; } //! Returns number of columns, depending on orientation: myColumnCount or size of values container //! \param theParent an index of the parent item //! \return an integer value - Standard_EXPORT virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE; + Standard_EXPORT virtual int columnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE; //! Returns number of rows, depending on orientation: myColumnCount or size of values container //! \param theParent an index of the parent item //! \return an integer value - Standard_EXPORT virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE; + Standard_EXPORT virtual int rowCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE; //! Returns content of the model index for the given role, it is obtained from internal container of values //! It returns value only for DisplayRole. //! \param theIndex a model index //! \param theRole a view role //! \return value intepreted depending on the given role - Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex, int theRole = Qt::DisplayRole) const Standard_OVERRIDE; + Standard_EXPORT virtual QVariant data (const QModelIndex& theIndex, int theRole = Qt::DisplayRole) const Standard_OVERRIDE; //! Returns content of the model index for the given role, it is obtainer from internal container of header values //! It returns value only for DisplayRole. @@ -82,7 +100,7 @@ public: //! \param theIndex a model index //! \param theRole a view role //! \return value intepreted depending on the given role - Standard_EXPORT virtual QVariant headerData(int theSection, Qt::Orientation theOrientation, int theRole = Qt::DisplayRole) const Standard_OVERRIDE; + Standard_EXPORT virtual QVariant headerData (int theSection, Qt::Orientation theOrientation, int theRole = Qt::DisplayRole) const Standard_OVERRIDE; //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable //! \param theIndex a model index @@ -97,6 +115,8 @@ private: QMap< int, QList > myValuesMap; //!< container of values, filled in Init(), used in data() QList myHorizontalHeaderValues; //!< table horizontal header values QList myVerticalHeaderValues; //!< table vertical header values + QList myItalicColumns; //!< indices of columns that should be visualized in gray and italic + }; #endif diff --git a/tools/DFBrowserPane/DFBrowserPane_HelperArray.cxx b/tools/DFBrowserPane/DFBrowserPane_HelperArray.cxx index 7848c10ece..f52bbd446b 100644 --- a/tools/DFBrowserPane/DFBrowserPane_HelperArray.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_HelperArray.cxx @@ -18,9 +18,11 @@ #include +#include +#include #include +#include #include -#include #include // ======================================================================= @@ -28,26 +30,25 @@ // purpose : // ======================================================================= DFBrowserPane_HelperArray::DFBrowserPane_HelperArray (DFBrowserPane_AttributePaneModel* theValuesModel) - : myValuesModel (theValuesModel) + : myValuesModel (theValuesModel), myArrayBounds (0), myValuesView (0) { myBoundsModel = new DFBrowserPane_AttributePaneModel(); - - QList aHeaderValues; - aHeaderValues << "Bounds"; - myBoundsModel->SetHeaderValues (aHeaderValues, Qt::Horizontal); + myBoundsModel->SetColumnCount (2); } // ======================================================================= // function : CreateWidget // purpose : // ======================================================================= -void DFBrowserPane_HelperArray::CreateWidget (QWidget* theParent, QWidget* theValuesView) +void DFBrowserPane_HelperArray::CreateWidget (QWidget* theParent, DFBrowserPane_TableView* theValuesView) { + myValuesView = theValuesView; myArrayBounds = new DFBrowserPane_TableView (theParent); myArrayBounds->SetModel (myBoundsModel); DFBrowserPane_TableView::SetFixedRowCount (2, myArrayBounds->GetTableView()); QGridLayout* aLay = new QGridLayout (theParent); + aLay->setContentsMargins (0, 0, 0, 0); aLay->addWidget (myArrayBounds); aLay->addWidget (theValuesView); aLay->setRowStretch (1, 1); @@ -60,19 +61,19 @@ void DFBrowserPane_HelperArray::CreateWidget (QWidget* theParent, QWidget* theVa void DFBrowserPane_HelperArray::Init (const QList& theValues) { QList aTmpValues; - aTmpValues << theValues[0] << theValues[1]; + aTmpValues << "Lower" << theValues[0] << "Upper" << theValues[1]; myBoundsModel->Init (aTmpValues); aTmpValues.clear(); - QList aHeaderValues; int aLower = theValues[0].toInt(); - for (int aValuesIt = 2, aSize = theValues.size(); aValuesIt < aSize; aValuesIt++) - { - aTmpValues << theValues[aValuesIt]; - aHeaderValues << aLower + (aValuesIt - 2); - } - myValuesModel->SetHeaderValues (aHeaderValues, Qt::Vertical); + for (int aValueIt = 2, aSize = theValues.size(); aValueIt < aSize; aValueIt++) + aTmpValues << QString ("Value (%1)").arg(aValueIt-2 + aLower) << theValues[aValueIt]; myValuesModel->Init (aTmpValues); + + if (myArrayBounds) + myArrayBounds->GetTableView()->resizeColumnToContents (0); + if (myValuesView) + myValuesView->GetTableView()->resizeColumnToContents (0); } // ======================================================================= @@ -83,5 +84,5 @@ void DFBrowserPane_HelperArray::GetShortAttributeInfo (const Handle(TDF_Attribut QList& theValues) { for (int aRowId = 0, aRows = myValuesModel->rowCount(); aRowId < aRows; aRowId++) - theValues.append (myValuesModel->data (myValuesModel->index (aRowId, 0))); + theValues.append (myValuesModel->data (myValuesModel->index (aRowId, 1))); } diff --git a/tools/DFBrowserPane/DFBrowserPane_HelperArray.hxx b/tools/DFBrowserPane/DFBrowserPane_HelperArray.hxx index 350d6bcbb9..071a1bd33d 100644 --- a/tools/DFBrowserPane/DFBrowserPane_HelperArray.hxx +++ b/tools/DFBrowserPane/DFBrowserPane_HelperArray.hxx @@ -47,7 +47,7 @@ public: //! Creates bounds table view and grid layout, where the bounds view and the values view are shown //! \param theParent a parent widget //! \param theValuesView a view of values(table view filled by myValuesModel) - Standard_EXPORT void CreateWidget(QWidget* theParent, QWidget* theValuesView); + Standard_EXPORT void CreateWidget(QWidget* theParent, DFBrowserPane_TableView* theValuesView); //! Fills bounds model by firsth and second values, fills values model by left values //! \param theValues values to fill views @@ -63,5 +63,6 @@ private: DFBrowserPane_AttributePaneModel* myValuesModel; //!< model of table view DFBrowserPane_AttributePaneModel* myBoundsModel; //!< model of bounds view DFBrowserPane_TableView* myArrayBounds; //!< bounds view + DFBrowserPane_TableView* myValuesView; //!< values view }; #endif diff --git a/tools/DFBrowserPane/DFBrowserPane_HelperExport.cxx b/tools/DFBrowserPane/DFBrowserPane_HelperExport.cxx index 9cdf77fae4..aa00516b18 100644 --- a/tools/DFBrowserPane/DFBrowserPane_HelperExport.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_HelperExport.cxx @@ -47,7 +47,11 @@ void DFBrowserPane_HelperExport::OnButtonPressed (const QModelIndex& theIndex) QString aFileExtension = ".brep"; +#if QT_VERSION < 0x050000 QString aFilter (tr ("BREP file (*%1*)").arg (aFileExtension)); +#else + QString aFilter; +#endif QString aSelectedFilter; QString aFileName = QFileDialog::getSaveFileName (0, tr ("Export shape to BREP file"), QString(), aFilter, &aSelectedFilter); diff --git a/tools/DFBrowserPane/DFBrowserPane_HelperGroupContent.cxx b/tools/DFBrowserPane/DFBrowserPane_HelperGroupContent.cxx deleted file mode 100644 index fff0ba17f8..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_HelperGroupContent.cxx +++ /dev/null @@ -1,49 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_HelperGroupContent::DFBrowserPane_HelperGroupContent (const QString& theTitle, QWidget* theParent, - QWidget* theControl) -: QGroupBox (theTitle, theParent), myControl (0) -{ - setCheckable (true); - - myControl = theControl; - QHBoxLayout* aLayout = new QHBoxLayout (this); - aLayout->addWidget (myControl); - - connect (this, SIGNAL (clicked (bool)), this, SLOT (onChecked(bool))); - - setChecked (false); - onChecked (isChecked()); -} - -// ======================================================================= -// function : onChecked -// purpose : -// ======================================================================= -void DFBrowserPane_HelperGroupContent::onChecked (bool theState) -{ - if (myControl) - myControl->setVisible (theState); -} diff --git a/tools/DFBrowserPane/DFBrowserPane_HelperGroupContent.hxx b/tools/DFBrowserPane/DFBrowserPane_HelperGroupContent.hxx deleted file mode 100644 index b472833fa5..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_HelperGroupContent.hxx +++ /dev/null @@ -1,53 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_HelperGroupContent_H -#define DFBrowserPane_HelperGroupContent_H - -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable : 4127) // conditional expression is constant -#endif -#include - -class QWidget; - -//! \class DFBrowserPane_HelperGroupContent -//! \brief Creates a check group box for the given control. If checked, the control is enabled, -//! otherwise it sets it as disabled -class DFBrowserPane_HelperGroupContent : public QGroupBox -{ -Q_OBJECT -public: - - //! Constructor - Standard_EXPORT DFBrowserPane_HelperGroupContent (const QString& theTitle, QWidget* theParent, QWidget* theControl); - - //! Destructor - virtual ~DFBrowserPane_HelperGroupContent() Standard_OVERRIDE {} - -protected slots: - //! Set enable/disable current control depending on check box state - //! \param theState state of the check box - void onChecked (bool theState); - -private: - - QWidget* myControl; //!< the source control, that will be enabled/disabled -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_ItemRole.hxx b/tools/DFBrowserPane/DFBrowserPane_ItemRole.hxx index fc63a30f84..2cdd55b690 100644 --- a/tools/DFBrowserPane/DFBrowserPane_ItemRole.hxx +++ b/tools/DFBrowserPane/DFBrowserPane_ItemRole.hxx @@ -16,13 +16,16 @@ #ifndef DFBrowserPane_ItemRole_H #define DFBrowserPane_ItemRole_H +#include + //! Custom item role for attribute pane enum DFBrowserPane_ItemRole { - DFBrowserPane_ItemRole_ShortInfo = Qt::UserRole + 1, //!< not full information of an attribute + DFBrowserPane_ItemRole_ShortInfo = TreeModel_ItemRole_LastTreeRole + 1, //!< not full information of an attribute DFBrowserPane_ItemRole_Decoration_40x40, //!< icon with greater size DFBrowserPane_ItemRole_DisplayExtended, // extended item information (with additional information) for Qt::DisplayRole - DFBrowserPane_ItemRole_ToolTipExtended // exteneded tool tip information for Qt::ToolTipRole + DFBrowserPane_ItemRole_ToolTipExtended, // exteneded tool tip information for Qt::ToolTipRole + DFBrowserPane_ItemRole_LastTreeRole //! last enumeration value to use outside incremented }; #endif diff --git a/tools/DFBrowserPane/DFBrowserPane_OcctEnumType.hxx b/tools/DFBrowserPane/DFBrowserPane_OcctEnumType.hxx index ff861d0a67..e0b3543ecc 100644 --- a/tools/DFBrowserPane/DFBrowserPane_OcctEnumType.hxx +++ b/tools/DFBrowserPane/DFBrowserPane_OcctEnumType.hxx @@ -27,7 +27,8 @@ enum DFBrowserPane_OcctEnumType DB_DIMENSION_TYPE = 5, //!< TDataStd_RealEnum values DB_MATERIAL_TYPE = 6, //!< Graphic3d_NameOfMaterial values DB_DISPLAY_MODE = 7, //!< AIS_DisplayMode values - DB_ORIENTATION_TYPE = 8 //!< TopAbs_Orientation values + DB_ORIENTATION_TYPE = 8, //!< TopAbs_Orientation values + DB_CDM_CAN_CLOSE_STATUS //!< CDM_CanCloseStatus values }; #endif diff --git a/tools/DFBrowserPane/DFBrowserPane_TDFReference.cxx b/tools/DFBrowserPane/DFBrowserPane_TDFReference.cxx index 12197a9597..757b884e51 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDFReference.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDFReference.cxx @@ -29,11 +29,12 @@ void DFBrowserPane_TDFReference::GetValues (const Handle(TDF_Attribute)& theAttribute, QList& theValues) { Handle(TDF_Reference) anAttribute = Handle(TDF_Reference)::DownCast (theAttribute); - if (!anAttribute.IsNull()) - { - TDF_Label aLabel = anAttribute->Get(); - theValues.append (DFBrowserPane_Tools::GetEntry (aLabel).ToCString()); - } + if (anAttribute.IsNull()) + return; + + TDF_Label aLabel = anAttribute->Get(); + theValues.append ("Get"); + theValues.append (DFBrowserPane_Tools::GetEntry (aLabel).ToCString()); } // ======================================================================= diff --git a/tools/DFBrowserPane/DFBrowserPane_TDFTagSource.cxx b/tools/DFBrowserPane/DFBrowserPane_TDFTagSource.cxx index b9ccdc7556..653c72c9c3 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDFTagSource.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDFTagSource.cxx @@ -29,6 +29,7 @@ void DFBrowserPane_TDFTagSource::GetValues (const Handle(TDF_Attribute)& theAttr Handle(TDF_TagSource) anAttribute = Handle(TDF_TagSource)::DownCast (theAttribute); if (anAttribute.IsNull()) return; + theValues.append ("Get"); theValues.append (anAttribute->Get()); } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdAsciiString.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdAsciiString.cxx index d4a357adf6..502c6c1480 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdAsciiString.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdAsciiString.cxx @@ -28,6 +28,9 @@ void DFBrowserPane_TDataStdAsciiString::GetValues (const Handle(TDF_Attribute)& QList& theValues) { Handle(TDataStd_AsciiString) anAttribute = Handle(TDataStd_AsciiString)::DownCast (theAttribute); - if (!anAttribute.IsNull()) - theValues.append (anAttribute->Get().ToCString()); + if (anAttribute.IsNull()) + return; + + theValues.append ("Get"); + theValues.append (anAttribute->Get().ToCString()); } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdBooleanArray.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdBooleanArray.cxx index e6f8749bef..64b30c60a2 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdBooleanArray.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdBooleanArray.cxx @@ -24,9 +24,9 @@ #pragma warning(disable : 4127) // conditional expression is constant #endif +#include #include #include -#include // ======================================================================= // function : CreateWidget @@ -62,13 +62,13 @@ void DFBrowserPane_TDataStdBooleanArray::GetValues (const Handle(TDF_Attribute)& QList& theValues) { Handle(TDataStd_BooleanArray) anAttribute = Handle(TDataStd_BooleanArray)::DownCast (theAttribute); - if (!anAttribute.IsNull()) - { - theValues.append (anAttribute->Lower()); - theValues.append (anAttribute->Upper()); - for (int aValuesId = anAttribute->Lower(); aValuesId <= anAttribute->Upper(); aValuesId++) - theValues.append (anAttribute->Value (aValuesId)); - } + if (anAttribute.IsNull()) + return; + + theValues.append (anAttribute->Lower()); + theValues.append (anAttribute->Upper()); + for (int aValueId = anAttribute->Lower(); aValueId <= anAttribute->Upper(); aValueId++) + theValues.append (anAttribute->Value (aValueId)); } // ======================================================================= diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdBooleanList.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdBooleanList.cxx index f16c641e6d..261131f007 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdBooleanList.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdBooleanList.cxx @@ -35,5 +35,8 @@ void DFBrowserPane_TDataStdBooleanList::GetValues (const Handle(TDF_Attribute)& return; for (TDataStd_ListIteratorOfListOfByte aBoolListIt (anAttribute->List()); aBoolListIt.More(); aBoolListIt.Next()) + { + theValues.append ("Value"); theValues.append (aBoolListIt.Value()); + } } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdComment.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdComment.cxx index 482aab26c4..a60a75cda0 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdComment.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdComment.cxx @@ -30,5 +30,6 @@ void DFBrowserPane_TDataStdComment::GetValues (const Handle(TDF_Attribute)& theA Handle(TDataStd_Comment) anAttribute = Handle(TDataStd_Comment)::DownCast (theAttribute); if (anAttribute.IsNull()) return; + theValues.append ("Get"); theValues.append (DFBrowserPane_Tools::ToString (anAttribute->Get())); } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdCurrent.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdCurrent.cxx index eade6ead4e..23d1ddfccb 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdCurrent.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdCurrent.cxx @@ -30,5 +30,6 @@ void DFBrowserPane_TDataStdCurrent::GetValues (const Handle(TDF_Attribute)& theA Handle(TDataStd_Current) anAttribute = Handle(TDataStd_Current)::DownCast (theAttribute); if (anAttribute.IsNull()) return; + theValues.append ("GetLabel"); theValues.append (DFBrowserPane_Tools::GetEntry (anAttribute->GetLabel()).ToCString()); } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdExpression.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdExpression.cxx index bea934fa48..772742fc4e 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdExpression.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdExpression.cxx @@ -29,6 +29,7 @@ void DFBrowserPane_TDataStdExpression::GetValues (const Handle(TDF_Attribute)& t if (anAttribute.IsNull()) return; + theValues.append ("GetExpression"); theValues.append (DFBrowserPane_Tools::ToString (anAttribute->GetExpression())); } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdExtStringList.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdExtStringList.cxx index 179dfc473c..bbd47fadc9 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdExtStringList.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdExtStringList.cxx @@ -33,5 +33,8 @@ void DFBrowserPane_TDataStdExtStringList::GetValues (const Handle(TDF_Attribute) return; for (TDataStd_ListIteratorOfListOfExtendedString aValuesIt(anAttribute->List()); aValuesIt.More(); aValuesIt.Next()) + { + theValues.append ("Value"); theValues.append (DFBrowserPane_Tools::ToString (aValuesIt.Value())); + } } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdIntPackedMap.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdIntPackedMap.cxx index 7af9521ef2..09fcbcf39e 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdIntPackedMap.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdIntPackedMap.cxx @@ -31,6 +31,10 @@ void DFBrowserPane_TDataStdIntPackedMap::GetValues (const Handle(TDF_Attribute)& if (anAttribute.IsNull()) return; - for (TColStd_MapIteratorOfPackedMapOfInteger aValueIt(anAttribute->GetMap()); aValueIt.More(); aValueIt.Next()) + int anIndexInMap = 0; + for (TColStd_MapIteratorOfPackedMapOfInteger aValueIt(anAttribute->GetMap()); aValueIt.More(); aValueIt.Next(), anIndexInMap++) + { + theValues.append (QString ("GetMap [%1]").arg(anIndexInMap)); theValues.append (aValueIt.Key()); + } } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdInteger.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdInteger.cxx index b2ca9afbce..2164e4855d 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdInteger.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdInteger.cxx @@ -29,5 +29,6 @@ void DFBrowserPane_TDataStdInteger::GetValues (const Handle(TDF_Attribute)& theA if (anAttribute.IsNull()) return; + theValues.append ("Get"); theValues.append (anAttribute->Get()); } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdIntegerList.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdIntegerList.cxx index 969960f334..26c1c0cc4c 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdIntegerList.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdIntegerList.cxx @@ -32,5 +32,8 @@ void DFBrowserPane_TDataStdIntegerList::GetValues (const Handle(TDF_Attribute)& return; for (TColStd_ListIteratorOfListOfInteger aValuesIt (anAttribute->List()); aValuesIt.More(); aValuesIt.Next()) + { + theValues.append ("Value"); theValues.append (aValuesIt.Value()); + } } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdName.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdName.cxx index cc386a2280..43f77f1ad9 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdName.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdName.cxx @@ -30,6 +30,7 @@ void DFBrowserPane_TDataStdName::GetValues (const Handle(TDF_Attribute)& theAttr if (anAttribute.IsNull()) return; + theValues.append ("Get"); theValues.append (DFBrowserPane_Tools::ToString (anAttribute->Get())); } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdNamedData.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdNamedData.cxx index 0ceaa4309d..958652d0dd 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdNamedData.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdNamedData.cxx @@ -16,7 +16,6 @@ #include #include -#include #include #include @@ -37,6 +36,8 @@ #include #include +#include +#include #include #include #include @@ -53,7 +54,8 @@ static const QString VALUES_REAL_ARRAY = "values_real_array"; // purpose : // ======================================================================= DFBrowserPane_TDataStdNamedData::DFBrowserPane_TDataStdNamedData() - : DFBrowserPane_AttributePane() + : DFBrowserPane_AttributePane(), myRealValues (0), myStringValues(0), myByteValues(0), myIntArrayValues(0), + myRealArrayValues(0) { myPaneModel = createPaneModel(); myRealValuesModel = createPaneModel(); @@ -70,14 +72,8 @@ DFBrowserPane_TDataStdNamedData::DFBrowserPane_TDataStdNamedData() DFBrowserPane_AttributePaneModel* DFBrowserPane_TDataStdNamedData::createPaneModel() { DFBrowserPane_AttributePaneModel* aTableModel = new DFBrowserPane_AttributePaneModel(); - - aTableModel->SetOrientation (Qt::Horizontal); - - QList aHeaderValues; - aHeaderValues << "Name" << "Value"; - aTableModel->SetHeaderValues (aHeaderValues, Qt::Vertical); - aTableModel->SetColumnCount (2); // indeed these are rows as table orientation is Horizontal - + aTableModel->SetColumnCount (2); + aTableModel->SetItalicColumns (QList()); return aTableModel; } @@ -87,40 +83,35 @@ DFBrowserPane_AttributePaneModel* DFBrowserPane_TDataStdNamedData::createPaneMod // ======================================================================= QWidget* DFBrowserPane_TDataStdNamedData::CreateWidget (QWidget* theParent) { - QWidget* aMainWidget = new QWidget (theParent); - QVBoxLayout* aLay = new QVBoxLayout (aMainWidget); + QTabWidget* aMainWidget = new QTabWidget (theParent); + // gray text is visualized by default, better the black one (Qt4) + QPalette aPalette = aMainWidget->palette(); + aPalette.setColor(QPalette::Foreground, Qt::black); + aMainWidget->setPalette (aPalette); myTableView = new DFBrowserPane_TableView (aMainWidget); myTableView->SetModel (getPaneModel()); - myIntValuesContent = new DFBrowserPane_HelperGroupContent ("Named integers", aMainWidget, myTableView); - aLay->addWidget (myIntValuesContent); + aMainWidget->addTab (myTableView, "Integers"); myRealValues = new DFBrowserPane_TableView (aMainWidget); myRealValues->SetModel (myRealValuesModel); - myRealValuesContent = new DFBrowserPane_HelperGroupContent ("Named reals", aMainWidget, myRealValues); - aLay->addWidget (myRealValuesContent); + aMainWidget->addTab (myRealValues, "Reals"); myStringValues = new DFBrowserPane_TableView (aMainWidget); myStringValues->SetModel (myStringValuesModel); - myStringValuesContent = new DFBrowserPane_HelperGroupContent ("Named strings", aMainWidget, myStringValues); - aLay->addWidget (myStringValuesContent); + aMainWidget->addTab (myStringValues, "Strings"); myByteValues = new DFBrowserPane_TableView (aMainWidget); myByteValues->SetModel (myByteValuesModel); - myByteValuesContent = new DFBrowserPane_HelperGroupContent ("Named bytes", aMainWidget, myByteValues); - aLay->addWidget (myByteValuesContent); + aMainWidget->addTab (myByteValues, "Bytes"); myIntArrayValues = new DFBrowserPane_TableView (aMainWidget); myIntArrayValues->SetModel (myIntArrayValuesModel); - myIntArrayValuesContent = new DFBrowserPane_HelperGroupContent ("Named integer arrays", aMainWidget, myIntArrayValues); - aLay->addWidget (myIntArrayValuesContent); + aMainWidget->addTab (myIntArrayValues, "ArraysOfIntegers"); myRealArrayValues = new DFBrowserPane_TableView (aMainWidget); myRealArrayValues->SetModel (myRealArrayModel); - myRealArrayValuesContent = new DFBrowserPane_HelperGroupContent ("Named real arrays", aMainWidget, myRealArrayValues); - aLay->addWidget (myRealArrayValuesContent); - - aLay->addStretch (1); + aMainWidget->addTab (myRealArrayValues, "ArraysOfReals"); return aMainWidget; } @@ -135,11 +126,23 @@ void DFBrowserPane_TDataStdNamedData::Init (const Handle(TDF_Attribute)& theAttr GetValues (theAttribute, aValues); getPaneModel()->Init (getPartOfValues (VALUES_INTEGER, VALUES_REAL, aValues)); + if (myTableView) + myTableView->GetTableView()->resizeColumnToContents (0); myRealValuesModel->Init (getPartOfValues (VALUES_REAL, VALUES_STRING, aValues)); + if (myRealValues) + myRealValues->GetTableView()->resizeColumnToContents (0); myStringValuesModel->Init (getPartOfValues (VALUES_STRING, VALUES_BYTE, aValues)); + if (myStringValues) + myStringValues->GetTableView()->resizeColumnToContents (0); myByteValuesModel->Init (getPartOfValues (VALUES_BYTE, VALUES_INT_ARRAY, aValues)); + if (myByteValues) + myByteValues->GetTableView()->resizeColumnToContents (0); myIntArrayValuesModel->Init (getPartOfValues (VALUES_INT_ARRAY, VALUES_REAL_ARRAY, aValues)); + if (myIntArrayValues) + myIntArrayValues->GetTableView()->resizeColumnToContents (0); myRealArrayModel->Init (getPartOfValues (VALUES_REAL_ARRAY, "", aValues)); + if (myRealArrayValues) + myRealArrayValues->GetTableView()->resizeColumnToContents (0); } // ======================================================================= diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdNamedData.hxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdNamedData.hxx index e8bf511d44..1e8516abae 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdNamedData.hxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdNamedData.hxx @@ -21,7 +21,6 @@ #include class DFBrowserPane_AttributePaneModel; -class DFBrowserPane_HelperGroupContent; class DFBrowserPane_TableView; //! \class DFBrowserPane_TDataStdNamedData @@ -68,29 +67,22 @@ private: DFBrowserPane_AttributePaneModel* createPaneModel(); private: - //! myPaneMode and myTableView are used for int values - DFBrowserPane_HelperGroupContent* myIntValuesContent; //!< check box of values using DFBrowserPane_AttributePaneModel* myRealValuesModel; //!< real values model DFBrowserPane_TableView* myRealValues; //!< values table view - DFBrowserPane_HelperGroupContent* myRealValuesContent; //!< check box of values using DFBrowserPane_AttributePaneModel* myStringValuesModel; //!< string values model DFBrowserPane_TableView* myStringValues; //!< values table view - DFBrowserPane_HelperGroupContent* myStringValuesContent; //!< check box of values using DFBrowserPane_AttributePaneModel* myByteValuesModel; //!< byte values model DFBrowserPane_TableView* myByteValues; //!< values table view - DFBrowserPane_HelperGroupContent* myByteValuesContent; //!< check box of values using DFBrowserPane_AttributePaneModel* myIntArrayValuesModel; //!< int array values model DFBrowserPane_TableView* myIntArrayValues; //!< values table view - DFBrowserPane_HelperGroupContent* myIntArrayValuesContent; //!< check box of values using DFBrowserPane_AttributePaneModel* myRealArrayModel; //!< real array values model DFBrowserPane_TableView* myRealArrayValues; //!< values table view - DFBrowserPane_HelperGroupContent* myRealArrayValuesContent; //!< check box of values using }; #endif diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdReal.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdReal.cxx index a85e2e0f50..cfe8da69ac 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdReal.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdReal.cxx @@ -29,6 +29,7 @@ void DFBrowserPane_TDataStdReal::GetValues (const Handle(TDF_Attribute)& theAttr if (anAttribute.IsNull()) return; + theValues.append ("Get"); theValues.append (anAttribute->Get()); } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdRealList.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdRealList.cxx index debc605cfa..0fb9e84b4b 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdRealList.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdRealList.cxx @@ -32,5 +32,8 @@ void DFBrowserPane_TDataStdRealList::GetValues (const Handle(TDF_Attribute)& the return; for (TColStd_ListIteratorOfListOfReal aRealListIt(anAttribute->List()); aRealListIt.More(); aRealListIt.Next()) + { + theValues.append ("Value"); theValues.append (aRealListIt.Value()); + } } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.cxx index efcbf82388..268e479802 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.cxx @@ -94,7 +94,7 @@ void DFBrowserPane_TDataStdReferenceArray::GetReferences (const Handle(TDF_Attri { if (!getTableView()) return; - QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (getTableView()->GetTableView(), 0); + QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (getTableView()->GetTableView(), 1); Handle(TDataStd_ReferenceArray) anAttribute = Handle(TDataStd_ReferenceArray)::DownCast (theAttribute); if (anAttribute.IsNull()) diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.cxx index 49ece11480..c3ed2af424 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.cxx @@ -35,7 +35,10 @@ void DFBrowserPane_TDataStdReferenceList::GetValues (const Handle(TDF_Attribute) return; for (TDF_ListIteratorOfLabelList aLabelIt(anAttribute->List()); aLabelIt.More(); aLabelIt.Next()) + { + theValues.append ("Value"); theValues.append (DFBrowserPane_Tools::GetEntry (aLabelIt.Value()).ToCString()); + } } // ======================================================================= @@ -46,7 +49,7 @@ void DFBrowserPane_TDataStdReferenceList::GetReferences (const Handle(TDF_Attrib NCollection_List& theRefLabels, Handle(Standard_Transient)& /*theRefPresentation*/) { - QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (getTableView()->GetTableView(), 0); + QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (getTableView()->GetTableView(), 1); Handle(TDataStd_ReferenceList) anAttribute = Handle(TDataStd_ReferenceList)::DownCast (theAttribute); if (anAttribute.IsNull()) return; diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.cxx index b1cd494a89..ba31c011a3 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.cxx @@ -23,6 +23,7 @@ #include +#include #include #include #include @@ -35,7 +36,7 @@ // purpose : // ======================================================================= DFBrowserPane_TDataStdTreeNode::DFBrowserPane_TDataStdTreeNode() -: DFBrowserPane_AttributePane() +: DFBrowserPane_AttributePane(), myTreeNodeView (0) { myModel = new DFBrowserPane_TDataStdTreeNodeModel (0); mySelectionModels.clear(); // do not use selection model of parent pane @@ -52,6 +53,7 @@ QWidget* DFBrowserPane_TDataStdTreeNode::CreateWidget (QWidget* theParent) aMainWidget->setVisible (false); myTableView = new DFBrowserPane_TableView (aMainWidget, getTableColumnWidths()); + myTableView->SetVisibleHorizontalHeader (false); DFBrowserPane_TableView::SetFixedRowCount (1, myTableView->GetTableView()); myTableView->SetModel (myPaneModel); @@ -60,11 +62,13 @@ QWidget* DFBrowserPane_TDataStdTreeNode::CreateWidget (QWidget* theParent) aLay->addWidget (myTableView); myTreeNodeView = new QTreeView (theParent); + myTreeNodeView->header()->setVisible (false); myTreeNodeView->setModel (myModel); myTreeNodeView->setSelectionModel (mySelectionModels.front()); myTreeNodeView->setSelectionBehavior (QAbstractItemView::SelectRows); aLay->addWidget (myTreeNodeView); + aLay->setStretch (1, 1); return aMainWidget; } @@ -77,14 +81,19 @@ void DFBrowserPane_TDataStdTreeNode::Init (const Handle(TDF_Attribute)& theAttri Handle(TDataStd_TreeNode) aTreeNode = Handle(TDataStd_TreeNode)::DownCast (theAttribute); bool aDefaultGUID = aTreeNode->ID() != aTreeNode->GetDefaultTreeID(); - myTableView->setVisible (!aDefaultGUID); - if (!aDefaultGUID) { + if (myTableView) + myTableView->setVisible (!aDefaultGUID); + + if (!aDefaultGUID) + { QList aValues; char aStr[256]; aTreeNode->ID().ToCString (aStr); TCollection_AsciiString aString(aStr); - aValues.append (DFBrowserPane_Tools::ToString(aString)); + aValues << "GetDefaultTreeID" << DFBrowserPane_Tools::ToString (aString); getPaneModel()->Init (aValues); + if (myTableView) + myTableView->GetTableView()->resizeColumnToContents (0); } @@ -96,8 +105,8 @@ void DFBrowserPane_TDataStdTreeNode::Init (const Handle(TDF_Attribute)& theAttri Handle(TDataStd_TreeNode) aRootItem = aTreeNode->Root(); aModel->SetAttribute (aRootItem); - QModelIndex anIndex = aModel->FindIndex (theAttribute); - if (anIndex.isValid()) + QModelIndex anIndex = aModel->FindIndex (theAttribute, QModelIndex()); + if (myTreeNodeView && anIndex.isValid()) { myTreeNodeView->setExpanded (anIndex.parent(), true); myTreeNodeView->scrollTo (anIndex); @@ -160,5 +169,19 @@ void DFBrowserPane_TDataStdTreeNode::GetReferences (const Handle(TDF_Attribute)& if (anAttribute.IsNull()) return; - theRefLabels.Append (anAttribute->Label()); + QModelIndexList aSelectedIndices = myTreeNodeView->selectionModel()->selectedIndexes(); + for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) + { + QModelIndex anIndex = aSelectedIndices[aSelectedId]; + + TreeModel_ItemBasePtr anAttributeItem = TreeModel_ModelBase::GetItemByIndex (anIndex); + DFBrowserPane_TDataStdTreeNodeItemPtr anAttributeNodeItem = + itemDynamicCast(anAttributeItem); + + Handle(TDF_Attribute) aNodeAttribute = anAttributeNodeItem->GetAttribute(); + if (aNodeAttribute.IsNull()) + continue; + + theRefLabels.Append (aNodeAttribute->Label()); + } } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.cxx index 99f1ec9c7e..024386dac3 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.cxx @@ -14,6 +14,7 @@ // commercial license or contractual agreement. #include +#include #include #include @@ -82,6 +83,7 @@ QVariant DFBrowserPane_TDataStdTreeNodeItem::initValue (const int theRole) const case Qt::DisplayRole: case Qt::ToolTipRole: return getName(); case Qt::ForegroundRole: return myIsCurrentItem ? QColor (Qt::darkBlue) : QColor (Qt::black); + case Qt::BackgroundRole: return myIsCurrentItem ? DFBrowserPane_Tools::LightHighlightColor() : QVariant(); default: break; } return QVariant(); diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.hxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.hxx index 43dea90478..29dcd9c200 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.hxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.hxx @@ -51,9 +51,13 @@ public: //! \param theAttribute an attribute void SetAttribute (const Handle(TDF_Attribute)& theAttribute) { myAttribute = theAttribute; } + //! Returns the current attribute + //! \return an attribute + Handle(TDF_Attribute) GetAttribute () const { initItem(); return myAttribute; } + //! Set state if the attribute is current(corresponds to the selected attribute in tree) //! \param theCurrent boolean state - void setCurrentAttribute (const bool theCurrent) { myIsCurrentItem = theCurrent; } + void setCurrentAttribute (const bool theCurrent) { Reset(); myIsCurrentItem = theCurrent; } //! Returns child attribute of the current attribute //! \param theChildRow an index of a child attribute diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx index 78f1f9489c..8dba19d69f 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx @@ -41,3 +41,37 @@ void DFBrowserPane_TDataStdTreeNodeModel::SetAttribute (const Handle(TDF_Attribu aRootItem->SetAttribute (theAttribute); EmitLayoutChanged(); } + +// ======================================================================= +// function : FindIndex +// purpose : +// ======================================================================= +QModelIndex DFBrowserPane_TDataStdTreeNodeModel::FindIndex (const Handle(TDF_Attribute)& theAttribute, + const QModelIndex theParentIndex) +{ + QModelIndex aParentIndex = theParentIndex; + + if (!aParentIndex.isValid()) + aParentIndex = index (0, 0); + + DFBrowserPane_TDataStdTreeNodeItemPtr aParentItem = itemDynamicCast + (TreeModel_ModelBase::GetItemByIndex (aParentIndex)); + + if (aParentItem->GetAttribute() == theAttribute) + return aParentIndex; + + for (int aChildId = 0, aCount = aParentItem->rowCount(); aChildId < aCount; aChildId++) + { + QModelIndex anIndex = index (aChildId, 0, aParentIndex); + TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex); + DFBrowserPane_TDataStdTreeNodeItemPtr anItem = itemDynamicCast(anItemBase); + + if (anItem->GetAttribute() == theAttribute) + return anIndex; + + QModelIndex aSubIndex = FindIndex (theAttribute, anIndex); + if (aSubIndex.isValid()) + return aSubIndex; + } + return QModelIndex(); +} diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.hxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.hxx index 22bc9dad81..9f6fdc07b3 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.hxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.hxx @@ -42,8 +42,11 @@ public: //! \param theAttribute a current attribute Standard_EXPORT void SetAttribute (const Handle(TDF_Attribute)& theAttribute); - //! Returns model index by the attribute. - QModelIndex FindIndex (const Handle(TDF_Attribute)& theAttribute) { (void)theAttribute; return QModelIndex(); } + //! Returns model index by the attribute. The method is recursive. + //! \param theAttribute an attribute that is searched + //! \param theParentIndex an index of the parent item + //! \return the model index + QModelIndex FindIndex (const Handle(TDF_Attribute)& theAttribute, const QModelIndex theParentIndex); //! Returns count of columns in the model. //! \param theParent an index of the parent item diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdUAttribute.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdUAttribute.cxx index d8a152939d..6cd7819eba 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdUAttribute.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdUAttribute.cxx @@ -33,6 +33,7 @@ void DFBrowserPane_TDataStdUAttribute::GetValues (const Handle(TDF_Attribute)& t theAttribute->ID().ToCString(aStr); TCollection_AsciiString aString(aStr); + theValues.append ("ID"); theValues.append (DFBrowserPane_Tools::ToString (aString)); } diff --git a/tools/DFBrowserPane/DFBrowserPane_TDocStdOwner.cxx b/tools/DFBrowserPane/DFBrowserPane_TDocStdOwner.cxx index 7c1b217264..6c78343942 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDocStdOwner.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDocStdOwner.cxx @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -38,11 +39,6 @@ DFBrowserPane_TDocStdOwner::DFBrowserPane_TDocStdOwner() : DFBrowserPane_AttributePane() { - getPaneModel()->SetColumnCount (2); - - QList theValues; - theValues << "Method" << "Value"; - getPaneModel()->SetHeaderValues (theValues, Qt::Horizontal); } // ======================================================================= @@ -59,42 +55,29 @@ void DFBrowserPane_TDocStdOwner::GetValues (const Handle(TDF_Attribute)& theAttr if (aDocument.IsNull()) return; - theValues << STANDARD_TYPE (TDocStd_Document)->Name() << "" - << "IsSaved" << DFBrowserPane_Tools::BoolToStr (aDocument->IsSaved()) - << "IsChanged" << DFBrowserPane_Tools::BoolToStr (aDocument->IsChanged()) - << "GetSavedTime" << DFBrowserPane_Tools::BoolToStr (aDocument->GetSavedTime()) - << "GetName" << (aDocument->IsSaved() ? DFBrowserPane_Tools::ToString (aDocument->GetName()) : "") - << "GetPath" << (aDocument->IsSaved() ? DFBrowserPane_Tools::ToString (aDocument->GetPath()) : "") - << "Main" << DFBrowserPane_Tools::GetEntry (aDocument->Main()).ToCString() - << "IsEmpty" << DFBrowserPane_Tools::BoolToStr (aDocument->IsEmpty()) - << "IsValid" << DFBrowserPane_Tools::BoolToStr (aDocument->IsValid()) - << "HasOpenCommand" << DFBrowserPane_Tools::BoolToStr (aDocument->HasOpenCommand()) - << "GetUndoLimit" << QString::number (aDocument->GetUndoLimit()) - << "GetAvailableUndos" << QString::number (aDocument->GetAvailableUndos()) - << "GetUndos" << convertToString (aDocument->GetUndos()) - << "GetAvailableRedos" << QString::number (aDocument->GetAvailableRedos()) - << "GetRedos" << convertToString (aDocument->GetRedos()) - << "StorageFormat" << DFBrowserPane_Tools::ToString (aDocument->StorageFormat()) - << "IsNestedTransactionMode" << DFBrowserPane_Tools::BoolToStr (aDocument->IsNestedTransactionMode()) - << "ModificationMode" << DFBrowserPane_Tools::BoolToStr (aDocument->ModificationMode()) - << STANDARD_TYPE (CDM_Document)->Name() << ""; - + TCollection_AsciiString aDocumentInfo = DFBrowserPane_Tools::GetPointerInfo (aDocument).ToCString(); TColStd_SequenceOfExtendedString anExtensions; aDocument->Extensions(anExtensions); - theValues << "Extensions" << convertToString (anExtensions) + TCollection_AsciiString aSeparationStr = "---------------------------"; + theValues << aSeparationStr.ToCString() << aSeparationStr.ToCString() + << STANDARD_TYPE (CDM_Document)->Name() << aDocumentInfo.ToCString() + << aSeparationStr.ToCString() << aSeparationStr.ToCString() + << "StorageFormat" << DFBrowserPane_Tools::ToString (aDocument->StorageFormat()) + << "Extensions" << convertToString (anExtensions) << "FromReferencesNumber" << QString::number (aDocument->FromReferencesNumber()) << "ToReferencesNumber" << QString::number (aDocument->ToReferencesNumber()) << "IsReadOnly" << DFBrowserPane_Tools::BoolToStr (aDocument->IsReadOnly()) << "Modifications" << QString::number (aDocument->Modifications()); + TColStd_SequenceOfExtendedString aComments; aDocument->Extensions(aComments); + // if the document application is empty, Application() sents an exception, it is called in LoadResources() of: + // FindFileExtension, FindDescription and others, so we need the check for it + bool isDocumentOpened = aDocument->IsOpened(); - if (!aDocument->IsOpened()) - return; // application is empty, an exception is sent in Application(), - // an exception is sent in FindDescription if the application is not defined - + // CDM_Document methods theValues << "Comments" << convertToString (aComments) - << "Presentation" << "" + << "Presentation" << DFBrowserPane_Tools::ToString (aDocument->Presentation()) << "IsStored" << DFBrowserPane_Tools::BoolToStr (aDocument->IsStored()) << "StorageVersion" << QString::number (aDocument->StorageVersion()) << "Folder" << (aDocument->IsStored() ? DFBrowserPane_Tools::ToString (aDocument->Folder()) : "") @@ -105,25 +88,41 @@ void DFBrowserPane_TDocStdOwner::GetValues (const Handle(TDF_Attribute)& theAttr << "RequestedPreviousVersion" << (aDocument->HasRequestedPreviousVersion() ? DFBrowserPane_Tools::ToString (aDocument->RequestedPreviousVersion()) : "") << "RequestedComment" << DFBrowserPane_Tools::ToString (aDocument->RequestedComment()) - << "FindFileExtension" << DFBrowserPane_Tools::BoolToStr (aDocument->FindFileExtension()) - << "FileExtension" << DFBrowserPane_Tools::ToString (aDocument->FileExtension()) - << "FindDataType" << "" // DFBrowserPane_Tools::BoolToStr (aDocument->FindDataType()) - << "DataType" << ""// DFBrowserPane_Tools::ToString (aDocument->DataType()) - << "FindVersionDataType" << ""// DFBrowserPane_Tools::BoolToStr (aDocument->FindVersionDataType()) - - << "VersionDataType" << ""// DFBrowserPane_Tools::ToString (aDocument->VersionDataType()) - << "FindDescription" << DFBrowserPane_Tools::BoolToStr (aDocument->FindDescription()) - << "Description" << DFBrowserPane_Tools::ToString (aDocument->Description()) - << "FindDomain" << ""// DFBrowserPane_Tools::BoolToStr (aDocument->FindDomain()) - << "Domain" << ""// DFBrowserPane_Tools::ToString (aDocument->Domain()) - << "FindStoragePlugin" << ""// DFBrowserPane_Tools::BoolToStr (aDocument->FindStoragePlugin()) - << "StoragePlugin" << ""// DFBrowserPane_Tools::ToString (aDocument->StoragePlugin()) + << "FindFileExtension" << (isDocumentOpened ? DFBrowserPane_Tools::BoolToStr (aDocument->FindFileExtension()) : "") + << "FileExtension" << (isDocumentOpened ? DFBrowserPane_Tools::ToString (aDocument->FileExtension()) : "") + << "FindDescription" << (isDocumentOpened ? DFBrowserPane_Tools::BoolToStr (aDocument->FindDescription()) : "") + << "Description" << (isDocumentOpened ? DFBrowserPane_Tools::ToString (aDocument->Description()) : "") << "IsModified" << DFBrowserPane_Tools::BoolToStr (aDocument->IsModified()) << "IsOpened" << DFBrowserPane_Tools::BoolToStr (aDocument->IsOpened()) - << "CanClose" << DFBrowserPane_Tools::BoolToStr (aDocument->CanClose()) + << "CanClose" << DFBrowserPane_Tools::ToName(DB_CDM_CAN_CLOSE_STATUS, aDocument->CanClose()).ToCString() << "ReferenceCounter" << QString::number (aDocument->ReferenceCounter()); - // TODO IsInSession, IsStored, Name, IsReadOnly, IsUpToDate, CanCloseReference, IsOpened + // TDocStd_Document methods + TCollection_AsciiString aDocumentDataInfo = !aDocument->GetData().IsNull() + ? DFBrowserPane_Tools::GetPointerInfo (aDocument->GetData()).ToCString() : ""; + theValues << aSeparationStr.ToCString() << aSeparationStr.ToCString() + << STANDARD_TYPE (TDocStd_Document)->Name() << "" + << aSeparationStr.ToCString() << aSeparationStr.ToCString() + << "IsSaved" << DFBrowserPane_Tools::BoolToStr (aDocument->IsSaved()) + << "IsChanged" << DFBrowserPane_Tools::BoolToStr (aDocument->IsChanged()) + << "GetSavedTime" << DFBrowserPane_Tools::BoolToStr (aDocument->GetSavedTime()) + << "GetName" << (aDocument->IsSaved() ? DFBrowserPane_Tools::ToString (aDocument->GetName()) : "") + << "GetPath" << (aDocument->IsSaved() ? DFBrowserPane_Tools::ToString (aDocument->GetPath()) : "") + << "GetData" << aDocumentDataInfo.ToCString() + << "Main" << DFBrowserPane_Tools::GetEntry (aDocument->Main()).ToCString() + << "IsEmpty" << DFBrowserPane_Tools::BoolToStr (aDocument->IsEmpty()) + << "IsValid" << DFBrowserPane_Tools::BoolToStr (aDocument->IsValid()) + << "HasOpenCommand" << DFBrowserPane_Tools::BoolToStr (aDocument->HasOpenCommand()) + << "GetUndoLimit" << QString::number (aDocument->GetUndoLimit()) + << "GetAvailableUndos" << QString::number (aDocument->GetAvailableUndos()) + << "GetUndos" << convertToString (aDocument->GetUndos()) + << "GetAvailableRedos" << QString::number (aDocument->GetAvailableRedos()) + << "GetRedos" << convertToString (aDocument->GetRedos()) +#if OCC_VERSION_HEX > 0x070100 + << "EmptyLabelsSavingMode" << DFBrowserPane_Tools::BoolToStr (aDocument->EmptyLabelsSavingMode()) +#endif + << "IsNestedTransactionMode" << DFBrowserPane_Tools::BoolToStr (aDocument->IsNestedTransactionMode()) + << "ModificationMode" << DFBrowserPane_Tools::BoolToStr (aDocument->ModificationMode()); } // ======================================================================= diff --git a/tools/DFBrowserPane/DFBrowserPane_TDocStdXLink.cxx b/tools/DFBrowserPane/DFBrowserPane_TDocStdXLink.cxx index 13b802b877..c7fb4fd0cb 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDocStdXLink.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDocStdXLink.cxx @@ -27,7 +27,9 @@ void DFBrowserPane_TDocStdXLink::GetValues (const Handle(TDF_Attribute)& theAttr Handle(TDocStd_XLink) anAttribute = Handle(TDocStd_XLink)::DownCast (theAttribute); if (anAttribute.IsNull()) return; + theValues.append ("LabelEntry"); theValues.append (anAttribute->LabelEntry().ToCString()); + theValues.append ("DocumentEntry"); theValues.append (anAttribute->DocumentEntry().ToCString()); } diff --git a/tools/DFBrowserPane/DFBrowserPane_TFunctionFunction.cxx b/tools/DFBrowserPane/DFBrowserPane_TFunctionFunction.cxx index 9622a86b48..4539e2a1ea 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TFunctionFunction.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TFunctionFunction.cxx @@ -32,6 +32,7 @@ void DFBrowserPane_TFunctionFunction::GetValues (const Handle(TDF_Attribute)& th anAttribute->GetDriverGUID().ToCString (aStr); TCollection_AsciiString aString(aStr); + theValues.append ("GetDriverGUID"); theValues.append (DFBrowserPane_Tools::ToString(aString)); } diff --git a/tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.cxx b/tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.cxx index 8257fe8bca..31e46a222f 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.cxx @@ -59,20 +59,13 @@ const int COLUMN_EVOLUTION_WIDTH = 90; DFBrowserPane_TNamingNamedShape::DFBrowserPane_TNamingNamedShape() : DFBrowserPane_AttributePane(), myEvolutionTableView (0), myHelperExport (0) { - QList aHeaderValues; - aHeaderValues << "Value" << "Type" << "BREP" << "SV"; - getPaneModel()->SetHeaderValues (aHeaderValues, Qt::Horizontal); - getPaneModel()->SetColumnCount (aHeaderValues.count()); + getPaneModel()->SetColumnCount (5); - aHeaderValues.clear(); - aHeaderValues << "Version" << "Evolution" << "Shape" << "Current Shape" << "Original Shape"; - getPaneModel()->SetHeaderValues (aHeaderValues, Qt::Vertical); - - aHeaderValues.clear(); - aHeaderValues << "New Shape" << "Type" << "" << "Old Shape" << "Type" << "Label" << "" << "Evolution" << "isModified"; myEvolutionPaneModel = new DFBrowserPane_AttributePaneModel(); - myEvolutionPaneModel->SetHeaderValues (aHeaderValues, Qt::Horizontal); - myEvolutionPaneModel->SetColumnCount (aHeaderValues.count()); + myEvolutionPaneModel->SetColumnCount (11); + QList anItalicColumns; + anItalicColumns << 2 << 6; + myEvolutionPaneModel->SetItalicColumns (anItalicColumns); QItemSelectionModel* aSelectionModel = new QItemSelectionModel (myEvolutionPaneModel); mySelectionModels.push_back (aSelectionModel); } @@ -87,6 +80,7 @@ QWidget* DFBrowserPane_TNamingNamedShape::CreateWidget (QWidget* theParent) aMainWidget->setVisible (false); myTableView = new DFBrowserPane_TableView (aMainWidget); + myTableView->GetTableView()->verticalHeader()->setVisible (false); myTableView->SetModel (myPaneModel); QTableView* aTableView = myTableView->GetTableView(); aTableView->setSelectionBehavior (QAbstractItemView::SelectItems); @@ -95,11 +89,8 @@ QWidget* DFBrowserPane_TNamingNamedShape::CreateWidget (QWidget* theParent) aSelectionModelsIt++; aTableView->horizontalHeader()->setStretchLastSection (false); - aTableView->setColumnWidth (0, COLUMN_POINTER_WIDTH); - aTableView->setColumnWidth (1, COLUMN_TYPE_WIDTH); - aTableView->setColumnWidth (2, COLUMN_EXPORT_WIDTH); aTableView->setColumnWidth (3, COLUMN_EXPORT_WIDTH); - aTableView->verticalHeader()->setVisible (true); + aTableView->setColumnWidth (4, COLUMN_EXPORT_WIDTH); DFBrowserPane_ItemDelegateButton* anItemDelegate = new DFBrowserPane_ItemDelegateButton (aTableView, ":/icons/export_shape.png"); QList aRows; @@ -107,12 +98,12 @@ QWidget* DFBrowserPane_TNamingNamedShape::CreateWidget (QWidget* theParent) anItemDelegate->SetFreeRows (aRows); QObject::connect (anItemDelegate, SIGNAL (buttonPressed (const QModelIndex&)), &myHelperExport, SLOT (OnButtonPressed (const QModelIndex&))); - aTableView->setItemDelegateForColumn (2, anItemDelegate); + aTableView->setItemDelegateForColumn (3, anItemDelegate); DFBrowserPane_ItemDelegateButton* anItemDelegate2 = new DFBrowserPane_ItemDelegateButton (aTableView, ":/icons/folder_export.png"); anItemDelegate2->SetFreeRows (aRows); - aTableView->setItemDelegateForColumn (3, anItemDelegate2); + aTableView->setItemDelegateForColumn (4, anItemDelegate2); myEvolutionTableView = new DFBrowserPane_TableView (aMainWidget); myEvolutionTableView->SetModel (myEvolutionPaneModel); @@ -120,21 +111,19 @@ QWidget* DFBrowserPane_TNamingNamedShape::CreateWidget (QWidget* theParent) aTableView->setSelectionModel (*aSelectionModelsIt); - QList aColumnWidths; - aColumnWidths << COLUMN_POINTER_WIDTH << COLUMN_TYPE_WIDTH << COLUMN_EXPORT_WIDTH << COLUMN_POINTER_WIDTH - << COLUMN_TYPE_WIDTH << COLUMN_REFERENCE_WIDTH << COLUMN_EXPORT_WIDTH << COLUMN_EVOLUTION_WIDTH; - for (int aColumnId = 0, aCount = aColumnWidths.size(); aColumnId < aCount; aColumnId++) - aTableView->setColumnWidth (aColumnId, aColumnWidths[aColumnId]); + aTableView->horizontalHeader()->setStretchLastSection (false); + aTableView->setColumnWidth (5, COLUMN_EXPORT_WIDTH); + aTableView->setColumnWidth (10, COLUMN_EXPORT_WIDTH); anItemDelegate = new DFBrowserPane_ItemDelegateButton (myEvolutionTableView->GetTableView(), ":/icons/export_shape.png"); QObject::connect (anItemDelegate, SIGNAL (buttonPressed (const QModelIndex&)), &myHelperExport, SLOT (OnButtonPressed (const QModelIndex&))); - myEvolutionTableView->GetTableView()->setItemDelegateForColumn (2, anItemDelegate); + myEvolutionTableView->GetTableView()->setItemDelegateForColumn (5, anItemDelegate); anItemDelegate = new DFBrowserPane_ItemDelegateButton (myEvolutionTableView->GetTableView(), ":/icons/export_shape.png"); QObject::connect (anItemDelegate, SIGNAL (buttonPressed (const QModelIndex&)), &myHelperExport, SLOT (OnButtonPressed (const QModelIndex&))); - myEvolutionTableView->GetTableView()->setItemDelegateForColumn (6, anItemDelegate); + myEvolutionTableView->GetTableView()->setItemDelegateForColumn (10, anItemDelegate); QGridLayout* aLay = new QGridLayout (aMainWidget); aLay->setContentsMargins (0, 0, 0, 0); @@ -153,56 +142,81 @@ void DFBrowserPane_TNamingNamedShape::Init (const Handle(TDF_Attribute)& theAttr Handle(TNaming_NamedShape) aShapeAttr = Handle(TNaming_NamedShape)::DownCast (theAttribute); myHelperExport.Clear(); - // table view filling QList aValues; - aValues << QString::number (aShapeAttr->Version()) << "" << "" << ""; - aValues << DFBrowserPane_Tools::ToName (DB_NS_TYPE, aShapeAttr->Evolution()).ToCString() << "" << "" << ""; + aValues << "Version" << QString::number (aShapeAttr->Version()) << "" << "" << ""; + aValues << "Evolution" << DFBrowserPane_Tools::ToName (DB_NS_TYPE, aShapeAttr->Evolution()).ToCString() << "" << "" << ""; NCollection_List aShapes; - { - TopoDS_Shape aShape = aShapeAttr->Get(); - TCollection_AsciiString aShapeInfo = !aShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()) : ""; - aValues << aShapeInfo.ToCString() << DFBrowserPane_Tools::ShapeTypeInfo (aShape) << "" << ""; - aShapes.Append (aShape); - - TopoDS_Shape aCurrentShape = TNaming_Tool::CurrentShape (aShapeAttr); - TCollection_AsciiString aCurrentShapeInfo = !aCurrentShape.IsNull() ? - DFBrowserPane_Tools::GetPointerInfo (aCurrentShape.TShape()) : ""; - aValues << aCurrentShapeInfo.ToCString() << DFBrowserPane_Tools::ShapeTypeInfo (aCurrentShape) << "" << ""; - aShapes.Append (aCurrentShape); - - TopoDS_Shape anOriginalShape = TNaming_Tool::OriginalShape (aShapeAttr); - TCollection_AsciiString anOriginalShapeInfo = !anOriginalShape.IsNull() ? - DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()) : ""; - aValues << anOriginalShapeInfo.ToCString() << DFBrowserPane_Tools::ShapeTypeInfo (anOriginalShape) << "" << ""; - aShapes.Append (anOriginalShape); - } + QList aFreeRows; + aFreeRows << 0 << 1; + + TopoDS_Shape aShape = aShapeAttr->Get(); + TCollection_AsciiString aShapeInfo = !aShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()) : ""; + aValues << "Shape" << aShapeInfo.ToCString() << DFBrowserPane_Tools::ShapeTypeInfo (aShape) << "" << ""; + aShapes.Append (aShape); + if (aShape.IsNull()) + aFreeRows << 2; + + TopoDS_Shape aCurrentShape = TNaming_Tool::CurrentShape (aShapeAttr); + TCollection_AsciiString aCurrentShapeInfo = !aCurrentShape.IsNull() ? + DFBrowserPane_Tools::GetPointerInfo (aCurrentShape.TShape()) : ""; + aValues << "CurrentShape" << aCurrentShapeInfo.ToCString() + << DFBrowserPane_Tools::ShapeTypeInfo (aCurrentShape) << "" << ""; + aShapes.Append (aCurrentShape); + if (aCurrentShape.IsNull()) + aFreeRows << 3; + + TopoDS_Shape anOriginalShape = TNaming_Tool::OriginalShape (aShapeAttr); + TCollection_AsciiString anOriginalShapeInfo = !anOriginalShape.IsNull() ? + DFBrowserPane_Tools::GetPointerInfo (anOriginalShape.TShape()) : ""; + aValues << "OriginalShape" << anOriginalShapeInfo.ToCString() + << DFBrowserPane_Tools::ShapeTypeInfo (anOriginalShape) << "" << ""; + aShapes.Append (anOriginalShape); + if (anOriginalShape.IsNull()) + aFreeRows << 4; + DFBrowserPane_AttributePaneModel* aModel = getPaneModel(); aModel->Init (aValues); - + if (myTableView) + { + QTableView* aTableView = myTableView->GetTableView(); + for (int i = 0; i < aModel->columnCount(); i++) + { + if (i == 3 || i == 4) + dynamic_cast(aTableView->itemDelegateForColumn(3))->SetFreeRows (aFreeRows); + else + aTableView->resizeColumnToContents (i); + } + } QModelIndexList anIndices; int aRowId = 2; for (NCollection_List::Iterator aShapeIt (aShapes); aShapeIt.More(); aShapeIt.Next(), aRowId++) { - const TopoDS_Shape& aShape = aShapeIt.Value(); - if (aShape.IsNull()) + if (aShapeIt.Value().IsNull()) continue; - anIndices.clear(); - anIndices << aModel->index (aRowId, 2) << aModel->index (aRowId, 3); - myHelperExport.AddShape (aShape, anIndices); + anIndices << aModel->index (aRowId, 1) << aModel->index (aRowId, 2) << + aModel->index (aRowId, 3) << aModel->index (aRowId, 4); + myHelperExport.AddShape (aShapeIt.Value(), anIndices); } // evolution table view filling aValues.clear(); aRowId = 0; + bool aHasModified = false; for (TNaming_Iterator aShapeAttrIt (aShapeAttr); aShapeAttrIt.More(); aShapeAttrIt.Next(), aRowId++) { const TopoDS_Shape& anOldShape = aShapeAttrIt.OldShape(); const TopoDS_Shape& aNewShape = aShapeAttrIt.NewShape(); Handle(TNaming_NamedShape) anOldAttr = TNaming_Tool::NamedShape (anOldShape, aShapeAttr->Label()); + aValues << DFBrowserPane_Tools::ToName (DB_NS_TYPE, aShapeAttrIt.Evolution()).ToCString() + << (aShapeAttrIt.IsModification() ? "modified" : "-"); + aHasModified = aHasModified | aShapeAttrIt.IsModification(); + + aValues << "New:"; + QString aLabelInfo; if (!anOldAttr.IsNull()) { @@ -215,21 +229,21 @@ void DFBrowserPane_TNamingNamedShape::Init (const Handle(TDF_Attribute)& theAttr << DFBrowserPane_Tools::ShapeTypeInfo (aNewShape) << ""; else - aValues << "" << "" << ""; + aValues << "-" << "-" << ""; + aValues << "Old:"; if (!anOldShape.IsNull()) aValues << DFBrowserPane_Tools::GetPointerInfo (anOldShape.TShape()->This()).ToCString() << DFBrowserPane_Tools::ShapeTypeInfo (anOldShape) << aLabelInfo << ""; else - aValues << "" << "" << "" << ""; - aValues << DFBrowserPane_Tools::ToName (DB_NS_TYPE, aShapeAttrIt.Evolution()).ToCString() - << (aShapeAttrIt.IsModification() ? "true" : "false"); + aValues << "-" << "-" << "-" << ""; } if (myEvolutionTableView) { myEvolutionTableView->setVisible (aValues.size() > 0); + myEvolutionTableView->GetTableView()->setColumnHidden (1, !aHasModified); myEvolutionPaneModel->Init (aValues); aRowId = 0; @@ -241,18 +255,23 @@ void DFBrowserPane_TNamingNamedShape::Init (const Handle(TDF_Attribute)& theAttr if (!aNewShape.IsNull()) { anIndices.clear(); - anIndices << myEvolutionPaneModel->index (aRowId, 0) << myEvolutionPaneModel->index (aRowId, 1) - << myEvolutionPaneModel->index (aRowId, 2); + anIndices << myEvolutionPaneModel->index (aRowId, 3) << myEvolutionPaneModel->index (aRowId, 4) + << myEvolutionPaneModel->index (aRowId, 5); myHelperExport.AddShape (aNewShape, anIndices); } if (!anOldShape.IsNull()) { anIndices.clear(); - anIndices << myEvolutionPaneModel->index (aRowId, 3) << myEvolutionPaneModel->index (aRowId, 4) - << myEvolutionPaneModel->index (aRowId, 5) << myEvolutionPaneModel->index (aRowId, 6); + anIndices << myEvolutionPaneModel->index (aRowId, 7) << myEvolutionPaneModel->index (aRowId, 8) + << myEvolutionPaneModel->index (aRowId, 10); myHelperExport.AddShape (anOldShape, anIndices); } } + for (int i = 0; i < myEvolutionPaneModel->columnCount(); i++) + { + if (i == 5 || i == 10) continue; + myEvolutionTableView->GetTableView()->resizeColumnToContents (i); + } } } @@ -335,7 +354,7 @@ int DFBrowserPane_TNamingNamedShape::GetSelectionKind (QItemSelectionModel* theM if (aRow == 0 || aRow == 1) return aKind; - if (aSelectedIndex.column() == 3) + if (aSelectedIndex.column() == 4) aKind = DFBrowserPane_SelectionKind_ExportToShapeViewer; return aKind; @@ -357,7 +376,7 @@ void DFBrowserPane_TNamingNamedShape::GetSelectionParameters (QItemSelectionMode return; QModelIndex aSelectedIndex = aSelectedIndices.first(); - if (aSelectedIndex.column() != 3) + if (aSelectedIndex.column() != 4) return; const TopoDS_Shape& aShape = myHelperExport.GetShape (aSelectedIndex); @@ -377,7 +396,7 @@ void DFBrowserPane_TNamingNamedShape::GetReferences (const Handle(TDF_Attribute) if (!myEvolutionTableView) return; QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues ( - myEvolutionTableView->GetTableView(), 5); + myEvolutionTableView->GetTableView(), 9); Handle(TNaming_NamedShape) aShapeAttr = Handle(TNaming_NamedShape)::DownCast (theAttribute); for (TNaming_Iterator aShapeAttrIt (aShapeAttr); aShapeAttrIt.More(); aShapeAttrIt.Next()) diff --git a/tools/DFBrowserPane/DFBrowserPane_TNamingNaming.cxx b/tools/DFBrowserPane/DFBrowserPane_TNamingNaming.cxx index a4d52e86b1..2a8e64b29a 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TNamingNaming.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TNamingNaming.cxx @@ -44,15 +44,7 @@ DFBrowserPane_TNamingNaming::DFBrowserPane_TNamingNaming() : DFBrowserPane_AttributePane(), myNamingView (0) { myNamingModel = new DFBrowserPane_AttributePaneModel(); - - QList aHeaderValues; - aHeaderValues << "Type" << "Shape Type" << "Stop Named Shape" << "Index"; - aHeaderValues << "Key_TShape" << "Context Label" << "Orientation"; - myNamingModel->SetHeaderValues (aHeaderValues, Qt::Vertical); - - aHeaderValues.clear(); - aHeaderValues << "Arguments"; - getPaneModel()->SetHeaderValues (aHeaderValues, Qt::Horizontal); + myNamingModel->SetColumnCount (2); } // ======================================================================= @@ -64,7 +56,7 @@ QWidget* DFBrowserPane_TNamingNaming::CreateWidget (QWidget* theParent) QWidget* aMainWidget = new QWidget (theParent); myNamingView = new DFBrowserPane_TableView (aMainWidget); - myNamingView->GetTableView()->verticalHeader()->setVisible (true); + myNamingView->GetTableView()->verticalHeader()->setVisible (false); myNamingView->GetTableView()->horizontalHeader()->setVisible (false); myNamingView->SetModel (myNamingModel); @@ -73,6 +65,7 @@ QWidget* DFBrowserPane_TNamingNaming::CreateWidget (QWidget* theParent) myTableView->GetTableView()->setSelectionModel (mySelectionModels.front()); QGridLayout* aLay = new QGridLayout (aMainWidget); + aLay->setContentsMargins (0, 0, 0, 0); aLay->addWidget (myNamingView); aLay->addWidget (myTableView); aLay->setRowStretch (1, 1); @@ -90,15 +83,19 @@ void DFBrowserPane_TNamingNaming::Init (const Handle(TDF_Attribute)& theAttribut GetValues (theAttribute, aValues); QList aNamingValues; - for (int anValueId = 0; anValueId < 7; anValueId++) + for (int anValueId = 0; anValueId < 14; anValueId++) aNamingValues.append (aValues[anValueId]); myNamingModel->Init (aNamingValues); + if (myNamingView) + myNamingView->GetTableView()->resizeColumnToContents (0); QList aNamedShapesValues; - for (int anValueId = 7, aCount = aValues.size(); anValueId < aCount; anValueId++) + for (int anValueId = 14, aCount = aValues.size(); anValueId < aCount; anValueId++) aNamedShapesValues.append (aValues[anValueId]); getPaneModel()->Init (aNamedShapesValues); + if (myTableView) + myTableView->GetTableView()->resizeColumnToContents (0); } // ======================================================================= @@ -113,21 +110,32 @@ void DFBrowserPane_TNamingNaming::GetValues (const Handle(TDF_Attribute)& theAtt TNaming_Name aNamingName = anAttribute->GetName(); - // values from 0-6 + // values from 0-13 + theValues.append ("Type"); theValues.append (DFBrowserPane_Tools::ToName (DB_NAMING_TYPE, aNamingName.Type()).ToCString()); + theValues.append ("ShapeType"); theValues.append (DFBrowserPane_Tools::ToName (DB_SHAPE_TYPE, aNamingName.ShapeType()).ToCString()); Handle(TNaming_NamedShape) aStopShape = aNamingName.StopNamedShape(); + theValues.append ("StopNamedShape"); theValues.append (!aStopShape.IsNull() ? DFBrowserPane_Tools::GetEntry (aStopShape->Label()).ToCString() : ""); + theValues.append ("Index"); theValues.append (QString::number (aNamingName.Index())); TopoDS_Shape aShape = aNamingName.Shape(); + theValues.append ("Shape(TShape)"); theValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()->This()).ToCString() : ""); TDF_Label aContextLabel = aNamingName.ContextLabel(); + theValues.append ("ContextLabel"); theValues.append (!aContextLabel.IsNull() ? DFBrowserPane_Tools::GetEntry (aContextLabel).ToCString() : ""); + theValues.append ("Orientation"); theValues.append (DFBrowserPane_Tools::ToName (DB_ORIENTATION_TYPE, aNamingName.Orientation()).ToCString()); - // values from 7 till count of arguments - for (TNaming_ListIteratorOfListOfNamedShape anArgIt(aNamingName.Arguments()); anArgIt.More(); anArgIt.Next()) + // values from 14 till count of arguments + int anArgIndex = 1; + for (TNaming_ListIteratorOfListOfNamedShape anArgIt(aNamingName.Arguments()); anArgIt.More(); anArgIt.Next(), anArgIndex++) + { + theValues << "Argument"; theValues.append (DFBrowserPane_Tools::GetEntry (anArgIt.Value()->Label()).ToCString()); + } } // ======================================================================= @@ -145,7 +153,7 @@ Handle(Standard_Transient) DFBrowserPane_TNamingNaming::GetPresentation (const H if (!aTableView) // the pane is not visualized yet return aPresentation; - QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (aTableView->GetTableView(), 0); + QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (aTableView->GetTableView(), 1); TNaming_Name aNamingName = anAttribute->GetName(); BRep_Builder aBuilder; @@ -182,7 +190,7 @@ void DFBrowserPane_TNamingNaming::GetReferences (const Handle(TDF_Attribute)& th if (anAttribute.IsNull()) return; - QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (getTableView()->GetTableView(), 0); + QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (getTableView()->GetTableView(), 1); for (TNaming_ListIteratorOfListOfNamedShape aNamingIt(anAttribute->GetName().Arguments()); aNamingIt.More(); aNamingIt.Next()) { Handle(TNaming_NamedShape) aShapeAttr = aNamingIt.Value(); diff --git a/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.cxx b/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.cxx index 9f4d68dce2..2cf6d60bb8 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.cxx @@ -39,6 +39,10 @@ #include #include +const int COLUMN_TYPE_WIDTH = 70; +const int COLUMN_POINTER_WIDTH = 90; +const int COLUMN_REFERENCE_WIDTH = 90; + // ======================================================================= // function : Constructor // purpose : @@ -47,10 +51,11 @@ DFBrowserPane_TNamingUsedShapes::DFBrowserPane_TNamingUsedShapes() : DFBrowserPane_AttributePane() { getPaneModel()->SetColumnCount (4); + getPaneModel()->SetItalicColumns (QList()); - QList theValues; - theValues << "ShapeType" << "Label Entry" << "Key_TShape" << "Value_TShape"; - getPaneModel()->SetHeaderValues (theValues, Qt::Horizontal); + QList aValues; + aValues << "ShapeType" << "TShape" << "Label" << "RefShape"; + getPaneModel()->SetHeaderValues (aValues, Qt::Horizontal); } // ======================================================================= @@ -86,7 +91,7 @@ void DFBrowserPane_TNamingUsedShapes::GetValues (const Handle(TDF_Attribute)& th for (std::list::const_iterator aRefIt = aReferences.begin(); aRefIt != aReferences.end(); aRefIt++) { aValues = anEntryValues[*aRefIt]; - theValues << aValues[0] << QString ((*aRefIt).ToCString()) << aValues[1] << aValues[2]; + theValues << aValues[0] << aValues[1] << QString ((*aRefIt).ToCString()) << aValues[2]; } } else @@ -97,8 +102,8 @@ void DFBrowserPane_TNamingUsedShapes::GetValues (const Handle(TDF_Attribute)& th TopoDS_Shape aShape = aRefIt.Key(); theValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::ToName (DB_SHAPE_TYPE, aShape.ShapeType()).ToCString() : "EMPTY SHAPE"); - theValues.append (DFBrowserPane_Tools::GetEntry (aRefIt.Value()->Label()).ToCString()); theValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()->This()).ToCString() : ""); + theValues.append (DFBrowserPane_Tools::GetEntry (aRefIt.Value()->Label()).ToCString()); const TopoDS_Shape aValueShape = aRefIt.Value()->Shape(); theValues.append (!aValueShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aValueShape.TShape()->This()).ToCString() : ""); } @@ -152,10 +157,26 @@ void DFBrowserPane_TNamingUsedShapes::GetAttributeReferences (const Handle(TDF_A if (anAttribute.IsNull()) return; - QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (getTableView()->GetTableView(), 1); + QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (getTableView()->GetTableView(), 2); + if (aSelectedEntries.isEmpty()) + return; + for (TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape aRefIt (anAttribute->Map()); aRefIt.More(); aRefIt.Next()) { if (aSelectedEntries.contains (DFBrowserPane_Tools::GetEntry (aRefIt.Value()->Label()).ToCString())) theRefAttributes.Append (aRefIt.Value()->NamedShape()); } } + +// ======================================================================= +// function : getTableColumnWidths +// purpose : +// ======================================================================= +QMap DFBrowserPane_TNamingUsedShapes::getTableColumnWidths() const +{ + QMap aValues; + aValues[0] = COLUMN_TYPE_WIDTH; // "ShapeType" + aValues[1] = COLUMN_POINTER_WIDTH; // "Key_TShape" + aValues[2] = COLUMN_REFERENCE_WIDTH; // "Label Entry" + return aValues; +} diff --git a/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.hxx b/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.hxx index 9ed95c950c..48b0deba68 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.hxx +++ b/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.hxx @@ -72,6 +72,11 @@ public: NCollection_List& theRefAttributes, Handle(Standard_Transient)& theRefPresentation) Standard_OVERRIDE; +protected: + //! Defines widths of table columns + //! \return container of widths + Standard_EXPORT virtual QMap getTableColumnWidths() const; + private: NCollection_DataMap > myAttributeRefs; diff --git a/tools/DFBrowserPane/DFBrowserPane_TPrsStdAISPresentation.cxx b/tools/DFBrowserPane/DFBrowserPane_TPrsStdAISPresentation.cxx index 42b1e0a356..abe0b3dbcc 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TPrsStdAISPresentation.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TPrsStdAISPresentation.cxx @@ -30,11 +30,6 @@ DFBrowserPane_TPrsStdAISPresentation::DFBrowserPane_TPrsStdAISPresentation() : DFBrowserPane_AttributePane() { - getPaneModel()->SetColumnCount (2); - - QList theValues; - theValues << "Method" << "Value"; - getPaneModel()->SetHeaderValues (theValues, Qt::Horizontal); } // ======================================================================= @@ -57,10 +52,15 @@ void DFBrowserPane_TPrsStdAISPresentation::GetValues (const Handle(TDF_Attribute if (anAttribute.IsNull()) return; Handle(AIS_InteractiveObject) anIO = anAttribute->GetAIS(); - theValues << "GetDriverGUID" << ""//DFBrowserPane_Tools::ToString (anAttribute->GetDriverGUID()) + + char aStr[256]; + anAttribute->GetDriverGUID().ToCString(aStr); + TCollection_AsciiString aString(aStr); + + theValues << "GetDriverGUID" << DFBrowserPane_Tools::ToString (aString) << "GetAIS" << (anIO.IsNull() ? "Null" : anAttribute->DynamicType()->Name()) << "IsDisplayed" << DFBrowserPane_Tools::BoolToStr (anAttribute->IsDisplayed()) - << "GetContext()" << (!anIO->GetContext().IsNull() ? + << "GetContext()" << ((!anIO.IsNull() && !anIO->GetContext().IsNull()) ? DFBrowserPane_Tools::GetPointerInfo (anIO->GetContext()).ToCString() : "") << "HasOwnMaterial" << DFBrowserPane_Tools::BoolToStr (anAttribute->HasOwnMaterial()) << "Material" << (anAttribute->HasOwnMaterial() ? diff --git a/tools/DFBrowserPane/DFBrowserPane_TPrsStdAISViewer.cxx b/tools/DFBrowserPane/DFBrowserPane_TPrsStdAISViewer.cxx index c00555029f..7ebbc7c826 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TPrsStdAISViewer.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TPrsStdAISViewer.cxx @@ -14,7 +14,9 @@ // commercial license or contractual agreement. #include +#include +#include #include #include @@ -23,6 +25,16 @@ // function : // purpose : // ======================================================================= -void DFBrowserPane_TPrsStdAISViewer::GetValues (const Handle(TDF_Attribute)&, QList&) +void DFBrowserPane_TPrsStdAISViewer::GetValues (const Handle(TDF_Attribute)& theAttribute, QList& theValues) { + Handle(TPrsStd_AISViewer) aViewerAttribute = Handle(TPrsStd_AISViewer)::DownCast (theAttribute); + if (!aViewerAttribute) + return; + + Handle(AIS_InteractiveContext) aContext = aViewerAttribute->GetInteractiveContext(); + TCollection_AsciiString aPointerInfo = !aContext.IsNull() + ? DFBrowserPane_Tools::GetPointerInfo (aContext).ToCString() : ""; + + theValues << "GetInteractiveContext" << aPointerInfo.ToCString(); + } diff --git a/tools/DFBrowserPane/DFBrowserPane_TableView.cxx b/tools/DFBrowserPane/DFBrowserPane_TableView.cxx index 97706d1b63..346d54648d 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TableView.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TableView.cxx @@ -16,11 +16,12 @@ #include #include -#include -#include #include #include #include +#include +#include +#include static const int DEFAULT_ROW_HEIGHT = 30; @@ -40,9 +41,10 @@ DFBrowserPane_TableView::DFBrowserPane_TableView (QWidget* theParent, QHeaderView* aVHeader = myTableView->verticalHeader(); aVHeader->setVisible (false); - aVHeader->setDefaultSectionSize (aVHeader->minimumSectionSize() + DFBrowserPane_Tools::HeaderSectionMargin()); + aVHeader->setDefaultSectionSize (aVHeader->minimumSectionSize()); myTableView->horizontalHeader()->setStretchLastSection (true); + myTableView->horizontalHeader()->setVisible (false); aLay->addWidget (myTableView); myDefaultColumnWidths = theDefaultColumnWidths; } @@ -64,9 +66,22 @@ void DFBrowserPane_TableView::SetModel (QAbstractTableModel* theModel) // function : SetFixedRowCount // purpose : // ======================================================================= -void DFBrowserPane_TableView::SetFixedRowCount (const int theCount, QTableView* theView) +void DFBrowserPane_TableView::SetFixedRowCount (const int theCount, QTableView* theView, const bool theScroll) +{ + double aHeight = theView->verticalHeader()->defaultSectionSize()*theCount + DFBrowserPane_Tools::HeaderSectionMargin(); + if (theScroll) + aHeight += theView->horizontalScrollBar()->sizeHint().height(); + + theView->setMaximumHeight (aHeight); +} + +// ======================================================================= +// function : SetVisibleHorizontalHeader +// purpose : +// ======================================================================= +void DFBrowserPane_TableView::SetVisibleHorizontalHeader (const bool& theVisible) { - theView->setMaximumHeight (DEFAULT_ROW_HEIGHT*(theCount + 1/*header row*/)); + myTableView->horizontalHeader()->setVisible (theVisible); } // ======================================================================= @@ -83,7 +98,9 @@ QStringList DFBrowserPane_TableView::GetSelectedColumnValues (QTableView* theTab aSelectedIt != aSelectedIndices.end(); aSelectedIt++) { QModelIndex anIndex = *aSelectedIt; - aSelectedEntries.append (aModel->data (aModel->index (anIndex.row(), theColumnId, anIndex.parent()), Qt::DisplayRole).toString()); + if (theColumnId == anIndex.column()) + aSelectedEntries.append (aModel->data (aModel->index (anIndex.row(), theColumnId, anIndex.parent()), + Qt::DisplayRole).toString()); } return aSelectedEntries; } diff --git a/tools/DFBrowserPane/DFBrowserPane_TableView.hxx b/tools/DFBrowserPane/DFBrowserPane_TableView.hxx index 5d478f44ed..edcd673578 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TableView.hxx +++ b/tools/DFBrowserPane/DFBrowserPane_TableView.hxx @@ -49,10 +49,15 @@ public: //! Returns the current table view QTableView* GetTableView() const { return myTableView; } + //! Set horizontal header shown or hidden + //! \param theVisible visibility flag + Standard_EXPORT void SetVisibleHorizontalHeader (const bool& theVisible); + //! Updates table view height to contain the given number of rows only //! \param theCount a row count //! \param theView a table view, which size will be changed - Standard_EXPORT static void SetFixedRowCount (const int theCount, QTableView* theView); + //! \param theScroll flag whether add scroll height to size + Standard_EXPORT static void SetFixedRowCount (const int theCount, QTableView* theView, const bool theScroll = false); //! Returns names of selected items in the view //! \param theView a table view diff --git a/tools/DFBrowserPane/DFBrowserPane_Tools.cxx b/tools/DFBrowserPane/DFBrowserPane_Tools.cxx index b95d968e0b..4568b46e1c 100644 --- a/tools/DFBrowserPane/DFBrowserPane_Tools.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_Tools.cxx @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -34,8 +35,10 @@ #include #include +#include #include #include +#include #include @@ -99,6 +102,17 @@ QVariant DFBrowserPane_Tools::ShapeTypeInfo (const TopoDS_Shape& theShape) : QString (DFBrowserPane_Tools::ToName (DB_SHAPE_TYPE, theShape.ShapeType()).ToCString()); } +// ======================================================================= +// function : LightHighlightColor +// purpose : +// ======================================================================= +QColor DFBrowserPane_Tools::LightHighlightColor() +{ + QWidget aWidget; + QPalette aPalette = aWidget.palette(); + return aPalette.highlight().color().lighter(); +} + // ======================================================================= // function : ToName // purpose : @@ -127,6 +141,18 @@ TCollection_AsciiString DFBrowserPane_Tools::ToName (const DFBrowserPane_OcctEnu break; } case DB_ORIENTATION_TYPE: { TopAbs::Print((TopAbs_Orientation)theEnumId, aSStream); break; } + case DB_CDM_CAN_CLOSE_STATUS: + { + switch (theEnumId) + { + case CDM_CCS_OK: return "OK"; + case CDM_CCS_NotOpen: return "NotOpen"; + case CDM_CCS_UnstoredReferenced: return "UnstoredReferenced"; + case CDM_CCS_ReferenceRejection: return "ReferenceRejection"; + default: return "UNKNOWN CDM_CanCloseStatus"; + } + break; + } default: return "UNKNOWN PARAMETER"; } return aSStream.str().c_str(); diff --git a/tools/DFBrowserPane/DFBrowserPane_Tools.hxx b/tools/DFBrowserPane/DFBrowserPane_Tools.hxx index 5508708f33..4e108250be 100644 --- a/tools/DFBrowserPane/DFBrowserPane_Tools.hxx +++ b/tools/DFBrowserPane/DFBrowserPane_Tools.hxx @@ -80,6 +80,10 @@ public: return QString::fromUtf16((uint16_t*)theValue.ToExtString()); } + //! Returns light highlight color + //! \returns Qt color + static Standard_EXPORT QColor LightHighlightColor(); + //! Converts enumeration value into string text //! \param theType an enumeration kind //! \param theEnumId an enumeration value diff --git a/tools/DFBrowserPane/FILES b/tools/DFBrowserPane/FILES index b7aed2f2fd..1ea8358f9e 100644 --- a/tools/DFBrowserPane/FILES +++ b/tools/DFBrowserPane/FILES @@ -14,8 +14,6 @@ DFBrowserPane_HelperArray.cxx DFBrowserPane_HelperArray.hxx DFBrowserPane_HelperExport.cxx DFBrowserPane_HelperExport.hxx -DFBrowserPane_HelperGroupContent.cxx -DFBrowserPane_HelperGroupContent.hxx DFBrowserPane_ItemDelegateButton.cxx DFBrowserPane_ItemDelegateButton.hxx DFBrowserPane_ItemRole.hxx diff --git a/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocArea.cxx b/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocArea.cxx index dd0017eeeb..1bcab623e2 100644 --- a/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocArea.cxx +++ b/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocArea.cxx @@ -24,6 +24,7 @@ void DFBrowserPaneXDE_XCAFDocArea::GetValues (const Handle(TDF_Attribute)& theAttribute, QList& theValues) { Handle(XCAFDoc_Area) anAttr = Handle(XCAFDoc_Area)::DownCast (theAttribute); + theValues.append ("Get"); theValues.append (anAttr->Get()); } diff --git a/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocCentroid.cxx b/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocCentroid.cxx index e5e17c01c0..f87e5bec28 100644 --- a/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocCentroid.cxx +++ b/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocCentroid.cxx @@ -25,7 +25,6 @@ DFBrowserPaneXDE_XCAFDocCentroid::DFBrowserPaneXDE_XCAFDocCentroid() : DFBrowserPane_AttributePane() { - getPaneModel()->SetColumnCount (2); } // ======================================================================= @@ -36,9 +35,9 @@ void DFBrowserPaneXDE_XCAFDocCentroid::GetValues (const Handle(TDF_Attribute)& t { Handle(XCAFDoc_Centroid) anAttr = Handle(XCAFDoc_Centroid)::DownCast (theAttribute); gp_Pnt aPoint = anAttr->Get(); - theValues << "X" << aPoint.X() - << "Y" << aPoint.Y() - << "Z" << aPoint.Z(); + theValues << "Get: X" << aPoint.X() + << "Get: Y" << aPoint.Y() + << "Get: Z" << aPoint.Z(); } // ======================================================================= diff --git a/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocColor.cxx b/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocColor.cxx index d0f2596d2f..f3fc0b7bdd 100644 --- a/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocColor.cxx +++ b/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocColor.cxx @@ -28,7 +28,6 @@ DFBrowserPaneXDE_XCAFDocColor::DFBrowserPaneXDE_XCAFDocColor() : DFBrowserPane_AttributePane() { - getPaneModel()->SetColumnCount (2); } // ======================================================================= @@ -40,11 +39,11 @@ void DFBrowserPaneXDE_XCAFDocColor::GetValues (const Handle(TDF_Attribute)& theA Handle(XCAFDoc_Color) anAttr = Handle(XCAFDoc_Color)::DownCast (theAttribute); const Quantity_Color& aColor = anAttr->GetColor(); - theValues << "Red" << aColor.Red(); - theValues << "Green" << aColor.Green(); - theValues << "Blue" << aColor.Blue(); + theValues << "GetColor: Red" << aColor.Red(); + theValues << "GetColor: Green" << aColor.Green(); + theValues << "GetColor: Blue" << aColor.Blue(); - theValues << "Quantity_NameOfColor (nearest)" << aColor.Name(); + theValues << "GetColor: Name" << aColor.Name(); } // ======================================================================= diff --git a/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocDatum.cxx b/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocDatum.cxx index d7bbc92223..f9e64d7695 100644 --- a/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocDatum.cxx +++ b/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocDatum.cxx @@ -32,7 +32,6 @@ DFBrowserPaneXDE_XCAFDocDatum::DFBrowserPaneXDE_XCAFDocDatum() : DFBrowserPane_AttributePane() { - getPaneModel()->SetColumnCount (2); } // ======================================================================= diff --git a/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocShapeMapTool.cxx b/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocShapeMapTool.cxx index b4a98f201f..e7fa7ab7c0 100644 --- a/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocShapeMapTool.cxx +++ b/tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocShapeMapTool.cxx @@ -56,6 +56,7 @@ DFBrowserPaneXDE_XCAFDocShapeMapTool::DFBrowserPaneXDE_XCAFDocShapeMapTool() getPaneModel()->SetHeaderValues (aHeaderValues, Qt::Horizontal); getPaneModel()->SetColumnCount (aHeaderValues.count()); + getPaneModel()->SetItalicColumns (QList()); } // ======================================================================= diff --git a/tools/ShapeView/ShapeView_Window.cxx b/tools/ShapeView/ShapeView_Window.cxx index 11fe0703b9..f4291c57a9 100644 --- a/tools/ShapeView/ShapeView_Window.cxx +++ b/tools/ShapeView/ShapeView_Window.cxx @@ -52,9 +52,9 @@ #include #include -const int FIRST_COLUMN_WIDTH = 200; +const int FIRST_COLUMN_WIDTH = 190; const int SIZE_COLUMN_WIDTH = 30; -const int POINTER_COLUMN_WIDTH = 110; +const int POINTER_COLUMN_WIDTH = 70; const int ORIENTATION_COLUMN_WIDTH = 70; const int LOCATION_COLUMN_WIDTH = 120; const int FLAGS_COLUMN_WIDTH = 70; @@ -73,7 +73,7 @@ const int DEFAULT_SHAPE_VIEW_POSITION_Y = 60; const int SHAPEVIEW_DEFAULT_TREE_VIEW_WIDTH = 600; const int SHAPEVIEW_DEFAULT_TREE_VIEW_HEIGHT = 500; -const int SHAPEVIEW_DEFAULT_VIEW_WIDTH = 400; +const int SHAPEVIEW_DEFAULT_VIEW_WIDTH = 200;//400; const int SHAPEVIEW_DEFAULT_VIEW_HEIGHT = 1000; //! \class ShapeView_TreeView @@ -163,6 +163,7 @@ ShapeView_Window::ShapeView_Window (QWidget* theParent, const TCollection_AsciiS QDockWidget* aViewDockWidget = new QDockWidget (tr ("View"), myMainWindow); aViewDockWidget->setWidget (myViewWindow); + aViewDockWidget->setTitleBarWidget (myViewWindow->GetViewToolBar()->GetControl()); myMainWindow->addDockWidget (Qt::RightDockWidgetArea, aViewDockWidget); myMainWindow->resize (DEFAULT_SHAPE_VIEW_WIDTH, DEFAULT_SHAPE_VIEW_HEIGHT); diff --git a/tools/TInspector/TInspector_Window.cxx b/tools/TInspector/TInspector_Window.cxx index 08813a7192..9f49e6d7e1 100644 --- a/tools/TInspector/TInspector_Window.cxx +++ b/tools/TInspector/TInspector_Window.cxx @@ -27,8 +27,8 @@ #include #include -const int TINSPECTOR_DEFAULT_WIDTH = 900; -const int TINSPECTOR_DEFAULT_HEIGHT = 700; +const int TINSPECTOR_DEFAULT_WIDTH = 650; +const int TINSPECTOR_DEFAULT_HEIGHT = 500;//350; const int TINSPECTOR_DEFAULT_POSITION_X = 200; const int TINSPECTOR_DEFAULT_POSITION_Y = 60; diff --git a/tools/ToolsDraw/ToolsDraw.cxx b/tools/ToolsDraw/ToolsDraw.cxx index 0cd3a7b069..3e267e7ca2 100644 --- a/tools/ToolsDraw/ToolsDraw.cxx +++ b/tools/ToolsDraw/ToolsDraw.cxx @@ -213,7 +213,7 @@ static int tinspector (Draw_Interpretor&/* di*/, Standard_Integer theArgsNb, con anObjectsToSelect.Append(anIO); } // give parameters as a container of names - TCollection_AsciiString aParam (theArgs[anIt]); + aParam = TCollection_AsciiString (theArgs[anIt]); while (!aParam.StartsWith ("-")) { anItemNamesToSelect.Append (aParam); @@ -350,17 +350,17 @@ void ToolsDraw::Commands(Draw_Interpretor& theCommands) "\n\t\t: 'all' adds all available plugins in the order:" "\n\t\t: DFBrowser, VInspector and ShapeView." "\n\t\t: If at the first call this option is not used, 'all' option is applyed;" - "\n\t\t: -activate active the plugin in the tool view." + "\n\t\t: -activate activates the plugin in the tool view." "\n\t\t: If at the first call this option is not used, the first plugin is activated;" - "\n\t\t: -shape initialize plugin/s by the shape object. If 'name' is empty, initializes all plugins;" + "\n\t\t: -shape initializes plugin/s by the shape object. If 'name' is empty, initializes all plugins;" "\n\t\t: -open gives the file to the plugin/s. If the plugin is active, after open, update content will be done;" "\n\t\t: -update updates content of the active plugin;" - "\n\t\t: -select set the parameter that should be selected in an active tool view." + "\n\t\t: -select sets the parameter that should be selected in an active tool view." "\n\t\t: Depending on active tool the parameter is:" "\n\t\t: ShapeView: 'object' is an instance of TopoDS_Shape TShape," "\n\t\t: DFBrowser: 'name' is an entry of TDF_Label and name2(optionaly) for TDF_Attribute type name," "\n\t\t: VInspector: 'object' is an instance of AIS_InteractiveObject;" - "\n\t\t: -show set tool view visible or hidden. The first call of this command will show it.", + "\n\t\t: -show sets Inspector view visible or hidden. The first call of this command will show it.", __FILE__, tinspector, group); } diff --git a/tools/TreeModel/TreeModel_ItemRole.hxx b/tools/TreeModel/TreeModel_ItemRole.hxx index 881aeab908..169dff7b10 100644 --- a/tools/TreeModel/TreeModel_ItemRole.hxx +++ b/tools/TreeModel/TreeModel_ItemRole.hxx @@ -21,7 +21,8 @@ //! Sets custom item role of Tree view wmodel enum TreeModel_ItemRole { - TreeModel_ItemRole_RowCountRole = Qt::UserRole + 1 //! additional column with row count for item (cached value) + TreeModel_ItemRole_RowCountRole = Qt::UserRole + 1, //! additional column with row count for item (cached value) + TreeModel_ItemRole_LastTreeRole //! last enumeration value to use outside incremented }; #endif diff --git a/tools/TreeModel/TreeModel_MessageDialog.cxx b/tools/TreeModel/TreeModel_MessageDialog.cxx index be2fbd9dcb..8eda4669cb 100644 --- a/tools/TreeModel/TreeModel_MessageDialog.cxx +++ b/tools/TreeModel/TreeModel_MessageDialog.cxx @@ -54,6 +54,8 @@ TreeModel_MessageDialog::TreeModel_MessageDialog (QWidget* theParent, const QStr aLayout->setColumnStretch (0, 1); + myCancelButton->setDefault (true); + SetInformation (theInformation); } diff --git a/tools/VInspector/VInspector_ToolBar.cxx b/tools/VInspector/VInspector_ToolBar.cxx index e84d7199f4..adcdeb6899 100644 --- a/tools/VInspector/VInspector_ToolBar.cxx +++ b/tools/VInspector/VInspector_ToolBar.cxx @@ -37,12 +37,10 @@ VInspector_ToolBar::VInspector_ToolBar (QWidget* theParent) myActionsMap[VInspector_ToolActionType_SelectPresentationsId] = new QPushButton (theParent); myActionsMap[VInspector_ToolActionType_SelectPresentationsId]->setText ("Select Presentations"); myActionsMap[VInspector_ToolActionType_SelectPresentationsId]->setCheckable (true); - myActionsMap[VInspector_ToolActionType_SelectPresentationsId]->setFixedHeight(20); myActionsMap[VInspector_ToolActionType_SelectOwnersId] = new QPushButton (theParent); myActionsMap[VInspector_ToolActionType_SelectOwnersId]->setText ("Select Owners"); myActionsMap[VInspector_ToolActionType_SelectOwnersId]->setCheckable (true); - myActionsMap[VInspector_ToolActionType_SelectPresentationsId]->setFixedHeight(25); myMainWindow = new QWidget (theParent); diff --git a/tools/VInspector/VInspector_Window.cxx b/tools/VInspector/VInspector_Window.cxx index 0d2d970e14..778748e93a 100644 --- a/tools/VInspector/VInspector_Window.cxx +++ b/tools/VInspector/VInspector_Window.cxx @@ -48,14 +48,14 @@ #include #include -const int FIRST_COLUMN_WIDTH = 250; +const int FIRST_COLUMN_WIDTH = 230; const int COLUMN_1_WIDTH = 30; const int COLUMN_2_WIDTH = 70; -const int COLUMN_3_WIDTH = 130; -const int COLUMN_4_WIDTH = 90; -const int COLUMN_5_WIDTH = 180; -const int COLUMN_6_WIDTH = 70; +const int COLUMN_3_WIDTH = 70; +const int COLUMN_4_WIDTH = 75; +const int COLUMN_5_WIDTH = 120; +const int COLUMN_6_WIDTH = 65; const int COLUMN_7_WIDTH = 70; const int HISTORY_AIS_NAME_COLUMN_WIDTH = 140; @@ -69,9 +69,58 @@ const int VINSPECTOR_DEFAULT_POSITION_Y = 60; const int VINSPECTOR_DEFAULT_VIEW_WIDTH = 400; const int VINSPECTOR_DEFAULT_VIEW_HEIGHT = 1000; +const int VINSPECTOR_DEFAULT_HISTORY_VIEW_WIDTH = 400; +const int VINSPECTOR_DEFAULT_HISTORY_VIEW_HEIGHT = 50; + const int VINSPECTOR_DEFAULT_VIEW_POSITION_X = 200 + 900 + 100; // TINSPECTOR_DEFAULT_POSITION_X + TINSPECTOR_DEFAULT_WIDTH + 100 const int VINSPECTOR_DEFAULT_VIEW_POSITION_Y = 60; // TINSPECTOR_DEFAULT_POSITION_Y + 50 +//! \class Vinspector_TreeView +//! Extended tree view control with possibility to set predefined size. +class Vinspector_TreeView : public QTreeView +{ +public: + //! Constructor + Vinspector_TreeView (QWidget* theParent) : QTreeView (theParent), myDefaultWidth (-1), myDefaultHeight (-1) {} + + //! Destructor + virtual ~Vinspector_TreeView() {} + + //! Sets default size of control, that is used by the first control show + //! \param theDefaultWidth the width value + //! \param theDefaultHeight the height value + void SetPredefinedSize (int theDefaultWidth, int theDefaultHeight); + + //! Returns predefined size if both values are positive, otherwise parent size hint + virtual QSize sizeHint() const Standard_OVERRIDE; + +private: + + int myDefaultWidth; //!< default width, -1 if it should not be used + int myDefaultHeight; //!< default height, -1 if it should not be used +}; + +// ======================================================================= +// function : SetPredefinedSize +// purpose : +// ======================================================================= +void Vinspector_TreeView::SetPredefinedSize (int theDefaultWidth, int theDefaultHeight) +{ + myDefaultWidth = theDefaultWidth; + myDefaultHeight = theDefaultHeight; +} + +// ======================================================================= +// function : sizeHint +// purpose : +// ======================================================================= +QSize Vinspector_TreeView::sizeHint() const +{ + if (myDefaultWidth > 0 && myDefaultHeight > 0) + return QSize (myDefaultWidth, myDefaultHeight); + return QTreeView::sizeHint(); +} + // ======================================================================= // function : Constructor // purpose : @@ -84,6 +133,7 @@ VInspector_Window::VInspector_Window() QWidget* aCentralWidget = new QWidget (myMainWindow); QGridLayout* aParentLay = new QGridLayout (aCentralWidget); aParentLay->setContentsMargins (0, 0, 0, 0); + aParentLay->setSpacing(0); // tool bar: on the bottom of the window myToolBar = new VInspector_ToolBar(aCentralWidget); @@ -103,8 +153,11 @@ VInspector_Window::VInspector_Window() myMainWindow->setCentralWidget (aCentralWidget); // history view in bottom dock widget - myHistoryView = new QTreeView (aCentralWidget); + myHistoryView = new Vinspector_TreeView (aCentralWidget); myHistoryView->setSelectionBehavior (QAbstractItemView::SelectRows); + ((Vinspector_TreeView*)myHistoryView)->SetPredefinedSize (VINSPECTOR_DEFAULT_HISTORY_VIEW_WIDTH, + VINSPECTOR_DEFAULT_HISTORY_VIEW_HEIGHT); + myHistoryView->setSelectionMode (QAbstractItemView::ExtendedSelection); VInspector_ViewModelHistory* aHistoryModel = new VInspector_ViewModelHistory (myHistoryView); myHistoryView->setModel (aHistoryModel); @@ -121,6 +174,7 @@ VInspector_Window::VInspector_Window() myHistoryView->setColumnWidth (4, HISTORY_AIS_NAME_COLUMN_WIDTH); QDockWidget* aHistoryDockWidget = new QDockWidget (tr ("HistoryView"), myMainWindow); + aHistoryDockWidget->setTitleBarWidget (new QWidget(myMainWindow)); aHistoryDockWidget->setWidget (myHistoryView); myMainWindow->addDockWidget (Qt::BottomDockWidgetArea, aHistoryDockWidget); @@ -168,9 +222,9 @@ void VInspector_Window::UpdateContent() // make AIS_InteractiveObject selected selected if exist in select parameters NCollection_List anObjects; - if (myParameters->GetSelectedObjects(aName, anObjects)) + VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); + if (aViewModel && myParameters->GetSelectedObjects(aName, anObjects)) { - VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); aSelectionModel->clear(); for (NCollection_List::Iterator aParamsIt (anObjects); @@ -305,33 +359,35 @@ void VInspector_Window::onTreeViewContextMenuRequested(const QPoint& thePosition // ======================================================================= void VInspector_Window::onToolBarActionClicked (const int theActionId) { + VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); + if (!aViewModel) + return; + switch (theActionId) { case VInspector_ToolActionType_UpdateId: { - VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); - if (aViewModel) - UpdateTreeModel(); + UpdateTreeModel(); break; } case VInspector_ToolActionType_SelectPresentationsId: { - bool isChecked = myToolBar->GetToolButton((VInspector_ToolActionType)theActionId)->isChecked(); - NCollection_List aPresentationsForViewer; - if (isChecked) - aPresentationsForViewer = VInspector_ItemPresentableObject::GetSelectedPresentations(myTreeView->selectionModel()); - VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); - Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext(); - VInspector_Tools::AddOrRemovePresentations(aContext, aPresentationsForViewer); + bool isChecked = myToolBar->GetToolButton((VInspector_ToolActionType)theActionId)->isChecked(); + NCollection_List aPresentationsForViewer; + if (isChecked) + aPresentationsForViewer = VInspector_ItemPresentableObject::GetSelectedPresentations(myTreeView->selectionModel()); + Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext(); + VInspector_Tools::AddOrRemovePresentations(aContext, aPresentationsForViewer); + UpdateTreeModel(); break; } case VInspector_ToolActionType_SelectOwnersId: { - NCollection_List anOwnersForViewer; - if (myToolBar->GetToolButton((VInspector_ToolActionType)theActionId)->isChecked()) - VInspector_ViewModel::GetSelectedOwners(myTreeView->selectionModel(), anOwnersForViewer); - VInspector_ViewModel* aViewModel = dynamic_cast (myTreeView->model()); - VInspector_Tools::AddOrRemoveSelectedShapes(aViewModel->GetContext(), anOwnersForViewer); + NCollection_List anOwnersForViewer; + if (myToolBar->GetToolButton((VInspector_ToolActionType)theActionId)->isChecked()) + VInspector_ViewModel::GetSelectedOwners(myTreeView->selectionModel(), anOwnersForViewer); + VInspector_Tools::AddOrRemoveSelectedShapes(aViewModel->GetContext(), anOwnersForViewer); + UpdateTreeModel(); break; } default: @@ -374,6 +430,8 @@ void VInspector_Window::onHistoryViewSelectionChanged (const QItemSelection& the QStringList aPointers = aHistoryModel->GetSelectedPointers(aSelectedIndices.first()); VInspector_ViewModel* aTreeModel = dynamic_cast (myTreeView->model()); + if (!aTreeModel) + return; QModelIndexList anIndices = aTreeModel->FindPointers (aPointers); QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); @@ -430,7 +488,7 @@ void VInspector_Window::onExportToShapeView() myExportToShapeViewDialog->SetInformation (aMessage); myExportToShapeViewDialog->Start(); - myParameters->SetParameters (aPluginName, aParameters); + myParameters->SetParameters (aPluginName, aParameters, myExportToShapeViewDialog->IsAccepted()); } // ======================================================================= @@ -507,6 +565,13 @@ void VInspector_Window::displaySelectedPresentations(const bool theToDisplay) aContext->Erase(aPresentation, false); } aContext->UpdateCurrentViewer(); + + // the order of objects returned by AIS_InteractiveContext is changed because the processed object is moved from + // Erased to Displayed container or back + QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); + aSelectionModel->clear(); + + UpdateTreeModel(); } // ======================================================================= -- 2.20.1