From 8681e72f844274a0c2fc2cd64bbf2451bd8db77b Mon Sep 17 00:00:00 2001 From: vsr Date: Thu, 9 Aug 2012 14:19:30 +0000 Subject: [PATCH] Merge from V6_main_20120808 08Aug12 --- AUTHORS | 0 COPYING | 504 ++ ChangeLog | 0 Doxyfile | 302 + HEXABLOCK_version.h.in | 31 + INSTALL | 1 + Makefile.am | 44 + NEWS | 0 README | 1 + adm_local/Makefile.am | 21 + adm_local/unix/Makefile.am | 21 + adm_local/unix/config_files/Makefile.am | 23 + .../unix/config_files/check_HEXABLOCK.m4 | 81 + adm_local/unix/config_files/check_libxml.m4 | 74 + adm_local/unix/config_files/check_sphinx.m4 | 55 + adm_local/unix/config_files/i2_check_qt4.m4 | 446 ++ adm_local/unix/make_common_starter.am | 87 + bin/Makefile.am | 29 + bin/VERSION.in | 2 + bin/myrunSalome.py | 51 + bin/runAppli.in | 62 + build_configure | 128 + clean_configure | 25 + configure.ac | 364 ++ cppunit-report.xml | 24 + doc/Makefile.am | 195 + doc/_static/EX2.PNG | Bin 0 -> 154562 bytes doc/_static/EX3.PNG | Bin 0 -> 67271 bytes doc/_static/EX4.PNG | Bin 0 -> 15980 bytes doc/_static/EX5.PNG | Bin 0 -> 10128 bytes doc/_static/EX6.PNG | Bin 0 -> 12744 bytes doc/_static/EX7.PNG | Bin 0 -> 22019 bytes doc/_static/HEXAHEDRON.PNG | Bin 0 -> 7752 bytes doc/_static/Sans titre.PNG | Bin 0 -> 10185 bytes doc/_static/association.PNG | Bin 0 -> 42126 bytes doc/_static/association2.PNG | Bin 0 -> 16373 bytes doc/_static/before_quadrevolution.png | Bin 0 -> 22124 bytes doc/_static/before_replacehexa.png | Bin 0 -> 25696 bytes doc/_static/bielle.PNG | Bin 0 -> 26834 bytes doc/_static/bielle_mesh.png | Bin 0 -> 20409 bytes doc/_static/bride.PNG | Bin 0 -> 61952 bytes doc/_static/bride_geom.png | Bin 0 -> 21580 bytes doc/_static/bride_model1.png | Bin 0 -> 21112 bytes doc/_static/bride_model2.png | Bin 0 -> 19093 bytes doc/_static/cad_bielle.PNG | Bin 0 -> 63488 bytes doc/_static/cartgrid1.PNG | Bin 0 -> 5813 bytes doc/_static/cartgrid2.PNG | Bin 0 -> 6001 bytes doc/_static/cartgrid3.png | Bin 0 -> 101352 bytes doc/_static/component1.png | Bin 0 -> 5272 bytes doc/_static/component2.png | Bin 0 -> 4871 bytes doc/_static/component3.png | Bin 0 -> 3030 bytes doc/_static/component4.png | Bin 0 -> 46739 bytes doc/_static/cut.png | Bin 0 -> 19057 bytes doc/_static/cyl_grid1.PNG | Bin 0 -> 5550 bytes doc/_static/cyl_grid2.PNG | Bin 0 -> 6777 bytes doc/_static/cyl_grid3.PNG | Bin 0 -> 8002 bytes doc/_static/cylgrid.PNG | Bin 0 -> 5615 bytes doc/_static/cylgrid1.PNG | Bin 0 -> 11385 bytes doc/_static/cylgrid1.png | Bin 0 -> 19319 bytes doc/_static/cylgrid2.PNG | Bin 0 -> 5772 bytes doc/_static/cylgrid2.png | Bin 0 -> 36207 bytes doc/_static/cylgrid3.png | Bin 0 -> 34059 bytes doc/_static/cylgrid4.png | Bin 0 -> 31866 bytes doc/_static/cylgrid5.png | Bin 0 -> 26754 bytes doc/_static/cylgrid6.png | Bin 0 -> 31076 bytes doc/_static/cylgrids.png | Bin 0 -> 13539 bytes doc/_static/cylinder.png | Bin 0 -> 51805 bytes doc/_static/db_cylgrid.PNG | Bin 0 -> 5394 bytes doc/_static/db_sph_grid.PNG | Bin 0 -> 9958 bytes doc/_static/decoupe.png | Bin 0 -> 6079 bytes doc/_static/dialogbox.PNG | Bin 0 -> 4997 bytes doc/_static/dialogbox2.PNG | Bin 0 -> 61475 bytes doc/_static/dialogbox_cartgrid.PNG | Bin 0 -> 8888 bytes doc/_static/dialogbox_cylgrid.PNG | Bin 0 -> 8955 bytes doc/_static/dialogbox_discreti.PNG | Bin 0 -> 21717 bytes doc/_static/dialogbox_law.PNG | Bin 0 -> 11643 bytes doc/_static/dialogbox_remove.PNG | Bin 0 -> 15202 bytes doc/_static/dialogbox_remove.png | Bin 0 -> 79987 bytes doc/_static/disco_quad.png | Bin 0 -> 10407 bytes doc/_static/ex1.JPG | Bin 0 -> 16299 bytes doc/_static/ex1.PNG | Bin 0 -> 9857 bytes doc/_static/gui_add_group.png | Bin 0 -> 8627 bytes doc/_static/gui_add_law.png | Bin 0 -> 10128 bytes doc/_static/gui_ass_edge.png | Bin 0 -> 16496 bytes doc/_static/gui_ass_quad.png | Bin 0 -> 8581 bytes doc/_static/gui_cut_hexa.png | Bin 0 -> 8361 bytes doc/_static/gui_cylinder.png | Bin 0 -> 9391 bytes doc/_static/gui_disco_edge.png | Bin 0 -> 10985 bytes doc/_static/gui_disco_quad.png | Bin 0 -> 11081 bytes doc/_static/gui_disco_vertex.png | Bin 0 -> 11093 bytes doc/_static/gui_edge2.png | Bin 0 -> 11356 bytes doc/_static/gui_edge_vertices.png | Bin 0 -> 10990 bytes doc/_static/gui_hemispherical.png | Bin 0 -> 28315 bytes doc/_static/gui_hexa_quads.png | Bin 0 -> 12824 bytes doc/_static/gui_hexa_vertices.png | Bin 0 -> 13920 bytes doc/_static/gui_import_document.png | Bin 0 -> 34870 bytes doc/_static/gui_join_quads.png | Bin 0 -> 15320 bytes doc/_static/gui_make_cart_grid.png | Bin 0 -> 14243 bytes doc/_static/gui_make_cyl_grid.png | Bin 0 -> 25036 bytes doc/_static/gui_make_cyl_grid_irregular.png | Bin 0 -> 18734 bytes doc/_static/gui_make_cylinder.png | Bin 0 -> 9921 bytes doc/_static/gui_make_cylinders.png | Bin 0 -> 7522 bytes doc/_static/gui_make_line_symmetry.png | Bin 0 -> 10387 bytes doc/_static/gui_make_pipe.png | Bin 0 -> 9255 bytes doc/_static/gui_make_pipes.png | Bin 0 -> 7063 bytes doc/_static/gui_make_plan_symmetry.png | Bin 0 -> 10439 bytes doc/_static/gui_make_point_symmetry.png | Bin 0 -> 10023 bytes doc/_static/gui_make_spher_grid.png | Bin 0 -> 12956 bytes doc/_static/gui_make_sym_line.png | Bin 0 -> 10498 bytes doc/_static/gui_make_sym_plan.png | Bin 0 -> 10535 bytes doc/_static/gui_make_sym_point.png | Bin 0 -> 10120 bytes doc/_static/gui_make_transfo_rotation.png | Bin 0 -> 12389 bytes doc/_static/gui_make_transfo_scale.png | Bin 0 -> 11741 bytes doc/_static/gui_make_transfo_translation.png | Bin 0 -> 10924 bytes doc/_static/gui_merge_edges.png | Bin 0 -> 10724 bytes doc/_static/gui_merge_quads.png | Bin 0 -> 11245 bytes doc/_static/gui_merge_vertices.png | Bin 0 -> 9892 bytes doc/_static/gui_mesh.png | Bin 0 -> 9077 bytes doc/_static/gui_modify_line_symmetry.png | Bin 0 -> 10379 bytes doc/_static/gui_modify_plan_symmetry.png | Bin 0 -> 10535 bytes doc/_static/gui_modify_point_symmetry.png | Bin 0 -> 10120 bytes doc/_static/gui_modify_transfo_rotation.png | Bin 0 -> 12238 bytes doc/_static/gui_modify_transfo_scale.png | Bin 0 -> 11741 bytes .../gui_modify_transfo_translation.png | Bin 0 -> 10924 bytes doc/_static/gui_new_document.png | Bin 0 -> 87863 bytes doc/_static/gui_parthemispherical.png | Bin 0 -> 30030 bytes doc/_static/gui_partrind.png | Bin 0 -> 28630 bytes doc/_static/gui_pipe.png | Bin 0 -> 9480 bytes doc/_static/gui_prism_quads.png | Bin 0 -> 12462 bytes doc/_static/gui_quad_edges.png | Bin 0 -> 11940 bytes doc/_static/gui_quad_vertices.png | Bin 0 -> 12725 bytes doc/_static/gui_quadrevolution.png | Bin 0 -> 16922 bytes doc/_static/gui_remove_hexa.png | Bin 0 -> 8011 bytes doc/_static/gui_replacehexa.png | Bin 0 -> 14649 bytes doc/_static/gui_rind.png | Bin 0 -> 28377 bytes doc/_static/gui_vector.png | Bin 0 -> 11748 bytes doc/_static/gui_vector1.png | Bin 0 -> 12238 bytes doc/_static/gui_vector2.png | Bin 0 -> 11022 bytes doc/_static/gui_vertex.png | Bin 0 -> 9471 bytes doc/_static/hemisphericalgrid.png | Bin 0 -> 32370 bytes doc/_static/interactive.PNG | Bin 0 -> 66179 bytes doc/_static/interactive.png | Bin 0 -> 105096 bytes doc/_static/intersec_cyl.PNG | Bin 0 -> 67072 bytes doc/_static/join.png | Bin 0 -> 14668 bytes doc/_static/meshing1.PNG | Bin 0 -> 19806 bytes doc/_static/meshing2.PNG | Bin 0 -> 37414 bytes doc/_static/meshing3.PNG | Bin 0 -> 42222 bytes doc/_static/no_cut.png | Bin 0 -> 14827 bytes doc/_static/no_decoupe.png | Bin 0 -> 5755 bytes doc/_static/parthemisphericalgrid.png | Bin 0 -> 28002 bytes doc/_static/partrindgrid.png | Bin 0 -> 32202 bytes doc/_static/pipe.png | Bin 0 -> 53339 bytes doc/_static/point_sym_before.png | Bin 0 -> 9265 bytes doc/_static/prisme.png | Bin 0 -> 10061 bytes doc/_static/prisme_gui.png | Bin 0 -> 41264 bytes doc/_static/quadrevolution.png | Bin 0 -> 33700 bytes doc/_static/remove1.PNG | Bin 0 -> 29278 bytes doc/_static/remove2.PNG | Bin 0 -> 12111 bytes doc/_static/remove3.PNG | Bin 0 -> 7328 bytes doc/_static/remove3.png | Bin 0 -> 74996 bytes doc/_static/replacehexa.png | Bin 0 -> 21689 bytes doc/_static/rindgrid.png | Bin 0 -> 54163 bytes doc/_static/sph_grid.PNG | Bin 0 -> 11054 bytes doc/_static/sph_grid.png | Bin 0 -> 13305 bytes doc/_static/sph_grid2.PNG | Bin 0 -> 11645 bytes doc/_static/transfo0.png | Bin 0 -> 11283 bytes doc/_static/transfo_rotation.png | Bin 0 -> 14839 bytes doc/_static/transfo_scale.png | Bin 0 -> 14410 bytes doc/_static/transfo_translation.png | Bin 0 -> 13820 bytes doc/_static/tuyau_courbe.PNG | Bin 0 -> 55808 bytes doc/annexe.rst | 71 + doc/block_method.rst | 74 + doc/cad.rst | 60 + doc/cas_test_python/BIELLE.py | 994 +++ doc/conf.py.in | 197 + doc/creategrids.rst | 167 + doc/full_example_bridle.rst | 114 + doc/general.rst | 82 + doc/gui.rst | 7 + doc/gui_asso_quad_to_geom.rst | 93 + doc/gui_blocks_for_cyl_pipe.rst | 124 + doc/gui_component.rst | 39 + doc/gui_cut_hexa.rst | 41 + doc/gui_cyl.rst | 22 + doc/gui_disc_elmts.rst | 80 + doc/gui_discret_law.rst | 49 + doc/gui_document.rst | 39 + doc/gui_edge.rst | 40 + doc/gui_elements.rst | 10 + doc/gui_groups.rst | 48 + doc/gui_hemisphere.rst | 148 + doc/gui_hexahedron.rst | 44 + doc/gui_make_elmts.rst | 107 + doc/gui_make_symmetry.rst | 69 + doc/gui_merge_elmts.rst | 72 + doc/gui_mesh.rst | 33 + doc/gui_modify_elmts.rst | 74 + doc/gui_modify_symmetry.rst | 68 + doc/gui_pipe.rst | 22 + doc/gui_prism_join_quad.rst | 73 + doc/gui_propag.rst | 21 + doc/gui_quad_revolution.rst | 51 + doc/gui_quadrangle.rst | 46 + doc/gui_remove.rst | 31 + doc/gui_replace_hexa.rst | 50 + doc/gui_vector.rst | 42 + doc/gui_vertex.rst | 25 + doc/index.rst | 19 + doc/interactive.rst | 73 + doc/intro_association.rst | 150 + doc/intro_groups.rst | 24 + doc/intro_mesh.rst | 158 + doc/intro_python.rst | 390 ++ doc/mesh.rst | 136 + doc/pyplots/BIELLE.py | 997 +++ doc/pyplots/bielle.py | 630 ++ doc/pyplots/bielle_JPL.py | 364 ++ doc/pyplots/bride.py | 410 ++ doc/pyplots/process_vtk.py | 56 + doc/pyplots/test_cut.py | 55 + doc/pyplots/test_disconnect.py | 81 + doc/pyplots/test_join_quads.py | 79 + doc/pyplots/test_make_cart_grid.py | 50 + doc/pyplots/test_make_cyl_grid.py | 64 + doc/pyplots/test_make_cylinder.py | 50 + doc/pyplots/test_make_elmts_transform.py | 58 + doc/pyplots/test_make_pipe.py | 51 + doc/pyplots/test_make_spher_grid.py | 50 + doc/pyplots/test_prism_quads.py | 56 + doc/pyplots/test_propagation.py | 61 + doc/python.rst | 49 + doc/tui.rst | 7 + doc/tui_asso_quad_to_geom.rst | 77 + doc/tui_blocks_for_cyl_pipe.rst | 118 + doc/tui_cartgrid.rst | 139 + doc/tui_component.rst | 47 + doc/tui_cut_hexa.rst | 37 + doc/tui_cyl.rst | 34 + doc/tui_cylgrid.rst | 81 + doc/tui_disc_elmts.rst | 21 + doc/tui_discret_law.rst | 72 + doc/tui_document.rst | 34 + doc/tui_edge.rst | 38 + doc/tui_elements.rst | 32 + doc/tui_groups.rst | 104 + doc/tui_hexahedron.rst | 28 + doc/tui_make_elmts.rst | 42 + doc/tui_merge_elmts.rst | 42 + doc/tui_mesh.rst | 26 + doc/tui_modify_elmts.rst | 15 + doc/tui_pipe.rst | 36 + doc/tui_prism_join_quad.rst | 124 + doc/tui_propag.rst | 47 + doc/tui_quadrangle.rst | 43 + doc/tui_remove.rst | 24 + doc/tui_sphergrid.rst | 52 + doc/tui_vector.rst | 28 + doc/tui_vertex.rst | 45 + idl/CrossElements.idl | 59 + idl/Cylinder.idl | 51 + idl/Document.idl | 585 ++ idl/Edge.idl | 85 + idl/Element.idl | 43 + idl/Elements.idl | 171 + idl/Group.idl | 75 + idl/HEXABLOCK_Gen.idl | 70 + idl/Hexa.idl | 53 + idl/Law.idl | 51 + idl/Makefile.am | 194 + idl/Pipe.idl | 49 + idl/Propagation.idl | 50 + idl/Quad.idl | 72 + idl/Vector.idl | 48 + idl/Vertex.idl | 68 + internal_doc/AssoLines.gif | Bin 0 -> 8422 bytes internal_doc/AssoLines.html | 169 + internal_doc/Bugs.html | 76 + internal_doc/HemiSphere.png | Bin 0 -> 15383 bytes internal_doc/LastNews.html | 26 + internal_doc/PartRind.png | Bin 0 -> 10590 bytes internal_doc/PartSphere.png | Bin 0 -> 7849 bytes internal_doc/QuadRevolution.png | Bin 0 -> 8572 bytes internal_doc/QuadRevolution1.png | Bin 0 -> 17802 bytes internal_doc/QuadRevolution2.png | Bin 0 -> 24323 bytes internal_doc/Quads_5.png | Bin 0 -> 5579 bytes internal_doc/Quads_AB.png | Bin 0 -> 7205 bytes internal_doc/Quads_ABCD.png | Bin 0 -> 6635 bytes internal_doc/Quads_AC.png | Bin 0 -> 7403 bytes internal_doc/Quads_ACD.png | Bin 0 -> 6679 bytes internal_doc/Quads_ACDE.png | Bin 0 -> 6722 bytes internal_doc/Quads_ACE.png | Bin 0 -> 6783 bytes internal_doc/Questions.html | 25 + internal_doc/ReplaceBefore.gif | Bin 0 -> 10416 bytes internal_doc/ReplaceResult.gif | Bin 0 -> 7686 bytes internal_doc/Rind.png | Bin 0 -> 15798 bytes internal_doc/Sphere.gif | Bin 0 -> 2711 bytes internal_doc/bad_geom.png | Bin 0 -> 7485 bytes internal_doc/blue-ball.gif | Bin 0 -> 925 bytes internal_doc/demi_coque.png | Bin 0 -> 14175 bytes internal_doc/green-ball.gif | Bin 0 -> 886 bytes internal_doc/index.html | 448 ++ internal_doc/logo-cs.gif | Bin 0 -> 7134 bytes internal_doc/macaroni.png | Bin 0 -> 23089 bytes internal_doc/prism.png | Bin 0 -> 13721 bytes internal_doc/red-ball.gif | Bin 0 -> 527 bytes internal_doc/transfo.png | Bin 0 -> 11371 bytes salome_adm/unix/SALOMEconfig.h.in | 65 + salome_adm/unix/config_files/config.guess | 1471 +++++ salome_adm/unix/config_files/config.sub | 1602 +++++ salome_adm/unix/config_files/depcomp | 584 ++ salome_adm/unix/config_files/install-sh | 507 ++ salome_adm/unix/config_files/missing | 367 ++ src/HEXABLOCK/Hex.cxx | 86 + src/HEXABLOCK/Hex.hxx | 49 + src/HEXABLOCK/HexAnaQuads.hxx | 115 + src/HEXABLOCK/HexCloner.cxx | 242 + src/HEXABLOCK/HexCloner.hxx | 52 + src/HEXABLOCK/HexCramer.hxx | 161 + src/HEXABLOCK/HexCrossElements.cxx | 809 +++ src/HEXABLOCK/HexCrossElements.hxx | 134 + src/HEXABLOCK/HexCrossElements_build.cxx | 564 ++ src/HEXABLOCK/HexCylinder.cxx | 278 + src/HEXABLOCK/HexCylinder.hxx | 58 + src/HEXABLOCK/HexDiagnostics.hxx | 50 + src/HEXABLOCK/HexDocument.cxx | 1061 ++++ src/HEXABLOCK/HexDocument.hxx | 377 ++ src/HEXABLOCK/HexDocument_Xml.cxx | 685 ++ src/HEXABLOCK/HexDocument_asso.cxx | 241 + src/HEXABLOCK/HexDocument_quads.cxx | 1117 ++++ src/HEXABLOCK/HexDocument_trans.cxx | 257 + src/HEXABLOCK/HexEdge.cxx | 229 + src/HEXABLOCK/HexEdge.hxx | 195 + src/HEXABLOCK/HexElements.cxx | 1057 ++++ src/HEXABLOCK/HexElements.hxx | 480 ++ src/HEXABLOCK/HexElements_asso.cxx | 618 ++ src/HEXABLOCK/HexElements_bis.cxx | 491 ++ src/HEXABLOCK/HexElements_grid.cxx | 605 ++ src/HEXABLOCK/HexElements_piq.cxx | 718 +++ src/HEXABLOCK/HexElements_ter.cxx | 591 ++ src/HEXABLOCK/HexEltBase.cxx | 168 + src/HEXABLOCK/HexEltBase.hxx | 157 + src/HEXABLOCK/HexGlobale.cxx | 179 + src/HEXABLOCK/HexGlobale.hxx | 121 + src/HEXABLOCK/HexGroup.cxx | 142 + src/HEXABLOCK/HexGroup.hxx | 63 + src/HEXABLOCK/HexHexa.cxx | 1071 ++++ src/HEXABLOCK/HexHexa.hxx | 233 + src/HEXABLOCK/HexKasBiCylinder.cxx | 297 + src/HEXABLOCK/HexKasBiCylinder.hxx | 56 + src/HEXABLOCK/HexKasLine.cxx | 442 ++ src/HEXABLOCK/HexKasLine.hxx | 83 + src/HEXABLOCK/HexKasPoint.cxx | 132 + src/HEXABLOCK/HexKasPoint.hxx | 61 + src/HEXABLOCK/HexKas_functions.cxx | 58 + src/HEXABLOCK/HexKas_functions.hxx | 50 + src/HEXABLOCK/HexLaw.cxx | 57 + src/HEXABLOCK/HexLaw.hxx | 96 + src/HEXABLOCK/HexMatrix.hxx | 304 + src/HEXABLOCK/HexPipe.cxx | 48 + src/HEXABLOCK/HexPipe.hxx | 46 + src/HEXABLOCK/HexPropagation.hxx | 111 + src/HEXABLOCK/HexQuad.cxx | 560 ++ src/HEXABLOCK/HexQuad.hxx | 235 + src/HEXABLOCK/HexShape.cxx | 48 + src/HEXABLOCK/HexShape.hxx | 62 + src/HEXABLOCK/HexVector.cxx | 109 + src/HEXABLOCK/HexVector.hxx | 127 + src/HEXABLOCK/HexVertex.cxx | 82 + src/HEXABLOCK/HexVertex.hxx | 187 + src/HEXABLOCK/HexXmlTree.cxx | 415 ++ src/HEXABLOCK/HexXmlTree.hxx | 98 + src/HEXABLOCK/HexXmlWriter.cxx | 186 + src/HEXABLOCK/HexXmlWriter.hxx | 98 + src/HEXABLOCK/Makefile.am | 144 + src/HEXABLOCK/Sauver | 13 + src/HEXABLOCK/dsave | 65 + src/HEXABLOCK/hexa_base.hxx | 229 + src/HEXABLOCK/hexa_utils.cxx | 182 + src/HEXABLOCK/umake | 48 + src/HEXABLOCKGUI/CutEdge_QTD.ui | 85 + src/HEXABLOCKGUI/Cylinder_QTD.ui | 157 + src/HEXABLOCKGUI/Disconnect_QTD.ui | 726 +++ src/HEXABLOCKGUI/EdgeAssoc_QTD.ui | 662 ++ src/HEXABLOCKGUI/Edge_QTD.ui | 312 + src/HEXABLOCKGUI/Group_QTD.ui | 122 + src/HEXABLOCKGUI/HEXABLOCKGUI.cxx | 2842 +++++++++ src/HEXABLOCKGUI/HEXABLOCKGUI.hxx | 455 ++ .../HEXABLOCKGUI_DocumentDelegate.cxx | 475 ++ .../HEXABLOCKGUI_DocumentDelegate.hxx | 99 + .../HEXABLOCKGUI_DocumentGraphicView.cxx | 945 +++ .../HEXABLOCKGUI_DocumentGraphicView.hxx | 172 + .../HEXABLOCKGUI_DocumentItem.cxx | 556 ++ .../HEXABLOCKGUI_DocumentItem.hxx | 323 + .../HEXABLOCKGUI_DocumentModel.cxx | 3375 ++++++++++ .../HEXABLOCKGUI_DocumentModel.hxx | 496 ++ .../HEXABLOCKGUI_DocumentPanel.cxx | 5565 +++++++++++++++++ .../HEXABLOCKGUI_DocumentPanel.hxx | 1058 ++++ .../HEXABLOCKGUI_DocumentSelectionModel.cxx | 1406 +++++ .../HEXABLOCKGUI_DocumentSelectionModel.hxx | 159 + src/HEXABLOCKGUI/HEXABLOCKGUI_Exception.cxx | 58 + src/HEXABLOCKGUI/HEXABLOCKGUI_Exception.hxx | 44 + src/HEXABLOCKGUI/HEXABLOCKGUI_Export.hxx | 33 + src/HEXABLOCKGUI/HEXABLOCKGUI_Model.cxx | 55 + src/HEXABLOCKGUI/HEXABLOCKGUI_Model.hxx | 40 + src/HEXABLOCKGUI/HEXABLOCKGUI_Resource.cxx | 344 + src/HEXABLOCKGUI/HEXABLOCKGUI_Resource.hxx | 62 + src/HEXABLOCKGUI/HEXABLOCKGUI_SalomeTools.cxx | 463 ++ src/HEXABLOCKGUI/HEXABLOCKGUI_SalomeTools.hxx | 85 + src/HEXABLOCKGUI/HEXABLOCKGUI_Trace.cxx | 50 + src/HEXABLOCKGUI/HEXABLOCKGUI_Trace.hxx | 50 + src/HEXABLOCKGUI/Hexa_QTD.ui | 194 + src/HEXABLOCKGUI/JoinQuad_QTD.ui | 256 + src/HEXABLOCKGUI/Law_QTD.ui | 122 + src/HEXABLOCKGUI/MakeCartesian_QTD.ui | 450 ++ src/HEXABLOCKGUI/MakeCylinder_QTD.ui | 145 + src/HEXABLOCKGUI/MakeCylinders_QTD.ui | 79 + src/HEXABLOCKGUI/MakeCylindrical_QTD.ui | 265 + src/HEXABLOCKGUI/MakeGrid_QTD.ui | 1145 ++++ src/HEXABLOCKGUI/MakeHemiSphere_QTD.ui | 603 ++ src/HEXABLOCKGUI/MakePipe_QTD.ui | 160 + src/HEXABLOCKGUI/MakePipes_QTD.ui | 79 + src/HEXABLOCKGUI/MakeRind_QTD.ui | 322 + src/HEXABLOCKGUI/MakeSpherical_QTD.ui | 107 + src/HEXABLOCKGUI/MakeTranslation_QTD.ui | 134 + src/HEXABLOCKGUI/Makefile.am | 219 + src/HEXABLOCKGUI/MergeEdges_QTD.ui | 145 + src/HEXABLOCKGUI/MergeVertices_QTD.ui | 91 + src/HEXABLOCKGUI/Merge_QTD.ui | 499 ++ src/HEXABLOCKGUI/MyBasicGUI_PointDlg.cxx | 1474 +++++ src/HEXABLOCKGUI/MyBasicGUI_PointDlg.hxx | 182 + src/HEXABLOCKGUI/MyDlgRef/DlgRef.cxx | 853 +++ src/HEXABLOCKGUI/MyDlgRef/DlgRef.hxx | 899 +++ .../MyDlgRef/DlgRef_1List1Spin1Btn_QTD.ui | 98 + .../MyDlgRef/DlgRef_1Sel1Check1List_QTD.ui | 122 + .../MyDlgRef/DlgRef_1Sel1Check1Sel_QTD.ui | 148 + .../MyDlgRef/DlgRef_1Sel1Check_QTD.ui | 91 + .../DlgRef_1Sel1List1Check3Btn_QTD.ui | 154 + .../MyDlgRef/DlgRef_1Sel1Spin1Check_QTD.ui | 128 + .../MyDlgRef/DlgRef_1Sel1Spin_QTD.ui | 114 + .../DlgRef_1Sel2Spin1View1Check_QTD.ui | 147 + .../MyDlgRef/DlgRef_1Sel2Spin_QTD.ui | 141 + .../MyDlgRef/DlgRef_1Sel3Check_QTD.ui | 107 + .../MyDlgRef/DlgRef_1Sel3Spin1Check_QTD.ui | 175 + .../MyDlgRef/DlgRef_1Sel3Spin_QTD.ui | 168 + .../MyDlgRef/DlgRef_1Sel4Spin2Check_QTD.ui | 211 + .../MyDlgRef/DlgRef_1Sel4Spin_QTD.ui | 210 + .../MyDlgRef/DlgRef_1Sel5Spin1Check_QTD.ui | 243 + .../MyDlgRef/DlgRef_1Sel5Spin_QTD.ui | 232 + .../MyDlgRef/DlgRef_1SelExt_QTD.ui | 94 + src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel_QTD.ui | 91 + src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Spin_QTD.ui | 77 + .../MyDlgRef/DlgRef_2Sel1List1Check_QTD.ui | 153 + .../MyDlgRef/DlgRef_2Sel1List2Check_QTD.ui | 151 + .../MyDlgRef/DlgRef_2Sel1List_QTD.ui | 152 + .../MyDlgRef/DlgRef_2Sel1Spin2Check_QTD.ui | 176 + .../MyDlgRef/DlgRef_2Sel1SpinInt_QTD.ui | 150 + .../MyDlgRef/DlgRef_2Sel1Spin_QTD.ui | 153 + .../MyDlgRef/DlgRef_2Sel2List_QTD.ui | 166 + .../MyDlgRef/DlgRef_2Sel2Spin1Check_QTD.ui | 185 + .../MyDlgRef/DlgRef_2Sel2Spin3Check_QTD.ui | 199 + .../MyDlgRef/DlgRef_2Sel2Spin_QTD.ui | 175 + .../MyDlgRef/DlgRef_2Sel3Spin2Rb_QTD.ui | 219 + .../MyDlgRef/DlgRef_2Sel3Spin_QTD.ui | 202 + .../MyDlgRef/DlgRef_2Sel4Spin1Check_QTD.ui | 236 + .../MyDlgRef/DlgRef_2SelExt_QTD.ui | 132 + src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel_QTD.ui | 129 + src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Spin_QTD.ui | 103 + .../MyDlgRef/DlgRef_3Check_QTD.ui | 69 + .../MyDlgRef/DlgRef_3Radio1Sel1Spin_QTD.ui | 156 + .../MyDlgRef/DlgRef_3Radio_QTD.ui | 75 + .../MyDlgRef/DlgRef_3Sel1Check_QTD.ui | 182 + .../MyDlgRef/DlgRef_3Sel1Spin_QTD.ui | 194 + .../MyDlgRef/DlgRef_3Sel2Spin_QTD.ui | 214 + .../MyDlgRef/DlgRef_3Sel3Spin1Check_QTD.ui | 256 + .../MyDlgRef/DlgRef_3Sel3Spin2Check_QTD.ui | 243 + .../MyDlgRef/DlgRef_3Sel4Spin2Check_QTD.ui | 278 + src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel_QTD.ui | 167 + .../MyDlgRef/DlgRef_3Spin1Check_QTD.ui | 142 + src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Spin_QTD.ui | 134 + .../MyDlgRef/DlgRef_4Sel1List1Check_QTD.ui | 244 + .../MyDlgRef/DlgRef_4Sel1List_QTD.ui | 228 + .../MyDlgRef/DlgRef_4Sel1Spin2Check_QTD.ui | 243 + .../MyDlgRef/DlgRef_4Sel1Spin3Check_QTD.ui | 273 + src/HEXABLOCKGUI/MyDlgRef/DlgRef_6Sel_QTD.ui | 281 + .../MyDlgRef/DlgRef_Skeleton_QTD.ui | 311 + src/HEXABLOCKGUI/MyDlgRef/Makefile.am | 113 + src/HEXABLOCKGUI/MyDlgRef/MyDlgRef.cxx | 853 +++ src/HEXABLOCKGUI/MyDlgRef/MyDlgRef.hxx | 899 +++ src/HEXABLOCKGUI/MyGEOMBase_Helper.cxx | 1343 ++++ src/HEXABLOCKGUI/MyGEOMBase_Helper.hxx | 205 + src/HEXABLOCKGUI/MyGEOMBase_Skeleton.cxx | 433 ++ src/HEXABLOCKGUI/MyGEOMBase_Skeleton.hxx | 113 + src/HEXABLOCKGUI/Pipe_QTD.ui | 195 + src/HEXABLOCKGUI/PrismQuad_QTD.ui | 106 + src/HEXABLOCKGUI/Propagation_QTD.ui | 129 + src/HEXABLOCKGUI/QuadAssoc_QTD.ui | 101 + src/HEXABLOCKGUI/QuadRevolution_QTD.ui | 196 + src/HEXABLOCKGUI/Quad_QTD.ui | 373 ++ src/HEXABLOCKGUI/RemoveHexa_QTD.ui | 75 + src/HEXABLOCKGUI/ReplaceHexa_QTD.ui | 264 + src/HEXABLOCKGUI/Resource.cxx | 147 + src/HEXABLOCKGUI/Resource.hxx | 303 + src/HEXABLOCKGUI/Symmetry_QTD.ui | 446 ++ src/HEXABLOCKGUI/Transformation_QTD.ui | 463 ++ src/HEXABLOCKGUI/Vector_QTD.ui | 322 + src/HEXABLOCKGUI/Vertex_QTD.ui | 164 + src/HEXABLOCKGUI/klinkitemselectionmodel.cxx | 126 + src/HEXABLOCKGUI/klinkitemselectionmodel.hxx | 161 + src/HEXABLOCKGUI/kmodelindexproxymapper.cxx | 310 + src/HEXABLOCKGUI/kmodelindexproxymapper.hxx | 58 + src/HEXABLOCKGUI/resources/ExecHEXABLOCK.png | Bin 0 -> 831 bytes .../resources/HEXABLOCKCatalog.xml.in | 48 + src/HEXABLOCKGUI/resources/HEXABLOCK_icons.ts | 208 + .../resources/HEXABLOCK_msg_en.ts | 1369 ++++ .../resources/HEXABLOCK_msg_fr.ts | 1370 ++++ .../resources/ModuleHexablock.png | Bin 0 -> 38519 bytes src/HEXABLOCKGUI/resources/SalomeApp.xml.in | 38 + src/HEXABLOCKGUI/resources/add_cylinder.png | Bin 0 -> 780 bytes src/HEXABLOCKGUI/resources/add_edge.png | Bin 0 -> 338 bytes src/HEXABLOCKGUI/resources/add_group.png | Bin 0 -> 1106 bytes src/HEXABLOCKGUI/resources/add_hexa.png | Bin 0 -> 733 bytes src/HEXABLOCKGUI/resources/add_law.png | Bin 0 -> 1240 bytes src/HEXABLOCKGUI/resources/add_pipe.png | Bin 0 -> 820 bytes src/HEXABLOCKGUI/resources/add_quad.png | Bin 0 -> 519 bytes src/HEXABLOCKGUI/resources/add_vector.png | Bin 0 -> 348 bytes src/HEXABLOCKGUI/resources/add_vertex.png | Bin 0 -> 289 bytes src/HEXABLOCKGUI/resources/assoc_edge.png | Bin 0 -> 502 bytes src/HEXABLOCKGUI/resources/assoc_quad.png | Bin 0 -> 510 bytes src/HEXABLOCKGUI/resources/assoc_vertex.png | Bin 0 -> 324 bytes src/HEXABLOCKGUI/resources/build_wire.png | Bin 0 -> 562 bytes src/HEXABLOCKGUI/resources/compute_mesh.png | Bin 0 -> 1069 bytes src/HEXABLOCKGUI/resources/cut_edge.png | Bin 0 -> 660 bytes src/HEXABLOCKGUI/resources/disconnect.png | Bin 0 -> 978 bytes src/HEXABLOCKGUI/resources/join_quad.png | Bin 0 -> 710 bytes src/HEXABLOCKGUI/resources/line.png | Bin 0 -> 448 bytes src/HEXABLOCKGUI/resources/load_document.png | Bin 0 -> 874 bytes src/HEXABLOCKGUI/resources/make_cylinder.png | Bin 0 -> 859 bytes src/HEXABLOCKGUI/resources/make_cylinders.png | Bin 0 -> 791 bytes src/HEXABLOCKGUI/resources/make_grid.png | Bin 0 -> 277 bytes .../resources/make_hemisphere.png | Bin 0 -> 2291 bytes src/HEXABLOCKGUI/resources/make_pipe.png | Bin 0 -> 887 bytes src/HEXABLOCKGUI/resources/make_pipes.png | Bin 0 -> 791 bytes src/HEXABLOCKGUI/resources/make_symmetry.png | Bin 0 -> 633 bytes .../resources/make_transformation.png | Bin 0 -> 705 bytes src/HEXABLOCKGUI/resources/merge.png | Bin 0 -> 841 bytes src/HEXABLOCKGUI/resources/new_document.png | Bin 0 -> 578 bytes .../resources/perform__transformation.png | Bin 0 -> 811 bytes .../resources/perform_symmetry.png | Bin 0 -> 624 bytes .../resources/perform_transformation.png | Bin 0 -> 680 bytes src/HEXABLOCKGUI/resources/point2.png | Bin 0 -> 298 bytes src/HEXABLOCKGUI/resources/point3.png | Bin 0 -> 363 bytes .../resources/point_line_intersection.png | Bin 0 -> 564 bytes src/HEXABLOCKGUI/resources/pointonedge.png | Bin 0 -> 578 bytes src/HEXABLOCKGUI/resources/pointonface.png | Bin 0 -> 616 bytes src/HEXABLOCKGUI/resources/prism_quad.png | Bin 0 -> 765 bytes .../resources/quad_revolution.png | Bin 0 -> 971 bytes src/HEXABLOCKGUI/resources/remove_group.png | Bin 0 -> 1084 bytes src/HEXABLOCKGUI/resources/remove_hexa.png | Bin 0 -> 1176 bytes src/HEXABLOCKGUI/resources/remove_law.png | Bin 0 -> 1382 bytes src/HEXABLOCKGUI/resources/replace_hexa.png | Bin 0 -> 828 bytes src/HEXABLOCKGUI/resources/save_document.png | Bin 0 -> 933 bytes src/HEXABLOCKGUI/resources/select1.png | Bin 0 -> 1143 bytes .../resources/set_propagation.png | Bin 0 -> 693 bytes src/HEXABLOCK_I/HEXABLOCK.cxx | 833 +++ src/HEXABLOCK_I/HEXABLOCK.hxx | 411 ++ src/HEXABLOCK_I/HEXABLOCK_1.cxx | 1268 ++++ src/HEXABLOCK_I/HexCrossElements_impl.cxx | 362 ++ src/HEXABLOCK_I/HexCrossElements_impl.hxx | 62 + src/HEXABLOCK_I/HexCylinder_impl.cxx | 115 + src/HEXABLOCK_I/HexCylinder_impl.hxx | 53 + src/HEXABLOCK_I/HexDocument_impl.cxx | 2438 ++++++++ src/HEXABLOCK_I/HexDocument_impl.hxx | 279 + src/HEXABLOCK_I/HexEdge_impl.cxx | 212 + src/HEXABLOCK_I/HexEdge_impl.hxx | 66 + src/HEXABLOCK_I/HexElements_impl.cxx | 313 + src/HEXABLOCK_I/HexElements_impl.hxx | 84 + src/HEXABLOCK_I/HexGroup_impl.cxx | 161 + src/HEXABLOCK_I/HexGroup_impl.hxx | 61 + src/HEXABLOCK_I/HexHexa_impl.cxx | 107 + src/HEXABLOCK_I/HexHexa_impl.hxx | 52 + src/HEXABLOCK_I/HexLaw_impl.cxx | 104 + src/HEXABLOCK_I/HexLaw_impl.hxx | 52 + src/HEXABLOCK_I/HexPipe_impl.cxx | 105 + src/HEXABLOCK_I/HexPipe_impl.hxx | 52 + src/HEXABLOCK_I/HexPropagation_impl.cxx | 131 + src/HEXABLOCK_I/HexPropagation_impl.hxx | 51 + src/HEXABLOCK_I/HexQuad_impl.cxx | 184 + src/HEXABLOCK_I/HexQuad_impl.hxx | 62 + src/HEXABLOCK_I/HexVector_impl.cxx | 89 + src/HEXABLOCK_I/HexVector_impl.hxx | 54 + src/HEXABLOCK_I/HexVertex_impl.cxx | 145 + src/HEXABLOCK_I/HexVertex_impl.hxx | 62 + src/HEXABLOCK_I/Makefile.am | 91 + src/HEXABLOCK_I/hexablock.py | 188 + src/Makefile.am | 35 + src/TEST_CPP/HexEdgeTest.cxx | 70 + src/TEST_CPP/HexEdgeTest.hxx | 52 + src/TEST_CPP/HexVertexTest.cxx | 73 + src/TEST_CPP/HexVertexTest.hxx | 55 + src/TEST_CPP/Makefile.am | 206 + src/TEST_CPP/Makefile.orig.am | 206 + src/TEST_CPP/ModelTest.cxx | 1087 ++++ src/TEST_CPP/ModelTest.hxx | 102 + src/TEST_CPP/Test_HEXABLOCK.cxx | 167 + src/TEST_CPP/test_hexa1.cxx | 1940 ++++++ src/TEST_CPP/test_quads.cxx | 823 +++ src/TEST_CPP/test_tools.cxx | 59 + src/TEST_CPP/test_unit.hxx | 76 + src/TEST_PY/INTER_3_CYLINDRE.py | 415 ++ src/TEST_PY/Makefile.am | 47 + src/TEST_PY/TUYAU_COURBE.py | 790 +++ src/TEST_PY/Test_HEXABLOCK.py | 280 + src/TEST_PY/bielle.py | 545 ++ src/TEST_PY/bielle_variante.py | 248 + src/TEST_PY/bride.py | 410 ++ src/TEST_PY/crank.stp | 1178 ++++ src/TEST_PY/recettes/bielle.py | 258 + src/TEST_PY/recettes/bielle.stp | 1178 ++++ src/TEST_PY/recettes/cuve.brep | 1323 ++++ src/TEST_PY/recettes/cuve.py | 572 ++ src/TEST_PY/recettes/troisCylindres.brep | 648 ++ src/TEST_PY/recettes/troisCylindres.py | 207 + src/TEST_PY/recettes/tuyau.brep | 426 ++ src/TEST_PY/recettes/tuyau.py | 220 + src/TEST_PY/recettes/tuyauterie.brep | 453 ++ src/TEST_PY/recettes/tuyauterie.py | 259 + src/TEST_PY/tees.brep | 648 ++ src/TEST_PY/test_BIELLE_bad_assoc.py | 1081 ++++ src/TEST_PY/test_BIELLE_no_assoc.py | 1075 ++++ src/TEST_PY/test_HEXABLOCK.py | 418 ++ src/TEST_PY/test_INTER_3_CYLINDRE_no_assoc.py | 433 ++ src/TEST_PY/test_TUYAU_COURBE_no_assoc.py | 466 ++ src/TEST_PY/test_TUYAU_COURBE_weird_assoc.py | 808 +++ src/TEST_PY/test_distrib.py | 111 + src/TEST_PY/test_unit/asso_grid.py | 62 + src/TEST_PY/test_unit/bielle.py | 239 + src/TEST_PY/test_unit/hexa_quads.py | 254 + src/TEST_PY/test_unit/revolution.py | 144 + src/TEST_PY/test_unit/test_asso_lines.py | 185 + src/TEST_PY/test_unit/test_bugs.py | 128 + src/TEST_PY/test_unit/test_carre.py | 68 + src/TEST_PY/test_unit/test_cross.py | 89 + src/TEST_PY/test_unit/test_cuve.py | 71 + src/TEST_PY/test_unit/test_cylinders.py | 69 + src/TEST_PY/test_unit/test_disco.py | 68 + src/TEST_PY/test_unit/test_double_t.py | 166 + src/TEST_PY/test_unit/test_piquage.py | 99 + src/TEST_PY/test_unit/test_rind.py | 126 + src/TEST_PY/test_unit/test_sphere.py | 56 + src/TEST_PY/test_unit/test_transfo.py | 125 + src/TEST_PY/tuyau.brep | 426 ++ 651 files changed, 116469 insertions(+) create mode 100755 AUTHORS create mode 100755 COPYING create mode 100755 ChangeLog create mode 100755 Doxyfile create mode 100755 HEXABLOCK_version.h.in create mode 100755 INSTALL create mode 100755 Makefile.am create mode 100755 NEWS create mode 100755 README create mode 100755 adm_local/Makefile.am create mode 100755 adm_local/unix/Makefile.am create mode 100755 adm_local/unix/config_files/Makefile.am create mode 100755 adm_local/unix/config_files/check_HEXABLOCK.m4 create mode 100755 adm_local/unix/config_files/check_libxml.m4 create mode 100644 adm_local/unix/config_files/check_sphinx.m4 create mode 100755 adm_local/unix/config_files/i2_check_qt4.m4 create mode 100755 adm_local/unix/make_common_starter.am create mode 100755 bin/Makefile.am create mode 100755 bin/VERSION.in create mode 100755 bin/myrunSalome.py create mode 100755 bin/runAppli.in create mode 100755 build_configure create mode 100755 clean_configure create mode 100755 configure.ac create mode 100755 cppunit-report.xml create mode 100755 doc/Makefile.am create mode 100644 doc/_static/EX2.PNG create mode 100644 doc/_static/EX3.PNG create mode 100644 doc/_static/EX4.PNG create mode 100644 doc/_static/EX5.PNG create mode 100644 doc/_static/EX6.PNG create mode 100644 doc/_static/EX7.PNG create mode 100644 doc/_static/HEXAHEDRON.PNG create mode 100644 doc/_static/Sans titre.PNG create mode 100644 doc/_static/association.PNG create mode 100644 doc/_static/association2.PNG create mode 100644 doc/_static/before_quadrevolution.png create mode 100644 doc/_static/before_replacehexa.png create mode 100644 doc/_static/bielle.PNG create mode 100644 doc/_static/bielle_mesh.png create mode 100644 doc/_static/bride.PNG create mode 100644 doc/_static/bride_geom.png create mode 100644 doc/_static/bride_model1.png create mode 100644 doc/_static/bride_model2.png create mode 100644 doc/_static/cad_bielle.PNG create mode 100644 doc/_static/cartgrid1.PNG create mode 100644 doc/_static/cartgrid2.PNG create mode 100644 doc/_static/cartgrid3.png create mode 100644 doc/_static/component1.png create mode 100644 doc/_static/component2.png create mode 100644 doc/_static/component3.png create mode 100644 doc/_static/component4.png create mode 100644 doc/_static/cut.png create mode 100644 doc/_static/cyl_grid1.PNG create mode 100644 doc/_static/cyl_grid2.PNG create mode 100644 doc/_static/cyl_grid3.PNG create mode 100644 doc/_static/cylgrid.PNG create mode 100644 doc/_static/cylgrid1.PNG create mode 100644 doc/_static/cylgrid1.png create mode 100644 doc/_static/cylgrid2.PNG create mode 100644 doc/_static/cylgrid2.png create mode 100644 doc/_static/cylgrid3.png create mode 100644 doc/_static/cylgrid4.png create mode 100644 doc/_static/cylgrid5.png create mode 100644 doc/_static/cylgrid6.png create mode 100644 doc/_static/cylgrids.png create mode 100644 doc/_static/cylinder.png create mode 100644 doc/_static/db_cylgrid.PNG create mode 100644 doc/_static/db_sph_grid.PNG create mode 100644 doc/_static/decoupe.png create mode 100644 doc/_static/dialogbox.PNG create mode 100644 doc/_static/dialogbox2.PNG create mode 100644 doc/_static/dialogbox_cartgrid.PNG create mode 100644 doc/_static/dialogbox_cylgrid.PNG create mode 100644 doc/_static/dialogbox_discreti.PNG create mode 100644 doc/_static/dialogbox_law.PNG create mode 100644 doc/_static/dialogbox_remove.PNG create mode 100644 doc/_static/dialogbox_remove.png create mode 100644 doc/_static/disco_quad.png create mode 100644 doc/_static/ex1.JPG create mode 100644 doc/_static/ex1.PNG create mode 100644 doc/_static/gui_add_group.png create mode 100644 doc/_static/gui_add_law.png create mode 100644 doc/_static/gui_ass_edge.png create mode 100644 doc/_static/gui_ass_quad.png create mode 100644 doc/_static/gui_cut_hexa.png create mode 100644 doc/_static/gui_cylinder.png create mode 100644 doc/_static/gui_disco_edge.png create mode 100644 doc/_static/gui_disco_quad.png create mode 100644 doc/_static/gui_disco_vertex.png create mode 100644 doc/_static/gui_edge2.png create mode 100644 doc/_static/gui_edge_vertices.png create mode 100644 doc/_static/gui_hemispherical.png create mode 100644 doc/_static/gui_hexa_quads.png create mode 100644 doc/_static/gui_hexa_vertices.png create mode 100644 doc/_static/gui_import_document.png create mode 100644 doc/_static/gui_join_quads.png create mode 100644 doc/_static/gui_make_cart_grid.png create mode 100644 doc/_static/gui_make_cyl_grid.png create mode 100644 doc/_static/gui_make_cyl_grid_irregular.png create mode 100644 doc/_static/gui_make_cylinder.png create mode 100644 doc/_static/gui_make_cylinders.png create mode 100644 doc/_static/gui_make_line_symmetry.png create mode 100644 doc/_static/gui_make_pipe.png create mode 100644 doc/_static/gui_make_pipes.png create mode 100644 doc/_static/gui_make_plan_symmetry.png create mode 100644 doc/_static/gui_make_point_symmetry.png create mode 100644 doc/_static/gui_make_spher_grid.png create mode 100644 doc/_static/gui_make_sym_line.png create mode 100644 doc/_static/gui_make_sym_plan.png create mode 100644 doc/_static/gui_make_sym_point.png create mode 100644 doc/_static/gui_make_transfo_rotation.png create mode 100644 doc/_static/gui_make_transfo_scale.png create mode 100644 doc/_static/gui_make_transfo_translation.png create mode 100644 doc/_static/gui_merge_edges.png create mode 100644 doc/_static/gui_merge_quads.png create mode 100644 doc/_static/gui_merge_vertices.png create mode 100644 doc/_static/gui_mesh.png create mode 100644 doc/_static/gui_modify_line_symmetry.png create mode 100644 doc/_static/gui_modify_plan_symmetry.png create mode 100644 doc/_static/gui_modify_point_symmetry.png create mode 100644 doc/_static/gui_modify_transfo_rotation.png create mode 100644 doc/_static/gui_modify_transfo_scale.png create mode 100644 doc/_static/gui_modify_transfo_translation.png create mode 100644 doc/_static/gui_new_document.png create mode 100644 doc/_static/gui_parthemispherical.png create mode 100644 doc/_static/gui_partrind.png create mode 100644 doc/_static/gui_pipe.png create mode 100644 doc/_static/gui_prism_quads.png create mode 100644 doc/_static/gui_quad_edges.png create mode 100644 doc/_static/gui_quad_vertices.png create mode 100644 doc/_static/gui_quadrevolution.png create mode 100644 doc/_static/gui_remove_hexa.png create mode 100644 doc/_static/gui_replacehexa.png create mode 100644 doc/_static/gui_rind.png create mode 100644 doc/_static/gui_vector.png create mode 100644 doc/_static/gui_vector1.png create mode 100644 doc/_static/gui_vector2.png create mode 100644 doc/_static/gui_vertex.png create mode 100644 doc/_static/hemisphericalgrid.png create mode 100644 doc/_static/interactive.PNG create mode 100644 doc/_static/interactive.png create mode 100644 doc/_static/intersec_cyl.PNG create mode 100644 doc/_static/join.png create mode 100644 doc/_static/meshing1.PNG create mode 100644 doc/_static/meshing2.PNG create mode 100644 doc/_static/meshing3.PNG create mode 100644 doc/_static/no_cut.png create mode 100644 doc/_static/no_decoupe.png create mode 100644 doc/_static/parthemisphericalgrid.png create mode 100644 doc/_static/partrindgrid.png create mode 100644 doc/_static/pipe.png create mode 100644 doc/_static/point_sym_before.png create mode 100644 doc/_static/prisme.png create mode 100644 doc/_static/prisme_gui.png create mode 100644 doc/_static/quadrevolution.png create mode 100644 doc/_static/remove1.PNG create mode 100644 doc/_static/remove2.PNG create mode 100644 doc/_static/remove3.PNG create mode 100644 doc/_static/remove3.png create mode 100644 doc/_static/replacehexa.png create mode 100644 doc/_static/rindgrid.png create mode 100644 doc/_static/sph_grid.PNG create mode 100644 doc/_static/sph_grid.png create mode 100644 doc/_static/sph_grid2.PNG create mode 100644 doc/_static/transfo0.png create mode 100644 doc/_static/transfo_rotation.png create mode 100644 doc/_static/transfo_scale.png create mode 100644 doc/_static/transfo_translation.png create mode 100644 doc/_static/tuyau_courbe.PNG create mode 100644 doc/annexe.rst create mode 100644 doc/block_method.rst create mode 100644 doc/cad.rst create mode 100644 doc/cas_test_python/BIELLE.py create mode 100644 doc/conf.py.in create mode 100644 doc/creategrids.rst create mode 100644 doc/full_example_bridle.rst create mode 100644 doc/general.rst create mode 100644 doc/gui.rst create mode 100644 doc/gui_asso_quad_to_geom.rst create mode 100644 doc/gui_blocks_for_cyl_pipe.rst create mode 100644 doc/gui_component.rst create mode 100644 doc/gui_cut_hexa.rst create mode 100644 doc/gui_cyl.rst create mode 100644 doc/gui_disc_elmts.rst create mode 100644 doc/gui_discret_law.rst create mode 100644 doc/gui_document.rst create mode 100644 doc/gui_edge.rst create mode 100644 doc/gui_elements.rst create mode 100644 doc/gui_groups.rst create mode 100644 doc/gui_hemisphere.rst create mode 100644 doc/gui_hexahedron.rst create mode 100644 doc/gui_make_elmts.rst create mode 100644 doc/gui_make_symmetry.rst create mode 100644 doc/gui_merge_elmts.rst create mode 100644 doc/gui_mesh.rst create mode 100644 doc/gui_modify_elmts.rst create mode 100644 doc/gui_modify_symmetry.rst create mode 100644 doc/gui_pipe.rst create mode 100644 doc/gui_prism_join_quad.rst create mode 100644 doc/gui_propag.rst create mode 100644 doc/gui_quad_revolution.rst create mode 100644 doc/gui_quadrangle.rst create mode 100644 doc/gui_remove.rst create mode 100644 doc/gui_replace_hexa.rst create mode 100644 doc/gui_vector.rst create mode 100644 doc/gui_vertex.rst create mode 100644 doc/index.rst create mode 100644 doc/interactive.rst create mode 100644 doc/intro_association.rst create mode 100644 doc/intro_groups.rst create mode 100644 doc/intro_mesh.rst create mode 100644 doc/intro_python.rst create mode 100644 doc/mesh.rst create mode 100644 doc/pyplots/BIELLE.py create mode 100644 doc/pyplots/bielle.py create mode 100644 doc/pyplots/bielle_JPL.py create mode 100644 doc/pyplots/bride.py create mode 100755 doc/pyplots/process_vtk.py create mode 100644 doc/pyplots/test_cut.py create mode 100644 doc/pyplots/test_disconnect.py create mode 100644 doc/pyplots/test_join_quads.py create mode 100644 doc/pyplots/test_make_cart_grid.py create mode 100644 doc/pyplots/test_make_cyl_grid.py create mode 100644 doc/pyplots/test_make_cylinder.py create mode 100644 doc/pyplots/test_make_elmts_transform.py create mode 100644 doc/pyplots/test_make_pipe.py create mode 100644 doc/pyplots/test_make_spher_grid.py create mode 100644 doc/pyplots/test_prism_quads.py create mode 100644 doc/pyplots/test_propagation.py create mode 100644 doc/python.rst create mode 100644 doc/tui.rst create mode 100644 doc/tui_asso_quad_to_geom.rst create mode 100644 doc/tui_blocks_for_cyl_pipe.rst create mode 100644 doc/tui_cartgrid.rst create mode 100644 doc/tui_component.rst create mode 100644 doc/tui_cut_hexa.rst create mode 100644 doc/tui_cyl.rst create mode 100644 doc/tui_cylgrid.rst create mode 100644 doc/tui_disc_elmts.rst create mode 100644 doc/tui_discret_law.rst create mode 100644 doc/tui_document.rst create mode 100644 doc/tui_edge.rst create mode 100644 doc/tui_elements.rst create mode 100644 doc/tui_groups.rst create mode 100644 doc/tui_hexahedron.rst create mode 100644 doc/tui_make_elmts.rst create mode 100644 doc/tui_merge_elmts.rst create mode 100644 doc/tui_mesh.rst create mode 100644 doc/tui_modify_elmts.rst create mode 100644 doc/tui_pipe.rst create mode 100644 doc/tui_prism_join_quad.rst create mode 100644 doc/tui_propag.rst create mode 100644 doc/tui_quadrangle.rst create mode 100644 doc/tui_remove.rst create mode 100644 doc/tui_sphergrid.rst create mode 100644 doc/tui_vector.rst create mode 100644 doc/tui_vertex.rst create mode 100755 idl/CrossElements.idl create mode 100755 idl/Cylinder.idl create mode 100755 idl/Document.idl create mode 100755 idl/Edge.idl create mode 100755 idl/Element.idl create mode 100755 idl/Elements.idl create mode 100755 idl/Group.idl create mode 100755 idl/HEXABLOCK_Gen.idl create mode 100755 idl/Hexa.idl create mode 100755 idl/Law.idl create mode 100755 idl/Makefile.am create mode 100755 idl/Pipe.idl create mode 100755 idl/Propagation.idl create mode 100755 idl/Quad.idl create mode 100755 idl/Vector.idl create mode 100755 idl/Vertex.idl create mode 100644 internal_doc/AssoLines.gif create mode 100755 internal_doc/AssoLines.html create mode 100755 internal_doc/Bugs.html create mode 100755 internal_doc/HemiSphere.png create mode 100755 internal_doc/LastNews.html create mode 100755 internal_doc/PartRind.png create mode 100755 internal_doc/PartSphere.png create mode 100755 internal_doc/QuadRevolution.png create mode 100644 internal_doc/QuadRevolution1.png create mode 100644 internal_doc/QuadRevolution2.png create mode 100755 internal_doc/Quads_5.png create mode 100755 internal_doc/Quads_AB.png create mode 100755 internal_doc/Quads_ABCD.png create mode 100755 internal_doc/Quads_AC.png create mode 100755 internal_doc/Quads_ACD.png create mode 100755 internal_doc/Quads_ACDE.png create mode 100755 internal_doc/Quads_ACE.png create mode 100755 internal_doc/Questions.html create mode 100755 internal_doc/ReplaceBefore.gif create mode 100755 internal_doc/ReplaceResult.gif create mode 100755 internal_doc/Rind.png create mode 100755 internal_doc/Sphere.gif create mode 100755 internal_doc/bad_geom.png create mode 100755 internal_doc/blue-ball.gif create mode 100755 internal_doc/demi_coque.png create mode 100755 internal_doc/green-ball.gif create mode 100755 internal_doc/index.html create mode 100755 internal_doc/logo-cs.gif create mode 100644 internal_doc/macaroni.png create mode 100644 internal_doc/prism.png create mode 100755 internal_doc/red-ball.gif create mode 100644 internal_doc/transfo.png create mode 100755 salome_adm/unix/SALOMEconfig.h.in create mode 100755 salome_adm/unix/config_files/config.guess create mode 100755 salome_adm/unix/config_files/config.sub create mode 100755 salome_adm/unix/config_files/depcomp create mode 100755 salome_adm/unix/config_files/install-sh create mode 100755 salome_adm/unix/config_files/missing create mode 100755 src/HEXABLOCK/Hex.cxx create mode 100755 src/HEXABLOCK/Hex.hxx create mode 100755 src/HEXABLOCK/HexAnaQuads.hxx create mode 100755 src/HEXABLOCK/HexCloner.cxx create mode 100755 src/HEXABLOCK/HexCloner.hxx create mode 100755 src/HEXABLOCK/HexCramer.hxx create mode 100755 src/HEXABLOCK/HexCrossElements.cxx create mode 100755 src/HEXABLOCK/HexCrossElements.hxx create mode 100755 src/HEXABLOCK/HexCrossElements_build.cxx create mode 100644 src/HEXABLOCK/HexCylinder.cxx create mode 100755 src/HEXABLOCK/HexCylinder.hxx create mode 100755 src/HEXABLOCK/HexDiagnostics.hxx create mode 100755 src/HEXABLOCK/HexDocument.cxx create mode 100755 src/HEXABLOCK/HexDocument.hxx create mode 100755 src/HEXABLOCK/HexDocument_Xml.cxx create mode 100755 src/HEXABLOCK/HexDocument_asso.cxx create mode 100755 src/HEXABLOCK/HexDocument_quads.cxx create mode 100755 src/HEXABLOCK/HexDocument_trans.cxx create mode 100755 src/HEXABLOCK/HexEdge.cxx create mode 100755 src/HEXABLOCK/HexEdge.hxx create mode 100755 src/HEXABLOCK/HexElements.cxx create mode 100755 src/HEXABLOCK/HexElements.hxx create mode 100755 src/HEXABLOCK/HexElements_asso.cxx create mode 100755 src/HEXABLOCK/HexElements_bis.cxx create mode 100755 src/HEXABLOCK/HexElements_grid.cxx create mode 100755 src/HEXABLOCK/HexElements_piq.cxx create mode 100755 src/HEXABLOCK/HexElements_ter.cxx create mode 100755 src/HEXABLOCK/HexEltBase.cxx create mode 100755 src/HEXABLOCK/HexEltBase.hxx create mode 100755 src/HEXABLOCK/HexGlobale.cxx create mode 100755 src/HEXABLOCK/HexGlobale.hxx create mode 100755 src/HEXABLOCK/HexGroup.cxx create mode 100755 src/HEXABLOCK/HexGroup.hxx create mode 100755 src/HEXABLOCK/HexHexa.cxx create mode 100755 src/HEXABLOCK/HexHexa.hxx create mode 100755 src/HEXABLOCK/HexKasBiCylinder.cxx create mode 100755 src/HEXABLOCK/HexKasBiCylinder.hxx create mode 100755 src/HEXABLOCK/HexKasLine.cxx create mode 100755 src/HEXABLOCK/HexKasLine.hxx create mode 100755 src/HEXABLOCK/HexKasPoint.cxx create mode 100755 src/HEXABLOCK/HexKasPoint.hxx create mode 100755 src/HEXABLOCK/HexKas_functions.cxx create mode 100755 src/HEXABLOCK/HexKas_functions.hxx create mode 100644 src/HEXABLOCK/HexLaw.cxx create mode 100755 src/HEXABLOCK/HexLaw.hxx create mode 100755 src/HEXABLOCK/HexMatrix.hxx create mode 100755 src/HEXABLOCK/HexPipe.cxx create mode 100755 src/HEXABLOCK/HexPipe.hxx create mode 100755 src/HEXABLOCK/HexPropagation.hxx create mode 100755 src/HEXABLOCK/HexQuad.cxx create mode 100755 src/HEXABLOCK/HexQuad.hxx create mode 100755 src/HEXABLOCK/HexShape.cxx create mode 100755 src/HEXABLOCK/HexShape.hxx create mode 100755 src/HEXABLOCK/HexVector.cxx create mode 100755 src/HEXABLOCK/HexVector.hxx create mode 100755 src/HEXABLOCK/HexVertex.cxx create mode 100755 src/HEXABLOCK/HexVertex.hxx create mode 100755 src/HEXABLOCK/HexXmlTree.cxx create mode 100755 src/HEXABLOCK/HexXmlTree.hxx create mode 100755 src/HEXABLOCK/HexXmlWriter.cxx create mode 100755 src/HEXABLOCK/HexXmlWriter.hxx create mode 100755 src/HEXABLOCK/Makefile.am create mode 100755 src/HEXABLOCK/Sauver create mode 100644 src/HEXABLOCK/dsave create mode 100755 src/HEXABLOCK/hexa_base.hxx create mode 100755 src/HEXABLOCK/hexa_utils.cxx create mode 100755 src/HEXABLOCK/umake create mode 100644 src/HEXABLOCKGUI/CutEdge_QTD.ui create mode 100644 src/HEXABLOCKGUI/Cylinder_QTD.ui create mode 100644 src/HEXABLOCKGUI/Disconnect_QTD.ui create mode 100644 src/HEXABLOCKGUI/EdgeAssoc_QTD.ui create mode 100644 src/HEXABLOCKGUI/Edge_QTD.ui create mode 100644 src/HEXABLOCKGUI/Group_QTD.ui create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI.cxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI.hxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentDelegate.cxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentDelegate.hxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentGraphicView.cxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentGraphicView.hxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentItem.cxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentItem.hxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentModel.cxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentModel.hxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentPanel.cxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentPanel.hxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentSelectionModel.cxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentSelectionModel.hxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_Exception.cxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_Exception.hxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_Export.hxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_Model.cxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_Model.hxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_Resource.cxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_Resource.hxx create mode 100644 src/HEXABLOCKGUI/HEXABLOCKGUI_SalomeTools.cxx create mode 100644 src/HEXABLOCKGUI/HEXABLOCKGUI_SalomeTools.hxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_Trace.cxx create mode 100755 src/HEXABLOCKGUI/HEXABLOCKGUI_Trace.hxx create mode 100755 src/HEXABLOCKGUI/Hexa_QTD.ui create mode 100644 src/HEXABLOCKGUI/JoinQuad_QTD.ui create mode 100644 src/HEXABLOCKGUI/Law_QTD.ui create mode 100644 src/HEXABLOCKGUI/MakeCartesian_QTD.ui create mode 100644 src/HEXABLOCKGUI/MakeCylinder_QTD.ui create mode 100644 src/HEXABLOCKGUI/MakeCylinders_QTD.ui create mode 100644 src/HEXABLOCKGUI/MakeCylindrical_QTD.ui create mode 100644 src/HEXABLOCKGUI/MakeGrid_QTD.ui create mode 100644 src/HEXABLOCKGUI/MakeHemiSphere_QTD.ui create mode 100644 src/HEXABLOCKGUI/MakePipe_QTD.ui create mode 100644 src/HEXABLOCKGUI/MakePipes_QTD.ui create mode 100644 src/HEXABLOCKGUI/MakeRind_QTD.ui create mode 100644 src/HEXABLOCKGUI/MakeSpherical_QTD.ui create mode 100644 src/HEXABLOCKGUI/MakeTranslation_QTD.ui create mode 100755 src/HEXABLOCKGUI/Makefile.am create mode 100644 src/HEXABLOCKGUI/MergeEdges_QTD.ui create mode 100644 src/HEXABLOCKGUI/MergeVertices_QTD.ui create mode 100644 src/HEXABLOCKGUI/Merge_QTD.ui create mode 100644 src/HEXABLOCKGUI/MyBasicGUI_PointDlg.cxx create mode 100755 src/HEXABLOCKGUI/MyBasicGUI_PointDlg.hxx create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef.cxx create mode 100644 src/HEXABLOCKGUI/MyDlgRef/DlgRef.hxx create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1List1Spin1Btn_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check1List_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check1Sel_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1List1Check3Btn_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Spin1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel2Spin1View1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel2Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Spin1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel4Spin2Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel4Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel5Spin1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel5Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1SelExt_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List2Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1Spin2Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1SpinInt_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2List_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin3Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel3Spin2Rb_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel3Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel4Spin1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2SelExt_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Radio1Sel1Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Radio_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel1Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel2Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel3Spin1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel3Spin2Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel4Spin2Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Spin1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Spin_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1List1Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1List_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1Spin2Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1Spin3Check_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_6Sel_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/DlgRef_Skeleton_QTD.ui create mode 100755 src/HEXABLOCKGUI/MyDlgRef/Makefile.am create mode 100755 src/HEXABLOCKGUI/MyDlgRef/MyDlgRef.cxx create mode 100644 src/HEXABLOCKGUI/MyDlgRef/MyDlgRef.hxx create mode 100644 src/HEXABLOCKGUI/MyGEOMBase_Helper.cxx create mode 100644 src/HEXABLOCKGUI/MyGEOMBase_Helper.hxx create mode 100755 src/HEXABLOCKGUI/MyGEOMBase_Skeleton.cxx create mode 100755 src/HEXABLOCKGUI/MyGEOMBase_Skeleton.hxx create mode 100644 src/HEXABLOCKGUI/Pipe_QTD.ui create mode 100644 src/HEXABLOCKGUI/PrismQuad_QTD.ui create mode 100644 src/HEXABLOCKGUI/Propagation_QTD.ui create mode 100644 src/HEXABLOCKGUI/QuadAssoc_QTD.ui create mode 100644 src/HEXABLOCKGUI/QuadRevolution_QTD.ui create mode 100755 src/HEXABLOCKGUI/Quad_QTD.ui create mode 100644 src/HEXABLOCKGUI/RemoveHexa_QTD.ui create mode 100644 src/HEXABLOCKGUI/ReplaceHexa_QTD.ui create mode 100755 src/HEXABLOCKGUI/Resource.cxx create mode 100755 src/HEXABLOCKGUI/Resource.hxx create mode 100644 src/HEXABLOCKGUI/Symmetry_QTD.ui create mode 100644 src/HEXABLOCKGUI/Transformation_QTD.ui create mode 100644 src/HEXABLOCKGUI/Vector_QTD.ui create mode 100755 src/HEXABLOCKGUI/Vertex_QTD.ui create mode 100644 src/HEXABLOCKGUI/klinkitemselectionmodel.cxx create mode 100644 src/HEXABLOCKGUI/klinkitemselectionmodel.hxx create mode 100644 src/HEXABLOCKGUI/kmodelindexproxymapper.cxx create mode 100644 src/HEXABLOCKGUI/kmodelindexproxymapper.hxx create mode 100755 src/HEXABLOCKGUI/resources/ExecHEXABLOCK.png create mode 100755 src/HEXABLOCKGUI/resources/HEXABLOCKCatalog.xml.in create mode 100755 src/HEXABLOCKGUI/resources/HEXABLOCK_icons.ts create mode 100755 src/HEXABLOCKGUI/resources/HEXABLOCK_msg_en.ts create mode 100755 src/HEXABLOCKGUI/resources/HEXABLOCK_msg_fr.ts create mode 100755 src/HEXABLOCKGUI/resources/ModuleHexablock.png create mode 100755 src/HEXABLOCKGUI/resources/SalomeApp.xml.in create mode 100644 src/HEXABLOCKGUI/resources/add_cylinder.png create mode 100644 src/HEXABLOCKGUI/resources/add_edge.png create mode 100644 src/HEXABLOCKGUI/resources/add_group.png create mode 100644 src/HEXABLOCKGUI/resources/add_hexa.png create mode 100644 src/HEXABLOCKGUI/resources/add_law.png create mode 100644 src/HEXABLOCKGUI/resources/add_pipe.png create mode 100644 src/HEXABLOCKGUI/resources/add_quad.png create mode 100644 src/HEXABLOCKGUI/resources/add_vector.png create mode 100644 src/HEXABLOCKGUI/resources/add_vertex.png create mode 100644 src/HEXABLOCKGUI/resources/assoc_edge.png create mode 100644 src/HEXABLOCKGUI/resources/assoc_quad.png create mode 100644 src/HEXABLOCKGUI/resources/assoc_vertex.png create mode 100755 src/HEXABLOCKGUI/resources/build_wire.png create mode 100644 src/HEXABLOCKGUI/resources/compute_mesh.png create mode 100644 src/HEXABLOCKGUI/resources/cut_edge.png create mode 100644 src/HEXABLOCKGUI/resources/disconnect.png create mode 100644 src/HEXABLOCKGUI/resources/join_quad.png create mode 100755 src/HEXABLOCKGUI/resources/line.png create mode 100755 src/HEXABLOCKGUI/resources/load_document.png create mode 100644 src/HEXABLOCKGUI/resources/make_cylinder.png create mode 100644 src/HEXABLOCKGUI/resources/make_cylinders.png create mode 100644 src/HEXABLOCKGUI/resources/make_grid.png create mode 100644 src/HEXABLOCKGUI/resources/make_hemisphere.png create mode 100644 src/HEXABLOCKGUI/resources/make_pipe.png create mode 100644 src/HEXABLOCKGUI/resources/make_pipes.png create mode 100644 src/HEXABLOCKGUI/resources/make_symmetry.png create mode 100644 src/HEXABLOCKGUI/resources/make_transformation.png create mode 100644 src/HEXABLOCKGUI/resources/merge.png create mode 100755 src/HEXABLOCKGUI/resources/new_document.png create mode 100644 src/HEXABLOCKGUI/resources/perform__transformation.png create mode 100644 src/HEXABLOCKGUI/resources/perform_symmetry.png create mode 100644 src/HEXABLOCKGUI/resources/perform_transformation.png create mode 100755 src/HEXABLOCKGUI/resources/point2.png create mode 100755 src/HEXABLOCKGUI/resources/point3.png create mode 100755 src/HEXABLOCKGUI/resources/point_line_intersection.png create mode 100755 src/HEXABLOCKGUI/resources/pointonedge.png create mode 100755 src/HEXABLOCKGUI/resources/pointonface.png create mode 100644 src/HEXABLOCKGUI/resources/prism_quad.png create mode 100644 src/HEXABLOCKGUI/resources/quad_revolution.png create mode 100644 src/HEXABLOCKGUI/resources/remove_group.png create mode 100644 src/HEXABLOCKGUI/resources/remove_hexa.png create mode 100644 src/HEXABLOCKGUI/resources/remove_law.png create mode 100644 src/HEXABLOCKGUI/resources/replace_hexa.png create mode 100755 src/HEXABLOCKGUI/resources/save_document.png create mode 100755 src/HEXABLOCKGUI/resources/select1.png create mode 100644 src/HEXABLOCKGUI/resources/set_propagation.png create mode 100755 src/HEXABLOCK_I/HEXABLOCK.cxx create mode 100755 src/HEXABLOCK_I/HEXABLOCK.hxx create mode 100644 src/HEXABLOCK_I/HEXABLOCK_1.cxx create mode 100755 src/HEXABLOCK_I/HexCrossElements_impl.cxx create mode 100755 src/HEXABLOCK_I/HexCrossElements_impl.hxx create mode 100755 src/HEXABLOCK_I/HexCylinder_impl.cxx create mode 100755 src/HEXABLOCK_I/HexCylinder_impl.hxx create mode 100755 src/HEXABLOCK_I/HexDocument_impl.cxx create mode 100755 src/HEXABLOCK_I/HexDocument_impl.hxx create mode 100755 src/HEXABLOCK_I/HexEdge_impl.cxx create mode 100755 src/HEXABLOCK_I/HexEdge_impl.hxx create mode 100755 src/HEXABLOCK_I/HexElements_impl.cxx create mode 100755 src/HEXABLOCK_I/HexElements_impl.hxx create mode 100755 src/HEXABLOCK_I/HexGroup_impl.cxx create mode 100755 src/HEXABLOCK_I/HexGroup_impl.hxx create mode 100755 src/HEXABLOCK_I/HexHexa_impl.cxx create mode 100755 src/HEXABLOCK_I/HexHexa_impl.hxx create mode 100755 src/HEXABLOCK_I/HexLaw_impl.cxx create mode 100755 src/HEXABLOCK_I/HexLaw_impl.hxx create mode 100755 src/HEXABLOCK_I/HexPipe_impl.cxx create mode 100755 src/HEXABLOCK_I/HexPipe_impl.hxx create mode 100755 src/HEXABLOCK_I/HexPropagation_impl.cxx create mode 100755 src/HEXABLOCK_I/HexPropagation_impl.hxx create mode 100755 src/HEXABLOCK_I/HexQuad_impl.cxx create mode 100755 src/HEXABLOCK_I/HexQuad_impl.hxx create mode 100755 src/HEXABLOCK_I/HexVector_impl.cxx create mode 100755 src/HEXABLOCK_I/HexVector_impl.hxx create mode 100755 src/HEXABLOCK_I/HexVertex_impl.cxx create mode 100755 src/HEXABLOCK_I/HexVertex_impl.hxx create mode 100755 src/HEXABLOCK_I/Makefile.am create mode 100755 src/HEXABLOCK_I/hexablock.py create mode 100755 src/Makefile.am create mode 100755 src/TEST_CPP/HexEdgeTest.cxx create mode 100755 src/TEST_CPP/HexEdgeTest.hxx create mode 100755 src/TEST_CPP/HexVertexTest.cxx create mode 100755 src/TEST_CPP/HexVertexTest.hxx create mode 100755 src/TEST_CPP/Makefile.am create mode 100755 src/TEST_CPP/Makefile.orig.am create mode 100755 src/TEST_CPP/ModelTest.cxx create mode 100755 src/TEST_CPP/ModelTest.hxx create mode 100755 src/TEST_CPP/Test_HEXABLOCK.cxx create mode 100755 src/TEST_CPP/test_hexa1.cxx create mode 100755 src/TEST_CPP/test_quads.cxx create mode 100755 src/TEST_CPP/test_tools.cxx create mode 100644 src/TEST_CPP/test_unit.hxx create mode 100755 src/TEST_PY/INTER_3_CYLINDRE.py create mode 100755 src/TEST_PY/Makefile.am create mode 100755 src/TEST_PY/TUYAU_COURBE.py create mode 100755 src/TEST_PY/Test_HEXABLOCK.py create mode 100644 src/TEST_PY/bielle.py create mode 100644 src/TEST_PY/bielle_variante.py create mode 100644 src/TEST_PY/bride.py create mode 100755 src/TEST_PY/crank.stp create mode 100644 src/TEST_PY/recettes/bielle.py create mode 100644 src/TEST_PY/recettes/bielle.stp create mode 100644 src/TEST_PY/recettes/cuve.brep create mode 100644 src/TEST_PY/recettes/cuve.py create mode 100644 src/TEST_PY/recettes/troisCylindres.brep create mode 100644 src/TEST_PY/recettes/troisCylindres.py create mode 100755 src/TEST_PY/recettes/tuyau.brep create mode 100644 src/TEST_PY/recettes/tuyau.py create mode 100644 src/TEST_PY/recettes/tuyauterie.brep create mode 100644 src/TEST_PY/recettes/tuyauterie.py create mode 100755 src/TEST_PY/tees.brep create mode 100755 src/TEST_PY/test_BIELLE_bad_assoc.py create mode 100755 src/TEST_PY/test_BIELLE_no_assoc.py create mode 100755 src/TEST_PY/test_HEXABLOCK.py create mode 100755 src/TEST_PY/test_INTER_3_CYLINDRE_no_assoc.py create mode 100755 src/TEST_PY/test_TUYAU_COURBE_no_assoc.py create mode 100755 src/TEST_PY/test_TUYAU_COURBE_weird_assoc.py create mode 100755 src/TEST_PY/test_distrib.py create mode 100644 src/TEST_PY/test_unit/asso_grid.py create mode 100644 src/TEST_PY/test_unit/bielle.py create mode 100644 src/TEST_PY/test_unit/hexa_quads.py create mode 100644 src/TEST_PY/test_unit/revolution.py create mode 100644 src/TEST_PY/test_unit/test_asso_lines.py create mode 100644 src/TEST_PY/test_unit/test_bugs.py create mode 100644 src/TEST_PY/test_unit/test_carre.py create mode 100644 src/TEST_PY/test_unit/test_cross.py create mode 100644 src/TEST_PY/test_unit/test_cuve.py create mode 100644 src/TEST_PY/test_unit/test_cylinders.py create mode 100644 src/TEST_PY/test_unit/test_disco.py create mode 100644 src/TEST_PY/test_unit/test_double_t.py create mode 100644 src/TEST_PY/test_unit/test_piquage.py create mode 100644 src/TEST_PY/test_unit/test_rind.py create mode 100644 src/TEST_PY/test_unit/test_sphere.py create mode 100644 src/TEST_PY/test_unit/test_transfo.py create mode 100755 src/TEST_PY/tuyau.brep diff --git a/AUTHORS b/AUTHORS new file mode 100755 index 0000000..e69de29 diff --git a/COPYING b/COPYING new file mode 100755 index 0000000..b1e3f5a --- /dev/null +++ b/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/ChangeLog b/ChangeLog new file mode 100755 index 0000000..e69de29 diff --git a/Doxyfile b/Doxyfile new file mode 100755 index 0000000..025a685 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,302 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Doxyfile 1.5.1-KDevelop + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = HEXA +PROJECT_NUMBER = [5.1.2] +OUTPUT_DIRECTORY = +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = /home/bphetsar/ +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +BUILTIN_STL_SUPPORT = NO +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = /export/home/bphetsar/PR_HEX/HEXA_SRC +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.C \ + *.CC \ + *.C++ \ + *.II \ + *.I++ \ + *.H \ + *.HH \ + *.H++ \ + *.CS \ + *.PHP \ + *.PHP3 \ + *.M \ + *.MM \ + *.PY \ + *.C \ + *.H \ + *.tlh \ + *.diff \ + *.patch \ + *.moc \ + *.xpm \ + *.dox +RECURSIVE = yes +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +REFERENCES_LINK_SOURCE = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = YES +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = yes +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = HEXA.tag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 1000 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/HEXABLOCK_version.h.in b/HEXABLOCK_version.h.in new file mode 100755 index 0000000..7b33574 --- /dev/null +++ b/HEXABLOCK_version.h.in @@ -0,0 +1,31 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#if !defined(__HEXABLOCK_VERSION_H__) +#define __HEXABLOCK_VERSION_H__ + +/* + HEXABLOCK_VERSION is (major << 16) + (minor << 8) + patch. +*/ + +#define HEXABLOCK_VERSION_STR "@VERSION@" +#define HEXABLOCK_VERSION @XVERSION@ +#define HEXABLOCK_DEVELOPMENT @VERSION_DEV@ + +#endif // __HEXABLOCK_VERSION_H__ diff --git a/INSTALL b/INSTALL new file mode 100755 index 0000000..4bf4d3a --- /dev/null +++ b/INSTALL @@ -0,0 +1 @@ +SALOME6 : HEXABLOCK module diff --git a/Makefile.am b/Makefile.am new file mode 100755 index 0000000..f5c062d --- /dev/null +++ b/Makefile.am @@ -0,0 +1,44 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +ACLOCAL_AMFLAGS = -I adm_local/unix/config_files \ + -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \ + -I ${GUI_ROOT_DIR}/adm_local/unix/config_files \ + -I ${GEOM_ROOT_DIR}/adm_local/unix/config_files + +SUBDIRS = idl adm_local src bin doc + +DIST_SUBDIRS= idl adm_local src bin doc + +DISTCLEANFILES = a.out aclocal.m4 configure + +salomeinclude_DATA = HEXABLOCK_version.h + +EXTRA_DIST += \ + build_configure \ + clean_configure \ + cppunit-report.xml + +dist-hook: + rm -rf `find $(distdir) -name CVS` + +unittest: + ( ./src/TEST_CPP/Test_HEXABLOCK ) diff --git a/NEWS b/NEWS new file mode 100755 index 0000000..e69de29 diff --git a/README b/README new file mode 100755 index 0000000..c884482 --- /dev/null +++ b/README @@ -0,0 +1 @@ +test again again diff --git a/adm_local/Makefile.am b/adm_local/Makefile.am new file mode 100755 index 0000000..59ef7d8 --- /dev/null +++ b/adm_local/Makefile.am @@ -0,0 +1,21 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +SUBDIRS = unix diff --git a/adm_local/unix/Makefile.am b/adm_local/unix/Makefile.am new file mode 100755 index 0000000..4179c8f --- /dev/null +++ b/adm_local/unix/Makefile.am @@ -0,0 +1,21 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +SUBDIRS = config_files diff --git a/adm_local/unix/config_files/Makefile.am b/adm_local/unix/config_files/Makefile.am new file mode 100755 index 0000000..74229f9 --- /dev/null +++ b/adm_local/unix/config_files/Makefile.am @@ -0,0 +1,23 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +dist_admlocalm4_DATA = \ + check_sphinx.m4 \ + check_HEXABLOCK.m4 diff --git a/adm_local/unix/config_files/check_HEXABLOCK.m4 b/adm_local/unix/config_files/check_HEXABLOCK.m4 new file mode 100755 index 0000000..a7c1bec --- /dev/null +++ b/adm_local/unix/config_files/check_HEXABLOCK.m4 @@ -0,0 +1,81 @@ +dnl Copyright (C) 2009-2012 CEA/DEN, EDF R&D +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +dnl +dnl See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +dnl +# Check availability of HEXABLOCK module binary distribution +# +# Author : Marc Tajchman (CEA, 2002) +#------------------------------------------------------------ + +AC_DEFUN([CHECK_HEXABLOCK],[ + +AC_CHECKING(for HEXABLOCK) + +HEXABLOCK_ok=no + +HEXABLOCK_LDFLAGS="" +HEXABLOCK_CXXFLAGS="" + +AC_ARG_WITH(hexablock, + --with-hexablock=DIR root directory path of HEXABLOCK installation, + HEXABLOCK_DIR="$withval",HEXABLOCK_DIR="") + +if test "x$HEXABLOCK_DIR" = "x" ; then + +# no --with-gui-dir option used + + if test "x$HEXABLOCK_ROOT_DIR" != "x" ; then + + # HEXABLOCK_ROOT_DIR environment variable defined + HEXABLOCK_DIR=$HEXABLOCK_ROOT_DIR + + else + + # search hexablock binaries in PATH variable + AC_PATH_PROG(TEMP, libHEXABLOCK.so) + if test "x$TEMP" != "x" ; then + HEXABLOCK_BIN_DIR=`dirname $TEMP` + HEXABLOCK_DIR=`dirname $HEXABLOCK_BIN_DIR` + fi + + fi +# +fi + +if test -f ${HEXABLOCK_DIR}/lib/salome/libHEXABLOCK.so ; then + HEXABLOCK_ok=yes + AC_MSG_RESULT(Using HEXABLOCK distribution in ${HEXABLOCK_DIR}) + + if test "x$HEXABLOCK_ROOT_DIR" == "x" ; then + HEXABLOCK_ROOT_DIR=${HEXABLOCK_DIR} + fi + AC_SUBST(HEXABLOCK_ROOT_DIR) + + HEXABLOCK_LDFLAGS=-L${HEXABLOCK_DIR}/lib${LIB_LOCATION_SUFFIX}/salome + HEXABLOCK_CXXFLAGS=-I${HEXABLOCK_DIR}/include/salome + + AC_SUBST(HEXABLOCK_LDFLAGS) + AC_SUBST(HEXABLOCK_CXXFLAGS) + +else + AC_MSG_WARN("Cannot find compiled HEXABLOCK distribution") +fi + +AC_MSG_RESULT(for HEXABLOCK: $HEXABLOCK_ok) + +])dnl + diff --git a/adm_local/unix/config_files/check_libxml.m4 b/adm_local/unix/config_files/check_libxml.m4 new file mode 100755 index 0000000..35a9c57 --- /dev/null +++ b/adm_local/unix/config_files/check_libxml.m4 @@ -0,0 +1,74 @@ +dnl Copyright (C) 2009-2012 CEA/DEN, EDF R&D +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +dnl +dnl See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +dnl + +AC_DEFUN([AC_CHECK_LIBXML],[ + +AC_CHECKING(for libxml) + +CPPFLAGS_old=$CPPFLAGS +CXXFLAGS_old=$CXXFLAGS + +# Custom location of libxml2 package can be specified +# thorugh LIBXML_DIR variable +if test "x$LIBXML_DIR" != "x" +then + CPPFLAGS="$CPPFLAGS -I$LIBXML_DIR/include/libxml2" + CXXFLAGS="$CXXFLAGS -I$LIBXML_DIR/include/libxml2" + if test "x$LIBXML_DIR" = "x/usr" + then + AC_MSG_NOTICE(Trying native Libxml2...) + TMPLIBS="-lxml2 $LIBS" + else + AC_MSG_NOTICE(Trying Libxml2 from $LIBXML_DIR ...) + TMPLIBS="-L$LIBXML_DIR/lib -lxml2 $LIBS" + fi + LIBXML_INCLUDES="-I$LIBXML_DIR/include/libxml2" +else + CPPFLAGS="$CPPFLAGS -I/usr/include/libxml2" + CXXFLAGS="$CXXFLAGS -I/usr/include/libxml2" + TMPLIBS="-lxml2 $LIBS" + LIBXML_INCLUDES="-I/usr/include/libxml2" +fi + +AC_CHECK_HEADER(libxml/parser.h,libxml_ok="yes",libxml_ok="no") + +if test "x$libxml_ok" = "xyes" +then + LIBS_old=$LIBS + LIBS=$TMPLIBS + AC_CHECK_LIB(xml2,xmlInitParser,libxml_ok="yes",libxml_ok="no",) + LIBS=$LIBS_old +fi + +if test "x$libxml_ok" = "xyes" +then + LIBXML_LIBS=$TMPLIBS +fi + +AC_MSG_RESULT(for libxml: $libxml_ok) + +CXXFLAGS=$CXXFLAGS_old +CPPFLAGS=$CPPFLAGS_old + +AC_SUBST(LIBXML_LIBS) +AC_SUBST(LIBXML_INCLUDES) + +])dnl +dnl + diff --git a/adm_local/unix/config_files/check_sphinx.m4 b/adm_local/unix/config_files/check_sphinx.m4 new file mode 100644 index 0000000..9964fda --- /dev/null +++ b/adm_local/unix/config_files/check_sphinx.m4 @@ -0,0 +1,55 @@ +dnl Copyright (C) 2009-2012 CEA/DEN, EDF R&D +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +dnl +dnl See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +dnl + +AC_DEFUN([CHECK_SPHINX],[ + +AC_CHECKING(for sphinx doc generator) + +sphinx_ok=yes +dnl where is sphinx ? +AC_PATH_PROG(SPHINX,sphinx-build) +if test "x$SPHINX" = "x" +then + AC_MSG_WARN(sphinx not found) + sphinx_ok=no +fi + +dnl Can I load ths sphinx module ? +dnl This code comes from the ax_python_module macro. +if test -z $PYTHON; +then + PYTHON="python" +fi +PYTHON_NAME=`basename $PYTHON` +AC_MSG_CHECKING($PYTHON_NAME module: sphinx) + $PYTHON -c "import sphinx" 2>/dev/null + if test $? -eq 0; + then + AC_MSG_RESULT(yes) + eval AS_TR_CPP(HAVE_PYMOD_sphinx)=yes + else + AC_MSG_RESULT(no) + eval AS_TR_CPP(HAVE_PYMOD_sphinx)=no + sphinx_ok=no + fi + +AM_CONDITIONAL(SPHINX_IS_OK, [test x"$sphinx_ok" = xyes]) + +])dnl +dnl diff --git a/adm_local/unix/config_files/i2_check_qt4.m4 b/adm_local/unix/config_files/i2_check_qt4.m4 new file mode 100755 index 0000000..81bcc06 --- /dev/null +++ b/adm_local/unix/config_files/i2_check_qt4.m4 @@ -0,0 +1,446 @@ +dnl Copyright (C) 2009-2012 CEA/DEN, EDF R&D +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +dnl +dnl See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +dnl + +dnl the following variables are exported: +dnl QT_MOC +dnl QT_UIC +dnl QT_DIR +dnl qt4_cppflags +dnl qt4_ldflags +dnl qt4_libs +dnl WITH_QT4 +dnl qt4 is searched in the following order +dnl path given with --with-qt4 options +dnl presence of QTDIR variable +dnl /usr +dnl when HAS_GUI is false (no salome gui) and nothing is said for qt4, qt4 is not checked +dnl usages +dnl ./configure --prefix=/home/prascle/partage/maquettes/install +dnl ./configure --prefix=/home/prascle/partage/maquettes/install --with-qt4 +dnl ./configure --prefix=/home/prascle/partage/maquettes/install --with-qt4=/opt/qt443 +dnl ./configure --prefix=/home/prascle/partage/maquettes/install --with-qt4-includes=/usr/include/qt4 +dnl ./configure --prefix=/home/prascle/partage/maquettes/install --with-qt4-includes=/usr/include/qt4 --with-qt4-libraries=/usr/lib -with-qt4-tools=/usr/bin +dnl ./configure --prefix=/home/prascle/partage/maquettes/install --without-qt4 +dnl +AC_DEFUN([I2_CHECK_QT4], +[ + AC_REQUIRE([AC_PROG_CXX]) + AC_REQUIRE([AC_PROG_CPP]) + + qt_ok=no + qt4_wanted=yes + WITH_QT4=0 + + # --- check if qt4 standard install directory is defined (with subdirectories bin lib include) + qt4_install_path="" + AC_ARG_WITH([qt4], + AC_HELP_STRING([--with-qt4@<:@=DIR@:>@], [where the Qt4 package with a standard install is: default @<:@$QTDIR@:>@ or @<:@/usr@:>@]), + [qt4_install_path=$withval], [withval=notset]) + + # --- if qt4 standard install directory is defined but with no path: QTDIR value if defined, or /usr + if test x${withval} = xyes + then + if test -z $QTDIR + then + qt4_install_path="/usr" + else + qt4_install_path=$QTDIR + fi + fi + + # --- if qt4 standard install directory is not defined + # if HAS_GUI= 0: Qt4 not wanted + # else: QTDIR value if defined, or /usr + if test x${withval} = xnotset + then + if test x${HAS_GUI} = x0 + then + qt4_wanted=no + AC_MSG_NOTICE([SALOME GUI not present, Qt4 not specified, skip detection]) + else + if test -z $QTDIR + then + qt4_install_path="/usr" + else + if test $QTDIR = /usr/lib/qt3 ; then + if test -d /usr/lib/qt4 ; then + AC_MSG_RESULT(it is strange for a qt4 installation !) + AC_MSG_RESULT(/usr/lib/qt4 is present) + AC_MSG_RESULT(replacing QTDIR by /usr/lib/qt4) + QTDIR=/usr/lib/qt4 + fi + fi + qt4_install_path=$QTDIR + fi + fi + fi + + # --- if qt4 standard install directory is not wanted: --without-qt4 or --with-qt4=no + if test x${withval} = xno + then + qt4_wanted=no + AC_MSG_NOTICE([Qt4 is not wanted, skip detection]) + fi + + QT_DIR=${qt4_install_path} + AC_SUBST(QT_DIR) + + # ---------------------------------------------------------------------- + # --- only when qt4 wanted (no explicit --without-qt4 nor --with-qt4=no) + + if test x${qt4_wanted} = xyes + then + + # --- check if qt4 includes directory is defined + qt4_include_path="" + AC_ARG_WITH([qt4-includes], + AC_HELP_STRING([--with-qt4-includes@<:@=DIR@:>@], [where the Qt4 includes are: default @<:@$QTDIR/include@:>@ or @<:@/usr/include@:>@]), + [qt4_include_path=$withval], [withval=no]) + if test x${withval} != xno + then + # --- qt4 includes directory is defined + if test x${qt4_include_path} = xyes + then + qt4_include_path="/usr/include" + fi + else + if test x${qt4_install_path} != x + then + qt4_include_path="${qt4_install_path}/include" + fi + fi + + + # --- check if qt4 libraries directory is defined + qt4_library_path="" + AC_ARG_WITH([qt4-libraries], + AC_HELP_STRING([--with-qt4-libraries@<:@=DIR@:>@], [where the Qt4 libraries are: default @<:@$QTDIR/lib@:>@ or @<:@/usr/lib@:>@]), + [qt4_library_path=$withval], [withval=no]) + if test x${withval} != xno + then + # --- qt4 libraries directory is defined + if test x${qt4_library_path} = xyes + then + qt4_library_path="/usr/lib" + fi + else + if test x${qt4_install_path} != x + then + qt4_library_path="${qt4_install_path}/lib" + fi + fi + + # --- check if qt4 tools directory is defined + qt4_tools_path="" + AC_ARG_WITH([qt4-tools], + AC_HELP_STRING([--with-qt4-tools@<:@=DIR@:>@], [where the Qt4 executable tools are: default @<:@$QTDIR/bin@:>@ or @<:@/usr/bin@:>@]), + [qt4_tools_path=$withval], [withval=no]) + if test x${withval} != xno + then + # --- qt4 tools directory is defined + if test x${qt4_tools_path} = xyes + then + qt4_tools_path="/usr/bin" + fi + else + if test x${qt4_install_path} != x + then + qt4_tools_path="${qt4_install_path}/bin" + fi + fi + + + # test if qt4 is completely defined + qt4_defined=yes + if test x${qt4_include_path} = x + then + qt4_defined=no + AC_MSG_NOTICE([No Qt4 include path defined]) + else + AC_MSG_NOTICE([Qt4 include path is ${qt4_include_path}]) + fi + if test x${qt4_library_path} = x + then + qt4_defined=no + AC_MSG_NOTICE([No Qt4 library path defined]) + else + AC_MSG_NOTICE([Qt4 library path is ${qt4_library_path}]) + fi + if test x${qt4_tools_path} = x + then + qt4_defined=no + AC_MSG_NOTICE([No Qt4 tools path defined]) + else + AC_MSG_NOTICE([Qt4 tools path is ${qt4_tools_path}]) + fi + + # saving values for compilation variables + saved_CPPFLAGS=$CPPFLAGS + saved_LDFLAGS=$LDFLAGS + saved_LIBS=$LIBS + + if ! test x${qt4_defined} = xno + then + # ask for qt4 support + AC_MSG_NOTICE([checking whether qt4 tools and headers are present]) + + # --- we test the presence of moc,first under the form moc-qt4, then moc + AC_PATH_PROGS(qt4_moc_found, [moc-qt4 moc], no, ${qt4_tools_path}) + test x${qt4_moc_found} = xno && AC_MSG_ERROR([Qt4 moc command NOT FOUND]) + QT_MOC=$qt4_moc_found + AC_SUBST(QT_MOC) + + # --- we test the presence of uic,first under the form uic-qt4, then uic + AC_PATH_PROGS(qt4_uic_found, [uic-qt4 uic], no, ${qt4_tools_path}) + test x${qt4_uic_found} = xno && AC_MSG_ERROR([Qt4 uic command NOT FOUND]) + QT_UIC=$qt4_uic_found + AC_SUBST(QT_UIC) + + # --- we test the presence of rcc,first under the form rcc-qt4, then rcc + AC_PATH_PROGS(qt4_rcc_found, [rcc-qt4 rcc], no, ${qt4_tools_path}) + test x${qt4_rcc_found} = xno && AC_MSG_ERROR([Qt4 rcc command NOT FOUND]) + QT_RCC=$qt4_rcc_found + AC_SUBST(QT_RCC) + + # --- we test the header file presence and usability + QTINC="" + AC_CHECK_FILE($qt4_include_path/qt4/QtCore/qglobal.h,QTINC="/qt4",QTINC="") + qt4_include_path="$qt4_include_path${QTINC}" + qt4_cppflags="" + qt4_cppflags="${qt4_cppflags} -I$qt4_include_path/QtCore" + qt4_cppflags="${qt4_cppflags} -I$qt4_include_path/QtGui" + qt4_cppflags="${qt4_cppflags} -I$qt4_include_path/Qt" + qt4_cppflags="${qt4_cppflags} -I$qt4_include_path" + CPPFLAGS="${CPPFLAGS} ${qt4_cppflags}" + AC_LANG_PUSH(C++) + AC_CHECK_HEADERS([qapplication.h], + [qt4_header_found=yes], + [qt4_header_found=no], + []) + AC_LANG_POP(C++) + test x${qt4_header_found} = xno && AC_MSG_ERROR([Qt4 include file NOT FOUND]) + AC_SUBST(qt4_cppflags) + + # --- we test the library file presence and usability + if test x${qt4_library_path} = x/usr/lib + then + qt4_ldflags="" + else + qt4_ldflags="-L$qt4_library_path" + fi + + AC_MSG_NOTICE([checking whether link with qt4 is working]) + qt4_libs="-lQtCore -lQtGui" + LDFLAGS="${LDFLAGS} ${qt4_ldflags}" + LIBS="${LIBS} ${qt4_libs}" + AC_LANG_PUSH(C++) + + AC_LINK_IFELSE([AC_LANG_PROGRAM( + [[ #include + #include ]], + [[ QApplication app(0, 0); + QPushButton hello("Hello world!"); + hello.resize(100, 30); + hello.show(); ]] )], + [qt4_lib_found=yes], [qt4_lib_found=no] ) + + test x${qt4_lib_found} = xno && AC_MSG_ERROR([Qt4 library NOT FOUND]) + + AC_LANG_POP(C++) + AC_SUBST(qt4_ldflags) + AC_SUBST(qt4_libs) + + # --- after all tests are successful, we support Qt4 + WITH_QT4=1 + qt_ok=yes + AC_MSG_NOTICE([Qt4 support is OK]) + + else + # --- no Qt4 support + AC_MSG_NOTICE([No Qt4 support]) + fi + + # restoring saved values + CPPFLAGS=$saved_CPPFLAGS + LDFLAGS=$saved_LDFLAGS + LIBS=$saved_LIBS + + fi + # --- end: only when qt4 wanted (no explicit --without-qt4 nor --with-qt4=no) + # ---------------------------------------------------------------------- + + # Propagate test into atlocal + AC_SUBST(WITH_QT4) + + # Propagate test into Makefiles... + AM_CONDITIONAL(WITH_QT4, test $WITH_QT4 = 1) + + # ... and into source files + AC_DEFINE_UNQUOTED(HAS_QT4, $WITH_QT4, [Qt4 library]) + +]) + + +AC_DEFUN([I2_CHECK_QSCINTILLA], +[ + AC_REQUIRE([I2_CHECK_QT4]) + qscintilla_ok=no + WITH_QSCI4=0 + + # ---------------------------------------------------------------------- + # --- check qscintilla only when qt4 OK + + if test x${WITH_QT4} = x1 + then + + # --- check if qsci4 includes directory is defined + qsci4_include_path="" + qsci4_cppflags="" + + AC_ARG_WITH([qsci4-includes], + AC_HELP_STRING([--with-qsci4-includes@<:@=DIR@:>@], [where the Qsci4 includes are: default @<:@$QTDIR/include/Qsci@:>@ or @<:@/usr/include/Qsci@:>@]), + [qsci4_include_path=$withval]) + + if test x${qsci4_include_path} = x ; then + # --- "" --- try to use QSCINTILLA_DIR/include/Qsci + if test "x${QSCINTILLA_DIR}" != "x" ; then + qsci4_include_path="${QSCINTILLA_DIR}/include" + else + qsci4_include_path=no + fi + fi + + if test x${qsci4_include_path} = xno ; then + # --- "no" --- no native installation, try to find in Qt + qsci4_include_path="${QT_DIR}/include${QTINC}/Qsci" + qsci4_cppflags=" -I$qsci4_include_path" + # " -I${QT_DIR}/include${QTINC}" is included in qt4_cppflags + else + if test x${qsci4_include_path} = xyes ; then + # --- "yes" --- try to find in /usr/include/Qsci + qsci4_include_path="/usr/include${QTINC}/Qsci" + qsci4_cppflags=" -I$qsci4_include_path" + # " -I/usr/include${QTINC}" is included in qt4_cppflags or by default (if QTINC is empty) + else + # --- "other" --- try to find in given dir + qsci4_cppflags=" -I$qsci4_include_path/Qsci -I$qsci4_include_path" + fi + fi + + AC_MSG_NOTICE($qsci4_cppflags) + + # --- check if qsci4 libraries directory is defined + qsci4_library_path="" + + AC_ARG_WITH([qsci4-libraries], + AC_HELP_STRING([--with-qsci4-libraries@<:@=DIR@:>@], [where the Qsci4 libraries are: default @<:@$QTDIR/lib@:>@ or @<:@/usr/lib@:>@]), + [qsci4_library_path=$withval]) + + if test x${qsci4_library_path} = x ; then + # --- "" --- try to use QSCINTILLA_DIR/lib + if test "x${QSCINTILLA_DIR}" != "x" ; then + qsci4_library_path="${QSCINTILLA_DIR}/lib" + else + qsci4_library_path=no + fi + fi + + if test x${qsci4_library_path} = xno ; then + # --- "no" --- no native installation, try to find in Qt + qsci4_library_path="${QT_DIR}/lib" + else + if test x${qsci4_library_path} = xyes ; then + # --- "yes" --- try to find in /usr/lib + qsci4_library_path="/usr/lib" + fi + fi + + AC_MSG_NOTICE($qsci4_library_path) + + # saving values for compilation variables + saved_CPPFLAGS=$CPPFLAGS + saved_LDFLAGS=$LDFLAGS + saved_LIBS=$LIBS + + # ask for qsci4 support + AC_MSG_NOTICE([checking whether qscintilla for qt4 headers are present]) + + # --- we test the header file presence and usability + CPPFLAGS="${CPPFLAGS} ${qsci4_cppflags} ${qt4_cppflags}" + AC_LANG_PUSH(C++) + AC_CHECK_HEADERS([qsciscintilla.h], + [qsci4_header_found=yes], + [qsci4_header_found=no], + []) + AC_LANG_POP(C++) + if test x${qsci4_header_found} = xyes + then + AC_SUBST(qsci4_cppflags) + + # --- we test the library file presence and usability + if test x${qsci4_library_path} = x/usr/lib/qt4/lib + then + qsci4_library_path=/usr/lib + fi + if test x${qsci4_library_path} = x/usr/lib + then + qsci4_ldflags="" + else + qsci4_ldflags="-L$qsci4_library_path" + fi + + AC_MSG_NOTICE([checking whether qscintilla2 library is present]) + qsci4_libs=-lqscintilla2 + AC_CHECK_FILE([${qsci4_library_path}/libqscintilla2.so], + [qsci4_library_found=yes], + [qsci4_library_found=no]) + if test x${qsci4_library_found} = xyes + then + AC_MSG_NOTICE([qscintilla for qt4 support]) + AC_SUBST(qsci4_ldflags) + AC_SUBST(qsci4_libs) + WITH_QSCI4=1 + qscintilla_ok=yes + fi + + else + AC_MSG_NOTICE([no support for qscintilla for qt4]) + fi + + # restoring saved values + CPPFLAGS=$saved_CPPFLAGS + LDFLAGS=$saved_LDFLAGS + LIBS=$saved_LIBS + + else + # --- end: check qscintilla only when qt4 OK + # ---------------------------------------------------------------------- + AC_MSG_NOTICE([qscintilla for qt4 not checked because Qt4 not wanted or not detected]) + fi + + # Propagate test into atlocal + AC_SUBST(WITH_QSCI4) + + # Propagate test into Makefiles... + AM_CONDITIONAL(WITH_QSCI4, test $WITH_QSCI4 = 1) + + # ... and into source files + AC_DEFINE_UNQUOTED(HAS_QSCI4, $WITH_QSCI4, [QsciScintilla library]) + +]) diff --git a/adm_local/unix/make_common_starter.am b/adm_local/unix/make_common_starter.am new file mode 100755 index 0000000..c961ae7 --- /dev/null +++ b/adm_local/unix/make_common_starter.am @@ -0,0 +1,87 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# ============================================================ +# This file defines the common definitions used in several +# Makefile. This file must be included, if needed, by the file +# Makefile.am. +# ============================================================ + +# Standard directory for installation +# +salomeincludedir = $(includedir)/salome +libdir = $(prefix)/lib@LIB_LOCATION_SUFFIX@/salome +bindir = $(prefix)/bin/salome +salomescriptdir = $(bindir) +salomepythondir = $(pythondir)/salome +salomepyexecdir = $(pyexecdir)/salome + +# Directory for installing idl files +salomeidldir = $(prefix)/idl/salome + +# Directory for installing resource files +salomeresdir = $(prefix)/share/salome/resources/@MODULE_NAME@ + +# Directories for installing admin files +admlocaldir = $(prefix)/adm_local +admlocalunixdir = $(admlocaldir)/unix +admlocalm4dir = $(admlocaldir)/unix/config_files + +# Shared modules installation directory +sharedpkgpythondir = $(salomepythondir)/shared_modules + +# Documentation directory +docdir = $(datadir)/doc/salome + +# common rules + +# meta object implementation files generation (moc) +%_moc.cxx: %.hxx + $(MOC) $< -o $@ + +# translation (*.qm) files generation (lrelease) +%.qm: resources/%.ts + $(LRELEASE) $< -qm $@ + +# resource files generation (qrcc) +qrc_%.cxx: %.qrc + $(QRCC) $< -o $@ -name $(*F) + +# qt forms files generation (uic) +ui_%.h: %.ui + $(UIC) -o $@ $< + +# extra distributed files +EXTRA_DIST = $(MOC_FILES:%_moc.cxx=%.hxx) $(QRC_FILES:qrc_%.cxx=%.qrc) \ + $(UIC_FILES:ui_%.h=%.ui) $(nodist_salomeres_DATA:%.qm=resources/%.ts) + +# customize clean operation +mostlyclean-local: + rm -f @builddir@/*_moc.cxx + rm -f @builddir@/*.qm + rm -f @builddir@/ui_*.h + rm -f @builddir@/qrc_*.cxx + +# tests +tests: unittest + +unittest: $(UNIT_TEST_PROG) + @if test "x$(UNIT_TEST_PROG)" != "x"; then \ + $(UNIT_TEST_PROG); \ + fi; diff --git a/bin/Makefile.am b/bin/Makefile.am new file mode 100755 index 0000000..24139cd --- /dev/null +++ b/bin/Makefile.am @@ -0,0 +1,29 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +dist_salomescript_SCRIPTS = \ + myrunSalome.py + +nodist_salomescript_SCRIPTS = \ + runAppli + +nodist_salomescript_DATA = \ + VERSION diff --git a/bin/VERSION.in b/bin/VERSION.in new file mode 100755 index 0000000..2fb4f7b --- /dev/null +++ b/bin/VERSION.in @@ -0,0 +1,2 @@ +[SALOME HEXABLOCK] : @VERSION@ +[DEVELOPMENT] : @VERSION_DEV@ diff --git a/bin/myrunSalome.py b/bin/myrunSalome.py new file mode 100755 index 0000000..ce9b511 --- /dev/null +++ b/bin/myrunSalome.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +def test(clt): + """ + Test function that creates an instance of HEXABLOCK component + usage : hexablock = test(clt) + """ + # create an LifeCycleCORBA instance + import LifeCycleCORBA + lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb) + import HEXABLOCK_ORB + hexablock = lcc.FindOrLoadComponent("FactoryServer", "HEXABLOCK") + return hexablock + +# + +if __name__ == "__main__": + import user + from runSalome import * + clt,args = main() + + # + # Impression arborescence Naming Service + # + + if clt != None: + print + print " --- registered objects tree in Naming Service ---" + clt.showNS() + session=clt.waitNS("/Kernel/Session") + catalog=clt.waitNS("/Kernel/ModulCatalog") + import socket + container = clt.waitNS("/Containers/" + socket.gethostname().split('.')[0] + "/FactoryServer") diff --git a/bin/runAppli.in b/bin/runAppli.in new file mode 100755 index 0000000..dfc80a5 --- /dev/null +++ b/bin/runAppli.in @@ -0,0 +1,62 @@ +#!/bin/sh +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +if [ -z "${KERNEL_ROOT_DIR}" ] ; then +export KERNEL_ROOT_DIR=@KERNEL_ROOT_DIR@ +fi +if [ -z "${HEXA_ROOT_DIR}" ] ; then +export HEXA_ROOT_DIR=@prefix@ +fi + +searchFreePort() { + echo -n "Searching for a free port for naming service: " + export NSPORT=2810 + local limit=$NSPORT + let limit=limit+100 + while [ 1 ] + do + aRes=`netstat -ltn | grep -E :${NSPORT}` + if [ -z "$aRes" ]; then + echo ${NSPORT} - Ok + local myhost=`hostname` + export OMNIORB_CONFIG=${HOME}/.omniORB_${myhost}_${NSPORT}.cfg + local initref="NameService=corbaname::"`hostname`":$NSPORT" + if [[ `python -c "import CORBA; print CORBA.ORB_ID"` = "omniORB4" ]]; then + echo "InitRef = $initref" > $OMNIORB_CONFIG + else + echo "ORBInitRef $initref" > $OMNIORB_CONFIG + fi + break + fi + echo -n "${NSPORT} " + if [[ $NSPORT -eq $limit ]] ; then + echo + echo "Can't find a free port to launch omniNames" + echo "Try to kill the running servers and then launch SALOME again." + exit + fi + let NSPORT=NSPORT+1 + done +} + +searchFreePort + + +${KERNEL_ROOT_DIR}/bin/salome/envSalome.py python -i $HEXA_ROOT_DIR/bin/salome/myrunSalome.py --modules=HEXA --killall diff --git a/build_configure b/build_configure new file mode 100755 index 0000000..966ed73 --- /dev/null +++ b/build_configure @@ -0,0 +1,128 @@ +#!/bin/bash +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +ORIG_DIR=`pwd` +CONF_DIR=`echo $0 | sed -e "s,[^/]*$,,;s,/$,,;s,^$,.,"` + +######################################################################## +# Test if the KERNEL_ROOT_DIR is set correctly + +if test ! -d "${KERNEL_ROOT_DIR}"; then + echo "failed : KERNEL_ROOT_DIR variable is not correct !" + exit +fi + + +######################################################################## +# Test if the GUI_ROOT_DIR is set correctly + +if test ! -d "${GUI_ROOT_DIR}"; then + echo "failed : GUI_ROOT_DIR variable is not correct !" + exit +fi + + +######################################################################## +# Test if the GEOM_ROOT_DIR is set correctly +if test ! -d "${GEOM_ROOT_DIR}"; then + echo "failed : GEOM_ROOT_DIR variable is not correct !" + exit +fi + +cd ${CONF_DIR} +ABS_CONF_DIR=`pwd` + +mkdir -p salome_adm/unix/config_files +#cp -f ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files/* salome_adm/unix/config_files +#cp -f ${KERNEL_ROOT_DIR}/salome_adm/unix/pythonbe.py salome_adm/unix + +cp -f ${KERNEL_ROOT_DIR}/salome_adm/unix/SALOMEconfig.h.in salome_adm/unix + +#cp -f ${GUI_ROOT_DIR}/adm_local/unix/config_files/* salome_adm/unix/config_files + +# remove KERNEL deprecated configure files +#for deprecated in ac_cc_warnings.m4 ac_cxx_partial_specialization.m4 \ +# check_mico.m4 config.guess ltmain.sh ac_cxx_bool.m4 ltconfig ac_cxx_typename.m4 \ +# check_pthreads.m4 config.sub libtool.m4 ac_cxx_mutable.m4 missing +# do +# rm -f salome_adm/unix/config_files/${deprecated} +# done + + +# ____________________________________________________________________ +# aclocal creates the aclocal.m4 file from the standard macro and the +# custom macro embedded in the directory salome_adm/unix/config_files +# and KERNEL config_files directory. +# output: +# aclocal.m4 +# autom4te.cache (directory) +echo "====================================================== aclocal" + + +if test -d "${GUI_ROOT_DIR}"; then + aclocal -I adm_local/unix/config_files \ + -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \ + -I ${GEOM_ROOT_DIR}/adm_local/unix/config_files \ + -I ${GUI_ROOT_DIR}/adm_local/unix/config_files || exit 1 +else + aclocal -I adm_local/unix/config_files \ + -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \ + -I ${GEOM_ROOT_DIR}/adm_local/unix/config_files || exit 1 +fi + + +# ____________________________________________________________________ +# libtoolize creates some configuration files (ltmain.sh, +# config.guess and config.sub). It only depends on the libtool +# version. The files are created in the directory specified with the +# AC_CONFIG_AUX_DIR() tag (see configure.ac). +# output: +# salome_adm/unix/config_files/config.guess +# salome_adm/unix/config_files/config.sub +# salome_adm/unix/config_files/ltmain.sh +#echo "====================================================== libtoolize" + +libtoolize --force --copy --automake || exit 1 + +# ____________________________________________________________________ +# autoconf creates the configure script from the file configure.ac (or +# configure.in if configure.ac doesn't exist) +# output: +# configure +echo "====================================================== autoconf" + +autoconf + +# ____________________________________________________________________ +# automake creates some scripts used in building process +# (install-sh, missing, ...). It only depends on the automake +# version. The files are created in the directory specified with the +# AC_CONFIG_AUX_DIR() tag (see configure.ac). This step also +# creates the Makefile.in files from the Makefile.am files. +# output: +# salome_adm/unix/config_files/compile +# salome_adm/unix/config_files/depcomp +# salome_adm/unix/config_files/install-sh +# salome_adm/unix/config_files/missing +# salome_adm/unix/config_files/py-compile +# Makefile.in (from Makefile.am) +echo "====================================================== automake" + +automake --copy --gnu --add-missing diff --git a/clean_configure b/clean_configure new file mode 100755 index 0000000..a5d9070 --- /dev/null +++ b/clean_configure @@ -0,0 +1,25 @@ +#!/bin/sh +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +rm -rf autom4te.cache aclocal.m4 configure make_config +find . -name "*~" -print -exec rm {} \; +find . -name "*.pyc" -print -exec rm {} \; +find . -name Makefile.in | xargs rm -f +( cd adm_local/unix/config_files && rm -f config.* depcomp install-sh l*.m4 ltmain.sh missing py-compile ) diff --git a/configure.ac b/configure.ac new file mode 100755 index 0000000..e29be5b --- /dev/null +++ b/configure.ac @@ -0,0 +1,364 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +AC_INIT([Salome6 Project HEXABLOCK module],[6.5.0], [webmaster.salome@opencascade.com], [SalomeHEXABLOCK]) +AC_CONFIG_AUX_DIR(adm_local/unix/config_files) +AC_CANONICAL_HOST +AC_CANONICAL_TARGET +AM_INIT_AUTOMAKE([-Wno-portability]) + +SHORT_VERSION=`echo $VERSION | awk -F. '{printf("%d.%d",$1,$2)}'` +AC_SUBST(SHORT_VERSION) +XVERSION=`echo $VERSION | awk -F. '{printf("0x%02x%02x%02x",$1,$2,$3)}'` +AC_SUBST(XVERSION) +VERSION_DEV=0 +AC_SUBST(VERSION_DEV) + +# set up MODULE_NAME variable for dynamic construction of directories (resources, etc.) +MODULE_NAME=hexablock +AC_SUBST(MODULE_NAME) + +dnl +dnl Initialize source and build root directories +dnl + +ROOT_BUILDDIR=`pwd` +ROOT_SRCDIR=`echo $0 | sed -e "s,[[^/]]*$,,;s,/$,,;s,^$,.,"` +cd $ROOT_SRCDIR +ROOT_SRCDIR=`pwd` +cd $ROOT_BUILDDIR + +AC_SUBST(ROOT_SRCDIR) +AC_SUBST(ROOT_BUILDDIR) + +echo +echo Source root directory : $ROOT_SRCDIR +echo Build root directory : $ROOT_BUILDDIR +echo +echo + +AC_CHECK_PROG(SHELL,sh) +AC_SUBST(SHELL) + +if test -z "$AR"; then + AC_CHECK_PROGS(AR,ar xar,:,$PATH) +fi +AC_SUBST(AR) + +dnl Export the AR macro so that it will be placed in the libtool file +dnl correctly. +export AR + +echo +echo --------------------------------------------- +echo testing make +echo --------------------------------------------- +echo + +AC_PROG_MAKE_SET +AC_PROG_INSTALL +dnl +dnl libtool macro check for CC, LD, NM, LN_S, RANLIB, STRIP + for shared libraries + +AC_ENABLE_DEBUG(yes) +AC_DISABLE_PRODUCTION + +echo --------------------------------------------- +echo testing libtool +echo --------------------------------------------- + +dnl first, we set static to no! +dnl if we want it, use --enable-static +AC_ENABLE_STATIC(no) + +AC_LIBTOOL_DLOPEN +AC_PROG_LIBTOOL + +dnl Fix up the INSTALL macro if it s a relative path. We want the +dnl full-path to the binary instead. +case "$INSTALL" in + *install-sh*) + INSTALL='\${KERNEL_ROOT_DIR}'/salome_adm/unix/config_files/install-sh + ;; +esac + +echo +echo --------------------------------------------- +echo testing C/C++ +echo --------------------------------------------- +echo + +cc_ok=no +dnl inutil car libtool +dnl AC_PROG_CC +AC_PROG_CXX +AC_CXX_WARNINGS +AC_CXX_TEMPLATE_OPTIONS +AC_DEPEND_FLAG +# AC_CC_WARNINGS([ansi]) +cc_ok=yes + +dnl Library libdl : +AC_CHECK_LIB(dl,dlopen) + +dnl Library librt : for alpha/osf +AC_CHECK_LIB(rt,nanosleep) + +dnl add library libm : +AC_CHECK_LIB(m,ceil) + +AC_CXX_USE_STD_IOSTREAM +AC_CXX_HAVE_SSTREAM + +dnl +dnl --------------------------------------------- +dnl testing linker +dnl --------------------------------------------- +dnl + +AC_LINKER_OPTIONS + +echo +echo --------------------------------------------- +echo testing threads +echo --------------------------------------------- +echo + +ENABLE_PTHREADS + +echo +echo --------------------------------------------- +echo testing python +echo --------------------------------------------- +echo + +CHECK_PYTHON + +AM_PATH_PYTHON(2.3) + +echo +echo --------------------------------------------- +echo testing QT +echo --------------------------------------------- +echo + +CHECK_QT + + + + + + + +echo +echo --------------------------------------------- +echo BOOST Library +echo --------------------------------------------- +echo + +CHECK_BOOST + +echo +echo --------------------------------------------- +echo Testing OpenCascade +echo --------------------------------------------- +echo + +CHECK_CAS + +echo +echo --------------------------------------------- +echo testing omniORB +echo --------------------------------------------- +echo + +CHECK_OMNIORB + +echo +echo --------------------------------------------- +echo default ORB : omniORB +echo --------------------------------------------- +echo + +DEFAULT_ORB=omniORB +CHECK_CORBA + +AC_SUBST_FILE(CORBA) +corba=make_$ORB +CORBA=adm_local/unix/$corba + + + +echo +echo ---------------------------------------------- +echo testing CPPUNIT only required for unit testing +echo ---------------------------------------------- +echo +CHECK_CPPUNIT + + + +echo +echo ---------------------------------------------- +echo testing Sphinx +echo ---------------------------------------------- +echo + +CHECK_SPHINX + + + +echo +echo --------------------------------------------- +echo Testing Kernel +echo --------------------------------------------- +echo + +CHECK_KERNEL + + + +echo +echo --------------------------------------------- +echo Testing GUI +echo --------------------------------------------- +echo + +CHECK_SALOME_GUI + + + +echo +echo --------------------------------------------- +echo Testing Geom +echo --------------------------------------------- +echo + +CHECK_GEOM + + +echo +echo --------------------------------------------- +echo Testing full GUI +echo --------------------------------------------- +echo + +CHECK_CORBA_IN_GUI +if test "x${CORBA_IN_GUI}" != "xyes"; then + echo "failed : For configure HEXABLOCK module necessary full GUI !" + exit +fi + + + + +echo +echo --------------------------------------------- +echo Testing LIBXML +echo --------------------------------------------- +echo +AC_CHECK_LIBXML + + +echo +echo --------------------------------------------- +echo Testing QT4 +echo --------------------------------------------- +echo +I2_CHECK_QT4 + + + +echo +echo --------------------------------------------- +echo testing VTK +echo --------------------------------------------- +echo +CHECK_VTK + + +echo +echo --------------------------------------------- +echo Summary +echo --------------------------------------------- +echo + +echo Configure +variables="cc_ok threads_ok boost_ok python_ok omniORB_ok qt_ok occ_ok sphinx_ok vtk_ok Kernel_ok SalomeGUI_ok Geom_ok" + +for var in $variables +do + printf " %10s : " `echo \$var | sed -e "s,_ok,,"` + eval echo \$$var +done + +echo +echo "Default ORB : $DEFAULT_ORB" +echo + +dnl AM_CONDITIONAL(ENABLE_VTKVIEWER, [test "$DISABLE_VTKVIEWER" = no]) +dnl We don t need to say when we re entering directories if we re using +dnl GNU make becuase make does it for us. +if test "X$GMAKE" = "Xyes"; then + AC_SUBST(SETX) SETX=":" +else + AC_SUBST(SETX) SETX="set -x" +fi +echo +echo --------------------------------------------- +echo generating Makefiles and configure files +echo --------------------------------------------- +echo + +AC_OUTPUT_COMMANDS([ \ + chmod +x ./bin/*; \ +]) + + + +AM_CONDITIONAL(WINDOWS, [ test ]) + +# This list is initiated using autoscan and must be updated manually +# when adding a new file .in to manage. When you execute +# autoscan, the Makefile list is generated in the output file configure.scan. +# +# This could be helpfull to update de configuration. +AC_OUTPUT([ \ + salome_adm/unix/SALOMEconfig.h \ + adm_local/Makefile \ + adm_local/unix/Makefile \ + adm_local/unix/config_files/Makefile \ + bin/VERSION \ + bin/runAppli \ + bin/Makefile \ + doc/Makefile \ + doc/conf.py \ + HEXABLOCK_version.h \ + src/Makefile \ + src/HEXABLOCKGUI/Makefile \ + src/HEXABLOCKGUI/MyDlgRef/Makefile \ + src/HEXABLOCKGUI/resources/HEXABLOCKCatalog.xml \ + src/HEXABLOCKGUI/resources/SalomeApp.xml \ + src/HEXABLOCK/Makefile \ + src/HEXABLOCK_I/Makefile \ + src/TEST_CPP/Makefile \ + src/TEST_PY/Makefile \ + idl/Makefile \ + Makefile \ +]) diff --git a/cppunit-report.xml b/cppunit-report.xml new file mode 100755 index 0000000..3f7a255 --- /dev/null +++ b/cppunit-report.xml @@ -0,0 +1,24 @@ + + + + + + VertexTest::TestGetX + + + VertexTest::TestGetY + + + VertexTest::TestGetZ + + + EdgeTest::TestGetVertex + + + + 4 + 0 + 0 + 0 + + diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100755 index 0000000..1510520 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,195 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +# Makefile.am for Sphinx documentation of HEXABLOCK component +# Author: Marine Marcilhac From CS + +.PHONY : latex + +if SPHINX_IS_OK + +hexablockdoc_DATA=html/index.html + +html/index.html:$(RSTFILES) + make htm + +endif + +dev_docs: build_dev_docs install_dev_docs + +build_dev_docs: + doxygen + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " changes to make an overview over all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + +DOXFILES= + +EXTRA_DIST+= $(DOXFILES) + +hexablockdocdir=$(docdir)/gui/HEXABLOCK +hexablockdevdocdir=$(docdir)/gui/HEXABLOCK/dev + +SPHINXOPTS = +SOURCEDIR = $(srcdir) +SPHINXBUILD = sphinx-build +PAPEROPT_a4 = -D latex_paper_size=a4 +ALLSPHINXOPTS = -d doctrees $(PAPEROPT_a4) $(SPHINXOPTS) $(SOURCEDIR) + +htm: + mkdir -p html doctrees + $(SPHINXBUILD) -c $(top_builddir)/doc -b html $(ALLSPHINXOPTS) html + @echo + @echo "Build finished. The HTML pages are in html." + +latex: + mkdir -p latex doctrees + $(SPHINXBUILD) -c $(top_builddir)/doc -b latex $(ALLSPHINXOPTS) latex + @echo + @echo "Build finished; the LaTeX files are in latex." + @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ + "run these through (pdf)latex." + +pdf: + $(SPHINXBUILD) -c $(top_builddir)/doc -b pdf $(ALLSPHINXOPTS) pdf + @echo + @echo "Build finished. The pdf documents are in pdf." + +html: + mkdir -p $@ + +htmldev: + mkdir -p $@ + +RSTFILES= \ + annexe.rst \ + block_method.rst \ + cad.rst \ + creategrids.rst \ + full_example_bridle.rst \ + general.rst \ + gui.rst \ + gui_asso_quad_to_geom.rst \ + gui_blocks_for_cyl_pipe.rst \ + gui_component.rst \ + gui_cut_hexa.rst \ + gui_cyl.rst \ + gui_disc_elmts.rst \ + gui_discret_law.rst \ + gui_document.rst \ + gui_edge.rst \ + gui_elements.rst \ + gui_groups.rst \ + gui_hexahedron.rst \ + gui_make_elmts.rst \ + gui_make_symmetry.rst \ + gui_merge_elmts.rst \ + gui_mesh.rst \ + gui_modify_elmts.rst \ + gui_modify_symmetry.rst \ + gui_pipe.rst \ + gui_prism_join_quad.rst \ + gui_propag.rst \ + gui_quadrangle.rst \ + gui_quad_revolution.rst \ + gui_remove.rst \ + gui_replace_hexa.rst \ + gui_hemisphere.rst \ + gui_vector.rst \ + gui_vertex.rst \ + index.rst \ + interactive.rst \ + intro_association.rst \ + intro_groups.rst \ + intro_mesh.rst \ + intro_python.rst \ + mesh.rst \ + python.rst \ + tui.rst \ + tui_asso_quad_to_geom.rst \ + tui_blocks_for_cyl_pipe.rst \ + tui_cartgrid.rst \ + tui_component.rst \ + tui_cut_hexa.rst \ + tui_cylgrid.rst \ + tui_cyl.rst \ + tui_disc_elmts.rst \ + tui_discret_law.rst \ + tui_document.rst \ + tui_edge.rst \ + tui_elements.rst \ + tui_groups.rst \ + tui_hexahedron.rst \ + tui_make_elmts.rst \ + tui_merge_elmts.rst \ + tui_mesh.rst \ + tui_modify_elmts.rst \ + tui_pipe.rst \ + tui_prism_join_quad.rst \ + tui_propag.rst \ + tui_quadrangle.rst \ + tui_remove.rst \ + tui_sphergrid.rst \ + tui_vector.rst \ + tui_vertex.rst + + + + + + + +EXTRA_DIST+= $(RSTFILES) _static cas_test_python + +install-data-local: + $(INSTALL) -d $(DESTDIR)$(hexablockdocdir) + if test -d "html"; then b=; else b="$(srcdir)/"; fi; \ + cp -rf $$b"html"/* $(DESTDIR)$(hexablockdocdir) ; \ + if test -f $$b"latex"/using.pdf; then cp -f $$b"latex"/using.pdf $(DESTDIR)$(hexablockdocdir) ; fi; \ + if test -f $$b"latex"/integration.pdf; then cp -f $$b"latex"/integration.pdf $(DESTDIR)$(hexablockdocdir) ; fi; + +install_dev_docs: + $(INSTALL) -d $(DESTDIR)$(hexablockdevdocdir) + if test -d "htmldev"; then b=; else b="$(srcdir)/"; fi; \ + find $$b"htmldev" -name "*.*" -exec cp -rf {} $(DESTDIR)$(hexablockdevdocdir) ';' ; \ + cp -rf $(top_srcdir)/src/hexablockloader/samples $(DESTDIR)$(hexablockdevdocdir); \ + rm -rf $(DESTDIR)$(hexablockdevdocdir)/samples/CVS; + +uninstall-local: + chmod -R +w $(DESTDIR)$(hexablockdocdir) + rm -rf $(DESTDIR)$(hexablockdocdir)/* + +clean-local: + -rm -rf html latex doctrees + if test -d "html"; then rm -rf html ; fi + +dist-hook: + if test -d "html"; then b=; else b="$(srcdir)/"; fi; \ + if test -d $$b"html"; then cp -rf $$b"html" $(distdir) ; fi; \ + if test -d "htmldev"; then b=; else b="$(srcdir)/"; fi; \ + if test -d $$b"htmldev"; then cp -rf $$b"htmldev" $(distdir) ; fi diff --git a/doc/_static/EX2.PNG b/doc/_static/EX2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ef5e1c8e278bf8940842d66c9e0b21c7fa70e86b GIT binary patch literal 154562 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

h-5}TFjtBxsa6Q6}4q3LqI%! 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 literal 0 HcmV?d00001 diff --git a/doc/_static/EX3.PNG b/doc/_static/EX3.PNG new file mode 100644 index 0000000000000000000000000000000000000000..27a87bf74c72e9ffb4197fea3f8aa1a64155da87 GIT binary patch literal 67271 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
    tz|EwI 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

      d)rh<<7dmF{oif%T*sR!(e$G;0WBvH$JY8RWdc4 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 literal 0 HcmV?d00001 diff --git a/doc/_static/EX4.PNG b/doc/_static/EX4.PNG new file mode 100644 index 0000000000000000000000000000000000000000..7006bf285a345bffbc117bca0e76c18c951ea3cf GIT binary patch literal 15980 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 RNPvJp+tUtKHI}}({{^OSF#!Mo literal 0 HcmV?d00001 diff --git a/doc/_static/EX7.PNG b/doc/_static/EX7.PNG new file mode 100644 index 0000000000000000000000000000000000000000..5a904c690c45590168a440ddd6d77f44b47e51f6 GIT binary patch literal 22019 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≀vo3PTsXGB3`*kf4Y(Y|)} zZ8zKQXg?um%_N*pM2dGYkB69@JKN@Plv6o5L1iK0#<>VytKvHaeLH)%pV>2lA^cta zMi9gxOb{oovR%4(X6Gg?o+nOo6omCe3G^&Cm|JzzK5frG)m|aT*-BdF!0|SXhmea~ z6(Fu)R*SdqLn`>?EN?4C0EXi~9BZR$ee?BSuh(D%YwFjf_wao1b{{yOvzn@LS;DQ^ zpD=F?wxb(Mk39F#6NV0x8hqcedRl+qZef1n_eqg1Rt^|)NCnd*bthN_59}5|q{L22 zg?=^;J-vyyz9NIMzxn6H8I@Os+Cy2TJpyk_PHzw2 z-j*_Y`wM|D?sTKR7|0p48%B(>W?qro`UpRtLg53XsDW~TK3Cb^dE@HtW-|q6Eo95e zp;#U%%2mX>u=hPm7#UC*iL zA+;z_XR>*lH%1tEFgKm|n!6yLfE5+~=-oA=1H0ULp{~nEP$gh~*)))W{|UB&B0dj3 z-~}CVkb8%>!w^uv=5elJ=AO(Ww)^F;q}&zggnsnR!Mb3=qk`yh3C*aAE|9mBhu%*N zPx^*e0%=-T#xC^}$tKbCG>KglA|LLJ8!z_3Lz&=Lq{6o~ocSotjVxGHqMgLxM$;HZ;wHk$% zaR1+?Tn_Xgq!dMbtd}_1q?XJ0aYJhi0HDA)Z^fKyT}0nopiC`_2#+k@M^pZ^6=Mv} zh&7cSLNnfmuz>fiO|J*Tf-}39wCnls@JIcR@9Uxx@VG?I&CKOmP!vd_TD9uJ8xlm$ z%-4nNp$r(+e32 zukN|^UB~Ws1>RHV3-h0xj*H}3Y!+}h_VQ}ypu>e}m$BT)n2#OZWdzpt$2VO=DDJnWVhbA?2>8wl{A|lLOBy~lW7q3#1>0R~pS5=`ZaIJQFi*Di zlJ<7cpX1NE_-W&MJ<8NWv9mW>Avj6OUCE~CH5eA~6pM+pBsPe_0M4rE{$zzCeMDEN z%5TMS*Mf!z(fHzBxLipd%C@1uX3cGnA6=r-xz21m3z`%je*My4Yo=eHT1Am>n>b` zRr0}8zcC}l9&#{!>2R${*m-cYBWJe9__~B7QXk_AG9i@%jx8D-lp|VYe!6ljYS{3W z#nKt#{62@sFrgtO*MD!eC$UAkVwll~+y+eVATUWJ?JizO ze=Bjf&(qNz$a&!~djM)Is7adD3pBjrMEJwPKY5e{tp*kjP6Y3U@sI>Xm)lJC+>dlN zxnw*TPktibni0KzSn6E37#t_dB}Br2E?Zg#MF-n&v%jlPz6(GywV5n|NDHxcGtQ*E~+fj{0IqH`y>oQclu vz`TiWDlRt@_8Gb4|9{*v4FCI#|MmynR^!#RD&p}%8a_+IB12C}WPAS$epUdi literal 0 HcmV?d00001 diff --git a/doc/_static/HEXAHEDRON.PNG b/doc/_static/HEXAHEDRON.PNG new file mode 100644 index 0000000000000000000000000000000000000000..b2e15de0719c1f37fe5febbf26b198e8f26d96e9 GIT binary patch literal 7752 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 literal 0 HcmV?d00001 diff --git a/doc/_static/association2.PNG b/doc/_static/association2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..b0ffe5eee82000bf345aa4f19ad1d189a8717fb8 GIT binary patch literal 16373 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 literal 0 HcmV?d00001 diff --git a/doc/_static/before_quadrevolution.png b/doc/_static/before_quadrevolution.png new file mode 100644 index 0000000000000000000000000000000000000000..5a826d19ee5fa0dd8258411147adf274c5638788 GIT binary patch literal 22124 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 literal 0 HcmV?d00001 diff --git a/doc/_static/before_replacehexa.png b/doc/_static/before_replacehexa.png new file mode 100644 index 0000000000000000000000000000000000000000..8d2846521920c36aabc2fcb1d75328f68b5a6e6a GIT binary patch literal 25696 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 H%ftT#vtb{V literal 0 HcmV?d00001 diff --git a/doc/_static/bielle_mesh.png b/doc/_static/bielle_mesh.png new file mode 100644 index 0000000000000000000000000000000000000000..1add94c53704b6779b04b454066b7cca0a23cf38 GIT binary patch literal 20409 zcmXwBd0fo-|NkJHh_s@JW@#O}j>`ie7)YU&-}T6pX>a&%jRMj zHvi|JcKwE7v!*a?X49On;1j1ndntx}gZ;eg$KS&rh&l=NdO~lUlz%Iyx9IzSP40cu zziDK#>EiEASAT7~>yLE{{u;+`&X0a`V8M&$-z?l-6?$&gjLXlr|MracGVY510{wT+ ztBzdw_V1LZwYzhApZ2HjKd`}k_W`}@w_Z>6e)^PtpFF@H6^T^SQQuzbN{a z#hLyY*jGzS<97f2-R6I_X&83%VU|8|#ZBHU?AKLIv&N!4Be3XqH#=sH9ffBq-L_6K z&7RC&hQ9CEovBZZ(6DA>LAI7MY{T9ZeJtf#tVQ%Gv*+;FJ=nhQENp+;_p`;4l?_2e z&7?jSK4-ooMmzq-0_)Dwi^K-9@4;u=;qiL(_~EP0Mn-EpgTB!O!+&nxCSjuj3J~zt zU<&JSU2lYqnd}*zQIftH{@S`M5_`Pm1pIYrrlZ4M#a}BX=-aT$@6Af}i4MmtFygkY zQ?2COO-i|^_jYax0YtJ;FEZM3 z+;%kL5K^?ovdHK{YYL31#J!1y88J)iuEl9Zyyz8NZ?t_t~{e0$TH|P_y*p;atZbF@$fpy1#Z8=;9 zg;rhxJ_b&LWkg?_Gld0zcs~nceq$*MTJ$bqiS}mymE!6MIIFe{CS% zta6`^RlbMwhtc*-w3xN;b@)(OfcjTdU+Lsu1{?=_$cS(m8T3|3$ zX^mvU0~@X!M}&x?V=cBXKmrlPI~zU9xn#@HUWNaFH50XnkkFr8j6}&uA)&u!>Pvq{ z2Q`9pe*CLvKu$NrqGvTV%~B#4iJoOV7(;FXK?H5yGa56p2q@Y9&3s3uH?qv_n`0~@ zpHMvNv|BN3`2*OVgtmu=%}>C?SfgGf(Hse>iTK&#FdmeE<)0bMx??hZ2|b>9$JyxF z9dkk3Pk(npEC7ZcZ1ra58Ui&Rte%Bi_%bLV%VLfrTQ7jQ=`+) z48{mHgW+IdKx99XL3hBO(Vpusr}t|lGqK7ITc;|2K;o=?rWe^gjtJRo4+r@ez(HdR zmqnhr<>c#w2(|bnQ-44p2D=;!0yZPi0w%$*3rZ(cC*)`(@N%Al1? zhEt;Pv3KqMMW*oVx-)y{p<99a@(Ihpbd%xS!jW56-GVt&6)NEjEc&DIpvS|m8rd~z z=wWfi=~^7t$XzJ%`?htT<|78N#$alF)5m{hEZ?18RxPxZg{P;vAf(*YP52{6k`AaU z*AEE@QG(C=an`E1XjaH&^6rcNL2L&&H^W)GOR|~jB)uWN883J#F?O9VeI0d$x&jzB zn5kaWKT|#35ntp~_DCHsn0<#EKQ2B zD&BH7>AP0M)Onh-R?p{kl#lv5o=4kCmc_u0-h&5{#3hj@y*N3R|A zOQ7)M)zgZ%*$>w_g&ZNMelvM%6%woH7@ri}>z{F1U3C{lpURr0r3Bve{Yfj;L_cpY zznQ(G%c%T6xv%#op2v@xiTmR1E42SK3&krOFH@KHQ@6dJ$g^Kwg(p6B>}D8Z80p(4 zs|}`umcQlD;u~vuhc0HZE@({3n>pMn);h{}?x!Hxa&TF*T>T_3usl2WUSQxe52eqKkri<#!*5;nGX+=V zt&lY_ejR^pMHe&hxZH#e*U#cy&avEZiHdq^I`N>3_DOC?sZwBWFYu^hMG2>kz8XsP z(t0(;ypA%ClOF=>|7q*gyr=rz`LV3$nwD1X{DclVcQLnbYRLX~f6}rF2CdumQn5r$ zFZ}p-c(gM$nqZ7!iNCmLzb$2U{ZS|}ZZK923s|u%r)B(-fzs#NF41&;5lc}@&YLfr*g>{cMDz9Uoe3rlZRA-PEe_Et)8@_(+x@_-Lf39QZ1Xe)EMY|2uZ0 z#5eH!7V%ce=oGT$e1oZZ!*izule4N=xlaP)lpX6d5tbFbFRHvHcGt#6o%xdRvX#OG zQv1EEP{Rk41MJDMy04V*$Sc8s6Ldj42` zvX3qhQa|T?A_?P47?hQ|4P5?fvif^PKyH##@2e-Yl8QV$ftvYGU}C$im*P8rb!eI* zee0C{^fnBO9s*Uj)Q;3q)&CvJq{Zj%$9=$wvd<@ZJh7eZwC~|B5tZ50mmLjrdl%gI zGY`4O@{HTcwK+SR z`^x4(6r>ioXA+zR>d6&Zto6KPE3&&U6Q^2`eL*>_nO2aeJ{An+((5M5_Kbw{7Z2ys z87$xN;p;oqd;C>_py$e{n;lk}7AF{^>5M&N{K=uZaT-hgg7Vr-(@mDVW$Zq}>YoZG z+{qv{MrqA7MSI3+f_WSi#mlgEX;DMXw+BM`HVQN zI5jP8=Fp#|v#%;1%J~mBXa!Tj8+lyUF-Dsz+o^!!^Ny#6;OiXg%#J=_-rH$BZ26lP zfi>kQph}=qA_2#y z9rp2J$J{-SWN-FkCY8x@#(n7g*P~W=98714=myvodkbY_i|bLo4*^%fq006$#d9TR zy-#26UQ4xok5ksv2@U+!J}&C_v()d|un*H>ruxeKPCS0NYx>trJi~9cGQRnAMBy!} zyBD1j_dQR*_6zp^*k+rih#%cgs9ej2+HEwzYZh?$6?MJdV?W=P!_rkc2mS z3yi5^+Ty# z43Npk=L50|+v)rbjtr3y%9Zw2u&a2J%+W{s@sUU|O2;!8ams@^w14%L@vQ;!62{y+ZcpR!Ag136eXP)z@FE z=CUB2Gs&QuLorUPsM;uQ#iVfqY^Sh&o2xI6KXsYBsfo}Us;~UMC7U}9vLExVnXO#> z?a<;VFi;|1PobZyuZUNvCre3!+&;-de&Kh=HZ{>Xj*zU_dtGzf{TNrs_AS{y4McpX z9^2D)`7k}@v5tBpB;bH#WxOhfT#<)+Mb(`1P$oK4kKt{2uDgz~#xIrQdD(@B{P-(| zn_rz~;uZ~Co{J$9tIH=9jYRF=&I~AE5S}GC7yZNTE1mQZ5AjT_%8C|?%65_!U9|bq z(*5+-2R4mLxz@B_rsXCC`?M)8sY9<*cD`5wfG%1eBK56#Q^uWODL45h495VvUvGgp zR~)UiWN+Kc3>>|V-^3%dhUqI&+NXDJ5P#3Jdhkp~|2&8e7YlcEopmXX&lp!WPxi0( z<~-tDlRd9uRfPV^bQhG--RYG4RQY(7lj(4C>gbAbj$dTEBL3}vg$Ps~j(28f)>w+p zt#m4GCXZSua+L$_F>I@s_*J}Y{%U?(7@n?S=?vb|!e4fUu}AgV>(K^r1V#N5R38A* zV<7t*r@4@g4qLNxu3A+D`mcK3(Y`!YPx9Mb$5t|eJ`bUU`BNSTwX;n5{*@nDS>!C zC5fn$c*d?w>SfkrrxU7uGH(!Eht#aBBUOPjY~+s4fm}+2DBS!?L!|DY8%cfI6`}S7 z0=L3aqoa9j7a%N%Uy6Up{Kw&B8OObIgfeDlRsMDVUa^CA%ZZ~*ccG$P&I&mMaRK6N zSCIz%K6$cn`k+e%)GAPIIBQRi?B|DRqeutK<0De#idXrC{osx3j)nJ6C`^VeA*iWk zjoF3Mtt^Y-X5ncj#7M=ocd|I7ZJ||{@|?6wp?LMdzd{MfIr`p00Gh9gDWceLHP6FRK0+jz7>{?g@MPB%@y1ohpmu-~$Co%C9by9a{*k38cH;2UO>LbKHepA6^CQ+NIGbvW!)e z+r*vQ;qdMs^%VEMw-3FT8<-R(jt%!|Z55|8XrF9tYRjxaeYgh{jd^xRAN>Hm)kt5t z*NaM~svG&k{ooxi!ka&?IL4*X@zig?+ncYDJ>X=; z74^m}C-1#X@U;y0OnyA+GWpF4+Vfoh_%MwsaV*20BI){r83;kQ<&4kr6Mc)ZoDne)i6#u87$0p7+wH; z&CpXMc&_4^LX<_i$hYta({yBXJFS6)qpu9jaj%WLqIQ&Vi(S;WB6Daz^~rYvQ_QU~ zl)k4#>Vg`G@V@h;-n2Zwz`v3!Mz0pJG-`+lc3cR8ZtCnu8~7B(^o1&?*ELYHRZh;C zvLC-iB$QEE>)(KG^Cw5VCxq8~3(_s+0vT08=DDB_~~ z;lW@(CS#Atyh>v-Xj$V(qKM{DxO1r9x(Kw3%4EbTre5Je7mQs;D6+E+AxvELB&u#! z8%)`^l(3x^i7X*aEq+(oPKo~cpv*_raIBPP;w8Ku#P&swbdy|92L+(NhAs4GQ9XU zCc_-=nL-o|6A6G^Hpw9v|KTGbAzK(D&Q#CnSR{(u)1O@=aS`V--j%NAac%3$jwS0( zWLW(_;s*vA4 zSFO|BEn*qVXG4(yEf95#n}Jl;VNOWLwJi+%g~_mK+{@P{)vzGFgd`K`e!}L|bCczD zW}3UT?b|3zhT)_?^%Pfx^CUwmbMqgg8jCbZvOSmL23B82DQR0a5x+T>FV8O&w7c?< zN2Tn`T)V0UV!hD(vXbXLAvTZz@?*G=J(~@s>D2I?YtvwJIth&HMJ|iHqQ=WF z2K&3q8`C+CGZ{j%ai49y*RV$MvIx%;j52U-TN#m^C5c4X-*DmJyJhC0?3*71Gc`O} z5lv9PRMbqWP3)u1la`8kh31-RJEYI1A2YKLE*`f0p^CE8i*I(1-SZ(#A}iE72eAVD zZdUlep9Cml1{C?Kl)rD6Z$kc-V?$8WYVM38U$4? z64X9dDvBWYl*Bo6&ZJjSc6s4XyOih4S~C`n1U(jv-@AY$Tf9c1pLC`;71c-c*Us607nqH zll;cNiq+Yg?bBIB8Jw0R`*Oi}#rf*{{71$rq}1)-#$=?;pRJ6PkNS-ia4jYW%h<~2 z1Eqgt(gq>!lHBJ>C1A4>edR-W%a9<7X?49Bw|$L`v{b+)P}cSUABj6N1)DxutA6#u zUC>rY(#t;6FO#ROx>mg9t9gGz$R^mSEePa;Ui3u46@VG;jI=7sc`yFr&+VM&wuzvW z+Eqmv!XA(-WJfspA5ul4egwmIMkx3alch72*ZR^%x8Yh5ir}*@`RCLGWbR zw@q7ebBS6bR)=zfqK1?mkdpjqA;T$_x;Mw2T^+;}pA$BhGT2dF-*ps&2ZtI+B}Go@ zb^6Nu?hL1dTa+hkjH>Owms5s3f#T4ZmDZ zSv)}PU;g<<@4es>j(Wk!2c`9OTofwEk7Q_pb>5PgjJTz9C8gcR@O)E+rQM$4wO18K zvHYFnxn+Hq$p=(bJ9uGd^_4H8YKcs%y0FB#(u1#~xZ*S?_Yx>oH(FohtZG|nUFM~} zYprU7@?`$_a4jQ$n}nr!Is>23lgeyf`bQa+95A;fRmRqMdesK`Iiiv2nmU2~=0GOkgl z7xjpY2j#=YCfC3BSTg~oI;nc+`UY?F(;wCphn2?2@|N8JesqxAVP{sQ>Qx3ZcUVMw^fpMydf5J}J z3d>RziqwwrT(R}$%lvT1A9yqa$=Q)0fH+Un$7}VK(sdLG=@N8IQk%^veJQu2Ff80I zCL{aFPBJ;TyrV)g(l>5O?K;yhJWd`Q50PC}#3#m*-l!!9+Y~P~MKzRqpV47P+-ucz zfv3NETFzk~$pK#08V^Rida;4jE{`9bKmL8`Z3W4NyerI$PAXFJi1=+SbavfUl1SO6 z*yD%)p^1*)>jkpQUD;GHcch55rN!6g&5e@0+c*+IowA>>;)dA*Y4J{|* zyxSj^-dg^jV=SL?v@_km!VS8O#3M5ubGJOrV{~qzD@!j_+=s9sFVaMnFBxtYOF!Cz zxSa|m$objlQy_!e<28*a19Jy{O9A2#BU_k$|u9 zK+-u{w_ub`e{>sXm$BuP9{WPTH#~k@Yc{tN(wb8Qif{BsdG7Yz)K%{%lvm-ga10)^ z*H;Yt&zuo=S$&jN5*!HGr`|Qwx8Rjc-Hj4_3&;*SL!w?YsKv z=Dtz8on&rlM_X?N;~XLjt~Jua_U4G~ZMkI06VQ1>t;srB|DxV_Is)LYYuuFeQ4w+`d~jTO}p6(GTL- z^os;Ce_HygP9iR2L$aWw0vI024@TUYxo7$&kAB)y^5S?ecI zv@2Mxn&IG=@Zc>7ex!pob>;;t0numeC#bq}AC2A@d)}!TrEYmY;WiYt9#Hkv{dLq) z`z5$)`q!dPgVS!71b6=hK^F1?0@py z@gQy9enPs~Ux=UZg#z)vR=6TLGt)87dQFR<(QQS6*v>W#n#OyW^dDmR=UV`(w-h;5 z1bn4@nnyd+wU(+ZD4 z0hr}B9@}^pjA1)OMwj>36j_ie{4UnEbL)=DM)3C%$qL**l0`0LrDF(m$O4ChWn2$` z9dH4H1CQZxBFMuxl0jr2x37h^2{R0+{kTAaQjTDmxNPkheI`JaET`gtb4>QLGH^Jd zt;4fCMn1iZY9K9mDS2C$E!0u)6;P1N_rTp|Qz@++O^TB}&bDydome@wly|B^%`W}5zv)g9=WOuDnt zTACr?ZW#w}*8+XIi&YvGCkEs*atdnRp|pNUC!YGTLp#X6K9SAd zn8!X|P|gbRP9T@%1?FBR%W6WYJUb_XZl6S=_Jj7Ymr{*umL)FQTm^zfR}0uJ3;m(Pux_eePWG*5VUN3wIbc{TS^yklU=EJ###tr-V*|~WDd8M>7!e&8Kl&2TS z?vfqKb3`w_$dog`dS4??DcOx*8I^)kV!q7>6=epCo+MK=T+`L$wio3BI$(vbtI zmz3>1{KGtklke|dg!1L%8H```&q2@H6E)%@Ue0mXHwju$4a@SVd24Q(uJP{AkLY!W7wySBMe5j)?fvA(>h+bq#b;^Ex zs7raTtM;S6tkKjR`WocRqRUq)*M* zjovK>lK2Pg`72oMRg}dDnw2%yqMaPz>UWD@hX?z`{P9Mv-8I#B8_ClJRKfSqGgYg? z_KdT*tDGj12L67%!k-+;H}~}OXlkX?kO7D1Gs2~&(G}la?^Tt{zJEsNq}K=;UBSQ) z**%KXkP_nZ^n%iBG)t@s$o`;wvEflT-%qgLD~Z1p^3nkl#y_r|>93>4UFfAz^gqr7 z9xaxiuuSndULh+pp)Ln>SHaCAl%4Bsmay>!qkRzD-|NYe&Hc%{{w`uo+5QF>5?NVs z`b*ne_%Bu-``B1qJ5-z4&4*;OYwlRO@Ts*bMk$1NHbhQ_>t!#3cUkT~>}Ma40a;Kb zp9q-r=_^M0Ik-U4lp7x#$WSPLBCA8BTLL;v0&nKKjjc+}st9x=srxAk?h7Azvb8)4 zVJ2lsuYq?=uhUFQ6^c+WWU-p5Nns>g$dO8;b!w49S-+pOdLIkAMctT z=G}E|>3rDL3&jt?Xyg+oUtgQ06ndo%{NvL%%AoE-Dcx3w5i{H}HnM7-KK%qrs;Ar3&AQ#vUbvS#!r zgQ+n+!MHLeT@>sWTQj2EN!ipSuwj=)QvEt8=gx>d4?^W5YWF9`}1WI-?(@D~be^I3u`xL{j!Y*8Y4@LW1N(e>-W zo_CMGQpUGi><;6Ukh#z&oh+0{ws9<~*@b!R2f4J*><2rv`J!#8rhmL}@c8P-H+#5l z5mBAc9wztRFxI+j3IYs9y!~1?#{z=pI}j4kBPhOgLu`5WD}l*LXs30WiCb$w?*4l- zfx>@sJ7dR7T4~LeD*$QLr`%YDC=vy&kFogUds9(u7oH!+Q8_-=QwcAYWYgas4w(@{QORt1bWz_a-q>dI{1*b@Xbv8;91r&e6I+I@r) zvaEs@KcVazyVaE8)$GJyEDAge{T26z8`uLcr5Yl>D9`G;k?RqS{Om|wcAxkhCCo<- zgI&Pstfxgzy%FZUg)URaYR0T)L`5;_vM$A5raObs3IuPy?rda!&`5SK>lPJSw8owG zO^i^8XYc8Li9M(|cqqTq%u#=#R`O3F^8E{{ zAse-frgiC}`vc6ctZ~IvLnHOlGkc!Zr&g{3Kz!wzrdeS-UW1o}pkBz3JcLPynhw;C zBE2(=velmy`p9>WdqT-+V{w6NQSDv}jXl?d9wevug@ZBop_zCnhn5m($QDQOQ$u~| zq)=#EQ115IK09Z~Uf+^E*+8^{tS!0$yKS z(O^v6(#0bCnlXCe*<lng+m*YQ9S&e7WyigTV_j74|}fE%0h#h29u zwhg&-d#Wr0kX`V|lFNzU=zd@6l3g(n`SzxPG}pYEcA9BL8Qe0&`&TI}gKBcrPKOoE z_GaoY3G-v}hs`Ji0GOm{s>j%yly%FYvvd{1dgdMQNPP@$((9o+dqUEgx zI-Xirv8*SYR`M994Dsp?Ln#e9Rti%un2OPjfXvDbg6%=hqZ-8%A2|dL^{b%@u1?BK z+)PL2_oWCo;!ihN){dDATp{?YxR+SPO2@!6<@x%Ek4nm%smkHy{)SYjk^BPYK|5W# zuFjp_1?^O12>u|uk8SN{l<{7{Lse7pW4iriG6C)lH&s#E_Q}8F@&9YJrQpDUiQ8bR zN)ijbJ6s2{c+23CyBiaG2;}U0(0ig=RZ)KRB1DO352IvU z1CWLLw@tIsUf!@)p~PN|+?DJJUF~L0G7%rSHYyD+6CGgc@_gG}xSh`{eKjx_fdE-E zCr>GaYSuFh7>w-v!m$KQ-@Bw=qd1h%!|7;s{q;+m9pAYfIoM$w&_V-Pv5q?6mf+&G zteOFZdNuHw!|39&i#~yKz@hRE1x;Q2mMy|X=CJ7)P9deB}lbWjL46z{&6 zEljpL$3>#C24ibKCSg+7EFgNr9H#|oX*KnCz?d{6odr+B$fPCkuT@p}&Xr0+T&gI; zW}4DGEf2SQdX!Zd9e?A&(+l};AQ6MiE>$bof7JKM%s z5Fb8=3@%p+Wl%&r*f>GWKkq=26)Hm4EF7E>aMF++I?`%J3E5Dgy;0~BSP~WRrGA8J zbH*rq>lp?WQ7z=L=4m6Yu6!N_3YIPhKVM<4D+ zLHQYMG6)8k9h#cd53kjlKfiu$$lcZqfn?J zK<7{TTqfs3m)=T8-SR(ShV|C!+Ofd1Q|(-lc{QU=5q}oOJ^aa&DpOZ5BgtwW9ZD`; zd{u9N>Rt(+y5W2RtnssJSA^Gtj8KS3toR$8YXQtnhhKhP)`KS*;>#W{MlH}wB8{~w z5-t@teK```cx;y+%qDd~hNQ(GxvXxnRy~wIURTG}Z->>@zyYxsI9MDGQG8T0y`xPr zRYrC(dCR7~P+0{AKta318|+Q`n_nIPD4r3hb9KhHSpMQJx^*lb=F_+@7r$*U0DRBc z+fbyTYxmz3YwWUM=~h^Js`ZChe5f11-1ZhC-*h;4Te1+m8uC_j1t|BAb7ufQG*(d( zox6%3d)gM|(dgIL)!8O4gA~W8RzfR`l^>9k$9{&KuN~%XpYb~U$pLPTIe2JL6h(UB zFHzMkL;?s;Q0&{Tc*$Cd{GzfIv~522ueGW}Xw4n;p1fVW>qye0+A)}Si@)F_|M==s zI;c9T%b5v=4Tc!q0ETFDavhJ(O*r4C%-lB`mEStG%kIYlBO_{w+1LNg%|-i$I8LA1C&N%@%J< z?BRmW%9nN{4vk^*+x~}tklB6Un%Tz^?%Sh08od$38hYkeCL!t#WdNe0=1Un9B2h&G zrA!J?nkbpABxQKh?ePQ49&yi~HzYu&$@no-pI4f{pTA&eZ>&^jjUhU}f#Jzn%Xc~Q zTrUM?a6ZqjOTEkiw!AVeqPa6hhqnQgy~Ff|>6iBH3RZ z(eMW(Adc&iedg8l|60L0b@)Hr2Bz(gTu~?0j3I#}fj}N4%$NF|o3d;**I9uje6$rs ziB(jp+Ol0S5VlA(BU%Zzanc`v>mpHmMrW&ewLU6lW;OXSeB`BYLB`fo!c|FyEUgj# zwTU&t9ANOiGPB}lkC9{VCb;HDr=`NyH$$Os96z9z6g&0q1D!hj1?x_xt*FM$(ZR## zrk;Kvl5U%sj+iYN$41oYz0sR~Ac@h^3dj$|#^^H9DMR)OQG1qCuN{w5aTc``Q+C1| z5lcvB)mBdO>3E}E;sT-NCK(rh(U1Vg7(&cXIdmi`ckT#Wi*|0*r8DALIHVx$5!l0N zxYz5n)QRX{SQ?&^MP%PAqMT#WmBwL*ya-0posJkVJhtDfb1NfX-YsZ0!jSa9JrhY5^DA*8{)aGuJ!m>Y6M@R%SDN< zu=(OdyI5^bQP(~>#-su}xhD+SUVsHDl%AKPpm#1~js#=6pl>ey4U#tzWjpnbUTi4N zNF?ZD3Xu(j|50Z~u?15H4w;c&xN6ks6=duDba@;cfBNpJ(x*+VBqDXMSK!(xjOPSe zaQg&#dRhalO)0)cGJrWUM=T9;PhWu@0;z{!M>L0D`FO=yL-t&NhEUSBv}V%*nex7d z9U9sj%ryF`SxzVJBeWmw4?^K3K(tpjx=%lN0qEZjE{{h&)Yzx;+bK;Q- zFa5NRI*}moDRrA%1!&b7`YM&1{K?Jb@wH%e5Zrk4K&(6r&hfS%ejITYhWxCqv!O*V z-si`tMfT4OKpTd=ahtr}3$spy5YIchjLt(|Qoa2@h$*EK0HDpSwg7UCFh6*;A!s{f zfBLJl$2_;dWwLymijzb{wbbtQIM;=@xN#;P0w(>7f$C*!W0S-^Yg%KLpfUBlf7<;jX=0)F5 zM{EP6u;>M(71gveU+J!)VEE9QRsvp%a2q!GJlR?$wH#fg0O<);YIM_dSU<)B+p{^= ziZ`pW4QSmQW37U!)&xc@Jg!D!DKXAQ*rFBwIvs^Lp^!+70BSqVxT6y4+PXSzR%kf{ znc4t08wFyxFPPE24}1+uFXLieNkv==57ZO=edK%nQR>72!07M8}B%%%0wpW``PMv|U zGu%9m<`4oCUZ@^G+_3{zm|uG>uNDJXo(tgVm%IJ;2q%o{d_s5n;vEX8zGR2ebz!Fj zq({6~v>gEGo4{;tHj!{Y*ibt`0q)UWC&0d}oK)B1P5X}P)+fS?A<_5H`Ta>y9hNPS z`q(xs8lJ&}UI=D$qQFP4-Mj0^vCA;rz*v8s%5R4vV3Yyfl4wwCS^)s%_f5Kh0li<0 z`6G}D=Gz4@;YN`~v?U^@`ex4;R9+@;i^W|qka}l1 zJ%r)bqtL$rOJcf##zk-1+F@*&<;#UT1O-HOC;$a}K|Hq5EqMj|yMcideOtj_JpQGX z=!(EVR`!lqFn*#Dm@6-9TR>wBn2NoTs7yI4@{?^RD?r{Jf9By z=#Po4Rf^c~M|eSuPC8Pk2coZp513JujtA-95UJnBv2QhM!wd2lW!sP~qfmn_7+C5f zcWF>}ZwoN1hC2k~WEc(MM@Fhk&wEid4p|n__aN?fXC{Fny(V)IH3qtyZ7KE)03oJd z^u|n+;yt>S+&KTsxu6xy!Y-CTvus4E|)S|F>1!Ak?IF)ED)SBf#yGphaod8UB$9bQ57zo*B@SvinHV z6_^ZtHfSAgN%y8xipQ&139=@BQd1e0UTg2C?Wb2 zf;Uh6ikK*|N4tWBM#q&%K1oVZ#}OvVjAgpaRRVAjb7*Pt<%Xr>f)hSDt+kCMMD=t) z(gW%V`H%ASbufY%FMS;0A+Y@+R{JkxRTx+@gUpF73BIahMt9^}z&7k9!@+osN|kz#A*ijhr&1j=D{P_IH6{RDN~-q9I#8 z68BOv1c4aFDquKi7M8}0gYZ^Oh!3}JL{%Y5mbz_iPUS+t#rN*Z(dXgeT;AV#&{8PX z$qkwU7>^0HiM3x+$5yL~3|q7xs*bRfzsnCU~+_$Wy?jQ|8}{|X(DS3&DBeM{eSMB~vG8GQv3cywp` zXETkn7YtSCZ(jmyw%>G2=rP5sNe488R6HO7XzvvUI#ob5e?9>Oz5M+j(87iDfmGyL z(PU%@Xw7OkrrkUJZt z(yg&n&f^GFg{|SuLbo?q(~Gy(s+Djz1EBDc^Je2D5&8~xS503KUYNPavU_wyO*Hd z?ktDhI$KTOrajz1J(#0kg22MqN!O)NZR!fcHJ*fMr9YEq+ed^lYSr;bFD4vs#oBjM9 zQ9B!}+;={-xqK-y9bFBH*}nk#VIbs^s_s(}3%pMX??FN?vrOnIHjq{x0H?w1i(o3z z0O?AXj9rn*i8?-j?)6CUq8u=BW&5xhYrl~Q<(Ht%ke4~Jig-BMzQuKpv{Hivpns{w zIx5S8hYYj35@Cj@v9SMQjJ94;H$9FBx$MZ)2l_DOQdBuxrlOwGkUX$8ah{~o1`)CA zjZN)XSzDx!ywVu`f2-)YAr<&+izMCv60jGE4k$(yK@!C>n~l+0#ie~r{Z?dd#3raA zb7ijeI-muUb#R^0b`%+V?Xw}p1BEicA8IU=v!C4u7An7mUQaN6hZG_;%#SPw1lWBa z9TM=O2&_B58LqCCAVDc&tV6U8L~}+MBLNS_O4^sfNib0INn-pRWVM)W$Zk^_3ZTKu zaHTe`;N*kRa!~Broa+lln^zHL$UY~u)HN)_QIv^}J6vt1`OJCepK98d;myeN{@a_5 zVMb@r?*i!SQsLNs=*%THIr)y!Hpd#Bzk+D4c8oM+vsQMUrw7*-2(LvF4UjxW7C2oV1V>A*8Z3S8WS(u(1LcWNanD7Sd z{XUK2h)bEh|I5pwPZHc<*H$Y)R=_jVXjtVyhf;*@SpDjyJMI$+ za5wiD9m;$5G*9fnu6CQe8kvb~n0YqXp*P>NAjukay`lFD?^nMD%efZ09m*zn6aUj^ zC|>Ms8fL9Qp^cZ0QsG%)jPA?MHn@j?8qLPvaX%6iuLAOipRgwdv9h3N9dgI*3(z($ zpOh%1B_c!Yz6H^RV8U=cLb+odwS7DKz8ZGYoP*oTC3@6(hS%WaZq zjR=0$^8ZN>O_fqK2mKxEp@f1}X>bSd36eSZGqAu~{eGg@9U`6?(qr^|p7L=7S8z4b zOedh&^AXMEP|E3^hd1_MMZ%}4#}ST*hLkl~lr*8hP?;zKox0@+P&9{F3=F$&#RY?IP?e8~S^#Bazmyzenhx(+g?J4O0Py7R zjneB51lq6#ug#p$WgmoH6yL!{ks$>A1ZfNkUH{9Dt_b&5#vn8V%CX}w1K<8+uX{8A zbk-J$N<|D?b%Kwa7&QUm2TQzGKsh%R`39c|xeQu(UTe|E9<4S=d47nrrn5PDw8J(p z!4IH`1%q*Ud3m_9HLGSTC*JP$!hJxuMn$@v_k4ob4I|`0s1iv8yR-Z_7(~WK6fUFR z**L}qHampsHVG(-L-5uMMQtpseFEu@r(-kaEt16f)U_=IYi6pSs`}%%5yr;?;f+Tb zPYA-!C^R0l&6=w~FDSJ?2heoX3wIkez&LA~7#Zl-B0@m|1TT)K!Bp;80Zrx>(yHv%- zGyT)9D4$&_Nr|39 z>$r+Ca0zYRZHDf20L`GQi^(%H)dy80@$#g>1yhKT+86g=UR5E1dkBOA98#UxB}Y@V z6GI)fNL=0jw!*`Bn^TA{%Q;gwa`%i_=Fd`VR~Ykc#wf>eShN}}n=MwQY#ZSW8BWha zW)qHM4bexO`IIG~>E-SFnFMeF zct;Lc*#tD+yRBIZZ-pwJ9d9m2Wv!F%8>9l#oGEvtxk?jAAc2IiL|?9-ur$tD`#Un2 zj$SBcVYDJa^8kFeP}1R&Nqu^MrkaqU`BX^gB1j+10#AAhQy%In%JbT82?}DI-+`F= zj>fQS(kv#}xOp+;xDZMa=N$@4_kYQxrt0f~^ny&$FJ0V%`75J@F1~7qWetS(S3u8X zv{KMMqbmmp&_@+Ax+XA_?9fSK2;ORKxMK4rcV{^=keG%Y&_YOu3b^>J#UfDjWTi6! z1*PpJzM@#FOb|5~k~Uy{-C1k0<=QmkdVJus3XRZsyv%r<8Veg>YvEQhf7_wMgeY4G z>elcw?{)iG>fAi8)^%4@|B!$_zYnGWZe4(~7hXHE=9csazu*p`D;JcVjpp}o@rlEZaJe~JB0KGaM>MQh-3*08Vl(`2quiLLG?kyTL zJveU)evStfj>zn|@Miy2#F1-3KZGkafYux9EZ;X%RT?U|#e!2eeB_JM2J+IJ*>eiP zjhBDw0&`S^z?-+L{sR%E0cbv->R~LR@69CKN*DnR#FNp+boWf^%qk#)2d%d>BHJNG z^XJVTctXcE9z5wJG(NCzPOxCM7H&4r2#Z}Z2?kKiW6XC&PSAjulSP3a1Gx@GG1~Kd zYFNa^9tZT3CFnV#J3=0`l}(Jh&;!Kcd4te7ED+9CM!?UKps^-wRgq&XVQmY?HIpA* z+OE(pH>UQ-2E*%y!Tu2tWbpVHip#)UDZHi22@Mk4!E2At>Xrcho+B+@G-!J!5jv3J z$PnpF{LZdg)>PiFM|MrhXyq?gZ-8;TOrxc~^6YrU z*~_dg2eTy}#^Vr%->}zC?i+$H-A~KOi>A`;7AS>E2Hvvwpo6+R;sETWes5QeTO@He zP&9V#c|%uj zZ;_fD2TqT5|0yzRXm@Fu2isx$CYs8N4A5U|PSJa0%Osb<1fq}BkF~FY5CCNhRM5JQ z-qw#5uSFjnZZM?U>pm(tN$>GZi2M(s8dh5rm+)>UBvcB&t z&jWVQ@x7jDJ?<6mNla6q7W@5nL@fWr7h;~C^N+=cxYcEUdED(}dQb7!U;b{myFHH{ z-0;^K&P7ivL6Shq>%S^rq-pUqz=NRDk*#P6)~ zJ|4^d_RH7a>n~8r<0Qen|D9QO>r^aW_V+P#3e&vMSH73;^G@{TzxH_zV{u&FuJvO_ zdC3oW9M&GRuyXPjP)+!MI^jm=1bgB`5@>nwMfAO-2d$ja)9-|cTdeWr+b{Gxul(pM z*M0OpXZn*)yx83JJF4-rm~dm==Sxc8{BP;()xL5+i+IzONaVyq!9JnolK&CgvMnr@ zIxN|iJ^AIK>xb>D3FcE)OSJH-F<@lXJ!1<8`t6epqL|MArVwB#{38}KC_39Tf?CGdc<>>6I=~n3%bHbKQb)5a*w{HKlnll|w nz9rHERZ)kPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBXj%Sl8*RCr!w{RMoS=aoH%`@AFX|DVr%l<{aZ@ZRUSaPGP1 z@wR7d^78Wf```bLpL*x-!^1Ya9ruR+{&#P0Z#-u68uqf;hKIfJOK<+*6Yw-IFYmt( z{oPxh>}|8*CFBWs8SlU2r#JrRWy6obL49$&+VJq-z3eu=5ndBNyz$CD-a|unufe~& z#@WXBxd-~Z>~3${puDY}&%_(sYObX~e6rV)wYKziUQ1SbEm`fIy3Ucd!I82Rcf3;8;#auCze?MH6^XyK zeby$z4! zmWH?6XiMM3SHMf*mD4wRrEj+3!PE`7@i}}Ez8YQ=@4|PKJA8|UtMx&?KHpA0vtC$v zoL3bOE?#3^0Uw)JRlcD47M4Zuh+K2?s|PH_m&HHzcX(+>=4KiO-xJptR~gqDSDcUF zbFB7C!EG(Cxco|uXD+B(6i>$MEMDutHx%3RBYG}3YzdR&Ld&JZ%`0V%_Y!=8Rd{9Z z6nyP1-ixu$@XuA=SPi&vX&dp8)Z{dwybBG+8$SA4-cr}tVEZMj@Zw%v3jD3uUanm# zuH9-pjf*2qE}33yJXv2yuD+}=US*m@J~rP=Z!`ejf{*jd$`!XQUTen}TueK8(e|rh zQ7;-89}lm*LEp$5?i1@Eb%O(s;|~|D<}2e@i||*g`G{U0e1Ju3WI-6C>YwWpR4aIv zg7;#4Sus5Ba8=5I8obU>;&|(;VjW@o+!d3Vp{5p6kTq~Lx ztJ!*f`ev>qS={`Y!WF|^tF{-r>ObYvim4W@rgu@JsN<1kDi=^3fLL9h?+p(JlXKCp zv0+Vn{?N0_#j1OY&P2O3XdHJw)@L(GLjDM*v(I&f` z%USl5x=pSaalghl&~Js<(sFk@j)P1`m#^PYQMC#j`Veo)QvEtSIP?U8Q1}< zz0>i6t8E$lbMEp~Lv5d@0GO)*Buu~9i54SxbCvs zc$0l>Vz$1qy6%jP_AJC#3IFN%TUJ1F5Th5Aw}pz1~U;a-=34KqCO1R9L7OqT3oJi*$U;w{B& z;`TjPnemH>0&TDP&7w8>%8Ui->U6VOd)MRtu?dkn;JwV-=}zTE!v)mqBOejb+dQoD_)r|c%^e$@G_~@5ufM)*1+oC+?`C>^oIM~ zuW4)TnOL10981^OGS~ik_3N&l_j~VU-@dzZNAAgAy|imq$}7RYUG4X)bg$>Kyi>CA z0lXHi)VxxIk!A^c-8IADp0lo_TE(-7c?I}<{Ox+LMZDY+#U+pNYLoMa0%GbX%hR(qHJO)) zfLAakx20|MS@s6}hb;|Zj1THhhS-!f4y;9l>Qwk-?Ce$W;kd~^twoTr&c1Z*=**Yj zKb3pG`(L{6*zbKYq4)D&^mgam>3{L|C+9vWtn~TyQU@}`#qiJAyG+NJSa_n66;0KX z=_P|j>3glL%KS=Aj<2woE5jt-RwCr-O4Bg_mZx)9vC71!*4(=D3Gt)hdk$9)IbgD=(aG#ezGrsk3 z;}UmYu%*62{|rOoX-qyP(}q`AyxIqAk$ai}+dGYh#~r(6Z&YZu%+=WCaValcxpuDa zZ?pRT=6nCEQ9XZi-2Z&kozDY${`T7gHOCyk&yu`J-G<4DMqHYBX5%Vh9@#GR>RNqS z8=ZH!e6?ERMi=*BDmstl#8JzV!mpT$@*VN58G4!eNs_++{stSAzqO|!HN*4ex1J~i z?~SX6%!#XiE%HhRdrkW2s}K<3mJnZz=a6(*-iSGttP(8H$d zWKZ*CPqn6jToMFx$?z!=^|_~c6;P7$4uURkW(}ESGIb4WdO9W84DNa*-dGYDX6E)Z zgp3#Y6U%}ro2jWZNb_rR8S&A@W9=grFcR7E${DM@GFJL6Ub}ABPFLUN-g`cM zUykkme02Ahj-I=|_rLV*``dHRyt&QxOtv?(xm8SSt+Lfqs&I2y;mO2Z-ISKMH(OjQ z9L@P@S6oEg#4%Vkm6p3)7Uqhx(lJlaI*lcX#&WC)Z0MEDW^{d9+ubAtR#xP3046$U z4rpZn55#ZmNz}j+R$wo>A{KHUe8po^FQjR>d1bOTGg-bY4Nrm2r(#KJQDJ43d{E7g zJ>e+>#7-uc7V|S%5X*7tF$^R4!MoCR>(aKRZuZT36@ZNQk`=fL59VcD;N0}9Xmx9s z)9|UQyfU$hS3B?)S!=y>R{1a5bnVuep8JpV-f{HZp}p^aF|p^X$#=i>`}F>+q5qt1 zUzlcJyd2k;Cf8!`foyi<63cSe99T{6F*g4SzES>4cZ`~xL0ujZ&na64Wt(^c-e
      oeqeaz&Gg~w%q?6* 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 literal 0 HcmV?d00001 diff --git a/doc/_static/bride_geom.png b/doc/_static/bride_geom.png new file mode 100644 index 0000000000000000000000000000000000000000..3226009aee7730e1d49ffd35df34de7470e79289 GIT binary patch literal 21580 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 O2Z&z&+eu5v})rY4u{Ado}j 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 literal 0 HcmV?d00001 diff --git a/doc/_static/bride_model2.png b/doc/_static/bride_model2.png new file mode 100644 index 0000000000000000000000000000000000000000..6c70938d6a2e15d6e88b234f44666cb1c808ccd6 GIT binary patch literal 19093 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 literal 0 HcmV?d00001 diff --git a/doc/_static/cad_bielle.PNG b/doc/_static/cad_bielle.PNG new file mode 100644 index 0000000000000000000000000000000000000000..6a7445285a413369b93e89e27f46801f91ff3b4a GIT binary patch literal 63488 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 literal 0 HcmV?d00001 diff --git a/doc/_static/cartgrid1.PNG b/doc/_static/cartgrid1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..23333c67f4f9d8b30143fea865c2fe2bc6c1083a GIT binary patch literal 5813 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 literal 0 HcmV?d00001 diff --git a/doc/_static/cartgrid2.PNG b/doc/_static/cartgrid2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..cfcabfde06dd7e3d68b3aebc64178ae16da30282 GIT binary patch literal 6001 zcmbVQcTkhvvwj1Hssf^+3D^)72t@^jkcgm&Gz$V!MFf;$C;|aO5)?#4L~7`<0uljf zQbGwJMOsuoKzjHnp(c@JH+yVg54Zb}gBEVl~Oex9y4HR_C^fFM=cX)yC?C~02%+Bx|=WnfH2HVjBHRYE4iAbp4C$ANW^79 znfzYWhinzl9eZ)S>QRrR>taw5(edlxwClFnU(*~;|9T2>dQ&t~dEM;b=OZVI4xYYe zbj|3;N`0uVO9yT8j}qli2W1hQosbyWcbLa{)!|N19v>ffo{~@p#4YZF1oF6?nP;Xh zP0CH|G2)|2ad8WesQ9`a0qaTxind^LwWGB~zy-n-<}P;i*D}iuMqHu~8qz;s! zkYM!~1V~WbqT=`=)$rkzcm*W_-vq(bwUWR&Q3Wj6;LKatS6n9F5nk~`%I|9y;6e>? zrkc@Ubqyef@Q~{{T=vtJ00EeQ5+tKj0KmM*j~C2QOZdnCjRSB@G)Hfl{U2GdsE%JU z>Ba^lPr*57SNzw(bw||i`GTxtgqiJ{3cbz$L1rt|8T=2u|G+A23yIf&5);bi(O+>5 zU;uXTe@OV1sy-~!69-U$gt)~65Pw&X-b9HHbSRu{}xduBeL7GkZ|rBjo?#8UyFxQ~33E3Uc;@)u z+au6`3z_{claL{;J1vRlnHRP%hXyt_1$e}L_u8TdAiJ7gksmdymwJ8X)FF#fMgR_3 z3@g=Q4Nu)#@GuLV)q@1p7Qf(0PA^B_NgD;2$3X-lZI$cynR8z10$ch~8Z2{FkTnrS z`z||?o3GF~V)QSi@=K)hinw-DSANG+^nlLafcA1~sCKX8A$H*KM2?P8MamrXea`P=Ppw$_db@N}~|0NR*(v1h{U zV*~CtKC@sX@zS=n8`iwrKcm67@XR;I;h5sYEiEwSdHu*N`-Yn($&nW_eBLj;*S)(? zjW<>QVehpHqKgvaUF25@oZW5IRC!o$R>;zXXH$R*=9tE8^}3>bLlW~CH!%2jd?ms;RqKr5Ja5llH|lo(fyi|c^oi#2S6%E`IP1N(&>^@L`9XE z0@-aN7PtCHB2ST=Er8@RT9{Ak!k!G(3qW_SNn~@Lj?lcn++{P5ZEnEi1RBE`e&aFW zJyZQttz1X7+DNPN{M|EGcbRsz8=F5uP`x+!CuehlC?y=WM zaHG0jAzrrh(a!VX?m~N)jnyk0PC}QMV&WE6rtIul8662~+AjO5R83c2R&dytX!@}4 z-B2YN=+B@qN8OGH-DBR|s1pU}hHr3)!&E-E9_W%Ho}JcM)o%1qReZ7I-kINLcFd}-Udwaz`A8jX82rM~D z&OlU+M(5dq2LWaTv|$Eacp|%4kE`hQ?PZs;DOD)=3+syi`=$6%$9G4FGJ?$0OzoM~ zW`k5GrQfzU%w|<0>qxcfZk_BGh1Z{r znzgAjH}vln*|U_yuV7uArf3?mXUeZH_C3|Ir16Kr{5&1%c=AC7se?0{?)v&$tb*O; zy6n1A=;t>=^5gXmq_@riuboNA;s?R0T1^_GT_N(Jp_%3I!M{pq-reD4ley|q$KexW z5d6Dln^4OVA8LwL1cV?I6QfqG>K__JQ@q?QTmRvwiN9IbpS8dRiUhhoz~jX{{TBOk z%K6>{RZ}0~um3z-6*klytvPU27$6wNBAzT534h?& z%rINc9S)hNLk>F;&odrImwj}=NQq7XE-IoO5BC#Jp#?bUtLFNq9+}%M`9}S?2+32Al)>tM&jmLY8j13ugRL?et+kSxC{AJ%bnmx~o?NjR?bxw@b|mNBHG#6?R`7nyb;x zrx%H=^q)$axW8tB5W{Ay^wU#5fEAX-Qf+sWXHQPP>2(SF82xo}N9nX_u^?-?euNt} z`I7D9QK63S9r)qv;D-Kc3Mq7mX($wA4p*j#Yae66_CzbfYr7DId8!|-+UrW(hmV@b zlkos=Zpk{jS-1GUqY-I)J0+TcNvI_KC1a;(zxBH6$}(CFN`4GT zV=@+%4~(o#+4yS1+8U+d3QQNuD6|wpW_U0}JK|^e6OO*#dZAZx?c^vnbX*QvYrLTY zB?lE9IOuZS(*Wy|Ol$S%dF`bk%`P_?5rD7?%!vkjF; zw`jK;E?-1IEpNYYv71^r9nFY&`N%Kr?qI(zUWshp{?vpm?m4#@-uUrXjJ}I#bvJh{=ki03-suKG)I|KKtxy5S=Gl}hEViiO7n0r)8svW85M>=`U-?l%+y9CViZ9q9pw47Yg zZFk6V@X4`@c+4M?&kNeptIRWo-I1WMf6c10$$Hks=Y=Nhk#U!%Azrsx*d0Z2%Ds;8 zJc9?RX|XL{7Sxr$-7gykWHtpbZ#(bGc@mS(3L3gPbE8|#GZBW&N&Vg_RS^6&xhiD5 zTIl4d`qU5^VUkN_g*S6CMpX!-)2ws2^ID3d3FvU)Ne2GzV> zJ*wLeyN=uoQ!NyW6-v9`-uufiV&k$VHMl@))x=KIAcY`7{RC|=#B6HRJ^B95Iu2_7 zB)IG>WsyJMVm(0k*Ym$024H+do)4U;(}(Nur&&!6>a3l?CU-2q>VR|5=zxPbpX;M) zN?8R`imX}dojSh=hE?q_KNJ{WT_}@wQGv?Z2~ee}qbltv(BzX*i_uete3-P?(9fae zg!-hs(tOgL3H0zR(CCVvfSWKrF1n2%x&OgF?SWP~5?VdvomRcDo3oU)ymu%(dMw;m>0+&#cjY5=qu)=f z8fllC>=n_}SKx9~8O0fn$qnc+XGeUN*u=)W_ zLV5&)Dc6`#8@eCB*bM_$_j9CB)^U#%vm|D%!yDx|nRKqGzE z;}3709I?U83YjJK+jgX8<@*SI{&Mqk{?VFsIU@bX451GRe*$?TE-Rt!(txNQzup-k zG7<*jE&ok{Bco26sllBY z`Kt@3m#*4bN%)9|XP;`?4t?8_dui$-P8s8{o454NyW#R|oy4(Hzk5{YgP7nOBHD;x z_<-7&@;~)6kBQ@BB02SwL1vmwBi()Loq~dlLZ;)N6J6MOon@J~bo;x;^jQ~0?Mk0- z0bsIT?hk_3enQNR18bBtA9rd4WGXJC3+YiX{-^nQi(U)n7Pb0TWXy;5g(!)*5|_L- zeh=HAI|`E47vq_+hv%-Z+s0g;MW`@|aU}p;Z~KPr#L3>0f$G`lxb;|Baq)9)nsNfH z^sH|+S&y9t6ZV(t@2wyK46a$NG3m1mz?3t)kj@HtGE#n}Z`6+AmaMhoi#e|;T$Jr_ zYw8bKfwaEK(vJRXJ^w28&~3Jou~CL1+1$QZy_M0%|4o`XLXat1XUWz~&+Rg?16)Pd z24`U@?@uZ2Iw;>Bg;fo*#BW2-E*ifZ+~A1gXj&1?F@`5HZ6`wZeJakL+xq?Rhvlte zZuw!uUq>Zgg7tYHb6&2BM@)HVG~{nl@|l+nXj%WPW*c*rj6{Jha=-kufGlV6hH=%w@+%V)*`rcR zNkJAy0lp5&46@bWsqhKd!=b76Kj96|&|2b9?d>Vwq>5S9S(|oEGZjZcHA)XDH{I*v zW|x@t)w1Y!zg~qaBc_Gd1sbowk^6#^ebl@^!J*+#hT}*-+KkE?a_NONBHM`b? zlNO~np&PV)5r)J2XW#K$*CItP=IV5j6-s}|EfsfP&HXa*#r{us)#IU(op!$Pa|dcC zG!d9EqJ+RF=)c_COuP8(( z0#&_X8T&ostVY43q|&{dTIcWx>QV&n=shC1ex%q*Q5O2^j<|c6VHP>1`yYD06|vj7 zJqQK3>Y^Vwr=1_PkoCk@jHB=Np`<1}t`?JeF!qkN49dSn)_AUXvvzX8d$s)8T8__| zdTr)rxXO^eWJ}^i~l^^9aJPDf!eaZaM&ynoMcW@$X`ZB2Mu) zjipgpHw?phg7UA}ob*;vZx7J3lW4v6J|UQ8U)UNC7FVM2M%NHH{&;zHI=jxa|JJI9K?lIfcM#QWl72DhMLS za@<{t>2d}Ek1Zq&F{=^t0<0Ouv0pd$oLfO8N4g6nWFMzC49-;YOUfX zhQ&2|J1y1vA0Xh zkz;-T*@G3?!QvM<)&iXP(NTXB8#}{8dLQmb#o=663A22G2(@f=`)JYH^*Jy+j;(lx zcRH#gEHQWOGbRFnC+L)%va+U{6O2b9wc5B|p*s3z z8)ZbQ>nMzC;1EK2me`EN(WA@@j4~VIK;qgvb+?Rn8URCxQ$(W>cbnZi z*f-8zddPkSG|Es@2Do1bI?DCl7WX>>O)*7{1h%5TQm0W7Ou5{fM7kKllow zups|EjM>&g50*MW%nt%h@@o>D+jH2Zl4skdl>iPQ$~5P)QHfFpD)ic1Fu=JOHMz=p z$62wLfA0xk1F7#g#{LgOQUDB;Z+br57?#8l4zfNPJfAj{++;}G6q5v)0A^g^@Y->1 zRh|6e0$;yWA~Ws+U6X>JUT*QFQFI>oDTRW)xg1~EMHT?yr6h&=5@~*MU&T*|A`B;wjIF@MlAq(p>Yaw5yHg8bV~CsT%U>Q zP$(1A!LP@TfL8>k`tLI_U1rjR-+u5UbCFW#=2V}^ZOp0o30D4BT}vk5Ip+q4`;AYB zS&kV0&#~M7UZG9>opBsH zzfI$)oRMa{{>HConHM=7dIuU0NGD#fK_CCg;PX;rH z-;aNHo?AJ8%nqJHOcrzCVhI;VTvmu2uYb!7KKX3v$XAUz<{xJcGJTC*g4bI+E;y2K z{f=s{JHiYL&MB#=n6F)W+y!pP#I(XZiyuGYe(V6#yGCD}g{`jYmoMv#H@@mo1=#hnpAPJg#X!)IEnB5^YZ%1#_5@{4eJ#$-9eP? z@WJP|F0TtjK*cTw-+}KrxbibG84LLvND!jSM&(0}YQY%yn>s*n@BX)+V?U{04=wNY zcW(=-Bdq%0d)?9WRGDCP5XJam$>}%3k*EE1|b8o4RV&iv-$|N3x{DEI&*Q zzGxW21&CMQzI^7`Vb9Zaqr)O+g3qe#bvTsIa*gaFOy1OmPx?{wi}Yc{Arw(CG)_utuJSJU58$nt$6ty zN&UrnmKE$AUf%t^!^XG=W7F3$yF*}1-}x{;w_07v)%PVtHRhivR#j=uxVtvrS9sAp z>A@O%lkw?x=KZid@i{RQdXIfoD2>pYpEfWuGE%5_r|oT^zdzVZBw0aD#%En4hjgo- z+i$Gf;r5>F1|FQ-^KOFWoT2Vep#gaY1T>|W` z?e9`M*9jRR`VcUn_-x(?M*jMKOk07uTo8HV#r0{E;z7p66YfNQ~71J7V-=lvHlLXEidDvJyYqMSj1 z-&O<{LCa@}tzQyj*7ne6?BX{^K;Uxk>6jPHxhd~8uR@th9(LsZ=DblZv`zaC%FNei z{P$MULpJ{Wxiz!A5%mP!4U&1mU9%Iir+3Pa3MazqStkBIDa^B26Vg3ZC}T0L^6SlI za66_nNCY%U+rs<`lgI&W{NW%$NZ!ChRRal|oRWb9*;R_7E|+oJjJ^8lQQA%!{8(F^ zN-(7cg|a9XFKt#^J41aW`9*D-nEGy+d1-Sg8a$2nMnH`6P}k{3fDyXbk^j~Ui?B$W z-EFS|8lGP9O&PBtfPCbCnz3V;sf&Ef+ywh{t9 z2Oh!(iy%e9KHd#^X{c8v38Xu_KOq-UmQB=x_MQ!$)xc)oxJh^BQH8p3t2R)zo%8y;FQnZ_VpV05ZK8mDI)<6@hwyaEm}?#By<7EMD{e^q&R3&|X{0syb85KB#fD z!#KR7ov3n{PMI=fPq1UbO`I5$ZbIEynnPXFK!1o4iDM43o$mJk0Wp7S?$upWQLq~A zow7GLpStrj?uBik%#Ylts3k@b?YUeo%=GbYfq^V}>R=GRK!K&8QJ*ChiF#x>}ZHa^Ukjr1p>okU?UChJA` zN8iuQo{y~2_k$|?)604)dth>U1ItvH$WTG0qBO!%rYGNa-gd~8*BSvMp=sWbUnZGVErOxyM&`z; z{o0&y&23%M1dGaKySi~U){jQ!$>@%X=K}`T0onS)%YX3LImUibVF$%7zVJuL<6}8$ z{%TtOaEOyoS_1d@^AMBr88L%jR6`D=wzs36Z?nD@iO3f~t{BYldG_uK10)^<$>Of* z52)&8Qcu8H#ir}dZ!Iur6G`Us=^y9ghA+ywZTjUnJs?m{yXJd0m}OQDG{%|kC#v{t z;Wu#ynf~yV=1gv+!t1YYsx{V}V=g~ZrKr!o5Oj-JP#DirEXn}6 zf6A{{+d*0&yrE|z_|NCH7RX4JR~Sg(3&a6Bm2>=tSKOSrJ2-sE%CTtSooLs_(^|Ns zoM{?q0ZQ|5_G17{x)ozt9G)8-dv09zfFNT#%3C{-az7heN;k;`> zAAGF&7c--LskMR{{QfZF%9Jwy!Ut;sDzVdY0JeDBX)zFz7YY+f>+WYSj54ac2+5mC zi}hgf9#uyKhe;OVor$a++}SWvb_SYN`X#s$4-Djv{Ijy5@mooT5Zf+vq-y}HUt2%> z`K%kQ_?yh-=vB1`x+G}(*%VS}NV@l?RI=p>V&{WX-ekjH(KUA%8$<7Z)AUiC<4%2h zp2{y?ItDFSmD)NXCs5d|FO=3}vNGoM)?zL8O(~zT=cbcx8fmddSY9D-Op->zG@N8S z(~|H9!WpJ#YPf0F+Vj@G4}#1Mhp*7-o~ypK;>FX-b=M<)*9Qa#3-aQ^!;i{yvKX!3 zl>ArwX<`|xsNR+pq@ViMUFB_)KSh8S7Z-Q>V%UT>mcH9E`8Tac16QfIwX^#^_U7x3 zX*<_L*iomYY|eo7sWgBA$0vqNxxv1(Fi9Jg3hg__8ycT2P7z8|qGK~c=5n2K9}YMB zXhZUH+l(Q3l?590&iM=P6gjyn&ZtRB(MS&nR=6iULb=ez^T>jvuJ zrVtZT)ThK*J87s+%yp+OW)Uv5L@dznj6Gi)mD1pppy|h zQFx)=W=^xd{eBuBcwyLChF!i~-L1<0$bP5rRD}^(j?CSv)UHIVUTA4T1OFp9HfA?k zj=6jQCArD2v~;gtgzIr{PY`;gI5fmW8%ZqnzUMbJp@F(l-Xw$lZFN|0e|+Z|EA9va zV?(Ydph4F5tirU~lyo-oBC}LL*5_oXPFty?+)lsOrkPNh388KP){Y^d_pIY;`x{}& z)1_be0vRA88p8;M6SeRw?!R7?`ijF_2I?D(cmfKVY=GC>NzaXb8zmF}IFtzoI1BaUNp(px7!?m3U_=$E+&W zn`Hu&iZj%}V=Ng5n11BNAI)x$nf(e~h>yPgJ@@9xJIhEfdC~kfiIYa_$LMxbUV;C# z;tnZI)n8s(TAHww9CjTzAjreR^Q+p_s6bIEUTM~vJc8tk=4+$>`)B+#`^v(@-LVs8 zigq4Mte_FeINJJz=7Ol;e8OO~boQCC?}rsxp8^6XQ2*NkFa0_}Jywp{K%N^E01zFi z21Z0QpGMU*w0*eObVF){Ce!W)?vQC#5R`-bsMzBHf&_G1uQs1-uA&=^jRwX&A-V*E zH1p!9rRD}xXv01zY5N2k)4RlHu7@^IJ+DJd5+mr9IZ;$lRK`2CPZ@Sf7DK=QXA*D1C|msp31{em zSEX2M`j6*WajIq&rD`m|(lAMw4n75k;?dMp(Kv62z)Y`xouS`9x3OC7U7fsGyc%Rc zy60`Kk}WOEp;&)#;6rM}R(-afE?7su<}Y1LSJ!^d2YP zZ;~8^kxkaQ^hhxXdW0M$g_9GDvZ6E8?YCFE(YT6qnlGQ9y zwDP8-5a`3ig<1hP3=$jVrI3Rx)nbweiBz2Fmlrc#Cr_w2%P? z5~4@1JKYRw_JmN-6-9=9(hFY)hKG8-cs6WMP9iIEm11*~P1nRIW=Z1@It3Vm&9DaR zb`Pvu8K+4rJf5q8YI#8+zt96hY^fFL>JduAcnwE|n6N#kqf0Y)Ga_C`*Qk3BFaN+q zvvJF%P*_wP9d42kmT~qz>OU?pg6HagW)qAyEc&g*z%Qw=kfHZZIRP;FWLR9N(Bsun zp)~$x)l|WrFE|TFiX^l>@kOSK8#Wfh=Q6GL>dd<0_Pbm~6M}m*(Q%yPwIE}Vj~F;E z=@aZ_yD(*4w128#5A)WdQazY=6n{5$eU}K}(Tfn1*5X`6gZmP4b=2F=4wI6bb}1@7 zB$=+^yPi%{qXpU6g!S{!y%@P-^ncGRnJwbLn+D2MyF$jxRL-P)fS~CaQ6aD_cj3Cb zgQgGxg_lIIIC_oO*LAg!<%nQmimU;*I31Ow9>?86kjRKxwERc;EQFwcKmZ=JEr6vT8y_#GUka=5e+XtTw2l7vuZN~? zUI&fOu{e`w#^E;krZ^?Bh!s6-=;!})V`E6P%azQ>iv#_Qwx1)--^tw%i^bL|nh_19 z>_N);Lt$dnUnu4V>y)PO!ehBmK-Lr$c{Yd!^Bn5ph-Y&?(LC9mNgcSAN|;J3d7%!k z7Rod;%J)fDe^AZ8skg1hH zu$1D=yHSPD4)$6d@4l@rbCFH0?1B~kde2bleX05Z{}MJV?C6XdoLx{eH9R}`>C;EN zg4=RFUzLHBQFS)ZTirXTFe+9{6RC*I9jzRprLNeZ@4w(`$j>})f?Z!+DTzU zpt-U-R)~wd>IE+@sGZ`kC<0Af^E3RC75gJFlHbS6y^OCALjptN=WJe4O1D56)oSmATf+Z9bnY)>zS`4MPByG6qm$|xr zCj{0s#wjZFRrKpu=d*q!NXfI_G}yChlQdk(ua%8B0`|IR2t%WR!v$!7s}5s% zOcbO~UrTNik2hujGufZh6r*94Cjg^F%lL1YB&+2`sVDTCffl1-hW7DlRgu-b`o1oH zZXO=-Eip4(y3*Pg$%+mo&=o#bV&<tw{y<)=!)p1 z7~Ml(_8QMl^;vR~lEwX0v#r_MRz%_zwG&F(H35j^=>z#i z7l{N5e^ya0X%c<%uKk0$+$02kOVDg2-)^a=dWc&6&{vxFws}S?G4c$bBO?ZDFY6y; z`gE=-^JTi4&yoQRt9Z%}BA_>VMXno`*3B)yQM2w4Jdwd`a!s>$+#Soj3BYtg6LeVl(ud<9V-&AX(83p43cAB$_Y z^4N3E8BEq|%&1MFselJwe>J3JaJK*qVNTFr9AV4TeIb(faC#I~X;iYi*bqsyZ%<}V z2-r}Yj>M@*_T=-~av)a~y0LPdy6QtK)tiCob>~u2{HR?3!U=e<&EHpO%8V;Hm(?~>>ez|7RF{i48(xRMk1gza{aPg|p{;~Y+}%8;AHp3oN6 zON{gl6B|wnnM)D8BN&sJY&z4g@I7pKUbDWh^L1sx^fwzd`4$X?4~Z|6P=wg3gC@7J zN=w1aCZ;D6G&G?f4QuEXeP(Na@H+DQW$k5W1rzh-4v^U;QDp?_HLUDvMuqwuhO<(L zf&ndQg;Y0B7p&$BENv+AW30?PI+x8QCBI^+>=#t0pvVd5EWepbG~Ws8J5u45=I~mS zmN&Js9$Q0}H$YXl)S4$PJ(y#p`_m}^cilLVsd~5CS}653U!P#y6&Q^8z-^WgP;OL3qNr?-6@@=PvAyv;3W7r#?q7!#|uD$eDylddy< zZTb=^;X05W#<~?qe)rBj-)~&50TkfCKmjsyrR)T6I=U^=!bks`R(&7a>cGy6fpPro zX_aNPiyU)O@9N66pg8&lh3UF32J3_jSRoA1 z`=XhNdO5L2Z2sp3XgPmrf0zD#0D4MEEl}9za|ThF&ZefWa;$~vP)TMff7fX~Sej@R zK=UT4W_l7*v1L!k-;cjTH0eu7(KO|I^pMG*UfTP>9Oc!jONZlE#~viC57SH7I%6vy z`Wh@+wnH)jwDz=P)Jr|EOo>Uki(e)p-{e@t-s|mEF=GkD%>ZDnI}YL+uUIzi@YX`T z)Aj_j)Fjk1NDtbFx4_`as!kbC|IKXZ*-9wV+t993XSFQO8mw5#c#+8~__Xkj4CoPa zftdFEDH|xER3QK&U~R;;pVstre_o;0E?H>+__n>Gb{s*W7qbFk!+D}Wkpq%PUMho@ zT8-Gj(lWFAF(OF(?07P$)V+&) zgmv2`KzmJe&o!_fiEd{_qcz?m@_z%LyQ8BKWu*Y zjF~@>7^kuT8o;(1_l#;4S7^AN1kFvXS7t~)O_VFj9`|~v%^1j>c;hO?ghpG^>Ph5{ zGGFKwPVM^WOjVb-b}YigjhNtDtZ0>`ny&$!TSIdxaO+G%)x8<$Yy3Z3;7{n`jcZ`8 ztX8S|6076QQ%m=(omlQA;Ii^B621y|U4Yo;IQ1RL%dt=opZp#Y0>k^7RJ|)Q?>Zir zSqR#Ufl~Wii&pzzX|+EqDV6Qh+wf=o$w+S9gGIjeoP`dPFIavUM zsYt#Ex?vz<067pX%Q-tYH`fN>g8e?8fWrZz*g?H8Uv|cI*m`aFkxV~kj|1j&b8}u< zg*z@)5^y%xkZ8Yw1@E*$pn9gJrnW7;?hqg@Ot@d>#m&sj;C80$Wb0@?0lDOqRI#|+ zwvmxbpmr~;W`Ocpg#8-;zyQ0Fq;c_JsxNVKbZI?x&34YTY|EdL2kvNdD6FF3AtK%A z2oP;5M~JV-fxtLrv+7X9F4iS+GIiTzuy+o#*Jq1q$rN!=yJ-q5=7;35zfFX; z-!&5N7=!8raStiTf3|@@@?vKlAbF|dL{KzpwTokIpcU{h1M<<4WhS(|Jfc~!ct7%< z+3d#9T}jr*@KaaLP;WBmm}mz7;UK_AOv(owhJqTIQSISz}jN zzE9MW}c1VgsHw7Jt;EMON6dQya9 zs~onH*W5(sK&IMk^z)le?V?n2Al0sLG0}{TeM&fOc1?cSOcQ8Wx$fRqH!9@~5@Lwk zT8Q9c23u(`35|`c861`cdkJA_tBYQ!279UO79-y6pBp?8e{A`_#?j%i6)a6@HHpp0 zrJ%4V{i&2*<6=Mi*k=VVh;3AdWVg%$)Wq#9_N|32=ZPS3&u`%Br1mh&Db_7<{6z??t=E55%@!x_-61Qg{l=noZ9y&+Q&hId$}IKDy0yXy zmR2T862tU;Qz(1kEDT=7+f^!J*^0bldW7^O@LwVdji((v0N1`WwDJRpLh)`4HXO__ zWJzu1rGIOrx@|*mQV2(>up`%$g#|)oWUv{O%blLkV=at^?MAFsKg4J&`%blxD}9 z(g4#l_j=xtM0^M$G{K@5KfWD>@ym1)S048eco@IV#f-+#~is3vSEM% zn_#5v?t_Fs+}03??bY04>TVF*HKcB~J+CZaGJfYq64dHNh92h4sU4M)j|ID_DmK@` zG*+!etgv9Fq~%cPNJeN(RKF{Ctmp_PNGTpn**9e{Ici8-Kp2mc&!!(yU z#jv5+{MJ{vq-y(RLx~A3!@g%2MBWJom%^B86{I9VdaU)ja}10BTx|Nu%KH*ZNT+vb z`pn|z@(0*4f`$46d5*{my0F|1392(^{DifET7OM$C&B7ECdA~uxd}G$4iHcHiua7W zKbK@>*6oUL%?X|E`b*k0ychhc6{XPBztWL`mfFM|?gTWm$s0zBulNMpZb^KLYUx_b zv^P##Kaa$twb=@;Lv?63tZ5hLtmRHgA9at;wZJ%6UxnoP93dev%dB#mpjkZ4$cNO5 zOI?P;EQV&QYiJDT=VYsQxG*pEG41SP&1$$2w*o5G17fz%#T&Hp90N4rPj}fftli7Y zUYlII&TZ9a>wZxfA{%`fq&LvwxK`Qz-QM2j-x+nCnJ*h(0u9vkbg0bhd!!=Z!GObW zFf1g;K(<1mP-1m%GOr7KNkwIfpof9O-y(Ghy(x$U6b3m}{htgd7Ch)c^QkVF+2&^L z1|5(0sIv^C{iy?rsb*UP$byWvY77fgvPtBl@Z9gu85-i}Z*<;qK&f?*yOn*4N$ABf*Xdj8?6BKDCS!jI{{q zb_&VO?Z*FM6kt`I7)Ek5zMb=jpef4ir6Z5A#`6*V`qYnFqxem&pfUOVq?C}Bt^j?B z=`LHv<*b~r&T)r8_rPlZ>-4^?~h(0=Z)T111F4TQ-bn*+^b8n~ux;11LB2CW(mNOdapq zXp9pHutCRUHeN@(71L$#Znl{N(W3#cLdX1o>JY*ICT{mw;jB?$$YXlebs)Kf>bIgl z(tJkX^^2!8yLzWv?n_Ju=ol5gt?XxDuTszu<%pf<%^-$Cy4I zD{s=C8kzKX%#w$r_%?5elPdq|QWlx+D*q)@MEuO6R(O|JkmDK>v*l_9yY)4N^Oa(@%FPB@I!mq|JWW1kvdMpROE*HHAZ9Z$lWV zTMVRb1m83I-Uf zE6djyJ!!wAZhiD34j*F(ZS#DYBL=F7=Agd9>SBXS>C}pbpY3TCM-O9>YSd!T8>yXX zsk-1lZFBt&bD#@~8Tfm7;pO0ps8Sdy`eQmhnk$@7P|^P=BeSO80{uph8nCvo&u!Q! z`>5*Qsb3^E69q#^-DyH~LKhAE*Q*UAw0&AY@KsR!A0urt455;*WHc|CB_NP2$l`?F z;x;Qaq*8TkOxdYM_q;lS6qj=E=83F1p5l>syQ9Sj%34-8`AZ9F7-R;gO|bXK!yk=I z@N4F;#TZgVkI8?BAco8{9(Bozuh0kWTc13NoN;X6{tAHGO2~4VWR~pdZENq2VTFua z3-)-so5I6}t;K@OQoY!kpvk$SWgxU_&2)gIfUq;vLOeNf?zK>!g)RFl$0imozd`R* z6X>=6d?OVTE^V5CaQb%n94~_vkY}h|RmUXkiuQ4Z)C+W6cA=Rj;6DV(Q2 z=fn(<6{8ul0-9AeR6D_*_nVoc;8hSmN!_BanykG=rx(;tiB?R?RtOYsg`j!~p$7<+dodFQYWY4?qZ3I+#9+?wI52@Ib?iDKq_>|bUo^)8oe8K6D z_hh%h$I1cxi^=e$uHb4-3Y=m(cmX5*{FXYyd{cFtvynd{^Hz!g#46Xe=j)4*AzXIu zWHQ_BbQDy&4}jKDEjBmti+XH3r8t+|$X#EcE82+mm!k73ta!6DvWlml`unU4Y$o)o z09DCTL~M0gW0Pd})#I4o-WxSAz^0zx97jJkKZ%d5(V!7AAsnl~vSPi}`rw2Ur41mv z-zdhmxCiX6x1aC|?PXspF2w6)98;fjv~!Hcin7&XwzUzK0u+GF3l!y5wC#Mf3b!kY z#zR9my7d60!;Yd~m(k04v-kx?t&ZvjM}=@qH+Nnp1bZCYQ#E3_q7Zr!!=+f7`RCnf z&6yfQtylt~00pJ~vgt=Q9pP_TNx9x>Qeg0n&kc0Usf_q_JxFjr-jf8>i=G_I`~VM; z=4(A9Z(gd38Jk;Y7v93(VYyneW4Of=N+}hf`X?5T$IZ_GW8b^c*$8aEfMT^-$)d$j z$2?C$QVy3JEhhz?f&lU?j4Mhzh*wew|DsXismGByo}bhJ>nQzTv7rwuwfxeE4+N)* z4~Y)16Rg`N)yAB9TV|Ej_u<&N{|yQO=$P#qUu<{I+c2?AhruOuN=aazlLF4g8SRatw zginJ`nZ}T1Mi0N(dX$(|vVtO!_Wg$rsR9BNSQqmRbdftE66v`0~uor!{EvB?x2_5*pOQ_+5JA@ z{$Z2CJhPk*>^VD|h`rFAAYIVyBGEQA6iTiH2zY{B~i_9fp zqjEr+#N8DXF9u~6K)^OHVu6@$z6j`88P=ah38*(9*MakIrI7wdN|*v%wE&zMEwunm z1o(xFTwY%3U2CmG6+2uwVl+qw-OO6zpot5Q7s{RlvIvm1K>d4~dPb+c(MI|Z=-c8*7|@6F6?5x6M3 ztHRxT_ik)^yrFq)*@*n`v@ZcjGil@dp}0f*vwtr;^8Nodu1C9-Kpc?ij7~zS%rZ0R zXZfh%q*`6gY+OabprHsP&-+j6C5U@UXGM>zgB832F;y(JUF zm0hb7Lz_GX7;fIx<{(fyaEy9C3hF&E2lN$M1=CSO8PvFL=^iBoxfaA>iel63{JmL< zCx8%`pibFVI%N@Vo=3Z<3^ZeGqtP&-DZ4xAsfnQ8NY=}cbo)ueAXZ{!CB-q^JarGZ zU_Lv1eLE)#m3bQ&F~5L5=9b--uC*Yo&+fd6>%IE+ir0nKr&Zqf3vX?h1}ee0g8GDc zKmY_XgL4A!;D9!3xBx7}%w7<1`+@sKBJVLdTPf&%KU)w76j@q?>dmka*mxZ?^RlYb zjaF)xxw(1WebJ-0>$m^?1CG9cl_t%oJ|pp>%WQjl{^a3q?k1gJNq@MpWxf9UiX8uT#2t{ z(8B0*vS9{yi+4n&H`Ji*5w$nJc+8^Y96=t0wi{j=xGzERrL<&7v-Zif>L^OFWcg&s zBIV?|DhH#bZ2IGT6t$}SHvqeX<{t8}G@Gj^^tqg6?c$cdkY*r3tZZ5R-M^IkJvgTg z3mOt}#Kdzk#M?XzRHmvX`%X=G{BC`og@5O3k>I#5=L)#JvrL!#e8}<0m+wV&i3Y}# zXS6__4WQK;YIP!ENYK(#k^A5SlG!jO`Kzt8`C4&%@H|BpRb^ ze$sYv{@&r-4wBWx^tlwlS4~fnyoxE*vN=VP)lU*Ru}IRz#R*wQUmh+U=>ALTCdw_@&dT4dzX=Q~^v@e09=)rZ|+6bCcPtPz(V0Rp)l= z_}NN;2N1bJFSiRbk7*J3@dblN3R{4UrNWslg#e9-OTX&Yg|Rb!sW{=QX|rZ2Ma+P@RSJb32yJ{066o<^Bk48U+lURN^C; z8%U6>-ewh^T>V;3(X2;1&#UR-H9y4GR3qx#k8Rk+UM!P((ybvMvc0SVL9TpR39ek| zQ_ah=-Aq^0BM-kyML7Izyx3epk(#`fr&y)bx{baBi#eoMi(vtF9t=g>e_(2mp2gIB z=HSLqNUz3$TNCb$Yzo@nI0QGcG_WBS+i zilu4*1rL(XYCl2tJx8!$X>>0o70zS;=Dw_S6cNl~}ts$BTLi7Ohp&GFL}>9Z8VpLj^m3 z>{cR6FDlG@Mz|Oak*yVguAJIsOlx~##63j*aN46v!Mlps+15ikKal@nhz_?RHW6#f zP1_DJeOj+y#KLk2m-WA0Gq`Wv1cxvjK3R^uo|2nZ-M@gX(TVm`uf9+b2>JS#sBkM; zf4e!;_f}k7@oSYh;~{_Gu&bb#FV3qK7tX$EAL;4878m`^&woBJ(Qp`8om_4fP>{O< zxR>(&7u0Oi#pF*mp0l}e?Zm>h)yjFp8Ftc42DN%{3FmQnelL9u!#bp1qbP#3@iP@l z%PlQf+fo}Wc<5`jnB4u*4)`ajbmj!rA7UOdI2Y6n+moih)9HpI9Gor_*=A_o*5c1* zzHc;_4h~L8oU|O@0Oy7-9+kx*=Y25l!QV5e@d|VbO*&xD`jmB!ycsul zKsFZJUMneBkejOr)Lb5hnu`s&YpKo)wO51q?h4^Azy7A*yLLeSAG7Q$E+bfIRjboPFP_FxtJf8K zq~8w;Ii_)p*94~OjjzzD(MP2d8ZK5pN${cf9)uCfi zQa5q-2nTV5c1095?&AErjDe(x_IIxdPNGxSD!y;o+#bI7JFxZE0^o65wS$Y2vq|rZ zT)KSvyD#9(6Ify`{)__wyfF}~2ajQRCH~qJpWEZ4>;Xvy4hQydbDRq}>H-*_lzShY zB}1q(LepQW!2AGAIYJwV*)8G11!fseDGfKXGEUE8+mzr(L8 zbY(;rI+sf8xH$e#N$J-tr979a(7mMe*5BORX^QfITe#zFHSepMfH~VWOR~i6h@W(- zd;-mV{_d{}?i?$|;JC(mBO|)V7T!fy2ViLi(+^E!Iu=`mb4SYFyXF%3o(;{uiMH+^ z{v6d*;!;EJ!-kjuQX7X`U1v~S2!BZ4Tc-zchL^6c_P}-&{k}S!%*!sRL4X` zF9_2SetS`Pd%HP!8CY8u-+USAbx^yXt8DnWQh@H7GQMy^f6y6vP2oJXLOSY`_G@p_ zu#L4*S0~4gl+9YJfkJI;%*yI3s8)a%PuV=n!RI1oXJChavy8#gycT0-KMKaZ)ir6a zE!M>p0@0Q4(9pTXc1U$)jEHWFtKN;U-dBsf_`|t7!SX6ugaL2Bq7)kah3eSxaN=#p z`N>CPZ9#;n-gyuV`4vDA67g{R8BfYt?oUYy{1HjsA7pJ(ba0%?QP z-V*b3o8VXdu#qxwiPG)5qoDtB_^GgaUOODri-xD?88v%Wwd z)Mr0UJnH_ZS~5^`Fu>36Iyg_pY?AtdOIIwe?;$2Z4`)GNw!i&sxzF#qbwGJht;M6& z$(uOx@}=%yWG^aOA7>t1Eg$_WdlQJ}h`l*94jfkmdo{IA&FGo^_lyves?CtBk$q#5 zD6}1xS+WSskUJ6c&7-i(&Cli7%?>cx9|EHmi{E+d7*p2&reZI5J=Gpf?t2j65ixAo zZ>C#6H8Vt!UQJn7??evWxieB?0fR1PfEY zC%}3#9ow_K=HB9I?9IFGZ$g7FH79sqqS5FG3^*4w{bPN@&dDux?5JRGfgE#hPk;Gq zBNanA?@I}lKi96VM$F3^#FbIzHoL1@4K#>VNmSHt)c?EyOD2BF!}((5A_ZZU;yrj^ zyw@lQl0?)^-!-G%`9;jS zGiRO3IbGNrEUl*!+&`UI5V9Cj zHr*~6jtgx!9@58}5=w3~Jpl~Zu&f#OdaUI_h%g`qtZFf9fa;v)fY`#3 zT*`CrXAbfw_9g`=fUdl*VhOb+w($cq^YB*vQ+(T(H9*a~)Vq9|H#gk-JB-(;PX>zn zQ4ebT%N!7gkrv26efjOXs^pp6`x4rNpOex3mtV zW1iy)4czEF)ZF?T3tMmT6h54VdY9ZNFj8yI=-d$K*|&%s8h8~X0I{5Ib^u09YSDH& z5Cncbe6n?rgLW| zHSz%oK4#W*XmqTwmV+{)Ro_0FE*ke+7*!YD`mL0pLuEY@ySsEW3EiE)OD@%a-AzAEX~SD=ZZ=R$?ltS)?sqOu9L)1ON| z-NcJs8tnS}1YJxiL6cY<{)*Y8vMTHr>g@gfyN@Vwk?^$%X-QfSEUjmN4sE5nW|FtF zmKC$R(2Cr1X!&lRYRaQ~Z}F(HXJx^Z({ zI-kQ+=d^T)vpVn+chc`K1SR|Pf?hM=*Bu{0`KW`IfXkS zQZQeqExD$@Egyg!~_tyZ5rsPt#% z>KA=;e%@tXTrpyAzA7`il%a4^E2l*7SKODd@h|HFZKl%E&Ym_$zVx+=SIQ2t209e? z98W!Q-2^_}jrg#ulW!ikG3J>wte9akHN$ zu=8o@iDgy#vVMG;sF8{c2mv<2BrHwQMDinOYa5uL=f ze16EBk$YMe)Fg7=FZM>Tx<(I)%U@1~{6TdNGhR$)9KpYCJ5!>X7oS~MTr!AyIjnS! zKTs>c!+-v38GAT&d}hE(Ja+eygD$dSNwS(6x-1k!r2#7Delwwlb3q6L0(e z$^P-K!Bz9}y*}0aEPwCWX`_oLYPNHV4E?k~^4?I}`M%Jsw07GxP^heQ6{T*yRo-e| z9WI+VTuK&j88s?gX?|L__7C+1b?3i!ZOth=g;1qBk)|NOe#BuuB}ec4^fZ$yQy-E* z$iT!|tG3<%;BP7yFv!fF(XkOAatMC+y6f$qFgj&TNzR^eHmxKJgkZ|^m&-YCBhR}8 z%zd4!>aS|uw)U&&#VseUzFTN+6EE9Htx_2A=3NFpZw!K;Fz)q9RKtXPZs}{%U8D3` z-+u|eRWehzN9PszHRR{3QD(7C2as6(@%EtXKKTi3(U3>Q0IU!e=geoi&M*4m=jDsX zrhFJ_lva{+YK{!NLQBr%k(SsyGucjSs%tn4mLvQvb4hY%EgCS1c1Zw&IRkHgI;Ze=ZUyEtA614C0f8kuqUZ z0U8id9n#}(RT)ECKz(8_&eIU?2dO(bxC7z|$gf?U%2U?(>xTYAv$`-~$^E0{eHAYt zsj@p7wfltOQUi|ED*tXSZQY$m!}<&J-KE;yJjEa|Dko*OL!0_kF$jx`` zJAZLerbfj)Ph?_+h5&`Us9Qx0@U~Tx)V2Zx1LritsjgKtQ*Wc5{!6D7s|R0kzrZP? zN1R)_w5!97XVaArdoBUL>>rnsoY~6>Jl<(Pfp*!C!5?SAS*VV%ityux z>289>{5#@r1$mWP_pIfo!NE6O9_NZ);e(g4*ko_^-0Xx~8_lHpc4ZqO-E)?Kdt3YS zNK{SRE+3y~dSe`V<&k=S4ZyRMCnZe>Iv#!9qzWZDyJ3qqk>V~vgMb9qTj>gE=KUHE zZbPjOi>+CxP2@1g_uiY979|R0&F3%Z&WL(HI#@^rHr+smTl*SA`|&3~n3F~Cd_3FX ze3J2hAfyP@Hdun91#;<6O|28m1{k}O%t^)Wz;fnj4NDv59vC$T2CDXA;B@iWB>i6e z_Qx)#D9J#g3;i)5ew-w*@yM$1$a?H0>3nTRCG2$@5(e z&5>BBzEswWZ4MzhZVtbuIqU{5BJC861PzVm^VaAE304ZxM#gL z-~B53$}lvCGz!Gcy;{x_)-B+Qr6%++^2l-)<`4Eb!crHFdx;scVl|+e8K8R z1biDF8FmtYL>MwxOYO~t^68-_Czan)DZ-#<(cERCvPIp>7{N3M$;~%@zR*$sP2|k& zW&j7vo&_cnHRsx`pO!pBbs|!cp*=;=KF&62 z^{W5w^f0sEA3kbUZyi7pEM1;Yl}jOgal)q9d8+4o+d>8>6OtXa|M#tYAD&G&GJIds zr_^Sx@^$D-{JYLJAI(~8vB=gI~)@CTS5ZlmH8ghS=op;Z%~zz zsKx?UCm-*sg0M50w}5#7V%tM1ixnV#d?B6KPgZLjPnu7p_B%Hjx;^&~u-opiR)io_ zma8^4x-SyQi9`7y%$>dwtxc5?s2xx8*UPB+!p?rxMo}!!Irkn0>yZCV_L1ZHjmYu3 zY9}%&LivCJw>f}`vm-8*D++!v?HkUDAjUa%iS(A`=Se;GA)B$uEqeCCgevRMoK)kN z<$gX2$-R0SG1<0DQi42VXvxJ?HydT{`Ukk^hHkMuK2v_oLnpX*hoNTK0Qwe@>(%mT zuxto&NW)LkM6-Kbda%vNBE!QCQ=R*jAG)2N7Dk$CB6cHQjMvONq|;~V`e8p?uwl|W zh3Wa^OC1_}uzWd#tM7ZW_tR2yI+0&bBV@m)hWEf=;~=lIcxM|E1C!VT+Rsb^%o|r~MMpJ$dr6u&Ld7QQTwap&zrUj0YL^}1vSjm!%5anHnS6ti zj>hG20$y4UD)(k7u3(WDzDka7@{Ki*YRExV4*nKR&!{U{?id>JD{m4)e_9~WU?2!B zA({ZuRytX9I~vSMR*lD}mYrd65Hc7)O!6Okx5u9`WSlp~4&@VK9vrczWz=fh2=^Sz zq|<&BJCb1dytLN=%O3rYsLYq2S|_qd>gDO**9Yd*d&u z>s#AzH}~0RYQ|r+2XU1=Ukz|ywflfq)Lv7c88l7{+Zvy>g%1ZSMEBI#In%%L;;;^G zxX=co|?4 zB?oi1w637MkCk?8enTW4U0P3|nPag6Ob#5=DsT))8(4;?+5Y|ja)S98%KVr`bgK%t ztoobMxPlO0cj25GFA7!NhL7DwC(~lUTslh^iLGt)$2AGJ?8HsD`(IL4$Gj;@L+Jt}` z`XowQ-VKKg25kFZNV^1FlTb3!|Gk-2Tpu~B+F{c(+a*3X-$w*n*!bnBy3q@-p5QzD zsbry{8pe-ESfsB0mxOjkbIgsY=_8lo{4d7Bx-B!kuG6U}`q%EEKP?)}(W_2ruSK7K zj$x(pr#gdtqnkbq)0fA&fLST1aB#_=$sQQui`?i1kYs8+Y(;(-^NejgX;jZ3cQj}}>O=s+L?pxXpQ#=t+R=m3=t+|OkKo=WNTqc`d=FbX%YoYwXh z(@o}ZB{4BCz_gN9_05m%>-y6@0j>n|veGUMKdk6H9XA0Vz_ z{k%%)vNG0>m%-VCwt9_O^!?XURn0WvU{SSstd4?Az1#>K<}#MjA5#IdJCU6H)f?GU z@w!jpLel#Ff|a6rWVTo3gKAR=mK!)~@xN)iH3sc-yRtw6gjyWSn@$hg5)Hyfg&-NC zA^4Rhh~qX0jdspdbAUDR0piqA$xU~-(H)LII8y_D#C^RIa8jOOI(D>0`@-0}Eo6xr z-JjyL5t+U1KS=TFu_=;a{`)hL`(Q4ma6m$IxvN{u{BSu0fK$-eh8wxGhcIfef?^*v?&z|7{vHP&OoE*Cd72w|+Fa$`xhjs2je zTUAK{$&92$1NOaC7HL|v%Jp@FJlAqsC=09hs?fE&zC*(?Ratx)SS`%oM#9}$CI?jS zeu`4a`39#`_x z(A$|3p6L3OFJ07eCGOWe%FBDNRvDTZ!9z;i!}IG~VC zmAMmhEmzIpO-`%~33O9b$=bMpoH<+FwlNe-cQ4Wz46Kb>RC0V7##kwvC??Z?H*SOaW!H$H2}VEihowf|8aA z?_Cn6N05PG&ms+jQhun9a=>p0$?w>2PT{>T%^`@bfF;~W+xc-rhdBLm;}_8_=u%0# zi_i2tFcKUQ*7T9Ihz86AXsdS<9a{Q3d;0MS{?}Xh1I`~sOteC`xSYaXssZPi`e~X% z*gWSr+_oH`{h_P2l4mZmemi49DQ4jAiKdjZL#2k5^Z=jdv9 zTfi9D8f5f5?3}QC$Z*?E3ZwZu^BRIk6bKR_<^fb(f?>wkHp#<%L!)Jp;y@~nRob;!vIh^=?d<$q?&m5NH z!*e`Zijl0Z8DE>yf4PzN@FrErd`S!{R-PZ4&br;9XUP_O|6RA~_(+hJd(_~uAw|jG z6W0aRj+}ZkV`3lWqFFvZHm9+Gr^FS^Z<^+fQQB^l|GJso>z?29jnburUz=FnDgw&N zAg&LCkv1CFL9JWi4W0iZ(ZR_@nz?;;;GO$LzE2Nd{FT_@8X#<>27bgIvCz5=MJoKG zH1|g$nmo!Ldns_bJDF)C>#OwG4Egx+BmR33X!$UPJ*eGQID+jE^Pd~fZidT#6L|n( zAJSXCDrwnDOdB-;g?9P?`+Hw!l&Vkqd}@`DPrdt0@RrBe4%v&Avocj^n~u9y=ZY zvRaHQd|u*8T}l~_TasZ{p17_OvI7)e*b@V|EnjoCxH5pPS+s>E62yub1Kb)IV)wGa ziyEIF0QrDDeapc<6yHl%6%}S5a?|Q;@MEM~f5wJ!e-C2KqYe)+{y3So50gLNzNq|t z-lx>nlkZ+Y?dbRstGT><9yu?WlZVXW#;&W~Dtk>)Gno#u*}79(`9o9XnK%%DDC})M zIm!wafYxn0!QD@r*MFM;9igN1po`TIaCVL-+ilm^0z47z4Y+3_g+!`%c}cK=Am*r4hge_Wc4$V>JfKut=d zQ}S+YivyFfvG%sjFBc*YgXFH~LjdTtYqczjL&cgO>o}LYdal^zWEu1=4)e5o-^$P9 zblUa^NrxNq=&qJLZm7uSG~705a$1$cH-`L?<*+L2P)m|Pi6eU=2yU7uKPiOY85^l` zcC=H_S>`n(K5}DRQfTX3Xp$v4xQZ-^){$u3`+ zjG+KxKzav0&9>YvPa21Fh*ZYMkVa6pIS23x0)?wkkRdYMFs2O2HrxNC7!CMr+{k zg@MBgIfiQN>^9V}lAgrMvIpPc z4fgw6sXuJ*U|$oCq51l{RzeJSA)MH(A6UJ%(u}<)KulWL%(_cSB6@b#Z4K=plq;32HY>Fczbi05NOM} z(N{I97_#cXc_{kTW#yGjI3HUIK~a`z@n-#yKS40`6Qd{euLQ-GTLKDnjkVcg-{H{hjlJd=gFGpoO2fr zI9!SJeT)0gV|2dU^f@&s2b_hVw1mqxXrS*a@!L89-S2(rLYJGTyyq|HXID09O9!Z} zRtw%6nJF=)5zw;@R@gN#NN-Thb`k{w4KEpXn{n$hThsQ}|5_CIPU)bimC`ev>|8zi;|?iNv+9l{TEqqrkh*e&5KXs{%UyAcC%c&ho>_Im z_;x(Ku6r(BQki==`Ppz+6$dufBit_tb1`#}*0ek5_`S(tpuJ+%Y0r33GQVfPK+MR_ zk`Bh)V6RG?-ZwwcS5`A&HV0kgPr47d06t$6A7td03o%8lmy&$&ScilQ zrQxB-`0-+b!|T+}RQV(#c6v3NHge7CQ$+xY>NKb$^Fr`e)c-`MK>{>hQp8~gTC#vt zahz*HP3l^MVy_=VnoI#^l)@U5#qQEst zD%$che_6LZ`3gm0KpefAh+QG3X_3iKyZ5hLGnj)iFCD|lIfs^Ypw0qqj%8*!@BN0a z+Z8zPxC$(5@tTzy1nmgd-)r({Cu|bOtj(rv+SPFd4Yldlm#cyH7miD!8rSZ>c@WTKfjy?SI8QjY9TkUi z^i65PKDKD9QO?Hsi@`4S-BB!VEoCrrA8ogecrk)W-%zq`UX9l8v0FCOH{zPFS@Gve zlj#W|jc8=U)udSA(Cbx3V^g9;+0?yznb56smgF2-XSL1JSmE8%llCD9LPKTc#?<_i zn|%LE!0(OcegsNPiAh1oTxJvaqEtZ&S}qo?WzZkm1Ol6>OTT&@Jwencqh>(=dr$u$ z#vRz4f(&{kC zFka?WmmRnjKd;!`P_z?2!e3Nd3t-WWjaFw-qwzWnqoy7<_9&i1{R<+JEFNz z)1~8u99KsY?os0!8!!+2&~EJ%ukrZB?>^AbalVjgJfIN`=IWQa@MiW#O^ikLvsZW0 z^g(FRjF`$QnW%eeAJx-`kj(#MsBFOf=ANxv?{O|8aSA9v*9XbgcOhaEyaX z3e19f*OSS%ibCd~^YeWgCk8%!I>J3La`FC2Qs^CKBH_oEdLE|Bsb3aKaE@`$x@$wT z$d7ZxFhKxcHB3AlnM|Y0%R8d;nlPqfO=*c05t*3{n9zW%2M0-DBu9>XN-Ofw9p;1=CErQJ+p)&xRM{nGx>(b3V97f!c;$jk3V`Tu_wAR+YckC}~q^VaCWZc9>HjT%0c~5gH!{r|f67EcM<^8JSutqn&Wy??G@k`oj)WWybeY-V0Do}_IM9wi z*AHo|Xu()ChGH`xyrIK7@|vQpKe2>s#|vezH(qx%98)7+GfK|aZ~KZ+U+ZRKTdi4r z8}vD~_J)jYtep&Vtz`*mI;~T=W1_*<(nlpMwS)~fznb|6#RFn-lKc@839%~KGJSqUMqQ{FcL>nm%vv3yx zCPN{tQrI|!ylSPn2gI4AWmVv5`n{ur14~{`*uN*?W7#+47fkx~yzyq?eW-pPEw6vE zXCpI{9|4C0f9+5YJ>sau>W9^&C1#eV`rg@$*`B|q%?OLf!n*25-kNRt;_T>pIb{cm` zQT%@cj0`1%`)lT7)p{AIG0o_dgx`*#OKfgM1 zt9_Uw@A0-{SOS%de`Drcj{BPd#J_vMu@_q}*QtWvhHw3914$ZP8F-~C>6j|uPC2Yv zZCyH+m(kl_1jM9Y?J=0We;Xn9OHfY#DSs- zBm)Yegc9KEs^)5#P2^OXcRQg$PVchK@ulMMM0Cgi=&C*i=7{A-211ZRS4693UP)!e zjHb*}O!V!CKZz7b830!Sm}$FvWZVkz#%>MC*5-YS7KiSeq3w}7isFE7on60OKGaom zAb$i1?5_3@pDMe}MBK!YfdIidIWV`eD1`zpS}?cFXnPpc0xos+E+aj(2X_>=!{z%r>I=vF8 zwDKSm!1adL464Hy^7JuK4@b0t#Jkv9b>I?4E)y(OmKzbbF|>E9wYb>d4w*(-3NHr| zezk&)jq!>RiTcUvbvcuX3n!}89DwZ2a4OU}l?K$1QduyUxX;VsrM23E{J>`pCYT*a zMs#4DEls9zc5_6JwNz=#F+KS3if=z3sO@d`#`ug($`={Y5KqU4MPSr4VTEVKGv2SD zFwcNtT!j`k^!ju8>WMSJclmJS=IL5q#7EFEz}5>DWqFcr?Ysn|%wgLT;K0AuQD}O6 zO1;1}hy`l>U4M{F#I$PMT$G$9m;VB9LHeQjRONGPIK~=GUjIacHHrjIQjw*S?7?l*&9j^Xc(68c z-mgQ__dZhJ><0HRodZmK;^cDxyKoQt5g-+H-mJ5GT3+JXy$PUg zAo};W+jH9XfhvcBnrC?ay(+sh%b9ntYj_<90$xpG&uwkM$H1$)ZZU*#SuEdqmW=2O z32~PIqH_9B>i1XBQsQWhhEBk4?fBFBgfH<@rK?Hob{B?c|1*NjwRwoqNPp~lMBjcz zD71M;Y_cXnWVfZcp4C<~bX1%Zq3(d z!R2~8bJIFH*dhlliz^IEn^5o)^<{>_YUMG>OQC%1X$<_zcQDwS22^F;GnBEuef@z0 z?dP!qS1^_j0C3Df0oO=q;&Teu56~s`w zHGuuxIrOWG^FYEy$>Wn-?bF#<#7jk{Jl<0)lIb^Y2c5`Z%R>#{i~M?gR)IBY<3~VU zyCVi_7zS~yMWkNX@{4^A>8xrVFp0e0beUS-LU z;{rI>o?We~%h6?$>^7MrMf&u``FIvEiY1NUi3Z5m+mYeN%bxn<01Mm%xjk8*hi$Fg zcmuW^2>ahmCzk8D*@t|?f!nOrxYg%w>LN^sfOg(fQ|@!#8(gltcXTXFm3_$1)Jli> zRoQQ4BvM(BD-=m+wG7=sqfi1#llW=ULfSSOBh96^bxwwOEx00wwonV|sH+E4!Rs#* z)07Q_RbA}H>WkY|OmO-~=n^Na#;2Z&3__#F99(V$(dW{|yY)1Wh*N++38je_z;@U7 z*1&<4=Q5|_$fGNxLs@cs`1y@%k8yTi@YUmGs@#bZ$@KU3ji3zcx&OM&v>6ZxO{b9n zuiG{OXs7)N_Mza<#4w(*kzjm@!`oaFKiRjrDV@ggta$kjhvS~Z_SNgx1Tm&=0jvMs zQ<+-I_q&+?iU;i|)EDJ7qVY_1zLqb}T^O=p?w0p4gZ1R5$v>>6yxHyT_a`pSfYXz? z6KM||ZDDW|mCGrBZ&EG##{dq_??G6=(k*L z>cKCt$Bc{|L%%|G!5gd7@C`B<~u|knniogPdA1cmx)OhIl zf@j@(d`yJJW+uibPh40id^0VMh3nG=`WqITxxSXIHs99S#HI3~_yi9eG z9=E*9GL5B&ZXN{&Hf#fjG|t&Wg6@?G-3^6r?w>mb;T|T7xreR>G7NeGm(C(YJAb#j zn(|ymhn&o}cUg*jnd(+7c}$QLxD@mX_!C{cl5M{_!Vd-mRp@v7#JzY#O45AR?ZwF; z7Qu!eiqYLf(%tvuFV5aSUo+0*GBcw-&w3Fdx3KeOtOh_<;T~FbyL-H&1J%b(j z(xCwJmjoVQP1&~6?A`&B|L69kqr&^n_U)cl!lXYYH)_lRj4-Nf`YB!)M{8du_W~P} z`s)yZ`kJ`Zur#;-{KZJ4wn1hkM3b<$gPG*h>seKB6SrOMsCQ9mxCeFvxJV)FYhXFk9|n;4J3^hrC;3q z+AzBjSY-{>qAzxbDh>na9Yu<9_EjY4NwsstXdUoL^O@Ob-gW)Ao}VD8ZQa?Rm&>Do z<~%!sJC5Kute>njK;|q&FB#E{c$C$-=cY?*N|!uCZYOvkWduKcPv+Fqc*?R+!l8lh z=E2Pl2X=}c?#_Yw=4B7ljWi=*Pm`h-JGr z1vadEjPgsRbZu~Kvq%R&3GOH;8p7p0%FYO3HBQJKT=w+%@w@n^-AhIMBA(4gsZk_g zq3qaLk#A(7bBX>*Bk;}O+uSIcGOT3U>CR=AVD<=23BZw}KKf+lY*#*G^iAN$;ujCi z=b)d0gk=rc^)$!$hQxv*=68a2-?HM5Hj=MRI}2BT=~_bS;}zbWJe&Rg=C^lF_~yOF3_yC5ws&g*3w&?}SFOwL6T~rS*-5zx=e?U- za=2CDVOhol$P!V(DNXhof%y+3+0`$nk~Cb|wK`?TvN{ z9d{I+?b$&h%Yw*rSY2ed`6YBO@_xEx9d+4CQ4Gqsw%GEqT1+&^mgqU{0dNr_W+P)e z30Pw2^P0)y8r~%CE_GI?=byW{V$eQZj|W6uXdV~~O_`EF<>>KB$0+O@$Q)XwR=ZaX zjlKf*=)F*`+HyC=ODgN+lwSGYK5$)<)!bx}D>X9nAbAbfS7Wz{DqBFB4yC`}_2Qlc zuIUFjL-5~waZOHCnT#5c0r#0IU%jG2Krg8Q`)IoR<(^+aV`4>?F3xrYcUUQ$6guP$ zHqmAMIBP*G#ciU~RZ|%gi@U(pDoK9I{Vi~9|+!5KN8xxxBpWp>$=M+*h^>ox0wcrW<*PLld_MED;9nOhLI3dUc}sfgY%N#{p(9 ze83h=?w1U;0e>jMWs!|Ksn_=``ct<6RSz530h0{M05^Nx7E&ho`>TD}9Jq*Rj2;ZK zS?#;sx3EK^{NbU3O_0VriUc0{q5jK7Yo4jlN7z98LeXm{hE93R@rdYN;hLvE48IPZ zTL9TJ&DqDX=`|X;nUUB!umPI(3z21$KjMLR5@doaCR*nW83vLx(hj$+m;CWE`^KgS zC9b?MkYh~Te4St3?198w`t4N)JWUQ>rPITu3|_Ony6Y0gP>1W-100c zCn^l3=pBk3LGV$5%O=PD-6LP#6ni!mSv*+gvT<#aWR(;1r zfK)O>eoXypiU(~euR^FALk{a09oxD0aNJtUcX>2KBwP;A3hz@l1*MAio`9h<v~TdHu^hm0iuH?Qc_FNdV4DTaww z^sG^;mapfWbZRn8jzh0FC#Q!vRWE9B&ux`S{unf_m550lx}+}QCV^5?FeQ5ze#B#{ zH#%$AS%Dgb|Ha?xJh=fX6k%lhXOPl%_F}PJ{()Ug9Ei-*orVwr~ z$P!wTKm4Xs`v~*v6+TUydBsasO>O19s!Xt&6?A3_ZY4<>RxMU^>>MJE2pktYL9d`o3D5xwY zXq=?2Zr%pamn(E!>t$b{o!$KtU@f^19g5mkZc2s-UKz3#08$S@`uHiwqoPgU&#JF( zZ0~w-(SYmY*1j>3W<51>`!)Ev)&mqJ@QLM5NS=lLs-AVCDp*jT6hlf~>ETa|1V&Vx z0(#e%+6NpiSt*9XTOi#{z2fc-=N+1;4JP$MAh%ALI=55=K(xR8xwwLB?4_F|FO@?~ za5>veK~m<}*k~5?<7m>@l=wz!%~_KEoqd?*k`t5R0|m~4z!7%#dt8)xK}!Nn85wwE zZ>ja>DYy{AbMW%TlwSQi!aqb)^cq`3!kg&^bAZp&EHTLZG)QiKk;@!)FMtDAdMD%O6B^-v^Pt0#qr8KNu*CN+0E zo!s%c`{T4D!bdjS<#M&lAA;sy_>UiqBr_?Ur2tQ1zT9-H@0jP{~xC()#%wJkFuXa8+7Rr*z-ieoVf) zL3+7dbTB3R-(AYn~wYFxGqJY7zsTSB%$>970a}^#i(ZRj6bWQq-2; zx2Oai^Ha9kBegjHU$_|G^?i8q$y^ZQjh4^0oROE`6 ztCqQWrMgwLxF)+(b6H%h&xw5Cwbo>!MKjyP>Z!ENQ*KJ12JYZTvi@ju-8Q3hC=ym29-U=dK4cV;sm`^#|*YU^Z z8>E4Zb~yGD1zaQ+S5U9(IsHA2p2?D#?!ScAMk<7Id2UlRSSiXi+^Qf00Q~(Qv zUP=%W$LtfIwF8h6cw2N^j?3>{6sYB_hIHq)YO`TG{`K<-Xk6UP!IC1x5_D=SRe^nJJ!BSR$BbKe~|zdpF} z`FTO6L=6MYB^va?>4Dk>aD^ebc?_|8(dy(Jg^Y9A`t#>;*t?^Hw-8ovr~WK4DMyGF z1TsdOZkyb3&&o8s>bmI*doP>)^G?;Z43R9)zgR(xNN4Q8TfFzlw+1&1Vn4O7t*u!I z1)nESp9Z#VoH3gl(o;MKu`L%qKL=)2wUBkfZOe<<&CQw~t!hBu*E)y4+&KDEzyNc1{7oW8RA#&_9wyu@LF8|5af1wb)X56UaJqPVT_y??1 z`#=&C8IF*O*&;Uu7FP;KqKpy6c9GlMvg4%fg1g8!Gp)aOAF$;aX&G4DpvS>6XRT=YiQyPmYO85d z%W~kp92*a#eBeBn;{%Z_sh%88iPmU2wzL6~v!SB;;NKl4%?++H{=C)JKv7*GRpgQg z$g%U58yPw0Z;Y*+w-ciYqq0|<9}rnZf`J=F1@}Db8^O+Xb3%;Qj^WA1kNaQmm{@+s zj^sOWddggV!#GE420sq(TKEQQx1bf&17dY=aWSuL7+M*&qSsH^CF zqf!v%8TQ=OZg@P#T34~yE0J?zZ*T86OsH<269`w64c&V88>Usc&H5dGC$=vgO7;`Y zdNEp^uM<6Z)C)*&$t9Z_bGS!%MD+6fv3rsT1yD&?mBJz~w*C z;yXQDs~z9cNJk_|T~Mg5P@&gEmLd?1juD*~8#Be{+ke$&>on3)GUX4|@;+5A`)NGW zxgGndFwu3Z%Igs0w7(Z0l@6680tMJ?a;J8?>^VRuGV{_TO=LV4PE8O!zvMFG)5FtMHFlmPb}`KEgf>sHIZ zv!knC{8Z`Zt?|qTgVFfU?&aWB)YzNryKAN4$JmB?`%bpowK^r!t=WcTVdsPm6yIB% z!%@LI#Z7swoH68-z;LuDp46Qy2MbQC7$zgRLpamh-*4Fr{%N2p4O(v&K5jO zS=@X#rGk3if)P`WcSZE)EFXi9TsubgiqDPWvR^>1&loj=2YQu%D;C@k8Iyexw0^i~G@4hwm(S0gbV}(axMue9A!B{ryY)r8 zzs7+tm|4FJ$Ko?w0-Y*db&1HoSZW*arm{>EM!)x|WTN%90Kr_}@juJn}d3 z4%hDX&d$zyfd7#kbjC5}uic-pfkl`jp1!O+ur*h@ND!y7Oc1*fDi8PNYet$#NWwUe zj+jM%b3XIIdl->ksO3m3f(8*A#%+chi(0(g*jzp_x+#J18#+@Pi*4^AL5Q*Qg{w!R z{SYkmM#&l=uk=HHCFHL1~L`39Py9V>xGZl250xT^pJ0hWix&uv%hy*)dM)oye(5g(36On7xe$~qQ zXK!(4rhPIz4vFNHpg&t?5IE5{nm$o{KAV@~uD*ap9%kc7WrAz$nM4v-dGMsc3l_gu^U4y1lIUr^w&x~P$ z?VGIQ=#=n3+|e8!!>!z<9(--AqGzrMDV>1r-&@=%qFLkicVRF>0QHtI+8!4Z>cdv2 z+Lp6jUX`p7&Lf@I^t8<8Pt4qES`30?pPL||dGW58o}x{t<;@fkhc3+NK8^cWII!L4 zr}3JpvK6x`z*P^F_28dFJkE^q;LAsG-gWIL8^!l40~>3BEOqN{Mj2DdFCQf!fMV_I zh5?@ulBQ8{6?kKJk6Ur6-WpC_w`hMl`(Z~uP{HEO#*%@_Sn7aR6$9mE4Pmb%(3HkC zfjg&^bJ)Mt8cK-cWoUU{5*YG?QzfXsS65fxG5wk+g)N(Gk06>S(dsiWq^Hrs%!~+R zS1SJJ&nWN%%&W(V8OspO-4}ULbwi(;L_r7q^!AFt^7d;N$PKf+3}F4^X_wq0R@Lt& z(8yo6q4zzcn%P~6yYuV)Ik+e5qx0L3AW_QQm%^Rv$P%LwlMBa2edY%Kag@OkgQHUL zbnoWuoGNOM0BJjTGXLR+oB)n7B&`*Z|Df&W=KD2)JNvEan7&c4`VHBTi_S=)VVO*-?edd}LyM3Lmx{yMBkgv$TxOH5 zjX8Yi=Y%srh>I>-PsK66BKrJPgzLYW%-K%x?E5D%u=vNTwMr@aZcnbO!MA^pKQAlw z@L_zb7T!eWMB|7Ay2GA4brK_kJGErlAgS!vT&(jh(|+2o^jh@(YQBJUu7+>Oxunn~ zeMJnnCgdzp6sKi+rk5K3v*F1P#iF^qn|y`J0%yyuLrm?Fp$sKV=IWLf>l6KqnZb)9 zKdWS%z9Io^8;K|{HXfe{Bet}m9e++w5B4cPv508>U+3&w`A~5U-*ErwBF0nJ6H|4f zCOK1xqqF1~SO3OEq?T>^?KaUYZ#OYc&j65Q3gvJ7`QnrPg|qB>gS@VyD!s4V-!L_N zEnJRmNOSu=%C)M#MrC|BUa(<-oPk&G*Mz>-S=_R-wG&QO+!!s%M_S*je-*1LiU`Kd z3|pI*Kcbr1vei|g_t>&q1>1Y+RnH3?TkS93Qe4k=)Im|yXQr;;I+%@UJxfHQ>#yMRna%%l1_>B(o5_2zx8IdK79GvcW^+yewe+{~sVn~Qq5ukHlgpxPX&d|JI2S;t z*I1j#pSnDwNZqst-gl?icvhctn_YAZ@sB%W*5`MEXKsI1-8k3tMEmAfS&-$J--r=L z)i_+5QxDmNteH-YURd3$5zRV7&FGme?RbYL8#bxB4NM@|eVt;5fVm*F}2Dsfw+%u>UqVdtp&Ywp zqMRI(GoNQ>R!nWeMm7(Un@jiAZP}E&F$?AV?Q`{QVyG^rHCtNrCaZg6zQyH2`!Hf; zYXRbnBZ?5EXjsIT@Ot7Bv1RK#;l%E0Qb0r!>B2rgL=#tY18aIYE5|-c8$qjvfJ5bP zUQ!Ax8%*XQhLORi*oOQ9tR|VFSxy<=KNxfx;kp8`!rW`)MT6xxBuMuozhGvCcWy2V zG3njYSG_EAu#0VT9B>aT{O|S#ZNK;S%-yQgibBKaKjT+DN!H;0?Arn0mpYrTICB5+ z?=RMoHBmaLo(t#|$I2$Zy znu1pcjs>fxu(`?J!P-{U6n#!l3{Ic3%;>K7MPxbfW%(vnWd~#E&*5HyGpn*P9)$WM zsvqArZk^5g!U^WC(jr-6ADc^iEjad%qkKHQp8qU-;+iZfO5~Kt^kQpwhjU5{(sTDa zuT_d>`Dz8ihhO|Y*$xs&YBPsbnCkGIK5jM}TV2KXvLMq9V}0v8^}qrN9^XXx`@Ku3 z%IB_J;H@W69l3ieh$3?S&Ev3uW9==?&2=CF1@fo2J3Gim;Xkk+3Pxwl(EKesm>C_E zD{%P*M5-|p`cL~@I2XuZg%T<(+Wu*Oki_sV@6=IfaKBOMnC#jB(=1_7pc$yP?cFoj21DWV*r)j-5lOy*YrB1oxvwGTuCdX@b2GPWojxfUyv;#vUx5( zzudZry@7+=rc@OOi_{DrEBKf5)`LfONB4#G&UD+UtD4gc<^}?nvTb+-P%uX)TIEP^7spkUP%v=@PhhmtXVzE8{}=w#)Q-;*;b1;DytKy%w%YB|JA5uJ}1k&ApXCb@{mdYpZuAS?|l4VY<6T zn;>e6_-)_ftDjhw6>K}$_NlAy6`LVvlqMCwW-Sc1L0Bf_+^2W?)#VxbGDOBpSy}e0s`@%vi_Vf6IPaZgTMuKa!;4l7@Yy}j2MvzfJ+j)TCnwqlm9I6PF$>7| zItN-IoD!BOM1U5DCDwRSPf-=;`OrPB%)q#IsqN8{}Bb48P2{ob`Pi<4wJty$7i%^fLIqLOZOExDr(cniU4& zS8=VKXUu+pno$J>Ss6< zM00%gGuI%ZnE5?tT}4K~j}rrQ=Ua+@ceiJYw$L$OlTR)Z;$5k_ruW*$r<^?2OSmCF zEO+7?T#{O3P-9L~zf``FbQLr8r$ja{87hYQ$9+Wv2oJC~E@fYn9&BC&4X>JF&~4*y zcegGfa3W5z+3;82&9M(yzfpJY4o)mAA%o-fNAITrh8*Scg$G?9zhkJ%s+uAL85r>M zn{jsoUDki}?nt7A+3Jcw{Nn7n=KS21ZW46j;l(fi4d4Eqs5+T&Bnbq$dlVC7h(nU$ z9WC(QJO_XU8rmrOPtH}8V;~CzuVJ+r19TDbxo0Tbkn-D+E^?C#%GDS0_+c9;vjLY{ zkZ5|wEYw{^2iw^k>w1;&YGx}UK)7x=mGKmg`DMn?pZeCvj=1s-WHs$G0 zbdC zoO71Bs$W9ER+Do3rsD_?Y8aJ2o9%4y;;0Ju@lgkb**>)iO~Nsnb`y6Q*!}-zv%0!czf>pv6V5Xb3~2`FFSodY zajZH4qGLs9kM%+FZHz@#x zNu&5$vWwl<*y0W2%}}xq8MH&U$Jcc`ItX`r9L~PE;HuM$I%%%qs3CiTOy~dH6s2w# zq_BwL9(egP#7VjFRnzj07UWeNyJWXq)5hA)Ob+_Jb&pl2lT{sCJlAO?n8^3YgdIQ! z^{-d@x3Z6LAy9V>?Tdq$n4-}ZD1Yi}+bd2i^$ zoYy84j@i84`fT;`f-l(cX{(zQElRr6wBs3v@0mRODb>Mylza))hSZP8i(SMP4D9cT zR)z)qTJ_DQ=8jCdhj0HxqlwfjZA;6`?W3c60wDpiVA}eC8)*TagX8bEb74*!ccUJ1 zuBiX{#OkDU-jnnDCr$K5lAuXr@M>v(_#_PY29jWVZ2h>4 zwB{QD)UUnmjYZkb41%2`UuVC2afWMJk6Iusg_n)qf;qNQ=2xdb`=e+=pIo#MY8gy+?C~UxS02bn|p7-on*{U?j^1*%$Weg znxJWEf}Ph3&PYx@X=K(Ij!7=F@PAN#8Q<(%k>~45>@-E#cs&x~J@8S`s}+$|n|B%~ zb;#og;+(Rw2I}eH-WdjcA^lN>Z?*rB)zKyOF{LT;0*)3B8evw?bN{(q1Ihf0_@t-} z;KBJOt5JnZ84Ht2%a8p)dFx&5#zE%e+)S|# zvV5t)b{DIOCt}i~PYG{`mBA)BJ!Pv%>CzU5*g@ zvitfEp=={qa|(RJ&@GR{Sra}!k6nsCBxYhazCK&H-%07vx9xdtno)~){B~$%m~@cS z`N4%2$JY6QRg~}Zf8${Ur1DR_UQcTm;W^xljp961CZIU~P=vHJ~Ycq{yah z;LC?^(YW0B@C;WjTC~gBO^c-D|1mf3&%Z#k8_XGNoYV`(*hIg5D0gRbA%Zjd^8r5? zETN@2r6i>aB^JKwZ9`2iUSTM)E*Rf7#5E~vwQ6RHC#a%KbzwHXKBREWJT-ulxCPAk z!Xgl0X64Y`&FVof;i#L!MWh528hLILo?_hiS4UOv{2lATyr_a2obUX4?G_7wu<);{ z20)P&M5cwN>}d-onmMOvc`9bO8Z_RfxTMVWA&9@nqZYXtJ)C6+xVl$o3adtu1M<^w%?`o0Gd&-79t| zBc-os?3>38am!7f`pWu%o5|Z0hHgLoO{vmDczeT`%QpGW91QI6cBes=?LgvE_IMlL zI!b1RWAcc!gNAH6B|SJBHPqc1>iWe*5GDq!(5#f)E=g#Mgf z#;o$Lv17*QG{8>M3G!5}nX9bPu8s!p{du(!1MRycOuABxO`+H zAC|^Rlcg*TyJ0h)^AZFUFXEf^%vj*R$NS|8rABR-fGA6j`EoMbXw+lE3@hK73LhsDZ~4_5iXH(#>upWt{p zF=q$*%^tg8qSKuD5%|pquGs4Oh~b$=koe|f{H^)3@Wa~|k2C1=Cz)PDRfz$9DgTNi zC@m^ZyiX8)v5L$(?{6WTO?WuP)fqyou?;%9h6c^A_HLBnf~<00!RR&OwO65|>Nm45 z=fZ@Du@*ztWtqr^hs1)&ag~tAMeb!f8}Zc&NZX?-!}-rU5~BnYT^?gq!y`ihS55Ur zxD-A>Y@SZU$sQY^f6`mGQ^_EzwRiBl640^dgc6+)$*BsvDGA!hM4YlAjKuQ>DSH$= zX2P9?97L5mpoBQrQol71EVmNTQJ+is9*9wzqjCiJON+b1?<)A&dKOP#BEPM@=@81U zlM($yo|qZy9vx@>Lz52RAWqFId^rklGX){^Cd`VbF9EPBLKOtjahHjTdRpgwb$-b4z=6Z;r;u(nBfmo9kOWZ%iPt$w z4EpPE#GCa*by=b#c%R+Bl#|6cd2pF$`39SI?}56|l%r@_1DjbfqhP_NufqX#$^q$% zkv;X=O&c0hNj)*O&xl%LNL$+{nP)>;>uPHSdSJ1)9B+JDB?keHh~fh7C5yBg87wTC86I2UmRNWYj}nfG~fpb$9E^+KV^{N?k>OlLkXeFi> zMjOq&{-OEdO}P9<_xiE^2iAHOEx)(m>Y^nzw67(0Jv1qBB`)FiRG*rk@4XuYDP`YS znx3d=XYUC|&BK9j_KKYN+m@&wI7&QS8KUPtn&jL4k&84d;U@P=YJT6LPle9!7^1J2 z2EHwGE)2)4wLG3l1VG!7PAj^E&}~KFlO9}^pRagvU5o;6gqfB_6vlz%uC#$nba^?T ziP9r*03|vxn}aBUx*f8#G8qsnxeesr3{?z{`d(&q(XVES9XSxnw|kypgnz{NT3!uB zQee6a)S@i6I|A={>70imgG6|W4I-heMZ7$8oQ50=_H`~W0FD`Msk^NG)g#!XN zJzi`lx8d$=z@1J@!#7XZG0#5u!urM2X-YHr4UmRu`Y2=BD||T#NrPXdZB8oWGj^~D zC7Wq2P%D^Kq942B_|7<9YgK%O7O7FGrrUStewOKAP4hC2JqiOZ2tm=?omZQ3 zp>FCvul|y!e=xu4rJSxPOwJDfVSa+IE2eVZLG+#mN-6j6w*vuZ@wqJ^Mj!oJA@J!z z`7sEIY_RI=Sjglc6O#lh&*5`B8i6|=5K+h-`oO z5cQB_^e;mG0=hOsr2^)hD6m+LTYz1!%Unlo?<@pLMR=siH6_D#TP;&uPxc{uz2j&1{7)?_H6tx`M) z73$CUe#HqTt>_g8f83EG5@>rJ&ya_+%RZTYG%Y5UAFGO3c-q?2ef?g^tAr)v+qZJ* zOl?6EQ|qC({j;QbU)s-R!HA!5f=NtgOgXI7R_-Ef`dIliP=eeR1`KiU?+Yo!jn5+`{85iMmtGX9@f08%5#xFT zXtUXmZ@~KoVAY0mvg=Re_Xn*h0lg)&KKD}g0Csw^WnSsmniNcETyj2>k_!Lhk_IKT z)!LUypT#q4InJ8vp}(+=N-It!7Xn)!uS&YfSH{np=+&G4XqDaAr9YU4JlO|n>}CDe zjN!i}e$ceg&5yfP&T_XaWiIrW0K@umm=2P8yBzsL()u99`;-IlQL3+$Jnr48@=*&Qbk(pGJLrjI?IzkjEJRoI-FL&U-J6w%ko$ET7fmC zl(RZJD-TF=7Na1H;rnO51L{uU#5#BnSbO~r3BllCR(nN+Bk%tGJFDbQ0AQHLrD0ad z63gBv>vfR*L0gXQhLN-H&O#r7VAwhr=os6~ zzF+qoRm@pCsM*Hq`fSA#?Iq`|-{z-DduLe+*OUec3c)mBW zw3vHt$D%o-=Ak+4NicZVj5LoDIq|uAhl{*5P^+kj5e@%zw?n1!4~VgBGHI~KqbLvBA`7Qwf}4IKxV{`;a^vJuXaOO z>!(AtY6JdIkFtuq(LNdf4UL1XyAROjiHl^p^o`!t4mS*XXxF*SkF_ujHz{<_G$~}40rmLf%GyHi z#=;RVw84_y`h9}^>UwiZfTs>_HWon+GRgK3I@&o;>s~A8Tk-FA`w)Nny-jvyadsCm zqbWq(3XYayVfk!5Da#vYXv-3zv`tK5^r43{u&Qz}uyEwUSge`gC)IRYw*o2jPB_ z45ytWw6-_F%53Delz@@3aMuh*vXcf3*`xP?1zq?YInhP@zS)O3M}tZIeZ*mxtc=ay zJ2dB=_1R7)bJkR^d@!SUhG%Y_bms)m;IarBhelVCY;=F;;9lJAIOQ@u>Yo4v2;HW6 z%iMwEk)(rN{3%<0o>-e*u$so)5XaH$pE{dN2_Ko7!Qf<96b9Z>oLI@;;Shha10t7|)a)$`3yBBwlV6l#(qs)(rTo zSvWomvUXD>E^;K2vOulpnQn-IkuoAr<53mI?rMsQ*LK$-@Y>x*QX(hU$ruwOC?3Pv zU?Ni{-*45etEi~qAgiH?4L8iM^*FZw00VdwD}k-gL6lF^J?(OIR9-Q6G_hcHAtE>T zER@H4dD?|KQR+uMue7r2h$-o$4O(S38E8j#xPVLFPzB{mD#{~7VGQ}~0rfw7PS96d z+1kP)$oEEg!4mMs_$bH+L?Ym0KJfwo$s{-5XW}^*HlSi|ytEJ_n88?T6O4kvwSA8_ z96nq)Kk~NTnCg!UP^7-l2AN_q;6-)YDSDUP@la$tQ&)DZRShLa3C9#?9x;G7Z!r^l z#$ghs*JY*%g+Kl*na~wEDJ+e`G5V~ra{;G3rlkcm4ZqoV=4g{>fZapML0=b(N_fw4%`8=#cdoDrK&5ua9Y#I~!w_*F#w}7U-u7!pR$BGEsDM`a zUt)(NYqvAX0>@ed#a4SKulq(|9o27VXCePHFC~N?vpHbr$kBc&txXtVBl&dYC*Sh3 zdy^8{gyIA?c1lyeSmh-s@vn%gdem$O#M&&JAj2Tc53ph{MDni*~Z|LMyjDC zKJbv$c|`szf>R-MYED!r(Z=hzXAJ|m<4@49?3GQUwmy2Yb0`zfi*?r61_C@FD`lUJ z?xJ3o=-CeEJR$465R~6jM+g5lGe8;ODq%l3T*?#XC$!weWR&-WKdD8#$Jmbm!36Wx z&H}f?=f*lCSRK(@KQ5`Z&8zTXok^iDPZkc7*AyV0qXO`RWh9r>@WQD)2#v15Tk zd|OlYz!_cAR3jtp{yL1)@U(y>_IK@os+v^ zFRr&61-(kzmGWTQ;)d46Iz`OWj8?1jWY8Zv`Rjn%hXv|u^F!p`>$xG#Ksnbwh6a!! z4jfX-0Fe@epkjZEmZzQek5gAKwC7Q4It7yi)b{osr?O$O5 zT}+*2#y#6iWTzbU+!;ScY}5y7zsol)7I7=0)M!`%cQc~hi9|VYR@4T}+w)fWF5r>-VipO4>vCXp-qj3Pa zUmtVgZDfXcI3~l{4aYm*nEN5LdTrh4A{)7r3ES|QwLARlwlKaq_72rTz>?^jnQmt> zP6SI<7VNIxC*MES{?X>@ zt+8F@e$=cj#y)g7Exva9v!jf@zEE=P=Zg}pEJjuFP-di`h#a@=uM5vQ-~?70wGXe1 zIA=cs7_RBMdR^n?cUI~hj*;xIap`n~|1U|_%pxTL&9J`WhZ-{Hgx;NZr7biwIPwdK z0=>R8D8qqAE5Lg)$SSE2wdW@T4G;}HxtR=Ks__AG5HXZ@Epr0_av1NfO0u1rVyz&B zS4B-uHax%kc|Fv&VcPGJLYw_E+xMD9Pcg-DK{((m$GP*Kg&$}jR$ZI5Q`DbocwJw$ z`?DsGnM|D_YUh^aRDR7D>)i`&d1fmo6rmprXvPznrc)&6a*wTTxnB$E`62}QtoE$* z-7EhkHB_eh;sid8`xgOn>B#x}aeoL{X7Ys!b+ubr)u{wV@)u7NLupp$zsY6~5%9iD zvD^4EtGqmWh2cDYYnN3=Hzvvl5?Ei{?||u$OSIr81vsNws#Z28&+@ImR%7FPL{{_$ zypaocQeDt5R%X~PYab+A8G!xHV*a0`%ghtFspg0jxSg|5X4rHmyaNj)cwBEH#*@v`&K7O0b>DFZb%i)r{Ixz9hGJtMn_mMYhd8dHNMjd>YT(FD=ZbjJw70jrQ?Lu? zds$QN1WZrAntWf5f$e*N3VV&xlup%FXi2_tB3_$$&lN@T+lRzMrE_^Gx4GTww}4xn zrp)!+-)boTzA_&&Q49d}p+>;}U{i6{^TiCJRk~QzT-4>@+qa-|3irNej9(Bo(RlT@ zq^ZU_Qn;WE(J;#f7B*IDuPO?A+ycjkJBtLX?BLCqqbjFeoe&cWPVZ3184aMW0=!QB zz=>yKOcr|Ig?}n9o|8a%0v+2T?fG>ZjRq-gJrmjVf7_Z2Cn zKgzxv8rBM0FvdHclJ6&24_u0k58-;d;r~Kk{~JtFcQ@1rGZy8xL2xVR7v{aE^x5{>&CZQUEHJjAEohOogk=c1CNa+&9N*hoKE~r>K-lb ztg3w@jISDbYy@*f<=P%tnk$|_G@l#VMv=|z5vj_t+t*M^3}`kTmh8riC&)xaPG4*c zk^*W(1kv}{&0d1XQ=LW`^~Bh0DG)x%|X$Tqo1O z^Mr7dh(@2Ua|5GD+jov~L6@e)OunThKZM7W_s;2!nLg=R7BbOb3EvtgC=j?eMY-lU zehT#u(MS)Jy_ph5I#%P8qehm6+cnnv;f(A%wZ8lzo|#D%<%{o>i4A_$v%GGO+4NS}C5Cni1h z*M^*CC*s^mJapd~YJD^M0GW!+1iVrG#s&Ua_xf5(aAsaO=JWh)XxJ>(*RmS{`9)er zQIi@3S2{BhuAErfwl$2OrMKv0xCBE_5BwXJg}(%68f2p@$6u-Oj%;>Y+N-y}UeB=m zH{^uY#B(t3^fot;D*b(Q1Izykce}>DSh7`BjVYKPAGLXOK84VOt2|if+CAS}M|XrI z8IL`gAHN`K-IZ8o*d=KZtEhH|(3%lq<7Gpg@FrZ^*{y}mQNlwJ&pPuF=R{OddeW(F z9{A^aW&n(d#Sav~0Va7!4_La554q>qgy|bOO{1t^M&*+-xi;tXVo;$etP5IAOj6B1m@9allr{V?|Ja{{j{rf0vZPbrDNAy z_AbQ7J!%VqBx3PD%^Qkv;?hO%x!3s!7_DH8h>{co=<7Tp`f8|TA~5oqs!oZ51Q1*p z$X_;i@Xd7)68b{}wpIWgRBS)?&8`h3mZRhgck{+(5#kjwZTC-Vpa2Wiu|oEJzLu4D*+Fb@A68#C@|f$VB$&G1$$o6KPwV4J+}`UpxEK2WVK-a7BB`}6TP>SY zu4r(fI>BBotRr3D`M{}2-;K7F`TFqm1Wf#a1dx}@D3PgEcK7u^w^a1kTsYEeW ztVWWg66G4h<(R?1U>@dov$M8jOMK-fcPA z?#n1}vcZh-`*k{x<;VNit_4&IC}y8hl@lx#ES2%%e33@aQRl|e5HP1-^Ram)9+nwK zhl;>5fEQj?b4-r1#B4WarDl;@;FR*yS8bv9_23QP?tyaH3=Rq0pFKTsVCgtDB=WTg z>~aMIO|IkRt@Bt_bV+TlC89z`G@@KfefZ}WSjLr7ruC{{q=F@i>JHWoy=>)h;yV81 z!Yi&Om%vBP#Pno~@p?=Dsi1kq&(l-5sr^;i7~Hg6IWM+xz3(GR=*I7)@)PZ%e-y^j z`-(X{$TvBr4IcgLm{T#Dl?5QDEL`#YCHGIn=3jR^-ab@C2NXA7l4v6`eG!R~Z{QVG zuvV)6c$tSTdCBW-yFY8q8xQ1%`(sxa6d((PWbzk}y zH^V66){Q@ zI_I_Is+4e(N4GVpI!fpH=Iy6O*jaU=Rb4C$`94hh+>11Hj$ZjS0@k53GdjaG)+ELa zH}GSo9ClucLQE zBKZ?RS}mM0RfL?pE>!2^W2UpC9s;1HpJFE!J_9>k&){ zV!RNF(eF8_g5ue)l7>u&mXOCS26nsi-M@j#N)q&eipW?-j>i{O6Ig{JC-5 zOEEQ+r^+imC$tri4>%!*cI^F7W3{e71z2$j?^9N-@uA&IAHDN4Ft5z5)(mlw94OANi2-Gcpo+s!0@y~i={pR zdYTJsO9z|aaDmv@q~8&8+qR8khgzLl-4~xzq@C{(RCkk`c&d7d616Ok`6B#zc_nQ4XWo>N$UWq?6H8TT~vt;_Uj*0b39Mkz6>?=cGt?M(maA7FS9 zjIl3l@;wNBJZIg|ldW5XB_@W>ejna8v{o4qQt|jT{Sn=WHTTiOcJ@YO<<@`IQ#3#Q zXgou{e}8*J#O(BBZP@BDV!C@lffAUNHf_c(JvyBIbX!WrJ#D`b^AlK{~SZL9k zDif@nV#wK}e+pGhGR2ceO&Z_&&I6%xndPL-?^6o;D7-J+I=rQdt{kO0Pnq{P^5B<( zY=cinni91-BlhgjropG*1)p9>%oI;C`je&+YG9HEBvBldi2EhZAQI~x+SsXDJ<{Zp(l-SsGY@L7vJ?!We7CL?ekVef{w}ZG8JzeMs$3~WbbCx z@4hWZ=yD8`wYcsK5!*;(c=1*zG^G38l@`V>48RtZ_O_+Hy;1XPD=8~*eINTh)5fD{ z)}E%CZrQ24{ZqRCUbe zgp288xm|!FLLN;6K-WH60~?Z1wla_}3x|Om;EU4JdcL?N!m4vU)gy}dde^fQsO+^3 z@bjM!&e*r}Z6J9@u5I506W@Bq>>1Z2;4w~MLnd2kv$Jm|gEwz=&O1X~PoVSSXv$nW zmZR+JHs|FZ$#q(i;V*@Y3X+eF_nxJzy_XB03r7}ZUei; zZq>`SXCN2M^hq#qfCr{KK?H;uG1zqg%)AXEFHg4)LZ!LBFF?>}-|^N&Rb7TZbzYp^ z?0<$S?&<7g9jgKV-GptZ8M~Slt0Y-;2^RU9R0>qBa5@iXldmP0+B?L5~85rm4>&wk?hPrnykA^#@JcR8;IRq z;CK5P!Dd63q$24ePXAfMEKQ>>NWLbd8P{B5JEwnx@I2EF4NaUgN>7q?jDSoWz2P*V ziqbl&();&Go6&c^j-WJ1KY3vkm8Yc}XoU#ifbnTh1f(Y;DAy#JS+bK7OoE0$guods z<#?lyp7dO(~XZWxV62YQi;#lbdE{HxS8`PcY(jXgTtf$rbO+G!=!w>(J#3R zVc#|8H~3y;MxU51G;r=Z>>kwdL8y@3)&?PrpMRh5pjh-g(47j2BfIkcj6aftf4--g zgS6boI(0oazQ+15SMy%?1dYw?YS>z zt?16VtJlqQ#+!C*N|?A}ux+b+YLH{-$BSNV^cF7H(m-QfC{5(P(gfMy>w)qK`gt%r zy{|r(cSq%>gr#!CSDyh~haGqfp3_DOcNZc??Q|gE6|6-;^WC<+od?V1%6_f?zkG`f0 zlDNB8nC33>s9CI zNh>L(B1SJ+ALsJ^1GA#?K1c61YNiGlQWuVxb+XAh|9va{LF-oArg`~Na$3Wro(4?* zx=W!BXf3Av++2E!&)UWxG4r0IFe7P8PokvmtKW&f)|BROiI%O0fQ9rp#aCP63Z)&W z*`5>uwL6fR;_is6_%}VQuAZ@L&UJ2ynaYg^-^hN5pR2haEMCZ;2dxHVZU`f$W$P-h zvCHko3Ih3(%&8R!`9%j)>5?MaZQKz~GXfjlc*Glf1e8Q~$V%;k%(t+cF?U?6>pL9A z%Nt2x?Ov8hv+Utr6vA4P$|1w120I2OG$d07G>9eOOz2YpY#e)l}~=|a#EZa2-E1Y(3; zdqe<($kDa5)G(U|uayP+;g8N62;U@4iJ1w&qx)kKwgY#vw$7x4Ja zizV{-=51k!c%Rk>vXHxyG_j5#Gl>42zSUDtdC@CyIkpbomv~+s_#hVh&X3}ec9RD z8~Ps~tnOWFk|dbJ9wakvM`au^c+Unrk#YNCsL#a42dP&A4+?4FrNE(q8E{FQp^ldv zRPqAM?sWba0_Ya}E3e>boC7;aW%ulT4U|a8DQj4&1-Hw>_pz%$ci4>y2_PqHrm2%w zW3Xdrl0_jXg)T+j-)%SbfiyxarWKZ@u$wmw5-%eI(h z`*lj7$SM9*X??oy1aWv|v?mrMcod`Ur45&iA z^a(GCZi6E&(u8BZ)m$x&)-y8G;uVZ$ z)%ltEL(`*ZO8U6myj~r(T;v{?zbv6rIur5x%Y9Kt$yrfjMFIbfgI7V}Zwj>XEtQPz z&Sj(byIjWt`LYZJ$44z+%Z#yCB(vO{Q*%7=QHK7c8)KIOHxADBy;cOL-xm^acx}O~ zZ5NJLpCGp}lLZ*`kE*crn4Tn0?a+-Qy=v*tkcpovN>jEgLjFsgp80qEgEXGLUtAt< zEcfI94ZKr1w(qRHco^t6Tj%9uI*gBt; zVTI%6w_z`JH|R{+*}}2~$+d-u{!hl!TgI>q5HbDlleWKOy&Fh`9KgtkCQ4Yr#9wj@Cou%yJYbE{@@JgPU{$_on$KYNwB0Z+u{I&M( zKY3^d_TX(WEGM|aBO+9tfe5t|QT!k4Mb}HU|B$~VGBD^b_NgIBwZ+n4N4T&cav{Cn zm!3l>08&Zh+Kp(*n72L><0slFl({pN@m$BbV{#1~h2g>xjdP9FE8(39-=!QQS~K0> z8t=HI3w0nnzxPd_#XN(Y|e2d8J*^_X|LjUnK@telCc6aC{ zKWTF(HEH_T*xh%fQiD;D&hyNbSs$sV6`%R~4iExL#KBwA_uFZ@&&iyj=a`My zYfo04RE#fO7F(|dt3dS=K?GP1n-XVm<_F04a(n8|;lp;oXObq^WXZs%%Kg343my~y z4YLTGbSpSPw-O;2$0qCpX{p9Wt*s5!VO>yBdKEuNl)-Wj3Qgu2X6+$c&Oh)?T)Z}F z;`_4e6gKSvW7rPM*Tf6k2_!L;+vhR?9|3#0R0txLQqWDutSD zB!I6PTYltdT4Gc}TILdh6(GTwg3!J+Kj=>fDik zb2(Y6l-kFozh6Wr1@9|?GvL*@fKsJhJXfc9Z@Rrkw*=sZvIbM__)~Iv2>2 z+8pVB>-M4wTidRUv#)};G`Qu&M5j1Br~MgeuMsnKPcg~6{_zRW@#bk6%1*;Vy!G>| zJLmN(ARROYi$Y3<=RqX;P2?iCWr%}cJCFVAE+cJnGfJKxvWkxyY+)BqF(QnTd26Lc zGC!6E-HH7l6(I^3v9jVJg<5`0dF`uA)HNY7s4-S_@3PUxcTp40cNTJ;r&|`2bHo7Bmn9eXRWOskfOJ)LMmd=fzn-gWxOv6ww&J|jSXhR5VY6tx-iorWj0A)0?p+3n zD-45n(vBzbtYb0hV~|5nF`9y>axS~#1o>X$3*|bH3_w2yPU~6B3lOtQ%CzLdiJ3>i zRSsJU_D|rq_Vxl`Edl;O%AOs0A)nr)-OU5QTyTjQyhHGe9i{u%ky-Icb(!DgrUVmt zA;PD8|97C&4;VHFNwEnR9-hkOkZQ|#1;&+)nd!crU+)_xZBMMG(WRl@ytP9_JBt@G zO%@IuqH4DHwWYm%J8be5iM(U_GXNd(YyASf=AzlI4Snz5llLScW_Y{OA<9NN_&i?F zrxmy|md-b`^k-l&Wu^vRx**pq|8+2|ZKhMAp$`B%mz;X}2`p~urK1zCyAaCg)UD~e zo?}F?a~}11)0x;XdH%)qDT$1G(2RSBWP|{2f@p6F+rd)pa014?CW?kd3p)Ep?=VW7RL)3bB-)|6`&#Sl#Vp8qDNC~&5+zJ;o@2`I^zL3&_KZ7E zW~1+AP|ST>@iB^j2~)oF+6xr$+_#PS3l`wlvRlm%x2Y0D05i}%SzdhzALg;eQ#@JR z%QWCi(+mWQdcrM=w<99!Vbs#Mw;k>ALWz7#8ggLacj)~9dyHm(F?nwELBzS=(YIm$ zF+W+o_ils#^F@PM2?9agdYqVx%(f7saAaF3&lXo~X4*zH4tJWibVIoHb%SnTr!;pb z4{Y)jOj+mxt<}tc<#pIQ#5tB^4lsD<+p)<{7J3x}rQrCjko(&24!WOgy!eASH;?Vm zKq2Xe96pSw*}`1ebQ&;27;c5NO;3##TXzPAw$rs0hhRle1G{n{_w_WvQ2AiUmXthZ zV4o(BCG|LS!s;QqeQqDzy2ha%LKOP;11cDH`{3{+6YsykKsJ`wYa6QRdlTdpA$Ryw z8!RG8kGrgEKV@FmGg;}v!|~`jkPovyKr6K8%f$RtC|rFM*3-E~SbA2la2yJoL|XEd z*Kp1bPHF6Gjz*Mx6*iga{h;#ih=Kx7d%@nXOgolvd8Y(*)NQ`kBYSl{8t(;s)@G=^ zs7WH+ej?}}?DSVI{deM_GOI`(+p~u5Deici?(zz2>fwcn>Yyh4!Vvs*7USvGhmg$2 zb9nn1gEHS}pNqx`s9 zW^xxfR}T)PgMq=J)x*M{dCfHzu^Z1rG80pES+xxrNVqOXkiz}^-%UW%2`0>l1|qRXrg>m_n2W~sIVny zJvD(>GEm@I2KLL6;#!d|d&M%?%2IRN<_Ub7aiSOIX#0OwE&QLBW^DDGT-++-^7Ais z8Cc{-cHU==*fiI)E|d>)7|@}EVFwNa{x~Ot5AW0ZDn_AP<_{#-^0F-vv0E*N=Hve! zNOm%r%L~Cgw%F%I*ktF|!tw#7Gis|UbNOs-KuQW72gXNe5_nEWZagrm>61VR*&uWo z*7g@{)e+XTv35D-0M%SO9;FQ>{Wx|22l@s- z;}xtJQVZwuux&4T16LV7OEnUrfLI;VLm4rB@BTa?L7TLVJgKFb8O-+hq&=OE{m;-z z2N->aKCs<;(470)W;Q=%;R81AyE%evV&W_cDfJ^;)WHQHrdd5Pr_oHf4YeWc!ainSS46X6Iz}FQ`#>4bi01 z&7J-7&p#P{E$r+eYu@K^K9GV95cE`Lu14N5&C$dBTF2YA2YpHD#(rx_GX_0WzRH%| z*XUYM&imZXW$b9u2G$}^CmL7l-8)LVdti>&*Y)>$+l?NsSlh02pgnTVLsmKN-Sqtf zFjMx-h7!SmHc#iM$S7wp^cI)GhM9i4#o8W}QIjCdgoiP#c@`DuQOs`0r`av-CcqxF zq7C9mnouGylLk&cSR?VV^VG;t1?MBjZ~j%4w4tHbi>wpqI|s?b%U+EGCtOFLimb{0 zj3OoVqysS~qm>1CwTM3q?`kopg36EeE}|_=cv)3gnN(BU9P+e)ICkrk_xCtqaOV>1 z{*G9Ct5cgmgT~u7#Pp3|wyeX^6Vtwsx=VL7_dRB^IkC>1s%NWr{(IR`m3Le)vSr8q zb2);BTq|f_aX%@=&|Z6p?iAOx==u~d7%J`I2pjFPWA949&RixBS0;S(5$0II96e?! zNfE@k*;}c5;6KJaf(dn1Mgda@`vcemY3h)~w5MvVvp?ehW(%7;w_e@+ow68}uJnUH zWX*N7lMzZ=C){vt$PI*RBa^>k1Lh5vGx)jt}4yH`^AGV zoI3_VTD28`9RfCA?Zv^huzoD^Th5^YkfaBI_m61TV`>5?v^HX6+om>Ivjr* ze*+IR`siwRIic+Repa2r+s@1|#>or3O?5Fz>!};rhIsre?k8@tu51)rphbcWiq2$U zex^2=veS1yp0D+mbheJA^{32^mkr(@Gf|wut@Cw4e>PQ|!M3^!Xk`SO2y_HaQE4wU z_4N&)*t8f(Ru;~)YTDm3>WYV`oPfwm`U{VM{`@?+jAy4wo|U$eJf1Obk2wQn-IdVsLhtAWX*P zS|NPWMtf|NZ?O94ambw7m0t@cLK|H2P_ygd(*sw1#>kxPlRD3_v)McJ`+a*}2q=t$ zQDV8-G}1DAY)EKUZa0lREovh+gWaJ_38^G78=EzY(y|8$;fDr3ihY zlfCye;AjflpWxy*u;vhL(PqKt+PmRi{Xd${JRa)3{r~5bEy{Ar8WM#p+1E_S)+s`E zG8Bd^Az6k{i0sL}i?TD>vkXmS-}gzV>|0}B#?tSabN{}7-H-de&*_|*`F!5*>v~#bX&46M^}taTg`L?HWXQG6}Da&<4Fw65koCR zRm{g`#wMJ8Tz)x!XP1LPQ}sH$5u1acz#?QN(x&dKd<1I}FnZcl2)bI|6+ zPE=J%2jJ@(U*)gw4by`k{*&TGr3dQ04nWKS8!+4U&0Eg0t|d zqL&fxJexwoZg#6W=Szma|WA@sY7Hrus$3VDD?)W>(%dzx#EF5F;Xfm`OWm3A) zuzLch;*8^lteHy>lQtx%8vn2j?y?F0M%}ZB|Co}}Njf^6-vKJj{{2w+S#OF%DX4mk ztf`(JRLt~an_b737DClH^(Y%B{XmilBVd*4J%A(-%w%aVn&UeTKjc-th!#0PgnEN8P9=Jb%r}tiT z*VlV|Cwac_;k`l!EeJb*-)2|P(&muA*X2g6AQwni89B4CB2mI1^}y$Dl*y(0%Xk?* zMUu~(x@xlV+e%TBy}K4vyZ*qu@S#*pXD1PT%JaEZplB{v&=7vB&b8jeB!8ac^SgU7 z^E8hrqtdTPk+CwaB4{U9R{+&P)-$RCMHd00m4M@bNV3Ia=xaDT2TYSSW(^1*dh-C1 z%SYx-r9%V3=ycOrlv6Y z%Z5-XntgpfrlzLR$bw6_Q6`amZ=ufH$A@OY_Pcf)(e7{M55DAcd-R%4eWoIe=G>t1@og~oqb zeG0}MvU;T9xutjbrR1UMKuhnLiiK?}-L4${>@pjW2;3iuh0MwlI`mObIpo&5^R zs5h9rAZ_UVP@}nsvO;!w`9qtHtxA8_jhr$aaO0UW1e`gBy9$$4vuiF;3Qh@>|1{zZ z^lFYf@o=d24XB6?ptdJt)22NCdt^z*cjG=_Ntl-GK@4`_ks3Kp)w}M~mwo;;GS296 zS2a_ZqmG^Sp9Zt$l3I)>=ZaLA3^>nhaGnYp<8I(iB;6BzW54#otPD(!7GVXw3UCjI zOf`JRC$}@U4>T8C1cpeQh3&Cgxg`9x6PL)BAF9IUePQqXQh{xjWTZOx{H`YL|))0TsheZZq zjqavT7G&l$A0;bJ^?B5D5Q`V4yfdK~-mY78vxABH5wZufcL4E6F$8uDh-@%s<*1%m z+aTl%?MLN?tY8(moF0TX)kf$drL-Op;!peAqDQ>PEo+5k?WW1+vjjzw`qQNoAl>VG)U(hY<#=+&1{(Y6H*R# z1lpV3@_mP_a#FKWO}Mm{3JH{4RrFZnmz~bJdE1LS_$5jI#Bu4~$RUbJMh_1aJ5PB>Uvf1|8iw;dZc!iR<$)b}3y zGW9TG73KLJPp2y??%AqS=LJ_%6#3b4B^BPekiFo-Xh@@>y90ABfG;>Zb`bv03$SYa zwE=v*kngWYsL>(7_AZsJxL?nBFubYE2okmic`c_pefQ)OTex2uuaQZ73x_9|yK0(| z6tHbyf#<#!S@pXTv;L=hb$kkHxTR^3QP*O42wpcKFu~afmBpS>3;VCzD00BmC+WV= z#DsGbzD;Gz(LL6W(SAJ?J|E-IMCATPnXJZ)u+f!%vf|K4{PngoV{N#PlvBMW7JT0K zi3j?9<(L>Nf=eU)BfkjD_gEo|^e8gq9_ak-2L-G3k`>@D&Z7=s<@o$kazoMi*X+M1 zromjL1}ZwyPxqd|HTj6@%aYL%Et?vc-b#(=z?RfW(wjJM%G93?NFL$)op*eDNDuxz zVme?NueN~-CE};L)4lUU?id2fbF<_@d3kv=`>i3D4Cpm6Q!(H%aPJ;y%%<0=7iG9h3?MAyK90O=lweLpgOuq9-H|N^wB(s z7Og}!G&St!S&~-skX}LRWnCU@%wBidK$)Byap%xQ`eO)-d!S!$jOXjaFg~Z~BZTwx z)x9Fem;d1q0gJ1>((QH=d$gQ=Z*GM7jm$!s)#ASs&V7w{Pgd82{dd0p(?-819iDy? z@uOq+8Pd#!n3vlP-_JyN!tH?A7D0W`lI4xF*Oi7Tw%qut#5vVTPn@yB#NyBC@Hgl0Lqqf zykPBiW#v8;dB>#eD9r*c{4ZPI^J_!lC(i-8GSdPnys1Z=77HD2L;`fBL|*?={#x*H zdq+h^fwisx6Z%svMVIV6ZM6Is`O%e~G-Tyx1J)HO1OV&3zo#<)__6KwUVp@)#>FQr zZ6f01z`?O@X6YoHYI!y4PNM|k>w$q&5h9?l;t^*l=;#pkx)XP@1?P<=P&endI z07AO~wd|rL`Qw>}89%t@7&st~`+I@ya<|JM>}46qggh{|5rTE_|NR^Wa!Lc2t}^Tq zo^*|Q(NzLJFR6fWcct4?uXj?Ligz(?UK(@I#XyL6)|^>YDlAbr0T{(H(W-ng8oqR6 zu0%w5n}NZ6g9EiqXnTG^CW&xku3BO+vF33W_khPjVJT$})3}~?Me3&DSPgHg6m9#) zW@ngTQja|;z6;eTUAwX=z9sBX_1*?lju21Eiz06%9BW6elN3s_m=Fe#i%p@!Dm8LX z0~8UooIzc zU!t~YXp-w!O&U<^7MxEwr)poBvV%dY4JaMo6QmxHpfcj6$0*>zUQ*@sP$?|OE2^#i zU&rNf??W;Pl{a&0nw3)u8cObGNLdt!W)!ih!c&)Vc~Q;k6X!6!HR*f;;~g11u=oj2 z;D7_t{&IWoXHO+jIq`Au{R|`_^ZvkW-kk{Qzicq5-)-C7y)dgkfvB_l7dVg)S6Y^k zMRv-6Pe+otw6Qt(Retns>n@0s-+xDPCZ)gIg~wKsoGG|J;eb`GMTZFiDBkN|xr;n# zPBP_=8O^fU3W~>Nl1HCi&--t%yZr0EepmR3>S<>OM&a|NfJ6`!3_!VBW26@C(F!3E zO|d0*FfQ`;r3+wnQr|O7GJp^V#KTZxhV$_sz@1XAlEm!&p&=1miqdHx^A8LlgsJ=vQJ zUuoYbs!i2CG2Q8$29^cuKdg~E20*@$8{CLX_cK4r-=48kMCOjB?d|T4&e1>miHq&! ziLr9&Yx4f?guCo7n%)0!BmsAvh)sd`M@aYTIbLfX4O3wBLLA|oe`STW|D}3CpIivnBP`L801((o1fXs{{ya$p zxC!QRqaFb5Ru>!mAXg{xQBE6v?Yb8q!AU}E8aAb!k5S-)QBSBt7#`0jn--{`e+Yq19;J&Thx3wQ*@wznx1!(2&1nz9ZJXUCd58~Up5 zDdc?V$}^b;TkE%&0ZWf3vo(W5;$E%so=(x1Uq9br1A?pk(sGa+vQ}X=2p#-`w3iJa zi7;&6_Lm{s0@LbMXpEIwBE`B1!N6z$Gwm=#fBARufP%fz#u#uG7vWjpd6@G)K02xd zPRC3r<}NI#;I2hhwEI+YeI9K5^#SVNl!M!_!Ud8fNVEdzAhiqnu6VF7FHGHfk4I0y zMyrae4PwGR>Ql%)LsNih*@deTva7Gps~vJl^eq0+$G}S&Zy)p!Q>q!sUiwQ7VG18u zU_OTgI^Qc2>>lt`XntG9uFVRrOlxCh+x^CjvYWs}W*c|8zJJ25tQ-V`3hO}riEt}J z4bh^3On(NPDx&ORs|{&qMjVRCpes$Sk;xq_GP|c(#{@ObVM(Zgj!tgE-5kZ++HEp% zFph-ebfsCiOJVm?8=(#}xcaU?3509tk2IT)ZA)?t;RO2f^!cJ%PjV^( z(h*y}L|u`n@wK~qx$T`>EsqM}KIbV+x?9~+oT(`my(B@AKU5wRamn0Qe` z{}@80-uh?r(h)->Q!r@_Q{t;3__J~ zRxC#QSuk|-W5NV&?|p^AgS`D8AamYRd~-8?fgerbF)Q?I3--5c)Q%ZdTD+TTXxLh? z0OY|N4u$ioyug25YC9H*v_!@5+>7Qg-=?{KY3#HJwHJo=haF0AIqC?mkqf#43;_j$ zwuMfJFcKtxQIM^~8X_(970tP5C%I#1=PGc<9Y1=QH==G_@^w_;`m%5};K`!0HFOo% zTeiY#oU95|78&m8DQbf-V*37WvF6U%xZ*{fmrMjqtFfRK9B$tP-w3m-0o24%E(bgj zsgAN35yU@UA)dDJah1e8@C<8F6I>POy)m6S)a^27rYhP)1WXpm256N8mqfeZ zptu<&P8ACiGKI{9A=q~)5uQ|;Ep}9@4k#*6@82IArc3$;f1)_})&4dr9{SB}EO-(o zm^G$covM}QBQq6#@2=LXBDMnJ7wDI#ivi>zNHbjz*g+lDuiL$7U2mj`%OA&5PJBq- z7%IH&ZklpJFOMnjb&X28w_Ea3RjTj_*+#GGz5Bpaq;o&t+}qKFwK?~er7_!IJ$b^mdR^um zD>0;e-afdH%oYj!GR4VGByyIx*}(4R`Jen@@sGVr7W)7&87^&ueiidZZMOj{`$=(nqTZh_;EY;p3U?CG z@nJF8TBJV8I>o`Fyp}(2#z5oAb`<^i)6UBsq`9Zw$SIN<4j5R}1zlK%f`Wy}PgrqB z$A>lHqW*j&K;?jRs@DE8&3oYCm&(wI?WOq{&PqZPns1@*hJ^M&IGj7_yI+ivZ!3rj zz(G2ml66M?Hl}Nny3wuP_NYWdHh4cX#Iju6?3NQbMj?OZYOhHpS8k@y)_r#dUx4HP z@pY%jePRSiL)o7{JY{(uWP_4b7<`Q)gM~zr{>nD8`0>r|$If7PXV#JpdgnLC9Ql}) zf0mK6H^J`y56Ox%lu?n1MkQOveimVAPtyT=I)z#oxWwXT&yN~FJny~7GN@|Kg^2qJ zp_5P4JxgkP!Ob1MHZ>D?&?rnZJt%@ zy}^@on-2Z?&kM_&3JULi0TvhMTr-hAizqbmLw%=nSp$eiSJ7C86ak4ng=>Hnnr_9Q zv8R0$V#_&ZbN?C@xv)JW@2oJ}Sm3M1&^_Jc4{JHGq|93z@z~G*?OtLcGk_dzedm7u ze0R9cvl=->&f^!1`Xg+84A}T92s(E)vtR8XY8;kfvalSql%BeO?G0_5_vO2oTI=gI zc>7aGNH*ub-&9)On9<-&c@|;acvVj8u70uxm&jnWcfZ<8A#C?!4WDN2w=%so?6=Z0 z1$S|;E1kVOjE6akJi3PU-$N(he$DN{bzzQmQ*-6$-qP@HlkVM_ zb&1HdUtyQqmmVW~PQtwx!`pc-BfwcZ{P8kX2yIxlSbhkoP^uKc$qU;mAYfFJmN>#! zC|{opAw}|q^oif#p&Zb;|2-_-Pj3TV7r*V~8LpjG1t z>_9XPLd{ik5a6hEHcazdEwTbd{lX_LE;<(qT@3qWAbxYwVZ{=*<`H^PnwJqhMai#p zJ%y+NQ|34JD#h`oW>M@6Bu;10T1D4<|^g1wIMyd2)R1vtR$nCg4A@S+pgq>qn zPZYat{O!c$Qlt=U>inrEIxsc-@8p^XpRN%$bGK*ol(ECAbU3hRy?2-t=^u`XL(>Ly z_?u-fzCPNSK`ff!9gTBx@ zi9-yQKLGzFkz})u1@H;i4vfxW#l#sKs!=4OKs zQSm7lwJA1}?8%pWT%A3nVK&nnJ8A}bi5Q40Zf{lqk*O?VE^?>gO`DTKvl@>X?rxu+ zL$8@$NdtFw!|2VvyNR~Thk%0y4e)oCZoWgQyiIIOX*pUjn>7GmA2$EcRzT!YfWrnl z4jDXeJ@>lvyw>0o)J1*b5;=M-7Fh$Yg7=FA)k#ze9l)xp;?tvd_TM&cMNBZi5`9gYj=RPTp zF`2AVj0OXQdnKca5h(e?Me0-7vgEE0F?apu*^VJ8fLF*Kdy264UcA96m1VQr>fHm| zB=j=Xg6JKd^|`&p@|PBZ7p=47v4JFUndUfcA;nMX#bu*6NX*k=QYFJ zWnf~QmLh`NU8)D{V%Y6Qnt(HW(1cbsii6JogQwRg4(afYV#$cU+fnzg!98sVLd783 z9WKFDJFN@zfvNqkPC@A>j=eKJ)030&Z*Bw2?~4KeFyLFkd^BA%;+aWHFgf~l2%g_W ziTi|KWqZpsNcy?*eA7(KyL<)q>RLH>=P|%N8aV6 z{h!Q%V4~i{z93Dh<6z`RfJyyoz9!jFqD&(UrDa(e*8-~mjePrx1}qPPjl%v>w7^eo z!B&j5xR~dNxYYj~iWh_|72)GmS?<*zOU8t%GY>K!U%)+>8DW0z40~ykZ-LNf6XZOVl8v6EJ`ao7>z$ z-7rXg2zcg>J=IzOyyqxBPl^Cr?$1tnoYC&D{PQKWmm^**2AN8c{oG#3sHZON?$hmh z2I`Q{7SKMvO~9$UC z{{xQ4hLjW2-BG`$rp2XAy=jsy#8hiQ$;4m<;TW$h;U?t$H8xM?MJmX5I{Jcjo+1IP z?<7nn!TXZI@G~BQctHx9|2)2|Xo|Yc2gb94xzOy=u#ra4n^;R2Nd^Oedc7p=sGDMk zD+2mAw|?LSRdciFQ)&a2U7hAm8Z*Be32HX`YGna-*YoL`!{5c5cIAl*2=6;Y@Ds4p z6&;T1{03ZT4qEk)y0jS!N&y}FP-CC&0};1KACpc`OBPXWBHuh zQyJNz$z9otnsJH8eu_bWY1T!6w4>|I;N5N`c2NU>N&1?t65E9^;N-ZRWa5oXZ6Jg1 z$9EoZ7=u3YA| z0iZv~tIaHcgRNoRoMR11HdJ3D6TR3d?8AO7N(6@tbd$3R8LQ>bJaL569+pZjoED1gju_N7;f0$oF+@ z#~az9N19lwNX~l?J=h{cVUnW9qxjr8?i_`5CCsZ2Enq$4LVV*F^iD)~_v2gMkji-a zo^t1Ps!3KafBlU)VP#P46T%dsu#OMYFO_bykKJ39NQK-S$7T{Jn zcULOKo7Cbh9D-MOR_c~$(Y+>Sj_pB}lw#;?t2kq(fc>fD_mdsQ6`Y(sx<(Q=IQ@dQ z6>OC`F7}B%0NN&jJydGzuTSiVuKGw_xznn zkV1c>qf} zmsvag&_Xx$5;~|ZB@?~bWesOTPFBbvMM9pq&VbM7PR<$6i)D2+guiPn4jVJ>SB5ew8HwMvT?+!g z^RuW}2Sj7V^?XRm{LBD>4QU(;!cZ+T2h`OXE?4QQfCCz|!wSt7dsWp6t-)lX}X@}7ChjU@; zfE-?v?kVbk}T9lb`PAUBIWTAB2t!LiuE1h2O_`D`Y{cJ#5WIcjE5FBZ| zJk$zCW9He{t@c+|+Kg{FGw)1Vb;shqX!T}T73c1$aa@qbo++SPSiWv#W;;+Q(T&90 zSEp4dN>sQoJP0~1U7zW`@$Bp0&k~Lwrn7M8wcoJ+QW0YF&Rk(!qpHZma+fH%9l)M|=hNZhB|4Re(ye%y;hj80{^6I@$qNgZq)chnS6!bO8!!jadjG%XI=PQ88)-^JhA>ZOnFC}hPX zn~O5C+eA!PbSw1FtrUs)J@=p?(?j&>znsg84D+&-cBom3GBIQ4FIbI&3g~6lQm@UH zk`DRnQT6O(u$BZ^KHB92Q64RD(aNvjmZ)~#5Q>V|)=JdM4jd^WyXc=+1Q8M(ZzB<93t&XfzzbcYyRn6M~ z;g@#20S6(yWHP)pRt=m~rAne&e5-$|dpEQJ$E^GZ2@I3GBYC(;m6A`NqqUY@=~RBV z)Tu0cI6~tn+n&SmW#Hg0V{yRv&Y7#pL-N>*!0mHGf9z0x!&N*=lQN zcSY9M2fIF13T6m<4r?+TyOp0Iy`r>zR+sdT5F2Me3eoiiJ+=H)&QTW+BjHGwH=l8- z0yoUUt!BxaW$9a*tneeNeP9DiF69V#%=+anxGT*H0#0(EH0p1HB={)5^D9gB^HK?D zjV7o98K&!FN&{S^-o2n#6xk{*pQxbMB)_V!tVk)$Np}9-5p`YX4*crdjXcX! zLW>&70)cJv8p@^=xZ((@;(I9Gf8tB+1C~!t_UMNARsrpIsuSv}{ldhKe(c-`KA&ttN9nGr8>T5x7lF16!QssXgVB11d;;L@Z& z0!6Gyxu&yKe-2+<7hoyAedk>F>J);<~cbcvQ}NJBDsv< zyW=Rcq;~(>xC#Egqf%%YR++E%Wi-{+q6hp&>RB^Y%u%N~RAFb&Tb{j=L9eNe5lvANKwUo7?u z_l*f2n!#lKc`Dllcuiv9wT^>da@g^Bb%5Cnpa>MKCO+^~wz13r@u*%!G!qt@R0P6z zbCCPZXg9zzYU8O2YpfBBI~)7@Ki^drm0MiskhvNixZdeANkbgD@lv8Cp398E7Ky&4 zjGfNT@}Kw3*EvPK`H325-DG4L?E_!jP&6(|%M?xE+EymN9=4{UYcS^c{D*IiAy<<9 zrWYYcMBGQeU$OOwwp>d~6Hf2=YbhIb!`;K3LMb>kg5vSbZgd1oK&W+Kz~UTx&!F0S zibqxrz3bPElRLsG9N4{3AKBx2PAj|nlVK#kox&AYUw%Hym6&j*YVsf(H^hSZ*?Aj& zhv4FZRqeP)JWT*Ac_+M(`G4SRd!YDwvp-W;ns-Hz-&v5%En=hLAkyYeqyV@KOkVld zUm=sAA=*NuJ_}Z%rdSy0L>*r&fSj*iRkmAlzfr6MYr>@lJ~JbOn))Sog)(eKDB z0eyzlMHJF&(oo4QYJB1z6e5e2;AbDtCdj^CI8#hb`amW|Kq!o5X4<6z)B>hhVkSOG`uEXrpVLzlwe^x%ULj=H|YJ^Tsq6@gute zPE&ytfW$V4`O)R(xWAE*c*a^BaXAy|q2v2zJYiY>Hsh5@1`N%^_Egf#QfW(A>u>X7 ztt{&SQN~&Hbux3%KZVM6)wJS)@crvc2M3-+Q{Y-QF9sYq2h&TuT0Z)hx3^(4=nMRq zH~qz-e7yvZm8_S>?b)@p5>-Z3W$-e}1^aKmI*vHcl=ishht6e$q4@DY{S9K2estqH z1UaTHeaf?%%I7%%h2g{)z^cVb&{ANq&S!b9ZNSSfFY8!%pYoN~)s$D3$hS!B`tRRu z2bXE7Y@rSAUM25(`GR{#Sy!1<6w>{*A{ATJbJN;BIN2$*)cK|5FD3BSRJ_c}E3(~V zf=x?@%^DV2(_XD62P0jr*7!?~vAipGRJ^Fk;rR~j<62+v&)!O|VhH?Z z-Zk52V~;%8EC|QUkl^ZtkJuoFY)U&IUnYO!19`ZcU*0MF!W&icQ4`}4CWamnurR{5 zM}J-zew_yX#WtnKbX4>9^uN!MiDk_wuX4KB99>-Afri1c$6Q)=i`WUJBZN$$$)C#M zy`VGo0e&k6(N^bnLi8m?X+RP)3)~Igv0HhrW%NLCxn%4S>OOL^>EOu1~nHfCb+ z(Cia!TqaB@PVRsN(xmA7=LCC28{gtCJ7lDQ&et1O|K!)B{@ifq)vD)c$T3^Tj34{X z#HxAza@=vZjq71Ln)xY5j&Nb0fXR1WZnTim&eweB^3s8t-WAUy&pE-lzGP1XQD>xJ z6Ps6Wo4PmkbvL!Dje5&drK3pU($cT0X=)=vrf|)Hm5VKPYVKlJqDbFL=sgV_O-8HW zCp()_L*?4)M+EJT)eix^Tn6PK3$&m2F)oN}l8J07JoHN;4&elg|AaFCr# ze^F;d4C`Ry0m~ML_`6J@3cD2|YRp{SAr26p;vd&ga6Vk+_F+1V@7(>dGm>-qqo3^g zPX1F3ZDyWJBV`&e04^`ASh=1&?mRH~_wZz(rTXUnjV~(-ZLj-iDi``GM|S)LD#FGP z<~fAd8vC>uozYzesgJMZ9mX%{!W(|qIxr1;s#zfT`1#FfOlD&grgt~nUhky<+zV2x zSVSI0U4z)Uo9BJI=?&*`Pg~a&xjH$?-Ku;Hp}dP=KK+lHfM`c&>64Hs=?%+BCrPLQ z$F8AU`h~Cmd3##<$&JMj2ar&mP*CzC_N!uGalARSgdI4pS611kFSyY+dqNB@3c{(ZCag0g6t6RaYcE66$RvYEq8=iBvC zviU|2#mYtFym1e$QBLsM;DcT=OK!Zsw)~NgY{+NK7I%T7#Y8DD-}~lIWNh02k*I0Z z5VfQKYDD0hz4lNWserok9!1vnsk=CqnX9*(DoS_SU9Y1$bMJ~DgT|%5t4i~p($~Ia z#ao?bI=S7;?yEaVuD4`>f8vW8>sic?>{RNXARl`E_0l8uB$ET_tSL9H*W!_06sZ-- z`9+c45kRyT;Ul6R6XPx?AGkxv;-xD8f(*-_; zLGhO>y!+sv029_(!&O|lQ~zfdj^0-5Iu!mA9e0}!UoPHUMli6-k!z8|mjU+-{TUVj zyK=oYk$catvm4-0UBMPaID?avlQnK$Nr=A%^%m>pB-s~@SIEwLu04Qz!z6N*l9Q@@ zx(3z*tsR%#gWCp0cNjk*1MCTm@yAsgfBoR}ib*ET9@JFwr+Z>srBlvOTT&LZD1H03 z%rf(J~sB)imgg;*G9h z_jN6>d~;?^m#QeoBgNU)6=uXHfTUKpD1FH3j>LkkORmBuHB9S z=UFtIkIDo*}r;N+F+w( zXHC@D!EbMnM3l*;xAdAhCdT9{qDBGN4)HnAbg&c}ys~`Kf%*-jHp$aCYsD;tJ(pdb z*J)gsQ0bu^g%3o`&+UR~WhKbw=d|ph-sSD{w9+ClU%LNBmiD7K)jW&$F%u5?P6IEKq82Rj*Q z{blLXtTYzjl9r`Z-sIL#*l|l(u=${wa4;D4Sgd@(@t@GkF)TrDhE=COOK7;T{er6l;0aamH|LFaG@b z&>OEc)RsjOJnl#+cd=MKXUl9IS|hxa@Ne1mb}dCo99T7<)^N@p3G8+GtD1VUeKnNA ziq)JgK(45$(@_0oguukJt#U;HFG&l2D&BwS8c_j$_0e4!9Vf;nJ}ROWaC%%$0*9zb zdGOJ9PEgE{wv-j!K9H<=2ELy93}w-_^)d5Dcofa~YB}2La$D6hupH++b!nQ-l!><5 z)D13bV(qjV9QM$2H6>rS8Xhx;(w4Qjto-*N+_hd#)ph=YWJBMAE}t7lNoiKhFje+A z)W<8;%JVAE;-)IS9q$gcy=$hs>*#0k+*DzBdzM`xd<@&{(icnF?kz8Pkc=>Mol2KivKYGiar#rS1bcANQP%2bpWcNr%7&s9#!0Mvb@_m^W5{6opH>?m_dLgk zlOInECeb$NO#!F3$8UBR>q7{bYV%4CCmpBuBC`f$%pPE2nde;bUKm8UA8K+{)H`mW z>f&~)E#H{nO6%^%yR{69k(Zkf+H{+GiDCAAg>(hdU#hRAbE69}S%1c9pYyp+mQ9zP z^I9A8Xd?oB6xc3&RE3m3rqF7QXR5uk&R{)xHNN% zKJl6e&%$SCnxwGWaFQ?eT>ElZ6rCDiiTtHz0xKpv>4Cg{G83gGVbE-5IBo=-h#hf#&-mJ71MT%m zluQ47$BaCvfqQ0Wi3Wp>``wOmW%$|Nk6n-=ur%1MQ^_uP<@oF~ z(PGOm_^kJfs4XLF3YYNBwvsNi3U$;hr*vW+lk`;}eNfT5rus{H&P^L9R{Qmqjb6V4 zL^}CXlWkH^9ysgdWW>NXngppaMzfT{oaEaY*^}vUSb)rzX$Ex-o z4*;sqq)~EJ<<}%D_JwfgiK?>f@>?5!FRs_+uENx#iniBvW#W_PR-+NkE858ojoG7C zJ--9c^6AKuOA#Kp*{X+ynDx>)mP*%jQy;xH#P{iGMaudx*~NvI!nVwE5*TU4Fyc9i zhrl)OJB`}H+WhFwvsx@J;vO;5w20jSap;jP@+@u1IW-N+^?41e*?P-TieugR^y!f0 zy?llDg{5grO<1h&J7!|5%78@u}=N{@Vp+By3Y6dF4bsTv>mTooS1M)wSK$)kTL9Lh9*p&ZzI)pcQNA43cEP2u)=%Qg z1?6HHjZn|SsWqwQdgvRUZVtE?c#Bw7_i1$*qR><^uM@yfLSpY(gf z-7o;*2wStQ)Y@5DU8JE)#(5O3-iLjTc9zvkarkWUceg>b@!BSD^6U`-ch}@btq@Iu zlOe3ASob9O<-lt>WT5rBOu>)OcIGwzxB(m-9yZ_07p%RS)lx|h#^aPi5gj$3K27Xb zp%h9D7=vt6t!+5ozck*BF?l1U?#uCh!PfnSykC0**AtJwS{ypy0LQO-RWng`?aV%8 zYJ-=u;*RX?ujXgO4x3MFJJ!p{$dvwuzMSQ~Iap=_O_83DgWMBr95l7n;0y3S+TReU z53NqcjHsUOZ1vGWjv8@O<(9ZhmS_EeS3TAkB#u?v?@vUzwgX(Y!x2X5Tq?J%83Q^* zpU@H!$)mi(2SEeZlXUURi!>`{BYO(FCY5H`6@z}~J=gikina`RjlJ_3b4!$25+rG?$_F#b2doK<$VvA+f;;rNRDu7(Q2|(x228MzHM6%P@~0yG<~xKFTGD@ zRTf#Fi#9>gJ$dwE4+b?>Ee@;|Rk8!0&j#|68)cY>>#Ra4v;uE(lSneghF&Fz%PH7@htHVj5>^n`lpr1}Q4qI4CB+&T8^9ZoW46wTf}QFN#u4aE+6u^ONnnx~=OQKv-~3@)!;96ZZz z!xT{aw#S;EzE8AhmG0YHo9~4HJj>`TO$C|BhtsA9<(d8R2g^xmszSe!@;~qemRP^m z?c@J!>jSrJm_BbD+i&mNGK#XUz1hcxv(`d}ZewXE&!}$3ZQO6< zhc8^-%d!EgY@pyBm0RqOM5~Wg$c`00Wf~|%6uYTq#9zWc8jI1vB+EB1 zaQo-<@=L_p_IZo<{#q>#yA&s~<~N+Uvpbv2v0NAb4xY_EoSa2|>SkGodVSwB!-Tw| zLJgt2ljoOA*93*Mk0YvGCRqz4P886Nd^HRnH(`gd!JCbL}z;^<|Y*{~K+y3fEh`Ez}115BZ=CA9{J}Rfk9r z1{f|o(sfpB8W@h8_&u&zi@|*kA(d#)i zQ10kA3CkyTr?R2>%-Ws0QN{M$u#GxCR3$cKlhNcbog-5}U>6&O&DZ2iy=nhw`yZHE zDTdH$8%Z}QMsaZ`@+T5ZUP^lDFc40?BkLQ zakpi;c=!PS$cDe2EkSCAa*k#+eNL@Tph>;amPK#)q@g-|SFp(xA5+TP<=~v5a9z>f znJVvBE--&l7YMTw)ghhg@q8Nb_Ct%|J@y8LuK@^_1gVahkkGCtkg*ek{)l?sV0 z3ksQGRr)EOq(0~?zEN{#w`441pL5O=;}|@R_EoO37}1W`#5k*N3b+?9=Wdop6XWWl zcE0Xf9sb(wa%aI#?-R!T@YDFM<>ProIN^ZNJZEL#&?BK1Yl3I2_33S9pFDtdEujm~*){KyDb>^i_d-!LYn@%-<@zV7!mcLJyg`$j00us!k0Bvx^*H!= z|1snlYWRjFeEKdHcw#klbDK7OOK*v;nFf)CKJzV#VE-m@+R0qaSn9Zz)Q3tUv~G!t zsFAk4jW}GjG}yHc`~hQUD$-nN z*ewoFyJApd*T*u0=d6F?Cxy3a2(~n>&0hdn0<1A$dQj^pXuWaG!YRuV8T|LAJXy(x zN{gHWsEOwW9WRg{@3IqXsY%npbZZT9OFSbLN*zX%jP!=Q&dDDqt*i6@4Hlv@+KfX8 ziKMu2tT!nt%;D_h1_L0-Wef7G}yGrTCZYDb5BDX4Gx50#UyPS#oO`vZyY z#;=^y{-SRA$R3Oo^P%S{zHz;N+0!PPGFI7+wln;hflWpC(2~@%qU8lDLyv#fl^Q7B zdyYP@Mfw|xi;qX!*K|$`VeW_Mn#^POE&tC8fV9wcf)q`%Z+E{;LL#oE5SBiGhvVd& zeBSKkmbIm&X>+J2e_zZG#7FPYSAEFGh<>N_-y=$O>eUrCE+2&X&u_++K4{CQIlTO~ ztvv2}CzFsx)zzU_?s^2JIhkDO*8 ztFD@9sCZT>F$9*N3x}O7n9DK9c`10pEL56c>{qJ=m(C|Eq2q;S*g!X7X?LboKkT$wm%)#6|NrBa zV@|0YlS7os$SD-&(1BiF3NcFz#kOJ&v?Yge#PxE~mkz{&a*H22G$ZcL)H7lu08!prd%Qm zzk2dDmh5YEraR8DHS=74AK1@z_t5T(TKIZ`GxGHQL!YxGtE^W!sx)_KNfC|cFspLS z0b3=%_V8aCw*sR5ud2xvhf~V}-%P_scnlVqqAB?!vb#Miy#1$Nr7}g!c41DFRnNl= zk3@EaJ=-BnokirbW|*SISms8-3oGvJ2tSv`f&f8^HTA3=4AJ{^SQ}SngZ;UP$v_`k zYzb>-YzA1QEJ(?m)NrFZ_)muxjs#4l7Rdfu87?JnJsU&d$G$7tjFt>T6*T+EIYqUl z1-Ex&4x!h*!p8R=;QI_A0YgM@@zIuHk);YOe#1dD5^s!dO?&EW68tt~MaClBYfvX$ zeRdXlt4CrKG~)G{tI{oo7LZOkDk@wc@_z7DT9yx3Mb047Lf$M*nctt`fmJ2)9CA&= z^CY@{e5iP+W8~E3>VDGUsiP!ylCXJHtRomorVEwDFRLvT8?J+;%}ak)f3=Z3OmGbv z{LLS#TJ&0hlT)MJLT?Y5mD`~aQxy|5Q$N~WAKV2GxKfc}Yh&nXU5ByESbx2$Z3SQv z$#KP>wBY^w?Dv;&7Zi)m81axPKw_{zXU7V97 z;V$Lj&k@aE7fC8K?Z@Pcevt4RxR6)>CwCQ8zHq5_y-Uv4>?RslI9|0gKkQO(Vx zXkm12tXPnKRq(9Gv0r@OaNV*Akl!(LG~BFwJJ;n5)TEf^@0gff$>XOY_n*B*OWAtv zYbcuilp+>A9k^TC^pK#Ynyk}T^|h>6lhV2Ks1~wabK~%(wqT^NeBbF;;+y9qSMa67 za7&Bmk8eFFQ~|q|za{$1SytP>h#y11oGhB$7WO;a&d#ZVh}$(wEiNk{iX1;w2AD)> z|Bs|L=Gz5<#p9!oP9F+=5rzr{aW>(z!FL;-Hx~lRydG@d{Q+6J7@U7c&pPx}QmV1= zs_uqD*)G)3b^NerqjJlc;4!ReV5k?XjDzGnWb8=!O1zj zlmfrtvtn!jaHP?PM()|%{L|YAEE=A zr?h1~emDCwwp(|iH`ccMh=G8z$eoR+hq_H6kJos0xo(lKXMRn=ukenQO_eq*Zoc`f zp|nzU&33)iFpJ7ScrAJO3lLu+J6lyqcHg1@oPeeq82DKZ`&!kW2V%1mwyJ+c$yLKi z^D(lYKws@+t13`WKD1(QtOj3d#)?c85XIUGG=x8(fee5L4(zUjL)~$DlSGcl33Z}H{#W}by_{u}ZhxHC@KRryDWkrh2*Ya>CAuBwu z&G8IS(Wjr~288;*zJiRDS73S+E~L*tJjrGbIhhuHU620nT&7O&UEx~kUZ(N?RL@P_ zaNzc_i+H4l$>sY|Fw&w6zawu&6M(p$`Rewj;yO$7Qq8S0bD5T|;axu8&NZ%-rwvz~ zOc}Qn7YGYCjN9Z5%Ns=;gu_v3lAYGIJz#3mTd*Kt2H-Yz6S}Y^lf)(6g^tUkHlsFS zr7Y1po)y5!tNPwVQvbk=&ymMhy{-|+XBz_>to-Q4@-&0wHewAsn3&UGcRvA;uhupz zh?H3}Pi_F`Hh*U&8a>wN$aelwz$zMXwrQitto)FwOr;|dJW@x!@)jw7vPZ%oVR+^* z$KsKd_pVw_JOOzC8J+tk+yw=3QO91WPsNoXOs|#v^Vonjm;eizA?jC&^{A=?u zD4adS)pKc}bb_`bQ>Q`wCkta&59DP98S(%YM;3w2lMiX2H5}WS^9`<KMfwWuPfRIpkr!FJQO1gh#Z=TVQQ{n}+6 zzoJ$iknaEp&^bwo*Yt-(Q6Mamwx_nE(bW_Sg7?C*R{ z2wXQXmwR_-4(-v%Ey4PV#6_`9FZ3}NLqhkku4y6gv8V9 zC0QL;;lKXH$~BBE7MebmvNsw2t)Uy+$PZI&gY4HSnT1V{2vuip_jZza-s(EyB?X?{ zK^-=4Et-|Y(#Ht;%2Iwz`ufi6P2-OBiC}*!pvd2&Pma2W=kaeHVKOK;hj6m}KFX@3 zgMLUoa>J(~5K=HgLTjezv^Lg-1~2{Fk+B4!>zqc0OfTcQE_`s{CC7?UKf zY&t(Z{|YCL)FcUV>hmi0w4xuAzV}9}0qB;`VRLe_xuh>CZN5zx_;5nG;A6xS(YVHG zIflC9B`$ERd>k#HHGN*%ykaLBJ;7#gjQ`r+SfTQaYXUg|a0LPx9MyMov8*vuCt3ZC zl5kg?lCU{M3K=xJzqCH7yli;9T$yw#($wV*fd5o{?u7w?s}**J71fAc83GVrzLVXq z`mP6>W$?U*|FyA2xr*a<%uZx&&W_55m?qjou^cPE?;5S{oG+>$^eL5m%EFHY#|`+t z*?VGPFUdBfh*_D3C~j4fr75!+AJJoTU$wxU*`llW?3NwRJS~?S4o>e9y82yS)cFf8 z>5{xXAp3qI=6S%{`i?MH)?v(z4i_n#--YY2I_I2HiKbO64NxH5?E#Eh0J+KCyaRaV zk2N)tfNS(Wk;S^vlr6h7C3ie(7XWy1;D;}OIBC`|ksi>W6oo1lAAq9<5qGyq5e4%( zTPuKq)HR-Ax&!@suBwgGaPa!o{xS_1ws5~EXkNtJOS>s&mswlfl{ z92WM5d#f(dZ$3irN6i*yJf|*q<%jv;W=NP;uWK?F+sf8ZZ!2=hm{FJaD&C5H zn=5ny8UZBA2gA|n7q=q)5SuTu<2CVNA4U~A%}Pt_UcbReD;R9$q|cupfwXA1{)<&w zJU1XQ`K-y?{pYmQA=p7#O#lH8HTpD&Brc%c^TpZS=ffr~leiey3i;$6(b!y&| zvI3bk2*FMAC>7vr3zTjT_0yUa_gn}FmC4w@_X4?&Q27A1u`$>|X&tvpRbQ9OKG19< zD_q4BK$xOa1@uox;wG7W|CD{PT8!2=JcA{KP)hHNrUf#OsC2QaX+UD?Lg;H~!$ zWzO+CWKn8eHm_NIHRNdSl1l`@dsLqiXP*Mdjwq>HFR1P5!)kB6cun;&@jSjRv)2bPeLpMTHUS(#D$sWY(?K@7 zD~e^q@zYEWS|`>b)J#?2HhrTJ7$z=`-m3-Qc8;ea2f%4fh4g!0DEoXkvYyf4 zcIgCvHtI#gL>KlHe`_dGdrjso?;q(80Ek~XxH2d44$u)B(&}|;En?U6Z0=d`&e(H9 zX*!IOgobAYlR4K#bwl|3XJ(YL#1dR5G^+H&^Heeh{At)xpGc3^4W(^5=BX!@_(oI1 z;&kY{N41`{R~Y6)eVh0IO8f><7WM@=8ec#E;}ILpW%3bz@*w26^ga14?S zUXh#j8u0IJy=KdL5i|0OQawl^d~iDDHB&cT*^QgU!?xe3H0l}@4A(QDUb}054CC_h z0U;SH1>WEt2gxzn7`RSs;GP$jA`)R%-C{57}D3|KG1|)>2TbU5OOoCC$2~ zjiQYp+D#UGzo#OEzNi1`@~Gxd0l}?{L}c9RU6mIddTh$20@f2GN%gBtT{JBVNFN5g zL*b_~*z4=-uSF}e1P4JbIqVI985=K%ydgP$6l>FvQ(W0`zkIa6b3~;IF)i*8AXyR> zx5al!O;$$6vE9YcIi*`JE&MNgBUTHn=mQOFtotn)R{l{}B)RfFPT(J35iSGjQvA5} zK=Eb3D-vefR^=)EIT=3~wWwh_)U

      CVV;=@aRt6to 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 literal 0 HcmV?d00001 diff --git a/doc/_static/component1.png b/doc/_static/component1.png new file mode 100644 index 0000000000000000000000000000000000000000..89d1b747cd7411c87ae03ae56c910608f60b466b GIT binary patch literal 5272 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 literal 0 HcmV?d00001 diff --git a/doc/_static/component2.png b/doc/_static/component2.png new file mode 100644 index 0000000000000000000000000000000000000000..9790b6b83ade562eca335924b9fe084b28e5d7b5 GIT binary patch literal 4871 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 literal 0 HcmV?d00001 diff --git a/doc/_static/component3.png b/doc/_static/component3.png new file mode 100644 index 0000000000000000000000000000000000000000..f22cb5b221fc445bd679d35b80392165f4875e9f GIT binary patch literal 3030 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 Y1)*7fcJ(~}&j0`b07*qoM6N<$f)u^dZU6uP literal 0 HcmV?d00001 diff --git a/doc/_static/component4.png b/doc/_static/component4.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9bbcc4545d7481493aa12197641f1c4de7855f GIT binary patch literal 46739 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 z

      Oc29Rf+0$X>6~|a0-pp{k7$(^ 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 M1{V6y2#(kP4<={?-v9sr literal 0 HcmV?d00001 diff --git a/doc/_static/cylgrid6.png b/doc/_static/cylgrid6.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e8b991fd299794d7421d681d16c3dc2b4e73dd GIT binary patch literal 31076 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 YtG3Oahra&JpdpB=iq?ZtCCiZi4_u`F761SM literal 0 HcmV?d00001 diff --git a/doc/_static/cylgrids.png b/doc/_static/cylgrids.png new file mode 100644 index 0000000000000000000000000000000000000000..c928af72a558b76149c11b1a6a76214241262602 GIT binary patch literal 13539 zcmeHu`9IWO^#7p9Ub19M!=SN5mQjR~Wyac|>^m_SOGH_sWoRrhGe{T}BTM#W24%|@ zqU_9ABH6dH6TUC+@AsehK0cqHUXRCpoqJyQo^$T=p6!LbW30!{BESLyf!GmnZBr14 zfei$rzjKBj7%7wpHqRchCcq8%ouyWG=a!B`qGtv zsZ{=qJ8a8*6Uaok=9p6kUb2jJ~#n_Ri2)UnKnBE`DS->3p7M3Q&DvX?zNMj4~Uc3A1?L`Zv6s*8r{QvR#ZTs zJ7Ty~ptE2+2qdb_1-khHP7iu{76AgC6J-Wn(t^-|v|mC%k!Svw=zp9Dc5A98L7-^A z&;ZKe(#ItW>H70<2p*J*r0I$r?slL3QpY5xvHvH1=i=udhyfD_-5vXqcmX4@azh>= z?=77EU8;wm&H`jn5||^E6HmQrY9NWcjyrYp!)8tIbyaK{76NK}Gofo|BzgMvXQT-3 zRHNHC>#iboKCr0hW8J!uB$5XhvvP~pZI-D+3Ia17MqvUM#U3s|3PkasN9d0K_=LQK zL}q_{A72~Dl?+%eQ#?DR>2oUX_jUan^xlV_;ugo_Hvtx6bR+?NwIc?sV(M_)Iw3v8`GyYU5 zdL>Le>0{2c$)iqQ@e_H#N{r&6YEQn1q6cyac^Po}k%XXjlMCln1K6^3$9wNdA|-LB zN>!lwO55~DdzD=n@&hwq|D`75=BhiCfUl`+MxSS7M>@N2Xmd4YCR2-(@`Ag_NI**I z--`|zL6&ecE;H5Hj9Jv0`lCPFY9dk0`2%&Pa=*&PZ3dbGfrT^SDHR79Fpo5t=i%a3 zf<(`YZ-l(3aQbT**aJdO74o&QGZVo3Ry?(M!0xo5M|SZ;HE8urd1Wb|M-B5-2?3es_n!*O$+2iQuWXnDjN>Ji8B4s}PpHOBkd=?>q%3S(OS z0zi1(n3g9=MX+Gm&mll@er54mb3az>C7}?q4usCnN?%Z?ibzTv5jru@Q9z4{BbNdD zw9PjIr9dH1+wwdS%|DQ_^eN1+c5$&l%=v&0jD|Hw+(K7u*8gT8;Pi($~IC`wtOLZ$0rf zX>gnx#cMgA*XH_R;TouPZ_TWt?uNdUQJ|`N%u$)K=KN(TRYOy_HwI3xQMEqrVfkqf zA?arD9e2GaI%79Qx5g6gGpWmnJ5{Ktx+t*wQ^~YbG5i3T@4d)D7^?l*ut!g9u@q(I zD2nRsZRIo;%R$c4i0W6a6vQhoyj%Migk9dz)ya#T?_l?4mc<`U8(W@pE78XNfLN_AuhP&Lbu38wIYn~p;*D;81djDCHn$Y z2Q8XzT=Vm70l*=5UW2r3ELE;t9lBN;L~p(rK!q=436w8P%lhW>^)(JF%^~(Vz(n{n zVS$l+^`K+#gFMr>*$T{$qDr%hi)iQ*j=k+GjsLp0W3Q{1B|5;5vXPnvqGo`=mPl6

      2tl{)wH!aWKORkaIwSXIf@s6B-S@J*4obycU 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 literal 0 HcmV?d00001 diff --git a/doc/_static/cylinder.png b/doc/_static/cylinder.png new file mode 100644 index 0000000000000000000000000000000000000000..3af88d8bad3b9c9a5f5bc898137a7aa6bf6db563 GIT binary patch literal 51805 zcmeFY`#;nF`v<;K>4bWflw(vXipZfH%b{MCsa}j6HVQeDm>Gr+qJ$!e<&>Jku$&K@ z(aA_i%rG|R#W2hq#`r$e`*ZvL5#R3*-EPbFd_GRse*(tdb0)dEJ z`Pbw>2t(~^7Y(I*2evi+IP+8cT8xtXo>W~}x8?2pqqY-j z8dbv2=T&U;ZAgv&Tgk`OtWU!Uw!H^cXbq&h^*=@C6qu$+Y14F_aD^e0xBHHBR}MW? zfu-pkI+OxStP52bnm2J)0J8%#v#sk26#nz^!uij-e?GiCLK52eu;>5(!~ee@5Xk>G z%%R%Bm$+f|6^e;XPdU8c+5^FxAs5c({_iSOr$@hC{VfTBWL~_I&{-pxn^R9hLF&ym zu1ZAj#1l?Zk~n^tTDCkJbgH?zSzR_htyKte!TRHv3Ub5e!4$KK`!L9u!DWOos{$;na$wA zi2o)M>~%6|9k_{D+}@#05V%Q@Fr?FH=~72%p@XZw9whVH#?P(}&)zbLBYZfmF4Mh3 z|F=%p7a>SZ#EdB9gr;n~3mSc1WJY0&^bc9wFCoaC%itCJuO=KVtiVGEYa(Ux^ZQXo zdXU3bf4#}ed6g#U~1k4U^Ak(CpT}-|0oMqs0e)2kMqfg-{rq} zEb-$A7&B7@Ec%VpmU{uF&j~R7uaqurNd4sP7Vx{gng@@{IrVBAOG&*jDgzmNLAWa4 z!6G^*ENdsPa-ZhSLn3~H#hZ zu)Uig6L)&`AU|?(#$sUHOuJ9D-#>kNP(UD5_KP@~eEu?k93XkkS)RB%e@<4-Y(uIozGEQ zzV3~Jh~5$tgET6Tgf0kcA_WUN+h^343M+IYQs=>Z-uRkfg(Kpg>X#ikkX@lW@SL`E zB{;&>3*u-1EIC4S+%`As&cT@VzChuDO%~&u9Lc~uGmq39=xeW7Uup?oe-ynMhLurM zPci#dK_Z<>yfRxpPW9^{u(kr@9^2P3w(0PFc!m<*=#upc6Uy`^3b{daJA~>(!3kXW zdiU7;KLgkUs1N!CTRqu$QO=ROWcf+p#GI`?){1yi}DOT^!=fbWEJ>7dtY8R6ljRdvDxhE zO6!ghi30~lmbonOA~@c#^dWQ#;#dI|b6CBUKZczMv3Q32u}+R&)mHU<&;49kbRra zqPI_5GQXIe&%kvN*Snr(1R(poy8`e(&7%z)z`4GW(chawVB;Yd9^VOb(w7!>2@hwo z&pU;YTvFfMSNShzP5?hI%2~gOh+KRcz3RJnIYVKN`HfbCVs?7oIdkxBF3B~1-+9pw z!otEyPNvb}k>CafNC7|R)~-iR=_0fh&Ii|Cn$``a64OqyxF%aeJ6Qh_zP5!#xB_nz zAO&{Y_7`=+AG@6i%U9WpBDwdUx{-wHI2_EIfaT9H4}TT9puJ%nTjATM^VP}4#V^BT z@{N2Xzq=ZS(y{_m+L#5?OZWZOEkY6MtrA#f)MQz3*B9au@Lc5{@Z4?iT#=}#=<_%W z+U$Y78@q12yt>V|)5Sm5-)L1st6V6;=P&TNpGTa-ja zl5^LW>!r((Es&pjz>{cX;>8PNV?}!C^u+RVP4v>t?Wq@q@n0q;@}*^D&^@1IJd&3S zmQ+tzxPA}ao4n_`_}W2W;g|QFC&yVYgd}h=^?SjhH?xE9Eq-v5u38A$ew;A7_H5^} zUtx&YC&g&>q%cW&*^lp4>eECfwxEK5>y3!0k-SPR?_XS8bU7#ey}kWqL1E$fv>5Gm zs8Vl1k(8M-yP~_ZRfavdX;*MW+pf6_P~hOUXW}0q&q+UvZd_Yidzv95BlE$cADTiQ z%;6&_D7@Iq^}`D5c8IBSa#4FM#+pCorRf5%cVPwC&47)yac+La$}g(lZ(Kf`Xnfm3 z7X@6;?iL%Xx@fSASeAe+?ZCl=6&4h{C!9~DrS*22!-iNX zQ{9^&tC_&v$Oe@E1Ji;sO#A&D`J~f{C%Jwe!C;HD%Ka}NlZB)L{~nQABdG^L zW8Ju4PGf?s=+(UF)o_LTMWbZLX<$3`|5-C%@e$0hsb0-Pv6rlpF-8AkUmdx9Nw%)&oV?{pb33rt6uMreOJHk4W) z9E5rt^ka*7@4DFDWrzR!VJ`ln`UsC6qeU>@7bXwyD^OWD$#t0*9Naz|*xf0b7Qn`? z|I@d32e7?^zbB+x6}u{0VRB*2VQ-w(*d? z8?G>~h}^W>Pq0uF`zf?aQQ-)MzGj^vlcHM?g`!vnn_PqCKC6gWiHCfA_GCw#z_i9-|>*A}t`Ht-Ig=eRlzz zoHSe{M!u_(S?y1uFWc`Oz^}f1BfMlN+Visd8!mAAmRNk(2pBB!lOQ-TZS%7Y51Ebk zJ#1X)Yi%)u|A>au*Zy7M-yU;y#ZETbI{|Ymh`Q`F|5GKw!COMU>WB_7=%q{6OpVrN zeqcUFs|&CZh1v?;gw$^*xuzS&Z!x~NQ!b3l%=aK}|0Hu0M5c(ZQn&DrNxR?f%IDN8 zdwH^L#I*}V5w6G)G!G2thzI+;&1$Wk|S~rx}-C6};+8aAK z=Ip^csic2V4G$npeXfQJc{h8oA6Q`lSj}GUKx^w<^!`Dadi#k9srp;^DI2p4;kk`7 z(JD92GwdX*1($Ev-gi02rIx3A2#C2^izN-n0=t^Q28?+_{CoR&$EPgSy{;>#8$ax-S=PJlrdD}~X)K%(bs3Jht48y}HO9Qzy0IDxxUgqRYa}On zZJ7+1B{PO9!gP5+e4Zc8f-$)1$C0aJW4P#OFJIr7fBjC-XbsAx2W@*gThkmy8 zS<1b%xs748q1wjA;`*N*`M~dd1xGJQtDtH->_! zY6c(HSB=hh5)%{4;cGT$CGlo>r%#`5>d3iHpWfyLZ(3cEBQJ9}|Ax5%yL7?;&OQ4@g0?M%x~J>MYi}7$9q; z%pRPIr8w=~Ta8%>Y}S8Zy?&U=-q_(c=Yh4HJyJ1q*F*MUh?|E;fq`kobWPX7mqoS3 z8BAXJ0OFXgjGpQUd;W0n;&gxBL}*Vjzs@zX*)sU$vYl8)XFpVWFCUp5`atKHEr#w;bYrcNt8UUKJ_$dcXkDk>^QCVNV~th7DDR20HraRsCS z72u#)V08hu5}Q5KZ4gYvC0GNktLqm5&NO2ui&=E;?-?C+Q60n%OkJv#E$tZK?%wuj z{#GK>6^3T^_NwPAwgr#&D1L356PAPv);C*rzf5E^O4qL9gjUy;&c$8(e0v+P*#Il+ z&7M{gxF)<~ZE^8UU1#g2U4tr}uWpGCm~LmnEy~rfwoMIZBz|aXX*u7%eX*;nYh>_C)Q3v#9n32U zW`!=WP3Z#+c$U^(?1!JW&goj^F#?X9UXv9wTuCAPwZFa1J=Yq&yITfjF60CtJ)EQ6 z=M)Ah7wcYET#M9`$^=MIAtWS3;l3WyfOAl)N1NlJy;8&OA8b{;F`hJE@ItB-sb6N5 z!h=rL@YjWAGEY>+M6cE<%!OmPn&AF<8D+P-!QHMTlre;pwWLLLwM7$~oYkd8kK^(9 zecveOoC}MJf@OpSp>Ry?k|!^tw5F}u@yrQ*t93NB_)5ZimchAmC-eh7Jv~dx%U$|h z>BGdX`C|6mt!}+I66Hfi&J@MS-)&z?W74xg2gSK|ZEv-Q1|4o|c5IoTA zHKEd;eQLwD>suaN%5EP{&tavcXfHs4i1`0 z==~VSn+eOHycllpWa@qn5w>OU10`d%sDM@;-U){fp98l#J}&N;XP#@DHEQ>~f2p|) z^0944OYo9AvLPEE&fVK+GDoWvI+w+}zQ;|YH?*?I%J8mVDygZsXQHC{+?1-sx8JwLiV@RL?h{%2dj*&L%mTBk92e51JS*Q&)RbbXh{0ym?bxfGKc$fh^{f@r zko1nTvu2)aF}|m&i->fl`JJ$1P6yl6yyI4=wN6#`Z0DF#dLN@|<3aRYTjd`lR)np8 zPsc7VWB0fpsp@d6__M!d=e^;W4h=k;?(O4LO4cX93Vl%`Gm4e$33hAIUIs>Q-OB@Y zf70G4)Q%dM$Z|1QlQrqS#Wc^ZuISReklj93P%gOCT22)yKo9Q;spI=NH^9hr<}0~Z0%)m zE(v2UsiD*<@4yUI&xt^n;eq=;pNSs*VjLGrmk1}AX(Q&~J2^KJ>xmt{7!;qox6i$- z=6`E(hhrXT5I(^TFW=-bG)dUUxEF)9O{}c6OF@;G-2iELqVpTF#|{2r9C0&C%xMoT z|Fed>BsD0x$8V;`H_^Z6i5C_+?$rhjvMx-SL1;b+hN$iuMjQI7li2acouhr%k%M*P zNr8zo)9Qgp?6}I3cl_uNEwF~M(!Xo?0@e^cR^96pVvt<#<&V8V(OM>HFl%HO_&5=9 z1{@*5CCefr1F2-iei!6-I0F(WeCk z1wpzFdzk`R(WpxlKqi|0G9Gc+#G_B6|2;Ac=`1fPxwD#D8_dfGf!W&|Dj-f57h4RM zl1OjYPso5ph95}p+dIy%gB%Vn41WlY?rwHZ5$1U@64)ar44*fr#X5x#TIq%w zbZV@;TSL}GuJ@lkqz$`B$bat|?@pXc$Gr9Ou-2E&ZqHrd{FhsNMxW!gcG@kgn4ETL zR~OJaW_^^8nwC@4ztG1Xx_fT1GY6k4_nWIS2vO%NJefce)ae=t-FPF1l@|KpQb>)V2Lc)b5 zeJttjWs0_c{P5XdC4=w`EjiEV<5dzFZJH!&eOl2b`bY(`Rc4soQ5z}3AwMEc&3ZpU z@s?NshG8kcbxAAIVpw`x7xTe3sZVK_Jm0H%%SLDe=#p^sWsvd9sq@zDO&AC$_s;)}Uo>9IXI&*&g>RM*4a@=d&eWC%i3G)%fXcy&HFc zUr$jI(|9-|nt78iRa5a$k4<+-Q~g@R2ce14n&MJYTC3be{?b)Y7!|*qzeh_hB2#{! ze3{T`x7yX~;3#vBT~QxjTrscoyi=plG1AiJ>Yvf$cLGaBxO#;A_Sas1`^0+?*Mf~} zb3Ah{{k*d%K3Z$rw)kw^j$V&KRK%t1mK**e z9R8H?R`f$+|FT(}a!Ap$hh^~*X(&-SmiHW5gkEz9nD$M;^xu)CU97vltgPDMqfm6U zd)_#3MHle?zJya*W7?%S0(zG6lcFD@z)NXFKbXlaogW1`aQF zfBEudo;@|?-P6~nVPIvlGag1^0_bkAI`d_|uQ7wF8NGvGA= zS4`rJSLf#Do}S4-O~y)TJNx^e6&dv<%|3~a2Et?xCI7;QIPvqMwx;p{>M3u}RVWkV z>5qfx;{z_b#ckjBqb+)hjYSfD*RI_Yeh1XcpEhXfk}hgG`d{J$s;RY#5KF;1LJaLA zeu~FqWaS4|T-0Sd&mdGphE*)@NxYn|Q#c;3Z5d>(rLFye#y%94SMuGTKui4OcsMF5 z%0g~)fO|{n8mgHU9K`cS0wC*}GwsW;uMO4|ykLzsCwEnHenp`!-tZQF2h@}SXu{F^ zV?R*@*4|VsP-T>j5oAI)?Y|EA%(-gUgrKLS4N4+9f0XS7qD5L*H?WRf4~zCQZ24-j#-@Gfs9`j*1y(*ArUbowNR4n)gc@yH#c z{8=qZpnO@E0P=n^5c-_rrjg)DD?%F*t{Ivfor>XefTVZ|5TH`mwt`mL!jA`+ipes+ zw}9oes*4nu(&A{eDJAHnNna9gDnEn#xab8St?wO(Pmu7y*u@~dX|E-pUtqA&Z!r>= zvRKpoM6i{+vK`MK-2LmPhq^wQEzdYwfBcGqYg>8}*u2i(PL=n#&G$~p9S-=18kl(& zs3|&4nja^85A$LhQ~%*=pkFR@RnkQ0Qc_YSm6gW<5+0A*f;Rh%s(6-%TcN>ejJM|) zPXX~_R3&)r8)60xi`Y0gESBsGDVXQYpykx_``37W$ezw3<>8x(cHWELV|b3=YBj_$ z8n{0HP~onUX2kM-|9dp!*Zdn!PEJRb%3pdLg&<}?>~p_I(CISi!Oo|I?{mm(by}#! z5r5wjFkL99lV$nE-&bA~djzkZYQ5T6A~MyMuAlhrn<+bwdp34JG(dENQ!I(rUu8UT zHZZoGWYeLt`1pyc#@Tr^OrCI71TNPh5D3bQ$Q2c10c7;u(GXavu?XCM{Ig^8+(G6g4Dc$Fl!=;)|_7(mnoV z@F)9x($Oow2&M7IuO#I1r$Tnm$ugbQQ+7vv$@2q}cy7OM|HQ<^)7c_jQQ+&V9f)zp z?bQ=x#n0M{eua|QPmVW&3)Z+LPKig=4E{$wlGcb5<+*Zp)Dl))@pxU-1p7vO8}ihp z?3Yw_BhSEWI%m@Fw2DesuxxMG=^*#S?R*gJC(8a}o%fMDIb)eC`kxWZBJt@! z(KN-nv6Wr9^Gn4hqKCBoXJQjK6;)KlY+TvJ>7k4(0}8!%GIsnG%#`H7@LHPo2AuIe@PDD!=<(vuPjDW6>{epEg#SHNc6g%r zeLBEZG4dhgd@k02^LWvEU1e7ffcLU?yp>n_*Bfuh8b_!~#)GK2f|OADihbfqU!#dk zq1(p$o}eD;#%d}5g?oqGCSqgTW*8>-Xe-nAi6lBdU6G?(g^jD^S6+)G6);uA?jr^egWm#S3VE^Uv+R5TpScLVu z=bbwbeEzQ%fGDRS*>cV4iw>lHwpQNmL=Uve#ALd!dY^zt=T2XKpT=&L0~)VX%ksI5 zrs|$It!5p=&ZTE-o6WfsOSiQAEX+_tizgePQzqTdTZvCUo|HNB=r379)-C6gv|-+~ zmDJ+&>yRVb4DgrBPfpYsnZSlFDA*pLmUul=6+oQY*C)mK(ZN&WhmI znEmF>Oe}$D(%R?w^R8ZJ+jo@}EqsWnhKE9duke`VU%Wl7o%lWE6m`L?4zI)^uXqQO zNfU5c2OwJdu!%;9PQzq>x}}bHo3DSUw0QNH633J}OUhW*sc@@YuAqIvuZSVtt4Z)4 zdT?zXCFl92>^wrV(kyhbcB1;XGw;vFxBcDtIBfyc>}F8BS{0t09JyHWFr*?re{@GX zXL1UvML6s3VNsL6R=wqJ2mSGGPH=dy=k#E00VfOhi6!`P4A8NxCf_V0l5SIPl~=^UUK!|l%Nu8O2mKzFitcrrF^ z*}uXMEFZh?>gqbNQtTiMH*waJWijIa^%qpYGYq6fM}fH`_=^8<_<>#AhEGU+(i%q( z#9HyaFF~|D$oq1)u(q(m!4srG6%_7s82UX7hE`1r6>r_)7xxLAle3@S&2;^cyGY_C zO4!C39ac~P=n)|;VQ*rdrjr!b&qi|kpKvl|6snX#A%nsYxe1=MXV|f{9o`-#gnRH~ zw2$j`!0_IUcnS>{h<0)=%}W~x%n;k2S04rj#M9aF;RhU0h`oKAoXZevIqh!!K78BB zusUBoOvw}ur=Rc6RV(n-o~ksUI@HO@CFho;4LN8P>V*{5uv=ne?HWC+i0Q=IlPx}V zAuvICO0SQ9LD=)AVqC{qjBIvua8M#WlC(eV-?cJyBCExw&g{93D8CoT>E-^1M=KIK~Vu_QY)3`Qxzt#R;UdGDydil+y@$=a`X9|45(zb4J z5Yl<%#H&yq)w+a8R8~;X)z!T}`aS7&2&`xqn+~78mhr?xz0hE6bo1rQmp|dU)G=$_ zBq+QqrvpEFT&Fzev4NsIjzULVCyQjapIEe=vN7n2Yy0(Uv+KUwsd^Dc;CL8ta;S|- z9F2r;8Mq@d>q}n7RgyIi^_l)Kyw|vEj=vZ>ZzuN2fO3&%U0CdG+waI+cydR6_ckH) z?2sv*!Y?T)NtkYbDF}NF{aGP0Dz9Dc{~?TJ_Kj0Qo%BFdgrN7qlLcWXnJyF0tk|0AG;O!9Vc1Wymq)-qPL*X^jrLr26Wbf%O8)11xlF`| zE(u15TiLW0rZgRx6=o$ZEiEst!?FLdZl>u}o zyjDReTDG*%cV;WOs%6815s{Allik@X1w@8M-^rcpNDUWEy z=ivwYdDW%9)It3}1T~ZABql2QR@Kyocl*`OOoQ|z%;cDkFMd76ILzWr?>08p1G?2Q zu{cJBz;VsE$r zR_K6082GuDOo~fR`6FddmbAX+a3vZ<_y;OM~4vPP=coZGXH$;piWJ>?$(?cNI0u z>J>c<+1L&#(I|#iwFQf9TdrTh%^S$f?;;Y3a|?7|iK5~_s&gbs=@s^1JOx3yKnRv2 zzT(#2dGyI~g4rYH@O`tRlxIz8i9q9g$4QTo%@2RgFVj0T;4)+%9Sc2SpOuMn2JD|f&^Ha zJ+eU6#i;pufw^{HJ7q)>WC_lw7p%>rU`xu%IeIsa*)S=v=P{Y zayQ#r{+hG;%l`iUvOC1$;`ZtRS&!aY9fEKEgnhXkM#eyC*1qBp`kpxbn5fJ&e`XOEH=Me|19tU+Gr{L0Jc4()p z1(TqK$rQlxZQ39o)6ZuTd@Jb4n9`4ox1QlU z!FXU`(QW2m7LiS*?^a^Ymvw!Jhg)go_9D2op4WEGX^8j68iY3PnD!2x5pp!x$V6Vs z<^2W&y#~A9E7dO!FknSaKhX@@X4Tki6i6-O58k_VOCEKTC*3pcW!UW7hXGP_83SRs z1~eyyxd~&T4*z7{hih5Xh5N4ZT3epSdb%x^goGYQejxO7GqCR8ntruBz%p{g?>fjE zSRSL%TxOqbW;Zl6bRuiG4{M;v5K!L(>W`4`j1aiV-dXRKJ7;#xl%9byUdawYfoeL;ZkQ%~3(`ee+o*>1)smyI7->7o> zO2X4de~MgcL&uplU9$V3fNV$@#;T6%~qhc6Jt& z1NxQxV#St)TgX*6jeG%#?*S&EE*Yy>v!RACDTRfn@oV(wX$)Gv(*X&Iv=^ESM{Uvk6xhDYZSG(2Ox+_XomO0(CC4pMWT6->aGH%DrKem zmEV;Ur8^5N1~us%uNRdf99-K?M)e%obwv@=^*KZ3x>J}kPQsapvv9TP?8T=xBdTs zXfJ?riFrQ^R^U0$3ay7Ri@-M_KZn?q18AxuK1T{8K0#r3qHQ!83!yMfC#P+6IaZ$p z(yaakYqdwOD5B?!EhuA=-`=et^9sN=M13PU89zCbID?Oy-8(>a+N~DoQkc&%m2+I$ z%`ta6=SPAI5oACPEId|(4LP@?_^Cy1|A_HTsa}yNV>Gu#+jJzTR98-_U$a;q+a&0o zEb*ap^8M-Qs=kRtAR9J)|Nd;TMTm;N=>uwaYeyUxR&3DN-q9)b3{*i|^Eb`%eIZ!d ziACfgL%Da=Rw3z6KdQ+@I1G|-+?R$*ELW*LxT$1D;VJ4{ez}Cz`1VwXf6P(hr)NW8$a5zd`=<=^z2Nes7Q(l?%4*kHZmNd_{R3P6& z+C2sPwn)Zy)ml}~F`PH7p&|(-C+Nb@;#eIk@Ge$K?D)h2z1#=^Loc@1c`-{^_!Rs1Bg$q09Nz%+SgE9Od7eo_T}4Nx2xfy@_Z|#K_Z+> zeHB!$TQk1RQ%iTQ4G*NsCBfuaps5sNycbBxM6~TfpU2MXHuphq^RtArfvOJV`CiUp zDH@c#tZFg3DF9S@L`cBo!@6jd^tY-Ud-O%d(XW-o05|0+Oib*xMn29 z+YOc_D5oKI1-e&jjmAdtUwDE{h@ghXhQ^vQqLk6Z*2*V8MKd4Ss;+O)4Nc9hKb^ma zVmn5f`EX5mKdR2VE$2F(mgCQvoCL1+%8`x{Zma9rQ9Gu*Lw`|zxE4#hXNs}V*OS(c z$F&gWbsOBdE*4a_G@hJuJ;REyD;Z?(T3lR%c}VJhl%S74&my@GRtR!EOfjDR{DrPA zD?U+8G8RYHLL*Y&E@Z5fUa1W`gG|4aT}}nb(T{h}B8#V<<>D)HurX%V3|@bG(odSN z>O`ey68iS-PwcokzR#QiFIXScF3B2(d1;y^PlOmGy3eRk?o!i+yn}s^EsHCQ9G3a6 z%Bjl|@Y-M)NXlFfWd`Wk<2mIyt=GY>ilZPhpqz8hmW~mJv^Lhkw>rqHMGkc;0LUGm zzI>Ds789)(zSei5JN2<6ZEf#I*No=irFJ*xP}2AZ=3V`-_?Zn^0O$}!dW9AL+9VR*qJ3Rn24`o$x*I*xd zbA9y!eCh>9Jxo#X)Vnv7YKf#d@xonmERSEgqbbAu(1Z9@I2nX_1^|wE$2=U@kqjO8 zb>de@3cL9EwR@nSO2*(+(8m=%5Sz|!>>;w?FLf)n5@*n-Gu-QV_YU~qv&OVZxgrh8 zMkMb#d{KWWjiJXBV?L_tq*LYg^Yl%#6 z!g4ywC-HzqP#ZhOQ?An+Zt(NW)H*oFQE(T)#VfqFp%;uHc7tTWU$Xs+&HJ_T-(of( zU5NWConfKij%eL;*#UA z+TNGmxAXNPQab*mFbnMpbLV6|BvH9xz$AkTUqsoeyqKyS7iHtxF87Be!y4I^461kN zw7G9E@#qx~>&6%#IlIyR_d`?ny%yLd6XoO87){t|)m}9?$MdF3ZSKQ~5G4%Nd`Vup z-n3M-1jB{ZYNdU<(X;rp-~S>Hs8+}ipa)=}fXQjLcEBX9t;~%!E8Mr2uc)>{WA88q z3ZusbZ|rp$s5;{xcY@YdtCP7dEsQbbzNdLVx;s_4DwdHnXUhD$@4@Y@tgIq^=Ftut z;b-jW*&cd|kB4;)JJh~z8)QHnjhELxAR>e6YqgG6K3=91km~xd6=Xnv;{CSbrRVw!+;QST} zW3d81%xcR>27NoA4*}8U`5nMRh2xI^Igkf=>Z-fJr?TL#nt>oc%0AeKX^}nyTM6bt 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 GqW%YDgy{wV literal 0 HcmV?d00001 diff --git a/doc/_static/db_sph_grid.PNG b/doc/_static/db_sph_grid.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f903f8e607b4173cb09ae032759f78764de1fb95 GIT binary patch literal 9958 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 MmbSDzRQH(w0n=8H?f?J) literal 0 HcmV?d00001 diff --git a/doc/_static/dialogbox.PNG b/doc/_static/dialogbox.PNG new file mode 100644 index 0000000000000000000000000000000000000000..3e7edd5de86746fdbde078528822fd1cdee43ebd GIT binary patch literal 4997 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 literal 0 HcmV?d00001 diff --git a/doc/_static/dialogbox2.PNG b/doc/_static/dialogbox2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f1f67884bdb663b73b5d6ab61ff3d3f0adf26c12 GIT binary patch literal 61475 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 Ku0qx_?EeA4QVwMR literal 0 HcmV?d00001 diff --git a/doc/_static/dialogbox_cylgrid.PNG b/doc/_static/dialogbox_cylgrid.PNG new file mode 100644 index 0000000000000000000000000000000000000000..2b4524aa249980f9b8596b0ad373ceb547964b08 GIT binary patch literal 8955 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 P4W}TZDqSXJ68!%FP9pxp literal 0 HcmV?d00001 diff --git a/doc/_static/dialogbox_remove.PNG b/doc/_static/dialogbox_remove.PNG new file mode 100644 index 0000000000000000000000000000000000000000..7063cfb025a3086c5a42960f2e988e9aa5328532 GIT binary patch literal 15202 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 literal 0 HcmV?d00001 diff --git a/doc/_static/dialogbox_remove.png b/doc/_static/dialogbox_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..1da505a8ea6cd1c1505c30ea75755771cbb5a648 GIT binary patch literal 79987 zcmYIv1ymbd7wsSgikISU1&X_Sai_SuyBBv_yg+d;?rz1sc+ueQuEpU^zyH1UvO*Fj zljP3Kx##S&_rBpu3X&*@_=o@iph!!JeFlIx;7b@61ZeQdbDjJKe1dZMEGY_9juRe$ z|GagS(sBU+)V_azP>FP?1mH$^S7~{1_~kb+Xzv(r8HK)qoA6x4HC;bB*x8xcy8@q_ z&5T^lOi4YgTrEi@rR9}00#R`QfE17x6H)!Lc%12>i8=T>DAcOaj7r#!h+y1XY>3Go zv7%{m{J~wGzQ!nuYThJT(|DAtF$MQM(%-&_fz{S;-*TXXuDzZcN6%tIuSBm0j=+nPevFLxJPPP>N8 zxX5t-cAzQKsDc9o0fbP|3?f`)Dth)&+E9KQ-j(+e0e=n2 z5E<^uA-K?LM8HM-t6H*Zv?e8XxENd>ln?@PAwIe=%}L^$&^Ho!HMNSP0|NtwUD>#B zDi_qMH#i~PhSfl2z}`gm?PK#=W~)c(`JW=iYx*k+<@f}lu@=l$1On~GaYvV!0-y|gLf)G3+pe}P zZ12eKx~#ew-Nq1k*MKg7M|l{};Sp`$f4wWv z^J)*O>&5pG9+j}!d<=j5lZZ%n2GgEyvt!`I-tEyE6Dw)%vyZ3FuNYdi`eA}E@RJY*^Np4A}{Qd`oo+nH))6*hTRAzA) zVQ1&s*jTi^z}8{cjEoFjD$Rd~Q4oli)D4XrT$0w)Bbrv|>+4ekH(>bE0G&c9J^d;Y z40m(5aCG#$%Ej4vb88ESUbh+?<7rVUn?*$bruXfc6?>Xun18KNZ`ikQ2tW#lO;SbX zNpJI4{Aly*{mH_dj%t-iZSj?76f)+5+_gRdr+X@Lj$r zTsj<9gfxWvV5DTNFTamf-3+-dYdvz)K_5><|HL0rLI3wot;8+ zUAUv2DnREaOgGB-@WT@ zS!;7sp~MIm`&pt=6hpv=3e;<#S&OQ+; z_p=drdlmvGflxyqDKzj3T~bnFA`!dsx2#t+xaVgNb-3c;o0(pG+~E6UBtrm~+j4zX zztc9m~=>#gOD<;uzqzG->k83iJz(6|n<&+!oYAf6O4qrvV7jDDu9(CaR z57qgSt&aR6ljiLBc*GW%Fe8icW^|J5rdMI6g3s4U`Jt5IjCx1N#2DP3Q>h-iH-%b) z**--HN_6;l2EAa6a@sBaIOh%=+~ROp^||~pw7R-lXmGaH+39vPcPDv)+qkrKuAq}L7mNxfLvcCA!z&b@^a_IQaJ5-RVgN+zia%tf93YrkJY(P zdi;~-{OQ{*S?#~wWB!qmBW1jSt$vDMI{VLh!-%RXDBB{zE7AD0oyq56?$6Td|N6pG zWb$%%6If~a!%k~ zcE>%xW&vdyrx_^PvK;EqgO=w=G=l9_90PoXLZI_2lVnAJi;~;sQ<;1Fh z(92z3OP(t2$$ZV$RDmo9zPy6Mcv>+B$?fy}c8Bc(YlV7xLPFg}D+<+XyVtFDv!RiZ z5!py>YHBJDqb@TVdT@7}9RP?ct08L_j;;%uCYU&0875q}yFV{B96{t*xtl#5XS-iK z(8KTAy&lCSg*Fso2|W)<3?bEVwGpyZQ9_xixhw5Ot)j{zOLSZsIQKU@^69(+zMQ*H z_fTMLB2T6AY_;i6EI0FP8!dm^$e!6F-1G62F8EowhU@$|Ufrhq+_bhzYuEELDml&j z_A45pro&LYjheULOL?<$uYq+6ny+A~_pV&2wjC@GX7tK^S?*xq?}CQ4+OAf7baRA9 zA6d)V@FT9>jqW}0`EvvZeyIqI+3ee>=&^QJ&p$ClE7o*x&x+x8FTT8{iP_!R_ZDUQ zE!LPw630?wgohy$VXQLxJpMf?G@zExnrU&d2ox5MH?1=t+Z{{S2yNv7-#S_;^Z3$w zo+aRQy4s%ZqFSPggiXJ{T;fs`lbJ-X)x&e>`fFz-+2drY!KG+iwo_|Z3qd7brAM?E zm5}>Sg-+9IyVqK$e<$L^E=}TahwtOV{ev0>m*2|8(K3&Ve38vud3Z#`=D(^ zdRNDd_WXGBYJIA)>~yBzp3U$1*$q0Dkmpi4JGM|UTVF@I3rtwuGfFV&MQs@Y^Hl9hq~%4f!^=GhOJmv=sw2h%?v zP>!(>2||0|09D$p@b^QIO0*4y;9xyKxU2w`$jfVMS1DBv0Z=L8OlLokGc}cE%$T6+ z7~F~z@OrRY`de*1(cu@-EJCh$zvnJaenRqcUAX2dCF_SDiwWWLbN&^%B%490sGD*eA z6hy?v8nn7sw3rl)XD0d8{dnXcBO~MIZ+lY1`jxJtq=eqUYkjplCL$j+W9_D{j=k66 zdhi+G{<5E=Ngor-gg4n}y+cc3#{XrXR0REse9vy7%?wP%x_gH1?tg1c200y8pPs|c znrv4-hwkAp=|>Upoo<&Ta14DP*W-0q`K4AiD?^EqWHyl@Sm!(|^IvFd)tMj7RhnpV z3JGNw9?Z{c0#b^KkOSA3mlri^W^jDGy!cS1VETEFj~g3009GKBC+!;@@_-hmg^`gX z<)=JWg9fl@9rtRED^n#@yxO;GjYRD%?>OJ@GNg~CdBE^^5XauSZ9@zs{p|FiG``?~ z7dxrTO*vD*qcOr@taJY|CZ*K#)mNk7v+L%UOK#tK=iEa~|93!A1m3WdeR z1)rxHe@`^TP{$=jJx&KdX8)JOFqFi&xQd`p8CT9X2xN+isVx)7wnXxE8z+CAix2{> zwBU$is~fPO1El)c@KZ|#bVB`CvYTP1`^?|_3jGywJwFJ5x2MAg|eMOU|!~k%4thb*$uXubBfZi|^3hCNUkEq_a#}$ip;OQMJ$SW(e zF?{ZF*&BB|TYa9Z&>@d2cG?>FIP`J3Dsg3{xAzly93>T1VPRpT?JVnsw6Tn{%yIAh zZCZz9yy@&)LLvJ$VH)NJtk;!8oPSU@Gl1Y;cM(|_TPuJC7kQv`s%sfKswU$F2Kr}S zHl+XqGTN=rN&L8x(dkm78y?$kzOeA$L$&U%9)-*{KDWz48uyW;`SACOYt1|}lhR`7 zVqU)%d$$td+#S&`zVwahe4=BcN;gT|qot|xmcKq!^O)?h!NW`28q9vZ*ptLw6<{BI zo+;VJDLE{ePWy=20|SrYur^FAP^io>aBol*h=hm);wA6+yY0-muExejgxsDWQ5O_l z5J86PgjPV4sj8})+Soicq2|dfkHwAb(5Y9>x7*wj4AaKhl+wdH&Omid%|?-x`$96wGwgrdfA8Q6GFN z8kMv2@zFn;JB5b&7?BXRU}h-TI4cZI%uUutWq(`7tfDLU;5)xe=g zP@@Ua(pv1J4z&|>tP+FK++Hv=q@frg0s^9=v94r^2*tolH(iu{br}y2JFoTS_K#9i zC{iUaPx#7mK5Odw)kl98Wb5Vm?n`cnF~+JMims;WU8Rj-i>`jB-!q%V`1R4+#P%27 zUDrr#hGqj87?_Dn0mxpSpjl<`i2@{jw_y^>A1%zXx+Yo4$Dz zK8FldawfkMD<@~;Yrsnbt_65raYu!6{N$&SRoV(md_c6g!@-Q*g^OGm0-`_d1`9ZG zWp%x&5)A(!qF|k;>>esno7^dKZ>5&YUF5efnWXEzr-EbYd@x;yvv!?Y&h7F?0=z^go8))`zm%~a zs#zx{vasA<&q8k{DLF`*n(9 zdb&kMx8l?c)WWpodRi+36XN3|)XqxbvUuGNlU+Jgd1-okd#%z|JN;i=-KLi@`Zo3_bVD25kI?s_tWsQeE075Hsyy8Z{XpPLPf*HMB^!?<5^Sb z`T2doj1dMg7Ue+q(B8C0p#>gnl$ zX}u>D2`|m+PmTzdMk;l6PgB{V^cM}KvRP?qX|QPghwI<&e6YuQ9{?2~jG))z^~Qn_ zY#FD0=1+PD-^Q-!uCTJQ$;I5j9L16d5d-Ar;=l7*gD6#LvBv2@7J~v4@x=Bdi&{vd zZ1&6&!+x#fxp#mB0|Nsg2m$qNmZ06Q*s9nA2%pEP?PC4MQzJsr-xCuKcjp^=t!@=P znG|enS0f7sg1!$wjBtg7I+@JjNnkYU(1eV@AQ_r3Bdna01w`wV(h)6AADr_^!_bH^cle!ZI?$=SICPYB1>>cIH`K zt+%JziDZ(m{P=iyJiY_haTJoy9$fwTwXHD1MGBePUmNu6zq|vGiFjvLSN*mIqL&q` z0dZ^)eD5BHCDXp)ENl=9AI;GVdn{u(ei*uPp^EG#UJu6Z-aaHG_eFcUK~PyWZy1ixYa?<-S0KEdE% zVsrEH?d|O0A;bN*;~(VAWpO7LsK@O}_Q`@sRYhoJhjg2#yYIj-IvshTJ_S|8k2$Z zJ0D=a(T>1FdlhYfkhl>5-yU5m3z+OI`8UShHF}WydVP83P6xLOP4Y9B3HmQ~5CH>G z#CktZ?|jmJt{W`2F4vlkfRh`-jBX26$w@yFgUe#P)M&>~97{RG#Vt|8Ip6A0B~yUU z=T6Va@`C5=?3~7VvsP=SaeKP57LEWWk1LhD$vd>=YctK1$3!{@m&Va7-wu&rg~Vrk z5`VARQukd(&zP9yz)$w}4A}Xv_(%&>3JxsVOl6<{Zcd&h_ZCikV zEX*^!^&c~HPWa~h5DWx~SYifrgq)vHQ?HCS2Gg$3uL=z5=LbdUTy~|2t&^hZ8cYF` zN_2u{>YWCoS?v~=+qc?Hf?n6fa+mCDH}5xjBYqZl6%Q}@mMd!VsfU|`_eSdw(f)*jj8lao4DHXG;Z@^boA zRqYdv&4w8yWOgCn`0s{x2%erLX1co%249=G=i597a)_|7T~T>>8q^O+VI39-*WV!F ze8x0m$Jg+GtiZaxcbJ<@dCdU|@$mnhs_f9h*IbM)AFTb!Jc+jf>&M?TB|p=ZKO4OjD5k3r13n%eo}@HE z`dEUI+FKHS(xLo;=!ZFeu0ATdAoNj=fsNj;9%l;)85zerJ2y^i9l`KNEpu(C2!TqP zC>%Yt$N57E{`hQEx81=@Cf**p@hTIjn{RB7DFrJ7}Govpw}HF4Ttixg( z51Wejrs~%NPvS=0z| z%-~|7CP9dGgID`Ye^-9 zD4yLS08BSI?8XqydViqb-i^Qt8y(%YfrJ^fn#=syN#^7JlI*mgyN+@SW4IyuO-N7h ze)#y9pPJgt-JJpZ(!m~~ekb-Uy+HPzDE$a;{Y!><;Ln92l|r9Z>%`DhtrIXEc@Dxd zf7%jYW=?r!#1v1o!=_2RzrS~=e|fo2HUJD~e#b4BNUy4@x40iHHW(?r2loF|GEj$s z^LZ`z6TFKWGEk(DRc;@Q(LXr&cy~uhNx8kVgNGaz6@~2Y|GK_AW)r`CkA(e$X5#(| z%JAZ+_$+FvX!qY0h!yP6Rvdp2<=Y_1c>eh9=tr3c)_nrOA&Ps-*ulLx%Ge2N>CZk! zms=sQL6n)9nHAO=(f9(|MbkGYOSkLYSRX%rjERZC2+t2=3Kps25^8t3Jq5W571p|6 zzB5f#$sQ73i)Zj?&-Z)T@2TYO)`QW6RWrkIMrv2Quh*~cZ@$n}iV&*f z_Pyq7WCOb#TXD)9u6f;E(HKurJ^6Qjvn(F#-aJ`T59*=SAl<&^@mziJ)m^VOdh_C2 z=lIRD>3rIs>S}BHt|t6Iw%@<22gdV=@Jw}E)jf7cQ*YBa?G|dy<~&*}@uM-zT1N13#a49I z#0sXOA8QVVS&{|yrn$+;a`oH2X1{e_&$Gzio_1az-sp=4<>lq+GFIIbX?2POvoaF# zx$zRc2Z?bjPf{BQXYp~7{R$^(2%@fTv&v&RJ$MiK?yIieQC9~(+O>bjN}?T9$UsL7 zrIaQQ!42Es&1^Brn=GC_V81Tg7zWSD7%d^b7zh#aX2iy3SQH;L?g$nHP9 zm+f$O$~VG?SzeLHlH#ERY{`?d;L-=kIypJvaXaRGE*UM2<`kK2X#O)`zWwc8M$Jyc z>|x$K{B9ALIYI6o=z43CpimhG=a-d{5g$JVl97M@`~fvB!E969q@VlgTn<_HM^!N( z2%>C{#9@dC57%n5jFU#zPysa98=@$sgD7*wp5s3h0buo#yp&Qvzq;cmmW~IBcZ48H zX&Z}@=V~XDB5f&G|TT*7QJvU z-}IuXiHnQf@N#In4>EOzG&#IxB|~~=RIl$?0I>@F%(ysEFR-<>wWbMZvRi8OU$do_ z)VH^<6eEA@u(q1-4JEu_?)6gO7Q4Ac0If+L;J@0@uHR0@!V*4_C8A46ubD%M5Hzv3 zG(X=rXpkgztX+R+IR7X2J+%V69;@Mc*M7Tqg=*(HNRyl(x5Ov0JbrtwsE@Bi$qdwU zmD#BLZKIQX=|*#1`#DoxqV!?%%I7gs@eNa?of{lQwN!;k$3p_Iqhd=fWMoeN6g%u6 zmF_w65YlHPQ}E5@;zrH&OnDDXf()Xf?D#0aa;HBDa0v1N@1Y3W9oCq2mU2anYSm={ zZZYw(3>Fw*u3QfZ0OR{2mY9c+Psa@@jf44j7wOg+9Y%xpN&Dk1wa>#xpjnRS^FWa< zqr;q^cnuW}@WSuqYTf|r=;U-E9J2l!1h+9i?hj^$5}*SECiZmhINp2>S?+Kvd%9TR z^GJJcZ*l@5xRsUF9DX3rFQ$i``JlMOXKjhoMToV$hS7mFJN`RSC?X+~cR%qAwO|2+ z0P(KsZ^mE=PG-#JeT-zHCuA@lk9X)G1Jz+d9mPVt5OiG2zS?ioUF?zigqf1cn7z!) za!HU~i-sf1|0{EzA{ag-0)Ma13Bge9QGfUD-Nxo-d{UPB(NuC-sl3}E6Q8?d(N5Va ztLy1B)1KL4d-{hmX(B)932 z(2z`C)?a)LggRMFSYL029>E?yLQFr~w^4}{oy&Ur@mT9}EWPID@cC?^&Z11c0-xIw z9XMX88|?X>4iEq7V1AdDS)=pYV;%Q|gSqMTOPqQ-iVD}~^XY>4o7BaJrHbRL+LA~e zl#%bPT1=h%Mn8f|$ZjblLdj@ge=2A(P6+%S z9j$L_N|q@wOWG~{{vDekEn1U^5X1SRClqb5k%K6*-?&2k@uX?3@oqCxcDe|y)185z zU$zH$PY&7L2J^-csM&3(Bs#tSpEe5nf#2fJ~%BlU{FGCj$3Hvewuw89&&c8R=&>#f*^_}H1X?*x~_&Tz|YY+K*5^K0e$xHf7anG?+G!iks_mIR%BvemLkKjQKTN z5CbT~KI&}8&iQX*UYXU~q8wAQyDXUg^csv6_leB8jOJY8i+5@N-rC3pPZyt%$%}hXAsqn!V?$*RZcOn*=OiQhbnPVoND(_s&XG7= zYU%2hLyi~>ICt--iz-h~5m@BY|DH^l0iwdw=SNi&N3%#$a&n>wABysk!GJwGT}k5S zb~)vz^^2CWFD_mWZn(o{(A7hW9!Y77l>SZouAM(#Nyd|h79U{jBk;<<{Og-We0ZRL z0@<}*9C=BMecrk&SW$p*udNlFw*v&|vzJ<|SG1a5tHE-e}kAeuRyK zb9;TD0?*ePhC>{Ln%u9qz$A(MmL4_aa1x2GlF^G#k{*W?5-r zrb;*@!dQR+34`KEEbT{Oc>|TD^K&dZ^{(X>vzfC9EIJT_U0okc|MK$_4HTw9Z{w_w z+?(+KQ@PUf1_>jZpT})eEZKggc`G0QsFB(}IpDE7oZ&p03vIHYeitbqz~3ey&`%!M z;Phg1Z$Y&CatFDb7#=nZIc8;TehsaxbjM3NHD_Y1ka5Kyv!QE7M6%9QC@RuCL!GWX zeky&DjBH6xlEvnd4KV&5C(&)<_h4(>$&k*aQ65M)44-6XkQME0%a>sGZj3za<77K> z?|z#%MF=i-4RSDUTJFanBjSMp-ub1-m9ht98%;@=uBT8WoP`Cl2C1lShuGvdCVWWjK=UZ1{+AFo3NBOxKh67eM^WZJRgOGe?wfq((Tt{KO+p`ywt zTW$9y)@vOC9)`{vcXoRY9B3pe@=&(50QH9t4bM3hV&r7fpBa;z5bZeZ7VBxvqd{~h^c^_k5VnJg{0M@5zb#G^+xgB2aw8+>PUD(pHIP~2XZ`(Uj{AhJDqw9g6dka6G zo{U>`$&yD}T@PwO=^7+159sF%cj-0je_yZt=xJ_lKI3`;K3ko|nTTNwwWo6xNr+wV zFS@xNWWC3ldBzH7k6#D-8qzP6v8Hc7Sn=tPFQGbqmAw1{wm(;Ql-b*G0tx(utVriJ zOa2()?d|P(c@!e~V48-Pl#J8VjSSw1lAwrXGSo~G?;;md{-Kb^f_q&bXZ&vJ;3jD; z(rlrMg5sShg=DOPq9RDrzI5#G!`IY+#tzy<8OG#nK^LlX}tK?~~_1?hnDv78W{C&9lLJwv@+Z zx86Z0pfJ!V;HPlaR}LGDquDZ#7a!xZ)y9def*l;p`K6^-n9yJ~7PKq(M-!PvP(kIZ z!h{Nt8*P1Vps)L5e(>(_Jaf}WAnIxIix=b3hnsQF`G-@gXiAnf%Xovlzdl zz(jiS_ATIedAU=ATqnTgF~qeNMPP90rQ7aoHo8A~VU9#}woU2o!(l6DUc@bK{$S=liG`Uw{o z-qB}eN{n_Gu`r>TteNEYn4W@H+rCtO=hSS0+5AhhMD1o;D#uH zC`+PD9NSe*qctWbgX@gI+gnUI2SU+KjECI0wBU9InOKa|!kPj_ec;aSmNBhR68SZs z^9}Qe^Xo^78ydl^BW+`?q})`=iwhKdc1LIDQa_Pl@+33RPnXJPZf0IXuXA$YWQL#8ie8l)+TFGUo$?b{SAL>6tv3n|L(~av zk-b-|E!BD3Rw^ij#~F2`{_3`;a5@tYoUXJHqoc1MZ*K0d{{cBVtLehAZz+k~ZrU+Z z-9G%M&+usZpRFv*)RQDIMhuz%ATL#GonOTeSw!P4{Bk?;f`XbuFdQ$G zjfXu0*|)XIRURSd((JWOP2$+Wtpq9<=2%H*=oHdstFAV`Faki<@sEtKIra zQC6M74Kq@?jfx z`!`*w`t0~QG_=gs{|f$~>Z-S7qXnVG^D1{nae-JsP7g= zI{4DAE(`2mu`aF^W<6d08kie&(CQKnn_yt-6Fa^l-J&8_VaSKb_& zdgPtM85*IJovAYaO#mMhpln{Wt zdosulyBJc@(u3iHdl`dqUM?gy!n^liOe04h5XK z+&uNN9j{%tQgSZEv)HfEclXIepnd4G5dv0BIfaz|5Q)fV%&Wbc5y}a_m0vgSJ$66r z?R)Z%V~kQr$4_i21Iu@NtRh~O^ zCrVq*)pl*wCYed+ORKt(QH^Y}x&E(fe!7u&ql9G}_LPFz*1nmw6GM_P2 zRIiJxnG=i}xvZwRX=pe(=O!SKON3YgE=E>X&*i>sf6cR}=h#q#(P|vT@R~eZCOz?J z@J(9!?Th=r?(Q9aer`TK$HylX!<8W+uoio8+6>k7N~+-ih#X->EZK#p>&1*oK-`H| zpQzM8TrV);yZ$&pwOYNu=R;8@3D|Q6s(9s}@JQnn7Yi|NquR^1ARK99nJ1AQ#76du zW{&GKrYvXfS#JdcQRQT#k)4J=YIEx(IaY@hGWnPcI*vwo#@gF=K9{JHVy1m1O&qG! zYxmkYRKvkZ{#8KmT91gb(q=XNJg+&z2LW=V^6u4&wzf~xX3Nsq?S6SoWQj-Ocz|k@ z*eB}-K*5TK!nT1q zkqcn`-5JGi!a-a-8C0og`qzRiek!RXi7~Fv!(&vt-gKz^+qYR|<&k8DrAFV!OS2JR z-THuLhdMl5K8?Mm*ngOsllZfQJ|Pw45qcYX@>tgWq$mG~S66es;gak@9x z>AQATY!AM2WWJ&h4Rf&S^R*q`uK9Bjp%L+3&y=VTaM_oaYMDFvTl2i<>Q+<0 z6c6t=t}JQA6TU(0_ji$-~2jVn$Gwkg1yfJm90jG_kceu8Mtvh=R1$ z>DNF4hD5&HuIt6{mP3-gCa=?e7>W+4Y@-0k08CdwwJ1{c2fTicQmOb@8GM%y$;kNp zU(mQn8sIWI9lNK;>^8Q;DT>C52{hMoASx0j!_)bhuS?u!n|+{>K=Y0!mQYY`rXu~a zA18Ktir>yo4GsnX9ZHY)4|63dgL89@#l1yJ=gzgx-8ua9Z+YKhA4w`XEZbgKdlUH=bYSv(ix6^K7WOQ%w zk2?m^4JY!Pe?N+8H^_ zC(S-b3FwN%VWKQZ8xEOj3MHc(Ukr)_jL%9jGZ*URpuc&06L1mXJ|<`7vR}75te$OS zz*YBm<2IhmAIDKh1SF!(#McPX_p&1rDP_1v|D>^J35CSpZr0o%tPs@!ISQG)AlG?C zPSK#vaJyE|cx{pG>wfm~oRdQ;3teS=vB%m9tI;m*C~Z(G^C4kmFp4-cJ$;Fn{`fMH z&N{J_b)r}XiFu4PY^S`sILIN|Of$^f5=I_RGfAyX6;oX6vl0O^TtuN&nz^M(_}e(r z7H49Fc+z1!Z&?X(od$ynM%T!nrmqv}G;}jEeJc*^ zo|cfbXeG6hW{+;jY&|Nt1>Pq!C@jg=gKn;{AXj&(<`HY(;_(5e< z%RUq-FYbL8{m2}@j~vIFYO8njVP@-RHpU+@BR~Rfyuhq19>agXI(KU@8mxvpLr2k`w7TQdQ;z18>D`-vU<;8%F%g%PNvG6!qWI}=V)?hO6Tc|Ms^NVAhX>YWlSCG+9%j>X3V&M#U&wl%F$L3cTHEJcIah=3}A@HSMmMAaG` zzJ&u*V@(b1`9L%QH6?$u|LcsisQny@! z`jy(Ba>krCARMh3)lg{;%%r8JJ?#x?_$6*W*b6`}HEiLC-u(+l_(pS$2@d0(`(|HG zG{Ilgr$?Lj-me|nc~%&hu9q_<*AsV-qxGdR zoXV=IA+XReBZqhr^3${tpQr273avolY-o5?wM=#P#hj<57;-dg-Jno3GCXSh&iiot zV-Tfi8oalc*Y582Z_r_kgiXnW_KA&tgcZ5BBI`H#Tn^U{1PDG(ScWUpyIGJ5wA@w? zER4c5RvzmeR0WkTBdGDQ5s(r}26_FVRUFRQC4vU=FOT ztn5Oem^lJfLvdvggjA@Psg{B(f*Q0zY^{tkjS2t)-ZzWQRw~9%6dp_t(J}?Ir5|C$ z*{(~1AGyTD)!ZWym(+G2pD|!RCe0)DGrkGMn|wr@{=v!W>>i3FtKEvAzT|#_&7@CA zKu|V~b+#&iMn;K#{sDuaWzR81LU3db)^$DGl0I0r%TyvL0?-tyOZOS9cNFDEZe++Xg*g$cKhS`%9USu(KH+3HK33I zb#v&%paEK`z@>B0P$Kc_Zx|DXPS;)=<ezV1l5 zo8HHku3vf1!E!2*Q&JfGJ97+G9L9a$zzLt9KcBH2!gqVhVY7${5HEL~-r^$y0f3u>Ywr7F%dSnza6bqyfvVwEfqqAnT2Qo$AfwSI3^30Uw@d14-qtx*xFL zz1(r!NId@Ky>SbYOLve80v?X-^fOfYERJ~y#ACS`0(*B9Lj-C|OAX#0j*jOiOHIMS z!BE2V*kD=~FHz;?=B6PcTnzo1E#y%t2b;!jb-9?rq@`P;<+u8DM6KYXKb5IHiQTOR zUrEcDM2A_rxoOQ5R4{4jDv^{PGEz$~N)KhKg%YJyqWK0iB#fxjVTSjEb|G+m56veP zgc?|MVL;?Ny)*`F>=Jes8&e&!yf!!NuU~HL0KGwD`E(RsCoj)|rMBKfkwwafH*dzr z$Cc`8I=q5c4Vf{qu?yR!rVm^#CbB}O`uU~|I<}#47UvPlJ_JPnm;}kVYdHHt7A_G; zy{;C@R~mwk6ur!#{89x;mNJO=X_Z#T3_}e4{K^>6QZ=pHoF(Ah2%6xLd%^Ez)NZys zYODZV@1XuoAsJY5H}>FnY>Ls%r58vH!bB@OEP(mB*%=5x@6e z>&axWVZ$rz$3d!9QwVE)`zC4|p0(Ayd#QbkAqTc}3pm&#IOH@G+ioS;QXsb{y5=(5VZ zadN-+A`x8>{a-x2_5J29&18vw3`6)gWlp)>9$v~NU<>>IRv6ebjLP381@yVLdO;0Fj>Xlw=lB6{y~El5x)KTu-yrB_f?B`L&M!Zr5|`cfv>hAF;)x8JQH6;;n2@G(jEjOUO&rhEXx6sS=SmpQg@Z6~(c{Cd zBl*6@Si0@5*34pZa+L+@{uZBKd275wzkTo4K#bjFt#~B%I5-zZMuxU7zI<@!590Q` z+@2PCjXIr^r$Q$@UG?pv&VIrsTFLeGF3Ym&D+ia*m_rHAfR?!334{7CEKQeJa|}9_ z`Yq5vu8~p32uQtvv~yiuZP(Ptx3Ey#=f4BaI$(f1^NY=ZfPXzcwX`&rKKZ*y(6e6d zZHG>)+!+^Y<_E6Pj8P?5E}2EhRs8CcGf7oSUws_jzp2;iaeJ_$Q#9>%uzas7Czrk2 z-p((OC{v(GesO+oi9_sX^>EF(vB6cT_a3CVcpYREUWImpv+=qH^ve)zt~ zM@vj=?qp;T0>bpQjg(bgqlWpeyn03=xzZ1{^dq59)=u=cP%r-IUFK!N=`WyKOv2-A zYH;0=?f;URix<4wRa-7cJAHKBdGZu}MU^O}mE@cHGS%N-Ac}Se1=>%A8iZyRf~;p% zi%u8ozVb1g6(N6p<=0+yvYR=KM;c4gbaiq^1)cE`cpL~=*x2S47Vlxnup`CE~d<|7R)YhfXHFfhUj3NfG%(zL_c%Pdnc zH8z{rIxM6%kBE^E~j5lh(t8LmLUAy`U893Bn@^Xh-w~^HAlBD znp++~Ea$7g{K8xK_A3sPZZ)k7_r${C#HhM2WB1a?$lToA?5vuVgF}8X2+KTfA&LXL zGq#}5%#}A&lU@+({dB%`0^sitQqBMZxRBz1ro_w&?e?|O*&7=O=>3p9h-sMpvR6=2 z0V)&{uWqt1btt4aQa?b59j1wYlj)p5<=@4 zQG&6XolRm9X($}v#6GOEJh5u-pF7TwOjU<7l%Bk@8 zA6U`Ia4alJia_o=W&H(!2Jk7Q<$m4;I67Vrpw0ps?3`a0>et+Lm zA=w$v9fZs(@iyF&5dL$Fz-Uc?w1qeV|7&bXCBRt+)X@{*91WjO%zf^D)c_M17zG{~Dxq-ow^-UhV$hhSLvw)ZiR#CAC?R#rWs1Dcr%U|Hs7Wo6+ z{jyY7h%*<-VD>?KJ3PE!~XbH0p+qdyV{2f51lJpx%gch0%@ob%mt z@3$WxAAN|u-?i78YtAvo9E*#BW1{w0kcTI{4b3y)LDA02*uugROKb-OPO>f&?udu| z_77r8p4u`W9c?`ouy!qeJnrd!Z1tkCE0%Nj=jHJt#fdy!F#*d~>Q^&m)WY(^Ld?+2 znX{f>_3)6h?tR+Bt^LLjycF|;>604vDG%DojDzhR>%MZk^f2mpbc_cjqtV1O!p44F z92`76a>s4S=a>|(@>xvNMdQrTERc~c-4G)pVt1`sZBRLgYH@uT9$wHGx~>X z!LkqtqFash{-SW|+-RHOkq4$0z-3$y2 zOroKIKk+BKb=B1(g_=3VWj1{|4=8)swM#19x3e@EvnIRP?#c8%bCFY3={!|)51t;| z{~(B>qb$Q3a~B$PPgcvKd=A*Zp>r8MunwM#{A$YFnPSY0)nI|e5PpfZMrd#^GY*%4b;aKE5wZUv=Yo?f0_rb?1$ z#hYrvOOw4qT4G3GI7f+KZuRk@F=y;zWctZND9(G}#w}x*u@^m`dKiNKY zC|dW}j>k$%%)CnOn>dkzf@Zb4s$ZeOU1zr6m-f`3kk2L|dY2(e*2mlXwsr{^kUVv? zE6n3Id<_sUjhMR#9i3;}oZSv_B;$jadonUC%*+)0R?6etMs%(d3nP+bVC+`dl##mKkrAKghe6|&zk-Ft8{Jj%)-wog$gPZ}F97Q3la zZ9CIW>tXWf(L@cLEacgQs(CNM#je5PeK5`xOCZX##Q`Jk~W+GOizy5d^ z{$3?>t(-@uOp)yUS6RVQR0Qbru@MRi3ZYbdPo6lIa=8W#_7y8Lx+ zuAQB-vT}r$?$^iODrtadTuaoOa7(?T>?MoLAW0saoZy`>pSyh3;@z*I+)L=wi;KIm z#t3W-RBdf-CqhCe0f97?4u_ctvK|L=IYvlv^fCvQ?X?oaf(J{oHMD(C9`j7HL@_a4 zy?TI!u9@Lg;;{Tmp+%Ql^)R9)a@zCk+k! zEtJS{h3`YLDuPYPI3JOmuz8Ddh>dR{|0|vMvW3{K2*CW#Y>S zih;ViT$OVOm(+I^{aHVr1xob2bvp!Sj?C^-dWd~cO@GLx(oIOz2KfmibHKQ0?-+`t ztZ)_d<3maE{=n<-e#tyxGJLK1zouMna zxtHd0ytyopQD-vv=2X{MSeVh-rAn{n32U|651}NE`5zi0nau@s7g$zT30LZH5nvmF zeHklFh4Di42Iqx9k()QO39|5@DYW0b1O{zQn)X2wVGIHO6>RH#W1j}k^9QTL`WIa{ zJyvQwT#1L{)=u&0V=#Gv+qWXYX?}k{^TLZ*Q{B#c#2!nJ%kX8WY>I|o<@(656syS6 z&zfo*c0IroKwo2zn0@|$%OYMksygHH#%k&I&yS;4vI57YVKvvAU%g=5^VjiCq$4a; zGWm95XON057n7^c^RDNxMJ|7%@TL8)Pj?qr7eyA2w!bYzy^={!2TF zO;6F!(geP@H@S|hruIL7|Nfo!WF2cfrea6>v(48%pPoFe=%5=`z(;{C&`jNNR~_T# z^y#lpJf{aXr;ay0^+S*+hC2*Op>P-|Wz8ZOzstoi?qV+AnXz&joae>6W`X zH^i=0+I6I&>UzdrpvYWCJ@U(+QYn2tnSWw4m8sg4t|z9iWT11h+1Gqn^wcm z_hw4x#V}9RSWl$M#omnsfUX7*^DA;O&8MZo?_!V0#meUiU2T`1jMhl$Pqlx#XfHGo zGS0e4fUncN;cj^Rwc#m)M&8}nHqoP%$_KTz5iD*2GWH7tKl1e}?K`aa$v-FO6Bd2B zX!?2nQTH2YVI%^9q1wj}+JCLJM^JTz{9`HaZ!H&Rzo+ZT0TSp-t`nHeQNsm&wVT zr-G|prw3TcO5wz=t_T!NgnTH=s7)%tC4P*93I^$b?BO|hybsp79$o`R&6EC_Mc6)4~gRp`DpNBJZ5lv^_=OC7P~mHICZ(d zE!rG>c2bXxzBh-$B+s_a=_V~oy&ub3CI_4H)Z~gf zdFgawb@t#+@qQ*EB74mu@`HIOk;cZbghWF`e%rJ91n2!3v2UN_cTd*WU!9oLn`)e_ zO;phy#@A(*uhoL8fsBmob63}#vz~yl)Sl|%w?)O1=}3vl;<}3caF3%o;C7z*%rJ@F zwC{TKYwFa!OW$?BOE#&#G^N1yvGaafff&ub_H7L%9hU zqSY6e%MBy!6@E57#QhNQtnPC)lb{P{8x4)XzFZXVA=F*w>H{(>JB-G+}0bg zz}BqJeyI;YR**}^vgx^wKN8ax^l(2?-1zyWW!GQww55=+S^Rs`2BpU0b=zU}w%NuL z3!amig)e)gOBUUCMOu<~6DJ1S9gcp;>FT=w2qI19k9STYJUxoLZrqA5@RjQ+NKm11 ze!85ch6l6eBE4vStDS*?_(|7Twe!}8U(TQFwueR{ueiPv`_()` zFBqqq^6pbfT+5am8D~<1op8eEvMJ}qCv@iz^PlyP=W{f^xYyD`8xmTxJLz&ZY1eAn zPEz=nw1sNczW+G9xa4xKt^;F#AO6UMy*YAt+JsN*VoPthvtm+n@`G07KGWsbZxF^M z*AO40i%mWA-P`46WVg11f~t>P-&j2-jlVA`QDoX}clnbl_uJvephYedVa@R$qM3)J>0* zz6CpN58FHA&z%+{MDL<^NXq!lh5VoxvSy*_oey$xFonk*3glFO6^wS`=IC%=YvXn zKZQrr`@mke9t011V;ljb*~g}exy8p~$ysP^{4)VlZ^Ry+43*VNN`$QvocM*`)9hqr zrb|6O+$HWEUaR8#`cxb}*rswx@y;Eh&^veTh)y+omAmdYrTXGN`u6Efa&mUv<)IJR zm`NTU%g>{THgRw!t88zD66Wcxmm;`Wz!YP$%4zMesfpNKNg43Or;R z-HUs|ii=o$weP&1Qyy|@>Zr-TM#V=2-21>?FC9j6CAIEoYgyx)Ju(%^iijd>49Hm_lS+k4ob|qQ-zjT%c~d^HXI1VH1fF+s0o60V?grew-^E8 z8$gCwVoKzzx9gt1&Hse{bJ7i-8BKKXv=q(g$EtmYf-cB^&eRjls~#G<0Ab1+{;}#< z)xQ)np&;Q;Nb7#I(RO%n0F>#3^)7@0ISB&)Ir6%_76{R%-ET^O1gkr&s_W|NYKlWa zFeFk=$6MD@+6cn$M%P#l_7*-_kWC;%wAZ`yy=!o+N<0@X%l_k_*5tjg%&oVbTn1@JH(~LWw zWj0eZbNs0OO>g^`u3fwK`b$u1yWORpt(7vVcc5(Ll{##1$0kYyS`PF@;I2snYUa|% z+Rds*o3VASvw=)W&zD({_mk&C3vrU4p-ND&G3jY>y)P%5jDx>ZK4HGq`l?lO$N+99 z9%oXEDLD36P$)5sUA|?@m5ai}lvSp0WQ5|Wt}+S6tpJ!dU?Vc?oV2(Pu*X+;l{1QV zDWL%O->RQ4y3To+XR*uVNlFFJ%@*Q){mBq{fAOFeI~kKHF$0#S6E> zUf*W?h+_}57#M>%IXOLeKuP4_-~ibr#j2#FBw*r~oVKf8&y}xJH+dZNCyRpUYISuL zY)@Nnpoj}*pbV8_rZ@WbS-oe*Q#aL70$)=E0`-!Ncec33{reR?ZU#5=%po%v;Y4&|?ZiJOxKt-_O`lV>a!BKiuu*swm*&1*1Rn(fj4WLh zIt8Tx;uRrx{b)`@FQcq(+~CUSH5uKBW_1W<2=3cg$s4?nQBzzE>fjr!?AX9*OY7W< zcqn&Vb4l&1=}?+7?MgBNO1@U#st*mCL1-}9#*}VhmY06xgoSYI!$ub(`%2A~Wl3yY!liIk;{rR8{yi<7o?{HRqexJfbxt=OsO zXoCLMkUI`0=AE)}H%Kc82?%CCAw0eCxC}rQ6?qU58nX6{f@QWC`~0|Nun zb75sgr_z22bidiz*$a4F$mntvLaYIo$l*#6><*l^S_nFxK|HR>>#GfRm)h)T!u_eu z%x|%%Y#nG0w=KNeF66Zx((S^uH2o+9V~fqTI#CsS!?t+b_7Z`=LV9*ahQV#tAo?~t zk)EO{s?b&#%Cnox+aooB2fvoyzI_Xg)E$KGTipV6rzeMyY$J=g{-tK*r{=DwD-}o; zmi-Zs(?I3P@NsmN84uoJ3K2?-rRTee&hPe>fPd1@I*U@^aTi51np;_gOxz-oymj8F zjJP*Xx9V9E{Ib^=$(Th8kP_#xO$h?*04GT?-c^?QCtqHmtC+QpoWT+E^15 zpvx&1lD?5IUkX6+Jp=&91`nQsBkDed*oA!V?UiTTvawAZmo2+3j$ra0g0?9FVDiM=q;+&fYwe z7)u!%0-Mr+i`_=Ti6o=pjZAVXa;l2cXBf~L6pdcO@tvO&r>hSGVdgM06cO!)4<$uK z^$#E~lHQYchH#P1b_PLG#Ow1bXm}sqYLAT=X&6t;1bnp?D3wL-WGJ60AP+%7m?L&@ zKQM*94`g@b8-mfb_6Kb#qTO0e2MrH#7cBz?^W0Jl8LkiC7ovM)$S)ye$qh_AQItg6 z5ophhC7gJR?nk!b_!OS)B5Al>-1P`%TKIu>rjQ-nvZor9l27j$cmL;1P7ik!K( zF~p_BF)8XVmP}CR{-g-W1Or4PbD z6_v))qtKyAP|5=FQ(DSjH0nCjhyg9gVR>j*pK;lk>B(vOaw93vd;kT3;_1w0P)Lpp|>`=FRJ4(o#|iNg`meRsqE> zlrS0^8vc(wX+c`oM&rUJCPvGIjv%5#!|VGN`erGNUnsTaY3Y)sWbE_0wMi0 zDU0gd%Fvjjm$5ZK4%Z_;2%?HE)H$=WzQ^vlc3A2r#oj|B$>;o#yv>{<{E z8$7K(-Wi7?ur;>!*A;pyTI9tE@`xESu*--x^L-I!M?EJEYxnH%|vlH4j9iiY#k_EFQK_5VG+aiMPc7wL_}`~Ib%JY^*%aS2F< z1isp$ea1sjzyhWmHn`6`^q!}TuV^S%hk`9rjAQ0(YPVldDUg1Om^*^H!^a zTnA5T`meG1iSTngsnI0lE66PG{4{UGU3@MC-OUtC3g!kc((j@D?l<4`8kEjO_3=I% zv&qS6INJ`eZL>Uorz8j}k+%=8>`~4C%$O)?cmQQDgbWk~QdqgK2v^9NRm=L;LRp?mkzlg&aD0JZ zA<3l~0x#?Ai~vsrQ?ejWJ;-#(f-$;OQCFec8`BjLB$Q*OKec`=6fIgr9l@uGX4ep6c6Qe&a1iFk3Uj;|)-(f+ zFQlZT@@A6C^MYZE&O6%gdO^%h_0G)%uvKXOcnYqn{ppH?`1p{OgifTFm+zGf>s_Rv z_zqr9U?J5+C>HX&?76jLR*<9F8RwGVN59Bxxz0PF>}5BT0vmsd7Kt+2rB!t)uy0sc zKmu0{1~21s8D)%(jXya^DwCjJb`&OB9V-c5g!0M>tSx(P?iOGr1ELN7je+eZ+%<8>Zlf0o+vAbSwx=`(y~540(A);ZoGw{5z5Rfc~|RJuAl1EAFDGAe8~gE(}J zjcvX>drIk2n@nG`M_K3)fw&{;A%?~9w9FM*_IN^b(`?2dn>K@zUnJUBP!OJ#O49i2 zFVv7l6^AkjXi6@EYBxLExD3ua=vcCc#CsoTYKR#ilQCXB-Jm_a&dVzy0rF44@(33` zaUndF(C`8nWsE#1UlFP;)^D=S2GlaA=h$b-<`*^^EX`$H=Xgy7aEZmOTuK9a3p2Bk zj}L=8Ot>lVARezekRX#7824@yZr|H)tJZ2=&WbAm01otz2lYe4fb?&LvjmuuT`#0# zK>rc~?Qy+Tr)iPyR7PK|nQ^F@`Y`Lgfm?%Kzn5{+3&C9!{`l^_ z3*hiYyHm5(8#iv;JG+Qh#r7Hq-Pe6+r_~S!x8Wlocm;JaJBWxftIwaKItxS@jIRNg ze~&W4x&BOq2+N|)w8;De=lkfE!q*4SMQARznWrSFb3E}wgL#g=#{ks<8iE@eYA8G& zR{qB$a~m&uXw|E%%`-W*v>3)riz2$g>zg+vY^JE{ELB9gdK>CDKEz?S>ET2ED~Hk5 zFGVvQ*^P#L1IY979n`j|dWYL2d6v)OQwpzIH4ZO=4&Q+E`-<9>%uQJyOCr?~?%uKQ z!KSl~=4R#(oog&1j!{ZuP)<)y>IJvZ=lftF?lQF_9>pK1e63Jo@2*bUbHr1ZlP)G9 z?6Zx)Am=n(mB!-B?vh_hm!&hY;fmlz#|5uPuh2H(DyO8u5gv(W99 zVFCA{cOwMxb`F#Y79vtiMCq_nv`T340 za6E%xlL($VUDfQ#dUfTebSK&+lZ=y=G+3!b9I#8*U z)#fY8<2KLZ(v-85i1Nen8GSzd0y!FAvJglVW9)|kDLMJ#;v#@FvC+{)${HH6Ek=R8 zdSI8Vso8F)QKu>x7RAVde9G%k5?-QM&c1KMh@Z=n2AN>-+XgFjKmJlTr~z71!>Fdu zWoBhPsnAJf27f*1#8KDKXtSOwHjnCGs&?Jq1m8W7asgCHUPX-%Z%0_RyQ>NoTT4HVOO znT`I6BLeXjQg3iHM68?t!**vL(lhmIA)U9;57^n~k-YfNi1F*RJ z&@4RP)_%zqtnz6zcxb_uenR{yFWR>jg7P>9#SX6Lrq^*+uls#N&NmxU6~b>GFlfoy z&F~gW@!o=$Nk^Gcj>Ky)mC$lbAYS4Q7ojb@I#d|EIAQH1p|6$|HpYqvduVZS*H3BR z23jmyKS+nfAl@O2V1iV>m#pC&hY-YqGiGbR-m>rxFRN2^e1<0#IZx0?O*~y(TpoQ+ z2vqu=lF-HTX&ReBw5Q*ECK&F|KtK%NXkhUhV=1+s0MAI}8aU70aI9LZ+0~=xrV8Dp_HIaNFjzkXPWjYq@?Bi*3(JBr zsOBii@kuaUL^SlP+V1g(MV+nStn<_88eabd9lv(i&+k^xG)VQFB`R>Ues;YekYCo(dN6LMy!J+AxaZn>d0+rz zRb?~{0`c*-XSzuppecZH0m$E2qrYnW^BfwI@&0^x$MGW z32Oj>FnSkuKcx*E7Y`5JMD-zmzjqIxXy3JVX2vjku=A%ui59f~7!`+ygd~VKe*}pc zw6B3RX?|WFf#MN29KWEXg}lzt)B!|xZ^^4VvchTu2dluy!_>GhbR3-n2EOE&`ofl1 zPlJ8h?pX`Ow8J7x!&!$KFb)kuLfecjR7X&lTrEyzesZa8OXM)O*X$BCbtn>@zAXV$ z;RdK_K{4d-=LfncvXi~HO5efO0X+83K-P9dwysa~jW@|^g#!zrV|!Z?F>R8C+E-dK zYl*1X4AUTw3h<`4_;-lQzbnI%*3-=ZotH#fcMCEhu(9~+Eog^WElQV*^+TSsn&0oG zZuWg!OxYWF^cV#>dBp=!6WVb!TUuH`_X6kGJbd_2VqkFaVWFl`F(6_o{`}0W! zjJYXy-0intfG+~4J<c=BT$b_3So%%1ja&j^>3B25Jl$x3;CeifOrk!bcT(^=~UG>m#r5A{5Ubw=gxM zsMt7nvQ@e|0|YGY_z=ZrMkZ1AcD&iTl#bctg#y*pr!RW*ac9Kw?g)36vLd&axj9&$kUh_j7(dGyZVfr<_^UC+anhLfwIs8J8&l z8g%tb0J$Oq-)$e#Jk884sb&njxG!EThWMXz4*Z0<&QMVl1;|3sQe0tY=EqO+OJ%-R z=ig}1ED3Z)(vvB3v$G|IqHyCc<||^j0TuC{c*LgEeEk)PWT9x(0`ei>@Chn7sNJ0v zc!P;dg(-KjQ(jh|G^3CX@A09q^dLRgrX2L}g7?jE4) zlaV<$z6nIsKeJ+`uEV-cgF{2Lzxw37#HV|uX^&e4YB%DijxdpRyNPF!y3dlpEp|L99g>B5MwfTLu6z7?CKA+rAobJ$&_*NxCMlnZSq_5W(o*&O z;j+@wyaz>o0Z_QPxKx1=CY|7=u$UOKtChWD03`w3^rvzoAt5>63n&kuJ`e&G(s`&t zwM(rkwmu6Z2f>HRz>JGHH$ZCp`8!iy3OnUuO#f|_P&Z^r<>}V}K=a^@B3kd9X3rsbSV0+p^o=*X_!Q4iHbE(BJdu5D+gwFZcflLOw1V7#pe0)rV zncx2*<2v69nC#EWA9+|b&!%0b4)y5HgJtuf525JZC!U_^-?Ra?Q!ciya*4IM={NS- z)b^CSG_wKirgh(%u7O!oTPQLqLl-o>Fp33zfr8*)3?Ot)PDnsyWhEP#T*yvpYAUn? z{2ZGyx)Ela?Uw-IDm(kfZry1Ov_AjX=8s?f!*b$Tc%mH6hm810qs64|psF=Xj@nfm zFsSOsCyL;VpEyyaz}iW{|7YN-72vLsKU`YQP}%RmDF1qEa}z}OyEFc@L8*Ilw5QMZ zHy4mNy4SI{SxjnZ<-OI%(Jvq{PzSE?S4kasBg-)CbzT`;+G)^NK_584(@z#U@h|ch zq$L>_SLx&#aG7z(f%M_i``7?DH4%=YA)pl%fkGI-x3bCSKR^I-4he(9+cMJbd@tOe z%J7{)h(7yWx5Aq*2EqW>r|A7hSd&>DV09k5RZ}y_A`ftysB1We-`FdC!kSm>&(h#_ zEfj_Ke^@lU6m7UoBt5=*9U3yeq=^23tqb(IuE^a&xrY3?{4lLJqCYQ7^iPN!K=_zz z;@~LtQrj~s*bHbIBI8+#s~WPZY^Q5S_$;yfb=%yA_tA|8Nd8XT)0pTHzU>*)|0mu- zj;V>mOF=D@j%k_3HS)M<99bt~q|Q=Ji_;Z=-PzZ#UomjWRsb;Q`<=0EE_7ks(gffJ z#!z!^+@|h0jnhr${ELeKPA6#qnl1(+EaOb=@4yDg=~{(25oI{;6) z+1XV<5!sm{>H*JXR9433u|W>BHU3rPFnW@tgyF64?LG7GsOwqGhN> z+atSNbxTD>MI;y<5yhnF=;+9yTM7M1`-6jnNC_RI%qBaLE>stFr-yZCArSEB$}}^E z2kCKPbR0Mu(q~NTD)#?5>ynZXn0z(|c7yJFO|+P(Uhp7w$K!Pmch5>ROqLQ7dvtg) zR~^pg1R@l>pc==%Ser6Y0kA!336UNwpIfG-k&GbLDHIM!WyZb@x%ya%C3(*l9Q`y7 zuN{}Oy8dVX(9lks*hwKES6j)aN6UlRz+(ONfinNR{g3y2AUV1NuPE+L?jZs?;r>7B zzAiu8{dVC9za|M#owjhh?0-J7LKmm z5K1#fvm=ssYila>c=44Jr0OP5aEf)%E?xW&XtELG@S8g$#z>m%Wu~d;Og)|5gv#M3 z?Z21@I*tIjW!~2T0blv6bW5UACnOx>?`^*H7oiEnrolse0gJ`I@TT?v%LpM{r6$XJ zO@!FOm<$}5At8$v?s~dzcEqC#!>%Q_$Z>BhgymG4O`k^&+)S@PSw+}4rnzX49cxpbd+aZotHNuZ=*_} z*$yQlc~W&nkP9Jhj2eQ+1=0aZgB0{(`ZUw!57!i^GTuw-45T)6vf?=^%5(wEpaKCZ z_nd9Q4pdr}g_`pY1qj3v`VMZ2b}xzL^Lz;&?G<_sobZrH9G^MaBPm=6Z-^9X6a_9M z)BjIZD0Ir5PQmWLMFBZg$l)1nnW8q)nUc!b5>cGh5D=W&_~f1_Pewz(+LRepPTFw- z3SyM`Uuu-j3Qb+W!B2q^b_A>SLRu^&=zx~CtS&`zWl1pzGSDlJsSikZv{t}@MuuVv z&pi+ykwCkVZgAi0Ot~du$b0Q%?wIrmG6?x9BDWgPN({k&kQM=P1JWWUg@pBeS1_AZ z&yJpGuqc7fKO*Jg9oxSZh*XQmDD9>Ob%@GnOx)XsT(gmW1@Ffc@^9AO#D7GN986gh zQ%a!9h@2b+F9{{)rKZkirYF(UE0f#^n{!S&28(K-+*-|IK~3gQK%JGJ|LFJAUV^6$ zvS(ciiZtE21;04e6klO8VR4U-!WZ7@AU0Rg*Z)qyss85LE3(fBII~#jQT$!!ecWiR z6+=8ASRv22TNVlZZ^hIkFl){Grx{5x)9<@6;o%@BiUYPSeYW_&j5{1f9;YXrowCl7 z-(}Va#bbaNREo8{^7Af^%&*@=X>)-CPrX?|4oUuGNO=6!61br0iS2 ziL~XP5mL;`o^!?e|0Yf-NNjI!Z*FRAe5FMokZ63a45=h3L6k4DtT}LLGL>k9dOvIJ z#jRV{;GGI07YLFthv_O4c@|*N!c<3Ja*L=wDjID(oZWbK_kJ9GE*T7R=MoN)bE7wX zlXt4^cBn`L60u6*Me+O1jfr36;t8ba&sNspy}>|*EM|yDuUe?-E1i8C9f}m>J_|6| z2%KT|l=gBni8Aoj@3v-=>1%C4g>)Fk58*jd@7_?78BR-`K^@=yA+)w2t_-wDL+Uzr zg~@S=fB@WVIm`NfV^Hj5!PNw02)aZ%w1jSnfk%Els`snxkSO>yydf1G-lh^o&ul~G z?Pz+BJix_}+$%ayy_Y!hh#ff97Yv9Tt0tE0TdhG>wRsAn1W-t=?H;<;V$r&;LwQal zsjR0@g`h(_!_DU;oly<NC-Pj z6o}D|5IoUcNM?!m*Z!i>@{5YL9*G@3fI4Z#@p=fPP;LNRNbnlBh5#3FxORH7W_Jz2 zby>9=F-P6+cc8FLv*~&p|Ca`jTjBWX6MhOi6c(Id5F0%iU!khdWPCy5xpIe(5}JU& zjg4v5=uM4{Rf4S|{pRx;5V(0maW-u$2*}ShR#xNUe~2NMQz5f+Jsh6`Swl-EqW%Sp z-s5FCyGN41z=gCPq;}*+zRXco(EL88E@Pqp0~g8OpeP7z9POoAluAUECi#e4^e^=l=cK((_uOoxjs@_;z|_~1*gb(7tn zfRdV??jIoW-?%ef@MM95vCJR~3Al;a021TE;X`6nVoC`M)6HDd19~TPJCw`;gDTjp zUAPu#5Wv?)@YMHOKLlD*PmhLZLxdI&Gj3Eil9!*q^(S3WDjoLqv4>;h~P7aP@-c@g)5Fjh!Ni2j=xK*cflfj$~JcMhqw7|J@n zD!Ay}N5p6hyz5d!4CH)XOzOUqvqO#!Nnwv}UMvSkvLak0$FGJS=OPUTJ zM5xAfl=f)%mdX0k18@VReFDE)C}I%9Ai%AH_jUo{F~I>KEu|Lc`XvCoKMK%u&^Z|P z_Jx=^mQ16gQA*Lzrk-NIVypkdjW6R)+}8g>{?Y*EVTc)k^)F4Zq*&4`|0WgO|{Tv+hFm6E~0D=Fzw6rUZRi6N?f`jjBowrPP-gPZhZVzeS2m=UL@7}#`InJ6F zzjsOr-fTE0$-fvNYzizc3r9dH}NlfqCOUl3rRG8qyNI zV@)?~r^Ugg&fI)yTXEp;Lgv3g{=JPE%B*e?z4i3+F#p3bT?XoasDKT?{QGkh01N@Q zgs8#rbH!E=mbj#3i>l&HNs0fCO>;nhBAm>mrVrWvkNpK`(P<`DtcC*+kdQ*dwJ#QS z)8Uwr78i$jE=E+PEZ0g9EDu(bU7tnmqa{&+x_HkBMb?nE*C^FRY%(Ad(}Kjnv;tyP z?~*-Wa1zb`Le$*L(LXuK5j1qIVk~e1DLtUd^IKgyd0v*HF@7mo^TMp%&zbWd$|C-y!S3y`!vuk~?ep zhvR$}k>B<;mr_0t_mO8|4oW1t85-<+Oq*a}fCG0~JAX{RqM?nNa2NA+02LKgsnw_v zcN`cHfMyA)3t~zI3@uNy&}cC0{!IARmpg>r2{($Ws}qhPM~4nYPaZS`CU-r>&?DP{ z3>nE=I_Jq#^zb2dP?@cx~r038I!hM~E znQoZPsKZ8gZ&GgfLS2D=H!jx-Ibs3raBvx$JMB)Meb^%J2kihkvQ`ZFEp)jBb(wNa z@y!~6HwTUGMY5iApAfq{J6ddH&eUuOaUnqKyPDca@G7|Z{QBiT5ZHBOm3ub(ME;`e zg&(^B$B@B?HH}ABg%JC|eFEIDGC)W?z6!vtV^y!&t5X}GLMiav>yiW9kALWkfk+eN ze!%h!Y1_DMb})hT*a!K7Rs`gD1zGOog%C~@Yj_5gn+bBzRZu0oI=fM1jex@Tl@XgE zpfdiQy67L{A9cQFVd}egO(xuKaOSLa+2P6I8ttV^Ajm|Zfm)sN)>XlImCphAJT^q+ z%(5{S>m`)E{rv_oY#oyqwcVOlcasA-X7RhJP?92#`TyS9p&s)V=EZ->kzRk7vW&d} z1=hw~+wRI}lRMkBYerbmMSDp@Ma3H#`9^HW@M+We=2gBi-{WDp+bn4eNe4kEFOH90 zq34o|4gE6iVYkA6;r;)^BuUL0dM-X8GsC(m4`?B9u(v-0t0@i43M!>Si5;1;ag^W_ z;)piSvf;su|G-kyzcu+|mApTRrx}@N0#OIu9iQc&HU3=}{e5Za^1mz1pwsW^vpGPj zk6=WTL3c1&?fj%0^fkbm3=zE->ELOtkC?beI$>8eQCQ_uPRGF#iraoyNyNHLf)N5# z|IVarYUhs+La~x8zY+)Br@W4@VMv<%5B%LfRB^*~Nzge1cyqq%0;}T9Z4#sm3DhH7 z*pZ=SR{R%RAOCm?|hJI09#p>*`WhB?drlFx=Zqbp5mfG{azkR>e{n6lZVmFb#PX! zMybB{@oi5rg#@sv`qz2|M|vpV;R-i%osW>Fah@kiz(L4kTX^2uTfc6!m*zO!*NT0? zPT5vxB$;WNsk2hk1pk|DVZF=T#w0on94-n0(_e`piZ9-<$1g1X#|# zUmA__cjpORwx7hz|XIkk?q^ww*Mr3V*++%MPL5vL!+ ze)_jC3N(Zj$oW47Na>_B&?x|YSwOb3`<%Eol4>pVLv4Zn!*~Buh8b!&KR*wtDAQ3d zql{L~^KJOIodV)K!43+hD%F#YD4UXA>ay`%ub%(}tCPIKVBIjK zlD6LOPd+Jz?!x@xLtjo;ltpyJ41n_n?Y@l$_E=O2iL^${ctccdgw@QWX9M4+c(fz@ zzpNb9teqj|)4Hq_f-g+Md4vRD85B<>?U58RF0bG?uO{?7T_7@SGl2c%w}hKW@Df3y zf`+m(Yyx-wT{c(@*=_T@GTiNFVFS%#F6F@oQ6eF!S@L*Tm~%`KZeU3Kr#<8! zRhO}&bsioMAA+5wiCFFbBo03h?3|y@gZJ7nU=;E+BtV|MN~5||hgQd<%mAxRoh7=^=U^$&aqZTk)ohO5rW*-WTl=Pq}t(@_@Xp1CZ z@VV~xzQo1IfC+rTLrIAu=M!=QPsnTG;T;Y#Uu*w&N~^y`uD{gZS;sGU1-6F%MtKLQ zm9?VJrmlpU@sQ?B21`cyHmn%!x4$g1eVZ`yJFvt{z|bL+YG|@_EcJ zBS#K64-^C{MVQ$uMluCbdJ3qD7Im8Il+d($rf)E)qhnyWtFriMJYch8eg2#yQ1~ju zRpr|4xeNmX_k!YA1%1d`ZX1IA= z)eKRx5*QL~329a+LdxGC*bp!G8SKRH+!1d?T%%_H+g(db#Sq7LcCkkur`!5<`>hulHpA!U zRQ7C8kQ!c}kZ`)_1cEoqmi?ay?jVB)>2mg9u;f`wz*Qc6b$gu;ul7PQkuOQ;gGrrs zY0mSb4LCl5;J*6F(L!twQ7;;y=5X#|dT;Oace8@Rjk3W();MIsSh4h>dUG?4kMGob z9gT~nKtJWZVU4$+4zi74)DYXw3p4$$TL~3OT6e(ESW6_y_7%20JQRiN8;?94gnqVO zTqGf1%gwKQ+LOeYr{`8sKJq%b$H@V|P}tr9e{gu}7P3}$UT^68tf2oWo%3h|3yWHa z+G#~|jUoI}p zq9+V18dXRQ3%F-E9qz1tdcjnUpI*4pyjT8fD>?b2CQe|x*{29bs*AXVQ$a>b=YL%v z6XQOKrkpkI^alKlXgexE`1m zNVx_(>r8op-uVjRA#eGye05H;@NxFS=(GXXLR$$yTw_Md?-~koGW9Wy*zms%z*~P& z78**s3W8Y<$ecU_T3c`5xFKX(dP!PDEUF@}_cf2u^BYoCpDG=ad8wYBEG6qjX+syk z>&C1zJrxDT@eJYV>i6E$66dGFzw=16hhcR6$po?!JkWk-Cu6R}e1|7hb)ytyx?bdR z(DZd>f2nC|)a0lE3o;c2>cAY&g{{D*CSz80lH*~IZQ_VQt%3fhqHxb|-5x_@V+=tJ z8L`*>i-3`YPLLMDAN|+oWw*VHUlWCvzhAT=Uh18GReK-)7yQs@`(6;5aR)1akTReN zOFnuJP|6(V>1G8?Sc0}iojh`5=pAGdy}s*l(i16mx`hVit}iE>sN3^rW_NYUmCVfc zP60IF{liB-$kSfB^a!c2`t^%GnrcN#>D7k@^IA<6JqoroD`}PyPIN(h#&W`SLXT(F z75jN!Uec&uFWa_+oii8BRwdxn>dv1(#g0#Qec(R(Jsz{8kLozEZ=_Nj?f2+={OTq6 z(+LtJwbMau^U%U7l-h@gJldjQLcu)A4E{sRe988Ph=F3Oh9VC zaUqm&&|bt79)%9$=hI%sgd*piLH#bFrm<_JI}uD2TIG1Wn5TOhsEXow4*DT8%+TYS zd-YoV2bdvZ^`$m+Xz_=fe>LBH#o4zZu0}IbhvHHlQq9$p+fbm7Z98`NH$4Gs>$BnU zFMpj*N*RDdXCrBBj}vu z&4kLg@03&!-O|ZbhYdc|I-*P7pvtMQ_3sHt+O(9Dt+27e@3sPsl{mU z#IPt4p`)CaD41>0Z!DE7Nun*}T!RnGJs3Qql@h~Yk;5hEcukX?Tu#Tgq2s>3_Xeu( z-+4`_PEs+%54?_1|Dt0Q9#^IL_XHJ>TFtm^JQK;fNNf27Mj&-Q1$K_B&LRo7JKc(Q zj4HAk__g=))t(p1i!cbKE#rFLMi*?rvju?=9D3FJP8w=nkpBuL7LG#?`H_duAF=I9 zTa!N_n552u>jKEUpv(qLv*oPDHb}uA;bJvf$%yW|2OyP{djAbBt}nyG!=t17MajoGB_({0RTQm28G2)kQKB))BPmld{a+kM+Gc5wRwEV%#2#8gdP9oWWytlD!x?Q3lfptgh> zbmA&0dH%sHyb6%|tFLi?*yDIOl{rtl>?iP|ILU1I;xS0(h+Y<@DSgu1U@s%C_NAW% zH4!;F#;rIN9TADZ6^aDI!v#^YSP3UQOgd{QHlIUqzHZH6`yUb_D{cR>`SEYnr##Pc zR}5*%`0Ay$Lf`xml>bNBcgIut|NUP!A=^&-Z?O@B9A#&L2IhbFS-sUGMRl&)4&1cg0=Dq}mVz zsW-~C<6qy(+w+*h$|~u+7(-o->m^2dacf%fZ>+@99Ht^^buh_o|3^{4>2eJ~0t$pX zlZc#Knf=$Iqn$9uu&};q_$b4C%Dc4KTW<9Chyexav+OwG8?*5K%b92R9hzPlFe6iJ z!zvd7fSde7Tie|1>@guBzO?-OV-XF^=_XcC?t1Uuy~TsjZx=LPbUqC*HQ3I-OqfbBdwviR=O)n1{s%t% zu|zu{cICe-$hvC~7+zq#i752rg!fGey`|iOmhze(Lc4q49srAzF+R7yKB`AVT4yGagbDX$sVLbElJxK2BR3dz2bpDGV>Zc;U@;&KB z4QEDHdPvS^U*U!)2bdj0C)ww zCzt*}_b<3LfCyK8G|Sr^f=08I-t|Wuk`YT2%cx>Pp`(xa|1-3Q8-nnV<@&B0eDX(j z5MBdiL5~IA@X^3)nD4yCUF5Lg|A4!N&Azw|K#w0Ut~U4Hc)4>ot7U^3X+^KQG&HZG z!ITe#ejq{FA2AdMeJxQKzre-+v~1uXp7!ApK`32{Z6)|Vsp6owey3yj+%HuTm0gEE zlxn2zx{v|tuJB3;9~)h~5CM$JzpDg*PymuPKyvyoW!L}&QDM!Kdq76DJ3ayZH1_RQ zlnkOPyaPz!(9qG|0I0U;x#(L;Ibbi@P0@{s9{t2do7a7U_gE-x;2k+k^Fgt+L#odm zOUXcQTHW|PQF1MUR-HoZ`08gUPamxEkrn$&{GD{~EEED*lL1 zU;Bw#H-*N@U{mUxz`Lapj9Z>lzaF+u07t_?D4{thW2hHO+Qu+x;B~BQz-r?a%bcT zTBR0Ca)IKjU+;xM?vBlc<3|mCU9F9)JS!WBPRH35$`DPw+hM4v45<$pEtF^H=H0tQ ze|r79lXR&1d+~zmtun3byD`h2a16Mctar%mUtqvXfkSqpe9suT68se6Z&6d-7vn8aU$`_`uU_Zmf_9c;{?M~Tc zHPi^0yvr+a$-PLO%ja3f;bXSa&v<>~MHb{EUL{7^8^r#P^^hu%hl3B7pDYv(nsq%% zP&s=N%WSlWV%1(Zz**)HZT877G`KS|TAL8&#>e)c;prf`>2(ED~r*0h$il>PlU;``B2Bvpr>AuUdDbW{BUZNF%LE zy!B{wt%Tu^8#Fy2g2|=FAlixwI76|$4{DgMI6vA;j8deX_EOPdbtyV%>pm2Tp*+0c z@C}NF_CGVDc6uMy=?f)Of5TM>zOTL!Cb@QHPfP-y6&Cl%3pH|8CCs@ypQK)3Z67f` z3@_O&mIjXp+4cX^fKyo-7~1Oo>g3|?KJ8Klu#&;i1+;K_2l4+Zr^a^mn)Y(B88PN0 z@c94}>s1qBy*ph}X?y^iim$Q+1U!k>(f^Ts>!0#2>FAJaj|uD}Y~_+31h+FfjKwj29}9pFNYgF%tYQax1azPuJzi+z{->;f?|v&gHTlT{ z+N!D)sE=k={l00`t<$AC>8@;G%S`NLu{zJQ(Bc3TpWYy-(I=RQ_zTNXGv^kqRIEk* zJc2M@MN1{ks5Oy`$F)j`0V&zu*4sK9c8s)J#%wv&HSe_s3Wo~P(3c2kSX{AB;@?fEbf zq@SRS#*TaE&Ex;o#9Q~9dFbJ--?drY)*3t`bPG}TcYJl|1*^*QK(;<%8&=)30%lRH zN^zXzq)+4avI~}Ti0SVl^^IefVq`nAR$Qv6q^i_l!T5|v_$#N1vbr*}m9w9p@xG?q zyH^st+I&*i((b;~IBuQ#yT$v9%=gb;L5w3m+Z3P~jgeeWIY92Zp6aF>s|AC_xxE2j zY%ZOL)!n-nDt4=VH}RK{QZvdV4*RrOm9^5bcZ&0YiCIw;f>~JhAl0GEO(XC03*#!C zat@L@-LxIoecaj60j#u}Q_l;anLHNiT_9+_Y+BGXh^`NaVK;^jpiTk`l*!3SC^u`9 zU$=+K6&PhhpD)9dwrSW?zQ6Uj>6KUXPw_Rhe)kJ)ifkyOs=AswK8D+z$D3P6`aVBk4jlk=HuN0I$(hz^b2Y&R8x~t>0ykfN<;vwA31B{gCrFm}Sp&3+y`&Lz zs@nSHx1E?s;ZJMjpSLe)dAFW{0Z;JY^&WA}YO}H}!}ouNeQbD4)zmz2X?k`{kM4rO zFURB$w46aS1kIYdrTY&a0P4ax5t#gzo6XJ5QLZ+aH`5<0=mR7{cbMtuy{gf2YTw@K z2`f{Vn}~TluvQf(>E%m#L&bq?5P-3VkCzwf1wf~FPJ+V?1%fb*@TYPpRF~YY)4gzE z+({aGEOtFRf0(rJ^Pb+y!;)UwSk2G1w789N3c-MwD$kDhafOC6%HQVsDLbglI-GBCOTsDdsM6k!g&;E$DKccnIGnuOOfOUd z!I@C_{p~J2j%)0+y1KfCMx?I~4)+DnsX!wS<Y?-v6bl1Ymt>T5r6b`&OXs(` zU471+37f78qNFcdd@r;NJq>)^p-6lPKNW?=7saSK+CL z&KGz|!t&&?3?q+bLk?QY1(6fH4Y%7bimyG@fsy4oY%i$LN>Z};bKdg>frSEoU^iU< zT)F^^9(jx-0L=FTW*c}P_&^r5JKy9v)nHk^`@+!nmOBunK&>~sGQgHBz}*Bm&6BF) z1t30r`~E#ILiXuBKzD-~fjO(7YRdzPzD^$IzM&HLShI%K@+*Z^Rgw7mOjSkL9>z_M zc6&NW>TziX$l0Cr-M}j;DP6wY4_UtuMj%;&B<^Hiakg&|R0I1$-OIA^+y~%4>;Xzb zAk(7Zfu1d!LcvdA{{m-|$0g(w*}2D0Qnf-t;_x*QU5&hbw88|-g)erwMNKcP>|9%q~@{9M+ z);o9ZKm@8hzYjQuPcg`Sf{In}vtgOnV0%>vBU2+#X*8RyG(r8MwdUQBf6Q<8i6^>D#AwI_`wdhr*xGVsGSU!Wz_}U5*wV500GS$C3|^-}%2JJxXVjWAb|f zt#O%1uV95md_8de=X?Sj^WK*pENvX>L-fT-j98bt4ToBn_CzVsFZBd*5)OnkVj8Q1 zxE#@YZH#}yX~iw?7qy3fZIQoG(I5H_(>p=0!C$EQd}fN~fbq_cley;Y6&q-AHq&ER z_Ey98o?WVgSE>~~d6ztq!3 zuRpuvf>rQ2C%Sx43a+M$9JN@MBY+rt1p{qpsRjnOmgToQ5`slOJ{zXk;HSVg9%c86HnWPB5`AP|GH|0` z1FCWSZ;{S7L@0*_nR3lI8ze?XM&4}r9^S^raNv09s__EIirv0G5DOR{)M}WC=w6yt zF)&E(XRYAqqt&AekYBLNHpH|1+!M|ltRoS1ApqvFs^QhA-)Mmoa9BP}Ny)JuhB6ZG z-(!iw!IY*i1#2I8mE<^dI-BM<-bk8PHp1qy{*q{uVWoAnsPYV>NyEZBZv?IPkGHM( zxM>#HdH$M(X1S^Guf`YF^QW>c!X+Cj({q;NZsr`U_}JYnm^piXpRO=v0p|RJBa_y$ z@7Yv2)-o=`BE|9}+uk8R)wujz>XxOvmlo7=y(za{j!@2(o%F^(I6{N1H|xv5yA=wB zH?jZw)uKQq$s78h#~JaMjQo`1Y4k%Q5ngm6xzkCt*qpR_j%pQ(N4 zRZu;xLuHFzg{Y8P5fF8dmWn1#oI@y)^w?z;c5PCQyz?~bJ!8wJ?;Fi3-maC_aem>{;ri4Q72FL@dK=7|^A=;C?ZJi3$32c|BUZCO z1+DSv8NM=V{-#(HJV27W@QX7Gb4qwY_Mo1K9x2N0r5>=X+DV~+-aqUF8`jN)#D2J! zBNB5nN>x%Y!07JTB90PVMTuyVL>tTyg3P&_wA!xI9e1yRK{@>3cA|>nPYe(Gvhb}j zL$({C>v_g;?R}t}D_$x5Q3i)_%CKscXFG9z5d>E2z-z%<4(-BKq8wQDg*U9}r&+>P zqdm<>5@D+$!#!G=HTlh~4#^Z!l%o`a@`)C=;H{H-Xxn?@N$`CgS5GP-9}N?ZnYDBiU9L2Dt6p5 z#^!{$0FuW{4}_)P-9>Kw(9c;Gu$m!c7;A)LGFG+2ZLP-y*jYSy)>33)*MN4Z?<7YM zvzFb=^Q5U~zpAUSMriA@KCyj!j|aY=EgjvRDu~#`-gm6>=(O6p!q2(JEc=VrO3lDP zrZEl6A8$o`j#GlyJfr0fH>KV^CcqxvU>)mwbr)fGc98Whgm6uNzh>gmexp(JmSb>a@V zJ$dnop+EuwPjZ*a>@b`=f^vIF4ZF$k?ejtHx9CmD^|Cc67a=4`=zK@5PnUb& zuDoX@te1L~92Vp(=tu!}glm>W9$drNnp3;|yjFqzP3l+WoAGzLXw~!MZGX$Am?tC% zL8U#BqeYQpH&a8XrR|1bv;aFLDfw{!jaI}DSPFa`r#P9Ic!I$Oh4W6!eykKMG`q@+ z*;)^s8OBaL`~W-`x&z|QCOu?`|D#SvF>j&TK7FOYX5HLEu+63`7jql z;FycFgXF-IQ@4W|F<2aQ8Zj?RsRDJaJ&XIPe%aN;RA~2YK51zVa|HPkRfV$`?&Z)B zip0=*(p1DZYH#QfZ^gNbprF-J*478DX$Ap>0`PojQ3n|1--C0$P=C+FQy<5tcD-`B z8(I)Fx@N9d0u=f-$j}&tty17OM2Vk`dw_MQ74Yofw?awI+gKhbD50gN@A9iP-C9hv zPW2e~+xqS&Y2WJ)hl=d=^=?>_2X?LUELzv z&MdIlWFBh$nl{<)uHX(%616-HeUt%@38)=#l}UP*;R*0pua1Gnek|}F=-n#7Tn9j% zO7&a-8Pyk`UnZKJhQjp7aNg2%=Yc@B_LsHzA}f`JN32{bJLAo3m+lT6%LUeHG#0Xp z2iy}VUYD#YZU5>b{ro}x{Wr&YDs=SpUVy>;>x&<@RMkntzJ-iIJ~lr~_CYjQ)4(9f zIaj%jvoUhTK#HwZfI6eeT0N%VH;K2 z?;~qFvyc5MPi9}-C%^U0k_RXnQMCQ?w~E6Tw;VEWixGe-oL%`KKmSw@q?%7xZ*6OB zJ_4G)H%G@h22!%X-ko#@PYRf6TQ*6NB!RW}{oS-yQ{YJx&Mu7AV~KmZGyyR-Fc`ZW z4juNqVG9l^%=*e@!5c3wF0voJ{NVRiq%Wo?$^>I!X&J%@rHmib=fXx0FBvt~H6!#=8BZnF_GZYKslJReGOrkJDAgm~>m$e> zPLaFUf6&SwLb9MlkD><)S{}jfyLsYacpCJfZUI7nSy``^BvGjCNL`=w8;l{{gn*8W zkkIt_eaGvaS*;MJ*n)cNiJrC;2_ae8^$)Uh!oUs=VEJp;rhr1QIV_L_IT%{?;`MT5 zNRbHpBL)>(@1-${Mngh4Nw4eDvz0SHmgxx+)%Tsf&c6SVD7g@=zW=M!iT=Z{hJLmm z_(iK6n$(*#rj2zUbni8(Tbd3sBDdCPdz+N{b<1*ajv7J6qpDm?`1jI!?O(8<7Hmvf zMFmcw4Ppfqcm$Qn9@a;j;PuQH_D+W;BIiV%hysZl(DRCfkK&rtVCa}&G=9a+P3aS* zeVRa4C(js&zu|@=anD0HnqIDX6~1ILD6LdA|gl1wNJ^lW7dZRDgg#!|yA| zUg3X;RHWPq^p$Y0(g?-IK~=Gf7}9Uv3tpSW`3zWm93i40!$#r5CU1yE&AHL%R4MzsmaQa8lND@$of>M;$7m=J z5o#-$$n3)mcf@XjzyHExVOaelad`R6HzY|*w1^o&Qk4VWe%X>MDc*XVK#LRpo+(P@ zae7xnAV%Z@k_y-n%b)YHJg0zYrVJ{}%JMxnmwUJ%RtK0(Dk`rf4(QAPp1`=1)5&WH zQtWm_(^n+x%k5j3is4M#zixCE$rqaFW{HF_)&akb1wf^jYAI~i(qf^9QDfcG06B1O z&-qFt{*x!}`TM<;+7?ysgEhcbtuPN0onKa3c%J!VN?X4r>Tc1?0;(Ml(#u%rfCyuE zd(BmrynN|W8%zTqh=YwbMhRiDJ&rp1`YymwSr6H(hK8v9vKOdD%?L<#=N<@=v9Y~^ zYF((jisTUG1)4V=9&=#OTx)RxB2nlLo+4p)!gb1JI=mcRyHwDIhK9XRa|G*l_S`usAhl0S#6Y`%;I}O;`=FEqYQBJMyu`k55uzMWzI=iD zMjgGB{(2YqGEnT%3a=50ejv<|a>6y|0N7gK-|nWTXH$+(OoVonBf#YaxUrb1C}4h- zts?Q~5Z-uY)7n!VLOfqgl{Q~us))0Bi<*#MZ$vNmtNZi84MqcP~GO5LgH!lzM)wo&lOvpmSbomb{+_Bvxx< z5TAmJq3fgf`*=ZkCtxDco%>R$yBisvu69~4c8tvhgC3{xK+juj;ari9FrFlxe3;(} z1Zuu%^%lGUlovr45?4IFwAHG)tt}=j>_+t^C#-+=t=3d1rXuNh=Bg-BQQ`@VmubrK*%5`GUmCxI{M`n790os%;ina#i%;_rwcrrs|(v&GCrc_0{B z9nTyZhT1kYwB+1Kk0-Mkg9j+m!RpA+Q1Hdw$}9U@!NS>Ei1GWBOY-Z~UEqg()=z)u z?%m~|Jd-XHAI%}xEKP|nL%C=@cn8$^goex7uTnlSt6WIwdoFnn@e)R)Sv zl{h1gO%@e96GBo=31L}iSs_}Q8so;|GjDVaZ1?$*f%vpNQm~W|dtVhqq^v2E`YaJ- z)bHh=D8X9a+>)ly_*zAxGx7I5@fI`iA`qb^*`^pCKWK>FbU~qi`9Nm>z486g>qQ6Q z5LbvN>9ufx8Bj4yG4VO%$n8zX800>_3AF4a>wYCP3xeWK+U6VMV;h`g3SD!9(@CO4M&ITgXYsmWROLhu6-2>^_f9PpM_J90BAvfYfE-*03?9 z?0X-ZdNi;bJ41}Lzf zx%d<8#a_ghA$4N09j7Zy4VYfL2(-v}IGJF&(lIcgHjb55*0d3*vTE=|(9jkX4*|DW zIt$_-vts3D;_MQO2j$vP&`~;i^4wiL0hsHCKn@EACzI_dR(AGXJRpXbu&9jQI@Jg@ zuCR$fs)PV%6bnMw=K7)BsA^}$wHwC~nhn9^O;$B$d%7$`4(d7{L~6If42hP82CFjk zhu3H$0CQlzjYaA~rWmR;D%XBrlwYNg)}D30F5$H#+@!1xeB0yb@|(RH*4 z3=sEiEmp-@vZ6|hqU8qb1O)jqpjh|dLG&0vTOfd4uqju7{R!b*1*c(uMwF5RSm%H_ zY3mmpN^UlUdzkA-psF3n1QM!|%rMh8ro{UxBl!&552&O?MHisgjKq0~oRS_QF zAG%NVfSvCHhWG?IGMxVKEBZn*YrG*}MHp{cK0#(4K_v}*G00tK4ktlFlCfIFbc7w0 ze}tDP6U4p2flB(7{;<*rmW4n$^5aJpyLXf>?3{=zD4Y}VU9-UmUj|*g0helTyx-iL zj&4=b`9mAUkcmN7ZLFo~>H~2p$9GwxZV);ypEa_wO@}IeuqPn>6i0>5ci8z|u;XhK z_a1IA+d2OhH?WPtkQYK2{bSr#u7gt=b*E!qk+ftG^#NcMmYM_b^wi(f%44s$r{v^7 zCTK9sjNLUQ7xj3m^Vg7P0v;$#Pz9&;-QT_(9!Q{6Yg}$aDH=BzR3_=SeCQgK)lg zYUvmoNbv!unOEfq5PVPjHwVSn2jFGUFD(m*NmQweK#>Fo2ixVpp-e|0PN69NlB;)TQa+rz8XM`D=-f-A|+x@sGMlLp8liClY z+g;y43yQUqBF9LOE3E{|8OoFme1?n+6)uv+$8JCMpLtouBJ0+ar3ZklRV|W(iG?NT z9MHTL4(*M%lBYbOUV)ceyTG~g6^?rQ(O9xH1Drn-i!wWDVsX~ev z9-*YlQJuej7Y!(WO7&%PjONvGkOS9x_>c~cP(mW@FGhg01lW55Pe>xe{NC8tsp#oYUb-iPP&ona2FZO8u-PZIdP1Qv>Ejg6o6(1?3xq$2qR3GS zZ+LM9vIqC?4}knzTy*{h^fy61gU?orAEgJqOv7-gnP$KY)zIQ)5Ha+?Q%>qv44fg) zku}$T7*b)g6)uo-M4%xMxNv_{iTBC_w{ zN2T|pU|wJZQ9-PXTtCtJfTUXtRW4FO$Bup3fmZ{y5`4tO#GoDC?AA?S9*9p#Df8W2 zJ0Rz2#)=>+d>D_t)v`t7sVAOQ*ffR{4Q7yesNR#uZC1H%K0j}0C=jfE_H0KrbV5sC z*OtCHt^xI$kiSRU%fg9Md<9|FtvVI@%??xN&EY+yljozhmp-wlKnS~{U5z?5Q zVotukRnta*n1xsAfgIbQ6tG?UW7>B-@nzcZw4~{Ua_r^v235ErtZG4^kNxec_~y;P zK3xNYlp^Xdn3Lg#SK~5j%vf}#Is~vwbO~_QlYx8$**@=JcXwT_T*D!p+^#F5@4U4I z_Lal0dv&POT7i(PTCZBezCQ?c(O+1VKZ`EyPTj?)W?D&mWBJhR?ds#U_tO}j^vB6$ z+P-P=N?_{rdgfkUaHbO7=I6vJ{a+Ftb#*ZoQ|$aeJQ9MUVQ28r_#4B2}~^b zg;nXc9Z`$nCY}k+uhCE3V|}BNeL1_F-hOg@_sRLp%6FQe-5Cqn(sw3jh_67}O;4y& zuLfK`xGp!P_YFZV6�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 literal 0 HcmV?d00001 diff --git a/doc/_static/ex1.JPG b/doc/_static/ex1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..aa62a73b8375d3cbca1a196db171dcbd95f12f46 GIT binary patch literal 16299 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 Za?i&5<&K6{fxi($*xNW+GcCQY{2w$?<#hl6 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_add_group.png b/doc/_static/gui_add_group.png new file mode 100644 index 0000000000000000000000000000000000000000..a7896aceeb37ddea3bcdec58dce009b0c9c7673c GIT binary patch literal 8627 zcmcI~2T+quyLJGTrhpPbX%VT?mEJW}sRGiQAibB+Ls0`r7irR^2-2k!x*)yx4hn>X z5{h&}Igju6zVn?k|2O~qb7uaX$&lS=!|vXD?|og@y-(N+HHBLwG$bGp=+<*ZSxpcK z4-R~&iSU6I#u}Szz#lw!O$8{ZbdYWxs1Um->brwLWIz6V@De!5Xn{sT*mG4m!ujh2 zBt-ngD`;Vyr&L%2is!{yP!?(DnOb)PFHzL1dEHBHRcR&T$!TM~3=au<_F^^Vqe z!LNwwx`uvnN%iCxo(Jr&w8770Z|h$x-$JOYUAz{EqQHMhjMtLM7BeK0EE>0z+>^vF z)AoX^?+yr5vU_-lqJ*+B&DFd2djL;)r0YrazI(;9b<(z~8T z0J{2GTW9h%mbt9 zUbi;H;6iFlSoZFuce|{YCL6NT$r>#Y$iT3r>VxHiRPO;;SFG8ZCvE7LdIxud44KLHC=6=H2OppEM^+$xR9eT zH$B~^ku#|MQX+FHKSrwdW?z6J(cXT8l$Vn_X@sW${WGF0_6mpOFG;#(+Y574V8!-! z$R%1@xXuHKA|#VYNIQ3E1?A-CmLn*_#frUqr;g9wUT>=Ruy^0mJDNulhjVkZWSBG^ z#G8_5ssqMJq{v&u^5}m&n6Y*~#M*nK)%LC~mJ(=%FIf?F$m9~ksijfPmiiP`b>7pn z&G;Mz$Riy_1T#xi;od|0@uEC-Xm^^ZGp~t*nWbebpM#s*$ot#Y`+Goeb_KJpUd-LXHNYBsr6ESX1<-dHXc$a@?(f`Oi zg#y}qnzxj|d0ipe!j<3OAE(G%)7jYu3F!X%^#ix@to8A>S3*+Y-imQ))i1RA>8XB( zWU8U&!_>z)xGB?P?Esef_Jt-=M%jnR5^u>T$y`i1b&PYy4K;z9nj;suFBdpk?DXDw z!PSNH`-Ft=Su*5M8GcTVd$hDX>d6DCTF7cL2KYB0_ret432?QyYni0qjpI#g?{jZY z8=Ji3SaG>>skJSl0v&H zEOn2uec!4D)zmywAFq^jM65)F=kn&?%t`a4gJjxgWgYXH^e?ppo+v;(j`tf3nDmiT z`@3e(v053vwGD8eEV9-chw!N~GT`=ROw;NMEhMX${(oEG7Ui8@dX1Vti61EN!v$?Hc$mM|j-sh}`+1fkt)cYnpSLL2@0bxr%M52{MO zfH54f?%9Qfb|~$N%041S9i1}-Ut%Jbh>=U#%}t5etd6rxULFp;XK0u+tE#V8#e`TN zQ^=(Fn53)W*X?zFA_IM&X=+-2avCm?(Wnq3v{73$E-rY3NyWy-06iGmKhRFa6Dj!k zw&OIPUO6|<=SNB=ufbY5CW3O7mI-&D@{ySCi=-jzO~=MXsh3)SbJ;8(gg2yU5hO8r zq?@>s)7sN^@P%6H)7q!fpzRA4#PINRyP`HXwj4b7*H-zh8ES3Ybq|@&zCfntYV(T? zg)R2i%%Y?7a^yW25s2UgP7V$>1T!nuP5N2e3*UyZ{7UptZK>pFtl|xEu@tq8b1Ft= zF0Q5{^4*}IqSsw1b8}wx{(ij$S~K`~LmeFsOU+fSt@d^`hR2rFAJZjQ&QH_Q(thI+ zs1PxBbZB~O zs>pu(T(SG=6iv9kuAV^kI$oEUq`tGlOACaEe z9!Q`BvuvJK18<932TrRqo%0s`>`1?gI)~-*^6&F=^SedG1|BHf4i?yAh~zAMeU!9% z)<;cMgOPEHlOs2Rs%hodUZM(XOF+}NH&Mc+RG_HK-o|EY%kbp(5HhVFs`CjV9Rk$y z^K=~?;JylQwKfh_zV#5=-TKC?r|0_g3}_(QlG?Zt7E7_rH~I{PPt9|=-#$7pQBrpz z-obI}d&%-j+{~8gyALZWcuy5vmTX1*wu@7&?bA2~2c{lWMLffRs@{)rCJ>Ka%T%1C z2{(xGzxi1!FM#h*n=*Xe()Y`)9Edpae9UTpHyh}DQ= zRkyoN4?L6K1_2OlVQsA-C$D;CsY?Q)6(jW=SKK6hvsUIbC0wu1_D{=$jKq= z>iScK)w!sW5)ub8g#&}IL3=BmkT8+aGH2-y^Kk8WYlbipb7$wB4t&o}D?$cAU3p;v9?Ib9MG60E8z2k2Aji16?e zxYR)Y{gCI#1h@6kF9d{SyQgqzX=zHzxYSxF`7T)nU@1joaD$O(^Atm2VP0WTQJ=Ge zbrTblp$ti7HMPr=m6)kw{dVp~J5=H5=qTr&ZYhh2AJ7Fb-d)Z$6pF=E{c^XR92p!# zCkY*coi!aC_^q!Q4_xTtcIJ`$CY??Dff-&fx7DfdT~mZef?tc8hgZh*x70(gtwnx;N>a0NT+03=iuOXuI;Sj+d06G?5iGu zNlxLHO@7D4#U(fYD&vhH9xvuQ#ALUFbiZ8kKG-*Pzi1C77Z(+Gb$;dLbqsuW&ypFd z3JW8yRWW+8=~N-)HjeF_gJdGqu`X6Dd6PKU0ROz+fr|Wo&`f zm6fFAFKGs=a!2L3=k#b-!GxdARC%1!KLhZw0>t4BtM|%?c28=o0F29zN{1^ zbn;^G^S!QmDlxV|$*>=I!|P+5s69Hm9hkJJowH}uz zy)IWsjks{}gW)&2X2}q(50?|jX@FyvH6%7Hr)N?sfB5x`yjBB z&5aP0l~XYMYtLIEMPVOBN8cVBZ5E_rx2r|T_2W6QQxbfd2XMo8ey?M>-czowI>fV0)vl$RmZA=cz=$;@k}3p ziB93o%NcOc@LL%+Ny&wd8B~MdQVF>MFPNluXIjdln*!S1?2oGnaqvGoD5$PJoGdY1 z^2Kp?eEfKLCswfvaFEs2Rc^zY-P3d92G5yWHB5;3q$I)vKyf@qH>XD_!4LZzs z1b-id=OG_QzhDQG1mnK}0BKlBUhHQ3s>I;)<_s=<-qW>I=V*wu8qxZx=a5!QrrlI& z`p}cii6ULd$vUWZb)_pN?qi&geBj~SVHd3TnB zBc^3QMCoVADJeV#jW&QCqRFBsg(h#AYCMd6FSi`aByVs~bMmT}5CHD#q@M2XZxvN- z83Z<2DL=_F>zR(+9BQ2w5YVg_%-}HDhgt7&{zygUHs>+{yOZ5tCyAmi8%^zOi=m+5 z-|A)m5Q-pSb$eVJ`Xh_-H!VC0F#~hyd4?7lyw>%*AQ0ezf3psNk~~!onIj=+E%F&K zRIIHTT8C|o$5Olnn!d&!^4SBEjWV2?nK>1d{?z8|PhSWZHtP@o7{UE^K9MH7iXR%y zC4645)#r8YeZG;b5;AN{GqmG(xLngVk1b8vtZ6&mUZ53rGBPkoF~{!`!zf|+xP@SK z4f>Xny_y-xv9Z6z7PSW;zY9j%Fd8}h5DTG!9y^`M$ou?vN?F;RIMb4oMO~MFL`FvD zk))rToZO-nVrFCGzd4q#o{4lvt7S;&qdr2jK2Wq>5I=VMGeYlrg395#c2_h#GK@_< zqbfI64Zv~QPa-MzHYlL+&YWBnBt(qR*l*9F=(b=|cdMaODGcu0E}v9pAgVXv9U-|| zs+20KEnJn8)us5|b_}e>ajwSY7j)oOu)(kOyNt4~hGyG?Z3v32r`;=iy?uSU07a&x zZ0Cz?Xz+7!`KHI!9C+0n7dN)I(&gyr=X1}AY z^_faG#?_+MGJFDpeD%~p$HAGNn2~Fl%Sowu&VfhrF$}6iaNzivBzXxi4b$KD~wH+yP zXQafi_Tbf#ojF_lJz+BWZ=B?SIV8%}q>bvx5`k z<6nR$z9=WnO5cB31H_BEzjjQ9^xk@W4I*}M@!yixK^&mMHSK1)Px??csy-;fPLp9u?PgN`Gp6v4}p}%F+Cj}5hD_be3D!Y?AE+F zSKp{WiJm=RtnKaX22ZSJq=M(pB0U%k1X%@>`P@GNn5&P9ipuR*_UC3x5ItmF@2DJZ zo2zA@M6^Cplw_{9vG8(%gdSDavW zP;v-B3CHQw6BBui>tTawqHo^3fxvg40m(E{QqrczMzu^S?CL7)a6_A?CNe6D@D>eh zYr5QLe@*b4C1?S%o|~IHJw1IwcmiwGs>= zGX>nKU`b8T!Y7W574ZQe`R-Q(gM*W5ytMc3siX=y&Qw?eM~DdlpbG%Vka;cTM6UA6 z%DGDGnAFtN{CqYa*SOIm?40tK(GMRetAO$kD$mvKyvZaxIXlY`btaZ8#1^iPzLjviK^MrPX+@ifhNhu>E zGtl3!Q>6AYqFL3Q|$_|KS)V5I5+Y1e(*YG>&rQ{yQK7G(iFNGIRFYa0F7qiWgN#h_q zy|^ePBqa39?rrb&MryyJt2XNMV9!=IlCJ1zdqLnikQ9c?cd#&Xe% z!H6X971~&=^(R*wIt{Ad!*6^(1&i$e?M8ZpFn# zl@L@#^8cWE|43p0js8gD|0t0ECsh6Ky8a`y|1G=!S=Zk~{(A!di>`kIDIn(mkN;{6 z`p=8{Z>s-s-yoRls7SV`*=MT%mSK*RDFMdmxOhaekX7+)t|knUUif2AJ&)7<~s zk`k4ROvRdtDyT4CP$HC#O&G1VK@Xz@{X8J~Lm>WH9bmtwoExWDZNTS+v#7U1=W<-Y z(IUe}$IVa-1(a1SZMt5(yQgOzQ=Y?47hHSRmRjp)$_QI^J58PO0$ODF(@btd?}hmA zH{1x$ae0dQNg?}-{rnaY{mmK;5fZ{k*seP{@Bl$Z_6!`|mSqc7Sak4v2yoPsZ zoHfyFC^1(eyB11;m)`r^13ISOzP@K)kL4x3Po5qh2Or6cRg1GoO8ReoD!+fsKki(Q z47e1S@XS|BPjTa9IrXi0!R~O-H*Ccw&{MO#vLfs>{V6T2pD$7l65->HKJ?4ajE-U5 z@O7MBdKWdFol=6CZMJC*w#c(BEiHGek+-i#k2i!13HEqGBz*z>G!B5$lG^3k+S(-Z zMIJ8Lv>84#Hnu8GB-mX^NjWhPIX^jBW7-k`@JiHOR4?hgY6I?Q&KW`?E&#*4u(#jj)rITpYtJCc zl-z?AWMw1oiJJGuKe~PU_Iz5sorV_Eu{oejr2;SEa(zWWMuPBU)9Tk!01o>b)wjS} zw`aqktk>|}^V#ORcrUMKX5aCLt^-l2rltk}9L<9G)T>K4My+2u(1A!aRw3U_n9m>?&iJve0N5ENQFuU5k zPnB+{ULaPwqlbV@T>0nEuVi*ZW{ZrPVW;Ce`GXnaslZ-XC@WGna}3-K0L1;&Ug=6_ zj5siJAQ#hA{WWc<=~LJ?C2Zt_#$6&NHVy?M{}Qx>3IWWeIQl1E0R8E4fN-N zOrvqSZaS_dT}4rG`c6f#*{AdK^VXnNKpf52`K+uuvxVNG&AXf)R{I6)sfXhpz}3oK z%eC@U0E%);xNB%g-PBZCicyM7g6p@Q1@=ygrK!L(O!s}CI0-$`KED1|Jc7G1kK*!O zumHT$$B16;+`V#Qa$=$iqvq0cS^h!nbk_;bX*q(onSxkOK13eiR*_+0wuRJr$TrGl zN;h|RVWol6-X|JO+fRsg5N0CuoR_#8L z(+If{QcVsj-CJ&n7|IacM5Ed6ghxh2Qga*pIJ`NK^C!7;;K$Oz;_GWrjAbNuQwBCRH!Hae_4I5k zEOLJbwr z<sRO8q8JU*M>;q@Ou%j2Cc_gJhUwN?Xwh zQoiF^GK5Y!O!V^6uzUJ|G8}u835UbgE&>WmU(1jN+Xs>t&Mik!#V-jWK5TW(7|px1 zT$PS|cG@PzrknKK7X|K|Vn3zD);f-P&f`|zHj|&>W|rLKGm=uN{X}azIS?PXQ)}as z5~R7|^{;Vcy1Kgb(oJIiX96)@K*BTp{a+G_9}$7cVC-7yJ26 z;ML~Z8msjxQWQyj+4w?VqbJAPy!=x(`(al|9_iF2!^>K^FUQf##w!?1o$X3q`0wzx zw`~gzo<;LsvrE)sFvet@xw5glPMHZe1rdM=B7hK@skF}j^5qflgQPxydw+iRZhm0_ zpr1=cx@Ds7YnYSZRSd=k@FBHyvHLB2jaCxVyUpBoN5sO`te2 zfWJ7oxVXs5B64z8c7L_Md;4|^i%lRUCL;P;Sm@^J>gwgSGgY>oE2STQBrTw2?s$bFVZ$KbbcD+0OGQ6N5A;y2*WB?rMAJ+6Q oDikCPMy;&8GXdUII1PNdt^ZYP%;6pILIvo#oSJMY^wrz{0z++#L;wH) literal 0 HcmV?d00001 diff --git a/doc/_static/gui_add_law.png b/doc/_static/gui_add_law.png new file mode 100644 index 0000000000000000000000000000000000000000..80c9d82bcf00581b5e992033f6175fd113360ac2 GIT binary patch literal 10128 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_ass_edge.png b/doc/_static/gui_ass_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..10fa6e522d6e0b818972d76b634b3198db9d6a7f GIT binary patch literal 16496 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 J5cc~0{{x>*42A#z literal 0 HcmV?d00001 diff --git a/doc/_static/gui_ass_quad.png b/doc/_static/gui_ass_quad.png new file mode 100644 index 0000000000000000000000000000000000000000..dd39c00eba1ccc666850f3f814a3a217b9a96349 GIT binary patch literal 8581 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_cut_hexa.png b/doc/_static/gui_cut_hexa.png new file mode 100644 index 0000000000000000000000000000000000000000..a47b1d59c0d9b80d1ff426ddfe1ec09b8b3aa645 GIT binary patch literal 8361 zcma)>by!qi*Y^jhp+gBNDFLNKdguY9LsGgM9Ac2}VJHa^L<9r|0cq(*r4<-b8dMON zk?w})@O$s~zVE-D>)F>eXHLvMXRWjM`tHwK6Q`@KLPpF$3<813)Kr!9Kp>o8U_Tdp z3)uRyAL0XFI6itRP*5eB2@4z$d8(TDfI#HkHy@mIUUEj@Bq3Z)OPO#UAD5VfT{TqW zHE`-KT=^MX5$56H@Ei_O^med;JJ_@Oxxk%SRn)X}jU&kEKp<9-nv#Nn|LkT?kh$jR zb)TFQdfv6=LCZs<`uk5G=)n~|;tek5jmvyX77XFP&+pS{@I^mMSg5+R%}CV64y4v^ z>AiA^`^eK`V)1-?xJ7d91__Jl|>iyWe%UtFXj%fwVeeo3aI zL`3-}M=g|HBO;Kf07CL3|C+?r)ihOC*O1QE$`J`5!!>0lMVM!BShg>pZfjr-Ko?4i2|9g>h!`>+22Sm8GS#Hremq zG3=fjNUKpOJB_d!xt11m$QI{?`(bq15|p!~P3*=#L`+p0!Ugqh==?@U3x;`lv!smQ zSkf|ESTw&RRUspr+?=adQ@cMoS!xwhDDDv7`&Ni9NW+hw)YPr))7fza2q|8W)n02|$2Tv!ekQReyV1 zz0E3{Z(on3?EJJ0X8TJG#cVC8p}ris&mE-#L~z}c}q(}FKpTxmH!puQv{!_ zbK{J27TFlQD`jjvM8>E|%dbvnD8>=jMSsD&(M&+FG&Mqk991Pa9&ADB{CIm?9@tAr%A;WudFJ$q zNBgPQ(-^j#_@tN^F(?n@%tl{-VBLWwaPLFM!sqoy$NSaQ$+vJ5DWNLKv_?jIQdy-4 zB!i*Rp4D~PuoBo~`jP9RbbCDURXXpA+axL7u+Qb$D-v4LlFH{D-i5ZCvyB4yc)=`; zZYFwT2S2Z6?~1BBd`qSa<)-0gOdo6q8l4}hOI6uD@sT}`jaUt zCZ?vwx3$67hQ@gx{EkL0ZfaBg41)z;oYa<=n?B_A@GuIHyj~r8h)9WwI?J#k|Ly54 z>}VclybPvdheDCC1y>{e@xApbo$MS@5!Tg6{1TLEmUwb}0&iMIpGuS%b;V79bOlko}8rl3a0`KAb~;CxZ{xAU*L6PJ3(nEIjM^fzMh zu4blZsix3)Gdd>CbW5+3Pn*EK^Ya^9^}AbqO-4s4lrouQvyCm$wGAvE%LkkMs$QIU z-gj~udM-j9LAkrxh`cdmE{0r2NSN`U){w>}-*%tGSu) z>NNB6;Yv;rBmr_Ei;QaNp3lCw5GjY6-a!g3(xy3}88-YLLY)&I&*k9}U}15zIj2OI zLQv|Q9cF4#2Uo;s>>-^Qz*5-#QX`{_D;J%XJ{1ScN z?pg-vx0ipunXM<4KI|we$}U=Ej2oS>XGfHlzU$$AVA+C1nu{kiy{IsdetmiF@rLiz zT)GCuUci{hp%gnZ`bq^X6MWLEN2+LQS`IjpRD5tijEJ2zm4(KB`w)Qvr5<77m?4+7 zW0&>ufSnzjLaDSRY5$YFoW5d?Q8n$*2KP)aXH2Zzb#U+6Z7>@H+4zr@JG5dA4a9dz z-^CL%vvm$?7A9g+I6EI9Y&r#CM5v)3H8ot!%mIpu(FX^6!*a%VhHLB6#Qh(sSmlmi z={+4C$XBGH6=*w~gH_GTDw7G<`vn#mT$@f!N z7m8Bw@g9S~dBh*@X*)Wm*Vmslco>CU8n(f)J7VJUCUJsBS@)?*uiMG^_x79Ft%=8v3V#(9hrHK-$B}SiGE%_lxtIlz4HJdxxTup4Lm_#fM!;=B*xf)jcUhO0+Ulh8h0# zO1KVF>c!Ss;yReEmFNZYlcpD!?=bTVL+u@*uX)t`@>1~#>H4>7jk&mR!!CWjp-|Z@ zEvtsXJ8X4MI&bVtA0qHcKzUQcBIYf@B?)C7lj`mJ^oWZVtZBP|DWRV)RZRR@>E=ncHQoGOEy1c!RtT zE{GLBGO7$kccyYP#=h5$pMsu0BnT;xbL403K!VB+5G=Y|G9p^ zbQa@8b(?vdf`MIvll}=VsJ{jCXKjs}i!(4V;3x_i8<&K$fCI{;%~@Jn>PB=+`m7x! zBi{=9kz>d~{dJh`ORBZ~bPC_C*8bzs0+kE_E8EAJj~y1ri*?$i+nY=l0$1{ejb-zs zK&%C*+qao(2Vt4c-+i_hW%&6k7{#A!WT|Zeg(jhu?q9&YD7UlE%FvSy}Amn!J{KVV^Ib6pt$^ zD*l+5*mC-*1IbBCOH;bvhi&4yH!7LlP~P@(Ur(!>-r|KhMqz;Dm)HU?W*1=dT_Wu3*0s;c+>gvc`MlMdy*cS@qmnUAZu150wo+qZAuzpBj3 z3#TLogHKkoV4a#aW)0f4FHA%J@7BaY;!? zwp*ZWjVYLXQJD4Fa$mBP1VmT-Q%p?X?sDIQ(XU?ST3U(m`WA+Xlw)Iog;s#_TV%v8 zH`UZUhQ@xif0U`ItgQUEt-1Lwo59nkY?NRoW~P#UPPH-TIx(Ud_ZJ!(8d>h?X=&sa zfxp&r!^kNp#D#>2NJwhyYBoAuXqc!;VaWvH$34^i5^GPoEv2QU-+y~*bLUi6Rb3xWS(V7|)-k^y$HK+M8)J83_cg+- z{_;J}8sY+@fZ-ZmqobuQ0)}F0iUjW#K~x0W%b!%$Qg$}aK;eAx=&O)(ooorAkTbZU zp<&O|;Ctb7_?QbzvP$ZQlN=^0s;8Dlvc0Z@8z!~fI`3aDOXLpIf$_?Ws)#8l{JdV= zb%E@qV?@Lg#`M-pj@H&Yr+&ldduDp(2ZI;q11MNzF??(>U71pTm2-C*M`;VT9Tykc z-5L*{xz#>(rv$bV_w#l4J?$wt~HNbwpPkGDg z=0SC=!o))kQk^IUG-cc;m;CTjTl`+zLmr+llw$Unl=%4gkn^LNnYrE5;JfaEx=f%H zkpqf0<&vMZP1;_Y5JyA9A8+{0EGIgwAKiU%dt-GtSI`aRvo-9KCjnv|AK=|R)su4u z-}F0Np_#7)fet|aKCJ&YWjzqa+=KnlhZRAu4{5|2#74khxVa(V{D>$5TYBW^BZenk ziv%r3-gpFf@1=dIXK_yMC=+%)Vn}>)>EUy$1yFZLDm623*ySQY7UmnjoVF#ueG3$; zEvVS#Eb+&jL&{Qdi|aD|4f%TmkNGdpSgE*z4Bwth4ltL@|CqpI3JBkYu^ zxte-kBQi27kkZo9vV+}I+0oI_&d$zDO^B2kgsIIWuZO{MCs-8e$qIhcCoM}vq4SpE z1UW!#V&N^$gtCYczdKv}mLE6d8(x3{k`qZ|lbzrO@PAwrp(heuV-1RHvEnIUK;U|NUKI{D5D zOq27O;{fT!sSc}z&g=R!D}H`{K#l2_CVKxG85sc<$h`g*{L`~k2?#$*>JU88uMli>A1gTW zk=SEeW}RGV4`=6-^-e3dsY-|18CO?V92^{jK_n8HKqpvf(uy2%EGsP)pm?Soz3<=F z-QC@P_==dAn2DU5m6i1rzISdE)wg_~lT%4q`N6}7KtPn6)UKZFE`#%Xd!LYY{rU6f zqciY(Kg#uTNiV;6f-cC;R*_6*kqdmgzY{`oqc~pDQc|tu<>kO=RaRCO z6(PqYL`Cb%%lRHMWDJOkif$@MfIv085Fol=bL%WJ)n^W`85sgk@Z^Y=Fe&r z5f`7DoZLF~O6HljYf-Vcw+{)CfqrajyEv;~m*JThANLu0C+h3#3(g-K8v|acUPf?m zFgphaKnWV^>bADF!66|*wCJ^cGgH%%b^aeV2O#;}Q#k1XnNr`^C_*Zz(3~AGC{NzL z+}S(W+dHCGPMTrSx3qlzc;3FH@1SJ7Xbf952^4ll-D!h5Pl$k=Qn<}Y*NVDbaIO*N zR6E0=l4M|H^a2haM5Bv3#XV*}l$4Yd6xi9=R9kW|+(>jXadURj%(8_cPO_mF65`?+-WVknmDc8F1#X-#+|hOSPJ(xrdiJ*87#kW2 zWonB1iBG4}gXH0y1Jl)Z<74A_3pl@C<1^g@^lv>=dz+e`9&7;y^hvL?caoq(5eM|l z66e1t^9C^gq0CE?X``m?2>w7E%A8~ZS2LT@H}6B5Dt7jrh5{YzW&B;ovEIb8q^vB+-@kug zK)>qld@HP~wA58u8ULjuNNLTEHm9+XX0h5%MOnEgXHW{5`-_%~X9Q=9i;E%b5P(kb)qxSQoBxb2MEq9Jp%;9i&NJx8e z@mkSGtqC#Tc0LF=sJ^q)iy+5q@6Wfc7>Y7-U5Agtw{G29x{A$`a;iK~TC3Ml(J`iA zga7V~CNFStbCV0YB7MRFyilAD(nucu2P=+V1&zvK*O$lNzI`+Jb+|rNW%0Rpd6zb{ z`Oym}cU9+DybNOrOMQKPGcz|E8-?}E=_3YPoDX%@ zhXcaf9>*$o%ZQ@7;D`s%emKG<#`tS7?iWqMlkiM!ZgK`-t=(Aw;wVYvjqy!z-6V0b zXhK#gsbC}mq4Y$l)BjfZ6(6Lgp^LlC_YSB9H#i7L{ceKqCh_}EcK7e>?>}+*((jsm zX1bsL9T5ohAWqxG#06cz<7XQA_KfP6>{epwi1BDOuo$(pX7#}f_5=y3+ z?{~ytSP?~9S(Bd``@eq8@5;D}_-!pQk}!16g5tPCEH~7E+x68mkK&Cnm@V=|NgQ!= z2vQm`uL0IBc^{{!ENV&bjq&BwY5pB5cZ*#P#t$8p_%lN zV=z3TyNiwOGuvdt0Pu)->HV&S&TNxlhv2i~>Xw%86KV%u7wfbLv{YSP9~d*)Nf4k64KxDW2!@#(ssknuK2Bz<>A$;tP1D8*4;w}ASq z`VI_|BNM~C&G3M8?$4y`pB%LhYE@}w1_p5P{mO=hqf?)?g@uKn!Ug-EJ6Ynev(rvt-1~&t#@+sik<83C@=mhApX}sK%tD<~S$=1EW!e zr2~LeuC5H!)SYfiaVq}V=O?wpvgaII6mD+ozq?|puBKc=g+J4|-IwfIUS96gq2J!z zWWIM#CmQakK_{k{KGW*AJyxipELlZjMaM!VkcEWJH+lUiHQdr)aFIw<`tXCktYWSq z-p|j__s8SU4qRMZz!P7+dIjK%!ATg!m0$VcGY*adA-mp-y=rFApPZ$@mG9{Qjrz@w*+>{> zy0DB_nm6m2nQ2fe0h!w#)?P*mJ;ri)1n^y}%{QMtOH?YU+ep2_VQfNwli7^G6iQHt~2a0H9o7?3?0987%cJqHNyQq7%|?!64=&m+kY@x*(tRUeJ|$GMF?SXIjIu~;!jvh~cbaEgu*ik-x%U40 zWz7{;f+}BHTbo)$$YM$EdUM{!i&*v#3~b@~^X)Y^fbe(*eJo z>^P{Zsd=!olcGx!Y~28G7^j+%v2oeQk8lhY05>IY9N&+zF%;j5rvxxVW&L-40U`m6 z859Z~92$~h{P#4INaE$;p~U-Y{m9hJOnK;IWu?Hw%66if8M?9a@8+t+YD)2IT%6Gc zSKl9g7s-C{yNU#W)}@vBRInPGTB>r7vZ<*lkdrR~X@jU*Sm9;FsrY`@aE_D;WjBK8 zHYF68=K$gYNvHMWOy=3K%*3V5)jxmgLNCt%=mY?toR~cIA0L?Tlj7pOou=&rnz7*t z;wj_NC+MiD`{?}ZON2rG?F}x?Pgx_gvuEe9&xC}8#pbG5cX!pVp4ek+jf^wnGF&we-#2j`Re1Prlu-*W#x~>XU~PRuE`cUUnumMrP2F9;d(7< z#7O0|MO#MOyT9*3f{vS;o4=jx{jK_Zg&K8^i;LU+r>Uu_6{sW^tybpDjJcewKe2v9 z4}e7()HsnzQcuxB(QztWK|w*vZ{uQrBX{V+QK5`=Uwd^{)J+-LKk#jCZf<+JBkDNS z*uwB~Tt}|CwUva(#>8a?NTW}*f*GCwH7b^SDG@@V%|*y@`x#>+4xrS-dO?Ja>T73y^66 zyaZJ9l&!3;*Q-9i@lx^D1OEELj{o@agRspJATTF%wu_4kcH|A(-F^J|*47r__Vee@ zYc>=b>*`(tZYL)<0TydiTknvlfTX0K#yeEhe*Os_Hy5x+k8 z#&5RYwpvf%gKED1uMo(+Ac{`S;@s<>|Gk2C?Ui0@H+%&a&hSj~iBhv@P(V0mWhe9;_1&pH=rXBfC>fxd`z5# Y@n>8VG9aoafU_VqWo@NOsCDH30C+X$*#H0l literal 0 HcmV?d00001 diff --git a/doc/_static/gui_cylinder.png b/doc/_static/gui_cylinder.png new file mode 100644 index 0000000000000000000000000000000000000000..2d73ec4b97c7a6468acb9079e27d218052c21017 GIT binary patch literal 9391 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 gAN%njsBZVVk{UZcjo^t7APmq8DFt|et<8 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_disco_edge.png b/doc/_static/gui_disco_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..6368cd7e7db57039d2bd3d2d4ef1fd89f5b2424c GIT binary patch literal 10985 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_disco_quad.png b/doc/_static/gui_disco_quad.png new file mode 100644 index 0000000000000000000000000000000000000000..978f7bb02421a116805002998c56a646bbda0aee GIT binary patch literal 11081 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

      PPK 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≫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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_hexa_vertices.png b/doc/_static/gui_hexa_vertices.png new file mode 100644 index 0000000000000000000000000000000000000000..6c7fe78ab74cd1cc775f7456ee3a514bd406dd2a GIT binary patch literal 13920 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_import_document.png b/doc/_static/gui_import_document.png new file mode 100644 index 0000000000000000000000000000000000000000..f09dca27ba3d8b8daeb861923bc6d1ee90ac323c GIT binary patch literal 34870 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 Rfp6VHUP&rQ6hhy;|3BfXj&lG2 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_cart_grid.png b/doc/_static/gui_make_cart_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..38d04c8edc112282da3f9815d3ee7ffd72f8d28c GIT binary patch literal 14243 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≻d3~=}C7GGaC%XY;KAr)(0fGZT_zg@NJ7-BRs@K+x99Cv(9ad~09W8+p z+7(zug#-C{uihHVa9dV-oE=auQTvAL`*?lEZkkUp?Mi*br@B3=-%dYD<6C>aMbsS~ zudTJt68x06%JEV@$iSKCiA zYWs^xT%~16V?Iu)a4DEx9VA4dnDyRBD(Dw>KX~DE2&WJ|xQ{g?rP=Aay`04X?Wizvocx|$Bo!-9j%Th!UlH*v6!luI= z4q~j8(;s(R_cvI&gvr1PINK;Fp)b^?iv};0Od_h2_q*sJ5GiM8UW(v~&a&lTusG_xWtqZfgq#R%2rc*Okr#7YLNZG4ib&|_}DYH6v=r0;D; zy3pz31G@7}REn#siZPwBa>iF~*ZL>4s$2M?D4JD2KVTP|zgp;nu32Uv{P;~=eipai z9w-tdabVw1KlFbzEPUN@@v(WH77uMHnwW>Uk1WP)--aXna{3uJtA~6axf<0t0uBHmkW0H*=&> zs$2>pv8e^?BEjOqrlfpfW`T*g?*KxzK8rrY-*Z}57=+avgA<=4Je-a(&AAu7wEVp zO-xLjwF}z+dLY_t=yfjPz4ODVNTbl}+;*vGY;4Ikaipr*iS!w$5NNb-0K(38Igqm5+U%#$b%&c2jd)LzO+l(9DTBW+v=|n~SEW4_< zn8;Y&L{2hU$(D!MIp-`|{krCLM>jo@(8XKRRa@qQ(HXDNlITqN27)I-AcX!id zAE18mxpGT^><*2(%w3!=i;EZQ)@1y5dH2{o_2)L^@Y!|=V*Rpc6QtY zVPXNdy$$*uA7?=7Koq934#_`xYsqsi{ggQ77yP>lhO4lqug-C0d?@ z=}hZ)qzcI=EKEY7*b9hXQ*&qyEtlIyPAMxb#l`Yn@^K%gsaSSy)qC7Sx;_y7We@3C zf-&b*mGzaq-0;M_jb!UK+;Z2`JPH&ss?Dj(i7hA^BnVyb@VOLV_UQyg~x0{N`0D@#S6(O0=)b zATn9yb8HhNki?+5xw)&Et8^+Ej^JG;RLLzQ$Jl|+&d$KlprfN*>k+jFqyjO57Dv6l z@m9y-q(YuN*VoIV*M}v@4@i65OcXB4T#W)N!no~`le&Eseie1F8n$CpkO|q&HFhk1 zu{3aUI*iY^QBzl+Rj8ewQ}YypVL!!2(Q+QBtgNil-|Fq@`DI^4KtO;_!0>2;t-OzK zd3kv>U*BROd4)M9Z0gqP?POdgRQ-h-kSEUZ#G|64g*{Jf8{ggX4gXBYe6&7HPeUU~ zi^o-&EJ8kK%M&u4J){7BBJKKmj~_p& zvn9MdJ7i~Pukk$Ho33%8kxy({+>PYs4Rhmq-`6CLzS0+)!!TQC;i7tT4AB?VLQt}D zbAv-e6)L01aRN~&yuH1ybLOwD$d8@c6{6ctVa0TQ$5B{Mmkxk}Jt1ffY23X`gd zPfsv{I{oVSBIt31C&={lxyma6uQSK(nYxY90u$T-?3WrEw9(zVZPkT7&+*WhDy#|R z6!jI8mB3c_?S+2Vk6>eGpPsQdv`M3tVIUYC|6Z9HgZ;+RG8dzr5KHx5K3WU2#GP6U zS#((=^(4P!_@gSFz7AM#Ij2FB?;%+MH!EvVX=zVa&l_|w@1uFTE(c?SUnnK7jwWs3 z8S*CF^Y&Gep`@|gE{TctGnICWC=~AQ?s($Um2Mw5*JzIm+h`22Uu4ni0@$sXgqCg~Y+PW`$N+Sgx1(Xh&`q#>U2P-%>?%X6L{JSIWxDX1$K5W7$m<9tkHmm|dIP z+U=(Xr|5g`wyqE7_?)fL#L5v6#w?@M5)6irTDmFc>|5Qk1 zY+_^LbFwqvFLW*E1nY-LF7*!-4x}tR4VcFgnh_%1BE|IYtFJppsmHlBpr^;O9rYzy z*|5T2wkiJH?w11Xo(2^Ta?*60W7D&FMl!g;?8aKPe(g&yavo)*3Czo{it0xtj9a8z zy1PGM=exw_G0(tD26Ez%d955sOxbfEi8+!lnAW_Spwf8nXD{lMgGQk)g)xbA2Jc)`(E2}IYof_v5>;;}KF@BX5Ta1$Vn?k3^2{}l@5N1*`OhuB(pstH|O%F%NkXvqV-(YBgvO9;v28f@xNWe|1>k zlcnJI1P>37m{_Nwds-s|pOCOWp1&V_%6KQQkdU4ey%A-0xwxk0cmSEFshNS9nL*W0 zA0tD|p;v8=aff0Zy}gXjpU1JgV1>1((sqrEIJbOy*tH%cKwxHLBHZZN2)1UV!z&!f z`l#E-{ts#e`+Yckmet%EgLvY)b?#+9f|=>*YaCWWGcru>KpVNwO5m{L?OA=de0B_n zl|E?YNu_827F59LYf5HMZck6HoQ1`Plf|fX+Dm7ggN2j@tI6_*kf5NT4In%6ajucIQ?yG`rGxTI+=e!3#e`*d%q zxR~t-pN*Q&c)2GQleFT;6Lb`mfx%&el`vtiv(ojhE(z6X>BcUkSh;Vu^c0+oPFuBA z=1(%&j~%s+#8|kvxY*dV${ol3_6fmttPfe~=u9!&HRv?h2{JOu^Kxo`befqfNgCd$ z#XWRWo42<>JUjl8K`uec;MMj-c7CJg<%|3-!OxP%@>c%uL9-LFj zQQ?@GnVp`Vwk8HX^W8c1j7u*mF7E2?c5-wCHBOu>-fUVup1Ax$T+ElmLGg1Q35ou6 z*y!-ERUv+)mv5U^vLZ}~QX=?MNXRo^oqEsl#>Uqj;S?bx6$&9m`|Sn#4SKYAL9K6u zg@uQsHn>w%p9{Kd>5S1B@bU3+$WM-sXW1n6O~K86;J$BP6c?9#{OFOdzyAbAQ7oHV zkU8OEYMAiPfdTB#t@L-)yvYu|44r1i{@f}i6?a7nD#h8^8Jb^8X{oBdenX!;rh?DR zoa)l|UFiXE14m?I*Td@ie!jjK#5^ptv>kmj`E-(l!^6*fQT&?X;^Oij@j0#6{!mjo zdN@?tl&e{SMZ(8n(w6|wQ0$Lk743boF%%Pbx=0jnqnE5S1T(Jxaew{S?|qI9(epYS z?yvAtKykY`v6GVOuy0thoO0kvsP{U5p0jH=zu2~3TV(PgXVh(FeT}0c#mUJD>^{#U z#5ms);$Q_QkZSQb7?(y74A0r5JrD6xu?9mr?fS^3_S)k$@b$RCWJ~|Hf7Tib1&G5g+cWZtiVd#w3#DuDIB)Kj zx)y}ey>k-w)8;$_sRR6q zkP)}V{tqL0H(Mz*mAF8+W<*0g>wbDK7^W;h1f3nMZE9DjpB3b0 zWf?q@&{u3IFF$I$x)XAbpqa(Z&CM6v%4$I4V&&9ybZR#~>#mOy28xlAk`f7xlSj!c+4D~3*vQ;*Do<4CPDBYK6P~HF;6A?q zF@XPM`(w6xG0f^RH#omhv^3Jw(xjF6GF*bWTQsl@O7$l2MP$CDqQ9M^tOECi}|T%t^edXM2Lnhzr6Qu4Bg zdwc8G64wv0C}m`2DeFHeZJ7^cD)%Y$QA!4v7MAYluN4>z|G779*$vP62$I+a_rq-S zQe4QBjb#yS(`hvjT%De5M($|`m6vm^mqX)|T4C=tF(z!899~&MLm#uJE1;HUP?tk+ zg}cvtM`vpf_uPq<7u)zj52Y zDvfu2-|@X;1a)v`FrPmK<#FHrcYUOMnwpw}%7ZHD3TyZAAO3-G>;HmqTcr5&n~Na; zNew0Ax-r;aeKxAZt&$q@k%LE-6`4UCpFdt3ivW7O7s_aB}$v?j?Sl7XN{2X{mogM#{(k-;wvP;KOvs4wdfK|Kxro-+pq)58^emxWKpC+S|#5JY&+=hI7#jXBmXYfWR%8M zh38#16!HlMn=Ll#{_x?$ z7^YYB*-JdmL5l?dus0A9{VQ+|XjGJunNb!v9~{eAg;kVaq-=wbIHJ!w_g15)u37?d z4Rza!73ZWQsG&S|A23ORQd-`y)+pF1vr@EltZI5cCL+oaek!h9U0v;qO$uvY*#|&i zd})2%93o|4kgUVx@_3^uKUayiQpXyK=?5{8mzRf5udl8mgbS~83hL2NQ6KZzzE)BS zht@&kUgR{sdLLtoom4fXST3ozJWXGv!xYik*OK4{!glx%Q4|VJPEI2uqlU|)_;<{& z)nAVe!AB{51>6rh1_r{hze1tCGhIvekNvZ`>NL*5!+wOk+Q5Xd9A{EuOU4Kz#1YGjo-dAI+hG0>H zl^#$d39oS9=&kVWUD;fm7EG^15>Z@eN^$#rOsbIuk@gzrhXoFc(4X994G|Y9I=V``0>LyilGY*3CZUAdbR8B z!r7=M{e}7*A9@nMFP1zUB-<>Pmvu8oDKKt_P8G$3sUI_{&tol+=`zu_&`REG;rsJw0#sdE+-P-$+Y$ zhLZ3{@>j(>a|;Pw?aVhjibkr?+z~NpsAXg0cr^nKk25f%1ptw~|I}iwbv9na&cbi(ZD{P7`@q~pNj%U2WuwQCw zJ|-c7+S0$E!g&a}xVQi#Mu3Ocvh|z4I)gvra-qUORUll=*W>YUjeZPQ-j_N!Jj6#6 zH#5tsulI(=8~4UJtqvsfIxHs$dAYX*KMvV^pF#_u_0jF@^mKphmpZC)D6Cvu#_Fr1 z1!Of!|H)rP=S&4^FnG_CtIlON9$DhQJNoW@w97=m7xJZhNlQy>Z5N9bGN0iB@z%;j>lB8|vyYAnMV5v6qSy>q#ko%{K>FZUM1$N3$xCR9ul;ww>Z&nkq3x+Umx?}x^~rw( zE-j+pfh+GOaP4aN$5}N$o1YPyF)wGNrHv7?I`iqjR+p8{5nX@wJAkpI!`D5~0h!(t zgLUp59>=Wb<#NKWuC5-GGM1AUS{=bda!ZS3`n{sr(LOT(G}%jF#6SqH^EjRcL5K#Xh z_d)zhiceO)mkrpYP?=R)0C$v8QJ{&L>f3t6SOLvTw!Auh`%1i4CVsO)@L8CIAi1Oa z)0=PDk6({!ifjSxVB)!Br4Cc{!b_d?@u%WNRUgl8iL92gF$Hul+0rqI+hy^AfQbU- z+E`Q42}(B&N;iv3p>%56wpyvC>W-ir(`}CtX+1I>FLzxCSqc~aWLC^BCC#q_EibcJPqAd zY^>X@O}Y!Q%%j-=;-LGDqeoN*ACsM0-(48 z901S5WaN<7j)?j0t}daAIZ?pX%A$8iUD1y>fy_IcqxRqlPsh(DHgfWJPy=dqcKCN# zXR>I(eeDP3M8?tK;Xn%DHKcB4F-|uIUs+jM=3D~K2QkgI0brAIEbaxR)L)%#7F+#fd7zh zlj^n6J2`6E%Bb+TZ+tE@I_0+06HYI)4*qcTf2f+GC5+}@OUutPsQN*$TWkyQ4UfoB zc!?Jk8xqrHO2#(PoVqJUvS#!~1YpormsLGF)wpnfTYQUk96$>YB6!pXq|CozB1Q#b#Z- z%rqk6n*J^w0TC5-u(t<80q(EQS+V7fos3LZ#}`Ue3c!?)jEpeS762(>F8HpFUKzy~ zsbBN+Me`AuFSAscqG_Hzdk85lD+6)~9sz-xnwkU(9WCvr^Jn=*f~)K6Y#0&I(W6tC z@d^wCU@Ypcug-01cm1QH@U?k-t}Y4-3-|W+rlzKLc6P)+6O`p%bVbo4wAHJss(`Km z6L4eelLDJH??0h7i#F{SDc{@4a8nv!1XzQoo4kF?F`>RbY%!nW$7HC>z{mjq`7^HG zprj{;buk0x4az*_ZdhUy_y-C+B-Qp0b9h}%xrvO0@SW7PoLg4 zp>p&f_Je$hhK-K(0<>ao{c78&e3N#xKo_VW^ZTcsxAe)eQBH0zorC43&ntB|&l({6 zlW%U4MWuyu{ZcltIzQQ_U54B55*`1Aj~xk5%syAEB zHE%*63G%j{ATk`ygap^tG13J8L37 zD^_8XoWtL5y7O(~@yW-iJpv&$kMPg`s%=-rNIyqPQ2`_Yw$ga18*W%Tr7y97tL<_A z^s{Hrz@!0E)cZ1I6crdy&NsJoYrx2-q~?@Zju*FnCd9o#S)!tl{zSoUmf#h!eo#Es z{vs~RhNG2u5ieOLppd*{BICno1_0v{=U5gb&FkLt29WA<)C!*Z9{8kQpQ5jbKUID$ z^4ivRXMP)t5Fh_u-UDE_C?d1gS5x~I5z)M50HOt0^Z;Yp^CTF_Mgw9OKHrm*DF{BR-_N}eTK6a)a0@P}uNMky*RC|B;3p%1^=Fvz z(bMPD*6K(~20%Z^T&gx9y-QTMGmW-%kO)*h51o@3T_O8l9f^V-L8OEaA;4*cN&z@e zP;XwZ=M(^+$9*i~M|gN|O>8oZpBsP);}8M*X$F2@XXn~<4L8O2(o#oo!R?B~E{=|J z($atrMXM=}zd5u4qXwW&o#Wb1Uu{$?jwlu+$Cd7!{&H`%SFc{Zd|B+!-UqfP4#eEt z{E`3QD7+vqPq6SBsRqQKtEKK}5L8U#MuvvodT{*t;mLty+P`y0iYR|$yyi;Qnjia* z*L&3*l3M@)b@5BP%jQh$w~9ehZAxZuyZ6ZMd%Ls|7;Gdeh>n+du5+*r% zjCTWO!Z&N@f2>Kg|I0Pm8>e;xkar?!qPaJ5W*IeITWJ&0>KZmg3Y47MJB!AQQcwSU zqB{7*r1*e7uno(->O=Zhe5#IRk&%&qcF6t6_WG8Rl7jC|Z#`3M_V#V*$z?0W4~hp@ z?gMi(#(goJEWxo^k1445s6nA${W$vfuR8a`0?cNW8z`*5T73;6;%;ke`%2w|M_kC( z*w{$U$q1B_y=n37?D5G?6&hV#9rhBo_(3=r7$mE#MVRudT1+Kmb=HFONy_%a8pYAt634Bse&DOgJPYWEg=7 zb|LdlQ|yPTyh)`sAq>=%EubIzHZbV`dQh z?VJD6{Z(6CZ>@Rs6=p!x>(zMYy*lzY^W#TL$KMi(Q9Eh%2E4TJ)yYTfukrEpU!(w^ zVmE{2h_Abc+X;vx&8zvnl$57Jux;K!cEH6v!9hxf`x6rrTT@SoE#7hzfAk#*>A;Z> zFCG6r2x4S6Q}|ze-ru06>9_JrvEnqpXW5UCCg^T>K&{>A_eeLZ?BB|~o5&|9f_(i+ zy^^XH|JYyO6d7zf5P0bMp1XGq(d7{tbdVtF=y8(M(9rNbpO|dd9=i+DC(uX_yZ86^ zXWjQ1hjDDkwnsMkZi#TOt$~=A(C}J_f{KaBdOO+!2>Vq!`F?(_AMT;IRR`yl6jxQb zeZ+O$JN1No5+PS&ygB)d9~6SsgfC=0qp>00XKNXN_tF-gTt^_}P^zMAH&*C{6>VWj z)qqaH6X&cXm58eCYxu~pl$MWDT1-pB0?zM}H3*+yDP(8Y^kR@3uW}mjb>*sSm zzKP*sr`?5C1Pnn9#OQiiPaqB-+8#^E$*FE-hvHw++d}WXOAPH&HaqK#pjlg6!=0iT zaGX9D`4^E#j~9eMSUTfEI{t|m>7PF*VA9ECC}0M&25v);-Z2;>WN7N_`vE|NgK)Uv zHDEb%Q&K(vw_F3|lgj7eBxTB9WzqfR>#z{N958 z9jS|3n!g-1rSD0>!2>Kb0<%B~{*Yx`9#DxOe(=ezYYDzwM|%0*3?U1|~-hsv5L&Du#v6C^ZJoN6tq956G?%`~7d(G@YEv zAj#pEqKAK1+$~p!eo$jo^CCfUe?zCk-_R-M(_hfZYS;B?nD|pWB)y;A!E2ebT!6O* zv?k(QChxqJei*v={nlzJ9|9d_xrGgx5}eYufUS571hfFqQA_@p^zN&0zJxV_lqC6s z8Tt0#3{C&wZ2n(q_5Txk2ax{}Q(+sU`Sj5wlDy^ngJAiCP**}`wCHPE;aux;U7rzP z;x55AL6{6@%>YUf<6)S^Xugxwfrv-BA&AkFGV@v2EvU`4%_fFKO+$l5ho|k8e?VU!33A(nAkW#d6Drst{#r+saxky;cI8E&;9t= zycrOG#C;gIdN|jQj7j=XD~Du5o%!aHmzl%5*oQkhGJzb{r2_m?IlzQsV=D?gKT}n> zgk&zO0~C;s>avaRFV}#_D^NNR6y1~MR)*^68joMUehnbX69;PQ_47>XnVc(|17V+e zPj?A-aNi$4ek2ljnrS9E+@d@i8p26?^KqmFArcZ2mVx>CTj=^!s1)yWZl8MAi;!pj zw*O%LU8j{w`zagEZ znJ6k+7e9X^mtmzi!nd-7-mm(HcGmeDBO;6Pd!x~o^o)&F2D+?)`rP9PLFcX`h63g< z&qquN9?B@2z&HH)NPM+)v$HEP$>;jA0-yp9QVt6$MFs*DJSSi{0_Dj{mq#Ef1%Q

      K`L}+<7S5mS-DF{+}9?p z7pzT6dYv@f*cn0XQMcK;1@6OYtk7U{qD&zb3aGjbL^e>s$(XJOy1Olc_aEiFSK|?$ zC?OfF7rYC$_phZDPUn&@$zS5MhbIt%7_@NeQHX8n_K!z&y5Y~U3u=*HCBAe6rlMgpP53I5MBgYb@dL^s;P}Kgr z%klq@pzxpG$<@Twe2-B;2W@(`03CwI5Xt?`KPX_uSiZDNLoA@zEHV|?-vGmuI!8svnqO$OD%L2A^HeT`PQ!(U1h8SOkAmxZdfY{uNxv-P`Z0s!q!`MzuT- z{=x5l{0F}qXpVZ5KI?2n-;0RcKwV}ZvTr9$FSd{llDg^tJ5xfEcYbw7 z#{t=)Uk?))>Q0z;NzB=Ynx`pQS(Tl%hwnL$yN7eucmlDa$gmA~6zrVsh4!Yu+%G6m zJ1J;%A`nrms!ajp&Oe=j>a=(q@<9BBHrVP>;oQ4_7nlt@0X)HljO1#j=48ajebZ7_ zF0!46ER{PEfV8s&s?qSd@R*oK=krGZP62R_KsyBHIWZsPq;ucUFUf=Gqo_Lg9icaRg6J_L|gn`rqVe^<|90q!kep>bAR0Y{~ZHvTMQu)ommN({}_L zU-eJkIs{-ZY|YOkwhJCF@&bWJ5rf2ND*^cK&UiqfD~5!`f%gC9v>WIh$ox=ldpU7v zef{3B8uJ=k9-Xc0 zxYX2%G-Nd)NJa>=4zJE{j#Lv7*tf2Ftilw{t&yLW_DWg#z4MDDO2=v}EH`H+6`dei zyDFU^_oM4Rd_K85D|PvyTTOoGWu>K8Oy@O3<>i8=x>q6c--ngQ^t08CUcYAXII_gV3^{zU;pF5fDm z3TpSd087OI=mCzKqkifSY1*HK*&&9N@EnKkfAVoQ&7~yC@`sM%6p|0o119(iyNV0AdXe4r`WMjxV%+ex;8= z6ATNFifYZLi|AC#*8v%!5G;NUssqG$2}ZN4!ogIr(PzN3mL%W7iUzx|5>Nb)6~S&Z zBjCKncuRla^{SYJL?VwJ#FCtV=+ouJ1*lBVT+cJA0vO>Ro=2#iW#nISee$FWOGN+xUFO2BC4 z)-w9zUtR3?FJp;tP`@@pqM({r`;eY)EF*)ay}G?!kevJ_;j50aGONv2?Wa$l8XF~i z&c7JM{PqjJ?d0lg3n2pHl42s?+WJCVY?P+Yk}>D_HB-Tr86jyH5dBX*uYilf%F1eT z%PG_AIT@f><9OCw)zn759!Gl?ZG3+J@%{}HDk(`bC4(I(=8FwvHNdM6KY((dHSF#M z?jxQZp63G6o0W5H%i`m*jO&Lq3~A~VHYOdYN{_%-dCq9BY88< z`JTQCMCM)J7t_+x_LuwikB`Z?t%)hV1CumUbWO06fz2ygJm?A~`(L!OnW-r@1h@=A z@jo0{(OUQcXryPH+i9~FU09z#2LY82+POHMwRC>8*?nd9=FMK^PEj0G39nTG#Ao0% zGut=|3klIJx6}kKf^Z7aiIQpUy1j>dR^7cfM;<5>fd~YACT2}}cZan>(MQOr^J`&Y zZ)V|m45vs#PI)MAvO??9?R*cgDgQ}FBVxo2m#hYx73Jm2%FC~gfA~a4M&bee?OP-P zAz?{3VB3MTA&;0ZAv^8u>{OP(pb(pql|xY`5OP1rJf^Qhr4S$uGl-d(&>{^}*U`zX z5BMn&qu!1z*sCP>h8 zsR4LY@9h(+s;PBlzkPKrB_kuFAg!h=e<}W6ifV6XXKbhQewOO<=Ng-Hyc?=k4s0CO|6!L!mKiW7BV^G2-(lW)zD5D!nBx1!o(4 zW`8yn4{sL+26lp9oSl<1UI7_z0?Y(p@0{I$To2F%XxRXZ2+Hr09~KsNwx@=evG z@|$`ofm;9-6!;t1Wj9+U_uPlJ**!gY#8m)HANiR3fJ~@|zL0@CU;Nu2 zAOAb+^nLHARgB)!=zxyI?C$R05O8q1{hI*(bH-oiPskEpJuCpQhM)M^jSUayUE;sl z@XTPQqM$@y{g(&NI~EGsNnZo`7m)V#w(>S)Ho!F!h6Vj&1M%sE0>knRxn|nc1#BUp z3F}~B05#f|c~^ID@7!P|93Rb3UdJbJ8wdPY&Z_(Gj-~%@Od>?{;|;UVWyk}jx+R{U zc8HiFm#ry-(OlXBSD)SUKPHU?KDREgl0l2p&b=;OL9a6o1`bPL=JDV^pG$hp6}+wu zd~#m?`G8D?=GsWW|El|i1SzM7h7KYM6@l;HG{_(Zn8*HM8lS0+)pa;rAAVEB1A2yl zA4*ORqXs!BJ+cPvzfBpd5_bU#0BvUd-Sm{Al!x>@VRpuZ1WZ~yE`2&iRogH1gHov7 z<)<2agnwfJV6k&vuqv-8p0YUwwnb2!{cpp?(3su$)E6l#9;c*zFm2$5 z&Rp784fqEKv_aK&`}Zf|%A_ejL?wS4DH>(h-3@Pm01!nD9?4_MXQ@_S$6tb$IeE^S zq-r^M0_F7lUtWNNm?A?^3+;h@wz9IaJzkg5*To_4;qDG-3D7;)^|ly+Ky(Z1e&eJ9 zZ9xiz?-C#J0gewoGU9za?E);$yapG(SLv6qC8--a&y|30_!>QFU|`_G#fSN$W|RIn z;768FR)t3W4+Gd)V2RDP(1!vsq|*DLKz(J07`!zdTG;)}HF3k~Erd~C+aE@QrUFTE zNluF#u&AYoSMBwTnWi8VE6TujP6SM7R&I26ddHh~oWMH+a8b!ven1tD zMn=67?r;Exk<~?DU(kx-Hx+)zg#3R59iklpbRaz+yMYcxO8Y2KtbrUCX5cpfMu|hm zD}LA|%Vc+V&OIUk;S#Q{9HT86umZX_PukYaIKu|ahAmXVx%0qOLExcKQr&WCgILjQ z;NOF;yBG~>Y^v=8ksOfLpv|YvuA>D04R|Vox|d!Km0Y`o3>ZA&Ii#ed9G}`fI@+=h z5qJ95W?r}qfB+#Nrqj|6UB+iopiDR9@tuk@1kbNeu!fi8? zz-H71{7_bwmc~6XU%q~QdeUCyutF^t!vae3!Bk28de2x!D&Jh~iar3DfBY~2X1ovn z9OVis z1%7yt*Zlq4qCFZoSXfpuIKu$GMkiqk*hdUUJmE2&14`D}(S|I_>2bsL=EeqK5oAzK z=L5)`x5vG923|Ng?0;SO3LIwj?-Wt~H|)@YUUJ`Dn$=bZ1o5B>ro(B9jq$fx3($b8~q_c{3Cw%1E$HrU%qOqJp;qF0ypqb%XtpL2Zj!^=s=1}jT?UB^XYJB$MpXK zpJ0}wYgd}>r(3~n7WYr}w=REzIR(oGqZyFN4Yq!e$nHtPELLC1GZLf7mO6vTl9BOC{QbK03HU9mKcNh`1kA? zd!OrUKkP57jcmCzm-Q47Xgv0YK+Eqa=%YHL&#_5rdjb^l3lMu1Wo5yWB-}v5Zge!^ zB-5sF`aZDEm#g&}%4OsoY>e9M%>6*nJ9z5Uf^`ptl2Ek#o8WHn^5swTso1_o9EI1_o@xCUoFDGanXJ_|m;IJC&VxnJ4mQ8*Cb$qi3P$em!? zOl34D6@->^I!z3LZgEiDNr;QfL;0c@Ep0;`IOF)E-Qd9T1PsN2xHR6ot%QirE6cs{ zk3>^U8YID z+msl++p>kz#`X;o0m~<+`Z>%EE85k_P zB29iA0}}B5y?dZV7l_)k@myB!=bI+mcY#exn1KNlAb^PH77*|pOcA$qb9b-ai=Yh2 zgKM~<`?E(~e^vQP*rTtcsY#df_0=UM9UUEL6Ip|L{-?XCWV8y%^T1#p&ux>Ro&B7N zX{N}l{lE-PWD$KIsQ-WLO+hAufQkfrOrt?}!iv1g$$}JUM(P?3I+sT4r6!|lz`k{A zdl~@3ieW;#24?Q0KA0;aE=!FX=R9Cy^5FL{suFwp5X~2e7CpT^8H(|VUj`d@e*9^j zjkk}!VKcxY1XGCxx;Q}V>%)f+E!{LUG(dyFY`vGh$0jGxmW)o*<>N6hF##+GD-rnU zbjV;PHo~9{nxBU!Q$M3Z!N0-fM4ER2@PKD zN9LMkz1T!1G$xY<<=*rcL#48JNHX>6KxMniHqr{*hK!7PMwqJYK!O9t6_5k2f%Pt@ zT((A6ugtyI#aq{gX}@pztZW0UchC1-K0r3xL0mJ|KSe=9djdwFTgU~@0J;eT&$Cka zBtjqYn*IFFZqf%HL6Q0c6ZEYi?DhFQM>H(&l<65d^~JU8EDs2P>}7Ty#*i5l7DguM z?&#_1>GDK=)zaO#m(uYa2bY}f(t4CN%ZGPylB*&s{D(_Y1VaK4WZU&ru%QNG@afeY zr}-PqhqDU@SU3pG!CV>fgxVv1Hjqf8tgRn6Y;dXdXSuyP5&ZLjiT@8^Wz^7l7q|w# zb#(Vz?AoB*`gdmyXraClcdK)mE-3ZpzwS5-y#ZFj1Xd(LR!1=SKv&6-gZ{i?4FG*i zcG2oUPCy1tkwu09g=V0X1kX(v$_gss_z{@*Q4Ifw|TVtL=p6Na~pySg7X7~YW% z!GQn+P%yUr`Y*cnFQJC*!F3KRSRSYQe>c1jb+|c)t1VUEV)abD#QvdwJax`47%zn>Q`K3>HYn;}Q~28^=Ib*t4IL zi9TWDntJXZ;R!HgwZM?|ZSvjmo>**4Z!S$dS3Gth`%vlN1p0@ElAzsZ^#u*_gr(nu z61A^v<$cZ<|2@MqW{#5mnkRQY?LW>Sz`K7onh_~YTY0vz=avYHh)QO%JWnsv7R@Af z#Vpl-adNpgmdAK8CrFK7?76{C71yyKq0jyrns;ftn<&=gnj4agEr)D}H+=kjUv{5z zY@XRVQBl~H)Q6hZLEgTRtSKMz2%1d{27}P?@xjLz=TGw8bC?<^sz^+O9u63 z0}<69)qg(X&r6p(D)&2T z6E=n~!)&dUvoG+Fp}9F`_|x5kYO+w(edlQ2pP^e!G7K0tT04@cbl1}tT@QZcR(0y8 z<)~`9j$$>Y?y&2}_RO|(>QAC;Xb;>^&uqdj%92$Hqu&*{#9i&S9)()-0DK}q^IW}J z;r~!_EXwZCrRAIVSXlRuGRoG|vXWk7H0Lx`RsXF8+zJ!{211)KV7AXCP; zBdx54zGl9vBXUP%kkyIpCjJM5p2W0`tkuM29FNF2o>V6f5wRyq{!Qsu`cvh1ETK_U!xj@6gUnE5u$-NNBJ*tl)Cmb3F2@MD+dp ztE9}BqL>AAh^w6)_n|`$5SRg&zk@?5^%Dig5$Fe&*Zj^4v8!8E%tv_eo<4}~<}RP; zCv6{<#Kl)X8q(PymxgY~j;iWvlXqsq><_<&=|lMk7*;)S%?@s%O_T8$k0blJxL%@C zVzvg`+fRZTzHd}dSFeOX{XxY7OYjEh#$$FSa^IY-R#O*fRo1lml*8G0*KZDS!|+~M z@WB_li3BOD!L^3jv0f=am)$NvGQ>O6LJ=9Uf~+iI5#@0xjuMRw^t+sg$}J?g7QDzo zKrFws54#aY++$H-(*S@cBmd3VtIi~$W5@WEJZik&zni+=2f2j8feAbm-;#KDtksn} zgJd7X=iWlQZ<6CA(w*$h7NgukuuDCOQCISw=HVBTmUdf79SC^@BP;7K1sgj%=AFTz z%-k*y1|e-o8K)}{yV^Q0wLyqH967{Q;aRUAt5XE068wvV(%H-LC@fNm0}-9g3rOgU zzg14Xe?AUp(g&wBrMm%1n#}^E4p_xu4zc7Qz$7z0Na#b|jcj6>*4Ec=QE{!{IB-CR zvA5)gH3qX0wAcBQ=ihg_Y!PP=;v!RXvii ziHU-o+#MeucYYF?jCbyn&%gTiR!U4G6AU`jWO~N!?2QYI4N{*KWM#!ACC3?{FMNggIXLVZ!7UQmyNF#IZouZ0#glQfaBEU?-Rd{9goeC?9Ytf za`(+jm-2n)X?ct|NEJm}|w1FE2c}fuN zL?i->axqaRbnhi&;~I;?Ho2DiecN=`z`(#B>dHu17_bqQ)Og)L!GBiis-fXr%7ACc-gJY{1x`q0I1u;evxqSU>mRs3rdpC6=A(l1 z1BMGrOShHU1cJrUz0VR8UmYoYYf;$M)HGRG()v^o9L(tp2;kx%273+spVD+`i-S!e9yqemw$t~w2Roa zeild=LwCc8+M+a0XrFg7Ft}`?9iec5!v$I{e8bAh$`DYGj*f4P#Rjk?7|os?i2L9d z2IVN(D7&w(Zx65X3sfjw}8} z5h@+MrMG{Du^#@IjluZ%-ckuVBx7S*BQum(4ze3?vvpo>{JI=Eqcm}Qo;7W5D;{t7 zxv}~1wA?ibu7_Gs=7iWE)ClBXl>inBYefJvV_|ssu8T9YK8Lp14|%_5KUbeN7=g>= zVv3^s+80!@_q9UbsFMNX(ozboU@`p_OgiUkywRa9!dHP}a{wQ~($>k$(uefW5pRcm zfav~W0z1oGkiUk$8p7^*Cpzlr24eY>pC&h)dD_&K4Wtg2E-)wWhpd5SY%_YJZsxqY zM@CFcOkTuGV=1&ECUW})|64zcUe(Qik2VaP%gSFtY3P-+2S7L-NGks$T<*X8XK5$< zy@eL$^vqx%!@Sp}U)%!TaL~B<{w?|7FDB)`)SUmE9)5q=@7ds=YR>-FP?Y)KCH6~_Px-b%~K>4O>A@b^14z!($m|Uh#_24>REH8 z{Y100wShJs@?-&BO?gg0F4G^EWBU^Rbyoj*LI2Hj{XeeN>Q=rggyiX-q#+$gzkdD3 zh2qO$#6qJ;*zxZ-``>Pz?HlR$Keesj`)k*rd=ll?`8m~kn&%a5l`A}SH2T};=Wly2 z<|LcsLAS_IC83Lz-yfRkRzn-u*>|svKLobLncYcBp0+>RjX9&MHvC8YRS2q#y!dNs z(i3d3E9qXRID)aUfX>swK#^%z2%DEC><5ba;p>Ot?1(52nnQVB z?N`WIfjKPM+#Q$U>ZOU-oD5!1+nLHV)913hQ6U5&Xv<-oc?Ds%ig`#lPyr&~PFmMF^^~OR zb-k=c)>@4KCe%sD4i62@dhxIo=bIi=`g$ca|nrIEcJ}i3`^13rY!JGYJtZmE&=p&6Or-L!o$-;w$;`a+gchhwO;2v?lLJ8?u;#~u=Yy{xST8w+4rId(C{Z!FG)<^3%5B|w)mG_kc6(4E!NYUjjy zD@mye5}rRlddrHvu>c6i{FC`0vH);PSXI#f%hTh;71k}zTq>Ib5tszj;Mhk1?f`3d z7X+%S5JCeXSA?Rr*3)kNT6poC6nd|+$CcbC>P+}xRPXN5W1`fM<~^fb)Y;1FC&%;y zKF(PiaTsyrH$?0g*T*W?4uqNqmF3$uAIjHpvUXmm+{Fh=2*PAfWJMM8JTr(6K=q`3 zTD_{bS83`F=rxOC8co;s_VEMOmVFT$UpT*DIvZN2FTOg4QzYm&f=zhwj?x}998yP{eWtxkvZC$}6V2NP!UxuF1;k8y{ z$$Vu~vVxS7l22tYJ>+EWVPze=#gOV=49yW!C_*fb*wd3k=rA=gK{6U%`8hoN>9T{1 zOF3Z7@OaeM*O!%)z;%q`Q@89aPfx2_8q(A=ha9=8s$i69xfUA_pO$E9 zk2`hHUr9XgRc=FL^Dhr>gigoci}>&ptQ}!=8+&%r(;r+Ve*?EBo2eZIKsb(d6X5}w2p@eGfJA3d&9`sQ01t674)^ArmQj?& z_z6YD)vkBufUbx6(GNguCcLSzaBY3P9kJ+^ir3^bh+mmN+`M@cQW4V9tnBS`%E~an zEj1QE^9@)~8nD+ei^cG&z{HS^`h8X6Pl$E5`8c*0$*?h`g>}e@+}ES8xw# zGi4cw!ZIqib=%Tq@VvrJkxn{neDqyHW0(BNH_GwXsZ(5)^r=@>37jZrKU$2#P+yDRo literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_cyl_grid_irregular.png b/doc/_static/gui_make_cyl_grid_irregular.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc3025b2a7c68e9219e8ccb0cbb1d30fb104583 GIT binary patch literal 18734 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_cylinders.png b/doc/_static/gui_make_cylinders.png new file mode 100644 index 0000000000000000000000000000000000000000..3c573e6a1d077e3f9f0b161171b2c5e27419a43a GIT binary patch literal 7522 zcma)hcRZXy*Y+(WT8IcCN^Dpyh$ss)6xo}dFC>;Zz zqRQLctW`GI=!qib9P*qLt>7Lu^?>$eAQ1 zmq3O}jxR7Uu#~_L(r3y`MWjL4)b#Bd0FasbL*98j8I++S0{n94Jaf*7cJ+8dKdwMX z{@l3Y|1n5RRYe7$top3T_>NLloygC)B}Pcl%B)0BXSz>qdz4QbfV_il9E_1l$rHM( zemB`IG|PLfE$6>N&*1c`sC0i%X!A$mGt;c!ZQ-2r^Y|Ap?xzZI5`6q((@E^t9?573 z?||YctT6qQ3KZ*U8UF-J~6zny8n{|OCPNW{VF0T_#!Ef*eToO~U>?fY$^tSwwpa=Nzsd35@5P^kpLia)Y2_CCp5RPa9B^s6P5+cy7e_cLj%vi5U3KW!`s*ITkB>|0GzEOBni04$@zGAW}2I8yA!+3h@N40JZ5S$ ztL$E09*mV|%2K#)&^L|iS6b~TupAV8y2;L&$cK(c)Kf&p-mv;raGlP} zhhgC^UV{>VpM7IxjYs9L@v>l*U+U7~INXr9*O82him@!Axot7edIVV>8JQK39~I@V zq4DMIThP$t3=H3&C0sw-ZNG{8!EMusQ?9bY* z730}}nrnW|%};As{|Keo%^U$c__<1_!T|46C+%VeLEG0Qtzjj{$H@fW=39Kfeo#1k zw9|ipGk<(}I>+SZ7VEs+HZ{d4uquSyzvB1tBcp(TZ%*!^xPwte#hqsfI#<5+roN=0 z_@!4>z{FhFfKNv?`WTRrr3+ls{#?&Y8_!-G-)%1G$)T*`^=7#*c6$0X1^|xxb$Fb~ zfZGo$08r)nDV}b8k^yOUTHlNMvENV6xY3EsA`fUT7j^H-nU#6zRr72q?jlxiY(n4_Zt5G zbea$~clUtgNm7x}})zw8n%cauK zy;yK{rp}GPZ+e;&7&$-vfumTP&}0N=edqMQ9Nv{Yx_Y&L>ic{RzyO+>hAu7vp@&r;UmQy^*C4x* zrsb=-Hx*U+ydB*>vNOt40|hP(5XE6h=Ab$;)kE*!crymn@r9}*|_ zvh2uJ&C=Ib;ZR-UJ01CA>xRu@cH5vopY=rcr-#_shV$_qgukcc^333WaKR;ZJeZ|$ z;Og22JlABiIl1<^`P1f9`Dh7CrFmFZSXfAK@Ew3jECyjs3WWgffUBd&FP948MDK>Gth1 zK7m;nf=X^e9>?_9ZuWUuJ%fN(AUc9=X6_ydhWiKF{h*Ah= zPyGFA9T#?4e9tH#xm@E_{GP{u=7lMOZ!C8tco?e{oxO%Nv;w70i?l-J4`MkEyzvIZ z;fz8ecIX(XO4M-i+iUa9K_bJs2e-o5#l+OV*c|UI)|!RODtECF2fL}LRt7y?>x#z> z3{-GXXfBStrFd-lnwrW;(mDYS4>Fqi(o@nHzxtYD!TtPZjB^Yhnypn*q2Cp5Np-$-B}M_xYU zd;K?(B5MO6o676khP#NUxVYaEqwZ_OnzyK_lj441f62TG__eSwGc&W?m)5RxVT>3S^e4gxQ;fR_EhE< z)3o+BruXwaCc81MX{OdpGO*N@Qp8U8F5>L$j6*dAEpTk&;_@i9mtz77*U)tgf`l9UVzx z&P$V(*2z7_Jk9Bnp01D1*TPdD7ZenT*w6Cv>AZTC;3#f7S%FenGHs8Hh9)OwBqnB9 z%(h5)nIH9~iSLpBiRI_0tFA4Lr(&Xh51Nv>yk2nAt^g+M;o+gA6q1*hm!6*9`XuZY zr<$U=3?(Hg^2-}5YwOFSg~;{CpM^9-;QnDtJ?UAK8R zCnqOIM@ReCt1uW0prWTgI$q8Q4hj;uN_d+n3c9-2&=1b}w~bSczDR0XMuz>P4rTR! z1x`pm6A~KQd=CRD30*@xK{g_fvlJq0Yik7gjSz@A@Vg*ZHYU5QOdvK7houHoR5R8S zlarIz7?fg0#>R*N%EXpMCl?o&=$Ta4^Oa`vu=%5$wn5@P=X;7#KvEz+f#F zs~B=A*7R(?(%+vzDF(z2V-jjKmRgFlUU>0jZX4msSIxK#>)@bRf;TI)4TVLUrY zu#TRvEB-%yFHc#NV)A?>R~^G!;M(m^29hbuOC#8_FeMHM#L=N&ilyhZJ%MPr~>ulVcm8Xhj4chhBU z-b&D=waKG&k&-|5JX=^bd&d&xr0LmOBf*?%jKeI8v%UTHV{H`JFN9AzU~PKtTbtd)XZR$RTmoO<)aky ze(UGa6HqGh7GA1D6lN9;4T~d$6U)rL8SL!tc6M|2)!8ro`0?9Rx88vmEiR|c{XLJ@ z^YI8F<`_6mNu(25J^@t{RM^T~fxKG^RRbXajo#mUKV?$(=I1wmXAnd;q;=sJKIbQu z&mCXO=<4b!I&}1=K3-p2ONqaafm8M8!JwTS6HFqhy-Nf>M6IQ(H)}|JD5>8eBm|nP`|CY1)U>3XC>Ke~}I}QO}-uIAqy5-2u;_{@hN7iFD z)1}efi*|Em-Xr-Mz;j*Q8nfM)iV9&(&EftfACBU}h6X8CiC-h1G-=@Or*BF?w$r{K zATMGwUh2NL)Np>%*4B1$I(OOE-R)VqNUJ31%=93!d(laZi4qK%me`e%kr6W_(!4MOH`SK-^4E>!uojIvVNur{n56PS^&fMA9vNC0Z?+a0vLj0gg8F+6e zoHOw8%a_BAZ42!pou=iz@bGX#Lc*Nk4(#S~UxVDuGb7p+>ZNCdBOReSS~&?FUfDs^+bF z4l{FeFh$NdKQFqZxlEW6-myp*U{0DlEMIR@$fuTReEWeSyrY2r4gX(saYbypzjVky1LGu z4$lS<-l zCQSTVX)d|N#Kg$L@SDS9EiJNKG>4nRRrVPTN+>Un_yiWV4KqE7( zcug)=fB_KCK5`CJoRP6%|{{v+YN$B&@`CdLZ0zBVqPrVRZa$ zGJYV_vuZ|F+?th@q0%=5+52BE_+P^J52{j#?()1xUw>2dFtksP>@Lsry`N>xTrhin zPy&)fwBHKY2FGM^?C2O1t@dC8+R4~RhDal6uld=tHi~&3+BiBoCO$Bbkd$O=3^Akp z@EijBJGR~tn}up8E1$4oW==DxbJeB5d7SL8jv;)RtGOI5{m(<;#F4b}QIFNo!aF+i zAmij{^!IOS4kFJxQb+l?2Z7J&V7v!Q@hx)r6J*B7$VmI|+3#ShzuU<&#ND<|w;K^( zJsuqjW6&|l5gaT$UZDP{pHbeYcnaLzK*?}OnptjESvy&KYwJ}$ib>Ed0Re=rLVtZu z5H9iR&35|Nd7c(i%GUA7igqdas6GxD!(v`G8E^7oE`o|(dmZj`+&%?Ek$%!L)vE}7FHJgpot zz@heGyoT`i+FHR5o^a3+&4g;%X~3)~LSw3gTvtS45$JD!$N;WT4{_Omh^z&0FHp*$ znV5aa<%l__{`UV=A)dnzfCJ&g!4OzP1e+}zEQWGDq`qF_v33>q7dGM!hB}-cvv%XD zxY%sj*NIi;{_gI*H)9J;b2o$=`9~fPqZs1AUxQ@esxNK+=i01U-^qg6PnvninclAI zw5CNTy_xGS*D_VtKtecIk8+lmzXsR1O~|+8BQl137yh=NBd${QTyi{=;pGSxm%~StQb+W(w9xBId_qFyb844M3k$;>j>BH<{D=l7DymYCgEjBd z!)U1c=42(vCMoYqR1$^PBy>S}>L)3fvQg`t0Ib z@(Z;~1Xm+@?)IlV>h9|5>h0w_cv0|_Ze)(m_8!buLDPCDj+W;Y7`yZp8=^e8E3sG; z&Hdb5_ya_(*AiZ6ng2t7Z7N8&zKGboJQedfJ94z=-zGJ@6%!i^>PtC*8^eZ^LK<$x z#>N&F7IKGDlLaY-D8+K94n1iH1>4g#LbJ~Gp#)Ua)Xl6qDD5G&OV<-HL(!|U&EYBl zeJ;rAv_4v#>?Wvw={h+$sBtj((``Pi{ za)yL^40p4c(Sw8s23-q(uJ2RaexRR}lr;W|!dkk$BnQF6$LHeawmnmb_ah*r{&h?1 z2n#cKs#MG1R#{ag?eZrsFh*b0w`pKt0KC_^1~YuA3#STfNcR~g_(osi{@VFs`WTFg zcM~lvjgDIB5D%m8=|WR``}(^}ia-4r9r{9Vlxgz+{S(Sy;VYO5G&|QXpP%A$jIUEt zE;&_SJGn+cK%i={64fy9G2AQ^s~DrAuAZ1nLqnsIE|HAQ9~ycQimm_pHKRlgmC|a` zxhfz-#lgX$qKw~~VUhNko}Dr(vA;apT`+BXKR7gm<+5rHBn6|w5ty6BA7fb!Ch4W6 z8`%^hR6u$nB{e%XR+YxOlY#_^2P)-rQIYV&htI2rkB@dufhZ4<>UX^gC@A;W{BL-L)Z0D)z=1^bi(EQBW~ULPoG(S zG%r@NBsE3MJ;{LMe56n7z--Xw>kupT>!-tL4aewDpSS@UTDm)oj8%BP&9RC(E=vjT z6JfYUUtb>pp&_%jwl3c?cdXG5YT(+_5V70Z+M4s)Q*~843?iq)U;-w&uaux(=_!E6 z;-pHbQ8f+ravm6XJYd1(wT05q0Q0zH<+OH~c%;ki5IJIBDS9TRzuUU2?JWb7w(pIC zg59926WSC2O(KnuQ_J*af>3_4cV@$4d|(Vfp=x15t&IHvw{G^lC30rbGR&#Y9+zEI z!Mo{{qJI+@uQj*!Ht>FF{v%>j9Q4a0FL#&24c*&ev@9$vbbm`?RMbPSBM0PGK@VNd zDnI7iyhB?gOCv9OBI=&3N^P>`My((h*GgUQ+_}fvn7mAu4z$62VJUQxCp*H@Wzfmd zaRS6T@EPXt#T(LRKNl9*GNCz<%3wxA!a&4}XDC^3NQ{BFRqG&b>2b7(09D^x|@g^lM^T=2bq34h{}Fg4s(=O%3i2l$tcG zl|jm@x}>BeF;V;S;#~TCUz1`^QB6^CXKxQYpsDlZQfE6Yv7G84_WX0k13M`xDRA`c z>}*PXfRxGicPlF^)zzZlvcVfj`|;AI&Q7J#=y&hlff=`(n;QawU}Q`M?V$I5@Ys%s5q-yop{GqJQs)(MG;iOmg~z6fC+ zZX(s;NM#moPuQl@>uss8;%9_3K|w*oQb`Fud|xHs^PiY#49_uHNw>!z4?Sf85$cTd zG~@XEJ;-=d7ps?cQX;I?ZZycu$5S)Yo+G{R1+r2p)1T|&Rl}OV literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_line_symmetry.png b/doc/_static/gui_make_line_symmetry.png new file mode 100644 index 0000000000000000000000000000000000000000..614d75f4ac0010103fc20d94c736c4fcebd07550 GIT binary patch literal 10387 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 G>;C~Qum)HF literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_pipes.png b/doc/_static/gui_make_pipes.png new file mode 100644 index 0000000000000000000000000000000000000000..ea23eae07a9ecb3e26141113ca5b8075d0c63d7c GIT binary patch literal 7063 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 GhyDjdj?c0H literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_plan_symmetry.png b/doc/_static/gui_make_plan_symmetry.png new file mode 100644 index 0000000000000000000000000000000000000000..a45eeae420fb500967388d7118fb0f0a587c76ca GIT binary patch literal 10439 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

      @zj)+4 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_point_symmetry.png b/doc/_static/gui_make_point_symmetry.png new file mode 100644 index 0000000000000000000000000000000000000000..2082e7ccd2f34cdd1375fad123cd70118fef9576 GIT binary patch literal 10023 zcmbW71yq#X+V=-gK}teWI;2BVS_hDll#mt`Dd}#|0R#mE35lUQ1*sv1kd*Eky1To+ z?K#gm-}9aCeb>9zd#{-_bI-bC-+S-tfBmlio?tZR!vYL)RJ{bf;2T_oDs_8bdHRb-2 zc(m!xE`MA{S^+z@rUjQ$BMFJY6PcV4^bj#iYo&6n#)@?kgYD?gr0PaAH#_Pr`8#Yyuckbih~O|JYR#*dT!_l4*FX>&*1QX;>*h$EC-F;|la z0x878#(s@Of1f100s`T}!ezpxhY^rkqd_M8`_LdzEOquaq^5g_=oCzgKoqh|ma93@ z9+{Pu1>3ZpV8^01ys+T+C*ZT29WN`>D7#}GXTa?nH~)T6JC{N(z8&2?=G) zd)I}T4l9{qa&;O?F&T41n1)!?(Duu-1FQREC2xZC;z+Tng)56-U)>M5;UX{ExgH5D zzPRtXlN1{reZ4zZ&+?Fz5W0=pEBnbmd!4U&P6X91s=Z#z9-$WPQ;N+BmO0chK1ydT zb+VY~m6D=^31s2YH_yyi_A@-NvbxGvHSO;g>5MV-JlD+9gA+I$t+PV0WT`c|3@SD! zSdw2(jIHuNj|%*#S$slfd?+MHLL-$VY|8M*5=w70<68p?k$|9RSRIU}cn>b{e8 zBRU7@Pr0x~uYCneQ|8IUf_?EC+9Oa@3v5Jx&{VEjhMF9Gm<%tiuP}k zQ&Lq|9|Z#%@qTt#!pF3vZub&6vy_vGAfu3IN7M22!6(zw+werz{& z82(5Ay_!03PbMqQD~^ngmIV-BNW^HJpCda~I9OD?J`$Ar-q5bw`jK!HbtT3OGDg(ZAh%c|gXK>7f6z{(3o*Id}a6?=E6_ z#nq(s3oHu*}vUi1(_r#*|! zvQ^6R#`c$VB(EPoqN9r=m|q>EuzesNPa(>Oc>XZdwcpc%Fv@Q}s8RzY=>8 zj_!HPcr;AeIr5h8MjE@G=Xi8i&&uk3liB!DQ;G%(CcnzT za$UO7Sc9MO#@GAK+-uWyjP#2=a3bi~;UN)-WkN?s6NQe0;OwXc!`Zq{U* zLeEkqyJtL6??6&;#mQy{p{yRoZVx^Uty;5-`t0o=N%$h^=;?*&=}+ccKAgI#O8;81 zjr6?{`_m(EO7XsC~( zVx!m&IRO+KJIOaOv#7jXTGp<;C=#K6J0ls~N;|6Tjx_C5E^!;H zuPAzf)JjgvmmwLIv!O1?b~+>3bKXXYy_fxl*Ao^21tjq z9n+UbH=?)>YN7U;WV-id?X8BB zVz13j@{r^4Qtg#WaSs)&40m zo^Ab6pCvr%MdNVHdr7!7UaQ&3e4Lzz%e|Ew({&4~Ql_{R4yV0R$vL*}TN50Na`6=8 zyNry?si_?xZ10tZE$kg!a7kQs_@Nn6Q9b|g@tc;EI^~O8=MC=Sm-ZzYGV3d5j70tV z6{yq2Z!;ScWcqJ@y3O`yU`BMjrIbXE&2_g&N*J&5wm%iz^LlhP-?I2Q4`CMc6kkv~ zHA<0L)_b&_j!JasaK2@2rDv(Snx=oe%;x$jdvr1(^bY=)=Smz+s#4}GQNMe8j329F zQOxnB^`NixB)^b2Io{{yx>77xd}Eh?>(0Bn=25!qy>Nd?$r#vIYB8JDO?jm3Jq>>x zQgdTRQ3nxvrt9amfjU+O9OVt8bOK{P8jr^L$43fBkGJbGe-@6UVRkS$rFeI*)m|2p zRW{f%Sv^tTaIPQLTck4%jz=%6vUrhQ_x^)`35ku$$^!vmi22i3uLv_W*$?&)`bZ%u zx971Q-7ADZCSZVuVE7O^CkO;^kRRB4vI>DfG5_pAu&DpBCqO-Tsr-qtxzIbx|Ed2f zJ2;`EtLsZ}Se$^nh81n*W9SzYn)y!Zw{PEwiK+P=N4jG5I5;@00(ZVFMlHtbSuGdD zwNv{Y(}+e~FdE8LWQ=v-M9{?+*wV8W~-$B>RTQFhs~ZZKFhpiHV_~a%iBbU(;CCzj5vw zrv#iaLi$?z=3dLP5)eVNl#^Wqj#*=I`sLERy}h+kiAhM7wwG;YW_&>FE-$@?*-`n~ zs>w7*+c}AwR1xwSYOGDanu72t)>miAiKsM;dAW>A$q^WRD$+qFG{oizJ!J{ z!^AxfStTT<-V|V-u>ay6(H^m{Z_YH!(AU*1#5XR~3o!ZaeQ|6(_G7MZPP)RS0{7Rg zVr*_69#s_uq}S5^LR+}74XS;Jk(ZSKfw8-8`AVe?)m7W5e7M^GYhprFQt}$$ha|E0 zsTXoRld!1QHih48JMqMXe*)<{^=9eA*~<&z$Mw&xOYXpd+<5W-G)Z}O55D+(w=cJ3MVtZ#)mnda;Ea2 zscP>hE3Aj}v<&8fMB?BqIUpwGg}3X0s3~R# zma3l|0YIs9WfdI|5CDf8W-)!!f2pBS>d^Ar`{D%efzamp(Z-AH=S$jidv2a5TUWDJ z_r8cxgj4Vb61;x@{`ue`2s4ztT=|vgNzK}%@+mIP?C|iR2z9Qeo|a*Y#GkW#rVqBV zY=_BWVq<@DPL@cw0h%zpna)IpL`M&Y!Np>D^l4m0RoJ8Xa2J-ANJuHQU%q6GR-~2m zBERvhE#po=PQfHG%(GK}dQTqb<*{dKbhP-FmzN_D2u=3FJP#VtJ9qBT`d;oGt_`+% zd?_z0^`a5w(JrZ|n67m{C^hZ$xw&%9)ube%gz}fQk%yxlV@xL;O>c=+TCwyTTTk9a z5~1yeSj{4JmftNO)v<>W)Nd9u3d=2C%QNBoZ4ZiPGlmfed#eOpU@71j*J{i#dfcDY zY7^kUU1c0cu_98W6}~^z@j{*o0_!nGIIb_UeX)l;d64>12I3d{p`HrsU$OWnP*XAf z5vYF;TMN=4e|)`DGKiD*;7ytAAkoVHaHn3oAlK$?$okN1az)>|yquV>Uo%?6((p`C zp;34plK%@2#yzH$i_@T^K1a5q+j1&13OA-dr24O#Vd|6cu$J+J0y;s2fvWQCd+^igZ7C zxa_2tJ}Pi;NbnG!J|ivdwQgUjWZlKs_ym_>byUp@tTKh--1<>XpYyfs#;}itoQ18P z;l1aKO42&(YO8kr`IfgG9S@2OYx3e5>FJ+J_*sQNU374N|GXeH6p#LGMBkOIiz6V06|I~WeYJI1?p8M-e#g_|aZVASzfdM`yCK=G65qUWY z`zq#V&z?Eo`EgDTGu0K-uR(gBXJur4YMBSoV(fb+$i$Q(9fbez;X@^iSQ<&Ms$=9O z#-&C4G0hGh^kupJ(fa_Kp3u0ATOJ@y2BpnL`N zh*8vey?Nzer3>!3^gBA%BVCYUPyUlggWw1a_<~e$1 zwGe@?a|R^ZLFp}@F1#?s1b3h%1Baf8g(c|1*2TqT)W+}uN>Emvd`;lzs2-F3`t~5V zp?SPYT~vHhL=t$}3oodgQEsG?=BSy1BVoSg_G&q@>JVA`Z+ih1SYN!D9pE>Ztnm{NZGs zRpki#0N<~vXUj#)kJE?zbZR2p>B*HUG@uW_H5D40^$$NvU>5&ucP<$1PF8d(^%*fL*}>BON$Nl6JRGI2A} z$ffS}>({8Msg>>o7NX#!XsHA#+iS=LTGE2}Jz47Y$?W31@0KJ-0YPc_A|fJ)8pKSs zyVcCJw~C4i5Kh~v+7=RR*86iNbJ9V$&Q5l?ck$<5FBOvniG(^)yDzljMaUn{VbYdz ziZ%E&fXl{3c41)Re{rI=000B){8V={#gW%J&-~dqJlEcDl*{QmSs0ZhpZ$EZ!ncRa ziOQ^OY$oJ^@62ONZD*>z0Tv|tUdNeyH|>mZUK?0iE=(wqdjmGautlJ@wcJsnzHmLA z6c?BEa#tK08k%a7xPp>Wf`sSsM7b5BsWJaUXJ_ZP7m+;1h|ANxh0q7WdD@(;tnxK6 z%NrY=B$7_21j>Uz%a~pa)XAOneeK(ttTdbM6;H4man9g)5#EsU1a#)4fl*vSoE7)i z$jHcqgpIj56LWL(gD_<$r$b;)A!5PkBiNFFV$JwmYz-_aq15INWRrX0{5l8kFwoJ> zN)WC+mTPiTa8E&zBj(LxUYE3B86XW9aluF#~ zD-LyhR*lnIQ#2bl`$O3G1gYL);b}MN0~(8XAwE6^*zRpF|0l0ry=sss&dXzf-6tje zz2s0CVPjwd2xDQ-vVfH+I4?in>itMxpWW!TAxM>2cz9b=HLiAcKR%{^3{=Pmy@E0) zm^HOPj?-B5Wa~H}4A`S-LM8IlSkF&3RIzf4inzJB>U^%M)#w(n?U+NwD1e#r^JjNg z7Z&|JTFFJDr9C&!PHk=N{jGC$zGbV3 zii*-awoA#Y4&i7pA#Zig*cdhTy#l0kd3m{0f05)_?zqz9;o%|oCOjr4W_!9WK|cp+ z1Mj5>+}q#B#=+y@m(1U}yoN`FLMQ+=J(_4_Bj(G`CjhQ|SeyJ-_Uczml4*)7_au zI@TabKyG{29lx{$^kp_BU#G}syw-H}Ybuap5WVM?TRP>$W)~G(w~T`!=E_kTxkJ2; zCN}SkX7cB;><4|Q&kULnfNy2mWH$8lWwyg*<{@S4iD8eSC_t~<2k>V;d+Zz>pBaYq zC1%(;IZ+kXlUSpKAjx1(;sj&#O?-cclts*#0sd2Q>_|&XvqhdQD|8Se{iK>qn}J*8 z%;ls47Y}F#0@ulLv^QYYM*s-Xu)elwk^~YD@f9KXkD~1l8va$Z{lB32H%0!dzWZ}% z^_Qo_Lord`Vb9DtRC-j*Z^2YN-wq7J(pW>}_E>3-T+I_le!BI~|B}N`rzQ~HB9v7Z zrwPBPY$aaAhd{H-p+Rj6d*(FV>B&-=7Tm6Vk`OF7X=}Qhc!=DAdA!^xNC0jvP&tN( zsv3k;m(MBo7bkFZA8t17H415-R>WGTu+J} zfJZvp`p~%Wiv6`WOpO&)?QEr|H?iEEKoK|&Z106vZFh7G>TT+t(2Z4FZ+xYf&QeY2 zDJ>|E7Nlo-DD+TJ@Ti7sM#6o+xv$+02E4 z_t*r0gx#Z~u^d#+tRYzz3RyCdY>)W)ag0c6LA}^@5eFWOgKfKSZK(HQ z>>er6vv|RM7TdfmKF&O?vVzI!buBI-QP)Uv z^*6R#_<9Q+?H6xcT-?&qQea?UoySoV1!VW!z=-5ul7;e(Rx}O8A;!CH{$FUD1>X1_j7&JWM6_FZTK^`-~V{z`awDJ8I}g z%mWa9x?JbmQn;Awom;muGO}iwAa2Us#kjb*UJuV)N zbZN-n$;q(Z#rszvp7+He;C@L0_g9^+`gV69<`n<*Le@RUQC$YV@{9999fX5};|~TI z8wM(2x+&#cI8cFh`X(?Hv4BbJ%DX6S^3*|} zxr!zbKtfp5U>A~_&RkW<3!;qcnJD=3MC>kHsD4Joh6A@R3@XPRTX`jqSxIuoZ3((^ zv4d1qQkp#5funq-q0lJBrFcOr0TiJdz{Ur{HeQqaTQwA}!#lU%TUh9NMg!^XwNJuK z$3F&6C0+fip&WHFmu)*27n`|G4sh#Pt-J8xZx2IS=J)pH%^v>SHzH6g zNy3wql2UY|P8Wdn^z?LVYwN1I-?68A%TmD4p9hi5N}QaW@87@w#~D66uki9=Fxc4S zeD9*t1pPVd3F7%Qr}R z7_1n--hQDqf>Ew79U_WfNmBG@PH5Zd&y7OB7(=!;_rYrIKjqw%t3CgVL;vy?0qFmSxA^at z{<{JH)1g~9gRk!Xy`TUg+5a5k2V(Kh6aDRih32z^Ag(ix`>;WF%X!Qm_Sn2`**h3$ z$Mf&Jb4NBQp!;bg9mq-KT8uA3Dy-RFjG%DCRD;Y{C&thQa>9S`7T#lu&jGltty~ zmN1k;))Qru zl{VRiO2k;VlqGSkg`l4|IhdJE7Xm{qEG#%XCu-mD?|gIjzBn4*>zDCv%eta@-$Wz0 zDLZqgGk2>~R7d?tS!o7=Y`-VeTN9*jxiP)y8{ZA=20P zM$l^H@^m3wKsh@ri$>h-hibB<^;m*(QPr{M4-3x%TOQFdGCbdt5Un3vM>%zZ!;z)? zrAr(!larGtTa&`9tT}0=(7J{xPuD-Veid;6f_EZcr$QmDVun_N8MAa5>j{xZi#+p9ZXurrqD zgl4BZ-CZ%wiE6XT=1TNvo12|mZ?-zvhybc-?dcfDCUQuUto=_AB{`lEG!%DHs;p@!HJW;dw{wKBv1T zJgUX^Neewm68dUteXk7H4SJ}%ZYAFZipK>CFWrjj>hrPwH{TvA4>X3vMn$1&-5tNQ zk>jyEQBxxbpJz6FF6w-)X=%B>%$1-U!^O#odk<#@*o~nH!YXh{!S`dl-7A4E>_t~J z1-9V;+ZD*ZWj&88b=lIh=>V1_$ekJ*FBtC0JfjURG7Jz}`%H>OeLLSgB1j|kt**^#NuOg!kP3Q?nZBM$0^e9P8`h9_vouin4i+}Sa%!L}YC6BUT) zD&nuGxJLBy1aCeue7u8~S7dHwO&tm;OG!&)(`rW%@z#Jn< zcdV|DLFpmxb-D}ccTh>&psH3^SMNz({y`3$4NE`=Md1i~W1n zWmxEeV$@VuGMVRFhi3O!p}z3&wx!Nf;R~oIZ5&4wHnV!3t#YcS-J~#|(0qTbvCkE# zUX8u$^R(_O2597V^>hdc3$wu9uDo?!8^|n|8n9VD&d<=wR)N3P9cgI^AkZ*0G}P91 zx#+R>f1+k)xSpTxQG=+dDK@GTm0-N;isJ_sUxfyafa6b(a}NM%lGLsq6J-|8Nswo) z&kSxSj|zxQHaEj2b33ufVhOqV;x_B0ZiIPxdADP$&U^5F(~ncDgiNTz~z0VGo!lAiBWz`pp|mJj&)!!;O5Ux=v#O^yFSz z{&!vbrkxi@8)g&Tnr6iu04dM6T5VO69_um}Ms_aha2x9$6>H^%IBoXz4-Y#7T_ovc z5BVJ8dpd_{YioNuzrD9pD%MU#k8Md^JVIVZJ!;u8y_^HY(NLLO`AOKi;lld*pG$IZ zumf;+-5%35o3W_paWZF!yLheStptTaPra^TcZmZ*b?3T`@;uqjB~xR)FHU3Im-19n zQWCgDpxy@S1tnpsOl_^LDv6Iv^eb)PM&BR3X$61b0g$v&pycgb&~F3e_GEhs;Kslb zg%c(wX30w`umrWfzP`CxYcnOv!oqSC0t*Px($WIM2V954tx0f41ZU^(x21*pm0?sO z4xkDKY-2T2@F!eS{~0ct)=#~y0Dp(mO3^%e4Fj5%ooxp9&b~sL^J=hWYQ)7R>&$d2 z1S{AcdF6Ne`ZI8Fbh=jCDq1R9y}vx@l`Osz4$>>0KN`-Aa0VXEcRqJT6puY9;)}Ig zoaOjAio_&Nu?34m9z!oJy-xC!eFPC&W*ki5q^^Nj7NYA6Zlaw$| zL8zP{r57GF8(A&zvhDZp-**>SfDQTV6Qf=^SV%7RxQE(l+uYQ|FlX=~COjkB zMaS5XvH%#Tz|2;`fq$saKFB+vdnQ_Z)++%LD&}8_wQXs5Lu~9B$g~aem{KQd_L`Sk z`0(8yyT{`KfAVx;s=qP*EwIA*Kdxy`u(9*<5`bk-y@Q(=xbM7K=$+@_PizncSrwTg I=&KL^2iNLxkpKVy literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_spher_grid.png b/doc/_static/gui_make_spher_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..b24ba0dc8a3077a1286a16f8416f64206e4f2a27 GIT binary patch literal 12956 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 TX?+6l8OSRsMae>mcc1?sU=srs literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_sym_line.png b/doc/_static/gui_make_sym_line.png new file mode 100644 index 0000000000000000000000000000000000000000..3606a9d3260273b09c314f03c883a8ac12cace0c GIT binary patch literal 10498 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_sym_plan.png b/doc/_static/gui_make_sym_plan.png new file mode 100644 index 0000000000000000000000000000000000000000..825c7cd99bdcb3314b5cf442838307f5b5ba81ad GIT binary patch literal 10535 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_sym_point.png b/doc/_static/gui_make_sym_point.png new file mode 100644 index 0000000000000000000000000000000000000000..b76c8d309cc492ef16b5f94eb86c4aa4a4b2edac GIT binary patch literal 10120 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_transfo_rotation.png b/doc/_static/gui_make_transfo_rotation.png new file mode 100644 index 0000000000000000000000000000000000000000..b95d52248b653bb4f6c0691f0e5360ccf729f2a0 GIT binary patch literal 12389 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 aPOnvPTeU&l9@u&fc_ObWR}6dp=6?Xa1(KNn literal 0 HcmV?d00001 diff --git a/doc/_static/gui_make_transfo_translation.png b/doc/_static/gui_make_transfo_translation.png new file mode 100644 index 0000000000000000000000000000000000000000..32d717fb4f57ef5b11e6bcaf559c9448beacd1fb GIT binary patch literal 10924 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

      _6;u4k60O)Ju6|E<%rot8woco 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%0A)k)a?FYgV>vw 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 E2662&LI3~& literal 0 HcmV?d00001 diff --git a/doc/_static/gui_vector1.png b/doc/_static/gui_vector1.png new file mode 100644 index 0000000000000000000000000000000000000000..827a9d4590c91afe9e81745eaddd330c6c59167c GIT binary patch literal 12238 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 F{{xi*G^+pr literal 0 HcmV?d00001 diff --git a/doc/_static/gui_vector2.png b/doc/_static/gui_vector2.png new file mode 100644 index 0000000000000000000000000000000000000000..6c6655049140e37d9f1cac963217ad4856ff5fd9 GIT binary patch literal 11022 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 Rcvlr7EiNxs0Db%Me*uOag%JP% literal 0 HcmV?d00001 diff --git a/doc/_static/gui_vertex.png b/doc/_static/gui_vertex.png new file mode 100644 index 0000000000000000000000000000000000000000..3846af1c9afccd14ced2d05ddf9acb32884a393d GIT binary patch literal 9471 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 b!rINaD|EL4KN-B71bHT_@}vOv>ivHK!Ww#1 literal 0 HcmV?d00001 diff --git a/doc/_static/hemisphericalgrid.png b/doc/_static/hemisphericalgrid.png new file mode 100644 index 0000000000000000000000000000000000000000..c6409939e97a02314a1fc3afffb41d86434e426c GIT binary patch literal 32370 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 QT?zeTa`jS)vFn5X1Jo3z?*IS* literal 0 HcmV?d00001 diff --git a/doc/_static/interactive.PNG b/doc/_static/interactive.PNG new file mode 100644 index 0000000000000000000000000000000000000000..fecd3c4566917c07fad6aa2a936ab498c834c1a7 GIT binary patch literal 66179 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�)kEkbAO|#(@H`WdK4fh1DsfWch;jK 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 literal 0 HcmV?d00001 diff --git a/doc/_static/interactive.png b/doc/_static/interactive.png new file mode 100644 index 0000000000000000000000000000000000000000..0aa081632517ab4e09592d6cf7b0aa00b582c950 GIT binary patch literal 105096 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 &Hw`ZD&#(Xs*;tTw%pHV$vqxt)k{ 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 Om(ljUUuPTGeg9vl`Kp8f literal 0 HcmV?d00001 diff --git a/doc/_static/intersec_cyl.PNG b/doc/_static/intersec_cyl.PNG new file mode 100644 index 0000000000000000000000000000000000000000..b10e085c7655fac20db771bff5955a0b906b48db GIT binary patch literal 67072 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 L=akSy@AwA*umzL2 literal 0 HcmV?d00001 diff --git a/doc/_static/join.png b/doc/_static/join.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb4ba16de8e937075408fb8129edcdcb2720e41 GIT binary patch literal 14668 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 G!~P#+Rj+CQ literal 0 HcmV?d00001 diff --git a/doc/_static/meshing1.PNG b/doc/_static/meshing1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d2ac18d23369e10ccce615345593cb751bb4b4cf GIT binary patch literal 19806 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 IJ3~|c12CbUq5uE@ literal 0 HcmV?d00001 diff --git a/doc/_static/meshing2.PNG b/doc/_static/meshing2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..70fb2193d94cfc7e2379e1dc27f575a33d8839b3 GIT binary patch literal 37414 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 Ef}YHX4*&oF literal 0 HcmV?d00001 diff --git a/doc/_static/meshing3.PNG b/doc/_static/meshing3.PNG new file mode 100644 index 0000000000000000000000000000000000000000..adb149ee5dc35ff594369194d838f95ee6d22ac3 GIT binary patch literal 42222 zcmeEt=UWqR6eUU%X$lHrD56vmK@kGdR6wLFRf%)~1rvG#gd#-{5KwwYnji>BO{0oP zGa|htfzVqRI-#@q?LNEvFYJf?l4O#3l6l|Ud+t5wo{4&DsLg)<>UlakI(D5Wn#Oc= zXBKI%=g*y`J$^O{$)!D=@iNwaL|5^be~EU$;QY|wAst;+JnNAiBklN_!xLizIy!$b zI=Xk^baV%_x8Bjd!AF*kZrPTO?tU5_9j|*9_L&MDUEy0D&4;GG)~ngfzWhUD^%l3c zd34Wxdc;*6dC&OCe)ZCw!cW#u)?x?MRm0iy5a$|atUX#uzf;~Q*uHH^n?QD;bzabGA(ui7b!?%b=&w?0PgAwrr|b|4+bicU5r11&j1=W! zC~Sk%e9s#z?4}EK7(nvg?T#|?%JgQ6^mV@NPL)c^^jRTnL^JeBO>s$|+$Z5{%JlO7 zOn2Q!B)qCqt=`K$E#QUjR@caV3c;Np3EsU#`>=XN{r{iz|LztXh@-dm1M;?GROQb{ zQXHw1|K~saSJ}c|X0`1@y8J$|DHG}IF|}OadA@!}`f!?jq8Cm{9{R=CS#e5>m_@!t zFZZ^|&kH=)7LTA>W!xaNDx&30OLCyJGSvnU9e>c=wU6h~+0FTJg? zp&WME2}5%Tc4DthM$J2NI^7!LIptKQM7-j3@)WTr6eoC6>=1F<>=1c6hn@;n4%(YE z;y>x-jyzo{oQllx^))*BMNvZil=~;t64+K7+Mcf7EjjA7uy_>PF=xE7C(me)Z`%R6 zNw&B;AjDb@)x{4hG)qdz2nPhi)?6OogHTlh!} zJnd2SH3v!tA}o%zosH0D*&$7g;Jaf_pdiU)_ODXYhebVJ;T#-8U;6Kn}oDZuTg5?%eK{x{->HRabSP;@|QX=-z+7COzYo?$Qt?mJqcR zZJCnjRO;G^@=GzDC#wX*xH^Twp!K&#tJ=LWb-QvG>uk{XsMC%m@mTpA%ZB$C$TypE zDBqZN|BDGXxP0~XR*;+YcY)70_Fxi?2JevW+O22Ow*l?%6bqT6=n)0igb5L)o2YyJ z<5hKmF2HRik=;rLR5EEX8_k_&KNMs7KOacflte*P?K z{+rwpo&KI+gnyw@Q)nAP6k{X)$b?=uorIR1*IZfs48#>8Qtpmcz8kZ#*1z1^C~-#z z)*m{nb23T&I}kk>bgO^d$SSQ(_+p)fO^U|rN`W)g%+M>UuV>O8#yT*|$AJd#1-W0g zdA@5(zsa^OjaE(}2;)o${$DgvjL2{|PJl%zzZ2L9Qcj#WexG(c>tni-a6)?4c1Ne; zurieZ&b{y~^IpP0z*U{7;ieW72#1a)^aRoPk7?c}i)B8V-;mKMSzWzYSqFNsi*7x)I#5^9@Z}@o331T>XmEx`(QGZa0wAjZn^578Yy5?QKvzQ9p2rG(?rFa zsmZk8TDxWPV=ZdT$oiq#?Rkwj)tBiauat#RFFw8WDK$FTk|a1E@+WlU|4}d4jY&Ot zDG>mztkXv3t$tRulf8*!d}Tz)gC4{|Er3NQfa0_|?X>1UUleIR=i_8__tW18LZP4; z`>7ZE9?iWM-xAe|ZL3cD{1XY1AJp&Nne^3b)vi{Pe3f}{`#PwNp&h#Sd((Px$9HA# zC1LeNa)7#>b8gee(wAMAbgX&jP9H)Oa=+|a6(d~Vs9qO$1w|J69eo;((jZif@;Lm$fBd9s(;0**3x1FD7ecHC0i~*C zo5nTbe6s&D%%?b&@&lr(^UZ!53cMjZ(Ju*982|JrqPtqDcWbRv?hf2JM@QY3w(#)M zm%nw1DMTkmv3okEf_%K=nw}sRBu2Hr2g)OI2JDH0ZYsd84o-~W1JiNKbFhsjAR~}e zSLr>{JT4s=i`%G!b(OiL?KYJ*jMLWqn{N@~UYTKX0oP_*Y<^=dg&Z611V$=Utak-V z2I%>-5*d_4v~oo(^9LU}5`J-!vdtE^B^3`3BHi}o^_Rx7h9`e;b7AkDx}}(he|h2ipe`rQJ5qw655A%zvnSyYKop$Br(G z2D;R6^^{KN6v(|e0gV?AAwLC8Jt{0jWpP8oKaOS3GP*?FWuj^Z7cK#}w0~4?j3Ly6 zdt_|&xkO=v43Yg{J201xtCvo~>4E|6g+`viGnmoU<+)vo6*07tIDJgqIYhct`qn`F z-r>)l&6A|yFGzCZ$!;79$J~aUL`05aP>c#Uz=OLQ|IwyVi^_~kDH+fPB<}<>eGU! zX~<~@z(YZeBIw_2F$r$`JG7QPm;QEYvSL_hB9a_2{_0Gq+t2#QXHviV>!z>%a2sH%!5p5;5+VZw(Db@z_Hwq_vAP^ z9m6PYR3k1BUNus0B*xMzkPITjv|qdnGxeBhRSnbzyBVQgt0Pudh_P-yQWJCL0<%CD zE;14)-aMOgn1Eb*iaP0mk$6eVy}qQtUK}YJjCI}ZVM~-g+8Ww!J3LRk26C4QcWa`R zIUN7wJJ5n`JFwGp?0}aYlkFC|ungPMe}_ita=|09nUS3i!qs)%6AQHc`z4L>)|uR0 ztq=PJbtSrZ5-jN|;;QLJ;zSC7|EH&C;Y-+>Dqvr|s=R1NBgJlc`29Iq& zlSajS#diG0#J;7~|MXo~IG71xPy7fedjBe^o@}O5# z(Bd3#l8x?yav3nk{)jdRaT9?faC#yZNc6cLMgd)_hX&MsDk<_tgfMl8gE6h8c?V z?F(E(61!0cN5DSv?f<=K<+p~Rlzdw#z5RC|{q;AmL*xbO4&L4W$RGbzz@-uo5+%5rZ5PTy)rA zxkj5#sOfBAmlKUtTNXUhpG^!HDBlku?0JoBDvun2P*co6Q6;)qeJ&d?dlu0(9avJU zLJ4l3Ot29_zLm}iX*x?a`8=%<(5o)jt8n+|bNd}!E11x^iu*mQwayEZxX=l8Ku9#o zUnsTUj>LLOIA#d;N1I6O~>T5bfa&BfH0at=a~Co8a3gjJi7Rgc@tm9>{` zy~LPFxKZ$g>cO)$@5#-_Hta?oM<286XL-8>Au-Nhj9S^hE}*g`tm&__`3Ya@@D;fK*yf?ZH1 z6mM&J*Q?Ldy8~R~7DSK^b79mWIxz#>xVSz8eCx&V zHZ2bab;zHL%AfYvoeayL5X+Bqkh@YqpAqg*ZE-*^rC}VAcRka+8$PMFg&>{yR5K3~ z`4*+zWpbaP9nJ0j^7)P8r3p_DTeSp<44`%YxepCfnL#16T?P|+4SOT|Gt(38!4Ic! zRk*1A#Ahzo$hV_`rwHxK$?Z9$Gc-gdtw^krghm^CcH*@;i?LQ#bZbg-#gZ+{WZjij zbeSoVESMbAqS_e-fw35ZXRT^cMw_@*Y2YtnADgMY2`q(?Vnh-HdgPB<i?CgSV=J>?!P&Khgyv zC<;q>OHn(r(~UvW50Hyg!x%Kyx(H{+!-)&Klbj9!R-wCnMk|8oQ;%u)6W$ndN^ABz z0yqULt2_PsrcMNDbh?m9@1To?4VNw({;|dUrnraR{Mr;ww=aD*4zcIbrG3(?y7huO zod+X^pcI733ISijn(wNEUl`(2zTKsl}2aHp(<+4{o*c zG8_$>9#0q+6~^sXI5L0r29KJ-ZQEW4L!Kd0U#}aJVmq$)i0T2roA6!y7GllQ@dcOr z!1}Fv-AC=&uaZmN8i#dHcXyT0F}s&>qr~(dljFMGUt4$%Sx?k_y+~GF^NbJrr+TP^ zI`D$6rjjDuu)o*#y&q6PGL0jFgvNDI>Yy{}hL8`UMsxpby=Wy2vb{MxhP(41(&Z0u zY&=%rvck5_g0`EhmU0NFkzT_8w%UrpLi!;&QR-^C%xnuyF(jhBbd$HqopJ)tO=vln zOL2?U%M#O`mKGJ37-_uQ6#Eyq&V=JZK~;JZ+WZuLuAIaD!mo%DQB#M3` zc6r<4)Ah4p9bBS;Ul*6KlpVF9wN~oBWhQSVPTt0QrFs4;hZkNQ4sG@{Q1@8j+?t>c zw2=z@5V>nAL-j}Ov%xz4E2TjUjwB(!85f#w-dJ( zVX#~@PSC~ZSTD|YCW3X#DO2V2fvP9So%`*-D$PA7dKb5V?>RB=pX0uF0_;-u&7g(w ziIB|sg?8Ab+9+67BD$~ae$)7;ng`zW9&g~GvELJQ;*D!La~eRj)ka1>H;WKQRG{ zdNDpWa8UD7hP&RA#glYYgUvxHa`ysNa}YZ_fk2UVQ-(7m>t0g3=P@|2(PY(|{(rC| z>oJZ0^&dT}{*n2P^tKJgptu7F)lLGFyB(nmxtvs?7`s^+ESC2%1BO zMlV;4tY#3T@k;E1`a;f8IC56w^;W&|WMBPsY`GrQts+=!i;^mDK+0L5ELWxo*g%}W zP+L`(8-6aScS>hl{+I7N>BjLbuDv~(+rOnRqIK9Ckowlx%r8d*efa3P8;P5@EYwt` zZJr?@Ww7UODI7kiwSNL^VKU3G@y3LQozt_U{3!F0#3dl7;I)v7mqn%7rp{tOO0}-( zyMpen$e}1@z7?28k3?Hkip0wBNB&y);Fp~OW^J+{R|xX;`-TTu0B&-Qkf5@22X$bJ zn(BcKpsad0tq4X|160yMC60IL)utqM?-Zl0_Q9?nen_x%^AGHq4$S0jYIw5?%d8j$ zYPUF-mfcbXY&8B`9=pbVC@EaWZPhgF!6>w!z`A^n7=F{^Bgy|9;{^uF?Ge%~(+D}9 zT1~!XnB)pqJkAt>#0b1EH|~~OqW|?uy;}V50}C0`I{I5@P&dUB6A(6GUe_JG zBw|F9svy&2Bt;H5(jAHVWt2lyyZL);gmj@Om3Rp2opV;3Vo!{4L(i{a6rw$X$O-{% z;#n%x7u3Oy#)8d%%;P|iGeO!dItxez_xg=}l|sO>YFEE42oQ&CWR;uD|2|j?J3Np& zFCGj=z0y6?C%qKdHu#e$w|Rr3_gR=jKM2lEmAQ2br`RhU4cQB#Eay+g0*^gnNHWCd zuTV#@7K4m0RmkJ4hIG;c{)YmU8r>Ab(kX{N0rrw@K|~8|fb=5N*61lMt7^(DBvZf&Nu*rA8={O5AzOUM``jgKjSX-T@?)4itm)PMYR~Lvpt`9 z3TpmL@a&UrCM=w@rqsNNCFPB+%HhJIGr8JCEGyn-f4bqD<4KBLbP7(nG0I$04#ZQq z&~KQZp9KnMRckSUVJ)4~eE|rY!<>84txGA3ah}*?E>X&EgpLF@u(?Gbz(4A|q+4L( z8u@_Cd~{!g3%3EPm^-xg1_u$!PfLvy{c?0zbGOa++L(p0FY>qZk*zt>a&TBi_3_sz z4I@< z<=E+j9e#E_i9;CvBYyxE)MvPvbN8MQj@O`~jk6IW^|vO99sl-Z6a#cpXo@h|AKfdtiM&#UY{%kN@-OuP)tGV-{l+$l42z~=~hMF9_wf7hnw)RiX zZ+rP{K7@Q5tpB`Bqz1W)ubSpy=XPX1h#;|UvO9!cRLZmCl7P_?d9F@ZvIf*9l9f?! z%inBbgqaYzcHk^?NkPTDGIm``&xmL|j#%PqC*KZLUN(D#Xu)021tv=N(?uEWyGNqnid{VM>~jK%(yxm z4}(dM@<{|f5))CW?cl-T(HlIjx>Z%Lt^UMcXC)e3|MGM><-Lqs4n}XQ5V|O&=bCi; zIAg3;-h;_sh^QSr&|^Jn@PPz2phiO|^N?zThPb$v@(Vb;oF66QXTL*17&p8}R(O=9 zPPEa$yO@o;64x>NVZOiWXFn;ZPp(S$RoV~rd-}#Rx1UW8B~P3%YTESPmVCO<$|UbU z*P8I1V+DhVlNNPQ4-Qz6>1!5L=XaNhSAp?}zq#uuujq0iP51oAREflGuFEsNaPbJ8 zpD-Ie9pNIdz8D)cqZYb#nNX+yzr?&tt%vZ+%55j=svCkc;GgOSOD^M++t;wTIb6jO z1U6$q#LA$D+5&%56NR9-wU*)JXZ~G7hw{C&Qa{dd&QJHA92{}NX(gpiOG<6Q)>m*+E*g5vZ*w2gB%F30W-$YA)p7>fITxSd2_@|k> z_WUAoybB?eJN@2IJ@Qp>fM0gAZXUdY{MfrgC*;<%$EA71C3D7xC>TC4{;L$*xFYOH zTXH>|_V;9u=c4e1D*IXLs45amT-Coopdj42th`GgZw*9CzsW$5lk$-`vwpyuI(V>fQ zbBGy_+^t0ZknI$JX`1^q&BXnkCip_?w6$rc>hrbBVA=(nDhkFW0E03IC1O8tCx65)~(>Dyw$wt}PdNkl_ERB_@=-9FFKy$fNT zqog@%gkk6*Yll$Ntuxf~CdA@Bgaw!0V3o)vl4btAHqEjmtv-Q5CjT}O7u#w(3ORNr zQbC_s@39Hb{0jV2fok(yfjF;?E37#-?I+0;2V~+78-Z3%T!%UUVy-sFOqE%CyB%N& z>!PS#FQC1*wrfeO@zvOm6xZFYB~e9EV*ML__3$P3;;cl+G`6hw-PTOhu(D+tsaZSf zP@+l`hS9qCR2I=zdmUGVW}yW^?7@GN+gwu5&8wIMIpuxE82Rh}|R9X!$mmSxagm)8n$Fc6jA0<~UG;$4>?J*Rzt! zZ!_v|NCuYIz@b{+y^|y`scDHFs7E15$1M+o&eFy!F<#4S*-Ct+kS3pU4SIL@SHq&$|`%Qw+QEv5Vj3S#o-BgTkb`fwVcs{PKkB`_i3 zZ1Cb*1|aC?8~2WuBz9o({1q2TM%d4?9b?k*;7$(ZEOqN!X;zFw4?d%J*e$Mu zFZ#&Njgb(!Dn=e=LjKut3VS)Rdo}|lo{RrGKlamsTsKCY1M%N-fxN=vSoeV0cE1^q zCQA$RsB)w8L@rXdG|OR1NpwPpqWO~-`s{BzWM8ObZ`)J(h4<-vD^n?00{6^VZJ@n4?>wP3iId|+e zd0C%v>5axRRiJOlz+ICQ*3(HNywAbYyL~!-RfIpVK`=&i6K7Wz0_x(wD%NyU{6*}o zt73gGyJgD>;zbO!dNSj$=U<7#+;AVbEEQh8yi@o4c}447uJ;3Iliqdu=7K0dAAtxN z=O6EiNen5Tqk)2JVE;mjh}@r9??m1!^|z~nLTEK+cxHX=!$5W#DGVg`c0kb&;+FPr z)ouRv2iQ0i*Iv2Knk<5-^eu1`>ij~D2ZZJ? zb<^tksKF2Ews7_qX*eq}Zw!wZ!m-0sV_=g9@^^4b)i1p@)@1_;dafxF()qKn9%;K9 z?Jym;z`9~IUa-$@*i5CUnjH`b1HGb$RVf$Y{C-vlzgcb%Kf{j)4S zG-(ElN^U;PfIDy`Nw?HblYufqAu zy6bUL7GZ*dd)f+UtIy^sQjdFQ;Flj}{&(V{g7X#Uxtjq^&x{hsveU+gVRF5NJ!@*&7)5qsHKt1U5lV!IBv}kmEe;I|;UazW z=T~G!agp2ASwH{y_x{ZW2knvp=-lMZEK|BpEeR zw}_}HT8kGlUfO-94;m3wZoFB*C;tW(RZXV>AJF}maMr*-vOX#VvS-Lx-lkz4*(RqE z726$j!X#7zhJE(Hf+C2QyP&LkG8bDhnfs*7hx<;g20|7s((%f3DZYKQ9(~RbwRu() z8?z*O5k2Q!yzC)@bxeC*pWaK!kqxIj7+uwSGr!vBxzkjxXFb4#=9Bnn_Gs;aSeB~i z1^GnNNi^>w@%RO5YO7-7DRsJ-Ab2VZ)1grlSYyuly~f3X#;zJyF zO96>}#f_D`PWv!^zTUu_*9UReQLzZ8<^GmC|9U0VSrH~Jf*$Hy|I;!aihGJ{B;)d? zd73mx$NhJM?TSJEl5|46(9Jot9ZO785Cv1&I5>14BdZ$vp zpgG~}Hrr0%{==mJ0{vRSh${$M%(F^ru&w+`Qvv>tm)jlu1yzimfmaGBzruH7-}7=1 zD14n9i@DBUMlOMO#G(&T5|i$+)}G&c?wx4u8T7{G%VQSpx}*#- z{$bF?hPQwE{7nP9t$`@^pf6Xej39YwiplmBYN@{4e>>nT1_YuPt3aX^~=&@&HMA<+8@iEotcM| zgb1ThVvxdT!gqaz$D&H?lio5xe^oc0soRFso1jH4)(8!+-9|}@NNU6zWw)$aQbd); zaID}hxD48Mbi_!tL8w|1sUwgTGQmK#X-d=Z&OPl_p@`jTWFQ&1m*=c!6YDH4i3#S4 z|AN67ffvR8?d)g+L=VN<|6$PZq!$-Svs*Ur+DTWTGZ=#q!zK$z^fHu}zq}P%A1sDd z#nIG@me?_?toX!xYrAdU`6niCuhf}<=o**4`P&{3);4Tdf+&)yg#PhCQs-chw`bE! z??{@qtA0mRD1#KhYt2fuN2t4LGZyUYT|9~B8v1rYce3`WfJyRX`2ELi{SE;+-<%Qo zxVe-am-P>#<_N=O&uVuS1EHGry zGx0Bg0D%Dh&SlJ0<|<8l1PFug774U@^RWF>jl7MA5sj*CKSXq#fr2SU*4GU6wthB( z@nel1wWca)5K50#wKp1>gC z5mDZ#;`)TMW9QfsN0p*H8Ieg9k^4&Z7-v!0r+FoyCC`OhW(;we-6lfy{`gajYnQ8hFi`E= z;Ey0Ij4dCzu6Ki}(U*@>(dJco9V4N(>0vFOTN5o)IhlSJ+MQD}Z<7+&@nz_WK-sQy|T1Hb!JIAucf^xLas zW7cFXckR8~C<8^YZJq8S#A0kX126jX&?C8q`X@yn!oLLtNHM~IO?Ph6+k#c&e4K7! z`TW58{i(X){iDOz`E^pT=l(|Wv=Br4p9T=!Tgu;&KESGQB8{3>p4Z(W!j4%3**6RI zjp>yg()O%hr(9jsqFz(a@H~iXni6XNL{mQV&=DLJoDG%9aqngmzblVIRR-mshIysA z9^|>6d?T!@Qjb!J4!NGxpq6r96GH!pZ}DMiW17ojm}1w>rca(n|DJerzL0ZSU+!UU zbbld$XT@BZ&r+t0%0+V9D2uM<@(2E2FEEOqX)fkOec+Qe7H_CG3aHQP7`}h!uxn+_ zz}>6QCcu2EA^5;d_d8crW|@T&>0RdU5POulB(1+WoR?|@9((u5wr=vEd22!}t*JMIU48rp>-**SirTn?F6njxPGnQtT zh^+Wfk5|~RRDM!Y+-EQ}p?V*Eu2TIzB9IOyryp&WWOv7qfffV@fT&Bqz_!1cu;c5r zaCUuNbIBMIcIZNJ+(b~V6Eq(J)>`+X+Fp0>=^v?2SdJVxUVk_tohN@y_3RQadI?z( zm6z1)9;@zA*1VK+l!ZGjfXyi%kM5OGp*WXH+AyRK9?cZ~0e00AdZihEP*v!|X)O>1 zBXU)NPP6wp1H{N$_LQfp;cW%BQD&#sb1y5<+RPmnRkOsG#3^M&ip&Pic**3io#|c@A35_-exSE|dHu3Z^jYUC>mid|z9|(}xZ4Y}1r3VIxYC zpb;#+I`oO&qK4b)qy+uZ3E7O^I#J<^Rwr{Z(GtVb)RZTF?>0F~@Tl!>zj<0Eu_h${ zypuOzB|iae3CnZYn)Bm%P6?N z{3M^SXMkeC9LtRyxsGhRqUH~QB^g|#+A47J4!5%k>pJnKe(gX=T~;l;VmMLZaXo@I z<6cVLqA|&f^X5B>RThQPH+Q|WNg4BPHrgwn0z~}LP3|j>YI4=r(PLfT2#WVd6q^g#bb~{e z7lF9%2@a8|9{}6r>Ovo#?UO_}Htdn^$^cYreYg}-mLw`*qc?BtU#whF#BVjC2y@>G z7Y_Qmo~%rx!v*Y&0!E?5Q>GKDfgd2p@*|z5H8$9kN$jvXc1PW-H?T)_*N^&Og0ydq z*n$w{E8$)Ux9lbjJrV33{nwALD3NBpIW1MMTjn?1<01WqhK7)!A9iF5*Ylz3bNp+zs5T}Ro0h2dVV zWl5}Yosypj_9#9v%c9wo_?qGEWOjP+S(TS1A3Iva<=(5}+5pk<3K0}LarGG})b(Pu z%6&L0c6^uyWTb{GT)*4OB=70(!Gx+IF&DV{EKbFX7vGHsu)07@kNyqppyK#> z0d$)xI{x-J@f%G+H1-$2eHPKZRPi*P`<7{`t1Z%JJwuYe*ry|rXVx1DmtzxzqqHdS z9*N-KR2;PpxF}}S|7w{THc@sf^tNI z+`VG(>}WjYvA4!*r1;z!YE6-WO)Tjy?bHvBwK>j+{!-i{6l@`*L(6Ov)gcJxmee>i zA&4H6aRmiPJ=Y7z#2O85J+?pd%jEM}Fv0+F16Aa3t-$Ij%~If+%++qN@YBzs%=rQ$ zBZF&P>NZ}_o^|Z)`hBwxrgs$gh0#b&1maePFGRszs_j>bM9(2(=~*>6wt(gFvIAM! zNR(UhTTv|=_bIRL)wEwe>%9Ax-M(Mle*s@O)U+?Em7s7+F~% z(riB6G*629l;D0S5>SSbdaVY8UJ@pWU)3=_&F(Tmy{dsF$n623f)jgr&3&Y47(bqz zo`N^2cin__DX?4S^UHU}z+7mNfS1}BtNuJD-6v3^{KG({Nm@7d?Wz$AwDFnbcKEM5 z&Q3kaqz!%Axc}uJCYU4;9N2E6JV^Q`!dM))^cem>Im zMt&2Nes(?KfdX0V5kc4yt^qAzA}9!HgQ^Z7X79$ot(Rt5o1*+q!(*exSd>Lo_H~Dz z{{+tKZFgA)?uBZEN|h5@@IKD~?=ZKDhoRz2_dLtouLUo9=CQZ>@x`1bmR;c-LT-s1 zabNNQb4nfmtI^68Rycfh(RNxncGL=l&B(Xq{5&{KDOuoozJW%y)N^;DiZ zD-5WaOLBVaO)ky@eG!mHtd~+G&QQbip3w>)&=YtYZ9MLLdkQXrsiWQd`h1a+qmbN z;)`wxxS97W%HA$y)1oQ_T{$|kK$qF9!BkpE2M-Y=;-nikG_O!^<2LKay758}s0S{J)YR~%a$ReD$vK$1J=C&E)g9><^f1nW!kD?}#OZm6k=kMc zJc}WN=G$?0#x^!GE^_cV-gxj?+&;ZQod1@2p@Lh*)FaUdV+;_d%FPpPv0vL+{PjS5 zZC*PJKYi`b{OwR&?b#eav}!<_BrwNVN^;dH1Cs0#*e=mTF=8Fv&umR3VDsX$BHFgh^9Q%9#->x&Jw}GTMkHHr~`= zA_@Klp?85aQ17+@>#ENTctriQo$HlR%UWKu4yKbKaF3`MajNn|aQ^6fpO>aE}EAjnnMZ=rQ>q%=1Gy?4pcSv)e zb!^^sqKVVyWJ5kNey^QpLAr4_Q#42d8KiU86}&OK-iXlyvuZ5=Rh`y z>57<|ysTx>Tb!pjm)6VUAXrx>F&crxsm}`@WFfiW!5xj;H&9c&6)XWlz*SlOCP0u6 z0FFN4rVN6j5<*fw&}8*dB8UzQ>-un?o3wgWY>omveHZyixv>5XG$fN6@%Ko&+JW-l z4Fgkjsr<)h+hJ~SBZ-#*uX0+Qen28vj*G7_sn0JS?ak04aKq^XASpgCitW1C;OKP5 zUBf*JHj3vGrEOnX5>@)vHQLa#Jar+K^tN;9u{RC)M~oj!`O>0|w0aCk$jiQcSXAvR z{Vc<*KZm&c6Jv}57M%A|`vlQdYL6T~;e>I?SK6e&?f8f&7{`1f0|gN1GZ>$Y<(*r@ zmA1TcE}=C>pBwjH%6vM53RN-uJ$O+@<#{~Vp8b+WXpISLI|Im{(00Vqs_N{Gnuxy7 za@GOy@&s0{XZqxgG(BFHW!WP-k(~HDWaEL|$}o-RZh^Vmzeh$1xux9W_!!x$twgdc zqRj?t1)kvHth?Lag1}83&(?#j5MR4JydrcX>G75W&BHTnGh3#B!VkXjV(L>|_D1~zm^ zR271A2L4nH`hncl1B%=*zlD(PjlkjO#gp%leKpj!0ZMj?_DNRE8 zLc4*j7fpVCMie=Bp2)zO{0_9#xc*&*JkLWDBm4YEzrD-!wf)RX`c+`T%br+VNyUOt z;pZ}uh2G$na;Fw0LQmw$;l&7zBj)m*8tL7n?WA zIB4*GV*QIUur)W>v^3p7n~talL0OvKzYXOSor=7?YwHfe?UQhS07K7^lZx5u=hSLb zYumZO2R=FH#adCyshe5TH;ZDy^shW3bZAYXhi!jAH-f$JT+Y0SEo!bi`^uc55|S`< zsOdnSoCg&DiNgj;X47TRsZGFe5Mk!;)FUEiBM-<1s(VWz1qPU zrHK%5;P;J`utSJo+hL;V;VB5rfuV=WaXh57F4?f)-xgw1CP83WsD(D#VeR##0XGBk zio~t9aEK<@j-oabsboL4eU^q3`5+pDa?LZg>>Z_@N>0a9oCw~CPS`HZ299eIW+{t% z_(Sf!8=w%^WybatR%i%aS5Zh6uRD|E$0yld-t!QveCyiufvytCE~CKI?{%7~9%7}J zx$d|tYhg|S^c3QmNjN?3be=|hsbeROuZyeGW`dKo-6Kr(gG<2C4(Ioa?KFb&k4D(b zRYq?uUHvdXYff?{10DlSas?Na9B1&+1~w)UQT^D&xJuCDs;7Ka$Y})w(}6$4p^;XZ z@yy%rV2objlXJk~7v%O#(?c?ABzB=`G3TUV4HC+v?J<)gk`IdEcL&Q66E=Q1Fv}HR z>BAGkm=U&Vqcdb8t-aJSR6hgmkJmGOA==G)&wU2b zF&2`jisN%*!eO$#0|eb2{37#da4cQ&qahGV(;Ws;nqUSnO|SzI!huS=gs7npGg;x- zOupm^^4EV~lSo`-!O56_t#1abo2wz2{s+-Cl^UfD-IeNLB%3!#h-ev@6lcMj+7lxw zzbPCRlKVV1kbIoqE%Tk_$Yn~JN0ldTSu{Ew$jqa0uV9lGsvek^Z$e&$j4 zwVOsr&TQZ|NGzKftX&=b{DpTJQirxgTe)02uJ6Vv)ZCjww5v}h-Rcui2sD!}(nSt! z)Oj3{#S%0wki2Y$t8IJhU2T?9IK9d^+^LO|s+-TK+s-7DT#xwRe%0s=gM6wssZnSn zSrNfM3sY;cYHZGIL=tGXf{D2e{3^-z(CD-rllA|^OOk98(OFR-k#e?gTS_FSc>EcJ z#gD73dYtz3>)khtA24bu=fr$PCtG{Yj@b9%>uEkp7~t}tNE5}z%}pXo^ZXLe&&;+5 z(;#&@6B^4U@{#m59QwBqmsfw9b@hGfL=k1!Y8{W-D?JC>MTw)@p1I61ENJWPMUKn; zdV%?>fYMY?B7CBR;=HL5bBt=tUOjiLcKPyqb-FpHrmkh$Y7B~nzhyl9Ot`NeFco%j z;rNeHaoIUo@VKK3^ItW>iAd62yBJM`MJqe5ajcxHyRffpXQ}?L$)#4r%LMKelX3m2 z-Mjj48~Dg6c3kqZQM#V5hgAI_lN&xf`ACF6s-CocA8|-X3!D+$|A3sH0s0#L^LB)A z;*jaDcF!O>4vF1VG-Pr$rFp>WlnHz~2V35KRZK@4j*dzf(-^tA-Z!&u^ra>Zf{4}v z2XHg}mp+$UvZi{zUT{+RE;)!1_TU;udI?HaXbaC4Nq47J4>s%T`_ka}rTK~ng`$2I+)xAf&s^r|=dp^-UN4Ff4 zMlH`T=e7 z?JFW`jlq8d{Y>BUR4HYvIC@uD!iL^UZtuAPkzw~zfDqDlUdV$0p zd2ol-0${*Fc$ys+fk+8{2QF}cepW={*XyZT>qlNNYh(F1(Nv>qyuxmD9U)6TQ^ zZ0~2S_xulUlzt+)I6MlM1L+jERX(Z8#N~NSvnRga-+T+3oH7nr;KcM*0$eWw~7$^-}1 z#$^>hqG!+PGR{8bz2VH&v(uLr%B;E6u&|?z8l{A1QCPVTc zFVrfo{i(blG>|SOqQcaUzvn5uD2D=)Y3GIf20kSy_$R{hm3^8o5gHw+__iN z?&Vh7t+UTCfepvMMsdN}68Dj{)`#8ynTJUskWE4A1#(b4F40LWslB<6wC#`DmItsF zm@=x@&LR3e61R`UV362v%KyACz;9r0z&i{PT5W|^q-^xW6qhcJP~XY-_wSQSfnr$Y zEw{1C|JdbheG3#zpv}_3SelpGmv~qIyDYQ2)Xl46DqA04FX@xT{*A9L!G>?Pan4J^ zBme3!izXd?|KYDjyj@u_tNkSF5frB3k_r-2TM#+e&f*%h3=dz*Q%bxqrUh*StJl&m zL50LjsaK2-H*Jt6AonepOOrxJuh7CIqRrO%36!wgyvANN%!6iuf7L`Np?6B1PH$+h zV@jD@Rrj~;-eo2~uF<{6Q#@LXdn@7S$H^^i>LQltjN-Xj(AwM1;=HgQ{VRXW;8YSH zX5_On{8E>Vy9&7rlioS3m3_t4*SNe2OdxQ~6DwnZBgzfIo;{gInv6WMm5jv7^|47W zxR)HlV*uVForf^{Pm^=U7HlW{l9kk1;W!3<$?3>gGQEUVzA$nzF#fi})8TALollWC z6h@z6zKS0WT>9*H?&M$TLHjd*7A(jmbCG6Z5roU68$Y#++ob75a}g~4pcj!uS}K|; zoux+iYzpIEl$n}wI8nFs^gJVVw8O4S2DqhVTFmF3cQi_Lo@oAMk z_PsTX+slv|EK{p6I4_g`r+Mo%IdWVQliff56}_ZTaJw?%ErF(5t2r-jg&UQ=c==rE z=jrQbkXF*)YMflZn96)*2WMp8`e1yJ(Wh)4k`A=ONv7R_=T@7@&G*!NWqZVPL%v;( zUwKk)2Um?OKX`*r!FO@TH;ewjOt+Gi{|7~985LCXDe0J@ zJCz3MW(eu-7+~lQ0YMsu?(UB7e!t)stTpS-eb2kkv-buW*1ub))w6R4li-uMEy}q;-&Y*iR}wZC}2Cl>~$!@DVX< zJ;z%wu8U=jaSni&eK>^N(&}g5(Umjk{tKUu9wz&p+`FDxlO)gpggE}SIMP=XyXblH zMf>-P|CCPjmosuEnJ`8mzJW#MD-Z^qp-#Yqn?`IAfRRQyT9$GHp{gF5FM#sL^wZ0%kPL(02z@ zj+egwgZ6q)sCIFSk4m@@q?f+iLc;JlzjYf#oEF^X%7q5+dsS7#Am%pFf@JXEij1>K zio1PCFovh7saq3x!pu}!Q`S06YGrg5aVl!@i~`cdb)}yE&DR+uxK%{TKyOq|xGvTjW~N&gOC+d~+X zN+fJTRtlO+k~>B=QR+DrPHKc+9n}<6?uq8t6Dk%a%w-r9{rccqScClILmKEnl(rT+ z`B_R0lE%?f=pw%Q%Igj*KEKjR+^`!`7B_qL>2Ix2gJM<7wcAWm;WjEdQ@5I>$ha}Pd|7FbQjc5e18AT>$6IK{Nn&_4LbR;{6ABg$ z!!EGR_yh~IGuCDoWQVZ+gq@^m9Qt?3aN0%&;i_~*Gs=x7k9mU_Qv{7`Z%f=d ze(t?06rRIJA_b;|{;j-D*K1P z?i~?d;a$Ozgi%OXtuu^lvFYWrOn1Vln;C;}3)M6aM9t=Y=oaO5qGNdfFRZVl@*1Zo zELWS2LjE}0!Ohzn0MqPnT+9d8WxwArMPRIJ0<0~|4bFbk+9{{aOq=La1@(w?{g-N7d`0{Gx_pHw*{ z>l{rPU<=IM#_fG9+Ic4#NFbDL|C9dH+PYe*Mjux>39#g=@r=p2!jqBMq-pTvw9WeK z_&_}?a90s)yu=EhV8}r5{JfWl;wjw8zrEn>*jkFS`BC2=D4?{ZD(2ln|fuMt+gN|2|oyYrR;1)bm{0Vtt zwug@UoXsJ(W(_+V_~nRjp5w4cIAIRTlxOy3;Niw)f()6BW!wr9q14TU^w-l z+ido#^`Cx8L?)O@<4emIe$-m4d8%S4aC`Ec`AIl&FQ9e(9oCWv0%{5MXQ6*IH#08w-f zc~k&Uk3mB3(@xJKMV9tSw>NnfuvLN6e!=gXFjqpR!ZH42x?N zk0(~ZK#QOz~3}ykG{h3AKw!x&pxKCS$`&p{Glx2*2^ehefQx5 zUD6yGyE>f+y#DL^Yn-yLO1qMv!$+Pagf7KMKEvz1g5G;bv-NRblNZmQ+4}!sJ$f+Ac=64Lloxcn5cwlM1X-na z8aOV6J~7+2N@>S71qT#(z|VFl@A|x5x9SjOUZYt?=(6Nu&^W0Et^R`bTU*pR=F{n4 z2yEe5Mc>EB4;6UE@nsqlcak(57ma-#;vR=sRmfVf2nNN`eYc_=QEnRYt6~rhUk5v< z+o9lU=l%MMv zWpb0}nPu6W0`?0%0(683%0?lm-o#XCZq(PL82U0IEVYiXo?Zz!pwlVTD z74nrPJP=}li&&dR?(>Txr=Jj=O!qb8$@k-z zr^qw<*dbe^7EyP5Ne_lDXVs4sivZ~k)ACpz#FIly*fFO+*t*&{-bCm71(<*V&IFn5 zRwD{W8c1zWbI(ZmGt$Y&i5Nj${y9&{HLDh7ht6iEUo9g&A*9b^xaWM2_fl4fkdLVb zN-wL!kZp_<)N6(#9|kdX_mX8HwY}NOC?;JbeNoB!khM~k{u5j@!rJobfLZ{uX&L=# z>^Z;fa`hYW0cSQDq>5skHBpgXUDBdsgo3tSVs109L&<=K2=^W^FFDa7L)f;c>Xk!F zm&$MR7V%ABPw_=VLRGU6;9~up^pGm}JnNUmm5!I2WLTM_i46O6aRQTapoY!- z`lui08;)1cSwM%A?et>O_4TzQsO{(vqv*lI*x^zv?@P#o94VO1oHqR>gfI(O&o-HD z-E*#Abi%( z(Cw$R<(>6nLlZ+}9_0MB@&uN-ULNtf7pt?+AjltUnL`~iC3gKaN7o}AOT6SVAQ!$~ z0_(ytAx{2fhZadUQDKhn;0-7wIBk`kT@sp6i9|OC#e4lUunRK z51;$NIBucDeDn3YxG?c2IgbWP3r=|K55mt;6wOv$d>8YO)D~8`D(r%yS@y7aE!e zkya93%^JKxY?%E#;Fso>`=<_0aFgdKvzJG*Kks@0aum9==dLqb;{(S70Weh7>^>Rr z0PCrM(e&xsg9;4$Qe)6j$n2q{Ax*O}%(+7P%FQWo7SQeS5v0g9V~kuRYr_+)JL8UR{@W{lMiLqnP=;*d z#HAe58q_WuX*l39r{ROlAf>VR-i5Tg;G!syVN+ZUGMle_p9FVCl(R9z@OQTXA^r zq~2hK$hh5aK$frTA*{_pcj(J+Naz;ay91R^fzTV?qbje{Pf@5<>N_zw==DF`C%Xex zu)uZ2X)v$hU-|>`#tBt+*B_?Vt8S8Zj`*A4G*dLjZsWp?E*%SM(`k6)Dm0&$yV`-F zTXbz>l?Cs9aCE$o;+5CU_Ibv?-1AD1lG-Bsw>9O<=GZdS`}dAKSiiNBOZ^hzr(np` z7l7spgyv12od2+yq7*Qewb=E6p zQ43D#JN(pI?1OAHRFgD;o9~MKa+{gp)jn z1>#-Uw^ZE1JGn6VU^Qn0wo=OCEFUKo*=_BBMpfi5+`0=AVP=WM)5B9dRPz#`PZ$Aq zb>yR{Z%~=8R{%`YxtJjGshy_nqWyGlBawli5;}dz?YzAh=zTuSX zx{d5+0aib|(eyF)^!va*{yI%TWkn@HOF4WZr{rMa0Ix7rVMLEjIn<}hl%XPt>4pqd|^5;iu#YPSsbB=9RDxZ__eW# zWi@nVm9CX`S;8JTHddgAKm-YAjw{pbAdIGtd6dMY9m9S(OlT*1i-LG|ao*fw&nfS$ zQQlELN#pPM1EBmTPHM=LB8+NyOn(^BPj0=nHuP2MtZNv} zZZiVGHg^|FMmSA@gsc>{cL+!M1hF>Bq2>@mSOwJ&DE^nqGI?Xxa&Y$LptggwlACs% z+8-QslK3LRC1Ha4!v;2WIVmh@wwpg|ri~|Qv3PLmcKA3HvB0r~+UAb?lP-c^WIJ0vDIy&UKxaHv)S zmb4cr0Sa#2kX=Z3B&(K~y{nuX5Gs*)WG=2_nNnh#T&wpX-LBpuJH;=~`mjS>5E;Tx z&Zcj@_#vA0`tz&~-r{dk*L})G&4dMiAzq9h)P9%m{T{TIvIrWp`TEdTrZF~-=$A6p z>|w%qfA=82X2=5clozN6-VT*IsysgS@V5rGyM<2@bs#9=mt%wtzcJ$#ydB+i&^o_o z%37gy4seIX!TURpC>2l&ityW^I%c2eay>>N&Wy%G9Fl_I%gPhd=pw~2#+3?(1X=hD z@nZH-!5)30HU5WXNpCbH;mH*%gHo1%IjXUA(GDl) zNjWOuEN0b0a`-d~y)a+DMSJMn?43UNF^Q}A=k*-RkqAHK7)1v5Ej{DU{?S2`%S{oF zE)}8Aq%EHWXvanYi9t_{KHgr&yvgsd^HIVF&F4_SU*Xr8k*I~NE)@GH^J-govTb|% z&hL2wO2cutZa0i@RC_eDc*iDOYd@$XY5IH`a?689O#HA=Esq$gbdgZH9#Y$1`y(p} zj-Ecay}7tWWFm&RQ{TwiRYOx6keQRfJ2sds)Yh;OkJK@;7Dsx}l+AeqA!O!+qwrsau&HANm?_IO19x(%>^NW}?R1_iW zg^=fH$T`X9Adya+KUTIoJj4`O0q7E$t_OTzNUPn zD5yvmr#tmWJsb>Os9p?qzs!K@dok^?Rmy$j>=ISH zMzjfkqi})xc1GA&=EL&psH1(d8CqYnkkuD6gyF(4Uc!-PVQZBWj6F2k`5M)hfW0+@ zs+IGzciPGZST~z{&2zc}%uoLnYMsH{DvLDzr2+TO`TqTD@uw?K=!ytsio{osaEFs?Sdh5Sgm>cZUzlD6WYf*E| zq_*Fl=H#%PaE;`4qYar@P%Oo9#s#*LPXcasONcXaw?ht)1?~iA>5ZLc1UXE9Y5L%r*~I^a?|D3q4F)a}{Hj-0nv%(ZMu)ozYLd#vZ_x;BLNX#F()z&}7)0_-^!XQRrZGr~RSr+*>?P{ZMzx1(fNis5$fQ(?xGOGX0uih# zjthrU)j~TCrgdr8|AimmyfsiS&n=4SBfQLGmAXenb}tg`J5Fifkb4Z-4-9|LO`;Gu zw0|#Hx}kwE??T;g%VFBp=*S8dmBs_WC5%R`XwnwfF4z6Sqe*@X+_UA~sm)0j76oDmYAbd>mF=#@s5BOzjFEE2oc!>^Ad@tc{i{r*%iJ7+-uw59Utclxu?VuG` zIOD8lMJ{}GumRTZ-zqF&XCLz5U?huBJ6FdSEl+-i19*ZME3>1)e4qJZ=Lhu(=I8x; z4`|-ePR;}WwML*o@T`estY&UF_Z-dpw5L0Dk7}HZ{X@bPH%o{+=Hi`gX2}ra9b#42 zOnv6s$P^kloJf0%NTMcI7K#89j6s@~Sajp;xg0F_^RilubcEa_aN$pIiy_1XhG4Dbc7^OaLp^dPGW zDH)pAtn%v*QD36_S3ZfT03UN!yY1fylLmcmkHX7;ZZ_#~3&2Js`@>?3z91gH#d~xI zYJOF@5*ZW4sTdD~oA>AmK1WXuQri$Nng&n;<9#6aq&bPbas-{SHBMBYiZyUz1>QE` zBltMcfDuzqxcMeop!e*3P{Jv8+xvptX?3>|_HSMWzVn8TwlWTSi=G|^dnDd!URI-x z>_m)U7qUIb#SK~Rx&OlORS*4mFl;zC?{hP|EbXE|bI&^8_{cu)rfc|$_dAQ{zTF`8 zs^>+&jUd}upXZ@FzsIiRiL%COgYAt6Zp`7N>0y$l+u*xv++nxnOcl2+@INh|Ksl*i^c*b&%?s9AiLvp0bG0;UR0zU}C7^gy# zjUAC+lT5zv;qy37d(MAz;7x`SJv+i#zdh|v0#g7W?K>XQi1 zmv=n{E0A!6H96FJIg3kyhctB|8~`XRo@unmg~3HNP51fNx9?8IVH<2B3(sGRMh*oE ziO?ybFXm3tsEKUlElbanC5M<+J?=V)ie*j!DI!A@>w8~m!WU1S-m(n)LIyiP?RP6- zk~ViM;gin9AfnoINvvrBta`?YZDd68gFQz@W2l?4ZP1SsLYRClptbJfnITh7%Uco1 z-vXoTnv`WSZQ2-5AN<6G#^h%e8U`&9pIz=i$*W$$dz!?r8RbJ>u1@5Qw(ch9x$lGWEgZj|c7C3GURNe10_+PvYI4Oi7>RCA0k;A?Rd!_!F>)Sc?MIUoM4T zlYQU$evPl<=O;84t~&eKtY{{IT5wKT8>l+6`8rYE)PM`yLBiZf@JgnfgbMD&U+!`4 zkpJ&Fj@H033}yR85#aJ#R9uA`)~3%NBn)lc9DDbiYfVlk$BfJ@7$yeHcg%N?sp_q4 zRT0)taU<&Z(44y`c8Wusw=j1nI72cV8auGrHoX#Lj^%obw;V!N_*{WhOZ9{PKBWK@E;-YYq%>c5vg<|LG&%JF$+bbdq0>L{6G6zv|_!xl|5*n_() zi@6p7UXdSirF5V4rKD_hR9X9#@Md2h3FK4EKj^E(>GX>IMCb5pB8Wrzu-3cNv#dT> z^yTDq50&^8uk`KW(w(X4O%AnF&ze}&<99cVM%m4%J^EX`2bL@iv8-a1fSJgJ;4K)B zi&fw_%{M8Eulyn9o?|4(5n5J}aLC049Im%U;D$!ddR1MVl!$`s%>aX#57 zJi)!6=?ULAyKz1)wX8~wq`Y3i(e86i*^E3zf_vaY?Ao|+kYTI;qb%PJl7e!K;OPiu z0}`!dVNVy~_QrI88(fJ$sZ-0P@23Q)Nyj(YS8M;vItxaHlQ07f$&igvqD!rBs{C6g z!X%`*o6@;git>A_m$>bj+iycq>o0ylzj9`V3yFokyR64JlzW`3D>Z`MXE6+&>U1^4Km@Up;VS`}uq+kF3|= z7NM%U=u`qV`iYmb+Y0L4@a7b(Ld6EIA{Btir&dU}sH_8$EpV%u9+C4a z;bVCCLS_$EQry{{gu}Te%IDLd@7B^;0uo>=@Nta9WK=R$^ts>%dK4b&vd?@X8*-SK zJx9+s$bgrVn2y@-H6cj32%=Wvc|BsBgOq;R7R_ccmc05#&_#?-L*6(1jiQ4zZUGq7 z@3!t&91t?e(`c6R>sBAfwe&Cxi=a*Fp^tg(Yj9x#e}Bpq;dmE3+oH=Y`|6eGm`;`S zWW$O@*!bPJgd{cXW~#ltb#c7s9WXS#Gj$>!Xjn;ATbZt8iO>5k>@Zj|z#W#xD7BujKo%@6D@D-=Ll-8d{;_Ku|Vg z#v@IP<8eRcTVB-RS3Mwpe{4%Y4Bl-Ba`Y?QsW?!{N!lkfWdO z&s#_g&Z{6{oJe4&(!v`=j;+O*ebO zDuX4C@7j^)ABWp@HKn158C!SR%*9QPJlJ^pW7YkT+F2j4KF!2fAhny^k_MokEY&rm z3X~$i_$e-8z~`CEZ3U)C>X^8dPD`JIZ#kR;WW2jz_0L0 zO!Z2ZJqqs)QL+`Q9L^{1V&?sxJ)X|dwi=1xO_F9L^>Zr~8x1k~83j}bf=Q^4y0SlX zn`a#Rn>vcRB^|3z(;>+J; z(cc`p`-#1VPH+9O@A8>n9t;zSLkCL{{@i*se$v|X{AVQWXB`t{`)T+%aLXSmPbmEg zL>eI3CS9!oQTWJYz|uTW`@<5 z!Yw&FQZ`;0B!k|3Lv!U6tft9m%VM5RP}RA`DdgLq?Ivs|qO=cU-<__(l|y)z;9^^X zd0`r?D6ClUf@jyr_u6CJqP3s|&k_cr?>s?HT2v$7d3r1XX*qxmBOOt8jW zsjXXJRA;F}>ibs1gGm3_bR6INzM|@e-uG=Xh*Q{G+KUkZ`B+Erk}W~c5%!nGa6#Ao zo)o|R`)-!bSaJ6(y5b3N^Wu3K&Cd`oG0CPAslfGY#I})`%bJZ{^M#vfq5F=aDb*i*MX{%*O?bViQ@$d&vr%!bh7z zQiF28rXMdMrerH^ZeLc@oX+c{blo+{fy`%;c+aQQTRn3kA*2aI^#i){zv+g>w!?(# zy2ecyZ0&ks!4gAn*)2d5P^0#^cX;cRaIF#6aRgHt?v%&@ARA|b$5EC^W3wvC`qir_ z`UQT$?JkvH7h{NDoiR*B(}@lLO5y48x>~)+iNYSw{Ox#uD-j27aw=&or>R7V*jP^RBL%Wnz@TaHqcl7dj12n zLFjGsEpJHN)aiQ6aDY)PD-hf^buHL@Uio{wV}v^bK_cDXAceOqD=*9Z*E$+eFtm<6 zr6EP&RQK(@{P9F!{MFuiB0I4V{df*71Ec2PJMK2h#$Xy6(rDWs{N3!@z6mNHjSVVB z<|?HJvo+ge846$RO{E@1xp>B4kOv4kC;>5X;!PuVfdMb;Ju30*6R$$1+n$Ko>rO?C zIK@c5V3RfW`SViv7Cs4tTWW-pI~Lh>j2M5+oRZ&+|Lmv4OV6FOpdzjXNT|9=3WRPC z5v8F#1+K-@!IxuF#q9Qe(*jew@x6XC{x3mHxUTH29n6qw5=41lo^ECL{aYZeWWcu0(rm}D&W;!?BnOVc1_+**O zYa(_HC9mZhoE@IAh7Rn1ltLw>(n0-QKAF38vq}H>FO#|3z$t91L-4 zoKNSY>0;~$Yqe|3GH$n?Gfx7q78tWxtx4blA0-+Z5+4yBkqhlnWz!myOXtLm6#Ve0 zv9m7FXfQhDreV56%3hvUeWpXbM^(QWpb3ShG&yAXt6hfO-=wkXOFf14O@}rZk7-c5 zf4fd$OF!-6=H33&K~^R7iN)0fU;LYy&?-s59FAkSNIm;SCa&y0m#h)9#e~{DjWYNb z&H)boy>LC={PT$=>R-;9=L9HW?}n&{D@o(35FLLTCayGudO=`YnAOfJ&4=1e2na&P zJlaUUqzij2_~6cNqbCs2qP7N8-#3JO{z>9}Zh^!AICRVDdOISCfnEpYy5D^wiLZ&9 zNlE9(8?on-y8dLoSwugXRC{Ry@R6sC_T210GlCCd5C`wtnx-Crs{(EH;c!drb=%VO zN3%=H>MsowGQZ|SkKWA9zx_SjiSSc<6g+>cQeIjVuszO18;s#iseaAi-H(FXa!l1Z zY?M)><_w~79}*s)Ftd(}+Dz{uQ=&RYNgKGoy1{uM&^ThaUqGtt*yE6_=2&Y}F(Z>< zX`(7yO~_&s?+a|XyJa{rKO^-L|gx6 zUd=2f$b3iM$M747jQ-w5;Y9GPjRIPNdE*N^>GM*pxTw5m!XW3H7hk;9692skML(h>clh=eGyO8tCGYq8 zt3MMoUE!bH@sdaPWw*RAM=BZ&yYpO_FbjL3jLt?NOk~Vx{=I~TU^vcofw5qC z=LA(OXYC8$`UK;bjp>8q9KPr%EDcxAL-sq#-%J*N6u@cXKlEF06aa+4EE=??ag`;U z`-M;5;G*pB{5v=L$8o=86OP7u7L3!?wj^3w*zNuR{g?GpG}xlw@QPA-oAnp2{CW?e zglSDAEIR?{W618Gm&jO)aXK3lr(q$nVO1o=@8NTqZh?hOz}_7=`=KP;rjvH9e)#53 z`DY5YB~f?&0k*GaGnhUQ*1!6CDv0G8d>|E2yA8@3Nes#SqKQGWd}9O{(jNW@IR&IhJNGE$BI2GiWjHB?csqVWrJP-M81w;~xT-?JSr2C2Ur4?f0xAUuHVQ@nAN19`j0D ziJWA*F&ulEoR>?nldn5M+%*@DVGBXhd0aWXM74=uXb3@GxqK+Pz1;O1eHKj9{rtOe z>_&bGeH2lgoKMRaqhH_h)L?e`>kT#5-?|HG*66QxqKLI04|{Nrm=SQOEg@*^Jj-zV zFvCA!98v5d6Lu8wtaUF2mu9AC{t1M0LA&-B^Y*ESv`9hkXf>BNcLO><>m`mSCx4&E zB9j+lbnDP)GT9BF)klq&3Yey!hBL&*<{;gvyO&9S##K`j4vk00PO@LXi7_t!DkQ$_ zPGcWwJ%e%fnvb?6@FqQ1=4RyUagubP%U=jmnLug4ZZ|4 zG;L<#u*xLirFVLF*0SDlMWSKK%LT5CT#c(W(^kNXuTVSBb;U;BrtpAl$#>^lr+RT}iSxZ?N zbmrk!buY#gU@|VsPJD0}S;p%pqLskeGG3_q^fC=?Zxu5(t&nx^UlEOJtMq3+M$Zi| z!q|+2sThK_ShDxjMYc3oMcq!+q01X=&n|>20;EDOK?=ZWG8eN@X26t+GE$L4vg|KJ ztYwZ0yOw3iP@!vc!H~9*X8U?;ZThfJqYHhzcPDPKa%6;oX-y3n31(N=pKj`3RRi${ zzi_mDtujHjd_9m4VnGL}#w8Ff;>Nk(YKhg*TOr5h%FK=R6uVm%JY?9c&uRO47fj;X zhj~Bf;Hw&RN6NES{*xDmGR?OjV;gofJbLO23#w_-s2w$S zL#R?vk&I*4vkOyI4qd*PLzc6={?zD_J#^r^_8^ECW6NiZ7aBmX!=SpHB$P5F945al zPXvpkhjk5eyvy(6Xx#yS_FTl=Nj$~ptB6a^LBD@}pPejg+&Vv4!Y;=@DQ+#oIw5)c zx#d1Y0vA^~)KPMhSx(BetR}abmrJS+sTc*UU>zs^J&{a@ibMC1f&Ec~6bT4j+vkL=OXg-z4=M0)X5D~!mNMVBTvg*5$=0@D_f)N{&i#02WZq`{MLJpfBepZtr?${h`&5;s}V3skH=ZvqVc1PJkC+ z!7S^@eaP4*p%WEM(98nbv!z%34Nv4D;&_D7d8Y06RUr<;k!cCn^4*0H@Q|ua?TJ3Q zM;WzO3u!2FzrlYJ9A%w5+b@(K17fH0>H1Rrd0pRC9)=?1gk&|2ET_R9<=!4@cBQQ> z$_#bC2unAMwZ$v5u}@3PO(Q~hV3MP27NHy65@@RWnw8NT<-?!62Y4|fZI@iiTC>t> z#K2RPg)MkkZzg#v(0{e@eBrBits?m;4;eAxO zI9|@B34~nh<3M=7XoQGDuorDR_WyF=fp`;BA_?Im9Gop5>cPOpW`TH4^g&xGR?O)Z z!A_bY?iq45aN@R!UKBY5SOIq+DteTqf%M8#mBXy>Ew5yb6I!%dSVlO;>36jA>D~rv zR*3Dg4l=qHGHvma{>~dWvZ_7C95G>bq4>30@$*j+omwiZX1o=4`FAH_rb>3rS?T@s zUYb;z<#GByfq&WcqcxQBf*ybF_2tuT@tI)d_4V$n+}qaFDw?gUQD@1=JeImUCaU(Z z-R6hzYhrvx+izs}O5zeM`<)2%OYI~-PGvl@<^`|uM6@FR4Eq=p9>=JKmK6I!tJYs&AsBgza%(Ma3`uTl)ObFjdqAtKH^?a5=%?E3Xb>iJ&x$NkO`q4!=2QD-M68KWFi6EOYMJV%;_QRuT*p@d*R*c58&$hn<8gF6DCrS4ajm2ir7s^ z(0$)#6R$n81N8g4*+Cf+BZF2JlwS29>8PQzhfp?3n2BPZ?)RcI4CtcFqf>hH^Eeqn zZTgk1*VQ2NSdP0LB`C~py6o#D0+X=|b6`BB_DjSq_W5IXp2OF9l}L?A;~%0+5?YI9 zO%OrfYZIrNM7kmduY5~?m^R6jugabfogHUc`*mVMNP(YoMo5PD^h%7MPH`n_MH?Su zq&tI8;X}R6OVxVOPh9TEp{bb%r*^pGv7dfg{8hW%4$G8N)%}(9d%Dpec3wF@Ed5O+ z|H)%bug#t%m4TjWL%B$o+4`l2=rEr1FXZKSPm9OW{wA);g|Ss1i>YLXpVcz*%D}%E ziw>m|Xm$K)>vPGX=#OaZOI>ECUjX)-j!`X+jN?}Y5}-XG=Q_ZghJTjB)hqGCNWC#G z>9*lO&NsJ0-4_K9kR!P(YZf~ub+x6_cTVo@*W;v}#tk{>HFz^bK@C3^Fxlr~)`I87 z8h{zGT+H%Xppmw@T5gx5usBRk@&ss5%BWF{3%{McRNDKx@p|}-Z4{4nf zGP~@^|4a{~F*XMMu)g+uF&yC=Zt^{aVJ=Jr0MqZQOHB~iWiuk-GbB)Y`;iV-gvh?S zpFGIE;3N;)sdSEwv|8_oqEbK65V+BR*?+2Vqj1vRzUAj;A7vB(M>k#D&Kk-%qi0VF zvV~w61TZ10do6x3Xb;d{Bh#?664%hybwlV$yEE~mH`P|QG-5x^dO(dolIpPD{)^m> z-NAYNs{1Vd%-LLHU%SSr(UNgycJ^=tGrl`fy^7xDh0W=_^zWeJkJ30Kes}{CEJ?_p zov^;(YKZda<2mS1rI{-~@ui(IDBQ2M#4=jd=!(?H?naQ@NJ=`CsAp;#Hgs&J4?b9U;F^%OTMQ&NDjq_1X>zRKxqE9PqHkt@e_zUMn<{t6-FQI z`XF0(!1B%qN=N>D#r`R=Hif(S1# zD$5Cc?f*I}ogi8ICc}hhcul4eD@`N=`>*Oh{K?q+?Dx@W@82@n>^ERqWS7@SJd{vx za;r%3@h1)S^?qWvhL;%$HAvIc<%&ULRXp;JrSLW8ibybYm-gm)l_!e8ZG09fG;dVD zc*eIQo^50@OAZU+imEQ=RWuM>OSj=R|5i*05`Zc13N;!(a+mpr690h z;+i%2mTws)b>)F#$+?=Mji3e!_l1n|WZ8>74GM@3;#rRYA)Gv&^3i`NZtK%ud7ZR% zzv!`eWW^1d``AQsuQ%C;txO3$4xZei6h6ro+Ebg9vSd%yfVE7psyn$41xkB8|})WMP$UClFAn z>h-KO|M|zkD8?A4gwrPZG`j^JaFlg|&;kdx zDzHNW5sTRMPDM4tL9XsqgWy*2z;F`l0NYnLeD+R%K68jPUkhDKX}qgY<>&$# zM}KhA)p(diA#fqU-n!mLrVCRLpubbTtPhfnG~=A289WA>u=Kcj>QaF2qw#he&-sR=RFt^Nxu(l3(Qj#+w^miyt=Vc27j3B;UT^=Z=EnS}zqFSSwq^5aoIT&GC{eb#?aE^}s^N0> z*dXtcl~}!BEU1q}6gR>V-@;(J|>XOC@fs&7sD$uYa;qV6J9+= zHr|~R`4nVEH%b$&iR?u<^wZqzX0FTvx`X6ELfQCg>+V3N(%i>vPBPDbM$PG?)i3cq zK4K~=YvE+2+h7CTC+iO}J^02Lcwr+Yxs~n@8VBJknl`s8lSzxy!DA${j&)yJuBGAv zMKvVTL~`J^OTB7gOBHOn2|4m~!mJxHM8eO@tfJ zTr8${LvsQ%{`1?V_WGNU%@{BDwYSwggk5pzw%1|7;}~9Nr_ziZ?AQu4xe)Yos|YbM z+fwSYkM;>sDt)L{Z;6@dmF#8Mq$Zr-`)AG^J~Ty;(Ta`#ep=V$0#8wyK5}dBrpuUW?iuGuJi<6pNw!4C6m&QsZDMjXq%S#9aZ1jSBUnv+P@#Bw@!a+x|dgT)e-T%e!WS=jz6tti^E7FFk({xUAlZ(v~hLoTI|(!BgMvB`qqAZlz) zAJ)t1zWv5+pEyyyB{HG9+H(4YX-dW{Jox&Dfv?|7PtloUhOVexdV*s(D@BILReT~b zz{?>UJ&ViA#815hHrn3{wHju471DXa{8v`}E<2_XMz4DhPg}WMo4@d_K$@A_AxZ{7 zGLNVTD{lP^;@jsilEy53RYJt)Z>EIxMEp$GEGOlyS|f}sg3RpJ%(LR_Oc7>Up5v_6 zdZF`gn@N6po%VDU<(^SCTA^3;j{T+i;>r9k9bo26>@6mvo~Q1S8$GaD1ny4Fwc4%M z*R;wF8<+1qyec!A`qPTxEj(8JQzkHd5l8zH`e3fMa*=jTmXWihWq=%;`%x0x$${bY z)B`~V4MY`}x3qSQM(H2WEa)o941PDsDJxdWyC%PzSAP9VO330cvGD>^JGinPZO zAC8-zRsN8EfgcqcQNGISd!o(L-WLCW}AjB4?4xI)Xl^)LfaY@4vvc2W6<4T1M z7n054m6^K6s@fBo~?`ZWe}j6}J!`apA_VTF2-fNVx%mP+p5j zjLDmMce>&dr7%d*h@Hsi=S;+1eM4Zwln+ap$5u{r0d%=>w*bV$=A+-uTe)OE^@(Jw z%^UG6xg6R&oF*&O!sEJQ9n6D@eZTIpJuWQH>r>JA%?cPFG?ie^uzXuR-rP!|!eTWm zOuiDmNWf(X~5hH5Fzx(2( z5`JU<*V1{1v-!S#xJr$piYjWgD7C&?YD;x!QM+o!u2CySNo+-H*51^pJsO*Yn6163 zEfISrF-u9w`}B9b`7?h!M{?xObwAH_U!U`=eS`)U&PoF{Akgw6$zSZxNoVzfs#!7( ztCOqc1pj%hoi+%VOFz3(!VuzUH7O#@bOH%Cjrit5Q!8BzZ=3rL_L)+8x; zMa#iOtjkGC!aTUX5XaxIEf7g1ll1;UfW{jYn>aulVQ=kXdZN?k~5U~?Lp1NLp z4&ri9wv?nSAbsC*=%P7@t#{boy;BwB^0R^Hiahb!WyQBcH$<`bCA=sz~F3jK%iG=Fj68( z?H1#jp?@2ldguZiCN1X#+<&M|77wI~T;zSXJWng~?rl~m4~t_J4h<|n5Vjq=RKqno z{+2zf65Z6cjlYL#5M}p6Gq%0UQsDJ|#QPLHTyrwWq+1zb%E;fC%A;m_&=)Iw&qqJZ z+59XQAz-tMtx8(r?r7#mP87lxo=%1FMcfBzN^Kl`lCuR-GCM~X+ zY4U`IL?aVHqRtnZCZjGvu> z&>qpkY<2b-TsyF3ySw%y%GIfD8@hSeBl&^B*n|s)y@}HGh{IQFF@Miy;i|Ubq_^2rr%%l)jset~+H;qb zO>bzDM8s}uN7~NK-OaTajH+wA=Gc+)JB_U%Ud%AO)TMKcivoGAFAP44v2XQ9K6d*h`c^hS$j+UsfoSY7uzioG4I_oTb7SwXGRWKIEkRyr2HzFD; ziN1rh77*VRT1^J732&9Q<#UAdSHxbJ1L}Lbb+1=aW7@GfC_i>h@ILMN4ME-V$eq=x z@r4qaS3--K-;xF-)il5A_A3M;gfS@tW;vZMO&?!V)t~TfWIPB}7@__mx_9_ghp4J5 zX2gtK>v1~N|HC+NbR@hGACMfB0RA>WkVaBf+po;wIn$+cyF6w37G>pCs;!n%30g5V zsmB{4g^fz08Lnm1&dXcsT)9m1XqE;sBrQ^JQW~0O!RjqA=eV{p+{*pZ?KJ1B?^m!^ zIasE)5`GpA=V+TbT(KI~4uo&FY0LcQXa6&Q#`$X#F>D+4J-1d*v{mJXuh5-fw%P?& zBT9#m*9RwqDQdKP4^cYn)(Jv>^EU94zMGg*aU9)2k6I)aP=!`x?%bqbez1`i~t0 zUgvgpHtTn>r)RVblZH1RvocKTM-Kl&(yDmI!9f=f3JDl{I**FQU6UY8^TDRrXi&-7 z@{3GJz+UlgnADKp|DyqB=zl@Y<6Ii`~;K>3*3o$Ds$k*`Jc&M?y3 zx_n)4`Z1|C`2zFPPlffB$_CVa-H}!heoQflunoJZi1vmzsQAqN)p7m8xvqENZ3PNA zbXq?{*`&+T<&9{w_i1sv=k5YX%UO39XMXyg9DDluz zn`^n`1XE@xH)-dy@Ev>gL1Oo=wlr?MAma6#SGt;6#d%iHd-It=3+EFICfp?Jqw>&9 zi1&xp9|3nZ3BZKyyBT^tsHu$a{(QnCREpzD^lCxm`^?V*qlEL&9@82NB)7ytVyql(tGO%(0NvQB)9- zQFcp1&}10K+({)0buc~4A3TF*L3UfK-xN(XNPWW*TPIp*IbFof;^@-Y=_!Yt%a8z? zDp$u{OtS3jo+trF^4yj|$=rXv&c%@8^1idHn|#d-9%AiIU{X?}ecQaps7h8E&zR@$ z3Td%fl>1^1eH{!d>s3Mz5QaIV-sAh^J!SsYyXvgeYTb9t^v`$GF?U*SY8kPjTJ7JM zye;GXlf2G#;}x~!HG2Ws+sPtfMpep;7Ao(AiPTlKt1Nx0?~`_BTuE;Ne*b8sK;K%X zua;Mo)aY25XOz1N&C;GY^aQa7r$pC+F4FuRHEtl*nds{?hZxUBaP#|_p4)F zgh>4k9e^BN7imzn2{sln6YI?9!tY9F2%^G?hp&bEL) zE%q6tWMeXdzEl>I8?ftfn9d$6T}79UHL_Yz&Junnx#Sz&F?9{z5vIy~V121~8t83`P3+2sQ%{^3S&y`}3BOtSP@G z9op+BCSeacTx5-X!XZvmF104rx2uY()Ie(v#y8d_;1H211jDhhK_-J}`*0d{^-b8v$sS1Tr^$QBgvH0V_}M^oZR3~;z_KmHrI{qgI1`m@ zA95VHw)0-zLuS0)fuQ2I9izac#NFx z#rk&iq{8mD>PgP0e6S{WpZMhlNDilWy57kHeo!$bWv?E#Ia6}B-PzrYfkjaif)hO; z$*wwRbrmryHjaPksqFHZjv4Y9cM~fe+_~{^9|P=DKn;I00j3C_Hx)pK0h`ykU@wQ7 z@qIHpgOiVemB=PflK0U5f;QLj-=a`VjOzzPTQA1rBlxnok;7sEiVqZ{J#lXG*es@b z0a!XF9zv^!AeTZf#$D_X4Z$%NkXf$Dt|a@F%`PfjW39K-eKyo$|6^E1oHinuK1_Sw zTk^H{ifUUllJYc~&xYukpln@G3s}r{%T2MOc?$}8!b{xVPAPystP4^awIVPT*OHKC zw|)&G-J&hQ=V}7xhRHRod-64}LnL1bzI0JO1t{s-rW~k+yI>RWuX@8+QD3yqLgo#C z#@-RI`cf4ie4J6jiha`@Fn2spekSO>gzMz6$6=rs9B3~hKp{JF|J~+dh@X;wx0$N8 z@HlHL7R>}mVh1!I%i_JRMYi#nKd^FMB$bg*>^3Ccr2%j%G}45~+a^{^ z^uPF#VgGGd%s)%b+JJ^fjinkq0pK9iU*s>;H(s7?o7panTz6^K1^{diTmQzth$V`Z z1#6qjBE3#>Tt1w>&qAQ$n#4bRfI4N>d=Od60rbbe0qA-|AU%eOiQ@jF$4H4`g5>J_ z*OjfWKnkgr_@^)$Hrcl@i6~#YXm|Kz`KgY+;#TI*F$905T#m|tQBLrEot*vJ)v)m= zsI*ZRO%ie^gkxF8GF60ZWhY~CFVM60A3&gV*oL!XSPXd9q9hC~3FK0QgziNd-+wLI zt9MF8c{{h(CIF`Zmu@C(9CaMn$~}8`4>{H3VwIB#(4@~J=LRI z%cxx_D$+{BtUjw{o3hWZit}((f@(S^&XU?GynV7uZMV>MLAC^ky2^!Tll7mapom%Ra{s#0GxGqAWkreqj-_IV3WJv5iCo| zai##bpI@~}{|zHr@hsI^#LwTb3K&zr{811-?o)1si!VM1O=6pPY(-5eW2K(V?@2@_ zPTYT8g&d@$CxAY0FqP=d=>?mDD^-0vFgiWh~;lBlEW{>4-W;t*H#(xsUFJ=f{|WlB!DKCra5RIc?sm zt47vtoU4?4^(j0>OiS$`h&hIPB#~5pGF`JiqwV_SXH4%5$d|j2I|P_;`q{xB`K}(O{vb$Pz*BH( zI+;_6jK8|6btSe#QzyNEyLyefxJUfKph6eoFki8Ync0*y_L{f8Iy;chSJgGAhU{;h z?;SMx3m8#IZlr%86a%Ov(!F{h(#IA935RO4)EpmvLNfTvma26iKv_$-N<5p_f6YtKQQ8}! z8i|P!#Ue%phPD**M$0z=m0(NHPr;~#P=zQUsWz2zCy&oRyi@kEhFcMXaH!5V)FrrN za@Nm=6r{3uts7*yBW#6;gtR~8rZ7R8s+4rZtl0H~6qy`Ff};Rz{MDNIGWabrb zKG1te_iG6tgLFJQQPRE>xD{zUVv+W%UWS-Em$fu)Vyo#VAfdr+WRy3|E_U$+^PT;< z)jJtZ!*w#+I3}LOJ}n93J+}3<2XZ}Y(i{>R-b@9JR5CG51?8th{M!kzjA3)`i=&TO z+NFLgKRQRv-jsYvINa9|@0Kq^m*>(+UIihOYJT8_34OQ|p~e1sZz*YApaVh=xr{vi z)2=m8K3fsze4%|JfuwqxLxVdR7AlA*Y@}`^f110y93cT6;HL@A{$GZj9mpq!&4Ye? z$Ei7u3y;6_>kJCVxS!{hh~J@z=w~@#q}h4cQ6E=&F0i<0?bbV?FmUV30ax(CW2Ete zJpaE!bF-N_`Ow^tsA(^mmD7#rqkqqK9^fT`wfMqU$#5U!lS1jJtniyc-4~Vt_m0&l z4!&2mQemynOY#Uq6($}Um=~LL#pBY~<#ALzkhEWDiL3e)X!dTgtOaGnKtzgEk$g7O zcD7rKWczdIP%5CEG(?kI!X<72`W1jX*WrF0jV^NXf1hF*$+jMY(aC~5M;CujRALHKzk+92%uNpHQ&)!ysS~9&{(J4N;#=Uj#*Jtm~QG$b=aCTZN1Db!i&Kt8a zG&vdbt^4ichD()R82X6&&3j)B?>>lOjNV?8+2v`XV(sQW#q%8y~>pX^;+1Tqpg0*ysemBKVuzZNDbGO3`+Vne_&5Mx4$r=LFH8dOhMm zH4a?*QjIN}3U+7i$0@s7z+d*Jpxi`VR9Y#z?W8%4DXF*6N z+loLBvypmE$@8d%5|1>K`)#g~-xF2c4JlzEdwi0PhE>9~k|f1|3M8KQyYB1HfYL2| zDGY;_%2oc;X8-J3H~qm2x4LWxyyHYu=;qE4%S3M6H}1_wJxY)VgsbQAJz&0FhMqf7 z-pY4YH}GglYl3Xy9qbi;ktEpP(favIJYXsVl7E2g(d7P9{~oNzC);n;WLQZz*X7(i zBE#OrE__ER!N>CSuj|d9K?yzYZQ}MKmbh2G(WP;_3VtF&SzzHyBc*1)+a2t4s)6MU zoe_Sd(M4F;yam|hV7)D~tCYP-q-4Hi{pSxe&6e!QBu)F1rDevmf6o)1M4-<5MojNr zkkV}hCqaRombN(dw)-9Q*hiUs@~jB;O=&N3Gbl=MPqRy^UA6D|4^ z9kV}EaMl=85!~inIk{_lgb9I)!V-9bHcG;HPL49g`--{kryN4x)4qgAReZkJIp^?S z)SC;stxL$Q6%=ObQQK&;4;ue~@MS*WB|flLR_@BQu%MY~dXSwt&^0pm*IEQkYrBkRhwQmGE!m*oL)C(>6T3Xh6V6J>Ap9U}VuRBZ#Gc zQK?gtuRL>5l0C@EIpqq0MUoaVEL;m-GM7Sh2^)JtbCNqB20WBhYmQqYfF}NnBBseIy=S-^y9pOg}EgM%puN}QmtBYHd41MosbhTx)- znnz7E1?#Z-QNu5+nA6)gFVAhXr|^-el$+!`GoatQ>7g^wgeO6$i@yC@ z_AB{*{WV?@kloK>zlXQT^{|K9qBfslLT#RJhO5@0St%Dg!55t9*HUHQ#OatnHI`~x zrn?z>WTnGiaW~Od6(QXLtDhtc<$Bpwrk)VzeX+BG+lf9~eME)zJ-mAh(G%ui$M$D> zER?s697?2&fe7)ns9mG7exPizr;B@uhHHL+)R)=_4 z;7qq<{M@vjyUhTY2KJ`LLmtyWp&M6zt`)Dgf<2CCn%4WjdX?=ZpK6lyIc)U!y;YAa zQ5KIx{2pCM#-TvzlVc|L!y3Lb1rx&@4p#X4rblj~Gf)_NR~{Bdo!w^QU(yY*&ugwF zbEv<dDyPPOr{3pM-(&Xh z#s*>}x?sxtY%9_zP<~Us9OfO>0sab!&|nEd%EMEnkyS&?4uqxjJdlV(2@q+74wf_QYGGRM8-JSuUZJwfBNsg z>@~|_E`x%l%5RFyrq02{W|8a4rAWUkFX!~2>vYa19&m@BHsc97GntM%2LaC47L-TS zH1?H0{yg|HpLK!VS|E31MK{zML~iByKQ~``vW*HfeuK07T`TgXKNcS>IhNs6RqQ2W zMxNpSx^UKI0^AsR9ZH8K4b?;2P2=fEW=?m|4f#Nuof@cYNkdBnGA7u8kODa*w#*E3 z(fcke6t^3DLe`eXz3K()k6Mq6^s%N;5(3BLR!4%e&k*0e+-9N(uii(`Q&5c7UO`37 z=E${38melBX0eX0Ieea_@3oStM2NbkiooCY`e6mvFWs%}T!1 z>@At?fqvv8L|9Z1pVKbCj&w4CS@?Nkrc~A=n4l_yDXA{J{;3!!96R{OmGD={VWg_z zgZ0GEftQ_m?QRXd7Al6F!v|8CTzxvPJMettm`A8k(LKo57~H)8FG@;oq*sHzQxHh2 zm298988$UlN-+1fiOm!4Ro|n==3o+BJo;)M~6c9@}> z73>hsNgpvmPo&k!hB`2HGbU*{pm(q|tr-KD8=}*!Kuv&6fc7#QwSzT>t@`>wRZ>q= zzlP�z4=w%k_CFf0H;n;jut%V_i&CuY5(%40Is<7Wl1Cb7TA0pfUY;vL;z$t+1gz zf?+*QMchuk!>k~m_?<6&m}m&;WaP$LpWf@W?dNAl636v32KHVB*jvo8Kae8_Qxon; zp*Al?s8E}NxW&Vyc+iVIpj^A86wYQ_i71fkQ^Le{ARYL*fKT=^Icj?^1c{O0K*~mL zw-4QRPATlj3I>R8`s7zEh{)3=ly8>C4Dy~zC<48M*xsTfjBqQf4rmrma|{Gcxv zPO|@l3)%?ud)p{#>_<5HIJyd9(9R%?beP$?&E#829PP>No52y4I3M3LI%oZ;g^wxQ zgfEy&y0@p+6>=CejD?b4c-p-FDbmYf z${K1J)}5(9&W@BEwb`|Wjha;gp3#)Su7YtYo n?03vM+F_QUmqA#(vwuM%>*xkwTGr#Q{Clar)Kac|ZW;1_IBM&m literal 0 HcmV?d00001 diff --git a/doc/_static/no_cut.png b/doc/_static/no_cut.png new file mode 100644 index 0000000000000000000000000000000000000000..de2f4b80d8d2d12b264e4476ac96b92626ab68e0 GIT binary patch literal 14827 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 N0e!bU^^O%Q>ffb_r5gYM literal 0 HcmV?d00001 diff --git a/doc/_static/parthemisphericalgrid.png b/doc/_static/parthemisphericalgrid.png new file mode 100644 index 0000000000000000000000000000000000000000..20036ac4429d57cb14439801873c307d4a95b41f GIT binary patch literal 28002 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 literal 0 HcmV?d00001 diff --git a/doc/_static/partrindgrid.png b/doc/_static/partrindgrid.png new file mode 100644 index 0000000000000000000000000000000000000000..b90c7913e18d67eee523b677af36f323ab42dfbf GIT binary patch literal 32202 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 z z(r83XR58`|K=hEgYu?w|0tpe(sNgkD2qa?rLIRysF1IT+O&*NaSyd;D zfv64yyLO9zBJ~Zjpv4KGg}wlbjWr3#;i9{N_Cp9=djO42fJcBpH20bd8O;ID f@c;c`l*Vy7Mus~ZcB&N|4Y_gc_SG`OdvX5<(b^Jz literal 0 HcmV?d00001 diff --git a/doc/_static/pipe.png b/doc/_static/pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..c3193f119c2ce3efddad5b40533963d88e3af2d2 GIT binary patch literal 53339 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 literal 0 HcmV?d00001 diff --git a/doc/_static/point_sym_before.png b/doc/_static/point_sym_before.png new file mode 100644 index 0000000000000000000000000000000000000000..dec83d049f476bf50d643367b175808d97fa35ca GIT binary patch literal 9265 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 literal 0 HcmV?d00001 diff --git a/doc/_static/prisme.png b/doc/_static/prisme.png new file mode 100644 index 0000000000000000000000000000000000000000..3a089ad1dd9db42d49be6a0aa6162a2137c93f68 GIT binary patch literal 10061 zcmeHt`9GB3-~Z60_f)8mLY_aP$V&9H?pTiNX(3VElrlnl6}b* z$(k7JFi7@gP__*D9-r_1)BVf+4}2bv9>vwUu5-@o^?WVo`8=V9IBm}TC-x%{2u>KQ zX@o%RIfy{88~(!%o_rATIEp|BB4AAo6Yt~&MqRkDcEIRzw|PDf_TLA8AEjR5{_y(3 zf|`wn_`ez4vIk|`>NdX5RTn3O*U4M*#8w?7Sb4=Na*J~GypCkn)Lz2wd&HZ;$^02S zQ;ii|sJqWS(DE?lxTMv+tF~7)C#SC5z4_MXhQam6bFGp>(j%4C59tWRQm(*wz#arb z7!4y3Y(gl6pgP2cKt6{MK?o8OaY&F1maBasCvV_hv+tEOvDC~eV0l?>`}dSSO(o!$(!W=Yhbnh&iL!ku zaOE>km!M9v9(EOkfAaY=Jv1y5G_Q$1q>Evzgvdci4|Kko5DI$*!=`+O9Q2TGIan9? zmJ+0T7_N0<{jR!Lhr6NqFd5 zr8bz9BxrSPhPkGLVdL{%+?;e^t|Pi%tJ38he|phmBGW$oZO;qr-}d+O$3J<9&cDD{ z`sny1k5Ocj9{Vxykqj`|0Wkm4M)TZ8_%!rtzYr?^2Qc1i96Q%#h>haG4JGuznUy8J zV59;Gsn@eWmos303Bp%*8nRy3MCV80*w^$Sw$>TQ`l}||{ zTYwQ^LgXOx>}PNUj$H@*h$It@SoTauPju9GR{01b{|Fw_e$$F?eRkrFd&&yU>C0AgXGbH4#C}{U5eiAYn*r*q-WdkGifH8c=UZ_ObZV45p+NM*2iosLkNmyM% z6D@W9bJCSr=#?L^xdw*q>uCU^umvhjt?+g(CFs>I23{F1be4=Rlnhp*2nDH?e|&nU ztah!lCOM^)&3f|V>mnmC!2h>Mk20GVaEX0{N)+^Pq~TVM?*c&o;6WwcD`%Fel%P{2 zq)2f*Tc)l_^kh;Jg9*O(9g1gOX5lu&0MVcCtO4cNV|Ky2r35cll<>ks1YK<~E-&Tb`C|2`7ZHg^0G#0&6q zo`ghdzI54tQbbk>6%Rvf@4v(93t$n3-B$)Y&{0pZ?8BX^QJR>D@30F}2sJ%-3M;Lu ze^t&f(#p2?n_~*n3A}VyCl&MMWVj=va_7@JW>b}&wH&~dM?~l9Q%nr_L!;N)i_Cmi ze_dNAxuXxsuo@h(n1x@&-5dTDdI_-X~zIyqO=8W_IrTI2I4Yy0jI z`T0mJdxlPRsPeBz5NVN$`SmFY7rYI^@1U@NSCU;s&a@KB>ngDx3^pfeiIyt<{3kFX4paIt6!n{9d*e4t=zg{G%=iRT5VRHb$di^4a z5^R@22?CDGzvV!Dmh7D!N|Q`M?!$oan>gvE>kB?u_c0XsadMu1I}}7Cn5r~mkp@rr=|M%{|rg9h54edHG_4UH++a09zlWAO?zsQo$g zz*9*tG2INe;3&~=8SUq8H2!Vwi}T%a3A>fi9|v}HAKwXuMCD2;xZ-``ljr+oLtbRM z$+==oMlE)|kflc)tiPUOk?;5-C05kt2yyYL66#+JIm_amP1jK{wT8R2*X(VJ)&7~G z+=bL9No99)qn6sCnxmi&h0cEQFhUncrkv+70tHI@3|XP5yq-Ffw-AwX^H_|rVc!wu z_hB~-?zk3lzPtimqmYz0ol2&8e$)BI`?X#MqvcHLrmaQ+FH3e!8k0~aXA(!}ou9mE z3f0HWgS1Bug}l;ZZMs(aIC$q1*_oJBTdU5s-_&zy0By!Xq1*jdn7t`4Q-pZu?=UkB zza7zSqXfk~hnmDQJ}Oz9@Au^V*oR}kzb&}V7nBWZ<%5|7n)%AHNa2HT3xQfYmS-Rht9he*6|ZX0ng$Os>=ls|*NnwVfBK155H&(L5O z7oku_1&I2kj%Z#}r9}2dC%tQS`ne7=f~yPu~gevPR4FbmxeJ#zWd_a za%Z0yc!@3KTlB$R_<9fm?=F-^1()h8^&P7BZee{Nvis%LRTdFBo!1T5zJ3mQ-LG^0 zYHg1EiZez-ed=e8Y%w|VdSL_CqVwCnF>>AOo-}vLWd&o?x%%XtPpLUf{{0+YzK`fQ z7R*?pJ-Fo&Zq}V{LD!X?x_kCtgWgH&eVXW={%T5a-39;2qxF+iY2|Zg`>(X1K<2ND z53O^}P3Dp8*SeWa5$V0^kP`i6#f?2on4AUYYL(j2^Axta_<*lpU!8=AhqJs3Rm%&F{rJNM}ki(q`n3bZnTHiZB+QiuyP$9R0R)MM95kO`cbN zf~)bMS1MU${jt~AqYo2cb!#az+tNL2jdjML$hALM>y#E)0@B>H-8Mw*Vi z(h~~3DKS{bpPi*u`b9F$Q>~2_+I{D(YPlRMeQ+jn6f}XyhYzdEX`nRG$KKDC!1`U^ zVZ!E{z_=T|!gFu+)^M|a0EqR<4h+Wa8K~)7Dim-3n4u+hW9_X0Q6a{qAK$Chc=2rO zBy}IRm0r0(!~3{MA6>WFHBGeVd%`{<)#pe~u|Edyl|Al(w#AV9BX7LN$PUY$Yi_+O z{;x<*5fv0&PJo#4|4Kcnn*)0)s>U;%_H2ltF~VpI1XiCr+Lhvtre|^>dcklN)g2tYdDj z_Fd(J=0x|5_(5|s)o@YUoz)GUfe-%-TF1*wfM!ffzUeaLYRGW@zE`=-x4qkMM6A$s zu0ogJt5YJTf`@TOjxq!F$4|(uooQ7qQ%+L#C?RIQ2q*BSnM=DGU%N*9e%qH{YSNd$ z;FQ~SPPEq`b-Aa4CR-_6y~!aNY4*#eH0EWA)+wBfL2!FKq(ReEdvDw8E%>MH9P7x0 z(A4?5AML@exL*&AwmiRGFbEcX4y}nSrdz!Dk=KU*)|*o`EvNM;gyDe}BrBwkF8-7V zfsa^S@}KMu_|)GHC(YauyY8myy>Vxw&d$*#JhEgjSZ)yZPKX;PrDWi$s+(@6jhcSo z#R27W3nI*>aF1Zs=y%CvzYb6I2W{x1L95a^xA}eed%oh!C%;~i<@tK5$jl_QX|4^l)Nhl&3D3_M*fQ6xFm*nf=*r?ntERfA&y;S}FYGjytGjNT zRBTbhvQ0rc9)jlw#%zpw00QjFBfQ1#{o}FOmH_7Mjedhaqqa_BY-a9w?>1|Kr%A~7 zX9GL&%dMHw#(s(O4xRXla<#G_BA65;>Y+GFxpZDbSbwEZr(kfyRk%JguOUrRY$;Tj z@44Uo(5YDU%OFi#48bJ1Z_(ppBRd7oteH`a8760?yCih1=C=}xdul}|*XKGWK4ONTvgt|E8d5-V|$W<^r(BdF3<5@^K-3nWm zV7x$k<*k)d*;5=~e?;EamW;f6PoKZncS!rwO{Q~sd%V40YEffn$vm-2+8}tZ9$6uF zf#?DtPOC{vQjD;|uw=4w0W>Thgv~40w^6LwC{TaXjEeQZ&r1ackJpM69ejm{v=}O= zdl%p_7wO^0zJ8~q?9zL2CsYuVm@X2dh9ij==fw+Y@dT@`#L8X&3`@D!e{2TmdI zapGEX<>b=isg~?0KFOFu#hDc&$CLO2JPY~B_bd%DbsU=LHl7ifB=Yy=t;JYm_N0xS zR~MbWXtBtrK;+4ySnm-E{drSGFD!2P)s1yBEl$!rr}fgy2dmH2kEQs``R|G2_kIz$ zM+tQmxCn0_P6!`SZ?r&1|E7{|g)kbwYSnY6{=HREBgr~94S_yF@Wa-}2Kvve(21iX za62(=Ycg=BzCeuH!xIP zMjY*Z;P%$A)y~7;}qrZ|qcrTnvYjsGMa88wRoJVSlkY71))l8QRs5@3!bqFWB^2O3VIJr^a zvk_m(>a|1KK{=axrJ@a6n47N3 zO0V~WL1`t_{?i~&gezzBi*WAf)m%n}QnvftDaDi)()PaBlvl15oMgV?Lx0Amk^@v& zip6fZQvQp6e@eBjUPbxdS6pl)B|sV@1ta^X0t{+YD^{6l@sDU)10jdt+$ha88>2M` z!!153gRv$(vf$g$QvDM(YM$f9y6ZMfshMPx$eNV*%Jf*Gc-(_`_NfgQz_--fxR`br zhR>UfNtP9^^&U?6MX(d@ft|p+1Wer>5%`el=R%!H)q%T9q{}5d_;SUW$NJBHT=2T|c!)wXVaU z65}wQjSsKkzVO~Nd$@k)mlfEYd! z3YlL6MYTQMDy+__rE=9abMYn4}ixNjb`7QTpXcNaLRB$I7h1>D$N37t3G< zOyZqMDCq4KEu>5`-MirVcx_Bnmg`Hz*GwMqi{&U9FYCSyD+O9WK>E^L(^XmQwtvW-6*K)?1c zaAPqaFN(m16n^mviN9g>+!_9NEb~K*VrXSIC*hxx&dJ2PM9`&`&}_Pb2UP{!j~2}i zK0huZp|GQN8+Ski&OukF5gIu&!5BFV!)r}$GVzi--F)q#(Om&~*00Ay&WQM&ZPn;) zp@~lsJhYi;YC|KaMCsaE-g zh>?6v8JmILf&5{3q&54A66{Ix22&HizJelepZk$@le~kUh8~Pxf)BkXax>4N2~Sa} zDppGtIZrI+p-)W>X;``{T%`;}Y?bPXXI`#;n?3vtm#!oN=NFGBJqIM&@m@s7~@Z=Qm4fOIdN(|0i3~uugt~JK&sYJxK4}$Ej@2S znF*13(YPuiUJR`KG+8hL^wIz~kd;(ejev$?IKg*;I$FaYkl$7qr4$2!9-C zVU$~-S1zSf`Y(`>q5OXFGS^Pa*ACrQtSsia1;y)=)D%)Qn>Eo+m_Jvf!Wet1Yd31o z^_;n@`@HX+vcuRho|7Tn@KG$J;UmjMY0=AN0-mpGM%T06z#^N{7+I3yiy1hAY1Rrh zi}%gPVXldQ7Afl^1$|St{7&p_8>Lrj8GlRsKNOATHBGc()eZStr@%LHQgZLbTum#Q zW^|d1z+B4NFl=z~Nx%4LhPUEwXSsFJ@!B^{(dHIQnoKX_EU-*Oe{q%h=bipFrK$s| z9JHBC{HrLXb4x->q3Guz*GSY;uL$>jU#jts*RM0sO)pY9HwFF=@Wtv@`60bxnO(Eg zWWcZfLc{sFH=n_%1<&)cw{Z+YX8fQ+j4@{7mL`To!Up#gr)Zw;k{gP%@*AqO9<~UH zi&YrtU}_vBAqNNMol=3m2Wr z=Qtt2=_Z}{yR#|5ZM1jc&E*Fk1d6d_YAoaR$E=1<*hB}?xL3E+msXYBB-|sC*@f1| zTmuxQaD_Q;VdOwt#+&xH3>z#8PEr2gK)z zm(Vr!&7+yOr($OT6`Qro20kdv<~8?Hi0B`^Z*ldA^Uv<_VKBLQBsQ2|NnS5e+UCUV zck6VY$nIk?f-$1*6bkMRkPT)5fvG(FrKe)F=H}fHN=9gD`?|}rNG9Zgo;wU1z72mW z<7#j8u8(W|S)VfC3PO{T$tpB6%ttf{S$T{Gs}|;7+^RUE>sgR}{=%DVPC3OHs0;Aa z>bBM?zJE?=&t}mZ^l`=oFou+j4OUf-h}kQ4Kbzy)Pb<5PI#K2i+tzL$k@Gz{Ma?KB zA(R&(sTXE>`fASxcieRFB64T`8nL-bOZ(+Z^tFrE6cs{=7S48-q(Y#eCAfAD>2j*w z522NbzH^Mw$0>!HXrjCA38y_j7O1y5{)`CpR8Ic)fxO~G0Pp-0kTjkyRMYySRJ2h$*jr_mH+FvL zc5Gq#L{%|)C!}AOG{5J2dP5jQS}l55l_j` zG%dS?dz|%lW%cJa9BR3qLs?y8He{_*ES`I{@z~zs7q7xPO^!K}&m4hkPP+_A=Cp||M>0$;Vgtt)Du64AE_q22kmLy5%(|E!2Vab~ACeK2;C zD_J~311*GlXU3=!hSO*HaS`M<973oyYbvGjtAv-!Vkkc@Di+HgYf((exOD?#8EqRv z$>#nFk*zTW^P{Ie-l)7Ko^vO%WJ20?v^!qW)f>G0W}HG0t4cOGA8X7a4m1GrN6^Wq z(smJgTa1=JvrC81>o~_3-I%sDW3lqIntkhu`Dh&nK(hY^crzr{IHh%Z)#Zd zr~2Ij>f6IbDe03nZEF?&Mp87=R@6j)=RK}8a4sh$q1t30;E4NkKn(>w_h29cs;7Qh zeDrJJWFtpF6j0a1DyknAmK|F=d>k;PQf`RY3o!d<9?6@vmLTa(oIxP6K{+}e{KeEDL)HPikL z>?iYI>}nyyT-F07BF$XPrbpkULT!)iKE3lLPM`P`O6fk66l4edALkl>^zLS-+yGMV z^wdLM0s^t`pWV9vPkwLV$~)EZ7HBXVc}QJ%}g(@y=t)F9PP+6)}t_7$I1)4#;?@@^J@=G_iEn(X+!^A3rJX6TUrR8;f`&NpbDTfKHP%5 z7R0am7UBEhm!H^3V3@J8UYPR-8+5aXAQ{+Hi;H69Y1C2Ria14$zdS z%u~NOx`0VEfErEz56}~v?h@)Dop^l&(9R05U9f5a3abmT$tJ9J1I#rXg4Its9;BQH zI78%|NhPot&VjO9O-qk!4}UbOhB?F-~X zeF2enB|68U8FkW%)lTc6+-9>u;v`GX2#Zkveobgbt=fOhKCpMIIZbBg?_&ALekp5v zwBf5anq5{~T1+D1MN1b9HhG52^y3cDj~GH-nCk+(*%_JkclxVA zQpTUH-=zY7N=MWjov^{5%{}&nxjl!C=CsuU=rSGjo9rzzzdoR~2ZJK`?~suQslG=- zGld3e+bdIzSVJWcI;Xjg!iY?O{6?U2DFELBYT8gJ1-Tn>`+>`y7SEDw`{Yc%N}-zO z&Vsu#QsJQN6%X&?V>Epa!<8@VnlCpYXdz+uLJhF!TgSdHr&RnpS!KTowePqNgN@X2 z9V|VxS^!^UbKnOmoh2wX*N*JgIIpp>tn5FRlECyC;8FrX9{}1t>^XI0d(BLrwgsG` zvfVVJ#tzv8A@$4}BoIET)F?#IJQ$MU5U>_*Rq~sMr4n)D=dGg<>b-V`? zK`0%H&8N)MIS{b}gz^Pv=hVLo?X=ve+{8)Aq{$tbcKgzfOO^g>kJUEcFfT@sz*0(X z6IcTB20J4Qg=sSFY4Skl+bMVWyE3^zohqc*l})Y<*n?;72F`7d5J3l}=iyBQF#MxK zA`NCf#;+hwbg6AebTlMQyN1GCe1 z^b1P&BIdC%q@zc{sbX?qb!I9V>XeE{Ae8npTzz%%r;nduLrl%9kaGk7t}toerIRnS zBd#u}kb^I=Ru+$;5mE#-U-GxjkVz)ZzP;3WXQoo^FYYuOf|uW#yfTtFIhgV1=aBOr zL{FHzfc7 literal 0 HcmV?d00001 diff --git a/doc/_static/prisme_gui.png b/doc/_static/prisme_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..68ea36f16af35e91566aa3b81c43e2e4a1a903f9 GIT binary patch literal 41264 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 Vj*c5QM8Wt#z>cr|>giEu{txH)_U`}y literal 0 HcmV?d00001 diff --git a/doc/_static/quadrevolution.png b/doc/_static/quadrevolution.png new file mode 100644 index 0000000000000000000000000000000000000000..d3baf1d0108cec36db041dd3bf46992b82888c95 GIT binary patch literal 33700 zcmZ6zdpy(q`v?AZib!&IFA*(t=e|jbVZ$csH5Om?(8QajTrHSU!KYCu| z&?t}HI{z{DS&n&YVfW$kr^BH_33JecJ3n_nd35yAhr2QVW@;1PL6Yx|#)h2kJdi)tgFm*%JNdxxc)8Y+7^b8N|4M7b9Ee71DSZVJAhnw0=7K@ju7|L^tjoMq=< zzrZx56QZ3yNk;DYweUTuzoxuz?a4fgR|CH;i(@?Yfg_cFty!D@Eus3?axEpjeOA>n zi+con#Ei*qlw)unLCU-G4#ET+Olfb|t+O(IN)`T( z;$tfe^vs%8h?X!s5orw`aIG_g6IaZXh%3V(TB7j8L;=5LgE^@)YcAj)SMX)>FQ$(M z#y8FAqnn!pmDldMBt&W`gD0Wuy?tCWMKfH~_IK*+RQ}Z!fn2`w*Y(lSoD8$=_A}Ko zA^#K7d+=mxDxBQ3{Xmg8Iq^v)=GU_S{C9TJY;$&Td(vM+82$LycfYS&5ec~reUvTF zi}f%6e^RK5eyB*?zP~9ERZvOc29&z&?)#sl00|+6j>bitTkv0EKScLq7^7VrjUP4s zPh|h-tY-5zu59;hVoq5vJ^Ho9lMA_o5>Efzv;TYM`PF$}e3Ws$4DZk{@!$2IU(C*B z6mwRVOqc#g)yLIbYo8TS&beQ@zl@w;#79+y-PZcGsq1;EDAoV(r_;KUQP-+vM)v+v z)Si^PKl12{JlZt0X0Nl8UM`bn52I-xj*ZCudU5SB zY~$TNQVoUpw^Nzg|1_;=b#(Ot+0@nL*E*+nMIH37P6ccw3D}B}DTp%-sAimdqsFli zklB*Z72i}zu>wE;GJqCw9?JzaY@Q?Mj~zMiYZLg_y&DZ=Q;KnUtr;-?sZ~CoKQ`Rd z)a0xKY+>Zt?;GLY@(&!g<&~MK3#@zXcr>!f)Mw=%T$CCvY6K25^ZOh36}Z8V>RhdX z@1x&891GnY3$FKP<2aHG{5T*$XMgUt5f^N9~zEQl-8ZTfP`#2GPEH~~ABA2nSZd|xe7`j)D=^K8D z1B&}@Ac6Xrvd^P;;YQHNsDW|GxML?vQV7cV>$i==4nT(0G9+_myMM8|oaS@09$P6P zXwA64&$BwThHQFpI>u9FZTb{46H|22{UDiXt0SP3+Vd%`>;8x)R)J!?a#YkTa+ih| z>YHi(R__N0ij2RURA5Wb@7YT_%WVHcJM~Iorj|BM&7_^cN3FVuKvPQEnpkIB9@E&k zS19ABsbTJdtWF+H1jYw|M-SONCgl=w~8S)EO!ap|Ky5>Tj~byC6Vc+uw=Ho-Ff^3rfsEX71nlk!s^T?8Fze6{&@*N(;^{t zvOR};1>3@s-7L%2aNJ=xepTne7I}lF>Z~Lj!ZU`ToVjRY^vvR#EcCwbe^wR&tSr4r z1#va^oBC~7pvfQmYZ!DiF3a}JAELt0GHW<`-RaX}!H>ye2Z?(a!i@e$Rgq(~owq5& z9<%|RHGb?+bx=y^@Qk--%9BA2Q*rY{(3Ha@G4+y5PxIo|7FYa{OaL&A*{U*Cr%h6P zd1reMLjtug;P~JWHtM61@*aqJ3^^}CO+{M!ov9xoQH54DRS=&{fAmCp*fB^mAC3b* z^1Zs!J{ufPb!4O3>b?9cUSR6;d(mmxtfEOdsAYE{M~HZa*)E+&PtbYP{n|I<4WT=+ zDjbV*@DljcQp%LLqId~*?H<-B%CdLz8Dizl&g*uy9^WJ-p-$yhApjT0JSU#tDX8-} zIDF6Z&lO`_p8Dl-_#UWC%^cn*Fy4TV_mjwZuT4TamRJ%R=7(gS0SFn9YLyv_@Hu^x ze~-JhiJQ7E`yuqaF*F72GUi~b4Ez?6sefRXj++P3%?yaeKq4yU2_WSsi@Cg8QX}@( z&{uv8=6-NCh?lN*qGo=K23K0!1n1ow{Jrb@q0=U~sF?UE@rI{^uSZc)itleFxj-_@l*o6STdB(C@?zKXA+3Cl~zqH9MQaNL9DBcgF*Lz z%%&`u?Ip{Rw(Y$Lj2F2~yKnio4=RDn-`YS*Q>GCMKd4HHU!RkDfETOz-Z&}$!DH@D z^g$?65*Kw^G&QiL1Q}n6scBG)6V=?6N@aEP>RBs$V2hz}ZNcTPU1&W=$jp1}sQk)NEW`p)A8(6*I%htsk6_v77OPY>-kMYg_B%Pe zGLv&PMl<sALg^oPQx2gfU{gWEg3^TM_BnbOkNZp`Cjh9a`16)$WrDSEB4b1)$Jnl9z#RV9o zB-qEgzODle+sAm^{Jt*#me=5S`8wHN#I3Ib3-UXSL&oJFzN^>}JRRc$w@H~wC@GP2 zx7#7cSnF?0a1guSag5ZMgo?(Ueaod?F+?v2;Nyg+%xG zqo9Yqh3d6=8&+!~%)3uaU17@$&-_Cf$)g8dR`$ouH((5k11nN9JIAw6R%Y}$WO#04 zPa%Ks^aE)K?_G;?n*BL?i=|b@93cp}rYlSxH9~>O)ncWBNdA00oO~$dR!LF71;uJ* zj$5cO)hl~QA2!*Qc=0XwO13<90bY^=y#*ejA-l;u;c+a}Bpu7)ZY^R@ykq61mw7Q) zpR{;sEFdEGg-Acj&(XQNDGVu?!^;$a3_{KSaQhH<|M#ORJcdfD&(qA&E<1i<{Ga|> zF6k-s4h9RyaP zaW7EL&wI|m2QlNADnIhYYtqGi5A#V93ZBQ^aZ*DhNlnyYl99-NP0>$>8R4QKY+RrC z&A3GP@h=BrtA=&l!ihy65Car~g~M6TgXBFYaIOv^e@87)&Dwz4ya0pe@tnGp4r(i^YU@?2%HBI$}; z@AQ^_!wubH+}6s7IK;4+7g;|2S!PVZ>0K`s_Tbc-{UR&*uM{Qu0Yj}%rVN_g&d{`b ziqeM>=`H7HA6D%EvH=hZ-eI=aSjx3l^61#r!uXjoZl1k=Vt>ux)hP}#btCAU!(aIx z=5INych%7jLVZRIFO&Q*^?=*w)B4adn2`zv$R z9P3`9zu5NVu^e(rYSleTS|cju|6^nJ=<~L$W*o@PsK}Dn>OJ>^*r`l$S0#XP6C*PT zniGwaz1Me^Q_ku{(6w1%vD1DQfwpn0$UikW^1akSs{?Kxmr2y-C6Z0FUk!aEX~-J# z-Lny+1oD~p^J1vr=Im27dWy+I_VSy?dR1Sjq3?el(Hm{iu!jkkuqr|pvUYkokXThw52-8K5!-nmSEOQS zKtT0xzbBN0X~usa`$pf@WLkQWD2M0+8|YV1RX%==--U9v-G+=o zEE*95LBdgKvp9)0Y7&B-G0CIn_b0Kh?)llB78Za%>$**u|6ss3z`E)w5EU+MtbcuS zm2S+a6TJTeu$SGpu=DVp0M{22)^>>U)zS#t^cPgOI{}k^jvr2;%&-W=fv6A2dz{Eq z)SB-8NUX^l2geT~%>`DoHy~57T$vGRa0UtZurTbh$0{I31;M8fNVpM^{g{Hh+kc8F z;TKN6CRSn#F&AC8*_`}BNn8StS<(-O38jZ_!2AA$+Q%Ub#+P@}ZYCoT>;A$Bq2zZ8EH36PF z*L)8VCpGDlR#d5pIn`SIJWRMoe45Fl{;-nu#+>}Yxxb>0A?xqlS?+(WLD4Rm3bI)A zWZ!_Wi9YZ$9YC?(zzgpby?R+ z6!ZMx%c~K6skfeO-Mll$EY9^g3R$0>7YVjvwyP!|^YOe}@!L*R+6j$N;mg}W4E_8v zoxQdyL}yuHUF30e_oDZG_LF12N`PxY+PZ`W;fF~rRC(~|sFR=FlbZ9-i?g(TL#p1g zl9Iy5I+AZtXm2KR{_0uuo>`);Mv^=qj~){!i}{yCRLkByn@kCZ)A)~11KiF3@m%f> z#hy6Y52cN^59icgl2~oX@X}wg4N_g~8@evr9bCB8zp*n?G8WDh1!0$fdoin|^C`sd zBsWoN(hE;}s`l<2hiQRkDH<8QD){zVdMY2%$C*2tk*KFeHE;sxEtB1dDVVyy`*gmx zE&X0OUhI&@4|K-@X>l^2t4}J2xm}>(9PTh~^FER1yy;`CWJ1abpH}ivz7oFiAg2AA z!M>PmVB~7K-xKJFiKFhwDw79fu~IT;p@`|_+g%mzq5de%O+({RW4hZVx9(#1hr2+W z=7R8K4G@Qu2N1heP21z&uToYbtzi;BnRQsiTeVL;Eo?%8kvVQIYtwZy)-Z zp%JY($w$|q?yam8bXR=Me7W8D+WYXMkev#6{~SQ;cNbG?^R8A~6KG1c+J`M4pZoA# zZ{TOBokSHn-P~2HQv5-cR-eyo7GHju7J5kldB(t}LREl~{o{ShFZE?N^0rFEraCU{ zVA_;kWv^QNY3oaPa?^h%p8rZ_ytc*(lw`a!S0+?F7Je7zJ(~rr33{7Sg!rfQ(~X`d zXEom48QS`H&q%cYNi=M~6~c?8NHvM3DDr(N#zS?K8yG>x(4q$FLEuo^UXpj~aAh<@ zF>tO;cP!Z94~NgIRR?Q`h+^N`J@XS8^8QkH&Bm@q{O5)3jPOq-A!i#{Swt&Z(OrJA zg4AhUb2#%3$eVFK@NsXC0H?#yO{dudank>-y{y$N{~0@>z)0LPU-WM_(UbG!BF&w{ zbr(MLOJhJVLKHs$&TrjH}Snekcl zA?9z;&a!1jb^=)$0>*Xrep7L?Y%@=vkMr@^#+>T)vc`Bug~XjEl~+Fc<~WfQ-{Iwo z$8C8Nukl4}lKR9Ogj!{4JC`x6nokxM9jnVZN!|78Yhkgyj^=N<5$;iQc)sW6>t-uw`&SwJM$dy-U>fA<1_+3yQ zsUJQO(O_q^bpRJV@Bl1@oXAU5|FTq@WLtUon?<$W`A~<$;MA^hD7CG1z7kXN>W-tiU6p%yYASL(oI*Ms zG@G%I6OH|9U>WEu5qDZ(gG#M3f5CW@Xt&4}L!Dl);!)%vM%~tflpV4?+8tM+chWY# zWj>Trj`eZT`Wa|<6_&q|LD)jnpg5p>1kO*9!m;pcICa!eCgmgF;+@`cWL2I=DoeEa z@@Gcr@tR8#eyI$NFl6R)6k27n_A;B`61c5EZmuJ_pA1Ny63+sws2u`AFkEw|(2+l# zyX}y$>T;fm7nSs5ulZZDx-TL&A6AdUWx^=f8~m=~^{)%?R+&D4$<}9>XP<_UvVxcA zV~_ndN10KbK2G^<-s$lvE2E5p#MvTacZY)^JKbO`bQ@>BvLBs_Tq@imBj)nldTh5P zP%%#c`M<@&$33?HpyJT(xTlm87|Gj+pc5PNJx{CxIw|ip11;*YCrfD&AF3lR&e-si z8u#%{t+s35=e6lOo)M*jYP4Vl)OGpS#rLgp15SEIpbNB*q||Vah&K7MymON4+E0P_Lb>9yy{C2+m)s}rdNr&ULm zmDUf!KXskxrlPZ2+Zb z^vcsE<4E`|dG7-U#DF%xop)!I)^y{-Oq6T4os)ZuibqUJHZtS`5*Bi}%~$F0^oGS9 z)D$2IfcL1q(wAul7^&cZJ*@cr(V?r0<~reLd{XlJsR=`ExNNPGcEclq#qV!Zw`i?< zP4gz@yg^#J0!Xi+$Zne298T^QHN*RB@7=VN<6}?tXxJ|%&ueW|fAxDuK0&!1j*zG_)v;#l z@MQL5XNtB`i1=_VY8Xzv>Dx$4{hrMj5K?%jby~Id;wt0{^J@mY$b?Vd^;83I-A$P- z(g$(HgqYgvPvX|_5Tf$9XbuI}@w#a1f&}VxYM*$_6gSNy_L4I*0`OYXGWwu|A2V}kE$W?@SH-bd z?UF3a#qYSO;Z$#gPu>|DN6%Bo!`l`I%w2h-5h7<@gwXLSjPS8QoJKHa;Uu|va*{Pq zOJIuc*?=}r0|o%51i1UhjnnWS=afM zGzBL|lti_)Jr0-mQk zCy7p;kDGr+ZtnNZvEeU<;o7J(CcZ~Dr$<5a2&J+XRfd}iIXLjzyS^b$#o)U%sy_%l zWIKA-{(e@7Gow815I(9Vf2I-O!+}N)XCbFn-OP~cD330c8-eG_v=Agv@M4uU3$1QT zH;-c~CF~Tm<5k^m=R@JK1BF2+#}@2I=l+u)knF-TuGYM-Hlxu2B?k4#?G1wGmaNx9 zW6hj3U=dKW>RQxC3{&sZNb-*6(Ik8~Z+{$8b3W8T#?xCf75NlbyaQSNB)l!?hY5$p zp0vhAGjLlM^0p<&*t2Ar9MFfF3K4CV(YvnM<$RJ^qzR=~#<5YPPRVcjI>Rt!n|kI! zzT%B^V~t`PzM~7jt2-ctjNQ9VRPZgu?G|Z+b3lFdt$=XcbEHx+jyruv1BD&3A-&cx z%{i}o+30SK&kb2&6EidHLUQ#!Tr?NCt?gD#vj~me=h+UBmIwNOeL#&j5$}&aI5WHR zWm=M137w=>FrX?auLK7G@gl6)usa&ikq&#pWYZ7A8S0rGF|znq$jnngY?e z0lsVVGzT2tKTG!R$v7d28ZuPPakOYj1jICq>iQ7Fn+RBFvBU?BF4*9XFXXJI?i@1v zy*m;v5gjTAtoZ~0YI;b)WoB1Rl!X_|QseULC9xSliEdQ1$C$Rx;^5GOrh_I;{7+oC za^aRq<%ZmPolj3`$}8&zkzAP=aB|T(-h&PyTfF%FXR*}i`Qyd7-_OsapkJcN)U&}2 z-3ssTM^v_IInr}~1-K^b|FSMWe^cb=xR|$)KvP{6Vk)oYo-A|+bs!5`_m1XH#e<`J zM&LOm#uhYmX}Mg<_t4n9>KY~W;B+?&kvBo;lO!0q`TTRZ(i{5WLz~l1z?36_8cPie z>A!6*+ah)jns)V@7GlD9>n6U&%~Y4usU2+OpYIJS{8K5sPZhT_>>b@*ySgiJ8*<)b zmb;(<6e<<@*HiaU_0;^Y7u?0ZDO|@XIGkx! z7zphB6LJu89bTC9+WP96X;4tHp~sqxLns$Z_=}nu%jC+O?iMt+IXZif7*8ud5DI0B zAwI;OlKe`&zcmxRmRck=6Wmy-Y!eQr?x7qEa4JkyPZ(O^hxs2bKQ?6rYxf$P@+!Uj zyl<{{&OYjjM{$3IF)@+3^|;ONUKf(&iC=~wP)(cMI`lc=|D6R$7;7X4)`ahq*9mW3 z_P1Xx{$g0`SzTCCDtd7y+&oA3L-3WV*H&!8Ru*o-g>1IzMbEE_{H|j|7uf^A^d9*P z{fdr%5k{&RgRH$=?-t?wu0mkIIVA<*YAHrIQH%DhhgW`tGHy~r?c%=FKfcA$N!rp| z;3uRn1ow37i<;d8@;j6OD$>u8(^mkr`AcKjmd8HWJvnWiUd4C#0sq}N{qMgHUE@a} z*;->?{fZ=_@xq78cC^Zz-rXugcp;5yB)3{SrVg3@=VWzC6pdDjGcEag>P5EN&ruux zn8tn|vzgJH^!^PG2h%Z@MD)mBAZE~fAzVYOylh%FiH^55=t7F-FaARfi9X}+wCQ-p z#>i5^cU70<`wgH!IcFv;NA0htRwB*kq+VCjUspxmHUs_QFj2FHD^ch!>S~|l0=NO-#5Uv?RKg6tYTbK@G<}^$MXDzghqhm-5^N_Qhz)- zub4WTWcF7K@(JmDJ$|3?`x(_%uhoOvGoHAxQ5#Ekz)gPA{y6^SHGJWS`&`YCa5tzd zWrCy8;+@!>&ytToH7cI_-7q4};JOgG_sfoaS;m@O^^0qK7GLDT54gG|!iC|fBl+AJ zCiGy=7$BY*#F9XTX2W33{dGe(bhPP#8gtAiq)sZKU!ge4g}Rcj?0e+$HGUGv8aet7 zrYm(4QIHQP6d2-Tb800IRa<&E$(}BGPHsNvugku%NwnsHBS2bwRk3Lq zF94E*0tOr82GgV%UQ=GF1_$Pa|az}i*u|E13XZgq89_L+7poOt4{(0+{>H*RJ?Rf+F|K?uxH|y z_RrB9+x$@VV7r<~%ihW%^R;#d0K#mbhIGurbPT=&?dRBvS zmycdba(Wm5Z^DdyRn8j>Gh^LeQS7{ygXw)Gb9fA(B{Y2$*@Jg5v0`~6#m#*GP7A*1 zjb^R+eGaIa_SnR za9^ir(pfr-W$Gx*@eAw#|IB3MhsyLOjW!pHdJm7gzM2pS_ddW+hF(5)xwAEN+4Xf; zbAQlzvPqHB$$^UtPJ78_lavawX+X=Hoza**wRyMg)}#If8KcmRMFIfAm@HOXIiC%N zD7v&5`qZSpVD#1^Kd!7gKDdWANeUdRGu|k#(hZ|tn$z`0F?`b)cu)dn7de$q5YGuCG(s>=CGXk*JTZCG}NgXcJ!OpeJ_R%BNj^wx3URVV`dt7P-390V8W{IA0{K}I(_rGXV=PTeW}_%;j1|=xs@tg2sl7bpJgh z;y--hQFOBKJ2`~ezX0uSrh<*%>?PZ zqW{6a4?l54*4_!n$BeF6d9D9j4Lq(CpdH?QtPh;zk4<@=15S7U3MR>wG4gEsx86yzud8AC7D1G+YN3-=6Om=NGI`XdZ+X(0M2Ao`L~AIrH0 z`!rp_2c5{YBFg{|hn4|;`C8!q zw(G3Ag6?&^f2&Ze^>WY!1%{&A;A{DvF%E1(4$qt1{5A0K5chN7meX`VP#3K`OoP~R z00?e837E~#C!hK)zR!=KuzrQCkDoqQ<>WhAS+p?GvtiL8h;2*4g#1sH9DA+bHaF^! zwzH)Y8Ts5`MHc-v%x%vmH5TX(*kA+la6>kcL0K3jOrxdDtsM)4sec}J*YHTIMj*F~ zgXj;g*d9?#X`^~YQCY!0>&EEF&qfNk>Y%AF0ycmSe0xNj`-dB79yfe@;|Z_^-<9~+ z=V6{zM>H>^ZnL#+pHgH;yG;C)$KU3%Fqg~K zYA$s+8}VqobVeT~eTY9yN*X=&?!u!Q_?Uxr#LaE{Wc5NUwG$&kRc6?} z&z+MZO|O-ucMSBdG-ZqiTHfl!t4mm#5BbF?HV!p&z1DoU75O(ed|ZNBI!Zx+;h5vq zOxtisYkFJct6H*-p@%PGY@{!ybB{+fP2?UjkI6NYs1+bi#CUu4dJ8qb`npGvJ9&|Z?W5w`2-H{)VyaG;Bm2PjA z8-fQ46i({FX~UMpo=rU^f0&c*4s1-HxT_gJIa%ZFi>8wM@_pj0g8uOKSnAJ0xOq5G zib)@F8^h?odU#J3T;kd57koQy3$y`3gu&83Z?RI4Xe-Tk{U-`H8fAfOuo9@X{i8KK zOQ?gsOX?cOAkQ)L>Lfqwr=0ku^R5*gprFwiLD&^W^F^3hW1e51_-UZv`O9|mPoN(& z6F`pjzcnyZA&It|>c=`N8^l3Q;=Bs4F5 z+Bkt$J^0Qp`3!SRKt+>)3LRK;XWT}y*ZcvoSdGVTVX-EUO5o863oZ|jE@mYzxSU*L z(=J61+afx=))iCFkQtyT3xT1%b|SM%o>S%XWt}4V&Cv7ME=N1DGu};?lWrb{P}kVj zzwMmNH#n@(tGX$>MFn}NYXBHCOZJ-W-RptuMBZp{t5u)8bogO%(}xs#$q>?ZsRB{A z6q*)R%+yoJd1XDx`-0R>bwimQon{mXY=AhU$n4LPyR4yA+SD8!ZF`n2HZeS`oBB|{ znqdVdBovB+Qqc#h>#+o1Sb2Zwx2)0NuB#ST-V~S=e2*9;wDK^;`T-{`$zf!M)wO=1 zvhU3%5F`j&vfAW&uk)Gii0;zkjj~PztTzS}Z{oUsWCtb)l@&mQa@MQW+YS5(omddSH%!D97 zJa)!9L<{PDy6qu3W@7b35*^A|!iaexF6BU71ArZUPe?J?FmWkP>SH~2REzTAXZ zy|_OmKLyr!1D=vm$0Q-2<X`Me0z7*t>_itklEpl;o+_Y~8% zh9YmX1FBy2Q;s6v6Y^r`>>0bKwXS{He8RM1)(ZpcWHI%{r!0CKt!ZLzyv4f|1qvHo z#rR@)_uOa{^AnxsTc8W6bsCp zKqSl0GBIAZvWjs9OU63%oc_eb0)FKufdO$V2p4=KA9T^?8xnmASEINMW;j&9S*8fn z51bZ`A!9I&WyL<*$xoX5Ly=Iob4x^6`$db+XXyMo9RT#+sb|*SoB;}mtO^&t_pD0A zgGlh&Uai4dQp`N(%7>=bKh?V5M@SV8C$bs{C0^_Qv{5eOy=rDF;g4UD@PNGr(D!aR zReU`7pw59kjl|TUy%;N_BM*dfr2Szu3p0{ZZ_<;g%TMtRp8sB+S3NEa0q?$OYuj=K z>oe|mI$1FwuAOB}AC^peo}X>UejSoM$|~Lc980jWO=vQTouTDX#HUO~X2jpx2E$+K z&UqP=7SnW7(A$3#LJZJCxrf0>j(T34t?~^d*@Pp;4y+Z_K)NRXn!`T{uL*-(T9)F%o%O;OKbF}vMd)@9h7cp;BsM_ zIsE;yRgt|Qg$p$U{A+gGj)SV9dL-YMwx3R5eeB%GpY{SL#)dg3Pfml8qeX}TK{{%5 zVRE8X7GmxKGIks-;RpVnsoqqoq!HIO9|l95_TTIbOAGSot?XcCsijO~&Ki0g*;FD% z-m5q4HUq;!P!8xMxEdK%M_a~b5SqNld%IxLx!*G$pGYG3n9qkF&2DzL8I6C+^T(FaKjagt61*piH#NXV=Lo9P)l0_&#i|HHte(a?6?xaR!5<{*0TgKBd9_`?ZbaL+&^uMKs5|KUEJ#w&~iZUD?xtIU%D{G*ht8@_v7?T~| zhg=o=I4Bw9VfX$;HG9T2KkYQzW1GJq4&V}yEbAfswpL81zI2O0=5Z=$6HX=|J`+!9 zyK#tpKjlHVg#?!@rrOVOx2u)UZ={bFsFf5MRw1%Ofg^5-K}wald961H=gL4= zfRN!|uJetwo;Q*kjMV?iXWApu9Y;;QNB{V@(Yx8j2-%^72e$$MX{qGeXil@ST*tNZ zhUj&s-rfh6i>%(->oDfCX|0N;`p07tj;2K%q0``|!qiL;_4rw-=*kgBZSO*z2?8Wh z!J~{?J##p;3S?z-=s*pwqsWjHu>>qMxM<(EpX*O>aA*o(LyQW(ZSww)gUeK`9r@=M zRC83DfQ*E@m0KQLyP!Tgj z{Or4p|9(3-xY@-b>CQG+iOXvo1rDsn;R!(}0q-_98?CJs)GDzE;3qY{O^pjgRI>(f zk{DTV8)Mhfo-IH%&EypyRUT9^DFfXT179DlP}wY>444Q@W6BxKz2xvF5`5s$4ZxOb zX5BqP!@Otnq^Y`jfi6{v$ETEQFRwTKwgG_&WN~OWVmg3hZfuAqt1s+S8Tz=y9jl*Z zC6cZm5P`~Mz}orX|R^GJMw+=wcX4oiGkGF*st!-=&+ zECk0-Xas~u=tc0(XnGEV!jQu-c1~-3FXf}sUXcd;x;!oUw6nkxwSi2I=l;yA@o9E> zn1$!^Oj=>-XB|v+0I)m_d-0tucjPfWD5SbHNaGpha%jcqL*owlw% zJd>R-9l|GEx2W!Ib~Xo30?=y_Mnu%1-Ap&bh&N!k;9b#nnI#K|C-gt9b<3nW`Ah0i6Kw3+@y1C<#UA8-9NsBp@ zpJ6nVnKk(eWwM}0Z|3jqObDt6A*{t*N3I4jt@Q~c3*_EL+|L6}slR_$e{4tRfg3gu z8R(>JWMZ0O%%Jo5D$5jxozg)ox2)(_oH=g~v#!^q^geM&1C)oRgnuE7yT~0gE?P6( z?nw*qpD;H44UG_7iW%y`RMXd3qEG-UXmhPV7itl+G7mv4Rke7ew4<7XXco?? zsD1YSWWx4@Aw%DT0Ue0o9EJ{oTLqBJRoK>snP=~q$)<&Ee9HMu=jusoBReC4Nx{#` z!~Y7kI0NqPm1Cs7e|@V{IT;X=(=bWGQP>fiy)*A|6G13yUtEg>n7IUd?x>t*=x@?r ze{1M}`}1GiWVU7wUOhdZr9Elqiw+!LT5r;Pzu=lpzGUDgpNypDzvWv6hUMO~197$VZjbL{;)5j50#_m5Aox zqi$p?7kU!7Jt1)AmY(2`X&ninG=WS zO|a@^Df0e#Mf!TteKq2CREbP{8W&~~yh&a4aS292F@l?m2QuqEmPkgYoxqO#T#x6Y zFy$H!vDLbkL@#7eC@{#kpgRGbx*uXR@v<$4Yhpnf=;$n@GKLQpAn24R6rDThFgd?S z-ygD_EDZe=7)n|_mxs9d!$tO!`WRdT%)B|u-!$>Zq_OW1GhN#6--%b*6cXIPfc!k> zzHjQ!Ihb09FnsZusz#I9G^K>i!X4f>|6A)1w{$yq=j=L(5H0&1NM68I+App=NfBMB zW=xB!n0e8JP6c+poR!`_p0B*2Th$CMLVyQHY%J>MCZ<#Qs36~Y?kf9?mX5Q9yZ+qp zfloGUkr-bPon5aZBG?{tIZjeMzRzQPP*(6j29m>5o>;XonpCJKI6D+B3$+*vsPwB* z*LEb=sr)#n{6kJV{!pMK6$M3r!!Sv}OuqH7g>-3bZm{Vj7I z>eq=^Ln<=>9EPDwBr;!pWl;##)0V)r$mOT@AZ*);8P9^z1Rt)>YKnQl_7;y6n+O*) zRD@bY#^tw`M;J7v;Xvm*{%I%F$6Qnq^^$xAZJPJS=`}u|*W;BphfyZ>QI2z|F3k*+?&M1?A~B%d1BE`tNcJ7$an!lI zlE`R$@5|LzJOLesyQ85VPx*ARnJ{ftO;94p#Ph=_Tc-Y|6f+^v83dkm4YpN5L&SGj zPcYO{2IAi~8P0{l5s3QWUA|8JCv<4n|NB4l%S^m@CD_H0NAq)h51?+85u(^c)aYLF ze~I&=H&7z?d7Jp}F-hRs(hJ9hTEYc1y*1)4xDQ{wn$1d9wd$m-d@?o3np69n-xwDiXtPLc_WCJ0Rn}?zqs1>w6gcDPcqVv8;C|j03A+ zwFuwJ@p7TktrefbO4! zq*q0S$X~Ph*%aXYH{Db3WwQsxUI;n`?7(>Ba=nK|=a+cP{}w^)B>TP@tyL4#CEd>t zx^Sk@DZhHSG`qlQ;Llf=kW>130rKk5bIWHeb3$x?Vj%G0A^7 zbUDClaEKP>WX7>d^3-iR1PyKsOn?hOOKwM=S1GIQHQfkq-&!0BJLrFCiTI-FZjTx$ z3Aq5JTAmp+v@^Wo+nOR;xJKLHaiyU$IJhXv)UM?5i=+JW*HzqZkl*$9SXHqsBUY+R z{E_nmbBo-s7OQkjf3S5|5O48&$kNTq-MGi#78DSm6n)Q@@nUCH=EX;Sj^2uhkzyv9 zRM7KYYzU=m6TupFOODg6|%iRGq2ebrs{BjJT6q zjOay&87~uxv`a6mWM41l9vx;9@PQIxXQO&pxMgHm*(4GqO6nNgP+|BSrt6agd}5Eg zZTXAd0q5F|sv*5_t^7Bba{(K9javUTCR1nTZ}|WHO`n4Oo8+KFurf_Z^JDLWOoc+& zqR>+n*zfd?qm++Bkx}z6aKZT}8i>BM(8(muC$%5v+=b`6%PCP=bY+ zLh55vKz|;0EnhTF1)P0VQ_vT<7e-3CVI09N9`@i)hT)6S^`h3lP{-^h9$b)8g9ZgT zT|!|)OpUp-W8DCUa$)+aLqNpdeHS9`nz%jPj2gvd4ezz-?QLJxtX zt{qxbKV!BEYvJfy^9pRsD>)yk&jkE_%o0(LGX3i$T0POOsBnLH2U^qsY5`Y!p{e#z zEeda6FKe6=R5Dwc)Agw}aZsB=%7_ZUJpa~Iz+zyk5w-U$2jl-;#N|A>2!XzyI0Wzf z^l^wY78XEJ5mWOu$w!ic|4wTR&X0ZaV?s4(1xOg=H-vCdi>;oZ)GL)?5a^8cL$ zSOOJj2!0ty@y;bl>gK;`3?=rR>%~hPqPl*hkRQ=-%nnnK`hmhO#7ry}9VXFv+P`7Y|=!_#Tuerv-oVKR#SEVTm3`%qe`L#p<#JmiiYWY_0;y|-tjM(2A z>574sFI4f21l<0b;#77+DU8g3#i(&FkOqWEM8=j!j+ zVU5S%oTuql)g+xA)6x)Dpoc&2vwO@d5cNj5o3J6%p=oYk?V_6!$Uz{%*ggdPMG;%; z4&>n4{%*#a9`YbY%_tdp&VA{%`n*TbF%y9{r6BBP9SXGCUr!YnjE`K(Lv7(}s z61am#6cZsx7f^dJw>gs*8))56`&mr{M)Tb%VfACY=||hRR(U(SW-QWQ)m8Yk;145A z$=OY2y{rAH;(|lcN80R9q!P3ZN;!xg?jZ6i6uMWSi)Y=R!yHenn&NT^lxn@GG>WO` zP(3gL)ZbO`8(LJW^cJ7rr96tVcpL{i903D&(>{Kh2<$Q5 z2;4o~%^ep|BqgBeHH?Zo_O03^0ohZj5iYVHKUAjANCkb{&quZR%?1#Sf`@uptYg@8-)G4|i1VW0 z>WM&C)833#=aE|FD$jkZ#o%p@3g2-X#W;l;EN+(-#muO6Dq11Gr2Dm31TNSW2B;t+Dgxz_S^cQ{7(y zsBSVC3^Np)1wlg~(SXc@i+viK;{p#4fB&neGVo(l;7ur0M8KDnQH|kp5V1FihOEbb zGt!ZP1XJ2jneA-lxX1F~dX3Rd%e(V0)(;j(n)&l+yV?#wYXVW-GIGA>GO--CZOmD> zquULdf1mF-N@LIrz8!1{-bD`re_sMD!@O@AVeL9mH)P;hw)hzP@NTrw`+sWs@_4A)_y1!{Dj})tMLj~6NMx5ad9u!6tR>m9CF_J~Qwfs_i3Zun z42c=*pv1^FmS!+ANV1M4W-Md)9na_c`=i&ZKg@m3x$o<`?)SC5uL{R%crPZJMAY8# zUHutu?b+7U!Q6lxd;#c#?GC_74E!m6D_RChtE?I?i`3=FYam>**cYIHm z@ZO6!(`(T5MU%9B5#z;oAF$asG8Qhjr7x=Ccm9lQ_2x3`B4**nJc~ORbR@pl06}kzLQY0y(;Ii|8=l*RKQo3sZbypO zyAFOGL7po;=JRw+Cu4LY??|H6xgpe18i>P z=!I^F_G{>eSx@ZLQ7;ZWCOaCS&-_|~IswD`$`ztRKOmDyR5Dp)IX%lEH3j~ViT}sEBht!~*<4_M?`jD&meN0@gILcaZwg|-6!#My1 zssF%B{oB4@^0#k}k3^8lsK+Zhtk_LD6-`&g*jAr&rpPR{$V26T4VZ2N*=I&{uAm?V zwheh3l}D);Md+yfi#x>f*iUuj&(21N7($C=F2w$B8j6i!p29nCVR`23IS z>=bs)dNX4rZ9>Ad?FjH6FUti;^un&K1{gga-z(-Z4i=x2bI2_q1>KJ%F^8EXMdR_& zW?taaF*vwy$i8QX0+AD2GrK?gpT`jUd0T zSbw6yX?Q>cJXJd=V^$$w?@^}C<2yqkLrwZvIt6~Rw|h$L&euUX2WO56OE6*qTxXE; zg-SKnBxGT!UDfZHYuCMQGlkvVOb7mym2?WBfr-q00aMF|cJDIQPLV!bl3nv*9%Rno zS!230GoyM8oz&hZCQ63Oo`2Y5;mSZG*v$zbT%3{qzR0eh*w1?Soa^ta1Q0YvG^7#P zT{qw)S_LwN9KwDCRzNZWz%w9U=e|Gn@J6S2LlR}y%_WR7IWp?#ciHof;vH^PpjLW+ zJ?u4lK3l(`Nu!GG7BKqbPv?_w_>U!6`o>U-*ZN|UKU?3-FPT16Fdm6ritb6yFmXgGa(AS`F{CKwNADS|b$}e>C%O7FdvNW_I<_pcq5K~41`u@ue36NZW+FBH zVApb<8TzL)oD)|GT@t!GR6_Uqflgsx%qPvKu%C#m9aH6);Dv!#d_@uNA(LnUQ7>%^ zRkq4jLN%j(OECx2Q}IqfOBI;d0v>Rea{dWyP3perKk}ofAAOIC(p{#i)1%lBL~col8!`5YC;%WH?k;7>PR(q6*K{g9J@&5c&G zQG8!27M$q0D81PH6Wzm7Uv}zck^Zli`sO@jBNw?5HTl1I0jFEjt)JCNbzL<1u=_!K z49Lx^^`pfMQ~}Nr6Fj{UZl1%8l^M zB4C;)1yq}fDOXW$D&B^k`6%Cq-`zI!vlNXsKV*^1iSWq<9~M=RIkR9o^MaKN_ zJu{u5E~>R}tUKGit^brxEE8Da1AT8mDqvc_xqoeaef8d%>cFhj!bh1>t$ZB9aGsZr^E_Im>A%u`jwv zXbtZY>(p4E_j<_zz4h^o^1JwM8HX8=3d7i7`9q`)x&1{F0Y85jV1bc4Kx&!xGTK8C z?ITHFB_sVi<_&Umq{*I;9WyMJy`^q+0zf?nF9N4K#6#C^|I4n-3?mujRI?)ow&+(J zKY@mTXwgjSHQ0W@VmQx~H-#Prbous;mPM+|QFUx8RPg7OR}T7UBlW6y>lo%~V88hW zm=Gx^d?9Z3^KU}L6A0Lk^a^sGnjP-<9aXUF7o_`YA!bIKd?7VgxK37V>qS@}mZs`| znWYgS0Xjp!0)qqhtj-DTS7QLc!52K`nTh1VuTQIagYO%szk%>2byvjF?4nY#4+CIN z3K!rhL=SpHXpka*dXs3bVWIFf?02R3{~^N5WNcVwLl9oTu!h90tf`3ggf|D3dfSu* z=`j+N32BjScMTjBPhHPhc%yF)IDsTZ0OIEHyBNw(3^(I9K)^ z(H2DrG!JUFZ?z9`P~pWu)hUjNYf;%CYZ9b97Q+=WWFRIJrhi7DMSR~x+@0>! zao&D}igWDDd^L>P`)#hV*h}RdcKk~nFI@XS>2PtX86xTXEGwjjT&^--;V<`3!!Zw{ zh@YB|waD!sBFG8k&(0TI;lHK(;Ar0@W4;6cOTTO=^b0T|3DcC z0b992vu?UEgQaHS6rMl0w^=1+(>ywJZzv8_1kQcqA{)&-xHQ3Hu{N{zrh}K<+o!1j zd6#C;fy%-FEgHWi7XaXRpYk7BfmSJkar2RQz#x`HW`drs@spAmjND&A-@^?x3&H|>G& zoBpP6nvPtK;}?oQOkoXlfRO*L6XZ=j-ilj09sGA_5-T^@Zr9C8L*l9E_%xOl2iQ~s zZg0BTK{6f?Q@*2Fi+Dn)8Ya!Uo7}4)c zQeRIo>O1gXfVCyx^lOIZS!R5@HMbiO_0PTr03>UBX@tp(D*R^zKR>gE69mLX&MeAf zb4FgB<5^*{`VG)GH%J`+6W8I_4*d%Zh^(Sbl2kn{rS9{75XpUECjPB{Y>9N84L)GMnj1Qo?KUdKY8j;+FP=~N09JP%;`lGkuwoH-{&~Wa z-C_L_Q>rbt?^G$Ld!9g7zK(zIge@3D1Zh4vfN2?{Zf$&E-Xa%ly#5NBc5TfyyyiwJ zXRY=@|1}e?cQXlE0D}FWmv;*C-i-7hpf!6Pqg4R`o$Hjap{XNiX>y1d;Uub`7x<6Z zFTLuj2MgYX{v8cFQMgJCQ|#f^CN;I_M595DxQH2>+BGWR`9u%=3bk0pe8%vTRNpe+ zf?pA+jKbte=c<{1F7*p$;pSOaRXGvteQCb#ZEX0@B@_`Jr0|RX1~m*Y_p+EAsuBn( zN+W*`I41=B$Iv*THZq?R-kN@S#qXi*AqWL#mRBjMZnw3taf)e#lT@)MS4oj4_z_hQ z9heM<=RT!i3%)@7^Ll|eKHDRsecm`t0}t(ggMvFkY^xp>wu|5Kp}LuWQF{b(=neh) zqYNS$P=K_WY0c&RoY@f@-$f$HNwhgNwWa8k%T0LAK5BhqEZdso@T5G~2=JhhDNbu5CB1k5|mk$hbc|;Q-_$f_ARfMEYzaYoRfc zp7caHc(crZ3RC-L_DU~0#2b4t?2RPQqQ4IZ&I^}*G)+P3qtAS-@Qn_hJ@&zvD!%ao zWh26k(EOiGjdgguaf)uHEQY0OQm+^Hj2blb+4WPk#Wt$vIT(suig|(nW#6$e*_})JMxtKrZH8aw% zL1w#^1w~7fRbyy5_ZMdgPBYP9XVf9Rn-tixuf$v!nd(u;==k&ZS#7iRP1_ZJqHgm)u~Jk?4c6LdWg+Rj-A(NFT@C=A2O_NVL(gz=Dz5R1 z7VDvh=sPrxn5(e$g;d^bbIy?Xl>4r%NYLH<^7&qK;nN5kpjH4hh;;CAq@^XI*nFU-4{|KkM9G2h#=`d5$hA*97JMf_DjzT(s5Cav%(8443echMu zq2HFy&+)s`5UG4JC_+GL>Idqceiy#&BVA$e=LfX-_tx2d$M-FLPV zz8)LZ*7$%*<`H}|oQSUu%%-suXkObV`a3qM?)rYsHw$E&ke&sV z2?BgZm-R~qQrV%cYcv2O`YtkcOEn;3@P8bb9-S2`lHB9S@k^*EJ^ zX1}DfVdgzYNRq}Z4P1fVGe1#RfmY1yPS9pPXwG+9=T<%^S#YHK+ z5A@v~-J=J`i?+g=PrypS$a8E{%G7Ya0T&P=y6`L3L4J+4o-e=&_3nVn9-nhsXursQ zmrt<@kfdf;X+E9{c2$otpj8%TO_~J%kYQU{ERU%N#V0ZKWxwd$Tbc(UjL$wgCx(8L zBEKShxmKiBggYLiU`1b;aiXu%qfvbe(PL_dBnNV;rf^eH#^}ptE<%j#V7g*Ah6_-A zM!W(B5~CF~X_ofVm}++Lz)pXqI`Nu_QSjzxPXGIh5f3Vww0&YDAXp6WKgo|@;pQlv zwmu|pmvwW`C*ZF2sntdGMI!S#-ljLHxaa1FlYF1qwO~X9EVBnDG&9AsebZ_$cO)}^ z?^B1MqMca{)KFG*^(&W=a$kCy1mOhXVG?v}4fFjN8}+{!U&}K;mA|9xu)qNC%ejom zJl%MlM@6}ose*gzWs?3d13vh9xlQ;t^@=%!6hV-p5uyj0I-hrFr4l{@2wm_7oiMhT zBv!@W5caECPx%n2fuouihM6y{V@3yG`-3-Hz#c=&eim8w!Kdk&QgxQw?m%4c*ib%B<~5z9&@glBld; z(6Q!^bbk<2h|q6! z`>r3#O3~-ikEloYo@m6gXdjIjH*_!@0BS$jts-3aFmWS%;eec-PHy<(^AlQS7Lgy` zQV-`t>SkAI;yqDiZ-r3vvx}~FteH0us2|4!*eC{8Dl{cm@L!@Y&=5tj1UByPRjmR2 z`4NGkiW+wPj~lc6IW%?*djZ9SRKy{tN~YE8<*N4TMA=E#0$_C>fB7FC1Ik;Zz;#~e zmvp-dns4NpqP+&W|tpsv05GyY#4%6m8u30@-RvQ2!n z8_@6R&EvToMIm+hDg!OnAo_1PY@*U>PCkWgtGcB`^G8wePPXLICXVYB{Fn1VYR7@K z*aephEQ1aDd!Z^a4p06u+P)yUq5BM^m2KV+aj2wXyL<31mgLK%)yztb5yYR7lcxf6 z?vfZN^@btqLw3;V8rb^UkiO!AkGl4fZ}2&K9vBS<@3<(@;OAmvf`xnaB8@UER>2i) z*5jz?l;H6_-!T|s>mTf2X&W*o}B*cEojt#b@vC{`~%*_nA?8xQ8=RWY?8aZKK zHVvj?dB70BiXaSFgQlbyH-G6`8_Pg&V3~#xm7UWrFt%XcrN@&lhuaj_x&8rjhGL2#@KjP{S_FsJ-aR zgtr~TsT;reee)x%@}Z|6}j(f$Ha-5nY!N zNmog;3u5vYVul=r6l6I5)ebK3$icZU$7x~hiXoS9p@quNx0F$4=}! zx=V~>!gXMumJPUkvh-s%(M9CT?(j&b6Z~fh>_@y?fJa(;ibJaI9pi4_<#!s)5Y4V>|<0*UryO7cW3`LW{R-9mq_{A4bZV* zpjlTZdZogA_23-X+zXO3AkP7;h&o(hFAISY3?2_q&1Ree=7`d`46|$4dUrdx3ZN^p zuUHcqFMFGx=vy~4#UO$I_Nz9tCh=a=-*5@yWJ#?v`EsCS>Pj(4wCBqzz@>M*W1m8? z;V2TcY{zfSr_4^)jtB4NVUSZZJ+v0~iyfnb-(dUR1XGZ+%^LJ7PK2f>5=2`igy)x4 zl!_zh|GyR>uDKb>B*zKZ!_SPTj7h1yfd1T$zCiQ$GC)>aUl(uCqlmePme%OCzdhqLD*UT(G@xa78#qq)Eohg&0F?xOBrbcaZY&>BZ$OdNgf{1=^E_ zNVoo+(%Bh>*NV*foJ z{2m68IDa^0yD=@xg3&&zJuD6H9XycHvD?)2noQDw5ur z;*#k?Yelg}IR15MtcqSJifQx|1qu@zP)Qh-R$`>tW=$u|sV7GJB{{12+EH7V(23tp~E8 zn}eXs)ym(z%ORDzieZPi_fO?3h0iRrRj{0ACC7UMo|^bAG6VAQEh7_WJ}mQnK}}(z z3o6W83*>&7Q-u7s7=L#k9{>;_FvwWte%sL&SFQG2(qI6L1NKr?hj`Vkv%C!O_~0&= z@T7zibnXR$bnvwLvDel9ZaPbe5pA%{67PfTRZ=N}2xknx_Z<@J;-?uZCAq5gl(LZYo1`sFiwZ^z;+f zB68GvN89fbJ#&H4)sGwu+B^MUJ4B1KvwaJO3MSA!DiHN%fp~bxS(9j(Zq@c4>R=>z z$%8=S{8@Kb>D`w!3)8RSuhhJ1h}R1arCyFGcs=62=%bj))*7fUQ(+b|d;5Q)4BwRA zHfzT#)S(WA-rnsnc(m^2lGa^f#RG=!_u=A8Qc^+7dT3{WlH}KRWhX7s9nod?*fU-{UGuLfDe&Ga z+aqG^*h_eyo>a?Q=U|55N??v4mwJ1a6<)GMsq06nCi^V*$5nN#Qg%{X=KOGPdl?Vh z;5qcT%3UYFe^D*MAfKsmV)0YWh7-%#6jJM!`oz|iZVWPncVZ9>Z{>Dugg(!!_(;F; zLETAYq4io@+kJ@Yr$4jtrmc(e1E`UN>Za{do-ZA{8l;P9Ms*%j@!RpcZ#L^vuHIt> zTza<7uvPTg8!=O8cHB9_+47$a<7q1Pt?_Md3%jazv=3B2}u>VofxW8VfeMc*CVkm^m-PwoB7TX zb>c?wySv1s#tn;xsaY*L%bomJ(a+f9_M&au;I?Se&fOIE;ztMnlU>8F(O2F@JG6#k z>MFl=568CUOPdEwFE-O0v+gKo6X^K^s{`ZaL^EO#&SL}r-qH(+egHjJflh3gZ=C8F z(`sMa_0bm&wki6{JHZb|?F5gP{`G65`$9KGc@p|pGZA-iKmEJ{yrNpOH#R%q{rWB> zA6f-T{4#4uR;jFPH?L*%*vQ_9dOB1iUEgbYm>Q$VS*fwN3>@87t zcK0WR^nvAk=)ZnPkR7BK)qiY16)=Qb2KO_>#hoAqd1631HLxlIsR3KYnqHp+`;ikF zL^wJHbjKy~6Z3q!CZ+1Kai!8!hVM_nApPY`8z^V>=bHcTHt)LS3>NUS_Dyh@uS~cf;2TA(O>>jO| zm>EI!eYv5TdD$N~>V4kGYjWdUz0$mBi)B-GDV8aMnXWP2UgV}A~_bbiH&={II;_4FsaFhx;isVsU29RT%mbV_qKFB zVhl3lE&B8qc72Wj5k@QU?D$x4HqhRf$L@_;t~+#z?Hh`t{U0I4Q=g>MR1ZZDWT)ay zmc>THVSyj=y$WzqO;TH~`OD*n66sgKxB^E=(N{FK%3yh?uxF0nk;1BJr^Gqul#2Z3 zm{8_!Hs2Z|hVJx$b4%FZzu+~-n2Pg5y$>5-VmsrF`VZ6ANMK#fFy$ReFc0g(s^7Rp z6}Rb~G7p0fEoBx9)X~M%)2sretSw$NWrzg6$Yes~FGR!qHPl6d75k!vc7eqNy*T8G zH8^o;bV_S?byaqqT?77y{iVkh(J05$lur2?G4De83_0sJ{<=otcJc=izIYT^0ia9L zuJ+1TdXh>q*_Miex%;@BcYL6t=e2QDRqPNU?dL4(1vE#N$kk%W-Hc@qf@_X|AFu{K z-~%Wi>L{^oSpMP8*|xa&$=H;<5Cb$qFpi zph>{iF1*};BKuceOZKm*gTpbGRKY`lV*h*{PJjIad4EFG-a^!Fp<)QO7#9JnhBmuV z`#*ZYM`c)0%hEABF_(NE0n+yN@|P>_I(WxwJvH?R))ia@!()T{OI*_I`|S;3AvUIw z2!;6MdvUdhlxzlK1!A##tY0{Q#4KuYRI*F`q#y-r>j_H9sTpS=t zP*(ADpRi5AP$S5J*X-JN)G}uBFr@sNwDmM*glpk0vghHI~ zoBr|WUIF<85Mf+4L)nd4p$<))LZwUAK1rN!Bdi4;+faj%^5&^oj$WE^?veVtxVMnkZ*BYS%o zg59g|{j@mdZs6k`RaVUDG8mRN^Fv%3z$8u7G%gpvZF)naFga{~2I_fyqdc}dclLa2 z(v$PJU~>B0b8n~Fr{~Y@By&$gEnes+__DBrMhoLEXX+l@z_eV>|9Ij9RCMGY5a@|q zB(JG8!I=P}E6Q%dzSzZV{p)~*VOcTQzyc*Y2NA_zLY~ei*J(gLo3UXwC0_vphykY-gK1Q=_UJ=>jY+tF-)y(waZMTA3&NUUq)-f9kPYr^Ps2dM- zyd9^|8P7NjaQH|Ob`U^OUOTu#y@L4;c?iq zNojtEOm;Z?m!!U(a^T(H(}c*qS%>D&fn8Dyc$qY-@C(rA!)32axxGmin=h*alFx06 z^^VI{2v66cM>$%Ywd%TFgEMp#_HZjF2aBOPojF*QifwO3DW=k&UEa7iTirElw1LST zKz}6Dv7-cH0e2^Kd@G`Y@VC+Q(Px-w;Mfov#zaSlpAUN4N(-pjaFRI#ncL5awF$I% zuL@mDvMaPb8YN3U8jdd1Zu*Q>bN6nL^?I>h>Y%pJ3G#`Sk}1?bC$RG&lD+ezWXmE( z1MO5}6P*3_!}!eMviND_->K=-K_XM{;Fkce87cp zp6`dN^3Ry^b)qu|)v6M&bF(m`(t%|8xDl5;7&#@(1_c3yH0j?Ji#vkEM8kaYRt8*r|QY`)BFWJ{g1 zfzdZgZo~GN?Ro2bfDf1?tUaPH=4@R}72-RR>h}xVmpaeW*0J4WaSn`d5-6>v$qCVg{(d|=^;kxghCXA@YHNi9fVNCaq_^Bu@{G>d zTo~@^dKp`qpu~%{Ja=8v#W{7JaYe01#qNUx>dj9mzg_=s48$%V%N-Kle&0SIOV(a< zVaPMc5l`1cxw9TLFn%gZUo9a8EL3u|_?K*cNNI(&eD!Ew{U}oN`dFV#ta&jKZGR#y zG|6Fh9*><%-f<0P8aUlKNML7(p>05w_B z5qVZ)nB1JGVZsUfJ>fxbAo~!4%9gIv8}2sX{^A`iR#Emi>hOG+*|{o-9N2eJE~UHG}Gnx5@YXHu!=(dE^3)KJCVc6d$my#`u9 zr+*n#E{&csh2KtTym2rFDF1bi5Zjm13bul)?TVG>pY%5qXoSa>rPV>l-E+3a-P_6> z8P!tAle>-nSsFCw*ct_U0-{*IB9-`CuZA#}Pr#?{4ZS~!$tTGJn1safNv&=kyI*$v zjz7wnCflbzq-&N19;k`_Ksbw z7^Hb&<1X04T#nF)1CE+cz%MgS6HxeBTq%obLJ3NX9r7w?*`Ph!G!mhhKl8;K>(9g)+8!|PfV$tUeF{%;s#VpA5M z*4uULLf=ciUBF{i%Wfp&mWKRK@>TWwy-l5g&cWLkgaPOm2W#Njne{yAv-h-W!$N`U zdP*Ue?x)q@sAfexW(tqo;brlR4Qy%lG`-Vdz;`wg+V|Gqi;%n%d%HepM04_Ji=@q} z&XH%0QOe5X5b4h97F(C10W!xx+3#t(Dd>XOoaFPxHl=mm9HGps+kL;ls-zB$W*bEZ zk>_%;3WemNjjHgRdlFV#+#wK$oufvxtzn_139QitPc6IYL_AXJTMhaaGzS|BT6xR1 z9<(+&t$Vh<$#;4XTy4F5046Xz+B6jDMo8jjA=`U(#1V(VfQzT*gWszX`Me}cVDz4+ zl<4Eg2D@+tu(KT|hV|`%85Ae9_gfZ`YifEj)4KmM_k%U_#PxpqoFsTxdJFDE5c5<} zFC2H*Op3Y9zGhQv)Rg+(-x@i51X|d;Fe+9v6!}t2D{Ymr9h6+?`2E7@k3g4L7m;3f z8!0!PQ~b?Jw1wYnm3z+yz{1tz+|7~%gO%9HgQt*RS4mZ-LnOw!LXeB10|7xf9OO?f zT_S#-q1N3K$5}wS>&Is=IWKQiDQ2p>%Ryb>`E|CxdIVZNAB@x4njq{IHgVL-x&P^C z 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 KQU5acWc&|&&%;Up literal 0 HcmV?d00001 diff --git a/doc/_static/remove2.PNG b/doc/_static/remove2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..eb59e9e4e6bd62bd3e0f8c87728a0c9292c25d52 GIT binary patch literal 12111 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 z z@%r@}LBT$&<-P-3Ao+6wxvw&#(L97}d-25Xndlc2eFhCwQnkUIt>ov=t`S9Rn!^y_utC6STx;u#uaofxcla^O9-W+b_%<+)EAEJM>iA(-8{Fuz%-+L$u*gWInDtzxf)zznfM*t{G%#MGv z9EBzg9@-%)x6`+D{lmKjO!3U&3cP2bk=@gJ4S^}# zHd;C=9jmAN`+MH^cRSZt(=&70@w%a*p+iIA6@Y;G`xv!qfm>ytBqq?MR9$J z`bso?NRK6HGu@~5QSoE8A!)lou8`qWdRLHSYK9k4y z7VFhIUiaYuVg1I0=&=F?eE|^O#v0y!fhp*_M)tKhY<2A*WuhRJ%dW|7IOA7mnAh2s zQa(lH?AAmSaa)cht=X^gK2c^xK)_UzS(8J6(#Xa6?8KzM%4Vs_dxit5 zQRbGpc2HI>Hyvc!$vi>nk@w*H*y~MbU#lB9SdCoFa57p(GIVls3ip;W)*+=iMYL%& zkdPu+ab2^c$kSgVB!|B17YrScgA5@rQ!_Jl+w@N|tUUN=63@2JJrO#|gCQ)Xx-eFy z(g?9M%zjce^c`~uc#5T%kV4?HqhGf0XDf+~@rV4N+tJg}DgXYR(8?f%B|dt-ED$gO z1ph4{SNUse6m#2m3Cf=(m==!o^ez+Ph2Tt7O4~TR{E2Q7M)SR{Se1Pe#o(aDTdq(( zonQRjJ9`#@@0uSU>SbwCK_CLX_n$ujxbH5P{Dg}O+XX<8IPK{j#FoTEb}Igx7r{luu9OJ&(vz|kh70}DXwHx znzWl|GyZF2qCj0NFvu$N;_30R&;z=8h&Y5M8W%mfTM<{>bX#}SLbu42nwaE#?ntWh*`1JgIV%r%AoiaJ2Fg@^bJ2SI0nw2L} zZ^`KxIKI9!Nx=bCe*U5K*u`I#skD3TupoILvu9>;+lZPA% ztl3L%Yk56p--{mdWo;4aY?FQ1FrXjNC;Nz@{V z!O8I`)BRUoh~bbk5#65aiz2bJX%&Y`-Bk03thH$1Iu;t`QZXZLKMX4p-W*IFx;mgB zOs^QA&AD0+Z7F59^gXrgohC~#ObNzdkZzVy!mdtgW9;>N=(#%^ikN{Eftmm8?Cd%^ z8gSEFJ1xAMF$H0ur0OXuM!gD9FTZjEu~e``SyREPniJEzzSYTmhX-JDX?74~v_V^?m?tnkLVh!&6?h2^ggOFxdt@uUqe$$ZDro_OTa?lCF*p0GcR)baZsTE6afic~c_5$0~tc_;9+^<#eMf zBSU&-26lNc8y91FxTTSlxw*4^w7!|?ROE^p#DR}?Yh<*8PI$&6*{DZ{HO+t>fq~(# z=<0f*Qm(6jgh8wUen8Vk&|kAvfF0Z61ax%WoA;G$ZibQ#qZH|^afrWRy?FLXId2^7 zT0@I^*2c!F%m3VbvJHNRi#%^U?|x1dRLo|@#H6jP6kc6*Q&1d^mn?Bn{FN<;$|&(^ z&u{4M_ z^S|AWmh@9=ye`KH<-o=ZtfBW64y#G@AB6Ungav46=YXNC_3NCna)_rpKp)UsbB*bE zMs?oH&EZU^Ra?}I1#^7-p3tWP+S*|Vv>^k>?D*)pwk^6MCmRTd<$Le7UsPXf=G|0Y z8S~&(Z@`#mQ*oEiSp+UfU)$h7bb@n#An*2A^^o3PT_@4NAiKpnRZvw=OoVZ!&J>Sr zKV05lULGuz->L467>jW=t5v?Yk0d3^N72z$ru;xBGhug*C_VwN0UIMA=!h%+&6NXDrRX^i2 z`H2-~`ClN_5Te@a`DTdzSk?i>TwwF-k_-NBk&;?ychH>mUrwr)hxBXQe=r#8063`0 z{4jU00I_**DGtdoBo@4vfxhdMFWc=~;3dYLp*ba{Szg*zG;laLIraDTIl8zY+T#Dv zD;e9S`x+yY1Jv#uWgHxwya~(fkuR3Xt`M}f02}U-OO1I!TIc0qrNU68CPzS*@3-hZvyevD?SEQc?WhjwAjSNnDq2%m_p{% zh}ttWS;i&0>J3LK{rC?mff`53?keVCQl#_mSBS#(iaA1ZqT`9!%9++}Xx%e%eC=5= zHQZDTqb#%>_@x73^L6W$zzmNAbg?wz#MDIh+k*w%!Bm8nd#_6)V`EnR+82a`o=1Ov zG)zywzQ6fYs7v(X#S2o>VzmMjj%3xDm9;JRE(8BJURk)T5n2s3+KDVmVR#7t8rW(a zMwCN8PVUV>zX4PXU-GldyF(0w91rtV#>`&e;2p&7Pns!FZ& z=1cRVuRln8v^kiseK_Bhlt;b3nL`LO!#qDfClP+YfqN)3?gphL*ZoBjVq$L~zAY~s zKv-d&3w16Z7~(N7Fl3&7#`yc!FI_;L1s;^dy-WrYnTki5g#B78U(yOO?#mZhhb`|Q zsK>|k;5<{6mJY{j1r&~-s$Z_nL=%@H0V-=ilK3TC2rm*7Y*K*pwPWRAp`PrGXWS3^ zU=4U=a({BE1ZtGPZX49$u4qnU|-NQCOWf1LcpqLAAo9O9nAHjMWWA~lMvk#foCi!^}Cf; zabbd3TzDMNdw_^MwfjDYReXeVP%{Y*GvL7wuVsG9f<zLD&T)G0``n0L zhBgM}+FMD7h6_(PV~hCNt3A`_)LKTvJv5FZo04^*J~#!B_(NxQXQ7di<1;SVId#{v~X88EHxxXn&-Fe7QJXO@6v~wN9P=b=8{l4og%{f!%)8>IatMp6dhiS+AjAx(PdPhdu+uM6vTXWl#T@#)@ ztaPGgkC+n{q@|{!LSMuu6V~FB2)@P1!x$NuIHdIxOlqU_St33$w>)CPPg~=dk3Gi3 z#862_?1jx-0u0X1Y5a#sBOzYe#54V2D!tip@#hQr{xVh$J>V%<*?|*=Kno@8;4{Cr zVo}P@xUScQJq+hQZuN*vl99hSTu;~Y$IOc`fS^U>QnlE#k$!-J2e4ZQl7pIo6g7Z- zT18dAetjvw=Rgx1tB|EBIA$Ul`vm;!Iz%ME%kt6ecB`-RR1$-JZ?EE2XS>jq!P=MS zf~3Rwd@UQd_hnyH3mgePA~5YA98CNWbNZopbhbTq^YHMh^A)E_#aeArEcmeb{E35w zu!&b3NDB}5QX!yJ@s24$iaHk*YC=;Btmf|pLpgz$0vFfRFk}w^>(6Aq$j&ZWv$LzB0=z%eGdSqt?7UW`V~Q`4r&3p2 z=cumv%WFSQ2D$=%Q7Y3RCMKo^(56(+7CrK%>R#n;O5Yec@Rz2jg!kD8wdWu zi~sWi@KneVrOTT+I#}|_t}P7B2LbnNaOlfaP79-J;^m;-F|dtlFbR2{ZDks<1JlyR z&KT$5xrf8;ZW0Z#9{cC4)0+S=;s>N$;#(ODqJ%rEG_AxQmD z4sz<)wzE;`m5Q}BkYeEP?m;4k$QwSuh#1xI%gS72rHQKtM46jy$Nf1wDA<^jeVg5D2xPrM55!@oFXK z{ccva$rBOOCrYOqmFA0Sx!cWyZ;Sc8%al=n&-gZfF;RJyyx$gxNcpூw{OZR2 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�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 Sy}pb7e*2cPY|ahL)Bgie*%jje literal 0 HcmV?d00001 diff --git a/doc/_static/replacehexa.png b/doc/_static/replacehexa.png new file mode 100644 index 0000000000000000000000000000000000000000..b846b7ee417bfa4fe258a56340b3502e3506c27d GIT binary patch literal 21689 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 J7g}Dt`5(_NvIqbG literal 0 HcmV?d00001 diff --git a/doc/_static/rindgrid.png b/doc/_static/rindgrid.png new file mode 100644 index 0000000000000000000000000000000000000000..356976e0f94527baae95b27121417e190a99923a GIT binary patch literal 54163 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 Ud*s8$ANAPw>~!BDaSjmv0Z9JAssI20 literal 0 HcmV?d00001 diff --git a/doc/_static/sph_grid.PNG b/doc/_static/sph_grid.PNG new file mode 100644 index 0000000000000000000000000000000000000000..de084b263a03f096c6c3571cbc89b8e753033a25 GIT binary patch literal 11054 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 literal 0 HcmV?d00001 diff --git a/doc/_static/sph_grid.png b/doc/_static/sph_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..5051da22ae5850963258b1909d2db4c90620ec7b GIT binary patch literal 13305 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 literal 0 HcmV?d00001 diff --git a/doc/_static/sph_grid2.PNG b/doc/_static/sph_grid2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..5232aadcbc8ecd799c949a70a77b77a5f1d67213 GIT binary patch literal 11645 zcmYLvcRZWl7k>t^Qd`7Ut5qvRZMC<=23;Y_V$>Ns$`SqBhkQrK+_@ixMlPcD44_ zQnOZV`pf70d%b?YfAT!{-se2`oRjmM@xCX)bE=g6kIHFJMOl!cf*hI(SmO8f}z_qzR*8pUl9F4oBM z->~ef6Oh1mCHVLOkdQ~@4+lzs;7>BnxI3be+VQf6Z<8n7;F*~hiK`Rt4OvjF90MSlzLxoAg<|kP?}d!z%uJerF5BpuYEY z+t;4}CdR-F|Gz4L@ICK=el>7Fthe-s=8F95SpO^8ZPDBB#T-6;EXyD(^&_}nP5j?x zL?ut{-ata2T@LU+iOy%=b6U3g`kN<_70N{Xhy=sf#y^ZwBDUWqRUv#lTDs3@Q4avR zv1hRQv2OA_SvXgsPI6mor)b` zSr+ja#{OgW^uvForEbKgv8GT;AYt@B(xi2ti!l(KJVK)EyzKs`lOQG-Nr$X4^6QI; z@lW9!H#WA}D9E(8-H3MN`4IB_f3!gvK}WP8_$szNQTjbs;L#Z@q)`F<-vrZQtB%V+ z?EiROb>(M~om+BaBr23jc634fZ*52 z`#hY@93mT~rd@1YwT?A%QQ$wxSdb|+O+J19G4Ptqz(nEu96u(Y;S`SPq}tHrVe_pR zfG*(qAxD(~nL-JaT~|)tBj?rc;7AD2FdWB}MB4oJ9s21hK;$zq-cL=7b++Q!Rq`KI z90K`&3uJW|;;%Q^@oAAI)B6LRcvHp^zymbo{6QJf74PjNqdl^93I}D&f&|Z{o4?Bj zRtWz027idmZSsPUIZO7-$d-Sho%J2H^S2s?29o#55*QdESCz<1Tfc73R)dAJvcfon zEhzM1FO@dF66jD5at`a}9@2uq<=^JQ>wY*`nYQxwtNSe+@u*k@KiZG0TzwQS{((hb z>Zu=}OO)HT@b=OK)bJ*1fpGIX8-$Z?L*JF+Q3MU*y-6r47@-i!vZYQp3Fh0@pI>FS zw8+PmLHe%=>y)+?FzuFLY0l;{z@4pT4o8dQ_Z^6P#hq>jVu*cuUdjD*RkDvT@p|Hh z(g%Xw-q-y+0zfX|*!Chh#Ab8#;eHQ`%F&5lb1U`$h-`LObH`2mHSG>M{_k?)tso|37x^@ofs0^WEQL5fZ+y8Tm4{a!zo)xm0P zCn=yAh0;Y4t-14pCei~?)l{KL0E1iFKrjkRWdgibo^<40F&p@r*alMg-cvP62gT62<5aBcF@wF{uP7@g-cl@?og-8J5~~K`*xm4A zBK&Jcj#iQarjF&y;rRsFjbbw$9AqEdtUt} zc`M?jxQFekS zCAF{R;V_gdRi=G*X_Sb-rCxU z5Sg0zRw}miH5(@mh73-urTq$UGyE1<=I&hBDlf73Dnd!``m{i|$iRK#ph*FK!akZ@#=&L|G|6R=)Cudqb?2GQ00hQvE;@r%rKl@&VSy zT5P>|&t>^@4H*8u8opVPj=&W@`Nq`SN4+S%6O3{z3Is)6p=u z4Pp6c-hlJZ`$pxryr=w zX+YqcP~y3)0ZIaye)|^l8Q0Y5c)8a9-FvjlHn^p7QtwIotY3i~3r4)f!yd@Y0z|fl zuC2WJ^3uSg9p_Zh&#igZ@PeN{@AX05{$O_L_N?Cz1NAuS{OZwpl`F0#RZ-KIr7qkE zXR4^XBX+W5TxYSvpf%rKG_GCRDLgQ?$}RF!i2slA{oi6j#=}eV<;`38=Yw#~%CQoo zt|~?k-~JeHAmUnIB4+%Z=%e<25JYXLaD*sT8bABi!M;9r_jTQM5E3q0N8f+jSJZr* z-73{n)Wq7vuk8H(F}fktx{1BrjoLmUvoNhjV!YtPyXzDZj7+;+9m+9S>2(6`WkdW} zA^C<0GXYq+``ZD5dfcWq?vS_8`$X*Z|^Jri9Lts;Hc7?TaZ*U%%EJLr;= z1t`dMBW_4RRa(ig$hlVu{fg4#SJXdHfkg&%g_ za5cnF+Uj+Ou6LJedCs*wyc9?ARzLBSmHfY{gub_Ecig^GmITiiCGvAF{*0v`1&AyT zp*kPD{^uyU^9q=;6hNF&E zXGG!?iy1e=@rCP>oX?ffd$iC#!)L2{V!bX}#NvE1-#giYmvVCYbWl25v?&E?d`Hf} z;G|wUe&$tM3q!L7C9>?BJVEY0G>#h)XXV`aAgz{|e zvsM=2%u*Q-yF-5h4CtOpS#BZTNjkOk5qqK+bh21v)T=>YH^ZfbvJ7!=(GxD(BXm77 zY-gBP&=(!!IHD7mE-G9XPfJidwu6+k9eGAo29!Ak!kco32Bxg7`j>7W=GC~byAkQguG!t%43#&B^`3J6U_ zjZU|(XSjTco(K&qkW|^zK}$#DI3>~w40O!V71J+S;I{eFw8oWx{yK*an7IG7n!an- znYRA8>`|OVi^&(LYL?Sk4LQR2twqs76@Nqjl(+3rR9yuH*w`L^jix2D1Z1zEQU7_@?LKj5KQ#hweg1s`zAmQRu*~MY?_}VL`BwFl>1SB5^R=O4gO0Ext|mjs-FrpcXX@ag{DJ_KAU~> z%PIUdC?`GT;j$-rBRhX1Gm_nH{N-f`4@#Wf9@4o%bwOusLsAOH!R~~N>U*P<1fKkG zZ{Kjc5o~RmyY{HUi}I82J2w}v87nQzqVDcdZmZ}1`kVF98SkHWybkpBiswXr zQ@OEEADUPGUAa9jBd@tQ&a%^!X0NsY(yL@f~XEIlPK@ORCl+3cAql%rwv@`G0( z)Z2rbmuEsM8)ivX+jeqAR|w>&A^+HsW2d#NutNz=0l&9>6FcHZ(xxN{sB8nY^fN^$ zvj5gaGkrX5)*iia#iqwrG-hbg5mslZa^ zp(xvjSm_Nyd&%E3SdXcm3(1L(sqW_TDSp06PIPoCg~ z3$=~YePa(KSP*PuwYJ|X!zqr#2d9BT z#NpB^#hBMK&I%0l(|!u_l!oKC?xJiGqZd`>%jeJdx>oobNlF+IY>r{vhx@YPXyfZ!KjBu;Fhy;M!lAh!kJb9U_jL{nDRnd6(!F0c4%!)NfgB|K+-_*xz zMu&R%Lb@Z3Y@KmoWNZQugExrcBk)Yl9*Sbu{#INgGPauoz!?7OZ>4@Sqxn>|$eGL5 z+_K$I1O zcNX-|;h7u&F0h=M{JxB1w-qwo0SYYNSh%w##b0DJ^f-Uy4i2KYXuwcY_b`2a-1L&A z<*|7k5<`tkn`0j_enm&fMM6+`n?I9#pp`f4HctU0UEYUMzhn`KNu*E=JqSKuzj``N zzwzxcP^&$e70wNfh*IXAL)?>pqJS2c5WF%3U?y`N>MziA7i4^}XKZbw)b}ST=itO0g~ql^|L>diIMYB1sXVoYi`5Iv$HKcs#ET~%rl>JbOWu1h;6KLkUy zXJlYjv;m>m*XIWo=X(}MSJT~7q+_l@q7CI&+Objd9j&LOki387L||$m%_H4m2j;zy zh3*7(UJ~il5CTi9#hU2sB4QP}g8JzA5UK=b{QNdUT$uXm(h~*|DhMkMcB9CMPDFsK zZ9_FR(Kff>M?De_K=o8rFYw*Ap~H82q11=@Ug56H=}^qyKSWdOIUn6@#VW0tT(_L- ztaP*|8x%na?VRyuLPVqwE6ua}oYt^3goSJq$vkGVQp_l7MfpPCr(?I2m>z@|1&#h4 zOP<;>K|wZn3$e*m4%g`OoP0Pjj5gO1b;qN27jQ;>yoF#DP$g9RWp=I_Ns<$}NJ#K@ zdSA5E!R#{16dhUv8hv9~Bcw39sq~(@zw0v$Qb&;O2j2kT*=QN=pa$+*PA>oS@V)4F z-s%iU>JpixRteqw5S2a*s)RPgeG^awD1wcWsPg8q^KVGdwNFB7k^O)0;%E_E)>+Ume!W6SxXnG2a0A)}W%lMm?wnRRs(}N@awegxay{G?y2ML%(iW%*@Y=VZYgL zP~d*9c!14sF_g!9^uG@YhnEwpEBVqXf>E|AXISakKs{LUl?I+ApzBAS*C24f z9ZhQip`}%(;m3}4$+Z*hth`}qTe{9X26UVKCO@Dz(5*V?MNnP!)rTC<_&^9oZK=*n zHf`OQa*|eBq@7 zT~d`q;uOD2f3Lcy)eosJm4gB@7O!1AQ1|Luo@bbk5{rMA z7lX7#G~=|`kXAX=AGqFS)3mp1hhF^c(fw!!fes3(gm~XQncd`g3`>ZsriLaQqeldr zGPV7&$KL*29{z9X(Jpz}mxIqIR?~KdXR~h?_dS39*5PjP#Z)v!>xn}OZuquDY1G91 z=DMNUfQgq3chfSES3Ca(l3J3iY*4n;63jpq(SX9dpBFMp; zo%8E`J63S!T|s(jDl*dO%7-XvOz`jsM}ALHn=$9EbO6dx!xPiq+CprEK%tP&pT=2k zTcP|^*26TI;HOJ>X7i_a_#gX*Kb_wre&H&AspC0d?`o^lr1-JyV6fL7``z>BX)Xq zFr#063MXxcTO;s-B!aq)gXMlQqT=f^+ZZby*eV_Lyy^W(-zkW(cQ3F#p+_e;Qhq8i zS1+$w$*9`KsQ|+`DD5d zjP@CU=SvTRaH)$HY6?A)j6K`&; z0HHJt1mi8Bg~qK~Yyuc0D-Fc*A6L(A~Aokm)UKXzDv$>jTVmB89S+>r|`)NfBP=Z8VFZl6ew!D%MIjd| zRL74uE!Np{YB`Tf{q0laPcN|@3Ga@N{@#r0Kf2-Nh;Kbv+^Ob++8rl! zZN55p5?*3wgNtFV7vu$_2$|w}@3KPmS4~kuK&Y4Z)C~v1cz*_1%KH+eZ_6FWaq{uKCTUBoS^W3wyR% z+MuJnWZb~E_6E4Z3^Phsb?Dj296;h;6$_^(`{OHalqJ_b+B5GuOez%}{)m3O zgA#-#yKo>TDEmwRES}dFDDYp%xXeZCOzMRFO`G2vcJ=%50~&Sc>)(NLLjOVJ+UM`% zaAA%fSHBd^>Ff-XKuJvbznh$koy*3G4WW09E@OWExm64qnnF6f(IVGPH%H+IWcBOk zOKU!L>U!z^U;u58SUFX%mXt^XVyUwKhFZM)^@`1#X(@l=*Q9E_!Ko_t+8@_PYUI;{ zU*VW*42UYt*YCotyx(~nCLXEHRh?=GD3rt)REp>9uT^_g%&Z;nk5WUUDe;-2)^srs za#WUXFTN?i6y`;po`-3Dn08cJx^K+cjVFBh6gl@pWd~caQ}%~tt>si)$$!{B1!J$u zDUQ9LibC?xcli{2XUyas^RU*o2j$!#8XR)wQe~^gwXc0VeQ3G0 z(YxYOgv&t4u;wuh)qbB!(LtO3nO2!ZoWQ$v(Bdj`H-;ZJ-)q7yids7vN9nj3+T%P# zqo9gT1BFq%(0Iukd%)RbI#HF9fx%a5rIr3Cp+|~4uX<=AnRt{W94?G+cu)Lmh>~8& zq5fs4FX`bZl0-UBw(SQ7e)4?Mz-wL`6SG#b3;Q=m7Q!5t%5ML*ELB$2%Z-FbhX}%0 z`iISRl@0|haFf#7^rR5`lU{dB$mZ9J&&hO8rh`jQ$F{|T zQoT-fIo2~G9ay)M<9WLH&3x%>p6>W=S~Q z##z~d$4mLrFSYrH`YZtu+lDfrmi@DWf9wjFqDbMlL}IOso8y0&;#&w^UZ*131E|{w zDq18k39@)u8ELXBpjGu%(eBOKj82r$g1~G06!F1(H~R;%(Kln?#Hl{DyrkVZkgG7H zyl4$si17f&gq%HAR=E~E!8J2!g|6B9wsb3twLq~_V)NKS#gJRVfSfA{63 zv%RRk6@3d7!kgUa4~@H>=FDaM2y){)*3se5(dt1&)8nhZq+k^S+dqW zY*fDO(iHNf#Ow{;dH-KZvv%~sUFz~yYU&|R?~YuT1arVtc@{IusnrgEzfn&B8?`%9YN-z$aMGl!dR>5bNrgeJx2Cz`iW$Z^uhCNZ@sUeOK5+VBQi_GH#_Q|gX$ z6bT!w6RPbT?>Z5qrG&ttSdF(uj`ra#eb*(*Vx~Hlukng7Q}b%8EQ{I`)64@`0+TH_qQ_XDdT zG-|fbOlNriZ#Wq|{^+;co%^l>|Mk(>N~lE(SM4Wu)#! zUFZV1PDs$n|CT?7v+6RUJTo8$T=*RXS3vU&D2hvvp)qC~A!D4mor{Kfwp(dr0%+JaXYRcCBVXn4iVklmDgEY=-F z6%6Xk6tB)Tt2WF@v^uwC9G%uo`YC{=qPGq4ixK-E>-kAWua|i{hfFGP*(V$=`!mf* z)y*)AJ7judlLBvn5>nnVuN2?3rh9RheB$C&qbGN5F}3luPYm&5pq%xEbRbi7``U9A zPPw=*3J=)ouVk;@QqvQR>MoG}ZpE#xBi%bTzN=XH;y@9-Spi5x=z^f{lQ|_sK-uOl ze~cZO4bMHMyfMgN7#rKm?xF;-QF9C!pD9iTLLJBf{CTFdnG&|)+yX-T=)sB-;TJspoou0MgNicL$1h0U8 zTMfT4=f-K-Q#Epzo8`V~LnQ%Jv_W`dVU0fw6iJUmx;~Z$K@uFPuZBW>CQWK0Y%g}T zlBq%#MKOa#%|{*%GrTAhaxlmo<4h8JkmH3eigXcL`r@fy-$A!g>@O$!Qfl5w)2>T2 z8>lVL7<<{pC-~E(>{bZqCu1f;*PFBnEJ5?*D-dp;;uR@c(-U_LaKZT8!;Gs-w{y(q zh`vp$%o~#3Lqc!BQ60>&E;MVvlh2z#5iUWP*uq*vb!w~3Lo0m?a~pAM*OkX#AG-UI z>_>S~J43u3!$TE3x=nIM-cl9^%0{a--WcY*=Tmkt<*x9oJq0v5%U&e7fOHN4otMH` zx3gbGmYl)h0$C4Fh<)aJ&<%)W}9+@rkL9NNHRFsBgh%f@gE|a z2Q>7Z-q#B2!8PsYAbm}u$>?k8Q2&dmE9V>_@X(h#QiuZkR=EXAcN zV0u`-%SOuH=V_4h1wKn1sUWhl{rPbL>jr#rB^sfA^Ciq9bJFx0EdIILp{iDeLE-iB zd~}Gd(`xoF_dGr4uM1*RvtJm@C7Bmhfh!H!;mO`k0A>pgBkzm8rZ&lC>}%v58I0dV zjl40IkmEe+tf;0j#CdaHz$OjJSlUmCAE^4E9FllXr^ahnp~IhjVPLJxhW??d*ZqaA&a7gH4vx_uHtbZ+s))^*R5>~3t%>_pjZr+wX>E^2 z;9t|7ZoWxU`8^k|4;0ihcDu{Pb#|69MLt$~NEKzLnkNG;5l3Lswu)C1o4qj~E{#;k z=*dvLm0IUW?kRCtir6hD*PRyqQQE-_$Fw5c>CxL-S7XPbujHRn5L}XcB_vhqUgkYi zNpHbYaAb^+og1e$yjwI_ymxFi%48{{I*C-WTCn6J`Z?q5ZU{;!?D0W;b#I^xrq}E} zLv3N#-2ySJ>4avQ0_L!x`t{>pvJLym z8Vqq&2cS_ko2Qog53WVHsgqkDnUE+H#EiHQz56m7C=JdhceF0%Uza9#ig`jVxw@Yj WSN#L4~906m?%+7+6p$NvW(&4HN! literal 0 HcmV?d00001 diff --git a/doc/_static/transfo0.png b/doc/_static/transfo0.png new file mode 100644 index 0000000000000000000000000000000000000000..b7a7beb52323d9d090ac8d1b8f439ca092a148f4 GIT binary patch literal 11283 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�Ha9uX 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 literal 0 HcmV?d00001 diff --git a/doc/_static/transfo_scale.png b/doc/_static/transfo_scale.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0182d69c384cb3148e0fae2020801afb3f7da1 GIT binary patch literal 14410 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�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 v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_use_modindex = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, the reST sources are included in the HTML build as _sources/. +#html_copy_source = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'HexaBlockdoc' + + +# Options for LaTeX output +# ------------------------ + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, document class [howto/manual]). +latex_documents = [ + ('index', 'HexaBlock.tex', ur'HexaBlock Documentation', + ur'CS', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_use_modindex = True diff --git a/doc/creategrids.rst b/doc/creategrids.rst new file mode 100644 index 0000000..aac43b0 --- /dev/null +++ b/doc/creategrids.rst @@ -0,0 +1,167 @@ +:tocdepth: 3 + +.. _creategrids: + +============ +Create grids +============ + +To create a **Grid** in the **Main Menu** select **Model -> Make Grid**. + +Three kinds of grid can be created: + +- cartesian grid (see :ref:`guicartgrid`), +- cylindrical grid (see :ref:`guicylgrid`), +- spherical grid (see :ref:`guisphergrid`). + +.. _guicartgrid: + +Cartesian grid +============== + +To create a cartesian grid, select radio button **Cartesian**: + +.. image:: _static/gui_make_cart_grid.png + :align: center + +.. centered:: + Dialogue Box for a Cartesian grid + + +The following data are required: + +- the vertex of the initial hexahedron, +- the vector corresponding to the diametrically opposite vertex to the initial vertex, +- the number of repetition of this hexahedra along the three axes + (n(x), n(y) and n(z)). + + +The result of this action is: + +.. image:: _static/cartgrid3.png + :align: center + +.. centered:: + Result Cartesian Grid + +TUI command: :ref:`tuicartgrid` + + +.. _guicylgrid: + +Cylindrical grid +================ + +To create a cylindrical grid, select radio button **Cylindrical**: + +.. image:: _static/gui_make_cyl_grid.png + :align: center + +.. centered:: + Dialogue Box for a Cylindrical grid (regular size) + + +The following data are required: + +- Cylinder + - center: coordinates of the cylinder base center (select a vertex). + - base: base vector of the cylinder (select a vector). + - height: vertical vector of the cylinder (select a vector). + +- Grid + - radius: size and number of elements from the center. + - angle: size and number of elements around the center. + - height: size and number of elements on height. + - fill: choose this option to fill the central part of the hexhahedra. + + +Elements size of the grid can be irregular (differents sizes). Select the adequate radio button: + +.. image:: _static/gui_make_cyl_grid_irregular.png + :align: center + +.. centered:: + Dialogue Box for a Cylindrical grid (irregular size) + + +The result is an array of hexahedra which are arranged along the +radial axis first, then the angular axis, then according to the layers +and then possibly hexahedra filling the central part. + +The filling of the central part of the cylinder is made​ according to the two following cases: + +.. image:: _static/cyl_grid2.PNG + :align: center + +.. centered:: + Filling of the central part of the cylinder in the case the number of angular elements is odd na = 5. + +.. image:: _static/cyl_grid1.PNG + :align: center + +.. centered:: + Filling of the central part of the cylinder in the case the number of angular elements is even na = 4. + + +The result: + +.. image:: _static/cylgrid1.png + :align: center + +.. image:: _static/cylgrid2.png + :align: center + +.. image:: _static/cylgrid3.png + :align: center + +.. image:: _static/cylgrid4.png + :align: center + +.. image:: _static/cylgrid5.png + :align: center + +.. image:: _static/cylgrid6.png + :align: center + + +.. centered:: + Cylindrical grids with different filling cases + +TUI command: :ref:`tuicylgrid` + +.. _guisphergrid: + +Spherical grid +=============== + +To create a spherical grid, select radio button **Spherical**: + +.. image:: _static/gui_make_spher_grid.png + :align: center + +.. centered:: + Dialogue Box for a Spherical grid + + +The following data are required: + +- the center (vertex) of the central hexahedron, +- the vector corresponding to the diametrically opposite vertex to the initial vertex, +- the number of embedded hexahedra (nb), +- the coefficient of growth (k). + + +The result is an array of hexahedra starting with the central and +other hexahedral are arranged layer by layer from the center. Each +layer contains six hexahedral always in the following order: two along +the X axis, then two for the Y axis and two for the Z axis. + +The result of this action is: + +.. image:: _static/sph_grid.png + :align: center + +.. centered:: + Resulting Spherical grid + +TUI command: :ref:`tuisphergrid` diff --git a/doc/full_example_bridle.rst b/doc/full_example_bridle.rst new file mode 100644 index 0000000..705a3c6 --- /dev/null +++ b/doc/full_example_bridle.rst @@ -0,0 +1,114 @@ +:tocdepth: 4 + +.. _fullexample: + +################################# +Example generated from HexaBlock +################################# + + +.. image:: _static/bride.PNG + :align: center + +.. centered:: + Bridle + + +:: + + + # -*- coding: latin-1 -*- + + import os + import GEOM + import geompy + import smesh + import hexablock + import math + import SALOMEDS + + STEP_PATH = os.path.expandvars("$HEXA_ROOT_DIR/bin/salome/crank.stp") + + + doc = hexablock.addDocument() + OPT_QUAD_IK = 1 + OPT_FIRST = 2 + + # ======================================================== merge_quads + def merge_quads (doc, quart, demi, ni1, nj1, ni2, nj2, option=0): + + prems = option == OPT_QUAD_IK + quad_ik = option == OPT_FIRST + + if quad_ik: + orig = quart.getQuadIK (ni1, nj1, k1) + else: + orig = quart.getQuadJK (ni1, nj1, k1) + + dest = demi .getQuadJK (ni2, nj2, k1) + + v1 = dest.getVertex (quad_ik); + v3 = dest.getVertex (1-quad_ik); + + v2 = orig.getVertex (0); + v4 = orig.getVertex (1); + + doc.mergeQuads (dest, orig, v1, v2, v3, v4) + + #================================================================================= Begin + orig1 = doc.addVertex (0,0,0) + orig2 = doc.addVertex (6,0,0) + + dz = doc.addVector (0,0,1) + dx = doc.addVector (1,0,0) + + dim_z = 5 + drd = 0.5 + drq = 2*drd + dl = 1 + nrq = 8 + nrd = 3 + naq = 4 + nad = 8 + k0 = 0 + k1 = 1 + + quart = doc.makeCylindrical (orig1,dx,dz,drq, 45, dl, nrq, naq, dim_z, True) + for nk in range(dim_z-2): + ## Elagage du quart (de brie) + for nj in range(naq): + ideb = 2 + if nk == dim_z-1: + ideb = 1 + for nj in range(naq): + for ni in range(nrq-ideb): + doc.removeHexa(quart.getHexaIJK(ni+ideb, nj, nk+2)) + + ## La semelle + for nj in range(naq): + for ni in range(nrq-2): + doc.removeHexa(quart.getHexaIJK(ni+2, nj, k0)) + + ## Le demi + demi = doc.makeCylindrical(orig2, dx, dz, drd, 180, dl, nrd, nad, dim_z, True) + + for nk in range(dim_z-2): + for nj in range(nad): + ni0 = max(nrd-nk, 0) + for ni in range(nrd-ni0): + doc.removeHexa(demi.getHexaIJK(ni+ni0, nj, nk+2)) + + jmax = nrq-1 + for nj in range(2): + for ni in range(jmax-3): + doc.removeHexa(quart.getHexaIJK (ni+3, nj, k1)) + + ###merge_quads (doc, quart, demi, 7, 0, nrd, 0, OPT_FIRST); + ###rge_quads (doc, quart, demi, 7, 1, nrd, 1); + + #______________________________________________________________ + + ### mesh = smesh.HexaBlocks(doc) + mesh = hexablock.mesh("bride:hexas", doc) + + diff --git a/doc/general.rst b/doc/general.rst new file mode 100644 index 0000000..6f00cc0 --- /dev/null +++ b/doc/general.rst @@ -0,0 +1,82 @@ +:tocdepth: 3 + +.. _generale: + +######################### +Introduction to HEXABLOCK +######################### + +.. Within the SALOME framework, a CAD module (GEOM) and a meshing + module (SMESH) are developed. This tools enable the construction + of hexahedrical meshes by means of a CAD cutting in blocks (the + method of blocks) topologically equivalent to hexahedra. Once this + cutting performed, the mesh construction is easy, but the method of + blocks can be touchy if the piece to mesh is complex. + +Goals +===== + +The HexaBlock module is designed to help users to build hexahedrical meshes +via the method by blocks. The two fundamental choices are: + +- To execute the method by blocks where the user has to determine the needed blocks. +- To simplify all other tasks to obtain the mesh (in particular by + using directly the geometry to mesh). + +Solution +======== + +Finding a compound of blocks is in charge of users. + +HexaBlock enables to define a mesh with hexahedra in five stages: + +- Load and create a geometry without constraint. +- Search a compound of blocks (mental working). +- Create a model of blocks: + + - Logic realization of this division with operations on blocks. + - Regardless of the geometry to be meshed in terms of shape and placement. + +- Associate this model of blocks to the geometry: + + - Associate all the vertices of the model to the geometry. + - If necessary, associate edges of the model to the geometry. + - If necessary, associate quads of the model to the geometry. + +- Generate the mesh: + + - Create discretization laws. + - Discretize the edges. + - Define mesh groups. + - Setting the mesh generation. + +Two ways of working are possible: + +- *Graphic User Interface* +- *Python Scripting* + + +Presentation of the stages +========================== + +- The construction of the real CAD (see :ref:`cad`). + +- The creation of a model of blocks (see :ref:`blockmethod`). + +- The association of this model of blocks to the geometry (see :ref:`assomodelgeo`). + +- The mesh generation (see :ref:`generatemesh`). + + + +.. toctree:: + :maxdepth: 3 + + cad.rst + block_method.rst + intro_association.rst + intro_groups.rst + intro_mesh.rst + intro_python.rst + annexe.rst + diff --git a/doc/gui.rst b/doc/gui.rst new file mode 100644 index 0000000..427ea3c --- /dev/null +++ b/doc/gui.rst @@ -0,0 +1,7 @@ +:tocdepth: 3 + +.. _gui: + +==== +GUI +==== diff --git a/doc/gui_asso_quad_to_geom.rst b/doc/gui_asso_quad_to_geom.rst new file mode 100644 index 0000000..dab7886 --- /dev/null +++ b/doc/gui_asso_quad_to_geom.rst @@ -0,0 +1,93 @@ +:tocdepth: 3 + +.. _guiassoquadtogeom: + +============================================= +Associate the model of blocks to the geometry +============================================= + +The association of the model of blocks to the geometry proceeds in three steps: + +- associate all vertices, +- associate the needed edges, +- associate the needed quadrangles. + +To facilitate the association of the model to the geometry, a more easy way exists: +the association of lines taken from the model to lines taken from the geometry. + +The interaction for an association of an element of the model of blocks to the geometry +proceeds in three stages: + +- select the model element(s) to associate, +- select the shape(s) of the geometry to associate to, +- make the association, + +.. _guiassovertex: + +Associate to a vertex of the geometry +===================================== + +To associate a vertex of the model of blocks to a vertex of the geometry in +the **Main Menu** select **Model -> Make Vertex association** + +**Arguments:** + +- vertex of the model of blocks, +- vertex of the geometry. + +The dialogue box to associate to a vertex of the geometry is: + +.. image:: _static/gui_ass_vertex.png + :align: center + +.. centered:: + Associate to a Vertex of the Geometry + +.. _guiassoedge: + +Associate to edge or lines of the geometry +========================================== + +To associate edge(s) of the model of blocks to line(s) of the geometry in +the **Main Menu** select **Model -> Make Edge Association** + +**Arguments:** + +- starting vertex (only if "closed line" is selected), +- one or several edges of the model of blocks, +- one or several lines of the geometry, +- choose to associate a closed line or an opened line, +- Start: starting point on the line, +- End: ending point on the line. + +The dialogue box to associate to edges or wires of the geometry is: + +.. image:: _static/gui_ass_edge.png + :align: center + +.. centered:: + Associate to Edges or Wires of the Geometry + +.. _guiassoface: + +Associate to a face of the geometry +=================================== + +To associate a quadrangle of the model of blocks to a face of the geometry in +the **Main Menu** select **Model -> Make Quadrangle association** + +**Arguments:** + +- quadrangle of the model of blocks, +- list of faces of the geometry. + +The dialogue box to associate to a face or a shell of the geometry is: + +.. image:: _static/gui_ass_quad.png + :align: center + +.. centered:: + Associate to a Face or a Shell of the Geometry + + +TUI command: :ref:`tuiassoquadtogeom` diff --git a/doc/gui_blocks_for_cyl_pipe.rst b/doc/gui_blocks_for_cyl_pipe.rst new file mode 100644 index 0000000..0c767c5 --- /dev/null +++ b/doc/gui_blocks_for_cyl_pipe.rst @@ -0,0 +1,124 @@ +:tocdepth: 3 + + +.. _guiblockscylinderpipe: + +===================================== +Make blocks for a cylinder and a pipe +===================================== + +.. _makecylinder: + +Make Cylinder +============= + +To make a **Cylinder** in the **Main Menu** select **Model -> Make Cylinder**. + +To make a cylinder, the following data are required: + +- Cylinder: a cylinder. +- Vector: a vector on the base of the cylinder to start hexahedra. +- nr: the number of blocks on radial. +- na: the number of angular section. +- nl: the number of blocks along the axis of the cylinder. + +The dialogue box to make a cylinder is: + +.. image:: _static/gui_make_cylinder.png + :align: center + +.. centered:: + Make a Cylinder + +The result is an array of hexahedral ranked first by following the +radial direction and the angular direction, then according to the +layers in the cylinder axis. + +The result of this action is: + +.. image:: _static/cylinder.png + :align: center + +.. centered:: + Cylinder + +.. _makecylinders: + +Make Cylinders +============== + +To make **two cylinders in T shape** in the **Main Menu** select **Model -> Make Cylinders** + +You can make **Cylinders** through **Cylinder1** and **Cylinder2**. + +**Arguments:** 2 cylinders. + +The dialogue box to make cylinders is: + +.. image:: _static/gui_make_cylinders.png + :align: center + +.. centered:: + Make Cylinders + +The result is an array of hexahedral. + +.. _makepipe: + +Make Pipe +========= + +To make a **Pipe** in the **Main Menu** select **Model -> Make Pipe**. + +To make a pipe, the following data are required: + +- Pipe: a pipe. +- Vector: a vector on the base of the pipe to start hexahedra. +- nr: the number of blocks on radial. +- na: the number of angular section. +- nl: the number of blocks along the axis of the pipe. + +The dialogue box to make a pipe is: + +.. image:: _static/gui_make_pipe.png + :align: center + +.. centered:: + Make a Pipe + +The result is an array of hexahedral arranged in layers following the +first radial and angular layers, and finally the axial layers. + +The result of this action is: + +.. image:: _static/pipe.png + :align: center + +.. centered:: + Pipe + + +.. _makepipes: + +Make Pipes +========== + +To make **two intersect pipes** in the **Main Menu** select **Model -> Make Pipes**. + +You can make **Pipes** through **Pipe1** and **Pipe2**. + +**Arguments:** 2 pipes. + +The dialogue box to make pipes is: + +.. image:: _static/gui_make_pipes.png + :align: center + +.. centered:: + Make Pipes + +The result is an array of hexahedra where we first find hexahedra of +the first pipe and the second pipe. Each pipe range hexahedra following +first radial layers and angular layers, and finally the axial layers. + +TUI command: :ref:`tuiblockscylinderpipe` diff --git a/doc/gui_component.rst b/doc/gui_component.rst new file mode 100644 index 0000000..8b5d73e --- /dev/null +++ b/doc/gui_component.rst @@ -0,0 +1,39 @@ +:tocdepth: 3 + + +.. _guicomponent: + +========= +Component +========= + +To activate HexaBlock component, in the corresponding area of the screen: + +.. image:: _static/component2.png + :align: center + +Select the HexaBlock component in the list: + +.. image:: _static/component1.png + :align: center + +.. centered:: + Activate HexaBlock Component (first method) + +Or click on the corresponding icon: + +.. image:: _static/component3.png + :align: center + +.. centered:: + Activate HexaBlock Component (second method) + +The result of this action is: + +.. image:: _static/component4.png + :align: center + +.. centered:: + Result of the Activation of HexaBlock Component + +TUI command: :ref:`tuicomponent` diff --git a/doc/gui_cut_hexa.rst b/doc/gui_cut_hexa.rst new file mode 100644 index 0000000..d717ce4 --- /dev/null +++ b/doc/gui_cut_hexa.rst @@ -0,0 +1,41 @@ +:tocdepth: 3 + + +.. _guicuthexa: + +============= +Cut hexahedra +============= + +This method allows to cut in two (or more) a series of hexahedra +using a series of edges propagation. + +To cut an hexahedra in the **Main Menu** select **Model -> Cut Hexahedra**. + +**Arguments:** an edge and the number of cuts (nb). + +The dialogue box for the cut of an hexahedra is: + +.. image:: _static/gui_cut_hexa.png + :align: center + +.. centered:: + Cut Hexahedra + +Example: + +.. image:: _static/no_cut.png + :align: center + +.. centered:: + no cut + + +.. image:: _static/cut.png + :align: center + +.. centered:: + cut + + +TUI command: :ref:`tuicuthexa` diff --git a/doc/gui_cyl.rst b/doc/gui_cyl.rst new file mode 100644 index 0000000..777af35 --- /dev/null +++ b/doc/gui_cyl.rst @@ -0,0 +1,22 @@ +:tocdepth: 3 + + +.. _guicylinder: + +======== +Cylinder +======== + +To create a **Cylinder** in the **Main Menu** select **Model -> Add Cylinder**. + +**Arguments:** a vertex, a vector, a radius and a height. + +The dialogue box for the creation of a cylinder is: + +.. image:: _static/gui_cylinder.png + :align: center + +.. centered:: + Create a Cylinder + +TUI command: :ref:`tuicylinder` diff --git a/doc/gui_disc_elmts.rst b/doc/gui_disc_elmts.rst new file mode 100644 index 0000000..6b01583 --- /dev/null +++ b/doc/gui_disc_elmts.rst @@ -0,0 +1,80 @@ +:tocdepth: 3 + +.. _guidisconnectelements: + +=================== +Disconnect elements +=================== + +To disconnect elements in the **Main Menu** select **Model -> Disconnect**. + +.. _guidiscoquad: + +Disconnect a quadrangle +======================= + +**Arguments:** + +- q: the quadrangle to disconnect. +- from hexa: the hexahedron to disconnect the quadrangle from. + +The dialogue box to disconnect a quadrangle is: + + +.. image:: _static/gui_disco_quad.png + :align: center + +.. centered:: + Disconnect a Quadrangle + +Example: + +.. image:: _static/disco_quad.png + :align: center + +.. centered:: + Disconnect a Quadrangle + + +.. _guidiscoedge: + +Disconnect an edge +================== + +**Arguments:** + +- e: the edge to disconnect. +- from hexa: the hexahedron to disconnect the edge from. + + +The dialogue box to disconnect an edge is: + + +.. image:: _static/gui_disco_edge.png + :align: center + +.. centered:: + Disconnect an Edge + +.. _guidiscovertex: + +Disconnect a vertex +=================== + +**Arguments:** + +- v: the vertex to disconnect. +- from hexa: the hexahedron to disconnect the vertex from. + + +The dialogue box to disconnect a vertex is: + + +.. image:: _static/gui_disco_vertex.png + :align: center + +.. centered:: + Disconnect a Vertex + + +TUI command: :ref:`tuidisconnectelements` diff --git a/doc/gui_discret_law.rst b/doc/gui_discret_law.rst new file mode 100644 index 0000000..a708358 --- /dev/null +++ b/doc/gui_discret_law.rst @@ -0,0 +1,49 @@ +:tocdepth: 3 + +.. _guidiscretelaw: + +========================== +Manage discretization laws +========================== + + +.. _guiaddlaw: + +Add law +======= + +A discretization law is defined by four properties: + +- the name of the law +- the number of nodes for the discretization law +- the coefficient for the arithmetic and geometric law +- the kind of the law: + - uniform (default) + - arithmetic + - geometric + +To define a discretization law in the **Main Menu** select **Mesh -> Add Law**. + +The dialogue box to create a law is: + +.. image:: _static/gui_add_law.png + :align: center + +.. centered:: + Add a Discretization Law + +Remove law +========== + +To remove a discretization law in the **Main Menu** select **Mesh -> Remove Law**. + + +.. image:: _static/gui_remove_law.png + :align: center + +.. centered:: + Remove law + + + +TUI command: :ref:`tuidiscretelaw` diff --git a/doc/gui_document.rst b/doc/gui_document.rst new file mode 100644 index 0000000..e7b5c66 --- /dev/null +++ b/doc/gui_document.rst @@ -0,0 +1,39 @@ +:tocdepth: 3 + +.. _guidocument: + +======== +Document +======== + +To create a new document in the **Main Menu** select **Document -> New Document**. + +To load a document in the **Main Menu** select **Document -> Load Document**. + +To save a document in the **Main Menu** select **Document -> Save Document**. + +A document contains all the information to generate a hexahedral mesh: + +- the model of blocks, +- all associations, +- all groups, +- all laws set on propagations. + +The dialogue box to load a document is: + +.. image:: _static/gui_import_document.png + :align: center + +.. centered:: + Import Document + +The result of this action is: + +.. image:: _static/gui_new_document.png + :align: center + +.. centered:: + New Document + + +TUI command: :ref:`tuidocument` diff --git a/doc/gui_edge.rst b/doc/gui_edge.rst new file mode 100644 index 0000000..fd2d4f8 --- /dev/null +++ b/doc/gui_edge.rst @@ -0,0 +1,40 @@ +:tocdepth: 3 + + +.. _guiedge: + +==== +Edge +==== + +To create an **Edge** in the **Main Menu** select **Model -> Add Edge**. + +There are two algorithms to create an **Edge**. + +Firstly you can define an **Edge** through **Point1** and **Point2**, +which ares the points through which the **Edge** passes. + +**Arguments:** 2 vertices. + +The dialogue box to create an edge from vertices is: + +.. image:: _static/gui_edge_vertices.png + :align: center + +.. centered:: + Add Edge from vertices + +Secondly you can define an **Edge** through **Point** and **Vector**. + +**Arguments:** a vertex and a vector. + +The dialogue box to create an edge from a vertex and a vector is: + +.. image:: _static/gui_edge2.png + :align: center + +.. centered:: + Add Edge from vertices + + +TUI command: :ref:`tuiedge` diff --git a/doc/gui_elements.rst b/doc/gui_elements.rst new file mode 100644 index 0000000..42b63d2 --- /dev/null +++ b/doc/gui_elements.rst @@ -0,0 +1,10 @@ +:tocdepth: 3 + + +.. _guielements: + +======== +Elements +======== + +TUI command: :ref:`tuielements` diff --git a/doc/gui_groups.rst b/doc/gui_groups.rst new file mode 100644 index 0000000..f132723 --- /dev/null +++ b/doc/gui_groups.rst @@ -0,0 +1,48 @@ +:tocdepth: 3 + +.. _guigroups: + +========================== +Manage groups on the model +========================== + +.. _guiaddgroup: + +Add group +========= + +A group is characterized by: + +- its name, +- its type: + - HexaCell (default) + - EdgeCell + - QuadCell + - HexaNode + - QuadNode + - EdgeNode + - VertexNode +- its elements. + +To define groups on the model in the **Main Menu** select **Groups -> Add Group**. + +.. image:: _static/gui_add_group.png + :align: center + +.. centered:: + Add group + +Remove group +============ + +To remove a group from the model in the **Main Menu** select **Groups -> Remove Group**. + + +.. image:: _static/gui_remove_group.png + :align: center + +.. centered:: + Remove group + + +TUI command: :ref:`tuigroups` diff --git a/doc/gui_hemisphere.rst b/doc/gui_hemisphere.rst new file mode 100644 index 0000000..373b994 --- /dev/null +++ b/doc/gui_hemisphere.rst @@ -0,0 +1,148 @@ +:tocdepth: 3 + +.. _guihemisphere: + +========================= +Create HemiSpherical Grid +========================= + + +To create an **HemiSpherical Grid** in the **Main Menu** select **Model -> Make Hemisphere**. + +.. image:: _static/gui_hemispherical.png + :align: center + +.. centered:: + Dialog Box for an hemispherical grid + + +The following data are required: + +- Result Name + - name: name of the grid created (**optional**). + +- Sphere + - center: center coordinates of the sphere (select a vertex). + - external radius: radius size of the sphere. + - internal radius: fill this field to create rind (**optional**). + +- Hole + - axis(z): axes of the hole (select a vector). + Note: This parameter also defines the *vector* parameter on *Cross section* and therefore is automatically filled. + - radius: radius size of the hole. + +- Cross section + - point: coordinates of a point on the surface of the cross section (select a vertex). + - vector: normal vector to the surface of the cross section (select a vector). + Note: This parameter also defines the *axis(z)* parameter on *Hole* and therefore is automatically filled. + +- Radial section + - start : a vector defining the start of the radial section (select a vector). + - angle : fill this field to customize the section (value in degree, **optional**). + +- Grid + - radius: number of hexahedra from the center of the sphere. + - angle: number of hexahedra along the perimeter of the sphere. + - height: number of hexahedra on the height of the sphere. + +From this dialog box, four kinds of grid can be created: + +- hemispherical grid (see :ref:`guihemisphericalgrid`), +- partial hemisphericalgrid (see :ref:`guiparthemisphericalgrid`), +- rind grid (see :ref:`guirindgrid`), +- partial rind grid (see :ref:`guipartrindgrid`). + + + +.. _guihemisphericalgrid: + +HemiSpherical Grid +================== + +This is the default kind of grid when no optional values are filled. + +.. image:: _static/hemisphericalgrid.png + :align: center + +.. centered:: + An hemispherical grid + +TUI command: :ref:`tuihemisphericalgrid` + + +.. _guiparthemisphericalgrid: + +Partial HemiSpherical Grid +========================== +To create a partial hemispherical grid: On *Radial section* check the *partial* check box and fill in the *angle* parameter. + +.. image:: _static/gui_parthemispherical.png + :align: center + +.. centered:: + Make a partial hemispherical grid + + +The result: + +.. image:: _static/parthemisphericalgrid.png + :align: center + +.. centered:: + A partial hemispherical grid + +TUI command: :ref:`tuiparthemisphericalgrid` + + + +.. _guirindgrid: + +Rind Grid +========== +To create a rind grid: On *Sphere* check the *rind* check box and fill in the *internal radius* parameter. + +.. image:: _static/gui_rind.png + :align: center + +.. centered:: + Make a rind grid + + +The result: + +.. image:: _static/rindgrid.png + :align: center + +.. centered:: + A rind grid + +TUI command: :ref:`tuirindgrid` + + + + +.. _guipartrindgrid: + +Partial Rind Grid +================= +To create a partial rind grid: in addition to the *internal radius* parameter +(see :ref:`guirindgrid`), on *Radial section* check the *partial* check box and fill +in the *angle* parameter. + +.. image:: _static/gui_partrind.png + :align: center + +.. centered:: + Make a partial rind grid + + +The result: + +.. image:: _static/partrindgrid.png + :align: center + +.. centered:: + A partial rind grid + +TUI command: :ref:`tuipartrindgrid` + diff --git a/doc/gui_hexahedron.rst b/doc/gui_hexahedron.rst new file mode 100644 index 0000000..381cccf --- /dev/null +++ b/doc/gui_hexahedron.rst @@ -0,0 +1,44 @@ +:tocdepth: 3 + +.. _guihexahedron: + +========== +Hexahedron +========== + +To create an **Hexahedron** in the **Main Menu** select **Model -> Add Hexahedron**. + +There are two methods to create an **Hexahedron**. + +Create from quadrangles +======================= +The **Hexahedron** can be defined its faces (quadrangles). + +**Arguments:** Select from 2 to 6 quadrangles. + +The dialogue box to create an hexahedron from quadrangles is: + +.. image:: _static/gui_hexa_quads.png + :align: center + +.. centered:: + Create an Hexahedron from quadrangles + +Create from vertices +==================== +The **Hexahedron** can also be defined by its vertices **Vertex 1**, +**Vertex 2**, ..., **Vertex 8**. + +**Arguments:** Select 8 vertices. + +The dialogue box to create an hexahedron from vertices is: + +.. image:: _static/gui_hexa_vertices.png + :align: center + +.. centered:: + Create an Hexahedron from vertices + +TUI command: :ref:`tuihexahedron` + +About hexahedron: :ref:`annexe` diff --git a/doc/gui_make_elmts.rst b/doc/gui_make_elmts.rst new file mode 100644 index 0000000..4626559 --- /dev/null +++ b/doc/gui_make_elmts.rst @@ -0,0 +1,107 @@ +:tocdepth: 3 + +.. _guimakeelements: + +====================================== +Make elements by transforming elements +====================================== + +To make elements by transforming elements in the **Main Menu** select +**Model -> Make transformation**. + +.. _guimaketranslation: + +Make elements by translation +============================ + +**Arguments:** + +- elements to translate, +- vector. + + +The dialogue box to make elements by translation is: + +.. image:: _static/gui_make_transfo_translation.png + :align: center + +.. centered:: + Make Elements by Translation + +Example: + +.. image:: _static/transfo0.png + :align: center + +.. centered:: + Before Transforming + + + +.. image:: _static/transfo_translation.png + :align: center + +.. centered:: + Make Translation + + +.. _guimakescaling: + +Make elements by scaling +======================== + +**Arguments:** + +- elements, +- vertex, +- k growing factor. + +The dialogue box to make elements by scaling is: + +.. image:: _static/gui_make_transfo_scale.png + :align: center + +.. centered:: + Make Elements by Scaling + + +Example: + +.. image:: _static/transfo_scale.png + :align: center + +.. centered:: + Make Elements by Scaling + +.. _guimakerotation: + +Make elements by rotation +========================= + +**Arguments:** + +- elements, +- vector direction, +- vertex, +- angle. + + +The dialogue box to make elements by rotation is: + + +.. image:: _static/gui_make_transfo_rotation.png + :align: center + +.. centered:: + Make Elements by Rotation + +Example: + +.. image:: _static/transfo_rotation.png + :align: center + +.. centered:: + Make Rotation + + +TUI command: :ref:`tuimakeelements` diff --git a/doc/gui_make_symmetry.rst b/doc/gui_make_symmetry.rst new file mode 100644 index 0000000..cc36b99 --- /dev/null +++ b/doc/gui_make_symmetry.rst @@ -0,0 +1,69 @@ +:tocdepth: 3 + +.. _guimakesymmetry: + +========================= +Make elements by symmetry +========================= + +To make elements by symmetry elements in the **Main Menu** select +**Model -> Make symmetry**. + +.. _guimakepoint: + +Make elements by point symmetry +=============================== + +**Arguments:** + +- elements, +- vertex. + + +The dialogue box to make elements by point symmetry is: + + +.. image:: _static/gui_make_point_symmetry.png + :align: center + +.. centered:: + Make Elements by point symmetry + +.. _guimakeline: + +Make elements by line symmetry +============================== + +**Arguments:** + +- elements, +- vertex, +- vector. + +The dialogue box to make elements by line symmetry is: + +.. image:: _static/gui_make_line_symmetry.png + :align: center + +.. centered:: + Make Elements by Line Symmetry + +.. _guimakeplan: + +Make elements by plan symmetry +============================== + +**Arguments:** + +- elements, +- vertex, +- vector. + +The dialogue box to make elements by plan symmetry is: + +.. image:: _static/gui_make_plan_symmetry.png + :align: center + +.. centered:: + Make Elements by Plan Symmetry + diff --git a/doc/gui_merge_elmts.rst b/doc/gui_merge_elmts.rst new file mode 100644 index 0000000..b3660cc --- /dev/null +++ b/doc/gui_merge_elmts.rst @@ -0,0 +1,72 @@ +:tocdepth: 3 + +.. _guimergeelements: + +============== +Merge elements +============== + +To merge elements in the **Main Menu** select **Model -> Merge**. + +.. _guimergequads: + +Merge two quadrangles +===================== + +**Arguments:** + +- 2 quadrangles (q1 and q2), +- 4 vertices (v1, v2, v3, v4). + +v1: vertex of the quadrangle *q1* to merge with the vertex *v2* of the quadrangle *q2*. +v3: vertex of the quadrangle *q1* to merge with the vertex *v4* of the quadrangle *q2*. + + +The dialogue box to merge two quadrangles is: + + +.. image:: _static/gui_merge_quads.png + :align: center + +.. centered:: + Merge two Quadrangles + +.. _guimergeedges: + +Merge two edges +=============== + +**Arguments:** + +- 2 edges (e1 and e2), +- 2 vertices (v1 and v2). + +v1: vertex of the edge *e1* to merge with the vertex *v2* of the edge *e2*. + +The dialogue box to merge two edges is: + +.. image:: _static/gui_merge_edges.png + :align: center + +.. centered:: + Merge two Edges + +.. _guimergevertices: + +Merge two vertices +================== + +**Arguments:** 2 vertices (v1 and v2). + + +The dialogue box to merge two vertices is: + + +.. image:: _static/gui_merge_vertices.png + :align: center + +.. centered:: + Merge two Vertices + + +TUI command: :ref:`tuimergeelements` diff --git a/doc/gui_mesh.rst b/doc/gui_mesh.rst new file mode 100644 index 0000000..0a7edbd --- /dev/null +++ b/doc/gui_mesh.rst @@ -0,0 +1,33 @@ +:tocdepth: 3 + +.. _guimesh: + + +================= +Generate the mesh +================= + + +To generate the mesh in the **Main Menu** select **Mesh -> Compute Mesh**. + +**Arguments:** + +- Name +- Dimension: + + - 3: to generate nodes, segments, quadrangles and hexahedral + - 2: to generate nodes, segments and quadrangles + - 1: to generate nodes and segments + - 0: to generate only nodes +- Container + +The dialogue box for generate the mesh is: + +.. image:: _static/gui_mesh.png + :align: center + +.. centered:: + Compute Mesh + + +TUI command: :ref:`tuimesh` diff --git a/doc/gui_modify_elmts.rst b/doc/gui_modify_elmts.rst new file mode 100644 index 0000000..74b645f --- /dev/null +++ b/doc/gui_modify_elmts.rst @@ -0,0 +1,74 @@ +:tocdepth: 3 + +.. _guimodifyelements: + + +======================================== +Modify elements by transforming elements +======================================== + +To modify elements by transforming elements in the **Main Menu** select +**Model -> Perform transformation**. + +.. _guimodifytranslation: + +Modify elements by translation +============================== + +**Arguments:** + +- elements to translate, +- vector. + +The dialogue box to modify elements by translation is: + +.. image:: _static/gui_modify_transfo_translation.png + :align: center + +.. centered:: + Modify Elements by Translation + +.. _guimodifyscaling: + +Modify elements by scaling +========================== + +**Arguments:** + +- elements, +- vertex, +- k growing factor. + + +The dialogue box to modify elements by scaling is: + +.. image:: _static/gui_modify_transfo_scale.png + :align: center + +.. centered:: + Modify Elements by Scaling + +.. _guimodifyrotation: + +Modify elements by rotation +=========================== + +**Arguments:** + +- elements, +- vector direction, +- vertex, +- angle. + + + +The dialogue box to modify elements by rotation is: + +.. image:: _static/gui_modify_transfo_rotation.png + :align: center + +.. centered:: + Modify Elements by Rotation + + +TUI command: :ref:`tuimodifyelements` diff --git a/doc/gui_modify_symmetry.rst b/doc/gui_modify_symmetry.rst new file mode 100644 index 0000000..08eb543 --- /dev/null +++ b/doc/gui_modify_symmetry.rst @@ -0,0 +1,68 @@ +:tocdepth: 3 + +.. _guimodifysymmetry: + + +=========================== +Modify elements by symmetry +=========================== + +To modify elements by symmetry elements in the **Main Menu** select **Model -> Perform Symmetry**. + +.. _guimodifypoint: + +Modify elements by point symmetry +================================= + +**Arguments:** + +- elements, +- vertex. + +The dialogue box to modify elements by point symmetry is: + +.. image:: _static/gui_modify_point_symmetry.png + :align: center + +.. centered:: + Modify Elements by Point Translation + +.. _guimodifyline: + +Modify elements by line symmetry +================================ + +**Arguments:** + +- elements, +- vertex, +- vector. + +The dialogue box to modify elements by line symmetry is: + +.. image:: _static/gui_modify_line_symmetry.png + :align: center + +.. centered:: + Modify Elements by Line Symmetry + +.. _guimodifyplan: + +Modify elements by plan symmetry +================================ + +**Arguments:** + +- elements, +- vertex, +- vector. + +The dialogue box to modify elements by plan symmetry is: + +.. image:: _static/gui_modify_plan_symmetry.png + :align: center + +.. centered:: + Modify Elements by Plan Symmetry + + diff --git a/doc/gui_pipe.rst b/doc/gui_pipe.rst new file mode 100644 index 0000000..117dde0 --- /dev/null +++ b/doc/gui_pipe.rst @@ -0,0 +1,22 @@ +:tocdepth: 3 + + +.. _guipipe: + +==== +Pipe +==== + +To create a **Pipe** in the **Main Menu** select **Model -> Add Pipe**. + +**Arguments:** a vertex (base), a vector (direction), internal and external radius, and a height (h). + +The dialogue box for the creation of a pipe is: + +.. image:: _static/gui_pipe.png + :align: center + +.. centered:: + Create a Pipe + +TUI command: :ref:`tuipipe` diff --git a/doc/gui_prism_join_quad.rst b/doc/gui_prism_join_quad.rst new file mode 100644 index 0000000..cbd8112 --- /dev/null +++ b/doc/gui_prism_join_quad.rst @@ -0,0 +1,73 @@ +:tocdepth: 3 + + +.. _guiprismjoinquad: + + +========================== +Prism and join quadrangles +========================== + +.. _prismquad: + +Prism Quadrangles +================= + +To prism from quadrangles in the **Main Menu** select **Model -> Prism Quadrangles**. + +From a list of quadrangles, a set of hexahedra is created. + +**Arguments:** list of quadrangles, a vector (direction) and the number of layers. + +The dialogue box to prism from quadrangles is: + + +.. image:: _static/gui_prism_quads.png + :align: center + +.. centered:: + Prism From Quadrangles + + + +Example: + +.. image:: _static/prisme_gui.png + :align: center + +.. centered:: + Prism Quads + + + +.. _joinquad: + +Join Quadrangles +================ + +To join quadrangles in the **Main Menu** select **Model -> Join Quadrangles**. + +.. image:: _static/gui_join_quads.png + :align: center + +.. centered:: + Join Quadrangles Dialog Box + + +The following data are required: + +- From + - Quadrangles: the set of quadrangles to be joined and from which hexahedra will be created. + - Point a: a vertex belonging to the set of quadrangles. + - Point b: a vertex belonging to the set of quadrangles. + +- To + - Quadrangle: a quadrangle from the set of targeted quadrangles. + - Point a: the target vertex (in the target quadrangle) for *From.Point a*. + - Point b: the target vertex (in the target quadrangle) for *From.Point b*. + +- Grid + - size: number of layers of hexahedra issued from the operation. + + +TUI command: :ref:`tuiprismjoinquad` diff --git a/doc/gui_propag.rst b/doc/gui_propag.rst new file mode 100644 index 0000000..e09a01f --- /dev/null +++ b/doc/gui_propag.rst @@ -0,0 +1,21 @@ +:tocdepth: 3 + +.. _guipropag: + +=================================== +Discretize on the propagation edges +=================================== + +To define a propagation in the **Main Menu** select **Mesh -> Set Propagation**. + +**Arguments:** a law and a direction. + +The dialogue box for creating a propagation is: + +.. image:: _static/gui_propagation.png + :align: center + +.. centered:: + Propagation + +TUI command: :ref:`tuipropag` diff --git a/doc/gui_quad_revolution.rst b/doc/gui_quad_revolution.rst new file mode 100644 index 0000000..a762107 --- /dev/null +++ b/doc/gui_quad_revolution.rst @@ -0,0 +1,51 @@ +:tocdepth: 3 + +.. _guiquadrevolution: + +=============== +Quad revolution +=============== + + +To make a **Quad revolution** in the **Main Menu** select **Model -> Quad Revolution**. + +.. image:: _static/gui_quadrevolution.png + :align: center + +.. centered:: + Dialog Box to make a quadrangle revolution + + + +The following data are required: + +- Result Name + - name: name of the elements created (**optional**). + +- Arguments + - Quads: a set of quadrangles from which hexahedrons will be created (select quads). + - Center: center of rotation (select a vertex). + - Axis: axis of rotation (select a vector). + - Angles: a set of angle (in degrees). Specify the rotation's angle at each step of it. + + +Here is an example where the selected quadrangles are highlighted: + +.. image:: _static/before_quadrevolution.png + :align: center + +.. centered:: + Quad selection + + +The result: + +.. image:: _static/quadrevolution.png + :align: center + +.. centered:: + Quadrangle revolution + +TUI command: :ref:`tuiquadrevolution` + + diff --git a/doc/gui_quadrangle.rst b/doc/gui_quadrangle.rst new file mode 100644 index 0000000..db2c6b7 --- /dev/null +++ b/doc/gui_quadrangle.rst @@ -0,0 +1,46 @@ +:tocdepth: 3 + + +.. _guiquadrangles: + +========== +Quadrangle +========== + +To create a **Quadrangle** in the **Main Menu** select **Model -> Add Quadrangle**. + +There are two algorithms to create a **Quadrangle**. + +Create from vertices +==================== +The **Quadrangle** can be defined by its vertices **Vertex 1**, **Vertex 2**, +**Vertex 3** and **Vertex 4**. + +**Arguments:** 4 vertices. + +The dialogue box for to create a quadrangle from vertices is: + +.. image:: _static/gui_quad_vertices.png + :align: center + +.. centered:: + Add Quadrangle from vertices + +Create from edges +================= +The **Quadrangle** can also be defined by its edges **Edge 1**, +**Edge 2**, **Edge 3** and **Edge 4**. + +**Arguments:** 4 edges. + +The dialogue box to create a quadrangle from edges is: + +.. image:: _static/gui_quad_edges.png + :align: center + +.. centered:: + Add Quadrangle from edges + + + +TUI command: :ref:`tuiquadrangles` diff --git a/doc/gui_remove.rst b/doc/gui_remove.rst new file mode 100644 index 0000000..07ad5a7 --- /dev/null +++ b/doc/gui_remove.rst @@ -0,0 +1,31 @@ +:tocdepth: 3 + +.. _guiremove: + +================ +Remove hexahedra +================ + + +To remove an **Hexahedron** in the **Main Menu** select **Model -> Remove hexahedra**. + +**Arguments:** 1 hexahedron and a flag to indicate if connected hexahedra should be removed or not. + + +The dialogue box for removing hexahedra: + + +.. image:: _static/dialogbox_remove.png + :align: center + +.. centered:: + Remove hexahedra + +The selection can be made either in the list of hexahedra or in the graphic zone. + +The result of this action is: + +.. image:: _static/remove3.png + :align: center + +TUI command: :ref:`tuiremove` diff --git a/doc/gui_replace_hexa.rst b/doc/gui_replace_hexa.rst new file mode 100644 index 0000000..b5e1c7f --- /dev/null +++ b/doc/gui_replace_hexa.rst @@ -0,0 +1,50 @@ +:tocdepth: 3 + +.. _guireplacehexa: + +================== +Replace hexahedron +================== + +To **Replace an hexahedron** in the **Main Menu** select **Model -> Replace Hexahedron**. + +.. image:: _static/gui_replacehexa.png + :align: center + +.. centered:: + Replace Hexahedron Dialog Box + + +The following data are required: + +- Result Name + - name : name of the elements created (**optional**). + +- Quad(s) source + - Quad's source: the set of quads to be extruded (select quads). + - s1, s2, s3: vertices from the set of quads. (select vertices). + +- Quad destination + - d1, d2, d3: vertices which define the target quad. + As a result of the operation, each one are replaced: s1->d1, s2->d2, s3->d3 (select vertices). + + +Here is an example where the source quadrangles and vertices are highlighted: + +.. image:: _static/before_replacehexa.png + :align: center + +.. centered:: + Source selection + +The result is: + +.. image:: _static/replacehexa.png + :align: center + +.. centered:: + Hexa replaced + +TUI command: :ref:`tuireplacehexa` + + diff --git a/doc/gui_vector.rst b/doc/gui_vector.rst new file mode 100644 index 0000000..d965362 --- /dev/null +++ b/doc/gui_vector.rst @@ -0,0 +1,42 @@ +:tocdepth: 3 + +.. _guivector: + +====== +Vector +====== + +To create a **Vector** in the **Main Menu** select **Model -> Add vector**. + +There are two methods to create a **Vector**. + +Create with dx, dy, dz +====================== +The **Vector** can be defined by **dx**, **dy** and **dz**. + +**Arguments:** 3 reals. + +The dialogue box to create a vector with dx, dy, dz is: + +.. image:: _static/gui_vector1.png + :align: center + +.. centered:: + Add Vector + +Create with two vertices +======================== +The **Vector** can also be defined by two vertices **Point1** and **Point2**. + +**Arguments:** 2 vertices. + +The dialogue box to create a vector from two vertices is: + +.. image:: _static/gui_vector2.png + :align: center + +.. centered:: + Add Vector from 2 Vertices + + +TUI command: :ref:`tuivector` diff --git a/doc/gui_vertex.rst b/doc/gui_vertex.rst new file mode 100644 index 0000000..2f66ec4 --- /dev/null +++ b/doc/gui_vertex.rst @@ -0,0 +1,25 @@ +:tocdepth: 3 + +.. _guivertex: + +======== +Vertex +======== + +To create a **Vertex** in the **Main Menu** select **Model -> Add vertex**. + +The vertex is defined by settings its x, y and z **Coordinates**. + +**Arguments:** x, y and z coordinates of the vertex. + +The dialogue box for the creation of a vertex is: + +.. image:: _static/gui_vertex.png + :align: center + +.. centered:: + Add Vertex + + + +TUI command: :ref:`tuivertex` diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..d0eb780 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,19 @@ +%%%%%%%%%%%%%%%%%%%%%%%%% +HEXABLOCK's documentation +%%%%%%%%%%%%%%%%%%%%%%%%% + +Contents: + +.. toctree:: + :maxdepth: 2 + + general.rst + interactive.rst + python.rst + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/doc/interactive.rst b/doc/interactive.rst new file mode 100644 index 0000000..a0fc1fa --- /dev/null +++ b/doc/interactive.rst @@ -0,0 +1,73 @@ +:tocdepth: 3 + +.. _interactive: + +####################################################### +Using HexaBlock with the Graphical User Interface (GUI) +####################################################### + + +HexaBlock is a component of SALOME with an interactive part and has: + +- its own menus and toolboxes, +- its document zone to represent all kind of objects (vertices, hexahedral, etc.), +- its graphic zone to visualize the model and the mesh. + +.. image:: _static/interactive.png + :align: center + + +It provides the toolset allowing to: + +- Build a model of block: + - create basic geometrical objects: point, edge, quadrangle, hexahedra, + - create grid: cartesian, cylindrical, spherical, + - create a cylinder, a pipe, two intersected cylinders, two intersected pipes, an hemisphere, a rind, + - remove an hexahedron, + - replace hexahedrons, + - disconnect by a point, an edge, a quadrangle, + - join quadrangles by hexahedra, merge quadrangles, + - transform or modify by translation, rotation and other symmetries, + - make quad revolution. +- Associate a model of block to a geometry: + - associate vertices of the model of blocks to vertices of a geometry, + - associate edges of the model of blocks to edges of a geometry, + - associate quadrangles of the model of blocks to faces of a geometry, + - associate lines. +- Generate a mesh: + - define groups, + - define laws on propagations, + - generate an hexahedral mesh. + + +.. toctree:: + :maxdepth: 2 + + gui_component.rst + gui_document.rst + gui_vertex.rst + gui_edge.rst + gui_quadrangle.rst + gui_hexahedron.rst + gui_vector.rst + gui_cyl.rst + gui_pipe.rst + gui_blocks_for_cyl_pipe.rst + creategrids.rst + gui_hemisphere.rst + gui_remove.rst + gui_cut_hexa.rst + gui_prism_join_quad.rst + gui_quad_revolution.rst + gui_replace_hexa.rst + gui_merge_elmts.rst + gui_disc_elmts.rst + gui_make_elmts.rst + gui_make_symmetry.rst + gui_modify_elmts.rst + gui_modify_symmetry.rst + gui_asso_quad_to_geom.rst + gui_groups.rst + gui_discret_law.rst + gui_propag.rst + gui_mesh.rst diff --git a/doc/intro_association.rst b/doc/intro_association.rst new file mode 100644 index 0000000..f37aecf --- /dev/null +++ b/doc/intro_association.rst @@ -0,0 +1,150 @@ +:tocdepth: 3 + +.. _assomodelgeo: + +========================================== +Associate a model of blocks to a geometry +========================================== + +Associate the model to the geometry means that the geometry to mesh is +"raw" for this application. In other words, there will be no +modification of this geometry end no rebuild of a complete new +geometry. However it is possible to complete this geometry by adding +new pieces if necessary without any topological operation to link +these pieces to the initial geometry. Generally, the geometry to mesh +is defined as a set of faces, if these faces are not given under solid +form but form logically this solid, it is sufficient for this +application. + +To associate the model to the geometry, three successive steps are to be followed: + +1. Mandatory: associate **all the vertices** of the model to the geometry +2. If necessary: associate **the needed edges** of the model to the geometry +3. If necessary: associate **the needed faces** of the model to the geometry + +The HexaBlock application enables to follow these three steps +independently (see :ref:`assoelemts`). To facilitate the association +of the model to the geometry, an alternative way exists: the first two +steps above can be replaced by a new stage called association by lines +(see :ref:`assolines`). + +.. image:: _static/association2.PNG + :align: center + +.. centered:: + Rod connecting + +.. _assoelemts: + +Elements association +==================== + +Associate the vertices +---------------------- + +This step is essential, all the vertices of the model must be associated to the geometry. + +There are 4 ways for this association: + +- associate one vertex "v" of the model to a "vertex" of the shape "s" + of the geometry. + +- associate one vertex "v" of the model to a point of curvilinear + abscissa "p" of the "edge" included in the shape "s" of the + geometry. + +- associate one vertex "v" of the model to a point of coordinates + "u,v" of the "face" included in the shape "s" of the geometry. + +- associate one vertex "v" of the model to a any point. + + +It is possible to examine the association (vertex of the association +model, x-y-z-coordinates of the point of the association geometry). + +For each vertex, the association is made in three steps: + +- Choose a vertex of the model to associate. +- Choose the way of associating among the 4 possibilities described above. +- Specify the point on the geometry, the process depends on the + previous choice: + - case of an existing vertex: selection and highlight on the + vertices of the geometry solely + - case of a point taken on an edge of the geometry: selection + and highlight of the edges and of a point on the edge in the + process of being selected. + - case of a point taken on an face of the geometry: selection + and highlight of the faces and of a point on the face in the + process of being selected. + - case of a new point: ask the coordinates and visualize this + new point. + +.. _assoedges: + +Associate the edges +------------------- + +This step is optional. An association of every edge is determined +automatically before generating the mesh. This automatic process +applies four different algorithms in the following order: + +- the first algorithm determines a wire between the two vertices by + taking the shortest way. +- if that wire does not exist, then another wire is build in the + following manner: + - compute the normals to the two vertices, + - compute the mean normal of the two previous normals, + - build the plan passing through the two vertices and this + mean normal, + - the sought-after wire is the intersection of the geometry + with the plan, +- if the intersection with this plan fails, then another wire + "iso-type" is determined between the two vertices and going along + the faces of the geometry linking these two vertices, +- if this wire still does not exist, then the vertices are linked by a + line segment. + +If one of the automatic choices is not appropriate, then the +association of the edge of the model to the geometry has to be defined +explicitly. + + +Associate the quadrangles +------------------------- + +This step is optional. The model quadrangles association is +automatic. The three cases are processed: + +- all the geometric faces exist then the nodes are computed on these + faces, +- the faces do exist but some pieces are missing because of the new + edges or vertices, in that case two strategies are deployed: + - automatic construction of the missing faces from the contour lines, + - or association of new faces build in the geometry, +- there are no associated faces to the quadrangle of the model: + - only the automatic mesh is used, + - if this automatic mesh does not work, then it is possible to + associate to the model quadrangle a geometric face build in + GEOM by the user. + +If one of the automatic choices is not appropriate, then the +association of the quadrangle of the model to the geometry has to be +defined explicitly. + +.. _assolines: + +Association by lines +==================== + +The description of this step is: + +- At the end of this new stage, it is necessary that all points of the + model blocks are associated with the vertices of the geometry, +- The process is to associate the lines of the model of blocks to + vertices and edges of geometry until all points of the model of blocks + are associated, +- When all points of the model of blocks are associated, it is still + possible to complete with step 2 above (see :ref:`assoedges`) to + finish the association of needed edges. + +See TUI scripts and GUI part. diff --git a/doc/intro_groups.rst b/doc/intro_groups.rst new file mode 100644 index 0000000..f523f2f --- /dev/null +++ b/doc/intro_groups.rst @@ -0,0 +1,24 @@ +:tocdepth: 3 + +.. _intro_groups: + +==================================== +Define groups on the model of blocks +==================================== + +A group is characterized by the three following components: + +- its type +- its name +- its elements + +The six following classes define all the kind of group: + +- group3d for groups of hexahedra, +- group2d for groups of facets, +- group1d for groups of segments, +- group0dVertices for groups of nodes on the edges, +- group0dFaces for groups of of nodes on the faces, +- group0dBlocks for groups of nodes in the blocks, + +See TUI scripts and GUI part. diff --git a/doc/intro_mesh.rst b/doc/intro_mesh.rst new file mode 100644 index 0000000..5c84a8b --- /dev/null +++ b/doc/intro_mesh.rst @@ -0,0 +1,158 @@ +:tocdepth: 3 + +.. _mesh: + +====================== +Meshing with Hexahedra +====================== + +The main stages to mesh with HexaBlock are: + +- Define all discretization laws, a law is characterized by: + + - A number of nodes + - A distribution (uniform, arithmetic, etc.) + +- Apply a law on a set of edges + + - This set of edges has the propagation property + - This set is defined directly on the model of blocks + +- Define all groups directly on the model of blocks: + + - Groups of nodes + - Groups of segments, of quadrangles, of hexahedra + +- Parametrization of the mesh generation + + +Define a law of discretization +============================== + +A discretization law is defined by four properties: + +- the name of the law +- the number of nodes for the discretization law +- the kind of the law + - uniform + - arithmetic + - geometric +- the coefficient for the arithmetic and geometric law. + +Set the propagation laws +======================== + +From the model, an edges partition is determined, each part +characterizes a propagation set. To each propagation is associated a +discretization law and an application way to this law. By default, the +law "Default" is applied on every propagation. It is possible to use +the same law for different propagations. + + +.. _generatemesh: + +Generate the mesh +================= + +Once the model and its association to the geometry created, the +hexahedral mesh can be generated by mentioning: + +- the discretization of the edges thanks to discretization laws +- the potential groups + +To discretize, the application proceeds in three steps: + +- the application computes a partition of the model edges, where each sub-set of edges corresponds to the edges related to the propagation, + +- the user defines the needed discretization laws, a law is characterized by: + + * the name of this law, + * the number of nodes to compute + * a distribution (uniform, arithmetic, etc.) + +- the user (working on the model) apply a discretization law on each sub-set of propagation edges + +The groups are defined on the model of blocks and the main types of groups are: + +- groups of hexahedra +- groups of quadrangles +- groups of edges +- groups of nodes + +.. image:: _static/EX2.PNG + :align: center + +.. centered:: + Example of propagation-linked edges sub-set + + +Mesh Algorithm +=============== + +Node generation process follows four steps: + +1. generate all the nodes corresponding to the vertices of the model +2. generate all the nodes corresponding to the edges of the model +3. generate all the nodes corresponding to the faces of the model +4. generate all the nodes corresponding to the blocks of the model + +The nodes generated by the meshing of the edges are determined by the +discretization law associate to this edge. The coordinates of these +nodes are computed on the geometric edges series associate to this +edge. To do so/ a curvilinear abscissa is calculated and based on +total length of the 1D geometry associate. The geometric modeler (GEOM +of SALOME or CasCade) enables to compute this length. + +The nodes that are generated by meshing of faces are computed in two stages: +1. meshing by linear approximation +2. refining by projection on the geometry if this geometry exists. + +The meshing by linear approximation performs the three following calculations: + +- computation of node coordinates according to the *i* direction taking into account the discretization law on the *j* direction +- computation of node coordinates according to the *j* direction taking into account the discretization law on the *i* direction +- the node coordinates are the coordinates of the midpoint of the segment that is formed from the two previous points +- if there is a projection step, then the normal at this node is computed + +The computation of the normal at a node (i,j) is performed thanks to the neighbor nodes: + +- computation of the plan passing through this node and orthogonal to the straight line connecting the nodes (i-1,j) and (i,j+1) +- computation of the plan passing through this node and orthogonal to the straight line connecting the nodes (i-1,j) and (i,j+1) +- the normal passing through the intersection of the two previous plans + +If the node belongs to a border, the node itself is taken to build the +line determining the plan which is perpendicular to it. + +If there is a geometric face (or a list of faces) associate to one +face of the model, then an additional projection step (taking into +account the normal to the node of the previous step) is computed in +order to obtain a node on the geometric face. The coordinates of this +node are computed using the intersection of the normal with this face +(or this list of faces). + +The nodes generated by the meshing of blocks are determined by the +algorithm << i, j, k >> included in the SMESH module of SALOME. + +Examples +======== + +Linear approximation of the discretization of faces +''''''''''''''''''''''''''''''''''''''''''''''''''''' + +.. image:: _static/meshing1.PNG + :align: center + + +Geometric face and meshing by approximation +'''''''''''''''''''''''''''''''''''''''''''' + +.. image:: _static/meshing2.PNG + :align: center + + +Geometric face and meshing by approximation and projection +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +.. image:: _static/meshing3.PNG + :align: center + diff --git a/doc/intro_python.rst b/doc/intro_python.rst new file mode 100644 index 0000000..259d73d --- /dev/null +++ b/doc/intro_python.rst @@ -0,0 +1,390 @@ +:tocdepth: 3 + +.. _intropython: + +=========================================== +Example: Python script for a connecting rod +=========================================== + +.. image:: _static/cad_bielle.PNG + :align: center + +.. centered:: + Connecting rod + +.. _menu: + +Steps +===== + - :ref:`modelcreation` + - :ref:`recover` + - :ref:`assoc` + - :ref:`groupdef` + - :ref:`lawdisc` + - :ref:`meshgener` + +.. _modelcreation: + +Model creation +============== + +:: + + import os + import geompy + import hexablock + import math + + STEP_PATH = os.path.expandvars("$HEXABLOCK_ROOT_DIR/bin/salome/crank.stp") + + #============================= + # CREATION DOCUMENT + #============================= + + doc = hexablock.addDocument() + + #============================= + # MODEL CREATION + #============================= + + # For the connecting rod, two cylindrical grids have to be build and + # the quadrangles have to be prismed between these wo grids + + #============================= + # PARAMETRES + #============================= + + R = 0.095168291790720005 + + r_pte = R + r_pte_t = R/2.0 + + xpetit = 0.0 + xgrand = 1.35739 + 0.1595 + longueur = (xgrand - xpetit)/2.0 + hauteur = 0.019999999553*2 + + dr_pte = R + da_pte = 360 + dl_pte = hauteur + + nr_pte = 1 + na_pte = 6 + nl_pte = 1 + + #============================= + # Vectors Creation + #============================= + + dx = doc.addVector(longueur, 0, 0) + dy = doc.addVector(0, longueur, 0) + dz = doc.addVector(0, 0, longueur) + + #================================================= + # Creation of cylindrical grid centers + #================================================= + + c_pte = doc.addVertex(xpetit, 0, 0) + c_grd = doc.addVertex(2*longueur, 0, 0) + dx_prime = doc.addVectorVertices(c_pte, c_grd) + + #================================================= + # small cylindrical grid creation + #================================================= + + grille_cyl_pte = doc.makeCylindrical(c_pte, dx, dz, dr_pte, da_pte, dl_pte, nr_pte, na_pte, nl_pte, False) + + #================================= + # Small cylindrical grid creation + #================================= + + grille_cyl_grd = doc.makeTranslation(grille_cyl_pte, dx_prime) + + #================================== + # Joining the two cylindrical grids + #================================== + + mod_x1 = grille_cyl_pte.getVertexIJK(1, 0, 1) + mod_x2 = grille_cyl_pte.getVertexIJK(1, 1, 0) + mod_x3 = grille_cyl_pte.getVertexIJK(1, 5, 0) + mod_x4 = grille_cyl_pte.getVertexIJK(1, 0, 0) + quad_11 = doc.findQuad(mod_x1, mod_x2) + quad_12 = doc.findQuad(mod_x1, mod_x3) + + mod_y1 = grille_cyl_grd.getVertexIJK(1, 3, 1) + mod_y2 = grille_cyl_grd.getVertexIJK(1, 2, 0) + mod_y3 = grille_cyl_grd.getVertexIJK(1, 4, 0) + mod_y4 = grille_cyl_grd.getVertexIJK(1, 3, 0) + + quad_21 = doc.findQuad(mod_y1, mod_y2) + quad_22 = doc.findQuad(mod_y1, mod_y3) + + model_biell_fin = doc.joinQuads([quad_11, quad_12], quad_21, mod_x1, mod_y1, mod_x4, mod_y4, 1) + + +Go back to :ref:`menu` + +.. _recover: + +Recovering edges and faces before the association +================================================= + +:: + + bielle_geom = geompy.ImportFile(STEP_PATH, "STEP") + doc.setShape(bielle_geom) + geompy.addToStudy(bielle_geom, "bielle_geom") + all_edges_bielle = geompy.SubShapeAllSorted(bielle_geom, geompy.ShapeType["EDGE"]) + + + + # dictionnaire des edges de la géométrie : + # key = nom, value = indice dans all_edges_bielle + dic_edge_names = {"edge_ray_pte_b": 0, "edge_ray_pte_h": 1, + "edge_trou_pte_b": 2, "edge_trou_pte_h" :3, + "edge_arr_pte_g_b": 7, "edge_arr_pte_g_h": 8, + "edge_arr_pte_d_b": 9, "edge_arr_pte_d_h": 10, + "edge_arr_grd_g_b": 19, "edge_arr_grd_g_h": 20, + "edge_arr_grd_d_b": 21, "edge_arr_grd_d_h": 22, + "edge_trou_grd_b": 25, "edge_trou_grd_h": 26, + "edge_ray_grd_b": 27, "edge_ray_grd_h": 28, + "edge_long_g_b": 13, "edge_long_g_h": 14, + "edge_long_d_b": 15, "edge_long_d_h": 16 + } + + + all_faces_bielle = geompy.SubShapeAllSorted(bielle_geom, geompy.ShapeType["FACE"]) + # dictionnaire des faces de la geometrie : + # key = nom, value = indice dans all_faces_bielle + dic_face_names = {"face_ray_pte": 0, "face_trou_pte": 1, "face_pte_g": 2, + "face_pte_d": 3, "face_long_g": 4, "face_long_d": 5, + "face_bas": 6, "face_haut": 7, "face_grd_g": 8, + "face_grd_d": 9, "face_trou_grd": 10, + "face_ray_grd": 11 + } + + + + +Go back to :ref:`menu` + +.. _assoc: + +Association of the model to the geometry +======================================== + +:: + + dico_haut_bas = {"h": 1, "b": 0} + + # 1. lignes internes (trou) haut/bas du petit cylindre + # ==================================================== + for z in dico_haut_bas.iteritems(): + + mod_line = [grille_cyl_pte.getEdgeJ(0, j, z[1]) for j in range(5)] + mod_start = grille_cyl_pte.getEdgeJ(0, 5, z[1]) + mod_first = mod_start.getVertex(1) + + # geometrie : 1 seule ligne + edge_hole_in = all_edges_bielle[dic_edge_names["edge_trou_pte_"+z[0]]] + geo_start = edge_hole_in + par_start = 0.0 + geo_line = [] + + # association : + ier = doc.associateClosedLine(mod_first, mod_start, mod_line, + geo_start, par_start, geo_line) + + + # 2. lignes internes (trou) haut/bas du grand cylindre + # ===================================================== + for z in dico_haut_bas.iteritems(): + + mod_start = grille_cyl_grd.getEdgeJ(0, 5, z[1]) + mod_first = mod_start.getVertex(1) + mod_line = [grille_cyl_grd.getEdgeJ(0, j, z[1]) for j in range (5)] + + # geometrie : 1 seule ligne + edge_hole_in = all_edges_bielle[dic_edge_names["edge_trou_grd_"+z[0]]] + geo_start = edge_hole_in + par_start = 0.0 + geo_line = [] + + # association : + ier = doc.associateClosedLine(mod_first, mod_start, mod_line, + geo_start, par_start, geo_line) + + + # 3. lignes externes haut/bas du petit cylindre + # ============================================= + for z in dico_haut_bas.iteritems(): + + # modele de blocs : + mod_start = grille_cyl_pte.getEdgeJ(1, 1, z[1]) + # table des edges : + mod_line = [grille_cyl_pte.getEdgeJ(1, j, z[1]) for j in [2, 3, 4]] + + # geometrie : + # les edges de la geometrie correspondant sont, dans l'ordre (par + # exemple pour le haut) : + # edge_arr_pte_d_h, edge_ray_pte_h, edge_arr_pte_g_h + geo_start = all_edges_bielle[dic_edge_names["edge_arr_pte_d_"+z[0]]] + + geo_line = [] + geo_line.append(all_edges_bielle[dic_edge_names["edge_ray_pte_"+z[0]]]) + geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_pte_g_"+z[0]]]) + + # association : + # la première est la dernière ligne sont orientées "dans le + # mauvais sens" => on fournit cette info : + par_start = 0.0 + par_end = 1.0 + ier = doc.associateOpenedLine(mod_start, mod_line, + geo_start, par_start, geo_line, par_end) + + + ## # 4. lignes externes haut/bas du grand cylindre + ## # ============================================= + for z in dico_haut_bas.iteritems(): + + # modele de blocs : + mod_start = grille_cyl_grd.getEdgeJ(1, 4, z[1]) + # table des edges : + mod_line = [grille_cyl_grd.getEdgeJ(1, j, z[1]) for j in [5, 0, 1]] + + # geometrie : + # les edges de la geometrie correspondant sont, dans l'ordre (par + # exemple pour le haut) : + # edge_arr_grd_g_h, edge_ray_grd_h, edge_arr_grd_d_h + geo_start = all_edges_bielle[dic_edge_names["edge_arr_grd_g_"+z[0]]] + + geo_line = [] + geo_line.append(all_edges_bielle[dic_edge_names["edge_ray_grd_"+z[0]]]) + geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_grd_d_"+z[0]]]) + + # association : + # la première est la dernière ligne sont orientées "dans le + # mauvais sens" => on fournit cette info : + par_start = 0.0 + par_end = 1.0 + ier = doc.associateOpenedLine(mod_start, mod_line, + geo_start, par_start, geo_line, par_end) + + # 6. association des 4 points restants (x1, x4, y1, y4) : + # ======================================================= + + # NB: + # h = top (haut) + # b = bottom (bas) + # g = big (grand) + # p = small (petit) + # t = hole (trou) + + face_haut = all_faces_bielle[dic_face_names["face_haut"]] + + edge_haut_droite = geompy.GetEdgesByLength(face_haut, 0.136, 0.137) + edge_haut_gauche = geompy.GetEdgesByLength(face_haut, 0.131, 0.132) + + # 1. grand cylindre : + y_h_g = geompy.MakeVertexOnSurface(face_haut, 1, 0.5) + u_h_g = geompy.MakeVertexOnCurve(edge_haut_droite, 1) + w_h_g = geompy.MakeVertexOnCurve(edge_haut_gauche, 0) + edge_v_grd = geompy.MakeLineTwoPnt(u_h_g, w_h_g) + + geo_y1 = geompy.MakeVertexOnCurve(edge_v_grd, 0.5) + geo_y4 = geompy.MakeVertexWithRef(geo_y1, 0.0, 0.0, -hauteur) + + # vertex cote grande grille cylindrique : + mod_y1.setAssociation(geo_y1) + mod_y4.setAssociation(geo_y4) + + # 2. petit cylindre : + # REM : le modele grand cylindre a ete cree par translation / au petit + # cylindre. + v_h_p = geompy.MakeVertexOnSurface(face_haut, 0, 0.5) + x_h_p = geompy.MakeVertexOnCurve(edge_haut_droite, 0) + z_h_p = geompy.MakeVertexOnCurve(edge_haut_gauche, 1) + edge_v_pte = geompy.MakeLineTwoPnt(x_h_p, z_h_p) + + geo_x1 = geompy.MakeVertexOnCurve(edge_v_pte, 0.5) + geo_x4 = geompy.MakeVertexWithRef(geo_x1, 0.0, 0.0, -hauteur) + + # vertex cote petite grille cylindrique : + mod_x1.setAssociation(geo_x1) + mod_x4.setAssociation(geo_x4) + + # 7. association des faces : + quad1 = grille_cyl_pte.getQuadJK(1, 1, 0) + quad1.addAssociation(all_faces_bielle[dic_face_names["face_pte_d"]]) + quad2 = grille_cyl_pte.getQuadJK(1, 4, 0) + quad2.addAssociation(all_faces_bielle[dic_face_names["face_pte_g"]]) + quad3 = grille_cyl_grd.getQuadJK(1, 1, 0) + quad3.addAssociation(all_faces_bielle[dic_face_names["face_grd_d"]]) + quad4 = grille_cyl_grd.getQuadJK(1, 4, 0) + quad4.addAssociation(all_faces_bielle[dic_face_names["face_grd_g"]]) + + +Go back to :ref:`menu` + +.. _groupdef: + +Definition of elements groups for the mesh +========================================== + +:: + + # We define 3 groups + + # groupe d edges (arretes) + edge_grp = doc.addEdgeGroup("Edge_grp") + for i in range(doc.countEdge()): + edge_grp.addElement(doc.getEdge(i)) + + # groupe de quads (faces) + quad_grp = doc.addQuadGroup("Quad_grp") + for i in range(doc.countQuad()): + quad_grp.addElement(doc.getQuad(i)) + + # groupe d hexas (solids) + hexa_grp = doc.addHexaGroup("Hexa_grp") + for i in range(doc.countHexa()): + hexa_grp.addElement(doc.getHexa(i)) + + # groupe de noeuds de vertex pour tout le modele + vertex_nod_grp = doc.addVertexNodeGroup("Vertex_Nod_Grp") + for i in range(doc.countVertex()): + vertex_nod_grp.addElement(doc.getVertex(i)) + +Go back to :ref:`menu` + +.. _lawdisc: + +Definition of a law discretization +================================== + +:: + + law = doc.addLaw("Uniform", 4) + + for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) # apply discretization law on the model and generate the mesh + +Go back to :ref:`menu` + + +.. _meshgener: + +Mesh generation +=============== + +:: + + print " --- HEXAHEDRICAL MESH --- " + mesh_hexas = hexablock.mesh("Bielle:hexas", doc) + + print "Number of hexahedra:", mesh_hexas.NbHexas() + print "Number of quadrangles:", mesh_hexas.NbQuadrangles() + print "Number of segments:", mesh_hexas.NbEdges() + print "Number of nodes:", mesh_hexas.NbNodes() + diff --git a/doc/mesh.rst b/doc/mesh.rst new file mode 100644 index 0000000..d6e18bf --- /dev/null +++ b/doc/mesh.rst @@ -0,0 +1,136 @@ +:tocdepth: 3 + +.. _mesh: + +====================== +Meshing with Hexahedra +====================== + +The main stages to mesh with HexaBlock are: + +- Define all discretization laws, a law is characterized by: + + - A number of nodes + - A distribution (uniform, arithmetic, etc.) + +- Apply a law on a set of edges + + - This set of edges has the propagation property + - This set is defined directly on the model of blocks + +- Define all groups directly on the model of blocks: + + - Groups of nodes + - Groups of segments, of quadrangles, of hexahedra + +- Parametrization of the mesh generation + +Generate the mesh +================= +Once the model and its association to the geometry created, the hexahedral mesh can be generated by mentioning: + +- the discretization of the edges thanks to discretization laws +- the potential groups + +To discretize, the application proceeds in three steps: + +- the application computes a partition of the model edges, where each sub-set of edges corresponds to the edges related to the propagation, + +- the user defines the needed discretization laws, a law is characterized by: + + * the name of this law, + * the number of nodes to compute + * a distribution (uniform, arithmetic, etc.) + +- the user (working on the model) apply a discretization law on each sub-set of propagation edges + +The groups are defined on the model of blocks and the main types of groups are: + +- groups of hexahedra +- groups of quadrangles +- groups of edges +- groups of nodes + +Functionalities +=============== +- Build a model of blocks: + + - Build a hexahedron + - Build grids: cartesian, cylindrical, spherical + - Build standard model of blocks: + + - cylinder, pipe + - 2 intersected cylinders and pipes + + - Operations: cut, merge, prism, join + - Operations: transform, disconnect, remove + +- Associate the model of blocks to the geometry: + - Associate all vertices + - Associate the needed edges + - Associate the needed quadrangles + +- Define the mesh: + - Define the groups on the model of blocks + - Define the laws for discretization + - Define the discretization on the model of blocks + + +Mesh Algorithm +=============== + +Node generation process follows four steps: + +1. generate all the nodes corresponding to the vertices of the model +2. generate all the nodes corresponding to the edges of the model +3. generate all the nodes corresponding to the faces of the model +4. generate all the nodes corresponding to the blocks of the model + +The nodes generated by the meshing of the edges are determined by the discretization law associate to this edge. +The coordinates of these nodes are computed on the geometric edges series associate to this edge. To do so/ a curvilinear abscissa is calculated and based on total length of the 1D geometry associate. The geometric modeler (GEOM of SALOME or CasCade) enables to compute this length. + +The nodes that are generated by meshing of faces are computed in two stages: +1. meshing by linear approximation +2. refining by projection on the geometry if this geometry exists. + +The meshing by linear approximation performs the three following calculations: + +- computation of node coordinates according to the *i* direction taking into account the discretization law on the *j* direction +- computation of node coordinates according to the *j* direction taking into account the discretization law on the *i* direction +- the node coordinates are the coordinates of the midpoint of the segment that is formed from the two previous points +- if there is a projection step, then the normal at this node is computed + +The computation of the normal at a node (i,j) is performed thanks to the neighbor nodes: + +- computation of the plan passing through this node and orthogonal to the straight line connecting the nodes (i-1,j) and (i,j+1) +- computation of the plan passing through this node and orthogonal to the straight line connecting the nodes (i-1,j) and (i,j+1) +- the normal passing through the intersection of the two previous plans + +If the node belongs to a border, the node itself is taken to build the line determining the plan which is perpendicular to it. + +If there is a geometric face (or a list of faces) associate to one face of the model, then an additional projection step (taking into account the normal to the node of the previous step) is computed in order to obtain a node on the geometric face. The coordinates of this node are computed using the intersection of the normal with this face (or this list of faces). + +The nodes generated by the meshing of blocks are determined by the algorithm << i, j, k >> included in the SMESH module of SALOME. + +Examples +---------- +Linear approximation of the discretization of faces +''''''''''''''''''''''''''''''''''''''''''''''''''''' + +.. image:: _static/meshing1.PNG + :align: center + + +Geometric face and meshing by approximation +'''''''''''''''''''''''''''''''''''''''''''' + +.. image:: _static/meshing2.PNG + :align: center + + +Geometric face and meshing by approximation and projection +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +.. image:: _static/meshing3.PNG + :align: center + diff --git a/doc/pyplots/BIELLE.py b/doc/pyplots/BIELLE.py new file mode 100644 index 0000000..4a902d2 --- /dev/null +++ b/doc/pyplots/BIELLE.py @@ -0,0 +1,997 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#=============================================== +# By Karima DEBCHI YATAGHENE Nov 2009 at CS +#=============================================== + + +import os +import GEOM +import geompy +import smesh +import hexablock +import math +import SALOMEDS + + +STEP_PATH = os.path.expandvars("$HEXABLOCK_ROOT_DIR/bin/salome/crank.stp") + + +#============================= +# CREATION DOCUMENT +#============================= + +doc = hexablock.addDocument("Bielle") + +#============================= +# CREATION DU MODELE +#============================= + +# Pour la bielle on doit creer deux grilles cylindriques et prismer les quadrangles entre ces deux dernieres + +#============================= +# PARAMETRES +#============================= + +R = 40.0 + +r_grd = R +r_grd_t = R/2 + +r_pte = R +r_pte_t = R/2 + +l = 200.0 +h = 0.019999999553*2 +#h = 40. + +# Taille du grand cylindre +dr_grd = R +da_grd = 360 +dl_grd = h + +nr_grd = 1 +na_grd = 6 +nl_grd = 1 + +# Taille du petit cylindre +dr_pte = R +da_pte = 360 +dl_pte = h + +nr_pte = 1 +na_pte = 6 +nl_pte = 1 + + +#============================= +# Creation des vecteurs +#============================= + +dx = doc.addVector(l, 0, 0) +dy = doc.addVector(0, l, 0) +dz = doc.addVector(0, 0, l) + +#================================================= +# Creation des centres des grilles cylindriques +#================================================= + +c_grd = doc.addVertex(0, 0, 0) +c_pte = doc.addVertex(2*l, 0, 0) +dx_prime = doc.addVectorVertices( c_grd, c_pte ) + +#================================================= +# Creation de la grande grille cylindrique +#================================================= + +grille_cyl_grd = doc.makeCylindrical(c_grd, dx, dz, dr_grd, da_grd, dl_grd, nr_grd, na_grd, nl_grd, False) + +# on obtient une liste qui contient 6 hexaedres eguaux + +# 30 = pi/6 +# 60 = pi/3 +# 45 = pi/4 +# 90 = pi/2 +# 180 = pi + +alpha_x = 2*R*math.cos(math.pi/3) +alpha_y = 2*R*math.sin(math.pi/3) + +x1 = doc.findVertex( 2*R, 0, h ) +x2 = doc.findVertex( alpha_x, alpha_y, 0 ) +x3 = doc.findVertex( alpha_x, -alpha_y, 0 ) +x4 = doc.findVertex( 2*R, 0, 0 ) + +quad_11 = doc.findQuad(x1, x2) +quad_12 = doc.findQuad(x1, x3) + +quad_list = [ quad_11 , quad_12 ] + +#================================================= +# Creation de la petite grille cylindrique +#================================================= + +grille_cyl_pte = doc.makeTranslation( grille_cyl_grd , dx_prime ) + +# on obtient une liste qui contient 6 hexaedres eguaux + +y1 = doc.findVertex( 2*l - 2*R , 0 , h ) +y2 = doc.findVertex( 2*l - alpha_x , alpha_y , 0 ) +y3 = doc.findVertex( 2*l - alpha_x , -alpha_y , 0 ) +y4 = doc.findVertex( 2*l - 2*R , 0 , 0 ) + +quad_21 = doc.findQuad(y1, y2) +quad_22 = doc.findQuad(y1, y3) + +#================================================= +# Assemblage des deux grilles cylindriques +#================================================= +model_biell_fin = doc.joinQuads( quad_list , quad_21 , x1 , y1 , x4 , y4 , 1 ) + + +#=================================================================== +# Recuperation des vertex du model hexa bielle pour l association +#=================================================================== + +# NB: +# h = haut +# b = bas +# g = grand +# p = petit +# t = trou + +alpha_x = 2*R*math.cos(math.pi/3) +alpha_y = 2*R*math.sin(math.pi/3) + +# Face du haut grand trou + +## RQ:On remplace la fonction findVertex par getVertexIJK + +v_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 0 , 1 ) +w_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 1 , 1 ) +z_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 2 , 1 ) + +y_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 3 , 1 ) +x_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 4 , 1 ) +u_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 5 , 1 ) + +v_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 0 , 1 ) +w_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 1 , 1 ) +z_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 2 , 1 ) + +y_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 3 , 1 ) +x_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 4 , 1 ) +u_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 5 , 1 ) + + +assert x_mod_h_g +assert y_mod_h_g +assert z_mod_h_g + +assert u_mod_h_g +assert v_mod_h_g +assert w_mod_h_g + +assert x_mod_h_g_t +assert y_mod_h_g_t +assert z_mod_h_g_t + +assert u_mod_h_g_t +assert v_mod_h_g_t +assert w_mod_h_g_t # + + +# Face du haut petit trou + +## RQ:On remplace la fonction findVertex par getVertexIJK +v_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 0 , 1 ) +w_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 1 , 1 ) +z_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 2 , 1 ) + +y_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 3 , 1 ) +x_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 4 , 1 ) +u_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 5 , 1 ) + +v_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 0 , 1 ) +w_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 1 , 1 ) +z_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 2 , 1 ) + +y_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 3 , 1 ) +x_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 4 , 1 ) +u_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 5 , 1 ) + + +assert x_mod_h_p +assert y_mod_h_p +assert z_mod_h_p + +assert u_mod_h_p +assert v_mod_h_p +assert w_mod_h_p + +assert x_mod_h_p_t +assert y_mod_h_p_t +assert z_mod_h_p_t + +assert u_mod_h_p_t +assert v_mod_h_p_t +assert w_mod_h_p_t +#----------- + +# Face du bas grand trou + +## RQ:On remplace la fonction findVertex par getVertexIJK + +v_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 0 , 0 ) +w_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 1 , 0 ) +z_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 2 , 0 ) + +y_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 3 , 0 ) +x_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 4 , 0 ) +u_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 5 , 0 ) + +v_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 0 , 0 ) +w_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 1 , 0 ) +z_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 2 , 0 ) + +y_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 3 , 0 ) +x_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 4 , 0 ) +u_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 5 , 0 ) + +assert x_mod_b_g +assert y_mod_b_g +assert z_mod_b_g + +assert u_mod_b_g +assert v_mod_b_g +assert w_mod_b_g + +assert x_mod_b_g_t +assert y_mod_b_g_t +assert z_mod_b_g_t + +assert u_mod_b_g_t +assert v_mod_b_g_t +assert w_mod_b_g_t + + +# Face du bas petit trou + + +## RQ:On remplace la fonction findVertex par getVertexIJK + +v_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 0 , 0 ) +w_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 1 , 0 ) +z_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 2 , 0 ) + +y_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 3 , 0 ) +x_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 4 , 0 ) +u_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 5 , 0 ) + +v_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 0 , 0 ) +w_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 1 , 0 ) +z_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 2 , 0 ) + +y_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 3 , 0 ) +x_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 4 , 0 ) +u_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 5 , 0 ) + +assert x_mod_b_p +assert y_mod_b_p +assert z_mod_b_p + +assert u_mod_b_p +assert v_mod_b_p +assert w_mod_b_p + +assert x_mod_b_p_t +assert y_mod_b_p_t +assert z_mod_b_p_t + +assert u_mod_b_p_t +assert v_mod_b_p_t +assert w_mod_b_p_t +#----------- + + + +#=================================================================== +# Recuperation des points de la geometrie bielle pour l association +#=================================================================== +# NB: +# h = haut +# b = bas +# g = grand +# p = petit +# t = trou + +Bielle_geom = geompy.Import(STEP_PATH, "STEP") + +geompy.addToStudy(Bielle_geom, "Bielle_geom") + +Pt_A = geompy.MakeVertex(0, 0, h/2.) +Pt_B = geompy.MakeVertex(0, 0, -h/2.) + +Face_haut = geompy.GetFaceNearPoint(Bielle_geom, Pt_A) +Face_bas = geompy.GetFaceNearPoint(Bielle_geom, Pt_B) + + +# Param�tre pour: +# -r�cup�ration des points. +# -et associations. +u_1 = 0.75#0.8 +u_2 = 0.5 +u_3 = 0.25#0.2 + + + +y_h_g = geompy.MakeVertexOnSurface(Face_haut, 1, 0.5) +y_b_g = geompy.MakeVertexWithRef(y_h_g, 0, 0, -h) +v_h_p = geompy.MakeVertexOnSurface(Face_haut, 0, 0.5) +v_b_p = geompy.MakeVertexWithRef(v_h_p, 0, 0, -h) + + +Edge_haut_grd = geompy.GetEdgeNearPoint(Bielle_geom, y_h_g) +Edge_haut_pte = geompy.GetEdgeNearPoint(Bielle_geom, v_h_p) +Edge_haut_grd_trou = geompy.GetEdgesByLength(Face_haut, 0.147, 0.148) +Edge_haut_pte_trou = geompy.GetEdgesByLength(Face_haut, 0.094, 0.095) +Edge_haut_droite = geompy.GetEdgesByLength(Face_haut, 0.136, 0.137) +Edge_haut_gauche = geompy.GetEdgesByLength(Face_haut, 0.131, 0.132) + + +#x_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, 0) +x_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, u_3) +x_b_g = geompy.MakeVertexWithRef(x_h_g, 0, 0, -h) + +#z_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, 1.) +z_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, u_1) +z_b_g = geompy.MakeVertexWithRef(z_h_g, 0, 0, -h) + +#w_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, 0) +w_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, u_3) +w_b_p = geompy.MakeVertexWithRef(w_h_p, 0, 0, -h) + +#u_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, 1) +u_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, u_1) +u_b_p = geompy.MakeVertexWithRef(u_h_p, 0, 0, -h) + + +y_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0) +y_b_g_t = geompy.MakeVertexWithRef(y_h_g_t, 0, 0, -h) + +z_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.2) +z_b_g_t = geompy.MakeVertexWithRef(z_h_g_t, 0, 0, -h) + +#w_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.35) +w_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.40) +w_b_g_t = geompy.MakeVertexWithRef(w_h_g_t, 0, 0, -h) + + +v_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.5) +v_b_g_t = geompy.MakeVertexWithRef(v_h_g_t, 0, 0, -h) + +#u_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.65) +u_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.6) +u_b_g_t = geompy.MakeVertexWithRef(u_h_g_t, 0, 0, -h) + +x_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.8) +x_b_g_t = geompy.MakeVertexWithRef(x_h_g_t, 0, 0, -h) + +y_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0) +y_b_p_t = geompy.MakeVertexWithRef(y_h_p_t, 0, 0, -h) + +#z_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.2) +z_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.1) +z_b_p_t = geompy.MakeVertexWithRef(z_h_p_t, 0, 0, -h) + +w_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.35) +w_b_p_t = geompy.MakeVertexWithRef(w_h_p_t, 0, 0, -h) + +v_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.5) +v_b_p_t = geompy.MakeVertexWithRef(v_h_p_t, 0, 0, -h) + +u_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.65) +u_b_p_t = geompy.MakeVertexWithRef(u_h_p_t, 0, 0, -h) + + + +#x_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.8) +x_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.9) +x_b_p_t = geompy.MakeVertexWithRef(x_h_p_t, 0, 0, -h) + +u_h_g = geompy.MakeVertexOnCurve(Edge_haut_droite, 1) +u_b_g = geompy.MakeVertexWithRef(u_h_g, 0, 0, -h) + +x_h_p = geompy.MakeVertexOnCurve(Edge_haut_droite, 0) +x_b_p = geompy.MakeVertexWithRef(x_h_p, 0, 0, -h) + + +w_h_g = geompy.MakeVertexOnCurve(Edge_haut_gauche, 0) +w_b_g = geompy.MakeVertexWithRef(w_h_g, 0, 0, -h) + + +z_h_p = geompy.MakeVertexOnCurve(Edge_haut_gauche, 1) +z_b_p = geompy.MakeVertexWithRef(z_h_p, 0, 0, -h) + + +Edge_v_grd = geompy.MakeLineTwoPnt(u_h_g, w_h_g) +v_h_g = geompy.MakeVertexOnCurve(Edge_v_grd, 0.5) +v_b_g = geompy.MakeVertexWithRef(v_h_g, 0, 0, -h) + +Edge_v_pte = geompy.MakeLineTwoPnt(x_h_p, z_h_p) + +y_h_p = geompy.MakeVertexOnCurve(Edge_v_pte, 0.5) +y_b_p = geompy.MakeVertexWithRef(y_h_p, 0, 0, -h) + + + + + + + + +#======================= +# CREATION ASSOCIATION +#======================= + +#=========================================== +# association des sommets de la face du haut +#=========================================== + +# grand trou + +x_mod_h_g.setAssociation( x_h_g ) +y_mod_h_g.setAssociation( y_h_g ) +z_mod_h_g.setAssociation( z_h_g ) +u_mod_h_g.setAssociation( u_h_g ) +v_mod_h_g.setAssociation( v_h_g ) +w_mod_h_g.setAssociation( w_h_g ) + +x_mod_h_g_t.setAssociation( x_h_g_t ) +y_mod_h_g_t.setAssociation( y_h_g_t ) +z_mod_h_g_t.setAssociation( z_h_g_t ) +u_mod_h_g_t.setAssociation( u_h_g_t ) +v_mod_h_g_t.setAssociation( v_h_g_t ) +w_mod_h_g_t.setAssociation( w_h_g_t ) + +# petit trou + +x_mod_h_p.setAssociation( x_h_p ) +y_mod_h_p.setAssociation( y_h_p ) +z_mod_h_p.setAssociation( z_h_p ) +u_mod_h_p.setAssociation( u_h_p ) +v_mod_h_p.setAssociation( v_h_p ) +w_mod_h_p.setAssociation( w_h_p ) + +x_mod_h_p_t.setAssociation( x_h_p_t ) +y_mod_h_p_t.setAssociation( y_h_p_t ) +z_mod_h_p_t.setAssociation( z_h_p_t ) +u_mod_h_p_t.setAssociation( u_h_p_t ) +v_mod_h_p_t.setAssociation( v_h_p_t ) +w_mod_h_p_t.setAssociation( w_h_p_t ) + + +#=========================================== +# association des sommets de la face du bas +#=========================================== + +# grand trou + +x_mod_b_g.setAssociation( x_b_g ) +y_mod_b_g.setAssociation( y_b_g ) +z_mod_b_g.setAssociation( z_b_g ) +u_mod_b_g.setAssociation( u_b_g ) +v_mod_b_g.setAssociation( v_b_g ) +w_mod_b_g.setAssociation( w_b_g ) + +x_mod_b_g_t.setAssociation( x_b_g_t ) +y_mod_b_g_t.setAssociation( y_b_g_t ) +z_mod_b_g_t.setAssociation( z_b_g_t ) +u_mod_b_g_t.setAssociation( u_b_g_t ) +v_mod_b_g_t.setAssociation( v_b_g_t ) +w_mod_b_g_t.setAssociation( w_b_g_t ) + +# petit trou + +x_mod_b_p.setAssociation( x_b_p ) +y_mod_b_p.setAssociation( y_b_p ) +z_mod_b_p.setAssociation( z_b_p ) +u_mod_b_p.setAssociation( u_b_p ) +v_mod_b_p.setAssociation( v_b_p ) +w_mod_b_p.setAssociation( w_b_p ) + +x_mod_b_p_t.setAssociation( x_b_p_t ) +y_mod_b_p_t.setAssociation( y_b_p_t ) +z_mod_b_p_t.setAssociation( z_b_p_t ) +u_mod_b_p_t.setAssociation( u_b_p_t ) +v_mod_b_p_t.setAssociation( v_b_p_t ) +w_mod_b_p_t.setAssociation( w_b_p_t ) + + + + +#================================= +# Creation association des edges +#================================= + + +All_Edges_Bielle = geompy.SubShapeAllSorted(Bielle_geom, geompy.ShapeType["EDGE"]) + +##------------------ +## Arrondies du haut +##------------------ + +#geometrie +Edge_Arr_grd_g_h = All_Edges_Bielle[20] +Edge_Arr_grd_d_h = All_Edges_Bielle[22] +Edge_Arr_pte_g_h = All_Edges_Bielle[8] +Edge_Arr_pte_d_h = All_Edges_Bielle[10] + +#model +Edge_Arr_grd_g_h_mod = grille_cyl_grd.getEdgeJ( 1 , 1 , 1 ) +Edge_Arr_grd_d_h_mod = grille_cyl_grd.getEdgeJ( 1 , 4 , 1 ) +Edge_Arr_pte_g_h_mod = grille_cyl_pte.getEdgeJ( 1 , 1 , 1 ) +Edge_Arr_pte_d_h_mod = grille_cyl_pte.getEdgeJ( 1 , 4 , 1 ) + + + +##------------------ +## Arrondies du bas +##------------------ +# geometrie +Edge_Arr_grd_g_b = All_Edges_Bielle[19] +Edge_Arr_grd_d_b = All_Edges_Bielle[21] +Edge_Arr_pte_g_b = All_Edges_Bielle[7] +Edge_Arr_pte_d_b = All_Edges_Bielle[9] + + +#model +Edge_Arr_grd_g_b_mod = grille_cyl_grd.getEdgeJ( 1 , 1 , 0 ) +Edge_Arr_grd_d_b_mod = grille_cyl_grd.getEdgeJ( 1 , 4 , 0 ) +Edge_Arr_pte_g_b_mod = grille_cyl_pte.getEdgeJ( 1 , 1 , 0 ) +Edge_Arr_pte_d_b_mod = grille_cyl_pte.getEdgeJ( 1 , 4 , 0 ) + + + +##------------------ +## Grands rayons +##------------------ + +# geometrie +Edge_Ray_grd_g_b = All_Edges_Bielle[27] +Edge_Ray_grd_g_h = All_Edges_Bielle[28] +Edge_Ray_grd_d_b = All_Edges_Bielle[0] +Edge_Ray_grd_d_h = All_Edges_Bielle[1] + + +#model +Edge_Grd_Ray_0_mod = grille_cyl_pte.getEdgeJ( 1 , 0 , 0 ) +Edge_Grd_Ray_1_mod = grille_cyl_pte.getEdgeJ( 1 , 0 , 1 ) +Edge_Grd_Ray_2_mod = grille_cyl_pte.getEdgeJ( 1 , 5 , 0 ) +Edge_Grd_Ray_3_mod = grille_cyl_pte.getEdgeJ( 1 , 5 , 1 ) +Edge_Grd_Ray_4_mod = grille_cyl_grd.getEdgeJ( 1 , 2 , 0 ) +Edge_Grd_Ray_5_mod = grille_cyl_grd.getEdgeJ( 1 , 2 , 1 ) +Edge_Grd_Ray_6_mod = grille_cyl_grd.getEdgeJ( 1 , 3 , 0 ) +Edge_Grd_Ray_7_mod = grille_cyl_grd.getEdgeJ( 1 , 3 , 1 ) + + + + +##------------------ +## ASSOCIATIONS : arrondies du haut, arrondies du bas et grands rayons +##------------------ + + +#arrondies du haut +Edge_Arr_grd_g_h_mod.addAssociation( Edge_Arr_grd_g_h, 0., 1. ) +Edge_Arr_grd_g_h_mod.addAssociation( Edge_Ray_grd_g_h, u_1, 1. )#Edge_haut_grd + + +Edge_Arr_grd_d_h_mod.addAssociation( Edge_Arr_grd_d_h, 0., 1. ) +Edge_Arr_grd_d_h_mod.addAssociation( Edge_Ray_grd_g_h, 0., u_3 ) + + +Edge_Arr_pte_g_h_mod.addAssociation( Edge_Arr_pte_g_h, 0., 1. ) +Edge_Arr_pte_g_h_mod.addAssociation( Edge_Ray_grd_d_h, 0., u_3 ) + + +Edge_Arr_pte_d_h_mod.addAssociation( Edge_Arr_pte_d_h, 0., 1. ) +Edge_Arr_pte_d_h_mod.addAssociation( Edge_Ray_grd_d_h, u_1, 1. ) + + +#arrondies du bas +Edge_Arr_grd_g_b_mod.addAssociation( Edge_Arr_grd_g_b, 0., 1. ) +Edge_Arr_grd_g_b_mod.addAssociation( Edge_Ray_grd_g_b, u_1, 1. ) + + +Edge_Arr_grd_d_b_mod.addAssociation( Edge_Arr_grd_d_b, 0., 1. ) +Edge_Arr_grd_d_b_mod.addAssociation( Edge_Ray_grd_g_b, 0., u_3 ) + + +Edge_Arr_pte_g_b_mod.addAssociation( Edge_Arr_pte_g_b, 0., 1. ) +Edge_Arr_pte_g_b_mod.addAssociation( Edge_Ray_grd_d_b, 0., u_3 ) + + +Edge_Arr_pte_d_b_mod.addAssociation( Edge_Arr_pte_d_b, 0., 1. ) +Edge_Arr_pte_d_b_mod.addAssociation( Edge_Ray_grd_d_b, u_1, 1. ) + + +#grands rayon +Edge_Grd_Ray_0_mod.addAssociation( Edge_Ray_grd_d_b, u_3, u_2 ) +Edge_Grd_Ray_1_mod.addAssociation( Edge_Ray_grd_d_h, u_3, u_2 ) +Edge_Grd_Ray_2_mod.addAssociation( Edge_Ray_grd_d_b, u_2, u_1 ) +Edge_Grd_Ray_3_mod.addAssociation( Edge_Ray_grd_d_h, u_2, u_1 ) + +Edge_Grd_Ray_4_mod.addAssociation( Edge_Ray_grd_g_b, u_2, u_1 ) +Edge_Grd_Ray_5_mod.addAssociation( Edge_Ray_grd_g_h, u_2, u_1 ) +Edge_Grd_Ray_6_mod.addAssociation( Edge_Ray_grd_g_b, u_3, u_2 ) +Edge_Grd_Ray_7_mod.addAssociation( Edge_Ray_grd_g_h, u_3, u_2 ) + + + + +# recuperer les rayons des trous de la bielle de la geometrie +Edge_Trou_grd_h = All_Edges_Bielle[26] +Edge_Trou_grd_b = All_Edges_Bielle[25] +Edge_Trou_pte_h = All_Edges_Bielle[3] +Edge_Trou_pte_b = All_Edges_Bielle[2] + + +Partition_Trou_grd_haut = geompy.MakePartition([ Edge_Trou_grd_h ], [ z_h_g_t , w_h_g_t , v_h_g_t , u_h_g_t , x_h_g_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +All_Edge_Partition_Trou_grd_haut = geompy.SubShapeAllSorted(Partition_Trou_grd_haut, geompy.ShapeType["EDGE"]) + +Edge_Trou_grd_h_0 = All_Edge_Partition_Trou_grd_haut[0] +Edge_Trou_grd_h_1 = All_Edge_Partition_Trou_grd_haut[1] +Edge_Trou_grd_h_2 = All_Edge_Partition_Trou_grd_haut[2] +Edge_Trou_grd_h_3 = All_Edge_Partition_Trou_grd_haut[3] +Edge_Trou_grd_h_4 = All_Edge_Partition_Trou_grd_haut[4] +Edge_Trou_grd_h_5 = All_Edge_Partition_Trou_grd_haut[5] + + +Edge_Trou_grd_h_0_mod = grille_cyl_grd.getEdgeJ( 0 , 0 , 1 ) +Edge_Trou_grd_h_1_mod = grille_cyl_grd.getEdgeJ( 0 , 5 , 1 ) +Edge_Trou_grd_h_2_mod = grille_cyl_grd.getEdgeJ( 0 , 1 , 1 ) +Edge_Trou_grd_h_3_mod = grille_cyl_grd.getEdgeJ( 0 , 4 , 1 ) +Edge_Trou_grd_h_4_mod = grille_cyl_grd.getEdgeJ( 0 , 2 , 1 ) +Edge_Trou_grd_h_5_mod = grille_cyl_grd.getEdgeJ( 0 , 3 , 1 ) + + +Edge_Trou_grd_h_0_mod.addAssociation( Edge_Trou_grd_h_0, 0., 1. ) +Edge_Trou_grd_h_1_mod.addAssociation( Edge_Trou_grd_h_1, 0., 1. ) +Edge_Trou_grd_h_2_mod.addAssociation( Edge_Trou_grd_h_2, 0., 1. ) +Edge_Trou_grd_h_4_mod.addAssociation( Edge_Trou_grd_h_4, 0., 1. ) +Edge_Trou_grd_h_5_mod.addAssociation( Edge_Trou_grd_h_5, 0., 1. ) +Edge_Trou_grd_h_3_mod.addAssociation( Edge_Trou_grd_h_3, 0., 1. ) + + +Partition_Trou_grd_bas = geompy.MakePartition([ Edge_Trou_grd_b ], [ z_b_g_t , w_b_g_t , v_b_g_t , u_b_g_t , x_b_g_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +All_Edge_Partition_Trou_grd_bas = geompy.SubShapeAllSorted(Partition_Trou_grd_bas, geompy.ShapeType["EDGE"]) + +Edge_Trou_grd_b_0 = All_Edge_Partition_Trou_grd_bas[0] +Edge_Trou_grd_b_1 = All_Edge_Partition_Trou_grd_bas[1] +Edge_Trou_grd_b_2 = All_Edge_Partition_Trou_grd_bas[2] +Edge_Trou_grd_b_3 = All_Edge_Partition_Trou_grd_bas[3] +Edge_Trou_grd_b_4 = All_Edge_Partition_Trou_grd_bas[4] +Edge_Trou_grd_b_5 = All_Edge_Partition_Trou_grd_bas[5] + + +Edge_Trou_grd_b_0_mod = grille_cyl_grd.getEdgeJ( 0 , 0 , 0 ) +Edge_Trou_grd_b_1_mod = grille_cyl_grd.getEdgeJ( 0 , 5 , 0 ) +Edge_Trou_grd_b_2_mod = grille_cyl_grd.getEdgeJ( 0 , 1 , 0 ) +Edge_Trou_grd_b_3_mod = grille_cyl_grd.getEdgeJ( 0 , 4 , 0 ) +Edge_Trou_grd_b_4_mod = grille_cyl_grd.getEdgeJ( 0 , 2 , 0 ) +Edge_Trou_grd_b_5_mod = grille_cyl_grd.getEdgeJ( 0 , 3 , 0 ) + + +Edge_Trou_grd_b_0_mod.addAssociation( Edge_Trou_grd_b_0, 0., 1. ) +Edge_Trou_grd_b_1_mod.addAssociation( Edge_Trou_grd_b_1, 0., 1. ) +Edge_Trou_grd_b_2_mod.addAssociation( Edge_Trou_grd_b_2, 0., 1. ) +Edge_Trou_grd_b_3_mod.addAssociation( Edge_Trou_grd_b_3, 0., 1. ) +Edge_Trou_grd_b_4_mod.addAssociation( Edge_Trou_grd_b_4, 0., 1. ) +Edge_Trou_grd_b_5_mod.addAssociation( Edge_Trou_grd_b_5, 0., 1. ) + + + +Partition_Trou_pte_haut = geompy.MakePartition([ Edge_Trou_pte_h ], [ z_h_p_t , w_h_p_t , v_h_p_t , u_h_p_t , x_h_p_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +All_Edge_Partition_Trou_pte_haut = geompy.SubShapeAllSorted(Partition_Trou_pte_haut, geompy.ShapeType["EDGE"]) + +Edge_Trou_pte_h_0 = All_Edge_Partition_Trou_pte_haut[0] +Edge_Trou_pte_h_1 = All_Edge_Partition_Trou_pte_haut[1] +Edge_Trou_pte_h_2 = All_Edge_Partition_Trou_pte_haut[2] +Edge_Trou_pte_h_3 = All_Edge_Partition_Trou_pte_haut[3] +Edge_Trou_pte_h_4 = All_Edge_Partition_Trou_pte_haut[4] +Edge_Trou_pte_h_5 = All_Edge_Partition_Trou_pte_haut[5] + + +Edge_Trou_pte_h_0_mod = grille_cyl_pte.getEdgeJ( 0 , 0 , 1 ) +Edge_Trou_pte_h_1_mod = grille_cyl_pte.getEdgeJ( 0 , 5 , 1 ) +Edge_Trou_pte_h_2_mod = grille_cyl_pte.getEdgeJ( 0 , 1 , 1 ) +Edge_Trou_pte_h_3_mod = grille_cyl_pte.getEdgeJ( 0 , 4 , 1 ) +Edge_Trou_pte_h_4_mod = grille_cyl_pte.getEdgeJ( 0 , 2 , 1 ) +Edge_Trou_pte_h_5_mod = grille_cyl_pte.getEdgeJ( 0 , 3 , 1 ) + + +Edge_Trou_pte_h_0_mod.addAssociation( Edge_Trou_pte_h_0, 0., 1. ) +Edge_Trou_pte_h_1_mod.addAssociation( Edge_Trou_pte_h_1, 0., 1. ) +Edge_Trou_pte_h_2_mod.addAssociation( Edge_Trou_pte_h_2, 0., 1. ) +Edge_Trou_pte_h_3_mod.addAssociation( Edge_Trou_pte_h_3, 0., 1. ) +Edge_Trou_pte_h_4_mod.addAssociation( Edge_Trou_pte_h_4, 0., 1. ) +Edge_Trou_pte_h_5_mod.addAssociation( Edge_Trou_pte_h_5, 0., 1. ) + + +Partition_Trou_pte_bas = geompy.MakePartition([ Edge_Trou_pte_b ], [ z_b_p_t , w_b_p_t , v_b_p_t , u_b_p_t , x_b_p_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +All_Edge_Partition_Trou_pte_bas = geompy.SubShapeAllSorted(Partition_Trou_pte_bas, geompy.ShapeType["EDGE"]) + + +Edge_Trou_pte_b_0 = All_Edge_Partition_Trou_pte_bas[0] +Edge_Trou_pte_b_1 = All_Edge_Partition_Trou_pte_bas[1] +Edge_Trou_pte_b_2 = All_Edge_Partition_Trou_pte_bas[2] +Edge_Trou_pte_b_3 = All_Edge_Partition_Trou_pte_bas[3] +Edge_Trou_pte_b_4 = All_Edge_Partition_Trou_pte_bas[4] +Edge_Trou_pte_b_5 = All_Edge_Partition_Trou_pte_bas[5] + + +Edge_Trou_pte_b_0_mod = grille_cyl_pte.getEdgeJ( 0 , 0 , 0 ) +Edge_Trou_pte_b_2_mod = grille_cyl_pte.getEdgeJ( 0 , 1 , 0 ) +Edge_Trou_pte_b_4_mod = grille_cyl_pte.getEdgeJ( 0 , 2 , 0 ) +Edge_Trou_pte_b_5_mod = grille_cyl_pte.getEdgeJ( 0 , 3 , 0 ) +Edge_Trou_pte_b_3_mod = grille_cyl_pte.getEdgeJ( 0 , 4 , 0 ) +Edge_Trou_pte_b_1_mod = grille_cyl_pte.getEdgeJ( 0 , 5 , 0 ) + +Edge_Trou_pte_b_0_mod.addAssociation( Edge_Trou_pte_b_0, 0., 1. ) +Edge_Trou_pte_b_1_mod.addAssociation( Edge_Trou_pte_b_1, 0., 1. ) +Edge_Trou_pte_b_2_mod.addAssociation( Edge_Trou_pte_b_2, 0., 1. ) +Edge_Trou_pte_b_3_mod.addAssociation( Edge_Trou_pte_b_3, 0., 1. ) +Edge_Trou_pte_b_4_mod.addAssociation( Edge_Trou_pte_b_4, 0., 1. ) +Edge_Trou_pte_b_5_mod.addAssociation( Edge_Trou_pte_b_5, 0., 1. ) + + + +#==================================== +# CREATION DES FACES DES ARRONDIES +#==================================== +All_Face_Arron_Bielle = geompy.SubShapeAllSorted(Bielle_geom, geompy.ShapeType["FACE"]) + +Face_Arron_1 = All_Face_Arron_Bielle[2] +Face_Arron_2 = All_Face_Arron_Bielle[3] +Face_Arron_3 = All_Face_Arron_Bielle[8] +Face_Arron_4 = All_Face_Arron_Bielle[9] + +Quad_Arron_1 = grille_cyl_pte.getQuadJK( 1 , 1 , 0 ) +Quad_Arron_2 = grille_cyl_pte.getQuadJK( 1 , 4 , 0 ) +Quad_Arron_3 = grille_cyl_grd.getQuadJK( 1 , 1 , 0 ) +Quad_Arron_4 = grille_cyl_grd.getQuadJK( 1 , 4 , 0 ) + + + +#================================================= +# VERTEX, EDGES, FACES DANS L'ARBRE D'ETUDE SALOME +#================================================= + +geompy.addToStudy( y_h_g , "y_h_g" ) +geompy.addToStudy( y_b_g , "y_b_g" ) +geompy.addToStudy( v_h_p , "v_h_p" ) +geompy.addToStudy( v_b_p , "v_b_p" ) +geompy.addToStudy( x_h_g , "x_h_g" ) +geompy.addToStudy( x_b_g , "x_b_g" ) +geompy.addToStudy( z_h_g , "z_h_g" ) +geompy.addToStudy( z_b_g , "z_b_g" ) +geompy.addToStudy( w_h_p , "w_h_p" ) +geompy.addToStudy( w_b_p , "w_b_p" ) +geompy.addToStudy( u_h_p , "u_h_p" ) +geompy.addToStudy( u_b_p , "u_b_p" ) +geompy.addToStudy(y_h_g_t, "y_h_g_t") +geompy.addToStudy(y_b_g_t, "y_b_g_t") +geompy.addToStudy(z_h_g_t, "z_h_g_t") +geompy.addToStudy(z_b_g_t, "z_b_g_t") +geompy.addToStudy(w_h_g_t, "w_h_g_t") +geompy.addToStudy(w_b_g_t, "w_b_g_t") +geompy.addToStudy(v_h_g_t, "v_h_g_t") +geompy.addToStudy(v_b_g_t, "v_b_g_t") +geompy.addToStudy(u_h_g_t, "u_h_g_t") +geompy.addToStudy(u_b_g_t, "u_b_g_t") +geompy.addToStudy(x_h_g_t, "x_h_g_t") +geompy.addToStudy(x_b_g_t, "x_b_g_t") +geompy.addToStudy(y_h_p_t, "y_h_p_t") +geompy.addToStudy(y_b_p_t, "y_b_p_t") +geompy.addToStudy(z_h_p_t, "z_h_p_t") +geompy.addToStudy(z_b_p_t, "z_b_p_t") +geompy.addToStudy(w_h_p_t, "w_h_p_t") +geompy.addToStudy(w_b_p_t, "w_b_p_t") +geompy.addToStudy(v_h_p_t, "v_h_p_t") +geompy.addToStudy(v_b_p_t, "v_b_p_t") +geompy.addToStudy(u_h_p_t, "u_h_p_t") +geompy.addToStudy(u_b_p_t, "u_b_p_t") +geompy.addToStudy(x_b_p_t, "x_b_p_t") +geompy.addToStudy(u_h_g, "u_h_g") +geompy.addToStudy(u_b_g, "u_b_g") +geompy.addToStudy(x_h_p, "x_h_p") +geompy.addToStudy(x_b_p, "x_b_p") +geompy.addToStudy(w_h_g, "w_h_g") +geompy.addToStudy(w_b_g, "w_b_g") +geompy.addToStudy(z_h_p, "z_h_p") +geompy.addToStudy(z_b_p, "z_b_p") +geompy.addToStudy(v_h_g, "v_h_g") +geompy.addToStudy(v_b_g, "v_b_g") +geompy.addToStudy(y_h_p, "y_h_p") +geompy.addToStudy(y_b_p, "y_b_p") + + +geompy.addToStudy( Edge_Trou_grd_h , "Edge_Trou_grd_h" ) +geompy.addToStudy( Edge_Trou_grd_b , "Edge_Trou_grd_b" ) +geompy.addToStudy( Edge_Trou_pte_h , "Edge_Trou_pte_h" ) +geompy.addToStudy( Edge_Trou_pte_b , "Edge_Trou_pte_b" ) +geompy.addToStudy( Edge_Trou_grd_h_0 , "Edge_Trou_grd_h_0" ) +geompy.addToStudy( Edge_Trou_grd_h_2 , "Edge_Trou_grd_h_2" ) +geompy.addToStudy( Edge_Trou_grd_h_4 , "Edge_Trou_grd_h_4" ) +geompy.addToStudy( Edge_Trou_grd_h_5 , "Edge_Trou_grd_h_5" ) +geompy.addToStudy( Edge_Trou_grd_h_3 , "Edge_Trou_grd_h_3" ) +geompy.addToStudy( Edge_Trou_grd_h_1 , "Edge_Trou_grd_h_1" ) +geompy.addToStudy( Edge_Trou_grd_b_0 , "Edge_Trou_grd_b_0" ) +geompy.addToStudy( Edge_Trou_grd_b_2 , "Edge_Trou_grd_b_2" ) +geompy.addToStudy( Edge_Trou_grd_b_4 , "Edge_Trou_grd_b_4" ) +geompy.addToStudy( Edge_Trou_grd_b_5 , "Edge_Trou_grd_b_5" ) +geompy.addToStudy( Edge_Trou_grd_b_3 , "Edge_Trou_grd_b_3" ) +geompy.addToStudy( Edge_Trou_grd_b_1 , "Edge_Trou_grd_b_1" ) +geompy.addToStudy( Edge_Trou_pte_h_0 , "Edge_Trou_pte_h_0" ) +geompy.addToStudy( Edge_Trou_pte_h_2 , "Edge_Trou_pte_h_2" ) +geompy.addToStudy( Edge_Trou_pte_h_4 , "Edge_Trou_pte_h_4" ) +geompy.addToStudy( Edge_Trou_pte_h_5 , "Edge_Trou_pte_h_5" ) +geompy.addToStudy( Edge_Trou_pte_h_3 , "Edge_Trou_pte_h_3" ) +geompy.addToStudy( Edge_Trou_pte_h_1 , "Edge_Trou_pte_h_1" ) +geompy.addToStudy( Edge_Trou_pte_b_0 , "Edge_Trou_pte_b_0" ) +geompy.addToStudy( Edge_Trou_pte_b_2 , "Edge_Trou_pte_b_2" ) +geompy.addToStudy( Edge_Trou_pte_b_4 , "Edge_Trou_pte_b_4" ) +geompy.addToStudy( Edge_Trou_pte_b_5 , "Edge_Trou_pte_b_5" ) +geompy.addToStudy( Edge_Trou_pte_b_3 , "Edge_Trou_pte_b_3" ) +geompy.addToStudy( Edge_Trou_pte_b_1 , "Edge_Trou_pte_b_1" ) + +geompy.addToStudy( Edge_Arr_grd_g_h , "Edge_Arr_grd_g_h" ) +geompy.addToStudy( Edge_Arr_grd_d_h , "Edge_Arr_grd_d_h" ) +geompy.addToStudy( Edge_Arr_pte_g_h , "Edge_Arr_pte_g_h" ) +geompy.addToStudy( Edge_Arr_pte_d_h , "Edge_Arr_pte_d_h" ) + +geompy.addToStudy( Edge_Arr_grd_g_b , "Edge_Arr_grd_g_b" ) +geompy.addToStudy( Edge_Arr_grd_d_b , "Edge_Arr_grd_d_b" ) +geompy.addToStudy( Edge_Arr_pte_g_b , "Edge_Arr_pte_g_b" ) +geompy.addToStudy( Edge_Arr_pte_d_b , "Edge_Arr_pte_d_b" ) + +geompy.addToStudy( Edge_Ray_grd_g_h , "Edge_Ray_grd_g_h" ) +geompy.addToStudy( Edge_Ray_grd_d_h , "Edge_Ray_grd_d_h" ) +geompy.addToStudy( Edge_Ray_grd_g_b , "Edge_Ray_grd_g_b" ) +geompy.addToStudy( Edge_Ray_grd_d_b , "Edge_Ray_grd_d_b" ) + + +geompy.addToStudy(Face_Arron_1, "Face_Arron_1") +geompy.addToStudy(Face_Arron_2, "Face_Arron_2") +geompy.addToStudy(Face_Arron_3, "Face_Arron_3") +geompy.addToStudy(Face_Arron_4, "Face_Arron_4") + + +geompy.addToStudy( Partition_Trou_grd_haut , "Partition_Trou_grd_haut" ) +geompy.addToStudy( Partition_Trou_grd_bas , "Partition_Trou_grd_bas" ) +geompy.addToStudy( Partition_Trou_pte_haut , "Partition_Trou_pte_haut" ) +geompy.addToStudy( Partition_Trou_pte_bas , "Partition_Trou_pte_bas" ) + + + +#==================================== +# CREATION MAILLAGE +#==================================== + + +#================================================= +# Definir les groupes d elements pour le maillage +#================================================= + +# On definit 3 groupes de mailles + +# groupe d edges (arretes) + +Edge_grp = doc.addEdgeGroup("Edge_grp") +Nbr_Edg = doc.countEdge() +#print Nbr_Edg +for i in range(Nbr_Edg): + Edge_i = doc.getEdge(i) + Edge_grp.addElement(Edge_i) + + +# groupe de quads (faces) +Quad_grp = doc.addQuadGroup("Quad_grp") +Nbr_Qad = doc.countQuad() +#print Nbr_Qad +for i in range(Nbr_Qad): + Quad_i = doc.getQuad(i) + Quad_grp.addElement(Quad_i) + +# groupe d hexas (solids) +Hexa_grp = doc.addHexaGroup("Hexa_grp") +Nbr_Hex = doc.countHexa() +#print Nbr_Hex +for i in range(Nbr_Hex): + Hexa_i = doc.getHexa(i) + Hexa_grp.addElement(Hexa_i) + + + +# groupe de noeuds de vertex pour tout le modele +Vertex_Nod_Grp = doc.addVertexNodeGroup("Vertex_Nod_Grp") +Nbr_Vx = doc.countVertex() +#print Nbr_Vx + +for i in range(Nbr_Vx): + Vertex_i = doc.getVertex(i) + Vertex_Nod_Grp.addElement(Vertex_i) + +#==================================== +# Definir une loi de discretisation +#==================================== +# definir une loi: le choix de la loi reste aux utilisateurs +Law = doc.addLaw( "Uniform" , 4 ) + +#n = doc.countLaw() +#print n + +# chercher les propagations du modele +N_Propa = doc.countPropagation() + +for j in range(N_Propa): + Propa = doc.getPropagation(j) + Propa.setLaw( Law )# appliquer la loi de discretisation sur tout le modele et generer le maillage + +#==================================== +# G�n�rer des maillages +#==================================== + +print " --- MAILLAGE HEXAHEDRIQUE --- " +mesh_hexas = hexablock.mesh(doc, "Bielle:hexas") + +print "Nombre d hexaedres:" , mesh_hexas.NbHexas() +print "Nombre de quadrangles:", mesh_hexas.NbQuadrangles() +print "Nombre de segments:" , mesh_hexas.NbEdges() +print "Nombre de noeuds:" , mesh_hexas.NbNodes() + +print " --- MAILLAGE QUADRANGULAIRE --- " +mesh_quads = hexablock.mesh(doc, "Bielle:quads", 2) + +print "Nombre d hexaedres:" , mesh_quads.NbHexas() +print "Nombre de quadrangles:", mesh_quads.NbQuadrangles() +print "Nombre de segments:" , mesh_quads.NbEdges() +print "Nombre de noeuds:" , mesh_quads.NbNodes() + +print " --- MAILLAGE 1D --- " +mesh_edges = hexablock.mesh(doc, "Bielle:edges", 1) + +print "Nombre d hexaedres:" , mesh_edges.NbHexas() +print "Nombre de quadrangles:", mesh_edges.NbQuadrangles() +print "Nombre de segments:" , mesh_edges.NbEdges() +print "Nombre de noeuds:" , mesh_edges.NbNodes() + +print " --- MAILLAGE des sommets --- " +mesh_nodes = hexablock.mesh(doc, "Bielle:nodes", 0) + +print "Nombre d hexaedres:" , mesh_nodes.NbHexas() +print "Nombre de quadrangles:", mesh_nodes.NbQuadrangles() +print "Nombre de segments:" , mesh_nodes.NbEdges() +print "Nombre de noeuds:" , mesh_nodes.NbNodes() +xaedres:" , mesh_edges.NbHexas() +print "Nombre de quadrangles:", mesh_edges.NbQuadrangles() +print "Nombre de segments:" diff --git a/doc/pyplots/bielle.py b/doc/pyplots/bielle.py new file mode 100644 index 0000000..6148cbd --- /dev/null +++ b/doc/pyplots/bielle.py @@ -0,0 +1,630 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import os +import GEOM +import geompy +import smesh +import hexablock +import math +import SALOMEDS + + +STEP_PATH = os.path.expandvars("$HEXABLOCK_ROOT_DIR/bin/salome/crank.stp") + + +#============================= +# CREATION DOCUMENT +#============================= + +doc = hexablock.addDocument("Bielle:hexas") + +#============================= +# MODEL CREATION +#============================= + +# For the connecting rod, two cylindrical grids have to be build and +# the quadrangles have to be prismed between these wo grids + +#============================= +# PARAMETRES +#============================= + +#R = 40.0 +R = 0.095168291790720005 + +r_pte = R +r_pte_t = R/2.0 + +xpetit = 0.0 +xgrand = 1.35739 + 0.1595 +longueur = (xgrand - xpetit)/2.0 +hauteur = 0.019999999553*2 + +dr_pte = R +da_pte = 360 +dl_pte = hauteur + +nr_pte = 1 +na_pte = 6 +nl_pte = 1 + + +#============================= +# Vectors Creation +#============================= + +dx = doc.addVector(longueur, 0, 0) +dy = doc.addVector(0, longueur, 0) +dz = doc.addVector(0, 0, longueur) + +#================================================= +# Creation of cylindrical grid centers +#================================================= + +c_pte = doc.addVertex(xpetit, 0, 0) +c_grd = doc.addVertex(2*longueur, 0, 0) +dx_prime = doc.addVectorVertices(c_pte, c_grd) + +#================================================= +# small cylindrical grid creation +#================================================= + +grille_cyl_pte = doc.makeCylindrical(c_pte, dx, dz, dr_pte, da_pte, dl_pte, nr_pte, na_pte, nl_pte, False) + +# We obtain a liste containing 6 equal hexaedra +# 30 = pi/6 +# 60 = pi/3 +# 45 = pi/4 +# 90 = pi/2 +# 180 = pi + +alpha_x = 2*R*math.cos(math.pi/3) +alpha_y = 2*R*math.sin(math.pi/3) + +x1 = doc.findVertex(2*R, 0, hauteur) +x2 = doc.findVertex(alpha_x, alpha_y, 0) +x3 = doc.findVertex(alpha_x, -alpha_y, 0) +x4 = doc.findVertex(2*R, 0, 0) + +quad_11 = doc.findQuad(x1, x2) +quad_12 = doc.findQuad(x1, x3) + +#================================= +# Small cylindrical grid creation +#================================= + +grille_cyl_grd = doc.makeTranslation(grille_cyl_pte, dx_prime) + +# We obtain a liste containing 6 equal hexaedra +y1 = doc.findVertex(2*longueur - 2*R, 0 , hauteur) +y2 = doc.findVertex(2*longueur - alpha_x, alpha_y, 0) +y3 = doc.findVertex(2*longueur - alpha_x, -alpha_y, 0) +y4 = doc.findVertex(2*longueur - 2*R, 0, 0) + +quad_21 = doc.findQuad(y1, y2) +quad_22 = doc.findQuad(y1, y3) + +#================================== +# Joining the two cylindrical grids +#================================== +model_biell_fin = doc.joinQuads([quad_11, quad_12], quad_21, x1, y1, x4, y4, 1) + +#======================================================= +# Recover vertices of the hexa model for the association +#======================================================= + +# NB: +# h = top (haut) +# b = bottom (bas) +# g = big (grand) +# p = small (petit) +# t = hole (trou) + +bielle_geom = geompy.ImportFile(STEP_PATH, "STEP") + +geompy.addToStudy(bielle_geom, "bielle_geom") + +pt_a = geompy.MakeVertex(0, 0, hauteur/2.) +face_haut = geompy.GetFaceNearPoint(bielle_geom, pt_a) + +pt_b = geompy.MakeVertex(0, 0, -hauteur/2.) +face_bas = geompy.GetFaceNearPoint(bielle_geom, pt_b) + +edge_haut_droite = geompy.GetEdgesByLength(face_haut, 0.136, 0.137) +edge_haut_gauche = geompy.GetEdgesByLength(face_haut, 0.131, 0.132) + +# Param�tres pour : +# - r�cup�ration des points. +# - et associations. + +u_1 = 1.0 +u_3 = 0.0 + +# dictionnaire des vertices de la g�om�trie (grande et petite grilles) : +# key = nom, value = indice dans geom_vert_grd (resp. geom_vert_pte) +# on commence par les vertex externes du haut du grand (resp. petit) cylindre, +# ensuite : +# 1. vertex internes (trou), +# 2. puis vertex du bas (externes puis internes) +dic_vert_names = {} +ind = 0 +for z in ['h', 'b']: # haut/bas + for x in ['e', 't']: # externe/interne(trou) + for y in ['y', 'x', 'u', 'v', 'w', 'z']: # + key = '_'.join([y, z, x]) + dic_vert_names[key] = ind + ind += 1 + pass + pass + pass + + +# 1. grand cylindre : +geom_vert_grd = [] # liste des vertex du grand cylindre + +# 1.1 face du haut : +# 1.1.1 sommets externes : +# la cr�ation des vertex de la geometrie se fait obligatoirement +# dans cet ordre : +geom_vert_grd.append(geompy.MakeVertexOnSurface(face_haut, 1, 0.5)) # y_h_e_g +edge_haut_grd = geompy.GetEdgeNearPoint(bielle_geom, geom_vert_grd[0]) +geom_vert_grd.append(geompy.MakeVertexOnCurve(edge_haut_grd, u_3)) # x_h_e_g +geom_vert_grd.append(geompy.MakeVertexOnCurve(edge_haut_grd, u_1)) # z_h_e_g +geom_vert_grd.insert(2, geompy.MakeVertexOnCurve(edge_haut_droite, 1)) # u_h_e_g +geom_vert_grd.insert(3, geompy.MakeVertexOnCurve(edge_haut_gauche, 0)) # w_h_e_g +edge_v_grd = geompy.MakeLineTwoPnt(geom_vert_grd[2], geom_vert_grd[3]) +geom_vert_grd.insert(3, geompy.MakeVertexOnCurve(edge_v_grd, 0.5)) # v_h_e_g +# les vertex sont rang�s dans cet ordre : +# y_h_e_g, x_h_e_g, u_h_e_g, v_h_e_g, w_h_e_g, z_h_e_g + +# 1.1.2 sommets internes (trou) : +edge_haut_grd_trou = geompy.GetEdgesByLength(face_haut, 0.147, 0.148) +# y_h_t_g, x_h_t_g, u_h_t_g, v_h_t_g, w_h_t_g, z_h_t_g +for val in [0, 0.8, 0.6, 0.5, 0.4, 0.2]: + geom_vert_grd.append(geompy.MakeVertexOnCurve(edge_haut_grd_trou, val)) + +# 1.2 face du bas : +# pour tous les vertex de la face du bas, on les cr�e par r�f�rence � ceux d�j� cr�es (dans le meme ordre : +# sommets externes puis internes) : +geom_vert_grd_bas = [geompy.MakeVertexWithRef(vertex, 0.0, 0.0, -hauteur) for vertex in geom_vert_grd] +geom_vert_grd.extend(geom_vert_grd_bas) + +# pour l'utilisation : +# geom_vert_grd[dic_vert_names["y_h_t"]] # par exemple + +# 2. petit cylindre : +# REM : le modele grand cylindre a ete cree par translation / au petit +# cylindre. Les vertices de la geometrie sont donc ete cr�es de mani�re +# similaire +geom_vert_pte = [] + +# 2.1 face du haut : +# 2.1.1 sommets externes : + +# la cr�ation des vertex de la geometrie se fait obligatoirement +# dans cet ordre : +geom_vert_pte.append(geompy.MakeVertexOnSurface(face_haut, 0, 0.5)) # v_h_e_p +edge_haut_pte = geompy.GetEdgeNearPoint(bielle_geom, geom_vert_pte[0]) +geom_vert_pte.append(geompy.MakeVertexOnCurve(edge_haut_pte, u_3)) # w_h_e_p +geom_vert_pte.insert(0, geompy.MakeVertexOnCurve(edge_haut_pte, u_1)) # u_h_e_p +geom_vert_pte.insert(0, geompy.MakeVertexOnCurve(edge_haut_droite, 0)) # x_h_e_p +geom_vert_pte.append(geompy.MakeVertexOnCurve(edge_haut_gauche, 1)) # z_h_e_p +edge_v_pte = geompy.MakeLineTwoPnt(geom_vert_pte[0], geom_vert_pte[4]) +geom_vert_pte.insert(0, geompy.MakeVertexOnCurve(edge_v_pte, 0.5)) # y_h_e_p +# les vertex sont rang�s dans cet ordre : +# y_h_e_p, x_h_e_p, u_h_e_p, v_h_e_p, w_h_e_p, z_h_e_p + + +# 2.1.2 sommets internes (trou) : +edge_haut_pte_trou = geompy.GetEdgesByLength(face_haut, 0.094, 0.095) +# y_h_t_p, x_h_t_p, u_h_t_p, v_h_t_p, w_h_t_p, z_h_t_p +for val in [0, 0.9, 0.65, 0.5, 0.35, 0.1]: + geom_vert_pte.append(geompy.MakeVertexOnCurve(edge_haut_pte_trou, val)) + +# 2.2 face du bas : +# pour tous les vertex de la face du bas, on les cr�e par r�f�rence � ceux d�j� cr�es (dans le meme ordre : +# sommets externes puis internes) : +geom_vert_pte_bas = [geompy.MakeVertexWithRef(vertex, 0.0, 0.0, -hauteur) for vertex in geom_vert_pte] +geom_vert_pte.extend(geom_vert_pte_bas) + + +#======================= +# CREATION ASSOCIATION +#======================= + +# pour l'association, il suffit de faire 6 appels � la m�thode +# associateClosedLine() : +# 1 pour la ligne du trou haut du grand cylindre +# 1 pour la ligne du trou bas du grand cylindre +# 1 pour la ligne du trou haut du petit cylindre +# 1 pour la ligne du trou bas du petit cylindre +# 1 pour la ligne "externe" de la bielle, en haut +# 1 pour la ligne "externe" de la bielle, en bas + +all_edges_bielle = geompy.SubShapeAllSorted(bielle_geom, geompy.ShapeType["EDGE"]) + +# dictionnaire des edges de la g�om�trie : +# key = nom, value = indice dans all_edges_bielle +dic_edge_names = {"edge_ray_pte_b": 0, "edge_ray_pte_h": 1, + "edge_trou_pte_b": 2, "edge_trou_pte_h" :3, + "edge_arr_pte_g_b": 7, "edge_arr_pte_g_h": 8, + "edge_arr_pte_d_b": 9, "edge_arr_pte_d_h": 10, + "edge_arr_grd_g_b": 19, "edge_arr_grd_g_h": 20, + "edge_arr_grd_d_b": 21, "edge_arr_grd_d_h": 22, + "edge_trou_grd_b": 25, "edge_trou_grd_h": 26, + "edge_ray_grd_b": 27, "edge_ray_grd_h": 28, + "edge_long_g_b": 13, "edge_long_g_h": 14, + "edge_long_d_b": 15, "edge_long_d_h": 16 + } + +# 1. ligne du trou haut du petit cylindre +# ======================================= + +# modele de blocs : +mod_start = grille_cyl_pte.getEdgeJ(0, 0, 1) +mod_first = mod_start.getVertex(1) +# table des edges : +mod_line = [grille_cyl_pte.getEdgeJ(0, j, 1) for j in range(1, 6)] + +# geometrie : +e_t_p_h = all_edges_bielle[dic_edge_names["edge_trou_pte_h"]] +li_vert = geom_vert_pte[dic_vert_names['x_h_t']:dic_vert_names['z_h_t']+1] +li_vert.reverse() # z_h_t_p, w_h_t_p, v_h_t_p, u_h_t_p, x_h_t_p +part_trou_pte_haut = geompy.MakePartition([e_t_p_h], + li_vert, + [], [], geompy.ShapeType["EDGE"], 0, [], 0) +all_edge_part_trou_pte_haut = geompy.SubShapeAllSorted(part_trou_pte_haut, geompy.ShapeType["EDGE"]) + +geo_start = all_edge_part_trou_pte_haut[5] # [y_h_t_p; x_h_t_p] +par_start = 0.0 +geo_line = [all_edge_part_trou_pte_haut[i] for i in [3, 1, 0, 2, 4]] + +# association : +ier = doc.associateClosedLine(mod_first, mod_start, mod_line, + geo_start, par_start, geo_line) + +# 2. ligne du trou bas du petit cylindre +# ======================================= + +# modele de blocs : +mod_start = grille_cyl_pte.getEdgeJ(0, 0, 0) +mod_first = mod_start.getVertex(1) +del(mod_line[:]) +# table des edges : +mod_line = [grille_cyl_pte.getEdgeJ(0, j, 0) for j in range(1, 6)] + +# geometrie : +e_t_p_b = all_edges_bielle[dic_edge_names["edge_trou_pte_b"]] +del(li_vert[:]) +li_vert = geom_vert_pte[dic_vert_names['x_b_t']:dic_vert_names['z_b_t']+1] +li_vert.reverse() # z_b_t_p, w_b_t_p, v_b_t_p, u_b_t_p, x_b_t_p +part_trou_pte_bas = geompy.MakePartition([e_t_p_b], + li_vert, + [], [], geompy.ShapeType["EDGE"], 0, [], 0) +all_edge_part_trou_pte_bas = geompy.SubShapeAllSorted(part_trou_pte_bas, geompy.ShapeType["EDGE"]) + +geo_start = all_edge_part_trou_pte_bas[5] +par_start = 0.0 +del(geo_line[:]) +geo_line = [all_edge_part_trou_pte_bas[i] for i in [3, 1, 0, 2, 4]] + +# association : +ier = doc.associateClosedLine(mod_first, mod_start, mod_line, + geo_start, par_start, geo_line) + +# 3. ligne du trou haut du grand cylindre +# ======================================= + +# modele de blocs : +mod_start = grille_cyl_grd.getEdgeJ(0, 0, 1) # 1er edge +mod_first = mod_start.getVertex(1) # 1er vertex +# table des edges : +del(mod_line[:]) +mod_line = [grille_cyl_grd.getEdgeJ(0, j, 1) for j in range(1, 6)] + +# geometrie : +e_t_g_h = all_edges_bielle[dic_edge_names["edge_trou_grd_h"]] +del(li_vert[:]) +li_vert = geom_vert_grd[dic_vert_names['x_h_t']:dic_vert_names['z_h_t']+1] +li_vert.reverse() # z_h_t_g, w_h_t_g, v_h_t_g, u_h_t_g, x_h_t_g +part_trou_grd_haut = geompy.MakePartition([e_t_g_h], + li_vert, + [], [], geompy.ShapeType["EDGE"], 0, [], 0) +all_edge_part_trou_grd_haut = geompy.SubShapeAllSorted(part_trou_grd_haut, geompy.ShapeType["EDGE"]) + +geo_start = all_edge_part_trou_grd_haut[5] # [y_h_t_g; x_h_t_g] +par_start = 0.0 # param 1ere ligne +del(geo_line[:]) +geo_line = [all_edge_part_trou_grd_haut[i] for i in [3, 1, 0, 2, 4]] + +# association : +ier = doc.associateClosedLine(mod_first, mod_start, mod_line, + geo_start, par_start, geo_line) + +# 4. ligne du trou bas du grand cylindre +# ======================================= + +# modele de blocs : +mod_start = grille_cyl_grd.getEdgeJ(0, 0, 0) +mod_first = mod_start.getVertex(1) +del(mod_line[:]) +# table des edges : +mod_line = [grille_cyl_grd.getEdgeJ(0, j, 0) for j in range(1, 6)] + +# geometrie : +e_t_g_b = all_edges_bielle[dic_edge_names["edge_trou_grd_b"]] +del(li_vert[:]) +li_vert = geom_vert_grd[dic_vert_names['x_b_t']:dic_vert_names['z_b_t']+1] +li_vert.reverse() # z_b_t_g, w_b_t_g, v_b_t_g, u_b_t_g, x_b_t_g +part_trou_grd_bas = geompy.MakePartition([e_t_g_b], + li_vert, + [], [], geompy.ShapeType["EDGE"], 0, [], 0) +all_edge_part_trou_grd_bas = geompy.SubShapeAllSorted(part_trou_grd_bas, geompy.ShapeType["EDGE"]) + +geo_start = all_edge_part_trou_grd_bas[5] +par_start = 0.0 # entre 0 et 1 (abscisse curviligne) +del(geo_line[:]) +geo_line = [all_edge_part_trou_grd_bas[i] for i in [3, 1, 0, 2, 4]] + +# association : +ier = doc.associateClosedLine(mod_first, mod_start, mod_line, + geo_start, par_start, geo_line) + +# 5 : Les lignes "externes" de la bielle +# 5. ligne "externe" de la bielle, en haut +# ======================================== + +mod_start = grille_cyl_grd.getEdgeJ(1, 1, 1) +mod_first = mod_start.getVertex(1) +del(mod_line[:]) +mod_line = [grille_cyl_grd.getEdgeJ(1, j, 1) for j in [4, 5, 0]] +mod_line.extend([grille_cyl_pte.getEdgeJ(1, j, 1) for j in [1, 2, 3, 4]]) +v1 = grille_cyl_grd.getVertexIJK(1, 2, 1) +v2 = grille_cyl_pte.getVertexIJK(1, 1, 1) +mod_line.append(doc.findEdge(v1, v2)) +v1 = grille_cyl_grd.getVertexIJK(1, 4, 1) +v2 = grille_cyl_pte.getVertexIJK(1, 5, 1) +mod_line.append(doc.findEdge(v1, v2)) + +# geometrie : +# les edges de la geometrie a prendre en compte sont : +# (en partant du grand cylindre) +# edge_arr_grd_d_h, edge_ray_grd_h, edge_arr_grd_g_h, edge_long_g_h, +# edge_arr_pte_g_h, edge_ray_pte_h, edge_arr_pte_d_h, edge_long_d_h + +geo_start = all_edges_bielle[dic_edge_names["edge_arr_grd_d_h"]] +par_start = 0.0 + +e_r_g_h = all_edges_bielle[dic_edge_names["edge_ray_grd_h"]] +# x_h_e_g, y_h_e_g, z_h_e_g : +del(li_vert[:]) +li_vert.append(geom_vert_grd[dic_vert_names['x_h_e']]) +li_vert.append(geom_vert_grd[dic_vert_names['y_h_e']]) +li_vert.append(geom_vert_grd[dic_vert_names['z_h_e']]) +part_ray_grd_haut = geompy.MakePartition([e_r_g_h], + li_vert, + [], [], geompy.ShapeType["EDGE"], 0, [], 0) +all_edge_part_ray_grd_haut = geompy.SubShapeAllSorted(part_ray_grd_haut, geompy.ShapeType["EDGE"]) + +del(geo_line[:]) +all_edge_part_ray_grd_haut.reverse() +geo_line = all_edge_part_ray_grd_haut[:] +geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_grd_g_h"]]) +geo_line.append(all_edges_bielle[dic_edge_names["edge_long_g_h"]]) +geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_pte_g_h"]]) + +e_r_p_h = all_edges_bielle[dic_edge_names["edge_ray_pte_h"]] +# w_h_e_p, v_h_e_p, u_h_e_p : +del(li_vert[:]) +li_vert.append(geom_vert_pte[dic_vert_names['w_h_e']]) +# JPL (le 09/05/2011) : +# normalement, on devrait pouvoir utiliser ici le vertex v_h_e_p pour +# faire la partition de l'edge, mais ca ne fonctionne pas... +# on cree donc un vertex supplementaire : +## li_vert.append(geom_vert_pte[dic_vert_names['v_h_e']]) +v_h_e_p_bis = geompy.MakeVertexOnCurve(e_r_p_h, 0.5) +li_vert.append(v_h_e_p_bis) +li_vert.append(geom_vert_pte[dic_vert_names['u_h_e']]) +part_ray_pte_haut = geompy.MakePartition([e_r_p_h], + li_vert, + [], [], geompy.ShapeType["EDGE"], 0, [], 0) +all_edge_part_ray_pte_haut = geompy.SubShapeAllSorted(part_ray_pte_haut, geompy.ShapeType["EDGE"]) + +all_edge_part_ray_pte_haut.reverse() +geo_line.extend(all_edge_part_ray_pte_haut[:]) +geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_pte_d_h"]]) +geo_line.append(all_edges_bielle[dic_edge_names["edge_long_d_h"]]) + +# association : +ier = doc.associateClosedLine(mod_first, mod_start, mod_line, + geo_start, par_start, geo_line) + +# 6. ligne "externe" de la bielle, en bas +# ======================================== + +mod_start = grille_cyl_grd.getEdgeJ(1, 1, 0) +mod_first = mod_start.getVertex(1) +del(mod_line[:]) +mod_line = [grille_cyl_grd.getEdgeJ(1, j, 0) for j in [4, 5, 0]] +mod_line.extend([grille_cyl_pte.getEdgeJ(1, j, 0) for j in [1, 2, 3, 4]]) +v1 = grille_cyl_grd.getVertexIJK(1, 2, 0) +v2 = grille_cyl_pte.getVertexIJK(1, 1, 0) +mod_line.append(doc.findEdge(v1, v2)) +v1 = grille_cyl_grd.getVertexIJK(1, 4, 0) +v2 = grille_cyl_pte.getVertexIJK(1, 5, 0) +mod_line.append(doc.findEdge(v1, v2)) + +# geometrie : +# les edges de la geometrie a prendre en compte sont : +# (en partant du grand cylindre) +# edge_arr_grd_d_h, edge_ray_grd_h, edge_arr_grd_g_h, edge_long_g_h, +# edge_arr_pte_g_h, edge_ray_pte_h, edge_arr_pte_d_h, edge_long_d_h + +geo_start = all_edges_bielle[dic_edge_names["edge_arr_grd_d_b"]] +par_start = 0.0 + +e_r_g_b = all_edges_bielle[dic_edge_names["edge_ray_grd_b"]] +# x_b_e_g, y_b_e_g, z_b_e_g : +del(li_vert[:]) +li_vert.append(geom_vert_grd[dic_vert_names['x_b_e']]) +li_vert.append(geom_vert_grd[dic_vert_names['y_b_e']]) +li_vert.append(geom_vert_grd[dic_vert_names['z_b_e']]) +part_ray_grd_bas = geompy.MakePartition([e_r_g_b], + li_vert, + [], [], geompy.ShapeType["EDGE"], 0, [], 0) +all_edge_part_ray_grd_bas = geompy.SubShapeAllSorted(part_ray_grd_bas, geompy.ShapeType["EDGE"]) + +del(geo_line[:]) +all_edge_part_ray_grd_bas.reverse() +geo_line = all_edge_part_ray_grd_bas[:] +geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_grd_g_b"]]) +geo_line.append(all_edges_bielle[dic_edge_names["edge_long_g_b"]]) +geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_pte_g_b"]]) + +e_r_p_b = all_edges_bielle[dic_edge_names["edge_ray_pte_b"]] +# w_h_e_p, v_h_e_p, u_h_e_p : +del(li_vert[:]) +li_vert.append(geom_vert_pte[dic_vert_names['w_b_e']]) +# JPL (le 09/05/2011) : +# normalement, on devrait pouvoir utiliser ici le vertex v_h_e_p pour +# faire la partition de l'edge, mais ca ne fonctionne pas... +# on cree donc un vertex supplementaire : +## li_vert.append(geom_vert_pte[dic_vert_names['v_b_e']]) +v_b_e_p_bis = geompy.MakeVertexOnCurve(e_r_p_b, 0.5) +li_vert.append(v_b_e_p_bis) +li_vert.append(geom_vert_pte[dic_vert_names['u_b_e']]) +part_ray_pte_bas = geompy.MakePartition([e_r_p_b], + li_vert, + [], [], geompy.ShapeType["EDGE"], 0, [], 0) +all_edge_part_ray_pte_bas = geompy.SubShapeAllSorted(part_ray_pte_bas, geompy.ShapeType["EDGE"]) + +all_edge_part_ray_pte_bas.reverse() +geo_line.extend(all_edge_part_ray_pte_bas[:]) +geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_pte_d_b"]]) +geo_line.append(all_edges_bielle[dic_edge_names["edge_long_d_b"]]) + +# association : +ier = doc.associateClosedLine(mod_first, mod_start, mod_line, + geo_start, par_start, geo_line) + +for nz in range (2): + v1 = grille_cyl_grd.getVertexIJK(1, 3, nz) + v2 = grille_cyl_grd.getVertexIJK(0, 3, nz) + v3 = grille_cyl_grd.getVertexIJK(0, 0, nz) + v4 = grille_cyl_grd.getVertexIJK(1, 0, nz) + + v1.setX(v2.getX() + v3.getX() - v4.getX()) + v1.setY(v4.getY()) + v1.setZ(v4.getZ()) + v1.setScalar(7) + +## print "Coord en x (grd) : ", v1.getX(), v2.getX(), v3.getX(), v4.getX() +## print "Coord en y (grd) : ", v1.getY(), v2.getY(), v3.getY(), v4.getY() +## print "Coord en z (grd) : ", v1.getZ(), v2.getZ(), v3.getZ(), v4.getZ() +## print + + v1 = grille_cyl_pte.getVertexIJK(1, 3, nz) + v2 = grille_cyl_pte.getVertexIJK(0, 3, nz) + v3 = grille_cyl_pte.getVertexIJK(0, 0, nz) + v4 = grille_cyl_pte.getVertexIJK(1, 0, nz) + + v4.setX(v3.getX() + v2.getX() - v1.getX()) + v4.setY(v1.getY()) + v4.setZ(v1.getZ()) + +## print "Coord en x (pte) : ", v1.getX(), v2.getX(), v3.getX(), v4.getX() +## print "Coord en y (pte) : ", v1.getY(), v2.getY(), v3.getY(), v4.getY() +## print "Coord en z (pte) : ", v1.getZ(), v2.getZ(), v3.getZ(), v4.getZ() +## print + +# TEST : +file_name = os.path.join(os.environ['TMP'], 'bielle2.vtk') +doc.saveVtk(file_name) + +## #================================================= +## # VERTEX, EDGES, FACES DANS L'ARBRE D'ETUDE SALOME +## #================================================= + +# vertices : +for key, value in dic_vert_names.iteritems(): + geompy.addToStudy(geom_vert_grd[value], key + '_g') + geompy.addToStudy(geom_vert_pte[value], key + '_p') + +# edges : +for key, value in dic_edge_names.iteritems(): + geompy.addToStudy(all_edges_bielle[value], key) + +#==================================== +# CREATION MAILLAGE +#==================================== + + +#================================================= +# Definir les groupes d elements pour le maillage +#================================================= + +# On definit 3 groupes de mailles + +# JPL (le 09/05/2011) : +# @todo a revoir : apres correction des bugs "countXXX()" dans le moteur + +# groupe d edges (arretes) +edge_grp = doc.addEdgeGroup("Edge_grp") +for i in range(doc.countEdge()): + edge_grp.addElement(doc.getEdge(i)) + +# groupe de quads (faces) +quad_grp = doc.addQuadGroup("Quad_grp") +for i in range(doc.countQuad()): + quad_grp.addElement(doc.getQuad(i)) + +# groupe d hexas (solids) +hexa_grp = doc.addHexaGroup("Hexa_grp") +for i in range(doc.countHexa()): + hexa_grp.addElement(doc.getHexa(i)) + +# groupe de noeuds de vertex pour tout le modele +vertex_nod_grp = doc.addVertexNodeGroup("Vertex_Nod_Grp") +for i in range(doc.countVertex()): + vertex_nod_grp.addElement(doc.getVertex(i)) + +#==================================== +# Definir une loi de discretisation +#==================================== +# definir une loi: le choix de la loi reste aux utilisateurs +law = doc.addLaw("Uniform", 4) + +# chercher les propagations du modele +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) # appliquer la loi de discretisation sur tout le modele et generer le maillage + +#==================================== +# G�n�rer des maillages +#==================================== + +print " --- MAILLAGE HEXAHEDRIQUE --- " +mesh_hexas = hexablock.mesh(doc) + +## print "Nombre d hexaedres:", mesh_hexas.NbHexas() +## print "Nombre de quadrangles:", mesh_hexas.NbQuadrangles() +## print "Nombre de segments:", mesh_hexas.NbEdges() +## print "Nombre de noeuds:", mesh_hexas.NbNodes() diff --git a/doc/pyplots/bielle_JPL.py b/doc/pyplots/bielle_JPL.py new file mode 100644 index 0000000..1b0e541 --- /dev/null +++ b/doc/pyplots/bielle_JPL.py @@ -0,0 +1,364 @@ +#!/usr/bin/python +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#=============================================== +# By Karima DEBCHI YATAGHENE Nov 2009 at CS +# modifié par JPL le 19 avril 2010 +# (reprise de BIELLE.last.test.py) +#=============================================== + +# @todo idée à terme : ne pas avoir à faire "a la mano" l'association de TOUS les vertex du modèle, mais faire +# en sorte qu'un certain nombre d'associations soient faites automatiquement. +# typiquement, pour une grille cylindrique (ex de 12 vertex comme celles du script) : +# 4 points doivent etre obligatoirement associés à la main +# les 8 autres devraient pouvoir l'etre automatiquement +# +# pour cela, il serait utile de pouvoir récupérer les propriétés de la grille cylindrique (qui ne sont pour le moment +# pas conservées toutes conservées dans le moteur HEXA, ou en tout cas pas toutes accessibles avec l'API python) + +import GEOM +import geompy +import smesh +import HexaBlocks +import math +import SALOMEDS + +def get_vertices_from_cylindrical(grille_cyl, nr, na, nl=1): + """ + fonction qui prend en entrée une liste d'hexaèdres renvoyés par makeCylindrical, dans le cas FALSE uniquement + (ie : pas de remplissage de la partie centrale) + => du type grid_type + + renvoie une liste de sommets, dans cet ordre : + + pour la grande grille cylindrique, la liste est constituée, dans l'ordre : + 1) des vertex de la face du haut (k = 1) => na * 2 + a) vertex externes (i = 1) => na + b) vertex internes (i = 0) => na + 2) des vertex de la face du bas (k = 0) => na * 2 + a) vertex externes (i = 1) => na + b) vertex internes (i = 0) => na + + @todo makeCylindrical renvoie une grille cylindrique + ie : une liste d'hexaèdres + pbmes : + 1) une fois la grille cylindrique crée, elle est renvoyée sous forme d'un tableau d'hexaèdres + dans un certain ordre (cf. SPECS 2.3.6), mais pas sous forme d'objet "grille cylindrique" + => cette fonction ne pourra pas à terme etre intégrée sous forme de méthode. + 2) impossible de faire des tests sur le cylindre (vide ou pas, récupération directe de nr, na, nl, ...) + """ + + # dans cette première version, on considère une grille cylindrique avec nr = 1 et nl = 1 + if (nr !=1) or (nl != 1): + print "nr ou nl invalide(s) !!" + return None + + vertices = [] + li_z = [nl, 0] # indice nl => face du haut, indice 0 => face du bas + li_x = [nr, 0] # indice nr => externe, indice 0 => interne + li_y = range(na) # indices de 0 à (na-1) + for k in li_z: # suivant z + for i in li_x: # suivant x + for j in li_y: # suivant y + vertices.append(grille_cyl.getVertexIJK(i , j , k)) + + return vertices + +def set_association_from_cylindrical(model_vertices, geom_vertices): + """ + réalise l'association entre : + 1) les sommets issus d'une grille cylindrique (résultat de l'appel à get_vertices_from_cylindrical()) + 2) les sommets de la geometrie + + l'association est faite dans l'ordre des vertex de la liste du modèle ie : + 1) les sommets externes de la face du haut + 2) les sommets internes de la face du haut + 3) les sommets externes de la face du bas + 4) les sommets internes de la face du bas + """ + + for num, vertex in enumerate(model_vertices): + vertex.setAssociation(geom_vertices[num]) + + pass + +#============================= +# CREATION DOCUMENT +#============================= + +doc = HexaBlocks.addDocument() + +#============================= +# CREATION DU MODELE +#============================= + +# Pour la bielle on doit creer deux grilles cylindriques et prismer les quadrangles entre ces deux dernieres + +#============================= +# PARAMETRES +#============================= + +R = 40.0 + +r_grd = R +r_grd_t = R/2 + +r_pte = R +r_pte_t = R/2 + +l = 200.0 +h = 0.019999999553*2 +#h = 40. + +# Taille du grand cylindre +dr_grd = R +da_grd = 360 +dl_grd = h + +nr_grd = 1 +na_grd = 6 +nl_grd = 1 + +# Taille du petit cylindre +dr_pte = R +da_pte = 360 +dl_pte = h + +nr_pte = 1 +na_pte = 6 +nl_pte = 1 + + +#============================= +# Creation des vecteurs +#============================= + +dx = doc.addVector(l, 0, 0) +dy = doc.addVector(0, l, 0) +dz = doc.addVector(0, 0, l) + +#================================================= +# Creation des centres des grilles cylindriques +#================================================= + +c_grd = doc.addVertex(0, 0, 0) +c_pte = doc.addVertex(2*l, 0, 0) +dx_prime = doc.addVectorVertices( c_grd, c_pte ) + +#================================================= +# Creation de la grande grille cylindrique +#================================================= + +grille_cyl_grd = doc.makeCylindrical(c_grd, dx, dz, dr_grd, da_grd, dl_grd, nr_grd, na_grd, nl_grd, False) + +# on obtient une liste qui contient 6 hexaedres eguaux + +# 30 = pi/6 +# 60 = pi/3 +# 45 = pi/4 +# 90 = pi/2 +# 180 = pi + +alpha_x = 2*R*math.cos(math.pi/3) +alpha_y = 2*R*math.sin(math.pi/3) + +x1 = doc.findVertex( 2*R, 0, h ) +x2 = doc.findVertex( alpha_x, alpha_y, 0 ) +x3 = doc.findVertex( alpha_x, -alpha_y, 0 ) +x4 = doc.findVertex( 2*R, 0, 0 ) + +quad_11 = doc.findQuad(x1, x2) +quad_12 = doc.findQuad(x1, x3) + +quad_list = [ quad_11 , quad_12 ] + +#================================================= +# Creation de la petite grille cylindrique +#================================================= + +grille_cyl_pte = doc.makeTranslation(grille_cyl_grd, dx_prime ) + +# on obtient une liste qui contient 6 hexaedres eguaux + +y1 = doc.findVertex(2*l - 2*R , 0 , h) +y2 = doc.findVertex(2*l - alpha_x , alpha_y , 0) +y3 = doc.findVertex(2*l - alpha_x , -alpha_y , 0) +y4 = doc.findVertex(2*l - 2*R , 0 , 0) + +quad_21 = doc.findQuad(y1, y2) +quad_22 = doc.findQuad(y1, y3) + +#================================================= +# Assemblage des deux grilles cylindriques +#================================================= + +# a priori ne sert que pour créer bielle.vtk : normal ?? +model_biell_fin = doc.joinQuads(quad_list, quad_21, x1, y1, x4, y4, 1) + + +model_biell_fin.saveVtk("/tmp/bielle.vtk") +grille_cyl_pte.saveVtk("/tmp/grille_cyl_pte.vtk") +grille_cyl_grd.saveVtk("/tmp/grille_cyl_grd.vtk") + + +#=================================================================== +# Recuperation des vertex du modele hexa bielle pour l association +#=================================================================== + +# pour la grande grille cylindrique, la liste est constituée, dans l'ordre : +# 1) des vertex de la face du haut (k = 1) => 12 +# a) vertex externes (i = 1) => 6 +# b) vertex internes (i = 0) => 6 +# 2) des vertex de la face du bas (k = 0) => 12 +# a) vertex externes (i = 1) => 6 +# b) vertex internes (i = 0) => 6 + +mod_grd = get_vertices_from_cylindrical(grille_cyl_grd, nr_grd, na_grd, nl_grd) + +# pour la petite grille cylindrique, la liste est constituée, dans l'ordre : +# 1) des vertex de la face du haut (k = 1) => 12 +# a) vertex externes (i = 1) => 6 +# b) vertex internes (i = 0) => 6 +# 2) des vertex de la face du bas (k = 0) => 12 +# a) vertex externes (i = 1) => 6 +# b) vertex internes (i = 0) => 6 + +mod_pte = get_vertices_from_cylindrical(grille_cyl_pte, nr_pte, na_pte, nl_pte) + +#=================================================================== +# Recuperation des points de la geometrie bielle pour l association +#=================================================================== + +Bielle_geom = geompy.Import("/home/plumecoq/Karima/karima/hexa/cao_cea/crank.stp", "STEP") + +geompy.addToStudy(Bielle_geom, "Bielle_geom") + +Pt_A = geompy.MakeVertex(0, 0, h/2.) +Face_haut = geompy.GetFaceNearPoint(Bielle_geom, Pt_A) + +Pt_B = geompy.MakeVertex(0, 0, -h/2.) +Face_bas = geompy.GetFaceNearPoint(Bielle_geom, Pt_B) + +Edge_haut_droite = geompy.GetEdgesByLength(Face_haut, 0.136, 0.137) +Edge_haut_gauche = geompy.GetEdgesByLength(Face_haut, 0.131, 0.132) + +# 1. grand cylindre : +geom_vert_grd = [] +# 1.1 face du haut : +# 1.1.1 sommets externes : + +# pour l'instant, la création des vertex de la geometrie se fait obligatoirement +# dans cet ordre : +y_h_g = geompy.MakeVertexOnSurface(Face_haut, 1, 0.5) + +Edge_haut_grd = geompy.GetEdgeNearPoint(Bielle_geom, y_h_g) +x_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, 0) +z_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, 1) +u_h_g = geompy.MakeVertexOnCurve(Edge_haut_droite, 1) +w_h_g = geompy.MakeVertexOnCurve(Edge_haut_gauche, 0) + +Edge_v_grd = geompy.MakeLineTwoPnt(u_h_g, w_h_g) +v_h_g = geompy.MakeVertexOnCurve(Edge_v_grd, 0.5) + +geom_vert_grd.extend([y_h_g, x_h_g, z_h_g, u_h_g, w_h_g, v_h_g]) + +# 1.1.2 sommets internes : +Edge_haut_grd_trou = geompy.GetEdgesByLength(Face_haut, 0.147, 0.148) +y_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0) +z_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.2) +w_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.35) +v_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.5) +u_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.65) +x_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.8) + +geom_vert_grd.extend([y_h_g_t, x_h_g_t, z_h_g_t, u_h_g_t, w_h_g_t, v_h_g_t]) + +# 1.2 face du bas : +# pour tous les vertex de la face du bas, on les crée par référence à ceux déjà crées (dans le meme ordre : +# sommets externes puis internes) : +geom_vert_grd_bas = [geompy.MakeVertexWithRef(vertex, 0.0, 0.0, -h) for vertex in geom_vert_grd] +geom_vert_grd.extend(geom_vert_grd_bas) + + +print "nombre vertex grand cylindre geom = ", len(geom_vert_grd) + +# ajout des vertex de la géométrie à l'étude : +for num, vertex in enumerate(geom_vert_grd): +# print "ajout de v_grd"+str(num) + geompy.addToStudy(vertex, "v_grd"+str(num)) + +# association : +set_association_from_cylindrical(mod_grd, geom_vert_grd) + +# 2. petit cylindre : +geom_vert_pte = [] +# 2.1 face du haut : +# 2.1.1 sommets externes : + +# pour l'instant, la création des vertex de la geometrie se fait obligatoirement +# dans cet ordre : +v_h_p = geompy.MakeVertexOnSurface(Face_haut, 0, 0.5) + +Edge_haut_pte = geompy.GetEdgeNearPoint(Bielle_geom, v_h_p) +w_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, 0) +u_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, 1) +x_h_p = geompy.MakeVertexOnCurve(Edge_haut_droite, 0) +z_h_p = geompy.MakeVertexOnCurve(Edge_haut_gauche, 1) + +Edge_v_pte = geompy.MakeLineTwoPnt(x_h_p, z_h_p) +y_h_p = geompy.MakeVertexOnCurve(Edge_v_pte, 0.5) + +geom_vert_pte.extend([y_h_p, x_h_p, z_h_p, u_h_p, w_h_p, v_h_p]) + +# 2.1.2 sommets internes : +Edge_haut_pte_trou = geompy.GetEdgesByLength(Face_haut, 0.094, 0.095) +y_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0) +z_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.2) +w_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.35) +v_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.5) +u_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.65) +x_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.8) + +geom_vert_pte.extend([y_h_p_t, x_h_p_t, z_h_p_t, u_h_p_t, w_h_p_t, v_h_p_t]) + +# 2.2 face du bas : +# pour tous les vertex de la face du bas, on les crée par référence à ceux déjà crées (dans le meme ordre : +# sommets externes puis internes) : +geom_vert_pte_bas = [geompy.MakeVertexWithRef(vertex, 0.0, 0.0, -h) for vertex in geom_vert_pte] +geom_vert_pte.extend(geom_vert_pte_bas) + +print "nombre vertex petit cylindre geom = ", len(geom_vert_pte) + +# ajout des vertex de la géométrie à l'étude : +for num, vertex in enumerate(geom_vert_pte): +# print "ajout de v_pte"+str(num) + geompy.addToStudy(vertex, "v_pte"+str(num)) + +# association : +set_association_from_cylindrical(mod_pte, geom_vert_pte) + +le meme ordre : +# sommets externes puis internes) : +geom_vert_pte_bas = [geompy.MakeVertexWithRef(vertex, 0.0, 0.0, -h) for vertex in geom_vert_pte] +geom_vert_pte.extend(geom_vert_pte_bas) + +print "nombre vertex petit cylindre geom = ", len(geom_vert_pte) + +# ajout des vertex \ No newline at end of file diff --git a/doc/pyplots/bride.py b/doc/pyplots/bride.py new file mode 100644 index 0000000..a8a1c17 --- /dev/null +++ b/doc/pyplots/bride.py @@ -0,0 +1,410 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import os +import GEOM +import geompy +import smesh +import hexablock +import math +import SALOMEDS + +k1 = 1 + +OPT_QUAD_IK = 1 +OPT_FIRST = 2 + +count = 1 +def save_schema(doc): + """ + sauvegarde vtk du modele de bloc + """ + global count + file_name = os.path.join(os.environ['TMP'], 'bride' + str(count) + '.vtk') + doc.saveVtk(file_name) + count += 1 + pass + +def merge_quads(doc, quart, demi, ni1, nj1, ni2, nj2, option=0) : + """ + fusion des quadrangles entre les 2 grilles cylindriques : + """ + + prems = False + if option == OPT_FIRST: + prems = True + + quad_ik = False + if option == OPT_QUAD_IK: + quad_ik = True + + orig = None + if quad_ik: + orig = grille_cyl_quart.getQuadIK(ni1, nj1, k1) + else: + orig = grille_cyl_quart.getQuadJK(ni1, nj1, k1) + + dest = grille_cyl_demi.getQuadJK(ni2, nj2, k1) + + +# JPL le 10/05/2011 : +# closeQuads() n'est pas accessible en python +# a priori fonctionne avec mergeQuads() +## if prems: + if True: + iq1 = 0 + if quad_ik: + iq1 = 1 + iq3 = 1 - iq1 + v1 = dest.getVertex(iq1) + v3 = dest.getVertex(iq3) + + v2 = orig.getVertex(0) + v4 = orig.getVertex(1) + + doc.mergeQuads(dest, orig, v1, v2, v3, v4) + pass + else: +## doc.closeQuads(dest, orig) + print "closeQuads() : not yet implemented" + pass + + return None + +BREP_PATH = os.path.expandvars("$HEXABLOCK_ROOT_DIR/bin/salome/bride.brep") + +#============================= +# CREATION DOCUMENT +#============================= + +doc = hexablock.addDocument() + +#============================= +# PARAMETRES +#============================= + +height = 1.0 + +# cylinder grid 1 : +nr1 = 8 +na1 = 4 +nl1 = 5 +dr1 = 1.0 +da1 = 45.0 # angle +dl1 = height + +# cylinder grid 2 : +nr2 = 3 +na2 = 8 +nl2 = nl1 +dr2 = 0.5 +da2 = 180.0 # angle +dl2 = dl1 + +#============================= +# Creation du modele de blocs +#============================= + +# JPL (le 09/05/2011) +# repris de test_bride_abu.cxx (version la plus a jour dans ~/IHMHEXA/Alain/models): +# et de BRIDE.py (Karima) pour les "vraies" coordonn�es : + +#================================================= +# Creation des centres des grilles cylindriques +#================================================= + +center1 = doc.addVertex(0, 0, height) +center2 = doc.addVertex(6, 0, height) + +dx = doc.addVector(height, 0, 0) +dz = doc.addVector(0, 0, height) + +# Creation des grilles cylindriques initiales +#============================================ + +# 1. 1 ere grille (quart) : +#========================== + +# JPL (le 10/05/2011) : vu la geometrie, on ne remplit pas le centre : +## grille_cyl_quart = doc.makeCylindrical(orig1, dx, dz, dr_q, 45.0, dl, +## nr_q, na_q, dim_z, True) +grille_cyl_quart = doc.makeCylindrical(center1, dx, dz, dr1, da1, dl1, + nr1, na1, nl1, False) + + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +# Elagage : +for nk in range(2, nl1): + for nj in range(na1): + ideb = 2 + if nk == nl1 - 1: + ideb = 1 + for ni in range(ideb, nr1): + doc.removeHexa(grille_cyl_quart.getHexaIJK(ni, nj, nk)) + pass + pass + pass + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +# Semelle : +k0 = 0 +for nj in range(na1): + for ni in range(2, nr1): + doc.removeHexa(grille_cyl_quart.getHexaIJK(ni, nj, k0)) + pass + pass + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +# @todo JPL : peut-on fusionner les edges du haut des hexaedres du haut du deuxieme +# rang ? (cf. GEOM). Si oui revoir aussi l'association + +# 2. 2�me grille (demi) : +#======================== +grille_cyl_demi = doc.makeCylindrical(center2, dx, dz, dr2, da2, dl2, + nr2, na2, nl2, True) + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +ni0 = [0, nr2, 2, 1, 0] # en fonction de z (ie : nk) +for nk in range(0, nl2): + for nj in range(na2): # elagage suivant toute la demi-circonference + for ni in range(ni0[nk], nr2): + doc.removeHexa(grille_cyl_demi.getHexaIJK(ni, nj, nk)) + pass + pass + pass + + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +# 3. creusement des fondations de demi dans quart : +#================================================== +for nj in range(2): + for ni in range(3, nr1 - 1): + doc.removeHexa(grille_cyl_quart.getHexaIJK(ni, nj, k1)) + pass + pass + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +# 4. Fusion des bords : +#====================== +merge_quads(doc, grille_cyl_quart, grille_cyl_demi, 7, 0, nr2, 0, OPT_FIRST) +merge_quads(doc, grille_cyl_quart, grille_cyl_demi, 7, 1, nr2, 1) +for ni1 in range(2, 6): + merge_quads(doc, grille_cyl_quart, grille_cyl_demi, 8 - ni1, 2, nr2, ni1, OPT_QUAD_IK) + pass +merge_quads(doc, grille_cyl_quart, grille_cyl_demi, 3, 1, nr2, 6) +merge_quads(doc, grille_cyl_quart, grille_cyl_demi, 3, 0, nr2, 7) + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +########### +# Geometry +########### + +bride_geom = geompy.ImportFile(BREP_PATH, "BREP") + +geompy.addToStudy(bride_geom, "bride_geom") + + +# parametres de la geometrie : + +r1 = 12.0 +r1_t = 7.88 +r2 = 20.0 +r2_t = 2.0 + +############## +# Association +############## + +# association vertex/points de la grille 1 +# (tous les vertex qui ne sont pas fusionnes avec ceux de la grille # +# 2) + +dz_geom = geompy.MakeVectorDXDYDZ(0., 0., 1.) + +# les vertex du cylindre 1 sont crees de bas en haut, en tournant dans +# le sens trigonometrique : + +# 6 vertex sont necessaires / axe z (pour associer aux 6 vertices du +# modele) : + +z_val = [-1, 1.5, 21.5, 34, 46.5] # nl1 + 1 valeurs +for ni in range(nr1 + 1): + # suivant ni, valeurs des x pour les (nl1 + 1) points (selon l'axe z) + x = [] + z = [] + nb_z = 0 # nombre de points suivant l'axe z + if ni == 0: + z = z_val + x = [r1_t] * len(z) + pass + elif ni == 1: + z = z_val + x = [r1_t + 2.77] * len(z) + pass + elif ni == 2: + z = z_val[0:-1] # tout sauf le dernier + x_last = r1_t + 2.77 + x = [24.0, 24.0, 19.0, (19.0 - x_last)/2 + x_last, x_last] # pour le 4 eme point, moyenne + # entre le 3 eme et le 5 eme + pass + elif ni == 3: + z = z_val[1:3] + x = [24.0, 19.0] + pass + elif ni == 4: + z = z_val[1:3] + x = [26.5, 21.0] # a revoir pour le premier point ?? + pass + elif ni == 8: + z = z_val[1:3] + x = [47.5] * 2 + pass + else: # ni = 5, 6, 7 + z = z_val[1:3] + x = [26.5 + (47.5 - 26.5)/4*(ni - 4)] * 2 + pass + pass + + nb_z = len(z) + + # creation des points pour y = 0 : + vert_grid1_xi = [geompy.MakeVertex(xi, 0, zi) for (xi, zi) in \ + zip(x, z)] + + # les points suivants sont crees par rotation de PI/16 suivant + # l'axe z / aux precedents : + angle = math.pi/4.0/na1 # PI/4 (45 degres), divise par 4 + for j in range(na1): + li = [geompy.MakeRotation(v, dz_geom, angle) for v in vert_grid1_xi[-nb_z:]] + vert_grid1_xi.extend(li) + pass + + # ajout des points a l'etude et association : + # les vertex fusionnes ou correspondant a des hexaedres effaces ne + # sont pas pris en compte. + for nj in range(na1 + 1): + for nk in range(nb_z): + if (ni <= 2) or (3 <= ni <= 7 and nj >= na1 - 1) or \ + (ni == 8 and (nj == 0 or nj >= na1 - 1)): + v_mod = grille_cyl_quart.getVertexIJK(ni, nj, nk) + v_geo = vert_grid1_xi[nk + nj*nb_z] + geompy.addToStudy(v_geo, "vert_grid1_x" + str(ni) + "_y" + \ + str(nj) + "_z" + str(nk)) + v_mod.setAssociation(v_geo) + pass + pass + pass + + pass + +# association vertex/points de la grille 2 +# (tous les vertex qui ne sont pas fusionnes avec ceux de la grille # +# 1) +## dz_geom2 = geompy.MakeVectorDXDYDZ(33.5, 0., 1.) +pt_a = geompy.MakeVertex(33.5, 0, 0) +pt_b = geompy.MakeVertex(33.5, 0, 1.) +dz_geom2 = geompy.MakeVector(pt_a, pt_b) + +# les vertex du cylindre 2 sont crees de bas en haut, en tournant dans +# le sens trigonometrique : + +# REM : pour l'instant on met de cote la partie centrale du cylindre +# (6 vertex selon z) => a faire a la fin. Ils sont d'ailleurs ranges +# apres les autres dans le modele + + +# 6 vertex sont necessaires / axe z (pour associer aux 6 vertices du +# modele) : + +z_val = [-1, 1.5, 21.5, 24, 36, 41.5] # nl2 + 1 valeurs +for ni in range(nr2 + 1): + # suivant ni, valeurs des x pour les (nl1 + 1) points (selon l'axe z) + x = [] + z = [] + nb_z = 0 # nombre de points suivant l'axe z + if ni == 0: + z = z_val + x = [39.5] * len(z) + pass + elif ni == 1: + z = z_val[1:-1] # tout sauf le dernier et le premier + x = [42.5] * len(z) + pass + elif ni == 2: + z = z_val[1:-2] # tout sauf les 2 derniers et le premier + x = [46.] * len(z) + pass + elif ni == 3: + z = z_val[1:3] + x = [46.7] * len(z) # valeur a revoir ?? + pass + pass + + nb_z = len(z) + + # creation des points pour y = 0 : + vert_grid2_xi = [geompy.MakeVertex(xi, 0, zi) for (xi, zi) in \ + zip(x, z)] + + # les points suivants sont crees par rotation de PI/16 suivant + # l'axe z / aux precedents : + angle = math.pi/na2 # PI (180 degres), divise par 8 + for j in range(na2): + li = [geompy.MakeRotation(v, dz_geom2, angle) for v in vert_grid2_xi[-nb_z:]] + vert_grid2_xi.extend(li) + pass + + # ajout des points a l'etude et association : + for nj in range(na2 + 1): + for nk in range(nb_z): + v_mod = grille_cyl_demi.getVertexIJK(ni, nj, nk) + v_geo = vert_grid2_xi[nk + nj*nb_z] + geompy.addToStudy(v_geo, "vert_grid2_x" + str(ni) + "_y" + \ + str(nj) + "_z" + str(nk)) + v_mod.setAssociation(v_geo) + pass + pass + + pass + +# association des vertex communs grille1/grille2 +# REM : cette etape n'est pas necessaire ? En effet, les vertex ayant +# ete fusionnes, l'association a ete faite avec la grille 2 diff --git a/doc/pyplots/process_vtk.py b/doc/pyplots/process_vtk.py new file mode 100755 index 0000000..42265cc --- /dev/null +++ b/doc/pyplots/process_vtk.py @@ -0,0 +1,56 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +import sys +import os +from optparse import OptionParser + +def process (file_name): + """ + cette methode prend en entree le nom d'un fichier vtk cree par le + module HEXABLOCK de Salome, et remplace les "," par des "." + """ + + wr_data = "" + with open(file_name, 'r') as f: + read_data = f.read() + wr_data = read_data.replace(',', '.') + pass + + with open(file_name, 'w') as f: + f.write(wr_data) + pass + + pass + +if __name__ == '__main__': + + usage = "usage: %prog file_name" + parser = OptionParser(usage=usage) + (options, args) = parser.parse_args() + + if len(args) != 1: + print usage + sys.exit(1) + + file_name = os.path.join(os.environ['TMP'], args[0]) + + print file_name + process(file_name) + + sys.exit() diff --git a/doc/pyplots/test_cut.py b/doc/pyplots/test_cut.py new file mode 100644 index 0000000..412ab00 --- /dev/null +++ b/doc/pyplots/test_cut.py @@ -0,0 +1,55 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# + +import os +import GEOM +import SALOMEDS +import hexablock + +print "test cut hexaedra..." +doc = hexablock.addDocument() + +size_x = 2 +size_y = 1 +size_z = 1 + +orig = doc.addVertex(0, 0, 0) +dirVr = doc.addVector(1, 1, 1) + +grid = doc.makeCartesian1(orig, dirVr, size_x, size_y, size_z, 0, 0, + 0) +arete = grid.getEdgeK(0, 0, 0) + +## doc.dump() + +file_name = os.path.join(os.environ['TMP'], 'no_decoupe.vtk') +doc.saveVtk(file_name) + +doc.cut(arete, 1) + +# doc.dump() +file_name = os.path.join(os.environ['TMP'], 'decoupe.vtk') +doc.saveVtk(file_name) + + +print "...test cut hexaedra OK" + + diff --git a/doc/pyplots/test_disconnect.py b/doc/pyplots/test_disconnect.py new file mode 100644 index 0000000..172cd6a --- /dev/null +++ b/doc/pyplots/test_disconnect.py @@ -0,0 +1,81 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# + +import os +import GEOM +import SALOMEDS +import hexablock + +# differents cas possibles de remplissage possibles : + + +print "test disconnect elements..." +doc = hexablock.addDocument() + +size_x = 2; +size_y = 2; +size_z = 1; + +orig1 = doc.addVertex(0, 0, 0); +orig2 = doc.addVertex(4, 0, 0); +orig3 = doc.addVertex(8, 0, 0); + + +dirVr = doc.addVector(1, 1, 1); + +grid1 = doc.makeCartesian1(orig1, dirVr, size_x, size_y, size_z, 0, 0, + 0) +grid2 = doc.makeCartesian1(orig2, dirVr, size_x, size_y, size_z, 0, 0, + 0) +grid3 = doc.makeCartesian1(orig3, dirVr, size_x, size_y, size_z, 0, 0, + 0) + + +nvtk = 0 +#doc.setLevel(1) + +# matrice = ??? +# ecart = doc.addVector(0.5, 0.5, 0) + +hexa1 = grid1.getHexaIJK(1, 1, 0) +hexa2 = grid2.getHexaIJK(1, 1, 0) +hexa3 = grid3.getHexaIJK(1, 1, 0) + +quad = grid1.getQuadJK(1, 1, 0) +edge = grid2.getEdgeK(1, 2, 0) +vertex = grid3.getVertexIJK(1, 1, 1) + +quad.setScalar(5) +edge.setScalar(5) +vertex.setScalar(5) + +file_name = os.path.join(os.environ['TMP'], 'disconnect1.vtk') +doc.saveVtk(file_name) + +doc.disconnectQuad(hexa1, quad) + +file_name = os.path.join(os.environ['TMP'], 'disconnect2.vtk') +doc.saveVtk(file_name) + + +print "...test disconnect elements OK" + + diff --git a/doc/pyplots/test_join_quads.py b/doc/pyplots/test_join_quads.py new file mode 100644 index 0000000..3e397f1 --- /dev/null +++ b/doc/pyplots/test_join_quads.py @@ -0,0 +1,79 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# + +# exemple repris de test_hexa1.cxx (test_joint()) + +import os +import GEOM +import SALOMEDS +import hexablock + +print "test join..." +doc = hexablock.addDocument() + +orig1 = doc.addVertex(0, 0, 0) +dx = doc.addVector(1, 0, 0) +dy = doc.addVector(0, 1, 0) +dz = doc.addVector(0, 0, 1) + +dimx = 11 +dimy = 11 +dimz = 2 +grid1 = doc.makeCartesian(orig1, dx, dy, dz, dimx, dimy, dimz) + +orig2 = doc.addVertex(dimx/2.0, 0, 8) +grid2 = doc.makeCylindrical(orig2, dx, dy, 1, 180, 1, dimz, dimy, + dimx, False) + +mx = dimx/2 +my = dimy/2 +prems = grid1.getQuadIJ(mx, my, dimz) +cible = grid2.getQuadJK(dimz, mx, my) + +# @todo reference = test_hexa1.cxx ou ModelTest.cxx ? +v1 = prems.getVertex(0) +v2 = cible.getVertex(0) +v3 = prems.getVertex(1) +v4 = cible.getVertex(3) + +liste = [prems] +liste.extend([grid1.getQuadIJ(nx, my, dimz) for nx in range(dimx) if nx != mx]) +liste.extend([grid1.getQuadIJ(mx, ny, dimz) for ny in range(dimy) if ny != my]) + +height = 5 + +elts = doc.joinQuads(liste, cible, v1, v2, v3, v4, height) + +## indispensable ??? +nbr_joint_vertex = elts.countVertex() +nbr_surf_vertex = nbr_joint_vertex/(height + 1) + +ind0 = elts.findVertex(v1) +for nh in range(nbr_surf_vertex): + elts.getVertex(nh).setScalar(5) +for nh in range(height): + elts.getVertex(nh*nbr_surf_vertex).setScalar(3) + + +file_name = os.path.join(os.environ['TMP'], 'joint.vtk') +elts.saveVtk(file_name) + +print "...test join OK" diff --git a/doc/pyplots/test_make_cart_grid.py b/doc/pyplots/test_make_cart_grid.py new file mode 100644 index 0000000..b0bfb3f --- /dev/null +++ b/doc/pyplots/test_make_cart_grid.py @@ -0,0 +1,50 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# + +# exemple repris de test_HEXABLOCK.py + +import os +import GEOM +import SALOMEDS +import hexablock + + +print "test grille cartesienne..." +doc = hexablock.addDocument() + +orig = doc.addVertex(0, 0, 0) + +#direction = doc.addVector(1, 1, 1) + +dx = doc.addVector(1, 0, 0) +dy = doc.addVector(0, 1, 0) +dz = doc.addVector(0, 0, 1) + +ni = 15 +nj = 12 +nk = 8 + +grid = doc.makeCartesian(orig, dx, dy, dz, ni, nj, nk) + +file_name = os.path.join(os.environ['TMP'], 'grille_cartesienne.vtk') +grid.saveVtk(file_name) + +print "...test grille cartesienne OK" diff --git a/doc/pyplots/test_make_cyl_grid.py b/doc/pyplots/test_make_cyl_grid.py new file mode 100644 index 0000000..942efeb --- /dev/null +++ b/doc/pyplots/test_make_cyl_grid.py @@ -0,0 +1,64 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# + +import os +import GEOM +import SALOMEDS +import hexablock + +# differents cas possibles de remplissage possibles : + + +print "test grille cylindrique..." +doc = hexablock.addDocument() + +orig1 = doc.addVertex(0, 0, 0) +orig2 = doc.addVertex(10, 0, 0) +orig3 = doc.addVertex(0, 10, 0) +orig4 = doc.addVertex(10, 10, 0) +orig5 = doc.addVertex(0, 20, 0) +orig6 = doc.addVertex(10, 20, 0) + +vz = doc.addVector(0, 0, 1) +vx = doc.addVector(1, 0, 0) + +dr = 1 +dl = 1 +nr = 2 +nl = 3 + +c1 = doc.makeCylindrical(orig1, vx, vz, dr, 360, dl, nr, 4, nl, True) +c2 = doc.makeCylindrical(orig2, vx, vz, dr, 360, dl, nr, 8, nl, True) +c3 = doc.makeCylindrical(orig3, vx, vz, dr, 270, dl, nr, 8, nl, True) +c4 = doc.makeCylindrical(orig4, vx, vz, dr, 270, dl, nr, 7, nl, True) +c5 = doc.makeCylindrical(orig5, vx, vz, dr, 360, dl, nr, 5, nl, True) +c6 = doc.makeCylindrical(orig6, vx, vz, dr, 360, dl, nr, 6, nl, True) + +base2 = nr * nl * 8 +for i in range(2): + c2.getHexa(base2 + i).setScalar(5) + +file_name = os.path.join(os.environ['TMP'], 'grilles_cylindriques.vtk') +doc.saveVtk(file_name) + +print "...test grille cylindrique OK" + + diff --git a/doc/pyplots/test_make_cylinder.py b/doc/pyplots/test_make_cylinder.py new file mode 100644 index 0000000..ed7e86b --- /dev/null +++ b/doc/pyplots/test_make_cylinder.py @@ -0,0 +1,50 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# + +# exemple repris de test_HEXABLOCK.py + +import os +import GEOM +import SALOMEDS +import hexablock + +print "test cylindre..." +doc = hexablock.addDocument() + +base = doc.addVertex(0, 0, 0) + +direction = doc.addVector(0, 0, 1) + +radius = 4 +height = 5 + +cyl = doc.addCylinder(base, direction, radius, height) + +vb = doc.addVector(1, 0, 0) +nr = radius +na = 9 +nl = height +elts = doc.makeCylinder(cyl, vb, nr, na, nl) + +file_name = os.path.join(os.environ['TMP'], 'cylindre.vtk') +elts.saveVtk(file_name) + +print "...test cylindre OK" diff --git a/doc/pyplots/test_make_elmts_transform.py b/doc/pyplots/test_make_elmts_transform.py new file mode 100644 index 0000000..3b18eff --- /dev/null +++ b/doc/pyplots/test_make_elmts_transform.py @@ -0,0 +1,58 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# + +import os +import GEOM +import SALOMEDS +import hexablock + +print "test make elements by transforming elements..." +doc = hexablock.addDocument() + +size_x = 1 +size_y = 1 +size_z = 2 + +orig = doc.addVertex(0, 0, 0) +dirVr = doc.addVector(1, 1, 1) + +grid = doc.makeCartesian1(orig, dirVr, size_x, size_y, size_z, 0, 0, + 0) +orig.setScalar(2) + +file_name = os.path.join(os.environ['TMP'], 'transfo0.vtk') +doc.saveVtk(file_name) + +devant = doc.addVector(5, 0, 0) +grid2 = doc.makeTranslation(grid, devant) + +file_name = os.path.join(os.environ['TMP'], 'transfo_translation.vtk') +doc.saveVtk(file_name) + +grid4 = doc.makeRotation(grid2, orig, dirVr, 45) + +file_name = os.path.join(os.environ['TMP'], 'transfo_rotation.vtk') +doc.saveVtk(file_name) + + +print "...test make elements by transforming elements OK" + + diff --git a/doc/pyplots/test_make_pipe.py b/doc/pyplots/test_make_pipe.py new file mode 100644 index 0000000..7679546 --- /dev/null +++ b/doc/pyplots/test_make_pipe.py @@ -0,0 +1,51 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# + +# exemple repris de test_hexa1.cxx + +import os +import GEOM +import SALOMEDS +import hexablock + +print "test pipe..." +doc = hexablock.addDocument() + +orig = doc.addVertex(50, 0, 0) + +vz = doc.addVector(0, 0, 1) + +int_radius = 3 +ext_radius = 4 +height = 5 + +pi = doc.addPipe(orig, vz, int_radius, ext_radius, height) + +vb = doc.addVector(1, 0, 0) +nr = 4 +na = 9 +nl = 5 +elts = doc.makePipe(pi, vb, nr, na, nl) + +file_name = os.path.join(os.environ['TMP'], 'pipe.vtk') +elts.saveVtk(file_name) + +print "...test pipe OK" diff --git a/doc/pyplots/test_make_spher_grid.py b/doc/pyplots/test_make_spher_grid.py new file mode 100644 index 0000000..da5f256 --- /dev/null +++ b/doc/pyplots/test_make_spher_grid.py @@ -0,0 +1,50 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# + +# exemple repris de test_HEXABLOCK.py + +import os +import GEOM +import SALOMEDS +import hexablock + + +print "test grille spherique..." +doc = hexablock.addDocument() + +orig = doc.addVertex(0, 0, 0) + +direction = doc.addVector(1, 1, 1) + +#n = 2 +n = 2 +# k = 0.8 # amincit les couches (ou epaissit : si < 1 ou > 1) + +k = 0.8 # amincit les couches (ou epaissit : si < 1 ou > 1) + +grid = doc.makeSpherical(orig, direction, n, k) + + + +file_name = os.path.join(os.environ['TMP'], 'grille_spherique.vtk') +grid.saveVtk(file_name) + +print "...test grille spherique OK" diff --git a/doc/pyplots/test_prism_quads.py b/doc/pyplots/test_prism_quads.py new file mode 100644 index 0000000..4366fea --- /dev/null +++ b/doc/pyplots/test_prism_quads.py @@ -0,0 +1,56 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# + +# exemple repris de test_hexa1.cxx + +import os +import GEOM +import SALOMEDS +import hexablock + +print "test prism..." +doc = hexablock.addDocument() + +orig = doc.addVertex(0, 0, 0) +dx = doc.addVector(1, 0, 0) +dy = doc.addVector(0, 1, 0) +dz = doc.addVector(0, 0, 1) + +dimx = 11 +dimy = 11 +dimz = 2 +grid = doc.makeCartesian(orig, dx, dy, dz, dimx, dimy, dimz) + +mx = dimx/2 +my = dimy/2 +prems = grid.getQuadIJ(mx, my, dimz) + +liste = [prems] +liste.extend([grid.getQuadIJ(nx, my, dimz) for nx in range(dimx) if nx != mx]) +liste.extend([grid.getQuadIJ(mx, ny, dimz) for ny in range(dimy) if ny != my]) + +vec = doc.addVector(1, 1, 1) +elts = doc.prismQuads(liste, vec, 5) + +file_name = os.path.join(os.environ['TMP'], 'prisme.vtk') +elts.saveVtk(file_name) + +print "...test prism OK" diff --git a/doc/pyplots/test_propagation.py b/doc/pyplots/test_propagation.py new file mode 100644 index 0000000..0e6cb33 --- /dev/null +++ b/doc/pyplots/test_propagation.py @@ -0,0 +1,61 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# + +import os +import GEOM +import SALOMEDS +import hexablock + +print "test propagation..." +doc = hexablock.addDocument() + +size_x = 2 +size_y = 1 +size_z = 1 + +orig = doc.addVertex(0, 0, 0) +dirVr = doc.addVector(1, 1, 1) + +grid = doc.makeCartesian1(orig, dirVr, size_x, size_y, size_z, 0, 0, + 0) + +for nro in range(doc.countPropagation()): + prop = doc.getPropagation(nro) + edges = prop.getEdges() + + print("____________________________________ Prop nro %d" % (nro)) + for edge in edges: +# test impossible en python car impossible de recuperer le nom des vertex + if edge.getWay(): + print "( ", edge.getVertex(0).name, ",", edge.getVertex(1).name, " )" + else: + print "( ", edge.getVertex(1).getName(), ",", edge.getVertex(0).getName(), " )" + pass + pass + + + +file_name = os.path.join(os.environ['TMP'], 'propagation.vtk') +doc.saveVtk(file_name) + +print "...test propagation OK" + + diff --git a/doc/python.rst b/doc/python.rst new file mode 100644 index 0000000..c7c6fd2 --- /dev/null +++ b/doc/python.rst @@ -0,0 +1,49 @@ +:tocdepth: 4 + +.. _python: + +############################################### +Using HexaBlock with the Python interface (TUI) +############################################### + +By the links below you can find sample scripts for all operations provided by HexaBlock module + +.. toctree:: + :maxdepth: 2 + + tui_component.rst + tui_document.rst + tui_vertex.rst + tui_edge.rst + tui_quadrangle.rst + tui_hexahedron.rst + tui_vector.rst + tui_cyl.rst + tui_pipe.rst + tui_blocks_for_cyl_pipe.rst + tui_cartgrid.rst + tui_cylgrid.rst + tui_sphergrid.rst + tui_remove.rst + tui_cut_hexa.rst + tui_prism_join_quad.rst + tui_merge_elmts.rst + tui_disc_elmts.rst + tui_make_elmts.rst + tui_modify_elmts.rst + tui_asso_quad_to_geom.rst + tui_groups.rst + tui_discret_law.rst + tui_propag.rst + tui_mesh.rst + + + + + + + + + + + diff --git a/doc/tui.rst b/doc/tui.rst new file mode 100644 index 0000000..aace739 --- /dev/null +++ b/doc/tui.rst @@ -0,0 +1,7 @@ +:tocdepth: 3 + +.. _tui: + +==== +TUI +==== diff --git a/doc/tui_asso_quad_to_geom.rst b/doc/tui_asso_quad_to_geom.rst new file mode 100644 index 0000000..1473ed9 --- /dev/null +++ b/doc/tui_asso_quad_to_geom.rst @@ -0,0 +1,77 @@ +:tocdepth: 3 + +.. _tuiassoquadtogeom: + +============================================= +Associate the model of blocks to the geometry +============================================= + +.. _tuiassoelemts: + +Elements association +==================== + +Associate to a vertex of the geometry:: + + vx.setAssociation(geom_object_vertex) + +Get the association:: + + gov = vx.getAssociation() + +Associate to an edge or a wire of the geometry:: + + l = edg.addAssociation(geom_object_1D, debut, val) + +Get the associations:: + + edge_associations = edg.getAssociations() + +Associate to a face or a shell of the geometry:: + + l = quad.addAssociation(geom_object_2D) + +Give the association:: + + go2d = quad.getAssociations() + +.. _tuiassolines: + +Associate by lines +================== + +To associate an opened line to the geometry, the following data have +to be mentioned: + +- the starting edge of the model of blocks: *mstart* +- the list of edges of the model of blocks: *mline* +- the starting edge of the geometry: *gstart* +- the curvilinear abscissa on the starting edge of the geometry: *pstart* (double) +- the list of edges of the geometry: *gline* +- the curvilinear abscissa on the last edge of the geometry: *pend* + +The number of edges of the model of blocks to associate may be +different from the number of edges of the geometry. + +Associate an opened line:: + + l = doc.associateOpenedLine(mstart, mline, gstart, pstart, gline, pend) + +To associate a closed line to the geometry, the following data have +to be mentioned: + +- the starting vertex of the model of blocks: *mfirst* +- the starting edge of the model of blocks: *mstart* +- the list of edges of the model of blocks: *mline* +- the starting edge of the geometry: *gstart* +- the curvilinear abscissa on the starting edge of the geometry: *pstart* (double) +- the list of edges of the geometry: *gline* + +The number of edges of the model of blocks to associate may be +different from the number of edges of the geometry. + +Associate a closed line:: + + l = doc.associateClosedLine(mfirst, mstart, mline, gstart, pstart, gline) + +GUI command: :ref:`guiassoquadtogeom` diff --git a/doc/tui_blocks_for_cyl_pipe.rst b/doc/tui_blocks_for_cyl_pipe.rst new file mode 100644 index 0000000..3df400b --- /dev/null +++ b/doc/tui_blocks_for_cyl_pipe.rst @@ -0,0 +1,118 @@ +:tocdepth: 3 + + +.. _tuiblockscylinderpipe: + +===================================== +Make blocks for a cylinder and a pipe +===================================== + +Make blocks for a cylinder +========================== + +:: + + elts = doc.makeCylinder(cyl, vb, nr, na, nl) + +cyl: cylinder + +vb: vector on the base of the cylinder to start hexahedra. + +nr: number of blocks on radial. + +na: number of angular section. + +nl: number of blocks along the axis of the cylinder. + +The result is an array of hexahedra ranked first by following the +radial direction and the angular direction, then according to the +layers in the cylinder axis. + + +Example +------- + +:: + + import hexablock + doc = hexablock.addDocument() + + base = doc.addVertex(0, 0, 0) + direction = doc.addVector(0, 0, 1) + radius = 4 + height = 5 + + cyl = doc.addCylinder(base, direction, radius, height) + + vb = doc.addVector(1, 0, 0) + nr = radius + na = 9 + nl = height + elts = doc.makeCylinder(cyl, vb, nr, na, nl) + +.. image:: _static/cylinder.png + :align: center + +.. centered:: + Cylinder + +Make blocks for cylinders +========================= + +:: + + elts = doc.makeCylinders(cyl1, cyl2) + +The result is an array of hexahedral. + + +Make blocks for a pipe +====================== + +:: + + elts = doc.makePipe(pi, vb, nr, na, nl) + +The result is an array of hexahedral arranged in layers following the +first radial and angular layers, and finally the axial layers. + +Example +------- + +:: + + import hexablock + doc = hexablock.addDocument() + + orig = doc.addVertex(50, 0, 0) + vz = doc.addVector(0, 0, 1) + int_radius = 3 + ext_radius = 4 + height = 5 + pi = doc.addPipe(orig, vz, int_radius, ext_radius, height) + + vb = doc.addVector(1, 0, 0) + nr = 4 + na = 9 + nl = 5 + elts = doc.makePipe(pi, vb, nr, na, nl) + +.. image:: _static/pipe.png + :align: center + +.. centered:: + Pipe + +Make blocks for pipes +===================== + +:: + + elts = doc.makePipes(p1, p2) + +The result is an array of hexahedra where we first find hexahedra of +the first pipe and the second pipe. Each pipe range hexahedra following +first radial layers and angular layers, and finally the axial layers. + + +GUI command: :ref:`guiblockscylinderpipe` diff --git a/doc/tui_cartgrid.rst b/doc/tui_cartgrid.rst new file mode 100644 index 0000000..3e7e4fa --- /dev/null +++ b/doc/tui_cartgrid.rst @@ -0,0 +1,139 @@ +:tocdepth: 3 + + +.. _tuicartgrid: + +==================== +Make cartesian grids +==================== + +To add a cartesian grid to the model, the following data are required: + +- the vertex of the initial hexahedron: *pt* +- the vectors corresponding to the diametrically opposite vertices to the initial vertex: *vx, vy, vz* +- the number of repetition of this hexahedra along the three axes: *ni, nj, nk* + +Make a Cartesian grid:: + + elts = doc.makeCartesian(pt, vx, vy, vz, ni, nj, nk) + +or:: + + elts = doc.makeCartesian1(pt, vec1, px, py, pz, mx, my, mz) + + +Access to the number of elements of the grid:: + + vn = elts.countVertex() + en = elts.countEdge() + qn = elts.countQuad() + hn = elts.countHexa() + +Access to all elements of the grid:: + + vi = elts.getVertex(i) + ej = elts.getEdge(j) + qk = elts.getQuad(k) + hl = elts.getHexa(l) + +Specialized access to all vertices of the grid:: + + ve_xyz = elts.getVertexIJK(i, j, k) + + with: + 0 <= i < ni+1 + 0 <= j < nj+1 + 0 <= k < nk+1 + +Specialized access to all edges // vx axis of the grid:: + + ed_a = elts.getEdgeI(i, j, k) + + with: + 0 <= i < ni + 0 <= j < nj+1 + 0 <= k < nk+1 + +Specialized access to all edges // vy axis of the grid:: + + ed_b = elts.getEdgeJ(i, j, k) + + with: + 0 <= i < ni+1 + 0 <= j < nj + 0 <= k < nk+1 + +Specialized access to all edges // vz axis of the grid:: + + ed_c = elts.getEdgeK(i, j, k) + + with: + 0 <= i < ni+1 + 0 <= j < nj+1 + 0 <= k < nk + +Specialized access to all quadrangles // on plane vx, vy:: + + qu_a = elts.getQuadIJ(i, j, k) + + with: + 0 <= i < ni + 0 <= j < nj + 0 <= k < nk+1 + +Specialized access to all quadrangles // on plane vx, vz:: + + qu_b = elts.getQuadIK(i, j, k) + + with: + 0 <= i < ni + 0 <= j < nj+1 + 0 <= k < nk + +Specialized access to all quadrangles // on plane vy, vz:: + + qu_c = elts.getQuadJK(i, j, k) + + with: + 0 <= i < ni+1 + 0 <= j < nj + 0 <= k < nk + +Specialized access to all hexahedra of the grid:: + + he_xyz = elts.getHexaIJK(i, j, k) + + with: + 0 <= i < ni + 0 <= j < nj + 0 <= k < nk + +Example +------- + +:: + + import hexablock + doc = hexablock.addDocument() + + orig = doc.addVertex(0, 0, 0) + + dx = doc.addVector(1, 0, 0) + dy = doc.addVector(0, 1, 0) + dz = doc.addVector(0, 0, 1) + + ni = 15 + nj = 12 + nk = 8 + + grid = doc.makeCartesian(orig, dx, dy, dz, ni, nj, nk) + + +.. image:: _static/cartgrid3.png + :align: center + +.. centered:: + Cartesian Grid + + +GUI command: :ref:`guicartgrid` diff --git a/doc/tui_component.rst b/doc/tui_component.rst new file mode 100644 index 0000000..2e14385 --- /dev/null +++ b/doc/tui_component.rst @@ -0,0 +1,47 @@ +:tocdepth: 3 + + +.. _tuicomponent: + +========= +Component +========= + +Acces to HexaBlock component in python language:: + + import hexablock + +Add a new empty document in the session:: + + doc = hexablock.addDocument(name) + + +Add a new document loaded from a "xml" file:: + + doc2 = hexablock.loadDocument(filename) + +Get the number of opened document in the session:: + + nd = hexablock.countDocument() + +Get the document number "i":: + + doc_i = hexablock.getDocument(i) + +Remove a document in the session:: + + hexablock.removeDocument(doc_i) + +A tool to dump a model of block:: + + hexablock.dump(doc, [mesh, [full]]) + +- doc: the document to dump +- mesh: an optional mesh of this document +- full: + + - False: to have a short dump (by default) + - True: to have a full dump + + +GUI command: :ref:`guicomponent` diff --git a/doc/tui_cut_hexa.rst b/doc/tui_cut_hexa.rst new file mode 100644 index 0000000..508a0f3 --- /dev/null +++ b/doc/tui_cut_hexa.rst @@ -0,0 +1,37 @@ +:tocdepth: 3 + + +.. _tuicuthexa: + +============= +Cut hexahedra +============= + +Cut hexahedra from the model of blocks:: + + elts = doc.cut(an_edge, nb_of_cuts) + +This method enables to cut in two (or more) a series of hexahedra using a series of edges propagation. + + +Example +------- + +:: + + import hexablock + doc = hexablock.addDocument() + + size_x = 2 + size_y = 1 + size_z = 1 + + orig = doc.addVertex(0, 0, 0) + dirVr = doc.addVector(1, 1, 1) + + grid = doc.makeCartesian1(orig, dirVr, size_x, size_y, size_z, 0, 0, 0) + arete = grid.getEdgeK(0, 0, 0) + + doc.cut(arete, 1) + +GUI command: :ref:`guicuthexa` diff --git a/doc/tui_cyl.rst b/doc/tui_cyl.rst new file mode 100644 index 0000000..245777d --- /dev/null +++ b/doc/tui_cyl.rst @@ -0,0 +1,34 @@ +:tocdepth: 3 + + +.. _tuicylinder: + +======== +Cylinder +======== + +To add a cylinder, the following data have to be mentioned: + +- the coordinates of the cylinder base +- the direction of the cylinder +- height and radius of the cylinder + + +Add a cylinder in the document:: + + cyl = doc.addCylinder(base, direction, radius, height) + +Get the values of a cylinder:: + + ver = cyl.getBase() + vec = cyl.getDirection() + r = cyl.getRadius() + h = cyl.getHeigth() + +Access to the cylinders of the document:: + + nc = doc.countCylinder() + cylk = doc.getCylinder(ind) + + +GUI command: :ref:`guicylinder` diff --git a/doc/tui_cylgrid.rst b/doc/tui_cylgrid.rst new file mode 100644 index 0000000..0b68dc8 --- /dev/null +++ b/doc/tui_cylgrid.rst @@ -0,0 +1,81 @@ +:tocdepth: 3 + + +.. _tuicylgrid: + +====================== +Make cylindrical grids +====================== + +To add a cylindrical grid, the following data are required: + +- the coordinates (vertex) of the cylinder base center: *pt* +- the vectors defining the axis and the direction of the cylinder: *vex, vez* +- the radial, angular and axial sizes: *dr, da, dl* +- the radial, angular and axial elements number: *nr, na, nl* +- to fill or not the central part of hexahedra: *fill* + +Make a cylindrical grid:: + + elts = doc.makeCylindrical(pt, vex, vez, dr, da, dl, nr, na, nl, fill) + + +The result is an array of hexahedra which are arranged along the +radial axis first, then the angular axis, then according to the layers +and then possibly hexahedra filling the central part. + + +The filling the central part of the cylinder is made ​accordingly to the two following cases: + +.. image:: _static/cyl_grid2.PNG + :align: center + +.. centered:: + Filling of the central part of the cylinder in the case the number of angular elements is odd na = 5. + +.. image:: _static/cyl_grid1.PNG + :align: center + +.. centered:: + Filling of the central part of the cylinder in the case the number of angular elements is even na = 4. + +Example +------- + +Filling rule is illustrated by different case-tests:: + + import hexablock + doc = hexablock.addDocument() + + orig1 = doc.addVertex(0, 0, 0) + orig2 = doc.addVertex(10, 0, 0) + orig3 = doc.addVertex(0, 10, 0) + orig4 = doc.addVertex(10, 10, 0) + orig5 = doc.addVertex(0, 20, 0) + orig6 = doc.addVertex(10, 20, 0) + + vz = doc.addVector(0, 0, 1) + vx = doc.addVector(1, 0, 0) + + dr = 1 + dl = 1 + nr = 2 + nl = 3 + + c1 = doc.makeCylindrical(orig1, vx, vz, dr, 360, dl, nr, 4, nl, True) + c2 = doc.makeCylindrical(orig2, vx, vz, dr, 360, dl, nr, 8, nl, True) + c3 = doc.makeCylindrical(orig3, vx, vz, dr, 270, dl, nr, 8, nl, True) + c4 = doc.makeCylindrical(orig4, vx, vz, dr, 270, dl, nr, 7, nl, True) + c5 = doc.makeCylindrical(orig5, vx, vz, dr, 360, dl, nr, 5, nl, True) + c6 = doc.makeCylindrical(orig6, vx, vz, dr, 360, dl, nr, 6, nl, True) + + + +.. image:: _static/cylgrids.png + :align: center + +.. centered:: + Cylindrical Grids + + +GUI command: :ref:`guicylgrid` diff --git a/doc/tui_disc_elmts.rst b/doc/tui_disc_elmts.rst new file mode 100644 index 0000000..f66c40a --- /dev/null +++ b/doc/tui_disc_elmts.rst @@ -0,0 +1,21 @@ +:tocdepth: 3 + +.. _tuidisconnectelements: + +=================== +Disconnect elements +=================== + +Disconnect a quadrangle:: + + elts = doc.disconnectQuad(hexa, qua) + +Disconnect an edge:: + + elts = doc.disconnectEdge(hexa, edg) + +Disconnect a vertex:: + + elts = doc.disconnectVertex(hexa, ver) + +GUI command: :ref:`guidisconnectelements` diff --git a/doc/tui_discret_law.rst b/doc/tui_discret_law.rst new file mode 100644 index 0000000..71393e7 --- /dev/null +++ b/doc/tui_discret_law.rst @@ -0,0 +1,72 @@ +:tocdepth: 3 + +.. _tuidiscretelaw: + +============================== +Define a law of discretization +============================== + +Add a new law of discretization in the document:: + + law_1 = doc.addLaw(name, nb_nodes) + +Get the number of the law in the document:: + + nl = doc.countLaw() + +Get a law of the document:: + + law_i = doc.getLaw(i) + +Remove a law from the document:: + + doc.removeLaw(law_1) + +Find a law of discretization in the document:: + + law_1 = doc.findLaw(name) + +Get the name of the law:: + + name = law_1.getName() + +Change the name of the law:: + + law_1.setName(name) + +Get the number of nodes for the law of discretization:: + + nb = law_1.getNodes() + +Set the number of nodes for the law of discretization:: + + law_1.setNodes(nb) + +Get the kind of the law (uniform, arithmetic, geometric):: + + kd = law_1.getKind() + +Set the kind of law of discretization:: + + law_1.setKind(kind) + +Get the coefficient of the law:: + + coef = law_1.getCoefficient() + +Set the coefficient of the law:: + + law_1.setCoefficent(coef) + + +Get the default law. This law is applied when there is no law on a propagation:: + + default_law = doc.getLaw(0) + +It is possible to change the default law:: + + default_law.setNodes(10) + +And the default law is not removable + +GUI command: :ref:`guidiscretelaw` diff --git a/doc/tui_document.rst b/doc/tui_document.rst new file mode 100644 index 0000000..493772f --- /dev/null +++ b/doc/tui_document.rst @@ -0,0 +1,34 @@ +:tocdepth: 3 + +.. _tuidocument: + +======== +Document +======== + +Give the name of a document:: + + name = doc.getName() + +Set the name of a document:: + + doc.setName(name) + +Save a document in a "XML" file:: + + doc.save(filename) + +Save the model of blocks of a document in a "VTK" file:: + + doc.saveVtk(filename) + +Set the tolerance need to find element:: + + doc.setTolerance(0.0001) + +Get the tolerance:: + + tol = doc.getTolerance() + + +GUI command: :ref:`guidocument` diff --git a/doc/tui_edge.rst b/doc/tui_edge.rst new file mode 100644 index 0000000..bf6193e --- /dev/null +++ b/doc/tui_edge.rst @@ -0,0 +1,38 @@ +:tocdepth: 3 + + +.. _tuiedge: + +===== +Edges +===== + +Manage the edges of the document. + +Add an edge in the document:: + + edge_12 = doc.addEdge(vertex_1, vertex_2) + +Get the number of all edges in the document:: + + sum_a = doc.countEdge() + +Get the number of edges used only in the model of blocks:: + + sum_u = doc.countUsedEdge() + +Get an edge of the document:: + + edge_i = doc.getEdge(i) + +Get the vertices of an edge:: + + vertex_a = edge_i.getVertex(0) + vertex_b = edge_i.getVertex(1) + +Find an edge in the document:: + + edge_f = doc.findEdge(vertex_1, vertex_2) + + +GUI command: :ref:`guiedge` diff --git a/doc/tui_elements.rst b/doc/tui_elements.rst new file mode 100644 index 0000000..c05b111 --- /dev/null +++ b/doc/tui_elements.rst @@ -0,0 +1,32 @@ +:tocdepth: 3 + + +.. _tuielements: + +======== +Elements +======== + +Add an empty set of elements:: + + elts = doc.addElements() + +Add an element in a set of elements:: + + elts.addElement(element) + +Remove an element in a set of elements:: + + elts.removeElement(element) + +Remove all elements in a set of elements:: + + elts.clearElement() + +Access to the elements of the document:: + + nel = doc.countElements() + elts = doc.getElements(index) + +GUI command: :ref:`guielements` + diff --git a/doc/tui_groups.rst b/doc/tui_groups.rst new file mode 100644 index 0000000..5c8ef24 --- /dev/null +++ b/doc/tui_groups.rst @@ -0,0 +1,104 @@ +:tocdepth: 3 + +.. _tuigroups: + +==================================== +Define groups on the model of blocks +==================================== + +Three kinds of group of meshing elements: + +- group of hexahedra: + + HexaBlocks.HexaCell + +- group of quadrangles: + + HexaBlocks.QuadCell + +- group of edges: + + HexaBlocks.EdgeCell + +Four kinds of group of nodes: + +- group of nodes in hexahedra: + + HexaBlocks.HexaNode + +- group of nodes in quadrangles: + + HexaBlocks.QuadNode + +- group of nodes in edges: + + HexaBlocks.EdgeNode + +- group of nodes on vertices: + + HexaBlocks.VertexNode + + + +Add a new group in the document:: + + grp = doc.addHexaGroup(name) + grp = doc.addQuadGroup(name) + grp = doc.addEdgeGroup(name) + grp = doc.addQuadNodeGroup(name) + grp = doc.addHexaNodeGroup(name) + grp = doc.addEdgeNodeGroup(name) + grp = doc.addVertexNodeGroup(name) + +Remove a group from the document:: + + doc.removeGroup(grp) + +Get the number of groups of the document:: + + ng = doc.countGroup() + +Get a group of the document:: + + grp = doc.getGroup(index) + + +Find a group by his name in the document:: + + g = doc.findGroup(name) + +Get the name of a group:: + + name = grp.getName() + +Set the name of a group:: + + grp.setName(name) + +Get the kind of group among the 7 possibilities:: + + kind = grp.getKind() + + +Add an element in a group:: + + grp.addElement(element) + +Get the number of elements of a group:: + + nb = grp.countElement() + +Get an element of a group:: + + el = grp.getElement(index) + +Remove an element of a group:: + + grp.removeElement(index) + +Clear all elements of a group:: + + grp.clearElement() + + +GUI command: :ref:`guigroups` diff --git a/doc/tui_hexahedron.rst b/doc/tui_hexahedron.rst new file mode 100644 index 0000000..e9e4210 --- /dev/null +++ b/doc/tui_hexahedron.rst @@ -0,0 +1,28 @@ +:tocdepth: 3 + +.. _tuihexahedron: + +========== +Hexahedron +========== + +Manage the hexahedral of the document. + + +Add an hexahedron in the document:: + + hexa_1 = doc.addHexa(q_A, q_B, q_C, q_D, q_E, q_F) + + hexa_2 = doc.addHexaVertices(ACE, ACF, ADE, ADF, BCE, BCF, BDE, DBF) + +Notice: the arguments follow the convention explain in :ref:`annexe` + +Get the number of all hexahedra of the document:: + + sum_a = doc.countHexa() + +Get an hexahedron of the document:: + + hexa_i = doc.getHexa(i) + +GUI command: :ref:`guihexahedron` diff --git a/doc/tui_make_elmts.rst b/doc/tui_make_elmts.rst new file mode 100644 index 0000000..d12c812 --- /dev/null +++ b/doc/tui_make_elmts.rst @@ -0,0 +1,42 @@ +:tocdepth: 3 + +.. _tuimakeelements: + +====================================== +Make elements by transforming elements +====================================== + +Rotate and translate for any kind of elements:: + + elts = doc.makeTranslation(element, vec) + elts = doc.makeRotation(element, ver, vec, angle) + +and "element" could be Vertex, Edge, Quadrangle, Hexahedeon, Vector, Cylinder, +Pipe and Elements and the result "elts" is always an object of type +"Elements". + +Example +------- + +:: + + import hexablock + doc = hexablock.addDocument() + + size_x = 1 + size_y = 1 + size_z = 2 + + orig = doc.addVertex(0, 0, 0) + dirVr = doc.addVector(1, 1, 1) + + grid = doc.makeCartesian1(orig, dirVr, size_x, size_y, size_z, 0, 0, 0) + orig.setScalar(2) + + devant = doc.addVector(5, 0, 0) + grid2 = doc.makeTranslation(grid, devant) + + grid4 = doc.makeRotation(grid2, orig, dirVr, 45) + + +GUI command: :ref:`guimakeelements` diff --git a/doc/tui_merge_elmts.rst b/doc/tui_merge_elmts.rst new file mode 100644 index 0000000..673df23 --- /dev/null +++ b/doc/tui_merge_elmts.rst @@ -0,0 +1,42 @@ +:tocdepth: 3 + +.. _tuimergeelements: + +============== +Merge elements +============== + + +Merge 2 quadrangles:: + + l = doc.mergeQuads(qa, qb, va1, vb1, va2, vb2) + +where: + +- qa and qb are quadrangles. qa is the target quadrangle. +- va1, vb1, va2, vb2 are vertices + +va1 : vertex of the quadrangle qa to merge with the vertex vb1 of the +quadrangle qb. +va2 : vertex of the quadrangle qa to merge with the vertex vb2 of the +quadrangle qb. + +va1, vb1, va2, vb2 can be set to `None` if the quadrangles are contiguous. + +Merge 2 edges:: + + l = doc.mergeEdges(e1, e2, v1, v2) + +where: + +- e1 and e2 are edges +- v1 is the vertex of the edge e1 to merge with the vertex v2 of the edge e2 + + +Merge 2 vertices:: + + l = doc.mergeVertices(v1, v2) + +where v1 and v2 are vertices. + +GUI command: :ref:`guimergeelements` diff --git a/doc/tui_mesh.rst b/doc/tui_mesh.rst new file mode 100644 index 0000000..b4fbf5b --- /dev/null +++ b/doc/tui_mesh.rst @@ -0,0 +1,26 @@ +:tocdepth: 3 + +.. _tuimesh: + + +================= +Generate the mesh +================= + +Use the SMESH component of SALOME:: + + import smesh + m = hexablock.mesh(name, doc) + +Export to a MED file:: + + m.ExportMED("/tmp/mesh.med") + +Get some information about the mesh:: + + print "Number of hexahedra: ", m.NbHexas() + print "Number of quadrangles: ", m.NbQuadrangles() + print "Number of segments: ", m.NbEdges() + print "Number of nodes: ", m.NbNodes() + +GUI command: :ref:`guimesh` diff --git a/doc/tui_modify_elmts.rst b/doc/tui_modify_elmts.rst new file mode 100644 index 0000000..8092cd9 --- /dev/null +++ b/doc/tui_modify_elmts.rst @@ -0,0 +1,15 @@ +:tocdepth: 3 + +.. _tuimodifyelements: + + +======================================== +Modify elements by transforming elements +======================================== + +Translate and Rotate for any kind of elements:: + + doc.performTranslation(elements, vec) + doc.performRotation(elements, ver, vec, angle) + +GUI command: :ref:`guimodifyelements` diff --git a/doc/tui_pipe.rst b/doc/tui_pipe.rst new file mode 100644 index 0000000..30b231b --- /dev/null +++ b/doc/tui_pipe.rst @@ -0,0 +1,36 @@ +:tocdepth: 3 + + +.. _tuipipe: + +==== +Pipe +==== +To add a pipe, the following data have to be mentioned: + +- the coordinates of the pipe base +- the direction of the pipe +- height and radius of the pipe +- the inner radius +- the outer radius + +Add a pipe in the document:: + + p = doc.addPipe(base, direction, int_radius, ext_radius, height) + +Get the values of a pipe:: + + ver = p.getBase() + vec = p.getDirection() + int_r = p.getInternal_radius() + ext_r = p.getRadius() + h = p.getHeight() + +Access to the pipes of the document:: + + np = doc.countPipe() + pik = doc.getPipe(index) + + +GUI command: :ref:`guipipe` + diff --git a/doc/tui_prism_join_quad.rst b/doc/tui_prism_join_quad.rst new file mode 100644 index 0000000..07b3e24 --- /dev/null +++ b/doc/tui_prism_join_quad.rst @@ -0,0 +1,124 @@ +:tocdepth: 3 + + +.. _tuiprismjoinquad: + + +========================== +Prism and join quadrangles +========================== + +There are two different methods to build hexahedra from quadrangles: + +- prism from quadrangles +- join two sets of quadrangles + +Prism from a quadrangle or quadrangles +====================================== + +:: + + elts = doc.prismQuad(quad, vec, nb) + + elts = doc.prismQuads([ q1, q2, q3 ], vec, nb) + +From a list of quadrangles, a set of hexahedra is created. Given the +arbitrary nature of the start list, we can not provide additional +information on the order of the intermediate elements (vertices, +edges, quads) that contains the container-like Elements. + +Example +------- + +:: + + import hexablock + doc = hexablock.addDocument() + + orig = doc.addVertex(0, 0, 0) + dx = doc.addVector(1, 0, 0) + dy = doc.addVector(0, 1, 0) + dz = doc.addVector(0, 0, 1) + + dimx = 11 + dimy = 11 + dimz = 2 + grid = doc.makeCartesian(orig, dx, dy, dz, dimx, dimy, dimz) + + mx = dimx/2 + my = dimy/2 + prems = grid.getQuadIJ(mx, my, dimz) + + liste = [prems] + liste.extend([grid.getQuadIJ(nx, my, dimz) for nx in range(dimx) if nx != mx]) + liste.extend([grid.getQuadIJ(mx, ny, dimz) for ny in range(dimy) if ny != my]) + + vec = doc.addVector(1, 1, 1) + elts = doc.prismQuads(liste, vec, 5) + +.. image:: _static/prisme.png + :align: center + +.. centered:: + Prism Quads + + + +Join 2 sets of quadrangles +========================== + +:: + + elts = doc.joinQuad(qa, qb, va1, vb1, va2, vb2, nb) + + elts = doc.joinQuads([ qa1, qa2 ], qb, va1, vb1, va2, vb2, nb) + +Example +------- + +:: + + import hexablock + doc = hexablock.addDocument() + + orig1 = doc.addVertex(0, 0, 0) + dx = doc.addVector(1, 0, 0) + dy = doc.addVector(0, 1, 0) + dz = doc.addVector(0, 0, 1) + + dimx = 11 + dimy = 11 + dimz = 2 + grid1 = doc.makeCartesian(orig1, dx, dy, dz, dimx, dimy, dimz) + + orig2 = doc.addVertex(dimx/2.0, 0, 8) + grid2 = doc.makeCylindrical(orig2, dx, dy, 1, 180, 1, dimz, dimy, + dimx, False) + + mx = dimx/2 + my = dimy/2 + prems = grid1.getQuadIJ(mx, my, dimz) + cible = grid2.getQuadJK(dimz, mx, my) + + v1 = prems.getVertex(0) + v3 = prems.getVertex(1) + v2 = cible.getVertex(1) + v4 = cible.getVertex(2) + + liste = [prems] + liste.extend([grid1.getQuadIJ(nx, my, dimz) for nx in range(dimx) if nx != mx]) + liste.extend([grid1.getQuadIJ(mx, ny, dimz) for ny in range(dimy) if ny != my]) + + height = 5 + + elts = doc.joinQuads(liste, cible, v1, v2, v3, v4, height) + + +.. image:: _static/join.png + :align: center + +.. centered:: + Join Quads + + +GUI command: :ref:`guiprismjoinquad` diff --git a/doc/tui_propag.rst b/doc/tui_propag.rst new file mode 100644 index 0000000..effc2ac --- /dev/null +++ b/doc/tui_propag.rst @@ -0,0 +1,47 @@ +:tocdepth: 3 + +.. _tuipropag: + +============================================= +Discretization defined on the model of blocks +============================================= + +Get the number of propagation existing on the model of blocks:: + + np = doc.countPropagation() + +Get a propagation of the model of blocks:: + + propa = doc.getPropagation(index) + +Find a propagation by an edge of the model of blocks:: + + propa = doc.findPropagation(edge) + +Get all edges of the propagation and the way in the propagation:: + + edges = propa.getEdges() + bo = propa.getWay() + +Set a law of discretization for a propagation:: + + propa.setLaw(law) + +Get the law of the propagation for a propagation:: + + law = propa.getLaw() + +Set the way where the law is applied on the propagation:: + + propa.setWay(bo) + + +Example +------- + +:: + + import hexablock + doc = hexablock.addDocument() + +GUI command: :ref:`guipropag` diff --git a/doc/tui_quadrangle.rst b/doc/tui_quadrangle.rst new file mode 100644 index 0000000..bf802eb --- /dev/null +++ b/doc/tui_quadrangle.rst @@ -0,0 +1,43 @@ +:tocdepth: 3 + + +.. _tuiquadrangles: + +=========== +Quadrangles +=========== + +Manage the quadrangles of the document. + +Add a quadrangle in the document:: + + quad_1 = doc.addQuad(edge_1, edge_2, edge_3, edge_4) + quad_2 = doc.addQuadVertices(vertex_1, vertex_2, vertex_3, vertex_4) + +Notice: the vertices and edges follow the outline of the quadrangle. + +Get the number of all quadrangles of the document:: + + sum_a = doc.countQuad() + +Get the number of used quadrangles in the model of blocks:: + + sum_u = doc.countUsedQuad() + +Get a quadrangle of the document:: + + quad_i = doc.getQuad(i) + +Get an edge of a quadrangle:: + + edge_e = quad_i.getEdge(0 or 1 or 2 or 3) + +Get a vertex of a quadrangle:: + + vertex_v = quad_i.getVertex(0 or 1 or 2 or 3) + +Find a quadrangle in the document:: + + quad_f = doc.findQuad(vertex_1, vertex_2) + +GUI command: :ref:`guiquadrangles` diff --git a/doc/tui_remove.rst b/doc/tui_remove.rst new file mode 100644 index 0000000..fd4c7dd --- /dev/null +++ b/doc/tui_remove.rst @@ -0,0 +1,24 @@ +:tocdepth: 3 + + +.. _tuiremove: + +================ +Remove hexahedra +================ + +Remove one hexahedra of the model of blocks:: + + doc.removeHexa(hexa) + +Remove all hexahedra connected of the model of blocks:: + + doc.removeConnectedHexa(hexa) + + +.. image:: _static/remove3.PNG + :align: center + + +GUI command: :ref:`guiremove` + diff --git a/doc/tui_sphergrid.rst b/doc/tui_sphergrid.rst new file mode 100644 index 0000000..93b02f6 --- /dev/null +++ b/doc/tui_sphergrid.rst @@ -0,0 +1,52 @@ +:tocdepth: 3 + + +.. _tuisphergrid: + +==================== +Make spherical grids +==================== + + +To add a spherical grid, the following data are required: + +- the center (vertex) of the central hexahedron: *pt* +- the vector corresponding to the diametrically opposite vertex to the + initial vertex: *dv* +- the number of embedded hexahedra: *n* +- the coefficient of growth:*k* + + +Make a spherical grid:: + + elts = doc.makeSpherical(pt, dv, n, k) + +The result is an array of hexahedra starting with the central and +other hexahedral are arranged layer by layer from the center. Each +layer contains six hexahedral always in the following order: two along +the X axis, then 2 for the Y axis and 2 for the Z axis. + + +Example +------- + +:: + + import hexablock + doc = hexablock.addDocument() + + orig = doc.addVertex(0, 0, 0) + + direction = doc.addVector(1, 1, 1) + + dx = doc.addVector(1, 0, 0) + dy = doc.addVector(0, 1, 0) + dz = doc.addVector(0, 0, 1) + + n = 2 + k = 0.8 + + grid = doc.makeSpherical(orig, direction, n, k) + + +GUI command: :ref:`guisphergrid` diff --git a/doc/tui_vector.rst b/doc/tui_vector.rst new file mode 100644 index 0000000..100df94 --- /dev/null +++ b/doc/tui_vector.rst @@ -0,0 +1,28 @@ +:tocdepth: 3 + +.. _tuivector: + +====== +Vector +====== + +Add a vector in the document:: + + vector_1 = doc.addVector(dx, dy, dz) + vector_2 = doc.addVectorVertices(vertex_1, vertex_2) + +Get the values of a vector:: + + dx = vector_1.getDX() + dy = vector_1.getDY() + dz = vector_1.getDZ() + +Get the number of vector in the document:: + + sum = doc.countVector() + +Get a vector of the document:: + + vector_i = doc.getVector(i) + +GUI command: :ref:`guivector` diff --git a/doc/tui_vertex.rst b/doc/tui_vertex.rst new file mode 100644 index 0000000..ad4a3ef --- /dev/null +++ b/doc/tui_vertex.rst @@ -0,0 +1,45 @@ +:tocdepth: 3 + +.. _tuivertex: + +======== +Vertices +======== + +Manage the vertices of the model of blocks of a document. + + +Add a new vertex of the model of blocks in the document:: + + vertex_1 = doc.addVertex(x, y, z) + +Get the number of all vertices of the document:: + + sum_a = doc.countVertex() + +Get the number of vertices used only by the model of blocks:: + + sum_u = doc.countUsedVertex() + +Get a vertex of the document:: + + vertex_i = doc.getVertex(i) + +Get the coordinates of a vertex:: + + x = vertex_i.getX() + y = vertex_i.getY() + z = vertex_i.getZ() + +Set the coordinates of a vertex:: + + vertex_i.setX(x1) + vertex_i.setY(y1) + vertex_i.setZ(z1) + +Find a vertex in the document (with a tolerance):: + + vertex_f = doc.findVertex(x, y, z) + + +GUI command: :ref:`guivertex` diff --git a/idl/CrossElements.idl b/idl/CrossElements.idl new file mode 100755 index 0000000..e9a17bc --- /dev/null +++ b/idl/CrossElements.idl @@ -0,0 +1,59 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __CrossElements_idl__ +#define __CrossElements_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "Element.idl" +#include "Vertex.idl" +#include "Edge.idl" +#include "Quad.idl" +#include "Hexa.idl" +#include "Cylinder.idl" + +/*! \ingroup EXAMPLES +*/ +module HEXABLOCK_ORB +{ + +// interface CrossElements : Elements + interface CrossElements: Element + { + Hexa getHexaIJK(in long part, in long nx, in long ny, in long nz) raises (SALOME::SALOME_Exception); + Quad getQuadIJ(in long part, in long nx, in long ny, in long nz) raises (SALOME::SALOME_Exception); + Quad getQuadJK(in long part, in long nx, in long ny, in long nz) raises (SALOME::SALOME_Exception); + Quad getQuadIK(in long part, in long nx, in long ny, in long nz) raises (SALOME::SALOME_Exception); + Edge getEdgeI(in long part, in long nx, in long ny, in long nz) raises (SALOME::SALOME_Exception); + Edge getEdgeJ(in long part, in long nx, in long ny, in long nz) raises (SALOME::SALOME_Exception); + Edge getEdgeK(in long part, in long nx, in long ny, in long nz) raises (SALOME::SALOME_Exception); + Vertex getVertexIJK(in long part, in long nx, in long ny, in long nz) raises (SALOME::SALOME_Exception); + + // Tutaux en T (like castles in scotland) + long crossCylinders (in Cylinder cyl1, in Cylinder cyl2) raises (SALOME::SALOME_Exception); + + long saveVtk( in string fname );//CS_NOT_SPEC + }; + +}; + +#endif diff --git a/idl/Cylinder.idl b/idl/Cylinder.idl new file mode 100755 index 0000000..ea5943b --- /dev/null +++ b/idl/Cylinder.idl @@ -0,0 +1,51 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Cylinder_idl__ +#define __Cylinder_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ + +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "Element.idl" +#include "Vertex.idl" +#include "Vector.idl" + +/*! \ingroup EXAMPLES + +This package contains the interface HEXABLOCK_ORB used +for %HEXABLOCK component as an example in %SALOME application. +*/ +module HEXABLOCK_ORB +{ + interface Cylinder : Element + { + Vertex getBase() raises (SALOME::SALOME_Exception); + Vector getDirection() raises (SALOME::SALOME_Exception); + double getRadius() raises (SALOME::SALOME_Exception); + double getHeight() raises (SALOME::SALOME_Exception); + +// long saveVtk( in string fname );//CS_NOT_SPEC + }; +}; + +#endif + diff --git a/idl/Document.idl b/idl/Document.idl new file mode 100755 index 0000000..39de1e2 --- /dev/null +++ b/idl/Document.idl @@ -0,0 +1,585 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Document_idl__ +#define __Document_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "GEOM_Gen.idl" + +#include "Edge.idl" +#include "Hexa.idl" + +/*! \ingroup EXAMPLES + +This package contains the interface HEXABLOCK_ORB used +for %HEXABLOCK component as an example in %SALOME application. +*/ +module HEXABLOCK_ORB +{ + + interface Element; + interface Vertex; + interface Edge; + interface Quad; + interface Hexa; + interface Vector; + interface Cylinder; + interface Pipe; + interface Elements; + interface CrossElements; + interface Law; + interface Group; + interface Propagation; + + typedef sequence Quads; + typedef sequence RealVector; + typedef GEOM::GEOM_Object Shape; + typedef sequence Shapes; + + interface Document : SALOME::GenericObj + { + void purge() + raises (SALOME::SALOME_Exception); + + void dump() + raises (SALOME::SALOME_Exception); + /*! + */ + string getName() + raises (SALOME::SALOME_Exception); + + long setName (in string name ) + raises (SALOME::SALOME_Exception); + + long save( in string fileName ) + raises (SALOME::SALOME_Exception); + + long saveVtk( in string fname ); + + void setLevel (in long debug_level ) + raises (SALOME::SALOME_Exception); + + + /*! + */ + void setTolerance( in double tol ) raises (SALOME::SALOME_Exception); + double getTolerance() raises (SALOME::SALOME_Exception); + + /*! + Sommets + */ + Vertex addVertex( in double x, in double y, in double z ) + raises (SALOME::SALOME_Exception); + + long countVertex() + raises (SALOME::SALOME_Exception); + + Vertex getVertex( in long i ) + raises (SALOME::SALOME_Exception); + + Vertex findVertex( in double x, in double y, in double z ) + raises (SALOME::SALOME_Exception); + + + /*! + Arêtes + */ + Edge addEdge( in Vertex v0, in Vertex v1 ) + raises (SALOME::SALOME_Exception); + + long countEdge() + raises (SALOME::SALOME_Exception); + + Edge getEdge( in long i ) + raises (SALOME::SALOME_Exception); + + Edge findEdge( in Vertex p1, in Vertex p2 ) + raises (SALOME::SALOME_Exception); + + + /*! + Quadrangles + */ + Quad addQuad( in Edge e0, in Edge e1, in Edge e2, in Edge e3 ) + raises (SALOME::SALOME_Exception); + + Quad addQuadVertices( in Vertex v0, in Vertex v1, in Vertex v2, in Vertex v3 ) + raises (SALOME::SALOME_Exception); + + long countQuad() + raises (SALOME::SALOME_Exception); + + Quad getQuad( in long i ) + raises (SALOME::SALOME_Exception); + + Quad findQuad( in Vertex v1, in Vertex v2 ) + raises (SALOME::SALOME_Exception); + + + + /*! + Hexaèdre + */ + Hexa addHexa( in Quad q0, in Quad q1, in Quad q2, in Quad q3, in Quad q4, in Quad q5 ) + raises (SALOME::SALOME_Exception); + + Hexa addHexaVertices( in Vertex v1, in Vertex v2, in Vertex v3, in Vertex v4, + in Vertex v5, in Vertex v6, in Vertex v7, in Vertex v8 ) + raises (SALOME::SALOME_Exception); + + long countHexa() + raises (SALOME::SALOME_Exception); + + Hexa getHexa( in long i ) + raises (SALOME::SALOME_Exception); + + Hexa findHexa( in Vertex p1, in Vertex p2 ) + raises (SALOME::SALOME_Exception); + + + + /*! + Vecteurs + */ + Vector addVector( in double dx, in double dy, in double dz ) + raises (SALOME::SALOME_Exception); + + Vector addVectorVertices( in Vertex v1, in Vertex v2 ) + raises (SALOME::SALOME_Exception); + +// long countVector() +// raises (SALOME::SALOME_Exception); +// +// Vector getVector( in long i ) +// raises (SALOME::SALOME_Exception); + + + /*! + Cylindre + */ + Cylinder addCylinder( in Vertex base, in Vector direction, in double radius, in double height ) + raises (SALOME::SALOME_Exception); + +// long countCylinder() +// raises (SALOME::SALOME_Exception); +// +// Cylinder getCylinder( in long i ) +// raises (SALOME::SALOME_Exception); + + + /*! + Pipe + */ + Pipe addPipe( in Vertex base, in Vector direction, + in double int_radius, in double ext_radius, + in double height ) + raises (SALOME::SALOME_Exception); + +// long countPipe() +// raises (SALOME::SALOME_Exception); +// +// Pipe getPipe( in long i ) +// raises (SALOME::SALOME_Exception); + + + /*! + Remove block + */ + boolean removeHexa( in Hexa h ) + raises (SALOME::SALOME_Exception); + + boolean removeConnectedHexa( in Hexa h ) + raises (SALOME::SALOME_Exception); + + /*! + Grille cartésiennes + */ + Elements makeCartesian( in Vertex pt, + in Vector vx, in Vector vy, in Vector vz, + in long nx, in long ny, in long nz) + raises (SALOME::SALOME_Exception); + + Elements makeCartesian1( in Vertex v, + in Vector v1, + in long px, in long py, in long pz, + in long mx, in long my, in long mz ) + raises (SALOME::SALOME_Exception); + + /*! + Grille cylindrique + */ + Elements makeCylindrical( in Vertex pt, + in Vector vex, in Vector vez, + in double dr, in double da, in double dl, + in long nr, in long na, in long nl, + in boolean fill ) + raises (SALOME::SALOME_Exception); + + /*! + Grille cylindrique (variante) + */ + Elements makeCylindricals( in Vertex pt, + in Vector vex, in Vector vez, + in RealVector tdr, in RealVector tda, in RealVector tdl, + in boolean fill ) + raises (SALOME::SALOME_Exception); + + /*! + Grille sphérique + */ + + Elements makeSpherical( in Vertex pt, + in double rayon, + in long n, + in double k ) + raises (SALOME::SALOME_Exception); //CS_TO_DEL + + + /*! + Cylindre découpé en blocs + */ +// Elements makeCylinder( in Cylinder cyl, in long nr, in long na, in long nl ) +// raises (SALOME::SALOME_Exception);//CS_TODO + Elements makeCylinder( in Cylinder cyl, in Vector vr, in long nr, in long na, in long nl ) + raises (SALOME::SALOME_Exception);//CS_NEW CS_NOT_SPEC + + + /*! + Tuyau decoupe en blocs + */ + Elements makePipe( in Pipe p, in Vector v, in long nr, in long na, in long nl ) + raises (SALOME::SALOME_Exception); + + /*! + 2 Cylindres en T decoupes en blocs + */ + CrossElements makeCylinders( in Cylinder c1, in Cylinder c2 ) + raises (SALOME::SALOME_Exception);//CS_NEW CS_NOT_SPEC + + /*! + 2 Tuyau decoupe en intersection decoupees en blocs + */ + Elements makePipes( in Pipe p1, in Pipe p2 ) + raises (SALOME::SALOME_Exception); + + /*! + Prismer des quadrangles + */ + Elements prismQuad( in Quad qd, in Vector v, in long nb ) + raises (SALOME::SALOME_Exception); + + Elements prismQuads( in Quads qds, in Vector v, in long nb ) + raises (SALOME::SALOME_Exception); + + Elements prismQuadsVec (in Quads qds, in Vector v, in RealVector thaut, + in long opt ) + raises (SALOME::SALOME_Exception); + + Elements joinQuad( in Quad qa, in Quad qb, + in Vertex va1, in Vertex vb1, + in Vertex va2, in Vertex vb2, + in long nb ) + raises (SALOME::SALOME_Exception); + + Elements joinQuads( in Quads qds, + in Quad qb, + in Vertex va1, in Vertex vb1, + in Vertex va2, in Vertex vb2, + in long nb ) + raises (SALOME::SALOME_Exception); + + // HexaBlock V3 + Elements revolutionQuads( in Quads qds, in Vertex ori, in Vector dir, + in RealVector angles) + raises (SALOME::SALOME_Exception); + + Elements replace( in Quads qds, in Vertex p1, in Vertex c1, + in Vertex p2, in Vertex c2, in Vertex p3, in Vertex c3) + raises (SALOME::SALOME_Exception); + + Elements makeSphere (in Vertex center, in Vector vx, in Vector vz, + in double radius, in double radhole, + in Vertex plorig, + in long nrad, in long nang, in long nhaut) + raises (SALOME::SALOME_Exception); + + Elements makePartSphere (in Vertex center, in Vector vx, in Vector vz, + in double radius, in double radhole, + in Vertex plorig, in double angle, + in long nrad, in long nang, in long nhaut) + raises (SALOME::SALOME_Exception); + + Elements makeRind (in Vertex center, in Vector vx, in Vector vz, + in double radext, in double radint, in double radhole, + in Vertex plorig, + in long nrad, in long nang, in long nhaut) + raises (SALOME::SALOME_Exception); + + Elements makePartRind (in Vertex center, in Vector vx, in Vector vz, + in double radext, in double radint, in double radhole, + in Vertex plorig, in double angle, + in long nrad, in long nang, in long nhaut) + raises (SALOME::SALOME_Exception); +// +// +// /*! +// Fusionner 2 éléments de même nature //CS_NOT_SPEC +// */ + +// Elements mergeQuads( in Quad qa, in Quad qb, +// in Vertex va1, in Vertex vb1, +// in Vertex va2, in Vertex vb2 ) +// raises (SALOME::SALOME_Exception); + + long mergeQuads( in Quad qa, in Quad qb, + in Vertex va1, in Vertex vb1, + in Vertex va2, in Vertex vb2 ) + raises (SALOME::SALOME_Exception);//CS_NOT_SPEC //CS_NEW + +// +// Elements mergeEdges( in Edge e1, in Edge e2, +// in Vertex v1, in Vertex v2 ) +// raises (SALOME::SALOME_Exception); + + long mergeEdges( in Edge e1, in Edge e2, + in Vertex v1, in Vertex v2 ) + raises (SALOME::SALOME_Exception);//CS_NOT_SPEC //CS_NEW + +// Elements mergeVertices( in Vertex v1, in Vertex v2 ) +// raises (SALOME::SALOME_Exception); + long mergeVertices( in Vertex v1, in Vertex v2 ) + raises (SALOME::SALOME_Exception);//CS_NOT_SPEC //CS_NEW + + + /*! + Deconnecter des elements du modele + */ + Elements disconnectQuad( in Hexa h, in Quad q ) + raises (SALOME::SALOME_Exception); + + Elements disconnectEdge( in Hexa h, in Edge e ) + raises (SALOME::SALOME_Exception); + + Elements disconnectVertex( in Hexa h, in Vertex v ) + raises (SALOME::SALOME_Exception); + + Elements disconnectEdges( in Hexas th, in Edges te ) + raises (SALOME::SALOME_Exception); + + /*! + Couper des hexaèdres du modèle + */ + Elements cut( in Edge e, in long nb_of_cuts ) + raises (SALOME::SALOME_Exception); + + /*! + Make elements by transforming elements + */ +// Elements makeTranslation( in Elements e, in Vector vec ) +// raises (SALOME::SALOME_Exception); + Elements makeTranslation( in Elements l, in Vector vec ) + raises (SALOME::SALOME_Exception); +// +// + Elements makeRotation (in Elements l, in Vertex ver, in Vector vec, in double angle) + raises (SALOME::SALOME_Exception); + Elements makeScale (in Elements e, in Vertex ver, in double k ) + raises (SALOME::SALOME_Exception); + + Elements makeSymmetryPoint (in Elements e, in Vertex ver) + raises (SALOME::SALOME_Exception); + + Elements makeSymmetryLine (in Elements e, in Vertex ver, in Vector vec) + raises (SALOME::SALOME_Exception); + + Elements makeSymmetryPlane (in Elements e, in Vertex ver, in Vector vec) + raises (SALOME::SALOME_Exception); + + /*! + Modify elements by transforming elements + */ +// void performTranslation(in Elements e, in Vector vec) +// raises (SALOME::SALOME_Exception); + + void performTranslation(in Elements l, in Vector vec) + raises (SALOME::SALOME_Exception); +// + void performRotation(in Elements l, in Vertex ver, in Vector vec, in double angle) + raises (SALOME::SALOME_Exception); +// + void performScale(in Elements e, in Vertex ver, in double k) + raises (SALOME::SALOME_Exception); + + void performSymmetryPoint(in Elements e, in Vertex ver) + raises (SALOME::SALOME_Exception); + + void performSymmetryLine(in Elements e, in Vertex ver, in Vector vec) + raises (SALOME::SALOME_Exception); + + void performSymmetryPlane(in Elements e, in Vertex ver, in Vector vec) + raises (SALOME::SALOME_Exception); +// +// /*! +// -------- +// MAILLAGE +// -------- +// */ +// +// /*! +// Créer, éditer et supprimer un groupe +// */ +// HexaGroup addHexaGroup( in string name ) + Group addHexaGroup( in string name ) + raises (SALOME::SALOME_Exception); + +// QuadGroup addQuadGroup( in string name ) + Group addQuadGroup( in string name ) + raises (SALOME::SALOME_Exception); + +// EdgeGroup addEdgeGroup( in string name ) + Group addEdgeGroup( in string name ) + raises (SALOME::SALOME_Exception); + +// HexaNodeGroup addHexaNodeGroup( in string name ) + Group addHexaNodeGroup( in string name ) + raises (SALOME::SALOME_Exception); + +// QuadNodeGroup addQuadNodeGroup( in string name ) + Group addQuadNodeGroup( in string name ) + raises (SALOME::SALOME_Exception); + +// EdgeNodeGroup addEdgeNodeGroup( in string name ) + Group addEdgeNodeGroup( in string name ) + raises (SALOME::SALOME_Exception); + +// VertexNodeGroup addVertexNodeGroup( in string name ) + Group addVertexNodeGroup( in string name ) + raises (SALOME::SALOME_Exception); + + long removeGroup( in Group g) + raises (SALOME::SALOME_Exception); + + long countGroup() + raises (SALOME::SALOME_Exception); + + Group getGroup( in long i ) + raises (SALOME::SALOME_Exception); + + Group findGroup( in string name ) + raises (SALOME::SALOME_Exception); + + + + /*! + Définir une loi de discrétisation + */ + Law addLaw( in string name, in long nb_nodes ) + raises (SALOME::SALOME_Exception); + + long countLaw() + raises (SALOME::SALOME_Exception); + + Law getLaw( in long i ) + raises (SALOME::SALOME_Exception); + + void removeLaw( in Law l ) + raises (SALOME::SALOME_Exception); + + Law findLaw( in string name ) + raises (SALOME::SALOME_Exception); + + + /*! + Discretization defined on the model of blocks + */ + long countPropagation() + raises (SALOME::SALOME_Exception); + + Propagation getPropagation( in long i ) + raises (SALOME::SALOME_Exception); + + Propagation findPropagation( in Edge e ) + raises (SALOME::SALOME_Exception); + + /*! + Association on lines + */ + long associateOpenedLine (in Edge mstart, in Edges mline, in Shape gstart, + in double pstart, in Shapes gline, in double pend) + raises (SALOME::SALOME_Exception); + + long associateClosedLine (in Vertex mfirst, in Edge mstart, in Edges mline, + in Shape gstart, in double pstart, in boolean inv, + in Shapes gline) + raises (SALOME::SALOME_Exception); + + void setShape (in GEOM::GEOM_Object geom_object_vertex ) + raises (SALOME::SALOME_Exception); + + GEOM::GEOM_Object getShape () + raises (SALOME::SALOME_Exception); + string getBrep () + raises (SALOME::SALOME_Exception); + +// Ajouts 05/09/20011 + + long countUsedVertex() + raises (SALOME::SALOME_Exception); + long countUsedEdge() + raises (SALOME::SALOME_Exception); + long countUsedQuad() + raises (SALOME::SALOME_Exception); + long countUsedHexa() + raises (SALOME::SALOME_Exception); + + Vertex getUsedVertex( in long i ) + raises (SALOME::SALOME_Exception); + Edge getUsedEdge( in long i ) + raises (SALOME::SALOME_Exception); + Quad getUsedQuad( in long i ) + raises (SALOME::SALOME_Exception); + Hexa getUsedHexa( in long i ) + raises (SALOME::SALOME_Exception); + + Hexa addHexa5Quads (in Quad q1, in Quad q2, in Quad q3, in Quad q4, + in Quad q5) raises (SALOME::SALOME_Exception); + Hexa addHexa4Quads ( in Quad q1, in Quad q2, in Quad q3, in Quad q4) + raises (SALOME::SALOME_Exception); + Hexa addHexa3Quads ( in Quad q1, in Quad q2, in Quad q3) + raises (SALOME::SALOME_Exception); + Hexa addHexa2Quads ( in Quad q1, in Quad q2) + raises (SALOME::SALOME_Exception); + + boolean removeQuad( in Quad q ) + raises (SALOME::SALOME_Exception); + boolean removeElements( in Elements b ) + raises (SALOME::SALOME_Exception); + + void clearAssociation () + raises (SALOME::SALOME_Exception); + }; +}; + + +#endif + diff --git a/idl/Edge.idl b/idl/Edge.idl new file mode 100755 index 0000000..292d4ed --- /dev/null +++ b/idl/Edge.idl @@ -0,0 +1,85 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Edge_idl__ +#define __Edge_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "GEOM_Gen.idl" + +#include "Element.idl" +#include "Vertex.idl" + + +/*! \ingroup EXAMPLES + +This package contains the interface HEXABLOCK_ORB used +for %HEXABLOCK component as an example in %SALOME application. +*/ +module HEXABLOCK_ORB +{ + + struct EdgeAssociation + { + GEOM::GEOM_Object geomObj; + double debut; + double fin; + }; + + typedef sequence EdgeAssociations; + + interface Edge : Element + { + Vertex getVertex( in long n ) raises (SALOME::SALOME_Exception); + boolean getWay() raises (SALOME::SALOME_Exception); + + long addAssociation (in GEOM::GEOM_Object geom_object_1D, in double debut, in double val ) //CS_NOT_SPEC + raises (SALOME::SALOME_Exception); + + void clearAssociation ( ) + raises (SALOME::SALOME_Exception); + +// sequence getAssociations() //CS_NOT_SPEC + EdgeAssociations getAssociations() //CS_NOT_SPEC CS_WARNING: not working when reloading a document + raises (SALOME::SALOME_Exception); + +// void addAssociation( in GEOM::GEOM_Object geom_object_1D, in double debut, in double val ) +// raises (SALOME::SALOME_Exception); +// GEOM_Objects getAssociations() raises (SALOME::SALOME_Exception); + +// GEOM_Objects GEOM::GEOM_Object getAssociation() +// raises (SALOME::SALOME_Exception); + +// void removeAssociation() +// raises (SALOME::SALOME_Exception); + + void setScalar( in double val ) //CS_NOT_SPEC + raises (SALOME::SALOME_Exception); + + }; + + typedef sequence Edges; + + +}; + +#endif diff --git a/idl/Element.idl b/idl/Element.idl new file mode 100755 index 0000000..beeba4d --- /dev/null +++ b/idl/Element.idl @@ -0,0 +1,43 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Element_idl__ +#define __Element_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +/*! \ingroup EXAMPLES +*/ +module HEXABLOCK_ORB +{ + interface Element : SALOME::GenericObj + { + void dump () raises (SALOME::SALOME_Exception); + void printName () raises (SALOME::SALOME_Exception); + string getName () raises (SALOME::SALOME_Exception); + void setName (in string name) raises (SALOME::SALOME_Exception); + }; + + + +}; + +#endif diff --git a/idl/Elements.idl b/idl/Elements.idl new file mode 100755 index 0000000..94e1078 --- /dev/null +++ b/idl/Elements.idl @@ -0,0 +1,171 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Elements_idl__ +#define __Elements_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "Element.idl" +#include "Vertex.idl" +#include "Edge.idl" +#include "Quad.idl" +#include "Hexa.idl" + +/*! \ingroup EXAMPLES +*/ +module HEXABLOCK_ORB +{ + +// enum EnumCoord { dir_x, dir_y, dir_z, DIM3 }; + // enum EnumVertex { V_AMONT, V_AVAL, V_TWO }; + // enum EnumQuad { E_A, E_B, E_C, E_D, QUAD4 }; + + // z=0 z=1 y=0 y=1 x=0 x=1 + // enum EnumHQuad {Q_A, Q_B, Q_C, Q_D, Q_E, Q_F, HQ_MAXI}; + // enum EnumHEdge {E_AC, E_AD, E_BC, E_BD, + // E_AE, E_AF, E_BE, E_BF, + // E_CE, E_CF, E_DE, E_DF, HE_MAXI }; + // enum EnumHVertex {V_ACE, V_ACF, V_ADE, V_ADF, V_BCE, V_BCF, V_BDE, V_BDF, + // HV_MAXI }; + // enum EnumVCyl { V_E, V_NE, V_N, V_NW, V_W, V_SW, V_S, V_SE, CV_MAXI }; + // enum EnumCyl { CYL_BIG, CYL_SMALL }; + // enum EnumCyl { CYL_BIG, CYL_SMALL }; + + // EnumCoord + const long DIR_X = 0; + const long DIR_Y = 1; + const long DIR_Z = 2; + const long DIM3 = 3; + // EnumVertex + const long V_AMONT = 0; + const long V_AVAL = 1; + const long V_TWO = 2; + // EnumQuad + const long E_A = 0; + const long E_B = 1; + const long E_C = 2; + const long E_D = 3; + const long QUAD4 = 4; + + // EnumHQuad + const long Q_A = 0; // z=0 + const long Q_B = 1; // z=1 + const long Q_C = 2; // y=0 + const long Q_D = 3; // y=1 + const long Q_E = 4; // x=0 + const long Q_F = 5; // x=1 + const long HQ_MAXI = 6; + // EnumHEdge + const long E_AC = 0; + const long E_AD = 1; + const long E_BC = 2; + const long E_BD = 3; + const long E_AE = 4; + const long E_AF = 5; + const long E_BE = 6; + const long E_BF = 7; + const long E_CE = 8; + const long E_CF = 9; + const long E_DE = 10; + const long E_DF = 11; + const long HE_MAXI = 12; + // EnumHVertex + const long V_ACE = 0; + const long V_ACF = 1; + const long V_ADE = 2; + const long V_ADF = 3; + const long V_BCE = 4; + const long V_BCF = 5; + const long V_BDE = 6; + const long V_BDF = 7; + const long HV_MAXI = 8; + // EnumVCyl + const long V_E = 0; + const long V_NE = 1; + const long V_N = 2; + const long V_NW = 3; + const long V_W = 4; + const long V_SW = 5; + const long V_S = 6; + const long V_SE = 7; + const long CV_MAXI = 8; + const long CV_MAXI_EXT = 8; + const long CV_MAXI_INT = 4; + + const long CYL_SMALL = 0; + const long CYL_BIG = 1; + + const long CYL_BIG_SLICES = 4; + const long CYL_SMALL_SLICES = 6; + const long CYL_LAYERS = 2; + + interface Elements : Element + { + long countVertex() raises (SALOME::SALOME_Exception); + long countEdge() raises (SALOME::SALOME_Exception); + long countQuad() raises (SALOME::SALOME_Exception); + long countHexa() raises (SALOME::SALOME_Exception); + + Vertex getVertex( in long n ) raises (SALOME::SALOME_Exception); + Edge getEdge( in long n ) raises (SALOME::SALOME_Exception); + Quad getQuad( in long n ) raises (SALOME::SALOME_Exception); + Hexa getHexa( in long n ) raises (SALOME::SALOME_Exception); + + long findVertex( in Vertex p ) raises (SALOME::SALOME_Exception); + + Vertex getVertexIJK( in long x, in long y, in long z) + raises (SALOME::SALOME_Exception); + + Edge getEdgeI( in long x, in long y, in long z) + raises (SALOME::SALOME_Exception); + Edge getEdgeJ( in long x, in long y, in long z) + raises (SALOME::SALOME_Exception); + Edge getEdgeK( in long x, in long y, in long z) + raises (SALOME::SALOME_Exception); + + Quad getQuadIJ( in long x, in long y, in long z) + raises (SALOME::SALOME_Exception); + Quad getQuadIK( in long x, in long y, in long z) + raises (SALOME::SALOME_Exception); + Quad getQuadJK( in long x, in long y, in long z) + raises (SALOME::SALOME_Exception); + + Hexa getHexaIJK( in long x, in long y, in long z) + raises (SALOME::SALOME_Exception); + + +// Quad getQuad1( in EnumCoord dir, in long nx, in long ny, in long nz) raises (SALOME::SALOME_Exception); //CS_NOT_SPEC +// +// Edge getEdge1( in EnumCoord dir, in long nx, in long ny, in long nz) raises (SALOME::SALOME_Exception); //CS_NOT_SPEC + + long saveVtk( in string fname ) + raises (SALOME::SALOME_Exception); + + void clearAssociation () + raises (SALOME::SALOME_Exception); + + }; + + +}; + +#endif diff --git a/idl/Group.idl b/idl/Group.idl new file mode 100755 index 0000000..b71cfa0 --- /dev/null +++ b/idl/Group.idl @@ -0,0 +1,75 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Group_idl__ +#define __Group_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "Element.idl" + + +/*! \ingroup EXAMPLES +*/ +module HEXABLOCK_ORB +{ + enum GroupKind { HEXA_GROUP, + QUAD_GROUP, + EDGE_GROUP, + HEXANODE_GROUP, + QUADNODE_GROUP, + EDGENODE_GROUP, + VERTEXNODE_GROUP }; + + interface Group : SALOME::GenericObj + { + /*! + comment + */ + string getName() + raises (SALOME::SALOME_Exception); + void setName( in string name ) + raises (SALOME::SALOME_Exception); + GroupKind getKind() + raises (SALOME::SALOME_Exception); + long addElement( in Element e) + raises (SALOME::SALOME_Exception); + long countElement() + raises (SALOME::SALOME_Exception); + Element getElement( in long index ) + raises (SALOME::SALOME_Exception); + long removeElement( in Element elt ) + raises (SALOME::SALOME_Exception); + void clearElement() + raises (SALOME::SALOME_Exception); + }; + +// interface HexaGroup : Group {}; +// interface QuadGroup : Group {}; +// interface EdgeGroup : Group {}; +// +// interface HexaNodeGroup : Group {}; +// interface QuadNodeGroup : Group {}; +// interface EdgeNodeGroup : Group {}; +// interface VertexNodeGroup : Group {}; +}; + +#endif diff --git a/idl/HEXABLOCK_Gen.idl b/idl/HEXABLOCK_Gen.idl new file mode 100755 index 0000000..d3b4789 --- /dev/null +++ b/idl/HEXABLOCK_Gen.idl @@ -0,0 +1,70 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __HEXABLOCK_GEN__ +#define __HEXABLOCK_GEN__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Component.idl" +#include "SALOME_Exception.idl" +#include "Document.idl" + + +/*! \ingroup EXAMPLES + +This package contains the interface HEXABLOCK_ORB used +for %HEXABLOCK component as an example in %SALOME application. +*/ +module HEXABLOCK_ORB +{ + /*! \brief Interface of the %HEXABLOCK component + 03/07/2012 : ajout de SALOMEDS::Driver (Abu) + */ + interface HEXABLOCK_Gen : Engines::EngineComponent, SALOMEDS::Driver + { + /*! + Donne le nombre de documents ouverts en session. + */ + void test() raises (SALOME::SALOME_Exception); + long countDocument() + raises (SALOME::SALOME_Exception); + + Document getDocument(in long i) + raises (SALOME::SALOME_Exception); + + void removeDocument( in Document d) + raises (SALOME::SALOME_Exception); + + Document addDocument(in string name) + raises (SALOME::SALOME_Exception); + + Document loadDocument(in string xmlFilename) + raises (SALOME::SALOME_Exception); + + /*! + Set the current study + */ + void SetCurrentStudy( in SALOMEDS::Study theStudy ); + + }; +}; + + +#endif diff --git a/idl/Hexa.idl b/idl/Hexa.idl new file mode 100755 index 0000000..a50704c --- /dev/null +++ b/idl/Hexa.idl @@ -0,0 +1,53 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Hexa_idl__ +#define __Hexa_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "Element.idl" +#include "Vertex.idl" +#include "Edge.idl" +#include "Quad.idl" + + +/*! \ingroup EXAMPLES + +This package contains the interface HEXABLOCK_ORB used +for %HEXABLOCK component as an example in %SALOME application. +*/ +module HEXABLOCK_ORB +{ + interface Hexa : Element + { + Quad getQuad( in long n ) raises(SALOME::SALOME_Exception); + Edge getEdge( in long n ) raises(SALOME::SALOME_Exception); + Vertex getVertex( in long n ) raises(SALOME::SALOME_Exception); + + void setScalar( in double val ) //CS_NOT_SPEC + raises (SALOME::SALOME_Exception); + }; + + typedef sequence Hexas; +}; +#endif + diff --git a/idl/Law.idl b/idl/Law.idl new file mode 100755 index 0000000..cfce95b --- /dev/null +++ b/idl/Law.idl @@ -0,0 +1,51 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Law_idl__ +#define __Law_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "Vertex.idl" + +/*! \ingroup EXAMPLES +*/ +module HEXABLOCK_ORB +{ + enum KindLaw { UNIFORM, ARITHMETIC, GEOMETRIC }; + + interface Law : SALOME::GenericObj + { + void setName( in string name ) raises (SALOME::SALOME_Exception); + string getName() raises (SALOME::SALOME_Exception); + + void setNodes( in long n ) raises (SALOME::SALOME_Exception); + long getNodes() raises (SALOME::SALOME_Exception); + + void setKind( in KindLaw k ) raises (SALOME::SALOME_Exception); + KindLaw getKind() raises (SALOME::SALOME_Exception); + + void setCoefficient( in double c ) raises (SALOME::SALOME_Exception); + double getCoefficient() raises (SALOME::SALOME_Exception); + }; +}; + +#endif diff --git a/idl/Makefile.am b/idl/Makefile.am new file mode 100755 index 0000000..b12ae93 --- /dev/null +++ b/idl/Makefile.am @@ -0,0 +1,194 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This Makefile is responsible of generating the client and server +# implementation of IDL interfaces for both C++ and python usage. +# The building process of the C++ files is in charge of each source +# package and then is not manage here. + +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +BASEIDL_FILES = \ + Element.idl\ + Vertex.idl\ + Edge.idl\ + Quad.idl\ + Hexa.idl\ + Vector.idl\ + Elements.idl\ + Cylinder.idl\ + CrossElements.idl\ + Pipe.idl\ + Law.idl\ + Propagation.idl\ + Group.idl\ + Document.idl\ + HEXABLOCK_Gen.idl + +BASEIDL_FILES_PY=$(BASEIDL_FILES:%.idl=%_idl.py) + +# This variable defines the files to be installed +dist_salomeidl_DATA = $(BASEIDL_FILES) + +# GUI idl common library +lib_LTLIBRARIES = libSalomeIDLHEXABLOCK.la + + + + +# Sources built from idl files +nodist_libSalomeIDLHEXABLOCK_la_SOURCES = \ + ElementSK.cc\ + ElementDynSK.cc\ + VertexSK.cc\ + VertexDynSK.cc\ + EdgeSK.cc\ + EdgeDynSK.cc\ + QuadSK.cc\ + QuadDynSK.cc\ + HexaSK.cc\ + HexaDynSK.cc\ + VectorSK.cc\ + VectorDynSK.cc\ + ElementsSK.cc\ + ElementsDynSK.cc\ + CylinderSK.cc\ + CylinderDynSK.cc\ + CrossElementsSK.cc\ + CrossElementsDynSK.cc\ + PipeSK.cc\ + PipeDynSK.cc\ + LawSK.cc\ + LawDynSK.cc\ + PropagationSK.cc\ + PropagationDynSK.cc\ + GroupSK.cc\ + GroupDynSK.cc\ + DocumentSK.cc\ + DocumentDynSK.cc\ + HEXABLOCK_GenSK.cc\ + HEXABLOCK_GenDynSK.cc + +ElementDynSK.cc: ElementSK.cc +VertexDynSK.cc: VertexSK.cc +EdgeDynSK.cc: EdgeSK.cc +PropagationDynSK.cc: PropagationSK.cc +LawDynSK.cc: LawSK.cc +ElementsDynSK.cc: ElementsSK.cc +CrossElementsDynSK.cc: CrossElementsSK.cc +QuadDynSK.cc: QuadSK.cc +VectorDynSK.cc: VectorSK.cc +CylinderDynSK.cc: CylinderSK.cc +GroupDynSK.cc: GroupSK.cc +HexaDynSK.cc: HexaSK.cc +PipeDynSK.cc: PipeSK.cc +DocumentDynSK.cc: DocumentSK.cc +HEXABLOCK_GenDynSK.cc: HEXABLOCK_GenSK.cc + + +# header files must be exported: other modules have to use this library +nodist_salomeinclude_HEADERS = $(BASEIDL_FILES:%.idl=%.hh) + +libSalomeIDLHEXABLOCK_la_CPPFLAGS =\ + @CORBA_CXXFLAGS@ \ + @CORBA_INCLUDES@ \ + $(KERNEL_CXXFLAGS) \ + $(GEOM_CXXFLAGS) \ + -I$(top_builddir)/salome_adm/unix \ + -I$(top_builddir)/idl + + +libSalomeIDLHEXABLOCK_la_LDFLAGS = -no-undefined -version-info=0:0:0 + +libSalomeIDLHEXABLOCK_la_LIBADD = \ + $(KERNEL_LDFLAGS) -lSalomeIDLKernel \ + $(GEOM_LDFLAGS) -lSalomeIDLGEOM \ + @CORBA_LIBS@ + +# These variables defines the building process of CORBA files +OMNIORB_IDL = @OMNIORB_IDL@ +OMNIORB_IDLCXXFLAGS = @OMNIORB_IDLCXXFLAGS@ +OMNIORB_IDLPYFLAGS = \ + @OMNIORB_IDLPYFLAGS@ \ + -I$(top_builddir)/idl/salome \ + -I$(KERNEL_ROOT_DIR)/idl/salome \ + -I$(GEOM_ROOT_DIR)/idl/salome + + +IDLCXXFLAGS = \ + -bcxx \ + @IDLCXXFLAGS@ \ + -I$(top_builddir)/idl/salome \ + -I$(KERNEL_ROOT_DIR)/idl/salome \ + -I$(GEOM_ROOT_DIR)/idl/salome \ + -I$(top_builddir)/salome_adm/unix \ + -I$(srcdir) +# -I$(srcdir)/SD/Vertex +# -I$(srcdir)/SD/Edge + +IDLPYFLAGS = \ + @IDLPYFLAGS@ \ + -I$(KERNEL_ROOT_DIR)/idl/salome \ + -I$(GEOM_ROOT_DIR)/idl/salome + + + +# potential problem on parallel make on the following - multiple outputs +SUFFIXES = .idl .hh SK.cc +.idlSK.cc: + $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< +.idl.hh: + $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< + +install-exec-local: $(BASEIDL_FILES:%=$(top_srcdir)/idl/%) + $(INSTALL) -d $(DESTDIR)$(salomepythondir) + ls $^ | while read file; do \ + $(OMNIORB_IDL) $(IDLPYFLAGS) -C$(DESTDIR)$(salomepythondir) $$file ; \ + done + +# we want to remove only staff generated for IDL files and nothing more +uninstall-local: + @for modulen in HEXABLOCK_ORB ; do \ + test -d $(DESTDIR)$(salomepythondir)/$${modulen} && echo "Removing $(DESTDIR)$(salomepythondir)/$${modulen}" && rm -rf $(DESTDIR)$(salomepythondir)/$${modulen} ; \ + test -d $(DESTDIR)$(salomepythondir)/$${modulen}__POA && echo "Removing $(DESTDIR)$(salomepythondir)/$${modulen}__POA" && rm -rf $(DESTDIR)$(salomepythondir)/$${modulen}__POA ; \ + done ; \ + for filen in $(BASEIDL_FILES_PY) ; do \ + echo "Removing $(DESTDIR)$(salomepythondir)/$${filen}" && rm -f $(DESTDIR)$(salomepythondir)/$${filen}* ; \ + done + +mostlyclean-local: + -rm -f *.hh *.cc .depidl + +# we use cpp to generate dependencies between idl files. +# option x c tells the preprocessor to consider idl as a c file. +# if an idl is modified, all idl dependencies are rebuilt + +.depidl: $(BASEIDL_FILES) + @echo "" > $@ + @for dep in $^ dummy; do \ + if [ $$dep != "dummy" ]; then \ + echo Building dependencies for $$dep; \ + $(CPP) $(C_DEPEND_FLAG) -x c -I$(srcdir) -I$(KERNEL_ROOT_DIR)/idl/salome -I$(GEOM_ROOT_DIR)/idl/salome $$dep 2>/dev/null \ | \ + sed 's/\.o/\SK.cc/' >>$@; \ + fi; \ + done ; + +-include .depidl + +# -I$(GEOM_ROOT_DIR)/include/salome \ No newline at end of file diff --git a/idl/Pipe.idl b/idl/Pipe.idl new file mode 100755 index 0000000..8c2f896 --- /dev/null +++ b/idl/Pipe.idl @@ -0,0 +1,49 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Pipe_idl__ +#define __Pipe_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "Element.idl" +#include "Vertex.idl" +#include "Vector.idl" + +/*! \ingroup EXAMPLES + +This package contains the interface HEXABLOCK_ORB used +for %HEXABLOCK component as an example in %SALOME application. +*/ +module HEXABLOCK_ORB +{ + interface Pipe : Element + { + Vertex getBase() raises (SALOME::SALOME_Exception); + Vector getDirection() raises (SALOME::SALOME_Exception); + double getInternal_radius() raises (SALOME::SALOME_Exception); + double getRadius() raises (SALOME::SALOME_Exception); + double getHeight() raises (SALOME::SALOME_Exception); + }; +}; + +#endif + diff --git a/idl/Propagation.idl b/idl/Propagation.idl new file mode 100755 index 0000000..41212a0 --- /dev/null +++ b/idl/Propagation.idl @@ -0,0 +1,50 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Propagation_idl__ +#define __Propagation_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" +#include "Edge.idl" +#include "Law.idl" + + + +/*! \ingroup EXAMPLES + +*/ +module HEXABLOCK_ORB +{ + typedef sequence Ways; + + interface Propagation : SALOME::GenericObj + { + Edges getEdges() raises (SALOME::SALOME_Exception); +// Ways getWays() raises (SALOME::SALOME_Exception); + void setLaw(in Law l) raises (SALOME::SALOME_Exception); + Law getLaw() raises (SALOME::SALOME_Exception); + void setWay(in boolean w) raises (SALOME::SALOME_Exception); + boolean getWay() raises (SALOME::SALOME_Exception); + }; + +}; + +#endif diff --git a/idl/Quad.idl b/idl/Quad.idl new file mode 100755 index 0000000..1248023 --- /dev/null +++ b/idl/Quad.idl @@ -0,0 +1,72 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Quad_idl__ +#define __Quad_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "GEOM_Gen.idl" + +#include "Element.idl" +#include "Vertex.idl" +#include "Edge.idl" + +/*! \ingroup EXAMPLES + +This package contains the interface HEXABLOCK_ORB used +for %HEXABLOCK component as an example in %SALOME application. +*/ +module HEXABLOCK_ORB +{ + interface Quad : Element + { + Edge getEdge( in long n ) + raises (SALOME::SALOME_Exception); + + Vertex getVertex( in long n ) + raises (SALOME::SALOME_Exception); + +// void addAssociation( in GEOM::GEOM_Object geom_object_2D ) +// raises (SALOME::SALOME_Exception); +// +// GEOM_Objects getAssociations() +// raises (SALOME::SALOME_Exception); + + void clearAssociation ( ) + raises (SALOME::SALOME_Exception); + + long addAssociation( in GEOM::GEOM_Object geom_object_2D ) //CS_NOT_SPEC + raises (SALOME::SALOME_Exception); + + GEOM::ListOfGO getAssociations() //CS_NOT_SPEC CS_WARNING: not working when reloading a document + raises (SALOME::SALOME_Exception); +// +// void removeAssociation() +// raises (SALOME::SALOME_Exception); + + void setScalar( in double val ) //CS_NOT_SPEC + raises (SALOME::SALOME_Exception); + + }; +}; + +#endif diff --git a/idl/Vector.idl b/idl/Vector.idl new file mode 100755 index 0000000..c6fea39 --- /dev/null +++ b/idl/Vector.idl @@ -0,0 +1,48 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Vector_idl__ +#define __Vector_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "Element.idl" + + +/*! \ingroup EXAMPLES + +This package contains the interface HEXABLOCK_ORB used +for %HEXABLOCK component as an example in %SALOME application. +*/ +module HEXABLOCK_ORB +{ + interface Vector : Element + { + double getDX() raises (SALOME::SALOME_Exception); + double getDY() raises (SALOME::SALOME_Exception); + double getDZ() raises (SALOME::SALOME_Exception); + + double getAngleX () raises (SALOME::SALOME_Exception); + double getNorm () raises (SALOME::SALOME_Exception); + }; +}; + +#endif diff --git a/idl/Vertex.idl b/idl/Vertex.idl new file mode 100755 index 0000000..e10c993 --- /dev/null +++ b/idl/Vertex.idl @@ -0,0 +1,68 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Vertex_idl__ +#define __Vertex_idl__ +/*! + \defgroup EXAMPLES SALOME EXAMPLES components + */ +#include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" + +#include "GEOM_Gen.idl" + +#include "Element.idl" + + +/*! \ingroup EXAMPLES + +This package contains the interface HEXABLOCK_ORB used +for %HEXABLOCK component +*/ +module HEXABLOCK_ORB +{ + + interface Vertex : Element + { + double getX() raises (SALOME::SALOME_Exception); + double getY() raises (SALOME::SALOME_Exception); + double getZ() raises (SALOME::SALOME_Exception); + + void setX( in double x ) raises (SALOME::SALOME_Exception); + void setY( in double y ) raises (SALOME::SALOME_Exception); + void setZ( in double z ) raises (SALOME::SALOME_Exception); + + void setAssociation( in GEOM::GEOM_Object geom_object_vertex ) + raises (SALOME::SALOME_Exception); + + GEOM::GEOM_Object getAssociation() + raises (SALOME::SALOME_Exception); + + void clearAssociation() + raises (SALOME::SALOME_Exception); + + void setScalar( in double val ) //CS_NOT_SPEC + raises (SALOME::SALOME_Exception); + + }; + + +}; + +#endif + diff --git a/internal_doc/AssoLines.gif b/internal_doc/AssoLines.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab702cebc1df81a5f4302133e03205ec9f465509 GIT binary patch literal 8422 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 + + + + + Associations par lignes + +  + + + + + + +
       
      + +

      +

      HexaBlock

      Associations par lignes : précisions
      + +

      Retour +  


      +


      +


      Ce document établit les limitations actuelles des associations par lignes.
      +

      +

      L'utilisateur peut +définir des associations multiples au moyen de deux fonctions :

      +

      + int associateOpenedLine (Edge* mstart, Edges& +mline, Shape* gstart, +

      +

                               double +pstart, Shapes& gline, double pend);

      +

      int +associateClosedLine (Vertex* mfirst, Edge* mstart, Edges& +mline, +

      +

                               Shape* + gstart, double pstart, Shapes& gline);

      
      +
      +


      Ces deux fonctions +appellent la même fonction interne : 

      + +

      + int associateLine +(Vertex* vfirst, Edge* mstart, Edges& mline,

                         Shape* + gstart, double pstart, Shapes& gline, double pend);

      
      +

      Cette fonction effectue +les contrôles généraux réalisables par le modèle, trie les edges puis passe la +main à une fonction d'interface avec Cascade :

      + int associateCascade (Edges& mline, int msens[], Shape* gstart, + +

      Shapes& +gline, double pstart, double pend, bool clos);

      Les arguments sont : +

      +
      • Edges& mline : + liste triée des edges +

        +
      • int msens[] : + indicateur (V_AMON ou V_AVAL) donnant le sens de chaque edge.

        +
      • Shape* gstart : + Forme associée au premier edge. +

        +
      • Shapes& + gline : Formes associées aux autres edges (peut être vide).

        +
      • double + pstart : Paramètre indiquant le point de départ de la première + forme. Si la ligne est ouverte, pstart est compris entre 0 et 1. Si + la ligne est fermée, seules les valeurs 0 ou 1 sont acceptées. +

        +
      • double + pend : Paramètre indiquant le point de départ de la dernière + forme. Vaut 1 si la ligne est fermée.

        +
      • bool + clos : indique si la ligne est ouverte ou fermée.

        +
      +

      +
      +

      +

      Fonctionnement +du programme associateCascade +: +

      +
      • Ordonner + les edges (fait dans associateLine)

        +
      • Transformer + les Hexa::Shapes en lignes (TopoDS_Edge) : elles sont rangées dans + tabg_line [nblines].

        +
      • Créer + des courbes (type BrepAdaptor_Curve*) à partir des lignes, c'est + le moyen de calculer le point situé à une certaine abscisse + curviligne. Les courbes sont rangées dans tabg_curve[nblines].

        +
      • Mémoriser + le longueur réelle de chaque courbe et la mémoriser dans + tabg_length[nblines]. +

        +
      • Définir + les points extrêmes de chaque courbe (type gp_Pnt) et l'enregistrer + dans tabg_point [2*nblines].

        +
      • Ordonner + (et contrôler) les lignes/coubes au moyen de la fonction + vertexInLine, laquelle met à jour les tableaux tabg_orig (donne le + sens de chaque ligne) et shape_posit (donne le classement des + lignes).

        +
      +

      +
      +

      +

      Si +la ligne globale est continue (les courbes sont jointives deux à +deux), on peut procéder à l'association ligne/eddge.

      + +

      Le +premier point (défini par tab_gcurve[0] et pstart est associé au +premier vertex (défini par mline[0]->getVertex (msens[0]).

      +


      Il + faut ensuite définir la (les) portion(s) de courbe associée(s) à + chaque edge.
      Chaque + portion de courbe est définie par la représentation brep de la + ligne associée et les paramètres de début et fin.
      +

      + +


      Une + première tentative fut d'utiliser les abscisses curvilignes +relatives de chaque type de ligne. Cette tentative fut rejetée d'une +part car elle ne convenait pas à la bielle (voir dessin en annexe) et +d'autre part l'idée d'établir une abscisse curviligne sur le modèle de +bloc contredisait l'idée selon laquelle les coordonnées du modele de +bloc n'ont pas d'importance.

      + +

      On +se contente d'établir une relation entre les n lignes (de la CAO) +et les m edges (du modèle) (voir figure 1) : +

      +
      • soit + sm1 la position relative du premier vertex du ième edge : on prend + sm1 = i/nbedges

        +
      • soit + sm2 la position relative du second vertex du ième edge. On a donc + : sm2 = (i+1) /nbedges;

        +
      • soit + sg1 la position relative du premier vertex de la jème ligne. On + prend : sg1 = j/nblignes

        +
      • soit + sg2 la position relative du second vertex de la jème ligne : sg2 = + (j+1)/nblignes.

        +
      +


      +

      +

      Le +ième edge et la jème ligne s'intersectent si : sg1 < sm2 et sg2 +> sm1.

      +

      On +doit alors déclarer qu'une portion de la ligne est associée à +l'edge.

      +


      +

      +

      La +portion de la ligne est délimitée par les paramètres  normalisés (compris entre 0 et 1) :

      + para_deb = sg1 < sm1 ? +(sm1-sg1)/(sg2-sg1) : 0.0;

      +

      +para_fin = sg2 > sm2 ? +(sm2-sg1)/(sg2-sg1) : 1.0;

      
      +

      Le +second vertex de l'edge est associé si : sg1 <= sm2 <= sg2

      +


      +

      +
      Asso ligne

      Retour au début 




      + \ No newline at end of file diff --git a/internal_doc/Bugs.html b/internal_doc/Bugs.html new file mode 100755 index 0000000..392ec3c --- /dev/null +++ b/internal_doc/Bugs.html @@ -0,0 +1,76 @@ + + + + + + Quelques bugs + +  + + + + + + +
       
      + +
      +

      HexaBlock

      Quelques Bugs
      + +

      Retour +  


      oooooo
      +


      +

      o Bug 016 (Corrigé)

      La fonction cut sur une ligne associée ne gère pas l'association.


      Retour au début 


      +

      o Bug 015 (Corrigé ?)

      Salomé crashe une fois sur deux.

      Ilsemble que la fonction getBtrep() soit à l'origine de ce dysfonctionnement.

      Retour au début 


      +

      o Bug 014


      +Une grille créée par makeSpherical ne fournit pas le bon nombre d'hexaèdre maillés.

      ...

      Retour au début 


      +

      o Bug 013 (Evolution)

      Association ligne fermée (bielle)
      Problème de cohérence entre le sens de parcours d'une ligne (un cercle)  et les edges associés.
      Le sens étant différent, les mailles sont "croisées"

      Solution +retenue : modifier le vertex et l'edge de départ, de façon à "inverser" +le sens de parcours des edges du modèle de blocs.

      TODO :

      Modifier la spécification de la fonction associateClosedLine ()
       L'argument "paramètre" de type réel indique bien un point de départ sur la ligne, mais pas le sens de parcours.

      On décide : 
      • de choisir une des deux extrémités de la ligne (on abandonne l'idées des points interrmédiaires)
      • de définir l'extrémité au moyen d'un point.

      TODO (2) :

      Cette +méthode convient pour un contour ferrmé constitué de plusieurs lignes, +mais pour une courbe fermée unique, l'ambiguité persiste : A suivre ...

      Retour au début 

      +


      +

      o Bug 012 (Corrigé et validé)


      Erreur intempestive :
      Message : "associateLine : Le contour n'est pas ferme"


      Programme HexDocument_asso.cxx  corrigé.
      (indice modifié suite à une impression de mise au point)

      Retour au début 

      +


      +

      o Bug 011 (Corrigé et validé)

      Les associations par ligne ouverte provoquent une erreur (détectée par pa partie PLUGIN).
      Il y a incohérence entre les éléments associés à un edge : les lignes doivent être jointives et limitées entree les deux vertex.

      Correction du fichier HexUseCascade.cxx.Le sens des lignes de Cascade : la paramètre varie parfois de 1 vers 0.
      Le programme tient désormais compte de cette particularité.

      Retour au début 

      +


      +

      o Bug 010

      Un message résiduel lors du maillage de la bride sans associations.

      +
      "Bielle:hexas" has not been computed.


      Retour au début 



      +

      o Bug 009 (Corrigé et validé)

      • Le fichier  BREP associé à la bride est incorrect.
      • Il fait sortir de Salome.

      Le fichier bride.brep est corrompu, on ne doit plus s'en servir, il a été supprimé de la base CVS.

      Il est remplacé par une construction directe avec GEOM, cette construction est incluse dans le fichier en attachement.

      La constuction directe de la bride est effective.

      Retour au début 



      +

      o Bug 008 (Corrigé et validé)

      Cas de la bielle.py. Tous les groupes de maillage affichés par SALOME sont vides. 

      Retour au début 



      +

      o Bug 007 (Corrigé et validé)

      Le maillage hexaedrique de fonctionne pas.
      Pris en charge par F. Kloss.

      Retour au début 



      +

      o Bug 006 (En cours)


      Il +semble que les éléments donnés en résultat de la méthode +«disconnectEdge» du document ne sont pas des éléments du modèle de +blocs en cours d'élaboration
      • ce problème intervient dans le cas de la recette de l'enceinte simplifiée
      •  il +serait souhaitable que les nouveaux sommets, créés par les méthodes +pour déconnecter, ne soient pas exactement les mêmes que leurs +originaux afin d'avoir un visuel immédiat

      Bug non reproduit.
      Testé en C++ direct puis en python. Voir pièce jointe.
      Ce script génère deux fichiers vtk corrects.
      A voir ensemble Jeudi.


      Retour au début 



      +

      o Bug 005 (Corrigé & validé)


      Les +points de construction (centre de cylindre, etc.) sont aussi maillés ce +qui donne un maillage incorrect, il y a   solutions possible à +valider avant la correction:
      on distingue 2 notions:
      • points et vertex sont deux entités distinctes comme dans CasCade
      • point = vertex comme dans GEOM et HEXABLOCK actuellement, et le mailleur traite uniquement les sommets connexes aux hexaèdres
      On +choisit la solution 2. 8 fonctions ajoutées : countUsedVertex () ..... +countUsedHexa(), getUsedVertex (nro), .... getUsedHexa (nro)
      Ces fonctions devront remplacer les appels à countVertex() ....   getVertex(n)  dans le mailleur.
      Les fonctions sont codées et testées unitairement. Le mailleur n'est   pas encore modifié.


      Retour au début 



      +

      o Bug 004 (Corrigé & validé)

      • Il y a une incohérence entre la documentation et la fonction doc.addHexaVertices


       Le source a été modifié pour être cohérent avec la documentation


      Retour au début 

      +

      o Bug 003 (Corrigé & validé)


      • En Python, il manque toutes les variables, qui sont documentées, telles que Q_A, E_AC, V_ACE, ...
      Ces informations ont été ajoutées au fichier Elements.idl


      Retour au début 



      +

      o Bug 002 (Corrigé & validé)

      • la méthode «mergeQuads» du document échoue
      • cette correction est nécessaire pour le cas de la bride

      1) Sur le cas proposé, l'ordre des deux premiers arguments de la  fonction mergeQuads était inversé.
      L'ordre est mergeQuads (q_cible, q_ancien, v1, v2, v3, v4)
      Action : Modification du script utilisateur + mise à jour de la  documentation.

      2) +Après correction, il s'avère que les arguments de type +Vertex  v1 ...b4 étaient invalides, lors du second appel à +mergeQuads, à cause  des éléments détruits lors du premier appel. +Ces éléments sont difficiles à localiser sur le modèle python et +inutiles dans la mesure ou les deux quadrangles à fusionner sont  +jointifs ; il suffirait d'appeler la fonction closeQuads non +encore  accessible à l'utilisateur python ou IHM
      On convient de +modifier l'ordre des tests : On teste d'abord si les  quadrangles +sont jointifs avant de s'intéresser aux vertex passés en  +argument. On pourra alors remplacer les vertex de positionnement par la +valeur None.

      Retour au début 



      +

      o Bug 001 (Corrigé & validé)

      • La méthode «getShape» du document fait sortir de SALOME.
      • après la correction, il faudra mettre à jour le fichier  «hexablock.py»

      L'objet "shape" associé au document est fourni par la procédure utilisateur :

      bride = geompy.ImportBREP("bride.brep")
      doc.setShape(bride)

      La méthode setShape, de HexDocument_impl.cxx fonctionne en deux étapes :
      1. l'argument transmis par le python est un objet Corba de type GEOM_Object.
      2. Il est traduit en objet Cascade shape de type TopoDS_Shape (Cascade) via la fonction geomObjectToShape()
      3. Il est traduit en chaine de cartactères de  format BREP par shape2string
      4. La chaine de caractères, entité portable est associée au document.

      L'objet "shape était relu dans la procédure python systeme "hexablock.py" :
      shape = doc.getShape().
      Or, + si la méthode setSchape est capable de transformer un GEOM_Object +en TopoDS_Shape, la réciproque n'est pas présente actuellement dans GEOM

      La +procédure hexablock.py va donc utiliser une nouvelle procédure +doc.getBrep(), qui nous permet de transmettre via Corba un objet de +type standard (chaine de caractères).

      En conséquence, la mise à jour de hexablock.py a été faite et validée.

      Retour au début 





      + \ No newline at end of file diff --git a/internal_doc/HemiSphere.png b/internal_doc/HemiSphere.png new file mode 100755 index 0000000000000000000000000000000000000000..9d5c11d33bcd866a707ea21dcd1c3c0095a9bed9 GIT binary patch literal 15383 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 G@BRk|ua_AB literal 0 HcmV?d00001 diff --git a/internal_doc/LastNews.html b/internal_doc/LastNews.html new file mode 100755 index 0000000..573baf8 --- /dev/null +++ b/internal_doc/LastNews.html @@ -0,0 +1,26 @@ + + + + + + Last news of the front + +  + + + + + + +
       
      + +
      +

      HexaBlock

      LAST NEWS
      + +

      Retour +  

      oooooo
      +


      +

      o 15 Septembre 2011



      Retour au début 


      +

      o 14 Septembre 2011

      Hexa2 : Ajout de la fonction doc.getBrep() qui remplace doc.getShape()

      Hexa3 : Ajout de la fonction doc.revolutionQuad
        Ajout des tests unitaires : src/TEST_PY/test_unit/hexa_quads.py et revolution.py.
        Cest tests créent des fichiers vtk à visualiser sous ParaView.

      Retour au début 


      o Aout 2011

      Première +version ...

      + \ No newline at end of file diff --git a/internal_doc/PartRind.png b/internal_doc/PartRind.png new file mode 100755 index 0000000000000000000000000000000000000000..09fa90ad5a7c01f169fb00266c99ef9b4efc6a21 GIT binary patch literal 10590 zcmc(_X*`te8#gXRGWKMWrDQ0{*s`}F8X+QE1}P)S3}c(J3vgCYnQZ?fX5(TSH7W|rlLR2UEj05?>-qzfAJ*eMNWEe)aw_$m77`WOGXVL zVZEzei&=UH&p9}_1KWRsIXFI_LmxTE9S!18g~2)A=(9L)@`->s9wiVtgkDp*{y7bS za!~&dr$p+tH*mn1`(uCR3BP+9^@dV79FmA1N1oi+?VVoOqeR7k3&0*mEQ9Pl%G4l{ zKV?m+Pz&agcO)7lb?STYTz|`x-u=D(G1Ir=anGl7*oYnX{Mt=35%42o;L?KPxLu&@bqKV|wrHZ*RM4ev?LV5J zzqEp~WuUA4VpjN9nh`_Ie*qUTtiX#3D604RpTwweWS5GQ2w2lGZtP4oFDeE2ixdId z+7nD)$OI|7T)&DTqna5-6Sk)icC*cEF!-#8%%jRV$09F6iG*32YXJoM1@GHCu;Qdl z+v^~cm7VIhEImg2U!PDni=ogydQ8PCpQ#9BJTml6BzNoR9kV`<&exLIG&_|~zl6z_ z3hziD_TBAPWpF8OnkkS~9D&6>e0e=2Xwa^NY-^uPUtz+TI`h;3urW=AC(RjB08aXsfHA_z4W!upo@#DM2) z$bW9z?v)Y>$_pVoc)F?!0^BBtp1j#Yt*$8XR(KFzcaQs5>wWPvIzekA(;-S~TRnOQ z^;^6$Av;~l1xQ$6AkRv{RP(EyI7j{_%-@~iFx!R?i<~yPP_G4G5n7&2;HvAVFWf}O&(H}nh!{7%$fyOTF{afHSg4~s*L5ob&Dvv7TXFhD^WAxk?k5r>Zj09f#hKmCo*Y#(7ET4(gFxO&a zs2oRt-3?jIuTaqvx>yuZ!&N}0sJ?bVn5R$H8gZJj@?7V#)X!LTD0?HyEG-`ls5Z+$ z8@|qv(9~e&EjACBz_mY`vm%!av?46;roB#aO1l^hii)fuxth;%1G4|sg|0nj?xljO z;6M0N5X`=H+pcW8K)t^*isZgmRP5NANL@C;8e4N>bV=}plSk)$aRDSLS>jA@YD?;%jh(d%f#%s&2DT)^w4`w2IIC4x*CeJ-<+j=^b$D~B;=JOm^Mey~4CqqDA) zUM^C9&p5F!HNaIi8Z_kyu5*1V=;s-K^CIX|A2!x3WwOt}{TAKG#$L-=pi;g|=2Z$4 z>*9guTR&WDT<_&F~8}W!xF166>5Dk z8^=dWj7FhO7cLI{<<18!z~I`JNkkiD%(76v#HEuneP0*xdx zz4|iaedoL@a(o-i8tD_?7DwU*dC#hkixXc-8O3ZY$(9lB;*h0ktvQN z_ZVy<`~3||PxujD-}HofLC`W0k|KnPjE23tX#^b}h<|=gx!SMNy2%%l_cl6@z|~y^ z2soz}x6{dSpg+8*d|Za(b3k=zy^YuNddrl}>UqK-hjWff)SZ!~>2nDgAPorAEsN-C zGi$4K%*S;bDxP1udkN%J=32pLjjug|Q;;zDIkJu7nJkQNklJp37|A}p%lS_=!>>2q zR%|3CPHI;_u}M#F97s%?n7{@{#*+%;?d1HW8=o67^^;sJ$uRhvrLo{JIMYjV{L|wb z_Ry~e;7ED2OmMX)$`vuo`T9Na-y<4eZaH*1`I|(_@qWARQ*|nm(V*2q9sgGX5a_#y zZ@R6eJW)?Pq5kL4u0vg^GH0SeKfXT(=Jn}CgZzFM2~lOxu98QY#|s_1H5?;(AkdGg zeOPG|xI6Mp6gt=y&u5rKRME)Zv`ANK$pc1T^_Oo35X<$4AKs=#|G6e9Ug-j2E7d4&>;w4vT(c4Ko=^hQJ1c zhLAH^tyZXO`Ji>6{#<<8lSOEhh#XP#FPu`-b3|p%%g3azZVbT7WY97dq8mDbgbaxY zXw{PnzA1YhzaCh(*NZ2=$zbJ|~YBui1BIBBa<~n`?DWCj)rGF+{ z>Yvnwn%$0K(T7!K0DHh#&Bu&>&NJTjVINlTB@yZeU%1ZH?|tUyb?>yaXh%ThNpI+P zBD!s(yHX8#JfSE0(XN5ED16W|McNZZX4e~}uFWz9q6GN^M1 zZ0NnL6xhS9lSQV?x0QK>i3UN?uZA+Jwl=gK*?3i&6|_8&coU--<4sIype#Dph@aDf zv$3}TzdgIqPspqt)^+G~gTYIB@#R~W9{+Bya4ZwsVbd}ee3Y!^(65eUYyV-yO2jh* zhBx1O-}w66-t4L!f5f zTEI+EbdlUOs8!v8kxrPB+{{^O4nX0FKm6I%gnZgMv+L{ekQ8a2#D;NT3Ejpdxc~-%^{ue)_;arRdJ0 zH4Up8t<`MXn_41Z{G*wybEc%C4k?wqvpQq;kC`wXZ05s(@rR`SyWj+QDR5B9I;Wxu zyhQf!)Cw?CnWbqLqCu}s{gPI{6wuw=vEZrL_Pbfnp*^{;b%2xAZve39 zx&);#KG`(~P{7Mom@xLH8WRMFOb>v6>pwOWWRdlp-6EJfx}^%ZOk|wthWrhynqmC< z8HE;m2-Ga%l{(}ut9jtf*bMMe5*4fZbyRb3$agI=KBos=RNu{?%6ysb4}-60t{O2S z1q!ty9>v?7ug0wDS?B{z)l4yLT>j`2t)_oon!wX!pHYN>y{LfgoXNi9dz(u2>7Asp z$-C2RcEguOObC79HMc)pEp_)iJC9y6dZu#y0Sy6kV?LSKSqi$v3cA*EU)Q}af!b?n>m?<4GR5?MQRNvSg34=NV?ejJZJL~kc zLKg8Yn<{ss05=J*-|8c+F2{wQGE1V$Jubir%;TQBYK!0$zMT)6^2!|bExO9ylX4w} zK*h_Ttf9{HLE;%=rWp|E4@i)D|GbCglstsW&f-71F>}$7oa$C$rc3R%+vHL9%FzWFPAKxuj zv*$HqZ?Sm33_hh)HxqdOsV7DC_r$8T#uIB>h+R=sY)S1K=W`As;0Kv*Yold{KnZdw zG0~TDs{ojz)&-;;>494xkk%xh)3|&SphKgPJrj87Y2rAloYCC7p*;i4S6!4U0GDDE}}0mX3P{PeH~ypVuo?bg73)=%B(=`GxsfGjU4F_1WJVW7>rZllM(jmr_h8S+fN`us#|Kkuo!Sq@cBNjx@r z!3iKejy^eX`Llz=DT9?WZhI%uo)t0PBD>xJsbGSZhm@wMDlXegqy*nMb1XWE*w+{k zT#{O-<#lH~xmUEtzTv?xRJ=*lrjJnlW*`)9C(MG?aFC?(Qln8JR*8`wL z#cD@3w5iCuWXCP@ zpCc!p^yXAMu+0wyYz3y&fc7Kk$1;r6Hgdct(!GAyb$PAW*bcBK~uF|81>@bQ$PMFbVoK7>m@15IIej^K;}x!SnUd@Fbw{!4Nz6{ z@5;(duhQT9OTNnhDMbogl8}iQ$r1KFjRRC%J9p?bHk}k)m|~W0!2AW7i1V11cZG*o zUwq_>82a<-zayV<$~S!H2Q2n`zdmc#YXoMs#_*(Qt$aU6Pcw-CR)+6SPe%gzVsEJ2 zx-|wno4s8o9tnVcM~8RGU{Nl@PLI{vbt!|Nr2Xs!L$>E9H+`0xyzKO`l9k9Wzpzt>OH_2@Esf@u#9at)Mpcwzg(Qq7lMg%8(TEW6`nY5q+ z{Q+!8j9W_K!>`0!A8)b@o~eRR#fS@O9=Gd(z2BDYkcz4wSI?mGCitB%+weHJt0h?n0}l{ zjgt<=PlUn>VYE0uI6wRrf6~XaA)R2L> z<*(j})B&EH3nb0xTgue~q6{nHx+ZRSd2^PCNmQb5Y{%{8jTj=3F(h;Wt|?P1clOVh z8e~_IG3!0S<2w+A=1Jj>^M3|}ATXAQVIvo&xPvfeTdPR4>Ba?owO=^|J~9PbzD?O( zq&!v{n~;t;D#9KB z7z?Brw?JB+QUQk9HF7xvfIelJn!f}1v;dE90EKPXDe~q|B;gt0ncaYtbP`1p6+zH)X;rC zsC?#Ay82uKkxyZLAE!$up!Ni6=KA@Xa8S1id?$Gs zrc>f<+|7%s6ud|*nuz5K%c%R^FrP3u$nz; zoJm2zOP$N5VJ$E&uxoq@HBn+Jej>Q)Um8|DP?Tfz4L9xwsy2~7GvbpoMHv;7kzKq{ zuft9hhy>&mK6(A_Ob=BFNa+5!VVI6`_7r|#DnTbE95knH<1W^(Kr}a|(c6(SDgJ>9{vJ`KDeOBonEQiEpT z9nOWBhUsJzl~N36^c9Ez>MX_r?p%Bf9Mqojkg;LZgiQewol%-&Ei zd1UGj_D?doJ9B8q0roOu6mV6Ei$Q+T^eZ5gIKcPChy7L7jbi6fmA2m#-+2iHSBZ(C zf5g)bqWaeRI02f&q;(^>s`et0L`7zZ!fWNxPm9KZx_4sv6Ad`LK{yw9-UKc(7&w~c z)r4H(*%3y15x$H0BhwzOK%kkemx-P7pZhW&HZ7sk7W272CQ{`jG`?qgH7Oya2*RF# zl_g{ckdUR2s_58{SgOfQhi?-|Q<&6scoAZOpv7t)O%+H}fXAibq z81>s!q2a;_HGtcA5xloPe(>wUfo=rgro(SB@0ZBYvwPBIzi1jL2mouzWc&pe=Q?I}OQ5rPY!X z`K`NB<4otdW9j`@Hq_%!5wNf1yHvz=p#+oaLkG7aG-Se>q_j|`>j=Ozdmzxcw~~Zn zTaqHm6p^8stI|@Hb}6as6A(ylJy(~A)j6D_9{Ke(St^P|00&Q7ddg0V4*X*On!;~G zULcZ(&i=%TtJ%mK6@nRDl*K2~2DL!SIMh)WdK?JQ@>XQ|D8`V}f+cYcCBZhsSAn>s za9?S*tW9lnYc&RLGH+aNq`ce{y#2H; znu=_3q0a~2S8>&amVbky40$l)do5e$T7^UkPz3{m)48GMQ z)B4}hGi>Owk!dRN(uAYy57C{Bv`f9CL@uonB4w9-HZX>66@Stl4NA(NQj1HT!sA>9 zJ0o;(M5JDz7y$@<#IX}?OPWc)0`OTXo6>|tizC&$ABhM&gdGyAVRcs>wc9;fQLu>T zXUebwsmPA$s8%IEdGwQ|_2IC_=fX-s)-iOMiltio$(gxUr0Sv2ENXT+K;T@sd)4mc z?#@Cy_6;fXjeg})_{_-};i(~obEgM-NUQPjq5M?55TRH?OIp#HPn0qz%FrGREXItL zgP7>4A^af^-z>j7eMAgB*t>xL zK)QQGp9O(3`RfQTf}gf684PW-;@x1m)a)2(5W9Bz=_+sr-6ktH9VDnqZU(IWQh>W7 zqo+Qt%p?}VK8~Wg4y7$!wGZUw@s&Y8aqSCt3;=kG+^s)}vHTnyC&Ul$0#IE}eE|F_ z-hf9n6BRxfNOX2QeG!$-87`wObtM!iKHA#%+mLg1jc=35D)EZ^-!VVR@f5y<%mH}mKj*A< zq0GVi^pv1wax`_RFXpQaV4nsEJDK0k$I*t)Mfrs~pY$uuLBh*4vdaYi;F%-R?vfwD zaJIw}d7L(y@z?;E&xWww`0x1;%JGV!tdn7b6+nGN%5IK^6R{@}h*$c9hf*^H({F#k zqiX~6XMl4{l0lc2kB8GcPm`QO*>TRu+jC!=6walImA;lQYbQ$8j1Jjr-@1bODy8_$ zdo1MqmvVgd^~)$%QC;XWqcXgr%`WQnhtar{ulb>eZs3qWwEkh*Bvm|``Zi9l03D1Z zrhGN;|E_TE+Z!t4yZs=ZZxr}6U>SOljcGVlJ>#xw2pvh~d+{kwPr*@)A#8_ivFfv> zY>rLj>)jcGCXXUCOcYQudO&`8WJ{lC5am58bH!`s+ImN0^&LlETJRZDUnpu0z!j=>lT9yUHv zWq9Fme8rYxcPHvg)e>PKl0Nl$e2S#cFz^@A3I_1bhbk!#6ob)r!cX{%>sFQ2MGyME z0sXxUx@XGWJ8bzmkL%;v4I8BF@JOt!^k6L9vycnv((Z>)dS}p{9o`!c_L z2)xeIpCyeOs-7A88-NBWq&;V`4>qv>bqLi+h3FL%kpL^E=07z&g2x72o->Qr+Ha0* z_j_%9GvQtI1=P=LAv(Q8B_<&F6hezn?8}tcp*o}&s~sp)l7dBii`bzlAqZM@u%*v3 zkE`@Ef{k+HUsA!S?cqz5jnQS~L8qTWm4w{&YXV<8oLu}`l^`Cq(c}XD`4 z>5ZdTe1%K5(&21o@N&E%k2ht#I#xrg`_z#0FOe@2VXobO;Aqf^3@=vB?r?icW8~g% z0fM>BGqzj*=8!6**QSvql`Q|-spOrtr&fL4-4 z+`U1u6lKgk^%WufgnX?J^Awm-xduI@p{31rtRvHx)x)TMOnl~td6Rjicw(me0$^`J z9HUkY=(8@=WRP2pr>){U6XrYu)Jrm4tmX2tgoQls2+n(;NhSQv0EQ99LrH=~37?+V~zRmC0krnEfy3R1x zkH`9;lj_~n><$>IMU`>hzvUJfEkQ#BUG{K&RFY0SiC=;DwLKZuq zM%v0<+@lP(`wTO83x1Ye-A*DNj&f@Nqpw%O8e(Pxc4H6t;}Foim~ zRHqI#C7~ZhBA8L2O}&(|NlYS|+m~<|tCmxN3nohz2P>Un|Fw61_&s4eeX6b!u*_7( z16JfV*HXCO?{Vh1-qlD)O5>ClFrbijmn9}UtsHe@pPsvqNW-vG5g6ui`LNxX@WbuS zK~Qst!u;as{ndElG3$)Foo2HRUKlqDP7Dcb-M4C~`eG?zge@|;~_ z1O>e8>O2QZefsJipig7Se%|Q*(inDHi|_}C{e#0~!z8%fD(7nZ>Q@tQf5$q#!O_?| zy_VFD)LkHckE9OV1Vy9 zP>2v})|06hX}+;_aEil;sk*@hsW`3BDBau`@t?AcBxo{GX#WYK@f63Gf+^rSp6>to l4ZQz5_xS!FO4&M?3+al=H5;l1?oD!-7~Q>9WAHHi{{!C?JG3hNd70N)ZG?m4qTj2b7W!h}57AAd#X{0wU6j zp~FB5U=SuC1W^#A1|&eF7wMtBtG@Cdy!Af3tYodMd(J)g+;jKYd;j*0wX(b}eB|^I z5C|k}YGPyq0v!qge#Zq50Y@6O=XXIMSwB-F1KWqM7Fham(oW$6E4T~IzcogfxV9Q~ zUrR#xMe>|&Nⅈ>f2qlqNCv0LHD4T7Jf5nZR<*{(p0OuM>1u;mAz*l%Qsi58$>>T z0&wX;r4~tWr>O$x;O9{e&N_^=2(gTl5WvAh#bi6 z&XPqK2vjLZI0`xr76<(y4+R-nAwW;EDWGEpXr42V*@vziX7EM){|^5TuY;fOEU%jr zR7Lg+Uhgvg^7wPmVK{Ub z1#9~|`b!(NnL|pQSGvGN!2qB8zH`HG>aRvQy?FFn*tfOayf=xD(w#qgU*wdBJMQIp zIMwfb!|xBy>h?qI4@*3`(~3gOQIQUGw~7MJsrXM{PD5aKZ}ae9L$#uel&Riv)RHXM zgF9{fzDK>UpL27wy^Cn=LD4Mk$A&F`t(nz0f4*Y&rVBEFhM8>|A2=)&*Ad5*59HK| zEO41$o(?b0&Y~wYBC|v-&$)edyNihKN7F2vG0urpmJEcB*jwguGj&8xxQVIyonfHd zkQnEz|5y)Un~RH1n>@I@4G^wsN!a|5(0o2c=*FbANGZKZr@( ziM!7_Z#D+wP(KQBs9d_&v(GN zKLQiovGkq57uAKy(jV$x^E*6psa@PhEdHzaG4$1nES=XkidC$%VZk8w;_VzR@ zKt^Mv>K(N5v78m+@eSGDu!Xoq+Pe6X?h$A2Xh}FiB;YGt#Y;PmDr|?H6Wt{FGKtvs z%D%g45C#eyA6l3H7rCQui#r!NJG@`JAPM{448TWHa^iSmOv&p?blBeH))s2-)%zTv z{an0I|IPImF7nUWm}jYSQ^B3ee-pf|r|MRoaL8)m@G*m)dauv1J5K;d9@0lP?;JD=W<4<+20CvV6^WtFd)*W5X7@2Pq%JR?i*fU2LWJ zbovG3Mx=*lkN6M$d!f7I-XF6&>;3w$B|`-;abJXP7E~eY%k=XYxiQgCu4;burN>$H zov*&OeOL+ZGgAIBTbD^dHNfE@E0Xv7~RF`p(TEgF`C ziIQIbR387zLuc0UEyRmEmO+Li*7p{12kf~D{kK5JB3~J`1gFujdT0uIVmi^k3HEe?^qu% znV^2xB$48!;mZ=v7;NfsC7x$}Pbp;N*2Fb9XU z0P*iRlr^>9n&hHBi6GHl%q`qrN*^S!P}BR(Qr8;H9_WF|ro_pW-Q>X7xO{sK+)HwMagkAGz3RBHd_;I-}XZi`HZG%42?wD^WO zmA@;NfYoML7^$9QpiT#U!8K18?p+^kbtq6?_bydE|Fl!}I77~I-@_+ZiZv@5({OY1 zGfj#PThRCpds|uUGPdrnIRiaxgV=!kO7ueys_Tkx4G*+t$AsOS^V$90d!f{737^kdm1Z5f7sZ zxznDV7FS)H8uq&uo_0p!;c1c#lu1ocTJQL<#ErjubIC&W_GvkpY>d2zkLZLkdVbT_ z=}uj<&;nSToP}bn}wtlpuEK|23OD>t6JU8gtYPs zQD7MNO!f;tkHvv8xw`|%rSfS*3$$c(du>+bbgNMP91A$_B12BxuBM_~RscVSA*&5I z++j&|Uz|5In;GpDxWYqog#~PR4kaZyv|Ph|Yc)tJF_iG%@g3OI(F+d>+e4ep?C;$q zeH@`5v`;bGioR8}?SFZu%#hQSA&b&z!3{c9DLYLBx98m!3T1(0f{&Rg&gmQjCDDhK z3S9rpE6acoEkC@9!Vz@Bd}*{`sI{Oee}Beo122!a;?E5!N`GPnq`%T3OxFWfxQaFCyR!uqi)Vmt=6RI)jp4EVz}c%3SNd2wjc`a8|H?|n>`wV8^#V;P zW|g938Bk+&lGW)eeMBsD#(vM@^KeqV9X4|iHQGrLQfY~r3RrK@U4PWzK~lpt`y#V^ zH0RYr2ux51D=YgY+SfPBGVILQ%S$wP0GXC+hD}#v6j&@l@N*tMU3TGX)2pSqx;a}% z)1=093MNnA<(Q!de;>Xfa-n3}Qj2354k}?~PJ-MnmA|^(ZBJG!&aHoj6b>XbqW!1o7TL)4eM+&7^j6I)vaN8hCJFi<7T zr!g`5FFfOl+)I7?G_y_X)ZV|EZaxDh!pLND9TmPW>2{NKer^Kiu zPoNBIgiclE4Y`srkP)#OFf{59HfCY`*z>eciR|jZGl}$KiX_oG7FuA1sG~JDBKMY; zf4|tGMizAXkeo6iVv1D&binyCOe7bPYrYRAUj8e(cUxIJq!@#v##2qP?XTGML*c<^%!Qp8 z7W9i81?M~&6EY&25SUMb+bF2kvJH`2$g0lWdphZ2$Yyz{@vX846QScL4k7;AO6$rm+9<%wv1XF~Nv6bZd8h>og17#6c(^EDRD=FH5NRNMAptnA zq+?!r-X(jK_CR_KuvKL8O{D%w&t}~y?w%JWXywy)bzU39%V2?8w1-dIX1bqlaJO*f zYnmzN`)E4OlE|X~eF|He=2UVTUek6VPk8>cMx>S#7Auz|(`l(oat~tsXMT<#66EDE zDFzX+HO4jFxK>zBd0zG8n_ja7SbX#o2&T?a2jc|PDs6l^`2-6o53*mzktn*ctk+Cn z_uPIkLK4je6PU~DkmuggMxw0zmiFdZ4wC=b_0N^Ybr$8KRwRYEgeZDm}Nqfm#h=V?Xl|49F`J8>C%qLJ}xI3g+JyL^H9nV&;l$@UyP~`{Q zhOvrL5?xYBNy>lF1fAaW_Jgc%iC%;%FojDVP@q82Q&Q3(0qre1fGP4oAW;)%s&97| zj01w$l#4`O9^G(A8q>1P_4*6jB?XwiHCtsRh!&~tPVMoD;CO4xQ@3U5m!%=}hK7fj z;QioP-rtWB%nR*38iLEd&(1XV;H7I0=bBppB;$qZ6PJH-p-6rJ*fm_dU6`*=SD~If zzedJ|RHUJ?F?vR&B;+5Gt#HkVUDV=uA zN^^s|HI+i`De%%+H2LO)Y)&amg!DSv+8C#Ovo)>F;-a?hq-F%LrqEk1>I@XezMiQr ztSblkJ{%VmHV!6QR-bkWDL$1B$QJFPB7V+EN7eRRxH_=gNn7ZTcK9*h<}RLK1Fqz~zt-rvyPcVS zPyXf4Q2yxXqQ#h!LDklf6=@||lDmJ{eBeC|CMMg^8Xj&5;Fsy)>wx$A)9NHL19Zq8 zsHg6%$4xE%b4qYRAyMhEw@^g80@NbPvSg<^-oSvfhDAA_R!V29rwzLL@&QVMQZ-MD z;|Yc%V2S1EujXm$!f8}_2D z)-U1E*$o4AK61!-rofCW3~LJEYUoLlk7KBR)`G` zTfXV*=-9k3O)q}!rH$0SV%k!xfhQiN&fB5Y?Oe-jSdp)xm}FgWy!nb)IMS zix(GwI(?57W!8V zKzD=3SQOiH^Z0Bv`cvNZtdAa@3%EiJ&+~V#qSMQQC$dL!rBtyxpPf?Y?hi{SJ!XGz z-F&;*=(_)%2!}8nNz)=buYD|dHgYMdAd%B8I%@#u9i zX~AqjHk&UL1s`*8Q~Y1491~R7cwI1Ckig_Wazs_@XAoy@rjYrXzCTRg+k`{-nqC2F zuuxw)GPRDweYCW6kqJboYRYQWN)wniO8x*JKz;&{`0lXl_{dwdRbxDlKl^wh*aAJ+ z0jNjM+4rfx&~MUuJHq>yD0tJB1_iDFRITgrAmOO0Hjt}WP8s5WQGcPC$m%Qw#lR8K z#PR0p7{!kfF(Fnu|2rilveXfBKI8#!q0)LoAX2i9lbP9wj|8dbQw~$>Ljp11y=L=3 zX>sfxQ}j_L2(V2e7~JNA;Todx>7k&nKhXZaLP#tsMdItRAI`&Q$Uf}Bq`k-8D?bHC z9bcyg0;=5koHoU(8oE1hCC;z8`_}*$j_6c?HXXj?=LIA#nwB43aoXcATizg~1b6_T z{Yp1~@b#4-k{#RInZGu)y{~U#CE>^!e*%*X^mlccC-x-Je6QmJ*0;D^)4d$28>UlZ zUJcxvFXiBf>KblM?Y_0$nkeG#n~>|8`*SJdd;ne89~6I|h?Nis{C5Y3zW?cv0yJz* zD<)N$A#+w@(Z`5#^3C)vWV)KC3-+f-!hcifd+LieY zet=qB3SJAE@$g9u!rncvd*6R=>2^ApD178{iZfG#_9eg_Apamj?BXNMMxloie`M;L zcgREklDzgvO&%%`i*Lf<`qG^7#d(bM&+|S_athGlDD^gIdM!l+v`#J4$U3XH>%D-GK1MT`T3NFhAn- zFEG@z=y?3>RgnB^c6H0l_8gvDq@T`}=TaKOX0dMQyZ$HoU#R~G{j^e~9>CC#qkd)I zShg(`d(SjI9!z8rv{LR%MM_p$b~PwKuVNI%-J}>OL|q;v7Om=>nml+7-QGN&F=3-a zzp5GnI2snNh+NtELekGOhXQVCHMr9KYbvUZL9hO+&A*|`C@876oa)-i=~$f>Q~D)6 zd=e3Is6ZOPrEzSgik^2Urv(giYc8*|S~4cu6YMZCAc54-I?un*O%op~S{QLZYjSt3H*gZLXla&3&_t zgrTa4#?}aeb?pX+^Ps(3*`#h_W?YD}mPY||rl*ZP29Uil{&cN|!l|w~jJYqt91mY; zyEh;+Jn*z}igQZD`VQK4H&OqlLgrrg%~{boeX(;}wu`jj0hEe{%e=5#)6_BJQ=9XN z;Woy&zS#*C$0xx9ncOQFYaQ$r7}X>Xc?D(KVC{Ahdhn4LE9j|X}M`aAvjvM))QZE`NLylhfWA|%=_ z6kVdWsrzTcYF@J5jT!tw*U~Q9Orb#37^ho=Nf+RS<|)3V)Y7G~GF$qEYxuGK?Xdz| zq7ha@oF30J4A%VGq3n@y6^&nRNwkD>-)(362CwWw;ARSYACvdTwlnVC|63W<_#ub# zXHdZ6@Agh9U z9#Z!4cuvRX9@_y^bUO=JGv?EpN)WL!e2=6-|RUg{^5n+QO0KfZx?Pcru0q=&?QkC^L$_(%d8f0p0X;g0L H_V|AQYGVg# literal 0 HcmV?d00001 diff --git a/internal_doc/QuadRevolution.png b/internal_doc/QuadRevolution.png new file mode 100755 index 0000000000000000000000000000000000000000..f0100e3a735fc5876023e8a4b7ab97ebfcdeb1d7 GIT binary patch literal 8572 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 U{~89rs(|+Fbg+A2<9+pi0B{nDY5)KL literal 0 HcmV?d00001 diff --git a/internal_doc/QuadRevolution1.png b/internal_doc/QuadRevolution1.png new file mode 100644 index 0000000000000000000000000000000000000000..c7867c35a2b27877ede282707f20916b19d55aca GIT binary patch literal 17802 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 Tdfo&IlA){G2G|@eo8bQfmz;&p literal 0 HcmV?d00001 diff --git a/internal_doc/Quads_5.png b/internal_doc/Quads_5.png new file mode 100755 index 0000000000000000000000000000000000000000..6bc6e8b3742c4efff5d814a7d34d109f73064134 GIT binary patch literal 5579 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 literal 0 HcmV?d00001 diff --git a/internal_doc/Quads_ABCD.png b/internal_doc/Quads_ABCD.png new file mode 100755 index 0000000000000000000000000000000000000000..bb21c12488389cb6b4d524851a85fdedf4fb2c66 GIT binary patch literal 6635 zcmeHMXIN9q*4_yO(H#WT;|2u<>5AE*h$wIfMS2r#s3AcF0xF`$pqx;m2Ly?9DWVh+ z#CA{wQKB(|(t;A2VgLb&Gzn_J5)S1X?zzu%@ALip{(nF6WOnwo! z8PlY@+IWS<^4ry=HMeWVyYBq`;n~QCFC8vH4x7q&7PD7Rg?)ejYDjM>q>;RSKl zCqyu$#Aafkb7?32jWd~FxOL2uekU1o9k3tpssY( zYhT=8#cQfu*+nMHxOpQnd)iAL{kCKCe1@fyt6#AJ|}=!+O+&biaOFq9bRrxW_#90U;Q! zkcx)$AD4K_nJA?(Sv}!To<`1etS4WdH_Qa<-r0!M1bMz(CuicdS!$ayk!YUv0>5hq zSAYzyt{~>HDnu}u80NoS&V*P3?X~&5Y9kmV zKeW2mD2LT1f(NDT+tyHtGGIrtL7w(^@Ih2C-tvb%{S{RXtaF1=80NgHlO#@weSoTW zUbRMtQg-D83_NdVErPcghp|?wwg}9mw&bVh;tf<qxA^TQ@fwZt4XqT^91bm=L>v~2wtL64ed6{(QHC~d|kGt?CJ|Q5E|h6*g|~Jj3(s_ z|1pjh|H2LQG}y++?XSMAs@@TgUY>_C4|~eeKYqXCxpmm+PhHCPz+No<)1b8YXMfCs zbZVr;TK;TfHWye|-(QvVdZ&rV6$Ms*-`rC&eN)3k+HO9yx-eK+vRhK(>t`clbzt3i zX!f3_?6*hR2P$EKrnucw+P-{fbu7KLwy`fPK;#O)Z9Q293rrda*HY03Pg-#M+6Z&0 z=-}oBU-AM$*Fc8u#G&utnjV^4zu!P++JQ6ez%_MhhREBx36qQ-Ey|i|lR!FNfIpS} zdsBAu-T9?k(=ozAG6-GdVUDaRi8JlSo%U#kltZ%LG$9{O>dX8YzKip?=U6(^f9nNf z(zO;c2>AJ<*|Cu{BufN4rW%tBq7zI%i(oBhRjOG$;bV7qiRXTx$EbS~KYwo@}1REYf=9>Lnwt z9TUOV(v7`dS}v~ntOTdl%yVlYgX_RkUmi%^AdF*+;E5oPtZE1%0T(zYljTE0Dl*V; zH3J#P+~?$8@edN0cP1>_-})4yyMdyixb^vc8xB!jip_mbuxTf_xp8@a-oQtJmOGc{ zrq(P-tXQ0Dr3AMuT;DEZRw*P%i&CiFqjSaI|K(K?+-cjal+Ex5fEcPBC~wapK3~i( z;XKK66+(HwpPyCKnR%LY@0cR4`gSN1!I>jQv7GkAnDzrWohwblm+a~yfRjLS`n<5x zr`hXIMv;aTJLs%Be3Pv2$|d&BeC6MR01mo$8NvLMKRT5#59bHXJWaDYnj2jG~hgoOxni{|_26u1ATrJemy-p1chgk~-%W zo_hpFEpI}o`=|NpQ4FdHvUfN03O+-}l*5zk>&@a!0KBjF26i zML?z(jbyeFDjm5{-`Kd914p0@e!C~O%YD@IsxPcn1QQFkDN>TVJ}_>H8AZSz)knsl zm`uxKV!HJXHPetQdK4&r*@>w;#sJb~`Yg-mWqH$^0w8wEy& z0WSbsl4PsQu_t7WCL~s$uzqaoLtOx^Kc^oE3= zWcdDX;zK>jJ^7RF=U%t{-~30O_fYF?(?5i0i^SR#^CR^idxeaA^%rtdEJ=LV=e@>% z7Jw=Jv?+o$@o&~-TXXh-{+x17B8Lp}kVbwUlEiO#W_aW2mH1;4ocyBS7&G2uiV(5$ zr2h>vB*ng@j$-fbTZh5WvcsPA1nPAlW&Ej_`E2@+`hs_#E8+Vurg7tv`ThlRMnf zju^|dkn8}Z$&S_9q8KzXHOdt8NqkKa(-|6sfXG^AT^$jN~N zfwV|XUFm2n#5Fo`AxDdG;kzP2>NO^&-s16oV>+f(gA$8p{FU_vPgZ%=M_2-U`!KM% z_vyZ;Qp=K*)wfCub}H={X-ysgSR#s;I&|WP?!D+kq`T{56goY*(6)Q(;~!2b`1Ge- zlC4ccNoID-Pam28_Kvhlf@>V=c62aV_;uuZcr{-MJP%|pY2V|@dmw_tZ?h?rhqPtz znt-ki)(>|?6^FHIsg{=xf@#>MJzK|Xe&Ec&(%BoV6?mby&JN0@W^MqmqJA_x`(093 z#9Q~Gk**b~z|vh|^s?fv74*g3mE9x1_1$a(s0guY9*&*vH}u!nBiIH`slYke03RSCl3=sJ(ZZ7{0+(vNiyfE|4zN`0m?m1F)!@ z{!tJ({^f4om97>cJ~+q_yB?X4qc^fJtwf^VR3w2{FIeLDv5Q7)UuK zs%GZXZK|3qGyx9D{YwmIgL~1p0%-Xha(x==)pF9mvW@VWj^}wuaLwK8Y9=1^896sY z>KUjPZ>PB8O(Gr;R^szEaYa#WS9*D`dc#94^DHJys%FVhy;+;g((Dx*UtzLxMQds% ziUMK*jOEnf#T6b6&@sSy?@>XKmJ|$@8tQaiJb2* z@I1O3g{m#Cm;}_VO^t?G!LoN;BN#xPT`O}^e6-J!a!Md znZtS%s=m0Q;a%&(_;bqK-}BEKI*w={QtX9oj3$1^XPxp=e^V)TiAs%IbLdhP8!qp6 zVW8Re(v_2pCR;A=S*5G;b~$q=E^m13HzRjRM?${n(`mOKIU^{RR96E zOKtP;K>k{A^>JKwGWI&KA>mI=01x7>zsjU{CT-NbM4=})W zne$L8i%}H4csyqpyaAxlC2?OXVbXEK6#141aA#{D!6y~94;;k`HuJS?+X;|W2Kus? z3~diSYp!+&ubRbRI36(eNf*pzKe68`1-MB?`{>_Mvp~~~MLW{`IBGbf)v6oI%^KTfY z=z|484e4m+;ZZCPT*6hwG-Ok6uJdzW`;2Jaffx%20>F@zOVO*% zweqpKx!mv-Vyu-(WYMY)#G!(C?o9}?EFES0k77wSS&nM%93Dx*+QK-p$WU5)q7p77 z>%WmC6ahzhEtS@4#1nYwZSa=+mLG{?tYHYUQIld$0`J!HwI)AxqeOzNE&p0lh9-mD35FIh z#}bO*@KlDTEWg-~hUB=fEiWw!l9a$goJ#FzoW5bonvrgtiW5gEff)k)2Dw*QhGsD^ z@g|X)tEKI_Vl4h9S-wG1wgt>e%V&mMEP_`dlU2e#DhzWlEwJYaHqQALqC4}|Ri7zc8*@F64~Vs@gn@*Ay?^f8jR1(oW`^`TG$g2u=C;AdQc?8> zyB6bgMUzq!pdv$}OG+s5MuOjpk^LVBO{?knt7XG`JA`rdIoxo*_tIE>AWaP~7aBRB zfQ8=A^T$`(EV9sAOuP{U7&)=Ao>;HA>zoqXk9IlRk?pS{vvwnsaf3|D8G{3Uv0R{4 zozYz8?BJ4~=hD6}bK&!z?b-;}ORpFazCFo(I{WtH#|*u-C6aF!*3+^L9)FFCoc-|- z&7PMh-piWOiLx&7oScnk~O=msglw_mspzhL@pzi)xc7XQuK@0Lm+t@kXhY za8w3r|7poa44~dh`TlryaHCF1;vCL|xhwDRb3cO6OelVSC^MK`eef67wEQ)bb@-Nj zG20K&@hib9cCMAMVG|MwVk5vyZ7G)3x`bi`Ko`B47~k<)I^o3O0dRe1SuF?d2g!xN zyp`7m17RJ0p=3o>8{z)F7tC+hPG5Z!hmu~eX+au+^D5YWR6UT0o_sBl7h{3K4wpr^ zcUMXMFY(fuEF;6qIak_XAh)TObt<~o$)J*hRaL2n0LqZe@(*OhwZUrI6b)vld}&VGiSAt}?yMDxpSFniDU=}!-lq~oQT-ZK}Fr1Bfnmol@& z6$jUDPN5Dvj=#=s^)r0qGt-O=O7h4ttw;GQo99zYp{KOQ)?3o_UNt_jWOu3wG&GSQyF$)gq(Q#*r*TU^C|F z+D-lX-?wQPTldv$6yi?a+DZX6yMS207Dp3C-r`iBksN}NO-=r9Gf&;R5O4Ap0MU5-_G=_S8H`3|JeL6g9&f)^#u?JD{p zECLN^at@l_Rpax>IQXzotSGWSyH}-rOc`L+?Yf@r=?3VPd0W~fN1a=pQ!|gNX3e%ql z;=V{0y(`S&LUWS72&K$1n0HU?-%>Z_7$T<2mHoN+e63DJj0Gtkia2UrEf*SaRu+<- pDx6*dLFT}@|JT1hh8HlOw?5c=&*sD^_!9?m-r-^Ymo4?&{{Y=578L*h literal 0 HcmV?d00001 diff --git a/internal_doc/Quads_AC.png b/internal_doc/Quads_AC.png new file mode 100755 index 0000000000000000000000000000000000000000..30c0b642bc925d66b28ca682a2ad235bae9fc685 GIT binary patch literal 7403 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 WUpYvA1$@MWIsfkAaMzBK^nU;h^OFAn literal 0 HcmV?d00001 diff --git a/internal_doc/Quads_ACD.png b/internal_doc/Quads_ACD.png new file mode 100755 index 0000000000000000000000000000000000000000..d1439bb060cd5d52eaaa5b4a4552f4d600f8fd4c GIT binary patch literal 6679 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 literal 0 HcmV?d00001 diff --git a/internal_doc/Quads_ACDE.png b/internal_doc/Quads_ACDE.png new file mode 100755 index 0000000000000000000000000000000000000000..67fdb79578a01ed9012997ea4a5d1b46851f2195 GIT binary patch literal 6722 zcmeHMeK?ct-@i6C-Cg6Rx?Q8XBT`D+5J}w;q71jBpQN?POI`}0iKezRDw4O%TQx6} z>ej7H*s>PoJvJ(tx736}HPk&(&*^!7$MHPJ^XK#T<2ZJ>&g(qS?|FXTKi}_l$=%IK zeW~tJ2!ho2?s4#dAoK_DBP~ILH&kwK4Fu`_ve#jk=jnpU0n@U>y|Lmi2G5@I25P*w zy4_~}wj`0gp-x?&&3An8BzU?j=tP(76Xvg)p@~pMmr+IfK{8?DC>-OxN9)$>wRiT{ zMpU|zEKgrMI+*HcJ{>sKe`e~B(e0z({PbflzpkT&PLFOMs{QtAA?fOJ$aYmV*#?5d z!EzYVOktp)^XWv$mZZQyOB_WI^rRVq^zceFq-sEgn6&?2L=(Bsp_u76Y~s&NH>q76 z+&pUt!I?zO&W(pVIy&y%yLV$p>;q-;CJ$^-K7&Pi#fqfUAAUbaiE%N@K^XT@mgVHsiavg7_{@1e}mAkgKadU%CJEYZul+`odWe?*5 znH%KrihtSHOazcrJjo(kowl3HU46mx$f7REHYzjgdTIiuub;wPzj-tKM_C{flOqz_ z9li3OM6=gZY4n$2)$LCjaTSmf9Tj}4->jeY#Kps0tg65$K8Ez075EwHAxd;FzPjM4 z>2gvYgM~}+F#$D0;ROrF!QYcq(^C#DO=Hc<%+Te1TEutjOanGLVDY4PywwpDUC{(g3w z71rGSH>Dkt;?vwl!?tD+w{+C7Yggmj4J}lr(}?_*8n(wO^CxIITy7dxxG^=CrlDXv z;;Y?l5_Fn(i!^U=I<&H$;8KjJOWMh!L5WXr1r8$3t5Iw7j*(Q7T9CE(v&l)gKpKbW zww!sgP5WkkV8C=#@80K<<=x1gz<#tEzFo3eX?G>Xho-vHe8yhnj#P8?;RGF-5w(o% zBO$Fx&;feg(7sK}q@9+CZALEN&xS2XIr?jr^<61G+(TG%2Yu?n)RXYjqa=I4R;76u z3yW_DY}KcL`2$$ zT8uEL=CYRRw5Q2o;lswwVY^gbn&pgVGlnhRY3prC$UWPPcqqEIakp(%4~%wMDJS>* zHG;l=S|M+F@1wZrCW>y|9K_u;Iy!pn*fB3JFW#C9JLF_)iVstxyzg1dK65#l2nIXL zWxSdFX}OHxf|Ibse6nk!vdg5Jn=g;*CP_l}c?tQ>B7P%z6ylSo<>c)tK2Vpsn&Vgc zN(1VlH@qllQ#Qp~pL(=17p^F!%;{6>eHOe27)Yi~ooy1I>?J1~SpJka>u|Tqcv}^` zT^`u6Rw?~{b>HvGu9`aIVn1eJj&NqLDB6Eveg7V8Py!urIG*0Uj*F7GQ+64|RU^^2f8V)PUB(95`K1Kse);O2%Do~| zMixrjZ>(NhX@{ksWhq^Pku$>b45EMFDAL^A&#sfhQ6~keE+v$jOAOy%Jg`>R=)(}u zzey|P6pUzO60`jGVP9XnOPQFobP>5@Zjr^8Yhn9liA*GI-?$>9T;W|Chg>mw9w z(!{)710M#Oyx>2I94ew%U1R7!JnP0`gysF~`3u6m)m5${N$Ob-Y@Y8_y_JG(>7B)D z1@U10xs5txkz{AGnfpq6#0a?8)A405Y=xxjjKcjM*vkh?7tjAw#N4fO@M0}o+l-t} z*sYUuiLP$|+;|)1dtBru?bEl@=)SQEOh^m}sG?Z@<(v|~GRFgx zN5iYvC@^ciz1jqR8Cit|cVz5)&B&5qbMF$|?jU4o22t}ymT#<#{Xhj%&Qh_<0(7oI1#NC_7J)%p?_ZyEcdoP7GRaweIoRD5!_!N`601^TMMV{9q*v4kw&zIC+0PzgA!om)pA&(yZ!N* zsvg3OiwH^`tx1I_mF1(- zr>iNK^?^*Y^W5Co@mo+}b&R3PfPgZGg5IcprSDZ>^fY~l6>I++>#&?D6w2nGEpL^l zkF8EiXQ1?OXM}(K8x?6LggR9i{r6&&9u`ct{4dBv+WvR{^^Wr3*M|RIiK?MLHTo}1 z#dW+AAEv8E{5Qf18I@@r2LS9v#~{Jye}FCVqeqcQGtl57Ak!v zrGR>Phw>y*%_GdUfuKaIb{`NzXW|QIR3KcHHK~ihWT1|cqEW9_{fuBlLV1$-D4!;XP!%$ z`}z3RqsX43u*gu|FaS}Gd<^L=c>2^eHxn;_)PU2`%)NE-EvtBxgZHc3T;;H8<@Su= zzx?=cL>7Zpmbc?j7eTD4z|@Dn3u-AMkO~;AQq|Qhc)`SoOsn5PWSft^;?IZA^!AMa zd@^}Aw$Dol88jnf&Gk-Xry=iK6y`}eJX4lfylxT=vNkuSZO!Ide^nPlDwnXBcXn>A zYnNse!XT!h9zKuZmrxQv&cEV^I;}FIGVRS$0r9kC1`3;Nl_4eAIw~+$y?gsa+NW3` zoRJ2l#lWfnM8GuDK1sXSg>dofzL5<|wEsirTp)3;o4lFgWY6xcON++lWm>C%`OS9_ z31M~4ABotfbMqGNHo&X-_sh;SSh~dDyrNp4PPDbO*FF{cW8OlO%|I!vW;3MqHy;}< zJtM^FQ<=EZ!)bKBYJsx|+8@BEO-{#=E-+Y^SIqa%SWVaMs~$~H@#zMVLpdIrxFUEM z&)TfO;ES7kpjDeKItK|VEyx>xr@oQ5^G6pt1lwj9d{tof1$Q3)O|m|8UIWakR#mkb zIguA}7|v{HUGan+5Eoq)WR^EIc}avMofg%j;hbSP9O2MU?_CjRr~+(Htbc;vrrjsf z1TqYJ;V(QM$yeP4V%SyNWP!KUq4NjjaK(wYl7Ok0SI?hImn{ah@Sq>!pqi1Z*>NI^ zNtqVNP43CMJGYiozM93eWc`E%$aXUyUW9p)fg%DR%o@}YK*Lr$&fg10LTKTf{Vm8C zhko0+vnTb9rvhWmqcCeGM7A*|AJ9@T)z)v%8T-2*V;6B+HQqG3(DEx?XV?EIP7c%v z1kT1F$ALf2S?#3}p}KBIPa&;Bfgn!V()4jn4`%;7oC=)+dFA!Lge6(8Y(C)gj)il8 zHLa+$CdooLuGUx@aKeBI4T{F=$sEG~W@-zv;Y|s>*MB!wuLU_cI7aXF7?x&uO{Kn* zX#t&yBU1^&l>NRSm!TVd!#T!sxV@-@-upJ_HWv8s5(UO=lW@W;H5GLt z@DVX<4TiLWKHeG#{jq}b@X@^d-An4-)ZSI?PdbaO<~ESt zz1O!9-W{C90C@RkOCkZ>JPg>#I7s)l!W6C_6L<=aN74AFTX;@sb926Fc<9{+3*c0& zcP2vl$cNd>KHZCDg8_~bI1=;=ewRqBFAFfWE?xeW-eM;bU*VIrtg%)=e7|Q?LIAz| zX5@9?n8!-5Y$h=8K`tfaed{t1fZte5F55Fx%-b36+Sj)ZgmzIXNr9fi840D8Vme%rv3r!G>*S$Cz4?75w{{gZlr?!H5hU1Hm$9pI~-B4 z8-tMt5wp4g2LxpYAn!>FAF2SS06V!R5=_L>Wm#YX02E(qthNy~=nB11Z*?W7j`ARr z$ZvQ6&q_>5o0N7yDrMb+o5*5^#iHAvODP*_`*Y`!h3Xeo203n^Afcnit~3~+D<{yi zmDO#lFMwz?r&%yoc3oE~|dm zN}!`?t|Cn)_?OvWa3`=A!=xzKaezt%r@>$&kD_ONMhKvpyTPR08S6)M)#;O`9VjM3 z2*jDfwTT1>H~jhHp&$gpW)MAh32pr*Ce1b_IjvYE1iaMQEE+{q1><7MSdve78jvAw z5-kqWxOy-z0D%CiG-;J!;@-%#qM}YejpW0ScQc}0MBy%XB$|kawJIwo>_!i7KM$;E z+ANxN4_{Y-OLA)8BeeD6!^!Ey_T55=v^>d4eykT`?LSkWA%}By1OVQ{FyPuvhFPp= z(~?vSUf%`B1Dc&PY#bksCJWs!jKll4k*!ql9*q=kl#G2|4*P)| z<(}4H;8seZaTEVutyAX?3Y;x6jD)aa^z+3+AOrVbl=XUv1o34lY!Pw#=}8&ppp@Wg zCyKa0M{zARuGXXnAhb*=Jex+GI5vh}Zb1({By|5R$!VgH0s+Y9n@>kQ#Mim6Omcbz z1ooOoDNADv=M}=xKC2yTLC)$IkFl*=5I!vLX{-Vos9N>=spk)1P~&sX0u`x&z2-?y z*FlyW{!3cLQ^e9-ewSo%YRHpjZW2d{fc%dqAYp- zAq@W4PmQ=AGYc=T8ks`;$$z&Xa?7pXKPiqmr)Y5E-Nei-8tOEU>;Wh<0G z%C5g=AK!?^L08g=lYJlXS}K2-#}%q8cm^8R7F8A4%$dSBLLf_wb9`~p&&JrFOO^GONzM{{@ggjJ-ATgAxQnoKcu4~u3NfJK{X_BZ5}Y;9 zOX2d!>5HZ~KN^|clgfwH&EtJ>Ydq0h?$_y&hF=H!7M_Kl`=-`rvp4hjKX%tsjs*F% zDHU(?Ip1vJ9v#@Y=IrMi^xOn>YFShG&V{4nPR!V<0^;}?U*(kFP37 zO^(q;&l%oVj(9ka6Fugh&HlVYS!$M2cw)9ckAB=?y{w&+oud`~suN9v`RDI+A3)2qy+X-WrJd)_GS$UC$mvAW z=;kpt0P(uR0*l=%YAwns+~?q;GhN$13IZAsZtRKouwjz(mew&$2BR=G(Uk8X6klc( zB8jHZbI{;LkNhwjhG{0t;IQ1;*pSFnJ*52o0p0tyZ2z zmNE?8B8NEW-4t!fK!v=biEJGcO|t@K&}Tp<>qsPm`VZ9HtmUsi2b4EA>9T%XY+ZRC z4Ra($Fd3{b;D}3f7U+cd)9@-406g{9gt=;iNq|=8aejDL;UZdn|5k9S0mQ5aVVtwf z_8T@r#@WI`}sNHTk4Oc$74T_4ZNhrObrU7z8x8FDm>yyB)RYJ=8Sd{ z*6d&u?4(-0Hpx*_?lky3toAAXyU?b2Hl}!!#x>v);)pBqw&`OWW1iZtLqS>3{k?Cs zKTTDBjX77bEiBzEh1P)3ihRDUN&G1oo|Oc=3Ga}a-VKow{C)Au_kA5eiV>^5CF5;> z{#>}};rxj)`aS<~pSdC7Ow?nU5R#9OH!;XJg(^z{D4uPSs@7l-nS+`0ooB%{S!VSIl~JqSBRu zQwKn@@CX+{Iy#Ne=5(S&tEU_W9+DC^Q0UGt`tp! z6(Gfa2HewSnD=^A<_Sv%3v?phI1UbP2LZX=K?F5z^VHoX6f;2S<2l-pV=|P7eUL^J zx8VFz!FF!|`3-x@!;2`iFa;*3m4rQ*14@{Pfw*U5i{Oyi9yj>;C7}YRM7Q&J_Un35 zxf{VcFPoJjM`8u|Vqj9j^KBx6KMl$uoz3cgz<+%em<@}eOojnXY39Zm z#(=KX%kuBPuHl@;GEW>(_tWUlvy5Y{b)hnK*{{Jd?w1*;JFmJDiHqeMx-6ohXAA>6 zJGO?`j{g&aYyefT{x;9^H)>;5`81LG&_F0KSoZ=@Z=8RYXez^mfcw%f)P$+Kfa9>w zx1^ZHv7AAJ#XI(IpHQSMiGh-NwVVoFY<)-j&lF}zVb5pJg1JAq;3!HjWY zhIYA^5}_V?k|}U>^2)pBw(DG|(7nmkjX?;=^r+JfQ>Q`~fdcqa0)hnuF}wc{pHF_Q ai7fjeb;xrf4+aev(~J&_uTis_I+R1b$>pe>zb>M z4mPr@lvY6yBzs`Ll@kPEKY=f4B^LaG<_%RtkdpNQtG&(_vPEz7?z^72*!ZvK3XS~e zSRcRrQ~OPvu5g{QZ*Q@6k2#&Z{}#Iy{yXbqJvJ_~qO{#^Lt$5i{4MM?-O1?mEro+y zT<+xWuQ+&x?2+T~HtD&+jL(;mOJ8c62t#XFbPN=oLWIa9F%DX3&4Zw(HUv^pkYFL{|3683hS~ck#F~9Szu2{T zcevQ$t`_EaCY^EN=-4?LjduS0-1JaISFUS{K6zLOUwO1Ty`rMx&C>ZddhJvh-yAvv z8u*aGXoxiMPHn>Tl_l6Yvzl!k%GphLM_mcld;4VvLngSsVgBdlJ-Ul{KHK#}MpxLtU!jqaJc*@|)b_?% zoV;AXh<PkTJFz?~|H^(M%>LqsPFlvH_;14QXqw z{-~aGGpa`jdr?R9Q=0I>auRIXO17y&CluF?D72XNc;J1aC}Nz0=ZI5A6Fyl8hH`q?aqv&yWL3JBFq-gd+mQ^P5$r4dOx0DA=5s6;75NxN zu&vCTv#=qs3by3~tUl1s~nNGTgUf+QB3+{{)?f6TmU z3VfPoqIL3i_rX3^7tzN~(ZOTBdH=vU##OwJ!a-iJ(g%4e2)oHuy1O>G)RQq#)goB%&Vhj@BvyveMZ|TyMH1Btk zInLt1E<#vwP=XsbD56Y@9^3MgZ|0yXY9Yw?RAT3|DLGOKZOmBA)Yz{$>MUSN31Pbm zZ7Jm<3dk?V)P0K7V-IPMs)k7ti@&l7m~G<(yee9fl+Fn9Lu68k&IezR_i*8scBHv% z2A1t3WLxppq~@T$S7~F;V&>qyDMei4chcxcT{W#AtLBecSs8-)XnB(8hfH_NOCES0VhQ zDIecyRhOJXXDntD_F4;=PlT|tmN#{k$btrryqfo@dPh}4{hLi~h(h;EqO#AIW_uwl zbe}*T`y%6NsEWZIyJRkGkVYgGxaxce>3f<_$pjF$ zOh_RvJ0feWFD zOx0#FZp(?K-H*Oxs(WkS`G>~YCdOF^7Is;_aJ)j}s7SD52NW~zP_*rM z?CKn|=?tF}>F%oqOrHR%48y)A?W&1SMsH_8fFrQMAOveOic$*=Ub}rv(m()aLS4X2Ro=CsC#kY>HCBbfgo^M~t zg&(ycdC(oZzk3K*fYs(g`x63YywL8#(yysp`p1rjZHw!ZXCi`X zBjvrv2gr4NKneXXr+SsSFsB_+k<&?I(p1ePSSt;0>y@)>{Y=O_NVjap-0G4gNbxtR zL~_9N!k1TWb$kP`fKTri-rICXay!wEsopFaM^B8KwCL6;p!i;=V`}?e<+Es<1K_ul z!wLF<%fY`5wrFZc;AQ_)-&gc_nEA3Di3*f01k(b=xY6YJDte?B&`e7jDJqo#&CuxtI1*GXntC{(VKsZXhd+mNUe+iSE7mcxL_d_zyrzqf}& z~H>mzUGcnb) zr<(s!QF+#h5kX2S#Q)J${u6?=r-9_^fBBXG;N<^ku*N4(&LM3M|B+xSg)<2Wz1JHp zrbXp;Jm}wS)OF{t!^9O%K?hq160CIJ-*wQX2+ph&gs(Is^%A1!7!Oh?WP z8XEQ{_8}!5ul6k2)y};5XIxW+J*^kPsLftnd{=ZV?B(SPXMbBFF-Lj{jk}A9j=9}; zh@Yb`e!qVB^3rYb3ra$5`vbpfCY=%f;GTDg+`1j!4jz+OWffE{odsveR~bAR@h zP?bVl)A?n8@uQ?3LgQgEF5h45d!P=oY(rL-CKhNU)HVi-aanSq>YkJ3>;RkK4H9hN zD#O$s!nF4pHb6&i>3AS2!m?D*JT-W;?#75yIW$ab3Xxx+l$61RNm+EpTiwfCVd`2E zfTvnl3gt%a>GIB=R1Qqap<^C*g>efhv7Z+PxB)hRwjBBHQ?dfH5;DW*7kJ=Kf*JIn8z~RSoi)LFAocngH z%AZ^itX0-PqZVEg316PrekRI1onJ6=+yhQE_fg5E4rBX>+(hZ-6e8K!QvQ6v?*${E zSukRgxzwKK+y>26m+AnvN8yWIlWAP(Y+D|5#G77|kb);&0cvmk!pN-2O#R`ii4>Mg zUvN4dV|{WuvG#EULsyJbC}?{PDeD?_za>buBcon6!yn%-cr3oGHJzn%rPU?a?0+7Y zlFUv&X zG-k3h`k^1KL(PPnM40EP^jc zN9cuejK9+q_x@Kk@^^J@t*uT@?(&BnDZeT>K*_=5Jo2Khwsv0l0ex_}nxN2-i<#Cy z^U5C34(L3%T;l0_yPg7)$+7cOqwhV6@svVTy%0`+WFBftt@2Dw$CzoNc~NNs@3g-Z zqtsFA#e!jPJEo1DTa9@V$knY9Y=>#>w7vs#qm<>~u(zQE3%47Env$PGImyJbD>(3A z5=NkjQr!$TD##XkMrpPqnLW*xY$?}znUh;kDq)V>p?R$I?v;8_ z%BRw&iUu+GYV7(z~}?*;LS%P7@#aLN#t~p&0>ea{s4Dq@d;{R8RinKr5{`B z_w;Xc@yGL}$e*vP!)1kA&{2~P!o`~K`u78dEKPKDr6v1>=}D}0GBG%wc7l~O1@>7E zZnlY>t|VcSQi)}8-fX2wg;8TM?y+KRf9nkmY66|H!>&vE_51Yw=sw%XJ z&rF+CD9NUCA_UByP2tUXC^V2?a0XjiuV5J%QyyrMN~Fzu`3kcY0KlUv_w8}f4l%nkj}vgnDY;Q%h!i3 z?bT0Zvz=iMEgv*MV5EmY4 z?U9QBTC%Gg#us`{UZZo|VhN<^B*4i`TR$YTCfk{=>4_*c-ger@UYCU;QG z9H%iP)#X+OLijJeP{yJ}hbx$t^+mFKibe;X)rGAMb*<9YxZ z903^j+dl^-s)e3_8M*$6Q4aIo>wasVV=Rpk?^<6hCuSC%pfQY1PUfpfn)C6Lyj_>B zXMij|DrSE4MSO?nH-EeIV{>|hTvk}stP~#>VRNd(mKZ&7h(UxqErT-YIvZf)s48iG z0-oJwP2Aoxw$`AR!2e6s>>-3hdI(VG)3LP@@Q&4r^=0Z33!hj5Ulqto)t#+TplGm@kz8`RD6)Btp4y_0)sXQy%U+1VBXG5u&#*(eXMQALc z5d)s>96Nl63kOHhIOjmABfv%Rl{d{jD~E&Ad*Hb=;zqqtOj0l5%ILQeM1Yg;YklAc zwChwf4HHWWS6vlnlL+kL3n?qDc-&4tE=tpMr+)?*GzeFfm-GVR0F?2{=VONhw%0-Y zos!=5mWVcCX1=h`c`?s&Ro9uHh>Ef&~XLG}^!r2Nkn(u0^AFgWF z$CgoSg;w|?N-AhpaEBz7$L_T` zvv7rW^OiflfArbhFR+UTL-dQ1u8#EHjs{>m;no{r{hj@tPf0SiXHQ%GnbpOfRVgwr zz0CDT3fRn=AXzx%w3U{ill^K^qbU8iei1sda7^Ts?2Zq-H!;BVR5R=G;T5L$=DuB+ z=;$Ua1uw1;IZ3^K;C?hIandG6A{O6b`-Ozg?-(b%dNc+PnHuMBlO6AP_@;=m_sAb{ zw#f;eYPG#o-p++dzj^KYh1VT(-SIbGD7H3Q0RsnPBlt zMZDtO!ajZtH9vRSDozN`ohy;H0d@}oJW}3@DLcShv+PQ}aE=S;x8OZh{E&G~fOsoz zK(!j^%5G9DIJSIKiG`YLRdM{5s^UtRdy_~kCDvCwbTOu5vR?b}$mdF|3RrF`?MT)s z1xq`CcWp>G2pb5!1?pO*Nhm;$rvXkN#ZF~Bp%qf7X`rF>&}F%wrlPTd*WWdXdkhFC z#!|z-fI>YMBYB^5-u_ezlIJ5k4tseiSe~#Zma*xK52t@RU7<0C0W&gW(Sd99`)iM< z5J|C?8sk2*Sb)R|V7WJa5m3*QWn%RpyHsLw;^zS`_gSn>JJJRQd$=%wZYtrS%Z|=U zHSNzqQ!Co0pUrd})2XlK(a%PhKF?hO31U8PQ1%g2C`T`Y6EgaCaYfPQxNyb#M)JXf zsN2p4`s`1?dHN8wg1YJBFIHpR<|jWu#;Lr{O?+tL{2mfvTZ~eP#M@|b`lelx1&58( zymR!|nU4>@TWlJy-uHqOEsI87{j!s;{QGn44ofzp!NlhI{eSk=B{SXat%kx-mfNU$ zN-=TIV%23^oruro@7^ukG!Of_`V5nsoku4=e9U0p4f9J_jhi*J1tgk7oR|KctWoU`SImm_imR_BG)wa;@qckt#^^; z^@}vKJq`BlUtm~|g&C9^tvrAIcEfJ|#eWyh-K1UofVsVMQFNy7)Ag#iwrA>Z+}>rk z=hx6?-35ivpwDl@zW)AMJG)NrMi0z7I`?eqP%av&R`g3JLbr%mG&`4mR8($ed{Vb* z`;7Y6-z^)yeya~77NzrkKAU~;wg1=Bra%Lhj&{eF1R6uHW!e}6uVZ*gdaW6D@>$GB5bF+XhXF&yY4Ohoa;;PJ=XBJ6P0zK zwuHG`6CGp1XFm2#uzwtx@0}PE-->APdDNm-k}La8n+w|?JHw-^7411R^+RV-v*?iR z9=sJu@7cV!bjfh~Z>^$3PV=SdPPR)odtYyRs~;;+Xzg#G#FdxKkFQNmD0P|8_x`c3 zj!c+yK%-cA&!~(xWHSEq08X)UURJZd6TBLcQelt`y)vuP2IQwz<_yGGLet ziX8_Zg%Ch7K=nXsH9-*@MA(otVxx1cUL$DeB*%Ro09;)Lf#PalCbpEu@NPq>1l^5W zL3#2ws6n304}CKVUskzPRb5$6z&}L3le*QJ8J-)zUQwHGP+FafXcD`+E15X<0OO~D>IDg4A9$JLuPK^0oQ{T z&X&7gEywD}C&ajw?Hsw;&Mvh)+)UulFK&Qr81L=TDEaNitR8}+lmyFFdwM>A3iPm{ zZ?QY82L>Dub-lRs=42fi&^VuG3xEam&GXa>{=C6*%iBtDkXkgW9jmJ~dH_UGF_GNx z_5PyQ>Ihd_rg~6U*N!E2_rVwu2Kr3~Tsyur^8j=nHq6dPq{~!K) bnOS-tYQ!*%_d5^%Sb`4hbFg}7L5==j`e<}# literal 0 HcmV?d00001 diff --git a/internal_doc/Questions.html b/internal_doc/Questions.html new file mode 100755 index 0000000..7e85ad1 --- /dev/null +++ b/internal_doc/Questions.html @@ -0,0 +1,25 @@ + + + + + + Last news of the front + +  + + + + + + +
       
      + +
      +

      HexaBlock

      Asked and probably future Questions
      + +

      Retour +  


      +


      +

      o Septembre 2011

      Quelques évolutions

      Retour au début 


      o Aout 2011

      Première +version ...

      + \ No newline at end of file diff --git a/internal_doc/ReplaceBefore.gif b/internal_doc/ReplaceBefore.gif new file mode 100755 index 0000000000000000000000000000000000000000..35ce41307742787894426ca091789a4f9c108ab2 GIT binary patch literal 10416 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 D=25Q; literal 0 HcmV?d00001 diff --git a/internal_doc/Rind.png b/internal_doc/Rind.png new file mode 100755 index 0000000000000000000000000000000000000000..ccfb21fcf5d099e5f0ed1c138786d1859572f98d GIT binary patch literal 15798 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 literal 0 HcmV?d00001 diff --git a/internal_doc/blue-ball.gif b/internal_doc/blue-ball.gif new file mode 100755 index 0000000000000000000000000000000000000000..edc29b786ce52736bf9f2a1ac38aaa78b1799e92 GIT binary patch literal 925 zcmdUu?@Lp06viLZxvN=zGbLXnxn4xmesCo!DJU;mb`4UqNy|#RHq=F?ixBS%%N9|N ziV~B$*jNmqw3M+H!DTYz_Ji$PHoJm>FZ#itU_uxX2H&oKM(5Rm1JCoE59jPZuy1E+ zQx>xD8(@q9h(scxP{`qMEG#SxhJE31IFU%Sx3?Q}pU+p2cT7HDkb(2MAd8c!3H|p(}ox{^0PDpsEsUa1^qp%-^D8l6;9WGRe zP!y3;$?3#353k7{DmW<-sU+(V7-|{Bc?cRxHMyUnlo31QWrGppY7-C?SeX&Zqci_J zBeg0@`(bqxo>?TF6Wp-ckv|6^2wpZFoMIOBlb65za78a8NwM%&)P0!cw7{(4R}(8!arG)0e@W2D=$^=?I!3g;gyB zYPzvmiX9LMaizhP4zWs9PD|9dsQ;xbf6`I_Gd3*+Uit}e-N@$FR*p3mmR(NI$gI0n zZ82qL6$s@mjlQ}}+j!fz%&Eua%S_f5Q}Muv5NP?Bv-5RzvF+K}Sof9UHC4x-ocGUG z+_@V|?RCU{{_5K>))?t7s4V}Hx4B`mYt?ew8Si-0WT)vCchA82$$Gynhq literal 0 HcmV?d00001 diff --git a/internal_doc/demi_coque.png b/internal_doc/demi_coque.png new file mode 100755 index 0000000000000000000000000000000000000000..174580f19c435feca81b2f1427fe1fa8fee3f544 GIT binary patch literal 14175 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 b+wIz}< + + + + + + + +Projet HEXABLOCK + +  + + + + + + + +
      Simply Moira 
      +
      +
      +HexaBlock
      +
      +Bibliothèque de formes

      Documentation interne du moteur

      +
      +

      +Ce document constitue la documentation interne du composant HEXABLOCK.
      Ce +document fait partie des sources du projet et est géré en +configuration Pour le mettre à jour, utiliser kompozer, disponible sur +Linux
      +
      +
      +
      +

      o Table of contents : +
      +  +

      +
      + + + + + + + + + + + + + + +
      +
      o   Partie 1 : Prévisualisation des éléments créés
      +
      +
      o   Partie 2 : Nouvelles fonctions de construction
      +
      o   Partie 3 : Bibliothèques de formes
      o   Partie 4 : Evolution des associations
      +
      +

      o See also :

      + + + + + + + + + + + + +
      +
      o   Last news
      +
      o   Last last News : Voir les nouvelles formes
      o   Précisions sur las associations par lignes
      +
      o   Frequently asked questions
      +
      o   Maintenance
      +
      +

      +
      +

      +

      o Partie 1 : prévisualisation des éléments créés

      Pour +que SALOME puisse prévisualiser le "document" en cours de modivication, +il est nécessaire de créer une copie de l'original. L'évolution +majeure du moteur  consiste à implémenter une fonction de +copie. 

      Ce qui revient à ajouter dans la classe Document la méthode suivante :

      + + + + + + +
      Document* copyDocument (); +
      +
      La valeur rendue est le document copié.
      Les éléments copiés sont les éléments +intrinsèques du document : vertices, edges, quadrangles, hexaèdres, +lois. Qui sont aussi ceux sauvegardés dans un texte XML. On ne stocke +pas les éléments intermédiaires de construction (grilles, vecteurs, +etc...).

      Cette règle pourra être remise en cause si l'application interactive a besoin d'autres informations.

      La copie se déroule ainsi :
      • Chaque élément dispose d'un champ (nommé clone) qui permet de mémoriser l'adresse du dernier élément copié à partir de cet élément dans le cadre de la copie de document.
      • Copier les +éléments de bas niveau (les vertices) : méthode Vertex::duplicate(Document* cible). Cette méthode ne rend pas de pointeur ; elle crée un clone du sommet courant et le mémorise sur le champ clone de la classe Vertex.
      • Copier  les éléments présents de plus haut niveau dans l'ordre (edges, quads, hexas) : méthode virtuelle EltBase::duplicate ()
        • Si +un élément utilise n éléments de plus bas niveau, sa copie utilise les +copies des éléments utilisés. Il est aisé de retrouver la copie car on +en a stocké l'adresse.
        • Détail +: la méthode duplicate n'a pas besoin d'argument de type Document* elle +reprend le document cible des éléments de plus bas niveau..
      • Copier les lois
      Les associations sont copiées lors de la copie de chaque élément.


      +Retour au début +
      +

      +

      o + Partie 2 : Nouvelles fonctions de construction

      o 2.1 Création d'Hexaèdres

      +

      Il s'agit de construire un hexaèdre à partir de quadrangles déjà créés dans le +modèle de blocs. Cet hexaèdre est produit à partir des 4 cas suivants :

      + +
      • à partir de 2 quadrangles reliés ou pas,
      • à partir de 3 quadrangles tous reliés,
      • à partir de 4 quadrangles tous reliés,
      • à partir de 5 quadrangles tous reliés.
      Les points d'entrée sont naturellement :

      + + + + + + + + +
      Hexa* addHexa2Quads (Quad* q1, Quad* q2);
      Hexa* addHexa3Quads (Quad* q1, Quad* q2, Quad* q3);
      Hexa* addHexa4Quads (Quad* q1, Quad* q2, Quad* q3, Quad* q4);
      Hexa* addHexa5Quads (Quad* q1, Quad* q2, Quad* q3, Quad* q4, Quad* q5);

      Chacun des cas amène une discussion. La démarche est la suivante : 

      • Les quadrangles passés en argument dans un ordre quelconque.
      • Un +analyseur d'intersections (classe AnaQuads, +définie dans +HexAnaQuads.hxx) détermine les arêtes communes aux n quadrangles passés +en argument. et mémorise ces informations qui seront transmises aux +fonctions internes, afin de ne pas répêter ces calculs d'intersection.
      • En fonction du nombre d'arêtes communes à chaque quadrangle, on se ramène à 7 cas. 
      • Si le nombre d'arêtes communes est insuffisant, le cas est rejeté.
      • On nomme ces cas en se servant de la nomenclature des faces dans le projet : (A, B, C, D, E,F)
      Remarques :
      • Les quadrangles passés en arguments sont considérés comme planaires, il n'y a pas de contrôle d'arguments en entrée à ce niveau
      • Ils +sont sensés générer des quadrangles planaires et non croisés. Par +exemple pour addHexaQuadsACD() : il n'y a pas de contrôle de planéité +de la face B. 
      o    Rappel  :  formalisation des Hexaèdres/Quadrangles/Vertex


      Pour rappel :
      + + + + + +
                +//      z=0   z=1   +y=0   y=1   x=0  x=1
      enum EnumHQuad   {Q_A,  Q_B,  Q_C,  Q_D,  Q_E, Q_F,  HQ_MAXI};

      La face A est opposée à B, C est opposée à D, E à F. La +position des faces  A, C, E normales à Oz, Oy, Ox est purement +théorique. Elle améliore la visualisation. Les orientations sont en +fait  interchangeables. On peut intervertir les couples (C,D) et +(E,F), on peut intervertir A et B, C et D, E et F, l'essentiel est +d'avoir une cohérence  avec les autres dénominations d'edges (ac, +af, ad ...) ou de sommets (ace, acf, adf ...)  et les +conventions de départ.

      L'arête située entre la face X et la face Y est notée xy. Un sommet situé entre les 3 faces X, Y Z est noté xyz :

      + + +

             6=bde  +----bd-----+ bdf=7
                   +/|          /|
                 be |   B    bf |
                 /  |        /  |
          4=bce +----bc-----+...|...bcf=5
                |  de     D |   df
                +| E |       | F +|          +z
               ce   | +C     cf  +|           +^
        2=ade...|...+----ad-|---+ adf=3     |   y
                +|  /        |  +/            +|  /
                | +ae    A   | +af            +| /
                +|/          +|/              +|/
          0=ace +----ac-----+ acf=1         +-----> x
        


      o    La classe AnaQuads

      Cette +classe analyse les relations topologiques existant entre plusieurs +quandrangles. Un objet de ce type est créé au début de chaque fonction +addHexaXQuads.

      Le constructeur est :

      + + + + + + + + +
      AnaQuads (Quad* q1, Quad* q2, Quad* q3=NULL, Quad* q4=NULL, Quad* q5=NULL);

      Les champs affectés lors de la construction de l'objet :

      MawQuads Constante égale à 5 5
      int    nbr_quads;Nombre de quadrangles
      int    nbr_aretes;Nombre total d'arêtes
      Quad*  tab_quads  [i];Le ième quadrangle passé en argument
      int    inter_nbre [i];Nombre d'intersections du ième quadrangle
      int    inter_edge [i][j];Nro d'arête de i intersectant le jème quadrangle
      int    inter_quad [i][j];Nro de quadrangle présent sur la jème arete du iéme quad

      o    La classe Cramer

      Cette +classe résout un système linéaire de n équations  Ã  n inconnues. +Quand n est "petit", n<10. Peut être réutilisée sur un autre projet. +
      Implémentation : HexCramer.hxx.
      Test unitaire : test_cramer dans test_hexa1.cxx


      + + + + + + + + +
      int test_cramer (int nbargs, cpchar tabargs[])
      {
         double matrice [] = { 2, 7, 1,    0, 3, 0,    1, 9, 5 };
         double second_membre  [] = { 1, 1, 1 };
         Hex::Real3  solution;
         Hex::Cramer system(3);   // On dimensionne le système de Cramer à la construction

         int ier = system.resoudre (matrice, second_membre, solution);

         +cout << " Solution  = (" << solution[0] << ", " +<< solution[1] << ", " << solution[2]
              << "), ier = " << ier << endl;
        +                    +           // Pour vérifier :
         Hex::Real3 produit;
         system.multiply (solution, produit);
         +cout << " Produit = (" << produit[0] << ", " +<< produit[1] << ", " << produit[2]
              << ")"  << endl;
         return HOK;
      }




      o    Création d'un hexaèdre avec deux quadrangles :  
      • La classe AnaQuads ne détecte aucune arête commune : appel à addHexaQuadsAB
      • La classe AnaQuads  détecte une arête commune : appel à addHexaQuadsAC

      En diedre

      Vis a vis
      addHexa2Quads avec 2 quadrangles  non reliés.
      Fonction : addHexaQuadsAB
      addHexa2Quads avec 2 quadrangles   reliés.
      Fonction : addHexaQuadsAC

      addHexaQuadAB :

      Les huits sommets sont présents, il manque quatre arêtes verticales ce, cf, df, de.
      La +difficuté consiste à faire correspondre deux à deux les quatre sommets +de chaque quadrangle sans que les arêtes ne se croisent. La situation +est analogue à mergeQuads ou joinQuads, sauf que dans ces cas, on passe +en argument quatre vertex pour déterminer dans ambiguité les sommets +correspondants deux à deux. On a choisi ici +d'automatiser l'association :
      • il +existe huit combinaisons permettant d'associer deux à deux les 4 +sommets de 2 quadrangles : décalage de 0 à 3 dans un sens puis dans +l'autre.
      • Pour chaque combinaison, on calcule la longueur totale des 4 arêtes créées.
      • On retient la combinaison qui mène à une longueur minimale.
      Une fois la combinaison optimale établie :
      • Création +des 4 arêtes verticales en fonction des combinaisons, stockées dans un +tableau tedge[4]. Le premier vertex fourni est celui de la face A.
      • Création des 4 quadrangles verticaux.
      • Création de l'hexaèdre.
      Pour créer le i-ème quadrangle vertical :
      • l'arête verticale de gauche e_left = tedge[i]
      • l'arête verticale de droite e_left = tedge[(i+1) modulo 4]
      • l'arête +horizontale basse s'obtient grâce à la fonction Quad::findEdge (v1, +v2). On recherche dans le quadrangle A l'arête dont les 2 sommets sont +les extrémités amont des arêtes e_left et e_right, qui par construction +appartiennent au quadrangle A.
      • idem pour  l'arête haute ; sauf que ce sont les extrémités aval.

      addHexaQuadAC :

      Deux +faces présentes A et C, une arête commune ac. Il manque deux sommets +bde et bdf à partir desquels on construit les arêtes manquantes bd, +be, de, bf, df. 
      On doit s'assurer de la planéité des quadrangles créés.

      La +solution n'est pas unique. Il existe une infinité de sommets pouvant +définir un hexaèdre  conforme. On se contente ici d'en choisir une +et de démontrer que l'objet créé est conforme. 

      Le point bde (resp bdf) est construit en +sommant les vecteurs ac et ce (resp af et cf), ce qui revient à +définir un parallélogramme. On assure ainsi sa présence dans le plan E +(resp. F). Les faces créées E et F sont donc planaires.

      Pour démontrer la planéité de la face B :

      + + + + + +
      1. (ae , af)  coplanaires (donnée)
      2. be = ae (construction d'un parallèlogramme)
      3. df = af  (idem)
      4. (1), (2), (3) => (be, bf) coplanaires

      On procéderait de la même manière pour établir que la face D est plane.

      La fonction s'écrit ainsi :
      • q_a est le premier quadrangle fourni, q_c le second
      • L'edge e_ac est défini qrâce à la strucrure AnaQuads
      • On effectue un calcul analogue aux deux extrémités s (amont et aval) de e_ac :
        • vx1 = extrémité étudiée de e_ac, vx2 l'autre
        • vxa += sommet adjacent de vx1 sur  la face A, différent de vx2. Il est +obtenu en prenant le sommet opposé à vx2 sur la face A. L'indice de vxa +dans qa vaut vx2+2 modulo 4.
        • de même, vxc = sommet adjacent de vx1 sur la face  C.
        • Calcul des coordonnées et  création du vertex tv_bdx[s] (x représente la choix entre e et f).
        • Création des deux arêtes manquantes te_bx[s] et te_dx[s]
        • Création du quadrangle latéral tq_ef [s]
      • Création de l'arête e_bd à partir des deux vertices de  tv_bdx
      • Création +du quadrangle D à partir de te_dx[], e_ef, te_dx[1] et de l'arête +opposée à e_ac dans A (fonction Quad::getOpposedEdge(e,n)
      • Création du quadrangle B à partir de te_bx[], e_ef, te_bx[1] et de +l'arête opposée à e_ac dans C (fonction Quad::getOpposedEdge(e,n)
      • Création de l'hexaèdre

      o    Création d'un hexaèdre avec trois quadrangles :  

      • La +classe AnaQuads  détecte deux arêtes communes : appel à +addHexaQuadsACD. La face A sera celle qui possède deux arêtes communes, +la face C la suivante, D la derniére.
      • La classe AnaQuads  +détecte trois arêtes communes : appel à addHexaQuadsACE. Ce cas est +symétrique, la face A sera la première de la liste, C la seconde.


      En diedre

      Trièdre
      addHexa2Quads avec 3 quadrangles disposés en U.
      Fonction : addHexaQuadsACD
      addHexa2Quads avec  quadrangles disposés  en trièdre
      Fonction : addHexaQuadsACE


      addHexaQuadACD :

      Tous les sommets sont présents. Il reste à créer :

      • Les arêtes be et bf 
      • Les quadrangles E, B, F en déterminant les arêtes qui les constituent.

      La difficulté est d'identifier clairement les arêtes et les sommets à partir des quadrangles existant : 

      • q_a est le quadrangle qui possède deux arêtes communes, q_b et q_c les suivants.
      • On exploite les indices d'edges communs fournis par AnaQuads. Rappelons que dans un quadrangle le ième edge est adjacent aux edges i-1 et i+1 et opposé à l'edge i+2.
      • e_ac et e_ad sont les intersections de q_a avec q_c et q_d. (nommés ici mais non utilisés dans le programme)
      • e_bc est l'arête opposée à e_ac dans q_c,  e_bd est l'arête opposée à e_ad dans q_d.
      • e_ae +est l'arête suivante de e_ac dans q_a, e_af  l'arête précédente. +Ce choix arbitraire  détermine les autres dénominations.
      • e_ce est l'arête adjacente de e_ac dans q_c qui a un sommet commun (v_ace) avec e_ae.
      • e_de est l'arête adjacente de e_ac dans q_d qui a un sommet commun (v_ade) avec e_ae.
      • v_acf est le sommet commun à e_af et e_cf
      • v_adf est le sommet commun à e_af et e_df
      • Création de l'arete e_be  Ã  paertir de e_bce et v_bde, puis de l'arête e_bf,
      • Créations des quadrangles q_b, q_e, q_f
      • Création de l'hexaèdre.

      addHexaQuadACE :

      Il +est nécessaire de créer le sommet v_bdf. Il est l'intersection des +plans (B, D, F). Chaque plan est défini par trois points présents sur +les autres quadrangles :

      • Le plan B est défini par les sommets bcd, bce, bcf . Son vecteur normal norm_b est le produit vectoriel de bc par be.
      • Le plan D est défini par les sommets adf, ade, adb. Son vecteur normal norm_d  est le produit vectoriel de ac par ae.
      • Le +plan F est défini par les sommets adf, acf, bcf.  Son vecteur +normal norm_f  est le produit vectoriel de ae par ec.

      Soit un plan P défini par un point A et un vecteur normal N. Un point M appartient à P si le produit scalaire N.AM est nul

      On obtient le système d'équations

      + + + + + +
      1. (bdf,bce) . norm_b = 0
      2. (bdf,ade) . norm_d = 0
      3. (bdf,acf) . norm_f = 0
      Equivalent à : 
      + + + + + +
      1.    norme_b[0]*X + norme_b[1]*Y + norme_b[2]*Z = prod_scalaire (v_bce, norm_b)
      2.    norme_d[0]*X + norme_d[1]*Y + norme_d[2]*Z = prod_scalaire (v_ade, norm_d)
      3.    norme_f[0]*X + norme_f[1]*Y + norme_f[2]*Z = prod_scalaire (v_acf, norm_f)

      Ce système de 3 équations à trois inconnues est résolu par la méthode de Cramer au moyen d'une classe du même nom défini dans le nouveau fichier HexCramer.hxx. Notons qu'un test unitaire de la classe Cramer existe dans le fichier test_quads.cxx

      Une fois le système résolu ; s'il n'est pas régulier on retourne un vecteur nul, la suite est aisée :

      • Création du vertex s_bdf à partir des coordonnées calculées
      • Détermination +des sommets opposés s_be, s_bcf, s_adf en utilisant la méthode +Edge::commonVertex (edge) sur les arêtes dèja déterminées.
      • Création des 3 arêtes manquantes e_bd, e_bf, e_df
      • Création des quadrangles manquants q_b, q_d, q_f.
      • Création de l'hexaèdre.

      o    Création d'un hexaèdre avec quatre quadrangles :  

      • La classe AnaQuads  +détecte trois arêtes communes : appel à addHexaQuadsACDE. La face A sera la première trouvée qui en possède trois, +la face E la suivante à trois arêtes,C et D lles deux autres faces à deux arêtes communes.
      • La classe AnaQuads  détecte quatre arêtes communes : appel à +addHexaQuadsABCD. Ce +cas est +symétrique chaque face possède deux arêtes. La face A sera la première +de la liste, C et D les deux faces sécantes à A, B la dernière.

      En tunnel

      En but
      addHexa2Quads avec 4 quadrangles  disposés en tunnel.
      Fonction : addHexaQuadsABCD
      addHexa2Quads avec 4 quadrangles disposés en fauteuil.
      Fonction : addHexaQuadsACDE

      addHexaQuadABCD :

      Le +rôle des quadrangles passés en arguments est symétrique On nommera q_a +le premier trouvé, q_c le premier qui intersecte q_a, q_c le second et +q_d celui qui n'intersecte pas q_a.

      Tous les sommets et arêtes sont présents. Il suffit de créer les deux quadrangles E et F:

      Les problèmes de détermination des variables se traitent comme dans addHexaQuadABC

      addHexaQuadACDE :

      Le rôle de q_a et qc est symétrique. Ils ont chacun trois arêtes communes avec les autres. q_e et q_f n'en ont que 2.

      Tous les sommets sont présents. Il suffit de créer l'arête e_bf et les deux quadrangles B et F:

      Les edges se déterminent aisément grâce aux indices d'intersection fournis par AnaQuads. Il suffit de prendre l'opposé. On utilise la propriété de la classe Quad : l'indice d'une arête opposée à l'arête i vaut i+2.

      + + +
         int   nc_ac = strquads.inter_edge[pos_c][pos_a]; // Nro dans  q_c de e_ac
         int   nc_ce = strquads.inter_edge[pos_c][pos_e]; // Nro dans  q_c de e_ce
         int   nd_ad = strquads.inter_edge[pos_d][pos_a]; // Nro dans  q_d de e_ad
         int   nd_de = strquads.inter_edge[pos_d][pos_e]; // Nro dans  q_d de e_de
         int   ne_ae = strquads.inter_edge[pos_e][pos_a]; // Nro dans  q_e de e_ae

         Edge* e_af  = q_a->getEdge ((na_ac + 3) MODULO QUAD4);
         Edge* e_bc  = q_c->getEdge ((nc_ac + 2) MODULO QUAD4);
         Edge* e_cf  = q_c->getEdge ((nc_ce + 2) MODULO QUAD4);
         Edge* e_bd  = q_d->getEdge ((nd_ad + 2) MODULO QUAD4);
         Edge* e_df  = q_d->getEdge ((nd_de + 2) MODULO QUAD4);
         Edge* e_be  = q_e->getEdge ((ne_ae + 2) MODULO QUAD4);

         Vertex* v_bcf = e_cf->opposedVertex (e_cf->commonVertex (e_af));
         Vertex* v_bdf = e_df->opposedVertex (e_df->commonVertex (e_af));

      o    Création d'un hexaèdre avec cinq quadrangles : 

      Il n'y a pas besoin de dissocier plusieurs cas, le travail est réalisé directement dans la méthode addHexa5Quads().

      En but

      Ce cas est assez simple : c'est un hexaèdre auquel il manque la face que l'on convient de nommer B.
      • La face q_a est celle qui possède 4 intersections.
      • Une +fois son indice qbase déterminé dans AnaQuads, on boucle sur les 4 +quadrangles sécants à q_a et on obtient l'arête opposée t_edge[i] et le +quadrangle associé tquad[i]. Les quadrangles q_c, g_d, q_e, q_f se +retrouvent dans le tableau tquad dans un ordre exploitable, le problème +étant symétrique.
      • On construit qb à partir des t_edge[i] donnés dans +cet odre :  q_b  = new Quad (tedge[0], tedge[1], tedge[2], +tedge[3]);
      • Enfin l'hexaèdre : hexa = new Hexa (q_a, q_b, tquad[0], tquad[2], tquad[1], tquad[3])

      Retour au début

      o 2.2 Génération d'Hexaèdres par révolution

      Le pont d'entrée dans la classe Document est :
      + + +

      + + + + + +
      Elements* revolutionQuads (Quads& start, Vertex* center, Vector* axis, vector<double>& angles);

      Avec :
      • start est la liste des quadrangles de départ. Ils doivent constituer une surface libre. Rappelons que le type Quads est équivalent à vector<Quad*>
      • center et axis sont respectivement le centre et l'axe de la rotation
      • le vecteur angles définit pour chaque incrément l'angle de la rotation.



      En diedre

      Trièdre
      Avant la revolution : on a coloré les quadrangles à déplacer, ainsi que l'axe de rotation.Résultat de  la revolution.

      Retour au début

      o 2.3 Substitution d'Hexaèdres

      Il +s'agit de remplacer un hexaèdre ou des hexaèdres par une autre série +d'hexaaaèdres. Pour pouvoir effectuer ce remplacement, cette autre +série d'hexaèdres doit vérifier des conditions de collage de faces.
      + + +



      En diedre

      Trièdre
      Exemple +: remplacement des 3 hexaèdres jaunes centraux par 3 fois 5 nouveaux +hexaèdres qui sont construits par extrusion des 5 quadrangles marrons +(le motif).Résultat du remplacement. 


      La signature de la fonction est la suivante :
      + + + + + +
      Elements* Document::revolutionQuads (Hexas& pattern, Vertex* p1, Vertex* c1,
        +                    +               Vertex* +p2, Vertex* c2, Vertex* p3, Vertex* c3);

      Avec :
      • pattern est la liste des hexaèdres  à extruder.
      • c1, c2 et c3 +définissent le quadrangle "cible" QB. Soit QA la face opposée à QB. A +partir de cette face, on définit l'ensemble des n hexaèdres liés par +les faces "opposées"  (QAi, QBi). 
      • p1, p2 et p3 sont les vertices du pattern qui seront associés resperctivement à c1, c2 et c3.  

      Conditions : 

      • Le pattern doit avoir exactement 4 faces latérales externes, que l'on appellera pqc, pqd, pqe, pqf.
      • Les +faces"transversales" inférieure et supérieure doivent être +superposables : le motif des quadrangles qui constituent ces faces doit +être identique.
      • c1,c2 et c3 sont sur une face externe.

      Pour désigner les faces d'un hexaèdres, on utilise les  notations habituelles définies plus haut.

      Conventions et orientations :

      • Les +3 vertices de départ du pattern définissent deux edges : pe_ac (sens +Ox) et pe_ae (sens oy) et 3 vertices pv_aed, pv_ace, pv_acf.  +pv_ace est celui des 3 vertices qui est commun aux deux edges, pv_ade +la première des extrémités.
      • Les 4 faces latérales externes du pattern sont notées pq_c, pq_d, pq_e, pq_f.
      • Les +3 vertices cibles définissent un quadrangle cq_b , deux edges  + ce_bc (Ox) et ce_be (Oy) et 3 vertices cv_bed, cv_bce et cv_bcf.  Comme pour le pattern.

      Retour au début +


      +

      +

      oPartie 3 : Bibliothèque de formes

      Cette biblothèque est constituée de quatre nouvelles formes :

      • La demi-sphère trouée 
      • Le huitième de sphère trouée
      • La demi-écorce trouée
      • Le huitième d'écorce trouée 

      Ces formes sont implémentées (et traduites ....) de la façon suivante :

      + + + + + +
      Elements* makeSphere (Vertex* center, Vector* vx, Vector* vz,
                            double radius, 
      double radhole,
                            Vertex* +plorig, 

                            int +nrad, int nang, int nhaut);
      Elements* makePartSphere (Vertex* center, Vector* vx, Vector* vz,
                                double  radius,
      double radhole,
                                Vertex* +plorig, double angle,
                                int +nrad, int nang, int nhaut);
      Elements* makeRind (Vertex* center, Vector* vx, Vector* vz,
                          double  radius, double radint,
      double radhole,
                          Vertex* +plorig, 
                          int +nrad, int nang, int nhaut);
      Elements* makePartRind (Vertex* center, Vector* vx, Vector* vz,
                             
      double  radius, double radint, double radhole,
                              Vertex* +plorig, double angle,
                              int +nrad, int nang, int nhaut);

      Remarques :
      • Le plan sécant ne passe pas +forcément par le centre de la sphère. Il définit le demi-espace dans +lequel se situe l'objet à dessiner. Il peut même être disjoint de la +sphère. S'il est "en dessous", la sphère est entièrement dessinée, s'il +est "au dessus", l'objet sera vide.  

      o 3.1  Aspect visuel (exemples)


      Conditions

      Demi Sphere trouee

      Huitième de sphère
      Demi-Sphère trouée (makeSphere ())Huitième de sphère trouée (makePartSphere ())

      Ecorce trouée    

      Huitième d'ecorce       

      Demi écorce trouée (makeRind ())Huitième d'écorce trouée (makePartRind ())

      o 3.1  Implémentation

      Toutes ces fonctions publiques appellent une seule fonction  de la classe Elements :

      + + + +
      int makeRind (EnumGrid type, Vertex* center, Vector* vx, Vector* vz,
                   
      double  radius, double radint, double radhole,
                    Vertex* +plorig, double angle,
                     int +nrad, int nang, int nhaut);

      Une fonction controlRind() vérifie +la cohérence des arguments passés en entrée et calcule les deux extrema +de l'angle d'élévation phi (voir chapitre suivant).
      Une boucle à triple indice sur (nrad, nang, nhaut) calcule les coordonnées des sommets par appel de la fonction getCylPoint (nx,ny,nz, px,py,pz).
      Ce +calcul se fait sur une sphère de centre O et d'axe Oz, dont les +hexaedres sont comptés à partir de l'axe Ox de façon à remplir le +secteur angulaire theta.. Les coordonnées sont ensuite replacées dans +les coordonnes utilisateur grâce à la fonction transfoVertices(). Edges, quadrangles et hexaèdres sont ensuites assemblés grâce à  la fonction fillGrid().

      o 3.2 Détermination de l'angle d'élévation (phi)  

      L'angle +d'azimuth theta (longitude) est défini explicitement par l'utilisateur. +L'angle d'élévation phi est délimité par la position du  plan +horizontal et par le diamètre du trou.  Soit :
      • Une sphère de centre O et de rayon R.
      • La phère est traversée par un trou cylindrique de rayon r.
      • Un plan défini par son vecteur normal n (vertical sur la figure qui suit) et un point A

      Sphere

      A partir de ces éléments de base, on  définit :
      • Le point H, projection orhogonale du centre O de la sphere sur le plan (A,n)
      • L'angle alpha défini par le centre O et le cylindre : sin (alpha) =  r/R
      • L'angle beta délimité  par l'horizontale et l'intersection du plan (A,n) et de la sphère. 
        • sin (beta) = OH/R
        • et OH = OA.n/|n|  (produit scalaire de OA par le vecteur unitaire associé à n).
      L'angle d'élévation  phi  est encadré par les valeurs suivantes :
      • max (alpha-pi/2, beta) <= phi <= pi/2 - alpha

      Retour au début +


      +

      +

      oPartie 4 : Evolution des associations

      Cette tâche est composée de 3 évolutions, au sujet de +l'association, qui sont décrites ci-après.

      o 4.1 Nouveaux objets  

      + +

      Il s'agissait d'ajouter de nouveaux objets +intermédiaires de travail, comme le vecteur ou le cylindre :

      + +
      • le + cercle défini par un + centre, un + rayon et une + normale,
      • la + sphère définie par un + centre et un + rayon.
      Il était p aussi associer  +les objets intermédiaires aux objets géométriques venant du +composant GEOM de SALOME :
      • un + cercle,
      • une + sphère,
      • un + cylindre.

      o 4.2 Associations prédéfinies  

      La deuxième évolution consiste à améliorer les associations +des modèles de blocs prédéfinis en calculant automatiquement des associations +implicites, les fonctions concernées sont les suivantes:

      + +
      • ajouter + une grille cylindrique .
      • ajouter + une grille sphérique.
      • ajouter + un cylindre, un tuyau.
      • ajouter + l’intersection de 2 cylindres ou de 2 tuyaux.
      • faire + de même pour toutes les nouvelles fonctions : ecorces et portions de sphères.
      + +

      Pour chaque arête (sphérique) concernée, on associera un arc de cercle.

      Il est inutile d'associer les faces, SMESH est capable de mailler si les arêtes sont associées.

      Implémentation 

      Rappelons que l'objet Shape de HexaBlock est constitué :

      • D'une chaine de caractère (b_rep) qui permet de décrire toute forme de GEOM
      • De deux paramètres debut et fin compris entre 0 et 1 permettant de délimiter la ligne décrite par la b-rep quand c'en est une

      Deux opérations sont nécessaires  :

      1.  créer un cercle au moyen de GEOM,
      2. découper ce cercle en arcs de cercle qui seront associés aux arêtes concernées.

      Opération 1 : +Le cercle à créer est en fait un arc de cercle orienté de 360 +degrés.  Il est en effet nécessaire de définir une origine. GEOM +permet de générer finir un tel +cercle, à partir duquel HexaBlock définira des arcs au moyen des +paramètres debut et fin des shapes :

      Cette action est assurée par la fonction geom_create_circle +qui génère la brep du cercle à partir de son centre, de son rayon, +de son vecteur normal, du  vecteur Ox qui permet de définir son +origine.


      + + + +
      void geom_create_circle (double* centre, double rayon, Vector* normale,
                               +double* ox, string& brep)
      {
         gp_Pnt gp_center (centre [dir_x], centre [dir_y], centre [dir_z]);
         +gp_Vec gp_ox     (ox     +[dir_x], ox     [dir_y], ox     +[dir_z]);
         gp_Vec gp_norm   (normale->getDx(), normale->getDy(), normale->getDz());

         gp_Ax2  gp_axes (gp_center, gp_norm, gp_ox);
         gp_Circ gp_circ (gp_axes,   rayon);

         TopoDS_Edge    geom_circ = BRepBuilderAPI_MakeEdge(gp_circ).Edge();
         ostringstream  stream_shape;
         BRepTools::Write(geom_circ, stream_shape);

         brep = stream_shape.str();
      }

      GEOM permet de définir un tel cercle (calsse gp_Circ)  à partir d'un systemes d'axes 2D (classe gp_Ax2 )  et d'un rayon. Ce cercle esr ensuite transformé en forme TopoDS_Shape qui est l'objet GEOM que l'on maniplule habituellement losque l'on procède aux associations. Plus précisément en TopoDS_Edge  au moyen de BRepBuilderAPI_MakeEdge. Enfin l'objet est  transformé en chaine de caractères de format Brep via ostringstream.

      Opération 2 : +On dispose d'une b-rep  décrivant un arc de cercle de 360 degrés. +Il est aisé de définir proportionnellement pour chacun des edges +constituant la ligne associée à la portion de cercle les paramètres +début et fin par rapport aux angles de départ et d'arrivée de chaque +arc. Cette opération fut d'ailleurs réalisée lors de la préservarion +des associations lors d'un "cut". On réutilisera donc la fonction Elements::cutAssociation(...) moyennant quelques aménagements.

      o 4.3 Propagation des associations  


      La troisième évolution consiste à améliorer la propagation +automatique des associations, les fonctions concernées sont les suivantes:

      + +
      • fusionner + ou déconnecter des sommets, des arêtes, des quadrangles :
        • s’il + y a des associations, ne pas les perdre,
      • prismer + un ou des quadrangles :
        • s’il + y a des associations dans la direction de l’extrusion, les propager,
      • ajouter + des hexaèdres par translation, par rotation, par homothétie ou par + symétries :
        • si + les hexaèdres sources ont une association, alors les propager,
      • faire + de même pour la fonction «révolution» du lot 2.
      + +

      + +

      Ces trois évolutions seront implémentées dans le moteur. +Seule le première évolution (création de sphères ou cercles) sera implémentée +dans la partie interactive.



      o    Implémentation :


      En +ce qui concerne les associations propagées par les transformations, la +fonction de base de l'implémentation est transfo_brep.
      Cette fonction reprend la matrice du modèle de blocs et l'applique à la shape décrite par la brep.

      // ====================================================== transfo_brep
      void transfo_brep (string& brep, Matrix* matrice, string& trep)
      {
         BRep_Builder  builder;
         TopoDS_Shape  shape_orig;
         ostringstream stream_shape;
         gp_Trsf       transfo;

         +double             +a11,a12,a13,a14, a21,a22,a23,a24, a31,a32,a33,a34;
         matrice->getCoeff (a11,a12,a13,a14, a21,a22,a23,a24, a31,a32,a33,a34);
         transfo.SetValues (a11,a12,a13,a14, a21,a22,a23,a24, a31,a32,a33,a34,
                            +Epsil2, Epsil2);

         istringstream stream_brep (brep);
         BRepTools::Read           (shape_orig, stream_brep, builder);
        
         BRepBuilderAPI_Transform brep_transfo (shape_orig, transfo, Standard_True);
         TopoDS_Shape result = brep_transfo.Shape();

         BRepTools::Write (result, stream_shape);
         trep = stream_shape.str();
      }


      Pour la fonction de prismQuads, on utilise une variante simplifiée :

      // ====================================================== translate_brep
      void translate_brep (string& brep, double dir[], string& trep)
      {
         gp_Trsf       transfo;
         BRep_Builder  builder;
         TopoDS_Shape  orig;
         ostringstream stream_shape;

         +gp_Vec      +vecteur       (dir [dir_x], dir [dir_y], +dir [dir_z]);
         transfo.SetTranslation    (vecteur);
         istringstream stream_brep (brep);
         BRepTools::Read           (orig, stream_brep, builder);
        
         TopLoc_Location  loc_orig   = orig.Location();
         gp_Trsf          trans_orig = loc_orig.Transformation();
         TopLoc_Location  loc_result (transfo * trans_orig);
         TopoDS_Shape     result = orig.Located (loc_result);

         BRepTools::Write (result, stream_shape);
         trep = stream_shape.str();
      }


      Pour la fonction de prismQuads, on utilise une variante simplifiée :



      o    Propagation des associations pour les transformations :


      L'exemple donné est makeScale

      # ======================================================= make_grid
      def make_grid (doc) :
          ori  = doc.addVertex ( 0, 0, 0)
          vz   = doc.addVector ( 0, 0, 1)
          vx   = doc.addVector ( 1 ,0, 0)

          dr = 1
          da = 360
          dl = 1
          nr = 1
          na = 6
          nl = 1
          grid = doc.makeCylindrical (ori, vx,vz, dr,da,dl, nr,na,nl, False)
          return grid

      # ======================================================= test_scale
      def test_scale () :

          doc  = hexablock.addDocument()
          grid = make_grid (doc)

          dest   = doc.addVertex (15, 0, 0)
          grid2  = doc.makeScale (grid, dest, 0.5)
          return doc


      transfo




      o    Propagation des associations pour la fonction prismQuads

      Pour la fonction prismQuads :


      # ========================================================== test_prism
      def test_prism () :
          doc  = hexablock.addDocument()
          nr = 1
          na = 6
          nl = 1
          grid = make_grid (doc, nr, na, nl)

          liste = [ ]
          for nx in range (nr) :
              for ny in range (na) :
                  cell = grid.getQuadIJ (nx, ny, nl)
                  liste.append (cell);

          axis = doc.addVector (1, 1, 1);
          bloc = doc.prismQuads  (liste, axis, 3)
          return doc


      + + + +





      Prisme





      o    Propagation des associations pour la fonction revolutionQuads

      Pour la fonction revolutionQuads


      # ========================================================== test_revolution
      def test_revolution () :
          doc  = hexablock.addDocument()
          nr = 1
          na = 6
          nl = 1
          grid = make_grid (doc, nr, na, nl)

          liste = [ ]
          for nx in range (nr) :
              for ny in range (na) :
                  cell = grid.getQuadIJ (nx, ny, nl)
                  print " ... cell = ", cell
                  liste.append (cell);
      ss

          center = doc.addVertex (0, -10, 0);
          axis   = doc.addVector (1, 0, 0);
          angles = [5, 10, 15, 20, 30, 20, 15, 10, 5 ]
      ss
          bloc = doc.revolutionQuads  (liste, center, axis, angles);
          return doc


      Macaroni

      Retour au début

      +
      +




      +  +
      +  +
      +  +
      +  +
      +  +

      + \ No newline at end of file diff --git a/internal_doc/logo-cs.gif b/internal_doc/logo-cs.gif new file mode 100755 index 0000000000000000000000000000000000000000..4724b0a0a2dc9d55813ea27bb787be0728462224 GIT binary patch literal 7134 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

      2leVRvL#;z<8BFvO-$QwyRb(&m@VlTsRY+8 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 CE>y4p literal 0 HcmV?d00001 diff --git a/internal_doc/red-ball.gif b/internal_doc/red-ball.gif new file mode 100755 index 0000000000000000000000000000000000000000..dca92960148cb3751f9b2de8cf96f26293c15888 GIT binary patch literal 527 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 I=j`wQ4{o8)9RL6T literal 0 HcmV?d00001 diff --git a/salome_adm/unix/SALOMEconfig.h.in b/salome_adm/unix/SALOMEconfig.h.in new file mode 100755 index 0000000..8db6100 --- /dev/null +++ b/salome_adm/unix/SALOMEconfig.h.in @@ -0,0 +1,65 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +/* Debug mode ??? */ +#ifndef DEBUG +# define DEBUG +#endif + +/* CORBA headers include rules */ +#ifndef CORBA_CLIENT_HEADER +# define QUOTE(x) #x +# define CORBA_CLIENT_HEADER(x) QUOTE(x@IDL_CLN_H@) +# define CORBA_SERVER_HEADER(x) QUOTE(x@IDL_SRV_H@) +#endif + +/* Platform definition */ +#ifndef @MACHINE@ + #define @MACHINE@ +#endif + +// This is only to suppress warning messages with defines redefined (cause of omniORB that exports these names) +#ifdef PACKAGE +#undef PACKAGE +#endif +#ifdef PACKAGE_BUGREPORT +#undef PACKAGE_BUGREPORT +#endif +#ifdef PACKAGE_NAME +#undef PACKAGE_NAME +#endif +#ifdef PACKAGE_STRING +#undef PACKAGE_STRING +#endif +#ifdef PACKAGE_TARNAME +#undef PACKAGE_TARNAME +#endif +#ifdef PACKAGE_VERSION +#undef PACKAGE_VERSION +#endif +#ifdef VERSION +#undef VERSION +#endif + +#ifdef _POSIX_C_SOURCE +#undef _POSIX_C_SOURCE +#endif diff --git a/salome_adm/unix/config_files/config.guess b/salome_adm/unix/config_files/config.guess new file mode 100755 index 0000000..e3ef63f --- /dev/null +++ b/salome_adm/unix/config_files/config.guess @@ -0,0 +1,1471 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2005-12-13' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + x86:Interix*:[345]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^LIBC/{s: ::g;p;}'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/salome_adm/unix/config_files/config.sub b/salome_adm/unix/config_files/config.sub new file mode 100755 index 0000000..c0ada46 --- /dev/null +++ b/salome_adm/unix/config_files/config.sub @@ -0,0 +1,1602 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2005-12-11' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m32c) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + m32c-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/salome_adm/unix/config_files/depcomp b/salome_adm/unix/config_files/depcomp new file mode 100755 index 0000000..ca5ea4e --- /dev/null +++ b/salome_adm/unix/config_files/depcomp @@ -0,0 +1,584 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2006-10-15.18 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software +# Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + stat=$? + + if test -f "$tmpdepfile"; then : + else + stripped=`echo "$stripped" | sed 's,^.*/,,'` + tmpdepfile="$stripped.u" + fi + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + outname="$stripped.o" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/salome_adm/unix/config_files/install-sh b/salome_adm/unix/config_files/install-sh new file mode 100755 index 0000000..4fbbae7 --- /dev/null +++ b/salome_adm/unix/config_files/install-sh @@ -0,0 +1,507 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2006-10-14.15 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +posix_glob= +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chmodcmd=$chmodprog +chowncmd= +chgrpcmd= +stripcmd= +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src= +dst= +dir_arg= +dstarg= +no_target_directory= + +usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: +-c (ignored) +-d create directories instead of installing files. +-g GROUP $chgrpprog installed files to GROUP. +-m MODE $chmodprog installed files to MODE. +-o USER $chownprog installed files to USER. +-s $stripprog installed files. +-t DIRECTORY install into DIRECTORY. +-T report an error if DSTFILE is a directory. +--help display this help and exit. +--version display version info and exit. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + shift + shift + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t) dstarg=$2 + shift + shift + continue;; + + -T) no_target_directory=true + shift + continue;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac +done + +if test $# -ne 0 && test -z "$dir_arg$dstarg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src ;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dstarg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix=/ ;; + -*) prefix=./ ;; + *) prefix= ;; + esac + + case $posix_glob in + '') + if (set -f) 2>/dev/null; then + posix_glob=true + else + posix_glob=false + fi ;; + esac + + oIFS=$IFS + IFS=/ + $posix_glob && set -f + set fnord $dstdir + shift + $posix_glob && set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # Now rename the file to the real destination. + { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ + || { + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + if test -f "$dst"; then + $doit $rmcmd -f "$dst" 2>/dev/null \ + || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ + && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ + || { + echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + } || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/salome_adm/unix/config_files/missing b/salome_adm/unix/config_files/missing new file mode 100755 index 0000000..1c8ff70 --- /dev/null +++ b/salome_adm/unix/config_files/missing @@ -0,0 +1,367 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2006-05-10.23 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). +case $1 in + lex|yacc) + # Not GNU programs, they don't have --version. + ;; + + tar) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $1 in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/HEXABLOCK/Hex.cxx b/src/HEXABLOCK/Hex.cxx new file mode 100755 index 0000000..08a672d --- /dev/null +++ b/src/HEXABLOCK/Hex.cxx @@ -0,0 +1,86 @@ + +// C++ : La clase principale de Hexa + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "Hex.hxx" + +#include "HexDocument.hxx" +#include + +BEGIN_NAMESPACE_HEXA + +// ======================================================== Constructeur +Hex::Hex () +{ + setlocale (LC_NUMERIC, "C"); +} +// ======================================================== Destructeur +Hex::~Hex () +{ +#ifndef NO_CASCADE + int nbre = liste_documents.size(); + for (int nd=0 ; nd=(int)liste_documents.size()) + return NULL; + + return liste_documents [nro]; +} +// ======================================================== removeDocument +void Hex::removeDocument (Document* doc) +{ + int nbre = liste_documents.size(); + for (int nd=0 ; ndloadXml (filename); + return doc; +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/Hex.hxx b/src/HEXABLOCK/Hex.hxx new file mode 100755 index 0000000..2035a03 --- /dev/null +++ b/src/HEXABLOCK/Hex.hxx @@ -0,0 +1,49 @@ + +// class : La clase principale de Hexa + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __HEX_H +#define __HEX_H + +#include "hexa_base.hxx" + +BEGIN_NAMESPACE_HEXA + +class Hex +{ +public: + int countDocument (); + Document* getDocument (int nro); + void removeDocument (Document* doc); + + Document* addDocument (const char* name="default"); + Document* loadDocument (const char* name); + + // Constructeur + destructeur + Hex (); + ~Hex (); + +private: + vector liste_documents; +}; + +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexAnaQuads.hxx b/src/HEXABLOCK/HexAnaQuads.hxx new file mode 100755 index 0000000..26f79a0 --- /dev/null +++ b/src/HEXABLOCK/HexAnaQuads.hxx @@ -0,0 +1,115 @@ + +// class : Analyse des quadrangles avant construction + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __ANA_QUADS_H +#define __ANA_QUADS_H + +#include "HexQuad.hxx" +// #include "HexEdge.hxx" + +BEGIN_NAMESPACE_HEXA + +class AnaQuads +{ +public: + AnaQuads (Quad* q1, Quad* q2, Quad* q3=NULL, Quad* q4=NULL, Quad* q5=NULL); + +public: + enum {MaxQuads=5}; + int status; + int nbr_quads; + int nbr_aretes; + Quad* tab_quads [MaxQuads]; + int inter_nbre [MaxQuads]; + int inter_edge [MaxQuads][MaxQuads]; // L'arete commune des 2 quads + int inter_quad [MaxQuads][QUAD4]; // Le quad touchant la ieme arete +}; +// ----------------------------------------------- Inlining +// ========================================================== Constructeur +inline AnaQuads::AnaQuads (Quad* q0, Quad* q1, Quad* q2, Quad* q3, Quad* q4) +{ + nbr_quads = 2; + nbr_aretes = 0; + status = HOK; + + for (int nquad=0 ; nquad < MaxQuads ; nquad++) + { + tab_quads [nquad] = NULL; + inter_nbre [nquad] = 0; + for (int nro=0 ; nro < QUAD4 ; nro++) + inter_quad [nquad][nro] = NOTHING; + for (int nro=0 ; nro < MaxQuads ; nro++) + inter_edge [nquad][nro] = NOTHING; + } + + tab_quads [0] = q0; + tab_quads [1] = q1; + tab_quads [2] = q2; + tab_quads [3] = q3; + tab_quads [4] = q4; + + if (q4 != NULL) nbr_quads = 5; + else if (q3 != NULL) nbr_quads = 4; + else if (q2 != NULL) nbr_quads = 3; + else nbr_quads = 2; + + for (int nquad1=0 ; nquad1 < nbr_quads ; nquad1++) + { + if (tab_quads[nquad1]==NULL || tab_quads[nquad1]->isDeleted()) + { + status = HERR; + return; + } + for (int nquad2=0 ; nquad2 < nquad1 ; nquad2++) + { + if (tab_quads[nquad1]==tab_quads[nquad2]) + { + status = HERR; + return; + } + int nedge2 = 0; + int nedge1 = tab_quads[nquad1]->inter (tab_quads[nquad2], nedge2) ; + if (nedge1 != NOTHING) + { + inter_edge [nquad1] [nquad2] = nedge1; + inter_quad [nquad1] [nedge1] = nquad2; + + inter_edge [nquad2] [nquad1] = nedge2; + inter_quad [nquad2] [nedge2] = nquad1; + + inter_nbre [nquad1]++; + inter_nbre [nquad2]++; + nbr_aretes++; + } + } + } +} +// ============================================================== distance +inline double distance (Vertex* v1, Vertex* v2) +{ + double vx = v1->getX () - v2->getX (); + double vy = v1->getY () - v2->getY (); + double vz = v1->getZ () - v2->getZ (); + double dist = sqrt (vx*vx + vy*vy + vz*vz); + return dist; +} +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexCloner.cxx b/src/HEXABLOCK/HexCloner.cxx new file mode 100755 index 0000000..31edc5a --- /dev/null +++ b/src/HEXABLOCK/HexCloner.cxx @@ -0,0 +1,242 @@ + +// C++ : Copiteur d'hexaedres + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "HexCloner.hxx" +#include "HexMatrix.hxx" + +#include "HexHexa.hxx" +#include "HexQuad.hxx" +#include "HexEdge.hxx" +#include "HexVertex.hxx" + +#include "HexElements.hxx" +#include "HexShape.hxx" + +BEGIN_NAMESPACE_HEXA + +void transfo_brep (string& brep, Matrix* matrice, string& trep); +void geom_dump_asso (Edge* edge); +static bool db = false; + +// ============================================================= Constructeur +Cloner::Cloner (Matrix* mat) +{ + matrice = mat; +} +// ============================================================== clonerVertex +Vertex* Cloner::clonerVertex (Vertex* orig) +{ + if (orig == NULL) + return orig; + + Vertex* copie = clone_vertex [orig]; + if (copie != NULL) + return copie; + + copie = new Vertex (orig); + matrice -> perform (copie); + clone_vertex [orig] = copie; + + Shape* tshape = copie->getAssociation (); + Shape* shape = orig ->getAssociation (); + if (tshape != NULL || shape == NULL) + return copie; + + string brep = shape->getBrep(); + string trep; + transfo_brep (brep, matrice, trep); + tshape = new Shape (trep); + copie ->setAssociation (tshape); + if (db) + { + printf ( " --- Cloner::Asso (%s) -> asso (%s)\n", orig ->getName (), + copie->getName ()); + } + return copie; +} +// ============================================================== clonerEdge +Edge* Cloner::clonerEdge (Edge* orig) +{ + if (orig == NULL) + return orig; + + Edge* copie = clone_edge [orig]; + if (copie != NULL) + return copie; + + copie = new Edge (orig); + + copie->e_vertex [V_AMONT] = clonerVertex (orig->e_vertex [V_AMONT]); + copie->e_vertex [V_AVAL] = clonerVertex (orig->e_vertex [V_AVAL]); + + copie->majReferences (); + clone_edge [orig] = copie; + + if (orig->debug()) + { + copie->printName (" est la copie de "); + orig ->printName ("\n"); + } + + const Shapes & new_asso = copie->getAssociations (); + int nbass = new_asso.size(); + if (nbass!=0) + return copie; + + const Shapes & tab_asso = orig->getAssociations (); + nbass = tab_asso.size(); + for (int nro=0 ; nro < nbass ; nro++) + { + Shape* shape = tab_asso [nro]; + string brep = shape->getBrep(); + string trep; + transfo_brep (brep, matrice, trep); + Shape* tshape = new Shape (trep); + tshape->setBounds (shape->debut, shape->fin); + copie ->addAssociation (tshape); + if (db) + { + printf ( " --- Cloner::Asso (%s) -> asso (%s)\n", orig ->getName (), + copie->getName ()); + geom_dump_asso (orig ); + geom_dump_asso (copie); + } + } + + return copie; +} +// ============================================================== clonerQuad +Quad* Cloner::clonerQuad (Quad* orig) +{ + if (orig == NULL) + return orig; + + Quad* copie = clone_quad [orig]; + if (copie != NULL) + return copie; + + copie = new Quad (orig); + + for (int nro=0 ; nroq_edge [nro] = clonerEdge (orig->q_edge [nro]); + + for (int nro=0 ; nroq_vertex [nro] = clonerVertex (orig->q_vertex [nro]); + + copie->majReferences (); + clone_quad [orig] = copie; + + const Shapes & new_asso = copie->getAssociations (); + int nbass = new_asso.size(); + if (nbass!=0) + return copie; + + const Shapes & tab_asso = orig->getAssociations (); + nbass = tab_asso.size(); + for (int nro=0 ; nro < nbass ; nro++) + { + Shape* shape = tab_asso [nro]; + string brep = shape->getBrep(); + string trep; + transfo_brep (brep, matrice, trep); + Shape* tshape = new Shape (trep); + copie ->addAssociation (tshape); + if (db) + printf ( " --- Asso (%s) -> asso (%s)\n", orig ->getName (), + copie->getName ()); + } + + return copie; +} +// ============================================================== clonerHexa +Hexa* Cloner::clonerHexa (Hexa* orig) +{ + if (orig == NULL) + return orig; + + Hexa* copie = clone_hexa [orig]; + if (copie != NULL) + return copie; + + copie = new Hexa (orig); + for (int nro=0 ; nroh_quad [nro] = clonerQuad (orig->h_quad [nro]); + + for (int nro=0 ; nroh_edge [nro] = clonerEdge (orig->h_edge [nro]); + + for (int nro=0 ; nroh_vertex [nro] = clonerVertex (orig->h_vertex [nro]); + + copie->majReferences (); + clone_hexa [orig] = copie; + return copie; +} +// ============================================================== clonerElements +Elements* Cloner::clonerElements (Elements* orig) +{ + Elements* copie = new Elements (orig); + if (db) + { + double a11,a12,a13,a14, a21,a22,a23,a24, a31,a32,a33,a34; + matrice->getCoeff (a11,a12,a13,a14, a21,a22,a23,a24, a31,a32,a33,a34); + printf ( "\n"); + printf ( " --- Matrice = (%g, %g, %g) (%g) \n", a11,a12,a13,a14 ); + printf ( " (%g, %g, %g) (%g) \n", a21,a22,a23,a24 ); + printf ( " (%g, %g, %g) (%g) \n", a31,a32,a33,a34 ); + } + + int nombre = orig->countHexa (); + for (int nro=0 ; nrogetHexa (nro); + Hexa* elt2 = clonerHexa (elt); + copie->setHexa (elt2, nro); + } + + nombre = orig->countQuad (); + for (int nro=0 ; nrogetQuad (nro); + Quad* elt2 = clonerQuad (elt); + copie->setQuad (elt2, nro); + } + + nombre = orig->countEdge (); + for (int nro=0 ; nrogetEdge (nro); + Edge* elt2 = clonerEdge (elt); + copie->setEdge (elt2, nro); + } + + nombre = orig->countVertex (); + for (int nro=0 ; nrogetVertex (nro); + Vertex* elt2 = clonerVertex (elt); + copie->setVertex (elt2, nro); + } + + + return copie; +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexCloner.hxx b/src/HEXABLOCK/HexCloner.hxx new file mode 100755 index 0000000..432833a --- /dev/null +++ b/src/HEXABLOCK/HexCloner.hxx @@ -0,0 +1,52 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// class : Le Reproducteur de blocks + +#ifndef __CLONER_H +#define __CLONER_H + +#include "hexa_base.hxx" + +#include + +BEGIN_NAMESPACE_HEXA + +class Cloner +{ +public: + Cloner (Matrix* mat); + + void erase (); + + Hexa* clonerHexa (Hexa* orig); + Quad* clonerQuad (Quad* orig); + Edge* clonerEdge (Edge* orig); + Vertex* clonerVertex (Vertex* orig); + Elements* clonerElements (Elements* orig); + +private: + Matrix* matrice; + std::map clone_hexa; + std::map clone_quad; + std::map clone_edge; + std::map clone_vertex; +}; +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexCramer.hxx b/src/HEXABLOCK/HexCramer.hxx new file mode 100755 index 0000000..24bad26 --- /dev/null +++ b/src/HEXABLOCK/HexCramer.hxx @@ -0,0 +1,161 @@ + +// class : Resolution d'un systeme de Cramer + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __CRAMER_H_ +#define __CRAMER_H_ + +#include "hexa_base.hxx" +// #include + +BEGIN_NAMESPACE_HEXA + +class Cramer +{ +public: + Cramer (int size); + ~Cramer (); + + void defMatrix (double matuser[]); + int resoudre (double matr[], double second[], double sol[]); + void multiply (double vect[], double result[]); + +private: + int resoudre (double msecond[], double solution[]); + double determinant (); + void defCofacteur (Cramer* orig, int lig, int col); + bool cestNul (double x) { return x > -1e-10 && x < 1e-10 ; } +private: + const int mat_size; + double** matrix; + double* col_saved; + Cramer* co_facteur; +}; +// ========================================================= Constructeur +inline Cramer::Cramer (int size) + : mat_size(size) +{ + matrix = new double* [mat_size]; + col_saved = new double [mat_size]; + co_facteur = NULL; + if (mat_size > 2) + co_facteur = new Cramer (mat_size-1); + + for (int nl=0 ; nldefCofacteur (this, ni, 0); + double signe = (ni MODULO 2) ? -1.0 : 1.0; + det += signe*matrix[ni][0] * co_facteur->determinant (); + } + } + return det; +} +// ========================================================= defCofacteur +inline void Cramer::defCofacteur (Cramer* orig, int lig, int col) +{ + for (int nl=0 ; nlmatrix[ni][nj]; + } + } +} +// ========================================================= resoudre +inline int Cramer::resoudre (double mat[], double second[], double sol[]) +{ + defMatrix (mat); + int ier = resoudre (second, sol); + return ier; +} +// ========================================================= multiply +inline void Cramer::multiply (double facteur[], double produit[]) +{ + for (int ni=0 ; ni + +static bool db = false; + +static const double UnSur2pi = DEMI/M_PI; + +BEGIN_NAMESPACE_HEXA + +void geom_create_circle (double* milieu, double rayon, double* normale, + double* base, string& brep); + +void geom_define_line (string& brep); +void geom_asso_point (double angle, Vertex* node); + +// ====================================================== Constructeur +CrossElements::CrossElements (Document* doc, EnumGrid type) + : Elements (doc) +{ + cross_cyl1 = NULL; + cross_cyl1 = NULL; + cross_cyl2 = NULL; + cross_center = NULL; + grid_type = type; + angle_inter [CylSmall] = angle_inter [CylBig] = 0; + at_right = at_left = true; + is_filled = false; +} +// ====================================================== resize +void CrossElements::resize () +{ + size_hx = 2; + size_hy = S_MAXI; + size_hz [CylSmall] = size_h1z; + size_hz [CylBig] = size_h2z; + + size_vx = size_hx + 1; + size_vy = size_hy; + size_vz[CylSmall] = size_v1z; + size_vz[CylBig] = size_v2z; + + nbr_vertex1 = size_vx*size_vy* size_v1z; + nbr_quads1 = nbr_vertex1*DIM3; + nbr_edges1 = nbr_quads1; + nbr_hexas1 = size_hx * size_hy * size_h1z; + + nbr_vertex = nbr_vertex1 + size_vx * size_vy * size_v1z; + nbr_quads = nbr_vertex*DIM3; + nbr_edges = nbr_quads; + nbr_hexas = nbr_hexas1 + size_hx * size_hy * size_h2z; + + tab_hexa .resize (nbr_hexas*2); + tab_quad .resize (nbr_quads*2); + tab_edge .resize (nbr_edges*2); + tab_vertex.resize (nbr_vertex*2); + + for (int nc=0 ; nc< nbr_hexas ; nc++) tab_hexa [nc] = NULL; + for (int nc=0 ; nc< nbr_quads ; nc++) tab_quad [nc] = NULL; + for (int nc=0 ; nc< nbr_edges ; nc++) tab_edge [nc] = NULL; + for (int nc=0 ; nc< nbr_vertex ; nc++) tab_vertex [nc] = NULL; +} +// ====================================================== indHexa +int CrossElements::indHexa (int cyl, int nx, int ny, int nz) +{ + if (cyl<0 || cyl>1) + return NOTHING; + if ( nx < 0 || nx >= size_hx || ny < 0 || ny >= size_hy + || nz < 0 || nz >= size_hz[cyl]) return NOTHING; + + int nro = cyl*nbr_hexas1 + nx + size_hx*ny + size_hx*size_hy*nz; + return nro; +} +// ====================================================== indQuad +int CrossElements::indQuad (int cyl, int dd, int nx, int ny, int nz) +{ + if (cyl<0 || cyl>1 || dd <0 || dd >= DIM3) + return NOTHING; + if ( nx < 0 || nx >= size_vx || ny < 0 || ny >= size_vy + || nz < 0 || nz >= size_vz[cyl]) return NOTHING; + + int nro = cyl*nbr_quads1 + nx + size_vx*ny + size_vx*size_vy*nz + + size_vx*size_vy*size_vz[cyl]*dd; + return nro; +} +// ====================================================== indEdge +int CrossElements::indEdge (int cyl, int dd, int nx, int ny, int nz) +{ + return indQuad (cyl, dd, nx, ny, nz); +} +// ====================================================== indVertex +int CrossElements::indVertex (int cyl, int nx, int ny, int nz) +{ + if (cyl<0 || cyl>1) + return NOTHING; + if ( nx < 0 || nx >= size_vx || ny < 0 || ny >= size_vy + || nz < 0 || nz >= size_vz[cyl]) + return NOTHING; + + int nro = cyl*nbr_vertex1 + nx + size_vx*ny + size_vx*size_vy*nz; + return nro; +} +// ------------------------------------------------------------------------ +// ====================================================== getHexaIJK +Hexa* CrossElements::getHexaIJK (int cyl, int nx, int ny, int nz) +{ + int nro = indHexa (cyl, nx, ny, nz); + + if (nro >= 0 && tab_hexa[nro]!= NULL && tab_hexa[nro]->isHere ()) + return tab_hexa [nro]; + else + return NULL; +} +// ====================================================== getQuadIJ +Quad* CrossElements::getQuadIJ (int cyl, int nx, int ny, int nz) +{ + int nro = indQuad (cyl, dir_z, nx, ny, nz); + if (nro<0) + return NULL; + + return tab_quad [nro]; +} +// ====================================================== getQuadJK +Quad* CrossElements::getQuadJK (int cyl, int nx, int ny, int nz) +{ + int nro = indQuad (cyl, dir_x, nx, ny, nz); + if (nro<0) + return NULL; + return tab_quad [nro]; +} +// ====================================================== getQuadIK +Quad* CrossElements::getQuadIK (int cyl, int nx, int ny, int nz) +{ + int nro = indQuad (cyl, dir_y, nx, ny, nz); + if (nro<0) + return NULL; + return tab_quad [nro]; +} +// ====================================================== getEdgeI +Edge* CrossElements::getEdgeI (int cyl, int nx, int ny, int nz) +{ + int nro = indEdge (cyl, dir_x, nx, ny, nz); + if (nro<0) + return NULL; + return tab_edge [nro]; +} +// ====================================================== getEdgeJ +Edge* CrossElements::getEdgeJ (int cyl, int nx, int ny, int nz) +{ + int nro = indEdge (cyl, dir_y, nx, ny, nz); + if (nro<0) + return NULL; + return tab_edge [nro]; +} +// ====================================================== getEdgeK +Edge* CrossElements::getEdgeK (int cyl, int nx, int ny, int nz) +{ + int nro = indEdge (cyl, dir_z, nx, ny, nz); + if (nro<0) + return NULL; + return tab_edge [nro]; +} +// ====================================================== getVertexIJK +Vertex* CrossElements::getVertexIJK (int cyl, int nx, int ny, int nz) +{ + int nro = indVertex (cyl, nx, ny, nz); + if (nro<0) + return NULL; + return tab_vertex [nro]; +} +// ------------------------------------------------------------------------ +// ====================================================== setHexa +void CrossElements::setHexa (Hexa* elt, int cyl, int nx, int ny, int nz) +{ + if (db) + { + printf ("tab_hexa [%d, %d,%d,%d] = ", cyl, nx, ny, nz); + PrintName (elt); + printf ("\n"); + } + + int nro = indHexa (cyl, nx, ny, nz); + if (nro<0) + return; + tab_hexa [nro] = elt; +} +// ====================================================== setQuad +void CrossElements::setQuad (Quad* elt, int cyl, int dd, int nx, int ny, int nz) +{ + if (db) + { + printf ("tab_quad [%d,%d, %d,%d,%d] = ", cyl, dd, nx, ny, nz); + PrintName (elt); + printf ("\n"); + } + + int nro = indQuad (cyl, dd, nx, ny, nz); + if (nro<0) + return; + tab_quad [nro] = elt; +} +// ====================================================== setEdge +void CrossElements::setEdge (Edge* elt, int cyl, int dd, int nx, int ny, int nz) +{ + if (db) + { + printf ("tab_edge [%d,%d, %d,%d,%d] = ", cyl, dd, nx, ny, nz); + PrintName (elt); + printf ("\n"); + } + + int nro = indEdge (cyl, dd, nx, ny, nz); + if (nro<0) + return; + tab_edge [nro] = elt; +} +// ====================================================== setVertex +void CrossElements::setVertex (Vertex* elt, int cyl, int nx, int ny, int nz) +{ + if (db) + { + printf ("tab_vertex [%d, %d,%d,%d] = ", cyl, nx, ny, nz); + PrintName (elt); + printf ("\n"); + } + + int nro = indVertex (cyl, nx, ny, nz); + if (nro<0) + return; + tab_vertex [nro] = elt; +} +// ====================================================== setVertex (2) +inline bool isequals (double v1, double v2) +{ + const double eps = 0.01; + bool equals = v1 <= v2 + eps && v1 >= v2 - eps; + return equals; +} +// ====================================================== setVertex (2) +void CrossElements::setVertex (int cyl, int nx, int ny, int nz, double px, + double py, double pz) +{ + if (isequals (px, 0) && isequals (py, -1.5) && isequals (pz, 5)) + printf (" Vertex trouve : Cyl%d [%d,%d,%d] = (%g,%g,%g)\n", + cyl, nx,ny,nz, px,py,pz); + + int nro = indVertex (cyl, nx, ny, nz); + if (nro<0) + return; + else if (tab_vertex[nro] != NULL) + { + Vertex* node = tab_vertex[nro]; + if (node->definedBy (px, py, pz)) + return; + + printf (" ************ ATTENTION ****************\n"); + printf (" Creation d'un vertex : Cyl%d [%d,%d,%d] = (%g,%g,%g)\n", + cyl, nx,ny,nz, px,py,pz); + printf (" Indice %d deja occupe par le vertex (%g,%g,%g)\n", nro, + node->getX(), node->getY(), node->getZ()); + + return; + } + + int trouve = findVertex (px, py, pz); + if (trouve>=0) + { + printf (" Creation d'un vertex : Cyl%d [%d,%d,%d] = (%g,%g,%g)\n", + cyl, nx,ny,nz, px,py,pz); + printf (" Vertex %d present a l'indice %d\n", nro, trouve); + tab_vertex [nro] = tab_vertex [trouve]; + return; + } + Vertex* node = el_root->addVertex (px, py, pz); + setVertex (node, cyl, nx, ny, nz); +} +// ====================================================== copyEdge +void CrossElements::copyEdge (int d1, int i1, int j1, int k1, int d2, int i2, + int j2, int k2) +{ + Edge* edge = NULL; + switch (d1) + { + case dir_x : edge = getEdgeI (CylSmall, i1, j1, k1); + break; + case dir_y : edge = getEdgeJ (CylSmall, i1, j1, k1); + break; + case dir_z : edge = getEdgeK (CylSmall, i1, j1, k1); + break; + } + + setEdge (edge, CylBig, d2, i2, j2, k2); +} +// ====================================================== copyQuad +void CrossElements::copyQuad (int d1, int i1, int j1, int k1, int d2, int i2, + int j2, int k2) +{ + Quad* quad = NULL; + switch (d1) + { + case dir_x : quad = getQuadJK (CylSmall, i1, j1, k1); + break; + case dir_y : quad = getQuadIK (CylSmall, i1, j1, k1); + break; + case dir_z : quad = getQuadIJ (CylSmall, i1, j1, k1); + break; + } + + setQuad (quad, CylBig, d2, i2, j2, k2); +} +// ====================================================== addEdge +Edge* CrossElements::addEdge (Vertex* v1, Vertex* v2, int cyl, int dir, + int nx, int ny, int nz) +{ + Edge* edge = NULL; + if (v1==NULL || v2==NULL) + return NULL; + + else if (cyl==CylBig) + { + edge = findEdge1 (v1, v2); + /* ************************************************ + if (edge != NULL) + { + printf (" Edge (%d, %d,%d,%d) trouve = ", dir, nx, ny, nz); + edge->printName ("\n"); + } + ************************************************ */ + } + + if (edge == NULL) + edge = newEdge (v1, v2); + + setEdge (edge, cyl, dir, nx, ny, nz); + return edge; +} +// ====================================================== addHexa +Hexa* CrossElements::addHexa (Quad* q1, Quad* q2, Quad* q3, Quad* q4, Quad* q5, + Quad* q6, int cyl, int nx, int ny, int nz) +{ +/* ************************** + if (cyl==CylSmall) + { + if (nx == 0) return NULL; + if (nz != 1) return NULL; + if (ny != 4) return NULL; + return NULL; + } + + if (cyl==CylBig) + { + if (nz > 2) return NULL; + if (nz < 1) return NULL; + // if (nx == 0) return NULL; + // if (ny != 4) return NULL; + } + ************************** */ + + Hexa* hexa = NULL; + if (cyl==CylBig) + hexa = findHexa1 (q1, q2); + + if (hexa == NULL) + hexa = newHexa (q1, q2, q3, q4, q5, q6); + else if (db) + { + printf (" Hexa (%d,%d,%d) trouve = ", nx, ny, nz); + hexa->printName ("\n"); + } + + setHexa (hexa, cyl, nx, ny, nz); + return hexa; +} +// ====================================================== addQuad +Quad* CrossElements::addQuad (Edge* e1, Edge* e2, Edge* e3, Edge* e4, int cyl, + int dir, int nx, int ny, int nz) +{ + Quad* quad = NULL; + if (cyl==CylBig) + quad = findQuad1 (e1, e3); + + if (quad == NULL) + quad = newQuad (e1, e2, e3, e4); + else if (db) + { + printf (" Quad (%d, %d,%d,%d) trouve = ", dir, nx, ny, nz); + quad->printName ("\n"); + } + + setQuad (quad, cyl, dir, nx, ny, nz); + return quad; +} +// ====================================================== findEdge1 +Edge* CrossElements::findEdge1 (Vertex* v1, Vertex* v2) +{ + for (int nc=0; nc < nbr_edges1 ; nc++) + if (tab_edge[nc] != NULL && tab_edge[nc]->definedBy (v1, v2)) + return tab_edge[nc]; + + return NULL; +} +// ====================================================== findHexa1 +Hexa* CrossElements::findHexa1 (Quad* e1, Quad* e2) +{ + for (int nc=0; nc < nbr_hexas1 ; nc++) + if (tab_hexa[nc] != NULL && tab_hexa[nc]->definedBy (e1, e2)) + return tab_hexa[nc]; + + return NULL; +} +// ====================================================== findQuad1 +Quad* CrossElements::findQuad1 (Edge* e1, Edge* e2) +{ + for (int nc=0; nc < nbr_quads1 ; nc++) + if (tab_quad[nc] != NULL && tab_quad[nc]->definedBy (e1, e2)) + return tab_quad[nc]; + + return NULL; +} +// ====================================================== fillGrid +void CrossElements::fillGrid (int cyl, int deb, int fin) +{ + int nz0 = deb >= 0 ? deb : 0; + int nzn = fin > 0 ? fin : size_vz [cyl]; + + fillCenter (cyl, nz0, nzn); + + for (int nz=nz0 ; nz0) + { + // Edges verticaux + cloisons interieures + for (int ny=0 ; ny0) + { + // Edges verticaux + cloisons interieures + Vertex* vhaut = getVertexIJK (cyl,nx,0, nz-1); + Edge* pilier = addEdge (center, vhaut, cyl, dir_z, nx, 0, nz-1); + + for (int ny=0 ; nygetX () - orig->getX (); + double dy = inter->getY () - orig->getY (); + double dz = inter->getZ () - orig->getZ (); + double dd = sqrt (dx*dx + dy*dy + dz*dz); + return dd; +} +// ===================================================== assoSlice +void CrossElements::assoSlice (int cyl, double* base, double* normal, int nx, + int nzs) +{ + Real3 center, pnt1, pnt2; + string brep; + + Vertex* v_n = getVertexIJK (cyl, nx, S_N , nzs); + Vertex* v_s = getVertexIJK (cyl, nx, S_S , nzs); + + v_s->getPoint (pnt1); + v_n->getPoint (pnt2); + + double rayon = calc_distance (pnt1, pnt2)/2; + for (int nro=0 ; nrosetBounds (angle1*UnSur2pi, angle2*UnSur2pi); + edge ->addAssociation (shape); + + Vertex* node = getVertexIJK (cyl, nx, ny, nz); + geom_asso_point (angle1*rayon, node); + + int ny1 = ny+1; + if (ny1>=S_MAXI) + ny1 = 0; + + node = getVertexIJK (cyl, nx, ny1, nz); + geom_asso_point (angle2*rayon, node); +} +// ====================================================== getAngle +double CrossElements::getAngle (int cyl, int nj) +{ + switch (nj) + { + case S_E : return 0; + case S_NE : return angle_inter[cyl]; + case S_N : return M_PI/2; + case S_NW : return M_PI - angle_inter[cyl]; + case S_W : return M_PI; + case S_SW : return M_PI + angle_inter[cyl]; + case S_S : return 3*M_PI/2; + case S_SE : return 2*M_PI - angle_inter[cyl]; + case S_MAXI : return 2*M_PI; + default : break; + } + return 0; +} +// ====================================================== addVertex +void CrossElements::addVertex (int cyl, int ni, int nj, int nk, double px, + double rayon) +{ + if (rayon<0.0) + rayon = cross_rayon [cyl][ni]; + double theta = getAngle (cyl, nj); + + if (cyl==CylSmall) + setVertex (cyl, ni, nj, nk, px, rayon*cos(theta), rayon*sin(theta)); + else + setVertex (cyl, ni, nj, nk, rayon*cos(theta), rayon*sin(theta), px); +} +// ====================================================== addSlice +void CrossElements::addSlice (int cyl, int ni, int nk, double px, double rayon) +{ + for (int nj=0 ; nj < S_MAXI ; nj++) + addVertex (cyl, ni, nj, nk, px, rayon); +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexCrossElements.hxx b/src/HEXABLOCK/HexCrossElements.hxx new file mode 100755 index 0000000..07d31ea --- /dev/null +++ b/src/HEXABLOCK/HexCrossElements.hxx @@ -0,0 +1,134 @@ + +// Class : Gestion des tutaux en T (like castles in scotland) + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __CROSS_ELEMENTS_H +#define __CROSS_ELEMENTS_H + +#include "HexElements.hxx" + +BEGIN_NAMESPACE_HEXA + +enum { NbrSlices1=6, NbrSlices2=4 }; +enum { SizeRay=3, BiCyl=2}; +enum { NbrVSlices1=NbrSlices1+1, NbrVSlices2=NbrSlices2+1}; +enum { MiddleSlice1=NbrSlices1/2}; +enum { Cyl1=CylSmall, Cyl2=CylBig }; +enum { NO_CYL=-1, NO_PIPE=0, IS_HERE=1 }; + +class CrossElements : public Elements +{ +public: + virtual int countHexa () { return nbr_hexas ; } + virtual int countQuad () { return nbr_quads ; } + virtual int countEdge () { return nbr_edges ; } + virtual int countVertex () { return nbr_vertex ; } + +public: + CrossElements (Document* doc, EnumGrid type=GR_BICYL); + + virtual ~CrossElements () {} + + Hexa* getHexaIJK (int part, int nx, int ny, int nz); + Quad* getQuadIJ (int part, int nx, int ny, int nz); + Quad* getQuadJK (int part, int nx, int ny, int nz); + Quad* getQuadIK (int part, int nx, int ny, int nz); + Edge* getEdgeI (int part, int nx, int ny, int nz); + Edge* getEdgeJ (int part, int nx, int ny, int nz); + Edge* getEdgeK (int part, int nx, int ny, int nz); + Vertex* getVertexIJK (int part, int nx, int ny, int nz); + + // Tutaux en T (like castles in scotland) + int crossCylinders (Cylinder* cyl1, Cylinder* cyl2, bool fill=true); + void dump (); + void dumpVertex (); + void dumpHexas (); + +private : + + void resize (); + void fillGrid (int cyl, int deb=-1, int fin=-1); + void fillCenter (int cyl, int deb, int fin); + void createLittleCyl (); + void createBigCyl (); + + void copyVertex (int i1, int j1, int k1, int i2, int j2, int k2); + void copyEdge (int d1, int i, int j, int k, int d2, int i2, int j2, int k2); + void copyQuad (int d1, int i, int j, int k, int d2, int i2, int j2, int k2); + + void setVertex (int cyl, int nx, int ny, int nz, double px, double py, + double pz); + + void setVertex (Vertex* vv, int cyl, int nx, int ny, int nz); + void setEdge (Edge* edge, int cyl, int dir, int nx, int ny, int nz); + void setQuad (Quad* quad, int cyl, int dir, int nx, int ny, int nz); + void setHexa (Hexa* cell, int cyl, int nx, int ny, int nz); + + Edge* addEdge (Vertex* v1, Vertex* v2, int cyl, int dir, int nx, + int ny, int nz); + Quad* addQuad (Edge* e1, Edge* e2, Edge* e3, Edge* e4, int cyl, int dir, + int nx, int ny, int nz); + Hexa* addHexa (Quad* qa, Quad* qb, Quad* qc, Quad* qd, Quad* qe, Quad* qf, + int cyl, int nx, int ny, int nz); + + int indVertex (int cyl, int nx, int ny, int nz); + int indHexa (int cyl, int nx, int ny, int nz); + int indQuad (int cyl, int dir, int nx, int ny, int nz); + int indEdge (int cyl, int dir, int nx, int ny, int nz); + + Hexa* findHexa1 (Quad* q1, Quad* q2); + Edge* findEdge1 (Vertex* v1, Vertex* v2); + Quad* findQuad1 (Edge* e1, Edge* e2); + + void assoCylinder (int cyl, double* normal); + void assoSlice (int cyl, double* base, double* norm, int nx, int zlice); + void assoArc (int cyl, int nx, int ny, int nz, string& brep, double ray); + void assoBigMiddle (double* base, double* normal, int nzlice); + int assoIntersection (int nx, int nzlice, double* snorm, double* bnorm); + + + double getAngle (int cyl, int ny); + void addSlice (int cyl, int ni, int nk, double px, double rayon=-1); + void addVertex (int cyl, int ni, int nj, int nk, double px, double rayon); + void majIntersection (); + void adjustLittleSlice (int nx, int nk, int nxbig); + +private : + enum {NbrIntCotes = 4 }; + enum {size_hiy = NbrIntCotes, size_h1z = 6, size_h2z=4}; + enum {size_v1z = size_h1z+1, size_v2z = size_h2z+1}; + + bool is_filled; + Cylinder* cross_cyl1; + Cylinder* cross_cyl2; + Vertex* cross_center; + + int size_vz[BiCyl], size_hz[BiCyl]; + int nbr_hexas1, nbr_quads1, nbr_edges1, nbr_vertex1; + + double angle_inter [BiCyl]; + double cross_rayon [BiCyl][SizeRay]; + double big_hauteur [size_v2z]; + + bool at_right, at_left; + int cyl_right, cyl_left; +}; +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexCrossElements_build.cxx b/src/HEXABLOCK/HexCrossElements_build.cxx new file mode 100755 index 0000000..709ec72 --- /dev/null +++ b/src/HEXABLOCK/HexCrossElements_build.cxx @@ -0,0 +1,564 @@ + +// C++ : Gestion des cylindres croises : construction + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexCrossElements.hxx" + +#include "HexDocument.hxx" +#include "HexVector.hxx" +#include "HexVertex.hxx" +#include "HexHexa.hxx" +#include "HexEdge.hxx" + +#include "HexGlobale.hxx" +#include "HexCylinder.hxx" +#include "HexShape.hxx" + +static bool db = false; + +BEGIN_NAMESPACE_HEXA + +static const int MaxLevel = 7; +static const double epaiss2 = 0.5; +static const double UnSur2pi = DEMI/M_PI; + +double calcul_centre (Vertex* orig, Vertex* inter); + +void geom_define_line (string& brep); +void geom_asso_point (double angle, Vertex* node); + +void geom_create_circle (double* milieu, double rayon, double* normale, + double* base, string& brep); +int geom_create_cylcyl (double* borig, double* bnorm, double* bbase, + double bray, double bhaut, + double* sorig, double* snorm, double* sbase, + double sray, double shaut); +int geom_asso_cylcyl (Edge* edge); + +// ====================================================== createBigCyl +void CrossElements::createBigCyl () +{ + const int iv0 = 0; + const int kv_mil = cyl_left != NO_PIPE ? 2 : 3 ; + + enum { k0, k1, k2, k3, k4 }; + double z0, z1, z2, z3, z4; + + z0 = big_hauteur[0] = - calcul_centre (cross_cyl2->getBase(), cross_center); + z4 = big_hauteur[4] = z0 + cross_cyl2->getHeight (); + + z1 = big_hauteur[1] = getVertexIJK (CylSmall, NxExt, S_SE, kv_mil)->getZ(); + z2 = big_hauteur[2] = getVertexIJK (CylSmall, NxExt, S_E, kv_mil)->getZ(); + z3 = big_hauteur[3] = getVertexIJK (CylSmall, NxExt, S_NE, kv_mil)->getZ(); + + + setVertex (CylBig, iv0, 0, k0, 0, 0, z0); + addSlice (CylBig, NxInt, k0, z0); + addSlice (CylBig, NxExt, k0, z0); + + setVertex (CylBig, iv0, 0, k4, 0, 0, z4); + addSlice (CylBig, NxInt, k4, z4); + addSlice (CylBig, NxExt, k4, z4); + + //------------------------------- Points intermediaires : + + double xe1 = getVertexIJK (CylBig, NxExt, S_N, k0)->getX(); + double ye1 = getVertexIJK (CylBig, NxExt, S_N, k0)->getY(); + + double xe2 = getVertexIJK (CylBig, NxExt, S_S, k0)->getX(); + double ye2 = getVertexIJK (CylBig, NxExt, S_S, k0)->getY(); + + double xi1 = getVertexIJK (CylBig, NxInt, S_N, k0)->getX(); + double yi1 = getVertexIJK (CylBig, NxInt, S_N, k0)->getY(); + + double xi2 = getVertexIJK (CylBig, NxInt, S_S, k0)->getX(); + double yi2 = getVertexIJK (CylBig, NxInt, S_S, k0)->getY(); + + //------------------------------- Reprise des vertex du cylindre 1 + + //------------------------------- Centre + if (grid_type != GR_BIPIPE) + copyVertex (NxExt, S_S, 3, iv0, 0, k1); + + //------------------------------- Creation Vertex Nord-Sud + for (int nk=k1 ; nkgetX(); + double py = node->getY(); + for (int nk=1; nk<4 ; nk++) + { + node = getVertexIJK (CylBig, NxInt, nj, nk); + if (node != NULL) + { + node -> setX (px); + node -> setY (py); + } + } + } + } + fillGrid (CylBig); +} +// ====================================================== createLittleCyl +void CrossElements::createLittleCyl () +{ + double c1 = calcul_centre (cross_cyl1->getBase(), cross_center); + // double cosalpha = cos (angle_inter[CylBig]); + double prayext = cross_rayon [CylBig][NxExt]; // * cosalpha; + double prayint = cross_rayon [CylBig][NxInt]; // * cosalpha; + + double t_haut [MaxLevel] = { -c1, -prayext, -prayint, + 0, prayint, prayext, + cross_cyl1->getHeight () -c1 }; + + double rm = ( cross_rayon [CylSmall][NxExt] + + cross_rayon [CylSmall][NxInt]) / 2; + double rc = cross_rayon [CylBig] [NxInt]; + + double t_rayext [MaxLevel] = { -1, -1, rm, rc, rm, -1, -1 }; + +/* ******************************************************************* + int nkdeb = at_left ? 0 : size_v1z/2; + int nkfin = at_right ? size_v1z : size_v1z/2; + ******************************************************************* */ + + int nkdeb, nkfin; + switch (cyl_left) + { + case IS_HERE : nkdeb = 0; + break; + case NO_PIPE : nkdeb = size_v1z/2; + break; + case NO_CYL : nkdeb = 1; + break; + } + switch (cyl_right) + { + case IS_HERE : nkfin = size_v1z; + break; + case NO_PIPE : nkfin = size_v1z/2; + break; + case NO_CYL : nkfin = size_v1z-1; + break; + } + + for (int nk = nkdeb ; nkgetRadius() < lautre->getRadius()) + { + cross_cyl1 = lun; + cross_cyl2 = lautre; + } + else + { + cross_cyl1 = lautre; + cross_cyl2 = lun; + } + + cross_center = cross_cyl2->interCylinder (cross_cyl1, at_left, at_right); + if (cross_center==NULL) + return HERR; + + if (at_left) cyl_left = IS_HERE; + else if (grid_type == GR_BIPIPE) cyl_left = NO_PIPE; + else cyl_left = NO_CYL; + + if (at_right) cyl_right = IS_HERE; + else if (grid_type == GR_BIPIPE) cyl_right = NO_PIPE; + else cyl_right = NO_CYL; + + double cross_gray1 = cross_cyl1->getRadius (); + double cross_gray2 = cross_cyl2->getRadius (); + double cross_igray1 = cross_gray1 * epaiss2; + double cross_igray2 = cross_gray2 * epaiss2; + + if (db) + { + HexDisplay (cross_gray1); + HexDisplay (cross_gray2); + HexDisplay (cross_igray2); + HexDisplay (cross_igray1); + } + + angle_inter [CylSmall] = M_PI/6; + angle_inter [CylBig] = asin (cross_gray1/cross_gray2); + + cross_rayon [CylSmall] [0] = cross_rayon [CylBig] [0] = 0; + + cross_rayon [CylSmall] [NxInt] = cross_igray1; + cross_rayon [CylSmall] [NxExt] = cross_gray1; + cross_rayon [CylBig] [NxInt] = cross_igray2; + cross_rayon [CylBig] [NxExt] = cross_gray2; + + createLittleCyl (); + createBigCyl (); + + if (cyl_left!=NO_PIPE) + { + adjustLittleSlice (NxExt, 1, NxExt); + adjustLittleSlice (NxInt, 1, NxExt); + if (grid_type == GR_BIPIPE) + adjustLittleSlice (NxInt, 2, NxInt); + } + + if (cyl_right!=NO_PIPE) + { + adjustLittleSlice (NxExt, 5, NxExt); + adjustLittleSlice (NxInt, 5, NxExt); + if (grid_type == GR_BIPIPE) + adjustLittleSlice (NxInt, 4, NxInt); + } + + Vector* iprim = new Vector (cross_cyl1->getDirection()); + Vector* kprim = new Vector (cross_cyl2->getDirection()); + Vector* jprim = new Vector (kprim); + + iprim->renormer (); + kprim->renormer (); + jprim->vectoriel (kprim, iprim); + + transfoVertices (cross_center, iprim, jprim, kprim); + + Real3 snorm, bnorm; + iprim->getCoord (snorm); + kprim->getCoord (bnorm); + assoCylinder (CylSmall, snorm); + assoCylinder (CylBig, bnorm); + + if (cyl_left == IS_HERE) + { + assoIntersection (NxExt, 1, snorm, bnorm); + if (grid_type == GR_BIPIPE) + { + assoIntersection (NxInt, 2, snorm, bnorm); + } + } + + if (cyl_right == IS_HERE) + { + assoIntersection (NxExt, NbrSlices1-1, snorm, bnorm); + if (grid_type == GR_BIPIPE) + { + assoIntersection (NxInt, NbrSlices1-2, snorm, bnorm); + } + } + + assoResiduelle (); + return HOK; +} +// ====================================================== copyVertex +void CrossElements::copyVertex (int i1, int j1, int k1, int i2, int j2, int k2) +{ + Vertex* node = getVertexIJK (CylSmall, i1, j1, k1); + if (node!=NULL) + { + setVertex (node, CylBig, i2, j2, k2); + return; + } + + double rayon = cross_rayon [CylBig][i2]; + double hauteur = big_hauteur [k2]; + + addVertex (CylBig, i2, j2, k2, hauteur, rayon); +} +// ===================================================== assoCylinder +void CrossElements::assoCylinder (int cyl, double* normal) +{ + Real3 base, vec1, center, east, west, nordest; + int nk = 0; + if (cyl==CylSmall && cyl_left == NO_PIPE) + nk = size_hz[cyl]; + + Vertex* v_e = getVertexIJK (cyl, NxExt, S_E , nk); + Vertex* v_ne = getVertexIJK (cyl, NxExt, S_NE, nk); + Vertex* v_w = getVertexIJK (cyl, NxExt, S_W , nk); + + v_e->getPoint (east); + v_w->getPoint (west); + calc_vecteur (west, east, base); + + for (int nro=0 ; nrogetPoint (nordest); + calc_vecteur (center, nordest, vec1); + + double ps = prod_scalaire (base, vec1); + double pnorm = calc_norme(base) * calc_norme(vec1); + + angle_inter [cyl] = acos (ps/pnorm); + + if (cyl==CylBig || at_left) + { + assoSlice (cyl, base, normal, NxExt, 0); + if (grid_type == GR_BIPIPE) + { + assoSlice (cyl, base, normal, NxInt, 0); + assoSlice (cyl, base, normal, NxInt, 1); + } + } + + if (cyl==CylBig || cyl_right == IS_HERE) + { + assoSlice (cyl, base, normal, NxExt, size_hz[cyl]); + if (grid_type == GR_BIPIPE) + { + assoSlice (cyl, base, normal, NxInt, size_hz[cyl]); + assoSlice (cyl, base, normal, NxInt, size_hz[cyl]-1); + } + } + + if (cyl==CylBig) + for (int nz=1 ; nz<=3 ; nz++) + assoBigMiddle (base, normal, nz); +} +// ===================================================== assoBigMiddle +void CrossElements::assoBigMiddle (double* base, double* normal, int nzs) +{ + Real3 center, pnt1, pnt2; + string brep; + int nx = NxExt; + + Vertex* v_n = getVertexIJK (CylBig, nx, S_N , nzs); + Vertex* v_s = getVertexIJK (CylBig, nx, S_S , nzs); + + v_s->getPoint (pnt1); + v_n->getPoint (pnt2); + + double rayon = calc_distance (pnt1, pnt2)/2; + double alpha = angle_inter [CylBig]; + if (nzs != 2) + { + double h1 = cross_rayon[CylSmall][NxExt] * cos (angle_inter[CylSmall]); + alpha = asin (h1/cross_rayon[CylBig][NxExt]); + } + + for (int nro=0 ; nrogetX(); + if (qx>=0) node->setX ( px); + else node->setX (-px); + node->setY (py); + node->setZ (pz); + } +} +// ===================================================== assoIntersection +int CrossElements::assoIntersection (int nxs, int nzs, double* snorm, + double* bnorm) +{ + Real3 center; + Real3 pse, psw, sorig, sbase; + Real3 pbe, pbw, borig, bbase; + string brep; + + cross_center->getPoint (center); + int nz = nzs < MiddleSlice1 ? 0 : NbrSlices1; + + getVertexIJK (CylSmall, nxs, S_E , nz)->getPoint (pse); + getVertexIJK (CylSmall, nxs, S_W , nz)->getPoint (psw); + getVertexIJK (CylBig, nxs, S_E , 0) ->getPoint (pbe); + getVertexIJK (CylBig, nxs, S_W , 0) ->getPoint (pbw); + + double srayon = calc_distance (pse, psw)/2; + double brayon = calc_distance (pbe, pbw)/2; + + calc_milieu (psw, pse, sorig); + calc_milieu (pbw, pbe, borig); + calc_vecteur (psw, pse, sbase); + calc_vecteur (pbw, pbe, bbase); + + double shaut = calc_distance (center, sorig); + double bhaut = calc_distance (center, borig)*2; + double* orig = nzs < MiddleSlice1 ? sorig : center; // Pb orientation + + int ier = geom_create_cylcyl (borig, bnorm, bbase, brayon, bhaut, + orig, snorm, sbase, srayon, shaut); + if (ier != HOK) + return ier; + + for (int ny=S_E ; ny<=S_SE ; ny++) + { + Vertex* node = getVertexIJK (CylSmall, nxs, ny, nzs); + if (node!=NULL) + node->clearAssociation (); + } + + for (int ny=S_E ; ny<=S_SE ; ny++) + { + Edge* edge = getEdgeJ (CylSmall, nxs, ny, nzs); + geom_asso_cylcyl (edge); + } + + return HOK; +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexCylinder.cxx b/src/HEXABLOCK/HexCylinder.cxx new file mode 100644 index 0000000..9851c12 --- /dev/null +++ b/src/HEXABLOCK/HexCylinder.cxx @@ -0,0 +1,278 @@ + +// C++ : Gestion des cylindres + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "HexCylinder.hxx" +#include "HexVertex.hxx" +#include "HexVector.hxx" +#include "HexXmlWriter.hxx" + +#include + +BEGIN_NAMESPACE_HEXA + +bool is_out (double val, double orig, double lg); + +// ======================================================== Constructeur +Cylinder::Cylinder(Vertex* b, Vector* v, double r, double h) + : EltBase (b->dad()) +{ + c_base = b; + c_dir = v; + c_radius = r; + c_height = h; + + if (el_root->debug ()) + { + Echo ("---------------------------------- AddCylinder"); + HexDisplay (c_radius); + HexDisplay (c_height); + HexDump (c_base); + HexDump (c_dir); + cout << endl; + } +} +// ======================================================== rdiffers +bool rdiffers (double v1, double v2) +{ + double dd = v1-v2; + return dd*dd > 1e-12; +} +// ======================================================== norme +double norme (double px, double py, double pz) +{ + double res = sqrt (px*px + py*py + pz*pz); + return res; +} +// ======================================================== interCylinder +/// Intersection de 2 droites (c1,v1) et (c2,v2) +/// Le point M(x,yz) est solutions de 2 equations : +/// (c1,m) = k * v1 +/// (c2,m) vectoriel v2 = 0 +/// +/// x = xc1 + k * xv1 (1) +/// y = yc1 + k * yv1 (2) +/// z = zc1 + k * zv1 (3) +/// (x-xc2) * yv2 - (y-yc2) * xv2 = 0 (4) +/// (z-zc2) * yv2 - (y-yc2) * zv2 = 0 (5) +/// (x-xc2) * zv2 - (z-zc2) * xv2 = 0 (6) +/// +/// En substituant les (x,y,z) +/// +/// (k*xv1+xc1-xc2) * yv2 - (k*yv1+yc1-yc2) * xv2 = 0 (4) +/// (k*zv1+zc1-zc2) * yv2 - (k*yv1+yc1-yc2) * zv2 = 0 (5) +/// (k*xv1+xc1-xc2) * zv2 - (k*zv1+zc1-zc2) * xv2 = 0 (6) +/// +/// k * (xv1*yv2 - yv1*xv2) + (xc1-xc2) * yv2 - (yc1-yc2) * xv2 = 0 (4) +/// k * dxy - nxy = 0 (4) +/// k * dzy - nzy = 0 (5) +/// k * dxz - nxz = 0 (6) +/// +/// nxy = (xc2-xc1) * yv2 - (yc2-yc1) * xv2 +/// dxy = xv1*yv2 - yv1*xv2 +/// +// ======================================================== interCylinder +Vertex* Cylinder::interCylinder (Cylinder* small, bool& left, bool& right) +{ + Real3 orig; + int ier = interCylinder (small, left, right, orig); + if (ier!=HOK) + return NULL; + + Vertex* sol = new Vertex (c_base->dad(), orig[0], orig[1], orig[2]); + return sol; +} +/// +// ======================================================== interCylinder +int Cylinder::interCylinder (Cylinder* small, bool& left, bool& right, + double* orig) +{ + left = right = true; + if (el_root->debug ()) + { + Echo ("---------------------------------- interCylinders"); + PutData (this->c_radius); + PutData (small->c_radius); + PutData (this->c_height); + PutData (small->c_height); + HexDump (this->c_base); + HexDump (small->c_base); + HexDump (this->c_dir); + HexDump (small->c_dir); + } + + double norm1 = c_dir->getNorm(); + double norm2 = small->c_dir->getNorm(); + + double xc1 = c_base->getX(); + double yc1 = c_base->getY(); + double zc1 = c_base->getZ(); + + double xc2 = small->c_base->getX(); + double yc2 = small->c_base->getY(); + double zc2 = small->c_base->getZ(); + + double xv1 = c_dir->getDx()/norm1; + double yv1 = c_dir->getDy()/norm1; + double zv1 = c_dir->getDz()/norm1; + + double xv2 = small->c_dir->getDx()/norm2; + double yv2 = small->c_dir->getDy()/norm2; + double zv2 = small->c_dir->getDz()/norm2; + + double nxyz [DIM3] = { (xc2-xc1) * yv2 - (yc2-yc1) * xv2, + (zc2-zc1) * yv2 - (yc2-yc1) * zv2, + (xc2-xc1) * zv2 - (zc2-zc1) * xv2 }; + + double dxyz [DIM3] = { xv1*yv2 - yv1*xv2, + zv1*yv2 - yv1*zv2, + xv1*zv2 - zv1*xv2 }; + double lambda = 0; + bool prems = true; + for (int dd=0 ; ddc_base->getPoint (base1); + small->c_base->getPoint (base2); + + this ->c_dir->getCoord (dir1); + small->c_dir->getCoord (dir2); + + for (int dd=dir_x ; dd<=dir_z ; dd++) + { + extr1 [dd] = base1[dd] + dir1[dd]*this ->c_height/norm1; + extr2 [dd] = base2[dd] + dir2[dd]*small->c_height/norm2; + } + + double dbase1 = calc_distance (orig, base1); + double dbase2 = calc_distance (orig, base2); + double dextr1 = calc_distance (orig, extr1); + double dextr2 = calc_distance (orig, extr2); + + double dmin2 = std::min (dbase2, dextr2); + double dmax2 = std::max (dbase2, dextr2); + double dmax1 = std::max (dbase1, dextr1); + double coeff = 1.1; + // Appartenance axe petit cylindre + if (dmax2 > small->c_height + c_radius) + { + cout << "*** InterCylinders : Petit cylindre trop court" << endl; + cout << "*** Intersection = (" << orig[0] << ", " << orig[1] + << ", " << orig[2] << " )" << endl; + cout << "*** distance = " << dmin2 + << " > gros rayon + longueur " + << small->c_height + c_radius << endl; + cout << endl; + PutCoord (base2); + PutCoord (extr2); + PutData(dbase2); + PutData(dextr2); + PutData(dextr2); + return HERR; + } + + left = dbase2 > c_radius*coeff; + right = dextr2 > c_radius*coeff; + // Le gros cylindre doit depasser le petit + if (dmax1 > c_height-coeff*small->c_radius) + { + cout << "*** InterCylinders : Gros cylindre trop court" << endl; + cout << "*** Intersection = (" << orig[0] << ", " << orig[1] + << ", " << orig[2] << " )" << endl; + cout << "*** distance maximale = " << dmax1 << endl; + cout << endl; + return HERR; + } + + if (el_root->debug ()) + { + PutCoord (orig); + HexDisplay (left); + HexDisplay (right); + } + return HOK; +} +// ======================================================== is_out +bool is_out (double val, double v1, double v2) +{ + if (v1 < v2) + return (val < v1-Epsil || val > v2+Epsil) ; + + else if (v1 > v2) + return (val < v2-Epsil || val > v1+Epsil) ; + + else + return fabs (val - v1)>Epsil; +} +// ========================================================= saveXml +void Cylinder::saveXml (XmlWriter* xml) +{ + char buffer[12]; + + xml->openMark ("Cylinder"); + xml->addAttribute ("c_base", c_base->getName (buffer)); + xml->addAttribute ("c_dir", c_dir->getName (buffer)); + xml->addAttribute ("c_radius", c_radius); + xml->addAttribute ("c_height", c_height); + xml->closeMark (); +} +END_NAMESPACE_HEXA + diff --git a/src/HEXABLOCK/HexCylinder.hxx b/src/HEXABLOCK/HexCylinder.hxx new file mode 100755 index 0000000..f58deac --- /dev/null +++ b/src/HEXABLOCK/HexCylinder.hxx @@ -0,0 +1,58 @@ + +// class : Les cylindres + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __CYLINDER_H_ +#define __CYLINDER_H_ + +#include "HexEltBase.hxx" + +BEGIN_NAMESPACE_HEXA + +class Cylinder : public EltBase +{ +public : + Vertex* getBase () { return c_base; } + Vector* getDirection () { return c_dir; } + double getRadius () { return c_radius; } + double getHeight () { return c_height; } + +public : + Cylinder (Vertex* b, Vector* v, double r, double h); + virtual ~Cylinder () {} + + int interCylinder (Cylinder* small, bool& left, bool& right, double* sol); + Vertex* interCylinder (Cylinder* other, bool& left, bool& right); + void saveXml (XmlWriter* xml); + virtual double getInternalRadius () { return 0; } + +protected: + Vertex* c_base; + Vector* c_dir; + + double c_radius; + double c_height; +}; + +// ------------------------------------------- Inlining + + +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexDiagnostics.hxx b/src/HEXABLOCK/HexDiagnostics.hxx new file mode 100755 index 0000000..8a210da --- /dev/null +++ b/src/HEXABLOCK/HexDiagnostics.hxx @@ -0,0 +1,50 @@ + +// Incl : Diagnostics + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef _HEX_DIAGNOSTICS_H +#define _HEX_DIAGNOSTICS_H + +#define W_H_NULL_QUAD "new Hexa : La face %s est nulle" +#define W_H_EQ_QUAD "new Hexa : Les faces %s et %s sont confondues" +#define W_H_BAD_EDGE "new Hexa : L'arete commune %s n'existe pas" +#define W_H_BAD_VERTEX "new Hexa : Le sommet commun %s n'existe pas" + +#define W_H_NULL_VERTEX "addHexa : Le sommet %s est nul" +#define W_H_EQ_VERTEX "addHexa : Les sommets %s et %s sont confondus" +#define W_REPL_ASSOC "mergeXXXX : Les elements fusionnes %s et %s sont associes" +#define W_DISCO_ASSOC "disconnextXXXX : L'element deconnecte %s etait associe" + +#define W_ASSO_LINE "associateLine : l'edge de depart (%s) est isole" +#define W_ASSO_LINE2 "associateLine : l'edge nro %s (%s) est isole" +#define W_ASSO_LINE1 "associateLine : le vertex de depart (%s) est isole" + +#define W_ASSO_LINE3 "associateLine : le vertex de depart est incorrect" +#define W_ASSO_LINE4 "associateLine : l'edge de depart est incorrect" +#define W_ASSO_LINE5 "associateLine : l'edge nro %s est incorrect" +#define W_ASSO_LINE6 "associateLine : Le contour n'est pas ferme" + +#define W_ASSO_CUT1 "cut 1 : ancienne association incoherente (pnt1=%s)" +#define W_ASSO_CUT2 "cut 2 : ancienne association incoherente (dernier=%s)" +#define W_ASSO_CUT3 "cut 3 : ancienne association incoherente (vertex=%s)" +#define W_ASSO_CUT4 "cut 4 : ancienne association incoherente (%s)" + + +#endif diff --git a/src/HEXABLOCK/HexDocument.cxx b/src/HEXABLOCK/HexDocument.cxx new file mode 100755 index 0000000..ee4514e --- /dev/null +++ b/src/HEXABLOCK/HexDocument.cxx @@ -0,0 +1,1061 @@ + +// C++ : La clase principale de Hexa + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ +// or email : webmaster.salome@opencascade.com + +#include "HexDocument.hxx" + +#include "HexEltBase.hxx" +#include "HexVertex.hxx" +#include "HexEdge.hxx" +#include "HexQuad.hxx" +#include "HexHexa.hxx" + +#include "HexElements.hxx" +#include "HexCrossElements.hxx" + +#include "HexVector.hxx" +#include "HexCylinder.hxx" +#include "HexPipe.hxx" +#include "HexMatrix.hxx" +#include "HexCloner.hxx" +#include "HexPropagation.hxx" +#include "HexLaw.hxx" + +#include "HexXmlWriter.hxx" +#include "HexXmlTree.hxx" +#include "HexGlobale.hxx" +#include "HexGroup.hxx" + +BEGIN_NAMESPACE_HEXA + +// ======================================================== Constructeur +Document::Document (cpchar name) +{ + glob = Globale::getInstance (); + + doc_db = 0; + nbr_errors = 0; + doc_modified = true; + doc_saved = false; + doc_name = name; + doc_tolerance = 1e-6; + nbr_laws = 0; + nbr_propagations = 0; + maj_propagation = true; + doc_xml = NULL; + doc_shape = NULL; + + defaultLaw = addLaw ("DefaultLaw", 0); + + nbr_used_hexas = nbr_used_quads = nbr_used_edges = nbr_used_vertex = 0; + + for (EnumElt type = EL_NONE ; type < EL_MAXI ; type=(EnumElt) (type+1)) + { + doc_first_elt [type] = doc_last_elt [type] = new EltBase (); + doc_nbr_elt [type] = 0; + } +} +// ======================================================== Destructeur +Document::~Document () +{ + delete doc_xml; + + for (EnumElt type = EL_NONE ; type < EL_MAXI ; type=(EnumElt) (type+1)) + { + // printf ("____________________________ Type=%d\n", type); + EltBase* next = NULL; + for (EltBase* elt=doc_first_elt [type] ; elt != NULL ; elt=next) + { + next = elt->next(); + delete elt; + } + } +} +// ======================================================== addVector +Vector* Document::addVector (double dx, double dy, double dz) +{ + Vector* pv = new Vector (this, dx, dy, dz); + doc_vector.push_back (pv); + return pv; +} +// ======================================================== addVectorVertices +Vector* Document::addVectorVertices (Vertex* va, Vertex* vb) +{ + Vector* pv = addVector (vb->getX () - va->getX (), + vb->getY () - va->getY (), + vb->getZ () - va->getZ ()); + return pv; +} +// ======================================================== addVertex +Vertex* Document::addVertex (double x, double y, double z) +{ + Vertex* pv = new Vertex (this, x, y, z); + return pv; +} +// ======================================================== addEdge +Edge* Document::addEdge (Vertex* va, Vertex* vb) +{ + if (va==NULL || vb==NULL) + return NULL; + + Edge* arete = new Edge (va, vb); + return arete; +} +// ======================================================== addEdge (bis) +Edge* Document::addEdge (Vertex* va, Vector* vec) +{ + Vertex* vb = addVertex (va->getX () + vec->getDx(), + va->getY () + vec->getDy(), + va->getZ () + vec->getDz()); + + Edge* arete = addEdge (va, vb); + return arete; +} +// ======================================================== addQuadVertices +Quad* Document::addQuadVertices (Vertex* va, Vertex* vb, Vertex* vc, Vertex* vd) +{ + Quad* face = new Quad (va, vb, vc, vd); + return face; +} +// ======================================================== addQuad +Quad* Document::addQuad (Edge* ea, Edge* eb, Edge* ec, Edge* ed) +{ + Quad* face = new Quad (ea, eb, ec, ed); + return face; +} +// ======================================================== addHexaVertices +Hexa* Document::addHexaVertices (Vertex* va, Vertex* vb, Vertex* vc, Vertex* vd, + Vertex* ve, Vertex* vf, Vertex* vg, Vertex* vh) +{ + Hexa* pave = new Hexa (va, vb, vc, vd, ve, vf, vg, vh); + return pave; +} +// ======================================================== addHexa +Hexa* Document::addHexa (Quad* qa, Quad* qb, Quad* qc, Quad* qd, Quad* qe, + Quad* qf) +{ + Hexa* pave = new Hexa (qa, qb, qc, qd, qe, qf); + return pave; +} +// ======================================================== addCylinder +Cylinder* Document::addCylinder (Vertex* b, Vector* d, double r, double h) +{ + Cylinder* cyl = new Cylinder (b, d, r, h); + doc_cylinder.push_back (cyl); + return cyl; +} +// ======================================================== addPipe +Pipe* Document::addPipe (Vertex* b, Vector* d, double ri, double re, double h) +{ + Pipe* tuyau = new Pipe (b, d, ri, re, h); + doc_pipe.push_back (tuyau); + return tuyau; +} +// ======================================================== makeCartesian +Elements* Document::makeCartesian (Vertex* v, Vector* dir, + int px, int py, int pz, int mx, int my, int mz) +{ + Vector* v1 = new Vector (this, dir->getDx(), 0, 0); + Vector* v2 = new Vector (this, 0, dir->getDy(), 0); + Vector* v3 = new Vector (this, 0,0, dir->getDz()); + Elements* grille = new Elements (this); + grille->makeCartesianGrid (v, v1, v2, v3, px, py, pz, mx, my, mz); + return grille; +} +// ======================================================== makeCartesian +Elements* Document::makeCartesian (Vertex* v, Vector* v1, Vector* v2, + Vector* v3, int px, int py, int pz, int mx, int my, int mz) +{ + Elements* grille = new Elements (this); + grille->makeCartesianGrid (v, v1, v2, v3, px, py, pz, mx, my, mz); + return grille; +} +// ======================================================== makeSpherical +Elements* Document::makeSpherical (Vertex* c, double rayon, int nb, double k) +{ + Elements* grille = new Elements (this); + grille->makeSphericalGrid (c, rayon, nb, k); + return grille; +} +// ======================================================== makeCylindrical +Elements* Document::makeCylindrical (Vertex* c, Vector* b, Vector* h, + double dr, double da, double dl, int nr, int na, int nl, bool fill) +{ + Elements* grille = new Elements (this); + grille->makeCylindricalGrid (c, b, h, dr, da, dl, nr, na, nl, fill); + return grille; +} +// ======================================================== makeSphere +Elements* Document::makeSphere (Vertex* center, Vector* vx, Vector* vz, + double radius, double radhole, Vertex* plorig, + int nrad, int nang, int nhaut) +{ + Elements* grille = new Elements (this); + double radint = (radhole + radius)*DEMI; + grille->makeRind (GR_HEMISPHERIC, center, vx, vz, radius, radint, radhole, + plorig, 360.0, nrad, nang, nhaut); + return grille; +} +// ======================================================== makePartSphere +Elements* Document::makePartSphere (Vertex* center, Vector* vx, Vector* vz, + double radius, double radhole, + Vertex* plorig, double angle, + int nrad, int nang, int nhaut) +{ + Elements* grille = new Elements (this); + double radint = (radhole + radius)*DEMI; + grille->makeRind (GR_PART_SPHERIC, center, vx, vz, radius, radint, radhole, + plorig, angle, nrad, nang, nhaut); + return grille; +} +// ======================================================== makeRind +Elements* Document::makeRind (Vertex* center, Vector* vx, Vector* vz, + double radext, double radint, double radhole, + Vertex* plorig, int nrad, int nang, int nhaut) +{ + Elements* grille = new Elements (this); + grille->makeRind (GR_RIND, center, vx, vz, radext, radint, radhole, + plorig, 360.0, nrad, nang, nhaut); + return grille; +} +// ======================================================== makePartRind +Elements* Document::makePartRind (Vertex* center, Vector* vx, Vector* vz, + double radext, double radint, double radhole, + Vertex* plorig, double angle, + int nrad, int nang, int nhaut) +{ + Elements* grille = new Elements (this); + grille->makeRind (GR_PART_RIND, center, vx, vz, radext, radint, radhole, + plorig, angle, nrad, nang, nhaut); + return grille; +} +// ======================================================== findVertex +Vertex* Document::findVertex (double vx, double vy, double vz) +{ + double xmin = vx - doc_tolerance; + double xmax = vx + doc_tolerance; + double ymin = vy - doc_tolerance; + double ymax = vy + doc_tolerance; + double zmin = vz - doc_tolerance; + double zmax = vz + doc_tolerance; + + for (EltBase* elt = doc_first_elt[EL_VERTEX]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt->isHere()) + { + Vertex* node = static_cast (elt); + if (node->isin (xmin, xmax, ymin, ymax, zmin, zmax)) + return node; + } + } + return NULL; +} +// ======================================================== findEdge +Edge* Document::findEdge (Vertex* v1, Vertex* v2) +{ + for (EltBase* elt = doc_first_elt[EL_EDGE]->next (); elt!=NULL; + elt = elt->next()) + { + Edge* candidat = static_cast (elt); + if (candidat->definedBy (v1, v2)) + return candidat; + } + return NULL; +} +// ======================================================== findQuad +Quad* Document::findQuad (Vertex* v1, Vertex* v2) +{ + for (EltBase* elt = doc_first_elt[EL_QUAD]->next (); elt!=NULL; + elt = elt->next()) + { + Quad* candidat = static_cast (elt); + if (candidat->definedBy (v1, v2)) + return candidat; + } + return NULL; +} +// ======================================================== findHexa +Hexa* Document::findHexa (Vertex* v1, Vertex* v2) +{ + for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL; + elt = elt->next()) + { + Hexa* candidat = static_cast (elt); + if (candidat->definedBy (v1, v2)) + return candidat; + } + return NULL; +} + +// ======================================================== findElement +EltBase* Document::findElement (EnumElt type, int ident) +{ + for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt->isHere() && elt->getId()==ident) + return elt; + } + return NULL; +} +// ======================================================== findVertex +Vertex* Document::findVertex (int ident) +{ + Vertex* node = static_cast (findElement (EL_VERTEX, ident)); + return node; + +} +// ======================================================== index_tv +int index_tv (Vertex* table[], Vertex* elt) +{ + for (int nro=0; nroisDeleted()) + { + printf (" *** Quad nro 1 incorrect dans mergeQuads \n"); + return HERR; + } + else if (orig==NULL || orig->isDeleted() ) + { + printf (" *** Quad nro 2 incorrect dans mergeQuads \n"); + return HERR; + } + + int nbcomm = 0; + for (int nro=0 ; nroindexVertex (dest->getVertex(nro)); + if (norig != NOTHING) + { + Vertex* uv = dest->getVertex(nro); + char nom[12]; + nbcomm ++; + if (nbcomm==1) + { + printf (" +++ Sommets communs dans mergeQuads"); + printf (" (%s,", dest->getName (nom)); + printf (" %s)\n", orig->getName (nom)); + } + printf (" +++ quad1[%d] = quad2[%d] = %s\n", nro, norig, + uv->getName (nom)); + } + } + + if (nbcomm == 2) + { + printf (" +++ Les vertex passes en arguments sont ignores\n"); + int ier = closeQuads (dest, orig); + return ier; + } + else if (nbcomm != 0) + { + printf (" *** _____________________ mergeQuads refuse: \n"); + printf (" il y a %d sommet(s) sont commun(s)\n", nbcomm); + return HERR; + } + + if ( v1 ==NULL || v1 ->isDeleted() || v2 ==NULL || v2 ->isDeleted() + || v3 ==NULL || v3 ->isDeleted() || v4 ==NULL || v4 ->isDeleted()) + { + printf (" *** _____________________ mergeQuads refuse: \n"); + printf (" un sommet est incorrect\n"); + return HERR; + } + + + if (debug()) + { + printf (" ----------------- mergeQuads : \n"); + HexDump (orig); + HexDump (dest); + HexDump (v1); + HexDump (v2); + HexDump (v3); + HexDump (v4); + } + + Vertex *tv1 [QUAD4], *tv2 [QUAD4]; + Edge *te1 [QUAD4], *te2 [QUAD4]; + + int ier1 = dest->ordoVertex (v1, v3, tv1); + int ier2 = orig->ordoVertex (v2, v4, tv2); + if (ier1 != HOK) return ier1; + else if (ier2 != HOK) return ier2; + + for (int nro=0 ; nrogetEdge(nro); + Vertex* va1 = te1[nro]->getVertex(V_AMONT); + Vertex* vb1 = te1[nro]->getVertex(V_AVAL); + int na = index_tv (tv1, va1); + int nb = index_tv (tv1, vb1); + if (na==NOTHING || nb==NOTHING) + return HERR; + + te2 [nro] = orig->findEdge (tv2[na], tv2[nb]); + if (te2[nro]==NULL) + return HERR; + } + + if (debug()) + { + printf (" ----------------- Correspondances mergeQuads : \n"); + for (int nro=0 ; nroprintName(" -> "); + tv1 [nro]->printName("\n"); + } + for (int nro=0 ; nroprintName(" ("); + te2 [nro]->getVertex(0)->printName(", "); + te2 [nro]->getVertex(1)->printName(") -> "); + te1 [nro]->printName(" ("); + te1 [nro]->getVertex(0)->printName(", "); + te1 [nro]->getVertex(1)->printName(")\n"); + } + } + + replaceQuad (orig, dest); + for (int nro=0 ; nrogetName(nom)); + return HERR; + } + else if (dest==NULL || dest->isDeleted()) + { + printf (" *** Quad nro 1 incorrect dans closeQuads \n"); + return HERR; + } + else if (orig==NULL || orig->isDeleted() ) + { + printf (" *** Quad nro 2 incorrect dans closeQuads \n"); + return HERR; + } + + Edge* edc = NULL; + for (int nro=0 ; nroindexEdge (dest->getEdge(nro)); + if (norig != NOTHING) + { + if (edc != NULL) + { + printf (" *** Plus d'une arete commune dans closeQuads"); + printf (" (%s,", dest->getName (nom)); + printf (" %s)\n", orig->getName (nom)); + return HERR; + } + edc = dest->getEdge (nro); + printf (" +++ quad1[%d] = quad2[%d] = %s\n", nro, norig, + edc->getName (nom)); + } + } + + Vertex* va = edc->getVertex (V_AMONT); + Vertex* vb = edc->getVertex (V_AVAL); + Vertex *tv1 [QUAD4], *tv2 [QUAD4]; + Edge *te1 [QUAD4], *te2 [QUAD4]; + + int ier1 = dest->ordoVertex (va, vb, tv1); + int ier2 = orig->ordoVertex (va, vb, tv2); + + if (ier1 != HOK) return ier1; + else if (ier2 != HOK) return ier2; + + for (int nro=0 ; nrogetEdge(nro); + Vertex* va1 = te1[nro]->getVertex(V_AMONT); + Vertex* vb1 = te1[nro]->getVertex(V_AVAL); + int na = index_tv (tv1, va1); + int nb = index_tv (tv1, vb1); + if (na==NOTHING || nb==NOTHING) + return HERR; + + te2 [nro] = orig->findEdge (tv2[na], tv2[nb]); + if (te2[nro]==NULL) + return HERR; + } + + if (debug()) + { + printf (" ----------------- Correspondances mergeQuads : \n"); + for (int nro=0 ; nroprintName(" -> "); + tv1 [nro]->printName("\n"); + } + for (int nro=0 ; nroprintName(" ("); + te2 [nro]->getVertex(0)->printName(", "); + te2 [nro]->getVertex(1)->printName(") -> "); + te1 [nro]->printName(" ("); + te1 [nro]->getVertex(0)->printName(", "); + te1 [nro]->getVertex(1)->printName(")\n"); + } + } + + replaceQuad (orig, dest); + for (int nro=0 ; nroisDeleted() || e2==NULL || e2->isDeleted()) + return HERR; + + for (int nro=0 ; nroindex (e2->getVertex(nro))!= NOTHING) + return HERR+nro+1; + + Vertex *tv1 [V_TWO], *tv2 [V_TWO]; + + int ier1 = e1->anaMerge (v1, tv1); + int ier2 = e2->anaMerge (v2, tv2); + + if (ier1 != HOK) return ier1; + else if (ier2 != HOK) return ier2; + + replaceEdge (e2, e1); + for (int nro=0 ; nroisDeleted() + || v2==NULL || v2->isDeleted()) + return HERR; + + replaceVertex (v2, v1); + + maj_connection = false; + return HOK; +} +// ======================================================== replaceVertex +void Document::replaceVertex (Vertex* old, Vertex* par) +{ + if (old==par) + return; + + par->replaceAssociation (old); + + for (int type=EL_EDGE ; type <= EL_HEXA ; type++) + { + for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL; + elt = elt->next()) + if (elt->isHere ()) + elt->replaceVertex (old, par); + } + old->suppress (); +} +// ======================================================== replaceEdge +void Document::replaceEdge (Edge* old, Edge* par) +{ + if (old==par) + return; + + par->replaceAssociation (old); + + for (int type=EL_QUAD ; type <= EL_HEXA ; type++) + { + for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL; + elt = elt->next()) + if (elt->isHere ()) + elt->replaceEdge (old, par); + } + old->suppress (); +} +// ======================================================== replaceQuad +void Document::replaceQuad (Quad* old, Quad* par) +{ + if (old==par) + return; + + par->replaceAssociation (old); + + for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL; + elt = elt->next()) + if (elt->isHere ()) + { + Hexa* cell = static_cast (elt); + cell->replaceQuad (old, par); + } + old->suppress (); +} +// ======================================================== prismQuad +Elements* Document::prismQuad (Quad* start, Vector* dir, int nb) +{ + Quads tstart; + tstart.push_back (start); + + update (); + Elements* prisme = prismQuads (tstart, dir, nb); + return prisme; +} +// ======================================================== prismQuads +Elements* Document::prismQuads (Quads& tstart, Vector* dir, int nb) +{ + Elements* prisme = new Elements (this); + if (nb<=0) return prisme; + + prisme->prismQuads (tstart, dir, nb); + return prisme; +} +// ======================================================== prismQuadsVec +Elements* Document::prismQuadsVec (Quads& tstart, Vector* dir, RealVector& tlen, + int crit) +{ + Elements* prisme = new Elements (this); + if (tlen.size()<=0) return prisme; + + prisme->prismQuadsVec (tstart, dir, tlen, crit); + return prisme; +} +// ======================================================== joinQuads +Elements* Document::joinQuads (Quads& start, Quad* dest, Vertex* v1, + Vertex* v2, Vertex* v3, Vertex* v4, int nb) +{ + update (); + Elements* joint = new Elements (this); + if (nb<=0) return joint; + + int ier = joint->joinQuads (start, nb, v1, v2, v3, v4, dest); + if (ier !=HOK) + printf ("\n ****\n **** Error in joinQuad(s)\n ****\n"); + return joint; +} +// ======================================================== joinQuad +Elements* Document::joinQuad (Quad* start, Quad* dest, Vertex* v1, + Vertex* v2, Vertex* v3, Vertex* v4, int nb) +{ + Quads tstart; + tstart.push_back (start); + + Elements* joint = joinQuads (tstart, dest, v1, v2, v3, v4, nb); + return joint; +} +// ========================================================== getHexa +Hexa* Document::getHexa (int nro) +{ + return static_cast (getElement (EL_HEXA, nro)); +} +// ========================================================== getQuad +Quad* Document::getQuad (int nro) +{ + return static_cast (getElement (EL_QUAD, nro)); +} +// ========================================================== getEdge +Edge* Document::getEdge (int nro) +{ + return static_cast (getElement (EL_EDGE, nro)); +} +// ========================================================== getVertex +Vertex* Document::getVertex (int nro) +{ + return static_cast (getElement (EL_VERTEX, nro)); +} +// ========================================================== countElement +int Document::countElement (EnumElt type) +{ + int compteur = 0; + for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL; + elt = elt->next()) + if (elt->isHere()) + compteur ++; + + return compteur; +} +// ========================================================== getElement +EltBase* Document::getElement (EnumElt type, int nro) +{ + int compteur = 0; + for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt->isHere()) + { + if (compteur>=nro) + return elt; + compteur ++; + } + } + return NULL; +} +// ========================================================= addLaw +Law* Document::addLaw (const char* name, int nbnodes) +{ + Law* loi = new Law (name, nbnodes); + return addLaw (loi); +} +// ========================================================= addLaw +Law* Document::addLaw (Law* loi) +{ + doc_laws.push_back (loi); + nbr_laws ++; + return loi; +} +// ========================================================= GetLaw +Law* Document::getLaw (int nro) +{ + if (nro <0 || nro>= nbr_laws) + return NULL; + + return doc_laws [nro]; +} +// ========================================================= FindLaw +Law* Document::findLaw (const char* name) +{ + std::string nom = name; + for (int nro=0 ; nrogetName() == nom) + return doc_laws [nro]; + + return NULL; +} +// ========================================================= removeLaw +int Document::removeLaw (Law* loi) +{ + for (int nro=1 ; nrogetLaw() == loi ) + doc_propagation [nl]->setLaw(defaultLaw); + } + + delete doc_laws [nro]; + doc_laws.erase (doc_laws.begin()+nro); + nbr_laws= doc_laws.size(); + return HOK; + } + + return HERR; +} +// ========================================================= majPropagation +void Document::majPropagation () +{ + majReferences (); + update (); + // if (purge_elements) + // purge (); + + for (int nro=0 ; nronext (); elt!=NULL; + elt = elt->next()) + { + Edge* arete = static_cast (elt); + if (arete!=NULL) + arete->setPropag (NOTHING, true); + } + + // markAll (NO_COUNTED, EL_EDGE); + + for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL; + elt = elt->next()) + { + Hexa* cell = static_cast (elt); + if (cell!=NULL && cell->isHere()) + { + for (int ne=0 ; negetEdge(ne); + if (arete->getPropag()<0) + { + Propagation* prop = new Propagation (); + doc_propagation.push_back (prop); + arete->propager (prop, nbr_propagations); + nbr_propagations ++; + prop->majLaw(); + } + } + } + } +} +// ======================================================== countPropagation +int Document::countPropagation () +{ + if (maj_propagation) + majPropagation (); + + return nbr_propagations; +} +// ======================================================== getPropagation +Propagation* Document::getPropagation (int nro) +{ + if (maj_propagation) + majPropagation (); + + if (nro < 0 || nro >= nbr_propagations) + return NULL; + + return doc_propagation [nro]; +} +// ======================================================== findPropagation +Propagation* Document::findPropagation (Edge* arete) +{ + if (arete==NULL) + return NULL; + + if (maj_propagation) + majPropagation (); + + return getPropagation (arete->getPropag ()); +} +// ======================================================== disconnectQuad +Elements* Document::disconnectQuad (Hexa* cell, Quad* element) +{ + if (cell==NULL || element==NULL) + return NULL; + + update (); + Elements* crees = cell->disconnectQuad (element); + + if (crees!=NULL) + majReferences (); + + return crees; +} +// ======================================================== disconnectEdge +Elements* Document::disconnectEdge (Hexa* cell, Edge* element) +{ + if (cell==NULL || element==NULL) + return NULL; + + update (); + Elements* crees = cell->disconnectEdge (element); + + if (crees!=NULL) + majReferences (); + return crees; +} +// ======================================================== disconnectVertex +Elements* Document::disconnectVertex (Hexa* cell, Vertex* element) +{ + if (cell==NULL || element==NULL) + return NULL; + + update (); + Elements* crees = cell->disconnectVertex (element); + + if (crees!=NULL) + majReferences (); + return crees; +} +// ======================================================== cut +Elements* Document::cut (Edge* edge, int nbcuts) +{ + Elements* t_hexas = new Elements (this); + + if (edge==NULL || nbcuts<=0) + return t_hexas; + + Propagation* prop = findPropagation (edge); + const Edges& t_edges = prop->getEdges (); + + t_hexas->cutHexas (t_edges, nbcuts); + + majPropagation (); + return t_hexas; +} +// ======================================================== addGroup +Group* Document::addGroup (cpchar name, EnumGroup kind) +{ + Group* grp = new Group (name, kind); + doc_group.push_back (grp); + return grp; +} +// ======================================================== findGroup +Group* Document::findGroup (cpchar name) +{ + int nbre = doc_group.size(); + + for (int ng=0 ; nggetName(), name)) + return doc_group [ng]; + + return NULL; +} +// ======================================================== removeGroup +int Document::removeGroup (Group* grp) +{ + int nbre = doc_group.size(); + for (int ng=0 ; ngmakeCylinder (cyl, base, nr, na, nl); + return grille; +} +// ======================================================== makeCylinders +CrossElements* Document::makeCylinders (Cylinder* cyl1, Cylinder* cyl2) +{ + CrossElements* grille = new CrossElements (this, GR_BICYL); + grille->crossCylinders (cyl1, cyl2, true); + return grille; +} + +// ======================================================== makePipe +Elements* Document::makePipe (Pipe* pipe, Vector* bx, int nr, int na, int nl) +{ + Elements* grille = new Elements (this); + grille->makePipe (pipe, bx, nr, na, nr); + return grille; +} +// ======================================================== makePipes +CrossElements* Document::makePipes (Pipe* pipe1, Pipe* pipe2) +{ + CrossElements* grille = new CrossElements (this, GR_BIPIPE); + grille->crossCylinders (pipe1, pipe2, false); + return grille; +} +// ======================================================== setName +int Document::setName (const char* name) +{ + doc_name = name ; + return HOK ; +} + +// ======================================================== setLevel + +#ifdef NO_CASCADE +#define _TEST_BIC +#endif + +class BiCylinder; + +BiCylinder* test_bicylinder (Document* docu, int option); +void set_debug_asso (bool boule); + +void Document::setLevel (int niv) +{ + if (niv == 747) + clearAssociation (); + else if (niv == 777) + set_special_option (true); + else if (niv == 778) + set_special_option (false); +#ifdef _TEST_BICYL + else if (niv >=90 && niv <=99) + test_bicylinder (this, niv-90); +#endif + else + { + doc_db = niv; + set_debug_asso (niv>0); + } +} +// ======================================================== getAssoVertices +void Document::getAssoVertices (Vertices& tabelt) +{ + tabelt.clear (); + for (EltBase* elt = doc_first_elt[EL_VERTEX]->next (); elt!=NULL; + elt = elt->next()) + if (elt->isHere() && elt->getAssociation()!=NULL) + tabelt.push_back (static_cast (elt)); +} +// ======================================================== getAssoEdges +void Document::getAssoEdges (Edges& tabelt) +{ + tabelt.clear (); + for (EltBase* elt = doc_first_elt[EL_EDGE]->next (); elt!=NULL; + elt = elt->next()) + if (elt->isHere()) + { + Edge* edge = static_cast (elt); + int nbass = edge->getAssociations().size(); + if (nbass>0) + tabelt.push_back (edge); + } +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexDocument.hxx b/src/HEXABLOCK/HexDocument.hxx new file mode 100755 index 0000000..5ec47bd --- /dev/null +++ b/src/HEXABLOCK/HexDocument.hxx @@ -0,0 +1,377 @@ + +// class : Document + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __DOCUMENT_H_ +#define __DOCUMENT_H_ + +#include "hexa_base.hxx" + +BEGIN_NAMESPACE_HEXA + +class Document +{ + // Fonctions utilisateur +public : + // Fonctions globales + const char* getName () { return doc_name.c_str() ; } + bool isSaved () { return doc_saved ; } + int setName (const char* name); + int save (const char* ficxml); + + int getLevel () { return doc_db ; } + void setLevel (int niv); + + Hexa* getHexa (int nro); + Quad* getQuad (int nro); + Edge* getEdge (int nro); + Vertex* getVertex (int nro); + + int countHexa () { return countElement (EL_HEXA); } + int countQuad () { return countElement (EL_QUAD); } + int countEdge () { return countElement (EL_EDGE); } + int countVertex () { return countElement (EL_VERTEX); } + + // Creation d'elements + Vertex* addVertex (double x=0.0, double y=0.0, double z=0.0); + Edge* addEdge (Vertex* va, Vertex* vb); + Edge* addEdge (Vertex* va, Vector* vec); + + Quad* addQuadVertices (Vertex* v1, Vertex* v2, Vertex* v3, Vertex* v4); + Quad* addQuad (Edge* v1, Edge* v2, Edge* v3, Edge* v4); + + Hexa* addHexaVertices (Vertex* v1, Vertex* v2, Vertex* v3, Vertex* v4, + Vertex* v5, Vertex* v6, Vertex* v7, Vertex* v8); + Hexa* addHexa (Quad* qa, Quad* qb, Quad* qc, Quad* qd, Quad* qe, Quad* qf); + + Vector* addVector (double dx=0.0, double dy=0.0, double dz=0.0); + Vector* addVectorVertices (Vertex* va, Vertex* vb); + + Elements* makeCartesian (Vertex* v, Vector* v1, + int px, int py, int pz, int mx=0, int my=0, int mz=0); + Elements* makeCartesian (Vertex* v, Vector* v1, Vector* v2, Vector* v3, + int px, int py, int pz, int mx=0, int my=0, int mz=0); + + Elements* makeCylindrical (Vertex* c, Vector* b, Vector* h, double dr, + double da, double dl, int nr, int na, int nl, bool fill=false); + + // Obsolete + Elements* makeSpherical (Vertex* v, Vector* dv, int nb, double k=1) {return NULL;} + Elements* makeSpherical (Vertex* center, double rayon, int nb, double k=1); + + Elements* prismQuad (Quad* start, Vector* dv, int nb); + Elements* prismQuads (Quads& start, Vector* dv, int nb); + Elements* prismQuadsVec (Quads& start, Vector* dv, RealVector& th, int k=0); + + Elements* joinQuad (Quad* start, Quad* dest, Vertex* v1, Vertex* v2, + Vertex* v3, Vertex* v4, int nb); + Elements* joinQuads (Quads& start, Quad* dest, Vertex* v1, Vertex* v2, + Vertex* v3, Vertex* v4, int nb); + + Cylinder* addCylinder (Vertex* b, Vector* d, double r, double h); + Elements* makeCylinder (Cylinder* cyl, Vector* vx, int nr, int na, int nl); + CrossElements* makeCylinders (Cylinder* cyl1, Cylinder* cyl2); + + Pipe* addPipe (Vertex* b, Vector* d, double ri, double re, double h); + Elements* makePipe (Pipe* pip, Vector* vx, int nr, int na, int nl); + CrossElements* makePipes (Pipe* pipe1, Pipe* pipe2); + + int removeHexa (Hexa* maille); + int removeQuad (Quad* maille); + int removeConnectedHexa (Hexa* maille); + int removeElements (Elements* bloc); + + Vertex* findVertex (double vx, double vy, double vz); + Edge* findEdge (Vertex* va, Vertex* vb); + Quad* findQuad (Vertex* va, Vertex* vb); + Hexa* findHexa (Vertex* va, Vertex* vb); + + Vertex* findVertex (int id); + + int mergeVertices (Vertex* v1, Vertex* v2); + int mergeEdges (Edge* e1, Edge* e2, Vertex* v1, Vertex* v2); + int mergeQuads (Quad* q1, Quad* q2, Vertex* v1, Vertex* v2, + Vertex* v3, Vertex* v4); + int closeQuads (Quad* q1, Quad* q2); + + Elements* makeTranslation (Elements* elts, Vector* trans); + Elements* makeScale (Elements* elts, Vertex* ver, double k); + Elements* makeRotation (Elements* elts, Vertex* ver, Vector* vec, + double angle); + Elements* makeSymmetryPoint (Elements* elts, Vertex* ver); + Elements* makeSymmetryLine (Elements* elts, Vertex* ver, Vector* vec); + Elements* makeSymmetryPlane (Elements* elts, Vertex* ver, Vector* vec); + + int performTranslation (Elements* elts, Vector* trans); + int performScale (Elements* elts, Vertex* ver, double k); + int performRotation (Elements* elts, Vertex* ver, Vector* vec, double angle); + int performSymmetryPoint (Elements* elts, Vertex* ver); + int performSymmetryLine (Elements* elts, Vertex* ver, Vector* vec); + int performSymmetryPlane (Elements* elts, Vertex* ver, Vector* vec); + + void setTolerance (double tol) { doc_tolerance = std::max (tol, 0.0); } + double getTolerance () { return doc_tolerance; } + + Elements* disconnectQuad (Hexa* maille, Quad* face); + Elements* disconnectEdge (Hexa* maille, Edge* arete); + Elements* disconnectVertex (Hexa* maille, Vertex* noeud); + Elements* disconnectEdges (Hexas& thexas, Edges& edges); + + Elements* cut (Edge* edge, int nbcuts); + + Group* addGroup (cpchar name, EnumGroup kind); + Group* getGroup (int nro) { return doc_group [nro]; } + Group* findGroup (cpchar name); + int removeGroup (Group* grp); + int countGroup () { return (int) doc_group.size(); } + + // --------------------------------------------------- + + Law* addLaw (const char* name, int nbnodes); + Law* addLaw (Law* law); // lo-add-lololo + int countLaw () { return nbr_laws ; } + Law* getLaw (int nro); + Law* findLaw (const char* name); + int removeLaw (Law* loi); + + // --------------------------------------------------- + int countPropagation (); + Propagation* getPropagation (int nro); + Propagation* findPropagation (Edge* arete); + void dumpPropagation (); + + int countVector () { return doc_vector.size(); } + int countCylinder () { return doc_cylinder.size(); } + int countPipe () { return doc_pipe.size(); } + + Vector* getVector (int nro) { return doc_vector [nro]; } + Cylinder* getCylinder (int nro) { return doc_cylinder [nro]; } + Pipe* getPipe (int nro) { return doc_pipe [nro]; } + + void purge (); + int associateOpenedLine (Edge* mstart, Edges& mline, Shape* gstart, + double pstart, Shapes& gline, double pend); + int associateClosedLine (Vertex* mfirst, Edge* mstart, Edges& mline, + Shape* gstart, double pstart, bool inv, + Shapes& gline); + + void setShape (Shape* forme) { doc_shape = forme ; } + Shape* getShape () { return doc_shape ; } + + // --------------------------------------------------- Evols Hexa3 + + Document* copyDocument (); + + int countUsedHexa (); + int countUsedQuad (); + int countUsedEdge (); + int countUsedVertex (); + + Hexa* getUsedHexa (int nro); + Quad* getUsedQuad (int nro); + Edge* getUsedEdge (int nro); + Vertex* getUsedVertex (int nro); + + Hexa* addHexa2Quads (Quad* q1, Quad* q2); + Hexa* addHexa3Quads (Quad* q1, Quad* q2, Quad* q3); + Hexa* addHexa4Quads (Quad* q1, Quad* q2, Quad* q3, Quad* q4); + Hexa* addHexa5Quads (Quad* q1, Quad* q2, Quad* q3, Quad* q4, Quad* q5); + + Elements* revolutionQuads (Quads& start, Vertex* center, Vector* axis, + RealVector &angles); + + Elements* makeSphere (Vertex* center, Vector* vx, Vector* vz, + double radius, double radhole, + Vertex* plorig, + int nrad, int nang, int nhaut); + + Elements* makePartSphere (Vertex* center, Vector* vx, Vector* vz, + double radius, double radhole, + Vertex* plorig, double angle, + int nrad, int nang, int nhaut); + + Elements* makeRind (Vertex* center, Vector* vx, Vector* vz, + double radext, double radint, double radhole, + Vertex* plorig, + int nrad, int nang, int nhaut); + + Elements* makePartRind (Vertex* center, Vector* vx, Vector* vz, + double radext, double radint, double radhole, + Vertex* plorig, double angle, + int nrad, int nang, int nhaut); + + Elements* replace (Quads& pattern, Vertex* p1, Vertex* c1, + Vertex* p2, Vertex* c2, Vertex* p3, Vertex* c3); + + Elements* makeCylindricals (Vertex* c, Vector* b, Vector* h, + RealVector& tdr, RealVector& tda, RealVector& tdh, + bool fill=false); + + // --------------------------------------------------- Evols Hexa4' + + void clearAssociation (); + + typedef std::vector Vertices; + void getAssoEdges (Edges& tabelt); + void getAssoVertices (Vertices& tabelt); + +public: + Document (cpchar name); + ~Document (); + + int loadXml (cpchar name); + int setXml (cpchar flux); + cpchar getXml (); + + EltBase* getFirstEltBase (EnumElt type) { return doc_first_elt [type]; } + EltBase* getLastEltBase (EnumElt type) { return doc_last_elt [type]; } + void setDeprecated (int level=1); + + void dump (); + void markAll (int marque, int type=-1); + int saveVtk (cpchar nomfic); + int saveVtk (cpchar radical, int &nro); + + void putError (cpchar mess, cpchar info1=NULL, cpchar info2=NULL); + void nputError (cpchar mess, int info1, cpchar info2=NULL); + void hputError (cpchar mess, EltBase* e1, EltBase* e2=NULL); + + void majReferences (); // M.A.J relation "utilise par" + void update () { if (maj_connection) majReferences (); } + bool debug (int niv=0) { return doc_db > niv ; } + + void reorderFaces (); + void reorderQuads (); + +public: + Globale* glob; + +private : + int genXml (cpchar filename); + int parseXml (XmlTree& xml); + + void replaceVertex (Vertex* v1, Vertex* v2); + void replaceEdge (Edge* e1, Edge* e2); + void replaceQuad (Quad* q1, Quad* q2); + + int countElement (EnumElt type); + EltBase* getElement (EnumElt type, int nro); + + void majPropagation (); + void renumeroter (); + + Elements* clonerElements (Elements* table, Matrix* matrice); + int associateCascade (Edges& mline, int msens[], Shape* gstart, + Shapes& gline, double pstart, double pend, bool clos, + bool inv); + int associateLine (Vertex* mfirst, Edge* mstart, Edges& mline, + Shape* gstart, double pstart, Shapes& gline, double pend, + bool inv=false); + + // --------------------------------------------------- Evols Hexa3 + Hexa* addHexaQuadsAB (AnaQuads& strquads); + Hexa* addHexaQuadsAC (AnaQuads& strquads); + Hexa* addHexaQuadsACE (AnaQuads& strquads); + Hexa* addHexaQuadsACD (AnaQuads& strquads); + Hexa* addHexaQuadsABCD (AnaQuads& strquads); + Hexa* addHexaQuadsACDE (AnaQuads& strquads); + + Shape* parseShape (XmlTree* node); + + EltBase* findElement (EnumElt type, int ident); + +private : + friend class EltBase; + + bool doc_modified; + bool count_modified; + bool doc_saved; + bool maj_connection; + bool purge_elements; + int doc_db; + int nbr_errors; + + std::string doc_name; + EltBase* doc_first_elt [EL_MAXI]; + EltBase* doc_last_elt [EL_MAXI]; + int doc_nbr_elt [EL_MAXI]; + double doc_tolerance; + + std::vector doc_laws; + int nbr_laws; + Law* defaultLaw; + + int nbr_propagations; + bool maj_propagation; + + std::vector doc_propagation; + std::vector doc_group; + + std::vector doc_vector; + std::vector doc_cylinder; + std::vector doc_pipe; + XmlWriter* doc_xml; + + // --------------------------------------------------- HexaBlock v3 + + Shape* doc_shape; + + std::vector doc_used_hexas; + std::vector doc_used_quads; + std::vector doc_used_edges; + std::vector doc_used_vertex; + + int nbr_used_hexas; + int nbr_used_quads; + int nbr_used_edges; + int nbr_used_vertex; +}; +// ========================================================= saveVtk (avec nro) +inline int Document::saveVtk (cpchar radical, int &nro) +{ + char num[8]; + sprintf (num, "%d", nro); + nro ++; + + string filename = radical; + filename += num; + filename += ".vtk"; + int ier = saveVtk (filename.c_str()); + return ier; +} +// ========================================================= setDeprecated +inline void Document::setDeprecated (int level) +{ + switch (level) + { + // En cas de destruction : parents invalides + case 2 : maj_connection = true; + purge_elements = true; + // creation + destruction : propagations a revoir + case 1 : maj_propagation = true; + // Par defaut : + default: doc_modified = true; + count_modified = true; + } +} + +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexDocument_Xml.cxx b/src/HEXABLOCK/HexDocument_Xml.cxx new file mode 100755 index 0000000..30442c8 --- /dev/null +++ b/src/HEXABLOCK/HexDocument_Xml.cxx @@ -0,0 +1,685 @@ + +// C++ : Classe Document : methodes internes + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "HexDocument.hxx" +#include // Pour basename +#include // Pour atoi et atof + +#include "HexEltBase.hxx" +#include "HexVertex.hxx" +#include "HexEdge.hxx" +#include "HexQuad.hxx" +#include "HexHexa.hxx" +#include "HexShape.hxx" + +#include "HexElements.hxx" + +#include "HexVector.hxx" +#include "HexCylinder.hxx" +#include "HexPipe.hxx" +#include "HexMatrix.hxx" +#include "HexCloner.hxx" +#include "HexPropagation.hxx" +#include "HexLaw.hxx" +#include "HexGroup.hxx" + +#include "HexXmlWriter.hxx" +#include "HexXmlTree.hxx" + +BEGIN_NAMESPACE_HEXA + +// ======================================================== get_coords +int get_coords (const string& chaine, double& x, double& y, double& z) +{ + // int nv = sscanf (chaine.c_str (), "%lg %lg %lg", &x, &y, &z); + cpchar buffer = chaine.c_str (); + int nv = sscanf (buffer, "%lg %lg %lg", &x, &y, &z); + if (nv!=3) return HERR; + return HOK; +} +// ======================================================== get_coords +int get_coords (const string& chaine, double& x, double& y) +{ + cpchar buffer = chaine.c_str (); + int nv = sscanf (buffer, "%lg %lg", &x, &y); + if (nv!=2) return HERR; + return HOK; +} +// ======================================================== parseName +int parseName (XmlTree* node, EltBase* elt) +{ + const string& name = node->findValue ("name"); + if (name=="") + return HERR; + + elt->setName (name); + return HOK; +} +// ======================================================== get_names +void get_names (const string& chaine, int size, vector& table) +{ + table.clear (); + int lg = chaine.size(); + string mot = ""; + bool encours = false; + + for (int nc=0 ; nc doc_name.size(); + } + + if (noext) + filename += ".xml"; + else + doc_name.erase (ici, 4); + + int ier = xml.parseFile (filename); + if (ier!=HOK) + return ier; + + ier = parseXml (xml); + return ier; +} +// ======================================================== setXml +int Document::setXml (cpchar flux) +{ + XmlTree xml(""); + xml.parseFlow (flux); + + int ier = parseXml (xml); + if (ier==HOK) + doc_saved = true; + return ier; +} +// ======================================================== parseShape +Shape* Document::parseShape (XmlTree* node) +{ + const string& ident = node->findValue ("ident"); + const string& inter = node->findValue ("interval"); + const string& brep = node->findValue ("brep"); + + double pdeb, pfin; + get_coords (inter, pdeb, pfin); + + Shape* shape = new Shape (brep); + shape->setBounds (pdeb, pfin); + shape->setName (ident); + + return shape; +} +// ======================================================== parseXml +int Document::parseXml (XmlTree& xml) +{ + // xml.dump (); + + map t_vertex; + map t_edge; + map t_quad; + map t_hexa; + map t_vector; + vector tname; + + const string& name = xml.findValue ("name"); + if (name != "") + doc_name = name; + + XmlTree* rubrique = xml.findChild ("ListVertices"); + int nbrelts = rubrique->getNbrChildren (); + + for (int nro=0 ; nro < nbrelts ; nro++) + { + XmlTree* node = rubrique->getChild (nro); + double px, py, pz; + const string& nom = node->findValue ("id"); + const string& coords = node->findValue ("coord"); + const string& brep = node->findValue ("shape"); + get_coords (coords, px, py, pz); + + Vertex* vertex = addVertex (px, py, pz); + parseName (node, vertex); + Shape* shape = NULL; + if (brep != "" ) + { + shape = new Shape (brep); + vertex->setAssociation (shape); + } + t_vertex [nom] = vertex; + } + + rubrique = xml.findChild ("ListEdges"); + nbrelts = rubrique->getNbrChildren (); + Edge* edge = NULL; + + for (int nro=0 ; nro < nbrelts ; nro++) + { + XmlTree* node = rubrique->getChild (nro); + const string& type = node->getName(); + if (type=="Edge") + { + const string& nom = node->findValue ("id"); + const string& vertices = node->findValue ("vertices"); + get_names (vertices, V_TWO, tname); + edge = new Edge (t_vertex [tname[0]], t_vertex [tname[1]]); + t_edge [nom] = edge; + parseName (node, edge); + } + else if (type=="Shape" && edge!=NULL) + { + Shape* shape = parseShape (node); + edge->addAssociation (shape); + } + } + + rubrique = xml.findChild ("ListQuads"); + nbrelts = rubrique->getNbrChildren (); + Quad* quad = NULL; + + for (int nro=0 ; nro < nbrelts ; nro++) + { + XmlTree* node = rubrique->getChild (nro); + const string& type = node->getName(); + if (type=="Quad") + { + const string& nom = node->findValue ("id"); + const string& edges = node->findValue ("edges"); + get_names (edges, V_TWO, tname); + + quad = new Quad (t_edge [tname[0]], t_edge [tname[1]], + t_edge [tname[2]], t_edge [tname[3]]); + t_quad [nom] = quad; + parseName (node, quad); + } + else if (type=="Shape" && quad!=NULL) + { + Shape* shape = parseShape (node); + quad->addAssociation (shape); + } + } + + rubrique = xml.findChild ("ListHexas"); + nbrelts = rubrique->getNbrChildren (); + + for (int nro=0 ; nro < nbrelts ; nro++) + { + XmlTree* node = rubrique->getChild (nro); + const string& nom = node->findValue ("id"); + const string& quads = node->findValue ("quads"); + get_names (quads, V_TWO, tname); + + Hexa* hexa = new Hexa (t_quad [tname[0]], t_quad [tname[1]], + t_quad [tname[2]], t_quad [tname[3]], + t_quad [tname[4]], t_quad [tname[5]]); + t_hexa [nom] = hexa; + parseName (node, hexa); + } + + rubrique = xml.findChild ("ListVectors"); + nbrelts = rubrique == NULL ? 0 : rubrique->getNbrChildren (); + + for (int nro=0 ; nro < nbrelts ; nro++) + { + XmlTree* node = rubrique->getChild (nro); + double px, py, pz; + const string& nom = node->findValue ("id"); + const string& coords = node->findValue ("coord"); + get_coords (coords, px, py, pz); + + Vector* vector = addVector (px, py, pz); + t_vector [nom] = vector; + parseName (node, vector); + } + + rubrique = xml.findChild ("ListDicretizationLaws"); + nbrelts = rubrique == NULL ? 0 : rubrique->getNbrChildren (); + + for (int nro=0 ; nro < nbrelts ; nro++) + { + XmlTree* node = rubrique->getChild (nro); + const string& id = node->findValue ("id"); + const string& kind = node->findValue ("kind"); + const string& nodes = node->findValue ("nodes"); + const string& coeff = node->findValue ("coeff"); + + int nbnodes = atoi (nodes.c_str()); + double koeff = atof (coeff.c_str()); + if (id != "DefaultLaw") + { + Law* law = addLaw (id.c_str(), nbnodes); + law->setCoefficient (koeff); + law->setKind (kind.c_str()); + } + } + + rubrique = xml.findChild ("ListPropagations"); + nbrelts = rubrique == NULL ? 0 : rubrique->getNbrChildren (); + + for (int nro=0 ; nro < nbrelts ; nro++) + { + XmlTree* node = rubrique->getChild (nro); + const string& nmedge = node->findValue ("edge"); + const string& nmlaw = node->findValue ("law"); + // const string& nmway = node->findValue ("way"); + + edge = t_edge [nmedge]; + Law* law = findLaw (nmlaw.c_str()); + // bool way = nmway == "true"; + + if (edge != NULL) + edge->setLaw (law); + } + + for (int pipe=0 ; pipe<2 ; pipe++) + { + rubrique = pipe ? xml.findChild ("ListPipes") + : xml.findChild ("ListCylinders"); + + nbrelts = rubrique == NULL ? 0 : rubrique->getNbrChildren (); + + for (int nro=0 ; nro < nbrelts ; nro++) + { + XmlTree* node = rubrique->getChild (nro); + const string& cbase = node->findValue ("c_base" ); + const string& cdir = node->findValue ("c_dir" ); + const string& cradius = node->findValue ("c_radius"); + const string& cheight = node->findValue ("c_height"); + + Vertex* base = t_vertex [cbase]; + Vector* dir = t_vector [cdir]; + double radius = atof (cradius.c_str()); + double height = atof (cheight.c_str()); + + if (pipe) + { + const string& cradius1 = node->findValue ("c_int_radius"); + double radius1 = atof (cradius1.c_str()); + addPipe (base, dir, radius1, radius, height); + } + else + { + addCylinder (base, dir, radius, height); + } + } + } + + rubrique = xml.findChild ("ListGroups"); + int nbrgroups = rubrique == NULL ? 0 : rubrique->getNbrChildren (); + + for (int nro=0 ; nro < nbrgroups ; nro++) + { + XmlTree* ndgroup = rubrique->getChild (nro); + XmlTree* node = ndgroup ->getChild (0); + const string& nom = node->findValue ("name"); + const string& ckind = node->findValue ("kind"); + + EnumGroup kind = Group::getKind (ckind); + Group* groupe = addGroup (nom.c_str(), kind); + EnumElt type = groupe->getTypeElt (); + + nbrelts = ndgroup->getNbrChildren (); + for (int nelt=1 ; nelt < nbrelts ; nelt++) + { + node = ndgroup ->getChild (nelt); + const string& id = node->findValue ("id"); + switch (type) + { + case EL_HEXA : groupe->addElement (t_hexa [id]); + break; + case EL_QUAD : groupe->addElement (t_quad [id]); + break; + case EL_EDGE : groupe->addElement (t_edge [id]); + break; + case EL_VERTEX : + default : groupe->addElement (t_vertex [id]); + break; + } + } + } + + + return HOK; +} +// ======================================================== save +int Document::save (const char* ficxml) +{ + int ier = genXml (ficxml); + return ier; +} +// ======================================================== getXml +cpchar Document::getXml () +{ + int ier = genXml (NULL); + if (ier!=HOK) + return NULL; + + return doc_xml->getXml (); +} +// ======================================================== genXml +int Document::genXml (cpchar filename) +{ + // -- 1) Raz numerotation precedente + markAll (NO_COUNTED); + if (maj_propagation) + majPropagation (); + + if (doc_xml==NULL) + doc_xml = new XmlWriter (); + + doc_xml->openXml (filename); + doc_xml->openMark ("Document"); + doc_xml->addAttribute ("name", doc_name); + doc_xml->endMark (); + + cpchar balise [] = {"ListXXXX", + "ListVertices", "ListEdges", "ListQuads", "ListHexas", "ListVectors", + "ListXXXX" }; + + for (int type=EL_VERTEX ; type <= EL_VECTOR ; type++) + { + doc_xml->addMark (balise [type]); + for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt !=NULL && elt->isHere()) + elt->saveXml (doc_xml); + } + doc_xml->closeMark (true); + } + + doc_xml->addMark ("ListDicretizationLaws"); + for (int nro=0 ; nrosaveXml (doc_xml); + doc_xml->closeMark (true); + + doc_xml->addMark ("ListPropagations"); + for (int nro=0 ; nrosaveXml (doc_xml); + doc_xml->closeMark (true); + + int nombre = countCylinder(); + doc_xml->addMark ("ListCylinders"); + for (int nro=0 ; nrosaveXml (doc_xml); + doc_xml->closeMark (true); + + nombre = countPipe(); + doc_xml->addMark ("ListPipes"); + for (int nro=0 ; nrosaveXml (doc_xml); + doc_xml->closeMark (true); + + nombre = countGroup(); + doc_xml->addMark ("ListGroups"); + for (int nro=0 ; nrosaveXml (doc_xml); + doc_xml->closeMark (); + + doc_xml->closeMark (); + doc_xml->closeXml (); + doc_saved = true; + return HOK; +} +// ======================================================== markAll +void Document::markAll (int marque, int type) +{ + int debut = EL_VERTEX; + int fin = EL_HEXA; + if (type>=0 && typenext (); elt!=NULL; + elt = elt->next()) + elt->setMark (marque); + } +} +// ====================================================== saveVtk +int Document::saveVtk (cpchar nomfic) +{ + // -- 1) Raz numerotation precedente + markAll (NO_COUNTED, EL_VERTEX); + + int nbnodes = 0; + int nbcells = 0; + + for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL; + elt = elt->next()) + { + Hexa* cell = static_cast (elt); + if (cell!=NULL && cell->isHere()) + { + nbcells ++; + nbnodes += cell->countNodes (); + } + } + + pfile vtk = fopen (nomfic, "w"); + if (vtk==NULL) + { + cout << " ****" << endl; + cout << " **** Document::saveVtk : " << endl; + cout << " **** Can't open file " << endl; + cout << " ****" << endl; + + } + fprintf (vtk, "# vtk DataFile Version 3.1\n"); + fprintf (vtk, "%s \n", nomfic); + fprintf (vtk, "ASCII\n"); + fprintf (vtk, "DATASET UNSTRUCTURED_GRID\n"); + fprintf (vtk, "POINTS %d float\n", nbnodes); + + // -- 2) Les noeuds + int nronode = 0; + for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL; + elt = elt->next()) + { + Hexa* cell = static_cast (elt); + if (cell!=NULL && cell->isHere()) + cell->printNodes (vtk, nronode); + } + // -- 2) Les hexas + + fprintf (vtk, "CELLS %d %d\n", nbcells, nbcells*(HV_MAXI+1)); + + for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL; + elt = elt->next()) + { + Hexa* cell = static_cast (elt); + if (cell!=NULL && cell->isHere()) + cell->printHexa (vtk); + } + + fprintf (vtk, "CELL_TYPES %d\n", nbcells); + for (int nro=0 ; nronext (); elt!=NULL; + elt = elt->next()) + { + Hexa* cell = static_cast (elt); + if (cell!=NULL && cell->isHere()) + cell->colorNodes (vtk); + } + + fclose (vtk); + return HOK; +} +// ====================================================== purge +void Document::purge () +{ + purge_elements = false; + // ------------------- Raz marques + markAll (NO_USED); + + // ------------------- Marquage elements utilises + for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL; + elt = elt->next()) + { + Hexa* cell = static_cast (elt); + if (cell!=NULL && cell->isHere()) + cell->markElements (IS_USED); + } + // ------------------- Elimination elements inutilises + for (int type=EL_VERTEX ; type <= EL_QUAD ; type++) + { + for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt->getMark () == NO_USED) + elt->suppress (); + } + } + // ------------------- Sortie elements inutilises + +/* **************************************************************** + EltBase* trash = doc_last_elt [EL_REMOVED]; + + for (int type=EL_VERTEX ; type <= EL_HEXA ; type++) + { + doc_nbr_elt [type] = 0; + EltBase* last = doc_first_elt [type]; + for (EltBase* elt = last->next (); elt!=NULL; elt = last->next()) + { + if (elt->isHere ()) + { + doc_nbr_elt [type] ++; + last = elt; + } + else + { + last -> setNext (elt -> next()); + trash -> setNext (elt); + trash = elt; + trash -> setNext (NULL); + } + } + doc_last_elt [type] = last; + } + + doc_last_elt [EL_REMOVED] = trash; + **************************************************************** */ + update (); +} +// ======================================================== majReferences +void Document::majReferences () +{ + maj_connection = false; + + for (int type=EL_VERTEX ; type <= EL_QUAD ; type++) + { + for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL; + elt = elt->next()) + { + elt->razReferences (); + } + } + + for (int type=EL_EDGE ; type <= EL_HEXA ; type++) + { + for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt->isHere ()) + elt->majReferences (); + } + } +} +// ======================================================== dump +void Document::dump () +{ + cpchar nom_type [] = { "Elments non classes", + "Sommets", "Aretes", "Faces", "Hexaedres", "Elements detruits" }; + + for (int type=EL_VERTEX ; type <= EL_HEXA ; type++) + { + printf ("\n"); + printf (" ++++ Liste des %s\n", nom_type[type]); + printf ("\n"); + + for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt->isHere()) + elt->dump (); + } + } + + printf (" ++++ End od dump\n"); +} +// ======================================================== putError +void Document::putError (cpchar mess, cpchar info1, cpchar info2) +{ + nbr_errors ++; + printf (" ********************************************************** \n"); + printf (" **** HexaBlocks Error nro %d :\n", nbr_errors); + printf (" **** "); + printf (mess, info1, info2); + printf ("\n"); + printf (" **** \n"); + printf (" ********************************************************** \n"); +} +// ======================================================== hputError +void Document::hputError (cpchar mess, EltBase* e1, EltBase* e2) +{ + char name1 [32] = { 0 }; + char name2 [32] = { 0 }; + + if (e1!=NULL) e1->getName (name1); + if (e2!=NULL) e2->getName (name2); + + putError (mess, name1, name2); +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexDocument_asso.cxx b/src/HEXABLOCK/HexDocument_asso.cxx new file mode 100755 index 0000000..23acae5 --- /dev/null +++ b/src/HEXABLOCK/HexDocument_asso.cxx @@ -0,0 +1,241 @@ + +// C++ : Associatiosn dans le document + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "HexDocument.hxx" +#include "HexEdge.hxx" +#include "HexDiagnostics.hxx" + + +BEGIN_NAMESPACE_HEXA + +static bool db = false; + +int vertexInLine (Vertex* mfirst, Edges& mline, vector &tsens); +int associateShapes (Edges& mline, int msens[], Shape* gstart, Shapes& gline, + double pstart, double pend, bool closed, bool inv=false); + +// ====================================================== associateOpenedLine +int Document::associateOpenedLine (Edge* mstart, Edges& mline, Shape* gstart, + double pstart, Shapes& gline, double pend) +{ + int ier = associateLine (NULL, mstart, mline, gstart, pstart, gline, pend); + return ier; +} +// ====================================================== associateClosedLine +int Document::associateClosedLine (Vertex* vfirst, Edge* mstart, Edges& mline, + Shape* gstart, double pstart, bool inv, Shapes& gline) +{ + if (vfirst == NULL) + { + putError (W_ASSO_LINE3); + return HERR; + } + + int ier = associateLine (vfirst, mstart, mline, gstart, pstart, gline, + 1.0, inv); + return ier; +} +// ====================================================== associateClosedLine +int Document::associateLine (Vertex* vfirst, Edge* mstart, Edges& mline, + Shape* gstart, double pstart, Shapes& gline, double pend, + bool inv) +{ + db = on_debug (); + char buffer [16], cnum [8]; + int nbseg = mline.size (); + bool closed = vfirst != NULL; + + if (mstart == NULL) + { + putError (W_ASSO_LINE4); + return HERR; + } + // Contour ferme : + // Le vertex de depart n'appartient pas a l'edge de depart + int istart = mstart->index (vfirst); + if (closed && istart == NOTHING) + { + putError (W_ASSO_LINE2, vfirst->getName (buffer)); + return HERR; + } + + if (db) + { + PutName (vfirst); + printf (" . : "); + mstart->printName (" = ("); + mstart->getVertex(V_AMONT)->printName (", "); + mstart->getVertex(V_AVAL) ->printName (")\n"); + + for (int nro=0 ; nroprintName(" = ("); + mline[nro]->getVertex(V_AMONT)->printName(", "); + mline[nro]->getVertex(V_AVAL )->printName(")\n"); + } + } + + + for (int ns = 0 ; ns < nbseg ; ns++) + { + if (mline[ns] == NULL) + { + sprintf (cnum, "%d", ns); + putError (W_ASSO_LINE5, cnum); + return HERR; + } + } + + vector tab_sens (nbseg, V_TWO); + int sens = V_AMONT; + int nedge = NOTHING; + Vertex* pnode = mstart->getVertex (sens); + + if (nbseg==0) + { + nedge = 0; + } + else if (NOT closed) + { + pnode = mstart->getVertex (sens); + nedge = vertexInLine (pnode, mline, tab_sens); + if (nedge == NOTHING) + { + sens = V_AVAL; + pnode = mstart->getVertex (sens); + nedge = vertexInLine (pnode, mline, tab_sens); + } + } + // Closed : on recherche ou se trouve le 2e vertex de mstart + else + { + sens = 1-istart; + pnode = mstart->getVertex (sens); + nedge = vertexInLine (pnode, mline, tab_sens); + } + + HexDisplay (nbseg); + + if (nedge == NOTHING) + { + putError (W_ASSO_LINE, mstart->getName (buffer)); + return HERR; + } + + Edges les_edges; + vector les_orig; + les_edges.push_back (mstart); + les_orig .push_back (1-sens); + HexDisplay (nedge); + cout << " ........................................ Marque 1" << endl; + if (nbseg>0) + { + les_edges.push_back (mline[nedge]); + les_orig. push_back (tab_sens[nedge]); + } + + cout << " ........................................ Marque 2" << endl; + if (db) + printf (" mstart [%d] = mline[%d][%d] = %s\n", sens, nedge, + tab_sens [nedge], pnode->getName(buffer)); + + cout << " ........................................ Marque 3" << endl; + for (int ns = 1 ; ns < nbseg ; ns++) + { + Vertex* pnode = mline[nedge]->getVertex (1-tab_sens [nedge]); + int nro = vertexInLine (pnode, mline, tab_sens); + if (nro == NOTHING) + { + sprintf (cnum, "%d", nedge); + putError (W_ASSO_LINE2, cnum, mline[nedge]->getName (buffer)); + return HERR; + } + if (db) + printf (" mline[%d][%d] = mline[%d][%d] = %s\n", nedge, + 1-tab_sens [nedge], nro, tab_sens [nro], pnode->getName(buffer)); + nedge = nro; + les_edges.push_back (mline [nedge]); + les_orig. push_back (tab_sens [nedge]); + } + + /******************** + if (db) + { + printf (" ... gstart = 0x%x, pstart=%g\n", gstart, pstart); + for (int ns = 0 ; ns < gline.size() ; ns++) + { + printf (" ... gline[%d] = 0x%x\n", ns, gline[ns]); + } + } + **************************/ + + if (closed) + { + Vertex* tete = les_edges [0] ->getVertex (les_orig[0]); + Vertex* queue = les_edges [nbseg]->getVertex (1-les_orig[nbseg]); + if (tete != queue) + { + HexDump (tete); + HexDump (queue); + HexDump (les_edges [0]); + HexDump (les_edges [nbseg]); + putError (W_ASSO_LINE6); + return HERR; + } + } + + int ier = associateShapes (les_edges, &les_orig[0], gstart, gline, pstart, + pend, closed, inv); + return ier; +} +// ====================================================== vertexInLine +int vertexInLine (Vertex* mfirst, Edges& mline, vector &tsens) +{ + int nbseg = mline.size (); + + for (int ned = 0 ; nedgetVertex (ns) == mfirst) + { + tsens [ned] = ns; + return ned; + } + } + } + + return NOTHING; +} +// ====================================================== vertexInLine +void Document::clearAssociation () +{ + for (int nat=EL_VERTEX ; nat<=EL_QUAD ; nat++) + { + for (EltBase* elt = doc_first_elt[nat]->next (); elt!=NULL; + elt = elt->next()) + clear_association (elt); + } +} + +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexDocument_quads.cxx b/src/HEXABLOCK/HexDocument_quads.cxx new file mode 100755 index 0000000..18a4caf --- /dev/null +++ b/src/HEXABLOCK/HexDocument_quads.cxx @@ -0,0 +1,1117 @@ + +// C++ : Classe Document : Methodes internes 2011 + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexDocument.hxx" + +#include +#include + +#include "HexVertex.hxx" +#include "HexEdge.hxx" +#include "HexQuad.hxx" +#include "HexHexa.hxx" + +#include "HexLaw.hxx" + +#include "HexAnaQuads.hxx" +#include "HexElements.hxx" +#include "HexCramer.hxx" + +BEGIN_NAMESPACE_HEXA + +#define PermuterEdges(e1,e2) permuter_edges (e1, e2, #e1, #e2) +void permuter_edges (Edge* &e1, Edge* &e2, cpchar n1=NULL, cpchar n2=NULL); +double* prod_vectoriel (Edge* e1, Edge* e2, double result[]); + +static bool db = false; + +// ======================================================== copyDocument +Document* Document::copyDocument () +{ + string nom = "CopyOf_"; + nom += doc_name; + + Document* clone = new Document (nom.c_str()); + + for (EltBase* elt = doc_first_elt[EL_VERTEX]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt !=NULL && elt->isHere()) + { + Vertex* node = static_cast (elt); + node->duplicate (clone); + } + } + + for (int type=EL_EDGE ; type <= EL_HEXA ; type++) + { + for (EltBase* elt = doc_first_elt[type]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt !=NULL && elt->isHere()) + elt->duplicate (); + } + } + + for (int nro=0 ; nrodoc_laws.push_back (law); + } + + return clone; +} +// ---------------------------------------------------------------------------- +// ======================================================== countUsedHexa +int Document::countUsedHexa () +{ + if (count_modified) + renumeroter (); + + return nbr_used_hexas; +} +// ======================================================== countUsedQuad +int Document::countUsedQuad () +{ + if (count_modified) + renumeroter (); + + return nbr_used_quads; +} +// ======================================================== countUsedEdge +int Document::countUsedEdge () +{ + if (count_modified) + renumeroter (); + + return nbr_used_edges; +} +// ======================================================== countUsedVertex +int Document::countUsedVertex () +{ + if (count_modified) + renumeroter (); + + return nbr_used_vertex; +} + +// ======================================================== getUsedHexa +Hexa* Document::getUsedHexa (int nro) +{ + if (count_modified) + renumeroter (); + + if (nro<0 || nro >= nbr_used_hexas) + return NULL; + + return doc_used_hexas [nro]; +} +// ======================================================== getUsedQuad +Quad* Document::getUsedQuad (int nro) +{ + if (count_modified) + renumeroter (); + + if (nro<0 || nro >= nbr_used_quads) + return NULL; + + return doc_used_quads [nro]; +} +// ======================================================== getUsedEdge +Edge* Document::getUsedEdge (int nro) +{ + if (count_modified) + renumeroter (); + + if (nro<0 || nro >= nbr_used_edges) + return NULL; + + return doc_used_edges [nro]; +} +// ======================================================== getUsedVertex +Vertex* Document::getUsedVertex (int nro) +{ + if (count_modified) + renumeroter (); + + if (nro<0 || nro >= nbr_used_vertex) + return NULL; + + return doc_used_vertex [nro]; +} +// ======================================================== renumeroter +void Document::renumeroter () +{ + count_modified = false; + // -- 1) Raz numerotation precedente + markAll (NO_COUNTED); + + doc_used_hexas .clear (); + doc_used_quads .clear (); + doc_used_edges .clear (); + doc_used_vertex.clear (); + + for (EltBase* elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt!=NULL && elt->isHere()) + { + Hexa* cell = static_cast (elt); + doc_used_hexas.push_back (cell); + for (int nb=0 ; nbgetQuad (nb)->setMark (IS_USED); + + for (int nb=0 ; nbgetEdge (nb)->setMark (IS_USED); + + for (int nb=0 ; nbgetVertex (nb)->setMark (IS_USED); + } + } + + for (EltBase* elt = doc_first_elt[EL_QUAD]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt!=NULL && elt->isHere() && elt->getMark()==IS_USED) + { + Quad* cell = static_cast (elt); + doc_used_quads.push_back (cell); + } + } + + for (EltBase* elt = doc_first_elt[EL_EDGE]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt!=NULL && elt->isHere() && elt->getMark()==IS_USED) + { + Edge* cell = static_cast (elt); + doc_used_edges.push_back (cell); + } + } + + for (EltBase* elt = doc_first_elt[EL_VERTEX]->next (); elt!=NULL; + elt = elt->next()) + { + if (elt!=NULL && elt->isHere() && elt->getMark()==IS_USED) + { + Vertex* cell = static_cast (elt); + doc_used_vertex.push_back (cell); + } + } + + nbr_used_hexas = doc_used_hexas .size (); + nbr_used_quads = doc_used_quads .size (); + nbr_used_edges = doc_used_edges .size (); + nbr_used_vertex = doc_used_vertex .size (); +} +// --------------------------------------------------------------- +// ============================================================== addHexa2quads +Hexa* Document::addHexa2Quads (Quad* q1, Quad* q2) +{ + AnaQuads ana_quads (q1, q2); + + Hexa* hexa = NULL; + if (ana_quads.status != HOK) + hexa = NULL; + + else if (ana_quads.nbr_aretes == 0) + hexa = addHexaQuadsAB (ana_quads); + + else if (ana_quads.nbr_aretes == 1) + hexa = addHexaQuadsAC (ana_quads); + + return hexa; +} +// ============================================================= addHexa3quads +Hexa* Document::addHexa3Quads (Quad* q1, Quad* q2, Quad* q3) +{ + AnaQuads ana_quads (q1, q2, q3); + + Hexa* hexa = NULL; + if (ana_quads.status != HOK) + hexa = NULL; + + else if (ana_quads.nbr_aretes == 2) + hexa = addHexaQuadsACD (ana_quads); + + else if (ana_quads.nbr_aretes == 3) + hexa = addHexaQuadsACE (ana_quads); + + return hexa; +} +// ============================================================= addHexa4quads +Hexa* Document::addHexa4Quads (Quad* q1, Quad* q2, Quad* q3, Quad* q4) +{ + AnaQuads ana_quads (q1, q2, q3, q4); + + Hexa* hexa = NULL; + if (ana_quads.status != HOK) + hexa = NULL; + + else if (ana_quads.nbr_aretes == 4) + hexa = addHexaQuadsABCD (ana_quads); + + else if (ana_quads.nbr_aretes == 5) + hexa = addHexaQuadsACDE (ana_quads); + + return hexa; +} +// ============================================================== addHexa5quads +Hexa* Document::addHexa5Quads (Quad* q1, Quad* q2, Quad* q3, Quad* q4, Quad* q5) +{ + AnaQuads ana_quads (q1, q2, q3, q4, q5); + if (ana_quads.status != HOK) + return NULL; + else if (ana_quads.nbr_aretes != 8) + return NULL; + + int qbase = NOTHING; + for (int nquad=0 ; nquad < ana_quads.nbr_quads ; nquad++) + if (ana_quads.inter_nbre [nquad] == 4) + qbase = nquad; + + if (qbase == NOTHING) + return NULL; + + Edge* tedge [QUAD4]; + Quad* tquad [QUAD4]; + for (int nedge=0 ; nedge < QUAD4 ; nedge++) + { + int nq = ana_quads.inter_quad [qbase] [nedge]; + int ned1 = ana_quads.inter_edge [nq] [qbase]; + int ned2 = (ned1 + 2) MODULO QUAD4; + Quad* mur = ana_quads.tab_quads[nq]; + tedge [nedge] = mur->getEdge (ned2); + tquad [nedge] = mur; + } + + Quad* q_a = ana_quads.tab_quads[qbase]; + Quad* q_b = new Quad (tedge[0], tedge[1], tedge[2], tedge[3]); + Hexa* hexa = new Hexa (q_a, q_b, tquad[0], tquad[2], tquad[1], tquad[3]); + return hexa; +} +// --------------------------------------------------------------- +// ========================================================== addHexaquadsAB +Hexa* Document::addHexaQuadsAB (AnaQuads& strquads) +{ + Quad* q_a = strquads.tab_quads[0]; + Quad* q_b = strquads.tab_quads[1]; + + double dmin = 0; + int sens = 1; + int decal = 0; + for (int is = 0 ; is<2 ; is++) + { + int ns = 1-2*is; + for (int ndec = 0 ; ndecgetVertex (na), + q_b->getVertex (nb)); + } + if (ndec==0 && is==0) + { + decal = ndec; + dmin = dist; + sens = ns; + } + else if (distgetVertex (na), q_b->getVertex (nb)); + } + + for (int nal = 0 ; nalfindEdge (e_left ->getVertex (V_AMONT), + e_right->getVertex (V_AMONT)); + Edge* e_bx = q_b->findEdge (e_left ->getVertex (V_AVAL), + e_right->getVertex (V_AVAL)); + tquad [nal] = new Quad (e_ax, tedge [nal], e_bx, tedge [nar]); + } + + Hexa* hexa = new Hexa (q_a, q_b, tquad[0], tquad[2], tquad[1], tquad[3]); + return hexa; +} +// ========================================================== addHexaquadsAC +Hexa* Document::addHexaQuadsAC (AnaQuads& strquads) +{ + Quad* q_a = strquads.tab_quads[0]; + Quad* q_c = strquads.tab_quads[1]; + + Vertex* tv_bdx [V_TWO]; // x = e ou f + Edge* te_dX [V_TWO]; + Edge* te_bX [V_TWO]; + Quad* tq_ef [V_TWO]; + + int neda0 = strquads.inter_edge [0] [1]; + + Edge* e_ac = q_a->getEdge (neda0); + + for (int ns=V_AMONT; ns<=V_AVAL ; ns++) + { + Vertex* vx1 = e_ac->getVertex (ns); + Vertex* vx2 = e_ac->getVertex (1-ns); + + int nda2 = q_a->indexVertex (vx2); + nda2 = (nda2 +2) MODULO QUAD4; + + int ndc2 = q_c->indexVertex (vx2); + ndc2 = (ndc2 +2) MODULO QUAD4; + + Vertex* vxa = q_a->getVertex (nda2); + Vertex* vxc = q_c->getVertex (ndc2); + + double dx = (vxa->getX() - vx1->getX()) + (vxc->getX() - vx1->getX()); + double dy = (vxa->getY() - vx1->getY()) + (vxc->getY() - vx1->getY()); + double dz = (vxa->getZ() - vx1->getZ()) + (vxc->getZ() - vx1->getZ()); + tv_bdx [ns] = new Vertex (this, vx1->getX()+dx, vx1->getY()+dy, + vx1->getZ()+dz); + Edge* edga = q_a->findEdge (vx1, vxa); + Edge* edgc = q_c->findEdge (vx1, vxc); + + te_dX [ns] = new Edge (vxa, tv_bdx[ns]); + te_bX [ns] = new Edge (vxc, tv_bdx[ns]); + tq_ef [ns] = new Quad (edga, te_dX[ns], te_bX[ns], edgc); + } + + int ff = 0; + Edge* e_bd = new Edge (tv_bdx[V_AMONT], tv_bdx[V_AVAL]); + Edge* e_ad = q_a->getOpposEdge (e_ac, ff); + Edge* e_bc = q_c->getOpposEdge (e_ac, ff); + + Quad* q_d = new Quad (e_bd, te_dX[V_AMONT], e_ad, te_dX[V_AVAL]); + Quad* q_b = new Quad (e_bd, te_bX[V_AMONT], e_bc, te_bX[V_AVAL]); + + Hexa* hexa = new Hexa (q_a, q_b, q_c, q_d, tq_ef[V_AMONT], tq_ef[V_AVAL]); + return hexa; +} +// ========================================================= addHexaquadsACE +// ==== Construction d'un hexaedre a partir d'un triedre +/* + 6=bed +----bd-----+ bdf=7 + /| /| + be | B bf | + / | / | + 4=bce +----bc-----+...|...bcf=5 + | de D | df + | E | | F | z + ce | C cf | ^ + 2=ade...|...+----ad-|---+ adf=3 | y + | / | / | / + | ae A | af | / + |/ |/ |/ + 0=ace +----ac-----+ acf=1 +-----> x + +On connait les faces A, C, E +Il faut determiner le point bdf, intersection des faces B, D, F + +bdf in B : Scalaire ((bdf-bce), Vectoriel (be, bc)) = 0 +bdf in D : Scalaire ((bdf-ade), Vectoriel (ad, de)) = 0 +bdf in F : Scalaire ((bdf-acf), Vectoriel (af, cf)) = 0 + +Soit 3 inconnues (Xbdf, Ybdf, Zbdf) et 3 equations +Un merci a Francois Mougery qui m'a rappele quelques notions de geometrie 3D + +Le systeme s'ecrit : + + Scalaire ((M-bce), norm_b) = 0 + Scalaire ((M-ade), morm_d) = 0 + Scalaire ((M-acf), morm_f) = 0 + +<=> + + Scalaire (M, norm_b) = Scalaire (bce, norm_b) + scalaire (M, norm_d) = Scalaire (ade, norm_b) + scalaire (M, norm_f) = Scalaire (acf, norm_b) + +<=> + norme_b.x*X + norme_b.y*Y + norme_b.z*Z = K1 + norme_d.x*X + norme_d.y*Y + norme_d.z*Z = K2 + norme_f.x*X + norme_f.y*Y + norme_f.z*Z = K3 + + * ----------------------------------------------------- */ +Hexa* Document::addHexaQuadsACE (AnaQuads& strquads) +{ + Real3 v_bce, v_ade, v_acf, v_bdf; // Sommets + Real3 norm_b, norm_d, norm_f; // Normales aux faces + int ff = 0; + + Quad* q_a = strquads.tab_quads[0]; + Quad* q_c = strquads.tab_quads[1]; + Quad* q_e = strquads.tab_quads[2]; + + Edge* e_ac = q_a->commonEdge (q_c); + Edge* e_ae = q_a->commonEdge (q_e); + Edge* e_ce = q_c->commonEdge (q_e); + + Edge* e_ad = q_a->getOpposEdge (e_ac, ff); + Edge* e_af = q_a->getOpposEdge (e_ae, ff); + Edge* e_cf = q_c->getOpposEdge (e_ce, ff); + + Edge* e_bc = q_c->getOpposEdge (e_ac, ff); + Edge* e_be = q_e->getOpposEdge (e_ae, ff); + Edge* e_de = q_e->getOpposEdge (e_ce, ff); + + e_ce->commonPoint (e_bc, v_bce); + e_ae->commonPoint (e_ad, v_ade); + e_ac->commonPoint (e_af, v_acf); + + prod_vectoriel (e_be, e_bc, norm_b); // Calcul normale a la face B + prod_vectoriel (e_ad, e_de, norm_d); // Calcul normale a la face D + prod_vectoriel (e_af, e_cf, norm_f); // Calcul normale a la face F + + Real3 membre2 = { prod_scalaire (v_bce, norm_b), + prod_scalaire (v_ade, norm_d), + prod_scalaire (v_acf, norm_f) }; + + double matrix [] = { norm_b[dir_x], norm_b[dir_y], norm_b[dir_z], + norm_d[dir_x], norm_d[dir_y], norm_d[dir_z], + norm_f[dir_x], norm_f[dir_y], norm_f[dir_z] }; + Cramer systeme (DIM3); + int ier = systeme.resoudre (matrix, membre2, v_bdf); + if (ier != HOK) + { + printf (" addHexaQuadsACE : systeme impossible\n"); + return NULL; + } + + Vertex* s_bdf = new Vertex (this, v_bdf[dir_x], v_bdf[dir_y], v_bdf[dir_z]); + Vertex* s_bde = e_be -> commonVertex (e_de); + Vertex* s_bcf = e_bc -> commonVertex (e_cf); + Vertex* s_adf = e_af -> commonVertex (e_ad); + + Edge* e_bd = new Edge (s_bdf, s_bde); + Edge* e_bf = new Edge (s_bdf, s_bcf); + Edge* e_df = new Edge (s_bdf, s_adf); + + Quad* q_b = new Quad (e_bc, e_be, e_bd, e_bf); + Quad* q_d = new Quad (e_de, e_ad, e_df, e_bd); + Quad* q_f = new Quad (e_af, e_cf, e_bf, e_df); + + Hexa* hexa = new Hexa (q_a, q_b, q_c, q_d, q_e, q_f); + return hexa; +} +// ========================================================= addHexaquadsACD +// ==== Construction d'un hexaedre a partir d'un U +Hexa* Document::addHexaQuadsACD (AnaQuads& strquads) +{ + int pos_a = NOTHING; + for (int np=0 ; np<3 && pos_a==NOTHING ; np++) + if (strquads.inter_nbre[np]==2) + pos_a = np; + + if (pos_a==NOTHING) + return NULL; + + int pos_c = (pos_a+1) MODULO 3; + int pos_d = (pos_a+2) MODULO 3; + Quad* q_a = strquads.tab_quads[pos_a]; + Quad* q_c = strquads.tab_quads[pos_c]; + Quad* q_d = strquads.tab_quads[pos_d]; + + int na_ac = strquads.inter_edge[pos_a][pos_c]; // Nro dans q_a de e_ac + int nc_ac = strquads.inter_edge[pos_c][pos_a]; // Nro dans q_c de e_ac + int nd_ad = strquads.inter_edge[pos_d][pos_a]; // Nro dans q_d de e_ad + + Edge* e_ae = q_a->getEdge ((na_ac + 1) MODULO QUAD4); // Arbitraire + Edge* e_af = q_a->getEdge ((na_ac + 3) MODULO QUAD4); // Arbitraire + + Edge* e_bc = q_c->getEdge ((nc_ac + 2) MODULO QUAD4); + Edge* e_bd = q_d->getEdge ((nd_ad + 2) MODULO QUAD4); + + Edge* e_ce = q_c->getEdge ((nc_ac + 1) MODULO QUAD4); + Edge* e_cf = q_c->getEdge ((nc_ac + 3) MODULO QUAD4); + + Edge* e_de = q_d->getEdge ((nd_ad + 1) MODULO QUAD4); + Edge* e_df = q_d->getEdge ((nd_ad + 3) MODULO QUAD4); + + Vertex* v_ace = e_ae->commonVertex (e_ce); + Vertex* v_ade = e_ae->commonVertex (e_de); + if (v_ace==NULL) + { + permuter_edges (e_ce, e_cf); + v_ace = e_ae->commonVertex (e_ce); + } + + if (v_ade==NULL) + { + permuter_edges (e_de, e_df); + v_ade = e_ae->commonVertex (e_de); + } + + Vertex* v_acf = e_af->commonVertex (e_cf); + Vertex* v_adf = e_af->commonVertex (e_df); + + Vertex* v_bce = e_ce->opposedVertex (v_ace); + Vertex* v_bde = e_de->opposedVertex (v_ade); + Vertex* v_bcf = e_cf->opposedVertex (v_acf); + Vertex* v_bdf = e_df->opposedVertex (v_adf); + + Edge* e_be = new Edge (v_bce, v_bde); + Edge* e_bf = new Edge (v_bcf, v_bdf); + + Quad* q_b = new Quad (e_be, e_bc, e_bf, e_bd); + Quad* q_e = new Quad (e_ae, e_ce, e_be, e_de); + Quad* q_f = new Quad (e_af, e_cf, e_bf, e_df); + + Hexa* hexa = new Hexa (q_a, q_b, q_c, q_d, q_e, q_f); + return hexa; +} +// ========================================================= addHexaquadsABCD +Hexa* Document::addHexaQuadsABCD (AnaQuads& strquads) +{ + int pos_a = 0; + int pos_b = NOTHING; + int pos_c = NOTHING; + int pos_d = NOTHING; + + for (int np=1 ; np<4 ; np++) + { + if (strquads.inter_edge [pos_a] [np] == NOTHING ) + pos_b = np; + else if (pos_c==NOTHING) + pos_c = np; + else + pos_d = np; + } + + if (pos_b==NOTHING || pos_c==NOTHING || pos_d==NOTHING) + return NULL; + + Quad* q_a = strquads.tab_quads [pos_a]; + Quad* q_b = strquads.tab_quads [pos_b]; + Quad* q_c = strquads.tab_quads [pos_c]; + Quad* q_d = strquads.tab_quads [pos_d]; + + int na_ac = strquads.inter_edge[pos_a][pos_c]; // Nro dans q_a de e_ac + int nc_ac = strquads.inter_edge[pos_c][pos_a]; // Nro dans q_c de e_ac + int nd_ad = strquads.inter_edge[pos_d][pos_a]; // Nro dans q_d de e_ad + int nb_bc = strquads.inter_edge[pos_b][pos_c]; // Nro dans q_b de e_bc + + Edge* e_ae = q_a->getEdge ((na_ac + 1) MODULO QUAD4); + Edge* e_af = q_a->getEdge ((na_ac + 3) MODULO QUAD4); + + Edge* e_ce = q_c->getEdge ((nc_ac + 1) MODULO QUAD4); + Edge* e_cf = q_c->getEdge ((nc_ac + 3) MODULO QUAD4); + + Edge* e_de = q_d->getEdge ((nd_ad + 1) MODULO QUAD4); + Edge* e_df = q_d->getEdge ((nd_ad + 3) MODULO QUAD4); + + Edge* e_be = q_b->getEdge ((nb_bc + 1) MODULO QUAD4); + Edge* e_bf = q_b->getEdge ((nb_bc + 3) MODULO QUAD4); + + if (db) + { + HexDump (q_a); + HexDump (q_b); + HexDump (q_c); + HexDump (q_d); + + HexDump (e_ae); + HexDump (e_af); + HexDump (e_ce); + HexDump (e_cf); + HexDump (e_de); + HexDump (e_df); + HexDump (e_be); + HexDump (e_bf); + } + + if (e_ae->commonVertex (e_ce) == NULL) + PermuterEdges (e_ce, e_cf); + + if (e_ae->commonVertex (e_de) == NULL) + PermuterEdges (e_de, e_df); + + if (e_ce->commonVertex (e_be) == NULL) + PermuterEdges (e_be, e_bf); + + Quad* q_e = new Quad (e_ae, e_ce, e_be, e_de); + Quad* q_f = new Quad (e_af, e_cf, e_bf, e_df); + + Hexa* hexa = new Hexa (q_a, q_b, q_c, q_d, q_e, q_f); + return hexa; +} +// ========================================================= addHexaquadsACDE +Hexa* Document::addHexaQuadsACDE (AnaQuads& strquads) +{ + int pos_a = NOTHING; + int pos_c = NOTHING; + int pos_d = NOTHING; + int pos_e = NOTHING; + + for (int np=0 ; np<4 ; np++) + if (strquads.inter_nbre[np]==3) + { + if (pos_a == NOTHING) pos_a = np; + else pos_e = np; + } + else if (strquads.inter_nbre[np]==2) + { + if (pos_c == NOTHING) pos_c = np; + else pos_d = np; + } + + if (pos_a==NOTHING || pos_c==NOTHING || pos_d==NOTHING || pos_e==NOTHING) + return NULL; + + Quad* q_a = strquads.tab_quads[pos_a]; + Quad* q_c = strquads.tab_quads[pos_c]; + Quad* q_d = strquads.tab_quads[pos_d]; + Quad* q_e = strquads.tab_quads[pos_e]; + + int na_ac = strquads.inter_edge[pos_a][pos_c]; // Nro dans q_a de e_ac + + int nc_ac = strquads.inter_edge[pos_c][pos_a]; // Nro dans q_c de e_ac + int nc_ce = strquads.inter_edge[pos_c][pos_e]; // Nro dans q_c de e_ce + + int nd_ad = strquads.inter_edge[pos_d][pos_a]; // Nro dans q_d de e_ad + int nd_de = strquads.inter_edge[pos_d][pos_e]; // Nro dans q_d de e_de + + int ne_ae = strquads.inter_edge[pos_e][pos_a]; // Nro dans q_e de e_ae + + Edge* e_af = q_a->getEdge ((na_ac + 3) MODULO QUAD4); + Edge* e_bc = q_c->getEdge ((nc_ac + 2) MODULO QUAD4); + Edge* e_cf = q_c->getEdge ((nc_ce + 2) MODULO QUAD4); + Edge* e_bd = q_d->getEdge ((nd_ad + 2) MODULO QUAD4); + Edge* e_df = q_d->getEdge ((nd_de + 2) MODULO QUAD4); + Edge* e_be = q_e->getEdge ((ne_ae + 2) MODULO QUAD4); + + Vertex* v_bcf = e_cf->opposedVertex (e_cf->commonVertex (e_af)); + Vertex* v_bdf = e_df->opposedVertex (e_df->commonVertex (e_af)); + + Edge* e_bf = new Edge (v_bcf, v_bdf); + Quad* q_b = new Quad (e_be, e_bc, e_bf, e_bd); + Quad* q_f = new Quad (e_af, e_cf, e_bf, e_df); + + Hexa* hexa = new Hexa (q_a, q_b, q_c, q_d, q_e, q_f); + return hexa; +} +// ======================================================== revolutionQuads +Elements* Document::revolutionQuads (Quads& start, Vertex* center, Vector* axis, + RealVector &angles) +{ + if (center==NULL) return NULL; + if (axis ==NULL) return NULL; + if (angles.size()==0) return NULL; + if (start .size()==0) return NULL; + + Elements* prisme = new Elements (this); + prisme->revolutionQuads (start, center, axis, angles); + return prisme; +} +// ======================================================== makeCylindricals +Elements* Document::makeCylindricals (Vertex* c, Vector* b, Vector* h, + RealVector& tdr, RealVector& tda, RealVector& tdl, bool fill) +{ + Elements* grille = new Elements (this); + grille->makeCylindricalGrid (c, b, h, tdr, tda, tdl, fill); + return grille; +} +// ========================================================= replace +Elements* Document::replace (Quads& pattern, Vertex* p1, Vertex* c1, + Vertex* p2, Vertex* c2, Vertex* p3, Vertex* c3) +{ + Elements* t_hexas = new Elements (this); + int ier = t_hexas->replaceHexas (pattern, p1, c1, p2, c2, p3, c3); + if (ier!=HOK) + { + cout << " **** Error in Document::replace\n" << endl; + t_hexas->setError (ier); + } + return t_hexas; +} +// ========================================================= print_replace +void print_replace (Edge* zig, Edge* zag) +{ + cout << zig->getName() << " = (" << zig->getVertex(0)->getName() + << ", " << zig->getVertex(1)->getName() << ") est clone en "; + + cout << zag->getName() << " = (" << zag->getVertex(0)->getName() + << ", " << zag->getVertex(1)->getName() << ")" << endl; +} +// ========================================================= only_in_hexas +bool only_in_hexas (Hexas& thexas, Quad* quad) +{ + int nbhexas = thexas.size(); + int nbp = quad->getNbrParents(); + for (int nh=0 ; nh getParent (nh); + for (int nc=0 ; pasla && nc < nbhexas ; nc++) + pasla = hexa != thexas [nc]; + if (pasla) + return false; + } + return true; +} +// ========================================================= only_in_hexas +bool only_in_hexas (Hexas& thexas, Edge* edge) +{ + int nbp = edge->getNbrParents(); + for (int nq=0 ; nq getParent (nq); + if (NOT only_in_hexas (thexas, quad)) + { + cout << " ... inMoreHexas " << edge->getName() << endl; + return false; + } + } + cout << " ... only_in_hexas " << edge->getName() << endl; + return true; +} +// ========================================================= only_in_hexas +void replace_vertex (Hexas& thexas, Vertex* node, Vertex* par) +{ + int nbh = thexas.size(); + for (int nh=0 ; nh replaceVertex (node, par); +} +// ========================================================= disconnectEdges +Elements* Document::disconnectEdges (Hexas& thexas, Edges& tedges) +{ + int nbedges = tedges.size(); + int nbhexas = thexas.size(); + + if (db) + cout << " +++ Disconnect Edges" << endl; + + if (nbhexas != nbedges) + { + cout << " **** Error in Document::disconnectEdges\n" << endl; + cout << " **** Number of Edges and number of Hexas are different\n" + << endl; + return NULL; + } + else if (nbhexas==1) + { + Elements* grille = disconnectEdge (thexas[0], tedges[0]); + return grille; + } + + for (int nro=0 ; nrogetVertex(0)->getName () + << ", " << tedges[nro]->getVertex(1)->getName () + << ")" << endl; + } + + for (int nro=0 ; nrofindEdge (tedges[nro]); + if (ned==NOTHING) + { + cout << " **** Edge number " << nro+1 + << " doesnt belong to correspondant hexa" << endl; + return NULL; + } + } + + vector tvertex (nbedges+1); + + for (int nro=1 ; nrocommonVertex (tedges[nro-1]); + if (tvertex[nro]==NULL) + { + cout << " **** Edge number " << nro + << " doesnt intesect next edge" << endl; + return NULL; + } + } + + int nv0 = tedges[0] ->inter (tedges[1]); + int nvn = tedges[nbedges-1]->inter (tedges[nbedges-2]); + tvertex [0] = tedges[0] ->getVertex (1-nv0); + tvertex [nbedges] = tedges[nbedges-1]->getVertex (1-nvn); + + for (int nro=0 ; nrofindEdge (tedges[nro]); + if (ned==NOTHING) + { + cout << " **** Edge number " << nro+1 + << " doesnt belong to correspondant hexa" << endl; + return NULL; + } + } + // Fin des controles, on peut y aller ... + + map state_edge; + map state_quad; + enum { UNDEFINED, REPLACED, AS_IS }; + + map new_vertex; + map new_edge; + map new_quad; + + map :: iterator it_vertex; + map :: iterator it_edge; + map :: iterator it_quad; + +#define VertexIsNew(v) (it_vertex=new_vertex.find(v))!=new_vertex.end() + + Elements* nouveaux = new Elements (this); + Vertex* node1 = NULL; + + for (int nro=0 ; nro<=nbedges ; nro++) + { + Vertex* node0 = node1; + node1 = new Vertex (tvertex[nro]); + nouveaux->addVertex (node1); + new_vertex [tvertex[nro]] = node1; + if (db) + { + cout << nro << " : " << tvertex[nro]->getName() + << " est clone en " << node1->getName() << endl; + } + + if (nro>0) + { + Edge* edge = new Edge (node0, node1); + nouveaux->addEdge (edge); + new_edge [tedges[nro-1]] = edge; + state_edge [tedges[nro-1]] = REPLACED; + if (db) + print_replace (tedges[nro-1], edge); + } + } + + if (db) + cout << "_____________________________ Autres substitutions" << endl; + + // Un edge non remplace, qui contient un vertex remplace + // commun a plus de 2 faces (donc appartenant a un autre hexa) + // doit etre duplique + + for (int nro=0 ; nrogetEdge (nro); + if (state_edge[edge]==UNDEFINED) + { + Vertex* v1 = edge->getVertex (V_AMONT); + Vertex* v2 = edge->getVertex (V_AVAL); + int etat = REPLACED; + if (VertexIsNew (v1)) + { + if (only_in_hexas (thexas, edge)) + { + replace_vertex (thexas, v1, new_vertex[v1]); + etat = AS_IS; + } + else + v1 = new_vertex [v1]; + } + else if (VertexIsNew (v2)) + { + if (only_in_hexas (thexas, edge)) + { + replace_vertex (thexas, v2, new_vertex[v2]); + etat = AS_IS; + } + else + v2 = new_vertex [v2]; + } + else + etat = AS_IS; + + if (etat==REPLACED) + { + Edge* arete = new Edge (v1, v2); + new_edge [edge] = arete; + nouveaux->addEdge (arete); + if (db) + print_replace (edge, arete); + } + state_edge [edge] = etat; + } + } + } + + // Un quad non remplace, qui contient un edge remplace + // commun a plus de 2 Hexas + // doit etre duplique + + for (int nro=0 ; nrogetQuad (nro); + if (state_quad[quad]==UNDEFINED) + { + Edge* ted [QUAD4]; + int etat = AS_IS; + for (int ned=0 ; ned < QUAD4 ; ned++) + { + Edge* edge = quad->getEdge (ned); + if (state_edge [edge]==AS_IS) + ted[ned] = edge; + else + { + ted[ned] = new_edge[edge]; + etat = REPLACED; + } + } + if (etat==REPLACED) + { + Quad* face = new Quad (ted[0], ted[1], ted[2], ted[3]); + new_quad [quad] = face; + nouveaux->addQuad (face); + } + state_quad [quad] = etat; + } + } + } + + for (int nro=0 ; nrofirst; + Quad* face = it_quad->second; + hexa->replaceQuad (pile, face); + } + + for (it_edge=new_edge.begin(); it_edge != new_edge.end() ; ++it_edge) + { + Edge* zig = it_edge->first; + Edge* zag = it_edge->second; + hexa->replaceEdge (zig, zag); + } + + for (it_vertex=new_vertex.begin(); + it_vertex != new_vertex.end() ; ++it_vertex) + { + Vertex* flip = it_vertex->first; + Vertex* flop = it_vertex->second; + hexa->replaceVertex (flip, flop); + } + } + + Real3 center0, center1; + Matrix matrix; + Hexa* hexa0 = NULL; + Hexa* hexa1 = NULL; + for (int nro=0 ; nro<=nbhexas ; nro++) + { + hexa0 = hexa1; + if (nro==0) + { + hexa1 = thexas [nro]; + hexa1->getCenter (center1); + } + else if (nro==nbhexas) + { + hexa1->getCenter (center1); + } + else + { + hexa1 = thexas [nro]; + hexa0->getCenter (center0); + hexa1->getCenter (center1); + for (int nc=0 ; ncgetVertex (nro); + matrix.defScale (center1, 0.55); + matrix.perform (node); + } + + return nouveaux; +} +// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +// ========================================================= prod_vectoriel +double* prod_vectoriel (Edge* e1, Edge* e2, double prod[]) +{ + prod [dir_x] = prod [dir_y] = prod [dir_z] = 0; + if (e1==NULL || e2==NULL) + return prod; + + Real3 v1, v2; + e1->getVector (v1); + e2->getVector (v2); + + prod [dir_x] = v1[dir_y] * v2[dir_z] - v2[dir_y] * v1[dir_z]; + prod [dir_y] = v1[dir_z] * v2[dir_x] - v2[dir_z] * v1[dir_x]; + prod [dir_z] = v1[dir_x] * v2[dir_y] - v2[dir_x] * v1[dir_y]; + + return prod; +} +// ========================================================= permuter_edges +void permuter_edges (Edge* &e1, Edge* &e2, cpchar nm1, cpchar nm2) +{ + if (db && nm1!=NULL) + { + printf (" ... permuter_edges %s = %s et %s = %s\n", + nm1, e1->getName(), nm2, e2->getName() ); + } + + Edge* foo = e1; + e1 = e2; + e2 = foo; +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexDocument_trans.cxx b/src/HEXABLOCK/HexDocument_trans.cxx new file mode 100755 index 0000000..f63b5f1 --- /dev/null +++ b/src/HEXABLOCK/HexDocument_trans.cxx @@ -0,0 +1,257 @@ + +// C++ : La clase principale de Hexa + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "HexDocument.hxx" + +#include "HexEltBase.hxx" +#include "HexVertex.hxx" +#include "HexEdge.hxx" +#include "HexQuad.hxx" +#include "HexHexa.hxx" + +#include "HexElements.hxx" +#include "HexCrossElements.hxx" + +#include "HexVector.hxx" +#include "HexCylinder.hxx" +#include "HexPipe.hxx" +#include "HexMatrix.hxx" +#include "HexCloner.hxx" +#include "HexPropagation.hxx" +#include "HexLaw.hxx" + +#include "HexXmlWriter.hxx" +#include "HexXmlTree.hxx" +#include "HexGlobale.hxx" + +BEGIN_NAMESPACE_HEXA +// ========================================================= performTranslation +int Document::performTranslation (Elements* elts, Vector* trans) +{ + Matrix matrice; + matrice.defTranslation (trans); + + int ier = elts->transform (&matrice); + return ier; +} +// ==================================================== performScale +int Document::performScale (Elements* elts, Vertex* ver, double k) +{ + Matrix matrice; + matrice.defScale (ver, k); + + int ier = elts->transform (&matrice); + return ier; +} +// ==================================================== performRotation +int Document::performRotation (Elements* elts, Vertex* ver, Vector* vec, double angle) +{ + Matrix matrice; + matrice.defRotation (ver, vec, angle); + + int ier = elts->transform (&matrice); + return ier; +} +// ==================================================== performSymmetryPoint +int Document::performSymmetryPoint (Elements* elts, Vertex* ver) +{ + Matrix matrice; + matrice.defSymmetryPoint (ver); + + int ier = elts->transform (&matrice); + return ier; +} +// ==================================================== performSymmetryPlane +int Document::performSymmetryPlane (Elements* elts, Vertex* ver, Vector* vec) +{ + Matrix matrice; + matrice.defSymmetryPlane (ver, vec); + + int ier = elts->transform (&matrice); + return ier; +} +// ==================================================== performSymmetryLine +int Document::performSymmetryLine (Elements* elts, Vertex* ver, Vector* vec) +{ + Matrix matrice; + matrice.defSymmetryLine (ver, vec); + + int ier = elts->transform (&matrice); + return ier; +} +// -------------------------------------------------------- +// -------------------------------------------------------- +// -------------------------------------------------------- +// ========================================================= clonerElements +Elements* Document::clonerElements (Elements* table, Matrix* matrice) +{ + Cloner copieur (matrice); + Elements* grille = copieur.clonerElements (table); + return grille; +} +// -------------------------------------------------------- +// -------------------------------------------------------- +// -------------------------------------------------------- +// ========================================================= makeTranslation +Elements* Document::makeTranslation (Elements* table, Vector* trans) +{ + Matrix matrice; + matrice.defTranslation (trans); + + Elements* grille = clonerElements (table, &matrice); + return grille; +} +// ========================================================= makeScale +Elements* Document::makeScale (Elements* table, Vertex* ver, double k) +{ + Matrix matrice; + matrice.defScale (ver, k); + + Elements* grille = clonerElements (table, &matrice); + return grille; +} +// ========================================================= makeRotation +Elements* Document::makeRotation (Elements* table, Vertex* ver, Vector* vec, + double angle) +{ + Matrix matrice; + matrice.defRotation (ver, vec, angle); + + Elements* grille = clonerElements (table, &matrice); + return grille; +} +// ========================================================= makeSymmetryPoint +Elements* Document::makeSymmetryPoint (Elements* table, Vertex* ver) +{ + Matrix matrice; + matrice.defSymmetryPoint (ver); + + Elements* grille = clonerElements (table, &matrice); + return grille; +} +// ========================================================= makeSymmetryLine +Elements* Document::makeSymmetryLine (Elements* table, Vertex* ver, Vector* vec) +{ + Matrix matrice; + matrice.defSymmetryLine (ver, vec); + + Elements* grille = clonerElements (table, &matrice); + return grille; +} +// ========================================================= makeSymmetryPlane +Elements* Document::makeSymmetryPlane (Elements* table, Vertex* ver, Vector* vec) +{ + Matrix matrice; + matrice.defSymmetryPlane (ver, vec); + + Elements* grille = clonerElements (table, &matrice); + return grille; +} +// ---------------------------------------------------------------------- +// ------------ Destroy +// ---------------------------------------------------------------------- +// ========================================================= removeHexa +int Document::removeHexa (Hexa* cell) +{ + if (cell==NULL) + return HERR; + + cell->remove (); + return HOK; +} +// ========================================================= removeQuad +int Document::removeQuad (Quad* cell) +{ + if (cell==NULL) + return HERR; + + cell->remove (); + return HOK; +} +// ========================================================= removeElements +int Document::removeElements (Elements* bloc) +{ + if (bloc==NULL) + return HERR; + + bloc->remove (); + return HOK; +} +// ====================================================== removeConnectedHexa +int Document::removeConnectedHexa (Hexa* cell) +{ + if (cell==NULL) + return HERR; + + update (); + cell->removeConnected (); + return HOK; +} +// ========================================================= dumpPropagation +void Document::dumpPropagation () +{ + int nb = countPropagation (); + + for (int nro=0 ; nrogetEdges (); + printf (" ____________________________________ Prop nro %d\n", nro); + for (int ned=0 ; ned<(int)table.size() ; ned++) + { + bool way = table [ned]->getWay (); + + table [ned]->printName (" = "); + if (way) + { + printf (" +("); + table [ned]->getVertex (0)->printName (", "); + table [ned]->getVertex (1)->printName (")\n"); + } + else + { + printf (" -("); + table [ned]->getVertex (1)->printName (", "); + table [ned]->getVertex (0)->printName (")\n"); + } + } + } +} +// ---------------------------------------------------------------------- +// ------------ reorderFaces +// ---------------------------------------------------------------------- +// ========================================================= reorderFaces +// ==== Ordonner les faces externes +void Document::reorderFaces () +{ + majReferences (); + Real3 cg, orig, pi, pj, vi, vj, vk; + + for (EltBase* elt = doc_first_elt[EL_QUAD]->next (); elt!=NULL; + elt = elt->next()) + { + Quad* quad = static_cast (elt); + if (quad!=NULL && quad->isHere()) + quad->setOrientation (); + } + +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexEdge.cxx b/src/HEXABLOCK/HexEdge.cxx new file mode 100755 index 0000000..896b0b2 --- /dev/null +++ b/src/HEXABLOCK/HexEdge.cxx @@ -0,0 +1,229 @@ + +// C++ : Gestion des aretes + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "HexEdge.hxx" +#include "HexVertex.hxx" +#include "HexQuad.hxx" + +#include "HexPropagation.hxx" +#include "HexXmlWriter.hxx" +#include "HexShape.hxx" + +static int niveau = 0; + +BEGIN_NAMESPACE_HEXA + +void geom_dump_asso (Edge* edge); + +// ======================================================== Constructeur +Edge::Edge (Vertex* va, Vertex* vb) + : EltBase (va->dad(), EL_EDGE) +{ + e_vertex [V_AMONT] = va; + e_vertex [V_AVAL ] = vb; + + e_propag = NOTHING; + e_way = true; + e_law = NULL; + e_clone = NULL; + + majReferences (); +} +// ======================================================== Constructeur 2 +Edge::Edge (Edge* other) + : EltBase (other->dad(), EL_EDGE) +{ + e_vertex [V_AMONT] = e_vertex [V_AVAL ] = NULL; + + e_propag = NOTHING; + e_way = true; + e_law = NULL; + e_clone = NULL; +} +// ======================================================== majReferences +void Edge::majReferences () +{ + e_vertex [V_AMONT]->addParent (this); + e_vertex [V_AVAL ]->addParent (this); +} +// ======================================================== anaMerge +int Edge::anaMerge (Vertex* orig, Vertex* tv1[]) +{ + tv1 [0] = orig; + + if (orig == e_vertex [V_AMONT]) + tv1 [1] = e_vertex[V_AVAL]; + else if (orig == e_vertex [V_AVAL]) + tv1 [1] = e_vertex[V_AMONT]; + else + return HERR; + + return HOK; +} +// ========================================================= propager +void Edge::propager (Propagation* prop, int groupe, int sens) +{ + setPropag (groupe, sens>0); + prop->addEdge (this); + + niveau ++; + int nbquads = getNbrParents (); + for (int nq=0 ; nqhasParents()) + { + if (debug (6)) + { + printf ("Prop : niv=%d edge=", niveau); + printName (); + printf ("parent=%d quad=", nq); + quad->printName ("\n"); + fflush(stdout); + } + + int meme = 1; + Edge* arete = quad->getOpposEdge (this, meme); + if (arete != NULL && arete->getPropag () < 0) + arete->propager (prop, groupe, meme*sens); + } + } + niveau --; +} +// ========================================================= getParent +Quad* Edge::getParent (int nro) +{ + return static_cast (getFather (nro)); +} +// ========================================================= saveXml +void Edge::saveXml (XmlWriter* xml) +{ + char buffer[12]; + string vertices = e_vertex [V_AMONT]->getName(buffer); + vertices += " "; + vertices += e_vertex [V_AVAL ]->getName(buffer); + + xml->openMark ("Edge"); + xml->addAttribute ("id", getName (buffer)); + xml->addAttribute ("vertices", vertices); + if (el_name!=buffer) + xml->addAttribute ("name", el_name); + xml->closeMark (); + + int nbass = tab_assoc.size(); + for (int nro=0 ; nrosaveXml (xml); +} +// ======================================================== replaceVertex +void Edge::replaceVertex (Vertex* old, Vertex* par) +{ + for (int nro=0 ; nroprintName (" est remplace par "); + par->printName ("\n"); + } + } + } +} +// ======================================================== dump +void Edge::dump () +{ + printName(" = ("); + if (NOT isHere ()) + { + printf ("*** deleted ***)\n"); + return; + } + + e_vertex[V_AMONT]->printName(", "); + e_vertex[V_AVAL] ->printName(")"); + if (e_propag>=0) + { + char signe = e_way ? '+' : '-'; + printf (", Prop= %c%d", signe, e_propag); + } + + dumpRef (); +} +// ======================================================== dumpAsso +void Edge::dumpAsso () +{ + if (NOT isHere ()) + { + printName(" = *** deleted **\n"); + return; + } + + geom_dump_asso (this); +} +// ======================================================== dumpPlus +void Edge::dumpPlus () +{ + dump (); + for (int nro=0 ; nro < V_TWO ; nro++) + { + Vertex* pv = e_vertex[nro]; + printf ( " "); + if (pv!=NULL) + { + pv->printName (); + printf (" (%g, %g, %g)\n", pv->getX(), pv->getY(), pv->getZ()); + } + else + { + printf (" NULL\n"); + } + } +} +// ========================================================== addAssociation +int Edge::addAssociation (Shape* forme) +{ + if (forme == NULL) + { + if (el_root->debug ()) + cout << " Edge " << el_name << " addAssociation of NULL ignored" + << endl; + return HERR; + } + + tab_assoc.push_back (forme); + if (el_root->debug (2)) + cout << " Edge " << el_name << " addAssociation" << endl; + + return HOK; +} +// ========================================================== setAssociation +void Edge::setAssociation (Shape* forme) +{ + clearAssociation (); + addAssociation (forme); +} +END_NAMESPACE_HEXA + diff --git a/src/HEXABLOCK/HexEdge.hxx b/src/HEXABLOCK/HexEdge.hxx new file mode 100755 index 0000000..5fdfe91 --- /dev/null +++ b/src/HEXABLOCK/HexEdge.hxx @@ -0,0 +1,195 @@ + +// class : Gestion des aretes + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __EDGE_H +#define __EDGE_H + +#include "HexVertex.hxx" + +BEGIN_NAMESPACE_HEXA + +class Edge : public EltBase +{ +public: + virtual int countVertex () { return V_TWO; } + virtual Vertex* getVertex (int nro); + bool getWay () { return e_way ; } + +public: + virtual void saveXml (XmlWriter* xml); + virtual void replaceVertex (Vertex* old, Vertex* nouveau); + virtual void clearAssociation () { tab_assoc.clear() ; } + virtual void setAssociation (Shape* forme); + int addAssociation (Shape* forme); + + Edge (Vertex* va, Vertex* vb); + Edge (Edge* other); + int anaMerge (Vertex* orig, Vertex* couple[]); + bool definedBy (Vertex* v1, Vertex* v2); + + void propager (Propagation* prop, int nro, int sens=1); + + void setPropag (int nro, bool sens) { e_propag = nro; e_way=sens; } + int getPropag () { return e_propag ; } + + Quad* getParent (int nro); + virtual void dump (); + void dumpPlus (); + void dumpAsso (); + + virtual void majReferences(); + + int inter (Edge* other, int& nother); + int inter (Edge* other); + int index (Vertex* node); + Vertex* commonVertex (Edge* other); + Vertex* opposedVertex (Vertex* sommet); + double* commonPoint (Edge* other, double point[]); + + Vertex* getAmont () { return e_vertex [NOT e_way] ; } + Vertex* getAval () { return e_vertex [e_way] ; } + + Law* getLaw () { return e_law ; } + void setLaw (Law* law) { e_law = law ; } + + void setScalar (double valeur); + void setColor (double valeur) { setScalar (valeur) ; } + + const Shapes & getAssociations () { return tab_assoc ; } + + virtual void duplicate (); + Edge* getClone () { return e_clone ; } + double* getVector (double vecteur[]); + +private: + friend class Cloner; + Vertex* e_vertex [V_TWO]; + Edge* e_clone; + int e_propag; + bool e_way; // Sens de propagation + Law* e_law; // Le soleil brille, brille, brille + + Shapes tab_assoc; +}; + +// ----------------------------------------------- Inlining +// =============================================================== getVertex +inline Vertex* Edge::getVertex(int nro) +{ + Vertex* elt = NULL; + if (nro >=0 && nro < V_TWO && el_status == HOK + && e_vertex [nro]->isValid()) + elt = e_vertex [nro]; + + return elt; +} +// =============================================================== index +inline int Edge::index (Vertex* node) +{ + return node == NULL ? NOTHING + : node == e_vertex[V_AMONT] ? V_AMONT + : node == e_vertex[V_AVAL ] ? V_AVAL : NOTHING; +} +// ============================================================= opposedVertex +inline Vertex* Edge::opposedVertex (Vertex* sommet) +{ + int nro = index (sommet); + return nro<0 ? NULL : e_vertex[1-nro]; +} +// ============================================================= commonVertex +inline Vertex* Edge::commonVertex (Edge* other) +{ + int nro = inter (other); + return nro<0 ? NULL : e_vertex[nro]; +} +// ============================================================= commonPoint +inline double* Edge::commonPoint (Edge* other, double point[]) +{ + Vertex* commun = commonVertex (other); + if (commun==NULL) + { + point[dir_x] = point[dir_y] = point[dir_z] = 0; + return NULL; + } + + commun->getPoint (point); + return point; +} +// =============================================================== inter +inline int Edge::inter (Edge* other) +{ + int nro; + return inter (other, nro); +} +// =============================================================== inter +inline int Edge::inter (Edge* other, int& nother) +{ + for (int ni=0 ; nie_vertex[nj]) + { + nother = nj; + return ni; + } + + nother = NOTHING; + return NOTHING; +} +// =============================================================== definedBy +inline bool Edge::definedBy (Vertex* v1, Vertex* v2) +{ + bool rep = (v1 == e_vertex[V_AMONT] && v2 == e_vertex[V_AVAL ]) + || (v1 == e_vertex[V_AVAL ] && v2 == e_vertex[V_AMONT]); + return rep; +} +// =============================================================== setScalar +inline void Edge::setScalar (double val) +{ + e_vertex [V_AMONT]->setScalar (val); + e_vertex [V_AVAL ]->setScalar (val); +} +// =============================================================== duplicate +inline void Edge::duplicate () +{ + e_clone = new Edge (GetClone (e_vertex [V_AMONT]), + GetClone (e_vertex [V_AVAL ])); + + e_clone->tab_assoc = tab_assoc; +} +// =============================================================== getVector +inline double* Edge::getVector (double vecteur[]) +{ + + if (e_vertex[V_AMONT]==NULL || e_vertex[V_AVAL]==NULL) + { + vecteur [dir_x] = vecteur [dir_y] = vecteur [dir_z] = 0; + return NULL; + } + + vecteur[dir_x] = e_vertex[V_AVAL]->getX() - e_vertex[V_AMONT]->getX(); + vecteur[dir_y] = e_vertex[V_AVAL]->getY() - e_vertex[V_AMONT]->getY(); + vecteur[dir_z] = e_vertex[V_AVAL]->getZ() - e_vertex[V_AMONT]->getZ(); + + return vecteur; +} +END_NAMESPACE_HEXA +#endif + diff --git a/src/HEXABLOCK/HexElements.cxx b/src/HEXABLOCK/HexElements.cxx new file mode 100755 index 0000000..9f8a682 --- /dev/null +++ b/src/HEXABLOCK/HexElements.cxx @@ -0,0 +1,1057 @@ + +// C++ : Grilles + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexElements.hxx" +#include "HexDocument.hxx" +#include "HexVector.hxx" +#include "HexVertex.hxx" +#include "HexHexa.hxx" +#include "HexEdge.hxx" +#include "HexGlobale.hxx" + +#include +#include + +static bool db=false; + +BEGIN_NAMESPACE_HEXA + +// ====================================================== Constructeur +Elements::Elements (Document* doc) : EltBase (doc) +{ + glob = Globale::getInstance (); + + grid_type = GR_NONE; + size_qx = size_ex = size_vx = size_hx = 0; + size_qy = size_ey = size_vy = size_hy = 0; + size_qz = size_ez = size_vz = size_hz = 0; + size_qvplus = size_qhplus = size_ehplus = size_evplus = size_hplus = 0; + + nbr_hexas = nbr_quads = nbr_edges = nbr_vertex = 0; + ker_vertex = 0; + cyl_closed = false; + cyl_fill = false; + grid_nocart = true; + cyl_dispo = CYL_NOFILL; + revo_lution = false; + prism_vec = false; +} +// ====================================================== Constructeur +Elements::Elements (Document* doc, int nx, int ny, int nz) : EltBase (doc) +{ + glob = Globale::getInstance (); + + grid_type = GR_NONE; + size_qx = size_ex = size_vx = size_hx = 0; + size_qy = size_ey = size_vy = size_hy = 0; + size_qz = size_ez = size_vz = size_hz = 0; + size_qvplus = size_qhplus = size_ehplus = size_evplus = size_hplus = 0; + + nbr_hexas = nbr_quads = nbr_edges = nbr_vertex = 0; + cyl_closed = true; + cyl_fill = false; + cyl_dispo = CYL_NOFILL; + + resize (GR_CYLINDRIC, nx, ny, nz); + cyl_closed = true; +} +// ====================================================== Constructeur (clonage) +Elements::Elements (Elements* orig) : EltBase (orig->el_root) +{ + glob = Globale::getInstance (); + + grid_type = orig->grid_type; + cyl_closed = orig->cyl_closed; + cyl_fill = orig->cyl_fill; + cyl_dispo = orig->cyl_dispo; + + size_qx = size_ex = size_vx = size_hx = 0; + size_qy = size_ey = size_vy = size_hy = 0; + size_qz = size_ez = size_vz = size_hz = 0; + size_qvplus = size_qhplus = size_ehplus = size_evplus = size_hplus = 0; + nbr_hexas = nbr_quads = nbr_edges = nbr_vertex = 0; + + resize (orig->grid_type, orig->size_hx, orig->size_hy, orig->size_hz); + cyl_closed = orig->cyl_closed; +} +// ====================================================== resize +void Elements::resize (EnumGrid type, int nx, int ny, int nz, int nplus) +{ + grid_type = type; + grid_nocart = true; + + switch (grid_type) + { + case GR_CARTESIAN : + case GR_CYLINDRIC : + default : + grid_nocart = false; + size_hx = std::max (nx, 1); + size_hy = std::max (ny, 1); + size_hz = std::max (nz, 1); + + size_qx = size_ex = size_vx = size_hx + 1; + size_qy = size_ey = size_vy = size_hy + 1; + size_qz = size_ez = size_vz = size_hz + 1; + + nbr_hexas = size_hx * size_hy * size_hz; + nbr_quads = size_qx * size_qy * size_qz * DIM3; + nbr_edges = size_ex * size_ey * size_ez * DIM3; + nbr_vertex = size_vx * size_vy * size_vz; + break; + + case GR_SPHERIC : + size_qx = size_ex = size_vx = size_hx = 0; + size_qy = size_ey = size_vy = size_hy = 0; + size_qz = size_ez = size_vz = size_hz = 0; + nbr_quads = nbr_edges = nbr_vertex = 0; + gr_rayon = std::max (nx, 1); + + nbr_hexas = 1 + gr_rayon*HQ_MAXI; + tab_hexa.clear (); + ker_vertex = nbr_vertex; + return; + + case GR_JOINT : + nbr_orig = std::max (nx, 1); + gr_hauteur = std::max (ny, 1); + size_hx = nbr_orig; + size_hy = 1; + size_hz = gr_hauteur; + + nbr_hexas = nbr_orig * gr_hauteur; + nbr_vertex = nbr_hexas * QUAD4; + nbr_vertex = nbr_orig * (gr_hauteur+1)*QUAD4; + nbr_quads = nbr_vertex; + nbr_edges = 2*nbr_vertex; + break; + + case GR_REPLACE : + nbr_orig = std::max (nx, 1); // nb quads du pattern + gr_hauteur = ny + 1; // Hauteur des hexas + pat_nbvertex = std::max (nz, 1); // nb vertex du pattern + pat_nbedges = std::max (nplus, 1); // nb edges du pattern + size_hx = nbr_orig; + size_hy = 1; + size_hz = gr_hauteur; + + nbr_hexas = nbr_orig * gr_hauteur; + nbr_vertex = pat_nbvertex * (gr_hauteur+1); + nbr_edges = pat_nbedges * (gr_hauteur+1) + pat_nbvertex*gr_hauteur; + nbr_quads = nbr_orig * (gr_hauteur+1) + pat_nbedges *gr_hauteur; + break; + + case GR_BICYL : + cyl_closed = true; + size_hx = 1; + size_hy = 8; + size_hz = 4; + + size_qx = size_ex = size_vx = size_hx + 1; + size_qy = size_ey = size_vy = size_hy + 1; + size_qz = size_ez = size_vz = size_hz + 1; + + nbr_hexas = size_hx * size_hy * size_hz; + nbr_quads = size_qx * size_qy * size_qz * DIM3; + nbr_edges = size_ex * size_ey * size_ez * DIM3; + nbr_vertex = size_vx * size_vy * size_vz; + break; + } + + tab_hexa .resize (nbr_hexas); + tab_quad .resize (nbr_quads); + tab_edge .resize (nbr_edges); + tab_vertex.resize (nbr_vertex); + + ker_vertex = nbr_vertex; + + for (int nc=0 ; nc< nbr_hexas ; nc++) tab_hexa [nc] = NULL; + for (int nc=0 ; nc< nbr_quads ; nc++) tab_quad [nc] = NULL; + for (int nc=0 ; nc< nbr_edges ; nc++) tab_edge [nc] = NULL; + for (int nc=0 ; nc< nbr_vertex ; nc++) tab_vertex [nc] = NULL; +} + +// ====================================================== makeCartesianGrid +int Elements::makeCartesianGrid (Vertex* orig, Vector* v1, Vector* v2, + Vector* v3, int px, int py, int pz, int mx, int my, int mz) +{ + resize (GR_CARTESIAN, px+mx, py+my, pz+mz); + + makeCartesianNodes (orig, v1, v2, v3, px, py, pz, mx, my, mz); + + fillGrid (); + return HOK; +} +// ====================================================== makeCylindricalGrid +int Elements::makeCylindricalGrid (Vertex* c, Vector* b, Vector* h, + double dr, double da, double dl, int nr, int na, int nl, bool fill) +{ + resize (GR_CYLINDRIC, nr, na, nl); + cyl_closed = da >= 360.0; + makeCylindricalNodes (c, b, h, dr, da, dl, nr, na, nl, fill); + fillGrid (); + assoCylinder (c, h, da); + return HOK; +} +// ====================================================== makeSphericalGrid +int Elements::makeSphericalGrid (Vertex* c, Vector* dv, int nb, double k) +{ + resize (GR_SPHERIC, nb); + + if (nb<0) + return HERR; + else if (dv->getDx()<=ZEROR || dv->getDy()<=ZEROR || dv->getDz()<=ZEROR) + return HERR; + + Vertex* i_node [HV_MAXI]; // Les noeuds de l'hexa englobant + Edge* i_edge [HE_MAXI]; // Les noeuds de l'hexa englobant + Quad* i_quad [HQ_MAXI]; // Les noeuds de l'hexa englobant + + for (int nro=0 ; nroCoordVertex (nro, dir_x) * dv->getDx(); + double dy = glob->CoordVertex (nro, dir_y) * dv->getDy(); + double dz = glob->CoordVertex (nro, dir_z) * dv->getDz(); + + i_node [nro] = el_root->addVertex (c->getX ()+dx, c->getY ()+dy, + c->getZ ()+dz); + } + + for (int nro=0 ; nroEdgeVertex (nro, V_AMONT); + int v2 = glob->EdgeVertex (nro, V_AVAL); + i_edge[nro] = newEdge (i_node[v1], i_node[v2]); + + if (db) + { + char nm0[8], nm1 [8], nm2 [8]; + printf (" %2d : %s = %s = [%s, %s] = [%d,%d] = [%s,%s]\n", nro, + glob->namofHexaEdge(nro), i_edge[nro]->getName(nm0), + glob->namofHexaVertex(v1), glob->namofHexaVertex(v2), v1, v2, + i_node[v1]->getName(nm1), i_node[v2]->getName(nm2)); + } + } + + for (int nro=0 ; nroQuadEdge (nro, E_A)], + i_edge[glob->QuadEdge (nro, E_B)], + i_edge[glob->QuadEdge (nro, E_C)], + i_edge[glob->QuadEdge (nro, E_D)]); + + tab_hexa.push_back (newHexa (i_quad[Q_A], i_quad[Q_B], i_quad[Q_C], + i_quad[Q_D], i_quad[Q_E], i_quad[Q_F])); + double lambda = 1; + double dcell = 1; + for (int niv=0; nivgetX (); + double py0 = center->getY (); + double pz0 = center->getZ (); + e_node[nv] = el_root->addVertex (px0+lambda*(i_node[nv]->getX()-px0), + py0+lambda*(i_node[nv]->getY()-py0), + pz0+lambda*(i_node[nv]->getZ()-pz0)); + + d_edge[nv] = newEdge (i_node[nv], e_node[nv]); + } + // Les aretes exterieures + // + les faces diagonales + for (int nro=0 ; nroEdgeVertex (nro, V_AMONT); + int nv1 = glob->EdgeVertex (nro, V_AVAL ); + e_edge[nro] = newEdge (e_node [nv0], e_node [nv1]); + d_quad[nro] = newQuad (i_edge [nro], d_edge [nv0], + e_edge [nro], d_edge [nv1]); + } + // Les faces exterieures + // + les hexas + Hexa* strate = NULL; + for (int nro=0 ; nroQuadEdge (nro, E_A); + int ne1 = glob->QuadEdge (nro, E_B); + int ne2 = glob->QuadEdge (nro, E_C); + int ne3 = glob->QuadEdge (nro, E_D); + + e_quad[nro] = newQuad (e_edge[ne0], e_edge[ne1], + e_edge[ne2], e_edge[ne3]); + strate = newHexa (i_quad[nro], e_quad[nro], d_quad[ne0], + d_quad[ne2], d_quad[ne1], d_quad[ne3]); + tab_hexa.push_back (strate); + } + + for (int nv=0 ; nvisHere()) + cell->razNodes (); + } + + int nbnodes = 0; + int nbcells = 0; + // -- 2) Comptage + for (int nro=0 ; nroisHere()) + { + nbcells ++; + nbnodes += cell->countNodes (); + } + } + + pfile vtk = fopen (nomfic, "w"); + fprintf (vtk, "# vtk DataFile Version 3.1\n"); + fprintf (vtk, "%s \n", nomfic); + fprintf (vtk, "ASCII\n"); + fprintf (vtk, "DATASET UNSTRUCTURED_GRID\n"); + fprintf (vtk, "POINTS %d float\n", nbnodes); + + // -- 2) Les noeuds + int nronode = 0; + for (int nro=0 ; nroisHere()) + cell->printNodes (vtk, nronode); + } + // -- 2) Les hexas + + fprintf (vtk, "CELLS %d %d\n", nbcells, nbcells*(HV_MAXI+1)); + + for (int nro=0 ; nroisHere()) + cell->printHexa (vtk); + } + + fprintf (vtk, "CELL_TYPES %d\n", nbcells); + for (int nro=0 ; nromarkAll (IS_NONE); + db = on_debug(); + // db = el_root->debug (); + + gr_hauteur = nb; + nbr_orig = orig.size(); + + for (int nro=0 ; nrogetNbrParents()>1) + { + printf ("\n"); + printf (" *** joinQuads : donnees incorrectes\n"); + printf (" *** le %deme quadrangle de depart n'est pas une " + "face externe\n", nro); + face->dump (); + return HERR; + } + orig [nro]->setMark (nro); + tab_orig.push_back (orig[nro]); + } + + Edge* e_orig = tab_orig[0] -> findEdge (v1, v3); + Edge* e_dest = cible -> findEdge (v2, v4); + + if (e_orig==NULL) + { + printf ("\n"); + printf (" *** joinQuads : donnees incorrectes\n"); + printf (" *** Les vertex v1 et v3 passes en argument ne definissent\n"); + printf (" *** pas une arete du 1er quadrangle de depart\n"); + printf ("\n"); + HexDump (v1); + HexDump (v3); + HexDump (orig[0]); + } + + if (e_dest==NULL) + { + printf ("\n"); + printf (" *** joinQuads : donnees incorrectes\n"); + printf (" *** Les vertex v2 et v4 passes en argument ne definissent\n"); + printf (" *** pas une arete du quadrangle cible\n"); + printf ("\n"); + HexDump (v2); + HexDump (v4); + HexDump (cible); + } + + if (e_orig==NULL || e_dest==NULL) + return HERR; + + StrOrient orient (v1, v3, v2, v4); + int ier = this ->coupler (0, cible, &orient); + if (ier!=HOK) + return HERR; + ier = orig[0]->coupler (cible, &orient, this); + return ier; +} +// ======================================================== coupler +int Elements::coupler (int nquad, Quad* dest, StrOrient* orient) +{ + Quad* orig = tab_orig [nquad]; + + setQuad (orig, dir_z, 0, 0, 0); + setQuad (dest, dir_z, nquad, 0, 0); + + int n11 = orig->indexVertex (orient->v11); + int n12 = orig->indexVertex (orient->v12); + int n21 = dest->indexVertex (orient->v21); + int n22 = dest->indexVertex (orient->v22); + + // ---------------- Les 4 sommets initiaux + Vertex* vorig[QUAD4] = { orient->v11, orient->v12, + orig->getVertex((n11+2) MODULO QUAD4), + orig->getVertex((n12+2) MODULO QUAD4) }; + + Vertex* vdest[QUAD4] = { orient->v21, orient->v22, + dest->getVertex((n21+2) MODULO QUAD4), + dest->getVertex((n22+2) MODULO QUAD4) }; + if (db) + { + printf ("Quad nro %d : ", nquad); + orig->printName (" est couple avec "); + dest->printName ("\n"); + printf ("Orientation : ("); + for (int ii=0 ; iigetName()); + printf (")\n"); + printf (" -> ("); + for (int ii=0 ; iigetName()); + printf (")\n"); + } + + // ---------------- Les sommets + les aretes verticales + for (int ns=0 ; ns< QUAD4 ; ns++) + { + Vertex* nd1 = vorig[ns]; + Vertex* nd2 = vdest[ns]; + int nref0 = nd1->getMark(); + tab_vertex [nroVertex (nquad,ns,0)] = nd1; + + if (nref0==IS_NONE) + { + double px0 = nd1->getX(); + double py0 = nd1->getY(); + double pz0 = nd1->getZ(); + + double dx = (nd2->getX() - nd1->getX()) / gr_hauteur; + double dy = (nd2->getY() - nd1->getY()) / gr_hauteur; + double dz = (nd2->getZ() - nd1->getZ()) / gr_hauteur; + + nd1->setMark (indVertex (nquad, ns, 0)); + + Vertex* nd = nd1; + for (int nh=0 ; nhaddVertex (px0 + nh1*dx, py0 + nh1*dy, + pz0 + nh1*dz); + int nv = indVertex (nquad, ns, nh); + tab_vertex [nv] = nd; + tab_edge [nv] = el_root->addEdge (ndp, nd); + if (db) + printf (" Edge vertical nro %d = %s = (%s, %s)\n", nv, + tab_edge[nv]->getName(), + ndp->getName(), nd->getName()); + } + } + else + { + for (int nh=0 ; nhfindEdge (vorig[ns], vorig[next]); + int nref0 = arete->getMark(); + int nref = indVertex (nquad, ns, 0); + // Construction des faces & aretes H + if (nref0==IS_NONE) + { + arete->setMark (nref); + Edge* ea = arete; + Edge *eb, *ec, *ed; + int nva, nvb, nha; + + for (int nh=0 ; nh< gr_hauteur ; nh++) + { + nva = indVertex (nquad, ns, nh); + nvb = indVertex (nquad, next, nh); + nha = nroEdgeH (nva); + + ed = tab_edge [nva]; + ec = ea; + eb = tab_edge [nvb]; + if (nh==gr_hauteur-1) + ea = dest->findEdge (vdest[ns], vdest[next]); + else + ea = el_root->addEdge (tab_vertex [nva], tab_vertex [nvb]); + + propagateAssociation (ec, ea, eb); + tab_quad [nva] = newQuad (ea, eb, ec, ed); + if (BadElement (tab_quad [nva])) + return HERR; + tab_edge [nha] = ea; + } + } + // L'arete a deja ete traitee + else + { + for (int nh=0 ; nhgetDx() + v2->getDx() + v3->getDx(); + double dy = v1->getDy() + v2->getDy() + v3->getDy(); + double dz = v1->getDz() + v2->getDz() + v3->getDz(); + + double px0 = orig->getX () - mx * dx; + double py0 = orig->getY () - my * dy; + double pz0 = orig->getZ () - mz * dz; + + int nbre= 0; + + for (int nz=0 ; nzaddVertex (px0 + nx*dx, py0 + ny*dy, + pz0 + nz*dz); + setVertex (node, nx, ny, nz); + nbre++; + } + return HOK; +} +// ====================================================== makeCylindricalNodes +int Elements::makeCylindricalNodes (Vertex* orig, Vector* base, Vector* haut, + double dr, double da, double dl, int nr, int na, int nl, bool fill) +{ + int ier = makeBasicCylinder (dr, da, dl, nr, na, nl, fill); + if (ier!=HOK) + return ier; + + transfoVertices (orig, base, haut); + return HOK; +} +// ====================================================== transfoVertices +void Elements::transfoVertices (Vertex* orig, Vector* base, Vector* haut) +{ + Vector* iprim = new Vector (base); + Vector* jprim = new Vector (base); + Vector* kprim = new Vector (haut); + + int ier = kprim->renormer (); + if (ier!=HOK) + return; + + jprim->vectoriel (kprim, base); + ier = jprim->renormer (); + if (ier!=HOK) + return; + + iprim->vectoriel (jprim, kprim); + transfoVertices (orig, iprim, jprim, kprim); +} +// ====================================================== transfoVertices +void Elements::transfoVertices (Vertex* orig, Vector* iprim, Vector* jprim, + Vector* kprim) +{ + double matrice[DIM3][DIM3]={{iprim->getDx(),jprim->getDx(),kprim->getDx()}, + {iprim->getDy(),jprim->getDy(),kprim->getDy()}, + {iprim->getDz(),jprim->getDz(),kprim->getDz()}}; + + double matkx = orig->getX(); + double matky = orig->getY(); + double matkz = orig->getZ(); + + int nbre = tab_vertex.size (); + for (int nro=0 ; nrosetMark (NO_USED); + } + + for (int nro=0 ; nrogetMark() == NO_USED) + { + double point [DIM3] = {node->getX(), node->getY(), node->getZ()}; + double result[DIM3] = {matkx, matky, matkz}; + + for (int ni=0 ; nisetCoord (result[dir_x], result[dir_y], result[dir_z]); + node->setMark (IS_USED); + } + } +} +// ====================================================== transform +int Elements::transform (Matrix* matrice) +{ + // -- 1) Raz Marques + for (int nro=0 ; nroisHere()) + cell->razNodes (); + } + // -- 2) Move Nodes + for (int nro=0 ; nroisHere()) + cell->moveNodes (matrice); + } + + if (nbr_hexas!=0 ) + return HOK; + // -- Cas pathologique : il n'y avait pas d'hexas + // -- On se rabat sur les sommets + + for (int nro=0 ; nroisHere()) + matrice->perform (node); + } + + return HOK; +} +// ====================================================== cutHexas +int Elements::cutHexas (const Edges& t_edges, int nbcuts) +{ + // 1) marquage des hexas + el_root->markAll (NO_USED); + // 2) Memo noeuds + vector q_amont; + vector q_aval; + map vis_a_vis; + + int nbnodes = t_edges.size(); + vector v_amont (nbnodes); + vector v_aval (nbnodes); + + int nbfaces = 0; + for (int nro=0; nrogetAmont (); + v_aval [nro] = arete->getAval (); + if (db) + { + printf (" %3d : Edge = (", nro); + v_amont[nro]->printName (", "); + v_aval [nro]->printName (")\n"); + } + + vis_a_vis [v_amont[nro]] = v_aval[nro]; + vis_a_vis [v_aval[nro]] = v_amont[nro]; + int nbcells = arete->getNbrParents (); + + for (int nq=0 ; nqgetParent (nq); + if (quad->getMark () != IS_USED) + { + quad->setMark (IS_USED); + int nbcubes = quad->getNbrParents (); + for (int nh=0 ; nhgetParent (nh); + if (hexa->getMark () != IS_USED) + { + hexa->setMark (IS_USED); + int namont = hexa->getBase (v_amont[nro], arete); + int naval = glob->getOpposedQuad (namont); + q_amont.push_back (hexa->getQuad (namont)); + q_aval .push_back (hexa->getQuad (naval )); + + if (db) + { + printf (" %3d : Quad = ", nbfaces); + hexa->printName (", "); + printf (" Faces = ("); + hexa->getQuad (namont)->printName (", "); + hexa->getQuad (naval )->printName (")\n"); + nbfaces ++; + } + } + } + } + } + } + // ------------------- Dimensionnement + int nbcells = q_amont.size (); + nbr_vertex = nbnodes*(nbcuts+2); + int nbpiliers = nbnodes*(nbcuts+1); // aretes verticales + int nbpoutres = nbcells*(nbcuts+2)*QUAD4; // aretes horizontales + nbr_edges = nbpoutres; + nbr_quads = nbcells*(nbcuts+1)*QUAD4; // faces Verticales + nbr_hexas = nbcells*(nbcuts+1); + + // ------------------- Les noeuds et les aretes verticales + tab_quad.resize (nbr_quads); + tab_edge.resize (nbr_edges); + tab_hexa.resize (nbr_hexas); + tab_vertex.resize (nbr_vertex); + vector tab_pilier (nbpiliers); + + int nbinter = nbcuts + 1; + for (int ned=0; ned getAssociations (); + Edges ass_edges; + t_edges [ned]->remove (); + Vertex* ndamont = v_amont [ned]; + Vertex* ndaval = v_aval [ned]; + + double dx = (ndaval->getX() - ndamont->getX()) / nbinter; + double dy = (ndaval->getY() - ndamont->getY()) / nbinter; + double dz = (ndaval->getZ() - ndamont->getZ()) / nbinter; + + Vertex* nd0 = tab_vertex [ned] = ndamont; + for (int nc=0; ncaddVertex (ndamont->getX() + nc1*dx, + ndamont->getY() + nc1*dy, + ndamont->getZ() + nc1*dz); + tab_vertex [nc1*nbnodes + ned] = nd1; + tab_pilier [nc *nbnodes + ned] = newEdge (nd0, nd1); + ass_edges.push_back (tab_pilier [nc *nbnodes + ned]); + nd0 = nd1; + } + tab_vertex [nbinter*nbnodes + ned] = ndaval; + tab_pilier [nbcuts *nbnodes + ned] = newEdge (nd0, ndaval); + ass_edges.push_back (tab_pilier[nbcuts *nbnodes + ned]); + ndamont->setMark (ned); + cutAssociation (ass_shapes, ass_edges); + } + // ------------------- Les aretes horizontales + // ------------------- Les faces verticales + HexDisplay (nbcells); + int sizelig = nbcells*QUAD4; + for (int nro=0; nrogetEdge (ns); + int nmur = nro*QUAD4 + ns; + int nmur0 = plinthe->getMark(); + if (nmur0 >= 0) + { + for (int nc=0 ; ncsetMark (nmur); + Vertex* vs1 = sol->getVertex (ns); + Vertex* vs2 = sol->getVertex ((ns+1) MODULO QUAD4); + int nd1 = vs1->getMark (); + int nd2 = vs2->getMark (); + Edge* ed0 = tab_edge [nmur] = plinthe; + Edge* ed2 = NULL; + Vertex* v1 = NULL; + Vertex* v2 = NULL; + for (int nc=0 ; ncfindEdge (v1, v2); + } + + tab_edge [nc1*sizelig + nmur] = ed2; + tab_quad [nc *sizelig + nmur] = newQuad (ed0, + tab_pilier [nc*nbnodes + nd1], ed2, + tab_pilier [nc*nbnodes + nd2]); + ed0 = ed2; + if (db) + { + printf (" %2d : %d quad_vertical [%02d] = ", nro, ns, + nc*sizelig + nmur); + PrintName (tab_quad [nc *sizelig + nmur]); + printf ("\n"); + } + } + } + } + } + // ------------------- Les faces horizontales + // ------------------- Les hexas + // Rappel : sizelig = nbcells*QUAD4 + for (int nro=0; nro& table) +{ + int nbelts = table.size(); + for (int nro=0 ; nro& table) +{ + int nbelts = table.size(); + for (int nro=0 ; nro& table) +{ + int nbelts = table.size(); + for (int nro=0 ; nroisValid()) + elt->clearAssociation (); + } + *********************************************** */ +} +// ============================================================ findVertex +int Elements::findVertex (double vx, double vy, double vz) +{ + double tol = el_root->getTolerance (); + double xmin = vx - tol; + double xmax = vx + tol; + double ymin = vy - tol; + double ymax = vy + tol; + double zmin = vz - tol; + double zmax = vz + tol; + + int nbre = tab_vertex.size(); + for (int nro=0 ; nroisHere () + && node->isin (xmin, xmax, ymin, ymax, zmin, zmax)) + return nro; + } + return NOTHING; +} + +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexElements.hxx b/src/HEXABLOCK/HexElements.hxx new file mode 100755 index 0000000..e34d88d --- /dev/null +++ b/src/HEXABLOCK/HexElements.hxx @@ -0,0 +1,480 @@ + +// Class : Gestion des tableaux d'hexaedres + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __ELEMENTS_H +#define __ELEMENTS_H + +#include "HexEltBase.hxx" +#include "HexHexa.hxx" +#include "HexMatrix.hxx" + +BEGIN_NAMESPACE_HEXA + +class Elements : public EltBase +{ +public: + virtual Hexa* getHexa (int nro); + virtual Quad* getQuad (int nro); + virtual Edge* getEdge (int nro); + virtual Vertex* getVertex (int nro); + + virtual int countHexa () { return nbr_hexas ; } + virtual int countQuad () { return nbr_quads ; } + virtual int countEdge () { return nbr_edges ; } + virtual int countVertex () { return nbr_vertex ; } + + int findHexa (Hexa* elt); + int findQuad (Quad* elt); + int findEdge (Edge* elt); + int findVertex (Vertex* elt); + + int findVertex (double vx, double vy, double vz); + + +public: + Elements (Document* doc); + Elements (Document* doc, int nx, int ny, int nz); + Elements (Elements* orig); + + virtual ~Elements () {} + virtual void remove (); + virtual void clearAssociation (); + + Hexa* getStrate (int couche, EnumHQuad face); + + Hexa* getHexaIJK (int nx, int ny, int nz); + Quad* getQuadIJ (int nx, int ny, int nz); + Quad* getQuadJK (int nx, int ny, int nz); + Quad* getQuadIK (int nx, int ny, int nz); + Edge* getEdgeI (int nx, int ny, int nz); + Edge* getEdgeJ (int nx, int ny, int nz); + Edge* getEdgeK (int nx, int ny, int nz); + Vertex* getVertexIJK (int nx, int ny, int nz); + + int getHexas (Hexas& liste); + + void addHexa (Hexa* element); + void addQuad (Quad* element); + void addEdge (Edge* element); + void addVertex (Vertex* element); + int transform (Matrix* matrice); + + int saveVtk (cpchar nomfic); + int saveVtk (cpchar nomfic, int& nro); + + int makeCartesianGrid (Vertex* orig, Vector* v1, Vector* v2, Vector* v3, + int px, int py, int pz, int mx=0, int my=0, int mz=0); + + int makeCylinder (Cylinder* cyl, Vector* base, int nr, int na, int nl); + int makePipe (Cylinder* cyl, Vector* base, int nr, int na, int nl); + + int makeCylindricalGrid (Vertex* c, Vector* b, Vector* h, + double dr, double da, double dl, int nr, int na, int nl, bool fill); + + int makeSphericalGrid (Vertex* v, Vector* dv, int nb, double k=1); // perime + int makeSphericalGrid (Vertex* v, double rayon, int nb, double k=1); + + int joinQuads (Quads& q0, int nb, Vertex* v1, Vertex* v2, Vertex* v3, + Vertex* v4, Quad* dest); + int coupler (int nro, Quad* other, StrOrient* orient); + + int prismQuads (Quads& start, Vector* dv, int nb); + int prismQuadsVec (Quads& start, Vector* dv, RealVector& tlen, int crit); + + int cutHexas (const Edges& edges, int nbcuts); + + void setVertex (Vertex* node, int nx, int ny, int nz); + + void transfoVertices (Vertex* orig, Vector* vi, Vector* vj, Vector* vk); + void transfoVertices (Vertex* orig, Vector* base, Vector* haut); + + + void setVertex (Vertex* node, int nro); + void setEdge (Edge* edge, int nro); + void setQuad (Quad* quad, int nro); + void setHexa (Hexa* cell, int nro); + + int nroVertex (int nsommet, int nquad, int nh); + + // Evols Hexa3 + + int getCylPoint (int nr, int na, int nh, double& px, double& py, double& pz); + int revolutionQuads (Quads& start, Vertex* center, Vector* axis, + RealVector &angles); + + int makeRind (EnumGrid type, Vertex* center, Vector* vx, Vector* vz, + double rext, double rint, double radhole, + Vertex* plorig, double angle, int nrad, int nang, int nhaut); + + static int controlRind (EnumGrid type, Vertex* cx, Vector* vx, Vector* vz, + double rext, double rint, double radhole, + Vertex* plorig, double angle, + int nrad, int nang, int nhaut, + double &phi0, double &phi1); + + int makeCylindricalGrid (Vertex* c, Vector* b, Vector* h, + RealVector& tdr, RealVector& tda, RealVector& tdh, + bool fill=false); + + int replaceHexas (Quads& pattern, Vertex* p1, Vertex* c1, + Vertex* p2, Vertex* c2, Vertex* p3, Vertex* c3); + + int replaceHexa (int nh, Pattern* pat, Hexa* hexa); + int replaceQuad (int nh, Pattern* pat, Quad* quad, Vertex* tvert[]); + int extrudeQuad (Pattern* pat); + + void repVertex (int nh, int nro, Vertex* node); + void repEdgeH (int nh, int nro, Edge* node); + void repEdgeV (int nh, int nro, Edge* node); + void repQuadH (int nh, int nro, Quad* node); + void repQuadV (int nh, int nro, Quad* node); + + Vertex* repVertex (int nh, int nro, double px, double py, double pz); + Edge* repEdgeV (int nh, int nro, Vertex* v1, Vertex*v2); + Edge* repEdgeH (int nh, int nro, Vertex* v1, Vertex*v2); + Quad* repQuadH (int nh, int nro, Edge* ea, Edge* eb, Edge* ec, Edge* ed); + Quad* repQuadV (int nh, int nro, Edge* ea, Edge* eb, Edge* ec, Edge* ed); + Hexa* repHexa (int nh, int nro, Quad* qa, Quad* qb, Quad* qc, + Quad* qd, Quad* qe, Quad* qf); + + Vertex* repVertex (int nh, int nro); + Edge* repEdgeV (int nh, int nro); + Edge* repEdgeH (int nh, int nro); + Quad* repQuadH (int nh, int nro); + Quad* repQuadV (int nh, int nro); + + virtual Hexa* getKerHexa (int nro) { return ker_hexa [nro] ; } + virtual Quad* getKerHQuad (int nro) { return ker_hquad [nro] ; } + virtual Quad* getKerVQuad (int nro) { return ker_vquad [nro] ; } + virtual Edge* getKerHEdge (int nro) { return ker_hedge [nro] ; } + virtual Edge* getKerVEdge (int nro) { return ker_vedge [nro] ; } + + void moveDisco (Hexa* hexa); + +protected : + // Evols Hexa3 + void cutAssociation (Shapes& tshapes, Edges& tedges, bool exist=true); + void assoCylinder (Vertex* center, Vector* vz, double rayon); + void assoCylinders (Vertex* center, Vector* vz, double ray, RealVector& ta); + void assoRind (double* center, double* vx, int nx); + void assoSphere (Vertex* center, Edge* t_edge[], Quad* t_quad[]); + void assoCircle (double* center, Edge* ed1, Edge* ed2); + void assoResiduelle (); + + int makeBasicCylinder (RealVector& tdr, RealVector& tda, RealVector& tdh, + bool fill=false); + + int propagateAssociation (Edge* orig, Edge* dest, Edge* dir1); + int prismAssociation (Edge* orig, Edge* dest, int nh, Edge* dir); + + // Evols Hexa4 + void updateMatrix (int hauteur); + void endPrism (); + +protected : + + int fillGrid (); + void fillCenter (); + void fillCenter4 (); + void fillCenter6 (); + void fillCenterOdd (); + + int prismHexas (int nro, Quad* sol, int hauteur); + + void setVertex (int nx, int ny, int nz, double px, double py, double pz); + void setEdge (Edge* edge, EnumCoord dir, int nx, int ny, int nz); + void setQuad (Quad* quad, EnumCoord dir, int nx, int ny, int nz); + void setHexa (Hexa* cell, int nx, int ny, int nz); + + Edge* newEdge (Vertex* v1, Vertex* v2); + Quad* newQuad (Edge* e1, Edge* e2, Edge* e3, Edge* e4); + Hexa* newHexa (Quad* e1, Quad* e2, Quad* e3, Quad* e4, Quad* e5, Quad* e6); + + void resize (EnumGrid type, int nx, int ny=0, int nz=0, int nplus=0); + + int makeCartesianNodes (Vertex* orig, Vector* v1, Vector* v2, Vector* v3, + int px, int py, int pz, int mx=0, int my=0, int mz=0); + + int makeCylindricalNodes (Vertex* c, Vector* b, Vector* h, + double dr, double da, double dl, int nr, int na, int nl, bool fill); + + int makeBasicCylinder (double dr, double da, double dl, int nr, int na, + int nl, bool fill); + + int addStrate (Quad* i_quad[], Edge* i_edge[], Vertex* i_node[], + Vertex* center, double lambda); + + int indVertex (int nsommet, int nquad, int nh); + int indVertex (int ref_vert, int nh); + int nroEdgeH (int nvertex); + int nroEdgeH (int nsommet, int nquad, int nh); + int nroHexa (int nquad, int nh); + + void copyVertex (Elements* other, int px, int py, int pz, + int nx, int ny, int nz); + void completerGrille (double hauteur); + +protected : + Globale* glob; + EnumGrid grid_type; + + std::vector tab_hexa; + std::vector tab_quad; + std::vector tab_edge; + std::vector tab_pilier; + std::vector tab_vertex; + + std::vector tab_orig; + + int size_hx, size_hy, size_hz, size_hplus; + int size_qx, size_qy, size_qz, size_qhplus, size_qvplus; + int size_ex, size_ey, size_ez, size_ehplus, size_evplus; + int size_vx, size_vy, size_vz; + + int nbr_hexas, nbr_quads, nbr_edges, nbr_vertex; + int nbr_orig, nbr_piliers, ker_vertex; + + int gr_rayon; // Spheric + int gr_hauteur; // Joint + int nbr_secteurs; // Cyl + + bool cyl_closed; // Angle = 180 degres + bool cyl_fill; // Interieur rempli + EnumCyl cyl_dispo; // Type de remplissage + + // Evols Hexa3 + bool revo_lution; // Number 9 ... + Vertex* revo_center; + Vector* revo_axis; + + RealVector gen_values; // Angle pour la revolution + Matrix gen_matrix; + // Evols Hexa4 + bool prism_vec ; + Real3 prism_dir; + +// EnumGrid grid_type; // deja la + bool grid_nocart; // Grille non cartesienne : no acces aux getTrucIJK + double cyl_length; + double cyl_radhole, cyl_radext, cyl_radint; + double cyl_dtheta; // angle = na*dtheta + double cyl_phi0, cyl_dphi; // angle = phi0 + nh*dphi; + + int pat_nbedges; + int pat_nbvertex; + + std::vector ker_hexa; + std::vector ker_hquad, ker_vquad; + std::vector ker_hedge, ker_vedge; +}; +// =================================================== getStrate +inline Hexa* Elements::getStrate (int couche, EnumHQuad nroface) +{ + Hexa* cell = NULL; + int nro = couche <= 0 ? 0 : (couche-1)*HQ_MAXI + nroface + 1; + + if (nbr_hexas==0 || nro >= nbr_hexas) + cell = NULL; + else + cell = tab_hexa [nro]; + + return cell; +} +// ============================================================ setHexa +inline void Elements::setHexa (Hexa* elt, int nro) +{ + if (nro >=0 && nro < nbr_hexas) + tab_hexa [nro] = elt; +} +// ============================================================ setQuad +inline void Elements::setQuad (Quad* elt, int nro) +{ + if (nro >=0 && nro < nbr_quads) + tab_quad [nro] = elt; +} +// ============================================================ setEdge +inline void Elements::setEdge (Edge* elt, int nro) +{ + if (nro >=0 && nro < nbr_edges) + tab_edge [nro] = elt; +} +// ============================================================ setVertex +inline void Elements::setVertex (Vertex* elt, int nro) +{ + if (nro >=0 && nro < nbr_vertex) + tab_vertex [nro] = elt; +} +// ----------------------------------------------------------------------- +// ----------------------------------------------------------------------- +// ============================================================ getHexa +inline Hexa* Elements::getHexa (int nro) +{ + Hexa* elt = NULL; + int nombre=tab_hexa.size(); + // if (nro >=0 && nro < nbr_hexas && el_status == HOK Abu 2010/05/06 + if (nro >=0 && nro < nombre && el_status == HOK + && tab_hexa [nro] != NULL && tab_hexa [nro]->isValid()) + elt = tab_hexa [nro]; + + return elt; +} +// ============================================================ getQuad +inline Quad* Elements::getQuad (int nro) +{ + Quad* elt = NULL; + if (nro >=0 && nro < nbr_quads && el_status == HOK + && tab_quad [nro] != NULL && tab_quad [nro]->isValid()) + elt = tab_quad [nro]; + + return elt; +} +// ============================================================ getEdge +inline Edge* Elements::getEdge (int nro) +{ + Edge* elt = NULL; + if (nro >=0 && nro < nbr_edges && el_status == HOK + && tab_edge [nro] != NULL && tab_edge [nro]->isValid()) + elt = tab_edge [nro]; + + return elt; +} +// ============================================================ getVertex +inline Vertex* Elements::getVertex (int nro) +{ + Vertex* elt = NULL; + if (nro >=0 && nro < nbr_vertex && el_status == HOK + && tab_vertex [nro] != NULL && tab_vertex [nro]->isValid()) + elt = tab_vertex [nro]; + + return elt; +} +// ============================================================ indVertex +inline int Elements::indVertex (int nquad, int nsommet, int nh) +{ + int nro = nsommet + QUAD4*nquad + nbr_orig*QUAD4*(nh+1); + return nro; +} +// ============================================================ nroVertex +inline int Elements::nroVertex (int nquad, int nsommet, int nh) +{ + int nro = nsommet + QUAD4*nquad + nbr_orig*QUAD4*nh; + return nro; +} +// ============================================================ indVertex +inline int Elements::indVertex (int ref_edge, int nh) +{ + int nro = ref_edge + nbr_orig*QUAD4*nh; + return nro; +} +// ============================================================ nroEdgeH +inline int Elements::nroEdgeH (int nvertex) +{ + return QUAD4*nbr_orig*gr_hauteur + nvertex; +} +// ============================================================ nroEdgeH +inline int Elements::nroEdgeH (int nquad, int nsommet, int nh) +{ + return QUAD4*nbr_orig*gr_hauteur + indVertex (nquad, nsommet, nh); +} +// ============================================================ nroHexa +inline int Elements::nroHexa (int nquad, int nh) +{ + int nro = gr_hauteur*nquad + nh; + return nro; +} + +// ============================================================ addHexa +inline void Elements::addHexa (Hexa* element) +{ + tab_hexa.push_back (element); + nbr_hexas ++; +} +// ============================================================ addQuad +inline void Elements::addQuad (Quad* element) +{ + tab_quad.push_back (element); + nbr_quads ++; +} +// ============================================================ addEdge +inline void Elements::addEdge (Edge* element) +{ + tab_edge.push_back (element); + nbr_edges ++; +} +// ============================================================ addVertex +inline void Elements::addVertex (Vertex* element) +{ + tab_vertex.push_back (element); + nbr_vertex ++; +} +// ============================================================ findHexa +inline int Elements::findHexa (Hexa* element) +{ + int nbre = tab_hexa.size(); + for (int nro=0 ; nro +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +// HEXABLOCK includes +#include "HexVertex.hxx" +#include "HexShape.hxx" +#include "HexDiagnostics.hxx" + // Cercles +#include +#include + +#include +#include + +#include +#include + +#include + // Sphere +#include + // Cylindre +#include +#include +#include +#include + +BEGIN_NAMESPACE_HEXA + +static bool db = false; + +void clear_associations (Edge* edge); + +// --------------------------------------------------------------------- + +static KasLine current_line; +static Shape current_shape (""); + +// ========================================================= cutAssociation +void Elements::cutAssociation (Shapes& tshapes, Edges& tedges, bool exist) +{ + db = on_debug (); + char foo[18]; + int nbedges = tedges.size(); + int nbshapes = tshapes.size (); + if (nbshapes==0) + return; + + std::vector tab_gline (nbshapes); + + Vertex* prems = tedges [0] -> getVertex (V_AMONT); + Vertex* derns = tedges [nbedges-1] -> getVertex (V_AVAL); + + KasPoint pnt_first, pnt_last; + pnt_first.definePoint (prems); + pnt_last .definePoint (derns); + + if (exist) + { + if (pnt_first.isBad()) + { + el_root->putError (W_ASSO_CUT1, prems->getName (foo)); + return; + } + else if (pnt_last.isBad ()) + { + el_root->putError (W_ASSO_CUT2, derns->getName (foo)); + return; + } + } + // ----------- Define + longueur totale + double longueur = 0; + for (int ns = 0 ; nsputError (W_ASSO_CUT3, derns->getName (foo)); + return; + } + } + } + // ----------- Dernier + if (exist) + { + coord = pnt_last.getCoord (); + int pos = tab_gline[nslast].findBound (coord); + if (pos != V_AVAL) + { + el_root->putError (W_ASSO_CUT4, derns->getName (foo)); + return; + } + } + // ----------- Associations + double delta = longueur / nbedges; + for (int ned = 0 ; nedgetAssociation() == NULL) + current_line.assoPoint (angle, node); +} +// ====================================================== geom_asso_point +void geom_asso_point (Vertex* node) +{ + if (node==NULL || node->getAssociation() != NULL) + return; + + Real3 koord = { node->getX(), node->getY(), node->getZ() }; + KasPoint asso_point ; + asso_point.definePoint (koord); + asso_point.associate (node); +} +// ====================================================== geom_create_circle +void geom_create_circle (double* milieu, double rayon, double* normale, + double* base, string& brep) +{ + db = on_debug (); + if (db) printf ("geom_create_circle c=(%g,%g,%g), r=%g\n", + milieu[0], milieu[1], milieu[2], rayon); + if (db) printf (" -------- base=(%g,%g,%g)\n", base[0], base[1], base[2]); + if (db) printf (" -------- norm=(%g,%g,%g)\n", normale[0], normale[1], + normale[2]); + + gp_Pnt gp_center (milieu [dir_x], milieu [dir_y], milieu [dir_z]); + gp_Vec gp_vx (base [dir_x], base [dir_y], base [dir_z]); + gp_Vec gp_norm (normale[dir_x], normale[dir_y], normale[dir_z]); + + gp_Ax2 gp_axes (gp_center, gp_norm, gp_vx); + gp_Circ gp_circ (gp_axes, rayon); + + TopoDS_Edge geom_circ = BRepBuilderAPI_MakeEdge(gp_circ).Edge(); + ostringstream stream_shape; + BRepTools::Write(geom_circ, stream_shape); + brep = stream_shape.str(); + + // geom_make_brep (geom_circ, brep); + if (NOT db) + return; + // Impressions de mise au point + double umin = 0, umax = 0; + TopLoc_Location loc; + Handle(Geom_Curve) handle = BRep_Tool::Curve (geom_circ, loc, umin, umax); + GeomAdaptor_Curve AdaptCurve (handle); + double length = GCPnts_AbscissaPoint::Length(AdaptCurve, umin, umax); + + BRepAdaptor_Curve geom_curve (geom_circ); + + for (int pk=0; pk<=4; pk++) + { + GCPnts_AbscissaPoint s1 (geom_curve, pk*length/4, + geom_curve.FirstParameter()); + double u1 = s1.Parameter (); + gp_Pnt point = geom_curve.Value (u1); + if (db) + printf ( " ..... pnt%d = (%g, %g, %g)\n", pk, point.X(), + point.Y(), point.Z()); + } +} +// ====================================================== geom_create_sphere +void geom_create_sphere (double* milieu, double radius, string& brep) +{ + gp_Pnt gp_center (milieu [dir_x], milieu [dir_y], milieu [dir_z]); + gp_Ax2 gp_axis = gp_Ax2 (gp_center, gp_Dir(0,0,1), gp_Dir(1,0,0)); + + BRepPrimAPI_MakeSphere make_sphere (gp_axis, radius); + + make_sphere.Build(); + + ostringstream stream_shape; + TopoDS_Shape geom_sphere = make_sphere.Face(); + BRepTools::Write (geom_sphere, stream_shape); + brep = stream_shape.str(); +} +// ====================================================== geom_dump_asso +void geom_dump_asso (Edge* edge) +{ + printf (" %s dump_edge :\n", + "_______________________________________________________________"); + if (edge==NULL || NOT edge->isHere ()) + { + printf ("*** deleted ***)\n"); + return; + } + + bool db0 = db; + db = false; + edge->printName(" = ("); + edge->getVertex (V_AMONT)-> printName (", "); + edge->getVertex (V_AVAL) -> printName (")\n"); + + KasPoint asso_point; + for (int nro=0 ; nrogetVertex (nro); + vertex->printName (""); + printf (" = (%g, %g, %g)", vertex->getX(), vertex->getY(), + vertex->getZ()); + + int ier = asso_point.definePoint (vertex); + if (ier==HOK) + { + double* coord = asso_point.getCoord(); + printf (", pnt_asso = (%g, %g, %g)", coord[dir_x], coord[dir_y], + coord[dir_z]); + } + printf ("\n"); + } + + KasLine asso_line; + const Shapes& tshapes = edge->getAssociations (); + for (int nro=0 ; nrodebut, + deb[0], deb[1], deb[2]); + printf (" Fin = %g = (%g, %g, %g)\n", shape->fin, + fin[0], fin[1], fin[2]); + } + } + db = db0; +} +// ====================================================== translate_brep +void translate_brep (string& brep, double dir[], string& trep) +{ + gp_Trsf transfo; + BRep_Builder builder; + TopoDS_Shape orig; + + gp_Vec vecteur (dir [dir_x], dir [dir_y], dir [dir_z]); + transfo.SetTranslation (vecteur); + istringstream stream_brep (brep); + BRepTools::Read (orig, stream_brep, builder); + + TopLoc_Location loc_orig = orig.Location(); + gp_Trsf trans_orig = loc_orig.Transformation(); + TopLoc_Location loc_result (transfo * trans_orig); + TopoDS_Shape result = orig.Located (loc_result); + + ostringstream stream_shape; + BRepTools::Write (result, stream_shape); + trep = stream_shape.str(); +} +// ====================================================== transfo_brep +void transfo_brep (string& brep, Matrix* matrice, string& trep) +{ + BRep_Builder builder; + TopoDS_Shape shape_orig; + gp_Trsf transfo; + + double a11,a12,a13,a14, a21,a22,a23,a24, a31,a32,a33,a34; + matrice->getCoeff (a11,a12,a13,a14, a21,a22,a23,a24, a31,a32,a33,a34); + transfo.SetValues (a11,a12,a13,a14, a21,a22,a23,a24, a31,a32,a33,a34, + Epsil2, Epsil2); + + istringstream stream_brep (brep); + BRepTools::Read (shape_orig, stream_brep, builder); + + BRepBuilderAPI_Transform brep_transfo (shape_orig, transfo, Standard_True); + TopoDS_Shape result = brep_transfo.Shape(); + + ostringstream stream_shape; + BRepTools::Write (result, stream_shape); + trep = stream_shape.str(); +} +// ====================================================== clear_associations +void clear_associations (Edge* edge) +{ + edge->clearAssociation(); + edge->getVertex(V_AMONT)->clearAssociation(); + edge->getVertex(V_AVAL )->clearAssociation(); +} +// ====================================================== associateShapes +int associateShapes (Edges& mline, int msens[], Shape* gstart, Shapes& gline, + double pstart, double pend, bool closed, bool inv) +{ + db = on_debug (); + if (db) + { + cout << "____________________________________________" + << " associateShapes" << endl; + PutData (gline.size()); + PutData (pstart); + PutData (pend); + PutData (closed); + PutData (inv); + } + + int nbshapes = gline.size (); + int nblines = nbshapes + 1; + + vector buff_line (nblines); // car nblines != 0 + vector geom_line (nblines); + + // -------- Bufferisation des shapes + for (int ns=0 ; ns UnEpsil) + { + inv = true; + pstart = 0; + } + else if (pstart < Epsil) + { + inv = false; + } + } + else if (nbshapes==1) + pfin0 = pend; + + KasLine* prems = geom_line[0] = new KasLine (gstart, pstart, pfin0); + + // Ligne fermee : sens impose par l'utilisateur + if (closed) + { + sdepart = inv ? V_AVAL : V_AMONT; + } + // PolyLigne ouverte : trouver le sens + else if (nbshapes>0) + { + sdepart = NOTHING; + extrem = prems -> getEnd(); + for (int ns=V_AMONT ; ns<=V_AVAL && sdepart==NOTHING ; ns++) + { + for (int nb=0 ; nbfindBound(extrem) != NOTHING) + sdepart = ns; + } + extrem = prems -> getStart(); + } + + if (sdepart==NOTHING) + { + printf (" ***************** Erreur dans associateShapes\n"); + printf (" ***************** La ligne ouverte est interrompue\n"); + return HERR; + } + } + // Une seule ligne ouverte : depend de pstart et pend + else if (pstart < pend) + { + sdepart = V_AMONT; + pfin0 = pend; + } + else + { + sdepart = V_AVAL; + pfin0 = pend; + } + + prems -> setRank (0, sdepart, abscisse); + extrem = prems -> getEnd(); + // -------- Rangement des autres lignes + for (int nl=1 ; nlfindBound (extrem); + if (sens != NOTHING) + { + // Derniere ligne si ouverte + if (NOT closed && nl==nblines-1) + { + ligne -> setBounds (0, pend); + } + ligne -> setRank (nl, sens, abscisse); + buff_line [nb] = NULL; + geom_line [nl] = ligne; + extrem = ligne->getEnd(); + more = false; + } + } + if (more) + { + printf (" ***************** Erreur dans KasLine\n"); + return HERR; + } + } + if (closed && pstart > Epsil) + { + KasLine* ligne = new KasLine (gstart, 0, pstart); + ligne->setRank (nblines, sdepart, abscisse); + geom_line.push_back (ligne); + } + + int ntlines = geom_line.size(); + int nbedges = mline.size (); + + if (db) + cout << "==============================================================" + << endl; + // -------- Menage + for (int ned=0 ; nedassociate (mline[ned], sm1, sm2, msens[ned]); + } + // -------- Liberation + for (int nl=1 ; nl + +BEGIN_NAMESPACE_HEXA + +void geom_dump_asso (Edge* edge); +void geom_create_circle (double* milieu, double rayon, double* normale, + double* base, string& brep); + +// ====================================================== getHexaIJK +Hexa* Elements::getHexaIJK (int nx, int ny, int nz) +{ + if (nx<0 || nx>=size_hx || ny<0 || ny>=size_hy || nz<0 || nz>=size_hz) + return NULL; + else if (grid_nocart) + return NULL; + + int nro = nx + size_hx*ny + size_hx*size_hy*nz; + + return tab_hexa [nro]; +} +// ====================================================== getQuadIJ +Quad* Elements::getQuadIJ (int nx, int ny, int nz) +{ + if (nx<0 || nx>=size_qx || ny<0 || ny>=size_qy || nz<0 || nz>=size_qz) + return NULL; + else if (grid_nocart) + return NULL; + + int nro = nx + size_qx*ny + size_qx*size_qy*nz + + size_qx*size_qy*size_qz*dir_z; + return tab_quad [nro]; +} +// ====================================================== getQuadJK +Quad* Elements::getQuadJK (int nx, int ny, int nz) +{ + if (nx<0 || nx>=size_qx || ny<0 || ny>=size_qy || nz<0 || nz>=size_qz) + return NULL; + else if (grid_nocart) + return NULL; + + int nro = nx + size_qx*ny + size_qx*size_qy*nz; // + dir_x*... + + return tab_quad [nro]; +} +// ====================================================== getQuadIK +Quad* Elements::getQuadIK (int nx, int ny, int nz) +{ + if (nx<0 || nx>=size_qx || ny<0 || ny>=size_qy || nz<0 || nz>=size_qz) + return NULL; + else if (grid_nocart) + return NULL; + + int nro = nx + size_qx*ny + size_qx*size_qy*nz + size_qx*size_qy*size_qz; + + return tab_quad [nro]; +} +// ====================================================== getEdgeI +Edge* Elements::getEdgeI (int nx, int ny, int nz) +{ + if (nx<0 || nx>=size_ex || ny<0 || ny>=size_ey || nz<0 || nz>=size_ez) + return NULL; + else if (grid_nocart) + return NULL; + + int nro = nx + size_ex*ny + size_ex*size_ey*nz; + + return tab_edge [nro]; +} +// ====================================================== getEdgeJ +Edge* Elements::getEdgeJ (int nx, int ny, int nz) +{ + if (nx<0 || nx>=size_ex || ny<0 || ny>=size_ey || nz<0 || nz>=size_ez) + return NULL; + else if (grid_nocart) + return NULL; + + int nro = nx + size_ex*ny + size_ex*size_ey*nz + size_ex*size_ey*size_ez; + + return tab_edge [nro]; +} +// ====================================================== getEdgeK +Edge* Elements::getEdgeK (int nx, int ny, int nz) +{ + if (nx<0 || nx>=size_ex || ny<0 || ny>=size_ey || nz<0 || nz>=size_ez) + return NULL; + else if (grid_nocart) + return NULL; + + int nro = nx + size_ex*ny + size_ex*size_ey*nz + + size_ex*size_ey*size_ez*dir_z; + return tab_edge [nro]; +} +// ====================================================== getVertexIJK +Vertex* Elements::getVertexIJK (int nx, int ny, int nz) +{ + if (nx<0 || nx>=size_vx || ny<0 || ny>=size_vy || nz<0 || nz>=size_vz) + return NULL; + else if (grid_nocart) + return NULL; + + int nro = nx + size_vx*ny + size_vx*size_vy*nz; + + return tab_vertex [nro]; +} +// ====================================================== setVertex +void Elements::setVertex (Vertex* elt, int nx, int ny, int nz) +{ + if ( nx < 0 || nx >= size_vx || ny < 0 || ny >= size_vy + || nz < 0 || nz >= size_vz) return; + + int nro = nx + size_vx*ny + size_vx*size_vy*nz; + tab_vertex [nro] = elt; +} +// ====================================================== setVertex (2) +void Elements::setVertex (int nx, int ny, int nz, double px, double py, + double pz) +{ + if ( nx < 0 || nx >= size_vx || ny < 0 || ny >= size_vy + || nz < 0 || nz >= size_vz) return; + + Vertex* node = el_root->addVertex (px, py, pz); + setVertex (node, nx, ny, nz); +} +// ====================================================== setEdge +void Elements::setEdge (Edge* elt, EnumCoord dir, int nx, int ny, int nz) +{ + if (nx<0 || nx>=size_ex || ny<0 || ny>=size_ey || nz<0 || nz>=size_ez + || dir < dir_x || dir > dir_z ) + return; + + int nro = nx + size_ex*ny + size_ex*size_ey*nz + size_ex*size_ey*size_ez*dir; + tab_edge [nro] = elt; +} +// ====================================================== setQuad +void Elements::setQuad (Quad* elt, EnumCoord dir, int nx, int ny, int nz) +{ + if (nx<0 || nx>=size_ex || ny<0 || ny>=size_ey || nz<0 || nz>=size_ez + || dir < dir_x || dir > dir_z ) + return; + + int nro = nx + size_ex*ny + size_ex*size_ey*nz + size_ex*size_ey*size_ez*dir; + tab_quad [nro] = elt; +} +// ====================================================== setHexa +void Elements::setHexa (Hexa* elt, int nx, int ny, int nz) +{ + if ( nx < 0 || nx >= size_hx || ny < 0 || ny >= size_hy + || nz < 0 || nz >= size_hz) return; + + int nro = nx + size_hx*ny + size_hx*size_hy*nz; + tab_hexa [nro] = elt; +} +// ====================================================== remove +void Elements::remove () +{ + int nbre=tab_hexa.size (); + nbre = nbr_hexas; + for (int nh=0 ; nhremove(); +} +// ====================================================== makeCylinder +int Elements::makeCylinder (Cylinder* cyl, Vector* vx, int nr, int na, int nl) +{ + Vertex* orig = cyl->getBase (); + Vector* dir = cyl->getDirection (); + double ray = cyl->getRadius (); + double haut = cyl->getHeight (); + + resize (GR_CYLINDRIC, nr, na, nl); + cyl_closed = true; + makeCylindricalNodes (orig, vx, dir, ray/(nr+1), 360, haut/nl, + nr, na, nl, true); + fillGrid (); + assoCylinder (orig, dir, 360); + return HOK; +} +// ====================================================== makePipe +int Elements::makePipe (Cylinder* cyl, Vector* vx, int nr, int na, int nl) +{ + Vertex* orig = cyl->getBase (); + Vector* dir = cyl->getDirection (); + double ray = cyl->getRadius (); + double haut = cyl->getHeight (); + + resize (GR_CYLINDRIC, nr, na, nl); + cyl_closed = true; + makeCylindricalNodes (orig, vx, dir, ray, 360, haut, nr, na, nl, false); + fillGrid (); + assoCylinder (orig, dir, 360); + return HOK; +} +// +// ---------------------------------------- prism Quads +// +// ====================================================== prismQuads +int Elements::prismQuads (Quads& tstart, Vector* dir, int nbiter) +{ + el_root->markAll (NO_USED); + int nbcells = tstart.size (); + nbr_vertex = 0; + nbr_edges = 0; + + nbr_hexas = nbcells*nbiter; + + tab_hexa.resize (nbr_hexas); + tab_quad.clear (); // verticaux + ker_hquad.clear (); // Horizontaux + tab_edge.clear (); + tab_pilier.clear (); + tab_vertex.clear (); + + revo_lution = false; + prism_vec = false; + gen_matrix.defTranslation (dir); + + for (int nro=0 ; nromarkAll (NO_USED); + int nbcells = tstart.size (); + nbr_vertex = 0; + nbr_edges = 0; + + nbr_hexas = nbcells*nbiter; + + tab_hexa.resize (nbr_hexas); + tab_quad.clear (); // verticaux + ker_hquad.clear (); // Horizontaux + tab_edge.clear (); + tab_pilier.clear (); + tab_vertex.clear (); + + revo_lution = false; + prism_vec = true; + dir->getCoord (prism_dir); + normer_vecteur (prism_dir); + gen_values = tlen; + + for (int nro=0 ; nromarkAll (NO_USED); + int nbcells = start.size (); + nbr_vertex = 0; + nbr_edges = 0; + + nbr_hexas = nbcells*nbiter; + + tab_hexa.resize (nbr_hexas); + tab_quad.clear (); // verticaux + ker_hquad.clear (); // Horizontaux + tab_edge.clear (); + tab_pilier.clear (); + tab_vertex.clear (); + + revo_lution = true; + prism_vec = false; + revo_axis = axis; + revo_center = center; + gen_values = angles; + + for (int nro=0 ; nrogetVertex (ns); + int indx = vbase->getMark (); + if (indx<0) + { + indx = nbr_vertex++; + vbase->setMark (indx); + Vertex* nd0 = vbase; + Vertex* nd1 = NULL; + double beta = 0; + if (revo_lution) + { + Real3 centre, vk, point, om; + revo_center->getPoint (centre); + vbase ->getPoint (point); + revo_axis ->getCoord (vk); + normer_vecteur (vk); + + calc_vecteur (centre, point, om); + double oh = prod_scalaire (om, vk); + double rayon = 0; + Real3 ph, hm; + for (int dd=dir_x; dd<=dir_z ; dd++) + { + ph [dd] = centre [dd] + oh*vk[dd]; + hm [dd] = point [dd] - ph[dd]; + rayon += hm[dd] * hm[dd]; + } + rayon = sqrt (rayon); +/******************************** + PutCoord (centre); + PutCoord (point); + PutData (oh); + PutCoord (ph); + PutData (rayon); + PutCoord (vk); + PutCoord (hm); +********************************/ + geom_create_circle (ph, rayon, vk, hm, c_rep); + } + + for (int nh=0 ; nhaddVertex (nd0->getX(), nd0->getY(), nd0->getZ()); + updateMatrix (nh); + gen_matrix.perform (nd1); + tab_vertex.push_back (nd1); + Edge* pilier = newEdge (nd0, nd1); + tab_pilier.push_back (pilier); + if (revo_lution) + { + double alpha = beta; + beta = alpha + gen_values[nh]; + Shape* shape = new Shape (c_rep); + shape->setBounds (alpha/360, beta/360); + pilier->addAssociation (shape); + // geom_dump_asso (pilier); + } + nd0 = nd1; + } + } + ind_node [ns] = indx; + } + // ----------------------------- Aretes horizontales + // ----------------------------- + face verticales + int ind_poutre [QUAD4]; + for (int ns=0 ; nsgetEdge (ns); + int indx = ebase->getMark (); + if (indx<0) + { + indx = nbr_edges ++; + ebase->setMark (indx); + int nd1 = ind_node [ns]; + int nd2 = ind_node [(ns+1) MODULO QUAD4]; + Edge* ed0 = ebase; + Edge *ed1, *ed2, *ed3; + for (int nh=0 ; nh0 ? gen_values[hauteur-1] : 0; + double dh = gen_values[hauteur] - h0; + Real3 decal; + for (int nc=dir_x ; nc<=dir_z ; nc++) + decal [nc] = prism_dir [nc]*dh; + gen_matrix.defTranslation (decal); + } +} +// ====================================================== endPrism +void Elements::endPrism () +{ + int nbelts = ker_hquad.size(); + for (int nro=0 ; nro + +BEGIN_NAMESPACE_HEXA +// ====================================================== makeBasicCylinder +int Elements::makeBasicCylinder (double dr, double da, double dl, int nr, + int na, int nl, bool fill) +{ + cyl_dispo = CYL_NOFILL; + if (fill && na > 3) + { + if (cyl_closed) + { + if (na==4) + cyl_dispo = CYL_CL4; + else if (na==6) + cyl_dispo = CYL_CL6; + else if (na MODULO 2 == 0) + cyl_dispo = CYL_CLOSED; + } + else if ((na MODULO 2)==0) + cyl_dispo = CYL_PEER; + else + cyl_dispo = CYL_ODD; + } + + cyl_fill = cyl_dispo != CYL_NOFILL; + + double alpha = M_PI*da/180; + double beta = alpha / na; + double theta = 0; + int nb_secteurs = cyl_closed ? size_vy-1 : size_vy; + + for (int ny=0 ; nyaddVertex (px, py, pz); + setVertex (node, nx, ny, nz); + } + } + } + + if (cyl_closed) + { + for (int nx=0 ; nxaddVertex (0, 0, nz*dl); + tab_vertex.push_back (node); + nbr_vertex ++; + } + } + + return HOK; +} +// ====================================================== fillGrid +int Elements::fillGrid () +{ + if (cyl_closed) + for (int nx=0 ; nx0) + { + Quad* qc = getQuadJK (nx0, 0, nz-1); + Quad* qd = getQuadJK (nx0, 2, nz-1); + Quad* qe = getQuadJK (nx0, 1, nz-1); + Quad* qf = getQuadJK (nx0, 3, nz-1); + + if (debug()) + { + printf (" --------------- Hexa grille4 : nz=%d\n", nz); + HexDump (plafond); + HexDump (sol); + HexDump (qc); + HexDump (qd); + HexDump (qe); + HexDump (qf); + } + Hexa* cell = newHexa (plafond, sol, qc, qd, qe, qf); + tab_hexa.push_back (cell); + } + sol = plafond; + } +} +// ====================================================== fillCenter6 +void Elements::fillCenter6 () +{ + int nx0 = 0; + int nydemi = size_hy / 2; + + Edge* s_barre = NULL; + Quad* sr_quad = NULL; + Quad* sl_quad = NULL; + + for (int nz=0 ; nz0) + { + // Cloison interieure + Quad* cloison = newQuad (p_barre, getEdgeK (nx0, 0, nz-1), + s_barre, getEdgeK (nx0, nydemi, nz-1)); + // Hexas + Quad* q0 = getQuadJK (nx0, 0, nz-1); + Quad* q1 = getQuadJK (nx0, 1, nz-1); + Quad* q2 = getQuadJK (nx0, 2, nz-1); + Quad* q3 = getQuadJK (nx0, 3, nz-1); + Quad* q4 = getQuadJK (nx0, 4, nz-1); + Quad* q5 = getQuadJK (nx0, 5, nz-1); + + Hexa* left = newHexa (sl_quad, pl_quad, q0, q2, q1, cloison); + Hexa* right = newHexa (sr_quad, pr_quad, q3, q5, q4, cloison); + tab_hexa.push_back (left); + tab_hexa.push_back (right); + } + s_barre = p_barre; + sr_quad = pr_quad; + sl_quad = pl_quad; + } +} +// ====================================================== fillCenterOdd +#undef IndElt +#define IndElt(nc,nz) (nbsecteurs*(nz) + nc) +void Elements::fillCenterOdd () +{ + int nx0 = 0; + int nbsecteurs = size_hy / 2; + + vector ker_hedge (nbsecteurs*size_vz); + vector ker_hquad (nbsecteurs*size_vz); + vector ker_vquad (nbsecteurs*size_vz); + + for (int nz=0 ; nz= 360.0; + + int ier = makeBasicCylinder (tdr, tda, tdh, fill); + if (ier!=HOK) + return ier; + + transfoVertices (orig, base, haut); + + fillGrid (); + assoCylinders (orig, haut, angle, tda); + return HOK; +} +// ====================================================== makeBasicCylinder +// ==== Version avec vecteurs +int Elements::makeBasicCylinder (RealVector& tdr, RealVector& tda, + RealVector& tdh, bool fill) +{ + int na = tda.size(); + + cyl_dispo = CYL_NOFILL; + if (fill && na > 3) + { + if (cyl_closed) + { + if (na==4) + cyl_dispo = CYL_CL4; + else if (na==6) + cyl_dispo = CYL_CL6; + else if (na MODULO 2 == 0) + cyl_dispo = CYL_CLOSED; + } + else if ((na MODULO 2)==0) + cyl_dispo = CYL_PEER; + else + cyl_dispo = CYL_ODD; + } + + cyl_fill = cyl_dispo != CYL_NOFILL; + + double alpha = 0; + int nb_secteurs = cyl_closed ? size_vy-1 : size_vy; + + for (int ny=0 ; ny0) + alpha += tda[ny-1]; + + double theta = M_PI*alpha/180; + double cos_theta = cos (theta); + double sin_theta = sin (theta); + double rayon = 0; + + for (int nx=0 ; nx 0) + pz += tdh [nz-1]; + Vertex* node = el_root->addVertex (px, py, pz); + setVertex (node, nx, ny, nz); + } + } + } + + if (cyl_closed) + { + for (int nx=0 ; nx 0) + pz += tdh [nz-1]; + Vertex* node = el_root->addVertex (0, 0, pz); + tab_vertex.push_back (node); + nbr_vertex ++; + } + } + + return HOK; +} +END_NAMESPACE_HEXA + diff --git a/src/HEXABLOCK/HexElements_piq.cxx b/src/HEXABLOCK/HexElements_piq.cxx new file mode 100755 index 0000000..46bf4a9 --- /dev/null +++ b/src/HEXABLOCK/HexElements_piq.cxx @@ -0,0 +1,718 @@ + +// C++ : Table d'hexaedres (Evol Versions 3) + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexElements.hxx" + +#include "HexVector.hxx" +#include "HexVertex.hxx" +#include "HexEdge.hxx" +#include "HexDiagnostics.hxx" + +#include +#include + +BEGIN_NAMESPACE_HEXA + +static bool db = false; + +// -------------------------------------------------------- +struct PatQuad +{ + int q_edge [QUAD4]; + Quad* refer; +}; +// -------------------------------------------------------- +struct PatVertex +{ + double v_x, v_y; + Vertex* refer; +}; +// -------------------------------------------------------- +struct PatEdge +{ + int v_amont, v_aval; + Edge* refer; + int nbr_refer; +}; + +// -------------------------------------------------------- +class Pattern +{ +friend class Elements; +public : + int initialize (Vertex* v1, Vertex* v2, Vertex* v3); + int addQuad (Quad* quad); + int verify (int &nbed, int &nbver); + +private : + int addEdge (Edge* edge); + int addVertex (Vertex* vertex); + +private : + enum EnumProj { ProjXY, ProjYZ, ProjZX }; + + vector pat_vertex; + vector pat_edge; + vector pat_quad; + + int nbr_vertex, nbr_edges, nbr_quads; + double determinant; + EnumProj projection; + Real3 base_i, base_j, origine; + + int pos_vertex4; + int pos_edge3, pos_edge4; +}; + +// ====================================================== initialize +int Pattern::initialize (Vertex* v1, Vertex* v2, Vertex* v3) +{ + nbr_vertex = nbr_edges = nbr_quads = 0; + projection = ProjXY; + determinant = 1; + base_i[0] = base_i[1] = base_i[2] = 0; + base_j[0] = base_j[1] = base_j[2] = 0; + + if (v1==NULL || v2==NULL || v3==NULL) + return HERR; + + addVertex (v1); + addVertex (v2); + addVertex (v3); + if (nbr_vertex!=3) + return HERR; + + Document* doc = v1->dad (); + Edge* edc1 = doc->findEdge (v1, v2); + Edge* edc2 = doc->findEdge (v2, v3); + if (edc1==NULL || edc2==NULL) + return HERR; + + addEdge (edc1); + addEdge (edc2); + if (nbr_edges!=2) + return HERR; + + pat_edge[0].nbr_refer = pat_edge[1].nbr_refer = 0; + + pat_vertex[0].v_x = pat_vertex[1].v_x = 0; + pat_vertex[2].v_x = 1; + pat_vertex[0].v_y = 1; + pat_vertex[1].v_y = pat_vertex[2].v_y = 0; + + Real3 pb, pc; + v1->getPoint (pc); + v2->getPoint (origine); + v3->getPoint (pb); + + calc_vecteur (origine, pb, base_i); + calc_vecteur (origine, pc, base_j); + + if (db) + { + PutCoord (origine); + PutCoord (base_i); + PutCoord (base_j); + PutData (determinant); + } + +/* ****************************** + * AB = pu.vI + pv.vJ + * + * vx = pu.vI[0] + pv.vJ[0] (1) *+vJ[1] ) }; + * + * (1 & 2 ) : pu = (vx.vJ[1] - vy.vJ[0]) / detxy + * pv = -(vx.vI[1] - vy.vI[0]) / detxy + *x + * (2 & 3 ) : pu = (vy.vJ[2] - vz.vJ[1]) / detyz + * pv = -(vy.vI[2] - vz.vI[1]) / detyz + * + * (3 & 1 ) : pu = (vz.vJ[0] - vx.vJ[2]) / detzx + * pv = -(vz.vI[0] - vx.vI[2]) / detzx + * + * Les 3 systemes d'equations sont valides. + * On va choisir celui dont la valeur absolue du determinant est maximale + ****************************** */ + + double detxy = base_i[dir_x]*base_j[dir_y] - base_i[dir_y]*base_j[dir_x]; + double detyz = base_i[dir_y]*base_j[dir_z] - base_i[dir_z]*base_j[dir_y]; + double detzx = base_i[dir_z]*base_j[dir_x] - base_i[dir_x]*base_j[dir_z]; + + determinant = detxy; + projection = ProjXY; + + if (fabs (detyz) > fabs (determinant)) + { + determinant = detyz; + projection = ProjYZ; + } + if (fabs (detzx) > fabs (determinant)) + { + determinant = detzx; + projection = ProjZX; + } + + return HOK; +} +// ====================================================== verify +int Pattern::verify (int &nbed, int &nbver) +{ + nbed = nbr_edges; + nbver = nbr_vertex; + pos_edge3 = pos_edge4 = pos_vertex4 = NOTHING; + + if (pat_edge[0].nbr_refer!=1 || pat_edge[1].nbr_refer!=1) + return HERR; + + for (int nro=2 ; nrogetEdge (nro); + quad.q_edge [nro] = addEdge (edge); + } + + pat_quad.push_back (quad); + nbr_quads++; + return HOK; +} +// ====================================================== addEdge +int Pattern::addEdge (Edge* elt) +{ + for (int nro=0; nrogetVertex (V_AMONT)); + edge.v_aval = addVertex (elt->getVertex (V_AVAL)); + + pat_edge.push_back (edge); + nbr_edges++; + return nbr_edges-1; +} +// ====================================================== addVertex +int Pattern::addVertex (Vertex* elt) +{ + for (int nro=0; nrogetX() - origine [dir_x]; + double vy = elt->getY() - origine [dir_y]; + double vz = elt->getZ() - origine [dir_z]; + switch (projection) + { + case ProjXY : default : + vertex.v_x = (vx*base_j[dir_y] - vy*base_j[dir_x]) / determinant; + vertex.v_y = -(vx*base_i[dir_y] - vy*base_i[dir_x]) / determinant; + break; + + case ProjYZ : + vertex.v_y = (vy*base_j[dir_z] - vz*base_j[dir_y]) / determinant; + vertex.v_x = -(vy*base_i[dir_z] - vz*base_i[dir_y]) / determinant; + break; + + case ProjZX : + vertex.v_x = (vz*base_j[dir_x] - vx*base_j[dir_z]) / determinant; + vertex.v_y = -(vz*base_i[dir_x] - vx*base_i[dir_z]) / determinant; + break; + } + + if (db) + printf (" Vertex nro %d : (%g, %g, %g)\t -> (%g, %g)\n", + nbr_vertex, vx, vy, vz, vertex.v_x, vertex.v_y); + pat_vertex.push_back (vertex); + nbr_vertex++; + return nbr_vertex-1; +} +// ------------------------------------------------------------------- +// ------------------------------------------------------------------- +// ------------------------------------------------------------------- +// ------------------------------------------------------------------- +// ====================================================== replaceHexas +int Elements::replaceHexas (Quads& liste, Vertex* p1, Vertex* c1, + Vertex* p2, Vertex* c2, Vertex* p3, Vertex* c3) +{ + Edge* edp1 = el_root->findEdge (p1, p2); + Edge* edp2 = el_root->findEdge (p2, p3); + Edge* edc1 = el_root->findEdge (c1, c2); + Edge* edc2 = el_root->findEdge (c2, c3); + + Quad* quadc = el_root->findQuad (c1, c3); + + if (edp1==NULL || edp2==NULL || edc1==NULL || edc2==NULL || quadc==NULL) + { + printf ("... Error in HexaBlock function \n"); + printf ("... doc.replace (lquads, p1,c1, p2,c2, p3,c3)\n"); + if (edp1==NULL) + printf ("Vertices p1 and p2 don't define an edge\n"); + else if (edp2==NULL) + printf ("Vertices p2 and p3 don't define an edge\n"); + else if (edc1==NULL) + printf ("Vertices c1 and c2 don't define an edge\n"); + else if (edc2==NULL) + printf ("Vertices c2 and c3 don't define an edge\n"); + else if (quadc==NULL) + printf ("Vertices c1 and c3 don't define a quad\n"); + return HERR; + } + + int np = quadc->getNbrParents (); + Hexa* hexac = quadc->getParent (0); + + if (np!=1 || hexac==NULL) + { + printf ("... Error in HexaBlock function \n"); + printf ("... doc.replace (lquads, p1,c1, p2,c2, p3,c3)\n"); + printf ("Quad (c1,c2,c3) is not an external quad\n"); + return HERR; + } + // Analyse du pattern + int nbquads = liste.size(); + Pattern pattern; + int ier = pattern.initialize (p1, p2, p3); + if (ier!=HOK) + { + printf ("... Error in HexaBlock function \n"); + printf ("... doc.replace (lquads, p1,c1, p2,c2, p3,c3)\n"); + printf ("Vertices (p1,p2,p3) don't define a virtual quad\n"); + return HERR; + } + + for (int nq=0 ; nqgetOpposedQuad (quadc); + pil_quad.push_back (oppos); + more = oppos->getNbrParents() == 2; + + if (more) + { + if (oppos->getParent (0)==hexac) + hexac = oppos->getParent(1); + else + hexac = oppos->getParent(0); + pil_hexa.push_back (hexac); + } + quadc = oppos; + } + + resize (GR_REPLACE, nbquads, nbh, nbv, nbed); + + // 1) Constitution des 4 coins de la cible + // 2) Quadriller la face du haut + // 3) Trouver les 4 coins de la face du bas + // 4) Quadriller la face du bas + // 6) Decouper l'hexaedre defini par ces 2 faces + // 7) S'il y a un hexaedre dessous goto 3) + + Vertex* tvert[QUAD4] = { c1, c2, c3, pil_quad[0]->getOpposVertex(c2) }; + replaceQuad (1, &pattern, pil_quad[0], tvert); + for (int nh=1 ; nhgetPerpendicularEdge (pil_quad[nh-1], + tvert[nro]); + tvert [nro] = edv ->opposedVertex(tvert[nro]); + } + replaceQuad (nh+1, &pattern, pil_quad[nh], tvert); + replaceHexa (nh, &pattern, pil_hexa[nh-1]); + } + + for (int nh=1 ; nh<=nbh ; nh++) + pil_quad[nh]->remove (); + + extrudeQuad (&pattern); + replaceHexa (0, &pattern, NULL); + return HOK; +} +// ====================================================== repVertex +void Elements::repVertex (int nh, int nro, Vertex* elt) +{ + int addr = nh * pat_nbvertex + nro; + if (tab_vertex[addr] == NULL) + tab_vertex[addr] = elt; +} +// ====================================================== repVertex +Vertex* Elements::repVertex (int nh, int nro, double px, double py, double pz) +{ + int addr = nh * pat_nbvertex + nro; + + if (tab_vertex[addr] == NULL) + tab_vertex[addr] = el_root->addVertex (px, py, pz); + + return tab_vertex[addr]; +} +// ====================================================== repVertex +Vertex* Elements::repVertex (int nh, int nro) +{ + int addr = nh * pat_nbvertex + nro; + return tab_vertex[addr]; +} +// ====================================================== repEdgeH +void Elements::repEdgeH (int nh, int nro, Edge* elt) +{ + int addr = nh * (pat_nbedges + pat_nbvertex) + nro; + if (tab_edge[addr] == NULL) + tab_edge[addr] = elt; +} +// ====================================================== repEdgeH +Edge* Elements::repEdgeH (int nh, int nro, Vertex* v1, Vertex* v2) +{ + int addr = nh * (pat_nbedges + pat_nbvertex) + nro; + if (tab_edge[addr] == NULL) + tab_edge[addr] = el_root->addEdge (v1, v2); + return tab_edge[addr]; +} +// ====================================================== repEdgeH +Edge* Elements::repEdgeH (int nh, int nro) +{ + int addr = nh * (pat_nbedges + pat_nbvertex) + nro; + return tab_edge[addr]; +} +// ====================================================== repEdgeV +void Elements::repEdgeV (int nh, int nro, Edge* elt) +{ + int addr = nh * (pat_nbedges + pat_nbvertex) + pat_nbedges + nro; + if (tab_edge[addr] == NULL) + tab_edge[addr] = elt; +} +// ====================================================== repEdgeV +Edge* Elements::repEdgeV (int nh, int nro, Vertex* v1, Vertex* v2) +{ + int addr = nh * (pat_nbedges + pat_nbvertex) + pat_nbedges + nro; + if (tab_edge[addr] == NULL) + tab_edge[addr] = el_root->addEdge (v1, v2); + return tab_edge[addr]; +} +// ====================================================== repEdgeV +Edge* Elements::repEdgeV (int nh, int nro) +{ + int addr = nh * (pat_nbedges + pat_nbvertex) + pat_nbedges + nro; + return tab_edge[addr]; +} +// ====================================================== repQuadH +void Elements::repQuadH (int nh, int nro, Quad* elt) +{ + int addr = nh * (nbr_orig + pat_nbedges) + nro; + if (tab_quad[addr] == NULL) + tab_quad[addr] = elt; +} +// ====================================================== repQuadH +Quad* Elements::repQuadH (int nh, int nro) +{ + int addr = nh * (nbr_orig + pat_nbedges) + nro; + return tab_quad [addr]; +} +// ====================================================== repQuadH +Quad* Elements::repQuadH (int nh, int nro, Edge* e1, Edge* e2, Edge* e3, + Edge* e4) +{ + int addr = nh * (nbr_orig + pat_nbedges) + nro; + if (tab_quad[addr] == NULL) + tab_quad[addr] = el_root->addQuad (e1, e2, e3, e4); + return tab_quad [addr]; +} +// ====================================================== repQuadV +void Elements::repQuadV (int nh, int nro, Quad* elt) +{ + int addr = nh * (nbr_orig + pat_nbedges) + nbr_orig + nro; + if (tab_quad[addr] == NULL) + tab_quad[addr] = elt; +} +// ====================================================== repQuadV +Quad* Elements::repQuadV (int nh, int nro) +{ + int addr = nh * (nbr_orig + pat_nbedges) + nbr_orig + nro; + return tab_quad [addr]; +} +// ====================================================== repQuadV +Quad* Elements::repQuadV (int nh, int nro, Edge* e1, Edge* e2, Edge* e3, + Edge* e4) +{ + int addr = nh * (nbr_orig + pat_nbedges) + nbr_orig + nro; + if (tab_quad[addr] == NULL) + tab_quad[addr] = el_root->addQuad (e1, e2, e3, e4); + return tab_quad [addr]; +} +// ====================================================== repHexa +Hexa* Elements::repHexa (int nh, int nro, Quad* qa, Quad* qb, Quad* qc, + Quad* qd, Quad* qe, Quad* qf) +{ + int addr = nh * nbr_orig + nro; + if (tab_hexa[addr] == NULL) + tab_hexa[addr] = el_root->addHexa (qa, qb, qc, qd, qe, qf); + return tab_hexa [addr]; +} +// ====================================================== replaceQuad +// ==== Creation des quads horizontaux +int Elements::replaceQuad (int nh, Pattern* pat, Quad* quad, Vertex* tvert[]) +{ + Vertex* pvert[QUAD4] = { tvert[0], tvert[1], tvert[2], tvert[3] }; + + int vnro [4] = { 0, 1, 2, pat->pos_vertex4}; + int ednro[4] = { 0, 1, pat->pos_edge3, pat->pos_edge4 }; + + // Enregistrement des vertex & edges existant + for (int nro=0 ; nrofindEdge (vh, vh1); + + repVertex (nh, vnro [nro], vh); + repEdgeH (nh, ednro [nro], edh); + } + + Real3 orig, ib, jb, pb, pc; + // Creation des vertex + tvert[0]->getPoint (pc); + tvert[1]->getPoint (orig); + tvert[2]->getPoint (pb); + calc_vecteur (orig, pb, ib); + calc_vecteur (orig, pc, jb); + + for (int nro=0 ; nronbr_vertex ; nro++) + { + double lambda = pat->pat_vertex [nro].v_x; + double mu = pat->pat_vertex [nro].v_y; + double px = orig[dir_x] + lambda*ib[dir_x] + mu*jb[dir_x]; + double py = orig[dir_y] + lambda*ib[dir_y] + mu*jb[dir_y]; + double pz = orig[dir_z] + lambda*ib[dir_z] + mu*jb[dir_z]; + repVertex (nh, nro, px, py, pz); + } + // Creation des edges horizontaux + for (int nro=0 ; nronbr_edges ; nro++) + { + int nv1 = pat->pat_edge [nro].v_amont; + int nv2 = pat->pat_edge [nro].v_aval; + Vertex* v1 = repVertex (nh, nv1); + Vertex* v2 = repVertex (nh, nv2); + repEdgeH (nh, nro, v1, v2); + } + // Creation des quads horizontaux + for (int nro=0 ; nronbr_quads ; nro++) + { + Edge* eda = repEdgeH (nh, pat->pat_quad [nro].q_edge [0]); + Edge* edb = repEdgeH (nh, pat->pat_quad [nro].q_edge [1]); + Edge* edc = repEdgeH (nh, pat->pat_quad [nro].q_edge [2]); + Edge* edd = repEdgeH (nh, pat->pat_quad [nro].q_edge [3]); + + repQuadH (nh, nro, eda, edb, edc, edd); + } + return HOK; +} +// ====================================================== extrudeQuad +// ==== Creation des quads horizontaux +int Elements::extrudeQuad (Pattern* pat) +{ + // Creation des vertex de niveau 0 + for (int nro=0 ; nronbr_vertex ; nro++) + { + Vertex* v1 = repVertex (1, nro); + Vertex* v2 = repVertex (2, nro); + double px = 2*v1->getX() - v2->getX(); + double py = 2*v1->getY() - v2->getY(); + double pz = 2*v1->getZ() - v2->getZ(); + repVertex (0, nro, px, py, pz); + } + // Creation des edges horizontaux + for (int nro=0 ; nronbr_edges ; nro++) + { + int nv1 = pat->pat_edge [nro].v_amont; + int nv2 = pat->pat_edge [nro].v_aval; + Vertex* v1 = repVertex (0, nv1); + Vertex* v2 = repVertex (0, nv2); + repEdgeH (0, nro, v1, v2); + } + // Creation des quads horizontaux + for (int nro=0 ; nronbr_quads ; nro++) + { + Edge* eda = repEdgeH (0, pat->pat_quad [nro].q_edge [0]); + Edge* edb = repEdgeH (0, pat->pat_quad [nro].q_edge [1]); + Edge* edc = repEdgeH (0, pat->pat_quad [nro].q_edge [2]); + Edge* edd = repEdgeH (0, pat->pat_quad [nro].q_edge [3]); + + repQuadH (0, nro, eda, edb, edc, edd); + } + return HOK; +} +// ====================================================== replaceHexa +int Elements::replaceHexa (int nh, Pattern* pat, Hexa* hexa) +{ + int vnro [4] = { 0, 1, 2, pat->pos_vertex4}; + int ednro[4] = { 0, 1, pat->pos_edge3, pat->pos_edge4 }; + + // Enregistrement des edges & quads existants + if (hexa!=NULL) + { + for (int nro=0 ; nrofindEdge (vh, vh1); + repEdgeV (nh, vnro [nro], edv); + + Edge* edh = repEdgeH (nh, ednro [nro]); + Edge* edh1 = repEdgeH (nh+1, ednro [nro]); + Quad* quadv = hexa->findQuad (edh, edh1); + repQuadV (nh, ednro [nro], quadv); + } + } + // Creation des edges verticaux + for (int nro=0 ; nronbr_vertex ; nro++) + { + Vertex* v1 = repVertex (nh, nro); + Vertex* v2 = repVertex (nh+1, nro); + repEdgeV (nh, nro, v1, v2); + } + // Creation des quads verticaux + for (int nro=0 ; nronbr_edges ; nro++) + { + int nv1 = pat->pat_edge [nro].v_amont; + int nv2 = pat->pat_edge [nro].v_aval; + + Edge* eda = repEdgeH (nh, nro); + Edge* edb = repEdgeV (nh, nv1); + Edge* edc = repEdgeH (nh+1, nro); + Edge* edd = repEdgeV (nh, nv2); + repQuadV (nh, nro, eda, edb, edc, edd); + } + // Creation des hexaedres + for (int nro=0 ; nronbr_quads ; nro++) + { + Quad* qa = repQuadH (nh, nro); + Quad* qb = repQuadH (nh+1, nro); + Quad* qc = repQuadV (nh, pat->pat_quad [nro].q_edge [0]); + Quad* qd = repQuadV (nh, pat->pat_quad [nro].q_edge [2]); + Quad* qe = repQuadV (nh, pat->pat_quad [nro].q_edge [1]); + Quad* qf = repQuadV (nh, pat->pat_quad [nro].q_edge [3]); + repHexa (nh, nro, qa, qb, qc, qd, qe, qf); + } + + return HOK; +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexElements_ter.cxx b/src/HEXABLOCK/HexElements_ter.cxx new file mode 100755 index 0000000..a56e79e --- /dev/null +++ b/src/HEXABLOCK/HexElements_ter.cxx @@ -0,0 +1,591 @@ + +// C++ : Table d'hexaedres (Evol Versions 3) + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexElements.hxx" + +#include "HexVector.hxx" +#include "HexVertex.hxx" +#include "HexEdge.hxx" +#include "HexHexa.hxx" +#include "HexMatrix.hxx" +#include "HexShape.hxx" +#include "HexGlobale.hxx" + +#include + +BEGIN_NAMESPACE_HEXA + +void geom_create_circle (double* milieu, double rayon, double* normale, + double* base, string& brep); +void geom_create_sphere (double* milieu, double radius, string& brep); + +void translate_brep (string& brep, double vdir[], string& trep); +void transfo_brep (string& brep, Matrix* matrice, string& trep); +void geom_asso_point (Vertex* node); + +static bool db=false; + +// ====================================================== makeRind +int Elements::makeRind (EnumGrid type, Vertex* center, Vector* vx, Vector* vz, + double radext, double radint, double radhole, + Vertex* plorig, double angle, int nr, int na, int nl) +{ + double phi1; + int ier = controlRind (type, center, vx, vz, radext, radint, radhole, + plorig, angle, nr, na, nl, cyl_phi0, phi1); + if (ier!=HOK) + return ier; + + resize (type, nr, na, nl); + + cyl_radext = radext; + cyl_radint = radint; + cyl_radhole = radhole; + cyl_closed = type==GR_HEMISPHERIC || type==GR_RIND; + + double theta = cyl_closed ? 2*M_PI : M_PI*angle/180; + cyl_dphi = (phi1-cyl_phi0)/ size_hz; + cyl_dtheta = theta / size_hy; + + int nb_secteurs = cyl_closed ? size_vy-1 : size_vy; + + for (int ny=0 ; nyaddVertex (px, py, pz); + setVertex (node, nx, ny, nz); + } + if (cyl_closed) + for (int nx=0 ; nx= rext) + return HERR; + + if (rhole > rint) + return HERR; + + double nvx = vx->getNorm(); + double nvz = vz->getNorm(); + + if (nvx < Epsil1 || nvz < Epsil1) + return HERR; + + double alpha = asin (rhole/rext); + double beta = -M_PI*DEMI; + if (type==GR_HEMISPHERIC || type==GR_PART_SPHERIC) + alpha = 2*alpha; + + if (px!=NULL) + { + // oh = oa.n/|n| + double oh = ((px->getX() - cx->getX()) * vz->getDx() + + (px->getY() - cx->getY()) * vz->getDy() + + (px->getZ() - cx->getZ()) * vz->getDz()) / nvz; + if (oh > rext) + return HERR; + else if (oh > -rext) + beta = asin (oh/rext); + } + + phi0 = std::max (alpha - M_PI*DEMI, beta); + phi1 = M_PI*DEMI - alpha; + return HOK; +} +// ====================================================== getHexas +int Elements::getHexas (Hexas& liste) +{ + liste.clear (); + for (int nro = 0 ; nroisValid()) + liste.push_back (cell); + } + return HOK; +} +// ====================================================== assoCylinder +void Elements::assoCylinder (Vertex* ori, Vector* normal, double angle) +{ + RealVector tangles; + assoCylinders (ori, normal, angle, tangles); +} +// ====================================================== assoCylinders +void Elements::assoCylinders (Vertex* ori, Vector* normal, double angle, + RealVector& t_angles) +{ + int na = t_angles.size(); + bool regul = na == 0; + double alpha = angle/size_hy; + + string brep; + Real3 vk = { normal->getDx(), normal->getDy(), normal->getDz() }; + normer_vecteur (vk); + + for (int nz=0 ; nzgetX() - ori->getX(), + pm->getY() - ori->getY(), + pm->getZ() - ori->getZ() }; + + double oh = prod_scalaire (om, vk); + double rayon = 0; + Real3 ph, hm; + for (int dd=dir_x; dd<=dir_z ; dd++) + { + ph [dd] = ori->getCoord(dd) + oh*vk[dd]; + hm [dd] = pm ->getCoord(dd) - ph[dd]; + rayon += hm[dd] * hm[dd]; + } + + rayon = sqrt (rayon); + geom_create_circle (ph, rayon, vk, hm, brep); + + double pmax = 0; + for (int ny=0 ; ny setBounds (pmin, pmax); + edge->addAssociation (shape); + } + } + } + + // Association automatique des vertex non associes -> bph + // Traitement des faces spheriques + + Real3 vi = { -vk[dir_x], -vk[dir_y], -vk[dir_z] }; + Real3 po = { ori->getX(), ori->getY(), ori->getZ() }; + + switch (grid_type) + { + case GR_HEMISPHERIC : // Pour l'exterieur + case GR_PART_SPHERIC : + assoRind (po, vi, size_vx-1); + break; + case GR_PART_RIND : // Exterieur + interieur + case GR_RIND : + assoRind (po, vi, 0); + assoRind (po, vi, size_vx-1); + break; + default : + break; + } + assoResiduelle (); // Association des sommets residuels +} +// ====================================================== assoRind +// Association des meridiennes +// Creation sphere geometrique + association faces +void Elements::assoRind (double* ori, double* vi, int nx) +{ + Real3 vk; + Edges contour; + string c_brep, s_brep; + Shape shape (c_brep); + Shapes t_shape; + t_shape.push_back (&shape); + + double radius = nx==0 ? cyl_radint : cyl_radext; + double paramin = (cyl_phi0 + M_PI/2) / (2*M_PI); + double paramax = paramin + size_hz*cyl_dphi/(2*M_PI); + + paramin = std::max (paramin, 0.0); + paramax = std::min (paramax, 1.0); + geom_create_sphere (ori, radius, s_brep); + + int nz1 = size_vz/2; + int nb_secteurs = cyl_closed ? size_vy-1 : size_vy; + + for (int ny=0 ; nygetX(), pm->getY(), pm->getZ() }; + prod_vectoriel (vi, vj, vk); + double rayon = cyl_radint + nx*(cyl_radext-cyl_radint)/size_hx; + geom_create_circle (ori, rayon, vk, vi, c_brep); + shape.setBrep (c_brep); + shape.setBounds (paramin, paramax); + contour.clear (); + + for (int nz=0 ; nzaddAssociation (sshape); + } + } + cutAssociation (t_shape, contour, false); + } +} +// ====================================================== assoCircle +// ==== utilise pour les spheres carrees +void Elements::assoCircle (double* center, Edge* ed1, Edge* ed2) +{ + Real3 oa, ob, normal; + Real3 pta, ptb, ptc, ptd; + string brep; + +// Les 2 edges dont les petits cotes d'un rectangle de rapport L/l=sqrt(2) +// Soit le cercle circonscrit a ce rectangle. +// * la largeur est balayee par l'angle alpha +// * la longueur par l'angle beta = pi -alpha + + ed1->getVertex(V_AMONT)->getPoint (pta); + ed1->getVertex(V_AVAL )->getPoint (ptb); + ed2->getVertex(V_AMONT)->getPoint (ptc); + ed2->getVertex(V_AVAL )->getPoint (ptd); + + double d1 = calc_distance (pta, ptc); + double d2 = calc_distance (pta, ptd); + + if (d1 < d2) + { + ed2->getVertex(V_AMONT)->getPoint (ptd); + ed2->getVertex(V_AVAL )->getPoint (ptc); + } + + calc_vecteur (center, pta, oa); + calc_vecteur (center, ptb, ob); + prod_vectoriel (oa, ob, normal); + double rayon = calc_norme (oa); + + geom_create_circle (center, rayon, normal, oa, brep); + + Shape* asso1 = new Shape (brep); + Shape* asso2 = new Shape (brep); + + const double alpha = atan (sqrt(2)/2)/M_PI; // angle proche de 70.528 degres + asso1->setBounds (0, alpha); + asso2->setBounds (0.5, alpha + 0.5); + + ed1->addAssociation (asso1); + ed2->addAssociation (asso2); +} +// ====================================================== assoSphere +void Elements::assoSphere (Vertex* ori, Edge* t_edge[], Quad* t_quad[]) +{ + Real3 center, sommet; + ori->getPoint(center); + + assoCircle (center, t_edge [E_AC], t_edge [E_BD]); + assoCircle (center, t_edge [E_AD], t_edge [E_BC]); + assoCircle (center, t_edge [E_AE], t_edge [E_BF]); + assoCircle (center, t_edge [E_AF], t_edge [E_BE]); + assoCircle (center, t_edge [E_CE], t_edge [E_DF]); + assoCircle (center, t_edge [E_CF], t_edge [E_DE]); + + t_edge[E_AC]->getVertex(V_AMONT)->getPoint (sommet); + double radius = calc_distance (center, sommet);; + + string brep; + geom_create_sphere (center, radius, brep); + + for (int nf=0 ; nf < HQ_MAXI ; nf++) + { + Shape* shape = new Shape (brep); + t_quad [nf]->addAssociation (shape); + } + + assoResiduelle (); // Association des sommets residuels +} +// ====================================================== makeSphericalGrid +int Elements::makeSphericalGrid (Vertex* c, double rayon, int nb, double k) +{ + resize (GR_SPHERIC, nb); + + if (nb<0) + return HERR; + else if (rayon <=ZEROR) + return HERR; + + Vertex* i_node [HV_MAXI]; // Les noeuds de l'hexa englobant + Edge* i_edge [HE_MAXI]; // Les noeuds de l'hexa englobant + Quad* i_quad [HQ_MAXI]; // Les noeuds de l'hexa englobant + + for (int nro=0 ; nroCoordVertex (nro, dir_x) * rayon; + double dy = glob->CoordVertex (nro, dir_y) * rayon; + double dz = glob->CoordVertex (nro, dir_z) * rayon; + + i_node [nro] = el_root->addVertex (c->getX ()+dx, c->getY ()+dy, + c->getZ ()+dz); + } + + for (int nro=0 ; nroEdgeVertex (nro, V_AMONT); + int v2 = glob->EdgeVertex (nro, V_AVAL); + i_edge[nro] = newEdge (i_node[v1], i_node[v2]); + + if (db) + { + char nm0[8], nm1 [8], nm2 [8]; + printf (" %2d : %s = %s = [%s, %s] = [%d,%d] = [%s,%s]\n", nro, + glob->namofHexaEdge(nro), i_edge[nro]->getName(nm0), + glob->namofHexaVertex(v1), glob->namofHexaVertex(v2), v1, v2, + i_node[v1]->getName(nm1), i_node[v2]->getName(nm2)); + } + } + + for (int nro=0 ; nroQuadEdge (nro, E_A)], + i_edge[glob->QuadEdge (nro, E_B)], + i_edge[glob->QuadEdge (nro, E_C)], + i_edge[glob->QuadEdge (nro, E_D)]); + + tab_hexa.push_back (newHexa (i_quad[Q_A], i_quad[Q_B], i_quad[Q_C], + i_quad[Q_D], i_quad[Q_E], i_quad[Q_F])); + double lambda = 1; + double dcell = 1; + for (int niv=0; nivgetAssociations (); + const Shapes& tab_dest = dest->getAssociations (); + int nbdest = tab_dest.size(); + int nbshapes = tab_shapes.size(); + bool on_edge = nbshapes!=0 && nbdest==0; + + Vertex* vo1 = orig->commonVertex (dir); + Vertex* vd1 = dest->commonVertex (dir); + Vertex* vo2 = orig->opposedVertex (vo1); + Vertex* vd2 = dest->opposedVertex (vd1); + + if (vo1==NULL || vd1==NULL) + return HERR; + + string trep; + Real3 pa, pb, vdir1, vdir2; + calc_vecteur (vo1->getPoint (pa), vd1->getPoint (pb), vdir1); + calc_vecteur (vo2->getPoint (pa), vd2->getPoint (pb), vdir2); + + double dd = calc_distance (vdir1, vdir2); + bool para = dd < 1.0e-3; + + if (para && on_edge) + { + for (int nro=0 ; nrogetBrep(); + translate_brep (brep, vdir1, trep); + Shape* tshape = new Shape (trep); + tshape->setBounds (shape->debut, shape->fin); + dest->addAssociation (tshape); + } + } + } + + double* vdir = vdir1; + for (int nro=V_AMONT ; nro<=V_AVAL ; nro++) + { + Shape* shape = vo1->getAssociation (); + if (shape!=NULL && vd1->getAssociation ()==NULL) + { + string brep = shape->getBrep(); + translate_brep (brep, vdir, trep); + Shape* tshape = new Shape (trep); + vd1->setAssociation (tshape); + } + vo1 = vo2; + vd1 = vd2; + vdir = vdir2; + } + + return HOK; +} +// ==================================================== prismAssociation +int Elements::prismAssociation (Edge* orig, Edge* dest, int nh, Edge* dir) +{ + if (orig==NULL || dest==NULL || dir==NULL) + return HERR; + + updateMatrix (nh); + + const Shapes& tab_shapes = orig->getAssociations (); + const Shapes& tab_dest = dest->getAssociations (); + int nbdest = tab_dest.size(); + int nbshapes = tab_shapes.size(); + bool on_edge = nbshapes>0 && nbdest==0; + + Vertex* vo1 = orig->commonVertex (dir); + Vertex* vd1 = dest->commonVertex (dir); + + if (vo1==NULL || vd1==NULL) + return HERR; + + string trep; + Real3 porig, pdest, vdir; + vo1->getPoint (porig); + vd1->getPoint (pdest); + calc_vecteur (porig, pdest, vdir); + + if (on_edge) + { + for (int nro=0 ; nrogetBrep(); + // translate_brep (brep, vdir, trep); + transfo_brep (brep, &gen_matrix, trep); + Shape* tshape = new Shape (trep); + tshape->setBounds (shape->debut, shape->fin); + dest->addAssociation (tshape); + } + } + } + + for (int nro=V_AMONT ; nro<=V_AVAL ; nro++) + { + Shape* shape = vo1->getAssociation (); + if (shape!=NULL && vd1->getAssociation ()==NULL) + { + string brep = shape->getBrep(); + // translate_brep (brep, vdir, trep); + transfo_brep (brep, &gen_matrix, trep); + Shape* tshape = new Shape (trep); + vd1->setAssociation (tshape); + } + vo1 = orig->opposedVertex (vo1); + vd1 = dest->opposedVertex (vd1); + } + return HOK; +} +// ====================================================== assoResiduelle +void Elements::assoResiduelle () +{ + int nbre = tab_vertex.size(); + for (int nv=0 ; nvgetCenter (center); + matrix.defScale (center, 0.55); + + int nbre = tab_vertex.size(); + for (int nv=0 ; nvdoc_nbr_elt [type]; + + el_next = NULL; + el_assoc = NULL; + el_status = HOK; + el_mark = 0; + + el_root->doc_nbr_elt [type] ++; + el_root->doc_last_elt [type] -> el_next = this; + el_root->doc_last_elt [type] = this; + el_root->setDeprecated (1); + + // EL_NONE, EL_VERTEX, EL_EDGE, EL_QUAD, EL_HEXA, EL_REMOVED + char buffer [16]; + sprintf (buffer, "%c%04d", ABR_TYPES[el_type], el_id); + el_name = buffer; +} +// =================================================== Destructeur +EltBase::~EltBase () +{ + // printf (" delete "); + // dump (); +} +// =================================================== Constructeur Bis +// Utilise uniquement dans le constructeur de Document +// Creation d'un premier element fictif pour accelerer les chainages +EltBase::EltBase (EnumElt type) +{ + el_root = NULL; + el_type = type; + el_id = -1; + + el_next = NULL; + el_status = HOK; + el_mark = 0; +} +// =================================================== remove +void EltBase::remove () +{ + if (el_type == EL_REMOVED) + return; + + el_root->setDeprecated (2); + el_type = EL_REMOVED; + int nbp = el_parent.size(); + for (int nro=0 ; nroisHere()) + elt->remove (); + } +} +// =================================================== suppress +void EltBase::suppress () +{ + if (el_type == EL_REMOVED) + return; + + el_root->setDeprecated (2); + el_type = EL_REMOVED; +} +// ========================================================= replaceAssociation +void EltBase::replaceAssociation (EltBase* orig) +{ + if ( orig == NULL || orig->el_assoc == NULL + || orig == this || orig->el_assoc == el_assoc) + return; + + if (el_assoc==NULL) + el_assoc = orig->el_assoc; + else + el_root->hputError (W_REPL_ASSOC, this, orig); +} +// ========================================================= copyAssociation +void EltBase::copyAssociation (EltBase* orig) +{ + if ( orig == NULL || orig->el_assoc == NULL + || orig == this || orig->el_assoc == el_assoc) + return; + + el_assoc = orig->el_assoc; + el_root->hputError (W_DISCO_ASSOC, orig); +} +// ========================================================= getName +cpchar EltBase::getName () +{ + return el_name.c_str() ; +} +// ========================================================= getName +char* EltBase::getName (pchar buffer) +{ +// EL_NONE, EL_VERTEX, EL_EDGE, EL_QUAD, EL_HEXA, EL_REMOVED + sprintf (buffer, "%c%04d", ABR_TYPES[el_type], el_id); + return buffer; +} +// ========================================================= printName +void EltBase::printName (cpchar sep) +{ + char nom[12]; + + printf ("%s%s", getName(nom), sep); +} +// ========================================================= setAssociation +void EltBase::setAssociation (Shape* forme) +{ + el_assoc = forme; + + if (el_root->debug (2)) + cout << " Vertex " << el_name << " : setAssociation" << endl; +} +// ========================================================= dumpRef +void EltBase::dumpRef () +{ + int nbp = el_parent.size(); + bool prems = true; + + if (nbp==0) + { + printf ("\n"); + } + + for (int nro=0 ; nroisHere ()) + { + if (prems) + printf ("\t isin "); + prems = false; + el_parent[nro]->printName(", "); + } + } + + printf ("\n"); +} + +END_NAMESPACE_HEXA + diff --git a/src/HEXABLOCK/HexEltBase.hxx b/src/HEXABLOCK/HexEltBase.hxx new file mode 100755 index 0000000..a95a290 --- /dev/null +++ b/src/HEXABLOCK/HexEltBase.hxx @@ -0,0 +1,157 @@ + +// Class : Element de base des Vertex/Edge/Quad, etc... + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __ELT_BASE_H +#define __ELT_BASE_H + +#include "hexa_base.hxx" +#include "HexDocument.hxx" +#include + +#define HexDump(x) {printf(#x " = "); if (x) x->dump(); else printf("NULL\n");} +#define PrintName(x) if (x) x->printName(); else printf ("NULL, ") +#define PutName(x) { printf(#x " = "); if (x) x->printName("\n"); else printf("NULL\n"); } + +#define GetClone(elt) ((elt)==NULL ? NULL : elt->getClone()) +#define BadElement(elt) (elt)==NULL || (elt)->isBad() +#define ABR_TYPES "xveqhw????" + +BEGIN_NAMESPACE_HEXA + +class EltBase +{ +public : + virtual Hexa* getHexa (int nro) { return NULL; } + virtual Quad* getQuad (int nro) { return NULL; } + virtual Edge* getEdge (int nro) { return NULL; } + virtual Vertex* getVertex (int nro) { return NULL; } + + virtual int countHexa () { return 0; } + virtual int countQuad () { return 0; } + virtual int countEdge () { return 0; } + virtual int countVertex () { return 0; } + + virtual void setError (int kod=HERR) { el_status = kod; } + virtual int getError () { return el_status; } + virtual bool isValid () { return el_status==HOK; } + virtual bool isBad () { return el_status!=HOK; } + + virtual void setAssociation (Shape* forme); + virtual void clearAssociation () { el_assoc = NULL ; } + virtual void duplicate () {} + virtual Shape* getAssociation () { return el_assoc ; } + + void copyAssociation (EltBase* orig); + void replaceAssociation (EltBase* orig); + +public : + virtual void replaceEdge (Edge* old, Edge* nouveau) + { printf ("rep-edge\n") ; } + virtual void replaceVertex (Vertex* old, Vertex* nouveau) + { printf ("rep-vertex\n") ; } + + EltBase (Document* doc, EnumElt type=EL_NONE); + EltBase (EnumElt type=EL_NONE); + + virtual ~EltBase (); + virtual void remove (); + virtual void suppress (); + virtual void dump (); + virtual void saveXml (XmlWriter* xml) {} + virtual void majReferences () { } + + EltBase* next () { return el_next; } + void setNext (EltBase* suivant) { el_next = suivant; } + int getId () { return el_id; } + void setId (int ln) { el_id = ln; } + Document* dad () { return el_root; } + EnumElt getType () { return el_type; } + bool isHere () { return el_type!=EL_REMOVED; } + bool isDeleted () { return el_type==EL_REMOVED; } + + // On s'occupe des parents + + void razReferences () { el_parent.clear() ; } + void addParent (EltBase* dad) { if (dad) el_parent.push_back(dad) ; } + int getNbrParents () { return el_parent.size() ; } + bool hasParents (); + EltBase* getFather (int nro); + + int getMark () { return el_mark; } + void setMark (int ln) { el_mark = ln ; } + char* getName (pchar nom); + void printName (cpchar sep=" "); + void dumpRef (); + + cpchar getName (); + void setName (const string& nom) { el_name = nom ; } + void setName (cpchar nom) { el_name = nom ; } + + bool debug (int niv=0) { return el_root->getLevel() > niv ; } + +protected : + EnumElt el_type; + EltBase* el_next; + int el_id; + Document* el_root; + Shape* el_assoc; + string el_name; + + int el_status; + int el_mark; + std::vector el_parent; +}; +// ========================================================= dump +inline void EltBase::dump () +{ + printf ("Elt%d Nro=%04d", el_type, el_id); + dumpRef() ; +} + +// ========================================================= getFather +inline EltBase* EltBase::getFather (int nro) +{ + EltBase* elt = NULL; + if (nro >= 0 && nro < (int) el_parent.size() && isHere() + && el_parent[nro]->isHere()) + elt = el_parent[nro]; + + return elt; +} +// ========================================================= hasParents +inline bool EltBase::hasParents () +{ + int nbp = el_parent.size(); + for (int nro=0 ; nroisHere()) + return true; + + return false; +} +// ========================================================= clear_association +inline void clear_association (EltBase* elt) +{ + if (elt != NULL && elt->isHere() && elt->isValid()) + elt -> clearAssociation (); +} +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexGlobale.cxx b/src/HEXABLOCK/HexGlobale.cxx new file mode 100755 index 0000000..bffdf76 --- /dev/null +++ b/src/HEXABLOCK/HexGlobale.cxx @@ -0,0 +1,179 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// C++ : Initialisation du singleton + +#include "HexGlobale.hxx" + +BEGIN_NAMESPACE_HEXA + +static bool db = false; + +/* ----------------------------------------------------- + + // ---- Numerotation des faces (%x) + + 6=bed +----bd-----+ bdf=7 + /| /| + be | B bf | + / | / | + 4=bce +----bc-----+...|...bcf=5 + | de D | df + | E | | F | z + ce | C cf | ^ + 2=ade...|...+----ad-|---+ adf=3 | y + | / | / | / + | ae A | af | / + |/ |/ |/ + 0=ace +----ac-----+ acf=1 +-----> x + + * ----------------------------------------------------- */ + +Globale* Globale::unique_instance = NULL; + +// ====================================================== Constructeur +Globale::Globale () +{ + setNames (); + + setCoordVertex ( V_ACE, 0, 0, 0 ); + setCoordVertex ( V_ACF, 1, 0, 0 ); + setCoordVertex ( V_ADF, 1, 1, 0 ); + setCoordVertex ( V_ADE, 0, 1, 0 ); + + setCoordVertex ( V_BCE, 0, 0, 1 ); + setCoordVertex ( V_BCF, 1, 0, 1 ); + setCoordVertex ( V_BDF, 1, 1, 1 ); + setCoordVertex ( V_BDE, 0, 1, 1 ); + + setEdgeVertex ( E_AC, V_ACE, V_ACF ); + setEdgeVertex ( E_AF, V_ACF, V_ADF ); + setEdgeVertex ( E_AD, V_ADF, V_ADE ); + setEdgeVertex ( E_AE, V_ADE, V_ACE ); + + setEdgeVertex ( E_BC, V_BCE, V_BCF ); + setEdgeVertex ( E_BF, V_BCF, V_BDF ); + setEdgeVertex ( E_BD, V_BDF, V_BDE ); + setEdgeVertex ( E_BE, V_BDE, V_BCE ); + + setEdgeVertex ( E_CE, V_ACE, V_BCE ); + setEdgeVertex ( E_CF, V_ACF, V_BCF ); + setEdgeVertex ( E_DF, V_ADF, V_BDF ); + setEdgeVertex ( E_DE, V_ADE, V_BDE ); + + setQuadEdge ( Q_A, E_AC, E_AF, E_AD, E_AE ); + setQuadEdge ( Q_B, E_BC, E_BF, E_BD, E_BE ); + setQuadEdge ( Q_C, E_AC, E_CF, E_BC, E_CE ); + setQuadEdge ( Q_D, E_AD, E_DF, E_BD, E_DE ); + setQuadEdge ( Q_E, E_AE, E_DE, E_BE, E_CE ); + setQuadEdge ( Q_F, E_AF, E_DF, E_BF, E_CF ); + + setOpposedVertex ( V_ACE, V_BDF); + setOpposedVertex ( V_ACF, V_BDE); + setOpposedVertex ( V_ADF, V_BCE); + setOpposedVertex ( V_ADE, V_BCF); + + setOpposedQuad ( Q_A, Q_B ); + setOpposedQuad ( Q_C, Q_D ); + setOpposedQuad ( Q_E, Q_F ); +} +// ====================================================== getInstance +Globale* Globale::getInstance () +{ + if (unique_instance==NULL) + unique_instance = new Globale (); + + return unique_instance; +} +// ====================================================== setCoordVertex +void Globale::setCoordVertex (EnumHVertex node, int px, int py, int pz) +{ + coord_vertex [node] [dir_x] = 2*px-1; + coord_vertex [node] [dir_y] = 2*py-1; + coord_vertex [node] [dir_z] = 2*pz-1; +} +// ====================================================== setEdgeVertex +void Globale::setEdgeVertex (EnumHEdge edge, EnumHVertex v1, EnumHVertex v2) +{ + edge_vertex [edge] [V_AMONT] = v1; + edge_vertex [edge] [V_AVAL ] = v2; + + if (db) + printf (" %s = %2d = [%s, %s] = [%d,%d]\n", h_edge_name[edge], edge, + h_vertex_name[v1], h_vertex_name[v2], v1, v2); +} +// ====================================================== setQuadEdge +void Globale::setQuadEdge (EnumHQuad face, EnumHEdge c1, EnumHEdge c2, + EnumHEdge c3, EnumHEdge c4) +{ + quad_edge [face] [E_A] = c1; + quad_edge [face] [E_B] = c2; + quad_edge [face] [E_C] = c3; + quad_edge [face] [E_D] = c4; +} +// ====================================================== setopposedVertex +void Globale::setOpposedVertex (EnumHVertex lun, EnumHVertex lautre) +{ + h_opposed_vertex [lun] = lautre; + h_opposed_vertex [lautre] = lun; +} +// ====================================================== setopposedQuad +void Globale::setOpposedQuad (EnumHQuad lun, EnumHQuad lautre) +{ + h_opposed_quad [lun] = lautre; + h_opposed_quad [lautre] = lun; +} +// ====================================================== setNames +void Globale::setNames () +{ +#define SetNameHexaVertex(v) h_vertex_name [v] = #v +#define SetNameHexaEdge(e) h_edge_name [e] = #e +#define SetNameHexaQuad(q) h_quad_name [q] = #q + + SetNameHexaVertex ( V_ACE ); + SetNameHexaVertex ( V_ACF ); + SetNameHexaVertex ( V_ADF ); + SetNameHexaVertex ( V_ADE ); + SetNameHexaVertex ( V_BCE ); + SetNameHexaVertex ( V_BCF ); + SetNameHexaVertex ( V_BDF ); + SetNameHexaVertex ( V_BDE ); + + SetNameHexaEdge ( E_AC ); + SetNameHexaEdge ( E_AF ); + SetNameHexaEdge ( E_AD ); + SetNameHexaEdge ( E_AE ); + SetNameHexaEdge ( E_BC ); + SetNameHexaEdge ( E_BF ); + SetNameHexaEdge ( E_BD ); + SetNameHexaEdge ( E_BE ); + SetNameHexaEdge ( E_CE ); + SetNameHexaEdge ( E_CF ); + SetNameHexaEdge ( E_DF ); + SetNameHexaEdge ( E_DE ); + + SetNameHexaQuad ( Q_A ); + SetNameHexaQuad ( Q_B ); + SetNameHexaQuad ( Q_C ); + SetNameHexaQuad ( Q_D ); + SetNameHexaQuad ( Q_E ); + SetNameHexaQuad ( Q_F ); +} + +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexGlobale.hxx b/src/HEXABLOCK/HexGlobale.hxx new file mode 100755 index 0000000..6418792 --- /dev/null +++ b/src/HEXABLOCK/HexGlobale.hxx @@ -0,0 +1,121 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// Singleton : Var globales : Disposition sommets/aretes/faces d'un hexaedre + +#ifndef _HEX_GLOBALE_H +#define _HEX_GLOBALE_H + +#include "hexa_base.hxx" + +/* ----------------------------------------------------- + + // ---- Numerotation des faces (%x) + + 6=bed +----bd-----+ bdf=7 + /| /| + be | B bf | + / | / | + 4=bce +----bc-----+...|...bcf=5 + | de D | df + | E | | F | z + ce | C cf | ^ + 2=ade...|...+----ad-|---+ adf=3 | y + | / | / | / + | ae A | af | / + |/ |/ |/ + 0=ace +----ac-----+ acf=1 +-----> x + + * ----------------------------------------------------- */ + + +BEGIN_NAMESPACE_HEXA + +class Globale +{ +public : + static Globale* getInstance (); + + int CoordVertex (int edge, EnumCoord dim) + { return coord_vertex [edge] [dim] ; } + + EnumHVertex EdgeVertex (int edge, EnumVertex sens) + { return edge_vertex [edge] [sens] ; } + + EnumHEdge QuadEdge (int face, EnumQuad cote) + { return quad_edge [face] [cote] ; } + + cpchar namofHexaEdge (int arete) { return h_edge_name [arete] ; } + cpchar namofHexaVertex (int sommet) { return h_vertex_name [sommet]; } + cpchar namofHexaQuad (int face) { return h_quad_name [face]; } + + EnumHQuad getOpposedQuad (int face) { return h_opposed_quad [face]; } + + void setArgs (int nbargs, cpchar tabargs[]); + int findArg (cpchar opt); + bool isinArgs (cpchar opt) { return findArg (opt) >= 0; } + cpchar getArg (int nro) { return nro>=nbr_args ? NULL : tab_args[nro]; } + +private : + Globale (); // Constructeur prive + + void setCoordVertex (EnumHVertex node, int px, int py, int pz); + void setEdgeVertex (EnumHEdge edge, EnumHVertex amont, EnumHVertex aval); + void setQuadEdge (EnumHQuad face, EnumHEdge c1, EnumHEdge c2, + EnumHEdge c3, EnumHEdge c4); + void setOpposedVertex (EnumHVertex lun, EnumHVertex lautre); + void setOpposedQuad (EnumHQuad lun, EnumHQuad lautre); + + void setNames (); + +private : + int nbr_args; + cpchar* tab_args; + + int coord_vertex [HV_MAXI] [DIM3]; + EnumHVertex edge_vertex [HE_MAXI] [V_TWO]; + EnumHEdge quad_edge [HQ_MAXI] [QUAD4]; + + cpchar h_edge_name [HE_MAXI]; + cpchar h_vertex_name [HV_MAXI]; + cpchar h_quad_name [HQ_MAXI]; + + EnumHVertex h_opposed_vertex [HV_MAXI]; + EnumHQuad h_opposed_quad [HQ_MAXI]; + + static Globale* unique_instance; +}; +// ===================================================== setArgs +inline void Globale::setArgs (int nbargs, cpchar tabargs[]) +{ + nbr_args = nbargs; + tab_args = tabargs; +} +// ===================================================== findArg +inline int Globale::findArg (cpchar option) +{ + for (int nro=1 ; nroisDeleted() || grp_typelt != elt->getType()) + return HERR; + + grp_table.push_back (elt); + return HOK; +} +// ======================================================== findElement +int Group::findElement (EltBase* elt) +{ + int nbelts = grp_table.size (); + for (int nro=0 ; nro < nbelts ; nro++) + if (grp_table[nro]==elt) + return nro; + + return NOTHING; +} +// ======================================================== removeElement +int Group::removeElement (int nro) +{ + int nbelts = grp_table.size (); + + if (nro<0 || nro >= nbelts) + return HERR; + + grp_table.erase (grp_table.begin() + nro); + return HOK; +} +// ======================================================== removeElement +int Group::removeElement (EltBase* elt) +{ + int nro = findElement (elt); + int ier = removeElement (nro); + return ier; +} +// ======================================================== saveXml +void Group::saveXml (XmlWriter* xml) +{ + char buffer[16]; + int nbelts = grp_table.size (); + + xml->addMark ("Group"); + + xml->openMark ("Identification"); + xml->addAttribute ("name", grp_name); + xml->addAttribute ("kind", kind_name [grp_kind]); + xml->closeMark (); + + for (int nro=0 ; nroisHere ()) + { + xml->openMark ("Element"); + xml->addAttribute ("id", grp_table[nro]->getName (buffer)); + xml->closeMark (); + } + } + xml->closeMark (); +} +// ======================================================== getKind +EnumGroup Group::getKind (cpchar kind) +{ + int nbk = sizeof (kind_name) / sizeof (cpchar); + for (int nro=0; nro grp_table; +}; + +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexHexa.cxx b/src/HEXABLOCK/HexHexa.cxx new file mode 100755 index 0000000..5ababf1 --- /dev/null +++ b/src/HEXABLOCK/HexHexa.cxx @@ -0,0 +1,1071 @@ + +// C++ : Gestion des Hexaedres + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "HexHexa.hxx" +#include "HexQuad.hxx" + +#include "HexVertex.hxx" +#include "HexDocument.hxx" +#include "HexEdge.hxx" + +#include "HexGlobale.hxx" +#include "HexXmlWriter.hxx" +#include "HexDiagnostics.hxx" +#include "HexGlobale.hxx" +#include "HexMatrix.hxx" +#include "HexElements.hxx" + +BEGIN_NAMESPACE_HEXA + +// ======================================================== Constructeur +Hexa::Hexa (Vertex* va, Vertex* vb, Vertex* vc, Vertex* vd, + Vertex* ve, Vertex* vf, Vertex* vg, Vertex* vh) + : EltBase (va->dad(), EL_HEXA) +{ + h_vertex [V_ACE] = va; + h_vertex [V_ACF] = vb; // = vc ; Modif Abu 30/08/2011 + h_vertex [V_ADE] = vc; // = vb ; Modif Abu 30/08/2011 + h_vertex [V_ADF] = vd; + + h_vertex [V_BCE] = ve; + h_vertex [V_BCF] = vf; // = vg ; Modif Abu 30/08/2011 + h_vertex [V_BDE] = vg; // = vf ; Modif Abu 30/08/2011 + h_vertex [V_BDF] = vh; + + h_clone = NULL; + + controlerSommets (); + + Globale* glob = Globale::getInstance (); + + for (int nro=0 ; nroEdgeVertex (nro, V_AMONT)], + h_vertex[glob->EdgeVertex (nro, V_AVAL)]); + } + + for (int nro=0 ; nroQuadEdge (nro, E_A)], + h_edge [glob->QuadEdge (nro, E_B)], + h_edge [glob->QuadEdge (nro, E_C)], + h_edge [glob->QuadEdge (nro, E_D)]); + + h_quad[nro] -> addParent (this); + } + majReferences (); +} +// ======================================================== Constructeur 2 +Hexa::Hexa (Quad* qa, Quad* qb, Quad* qc, Quad* qd, Quad* qe, Quad* qf) + : EltBase (qa->dad(), EL_HEXA) +{ + h_quad [Q_A] = qa; + h_quad [Q_B] = qb; + h_quad [Q_C] = qc; + h_quad [Q_D] = qd; + h_quad [Q_E] = qe; + h_quad [Q_F] = qf; + h_clone = NULL; + + for (int nb=0 ; nbdump (); + // printf (" +++++++++++++++++++++++++++++++++++++++++++ \n"); + dumpFull (); + for (int nro=0; nroel_root, EL_HEXA) +{ + for (int nro=0 ; nroaddParent (this); +} +// ======================================================== controlerArete +void Hexa::controlerArete (int arete, int face1, int face2) +{ + h_edge [arete] = h_quad[face1]->commonEdge (h_quad[face2]); + if (h_edge [arete]==NULL) + { + el_root->putError (W_H_BAD_EDGE, + el_root->glob->namofHexaEdge (arete)); + el_status = 888; + } +} +// ======================================================== controlerSomet +void Hexa::controlerSommet (int node, int ne1, int ne2, int ne3) +{ + if (h_edge[ne1] == NULL || h_edge[ne2] == NULL || h_edge[ne3] == NULL) + return; + + Vertex* hv = h_edge[ne1]->commonVertex (h_edge[ne2]); + h_vertex [node] = hv; + if (hv == NULL) + { + el_root->putError (W_H_BAD_VERTEX, + el_root->glob->namofHexaVertex(node)); + el_status = 888; + } + else if (hv == NULL || h_edge[ne3]->index (hv)<0) + { + char b[10]; + el_root->putError (W_H_BAD_VERTEX, + el_root->glob->namofHexaVertex(node)); + el_status = 888; + printf ("%s = %s\n", el_root->glob->namofHexaVertex(node), + hv->getName(b)); + printf ("%s = %s\n", el_root->glob->namofHexaEdge(ne1), + h_edge[ne1]->getName(b)); + printf ("%s = %s\n", el_root->glob->namofHexaEdge(ne2), + h_edge[ne2]->getName(b)); + printf ("%s = %s\n", el_root->glob->namofHexaEdge(ne3), + h_edge[ne3]->getName(b)); + } +} +// ======================================================== controlerFaces +void Hexa::controlerFaces () +{ + for (int n1=0 ; n1putError (W_H_NULL_QUAD, + el_root->glob->namofHexaQuad (n1)); + el_status = 886; + return; + } + for (int n2=n1+1 ; n2putError (W_H_EQ_QUAD, + el_root->glob->namofHexaQuad (n1), + el_root->glob->namofHexaQuad (n2)); + el_status = 888; + } + } +} +// ======================================================== controlerSommets +void Hexa::controlerSommets () +{ + for (int n1=0 ; n1putError (W_H_NULL_QUAD, + el_root->glob->namofHexaVertex (n1)); + el_status = 886; + return; + } + for (int n2=n1+1 ; n2putError (W_H_EQ_QUAD, + el_root->glob->namofHexaVertex (n1), + el_root->glob->namofHexaVertex (n2)); + el_status = 888; + } + } +} +// ======================================================== verifierAretes +void Hexa::verifierAretes () +{ + for (int nro=0 ; nroh_quad[nf2]) + return h_quad[nf1]; + + return NULL; +} +// ------------------------------------------------------------------- +// Debug +// ------------------------------------------------------------------- +// ======================================================= razNodes +void Hexa::razNodes () +{ + for (int nb=0 ; nbsetMark (NO_COUNTED); +} +// ======================================================= countNodes +int Hexa::countNodes () +{ + int nombre = 0; + for (int nb=0 ; nbgetMark () == NO_COUNTED) + { + h_vertex[nb]->setMark (NO_USED); + nombre ++; + } + + return nombre; +} +// ======================================================= printNodes +void Hexa::printNodes (pfile vtk, int& compteur) +{ + const double minvtk = 1e-30; + Real3 koord; + + for (int nb=0 ; nbgetMark()==NO_USED) + { + h_vertex[nb]->getPoint (koord); + for (int nc=dir_x ; nc<=dir_z ; nc++) + if (koord [nc] < minvtk && koord [nc] > -minvtk) + koord[nc] = 0.0; + + fprintf (vtk, "%g %g %g\n", koord[dir_x], koord[dir_y], koord[dir_z]); + h_vertex[nb]->setMark (compteur); + compteur ++; + } +} +// ======================================================= colorNodes +void Hexa::colorNodes (pfile vtk) +{ + for (int nb=0 ; nbgetMark()>=0) + { + double color = 100*(h_vertex[nb]->getScalar()+1); + fprintf (vtk, "%g\n", color); + h_vertex[nb]->setMark (NO_COUNTED); + } +} +// ======================================================= moveNodes +void Hexa::moveNodes (Matrix* matrice) +{ + for (int nb=0 ; nbgetMark()!=IS_USED) + { + matrice->perform (h_vertex[nb]); + h_vertex[nb]->setMark (IS_USED); + } +} +// ======================================================= transform +void Hexa::transform (Matrix* matrice) +{ + for (int nb=0 ; nbperform (h_vertex[nb]); +} +// ======================================================= printHexa +void Hexa::printHexa (pfile vtk) +{ + fprintf (vtk, "%d", HV_MAXI); + + fprintf (vtk, " %d", h_vertex[V_ACE]->getMark ()); + fprintf (vtk, " %d", h_vertex[V_ACF]->getMark ()); + fprintf (vtk, " %d", h_vertex[V_ADF]->getMark ()); + fprintf (vtk, " %d", h_vertex[V_ADE]->getMark ()); + + fprintf (vtk, " %d", h_vertex[V_BCE]->getMark ()); + fprintf (vtk, " %d", h_vertex[V_BCF]->getMark ()); + fprintf (vtk, " %d", h_vertex[V_BDF]->getMark ()); + fprintf (vtk, " %d", h_vertex[V_BDE]->getMark ()); + + fprintf (vtk, "\n"); +} +// ======================================================== hasFreEdges +bool Hexa::hasFreeEdges () +{ + if (isDeleted()) + return false; + + for (int nro=0; nrogetMark()<0) + return true; + + return false; +} +// ======================================================== propager +void Hexa::propager (Propagation* prop, int nro) +{ + if (isDeleted()) + return; + + for (int nro=0; nrogetMark()<0) + h_edge[nro]->propager (prop, nro); +} +// ========================================================= saveXml +void Hexa::saveXml (XmlWriter* xml) +{ + char ident[12]; + string quads; + + for (int nro=0 ; nro0) quads += " "; + quads += h_quad[nro]->getName(ident); + } + + getName (ident); + xml->openMark ("Hexa"); + xml->addAttribute ("id", ident); + xml->addAttribute ("quads", quads); + if (el_name!=ident) + xml->addAttribute ("name", el_name); + xml->closeMark (); +} +// ========================================================= findQuad +int Hexa::findQuad (Quad* element) +{ + for (int nro=0 ; nrogetEdge (nro)); + int pnode = findVertex (quad->getVertex (nro)); + int oppq = findOpposedQuad (quad, quad->getEdge (nro)); + + ind_edge [nro] = pedge; + ind_opp_quad [nro] = oppq; + + if (pedge==NOTHING || pnode==NOTHING || oppq==NOTHING) + return NULL; + + make_quad [nro] = h_quad[oppq]->getNbrParents() == 2; + make_edge [nro ] = make_edge [nro ] || make_quad [nro]; + make_edge [nro1] = make_edge [nro1] || make_quad [nro]; + + if (debug()) + { + printf (" Sommet nro %d : ", nro); + quad->getVertex(nro)->printName (", "); + printf (" edge = "); + quad->getEdge(nro)->printName (", "); + printf (" quad oppose = "); + h_quad[oppq]->printName(""); + if (make_quad [nro]) + printf (" a dissocier\n"); + else + printf ("\n"); + + } + } + + Vertex* new_node [QUAD4]; + Edge* new_opp_edge [QUAD4]; + Edge* old_opp_edge [QUAD4]; + + for (int nro=0 ; nrogetVertex (nro); + new_node [nro] = new Vertex (o_v0); + if (debug()) + { + printf (" quad.vertex [%d] = ", nro); + quad->getVertex (nro)->printName (" --> "); + new_node [nro]->printName ("\n"); + } + + if (make_edge[nro]) + { + Quad* pface = h_quad [ind_opp_quad [nro]]; + int bid; + int ncut = pface->inter (quad, bid); + Edge* ecut = pface->getEdge ((ncut+1) MODULO QUAD4); + Vertex* vopp = ecut->getVertex(V_AMONT); + if (vopp==o_v0) + vopp = ecut->getVertex (V_AVAL); + else if (o_v0 != ecut->getVertex (V_AVAL)); + { + ecut = pface->getEdge ((ncut+3) MODULO QUAD4); + vopp = ecut->getVertex(V_AMONT); + if (vopp==o_v0) + vopp = ecut->getVertex (V_AVAL); + else if (o_v0 != ecut->getVertex (V_AVAL)) + return NULL; + } + + old_opp_edge [nro] = ecut; + new_opp_edge [nro] = new Edge (new_node[nro], vopp); + if (debug()) + { + printf (" quad.opp_edge [%d] = ", nro); + old_opp_edge [nro]->printName (" --> "); + new_opp_edge [nro]->printName ("\n"); + } + } + } + + Quad* new_quad = new Quad (new_node[0], new_node[1], new_node[2], + new_node[3]); + + Quad* new_opp_quad [QUAD4]; + Quad* old_opp_quad [QUAD4]; + for (int nro=0 ; nrogetEdge (nro); + Edge* n_edge1 = new_opp_edge [nro]; + Edge* n_edge3 = new_opp_edge [nro1]; + + int iv1 = n_edge1->inter (n_edge0); + int iv3 = n_edge3->inter (n_edge0); + if (iv1 <0 || iv3 <0) + return NULL; + + Quad* o_face = h_quad [ind_opp_quad [nro]]; + Edge* edge2 = o_face->findEdge (n_edge1->getVertex (1-iv1), + n_edge3->getVertex (1-iv3)); + if (edge2==NULL) + return NULL; + // Edge* o_edge0 = h_edge [ind_edge [nro]]; + // int sens = 1; + // Edge* edge2 = o_face->getOpposEdge (o_edge0, sens); + + old_opp_quad [nro] = o_face; + if (debug()) + printf (" -------- Quad oppose nro %d\n", nro); + new_opp_quad [nro] = new Quad (n_edge0, n_edge1, edge2, n_edge3); + } + } + + replaceQuad (quad, new_quad); + for (int nro=0 ; nrogetEdge (nro)); + if (make_edge[nro]) + replaceEdge (old_opp_edge [nro], new_opp_edge [nro]); + } + + for (int nro=0 ; nrogetVertex(nro), new_node[nro]); + } + + + h_quad [nface] = new_quad; + if (debug()) + { + printf (" ... Apres disconnectQuad, new_quad="); + new_quad->printName ("\n"); + dumpFull (); + } + + Elements* nouveaux = new Elements (el_root); + nouveaux->addQuad (new_quad); + for (int nro=0 ; nroaddEdge (new_quad->getEdge (nro)); + nouveaux->addVertex (new_quad->getVertex (nro)); + if (make_edge[nro]) + nouveaux->addEdge (new_opp_edge [nro]); + if (make_quad[nro]) + nouveaux->addQuad (new_opp_quad [nro]); + } + nouveaux->moveDisco (this); + return nouveaux; +} +// ========================================================= disconnectEdge +Elements* Hexa::disconnectEdge (Edge* arete) +{ + int nedge = findEdge (arete); + int namont = findVertex (arete->getVertex(V_AMONT)); + int naval = findVertex (arete->getVertex(V_AVAL )); + + if (nedge==NOTHING || namont==NOTHING || naval==NOTHING) + return NULL; + + if (debug()) + { + printf (" ... Avant disconnectEdge, arete="); + arete->printName ("\n"); + dumpFull (); + } + + Edge* n_edge [HE_MAXI]; + Quad* n_quad [HQ_MAXI]; + Vertex* n_vertex [HV_MAXI]; + + for (int nro=0 ; nrogetVertex (V_AMONT); + Vertex* old_aval = arete->getVertex (V_AVAL ); + Vertex* new_amont = n_vertex [namont] = new Vertex (old_amont); + Vertex* new_aval = n_vertex [naval] = new Vertex (old_aval); + n_edge [nedge] = new Edge (new_amont, new_aval); + + // Un edge non remplace, qui contient un vertex remplace + // commun a plus de 2 faces (donc appartenant a un autre hexa) + // doit etre duplique + + for (int nro=0 ; nrogetNbrParents()>2) + { + Vertex* va = h_edge[nro]->getVertex (V_AMONT); + Vertex* vb = h_edge[nro]->getVertex (V_AVAL); + + if (va==old_amont) + n_edge [nro] = new Edge (new_amont, vb); + else if (va==old_aval) + n_edge [nro] = new Edge (new_aval, vb); + else if (vb==old_amont) + n_edge [nro] = new Edge (va, new_amont); + else if (vb==old_aval) + n_edge [nro] = new Edge (va, new_aval); + } + } + + // Un quad non remplace, qui contient un edge remplace + // commun a plus de 2 Hexas + // doit etre duplique + + Globale* glob = Globale::getInstance(); + for (int nro=0 ; nrogetNbrParents()>1) + { + Edge* qedge[QUAD4]; + bool duplic = false; + for (int ned=0 ; nedQuadEdge (nro, (EnumQuad)ned); + if (n_edge [ndup] ==NULL) + qedge [ned] = h_edge[ndup]; + else + { + qedge [ned] = n_edge[ndup]; + duplic = true; + } + } + if (duplic) + n_quad[nro] = new Quad (qedge[Q_A], qedge[Q_B], + qedge[Q_C], qedge[Q_D]); + } + + Elements* nouveaux = new Elements (el_root); + for (int nro=0 ; nroaddQuad (n_quad[nro]); + } + + for (int nro=0 ; nroaddEdge (n_edge[nro]); + } + + for (int nro=0 ; nroaddVertex (n_vertex[nro]); + } + + if (debug()) + { + printf (" ... Apres disconnectEdge\n"); + dumpFull (); + } + + nouveaux->moveDisco (this); + return nouveaux; +} +// ========================================================= disconnectVertex +Elements* Hexa::disconnectVertex (Vertex* noeud) +{ + if (debug()) + { + printf (" ... Avant disconnectVertex, vertex="); + noeud->printName ("\n"); + dumpFull (); + } + + int node = findVertex (noeud); + if (node==NOTHING) + return NULL; + + Vertex* new_node = new Vertex (noeud); + Quad* new_quad [HQ_MAXI]; + Edge* new_edge [HE_MAXI]; + + for (int nro=0 ; nroindexVertex(noeud) >= 0 + && h_quad[nro]->getNbrParents () >= 2) + { + int nbmod = 0; + Edge* tedge [QUAD4]; + for (int qed=0 ; qedgetEdge (qed); + int indv = arete->index (noeud); + if (indv>=0) + { + nbmod++; + int hed = findEdge (arete); + if (hed<0) + return NULL; + if (new_edge [hed]==NULL) + new_edge [hed] = new Edge (new_node, + arete->getVertex(1-indv)); + tedge [qed] = new_edge [hed]; + } + } + if (nbmod!=2) + return NULL; + new_quad [nro] = new Quad (tedge[0], tedge[1], tedge[2], tedge[3]); + } + } + + Elements* nouveaux = new Elements (el_root); + + for (int nro=0 ; nroaddQuad (new_quad[nro]); + } + + for (int nro=0 ; nroaddEdge (new_edge[nro]); + } + + replaceVertex (noeud, new_node); + nouveaux->addVertex (new_node); + + + if (debug()) + { + printf (" ... Apres disconnectVertex\n"); + dumpFull (); + } + + nouveaux->moveDisco (this); + return nouveaux; +} +// ========================================================= getBase +int Hexa::getBase (Vertex* orig, Edge* normale) +{ + for (int nq=0 ; nqindexVertex(orig) >= 0 + && h_quad[nq]->indexEdge (normale) < 0) + return nq; + } + return NOTHING; +} +// ======================================================== replaceQuad +void Hexa::replaceQuad (Quad* old, Quad* par) +{ + for (int nro=0 ; nroprintName (" est remplace par "); + par->printName ("\n"); + } + } + } + +} +// ======================================================== replaceEdge +void Hexa::replaceEdge (Edge* old, Edge* par) +{ + for (int nro=0 ; nroprintName (" est remplace par "); + par->printName ("\n"); + } + } + } + + for (int nro=0 ; nroreplaceEdge (old, par); + } +} +// ======================================================== replaceVertex +void Hexa::replaceVertex (Vertex* old, Vertex* par) +{ + for (int nro=0 ; nroprintName (" est remplace par "); + par->printName ("\n"); + } + } + } + + for (int nro=0 ; nroreplaceVertex (old, par); + } + + for (int nro=0 ; nroreplaceVertex (old, par); + } +} +// ======================================================== removeConnected +void Hexa::removeConnected () +{ + + if (el_type == EL_REMOVED) + return; + + remove(); + + for (int nro=0 ; nrogetNbrParents (); + + for (int nc=0 ; ncgetParent(nc); + if (cell!=NULL && cell->isValid ()) + cell->removeConnected (); + } + } + + for (int nro=0 ; nroremove(); + for (int nro=0 ; nroremove(); + for (int nro=0 ; nroremove(); +} +// ======================================================== findOpposedQuad +int Hexa::findOpposedQuad (Quad* face, Edge* arete) +{ + for (int nro=0 ; nroindexEdge (arete) >=0) + return nro; + } + + return NOTHING; +} +// ========================================================= dump +void Hexa::dump () +{ + printName(" = ("); + if (NOT isHere ()) + { + printf ("*** deleted ***)\n"); + return; + } + + for (int nro=0; nroprintName (""); + printf ( " (%g, %g, %g)\n", pv->getX(), pv->getY(), pv->getZ()); + } + else + { + printf ( "NULL\n"); + } + } +} +// ======================================================== dumpFull +void Hexa::dumpFull () +{ + dump (); + Globale* glob = Globale::getInstance (); + + printf ("\n"); + for (int nro=0; nroprintName (" = ("); + for (int nc=0; ncgetEdge(nc)->printName (); + printf (")\n"); + printf (" = ("); + for (int nc=0; ncgetVertex(nc)->printName (); + printf (")\n"); + } + } + + printf ("\n"); + for (int nro=0; nroprintName (" = ("); + for (int nc=0; ncgetVertex(nc)->printName (); + printf (")\n"); + } + } + printf ("\n"); + + for (int nro=0; nroprintName (" = ("); + printf ("%g, %g, %g)\n", pv->getX(), pv->getY(), pv->getZ()); + } + } + printf ("\n"); +} +// ======================================================== getOpposedQuad +Quad* Hexa::getOpposedQuad (Quad* face) +{ + if (face == h_quad [Q_A]) return h_quad [Q_B]; + else if (face == h_quad [Q_B]) return h_quad [Q_A]; + else if (face == h_quad [Q_C]) return h_quad [Q_D]; + else if (face == h_quad [Q_D]) return h_quad [Q_C]; + else if (face == h_quad [Q_E]) return h_quad [Q_F]; + else if (face == h_quad [Q_F]) return h_quad [Q_F]; + else return NULL; +} +// ========================================================= findQuad +Quad* Hexa::findQuad (Edge* ed1, Edge* ed2) +{ + for (int nro=0 ; nroindexEdge (ed1) >= 0 + && h_quad[nro]->indexEdge (ed2) >= 0) + return h_quad [nro]; + } + + return NULL; +} +// ========================================================= findEdge +Edge* Hexa::findEdge (Vertex* v1, Vertex* v2) +{ + for (int nro=0 ; nroindex (v1) >= 0 + && h_edge[nro]->index (v2) >= 0) + return h_edge [nro]; + } + + return NULL; +} +// ====================================================== getPerpendicularEdge +Edge* Hexa::getPerpendicularEdge (Quad* quad, Vertex* vertex) +{ + if (quad==NULL || vertex==NULL) + return NULL; + + int nv = quad->indexVertex (vertex); + int nq = findQuad (quad); + if (nv<0 || nq<0) + return NULL; + + for (int nro=0 ; nroindexEdge (h_edge[nro])<0 && h_edge[nro]->index(vertex)>=0) + return h_edge [nro]; + } + + return NULL; +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexHexa.hxx b/src/HEXABLOCK/HexHexa.hxx new file mode 100755 index 0000000..b1d2d05 --- /dev/null +++ b/src/HEXABLOCK/HexHexa.hxx @@ -0,0 +1,233 @@ + +// class : Les hexaedres + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +/* ----------------------------------------------------- + + // ---- Numerotation des faces (%x) + + 6=bed +----bd-----+ bdf=7 + /| /| + be | B bf | + / | / | + 4=bce +----bc-----+...|...bcf=5 + | de D | df + | E | | F | z + ce | C cf | ^ + 2=ade...|...+----ad-|---+ adf=3 | y + | / | / | / + | ae A | af | / + |/ |/ |/ + 0=ace +----ac-----+ acf=1 +-----> x + + * ----------------------------------------------------- */ +#ifndef __HEX_HEXA_H_ +#define __HEX_HEXA_H_ + +#include "HexEltBase.hxx" + +#include "HexQuad.hxx" +#include "HexEdge.hxx" +#include "HexVertex.hxx" + +BEGIN_NAMESPACE_HEXA + +class Hexa : public EltBase +{ +public: + virtual Quad* getQuad (int nro); + virtual Edge* getEdge (int nro); + virtual Vertex* getVertex (int nro); + + virtual int countQuad () { return HQ_MAXI; } + virtual int countEdge () { return HE_MAXI; } + virtual int countVertex () { return HV_MAXI; } + +public: + Hexa (Vertex* v1, Vertex* v2, Vertex* v3, Vertex* v4, + Vertex* v5, Vertex* v6, Vertex* v7, Vertex* v8); + Hexa (Quad* qa, Quad* qb, Quad* qc, Quad* qd, Quad* qe, Quad* qf); + Hexa (Hexa* other); + Quad* Inter (Hexa* other); + bool definedBy (Vertex* v1, Vertex* v2); + bool definedBy (Quad* va, Quad* v2); + virtual void dump (); + virtual void dumpPlus (); + virtual void dumpFull (); + + void razNodes (); + int countNodes (); // Compte et numerote les noeuds + void printNodes (pfile vtk, int& count); // Impression format vtk + void colorNodes (pfile vtk); // Impression scalaires vtk + void moveNodes (Matrix* matrice); // transfo controlee ds un ensemble + void transform (Matrix* matrice); // transfo indivituelle + void printHexa (pfile vtk); // Impression de la cellule + virtual void majReferences(); // M.A.J relation "utilise par" + + bool hasFreeEdges (); + void propager (Propagation* prop, int nro); + void setScalar (double valeur); + void setColor (double valeur) { setScalar (valeur) ; } + + virtual void saveXml (XmlWriter* xml); + + Elements* disconnectQuad (Quad* face); + Elements* disconnectEdge (Edge* arete); + Elements* disconnectVertex (Vertex* noeud); + + int getBase (Vertex* orig, Edge* normale); + + void replaceQuad (Quad* old, Quad* nouveau); + void replaceEdge (Edge* old, Edge* nouveau); + void replaceVertex (Vertex* old, Vertex* nouveau); + void removeConnected (); + void markElements (int marque); + double* getCenter (double centre[]); + + virtual void duplicate (); + Hexa* getClone () { return h_clone ; } + Quad* getOpposedQuad (Quad* face); + Vertex* getOpposedVertex (Quad* face, Vertex* vertex); + Edge* getPerpendicularEdge (Quad* face, Vertex* vertex); + Edge* getParallelEdge (Quad* face, Edge* edge); + Quad* findQuad (Edge* e1, Edge* e2); + Edge* findEdge (Vertex* v1, Vertex* v2); + + int findQuad (Quad* element); + int findEdge (Edge* element); + int findVertex (Vertex* element); + + +private: + friend class Cloner; + void OrdonnerAretes (); // obsolete ? + void OrdonnerSommets (); // obsolete ? + + void controlerFaces (); // Controle primaire des donnees utilisateur + void controlerSommets (); // Idem; + + void verifierSommets (); // Controle de coherence des quads + void verifierAretes (); // Idem + + void controlerArete (int arete, int face1, int face2); + void controlerSommet (int node, int arete1, int arete2, int arete3); + + int findOpposedQuad (Quad* face, Edge* arete); + +private: + Quad* h_quad [HQ_MAXI]; + Edge* h_edge [HE_MAXI]; + Vertex* h_vertex [HV_MAXI]; + Hexa* h_clone; +}; +// ------------------------------------------------------------ inlining +// ============================================================ getQuad +inline Quad* Hexa::getQuad (int nro) +{ + Quad* elt = NULL; + if (nro >=0 && nro < HQ_MAXI && el_status == HOK && h_quad [nro]->isValid()) + elt = h_quad [nro]; + + return elt; +} +// ============================================================ getEdge +inline Edge* Hexa::getEdge (int nro) +{ + Edge* elt = NULL; + if (nro >=0 && nro < HE_MAXI && el_status == HOK && h_edge [nro]->isValid()) + elt = h_edge [nro]; + + return elt; +} +// ============================================================ getVertex +inline Vertex* Hexa::getVertex (int nro) +{ + Vertex* elt = NULL; + if (nro >=0 && nro < HV_MAXI && el_status == HOK && h_vertex [nro]->isValid()) + elt = h_vertex [nro]; + + return elt; +} +// ============================================================ getCenter +inline double* Hexa::getCenter (double centre[]) +{ + centre [dir_x] = centre [dir_y] = centre [dir_z] = 0; + + for (int nv=0 ; nvgetX (); + centre [dir_y] += h_vertex[nv]->getY (); + centre [dir_z] += h_vertex[nv]->getZ (); + } + + centre [dir_x] /= HV_MAXI; + centre [dir_y] /= HV_MAXI; + centre [dir_z] /= HV_MAXI; + return centre; +} +// =============================================================== definedBy +inline bool Hexa::definedBy (Vertex* v1, Vertex* v2) +{ + for (int n1=0 ; n1< HV_MAXI ; n1++) + { +// ( Diagonale ) Dessus + int n2 = (n1 + 2) MODULO HV_MAXI + HV_MAXI; + if ( (v1 == h_vertex[n1] && v2 == h_vertex[n2]) + || (v1 == h_vertex[n2] && v2 == h_vertex[n1])) return true; + } + return false; +} +// =============================================================== definedBy +inline bool Hexa::definedBy (Quad* qa, Quad* qb) +{ + for (int nc=0 ; nc< 3 ; nc++) + { + if ( (qa == h_quad[2*nc] && qb == h_quad[2*nc+1]) + || (qa == h_quad[2*nc+1] && qb == h_quad[2*nc])) return true; + } + return false; +} +// =============================================================== setScalar +inline void Hexa::setScalar (double val) +{ + for (int nc=0 ; nc< HV_MAXI ; nc++) + h_vertex[nc] -> setScalar (val); +} +// ============================================================== markElements +inline void Hexa::markElements (int marque) +{ + for (int nc=0 ; nc< HQ_MAXI ; nc++) h_quad [nc] -> setMark (marque); + for (int nc=0 ; nc< HE_MAXI ; nc++) h_edge [nc] -> setMark (marque); + for (int nc=0 ; nc< HV_MAXI ; nc++) h_vertex[nc] -> setMark (marque); +} +// =============================================================== duplicate +inline void Hexa::duplicate () +{ + h_clone = new Hexa (GetClone (h_quad [Q_A]), + GetClone (h_quad [Q_B]), + GetClone (h_quad [Q_C]), + GetClone (h_quad [Q_D]), + GetClone (h_quad [Q_E]), + GetClone (h_quad [Q_F])); +} +END_NAMESPACE_HEXA +#endif + diff --git a/src/HEXABLOCK/HexKasBiCylinder.cxx b/src/HEXABLOCK/HexKasBiCylinder.cxx new file mode 100755 index 0000000..1312b4b --- /dev/null +++ b/src/HEXABLOCK/HexKasBiCylinder.cxx @@ -0,0 +1,297 @@ +// +// CC++ : Interface Cascade de la classe Elements +// +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexKasBiCylinder.hxx" +#include "HexKasLine.hxx" +#include "HexKas_functions.hxx" + +#ifndef NO_CASCADE + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +// HEXABLOCK includes +#include "HexVertex.hxx" +#include "HexEdge.hxx" +#include "HexShape.hxx" +#include "HexDiagnostics.hxx" + // Cercles +#include +#include + +#include +#include + +#include +#include + +#include + // Sphere +#include + // Cylindre +#include +#include +#include +#include + // Decoupage +#include +#include + +BEGIN_NAMESPACE_HEXA + +static bool db = false; + +static KasBiCylinder current_bicyl; + +// ====================================================== purge +void KasBiCylinder::purge () +{ + no_inter = true; + inter_line.clear (); +} +// ====================================================== defineCyls +int KasBiCylinder::defineCyls (double* borig, double* bnorm, double* bbase, + double brayon, double bhaut, + double* sorig, double* snorm, double* sbase, + double srayon, double shaut) +{ + db = on_debug (); + purge (); + if (db) + { + printf (" ====================== defineCyls\n"); + printf (" ----- borig=(%g,%g,%g)\n", borig[0], borig[1], borig[2]); + printf (" ----- bbase=(%g,%g,%g)\n", bbase[0], bbase[1], bbase[2]); + printf (" ----- bnorm=(%g,%g,%g)\n", bnorm[0], bnorm[1], bnorm[2]); + printf (" ----- brayon=%g, bhaut=%g\n", brayon, bhaut); + printf ("\n"); + printf (" ----- sorig=(%g,%g,%g)\n", sorig[0], sorig[1], sorig[2]); + printf (" ----- sbase=(%g,%g,%g)\n", sbase[0], sbase[1], sbase[2]); + printf (" ----- snorm=(%g,%g,%g)\n", snorm[0], snorm[1], snorm[2]); + printf (" ----- srayon=%g, shaut=%g\n", srayon, shaut); + } + + // --------------------------- Preparation + gp_Pnt gpb_orig (borig [dir_x], borig [dir_y], borig [dir_z]); + gp_Vec gpb_norm (bnorm [dir_x], bnorm [dir_y], bnorm [dir_z]); + gp_Vec gpb_vx (bbase [dir_x], bbase [dir_y], bbase [dir_z]); + gp_Ax2 gpb_axes (gpb_orig, gpb_norm, gpb_vx); +// gp_Ax2 gp_axes (gp_center, gp_norm, gp_vx); + + BRepPrimAPI_MakeCylinder make_bcyl (gpb_axes, brayon, bhaut); + make_bcyl.Build(); + + gp_Pnt gps_orig (sorig [dir_x], sorig [dir_y], sorig [dir_z]); + gp_Vec gps_vx (sbase [dir_x], sbase [dir_y], sbase [dir_z]); + gp_Vec gps_norm (snorm [dir_x], snorm [dir_y], snorm [dir_z]); + gp_Ax2 gps_axes (gps_orig, gps_norm, gpb_vx); + + BRepPrimAPI_MakeCylinder make_scyl (gps_axes, srayon, shaut); + make_scyl.Build(); + + if (NOT make_bcyl.IsDone()) + { + printf ("defineCyls : Can' build big cylinder\n"); + return HERR; + } + else if (NOT make_scyl.IsDone()) + { + printf ("defineCyls : Can' build small cylinder\n"); + return HERR; + } + // --------------------------- Intersection + + TopoDS_Shape cyl_big = make_bcyl.Shape(); + TopoDS_Shape cyl_small = make_scyl.Shape(); + + BRepAlgoAPI_Section make_inter (cyl_big, cyl_small, false); + make_inter.Approximation (true); + make_inter.Build(); + + if (NOT make_inter.IsDone()) + { + printf ("defineCyls : No intersection\n"); + return HERR; + } + + TopoDS_Shape cyl_inter = make_inter.Shape(); + // geom_make_brep (cyl_inter, brep); + + // --------------------------- Recuperation + string crep; + Shape shape (crep); + + TopExp_Explorer explo (cyl_inter, TopAbs_EDGE); + int nroline = 0; + static int nbrep = 0; + while (explo.More()) + { + TopoDS_Shape ligne = explo.Current(); + // TopoDS_Edge ligne = explo.Current(); + explo.Next (); + + cout << "____________________________________ Ligne suivante" << endl; + geom_make_brep (ligne, crep); + if (db) + { + cout << "---- save_brep inter" << nbrep+1 << ".brep" << endl; + save_brep ("inter", crep, nbrep); + } + shape.setBrep (crep); + + KasLine* geom_line = new KasLine (&shape); + inter_line.push_back (geom_line); + nroline ++; + } + return HOK; +} +// ====================================================== anaVertex +// === Trouve le(s) ligne(s) contenant ce vertex et le(s) parametre(s) +int KasBiCylinder::anaVertex (Vertex* node, int* tline, double* tpara) +{ + Real3 point; + node->getPoint (point); + int nbsol = 0; + int nblines = inter_line.size(); + + for (int nl=0 ; nlfindParam (point); + if (param>=0) + { + if (db) + cout << " ... findParam " << node->getName() + << ", point=(" << point[0] << ", " << point[1] + << ", " << point[2] + << "), nl=" << nl << ", param=" << param << endl; + if (nbsol>=2) + return nbsol; + + tline [nbsol] = nl; + tpara [nbsol] = param; + nbsol ++; + } + } + + if (nbsol==1) + { + if (tpara[0]<=Epsil) + { + nbsol ++; + tpara[1] = 1.0; + tline[1] = tline[0]-1; + if (tline[1] <0) tline[1] = nblines-1; + } + else if (tpara[0]>=UnEpsil) + { + nbsol ++; + tpara[1] = 0; + tline[1] = tline[0]+1; + if (tline[1] >= nblines) tline[1] = 0; + } + } + + return nbsol; +} +// ====================================================== associate +// ==== On suppose une orientation correcte +int KasBiCylinder::associate (Edge* edge) +{ + edge->clearAssociation (); + + double tparam1 [V_TWO], tparam2 [V_TWO]; + int tline1 [V_TWO], tline2 [V_TWO]; + int sol1 = anaVertex (edge->getVertex(V_AMONT), tline1, tparam1); + int sol2 = anaVertex (edge->getVertex(V_AVAL), tline2, tparam2); + + if (sol1==0 || sol2==0) + return HERR; + // Ligne commune ? + for (int ns1=0 ; ns1= 1.0-Epsil && param1 <= 1.0+Epsil) + param1 = 0.0; + if (param2 >= -Epsil && param2 <= Epsil) + param2 = 1.0; + if (param1 < param2) + inter_line[nlig]->assoEdge (edge, param1, param2, 2); + else + // Le debut de la ligne (fermee) est entre les 2 vertex) + { + inter_line[nlig]->assoEdge (edge, param1, 1.0, V_AMONT); + inter_line[nlig]->assoEdge (edge, 0.0, param2, V_AVAL); + } + return HOK; + } + } + } + + inter_line[tline1[0]]->assoEdge (edge, tparam1[0], 1.0, V_AMONT); + inter_line[tline2[0]]->assoEdge (edge, 0, tparam2[0], V_AVAL); + return HOK; +} +// ====================================================== geom_create_cylcyl +int geom_create_cylcyl (double* borig, double* bnorm, double* bbase, + double bray, double bhaut, + double* sorig, double* snorm, double* sbase, + double sray, double shaut) +{ + int ier = current_bicyl.defineCyls (borig, bnorm, bbase, bray, bhaut, + sorig, snorm, sbase, sray, shaut); + return ier; +} +// ====================================================== geom_asso_cylcyl +int geom_asso_cylcyl (Edge* edge) +{ + cout << " ___________________________________ geom_asso_cylcyl " + << edge->getName () << " = (" << edge->getVertex(0)->getName () + << "," << edge->getVertex(1)->getName () + << ")" << endl; + + int ier = current_bicyl.associate (edge); + return ier; +} +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexKasBiCylinder.hxx b/src/HEXABLOCK/HexKasBiCylinder.hxx new file mode 100755 index 0000000..89b96dc --- /dev/null +++ b/src/HEXABLOCK/HexKasBiCylinder.hxx @@ -0,0 +1,56 @@ +// +// CC++ : Representation Cascade d'un bi-cylindre +// +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __KAS_BI_CYLINDER_HXX_ +#define __KAS_BI_CYLINDER_HXX_ + +#include "HexGlobale.hxx" + +#ifndef NO_CASCADE + +BEGIN_NAMESPACE_HEXA + +class KasLine; + +class KasBiCylinder +{ +public : + KasBiCylinder () { purge () ; } + ~KasBiCylinder () { purge () ; } + + int defineCyls (double* borig, double* bnorm, double* bbase, + double brayon, double bhaut, + double* sorig, double* snorm, double* sbase, + double srayon, double shaut); + int associate (Edge* edge); + +private : + int anaVertex (Vertex* node, int* tline, double* tpara); + void purge (); + +private : + std::vector inter_line; + bool no_inter; +}; +END_NAMESPACE_HEXA +#endif +#endif diff --git a/src/HEXABLOCK/HexKasLine.cxx b/src/HEXABLOCK/HexKasLine.cxx new file mode 100755 index 0000000..815d9b8 --- /dev/null +++ b/src/HEXABLOCK/HexKasLine.cxx @@ -0,0 +1,442 @@ +// +// CC++ : Implementation Cascade des lignes +// +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexKasLine.hxx" +#include "HexKasPoint.hxx" +#include "HexKas_functions.hxx" + +#ifndef NO_CASCADE + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +// HEXABLOCK includes +#include "HexVertex.hxx" +#include "HexEdge.hxx" +#include "HexShape.hxx" +#include "HexDiagnostics.hxx" + +#include + +BEGIN_NAMESPACE_HEXA + +static bool db = false; +static const double TolAsso = 1e-2; // Tolerance pour les associations + +void arrondir (double &val); + +// ======================================================= Constructeur +KasLine::KasLine () +{ + db = on_debug (); + lig_brep = ""; + lig_debut = 0; + lig_fin = 1; + geom_inverse = false; + start_absc = 0; + end_absc = 1; + geom_rang = NOTHING; + + // geom_line = TopoDS::Edge(shape); + geom_curve = NULL; + geom_length = 0; + geom_total_length = 0; + for (int nc=0; nc getBrep (); + lig_ident = asso->getName (); + lig_ior = asso->getIor (); + + if (fin<0.0) + { + lig_debut = asso->debut; + lig_fin = asso->fin; + } + else if (deb >= UnEpsil) + { + lig_debut = fin; + lig_fin = deb ; + } + else + { + lig_debut = deb; + lig_fin = fin; + } + + geom_inverse = false; + start_absc = 0; + end_absc = 1; + + istringstream streamBrep (lig_brep); + BRep_Builder aBuilder; + TopoDS_Shape topo; + + BRepTools::Read(topo, streamBrep, aBuilder); + geom_line = TopoDS::Edge(topo); + delete geom_curve; + geom_curve = new BRepAdaptor_Curve (geom_line); + // Longueur de la ligne + double umin = 0, umax = 0; + TopLoc_Location loc; + Handle(Geom_Curve) handle = BRep_Tool::Curve (geom_line, loc, umin, umax); + GeomAdaptor_Curve AdaptCurve (handle); + geom_total_length = GCPnts_AbscissaPoint::Length(AdaptCurve, umin, umax); + geom_length = geom_total_length * fabs (lig_fin-lig_debut); + + // Extremites + GCPnts_AbscissaPoint s1 (*geom_curve, geom_total_length*lig_debut, + geom_curve->FirstParameter()); + GCPnts_AbscissaPoint s2 (*geom_curve, geom_total_length*lig_fin, + geom_curve->FirstParameter()); + + par_mini = s1.Parameter (); + par_maxi = s2.Parameter (); + start_gpoint = geom_curve->Value (par_mini); + end_gpoint = geom_curve->Value (par_maxi); + majCoord (); + + if (db) + { + Echo (" ____________________________________ KasLine::defineLine"); + HexDisplay (deb); + HexDisplay (fin); + HexDisplay (lig_debut); + HexDisplay (lig_fin); + HexDisplay (geom_total_length); + HexDisplay (geom_curve->FirstParameter()); + HexDisplay (s1.Parameter()); + HexDisplay (s2.Parameter()); + + PutCoord (start_coord); + PutCoord (end_coord); + } +} +// ========================================================= assoPoint +void KasLine::assoPoint (double abscis, Vertex* node) +{ + GCPnts_AbscissaPoint s1 (*geom_curve, abscis, + geom_curve->FirstParameter()); + double gparam = s1.Parameter (); + gp_Pnt pnt_asso = geom_curve->Value (gparam); + + KasPoint gpoint; + gpoint.definePoint (pnt_asso); + gpoint.associate (node); + + if (db) + { + double* coord = gpoint.getCoord(); + char car = '%'; + if (node->definedBy (coord[dir_x], coord[dir_y], coord[dir_z])) + car= ' '; + printf (" ... assoPoint%c: v=%s (%g,%g,%g), p=%g", car, + node->getName(), node->getX(), node->getY(), node->getZ(), abscis); + + printf (" -> (%g,%g,%g)\n", coord[dir_x], coord[dir_y], coord[dir_z]); + } +} +// ========================================================= associate +void KasLine::associate (Edge* edge, double sm1, double sm2, int vorig) +{ + if (sm2 < start_absc) return; + if (sm1 > end_absc) return; + + Vertex* segment[V_TWO] = { edge->getVertex (vorig), + edge->getVertex (1-vorig) }; + + double vpara1 = lig_debut + (sm1-start_absc)/geom_total_length; + double vpara2 = lig_debut + (sm2-start_absc)/geom_total_length; + if (geom_inverse) + { + vpara2 = lig_fin - (sm1-start_absc)/geom_total_length; + vpara1 = lig_fin - (sm2-start_absc)/geom_total_length; + } + + double lpara1 = std::max (lig_debut, std::min (lig_fin, vpara1)); + double lpara2 = std::max (lig_debut, std::min (lig_fin, vpara2)); + + arrondir (vpara1); arrondir (vpara2); + arrondir (lpara1); arrondir (lpara2); + + if (db) + { + cout << " ++ KasLine::associate : rg=" << geom_rang << "s=" << vorig + << endl; + cout << " ligpara = [ " << lig_debut << ", " << lig_fin << " ]" << endl; + cout << " absc = [ " << start_absc << ", " << end_absc << " ]\n" ; + + cout << " Edge = " << edge->getName() << + " = [ " << segment[0]->getName() << ", " + << "," << segment[1]->getName() << endl; + cout << " smx = [ " << sm1 << ", " << sm2 << " ]" << endl; + cout << " vparam = [ " << vpara1 << ", " << vpara2 << " ]" << endl; + cout << " lparam = [ " << lpara1 << ", " << lpara2 << " ]" << endl; + } + + if (lpara2 >= lpara1 + TolAsso) + { + assoEdge (edge, lpara1, lpara2); + } + else if (db) + { + printf (" Asso Line refusee %s -> (%g,%g)\n", edge->getName(), + lpara1, lpara2); + } + + // ---------------Association du vertex + double hparam = geom_inverse ? vpara2 : vpara1; + double smx = sm1; + double absc1 = start_absc - TolAsso*geom_total_length; + double absc2 = end_absc + TolAsso*geom_total_length; + + for (int nx=V_AMONT ; nx<=V_AVAL ; nx++) + { + if (smx >= absc1 && smx <= absc2) + { + Vertex* node = segment [nx]; + if (node->getAssociation()==NULL) + { + // ..... Coordonnees du point + + double abscis = geom_total_length*hparam; + GCPnts_AbscissaPoint s1 (*geom_curve, abscis, + geom_curve->FirstParameter()); + double gparam = s1.Parameter (); + gp_Pnt pnt_asso = geom_curve->Value (gparam); + + // ..... Creation d'un vertex Geom + KasPoint gpoint; + gpoint.definePoint (pnt_asso); + gpoint.associate (node); + if (db) + { + double* ass = gpoint.getCoord(); + printf (" Asso Point %s (%g,%g,%g) -> (%g,%g,%g) p=%g s=%g\n", + node->getName(), node->getX(), node->getY(), node->getZ(), + ass[dir_x], ass[dir_y], ass[dir_z], hparam, smx); + } + } + else if (db) + { + double abscis = geom_total_length*hparam; + GCPnts_AbscissaPoint s1 (*geom_curve, abscis, + geom_curve->FirstParameter()); + double gparam = s1.Parameter (); + gp_Pnt pnt_asso = geom_curve->Value (gparam); + + // ..... Creation d'un vertex Geom + KasPoint gpoint; + gpoint.definePoint (pnt_asso); + double* ass = gpoint.getCoord(); + // gpoint.associate (node); + printf (" Asso Point %s (%g,%g,%g) -> (%g,%g,%g) p=%g s=%g\n", + node->getName(), + node->getX(), node->getY(), node->getZ(), + ass[dir_x], ass[dir_y], ass[dir_z], hparam, smx); + + gpoint.definePoint (node); + ass = gpoint.getCoord(); + printf (" ignore car deja associe a (%g,%g, %g)\n", + ass[dir_x], ass[dir_y], ass[dir_z]); + } + } + hparam = geom_inverse ? vpara1 : vpara2; + smx = sm2; + } +} +// ========================================================= assoEdge +void KasLine::assoEdge (Edge* edge, double para1, double para2, int vass) +{ + Shape* shape = new Shape (lig_brep); + shape->setName (lig_ident); + shape->setIor (lig_ior); + shape->setBounds (para1, para2); + + edge ->addAssociation (shape); + + if (db) printf (" ... Asso Edge %s -> (%g,%g)\n", + edge->getName(), para1, para2); + + double lg = geom_total_length; + switch (vass) + { + case V_AMONT : + assoPoint (para1*lg, edge->getVertex (V_AMONT)); + break; + case V_AVAL : + assoPoint (para2*lg, edge->getVertex (V_AVAL)); + break; + case V_TWO : + assoPoint (para1*lg, edge->getVertex (V_AMONT)); + assoPoint (para2*lg, edge->getVertex (V_AVAL )); + break; + default :; + } +} +// ========================================================= majCoord +void KasLine::majCoord () +{ + start_coord [dir_x] = start_gpoint.X(); + start_coord [dir_y] = start_gpoint.Y(); + start_coord [dir_z] = start_gpoint.Z(); + + end_coord [dir_x] = end_gpoint.X(); + end_coord [dir_y] = end_gpoint.Y(); + end_coord [dir_z] = end_gpoint.Z(); +} +// ========================================================= setBounds +void KasLine::setBounds (double deb, double fin) +{ + lig_debut = deb; + lig_fin = fin; +} +// ========================================================= inverser +void KasLine::inverser () +{ + gp_Pnt foo = start_gpoint; + start_gpoint = end_gpoint; + end_gpoint = foo; + + // Prendre le complementaire de l'intercvale initial + if (lig_debut > Epsil && lig_debut < UnEpsil) + { + lig_fin = lig_debut; + lig_debut = 0; + cout << " ... inverser : fin = debut = " << lig_fin << endl; + } + else if (lig_fin > Epsil && lig_fin < UnEpsil) + { + lig_debut = lig_fin; + lig_fin = 1; + cout << " ... inverser : debut = fin = " << lig_debut << endl; + } + + geom_inverse = NOT geom_inverse; + majCoord (); +} +// ========================================================= setRank +void KasLine::setRank (int nro, int sens, double& abscisse) +{ + if (sens==V_AVAL) + inverser (); + + geom_rang = nro; + start_absc = abscisse; + abscisse = end_absc = start_absc + (lig_fin-lig_debut) * geom_total_length; + + if (db) + { + cout << "KasLine::setRank : nro = " << nro << " sens=" << sens + << " = (" << start_absc << ", " << end_absc << ")" << endl; + } +} +// ========================================================= findBound +int KasLine::findBound (double* coord) +{ + if (same_coords (coord, start_coord) ) + return V_AMONT; + + if (same_coords (coord, end_coord) ) + return V_AVAL; + + return NOTHING; +} +// ========================================================= findParam +double KasLine::findParam (double* coord) +{ + double umin = 0, umax = 0; + gp_Pnt gpoint (coord[dir_x], coord[dir_y], coord[dir_z]); + Handle(Geom_Curve) handle = BRep_Tool::Curve (geom_line, umin, umax); + + GeomAPI_ProjectPointOnCurve projector (gpoint, handle); + if ( projector.NbPoints() == 0 ) + return -1.0; + + double gparam = projector.LowerDistanceParameter(); + if (gparam par_maxi) + { + // cout << " Rejet : " << gparam << " not in (" << par_mini + // << ", " << par_maxi << ")" << endl; + return -1.0; + } + + gp_Pnt rpoint = geom_curve->Value (gparam); + if (NOT same_coords (gpoint, rpoint)) + { + // cout << " Rejet : points differents " << endl; + return -1.0; + } + + + GeomAdaptor_Curve adapt_curve (handle); + double abscis = GCPnts_AbscissaPoint::Length (adapt_curve, umin, gparam); + double hparam = abscis/geom_total_length; + + // gparam = (gparam-par_mini) / (par_maxi-par_mini); + return hparam; +} +// ========================================================= arrondir +void arrondir (double &val) +{ + if (val >= -TolAsso && val <= TolAsso) + { + val = 0.0; + } + else if (val >= 1.0-TolAsso && val <= 1.0+TolAsso) + { + val = 1.0; + } +} +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexKasLine.hxx b/src/HEXABLOCK/HexKasLine.hxx new file mode 100755 index 0000000..9fb885f --- /dev/null +++ b/src/HEXABLOCK/HexKasLine.hxx @@ -0,0 +1,83 @@ +// +// CC++ : Interface Cascade de la ligne +// +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __KAS_LINE_HXX_ +#define __KAS_LINE_HXX_ + +#include "HexGlobale.hxx" + +#ifndef NO_CASCADE + +#include +#include + +BEGIN_NAMESPACE_HEXA + +class KasPoint; + +class KasLine +{ +public : + KasLine (); + KasLine (Shape* shape, double deb=-1.0, double fin=-1.0); + ~KasLine (); + + int findBound (double* point); + // void setAbscissa (double total, double& abscisse); + void inverser (); + void setBounds (double deb, double fin); + + double* getStart () { return start_coord ; } + double* getEnd () { return end_coord ; } + double getLength () { return geom_length ; } + double getRank () { return geom_rang ; } + + void defineLine (Shape* asso, double deb=-1.0, double fin=-1.0); + void setRank (int rang, int sens, double& abscisse); + void associate (Edge* edge, double sm1, double sm2, int orig=V_AMONT); + void assoEdge (Edge* edge, double pm1, double pm2, int vass=NOTHING); + void assoPoint (double alpha, Vertex* node); + + double findParam (double* point); + +private : + void majCoord (); + +private : + string lig_brep, lig_ident, lig_ior; + double lig_debut, lig_fin; + double par_mini, par_maxi; + + bool geom_inverse; + int geom_rang; + Real3 start_coord, end_coord; + double start_absc, end_absc; // Abscisse globale + double geom_length; + double geom_total_length; + + gp_Pnt start_gpoint, end_gpoint; + TopoDS_Edge geom_line; + BRepAdaptor_Curve* geom_curve; +}; +END_NAMESPACE_HEXA +#endif +#endif diff --git a/src/HEXABLOCK/HexKasPoint.cxx b/src/HEXABLOCK/HexKasPoint.cxx new file mode 100755 index 0000000..3668cf9 --- /dev/null +++ b/src/HEXABLOCK/HexKasPoint.cxx @@ -0,0 +1,132 @@ +// +// CC++ : Interface Cascade de la classe Elements +// +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexKasPoint.hxx" +#include "HexVertex.hxx" +#include "HexShape.hxx" + +#ifndef NO_CASCADE + +#include +#include +#include + +#include + +#include +#include +#include + +#include + +BEGIN_NAMESPACE_HEXA + +static bool db = false; + +// ======================================================= Constructeur +KasPoint::KasPoint () +{ + db = on_debug(); + razPoint (); +} +// ======================================================= razPoint +void KasPoint::razPoint () +{ + is_ok = false; + b_rep = ""; + for (int nc=0; nc getAssociation(); + if (asso==NULL) + return HERR; + + b_rep = asso->getBrep (); + + TopoDS_Shape topo; + istringstream streamBrep(b_rep); + BRep_Builder aBuilder; + BRepTools::Read(topo, streamBrep, aBuilder); + + if (topo.ShapeType() != TopAbs_VERTEX) + return HERR; + + is_ok = true; + g_vertex = TopoDS::Vertex (topo); + g_point = BRep_Tool::Pnt( g_vertex ); + + g_coord [dir_x] = g_point.X(); + g_coord [dir_y] = g_point.Y(); + g_coord [dir_z] = g_point.Z(); + return HOK; +} +// ======================================================= definePoint (xyz) +void KasPoint::definePoint (Real3 coord) +{ + gp_Pnt gpoint (coord[dir_x], coord[dir_y], coord[dir_z]); + definePoint (gpoint); +} +// ======================================================= definePoint (g_pnt) +void KasPoint::definePoint (gp_Pnt& gpoint) +{ + is_ok = true; + g_point = gpoint; + + ostringstream stream_shape; + + BRepBuilderAPI_MakeVertex mkVertex (g_point); + TopoDS_Shape aShape = mkVertex.Shape(); + BRepTools::Write(aShape, stream_shape); + + g_vertex = TopoDS::Vertex( aShape ); + b_rep = stream_shape.str(); + + g_coord [dir_x] = g_point.X(); + g_coord [dir_y] = g_point.Y(); + g_coord [dir_z] = g_point.Z(); + + if (db) + { + cout << " KasPoint::definePoint :" << endl; + PutCoord (g_coord); + } +} +// ======================================================= associate +void KasPoint::associate (Vertex* node) +{ + if (db) cout << " ++ KasPoint::associate " << endl; + if (db) PutName (node); + if (node==NULL) + return; + + Shape* vshape = new Shape (b_rep); + node->setAssociation (vshape); +} +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexKasPoint.hxx b/src/HEXABLOCK/HexKasPoint.hxx new file mode 100755 index 0000000..24b6d66 --- /dev/null +++ b/src/HEXABLOCK/HexKasPoint.hxx @@ -0,0 +1,61 @@ +// +// CC++ : Representation Cascade d'un point +// +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __KAS_POINT_HXX_ +#define __KAS_POINT_HXX_ + +#include "HexGlobale.hxx" + +#ifndef NO_CASCADE + +#include +#include + +BEGIN_NAMESPACE_HEXA +class KasPoint +{ +public : + KasPoint (); + + double* getCoord () { return g_coord; } + bool isOk () { return is_ok; } + bool isBad () { return NOT is_ok; } + + void associate (Vertex* node); + void razPoint (); + int definePoint (Vertex* node); + void definePoint (double* coord); + void definePoint (gp_Pnt& gpoint); + + TopoDS_Vertex& getVertex () { return g_vertex; } + +private : + string b_rep; + Real3 g_coord; + bool is_ok; + + TopoDS_Vertex g_vertex; + gp_Pnt g_point; +}; +END_NAMESPACE_HEXA +#endif +#endif diff --git a/src/HEXABLOCK/HexKas_functions.cxx b/src/HEXABLOCK/HexKas_functions.cxx new file mode 100755 index 0000000..f6eeedd --- /dev/null +++ b/src/HEXABLOCK/HexKas_functions.cxx @@ -0,0 +1,58 @@ +// +// CC++ : Fonctions Interface Cascade +// +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef NO_CASCADE + +#include "HexKas_functions.hxx" + +BEGIN_NAMESPACE_HEXA + +// ====================================================== same_coords +bool same_coords (gp_Pnt& pa, gp_Pnt& pb, double epsilon) +{ + double d2 = carre (pb.X()-pa.X()) + carre (pb.Y()-pa.Y()) + + carre (pb.Z()-pa.Z()) ; + return d2 < epsilon; +} +// ====================================================== save_brep +void save_brep (cpchar nom, string brep, int& compteur) +{ + char buff[8]; + compteur ++; + sprintf (buff ,"%d", compteur); + + string name (nom); + name += buff; + name += ".brep"; + FILE* fic = fopen (name.c_str(), "w"); + fprintf (fic, "%s\n", brep.c_str()); + fclose (fic); +} +// ====================================================== geom_make_brep +void geom_make_brep (TopoDS_Shape& shape, string& brep) +{ + ostringstream stream_shape; + BRepTools::Write (shape, stream_shape); + brep = stream_shape.str(); +} +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexKas_functions.hxx b/src/HEXABLOCK/HexKas_functions.hxx new file mode 100755 index 0000000..42213b8 --- /dev/null +++ b/src/HEXABLOCK/HexKas_functions.hxx @@ -0,0 +1,50 @@ +// +// CC++ : Representation Cascade d'un point +// +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _KAS_FUNCTIONS_HXX +#define _KAS_FUNCTIONS_HXX + +#ifndef NO_CASCADE + +#include "HexGlobale.hxx" + +#include +#include +#include +#include + +BEGIN_NAMESPACE_HEXA + +int geom_create_cylcyl (double* borig, double* bnorm, double* bbase, + double bray, double bhaut, + double* sorig, double* snorm, double* sbase, + double sray, double shaut); +int geom_asso_cylcyl (Edge* edge); + +bool same_coords (gp_Pnt& pa, gp_Pnt& pb, double epsil2=1e-6); +void save_brep (cpchar nom, string brep, int& nro); +void geom_make_brep (TopoDS_Shape& shape, string& brep); + +END_NAMESPACE_HEXA +#endif +#else // NO_CASCADE +#endif // NO_CASCADE diff --git a/src/HEXABLOCK/HexLaw.cxx b/src/HEXABLOCK/HexLaw.cxx new file mode 100644 index 0000000..b163739 --- /dev/null +++ b/src/HEXABLOCK/HexLaw.cxx @@ -0,0 +1,57 @@ + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexLaw.hxx" + +BEGIN_NAMESPACE_HEXA + +int Law::last_law_id = 0; + +// ================================================== Constructeur +Law::Law (cpchar name, int nbnodes) +{ + nbr_nodes = nbnodes; + law_id = last_law_id++; + + //Initialisation du nom: un nom par défaut est donné s'il n'est pas fourni + std::string _nom = std::string(name); + _nom.erase (_nom.find_last_not_of (" \n\r\t" ) + 1); + _nom.erase (0, _nom.find_first_not_of (" \n\r\t" )); + if (!_nom.empty()) + law_name = _nom; + else { + char buffer [16]; + sprintf (buffer, "l%04d", law_id); + law_name = std::string(buffer); + } + + law_type = Uniform; + law_coefficient = 0.0; +} +// ================================================== Constructeur 2 +Law::Law (Law* other) +{ + nbr_nodes = other->nbr_nodes; + law_name = other->law_name ; + law_type = other->law_type ; + law_coefficient = other->law_coefficient; +} + +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexLaw.hxx b/src/HEXABLOCK/HexLaw.hxx new file mode 100755 index 0000000..19f7105 --- /dev/null +++ b/src/HEXABLOCK/HexLaw.hxx @@ -0,0 +1,96 @@ + +// class : Au nom de la loi + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __LAW_H_ +#define __LAW_H_ + +#include "HexXmlWriter.hxx" + +BEGIN_NAMESPACE_HEXA + +class Law +{ +public: + const char* getName () { return law_name.c_str() ; } + int getNodes () { return nbr_nodes ; } + double getCoefficient () { return law_coefficient ; } + KindLaw getKind () { return law_type ; } + + int setNodes (int nbre); + int setCoefficient (double coeff); + void setKind (KindLaw type) { law_type = type ; } + void setKind (cpchar type); + int setName (cpchar nom); + + Law (cpchar name, int nbnodes); + Law (Law* other); + void saveXml (XmlWriter* xml); + +private: + int law_id; + static int last_law_id; + std::string law_name; + int nbr_nodes; + KindLaw law_type; + double law_coefficient; +}; + +// ================================================== setNodes +inline int Law::setNodes (int nbre) +{ + nbr_nodes = nbre; + return HOK; +} +// ================================================== setCoefficient +inline int Law::setCoefficient (double coeff) +{ + law_coefficient = coeff; + return HOK; +} +// ================================================== setName +inline int Law::setName (cpchar name) +{ + law_name = name; + return HOK; +} +// ================================================== saveXml +inline void Law::saveXml (XmlWriter* xml) +{ + cpchar kind_law [] = { "Uniform", "Arithmetic", "Geometric" }; + + xml->openMark ("Law"); + xml->addAttribute ("id", getName ()); + xml->addAttribute ("kind", kind_law [law_type]); + xml->addAttribute ("nodes", nbr_nodes); + xml->addAttribute ("coeff", law_coefficient); + xml->closeMark (); +} +// ================================================== setKind +inline void Law::setKind (cpchar type) +{ +#define VerifKind(t,k) if (strcmp(t,#k)==0) law_type = k + VerifKind (type, Uniform); + VerifKind (type, Arithmetic); + VerifKind (type, Geometric); +} + +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexMatrix.hxx b/src/HEXABLOCK/HexMatrix.hxx new file mode 100755 index 0000000..db3cf98 --- /dev/null +++ b/src/HEXABLOCK/HexMatrix.hxx @@ -0,0 +1,304 @@ + +// class : Les matrices + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __MATRIX_H +#define __MATRIX_H + +#include "HexVertex.hxx" +#include "HexVector.hxx" + +#include + +BEGIN_NAMESPACE_HEXA + +class Matrix +{ +public: + Matrix (); + int defTranslation (Vector* depl); + int defTranslation (double* depl); + int defScale (Vertex* center, double scale); + int defScale (double* center, double scale); + int defRotation (Vertex* center, Vector* depl, double degres); + int defSymmetryPoint (Vertex* center); + int defSymmetryLine (Vertex* center, Vector* dir); + int defSymmetryPlane (Vertex* center, Vector* normale); + + int perform (Vertex* noeud); + + void getCoeff (double& a11, double& a12, double& a13, double& a14, + double& a21, double& a22, double& a23, double& a24, + double& a31, double& a32, double& a33, double& a34); +private: + void erase(); +private: + double mat11, mat12, mat13, mat14; + double mat21, mat22, mat23, mat24; + double mat31, mat32, mat33, mat34; +}; +// ------------------------------------------- Inlining +// ========================================================= Constructeur +inline Matrix::Matrix () +{ + erase (); +} +// ========================================================= erase +inline void Matrix::erase () +{ + mat12 = mat13 = mat14 = 0.0; + mat21 = mat23 = mat24 = 0.0; + mat31 = mat32 = mat34 = 0.0; + mat11 = mat22 = mat33 = 1.0; +} +// ========================================================= perform +inline int Matrix::perform (Vertex* noeud) +{ + double px, py, pz; + px = mat11*noeud->getX()+mat12*noeud->getY()+mat13*noeud->getZ()+mat14; + py = mat21*noeud->getX()+mat22*noeud->getY()+mat23*noeud->getZ()+mat24; + pz = mat31*noeud->getX()+mat32*noeud->getY()+mat33*noeud->getZ()+mat34; + + noeud->setCoord (px, py, pz); + return HOK; +} +// ========================================================= defTranslation +inline int Matrix::defTranslation (Vector* boulevard) +{ + erase(); + mat11 = mat22 = mat33 = 1.0; + + mat14 = boulevard->getDx (); + mat24 = boulevard->getDy (); + mat34 = boulevard->getDz (); + + return HOK; +} +// ========================================================= defTranslation (2) +inline int Matrix::defTranslation (double* decal) +{ + erase(); + mat11 = mat22 = mat33 = 1.0; + + mat14 = decal [dir_x]; + mat24 = decal [dir_y]; + mat34 = decal [dir_z]; + return HOK; +} +// ========================================================= defScale +inline int Matrix::defScale (double* center, double scale) +{ + erase(); + mat11 = mat22 = mat33 = scale; + + mat14 = (1-scale) * center[dir_x]; + mat24 = (1-scale) * center[dir_y]; + mat34 = (1-scale) * center[dir_z]; + + return HOK; +} +// ========================================================= defScale +inline int Matrix::defScale (Vertex* center, double scale) +{ + if (center==NULL) + { + erase(); + return HERR; + } + + Real3 coord; + int ier = defScale (center->getPoint (coord ), scale); + return ier; +} +// ========================================================= defRotation +inline int Matrix::defRotation (Vertex* center, Vector* dir, double degres) +{ + erase(); + + double normed = dir->getNorm (); + if (normed< 1e-30) + return HERR; + + double ux = dir->getDx () / normed; + double uy = dir->getDy () / normed; + double uz = dir->getDz () / normed; + + double cx = center->getX (); + double cy = center->getY (); + double cz = center->getZ (); + + double cost = cos (degres*M_PI/180); + double sint = sin (degres*M_PI/180); + + mat11 = ux*ux * (1-cost) + cost; + mat12 = ux*uy * (1-cost) - uz*sint; + mat13 = ux*uz * (1-cost) + uy*sint; + + mat21 = ux*uy * (1-cost) + uz*sint; + mat22 = uy*uy * (1-cost) + cost; + mat23 = uy*uz * (1-cost) - ux*sint; + + mat31 = ux*uz * (1-cost) - uy*sint; + mat32 = uy*uz * (1-cost) + ux*sint; + mat33 = uz*uz * (1-cost) + cost; + + mat14 = cx - mat11*cx - mat12*cy - mat13*cz; + mat24 = cy - mat21*cx - mat22*cy - mat23*cz; + mat34 = cz - mat31*cx - mat32*cy - mat33*cz; + + return HOK; +} +// ========================================================= defSymmetryPoint +inline int Matrix::defSymmetryPoint (Vertex* center) +{ + erase(); + + mat11 = mat22 = mat33 = -1; + + mat14 = 2 * center->getX(); + mat24 = 2 * center->getY(); + mat34 = 2 * center->getZ(); + + return HOK; +} +// ========================================================= defSymmetryLine +// MH.d = 0 (1) +// CH = lambda*d (2) +// MM' = 2MH (3) +// +// (1) et (2) => lambda = ((x-xc)*xd + (y-yc)*yd + (z-zc)*zd) / norme(d) +// +// MM' = 2MH (3) +// <=> MO + OM' = 2 (MO + OC + CH) +// <=> OM' = MO + 2.OC + 2.CH +// <=> OM' = -OM + 2.OC + 2.lambda.d (2) et (3) +// +// x' = -x + 2*xc + 2*xd*((x-xc)*xd + (y-yc)*yd + (z-zc)*zd) +// y' = -y + 2*yc + 2*yd*((x-xc)*xd + (y-yc)*yd + (z-zc)*zd) +// z' = -z + 2*zc + 2*zd*((x-xc)*xd + (y-yc)*yd + (z-zc)*zd) +// +inline int Matrix::defSymmetryLine (Vertex* center, Vector* dir) +{ + erase (); + + double normed = dir->getNorm (); + if (normed< 1e-30) + return HERR; + + double xc = center->getX(); + double yc = center->getY(); + double zc = center->getZ(); + + double xd = dir->getDx() / normed; + double yd = dir->getDy() / normed; + double zd = dir->getDz() / normed; + + mat11 = 2*xd*xd -1; + mat12 = 2*xd*yd; + mat13 = 2*xd*zd; + mat14 = 2*(xc - xd*(xc*xd + yc*yd + zc*zd)); + + mat21 = 2*yd*xd; + mat22 = 2*yd*yd - 1; + mat23 = 2*yd*zd; + mat24 = 2*(yc - yd*(xc*xd + yc*yd + zc*zd)); + + mat31 = 2*zd*xd; + mat32 = 2*zd*yd; + mat33 = 2*zd*zd - 1; + mat34 = 2*(zc - zd*(xc*xd + yc*yd + zc*zd)); + + return HOK; +} +// ========================================================= defSymmetryPlane +// CH.n = 0 (1) +// MH = lambda*n (2) +// MM' = 2MH (3) +// +// (1) et (2) => lambda = ((x-xc)*xn + (y-yc)*yn + (z-zc)*zn) / norme(n) +// +// MM' = 2MH (3) +// <=> MO + OM' = 2.lambda.n +// <=> OM' = OM + 2.lambda.n +// +// x' = x + 2*lambda*xn +// y' = y + 2*lambda*yn +// z' = z + 2*lambda*zn +// +// x' = x + 2*xn*((x-xc)*xn + (y-yc)*yn + (z-zc)*zn) +// y' = y + 2*yn*((x-xc)*xn + (y-yc)*yn + (z-zc)*zn) +// z' = z + 2*zn*((x-xc)*xn + (y-yc)*yn + (z-zc)*zn) +// +inline int Matrix::defSymmetryPlane (Vertex* center, Vector* normale) +{ + erase (); + + double normed = normale->getNorm (); + if (normed< 1e-30) + return HERR; + + double xc = center->getX(); + double yc = center->getY(); + double zc = center->getZ(); + + double xn = normale->getDx() / normed; + double yn = normale->getDy() / normed; + double zn = normale->getDz() / normed; + + mat11 = -2*xn*xn + 1; + mat12 = -2*xn*yn; + mat13 = -2*xn*zn; + mat14 = 2*xn*(xc*xn + yc*yn + zc*zn); + + mat21 = -2*yn*xn; + mat22 = -2*yn*yn + 1; + mat23 = -2*yn*zn; + mat24 = 2*yn*(xc*xn + yc*yn + zc*zn); + + mat31 = -2*zn*xn; + mat32 = -2*zn*yn; + mat33 = -2*zn*zn + 1; + mat34 = 2*zn*(xc*xn + yc*yn + zc*zn); + + return HOK; +} +// ========================================================= getCoeff +inline void Matrix::getCoeff(double& a11, double& a12, double& a13, double& a14, + double& a21, double& a22, double& a23, double& a24, + double& a31, double& a32, double& a33, double& a34) +{ + a11 = mat11; + a12 = mat12; + a13 = mat13; + a14 = mat14; + + a21 = mat21; + a22 = mat22; + a23 = mat23; + a24 = mat24; + + a31 = mat31; + a32 = mat32; + a33 = mat33; + a34 = mat34; +} +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexPipe.cxx b/src/HEXABLOCK/HexPipe.cxx new file mode 100755 index 0000000..f6e99a6 --- /dev/null +++ b/src/HEXABLOCK/HexPipe.cxx @@ -0,0 +1,48 @@ + +// C++ : Gestion des tuyaux + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "HexPipe.hxx" +#include "HexVertex.hxx" +#include "HexVector.hxx" +#include "HexXmlWriter.hxx" + +BEGIN_NAMESPACE_HEXA + +// ======================================================== Constructeur +Pipe::Pipe (Vertex* b, Vector* v, double ri, double re, double h) + : Cylinder (b, v, re, h) +{ + c_int_radius = ri; +} +// ========================================================= saveXml +void Pipe::saveXml (XmlWriter* xml) +{ + char buffer[12]; + + xml->openMark ("Pipe"); + xml->addAttribute ("c_base", c_base->getName (buffer)); + xml->addAttribute ("c_dir", c_dir->getName (buffer)); + xml->addAttribute ("c_radius", c_radius); + xml->addAttribute ("c_int_radius", c_int_radius); + xml->addAttribute ("c_height", c_height); + xml->closeMark (); +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexPipe.hxx b/src/HEXABLOCK/HexPipe.hxx new file mode 100755 index 0000000..3d40d2e --- /dev/null +++ b/src/HEXABLOCK/HexPipe.hxx @@ -0,0 +1,46 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// class : Les tuyaux (de pipe ...) + +#ifndef __PIPE_H +#define __PIPE_H + +#include "HexCylinder.hxx" + +BEGIN_NAMESPACE_HEXA + +class Pipe : public Cylinder +{ +public : + virtual double getInternalRadius () { return c_int_radius; } + +public : + Pipe (Vertex* b, Vector* v, double ri, double re, double h); + virtual ~Pipe () {} + void saveXml (XmlWriter* xml); + +private: + double c_int_radius; +}; + +// ------------------------------------------- Inlining + +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexPropagation.hxx b/src/HEXABLOCK/HexPropagation.hxx new file mode 100755 index 0000000..926a7ef --- /dev/null +++ b/src/HEXABLOCK/HexPropagation.hxx @@ -0,0 +1,111 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// class : Ensembles de propagation + +#ifndef __PROPAGATION_H +#define __PROPAGATION_H + +#include "HexDocument.hxx" +#include "HexEdge.hxx" +#include "HexXmlWriter.hxx" +#include "HexLaw.hxx" + +BEGIN_NAMESPACE_HEXA + +class Propagation +{ +public: + const Edges& getEdges () { return prop_edges; } + Law* getLaw (); + bool getWay () { return prop_way; } + + void setWay (bool sens) { prop_way = sens; } + int setLaw (Law* loi); + +public: + Propagation (); + void saveXml (XmlWriter* xml); + void addEdge (Edge* arete); + void majLaw (); + +private: + Edges prop_edges; + Law* prop_law; + bool prop_way; +}; +// =========================================================== Constructeur +inline Propagation::Propagation () +{ + prop_law = NULL; + prop_way = true; +} +// =========================================================== getLaw +inline Law* Propagation::getLaw () +{ + return prop_law; +/* ********************************** Modif Abu du 18/10/2010 + if (prop_law != NULL) + return prop_law; + + if (prop_edges.size()==0) + return NULL; + + Document* root = prop_edges[0]->dad(); + return root->getLaw (0); + ********************************** */ +} +// =========================================================== setLaw +inline int Propagation::setLaw (Law* loi) +{ + prop_law = loi; + majLaw (); + return HOK; +} +// =========================================================== majLaw +inline void Propagation::majLaw () +{ + int nbre = prop_edges.size(); + for (int nro=0 ; nro < nbre ; nro++) + prop_edges[0]->setLaw (prop_law); +} +// =========================================================== addEdge +inline void Propagation::addEdge (Edge* arete) +{ + prop_edges.push_back (arete); + + if (prop_law == NULL) + prop_law = arete->getLaw(); +} +// =========================================================== saveXml +inline void Propagation::saveXml (XmlWriter* xml) +{ + char buffer[12]; + cpchar booleen [] = { "true", "false" }; + cpchar law = prop_law == NULL ? "default" : prop_law->getName(); + + xml->openMark ("Propagation"); + xml->addAttribute ("edge", prop_edges[0]->getName (buffer)); + xml->addAttribute ("law", law); + xml->addAttribute ("way", booleen [prop_way]); + xml->closeMark (); +} +END_NAMESPACE_HEXA + +#endif diff --git a/src/HEXABLOCK/HexQuad.cxx b/src/HEXABLOCK/HexQuad.cxx new file mode 100755 index 0000000..987f039 --- /dev/null +++ b/src/HEXABLOCK/HexQuad.cxx @@ -0,0 +1,560 @@ + +// C++ : Gestion des Quadrangles + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "HexQuad.hxx" + +#include "HexDocument.hxx" +#include "HexHexa.hxx" +#include "HexElements.hxx" + +#include "HexXmlWriter.hxx" +#include "HexShape.hxx" + +BEGIN_NAMESPACE_HEXA + +// ======================================================== Constructeur +Quad::Quad (Vertex* va, Vertex* vb, Vertex* vc, Vertex* vd) + : EltBase (va->dad(), EL_QUAD) +{ + q_vertex [E_A] = va; + q_vertex [E_B] = vb; + q_vertex [E_C] = vc; + q_vertex [E_D] = vd; + q_clone = NULL; + q_orientation = Q_UNDEFINED; + + for (int nro=0 ; nrodad(), EL_QUAD) +{ + q_edge [E_A] = ea; + q_edge [E_B] = eb; + q_edge [E_C] = ec; + q_edge [E_D] = ed; + q_clone = NULL; + q_orientation = Q_UNDEFINED; + + for (int nro=0 ; nro inter (q_edge[prec]); + if (nc>=0) + node = q_edge[nro]->getVertex (nc); + else + el_status = 888; + q_vertex [prec] = node; + } + + if (el_status != HOK) + { + printf (" +++++++++++++++++++++++++++++++++++++++++++ \n"); + printf (" +++ Quadrangle impossible \n"); + printf (" +++++++++++++++++++++++++++++++++++++++++++ \n"); + dump (); + printf (" +++++++++++++++++++++++++++++++++++++++++++ \n"); + // el_root->dump (); + for (int ned=0; neddumpPlus (); + } + HexDump (q_vertex[0]); + HexDump (q_vertex[1]); + HexDump (q_vertex[2]); + HexDump (q_vertex[3]); + + printf (" +++++++++++++++++++++++++++++++++++++++++++ \n"); + fatal_error ("Quadrangle impossible"); + } + + majReferences (); +} +// ======================================================== Constructeur bis +Quad::Quad (Quad* other) + : EltBase (other->dad(), EL_QUAD) +{ + for (int nro=0 ; nro addParent (this); +} +// ========================================================= getParent +Hexa* Quad::getParent (int nro) +{ + return static_cast (getFather (nro)); +} +// ======================================================== anaMerge +int Quad::anaMerge (Vertex* v1, Vertex* v2, Vertex* tv1[], Edge* te1[]) +{ + int orig = NOTHING; + for (int nro=0 ; orig == NOTHING && nro < QUAD4 ; nro++) + if (q_vertex [nro] == v1) + orig = nro; + + if (orig==NOTHING) + return HERR; + + int nsp1 = (orig+1) MODULO QUAD4; + int nsm1 = (orig+QUAD4-1) MODULO QUAD4; + + if (q_vertex [nsp1] == v2) + { + for (int nro=0 ; nro < QUAD4 ; nro++) + { + tv1 [nro] = q_vertex [(orig+nro) MODULO QUAD4]; + te1 [nro] = q_edge [(orig+nro) MODULO QUAD4]; + } + } + else if (q_vertex [nsm1] == v2) + { + for (int nro=0 ; nro < QUAD4 ; nro++) + { + tv1 [nro] = q_vertex [(orig+QUAD4-nro) MODULO QUAD4]; + te1 [nro] = q_edge [(orig+QUAD4-nro) MODULO QUAD4]; + } + } + else + return 588; + + return HOK; +} +// ======================================================== ordoVertex +int Quad::ordoVertex (Vertex* v1, Vertex* v2, Vertex* tv1[]) +{ + int orig = NOTHING; + for (int nro=0 ; orig == NOTHING && nro < QUAD4 ; nro++) + if (q_vertex [nro] == v1) + orig = nro; + + if (orig==NOTHING) + return HERR; + + int nsp1 = (orig+1) MODULO QUAD4; + int nsm1 = (orig+QUAD4-1) MODULO QUAD4; + + if (q_vertex [nsp1] == v2) + { + for (int nro=0 ; nro < QUAD4 ; nro++) + tv1 [nro] = q_vertex [(orig+nro) MODULO QUAD4]; + } + else if (q_vertex [nsm1] == v2) + { + for (int nro=0 ; nro < QUAD4 ; nro++) + tv1 [nro] = q_vertex [(orig+QUAD4-nro) MODULO QUAD4]; + } + else + return 588; + + return HOK; +} +// ======================================================== getBrother +Quad* Quad::getBrother (StrOrient* orient) +{ +/* ***************************** + printf (" getBrother "); + dump (); + printf (" .. Base : "); + orient->v21->printName(); + orient->v22->printName(); + printf ("dir=%d, arete=", orient->dir); + ***************************** */ + + int n21 = indexVertex (orient->v21); + int n22 = indexVertex (orient->v22); + + int sens = n22 - n21; + if (sens > 1) sens -= QUAD4; + if (sens < -1) sens += QUAD4; + if (sens*sens !=1) return NULL; + + switch (orient->dir) + { + case OR_LEFT : n22 = n21 - sens; + break; + case OR_RIGHT : n21 = n22 + sens; + break; + case OR_FRONT : n21 += 2; + n22 += 2; + break; + default : ; + } + + n21 = (n21 + QUAD4) MODULO QUAD4; + n22 = (n22 + QUAD4) MODULO QUAD4; + + orient->v21 = q_vertex [n21]; + orient->v22 = q_vertex [n22]; + + Edge* arete = findEdge (orient->v21, orient->v22); + // arete->printName("\n"); + + int nbfreres = arete->getNbrParents (); + + for (int nq = 0 ; nq < nbfreres ; nq++) + { + Quad* next = arete->getParent (nq); + if (next!=NULL && next != this ) + { + int nbp = next->getNbrParents(); + Hexa* dad = next->getParent(0); + int mark = next->getMark(); + int mark2 = dad ? dad->getMark() : IS_NONE; + + if (nbp <= 1 && mark2 != IS_MARRIED && mark == IS_NONE) + return next; + // if (nbp <= 1 && mark == IS_NONE) + // return next; + } + } + return NULL; +} +// ======================================================== coupler +int Quad::coupler (Quad* other, StrOrient* orient, Elements* table) +{ + if (other==NULL) + return HERR; + + Hexa* hexa = other->getParent(0); + + setMark (IS_MARRIED); + other->setMark (IS_MARRIED); + if (hexa != NULL) + hexa->setMark (IS_MARRIED); + + for (int ned = 0 ; ned < QUAD4 ; ned++) + { + Edge* arete = q_edge[ned]; + int nbfreres = arete ->getNbrParents (); + for (int nq = 0 ; nq < nbfreres ; nq++) + { + Quad* next = arete->getParent (nq); + if (next!=NULL && next != this && next->getMark() > 0) + { + StrOrient new_ori (orient); + new_ori.dir = OR_FRONT; + Vertex* va = arete->getVertex (V_AMONT); + Vertex* vb = arete->getVertex (V_AVAL); + +// On voit si un point de repere est conserve + if (va == orient->v11) + { + new_ori.v12 = vb; + new_ori.dir += OR_LEFT; + } + else if (vb == orient->v11) + { + new_ori.v12 = va; + new_ori.dir += OR_LEFT; + } + + if (va == orient->v12) + { + new_ori.v11 = vb; + new_ori.dir += OR_RIGHT; + } + else if (vb == orient->v12) + { + new_ori.v11 = va; + new_ori.dir += OR_RIGHT; + } + + if (new_ori.dir == OR_FRONT) + { + if (definedBy (va, orient->v11)) + { + new_ori.v11 = va; + new_ori.v12 = vb; + } + else + { + new_ori.v11 = vb; + new_ori.v12 = va; + } + } + + int nro = next->getMark (); + Quad* beauf = other->getBrother (&new_ori); + int ier = table->coupler (nro, beauf, &new_ori); + if (ier != HOK) + return ier; + ier = next->coupler (beauf, &new_ori, table); + if (ier != HOK) + return ier; + } + } + } + return HOK; +} +// ======================================================== getOpposVertex +Vertex* Quad::getOpposVertex (Vertex* start) +{ + int na = indexVertex (start); + if (na==NOTHING) + return NULL; + return q_vertex [(na+2) MODULO QUAD4]; +} +// ======================================================== getOpposEdge +Edge* Quad::getOpposEdge (Edge* start, int& sens) +{ + sens = 1; + int na = indexVertex (start->getVertex (V_AMONT)); + int nb = indexVertex (start->getVertex (V_AVAL)); + + Vertex* vaprim = q_vertex [(nb+2) MODULO QUAD4]; + Vertex* vbprim = q_vertex [(na+2) MODULO QUAD4]; + + for (int ned = 0 ; ned < QUAD4 ; ned++) + { + if ( q_edge[ned]->getVertex(V_AMONT) == vaprim + && q_edge[ned]->getVertex(V_AVAL ) == vbprim) + { + sens = 1; + return q_edge[ned]; + } + else if ( q_edge[ned]->getVertex(V_AMONT) == vbprim + && q_edge[ned]->getVertex(V_AVAL ) == vaprim) + { + sens = -1; + return q_edge[ned]; + } + } + // TODO : traiter l'erreur + cout << " ... Probleme dans Quad::getOpposedEdge :" << endl; + PutName (start); + PutName (vaprim); + PutName (vbprim); + HexDisplay (na); + HexDisplay (nb); + dumpPlus (); + + for (int ned = 0 ; ned < QUAD4 ; ned++) + q_edge[ned]->dump(); + + return NULL; +} +// ========================================================= saveXml +void Quad::saveXml (XmlWriter* xml) +{ + char buffer[12]; + string edges; + + for (int nro=0 ; nro0) edges += " "; + edges += q_edge[nro]->getName(buffer); + } + + xml->openMark ("Quad"); + xml->addAttribute ("id", getName (buffer)); + xml->addAttribute ("edges", edges); + if (el_name!=buffer) + xml->addAttribute ("name", el_name); + xml->closeMark (); + + int nbass = tab_assoc.size(); + for (int nro=0 ; nrosaveXml (xml); +} +// ======================================================== replaceEdge +void Quad::replaceEdge (Edge* old, Edge* par) +{ + for (int nro=0 ; nroprintName (" est remplace par "); + par->printName ("\n"); + } + } + } +} +// ======================================================== replaceVertex +void Quad::replaceVertex (Vertex* old, Vertex* par) +{ + for (int nro=0 ; nroprintName (" est remplace par "); + par->printName ("\n"); + } + } + } +} +// ======================================================== dump +void Quad::dump () +{ + printName(" = ("); + if (NOT isHere ()) + { + printf ("*** deleted ***)\n"); + return; + } + + for (int nro=0 ; nroprintName (""); + printf ( " (%g, %g, %g)\n", pv->getX(), pv->getY(), pv->getZ()); + } + else + { + printf ( "NULL\n"); + } + } +} +// ======================================================== getOpposEdge (2) +Edge* Quad::getOpposEdge (Edge* start) +{ + int na = indexEdge (start); + if (na<0) + return NULL; + return q_edge [(na+2) MODULO QUAD4]; +} +// ======================================================== getPerpendicular +Edge* Quad::getPerpendicular (Edge* arete, Vertex* node) +{ + int na = indexEdge (arete); + if (na<0) + return NULL; + + int nv = arete->index (node); + if (nv<0) + return NULL; + Edge* perp = q_edge [(na+1) MODULO QUAD4]; + + nv = perp->index (node); + if (nv>=0) + return perp; + + perp = q_edge [(na+3) MODULO QUAD4]; + nv = perp->index (node); + if (nv>=0) + return perp; + else + return NULL; +} +static cpchar t_ori[] = {"Q_INSIDE", "Q_DIRECT", "Q_INVERSE", "Q_UNDEF"}; +// ======================================================== setOrientation +void Quad::setOrientation (int ori) +{ + q_orientation = ori; + if (ori==Q_DIRECT || ori==Q_INVERSE) + printf (" %s = %s\n", el_name.c_str(), t_ori [ q_orientation ]); +} +// ======================================================== setOrientation +int Quad::setOrientation () +{ + q_orientation = Q_INSIDE; + if (getNbrParents() != 1) + return q_orientation; + + Real3 cg, orig, pi, pj, vi, vj, vk; + + Hexa* hexa = getParent(0); + hexa->getCenter (cg); + +/******************************************************************** + printName (" = "); + + for (int np=0 ; np < QUAD4 ; np++) + { + q_vertex [np ] -> getPoint (orig); + q_vertex [(np+1) % 4] -> getPoint (pi); + q_vertex [(np+3) % 4] -> getPoint (pj); + + calc_vecteur (orig, pi, vi); + calc_vecteur (orig, pj, vj); + calc_vecteur (orig, cg, vk); + double pmixte = prod_mixte (vi, vj, vk); + q_orientation = pmixte > ZEROR ? Q_DIRECT : Q_INVERSE; + if (pmixte>0) printf (">"); + else printf ("<"); + } + + printf ("\n"); + return; + ******************************************************************* */ + q_vertex [0] -> getPoint (orig); + q_vertex [1] -> getPoint (pi); + q_vertex [3] -> getPoint (pj); + + calc_vecteur (orig, pi, vi); + calc_vecteur (orig, pj, vj); + calc_vecteur (cg, orig, vk); + + double pmixte = prod_mixte (vi, vj, vk); + q_orientation = pmixte > ZEROR ? Q_DIRECT : Q_INVERSE; + printf (" %s = %s\n", el_name.c_str(), t_ori [ q_orientation ]); + return q_orientation; +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexQuad.hxx b/src/HEXABLOCK/HexQuad.hxx new file mode 100755 index 0000000..19ee24d --- /dev/null +++ b/src/HEXABLOCK/HexQuad.hxx @@ -0,0 +1,235 @@ + +// class : Les Quadrangles + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __QUAD_H +#define __QUAD_H + +#include "HexEdge.hxx" + +BEGIN_NAMESPACE_HEXA + +struct StrOrient +{ + Vertex* v11; // 1er sommet 1er quad + Vertex* v12; // 2eme + Vertex* v21; // 1er sommet 2eme quad + Vertex* v22; // 2eme + int dir; // direction element suivant + +StrOrient ( Vertex* n11, Vertex* n12, Vertex* n21, Vertex* n22, int d=0) + : v11 (n11), v12 (n12), v21 (n21), v22 (n22), dir (d) {} + +StrOrient ( StrOrient* s) + : v11 (s->v11), v12(s->v12), v21(s->v21), v22(s->v22), dir(s->dir){} + +}; + +class Quad : public EltBase +{ +public: + virtual Edge* getEdge (int nro); + virtual Vertex* getVertex (int nro); + + virtual int countEdge () { return QUAD4; } + virtual int countVertex () { return QUAD4; } + +public: + Quad (Vertex* va, Vertex* vb, Vertex* vc, Vertex* vd); + Quad (Edge* ea, Edge* eb, Edge* ec, Edge* ed); + Quad (Quad* other); + + Hexa* getParent (int nro); + + Edge* findEdge (Vertex* v1, Vertex*v2); + Edge* commonEdge (Quad* other); + int anaMerge (Vertex* v1, Vertex* v2, Vertex* tv[], Edge* te[]); + + int ordoVertex (Vertex* v1, Vertex* v2, Vertex* tv[]); + int prepaMerge (Vertex* tv1[], Vertex* tv2[], Edge* te1[]); + + int inter (Quad* other, int& nro); + bool definedBy (Vertex* v1, Vertex* v2); + bool definedBy (Edge* e1, Edge* e2); + + int indexVertex (Vertex* elt); + int indexEdge (Edge* elt); + + int accoupler (Quad* other, StrOrient* orient); + int coupler (Quad* other, StrOrient* orient, Elements* table); + + Edge* getOpposEdge (Edge* arete, int &sens); + Vertex* getOpposVertex (Vertex* sommet); + + virtual void majReferences(); // M.A.J relation "utilise par" + virtual void dump (); + virtual void dumpPlus (); + virtual void saveXml (XmlWriter* xml); + void setScalar (double valeur); + void setColor (double valeur) { setScalar (valeur) ; } + + void replace (Quad* old); + virtual void replaceEdge (Edge* old, Edge* nouveau); + virtual void replaceVertex (Vertex* old, Vertex* nouveau); + + virtual void clearAssociation () { tab_assoc.clear() ; } + int addAssociation (Shape* forme); + const Shapes& getAssociations () { return tab_assoc ; } + + virtual void duplicate (); + Quad* getClone () { return q_clone ; } + + Edge* getOpposEdge (Edge* arete); // Version simplifiee + Edge* getPerpendicular (Edge* arete, Vertex* node); + int getOrientation () { return q_orientation; } + int setOrientation (); + void setOrientation (int ori); + +private: + friend class Cloner; + Quad* getBrother (StrOrient* orient); + +private: + Edge* q_edge [QUAD4]; + Vertex* q_vertex [QUAD4]; + Quad* q_clone; + int q_orientation; + + Shapes tab_assoc; +}; +// ----------------------------------------------- Inlining +// ========================================================== addAssociation +inline int Quad::addAssociation (Shape* forme) +{ + if (forme != NULL) + tab_assoc.push_back (forme); + return HOK; +} +// ============================================================ getEdge +inline Edge* Quad::getEdge (int nro) +{ + Edge* elt = NULL; + if (nro >=0 && nro < QUAD4 && el_status == HOK && q_edge [nro]->isValid()) + elt = q_edge [nro]; + + return elt; +} +// ============================================================ getVertex +inline Vertex* Quad::getVertex (int nro) +{ + Vertex* elt = NULL; + if (nro >=0 && nro < QUAD4 && el_status == HOK && q_vertex [nro]->isValid()) + elt = q_vertex [nro]; + + return elt; +} +// ======================================================== commonEdge +inline Edge* Quad::commonEdge (Quad* other) +{ + for (int ne1=0 ; ne1q_edge [ne2]) + return q_edge [ne1]; + + return NULL; +} + +// ======================================================== Inter +inline int Quad::inter (Quad* other, int& nother) +{ + for (int ne1=0 ; ne1q_edge [ne2]) + { + nother = ne2; + return ne1; + } + + nother = NOTHING; + return NOTHING; +} +// ============================================================ definedBy (v) +inline bool Quad::definedBy (Vertex* v1, Vertex* v2) +{ + for (int n1=0 ; n1< QUAD4 ; n1++) + if (v1 == q_vertex[n1] && v2 == q_vertex[(n1+2) MODULO QUAD4]) + return true; + + return false; +} +// ============================================================ definedBy (e) +inline bool Quad::definedBy (Edge* e1, Edge* e2) +{ + for (int n1=0 ; n1< QUAD4 ; n1++) + if (e1 == q_edge[n1] && e2 == q_edge[(n1+2) MODULO QUAD4]) + return true; + + return false; +} +// =============================================================== findEdge +inline Edge* Quad::findEdge (Vertex* v1, Vertex* v2) +{ + for (int nro=0 ; nro< QUAD4 ; nro++) + { + Vertex* va = q_edge[nro]->getVertex(V_AMONT) ; + Vertex* vb = q_edge[nro]->getVertex(V_AVAL) ; + if ((v1==va && v2==vb) || (v1==vb && v2==va)) + return q_edge [nro]; + } + + return NULL; +} +// =============================================================== indexVertex +inline int Quad::indexVertex (Vertex* elt) +{ + for (int n1=0 ; n1< QUAD4 ; n1++) + if (elt == q_vertex[n1]) + return n1; + + return NOTHING; +} +// =============================================================== indexEdge +inline int Quad::indexEdge (Edge* elt) +{ + for (int n1=0 ; n1< QUAD4 ; n1++) + if (elt == q_edge[n1]) + return n1; + + return NOTHING; +} +// =============================================================== setScalar +inline void Quad::setScalar (double val) +{ + for (int n1=0 ; n1< QUAD4 ; n1++) + q_vertex[n1] -> setScalar (val); +} +// =============================================================== duplicate +inline void Quad::duplicate () +{ + q_orientation = Q_UNDEFINED; + q_clone = new Quad (GetClone (q_edge [E_A]), + GetClone (q_edge [E_B]), + GetClone (q_edge [E_C]), + GetClone (q_edge [E_D])); + q_clone->tab_assoc = tab_assoc; +} +END_NAMESPACE_HEXA +#endif + diff --git a/src/HEXABLOCK/HexShape.cxx b/src/HEXABLOCK/HexShape.cxx new file mode 100755 index 0000000..7527cee --- /dev/null +++ b/src/HEXABLOCK/HexShape.cxx @@ -0,0 +1,48 @@ + +// C++ : Gestion des formes associees + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexShape.hxx" +#include "HexXmlWriter.hxx" + +BEGIN_NAMESPACE_HEXA + +// ====================================================== Constructeur +Shape::Shape (string brep) +{ + b_rep = brep; + debut = 0; + fin = 1; + ident = ""; +} +// ====================================================== saveXml +void Shape::saveXml (XmlWriter* xml) +{ + char interval [80]; + sprintf (interval, "%g %g", debut, fin); + + xml->openMark ("Shape"); + xml->addAttribute ("interval", interval); + xml->addAttribute ("ident", ident.c_str()); + xml->addAttribute ("brep", b_rep.c_str()); + xml->closeMark (); +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexShape.hxx b/src/HEXABLOCK/HexShape.hxx new file mode 100755 index 0000000..7d46322 --- /dev/null +++ b/src/HEXABLOCK/HexShape.hxx @@ -0,0 +1,62 @@ + +// class : Gestion des formes associees + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __SHAPE_H_ +#define __SHAPE_H_ + +#include "hexa_base.hxx" + +BEGIN_NAMESPACE_HEXA + +class Shape +{ +public : + Shape (string brep); + string getBrep () { return b_rep; } + string getName () { return ident; } + string getIor () { return ior; } + + double getStart () { return debut; } + double getEnd () { return fin; } + void getBounds (double& pdeb, double& pfin) { pdeb=debut ; pfin = fin; } + + void setBrep (string brep) { b_rep = brep; } + void setName (string name) { ident = name; } + void setIor (string val) { ior = val; } + + void setBounds (double pdeb, double pfin) { debut = pdeb ; fin = pfin; } + void setStart (double val) { debut = val ; } + void setEnd (double val) { fin = val ; } + + void saveXml (XmlWriter* xml); + +public : + double debut; + double fin; + string ident; + string ior; + +private : + std::string b_rep; +}; +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexVector.cxx b/src/HEXABLOCK/HexVector.cxx new file mode 100755 index 0000000..f8ab95d --- /dev/null +++ b/src/HEXABLOCK/HexVector.cxx @@ -0,0 +1,109 @@ + +// C++ : Gestion des vecteurs + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "HexVector.hxx" +#include "HexXmlWriter.hxx" + +BEGIN_NAMESPACE_HEXA + +// ======================================================== Constructeur +Vector::Vector (Document* doc, double dx, double dy, double dz) + : EltBase (doc, EL_VECTOR) +{ + v_dx = dx; + v_dy = dy; + v_dz = dz; +} +// ======================================================== Constructeur bis +Vector::Vector (Vector* lautre) + : EltBase (lautre->el_root) +{ + v_dx = lautre -> v_dx; + v_dy = lautre -> v_dy; + v_dz = lautre -> v_dz; +} + +// ======================================================== calculNormale +// === Calcule un vecteur orthogonal et norme +int Vector::calculNormale (double& nx, double& ny, double& nz) +{ + double epsil = (v_dx * v_dx + v_dy * v_dy + v_dz * v_dz)*1e-6; + int forme = 2000; + if (v_dx > epsil || v_dx < -epsil) forme += 100; + if (v_dy > epsil || v_dy < -epsil) forme += 10; + if (v_dz > epsil || v_dz < -epsil) forme += 1; + + nx = ny = nz = 0; + switch (forme) + { + // dx=dy=dz=0 : retour vecteur i + erreur + case 2000 : nx = 1; + return HERR; + // dx = 0 : on prend le vecteur i + case 2001 : + case 2010 : + case 2011 : nx = 1; + return HOK; + // dy = 0 : on prend le vecteur j + case 2100 : + case 2101 : ny = 1; + return HOK; + // dz = 0 : on prend le vecteur k + case 2110 : nz = 1; + return HOK; + // dx, dy, dy non nuls : cas general; + default :; + } + + double norme = sqrt (v_dx*v_dx + v_dy*v_dy); + nx = v_dy / norme; + ny = -v_dx / norme; + return HOK; +} +// ========================================================= saveXml +void Vector::saveXml (XmlWriter* xml) +{ + char buffer[12], coord[80]; + + sprintf (coord, "%g %g %g", v_dx, v_dy, v_dz); + + xml->openMark ("Vector"); + xml->addAttribute ("id", getName (buffer)); + xml->addAttribute ("coord", coord); + if (el_name!=buffer) + xml->addAttribute ("name", el_name); + xml->closeMark (); +} +// ========================================================= getAngleX +double Vector::getAngleX () +{ + static const double Epsilon = 1e-6; + + double norme = getNorm (); + if (norme < Epsilon) + return 0.0; + + double kos = v_dx / norme; + double deg = acos(kos) * 180.0 / M_PI; + return deg; +} + +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexVector.hxx b/src/HEXABLOCK/HexVector.hxx new file mode 100755 index 0000000..19551e1 --- /dev/null +++ b/src/HEXABLOCK/HexVector.hxx @@ -0,0 +1,127 @@ + +// class : Les vecteurs + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __VECTOR_H +#define __VECTOR_H + +#include "HexEltBase.hxx" + +#include + +BEGIN_NAMESPACE_HEXA + +class Vector : public EltBase +{ +public: + double getDx () { return v_dx ; } + double getDy () { return v_dy ; } + double getDz () { return v_dz ; } + double getNorm () { return sqrt (v_dx*v_dx + v_dy*v_dy + v_dz*v_dz); } + double getAngleX (); + + +public: + Vector (Document* doc, double dx=0, double dy=0, double dz=0); + Vector (Vector* lautre); + virtual ~Vector () {} + virtual void dump (); + double getCoord (int dir); + double* getCoord (double coord[]); + + virtual void saveXml (XmlWriter* xml); + int renormer (); + void vectoriel (Vector* a, Vector*b); + void multiplier (double scal); + int calculNormale (double& nx, double& ny, double& nz); + +private: + double v_dx; + double v_dy; + double v_dz; +}; +// ------------------------------------------- Inlining +// ===================================================== getCoord +inline double Vector::getCoord (int dir) +{ + double val = 0; + switch (dir) + { + case dir_x : val = v_dx; + break; + case dir_y : val = v_dy; + break; + case dir_z : val = v_dz; + break; + } + return val; +} +// ===================================================== renormer +inline int Vector::renormer() +{ + double dn = getNorm (); + if (dn < 1e-30) + return HERR; + + v_dx /= dn; + v_dy /= dn; + v_dz /= dn; + + return HOK; +} +// ===================================================== vectoriel +inline void Vector::vectoriel (Vector* a, Vector*b) +{ + v_dx = a->v_dy * b->v_dz - b->v_dy * a->v_dz; + v_dy = a->v_dz * b->v_dx - b->v_dz * a->v_dx; + v_dz = a->v_dx * b->v_dy - b->v_dx * a->v_dy; +} + +// ===================================================== getCoord +inline double* Vector::getCoord (double coord[]) +{ + coord [dir_x] = v_dx; + coord [dir_y] = v_dy; + coord [dir_z] = v_dz; + return coord; +} +// ===================================================== multiplier +inline void Vector::multiplier (double scalaire) +{ + v_dx *= scalaire; + v_dy *= scalaire; + v_dz *= scalaire; +} +// ===================================================== dump +inline void Vector::dump () +{ + printf ("Vector "); + printName (" = "); + if (NOT isHere ()) + { + printf ("(*** deleted ***)\n"); + return; + } + + printf ("(%g, %g, %g)\n", v_dx,v_dy,v_dz); +} + +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexVertex.cxx b/src/HEXABLOCK/HexVertex.cxx new file mode 100755 index 0000000..0c6bee6 --- /dev/null +++ b/src/HEXABLOCK/HexVertex.cxx @@ -0,0 +1,82 @@ + +// C++ Les noeuds + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexVertex.hxx" +#include "HexEdge.hxx" +#include "HexVector.hxx" + +#include "HexXmlWriter.hxx" +#include "HexShape.hxx" + +BEGIN_NAMESPACE_HEXA + +// ====================================================== Constructeur +Vertex::Vertex (Document* doc, double x, double y, double z) + : EltBase (doc, EL_VERTEX) +{ + gc_x = v_x = x; + gc_y = v_y = y; + gc_z = v_z = z; + + v_scalar = 0; + v_clone = NULL; +} +// ========================================================= getParent +Edge* Vertex::getParent (int nro) +{ + return static_cast (getFather (nro)); +} +// ========================================================= saveXml +void Vertex::saveXml (XmlWriter* xml) +{ + char buffer[12], coord[80]; + + sprintf (coord, "%g %g %g", v_x,v_y,v_z); + + xml->openMark ("Vertex"); + xml->addAttribute ("id", getName (buffer)); + xml->addAttribute ("coord", coord); + if (el_name!=buffer) + xml->addAttribute ("name", el_name); + if (el_assoc!=NULL) + xml->addAttribute ("shape", el_assoc->getBrep().c_str()); + xml->closeMark (); +} +// ========================================================= translate +void Vertex::translate (Vector* vecteur, double fact) +{ + v_x += fact*vecteur->getDx (); + v_y += fact*vecteur->getDy (); + v_z += fact*vecteur->getDz (); +} +// ========================================================= createMiddle +Vertex* Vertex::createMiddle (Vertex* left, Vertex* right) +{ + Vertex* milieu = new Vertex (left); + + milieu->v_x = (left->v_x + right->v_x) / 2; + milieu->v_y = (left->v_y + right->v_y) / 2; + milieu->v_z = (left->v_z + right->v_z) / 2; + + return milieu; +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexVertex.hxx b/src/HEXABLOCK/HexVertex.hxx new file mode 100755 index 0000000..6cd017f --- /dev/null +++ b/src/HEXABLOCK/HexVertex.hxx @@ -0,0 +1,187 @@ + +// Class : Gestion des sommets + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __VERTEX_H_ +#define __VERTEX_H_ + +#include "HexEltBase.hxx" + +BEGIN_NAMESPACE_HEXA + +class Vertex : public EltBase +{ +public : + double getX() { return v_x; } + double getY() { return v_y; } + double getZ() { return v_z; } + double getCoord (int dir); + + virtual int countVertex () { return 1; } + virtual Vertex* getVertex (int nro) { return this; } + + + void setX (double v) { v_x = v ; } + void setY (double v) { v_y = v ; } + void setZ (double v) { v_z = v ; } + + void assoCoord (double x, double y, double z); + void assoCoord (double* pnt); + +public : + Vertex (Document* prev, double x=0.0, double y=0.0, double z=0.0); + Vertex (Document* cible, Vertex* other); + Vertex (Vertex* other); + virtual ~Vertex () {} + virtual void dump () ; + virtual void saveXml (XmlWriter* xml); + + void setScalar (double val) { v_scalar = val ; } + double getScalar () { return v_scalar ; } + void setColor (double valeur) { setScalar (valeur) ; } + double* getPoint (double point[]); + + void setCoord (double x, double y, double z); + bool isin (double xmin, double xmax, double ymin, double ymax, + double zmin, double zmax); + Edge* getParent (int nro); + Vertex* makeSymetric (Vertex* other); + void translate (Vector* vecteur, double fact=1.0); + void replace (Vertex* old); + + Vertex* getClone () { return v_clone ; } + void duplicate (Document* doc); + + static Vertex* createMiddle (Vertex* left, Vertex* right); + bool definedBy (double px, double py, double pz, double eps2=1e-4); + +private : + double v_x; + double v_y; + double v_z; + + double v_scalar; + Vertex* v_clone; + double gc_x, gc_y, gc_z; + bool gc_ass; +}; +// ========================================================= Constructeur bis +inline Vertex::Vertex (Vertex* other) + : EltBase (other->dad(), EL_VERTEX) +{ + if (other!= NULL) + { + v_x = other->v_x; + v_y = other->v_y; + v_z = other->v_z; + v_scalar = other->v_scalar; + gc_ass = other->gc_ass; + gc_x = other->gc_x; + gc_y = other->gc_y; + gc_z = other->gc_z; + } + else + { + v_x = v_y = v_z = 0; + gc_x = gc_y = gc_z = 0; + v_scalar = 0; + gc_ass = false; + } +} +// ===================================================== getCoord +inline double Vertex::getCoord (int dir) +{ + double val = 0; + switch (dir) + { + case dir_x : val = v_x; + break; + case dir_y : val = v_y; + break; + case dir_z : val = v_z; + break; + } + return val; +} +// ========================================================= dump +inline void Vertex::dump () +{ + printName (" = "); + if (NOT isHere ()) + { + printf ("(*** deleted ***)\n"); + return; + } + + printf ("(%g, %g, %g)", v_x,v_y,v_z); + dumpRef (); +} +// ========================================================= setCoord +inline void Vertex::setCoord (double x, double y, double z) +{ + v_x = x; + v_y = y; + v_z = z; +} +// ========================================================= assoCoord +inline void Vertex::assoCoord (double* coord) +{ + assoCoord (coord[dir_x], coord[dir_y], coord[dir_z]); +} +// ========================================================= assoCoord +inline void Vertex::assoCoord (double x, double y, double z) +{ + gc_ass = true; + gc_x = x; + gc_y = y; + gc_z = z; +} +// ========================================================= isin +inline bool Vertex::isin (double xmin, double xmax, double ymin, double ymax, + double zmin, double zmax) +{ + bool rep = v_x >= xmin && v_x <= xmax + && v_y >= ymin && v_y <= ymax + && v_z >= zmin && v_z <= zmax; + return rep; +} +// ========================================================= getPoint +inline double* Vertex::getPoint (double point[]) +{ + point [dir_x] = v_x; + point [dir_y] = v_y; + point [dir_z] = v_z; + return point; +} +// ========================================================= duplicate +inline void Vertex::duplicate (Document* cible) +{ + v_clone = new Vertex (cible, v_x, v_y, v_z); + v_clone->v_scalar = v_scalar; +} +// ========================================================= duplicate +inline bool Vertex::definedBy (double px, double py, double pz, double eps2) +{ + double dist2 = carre (v_x-px) + carre (v_y-py) + carre (v_z-pz); + return dist2 < eps2; +} +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexXmlTree.cxx b/src/HEXABLOCK/HexXmlTree.cxx new file mode 100755 index 0000000..99995dd --- /dev/null +++ b/src/HEXABLOCK/HexXmlTree.cxx @@ -0,0 +1,415 @@ + +// C++ : ParserXml + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexXmlTree.hxx" + +BEGIN_NAMESPACE_HEXA + +enum { HEND_FILE = -2, HEND_LINE = -1, CRLF = 13 }; + +// ====================================================== Constructeur +XmlTree::XmlTree (const string& nom, XmlTree* dad) +{ + item_name = nom; + item_vide = ""; + xml_parent = dad; + nbr_attributs = 0; + nbr_items = 0; + + fic_buffer = ""; + len_buffer = 0; + xml_file = NULL; + nro_ligne = 0; + fic_pos = 1988; + + xml_flow = NULL; + pos_flow = 0; + xml_ended = true; +} +// ====================================================== Destructeur +XmlTree::~XmlTree () +{ +} +// ====================================================== findChild +XmlTree* XmlTree::findChild (const string& nom) +{ + for (int nro = 0 ; nroitem_name) + return tab_items [nro]; + } + return NULL; +} +// ====================================================== findAttribute +int XmlTree::findAttribute (const string& nom) +{ + for (int nro = 0 ; nro addChild (nom); + etat = M_BALISE_OUVERTE; + break; + + case M_END : + if (etat != M_BALISE_OUVERTE) + putError (" balise ouverte"); + etat = M_NEUTRE; + break; + + case M_BEGIN_CLOSE : + if (etat == M_BALISE_OUVERTE) + putError (" balise ouverte"); + getItem (nom, M_IDENT); + getItem (foo, M_END); + node = node -> getParent (); + break; + + case M_CLOSE : + if (etat != M_BALISE_OUVERTE) + putError (" balise deja fermee"); + node = node -> getParent (); + etat = M_NEUTRE; + break; + + case M_IDENT : + getItem (valeur, M_EQUALS); + getItem (valeur, M_STRING); + node -> addAttribut (nom, valeur); + break; + + case M_COMMENT : goTo ("-->"); + break; + + case M_PROLOG : goTo ("?>"); + break; + + default : + case M_EQUALS : + case M_STRING : + case M_END_COMMENT : + case M_END_PROLOG : + putError ("Item incorrect"); + } + } + return HOK; +} +// ====================================================== getItem +EnumItem XmlTree::getItem (string& value, EnumItem waited) +{ + EnumItem item = readItem (value); + + if (item == waited) + return item; + putError ("Erreur de sequence"); + return item; +} +// ====================================================== readItem +EnumItem XmlTree::readItem (string& value) +{ + value = ""; + + while (true) + { + if (fic_pos>=len_buffer) + { + int ier=readLine (); + if (ier==HEND_FILE) + return M_NONE; + } + else + { + char car = fic_buffer [fic_pos++]; + + if (car=='=') + return M_EQUALS; + else if (car=='>') + return M_END; + else if (car=='"') + { + getString (value); + return M_STRING; + } + else if (isalpha (car)) + { + getIdent (value); + return M_IDENT; + } + + char ncar = fic_pos >= len_buffer ? ' ' : fic_buffer [fic_pos]; + if (car=='/' && ncar == '>') + { + fic_pos++; + return M_CLOSE; + } + else if (car=='<') + { + if (ncar=='/') + { + fic_pos++; + return M_BEGIN_CLOSE; + } + else if (ncar=='?') + { + fic_pos++; + return M_PROLOG; + } + else if (ncar=='!') + { + fic_pos++; + return M_COMMENT; + } + else + return M_BEGIN; + } + } + } +} +// ====================================================== getIdent +int XmlTree::getIdent (string& ident) +{ + ident = ""; + + for (int nc=fic_pos-1; nc 0) + { + xml_ended = true; + ier = HOK; + } + else + { + xml_ended = true; + ier = HEND_FILE; + } + } + return HOK; +} +// ====================================================== putError +void XmlTree::putError (cpchar mess) +{ + printf (" ***** Erreur : %s\n", mess); + printf (" +++ Derniere ligne lue : nro %d, %deme caractere\n", + nro_ligne, fic_pos); + printf ("%s\n", fic_buffer.c_str()); + // exit (102); +} +// ====================================================== addChild +XmlTree* XmlTree::addChild (const string& nom) +{ + XmlTree* child = new XmlTree (nom, this); + tab_items.push_back (child); + nbr_items ++; + return child; +} +// ====================================================== addAttribut +void XmlTree::addAttribut (const string& nom, const string& value) +{ + tab_attributs.push_back (nom); + tab_values .push_back (value); + nbr_attributs ++; + // printf (" %s = %s\n", nom.c_str(), value.c_str()); +} +// ====================================================== dump +void XmlTree::dump (int niveau) +{ + string marge = ""; + for (int niv=0 ; nivdump (niveau+1); + } + +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexXmlTree.hxx b/src/HEXABLOCK/HexXmlTree.hxx new file mode 100755 index 0000000..408c7ff --- /dev/null +++ b/src/HEXABLOCK/HexXmlTree.hxx @@ -0,0 +1,98 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// Class : Ecriture d'un fichier XML +// +#ifndef __XML_TREE_H_ +#define __XML_TREE_H_ + +#include "hexa_base.hxx" + +#include + +BEGIN_NAMESPACE_HEXA + + enum EnumItem { M_NONE, M_BEGIN, M_END, M_BEGIN_CLOSE, M_CLOSE, + M_IDENT, M_EQUALS, M_STRING, + M_COMMENT, M_END_COMMENT, M_PROLOG, M_END_PROLOG, + M_ERROR}; +class XmlTree +{ +public : + XmlTree (const string& name, XmlTree* dad=NULL); + ~XmlTree (); + + int parseFile (const string& name); + int parseFlow (cpchar flow); + + cpchar getName () { return item_name.c_str() ; } + int getNbrAttributs () { return nbr_attributs ; } + int getNbrChildren () { return nbr_items ; } + + int findAttribute (const string& nom); + const string& findValue (const string& nom); + + cpchar getAttribute (int nro) { return tab_attributs [nro].c_str(); } + cpchar getValue (int nro) { return tab_values [nro].c_str(); } + + XmlTree* findChild (const string& nom); + XmlTree* getChild (int nro) { return tab_items [nro]; } + XmlTree* getParent () { return xml_parent; } + + // ------------------------- Modifications + + XmlTree* addChild (const string& nom); + void addAttribut (const string& nom, const string& valeur); + void setName (const string& nom) { item_name = nom; } + void dump (int niveau=0); + + int goTo (cpchar ouca); + +private : + int parseXml (); + int readLine (); + EnumItem readItem (string& item); + EnumItem getItem (string& item, EnumItem waited=M_NONE); + int getString (string& item); + int getIdent (string& item); + int getChar (); + void putError (cpchar why); + +private : + string item_name; + string item_vide; + int nbr_attributs; + int nbr_items; + XmlTree* xml_parent; + + vector tab_attributs; + vector tab_values; + vector tab_items; + // Lecture + string fic_buffer; + int len_buffer; + int nro_ligne; + int fic_pos; + int pos_flow; + pfile xml_file; + cpchar xml_flow; + bool xml_ended; +}; +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/HexXmlWriter.cxx b/src/HEXABLOCK/HexXmlWriter.cxx new file mode 100755 index 0000000..400ba2b --- /dev/null +++ b/src/HEXABLOCK/HexXmlWriter.cxx @@ -0,0 +1,186 @@ + +// C++ : Ecriture en XML + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HexXmlWriter.hxx" + +BEGIN_NAMESPACE_HEXA + +enum { M_CLOSED, M_OPEN, M_SAUT }; + +// ========================================================= Constructeur +XmlWriter::XmlWriter () +{ + xml_file = stdout; + xml_level = 0; + xml_pos = 0; + on_file = true; +} +// ========================================================= openXml +int XmlWriter::openXml (cpchar nomfic) +{ + xml_level = 0; + xml_pos = 0; + xml_buffer = ""; + xml_file = stdout; + on_file = false; + + if (nomfic != NULL) + { + on_file = true; + bool suff = true; + int pext = strlen (nomfic) - 4; + if (pext > 0) + { + string sext = &nomfic[pext]; + set_minus (sext); + suff = sext != ".xml"; + } + string fname = nomfic; + if (suff) + fname += ".xml"; + xml_file = fopen (fname.c_str(), "w"); + if (xml_file==NULL) + { + xml_file = stdout; + return HERR; + } + } + + ecrire (""); + return HOK; +} +// ========================================================= closeXml +void XmlWriter::closeXml () +{ + while (NOT pile_mark.empty()) + closeMark (); + + if (xml_file!=stdout) + fclose (xml_file); + + xml_file = stdout; +} +// ========================================================= addMark +void XmlWriter::addMark (cpchar balise, bool jump) +{ + openMark (balise); + ecrire (">"); + if (jump) + { + alaLigne (); + pile_etat.top () = M_SAUT; + } + else + { + pile_etat.top () = M_CLOSED; + } +} +// ========================================================= endMark +void XmlWriter::endMark () +{ + ecrire ("> "); + pile_etat.top () = M_SAUT; +} +// ========================================================= openMark +void XmlWriter::openMark (cpchar balise) +{ + jumpLine (); + string mot = "<"; + mot += balise; + ecrire (mot); + + pile_mark.push (balise); + pile_etat.push (M_OPEN); + xml_level ++; +} +// ========================================================= closeMark +void XmlWriter::closeMark (bool jump) +{ + string balise = pile_mark.top (); + string mot = ""); + break; + case M_SAUT : jumpLine (); + default : + mot += balise; + mot += ">"; + ecrire (mot); + } + + pile_mark.pop (); + pile_etat.pop (); + alaLigne (); + if (jump) alaLigne (true); +} +// ========================================================= jumpLine +void XmlWriter::jumpLine () +{ + if (xml_pos>0) + addMot ("\n"); + + xml_pos = xml_level * xml_decal; + if (xml_pos > 0) + { + string space (xml_pos, ' '); + addMot (space.c_str()); + } +} +// ========================================================= ecrire +void XmlWriter::ecrire (cpchar mot) +{ + int lg = strlen (mot); + xml_pos += lg; + + if (xml_pos >= xml_size) + { + jumpLine (); + xml_pos += lg; + } + + addMot (mot); +} +// ========================================================= alaLigne +void XmlWriter::alaLigne (bool force) +{ + if (xml_pos==0 && NOT force) + return; + + xml_pos = 0; + addMot ("\n"); +} +// ========================================================= addAttribute +void XmlWriter::addAttribute (cpchar cle, cpchar valeur) +{ + string phrase = " "; + phrase += cle; + phrase += " = \""; + phrase += valeur; + phrase += "\""; + + ecrire (phrase); +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/HexXmlWriter.hxx b/src/HEXABLOCK/HexXmlWriter.hxx new file mode 100755 index 0000000..f75bc5a --- /dev/null +++ b/src/HEXABLOCK/HexXmlWriter.hxx @@ -0,0 +1,98 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// Class : Ecriture d'un fichier XML +// +#ifndef __XML_WRITER_H +#define __XML_WRITER_H + +#include "hexa_base.hxx" +#include +#include + +BEGIN_NAMESPACE_HEXA + +class XmlWriter +{ +public : + XmlWriter (); + ~XmlWriter () { closeXml () ; } + + int openXml (string& nom) { return openXml (nom.c_str()); } + int openXml (cpchar nom=NULL); + void closeXml (); + cpchar getXml () { return xml_buffer.c_str(); } + + void openMark (cpchar balise); // + eol + void closeMark (bool jump=false); // ou /> + void endMark (); // > + + void addAttribute (cpchar attrib, cpchar valeur); // attrib="valeur" + void addAttribute (cpchar attrib, int valeur); + void addAttribute (cpchar attrib, double valeur); + void addAttribute (cpchar attrib, string& valeur); + +private : + void jumpLine (); + void alaLigne (bool force=false); + void ecrire (cpchar mot); + void ecrire (string& mot) { ecrire (mot.c_str()) ; } + void addMot (cpchar mot); + +private : + enum {xml_decal=3, xml_size=80}; + pfile xml_file; + int xml_level; + int xml_pos; + bool on_file; + std::string xml_buffer; + std::stack > pile_mark; + std::stack > pile_etat; +}; +// ====================================================== addAttribute (I) +inline void XmlWriter::addAttribute (cpchar attrib, int valeur) +{ + char buffer [20]; + sprintf (buffer, "%d", valeur); + addAttribute (attrib, buffer); +} +// ====================================================== addAttribute (R) +inline void XmlWriter::addAttribute (cpchar attrib, double valeur) +{ + char buffer [20]; + sprintf (buffer, "%g", valeur); + addAttribute (attrib, buffer); +} +// ====================================================== addAttribute (stl) +inline void XmlWriter::addAttribute (cpchar attrib, string& valeur) +{ + addAttribute (attrib, valeur.c_str()); +} +// ====================================================== addMot +inline void XmlWriter::addMot (cpchar mot) +{ + if (on_file) + fprintf (xml_file, mot); + else + xml_buffer += mot; +} + +END_NAMESPACE_HEXA +#endif diff --git a/src/HEXABLOCK/Makefile.am b/src/HEXABLOCK/Makefile.am new file mode 100755 index 0000000..3d1c5b9 --- /dev/null +++ b/src/HEXABLOCK/Makefile.am @@ -0,0 +1,144 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +# +# =============================================================== +# Files to be installed +# =============================================================== +# +# +# header files +salomeinclude_HEADERS = \ + HexGroup.hxx \ + HexCylinder.hxx \ + HexEdge.hxx \ + HexGlobale.hxx \ + HexPropagation.hxx \ + HexVector.hxx \ + HexXmlWriter.hxx \ + hexa_base.hxx \ + HexDiagnostics.hxx \ + HexElements.hxx \ + HexHexa.hxx \ + HexMatrix.hxx \ + HexQuad.hxx \ + HexVertex.hxx \ + HexLaw.hxx \ + HexCloner.hxx \ + HexDocument.hxx \ + HexEltBase.hxx \ + Hex.hxx \ + HexPipe.hxx \ + HexShape.hxx \ + HexXmlTree.hxx \ + HexCrossElements.hxx \ + HexAnaQuads.hxx \ + HexKasPoint.hxx \ + HexKasLine.hxx \ + HexKasBiCylinder.hxx \ + HexKas_functions.hxx \ + HexCramer.hxx + + +# Libraries targets +# SD/Propagation/HexPropagation.cxx \ +# SD/Law/HexLaw.cxx \ +# +lib_LTLIBRARIES = libHEXABLOCKimpl.la + +dist_libHEXABLOCKimpl_la_SOURCES = \ + hexa_utils.cxx \ + HexEltBase.cxx \ + HexGlobale.cxx \ + HexCloner.cxx \ + HexVertex.cxx \ + HexEdge.cxx \ + HexQuad.cxx \ + HexHexa.cxx \ + HexVector.cxx \ + HexElements.cxx \ + HexElements_bis.cxx \ + HexElements_ter.cxx \ + HexElements_piq.cxx \ + HexElements_asso.cxx \ + HexElements_grid.cxx \ + HexCylinder.cxx \ + HexGroup.cxx \ + HexPipe.cxx \ + HexLaw.cxx \ + HexShape.cxx \ + HexDocument_trans.cxx \ + HexDocument_Xml.cxx \ + HexDocument.cxx \ + HexXmlTree.cxx \ + HexXmlWriter.cxx \ + HexCrossElements.cxx \ + HexCrossElements_build.cxx \ + Hex.cxx \ + HexDocument_asso.cxx \ + HexDocument_quads.cxx \ + HexKasPoint.cxx \ + HexKasLine.cxx \ + HexKasBiCylinder.cxx \ + HexKas_functions.cxx + +# libHEXABLOCKimpl_la_CPPFLAGS = \ +# -I$(top_builddir)/salome_adm/unix +# +# libHEXABLOCKimpl_la_LDFLAGS = \ +# -lOpUtil + +libHEXABLOCKimpl_la_CPPFLAGS = \ + $(KERNEL_CXXFLAGS) \ + $(CAS_CPPFLAGS) \ + $(VTK_INCLUDES) \ + $(GEOM_CXXFLAGS) \ + $(HEXABLOCK_CXXFLAGS) \ + $(SMESH_CXXFLAGS) \ + $(BOOST_CPPFLAGS) \ + $(CORBA_CXXFLAGS) \ + $(CORBA_INCLUDES) \ + -I$(top_builddir)/idl + +libHEXABLOCKimpl_la_LDFLAGS = \ + $(CAS_KERNEL) -lTKBRep -lTKPrim -lTKG2d -lTKG3d -lTKTopAlgo -lTKGeomBase -lTKGeomAlgo -lTKBool -lTKBO \ + $(KERNEL_LDFLAGS) -lSalomeGenericObj -lSALOMELocalTrace -lSALOMEBasics + +#### libHexaBlockimpl_la_CPPFLAGS = \ + #### $(KERNEL_CXXFLAGS) \ + #### $(CAS_CPPFLAGS) \ + #### $(VTK_INCLUDES) \ + #### $(GEOM_CXXFLAGS) \ + #### $(HEXABLOCK_CXXFLAGS) \ + #### $(MED_CXXFLAGS) \ + #### $(SMESH_CXXFLAGS) \ + #### $(BOOST_CPPFLAGS) \ + #### $(CORBA_CXXFLAGS) \ + #### $(CORBA_INCLUDES) \ + #### -I$(top_builddir)/idl + +#### libHexaBlockimpl_la_LDFLAGS = \ + #### ../../idl/libSalomeIDLHEXABLOCKPLUGIN.la \ + #### $(CAS_KERNEL) -lTKBRep -lTKG2d -lTKG3d -lTKTopAlgo -lTKGeomBase -lTKGeomAlgo \ + #### $(HEXABLOCK_LDFLAGS) -lHEXABLOCKEngine \ + #### $(MED_LDFLAGS) -lSalomeIDLMED \ + #### $(SMESH_LDFLAGS) -lSMESHimpl -lSMESHEngine -lSMESHDS -lSMDS \ + #### $(KERNEL_LDFLAGS) -lSalomeGenericObj -lSALOMELocalTrace -lSALOMEBasics diff --git a/src/HEXABLOCK/Sauver b/src/HEXABLOCK/Sauver new file mode 100755 index 0000000..86f9193 --- /dev/null +++ b/src/HEXABLOCK/Sauver @@ -0,0 +1,13 @@ +#!/bin/sh +# Comm : Sauvegarde + +model=`pwd` +model=`basename $model` +saved=motor_saved + +umake -clean +touch _____________________________ +cd .. +mkdir -p $saved +### ./$model/dsave $* -ln internal_doc implem model -d $saved +./$model/dsave $model -d $saved diff --git a/src/HEXABLOCK/dsave b/src/HEXABLOCK/dsave new file mode 100644 index 0000000..00bd49f --- /dev/null +++ b/src/HEXABLOCK/dsave @@ -0,0 +1,65 @@ +#!/bin/sh +# Comm : Proc de sauvegarde de repertoire + +appel=$0 +PATH=/usr/bin:$PATH + +## ========================================================== Begin + +radical=pack + +if ( [ -z "$1" ] ) then + echo + echo " *** Indiquez un repertoire a sauver" + echo + exit 1 + fi + +radical=`echo $1 | cut -d/ -f1 | cut -d. -f1` +liste_rep= +dest=. +wait_dest= +h= +psuff= +for arg in $* + do + case $arg in + -setx ) set -x + ;; + *.tgz ) radical=`echo $arg | cut -d. -f1` + ;; + -ln ) h=h + ;; + -d ) wait_dest=ok + ;; + -m ) psuff="-matin" + ;; + -s ) psuff="-soir" + ;; + + d=* | -d=* ) dest=`echo $arg | cut -d= -f2` + echo dest=$dest + ;; + * ) if ( [ $wait_dest ] ) then + wait_dest= + dest=$arg + else + liste_rep="$liste_rep $arg" + radical=$arg + fi + ;; + esac + done + +suff=`date '+%Y-%m-%d'` +suff2=`date '+%Y-%m-%d_%H-%M'` + +fictar="$dest/$radical-$suff$psuff.tgz" +if ( [ -f $fictar ] ) then + fictar="$dest/$radical-$suff2$psuff.tgz" + fi + +tar cvfz$h $fictar $liste_rep +echo +echo " ... Fichier cree : $fictar" + diff --git a/src/HEXABLOCK/hexa_base.hxx b/src/HEXABLOCK/hexa_base.hxx new file mode 100755 index 0000000..1fe11fd --- /dev/null +++ b/src/HEXABLOCK/hexa_base.hxx @@ -0,0 +1,229 @@ + +// Incl : Common definitions for HEXA-BLOCK + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _HEXA_BASE_H_ +#define _HEXA_BASE_H_ + +#include +#include + + // Conventions C Ansi compatibles +typedef char* pchar; +typedef const char* cpchar; +typedef FILE* pfile; + +#define Cestegal(c1,c2) !strcmp(c1,c2) +#define Cestdifferent(c1,c2) strcmp(c1,c2) +#define Cestvide(c1) !c1[0] +#define Cestnonvide(c1) c1[0] + + // Pour rendre les operateurs plus visibles +#define NOT ! +#define XOR ^ +#define MODULO % +#define INOT ` +// #define IOR | +#define IAND & + // Chaines de bits +#define DeuxPuissance(n) (1 << (n)) + + // Codes retour d'une fonction +#define HOK 0 // Code retour=0 : deroulement correct +#define HERR 1 // Code retour>0 = numero d'erreur, 1 par defaut +#define NOTHING -1 // Code retour fonction de recherche d'un index + +#define EOL '\n' +#define EOS 0 +#define CHVIDE "" + // Calculs reels en 3D +#define ZEROR 0.0 +#define UNR 1.0 +#define DEMI 0.5 +#define DIM2 2 + +// enum EnumCoord { dir_x, dir_y, dir_z, DIM3 }; +// typedef double Real; +// typedef double Real3 [DIM3]; + +#ifndef PI +#define PI 3.1415926535898 +#endif + // Conventions C++ +#include +#include + // Impressions de mise au point +#include +using namespace std; + +#define HexDisplay(x) cout << " ... " #x " = " << x << endl +#define PutData(x) cout << " ... " #x " = " << x << endl +#define PutCoord(x) cout << " ... " #x " = (" << x[0] << ", " \ + << x[1] << ", " << x[2] << ")" << endl +#define Echo(m) cout << " _______________ " << m << endl + +// #define Libere(obj) { if (obj!=NULL) free (obj) ; obj=NULL; } +// #define Destroy(obj) { delete obj ; obj=NULL ; } +// #define Deltable(table) { delete [] table ; table=NULL ; } + +// ---------------------------------- Definitions propres a HEXA +#define HEXA_NS Hex +#define BEGIN_NAMESPACE_HEXA namespace Hex { +#define END_NAMESPACE_HEXA } + +/* ----------------------------------------------------- + + // ---- Numerotation des faces (%x) + + 6=bed +----bd-----+ bdf=7 + /| /| + be | B bf | + / | / | + 4=bce +----bc-----+...|...bcf=5 + | de D | df + | E | | F | z + ce | C cf | ^ + 2=ade...|...+----ad-|---+ adf=3 | y + | / | / | / + | ae A | af | / + |/ |/ |/ + 0=ace +----ac-----+ acf=1 +-----> x + + * ----------------------------------------------------- */ + +//--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 +BEGIN_NAMESPACE_HEXA + +enum EnumCoord { dir_x, dir_y, dir_z, DIM3 }; +enum EnumElt { EL_NONE, EL_VERTEX, EL_EDGE, EL_QUAD, EL_HEXA, EL_VECTOR, + EL_REMOVED, EL_MAXI }; + +enum EnumGroup { HexaCell, QuadCell, EdgeCell, + HexaNode, QuadNode, EdgeNode, VertexNode}; + + // Modes de remplissage des grilles cylindriques +enum EnumCyl { CYL_NOFILL, CYL_CL4, CYL_CL6, CYL_CLOSED, CYL_PEER, CYL_ODD}; +enum EnumGrid { GR_NONE, GR_CARTESIAN, GR_CYLINDRIC, GR_SPHERIC, GR_JOINT, + GR_BICYL, GR_BIPIPE, GR_REPLACE, + GR_HEMISPHERIC, GR_RIND, GR_PART_SPHERIC, GR_PART_RIND }; + // Sommets de la decomposition canonique du bicylindre + // 0 1 2 3 4 5 6 7 8 +enum EnumVCyl { S_E, S_NE, S_N, S_NW, S_W, S_SW, S_S, S_SE, S_MAXI }; + +enum KindLaw { Uniform, Arithmetic, Geometric }; + +enum EnumOrient { OR_FRONT, OR_LEFT, OR_RIGHT, OR_BACK }; // respecter l'ordre +enum EnumMark { IS_NONE=-1, IS_MARRIED=-2 }; +enum EnumCount { NO_COUNTED=-3, NO_USED=-2, IS_USED=-1}; + +enum EnumVertex { V_AMONT, V_AVAL, V_TWO }; +enum EnumQuad { E_A, E_B, E_C, E_D, QUAD4 }; + + // z=0 z=1 y=0 y=1 x=0 x=1 +enum EnumHQuad {Q_A, Q_B, Q_C, Q_D, Q_E, Q_F, HQ_MAXI}; + +enum EnumHEdge {E_AC, E_AD, E_BC, E_BD, + E_AE, E_AF, E_BE, E_BF, + E_CE, E_CF, E_DE, E_DF, HE_MAXI }; + +enum EnumHVertex {V_ACE, V_ACF, V_ADE, V_ADF, V_BCE, V_BCF, V_BDE, V_BDF, + HV_MAXI }; + +enum EnumQDirection {Q_INSIDE, Q_DIRECT, Q_INVERSE, Q_UNDEFINED, Q_WAITING }; + +enum { CylSmall=0, CylBig=1, NxInt=1, NxExt=2 }; + +class Document; +class EltBase; + +class Hexa; +class Quad; +class Edge; +class Vertex; + +class Cylinder; +class Pipe; +class Prism; + +class Vector; +class Matrix; +class Cloner; +class XmlWriter; +class XmlTree; + +class Elements; +class GridElements; +class SphericalGrid; +class CrossElements; + +struct StrOrient; +class Shape; +class Globale; +class Propagation; +class Law; +class Group; + +class AnaQuads; +class Pattern; + +typedef std::vector Hexas; +typedef std::vector Quads; +typedef std::vector Edges; +typedef std::vector Shapes; +typedef std::vector RealVector; + +typedef double Real; +typedef double Real3 [DIM3]; + + // Quelques fonctions : + +pchar get_temp_name (cpchar format, pchar nomfic); +void fatal_error (cpchar format, cpchar info1=NULL, cpchar info2=NULL); + +double prod_scalaire (double v1[], double v2[]); +double* prod_vectoriel (double v1[], double v2[], double v3[]); +double prod_mixte (double vi[], double vj[], double vk[]); + +double calc_norme (double v1[]); +double calc_distance (double v1[], double v2[]); +void calc_vecteur (double pta[], double ptb[], double vab[]); +void calc_milieu (double pta[], double ptb[], double milieu[]); +int normer_vecteur (double v1[]); + +double carre (double val); +bool same_coords (double* pa, double* pb, double epsilon=1e-6); + +bool on_debug(); +int niv_debug(); + +void set_minus (string& chaine); + +bool special_option (); +void set_special_option (bool opt); + +const double Epsil = 1e-6; +const double UnEpsil = 0.999999; +const double Epsil2 = 1e-12; + + +END_NAMESPACE_HEXA + +#endif diff --git a/src/HEXABLOCK/hexa_utils.cxx b/src/HEXABLOCK/hexa_utils.cxx new file mode 100755 index 0000000..e08dc25 --- /dev/null +++ b/src/HEXABLOCK/hexa_utils.cxx @@ -0,0 +1,182 @@ + +// C++ : Fonctions utilitaires de Hexa + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "hexa_base.hxx" + +#include +#include +#include + +BEGIN_NAMESPACE_HEXA + +static int debug_level = NOTHING; + +// ========================================================= prod_scalaire +bool on_debug () +{ + if (debug_level == NOTHING) + { + cpchar rep = getenv ("HEXA_DB"); + if (rep!=NULL) + debug_level = atoi (rep); + debug_level = std::max (debug_level, 0); + } + return debug_level > 0; + +} +// ======================================================== set_minus +void set_minus (string& chaine) +{ + int lg = chaine.size(); + for (int nc=0 ; nc 0; +} +// ====================================================== set_special_option +void set_special_option (bool opt) +{ + current_option = opt ? 1 : 0; +} +END_NAMESPACE_HEXA diff --git a/src/HEXABLOCK/umake b/src/HEXABLOCK/umake new file mode 100755 index 0000000..e39d5a3 --- /dev/null +++ b/src/HEXABLOCK/umake @@ -0,0 +1,48 @@ +#!/bin/sh +# Comm : Makefile associe aux tests unitaires + +commande=$0 +liste_args="$*" + +# =============================================== Begin + +test_u= +opt= +for arg in $* + do + case $arg in + -setx ) set -x + ;; + -clean ) + rm -rf *.exe *.a *.o *.bak *.brep *~ *.vtk *.cpp *.xml *.exe.stackdump + exit + ;; + -j ) opt="$opt -j4" + ;; + -j* ) opt="$opt $arg" + ;; + -k ) echo ; echo ; echo ; echo ; echo ; echo ; echo ; echo ; echo + echo ; echo ; echo ; echo ; echo ; echo ; echo ; echo ; echo + ;; + *) if ( [ -z "$test_u" ] ) then + test_u=`echo $arg | cut -d. -f1` + ishere=`grep -w $test_u test_*.cxx | grep -c tabargs` + if ( [ "$ishere" = "0" ] ) then + echo "****" + echo "**** Programme non trouve : $test_u" + echo "****" + exit 1 + fi + fi + esac + done + +if ( [ -z "$test_u" ] ) then + test_u=test_hexa + fi + +if ( [ ! -f makefile.ozz ] ) then + ./make.make + fi + +make -f makefile.ozz $opt main=$test_u diff --git a/src/HEXABLOCKGUI/CutEdge_QTD.ui b/src/HEXABLOCKGUI/CutEdge_QTD.ui new file mode 100644 index 0000000..8511831 --- /dev/null +++ b/src/HEXABLOCKGUI/CutEdge_QTD.ui @@ -0,0 +1,85 @@ + + + CutEdgeDialog + + + + 0 + 0 + 191 + 114 + + + + + 0 + 0 + + + + Cut Edge Operation + + + + + + Arguments + + + + + + + 0 + 0 + + + + nb + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Edge + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/Cylinder_QTD.ui b/src/HEXABLOCKGUI/Cylinder_QTD.ui new file mode 100644 index 0000000..70562e2 --- /dev/null +++ b/src/HEXABLOCKGUI/Cylinder_QTD.ui @@ -0,0 +1,157 @@ + + + CylinderDialog + + + + 0 + 0 + 247 + 208 + + + + + 0 + 0 + + + + + 5 + 0 + + + + Cylinder Construction + + + + + + + 5 + 0 + + + + Arguments + + + + + + Point + + + + + + + Vector + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + + + + + Name + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + + 127 + 16777215 + + + + false + + + + + + + radius + + + + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + height + + + + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/Disconnect_QTD.ui b/src/HEXABLOCKGUI/Disconnect_QTD.ui new file mode 100644 index 0000000..d5dd26d --- /dev/null +++ b/src/HEXABLOCKGUI/Disconnect_QTD.ui @@ -0,0 +1,726 @@ + + + DisconnectDialog + + + + 0 + 0 + 282 + 623 + + + + + 0 + 0 + + + + Disconnect Operation + + + + + + true + + + + 0 + 0 + + + + + 0 + 50 + + + + + 16777215 + 50 + + + + Disconnect + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + Vertex + + + true + + + + + + + + 0 + 0 + + + + Edge + + + + + + + + 0 + 0 + + + + Edges + + + + + + + Quad + + + + + + + + + + + 0 + 0 + + + + Arguments + + + + + + + 0 + 0 + + + + + 16777215 + 64 + + + + + QLayout::SetDefaultConstraint + + + QFormLayout::AllNonFixedFieldsGrow + + + + + vertex + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + from hexa : + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 64 + + + + + QLayout::SetDefaultConstraint + + + QFormLayout::AllNonFixedFieldsGrow + + + + + edge + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + from hexa : + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 64 + + + + + QLayout::SetDefaultConstraint + + + QFormLayout::AllNonFixedFieldsGrow + + + + + quad + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + from hexa : + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 344 + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 131 + + + + Disconnect Edges + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 131 + + + + From Hexa(s) + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 10 + + + + + + + + + + rb2 + clicked() + widget + hide() + + + 255 + 48 + + + 250 + 111 + + + + + rb1 + clicked() + widget_4 + hide() + + + 140 + 40 + + + 167 + 479 + + + + + rb2 + clicked() + widget_4 + hide() + + + 291 + 40 + + + 167 + 479 + + + + + rb3 + clicked() + widget_4 + show() + + + 223 + 40 + + + 167 + 479 + + + + + rb3 + clicked() + widget_2 + hide() + + + 223 + 40 + + + 167 + 190 + + + + + rb0 + clicked() + widget_4 + hide() + + + 58 + 40 + + + 167 + 479 + + + + + rb2 + clicked() + widget_3 + show() + + + 258 + 46 + + + 238 + 310 + + + + + rb2 + clicked() + widget_2 + hide() + + + 271 + 46 + + + 268 + 194 + + + + + rb0 + clicked() + widget_3 + hide() + + + 41 + 49 + + + 73 + 310 + + + + + rb1 + clicked() + widget + hide() + + + 153 + 51 + + + 143 + 109 + + + + + rb0 + clicked() + widget_2 + hide() + + + 94 + 46 + + + 181 + 180 + + + + + rb0 + clicked() + widget + show() + + + 61 + 48 + + + 76 + 104 + + + + + rb1 + clicked() + widget_2 + show() + + + 197 + 48 + + + 218 + 182 + + + + + rb1 + clicked() + widget_3 + hide() + + + 182 + 38 + + + 190 + 310 + + + + + rb3 + clicked() + widget_3 + hide() + + + 223 + 40 + + + 167 + 260 + + + + + rb3 + clicked() + widget + hide() + + + 223 + 40 + + + 167 + 120 + + + + + diff --git a/src/HEXABLOCKGUI/EdgeAssoc_QTD.ui b/src/HEXABLOCKGUI/EdgeAssoc_QTD.ui new file mode 100644 index 0000000..f42defd --- /dev/null +++ b/src/HEXABLOCKGUI/EdgeAssoc_QTD.ui @@ -0,0 +1,662 @@ + + + EdgeAssocDialog + + + + 0 + 0 + 309 + 789 + + + + + 0 + 0 + + + + + 260 + 0 + + + + Edge(s) Association + + + + + + + 0 + 0 + + + + + 5 + 0 + + + + true + + + + + 0 + 0 + 287 + 767 + + + + + + + + 0 + 52 + + + + + 16777215 + 52 + + + + Mode + + + + + + One edge + + + true + + + + + + + Line + + + false + + + + + + + + + + + 5 + 0 + + + + Arguments + + + + + + false + + + + 0 + 0 + + + + Vertex + + + + + + First : + + + + + + + false + + + + + + + Qt::Horizontal + + + + 78 + 20 + + + + + + + + + + + + 0 + 58 + + + + + 16777215 + 58 + + + + Edge of model + + + + + + + + + + + + + 0 + 0 + + + + Edges of model + + + + + + + + + + + + + 0 + 0 + + + + Line of the geometry + + + + + + + + Line : + + + + + + + false + + + + + + + + + + + + + + Closed line + + + + + + + false + + + Inversion + + + + + + + + + + 0 + 86 + + + + + 16777215 + 16777215 + + + + Parameters + + + + + + Start : + + + + + + + 6 + + + 1.000000000000000 + + + 0.010000000000000 + + + + + + + End : + + + + + + + 6 + + + 1.000000000000000 + + + 0.010000000000000 + + + 1.000000000000000 + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 5 + + + + + + + + + + + + + + close_cb + toggled(bool) + vertex_gb + setEnabled(bool) + + + 338 + 537 + + + 213 + 63 + + + + + close_cb + toggled(bool) + pend_spb + setDisabled(bool) + + + 196 + 495 + + + 120 + 581 + + + + + close_cb + toggled(bool) + label_3 + setDisabled(bool) + + + 196 + 495 + + + 67 + 581 + + + + + close_cb + toggled(bool) + inverse_cb + setEnabled(bool) + + + 99 + 393 + + + 221 + 393 + + + + + single_rb + clicked() + vertex_gb + hide() + + + 86 + 53 + + + 146 + 137 + + + + + single_rb + clicked() + single_edge_gb + show() + + + 86 + 53 + + + 146 + 206 + + + + + single_rb + clicked() + edge_gb + hide() + + + 86 + 53 + + + 146 + 312 + + + + + single_rb + clicked() + lines_lw + hide() + + + 86 + 53 + + + 146 + 489 + + + + + multiple_rb + clicked() + vertex_gb + show() + + + 206 + 53 + + + 146 + 137 + + + + + multiple_rb + clicked() + single_edge_gb + hide() + + + 206 + 53 + + + 146 + 206 + + + + + multiple_rb + clicked() + edge_gb + show() + + + 206 + 53 + + + 146 + 312 + + + + + multiple_rb + clicked() + single_line_le + hide() + + + 206 + 53 + + + 146 + 425 + + + + + multiple_rb + clicked() + lines_lw + show() + + + 206 + 53 + + + 146 + 489 + + + + + single_rb + clicked() + single_line_le + show() + + + 86 + 53 + + + 146 + 425 + + + + + single_rb + clicked() + close_cb + hide() + + + 90 + 53 + + + 96 + 627 + + + + + multiple_rb + clicked() + close_cb + show() + + + 218 + 53 + + + 96 + 627 + + + + + single_rb + clicked() + inverse_cb + hide() + + + 90 + 53 + + + 212 + 627 + + + + + multiple_rb + clicked() + inverse_cb + show() + + + 218 + 53 + + + 212 + 627 + + + + + single_rb + clicked() + label_4 + show() + + + 91 + 51 + + + 57 + 452 + + + + + multiple_rb + clicked() + label_4 + hide() + + + 217 + 51 + + + 57 + 452 + + + + + diff --git a/src/HEXABLOCKGUI/Edge_QTD.ui b/src/HEXABLOCKGUI/Edge_QTD.ui new file mode 100644 index 0000000..ade2b3e --- /dev/null +++ b/src/HEXABLOCKGUI/Edge_QTD.ui @@ -0,0 +1,312 @@ + + + EdgeDialog + + + true + + + + 0 + 0 + 294 + 322 + + + + + 0 + 0 + + + + Edge Construction + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + + 16777215 + 50 + + + + Edge + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + ( vertex + vertex ) + + + true + + + + + + + + 0 + 0 + + + + ( pt + vector ) + + + + + + + + + + + 0 + 0 + + + + Arguments + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + Name + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + + + + + + + + + + + Point + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + Vector + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + Point 1 + + + + + + + + 127 + 16777215 + + + + Qt::ImhNone + + + QLineEdit::Normal + + + false + + + + + + + Point 2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 10 + + + + + + + + + + rb0 + clicked() + widget_2 + show() + + + 77 + 47 + + + 73 + 218 + + + + + rb0 + clicked() + widget + hide() + + + 116 + 44 + + + 150 + 159 + + + + + rb1 + clicked() + widget + show() + + + 222 + 46 + + + 296 + 135 + + + + + rb1 + clicked() + widget_2 + hide() + + + 251 + 47 + + + 265 + 206 + + + + + diff --git a/src/HEXABLOCKGUI/Group_QTD.ui b/src/HEXABLOCKGUI/Group_QTD.ui new file mode 100644 index 0000000..808e02c --- /dev/null +++ b/src/HEXABLOCKGUI/Group_QTD.ui @@ -0,0 +1,122 @@ + + + GroupDialog + + + + 0 + 0 + 298 + 306 + + + + + 0 + 0 + + + + + 5 + 0 + + + + Group Creation + + + + + + + 5 + 0 + + + + Arguments + + + + + + + + name : + + + + + + + + 127 + 16777215 + + + + + + + + kind : + + + + + + + + Edge Cell + + + + + Quad Cell + + + + + Hexa Cell + + + + + Vertex Node + + + + + Edge Node + + + + + Quad Node + + + + + Hexa Node + + + + + + + + + + + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI.cxx new file mode 100755 index 0000000..89443f8 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI.cxx @@ -0,0 +1,2842 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +//#define _DEVDEBUG_ + +// #include + +#include + + +// #include "klinkitemselectionmodel.h" + + +#include +#include +#include + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// #include +#include +#include +#include + + + +#include +#include +#include + + + +// SALOME KERNEL includes +#include +#include +#include +#include +#include + + + +#include +#include +#include +#include +#include + + +#include +#include + + +#include + +#include + +#include + + +#include + + +#include "Resource.hxx" +// #include "QtGuiContext.hxx" + +#include "HEXABLOCKGUI.hxx" +#include "HEXABLOCKGUI_Export.hxx" +#include "HEXABLOCKGUI_Trace.hxx" +#include "HEXABLOCKGUI_Resource.hxx" +// #include "HEXABLOCKGUI_DataModel.hxx" +#include "HEXABLOCKGUI_DocumentGraphicView.hxx" +#include "HEXABLOCKGUI_DocumentModel.hxx" +#include "HEXABLOCKGUI_DocumentSelectionModel.hxx" +#include "HEXABLOCKGUI_DocumentDelegate.hxx" +#include "HEXABLOCKGUI_DocumentPanel.hxx" + +#include + +#include "MyBasicGUI_PointDlg.hxx" + +// #include CORBA_CLIENT_HEADER(HEXABLOCKPlugin_Algorithm) + +#include "HEXABLOCK.hxx" +#include "HexDocument_impl.hxx" + + +#define DW_MINIMUM_WIDTH 50 +#define DWINPUT_MINIMUM_HEIGHT 50 + +using namespace std; +using namespace HEXABLOCK::GUI; + +int HEXABLOCKGUI::_oldStudyId = -1; + +HEXABLOCK_ORB::HEXABLOCK_Gen_var HEXABLOCKGUI::_hexaEngine = HEXABLOCK_ORB::HEXABLOCK_Gen::_nil(); +// SMESH::SMESH_Gen_var HEXABLOCKGUI::_smeshEngine = SMESH::SMESH_Gen::_nil(); +GEOM::GEOM_Gen_var HEXABLOCKGUI::_geomEngine = GEOM::GEOM_Gen::_nil(); + +// std::map HEXABLOCKGUI::svtkViews; +// std::map HEXABLOCKGUI::svtkViews; +// std::map HEXABLOCKGUI::salomeViews; +// HEXABLOCK::GUI::DocumentModel *HEXABLOCKGUI::_currentModel = NULL; + +SVTK_ViewWindow* HEXABLOCKGUI::currentVtkView = NULL; +OCCViewer_ViewWindow* HEXABLOCKGUI::currentOccView = NULL; + +HEXABLOCKGUI::HEXABLOCKGUI() : + SalomeApp_Module( "HEXABLOCK" ), // default name + LightApp_Module( "HEXABLOCK" ), + _menuId(190), + _dwPattern(0), + _dwAssociation(0), + _dwGroups(0), + _dwMesh(0), + _dwObjectBrowser(0), + _dwInputPanel(0), + _currentModel(0), + _patternDataModel(0), + _patternBuilderModel(0), + _patternDataTreeView(0), + _patternBuilderTreeView(0), + _associationTreeView(0), + _groupsTreeView(0), + _meshTreeView(0), + _currentGraphicView(0), + _treeViewDelegate(0), + _patternDataSelectionModel(0), + _patternBuilderSelectionModel(0), + _meshSelectionModel(0), + _groupsSelectionModel(0), +// _documentCnt(0), + _isSaved( false ), + _suitVM(0),//, +// _selectFromTree( false ) + _vertexDiag(0), + _edgeDiag(0), + _quadDiag(0), + _hexaDiag(0), + _vectorDiag(0), + _cylinderDiag(0), + _pipeDiag(0), + _makeGridDiag(0), + _makeCylinderDiag(0), + _makePipeDiag(0), + _makeCylindersDiag(0), + _makePipesDiag(0), + _removeHexaDiag(0), + _prismQuadDiag(0), + _joinQuadDiag(0), + _mergeDiag(0), + _disconnectDiag(0), + _cutEdgeDiag(0), + _makeTransformationDiag(0), + _makeSymmetryDiag(0), + _performTransformationDiag(0), + _performSymmetryDiag(0), + _vertexAssocDiag(0), + _edgeAssocDiag(0), + _quadAssocDiag(0), + _groupDiag(0), + _lawDiag(0), + _propagationDiag(0), + _computeMeshDiag(0), + _replaceHexaDiag(0), + _quadRevolutionDiag(0), + _makeHemiSphereDiag(0) +{ + DEBTRACE("HEXABLOCKGUI::HEXABLOCKGUI"); +// _studyContextMap.clear(); +} + +HEXABLOCKGUI::~HEXABLOCKGUI() +{ +// if ( getApp() ) +// disconnect( getApp(), SIGNAL(studyClosed()), _genericGui, SLOT (onCleanOnExit())); +} + + +SalomeApp_Study* HEXABLOCKGUI::activeStudy() +{ + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if( app ) + return dynamic_cast( app->activeStudy() ); + else + return NULL; +} + + +// Gets an reference to the module's engine +HEXABLOCK_ORB::HEXABLOCK_Gen_ptr HEXABLOCKGUI::InitHEXABLOCKGen( SalomeApp_Application* app ) +{ + Engines::EngineComponent_var comp = app->lcc()->FindOrLoad_Component( "FactoryServer", "HEXABLOCK" ); + HEXABLOCK_ORB::HEXABLOCK_Gen_ptr clr = HEXABLOCK_ORB::HEXABLOCK_Gen::_narrow(comp); + ASSERT(!CORBA::is_nil(clr)); + return clr; +} + +// // Gets an reference to SMESH's engine CS_TO_DELETE +// SMESH::SMESH_Gen_ptr HEXABLOCKGUI::InitSMESHGen( SalomeApp_Application* app, +// const std::string& container ) +// { +// Engines::EngineComponent_var comp = app->lcc()->FindOrLoad_Component( container.c_str(), "SMESH" ); +// SMESH::SMESH_Gen_ptr clr = SMESH::SMESH_Gen::_narrow(comp); +// ASSERT(!CORBA::is_nil(clr)); +// return clr; +// } +// +// // Gets an reference to GEOM's engine CS_TO_DELETE +GEOM::GEOM_Gen_ptr HEXABLOCKGUI::InitGEOMGen( SalomeApp_Application* app, + const std::string& container ) +{ + Engines::EngineComponent_var comp = app->lcc()->FindOrLoad_Component( container.c_str(), "GEOM" ); + GEOM::GEOM_Gen_ptr clr = GEOM::GEOM_Gen::_narrow(comp); + ASSERT(!CORBA::is_nil(clr)); + return clr; +} + + +void HEXABLOCKGUI::initialize( CAM_Application* app ) +{ + DEBTRACE("HEXABLOCKGUI::initialize"); + SalomeApp_Module::initialize( app ); + + _hexaEngine = InitHEXABLOCKGen( dynamic_cast( app ) ); + _geomEngine = InitGEOMGen( dynamic_cast( app ) ); + + QWidget* aParent = application()->desktop(); + DEBTRACE(app << " " << application() << " " << application()->desktop() << " " << aParent); + + SUIT_ResourceMgr* aResourceMgr = app->resourceMgr(); + setResource(aResourceMgr); + +// if ( app && app->desktop() ){ +// connect( app->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ), +// this, SLOT(onWindowActivated( SUIT_ViewWindow* )) ); +// connect( getApp()->objectBrowser()->treeView(),SIGNAL( clicked(const QModelIndex&) ), +// this, SLOT( onObjectBrowserClick(const QModelIndex&) ) ); +// // connect( getApp(), SIGNAL(studyClosed()), _genericGui,SLOT (onCleanOnExit())); +// } + +// // TEST +// QGraphicsScene* scene = new QGraphicsScene; +// scene->addText("Hello, philou!"); +// QGraphicsView* view = new QGraphicsView(scene); +// view->show(); +// app->desktop()->setCentralWidget(view); +// // TEST + + createAndFillDockWidget(); + createActions(); + createMenus(); + createTools(); + studyActivated(); + // add component to study + if (createSComponent()) updateObjBrowser(); + +} + +void HEXABLOCKGUI::viewManagers( QStringList& list ) const +{ + DEBTRACE("HEXABLOCKGUI::viewManagers"); + MESSAGE("HEXABLOCKGUI::viewManagers"); +// foreach (const QString &str, list) +// MESSAGE("HEXABLOCKGUI::viewManagers"<desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ), + this, SLOT(onWindowActivated( SUIT_ViewWindow* )) ); + connect( getApp()->objectBrowser()->treeView(),SIGNAL( clicked(const QModelIndex&) ), + this, SLOT( onObjectBrowserClick(const QModelIndex&) ) ); +// connect( getApp(), SIGNAL(studyClosed()), _genericGui,SLOT (onCleanOnExit())); + + + LightApp_SelectionMgr* sm = getApp()->selectionMgr(); + + SUIT_ViewManager* vm; + ViewManagerList OCCViewManagers, VTKViewManagers; + + application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers ); + QListIterator itOCC( OCCViewManagers ); + while ( itOCC.hasNext() && (vm = itOCC.next()) ) + myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) ); + + application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers ); + QListIterator itVTK( VTKViewManagers ); + while ( itVTK.hasNext() && (vm = itVTK.next()) ) + myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast( vm->getViewModel() ), sm ) ); + + //NPAL 19674 + SALOME_ListIO selected; + sm->selectedObjects( selected ); + sm->clearSelected(); + + // disable OCC selectors + getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() ); + QListIterator itOCCSel( myOCCSelectors ); + while ( itOCCSel.hasNext() ) + if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() ) + sr->setEnabled(true); + + // disable VTK selectors + getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() ); + QListIterator itVTKSel( myVTKSelectors ); + while ( itVTKSel.hasNext() ) + if ( LightApp_VTKSelector* sr = itVTKSel.next() ) + sr->setEnabled(true); + + sm->setSelectedObjects( selected, true ); //NPAL 19674 + + + _hexaEngine->SetCurrentStudy(SALOMEDS::Study::_nil()); + if ( SalomeApp_Study* s = dynamic_cast( theStudy )) + if ( _PTR(Study) aStudy = s->studyDS()) { + //define _CAST(Class, shared_ptr_Obj) dynamic_cast(shared_ptr_Obj.get()) + _hexaEngine->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() ); + updateObjBrowser(); // objects can be removed + } + + + return bOk; +} + + + +bool HEXABLOCKGUI::deactivateModule( SUIT_Study* theStudy ) +{ + DEBTRACE("HEXABLOCKGUI::deactivateModule"); + + setMenuShown( false ); + setToolShown( false ); + showDockWidgets( false ); +// QtGuiContext *context = QtGuiContext::getQtCurrent(); +// _studyContextMap[theStudy->id()] = context; +// DEBTRACE("_studyContextMap[theStudy] " << theStudy << " " << context); + + disconnect( getApp()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ), + this, SLOT(onWindowActivated( SUIT_ViewWindow* )) ); + disconnect( getApp()->objectBrowser()->treeView(),SIGNAL( clicked(const QModelIndex&) ), + this, SLOT( onObjectBrowserClick(const QModelIndex&) ) ); +// connect( getApp(), SIGNAL(studyClosed()), _genericGui,SLOT (onCleanOnExit())); + + + if ( HEXABLOCKGUI::currentVtkView ){ + HEXABLOCKGUI::currentVtkView->SetSelectionMode( ActorSelection ); //default selectionMode in VTKView + } + +// if (HEXABLOCKGUI::currentOccView) +// { +// //getDisplayer()->globalSelection();//???? //defaut selectionMode in OccView +// } + + +// if ( _patternDataSelectionModel ){ +// delete _patternDataSelectionModel; +// _patternDataSelectionModel = NULL; +// } +// if ( _patternBuilderSelectionModel ){ +// delete _patternBuilderSelectionModel; +// _patternBuilderSelectionModel = NULL; +// } + + qDeleteAll(myOCCSelectors); + myOCCSelectors.clear(); + getApp()->selectionMgr()->setEnabled( true, OCCViewer_Viewer::Type() ); + + qDeleteAll(myVTKSelectors); + myVTKSelectors.clear(); + getApp()->selectionMgr()->setEnabled( true, SVTK_Viewer::Type() ); + + return SalomeApp_Module::deactivateModule( theStudy ); +} + + +bool HEXABLOCKGUI::renameAllowed( const QString& entry) const +{ +// MESSAGE("HEXABLOCKGUI::renameAllowed"); + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + SalomeApp_Study* appStudy = app ? dynamic_cast( app->activeStudy() ) : 0; + SalomeApp_DataObject* obj = appStudy ? dynamic_cast(appStudy->findObjectByEntry(entry)) : 0; + + bool res = app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference(); + return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference()); +} + + +bool HEXABLOCKGUI::renameObject( const QString& entry, const QString& name) +{ + MESSAGE("HEXABLOCKGUI::renameObject"); +// bool appRes = SalomeApp_Module::renameObject(entry,name); +// MESSAGE("appRes"<( SUIT_Session::session()->activeApplication()); + SalomeApp_Study* appStudy = app ? dynamic_cast( app->activeStudy() ) : 0; + + if(!appStudy) + return result; + + _PTR(Study) aStudy = appStudy->studyDS(); + + if(!aStudy) + return result; + + _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) ); + _PTR(GenericAttribute) anAttr; + if ( obj ){ + if ( obj->FindAttribute(anAttr, "AttributeName") ){ + _PTR(AttributeName) aName (anAttr); +// GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj)); +// +// HEXABLOCK_Gen_i::Document_var aDoc = HEXABLOCK_Gen_i::Document::_narrow( theIOR ); +// if (!CORBA::is_nil(aDoc)) { + aName->SetValue( name.toLatin1().data() ); // rename the SObject +// aDoc->setName( name.toLatin1().data() ); // Rename the corresponding GEOM_Object + _currentModel->setName( name/*.toLatin1().data()*/ ); +// _currentGraphicView->setWindowTitle( _currentModel->getName() ); + result = true; + } + } + return result; +} + + +// --- Default windows +void HEXABLOCKGUI::windows( QMap& theMap ) const +{ + DEBTRACE("HEXABLOCKGUI::windows"); + theMap.clear(); + theMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea ); + theMap.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea ); +} + +// LightApp_Displayer* HEXABLOCKGUI::displayer() +// { +// DEBTRACE("HEXABLOCKGUI::displayer"); +// return _currentGraphicView; +// } + + +// QString HEXABLOCKGUI::engineIOR() const +// { +// DEBTRACE("HEXABLOCKGUI::engineIOR"); +// // return getApp()->defaultEngineIOR(); +// } + + + + +QString HEXABLOCKGUI::engineIOR() const +{ + DEBTRACE("HEXABLOCKGUI::engineIOR"); + CORBA::ORB_var anORB = getApp()->orb(); + CORBA::String_var anIOR = anORB->object_to_string(_hexaEngine); + return QString( anIOR.in() ); +} + + + +void HEXABLOCKGUI::onObjectBrowserClick(const QModelIndex& index) +{ + DEBTRACE("HEXABLOCKGUI::onObjectBrowserClick"); + // we want to switch automatically to the right view windows + QWidget *viewWindow = NULL; + + //first, find entry of item selected + QString itemEntry; + DataObjectList dol = getApp()->objectBrowser()->getSelected(); + if (dol.isEmpty()) return; + SalomeApp_DataObject* item = dynamic_cast(dol[0]); + if (!item) return; + itemEntry = item->entry(); + +// DEBTRACE("HEXABLOCKGUI::onClick index.data() => "< "<name(). => "<name().toStdString()); +// DEBTRACE("HEXABLOCKGUI::onClick itemEntry =>"<setFocus(); + _currentGraphicView->update(); //CS_TEST +// _selectFromTree = false; + +// if (getApp()->activeModule()->moduleName().compare("HEXABLOCK") != 0) +// getApp()->activateModule("HEXABLOCK"); +} + + + + + +void HEXABLOCKGUI::onWindowActivated( SUIT_ViewWindow* svw) +{ + DEBTRACE("HEXABLOCKGUI::onWindowActivated"); + OCCViewer_ViewWindow* anOccVw = dynamic_cast(svw); + + if ( anOccVw != NULL ) + currentOccView = dynamic_cast(svw); +// OCCViewer_Viewer* aModel = dynamic_cast(svw); + + // we want to switch automatically to the right model + // only VTK view + SVTK_ViewWindow* viewWindow = dynamic_cast(svw); + if (!viewWindow) return; + if (getApp()->activeModule() && getApp()->activeModule()->moduleName().compare("HEXABLOCK") != 0) //CS_TODO? + getApp()->activateModule("HEXABLOCK"); + + switchModel( viewWindow ); +} + + +void HEXABLOCKGUI::onWindowClosed( SUIT_ViewWindow* svw) +{ + DEBTRACE("HEXABLOCKGUI::onWindowClosed"); +} + + + + +void HEXABLOCKGUI::onViewManagerAdded( SUIT_ViewManager* vm) +{ + DEBTRACE("HEXABLOCKGUI::onViewManagerAdded"); + if ( vm && vm->getType() == OCCViewer_Viewer::Type() ) + { +// qDebug( "connect" ); +// // connect( vm, SIGNAL( keyPress ( SUIT_ViewWindow*, QKeyEvent* ) ), +// // this, SLOT( OnKeyPress( SUIT_ViewWindow*, QKeyEvent* ) ) ); +// // connect( vm, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ), +// // this, SLOT( OnMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) ); +// // connect( vm, SIGNAL( mouseMove ( SUIT_ViewWindow*, QMouseEvent* ) ), +// // this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) ); +// LightApp_SelectionMgr* sm = getApp()->selectionMgr(); +// myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) ); +// +// // disable OCC selectors +// getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() ); +// QListIterator itOCCSel( myOCCSelectors ); +// while ( itOCCSel.hasNext() ) +// if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() ){ +// sr->setEnabled(true); +// std::cout<<"HEXABLOCKGUI::onViewManagerAdded sr"<scrollTo ( l[0] ); + } +} + +// void HEXABLOCKGUI::onTryClose(bool &isClosed, QxScene_ViewWindow* window) //CS_TODO +// { +// DEBTRACE("HEXABLOCKGUI::onTryClose"); +// isClosed = _genericGui->closeContext(window); +// } + +// CAM_DataModel* HEXABLOCKGUI::createDataModel() +// { +// DEBTRACE("HEXABLOCKGUI::createDataModel"); +// return new HEXABLOCKGUI_DataModel(this); +// // return NULL; +// } + +bool HEXABLOCKGUI::createSComponent() //addComponent +{ + DEBTRACE("HEXABLOCKGUI::createSComponent"); + // --- Find or create "HEXABLOCK" SComponent in the study + + _PTR(Study) aStudy = (( SalomeApp_Study* )(getApp()->activeStudy()))->studyDS(); + _PTR(StudyBuilder) aBuilder (aStudy->NewBuilder()); + _PTR(GenericAttribute) anAttr; + _PTR(AttributeName) aName; + + _PTR(SComponent) aComponent = aStudy->FindComponent("HEXABLOCK"); + if ( !aComponent ){ + aComponent = aBuilder->NewComponent("HEXABLOCK"); + anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributeName"); + aName = _PTR(AttributeName) (anAttr); + aName->SetValue(getApp()->moduleTitle("HEXABLOCK").toStdString()); + + anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributePixMap"); + _PTR(AttributePixMap) aPixmap(anAttr); + aPixmap->SetPixMap("share/salome/resources/hexablock/ModuleHexablock.png"); + + aBuilder->DefineComponentInstance(aComponent, engineIOR().toStdString()); + DEBTRACE("HEXABLOCKGUI::createSComponent engineIOR=>"<DefineComponentInstance(aComponent, getApp()->defaultEngineIOR().toStdString()); +// DEBTRACE("HEXABLOCKGUI::createSComponent defaultEngineIOR=>"<defaultEngineIOR().toStdString()); + +// SalomeApp_DataModel::synchronize( aComponent, HEXABLOCKGUI::activeStudy() ); + return true; + } + return false; +} + + + +// bool HEXABLOCKGUI::isSelectionCompatible() +// { +// DEBTRACE("HEXABLOCKGUI::isSelectionCompatible"); +// +// bool isCompatible = true; +// SALOME_ListIO selected; +// if ( LightApp_SelectionMgr *Sel = selectionMgr() ) +// Sel->selectedObjects( selected ); +// +// SALOME_ListIteratorOfListIO It( selected ); +// for ( ; isCompatible && It.More(); It.Next()) +// isCompatible = +// ( strcmp("GEOM", It.Value()->getComponentDataType()) == 0 ) || +// ( strcmp("HEXABLOCK", It.Value()->getComponentDataType()) == 0 ); +// +// return isCompatible; +// } + +void HEXABLOCKGUI::setResource(SUIT_ResourceMgr* r) +{ + DEBTRACE("HEXABLOCKGUI::setResource"); + _myresource = new HEXABLOCKGUI_Resource(r); + _myresource->preferencesChanged(); +} + +void HEXABLOCKGUI::createPreferences() +{ + DEBTRACE("HEXABLOCKGUI::createPreferences"); + _myresource->createPreferences(this); +} + +void HEXABLOCKGUI::preferencesChanged( const QString& sect, const QString& name ) +{ + DEBTRACE("HEXABLOCKGUI::preferencesChanged"); + _myresource->preferencesChanged(sect, name); + if(name=="userCatalog") + { +// _genericGui->getCatalogWidget()->addCatalogFromFile(Resource::userCatalog.toStdString()); + } +} + +void HEXABLOCKGUI::studyActivated() //CS_TODO +{ + int newStudyId = getApp()->activeStudy()->id(); + DEBTRACE("HEXABLOCKGUI::studyActivated " << _oldStudyId << " " << newStudyId); + + if (_oldStudyId != -1) + { +// _studyContextMap[_oldStudyId] = QtGuiContext::getQtCurrent(); +// if (_studyContextMap.count(newStudyId)) +// { +// DEBTRACE("switch to valid context " << QtGuiContext::getQtCurrent() << " " << _studyContextMap[newStudyId]); +// QtGuiContext::setQtCurrent(_studyContextMap[newStudyId]); +// } +// else +// { +// DEBTRACE("no switch to null context"); +// } + } + _oldStudyId = newStudyId; +} + + + +void HEXABLOCKGUI::treeContextMenu(const QPoint& aPosition) +{ + QModelIndex currentIndex = _patternDataTreeView->currentIndex(); + QVariant currentAssocVariant; + QString currentAssocEntry; + + currentAssocVariant = currentIndex.data( HEXA_ASSOC_ENTRY_ROLE ); + currentAssocEntry = currentIndex.data( HEXA_ASSOC_ENTRY_ROLE ).toString(); + if ( currentAssocVariant.isValid() && !currentAssocEntry.isEmpty() ){ + // _currentModel->allowEdition(); + QMenu menu( _patternDataTreeView ); + //Remove association + QAction *clearAct = menu.addAction( "Remove association(s)" ); + connect( clearAct, SIGNAL(triggered()), this, SLOT(clearAssociations()) ); + menu.exec( _patternDataTreeView->mapToGlobal( aPosition) ); + } + else { + + QStandardItem *item = _patternDataModel->itemFromIndex ( currentIndex ); + + //We don't do anything for single items having no association + if ( item->type() == VERTEXITEM || item->type() == EDGEITEM || + item->type() == QUADITEM || item->type() == HEXAITEM) return; + + QMenu menu( _patternDataTreeView ); + + //Show association(s) + QAction *showAssocAct = menu.addAction( "Show associations" ); + connect( showAssocAct, SIGNAL(triggered()), this, SLOT(showAssociations()) ); + + //Clear all associations + QAction *clearAllAssocAct = menu.addAction( "Remove all associations" ); + connect( clearAllAssocAct, SIGNAL(triggered()), this, SLOT(clearAllAssociations()) ); + + menu.exec( _patternDataTreeView->mapToGlobal( aPosition) ); + } +} + + +void HEXABLOCKGUI::createAndFillDockWidget() +{ + QMainWindow *aParent = application()->desktop(); + + // Create dock widget (3 dock) + + //1) *********** user input panel ( contain user's edit dialog box ) + _dwInputPanel = new QDockWidget(aParent); +// _dwInputPanel->setWindowFlags(Qt::FramelessWindowHint); +// _dwInputPanel->setWindowFlags(Qt::WindowTitleHint); + _dwInputPanel->setVisible(false); + _dwInputPanel->setWindowTitle("Input Panel"); +// _dwInputPanel->setMinimumHeight(DWINPUT_MINIMUM_HEIGHT); + _dwInputPanel->setMinimumWidth(DW_MINIMUM_WIDTH); // --- force a minimum until display + _dwInputPanel->raise(); + +// _stacked = new QStackedWidget(_dwInputPanel); +// _dwInputPanel->setWidget(_stacked); + + _treeViewDelegate = new DocumentDelegate(_dwInputPanel); + + //2) ************* document data ( Pattern, Association, Mesh ) in treeview representation + // Pattern + _dwPattern = new QDockWidget(aParent); + // _dwPattern->installEventFilter(this); + _dwPattern->setVisible(false); + _dwPattern->setWindowTitle("Model"); + _dwPattern->setMinimumWidth(DW_MINIMUM_WIDTH); // --- force a minimum until display + + QFrame* patternFrame = new QFrame(_dwPattern); + patternFrame->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + QVBoxLayout* patternLayout = new QVBoxLayout(patternFrame); + patternLayout->setSizeConstraint(QLayout::SetMaximumSize); + QSplitter *splitter = new QSplitter(Qt::Vertical,patternFrame); + _patternDataTreeView = new QTreeView(patternFrame);//_dwPattern); + _patternBuilderTreeView = new QTreeView(patternFrame); + splitter->addWidget(_patternDataTreeView); + splitter->addWidget(_patternBuilderTreeView); + patternLayout->addWidget(splitter); +// _patternDataTreeView->setMinimumHeight(DW_MINIMUM_WIDTH); + + _patternDataTreeView->setEditTriggers(QAbstractItemView::AllEditTriggers/*QAbstractItemView::DoubleClicked*/); + _patternDataTreeView->setSelectionMode(QAbstractItemView::SingleSelection/*QAbstractItemView::MultiSelection*/);//);//QAbstractItemView::DoubleClicked, QAbstractItemView::SelectedClicked) + _patternDataTreeView->setItemDelegate(_treeViewDelegate); + + + _patternBuilderTreeView->setEditTriggers(QAbstractItemView::AllEditTriggers); + _patternBuilderTreeView->setItemDelegate(_treeViewDelegate); + _dwPattern->setWidget(patternFrame); + patternFrame->show(); + //_dwPattern->raise(); + + // Groups + _dwGroups = new QDockWidget(aParent); +// _dwGroups->installEventFilter(this); + + _dwGroups->setVisible(false); + _dwGroups->setWindowTitle("Groups"); + _dwGroups->setMinimumWidth(DW_MINIMUM_WIDTH); // --- force a minimum until display + _groupsTreeView = new QTreeView(_dwGroups); +// _associationTreeView->setMinimumHeight(DW_MINIMUM_WIDTH); + _groupsTreeView->setEditTriggers(QAbstractItemView::AllEditTriggers); + _groupsTreeView->setItemDelegate(_treeViewDelegate); + _dwGroups->setWidget(_groupsTreeView); + _groupsTreeView->show(); + + // Mesh + _dwMesh = new QDockWidget(aParent); +// _dwMesh->installEventFilter(this); + _dwMesh->setVisible(false); + _dwMesh->setWindowTitle("Mesh"); + _dwMesh->setMinimumWidth(DW_MINIMUM_WIDTH); // --- force a minimum until display + _meshTreeView = new QTreeView(_dwMesh); + // _meshTreeView->setMinimumHeight(DW_MINIMUM_WIDTH); + _meshTreeView->setEditTriggers(QAbstractItemView::AllEditTriggers); + _meshTreeView->setSelectionMode(QAbstractItemView::SingleSelection); + _meshTreeView->setItemDelegate(_treeViewDelegate); + _dwMesh->setWidget(_meshTreeView); + _meshTreeView->show(); + // _dwMesh->raise(); + + + + //3) ************* documents ( salome objectbrowser ) + QDockWidget *_dwObjectBrowser = 0; + QWidget* wid = getApp()->objectBrowser()->treeView(); + // QWidget *wid = application()->objectBrowser()->treeView(); + QWidget *w = wid->parentWidget(); + while ( w && !_dwObjectBrowser ) { + _dwObjectBrowser = ::qobject_cast( w ); + w = w->parentWidget(); + } +// _dwObjectBrowser->installEventFilter(this); +// _dwObjectBrowser->setVisible(false); + _dwObjectBrowser->setMinimumWidth(DW_MINIMUM_WIDTH); // --- force a minimum until display + _dwObjectBrowser->setWindowTitle("Study"); + + + // dock widget position + // aParent->addDockWidget(Qt::LeftDockWidgetArea, _dwPattern); + // aParent->addDockWidget(Qt::RightDockWidgetArea, _dwInputPanel); + // aParent->addDockWidget( Qt::LeftDockWidgetArea, _dwPattern ); + aParent->addDockWidget( Qt::LeftDockWidgetArea, _dwObjectBrowser ); + aParent->addDockWidget( Qt::LeftDockWidgetArea, _dwInputPanel ); + + aParent->tabifyDockWidget( _dwObjectBrowser, _dwPattern ); + aParent->tabifyDockWidget( _dwPattern, /*_dwAssociation ); + aParent->tabifyDockWidget( _dwAssociation, */_dwGroups ); + aParent->tabifyDockWidget( _dwGroups, _dwMesh ); + + +#if QT_VERSION >= 0x040500 + aParent->setTabPosition(Qt::AllDockWidgetAreas, Resource::tabPanelsUp? QTabWidget::North: QTabWidget::South); +#endif + + +// connect( _dwPattern, SIGNAL( visibilityChanged(bool) ), this, SLOT( showPatternMenus(bool) ) ); +// // connect( _dwAssociation, SIGNAL( visibilityChanged(bool) ), this, SLOT( showAssociationMenus(bool) ) ); +// connect( _dwGroups, SIGNAL( visibilityChanged(bool) ), this, SLOT( showGroupsMenus(bool) ) ); +// connect( _dwMesh, SIGNAL( visibilityChanged(bool) ), this, SLOT( showMeshMenus(bool) ) ); + + + + // popup menu on data tree view + _patternDataTreeView->setContextMenuPolicy(Qt::CustomContextMenu); + connect(_patternDataTreeView, + SIGNAL(customContextMenuRequested(const QPoint &)), + this, + SLOT(treeContextMenu(const QPoint &))); +} + +void HEXABLOCKGUI::createActions() +{ + QMainWindow *aParent = application()->desktop(); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + + // Document + _newAct = createAction(_menuId++, + tr("Create a new document"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_NEW_DOCUMENT")), + tr("New Document"), + tr("Create a new document"), + 0, aParent, false, this, SLOT(newDocument())); + _newAct->setShortcut( Qt::CTRL + Qt::SHIFT + Qt::Key_N ); // --- QKeySequence::New ambiguous in SALOME + + _importAct = createAction(_menuId++, + tr("Load a document"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_LOAD_DOCUMENT")), + tr("Load Document"), + tr("Load a document"), + 0, aParent, false, this, SLOT(loadDocument())); + _importAct->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_O); // --- QKeySequence::Open ambiguous in SALOME + + _saveAct = createAction(_menuId++, + tr("Save the document"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_SAVE_DOCUMENT")), + tr("Save Document"), + tr("Save the document"), + 0, aParent, false, this, SLOT(saveDocument())); + +// _testAct = createAction(_menuId++, tr("Test"), resMgr->loadPixmap("HEXABLOCK", tr("ICON_TEST")), +// tr("Test"), tr("New test"), +// 0, aParent, false, this, SLOT(test_association())); + + // Pattern Data creation + _addVertex = createAction(_menuId++, + tr("Create a vertex"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_ADD_VERTEX")), + tr("Add Vertex"), + tr("Create a new vertex"), + 0, aParent, false, this, SLOT(addVertex())); + + _addEdge = createAction(_menuId++, + tr("Create an edge"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_ADD_EDGE")), + tr("Add Edge"), + tr("Create a new edge"), + 0, aParent, false, this, SLOT(addEdge())); + + _addQuad = createAction(_menuId++, + tr("Create a quadrangle"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_ADD_QUAD")), + tr("Add Quadrangle"), + tr("Create a new quadrangle"), + 0, aParent, false, this, SLOT(addQuad())); + + _addHexa = createAction(_menuId++, + tr("Create an hexahedron"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_ADD_HEXA")), + tr("Add Hexahedron"), + tr("Create a new hexahedron"), + 0, aParent, false, this, SLOT(addHexa())); + + // Builder Data creation + _addVector = createAction(_menuId++, + tr("Create a vector"), + resMgr->loadPixmap( "HEXABLOCK", tr("ICON_ADD_VECTOR")), + tr("Add Vector"), + tr("Create a new vector"), + 0, aParent, false, this, SLOT(addVector())); + + _addCylinder = createAction(_menuId++, + tr("Create a cylinder"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_ADD_CYLINDER")), + tr("Add Cylinder"), + tr("Create a new cylinder"), + 0, aParent, false, this, SLOT(addCylinder())); + + _addPipe = createAction(_menuId++, + tr("Create a pipe"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_ADD_PIPE")), + tr("Add Pipe"), + tr("Create a new pipe"), + 0, aParent, false, this, SLOT(addPipe())); + + _makeGrid = createAction(_menuId++, + tr("Make a grid"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_MAKE_GRID")), + tr("Make Grid"), + tr("Make a grid"), + 0, aParent, false, this, SLOT(makeGrid())); + + _makeCylinder = createAction(_menuId++, + tr("Make a cylinder"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_MAKE_CYLINDER")), + tr("Make Cylinder"), + tr("Make a cylinder"), + 0, aParent, false, this, SLOT(makeCylinder())); + + _makePipe = createAction(_menuId++, + tr("Make a pipe"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_MAKE_PIPE")), + tr("Make Pipe"), + tr("Make a pipe"), + 0, aParent, false, this, SLOT(makePipe())); + + _makeCylinders = createAction(_menuId++, + tr("Make cylinders"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_MAKE_CYLINDERS")), + tr("Make Cylinders"), + tr("Make cylinders"), + 0, aParent, false, this, SLOT(makeCylinders())); + + _makePipes = createAction(_menuId++, + tr("Make pipes"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_MAKE_PIPES")), + tr("Make Pipes"), + tr("Make pipes"), + 0, aParent, false, this, SLOT(makePipes())); + +// // _makeRind = createAction( _menuId++, tr("Make rind"), resMgr->loadPixmap( "HEXABLOCK", tr("ICON_MAKE_RIND")), +// // tr("Make rind"), tr("Make rind"), +// // 0, aParent, false, this, SLOT(makeRind())); + + _makeHemiSphere = createAction(_menuId++, + tr("Make an hemisphere"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_MAKE_HEMISPHERE")), + tr("Make Hemisphere"), + tr("Make an hemisphere"), + 0, aParent, false, this, SLOT(makeHemiSphere())); + + // Pattern Data edition + _removeHexa = createAction(_menuId++, + tr("Remove hexahedra"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_REMOVE_HEXA")), + tr("Remove Hexahedra"), + tr("Remove hexahedra"), + 0, aParent, false, this, SLOT(removeHexa())); + + _prismQuad = createAction(_menuId++, + tr("Prism quadrangles"), + resMgr->loadPixmap( "HEXABLOCK", tr("ICON_PRISM_QUAD")), + tr("Prism Quadrangles"), + tr("Prism quadrangles"), + 0, aParent, false, this, SLOT(prismQuad())); + + _joinQuad = createAction(_menuId++, + tr("Join quadrangles"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_JOIN_QUAD")), + tr("Join Quadrangles"), + tr("Join quadrangles with hexahedra"), + 0, aParent, false, this, SLOT(joinQuad())); + + _merge = createAction(_menuId++, + tr("Merge"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_MERGE")), + tr("Merge"), + tr("Merge"), + 0, aParent, false, this, SLOT(merge())); + + _disconnect = createAction(_menuId++, + tr("Disconnect"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_DISCONNECT")), + tr("Disconnect"), + tr("Disconnect edges, vertexes or quadrangles"), + 0, aParent, false, this, SLOT(disconnectElts())); + + _cutEdge = createAction(_menuId++, + tr("Cut edge"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_CUT_EDGE")), + tr("Cut Edge"), + tr("Cut edge"), + 0, aParent, false, this, SLOT(cutEdge())); + + _makeTransformation = createAction(_menuId++, + tr("Make transformation"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_MAKE_TRANSFORMATION")), + tr("Make Transformation"), + tr("Make transformation"), + 0, aParent, false, this, SLOT(makeTransformation())); + + _makeSymmetry = createAction(_menuId++, + tr("Make symmetry"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_MAKE_SYMMETRY")), + tr("Make Symmetry"), + tr("Make symmetry"), + 0, aParent, false, this, SLOT(makeSymmetry())); + + _performTransformation = createAction(_menuId++, + tr("Perform transformation"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_PERFORM_TRANSFORMATION")), + tr("Perform Transformation"), + tr("Perform transformation"), + 0, aParent, false, this, SLOT(performTransformation())); + + _performSymmetry = createAction(_menuId++, + tr("Perform symmetry"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_PERFORM_SYMMETRY")), + tr("Perform Symmetry"), + tr("Perform symmetry"), + 0, aParent, false, this, SLOT(performSymmetry())); + + _replaceHexa = createAction(_menuId++, + tr("Replace hexahedron"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_REPLACE_HEXA")), + tr("Replace Hexahedron"), + tr("Replace hexahedron"), + 0, aParent, false, this, SLOT(replaceHexa())); + + _quadRevolution = createAction(_menuId++, + tr("Quad revolution"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_QUAD_REVOLUTION")), + tr("Quad Revolution"), + tr("Quad revolution"), + 0, aParent, false, this, SLOT(quadRevolution())); + + // Association + _assocVertex = createAction(_menuId++, + tr("Make vertex association"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_VERTEX_ASSOCIATION")), + tr("Make Vertex association"), + tr("Make vertex association"), + 0, aParent, false, this, SLOT(assocVertex())); + + _assocEdge = createAction(_menuId++, + tr("Make edge association"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_EDGE_ASSOCIATION")), + tr("Make Edge Association"), + tr("Make edge association"), + 0, aParent, false, this, SLOT(assocEdge())); + + _assocQuad = createAction(_menuId++, + tr("Make quadrangle association"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_QUAD_ASSOCIATION")), + tr("Make Quadrangle Association"), + tr("Make quadrangle association"), + 0, aParent, false, this, SLOT(assocQuad())); + + // Group + _addGroup = createAction(_menuId++, + tr("Add a group"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_ADD_GROUP")), + tr("Add Group"), + tr("Add a group"), + 0, aParent, false, this, SLOT(addGroup())); + + _removeGroup = createAction(_menuId++, + tr("Remove a group"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_REMOVE_GROUP")), + tr("Remove Group"), + tr("Remove a group"), + 0, aParent, false, this, SLOT(removeGroup())); + + // Mesh + _addLaw = createAction(_menuId++, + tr("Add a law"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_ADD_LAW")), + tr("Add Law"), + tr("Add a law"), + 0, aParent, false, this, SLOT(addLaw())); + + _removeLaw = createAction(_menuId++, + tr("Remove a law"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_REMOVE_LAW")), + tr("Remove Law"), + tr("Remove a law"), + 0, aParent, false, this, SLOT(removeLaw())); + + _setPropagation = createAction(_menuId++, + tr("Set propagation"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_SET_PROPAGATION")), + tr("Set Propagation"), + tr("Set propagation"), + 0, aParent, false, this, SLOT(setPropagation())); + + _computeMesh = createAction(_menuId++, + tr("Compute mesh"), + resMgr->loadPixmap("HEXABLOCK", tr("ICON_COMPUTE_MESH")), + tr("Compute Mesh"), + tr("Compute mesh"), + 0, aParent, false, this, SLOT(computeMesh())); + + + // _newAct->setShortcut( Qt::CTRL + Qt::SHIFT + Qt::Key_N ); // --- QKeySequence::New ambiguous in SALOME + // QAction* createAction(const int id, + // const QString& toolTip, + // const QIcon& icon, + // const QString& menu, + // const QString& status, + // const int shortCut, + // QObject* parent =0, + // bool checkable = false, + // QObject* receiver =0, + // const char* member =0); +} + + +void HEXABLOCKGUI::createMenus() +{ + int aMenuId, subMenuId; + aMenuId = createMenu( tr("MEN_FILE"), -1, -1 ); + createMenu( separator(), aMenuId, -1, 10 ); + aMenuId = createMenu( tr("HEXABLOCK"), aMenuId, -1, 10 ); + createMenu( _newAct, aMenuId ); + createMenu( _importAct, aMenuId ); + createMenu( _saveAct, aMenuId ); +// createMenu( _testAct, aMenuId ); + +// aMenuId = createMenu( tr( "HEXABLOCK" ), -1, -1, 30 ); + aMenuId = createMenu( tr( "Document" ), -1, -1, 30 ); + createMenu( _newAct, aMenuId );//, 10 + createMenu( _importAct, aMenuId ); + createMenu( _saveAct, aMenuId ); +// createMenu( _testAct, aMenuId ); + + aMenuId = createMenu( tr("Model"), -1, -1, 30 ); + subMenuId = createMenu( tr( "Construction" ), aMenuId, -1 ); + createMenu( _addVertex, subMenuId ); + createMenu( _addEdge, subMenuId ); + createMenu( _addQuad, subMenuId ); + createMenu( _addHexa, subMenuId ); + //createMenu( separator(), aMenuId); + + // Pattern Builder + createMenu( _addVector, subMenuId ); + createMenu( _addCylinder, subMenuId ); + createMenu( _addPipe, subMenuId ); + //createMenu( separator(), aMenuId); + createMenu( _makeGrid, subMenuId ); //Cartesian, Cylindrical, Spherical + createMenu( _makeCylinder, subMenuId ); + createMenu( _makePipe, subMenuId ); + createMenu( _makeCylinders,subMenuId ); + createMenu( _makePipes, subMenuId ); +// createMenu( _makeRind, aMenuId ); + createMenu( _makeHemiSphere,subMenuId ); + //createMenu( separator(), aMenuId); + + // Pattern Data Edition + subMenuId = createMenu( tr( "Operation" ), aMenuId, -1 ); + createMenu( _removeHexa, subMenuId ); + createMenu( _prismQuad, subMenuId ); + createMenu( _joinQuad, subMenuId ); + createMenu( _merge, subMenuId );// createMenu( _mergeVertices, aMenuId ); // createMenu( _mergeEdges, aMenuId ); + createMenu( _disconnect, subMenuId ); + createMenu( _cutEdge, subMenuId ); + createMenu( _makeTransformation, subMenuId ); // createMenu( _makeTranslation, aMenuId ); + createMenu( _makeSymmetry, subMenuId ); + createMenu( _performTransformation, subMenuId ); + createMenu( _performSymmetry, subMenuId ); + createMenu( _replaceHexa, subMenuId ); + createMenu( _quadRevolution, subMenuId ); + + // Association + aMenuId = createMenu( tr("Association"), -1, -1, 30 ); + createMenu( _assocVertex, aMenuId ); + createMenu( _assocEdge, aMenuId ); + createMenu( _assocQuad, aMenuId ); + + // Group + aMenuId = createMenu( tr("Groups"), -1, -1, 30 ); + createMenu( _addGroup, aMenuId ); + createMenu( _removeGroup, aMenuId ); //CS_TODO + + // Law + aMenuId = createMenu( tr("Mesh "), -1, -1, 30 ); + createMenu( _addLaw, aMenuId ); + createMenu( _removeLaw, aMenuId ); + createMenu( _setPropagation, aMenuId ); + createMenu( _computeMesh, aMenuId ); +} + + +void HEXABLOCKGUI::createTools() +{ + int aToolId; + + aToolId = createTool ( tr( "HexaBlock Toolbar" ) ); + createTool( _newAct, aToolId ); + createTool( _importAct, aToolId ); + createTool( _saveAct, aToolId ); +// createTool( _testAct, aToolId ); + //createTool( separator(), aToolId ); + + // Pattern Data + aToolId = createTool ( tr( "Construction" ) ); + createTool( _addVertex, aToolId ); + createTool( _addEdge, aToolId ); + createTool( _addQuad, aToolId ); + createTool( _addHexa, aToolId ); + //createTool( separator(), aToolId ); + + // Pattern Builder + createTool( _addVector, aToolId ); + createTool( _addCylinder, aToolId ); + createTool( _addPipe, aToolId ); + //createTool( separator(), aToolId ); + + createTool( _makeGrid, aToolId ); + createTool( _makeCylinder, aToolId ); + createTool( _makePipe, aToolId ); + createTool( _makeCylinders,aToolId ); + createTool( _makePipes, aToolId ); +// createTool( _makeRind, aToolId); + createTool( _makeHemiSphere, aToolId ); + //createTool( separator(), aToolId ); + + // Pattern Data Edition + aToolId = createTool ( tr( "Operation" ) ); + createTool( _removeHexa, aToolId ); + createTool( _prismQuad, aToolId ); + createTool( _joinQuad, aToolId ); + createTool( _merge, aToolId ); + createTool( _disconnect, aToolId ); + createTool( _cutEdge, aToolId ); + createTool( _makeTransformation, aToolId ); + createTool( _makeSymmetry, aToolId ); + createTool( _performTransformation, aToolId ); + createTool( _performSymmetry, aToolId ); + createTool( _replaceHexa, aToolId ); + createTool( _quadRevolution, aToolId ); + //createTool( separator(), aToolId ); + + // Association + aToolId = createTool ( tr( "Association" ) ); + createTool( _assocVertex, aToolId ); + createTool( _assocEdge, aToolId ); + createTool( _assocQuad, aToolId ); + //createTool( separator(), aToolId ); + + // Group + aToolId = createTool ( tr( "Group" ) ); + createTool( _addGroup, aToolId ); + createTool( _removeGroup, aToolId ); //CS_TODO + //createTool( separator(), aToolId ); + + // Law + aToolId = createTool ( tr( "Mesh" ) ); + createTool( _addLaw, aToolId ); + createTool( _removeLaw, aToolId ); + createTool( _setPropagation, aToolId ); + createTool( _computeMesh, aToolId ); + +} + +void HEXABLOCKGUI::initialMenus() +{ + showDocumentMenus( true ); + showPatternMenus( false ); + showAssociationMenus( false ); + showGroupsMenus( false ); + showMeshMenus( false ); +} + +void HEXABLOCKGUI::showAllMenus() +{ + showDocumentMenus( true ); + showPatternMenus( true ); + showAssociationMenus( true ); + showGroupsMenus( true ); + showMeshMenus( true ); +} + + +void HEXABLOCKGUI::showDocumentMenus(bool show) +{ + DEBTRACE("HEXABLOCKGUI::showDocumentMenus " << show); + show = true; // + setMenuShown(_newAct, show); + setToolShown(_newAct, show); + setMenuShown(_importAct, show); + setToolShown(_importAct, show); + setMenuShown(_saveAct, show); + setToolShown(_saveAct, show); +// setMenuShown(_testAct, show); +// setToolShown(_testAct, show); +} + +void HEXABLOCKGUI::showPatternMenus(bool show) +{ + DEBTRACE("HEXABLOCKGUI::showPatternMenus " << show); + DEBTRACE("_currentModel " << _currentModel ); + if ( show && !_currentModel ) return; + + setMenuShown(_addVertex, show );//true); + setToolShown(_addVertex, show); + setMenuShown(_addEdge, show );//true); + setToolShown(_addEdge, show); + setMenuShown(_addQuad, show );//true); + setToolShown(_addQuad, show); + setMenuShown(_addHexa, show );//true); + setToolShown(_addHexa, show); + + + setMenuShown( _addVector, show );//true); + setToolShown( _addVector, show); + setMenuShown( _addCylinder, show );//true); + setToolShown( _addCylinder, show); + setMenuShown( _addPipe, show );//true); + setToolShown( _addPipe, show); + setMenuShown( _makeGrid, show );//true); + setToolShown( _makeGrid, show); + setMenuShown( _makeCylinder, show );//true); + setToolShown( _makeCylinder, show); + setMenuShown( _makePipe, show );//true); + setToolShown( _makePipe, show); + setMenuShown( _makeCylinders, show );//true); + setToolShown( _makeCylinders, show); + setMenuShown( _makePipes, show );//true); + setToolShown( _makePipes, show); +// setMenuShown( _makeRind, show );//true); +// setToolShown( _makeRind, show); + setMenuShown( _makeHemiSphere, show );//true); + setToolShown( _makeHemiSphere, show); + + // Pattern Data Edition + setMenuShown( _removeHexa, show );//true); + setToolShown( _removeHexa, show); + setMenuShown( _prismQuad, show );//true); + setToolShown( _prismQuad, show); + setMenuShown( _joinQuad, show );//true); + setToolShown( _joinQuad, show); + setMenuShown( _merge, show );//true); + setToolShown( _merge, show); + setMenuShown( _disconnect, show );//true); + setToolShown( _disconnect, show); + setMenuShown( _cutEdge, show );//true); + setToolShown( _cutEdge, show); + setMenuShown( _makeTransformation, show );//true); + setToolShown( _makeTransformation, show); + setMenuShown( _makeSymmetry, show );//true); + setToolShown( _makeSymmetry, show); + setMenuShown( _performTransformation, show );//true); + setToolShown( _performTransformation, show); + setMenuShown( _performSymmetry, show );//true); + setToolShown( _performSymmetry, show); + setMenuShown( _replaceHexa, show );//true); + setToolShown( _replaceHexa, show); + setMenuShown( _quadRevolution, show );//true); + setToolShown( _quadRevolution, show); + +} + + +void HEXABLOCKGUI::showAssociationMenus(bool show) +{ + DEBTRACE("HEXABLOCKGUI::showAssociationMenus" << show); + if ( show && !_currentModel ) return; + + // Association Edition + setMenuShown( _assocVertex, show ); + setToolShown( _assocVertex, show); + setMenuShown( _assocEdge, show ); + setToolShown( _assocEdge, show); + setMenuShown( _assocQuad, show ); + setToolShown( _assocQuad, show); + +} + +void HEXABLOCKGUI::showGroupsMenus(bool show) +{ + DEBTRACE("HEXABLOCKGUI::showGroupsMenus" << show); + if ( show && !_currentModel ) return; + setMenuShown( _addGroup, show );//true); + setToolShown( _addGroup, show); + setMenuShown( _removeGroup , show );//true); + setToolShown( _removeGroup , show); +} + +void HEXABLOCKGUI::showMeshMenus(bool show) +{ + DEBTRACE("HEXABLOCKGUI::showMeshMenus" << show); + if ( show && !_currentModel ) return; + setMenuShown( _addLaw, show );//true); + setToolShown( _addLaw, show); + setMenuShown( _removeLaw, show );//true); + setToolShown( _removeLaw, show);; + setMenuShown( _setPropagation, show );//true); + setToolShown( _setPropagation, show); + setMenuShown( _computeMesh, show); //true); + setToolShown( _computeMesh, show); +} + + + +void HEXABLOCKGUI::switchModel(SUIT_ViewWindow *view) +{ + DEBTRACE("HEXABLOCKGUI::switchModel " << view); + + if ( _documentModels.count(view) == 0 ){ + DEBTRACE("HEXABLOCKGUI::switchModel : no model found, cannot switch"); + initialMenus(); + return; + } + + if ( _currentModel != _documentModels[view] ){ // need to switch + if (_dwInputPanel){ + QWidget* w = _dwInputPanel->widget(); + if (w) w->close(); + } + + // models + _currentModel = _documentModels[view]; + _patternDataModel->setSourceModel(_currentModel); + _patternBuilderModel->setSourceModel(_currentModel); +// _associationsModel->setSourceModel(_currentModel); + _groupsModel->setSourceModel(_currentModel); + _meshModel->setSourceModel(_currentModel); + + // associate models and views + _currentGraphicView = _documentView[view]; +// _currentGraphicView->setModel(_patternDataModel); +// connect( _currentModel, SIGNAL(patternDataChanged() ), _currentGraphicView, SLOT ( onPatternDatachanged() ) ); + _currentGraphicView->setModel(_currentModel); + + _patternDataTreeView->setModel(_patternDataModel); //_currentModel + _patternBuilderTreeView->setModel(_patternBuilderModel);//_currentModel +// _associationTreeView->setModel(_associationsModel);; + _groupsTreeView->setModel(_groupsModel); + _meshTreeView->setModel(_meshModel); + + // set selections for each view + if ( _patternDataSelectionModel ) delete _patternDataSelectionModel; + if ( _patternBuilderSelectionModel ) delete _patternBuilderSelectionModel; + if ( _groupsSelectionModel ) delete _groupsSelectionModel; + if ( _meshSelectionModel ) delete _meshSelectionModel; + + _patternDataSelectionModel = new PatternDataSelectionModel( _patternDataModel ); + _patternBuilderSelectionModel = new PatternBuilderSelectionModel( _patternBuilderModel, _patternDataSelectionModel ); + _groupsSelectionModel = new GroupsSelectionModel( _groupsModel ); + _meshSelectionModel = new MeshSelectionModel( _meshModel ); + + _patternDataSelectionModel->setSalomeSelectionMgr( selectionMgr() ); +// _meshSelectionModel->setSalomeSelectionMgr( selectionMgr() ); +// _patternDataSelectionModel->setGeomEngine( _geomEngine ); + + _currentGraphicView->setSelectionModel(_patternDataSelectionModel); + + _patternDataTreeView->setSelectionModel(_patternDataSelectionModel); + _patternDataTreeView->setEditTriggers(/*QAbstractItemView::EditKeyPressed*/QAbstractItemView::AllEditTriggers /*QAbstractItemView::NoEditTriggers*/); + + _patternBuilderTreeView->setSelectionModel(_patternBuilderSelectionModel); + _patternBuilderTreeView->setEditTriggers(QAbstractItemView::AllEditTriggers); + + _groupsTreeView->setSelectionModel(_groupsSelectionModel); + _groupsTreeView->setEditTriggers(QAbstractItemView::AllEditTriggers); + + _meshTreeView->setSelectionModel( _meshSelectionModel ); + _meshTreeView->setEditTriggers(QAbstractItemView::AllEditTriggers); + + + // delegate for edition + _treeViewDelegate->setDocumentModel( _currentModel ); + _treeViewDelegate->setPatternDataSelectionModel( _patternDataSelectionModel ); + _treeViewDelegate->setPatternBuilderSelectionModel( _patternBuilderSelectionModel ); + _treeViewDelegate->setGroupsSelectionModel( _groupsSelectionModel /*_groupsTreeView->selectionModel()*/ ); + _treeViewDelegate->setMeshSelectionModel( _meshSelectionModel/*_meshTreeView->selectionModel()*/ ); + + + connect( _patternDataSelectionModel, SIGNAL( selectionChanged(const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + connect( _patternBuilderSelectionModel, SIGNAL( selectionChanged(const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + connect( _groupsSelectionModel, SIGNAL( selectionChanged(const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + connect( _meshSelectionModel, SIGNAL( selectionChanged(const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + + + currentVtkView = dynamic_cast( _currentGraphicView->get_SUIT_ViewWindow() ); + } + + showPatternMenus(true); +} + + + + +void HEXABLOCKGUI::showDockWidgets(bool isVisible) +{ + DEBTRACE("HEXABLOCKGUI::showDockWidgets " << isVisible); + + if (_dwObjectBrowser) _dwObjectBrowser->setVisible(isVisible); + if (_dwObjectBrowser) _dwObjectBrowser->toggleViewAction()->setVisible(isVisible); + + if (_dwPattern) _dwPattern->setVisible(isVisible); + if (_dwPattern) _dwPattern->toggleViewAction()->setVisible(isVisible); + +// if (_dwAssociation) _dwAssociation->setVisible(isVisible); +// if (_dwAssociation) _dwAssociation->toggleViewAction()->setVisible(isVisible); + + if (_dwMesh) _dwMesh->setVisible(isVisible); + if (_dwMesh) _dwMesh->toggleViewAction()->setVisible(isVisible); + + if (_dwGroups) _dwGroups->setVisible(isVisible); + if (_dwGroups) _dwGroups->toggleViewAction()->setVisible(isVisible); + + if (_dwInputPanel) _dwInputPanel->setVisible(isVisible); + if (_dwInputPanel) _dwInputPanel->toggleViewAction()->setVisible(isVisible); + + QWidget* w = _dwInputPanel->widget(); + if (w) w->show(); +// if ( isVisible ) _dwObjectBrowser->raise();//_dwPattern->raise(); +} + + +// void HEXABLOCKGUI::raiseStacked() +// { +// // if (_dwStacked) _dwStacked->raise(); +// } + + + + +DocumentGraphicView* HEXABLOCKGUI::newGraphicView() +{ + MESSAGE("HEXABLOCKGUI::newGraphicView"); + DocumentGraphicView *newGView = 0; + SUIT_ViewWindow *suitVW = NULL; + + SUIT_ViewManager *suitVM = getApp()->getViewManager(SVTK_Viewer::Type(), true); + MESSAGE("suitVM->getViewsCount() => " << suitVM->getViewsCount() ); + suitVW = suitVM->getActiveView(); + if ( _documentView.count(suitVW) > 0) + suitVW = suitVM->createViewWindow(); + + if ( suitVW ){ + suitVW->setClosable(false); + newGView = new DocumentGraphicView(getApp(), suitVW, application()->desktop()); + _documentView[suitVW] = newGView; + } + + return newGView; +} + + + + + + + + +void HEXABLOCKGUI::testDocument() +{ + //CS_TEST + // ---------- +// QStandardItem *parentItem = _currentModel->invisibleRootItem(); +// QStandardItem *myItem = new QStandardItem("MyItem"); +// parentItem->appendRow(myItem); +// // ---------- +// QModelIndex v0 = _currentModel->addVertex(0., 0., 0.); +// QModelIndex v1 = _currentModel->addVertex(5., 0., 0.); +// QModelIndex v2 = _currentModel->addVertex(5., 5., 0.); +// QModelIndex v3 = _currentModel->addVertex(0., 5., 0.); +// QModelIndex v4 = _currentModel->addVertex(0., 0., 5.); +// QModelIndex v5 = _currentModel->addVertex(5., 0., 5.); +// QModelIndex v6 = _currentModel->addVertex(5., 5., 5.); +// QModelIndex v7 = _currentModel->addVertex(0., 5., 5.); +// // +// // +// QModelIndex q0 = _currentModel->addQuadVertices( v0, v1, v2, v3 ); +// QModelIndex q1 = _currentModel->addQuadVertices( v4, v5, v6, v7 ); +// QModelIndex q2 = _currentModel->addQuadVertices( v0, v3, v7, v4 ); +// QModelIndex q3 = _currentModel->addQuadVertices( v1, v2, v6, v5 ); +// QModelIndex q4 = _currentModel->addQuadVertices( v0, v1, v5, v4 ); +// QModelIndex q5 = _currentModel->addQuadVertices( v3, v2, v6, v7 ); +// +// QModelIndex h0 = _currentModel->addHexaQuad( q0, q1, q2, q3, q4, q5 ); +// QModelIndex vx = _currentModel->addVector(1., 0., 0.); +// QModelIndex vy = _currentModel->addVector(0., 1., 0.); +// QModelIndex vz = _currentModel->addVector(0., 0., 1.); +// + + + +// // QModelIndex orig1 = _currentModel->addVertex (0, 0,0); +// // QModelIndex orig2 = _currentModel->addVertex (50,0,0); +// // QModelIndex vz = _currentModel->addVector (0,0,1); +// // QModelIndex vx = _currentModel->addVector (1,0,0); +// // +// // int nr = 4; +// // int nri = 3; +// // int nre = nr; +// // int na = 9; +// // int nl = 5; +// // +// // QModelIndex cyl = _currentModel->addCylinder (orig1, vz, nr, nl); +// // QModelIndex pipe = _currentModel->addPipe (orig2, vz, nri, nre, nl); +// // +// // _currentModel->makeCylinder (cyl, vx, nr, na, nl); +// // _currentModel->makePipe(pipe, vx, nr, na, nl); + + + +// newMesh( "toto", 3, "FactoryServer"); +// newMesh +} + +void HEXABLOCKGUI::test_make_cart_grid() +{ +QModelIndex orig1 = _currentModel->addVertex( 0, 0, 0); +QModelIndex orig2 = _currentModel->addVertex( 10, 0, 0); +QModelIndex orig3 = _currentModel->addVertex( 0, 10, 0); +QModelIndex orig4 = _currentModel->addVertex( 10, 10, 0); +QModelIndex orig5 = _currentModel->addVertex( 0, 20, 0); +QModelIndex orig6 = _currentModel->addVertex( 10, 20, 0); + +QModelIndex vz = _currentModel->addVector(0, 0, 1); +QModelIndex vx = _currentModel->addVector(1, 0, 0); + +//int dr = 1; +//int dl = 1; +//int nr = 2; +//int nl = 3; + +// QModelIndex c1 = _currentModel->makeCylindrical(orig1, vx, vz, dr, 360, dl, nr, 4, nl, true); +// QModelIndex c2 = _currentModel->makeCylindrical(orig2, vx, vz, dr, 360, dl, nr, 8, nl, true); +// QModelIndex c3 = _currentModel->makeCylindrical(orig3, vx, vz, dr, 270, dl, nr, 8, nl, true); +// QModelIndex c4 = _currentModel->makeCylindrical(orig4, vx, vz, dr, 270, dl, nr, 7, nl, true); +// QModelIndex c5 = _currentModel->makeCylindrical(orig5, vx, vz, dr, 360, dl, nr, 5, nl, true); +// QModelIndex c6 = _currentModel->makeCylindrical(orig6, vx, vz, dr, 360, dl, nr, 6, nl, true); + +} + + +void HEXABLOCKGUI::test_make_elmts_transform() +{ + +int size_x = 1; +int size_y = 1; +int size_z = 2; + +QModelIndex orig = _currentModel->addVertex(0, 0, 0); +QModelIndex dirVr = _currentModel->addVector(1, 1, 1); + +QModelIndex grid = _currentModel->makeCartesian(orig, dirVr, size_x, size_y, size_z);//, 0, 0, 0); +// orig.setScalar(2); + +// file_name = os.path.join(os.environ['TMP'], 'transfo0.vtk') +// _currentModel->saveVtk(file_name) + +QModelIndex devant = _currentModel->addVector(5, 0, 0); +QModelIndex grid2 = _currentModel->makeTranslation(grid, devant); + +// file_name = os.path.join(os.environ['TMP'], 'transfo_translation.vtk') +// _currentModel->saveVtk(file_name) + +QModelIndex grid4 = _currentModel->makeRotation(grid2, orig, dirVr, 45); + + +// file_name = os.path.join(os.environ['TMP'], 'transfo_rotation.vtk'); +// _currentModel->saveVtk(file_name); + + +// print "...test make elements by transforming elements OK" +} + + +void HEXABLOCKGUI::test() +{ + DEBTRACE("HEXABLOCKGUI::test"); + _currentGraphicView->update(); + +} + +void HEXABLOCKGUI::test_association() +{ + DEBTRACE("HEXABLOCKGUI::test_association"); + newDocument(); + + QModelIndex v0, v1, v2, v3, e0, e1, q0; + + DocumentModel::GeomObj v0Assoc, v1Assoc, v2Assoc, v3Assoc; + DocumentModel::GeomObj e0AssocA, e1AssocA, e1AssocB, e1AssocC; + DocumentModel::GeomObj q0AssocA, q0AssocB; + + DocumentModel::GeomObj v0Assoc_test, v1Assoc_test, v2Assoc_test, v3Assoc_test; + QList e1Assocs_test; + DocumentModel::GeomObj q0Assoc_test; + + v0 = _currentModel->addVertex(0, 0, 0); + v1 = _currentModel->addVertex(1, 0, 0); + v2 = _currentModel->addVertex(1, 1, 0); + v3 = _currentModel->addVertex(0, 1, 0); + e0 = _currentModel->addEdgeVertices(v0, v1); + e1 = _currentModel->addEdgeVertices(v1, v2); + q0 = _currentModel->addQuadVertices( v0, v1, v2, v3 ); + + +// >>> face3.GetEntry()'0:1:4' +// >>> e1.GetEntry()'0:1:8' +// >>> e2.GetEntry()'0:1:9' +// >>> e3.GetEntry()'0:1:10' +// >>> e4.GetEntry()'0:1:11' +// >>> v1.GetEntry()'0:1:12' +// >>> v2.GetEntry()'0:1:13' +// >>> v3.GetEntry()'0:1:14' +// >>> v4.GetEntry()'0:1:15' + + +// v0Assoc.name = "geomV0"; +// v0Assoc.entry = "0:1:1:1:3:6";//"0:1:12"; +// v0Assoc.brep = "brepV0"; +// v1Assoc.name = "geomV1"; +// v1Assoc.entry = "0:1:1:1:3:7";//"0:1:13"; +// v1Assoc.brep = "brepV1"; +// v2Assoc.name = "geomV2"; +// v2Assoc.entry = "0:1:1:1:3:8";//"0:1:14"; +// v2Assoc.brep = "brepV2"; +// v3Assoc.name = "geomV3"; +// v3Assoc.entry = "0:1:1:1:3:9";//"0:1:15"; +// v3Assoc.brep = "brepV3"; +// +// +// +// e0AssocA.name = "geomE0a"; +// e0AssocA.entry = "0:1:1:1:3:5";//"0:1:8"; +// e0AssocA.brep = "brepE0a"; +// e0AssocA.start = 0.10; +// e0AssocA.end = 0.95; +// +// +// +// e1AssocA.name = "geomE1a"; +// e1AssocA.entry = "0:1:1:1:3:2";//"0:1:8"; +// e1AssocA.brep = "brepE1a"; +// e1AssocA.start = 0.12; +// e1AssocA.end = 0.89; +// e1AssocB.name = "geomE1b"; +// e1AssocB.entry = "0:1:1:1:3:3";//"0:1:9"; +// e1AssocB.brep = "brepE1b"; +// e1AssocB.start = 0.20; +// e1AssocB.end = 0.80; +// e1AssocC.name = "geomE1c"; +// e1AssocC.entry = "0:1:1:1:3:4";//"0:1:10"; +// e1AssocC.brep = "brepE1c"; +// e1AssocC.start = 0.16; +// e1AssocC.end = 0.96; +// +// q0AssocA.name = "geomQuad"; +// q0AssocA.entry = "0:1:1:1:3"; +// q0AssocA.brep = "brepq0"; +// +// q0AssocB.name = "geomQuad"; +// q0AssocB.entry = "0:1:1:1:4"; +// q0AssocB.brep = "brepq0"; +// +// _currentModel->addAssociation( v0, v0Assoc ); +// _currentModel->addAssociation( v1, v1Assoc ); +// _currentModel->addAssociation( v2, v2Assoc ); +// _currentModel->addAssociation( v3, v3Assoc ); +// +// +// _currentModel->addAssociation( e0, e0AssocA ); +// +// _currentModel->addAssociation( e1, e1AssocA ); +// _currentModel->addAssociation( e1, e1AssocB ); +// _currentModel->addAssociation( e1, e1AssocC ); +// +// _currentModel->addAssociation( q0, q0AssocA ); +// _currentModel->addAssociation( q0, q0AssocB ); + + + + + +// v0Assoc_test = _currentModel->getAssociations( v0 )[0]; +// v1Assoc_test = _currentModel->getAssociations( v1 )[0]; +// v2Assoc_test = _currentModel->getAssociations( v2 )[0]; +// v3Assoc_test = _currentModel->getAssociations( v3 )[0]; +// ASSERT( v0Assoc.name == v0Assoc_test.name ); +// ASSERT( v1Assoc.name == v1Assoc_test.name ); +// ASSERT( v2Assoc.name == v2Assoc_test.name ); +// ASSERT( v3Assoc.name == v3Assoc_test.name ); +// ASSERT( v0Assoc.entry == v0Assoc_test.entry ); +// ASSERT( v1Assoc.entry == v1Assoc_test.entry ); +// ASSERT( v2Assoc.entry == v2Assoc_test.entry ); +// ASSERT( v3Assoc.entry == v3Assoc_test.entry ); +// +// +// e1Assocs_test = _currentModel->getAssociations( e1 ); +// ASSERT( e1Assocs_test[0].name == e1AssocA.name ); +// ASSERT( e1Assocs_test[1].name == e1AssocB.name ); +// ASSERT( e1Assocs_test[2].name == e1AssocC.name ); +// ASSERT( e1Assocs_test[0].entry == e1AssocA.entry ); +// ASSERT( e1Assocs_test[1].entry == e1AssocB.entry ); +// ASSERT( e1Assocs_test[2].entry == e1AssocC.entry ); +// ASSERT( e1Assocs_test[0].start == e1AssocA.start ); +// ASSERT( e1Assocs_test[1].start == e1AssocB.start ); +// ASSERT( e1Assocs_test[2].start == e1AssocC.start ); +// ASSERT( e1Assocs_test[0].end == e1AssocA.end ); +// ASSERT( e1Assocs_test[1].end == e1AssocB.end ); +// ASSERT( e1Assocs_test[2].end == e1AssocC.end ); +// +// q0Assoc_test = _currentModel->getAssociations( q0 )[0]; +// ASSERT( q0Assoc_test.name == q0Assoc.name ); +// ASSERT( q0Assoc_test.entry == q0Assoc.entry ); + + + DEBTRACE("HEXABLOCKGUI::test_association fin"); +} + + +void HEXABLOCKGUI::newDocument() +{ + DEBTRACE("HEXABLOCKGUI::newDocument"); + + SUIT_ViewWindow *suitVW = NULL; +// std::stringstream name; +// name << "newDoc_" << ++_documentCnt; +// QString fileName = name.str().c_str(); + QMainWindow *aParent = application()->desktop(); + QWidget *central = aParent->centralWidget(); + if (central) + central->setFocus(); + else + DEBTRACE("No Central Widget"); + +// BasicGUI_PointDlg* aDlg = new BasicGUI_PointDlg( NULL, aParent ); +// aDlg->show(); + + // Create Document from HEXABLOCK ENGINE + // WARNING : IN HEXABLOCK component, GUI and ENGINE share the same process + HEXABLOCK_ORB::Document_ptr docIn = _hexaEngine->addDocument("default"); + + HEXA_NS::Document* doc = NULL; + QString docEntry; + + // looking doc impl ( c++ ) + Document_impl* dServant = DownCast( docIn ); + ASSERT( dServant ); + if ( dServant) doc = dServant->GetImpl(); + +// doc->reorderFaces(); //CS_TEST + + // looking for docEntry + if ( !CORBA::is_nil(docIn) ){ + CORBA::String_var anIOR = SalomeApp_Application::orb()->object_to_string( docIn ); + QString docIOR = anIOR.in(); + SalomeApp_Study* study = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !docIOR.isEmpty() ) { + _PTR(SObject) SO( study->studyDS()->FindObjectIOR( docIOR.toLatin1().constData() ) ); + if ( SO ) + docEntry = SO->GetID().c_str(); + } + } + + DEBTRACE("HEXABLOCKGUI::newDocument docEntry "<setHeaderData(0, Qt::Horizontal, tr("HELLOH0")); +// _currentModel->setHeaderData(1, Qt::Horizontal, tr("HELLOH1")); +// _currentModel->setHeaderData(0, Qt::Vertical, tr("HELLOV0")); + _patternDataModel = new PatternDataModel(this); + _patternBuilderModel = new PatternBuilderModel(this); +// _associationsModel = new AssociationsModel(this); + _groupsModel = new GroupsModel(this); + _meshModel = new MeshModel(this); + + _patternDataModel->setSourceModel(_currentModel); + _patternBuilderModel->setSourceModel(_currentModel); +// _associationsModel->setSourceModel(_currentModel); + _groupsModel->setSourceModel(_currentModel); + _meshModel->setSourceModel(_currentModel); + + // --- new Graphic view ( SVTK ) + _currentGraphicView = newGraphicView(); + suitVW = _currentGraphicView->get_SUIT_ViewWindow(); + + // --- setting model + _currentGraphicView->setModel(_currentModel); +// _currentGraphicView->setModel(_patternDataModel); +// connect( _currentModel, SIGNAL(patternDataChanged() ), _currentGraphicView, SLOT ( onPatternDatachanged() ) ); + _patternDataTreeView->setModel(_patternDataModel);//_currentModel; +// _patternDataTreeView->setModel(_currentModel);//; + _patternBuilderTreeView->setModel(_patternBuilderModel);//_currentModel; +// _associationTreeView->setModel(_associationsModel); + _groupsTreeView->setModel(_groupsModel); + _meshTreeView->setModel(_meshModel); + + + // --- setting selection model + if ( _patternDataSelectionModel ) delete _patternDataSelectionModel; + if ( _patternBuilderSelectionModel ) delete _patternBuilderSelectionModel; + if ( _groupsSelectionModel ) delete _groupsSelectionModel; + if ( _meshSelectionModel ) delete _meshSelectionModel; + + _patternDataSelectionModel = new PatternDataSelectionModel(_patternDataModel); + _patternBuilderSelectionModel = new PatternBuilderSelectionModel( _patternBuilderModel, _patternDataSelectionModel ); + _groupsSelectionModel = new GroupsSelectionModel(_groupsModel); + _meshSelectionModel = new MeshSelectionModel(_meshModel); + + _patternDataSelectionModel->setSalomeSelectionMgr( selectionMgr() ); +// _meshSelectionModel->setSalomeSelectionMgr( selectionMgr() ); + + _currentGraphicView->setSelectionModel(_patternDataSelectionModel); + _patternDataTreeView->setSelectionModel(_patternDataSelectionModel); + _patternDataTreeView->setSelectionMode(QAbstractItemView::SingleSelection); //QAbstractItemView::MultiSelection //CS_TEST + _patternBuilderTreeView->setSelectionModel(_patternBuilderSelectionModel); + _groupsTreeView->setSelectionModel(_groupsSelectionModel); + _meshTreeView->setSelectionModel(_meshSelectionModel); + _meshTreeView->setSelectionMode(QAbstractItemView::SingleSelection); + + _treeViewDelegate->setDocumentModel( _currentModel ); + _treeViewDelegate->setPatternDataSelectionModel( _patternDataSelectionModel ); + _treeViewDelegate->setPatternBuilderSelectionModel( _patternBuilderSelectionModel ); + _treeViewDelegate->setGroupsSelectionModel( _groupsSelectionModel/*_groupsTreeView->selectionModel()*/ ); + _treeViewDelegate->setMeshSelectionModel( _meshSelectionModel/*_meshTreeView->selectionModel()*/ ); + + + connect( _patternDataSelectionModel, SIGNAL( selectionChanged(const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + connect( _patternBuilderSelectionModel, SIGNAL( selectionChanged(const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + connect( _groupsSelectionModel, SIGNAL( selectionChanged(const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + connect( _meshSelectionModel, SIGNAL( selectionChanged(const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + + + // salome view/object browser/model management + _documentModels[ suitVW ] = _currentModel; + +// _salomeViews[ _currentModel ] = suitVW; +// std::map _salomeViews; + + _salomeViewWindows[docEntry] = suitVW; + currentVtkView = dynamic_cast( _currentGraphicView->get_SUIT_ViewWindow() ); + currentVtkView->raise(); + +// _currentGraphicView->setWindowTitle( _currentModel->getName() ); +// currentVtkView->setWindowTitle( _currentModel->getName() ); +// showDockWidgets(true); +// showPatternMenus +// _dwPattern->setVisible(true); +// _dwPattern->toggleViewAction()->setVisible(true); + _dwPattern->raise(); +// testDocument(); +// test_make_cart_grid(); +// test_make_elmts_transform(); + showAllMenus(); + getApp()->updateObjectBrowser(); + +} + +void HEXABLOCKGUI::slot_modelChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) +{ + //std::cout << "HHHHHHHHHHHHHHHHHH Model changed." << std::endl; + //std::cout << "HHHHHHHHHHHHHHHHHH slot_modelChanged topLeft -> " << topLeft.data().toString().toStdString()<" << bottomRight.data().toString().toStdString()<openPersistentEditor( topLeft ); + +// // Make the combo boxes always displayed. +// for ( int i = 0; i < _currentModel->rowCount(); ++i ) +// { +// QModelIndex ind = _currentModel->index(i); +// _patternDataTreeView->openPersistentEditor( ind ); +// std::cout << "ind" << ind.data() << std::endl; +// } +} + +void HEXABLOCKGUI::loadDocument( const QString &inFile ) +{ + DEBTRACE("HEXABLOCKGUI::loadDocument"); + QMainWindow *aParent = application()->desktop(); + QString selectedFile; + + if ( inFile.isNull() ){ + QFileDialog dialog( aParent, tr("Open HexaBlock Document") , + QString::null, tr( "XML-Files (*.xml);;All Files (*)" ) ); + dialog.setHistory( getQuickDirList() ); + if (dialog.exec()){ + QStringList selectedFiles = dialog.selectedFiles(); + if (!selectedFiles.isEmpty()) + selectedFile = selectedFiles.first(); + } + } else { + selectedFile = inFile; + } + + if (! selectedFile.isEmpty()){ + newDocument(); + _currentModel->load(selectedFile); + renameObject( _currentModel->documentEntry(), _currentModel->getName() ); + } +} + +void HEXABLOCKGUI::saveDocument() +{ + QMainWindow *aParent = application()->desktop(); + QString anInitialPath = ""; + if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) + anInitialPath = QDir::currentPath(); +// QString aMeshName = anIO->getName(); + + QString aDocName = "document"; + QStringList filter; + filter.append( QObject::tr( "XML_FILES_FILTER" ) + " (*.xml)" ); + filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" ); + QString aFilename = anInitialPath + QString("/") + aDocName; + aFilename = SUIT_FileDlg::getFileName( aParent, + aFilename, + filter, + tr( "Save HexaBlock Document" ), + false ); + //std::cout<<"HEXABLOCKGUI::saveDocument()"<save( aFilename ); + } + //CS_TODO save doc +} + +void HEXABLOCKGUI::_showDialogBox( HexaBaseDialog* diag ) +{ + MESSAGE("HEXABLOCKGUI::_showDialogBox()"); + if (!diag) return; + MESSAGE("if (!diag) return;"); + if (!_dwInputPanel) return; + MESSAGE("if (!_dwInputPanel) return;"); + + diag->setDocumentModel(_currentModel); + diag->setPatternDataSelectionModel(_patternDataSelectionModel); + diag->setPatternBuilderSelectionModel(_patternBuilderSelectionModel); + diag->setGroupsSelectionModel(_groupsSelectionModel); + diag->setMeshSelectionModel(_meshSelectionModel/*_meshTreeView->selectionModel()*/); + + QWidget* w = _dwInputPanel->widget(); + if (w) w->hide(); + + if ( !_dwInputPanel->isVisible() ) _dwInputPanel->setVisible(true); + _dwInputPanel->setWidget(diag); + _dwInputPanel->setWindowTitle(diag->windowTitle()); + diag->show(); +} + + +void HEXABLOCKGUI::addVertex() +{ + if ( !_vertexDiag ){ + _vertexDiag = new VertexDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _vertexDiag ); +} + +void HEXABLOCKGUI::addEdge() +{ + if ( !_edgeDiag ){ + _edgeDiag = new EdgeDialog( _dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _edgeDiag ); +} + + + + +void HEXABLOCKGUI::addQuad() +{ + if ( !_quadDiag ){ + _quadDiag = new QuadDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _quadDiag ); +} + +void HEXABLOCKGUI::addHexa() +{ + if ( !_hexaDiag ){ + _hexaDiag = new HexaDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _hexaDiag ); +} + +void HEXABLOCKGUI::addVector() +{ + if ( !_vectorDiag ){ + _vectorDiag = new VectorDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _vectorDiag ); +} + +void HEXABLOCKGUI::addCylinder() +{ + if ( !_cylinderDiag ){ + _cylinderDiag = new CylinderDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _cylinderDiag ); +} + + +void HEXABLOCKGUI::addPipe() +{ + if ( !_pipeDiag){ + _pipeDiag = new PipeDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _pipeDiag ); +} + + +void HEXABLOCKGUI::makeGrid() +{ + if ( !_makeGridDiag ){ + _makeGridDiag = new MakeGridDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _makeGridDiag ); +} + + +void HEXABLOCKGUI::makeCylinder() +{ + if ( !_makeCylinderDiag ){ + _makeCylinderDiag = new MakeCylinderDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _makeCylinderDiag ); +} + +void HEXABLOCKGUI::makePipe() +{ + if ( !_makePipeDiag ){ + _makePipeDiag = new MakePipeDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _makePipeDiag ); +} + +void HEXABLOCKGUI::makeCylinders() +{ + if ( !_makeCylindersDiag ){ + _makeCylindersDiag = new MakeCylindersDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _makeCylindersDiag ); +} + +void HEXABLOCKGUI::makePipes() +{ + if ( !_makePipesDiag ){ + _makePipesDiag = new MakePipesDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _makePipesDiag ); +} + + +void HEXABLOCKGUI::makeHemiSphere() // NEW HEXA3 +{ + if ( !_makeHemiSphereDiag ){ + _makeHemiSphereDiag = new MakeHemiSphereDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _makeHemiSphereDiag ); +} + + +void HEXABLOCKGUI::removeHexa() +{ + if ( !_removeHexaDiag ){ + _removeHexaDiag = new RemoveHexaDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _removeHexaDiag ); +} + + +void HEXABLOCKGUI::prismQuad() +{ + if ( !_prismQuadDiag ){ + _prismQuadDiag = new PrismQuadDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _prismQuadDiag ); +} + + +void HEXABLOCKGUI::joinQuad() +{ + if ( !_joinQuadDiag ){ + _joinQuadDiag = new JoinQuadDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _joinQuadDiag ); +} + +void HEXABLOCKGUI::merge() +{ + if ( !_mergeDiag ){ + _mergeDiag = new MergeDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _mergeDiag ); +} + +void HEXABLOCKGUI::disconnectElts() +{ + if ( !_disconnectDiag ){ + _disconnectDiag = new DisconnectDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _disconnectDiag ); +} + +void HEXABLOCKGUI::cutEdge() +{ + if ( !_cutEdgeDiag ){ + _cutEdgeDiag = new CutEdgeDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _cutEdgeDiag ); +} + +void HEXABLOCKGUI::makeTransformation() +{ + if ( !_makeTransformationDiag ){ + _makeTransformationDiag = new MakeTransformationDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _makeTransformationDiag ); +} + + +void HEXABLOCKGUI::makeSymmetry() +{ + if ( !_makeSymmetryDiag ){ + _makeSymmetryDiag = new MakeSymmetryDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _makeSymmetryDiag ); +} + + +void HEXABLOCKGUI::performTransformation() +{ + if ( !_performTransformationDiag ){ + _performTransformationDiag = new PerformTransformationDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _performTransformationDiag ); +} + + +void HEXABLOCKGUI::performSymmetry() +{ + if ( !_performSymmetryDiag ){ + _performSymmetryDiag = new PerformSymmetryDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _performSymmetryDiag ); +} + + +void HEXABLOCKGUI::replaceHexa() // NEW HEXA3 +{ + if ( !_replaceHexaDiag ){ + _replaceHexaDiag = new ReplaceHexaDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _replaceHexaDiag ); +} + + +void HEXABLOCKGUI::quadRevolution() // NEW HEXA3 +{ + if ( !_quadRevolutionDiag ){ + _quadRevolutionDiag = new QuadRevolutionDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _quadRevolutionDiag ); +} + + +// void HEXABLOCKGUI::assocVertex() +// { +// if ( !_vertexAssocDiag ){ +// _vertexAssocDiag = new VertexAssocDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); +// } +// _showDialogBox( vertexAssocDiag ); +// } + + +void HEXABLOCKGUI::assocVertex() +{ + MESSAGE("HEXABLOCKGUI::assocVertex()"); + QWidget* d = dynamic_cast(_dwInputPanel->parent()); + if ( !_vertexAssocDiag ){ + _vertexAssocDiag = new VertexAssocDialog( NULL, d ); + } + _vertexAssocDiag->setDocumentModel(_currentModel); + _vertexAssocDiag->setPatternDataSelectionModel(_patternDataSelectionModel); + _dwInputPanel->setWidget(_vertexAssocDiag); + _dwInputPanel->setWindowTitle(_vertexAssocDiag->windowTitle()); + //_vertexAssocDiag->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + _vertexAssocDiag->show(); +} + + + +void HEXABLOCKGUI::assocEdge() +{ + if ( !_edgeAssocDiag ){ + _edgeAssocDiag = new EdgeAssocDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + _edgeAssocDiag->setGeomEngine( _geomEngine ); + } + _showDialogBox( _edgeAssocDiag ); +} + +void HEXABLOCKGUI::assocQuad() +{ + if ( !_quadAssocDiag ){ + _quadAssocDiag = new QuadAssocDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _quadAssocDiag ); +} + + +void HEXABLOCKGUI::addGroup() +{ + if ( !_groupDiag ){ + _groupDiag = new GroupDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _groupDiag ); +} + + +/* +void HEXABLOCKGUI::removeGroup() +{ + QItemSelectionModel *groupsSelectionModel = _groupsTreeView->selectionModel(); + QModelIndex selected = groupsSelectionModel->currentIndex(); + selected = _groupsModel->mapToSource( selected ); + +/* + if ( !selected.isValid() ){ + SUIT_MessageBox::information( 0, tr( "CANNOT REMOVE GROUP" ), tr( "No group selected!" ) ); + return; + } + + //Demande de confirmation de la suppression des groupes + if (SUIT_MessageBox::question( + 0, + tr("Remove Group"), + tr("Remove group : %1 ?").arg(selected.data().toString()), + SUIT_MessageBox::Ok | SUIT_MessageBox::Cancel, + SUIT_MessageBox::Cancel + ) == SUIT_MessageBox::Cancel) return; + + groupsSelectionModel->clearSelection(); + + std::cout << "////////////////////////// " << selected.data().toString().toStdString() << std::endl; + bool removed = _currentModel->removeGroup( selected ); + //std::cout << " " << selected.data().toString().toStdString() << std::endl; + if ( !removed ) { + SUIT_MessageBox::critical( 0, tr( "ERR_ERROR" ), tr( "CANNOT REMOVE %1" ).arg(selected.data().toString()) ); + groupsSelectionModel->clearSelection(); + return; + } +}*/ + + + +void HEXABLOCKGUI::removeGroup() +{ + QItemSelectionModel *groupsSelectionModel = _groupsTreeView->selectionModel(); + QModelIndexList l = groupsSelectionModel->selectedIndexes(); + int nbGroupsRemoved = 0; + + if ( l.isEmpty() ){ + SUIT_MessageBox::information( 0, tr( "CANNOT REMOVE GROUP" ), + tr( "No group selected!" ) ); + return; + } + + foreach( QModelIndex selected, l ){ + if ( selected.data(HEXA_TREE_ROLE) == GROUP_TREE ){ + selected = _groupsModel->mapToSource( selected ); + Q_ASSERT(selected.isValid()); + + //Confirm the deletion of the group + if (SUIT_MessageBox::question( + 0, + tr("Remove Group"), + tr("Remove group : %1 ?").arg(selected.data().toString()), + SUIT_MessageBox::Ok | SUIT_MessageBox::Cancel, + SUIT_MessageBox::Cancel + ) == SUIT_MessageBox::Cancel) return; + + bool removed = _currentModel->removeGroup( selected ); + if ( !removed ) { + SUIT_MessageBox::critical( 0, tr( "ERR_ERROR" ), + tr( "CANNOT REMOVE %1" ).arg(selected.data().toString()) ); + return; + } + nbGroupsRemoved++; + } + } + if (!nbGroupsRemoved) + SUIT_MessageBox::information( 0, tr( "CANNOT REMOVE GROUP" ), + tr( "No group selected!" ) ); +} + + +void HEXABLOCKGUI::addLaw() +{ + if ( !_lawDiag ){ + _lawDiag = new LawDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _showDialogBox( _lawDiag ); +} + +void HEXABLOCKGUI::removeLaw() +{ + + QModelIndexList l = _meshSelectionModel->selectedIndexes(); + int nbLawsRemoved = 0; + + if ( l.isEmpty() ){ + SUIT_MessageBox::information( 0, tr( "CANNOT REMOVE LAW" ), + tr( "No law selected!" ) ); + return; + } + + foreach( QModelIndex selected, l ){ + if ( selected.data(HEXA_TREE_ROLE) == LAW_TREE ){ + selected = _meshModel->mapToSource( selected ); + Q_ASSERT(selected.isValid()); + + //Confirm the deletion of the law + if (SUIT_MessageBox::question( + 0, + tr("Remove Law"), + tr("Remove law : %1 ?\nAll propagations having this law will \ +have the default law.").arg(selected.data().toString()), + SUIT_MessageBox::Ok | SUIT_MessageBox::Cancel, + SUIT_MessageBox::Cancel + ) == SUIT_MessageBox::Cancel) return; + + bool removed = _currentModel->removeLaw(selected); + if ( !removed ) { + SUIT_MessageBox::critical( 0, tr( "ERR_ERROR" ), + tr( "CANNOT REMOVE %1" ).arg(selected.data().toString()) ); + return; + } + nbLawsRemoved++; + } + } + if (!nbLawsRemoved) + SUIT_MessageBox::information( 0, tr( "CANNOT REMOVE LAW" ), + tr( "No law selected!" ) ); + +} + + +void HEXABLOCKGUI::setPropagation() +{ + if (!_dwInputPanel) return; + PropagationDialog* diag = new PropagationDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + diag->setDocumentModel(_currentModel); + diag->setMeshSelectionModel(_meshSelectionModel); + //diag->setValue(p); + diag->setFocus(); + _dwInputPanel->setWidget(diag); + _dwInputPanel->setWindowTitle( diag->windowTitle() ); + diag->clear(); +} + + +// Dialog box to compute a mesh from a document +// -------------------------------------------- + +void HEXABLOCKGUI::computeMesh() +{ + if ( !_computeMeshDiag ){ + _computeMeshDiag = new ComputeMeshDialog(_dwInputPanel, HexaBaseDialog::NEW_MODE); + } + _computeMeshDiag->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + _showDialogBox( _computeMeshDiag ); +} + +void HEXABLOCKGUI::clearAssociations() +{ +// QMessageBox::warning( 0, "windowTitle()", "clearAssociations" ); + QModelIndex iDataModel = _patternDataTreeView->currentIndex(); + QModelIndex iModel = _patternDataModel->mapToSource(iDataModel); + + _currentModel->clearEltAssociations(iModel); + + SUIT_MessageBox::information( 0, tr( "HEXA_INFO" ), tr( "ASSOCIATION CLEARED" ) ); +} + +void HEXABLOCKGUI::clearAllAssociations() +{ + //Confirm the deletion of the associations + if (SUIT_MessageBox::question( + 0, + tr("Clear Associations"), + tr("Clear all associations ?"), + SUIT_MessageBox::Ok | SUIT_MessageBox::Cancel, + SUIT_MessageBox::Cancel + ) == SUIT_MessageBox::Cancel) return; + + int currentChildIndex = 0; + QModelIndex currentIndex = _patternDataModel->mapToSource(_patternDataTreeView->currentIndex()); + QVariant currentAssocVariant; + QString currentAssocEntry; + + QModelIndex currentChild = currentIndex.child(currentChildIndex++, 0); + while( currentChild.isValid() ) { + + currentAssocVariant = currentChild.data( HEXA_ASSOC_ENTRY_ROLE ); + currentAssocEntry = currentChild.data( HEXA_ASSOC_ENTRY_ROLE ).toString(); + if ( currentAssocVariant.isValid() && !currentAssocEntry.isEmpty() ) + _currentModel->clearEltAssociations(currentChild); + + currentChild = currentChild.sibling(currentChildIndex++, 0); + } + + //SUIT_MessageBox::information( 0, tr( "HEXA_INFO" ), tr( "ASSOCIATION CLEARED" ) ); +} + +void HEXABLOCKGUI::showAssociations() +{ + QModelIndexList elts; + int currentChildIndex = 0; + QVariant currentAssocVariant; + QString currentAssocEntry; + QModelIndex currentIndex = _patternDataTreeView->currentIndex(); + QModelIndex currentChild = currentIndex.child(currentChildIndex++, 0); + + while( currentChild.isValid() ) { + + currentAssocVariant = currentChild.data( HEXA_ASSOC_ENTRY_ROLE ); + currentAssocEntry = currentChild.data( HEXA_ASSOC_ENTRY_ROLE ).toString(); + if ( currentAssocVariant.isValid() && !currentAssocEntry.isEmpty() ) + elts << currentChild; + + currentChild = currentChild.sibling(currentChildIndex++, 0); + } + _patternDataSelectionModel-> highlightVTKElts( elts ); + +} + + +LightApp_SelectionMgr* HEXABLOCKGUI::selectionMgr() +{ + SalomeApp_Application* anApp = dynamic_cast( SUIT_Session::session()->activeApplication() ); + if( anApp ) + return dynamic_cast( anApp->selectionMgr() ); + else + return 0; +} + +QStringList HEXABLOCKGUI::getQuickDirList() +{ + QStringList dirList; + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + if ( resMgr ) + dirList = resMgr->stringValue( "FileDlg", "QuickDirList" ).split( ';', QString::SkipEmptyParts ); + return dirList; +} + + + +// --- Export the module + +extern "C" +{ + HEXABLOCKGUI_EXPORT CAM_Module* createModule() + { + return new HEXABLOCKGUI(); + } + + HEXABLOCKGUI_EXPORT char* getModuleVersion() + { + return (char*)HEXABLOCK_VERSION_STR; + } +} + + + + + + + + + + +// void HEXABLOCKGUI::newMesh( const std::string& meshName, +// int dim, +// const std::string& container ) +// { +// SalomeApp_Application* app = getApp(); +// int activeStudyId = app->activeStudy()->id(); +// +// if ( CORBA::is_nil(_hexaEngine) ) _hexaEngine = InitHEXABLOCKGen( app ); +// if ( CORBA::is_nil(_smeshEngine)) _smeshEngine = InitSMESHGen( app, container ); +// if ( CORBA::is_nil(_geomEngine) ) _geomEngine = InitGEOMGen( app, container ); +// +// std::cout << "_hexaEngine =>" << _hexaEngine << std::endl; +// std::cout << "_smeshEngine =>" << _smeshEngine << std::endl; +// std::cout << "_geomEngine =>" << _geomEngine << std::endl; +// +// HEXA_NS::Document* docImpl = _currentModel->documentImpl(); +// std::cout << "docImpl =>" << docImpl << std::endl; +// std::cout << "docImpl->getFile() =>" << docImpl->getFile() << std::endl; +// HEXABLOCK_ORB::Document_var anDocObj= _hexaEngine->loadDocument( docImpl->getFile() ); +// std::cout << "anDocObj =>" << anDocObj << std::endl; +// +// +// GEOM::GEOM_I3DPrimOperations_var anGeomOper = _geomEngine->GetI3DPrimOperations( activeStudyId ); +// if ( CORBA::is_nil(anGeomOper) ) return; //!anGeomOper->_is_nil() ) { +// std::cout << "anGeomOper =>" << anGeomOper << std::endl; +// GEOM::GEOM_Object_var anGeomObj = anGeomOper->MakeBoxDXDYDZ( 5., 5., 5. ); +// std::cout << "anGeomObj =>" << anGeomObj << std::endl; +// +// +// SALOMEDS::SObject _geomEngine->AddInStudy (in SALOMEDS::Study theStudy, +// in GEOM_Object theObject, +// in string theName, +// +// +// +// // void GEOMBase::PublishSubObject( GEOM::GEOM_Object_ptr object ) +// // { +// SalomeApp_Study* study = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); +// if ( study && !CORBA::is_nil( object ) ) { +// _PTR(Study) studyDS = study->studyDS(); +// QString entry = GetEntry( object ); +// GEOM::GEOM_Object_var father = object->GetMainShape(); +// QString fatherEntry = GetEntry( father ); +// if ( entry.isEmpty() && !CORBA::is_nil( father ) && !fatherEntry.isEmpty() ) { +// QString name = GetName( object ); +// GeometryGUI::GetGeomGen()->AddInStudy( GeometryGUI::ClientStudyToStudy( studyDS ), +// object, name.toLatin1().data(), father.in() ); +// } +// } +// } +// +// +// // geompy = smesh.geompy +// // #fkl: shape = doc.getShape() +// // shape = geompy.MakeBox(0, 0, 0, 1, 1, 1) +// // geompy.addToStudy(shape, name) +// // +// // component = salome.lcc.FindOrLoadComponent(container, "SMESH") +// // component.init_smesh(salome.myStudy, geompy.geom) +// // mesh = component.Mesh(shape, name) +// // +// // so = "libHexaBlockEngine.so" +// // +// // algo = smesh.SMESH._objref_SMESH_Gen.CreateHypothesis(component, "HEXABLOCK_3D", so) +// SMESH::SMESH_Hypothesis_var algo = _smeshEngine->CreateHypothesis( "HEXABLOCK_3D", "libHexaBlockEngine.so"); +// // raises ( SALOME::SALOME_Exception ); +// // mesh.mesh.AddHypothesis(shape, algo) +// // +// // hypo = smesh.SMESH._objref_SMESH_Gen.CreateHypothesis(component, "HEXABLOCK_Parameters", so) +// //HEXABLOCKPlugin::HEXABLOCKPlugin_Hypothesis_var +// SMESH::SMESH_Hypothesis_var hypo = _smeshEngine->CreateHypothesis( "HEXABLOCK_Parameters", "libHexaBlockEngine.so"); +// +// HEXABLOCKPlugin::HEXABLOCKPlugin_Hypothesis_var hexHypo = HEXABLOCKPlugin::HEXABLOCKPlugin_Hypothesis::_narrow(hypo); +// ASSERT(!CORBA::is_nil(hexHypo)); +// +// // mesh.mesh.AddHypothesis(shape, hypo) +// // +// // hexHypo->SetDocument(anDocObj); +// // hexHypo->SetDimension(dim); +// // +// // mesh.Compute() +// // +// // return mesh +// +// } +// +// +// +// void newMesh( const std::string& meshName, int dim )// const std::string& container ) +// { +// +// // _smeshEngine.init_smesh(salome.myStudy, geompy.geom) +// SMESH::SMESH_var mesh = _smeshEngine->Mesh(shape, name); +// SMESH::SMESH_Hypothesis_var algo = _smeshEngine->CreateHypothesis( "HEXABLOCK_3D", "libHexaBlockEngine.so"); +// SMESH::SMESH_Hypothesis_var hypo = _smeshEngine->CreateHypothesis( "HEXABLOCK_Parameters", "libHexaBlockEngine.so"); +// HEXABLOCKPlugin::HEXABLOCKPlugin_Hypothesis_var hexHypo = HEXABLOCKPlugin::HEXABLOCKPlugin_Hypothesis::_narrow(hypo); +// hexHypo->SetDocument(anDocObj); +// hexHypo->SetDimension(dim); +// } + +/* +SMESH::SMESH_Gen_var SMESHGUI::GetSMESHGen() +{ + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); //Document OCAF de l'etude active + if ( CORBA::is_nil( myComponentSMESH ) ) + { + SMESHGUI aGUI; //SRN BugID: IPAL9186: Create an instance of SMESHGUI to initialize myComponentSMESH + if ( aStudy ) + aGUI.myComponentSMESH->SetCurrentStudy(_CAST(Study,aStudy)->GetStudy()); + return aGUI.myComponentSMESH; + } + if ( aStudy ) + myComponentSMESH->SetCurrentStudy(_CAST(Study,aStudy)->GetStudy()); + return myComponentSMESH; +}*/ + +// bool HEXABLOCKGUI::eventFilter(QObject *obj, QEvent *event) +// { +// if ( event->type() == QEvent::Enter ){//QEvent::Show ){ //QEvent::KeyPress) { +// showDocumentMenus( false ); +// showPatternMenus( false ); +// showAssociationMenus( false ); +// showGroupsMenus( false ); +// showMeshMenus( false ); +// if ( obj == _dwObjectBrowser ) { +// showDocumentMenus( true ); +// } else if ( obj == _dwPattern ) { +// showPatternMenus( true ); +// } else if ( obj == _dwAssociation ) { +// showAssociationMenus( true ); +// } else if ( obj == _dwGroups ) { +// showGroupsMenus( true ); +// } else if ( obj == _dwMesh ) { +// +// showMeshMenus( true ); +// } +// return false; +// } else { +// // standard event processing +// return QObject::eventFilter(obj, event); +// } +// } + +// try { +// // throw SALOME_Exception(LOCALIZED("assocVertex")); +// } catch ( SALOME::SALOME_Exception& exc ){ +// INFOS("Following exception was cought:\n\t"< +#include + +#include +#include +#include + + +#include "klinkitemselectionmodel.hxx" + +#include +#include +// #include + +#include +#include + +#include + + +// #include "MyBasicGUI_PointDlg.hxx" +// #include "Resource.hxx" +#include "HEXABLOCKGUI_Resource.hxx" + +#include "GEOMGUI_OCCSelector.h" + + + + +#include CORBA_CLIENT_HEADER(HEXABLOCK_Gen) +// #include CORBA_CLIENT_HEADER(GEOM_Gen) +// #include CORBA_CLIENT_HEADER(SMESH_Gen) + + +namespace HEXABLOCK +{ + namespace GUI + { + class DocumentGraphicView; + class DocumentDelegate; + class DocumentModel; + class PatternDataModel; + class PatternBuilderModel; + class AssociationsModel; + class GroupsModel; + class MeshModel; + class PatternDataSelectionModel; + class PatternBuilderSelectionModel; + class GroupsSelectionModel; + class MeshSelectionModel; + + class HexaBaseDialog; + class VertexDialog; + class EdgeDialog; + class QuadDialog; + class HexaDialog; + class VectorDialog; + class CylinderDialog; + class PipeDialog; + class MakeGridDialog; + class MakeCylinderDialog; + class MakePipeDialog; + class MakeCylindersDialog; + class MakePipesDialog; + class RemoveHexaDialog; + class PrismQuadDialog; + class JoinQuadDialog; + class MergeDialog; + class DisconnectDialog; + class CutEdgeDialog; + class MakeTransformationDialog; + class MakeSymmetryDialog; + class PerformTransformationDialog; + class PerformSymmetryDialog; + typedef class MyBasicGUI_PointDlg VertexAssocDialog; + class EdgeAssocDialog; + class QuadAssocDialog; + class GroupDialog; + class LawDialog; + class PropagationDialog; + class ComputeMeshDialog; + class ReplaceHexaDialog; + class QuadRevolutionDialog; + class MakeHemiSphereDialog; + } +} + +class HEXABLOCKGUI_Resource;//SUIT_ResourceMgr; +class SalomeApp_Study; +class SalomeApp_Application; +class SUIT_ViewWindow; +class SVTK_ViewWindow; +class OCCViewer_ViewWindow; +class LightApp_VTKSelector; + +// // SALOME KERNEL includes +// #include +// #include +// #include +// #include +// #include + + +class HEXABLOCKGUI : public SalomeApp_Module +{ + Q_OBJECT + + friend class HEXABLOCKGUI_Resource; + +public: + HEXABLOCKGUI(); + virtual ~HEXABLOCKGUI(); + + static SalomeApp_Study* activeStudy(); + + static HEXABLOCK_ORB::HEXABLOCK_Gen_ptr InitHEXABLOCKGen( SalomeApp_Application* ); +// static SMESH::SMESH_Gen_ptr InitSMESHGen( SalomeApp_Application* app, const std::string& container = "FactoryServer" ); + static GEOM::GEOM_Gen_ptr InitGEOMGen( SalomeApp_Application* app, const std::string& container = "FactoryServer" ); + + static LightApp_SelectionMgr* selectionMgr(); + + + static SVTK_ViewWindow* currentVtkView; + static OCCViewer_ViewWindow* currentOccView; + + //HEXABLOCK::GUI::DocumentModel* + + virtual void initialize( CAM_Application* app); + + virtual bool renameAllowed( const QString& ) const; + virtual bool renameObject( const QString& entry, const QString& name); + virtual void windows( QMap& theMap) const; +// virtual LightApp_Displayer* displayer(); + virtual QString engineIOR() const; + + virtual void viewManagers(QStringList& list) const; + virtual void setResource(SUIT_ResourceMgr* r); + virtual void createPreferences(); + virtual void preferencesChanged( const QString& sect, const QString& name ); + virtual void studyActivated(); + + //------------------------------------ + void createAndFillDockWidget(); + void createActions(); + void createMenus(); + void createTools(); + + void initialMenus(); + void showAllMenus(); + +// void showBaseMenus(bool show); +// void showEditionMenus(bool show); +// void showExecMenus(bool show); +// void showCommonMenus(bool show); + + void switchModel(SUIT_ViewWindow *view); + void showDockWidgets(bool isVisible); + + +public slots: + bool deactivateModule( SUIT_Study* theStudy); + bool activateModule( SUIT_Study* theStudy); + void onObjectBrowserClick(const QModelIndex& index); + + void showDocumentMenus(bool show); + void showPatternMenus(bool show); + void showAssociationMenus(bool show); + void showGroupsMenus(bool show); + void showMeshMenus(bool show); + +protected slots: + void onWindowActivated( SUIT_ViewWindow* svw); + void onWindowClosed( SUIT_ViewWindow* svw); + + virtual void onViewManagerAdded( SUIT_ViewManager* ); + virtual void onViewManagerRemoved( SUIT_ViewManager* ); +// void onTryClose(bool &isClosed, QxScene_ViewWindow* window); + + void onSelectionChanged( const QItemSelection & selected, const QItemSelection & deselected ); + +protected: +// virtual CAM_DataModel* createDataModel(); + bool createSComponent(); +// virtual bool isSelectionCompatible(); + + void _showDialogBox( HEXABLOCK::GUI::HexaBaseDialog* diag ); + + +// bool _selectFromTree; + HEXABLOCKGUI_Resource* _myresource; +// SUIT_ResourceMgr* _myresource; + static int _oldStudyId; + static HEXABLOCK_ORB::HEXABLOCK_Gen_var _hexaEngine; +// static SMESH::SMESH_Gen_var _smeshEngine; + static GEOM::GEOM_Gen_var _geomEngine; +private slots: + + void slot_modelChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); + + void treeContextMenu(const QPoint& aPosition); + + void test_association(); + void test(); + + void newDocument(); + void loadDocument( const QString &path = QString() ); + void saveDocument(); + + // new + void addVertex(); + void addEdge(); + void addQuad(); + void addHexa(); + + void addVector(); + void addCylinder(); + void addPipe(); +// void makeCartesian(); +// void makeCylindrical(); + void makeGrid(); + void makeCylinder(); + void makePipe(); + void makeCylinders(); + void makePipes(); + +// void makeRind(); // NEW HEXA3 + void makeHemiSphere(); // NEW HEXA3 + + void removeHexa(); + void prismQuad(); + void joinQuad(); +// void mergeVertices(); +// void mergeEdges(); + void merge(); + void disconnectElts(); + void cutEdge(); +// void makeTranslation(); + void makeTransformation(); + void makeSymmetry(); + void performTransformation(); + void performSymmetry(); + + void replaceHexa(); // NEW HEXA3 + void quadRevolution(); // NEW HEXA3 + + + void assocVertex(); + void assocEdge(); + void assocQuad(); + + void addGroup(); + void removeGroup (); //CS_TODO + void addLaw(); + void removeLaw(); + void setPropagation(); + void computeMesh(); + + //Clears associations of a single element (VERTEX, EDGE, QUAD, ...) + void clearAssociations(); + + //Clears associations under a tree (VERTEX_TREE, EDGE_TREE, ...) + void clearAllAssociations(); + + void showAssociations(); + +private: + + QList myOCCSelectors; + QList myVTKSelectors; + + + QStringList getQuickDirList(); + HEXABLOCK::GUI::DocumentGraphicView* newGraphicView(); + + + // ------------------------------------------------------------------------------------------------- + // MainWindow presentation + // ------------------------------------------------------------------------------------------------- + QDockWidget *_dwPattern; // Hexablock model edition + QDockWidget *_dwAssociation; // Hexablock association edition + QDockWidget *_dwGroups; // Hexablock groups edition + QDockWidget *_dwMesh; // Hexablock meshing edtion + QDockWidget *_dwObjectBrowser; // Salome study + QDockWidget *_dwInputPanel; // user Input + + // Dialog Box ( to keep persistent values ) + HEXABLOCK::GUI::VertexDialog* _vertexDiag; + HEXABLOCK::GUI::EdgeDialog* _edgeDiag; + HEXABLOCK::GUI::QuadDialog* _quadDiag; + HEXABLOCK::GUI::HexaDialog* _hexaDiag; + HEXABLOCK::GUI::VectorDialog* _vectorDiag; + HEXABLOCK::GUI::CylinderDialog* _cylinderDiag; + HEXABLOCK::GUI::PipeDialog* _pipeDiag; + HEXABLOCK::GUI::MakeGridDialog* _makeGridDiag; + HEXABLOCK::GUI::MakeCylinderDialog* _makeCylinderDiag; + HEXABLOCK::GUI::MakePipeDialog* _makePipeDiag; + HEXABLOCK::GUI::MakeCylindersDialog* _makeCylindersDiag; + HEXABLOCK::GUI::MakePipesDialog* _makePipesDiag; + HEXABLOCK::GUI::RemoveHexaDialog* _removeHexaDiag; + HEXABLOCK::GUI::PrismQuadDialog* _prismQuadDiag; + HEXABLOCK::GUI::JoinQuadDialog* _joinQuadDiag; + HEXABLOCK::GUI::MergeDialog* _mergeDiag; + HEXABLOCK::GUI::DisconnectDialog* _disconnectDiag; + HEXABLOCK::GUI::CutEdgeDialog* _cutEdgeDiag; + HEXABLOCK::GUI::MakeTransformationDialog* _makeTransformationDiag; + HEXABLOCK::GUI::MakeSymmetryDialog* _makeSymmetryDiag; + HEXABLOCK::GUI::PerformTransformationDialog* _performTransformationDiag; + HEXABLOCK::GUI::PerformSymmetryDialog* _performSymmetryDiag; + HEXABLOCK::GUI::VertexAssocDialog* _vertexAssocDiag; + HEXABLOCK::GUI::EdgeAssocDialog* _edgeAssocDiag; + HEXABLOCK::GUI::QuadAssocDialog* _quadAssocDiag; + HEXABLOCK::GUI::GroupDialog* _groupDiag; + HEXABLOCK::GUI::LawDialog* _lawDiag; + HEXABLOCK::GUI::PropagationDialog* _propagationDiag; + HEXABLOCK::GUI::ComputeMeshDialog* _computeMeshDiag; + HEXABLOCK::GUI::ReplaceHexaDialog* _replaceHexaDiag; + HEXABLOCK::GUI::QuadRevolutionDialog* _quadRevolutionDiag; + HEXABLOCK::GUI::MakeHemiSphereDialog* _makeHemiSphereDiag; + + + // Actions + int _menuId; + // Object Browser + QAction *_newAct; + QAction *_importAct; + QAction *_saveAct; + QAction *_testAct; + + // Pattern Data + QAction *_addVertex; + QAction *_addEdge; + QAction *_addQuad; + QAction *_addHexa; + + // Pattern Builder + QAction *_addVector; + QAction *_addCylinder; + QAction *_addPipe; + QAction *_makeGrid; //Cartesian, Cylindrical, Spherical + QAction *_makeCylinder; + QAction *_makePipe; + QAction *_makeCylinders; + QAction *_makePipes; + +// QAction *_makeRind; // NEW HEXA3 + QAction *_makeHemiSphere; // NEW HEXA3 + + + // Pattern Data Edition + QAction *_removeHexa; + QAction *_prismQuad; + QAction *_joinQuad; + QAction *_merge;// QAction *_mergeVertices; // QAction *_mergeEdges; + QAction *_disconnect; + QAction *_cutEdge; + QAction *_makeTransformation; // QAction *_makeTranslation; + QAction *_makeSymmetry; + QAction *_performTransformation; + QAction *_performSymmetry; + + QAction *_replaceHexa; // NEW HEXA3 + QAction *_quadRevolution; // NEW HEXA3 + + // Pattern Data Association + QAction *_assocVertex; + QAction *_assocEdge; + QAction *_assocQuad; + + // Group + QAction *_addGroup; + QAction *_removeGroup ; //CS_TODO + + // Law + QAction *_addLaw; + QAction *_removeLaw; + + // Propagation + QAction *_setPropagation; + + // Meshing + QAction *_computeMesh; + + // ------------------------------------------------------------------------------------------------- + // Model/View implementation + // ------------------------------------------------------------------------------------------------- + + // MODEL MODEL MODEL MODEL MODEL MODEL MODEL MODEL MODEL + HEXABLOCK::GUI::DocumentModel *_currentModel;// a model for each document : 1..n ( multiple document allowed ) + HEXABLOCK::GUI::PatternDataModel *_patternDataModel; // sub-part of DocumentModel + HEXABLOCK::GUI::PatternBuilderModel *_patternBuilderModel; // sub-part of DocumentModel + HEXABLOCK::GUI::AssociationsModel *_associationsModel; // sub-part of DocumentModel + HEXABLOCK::GUI::GroupsModel *_groupsModel; // sub-part of DocumentModel + HEXABLOCK::GUI::MeshModel *_meshModel; // sub-part of DocumentModel + + // VIEW VIEW VIEW VIEW VIEW VIEW VIEW VIEW VIEW VIEW + QTreeView *_patternDataTreeView; // document's pattern : 1 ( only one view ) + QTreeView *_patternBuilderTreeView; // document's pattern : 1 ( only one view ) + QTreeView *_associationTreeView; // document's association : 1 ( only one view ) + QTreeView *_groupsTreeView; // document's groups + QTreeView *_meshTreeView; // document's mesh property: 1 ( only one view ) + HEXABLOCK::GUI::DocumentGraphicView *_currentGraphicView;// graphical view (SVTK view) of the document : 1..n ( multiple view ) + + // DELEGATE DELEGATE DELEGATE DELEGATE DELEGATE DELEGATE DELEGATE + HEXABLOCK::GUI::DocumentDelegate *_treeViewDelegate; // specific editor for each item of the tree + + // SELECTION_MODEL SELECTION_MODEL SELECTION_MODEL SELECTION_MODEL SELECTION_MODEL + HEXABLOCK::GUI::PatternDataSelectionModel *_patternDataSelectionModel; // 1..n selection + HEXABLOCK::GUI::PatternBuilderSelectionModel *_patternBuilderSelectionModel;// 1..n selection + HEXABLOCK::GUI::GroupsSelectionModel *_groupsSelectionModel; + HEXABLOCK::GUI::MeshSelectionModel *_meshSelectionModel; + + // SALOME SALOME SALOME SALOME SALOME SALOME SALOME SALOME SALOME SALOME + SUIT_ViewManager *_suitVM; + std::map _salomeViewWindows; // key = entry + + // SALOME/QT SALOME/QT SALOME/QT SALOME/QT SALOME/QT SALOME/QT + std::map _documentModels; + std::map _documentView; + +// static std::map _salomeViews; + +// int _documentCnt; + bool _isSaved; + + + void testDocument(); + void test_make_cart_grid(); + void test_make_elmts_transform(); + + +}; + +#endif diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentDelegate.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentDelegate.cxx new file mode 100755 index 0000000..dcd4f11 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentDelegate.cxx @@ -0,0 +1,475 @@ + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include +#include + + +#include "utilities.h" + + +#include "HEXABLOCKGUI_DocumentDelegate.hxx" +#include "HEXABLOCKGUI_DocumentItem.hxx" +#include "HEXABLOCKGUI_DocumentPanel.hxx" + +using namespace std; +using namespace HEXABLOCK::GUI; + + +DocumentDelegate::DocumentDelegate(QDockWidget *dw, QObject *parent) + : QItemDelegate(parent), + _dw(dw), + _documentModel(0), + _patternDataSelectionModel(0), + _patternBuilderSelectionModel(0), + _groupsSelectionModel(0), + _meshSelectionModel(0) +{ +// connect( this, SIGNAL( closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint) ), +// this, SLOT( onCloseEditor(QWidget *, QAbstractItemDelegate::EndEditHint) ) ); +// connect( this, SIGNAL( commitData ( QWidget * ) ), +// this, SLOT( onCommitData ( QWidget * ) ) ); +} + + +// void DocumentDelegate::commitEditor() +// { +// MESSAGE("DocumentDelegate::commitEditor(){") +// MESSAGE("* sender is: " << sender() ); +// QWidget* editor = qobject_cast(sender()); +// emit commitData(editor); +// // emit closeEditor(editor); +// MESSAGE("}"); +// } + +QWidget *DocumentDelegate::createEditor( QWidget *parent, + const QStyleOptionViewItem &option, + const QModelIndex &index ) const +{ + MESSAGE("DocumentDelegate::createEditor(){"); + MESSAGE("* parent is: " << parent); + MESSAGE("* _dw is: " << _dw); + MESSAGE("* item is: " << index.data(Qt::DisplayRole).toString().toStdString()); + + HexaBaseDialog *editor = 0; + + switch ( index.data(HEXA_TREE_ROLE).toInt() ){ + case VERTEX_TREE : editor = new VertexDialog(parent, HexaBaseDialog::UPDATE_MODE); break; + case EDGE_TREE : editor = new EdgeDialog(parent, /*HexaBaseDialog::NEW_MODE*/HexaBaseDialog::INFO_MODE); break; + case QUAD_TREE : editor = new QuadDialog(parent, HexaBaseDialog::INFO_MODE); break; + case HEXA_TREE : editor = new HexaDialog(parent, HexaBaseDialog::INFO_MODE); break; + case VECTOR_TREE : editor = new VectorDialog(parent, HexaBaseDialog::INFO_MODE); break; + case CYLINDER_TREE : editor = new CylinderDialog(parent, HexaBaseDialog::INFO_MODE); break; + case PIPE_TREE : editor = new PipeDialog(parent, HexaBaseDialog::INFO_MODE); break; + // case ELEMENTS_TREE : break; + // case CROSSELEMENTS_TREE : break; + case GROUP_TREE : editor = new GroupDialog(parent, HexaBaseDialog::INFO_MODE/*UPDATE_MODE*/); break; + case LAW_TREE : editor = new LawDialog(parent, HexaBaseDialog::UPDATE_MODE); break; + case PROPAGATION_TREE : editor = new PropagationDialog(parent, HexaBaseDialog::INFO_MODE); break; + } + if ( editor ){ + if ( _documentModel ) editor->setDocumentModel( _documentModel ); + if ( _patternDataSelectionModel ) editor->setPatternDataSelectionModel( _patternDataSelectionModel ); + if ( _patternBuilderSelectionModel ) editor->setPatternBuilderSelectionModel( _patternBuilderSelectionModel); + if ( _groupsSelectionModel ) editor->setGroupsSelectionModel( _groupsSelectionModel ); + if ( _meshSelectionModel ) editor->setMeshSelectionModel( _meshSelectionModel); + +// QWidget* w = _dw->widget(); +// if (w) w->close(); + if ( !_dw->isVisible() ) _dw->setVisible(true); + _dw->setWidget( editor ); + _dw->setWindowTitle( editor->windowTitle() ); +// connect ( editor, SIGNAL( editingFinished() ), this, SLOT ( commitEditor() ) ); +// editor->exec(); +// editor->show(); +// editor->raise(); +// editor->setFocus(); + } + + MESSAGE("}"); + return editor; +// return new QLineEdit(parent); +} + + +void DocumentDelegate::setEditorData( QWidget *editor, + const QModelIndex &index) const +{ + MESSAGE("DocumentDelegate::setEditorData(){"); + MESSAGE("* item is: " << index.data(Qt::DisplayRole).toString().toStdString()); + +// HexaBaseDialog* editor = dynamic_cast( editor ); + + switch ( index.data(HEXA_TREE_ROLE).toInt() ){ + case VERTEX_TREE : { + HEXA_NS::Vertex *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Vertex* >(); + VertexDialog *vertexEditor = static_cast(editor); + vertexEditor->setValue(value); + } + break; + case EDGE_TREE : { + HEXA_NS::Edge *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Edge* >(); + EdgeDialog *edgeEditor = static_cast(editor); + edgeEditor->setValue(value); + } + break; + case QUAD_TREE : { + HEXA_NS::Quad *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Quad* >(); + QuadDialog *quadEditor = static_cast(editor); + quadEditor->setValue(value); + } + break; + case HEXA_TREE : { + HEXA_NS::Hexa *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Hexa* >(); + HexaDialog *hexaEditor = static_cast(editor); + hexaEditor->setValue(value); + } + break; + case VECTOR_TREE : { + HEXA_NS::Vector *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Vector* >(); + VectorDialog *vectorEditor = static_cast(editor); + vectorEditor->setValue(value); + } + break; + case CYLINDER_TREE : { + HEXA_NS::Cylinder *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Cylinder* >(); + CylinderDialog *cylinderEditor = static_cast(editor); + cylinderEditor->setValue(value); + } + break; + case PIPE_TREE : { + HEXA_NS::Pipe *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Pipe* >(); + PipeDialog *pipeEditor= static_cast(editor); + pipeEditor->setValue(value); + } + break; +// case ELEMENTSITEM : editor = new ElementsDialog(parent); break; +// case CROSSELEMENTSITEM : editor = new CrossElementsDialog(parent); break; + case GROUP_TREE :{ + HEXA_NS::Group *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Group* >(); + GroupDialog *groupEditor = static_cast(editor); + groupEditor->setValue(value); + } + break; + case LAW_TREE : { + HEXA_NS::Law *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Law* >(); + LawDialog *lawEditor = static_cast(editor); + lawEditor->setValue(value); + } + break; + case PROPAGATION_TREE : { + HEXA_NS::Propagation *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Propagation* >(); + PropagationDialog *propagationEditor = static_cast(editor); + propagationEditor->setValue(value); + } + break; + } + +// editor->setFocus(); +// editor->exec(); + MESSAGE("}"); +} + +// void DocumentDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, +// const QModelIndex &index) const +// { +// cout << "//////////////////// CS_BP DocumentDelegate::setModelData BEGIN "<< editor << endl; +// // // QStandardItem *item = 0; +// // // QItemDelegate::setModelData( editor, model,index); +// // +// // // // CS_TODO : simplification? +// // QSortFilterProxyModel *pmodel = dynamic_cast( model ); +// // if ( pmodel ){ +// // QStandardItemModel *smodel = dynamic_cast( pmodel->sourceModel() ); +// // if ( smodel ){ +// // // item = smodel->itemFromIndex(index); +// // QItemDelegate::setModelData( editor, smodel, pmodel->mapToSource(index)); +// // } +// // } else { +// // QStandardItemModel *smodel = dynamic_cast( model ); +// // if ( smodel ){ +// // // item = smodel->itemFromIndex(index); +// // QItemDelegate::setModelData( editor, model,index); +// // } +// // } +// // QItemDelegate::setModelData( editor, model, index); +// cout << "//////////////////// CS_BP DocumentDelegate::setModelData END"<< editor << endl; +// +// } + + +void DocumentDelegate::setModelData( QWidget *editor, + QAbstractItemModel *model, + const QModelIndex &index) const +{ +// cout <<" XXXXXXXXXXXXXX setModelData editor => " << editor << endl; + MESSAGE("DocumentDelegate::setModelData(){"); + MESSAGE("* item is: " << index.data(Qt::DisplayRole).toString().toStdString()); +// HexaDialog *hexaEditor = qobject_cast(editor); +// // PipeDialog *qtcast = qobject_cast(editor); +// // PipeDialog *cppcast = dynamic_cast(editor); +// +// if ( hexaEditor ){ +// HEXA_NS::Hexa *value = hexaEditor->getValue(); +// cout << "XXXXXXXXXXX DocumentDelegate::setModelData value "<< value << endl; +// model->setData( index, QVariant::fromValue( value ), HEXA_DATA_ROLE ); +// model->setData( index, value->getName(), Qt::DisplayRole/*Qt::EditRole*/ ); +// model->setData( index, QString::number( reinterpret_cast(value) ), HEXA_ENTRY_ROLE ); +// } +// editor->show(); +// editor->raise(); + +// cout << "AAAAAAA _dw"<< _dw<< endl; +// cout << "AAAAAAA _dw->widget()"<< _dw->widget() << endl; +// cout << "AAAAAAA isVisible"<< _dw->isVisible() << endl; +// cout << "AAAAAAA editor isVisible"<< editor->isVisible() << endl; +// // editor = new HexaDialog(); +// _dw->setWindowTitle( "HOOOOOOOOOO" ); +// _dw->setWidget(editor); +// _dw->setVisible(false); +// // editor->raise(); +// _dw->raise(); +// _dw->setVisible(true); +// cout << "BBBBBBB _dw"<< _dw<< endl; +// cout << "BBBBBBB _dw->widget()"<< _dw->widget() << endl; +// cout << "BBBBBBB isVisible"<< _dw->isVisible() << endl; +// cout << "BBBBBBB editor isVisible"<< editor->isVisible() << endl; + +// HEXA_NS::Quad *value = quadEditor->getValue(); +// model->setData(index, QVariant::fromValue( value ), HEXA_DATA_ROLE); + MESSAGE("}"); +} + + + + + +void DocumentDelegate::updateEditorGeometry( QWidget *editor, + const QStyleOptionViewItem &option, + const QModelIndex &index ) const +{ + + MESSAGE("DocumentDelegate::updateEditorGeometry(){"); + MESSAGE("* item is: " << index.data(Qt::DisplayRole).toString().toStdString()); +// cout << "CS_BP option.rect.size()"<setGeometry(option.rect); + editor->show(); +// editor->raise(); + MESSAGE("}"); +} + + + + + +void DocumentDelegate::setDocumentModel( DocumentModel* m ) +{ + _documentModel = m; +} + +void DocumentDelegate::setPatternDataSelectionModel( PatternDataSelectionModel* s ) +{ + _patternDataSelectionModel = s; +} + +void DocumentDelegate::setPatternBuilderSelectionModel( PatternBuilderSelectionModel* s ) +{ + _patternBuilderSelectionModel = s; +} + +void DocumentDelegate::setGroupsSelectionModel( GroupsSelectionModel* s ) +{ + _groupsSelectionModel = s ; +} + +void DocumentDelegate::setMeshSelectionModel( MeshSelectionModel* s ) +{ + _meshSelectionModel = s; +} + + + +bool DocumentDelegate::editorEvent ( QEvent *event, + QAbstractItemModel *model, + const QStyleOptionViewItem &option, + const QModelIndex &index ) +{ + MESSAGE("DocumentDelegate::editorEvent(){"); + MESSAGE("* item is: " << index.data().toString().toStdString()); + MESSAGE("* event is: " << event->type() ); + + Qt::ItemFlags flags = model->flags(index); + if ( flags == Qt::ItemFlags( ~Qt::ItemIsEditable ) ){ + MESSAGE("* you can select it "); + } else { + MESSAGE("* you cannot select it "); + } + + + +// bool r; +// if ( event->type() == 3 ){ +// r = true; +// } else { +// r = QItemDelegate::editorEvent ( event, model, option, index ); +// } +// MESSAGE("* result is: " << r ); +// MESSAGE("}"); +// return r; + + return QItemDelegate::editorEvent ( event, model, option, index ); +} + +// void DocumentDelegate::onCloseEditor( QWidget *w, QAbstractItemDelegate::EndEditHint h) +// { +// MESSAGE("DocumentDelegate::onCloseEditor(){"); +// MESSAGE("}"); +// } +// +// +// void DocumentDelegate::onCommitData ( QWidget * editor ) +// { +// MESSAGE("DocumentDelegate::onCommitData(){"); +// MESSAGE("}"); +// } + + +// connect( this, SIGNAL( commitData ( QWidget * ) ), +// this, SLOT( onCommitData ( QWidget * ) ) ); + + +// // virtual bool eventFilter ( QObject * editor, QEvent * event ) +// // { +// // // std::cout << "eventFilter eventFilter " << event->type() << std::endl; +// // // std::cout << std::endl; +// // +// // if (event->type() == QEvent::FocusOut) { +// // // QKeyEvent *keyEvent = static_cast(event); +// // // qDebug() << "Ate key press" << keyEvent->key(); +// // // return true; +// // return false; +// // } else { +// // return QItemDelegate::eventFilter ( editor, event ); +// // // return false; +// // } + + + +// void DocumentDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, +// const QModelIndex &index) const +// { +// cout << "*********************** CS_BP DocumentDelegate::setModelData BEGIN "<< editor << endl; +// QStandardItem *item = 0; +// +// // CS_TODO : simplification? +// QSortFilterProxyModel *pmodel = dynamic_cast( model ); +// if ( pmodel ){ +// QStandardItemModel *smodel = dynamic_cast( pmodel->sourceModel() ); +// if ( smodel ){ +// item = smodel->itemFromIndex(pmodel->mapToSource(index)); +// } +// } else { +// QStandardItemModel *smodel = dynamic_cast( model ); +// if ( smodel ){ +// item = smodel->itemFromIndex(index); +// } +// } +// +// +// if ( item ){ +// // cout << "item " << item->type() << endl; +// if ( item->data().isValid() ) +// cout << "*************** item " << item->data(Qt::DisplayRole).toString().toStdString() << endl; +// switch ( item->type() ){ +// case VERTEXITEM : { +// VertexDialog *vertexEditor = static_cast(editor); +// HEXA_NS::Vertex *value = vertexEditor->getValue(); +// model->setData(index, QVariant::fromValue( value ), HEXA_DATA_ROLE); +// } +// break; +// +// case EDGEITEM : { +// EdgeDialog *edgeEditor = static_cast(editor); +// HEXA_NS::Edge *value = edgeEditor->getValue(); +// model->setData(index, QVariant::fromValue( value ), HEXA_DATA_ROLE); +// } +// break; +// +// case QUADITEM : { +// QuadDialog *quadEditor = static_cast(editor); +// HEXA_NS::Quad *value = quadEditor->getValue(); +// model->setData(index, QVariant::fromValue( value ), HEXA_DATA_ROLE); +// } +// break; +// +// case HEXAITEM : { +// HexaDialog *hexaEditor = static_cast(editor); +// HEXA_NS::Hexa *value = hexaEditor->getValue(); +// model->setData(index, QVariant::fromValue( value ), HEXA_DATA_ROLE); +// } +// break; +// +// case VECTORITEM : { +// VectorDialog *vectorEditor = static_cast(editor); +// HEXA_NS::Vector *value = vectorEditor->getValue(); +// model->setData(index, QVariant::fromValue( value ), HEXA_DATA_ROLE); +// } +// break; +// +// case CYLINDERITEM : { +// CylinderDialog *cylinderEditor = static_cast(editor); +// HEXA_NS::Cylinder *value = cylinderEditor->getValue(); +// model->setData(index, QVariant::fromValue( value ), HEXA_DATA_ROLE); +// } +// break; +// case PIPEITEM : { +// PipeDialog *pipeEditor = static_cast(editor); +// HEXA_NS::Pipe *value = pipeEditor->getValue(); +// model->setData(index, QVariant::fromValue( value ), HEXA_DATA_ROLE); +// } +// break; +// // case ELEMENTSITEM : editor = new ElementsDialog(parent); break; +// // case CROSSELEMENTSITEM : editor = new CrossElementsDialog(parent); break; +// case GROUPITEM :{ +// GroupDialog *groupEditor = static_cast(editor); +// HEXA_NS::Group *value = groupEditor->getValue(); +// model->setData(index, QVariant::fromValue( value ), HEXA_DATA_ROLE); +// } +// break; +// case LAWITEM : { +// LawDialog *lawEditor = static_cast(editor); +// HEXA_NS::Law *value = lawEditor->getValue(); +// model->setData(index, QVariant::fromValue( value ), HEXA_DATA_ROLE); +// } +// break; +// case PROPAGATIONITEM : { +// PropagationDialog *propagationEditor = static_cast(editor); +// HEXA_NS::Propagation *value = propagationEditor->getValue(); +// model->setData(index, QVariant::fromValue( value ), HEXA_DATA_ROLE); +// } +// break; +// +// } +// } +// editor->show(); +// cout << "*********************** CS_BP DocumentDelegate::setModelData END "<< editor << endl; +// } \ No newline at end of file diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentDelegate.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentDelegate.hxx new file mode 100755 index 0000000..f8e713c --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentDelegate.hxx @@ -0,0 +1,99 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HEXABLOCKGUI_DOCUMENTDELEGATE_HXX_ +#define __HEXABLOCKGUI_DOCUMENTDELEGATE_HXX_ + + +// QEvent * event, QAbstractItemModel + +#include +#include +#include +#include +#include +#include + +#include + + +#include "HEXABLOCKGUI_DocumentModel.hxx" +#include "HEXABLOCKGUI_DocumentSelectionModel.hxx" + +namespace HEXABLOCK +{ + namespace GUI + { + class DocumentDelegate : public QItemDelegate + { + Q_OBJECT + + public: + DocumentDelegate( QDockWidget *dw, QObject *parent = 0); + + QWidget *createEditor( QWidget *parent, + const QStyleOptionViewItem &option, + const QModelIndex &index) const; + + void setEditorData( QWidget *editor, const QModelIndex &index) const; + + void setModelData( QWidget *editor, + QAbstractItemModel *model, + const QModelIndex &index ) const; + + void updateEditorGeometry( QWidget *editor, + const QStyleOptionViewItem &option, + const QModelIndex &index ) const; + + // can be used by editor + void setDocumentModel( DocumentModel* m ); + + // selection + void setPatternDataSelectionModel( PatternDataSelectionModel* s ); + void setPatternBuilderSelectionModel( PatternBuilderSelectionModel* s ); + void setGroupsSelectionModel( /*QItemSelectionModel**/ GroupsSelectionModel* s ); + void setMeshSelectionModel( MeshSelectionModel* s ); + + virtual bool editorEvent ( QEvent * event, + QAbstractItemModel * model, + const QStyleOptionViewItem & option, + const QModelIndex & index ); + + public slots: +// void onCloseEditor( QWidget *, QAbstractItemDelegate::EndEditHint); +// void onCommitData ( QWidget * editor ); + + private: + QDockWidget *_dw; // editor's container + + // can be used by editor + DocumentModel* _documentModel; + + PatternDataSelectionModel* _patternDataSelectionModel; + PatternBuilderSelectionModel* _patternBuilderSelectionModel; + GroupsSelectionModel* _groupsSelectionModel; + MeshSelectionModel* _meshSelectionModel; + + private slots: + void commitEditor(); + + }; + } +} + +#endif diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentGraphicView.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentGraphicView.cxx new file mode 100755 index 0000000..3486e03 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentGraphicView.cxx @@ -0,0 +1,945 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +//#define _DEVDEBUG_ + +#include + +#include + +#include + +#include "utilities.h" + +#include + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// VTK includes +#include +#include +#include + +// test tutorial (sphere) +#include +#include + +// test point (cf. SMESHGUI) +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "vtkLookupTable.h" +#include "vtkPoints.h" +#include "vtkCellArray.h" +#include "vtkFloatArray.h" +#include "vtkPolyData.h" +#include "vtkPolyDataMapper.h" +#include "vtkActor.h" +#include "vtkPointData.h" +#include "vtkProperty.h" + + +// #include "vtkStructuredGridReader.h" +#include "vtkUnstructuredGridReader.h" + + +#include + + + + + +#ifndef M_PI +#define M_PI 3.1415927 +#endif + +#include "HEXABLOCKGUI_Trace.hxx" +#include "HEXABLOCKGUI_DocumentModel.hxx" +#include "HEXABLOCKGUI_DocumentGraphicView.hxx" + + + +using namespace std; +using namespace HEXABLOCK::GUI; + + +Document_Actor::Document_Actor( HEXA_NS::Document* doc, const QString& entry ): + SALOME_Actor(), + _doc( doc ) +{ + DEBTRACE("Document_Actor::Document_Actor " << entry.toLatin1() ); + Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject( entry.toLatin1(), "HEXABLOCK" );//,theName); CS_TODO + setIO(anIO); + vtkUnstructuredGrid* aGrid = getUnstructuredGrid(); +// std::cout << "Document_Actor aGrid->GetNumberOfCells() =>"<< aGrid->GetNumberOfCells(); + vtkDataSetMapper* aMapper = vtkDataSetMapper::New(); + aMapper->SetInput(aGrid); + aGrid->Delete(); + + SetVisibility( true );//VisibilityOff(); + SetPickable( true ); //PickableOff();// + SetMapper( aMapper ); + aMapper->Delete(); + + vtkProperty* aProp = vtkProperty::New(); + +// aProp->SetRepresentationToSurface(); + aProp->SetRepresentationToWireframe(); +// aProp->SetRepresentationToPoints(); + aProp->EdgeVisibilityOn (); + aProp->SetPointSize(5); + SetProperty( aProp ); + aProp->Delete(); +// SetPointRepresentation(true); + +} + +Document_Actor::~Document_Actor() +{ + +} + + +vtkUnstructuredGrid* Document_Actor::getUnstructuredGrid() +{ + vtkUnstructuredGrid* theGrid = vtkUnstructuredGrid::New(); + + _doc->reorderFaces(); //CS_TEST + + std::map vtkNodeId; + std::map hexaNodeId; + + // Create points + vtkPoints* aPoints = vtkPoints::New(); + int nbVertex = _doc->countVertex(); + aPoints->SetNumberOfPoints( nbVertex ); + + HEXA_NS::Vertex* v = NULL; + int vertexId; + for ( int i=0; i getVertex(i); + aPoints->SetPoint( i, v->getX(), v->getY(), v->getZ() ); + vertexId = reinterpret_cast(v); //v->getId(); + vtkNodeId [ vertexId ] = i; + hexaNodeId[ i ] = vertexId ; +// vtkNodeId [ vertexId ] = i+1; +// hexaNodeId[ i+1 ] = vertexId ; + } + + theGrid->SetPoints( aPoints ); + aPoints->Delete(); +// theGrid->SetCells( 0, 0, 0, 0, 0 ); + + + // Calculate cells size + int nb0DElement = _doc->countVertex(); + int nbEdge = _doc->countEdge(); + int nbFace = _doc->countQuad(); + int nbVolume = _doc->countHexa(); + + vtkIdType aCellsSize = 2*nb0DElement + 3*nbEdge + ( 4 + 1 )*nbFace + ( 8 + 1 )*nbVolume; + vtkIdType aNbCells = nb0DElement + nbEdge + nbFace + nbVolume; + + // Create cells + vtkCellArray* aConnectivity = vtkCellArray::New(); + aConnectivity->Allocate( aCellsSize, 0 ); + + vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); + aCellTypesArray->SetNumberOfComponents( 1 ); + aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() ); + + vtkIdList *anIdList = vtkIdList::New(); + vtkIdType iVtkElem = 0; +// vtkIdType iVtkElem = 1; //CS_TEST + int iHexaElem; + + // VERTEX + for ( int i=0; iSetNumberOfIds( 1 ); + v = _doc->getVertex(i); + iHexaElem = reinterpret_cast(v);//v->getId(); + vtkElemsId[iHexaElem] = iVtkElem; + hexaElemsId[iVtkElem] = iHexaElem; + anIdList->SetId(0, vtkNodeId[iHexaElem]); + aConnectivity->InsertNextCell( anIdList ); + aCellTypesArray->InsertNextValue( VTK_VERTEX );//getCellType( aType, anElem->IsPoly(), aNbNodes ) ); + ++iVtkElem; + } + + // EDGE + HEXA_NS::Edge* e = NULL; + HEXA_NS::Vertex* vertexElem = NULL; + for ( int i=0; iSetNumberOfIds( 2 ); + e = _doc->getEdge(i); + iHexaElem = reinterpret_cast(e); //e->getId(); + vtkElemsId[iHexaElem] = iVtkElem; + hexaElemsId[iVtkElem] = iHexaElem; + + for( vtkIdType j = 0; j< 2; ++j ){ //j< e->countVertex(); ++j ){ + vertexElem = e->getVertex( j ); + anIdList->SetId( j, vtkNodeId[ reinterpret_cast(vertexElem) ] );//vertexElem->getId() ]); + } + aConnectivity->InsertNextCell( anIdList ); + aCellTypesArray->InsertNextValue( VTK_LINE );//getCellType( aType, anElem->IsPoly(), aNbNodes ) ); + ++iVtkElem; + } + + // QUAD + HEXA_NS::Quad* q = NULL; + HEXA_NS::Quad* quadElem = NULL; + for ( int i=0; iSetNumberOfIds( 4 ); + q = _doc->getQuad(i); + iHexaElem = reinterpret_cast(q); //q->getId(); + vtkElemsId[iHexaElem] = iVtkElem; + hexaElemsId[iVtkElem] = iHexaElem; + + for( vtkIdType j = 0; j< 4; ++j ){ + vertexElem = q->getVertex( j ); + anIdList->SetId( j, vtkNodeId[ reinterpret_cast(vertexElem) ] );//vertexElem->getId() ]); + } + aConnectivity->InsertNextCell( anIdList ); + aCellTypesArray->InsertNextValue( VTK_QUAD );//getCellType( aType, anElem->IsPoly(), aNbNodes ) ); + ++iVtkElem; + } + + // HEXA + HEXA_NS::Hexa* h = NULL; + HEXA_NS::Hexa* hexaElem = NULL; + std::map connectivity; + connectivity[0] = 0; + connectivity[1] = 1; + connectivity[2] = 3; + connectivity[3] = 2; + connectivity[4] = 4; + connectivity[5] = 5; + connectivity[6] = 7; + connectivity[7] = 6; + for ( int i=0; iSetNumberOfIds( 8 ); + h = _doc->getHexa(i); + iHexaElem = reinterpret_cast(h); //q->getId(); + vtkElemsId[iHexaElem] = iVtkElem; + hexaElemsId[iVtkElem] = iHexaElem; + + for( vtkIdType j = 0; j< 8; ++j ){ + vertexElem = h->getVertex( j );// ); + anIdList->SetId( connectivity[j], vtkNodeId[ reinterpret_cast(vertexElem) ]);//vertexElem->getId() ]); + } + aConnectivity->InsertNextCell( anIdList ); + aCellTypesArray->InsertNextValue( VTK_HEXAHEDRON ); + ++iVtkElem; + } + + +// 0 1 2 3 4 5 6 7 +// V_ACE, V_ACF, V_ADE, V_ADF, V_BCE, V_BCF, V_BDE, V_BDF, +// +// 0 1 3 2 4 5 7 6 + + // Insert cells in grid + VTKViewer_CellLocationsArray* aCellLocationsArray = VTKViewer_CellLocationsArray::New(); + aCellLocationsArray->SetNumberOfComponents( 1 ); + aCellLocationsArray->SetNumberOfTuples( aNbCells ); +// std::cout << "aNbCells =>" << aNbCells << std::endl; + + aConnectivity->InitTraversal(); + for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ){ + aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); + } + theGrid->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); + + aCellLocationsArray->Delete(); + aCellTypesArray->Delete(); + aConnectivity->Delete(); + anIdList->Delete(); + //std::cout << "theGrid->GetNumberOfCells()" << theGrid->GetNumberOfCells() << std::endl; + + return theGrid; +} + +// =============================================================== Abu : debut +// ===================================================== Constructeur +Associate_Actor::Associate_Actor( HEXA_NS::Document* doc, const QString& entry) + : SALOME_Actor(), _doc( doc ) +{ + DEBTRACE("Associate_Actor::Associate_Actor " << entry.toLatin1() ); + Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject( entry.toLatin1(), "HEXABLOCK" );//,theName); CS_TODO + setIO(anIO); + vtkUnstructuredGrid* aGrid = getUnstructuredGrid(); + + vtkDataSetMapper* aMapper = vtkDataSetMapper::New(); + aMapper->SetInput(aGrid); + aGrid->Delete(); + + SetVisibility( true );//VisibilityOff(); + SetPickable( true ); //PickableOff();// + SetMapper( aMapper ); + aMapper->Delete(); + + vtkProperty* aProp = vtkProperty::New(); + aProp->SetColor(0,255,0); +// aProp->SetRepresentationToSurface(); + aProp->SetRepresentationToWireframe(); +// aProp->SetRepresentationToPoints(); + aProp->EdgeVisibilityOn (); + aProp->SetPointSize(5); + SetProperty( aProp ); + aProp->Delete(); +// SetPointRepresentation(true); +} +// ===================================================== getUnstructuredGrid +vtkUnstructuredGrid* Associate_Actor::getUnstructuredGrid() +{ + vtkUnstructuredGrid* theGrid = vtkUnstructuredGrid::New(); + + _doc->reorderFaces(); //CS_TEST + + std::map vtkNodeId; + std::map hexaNodeId; + + std::vector tab_vertex; + HEXA_NS::Edges tab_edge; + + _doc->getAssoVertices (tab_vertex); + _doc->getAssoEdges (tab_edge); + + int nb0DElement = tab_vertex.size(); + int nbEdge = tab_edge.size(); + int nbFace = 0; + int nbVolume = 0; + + // Create points + vtkPoints* aPoints = vtkPoints::New(); + int nbVertex = nb0DElement; + aPoints->SetNumberOfPoints( nbVertex ); + + HEXA_NS::Vertex* v = NULL; + int vertexId; + for ( int i=0; i getVertex(i); + aPoints->SetPoint( i, v->getX(), v->getY(), v->getZ() ); + vertexId = reinterpret_cast(v); //v->getId(); + vtkNodeId [ vertexId ] = i; + hexaNodeId[ i ] = vertexId ; +// vtkNodeId [ vertexId ] = i+1; +// hexaNodeId[ i+1 ] = vertexId ; + } + + theGrid->SetPoints( aPoints ); + aPoints->Delete(); +// theGrid->SetCells( 0, 0, 0, 0, 0 ); + + // Calculate cells size + + vtkIdType aCellsSize = 2*nb0DElement + 3*nbEdge + ( 4 + 1 )*nbFace + ( 8 + 1 )*nbVolume; + vtkIdType aNbCells = nb0DElement + nbEdge + nbFace + nbVolume; + + // Create cells + vtkCellArray* aConnectivity = vtkCellArray::New(); + aConnectivity->Allocate( aCellsSize, 0 ); + + vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); + aCellTypesArray->SetNumberOfComponents( 1 ); + aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() ); + + vtkIdList *anIdList = vtkIdList::New(); + vtkIdType iVtkElem = 0; +// vtkIdType iVtkElem = 1; //CS_TEST + int iHexaElem; + + // VERTEX + for ( int i=0; iSetNumberOfIds( 1 ); + // v = _doc->getVertex(i); // Abu + v = tab_vertex [i]; + iHexaElem = reinterpret_cast(v);//v->getId(); + vtkElemsId[iHexaElem] = iVtkElem; + hexaElemsId[iVtkElem] = iHexaElem; + anIdList->SetId(0, vtkNodeId[iHexaElem]); + aConnectivity->InsertNextCell( anIdList ); + aCellTypesArray->InsertNextValue( VTK_VERTEX );//getCellType( aType, anElem->IsPoly(), aNbNodes ) ); + ++iVtkElem; + } + + // EDGE + HEXA_NS::Edge* e = NULL; + HEXA_NS::Vertex* vertexElem = NULL; + for ( int i=0; iSetNumberOfIds( 2 ); + // e = _doc->getEdge(i); // Abu + e = tab_edge [i]; + iHexaElem = reinterpret_cast(e); //e->getId(); + vtkElemsId[iHexaElem] = iVtkElem; + hexaElemsId[iVtkElem] = iHexaElem; + + for( vtkIdType j = 0; j< 2; ++j ){ //j< e->countVertex(); ++j ){ + vertexElem = e->getVertex( j ); + anIdList->SetId( j, vtkNodeId[ reinterpret_cast(vertexElem) ] );//vertexElem->getId() ]); + } + aConnectivity->InsertNextCell( anIdList ); + aCellTypesArray->InsertNextValue( VTK_LINE );//getCellType( aType, anElem->IsPoly(), aNbNodes ) ); + ++iVtkElem; + } + + +// 0 1 2 3 4 5 6 7 +// V_ACE, V_ACF, V_ADE, V_ADF, V_BCE, V_BCF, V_BDE, V_BDF, +// +// 0 1 3 2 4 5 7 6 + + // Insert cells in grid + VTKViewer_CellLocationsArray* aCellLocationsArray = VTKViewer_CellLocationsArray::New(); + aCellLocationsArray->SetNumberOfComponents( 1 ); + aCellLocationsArray->SetNumberOfTuples( aNbCells ); +// std::cout << "aNbCells =>" << aNbCells << std::endl; + + aConnectivity->InitTraversal(); + for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ){ + aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); + } + theGrid->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); + + aCellLocationsArray->Delete(); + aCellTypesArray->Delete(); + aConnectivity->Delete(); + anIdList->Delete(); + //std::cout << "theGrid->GetNumberOfCells()" << theGrid->GetNumberOfCells() << std::endl; + + return theGrid; +} +// =============================================================== Abu : Fin + + +// DocumentGraphicView::DocumentGraphicView(SalomeApp_Application* app, SUIT_ViewWindow *suitView, QWidget *parent) +DocumentGraphicView::DocumentGraphicView( LightApp_Application* app, SUIT_ViewWindow *suitView, QWidget *parent ) + : QAbstractItemView(parent), + _suitView( suitView ), + _documentActor( 0 ), + _associateActor (NULL), // Abu + _currentChanged( false ) +{ +// MESSAGE("DocumentGraphicView::DocumentGraphicView() app"<getViewPort(); +// _suitView->viewport(); +// _suitView->installEventFilter(this); +} + +DocumentGraphicView::~DocumentGraphicView() +{ +} + +void DocumentGraphicView::setWindowTitle(const QString& title) +{ + _suitView->setWindowTitle( QString("hexablock : ") + title ); +} + +void DocumentGraphicView::onPatternDatachanged() +{ + MESSAGE("DocumentGraphicView::onPatternDatachanged(){"); + update(); + MESSAGE("}"); +} + + +void DocumentGraphicView::update() +{ + MESSAGE("DocumentGraphicView::update(){"); + + SVTK_ViewWindow* theVTKViewWindow = dynamic_cast(_suitView); +// PatternDataModel* theModel = dynamic_cast( model() ); + DocumentModel* theModel = dynamic_cast( model() ); + MESSAGE("model()"<documentImpl(); + QString theDocumentEntry = theModel->documentEntry(); + + if ( _documentActor ){ + theVTKViewWindow->RemoveActor( _documentActor ); + _documentActor->Delete(); + } + _documentActor = new Document_Actor( theDocumentImpl, theDocumentEntry ); + theVTKViewWindow->AddActor( _documentActor ); + + // -------------------- Abu debut + if (HEXA_NS::special_option()) + { + if (_associateActor != NULL) + { + theVTKViewWindow->RemoveActor( _associateActor ); + _associateActor->Delete(); + } + _associateActor = new Associate_Actor( theDocumentImpl, theDocumentEntry ); + theVTKViewWindow->AddActor( _associateActor ); + } + // -------------------- Abu fin + + // display HEXABLOCK document model + theVTKViewWindow->getRenderer()->Render(); + theVTKViewWindow->Repaint(); + theVTKViewWindow->onFitAll(); + // myVTKViewWindow->SetSelectionMode( ActorSelection ); + // theVTKViewWindow->SetSelectionMode( NodeSelection ); + // myVTKViewWindow->SetSelectionMode( FaceSelection ); + MESSAGE("}"); +} + + +/******************************************************************************** +* ABSTRACT METHOD ( MUST BE IMPLEMENTED ) +********************************************************************************/ + +/* + Returns the item that covers the coordinate given in the view. +*/ + +QModelIndex DocumentGraphicView::indexAt(const QPoint &point) const +{ + MESSAGE("DocumentGraphicView::indexAt(){"); + MESSAGE("}"); + return QModelIndex(); +} + +void DocumentGraphicView::scrollTo(const QModelIndex &index, ScrollHint) +{ + MESSAGE("DocumentGraphicView::scrollTo(){"); + MESSAGE("* item is: " << index.data().toString().toStdString()); + MESSAGE("}"); +} + +/* + Returns the position of the item in viewport coordinates. +*/ +QRect DocumentGraphicView::visualRect(const QModelIndex &index) const +{ + MESSAGE("DocumentGraphicView::visualRect(){"); + MESSAGE("* item is: " << index.data().toString().toStdString()); + MESSAGE("}"); + return QRect(); +} + +// PROTECTED : +int DocumentGraphicView::horizontalOffset() const +{ + MESSAGE("DocumentGraphicView::horizontalOffset(){"); + MESSAGE("}"); + return horizontalScrollBar()->value(); +} + +bool DocumentGraphicView::isIndexHidden(const QModelIndex &index) const +{ + MESSAGE("DocumentGraphicView::isIndexHidden(){"); + MESSAGE("* item is: " << index.data().toString().toStdString()); + MESSAGE("}"); + return false; +} + +QModelIndex DocumentGraphicView::moveCursor(QAbstractItemView::CursorAction cursorAction, + Qt::KeyboardModifiers /*modifiers*/) +{ + MESSAGE("DocumentGraphicView::moveCursor(){"); + QModelIndex current = currentIndex(); + MESSAGE("* current is: " << current.data(Qt::DisplayRole).toString().toStdString()); + MESSAGE("}"); + return current; +} + +/* + Find the indices corresponding to the extent of the selection. +*/ +void DocumentGraphicView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) +{ + MESSAGE("DocumentGraphicView::setSelection(){"); + MESSAGE("}"); +} + + +int DocumentGraphicView::verticalOffset() const +{ + MESSAGE("DocumentGraphicView::verticalOffset(){"); + MESSAGE("}"); + return verticalScrollBar()->value(); +} + +/* + Returns a region corresponding to the selection in viewport coordinates. +*/ +QRegion DocumentGraphicView::visualRegionForSelection(const QItemSelection &selection) const +{ + MESSAGE("DocumentGraphicView::visualRegionForSelection(){"); + MESSAGE("}"); + return QRegion(); +} + + + + +/******************************************************************************** +* PROTECTED SLOTS +********************************************************************************/ +void DocumentGraphicView::closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint ) +{ + MESSAGE("DocumentGraphicView::closeEditor(){"); + MESSAGE("* hint is: " << hint); + MESSAGE("}"); +} + +void DocumentGraphicView::commitData ( QWidget * editor ) +{ + MESSAGE("DocumentGraphicView::commitData(){"); + MESSAGE("}"); +} + +void DocumentGraphicView::currentChanged( const QModelIndex & current, const QModelIndex & previous ) +{ +// MESSAGE("DocumentGraphicView::currentChanged(){"); +// MESSAGE("* current is: " << current.data().toString().toStdString()); +// MESSAGE("* previous is: " << previous.data().toString().toStdString()); +// MESSAGE("}"); +// openPersistentEditor( current ); + _currentChanged = true; +} + +void DocumentGraphicView::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ) +{ +// MESSAGE("DocumentGraphicView::dataChanged(){"); +// MESSAGE("* topLeft is: " << topLeft.data().toString().toStdString()); +// MESSAGE("* bottomRight is: " << bottomRight.data().toString().toStdString()); +// MESSAGE("}"); + update(); + _currentChanged = false; +// updateObject(topLeft); +} + +void DocumentGraphicView::editorDestroyed ( QObject * editor ) +{ + MESSAGE("DocumentGraphicView::editorDestroyed(){"); + MESSAGE("}"); +} + +void DocumentGraphicView::rowsAboutToBeRemoved ( const QModelIndex & parent, int start, int end ) +{ +// MESSAGE("DocumentGraphicView::rowsAboutToBeRemoved (){"); +// MESSAGE("* parent is: " << parent.data(Qt::DisplayRole).toString().toStdString()); +// MESSAGE("* start is: " << start); +// MESSAGE("* end is: " << end); +// MESSAGE("}"); +} + +void DocumentGraphicView::rowsInserted ( const QModelIndex & parent, int start, int end ) +{ +// MESSAGE("DocumentGraphicView::rowsInserted(){"); +// MESSAGE("* parent is: " << parent.data(Qt::DisplayRole).toString().toStdString()); +// MESSAGE("* start is: " << start); +// MESSAGE("* end is: " << end); +// MESSAGE("}"); +} + +void DocumentGraphicView::selectionChanged( const QItemSelection & selected, const QItemSelection & deselected ) +{ + MESSAGE("DocumentGraphicView::selectionChanged(){"); + foreach( const QModelIndex& isel, selected.indexes() ){ + MESSAGE("* selected : " << isel.data().toString().toStdString()); + } + foreach( const QModelIndex& iunsel, deselected.indexes() ){ + MESSAGE("* unselected : " << iunsel.data().toString().toStdString()); + } + MESSAGE("}"); +} + +void DocumentGraphicView::updateGeometries () +{ + MESSAGE("DocumentGraphicView::updateGeometries (){"); + MESSAGE("}"); +} + +SUIT_ViewWindow* DocumentGraphicView::get_SUIT_ViewWindow() +{ + return _suitView; +} + +// bool DocumentGraphicView::canBeDisplayed( const QString& entry, const QString& viewer_type ) const //CS_TODO +// { +// bool result = false; +// +// result = (viewer_type==SVTK_Viewer::Type()); +// // QStringList es = entry.split( "_" );22 +// // bool result = ( es.count() == 3 && es[ 0 ] == "ATOMSOLVGUI" && viewer_type == SVTK_Viewer::Type() ); +// // // printf ( " canBeDisplayed : entry = %s, count = %d, res = %d \n", entry.latin1(), es.count(), result ); +// std::cout << "canBeDisplayed => "<< result << std::endl; +// return result; // entry of an atom for sure +// } + +// SALOME_Prs* HEXABLOCKGUI_Displayer::buildPresentation( const QString& entry, SALOME_View* theViewFrame) +// { +// SALOME_Prs* prs = 0; +// +// SALOME_View* aViewFrame = theViewFrame ? theViewFrame : GetActiveView(); +// +// if ( aViewFrame ) +// { +// SVTK_Viewer* vtk_viewer = dynamic_cast( aViewFrame ); +// if (vtk_viewer) +// { +// SUIT_ViewWindow* wnd = vtk_viewer->getViewManager()->getActiveView(); +// SALOME_Actor* anActor = myGraphicView->FindActorByEntry( wnd, entry.toLatin1().data() ); +// if (!anActor) +// { +// // anActor = myGraphicView->CreateActor( study()->studyDS(), entry.toLatin1().data(), true ); +// anActor = myGraphicView->CreateActor(entry.toLatin1().data()); +// } +// if (anActor) +// { +// // Display actor : +// SVTK_ViewWindow* vtkWnd = dynamic_cast (wnd); +// if (vtkWnd != NULL) +// { +// vtkWnd->AddActor(anActor); +// vtkWnd->Repaint(); +// prs = LightApp_Displayer::buildPresentation(entry.toLatin1().data(), aViewFrame); +// } +// } +// if (prs) +// { +// UpdatePrs(prs); +// } +// else if (anActor) +// { +// //SMESH::RemoveActor( vtk_viewer->getViewManager()->getActiveView(), anActor ); +// std::cout << "Remove Actor" << std::endl; +// } +// } +// } +// +// return prs; +// } + +// SALOME_Prs* SMESHGUI_Displayer::buildPresentation( const QString& entry, SALOME_View* theViewFrame ) +// { +// SALOME_Prs* prs = 0; +// +// SALOME_View* aViewFrame = theViewFrame ? theViewFrame : GetActiveView(); +// +// if ( aViewFrame ) +// { +// SVTK_Viewer* vtk_viewer = dynamic_cast( aViewFrame ); +// if( vtk_viewer ) +// { +// SUIT_ViewWindow* wnd = vtk_viewer->getViewManager()->getActiveView(); +// SMESH_Actor* anActor = SMESH::FindActorByEntry( wnd, entry.toLatin1().data() ); +// if( !anActor ) +// anActor = SMESH::CreateActor( study()->studyDS(), entry.toLatin1().data(), true ); +// if( anActor ) +// { +// SMESH::DisplayActor( wnd, anActor ); +// prs = LightApp_Displayer::buildPresentation( entry.toLatin1().data(), aViewFrame ); +// } +// if( prs ) +// UpdatePrs( prs ); +// else if( anActor ) +// SMESH::RemoveActor( vtk_viewer->getViewManager()->getActiveView(), anActor ); +// } +// } +// +// return prs; +// } + +// +// void DocumentGraphicView::RemoveActor(SUIT_ViewWindow *theWnd, SALOME_Actor* theActor) +// { +// std::cout << "RemoveActor() : 1" << std::endl; +// SVTK_ViewWindow* myViewWindow = dynamic_cast(theWnd); +// // SVTK_ViewWindow* myViewWindow = dynamic_cast(_suitView); +// if (myViewWindow != NULL) +// { +// myViewWindow->RemoveActor(theActor); +// if(theActor->hasIO()) +// { +// std::cout << "RemoveActor() : 2" << std::endl; +// Handle(SALOME_InteractiveObject) anIO = theActor->getIO(); +// if(anIO->hasEntry()) +// { +// std::cout << "RemoveActor() : 3" << std::endl; +// std::string anEntry = anIO->getEntry(); +// SalomeApp_Study* aStudy = dynamic_cast( myViewWindow->getViewManager()->study() ); +// int aStudyId = aStudy->id(); +// // TVisualObjCont::key_type aKey(aStudyId,anEntry); +// // VISUAL_OBJ_CONT.erase(aKey); +// } +// } +// theActor->Delete(); +// myViewWindow->Repaint(); +// std::cout << "RemoveActor() : 4" << std::endl; +// } +// } + +// bool DocumentGraphicView::eventFilter(QObject *obj, QEvent *event) +// { +// std::cout << event->type() << std::endl; +// // if ( event->type() == QEvent::FocusIn ){ //QEvent::KeyPress) { +// // return false; +// // } else { +// // // standard event processing +// // // return QObject::eventFilter(obj, event); +// +// if ( event->type() == QEvent::Paint ) { //QEvent::FocusIn ){ +// std::cout << "PAINTTTTTTTTTT"<< std::endl; +// // loadVTK( "/tmp/load.vtk"); //CS_TEST +// } +// return _suitView->event(event); +// // } +// } +// +// +void DocumentGraphicView::setModel ( QAbstractItemModel * model ) +{ + MESSAGE("DocumentGraphicView::setModel (){"); + QAbstractItemView::setModel( model ); + +// PatternDataModel* pdm = dynamic_cast(model); +// MESSAGE("pdm"<(model); + MESSAGE("dm"<getName() ); + connect( dm, SIGNAL(patternDataChanged() ), this, SLOT ( onPatternDatachanged() ) ); + connect( dm, SIGNAL( nameChanged(const QString&) ), this, SLOT ( setWindowTitle(const QString&) ) ); + + } + + +} + +// void DocumentGraphicView::loadVTK( const QString& path ) //CS_TEST +// { +// std::cout << "DocumentGraphicView::loadVTK=>"<(_suitView); +// +// // vtkStructuredGridReader +// vtkUnstructuredGridReader* r = vtkUnstructuredGridReader::New(); +// // r->SetFileName( path.toLocal8Bit().constData() ); +// r->SetInputString( vtkData.toLocal8Bit().constData() ); +// r->SetReadFromInputString( true ); +// r->Update(); +// +// vtkUnstructuredGrid* myGrid = r->GetOutput();//vtkUnstructuredGrid::New(); +// std::cout << "GetNumberOfCells =>"<< myGrid->GetNumberOfCells(); +// // Create and display actor +// +// vtkDataSetMapper* myMapper = vtkDataSetMapper::New(); +// myMapper->SetInput(myGrid); +// +// // if ( myPreviewActor ){ +// // myVTKViewWindow->RemoveActor(myPreviewActor); +// // myPreviewActor->Delete(); +// // } +// +// SALOME_Actor* myPreviewActor = SALOME_Actor::New(); +// myPreviewActor = SALOME_Actor::New(); +// Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(QString::number( reinterpret_cast(_hexaDocument) ),"HEXABLOCK");//,theName); +// myPreviewActor->setIO(anIO); +// +// // myPreviewActor->PickableOff(); +// myPreviewActor->SetVisibility( true );//VisibilityOff(); +// myPreviewActor->SetPickable( true ); +// myPreviewActor->SetMapper(myMapper); +// +// vtkProperty* aProp = vtkProperty::New(); +// // aProp->SetRepresentationToWireframe(); +// aProp->SetRepresentationToSurface(); +// aProp->EdgeVisibilityOn (); +// +// // aProp->SetColor(10, 10, 250); +// aProp->SetPointSize(5); +// myPreviewActor->SetProperty(aProp); +// aProp->Delete(); +// +// /*vtkProperty* myBackProp = vtkProperty::New(); +// GetColor( "SMESH", "backface_color", aBackRGB[0], aBackRGB[1], aBackRGB[2], QColor( 0, 0, 255 ) ); +// myBackProp->SetColor( aBackRGB[0], aBackRGB[1], aBackRGB[2] ); +// myPreviewActor->SetBackfaceProperty( myBackProp ); +// myBackProp->Delete()*/; +// myVTKViewWindow->AddActor(myPreviewActor); +// myVTKViewWindow->getRenderer()->Render(); +// myVTKViewWindow->Repaint(); +// myVTKViewWindow->onFitAll(); +// +// myVTKViewWindow->SetSelectionMode( ActorSelection ); +// // myVTKViewWindow->SetSelectionMode( NodeSelection ); +// // myVTKViewWindow->SetSelectionMode( EdgeSelection ); +// // myVTKViewWindow->SetSelectionMode( FaceSelection ); +// } + +// void DocumentGraphicView::rowsInserted ( const QModelIndex & parent, int start, int end ) +// { +// +// // std::cout << "DocumentGraphicView::rowsInserted : " << parent.data().toString().toStdString() << std::endl; +// QModelIndex newRow; +// +// SVTK_ViewWindow* myViewWindow = dynamic_cast(_suitView); +// SUIT_ViewManager* vman = myViewWindow->getViewManager(); +// SUIT_ViewModel* vmodel = vman->getViewModel(); +// +// for ( int i = start; i<= end; ++i ){ +// newRow = parent.child(i,0); +// // std::cout << "newRow.data().toString() =>" << newRow.data().toString().toStdString() << std::endl; +// QString entry = newRow.data(HEXA_ENTRY_ROLE).toString();//.toStdString(); +// Display(entry, true, dynamic_cast(vmodel)); +// UpdateViewer(); +// +// // addObject(newRow); +// } +// } diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentGraphicView.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentGraphicView.hxx new file mode 100755 index 0000000..9e2bd3d --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentGraphicView.hxx @@ -0,0 +1,172 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _HEXABLOCKGUI_DOCUMENTGRAPHICVIEW_HXX_ +#define _HEXABLOCKGUI_DOCUMENTGRAPHICVIEW_HXX_ + + +// SALOME GUI includes +#include +// #include +#include +#include + + + + + + + +#include +#include + +// #include +// #include +// #include + +#include +#include +#include +#include +#include + + +// class LightApp_Displayer; +// class SalomeApp_Application; +class LightApp_Application; +class SALOME_Actor; + +// class vtkLookupTable ; +// class vtkPoints ; +// class vtkCellArray ; +// class vtkFloatArray ; +// class vtkActor ; +// class vtkPolyData; + + +class vtkUnstructuredGrid; + + +namespace HEXABLOCK +{ + + namespace GUI + { + + class Document_Actor : public SALOME_Actor + { + public: + Document_Actor(HEXA_NS::Document* doc, const QString& entry); + virtual ~Document_Actor(); + + std::map vtkElemsId; + std::map hexaElemsId; + + vtkUnstructuredGrid* getUnstructuredGrid(); + private: + HEXA_NS::Document* _doc; + }; + + // Abu + class Associate_Actor : public SALOME_Actor + { + public: + Associate_Actor(HEXA_NS::Document* doc, const QString& entry); + virtual ~Associate_Actor() {} + + std::map vtkElemsId; + std::map hexaElemsId; + + vtkUnstructuredGrid* getUnstructuredGrid(); + private: + HEXA_NS::Document* _doc; + }; + + + /******************************************************************************** + * DocumentGraphicView + ********************************************************************************/ + class DocumentGraphicView : public QAbstractItemView + { + Q_OBJECT + + public: + DocumentGraphicView( LightApp_Application* app, SUIT_ViewWindow *suitView, QWidget *parent = 0 ); + virtual ~DocumentGraphicView(); + + + void setModel ( QAbstractItemModel * model ); + + + SUIT_ViewWindow* get_SUIT_ViewWindow(); +// static SALOME_Actor* FindActorByEntry(SUIT_ViewWindow *theWindow, const char* theEntry); + +// void loadVTK( const QString& path ); + void update();//mise à jours de la vue : reconstruction complète + +// bool eventFilter(QObject *obj, QEvent *event); +// virtual void setModel ( QAbstractItemModel * model ); + + QModelIndex indexAt(const QPoint &point) const; + void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible); + QRect visualRect(const QModelIndex &index) const; + +// public: +// virtual bool canBeDisplayed( const QString& /*entry*/, const QString& /*viewer_type*/ ) const; + + public slots: + void setWindowTitle(const QString& title); + void onPatternDatachanged(); + + protected slots: + virtual void closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint ); + virtual void commitData ( QWidget * editor ); + virtual void currentChanged ( const QModelIndex & current, const QModelIndex & previous ); + virtual void dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ); + virtual void editorDestroyed ( QObject * editor ); + virtual void rowsAboutToBeRemoved ( const QModelIndex & parent, int start, int end ); + virtual void rowsInserted ( const QModelIndex & parent, int start, int end ); + virtual void selectionChanged ( const QItemSelection & selected, const QItemSelection & deselected ); + virtual void updateGeometries (); + + protected: + int horizontalOffset() const; + bool isIndexHidden(const QModelIndex &index) const; + QModelIndex moveCursor(QAbstractItemView::CursorAction cursorAction, + Qt::KeyboardModifiers modifiers); + void setSelection(const QRect&, QItemSelectionModel::SelectionFlags command); + int verticalOffset() const; + QRegion visualRegionForSelection(const QItemSelection &selection) const; + +// protected: +// virtual SALOME_Prs* buildPresentation( const QString&, SALOME_View* = 0 ); + + private: + SUIT_ViewWindow *_suitView; + Document_Actor *_documentActor; + Associate_Actor *_associateActor; + bool _currentChanged; + }; + } +} + + + + +#endif diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentItem.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentItem.cxx new file mode 100755 index 0000000..7016d47 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentItem.cxx @@ -0,0 +1,556 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + + +#include "HEXABLOCKGUI_DocumentItem.hxx" +#include "HexShape.hxx" + +#include + +/* +#include */ + + +//#define _DEVDEBUG_ + + +using namespace std; +using namespace HEXABLOCK::GUI; + + +// ----------------------- VERTEX + +VertexItem::VertexItem( HEXA_NS::Vertex* hexaVertex ): + QStandardItem(), + _hexaVertex( hexaVertex ) +{ +// char pName[12]; + QString name = _hexaVertex->getName(/*pName*/); +// QString docEntry = model()->invisibleRootItem()->data(HEXA_ENTRY_ROLE).toString(); + setText(name); +// setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled );//Qt::ItemIsEditable); + setData( VERTEX_TREE, HEXA_TREE_ROLE ); + setData( QString::number( reinterpret_cast(_hexaVertex) ), HEXA_ENTRY_ROLE ); //_hexaVertex->dad() + + HEXA_NS::Shape* assoc = hexaVertex->getAssociation(); + if ( assoc ){ + QString entry = QString(assoc->ident.c_str()); + setData( entry + ";" , HEXA_ASSOC_ENTRY_ROLE ); + } +} + +int VertexItem::type() const +{ + return VERTEXITEM; +} + + + +QVariant VertexItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaVertex ); + } else if (role == Qt::ForegroundRole ) { + HEXA_NS::Shape* assoc = _hexaVertex->getAssociation(); + if ( assoc ) + return QColor(Qt::darkGreen); + else + return QColor(Qt::black); + } else { + return QStandardItem::data( role ); + } +} + +void VertexItem::setData ( const QVariant & value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaVertex = value.value(); + emitDataChanged (); + } else { +// std::cout << " VertexItem::setData( " << role << ", "<< value.toString().toStdString() << " )" <getName(pName); + QString name = _hexaEdge->getName(); +// std::cout << "EdgeItem name : "<< name.toStdString() << std::endl; + setText(name); + setData( EDGE_TREE, HEXA_TREE_ROLE ); + setData( QString::number( reinterpret_cast(_hexaEdge) ), HEXA_ENTRY_ROLE ); + + QString entries, entry; + const HEXA_NS::Shapes& assocs = hexaEdge->getAssociations(); + for( HEXA_NS::Shapes::const_iterator anAssoc = assocs.begin(); anAssoc != assocs.end(); ++anAssoc ){ + entry = (*anAssoc)->ident.c_str(); + entries += entry + ";"; + } + if ( !entries.isEmpty() ) + setData( entries, HEXA_ASSOC_ENTRY_ROLE ); + +} + + +int EdgeItem::type() const +{ + return EDGEITEM; +} + +QVariant EdgeItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaEdge ); + } else if (role == Qt::ForegroundRole ) { + const HEXA_NS::Shapes& assocs = _hexaEdge->getAssociations(); + if ( assocs.size()>0 ) + return QColor(Qt::darkGreen); + else + return QColor(Qt::black); + } else { + return QStandardItem::data( role ); + } +} + +void EdgeItem::setData ( const QVariant & value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaEdge = value.value(); + emitDataChanged (); + } else { + QStandardItem::setData ( value, role ); + } +} + + + + +// ----------------------- QUAD +QuadItem::QuadItem( HEXA_NS::Quad* hexaQuad ): + QStandardItem(), + _hexaQuad( hexaQuad ) +{ +// char pName[12]; + QString name = _hexaQuad->getName(/*pName*/); + setText(name); + setData( QUAD_TREE, HEXA_TREE_ROLE ); + setData( QString::number(reinterpret_cast(_hexaQuad)), HEXA_ENTRY_ROLE ); + + QString entries, entry; + const HEXA_NS::Shapes& assocs = hexaQuad->getAssociations(); + for( HEXA_NS::Shapes::const_iterator anAssoc = assocs.begin(); anAssoc != assocs.end(); ++anAssoc ){ + entry = (*anAssoc)->ident.c_str(); + entries += entry + ";"; + } + if ( !entries.isEmpty() ) + setData( entries, HEXA_ASSOC_ENTRY_ROLE ); +} + + +int QuadItem::type() const +{ + return QUADITEM; +} + +QVariant QuadItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaQuad ); + } else if ( role == Qt::ForegroundRole ) { + const HEXA_NS::Shapes& assocs = _hexaQuad->getAssociations(); + if ( assocs.size()>0 ) + return QColor(Qt::darkGreen); + else + return QColor(Qt::black); + } else { + return QStandardItem::data( role ); + } +} + +void QuadItem::setData ( const QVariant & value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaQuad = value.value(); + emitDataChanged (); + } else { + QStandardItem::setData ( value, role ); + } +} + + + + + +// ----------------------- HEXA + +HexaItem::HexaItem( HEXA_NS::Hexa* hexaHexa ): + QStandardItem(), + _hexaHexa( hexaHexa ) +{ +// char pName[12]; + QString name = _hexaHexa->getName(/*pName*/); + setText(name); + setData( HEXA_TREE, HEXA_TREE_ROLE ); + setData( QString::number( reinterpret_cast(_hexaHexa)), HEXA_ENTRY_ROLE ); +} + + +int HexaItem::type() const +{ + return HEXAITEM; +} + +QVariant HexaItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaHexa ); + } + else if ( role == Qt::ForegroundRole ) { + return QColor(Qt::black); + } + else { + return QStandardItem::data( role ); + } +} + +void HexaItem::setData ( const QVariant & value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaHexa = value.value(); + emitDataChanged (); + } else { + QStandardItem::setData ( value, role ); + } +} + + + + + +// ----------------------- VECTOR +VectorItem::VectorItem( HEXA_NS::Vector* hexaVector ): + QStandardItem(), + _hexaVector( hexaVector ) +{ +// char pName[12]; + QString name = _hexaVector->getName(/*pName*/); + setText(name); + setData( VECTOR_TREE, HEXA_TREE_ROLE ); + setData( QString::number(reinterpret_cast(_hexaVector)), HEXA_ENTRY_ROLE ); +} + +int VectorItem::type() const +{ + return VECTORITEM; +} + +QVariant VectorItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaVector ); + } else { + return QStandardItem::data( role ); + } +} + +void VectorItem::setData ( const QVariant & value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaVector = value.value(); + emitDataChanged (); + } else { + QStandardItem::setData ( value, role ); + } +} + + + + +// ----------------------- CYLINDER +CylinderItem::CylinderItem( HEXA_NS::Cylinder* hexaCylinder): + QStandardItem(), + _hexaCylinder( hexaCylinder ) +{ +// char pName[12]; + QString name = _hexaCylinder->getName(/*pName*/); + setText(name); + setData( CYLINDER_TREE, HEXA_TREE_ROLE ); + setData( QString::number(reinterpret_cast(_hexaCylinder)), HEXA_ENTRY_ROLE ); +} + +int CylinderItem::type() const +{ + return CYLINDERITEM; +} + +QVariant CylinderItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaCylinder ); + } else { + return QStandardItem::data( role ); + } +} + +void CylinderItem::setData ( const QVariant & value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaCylinder = value.value(); + emitDataChanged (); + } else { + QStandardItem::setData ( value, role ); + } +} + + + + +// ----------------------- PIPE +PipeItem::PipeItem( HEXA_NS::Pipe* hexaPipe ): + QStandardItem(), + _hexaPipe( hexaPipe ) +{ +// char pName[12]; + QString name = _hexaPipe->getName(/*pName*/); + setText(name); + setData( PIPE_TREE, HEXA_TREE_ROLE ); + setData( QString::number(reinterpret_cast(_hexaPipe)), HEXA_ENTRY_ROLE ); +} + +int PipeItem::type() const +{ + return PIPEITEM; +} + +QVariant PipeItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaPipe ); + } else { + return QStandardItem::data( role ); + } +} + +void PipeItem::setData ( const QVariant & value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaPipe = value.value(); + emitDataChanged (); + } else { + QStandardItem::setData ( value, role ); + } +} + + + +// ----------------------- ELEMENTS +ElementsItem::ElementsItem( HEXA_NS::Elements* hexaElements ): + QStandardItem(), + _hexaElements( hexaElements ) +{ +// char pName[12]; + QString name = _hexaElements->getName(/*pName*/); + setText(name); + setData( ELEMENTS_TREE, HEXA_TREE_ROLE ); + setData( QString::number(reinterpret_cast(_hexaElements)), HEXA_ENTRY_ROLE ); +} + +int ElementsItem::type() const +{ + return ELEMENTSITEM; +} + +QVariant ElementsItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaElements ); + } else { + return QStandardItem::data( role ); + } +} + +void ElementsItem::setData ( const QVariant & value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaElements = value.value(); + emitDataChanged (); + } else { + QStandardItem::setData ( value, role ); + } +} + + + +// ----------------------- CROSSELEMENTS +CrossElementsItem::CrossElementsItem( HEXA_NS::CrossElements* hexaCrossElts ): + QStandardItem(), + _hexaCrossElts( hexaCrossElts ) +{ +// char pName[12]; + QString name = _hexaCrossElts->getName(/*pName*/); + setText(name); + setData( CROSSELEMENTS_TREE, HEXA_TREE_ROLE ); + setData( QString::number(reinterpret_cast(_hexaCrossElts)), HEXA_ENTRY_ROLE ); +} + +int CrossElementsItem::type() const +{ + return CROSSELEMENTSITEM; +} + +QVariant CrossElementsItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaCrossElts ); + } else { + return QStandardItem::data( role ); + } +} + +void CrossElementsItem::setData ( const QVariant & value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaCrossElts = value.value(); + emitDataChanged (); + } else { + QStandardItem::setData ( value, role ); + } +} + + + +// ----------------------- GROUP +GroupItem::GroupItem( HEXA_NS::Group* hexaGroup ): + QStandardItem(), + _hexaGroup( hexaGroup ) +{ +// char pName[12]; + QString name = _hexaGroup->getName();//pName); + setText(name); + setData( GROUP_TREE, HEXA_TREE_ROLE ); + setData( QString::number(reinterpret_cast(_hexaGroup)), HEXA_ENTRY_ROLE ); +} + +int GroupItem::type() const +{ + return GROUPITEM; +} + +QVariant GroupItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaGroup ); + } else { + return QStandardItem::data( role ); + } +} + +void GroupItem::setData ( const QVariant& value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaGroup = value.value(); + emitDataChanged (); + } else { + QStandardItem::setData ( value, role ); + } +} + + + +// ----------------------- LAW +LawItem::LawItem( HEXA_NS::Law* hexaLaw ): + QStandardItem(), + _hexaLaw( hexaLaw ) +{ +// char pName[12]; + QString name = _hexaLaw->getName();//pName); + setText(name); + setData( LAW_TREE, HEXA_TREE_ROLE ); + setData( QString::number(reinterpret_cast(_hexaLaw)), HEXA_ENTRY_ROLE ); +} + +int LawItem::type() const +{ + return LAWITEM; +} + +QVariant LawItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaLaw); + } else { + return QStandardItem::data( role ); + } +} + +void LawItem::setData ( const QVariant & value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaLaw = value.value(); + emitDataChanged (); + } else { + QStandardItem::setData ( value, role ); + } +} + + + +// ----------------------- PROPAGATIONITEM +PropagationItem::PropagationItem( HEXA_NS::Propagation* hexaPropagation ): + QStandardItem(), + _hexaPropagation( hexaPropagation ) +{ +// char pName[12]; +// QString name = _hexaPropagation->getName(pName); + QString name = "Propagation"; + setText(name); + setData( PROPAGATION_TREE, HEXA_TREE_ROLE ); + setData( QString::number(reinterpret_cast(_hexaPropagation)), HEXA_ENTRY_ROLE ); +} + +int PropagationItem::type() const +{ + return PROPAGATIONITEM; +} + +QVariant PropagationItem::data( int role ) const +{ + if ( role == HEXA_DATA_ROLE ){ + return QVariant::fromValue( _hexaPropagation ); + } else { + return QStandardItem::data( role ); + } +} + +void PropagationItem::setData ( const QVariant & value, int role ) +{ + if ( role == HEXA_DATA_ROLE ){ + _hexaPropagation = value.value(); + emitDataChanged (); + } else { + QStandardItem::setData ( value, role ); + } +} diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentItem.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentItem.hxx new file mode 100755 index 0000000..b5a16aa --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentItem.hxx @@ -0,0 +1,323 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _HEXABLOCKGUI_DOCUMENTITEM_HXX_ +#define _HEXABLOCKGUI_DOCUMENTITEM_HXX_ + + +#include + +#include +#include +#include +#include + + +#include +#include +#include +#include +#include + + + +#include +#include +#include + + + +Q_DECLARE_METATYPE( HEXA_NS::EltBase* ); +Q_DECLARE_METATYPE( HEXA_NS::Vertex* ); +Q_DECLARE_METATYPE( HEXA_NS::Edge* ); +Q_DECLARE_METATYPE( HEXA_NS::Quad* ); +Q_DECLARE_METATYPE( HEXA_NS::Hexa* ); + +Q_DECLARE_METATYPE( HEXA_NS::Vector* ); +Q_DECLARE_METATYPE( HEXA_NS::Cylinder* ); +Q_DECLARE_METATYPE( HEXA_NS::Pipe* ); +Q_DECLARE_METATYPE( HEXA_NS::Elements* ); +Q_DECLARE_METATYPE( HEXA_NS::CrossElements* ); + +Q_DECLARE_METATYPE( HEXA_NS::Group* ); +Q_DECLARE_METATYPE( HEXA_NS::Law* ); +Q_DECLARE_METATYPE( HEXA_NS::Propagation* ); + + + +// Q_DECLARE_METATYPE( QList ); // association + +namespace HEXABLOCK +{ + namespace GUI + { + enum { + VERTEXITEM = QStandardItem::UserType + 1, + EDGEITEM, + QUADITEM, + HEXAITEM, + + VECTORITEM, + CYLINDERITEM, + PIPEITEM, + ELEMENTSITEM, + CROSSELEMENTSITEM, + + GROUPITEM, + LAWITEM, + PROPAGATIONITEM, + + }; + + enum HexaTreeRole { + VERTEX_TREE = 10, + EDGE_TREE, + QUAD_TREE, + HEXA_TREE, + + VECTOR_TREE, + CYLINDER_TREE, + PIPE_TREE, + ELEMENTS_TREE, + CROSSELEMENTS_TREE, + + GROUP_TREE, + LAW_TREE, + PROPAGATION_TREE, + + VERTEX_DIR_TREE, + EDGE_DIR_TREE, + QUAD_DIR_TREE, + HEXA_DIR_TREE, + + VECTOR_DIR_TREE, + CYLINDER_DIR_TREE, + PIPE_DIR_TREE, + ELEMENTS_DIR_TREE, + CROSSELEMENTS_DIR_TREE, + + GROUP_DIR_TREE, + LAW_DIR_TREE, + PROPAGATION_DIR_TREE + + }; //HEXA_TREE_ROLE + + enum { + HEXA_DATA_ROLE = Qt::UserRole + 1, + HEXA_DATA_ASSOC, + HEXA_TREE_ROLE, + HEXA_ENTRY_ROLE, + HEXA_DOC_ENTRY_ROLE, + HEXA_ASSOC_ENTRY_ROLE, + }; + +// QVariant::UserType + + class VertexItem : public QStandardItem + { + public: + VertexItem( HEXA_NS::Vertex* hexaVertex ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::Vertex* _hexaVertex; + }; + + class EdgeItem : public QStandardItem + { + public: + EdgeItem( HEXA_NS::Edge* hexaEdge ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::Edge* _hexaEdge; + }; + + class QuadItem : public QStandardItem + { + public: + QuadItem( HEXA_NS::Quad* hexaQuad ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::Quad* _hexaQuad; + }; + + + class HexaItem : public QStandardItem + { + public: + HexaItem( HEXA_NS::Hexa* hexaHexa ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::Hexa* _hexaHexa; + }; + + + class VectorItem : public QStandardItem + { + public: + VectorItem( HEXA_NS::Vector* hexaVector ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::Vector* _hexaVector; + }; + + + class CylinderItem : public QStandardItem + { + public: + CylinderItem( HEXA_NS::Cylinder* hexaCyl ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::Cylinder* _hexaCylinder; + }; + + + class PipeItem : public QStandardItem + { + public: + PipeItem( HEXA_NS::Pipe* hexaPipe ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::Pipe* _hexaPipe; + }; + + + class ElementsItem : public QStandardItem + { + public: + ElementsItem( HEXA_NS::Elements* hexaElements ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::Elements* _hexaElements; + }; + + class CrossElementsItem : public QStandardItem + { + public: + CrossElementsItem( HEXA_NS::CrossElements* hexaCrossElts ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::CrossElements* _hexaCrossElts; + }; + + + + + class GroupItem : public QStandardItem + { + public: + GroupItem( HEXA_NS::Group* hexaGroup ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::Group* _hexaGroup; + }; + + + class LawItem : public QStandardItem + { + public: + LawItem( HEXA_NS::Law* hexaLaw ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::Law* _hexaLaw; + }; + + + class PropagationItem : public QStandardItem + { + public: + PropagationItem( HEXA_NS::Propagation* hexaPropagation ); + virtual int type () const; + virtual QVariant data ( int role ) const; + virtual void setData ( const QVariant & value, int role ); //= Qt::UserRole + 1 ) + private: + HEXA_NS::Propagation* _hexaPropagation; + }; + + } +} + +#endif + + + + + + +// The QStandardItem class provides an item for use with the QStandardItemModel class. +// +// Items usually contain text, icons, or checkboxes. +// +// Each item can have its own background brush which is set with the setBackground() function. The current background brush can be found with background(). The text label for each item can be rendered with its own font and brush. These are specified with the setFont() and setForeground() functions, and read with font() and foreground(). +// +// By default, items are enabled, editable, selectable, checkable, and can be used both as the source of a drag and drop operation and as a drop target. Each item's flags can be changed by calling setFlags(). Checkable items can be checked and unchecked with the setCheckState() function. The corresponding checkState() function indicates whether the item is currently checked. +// +// You can store application-specific data in an item by calling setData(). +// +// Each item can have a two-dimensional table of child items. This makes it possible to build hierarchies of items. The typical hierarchy is the tree, in which case the child table is a table with a single column (a list). +// +// The dimensions of the child table can be set with setRowCount() and setColumnCount(). Items can be positioned in the child table with setChild(). Get a pointer to a child item with child(). New rows and columns of children can also be inserted with insertRow() and insertColumn(), or appended with appendRow() and appendColumn(). When using the append and insert functions, the dimensions of the child table will grow as needed. +// +// An existing row of children can be removed with removeRow() or takeRow(); correspondingly, a column can be removed with removeColumn() or takeColumn(). +// +// An item's children can be sorted by calling sortChildren(). + + +// Subclassing +// +// When subclassing QStandardItem to provide custom items, it is possible to define new types for them so that they can be distinguished from the base class. The type() function should be reimplemented to return a new type value equal to or greater than UserType. +// +// Reimplement data() and setData() if you want to perform custom handling of data queries and/or control how an item's data is represented. +// +// Reimplement clone() if you want QStandardItemModel to be able to create instances of your custom item class on demand (see QStandardItemModel::setItemPrototype()). +// +// Reimplement read() and write() if you want to control how items are represented in their serialized form. +// +// Reimplement operator<() if you want to control the semantics of item comparison. operator<() determines the sorted order when sorting items with sortChildren() or with QStandardItemModel::sort(). + +// QStandardItemModel model; +// QStandardItem *parentItem = model.invisibleRootItem(); +// for (int i = 0; i < 4; ++i) { +// QStandardItem *item = new QStandardItem(QString("item %0").arg(i)); +// parentItem->appendRow(item); +// parentItem = item; +// } + +// QStandardItem *item = myStandardItemModel->itemFromIndex(index); diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentModel.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentModel.cxx new file mode 100755 index 0000000..1f1d0d7 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentModel.cxx @@ -0,0 +1,3375 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +//CS_TODO: relever les fonctions qui nécessitent updateData(). +// addGroupElement à tester + +#include +#include + +#include "utilities.h" + +#include "HEXABLOCKGUI_DocumentModel.hxx" +#include "HEXABLOCKGUI_DocumentItem.hxx" + +#include "HEXABLOCKGUI.hxx" +#include "HEXABLOCKGUI_Trace.hxx" + +#include "HexVertex.hxx" +#include "HexShape.hxx" + +#include +//#define _DEVDEBUG_ + + +using namespace std; +using namespace HEXABLOCK::GUI; + +/***************************************************************** + DocumentModel +*****************************************************************/ +// DocumentModel::DocumentModel(QObject * parent): +DocumentModel::DocumentModel(HEXA_NS::Document* docIn, const QString& entryIn, QObject * parent): + QStandardItemModel(parent), + _hexaFile( new QTemporaryFile() ), + _hexaDocument( docIn ), + _entry( entryIn ), +// _hexaDocument( new HEXA_NS::Document("/tmp/doc.hex") ), //CS_TODO + + _vertexDirItem( new QStandardItem(tr("TREE_ITEM_VERTEX")) ), + _edgeDirItem( new QStandardItem(tr("TREE_ITEM_EDGE")) ), + _quadDirItem( new QStandardItem(tr("TREE_ITEM_QUAD")) ), + _hexaDirItem( new QStandardItem(tr("TREE_ITEM_HEXA")) ), + + _vectorDirItem( new QStandardItem(tr("TREE_ITEM_VECTOR")) ), + _cylinderDirItem( new QStandardItem(tr("TREE_ITEM_CYLINDER")) ), + _pipeDirItem( new QStandardItem(tr("TREE_ITEM_PIPE")) ), + _elementsDirItem( new QStandardItem(tr("TREE_ITEM_ELEMENT")) ), + _crossElementsDirItem( new QStandardItem(tr("TREE_ITEM_CROSSELEMENT")) ), + + _groupDirItem( new QStandardItem(tr("TREE_ITEM_GROUP")) ), + + _lawDirItem( new QStandardItem(tr("TREE_ITEM_LAW")) ), + _propagationDirItem( new QStandardItem(tr("TREE_ITEM_PROPAGATION")) ), + + _vertexItemFlags( Qt::NoItemFlags ), + _edgeItemFlags( Qt::NoItemFlags ), + _quadItemFlags( Qt::NoItemFlags ), + _hexaItemFlags( Qt::NoItemFlags ), + _vectorItemFlags( Qt::NoItemFlags ), + _cylinderItemFlags( Qt::NoItemFlags ), + _pipeItemFlags( Qt::NoItemFlags ), + _elementsItemFlags( Qt::NoItemFlags ), + _crossElementsItemFlags( Qt::NoItemFlags ), + _disallowEdition( false ) +{ +// setColumnCount( 4 ); //CS_TEST + if ( !_hexaDocument && _hexaFile->open() ){ + _hexaDocument = new HEXA_NS::Document( _hexaFile->fileName().toLatin1() ); + _hexaDocument->reorderFaces(); + } + + QStandardItem *parentItem = invisibleRootItem(); +// parentItem->setData( QString::number( reinterpret_cast(_hexaDocument) ), HEXA_ENTRY_ROLE ); + parentItem->setData( _entry, HEXA_ENTRY_ROLE ); + + _vertexDirItem->setData( VERTEX_DIR_TREE, HEXA_TREE_ROLE ); + _edgeDirItem->setData( EDGE_DIR_TREE, HEXA_TREE_ROLE ); + _quadDirItem->setData( QUAD_DIR_TREE, HEXA_TREE_ROLE ); + _hexaDirItem->setData( HEXA_DIR_TREE, HEXA_TREE_ROLE ); + + _vectorDirItem->setData( VECTOR_DIR_TREE, HEXA_TREE_ROLE ); + _cylinderDirItem->setData( CYLINDER_DIR_TREE, HEXA_TREE_ROLE ); + _pipeDirItem->setData( PIPE_DIR_TREE, HEXA_TREE_ROLE ); + _elementsDirItem->setData( ELEMENTS_DIR_TREE, HEXA_TREE_ROLE ); + _crossElementsDirItem->setData( CROSSELEMENTS_DIR_TREE, HEXA_TREE_ROLE ); + + _groupDirItem->setData( GROUP_DIR_TREE, HEXA_TREE_ROLE ); + + //CS_TODO associations + + _lawDirItem->setData( LAW_DIR_TREE, HEXA_TREE_ROLE ); + _propagationDirItem->setData( PROPAGATION_DIR_TREE, HEXA_TREE_ROLE ); + + + parentItem->appendRow(_vertexDirItem); + parentItem->appendRow(_edgeDirItem); + parentItem->appendRow(_quadDirItem); + parentItem->appendRow(_hexaDirItem); + parentItem->appendRow(_vectorDirItem); + parentItem->appendRow(_cylinderDirItem); + parentItem->appendRow(_pipeDirItem); + parentItem->appendRow(_elementsDirItem); + parentItem->appendRow(_crossElementsDirItem); + parentItem->appendRow(_groupDirItem); + parentItem->appendRow(_lawDirItem); + parentItem->appendRow(_propagationDirItem); +} + +DocumentModel::~DocumentModel() +{ + delete _hexaDocument; + delete _hexaFile; +} + +void DocumentModel::setName(const QString& name) +{ + _hexaDocument->setName( name.toLocal8Bit().constData() ); + emit nameChanged(name); +} + +QString DocumentModel::getName() +{ + return _hexaDocument->getName(); +} + +void DocumentModel::load( const QString& xmlFileName ) // Fill Data +{ + MESSAGE("HEXABLOCKGUI::load() => "<setFile( tmp.toLocal8Bit().constData() ); + // _hexaDocument->loadXml(); + //std::cout << "AAAAAAAAAA name ->" << _hexaDocument->getName() << std::endl; + // _hexaDocument->loadXml(tmp.toLocal8Bit().constData() ); + _hexaDocument->loadXml(xmlFileName.toLocal8Bit().constData() ); + //std::cout << "BBBBBBBBB name ->" << _hexaDocument->getName() << std::endl; + //std::cout << "DocumentModel::load ->" << tmp.toStdString() << std::endl; + clearAll(); + + fillData(); + fillBuilder(); + fillAssociation(); + fillGroups(); + fillMesh(); + +// tmp = "/tmp/load.vtk"; +// //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + + emit patternDataChanged(); + + // BUILDER, ASSOCIATION, GROUPS, ... CS_TODO _fillBuilderFrom( _hexaDocument ); +} + +void DocumentModel::save( const QString& xmlFileName ) +{ + MESSAGE("HEXABLOCKGUI::save() => "<" << xmlFileName.toStdString() << std::endl; + //std::cout << "DocumentModel::save _hexaDocument->" << _hexaDocument << std::endl; +// QString noSuffix = xmlFileName.section('.', 0, 0); + //std::cout << "DocumentModel::save ->" << noSuffix.toStdString() << std::endl; + //_hexaDocument->setFile( noSuffix.toLocal8Bit().constData() ); // Abu + //_hexaDocument->saveFile(); // Abu +// _hexaDocument->save( noSuffix.toLocal8Bit().constData() ); + _hexaDocument->save( xmlFileName.toLocal8Bit().constData() ); +} + +void DocumentModel::updateData() +{ + //std::cout<<"DocumentModel::updateData() begin"<saveVtk( tmp.toLocal8Bit().constData() ); + emit patternDataChanged(); + //std::cout<<"DocumentModel::updateData() end"<removeRows( 0, _vertexDirItem->rowCount() ); + _edgeDirItem->removeRows(0, _edgeDirItem->rowCount() ); + _quadDirItem->removeRows(0, _quadDirItem->rowCount() ); + _hexaDirItem->removeRows(0, _hexaDirItem->rowCount() ); +} + + +void DocumentModel::clearBuilder() +{ + _vectorDirItem->removeRows(0, _vectorDirItem->rowCount() ); + _cylinderDirItem->removeRows(0, _cylinderDirItem->rowCount() ); + _pipeDirItem->removeRows(0, _pipeDirItem->rowCount() ); + _elementsDirItem->removeRows(0, _elementsDirItem->rowCount() ); + _crossElementsDirItem->removeRows(0, _crossElementsDirItem->rowCount() ); +} + +void DocumentModel::clearAssociation() +{ + //CS_TODO +} + +void DocumentModel::clearGroups() +{ + _groupDirItem->removeRows(0, _groupDirItem->rowCount() ); +} + +void DocumentModel::clearMesh() +{ + _lawDirItem->removeRows(0, _lawDirItem->rowCount() ); + _propagationDirItem->removeRows(0, _propagationDirItem->rowCount() ); +} + + +void DocumentModel::fillData() +{ + //std::cout<<"DocumentModel::fillData() begin"<" << _hexaDocument << std::endl; + + // DATA + HEXA_NS::Vertex *v = NULL; + VertexItem *vItem = NULL; + for ( int i=0; i<_hexaDocument->countVertex(); ++i ){ +// /*char pName[12];*/ std::string name; +// HEXA_NS::Shape *aShape = NULL; +// QString shapeIDs; + + v = _hexaDocument->getVertex(i); +// name = v->getName(/*pName*/); +// aShape = v->getAssociation(); + + vItem = new VertexItem(v); + vItem->setData( _entry, HEXA_DOC_ENTRY_ROLE ); +// if ( aShape ){ +// shapeIDs = aShape->ident.c_str(); +// shapeIDs += ";"; +// vItem->setData( QVariant::fromValue(shapeIDs), HEXA_ASSOC_ENTRY_ROLE ); +// } + _vertexDirItem->appendRow(vItem); +// std::cout<getAssociation(); +// std::cout<<"assoc->"< assocItems; +// assocItems << new QStandardItem(s->ident.c_str()); +// std::cout<<"assoc id =>"<ident<appendColumn(assocItems); +// } +// + //CS_TEST +// _vertexDirItem->setEditable( false );//CS_TEST + } + + HEXA_NS::Edge *e = NULL; + EdgeItem *eItem = NULL; + for ( int i=0; i<_hexaDocument->countEdge(); ++i ){ +// /*char pName[12]; */std::string name; +// HEXA_NS::Shapes shapeList; +// QString shapeIDs; + + e = _hexaDocument->getEdge(i); +// name = e->getName(pName); +// shapeList = e->getAssociations(); + + eItem = new EdgeItem(e); + eItem->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + +// std::cout << "shapeList.size() => " << shapeList.size() << std::endl; +// +// if ( !shapeList.empty() ){ +// for ( HEXA_NS::Shapes::const_iterator aShape = shapeList.begin(); +// aShape != shapeList.end(); +// ++aShape ){ +// shapeIDs += (*aShape)->ident.c_str(); +// shapeIDs += ";"; +// } +// eItem->setData( QVariant::fromValue(shapeIDs), HEXA_ASSOC_ENTRY_ROLE ); +// } + _edgeDirItem->appendRow(eItem); +// std::cout<countQuad(); ++i ){ +// char pName[12]; std::string name; +// HEXA_NS::Shapes shapeList; +// QString shapeIDs; + + q = _hexaDocument->getQuad(i); +// name = q->getName(pName); +// shapeList = q->getAssociations(); + + qItem = new QuadItem(q); + qItem->setData( _entry, HEXA_DOC_ENTRY_ROLE ); +// if ( !shapeList.empty() ){ +// for ( HEXA_NS::Shapes::const_iterator aShape = shapeList.begin(); +// aShape != shapeList.end(); +// ++aShape ){ +// shapeIDs += (*aShape)->ident.c_str(); +// shapeIDs += ";"; +// } +// eItem->setData( QVariant::fromValue(shapeIDs), HEXA_ASSOC_ENTRY_ROLE ); +// } + _quadDirItem->appendRow(qItem); +// std::cout<countHexa(); ++i ){ + h = _hexaDocument->getHexa(i); + hItem = new HexaItem(h); + hItem->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _hexaDirItem->appendRow(hItem); + } + + //std::cout<<"DocumentModel::fillData() end"<countVector(); ++i ){ + v = _hexaDocument->getVector(i); + vItem = new VectorItem(v); + _vectorDirItem->appendRow(vItem); + } + + // _cylinderDirItem + HEXA_NS::Cylinder *c = NULL; + CylinderItem *cItem = NULL; + for ( int i=0; i<_hexaDocument->countCylinder(); ++i ){ + c = _hexaDocument->getCylinder(i); + cItem = new CylinderItem(c); + _cylinderDirItem->appendRow(cItem); + } + +// _pipeDirItem + HEXA_NS::Pipe *p = NULL; + PipeItem *pItem = NULL; + for ( int i=0; i<_hexaDocument->countPipe(); ++i ){ + p = _hexaDocument->getPipe(i); + pItem = new PipeItem(p); + _pipeDirItem->appendRow(pItem); + + } +// _elementsDirItem CS_TODO : no elements +// HEXA_NS::Elements *e = NULL; +// ElementsItem *eItem = NULL; +// for ( int i=0; i<_hexaDocument->countElements(); ++i ){ +// e = _hexaDocument->getElements(i); +// eItem = new ElementsItem(e); +// _elementsDirItem->appendRow(eItem); +// } + +// _crossElementsDirItem +// HEXA_NS::CrossElements *c = NULL; +// CrossElementsItem *cItem = NULL; +// for ( int i=0; i<_hexaDocument->countCrossElements(); ++i ){ +// c = _hexaDocument->getCrossElements(i); +// cItem = new CrossElementsItem(c); +// _crossElementsDirItem->appendRow(cItem); +// } + +} + +void DocumentModel::fillAssociation() +{ + +} + +void DocumentModel::fillGroups() +{ + //std::cout<<"DocumentModel::fillGroups() begin"< "<< _hexaDocument->countGroup() << std::endl; + for ( int i=0; i<_hexaDocument->countGroup(); ++i ){ + g = _hexaDocument->getGroup(i); + //std::cout<<"getGroup => "<< i << std::endl; + gItem = new GroupItem(g); + gItem->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _groupDirItem->appendRow(gItem); + } + //std::cout<<"DocumentModel::fillGroups() end"< "<< _hexaDocument->countLaw() << std::endl; + for ( int i=0; i<_hexaDocument->countLaw(); ++i ){ + l = _hexaDocument->getLaw(i); + //std::cout<<"getLaw => "<< i << std::endl; + lItem = new LawItem(l); + _lawDirItem->appendRow(lItem); + } + + // _propagationDirItem + HEXA_NS::Propagation *p = NULL; + PropagationItem *pItem = NULL; + //std::cout<<"countPropagation => "<< _hexaDocument->countPropagation() << std::endl; + for ( int i=0; i<_hexaDocument->countPropagation(); ++i ){ + p = _hexaDocument->getPropagation(i); +// std::cout<<"getPropagation => "<< i << std::endl; + pItem = new PropagationItem(p); + pItem->setText(QString("Propagation%1").arg(i) ); + pItem->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _propagationDirItem->appendRow(pItem); + } +} + +// Qt::ItemFlags DocumentModel::flags(const QModelIndex &index) const +// { +// Qt::ItemFlags flags; +// +// if (!index.isValid()){ +// std::cout<<"!index.isValid()"<type() == VERTEXITEM) && (_vertexItemFlags != Qt::NoItemFlags) ){ +// flags = _vertexItemFlags; +// } else if ( (item->type() == EDGEITEM) && (_edgeItemFlags != Qt::NoItemFlags) ){ +// flags = _edgeItemFlags; +// } else if ( (item->type() == QUADITEM) && (_quadItemFlags != Qt::NoItemFlags) ){ +// flags = _quadItemFlags; +// } else if ( (item->type() == HEXAITEM) && (_hexaItemFlags != Qt::NoItemFlags) ){ +// flags = _hexaItemFlags; +// } else if ( (item->type() == VECTORITEM) && (_vectorItemFlags != Qt::NoItemFlags) ){ +// flags = _vectorItemFlags; +// } else if ( (item->type() == CYLINDERITEM) && (_cylinderItemFlags != Qt::NoItemFlags) ){ +// flags = _cylinderItemFlags; +// } else if ( (item->type() == PIPEITEM ) && (_pipeItemFlags != Qt::NoItemFlags) ){ +// flags = _pipeItemFlags; +// } else if ( (item->type() == ELEMENTSITEM) && (_elementsItemFlags != Qt::NoItemFlags) ){ +// flags = _elementsItemFlags; +// } else if ( (item->type() == CROSSELEMENTSITEM) && (_crossElementsItemFlags != Qt::NoItemFlags) ){ +// flags = _crossElementsItemFlags; +// } else if ( (item->type() == GROUPITEM) && (_groupItemFlags != Qt::NoItemFlags) ){ +// flags = _groupItemFlags; +// } else if ( (item->type() == LAWITEM ) && (_lawItemFlags != Qt::NoItemFlags) ){ +// flags = _lawItemFlags; +// } else if ( (item->type() == PROPAGATIONITEM ) && (_propagationItemFlags != Qt::NoItemFlags) ){ +// flags = _propagationItemFlags; +// } else { +// flags = item->flags(); +// } +// +// return flags; +// } + +// Qt::ItemFlags DocumentModel::flags(const QModelIndex &index) const +// { +// Qt::ItemFlags flags; +// +// if (!index.isValid()) return Qt::ItemIsEnabled; +// QStandardItem *item = itemFromIndex ( index ); +// if ( _disallowEdition ){ +// flags = Qt::ItemFlags( ~Qt::ItemIsEditable ); +// } else { +// flags = item->flags(); +// } +// +// return flags; +// } + +Qt::ItemFlags DocumentModel::flags(const QModelIndex &index) const +{ + Qt::ItemFlags flags; + + if (!index.isValid()) return Qt::ItemIsEnabled; + + if ( _disallowEdition ){ + return QAbstractItemModel::flags(index) | Qt::ItemFlags( ~Qt::ItemIsEditable ); + } else { + return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; + } +} + +void DocumentModel::allowEdition() +{ + MESSAGE("DocumentModel::allowEdition(){"); + _disallowEdition = false; + MESSAGE("}"); +} + +void DocumentModel::disallowEdition() +{ + MESSAGE("DocumentModel::disallowEdition (){"); + _disallowEdition = true; + MESSAGE("}"); +} + +// disallowEdition +// void DocumentModel::allowAllSelection() +// { +// _vertexItemFlags = Qt::NoItemFlags; +// _edgeItemFlags = Qt::NoItemFlags; +// _quadItemFlags = Qt::NoItemFlags; +// _hexaItemFlags = Qt::NoItemFlags; +// +// _vectorItemFlags = Qt::NoItemFlags; +// _cylinderItemFlags = Qt::NoItemFlags; +// _pipeItemFlags = Qt::NoItemFlags; +// _elementsItemFlags = Qt::NoItemFlags; +// _crossElementsItemFlags = Qt::NoItemFlags; +// +// _groupItemFlags = Qt::NoItemFlags; +// _lawItemFlags = Qt::NoItemFlags; +// _propagationItemFlags = Qt::NoItemFlags; +// } + +void DocumentModel::allowDataSelectionOnly() +{ + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +} + +// void DocumentModel::allowVertexSelectionOnly() +// { +// std::cout << "allowVertexSelectionOnly() allowVertexSelectionOnly() allowVertexSelectionOnly() "<< std::endl; +// _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable); +// _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +// _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +// _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +// +// _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +// _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +// _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +// _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +// _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +// +// _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +// _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +// _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +// +// // emit layoutChanged(); +// } + +void DocumentModel::allowVertexSelectionOnly() +{ + //std::cout << "allowVertexSelectionOnly() allowVertexSelectionOnly() allowVertexSelectionOnly() "<< std::endl; + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + +// emit layoutChanged(); +} + +void DocumentModel::allowEdgeSelectionOnly() +{ + //std::cout << "allowEdgeSelectionOnly() allowEdgeSelectionOnly() allowEdgeSelectionOnly() "<< std::endl; + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +} + +void DocumentModel::allowQuadSelectionOnly() +{ + //std::cout << "allowQuadSelectionOnly() allowQuadSelectionOnly() allowQuadSelectionOnly() "<< std::endl; + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +} + +void DocumentModel::allowHexaSelectionOnly() +{ + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +} + +void DocumentModel::allowVectorSelectionOnly() +{ + //std::cout << "allowVectorSelectionOnly() allowVectorSelectionOnly() allowVectorSelectionOnly() "<< std::endl; + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +} + +void DocumentModel::allowCylinderSelectionOnly() +{ + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +} + +void DocumentModel::allowPipeSelectionOnly() +{ + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +} + +/* +void DocumentModel::allowPipeItemFlags() +{ + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +}*/ + +void DocumentModel::allowElementsSelectionOnly() +{ + //std::cout << "allowElementsSelectionOnly() allowElementsSelectionOnly() allowElementsSelectionOnly() "<< std::endl; + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +} + +void DocumentModel::allowCrossElementsSelectionOnly() +{ + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +} + +void DocumentModel::allowLawSelectionOnly() +{ + _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + + _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _crossElementsItemFlags = Qt::ItemFlags( Qt::ItemIsEnabled ); + + _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); + _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable ); + _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled ); +} + +void DocumentModel::setName( const QModelIndex& iElt, const QString& name ) +{ + HEXA_NS::EltBase *elt = NULL; + + switch ( data(iElt, HEXA_TREE_ROLE).toInt() ){ + case VERTEX_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Vertex* >(); break; + case EDGE_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Edge* >(); break; + case QUAD_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Quad* >(); break; + case HEXA_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Hexa* >(); break; + case VECTOR_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Vector* >(); break; + case CYLINDER_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Cylinder* >(); break; + case PIPE_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Pipe* >(); break; + case ELEMENTS_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Elements* >(); break; + case CROSSELEMENTS_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::CrossElements* >(); break; + case GROUP_TREE : + { + HEXA_NS::Group* grp = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Group* >(); + grp->setName( name.toLatin1().data() ); + break; + } + case LAW_TREE : + { + HEXA_NS::Law* l = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Law* >(); + l->setName( name.toLatin1().data() ); + break; + } +// case PROPAGATION_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Propagation* >(); break; + } + + if ( elt != NULL ) elt->setName( name.toStdString() ); + + setData( iElt, name ); +} + +bool DocumentModel::clearEltAssociations( const QModelIndex& iElt ) +{ + bool isOk = false; + HEXA_NS::EltBase *elt = NULL; + + switch ( data(iElt, HEXA_TREE_ROLE).toInt() ){ + case VERTEX_TREE : + { + elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Vertex* >(); + //std::cout<<"VERTEX_TREE:"<(); + //std::cout<<"EDGE_TREE :"<(); + //std::cout<<"QUAD_TREE :"<clearAssociation(); + setData( iElt, QVariant(), HEXA_ASSOC_ENTRY_ROLE ); + isOk = true; + } + + return isOk; +} + +QModelIndex DocumentModel::addVertex( double x, double y, double z ) +{ + //std::cout << "DocumentModel::addVertex() _hexaDocument->" << _hexaDocument << std::endl; + QModelIndex vertexIndex; + + HEXA_NS::Vertex* hv = _hexaDocument->addVertex(x, y, z); + if ( hv->isValid() ){ + VertexItem* v = new VertexItem(hv); + v->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _vertexDirItem->appendRow(v); +// v->appendRow( new QStandardItem("titi") ); +// QList l; +// l << new QStandardItem("toto"); +// v->appendColumn( l ); + vertexIndex = v->index(); + emit patternDataChanged(); + } else { + delete hv; + } + + return vertexIndex; +} + +QModelIndex DocumentModel::addEdgeVertices (const QModelIndex &i_v0, const QModelIndex &i_v1 ) +{ + QModelIndex edgeIndex; + + HEXA_NS::Vertex* hv0 = data(i_v0, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv1 = data(i_v1, HEXA_DATA_ROLE).value(); + + HEXA_NS::Edge* he = _hexaDocument->addEdge( hv0, hv1 ); + + if ( he->isValid() ){ + EdgeItem* e = new EdgeItem(he); + e->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _edgeDirItem->appendRow(e); + edgeIndex = e->index(); + emit patternDataChanged(); + QString tmp = "/tmp/addEdgeVertices.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete he; + } + return edgeIndex; +} + +QModelIndex DocumentModel::addEdgeVector( const QModelIndex &i_v, const QModelIndex &i_vec ) +{ + QModelIndex edgeIndex; + + HEXA_NS::Vertex* hv = data(i_v, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvec = data(i_vec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Edge* he = _hexaDocument->addEdge( hv, hvec ); + + if ( he->isValid() ){ + EdgeItem* e = new EdgeItem(he); + e->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _edgeDirItem->appendRow(e); + edgeIndex = e->index(); + emit patternDataChanged(); + QString tmp = "/tmp/addEdgeVector.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete he; + } + return edgeIndex; +} + +QModelIndex DocumentModel::addQuadVertices( const QModelIndex &i_v0, const QModelIndex &i_v1, + const QModelIndex &i_v2, const QModelIndex &i_v3 ) +{ //CS_TODO : gestion erreur + QModelIndex quadIndex; + +// QStandardItem *item_v0 = itemFromIndex(i_v0); +// QStandardItem *item_v1 = itemFromIndex(i_v1); +// QStandardItem *item_v2 = itemFromIndex(i_v2); +// QStandardItem *item_v3 = itemFromIndex(i_v3); + +// HASSERT( item_v0->type() == item_v1->type() +// == item_v2->type() == item_v3->type() +// == VERTEXITEM ); + + HEXA_NS::Vertex* hv0 = data(i_v0, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv1 = data(i_v1, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv2 = data(i_v2, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv3 = data(i_v3, HEXA_DATA_ROLE).value(); + + if ( hv0 and hv1 and hv2 and hv3 ){ + HEXA_NS::Quad* hq = _hexaDocument->addQuadVertices( hv0, hv1, hv2, hv3 ); + if ( hq->isValid() ){ + QuadItem* q = new QuadItem(hq); + q->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _quadDirItem->appendRow(q); + quadIndex = q->index(); + emit patternDataChanged(); + QString tmp = "/tmp/addQuadVertices.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hq; + } + } + return quadIndex; +} + +QModelIndex DocumentModel::addQuadEdges( const QModelIndex &e0, const QModelIndex &e1, + const QModelIndex &e2, const QModelIndex &e3 ) +{ //CS_TODO + QModelIndex quadIndex; + + HEXA_NS::Edge* he0 = data(e0, HEXA_DATA_ROLE).value(); + HEXA_NS::Edge* he1 = data(e1, HEXA_DATA_ROLE).value(); + HEXA_NS::Edge* he2 = data(e2, HEXA_DATA_ROLE).value(); + HEXA_NS::Edge* he3 = data(e3, HEXA_DATA_ROLE).value(); + + if ( he0 and he1 and he2 and he3 ){ + HEXA_NS::Quad* hq = _hexaDocument->addQuad( he0, he1, he2, he3 ); + if ( hq->isValid() ){ + QuadItem* q = new QuadItem(hq); + q->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _quadDirItem->appendRow(q); + quadIndex = q->index(); + emit patternDataChanged(); + QString tmp = "/tmp/addQuadEdges.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hq; + } + } + return quadIndex; +} + +QModelIndex DocumentModel::addHexaVertices( + const QModelIndex &iv0, const QModelIndex &iv1, + const QModelIndex &iv2, const QModelIndex &iv3, + const QModelIndex &iv4, const QModelIndex &iv5, + const QModelIndex &iv6, const QModelIndex &iv7 ) +{ + QModelIndex iHexa; + + HEXA_NS::Vertex* hv0 = data(iv0, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv1 = data(iv1, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv2 = data(iv2, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv3 = data(iv3, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv4 = data(iv4, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv5 = data(iv5, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv6 = data(iv6, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv7 = data(iv7, HEXA_DATA_ROLE).value(); + + HEXA_NS::Hexa* hh = _hexaDocument->addHexaVertices( hv0, hv1, hv2, hv3, + hv4, hv5, hv6, hv7 ); + + if ( hh->isValid() ){ + HexaItem* h = new HexaItem(hh); + h->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _hexaDirItem->appendRow(h); + iHexa = h->index(); + emit patternDataChanged(); + QString tmp = "/tmp/addHexaVertices.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hh; + } + + return iHexa; +} + +QModelIndex DocumentModel::addHexaQuad( const QModelIndex &i_q0, const QModelIndex &i_q1, + const QModelIndex &i_q2,const QModelIndex &i_q3, const QModelIndex &i_q4, const QModelIndex &i_q5 ) +{ //CS_TODO : gestion erreur + QModelIndex hexaIndex; + +// QStandardItem *item_v0 = itemFromIndex(i_q0); +// QStandardItem *item_v1 = itemFromIndex(i_q1); +// QStandardItem *item_v2 = itemFromIndex(i_q2); +// QStandardItem *item_v3 = itemFromIndex(i_q3); +// QStandardItem *item_v4 = itemFromIndex(i_q4); +// QStandardItem *item_v5 = itemFromIndex(i_q5); + HEXA_NS::Quad* hq0 = data(i_q0, HEXA_DATA_ROLE).value(); + HEXA_NS::Quad* hq1 = data(i_q1, HEXA_DATA_ROLE).value(); + HEXA_NS::Quad* hq2 = data(i_q2, HEXA_DATA_ROLE).value(); + HEXA_NS::Quad* hq3 = data(i_q3, HEXA_DATA_ROLE).value(); + HEXA_NS::Quad* hq4 = data(i_q4, HEXA_DATA_ROLE).value(); + HEXA_NS::Quad* hq5 = data(i_q5, HEXA_DATA_ROLE).value(); + + HEXA_NS::Hexa* hh = _hexaDocument->addHexa( hq0, hq1, hq2, hq3, hq4, hq5 ); + + if ( hh->isValid() ){ + HexaItem* h = new HexaItem(hh); + h->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _hexaDirItem->appendRow(h); + hexaIndex = h->index(); + emit patternDataChanged(); + QString tmp = "/tmp/addHexaQuad.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hh; + } + + return hexaIndex; +} + +QModelIndex DocumentModel::addHexaQuads( const QModelIndexList &iquads) +{ + QModelIndex hexaIndex; + + HEXA_NS::Hexa* hh = NULL; + HEXA_NS::Quad* hq0, *hq1, *hq2, *hq3, *hq4, *hq5 = NULL; + + hq0 = data( iquads.value(0), HEXA_DATA_ROLE).value(); + hq1 = data( iquads.value(1), HEXA_DATA_ROLE).value(); + hq2 = data( iquads.value(2), HEXA_DATA_ROLE).value(); + hq3 = data( iquads.value(3), HEXA_DATA_ROLE).value(); + hq4 = data( iquads.value(4), HEXA_DATA_ROLE).value(); + hq5 = data( iquads.value(5), HEXA_DATA_ROLE).value(); + + if ( hq0 && hq1 ){ + hh = _hexaDocument->addHexa2Quads( hq0, hq1); + } else if ( hq0 && hq1 && hq2){ + hh = _hexaDocument->addHexa3Quads( hq0, hq1, hq2 ); + } else if ( hq0 && hq1 && hq2 && hq3 ){ + hh = _hexaDocument->addHexa4Quads( hq0, hq1, hq2, hq3 ); + } else if ( hq0 && hq1 && hq2 && hq3 && hq4 ){ + hh = _hexaDocument->addHexa5Quads( hq0, hq1, hq2, hq3, hq4 ); + } else if ( hq0 && hq1 && hq2 && hq3 && hq4 && hq5 ){ + hh = _hexaDocument->addHexa( hq0, hq1, hq2, hq3, hq4, hq5 ); + } + + if ( hh && hh->isValid() ){ + HexaItem* h = new HexaItem(hh); + h->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _hexaDirItem->appendRow(h); + hexaIndex = h->index(); + emit patternDataChanged(); + QString tmp = "/tmp/addHexaQuads.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hh; + } + + return hexaIndex; +} + +// Vector addVector( in double dx, in double dy, in double dz ) +// raises (SALOME::SALOME_Exception); +QModelIndex DocumentModel::addVector( double dx, double dy, double dz ) +{ + //std::cout << "DocumentModel::addVector" << std::endl; + QModelIndex vectorIndex; + + HEXA_NS::Vector* hv = _hexaDocument->addVector(dx, dy, dz); + + if ( hv->isValid() ){ + //std::cout << "hv->isValid()" << std::endl; + VectorItem* v = new VectorItem(hv); + _vectorDirItem->appendRow(v); + vectorIndex = v->index(); +// QStandardItem *toto = new QStandardItem("Toto"); +// std::cout << "before" << std::endl; +// _vectorDirItem->appendRow(toto); +// std::cout << "after" << std::endl; +// vectorIndex = toto->index(); + QString tmp = "/tmp/addVector.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + + } else { + //std::cout << "delete hv" << std::endl; + delete hv; + } + + return vectorIndex; +} + +QModelIndex DocumentModel::addVectorVertices( const QModelIndex &iv0, const QModelIndex &iv1 ) +{ + QModelIndex iVec; + + HEXA_NS::Vertex* hv0 = data(iv0, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv1 = data(iv1, HEXA_DATA_ROLE).value(); + + HEXA_NS::Vector* hvec = _hexaDocument->addVectorVertices( hv0, hv1 ); + + if ( hvec->isValid() ){ + VectorItem* vec = new VectorItem(hvec); + _vectorDirItem->appendRow(vec); + iVec = vec->index(); + QString tmp = "/tmp/addVectorVertices.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hvec; + } + + return iVec; +} + +QModelIndex DocumentModel::addCylinder( const QModelIndex &iv, const QModelIndex &ivec, double r, double h ) +{ + QModelIndex iCyl; + + HEXA_NS::Vertex* hv = data(iv, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvec = data(ivec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Cylinder* hcyl = _hexaDocument->addCylinder( hv, hvec, r, h ); + + if ( hcyl->isValid() ){ + CylinderItem* cyl = new CylinderItem(hcyl); + _cylinderDirItem->appendRow(cyl); + iCyl = cyl->index(); + QString tmp = "/tmp/addCylinder.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hcyl; + } + + return iCyl; +} + +QModelIndex DocumentModel::addPipe( const QModelIndex &iv, const QModelIndex &ivec, double ri, double re, double h ) +{ + QModelIndex iPipe; + + HEXA_NS::Vertex* hv = data(iv, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvec = data(ivec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Pipe* hPipe = _hexaDocument->addPipe( hv, hvec, ri, re, h ); + + if ( hPipe->isValid() ){ + PipeItem* pipe = new PipeItem(hPipe); + _pipeDirItem->appendRow(pipe); + iPipe = pipe->index(); + QString tmp = "/tmp/addPipe.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hPipe; + } + + return iPipe; +} + +QModelIndex DocumentModel::makeCartesian( const QModelIndex& i_pt, + const QModelIndex& i_vec_x, const QModelIndex& i_vec_y, const QModelIndex& i_vec_z, + long nx, long ny, long nz) +{ + QModelIndex eltsIndex; + //std::cout<<"makeCartesian begin"<(); + HEXA_NS::Vector* hvec_x = data(i_vec_x, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvec_y = data(i_vec_y, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvec_z = data(i_vec_z, HEXA_DATA_ROLE).value(); + + //std::cout<<"hpt "<makeCartesian( hpt, + hvec_x, hvec_y, hvec_z, + nx, ny, nz ); + + if ( new_helts->isValid() ){ + //std::cout<<"makeCartesian OK!!!"<appendRow(eltsItem); + eltsIndex = eltsItem->index(); + QString tmp = "/tmp/makeCartesian1.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + //std::cout<<"makeCartesian KO!!!"<(); + HEXA_NS::Vector* hVec = data(ivec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->makeCartesian( hVex, + hVec, + nx, ny, nz ); + if ( hElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/makeCartesian2.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + + return iElts; +} + +// Elements makeCylindrical( in Vertex pt, +// in Vector vex, in Vector vez, +// in double dr, in double da, in double dl, +// in long nr, in long na, in long nl, +// in boolean fill ) +// raises (SALOME::SALOME_Exception); +QModelIndex DocumentModel::makeCylindrical( const QModelIndex& i_pt, + const QModelIndex& i_vec_x, const QModelIndex& i_vec_z, + double dr, double da, double dl, + long nr, long na, long nl, + bool fill ) +{ + + QModelIndex eltsIndex; + + HEXA_NS::Vertex* hpt = data(i_pt, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvec_x = data(i_vec_x, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvec_z = data(i_vec_z, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* new_helts = _hexaDocument->makeCylindrical( hpt, hvec_x, hvec_z, dr, da, dl, nr, na, nl, fill ); + + if ( new_helts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* eltsItem = new ElementsItem(new_helts); + _elementsDirItem->appendRow(eltsItem); + eltsIndex = eltsItem->index(); + QString tmp = "/tmp/makeCylindrical.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete new_helts; + } + + return eltsIndex; +} + +QModelIndex DocumentModel::makeCylindricals( + const QModelIndex& icenter, const QModelIndex& ibase, const QModelIndex& iheight, + QList< double> radius, QList angles, QList heights, + bool fill ) //HEXA3 +{ + QModelIndex eltsIndex; + + HEXA_NS::Vertex* hcenter = data( icenter, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hbase = data( ibase, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hheight = data( iheight, HEXA_DATA_ROLE).value(); + +// HEXA_NS::Elements* helts; + std::vector r = radius.toVector().toStdVector(); + std::vector a = angles.toVector().toStdVector(); + std::vector h = heights.toVector().toStdVector(); + + HEXA_NS::Elements* helts = _hexaDocument->makeCylindricals( + hcenter, hbase, hheight, + r, a, h, + fill ); + +// HEXA_NS::Elements* helts = _hexaDocument->makeCylindricals( +// hcenter, hbase, hheight, +// radius.toVector().toStdVector(), angles.toVector().toStdVector(), heights.toVector().toStdVector(), +// fill ); + + if ( helts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* eltsItem = new ElementsItem(helts); + _elementsDirItem->appendRow(eltsItem); + eltsIndex = eltsItem->index(); + } else { + delete helts; + } + + return eltsIndex; +} + +QModelIndex DocumentModel::makeSpherical( const QModelIndex& iv, const QModelIndex& ivec, int nb, double k) +{ + QModelIndex iElts; + + HEXA_NS::Vertex* hv = data(iv, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvec = data(ivec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->makeSpherical( hv, hvec, nb, k ); + + if ( hElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/makeSpherical.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + + return iElts; +} + +QModelIndex DocumentModel::makeSpherical( const QModelIndex& icenter, double radius, int nb, double k ) +{ + QModelIndex iElts; + + HEXA_NS::Vertex* hcenter = data(icenter, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* helts = _hexaDocument->makeSpherical( hcenter, radius, nb, k ); + + if ( helts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* eltsItem = new ElementsItem(helts); + _elementsDirItem->appendRow(eltsItem); + iElts = eltsItem->index(); +// QString tmp = "/tmp/makeSpherical.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete helts; + } + + return iElts; +} + +QModelIndex DocumentModel::makeCylinder( const QModelIndex& icyl, const QModelIndex& ivec, + int nr, int na, int nl ) +{ + QModelIndex iElts; + + HEXA_NS::Cylinder* hcyl = data(icyl, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvec = data(ivec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->makeCylinder( hcyl, hvec, nr, na, nl ); + if ( hElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/makeCylinder.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + + return iElts; +} + +QModelIndex DocumentModel::makePipe( const QModelIndex& ipipe, const QModelIndex& ivecx, + int nr, int na, int nl ) +{ + QModelIndex iElts; + + HEXA_NS::Pipe* hPipe = data(ipipe, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hVecx = data(ivecx, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->makePipe( hPipe, hVecx, nr, na, nl ); + + if ( hElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/makePipe.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + + return iElts; +} + +QModelIndex DocumentModel::makeCylinders(const QModelIndex& icyl1, const QModelIndex& icyl2) +{ //CS_TODO + QModelIndex iCrossElts; + + HEXA_NS::Cylinder* hCyl1 = data(icyl1, HEXA_DATA_ROLE).value(); + HEXA_NS::Cylinder* hCyl2 = data(icyl2, HEXA_DATA_ROLE).value(); + + HEXA_NS::CrossElements* hCrossElts = _hexaDocument->makeCylinders( hCyl1, hCyl2 ); + + if ( hCrossElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* crossElts = new ElementsItem(hCrossElts); + _crossElementsDirItem->appendRow(crossElts); + iCrossElts = crossElts->index(); + QString tmp = "/tmp/makeCylinders.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hCrossElts; + } + + return iCrossElts; +} + +// +QModelIndex DocumentModel::makePipes( const QModelIndex& ipipe1, const QModelIndex& ipipe2 ) +{ + QModelIndex iCrossElts; + + HEXA_NS::Pipe* hPipe1 = data(ipipe1, HEXA_DATA_ROLE).value(); + HEXA_NS::Pipe* hPipe2 = data(ipipe2, HEXA_DATA_ROLE).value(); + + +// MESSAGE("DocumentModel::makePipes( "<< ipipe1.data().toString().toStdString() << ","<< ipipe2.data().toString().toStdString() ); +// +// HEXA_NS::Vertex* b1 = hPipe1->getBase(); +// HEXA_NS::Vector* d1 = hPipe1->getDirection(); +// MESSAGE("pipe1 vertex is " << b1->getName() +// <<"("<< b1->getX() +// <<","<< b1->getY() +// <<","<< b1->getZ()<<")" +// ); +// MESSAGE("pipe1 vector is " << d1->getName() +// <<"("<< d1->getDx() +// <<","<< d1->getDy() +// <<","<< d1->getDz()<<")" +// ); +// MESSAGE("pipe1 ir is " << hPipe1->getInternalRadius()); +// MESSAGE("pipe1 er is " << hPipe1->getRadius()); +// MESSAGE("pipe1 h is " << hPipe1->getHeight()); +// +// +// HEXA_NS::Vertex* b2 = hPipe2->getBase(); +// HEXA_NS::Vector* d2 = hPipe2->getDirection(); +// MESSAGE("pipe2 vertex is " << b2->getName() +// <<"("<< b2->getX() +// <<","<< b2->getY() +// <<","<< b2->getZ()<<")" +// ); +// MESSAGE("pipe2 vector is " << d2->getName() +// <<"("<< d2->getDx() +// <<","<< d2->getDy() +// <<","<< d2->getDz()<<")" +// ); +// MESSAGE("pipe2 vertex is " << hPipe2->getBase()->getName() ); +// MESSAGE("pipe2 vector is " << hPipe2->getDirection()->getName()); +// MESSAGE("pipe2 ir is " << hPipe2->getInternalRadius()); +// MESSAGE("pipe2 er is " << hPipe2->getRadius()); +// MESSAGE("pipe2 h is " << hPipe2->getHeight()); + + + + HEXA_NS::CrossElements* hCrossElts = _hexaDocument->makePipes( hPipe1, hPipe2 ); + + if ( hCrossElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* crossElts = new ElementsItem(hCrossElts); + _crossElementsDirItem->appendRow(crossElts); + iCrossElts = crossElts->index(); + QString tmp = "/tmp/makePipes.vtk"; + _hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hCrossElts; + } + + return iCrossElts; +} + +QModelIndex DocumentModel::makeRind( const QModelIndex& icenter, + const QModelIndex& ivecx, const QModelIndex& ivecz, + double radext, double radint, double radhole, + const QModelIndex& iplorig, + int nrad, int nang, int nhaut ) +{ + QModelIndex iElts; + + HEXA_NS::Vertex* hcenter = data(icenter, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvecx = data(ivecx, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvecz = data(ivecz, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hplorig = data(iplorig, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->makeRind( hcenter, + hvecx, hvecz, + radext, radint, radhole, + hplorig, + nrad, nang, nhaut ); + + if ( hElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* eltsItem = new ElementsItem(hElts); + _elementsDirItem->appendRow(eltsItem); + iElts = eltsItem->index(); + } else { + delete hElts; + } + + return iElts; +} + +QModelIndex DocumentModel::makePartRind( const QModelIndex& icenter, + const QModelIndex& ivecx, const QModelIndex& ivecz, + double radext, double radint, double radhole, + const QModelIndex& iplorig, double angle, + int nrad, int nang, int nhaut ) +{ + QModelIndex iElts; + + HEXA_NS::Vertex* hcenter = data(icenter, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvecx = data(ivecx, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvecz = data(ivecz, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hplorig = data(iplorig, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->makePartRind( hcenter, + hvecx, hvecz, + radext, radint, radhole, + hplorig, angle, + nrad, nang, nhaut ); + + if ( hElts->isValid() ){ + updateData(); + ElementsItem* eltsItem = new ElementsItem(hElts); + _elementsDirItem->appendRow(eltsItem); + iElts = eltsItem->index(); + } else { + delete hElts; + } + + return iElts; +} + +QModelIndex DocumentModel::makeSphere( const QModelIndex& icenter, + const QModelIndex& ivecx, const QModelIndex& ivecz, + double radius, double radhole, + const QModelIndex& iplorig, + int nrad, int nang, int nhaut ) +{ + QModelIndex iElts; + + HEXA_NS::Vertex* hcenter = data(icenter, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvecx = data(ivecx, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvecz = data(ivecz, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hplorig = data(iplorig, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->makeSphere( hcenter, + hvecx, hvecz, + radius, radhole, + hplorig, + nrad, nang, nhaut); + + if ( hElts->isValid() ){ + updateData(); + ElementsItem* eltsItem = new ElementsItem(hElts); + _elementsDirItem->appendRow(eltsItem); + iElts = eltsItem->index(); + } else { + delete hElts; + } + + return iElts; +} + +QModelIndex DocumentModel::makePartSphere( const QModelIndex& icenter, + const QModelIndex& ivecx, const QModelIndex& ivecz, + double radius, double radhole, + const QModelIndex& iplorig, double angle, + int nrad, int nang, int nhaut ) +{ + QModelIndex iElts; + + HEXA_NS::Vertex* hcenter = data(icenter, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvecx = data(ivecx, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hvecz = data(ivecz, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hplorig = data(iplorig, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->makePartSphere( hcenter, + hvecx, hvecz, + radius, radhole, + hplorig, angle, + nrad, nang, nhaut); + + if ( hElts->isValid() ){ + updateData(); + ElementsItem* eltsItem = new ElementsItem(hElts); + _elementsDirItem->appendRow(eltsItem); + iElts = eltsItem->index(); + } else { + delete hElts; + } + + return iElts; +} + +// ************ EDIT HEXABLOCK MODEL ************ + +bool DocumentModel::updateVertex( const QModelIndex& ivertex, double x, double y, double z ) +{ + bool ret = false; + +// cout << "DocumentModel::updateVertex" << ivertex.data().toString().toStdString() << endl; +// cout << "DocumentModel::updateVertex" << ivertex.data(HEXA_DATA_ROLE).value() << endl; +// cout << "DocumentModel::updateVertex" << ivertex.data(HEXA_TREE_ROLE).toString().toStdString() << endl; +// cout << "DocumentModel::updateVertex" << ivertex.data(HEXA_DOC_ENTRY_ROLE).toString().toStdString() << endl; + +// HEXA_NS::Vertex* hVertex = data(ivertex, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVertex = ivertex.data(HEXA_DATA_ROLE).value(); //CS_TODO? pareil pour toutes les autres méthodes du modèle? + + cout << "DocumentModel::updateVertex hVertex = " << hVertex << endl; + if ( hVertex ){ +// hVertex->setName( name.toStdString() ); + hVertex->setX ( x ); + hVertex->setY ( y ); + hVertex->setZ ( z ); + emit patternDataChanged(); + ret = true; + } + + return ret; +} + +bool DocumentModel::removeHexa( const QModelIndex& ihexa ) +{ + bool ret = false; + HEXA_NS::Hexa* hHexa = data(ihexa, HEXA_DATA_ROLE).value(); + + int r = _hexaDocument->removeHexa( hHexa ); + if ( r == HOK ){ + updateData(); + QString tmp = "/tmp/removeHexa.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + ret = true; + } else if ( r == HERR ){ + ret = false; + } + + return ret; +} + +bool DocumentModel::removeConnectedHexa( const QModelIndex& ihexa ) +{ + bool ret = false; + HEXA_NS::Hexa* hHexa = data(ihexa, HEXA_DATA_ROLE).value(); + + int r = _hexaDocument->removeConnectedHexa( hHexa ); + + if ( r == HOK ){ + updateData(); + QString tmp = "/tmp/removeConnectedHexa.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + ret = true; + } else if ( r == HERR ){ + ret = false; + } + + return ret; +} + +QModelIndex DocumentModel::prismQuad( const QModelIndex& iquad, const QModelIndex& ivec, int nb) +{ + QModelIndex iElts; + + HEXA_NS::Quad* hQuad = data(iquad, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hVect = data(ivec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->prismQuad( hQuad, hVect, nb ); + + if ( hElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/prismQuad.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + + return iElts; +} + +QModelIndex DocumentModel::prismQuads( const QModelIndexList& iquads, const QModelIndex& ivec, int nb) +{ + QModelIndex iElts; + + HEXA_NS::Quads hQuads; + HEXA_NS::Quad* hQuad = NULL; + foreach( const QModelIndex& iquad, iquads ){ + hQuad = data( iquad, HEXA_DATA_ROLE ).value(); + hQuads.push_back( hQuad ); + } + HEXA_NS::Vector* hVect = data(ivec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->prismQuads( hQuads, hVect, nb ); + if ( hElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/prismQuads.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + return iElts; +} + +// +QModelIndex DocumentModel::joinQuad( + const QModelIndex& iquadstart, const QModelIndex& iquaddest, + const QModelIndex& iv0, const QModelIndex& iv1, + const QModelIndex& iv2, const QModelIndex& iv3, + int nb ) +{ + QModelIndex iElts; + + HEXA_NS::Quad* hQuadStart = data(iquadstart, HEXA_DATA_ROLE).value(); + HEXA_NS::Quad* hQuadDest = data(iquaddest, HEXA_DATA_ROLE).value(); + + HEXA_NS::Vertex* hVertex0 = data(iv0, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVertex1 = data(iv1, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVertex2 = data(iv2, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVertex3 = data(iv3, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->joinQuad( hQuadStart, hQuadDest, + hVertex0, hVertex1, hVertex2, hVertex3, nb ); + + if ( hElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/joinQuad.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + + return iElts; +} + +QModelIndex DocumentModel::joinQuads( + const QModelIndexList& iquadsstart, const QModelIndex& iquaddest, + const QModelIndex& iv0, const QModelIndex& iv1, + const QModelIndex& iv2, const QModelIndex& iv3, + int nb ) +{ + QModelIndex iElts; + + HEXA_NS::Quad* hQuadStart; + HEXA_NS::Quads hQuadsStart; + + foreach( const QModelIndex& iquad, iquadsstart ){ + hQuadStart = data( iquad, HEXA_DATA_ROLE ).value(); + hQuadsStart.push_back( hQuadStart ); + } + HEXA_NS::Quad* hQuadDest = data( iquaddest, HEXA_DATA_ROLE ).value(); + + HEXA_NS::Vertex* hVertex0 = data(iv0, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVertex1 = data(iv1, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVertex2 = data(iv2, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVertex3 = data(iv3, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->joinQuads( + hQuadsStart, hQuadDest, + hVertex0, hVertex1, hVertex2, hVertex3, + nb ); + + if ( hElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/joinQuads.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + + return iElts; +} + +bool DocumentModel::mergeVertices( const QModelIndex &iv0, const QModelIndex &iv1 ) //CS_TODO : impact sur le model? +{ + bool ret = false; + + HEXA_NS::Vertex* hv0 = data(iv0, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv1 = data(iv1, HEXA_DATA_ROLE).value(); + + int r = _hexaDocument->mergeVertices( hv0, hv1 ); + if ( r == HOK ){ + updateData(); //CS_TODO more or less? + //std::cout << "DocumentModel:: mergeVertices => OK " << std::endl; + QString tmp = "/tmp/mergeVertices.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + ret = true; + } else if ( r == HERR ){ + //std::cout << "DocumentModel:: mergeVertices => KO " << std::endl; + ret = false; + } + + return ret; +} + +bool DocumentModel::mergeEdges( const QModelIndex &ie0, const QModelIndex &ie1, + const QModelIndex &iv0, const QModelIndex &iv1 ) +//CS_TODO : impact sur le model? +{ + bool ret = false; + + HEXA_NS::Edge* he0 = data(ie0, HEXA_DATA_ROLE).value(); + HEXA_NS::Edge* he1 = data(ie1, HEXA_DATA_ROLE).value(); + + HEXA_NS::Vertex* hv0 = data(iv0, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv1 = data(iv1, HEXA_DATA_ROLE).value(); + + int r = _hexaDocument->mergeEdges( he0, he1, hv0, hv1 ); + if ( r == HOK ){ + updateData(); + ret = true; + QString tmp = "/tmp/mergeEdges.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else if ( r == HERR ){ + ret = false; + } + + return ret; +} + +bool DocumentModel::mergeQuads( const QModelIndex& iquad0, const QModelIndex& iquad1, + const QModelIndex& iv0, const QModelIndex& iv1, + const QModelIndex& iv2, const QModelIndex& iv3 ) +{ + bool ret = false; + + HEXA_NS::Quad* hquad0 = data(iquad0, HEXA_DATA_ROLE).value(); + HEXA_NS::Quad* hquad1 = data(iquad1, HEXA_DATA_ROLE).value(); + + HEXA_NS::Vertex* hv0 = data(iv0, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv1 = data(iv1, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv2 = data(iv2, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hv3 = data(iv3, HEXA_DATA_ROLE).value(); + + int r = _hexaDocument->mergeQuads( hquad0, hquad1, hv0, hv1, hv2, hv3 ); + if ( r == HOK ){ + updateData(); + ret = true; + QString tmp = "/tmp/mergeQuads.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else if ( r == HERR ){ + ret = false; + } + + return ret; +} + +// +QModelIndex DocumentModel::disconnectVertex( const QModelIndex& ihexa, const QModelIndex& ivertex ) +{ + QModelIndex iElts; + + HEXA_NS::Hexa* hHexa = data( ihexa, HEXA_DATA_ROLE ).value(); + HEXA_NS::Vertex* hVertex = data( ivertex, HEXA_DATA_ROLE ).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->disconnectVertex( hHexa, hVertex ); + + if ( hElts && hElts->isValid() ){ + updateData(); //CS_TO_CHECK + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/disconnectVertex.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + + return iElts; +} + +QModelIndex DocumentModel::disconnectEdge( const QModelIndex& ihexa, const QModelIndex& iedge ) +{ + QModelIndex iElts; + + HEXA_NS::Hexa* hHexa = data( ihexa, HEXA_DATA_ROLE ).value(); + HEXA_NS::Edge* hEdge = data( iedge, HEXA_DATA_ROLE ).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->disconnectEdge( hHexa, hEdge ); + + if ( hElts->isValid() ){ + updateData(); //CS_TO_CHECK + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/disconnectEdge.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + + return iElts; +} + + +QModelIndex DocumentModel::disconnectEdges( const QModelIndexList& ihexas, const QModelIndexList& iedges ) +{ + QModelIndex iElts; + + HEXA_NS::Hexas hHexas; + HEXA_NS::Edges hEdges; + + //Construction de la liste des edges + HEXA_NS::Edge* hedge = NULL; + foreach( const QModelIndex& iedge, iedges ){ + hedge = data( iedge, HEXA_DATA_ROLE ).value(); + hEdges.push_back( hedge ); + } + + //Construction de la liste des hexas + HEXA_NS::Hexa* hhexa = NULL; + foreach( const QModelIndex& ihexa, ihexas ){ + hhexa = data( ihexa, HEXA_DATA_ROLE ).value(); + hHexas.push_back( hhexa ); + } + + + HEXA_NS::Elements* hElts = _hexaDocument->disconnectEdges( hHexas, hEdges ); + + if ( hElts->isValid() ){ + updateData(); //CS_TO_CHECK + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/disconnectEdges.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + + return iElts; +} + + +QModelIndex DocumentModel::disconnectQuad( const QModelIndex& ihexa, const QModelIndex& iquad ) +{ + QModelIndex iElts; + + HEXA_NS::Hexa* hHexa = data( ihexa, HEXA_DATA_ROLE ).value(); + HEXA_NS::Quad* hQuad = data( iquad, HEXA_DATA_ROLE ).value(); + + HEXA_NS::Elements* hElts = _hexaDocument->disconnectQuad( hHexa, hQuad ); + + if ( hElts->isValid() ){ + updateData(); //CS_TO_CHECK + ElementsItem* elts = new ElementsItem(hElts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/disconnectQuad.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hElts; + } + + return iElts; +} + + +QModelIndex DocumentModel::cutEdge( const QModelIndex &i_e0, int nbcuts ) +//CS_TODO : impact sur le model? +{ + QModelIndex iElts; + + HEXA_NS::Edge* he0 = data(i_e0, HEXA_DATA_ROLE).value(); + HEXA_NS::Elements* helts = _hexaDocument->cut( he0, nbcuts ); + + if ( helts->isValid() ){ + updateData(); //CS_TODO more? + ElementsItem* elts = new ElementsItem(helts); + _elementsDirItem->appendRow(elts); + iElts = elts->index(); + QString tmp = "/tmp/cutEdge.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete helts; + } + + return iElts; +} + + + + +// Elements makeTranslation( in Elements l, in Vector vec ) +// raises (SALOME::SALOME_Exception); +QModelIndex DocumentModel::makeTranslation( const QModelIndex& ielts, const QModelIndex& ivec ) +{ + QModelIndex iElts; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hVec = data(ivec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hNewElts = _hexaDocument->makeTranslation( hElts, hVec ); + + if ( hNewElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* eltsItem = new ElementsItem(hNewElts); + _elementsDirItem->appendRow(eltsItem); + iElts = eltsItem->index(); + QString tmp = "/tmp/makeTranslation.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hNewElts; + } + + return iElts; +} + + + +QModelIndex DocumentModel::makeScale( const QModelIndex& ielts, const QModelIndex& ivex, double k ) +{ + QModelIndex iElts; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVex = data(ivex, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hNewElts = _hexaDocument->makeScale( hElts, hVex, k ); + + if ( hNewElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* eltsItem = new ElementsItem(hNewElts); + _elementsDirItem->appendRow(eltsItem); + iElts = eltsItem->index(); + QString tmp = "/tmp/makeScale.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hNewElts; + } + + return iElts; +} + + + +QModelIndex DocumentModel::makeRotation( const QModelIndex& ielts, + const QModelIndex& iv, + const QModelIndex& ivec, double angle ) +{ + QModelIndex iElts; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVex = data(iv, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hVec = data(ivec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hNewElts = _hexaDocument->makeRotation( hElts, hVex, hVec, angle ); + + if ( hNewElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* eltsItem = new ElementsItem(hNewElts); + _elementsDirItem->appendRow(eltsItem); + iElts = eltsItem->index(); + QString tmp = "/tmp/makeRotation.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hNewElts; + } + + return iElts; +} + + +QModelIndex DocumentModel::makeSymmetryPoint( const QModelIndex& ielts, const QModelIndex& iv ) +{ + QModelIndex iElts; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVex = data(iv, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryPoint (hElts, hVex); + + if ( hNewElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* eltsItem = new ElementsItem(hNewElts); + _elementsDirItem->appendRow(eltsItem); + iElts = eltsItem->index(); + QString tmp = "/tmp/makeSymmetryPoint.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hNewElts; + } + + return iElts; +} + + +QModelIndex DocumentModel::makeSymmetryLine( const QModelIndex& ielts, + const QModelIndex& iv, + const QModelIndex& ivec ) +{ + QModelIndex iElts; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVex = data(iv, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hVec = data(ivec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryLine( hElts, hVex, hVec ); + + if ( hNewElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* eltsItem = new ElementsItem(hNewElts); + _elementsDirItem->appendRow(eltsItem); + iElts = eltsItem->index(); + QString tmp = "/tmp/makeSymmetryLine.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hNewElts; + } + + return iElts; +} + + +QModelIndex DocumentModel::makeSymmetryPlane( const QModelIndex& ielts, const QModelIndex& iv, const QModelIndex& ivec ) +{ + QModelIndex iElts; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVex = data(iv, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hVec = data(ivec, HEXA_DATA_ROLE).value(); + + HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryPlane( hElts, hVex, hVec ); + + if ( hNewElts->isValid() ){ + updateData(); //CS_TODO more or less? + ElementsItem* eltsItem = new ElementsItem(hNewElts); + _elementsDirItem->appendRow(eltsItem); + iElts = eltsItem->index(); + QString tmp = "/tmp/makeSymmetryPlane.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else { + delete hNewElts; + } + + return iElts; +} + + +bool DocumentModel::performTranslation( const QModelIndex& ielts, const QModelIndex& ivec ) +{ + bool ret = false; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hVec = data(ivec, HEXA_DATA_ROLE).value(); + + int r = _hexaDocument->performTranslation (hElts, hVec); + if ( r == HOK ){ + updateData(); + ret = true; + QString tmp = "/tmp/performTranslation.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else if ( r == HERR ){ + ret = false; + } + + return ret; +} + + +// +bool DocumentModel::performScale( const QModelIndex& ielts, const QModelIndex& ivex, double k ) +{ + bool ret = false; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVex = data(ivex, HEXA_DATA_ROLE).value(); + + int r = _hexaDocument->performScale (hElts, hVex, k); + if ( r == HOK ){ + updateData(); + ret = true; + QString tmp = "/tmp/performScale.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else if ( r == HERR ){ + ret = false; + } + + return ret; +} + +// +bool DocumentModel::performRotation( const QModelIndex& ielts, const QModelIndex& ivex, const QModelIndex& ivec, double angle ) +{ + bool ret = false; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVex = data(ivex, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hVec = data(ivec, HEXA_DATA_ROLE).value(); + + int r = _hexaDocument-> performRotation( hElts, hVex, hVec, angle ); + if ( r == HOK ){ + updateData(); + ret = true; + QString tmp = "/tmp/performRotation.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else if ( r == HERR ){ + ret = false; + } + + return ret; +} + + +// +bool DocumentModel::performSymmetryPoint( const QModelIndex& ielts, const QModelIndex& ivex ) +{ + bool ret = false; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVex = data(ivex, HEXA_DATA_ROLE).value(); + + int r = _hexaDocument->performSymmetryPoint( hElts, hVex ); + if ( r == HOK ){ + updateData(); + ret = true; + QString tmp = "/tmp/performSymmetryPoint.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else if ( r == HERR ){ + ret = false; + } + + return ret; +} + + +bool DocumentModel::performSymmetryLine( const QModelIndex& ielts, const QModelIndex& ivex, const QModelIndex& ivec ) +{ + bool ret = false; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVex = data(ivex, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hVec = data(ivec, HEXA_DATA_ROLE).value(); + + int r = _hexaDocument->performSymmetryLine( hElts, hVex, hVec ); + if ( r == HOK ){ + updateData(); + ret = true; + QString tmp = "/tmp/performSymmetryLine.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else if ( r == HERR ){ + ret = false; + } + + return ret; +} + + +bool DocumentModel::performSymmetryPlane( const QModelIndex& ielts, + const QModelIndex& ivex, + const QModelIndex& ivec ) +{ + bool ret = false; + + HEXA_NS::Elements* hElts = data(ielts, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hVex = data(ivex, HEXA_DATA_ROLE).value(); + HEXA_NS::Vector* hVec = data(ivec, HEXA_DATA_ROLE).value(); + + int r = _hexaDocument->performSymmetryPlane( hElts, hVex, hVec ); + if ( r == HOK ){ + updateData(); + ret = true; + QString tmp = "/tmp/performSymmetryPlane.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else if ( r == HERR ){ + ret = false; + } + + return ret; +} + +QModelIndex DocumentModel::revolutionQuads( const QModelIndexList& istartquads, + const QModelIndex& icenter, + const QModelIndex& ivecaxis, + const QList& angles ) +{ + QModelIndex ielts; + + HEXA_NS::Quads hstartquads; + HEXA_NS::Quad* hquad = NULL; + foreach( const QModelIndex& iquad, istartquads){ + hquad = data( iquad, HEXA_DATA_ROLE ).value(); + hstartquads.push_back( hquad ); + } + HEXA_NS::Vertex* hcenter = data( icenter, HEXA_DATA_ROLE ).value(); + HEXA_NS::Vector* haxis = data( ivecaxis, HEXA_DATA_ROLE ).value(); + std::vector hangles = angles.toVector().toStdVector(); + + HEXA_NS::Elements* helts = _hexaDocument->revolutionQuads( hstartquads, hcenter, haxis, hangles ); + + if ( helts && helts->isValid() ){ + updateData(); + ElementsItem* eltsItem = new ElementsItem(helts); + _elementsDirItem->appendRow(eltsItem); + ielts = eltsItem->index(); + } else { + delete helts; + } + + return ielts; +} + +QModelIndex DocumentModel::replace( const QModelIndexList& iquadsPattern, + const QModelIndex& ip1, const QModelIndex& ic1, + const QModelIndex& ip2, const QModelIndex& ic2, + const QModelIndex& ip3, const QModelIndex& ic3 ) +{ + QModelIndex ielts; + + HEXA_NS::Vertex* hp1 = data(ip1, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hc1 = data(ic1, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hp2 = data(ip2, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hc2 = data(ic2, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hp3 = data(ip3, HEXA_DATA_ROLE).value(); + HEXA_NS::Vertex* hc3 = data(ic3, HEXA_DATA_ROLE).value(); + + HEXA_NS::Quads hquads; + HEXA_NS::Quad* hquad = NULL; + foreach( const QModelIndex& iquad, iquadsPattern ){ + hquad = data( iquad, HEXA_DATA_ROLE ).value(); + hquads.push_back( hquad ); + } + + HEXA_NS::Elements* helts = _hexaDocument->replace( hquads, + hp1, hc1, hp2, hc2, hp3, hc3 ); +// HEXA_NS::Elements* helts = NULL; + + if ( helts && helts->isValid() ){ + updateData(); + ElementsItem* eltsItem = new ElementsItem(helts); + _elementsDirItem->appendRow(eltsItem); + ielts = eltsItem->index(); + } else { + delete helts; + } + + return ielts; +} + +// ************ ADD ASSOCIATION ************ +// +void DocumentModel::addAssociation( const QModelIndex& iElt, const DocumentModel::GeomObj& assocIn ) +{ +// assocIn.name; + HEXA_NS::Shape* assoc = new HEXA_NS::Shape( assocIn.brep.toStdString() );//CS_TODO : delete assoc + assoc->debut = assocIn.start; + assoc->fin = assocIn.end; + assoc->ident = ( assocIn.entry + "," + assocIn.subid ).toStdString(); + _assocName[ assocIn.entry ] = assocIn.name; // for getAssociations() + + QString currentAssoc, newAssoc; + + if ( data(iElt, HEXA_TREE_ROLE) == VERTEX_TREE ){ + HEXA_NS::Vertex* hVex = data(iElt, HEXA_DATA_ROLE).value(); + hVex->setAssociation( assoc ); + } else if ( data(iElt, HEXA_TREE_ROLE) == EDGE_TREE ){ + HEXA_NS::Edge* hEdge = data(iElt, HEXA_DATA_ROLE).value(); + hEdge->addAssociation( assoc ); + } else if ( data(iElt, HEXA_TREE_ROLE) == QUAD_TREE ){ + HEXA_NS::Quad* hQuad = data(iElt, HEXA_DATA_ROLE).value(); + hQuad->addAssociation( assoc ); + } + + currentAssoc = data( iElt, HEXA_ASSOC_ENTRY_ROLE ).toString(); + if ( !currentAssoc.isEmpty() ){ + newAssoc = currentAssoc + assocIn.entry + "," + assocIn.subid + ";"; + } else { + newAssoc = assocIn.entry + "," + assocIn.subid + ";"; + } + + //std::cout << "addAssociation() newAssoc =>" << newAssoc.toStdString() << std::endl; + setData( iElt, QVariant::fromValue(newAssoc), HEXA_ASSOC_ENTRY_ROLE ); + + // tree view : +/* + QList assocItems; + QStandardItem *aAssocItem = NULL; + + QStandardItem *item = NULL; + + aAssocItem = new QStandardItem(assocIn.name); + aAssocItem->setData( assocIn.entry + "," + assocIn.subid, HEXA_ENTRY_ROLE ); + + + assocItems << aAssocItem; + item = itemFromIndex(iElt); + item->appendColumn(assocItems); +// appendColumn(assocItems); +// item->appendRow( assocItems ); +// item->appendRow( new QStandardItem(assocIn.name) ); + if ( item->columnCount() > columnCount() ) + setColumnCount( columnCount()+1 ); +*/ +} + + +QList DocumentModel::getAssociations( const QModelIndex& iElt ) +{ + MESSAGE("DocumentModel::getAssociations( "<< iElt.data().toString().toStdString() << " )" ); + QList res; + DocumentModel::GeomObj assoc; + + //std::cout << "getAssociations() start" << std::endl; + if ( data(iElt, HEXA_TREE_ROLE) == VERTEX_TREE ){ + MESSAGE("* of a Vertex"); + HEXA_NS::Vertex* hVex = data(iElt, HEXA_DATA_ROLE).value(); + HEXA_NS::Shape* hShape = hVex->getAssociation(); + QStringList shapeID; + if ( hShape != NULL ){ + assoc.entry = ""; + assoc.subid = QString::number(-1); + assoc.name = ""; + assoc.brep = hShape->getBrep().c_str(); + assoc.start = hShape->debut; + assoc.end = hShape->fin; + + shapeID = QString( hShape->ident.c_str() ).split(","); + if ( shapeID.count() == 2 ){ + assoc.entry = shapeID[0]; + assoc.subid = shapeID[1].isEmpty()? QString::number(-1) : shapeID[1]; + assoc.name = _assocName[assoc.entry]; + } + MESSAGE("* assoc.entry" << assoc.entry.toStdString() ); + MESSAGE("* assoc.subid" << assoc.subid.toStdString() ); + MESSAGE("* -----------" ); + res << assoc; + } + } else if ( data(iElt, HEXA_TREE_ROLE) == EDGE_TREE ){ + MESSAGE("* of an Edge"); + HEXA_NS::Edge* hEdge = data(iElt, HEXA_DATA_ROLE).value(); + HEXA_NS::Shapes hShapes = hEdge->getAssociations(); + QStringList shapeID; + for ( HEXA_NS::Shapes::iterator it = hShapes.begin(); it != hShapes.end(); ++it){ + assoc.entry = ""; + assoc.subid = QString::number(-1); + assoc.name = ""; + assoc.brep = (*it)->getBrep().c_str(); + assoc.start = (*it)->debut; + assoc.end = (*it)->fin; + + MESSAGE("* assoc.ident " << (*it)->ident ); + shapeID = QString( (*it)->ident.c_str() ).split(","); + if ( shapeID.count() == 2 ){ + assoc.entry = shapeID[0]; + assoc.subid = shapeID[1].isEmpty()? QString::number(-1) : shapeID[1]; + assoc.name = _assocName[assoc.entry]; + } + MESSAGE("* assoc.entry" << assoc.entry.toStdString() ); + MESSAGE("* assoc.subid" << assoc.subid.toStdString() ); + MESSAGE("* assoc.brep" << assoc.brep.toStdString() ); + MESSAGE("* assoc.start" << assoc.start ); + MESSAGE("* assoc.end" << assoc.end ); + MESSAGE("* -----------" ); + res << assoc; + } + } else if ( data(iElt, HEXA_TREE_ROLE) == QUAD_TREE ){ + MESSAGE("* of a Quad"); + HEXA_NS::Quad* hQuad = data(iElt, HEXA_DATA_ROLE).value(); + HEXA_NS::Shapes hShapes = hQuad->getAssociations(); + QStringList shapeID; + for ( HEXA_NS::Shapes::iterator it = hShapes.begin(); it != hShapes.end(); ++it){ + assoc.entry = ""; + assoc.subid = QString::number(-1); + assoc.name = ""; + assoc.brep = (*it)->getBrep().c_str(); + assoc.start = (*it)->debut; + assoc.end = (*it)->fin; + MESSAGE("* assoc.entry" << assoc.entry.toStdString() ); + MESSAGE("* assoc.subid" << assoc.subid.toStdString() ); +// MESSAGE("* assoc.brep" << assoc.brep.toStdString() ); +// MESSAGE("* assoc.start" << assoc.start ); +// MESSAGE("* assoc.end" << assoc.end ); + MESSAGE("* -----------" ); + shapeID = QString( (*it)->ident.c_str() ).split(","); + if ( shapeID.count() == 2 ){ + assoc.entry = shapeID[0]; + assoc.subid = shapeID[1].isEmpty()? QString::number(-1) : shapeID[1]; + assoc.name = _assocName[assoc.entry]; + } + + res << assoc; + } + } + + MESSAGE("}" ); + return res; +} + +// int associateOpenedLine (Edge* mstart, Edges& mline, Shape* gstart, +// double pstart, Shapes& gline, double pend); +// int associateClosedLine (Vertex* mfirst, Edge* mstart, Edges& mline, +// Shape* gstart, double pstart, Shapes& gline); +bool DocumentModel::associateOpenedLine( const QModelIndexList& iedges, + const GeomObjList& assocs, + double pstart, + double pend ) +{ + MESSAGE("DocumentModel::associateOpenedLine() "); + bool ret = false; + HEXA_NS::Edge* mstart = NULL; + HEXA_NS::Edges mline; + HEXA_NS::Shape* gstart = NULL; +// double pstart; + HEXA_NS::Shapes gline; +// double pend; + + HEXA_NS::Edge* hedge = NULL; + foreach( const QModelIndex& iedge, iedges ){ + hedge = data( iedge, HEXA_DATA_ROLE ).value(); + if ( mstart == NULL ){ + mstart = hedge; + MESSAGE("* mstart" << iedge.data().toString().toStdString() ); + } else { + mline.push_back( hedge ); + MESSAGE("* mline :" << iedge.data().toString().toStdString() ); + } + } + + HEXA_NS::Shape* hshape = NULL; + foreach( const GeomObj& anAssoc, assocs ){ + hshape = new HEXA_NS::Shape( anAssoc.brep.toStdString() ); + hshape->debut = anAssoc.start; //0.; + hshape->fin = anAssoc.end; //1.; + hshape->ident = ( anAssoc.entry + "," + anAssoc.subid ).toStdString(); //anAssoc.entry.toStdString(); + + if ( gstart == NULL ){ + gstart = hshape; // CS_TODO :gstart.debut = pstart ?? + MESSAGE("* gstart->debut" << gstart->debut); + MESSAGE("* gstart->fin" << gstart->fin); + MESSAGE("* gstart->ident" << gstart->ident); + MESSAGE("* gstart->getBrep()" << gstart->getBrep()); +// pstart = anAssoc.start; + } else { + gline.push_back( hshape ); //CS_TODO : hshape.fin = pend ?? + MESSAGE("* gline->debut" << hshape->debut); + MESSAGE("* gline->fin" << hshape->fin); + MESSAGE("* gline->ident" << hshape->ident); + MESSAGE("* gline->getBrep()" << hshape->getBrep()); + } + } +// pend = assocs.last().end; + MESSAGE("* pstart" << pstart ); + MESSAGE("* pend" << pend ); + + int r = _hexaDocument->associateOpenedLine( mstart, mline, + gstart, pstart, gline, pend ); +// HEXA_NS::Edge *e0 = _hexaDocument->getEdge(0); +// HEXA_NS::Edge *e1 = _hexaDocument->getEdge(1); +// HEXA_NS::Shapes mstartAssoc = e0->getAssociations(); +// HEXA_NS::Shapes mlineAssoc = e1->getAssociations(); +// HEXA_NS::Shapes mstartAssoc = mstart->getAssociations(); +// HEXA_NS::Shapes mlineAssoc= mline[0]->getAssociations(); +// std::cout << "DocumentModel:: associateOpenedLine : mstartAssoc.size() => " << mstartAssoc.size() << std::endl; +// std::cout << "DocumentModel:: associateOpenedLine : mstartAssoc[0]->ident=> " << mstartAssoc[0]->ident << std::endl; +// std::cout << "DocumentModel:: associateOpenedLine : mlineAssoc[0]->ident => " << mlineAssoc[0]->ident << std::endl; + + if ( r == HOK ){ + updateData(); + MESSAGE("* DocumentModel:: associateOpenedLine() => OK "); + ret = true; + } else if ( r == HERR ){ + MESSAGE("* DocumentModel:: associateOpenedLine() => ERR "); + ret = false; + } + delete gstart; //CS_TODO : delete gline? + return ret; +} + +bool DocumentModel::associateClosedLine( const QModelIndex& ivertex, + const QModelIndexList& iedges, + const GeomObjList& assocs, + double pstart, + bool inv ) +{ + MESSAGE("DocumentModel::associateClosedLine() "); + bool ret = false; + HEXA_NS::Vertex* mfirst = data( ivertex, HEXA_DATA_ROLE ).value(); + HEXA_NS::Edge* mstart = NULL; + HEXA_NS::Edges mline; + HEXA_NS::Shape* gstart = NULL; +// double pstart; + HEXA_NS::Shapes gline; + + + HEXA_NS::Edge* hedge = NULL; + foreach( const QModelIndex& iedge, iedges ){ + hedge = data( iedge, HEXA_DATA_ROLE ).value(); + if ( mstart == NULL ){ + mstart = hedge; + MESSAGE("* mstart" << iedge.data().toString().toStdString() ); + } else { + mline.push_back( hedge ); + MESSAGE("* mline :" << iedge.data().toString().toStdString() ); + } + } + + HEXA_NS::Shape* hshape = NULL; + foreach( const GeomObj& anAssoc, assocs ){ + hshape = new HEXA_NS::Shape( anAssoc.brep.toStdString() ); + hshape->debut = anAssoc.start; //0.; + hshape->fin = anAssoc.end; //1.; + hshape->ident = ( anAssoc.entry + "," + anAssoc.subid ).toStdString();//anAssoc.entry.toStdString(); + + if ( gstart == NULL ){ + gstart = hshape; // CS_TODO :gstart.debut = pstart ?? +// pstart = anAssoc.start; + MESSAGE("* gstart->debut" << gstart->debut); + MESSAGE("* gstart->fin" << gstart->fin); + MESSAGE("* gstart->ident" << gstart->ident); + MESSAGE("* gstart->getBrep()" << gstart->getBrep()); + } else { + gline.push_back( hshape ); //CS_TODO : hshape.fin = pend ?? + MESSAGE("* gline->debut" << hshape->debut); + MESSAGE("* gline->fin" << hshape->fin); + MESSAGE("* gline->ident" << hshape->ident); + MESSAGE("* gline->getBrep()" << hshape->getBrep()); + } + } + MESSAGE("* pstart" << pstart ); + + int r = _hexaDocument->associateClosedLine( mfirst, mstart, mline, + gstart, pstart, inv, gline ); + if ( r == HOK ){ + updateData(); + //std::cout << "DocumentModel:: associateClosedLine => OK " << std::endl; + ret = true; + } else if ( r == HERR ){ + //std::cout << "DocumentModel:: associateClosedLine => ERR " << std::endl; + ret = false; + } + return ret; +} + +// ************ GROUPS ************ +// +QModelIndex DocumentModel::addGroup( const QString& name, Group kind ) +{ + QModelIndex iGroup; + + HEXA_NS::Group* hGroup = _hexaDocument->addGroup( name.toLocal8Bit().constData(), kind ); + + GroupItem* groupItem = new GroupItem(hGroup); + groupItem->setData( _entry, HEXA_DOC_ENTRY_ROLE ); + _groupDirItem->appendRow(groupItem); + iGroup = groupItem->index(); + QString tmp = "/tmp/addGroup.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + + return iGroup; +} + +// +bool DocumentModel::removeGroup( const QModelIndex& igrp ) +{ + bool ret = false; + + HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value(); + int r = _hexaDocument->removeGroup ( hGroup ); + + if ( r == HOK ){ + removeRow( igrp.row(), igrp.parent()); + ret = true; + QString tmp = "/tmp/removeGroup.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else if ( r == HERR ){ + ret = false; + } + return ret; +} + +QModelIndexList DocumentModel::getGroupElements( const QModelIndex& iGroup, DocumentModel::Group& kind ) const +{ + QModelIndexList iElements; + + HEXA_NS::Group* g = iGroup.data(HEXA_DATA_ROLE).value(); + if ( !g ) return iElements; + + QModelIndexList iFound; + QVariant q; + HEXA_NS::EltBase* eltBase = NULL; + for ( int nr = 0; nr < g->countElement(); ++nr ){ + eltBase = g->getElement( nr ); + //std::cout<< "eltBase"<< eltBase << std::endl; + kind = g->getKind(); + switch ( kind ){ + case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: q = QVariant::fromValue( (HEXA_NS::Hexa *)eltBase ); break; + case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: q = QVariant::fromValue( (HEXA_NS::Quad *)eltBase ); break; + case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: q = QVariant::fromValue( (HEXA_NS::Edge *)eltBase ); break; + case HEXA_NS::VertexNode: q = QVariant::fromValue( (HEXA_NS::Vertex *)eltBase ); break; + } + iFound = match( index(0, 0), + HEXA_DATA_ROLE, + q, + 1, + Qt::MatchRecursive ); + if ( !iFound.isEmpty() ) + iElements << iFound[0]; + } + return iElements; +} + +// 7.4 Boite: éditer un groupe +void DocumentModel::setGroupName( const QModelIndex& igrp, const QString& name ) +{ + HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value(); + + if ( hGroup ){ + hGroup->setName( name.toLocal8Bit().constData() ); + setData(igrp, QVariant::fromValue( name ) ); + } + + QString tmp = "/tmp/setGroupName.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); +} + +bool DocumentModel::addGroupElement( const QModelIndex& igrp, const QModelIndex& ielt ) +{ //CS_TODO : check input? add child? +// int addElement (EltBase* elt); + + bool addOk = false; + HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value(); + HEXA_NS::EltBase* hElt = NULL; + switch ( hGroup->getKind() ){ + case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: hElt = data(ielt, HEXA_DATA_ROLE).value(); break; + case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: hElt = data(ielt, HEXA_DATA_ROLE).value(); break; + case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: hElt = data(ielt, HEXA_DATA_ROLE).value(); break; + case HEXA_NS::VertexNode: hElt = data(ielt, HEXA_DATA_ROLE).value(); break; + } + + //std::cout << "hGroup" << hGroup << std::endl; + //std::cout << "hElt" << hElt << std::endl; + + int res = HERR; + if ( hGroup and hElt ) + res = hGroup->addElement( hElt ); + + if ( res == HOK ) addOk = true; + +// QString tmp = "/tmp/addGroupElement.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + + return addOk; +} + +bool DocumentModel::removeGroupElement( const QModelIndex& igrp, int nro ) +{ //CS_TODO : remove child? + HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value(); + + if ( hGroup ) + hGroup->removeElement( nro ); + + QString tmp = "/tmp/removeGroupElement.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); +} + +bool DocumentModel::clearGroupElement( const QModelIndex& igrp ) +{ + HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value(); + + if ( hGroup ) + hGroup->clearElement(); + + QString tmp = "/tmp/clearGroupElement.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); +} + +// ************ LAWS ************ + +// +QModelIndex DocumentModel::addLaw( const QString& name, int nbnodes ) +{ + QModelIndex iLaw; + + HEXA_NS::Law* hLaw = _hexaDocument->addLaw( name.toLocal8Bit().constData(), nbnodes ); + + LawItem* lawItem = new LawItem(hLaw); + _lawDirItem->appendRow(lawItem); + iLaw = lawItem->index(); + QString tmp = "/tmp/addLaw.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + + return iLaw; +} + +bool DocumentModel::setLaw( const QModelIndex& ilaw, int nbnodes, double coeff, KindLaw type ) +{ + bool ret = false; + + HEXA_NS::Law* hLaw = data(ilaw, HEXA_DATA_ROLE).value(); + + if ( hLaw ){ + int ok; + ok = hLaw->setNodes( nbnodes ); + ( ok == HOK) ? ret = true : ret = false; + ok = hLaw->setCoefficient( coeff ); + hLaw->setKind(type); + } + + QString tmp = "/tmp/setLaw.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + return ret; +} + +// +bool DocumentModel::removeLaw( const QModelIndex& ilaw ) +{ + bool ret = false; + HEXA_NS::Law* hLaw = data(ilaw, HEXA_DATA_ROLE).value(); + int r = _hexaDocument->removeLaw( hLaw ); + + if ( r == HOK ){ + removeRow( ilaw.row(), ilaw.parent()); + ret = true; + QString tmp = "/tmp/removeLaw.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else if ( r == HERR ){ + ret = false; + } + + return ret; +} + +bool DocumentModel::setPropagation( const QModelIndex& iPropagation, const QModelIndex& iLaw, bool way ) +{ + bool ret = false; + HEXA_NS::Propagation* hPropagation = data(iPropagation, HEXA_DATA_ROLE).value(); + HEXA_NS::Law* hLaw = data(iLaw, HEXA_DATA_ROLE).value(); + + int r = hPropagation->setLaw( hLaw ); + hPropagation->setWay( way ); + + if ( r == HOK ){ + ret = true; + QString tmp = "/tmp/setPropagation.vtk"; + //_hexaDocument->saveVtk( tmp.toLocal8Bit().constData() ); + } else if ( r == HERR ){ + ret = false; + } + return ret; +} + +QModelIndexList DocumentModel::getPropagation( const QModelIndex& iPropagation ) const +{ + QModelIndexList iEdges; + + QModelIndexList iFound; + HEXA_NS::Propagation* propa = iPropagation.data(HEXA_DATA_ROLE).value(); + if ( !propa ) return iEdges; + + const HEXA_NS::Edges& edges = propa->getEdges(); + for ( HEXA_NS::Edges::const_iterator anEdge = edges.begin(); + anEdge != edges.end(); + ++anEdge ){ + iFound = match( index(0, 0), + HEXA_DATA_ROLE, + QVariant::fromValue( *anEdge ), + 1, + Qt::MatchRecursive); + if ( !iFound.isEmpty() ) + iEdges << iFound[0]; + } + + return iEdges; +} + +HEXA_NS::Document* DocumentModel::documentImpl() +{ + return _hexaDocument; +} + +QString DocumentModel::documentEntry() +{ + return _entry; +} + +// QModelIndex DocumentModel::indexBy( int role, const QString& value ) +// { +// QModelIndex eltIndex; // element (vertex, edge, quad) of model +// QModelIndexList theIndexes = match( index(0, 0), +// role, +// value, +// 1, +// Qt::MatchRecursive | Qt::MatchContains );//Qt::MatchFixedString ); +// if ( theIndexes.count()>0 ) +// eltIndex = theIndexes[0] ; +// return eltIndex; +// } + + +// 8.3 Boite: éditer une loi CS_TODO +// (idem création) + +/***************************************************************** + PatternDataModel +*****************************************************************/ + +PatternDataModel::PatternDataModel( QObject * parent ) : + QSortFilterProxyModel( parent ) +{ + QString dataRegExp = QString("(%1|%2|%3|%4|%5|%6|%7|%8)"). + arg(VERTEX_TREE).arg(EDGE_TREE).arg(QUAD_TREE).arg(HEXA_TREE). + arg(VERTEX_DIR_TREE).arg(EDGE_DIR_TREE).arg(QUAD_DIR_TREE).arg(HEXA_DIR_TREE); + + setFilterRole(HEXA_TREE_ROLE); + setFilterRegExp ( QRegExp(dataRegExp) ); +} + +PatternDataModel::~PatternDataModel() +{ +} + +HEXA_NS::Document* PatternDataModel::documentImpl() +{ + HEXA_NS::Document* doc = NULL; + DocumentModel *m = dynamic_cast( sourceModel() ); + if (m) doc = m->documentImpl(); + return doc; +} + +QString PatternDataModel::documentEntry() +{ + QString entry; + DocumentModel *m = dynamic_cast( sourceModel() ); + if (m) entry = m->documentEntry(); + return entry; +} + +Qt::ItemFlags PatternDataModel::flags(const QModelIndex &index) const +{ +// MESSAGE("PatternDataModel::flags() "<< index.data().toString().toStdString() ); + Qt::ItemFlags flags; + + DocumentModel *m = dynamic_cast( sourceModel() ); + if ( m != NULL ){ + flags = m->flags( mapToSource(index) ); + } + +// if ( flags == Qt::ItemFlags( ~Qt::ItemIsEditable ) ){ +// MESSAGE("* you can select "<< index.data().toString().toStdString() ); +// } else { +// MESSAGE("* you cannot select "<< index.data().toString().toStdString() ); +// } + +// MESSAGE("}"); + return flags; +} + + +QVariant PatternDataModel::headerData ( int section, Qt::Orientation orientation, int role ) const +{ + if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){ + return QVariant( "Data" ); + } else { + return QSortFilterProxyModel::headerData ( section, orientation, role ); + } +} + +// QModelIndex PatternDataModel::addVertex( double x, double y, double z ) +// { +// QModelIndex vertexIndex; +// DocumentModel *m = dynamic_cast( sourceModel() ); +// if ( m != NULL ){ +// QModelIndex sourceIndex = m->addVertex( x, y, z ); +// vertexIndex = mapFromSource(sourceIndex); +// } +// return vertexIndex; +// } +// +// void PatternDataModel::updateVertex(const QModelIndex& i_v) +// { +// std::cout << "PatternDataModel::updateVertex()" << std::endl; +// VertexItem *item_v = dynamic_cast(itemFromIndex(i_v)); +// DocumentModel *m = dynamic_cast( sourceModel() ); +// +// if (item_v != NULL) +// { +// std::cout << "updateVertex() : OK" << std::endl; +// m->updateView(item_v); +// +// } +// else +// { +// std::cout << "updateVertex() : NOT OK" << std::endl; +// +// } +// } +// +// +// QModelIndex PatternDataModel::addQuad( const QModelIndex &i_v0, const QModelIndex &i_v1, +// const QModelIndex &i_v2, const QModelIndex &i_v3 ) +// { +// QModelIndex quadIndex; +// DocumentModel *m = dynamic_cast( sourceModel() ); +// if ( m != NULL ){ +// QModelIndex sourceIndex = m->addQuad( mapToSource(i_v0), mapToSource(i_v1), +// mapToSource(i_v2), mapToSource(i_v3) ); +// quadIndex = mapFromSource(sourceIndex); +// } +// return quadIndex; +// } +// +// +// +// QModelIndex PatternDataModel::addHexaFromQuad( const QModelIndex &i_q0, const QModelIndex &i_q1, const QModelIndex &i_q2, +// const QModelIndex &i_q3, const QModelIndex &i_q4, const QModelIndex &i_q5 ) +// { +// QModelIndex hexaIndex; +// DocumentModel *m = dynamic_cast( sourceModel() ); +// if ( m != NULL ){ +// QModelIndex sourceIndex = m->addHexaFromQuad( mapToSource(i_q0), mapToSource(i_q1), mapToSource(i_q2), +// mapToSource(i_q3), mapToSource(i_q4), mapToSource(i_q5) ); +// hexaIndex = mapFromSource(sourceIndex); +// } +// return hexaIndex; +// } +// +// +// +// +// +// +// bool PatternDataModel::mergeVertices( const QModelIndex &i_v0, const QModelIndex &i_v1 ) +// { +// bool ret = false; +// DocumentModel *m = dynamic_cast( sourceModel() ); +// if ( m != NULL ){ +// ret = m->mergeVertices( mapToSource(i_v0), mapToSource(i_v1) ); +// } +// return ret; +// } +// +// bool PatternDataModel::mergeEdges( const QModelIndex &i_e0, const QModelIndex &i_e1, +// const QModelIndex &i_v0, const QModelIndex &i_v1 ) +// { +// bool ret = false; +// DocumentModel *m = dynamic_cast( sourceModel() ); +// if ( m != NULL ){ +// ret = m->mergeEdges( mapToSource(i_e0), mapToSource(i_e1), +// mapToSource(i_v0), mapToSource(i_v1) ); +// } +// return ret; +// } +// +// QModelIndex PatternDataModel::cutEdge( const QModelIndex &i_e0, int nbcuts ) +// { +// QModelIndex elementsIndex; +// DocumentModel *m = dynamic_cast( sourceModel() ); +// if ( m != NULL ){ +// QModelIndex sourceElementsIndex = m->cutEdge( mapToSource(i_e0), nbcuts ); +// std::cout << " sourceElementsIndex.isValid() => " << sourceElementsIndex.isValid() << std::endl; +// elementsIndex = mapFromSource(sourceElementsIndex); +// std::cout << " elementsIndex.isValid() => " << elementsIndex.isValid() << std::endl; +// } +// return elementsIndex; +// } + + +QStandardItem* PatternDataModel::itemFromIndex ( const QModelIndex & index ) const +{ + QStandardItem *item = NULL; + DocumentModel *m = dynamic_cast( sourceModel() ); + if ( m != NULL ){ + item = m->itemFromIndex( mapToSource(index) ); + } + return item; +} + +PatternBuilderModel::PatternBuilderModel( QObject * parent ) : + QSortFilterProxyModel( parent ) +{ + QString builderRegExp =QString("(%1|%2|%3|%4|%5|%6|%7|%8|%9|%10)"). + arg(VECTOR_TREE).arg(CYLINDER_TREE).arg(PIPE_TREE).arg(ELEMENTS_TREE). + arg(CROSSELEMENTS_TREE).arg(VECTOR_DIR_TREE).arg(CYLINDER_DIR_TREE). + arg(PIPE_DIR_TREE).arg(ELEMENTS_DIR_TREE).arg(CROSSELEMENTS_DIR_TREE); + + setFilterRole( HEXA_TREE_ROLE ); + setFilterRegExp ( QRegExp(builderRegExp ) ); +} + +PatternBuilderModel::~PatternBuilderModel() +{ +} + +Qt::ItemFlags PatternBuilderModel::flags(const QModelIndex &index) const +{ +// std::cout<<"PatternBuilderModel::flags()"<( sourceModel() ); + if ( m != NULL ){ + flags = m->flags( mapToSource(index) ); + } + return flags; +} + +QVariant PatternBuilderModel::headerData ( int section, Qt::Orientation orientation, int role ) const +{ + if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){ + return QVariant( "Builder" ); + } else { + return QSortFilterProxyModel::headerData ( section, orientation, role ); + } +} + +QStandardItem* PatternBuilderModel::itemFromIndex ( const QModelIndex & index ) const +{ + QStandardItem *item = NULL; + DocumentModel *m = dynamic_cast( sourceModel() ); + if ( m != NULL ){ + item = m->itemFromIndex( mapToSource(index) ); + } + return item; +} + +// QModelIndex PatternBuilderModel::addVector( double dx, double dy, double dz ) +// { +// std::cout << "PatternBuilderModel::addVector" << std::endl; +// QModelIndex vectorIndex; +// +// DocumentModel *m = dynamic_cast( sourceModel() ); +// if ( m != NULL ){ +// std::cout << "PatternBuilderModel::addVector m != NULL " << std::endl; +// QModelIndex sourceIndex = m->addVector( dx, dy, dz ); +// vectorIndex = mapFromSource(sourceIndex); +// } +// return vectorIndex; +// } +// +// +// QModelIndex PatternBuilderModel::makeCartesian( const QModelIndex& i_pt, +// const QModelIndex& i_vec_x, const QModelIndex& i_vec_y, const QModelIndex& i_vec_z, +// long nx, long ny, long nz) +// { +// std::cout << " PatternBuilderModel::makeCartesian()"<< std::endl; +// QModelIndex elementsIndex; +// DocumentModel *m = dynamic_cast( sourceModel() ); +// if ( m != NULL ){ +// QModelIndex sourceElementsIndex = m->makeCartesian( +// mapToSource(i_pt), +// mapToSource(i_vec_x), mapToSource(i_vec_y), mapToSource(i_vec_z), +// nx, ny, nz ); +// std::cout << " sourceElementsIndex.isValid() => " << sourceElementsIndex.isValid() << std::endl; +// elementsIndex = mapFromSource(sourceElementsIndex); +// std::cout << " elementsIndex.isValid() => " << elementsIndex.isValid() << std::endl; +// } +// return elementsIndex; +// } + +AssociationsModel::AssociationsModel( QObject * parent ) : + QSortFilterProxyModel( parent ) +{ + QString assocRegExp;// =QString("(%1|%2)").arg(GROUP_TREE).arg(GROUP_DIR_TREE); CS_TODO + + setFilterRole( HEXA_TREE_ROLE ); + setFilterRegExp ( QRegExp(assocRegExp) ); +} + +AssociationsModel::~AssociationsModel() +{ +} + +Qt::ItemFlags AssociationsModel::flags(const QModelIndex &index) const +{ +// std::cout<<"AssociationsModel::flags()"<( sourceModel() ); + if ( m != NULL ){ + flags = m->flags( mapToSource(index) ); + } + return flags; +} + +QVariant AssociationsModel::headerData ( int section, Qt::Orientation orientation, int role ) const +{ + if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){ + return QVariant( "Associations" ); + } else { + return QSortFilterProxyModel::headerData ( section, orientation, role ); + } +} + +QStandardItem* AssociationsModel::itemFromIndex ( const QModelIndex & index ) const +{ + QStandardItem *item = NULL; + DocumentModel *m = dynamic_cast( sourceModel() ); + if ( m != NULL ){ + item = m->itemFromIndex( mapToSource(index) ); + } + return item; +} + +GroupsModel::GroupsModel( QObject * parent ) : + QSortFilterProxyModel( parent ) +{ + QString groupsRegExp =QString("(%1|%2)").arg(GROUP_TREE).arg(GROUP_DIR_TREE); + + setFilterRole( HEXA_TREE_ROLE ); + setFilterRegExp ( QRegExp(groupsRegExp ) ); +} + +GroupsModel::~GroupsModel() +{ +} + +Qt::ItemFlags GroupsModel::flags(const QModelIndex &index) const +{ +// MESSAGE("GroupsModel::flags() "<< index.data().toString().toStdString() ); + Qt::ItemFlags flags; + + DocumentModel *m = dynamic_cast( sourceModel() ); + if ( m != NULL ){ +// MESSAGE("* ( m != NULL ) "<< index.data().toString().toStdString() ); + flags = m->flags( mapToSource(index) ); + } else { +// MESSAGE("* ( m is NULL ) "<< index.data().toString().toStdString() ); + } +// if ( flags == Qt::ItemFlags( ~Qt::ItemIsEditable ) ){ +// MESSAGE("* flags == Qt::ItemFlags( ~Qt::ItemIsEditable ) "<< index.data().toString().toStdString() ); +// } else { +// MESSAGE("* flags is not Qt::ItemFlags( ~Qt::ItemIsEditable ) "<< index.data().toString().toStdString() ); +// } +// MESSAGE("}"); + return flags; +} + +QVariant GroupsModel::headerData ( int section, Qt::Orientation orientation, int role ) const +{ + if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){ + return QVariant( "Groups" ); + } else { + return QSortFilterProxyModel::headerData ( section, orientation, role ); + } +} + +QStandardItem* GroupsModel::itemFromIndex ( const QModelIndex & index ) const +{ + QStandardItem *item = NULL; + DocumentModel *m = dynamic_cast( sourceModel() ); + if ( m != NULL ){ + item = m->itemFromIndex( mapToSource(index) ); + } + return item; +} + +QModelIndexList GroupsModel::getGroupElements( const QModelIndex& iGroup, DocumentModel::Group& kind ) const +{ + QModelIndexList elements; + DocumentModel *m = dynamic_cast( sourceModel() ); + if ( m != NULL ){ + elements = m->getGroupElements( mapToSource(iGroup), kind ); + } + return elements; +} + +MeshModel::MeshModel( QObject * parent ) : + QSortFilterProxyModel( parent ) +{ + QString meshRegExp =QString("(%1|%2|%3|%4)").arg(LAW_TREE).arg(LAW_DIR_TREE) .arg(PROPAGATION_TREE).arg(PROPAGATION_DIR_TREE); + + setFilterRole( HEXA_TREE_ROLE ); + setFilterRegExp ( QRegExp(meshRegExp) ); +} + +MeshModel::~MeshModel() +{ +} + +Qt::ItemFlags MeshModel::flags(const QModelIndex &index) const +{ +// MESSAGE("MeshModel::flags() "<< index.data().toString().toStdString() ); + Qt::ItemFlags flags; + + DocumentModel *m = dynamic_cast( sourceModel() ); + if ( m != NULL ){ +// MESSAGE("* ( m != NULL ) "<< index.data().toString().toStdString() ); + flags = m->flags( mapToSource(index) ); + } else { +// MESSAGE("* ( m is NULL ) "<< index.data().toString().toStdString() ); + } +// if ( flags == Qt::ItemFlags( ~Qt::ItemIsEditable ) ){ +// MESSAGE("* you can select "<< index.data().toString().toStdString() ); +// } else { +// MESSAGE("* you cannot select "<< index.data().toString().toStdString() ); +// } +// MESSAGE("}"); + return flags; +} + +QVariant MeshModel::headerData ( int section, Qt::Orientation orientation, int role ) const +{ + if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){ + return QVariant( "Mesh" ); + } else { + return QSortFilterProxyModel::headerData ( section, orientation, role ); + } +} + +QStandardItem* MeshModel::itemFromIndex ( const QModelIndex & index ) const +{ + QStandardItem *item = NULL; + DocumentModel *m = dynamic_cast( sourceModel() ); + if ( m != NULL ){ + item = m->itemFromIndex( mapToSource(index) ); + } + return item; +} + +QModelIndexList MeshModel::getPropagation( const QModelIndex& iPropagation ) const +{ + QModelIndexList edges; + DocumentModel *m = dynamic_cast( sourceModel() ); + if ( m != NULL ){ + edges = m->getPropagation( mapToSource(iPropagation) ); + } + return edges; +} diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentModel.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentModel.hxx new file mode 100755 index 0000000..a16a479 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentModel.hxx @@ -0,0 +1,496 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _HEXABLOCKGUI_DOCUMENTMODEL_HXX_ +#define _HEXABLOCKGUI_DOCUMENTMODEL_HXX_ + + +#include +#include +#include + +#include "HEXABLOCKGUI_DocumentItem.hxx" +#include "HexDocument.hxx" + +namespace HEXABLOCK +{ + namespace GUI + { + + class DocumentModel : public QStandardItemModel + { + Q_OBJECT + public: + + // enum EnumGroup { HexaCell, QuadCell, EdgeCell, + // HexaNode, QuadNode, EdgeNode, Vertex_Node}; + typedef HEXA_NS::EnumGroup Group; + typedef HEXA_NS::KindLaw KindLaw; + + struct GeomObj + { + QString name; + QString entry; + QString subid; // sub-shape id + QString brep; + double start; + double end; + }; + + typedef QList GeomObjList; + + DocumentModel( HEXA_NS::Document* doc, const QString& entry, QObject * parent = 0 ); + DocumentModel( int rows, int columns, QObject * parent = 0 ); + + virtual ~DocumentModel(); + + + void setName(const QString& name); + QString getName(); + void load( const QString& xmlFileName ); + void save( const QString& xmlFileName ); + + void updateData(); + + void clearAll(); + void clearData(); + void clearBuilder(); + void clearAssociation(); + void clearGroups(); + void clearMesh(); + + void fillData(); + void fillBuilder(); + void fillAssociation(); + void fillGroups(); + void fillMesh(); + + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + + + void allowEdition(); + void disallowEdition(); + +// void setDefaultSelection(); +// void allowSelection(); + void allowDataSelectionOnly(); + void allowVertexSelectionOnly(); + void allowEdgeSelectionOnly(); + void allowQuadSelectionOnly(); + void allowHexaSelectionOnly(); + + void allowVectorSelectionOnly(); + void allowCylinderSelectionOnly(); + void allowPipeSelectionOnly(); + void allowElementsSelectionOnly(); + void allowCrossElementsSelectionOnly(); + + void allowLawSelectionOnly(); + + + void setName( const QModelIndex& iElt, const QString& name ); + bool clearEltAssociations( const QModelIndex& iElt ); + + // ************ BUILD HEXABLOCK MODEL ************ + QModelIndex addVertex( double x, double y, double z ); + + // + QModelIndex addEdgeVertices (const QModelIndex &i_v0, const QModelIndex &i_v1 ); + QModelIndex addEdgeVector( const QModelIndex &i_v, const QModelIndex &i_vec ); + + // + QModelIndex addQuadVertices( const QModelIndex &i_v0, const QModelIndex &i_v1, + const QModelIndex &i_v2, const QModelIndex &i_v3 ); + QModelIndex addQuadEdges( const QModelIndex &i_e0, const QModelIndex &i_e1, + const QModelIndex &i_e2, const QModelIndex &i_e3 ); + + // + QModelIndex addHexaVertices( const QModelIndex &i_v0, const QModelIndex &i_v1, + const QModelIndex &i_v2, const QModelIndex &i_v3, + const QModelIndex &i_v4, const QModelIndex &i_v5, + const QModelIndex &i_v6, const QModelIndex &i_v7 ); + QModelIndex addHexaQuad( const QModelIndex &i_q0, const QModelIndex &i_q1, const QModelIndex &i_q2, const QModelIndex &i_q3, const QModelIndex &i_q4, const QModelIndex &i_q5 ); + + QModelIndex addHexaQuads( const QModelIndexList &i_quads ); //NEW HEXA3 + + + // + QModelIndex addVector( double dx, double dy, double dz ); + QModelIndex addVectorVertices( const QModelIndex &i_v0, const QModelIndex &i_v1 ); + + // + QModelIndex addCylinder( const QModelIndex &iv, const QModelIndex &ivec, double r, double h ); + + // + QModelIndex addPipe( const QModelIndex &iv, const QModelIndex &ivec, double ri, double re, double h ); + + + // + QModelIndex makeCartesian( const QModelIndex& ivex, + const QModelIndex& ivecx, const QModelIndex& ivecy, const QModelIndex& ivecz, + long nx, long ny, long nz); + + QModelIndex makeCartesian( const QModelIndex& ivex, + const QModelIndex& ivec, + int nx, int ny, int nz ); + + QModelIndex makeCylindrical( const QModelIndex& i_pt, + const QModelIndex& i_vx, const QModelIndex& i_vz, + double dr, double da, double dl, + long nr, long na, long nl, + bool fill = false ); + + QModelIndex makeCylindricals( + const QModelIndex& i_center, const QModelIndex& i_base, const QModelIndex& i_height, + QList< double> i_radius, QList i_angles, QList i_heights, + bool fill = false ); //NEW HEXA3 + + QModelIndex makeSpherical( const QModelIndex& i_v, const QModelIndex& i_vec, int nb, double k = 1 ); //CS_TO_DEL + + QModelIndex makeSpherical( const QModelIndex& i_center, double rayon, int nb, double k = 1 ); + + // + QModelIndex makeCylinder( const QModelIndex& cyl, const QModelIndex& vec, + int nr, int na, int nl ); + + // + QModelIndex makePipe( const QModelIndex& pipe, const QModelIndex& vecx, + int nr, int na, int nl ); + + // + QModelIndex makeCylinders(const QModelIndex& cyl1, const QModelIndex& cyl2); + + // + QModelIndex makePipes( const QModelIndex& pipe1, const QModelIndex& pipe2 ); + + + + QModelIndex makeRind( const QModelIndex& center, const QModelIndex& vecx, const QModelIndex& vecz, + double radext, double radint, double radhole, + const QModelIndex& plorig, + int nrad, int nang, int nhaut ); //NEW HEXA3 + + QModelIndex makePartRind( const QModelIndex& center, const QModelIndex& vecx, const QModelIndex& vecz, + double radext, double radint, double radhole, + const QModelIndex& plorig, double angle, + int nrad, int nang, int nhaut ); //NEW HEXA3 + + QModelIndex makeSphere( const QModelIndex& center, const QModelIndex& vecx, const QModelIndex& vecz, + double radius, double radhole, + const QModelIndex& plorig, + int nrad, int nang, int nhaut ); //NEW HEXA3 + + QModelIndex makePartSphere( const QModelIndex& center, const QModelIndex& vecx, const QModelIndex& vecz, + double radius, double radhole, + const QModelIndex& plorig, double angle, + int nrad, int nang, int nhaut ); //NEW HEXA3 + + // ************ EDIT HEXABLOCK MODEL ************ + + bool updateVertex( const QModelIndex& vertex, double x, double y, double z ); + + // + bool removeHexa( const QModelIndex& hexa ); + bool removeConnectedHexa( const QModelIndex& hexa ); + + + // + QModelIndex prismQuad( const QModelIndex& quad, const QModelIndex& dv, int nb); + QModelIndex prismQuads( const QModelIndexList& quads, const QModelIndex& dv, int nb); + + + // + QModelIndex joinQuad( const QModelIndex& start_q, const QModelIndex& dest_q, + const QModelIndex& v0, const QModelIndex& v1, + const QModelIndex& v2, const QModelIndex& v3, + int nb ); + + + QModelIndex joinQuads( const QModelIndexList& start_q, const QModelIndex& dest_q, + const QModelIndex& v0, const QModelIndex& v1, + const QModelIndex& v2, const QModelIndex& v3, + int nb ); + + + // + bool mergeVertices( const QModelIndex& va, const QModelIndex& vb ); + bool mergeEdges( const QModelIndex& ea, const QModelIndex& eb, + const QModelIndex& v0, const QModelIndex& v1 ); + bool mergeQuads( const QModelIndex& qa, const QModelIndex& qb, + const QModelIndex& v0, const QModelIndex& v1, + const QModelIndex& v2, const QModelIndex& v3 ); + + // + QModelIndex disconnectVertex( const QModelIndex& h, const QModelIndex& v ); + QModelIndex disconnectEdge( const QModelIndex& h, const QModelIndex& e ); + QModelIndex disconnectQuad( const QModelIndex& h, const QModelIndex& q ); + QModelIndex disconnectEdges( const QModelIndexList& h, const QModelIndexList& e ); + + // + QModelIndex cutEdge( const QModelIndex &e, int nbcuts ); + + // + QModelIndex makeTranslation( const QModelIndex& elts, const QModelIndex& vec ); + QModelIndex makeScale( const QModelIndex& elts, const QModelIndex& v, double k ); + + // + QModelIndex makeRotation( const QModelIndex& elts, const QModelIndex& v, const QModelIndex& vec, double angle ); + + // + QModelIndex makeSymmetryPoint( const QModelIndex& elts, const QModelIndex& v ); + QModelIndex makeSymmetryLine( const QModelIndex& elts, const QModelIndex& v, const QModelIndex& vec ); + QModelIndex makeSymmetryPlane( const QModelIndex& elts, const QModelIndex& v, const QModelIndex& vec ); + + // + bool performTranslation( const QModelIndex& elts, const QModelIndex& vec ); + + // + bool performScale( const QModelIndex& elts, const QModelIndex& v, double k ); + + // + bool performRotation( const QModelIndex& elts, const QModelIndex& v, const QModelIndex& vec, double angle ); + + // + bool performSymmetryPoint( const QModelIndex& elts, const QModelIndex& v ); + bool performSymmetryLine( const QModelIndex& elts, const QModelIndex& v, const QModelIndex& vec ); + bool performSymmetryPlane( const QModelIndex& elts, const QModelIndex& v, const QModelIndex& vec ); + + + QModelIndex revolutionQuads( const QModelIndexList& startQuads, const QModelIndex& center, + const QModelIndex& vec_axis, const QList& angles); //NEW HEXA3 + + QModelIndex replace( const QModelIndexList& quadsPattern, + const QModelIndex& p1, const QModelIndex& c1, + const QModelIndex& p2, const QModelIndex& c2, + const QModelIndex& p3, const QModelIndex& c3 ); //NEW HEXA3 + + + + + + // ************ ASSOCIATION ************ + // elt is Vertex, Edge, Quad + void addAssociation( const QModelIndex& elt, const GeomObj& assoc ); + QList getAssociations( const QModelIndex& elt ); + + bool associateOpenedLine( const QModelIndexList& edges, + const GeomObjList& assocs, + double pstart, + double pend ); + + bool associateClosedLine( const QModelIndex& vertex, + const QModelIndexList& edges, + const GeomObjList& assocs, + double pstart, + bool inv = false ); + + + // ************ GROUPS ************ + + // + QModelIndex addGroup( const QString& name, Group kind ); + + // + bool removeGroup( const QModelIndex& grp ); + + // + QModelIndexList getGroupElements( const QModelIndex& iGroup, Group& kind) const; + + // 7.4 Boite: éditer un groupe + void setGroupName( const QModelIndex& grp, const QString& name ); + bool addGroupElement( const QModelIndex& grp, const QModelIndex& elt ); + bool removeGroupElement( const QModelIndex& grp, int nro ); //CS_TODO + bool clearGroupElement( const QModelIndex& grp ); + + + // ************ LAWS ************ + + // + QModelIndex addLaw( const QString& name, int nbnodes ); + +// 8.2 Boite: créer une loi +// class Law +// { +// public: +// int setNodes (int nbre); +// int setCoefficient (double coeff); +// void setKind (KindLaw type); +// } + + bool setLaw( const QModelIndex& ilaw, int nbnodes, double coeff, KindLaw type ); + + // + bool removeLaw( const QModelIndex& law ); + + // 8.3 Boite: éditer une loi + // (idem création) + +// 9 Discrétisation +// 9.1 Boite: poser une loi de discrétisation sur une propagation +// int setLaw (Law* loi); +// void setWay (bool sens); + bool setPropagation( const QModelIndex& iPropagation, const QModelIndex& iLaw, bool way ); + QModelIndexList getPropagation( const QModelIndex& iPropagation ) const; + +// +// 9.1 Boite: éditer +// (idem création) + + + // tools + HEXA_NS::Document* documentImpl(); + QString documentEntry(); +// QModelIndex indexBy( int role, const QString& value ); + + signals: + void patternDataChanged(); + void nameChanged(const QString& name); + + private: + QTemporaryFile *_hexaFile; + HEXA_NS::Document *_hexaDocument; + QString _entry; + + QMap _assocName; // clé: id; valeur: nom + bool _disallowEdition; + + //data + QStandardItem *_vertexDirItem; + QStandardItem *_edgeDirItem; + QStandardItem *_quadDirItem; + QStandardItem *_hexaDirItem; + + //builder + QStandardItem *_vectorDirItem; + QStandardItem *_cylinderDirItem; + QStandardItem *_pipeDirItem; + QStandardItem *_elementsDirItem; + QStandardItem *_crossElementsDirItem; + + + //association + // CS_TODO + + + // groups + QStandardItem *_groupDirItem; + + // law + QStandardItem *_lawDirItem; + QStandardItem *_propagationDirItem; + + + Qt::ItemFlags _vertexItemFlags; + Qt::ItemFlags _edgeItemFlags; + Qt::ItemFlags _quadItemFlags; + Qt::ItemFlags _hexaItemFlags; + + Qt::ItemFlags _vectorItemFlags; + Qt::ItemFlags _cylinderItemFlags; + Qt::ItemFlags _pipeItemFlags; + Qt::ItemFlags _elementsItemFlags; + Qt::ItemFlags _crossElementsItemFlags; + + Qt::ItemFlags _groupItemFlags; + Qt::ItemFlags _lawItemFlags; + Qt::ItemFlags _propagationItemFlags; + + }; + + + + class PatternDataModel : public QSortFilterProxyModel + { + public: + PatternDataModel( QObject * parent = 0 ); + virtual ~PatternDataModel(); + + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; + + QStandardItem * itemFromIndex ( const QModelIndex & index ) const; + + + HEXA_NS::Document* documentImpl(); + QString documentEntry(); + + + }; + + + class PatternBuilderModel : public QSortFilterProxyModel + { + public: + PatternBuilderModel( QObject * parent = 0 ); + virtual ~PatternBuilderModel(); + + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; + QStandardItem * itemFromIndex ( const QModelIndex & index ) const; + }; + + + + class AssociationsModel : public QSortFilterProxyModel + { + public: + AssociationsModel( QObject * parent = 0 ); + virtual ~AssociationsModel(); + + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; + QStandardItem * itemFromIndex ( const QModelIndex & index ) const; + }; + + + class GroupsModel : public QSortFilterProxyModel + { + public: + GroupsModel( QObject * parent = 0 ); + virtual ~GroupsModel(); + + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; + QStandardItem * itemFromIndex ( const QModelIndex & index ) const; + + QModelIndexList getGroupElements( const QModelIndex& iGroup, DocumentModel::Group& kind ) const; + }; + + + class MeshModel : public QSortFilterProxyModel + { + public: + MeshModel( QObject * parent = 0 ); + virtual ~MeshModel(); + + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; + QStandardItem * itemFromIndex ( const QModelIndex & index ) const; + + + QModelIndexList getPropagation( const QModelIndex& iPropagation ) const; + }; + + + + + } +} + +#endif diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentPanel.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentPanel.cxx new file mode 100755 index 0000000..91c790c --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentPanel.cxx @@ -0,0 +1,5565 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include "HEXABLOCKGUI_DocumentPanel.hxx" +#include "HEXABLOCKGUI_DocumentGraphicView.hxx" +#include "HEXABLOCKGUI_SalomeTools.hxx" +#include "HEXABLOCKGUI.hxx" + + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +// #include + + +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include "SVTK_Selection.h" +#include +#include + +#include + + +// #include + +#include +#include + + + +#include "MyGEOMBase_Helper.hxx" +#include "GEOMBase.h" +#include "GEOM_Operation.h" + + +#define VERTEX_COORD_MIN -1000000 +#define VERTEX_COORD_MAX 1000000 + + +using namespace std; +using namespace HEXABLOCK::GUI; + + +Q_DECLARE_METATYPE(HEXABLOCK::GUI::HexaTreeRole); +Q_DECLARE_METATYPE(TopAbs_ShapeEnum); + +//General SpinBox Delegate +class HexaDoubleSpinBoxDelegate : public QStyledItemDelegate { +public: + HexaDoubleSpinBoxDelegate(QObject *parent=0) : QStyledItemDelegate (parent){} + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const{ + return new QDoubleSpinBox( parent ); + } +}; + +//Angle SpinBox Delegate +class HexaAngleDoubleSpinBoxDelegate : public QStyledItemDelegate { +public: + HexaAngleDoubleSpinBoxDelegate(QObject *parent=0) : QStyledItemDelegate (parent){} + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const{ + QDoubleSpinBox *sb = new QDoubleSpinBox( parent ); + sb->setMinimum(0); + sb->setMaximum(360); + return sb; + } +}; + + +//Positive DoubleSpinBox Delegate (for heigth, radius, ...) +class HexaPositiveDoubleSpinBoxDelegate : public QStyledItemDelegate { +public: + HexaPositiveDoubleSpinBoxDelegate(QObject *parent=0) : QStyledItemDelegate (parent){} + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const{ + QDoubleSpinBox *sb = new QDoubleSpinBox( parent ); + sb->setMinimum(0); + /////// sb->setMaximum(1000000000000000); //10e15 Abu : Pb en 32 bits + sb->setMaximum(1000000000); //10e9 + return sb; + } +}; + + +// ======================================================== Constructeur +HexaBaseDialog::HexaBaseDialog( QWidget * parent, Mode editmode, Qt::WindowFlags f ): + // _model(0), + // _selectionModel(0), + QDialog(parent, f), + MyGEOMBase_Helper( dynamic_cast(parent->parent()) ), + _editMode( editmode ), + _documentModel(0), + // _patternDataModel(0), + // _patternBuilderModel(0), + _patternDataSelectionModel(0), + _patternBuilderSelectionModel(0), + _groupsSelectionModel(0), + _meshSelectionModel(0), + _mgr(0), + _vtkVm(0), + _occVm(0), + _currentObj(0), + _expectedSelection(-1), + _selectionMutex( false ), + // _applyCloseButton(0), + _applyButton(0) +{ + MESSAGE("HexaBaseDialog::HexaBaseDialog() dynamic_cast(parent->parent()) =>" << dynamic_cast(parent->parent()) ); + _strHexaWidgetType[VERTEX_TREE] = tr( "VERTEX" ); + _strHexaWidgetType[EDGE_TREE] = tr( "EDGE" ); + _strHexaWidgetType[QUAD_TREE] = tr( "QUAD" ); + _strHexaWidgetType[HEXA_TREE] = tr( "HEXA" ); + + _strHexaWidgetType[VECTOR_TREE] = tr( "VECTOR" ); + _strHexaWidgetType[CYLINDER_TREE] = tr( "CYLINDER" ); + _strHexaWidgetType[PIPE_TREE] = tr( "PIPE" ); + _strHexaWidgetType[ELEMENTS_TREE] = tr( "ELEMENTS" ); + _strHexaWidgetType[CROSSELEMENTS_TREE]= tr( "CROSSELEMENTS" ); + + _strHexaWidgetType[GROUP_TREE] = tr( "GROUP" ); + _strHexaWidgetType[LAW_TREE] = tr( "LAW" ); + _strHexaWidgetType[PROPAGATION_TREE]= tr( "PROPAGATION" ); + +} + +// ============================================================= Destructeur +HexaBaseDialog::~HexaBaseDialog() +{ + // _mgr->clearSelectionCache(); + // _mgr->clearSelected(); + // globalSelection(); + // erasePreview(); +} + +// ============================================================== _initButtonBox +QGroupBox* HexaBaseDialog::_initButtonBox( Mode editmode ) +{ + if ( editmode == INFO_MODE ) + return NULL; + + //QDialogButtonBox* buttonBox = new QDialogButtonBox(this); + QGroupBox* buttonBox = new QGroupBox(); + buttonBox->setMinimumWidth(5); + buttonBox->setObjectName(QString::fromUtf8("buttonBox")); + //buttonBox->setOrientation(Qt::Horizontal); + QHBoxLayout* buttonsHLayout = new QHBoxLayout(); + _applyButton = new QPushButton(tr("Apply")); + QPushButton* closeButton = new QPushButton(tr("Close")); + QPushButton* helpButton = new QPushButton(tr("Help")); + //_applyCloseButton = new QPushButton(tr("Apply And Close")); + + //connect( buttonBox, SIGNAL(clicked()), this, SLOT(applyAndClose()) ); + connect( _applyButton, SIGNAL(clicked()), this, SLOT(apply()) ); + connect( closeButton, SIGNAL(clicked()), this, SLOT(close()) ); + connect( helpButton, SIGNAL(clicked()), this, SLOT(onHelpRequested()) ); + + buttonsHLayout->addWidget( _applyButton ); + buttonsHLayout->addWidget( closeButton ); + buttonsHLayout->addStretch(1); + buttonsHLayout->addWidget( helpButton ); + //buttonsHLayout->addButton( _applyCloseButton ); + buttonBox->setLayout(buttonsHLayout); + layout()->addWidget(buttonBox); + + return buttonBox; +} + +// ============================================================== _initWidget +void HexaBaseDialog::_initWidget( Mode editmode ) +{ + _initInputWidget( editmode ); + _initButtonBox( editmode ); +} + + +// ============================================================== _initViewManager +void HexaBaseDialog::_initViewManager() +{ + SalomeApp_Application* anApp = dynamic_cast( SUIT_Session::session()->activeApplication() ); + _mgr = dynamic_cast( anApp->selectionMgr() ); + _vtkVm = anApp->getViewManager( SVTK_Viewer::Type(), true ); + _occVm = anApp->getViewManager( OCCViewer_Viewer::Type(), true ); + SUIT_ViewManager* activeVm = anApp->activeViewManager(); + + onWindowActivated ( activeVm ); +} + + +// ============================================================== apply +bool HexaBaseDialog::apply() +{ + MESSAGE("HexaBaseDialog::apply()"); + QModelIndex iNew; + bool applied = apply(iNew); + if ( applied ){ + // clear all selection + if (_patternDataSelectionModel) _patternDataSelectionModel->clearSelection(); + if (_patternBuilderSelectionModel) _patternBuilderSelectionModel->clearSelection(); + if (_groupsSelectionModel) _groupsSelectionModel->clearSelection(); + if (_meshSelectionModel) _meshSelectionModel->clearSelection(); + // select and highlight in vtk view the result + _selectAndHighlight( iNew ); + // reinitialization + _currentObj = NULL; + } + return applied; +} + +// ============================================================== accept +//void HexaBaseDialog::accept() +//{ +// bool applied = apply(); +// if ( applied ){ +// QDialog::accept(); +// _disallowSelection(); +// } +//} + +// ============================================================== close +void HexaBaseDialog::close() +{ + _currentObj = NULL; + _disallowSelection(); + //resize(300, 350); + QDialog::close(); +} + +// ============================================================== onHelpRequested +void HexaBaseDialog::onHelpRequested() +{ + LightApp_Application* app = (LightApp_Application*)( SUIT_Session::session()->activeApplication() ); + if ( app ) + // app->onHelpContextModule( myGeometryGUI ? app->moduleName( myGeometryGUI->moduleName() ) : QString( "" ), _helpFileName ); + app->onHelpContextModule( "HEXABLOCK", _helpFileName ); + + else { + QString platform; +#ifdef WIN32 + platform = "winapplication"; +#else + platform = "application"; +#endif + + SUIT_MessageBox::warning( 0, QObject::tr( "WRN_WARNING" ), + QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ). + arg( app->resourceMgr()->stringValue( "ExternalBrowser", platform ) ).arg( _helpFileName ), + QObject::tr( "BUT_OK" ) ); + } + +} + +// ============================================================== _selectAndHighlight +void HexaBaseDialog::_selectAndHighlight( const QModelIndex& i ) +{ + if ( !i.isValid() ) return; + setProperty("QModelIndex", QVariant::fromValue(i)); + setFocus(); +} + + +// ============================================================== _allowSelection +void HexaBaseDialog::_allowSelection() +{ + MESSAGE("HexaBaseDialog::_allowSelection(){"); + if ( _documentModel ){ + _documentModel->disallowEdition(); + } + MESSAGE("}"); +} + +// ============================================================== _disallowSelection +void HexaBaseDialog::_disallowSelection() +{ + MESSAGE("HexaBaseDialog::_disallowSelection(){"); + if ( _documentModel ){ + _documentModel->allowEdition(); + } + if ( _patternDataSelectionModel ){ + _patternDataSelectionModel->setAllSelection(); + } + MESSAGE("}"); +} + + +// ============================================================== _allowVTKSelection +bool HexaBaseDialog::_allowVTKSelection( QObject* obj ) +{ + MESSAGE("HexaBaseDialog::_allowModelSelection(){"); + if ( !_patternDataSelectionModel ) return false; + bool isOk = false; + + HexaWidgetType wType; + QVariant v = obj->property("HexaWidgetType"); + if ( !v.isValid() ) { + MESSAGE("* no HexaWidgetType property"); + return false; + } + MESSAGE("* HEXABLOCKGUI::currentVtkView->raise()"); + HEXABLOCKGUI::currentVtkView->raise(); + // HEXABLOCKGUI::currentVtkView->setFocus(); + wType = v.value(); + MESSAGE("* HexaWidgetType property is " << wType ); + + switch (wType){ + case VERTEX_TREE: + _patternDataSelectionModel->setVertexSelection(); isOk = true; + break; + case EDGE_TREE: + _patternDataSelectionModel->setEdgeSelection(); isOk = true; + break; + case QUAD_TREE: + _patternDataSelectionModel->setQuadSelection(); isOk = true; + break; + case HEXA_TREE: + _patternDataSelectionModel->setHexaSelection(); isOk = true; + break; + // case VECTOR_TREE: + // case CYLINDER_TREE: + // case PIPE_TREE: + // case ELEMENTS_TREE: + // case CROSSELEMENTS_TREE: //selector = _patternBuilderSelectionModel; + // case GROUP_TREE: //selector = _groupsSelectionModel; + // case LAW_TREE: + // case PROPAGATION_TREE: // selector = _meshSelectionModel; + default : MESSAGE("NOT YET"); + } + MESSAGE("}"); + return isOk; +} + +// ============================================================== _allowOCCSelection +bool HexaBaseDialog::_allowOCCSelection( QObject* obj ) +{ + MESSAGE("HexaBaseDialog::_allowOCCCSelection(){"); + if ( !HEXABLOCKGUI::currentOccView ) return false; + + //We do not allow occ selection when the occ viewer is not activated + SUIT_ViewWindow* window = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); + bool isOCC = (window && window->getViewManager()->getType() == OCCViewer_Viewer::Type()); + if (!isOCC) return false; + + + GeomWidgetType wType; + QVariant v = obj->property("GeomWidgetType"); + if ( !v.isValid() ) { + MESSAGE("* no GeomWidgetType property"); + return false; + } + MESSAGE("* HEXABLOCKGUI::currentOccView->raise()"); + HEXABLOCKGUI::currentOccView->raise(); + wType = v.value(); + MESSAGE("* GeomWidgetType property is " << wType ); + MESSAGE("* TopAbs_VERTEX is " << TopAbs_VERTEX ); + MESSAGE("* TopAbs_EDGE is " << TopAbs_EDGE ); + MESSAGE("* TopAbs_FACE is " << TopAbs_FACE ); + + globalSelection(); // close local contexts, if any + localSelection(GEOM::GEOM_Object::_nil(), wType/*TopAbs_EDGE*/); + return true; +} + + +// ============================================================== _getSelector +QItemSelectionModel* HexaBaseDialog::_getSelector( QObject* obj ) +{ + QItemSelectionModel* selector = NULL; + MESSAGE("HexaBaseDialog::getSelector(){"); + + QString objectName = obj->objectName(); + QString className = obj->metaObject()->className(); + MESSAGE("* obj->objectName() is "<< objectName.toStdString() ); //toStdString() + MESSAGE("* obj->metaObject()->className() is "<< className.toStdString() ); + + HexaWidgetType wtype; + QVariant v = obj->property("HexaWidgetType"); + if ( !v.isValid() ) { + MESSAGE("* no HexaWidgetType property"); + return NULL; + } + + wtype = v.value(); + MESSAGE("* HexaWidgetType property is " << wtype); + + switch (wtype){ + case VERTEX_TREE: + case EDGE_TREE: + case QUAD_TREE: + case HEXA_TREE: + selector = _patternDataSelectionModel; break; + case VECTOR_TREE: + case CYLINDER_TREE: + case PIPE_TREE: + case ELEMENTS_TREE: + case CROSSELEMENTS_TREE: + selector = _patternBuilderSelectionModel; break; + case GROUP_TREE: + selector = _groupsSelectionModel; break; + case LAW_TREE: + case PROPAGATION_TREE: + selector = _meshSelectionModel; break; + default : MESSAGE("NOT YET"); + } + MESSAGE("}"); + return selector; +} + + +// ============================================================== _onSelectionChanged + +bool HexaBaseDialog::_onSelectionChanged( const QItemSelection& sel, QLineEdit* le ) +{ + MESSAGE("HexaBaseDialog::_onSelectionChanged(const QItemSelection& sel, QLineEdit* le)"); + MESSAGE("* le is "<< le->objectName().toStdString() ); + QModelIndexList l = sel.indexes(); + if ( l.count() == 0 ) return false; + + //type from selection (first) + QModelIndex selected = l[0]; + int selType = selected.data(HEXA_TREE_ROLE).toInt(); + + //type of widget + QVariant v = le->property("HexaWidgetType"); + if ( !v.isValid() ) return false; + HexaWidgetType wType = v.value(); + + // check selection compatibility between selection and widget + if ( selType != wType ){ + MESSAGE("* bad selection : " << selType << " is not " << wType ); + SUIT_MessageBox::information( 0, + tr("HEXA_INFO"), + tr("%1: Bad type selected\nPlease select a %2.").arg(windowTitle()).arg( _strHexaWidgetType[wType]) ); + return false; + } + + //fill the lineEdit if selection is OK + le->setText( selected.data().toString() );// name + le->setProperty("QModelIndex", QVariant::fromValue(selected) ); + _index[le] = selected; + MESSAGE("}"); + return true; +} + + +// ============================================================== _onSelectionChanged +bool HexaBaseDialog::_onSelectionChanged( const QItemSelection& sel, QListWidget* lw ) +{ + MESSAGE("HexaBaseDialog::_onSelectionChanged( const QItemSelection& sel, QListWidget* lw )"); + MESSAGE("* lw is "<< lw->objectName().toStdString() ); + QModelIndexList l = sel.indexes(); + + if ( l.count() == 0 ) return false; + + //type of widget + QVariant v = lw->property("HexaWidgetType"); + if ( !v.isValid() ) return false; + HexaWidgetType wType = v.value(); + + //fill the listWidget + QListWidgetItem* item = NULL; + int selType; + QString selName; + // int maxSize = 8; + foreach( const QModelIndex& isel, l ){ + // if ( lw->count() == maxSize) break; + selType = isel.data(HEXA_TREE_ROLE).toInt(); + if ( selType != wType ){ // check selection compatibility between selection and widget + MESSAGE("* bad selection : " << selType<< " is not " << wType ); + SUIT_MessageBox::information( 0, + tr("HEXA_INFO"), + tr("%1: Bad type selected\nPlease select a %2.").arg(windowTitle()).arg( _strHexaWidgetType[wType]) ); + return false; + } + // add selection to listWidget if selection is OK + selName = isel.data().toString(); + QList twice = lw->findItems( selName, Qt::MatchExactly); + if ( twice.count() == 0 ){ + item = new QListWidgetItem( selName ); + item->setData( LW_QMODELINDEX_ROLE, QVariant::fromValue(isel) ); + lw->addItem(item); + updateButtonBox(); + } + } + MESSAGE("}"); + return true; +} + +// ============================================================== onCurrentSelectionChanged +void HexaBaseDialog::onCurrentSelectionChanged() +{ +} + + +// ============================================================== setDocumentModel +void HexaBaseDialog::setDocumentModel(DocumentModel* m) +{ + _documentModel = m; +} + +// ============================================================== clear +void HexaBaseDialog::clear() +{ +} + + +// ============================================================== setPatternDataSelectionModel +void HexaBaseDialog::setPatternDataSelectionModel(PatternDataSelectionModel* s) +{ + _patternDataSelectionModel = s; +} + + +// ============================================================== setPatternBuilderSelectionModel +void HexaBaseDialog::setPatternBuilderSelectionModel(PatternBuilderSelectionModel* s) +{ + _patternBuilderSelectionModel = s; +} + +// ============================================================== setGroupsSelectionModel +void HexaBaseDialog::setGroupsSelectionModel( GroupsSelectionModel* s ) +{ + _groupsSelectionModel = s; +} + + +// ============================================================== setMeshSelectionModel +void HexaBaseDialog::setMeshSelectionModel( MeshSelectionModel* s ) +{ + _meshSelectionModel = s; +} + + +// ============================================================== onSelectionChanged +void HexaBaseDialog::onSelectionChanged( const QItemSelection& sel, const QItemSelection& unsel ) +{ + MESSAGE( "HexaBaseDialog::onSelectionChanged(){" ); + QString className = metaObject()->className(); + MESSAGE( "* I am : " << className.toStdString() ); + MESSAGE( "* sender is : " << sender() ); + MESSAGE( "* _patternDataSelectionModel : " << _patternDataSelectionModel ); + MESSAGE( "* _patternBuilderSelectionModel : " << _patternBuilderSelectionModel ); + MESSAGE( "* _groupsSelectionModel : " << _groupsSelectionModel ); + MESSAGE( "* _meshSelectionModel : " << _meshSelectionModel ); + + + QItemSelectionModel* selector = dynamic_cast(sender()); + MESSAGE( "* selector : " << selector); + + foreach( const QModelIndex& isel, sel.indexes() ){ + MESSAGE("* selected : " << isel.data().toString().toStdString()); + } + foreach( const QModelIndex& iunsel, unsel.indexes() ){ + MESSAGE("* unselected : " << iunsel.data().toString().toStdString()); + } + + if ( _selectionMutex ) + return; + + + bool selOk = false; + QLineEdit* aLineEdit = 0; + QListWidget* aListWidget = 0; + aLineEdit = dynamic_cast(_currentObj); + if ( aLineEdit){ //fill the lineedit with selection + selOk = _onSelectionChanged( sel, aLineEdit ); + } + aListWidget = dynamic_cast(_currentObj); + if ( aListWidget){ //fill the listWidget with selection + selOk = _onSelectionChanged( sel, aListWidget ); + } + + if ( !selOk && selector && ( aLineEdit || aListWidget ) ){ + selector->clearSelection(); + } + + MESSAGE("}"); +} + +// ============================================================== onWindowActivated +void HexaBaseDialog::onWindowActivated( SUIT_ViewManager* vm ) +{ +} + +// ============================================================== hideEvent +void HexaBaseDialog::hideEvent ( QHideEvent * event ) +{ + MESSAGE("HexaBaseDialog::hideEvent(){"); + QString className = metaObject()->className(); + MESSAGE( "* I am : " << className.toStdString() ); + + if ( _patternDataSelectionModel ) + disconnect( _patternDataSelectionModel, SIGNAL( selectionChanged ( const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + if ( _patternBuilderSelectionModel ) + disconnect( _patternBuilderSelectionModel, SIGNAL( selectionChanged( const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + if ( _groupsSelectionModel ) + disconnect( _groupsSelectionModel, SIGNAL( selectionChanged( const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + if ( _meshSelectionModel ) + disconnect( _meshSelectionModel, SIGNAL( selectionChanged( const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + // if ( _mgr ) + // disconnect( _mgr, 0/*SIGNAL(currentSelectionChanged())*/, this, 0/*SLOT(onCurrentSelectionChanged())*/ ); + disconnect( HEXABLOCKGUI::selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(onCurrentSelectionChanged()) ); + if ( _vtkVm ) + disconnect( _vtkVm, SIGNAL( activated(SUIT_ViewManager*) ), this, SLOT( onWindowActivated(SUIT_ViewManager*) ) ); + if ( _occVm ) + disconnect( _occVm, SIGNAL( activated(SUIT_ViewManager*) ), this, SLOT( onWindowActivated(SUIT_ViewManager*) ) ); + + _documentModel->allowEdition(); + + QDialog::hideEvent( event ); + MESSAGE("}"); +} + +// ============================================================== showEvent +void HexaBaseDialog::showEvent( QShowEvent * event ) +{ + MESSAGE("HexaBaseDialog::showEvent(){"); + QString className = metaObject()->className(); + MESSAGE( "* I am : " << className.toStdString() ); + + if ( _editMode == INFO_MODE ){ + _documentModel->allowEdition(); + } else { + _documentModel->disallowEdition(); + } + + if ( _patternDataSelectionModel ){ + _patternDataSelectionModel->clearSelection(); + connect( _patternDataSelectionModel, SIGNAL( selectionChanged ( const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + } + if ( _patternBuilderSelectionModel ){ + _patternBuilderSelectionModel->clearSelection(); + connect( _patternBuilderSelectionModel, SIGNAL( selectionChanged( const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + } + if ( _groupsSelectionModel ){ + _groupsSelectionModel->clearSelection(); + connect( _groupsSelectionModel, SIGNAL( selectionChanged( const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + } + if ( _meshSelectionModel ){ + _meshSelectionModel->clearSelection(); + connect( _meshSelectionModel, SIGNAL( selectionChanged( const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + } + if ( _mgr ) + connect( _mgr, SIGNAL(currentSelectionChanged()), this, SLOT(onCurrentSelectionChanged()) ); + + if ( _vtkVm ) + connect( _vtkVm, SIGNAL( activated(SUIT_ViewManager*) ), this, SLOT( onWindowActivated(SUIT_ViewManager*) ) ); + if ( _occVm ) + connect( _occVm, SIGNAL( activated(SUIT_ViewManager*) ), this, SLOT( onWindowActivated(SUIT_ViewManager*) ) ); + + QDialog::showEvent ( event ); + MESSAGE("}"); +} + + + +// ============================================================== updateButtonBox +void HexaBaseDialog::updateButtonBox() +{ +} + +void HexaBaseDialog::updateName() +{ + if (!_documentModel) return; + if ( !_patternDataSelectionModel ) return; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + + QLineEdit* lineEdit = dynamic_cast(sender()); + if (!lineEdit) return; + QString newName = lineEdit->text(); + if ( newName.isEmpty() ) return; + + QVariant v = lineEdit->property("QModelIndex"); + if ( !v.isValid() ) return; + + QModelIndex index = v.value(); + if ( index.isValid() ) + _documentModel->setName( patternDataModel->mapToSource(index), newName ); +} + + + +// ============================================================== selectElementOfModel +void HexaBaseDialog::selectElementOfModel() +{ + MESSAGE("HexaBaseDialog::selectElementOfModel()"); + if (!_patternDataSelectionModel) return; + + QListWidget* currentListWidget = dynamic_cast( sender() ); + if ( !currentListWidget ) return; + + _selectionMutex = true; + + QList sel = currentListWidget->selectedItems(); + QModelIndex index; + _patternDataSelectionModel->clearSelection(); + foreach ( QListWidgetItem *item, sel ){ + MESSAGE( "* selecting the element : " << index.data().toString().toStdString() ); + index = item->data(LW_QMODELINDEX_ROLE).value(); + if ( index.isValid() ) + _patternDataSelectionModel->select( index, QItemSelectionModel::Select ); + } + _selectionMutex = false; + + MESSAGE("}"); +} + +// ============================================================== eventFilter +bool HexaBaseDialog::eventFilter(QObject *obj, QEvent *event) +{ + QLineEdit *lineEdit = dynamic_cast(obj); + QListWidget *listWidget = dynamic_cast(obj); + HexaBaseDialog *dialog = dynamic_cast(obj); + + if ( event->type() == QEvent::FocusIn ){ + QString className = obj->metaObject()->className(); + QString objectName = obj->objectName(); + MESSAGE("QEvent::FocusIn : I am "<< objectName.toStdString() ); + MESSAGE("QEvent::FocusIn : I am "<< className.toStdString() ); + + // Highlight the input widget + if ( lineEdit || listWidget ){ + QWidget* w = dynamic_cast(obj); + QPalette palette1 = w->palette(); + palette1.setColor(w->backgroundRole(), Qt::yellow); + w->setPalette(palette1); + } + } + + if ( event->type() == QEvent::FocusOut ){ + QString className = obj->metaObject()->className(); + QString objectName = obj->objectName(); + MESSAGE("QEvent::FocusOut : I am "<< objectName.toStdString() ); + MESSAGE("QEvent::FocusOut : I am "<< className.toStdString() ); + + // UnHighlight the input widget + if ( lineEdit || listWidget ){ + QWidget* w = dynamic_cast(obj); + QPalette palette1 = w->palette(); + palette1.setColor(w->backgroundRole(), Qt::white); + w->setPalette(palette1); + } + } + + if ( event->type() != QEvent::FocusIn ){ //QEvent::KeyPress) { + return false; + // return QObject::eventFilter(obj, event); + } + + MESSAGE("HexaBaseDialog::eventFilter{"); + MESSAGE("* QEvent::FocusIn"); + + /* ON FOCUS ON A WIDGET*/ + QVariant v; + QModelIndex index; + + + QItemSelectionModel *selector = 0; + _allowVTKSelection( obj ); + + //geom selection + _allowOCCSelection( obj ); + + //Depending of focused widget type, get the right selector for it + selector = _getSelector( obj ); + if ( !selector ) return false; + + // Highlight the input widget + if ( _currentObj != obj && (lineEdit || listWidget) ){ + selector->clearSelection(); + } + _currentObj = obj; + + + //If there is a current selection fill the widget with it + if ( selector->hasSelection() ){ + QItemSelection currentSelection = selector->selection(); + bool selOk = false; + if ( lineEdit ){ //element can be from lineEdit + selOk = _onSelectionChanged( currentSelection, lineEdit ); + } else if ( listWidget ){ + selOk = _onSelectionChanged( currentSelection, listWidget ); + } + if ( !selOk && ( lineEdit || listWidget ) ){ + selector->clearSelection(); + } + + } else { //If the widget contains an hexa element, select it in model/view + if ( lineEdit ){ //element can be from lineEdit + MESSAGE("* on QLineEdit"); + v = lineEdit->property("QModelIndex"); + if ( !v.isValid() ) { + //return QObject::eventFilter(obj, event); + return false; + } + index = v.value(); + + _selectionMutex = true; + MESSAGE("* selecting the element : " << index.data().toString().toStdString()); + MESSAGE("* with selector : " << selector); + MESSAGE( "* _patternDataSelectionModel : " << _patternDataSelectionModel ); + MESSAGE( "* _patternBuilderSelectionModel : " << _patternBuilderSelectionModel ); + MESSAGE( "* _groupsSelectionModel : " << _groupsSelectionModel ); + MESSAGE( "* _meshSelectionModel : " << _meshSelectionModel ); + selector->select( index, QItemSelectionModel::Clear ); + selector->select( index, QItemSelectionModel::Select ); + _selectionMutex = false; + } + + + if ( dialog ){ //element can be from a dialog box + MESSAGE("* on Dialog"); + v = dialog->property("QModelIndex"); + if ( !v.isValid() ) { + //return QObject::eventFilter(obj, event); + return false; + } + index = v.value(); + _selectionMutex = true; + MESSAGE("* selecting the element : " << index.data().toString().toStdString()); + selector->select( index, QItemSelectionModel::Clear ); + selector->select( index, QItemSelectionModel::Select ); + _selectionMutex = false; + } + + } + MESSAGE("}"); + return false; +} + + +// ------------------------- VERTEX ---------------------------------- + +// ============================================================== Constructeur +VertexDialog::VertexDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f), + _value(0) +{ + _helpFileName = "gui_vertex.html"; + setupUi( this ); + _initWidget(editmode); + // setFocusProxy( name_le ); + + if ( editmode == NEW_MODE ){ + setWindowTitle( tr("Vertex Construction") ); + } else if ( editmode == UPDATE_MODE ){ + setWindowTitle( tr("Vertex Modification") ); + } +} + +// ============================================================== Destructeur +VertexDialog::~VertexDialog() +{ +} + + +// ============================================================== _initInputWidget +void VertexDialog::_initInputWidget( Mode editmode ) +{ + x_spb->setRange(VERTEX_COORD_MIN, VERTEX_COORD_MAX); + y_spb->setRange(VERTEX_COORD_MIN, VERTEX_COORD_MAX); + z_spb->setRange(VERTEX_COORD_MIN, VERTEX_COORD_MAX); + + setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + installEventFilter(this); + name_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + name_le->installEventFilter(this); + + connect( name_le, SIGNAL(returnPressed()), this, SLOT(updateName())); +} + +// ============================================================== clear +void VertexDialog::clear() +{ + // name_le->clear(); +} + +// ============================================================== setValue +void VertexDialog::setValue(HEXA_NS::Vertex* v) +{ + MESSAGE("* setValue : " << v); + //0) Name + name_le->setText( v->getName() ); + + //1) Value (x,y,z) + x_spb->setValue( v->getX() ); + y_spb->setValue( v->getY() ); + z_spb->setValue( v->getZ() ); + + MESSAGE("* _patternDataSelectionModel : " << _patternDataSelectionModel ); + if ( _patternDataSelectionModel ){ + QModelIndex iv = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(v) ); + MESSAGE("* selecting the element : " << iv.data().toString().toStdString()); + + setProperty( "QModelIndex", QVariant::fromValue(iv) ); + name_le->setProperty( "QModelIndex", QVariant::fromValue(iv) ); + } + _value = v; +} + + +// ============================================================== getValue +HEXA_NS::Vertex* VertexDialog::getValue() +{ + return _value; +} + + + +// ============================================================== apply +bool VertexDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_documentModel ) return false; + if ( !_patternDataSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + if ( !patternDataModel ) return false; + _currentObj = NULL; + + bool isOk = false; + + QModelIndex iVertex; + double newX = x_spb->value(); + double newY = y_spb->value(); + double newZ = z_spb->value(); + + if ( _editMode == UPDATE_MODE){ + QVariant v = property("QModelIndex"); + if ( v.isValid() ){ + iVertex = patternDataModel->mapToSource( v.value() ); + if ( iVertex.isValid() ) + isOk = _documentModel->updateVertex( iVertex, newX, newY, newZ ); + } + } else if ( _editMode == NEW_MODE){ + iVertex = _documentModel->addVertex( newX, newY, newZ ); + if ( iVertex.isValid() ) + isOk = true; + } + if (!isOk) { + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "VERTEX UPDATE/CONSTRUCTION" ) ); + return false; + } + + QString newName = name_le->text(); + if ( !newName.isEmpty() )/*{*/ + _documentModel->setName( iVertex, newName ); + + // to select/highlight result + result = patternDataModel->mapFromSource(iVertex); + + return isOk; +} + + +// ------------------------- EDGE ---------------------------------- + +// ============================================================== Constructeur +EdgeDialog::EdgeDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f), + _value(0) +{ + _helpFileName = "gui_edge.html"; + setupUi( this ); + _initWidget(editmode); + + rb0->setFocusProxy( v0_le_rb0 ); + rb1->setFocusProxy( vex_le_rb1 ); + rb0->click(); + + if ( editmode == INFO_MODE ){ + setWindowTitle( tr("Edge Information") ); + rb1->hide(); + } +} + + + +// ============================================================== Destructeur +EdgeDialog::~EdgeDialog() +{ +} + + +// ============================================================== _initInputWidget +void EdgeDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + installEventFilter(this); + + name_le->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + name_le->installEventFilter(this); + + v0_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v1_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v0_le_rb0->setValidator( validator ); + v1_le_rb0->setValidator( validator ); + v0_le_rb0->installEventFilter(this); + v1_le_rb0->installEventFilter(this); + + vex_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vec_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + vex_le_rb1->setValidator( validator ); + vec_le_rb1->setValidator( validator ); + vex_le_rb1->installEventFilter(this); + vec_le_rb1->installEventFilter(this); + + connect( name_le, SIGNAL(returnPressed()), this, SLOT(updateName()) ); +} + + +// ============================================================== Clear +void EdgeDialog::clear() +{ + name_le->clear(); + v0_le_rb0->clear(); + v1_le_rb0->clear(); + vex_le_rb1->clear(); + vec_le_rb1->clear(); +} + + + +// ============================================================== setValue +void EdgeDialog::setValue(HEXA_NS::Edge* e) +{ + HEXA_NS::Vertex* v0 = e->getVertex(0); + HEXA_NS::Vertex* v1 = e->getVertex(1); + + name_le->setText( e->getName() ); + v0_le_rb0->setText( v0->getName() ); + v1_le_rb0->setText( v1->getName() ); + + if ( _patternDataSelectionModel ){ + QModelIndex ie = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(e) ); + QModelIndex iv0 = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(v0) ); + QModelIndex iv1 = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(v1) ); + + name_le->setProperty( "QModelIndex", QVariant::fromValue(ie) ); + v0_le_rb0->setProperty( "QModelIndex", QVariant::fromValue(iv0) ); + v1_le_rb0->setProperty( "QModelIndex", QVariant::fromValue(iv1) ); + } + _value = e; +} + + +// ============================================================== getValue +HEXA_NS::Edge* EdgeDialog::getValue() +{ + return _value; +} + +// ============================================================== apply +bool EdgeDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iEdge; + + if ( rb0->isChecked() ){ + QModelIndex iv0 = patternDataModel->mapToSource( _index[v0_le_rb0] ); + QModelIndex iv1 = patternDataModel->mapToSource( _index[v1_le_rb0] ); + if ( iv0.isValid()&& iv1.isValid() ){ + iEdge = _documentModel->addEdgeVertices( iv0, iv1 ); + } + } else if ( rb1->isChecked() ){ + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le_rb1] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le_rb1] ); + if ( ivex.isValid() && ivec.isValid() ){ + iEdge = _documentModel->addEdgeVector( ivex, ivec ); + } + } + + if ( !iEdge.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT BUILD EDGE" ) ); + return false; + } + _value = iEdge.model()->data(iEdge, HEXA_DATA_ROLE).value(); + + QString newName = name_le->text(); + if ( !newName.isEmpty() )/*{*/ + _documentModel->setName( iEdge, newName ); + + result = patternDataModel->mapFromSource(iEdge); + + return true; +} + + +// ------------------------- QUAD ---------------------------------- + +// ============================================================== Constructeur +QuadDialog::QuadDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f), + _value(0) +{ + _helpFileName = "gui_quadrangle.html"; + setupUi( this ); + _initWidget(editmode); + rb0->setFocusProxy( v0_le_rb0 ); + rb1->setFocusProxy( e0_le_rb1 ); + rb0->click(); + + if ( editmode == INFO_MODE ){ + setWindowTitle( tr("Quad Information") ); + } +} + +// ============================================================== Destructeur +QuadDialog::~QuadDialog() +{ +} + +// ============================================================== _initInputWidget +void QuadDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + installEventFilter(this); + + name_le->setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + name_le->installEventFilter(this); + + v0_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v1_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v2_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v3_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + + v0_le_rb0->setValidator( validator ); + v1_le_rb0->setValidator( validator ); + v2_le_rb0->setValidator( validator ); + v3_le_rb0->setValidator( validator ); + v0_le_rb0->installEventFilter(this); + v1_le_rb0->installEventFilter(this); + v2_le_rb0->installEventFilter(this); + v3_le_rb0->installEventFilter(this); + + e0_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + e1_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + e2_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + e3_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + + e0_le_rb1->setValidator( validator ); + e1_le_rb1->setValidator( validator ); + e2_le_rb1->setValidator( validator ); + e3_le_rb1->setValidator( validator ); + + e0_le_rb1->installEventFilter(this); + e1_le_rb1->installEventFilter(this); + e2_le_rb1->installEventFilter(this); + e3_le_rb1->installEventFilter(this); + + connect( name_le, SIGNAL(returnPressed()), this, SLOT(updateName()) ); +} + + +// ============================================================== clear +void QuadDialog::clear() +{ + v0_le_rb0->clear(); + v1_le_rb0->clear(); + v2_le_rb0->clear(); + v3_le_rb0->clear(); + + e0_le_rb1->clear(); + e1_le_rb1->clear(); + e2_le_rb1->clear(); + e3_le_rb1->clear(); + + name_le->clear(); +} + + +// ============================================================== setValue +void QuadDialog::setValue(HEXA_NS::Quad* q) +{ + Q_ASSERT( q->countEdge() == 4 ); + Q_ASSERT( q->countVertex() == 4 ); + + //0) Name + name_le->setText( q->getName() ); + + //1) Vertices + HEXA_NS::Vertex* v0 = q->getVertex(0); + HEXA_NS::Vertex* v1 = q->getVertex(1); + HEXA_NS::Vertex* v2 = q->getVertex(2); + HEXA_NS::Vertex* v3 = q->getVertex(3); + + v0_le_rb0->setText( v0->getName() ); + v1_le_rb0->setText( v1->getName() ); + v2_le_rb0->setText( v2->getName() ); + v3_le_rb0->setText( v3->getName() ); + + + //2) Edges + HEXA_NS::Edge* e0 = q->getEdge(0); + HEXA_NS::Edge* e1 = q->getEdge(1); + HEXA_NS::Edge* e2 = q->getEdge(2); + HEXA_NS::Edge* e3 = q->getEdge(3); + + e0_le_rb1->setText( e0->getName() ); + e1_le_rb1->setText( e1->getName() ); + e2_le_rb1->setText( e2->getName() ); + e3_le_rb1->setText( e3->getName() ); + + if ( _patternDataSelectionModel ){ + QModelIndex iq = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(q) ); + + QModelIndex iv0 = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(v0) ); + QModelIndex iv1 = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(v1) ); + QModelIndex iv2 = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(v2) ); + QModelIndex iv3 = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(v3) ); + + QModelIndex ie0 = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(e0) ); + QModelIndex ie1 = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(e1) ); + QModelIndex ie2 = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(e2) ); + QModelIndex ie3 = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(e3) ); + + name_le->setProperty( "QModelIndex", QVariant::fromValue(iq) ); + + v0_le_rb0->setProperty( "QModelIndex", QVariant::fromValue(iv0) ); + v1_le_rb0->setProperty( "QModelIndex", QVariant::fromValue(iv1) ); + v2_le_rb0->setProperty( "QModelIndex", QVariant::fromValue(iv2) ); + v3_le_rb0->setProperty( "QModelIndex", QVariant::fromValue(iv3) ); + + e0_le_rb1->setProperty( "QModelIndex", QVariant::fromValue(ie0) ); + e1_le_rb1->setProperty( "QModelIndex", QVariant::fromValue(ie1) ); + e2_le_rb1->setProperty( "QModelIndex", QVariant::fromValue(ie2) ); + e3_le_rb1->setProperty( "QModelIndex", QVariant::fromValue(ie3) ); + } + _value = q; + +} + +// ============================================================== getValue +HEXA_NS::Quad* QuadDialog::getValue() +{ + return _value; +} + + +// ============================================================== apply +bool QuadDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternDataSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + if ( !patternDataModel ) return false; + _currentObj = NULL; + + QModelIndex iQuad; + + if ( rb0->isChecked() ){ //vertices + QModelIndex iv0 = patternDataModel->mapToSource( _index[v0_le_rb0] ); + QModelIndex iv1 = patternDataModel->mapToSource( _index[v1_le_rb0] ); + QModelIndex iv2 = patternDataModel->mapToSource( _index[v2_le_rb0] ); + QModelIndex iv3 = patternDataModel->mapToSource( _index[v3_le_rb0] ); + + if ( iv0.isValid() + && iv1.isValid() + && iv2.isValid() + && iv3.isValid() ){ + iQuad = _documentModel->addQuadVertices( iv0, iv1, iv2, iv3 ); + } + } else if ( rb1->isChecked() ){ //edges + QModelIndex ie0 = patternDataModel->mapToSource( _index[e0_le_rb1] ); + QModelIndex ie1 = patternDataModel->mapToSource( _index[e1_le_rb1] ); + QModelIndex ie2 = patternDataModel->mapToSource( _index[e2_le_rb1] ); + QModelIndex ie3 = patternDataModel->mapToSource( _index[e3_le_rb1] ); + + if ( ie0.isValid() + && ie1.isValid() + && ie2.isValid() + && ie3.isValid() ){ + iQuad = _documentModel->addQuadEdges( ie0, ie1, ie2, ie3 ); + } + } + + if ( !iQuad.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT BUILD QUAD" ) ); + return false; + } + _value = iQuad.model()->data(iQuad, HEXA_DATA_ROLE).value(); + + QString newName = name_le->text(); + if ( !newName.isEmpty() )/*{*/ + _documentModel->setName( iQuad, newName ); + + // to select/highlight result + result = patternDataModel->mapFromSource(iQuad); + + return true; +} + + + +// ------------------------- HEXA ---------------------------------- + +// ============================================================== HexaDialog + +HexaDialog::HexaDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f), + _value(0) +{ + _helpFileName = "gui_hexahedron.html"; + setupUi( this ); + _initWidget(editmode); + quads_rb->setFocusProxy( quads_lw ); + vertices_rb->setFocusProxy( vertices_lw ); + quads_rb->click(); + // quads_rb->setFocus(); + + if ( editmode == INFO_MODE ){ + setWindowTitle( tr("Hexahedron Information") ); + } +} + +// ============================================================== Destructeur +HexaDialog::~HexaDialog() +{ +} + + +// ============================================================== _initInputWidget +void HexaDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(HEXA_TREE) ); + installEventFilter(this); + + name_le->setProperty( "HexaWidgetType", QVariant::fromValue(HEXA_TREE) ); + name_le->installEventFilter(this); + + quads_lw->setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + quads_lw->installEventFilter(this); + + vertices_lw->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vertices_lw->installEventFilter(this); + + + if ( editmode != INFO_MODE ) { + // delete item from listwidget + QShortcut* delQuadShortcut = new QShortcut( QKeySequence(Qt::Key_X), quads_lw ); + QShortcut* delVertexShortcut = new QShortcut( QKeySequence(Qt::Key_X), vertices_lw ); + delQuadShortcut->setContext( Qt::WidgetShortcut ); + delVertexShortcut->setContext( Qt::WidgetShortcut ); + connect(delQuadShortcut, SIGNAL(activated()), this, SLOT(deleteQuadItem())); + connect(delVertexShortcut, SIGNAL(activated()), this, SLOT(deleteVertexItem())); + } + // edit name + connect( name_le, SIGNAL(returnPressed()), this, SLOT(updateName()) ); + // highlight item on model view (VTK) from listwidget + connect( quads_lw, SIGNAL(itemSelectionChanged()), this, SLOT(selectElementOfModel()) ); + connect( vertices_lw, SIGNAL(itemSelectionChanged()), this, SLOT(selectElementOfModel()) ); +} + +// ============================================================== clear +void HexaDialog::clear() +{ + name_le->clear(); + quads_lw->clear(); + vertices_lw->clear(); +} + +// ============================================================== updateButtonBox +void HexaDialog::updateButtonBox() +{ + if ( quads_rb->isChecked() ){ // build from quads count() must be between [2,6] + int nbQuads = quads_lw->count(); + //std::cout << "nbQuads => " << nbQuads << std::endl; + if ( nbQuads >= 2 && nbQuads <= 6 ){ + //_applyCloseButton->setEnabled(true); + _applyButton->setEnabled(true); + // _applyCloseButton->setFlat( false ); + // _applyButton->setFlat( false ); + } else { + //_applyCloseButton->setEnabled(false); + _applyButton->setEnabled(false); + // _applyCloseButton->setFlat( true ); + // _applyButton->setFlat( true ); + } + } else if ( vertices_rb->isChecked() ){ // build from vertices count() must be equals to 8 + int nbVertices = vertices_lw->count(); + //std::cout << "nbVertices => " << nbVertices << std::endl; + if ( nbVertices == 8 ){ + //_applyCloseButton->setEnabled(true); + _applyButton->setEnabled(true); + // _applyCloseButton->setFlat( false ); + // _applyButton->setFlat( false ); + } else { + //_applyCloseButton->setEnabled(false); + _applyButton->setEnabled(false); + // _applyCloseButton->setFlat( true ); + // _applyButton->setFlat( true ); + } + } +} + +// ============================================================== deleteQuadItem +void HexaDialog::deleteQuadItem() +{ + delete quads_lw->currentItem(); + updateButtonBox(); +} + +// ============================================================== deleteVertexItem +void HexaDialog::deleteVertexItem() +{ + delete vertices_lw->currentItem(); + updateButtonBox(); +} + +// ============================================================== _setValueQuads +void HexaDialog::_setValueQuads( HEXA_NS::Hexa* h ) +{ + QListWidgetItem *qItem = NULL; + HEXA_NS::Quad *q = NULL; + QModelIndex qIndex; + + quads_lw->clear(); + for( int i = 0; i <= 5; ++i ){ + q = h->getQuad(i); + qIndex = _patternDataSelectionModel->indexBy( HEXA_ENTRY_ROLE, QString::number(reinterpret_cast(q)) ); + qItem = new QListWidgetItem( q->getName() ); + qItem->setData( LW_QMODELINDEX_ROLE, QVariant::fromValue(qIndex) ); + quads_lw->addItem( qItem ); + } +} + +// ============================================================== _setValueVertices +void HexaDialog::_setValueVertices( HEXA_NS::Hexa* h ) +{ + QListWidgetItem *vItem = NULL; + HEXA_NS::Vertex* v = NULL; + QModelIndex vIndex; + + vertices_lw->clear(); + for( int i = 0; i <= 7; ++i ){ + v = h->getVertex(i); + vIndex = _patternDataSelectionModel->indexBy( HEXA_ENTRY_ROLE, QString::number(reinterpret_cast(v)) ); + vItem = new QListWidgetItem( v->getName() ); + vItem->setData( LW_QMODELINDEX_ROLE, QVariant::fromValue(vIndex) ); + vertices_lw->addItem( vItem ); + } +} + +// ============================================================== setValue +void HexaDialog::setValue(HEXA_NS::Hexa* h) +{ + // 0) name + name_le->setText( h->getName() ); + + if ( _patternDataSelectionModel){ + QModelIndex hIndex = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(h) ); + _setValueVertices(h); + _setValueQuads(h); + name_le->setProperty( "QModelIndex", QVariant::fromValue(hIndex) ); + } + _value = h; +} + +// ============================================================== getValue +HEXA_NS::Hexa* HexaDialog::getValue() +{ + return _value; +} + +// ============================================================== apply +bool HexaDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_documentModel ) return false; + if ( !_patternDataSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + if ( !patternDataModel ) return false; + _currentObj = NULL; + + QModelIndex iHexa; + + QListWidget* currentLw = NULL; + QListWidgetItem* item = NULL; + + if ( quads_rb->isChecked() ) + currentLw = dynamic_cast( quads_lw ); + else if ( vertices_rb->isChecked() ) + currentLw = dynamic_cast( vertices_lw ); + + QModelIndex iElt; + QModelIndexList iElts; + for ( int r = 0; r < currentLw->count(); ++r){ + item = currentLw->item(r); + iElt = patternDataModel->mapToSource( item->data(LW_QMODELINDEX_ROLE).value() ); + if ( iElt.isValid() ) + iElts << iElt; + } + + if ( quads_rb->isChecked() and (iElts.count()>=2 and iElts.count()<=6) ){ // build from quads iElts.count() should be between [2,6] + iHexa = _documentModel->addHexaQuads( iElts ); + } else if ( vertices_rb->isChecked() and iElts.count()== 8 ){ // build from vertices + iHexa = _documentModel->addHexaVertices( iElts[0], iElts[1], iElts[2], iElts[3], + iElts[4], iElts[5], iElts[6], iElts[7] ); + } + + if ( !iHexa.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT BUILD HEXA" ) ); + return false; + } + _value = iHexa.model()->data(iHexa, HEXA_DATA_ROLE).value(); + + QString newName = name_le->text(); + if ( !newName.isEmpty() )/*{*/ + _documentModel->setName( iHexa, newName ); + + // to select/highlight result + result = patternDataModel->mapFromSource(iHexa); + + return true; +} + + +// ------------------------- VECTOR ---------------------------------- + +// ============================================================== Constructeur + +VectorDialog::VectorDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f), + _value(0) +{ + _helpFileName = "gui_vector.html"; + setupUi( this ); + _initWidget(editmode); + + rb0->setFocusProxy( dx_spb_rb0 ); + rb1->setFocusProxy( v0_le_rb1 ); + rb0->click(); + // setFocusProxy( rb0 ); + + if ( editmode == INFO_MODE ){ + setWindowTitle( tr("Vector Information") ); + rb1->hide(); + } +} + +// ============================================================== Destructeur +VectorDialog::~VectorDialog() +{ +} + +// ============================================================== _initInputWidget +void VectorDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + installEventFilter(this); + + name_le->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + name_le->installEventFilter(this); + + v0_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v0_le_rb1->setValidator( validator ); + v0_le_rb1->installEventFilter(this); + + v1_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v1_le_rb1->setValidator( validator ); + v1_le_rb1->installEventFilter(this); + + if ( editmode == INFO_MODE ){ + dx_spb_rb0->setReadOnly(true); + dy_spb_rb0->setReadOnly(true); + dz_spb_rb0->setReadOnly(true); + } + + connect( name_le, SIGNAL(returnPressed()), this, SLOT(updateName()) ); +} + +// ============================================================== clear +void VectorDialog::clear() +{ + name_le->clear(); + dx_spb_rb0->clear(); + dy_spb_rb0->clear(); + dz_spb_rb0->clear(); + v0_le_rb1->clear(); + v1_le_rb1->clear(); +} + +// ============================================================== setValue +void VectorDialog::setValue(HEXA_NS::Vector* v) +{ + name_le->setText( v->getName() ); + dx_spb_rb0->setValue( v->getDx() ); + dy_spb_rb0->setValue( v->getDy() ); + dz_spb_rb0->setValue( v->getDz() ); + + if ( _patternDataSelectionModel ){ + QModelIndex ivec = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(v) ); + name_le->setProperty( "QModelIndex", QVariant::fromValue(ivec) ); + } + _value = v; +} + +// ============================================================== getValue +HEXA_NS::Vector* VectorDialog::getValue() +{ + return _value; +} + +// ============================================================== apply +bool VectorDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_documentModel ) return false; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iVector; + + if ( rb0->isChecked() ){ //scalar + double dx = dx_spb_rb0->value(); + double dy = dy_spb_rb0->value(); + double dz = dz_spb_rb0->value(); + + iVector = _documentModel->addVector( dx, dy, dz ); + } else if ( rb1->isChecked() ){ //vertices + QModelIndex iv0 = patternDataModel->mapToSource( _index[v0_le_rb1] ); + QModelIndex iv1 = patternDataModel->mapToSource( _index[v1_le_rb1] ); + + if ( iv0.isValid() + && iv1.isValid() ){ + iVector = _documentModel->addVectorVertices( iv0, iv1 ); + } + } + + if ( !iVector.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT BUILD VECTOR" ) ); + return false; + } + + _value = iVector.model()->data(iVector, HEXA_DATA_ROLE).value(); + + QString newName = name_le->text(); + if ( !newName.isEmpty() )/*{*/ + _documentModel->setName( iVector, newName ); + + // to select/highlight result + result = patternBuilderModel->mapFromSource(iVector); + + return true; +} + + +// ============================================================== Constructeur +CylinderDialog::CylinderDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f), + _value(0) +{ + _helpFileName = "gui_cyl.html"; + setupUi( this ); + _initWidget(editmode); + + if ( editmode == INFO_MODE ){ + setWindowTitle( tr("Cylinder Information") ); + } +} + +// ============================================================== Destructeur +CylinderDialog::~CylinderDialog() +{ +} + +// ============================================================== _initInputWidget +void CylinderDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(CYLINDER_TREE) ); + installEventFilter(this); + + name_le->setProperty( "HexaWidgetType", QVariant::fromValue(CYLINDER_TREE) ); + name_le->installEventFilter(this); + + vex_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vec_le->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + + vex_le->setValidator( validator ); + vec_le->setValidator( validator ); + + vex_le->installEventFilter(this); + vec_le->installEventFilter(this); + + connect( name_le, SIGNAL(returnPressed()), this, SLOT(updateName())); +} + +// ============================================================== clear +void CylinderDialog::clear() +{ + name_le->clear(); + vex_le->clear(); + vec_le->clear(); + r_spb->clear(); + h_spb->clear(); +} + +// ============================================================== setValue +void CylinderDialog::setValue(HEXA_NS::Cylinder* c) +{ + HEXA_NS::Vertex* base = c->getBase(); + HEXA_NS::Vector* direction = c->getDirection(); + double r = c->getRadius(); + double h = c->getHeight(); + + name_le->setText( c->getName() ); + vex_le->setText( base->getName() ); + vec_le->setText( direction->getName() ); + r_spb->setValue(r); + h_spb->setValue(h); + + if ( _patternDataSelectionModel ){ + QModelIndex iCyl = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(c) ); + QModelIndex iBase = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(base) ); + QModelIndex iDirection = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(direction) ); + + name_le->setProperty( "QModelIndex", QVariant::fromValue(iCyl) ); + vex_le->setProperty( "QModelIndex", QVariant::fromValue(iBase) ); + vec_le->setProperty( "QModelIndex", QVariant::fromValue(iDirection) ); + } + _value = c; +} + +// ============================================================== getValue +HEXA_NS::Cylinder* CylinderDialog::getValue() +{ + return _value; +} + + + +// ============================================================== apply +bool CylinderDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_documentModel ) return false; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iCyl; + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le] ); + double r = r_spb->value(); + double h = h_spb->value(); + + if ( ivex.isValid() + && ivec.isValid() ){ + iCyl = _documentModel->addCylinder( ivex, ivec, r, h ); + } + + if ( !iCyl.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT ADD CYLINDER" ) ); + return false; + } + + _value = iCyl.model()->data(iCyl, HEXA_DATA_ROLE).value(); + + QString newName = name_le->text(); + if (!newName.isEmpty()) /*{*/ + _documentModel->setName( iCyl, newName ); + + // to select/highlight result + result = patternBuilderModel->mapFromSource(iCyl); + + return true; +} + + +//------------------------------- PipeDialog ----------------------------------- + +// ============================================================== Constructeur + +PipeDialog::PipeDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f), + _value(0) +{ + _helpFileName = "gui_pipe.html"; + setupUi( this ); + _initWidget(editmode); + // setFocusProxy( vex_le ); + + if ( editmode == INFO_MODE ){ + setWindowTitle( tr("Pipe Information") ); + } + +} + +// ============================================================== Destructeur +PipeDialog::~PipeDialog() +{ +} + +// ============================================================== _initInputWidget +void PipeDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + + setProperty( "HexaWidgetType", QVariant::fromValue(PIPE_TREE) ); + installEventFilter(this); + + name_le->setProperty( "HexaWidgetType", QVariant::fromValue(PIPE_TREE) ); + name_le->installEventFilter(this); + + //Vertex Field config + vex_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vex_le->installEventFilter(this); + vex_le->setValidator( validator ); + + //Vector Field config + vec_le->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + vec_le->installEventFilter(this); + vec_le->setValidator( validator ); + + + if ( editmode == INFO_MODE ){ + ir_spb->setReadOnly(true); + er_spb->setReadOnly(true); + h_spb->setReadOnly(true); + } + + connect( name_le, SIGNAL(returnPressed()), this, SLOT(updateName())); +} + + +// ============================================================== clear +void PipeDialog::clear() +{ + name_le->clear(); + vex_le->clear(); + vec_le->clear(); +} + +// ============================================================== setValue +void PipeDialog::setValue(HEXA_NS::Pipe* p) +{ + HEXA_NS::Vertex* base = p->getBase(); + HEXA_NS::Vector* direction = p->getDirection(); + double ir = p->getInternalRadius(); + double er = p->getRadius(); + double h = p->getHeight(); + + name_le->setText( p->getName() ); + vex_le->setText( base->getName() ); + vec_le->setText( direction->getName() ); + ir_spb->setValue(ir); + er_spb->setValue(er); + h_spb->setValue(h); + + if ( _patternDataSelectionModel ){ + QModelIndex iPipe = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(p) ); + QModelIndex iBase = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(base) ); + QModelIndex iDirection = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(direction) ); + + name_le->setProperty( "QModelIndex", QVariant::fromValue(iPipe) ); + vex_le->setProperty( "QModelIndex", QVariant::fromValue(iBase) ); + vec_le->setProperty( "QModelIndex", QVariant::fromValue(iDirection) ); + } + _value = p; +} + +// ============================================================== getValue +HEXA_NS::Pipe* PipeDialog::getValue() +{ + return _value; +} + + +// ============================================================== apply +bool PipeDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iPipe; + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le] ); + double ir = ir_spb->value(); + double er = er_spb->value(); + double h = h_spb->value(); + + if (ir >= er) { + SUIT_MessageBox::information( this, tr( "CANNOT ADD PIPE" ), tr( "External radius must be greather than Internal radius!" ) ); + return false; + } + + + if ( ivex.isValid() + && ivec.isValid() ){ + iPipe = _documentModel->addPipe( ivex, ivec, ir, er, h ); + } + + if ( !iPipe.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT ADD PIPE" ) ); + return false; + } + _value = iPipe.model()->data(iPipe, HEXA_DATA_ROLE).value(); + + QString newName = name_le->text(); + if ( !newName.isEmpty() )/*{*/ + _documentModel->setName( iPipe, newName ); + + // to select/highlight result + result = patternBuilderModel->mapFromSource(iPipe); + + return true; +} + + +// ------------------------- MakeGridDialog ---------------------------------- +// ( Cartesian, Cylindrical, Spherical ) + +// ============================================================== Constructeur + +MakeGridDialog::MakeGridDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + setupUi( this ); + _initWidget(editmode); + rb0->click();// Default : cartesian grid + uniform_rb->click(); + rb0->setFocusProxy( vex_le_rb0 ); + rb1->setFocusProxy( center_le_rb1 ); + rb2->setFocusProxy( vex_le_rb2 ); + // setFocusProxy( rb0 ); + + _helpFileName = "creategrids.html#guicartgrid"; + connect( rb0, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb1, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb2, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); +} + + +// ============================================================== Destructeur +MakeGridDialog::~MakeGridDialog() +{ +} + +// ============================================================== _initInputWidget +void MakeGridDialog::_initInputWidget( Mode editmode ) +{ + + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + vex_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vec_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + vex_le_rb0->setValidator( validator ); + vec_le_rb0->setValidator( validator ); + vex_le_rb0->installEventFilter(this); + vec_le_rb0->installEventFilter(this); + + center_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + base_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + height_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + center_le_rb1->setValidator( validator ); + base_le_rb1->setValidator( validator ); + height_le_rb1->setValidator( validator ); + center_le_rb1->installEventFilter(this); + base_le_rb1->installEventFilter(this); + height_le_rb1->installEventFilter(this); + + vex_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vex_le_rb2->setValidator( validator ); + vex_le_rb2->installEventFilter(this); + + + if ( editmode != INFO_MODE ){ + //Cylindrical + radius_lw->setItemDelegate(new HexaPositiveDoubleSpinBoxDelegate(radius_lw)); + radius_lw->setEditTriggers(QAbstractItemView::DoubleClicked); + + angle_lw->setItemDelegate(new HexaAngleDoubleSpinBoxDelegate(angle_lw)); + angle_lw->setEditTriggers(QAbstractItemView::DoubleClicked); + + height_lw->setItemDelegate(new HexaPositiveDoubleSpinBoxDelegate(height_lw)); + height_lw->setEditTriggers(QAbstractItemView::DoubleClicked); + + connect( add_radius_pb, SIGNAL(clicked()), this, SLOT(addRadiusItem()) ); + connect( del_radius_pb, SIGNAL(clicked()), this, SLOT(delRadiusItem()) ); + connect( add_angle_pb, SIGNAL(clicked()), this, SLOT(addAngleItem()) ); + connect( del_angle_pb, SIGNAL(clicked()), this, SLOT(delAngleItem()) ); + connect( add_height_pb, SIGNAL(clicked()), this, SLOT(addHeightItem()) ); + connect( del_height_pb, SIGNAL(clicked()), this, SLOT(delHeightItem()) ); + } + +} + +// ============================================================== clear +void MakeGridDialog::clear() +{ + vex_le_rb0->clear(); + vec_le_rb0->clear(); + base_le_rb1->clear(); + center_le_rb1->clear(); + height_le_rb1->clear(); + random_param_w->clear(); + radius_lw->clear(); + angle_lw->clear(); + height_lw->clear(); + vex_le_rb2->clear(); +} + +// ============================================================== updateHelpFileName +void MakeGridDialog::updateHelpFileName() +{ + if ( sender() == rb0 ){ + _helpFileName = "creategrids.html#guicartgrid"; + } else if ( sender() == rb1 ){ + _helpFileName = "creategrids.html#guicylgrid"; + } else if ( sender() == rb2 ){ + _helpFileName = "creategrids.html#guisphergrid"; + } +} + + +// ============================================================== updateButtonBox +void MakeGridDialog::updateButtonBox() //CS_TODO? +{ + // int nbQuads = quads_lw->count(); + // int nbAngles = angles_lw->count(); + // + // if ( nbQuads>0 && nbAngles> 0 ){ + // _applyCloseButton->setEnabled(true); + // _applyButton->setEnabled(true); + // } else { + // _applyCloseButton->setEnabled(false); + // _applyButton->setEnabled(false); + // } + + // if ( rb0->isChecked() ){ //cartesian + // } else if ( rb1->isChecked() ){ //cylindrical + // nb_radius = radius_lw->item(r); + // nb_angle = angle_lw->item(r); + // nb_height = height_lw->item(r); + // } else if ( rb2->isChecked() ){ //spherical + // } +} + +// ============================================================== addRadiusItem +void MakeGridDialog::addRadiusItem() +{ + QListWidgetItem* previousItem = radius_lw->currentItem(); + QListWidgetItem* newItem = new QListWidgetItem(); + + double defaultValue = 0.; + if ( previousItem ) + defaultValue = previousItem->data(Qt::EditRole).toDouble(); + + newItem->setData( Qt::EditRole, QVariant(defaultValue) ); + newItem->setFlags( newItem->flags () | Qt::ItemIsEditable); + radius_lw->addItem(newItem); + + updateButtonBox(); +} + +// ============================================================== delRadiusItem +void MakeGridDialog::delRadiusItem() +{ + delete radius_lw->currentItem(); + updateButtonBox(); +} + +// ============================================================== addAngleItem +void MakeGridDialog::addAngleItem() +{ + QListWidgetItem* previousItem = angle_lw->currentItem(); + QListWidgetItem* newItem = new QListWidgetItem(); + + double defaultValue = 0.; + if ( previousItem ) + defaultValue = previousItem->data(Qt::EditRole).toDouble(); + + newItem->setData( Qt::EditRole, QVariant(defaultValue) ); + newItem->setFlags( newItem->flags () | Qt::ItemIsEditable); + angle_lw->addItem(newItem); + + updateButtonBox(); +} + +// ============================================================== delAngleItem +void MakeGridDialog::delAngleItem() +{ + //std::cout << "delAngleItem()" << std::endl; + delete angle_lw->currentItem(); + updateButtonBox(); +} + +// ============================================================== addHeightItem +void MakeGridDialog::addHeightItem() +{ + QListWidgetItem* previousItem = height_lw->currentItem(); + QListWidgetItem* newItem = new QListWidgetItem(); + + double defaultValue = 0.; + if ( previousItem ) + defaultValue = previousItem->data(Qt::EditRole).toDouble(); + + newItem->setData( Qt::EditRole, QVariant(defaultValue) ); + newItem->setFlags( newItem->flags () | Qt::ItemIsEditable); + height_lw->addItem(newItem); + + updateButtonBox(); +} + +// ============================================================== delHeightItem +void MakeGridDialog::delHeightItem() +{ + //std::cout << "delHeightItem()" << std::endl; + delete height_lw->currentItem(); + updateButtonBox(); +} + +// ============================================================== apply +bool MakeGridDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iNewElts; + if ( rb0->isChecked() ){ //cartesian + QModelIndex ivex_rb0 = patternDataModel->mapToSource( _index[vex_le_rb0] ); + QModelIndex ivec_rb0 = patternBuilderModel->mapToSource( _index[vec_le_rb0] ); + long nx = nx_spb_rb0->value(); + long ny = ny_spb_rb0->value(); + long nz = nz_spb_rb0->value(); + + if ( ivex_rb0.isValid() + && ivec_rb0.isValid() ){ + iNewElts = _documentModel->makeCartesian( ivex_rb0, ivec_rb0, nx, ny, nz ); + } + + } else if ( rb1->isChecked() ){ //cylindrical + QModelIndex icenter_rb1 = patternDataModel->mapToSource( _index[center_le_rb1] ); + QModelIndex ibase_rb1 = patternBuilderModel->mapToSource( _index[base_le_rb1] ); + QModelIndex iheight_rb1 = patternBuilderModel->mapToSource( _index[height_le_rb1] ); + + if ( icenter_rb1.isValid() + && ibase_rb1.isValid() + && iheight_rb1.isValid() ){ + + bool fill = fill_cb_rb1->isChecked(); + if ( uniform_rb->isChecked() ){ + double dr = dr_spb_rb1->value(); + double da = da_spb_rb1->value(); + double dl = dl_spb_rb1->value(); + double nr = nr_spb_rb1->value(); + double na = na_spb_rb1->value(); + double nl = nl_spb_rb1->value(); + + iNewElts = _documentModel->makeCylindrical( icenter_rb1, + ibase_rb1, iheight_rb1, + dr, da, dl, nr, na, nl, fill ); + } + if ( random_rb->isChecked() ){ + QListWidgetItem* item = NULL; + QDoubleSpinBox* spb = NULL; + + QList radius; + QList angles; + QList heights; + + for ( int r = 0; r < radius_lw->count(); ++r){ + item = radius_lw->item(r); + //std::cout << "radius : " << item->data(Qt::EditRole).toDouble()<< std::endl; + radius << item->data(Qt::EditRole).toDouble(); + } + + for ( int r = 0; r < angle_lw->count(); ++r){ + item = angle_lw->item(r); + angles << item->data(Qt::EditRole).toDouble(); + } + + for ( int r = 0; r < height_lw->count(); ++r){ + item = height_lw->item(r); + heights << item->data(Qt::EditRole).toDouble(); + } + + iNewElts = _documentModel->makeCylindricals( + icenter_rb1, ibase_rb1, iheight_rb1, + radius, angles, heights, + fill ); //NEW HEXA3 + + } + } + + } else if ( rb2->isChecked() ){ //spherical + QModelIndex ivex_rb2 = patternDataModel->mapToSource( _index[vex_le_rb2] ); + // QModelIndex ivecx_rb2 = patternBuilderModel->mapToSource( _index[vec_le_rb2] ); + double radius = radius_spb_rb2->value(); + int nb = nb_spb_rb2->value(); + int k = k_spb_rb2->value(); + + if ( ivex_rb2.isValid() ){ + iNewElts = _documentModel->makeSpherical( ivex_rb2, radius, nb, k ); + } + } + + if ( !iNewElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE GRID" ) ); + return false; + } + + + // to select/highlight result + result = patternBuilderModel->mapFromSource( iNewElts ); + + return true; +} + + + +// ============================================================== Constructeur + +MakeCylinderDialog::MakeCylinderDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_blocks_for_cyl_pipe.html#make-cylinder"; + setupUi( this ); + _initWidget(editmode); + // setFocusProxy( cyl_le ); +} + +// ============================================================== Destructeur +MakeCylinderDialog::~MakeCylinderDialog() +{ +} + +void MakeCylinderDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + cyl_le->setProperty( "HexaWidgetType", QVariant::fromValue(CYLINDER_TREE) ); + vec_le->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + cyl_le->setValidator( validator ); + vec_le->setValidator( validator ); + cyl_le->installEventFilter(this); + vec_le->installEventFilter(this); +} + +// ============================================================== clear +void MakeCylinderDialog::clear() +{ + cyl_le->clear(); + vec_le->clear(); +} + + +// ============================================================== apply +bool MakeCylinderDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternBuilderSelectionModel ) return false; + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iElts; + QModelIndex icyl = patternBuilderModel->mapToSource( _index[cyl_le] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le] ); + double nr = nr_spb->value(); + double na = na_spb->value(); + double nl = nl_spb->value(); + + if ( icyl.isValid() + && ivec.isValid() ){ + iElts = _documentModel->makeCylinder( icyl, ivec, nr, na, nl ); + } + + if ( !iElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE CYLINDER" ) ); + return false; + } + + // to select/highlight result + result = patternBuilderModel->mapFromSource(iElts); + + return true; +} + + +//---------------------------------- MakePipeDialog ----------------------------- + +// ============================================================== Constructeur + +MakePipeDialog::MakePipeDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_blocks_for_cyl_pipe.html#make-pipe"; + setupUi( this ); + _initWidget(editmode); + // setFocusProxy( pipe_le ); +} + +// ============================================================== Destructeur +MakePipeDialog::~MakePipeDialog() +{ +} + +// ============================================================== _initInputWidget +void MakePipeDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + pipe_le->setProperty( "HexaWidgetType", QVariant::fromValue(PIPE_TREE) ); + vec_le->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + + pipe_le->setValidator( validator ); + vec_le->setValidator( validator ); + + pipe_le->installEventFilter(this); + vec_le->installEventFilter(this); + +} + +// ============================================================== clear +void MakePipeDialog::clear() +{ + pipe_le->clear(); + vec_le->clear(); +} + + +// ============================================================== apply +bool MakePipeDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternBuilderSelectionModel ) return false; + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iElts; + QModelIndex ipipe = patternBuilderModel->mapToSource( _index[pipe_le] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le] ); + double nr = nr_spb->value(); + double na = na_spb->value(); + double nl = nl_spb->value(); + + if ( ipipe.isValid() + && ivec.isValid() ){ + iElts = _documentModel->makePipe( ipipe, ivec, nr, na, nl ); + } + if ( !iElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE PIPE" ) ); + return false; + } + + // to select/highlight result + result = patternBuilderModel->mapFromSource(iElts); + + return true; +} + +//---------------------------------- MakeCylindersDialog ----------------------------- + +// ============================================================== Constructeur + +MakeCylindersDialog::MakeCylindersDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_blocks_for_cyl_pipe.html#make-cylinders"; + setupUi( this ); + _initWidget(editmode); + // setFocusProxy( cyl1_le ); +} + +// ============================================================== Destructeur +MakeCylindersDialog::~MakeCylindersDialog() +{ +} + +void MakeCylindersDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(CROSSELEMENTS_TREE) ); + installEventFilter(this); + + cyl1_le->setProperty( "HexaWidgetType", QVariant::fromValue(CYLINDER_TREE) ); + cyl2_le->setProperty( "HexaWidgetType", QVariant::fromValue(CYLINDER_TREE) ); + + cyl1_le->setValidator( validator ); + cyl2_le->setValidator( validator ); + + cyl1_le->installEventFilter(this); + cyl2_le->installEventFilter(this); +} + +// ============================================================== clear +void MakeCylindersDialog::clear() +{ + cyl1_le->clear(); + cyl2_le->clear(); +} + + +// ============================================================== apply +bool MakeCylindersDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternBuilderSelectionModel ) return false; + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iCrossElts; + QModelIndex icyl1 = patternBuilderModel->mapToSource( _index[cyl1_le] ); + QModelIndex icyl2 = patternBuilderModel->mapToSource( _index[cyl2_le] ); + + if ( icyl1.isValid() + && icyl2.isValid() ){ + iCrossElts = _documentModel->makeCylinders( icyl1, icyl2 ); + } + + if ( !iCrossElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE CYLINDERS" ) ); + return false; + } + + // to select/highlight result + result = patternBuilderModel->mapFromSource(iCrossElts); + + return true; +} + + + +//---------------------------------- MakePipesDialog ----------------------------- + +// ============================================================== Constructeur + +MakePipesDialog::MakePipesDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_blocks_for_cyl_pipe.html#make-pipes"; + setupUi( this ); + _initWidget(editmode); + // setFocusProxy( pipe1_le ); +} + +// ============================================================== Destructeur +MakePipesDialog::~MakePipesDialog() +{ +} + +// ============================================================== _initInputWidget +void MakePipesDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + pipe1_le->setProperty( "HexaWidgetType", QVariant::fromValue(PIPE_TREE) ); + pipe2_le->setProperty( "HexaWidgetType", QVariant::fromValue(PIPE_TREE) ); + + pipe1_le->setValidator( validator ); + pipe2_le->setValidator( validator ); + + pipe1_le->installEventFilter(this); + pipe2_le->installEventFilter(this); +} + + +// ============================================================== clear +void MakePipesDialog::clear() +{ + pipe1_le->clear(); + pipe2_le->clear(); +} + + +// ============================================================== apply +bool MakePipesDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternBuilderSelectionModel ) return false; + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iCrossElts; + QModelIndex ipipe1 = patternBuilderModel->mapToSource( _index[pipe1_le] ); + QModelIndex ipipe2 = patternBuilderModel->mapToSource( _index[pipe2_le] ); + + if ( ipipe1.isValid() + && ipipe2.isValid() ){ + iCrossElts = _documentModel->makePipes( ipipe1, ipipe2 ); + } + if ( !iCrossElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE PIPES" ) ); + return false; + } + result = patternBuilderModel->mapFromSource(iCrossElts); + + return true; +} + + +//---------------------------------- RemoveHexaDialog ----------------------------- + +// ============================================================== Constructeur + +RemoveHexaDialog::RemoveHexaDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_remove.html"; + setupUi( this ); + _initWidget(editmode); + // setFocusProxy( hexa_le ); +} + + +// ============================================================== Destructeur +RemoveHexaDialog::~RemoveHexaDialog() +{ +} + +// ============================================================== _initInputWidget +void RemoveHexaDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + hexa_le->setProperty( "HexaWidgetType", QVariant::fromValue(HEXA_TREE) ); + hexa_le->setValidator( validator ); + hexa_le->installEventFilter(this); +} + +// ============================================================== clear +void RemoveHexaDialog::clear() +{ + hexa_le->clear(); +} + + +// ============================================================== apply +bool RemoveHexaDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternDataSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + if ( !patternDataModel ) return false; + _currentObj = NULL; + + QModelIndex ihexa = patternDataModel->mapToSource( _index[hexa_le] ); + + bool removed = false; + if ( ihexa.isValid() ){ + if ( connected_cb->isChecked() ){ + removed = _documentModel->removeConnectedHexa( ihexa ); + } else { + removed = _documentModel->removeHexa( ihexa ); + } + } + + if ( removed == false ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT REMOVE HEXA" ) ); + return false; + } + return true; +} + + +//---------------------------------- PrismQuadDialog ----------------------------- + +// ============================================================== Constructeur + +PrismQuadDialog::PrismQuadDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_prism_join_quad.html#prism-quadrangles"; + setupUi( this ); + _initWidget(editmode); + setFocusProxy( quads_lw ); +} + + +// ============================================================== Destructeur +PrismQuadDialog::~PrismQuadDialog() +{ +} + + +// ============================================================== _initInputWidget +void PrismQuadDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + vec_le->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + quads_lw->setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + + vec_le->setValidator( validator ); + + vec_le->installEventFilter(this); + quads_lw->installEventFilter(this); + + if ( editmode != INFO_MODE ){ + QShortcut* delQuadShortcut = new QShortcut( QKeySequence(Qt::Key_X), quads_lw ); + delQuadShortcut->setContext( Qt::WidgetShortcut ); + connect( delQuadShortcut, SIGNAL(activated()), this, SLOT(removeQuad()) ); + } + + connect( quads_lw, SIGNAL(itemSelectionChanged()), this, SLOT(selectElementOfModel()) ); +} + +// ============================================================== clear +void PrismQuadDialog::clear() +{ + vec_le->clear(); + quads_lw->clear(); +} + +// ============================================================== removeQuad +void PrismQuadDialog::removeQuad() +{ + QListWidgetItem *item = quads_lw->currentItem(); + + if (item) { + int r = quads_lw->row(item); + quads_lw->takeItem(r); + delete item; + } + +} + +// void PrismQuadDialog::clearQuads() +// { +// if (quads_lw->count() != 0) +// quads_lw->clear(); +// } + + +// ============================================================== apply +bool PrismQuadDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + ///// + QModelIndexList iquads; + QModelIndex iquad; + QListWidgetItem* item = NULL; + for ( int r = 0; r < quads_lw->count(); ++r){ + item = quads_lw->item(r); + iquad = patternDataModel->mapToSource( item->data(LW_QMODELINDEX_ROLE).value() ); + iquads << iquad; + } + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le] ); + + QModelIndex iElts; + if ( ivec.isValid() ){ + int nb = nb_spb->value(); + if ( iquads.count() == 1 ){ + iElts = _documentModel->prismQuad( iquads[0], ivec, nb ); + } else if ( iquads.count() > 1 ){ + iElts = _documentModel->prismQuads( iquads, ivec, nb ); + } + } + + if ( !iElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT PRISM QUAD(S)" ) ); + return false; + } + + result = patternBuilderModel->mapFromSource(iElts); + + return true; +} + +//---------------------------------- JoinQuadDialog ----------------------------- + +// ============================================================== Constructeur + +JoinQuadDialog::JoinQuadDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_prism_join_quad.html#join-quadrangles"; + setupUi( this ); + _initWidget(editmode); + // setFocusProxy( quads_lw ); +} + + +// ============================================================== Destructeur +JoinQuadDialog::~JoinQuadDialog() +{ +} + +// ============================================================== _initInputWidget +void JoinQuadDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + vex0_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vex1_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vex2_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vex3_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + quad_dest_le->setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + quads_lw->setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + + vex0_le->setValidator( validator ); + vex1_le->setValidator( validator ); + vex2_le->setValidator( validator ); + vex3_le->setValidator( validator ); + quad_dest_le->setValidator( validator ); + + vex0_le->installEventFilter(this); + vex1_le->installEventFilter(this); + vex2_le->installEventFilter(this); + vex3_le->installEventFilter(this); + quad_dest_le->installEventFilter(this); + quads_lw->installEventFilter(this); + + if ( editmode != INFO_MODE ){ + QShortcut* delQuadShortcut = new QShortcut( QKeySequence(Qt::Key_X), quads_lw ); + delQuadShortcut->setContext( Qt::WidgetShortcut ); + connect( delQuadShortcut, SIGNAL(activated()), this, SLOT(removeQuad()) ); + } + connect( quads_lw, SIGNAL(itemSelectionChanged()), this, SLOT(selectElementOfModel()) ); +} + + +// ============================================================== clear +void JoinQuadDialog::clear() +{ + quads_lw->clear(); + vex0_le->clear(); + vex2_le->clear(); + + + quad_dest_le->clear(); + vex1_le->clear(); + vex3_le->clear(); +} + + +// ============================================================== removeQuad +void JoinQuadDialog::removeQuad() +{ + QListWidgetItem *item = quads_lw->currentItem(); + + if (item) { + int r = quads_lw->row(item); + quads_lw->takeItem(r); + delete item; + } + +} + +// void JoinQuadDialog::clearQuads() +// { +// if (quads_lw->count() != 0) +// quads_lw->clear(); +// } + + +// ============================================================== apply +bool JoinQuadDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + ///// + QModelIndexList iquads; + QModelIndex iquad; + QListWidgetItem* item = NULL; + for ( int r = 0; r < quads_lw->count(); ++r){ + item = quads_lw->item(r); + iquad = patternDataModel->mapToSource( item->data(LW_QMODELINDEX_ROLE).value() ); + if ( iquad.isValid() ) iquads << iquad; + } + QModelIndex iquaddest = patternDataModel->mapToSource( _index[quad_dest_le] ); + QModelIndex ivex0 = patternDataModel->mapToSource( _index[vex0_le] ); + QModelIndex ivex1 = patternDataModel->mapToSource( _index[vex1_le] ); + QModelIndex ivex2 = patternDataModel->mapToSource( _index[vex2_le] ); + QModelIndex ivex3 = patternDataModel->mapToSource( _index[vex3_le] ); + + QModelIndex iElts; + if ( iquaddest.isValid() + && ivex0.isValid() + && ivex1.isValid() + && ivex2.isValid() + && ivex3.isValid() ){ + int nb = nb_spb->value(); + if ( iquads.count() == 1 ){ + iElts = _documentModel->joinQuad( iquads[0], iquaddest, + ivex0, ivex1, ivex2, ivex3, + nb ); + } else if ( iquads.count() > 1 ){ + iElts = _documentModel->joinQuads( iquads, iquaddest, + ivex0, ivex1, ivex2, ivex3, + nb ); + } + } + + if ( !iElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT JOIN QUAD(S)" ) ); + return false; + } + + result = patternBuilderModel->mapFromSource(iElts); + + return true; +} + + +// void JoinQuadDialog::reject() +// { +// QDialog::reject(); +// _disallowSelection(); +// } + + + +// ------------------------- MergeDialog ---------------------------------- + +// ============================================================== Constructeur + +MergeDialog::MergeDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + setupUi( this ); + _initWidget(editmode); + rb0->setFocusProxy( v0_le_rb0 ); + rb1->setFocusProxy( e0_le_rb1 ); + rb2->setFocusProxy( q0_le_rb2 ); + // setFocusProxy( rb0 ); + rb0->click(); + + _helpFileName = "gui_merge_elmts.html#merge-2-vertices"; + connect( rb0, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb1, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb2, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); +} + +// ============================================================== Destructeur +MergeDialog::~MergeDialog() +{ +} + +// ============================================================== _initInputWidget +void MergeDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + + v0_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v1_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v0_le_rb0->setValidator( validator ); + v1_le_rb0->setValidator( validator ); + v0_le_rb0->installEventFilter(this); + v1_le_rb0->installEventFilter(this); + + v0_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v1_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + e0_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + e1_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + + v0_le_rb1->setValidator( validator ); + v1_le_rb1->setValidator( validator ); + e0_le_rb1->setValidator( validator ); + e1_le_rb1->setValidator( validator ); + + v0_le_rb1->installEventFilter(this); + v1_le_rb1->installEventFilter(this); + e0_le_rb1->installEventFilter(this); + e1_le_rb1->installEventFilter(this); + + + v0_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v1_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v2_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + v3_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + q0_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + q1_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + + + v0_le_rb2->setValidator( validator ); + v1_le_rb2->setValidator( validator ); + v2_le_rb2->setValidator( validator ); + v3_le_rb2->setValidator( validator ); + q0_le_rb2->setValidator( validator ); + q1_le_rb2->setValidator( validator ); + + v0_le_rb2->installEventFilter(this); + v1_le_rb2->installEventFilter(this); + v2_le_rb2->installEventFilter(this); + v3_le_rb2->installEventFilter(this); + q0_le_rb2->installEventFilter(this); + q1_le_rb2->installEventFilter(this); +} + + +// ============================================================== clear +void MergeDialog::clear() +{ + v0_le_rb0->clear(); + v1_le_rb0->clear(); + v0_le_rb1->clear(); + v1_le_rb1->clear(); + v0_le_rb2->clear(); + v1_le_rb2->clear(); + v2_le_rb2->clear(); + v3_le_rb2->clear(); + e0_le_rb1->clear(); + e1_le_rb1->clear(); + q0_le_rb2->clear(); + q1_le_rb2->clear(); +} + +// ============================================================== updateHelpFileName +void MergeDialog::updateHelpFileName() +{ + if ( sender() == rb0 ){ + _helpFileName = "gui_merge_elmts.html#merge-2-vertices"; + } else if ( sender() == rb1 ){ + _helpFileName = "gui_merge_elmts.html#merge-2-edges"; + } else if ( sender() == rb2 ){ + _helpFileName = "gui_merge_elmts.html#merge-2-quadrangles"; + } +} + + +// ============================================================== apply +bool MergeDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_patternDataSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + if ( !patternDataModel ) return false; + _currentObj = NULL; + + bool merged = false; + + if ( rb0->isChecked() ){ + QModelIndex iv0 = patternDataModel->mapToSource( _index[v0_le_rb0] ); + QModelIndex iv1 = patternDataModel->mapToSource( _index[v1_le_rb0] ); + + if ( iv0.isValid() + && iv1.isValid() ){ + merged = _documentModel->mergeVertices( iv0, iv1 ); + } + } else if ( rb1->isChecked() ){ + QModelIndex ie0 = patternDataModel->mapToSource( _index[e0_le_rb1] ); + QModelIndex ie1 = patternDataModel->mapToSource( _index[e1_le_rb1] ); + QModelIndex iv0 = patternDataModel->mapToSource( _index[v0_le_rb1] ); + QModelIndex iv1 = patternDataModel->mapToSource( _index[v1_le_rb1] ); + + if ( ie0.isValid() + && ie1.isValid() + && iv0.isValid() + && iv1.isValid() ){ + merged = _documentModel->mergeEdges( ie0, ie1, iv0, iv1); + } + } else if ( rb2->isChecked() ){ + + QModelIndex iq0 = patternDataModel->mapToSource( _index[q0_le_rb2] ); + QModelIndex iq1 = patternDataModel->mapToSource( _index[q1_le_rb2] ); + QModelIndex iv0 = patternDataModel->mapToSource( _index[v0_le_rb2] ); + QModelIndex iv1 = patternDataModel->mapToSource( _index[v1_le_rb2] ); + QModelIndex iv2 = patternDataModel->mapToSource( _index[v2_le_rb2] ); + QModelIndex iv3 = patternDataModel->mapToSource( _index[v3_le_rb2] ); + + if ( iq0.isValid() + && iq1.isValid() + && iv0.isValid() + && iv1.isValid() + && iv2.isValid() + && iv3.isValid() ){ + merged = _documentModel->mergeQuads( iq0, iq1, + iv0, iv1, iv2, iv3 ); + } + } + + if ( merged == false ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MERGE" ) ); + return false; + } + + return true; +} + + +// ------------------------- DisconnectDialog ---------------------------------- + +// ============================================================== Constructeur + +DisconnectDialog::DisconnectDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + setupUi( this ); + _initWidget(editmode); + rb0->setFocusProxy( v_le_rb0 ); + rb1->setFocusProxy( e_le_rb1 ); + rb2->setFocusProxy( q_le_rb2 ); + rb3->setFocusProxy( d_edges_lw); + rb0->click(); + // setFocusProxy( rb0 ); + + _helpFileName = "gui_disc_elmts.html#disconnect-a-vertex"; + + connect( rb0, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb1, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb2, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb3, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); +} + +// ============================================================== Destructeur +DisconnectDialog::~DisconnectDialog() +{ +} + +// ============================================================== _initInputWidget +void DisconnectDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + //vertex + v_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + h_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(HEXA_TREE) ); + v_le_rb0->setValidator( validator ); + h_le_rb0->setValidator( validator ); + v_le_rb0->installEventFilter(this); + h_le_rb0->installEventFilter(this); + + //edge + e_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + h_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(HEXA_TREE) ); + e_le_rb1->setValidator( validator ); + h_le_rb1->setValidator( validator ); + e_le_rb1->installEventFilter(this); + h_le_rb1->installEventFilter(this); + + //quad + q_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + h_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(HEXA_TREE) ); + q_le_rb2->setValidator( validator ); + h_le_rb2->setValidator( validator ); + q_le_rb2->installEventFilter(this); + h_le_rb2->installEventFilter(this); + + //edges + d_edges_lw->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + hexas_lw->setProperty( "HexaWidgetType", QVariant::fromValue(HEXA_TREE) ); + d_edges_lw->installEventFilter(this); + hexas_lw->installEventFilter(this); + + QShortcut* delEdgeShortcut = new QShortcut(QKeySequence(/*Qt::Key_Delete*/Qt::Key_X/*Qt::Key_Alt*//*Qt::Key_Space*/), d_edges_lw); + QShortcut* delHexaShortcut = new QShortcut(QKeySequence(/*Qt::Key_Delete*/Qt::Key_X/*Qt::Key_Alt*//*Qt::Key_Space*/), hexas_lw); + delEdgeShortcut->setContext( Qt::WidgetShortcut ); + delHexaShortcut->setContext( Qt::WidgetShortcut ); + + connect( d_edges_lw, SIGNAL(itemSelectionChanged()), this, SLOT(selectElementOfModel()) ); + connect( hexas_lw, SIGNAL(itemSelectionChanged()), this, SLOT(selectElementOfModel()) ); + connect( delEdgeShortcut, SIGNAL(activated()), this, SLOT(deleteEdgeItem()) ); + connect( delHexaShortcut, SIGNAL(activated()), this, SLOT(deleteHexaItem()) ); + +} + + +// ============================================================== clear +void DisconnectDialog::clear() +{ + v_le_rb0->clear(); + e_le_rb1->clear(); + q_le_rb2->clear(); + h_le_rb0->clear(); + h_le_rb1->clear(); + h_le_rb2->clear(); + d_edges_lw->clear(); + hexas_lw->clear(); +} + +// ============================================================== deleteEdgeItem +void DisconnectDialog::deleteEdgeItem() +{ + delete d_edges_lw->currentItem(); +} + +// ============================================================== deleteHexaItem +void DisconnectDialog::deleteHexaItem() +{ + delete hexas_lw->currentItem(); +} + + +// ============================================================== updateHelpFileName +void DisconnectDialog::updateHelpFileName() +{ + if ( sender() == rb0 ){ + _helpFileName = "gui_disc_elmts.html#disconnect-a-vertex"; + } else if ( sender() == rb1 ){ + _helpFileName = "gui_disc_elmts.html#disconnect-an-edge"; + } else if ( sender() == rb2 ){ + _helpFileName = "gui_disc_elmts.html#disconnect-a-quadrangle"; + } else if (sender() == rb3 ){ + _helpFileName = "gui_disc_elmts.html#disconnect-edges"; + } +} + + +// ============================================================== apply +bool DisconnectDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iElts; + + if ( rb0->isChecked() ){ + QModelIndex ihexa = patternDataModel->mapToSource( _index[h_le_rb0] ); + QModelIndex ivex = patternDataModel->mapToSource( _index[v_le_rb0] ); + + if ( ihexa.isValid() + && ivex.isValid() ){ + iElts = _documentModel->disconnectVertex( ihexa, ivex ); + } + } else if ( rb1->isChecked() ){ + QModelIndex ihexa = patternDataModel->mapToSource( _index[h_le_rb1] ); + QModelIndex iedge = patternDataModel->mapToSource( _index[e_le_rb1] ); + + if ( ihexa.isValid() + && iedge.isValid() ){ + iElts = _documentModel->disconnectEdge( ihexa, iedge ); + } + } else if ( rb2->isChecked() ){ + QModelIndex ihexa = patternDataModel->mapToSource( _index[h_le_rb2] ); + QModelIndex iquad = patternDataModel->mapToSource( _index[q_le_rb2] ); + + if ( ihexa.isValid() + && iquad.isValid() ){ + iElts = _documentModel->disconnectQuad( ihexa, iquad ); + } + } else if ( rb3->isChecked() ){ // + + QModelIndex iedge, ihexa; + QModelIndexList iedges, ihexas; + QListWidgetItem* item = NULL; + + //Liste des edges + for (int r = 0; r < d_edges_lw->count(); ++r){ + item = d_edges_lw->item(r); + iedge = patternDataModel->mapToSource( item->data(LW_QMODELINDEX_ROLE).value() ); + if ( iedge.isValid() ) + iedges << iedge; + } + + //Liste des hexas + for (int r = 0; r < hexas_lw->count(); ++r){ + item = hexas_lw->item(r); + ihexa = patternDataModel->mapToSource( item->data(LW_QMODELINDEX_ROLE).value() ); + if ( ihexa.isValid() ) + ihexas << ihexa; + } + + iElts = _documentModel->disconnectEdges( ihexas, iedges ); + } + + if ( !iElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT DISCONNECT" ) ); + return false; + } + + result = patternBuilderModel->mapFromSource(iElts); + + return true; +} + + + + +// ------------------------- CutEdgeDialog ---------------------------------- + +// ============================================================== Constructeur + +CutEdgeDialog::CutEdgeDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_cut_hexa.html"; + setupUi( this ); + _initWidget(editmode); + // setFocusProxy( e_le ); +} + +// ============================================================== Destructeur +CutEdgeDialog::~CutEdgeDialog() +{ +} + +// ============================================================== _initInputWidget +void CutEdgeDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + e_le->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + e_le->setValidator( validator ); + e_le->installEventFilter(this); +} + +// ============================================================== clear +void CutEdgeDialog::clear() +{ + e_le->clear(); +} + + +// ============================================================== apply +bool CutEdgeDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + int nbCut = nb_cut_spb->value(); + QModelIndex iedge = patternDataModel->mapToSource( _index[e_le] ); + + QModelIndex iElts; + if ( iedge.isValid() ){ + iElts = _documentModel->cutEdge( iedge, nbCut ); + } + + if ( !iElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT CUT EDGE" ) ); + return false; + } + + result = patternBuilderModel->mapFromSource(iElts); + + return true; +} + + + + +// // ------------------------- MakeTransformationDialog ---------------------------------- + +// ============================================================== Constructeur + +MakeTransformationDialog::MakeTransformationDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + setupUi( this ); + _initWidget(editmode); + rb0->setFocusProxy( elts_le_rb0 ); + rb1->setFocusProxy( elts_le_rb1 ); + rb2->setFocusProxy( elts_le_rb2 ); + setFocusProxy( rb0 ); + rb0->click(); + + _helpFileName = "gui_make_elmts.html#make-elements-by-translation"; + connect( rb0, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb1, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb2, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); +} + +// ============================================================== Destructeur +MakeTransformationDialog::~MakeTransformationDialog() +{ +} + +// ============================================================== _initInputWidget +void MakeTransformationDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + vec_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + elts_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + + vec_le_rb0->setValidator( validator ); + elts_le_rb0->setValidator( validator ); + vec_le_rb0->installEventFilter(this); + elts_le_rb0->installEventFilter(this); + + vex_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + elts_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + vex_le_rb1->setValidator( validator ); + elts_le_rb1->setValidator( validator ); + vex_le_rb1->installEventFilter(this); + elts_le_rb1->installEventFilter(this); + + vex_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vec_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + elts_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + vex_le_rb2->setValidator( validator ); + vec_le_rb2->setValidator( validator ); + elts_le_rb2->setValidator( validator ); + vex_le_rb2->installEventFilter(this); + vec_le_rb2->installEventFilter(this); + elts_le_rb2->installEventFilter(this); + +} + +// ============================================================== clear +void MakeTransformationDialog::clear() +{ + vex_le_rb1->clear(); + vex_le_rb2->clear(); + vec_le_rb0->clear(); + vec_le_rb2->clear(); + elts_le_rb0->clear(); + elts_le_rb1->clear(); + elts_le_rb2->clear(); +} + + +// ============================================================== updateHelpFileName +void MakeTransformationDialog::updateHelpFileName() +{ + if ( sender() == rb0 ){ + _helpFileName = "gui_make_elmts.html#make-elements-by-translation"; + } else if ( sender() == rb1 ){ + _helpFileName = "gui_make_elmts.html#make-elements-by-scaling"; + } else if ( sender() == rb2 ){ + _helpFileName = "gui_make_elmts.html#make-elements-by-rotation"; + } +} + +// ============================================================== apply +bool MakeTransformationDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iNewElts; + + if ( rb0->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb0] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le_rb0] ); + + if ( ielts.isValid() + && ivec.isValid() ) + iNewElts = _documentModel->makeTranslation( ielts, ivec ); + + } else if ( rb1->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb1] ); + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le_rb1] ); + double k = k_spb->value(); + + if ( ielts.isValid() + && ivex.isValid() ) + iNewElts = _documentModel->makeScale( ielts, ivex, k ); + + } else if ( rb2->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb2] ); + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le_rb2] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le_rb2] ); + double angle = angle_spb->value(); + + if ( ielts.isValid() + && ivex.isValid() + && ivec.isValid() ) + iNewElts = _documentModel->makeRotation( ielts, ivex, ivec, angle ); + } + + if ( !iNewElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE TRANSFORMATION" ) ); + return false; + } + + result = patternBuilderModel->mapFromSource(iNewElts); + + return true; +} + + + +// // ------------------------- MakeSymmetryDialog ---------------------------------- + +// ============================================================== Constructeur + +MakeSymmetryDialog::MakeSymmetryDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f) +{ + setupUi( this ); + _initWidget(editmode); + rb0->setFocusProxy( elts_le_rb0 ); + rb1->setFocusProxy( elts_le_rb1 ); + rb2->setFocusProxy( elts_le_rb2 ); + rb0->click(); + // setFocusProxy( rb0 ); + + _helpFileName = "gui_make_symmetry.html#make-elements-by-point-symmetry"; + connect( rb0, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb1, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb2, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); +} + + +// ============================================================== Destructeur +MakeSymmetryDialog::~MakeSymmetryDialog() +{ +} + +// ============================================================== _initInputWidget +void MakeSymmetryDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + vex_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + elts_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + vex_le_rb0->setValidator( validator ); + elts_le_rb0->setValidator( validator ); + vex_le_rb0->installEventFilter(this); + elts_le_rb0->installEventFilter(this); + + vex_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vec_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + elts_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + vex_le_rb1->setValidator( validator ); + vec_le_rb1->setValidator( validator ); + elts_le_rb1->setValidator( validator ); + vex_le_rb1->installEventFilter(this); + vec_le_rb1->installEventFilter(this); + elts_le_rb1->installEventFilter(this); + + + vex_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vec_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + elts_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + vex_le_rb2->setValidator( validator ); + vec_le_rb2->setValidator( validator ); + elts_le_rb2->setValidator( validator ); + vex_le_rb2->installEventFilter(this); + vec_le_rb2->installEventFilter(this); + elts_le_rb2->installEventFilter(this); + +} + +// ============================================================== clear +void MakeSymmetryDialog::clear() +{ + vex_le_rb0->clear(); + vex_le_rb1->clear(); + vex_le_rb2->clear(); + + vec_le_rb1->clear(); + vec_le_rb2->clear(); + + elts_le_rb0->clear(); + elts_le_rb1->clear(); + elts_le_rb2->clear(); +} + + +// ============================================================== updateHelpFileName +void MakeSymmetryDialog::updateHelpFileName() +{ + if ( sender() == rb0 ){ + _helpFileName = "gui_make_symmetry.html#make-elements-by-point-symmetry"; + } else if ( sender() == rb1 ){ + _helpFileName = "gui_make_symmetry.html#make-elements-by-line-symmetry"; + } else if ( sender() == rb2 ){ + _helpFileName = "gui_make_symmetry.html#make-elements-by-plan-symmetry"; + } +} + + +// ============================================================== apply +bool MakeSymmetryDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex iNewElts; + + if ( rb0->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb0] ); + QModelIndex ivex = patternBuilderModel->mapToSource( _index[vex_le_rb0] ); + + if ( ielts.isValid() + && ivex.isValid() ) + iNewElts = _documentModel->makeSymmetryPoint( ielts, ivex ); + + } else if ( rb1->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb1] ); + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le_rb1] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le_rb1] ); + + if ( ielts.isValid() + && ivex.isValid() + && ivec.isValid() ) + iNewElts = _documentModel->makeSymmetryLine( ielts, ivex, ivec ); + + } else if ( rb2->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb2] ); + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le_rb2] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le_rb2] ); + + if ( ielts.isValid() + && ivex.isValid() + && ivec.isValid() ) + iNewElts = _documentModel->makeSymmetryPlane( ielts, ivex, ivec ); + } + + if ( !iNewElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE TRANSFORMATION" ) ); + return false; + } + + result = patternBuilderModel->mapFromSource(iNewElts); + + return true; +} + + + + + +// // ------------------------- PerformTransformationDialog ---------------------------------- + +// ============================================================== Constructeur + +PerformTransformationDialog::PerformTransformationDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f) +{ + setupUi( this ); + _initWidget(editmode); + rb0->setFocusProxy( elts_le_rb0 ); + rb1->setFocusProxy( elts_le_rb1 ); + rb2->setFocusProxy( elts_le_rb2 ); + // setFocusProxy( rb0 ); + rb0->click(); + + _helpFileName = "gui_modify_elmts.html#modify-elements-by-translation"; + connect( rb0, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb1, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb2, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); +} + + +// ============================================================== Destructeur +PerformTransformationDialog::~PerformTransformationDialog() +{ +} + +// ============================================================== _initInputWidget +void PerformTransformationDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + vec_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + elts_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + vec_le_rb0->setValidator( validator ); + elts_le_rb0->setValidator( validator ); + vec_le_rb0->installEventFilter(this); + elts_le_rb0->installEventFilter(this); + + vex_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + elts_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + vex_le_rb1->setValidator( validator ); + elts_le_rb1->setValidator( validator ); + vex_le_rb1->installEventFilter(this); + elts_le_rb1->installEventFilter(this); + + + vex_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vec_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + elts_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + vex_le_rb2->setValidator( validator ); + vec_le_rb2->setValidator( validator ); + elts_le_rb2->setValidator( validator ); + vex_le_rb2->installEventFilter(this); + vec_le_rb2->installEventFilter(this); + elts_le_rb2->installEventFilter(this); + +} + +// ============================================================== clear +void PerformTransformationDialog::clear() +{ + vex_le_rb1->clear(); vex_le_rb2->clear(); + vec_le_rb0->clear(); vec_le_rb2->clear(); + elts_le_rb0->clear(); elts_le_rb1->clear(); elts_le_rb2->clear(); +} + +// ============================================================== updateHelpFileName +void PerformTransformationDialog::updateHelpFileName() +{ + if ( sender() == rb0 ){ + _helpFileName = "gui_modify_elmts.html#modify-elements-by-translation"; + } else if ( sender() == rb1 ){ + _helpFileName = "gui_modify_elmts.html#modify-elements-by-scaling"; + } else if ( sender() == rb2 ){ + _helpFileName = "gui_modify_elmts.html#modify-elements-by-rotation"; + } +} + + +// ============================================================== apply +bool PerformTransformationDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + bool performed = false; + + if ( rb0->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb0] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le_rb0] ); + + if ( ielts.isValid() + && ivec.isValid() ) + performed = _documentModel->performTranslation( ielts, ivec ); + + } else if ( rb1->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb1] ); + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le_rb1] ); + double k = k_spb->value(); + + if ( ielts.isValid() + && ivex.isValid() ) + performed = _documentModel->performScale( ielts, ivex, k ); + + } else if ( rb2->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb2] ); + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le_rb2] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le_rb2] ); + double angle = angle_spb->value(); + + if ( ielts.isValid() + && ivex.isValid() + && ivec.isValid() ) + performed = _documentModel->performRotation( ielts, ivex, ivec, angle ); + } + + if ( performed == false){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT PERFORM TRANSFORMATION" ) ); + return false; + } + + + return true; +} + + + + + +// // ------------------------- PerformSymmetryDialog ---------------------------------- + +// ============================================================== Constructeur + +PerformSymmetryDialog::PerformSymmetryDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f) +{ + setupUi( this ); + _initWidget( editmode ); + rb0->setFocusProxy( elts_le_rb0 ); + rb1->setFocusProxy( elts_le_rb1 ); + rb2->setFocusProxy( elts_le_rb2 ); + // setFocusProxy( rb0 ); + rb0->click(); + + _helpFileName = "gui_modify_symmetry.html#modify-elements-by-point-symmetry"; + connect( rb0, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb1, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); + connect( rb2, SIGNAL(clicked()), this, SLOT(updateHelpFileName()) ); +} + +// ============================================================== Destructeur +PerformSymmetryDialog::~PerformSymmetryDialog() +{ +} + +// ============================================================== _initInputWidget +void PerformSymmetryDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + vex_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + elts_le_rb0->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + vex_le_rb0->setValidator( validator ); + elts_le_rb0->setValidator( validator ); + vex_le_rb0->installEventFilter(this); + elts_le_rb0->installEventFilter(this); + + vex_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vec_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + elts_le_rb1->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + vex_le_rb1->setValidator( validator ); + vec_le_rb1->setValidator( validator ); + elts_le_rb1->setValidator( validator ); + vex_le_rb1->installEventFilter(this); + vec_le_rb1->installEventFilter(this); + elts_le_rb1->installEventFilter(this); + + + vex_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + vec_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + elts_le_rb2->setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + vex_le_rb2->setValidator( validator ); + vec_le_rb2->setValidator( validator ); + elts_le_rb2->setValidator( validator ); + vex_le_rb2->installEventFilter(this); + vec_le_rb2->installEventFilter(this); + elts_le_rb2->installEventFilter(this); + +} + +// ============================================================== clear +void PerformSymmetryDialog::clear() +{ + vex_le_rb0->clear(); vex_le_rb1->clear(); vex_le_rb2->clear(); + vec_le_rb1->clear(); vec_le_rb2->clear(); + elts_le_rb0->clear(); elts_le_rb1->clear(); elts_le_rb2->clear(); +} + +// ============================================================== updateHelpFileName +void PerformSymmetryDialog::updateHelpFileName() +{ + if ( sender() == rb0 ){ + _helpFileName = "gui_modify_symmetry.html#modify-elements-by-point-symmetry"; + } else if ( sender() == rb1 ){ + _helpFileName = "gui_modify_symmetry.html#modify-elements-by-line-symmetry"; + } else if ( sender() == rb2 ){ + _helpFileName = "gui_modify_symmetry.html#modify-elements-by-plan-symmetry"; + } +} + +// ============================================================== apply +bool PerformSymmetryDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + bool performed = false; + + if ( rb0->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb0] ); + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le_rb0] ); + + if ( ielts.isValid() + && ivex.isValid() ) + performed = _documentModel->performSymmetryPoint( ielts, ivex ); + + } else if ( rb1->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb1] ); + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le_rb1] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le_rb1] ); + + if ( ielts.isValid() + && ivex.isValid() + && ivec.isValid() ) + performed = _documentModel->performSymmetryLine( ielts, ivex, ivec ); + + } else if ( rb2->isChecked() ){ + QModelIndex ielts = patternBuilderModel->mapToSource( _index[elts_le_rb2] ); + QModelIndex ivex = patternDataModel->mapToSource( _index[vex_le_rb2] ); + QModelIndex ivec = patternBuilderModel->mapToSource( _index[vec_le_rb2] ); + + if ( ielts.isValid() + && ivex.isValid() + && ivec.isValid() ) + performed = _documentModel->performSymmetryPlane( ielts, ivex, ivec ); + } + + if ( performed == false ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT PERFORM SYMMETRY" ) ); + return false; + } + + return true; +} + + + +// // ------------------------- EdgeAssocDialog ---------------------------------- + +// ============================================================== Constructeur + +EdgeAssocDialog::EdgeAssocDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog( parent, editmode, f ) +{ + _helpFileName ="gui_asso_quad_to_geom.html#associate-to-edges-or-wires-of-the-geometry"; + setupUi( this ); + _initWidget(editmode); + _initViewManager(); + setFocusProxy( edges_lw ); + + myLine.nullify(); + + _currentParameter = 0.; + single_rb->click(); +} + +// ============================================================== Destructeur +EdgeAssocDialog::~EdgeAssocDialog() +{ + // disconnect( delEdgeShortcut, SIGNAL(activated()), this, SLOT(deleteEdgeItem()) ); + // disconnect( delLineShortcut, SIGNAL(activated()), this, SLOT(deleteLineItem()) ); + disconnect( HEXABLOCKGUI::selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(addLine()) ); + disconnect( pstart_spb, SIGNAL(valueChanged(double)), this, SLOT( pstartChanged(double)) ); + disconnect( pend_spb, SIGNAL(valueChanged(double)), this, SLOT( pendChanged(double)) ); +} + + +// ============================================================== _initInputWidget +void EdgeAssocDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + //model + first_vex_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + first_vex_le->installEventFilter(this); + first_vex_le->setValidator( validator ); + + single_edge_le->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + single_edge_le->installEventFilter(this); + + edges_lw->setProperty( "HexaWidgetType", QVariant::fromValue(EDGE_TREE) ); + edges_lw->installEventFilter(this); + + + //geom + lines_lw->setProperty( "GeomWidgetType", QVariant::fromValue(TopAbs_EDGE) ); + lines_lw->installEventFilter(this); + + single_line_le->setProperty( "GeomWidgetType", QVariant::fromValue(TopAbs_EDGE) ); + single_line_le->installEventFilter(this); + + + QShortcut* delEdgeShortcut = new QShortcut(QKeySequence(/*Qt::Key_Delete*/Qt::Key_X), edges_lw); + QShortcut* delLineShortcut = new QShortcut(QKeySequence(Qt::Key_X), lines_lw); + delLineShortcut->setContext( Qt::WidgetWithChildrenShortcut ); + delEdgeShortcut->setContext( Qt::WidgetWithChildrenShortcut ); + + pend_spb->setValue(1.); + + connect( delEdgeShortcut, SIGNAL(activated()), this, SLOT(deleteEdgeItem()) ); + connect( delLineShortcut, SIGNAL(activated()), this, SLOT(deleteLineItem()) ); + connect( pstart_spb, SIGNAL(valueChanged(double)), this, SLOT( pstartChanged(double)) ); + connect( pend_spb, SIGNAL(valueChanged(double)), this, SLOT( pendChanged(double)) ); + connect( edges_lw, SIGNAL(itemSelectionChanged()), this, SLOT(selectElementOfModel()) ); + +} + +// ============================================================== clear +void EdgeAssocDialog::clear() +{ + first_vex_le->clear(); + edges_lw->clear(); + lines_lw->clear(); + single_edge_le->setText(""); + single_line_le->setText(""); +} + +// ============================================================== deleteEdgeItem +void EdgeAssocDialog::deleteEdgeItem() +{ + delete edges_lw->currentItem(); +} + +// ============================================================== deleteLineItem +void EdgeAssocDialog::deleteLineItem() +{ + delete lines_lw->currentItem(); +} + + +// ============================================================== setGeomEngine +void EdgeAssocDialog::setGeomEngine( GEOM::GEOM_Gen_var geomEngine ) +{ + _geomEngine = geomEngine; +} + +// ============================================================== onWindowActivated +void EdgeAssocDialog::onWindowActivated(SUIT_ViewManager* vm) +{ + SUIT_ViewWindow* v = vm->getActiveView(); + QString vmType = vm->getType(); + if ( (vmType == SVTK_Viewer::Type()) || (vmType == VTKViewer_Viewer::Type()) ){ + edges_lw->setFocus(); + } else if ( vmType == OCCViewer_Viewer::Type() ){ + lines_lw->setFocus(); + } +} + +// ============================================================== createOperation +GEOM::GEOM_IOperations_ptr EdgeAssocDialog::createOperation() +{ + return _geomEngine->GetIBasicOperations(getStudyId()); +} + +// ============================================================== execute +bool EdgeAssocDialog::execute(ObjectList& objects) +{ + MESSAGE("execute(){"); + MESSAGE("* objects.size()" << objects.size() ); + + bool res = false; + + GEOM::GEOM_Object_var anObj; + QStringList aParameters; + + GEOM::GEOM_IBasicOperations_var anOper = GEOM::GEOM_IBasicOperations::_narrow( getOperation() ); + anObj = anOper->MakePointOnCurve( _currentLine.get(), _currentParameter ); + if ( !anObj->_is_nil() ) { + objects.push_back(anObj._retn()); + res = true; + } + MESSAGE("}execute()"); + return res; +} + +// ============================================================== pstartChanged +void EdgeAssocDialog::pstartChanged( double val ) +{ + MESSAGE("pstartChanged("<item( 0 ); + if (!lineItem) return; + // MESSAGE("data : "<text().toStdString()); + _currentLine = lineItem->data(LW_GEOM_OBJ_ROLE).value(); + _currentParameter = pstart_spb->value(); + displayPreview(true); + MESSAGE("}pstartChanged()"); +} + +// ============================================================== pendChanged +void EdgeAssocDialog::pendChanged( double val ) +{ + MESSAGE("pendChanged("<_is_nil() ) return; + QListWidgetItem* lineItem = lines_lw->item( lines_lw->count()-1 ); + if (!lineItem) return; + // MESSAGE("data : "<text().toStdString()); + _currentLine = lineItem->data(LW_GEOM_OBJ_ROLE).value(); + _currentParameter = pend_spb->value(); + displayPreview(true); + MESSAGE("}pendChanged()"); +} + +// ============================================================== onCurrentSelectionChanged +void EdgeAssocDialog::onCurrentSelectionChanged() +{ + if ( !isVisible() ) return; + + SUIT_ViewWindow* window = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + + bool isOCC = (window && window->getViewManager()->getType() == OCCViewer_Viewer::Type()); + // bool isVTK = (window && window->getViewManager()->getType() == SVTK_Viewer::Type()); + + if (!isOCC) return; + + + GEOM::GeomObjPtr aSelectedObject = getSelected(TopAbs_EDGE); + TopoDS_Shape aShape; + + if ( !(aSelectedObject && GEOMBase::GetShape(aSelectedObject.get(), aShape) && !aShape.IsNull()) ) + return; + + if (single_rb->isChecked()) { + QString aName = GEOMBase::GetName(aSelectedObject.get()); + single_line_le->setText(aName); + myLine = aSelectedObject; + } + else if( multiple_rb->isChecked() ) { + + DocumentModel::GeomObj aLine; + QListWidgetItem* item = NULL; + QString mainShapeEntry; + int subId = -1; + QString brep; + + if ( aSelectedObject->IsMainShape() ){ + mainShapeEntry = aSelectedObject->GetStudyEntry(); + brep = shape2string( aShape ).c_str(); + } else { + TopoDS_Shape shape; + TopoDS_Shape subshape; + GEOM::GEOM_Object_var mainShape = aSelectedObject->GetMainShape(); + mainShapeEntry = mainShape->GetStudyEntry(); + // CS_TODO : à optimiser + bool okShape = GEOMBase::GetShape( mainShape , shape);//,const TopAbs_ShapeEnum type = TopAbs_SHAPE ); + bool oksubShape = GEOMBase::GetShape( aSelectedObject.get(), subshape );//,const TopAbs_ShapeEnum type = TopAbs_SHAPE ); + if ( okShape && oksubShape ){ + brep = shape2string( subshape ).c_str(); + subId = GEOMBase::GetIndex( subshape, shape ); + } + } + aLine.name = GEOMBase::GetName( aSelectedObject.get() ); + aLine.entry = mainShapeEntry; + aLine.subid = QString::number(subId); + aLine.brep = brep; + aLine.start = 0.; + aLine.end = 1.; + + item = new QListWidgetItem( aLine.name ); + item->setData( LW_ASSOC_ROLE, QVariant::fromValue(aLine) ); + item->setData( LW_GEOM_OBJ_ROLE, QVariant::fromValue(aSelectedObject) ); + lines_lw->addItem(item); + } +} + + +// ============================================================== apply +bool EdgeAssocDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + bool assocOk = false; + + if ( !_patternDataSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + if ( !patternDataModel ) return false; + _currentObj = NULL; + + QListWidgetItem* item = NULL; + + QModelIndex iEdge; + QModelIndexList iEdges; + QList assocs; + DocumentModel::GeomObj aLine; + + if (single_rb->isChecked()){ //Single edge and/or line association + + QString mainShapeEntry; + int subId = -1; + QString brep; + GEOM::GeomObjPtr aSelectedObject = myLine; + TopoDS_Shape aShape; + + if ( aSelectedObject && GEOMBase::GetShape(aSelectedObject.get(), aShape) && !aShape.IsNull() ){ + if ( aSelectedObject->IsMainShape() ){ + mainShapeEntry = aSelectedObject->GetStudyEntry(); + brep = shape2string( aShape ).c_str(); + } + else { + TopoDS_Shape shape; + TopoDS_Shape subshape; + GEOM::GEOM_Object_var mainShape = aSelectedObject->GetMainShape(); + mainShapeEntry = mainShape->GetStudyEntry(); + // CS_TODO : à optimiser + bool okShape = GEOMBase::GetShape( mainShape , shape);//,const TopAbs_ShapeEnum type = TopAbs_SHAPE ); + bool oksubShape = GEOMBase::GetShape( aSelectedObject.get(), subshape );//,const TopAbs_ShapeEnum type = TopAbs_SHAPE ); + if ( okShape && oksubShape ){ + brep = shape2string( subshape ).c_str(); + subId = GEOMBase::GetIndex( subshape, shape ); + } + } + aLine.name = GEOMBase::GetName( aSelectedObject.get() ); + aLine.entry = mainShapeEntry; + aLine.subid = QString::number(subId); + aLine.brep = brep; + aLine.start = pstart_spb->value(); + aLine.end = pend_spb->value(); + iEdge = patternDataModel->mapToSource( _index[single_edge_le] ); + if (!iEdge.isValid()) return false; + _documentModel->addAssociation(iEdge, aLine); + assocOk = true; + } + } + else { //Multiple edge and/or line association + + // edges + for ( int r = 0; r < edges_lw->count(); ++r){ + item = edges_lw->item(r); + iEdge = patternDataModel->mapToSource( item->data(LW_QMODELINDEX_ROLE).value() ); + if ( iEdge.isValid() ) + iEdges << iEdge; + } + + // lines + for ( int r = 0; r < lines_lw->count(); ++r){ + item = lines_lw->item(r); + aLine = item->data(LW_ASSOC_ROLE).value(); + //std::cout << " line added : " << aLine.name.toStdString() << std::endl; + MESSAGE(" assocs => " << aLine.name.toStdString() ); + MESSAGE(" assocs => " << aLine.brep.toStdString() ); + assocs << aLine; + } + + if ( close_cb->isChecked() ){ //closed line + QModelIndex iFirstVertex = patternDataModel->mapToSource( _index[first_vex_le] ); + // if (inverse_cb->isChecked()) + // assocOk = _documentModel->associateClosedLine( iFirstVertex, iEdges, assocs, pstart_spb->value(), true ); + // else + assocOk = _documentModel->associateClosedLine( iFirstVertex, iEdges, assocs, pstart_spb->value() ); + } else { + //opened line + assocOk = _documentModel->associateOpenedLine( iEdges, assocs, pstart_spb->value(), pend_spb->value() ); + } + } + + if ( !assocOk ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE EDGE ASSOCIATION" ) ); + return false; + } + + return true; +} + + + +// // ------------------------- QuadAssocDialog ---------------------------------- + +// ============================================================== Constructeur + +QuadAssocDialog::QuadAssocDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_asso_quad_to_geom.html#associate-to-a-face-or-a-shell-of-the-geometry"; + setupUi( this ); + _initWidget(editmode); + _initViewManager(); + setFocusProxy( quad_le ); +} + +// ============================================================== Destructeur +QuadAssocDialog::~QuadAssocDialog() +{ + disconnect( _delFaceShortcut, SIGNAL(activated()), this, SLOT(deleteFaceItem()) ); + disconnect( HEXABLOCKGUI::selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(addFace()) ); + delete _delFaceShortcut; +} + +// ============================================================== _initInputWidget +void QuadAssocDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + quad_le->setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + quad_le->installEventFilter(this); + quad_le->setValidator( validator ); + + + faces_lw->setProperty( "GeomWidgetType", QVariant::fromValue(TopAbs_FACE) ); + faces_lw->installEventFilter(this); + _delFaceShortcut = new QShortcut( QKeySequence(Qt::Key_X/*Qt::Key_Delete*/), faces_lw ); + _delFaceShortcut->setContext( Qt::WidgetShortcut ); + + connect( _delFaceShortcut, SIGNAL(activated()), this, SLOT(deleteFaceItem()) ); +} + +// ============================================================== clear +void QuadAssocDialog::clear() +{ + quad_le->clear(); + faces_lw->clear(); +} + +// ============================================================== onCurrentSelectionChanged +void QuadAssocDialog::onCurrentSelectionChanged() +{ + + if ( !isVisible() ) return; + + SUIT_ViewWindow* window = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + + bool isOCC = (window && window->getViewManager()->getType() == OCCViewer_Viewer::Type()); + // bool isVTK = (window && window->getViewManager()->getType() == SVTK_Viewer::Type()); + + if (!isOCC) return; + + GEOM::GeomObjPtr aSelectedObject = getSelected(TopAbs_FACE); + TopoDS_Shape aShape; + + if ( aSelectedObject && GEOMBase::GetShape(aSelectedObject.get(), aShape) && !aShape.IsNull() ){ + DocumentModel::GeomObj aFace; + QListWidgetItem* item = NULL; + QString mainShapeEntry; + int subId = -1; + QString brep; + + if ( aSelectedObject->IsMainShape() ){ + mainShapeEntry = aSelectedObject->GetStudyEntry(); + brep = shape2string( aShape ).c_str(); + } else { + TopoDS_Shape shape; + TopoDS_Shape subshape; + GEOM::GEOM_Object_var mainShape = aSelectedObject->GetMainShape(); + mainShapeEntry = mainShape->GetStudyEntry(); + // CS_TODO : à optimiser + bool okShape = GEOMBase::GetShape( mainShape , shape);//,const TopAbs_ShapeEnum type = TopAbs_SHAPE ); + bool oksubShape = GEOMBase::GetShape( aSelectedObject.get(), subshape );//,const TopAbs_ShapeEnum type = TopAbs_SHAPE ); + if ( okShape && oksubShape ){ + brep = shape2string( subshape ).c_str(); + subId = GEOMBase::GetIndex( subshape, shape ); + } + } + aFace.name = GEOMBase::GetName( aSelectedObject.get() ); + aFace.entry = mainShapeEntry; + aFace.subid = QString::number(subId); + aFace.brep = brep; + aFace.start = 0.; + aFace.end = 1.; + + item = new QListWidgetItem( aFace.name ); + item->setData( LW_ASSOC_ROLE, QVariant::fromValue(aFace) ); + faces_lw->addItem(item); + // faces_lw->setCurrentRow( faces_lw->count() - 1 ); + } + +} + +// ============================================================== onWindowActivated +void QuadAssocDialog::onWindowActivated(SUIT_ViewManager* vm) +{ + SUIT_ViewWindow* v = vm->getActiveView(); + QString vmType = vm->getType(); + if ( (vmType == SVTK_Viewer::Type()) || (vmType == VTKViewer_Viewer::Type()) ){ + quad_le->setFocus(); + } else if ( vmType == OCCViewer_Viewer::Type() ){ + faces_lw->setFocus(); + } +} + +// ============================================================== deleteFaceItem +void QuadAssocDialog::deleteFaceItem() +{ + delete faces_lw->currentItem(); +} + + +// ============================================================== apply +bool QuadAssocDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + //if ( !_documentModel ) return; + if ( !_patternDataSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + if ( !patternDataModel ) return false; + _currentObj = NULL; + + // quad + QModelIndex iQuad = patternDataModel->mapToSource( _index[quad_le] ); + + // faces + QListWidgetItem* item = NULL; + DocumentModel::GeomObj aFace; + for ( int r = 0; r < faces_lw->count(); ++r ){ + item = faces_lw->item(r); + aFace = item->data(LW_ASSOC_ROLE).value(); + _documentModel->addAssociation( iQuad, aFace ); + } + + result = patternDataModel->mapFromSource(iQuad); + + return true; +} + + + +// ------------------------- GroupDialog ---------------------------------- + +// ============================================================== Constructeur + +GroupDialog::GroupDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f), + _value(NULL) +{ + _helpFileName = "gui_groups.html#add-group"; + setupUi( this ); + _initWidget(editmode); + // setFocusProxy( name_le/*eltBase_lw */); + + if ( editmode == NEW_MODE ){ + setWindowTitle( tr("Group Construction") ); + } else if ( editmode == UPDATE_MODE ){ + setWindowTitle( tr("Group Modification") ); + } else if ( editmode == INFO_MODE ){ + setWindowTitle( tr("Group Information") ); + } +} + +// ============================================================== Destructeur +GroupDialog::~GroupDialog() +{ +} + + +// ============================================================== _initInputWidget +void GroupDialog::_initInputWidget( Mode editmode ) +{ + setProperty( "HexaWidgetType", QVariant::fromValue(GROUP_TREE) ); + installEventFilter(this); + + name_le->setProperty( "HexaWidgetType", QVariant::fromValue(GROUP_TREE) ); + name_le->installEventFilter(this); + + // kind checkbox + strKind[ HEXA_NS::HexaCell ] = "HexaCell"; + strKind[ HEXA_NS::QuadCell ] = "QuadCell"; + strKind[ HEXA_NS::EdgeCell ] = "EdgeCell"; + strKind[ HEXA_NS::HexaNode ] = "HexaNode"; + strKind[ HEXA_NS::QuadNode ] = "QuadNode"; + strKind[ HEXA_NS::EdgeNode ] = "EdgeNode"; + strKind[ HEXA_NS::VertexNode ] = "VertexNode"; + kind_cb->clear(); + QMap::ConstIterator iKind; + for( iKind = strKind.constBegin(); iKind != strKind.constEnd(); ++iKind ) + kind_cb->addItem( iKind.value(), QVariant(iKind.key()) ); + + onKindChanged( kind_cb->currentIndex() ); + eltBase_lw->installEventFilter(this); + + if ( editmode != INFO_MODE ){ + QShortcut* delEltShortcut = new QShortcut( QKeySequence(Qt::Key_X), eltBase_lw ); + delEltShortcut->setContext( Qt::WidgetShortcut ); + connect(delEltShortcut, SIGNAL(activated()), this, SLOT(removeEltBase())); + connect(kind_cb, SIGNAL(activated(int)), this, SLOT(onKindChanged(int)) ); + } + + connect(eltBase_lw, SIGNAL(itemSelectionChanged()), this, SLOT(selectElementOfModel())); +} + +// ============================================================== clear +void GroupDialog::clear() +{ + name_le->clear(); + eltBase_lw->clear(); +} + +// ============================================================== onKindChanged +void GroupDialog::onKindChanged(int index) +{ + // onKind + MESSAGE("GroupDialog::onKindChanged(" << index << ") "); + switch ( kind_cb->itemData(index).toInt() ){ + case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: eltBase_lw->setProperty("HexaWidgetType", QVariant::fromValue(HEXA_TREE)); MESSAGE("====>HEXA_TREE"); break; + case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: eltBase_lw->setProperty("HexaWidgetType", QVariant::fromValue(QUAD_TREE)); MESSAGE("====>QUAD_TREE"); break; + case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: eltBase_lw->setProperty("HexaWidgetType", QVariant::fromValue(EDGE_TREE)); MESSAGE("====>EDGE_TREE"); break; + case HEXA_NS::VertexNode: eltBase_lw->setProperty("HexaWidgetType", QVariant::fromValue(VERTEX_TREE)); MESSAGE("====>VERTEX_TREE"); break; + default:Q_ASSERT( false ); + } + eltBase_lw->clear(); + eltBase_lw->setFocus(); +} + +// ============================================================== setValue +void GroupDialog::setValue(HEXA_NS::Group* g) +{ + //0) name + name_le->setText( g->getName() ); + + //1) kind + kind_cb->clear(); + kind_cb->addItem ( strKind[g->getKind()], QVariant( g->getKind() ) ); + // onKindChanged( kind_cb->currentIndex() ); + + //2) elts + HEXA_NS::EltBase* eltBase = NULL; + QListWidgetItem* item = NULL; + QModelIndex iEltBase; + QList eltBaseItems; + QVariant v; + + if ( !_patternDataSelectionModel ) return; + if ( !_groupsSelectionModel ) return; + + QModelIndex iGroup = _groupsSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(g) ); + name_le->setProperty( "QModelIndex", QVariant::fromValue(iGroup) ); + + + for ( int nr = 0; nr < g->countElement(); ++nr ){ + eltBase = g->getElement( nr ); + switch ( g->getKind() ){ + case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: v = QVariant::fromValue( (HEXA_NS::Hexa *)eltBase ); break; + case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: v = QVariant::fromValue( (HEXA_NS::Quad *)eltBase ); break; + case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: v = QVariant::fromValue( (HEXA_NS::Edge *)eltBase ); break; + case HEXA_NS::VertexNode: v = QVariant::fromValue( (HEXA_NS::Vertex *)eltBase ); break; + } + iEltBase = _patternDataSelectionModel->indexBy( HEXA_DATA_ROLE, v); + if ( iEltBase.isValid() ){ + item = new QListWidgetItem( eltBase->getName() ); + item->setData( LW_QMODELINDEX_ROLE, QVariant::fromValue(iEltBase) ); + eltBase_lw->addItem( item ); + } + } + + _value = g; +} + +// ============================================================== getValue +HEXA_NS::Group* GroupDialog::getValue() +{ + return _value; +} + + +// ============================================================== removeEltBase +void GroupDialog::removeEltBase() +{ + QListWidgetItem *item = eltBase_lw->currentItem(); + + if (item) { + int r = eltBase_lw->row(item); + eltBase_lw->takeItem(r); + delete item; + } + +} + +// ============================================================== apply +bool GroupDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + + if ( !_documentModel ) return false; + if ( !_patternDataSelectionModel ) return false; + if ( !_groupsSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const GroupsModel* groupsModel = dynamic_cast( _groupsSelectionModel->model() ); + _currentObj = NULL; + + QString grpName = name_le->text(); + DocumentModel::Group grpKind = static_cast( kind_cb->itemData( kind_cb->currentIndex() ).toInt()); + QModelIndex iGrp; + if ( _value == NULL ){ // create group + iGrp = _documentModel->addGroup( grpName, grpKind ); + } else { + QModelIndexList iGrps = _documentModel->match( + _documentModel->index(0, 0), + HEXA_DATA_ROLE, + QVariant::fromValue( _value ), + 1, + Qt::MatchRecursive ); + if ( !iGrps.isEmpty() ) + iGrp = iGrps[0]; + } + + // kind_cb-> + if ( !iGrp.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT ADD GROUP" ) ); + return false; + } + + //fill it and select it + QModelIndex iEltBase; + QListWidgetItem* item = NULL; + bool eltAdded = false; + _documentModel->clearGroupElement(iGrp); + for ( int r = 0; r < eltBase_lw->count(); ++r){ + item = eltBase_lw->item(r); + iEltBase = patternDataModel->mapToSource( item->data(LW_QMODELINDEX_ROLE).value() ); + if ( iEltBase.isValid() ) + eltAdded = _documentModel->addGroupElement( iGrp, iEltBase ); + // if ( eltAdded == false ){ + // //SUIT_MessageBox::information( this, tr( "HEXA_INFO" ), tr( "ELEMENT NOT ADDED : %1" ).arg( iEltBase.data().toString() )); + // } + } + + QString newName = name_le->text(); + if ( !newName.isEmpty() )/*{*/ + _documentModel->setName( iGrp, newName ); + + result = groupsModel->mapFromSource(iGrp); + + return true; +} + + + +// ------------------------- LawDialog ---------------------------------- + +// ============================================================== Constructeur + +LawDialog::LawDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f), + _value(NULL) +{ + _helpFileName = "gui_discret_law.html#add-law"; + setupUi( this ); + _initWidget(editmode); + if ( editmode == NEW_MODE ){ + setWindowTitle( tr("Law Construction") ); + } else if ( editmode == UPDATE_MODE ){ + setWindowTitle( tr("Law Modification") ); + } +} + +// ============================================================== Destructeur +LawDialog::~LawDialog() +{ +} + +// ============================================================== _initInputWidget +void LawDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(LAW_TREE) ); + installEventFilter(this); + + name_le->setProperty( "HexaWidgetType", QVariant::fromValue(LAW_TREE) ); + name_le->installEventFilter(this); + + // kind checkbox + strKind[ HEXA_NS::Uniform ] = "Uniform"; + strKind[ HEXA_NS::Arithmetic ] = "Arithmetic"; + strKind[ HEXA_NS::Geometric ] = "Geometric"; + + kind_cb->clear(); + QMap::ConstIterator iKind; + for( iKind = strKind.constBegin(); iKind != strKind.constEnd(); ++iKind ) + kind_cb->addItem( iKind.value(), QVariant(iKind.key()) ); + +} + +// ============================================================== clear +void LawDialog::clear() +{ + name_le->clear(); +} + +// ============================================================== setValue +void LawDialog::setValue(HEXA_NS::Law* l) +{ + // 0) name + name_le->setText( l->getName() ); + + nb_nodes_spb->setValue( l->getNodes() ); + coeff_spb->setValue( l->getCoefficient() ); + + HEXA_NS::KindLaw k = l->getKind(); + kind_cb->setCurrentIndex( kind_cb->findData(k) ); + + _value = l; +} + +// ============================================================== getValue +HEXA_NS::Law* LawDialog::getValue() +{ + return _value; +} + + + +// ============================================================== apply +bool LawDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_documentModel ) return false; + if ( !_meshSelectionModel ) return false; + + _currentObj = NULL; + const MeshModel* meshModel = dynamic_cast( _meshSelectionModel->model() ); + + QString lawName = name_le->text(); + int nbnodes = nb_nodes_spb->value(); + double coeff = coeff_spb->value(); + DocumentModel::KindLaw lawKind = static_cast( kind_cb->itemData( kind_cb->currentIndex() ).toInt()); + + + QModelIndex iLaw; + if ( _value == NULL ){ // create Law + iLaw = _documentModel->addLaw( lawName, nbnodes ); + } else { + QModelIndexList iLaws = _documentModel->match( + _documentModel->index(0, 0), + HEXA_DATA_ROLE, + QVariant::fromValue( _value ), + 1, + Qt::MatchRecursive ); + if ( !iLaws.isEmpty() ) + iLaw = iLaws[0]; + } + + if ( !iLaw.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT ADD LAW" ) ); + return false; + } + //fill it and select it + bool setOk = _documentModel->setLaw( iLaw, nbnodes, coeff, lawKind ); + if ( !setOk ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT ADD LAW" ) ); + return false; + } + + QString newName = name_le->text(); + if ( !newName.isEmpty() )/*{*/ + _documentModel->setName( iLaw, newName ); + + result = meshModel->mapFromSource(iLaw); + + return true; +} + + + + +// ------------------------- PropagationDialog ---------------------------------- + +// ============================================================== Constructeur + +PropagationDialog::PropagationDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ) +: HexaBaseDialog(parent, editmode, f), + _value(NULL) +{ + _helpFileName = "gui_propag.html"; + setupUi( this ); + _initWidget(editmode); + // setFocusProxy( law_le ); + setFocusProxy( propagations_lw ); + + if ( editmode == INFO_MODE ){ + setWindowTitle( tr("Propagation Information") ); + if (groupBox_2) + delete groupBox_2; + } else if ( editmode == UPDATE_MODE ){ + setWindowTitle( tr("Propagation Modification") ); + if (groupBox_2) + delete groupBox_2; + } else if ( editmode == NEW_MODE ){ + setWindowTitle( tr("Propagation(s) Setting") ); + } +} + + +// ============================================================== Destructeur +PropagationDialog::~PropagationDialog() +{ +} + + +// ============================================================== _initInputWidget +void PropagationDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(PROPAGATION_TREE) ); + installEventFilter(this); + + + law_le->setProperty( "HexaWidgetType", QVariant::fromValue(LAW_TREE) ); + law_le->installEventFilter(this); + law_le->setValidator( validator ); + + propagations_lw->setProperty( "HexaWidgetType", QVariant::fromValue(PROPAGATION_TREE) ); + propagations_lw->installEventFilter(this); + + QShortcut* delPropagationShortcut = new QShortcut(QKeySequence(/*Qt::Key_Delete*/Qt::Key_X/*Qt::Key_Alt*//*Qt::Key_Space*/), propagations_lw); + delPropagationShortcut->setContext( Qt::WidgetShortcut ); + + connect( delPropagationShortcut, SIGNAL(activated()), this, SLOT(deletePropagationItem()) ); + connect( propagations_lw, SIGNAL(itemSelectionChanged()), this, SLOT(selectElementOfModel()) ); +} + + +// ============================================================== clear +void PropagationDialog::clear() +{ + propagations_lw->clear(); + law_le->clear(); +} + +// ============================================================== deletePropagationItem +void PropagationDialog::deletePropagationItem() +{ + delete propagations_lw->currentItem(); +} + + +// ============================================================== setValue +void PropagationDialog::setValue(HEXA_NS::Propagation* p) +{ + HEXA_NS::Law* l = p->getLaw(); + bool way = p->getWay(); + + // propagation + QModelIndex ip = _meshSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(p) ); + setProperty( "QModelIndex", QVariant::fromValue(ip) ); + + + // law on propagation + if ( l != NULL ){ + law_le->setText( l->getName() ); + QModelIndex il = _meshSelectionModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(l) ); + law_le->setProperty( "QModelIndex", QVariant::fromValue(il) ); + } + + // way of propagation + way_cb->setChecked(way); + + _value = p; +} + +// ============================================================== getValue +HEXA_NS::Propagation* PropagationDialog::getValue() +{ + return _value; +} + + +// ============================================================== apply +bool PropagationDialog::apply(QModelIndex& result) +{ + bool isOk = false; + SUIT_OverrideCursor wc; + if ( !_documentModel ) return false; + if ( !_meshSelectionModel ) return false; + _currentObj = NULL; + + const MeshModel* meshModel = dynamic_cast( _meshSelectionModel->model() ); + bool way = way_cb->isChecked(); + QListWidgetItem* item = NULL; + + QModelIndex iPropagation; + QModelIndex iLaw = meshModel->mapToSource( law_le->property("QModelIndex").value() ); + if (!iLaw.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT SET PROPAGATION" ) ); + return false; + } + MESSAGE("iLaw.isValid() => " << iLaw.isValid() ); + + for (int r = 0; r < propagations_lw->count(); ++r){ + item = propagations_lw->item(r); + iPropagation = meshModel->mapToSource( item->data(LW_QMODELINDEX_ROLE).value() ); + if ( !iPropagation.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT SET PROPAGATION" ) ); + return false; + } + MESSAGE("iPropagation.isValid() => " << iPropagation.isValid() ); + + //fill it and select it + isOk = _documentModel->setPropagation( iPropagation, iLaw, way ); + if ( !isOk ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT SET PROPAGATION" ) ); + return false; + } + + result = meshModel->mapFromSource(iPropagation); + } + + return true; +} + + +// ------------------------- ComputeMeshDialog ---------------------------------- + +// ============================================================== Constructeur + +ComputeMeshDialog::ComputeMeshDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_mesh.html"; + setWindowTitle( tr("Compute mesh") ); + QVBoxLayout* layout = new QVBoxLayout; + setLayout(layout); + + QHBoxLayout* up = new QHBoxLayout; + QHBoxLayout* down = new QHBoxLayout; + + layout->addLayout(up); + layout->addLayout(down); + + QVBoxLayout* vlg = new QVBoxLayout; + QVBoxLayout* vld = new QVBoxLayout; + + up->addLayout(vlg); + up->addLayout(vld); + + vlg->addWidget(new QLabel("Name")); + vlg->addWidget(new QLabel("Dimension")); + vlg->addWidget(new QLabel("Container")); + + _name = new QLineEdit("Mesh"); + _dim = new QSpinBox(); + _fact = new QLineEdit("FactoryServer"); + + vld->addWidget(_name); + vld->addWidget(_dim); + vld->addWidget(_fact); + + _dim->setRange(1, 3); + _dim->setValue(3); + + _initWidget(editmode); + +} + +// ============================================================== Destructeur +ComputeMeshDialog::~ComputeMeshDialog() +{ +} + + +// ============================================================== _initInputWidget +void ComputeMeshDialog::_initInputWidget( Mode editmode ) +{ +} + +// ============================================================== setDocumentModel +void ComputeMeshDialog::setDocumentModel(DocumentModel* m) +{ + HexaBaseDialog::setDocumentModel(m); + _name->setText(_documentModel->getName()); +} + +// ============================================================== clear +void ComputeMeshDialog::clear() +{ +} + +// ============================================================== apply +bool ComputeMeshDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + + QString command = QString("import hexablock ; %1 = hexablock.mesh(\"%2\", \"%1\", %3, \"%4\")") + .arg( _name->text() ) + .arg( _documentModel->documentEntry() ) + .arg( _dim->value() ) + .arg( _fact->text() ); + //std::cout << "command: " << command.toStdString() << std::endl; + + SalomeApp_Application* app = dynamic_cast( SUIT_Session::session()->activeApplication() ); + PyConsole_Console* pyConsole = app->pythonConsole(); + + if ( pyConsole ) + pyConsole->exec( command ); + else + return false; + + // clear(); + return true; +} + +// void ComputeMeshDialog::accept() { +// _disallowSelection(); +// QDialog::accept(); +// +// QString command = QString("import hexablock ; %1 = hexablock.mesh(\"%1\", \"%2\", %3, \"%4\")") +// .arg( _name->text() ) +// .arg( _documentModel->documentEntry() ) +// .arg( _dim->value() ) +// .arg( _fact->text() ); +// std::cout << "command: " << command.toStdString() << std::endl; +// +// SalomeApp_Application* app = dynamic_cast( SUIT_Session::session()->activeApplication() ); +// PyConsole_Console* pyConsole = app->pythonConsole(); +// +// if ( pyConsole ) pyConsole->exec( command ); +// } + +// void ComputeMeshDialog::reject() { +// _disallowSelection(); +// QDialog::reject(); +// } + + + +// ------------------------- ReplaceHexaDialog ---------------------------------- + +// ============================================================== Constructeur + +ReplaceHexaDialog::ReplaceHexaDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_replace_hexa.html"; + setupUi( this ); + _initWidget(editmode); + setFocusProxy( quads_lw ); +} + +// ============================================================== Destructeur +ReplaceHexaDialog::~ReplaceHexaDialog() +{ +} + +// ============================================================== _initInputWidget +void ReplaceHexaDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + c1_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + c2_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + c3_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + + p1_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + p2_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + p3_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + + c1_le->installEventFilter(this); + c2_le->installEventFilter(this); + c3_le->installEventFilter(this); + + p1_le->installEventFilter(this); + p2_le->installEventFilter(this); + p3_le->installEventFilter(this); + + quads_lw->setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + quads_lw->installEventFilter(this); + + if ( editmode == NEW_MODE ){ + QShortcut* delQuadShortcut = new QShortcut( QKeySequence(Qt::Key_X), quads_lw ); + delQuadShortcut->setContext( Qt::WidgetShortcut ); + + connect( delQuadShortcut, SIGNAL(activated()), this, SLOT(deleteQuadItem()) ); + connect( quads_lw, SIGNAL(currentRowChanged(int)), this, SLOT(updateButtonBox(int)) ); + } + + connect(quads_lw, SIGNAL(itemSelectionChanged()), this, SLOT(selectElementOfModel())); +} + +// ============================================================== clear +void ReplaceHexaDialog::clear() +{ +} + +// ============================================================== updateButtonBox +void ReplaceHexaDialog::updateButtonBox() +{ + int nbQuad = quads_lw->count(); + + if ( nbQuad > 0 ){ + //_applyCloseButton->setEnabled(true); + _applyButton->setEnabled(true); + } else { + //_applyCloseButton->setEnabled(false); + _applyButton->setEnabled(false); + } +} + +// ============================================================== deleteQuadItem +void ReplaceHexaDialog::deleteQuadItem() +{ + delete quads_lw->currentItem(); + updateButtonBox(); +} + +// ============================================================== apply +bool ReplaceHexaDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_documentModel ) return false; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex ielts; //result + + QListWidgetItem* item = NULL; + QModelIndexList iquads; + QModelIndex iquad; + for ( int r = 0; r < quads_lw->count(); ++r){ + item = quads_lw->item(r); + iquad = patternDataModel->mapToSource( item->data(LW_QMODELINDEX_ROLE).value() ); + //std::cout << "iquad => " << iquad.data().toString().toStdString() << std::endl; + if ( iquad.isValid() ) + iquads << iquad; + } + + QModelIndex ic1 = patternDataModel->mapToSource( _index[c1_le] ); + QModelIndex ic2 = patternDataModel->mapToSource( _index[c2_le] ); + QModelIndex ic3 = patternDataModel->mapToSource( _index[c3_le] ); + + QModelIndex ip1 = patternDataModel->mapToSource( _index[p1_le] ); + QModelIndex ip2 = patternDataModel->mapToSource( _index[p2_le] ); + QModelIndex ip3 = patternDataModel->mapToSource( _index[p3_le] ); + + // std::cout << "nbHexa => " << nbHexa << std::endl; + + if ( ic1.isValid() && ic2.isValid() && ic3.isValid() + && ip1.isValid() && ip2.isValid() && ip3.isValid() ){ + ielts = _documentModel->replace( iquads, + ip1, ic1, + ip2, ic2, + ip3, ic3 ); + } + + if ( !ielts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT REPLACE HEXA" ) ); + return false; + } + _value = ielts.model()->data(ielts, HEXA_DATA_ROLE).value(); + + QString newName = name_le->text(); + if ( !newName.isEmpty() )/*{*/ + _documentModel->setName( ielts, newName ); + + result = patternBuilderModel->mapFromSource(ielts); + + return true; +} + + + + +// ------------------------- QuadRevolutionDialog ---------------------------------- + +// ============================================================== Constructeur + +QuadRevolutionDialog::QuadRevolutionDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_quad_revolution.html"; + setupUi( this ); + _initWidget(editmode); + setFocusProxy( quads_lw ); +} + +// ============================================================== Destructeur +QuadRevolutionDialog::~QuadRevolutionDialog() +{ +} + +// ============================================================== _initInputWidget +void QuadRevolutionDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + center_pt_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + axis_vec_le->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + quads_lw->setProperty( "HexaWidgetType", QVariant::fromValue(QUAD_TREE) ); + + center_pt_le->setValidator( validator ); + axis_vec_le->setValidator( validator ); + // quads_lw->setValidator( validator ); + + center_pt_le->installEventFilter(this); + axis_vec_le->installEventFilter(this); + quads_lw->installEventFilter(this); + + if ( editmode == NEW_MODE ){ + angles_lw->setItemDelegate( new HexaAngleDoubleSpinBoxDelegate(angles_lw) ); + angles_lw->setEditTriggers( QAbstractItemView::DoubleClicked ); + + QShortcut* delQuadShortcut = new QShortcut( QKeySequence(Qt::Key_X), quads_lw ); + delQuadShortcut->setContext( Qt::WidgetShortcut ); + connect( delQuadShortcut, SIGNAL(activated()), this, SLOT(delQuadItem()) ); + connect( add_angle_pb, SIGNAL(clicked()), this, SLOT(addAngleItem())); + connect( del_angle_pb, SIGNAL(clicked()), this, SLOT(delAngleItem())); + // connect(clear_pb, SIGNAL(clicked()), this, SLOT(clearQuads())); + } + + connect(quads_lw, SIGNAL(itemSelectionChanged()), this, SLOT(selectElementOfModel())); +} + +// ============================================================== clear +void QuadRevolutionDialog::clear() +{ +} + + +// ============================================================== updateButtonBox +void QuadRevolutionDialog::updateButtonBox() //CS_TODO? : check center, axis +{ + int nbQuads = quads_lw->count(); + int nbAngles = angles_lw->count(); + + if ( nbQuads>0 && nbAngles> 0 ){ + //_applyCloseButton->setEnabled(true); + _applyButton->setEnabled(true); + } else { + //_applyCloseButton->setEnabled(false); + _applyButton->setEnabled(false); + } +} + + +// ============================================================== addAngleItem +void QuadRevolutionDialog::addAngleItem() //CS_TODO +{ + QListWidgetItem* previousItem = angles_lw->currentItem(); + QListWidgetItem* newItem = new QListWidgetItem(); + + double defaultValue = 0.; + if ( previousItem ) + defaultValue = previousItem->data(Qt::EditRole).toDouble(); + + newItem->setData( Qt::EditRole, QVariant(defaultValue) ); + newItem->setFlags( newItem->flags () | Qt::ItemIsEditable); + angles_lw->addItem(newItem); + + updateButtonBox(); +} + +// ============================================================== delAngleItem +void QuadRevolutionDialog::delAngleItem() +{ + delete angles_lw->currentItem(); + updateButtonBox(); +} + +// ============================================================== delQuadItem +void QuadRevolutionDialog::delQuadItem() +{ + delete quads_lw->currentItem(); + updateButtonBox(); +} + +// ============================================================== apply +bool QuadRevolutionDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_documentModel ) return false; + if ( !_patternDataSelectionModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + if ( !patternDataModel ) return false; + if ( !patternBuilderModel ) return false; + _currentObj = NULL; + + QModelIndex ielts; //result + QListWidgetItem* item = NULL; + + QModelIndexList istartquads; + QModelIndex iquad; + for ( int r = 0; r < quads_lw->count(); ++r){ + item = quads_lw->item(r); + iquad = patternDataModel->mapToSource( item->data(LW_QMODELINDEX_ROLE).value() ); + if ( iquad.isValid() ) + istartquads << iquad; + } + + QModelIndex icenter_pt = patternDataModel->mapToSource( _index[center_pt_le] ); + QModelIndex iaxis_vec = patternBuilderModel->mapToSource( _index[axis_vec_le] ); + + QList angles; + for ( int r = 0; r < angles_lw->count(); ++r){ + item = angles_lw->item(r); + angles << item->data(Qt::EditRole).toDouble(); + } + + if ( icenter_pt.isValid() && iaxis_vec.isValid() ){ + ielts = _documentModel->revolutionQuads( istartquads, icenter_pt, iaxis_vec, angles ); + } + + if ( !ielts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE QUAD REVOLUTION" ) ); + return false; + } + _value = ielts.model()->data(ielts, HEXA_DATA_ROLE).value(); + + QString newName = name_le->text(); + if ( !newName.isEmpty() )/*{*/ + _documentModel->setName( ielts, newName ); + + result = patternBuilderModel->mapFromSource(ielts); + + return true; +} + + + +// ------------------------- QuadRevolutionDialog ---------------------------------- + +// ============================================================== Constructeur + +MakeHemiSphereDialog::MakeHemiSphereDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): + HexaBaseDialog(parent, editmode, f) +{ + _helpFileName = "gui_hemisphere.html"; + setupUi( this ); + _initWidget(editmode); +} + +// ============================================================== Destructeur +MakeHemiSphereDialog::~MakeHemiSphereDialog() +{ +} + +// ============================================================== _initInputWidget +void MakeHemiSphereDialog::_initInputWidget( Mode editmode ) +{ + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + + setProperty( "HexaWidgetType", QVariant::fromValue(ELEMENTS_TREE) ); + installEventFilter(this); + + sphere_center_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + cross_pt_le->setProperty( "HexaWidgetType", QVariant::fromValue(VERTEX_TREE) ); + hole_axis_le->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + cross_vec_le->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + radial_vec_le->setProperty( "HexaWidgetType", QVariant::fromValue(VECTOR_TREE) ); + + sphere_center_le->setValidator( validator ); + cross_pt_le->setValidator( validator ); + hole_axis_le->setValidator( validator ); + cross_vec_le->setValidator( validator ); + radial_vec_le->setValidator( validator ); + + + sphere_center_le->installEventFilter(this); + cross_pt_le->installEventFilter(this); + hole_axis_le->installEventFilter(this); + cross_vec_le->installEventFilter(this); + radial_vec_le->installEventFilter(this); +} + +// ============================================================== clear +void MakeHemiSphereDialog::clear() +{ +} + +// ============================================================== apply +bool MakeHemiSphereDialog::apply(QModelIndex& result) +{ + SUIT_OverrideCursor wc; + if ( !_documentModel ) return false; + if ( !_patternBuilderSelectionModel ) return false; + if ( !_patternDataSelectionModel ) return false; + const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); + const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + if ( !patternBuilderModel ) return false; + if ( !patternDataModel ) return false; + _currentObj = NULL; + + QModelIndex iElts; + QModelIndex icenter = patternDataModel->mapToSource( _index[sphere_center_le] ); + QModelIndex iplorig = patternDataModel->mapToSource( _index[cross_pt_le] ); + QModelIndex ivecx = patternBuilderModel->mapToSource( _index[radial_vec_le] ); + QModelIndex ivecz = patternBuilderModel->mapToSource( _index[hole_axis_le] ); + + double radext = sphere_radext_spb->value(); + double radhole = hole_rad_spb->value(); + + int nrad = ngrid_rad_spb->value(); + int nang = ngrid_ang_spb->value(); + int nhaut = ngrid_height_spb->value(); + + + if ( icenter.isValid() && ivecx.isValid() && ivecz.isValid() && iplorig.isValid() ){ + if ( sphere_rind_cb->isChecked() ){ // rind + double radint = sphere_radint_spb->value(); + if ( radial_partial_cb->isChecked() ){ + double angle = radial_angle_spb->value(); + iElts = _documentModel->makePartRind( icenter, ivecx, ivecz, + radext, radint, radhole, + iplorig, angle, + nrad, nang, nhaut ); + } else { + iElts = _documentModel->makeRind( icenter, + ivecx, ivecz, + radext, radint, radhole, + iplorig, + nrad, nang, nhaut ); + } + } else { // sphere + if ( radial_partial_cb->isChecked() ){ + double angle = radial_angle_spb->value(); + iElts = _documentModel->makePartSphere( icenter, ivecx, ivecz, + radext, radhole, + iplorig, angle, + nrad, nang, nhaut ); + } else { + iElts = _documentModel->makeSphere( icenter, + ivecx, ivecz, + radext, radhole, + iplorig, + nrad, nang, nhaut ); + } + } + } + + + if ( !iElts.isValid() ){ + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE RIND" ) ); + return false; + } + _value = iElts.model()->data(iElts, HEXA_DATA_ROLE).value(); + + QString newName = name_le->text(); + if ( !newName.isEmpty() )/*{*/ + _documentModel->setName( iElts, newName ); + + result = patternBuilderModel->mapFromSource(iElts); + + return true; +} +// ============================================================== + + +// MakeRindDialog::MakeRindDialog( QWidget* parent, Mode editmode, Qt::WindowFlags f ): +// HexaBaseDialog(parent, editmode, f) +// { +// // _helpFileName() +// setupUi( this ); +// setWindowTitle( tr("MAKE RIND") ); +// +// if ( editmode == NEW_MODE ){ +// _initButtonBox( editmode ); +// +// //selection management +// _vertexLineEdits << center_le << plorig_le; +// _vectorLineEdits << vx_le << vz_le; +// +// center_le->installEventFilter(this); +// plorig_le->installEventFilter(this); +// vx_le->installEventFilter(this); +// vz_le->installEventFilter(this); +// } +// } +// +// +// MakeRindDialog::~MakeRindDialog() +// { +// } +// +// +// +// bool MakeRindDialog::apply(QModelIndex& result) +// { +// SUIT_OverrideCursor wc; +// if ( !_documentModel ) return false; +// if ( !_patternBuilderSelectionModel ) return false; +// if ( !_patternDataSelectionModel ) return false; +// const PatternBuilderModel* patternBuilderModel = dynamic_cast( _patternBuilderSelectionModel->model() ); +// const PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); +// if ( !patternBuilderModel ) return false; +// if ( !patternDataModel ) return false; +// +// QModelIndex iElts; +// QModelIndex icenter = patternDataModel->mapToSource( _index[center_le] ); +// QModelIndex iplorig = patternDataModel->mapToSource( _index[plorig_le] ); +// QModelIndex ivecx = patternBuilderModel->mapToSource( _index[vx_le] ); +// QModelIndex ivecz = patternBuilderModel->mapToSource( _index[vz_le] ); +// +// double radext = radext_spb->value(); +// double radint = radint_spb->value(); +// double radhole = radhole_spb->value(); +// +// int nrad = nrad_spb->value(); +// int nang = nang_spb->value(); +// int nhaut = nhaut_spb->value(); +// +// if ( icenter.isValid() && ivecx.isValid() && ivecz.isValid() && iplorig.isValid() ){ +// if ( partial_cb->isChecked() ){ +// double angle = angle_spb->value(); // Part Rind only +// iElts = _documentModel->makePartRind( icenter, ivecx, ivecz, +// radext, radint, radhole, +// iplorig, angle, +// nrad, nang, nhaut ); +// } else { +// iElts = _documentModel->makeRind( icenter, +// ivecx, ivecz, +// radext, radint, radhole, +// iplorig, +// nrad, nang, nhaut ); +// } +// } +// +// if ( !iElts.isValid() ){ +// SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE RIND" ) ); +// return false; +// } +// +// QString newName = name_le->text(); +// if (!newName.isEmpty()) _documentModel->setName( iElts, newName ); +// +// return true; +// } + +// QVariant v = lineEdit->property("index"); +// if ( v.isValid() ){ +// MESSAGE("* get index ... " ); +// QModelIndex i = v.value(); +// _selectionMutex = true; +// _patternDataSelectionModel->select( i, QItemSelectionModel::Clear ); +// _patternDataSelectionModel->select( i, QItemSelectionModel::Select ); +// _selectionMutex = false; +// } diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentPanel.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentPanel.hxx new file mode 100755 index 0000000..b59b2e3 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentPanel.hxx @@ -0,0 +1,1058 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HEXABLOCKGUI_DOCUMENTPANEL_HXX_ +#define __HEXABLOCKGUI_DOCUMENTPANEL_HXX_ + + +#if defined WIN32 +# if defined HEXABLOCKGUI_DOCUMENTPANEL_EXPORT || defined HexablockGui_DocumentPanel_EXPORTS +# define HEXABLOCKGUI_DOCUMENTPANEL_EXPORT __declspec( dllexport ) +# else +# define HEXABLOCKGUI_DOCUMENTPANEL_EXPORT __declspec( dllimport ) +# endif +#else +# define HEXABLOCKGUI_DOCUMENTPANEL_EXPORT +#endif + + + +#include + +#include "ui_Vertex_QTD.h" +#include "ui_Quad_QTD.h" +#include "ui_Edge_QTD.h" +#include "ui_Hexa_QTD.h" + +#include "ui_Vector_QTD.h" +#include "ui_Cylinder_QTD.h" +#include "ui_Pipe_QTD.h" +#include "ui_MakeGrid_QTD.h" +#include "ui_MakePipe_QTD.h" +#include "ui_MakeCylinder_QTD.h" +#include "ui_MakeCylinders_QTD.h" +#include "ui_MakePipes_QTD.h" +#include "ui_RemoveHexa_QTD.h" +#include "ui_PrismQuad_QTD.h" +#include "ui_JoinQuad_QTD.h" +#include "ui_Merge_QTD.h" +#include "ui_Disconnect_QTD.h" +#include "ui_CutEdge_QTD.h" +#include "ui_Transformation_QTD.h" +#include "ui_Symmetry_QTD.h" + +#include "ui_EdgeAssoc_QTD.h" +#include "ui_QuadAssoc_QTD.h" + +#include "ui_Group_QTD.h" +#include "ui_Law_QTD.h" +#include "ui_Propagation_QTD.h" + + +#include "ui_QuadRevolution_QTD.h" +#include "ui_MakeRind_QTD.h" +#include "ui_ReplaceHexa_QTD.h" +#include "ui_MakeHemiSphere_QTD.h" + + +#include "MyGEOMBase_Helper.hxx" + + + +#include "HexVertex.hxx" +#include "HexEdge.hxx" +#include "HexQuad.hxx" +#include "HexHexa.hxx" + + +#include "HEXABLOCKGUI_DocumentSelectionModel.hxx" +#include "HEXABLOCKGUI_DocumentModel.hxx" +// #include "HEXABLOCKGUI_SalomeTools.hxx" + +#include "klinkitemselectionmodel.hxx" + + + +Q_DECLARE_METATYPE(QModelIndex); +Q_DECLARE_METATYPE(HEXABLOCK::GUI::DocumentModel::GeomObj); +Q_DECLARE_METATYPE(GEOM::GeomObjPtr); + +// class MyBasicGUI_PointDlg; + +namespace HEXABLOCK +{ + namespace GUI + { + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT HexaBaseDialog : public QDialog, + public MyGEOMBase_Helper + { + Q_OBJECT + + public: + enum Mode { + NEW_MODE, + INFO_MODE, + UPDATE_MODE + }; + + // define input widget type => usefull for selection + typedef HexaTreeRole HexaWidgetType; + typedef TopAbs_ShapeEnum/*int */GeomWidgetType; //CS_TODO + +// TopAbs_ShapeEnum aType = TopAbs_EDGE; + + // listwidget + enum { + LW_QMODELINDEX_ROLE = Qt::UserRole + 1, + LW_ASSOC_ROLE, + LW_GEOM_OBJ_ROLE + }; + + HexaBaseDialog( QWidget * parent = 0, Mode editmode = NEW_MODE, Qt::WindowFlags f = 0 ); + virtual ~HexaBaseDialog(); + + // clear all input widget + virtual void clear(); + + // model + virtual void setDocumentModel( DocumentModel* m ); + + // selection + virtual void setPatternDataSelectionModel( PatternDataSelectionModel* s ); + virtual void setPatternBuilderSelectionModel( PatternBuilderSelectionModel* s ); + virtual void setGroupsSelectionModel( GroupsSelectionModel* s ); + virtual void setMeshSelectionModel( MeshSelectionModel* s ); + + public slots: + //virtual void accept(); + virtual bool apply(); + virtual void close(); + virtual void onHelpRequested(); + + + protected: + virtual bool eventFilter(QObject *obj, QEvent *event); + virtual void hideEvent ( QHideEvent * event ); + virtual void showEvent ( QShowEvent * event ); + virtual bool apply(QModelIndex& result) = 0; + + virtual void _initInputWidget( Mode editmode )=0; //must be implemented on inherited dialog box + virtual QGroupBox* _initButtonBox( Mode editmode ); + void _initWidget( Mode editmode ); // call _initInputWidget() & _initButtonBox() + + void _initViewManager(); + + + void _allowSelection(); + void _disallowSelection(); + QItemSelectionModel* _allowSelection( HexaWidgetType wtype ); + + bool _allowVTKSelection( QObject* obj ); + bool _allowOCCSelection( QObject* obj ); + QItemSelectionModel* _getSelector( QObject* obj ); + + + bool _onSelectionChanged( const QItemSelection& sel, QLineEdit* le ); + bool _onSelectionChanged( const QItemSelection& sel, QListWidget* lw ); + + void _selectAndHighlight( const QModelIndex& i ); + + + Mode _editMode; + + DocumentModel* _documentModel; + + // user selection + PatternDataSelectionModel* _patternDataSelectionModel; + PatternBuilderSelectionModel* _patternBuilderSelectionModel; + GroupsSelectionModel* _groupsSelectionModel; + MeshSelectionModel* _meshSelectionModel; + + QMap _index; + QObject* _currentObj; + + int _expectedSelection; + bool _selectionMutex; + + LightApp_SelectionMgr* _mgr; + SUIT_ViewManager* _vtkVm; + SUIT_ViewManager* _occVm; + + QMap _strHexaWidgetType; + + //QPushButton* _applyCloseButton; + QPushButton* _applyButton; + + QString _helpFileName; + + protected slots: + virtual void onSelectionChanged( const QItemSelection& sel, const QItemSelection& unsel ); //from qt model/view selectionManager + virtual void onCurrentSelectionChanged();//from salome selectionManager + virtual void onWindowActivated( SUIT_ViewManager* vm ); + virtual void updateButtonBox(); + void updateName(); + void selectElementOfModel(); + + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT VertexDialog : public HexaBaseDialog, + public Ui::VertexDialog + { + Q_OBJECT + + public: + VertexDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~VertexDialog(); + + void clear(); + + void setValue(HEXA_NS::Vertex* v); + HEXA_NS::Vertex* getValue(); + + void setIndex(const QModelIndex& i); + + public slots: + virtual bool apply(QModelIndex& result); +// void updateName(); + + protected: + void _initInputWidget( Mode editmode ); + + private: + HEXA_NS::Vertex *_value; + QModelIndex _ivalue; + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT EdgeDialog : public HexaBaseDialog, + public Ui::EdgeDialog + { + Q_OBJECT + + public: + EdgeDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~EdgeDialog(); + + void clear(); + + void setValue(HEXA_NS::Edge* e); + HEXA_NS::Edge* getValue(); + + protected: + void _initInputWidget( Mode editmode ); + + public slots: + virtual bool apply(QModelIndex& result); +// void updateName(); + + private: + HEXA_NS::Edge *_value; + QModelIndex _ivalue; + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT QuadDialog : public HexaBaseDialog, + public Ui::QuadDialog + { + Q_OBJECT + + public: + QuadDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~QuadDialog(); + + void clear(); + + void setValue(HEXA_NS::Quad* v); + HEXA_NS::Quad* getValue(); + + public slots: + virtual bool apply(QModelIndex& result); +// void updateName(); + + protected: + void _initInputWidget( Mode editmode ); + + private: + HEXA_NS::Quad *_value; + QModelIndex _ivalue; + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT HexaDialog : public HexaBaseDialog, + public Ui::HexaDialog + { + Q_OBJECT + + public: + HexaDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~HexaDialog(); + + void clear(); + + void setValue(HEXA_NS::Hexa* v); + HEXA_NS::Hexa* getValue(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + protected slots: + void deleteQuadItem(); + void deleteVertexItem(); + void updateButtonBox(); + + private: + void _setValueQuads( HEXA_NS::Hexa* h ); + void _setValueVertices( HEXA_NS::Hexa* h ); + + HEXA_NS::Hexa *_value; + QModelIndex _ivalue; + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT VectorDialog : public HexaBaseDialog, + public Ui::VectorDialog + { + Q_OBJECT + + public: + VectorDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~VectorDialog(); + + void clear(); + + void setValue(HEXA_NS::Vector* v); + HEXA_NS::Vector* getValue(); + + public slots: + virtual bool apply(QModelIndex& result); +// void updateName(); + + protected: + void _initInputWidget( Mode editmode ); + + private: + HEXA_NS::Vector *_value; + QModelIndex _ivalue; + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT CylinderDialog : public HexaBaseDialog, + public Ui::CylinderDialog + { + Q_OBJECT + + public: + CylinderDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~CylinderDialog(); + + void clear(); + + void setValue( HEXA_NS::Cylinder* v ); + HEXA_NS::Cylinder* getValue(); + + public slots: + virtual bool apply(QModelIndex& result); +// void updateName(); + + protected: + void _initInputWidget( Mode editmode ); + + private: + HEXA_NS::Cylinder *_value; + QModelIndex _ivalue; + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT PipeDialog : public HexaBaseDialog, + public Ui::PipeDialog + { + Q_OBJECT + + public: + PipeDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~PipeDialog(); + + void clear(); + + void setValue( HEXA_NS::Pipe* p ); + HEXA_NS::Pipe* getValue(); + + public slots: + virtual bool apply(QModelIndex& result); +// void updateName(); + + protected: + void _initInputWidget( Mode editmode ); + + private: + HEXA_NS::Pipe *_value; + QModelIndex _ivalue; + + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT MakeGridDialog : public HexaBaseDialog, + public Ui::MakeGridDialog + { + Q_OBJECT + + public: + MakeGridDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~MakeGridDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + protected slots: + void addRadiusItem(); + void delRadiusItem(); + void addAngleItem(); + void delAngleItem(); + void addHeightItem(); + void delHeightItem(); + void updateButtonBox(); + + protected slots: + void updateHelpFileName(); + + }; + + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT MakeCylinderDialog : public HexaBaseDialog, + public Ui::MakeCylinderDialog + { + Q_OBJECT + + public: + MakeCylinderDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~MakeCylinderDialog(); + + void clear(); + + protected: + void _initInputWidget( Mode editmode ); + + public slots: + virtual bool apply(QModelIndex& result); + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT MakePipeDialog : public HexaBaseDialog, + public Ui::MakePipeDialog + { + Q_OBJECT + + public: + MakePipeDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~MakePipeDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT MakeCylindersDialog : public HexaBaseDialog, + public Ui::MakeCylindersDialog + { + Q_OBJECT + + public: + MakeCylindersDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~MakeCylindersDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT MakePipesDialog : public HexaBaseDialog, + public Ui::MakePipesDialog + { + Q_OBJECT + + public: + MakePipesDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~MakePipesDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT RemoveHexaDialog : public HexaBaseDialog, + public Ui::RemoveHexaDialog + { + Q_OBJECT + + public: + RemoveHexaDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~RemoveHexaDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT PrismQuadDialog : public HexaBaseDialog, + public Ui::PrismQuadDialog + { + Q_OBJECT + + public: + PrismQuadDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~PrismQuadDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + private slots: + void addQuad(); + void removeQuad(); + void clearQuads(); + + }; + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT JoinQuadDialog : public HexaBaseDialog, + public Ui::JoinQuadDialog + { + Q_OBJECT + + public: + JoinQuadDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~JoinQuadDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + private slots: + void addQuad(); + void removeQuad(); + void clearQuads(); + + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT MergeDialog : public HexaBaseDialog, + public Ui::MergeDialog + { + Q_OBJECT + + public: + MergeDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~MergeDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + protected slots: + void updateHelpFileName(); + + + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT DisconnectDialog : public HexaBaseDialog, + public Ui::DisconnectDialog + { + Q_OBJECT + + public: + DisconnectDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~DisconnectDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + protected slots: + void updateHelpFileName(); + void deleteEdgeItem(); + void deleteHexaItem(); + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT CutEdgeDialog : public HexaBaseDialog, + public Ui::CutEdgeDialog + { + Q_OBJECT + + public: + CutEdgeDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~CutEdgeDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT MakeTransformationDialog : public HexaBaseDialog, + public Ui::TransformationDialog + { + Q_OBJECT + + public: + MakeTransformationDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~MakeTransformationDialog (); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + protected slots: + void updateHelpFileName(); + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT MakeSymmetryDialog : public HexaBaseDialog, + public Ui::SymmetryDialog + { + Q_OBJECT + + public: + MakeSymmetryDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~MakeSymmetryDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + protected slots: + void updateHelpFileName(); + }; + + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT PerformTransformationDialog : public HexaBaseDialog, + public Ui::TransformationDialog + { + Q_OBJECT + + public: + PerformTransformationDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~PerformTransformationDialog (); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + protected slots: + void updateHelpFileName(); + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT PerformSymmetryDialog : public HexaBaseDialog, + public Ui::SymmetryDialog + { + Q_OBJECT + + public: + PerformSymmetryDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~PerformSymmetryDialog(); + + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + protected slots: + void updateHelpFileName(); + }; + + +// typedef class MyBasicGUI_PointDlg VertexAssocDialog; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT EdgeAssocDialog : public HexaBaseDialog, + public Ui::EdgeAssocDialog + { + Q_OBJECT + + public: + EdgeAssocDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~EdgeAssocDialog(); + void clear(); + + void setGeomEngine( GEOM::GEOM_Gen_var geomEngine ); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + virtual void _initInputWidget( Mode editmode ); +// virtual void hideEvent ( QHideEvent * event ); +// virtual void showEvent ( QShowEvent * event ); + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool execute( ObjectList& ); + + protected slots: + virtual void onCurrentSelectionChanged(); +// void onSelectionChanged( const QItemSelection& sel, const QItemSelection& unsel ); + virtual void onWindowActivated(SUIT_ViewManager*); + + void deleteEdgeItem(); + void deleteLineItem(); + + void addLine(); + void pstartChanged( double val ); + void pendChanged( double val ); + + private: + // Preview in GEOM +// GEOM::GeomObjPtr _firstLine; +// GEOM::GeomObjPtr _lastLine; + GEOM::GeomObjPtr _currentLine; + GEOM::GeomObjPtr myLine; + double _currentParameter; + GEOM::GEOM_Gen_var _geomEngine ; + + }; + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT QuadAssocDialog : public HexaBaseDialog, + public Ui::QuadAssocDialog + { + Q_OBJECT + + public: + QuadAssocDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~QuadAssocDialog(); + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + virtual void _initInputWidget( Mode editmode ); +// virtual void hideEvent ( QHideEvent * event ); +// virtual void showEvent ( QShowEvent * event ); + + protected slots: + virtual void onCurrentSelectionChanged(); + virtual void onWindowActivated(SUIT_ViewManager*); + void deleteFaceItem(); + + private: + QList _assocs; + QShortcut* _delFaceShortcut; + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT GroupDialog : public HexaBaseDialog, + public Ui::GroupDialog + { + Q_OBJECT + + QMap strKind; + + public: + GroupDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~GroupDialog(); + void clear(); + + void setValue(HEXA_NS::Group* v); + HEXA_NS::Group* getValue(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + private slots: +// void addEltBase(); + void removeEltBase(); +// void clearEltBase(); + void onKindChanged( int index ); + + private: + HEXA_NS::Group *_value; + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT LawDialog : public HexaBaseDialog, + public Ui::LawDialog + { + Q_OBJECT + + QMap strKind; + + public: + LawDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~LawDialog(); + void clear(); + + void setValue(HEXA_NS::Law* v); + HEXA_NS::Law* getValue(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + private: + HEXA_NS::Law *_value; + }; + + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT PropagationDialog : public HexaBaseDialog, + public Ui::PropagationDialog + { + Q_OBJECT + + public: + PropagationDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~PropagationDialog(); + void clear(); + + void setValue(HEXA_NS::Propagation* v); + HEXA_NS::Propagation* getValue(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + protected slots: + void updateHelpFileName(); + void deletePropagationItem(); + + private: + HEXA_NS::Propagation *_value; + }; + + + + // Define the compute mesh dialog box + // ---------------------------------- + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT ComputeMeshDialog : public HexaBaseDialog + { + Q_OBJECT + + public: + ComputeMeshDialog( QWidget* parent = 0, Mode editmode = NEW_MODE, Qt::WindowFlags f = Qt::SubWindow ); + virtual ~ComputeMeshDialog(); + void clear(); + + void setDocumentModel(DocumentModel* m); + + public slots: + virtual bool apply(QModelIndex& result); +// virtual void accept(); +// virtual void reject(); + + protected: + void _initInputWidget( Mode editmode ); + + private: + QLineEdit* _name; + QSpinBox* _dim; + QLineEdit* _fact; + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT ReplaceHexaDialog : public HexaBaseDialog, + public Ui::ReplaceHexaDialog + { + Q_OBJECT + + public: + ReplaceHexaDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~ReplaceHexaDialog(); + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + protected slots: + void deleteQuadItem(); + void updateButtonBox(); + + private: + HEXA_NS::Elements *_value; + }; + + + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT QuadRevolutionDialog : public HexaBaseDialog, + public Ui::QuadRevolutionDialog + { + Q_OBJECT + + public: + QuadRevolutionDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~QuadRevolutionDialog(); + void clear(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + protected slots: + void addAngleItem(); + void delAngleItem(); + void delQuadItem(); + void updateButtonBox(); + + private: + HEXA_NS::Elements *_value; + }; + + + + class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT MakeHemiSphereDialog : public HexaBaseDialog, + public Ui::MakeHemiSphereDialog + { + Q_OBJECT + + public: + MakeHemiSphereDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); + virtual ~MakeHemiSphereDialog(); + void clear(); + +// void setValue(HEXA_NS::Propagation* v); +// HEXA_NS::Propagation* getValue(); + + public slots: + virtual bool apply(QModelIndex& result); + + protected: + void _initInputWidget( Mode editmode ); + + private: + HEXA_NS::Elements *_value; + }; + +// class HEXABLOCKGUI_DOCUMENTPANEL_EXPORT MakeRindDialog : public HexaBaseDialog, +// public Ui::MakeRindDialog +// { +// Q_OBJECT +// +// public: +// MakeRindDialog( QWidget* = 0, Mode = NEW_MODE, Qt::WindowFlags = Qt::SubWindow );//= 0 ); +// virtual ~MakeRindDialog(); +// +// public slots: +// virtual bool apply(QModelIndex& result); +// +// private: +// // HEXA_NS::Propagation *_value;:q +// +// }; + + + } +} + + + +#endif diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentSelectionModel.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentSelectionModel.cxx new file mode 100755 index 0000000..393c908 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentSelectionModel.cxx @@ -0,0 +1,1406 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include + + +#include "utilities.h" + +#include +#include +#include +#include + +#include + +#include "SOCC_ViewModel.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +#include "HEXABLOCKGUI_SalomeTools.hxx" +#include "HEXABLOCKGUI_DocumentSelectionModel.hxx" +#include "HEXABLOCKGUI_DocumentModel.hxx" +#include "HEXABLOCKGUI_DocumentGraphicView.hxx" +#include "HEXABLOCKGUI_DocumentItem.hxx" +#include "HEXABLOCKGUI.hxx" + + +#include +#include + + +#include +#include +#include +#include +#include + +#include + +#include "GEOMBase.h" +#include "MyGEOMBase_Helper.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +//#define _DEVDEBUG_ +using namespace std; +using namespace HEXABLOCK::GUI; + + + +PatternDataSelectionModel::PatternDataSelectionModel( QAbstractItemModel * model ): +QItemSelectionModel( model ), +MyGEOMBase_Helper( SUIT_Session::session()->activeApplication()->desktop() ), +_theModelSelectionChanged(false), +_theVtkSelectionChanged(false), +_theGeomSelectionChanged(false), +_selectionFilter(-1), +_salomeSelectionMgr(0) +{ + connect( this, SIGNAL( currentChanged( const QModelIndex &, const QModelIndex & ) ), + this, SLOT( onCurrentChanged( const QModelIndex & , const QModelIndex & ) ) ); + connect( this, SIGNAL( selectionChanged( const QItemSelection & , const QItemSelection & ) ), + this, SLOT( onSelectionChanged( const QItemSelection & , const QItemSelection & ) ) ); + +} + + +PatternDataSelectionModel::~PatternDataSelectionModel() +{ + disconnect( this, SIGNAL( currentChanged( const QModelIndex &, const QModelIndex & ) ), + this, SLOT( onCurrentChanged( const QModelIndex & , const QModelIndex & ) ) ); + disconnect( this, SIGNAL( selectionChanged( const QItemSelection & , const QItemSelection & ) ), + this, SLOT( onSelectionChanged( const QItemSelection & , const QItemSelection & ) ) ); + +// if ( _salomeSelectionMgr ) +// disconnect( _salomeSelectionMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( salomeSelectionChanged() ) ); + disconnect( HEXABLOCKGUI::selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( salomeSelectionChanged() ) ); +} + + +void PatternDataSelectionModel::setVertexSelection() +{ + MESSAGE("PatternDataSelectionModel::setVertexSelection(){"); + SetSelectionMode(NodeSelection); +// // NodeSelection, +// // CellSelection, +// // EdgeOfCellSelection, +// // EdgeSelection, +// // FaceSelection, +// // VolumeSelection, +// // ActorSelection }; + _selectionFilter = VERTEX_TREE; + MESSAGE("}"); +} + +void PatternDataSelectionModel::setEdgeSelection() +{ + MESSAGE("PatternDataSelectionModel::setEdgeSelection(){"); + SetSelectionMode(EdgeSelection); + _selectionFilter = EDGE_TREE; + MESSAGE("}"); +} + +void PatternDataSelectionModel::setQuadSelection() +{ + MESSAGE("PatternDataSelectionModel::setQuadSelection(){"); + SetSelectionMode(FaceSelection); + _selectionFilter = QUAD_TREE; + MESSAGE("}"); +} + +void PatternDataSelectionModel::setHexaSelection() +{ + MESSAGE("PatternDataSelectionModel::setHexaSelection(){"); + SetSelectionMode(VolumeSelection); + _selectionFilter = HEXA_TREE; + MESSAGE("}"); +} + + +void PatternDataSelectionModel::setAllSelection() +{ + MESSAGE("PatternDataSelectionModel::setAllSelection(){"); + _selectionFilter = -1; + MESSAGE("}"); +} + + +QModelIndex PatternDataSelectionModel::indexBy( int role, const QString& value ) +{ + QModelIndex eltIndex; // element (vertex, edge, quad) of model + const QAbstractItemModel* theModel = model(); + if ( !theModel ) return eltIndex; + QModelIndexList theIndexes = theModel->match( theModel->index(0, 0), + role, + value, + 1, + Qt::MatchRecursive | Qt::MatchContains );//Qt::MatchFixedString ); + if ( theIndexes.count()>0 ) + eltIndex = theIndexes[0] ; + return eltIndex; +} + + +QModelIndex PatternDataSelectionModel::indexBy( int role, const QVariant& var ) +{ + QModelIndex eltIndex; // element (vertex, edge, quad) of model + const QAbstractItemModel* theModel = model(); + if ( !theModel ) return eltIndex; + QModelIndexList theIndexes = theModel->match( theModel->index(0, 0), + role, + var, + 1, + Qt::MatchRecursive /*| Qt::MatchContains*/ );//Qt::MatchFixedString ); + if ( theIndexes.count()>0 ) + eltIndex = theIndexes[0] ; + return eltIndex; +} + + +void PatternDataSelectionModel::setSalomeSelectionMgr( LightApp_SelectionMgr* mgr ) +{ + _salomeSelectionMgr = mgr; + connect( _salomeSelectionMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( salomeSelectionChanged() ) ); +} + + +void PatternDataSelectionModel::SetSelectionMode(Selection_Mode theMode) +{ + MESSAGE("PatternDataSelectionModel::SetSelectionMode(){"); + SVTK_ViewWindow* aVTKViewWindow = _getVTKViewWindow(); +// aViewWindow->clearFilters(); +// _salomeSelectionMgr->clearFilters(); + if ( aVTKViewWindow ) + aVTKViewWindow->SetSelectionMode( theMode ); + MESSAGE("}"); +} + + +// A) De Salome(OCC, VTK) vers Hexablock(TreeView Data) : +// -Vertex: +// in: selection (vertex associé OCC). +// out: (vertex VTK) highlighté, (vertex TreeView) sélectionné. +// +// in : selection (vertex associé VTK). +// out: (vertex OCC) highlighté, (vertex TreeView) sélectionné. +// +// -Edge: +// in: selection (edge associé OCC). +// out: (vertex VTK) highlighté, (vertex TreeView) sélectionné. +// +// in: selection (edge associé VTK). +// out: (toute la ligne OCC) highlighté + vertex sur (deb,fin) , (edge TreeView) sélectionné. +// +// -Face: idem vertex +void PatternDataSelectionModel::onCurrentChanged( const QModelIndex & current, const QModelIndex & previous ) +{ + MESSAGE("PatternDataSelectionModel::onCurrentChanged(){"); + MESSAGE("* current : " << current.data().toString().toStdString()); + MESSAGE("* previous : " << previous.data().toString().toStdString()); +// _selectSalome( current, true ); +// _selectSalome( previous, false ); + MESSAGE("}"); +} + + + +void PatternDataSelectionModel::onSelectionChanged( const QItemSelection & selected, const QItemSelection & deselected ) +{ + MESSAGE("PatternDataSelectionModel::onSelectionChanged(){"); + foreach( const QModelIndex& isel, selected.indexes() ){ + MESSAGE("* selected : " << isel.data().toString().toStdString()); + } + foreach( const QModelIndex& iunsel, deselected.indexes() ){ + MESSAGE("* unselected : " << iunsel.data().toString().toStdString()); + } + + _theModelSelectionChanged = true; + try { + if ( _salomeSelectionMgr == NULL ) return; +// if ( !_theVtkSelectionChanged and !_theGeomSelectionChanged ) return; + + _salomeSelectionMgr->clearSelected(); + // erasePreview(true); + QModelIndexList indexes = selected.indexes(); + for( QModelIndexList::const_iterator i_index = indexes.begin(); i_index != indexes.end(); ++i_index ){ + // std::cout << "entry selected" << i_index->data( HEXA_ENTRY_ROLE ).toString().toStdString() << std::endl; + if ( !_theVtkSelectionChanged ) _selectVTK( *i_index ); + if ( !_theGeomSelectionChanged ) _highlightGEOM( *i_index ); + } + // CS_BP todo SALOMEGUI_Swig.cxx:370 + // indexes = deselected.indexes(); + // for( QModelIndexList::const_iterator i_index = indexes.begin(); i_index != indexes.end(); ++i_index ) + // _unselectSalome( *i_index); + } catch ( ... ) { + MESSAGE("Unknown exception was cought !!!"); + } + _theModelSelectionChanged = false; + + MESSAGE("}"); +} + + +void PatternDataSelectionModel::salomeSelectionChanged() +{ + MESSAGE("PatternDataSelectionModel::salomeSelectionChanged(){"); + try { + QModelIndex toSelect; + + if ( _salomeSelectionMgr == NULL ) return; + SALOME_ListIO salomeSelected; + // _salomeSelectionMgr->selectedObjects( salomeSelected, SVTK_Viewer::Type() );//salomeSelected.Extent() + _salomeSelectionMgr->selectedObjects( salomeSelected, NULL, false ); + if ( salomeSelected.IsEmpty() ){ + MESSAGE("* salomeSelected.IsEmpty()"); + clearSelection(); + return; + } + + Handle(SALOME_InteractiveObject) anIObject; + SALOME_ListIteratorOfListIO it(salomeSelected); + for( ; it.More(); it.Next()){ + anIObject = it.Value(); //anIObject->getName() + toSelect = _geomSelectionChanged( anIObject );// is it comming from GEOM? + if ( !toSelect.isValid() ){ + toSelect = _vtkSelectionChanged( anIObject ); ;// or VTK?... + if ( toSelect.isValid() ) + MESSAGE("* OK : selection from VTK"); + } else { + MESSAGE("* OK : selection from GEOM"); + } + } + } catch ( ... ) { + MESSAGE("* Unknown exception was cought !!!"); + } + MESSAGE("}"); +} + +SVTK_ViewWindow* PatternDataSelectionModel::_getVTKViewWindow() +{ + SVTK_ViewWindow* aVtkView = HEXABLOCKGUI::currentVtkView; + return aVtkView; +} + + +OCCViewer_ViewWindow* PatternDataSelectionModel::_getOCCViewWindow() +{ + OCCViewer_ViewWindow* aOccView = HEXABLOCKGUI::currentOccView; + return aOccView; +} + + +QModelIndex PatternDataSelectionModel::_indexOf( const QString& anEntry, int role ) +{ + QModelIndex eltIndex; // element (vertex, edge, quad) of model + const QAbstractItemModel* theModel = model(); + if ( !theModel ) return eltIndex; + QModelIndexList theIndexes = theModel->match( theModel->index(0, 0), + role, + anEntry, + 1, + Qt::MatchRecursive | Qt::MatchContains );//Qt::MatchFixedString ); + if ( theIndexes.count()>0 ) + eltIndex = theIndexes[0] ; + return eltIndex; +} + + +void PatternDataSelectionModel::_setVTKSelectionMode( const QModelIndex& eltIndex, SVTK_ViewWindow* vtkViewWindow ) +{ + MESSAGE("PatternDataSelectionModel::_setVTKSelectionMode( "<< eltIndex.data().toString().toStdString() << " ," << vtkViewWindow << " )"); + QVariant treeVariant = eltIndex.data( HEXA_TREE_ROLE ); + if ( !treeVariant.isValid() ) return; + int eltType = treeVariant.toInt(); + + if ( (_selectionFilter != -1) and ( _selectionFilter != eltType ) ) return; + + switch ( eltType ){ + case VERTEX_TREE : + case VERTEX_DIR_TREE : vtkViewWindow->SetSelectionMode(NodeSelection); MESSAGE("VERTEX"); break; + case EDGE_TREE : + case EDGE_DIR_TREE : vtkViewWindow->SetSelectionMode(EdgeSelection); MESSAGE("EDGE"); break; + case QUAD_TREE : + case QUAD_DIR_TREE : vtkViewWindow->SetSelectionMode(FaceSelection); MESSAGE("QUAD"); break; + case HEXA_TREE : + case HEXA_DIR_TREE : vtkViewWindow->SetSelectionMode(VolumeSelection); MESSAGE("HEXA"); break; + case PROPAGATION_TREE : + case PROPAGATION_DIR_TREE : vtkViewWindow->SetSelectionMode(EdgeSelection); MESSAGE("PROPAGATION"); break; +// CellSelection, +// EdgeOfCellSelection, +// VolumeSelection, +// ActorSelection + } +} + + + +void PatternDataSelectionModel::highlightVTKElts( const QModelIndexList& elts ) +{ + if (!elts.size()) return; + + SVTK_ViewWindow* currentVTKViewWindow = _getVTKViewWindow(); + if ( currentVTKViewWindow == NULL ) return; + SVTK_Selector* selector = currentVTKViewWindow->GetSelector(); + if ( selector == NULL ) return; + + // document selection + Document_Actor* docActor = NULL; + Handle(SALOME_InteractiveObject) docIO; + + // element highlight + TColStd_MapOfInteger aMap; + QList::const_iterator anIter; + int vtkElemsId; + + // data from model + QString docEntry; + QVariant docEntryVariant = elts[0].data( HEXA_DOC_ENTRY_ROLE ); + + if ( !docEntryVariant.isValid() ){ + //INFOS("data from model not valid"); + return; + } + + docEntry = docEntryVariant.toString(); + + // Select the document in Salome + docActor = dynamic_cast( findActorByEntry( currentVTKViewWindow, docEntry.toLatin1() ) ); + if ( docActor == NULL) return; + + // // Set selection mode in VTK view +// currentVTKViewWindow->SetSelectionMode(EdgeSelection); + docIO = docActor->getIO(); + + // Highlight in vtk view the element from document + QString edgeEntry; + foreach( const QModelIndex& iElt, elts ){ + edgeEntry = iElt.data( HEXA_ENTRY_ROLE ).toString(); + vtkElemsId = docActor->vtkElemsId[ edgeEntry.toInt() ]; + if ( vtkElemsId > 0 ) aMap.Add( vtkElemsId ); + } + + selector->AddOrRemoveIndex( docIO, aMap, false ); + currentVTKViewWindow->highlight( docIO, true, true ); +} + +// 1 vertex -> 1 point +// 1 edge -> n lines + points(deb,fin) +// 1 quad -> n faces +void PatternDataSelectionModel::_highlightGEOM( const QMultiMap& entrySubIDs ) +{ + MESSAGE("PatternDataSelectionModel::_highlightGEOM( const QMultiMap& entrySubIDs ){"); + + OCCViewer_ViewWindow* occView = _getOCCViewWindow(); + if ( occView == NULL ) return; + SOCC_Viewer* soccViewer = dynamic_cast( occView->getViewManager()->getViewModel() ); + if (!soccViewer) return; + _PTR(Study) aStudy = GetActiveStudyDocument(); + if (!aStudy) return; + + CORBA::Object_var aCorbaObj = CORBA::Object::_nil(); + GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_nil(); + erasePreview(true); + foreach ( QString entry, entrySubIDs.keys() ){ + _PTR(SObject) aSChild = aStudy->FindObjectID( entry.toStdString() ); + MESSAGE("* entry => "<< entry.toStdString()); + aCorbaObj = corbaObj( aSChild ); + aGeomObj = GEOM::GEOM_Object::_narrow( aCorbaObj ); + if ( !CORBA::is_nil(aGeomObj) ){ + MESSAGE("* !CORBA::is_nil(aGeomObj)"); + QString objIOR = GEOMBase::GetIORFromObject( aGeomObj._retn() ); + Handle(GEOM_AISShape) aSh = GEOMBase::ConvertIORinGEOMAISShape( objIOR );//, true ); + if ( !aSh.IsNull() ){ + MESSAGE("* !aSh.IsNull() "); + TColStd_IndexedMapOfInteger anIndexes; + foreach ( int subid, entrySubIDs.values(entry) ){ + if ( subid != -1 ) + anIndexes.Add( subid ); + } + if ( anIndexes.Extent() > 0 ){ // if it's a sub-shape + MESSAGE("* a sub-shape"); + aSh->highlightSubShapes( anIndexes, true ); + soccViewer->Repaint(); + } else { // or a main shape +// std::cout << "aSh->getIO() => " << aSh->getIO() << std::endl; +// getDisplayer()->SetDisplayMode(0); +// soccViewer->setColor( aSh->getIO(), QColor( Qt::red ), true ); +// soccViewer->switchRepresentation( aSh->getIO(), 2 ); + MESSAGE("* a main shape"); +// globalSelection(); + soccViewer->highlight( aSh->getIO(), true, true ); + } + } + } + } + + MESSAGE("}"); +} + + +void PatternDataSelectionModel::_highlightGEOM( const QModelIndex & anEltIndex ) +{ + MESSAGE("PatternDataSelectionModel::_highlightGEOM(" << anEltIndex.data().toString().toStdString() << ")"); + // getting association(s) from model + QList assocs; + QMultiMap< QString, int > assocEntrySubIDs; + DocumentModel *docModel = NULL; + const QSortFilterProxyModel *pModel = dynamic_cast( model() ); + + if ( !pModel ) return; + docModel = dynamic_cast( pModel->sourceModel() ); + if ( !docModel ) return; + assocs = docModel->getAssociations( pModel->mapToSource(anEltIndex) ); + foreach( const DocumentModel::GeomObj& anAssoc, assocs ) + assocEntrySubIDs.insert( anAssoc.entry, anAssoc.subid.toInt() ); + + _highlightGEOM( assocEntrySubIDs ); + MESSAGE("}"); +} + + + +void PatternDataSelectionModel::_selectVTK( const QModelIndex& eltIndex ) +{ + MESSAGE("PatternDataSelectionModel::_selectVTK( "<< eltIndex.data().toString().toStdString() << ")"); + SVTK_ViewWindow* currentVTKViewWindow = _getVTKViewWindow(); + if ( currentVTKViewWindow == NULL ) return; + SVTK_Selector* selector = currentVTKViewWindow->GetSelector(); + if ( selector == NULL ) return; + + // document selection + Document_Actor* docActor = NULL; + Handle(SALOME_InteractiveObject) docIO; + SALOME_ListIO aList; + + // element highlight + TColStd_MapOfInteger aMap; + QList::const_iterator anIter; + int vtkElemsId; + + // data from model + QString eltEntry; + QString docEntry; + QVariant entryVariant = eltIndex.data( HEXA_ENTRY_ROLE ); + QVariant docEntryVariant = eltIndex.data( HEXA_DOC_ENTRY_ROLE ); + + if ( !entryVariant.isValid() ){ + //INFOS("entryVariant not valid"); + return; + } + if ( !docEntryVariant.isValid() ){ + //INFOS("docEntryVariant not valid"); + return; + } + + eltEntry = entryVariant.toString(); + docEntry = docEntryVariant.toString(); + + // Select the document in Salome + docActor = dynamic_cast( findActorByEntry( currentVTKViewWindow, docEntry.toLatin1() ) ); + if ( docActor == NULL ) return; + + // Set selection mode in VTK view + _setVTKSelectionMode( eltIndex, currentVTKViewWindow ); + +// if ( _salomeSelectionMgr == NULL ) return; +// _salomeSelectionMgr->selectedObjects( aList ); +// std::cout<<"aList.Extent() => " << aList.Extent() << std::endl; +// aList.Append(docIO); +// _salomeSelectionMgr->setSelectedObjects( aList, true );//false );//true ); //CS_BP false? + docIO = docActor->getIO(); + + // Highlight in vtk view the element from document + vtkElemsId = docActor->vtkElemsId[ eltEntry.toInt() ];// get vtk ids from actor + if ( vtkElemsId > 0 ) // CS_BP ?: erreur si 1er elt == vertex (0,0,0) + aMap.Add( vtkElemsId ); +// for (anIter = theIds.begin(); anIter != theIds.end(); ++anIter) { +// aMap.Add(*anIter); +// } + selector->AddOrRemoveIndex( docIO, aMap, false ); + currentVTKViewWindow->highlight( docIO, true, true ); + + MESSAGE("}"); +} + +QModelIndex PatternDataSelectionModel::_geomSelectionChanged( const Handle(SALOME_InteractiveObject)& anIObject ) +{ + MESSAGE("PatternDataSelectionModel::_geomSelectionChanged(){"); + QModelIndex eltIndex;// the element of the model which is associated to the geom object and that is to be selected + + bool fromGEOM = ( strcmp("GEOM", anIObject->getComponentDataType()) == 0 ); + if ( !fromGEOM ) return eltIndex; + if (!_salomeSelectionMgr) return eltIndex; + + QString aName; + GEOM::GEOM_Object_var aGeomObj = GEOMBase::ConvertIOinGEOMObject( anIObject ); + + int anIndex = -1; + if ( GEOMBase::IsShape(aGeomObj) ){ + aName = GEOMBase::GetName(aGeomObj); + TColStd_IndexedMapOfInteger anIndexes; + _salomeSelectionMgr->GetIndexes(anIObject, anIndexes); + if ( anIndexes.Extent() == 1 ) + anIndex = anIndexes(1); + QString aGeomObjStudyEntry = aGeomObj->GetStudyEntry(); + QString aGeomObjModelEntry = aGeomObjStudyEntry + "," + QString::number(anIndex) + ";"; + eltIndex = _indexOf( aGeomObjModelEntry, HEXA_ASSOC_ENTRY_ROLE ); + if ( !_theModelSelectionChanged && eltIndex.isValid() ){ // select in model + _theGeomSelectionChanged = true; + // select( newIndex, QItemSelectionModel::ClearAndSelect ); + // select( newIndex, QItemSelectionModel::SelectCurrent ); +// setCurrentIndex( eltIndex, QItemSelectionModel::SelectCurrent ); + setCurrentIndex( eltIndex, QItemSelectionModel::Clear ); //CS_TEST + setCurrentIndex( eltIndex, QItemSelectionModel::SelectCurrent ); + _theGeomSelectionChanged = false; + + } else { + clearSelection(); + } + } + + MESSAGE("}"); + return eltIndex; +} + +QModelIndex PatternDataSelectionModel::_vtkSelectionChanged( const Handle(SALOME_InteractiveObject)& anIObject ) +{ + MESSAGE("PatternDataSelectionModel::_vtkSelectionChanged(){"); + QModelIndex anIOIndex;// // the element of the model which is associated to the Interactive object and that is to be selected + + bool fromVTK = ( strcmp("HEXABLOCK", anIObject->getComponentDataType()) == 0 ); + if ( !fromVTK ) return anIOIndex; + SVTK_ViewWindow* currentVTKViewWindow = _getVTKViewWindow(); + if ( !currentVTKViewWindow ) return anIOIndex; + if ( !anIObject->hasEntry() ) return anIOIndex; + + QString anIOEntry = anIObject->getEntry(); + Document_Actor *anDocActor = NULL; + int anhexaElemsId; + + QString aText = ""; + if ( GetNameOfSelectedElements( currentVTKViewWindow, anIObject, aText ) <= 0 ) return anIOIndex; + anDocActor = dynamic_cast( findActorByEntry( currentVTKViewWindow, anIOEntry.toLatin1() ) ); + if ( !anDocActor ) return anIOIndex; + anhexaElemsId = anDocActor->hexaElemsId[ aText.toInt() ]; + anIOEntry = QString::number( anhexaElemsId ); + anIOIndex = _indexOf( anIOEntry, HEXA_ENTRY_ROLE ); + + if ( !_theModelSelectionChanged && anIOIndex.isValid() ){ // select in model + _theVtkSelectionChanged = true; +// select( anIOIndex, QItemSelectionModel::Clear ); +// select( anIOIndex, QItemSelectionModel::Select ); +// select( anIOIndex, QItemSelectionModel::ClearAndSelect ); +// select( anIOIndex, QItemSelectionModel::SelectCurrent ); +// setCurrentIndex( anIOIndex, QItemSelectionModel::SelectCurrent ); +// setCurrentIndex( anIOIndex, QItemSelectionModel::SelectCurrent ); +// setCurrentIndex( anIOIndex, QItemSelectionModel::ClearAndSelect ); +// setCurrentIndex( anIOIndex, QItemSelectionModel::ClearAndSelect ); + setCurrentIndex( anIOIndex, QItemSelectionModel::Clear ); + setCurrentIndex( anIOIndex, QItemSelectionModel::SelectCurrent ); + _theVtkSelectionChanged = false; + } else { + clearSelection(); + } + +// if (anIOIndex.isValid()) +// _selectVTK(anIOIndex); + + if (anIOIndex.isValid()) + { + QModelIndexList l; + l << anIOIndex; + highlightVTKElts(l); + } + + MESSAGE("}"); + return anIOIndex; +} + + + + + + + +GroupsSelectionModel::GroupsSelectionModel( QAbstractItemModel * model ): +QItemSelectionModel( model ) +{ + connect( this, SIGNAL( currentChanged( const QModelIndex &, const QModelIndex & ) ), + this, SLOT( onCurrentChanged( const QModelIndex & , const QModelIndex & ) ) ); + connect( this, SIGNAL( selectionChanged( const QItemSelection & , const QItemSelection & ) ), + this, SLOT( onSelectionChanged( const QItemSelection & , const QItemSelection & ) ) ); +} + + +GroupsSelectionModel::~GroupsSelectionModel() +{ + disconnect( this, SIGNAL( currentChanged( const QModelIndex &, const QModelIndex & ) ), + this, SLOT( onCurrentChanged( const QModelIndex & , const QModelIndex & ) ) ); + disconnect( this, SIGNAL( selectionChanged( const QItemSelection & , const QItemSelection & ) ), + this, SLOT( onSelectionChanged( const QItemSelection & , const QItemSelection & ) ) ); +} + + + + +QModelIndex GroupsSelectionModel::indexBy( int role, const QVariant& var ) +{ + QModelIndex eltIndex; // element (vertex, edge, quad) of model + const QAbstractItemModel* theModel = model(); + if ( !theModel ) return eltIndex; + QModelIndexList theIndexes = theModel->match( theModel->index(0, 0), + role, + var, + 1, + Qt::MatchRecursive /*| Qt::MatchContains*/ );//Qt::MatchFixedString ); + if ( theIndexes.count()>0 ) + eltIndex = theIndexes[0] ; + return eltIndex; +} + + +SVTK_ViewWindow* GroupsSelectionModel::_getVTKViewWindow() +{ + SVTK_ViewWindow* aVtkView = HEXABLOCKGUI::currentVtkView; + return aVtkView; +} + + +void GroupsSelectionModel::_highlightGroups( const QModelIndex& eltIndex ) +{ + const GroupsModel* m = dynamic_cast( model() ); + +// ---- VTK ---- + if ( m == NULL ) return; + SVTK_ViewWindow* currentVTKViewWindow = _getVTKViewWindow(); + if ( currentVTKViewWindow == NULL ) return; + SVTK_Selector* selector = currentVTKViewWindow->GetSelector(); + if ( selector == NULL ) return; + +// ---- vtkActor + // document selection + Document_Actor* docActor = NULL; + Handle(SALOME_InteractiveObject) docIO; + SALOME_ListIO aList; + + // element highlight + TColStd_MapOfInteger aMap; + QList::const_iterator anIter; + int vtkElemsId; + + + + // debut ** data from model + int eltType; + QString docEntry; + + QVariant treeVariant = eltIndex.data( HEXA_TREE_ROLE ); + QVariant docEntryVariant = eltIndex.data( HEXA_DOC_ENTRY_ROLE ); + + if ( !treeVariant.isValid() || !docEntryVariant.isValid() ){ + //INFOS("data from model not valid"); + return; + } + + eltType = treeVariant.toInt(); + docEntry = docEntryVariant.toString(); + + if ( eltType != GROUP_TREE ){ + //INFOS("bad element type : not a group item" << eltType ); + return; + } + // fin ** data from model + + // Select the document in Salome + docActor = dynamic_cast( findActorByEntry( currentVTKViewWindow, docEntry.toLatin1() ) ); + if ( docActor == NULL) return; + docIO = docActor->getIO(); + + // Highlight in vtk view the element from document + DocumentModel::Group kind; + QModelIndexList iElements = m->getGroupElements( eltIndex, kind ); + + // Set selection mode in VTK view + switch (kind){ + case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: currentVTKViewWindow->SetSelectionMode(VolumeSelection); break; + case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: currentVTKViewWindow->SetSelectionMode(FaceSelection); break; + case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: currentVTKViewWindow->SetSelectionMode(EdgeSelection); break; + case HEXA_NS::VertexNode: currentVTKViewWindow->SetSelectionMode(NodeSelection); break; + } + + QString eltEntry; + foreach( const QModelIndex& iElt, iElements ){ + eltEntry = iElt.data( HEXA_ENTRY_ROLE ).toString(); + vtkElemsId = docActor->vtkElemsId[ eltEntry.toInt() ]; + if ( vtkElemsId > 0 ) aMap.Add( vtkElemsId ); + } + + selector->AddOrRemoveIndex( docIO, aMap, false ); + currentVTKViewWindow->highlight( docIO, true, true ); + +} + +/* +void GroupsSelectionModel::_highlightAssoc( const QModelIndex& eltIndex ) +{ + const GroupsModel* m = dynamic_cast( model() ); + +// ---- VTK ---- + if ( m == NULL ) return; + SVTK_ViewWindow* currentVTKViewWindow = _getVTKViewWindow(); + if ( currentVTKViewWindow == NULL ) return; + SVTK_Selector* selector = currentVTKViewWindow->GetSelector(); + if ( selector == NULL ) return; + +// ---- vtkActor + // document selection + Document_Actor* docActor = NULL; + Handle(SALOME_InteractiveObject) docIO; + SALOME_ListIO aList; + + // element highlight + TColStd_MapOfInteger aMap; + QList::const_iterator anIter; + int vtkElemsId; + + + + // debut ** data from model + int eltType; + QString docEntry; + + QVariant treeVariant = eltIndex.data( HEXA_TREE_ROLE ); + QVariant docEntryVariant = eltIndex.data( HEXA_DOC_ENTRY_ROLE ); + + if ( !treeVariant.isValid() || !docEntryVariant.isValid() ){ + //INFOS("data from model not valid"); + return; + } + + eltType = treeVariant.toInt(); + docEntry = docEntryVariant.toString(); + ){ + //INFOS("bad element typ + if ( eltType != GROUP_TREE ){ + //INFOS("bad element type : not a group item" << eltType ); + return; + } + // fin ** data from model + + // Select the document in Salome + docActor = dynamic_cast( findActorByEntry( currentVTKViewWindow, docEntry.toLatin1() ) ); + if ( docActor == NULL) return; + docIO = docActor->getIO(); + + // Highlight in vtk view the element from document + DocumentModel::Group kind; + QModelIndexList iElements = m->getGroupElements( eltIndex, kind ); + + // Set selection mode in VTK view +/* + switch (kind){ + case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: currentVTKViewWindow->SetSelectionMode(VolumeSelection); break; + case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: currentVTKViewWindow->SetSelectionMode(FaceSelection); break; + case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: currentVTKViewWindow->SetSelectionMode(EdgeSelection); break; + case HEXA_NS::VertexNode: currentVTKViewWindow->SetSelectionMode(NodeSelection); break; + }---/ + + QString eltEntry; + foreach( const QModelIndex& iElt, iElements ){ + eltEntry = iElt.data( HEXA_ENTRY_ROLE ).toString(); + vtkElemsId = docActor->vtkElemsId[ eltEntry.toInt() ]; + if() + if ( vtkElemsId > 0 ) aMap.Add( vtkElemsId ); + } + + selector->AddOrRemoveIndex( docIO, aMap, false ); + currentVTKViewWindow->highlight( docIO, true, true ); + +}*/ + + + +void GroupsSelectionModel::onSelectionChanged( const QItemSelection & selected, const QItemSelection & deselected ) +{ + MESSAGE("GroupsSelectionModel::onSelectionChanged"); + try { + // if ( _salomeSelectionMgr == NULL ) return; + // _salomeSelectionMgr->clearSelected(); + // erasePreview(true); + QModelIndexList indexes = selected.indexes(); + for( QModelIndexList::const_iterator i_index = indexes.begin(); i_index != indexes.end(); ++i_index ){ + MESSAGE( "entry selected" << i_index->data( HEXA_ENTRY_ROLE ).toString().toStdString() ); + _highlightGroups( *i_index ); + } + + // CS_BP todo SALOMEGUI_Swig.cxx:370 + // indexes = deselected.indexes(); + // for( QModelIndexList::const_iterator i_index = indexes.begin(); i_index != indexes.end(); ++i_index ) + // _unselectSalome( *i_index); + } catch ( ... ) { + MESSAGE("Unknown exception was cought !!!"); + } + +} + + + + + + + +MeshSelectionModel::MeshSelectionModel( QAbstractItemModel * model ): +QItemSelectionModel( model ) +{ + connect( this, SIGNAL( currentChanged( const QModelIndex &, const QModelIndex & ) ), + this, SLOT( onCurrentChanged( const QModelIndex & , const QModelIndex & ) ) ); + connect( this, SIGNAL( selectionChanged( const QItemSelection & , const QItemSelection & ) ), + this, SLOT( onSelectionChanged( const QItemSelection & , const QItemSelection & ) ) ); +} + + +MeshSelectionModel::~MeshSelectionModel() +{ + disconnect( this, SIGNAL( currentChanged( const QModelIndex &, const QModelIndex & ) ), + this, SLOT( onCurrentChanged( const QModelIndex & , const QModelIndex & ) ) ); + disconnect( this, SIGNAL( selectionChanged( const QItemSelection & , const QItemSelection & ) ), + this, SLOT( onSelectionChanged( const QItemSelection & , const QItemSelection & ) ) ); +} + + +QModelIndex MeshSelectionModel::indexBy( int role, const QVariant& var ) +{ + QModelIndex eltIndex; // element (vertex, edge, quad) of model + const QAbstractItemModel* theModel = model(); + if ( !theModel ) return eltIndex; + QModelIndexList theIndexes = theModel->match( theModel->index(0, 0), + role, + var, + 1, + Qt::MatchRecursive /*| Qt::MatchContains*/ );//Qt::MatchFixedString ); + if ( theIndexes.count()>0 ) + eltIndex = theIndexes[0] ; + return eltIndex; +} + + + +SVTK_ViewWindow* MeshSelectionModel::_getVTKViewWindow() +{ + SVTK_ViewWindow* aVtkView = HEXABLOCKGUI::currentVtkView; + return aVtkView; +} + + +void MeshSelectionModel::_highlightPropagation( const QModelIndex& eltIndex ) +{ + const MeshModel* m = dynamic_cast( model() ); + if ( m == NULL ) return; + SVTK_ViewWindow* currentVTKViewWindow = _getVTKViewWindow(); + if ( currentVTKViewWindow == NULL ) return; + SVTK_Selector* selector = currentVTKViewWindow->GetSelector(); + if ( selector == NULL ) return; + + // document selection + Document_Actor* docActor = NULL; + Handle(SALOME_InteractiveObject) docIO; + SALOME_ListIO aList; + + // element highlight + TColStd_MapOfInteger aMap; + QList::const_iterator anIter; + int vtkElemsId; + + // data from model + int eltType; + QString docEntry; + + QVariant treeVariant = eltIndex.data( HEXA_TREE_ROLE ); + QVariant docEntryVariant = eltIndex.data( HEXA_DOC_ENTRY_ROLE ); + + if ( !treeVariant.isValid() || !docEntryVariant.isValid() ){ + //INFOS("data from model not valid"); + return; + } + + eltType = treeVariant.toInt(); + docEntry = docEntryVariant.toString(); + + if ( eltType != PROPAGATION_TREE ){ + //INFOS("bad element type : not a propagation item" << eltType ); + return; + } + + // Select the document in Salome + docActor = dynamic_cast( findActorByEntry( currentVTKViewWindow, docEntry.toLatin1() ) ); + if ( docActor == NULL) return; + +// // Set selection mode in VTK view + currentVTKViewWindow->SetSelectionMode(EdgeSelection); + docIO = docActor->getIO(); + + // Highlight in vtk view the element from document + QModelIndexList iEdges = m->getPropagation( eltIndex ); + + QString edgeEntry; + foreach( const QModelIndex& iEdge, iEdges ){ + edgeEntry = iEdge.data( HEXA_ENTRY_ROLE ).toString(); + vtkElemsId = docActor->vtkElemsId[ edgeEntry.toInt() ]; + if ( vtkElemsId > 0 ) aMap.Add( vtkElemsId ); + } + + selector->AddOrRemoveIndex( docIO, aMap, false ); + currentVTKViewWindow->highlight( docIO, true, true ); +} + + + +void MeshSelectionModel::onSelectionChanged( const QItemSelection & selected, const QItemSelection & deselected ) +{ + MESSAGE("MeshSelectionModel::onSelectionChanged"); + try { + // if ( _salomeSelectionMgr == NULL ) return; + // _salomeSelectionMgr->clearSelected(); + // erasePreview(true); + QModelIndexList indexes = selected.indexes(); + for( QModelIndexList::const_iterator i_index = indexes.begin(); i_index != indexes.end(); ++i_index ){ + MESSAGE( "entry selected" << i_index->data( HEXA_ENTRY_ROLE ).toString().toStdString() ); + _highlightPropagation( *i_index ); + } + + // CS_BP todo SALOMEGUI_Swig.cxx:370 + // indexes = deselected.indexes(); + // for( QModelIndexList::const_iterator i_index = indexes.begin(); i_index != indexes.end(); ++i_index ) + // _unselectSalome( *i_index); + } catch ( ... ) { + MESSAGE("Unknown exception was cought !!!"); + } + +} + + + + +// //================================================================================= +// // function : activateSelection +// // purpose : Activate selection in accordance with myEditCurrentArgument +// //================================================================================= +// void PatternDataSelectionModel::activateSelection() +// { +// erasePreview(false); +// +// // local selection +// if (!myObject->_is_nil() && !isAllSubShapes()) +// { +// GEOM_Displayer* aDisplayer = getDisplayer(); +// SALOME_View* view = GEOM_Displayer::GetActiveView(); +// if (view) { +// CORBA::String_var aMainEntry = myObject->GetStudyEntry(); +// Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO"); +// if (view->isVisible(io)) { +// aDisplayer->Erase(myObject, false, false); +// myIsHiddenMain = true; +// } +// } +// +// int prevDisplayMode = aDisplayer->SetDisplayMode(0); +// +// SUIT_ViewWindow* aViewWindow = 0; +// SUIT_Study* activeStudy = SUIT_Session::session()->activeApplication()->activeStudy(); +// if (activeStudy) +// aViewWindow = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); +// if (aViewWindow == 0) return; +// +// SUIT_ViewManager* aViewManager = aViewWindow->getViewManager(); +// if (aViewManager->getType() != OCCViewer_Viewer::Type() && +// aViewManager->getType() != SVTK_Viewer::Type()) +// return; +// +// SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); +// SALOME_View* aView = dynamic_cast(aViewModel); +// if (aView == 0) return; +// +// //TopoDS_Shape aMainShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), myObject); +// +// TopTools_IndexedMapOfShape aSubShapesMap; +// TopExp::MapShapes(myShape, aSubShapesMap); +// CORBA::String_var aMainEntry = myObject->GetStudyEntry(); +// QString anEntryBase = aMainEntry.in(); +// +// TopExp_Explorer anExp (myShape, (TopAbs_ShapeEnum)shapeType()); +// for (; anExp.More(); anExp.Next()) +// { +// TopoDS_Shape aSubShape = anExp.Current(); +// int index = aSubShapesMap.FindIndex(aSubShape); +// QString anEntry = anEntryBase + QString("_%1").arg(index); +// +// SALOME_Prs* aPrs = aDisplayer->buildSubshapePresentation(aSubShape, anEntry, aView); +// if (aPrs) { +// displayPreview(aPrs, true, false); // append, do not update +// } +// } +// aDisplayer->UpdateViewer(); +// aDisplayer->SetDisplayMode(prevDisplayMode); +// } +// +// globalSelection(GEOM_ALLSHAPES); +// } + + + + +// SUIT_DataOwnerPtrList aList; +// ObjectList::iterator anIter; +// for ( anIter = objects.begin(); anIter != objects.end(); ++anIter ) +// { +// QString anEntry = getEntry( *anIter ); +// LightApp_DataOwner* anOwher = new LightApp_DataOwner( anEntry ); +// aList.append( anOwher ); +// } +// +// SUIT_Session* session = SUIT_Session::session(); +// SalomeApp_Application* app = dynamic_cast( session->activeApplication() ); +// if ( !app ) +// return false; +// +// LightApp_SelectionMgr* aMgr = app->selectionMgr(); +// if ( !aMgr ) +// return false; +// _getVTKViewWindow() +// aMgr->setSelecte_getVTKViewWindow()d( aList, false ); + + + + + +// SMESH_Actor* anActor = SMESH::FindActorByObject(myMesh); +// if (!anActor || !anActor->hasIO()) +// return; +// +// Handle(SALOME_InteractiveObject) anIO = anActor->getIO(); +// //mySelectionMgr->clearSelected(); +// //mySelectionMgr->AddIObject(anIO, false); +// SALOME_ListIO aList; +// aList.Append(anIO); +// mySelectionMgr->setSelectedObjects(aList, false); +// +// // Remove filter corresponding to the current type from viewer +// int aType = myTable->GetType(); +// int aFilterId = SMESH::UnknownFilter; +// if (aType == SMESH::EDGE ) aFilterId = SMESH::EdgeFilter; +// else if (aType == SMESH::FACE ) aFilterId = SMESH::FaceFilter; +// else if (aType == SMESH::VOLUME) aFilterId = SMESH::VolumeFilter; +// Handle(VTKViewer_Filter) aFilter = SMESH::GetFilter(aFilterId); +// SMESH::RemoveFilter(aFilterId); +// +// // get vtk ids +// TColStd_MapOfInteger aMap; +// QList::const_iterator anIter; +// for (anIter = theIds.begin(); anIter != theIds.end(); ++anIter) { +// aMap.Add(*anIter); +// } +// +// // Set new selection +// activeViewWindow->AddOrRemoveIndex(anIO, aMap, false); +// if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) +// aViewWindow->highlight( anIO, true, true ); +// +// // insert previously stored filter in viewer if necessary +// if (!aFilter.IsNull()) +// SMESH::SetFilter(aFilter); + + + + + + + + + +// //CS_TEST +// if(SVTK_Selector* aSelector = aView->GetSelector()){ +// const SALOME_ListIO& aListIO = aSelector->StoredIObjects(); +// SALOME_ListIteratorOfListIO anIter(aListIO); +// for(; anIter.More(); anIter.Next()){ +// Handle(SALOME_InteractiveObject) anIO = anIter.Value(); +// _PTR(Study) aStudy = HEXABLOCKGUI::activeStudy()->studyDS(); +// _PTR(SObject) aSObj = aStudy->FindObjectID( anEntry.toStdString().c_str() ); +// LightApp_DataObject* o = HEXABLOCKGUI::activeStudy()->findObjectByEntry(anEntry.toStdString().c_str()); +// //CS_TEST + + + + + +// void PatternDataSelectionModel::test() +// { +// if (myBusy) return; +// myMeshActor = 0; +// +// SALOME_ListIO aList; +// mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); +// +// if (aList.Extent() == 1) { +// Handle(SALOME_InteractiveObject) anIO = aList.First(); +// myMeshActor = SMESH::FindActorByEntry(anIO->getEntry()); +// if(myMeshActor){ +// QString aText; +// if (SMESH::GetNameOfSelectedNodes(activeViewWindow,anIO,aText) == 1) { +// if(SMDS_Mesh* aMesh = myMeshActor->GetObject()->GetMesh()) { +// if(const SMDS_MeshNode* aNode = aMesh->FindNode(aText.toInt())) { +// myBusy = true; +// myId->setText(aText); +// myX->SetValue(aNode->X()); +// myY->SetValue(aNode->Y()); +// myZ->SetValue(aNode->Z()); +// myBusy = false; +// erasePreview(); // avoid overlapping of a selection and a preview +// updateButtons(); +// return; +// } +// } +// } +// } +// } +// +// reset(); +// } + + +/* + +void PatternDataSelectionModel::setGeomEngine( GEOM::GEOM_Gen_var geomEngine ) +{gaumont parnasse + _geomEngine = geomEngine; +} + +GEOM::GEOM_IOperations_ptr PatternDataSelectionModel::createOperation() +{ +// return myGeomGUI->GetGeomGen()->GetIBasicOperations(getStudyId()); + return _geomEngine->GetIBasicOperations(getStudyId()); +} + +bool PatternDataSelectionModel::execute(ObjectList& objects) +{ + bool res = false; + + _PTR(Study) aStudy = GetActiveStudyDocument(); + _PTR(SObject) aSChild; + CORBA::Object_var aCorbaObj = CORBA::Object::_nil(); + GEOM::GEOM_Object_var assoc; + + foreach( const DocumentModel::GeomObj& anAssoc, _assocList ){ + std::cout << "FOUND=> " << anAssoc.entry.toStdString() << std::endl; + aSChild = aStudy->FindObjectID( anAssoc.entry.toStdString() ); + aCorbaObj = corbaObj(aSChild); + assoc = GEOM::GEOM_Object::_narrow(aCorbaObj); + + if ( !CORBA::is_nil(assoc) ){ + std::cout << "geom to highlight =>" << anAssoc.name.toStdString() << std::endl; + objects.push_back( assoc._retn() ); + res = true; + } else { + std::cout << "not a geom =>" << anAssoc.name.toStdString()<< std::endl; + } + } + + return res; +} +*/ + + +// SVTK_ViewWindow* PatternDataSelectionModel::GetViewWindow() +// { +// SalomeApp_Application* anApp = dynamic_cast +// (SUIT_Session::session()->activeApplication()); +// if (anApp) { +// if (SVTK_ViewWindow* aView = dynamic_cast(anApp->desktop()->activeWindow())) +// return aView; +// +// // SUIT_ViewManager* aViewManager = +// // anApp->getViewManager(SVTK_Viewer::Type(), createIfNotFound); +// // if (aViewManager) { +// // if (SUIT_ViewWindow* aViewWindow = aViewManager->getActiveView()) { +// // if (SVTK_ViewWindow* aView = dynamic_cast(aViewWindow)) { +// // aViewWindow->raise(); +// // aViewWindow->setFocus(); +// // return aView; +// // } +// // } +// // } +// } +// return NULL; +// } + + + + +// void PatternDataSelectionModel::SetSelectionMode(Selection_Mode theMode) +// { +// +// QList aSelectors; +// _salomeSelectionMgr->selectors( SVTK_Viewer::Type(), aSelectors ); +// QListIterator it( aSelectors ); +// +// std::cout << "PatternDataSelectionModel::SetSelectionMode()" << std::endl; +// while ( it.hasNext() ) +// { +// // SUIT_Selector* selector = it.next(); +// SVTK_Selector* selector = dynamic_cast( it.next() ); +// if ( selector ){ +// std::cout << "PatternDataSelectionModel::SetSelectionMode()" << theMode << std::endl; +// selector->SetSelectionMode(theMode); +// } +// } +// } + +// LightApp_SelectionMgr* PatternDataSelectionModel::selectionMgr() +// { +// SalomeApp_Application* anApp = dynamic_cast( SUIT_Session::session()->activeApplication() ); +// if( anApp ) +// return dynamic_cast( anApp->selectionMgr() ); +// else +// return 0; +// } + +// //CS_TEST +// SUIT_DataOwnerPtrList aOList; +// LightApp_DataOwner* anOwher = new LightApp_DataOwner( "0:1:1:1:2" ); +// aOList.append( anOwher ); +// _salomeSelectionMgr->setSelected( aOList, false ); +// //CS_TEST + +// void PatternDataSelectionModel::_highlightGEOM( const QModelIndex & anEltIndex ) +// { +// std::cout << "PatternDataSelectionModel::_highlightGEOM go find ASSOCIATION for"<< anEltIndex.data().toString().toStdString()< assocList; +// +// DocumentModel *docModel = NULL; +// const QSortFilterProxyModel *pModel = NULL; +// // const QStandardItemModel *smodel +// // const QAbstractItemModel *theModel = NULL; +// +// pModel = dynamic_cast( model() ); +// +// std::cout << "pModel "<< pModel << std::endl; +// if ( pModel ){ +// std::cout << "if ( pModel ){"<< std::endl; +// docModel = dynamic_cast( pModel->sourceModel() ); +// if ( docModel ){ +// std::cout << "if ( docModel ){"<< std::endl; +// assocList = docModel->getAssociations( pModel->mapToSource(anEltIndex) ); +// } +// } +// +// +// _PTR(Study) aStudy = GetActiveStudyDocument(); +// _PTR(SObject) aSChild; +// CORBA::Object_var aCorbaObj = CORBA::Object::_nil(); +// GEOM::GEOM_Object_var assoc; +// // foreach( const QString& entry, geomEntries ){ +// // struct GeomObj +// // { +// // QString name; +// // QString entry; +// // QString brep; +// // double start; +// // double end; +// // }; +// +// QVariant treeVariant = pModel->mapToSource(anEltIndex).data( HEXA_TREE_ROLE ); +// int eltType; +// if ( !treeVariant.isValid() ) return; +// eltType = treeVariant.toInt(); +// +// // GEOM::GeomObjPtr +// // GEOM::GEOM_Object_ptr firstLine; //firstLine.nullify();// +// GEOM::GEOM_Object_var firstLine = GEOM::GEOM_Object::_nil(); //GEOM::GeomObjPtr +// GEOM::GEOM_Object_var lastLine = GEOM::GEOM_Object::_nil(); +// double firstParameter = 0.2; //CS_TODO +// double lastParameter = 0.4; //CS_TODO +// +// foreach( const DocumentModel::GeomObj& anAssoc, assocList ){ +// std::cout << "FOUND=> " << anAssoc.entry.toStdString() << std::endl; +// aSChild = aStudy->FindObjectID( anAssoc.entry.toStdString() ); +// aCorbaObj = corbaObj(aSChild); +// assoc = GEOM::GEOM_Object::_narrow(aCorbaObj); +// +// if ( !CORBA::is_nil(assoc) ){ +// std::cout << "geom to highlight =>" << anAssoc.name.toStdString() << std::endl; +// // objects.push_back(assoc._retn()); +// // if ( eltType == EDGE_TREE ){ +// // if ( CORBA::is_nil(firstLine) ){ +// // firstLine = GEOM::GEOM_Object::_duplicate( assoc._retn() ); +// // } +// // lastLine = GEOM::GEOM_Object::_duplicate( assoc._retn() ); +// // } +// displayPreview( assoc._retn(), +// true, //false, //append, +// false,//true, //false, //activate, +// false,//true,//update, +// 4,//lineWidth, +// 1,//-1,//displayMode, +// Quantity_NOC_RED ); +// } else { +// std::cout << "not a geom =>" << anAssoc.name.toStdString()<< std::endl; +// } +// } +// // std::cout << "CORBA::is_nil(firstLine) =>" << CORBA::is_nil(firstLine) << std::endl; +// // std::cout << "CORBA::is_nil(lastLine) =>" << CORBA::is_nil(lastLine) << std::endl; +// // std::cout << "test" << ( !( CORBA::is_nil(firstLine) and !CORBA::is_nil(lastLine) ) ) << std::endl; +// /* +// if ( !( CORBA::is_nil(firstLine) and !CORBA::is_nil(lastLine) ) ){ +// GEOM::GEOM_IBasicOperations_var anOper = _geomEngine->GetIBasicOperations( getStudyId() ); +// GEOM::GEOM_Object_var firstPoint = anOper->MakePointOnCurve( firstLine, firstParameter ); +// GEOM::GEOM_Object_var lastPoint = anOper->MakePointOnCurve( lastLine, lastParameter ); +// +// // std::cout << "firstPoint->_is_nil() =>" << firstPoint->_is_nil() << std::endl; +// std::cout << "lastPoint->_is_nil() =>" << lastPoint->_is_nil() << std::endl; +// if ( !( CORBA::is_nil(firstPoint) ) )// !firstPoint->_is_nil() ) +// displayPreview( firstPoint._retn(), true ); +// if ( !( CORBA::is_nil(lastPoint) ) )//if ( !lastPoint->_is_nil() ) +// displayPreview( lastPoint._retn(), true ); +// }*/ +// } +// diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentSelectionModel.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentSelectionModel.hxx new file mode 100755 index 0000000..4301931 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_DocumentSelectionModel.hxx @@ -0,0 +1,159 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _HEXABLOCKGUI_DOCUMENTSELECTIONMODEL_HXX_ +#define _HEXABLOCKGUI_DOCUMENTSELECTIONMODEL_HXX_ + +#include + +#include + +#include +#include + +// #include +// #include +// #include + +#include "MyGEOMBase_Helper.hxx" + +#include "klinkitemselectionmodel.hxx" +#include "HEXABLOCKGUI_DocumentModel.hxx" + + +class OCCViewer_ViewWindow; + +namespace HEXABLOCK +{ + namespace GUI + { + + class PatternBuilderSelectionModel: public KLinkItemSelectionModel + { + public: + PatternBuilderSelectionModel( QAbstractItemModel *model, + QItemSelectionModel *proxySelector, QObject *parent = 0 ): + KLinkItemSelectionModel( model, proxySelector, parent ) + { + } + }; + + class PatternDataSelectionModel : public QItemSelectionModel, + public MyGEOMBase_Helper + { + Q_OBJECT + + public: + PatternDataSelectionModel( QAbstractItemModel * model ); + virtual ~PatternDataSelectionModel(); + + void setVertexSelection(); + void setEdgeSelection(); + void setQuadSelection(); + void setHexaSelection(); + void setAllSelection(); + void highlightVTKElts( const QModelIndexList& elts ); + + // + QModelIndex indexBy( int role, const QString& value ); + QModelIndex indexBy( int role, const QVariant& var ); + + //Salome + void setSalomeSelectionMgr( LightApp_SelectionMgr* mgr ); + void SetSelectionMode( Selection_Mode theMode ); + + protected slots: + void onCurrentChanged( const QModelIndex & current, const QModelIndex & previous ); + void onSelectionChanged( const QItemSelection & selected, const QItemSelection & deselected ); + void salomeSelectionChanged(); // Salome to Qt + + private: + SVTK_ViewWindow* _getVTKViewWindow(); + OCCViewer_ViewWindow* _getOCCViewWindow(); + + QModelIndex _indexOf( const QString& anIOEntry, int role ); + void _setVTKSelectionMode( const QModelIndex& eltIndex, SVTK_ViewWindow* vtkViewWindow ); + void _highlightGEOM( const QMultiMap& entrySubIDs ); + void _highlightGEOM( const QModelIndex & index ); + void _selectVTK( const QModelIndex & index ); + + QModelIndex _geomSelectionChanged( const Handle(SALOME_InteractiveObject)& anIObject ); + QModelIndex _vtkSelectionChanged( const Handle(SALOME_InteractiveObject)& anIObject ); + + LightApp_SelectionMgr* _salomeSelectionMgr; + int _selectionFilter; + + bool _theModelSelectionChanged; + bool _theVtkSelectionChanged; + bool _theGeomSelectionChanged; + + }; + + + + class GroupsSelectionModel : public QItemSelectionModel + { + Q_OBJECT + + public: + GroupsSelectionModel( QAbstractItemModel * model ); + virtual ~GroupsSelectionModel(); + + QModelIndex indexBy( int role, const QVariant& var ); + + protected slots: +// void onCurrentChanged( const QModelIndex & current, const QModelIndex & previous ); + void onSelectionChanged( const QItemSelection & selected, const QItemSelection & deselected ); + + private: + SVTK_ViewWindow* _getVTKViewWindow(); + void _highlightGroups( const QModelIndex& eltIndex ); + + }; + + + + + class MeshSelectionModel : public QItemSelectionModel + { + Q_OBJECT + + public: + MeshSelectionModel( QAbstractItemModel * model ); + virtual ~MeshSelectionModel(); + + QModelIndex indexBy( int role, const QVariant& var ); + + protected slots: +// void onCurrentChanged( const QModelIndex & current, const QModelIndex & previous ); + void onSelectionChanged( const QItemSelection & selected, const QItemSelection & deselected ); + + private: + SVTK_ViewWindow* _getVTKViewWindow(); + void _highlightPropagation( const QModelIndex& eltIndex ); + + }; + + + } +} + +#endif + + diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_Exception.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_Exception.cxx new file mode 100755 index 0000000..53b446c --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_Exception.cxx @@ -0,0 +1,58 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + +#include "HEXABLOCKGUI_Exception.hxx" + +using namespace HEXABLOCK::GUI; + +//#define _DEVDEBUG_ + +#ifdef _DEVDEBUG_ +#include +#endif + +Exception::Exception(const std::string& what):_what(what) +{ +#ifdef _DEVDEBUG_ + void *array[20]; + size_t size=10; + char **strings; + size_t i; + + size = backtrace (array, 10); + strings = backtrace_symbols (array, size); + + _what=_what+'\n'; + for (i = 0; i < size; i++) + _what=_what+strings[i]+'\n'; + + free (strings); +#endif +} + +const char *Exception::what( void ) const throw () +{ + return _what.c_str(); +} + +Exception::~Exception() throw () +{ +} diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_Exception.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_Exception.hxx new file mode 100755 index 0000000..f0edb98 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_Exception.hxx @@ -0,0 +1,44 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __HEXABLOCKGUI_EXCEPTION_HXX__ +#define __HEXABLOCKGUI_EXCEPTION_HXX__ + +#include "HEXABLOCKGUI_Export.hxx" + +#include +#include + +namespace HEXABLOCK +{ + namespace GUI + { + class HEXABLOCKGUI_EXPORT Exception : public std::exception + { + protected: + std::string _what; + public: + Exception(const std::string& what); + const char *what( void ) const throw (); + virtual ~Exception() throw (); + }; + } +} + +#endif diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_Export.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_Export.hxx new file mode 100755 index 0000000..833f5e4 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_Export.hxx @@ -0,0 +1,33 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _HEXABLOCKGUI_EXPORT_HXX_ +#define _HEXABLOCKGUI_EXPORT_HXX_ + +#ifdef WNT +# if defined HEXABLOCKGUI_EXPORT +# define HEXABLOCKGUI_EXPORT __declspec( dllexport ) +# else +# define HEXABLOCKGUI_EXPORT __declspec( dllimport ) +# endif +#else +# define HEXABLOCKGUI_EXPORT +#endif + +#endif diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_Model.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_Model.cxx new file mode 100755 index 0000000..15d3881 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_Model.cxx @@ -0,0 +1,55 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HEXABLOCKGUI_Model.hxx" + +//#define _DEVDEBUG_ +#include "HEXABLOCKGUI_Trace.hxx" + + + +HEXABLOCKGUI_Model::HEXABLOCKGUI_Model(CAM_Module* theModule) + : SalomeApp_DataModel(theModule) +{ + DEBTRACE("HEXABLOCKGUI_Model::HEXABLOCKGUI_Model"); +} + +HEXABLOCKGUI_Model::~HEXABLOCKGUI_Model() +{ + DEBTRACE("HEXABLOCKGUI_Model:: ~HEXABLOCKGUI_Model"); +} + +bool HEXABLOCKGUI_Model::open(const QString& fileName, CAM_Study* study, QStringList listOfFiles) +{ + DEBTRACE("HEXABLOCKGUI_Model::open"); + return SalomeApp_DataModel::open(fileName, study, listOfFiles); +} + +bool HEXABLOCKGUI_Model::save(QStringList& listOfFiles) +{ + DEBTRACE("HEXABLOCKGUI_Model::save"); + return SalomeApp_DataModel::save(listOfFiles); +} + +bool HEXABLOCKGUI_Model::saveAs(const QString& fileName, CAM_Study* study, QStringList& listOfFiles) +{ + DEBTRACE("HEXABLOCKGUI_Model::saveAs"); + return SalomeApp_DataModel::saveAs(fileName, study, listOfFiles); +} + diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_Model.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_Model.hxx new file mode 100755 index 0000000..e427105 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_Model.hxx @@ -0,0 +1,40 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _HEXABLOCKGUI_MODEL_HXX_ +#define _HEXABLOCKGUI_MODEL_HXX_ + +#include + + +class HEXABLOCKGUI_Model : public SalomeApp_DataModel +{ + public: + HEXABLOCKGUI_Model(CAM_Module* theModule); + virtual ~HEXABLOCKGUI_Model(); + + virtual bool open(const QString& fileName, CAM_Study* study, QStringList listOfFiles); + virtual bool save(QStringList& listOfFiles); + virtual bool saveAs(const QString& fileName, CAM_Study* study, QStringList& listOfFiles); + + protected: + +}; + +#endif diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_Resource.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_Resource.cxx new file mode 100755 index 0000000..374d358 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_Resource.cxx @@ -0,0 +1,344 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + + +#include "HEXABLOCKGUI_Resource.hxx" +#include "Resource.hxx" +#include "HEXABLOCKGUI.hxx" +#include + + + + +//#define _DEVDEBUG_ +#include "HEXABLOCKGUI_Trace.hxx" + +#define RESOURCE_HEXABLOCK "HEXABLOCK" + +using namespace HEXABLOCK::GUI; + + +HEXABLOCKGUI_Resource::HEXABLOCKGUI_Resource(SUIT_ResourceMgr* r) +{ + DEBTRACE("HEXABLOCKGUI_Resource::HEXABLOCKGUI_Resource"); + _resource = r; +} + +// Get resources +// ------------- + +int HEXABLOCKGUI_Resource::integerValue(const QString& name, const int def) const { + return _resource->integerValue(RESOURCE_HEXABLOCK, name, def); +} + +double HEXABLOCKGUI_Resource::doubleValue(const QString& name, const double def) const { + return _resource->doubleValue(RESOURCE_HEXABLOCK, name, def); +} + +bool HEXABLOCKGUI_Resource::booleanValue(const QString& name, const bool def) const { + return _resource->booleanValue(RESOURCE_HEXABLOCK, name, def); +} + +QFont HEXABLOCKGUI_Resource::fontValue(const QString& name, const QFont def) const { + return _resource->fontValue(RESOURCE_HEXABLOCK, name, def); +} + +QColor HEXABLOCKGUI_Resource::colorValue(const QString& name, const QColor def) const { + return _resource->colorValue(RESOURCE_HEXABLOCK, name, def); +} + +QColor HEXABLOCKGUI_Resource::colorValue(const QString& name, const Qt::GlobalColor c) const { + QColor col(c); + return colorValue(name, col); +} + +QColor HEXABLOCKGUI_Resource::colorValue(const QString& name, const int h, const int s, const int v) const { + QColor col; + col.setHsv(h, s, v); + return colorValue(name, col); +} + +QString HEXABLOCKGUI_Resource::stringValue(const QString& name, const QString def) const { + return _resource->stringValue(RESOURCE_HEXABLOCK, name, def); +} + +// Set resources +// ------------- + +void HEXABLOCKGUI_Resource::setValue( const QString& name, const int val ) { + _resource->setValue(RESOURCE_HEXABLOCK, name, val); +} + +void HEXABLOCKGUI_Resource::setValue( const QString& name, const double val ) { + _resource->setValue(RESOURCE_HEXABLOCK, name, val); +} + +void HEXABLOCKGUI_Resource::setValue( const QString& name, const bool val ) { + _resource->setValue(RESOURCE_HEXABLOCK, name, val); +} + +void HEXABLOCKGUI_Resource::setValue( const QString& name, const QFont val ) { + _resource->setValue(RESOURCE_HEXABLOCK, name, val); +} + +void HEXABLOCKGUI_Resource::setValue( const QString& name, const QColor val ) { + _resource->setValue(RESOURCE_HEXABLOCK, name, val); +} + +void HEXABLOCKGUI_Resource::setValue( const QString& name, const QString val ) { + _resource->setValue(RESOURCE_HEXABLOCK, name, val); +} + +// Create preferences +// ------------------ + +void HEXABLOCKGUI_Resource::createPreferences(HEXABLOCKGUI* swm) +{ +/* + DEBTRACE("createPreferences"); + // --- General tab --- + int genTab = swm->addPreference( QObject::tr( "PREF_TAB_GENERAL" ) ); + + int componentGroup = swm->addPreference( QObject::tr( "PREF_GROUP_COMPONENT" ), genTab ); + + swm->addPreference( QObject::tr( _COMPONENT_INSTANCE_NEW ), componentGroup, LightApp_Preferences::Bool, RESOURCE_HEXABLOCK, _COMPONENT_INSTANCE_NEW ); + swm->addPreference( "Python Script Font", componentGroup, LightApp_Preferences::Font, RESOURCE_HEXABLOCK, "font" ); + swm->addPreference( "User catalog", componentGroup, LightApp_Preferences::File, RESOURCE_HEXABLOCK, "userCatalog" ); + swm->addPreference( "Auto Compute Links", componentGroup, LightApp_Preferences::Bool, RESOURCE_HEXABLOCK, "autoComputeLinks" ); + swm->addPreference( "Simplify Links", componentGroup, LightApp_Preferences::Bool, RESOURCE_HEXABLOCK, "simplifyLink" ); + swm->addPreference( "Better Separation for Links", componentGroup, LightApp_Preferences::Bool, RESOURCE_HEXABLOCK, "addRowCols" ); + swm->addPreference( "Ensure Node Visible When Moved", componentGroup, LightApp_Preferences::Bool, RESOURCE_HEXABLOCK, "ensureVisibleWhenMoved" ); + swm->addPreference( "Tabified Panels Up", componentGroup, LightApp_Preferences::Bool, RESOURCE_HEXABLOCK, "tabPanelsUp" ); + + // Link colors + int linkTab = swm->addPreference( QObject::tr( "Link colors" ) ); + + int idGroup = swm->addPreference( QObject::tr( "PREF_GROUP_GENERAL" ), linkTab ); + swm->setPreferenceProperty( idGroup, "columns", 1 ); + + swm->addPreference( QObject::tr( "Link draw color" ), idGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, "link_draw_color" ); + swm->addPreference( QObject::tr( "Link select color" ), idGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, "link_select_color" ); + swm->addPreference( QObject::tr( "Stream link draw color" ), idGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, "stream_link_draw_color" ); + swm->addPreference( QObject::tr( "Stream link select color" ), idGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, "stream_link_select_color" ); + swm->addPreference( QObject::tr( "Control link draw color" ), idGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, "control_link_draw_color" ); + swm->addPreference( QObject::tr( "Control link select color" ), idGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, "control_link_select_color" ); + swm->addPreference( QObject::tr( "Emphasis link color" ), idGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, "emphasizeBrushColor" ); + + swm->addPreference( QObject::tr( "link pen darkness" ), idGroup, LightApp_Preferences::Integer, RESOURCE_HEXABLOCK, "link_pen_darkness" ); + + // --- nodes without color states --- + int nodeTab = swm->addPreference( QObject::tr( "PREF_TAB_NODE" ) ); + + int nodeSubtab = swm->addPreference( QObject::tr( "PREF_GROUP_SCENE" ), nodeTab ); + swm->setPreferenceProperty(nodeSubtab , "columns", 2); + + swm->addPreference( QObject::tr( "Pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _Scene_pen ); + swm->addPreference( QObject::tr( "Brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _Scene_brush ); + swm->addPreference( QObject::tr( "High pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _Scene_hiPen ); + swm->addPreference( QObject::tr( "High brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _Scene_hiBrush ); + + nodeSubtab = swm->addPreference( QObject::tr( "PREF_GROUP_BLOC" ), nodeTab ); + swm->setPreferenceProperty(nodeSubtab , "columns", 2); + + swm->addPreference( QObject::tr( "Pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _ComposedNode_pen ); + swm->addPreference( QObject::tr( "Brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _ComposedNode_brush ); + swm->addPreference( QObject::tr( "High pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _ComposedNode_hiPen ); + swm->addPreference( QObject::tr( "High brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _ComposedNode_hiBrush ); + + nodeSubtab = swm->addPreference( QObject::tr( "PREF_GROUP_NODE" ), nodeTab ); + swm->setPreferenceProperty(nodeSubtab , "columns", 2); + + swm->addPreference( QObject::tr( "Pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _ElementaryNode_pen ); + swm->addPreference( QObject::tr( "Brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _ElementaryNode_brush ); + swm->addPreference( QObject::tr( "High pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _ElementaryNode_hiPen ); + swm->addPreference( QObject::tr( "High brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _ElementaryNode_hiBrush ); + + nodeSubtab = swm->addPreference( QObject::tr( "PREF_GROUP_HEADER" ), nodeTab ); + swm->setPreferenceProperty(nodeSubtab , "columns", 2); + + swm->addPreference( QObject::tr( "Pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _Header_pen ); + swm->addPreference( QObject::tr( "Brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _Header_brush ); + swm->addPreference( QObject::tr( "High pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _Header_hiPen ); + swm->addPreference( QObject::tr( "High brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _Header_hiBrush ); + + nodeSubtab = swm->addPreference( QObject::tr( "PREF_GROUP_CONTROL" ), nodeTab ); + swm->setPreferenceProperty(nodeSubtab , "columns", 2); + + swm->addPreference( QObject::tr( "Pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _CtrlPort_pen ); + swm->addPreference( QObject::tr( "Brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _CtrlPort_brush ); + swm->addPreference( QObject::tr( "High pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _CtrlPort_hiPen ); + swm->addPreference( QObject::tr( "High brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _CtrlPort_hiBrush ); + + nodeSubtab = swm->addPreference( QObject::tr( "PREF_GROUP_PORT" ), nodeTab ); + swm->setPreferenceProperty(nodeSubtab , "columns", 2); + + swm->addPreference( QObject::tr( "Pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _DataPort_pen ); + swm->addPreference( QObject::tr( "Brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _DataPort_brush ); + swm->addPreference( QObject::tr( "High pen" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _DataPort_hiPen ); + swm->addPreference( QObject::tr( "High brush" ), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _DataPort_hiBrush ); + + nodeSubtab = swm->addPreference( QObject::tr( "PREF_GROUP_DRAG" ), nodeTab ); + swm->setPreferenceProperty(nodeSubtab, "columns", 1); + + swm->addPreference( QObject::tr( "On dragging"), nodeSubtab, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, __dragOver ); + + // --- Color of state of nodes --- + int stateTab = swm->addPreference( QObject::tr( "PREF_TAB_STATE" ) ); + + int editGroup = swm->addPreference( QObject::tr( "PREF_GROUP_EDIT" ), stateTab ); + swm->setPreferenceProperty( editGroup, "columns", 1 ); + + swm->addPreference( QObject::tr( _editedNodeBrushColor ), editGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _editedNodeBrushColor ); + swm->addPreference( QObject::tr( _normalNodeBrushColor ), editGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _normalNodeBrushColor ); + swm->addPreference( QObject::tr( _runNodeBrushColor ), editGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _runNodeBrushColor ); + swm->addPreference( QObject::tr( _validNodeColor ), editGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _validNodeColor ); + swm->addPreference( QObject::tr( _invalidNodeColor ), editGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _invalidNodeColor ); + + int runGroup = swm->addPreference( QObject::tr( "PREF_GROUP_RUN" ), stateTab ); + swm->setPreferenceProperty( runGroup, "columns", 2 ); + + swm->addPreference( QObject::tr( _NOTYETINITIALIZED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _NOTYETINITIALIZED ); + swm->addPreference( QObject::tr( _INITIALISED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _INITIALISED ); + swm->addPreference( QObject::tr( _RUNNING ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _RUNNING ); + swm->addPreference( QObject::tr( _WAITINGTASKS ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _WAITINGTASKS ); + swm->addPreference( QObject::tr( _PAUSED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _PAUSED ); + swm->addPreference( QObject::tr( _FINISHED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _FINISHED ); + swm->addPreference( QObject::tr( _STOPPED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _STOPPED ); + swm->addPreference( QObject::tr( _UNKNOWN ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _UNKNOWN ); + + swm->addPreference( QObject::tr( _UNDEFINED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _UNDEFINED ); + swm->addPreference( QObject::tr( _INVALID ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _INVALID ); + swm->addPreference( QObject::tr( _READY ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _READY ); + swm->addPreference( QObject::tr( _TOLOAD ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _TOLOAD ); + swm->addPreference( QObject::tr( _LOADED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _LOADED ); + swm->addPreference( QObject::tr( _TOACTIVATE ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _TOACTIVATE ); + swm->addPreference( QObject::tr( _ACTIVATED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _ACTIVATED ); + swm->addPreference( QObject::tr( _DESACTIVATED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _DESACTIVATED ); + swm->addPreference( QObject::tr( _DONE ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _DONE ); + swm->addPreference( QObject::tr( _SUSPENDED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _SUSPENDED ); + swm->addPreference( QObject::tr( _LOADFAILED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _LOADFAILED ); + swm->addPreference( QObject::tr( _EXECFAILED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _EXECFAILED ); + swm->addPreference( QObject::tr( _PAUSE ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _PAUSE ); + swm->addPreference( QObject::tr( _INTERNALERR ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _INTERNALERR ); + swm->addPreference( QObject::tr( _DISABLED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _DISABLED ); + swm->addPreference( QObject::tr( _FAILED ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _FAILED ); + swm->addPreference( QObject::tr( _ERROR ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _ERROR ); + swm->addPreference( QObject::tr( _DEFAULT ), runGroup, LightApp_Preferences::Color, RESOURCE_HEXABLOCK, _DEFAULT ); +*/ +} + +void HEXABLOCKGUI_Resource::preferencesChanged() +{ + DEBTRACE("preferencesChanged"); + + // Notice: it is here for updating the view, etc. + + // General resource + Resource::COMPONENT_INSTANCE_NEW = booleanValue(_COMPONENT_INSTANCE_NEW, COMPONENTINSTANCENEW); + Resource::pythonfont = fontValue( "font" ,PYTHONFONT); + Resource::userCatalog = stringValue( "userCatalog" ,USERCATALOG); + Resource::autoComputeLinks = booleanValue("autoComputeLinks", AUTOCOMPUTELINKS); + Resource::simplifyLink = booleanValue("simplifyLink", SIMPLIFYLINK); + Resource::addRowCols = booleanValue("addRowCols", ADDROWCOLS); + Resource::ensureVisibleWhenMoved = booleanValue("ensureVisibleWhenMoved", ENSUREVISIBLEWHENMOVED); + Resource::tabPanelsUp = booleanValue("tabPanelsUp", TABPANELSUP); + + // Color of state of nodes + Resource::editedNodeBrushColor = colorValue(_editedNodeBrushColor, EDITEDNODEBRUSHCOLOR); + Resource::normalNodeBrushColor = colorValue(_normalNodeBrushColor, NORMALNODEBRUSHCOLOR); + Resource::runNodeBrushColor = colorValue(_runNodeBrushColor , RUNNODEBRUSHCOLOR); + Resource::validNodeColor = colorValue(_validNodeColor , VALIDNODECOLOR); + Resource::invalidNodeColor = colorValue(_invalidNodeColor , INVALIDNODECOLOR); + + Resource::NOTYETINITIALIZED = colorValue(_NOTYETINITIALIZED , NOTYETINITIALIZED_); + Resource::INITIALISED = colorValue(_INITIALISED , INITIALISED_); + Resource::RUNNING = colorValue(_RUNNING , RUNNING_ ); + Resource::WAITINGTASKS = colorValue(_WAITINGTASKS , WAITINGTASKS_); + Resource::PAUSED = colorValue(_PAUSED , PAUSED_ ); + Resource::FINISHED = colorValue(_FINISHED , FINISHED_ ); + Resource::STOPPED = colorValue(_STOPPED , STOPPED_ ); + Resource::UNKNOWN = colorValue(_UNKNOWN , UNKNOWN_ ); + + Resource::UNDEFINED = colorValue(_UNDEFINED , UNDEFINED_ ); + Resource::INVALID = colorValue(_INVALID , INVALID_ ); + Resource::READY = colorValue(_READY , READY_ ); + Resource::TOLOAD = colorValue(_TOLOAD , TOLOAD_ ); + Resource::LOADED = colorValue(_LOADED , LOADED_ ); + Resource::TOACTIVATE = colorValue(_TOACTIVATE , TOACTIVATE_ ); + Resource::ACTIVATED = colorValue(_ACTIVATED , ACTIVATED_ ); + Resource::DESACTIVATED = colorValue(_DESACTIVATED , DESACTIVATED_); + Resource::DONE = colorValue(_DONE , DONE_ ); + Resource::SUSPENDED = colorValue(_SUSPENDED , SUSPENDED_ ); + Resource::LOADFAILED = colorValue(_LOADFAILED , LOADFAILED_ ); + Resource::EXECFAILED = colorValue(_EXECFAILED , EXECFAILED_ ); + Resource::PAUSE = colorValue(_PAUSE , PAUSE_ ); + Resource::INTERNALERR = colorValue(_INTERNALERR , INTERNALERR_ ); + Resource::DISABLED = colorValue(_DISABLED , DISABLED_ ); + Resource::FAILED = colorValue(_FAILED , FAILED_ ); + Resource::ERROR = colorValue(_ERROR , ERROR_ ); + Resource::DEFAULT = colorValue(_DEFAULT , DEFAULT_ ); + + // Color of links + Resource::link_draw_color = colorValue("link_draw_color" , LINKDRAW_COLOR ); + Resource::stream_link_draw_color = colorValue("stream_link_draw_color" , STREAMLINKDRAW_COLOR ); + Resource::link_select_color = colorValue("link_select_color" , LINK_SELECT_COLOR ); + Resource::stream_link_select_color = colorValue("stream_link_select_color" , STREAMLINK_SELECT_COLOR); + Resource::control_link_draw_color = colorValue("control_link_draw_color" , CTRLLINKDRAW_COLOR ); + Resource::control_link_select_color = colorValue("control_link_select_color", CTRLLINK_SELECT_COLOR ); + Resource::emphasizeBrushColor = colorValue("emphasizeBrushColor" , EMPHASIZEBRUSHCOLOR ); + + Resource::link_pen_darkness = integerValue("link_pen_darkness", LINK_PEN_DARKNESS ); + + // Color of nodes + Resource::Scene_pen = colorValue(_Scene_pen, Scene_pen_ ); + Resource::Scene_hiPen = colorValue(_Scene_hiPen, Scene_hiPen_ ); + Resource::Scene_brush = colorValue(_Scene_brush, Scene_brush_ ); + Resource::Scene_hiBrush = colorValue(_Scene_hiBrush, Scene_hiBrush_ ); + Resource::ComposedNode_brush = colorValue(_ComposedNode_brush, ComposedNode_brush_ ); + Resource::ComposedNode_hiBrush = colorValue(_ComposedNode_hiBrush, ComposedNode_hiBrush_ ); + Resource::ComposedNode_pen = colorValue(_ComposedNode_pen, ComposedNode_pen_ ); + Resource::ComposedNode_hiPen = colorValue(_ComposedNode_hiPen, ComposedNode_hiPen_ ); + Resource::ElementaryNode_brush = colorValue(_ElementaryNode_brush, ElementaryNode_brush_ ); + Resource::ElementaryNode_hiBrush = colorValue(_ElementaryNode_hiBrush, ElementaryNode_hiBrush_); + Resource::ElementaryNode_pen = colorValue(_ElementaryNode_pen, ElementaryNode_pen_ ); + Resource::ElementaryNode_hiPen = colorValue(_ElementaryNode_hiPen, ElementaryNode_hiPen_ ); + Resource::Header_brush = colorValue(_Header_brush, Header_brush_ ); + Resource::Header_hiBrush = colorValue(_Header_hiBrush, Header_hiBrush_ ); + Resource::Header_pen = colorValue(_Header_pen, Header_pen_ ); + Resource::Header_hiPen = colorValue(_Header_hiPen, Header_hiPen_ ); + Resource::CtrlPort_brush = colorValue(_CtrlPort_brush, CtrlPort_brush_ ); + Resource::CtrlPort_hiBrush = colorValue(_CtrlPort_hiBrush, CtrlPort_hiBrush_ ); + Resource::CtrlPort_pen = colorValue(_CtrlPort_pen, CtrlPort_pen_ ); + Resource::CtrlPort_hiPen = colorValue(_CtrlPort_hiPen, CtrlPort_hiPen_ ); + Resource::DataPort_brush = colorValue(_DataPort_brush, DataPort_brush_ ); + Resource::DataPort_hiBrush = colorValue(_DataPort_hiBrush, DataPort_hiBrush_ ); + Resource::DataPort_pen = colorValue(_DataPort_pen, DataPort_pen_ ); + Resource::DataPort_hiPen = colorValue(_DataPort_hiPen, DataPort_hiPen_ ); + + Resource::dragOver = colorValue(__dragOver, dragOver_ ); +} + +void HEXABLOCKGUI_Resource::preferencesChanged( const QString& sect, const QString& name ) +{ + if( sect==RESOURCE_HEXABLOCK ) + { + preferencesChanged(); + } +} + diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_Resource.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_Resource.hxx new file mode 100755 index 0000000..3094241 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_Resource.hxx @@ -0,0 +1,62 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _HEXABLOCKGUI_RESOURCE_HXX_ +#define _HEXABLOCKGUI_RESOURCE_HXX_ + +#include + +class HEXABLOCKGUI; +class SUIT_ResourceMgr; + + + +class HEXABLOCKGUI_Resource +{ + public: + HEXABLOCKGUI_Resource(SUIT_ResourceMgr* r); + virtual void createPreferences(HEXABLOCKGUI* swm); + virtual void preferencesChanged( const QString& sect, const QString& name ); + virtual void preferencesChanged(); + + protected: + int integerValue( const QString& name, const int def = 0 ) const; + double doubleValue ( const QString& name, const double def = 0 ) const; + bool booleanValue( const QString& name, const bool def = false ) const; + QFont fontValue ( const QString& name, const QFont def = QFont() ) const; + QColor colorValue ( const QString& name, const QColor def = QColor() ) const; + QColor colorValue ( const QString& name, const Qt::GlobalColor c ) const; + QColor colorValue ( const QString& name, const int h, const int s, const int v) const; + QString stringValue ( const QString& name, const QString def = QString() ) const; + + void setValue( const QString& name, const int val ); + void setValue( const QString& name, const double val ); + void setValue( const QString& name, const bool val ); + void setValue( const QString& name, const QFont val ); + void setValue( const QString& name, const QColor val ); + void setValue( const QString& name, const QString val ); + + protected: + SUIT_ResourceMgr* _resource; + +}; + + +#endif + diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_SalomeTools.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_SalomeTools.cxx new file mode 100644 index 0000000..d046bce --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_SalomeTools.cxx @@ -0,0 +1,463 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + + +#include + + +// VTK includes +#include +#include +#include + + + +#include + +#include +#include +// #include +// #include +// #include + + + +#include + + +// #include +// #include "SALOME_Component_i.hxx" +// #include + + +#include +#include +#include +#include +#include +#include + + +#include "GeometryGUI.h" +#include CORBA_CLIENT_HEADER(GEOM_Gen) + + +#include "HEXABLOCKGUI.hxx" +#include "HEXABLOCKGUI_SalomeTools.hxx" + + + +//#define _DEVDEBUG_ +using namespace std; +// using namespace HEXABLOCK::GUI; + + + +namespace HEXABLOCK{ + + namespace GUI{ + +SUIT_Study* GetActiveStudy() +{ + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if (app) + return app->activeStudy(); + else + return NULL; +} + + +_PTR(Study) GetActiveStudyDocument() +{ + SalomeApp_Study* aStudy = dynamic_cast(GetActiveStudy()); + if (aStudy) + return aStudy->studyDS(); + else + return _PTR(Study)(); +} + + +CORBA::Object_var corbaObj( _PTR(SObject) theSO ) +{ + //std::cout<< "corbaObj( _PTR(SObject) theSO )" << std::endl; + CORBA::Object_var aCorbaObj = CORBA::Object::_nil(); + if ( theSO ) { + //std::cout<< "theSO" << std::endl; + std::string aValue = theSO->GetIOR(); + //std::cout<< "aValue" << std::endl; + if (strcmp(aValue.c_str(), "") != 0) { + CORBA::ORB_ptr anORB = SalomeApp_Application::orb(); + //std::cout<< "anORB" << anORB << std::endl; + aCorbaObj = anORB->string_to_object(aValue.c_str()); + //std::cout<< "aCorbaObj" << aCorbaObj << std::endl; +// anDoc = Document::_narrow(aCorbaObj); + } + } + return aCorbaObj._retn(); +} + + +CORBA::Object_var corbaObj( const Handle(SALOME_InteractiveObject)& theIO ) +{ + CORBA::Object_var aCorbaObj = CORBA::Object::_nil(); + + if ( !theIO.IsNull() && theIO->hasEntry() ){ + _PTR(Study) aStudy = GetActiveStudyDocument(); + _PTR(SObject) aSObj = aStudy->FindObjectID(theIO->getEntry()); + aCorbaObj = corbaObj(aSObj); + } + return aCorbaObj._retn(); +} + +/* +std::string name( _PTR(SObject) theSO ) +{ + std::cout << "name( _PTR(SObject) theSO )"<< theSO; + std::string aResName; + if ( theSO ) + { + _PTR(GenericAttribute) anAttr; + _PTR(AttributeName) aNameAttr; + if ( theSO->FindAttribute( anAttr, "AttributeName" ) ) + { + std::cout << "FindAttribute"; + aNameAttr = anAttr; + std::cout << "aNameAttr = anAttr"; + aResName = aNameAttr->Value().c_str(); + } + } + return aResName; +} + + +std::string name( const std::string& entry ) +{ + std::cout << "name( const std::string& entry )"<< entry; + std::string aResName; + + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( appStudy ){ + std::cout << "appStudy => "<< appStudy ; + _PTR(Study) aStudy = appStudy->studyDS(); + std::cout << "aStudy=> "<< appStudy ; + _PTR(SObject) obj( aStudy->FindObjectID( entry ) ); + std::cout << "obj=> "<< obj; + aResName = name( obj ); + } + + return aResName; +} +*/ + + + +SALOME_Actor* findActorByEntry( SVTK_ViewWindow *theVtkViewWindow, const char* theEntry) +{ +// SVTK_ViewWindow* aViewWindow = dynamic_cast(theWindow); + SALOME_Actor *foundActor = NULL; + vtkActor *aVTKActor = NULL; + Handle(SALOME_InteractiveObject) anIO; + + vtkRenderer *aRenderer = theVtkViewWindow->getRenderer(); + VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); + vtkActorCollection *aCollection = aCopy.GetActors(); + aCollection->InitTraversal(); + while( aVTKActor = aCollection->GetNextActor() ){ +// if ( anAct->IsA("GEOM_Actor") ) std::cout<<"is an actor"<< std::endl; + foundActor = dynamic_cast( aVTKActor ); + if ( foundActor && foundActor->hasIO() ){ + anIO = foundActor->getIO(); + if( anIO->hasEntry() && strcmp(anIO->getEntry(), theEntry) == 0 ) + return foundActor; + } + } + + return NULL; // no actor found +} + + + + +/* +SVTK_ViewWindow* GetActiveVTKViewWindow() +{ + SVTK_ViewWindow* aVtkView = NULL; + SalomeApp_Application* anApp = dynamic_cast + ( SUIT_Session::session()->activeApplication() ); + if (anApp) + aVtkView = dynamic_cast(anApp->desktop()->activeWindow()); + return aVtkView; +} + +// SUIT_ViewManager* aViewManager = +// anApp->getViewManager(SVTK_Viewer::Type(), createIfNotFound); +// if (aViewManager) { +// if (SUIT_ViewWindow* aViewWindow = aViewManager->getActiveView()) { +// if (SVTK_ViewWindow* aView = dynamic_cast(aViewWindow)) { +// aViewWindow->raise(); +// aViewWindow->setFocus(); +// return aView; +// } +// } +// } + + +SOCC_ViewWindow* GetActiveOCCViewWindow() +{ + SOCC_ViewWindow* anOccView = NULL; + SalomeApp_Application* anApp = dynamic_cast + (SUIT_Session::session()->activeApplication()); + if (anApp) + anOccView = dynamic_cast(anApp->desktop()->activeWindow()); + + + OCCViewer_ViewWindow* aOCCFrame = dynamic_cast( anApp->desktop()->activeWindow() ); + std::cout << "aOCCFrame => "<< aOCCFrame; + + return anOccView ; +} + + +OCCViewer_ViewWindow* GetActiveOCCViewerWindow() +{ + OCCViewer_ViewWindow* aOCCFrame = NULL; + SalomeApp_Application* anApp = dynamic_cast + (SUIT_Session::session()->activeApplication()); + if (anApp) aOCCFrame = dynamic_cast( anApp->desktop()->activeWindow() ); + std::cout << "aOCCFrame => "<< aOCCFrame; + return aOCCFrame; +} + + + +int GetNameOfSelectedNodes( SVTK_ViewWindow *theWindow, + const Handle(SALOME_InteractiveObject)& theIO, + QString& theName ) +{ + SVTK_Selector* theSelector = theWindow->GetSelector(); + theName = ""; + TColStd_IndexedMapOfInteger aMapIndex; + theSelector->GetIndex(theIO,aMapIndex); + + for( int i = 1; i <= aMapIndex.Extent(); i++ ) + theName += QString(" %1").arg(aMapIndex(i)); + + return aMapIndex.Extent(); +} +*/ + + +int GetNameOfSelectedElements( SVTK_ViewWindow *theWindow, + const Handle(SALOME_InteractiveObject)& theIO, + QString& theName ) +{ + SVTK_Selector* theSelector = theWindow->GetSelector(); + theName = ""; + TColStd_IndexedMapOfInteger aMapIndex; + theSelector->GetIndex(theIO,aMapIndex); + + typedef std::set TIdContainer; + std::set anIdContainer; + for( int i = 1; i <= aMapIndex.Extent(); i++) + anIdContainer.insert(aMapIndex(i)); + + std::set::const_iterator anIter = anIdContainer.begin(); + for( ; anIter != anIdContainer.end(); anIter++) + theName += QString(" %1").arg(*anIter); + + //std::cout << "GetNameOfSelectedElements name =>" << theName.toStdString() << std::endl; + return aMapIndex.Extent(); +} + +string shape2string( const TopoDS_Shape& aShape ) +{ + ostringstream streamShape; +// string strShape; + BRepTools::Write(aShape, streamShape); +// BRepTools::Write(aShape, strShape); + + return streamShape.str(); +} + + + + + +// SALOME_View* LightApp_Displayer::GetActiveView() +// { +// SUIT_Session* session = SUIT_Session::session(); +// if ( SUIT_Application* app = session->activeApplication() ) { +// if ( LightApp_Application* sApp = dynamic_cast( app ) ) { +// if( SUIT_ViewManager* vman = sApp->activeViewManager() ) { +// if ( SUIT_ViewModel* vmod = vman->getViewModel() ) +// return dynamic_cast( vmod ); +// } +// } +// } +// return 0; +// } + + + +MyGEOM_Displayer::MyGEOM_Displayer( SalomeApp_Study* app ): +GEOM_Displayer( app ) +{ +} + +MyGEOM_Displayer::~MyGEOM_Displayer() +{ +} + +SALOME_Prs* MyGEOM_Displayer::BuildPrs( GEOM::GEOM_Object_ptr theObj ) +{ + //std::cout << "MyGEOM_Displayer::BuildPrs( GEOM::GEOM_Object_ptr theObj )" << std::endl; + if ( theObj->_is_nil() ) + return 0; + + SALOME_View* view = NULL; + SUIT_ViewManager* vman = HEXABLOCKGUI::currentOccView->getViewManager(); + SUIT_ViewModel* vmodel = NULL; + if ( vman ) + vmodel = vman->getViewModel(); + if ( vmodel ) + view = dynamic_cast(vmodel); + + myViewFrame = view ;//GetActiveView(); + if ( myViewFrame == 0 ) + return 0; + + SALOME_Prs* aPrs = myViewFrame->CreatePrs(); + if ( aPrs == 0 ) + return 0; + + internalReset(); + setShape( GEOM_Client::get_client().GetShape( GeometryGUI::GetGeomGen(), theObj ) ); + myType = theObj->GetType(); + + // Update presentation + UpdatePrs( aPrs ); + + return aPrs; +} + +} //namespace GUI{ + +}//namespace HEXABLOCK{ + +////////////////////////////////////////////////////////////////////////// + + +// SUIT_Study* GetActiveStudy(); +// std::string name( _PTR(SObject) theSO ); +// std::string name( const std::string& entry ); +// SVTK_ViewWindow* GetActiveVTKViewWindow(); +// SOCC_ViewWindow* GetActiveOCCViewWindow(); +// OCCViewer_ViewWindow* GetActiveOCCViewerWindow(); +// int GetNameOfSelectedNodes( SVTK_ViewWindow *theWindow, +// const Handle(SALOME_InteractiveObject)& theIO, +// QString& theName ); + +// QString addInStudy ( GEOM::GEOM_Object_ptr o, const char* theName ) +// { +// QString res; +// +// std::cout << "getStudyId() => " << getStudyId() << std::endl; +// std::cout << "getStudy() => " << getStudy() << std::endl; +// +// openCommand(); +// res = GEOMBase_Helper::addInStudy(o, theName); +// std::cout << "addInStudy => " << res.toStdString() << std::endl; +// commitCommand(); +// return res; +// } +// +// +// // displayPreview( obj, true, activate, false, lineWidth, displayMode, color ); +// void displayPreview( GEOM::GEOM_Object_ptr obj, +// const bool append = false, +// const bool activate = false, +// const bool update = true, +// const double lineWidth = -1, +// const int displayMode = -1, +// const int color = -1 ) +// { +// std::cout << "AAAAAAAAAA => " << std::endl; +// // GEOM::GEOM_ITransformOperations_var anOp = +// // getGeomEngine()->GetITransformOperations(getStudyId()); +// // GEOM::GEOM_Object_ptr obj2 = anOp->TranslateDXDYDZ (obj, 100, 100, 100); +// +// GEOM::GEOM_IBasicOperations_var anOp = +// getGeomEngine()->GetIBasicOperations(getStudyId()); +// std::cout << "BBBBBBBBBB => " << std::endl; +// GEOM::GEOM_Object_ptr obj2 = anOp->MakePointXYZ (100, 125, 150); +// +// std::cout << "obj2->GetEntry() => " << obj2->GetEntry()<< std::endl; +// std::cout << "obj2->GetStudyID() => " << obj2->GetStudyID()<< std::endl; +// std::cout << "obj2->GetType() => " << obj2->GetType()<< std::endl; +// std::cout << "obj2->GetShapeType() => " << obj2->GetShapeType()<< std::endl; +// +// QString res = addInStudy ( obj2, "trans"); +// std::cout << "trans => " << res.toStdString() << std::endl; +// +// globalSelection(); // close local contexts, if any +// localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); +// GEOMBase_Helper::activate( 39);//GEOM_MARKER ); +// +// // getDisplayer()->SetColor( Quantity_NOC_RED ); +// // getDisplayer()->SetColor( Quantity_NOC_CYAN1 ); +// +// // set width of displayed shape +// // getDisplayer()->SetWidth( (lineWidth == -1)?8:lineWidth ); +// +// GEOMBase_Helper::displayPreview( obj2, +// true, //append, +// true, //activate, +// update, +// 8,//lineWidth, +// displayMode, +// Quantity_NOC_CYAN1);//Quantity_NOC_RED);//color ); +// +// +// } +// +// void erase( GEOM::GEOM_Object_ptr obj, const bool d = true) +// { +// GEOMBase_Helper::erase( obj, d); +// } + + + +// TopoDS_Shape GEOMBase::GetShapeFromIOR(QString IOR) +// { +// TopoDS_Shape result; +// if(IOR.trimmed().isEmpty()) +// return result; +// +// CORBA::Object_var obj = SalomeApp_Application::orb()->string_to_object(IOR.toLatin1().data()); +// if(CORBA::is_nil(obj)) +// return result; +// GEOM::GEOM_Object_var GeomObject = GEOM::GEOM_Object::_narrow( obj ); +// if (GeomObject->_is_nil()) +// return result; +// +// result = GEOM_Client().GetShape(GeometryGUI::GetGeomGen(), GeomObject); +// return result; +// } diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_SalomeTools.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_SalomeTools.hxx new file mode 100644 index 0000000..71738cc --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_SalomeTools.hxx @@ -0,0 +1,85 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _HEXABLOCKGUI_SALOMETOOLS_HXX_ +#define _HEXABLOCKGUI_SALOMETOOLS_HXX_ + + +#include +#include +#include +#include + + +#include "GEOM_Client.hxx" +// #include "GEOMBase_Helper.h" +#include "GEOM_Displayer.h" + + + +#include +#include +#include + + + +namespace HEXABLOCK +{ + namespace GUI + { + + SALOME_Actor* findActorByEntry( SVTK_ViewWindow *theVtkViewWindow, const char* theEntry ); + _PTR(Study) GetActiveStudyDocument(); + CORBA::Object_var corbaObj( _PTR(SObject) theSO ); + CORBA::Object_var corbaObj( const Handle(SALOME_InteractiveObject)& theIO ); + int GetNameOfSelectedElements( SVTK_ViewWindow *theWindow,/* SVTK_Selector* theSelector,*/ + const Handle(SALOME_InteractiveObject)& theIO, + QString& theName ); + std::string shape2string( const TopoDS_Shape& aShape ); + + + + class MyGEOM_Displayer : public GEOM_Displayer + { + public: + MyGEOM_Displayer( SalomeApp_Study* app ); + virtual ~MyGEOM_Displayer(); + + + SALOME_Prs* BuildPrs( GEOM::GEOM_Object_ptr theObj ); + +// int aPrevDispMode = getDisplayer()->SetDisplayMode( displayMode ); +// getDisplayer()->SetToActivate( activate ); +// getDisplayer()->SetName( objStr.in() ); +// SALOME_Prs* aPrs = getDisplayer()->BuildPrs( object ); + + + + + }; + + + + + + + } +} + +#endif diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_Trace.cxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_Trace.cxx new file mode 100755 index 0000000..9b7a2e1 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_Trace.cxx @@ -0,0 +1,50 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include + +#include "HEXABLOCKGUI_Trace.hxx" + + +#ifdef WNT +#include +#define getpid _getpid +#else +#include +#endif + +namespace HEXABLOCK{ + namespace GUI{ + int traceLevel=0; + } +} + +void AttachDebugger() +{ + if(getenv ("HEXABLOCKDEBUGGER")) + { + std::stringstream exec; + exec << "$HEXABLOCKDEBUGGER " << getpid() << "&"; + std::cerr << exec.str() << std::endl; + system(exec.str().c_str()); + while(1); + } +} diff --git a/src/HEXABLOCKGUI/HEXABLOCKGUI_Trace.hxx b/src/HEXABLOCKGUI/HEXABLOCKGUI_Trace.hxx new file mode 100755 index 0000000..cb929f8 --- /dev/null +++ b/src/HEXABLOCKGUI/HEXABLOCKGUI_Trace.hxx @@ -0,0 +1,50 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __HEXABLOCKGUI_TRACE_HXX__ +#define __HEXABLOCKGUI_TRACE_HXX__ + +#include +#include + +#include "HEXABLOCKGUI_Export.hxx" +#include "HEXABLOCKGUI_Exception.hxx" + +#ifdef _DEVDEBUG_ +#define DEBTRACE(msg) {std::cerr<=level)std::cerr<<__FILE__<<" ["<<__LINE__<<"] : "< + + HexaDialog + + + + 0 + 0 + 217 + 387 + + + + + 0 + 0 + + + + Hexahedron Construction + + + + QLayout::SetMinimumSize + + + + + Result Name + + + + + + Name + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + + + + + + + + + 0 + 0 + + + + Hexa + + + + + + + 0 + 0 + + + + Quads + + + true + + + + + + + + 0 + 0 + + + + Vertices + + + + + + + + + + Arguments + + + + + + Select a quad + + + + + + + Select a vertex + + + + + + + + + + + + quads_rb + clicked() + quads_lw + show() + + + 74 + 45 + + + 135 + 220 + + + + + quads_rb + clicked() + vertices_lw + hide() + + + 95 + 45 + + + 173 + 435 + + + + + vertices_rb + clicked() + vertices_lw + show() + + + 252 + 45 + + + 173 + 435 + + + + + vertices_rb + clicked() + quads_lw + hide() + + + 252 + 45 + + + 173 + 258 + + + + + diff --git a/src/HEXABLOCKGUI/JoinQuad_QTD.ui b/src/HEXABLOCKGUI/JoinQuad_QTD.ui new file mode 100644 index 0000000..bdd0f8d --- /dev/null +++ b/src/HEXABLOCKGUI/JoinQuad_QTD.ui @@ -0,0 +1,256 @@ + + + JoinQuadDialog + + + + 0 + 0 + 256 + 440 + + + + Join Quad(s) Operation + + + + + + + 0 + 0 + + + + From + + + + + + + 0 + 0 + + + + Quadrangle(s) + + + + + + + 0 + 0 + + + + + + + + + + + + + QAbstractItemView::MultiSelection + + + + + + + + + + Point a + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + Point b + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + 0 + 0 + + + + To + + + + + + Quadrangle + + + + + + + + 0 + 0 + + + + false + + + + + + + Point a + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + Point b + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + 0 + 0 + + + + Grid + + + + + + + 0 + 0 + + + + size + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/Law_QTD.ui b/src/HEXABLOCKGUI/Law_QTD.ui new file mode 100644 index 0000000..5e33574 --- /dev/null +++ b/src/HEXABLOCKGUI/Law_QTD.ui @@ -0,0 +1,122 @@ + + + LawDialog + + + + 0 + 0 + 282 + 168 + + + + + 0 + 0 + + + + + 5 + 0 + + + + Law + + + + + + + 5 + 0 + + + + Arguments + + + + + + name : + + + + + + + + 127 + 16777215 + + + + + + + + nb nodes + + + + + + + 1000000 + + + + + + + coefficient + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + kind : + + + + + + + + Uniform + + + + + Arithmetic + + + + + Geometric + + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/MakeCartesian_QTD.ui b/src/HEXABLOCKGUI/MakeCartesian_QTD.ui new file mode 100644 index 0000000..6ebaeea --- /dev/null +++ b/src/HEXABLOCKGUI/MakeCartesian_QTD.ui @@ -0,0 +1,450 @@ + + + MakeCartesianDialog + + + + 0 + 0 + 232 + 540 + + + + + 0 + 0 + + + + Cartesian Grid Construction + + + + QLayout::SetMinimumSize + + + + + + 0 + 0 + + + + Make cartesian + + + + + + + 0 + 0 + + + + ( 1 vector ) + + + true + + + + + + + + 0 + 0 + + + + ( 3 vector ) + + + + + + + + + + Arguments + + + + + + + Qt::AlignJustify|Qt::AlignVCenter + + + + + Vertex + + + + + + + + 16777215 + 16777215 + + + + false + + + + + + + Vector + + + + + + + + 16777215 + 16777215 + + + + false + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + Qt::AlignJustify|Qt::AlignTop + + + 8 + + + + + n (x) + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + n (y) + + + + + + + n (z) + + + + + + + + + + + + + Qt::AlignJustify|Qt::AlignVCenter + + + + + Vertex + + + + + + + + 16777215 + 16777215 + + + + false + + + + + + + Vector(x) + + + + + + + + 16777215 + 16777215 + + + + false + + + + + + + Vector(y) + + + + + + + + 16777215 + 16777215 + + + + false + + + + + + + Vector(z) + + + + + + + + 16777215 + 16777215 + + + + false + + + + + + + Qt::AlignJustify|Qt::AlignVCenter + + + 8 + + + + + n (x) + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + n (y) + + + + + + + n (z) + + + + + + + + + + + + + + + + + rb0 + clicked() + widget_3 + show() + + + 122 + 47 + + + 123 + 106 + + + + + rb0 + clicked() + widget_2 + hide() + + + 164 + 46 + + + 246 + 240 + + + + + rb1 + clicked() + widget_2 + show() + + + 334 + 47 + + + 328 + 240 + + + + + rb1 + clicked() + widget_3 + hide() + + + 343 + 55 + + + 343 + 208 + + + + + diff --git a/src/HEXABLOCKGUI/MakeCylinder_QTD.ui b/src/HEXABLOCKGUI/MakeCylinder_QTD.ui new file mode 100644 index 0000000..1d6861e --- /dev/null +++ b/src/HEXABLOCKGUI/MakeCylinder_QTD.ui @@ -0,0 +1,145 @@ + + + MakeCylinderDialog + + + + 0 + 0 + 190 + 238 + + + + + 0 + 0 + + + + + 5 + 0 + + + + Cylinder construction + + + + + + + 0 + 0 + + + + + 5 + 0 + + + + Arguments + + + + + + Cylinder + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Vector + + + + + + + + 127 + 16777215 + + + + false + + + + + + + 1000000 + + + 1 + + + + + + + n (radial) + + + + + + + n (heigth) + + + + + + + 1000000 + + + 3 + + + + + + + 1000000 + + + 1 + + + + + + + n (angular) + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/MakeCylinders_QTD.ui b/src/HEXABLOCKGUI/MakeCylinders_QTD.ui new file mode 100644 index 0000000..38c0d4b --- /dev/null +++ b/src/HEXABLOCKGUI/MakeCylinders_QTD.ui @@ -0,0 +1,79 @@ + + + MakeCylindersDialog + + + + 0 + 0 + 212 + 104 + + + + + 0 + 0 + + + + Cylinders Construction + + + + + + Arguments + + + + QFormLayout::ExpandingFieldsGrow + + + + + Cylinder1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Cylinder2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/MakeCylindrical_QTD.ui b/src/HEXABLOCKGUI/MakeCylindrical_QTD.ui new file mode 100644 index 0000000..1e38434 --- /dev/null +++ b/src/HEXABLOCKGUI/MakeCylindrical_QTD.ui @@ -0,0 +1,265 @@ + + + MakeCylindricalDialog + + + + 0 + 0 + 245 + 464 + + + + + 0 + 0 + + + + Cylinder Construction + + + + + + Arguments + + + + + + + + + + + + + + Vertex + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + + + + + + + + Vector(x) + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + Vector(z) + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + + + + + + dr: + + + + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + 6 + + + 360.000000000000000 + + + 10.000000000000000 + + + 360.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + da: + + + + + + + dl: + + + + + + + + + + + + + + + + nr: + + + + + + + 1000000 + + + 2 + + + + + + + 1000000 + + + 6 + + + + + + + 1000000 + + + 10 + + + + + + + na: + + + + + + + nl: + + + + + + + + + + fill + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/MakeGrid_QTD.ui b/src/HEXABLOCKGUI/MakeGrid_QTD.ui new file mode 100644 index 0000000..f10ed72 --- /dev/null +++ b/src/HEXABLOCKGUI/MakeGrid_QTD.ui @@ -0,0 +1,1145 @@ + + + MakeGridDialog + + + + 0 + 0 + 338 + 1042 + + + + + 0 + 0 + + + + + 5 + 0 + + + + + 16777215 + 16777215 + + + + Grid Construction + + + false + + + + + + + 0 + 0 + + + + + 5 + 0 + + + + + 16777215 + 16777215 + + + + Qt::ScrollBarAsNeeded + + + true + + + + + 0 + -82 + 301 + 1231 + + + + + + + + 0 + 0 + + + + + 5 + 0 + + + + Make Grid + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + Cartesian + + + true + + + + + + + + 0 + 0 + + + + Cylindrical + + + + + + + Spherical + + + + + + + + + + + 0 + 0 + + + + + 5 + 0 + + + + Arguments + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + + 0 + 152 + + + + + QLayout::SetDefaultConstraint + + + QFormLayout::AllNonFixedFieldsGrow + + + + + Vertex : + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Vector : + + + + + + + + 127 + 16777215 + + + + false + + + + + + + n (x) : + + + + + + + 1 + + + 1000000 + + + 1 + + + + + + + n (y) : + + + + + + + 1 + + + 1000000 + + + 1 + + + + + + + n (z) : + + + + + + + 1 + + + 1000000 + + + 1 + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + 0 + 0 + + + + Grid + + + + + + regular + + + true + + + + + + + irregular + + + + + + + + 0 + 0 + + + + 0 + + + + radius + + + + + + true + + + + 0 + 0 + + + + + + + + + + + + + + + + 0 + 0 + + + + - + + + + + + + Qt::Vertical + + + + 20 + 139 + + + + + + + + + angle + + + + + + true + + + + 0 + 0 + + + + + + + + + + + + + + + + 0 + 0 + + + + - + + + + + + + Qt::Vertical + + + + 20 + 139 + + + + + + + + + height + + + + + + true + + + + 0 + 0 + + + + + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + - + + + + + + + Qt::Vertical + + + + 20 + 139 + + + + + + + + + + + + + 0 + 0 + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + radius + + + + + + size : + + + + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + 1 + + + 1000000 + + + 1 + + + + + + + count : + + + + + + + + + + + 0 + 0 + + + + angle + + + + + + value : + + + + + + + 6 + + + 360.000000000000000 + + + 10.000000000000000 + + + 360.000000000000000 + + + + + + + 3 + + + 1000000 + + + 3 + + + + + + + count : + + + + + + + + + + + 0 + 0 + + + + height + + + + + + size : + + + + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + 1 + + + 1000000 + + + 1 + + + + + + + count : + + + + + + + + + + + + + fill + + + + + + + Qt::Vertical + + + + 20 + 20 + + + + + + + + + + + + 0 + 0 + + + + Cylinder + + + + QLayout::SetDefaultConstraint + + + QFormLayout::ExpandingFieldsGrow + + + + + center + + + + + + + + 127 + 16777215 + + + + Select a point (vertex) + + + + false + + + + + + + base + + + + + + + + 127 + 16777215 + + + + Select a vector + + + false + + + + + + + vector + + + + + + + + 127 + 16777215 + + + + Select a vector + + + false + + + + + + + + + + + + + + 0 + 0 + + + + + 0 + 130 + + + + + + + Vertex + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Radius + + + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + + + + + nb + + + + + + + + 0 + 0 + + + + 1 + + + 1000000 + + + 1 + + + + + + + k + + + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 10 + + + + + + + + + + + + + + rb1 + clicked() + cylindrical_widget + show() + + + 231 + 56 + + + 208 + 571 + + + + + rb1 + clicked() + cartesian_widget + hide() + + + 231 + 56 + + + 208 + 190 + + + + + rb1 + clicked() + spherical_widget + hide() + + + 231 + 56 + + + 208 + 938 + + + + + rb2 + clicked() + cylindrical_widget + hide() + + + 345 + 56 + + + 208 + 571 + + + + + rb2 + clicked() + cartesian_widget + hide() + + + 345 + 56 + + + 208 + 190 + + + + + rb2 + clicked() + spherical_widget + show() + + + 345 + 56 + + + 208 + 938 + + + + + rb0 + clicked() + cartesian_widget + show() + + + 95 + 56 + + + 208 + 190 + + + + + rb0 + clicked() + cylindrical_widget + hide() + + + 95 + 56 + + + 208 + 571 + + + + + rb0 + clicked() + spherical_widget + hide() + + + 95 + 56 + + + 208 + 938 + + + + + uniform_rb + clicked() + random_param_w + hide() + + + 135 + 450 + + + 224 + 539 + + + + + random_rb + clicked() + random_param_w + show() + + + 313 + 450 + + + 224 + 539 + + + + + uniform_rb + clicked() + uniform_param_w + show() + + + 135 + 450 + + + 224 + 724 + + + + + random_rb + clicked() + uniform_param_w + hide() + + + 313 + 450 + + + 224 + 724 + + + + + diff --git a/src/HEXABLOCKGUI/MakeHemiSphere_QTD.ui b/src/HEXABLOCKGUI/MakeHemiSphere_QTD.ui new file mode 100644 index 0000000..28e7897 --- /dev/null +++ b/src/HEXABLOCKGUI/MakeHemiSphere_QTD.ui @@ -0,0 +1,603 @@ + + + MakeHemiSphereDialog + + + + 0 + 0 + 367 + 440 + + + + + 0 + 0 + + + + HemiSphere Construction + + + + + + Qt::ScrollBarAsNeeded + + + true + + + + + 0 + 0 + 330 + 688 + + + + + + + + 0 + 0 + + + + Result Name + + + + + + Name + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + + + + + + + + Arguments + + + + + + + 0 + 0 + + + + Sphere + + + + + + center + + + + + + + + 0 + 0 + + + + + + + false + + + + + + + external radius + + + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + false + + + internal radius + + + + + + + false + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + rind + + + false + + + + + + + + + + + 0 + 0 + + + + Hole + + + + + + axis(z) + + + + + + + + 0 + 0 + + + + + + + false + + + + + + + radius + + + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + + + + + 0 + 0 + + + + Cross section + + + + + + point + + + + + + + + 0 + 0 + + + + + + + + + + false + + + + + + + true + + + vector + + + + + + + true + + + + 0 + 0 + + + + + + + + + + false + + + + + + + + + + + 0 + 0 + + + + Radial section + + + + + + start vector + + + + + + + + 0 + 0 + + + + + + + + + + false + + + + + + + false + + + angle + + + + + + + false + + + + 0 + 0 + + + + 6 + + + 360.000000000000000 + + + 180.000000000000000 + + + + + + + partial + + + false + + + + + + + + + + + 0 + 0 + + + + Grid + + + + + + n (radial) + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + n (angular) + + + + + + + + 0 + 0 + + + + 1000000 + + + 3 + + + + + + + n (height) + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + + + + + + + + + + + + + radial_partial_cb + toggled(bool) + radial_angle_spb + setEnabled(bool) + + + 217 + 416 + + + 140 + 417 + + + + + sphere_rind_cb + toggled(bool) + sphere_radint_spb + setEnabled(bool) + + + 226 + 195 + + + 161 + 196 + + + + + hole_axis_le + textChanged(QString) + cross_vec_le + setText(QString) + + + 198 + 265 + + + 198 + 390 + + + + + cross_vec_le + textChanged(QString) + hole_axis_le + setText(QString) + + + 198 + 390 + + + 198 + 265 + + + + + sphere_rind_cb + toggled(bool) + int_rad_label + setEnabled(bool) + + + 226 + 195 + + + 78 + 196 + + + + + radial_partial_cb + toggled(bool) + angle_label + setEnabled(bool) + + + 217 + 416 + + + 65 + 417 + + + + + diff --git a/src/HEXABLOCKGUI/MakePipe_QTD.ui b/src/HEXABLOCKGUI/MakePipe_QTD.ui new file mode 100644 index 0000000..b2b5b9a --- /dev/null +++ b/src/HEXABLOCKGUI/MakePipe_QTD.ui @@ -0,0 +1,160 @@ + + + MakePipeDialog + + + + 0 + 0 + 195 + 220 + + + + + 0 + 0 + + + + + 5 + 0 + + + + Pipe Construction + + + + + + + 5 + 0 + + + + Arguments + + + + QFormLayout::ExpandingFieldsGrow + + + + + Pipe + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Vector + + + + + + + n (radial) + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + n (angular) + + + + + + + + 0 + 0 + + + + 1000000 + + + 3 + + + + + + + n (heigth) + + + + + + + + 0 + 0 + + + + 1000000 + + + 1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/MakePipes_QTD.ui b/src/HEXABLOCKGUI/MakePipes_QTD.ui new file mode 100644 index 0000000..40d7a7e --- /dev/null +++ b/src/HEXABLOCKGUI/MakePipes_QTD.ui @@ -0,0 +1,79 @@ + + + MakePipesDialog + + + + 0 + 0 + 190 + 104 + + + + + 0 + 0 + + + + Pipes Construction + + + + + + Arguments + + + + QFormLayout::ExpandingFieldsGrow + + + + + Pipe1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Pipe2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/MakeRind_QTD.ui b/src/HEXABLOCKGUI/MakeRind_QTD.ui new file mode 100644 index 0000000..524e775 --- /dev/null +++ b/src/HEXABLOCKGUI/MakeRind_QTD.ui @@ -0,0 +1,322 @@ + + + MakeRindDialog + + + + 0 + 0 + 324 + 440 + + + + Rind Construction + + + + + + Result Name + + + + + + Name + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + + + + + + + + Arguments + + + + + + center + + + + + + + + 0 + 0 + + + + false + + + + + + + + 0 + 0 + + + + false + + + + + + + radext + + + + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + radint + + + + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + radhole + + + + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + plorig + + + + + + + + 0 + 0 + + + + false + + + + + + + nrad + + + + + + + 1000000 + + + 1 + + + + + + + nang + + + + + + + 1000000 + + + 3 + + + + + + + nhaut + + + + + + + 1000000 + + + 1 + + + + + + + false + + + angle + + + + + + + false + + + 6 + + + 1000000000.000000000000000 + + + 180.000000000000000 + + + + + + + vx + + + + + + + + 0 + 0 + + + + false + + + + + + + vz + + + + + + + Partial + + + false + + + + + + + + + + + + partial_cb + toggled(bool) + angle_spb + setEnabled(bool) + + + 291 + 210 + + + 190 + 392 + + + + + partial_cb + toggled(bool) + angle_label + setEnabled(bool) + + + 285 + 391 + + + 43 + 392 + + + + + diff --git a/src/HEXABLOCKGUI/MakeSpherical_QTD.ui b/src/HEXABLOCKGUI/MakeSpherical_QTD.ui new file mode 100644 index 0000000..4564b4a --- /dev/null +++ b/src/HEXABLOCKGUI/MakeSpherical_QTD.ui @@ -0,0 +1,107 @@ + + + MakeSphericalDialog + + + + 0 + 0 + 267 + 217 + + + + Sphere Construction + + + + + + Arguments + + + + + + Vertex + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Vector + + + + + + + + 127 + 16777215 + + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + 1000000 + + + 1 + + + + + + + k + + + + + + + nb + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/MakeTranslation_QTD.ui b/src/HEXABLOCKGUI/MakeTranslation_QTD.ui new file mode 100644 index 0000000..46d24b4 --- /dev/null +++ b/src/HEXABLOCKGUI/MakeTranslation_QTD.ui @@ -0,0 +1,134 @@ + + + MakeTranslationDialog + + + + 0 + 0 + 355 + 295 + + + + Translation Operation + + + + + + Translate + + + + + + + + Elements : + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + Vector : + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + MakeTranslationDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + MakeTranslationDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/HEXABLOCKGUI/Makefile.am b/src/HEXABLOCKGUI/Makefile.am new file mode 100755 index 0000000..4fe6038 --- /dev/null +++ b/src/HEXABLOCKGUI/Makefile.am @@ -0,0 +1,219 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + + +include $(top_srcdir)/adm_local/unix/make_common_starter.am +# salomeresdir = $(prefix)/share/salome/resources/@MODULE_NAME@ + +SUBDIRS = MyDlgRef + +# header files +salomeinclude_HEADERS = \ + HEXABLOCKGUI_Export.hxx \ + HEXABLOCKGUI.hxx + +# Libraries targets +lib_LTLIBRARIES = libHEXABLOCK.la + +dist_libHEXABLOCK_la_SOURCES = \ + Resource.hxx \ + Resource.cxx \ + HEXABLOCKGUI_Exception.hxx \ + HEXABLOCKGUI_Exception.cxx \ + HEXABLOCKGUI_Trace.hxx \ + HEXABLOCKGUI_Trace.cxx \ + HEXABLOCKGUI_Resource.hxx \ + HEXABLOCKGUI_Resource.cxx \ + HEXABLOCKGUI_DocumentGraphicView.hxx \ + HEXABLOCKGUI_DocumentGraphicView.cxx \ + HEXABLOCKGUI_DocumentModel.hxx \ + HEXABLOCKGUI_DocumentModel.cxx \ + HEXABLOCKGUI_DocumentSelectionModel.hxx \ + HEXABLOCKGUI_DocumentSelectionModel.cxx \ + HEXABLOCKGUI_DocumentItem.hxx \ + HEXABLOCKGUI_DocumentItem.cxx \ + HEXABLOCKGUI_DocumentDelegate.hxx \ + HEXABLOCKGUI_DocumentDelegate.cxx \ + HEXABLOCKGUI_DocumentPanel.hxx \ + HEXABLOCKGUI_DocumentPanel.cxx \ + HEXABLOCKGUI_SalomeTools.hxx \ + HEXABLOCKGUI_SalomeTools.cxx \ + HEXABLOCKGUI.hxx \ + HEXABLOCKGUI.cxx \ + kmodelindexproxymapper.hxx \ + kmodelindexproxymapper.cxx \ + klinkitemselectionmodel.hxx \ + klinkitemselectionmodel.cxx \ + MyGEOMBase_Helper.hxx \ + MyGEOMBase_Helper.cxx \ + MyGEOMBase_Skeleton.hxx \ + MyGEOMBase_Skeleton.cxx \ + MyBasicGUI_PointDlg.hxx \ + MyBasicGUI_PointDlg.cxx + + +UIC_FILES = \ + ui_Vertex_QTD.h \ + ui_Edge_QTD.h \ + ui_Quad_QTD.h \ + ui_Hexa_QTD.h \ + ui_Vector_QTD.h \ + ui_Cylinder_QTD.h \ + ui_Pipe_QTD.h \ + ui_MakeGrid_QTD.h \ + ui_MakeCylinder_QTD.h \ + ui_MakePipe_QTD.h \ + ui_MakeCylinders_QTD.h \ + ui_MakePipes_QTD.h \ + ui_RemoveHexa_QTD.h \ + ui_PrismQuad_QTD.h \ + ui_JoinQuad_QTD.h \ + ui_Merge_QTD.h \ + ui_Disconnect_QTD.h \ + ui_CutEdge_QTD.h \ + ui_Transformation_QTD.h \ + ui_Symmetry_QTD.h \ + ui_Group_QTD.h \ + ui_Law_QTD.h \ + ui_Propagation_QTD.h \ + ui_QuadAssoc_QTD.h \ + ui_EdgeAssoc_QTD.h \ + ui_QuadRevolution_QTD.h \ + ui_MakeRind_QTD.h \ + ui_ReplaceHexa_QTD.h \ + ui_MakeHemiSphere_QTD.h + + +# MOC pre-processing +MOC_FILES = \ + HEXABLOCKGUI_moc.cxx \ + HEXABLOCKGUI_DocumentGraphicView_moc.cxx \ + HEXABLOCKGUI_DocumentPanel_moc.cxx \ + HEXABLOCKGUI_DocumentDelegate_moc.cxx \ + HEXABLOCKGUI_DocumentSelectionModel_moc.cxx \ + HEXABLOCKGUI_DocumentModel_moc.cxx \ + kmodelindexproxymapper_moc.cxx \ + klinkitemselectionmodel_moc.cxx \ + MyBasicGUI_PointDlg_moc.cxx \ + MyGEOMBase_Skeleton_moc.cxx + +nodist_libHEXABLOCK_la_SOURCES = $(MOC_FILES) \ + $(UIC_FILES) + +libHEXABLOCK_la_CXXFLAGS = \ + $(THREAD_DEF) \ + $(PYTHON_CPPFLAGS) \ + $(OMNIORB_CXXFLAGS) \ + $(OMNIORB_INCLUDES) \ + $(LIBXML_INCLUDES) \ + $(BOOST_CPPFLAGS) \ + $(CAS_CPPFLAGS) \ + $(VTK_INCLUDES) \ + $(KERNEL_CXXFLAGS) \ + $(GUI_CXXFLAGS) \ + $(GEOM_CXXFLAGS) \ + -I$(srcdir)/../HEXABLOCK \ + -I$(srcdir)/../HEXABLOCK_I \ + -I$(top_builddir) \ + -I../../idl \ + $(qt4_cppflags) \ + $(qsci4_cppflags) \ + -I$(srcdir)/../HEXABLOCKGUI/MyDlgRef \ + -I$(top_builddir)/src/HEXABLOCKGUI/MyDlgRef + + + +libHEXABLOCK_la_LDFLAGS = \ + ./MyDlgRef/libMyDlgRef.la \ + ../../idl/libSalomeIDLHEXABLOCK.la \ + ../HEXABLOCK_I/libHEXABLOCKEngine.la \ + ../HEXABLOCK/libHEXABLOCKimpl.la \ + -L$(GUI_ROOT_DIR)/lib/salome -lEvent -L$(KERNEL_ROOT_DIR)/lib/salome \ + $(qt4_ldflags) $(qsci4_ldflags) \ + $(KERNEL_LDFLAGS) -lSalomeLifeCycleCORBA \ + $(GUI_LDFLAGS) \ + $(GEOM_LDFLAGS) -lSalomeIDLGEOM -lGEOMBase -lBasicGUI \ + -lSalomeApp + + +libHEXABLOCK_la_LIBADD = \ + $(qt4_libs) $(qsci4_libs) \ + -lSalomeApp + +BUILT_SOURCES = $(UIC_FILES) + +# resources files +ICONS = \ + resources/SalomeApp.xml \ + resources/HEXABLOCKCatalog.xml \ + resources/ModuleHexablock.png \ + resources/new_document.png \ + resources/load_document.png \ + resources/save_document.png \ + resources/add_vertex.png \ + resources/add_edge.png \ + resources/add_quad.png \ + resources/add_hexa.png \ + resources/add_vector.png \ + resources/add_cylinder.png \ + resources/add_pipe.png \ + resources/make_grid.png \ + resources/make_cylinder.png \ + resources/make_pipe.png \ + resources/make_cylinders.png \ + resources/make_pipes.png \ + resources/remove_hexa.png \ + resources/prism_quad.png \ + resources/join_quad.png \ + resources/merge.png \ + resources/disconnect.png \ + resources/cut_edge.png \ + resources/make_transformation.png \ + resources/make_symmetry.png \ + resources/perform_transformation.png \ + resources/perform_symmetry.png \ + resources/assoc_vertex.png \ + resources/assoc_edge.png \ + resources/assoc_quad.png \ + resources/add_group.png \ + resources/remove_group.png \ + resources/add_law.png \ + resources/remove_law.png \ + resources/set_propagation.png \ + resources/compute_mesh.png \ + resources/point2.png \ + resources/pointonedge.png \ + resources/select1.png \ + resources/point3.png \ + resources/point_line_intersection.png \ + resources/pointonface.png \ + resources/line.png \ + resources/build_wire.png \ + resources/quad_revolution.png \ + resources/replace_hexa.png \ + resources/make_hemisphere.png + +QMFILES = \ + HEXABLOCK_msg_en.qm \ + HEXABLOCK_msg_fr.qm \ + HEXABLOCK_icons.qm + +dist_salomeres_DATA = ${ICONS} + +nodist_salomeres_DATA = $(QMFILES) diff --git a/src/HEXABLOCKGUI/MergeEdges_QTD.ui b/src/HEXABLOCKGUI/MergeEdges_QTD.ui new file mode 100644 index 0000000..38ecb87 --- /dev/null +++ b/src/HEXABLOCKGUI/MergeEdges_QTD.ui @@ -0,0 +1,145 @@ + + + MergeEdgesDialog + + + + 0 + 0 + 400 + 431 + + + + Merge Operation + + + + + + MergeEdges + + + + + + + + Edge 1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + Edge 2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + Vertex 1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + Vertex 2 + + + + + + + + 127 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + + + Qt::Vertical + + + + 20 + 220 + + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/MergeVertices_QTD.ui b/src/HEXABLOCKGUI/MergeVertices_QTD.ui new file mode 100644 index 0000000..e256ea5 --- /dev/null +++ b/src/HEXABLOCKGUI/MergeVertices_QTD.ui @@ -0,0 +1,91 @@ + + + MergeVerticesDialog + + + + 0 + 0 + 304 + 360 + + + + Dialog + + + + + + MergeVertices + + + + + + + + Vertex 1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + Vertex 2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + Qt::Vertical + + + + 261 + 207 + + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/Merge_QTD.ui b/src/HEXABLOCKGUI/Merge_QTD.ui new file mode 100644 index 0000000..0f9e932 --- /dev/null +++ b/src/HEXABLOCKGUI/Merge_QTD.ui @@ -0,0 +1,499 @@ + + + MergeDialog + + + + 0 + 0 + 254 + 524 + + + + + 0 + 0 + + + + Merge Operation + + + + QLayout::SetMinimumSize + + + + + + 0 + 0 + + + + Merge + + + + + + + 0 + 0 + + + + Vertex + + + true + + + + + + + + 0 + 0 + + + + Edge + + + + + + + Quad + + + + + + + + + + Arguments + + + + + + + + + vertex 1 + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + vertex 2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + edge 1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + edge 2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vertex 1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vertex 2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vertex 2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vertex 3 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vertex 4 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + quad 1 + + + + + + + quad 2 + + + + + + + vertex 1 + + + + + + + + + + + + + + + rb0 + clicked() + widget + show() + + + 61 + 48 + + + 76 + 104 + + + + + rb0 + clicked() + widget_2 + hide() + + + 94 + 46 + + + 181 + 180 + + + + + rb0 + clicked() + widget_3 + hide() + + + 41 + 49 + + + 73 + 310 + + + + + rb1 + clicked() + widget + hide() + + + 153 + 51 + + + 143 + 109 + + + + + rb1 + clicked() + widget_2 + show() + + + 197 + 48 + + + 218 + 182 + + + + + rb1 + clicked() + widget_3 + hide() + + + 182 + 38 + + + 190 + 310 + + + + + rb2 + clicked() + widget_3 + show() + + + 258 + 46 + + + 238 + 310 + + + + + rb2 + clicked() + widget_2 + hide() + + + 271 + 46 + + + 268 + 194 + + + + + rb2 + clicked() + widget + hide() + + + 255 + 48 + + + 250 + 111 + + + + + diff --git a/src/HEXABLOCKGUI/MyBasicGUI_PointDlg.cxx b/src/HEXABLOCKGUI/MyBasicGUI_PointDlg.cxx new file mode 100644 index 0000000..327b66f --- /dev/null +++ b/src/HEXABLOCKGUI/MyBasicGUI_PointDlg.cxx @@ -0,0 +1,1474 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MyBasicGUI_PointDlg.hxx" + +#include +#include +#include +#include + +#include +#include + +#include "MyDlgRef.hxx" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include + +#include "HEXABLOCKGUI_DocumentModel.hxx" +#include "HEXABLOCKGUI_DocumentSelectionModel.hxx" +#include "HEXABLOCKGUI_DocumentItem.hxx" +#include "HEXABLOCKGUI_SalomeTools.hxx" +#include "HEXABLOCKGUI.hxx" + +#define PARAM_VALUE 0 +#define COORD_VALUE 1 +#define LENGTH_VALUE 2 + +#define GEOM_POINT_XYZ 0 +#define GEOM_POINT_REF 1 +#define GEOM_POINT_EDGE 2 +#define GEOM_POINT_INTINT 3 +#define GEOM_POINT_SURF 4 + +#define SPACING 6 +#define MARGIN 9 + +using namespace HEXABLOCK::GUI; + +Q_DECLARE_METATYPE(QModelIndex); +Q_DECLARE_METATYPE(HEXABLOCK::GUI::HexaTreeRole); + +enum { SelectEdge, SelectWire }; + +//================================================================================= +// class : MyBasicGUI_PointDlg() +// purpose : Constructs a MyBasicGUI_PointDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +MyBasicGUI_PointDlg::MyBasicGUI_PointDlg(GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal, Qt::WindowFlags fl) + : MyGEOMBase_Skeleton(theGeometryGUI, parent, modal, fl), + myBusy (false), + _documentModel(0), + _patternDataSelectionModel(0), + _mgr(0), + _vtkVm(0), + _occVm(0), + _currentObj(0), + _selectionMutex(false) +{ + QWidget* w = centralWidget(); + QString objectName = w->objectName(); + QString className = w->metaObject()->className(); + MESSAGE("* centralWidget() " << w ); + MESSAGE("* centralWidget()->objectName() is "<< objectName.toStdString() ); //toStdString() + MESSAGE("* centralWidget()->metaObject()->className() is "<< className.toStdString() ); +; + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POINT"))); + QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POINT_EDGE"))); + QPixmap image2 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT"))); + QPixmap image3 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POINT_REF"))); + QPixmap image4 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POINT_LINES"))); + QPixmap image5 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_POINT_FACE"))); + QPixmap image6 (aResMgr->loadPixmap("GEOM", tr("ICO_LINE"))); + QPixmap image7 (aResMgr->loadPixmap("GEOM", tr("ICO_WIRE"))); + +// setWindowTitle(tr("GEOM_POINT_TITLE")); + setWindowTitle( tr("Vertex Association") ); + setMinimumWidth(260); + + + + + mainFrame()->GroupConstructors->setTitle(tr("GEOM_POINTS")); + mainFrame()->RadioButton1->setIcon(image0); + mainFrame()->RadioButton2->setIcon(image3); + mainFrame()->RadioButton3->setIcon(image1); + mainFrame()->RadioButton4->show(); + mainFrame()->RadioButton4->setIcon(image4); + mainFrame()->RadioButton5->show(); + mainFrame()->RadioButton5->setIcon(image5); + + myParamGroup = new QGroupBox(centralWidget()); + myParamCoord = new QButtonGroup(myParamGroup); + QHBoxLayout* boxLayout = new QHBoxLayout(myParamGroup); + boxLayout->setMargin(MARGIN); boxLayout->setSpacing(SPACING); + QRadioButton* btn = new QRadioButton(tr("GEOM_PARAM_VALUE"), myParamGroup); + myParamCoord->addButton(btn, PARAM_VALUE); + boxLayout->addWidget(btn); + btn = new QRadioButton(tr("GEOM_LENGTH_VALUE"), myParamGroup); + myParamCoord->addButton(btn, LENGTH_VALUE); + boxLayout->addWidget(btn); + btn = new QRadioButton(tr("GEOM_COORD_VALUE"), myParamGroup); + myParamCoord->addButton(btn, COORD_VALUE); + boxLayout->addWidget(btn); + myParamCoord->setExclusive(true); + myParamCoord->button(PARAM_VALUE)->setChecked(true); + + GroupXYZ = new DlgRef_3Spin(centralWidget()); + GroupXYZ->GroupBox1->setTitle(tr("GEOM_COORDINATES")); + GroupXYZ->TextLabel1->setText(tr("GEOM_X")); + GroupXYZ->TextLabel2->setText(tr("GEOM_Y")); + GroupXYZ->TextLabel3->setText(tr("GEOM_Z")); + + GroupOnCurve = new DlgRef_2Sel1Spin(centralWidget()); + GroupOnCurve->GroupBox1->setTitle(tr("GEOM_POINT_ON_EDGE")); + GroupOnCurve->TextLabel1->setText(tr("GEOM_EDGE")); + GroupOnCurve->TextLabel2->setText(tr("GEOM_START_POINT")); + GroupOnCurve->TextLabel3->setText(tr("GEOM_PARAMETER")); + GroupOnCurve->PushButton1->setIcon(image2); + GroupOnCurve->PushButton2->setIcon(image2); + + GroupOnSurface = new DlgRef_1Sel2Spin(centralWidget()); + GroupOnSurface->GroupBox1->setTitle(tr("GEOM_POINT_ON_FACE")); + GroupOnSurface->TextLabel1->setText(tr("GEOM_FACE")); + GroupOnSurface->TextLabel2->setText(tr("GEOM_UPARAMETER")); + GroupOnSurface->TextLabel3->setText(tr("GEOM_VPARAMETER")); + GroupOnSurface->PushButton1->setIcon(image2); + + GroupRefPoint = new DlgRef_1Sel3Spin(centralWidget()); + GroupRefPoint->GroupBox1->setTitle(tr("GEOM_REF_POINT")); + GroupRefPoint->TextLabel1->setText(tr("GEOM_POINT")); + GroupRefPoint->PushButton1->setIcon(image2); + GroupRefPoint->TextLabel2->setText(tr("GEOM_DX")); + GroupRefPoint->TextLabel3->setText(tr("GEOM_DY")); + GroupRefPoint->TextLabel4->setText(tr("GEOM_DZ")); + + /* popup menu for line intersect buttons */ + myBtnPopup = new QMenu(this); + QIcon ico_line = QIcon(image6); + QIcon ico_wire = QIcon(image7); + myActions[myBtnPopup->addAction(ico_line, tr("GEOM_EDGE"))] = SelectEdge; + myActions[myBtnPopup->addAction(ico_wire, tr("GEOM_WIRE"))] = SelectWire; + + GroupLineIntersection = new DlgRef_2Sel(centralWidget()); + GroupLineIntersection->GroupBox1->setTitle(tr("GEOM_LINE_INTERSECTION")); + GroupLineIntersection->TextLabel1->setText(tr("GEOM_LINE1")); + GroupLineIntersection->TextLabel2->setText(tr("GEOM_LINE2")); + GroupLineIntersection->PushButton1->setIcon(image2); + GroupLineIntersection->PushButton1->setMenu(myBtnPopup); + GroupLineIntersection->PushButton2->setIcon(image2); + GroupLineIntersection->PushButton2->setMenu(myBtnPopup); + GroupLineIntersection->LineEdit2->setEnabled(false); + + myCoordGrp = new QGroupBox(tr("GEOM_COORDINATES_RES"), centralWidget()); + QGridLayout* myCoordGrpLayout = new QGridLayout(myCoordGrp); + myCoordGrpLayout->addWidget(new QLabel(tr("GEOM_X"), myCoordGrp), 0, 0); + myX = new QLineEdit(myCoordGrp); + myCoordGrpLayout->addWidget(myX, 0, 1); + myCoordGrpLayout->addWidget(new QLabel(tr("GEOM_Y"), myCoordGrp), 1, 0); + myY = new QLineEdit(myCoordGrp); + myCoordGrpLayout->addWidget(myY, 1, 1); + myCoordGrpLayout->addWidget(new QLabel(tr("GEOM_Z"), myCoordGrp), 2, 0); + myZ = new QLineEdit(myCoordGrp); + myCoordGrpLayout->addWidget(myZ, 2, 1); + + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); + layout->setMargin(0); layout->setSpacing(6); + layout->addWidget(myParamGroup); + layout->addWidget(GroupXYZ); + layout->addWidget(GroupOnCurve); + layout->addWidget(GroupOnSurface); + layout->addWidget(GroupRefPoint); + layout->addWidget(GroupLineIntersection); + layout->addWidget(myCoordGrp); + + + myX->setReadOnly(true); + myY->setReadOnly(true); + myZ->setReadOnly(true); + + myX->setEnabled(false); + myY->setEnabled(false); + myZ->setEnabled(false); + + QPalette aPal = myX->palette(); + aPal.setColor(QPalette::Disabled, QPalette::Text, QColor(0, 0, 0)); + myX->setPalette(aPal); + myY->setPalette(aPal); + myZ->setPalette(aPal); + + setHelpFileName("gui_asso_quad_to_geom.html#associate-to-a-vertex-of-the-geometry");/*"create_point_page.html"*/ + + Init(); + + /* HEXABLOCK */ + _initInputWidget(); + _initViewManager(); + /* HEXABLOCK */ +} + + +//================================================================================= +// function : ~MyBasicGUI_PointDlg() +// purpose : Destructor +//================================================================================= +MyBasicGUI_PointDlg::~MyBasicGUI_PointDlg() +{ +} + + + + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void MyBasicGUI_PointDlg::Init() +{ + MESSAGE("MyBasicGUI_PointDlg::Init() "); + + GroupOnCurve->LineEdit1->setReadOnly(true); + GroupOnCurve->LineEdit2->setReadOnly(true); + GroupOnSurface->LineEdit1->setReadOnly(true); + GroupRefPoint->LineEdit1->setReadOnly(true); + GroupLineIntersection->LineEdit1->setReadOnly(true); + GroupLineIntersection->LineEdit2->setReadOnly(true); + GroupLineIntersection->LineEdit1->setEnabled(true); + GroupLineIntersection->LineEdit2->setEnabled(false); + + myEdge.nullify(); + myFace.nullify(); + myRefPoint.nullify(); + myLine1.nullify(); + myLine2.nullify(); + myNeedType = TopAbs_VERTEX; + + myEditCurrentArgument = 0; + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); + + /* min, max, step and decimals for spin boxes */ + initSpinBox(GroupXYZ->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision"); + initSpinBox(GroupXYZ->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision"); + initSpinBox(GroupXYZ->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision"); + GroupXYZ->SpinBox_DX->setValue(0.0); + GroupXYZ->SpinBox_DY->setValue(0.0); + GroupXYZ->SpinBox_DZ->setValue(0.0); + + initSpinBox(GroupRefPoint->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision"); + initSpinBox(GroupRefPoint->SpinBox_DY, COORD_MIN, COORD_MAX, step, "length_precision"); + initSpinBox(GroupRefPoint->SpinBox_DZ, COORD_MIN, COORD_MAX, step, "length_precision"); + GroupRefPoint->SpinBox_DX->setValue(0.0); + GroupRefPoint->SpinBox_DY->setValue(0.0); + GroupRefPoint->SpinBox_DZ->setValue(0.0); + + step = 0.1; + + initSpinBox(GroupOnCurve->SpinBox_DX, 0., 1., step, "parametric_precision"); + GroupOnCurve->SpinBox_DX->setValue(0.5); + + initSpinBox(GroupOnSurface->SpinBox_DX, 0., 1., step, "parametric_precision"); + GroupOnSurface->SpinBox_DX->setValue(0.5); + initSpinBox(GroupOnSurface->SpinBox_DY, 0., 1., step, "parametric_precision"); + GroupOnSurface->SpinBox_DY->setValue(0.5); + + MESSAGE("MyBasicGUI_PointDlg::Init() : myGeomGUI " << myGeomGUI); + /* signals and slots connections */ + if ( myGeomGUI ){ + connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + } + //connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); + + connect(myParamCoord, SIGNAL(buttonClicked(int)), this, SLOT(ClickParamCoord(int))); + + connect(GroupOnCurve->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupOnCurve->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupOnSurface->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupLineIntersection->PushButton1, SIGNAL(pressed()), this, SLOT(SetEditCurrentArgument())); + connect(GroupLineIntersection->PushButton2, SIGNAL(pressed()), this, SLOT(SetEditCurrentArgument())); + + connect(myBtnPopup, SIGNAL(triggered(QAction*)), this, SLOT(onBtnPopup(QAction*))); + + connect(GroupOnCurve->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupOnSurface->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupOnSurface->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupXYZ->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupXYZ->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupXYZ->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupRefPoint->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupRefPoint->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupRefPoint->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + if ( myGeomGUI ){ + connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double))); + + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + } + + initName(tr("GEOM_VERTEX")); + + ConstructorsClicked(0); +} + +//================================================================================= +// function : SetDoubleSpinBoxStep() +// purpose : Double spin box management +//================================================================================= +void MyBasicGUI_PointDlg::SetDoubleSpinBoxStep(double step) +{ + GroupOnCurve->SpinBox_DX->setSingleStep(step); + GroupXYZ->SpinBox_DX->setSingleStep(step); + GroupXYZ->SpinBox_DY->setSingleStep(step); + GroupXYZ->SpinBox_DZ->setSingleStep(step); + GroupRefPoint->SpinBox_DX->setSingleStep(step); + GroupRefPoint->SpinBox_DY->setSingleStep(step); + GroupRefPoint->SpinBox_DZ->setSingleStep(step); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void MyBasicGUI_PointDlg::ConstructorsClicked(int constructorId) +{ +// HEXABLOCKGUI::currentOccView->raise(); +// HEXABLOCKGUI::currentOccView->setFocus(); + MESSAGE("MyBasicGUI_PointDlg::ConstructorsClicked("<< constructorId << ")"); + switch (constructorId) { + case GEOM_POINT_XYZ: + { + globalSelection(); // close local contexts, if any + myNeedType = TopAbs_VERTEX; + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); + + GroupRefPoint->hide(); + GroupOnCurve->hide(); + GroupLineIntersection->hide(); + GroupOnSurface->hide(); + myCoordGrp->hide(); + myParamGroup->hide(); + GroupXYZ->show(); + break; + } + case GEOM_POINT_REF: + { + globalSelection(); // close local contexts, if any + myNeedType = TopAbs_VERTEX; + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); + + myEditCurrentArgument = GroupRefPoint->LineEdit1; + //myEditCurrentArgument->setText(""); + //myRefPoint.nullify(); + GroupRefPoint->PushButton1->setDown(true); + myParamGroup->hide(); + GroupXYZ->hide(); + GroupOnCurve->hide(); + GroupLineIntersection->hide(); + GroupOnSurface->hide(); + GroupRefPoint->show(); + myCoordGrp->show(); + break; + } + case GEOM_POINT_EDGE: + { + globalSelection(); // close local contexts, if any + myNeedType = TopAbs_EDGE; + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); + + myEditCurrentArgument = GroupOnCurve->LineEdit1; +// myEditCurrentArgument->setText(""); +// myEdge.nullify(); +// myRefPoint.nullify(); + GroupOnCurve->PushButton1->setDown(true); + GroupRefPoint->hide(); + GroupLineIntersection->hide(); + GroupOnSurface->hide(); + myParamGroup->show(); + myParamCoord->button(LENGTH_VALUE)->show(); + myParamCoord->button(PARAM_VALUE)->setChecked(true); + GroupOnCurve->show(); + myCoordGrp->show(); + updateParamCoord(false); + break; + } + case GEOM_POINT_INTINT: + { + globalSelection(); // close local contexts, if any + myNeedType = TopAbs_EDGE; + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); + + myEditCurrentArgument = GroupLineIntersection->LineEdit1; +// GroupLineIntersection->LineEdit1->setText(""); +// GroupLineIntersection->LineEdit2->setText(""); + GroupLineIntersection->LineEdit1->setEnabled(true); + GroupLineIntersection->LineEdit2->setEnabled(false); +// myLine1.nullify(); +// myLine2.nullify(); + GroupLineIntersection->PushButton1->setDown(true); + GroupLineIntersection->PushButton2->setDown(false); + myParamGroup->hide(); + GroupXYZ->hide(); + GroupRefPoint->hide(); + GroupOnCurve->hide(); + GroupOnSurface->hide(); + myCoordGrp->hide(); + GroupLineIntersection->show(); + break; + } + case GEOM_POINT_SURF: + { + globalSelection(); // close local contexts, if any + myNeedType = TopAbs_FACE; + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); + + myEditCurrentArgument = GroupOnSurface->LineEdit1; + //myEditCurrentArgument->setText(""); + //myFace.nullify(); + GroupOnSurface->PushButton1->setDown(true); + GroupRefPoint->hide(); + GroupOnCurve->hide(); + GroupLineIntersection->hide(); + myParamGroup->show(); + myParamCoord->button(LENGTH_VALUE)->hide(); + myParamCoord->button(PARAM_VALUE)->setChecked(true); + GroupOnSurface->show(); + myCoordGrp->show(); + updateParamCoord(false); + break; + } + } + +// myX->setText(""); +// myY->setText(""); +// myZ->setText(""); + + QTimer::singleShot(50, this, SLOT(updateSize())); + + SelectionIntoArgument(); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void MyBasicGUI_PointDlg::ClickOnOk() +{ + setIsApplyAndClose(true); + if (onAccept()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool MyBasicGUI_PointDlg::ClickOnApply() +{ + if (!onAccept()) + return false; + + initName(); + ConstructorsClicked(getConstructorId()); + + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed (for constructors not using local context) +//================================================================================= +void MyBasicGUI_PointDlg::SelectionIntoArgument() +{ + MESSAGE("MyBasicGUI_PointDlg::SelectionIntoArgument() myGeomGUI : "<< myGeomGUI); + + GEOM::GeomObjPtr aSelectedObject = getSelected(myNeedType); + TopoDS_Shape aShape; + if (!aSelectedObject || !GEOMBase::GetShape(aSelectedObject.get(), aShape) || aShape.IsNull()) + return; + + erasePreview(); + const int id = getConstructorId(); + + if ((id == GEOM_POINT_REF || id == GEOM_POINT_EDGE || id == GEOM_POINT_SURF) + && myEditCurrentArgument != 0) + { + myEditCurrentArgument->setText(""); + myX->setText(""); + myY->setText(""); + myZ->setText(""); + myFace.nullify(); + if (myEditCurrentArgument == GroupOnCurve->LineEdit1) + myEdge.nullify(); + else if (myEditCurrentArgument == GroupOnCurve->LineEdit2) + myRefPoint.nullify(); + } + else if (id == GEOM_POINT_INTINT) { + myEditCurrentArgument->setText(""); + if (myEditCurrentArgument == GroupLineIntersection->LineEdit1) + myLine1.nullify(); + else if (myEditCurrentArgument == GroupLineIntersection->LineEdit2) + myLine2.nullify(); + } + + QString aName = GEOMBase::GetName(aSelectedObject.get()); + myBusy = true; + if (id == GEOM_POINT_XYZ) { + gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); + GroupXYZ->SpinBox_DX->setValue(aPnt.X()); + GroupXYZ->SpinBox_DY->setValue(aPnt.Y()); + GroupXYZ->SpinBox_DZ->setValue(aPnt.Z()); + } + else if (id == GEOM_POINT_REF) { + myRefPoint = aSelectedObject; + GroupRefPoint->LineEdit1->setText(aName); + } + else if (id == GEOM_POINT_EDGE) { + myEditCurrentArgument->setText(aName); + if (myEditCurrentArgument == GroupOnCurve->LineEdit1) { + myEdge = aSelectedObject; + if (myEdge && !myRefPoint) { + GroupOnCurve->PushButton2->click(); + } + } + else if (myEditCurrentArgument == GroupOnCurve->LineEdit2) { + myRefPoint = aSelectedObject; + if (myRefPoint && !myEdge) { + GroupOnCurve->PushButton1->click(); + } + } + } + else if (id == GEOM_POINT_INTINT) { + myEditCurrentArgument->setText(aName); + if (myEditCurrentArgument == GroupLineIntersection->LineEdit1) { + myLine1 = aSelectedObject; + if (!myLine2) { + GroupLineIntersection->PushButton2->setMenu(0); + GroupLineIntersection->PushButton2->click(); + GroupLineIntersection->PushButton2->setDown(true); + GroupLineIntersection->PushButton2->setMenu(myBtnPopup); + } + } + else if (myEditCurrentArgument == GroupLineIntersection->LineEdit2) { + myLine2 = aSelectedObject; + if (!myLine1) { + GroupLineIntersection->PushButton1->setMenu(0); + GroupLineIntersection->PushButton1->click(); + GroupLineIntersection->PushButton1->setDown(true); + GroupLineIntersection->PushButton1->setMenu(myBtnPopup); + } + } + } + else if (id == GEOM_POINT_SURF) { + myFace = aSelectedObject; + GroupOnSurface->LineEdit1->setText(aName); + } + myBusy = false; + + + displayPreview(true); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void MyBasicGUI_PointDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if (send == GroupRefPoint->PushButton1) { + GroupRefPoint->LineEdit1->setFocus(); + myEditCurrentArgument = GroupRefPoint->LineEdit1; + globalSelection(); // close local contexts, if any + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); + } + else if (send == GroupOnCurve->PushButton1) { + GroupOnCurve->LineEdit1->setFocus(); + myEditCurrentArgument = GroupOnCurve->LineEdit1; + globalSelection(); // close local contexts, if any + myNeedType = TopAbs_EDGE; + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); + GroupOnCurve->PushButton2->setDown(false); + GroupOnCurve->LineEdit1->setEnabled(true); + GroupOnCurve->LineEdit2->setEnabled(false); + } + else if (send == GroupOnCurve->PushButton2) { + GroupOnCurve->LineEdit2->setFocus(); + myEditCurrentArgument = GroupOnCurve->LineEdit2; + globalSelection(); // close local contexts, if any + myNeedType = TopAbs_VERTEX; + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); + GroupOnCurve->PushButton1->setDown(false); + GroupOnCurve->LineEdit2->setEnabled(true); + GroupOnCurve->LineEdit1->setEnabled(false); + } + else if (send == GroupOnSurface->PushButton1) + { + GroupOnSurface->LineEdit1->setFocus(); + myEditCurrentArgument = GroupOnSurface->LineEdit1; + globalSelection(); // close local contexts, if any + localSelection(GEOM::GEOM_Object::_nil(), TopAbs_FACE); + } + else if (send == GroupLineIntersection->PushButton1) { + GroupLineIntersection->LineEdit1->setFocus(); + myEditCurrentArgument = GroupLineIntersection->LineEdit1; + GroupLineIntersection->PushButton2->setDown(false); + GroupLineIntersection->LineEdit1->setEnabled(true); + GroupLineIntersection->LineEdit2->setEnabled(false); + } + else if (send == GroupLineIntersection->PushButton2) { + GroupLineIntersection->LineEdit2->setFocus(); + myEditCurrentArgument = GroupLineIntersection->LineEdit2; + GroupLineIntersection->PushButton1->setDown(false); + GroupLineIntersection->LineEdit1->setEnabled(false); + GroupLineIntersection->LineEdit2->setEnabled(true); + } + send->setDown(true); + + if ((send == GroupLineIntersection->PushButton1 || + send == GroupLineIntersection->PushButton2) && !myBusy) + SelectionIntoArgument(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : to reactivate this dialog box when mouse enter onto the window +//================================================================================= +void MyBasicGUI_PointDlg::enterEvent(QEvent*) +{ + MESSAGE( "MyBasicGUI_PointDlg::enterEvent() "); + if (!mainFrame()->GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void MyBasicGUI_PointDlg::ActivateThisDialog() +{ + MESSAGE( "MyBasicGUI_PointDlg::ActivateThisDialog() "); + MyGEOMBase_Skeleton::ActivateThisDialog(); + + if ( myGeomGUI ){ + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + } + ConstructorsClicked(getConstructorId()); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void MyBasicGUI_PointDlg::DeactivateActiveDialog() +{ + MESSAGE( "MyBasicGUI_PointDlg::DeactivateActiveDialog() "); + // myGeomGUI->SetState(-1); + MyGEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void MyBasicGUI_PointDlg::ValueChangedInSpinBox(double newValue) +{ + displayPreview(true); +} + +//================================================================================= +// function : CheckBoxClicked() +// purpose : Check Boxes Management +//================================================================================= +void MyBasicGUI_PointDlg::CheckBoxClicked(int State) +{ + displayPreview(true); +} + + +//================================================================================= +// funcion : getParameter() +// purpose : +//================================================================================= +double MyBasicGUI_PointDlg::getParameter() const +{ + return GroupOnCurve->SpinBox_DX->value(); +} + + +//================================================================================= +// funcion : getUParameter() +// purpose : +//================================================================================= +double MyBasicGUI_PointDlg::getUParameter() const +{ + return GroupOnSurface->SpinBox_DX->value(); +} + + +//================================================================================= +// funcion : getVParameter() +// purpose : +//================================================================================= +double MyBasicGUI_PointDlg::getVParameter() const +{ + return GroupOnSurface->SpinBox_DY->value(); +} + + +//================================================================================= +// function : OnPointSelected +// purpose : +//================================================================================= +void MyBasicGUI_PointDlg::OnPointSelected(const gp_Pnt& thePnt) +{ + if (getConstructorId() == GEOM_POINT_XYZ) { + GroupXYZ->SpinBox_DX->setValue(thePnt.X()); + GroupXYZ->SpinBox_DY->setValue(thePnt.Y()); + GroupXYZ->SpinBox_DZ->setValue(thePnt.Z()); + + displayPreview(true); + } +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr MyBasicGUI_PointDlg::createOperation() +{ + return myGeomGUI->GetGeomGen()->GetIBasicOperations(getStudyId()); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool MyBasicGUI_PointDlg::isValid(QString& msg) +{ + bool ok = false; + switch (getConstructorId()) { + case GEOM_POINT_XYZ : + ok = GroupXYZ->SpinBox_DX->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DY->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DZ->isValid(msg, !IsPreview()); + break; + case GEOM_POINT_REF: + ok = GroupRefPoint->SpinBox_DX->isValid(msg, !IsPreview()) && + GroupRefPoint->SpinBox_DY->isValid(msg, !IsPreview()) && + GroupRefPoint->SpinBox_DZ->isValid(msg, !IsPreview()) && + myRefPoint; + break; + case GEOM_POINT_EDGE: + if (myParamCoord->checkedId() == PARAM_VALUE || myParamCoord->checkedId() == LENGTH_VALUE) + ok = GroupOnCurve->SpinBox_DX->isValid(msg, !IsPreview()); + else + ok = GroupXYZ->SpinBox_DX->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DY->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DZ->isValid(msg, !IsPreview()); + ok = myEdge && ok; + break; + case GEOM_POINT_INTINT: + ok = myLine1 && myLine2; + break; + case GEOM_POINT_SURF: + if (myParamCoord->checkedId() == PARAM_VALUE) + ok = GroupOnSurface->SpinBox_DX->isValid(msg, !IsPreview()) && + GroupOnSurface->SpinBox_DY->isValid(msg, !IsPreview()); + else + ok = GroupXYZ->SpinBox_DX->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DY->isValid(msg, !IsPreview()) && + GroupXYZ->SpinBox_DZ->isValid(msg, !IsPreview()); + ok = myFace && ok; + break; + default: + break; + } + return ok; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool MyBasicGUI_PointDlg::execute(ObjectList& objects) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + QStringList aParameters; + + GEOM::GEOM_IBasicOperations_var anOper = GEOM::GEOM_IBasicOperations::_narrow(getOperation()); + + switch (getConstructorId()) { + case GEOM_POINT_XYZ : + { + double x = GroupXYZ->SpinBox_DX->value(); + double y = GroupXYZ->SpinBox_DY->value(); + double z = GroupXYZ->SpinBox_DZ->value(); + + aParameters << GroupXYZ->SpinBox_DX->text(); + aParameters << GroupXYZ->SpinBox_DY->text(); + aParameters << GroupXYZ->SpinBox_DZ->text(); + + anObj = anOper->MakePointXYZ(x, y, z); + res = true; + break; + } + case GEOM_POINT_REF : + { + double dx = GroupRefPoint->SpinBox_DX->value(); + double dy = GroupRefPoint->SpinBox_DY->value(); + double dz = GroupRefPoint->SpinBox_DZ->value(); + + aParameters << GroupRefPoint->SpinBox_DX->text(); + aParameters << GroupRefPoint->SpinBox_DY->text(); + aParameters << GroupRefPoint->SpinBox_DZ->text(); + + anObj = anOper->MakePointWithReference(myRefPoint.get(), dx, dy, dz); + res = true; + break; + } + case GEOM_POINT_EDGE : + { + if (myParamCoord->checkedId() == PARAM_VALUE) { + anObj = anOper->MakePointOnCurve(myEdge.get(), getParameter()); + aParameters<SpinBox_DX->text(); + } + else if (myParamCoord->checkedId() == LENGTH_VALUE) { + anObj = anOper->MakePointOnCurveByLength(myEdge.get(), getParameter(), myRefPoint.get()); + aParameters<SpinBox_DX->text(); + } + else if (myParamCoord->checkedId() == COORD_VALUE) { + double x = GroupXYZ->SpinBox_DX->value(); + double y = GroupXYZ->SpinBox_DY->value(); + double z = GroupXYZ->SpinBox_DZ->value(); + + aParameters << GroupXYZ->SpinBox_DX->text(); + aParameters << GroupXYZ->SpinBox_DY->text(); + aParameters << GroupXYZ->SpinBox_DZ->text(); + + anObj = anOper->MakePointOnCurveByCoord(myEdge.get(), x, y, z); + } + res = true; + break; + } + case GEOM_POINT_INTINT : + anObj = anOper->MakePointOnLinesIntersection(myLine1.get(), myLine2.get()); + if (!anObj->_is_nil()) { + QString aName = getNewObjectName(); + if (anObj->GetShapeType() == GEOM::COMPOUND && aName.startsWith("Vertex")) + initName(tr("GEOM_COMPOUND")); + else if (anObj->GetShapeType() == GEOM::VERTEX && aName.startsWith("Compound")) + initName(tr("GEOM_VERTEX")); + } + res = true; + break; + case GEOM_POINT_SURF : + { + if (myParamCoord->checkedId() == PARAM_VALUE) { + anObj = anOper->MakePointOnSurface(myFace.get(), getUParameter(), getVParameter()); + aParameters<SpinBox_DX->text(); + aParameters<SpinBox_DY->text(); + } else { + double x = GroupXYZ->SpinBox_DX->value(); + double y = GroupXYZ->SpinBox_DY->value(); + double z = GroupXYZ->SpinBox_DZ->value(); + + aParameters << GroupXYZ->SpinBox_DX->text(); + aParameters << GroupXYZ->SpinBox_DY->text(); + aParameters << GroupXYZ->SpinBox_DZ->text(); + + anObj = anOper->MakePointOnSurfaceByCoord(myFace.get(), x, y, z); + } + res = true; + break; + } + } + + const int id = getConstructorId(); + if(!anObj->_is_nil() && !IsPreview() && (id == GEOM_POINT_XYZ || + id == GEOM_POINT_REF || + id == GEOM_POINT_EDGE || + id == GEOM_POINT_SURF)) { + anObj->SetParameters(aParameters.join(":").toLatin1().constData()); + } + + if (id == GEOM_POINT_REF || id == GEOM_POINT_EDGE || id == GEOM_POINT_SURF) { + TopoDS_Shape aShape; + if (GEOMBase::GetShape(anObj, aShape) && !aShape.IsNull() && + aShape.ShapeType() == TopAbs_VERTEX) { + gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue("Geometry", "length_precision", 6); + myX->setText(DlgRef::PrintDoubleValue(aPnt.X(), aPrecision)); + myY->setText(DlgRef::PrintDoubleValue(aPnt.Y(), aPrecision)); + myZ->setText(DlgRef::PrintDoubleValue(aPnt.Z(), aPrecision)); + } + else { + myX->setText(""); + myY->setText(""); + myZ->setText(""); + } + } + + if (!anObj->_is_nil()) { + objects.push_back(anObj._retn()); + } + + return res; +} + +//================================================================================= +// function : addSubshapeToStudy +// purpose : virtual method to add new SubObjects if local selection +//================================================================================= +void MyBasicGUI_PointDlg::addSubshapesToStudy() +{ + switch (getConstructorId()) { + case GEOM_POINT_REF: + GEOMBase::PublishSubObject(myRefPoint.get()); + break; + case GEOM_POINT_EDGE: + GEOMBase::PublishSubObject(myEdge.get()); + break; + case GEOM_POINT_INTINT: + GEOMBase::PublishSubObject(myLine1.get()); + GEOMBase::PublishSubObject(myLine2.get()); + break; + case GEOM_POINT_SURF: + GEOMBase::PublishSubObject(myFace.get()); + break; + default: + break; + } +} + +//================================================================================= +// function : ClickParamCoord() +// purpose : +//================================================================================= +void MyBasicGUI_PointDlg::ClickParamCoord(int id) +{ + updateParamCoord(true); + displayPreview(true); +} + +//================================================================================= +// function : updateParamCoord +// purpose : +//================================================================================= +void MyBasicGUI_PointDlg::updateParamCoord(bool theIsUpdate) +{ + bool isParam = myParamCoord->checkedId() == PARAM_VALUE; + bool isLength = myParamCoord->checkedId() == LENGTH_VALUE; + + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); + + const int id = getConstructorId(); + if (id == GEOM_POINT_EDGE) { + GroupOnCurve->TextLabel2->setVisible(isLength); + GroupOnCurve->PushButton2->setVisible(isLength); + GroupOnCurve->LineEdit2->setVisible(isLength); + GroupOnCurve->TextLabel3->setVisible(isParam || isLength); + GroupOnCurve->SpinBox_DX->setVisible(isParam || isLength); + if (isParam){ + initSpinBox(GroupOnCurve->SpinBox_DX, 0., 1., 0.1, "parametric_precision"); + GroupOnCurve->SpinBox_DX->setValue(0.5); + GroupOnCurve->TextLabel3->setText(tr("GEOM_PARAMETER")); + } + else if (isLength){ + initSpinBox(GroupOnCurve->SpinBox_DX, COORD_MIN, COORD_MAX, step, "length_precision"); + GroupOnCurve->SpinBox_DX->setValue(0.0); + GroupOnCurve->TextLabel3->setText(tr("GEOM_LENGTH")); + } + } + else if (id == GEOM_POINT_SURF) { + GroupOnSurface->TextLabel2->setShown(isParam); + GroupOnSurface->TextLabel3->setShown(isParam); + GroupOnSurface->SpinBox_DX->setShown(isParam); + GroupOnSurface->SpinBox_DY->setShown(isParam); + } + + GroupXYZ->setShown(!isParam && !isLength); + + if (theIsUpdate) + QTimer::singleShot(50, this, SLOT(updateSize())); +} + +//================================================================================= +// function : onBtnPopup() +// purpose : +//================================================================================= +void MyBasicGUI_PointDlg::onBtnPopup(QAction* a) +{ + globalSelection(); // close local contexts, if any + myNeedType = myActions[a] == SelectEdge ? TopAbs_EDGE : TopAbs_WIRE; + localSelection(GEOM::GEOM_Object::_nil(), myNeedType); +} + +//================================================================================= +// function : updateSize +// purpose : adjust dialog size to minimum +//================================================================================= +void MyBasicGUI_PointDlg::updateSize() +{ + qApp->processEvents(); + updateGeometry(); + resize(minimumSizeHint()); +} + + + + + +/* + HEXABLOCK +*/ + + + +void MyBasicGUI_PointDlg::setDocumentModel( HEXABLOCK::GUI::DocumentModel* m) +{ + _documentModel = m; +} + +void MyBasicGUI_PointDlg::setPatternDataSelectionModel( HEXABLOCK::GUI::PatternDataSelectionModel* s) +{ + _patternDataSelectionModel = s; +} + +void MyBasicGUI_PointDlg::_initInputWidget() +{ + +// QVBoxLayout* mainLayout = new QVBoxLayout( centralWidget() ); +// setLayout( mainLayout ); +// QHBoxLayout* up = new QHBoxLayout( centralWidget() ); +// QVBoxLayout* down = new QVBoxLayout( centralWidget() ); + +// QGroupBox *GroupBoxName = new QGroupBox(centralWidget()); +// GroupBoxName->setObjectName(QString::fromUtf8("GroupBoxName")); +// GroupBoxName->setTitle("Vertex"); +// QHBoxLayout *hboxLayout1 = new QHBoxLayout(GroupBoxName); +// hboxLayout1->setSpacing(6); +// hboxLayout1->setContentsMargins(9, 9, 9, 9); +// hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1")); +// QLabel *NameLabel = new QLabel(GroupBoxName); +// NameLabel->setObjectName(QString::fromUtf8("NameLabel")); +// NameLabel->setWordWrap(false); +// NameLabel->setText( "Name : " ); +// hboxLayout1->addWidget( NameLabel ); +// mainFrame()->_vertex_le = new QLineEdit( GroupBoxName ); +// mainFrame()->_vertex_le->setObjectName(QString::fromUtf8("mainFrame()->_vertex_le")); +// hboxLayout1->addWidget(mainFrame()->_vertex_le); +// +// layout()->addWidget( GroupBoxName ); + + + + QRegExp rx(""); + QValidator *validator = new QRegExpValidator(rx, this); + +// setProperty( "HexaWidgetType", QVariant::fromValue(HEXABLOCK::GUI::VERTEX_TREE) ); +// installEventFilter(this); + + mainFrame()->_vertex_le->setProperty( "HexaWidgetType", QVariant::fromValue(HEXABLOCK::GUI::VERTEX_TREE) ); + mainFrame()->_vertex_le->installEventFilter(this); + mainFrame()->_vertex_le->setValidator( validator ); +} + +void MyBasicGUI_PointDlg::_initViewManager() +{ + SalomeApp_Application* anApp = dynamic_cast( SUIT_Session::session()->activeApplication() ); + _mgr = dynamic_cast( anApp->selectionMgr() ); + _vtkVm = anApp->getViewManager( SVTK_Viewer::Type(), true ); + _occVm = anApp->getViewManager( OCCViewer_Viewer::Type(), true ); + SUIT_ViewManager* activeVm = anApp->activeViewManager(); + onWindowActivated ( activeVm ); +} + + +// bool MyBasicGUI_PointDlg::_onSelectionChanged( const QItemSelection& sel, QLineEdit* le ) +// { +// MESSAGE("HexaBaseDialog::_onSelectionChanged(const QItemSelection& sel, QLineEdit* le)"); +// MESSAGE("* le is "<< le->objectName().toStdString() ); +// QModelIndexList l = sel.indexes(); +// if ( l.count() == 0 ) return false; +// +// //type from selection (first) +// QModelIndex selected = l[0]; +// int selType = selected.data(HEXABLOCK::GUI::HEXA_TREE_ROLE).toInt(); +// +// //type of widget +// QVariant v = le->property("HexaWidgetType"); +// if ( !v.isValid() ) return false; +// HexaWidgetType wType = v.value(); +// +// // check selection compatibility between selection and widget +// if ( selType != wType ){ +// MESSAGE("* bad selection : " << selType << " is not " << wType ); +// SUIT_MessageBox::information( 0, +// tr("HEXA_INFO"), +// tr("Bad selection type: please select a %1").arg( _strHexaWidgetType[wType]) ); +// return false; +// } +// +// //fill the lineEdit if selection is OK +// le->setText( selected.data().toString() );// name +// le->setProperty("QModelIndex", QVariant::fromValue(selected) ); +// MESSAGE("}"); +// return true; +// } + + + +void MyBasicGUI_PointDlg::onSelectionChanged( const QItemSelection& sel, const QItemSelection& unsel ) +{ + MESSAGE( "HexaBaseDialog::onSelectionChanged(){" ); + QString className = metaObject()->className(); + MESSAGE( "* I am : " << className.toStdString() ); + MESSAGE( "* sender is : " << sender() ); + QItemSelectionModel* selector = dynamic_cast(sender()); + MESSAGE( "* selector : " << selector); + + foreach( const QModelIndex& isel, sel.indexes() ){ + MESSAGE("* selected : " << isel.data().toString().toStdString()); + } + foreach( const QModelIndex& iunsel, unsel.indexes() ){ + MESSAGE("* unselected : " << iunsel.data().toString().toStdString()); + } + if ( _selectionMutex ) return; + if ( _currentObj != mainFrame()->_vertex_le ) return; + + bool selOk = false; + + QModelIndexList l = sel.indexes(); + if ( l.count() != 0 ){ + //type from selection (first) + QModelIndex selected = l[0]; + int selType = selected.data(HEXABLOCK::GUI::HEXA_TREE_ROLE).toInt(); + // check selection compatibility between selection and widget + if ( selType == HEXABLOCK::GUI::VERTEX_TREE ){ + mainFrame()->_vertex_le->setText( selected.data().toString() );// name + mainFrame()->_vertex_le->setProperty("QModelIndex", QVariant::fromValue(selected) ); + selOk = true; + } else { + _patternDataSelectionModel->clearSelection(); + MESSAGE("* bad selection : " << selType << " is not " << HEXABLOCK::GUI::VERTEX_TREE ); + SUIT_MessageBox::information( 0, + tr("HEXA_INFO"), + tr("Bad selection type: please select a %1").arg( "VERTEX" ) ); + } + } + MESSAGE("}"); +} + + +void MyBasicGUI_PointDlg::onWindowActivated(SUIT_ViewManager* vm) +{ + MESSAGE( "getConstructorId()"<< getConstructorId() ); + SUIT_ViewWindow* v = vm->getActiveView(); + QString vmType = vm->getType(); + if ( (vmType == SVTK_Viewer::Type()) || (vmType == VTKViewer_Viewer::Type()) ){ + mainFrame()->_vertex_le->setFocus(); + } else if ( vmType == OCCViewer_Viewer::Type() ){ +// lines_lw->setFocus(); +// ConstructorsClicked(0); + MESSAGE( "getConstructorId()"<< getConstructorId() ); + ConstructorsClicked( getConstructorId() ); + } +} + + + +bool MyBasicGUI_PointDlg::eventFilter(QObject *obj, QEvent *event) +{ + + if ( (event->type() != QEvent::FocusIn) + or (obj != mainFrame()->_vertex_le) ){ + return MyGEOMBase_Skeleton::eventFilter(obj, event); + } + + MESSAGE("MyBasicGUI_PointDlg::eventFilter{"); + + QVariant vxVariant; + QModelIndex vxIndex; + + _currentObj = obj; +// HEXABLOCKGUI::currentVtkView->raise(); + _patternDataSelectionModel->setVertexSelection(); + + vxVariant = mainFrame()->_vertex_le->property("QModelIndex"); + if ( !vxVariant.isValid() ) { + return MyGEOMBase_Skeleton::eventFilter(obj, event); + } + vxIndex = vxVariant.value(); + _selectionMutex = true; + MESSAGE("* selecting the element : " << vxIndex.data().toString().toStdString()); + MESSAGE("* _patternDataSelectionModel : " << _patternDataSelectionModel ); + _patternDataSelectionModel->select( vxIndex, QItemSelectionModel::Clear ); + _patternDataSelectionModel->select( vxIndex, QItemSelectionModel::Select ); + _selectionMutex = false; + MESSAGE("}"); + return false; +} + + +void MyBasicGUI_PointDlg::hideEvent ( QHideEvent * event ) +{ + MESSAGE("MyBasicGUI_PointDlg::hideEvent(){"); + disconnect( _patternDataSelectionModel, SIGNAL( selectionChanged ( const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + disconnect( HEXABLOCKGUI::selectionMgr() , SIGNAL(currentSelectionChanged()), this, SLOT(onCurrentSelectionChanged()) ); + disconnect( _vtkVm, SIGNAL( activated(SUIT_ViewManager*) ), this, SLOT( onWindowActivated(SUIT_ViewManager*) ) ); + disconnect( _occVm, SIGNAL( activated(SUIT_ViewManager*) ), this, SLOT( onWindowActivated(SUIT_ViewManager*) ) ); + _documentModel->allowEdition(); + DeactivateActiveDialog(); + MyGEOMBase_Skeleton::hideEvent( event ); + MESSAGE("}"); +} + +void MyBasicGUI_PointDlg::showEvent( QShowEvent * event ) +{ + MESSAGE("MyBasicGUI_PointDlg::showEvent(){"); + _documentModel->disallowEdition(); + // _patternDataSelectionModel->clearSelection(); + connect( _patternDataSelectionModel, SIGNAL( selectionChanged ( const QItemSelection &, const QItemSelection &) ), + this, SLOT( onSelectionChanged(const QItemSelection &, const QItemSelection &) ) ); + connect( _mgr, SIGNAL(currentSelectionChanged()), this, SLOT(onCurrentSelectionChanged()) ); + connect( _vtkVm, SIGNAL( activated(SUIT_ViewManager*) ), this, SLOT( onWindowActivated(SUIT_ViewManager*) ) ); + connect( _occVm, SIGNAL( activated(SUIT_ViewManager*) ), this, SLOT( onWindowActivated(SUIT_ViewManager*) ) ); + + + SalomeApp_Application* app = (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ); + + MESSAGE( "XXXXXXXXXXX myGeomGUI => " << myGeomGUI ); + if ( !myGeomGUI && app ) + myGeomGUI = dynamic_cast( app->module( "Geometry" ) ); + + MESSAGE( "YYYYYYYYYYYYY myGeomGUI => " << myGeomGUI ); + + ActivateThisDialog(); + MyGEOMBase_Skeleton::showEvent ( event ); + MESSAGE("}"); +} + + + + +bool MyBasicGUI_PointDlg::onAccept( const bool publish, const bool useTransaction ) +{ + MESSAGE("MyBasicGUI_PointDlg::onAccept()"); + + GEOM::GEOM_Object_ptr newVertex; + QString newVertexEntry; + QString newVertexName; + QString newVertexBrep; + + + + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return false; + _PTR(Study) aStudy = appStudy->studyDS(); + + bool aLocked = (_PTR(AttributeStudyProperties) (aStudy->GetProperties()))->IsLocked(); + if ( aLocked ) { + MESSAGE("GEOMBase_Helper::onAccept - ActiveStudy is locked"); + SUIT_MessageBox::warning ( (QWidget*)SUIT_Session::session()->activeApplication()->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("WRN_STUDY_LOCKED"), + QObject::tr("BUT_OK") ); + return false; + } + + QString msg; + if ( !isValid( msg ) ) { + showError( msg ); + return false; + } + + erasePreview( false ); + + bool result = false; + + try { + if ( ( !publish && !useTransaction ) || openCommand() ) { + SUIT_OverrideCursor wc; + SUIT_Session::session()->activeApplication()->putInfo( "" ); + ObjectList objects; + if ( !execute( objects ) || !getOperation()->IsDone() ) { + wc.suspend(); + abortCommand(); + showError(); + } + else { + addSubshapesToStudy(); // add Subshapes if local selection + const int nbObjs = objects.size(); + QStringList anEntryList; + int aNumber = 1; + for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) { + GEOM::GEOM_Object_var obj=*it; + if ( publish ) { + QString aName = getNewObjectName(); + if ( nbObjs > 1 ) { + if (aName.isEmpty()) + aName = getPrefix(obj); + if (nbObjs <= 30) { + // Try to find a unique name + aName = GEOMBase::GetDefaultName(aName, extractPrefix()); + } else { + // Don't check name uniqueness in case of numerous objects + aName = aName + "_" + QString::number(aNumber++); + } + } else { + // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName() + if ( aName.isEmpty() ) + aName = GEOMBase::GetDefaultName( getPrefix( obj ) ); + } + anEntryList << addInStudy( obj, aName.toLatin1().constData() ); + + newVertex = obj; + newVertexEntry = anEntryList[0]; + TopoDS_Shape aShape; + GEOMBase::GetShape( newVertex, aShape ); + if ( !aShape.IsNull() ){ + MESSAGE("!aShape.IsNull()"); + newVertexName = GEOMBase::GetName( newVertex ); + MESSAGE("newVertexName "<< newVertexName.toStdString()); + newVertexBrep = HEXABLOCK::GUI::shape2string( aShape ).c_str(); + } + + // updateView=false + display( obj, false ); +#ifdef WITHGENERICOBJ + // obj has been published in study. Its refcount has been incremented. + // It is safe to decrement its refcount + // so that it will be destroyed when the entry in study will be removed + obj->UnRegister(); +#endif + } + else { + // asv : fix of PAL6454. If publish==false, then the original shape + // was modified, and need to be re-cached in GEOM_Client before redisplay +// clearShapeBuffer( obj ); + // withChildren=true, updateView=false + redisplay( obj, true, false ); + } + } + + if ( nbObjs ) { + commitCommand(); + updateObjBrowser(); + if( SUIT_Application* anApp = SUIT_Session::session()->activeApplication() ) { + if( LightApp_Application* aLightApp = dynamic_cast( anApp ) ){ + aLightApp->browseObjects( anEntryList, isApplyAndClose(), isOptimizedBrowsing() ); + } + anApp->putInfo( QObject::tr("GEOM_PRP_DONE") ); + } + result = true; + } + else + abortCommand(); + } + } + } + catch( const SALOME::SALOME_Exception& e ) { + SalomeApp_Tools::QtCatchCorbaException( e ); + abortCommand(); + } + + updateViewer(); + + if (result){ + SUIT_OverrideCursor wc; + if ( !_documentModel ) return false; + if ( !_patternDataSelectionModel ) return false; + const HEXABLOCK::GUI::PatternDataModel* patternDataModel = dynamic_cast( _patternDataSelectionModel->model() ); + if ( !patternDataModel ) return false; + _currentObj = NULL; + + QVariant v = mainFrame()->_vertex_le->property("QModelIndex"); + if ( !v.isValid() ) return false; + QModelIndex iVertex = patternDataModel->mapToSource( v.value() ); + + if ( iVertex.isValid() ){ + HEXABLOCK::GUI::DocumentModel::GeomObj aPoint; + aPoint.name = newVertexName; + aPoint.entry = newVertexEntry; + aPoint.brep = newVertexBrep; + MESSAGE(" aPoint.name" << aPoint.name.toStdString() ); + MESSAGE(" aPoint.entry" << aPoint.entry.toStdString() ); + MESSAGE(" aPoint.brep" << aPoint.brep.toStdString() ); + _documentModel->addAssociation( iVertex, aPoint ); + // to select/highlight result +// _patternDataSelectionModel->clearSelection(); +// mainFrame()->_vertex_le->setFocus(); + +// globalSelection(); +// localSelection(GEOM::GEOM_Object::_nil(), TopAbs_VERTEX); + _patternDataSelectionModel->select( patternDataModel->mapFromSource(iVertex), QItemSelectionModel::Clear ); + _patternDataSelectionModel->select( patternDataModel->mapFromSource(iVertex), QItemSelectionModel::Select ); + _currentObj = NULL; + result = true; + } else { + SUIT_MessageBox::critical( this, tr( "ERR_ERROR" ), tr( "CANNOT MAKE VERTEX ASSOCIATION" ) ); + return false; + } + } + + + return result; +} + diff --git a/src/HEXABLOCKGUI/MyBasicGUI_PointDlg.hxx b/src/HEXABLOCKGUI/MyBasicGUI_PointDlg.hxx new file mode 100755 index 0000000..ad5ac32 --- /dev/null +++ b/src/HEXABLOCKGUI/MyBasicGUI_PointDlg.hxx @@ -0,0 +1,182 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + + +#ifndef MYBASICGUI_POINTDLG_H +#define MYBASICGUI_POINTDLG_H + + + + +#include "MyGEOMBase_Skeleton.hxx" +#include "GEOM_GenericObjPtr.h" +#include + +class DlgRef_2Sel1Spin; +class DlgRef_3Spin; +class DlgRef_2Sel; +class DlgRef_1Sel3Spin; +class DlgRef_1Sel2Spin; + +class QLineEdit; +class QGroupBox; +class QButtonGroup; +class QMenu; +class QAction; + +class gp_Pnt; + +#include +#include +#include +#include +#include +// #include + + + +#include "SVTK_Selection.h" +#include +namespace HEXABLOCK +{ + namespace GUI + { + class DocumentModel; + class PatternDataSelectionModel; +// } +// } + + +//================================================================================= +// class : MyBasicGUI_PointDlg +// purpose : +//================================================================================= +typedef class MyBasicGUI_PointDlg : public MyGEOMBase_Skeleton +{ + Q_OBJECT + +public: + MyBasicGUI_PointDlg( GeometryGUI*, QWidget* = 0, bool = false, Qt::WindowFlags = 0 ); + ~MyBasicGUI_PointDlg(); + + bool acceptMouseEvent() const { return ( getConstructorId() == 0 ); } + void OnPointSelected( const gp_Pnt& ); // called by BasicGUI::OnMousePress() + +protected: + // redefined from GEOMBase_Helper + + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid( QString& ); + virtual bool execute( ObjectList& ); + virtual void addSubshapesToStudy(); + +private: + void Init(); + void enterEvent( QEvent* ); + double getParameter() const; + double getUParameter() const; + double getVParameter() const; + void updateParamCoord(bool theIsUpdate); + +private: + GEOM::GeomObjPtr myEdge; + GEOM::GeomObjPtr myFace; + GEOM::GeomObjPtr myRefPoint; + GEOM::GeomObjPtr myLine1; + GEOM::GeomObjPtr myLine2; + + bool myBusy; + + DlgRef_3Spin* GroupXYZ; + DlgRef_1Sel3Spin* GroupRefPoint; + DlgRef_2Sel1Spin* GroupOnCurve; + DlgRef_2Sel* GroupLineIntersection; + DlgRef_1Sel2Spin* GroupOnSurface; + + QGroupBox* myCoordGrp; + QLineEdit* myX; + QLineEdit* myY; + QLineEdit* myZ; + + + + QGroupBox* myParamGroup; + QButtonGroup* myParamCoord; + + QMenu* myBtnPopup; + QMap myActions; + + TopAbs_ShapeEnum myNeedType; + +private slots: + void ClickOnOk(); + bool ClickOnApply(); + void ActivateThisDialog(); + void DeactivateActiveDialog(); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); + void ConstructorsClicked( int ); + void ValueChangedInSpinBox( double ); + void SetDoubleSpinBoxStep( double ); + void ClickParamCoord( int ); + void CheckBoxClicked( int ); + void onBtnPopup( QAction* ); + void updateSize(); + + + + +// HEXABLOCK +public: + void setDocumentModel( HEXABLOCK::GUI::DocumentModel* m ); + void setPatternDataSelectionModel( HEXABLOCK::GUI::PatternDataSelectionModel* s ); + + bool onAccept( const bool publish = true, const bool useTransaction = true ); + + +protected: + virtual bool eventFilter( QObject *obj, QEvent *event ); + virtual void hideEvent ( QHideEvent * event ); + virtual void showEvent ( QShowEvent * event ); + void _initInputWidget(); + void _initViewManager(); + +protected slots: + void onSelectionChanged( const QItemSelection& sel, const QItemSelection& unsel ); + void onWindowActivated( SUIT_ViewManager* vm ); + + +private: + HEXABLOCK::GUI::DocumentModel* _documentModel; + HEXABLOCK::GUI::PatternDataSelectionModel* _patternDataSelectionModel; + LightApp_SelectionMgr* _mgr; + SUIT_ViewManager* _vtkVm; + SUIT_ViewManager* _occVm; +// QLineEdit* _vertex_le; + + QObject* _currentObj; + bool _selectionMutex; + + +} VertexAssocDialog; + + } +} + +#endif // MYBASICGUI_POINTDLG_H diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef.cxx b/src/HEXABLOCKGUI/MyDlgRef/DlgRef.cxx new file mode 100755 index 0000000..ef714ed --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef.cxx @@ -0,0 +1,853 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + + +#include "DlgRef.hxx" + +////////////////////////////////////////// +// DlgRef_1List1Spin1Btn +////////////////////////////////////////// + +DlgRef_1List1Spin1Btn::DlgRef_1List1Spin1Btn( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1List1Spin1Btn::~DlgRef_1List1Spin1Btn() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1Check1List +////////////////////////////////////////// + +DlgRef_1Sel1Check1List::DlgRef_1Sel1Check1List( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1Check1List::~DlgRef_1Sel1Check1List() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1Check1Sel +////////////////////////////////////////// + +DlgRef_1Sel1Check1Sel::DlgRef_1Sel1Check1Sel( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1Check1Sel::~DlgRef_1Sel1Check1Sel() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1Check +////////////////////////////////////////// + +DlgRef_1Sel1Check::DlgRef_1Sel1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1Check::~DlgRef_1Sel1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1List1Check3Btn +////////////////////////////////////////// + +DlgRef_1Sel1List1Check3Btn::DlgRef_1Sel1List1Check3Btn( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1List1Check3Btn::~DlgRef_1Sel1List1Check3Btn() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1Spin1Check +////////////////////////////////////////// + +DlgRef_1Sel1Spin1Check::DlgRef_1Sel1Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1Spin1Check::~DlgRef_1Sel1Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1Spin +////////////////////////////////////////// + +DlgRef_1Sel1Spin::DlgRef_1Sel1Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1Spin::~DlgRef_1Sel1Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel2Spin1View1Check +////////////////////////////////////////// + +DlgRef_1Sel2Spin1View1Check::DlgRef_1Sel2Spin1View1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel2Spin1View1Check::~DlgRef_1Sel2Spin1View1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel2Spin +////////////////////////////////////////// + +DlgRef_1Sel2Spin::DlgRef_1Sel2Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel2Spin::~DlgRef_1Sel2Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel3Check +////////////////////////////////////////// + +DlgRef_1Sel3Check::DlgRef_1Sel3Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel3Check::~DlgRef_1Sel3Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel3Spin +////////////////////////////////////////// + +DlgRef_1Sel3Spin::DlgRef_1Sel3Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel3Spin::~DlgRef_1Sel3Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel3Spin1Check +////////////////////////////////////////// + +DlgRef_1Sel3Spin1Check::DlgRef_1Sel3Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel3Spin1Check::~DlgRef_1Sel3Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel4Spin2Check +////////////////////////////////////////// + +DlgRef_1Sel4Spin2Check::DlgRef_1Sel4Spin2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel4Spin2Check::~DlgRef_1Sel4Spin2Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel4Spin +////////////////////////////////////////// + +DlgRef_1Sel4Spin::DlgRef_1Sel4Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel4Spin::~DlgRef_1Sel4Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel5Spin1Check +////////////////////////////////////////// + +DlgRef_1Sel5Spin1Check::DlgRef_1Sel5Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel5Spin1Check::~DlgRef_1Sel5Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel5Spin +////////////////////////////////////////// + +DlgRef_1Sel5Spin::DlgRef_1Sel5Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel5Spin::~DlgRef_1Sel5Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Spin +////////////////////////////////////////// + +DlgRef_1Spin::DlgRef_1Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Spin::~DlgRef_1Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel +////////////////////////////////////////// + +DlgRef_1Sel::DlgRef_1Sel( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel::~DlgRef_1Sel() +{ +} + +////////////////////////////////////////// +// DlgRef_1SelExt +////////////////////////////////////////// + +DlgRef_1SelExt::DlgRef_1SelExt( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1SelExt::~DlgRef_1SelExt() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1List1Check +////////////////////////////////////////// + +DlgRef_2Sel1List1Check::DlgRef_2Sel1List1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1List1Check::~DlgRef_2Sel1List1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1List2Check +////////////////////////////////////////// + +DlgRef_2Sel1List2Check::DlgRef_2Sel1List2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1List2Check::~DlgRef_2Sel1List2Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1List +////////////////////////////////////////// + +DlgRef_2Sel1List::DlgRef_2Sel1List( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1List::~DlgRef_2Sel1List() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1Spin2Check +////////////////////////////////////////// + +DlgRef_2Sel1Spin2Check::DlgRef_2Sel1Spin2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1Spin2Check::~DlgRef_2Sel1Spin2Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1Spin +////////////////////////////////////////// + +DlgRef_2Sel1Spin::DlgRef_2Sel1Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1Spin::~DlgRef_2Sel1Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1SpinInt +////////////////////////////////////////// + +DlgRef_2Sel1SpinInt::DlgRef_2Sel1SpinInt( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1SpinInt::~DlgRef_2Sel1SpinInt() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel2List +////////////////////////////////////////// + +DlgRef_2Sel2List::DlgRef_2Sel2List( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel2List::~DlgRef_2Sel2List() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel2Spin1Check +////////////////////////////////////////// + +DlgRef_2Sel2Spin1Check::DlgRef_2Sel2Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel2Spin1Check::~DlgRef_2Sel2Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel2Spin3Check +////////////////////////////////////////// + +DlgRef_2Sel2Spin3Check::DlgRef_2Sel2Spin3Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel2Spin3Check::~DlgRef_2Sel2Spin3Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel2Spin +////////////////////////////////////////// + +DlgRef_2Sel2Spin::DlgRef_2Sel2Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel2Spin::~DlgRef_2Sel2Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel3Spin2Rb +////////////////////////////////////////// + +DlgRef_2Sel3Spin2Rb::DlgRef_2Sel3Spin2Rb( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel3Spin2Rb::~DlgRef_2Sel3Spin2Rb() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel3Spin +////////////////////////////////////////// + +DlgRef_2Sel3Spin::DlgRef_2Sel3Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel3Spin::~DlgRef_2Sel3Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel4Spin1Check +////////////////////////////////////////// + +DlgRef_2Sel4Spin1Check::DlgRef_2Sel4Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel4Spin1Check::~DlgRef_2Sel4Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel +////////////////////////////////////////// + +DlgRef_2Sel::DlgRef_2Sel( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel::~DlgRef_2Sel() +{ +} + +////////////////////////////////////////// +// DlgRef_2SelExt +////////////////////////////////////////// + +DlgRef_2SelExt::DlgRef_2SelExt( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2SelExt::~DlgRef_2SelExt() +{ +} + +////////////////////////////////////////// +// DlgRef_2Spin +////////////////////////////////////////// + +DlgRef_2Spin::DlgRef_2Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Spin::~DlgRef_2Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_3Check +////////////////////////////////////////// + +DlgRef_3Check::DlgRef_3Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Check::~DlgRef_3Check() +{ +} + +////////////////////////////////////////// +// DlgRef_3Radio +////////////////////////////////////////// + +DlgRef_3Radio::DlgRef_3Radio( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Radio::~DlgRef_3Radio() +{ +} + +////////////////////////////////////////// +// DlgRef_3Radio1Sel1Spin +////////////////////////////////////////// + +DlgRef_3Radio1Sel1Spin::DlgRef_3Radio1Sel1Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Radio1Sel1Spin::~DlgRef_3Radio1Sel1Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_3Sel1Check +////////////////////////////////////////// + +DlgRef_3Sel1Check::DlgRef_3Sel1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel1Check::~DlgRef_3Sel1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_3Sel1Spin +////////////////////////////////////////// + +DlgRef_3Sel1Spin::DlgRef_3Sel1Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel1Spin::~DlgRef_3Sel1Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_3Sel2Spin +////////////////////////////////////////// + +DlgRef_3Sel2Spin::DlgRef_3Sel2Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel2Spin::~DlgRef_3Sel2Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_3Sel3Spin1Check +////////////////////////////////////////// + +DlgRef_3Sel3Spin1Check::DlgRef_3Sel3Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel3Spin1Check::~DlgRef_3Sel3Spin1Check() +{ +} + +void DlgRef_3Sel3Spin1Check::ShowRows( int fromRow, int toRow, bool toShow ) +{ + const int maxRows = 7; + + if ( toRow >= fromRow && fromRow >= 0 && toRow <= maxRows ) { + int c = gridLayout1->count(); + for ( int i = 0; i < c; i++ ) { + QWidget* w = gridLayout1->itemAt( i )->widget(); + int row, col, rowspan, colspan; + gridLayout1->getItemPosition( i, &row, &col, &rowspan, &colspan ); + if ( w && row >= fromRow && row <= toRow ) + w->setVisible( toShow ); + } + } +} + +////////////////////////////////////////// +// DlgRef_3Sel3Spin2Check +////////////////////////////////////////// + +DlgRef_3Sel3Spin2Check::DlgRef_3Sel3Spin2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel3Spin2Check::~DlgRef_3Sel3Spin2Check() +{ +} + +void DlgRef_3Sel3Spin2Check::ShowRows( int fromRow, int toRow, bool toShow ) +{ + const int maxRows = 8; + + if ( toRow >= fromRow && fromRow >= 0 && toRow <= maxRows ) { + int c = gridLayout1->count(); + for ( int i = 0; i < c; i++ ) { + QWidget* w = gridLayout1->itemAt( i )->widget(); + int row, col, rowspan, colspan; + gridLayout1->getItemPosition( i, &row, &col, &rowspan, &colspan ); + if ( w && row >= fromRow && row <= toRow ) + w->setVisible( toShow ); + } + } +} + +////////////////////////////////////////// +// DlgRef_3Sel4Spin2Check +////////////////////////////////////////// + +DlgRef_3Sel4Spin2Check::DlgRef_3Sel4Spin2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel4Spin2Check::~DlgRef_3Sel4Spin2Check() +{ +} + +////////////////////////////////////////// +// DlgRef_3Sel +////////////////////////////////////////// + +DlgRef_3Sel::DlgRef_3Sel( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel::~DlgRef_3Sel() +{ +} + +////////////////////////////////////////// +// DlgRef_3Spin1Check +////////////////////////////////////////// + +DlgRef_3Spin1Check::DlgRef_3Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Spin1Check::~DlgRef_3Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_3Spin +////////////////////////////////////////// + +DlgRef_3Spin::DlgRef_3Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Spin::~DlgRef_3Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_4Sel1List1Check +////////////////////////////////////////// + +DlgRef_4Sel1List1Check::DlgRef_4Sel1List1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_4Sel1List1Check::~DlgRef_4Sel1List1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_4Sel1List +////////////////////////////////////////// + +DlgRef_4Sel1List::DlgRef_4Sel1List( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_4Sel1List::~DlgRef_4Sel1List() +{ +} + +////////////////////////////////////////// +// DlgRef_4Sel1Spin2Check +////////////////////////////////////////// + +DlgRef_4Sel1Spin2Check::DlgRef_4Sel1Spin2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_4Sel1Spin2Check::~DlgRef_4Sel1Spin2Check() +{ +} + +void DlgRef_4Sel1Spin2Check::ShowRows( int fromRow, int toRow, bool toShow ) +{ + const int maxRows = 6; + + if ( toRow >= fromRow && fromRow >= 0 && toRow <= maxRows ) { + int c = gridLayout1->count(); + for ( int i = 0; i < c; i++ ) { + QWidget* w = gridLayout1->itemAt( i )->widget(); + int row, col, rowspan, colspan; + gridLayout1->getItemPosition( i, &row, &col, &rowspan, &colspan ); + if ( w && row >= fromRow && row <= toRow ) + w->setVisible( toShow ); + } + } +} + +////////////////////////////////////////// +// DlgRef_4Sel1Spin3Check +////////////////////////////////////////// + +DlgRef_4Sel1Spin3Check::DlgRef_4Sel1Spin3Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_4Sel1Spin3Check::~DlgRef_4Sel1Spin3Check() +{ +} + +////////////////////////////////////////// +// DlgRef_6Sel +////////////////////////////////////////// + +DlgRef_6Sel::DlgRef_6Sel( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_6Sel::~DlgRef_6Sel() +{ +} + +////////////////////////////////////////// +// DlgRef_Skeleton +////////////////////////////////////////// + +DlgRef_Skeleton::DlgRef_Skeleton( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_Skeleton::~DlgRef_Skeleton() +{ +} + +////////////////////////////////////////// +// Utility functions +////////////////////////////////////////// + +QString DlgRef::PrintDoubleValue( double theValue, int thePrecision ) +{ + const double prec = 1e-12; + + if ( qAbs(theValue) < prec ) + return "0"; + + QString aRes = QLocale().toString( theValue, thePrecision >= 0 ? 'f' : 'g', qAbs( thePrecision ) ); + + if ( prec > 0 ) { + int p = 0; + while ( p < thePrecision ) { + QString aRes = QLocale().toString( theValue, thePrecision >= 0 ? 'f' : 'g', qAbs( p++ ) ); + double v = aRes.toDouble(); + double err = qAbs( theValue - v ); + if ( err > 0 && err <= prec ) + break; + } + } + + // remove trailing zeroes + + QRegExp expre( QString( "(%1|%2)[+-]?[0-9]+$" ).arg( QLocale().exponential().toLower(), + QLocale().exponential().toUpper() ) ); + + int idx = aRes.indexOf( expre ); + QString aResExp = ""; + if ( idx >= 0 ) { + aResExp = aRes.mid( idx ); + aRes = aRes.left( idx ); + } + + if ( aRes.contains( QLocale().decimalPoint() ) ) + aRes.remove( QRegExp( QString( "(\\%1|0)0*$" ).arg( QLocale().decimalPoint() ) ) ); + + return aRes == "-0" ? QString( "0" ) : aRes + aResExp; +} diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef.hxx b/src/HEXABLOCKGUI/MyDlgRef/DlgRef.hxx new file mode 100644 index 0000000..cc94b7b --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef.hxx @@ -0,0 +1,899 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + + +#ifndef GEOM_DLGREF_HXX +#define GEOM_DLGREF_HXX + +#if defined WIN32 +# if defined DLGREF_EXPORTS || defined DlgRef_EXPORTS +# define DLGREF_EXPORT __declspec( dllexport ) +# else +# define DLGREF_EXPORT __declspec( dllimport ) +# endif +#else +# define DLGREF_EXPORT +#endif + +////////////////////////////////////////// +// DlgRef_1List1Spin1Btn +////////////////////////////////////////// + +#include "ui_DlgRef_1List1Spin1Btn_QTD.h" + +class DLGREF_EXPORT DlgRef_1List1Spin1Btn : public QWidget, + public Ui::DlgRef_1List1Spin1Btn_QTD +{ + Q_OBJECT + +public: + DlgRef_1List1Spin1Btn( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1List1Spin1Btn(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1Check1List +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1Check1List_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel1Check1List : public QWidget, + public Ui::DlgRef_1Sel1Check1List_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1Check1List( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1Check1List(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1Check1Sel +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1Check1Sel_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel1Check1Sel : public QWidget, + public Ui::DlgRef_1Sel1Check1Sel_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1Check1Sel( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1Check1Sel(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel1Check : public QWidget, + public Ui::DlgRef_1Sel1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1List1Check3Btn +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1List1Check3Btn_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel1List1Check3Btn : public QWidget, + public Ui::DlgRef_1Sel1List1Check3Btn_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1List1Check3Btn( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1List1Check3Btn(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1Spin1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel1Spin1Check : public QWidget, + public Ui::DlgRef_1Sel1Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel1Spin : public QWidget, + public Ui::DlgRef_1Sel1Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel2Spin1View1Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel2Spin1View1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel2Spin1View1Check : public QWidget, + public Ui::DlgRef_1Sel2Spin1View1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel2Spin1View1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel2Spin1View1Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel2Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel2Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel2Spin : public QWidget, + public Ui::DlgRef_1Sel2Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel2Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel2Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel3Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel3Check_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel3Check : public QWidget, + public Ui::DlgRef_1Sel3Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel3Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel3Check(); +}; + + + +////////////////////////////////////////// +// DlgRef_1Sel3Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel3Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel3Spin : public QWidget, + public Ui::DlgRef_1Sel3Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel3Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel3Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel3Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel3Spin1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel3Spin1Check : public QWidget, + public Ui::DlgRef_1Sel3Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel3Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel3Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel4Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel4Spin2Check_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel4Spin2Check : public QWidget, + public Ui::DlgRef_1Sel4Spin2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel4Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel4Spin2Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel4Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel4Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel4Spin : public QWidget, + public Ui::DlgRef_1Sel4Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel4Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel4Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel5Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel5Spin1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel5Spin1Check : public QWidget, + public Ui::DlgRef_1Sel5Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel5Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel5Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel5Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel5Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel5Spin : public QWidget, + public Ui::DlgRef_1Sel5Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel5Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel5Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_1Spin : public QWidget, + public Ui::DlgRef_1Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel_QTD.h" + +class DLGREF_EXPORT DlgRef_1Sel : public QWidget, + public Ui::DlgRef_1Sel_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel(); +}; + +////////////////////////////////////////// +// DlgRef_1SelExt +////////////////////////////////////////// + +#include "ui_DlgRef_1SelExt_QTD.h" + +class DLGREF_EXPORT DlgRef_1SelExt : public QWidget, + public Ui::DlgRef_1SelExt_QTD +{ + Q_OBJECT + +public: + DlgRef_1SelExt( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1SelExt(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1List1Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1List1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel1List1Check : public QWidget, + public Ui::DlgRef_2Sel1List1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1List1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1List1Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1List2Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1List2Check_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel1List2Check : public QWidget, + public Ui::DlgRef_2Sel1List2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1List2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1List2Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1List +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1List_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel1List : public QWidget, + public Ui::DlgRef_2Sel1List_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1List( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1List(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1Spin2Check_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel1Spin2Check : public QWidget, + public Ui::DlgRef_2Sel1Spin2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1Spin2Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1Spin +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel1Spin : public QWidget, + public Ui::DlgRef_2Sel1Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1Spin(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1SpinInt +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1SpinInt_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel1SpinInt : public QWidget, + public Ui::DlgRef_2Sel1SpinInt_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1SpinInt( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1SpinInt(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel2List +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel2List_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel2List : public QWidget, + public Ui::DlgRef_2Sel2List_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel2List( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel2List(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel2Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel2Spin1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel2Spin1Check : public QWidget, + public Ui::DlgRef_2Sel2Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel2Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel2Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel2Spin3Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel2Spin3Check_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel2Spin3Check : public QWidget, + public Ui::DlgRef_2Sel2Spin3Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel2Spin3Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel2Spin3Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel2Spin +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel2Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel2Spin : public QWidget, + public Ui::DlgRef_2Sel2Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel2Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel2Spin(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel3Spin2Rb +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel3Spin2Rb_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel3Spin2Rb : public QWidget, + public Ui::DlgRef_2Sel3Spin2Rb_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel3Spin2Rb( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel3Spin2Rb(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel3Spin +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel3Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel3Spin : public QWidget, + public Ui::DlgRef_2Sel3Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel3Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel3Spin(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel4Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel4Spin1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel4Spin1Check : public QWidget, + public Ui::DlgRef_2Sel4Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel4Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel4Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel_QTD.h" + +class DLGREF_EXPORT DlgRef_2Sel : public QWidget, + public Ui::DlgRef_2Sel_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel(); +}; + +////////////////////////////////////////// +// DlgRef_2SelExt +////////////////////////////////////////// + +#include "ui_DlgRef_2SelExt_QTD.h" + +class DLGREF_EXPORT DlgRef_2SelExt : public QWidget, + public Ui::DlgRef_2SelExt_QTD +{ + Q_OBJECT + +public: + DlgRef_2SelExt( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2SelExt(); +}; + +////////////////////////////////////////// +// DlgRef_2Spin +////////////////////////////////////////// + +#include "ui_DlgRef_2Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_2Spin : public QWidget, + public Ui::DlgRef_2Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_2Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Spin(); +}; + +////////////////////////////////////////// +// DlgRef_3Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Check_QTD.h" + +class DLGREF_EXPORT DlgRef_3Check : public QWidget, + public Ui::DlgRef_3Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel3Radio +////////////////////////////////////////// + +#include "ui_DlgRef_3Radio_QTD.h" + +class DLGREF_EXPORT DlgRef_3Radio : public QWidget, + public Ui::DlgRef_3Radio_QTD +{ + Q_OBJECT + +public: + DlgRef_3Radio( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Radio(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel3Radio1Sel1Spin +////////////////////////////////////////// + +#include "ui_DlgRef_3Radio1Sel1Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_3Radio1Sel1Spin : public QWidget, + public Ui::DlgRef_3Radio1Sel1Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_3Radio1Sel1Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Radio1Sel1Spin(); +}; + +////////////////////////////////////////// +// DlgRef_3Sel1Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_3Sel1Check : public QWidget, + public Ui::DlgRef_3Sel1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel1Check(); +}; + +////////////////////////////////////////// +// DlgRef_3Sel1Spin +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel1Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_3Sel1Spin : public QWidget, + public Ui::DlgRef_3Sel1Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel1Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel1Spin(); +}; + +////////////////////////////////////////// +// DlgRef_3Sel2Spin +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel2Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_3Sel2Spin : public QWidget, + public Ui::DlgRef_3Sel2Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel2Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel2Spin(); +}; + +////////////////////////////////////////// +// DlgRef_3Sel3Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel3Spin1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_3Sel3Spin1Check : public QWidget, + public Ui::DlgRef_3Sel3Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel3Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel3Spin1Check(); + + void ShowRows( int, int, bool = true ); +}; + +////////////////////////////////////////// +// DlgRef_3Sel3Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel3Spin2Check_QTD.h" + +class DLGREF_EXPORT DlgRef_3Sel3Spin2Check : public QWidget, + public Ui::DlgRef_3Sel3Spin2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel3Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel3Spin2Check(); + + void ShowRows( int, int, bool = true ); +}; + +////////////////////////////////////////// +// DlgRef_3Sel4Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel4Spin2Check_QTD.h" + +class DLGREF_EXPORT DlgRef_3Sel4Spin2Check : public QWidget, + public Ui::DlgRef_3Sel4Spin2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel4Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel4Spin2Check(); +}; + +////////////////////////////////////////// +// DlgRef_3Sel +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel_QTD.h" + +class DLGREF_EXPORT DlgRef_3Sel : public QWidget, + public Ui::DlgRef_3Sel_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel(); +}; + +////////////////////////////////////////// +// DlgRef_3Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Spin1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_3Spin1Check : public QWidget, + public Ui::DlgRef_3Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_3Spin +////////////////////////////////////////// + +#include "ui_DlgRef_3Spin_QTD.h" + +class DLGREF_EXPORT DlgRef_3Spin : public QWidget, + public Ui::DlgRef_3Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_3Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Spin(); +}; + +////////////////////////////////////////// +// DlgRef_4Sel1List1Check +////////////////////////////////////////// + +#include "ui_DlgRef_4Sel1List1Check_QTD.h" + +class DLGREF_EXPORT DlgRef_4Sel1List1Check : public QWidget, + public Ui::DlgRef_4Sel1List1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_4Sel1List1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_4Sel1List1Check(); +}; + +////////////////////////////////////////// +// DlgRef_4Sel1List +////////////////////////////////////////// + +#include "ui_DlgRef_4Sel1List_QTD.h" + +class DLGREF_EXPORT DlgRef_4Sel1List : public QWidget, + public Ui::DlgRef_4Sel1List_QTD +{ + Q_OBJECT + +public: + DlgRef_4Sel1List( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_4Sel1List(); +}; + +////////////////////////////////////////// +// DlgRef_4Sel1Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_4Sel1Spin2Check_QTD.h" + +class DLGREF_EXPORT DlgRef_4Sel1Spin2Check : public QWidget, + public Ui::DlgRef_4Sel1Spin2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_4Sel1Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_4Sel1Spin2Check(); + + void ShowRows( int, int, bool = true ); +}; + +////////////////////////////////////////// +// DlgRef_4Sel1Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_4Sel1Spin3Check_QTD.h" + +class DLGREF_EXPORT DlgRef_4Sel1Spin3Check : public QWidget, + public Ui::DlgRef_4Sel1Spin3Check_QTD +{ + Q_OBJECT + +public: + DlgRef_4Sel1Spin3Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_4Sel1Spin3Check(); +}; + +////////////////////////////////////////// +// DlgRef_6Sel +////////////////////////////////////////// + +#include "ui_DlgRef_6Sel_QTD.h" + +class DLGREF_EXPORT DlgRef_6Sel : public QWidget, + public Ui::DlgRef_6Sel_QTD +{ + Q_OBJECT + +public: + DlgRef_6Sel( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_6Sel(); +}; + +////////////////////////////////////////// +// DlgRef_Skeleton +////////////////////////////////////////// + +#include "ui_DlgRef_Skeleton_QTD.h" + +class DLGREF_EXPORT DlgRef_Skeleton : public QWidget, + public Ui::DlgRef_Skeleton_QTD +{ + Q_OBJECT + +public: + DlgRef_Skeleton( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_Skeleton(); +}; + +////////////////////////////////////////// +// Utility functions +////////////////////////////////////////// + +namespace DlgRef +{ + DLGREF_EXPORT QString PrintDoubleValue( double, int = 16 ); +}; + +#endif // GEOM_DLGREF_H diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1List1Spin1Btn_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1List1Spin1Btn_QTD.ui new file mode 100755 index 0000000..4982dca --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1List1Spin1Btn_QTD.ui @@ -0,0 +1,98 @@ + + + DlgRef_1List1Spin1Btn_QTD + + + + 0 + 0 + 213 + 116 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + 1 + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 16 + 120 + + + + + + + + + + + + + + + 1000000 + + + + + + + TL1 + + + false + + + + + + + + + + qPixmapFromMimeSource + + ListView1 + SpinBox1 + PushButton1 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check1List_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check1List_QTD.ui new file mode 100755 index 0000000..a1d5853 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check1List_QTD.ui @@ -0,0 +1,122 @@ + + DlgRef_1Sel1Check1List_QTD + + + + 0 + 0 + 156 + 94 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + false + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + ComboBox1 + CheckButton1 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check1Sel_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check1Sel_QTD.ui new file mode 100755 index 0000000..a8b9443 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check1Sel_QTD.ui @@ -0,0 +1,148 @@ + + DlgRef_1Sel1Check1Sel_QTD + + + + 0 + 0 + 156 + 99 + + + + + 5 + 5 + 0 + 0 + + + + + + + + 0 + + + 0 + + + + + + 5 + 5 + 0 + 0 + + + + + + + + 9 + + + 6 + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + false + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + CheckButton1 + PushButton2 + LineEdit2 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check_QTD.ui new file mode 100755 index 0000000..ca24f20 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Check_QTD.ui @@ -0,0 +1,91 @@ + + DlgRef_1Sel1Check_QTD + + + + 0 + 0 + 155 + 64 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + CheckButton1 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1List1Check3Btn_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1List1Check3Btn_QTD.ui new file mode 100755 index 0000000..562f2ce --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1List1Check3Btn_QTD.ui @@ -0,0 +1,154 @@ + + DlgRef_1Sel1List1Check3Btn_QTD + + + + 0 + 0 + 156 + 180 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 6 + + + 6 + + + + + + 0 + 0 + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + false + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + CheckButton1 + ListView1 + PushButton2 + PushButton3 + PushButton4 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Spin1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Spin1Check_QTD.ui new file mode 100755 index 0000000..57ae745 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Spin1Check_QTD.ui @@ -0,0 +1,128 @@ + + + DlgRef_1Sel1Spin1Check_QTD + + + + 0 + 0 + 207 + 93 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + 6 + + + 0.000000000000000 + + + 1000000000.000000000000000 + + + 0.000000000000000 + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +

      SalomeApp_DoubleSpinBox.h
      + + + + PushButton1 + LineEdit1 + SpinBox_DX + CheckButton1 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Spin_QTD.ui new file mode 100755 index 0000000..2cebc84 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel1Spin_QTD.ui @@ -0,0 +1,114 @@ + + + DlgRef_1Sel1Spin_QTD + + + + 0 + 0 + 156 + 74 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + SpinBox_DX + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel2Spin1View1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel2Spin1View1Check_QTD.ui new file mode 100755 index 0000000..1a71d85 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel2Spin1View1Check_QTD.ui @@ -0,0 +1,147 @@ + + + DlgRef_1Sel2Spin1View1Check_QTD + + + + 0 + 0 + 176 + 227 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + + + 1000000 + + + + + + + 1000000 + + + + + + + Check + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_IntSpinBox + QSpinBox +
      SalomeApp_IntSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + SpinBox1 + SpinBox2 + TextBrowser1 + CheckBox1 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel2Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel2Spin_QTD.ui new file mode 100755 index 0000000..b390119 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel2Spin_QTD.ui @@ -0,0 +1,141 @@ + + + DlgRef_1Sel2Spin_QTD + + + + 0 + 0 + 156 + 101 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + SpinBox_DX + SpinBox_DY + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Check_QTD.ui new file mode 100755 index 0000000..bcc2e30 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Check_QTD.ui @@ -0,0 +1,107 @@ + + DlgRef_1Sel3Check_QTD + + + + 0 + 0 + 155 + 114 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + CheckButton1 + CheckButton2 + CheckButton3 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Spin1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Spin1Check_QTD.ui new file mode 100755 index 0000000..fa397a4 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Spin1Check_QTD.ui @@ -0,0 +1,175 @@ + + + DlgRef_1Sel3Spin1Check_QTD + + + + 0 + 0 + 156 + 147 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + SpinBox_DX + SpinBox_DY + SpinBox_DZ + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Spin_QTD.ui new file mode 100755 index 0000000..cc07af0 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel3Spin_QTD.ui @@ -0,0 +1,168 @@ + + + DlgRef_1Sel3Spin_QTD + + + + 0 + 0 + 156 + 128 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + SpinBox_DX + SpinBox_DY + SpinBox_DZ + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel4Spin2Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel4Spin2Check_QTD.ui new file mode 100755 index 0000000..e387687 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel4Spin2Check_QTD.ui @@ -0,0 +1,211 @@ + + + DlgRef_1Sel4Spin2Check_QTD + + + + 0 + 0 + 156 + 193 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + SpinBox_DX + SpinBox_DY + SpinBox_DZ + SpinBox_SC + CheckBox1 + CheckBox2 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel4Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel4Spin_QTD.ui new file mode 100755 index 0000000..cc6e51b --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel4Spin_QTD.ui @@ -0,0 +1,210 @@ + + + DlgRef_1Sel4Spin_QTD + + + + 0 + 0 + 323 + 123 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + TL6 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + 6 + + + 9 + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + SpinBox_DX + SpinBox_DY + SpinBox_DZ + SpinBox_S + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel5Spin1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel5Spin1Check_QTD.ui new file mode 100755 index 0000000..3fe2c7c --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel5Spin1Check_QTD.ui @@ -0,0 +1,243 @@ + + + DlgRef_1Sel5Spin1Check_QTD + + + + 0 + 0 + 204 + 163 + + + + + + + + 0 + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + 0 + 0 + + + + TL7 + + + false + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + + 0 + 0 + + + + TL6 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + + + + + + + 1000000 + + + + + + + 1000000 + + + + + + + 1000000 + + + + + + + + + + + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      + + SalomeApp_IntSpinBox + QSpinBox +
      SalomeApp_IntSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + ComboBox1 + SpinBox1 + SpinBox2 + SpinBox4 + SpinBox5 + SpinBox3 + CheckBox1 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel5Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel5Spin_QTD.ui new file mode 100755 index 0000000..8d19cdf --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel5Spin_QTD.ui @@ -0,0 +1,232 @@ + + + DlgRef_1Sel5Spin_QTD + + + + 0 + 0 + 208 + 130 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL6 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + SpinBox1 + SpinBox2 + SpinBox4 + SpinBox5 + SpinBox3 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1SelExt_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1SelExt_QTD.ui new file mode 100755 index 0000000..6b285a1 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1SelExt_QTD.ui @@ -0,0 +1,94 @@ + + DlgRef_1SelExt_QTD + + + + 0 + 0 + 155 + 51 + + + + + + + + 0 + + + 0 + + + + + + 7 + 7 + 0 + 0 + + + + + + + + 9 + + + 6 + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel_QTD.ui new file mode 100755 index 0000000..ffcb8aa --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Sel_QTD.ui @@ -0,0 +1,91 @@ + + DlgRef_1Sel_QTD + + + + 0 + 0 + 155 + 45 + + + + + + + + 0 + + + 0 + + + + + + 7 + 7 + 0 + 0 + + + + + + + + 9 + + + 6 + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Spin_QTD.ui new file mode 100755 index 0000000..cbf89a1 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_1Spin_QTD.ui @@ -0,0 +1,77 @@ + + + DlgRef_1Spin_QTD + + + + 0 + 0 + 111 + 43 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List1Check_QTD.ui new file mode 100755 index 0000000..4633930 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List1Check_QTD.ui @@ -0,0 +1,153 @@ + + DlgRef_2Sel1List1Check_QTD + + + + 0 + 0 + 211 + 121 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + ComboBox1 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List2Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List2Check_QTD.ui new file mode 100755 index 0000000..8cc018c --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List2Check_QTD.ui @@ -0,0 +1,151 @@ + + + DlgRef_2Sel1List2Check_QTD + + + + 0 + 0 + 127 + 140 + + + + + + + + 0 + + + 0 + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + ComboBox1 + CheckButton1 + CheckButton2 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List_QTD.ui new file mode 100755 index 0000000..53ba9da --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1List_QTD.ui @@ -0,0 +1,152 @@ + + DlgRef_2Sel1List_QTD + + + + 0 + 0 + 156 + 100 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + false + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + ComboBox1 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1Spin2Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1Spin2Check_QTD.ui new file mode 100755 index 0000000..e35fec1 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1Spin2Check_QTD.ui @@ -0,0 +1,176 @@ + + + DlgRef_2Sel1Spin2Check_QTD + + + + 0 + 0 + 170 + 124 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + SpinBox_DX + CheckButton2 + CheckButton1 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1SpinInt_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1SpinInt_QTD.ui new file mode 100755 index 0000000..c14fb7a --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1SpinInt_QTD.ui @@ -0,0 +1,150 @@ + + + DlgRef_2Sel1SpinInt_QTD + + + + 0 + 0 + 156 + 105 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + 1000000 + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_IntSpinBox + QSpinBox +
      SalomeApp_IntSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1Spin_QTD.ui new file mode 100755 index 0000000..3835c2e --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel1Spin_QTD.ui @@ -0,0 +1,153 @@ + + + DlgRef_2Sel1Spin_QTD + + + + 0 + 0 + 156 + 105 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2List_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2List_QTD.ui new file mode 100755 index 0000000..b54bca5 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2List_QTD.ui @@ -0,0 +1,166 @@ + + DlgRef_2Sel2List_QTD + + + + 0 + 0 + 128 + 144 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + ComboBox1 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin1Check_QTD.ui new file mode 100755 index 0000000..4107b05 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin1Check_QTD.ui @@ -0,0 +1,185 @@ + + + DlgRef_2Sel2Spin1Check_QTD + + + + 0 + 0 + 156 + 151 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + + + + + + + 1000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      + + SalomeApp_IntSpinBox + QSpinBox +
      SalomeApp_IntSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + SpinBox_DX + SpinBox_DY + CheckButton1 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin3Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin3Check_QTD.ui new file mode 100755 index 0000000..28fb859 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin3Check_QTD.ui @@ -0,0 +1,199 @@ + + + DlgRef_2Sel2Spin3Check_QTD + + + + 0 + 0 + 156 + 197 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + SpinBox_DX + SpinBox_DY + CheckBox1 + CheckBox2 + CheckBox3 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin_QTD.ui new file mode 100755 index 0000000..56bbbfd --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel2Spin_QTD.ui @@ -0,0 +1,175 @@ + + + DlgRef_2Sel2Spin_QTD + + + + 0 + 0 + 156 + 132 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + SpinBox_DX + SpinBox_DY + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel3Spin2Rb_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel3Spin2Rb_QTD.ui new file mode 100755 index 0000000..19df9b9 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel3Spin2Rb_QTD.ui @@ -0,0 +1,219 @@ + + + DlgRef_2Sel3Spin2Rb_QTD + + + + 0 + 0 + 256 + 135 + + + + DlgRef_2Sel3Spin2Rb_QTD + + + + 0 + + + 0 + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + true + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + false + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + false + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + RadioButton1 + SpinBox_DX + RadioButton2 + SpinBox_DY + SpinBox_DZ + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel3Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel3Spin_QTD.ui new file mode 100755 index 0000000..111c095 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel3Spin_QTD.ui @@ -0,0 +1,202 @@ + + + DlgRef_2Sel3Spin_QTD + + + + 0 + 0 + 156 + 159 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + SpinBox_DX + SpinBox_DY + SpinBox_DZ + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel4Spin1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel4Spin1Check_QTD.ui new file mode 100755 index 0000000..fb294c2 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel4Spin1Check_QTD.ui @@ -0,0 +1,236 @@ + + + DlgRef_2Sel4Spin1Check_QTD + + + + 0 + 0 + 156 + 205 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + + + + + + + 1000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 1000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL6 + + + false + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      + + SalomeApp_IntSpinBox + QSpinBox +
      SalomeApp_IntSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + SpinBox_DX1 + SpinBox_DY1 + CheckButton1 + SpinBox_DX2 + SpinBox_DY2 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2SelExt_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2SelExt_QTD.ui new file mode 100755 index 0000000..a5ab1a4 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2SelExt_QTD.ui @@ -0,0 +1,132 @@ + + DlgRef_2SelExt_QTD + + + + 0 + 0 + 155 + 80 + + + + + + + + 0 + + + 6 + + + + + + 7 + 7 + 0 + 0 + + + + + + + + 9 + + + 6 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel_QTD.ui new file mode 100755 index 0000000..753d958 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Sel_QTD.ui @@ -0,0 +1,129 @@ + + DlgRef_2Sel_QTD + + + + 0 + 0 + 156 + 74 + + + + + 5 + 7 + 0 + 0 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + false + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Spin_QTD.ui new file mode 100755 index 0000000..74e340d --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_2Spin_QTD.ui @@ -0,0 +1,103 @@ + + + DlgRef_2Spin_QTD + + + + 0 + 0 + 114 + 70 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Check_QTD.ui new file mode 100755 index 0000000..aa9a707 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Check_QTD.ui @@ -0,0 +1,69 @@ + + DlgRef_3Check_QTD + + + + 0 + 0 + 118 + 88 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + RadioButton2 + + + + + + + RadioButton1 + + + + + + + RadioButton3 + + + + + + + + + + qPixmapFromMimeSource + + RadioButton1 + RadioButton2 + RadioButton3 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Radio1Sel1Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Radio1Sel1Spin_QTD.ui new file mode 100755 index 0000000..e17614e --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Radio1Sel1Spin_QTD.ui @@ -0,0 +1,156 @@ + + + DlgRef_3Radio1Sel1Spin_QTD + + + + 0 + 0 + 357 + 131 + + + + + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 357 + 131 + + + + + + + + + + + + RadioButton1 + + + + + + + RadioButton2 + + + + + + + RadioButton3 + + + + + + + + + Qt::Vertical + + + + 256 + 19 + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + SpinBox_DX + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Radio_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Radio_QTD.ui new file mode 100755 index 0000000..e55899e --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Radio_QTD.ui @@ -0,0 +1,75 @@ + + DlgRef_3Radio_QTD + + + + 0 + 0 + 335 + 44 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 6 + + + 6 + + + + + + + + + + + RadioButton1 + + + + + + + RadioButton2 + + + + + + + RadioButton3 + + + + + + + + + + qPixmapFromMimeSource + + RadioButton1 + RadioButton2 + RadioButton3 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel1Check_QTD.ui new file mode 100755 index 0000000..91d9258 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel1Check_QTD.ui @@ -0,0 +1,182 @@ + + DlgRef_3Sel1Check_QTD + + + + 0 + 0 + 156 + 126 + + + + + 5 + 5 + 0 + 0 + + + + + + + + 0 + + + 0 + + + + + + 5 + 5 + 0 + 0 + + + + + + + + 9 + + + 6 + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + false + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton3 + LineEdit3 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel1Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel1Spin_QTD.ui new file mode 100755 index 0000000..067340a --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel1Spin_QTD.ui @@ -0,0 +1,194 @@ + + + DlgRef_3Sel1Spin_QTD + + + + 0 + 0 + 156 + 136 + + + + + 0 + 0 + + + + + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton3 + LineEdit3 + SpinBox_DX + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel2Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel2Spin_QTD.ui new file mode 100755 index 0000000..199727b --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel2Spin_QTD.ui @@ -0,0 +1,214 @@ + + + DlgRef_3Sel2Spin_QTD + + + + 0 + 0 + 120 + 177 + + + + + 0 + 0 + + + + + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton3 + LineEdit3 + SpinBox_DX + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel3Spin1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel3Spin1Check_QTD.ui new file mode 100755 index 0000000..d31515e --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel3Spin1Check_QTD.ui @@ -0,0 +1,256 @@ + + + DlgRef_3Sel3Spin1Check_QTD + + + + 0 + 0 + 156 + 216 + + + + + 0 + 0 + + + + + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + + + + 9 + + + 6 + + + + + Check + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + + 0 + 0 + + + + TL6 + + + false + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton3 + LineEdit3 + SpinBox1 + SpinBox2 + SpinBox3 + CheckBox1 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel3Spin2Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel3Spin2Check_QTD.ui new file mode 100755 index 0000000..103fdec --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel3Spin2Check_QTD.ui @@ -0,0 +1,243 @@ + + + DlgRef_3Sel3Spin2Check_QTD + + + + 0 + 0 + 120 + 242 + + + + + + + + 0 + + + + + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL6 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton3 + LineEdit3 + SpinBox1 + SpinBox2 + SpinBox3 + CheckBox1 + CheckBox2 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel4Spin2Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel4Spin2Check_QTD.ui new file mode 100755 index 0000000..80035d4 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel4Spin2Check_QTD.ui @@ -0,0 +1,278 @@ + + + DlgRef_3Sel4Spin2Check_QTD + + + + 0 + 0 + 156 + 255 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + 1000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 1000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + + + + + 0 + 0 + + + + TL6 + + + false + + + + + + + + 0 + 0 + + + + TL7 + + + false + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      + + SalomeApp_IntSpinBox + QSpinBox +
      SalomeApp_IntSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton3 + LineEdit3 + SpinBox_DX1 + SpinBox_DY1 + CheckButton1 + SpinBox_DX2 + SpinBox_DY2 + CheckButton2 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel_QTD.ui new file mode 100755 index 0000000..b16200b --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Sel_QTD.ui @@ -0,0 +1,167 @@ + + DlgRef_3Sel_QTD + + + + 0 + 0 + 156 + 103 + + + + + 5 + 7 + 0 + 0 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton3 + LineEdit3 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Spin1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Spin1Check_QTD.ui new file mode 100755 index 0000000..0fa2adb --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Spin1Check_QTD.ui @@ -0,0 +1,142 @@ + + + DlgRef_3Spin1Check_QTD + + + + 0 + 0 + 114 + 116 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + SpinBox_DX + SpinBox_DY + SpinBox_DZ + CheckButton1 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Spin_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Spin_QTD.ui new file mode 100755 index 0000000..3aafa4a --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_3Spin_QTD.ui @@ -0,0 +1,134 @@ + + + DlgRef_3Spin_QTD + + + + 0 + 0 + 114 + 97 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + SpinBox_DX + SpinBox_DY + SpinBox_DZ + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1List1Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1List1Check_QTD.ui new file mode 100755 index 0000000..516d9a2 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1List1Check_QTD.ui @@ -0,0 +1,244 @@ + + DlgRef_4Sel1List1Check_QTD + + + + 0 + 0 + 216 + 187 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL4 + + + false + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL5 + + + false + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + ComboBox1 + PushButton3 + LineEdit3 + PushButton4 + LineEdit4 + CheckBox1 + PushButton5 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1List_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1List_QTD.ui new file mode 100755 index 0000000..5388836 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1List_QTD.ui @@ -0,0 +1,228 @@ + + DlgRef_4Sel1List_QTD + + + + 0 + 0 + 156 + 158 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL4 + + + false + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL5 + + + false + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL3 + + + false + + + + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + ComboBox1 + PushButton3 + LineEdit3 + PushButton4 + LineEdit4 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1Spin2Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1Spin2Check_QTD.ui new file mode 100755 index 0000000..fa1361c --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1Spin2Check_QTD.ui @@ -0,0 +1,243 @@ + + + DlgRef_4Sel1Spin2Check_QTD + + + + 0 + 0 + 225 + 306 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton4 + LineEdit4 + PushButton5 + LineEdit5 + SpinBox_DX + CheckButton1 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1Spin3Check_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1Spin3Check_QTD.ui new file mode 100755 index 0000000..1828502 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_4Sel1Spin3Check_QTD.ui @@ -0,0 +1,273 @@ + + + DlgRef_4Sel1Spin3Check_QTD + + + + 0 + 0 + 225 + 306 + + + + + + + + 0 + + + 6 + + + + + + + + + 9 + + + 6 + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + + + + TL5 + + + false + + + + + + + + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + + + + TL2 + + + false + + + + + + + + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + CheckButton3 + SpinBox_DX + TextLabel3 + TextLabel5 + TextLabel4 + TextLabel2 + TextLabel1 + PushButton2 + LineEdit5 + LineEdit1 + PushButton5 + PushButton4 + PushButton1 + LineEdit4 + LineEdit2 + CheckButton1 + CheckButton2 + + + + + + qPixmapFromMimeSource + + + SalomeApp_DoubleSpinBox + QDoubleSpinBox +
      SalomeApp_DoubleSpinBox.h
      +
      +
      + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton4 + LineEdit4 + PushButton5 + LineEdit5 + SpinBox_DX + CheckButton1 + + + +
      diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_6Sel_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_6Sel_QTD.ui new file mode 100755 index 0000000..22ce904 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_6Sel_QTD.ui @@ -0,0 +1,281 @@ + + DlgRef_6Sel_QTD + + + + 0 + 0 + 156 + 190 + + + + + 5 + 7 + 0 + 0 + + + + + + + + 0 + + + 0 + + + + + + + + + 9 + + + 6 + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + + + + + + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL6 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL3 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL5 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL4 + + + false + + + + + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + false + + + + + + + + + + qPixmapFromMimeSource + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton3 + LineEdit3 + PushButton4 + LineEdit4 + PushButton5 + LineEdit5 + PushButton6 + LineEdit6 + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/DlgRef_Skeleton_QTD.ui b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_Skeleton_QTD.ui new file mode 100755 index 0000000..406a6b6 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/DlgRef_Skeleton_QTD.ui @@ -0,0 +1,311 @@ + + + MyDlgRef_Skeleton_QTD + + + + 0 + 0 + 297 + 396 + + + + + 0 + 0 + + + + + + + + + + Qt::ScrollBarAsNeeded + + + true + + + + + 0 + 0 + 275 + 322 + + + + + + + Vertex of the model + + + + + + Name + + + + + + + + 0 + 0 + + + + + + + + + + + Point of the geometry + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + 6 + + + 9 + + + + + + + + false + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 10 + + + + + + + + + + + + + + + + 0 + 0 + + + + + 5 + 0 + + + + + + + + 6 + + + 9 + + + + + + 0 + 0 + + + + &Apply + + + + + + + + 0 + 0 + + + + &Close + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + &Help + + + + + + + + + + CheckBoxRestoreSS + CheckBoxAddPrefix + CheckBoxPreview + RadioButton1 + RadioButton2 + RadioButton3 + RadioButton4 + RadioButton5 + ResultName + + + + diff --git a/src/HEXABLOCKGUI/MyDlgRef/Makefile.am b/src/HEXABLOCKGUI/MyDlgRef/Makefile.am new file mode 100755 index 0000000..46e96a4 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/Makefile.am @@ -0,0 +1,113 @@ +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# GEOM DLGREF : +# File : Makefile.am +# Author : Alexander BORODIN, Open CASCADE S.A.S. (alexander.borodin@opencascade.com) +# Package : MyDlgRef + +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +# Libraries targets +lib_LTLIBRARIES = libMyDlgRef.la + +# Sources files +dist_libMyDlgRef_la_SOURCES = \ + MyDlgRef.hxx \ + MyDlgRef.cxx + +MOC_FILES = \ + MyDlgRef_moc.cxx + +UIC_FILES = \ + ui_DlgRef_1List1Spin1Btn_QTD.h \ + ui_DlgRef_1Sel1Check1List_QTD.h \ + ui_DlgRef_1Sel1Check1Sel_QTD.h \ + ui_DlgRef_1Sel1Check_QTD.h \ + ui_DlgRef_1Sel1List1Check3Btn_QTD.h \ + ui_DlgRef_1Sel1Spin1Check_QTD.h \ + ui_DlgRef_1Sel1Spin_QTD.h \ + ui_DlgRef_1Sel2Spin1View1Check_QTD.h \ + ui_DlgRef_1Sel2Spin_QTD.h \ + ui_DlgRef_1Sel3Check_QTD.h \ + ui_DlgRef_1Sel3Spin_QTD.h \ + ui_DlgRef_1Sel3Spin1Check_QTD.h \ + ui_DlgRef_1Sel4Spin2Check_QTD.h \ + ui_DlgRef_1Sel4Spin_QTD.h \ + ui_DlgRef_1Sel5Spin1Check_QTD.h \ + ui_DlgRef_1Sel5Spin_QTD.h \ + ui_DlgRef_1Sel_QTD.h \ + ui_DlgRef_1SelExt_QTD.h \ + ui_DlgRef_1Spin_QTD.h \ + ui_DlgRef_2Sel1List1Check_QTD.h \ + ui_DlgRef_2Sel1List2Check_QTD.h \ + ui_DlgRef_2Sel1List_QTD.h \ + ui_DlgRef_2Sel1Spin2Check_QTD.h \ + ui_DlgRef_2Sel1Spin_QTD.h \ + ui_DlgRef_2Sel1SpinInt_QTD.h \ + ui_DlgRef_2Sel2List_QTD.h \ + ui_DlgRef_2Sel2Spin1Check_QTD.h \ + ui_DlgRef_2Sel2Spin3Check_QTD.h \ + ui_DlgRef_2Sel2Spin_QTD.h \ + ui_DlgRef_2Sel3Spin2Rb_QTD.h \ + ui_DlgRef_2Sel3Spin_QTD.h \ + ui_DlgRef_2Sel4Spin1Check_QTD.h \ + ui_DlgRef_2Sel_QTD.h \ + ui_DlgRef_2SelExt_QTD.h \ + ui_DlgRef_2Spin_QTD.h \ + ui_DlgRef_3Check_QTD.h \ + ui_DlgRef_3Radio_QTD.h \ + ui_DlgRef_3Radio1Sel1Spin_QTD.h \ + ui_DlgRef_3Sel1Check_QTD.h \ + ui_DlgRef_3Sel1Spin_QTD.h \ + ui_DlgRef_3Sel2Spin_QTD.h \ + ui_DlgRef_3Sel3Spin1Check_QTD.h \ + ui_DlgRef_3Sel3Spin2Check_QTD.h \ + ui_DlgRef_3Sel4Spin2Check_QTD.h \ + ui_DlgRef_3Sel_QTD.h \ + ui_DlgRef_3Spin1Check_QTD.h \ + ui_DlgRef_3Spin_QTD.h \ + ui_DlgRef_4Sel1List1Check_QTD.h \ + ui_DlgRef_4Sel1List_QTD.h \ + ui_DlgRef_4Sel1Spin2Check_QTD.h \ + ui_DlgRef_4Sel1Spin3Check_QTD.h \ + ui_DlgRef_6Sel_QTD.h \ + ui_DlgRef_Skeleton_QTD.h + +ADVANCED_UIC_FILES = +##@@ insert new functions before this line @@ do not remove this line @@## + +UIC_FILES += $(ADVANCED_UIC_FILES) + +BUILT_SOURCES = $(UIC_FILES) + +nodist_libMyDlgRef_la_SOURCES = \ + $(MOC_FILES) \ + $(UIC_FILES) + +# additional information to compile and link file + +libMyDlgRef_la_CPPFLAGS = \ + $(QT_INCLUDES) \ + $(GUI_CXXFLAGS) + +libMyDlgRef_la_LDFLAGS = \ + $(STDLIB) \ + $(QT_MT_LIBS) \ + $(GUI_LDFLAGS) -lqtx -lSalomeApp diff --git a/src/HEXABLOCKGUI/MyDlgRef/MyDlgRef.cxx b/src/HEXABLOCKGUI/MyDlgRef/MyDlgRef.cxx new file mode 100755 index 0000000..3ca7ac3 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/MyDlgRef.cxx @@ -0,0 +1,853 @@ +// Copyright (C) 2009-2011 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + + +#include "MyDlgRef.hxx" + +////////////////////////////////////////// +// DlgRef_1List1Spin1Btn +////////////////////////////////////////// + +DlgRef_1List1Spin1Btn::DlgRef_1List1Spin1Btn( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1List1Spin1Btn::~DlgRef_1List1Spin1Btn() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1Check1List +////////////////////////////////////////// + +DlgRef_1Sel1Check1List::DlgRef_1Sel1Check1List( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1Check1List::~DlgRef_1Sel1Check1List() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1Check1Sel +////////////////////////////////////////// + +DlgRef_1Sel1Check1Sel::DlgRef_1Sel1Check1Sel( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1Check1Sel::~DlgRef_1Sel1Check1Sel() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1Check +////////////////////////////////////////// + +DlgRef_1Sel1Check::DlgRef_1Sel1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1Check::~DlgRef_1Sel1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1List1Check3Btn +////////////////////////////////////////// + +DlgRef_1Sel1List1Check3Btn::DlgRef_1Sel1List1Check3Btn( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1List1Check3Btn::~DlgRef_1Sel1List1Check3Btn() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1Spin1Check +////////////////////////////////////////// + +DlgRef_1Sel1Spin1Check::DlgRef_1Sel1Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1Spin1Check::~DlgRef_1Sel1Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel1Spin +////////////////////////////////////////// + +DlgRef_1Sel1Spin::DlgRef_1Sel1Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel1Spin::~DlgRef_1Sel1Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel2Spin1View1Check +////////////////////////////////////////// + +DlgRef_1Sel2Spin1View1Check::DlgRef_1Sel2Spin1View1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel2Spin1View1Check::~DlgRef_1Sel2Spin1View1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel2Spin +////////////////////////////////////////// + +DlgRef_1Sel2Spin::DlgRef_1Sel2Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel2Spin::~DlgRef_1Sel2Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel3Check +////////////////////////////////////////// + +DlgRef_1Sel3Check::DlgRef_1Sel3Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel3Check::~DlgRef_1Sel3Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel3Spin +////////////////////////////////////////// + +DlgRef_1Sel3Spin::DlgRef_1Sel3Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel3Spin::~DlgRef_1Sel3Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel3Spin1Check +////////////////////////////////////////// + +DlgRef_1Sel3Spin1Check::DlgRef_1Sel3Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel3Spin1Check::~DlgRef_1Sel3Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel4Spin2Check +////////////////////////////////////////// + +DlgRef_1Sel4Spin2Check::DlgRef_1Sel4Spin2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel4Spin2Check::~DlgRef_1Sel4Spin2Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel4Spin +////////////////////////////////////////// + +DlgRef_1Sel4Spin::DlgRef_1Sel4Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel4Spin::~DlgRef_1Sel4Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel5Spin1Check +////////////////////////////////////////// + +DlgRef_1Sel5Spin1Check::DlgRef_1Sel5Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel5Spin1Check::~DlgRef_1Sel5Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel5Spin +////////////////////////////////////////// + +DlgRef_1Sel5Spin::DlgRef_1Sel5Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel5Spin::~DlgRef_1Sel5Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Spin +////////////////////////////////////////// + +DlgRef_1Spin::DlgRef_1Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Spin::~DlgRef_1Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_1Sel +////////////////////////////////////////// + +DlgRef_1Sel::DlgRef_1Sel( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1Sel::~DlgRef_1Sel() +{ +} + +////////////////////////////////////////// +// DlgRef_1SelExt +////////////////////////////////////////// + +DlgRef_1SelExt::DlgRef_1SelExt( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_1SelExt::~DlgRef_1SelExt() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1List1Check +////////////////////////////////////////// + +DlgRef_2Sel1List1Check::DlgRef_2Sel1List1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1List1Check::~DlgRef_2Sel1List1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1List2Check +////////////////////////////////////////// + +DlgRef_2Sel1List2Check::DlgRef_2Sel1List2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1List2Check::~DlgRef_2Sel1List2Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1List +////////////////////////////////////////// + +DlgRef_2Sel1List::DlgRef_2Sel1List( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1List::~DlgRef_2Sel1List() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1Spin2Check +////////////////////////////////////////// + +DlgRef_2Sel1Spin2Check::DlgRef_2Sel1Spin2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1Spin2Check::~DlgRef_2Sel1Spin2Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1Spin +////////////////////////////////////////// + +DlgRef_2Sel1Spin::DlgRef_2Sel1Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1Spin::~DlgRef_2Sel1Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel1SpinInt +////////////////////////////////////////// + +DlgRef_2Sel1SpinInt::DlgRef_2Sel1SpinInt( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel1SpinInt::~DlgRef_2Sel1SpinInt() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel2List +////////////////////////////////////////// + +DlgRef_2Sel2List::DlgRef_2Sel2List( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel2List::~DlgRef_2Sel2List() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel2Spin1Check +////////////////////////////////////////// + +DlgRef_2Sel2Spin1Check::DlgRef_2Sel2Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel2Spin1Check::~DlgRef_2Sel2Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel2Spin3Check +////////////////////////////////////////// + +DlgRef_2Sel2Spin3Check::DlgRef_2Sel2Spin3Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel2Spin3Check::~DlgRef_2Sel2Spin3Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel2Spin +////////////////////////////////////////// + +DlgRef_2Sel2Spin::DlgRef_2Sel2Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel2Spin::~DlgRef_2Sel2Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel3Spin2Rb +////////////////////////////////////////// + +DlgRef_2Sel3Spin2Rb::DlgRef_2Sel3Spin2Rb( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel3Spin2Rb::~DlgRef_2Sel3Spin2Rb() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel3Spin +////////////////////////////////////////// + +DlgRef_2Sel3Spin::DlgRef_2Sel3Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel3Spin::~DlgRef_2Sel3Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel4Spin1Check +////////////////////////////////////////// + +DlgRef_2Sel4Spin1Check::DlgRef_2Sel4Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel4Spin1Check::~DlgRef_2Sel4Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_2Sel +////////////////////////////////////////// + +DlgRef_2Sel::DlgRef_2Sel( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Sel::~DlgRef_2Sel() +{ +} + +////////////////////////////////////////// +// DlgRef_2SelExt +////////////////////////////////////////// + +DlgRef_2SelExt::DlgRef_2SelExt( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2SelExt::~DlgRef_2SelExt() +{ +} + +////////////////////////////////////////// +// DlgRef_2Spin +////////////////////////////////////////// + +DlgRef_2Spin::DlgRef_2Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_2Spin::~DlgRef_2Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_3Check +////////////////////////////////////////// + +DlgRef_3Check::DlgRef_3Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Check::~DlgRef_3Check() +{ +} + +////////////////////////////////////////// +// DlgRef_3Radio +////////////////////////////////////////// + +DlgRef_3Radio::DlgRef_3Radio( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Radio::~DlgRef_3Radio() +{ +} + +////////////////////////////////////////// +// DlgRef_3Radio1Sel1Spin +////////////////////////////////////////// + +DlgRef_3Radio1Sel1Spin::DlgRef_3Radio1Sel1Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Radio1Sel1Spin::~DlgRef_3Radio1Sel1Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_3Sel1Check +////////////////////////////////////////// + +DlgRef_3Sel1Check::DlgRef_3Sel1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel1Check::~DlgRef_3Sel1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_3Sel1Spin +////////////////////////////////////////// + +DlgRef_3Sel1Spin::DlgRef_3Sel1Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel1Spin::~DlgRef_3Sel1Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_3Sel2Spin +////////////////////////////////////////// + +DlgRef_3Sel2Spin::DlgRef_3Sel2Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel2Spin::~DlgRef_3Sel2Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_3Sel3Spin1Check +////////////////////////////////////////// + +DlgRef_3Sel3Spin1Check::DlgRef_3Sel3Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel3Spin1Check::~DlgRef_3Sel3Spin1Check() +{ +} + +void DlgRef_3Sel3Spin1Check::ShowRows( int fromRow, int toRow, bool toShow ) +{ + const int maxRows = 7; + + if ( toRow >= fromRow && fromRow >= 0 && toRow <= maxRows ) { + int c = gridLayout1->count(); + for ( int i = 0; i < c; i++ ) { + QWidget* w = gridLayout1->itemAt( i )->widget(); + int row, col, rowspan, colspan; + gridLayout1->getItemPosition( i, &row, &col, &rowspan, &colspan ); + if ( w && row >= fromRow && row <= toRow ) + w->setVisible( toShow ); + } + } +} + +////////////////////////////////////////// +// DlgRef_3Sel3Spin2Check +////////////////////////////////////////// + +DlgRef_3Sel3Spin2Check::DlgRef_3Sel3Spin2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel3Spin2Check::~DlgRef_3Sel3Spin2Check() +{ +} + +void DlgRef_3Sel3Spin2Check::ShowRows( int fromRow, int toRow, bool toShow ) +{ + const int maxRows = 8; + + if ( toRow >= fromRow && fromRow >= 0 && toRow <= maxRows ) { + int c = gridLayout1->count(); + for ( int i = 0; i < c; i++ ) { + QWidget* w = gridLayout1->itemAt( i )->widget(); + int row, col, rowspan, colspan; + gridLayout1->getItemPosition( i, &row, &col, &rowspan, &colspan ); + if ( w && row >= fromRow && row <= toRow ) + w->setVisible( toShow ); + } + } +} + +////////////////////////////////////////// +// DlgRef_3Sel4Spin2Check +////////////////////////////////////////// + +DlgRef_3Sel4Spin2Check::DlgRef_3Sel4Spin2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel4Spin2Check::~DlgRef_3Sel4Spin2Check() +{ +} + +////////////////////////////////////////// +// DlgRef_3Sel +////////////////////////////////////////// + +DlgRef_3Sel::DlgRef_3Sel( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Sel::~DlgRef_3Sel() +{ +} + +////////////////////////////////////////// +// DlgRef_3Spin1Check +////////////////////////////////////////// + +DlgRef_3Spin1Check::DlgRef_3Spin1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Spin1Check::~DlgRef_3Spin1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_3Spin +////////////////////////////////////////// + +DlgRef_3Spin::DlgRef_3Spin( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_3Spin::~DlgRef_3Spin() +{ +} + +////////////////////////////////////////// +// DlgRef_4Sel1List1Check +////////////////////////////////////////// + +DlgRef_4Sel1List1Check::DlgRef_4Sel1List1Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_4Sel1List1Check::~DlgRef_4Sel1List1Check() +{ +} + +////////////////////////////////////////// +// DlgRef_4Sel1List +////////////////////////////////////////// + +DlgRef_4Sel1List::DlgRef_4Sel1List( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_4Sel1List::~DlgRef_4Sel1List() +{ +} + +////////////////////////////////////////// +// DlgRef_4Sel1Spin2Check +////////////////////////////////////////// + +DlgRef_4Sel1Spin2Check::DlgRef_4Sel1Spin2Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_4Sel1Spin2Check::~DlgRef_4Sel1Spin2Check() +{ +} + +void DlgRef_4Sel1Spin2Check::ShowRows( int fromRow, int toRow, bool toShow ) +{ + const int maxRows = 6; + + if ( toRow >= fromRow && fromRow >= 0 && toRow <= maxRows ) { + int c = gridLayout1->count(); + for ( int i = 0; i < c; i++ ) { + QWidget* w = gridLayout1->itemAt( i )->widget(); + int row, col, rowspan, colspan; + gridLayout1->getItemPosition( i, &row, &col, &rowspan, &colspan ); + if ( w && row >= fromRow && row <= toRow ) + w->setVisible( toShow ); + } + } +} + +////////////////////////////////////////// +// DlgRef_4Sel1Spin3Check +////////////////////////////////////////// + +DlgRef_4Sel1Spin3Check::DlgRef_4Sel1Spin3Check( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_4Sel1Spin3Check::~DlgRef_4Sel1Spin3Check() +{ +} + +////////////////////////////////////////// +// DlgRef_6Sel +////////////////////////////////////////// + +DlgRef_6Sel::DlgRef_6Sel( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +DlgRef_6Sel::~DlgRef_6Sel() +{ +} + +////////////////////////////////////////// +// DlgRef_Skeleton +////////////////////////////////////////// + +MyDlgRef_Skeleton::MyDlgRef_Skeleton( QWidget* parent, Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +MyDlgRef_Skeleton::~MyDlgRef_Skeleton() +{ +} + +////////////////////////////////////////// +// Utility functions +////////////////////////////////////////// + +QString DlgRef::PrintDoubleValue( double theValue, int thePrecision ) +{ + const double prec = 1e-12; + + if ( qAbs(theValue) < prec ) + return "0"; + + QString aRes = QLocale().toString( theValue, thePrecision >= 0 ? 'f' : 'g', qAbs( thePrecision ) ); + + if ( prec > 0 ) { + int p = 0; + while ( p < thePrecision ) { + QString aRes = QLocale().toString( theValue, thePrecision >= 0 ? 'f' : 'g', qAbs( p++ ) ); + double v = aRes.toDouble(); + double err = qAbs( theValue - v ); + if ( err > 0 && err <= prec ) + break; + } + } + + // remove trailing zeroes + + QRegExp expre( QString( "(%1|%2)[+-]?[0-9]+$" ).arg( QLocale().exponential().toLower(), + QLocale().exponential().toUpper() ) ); + + int idx = aRes.indexOf( expre ); + QString aResExp = ""; + if ( idx >= 0 ) { + aResExp = aRes.mid( idx ); + aRes = aRes.left( idx ); + } + + if ( aRes.contains( QLocale().decimalPoint() ) ) + aRes.remove( QRegExp( QString( "(\\%1|0)0*$" ).arg( QLocale().decimalPoint() ) ) ); + + return aRes == "-0" ? QString( "0" ) : aRes + aResExp; +} diff --git a/src/HEXABLOCKGUI/MyDlgRef/MyDlgRef.hxx b/src/HEXABLOCKGUI/MyDlgRef/MyDlgRef.hxx new file mode 100644 index 0000000..e80fd32 --- /dev/null +++ b/src/HEXABLOCKGUI/MyDlgRef/MyDlgRef.hxx @@ -0,0 +1,899 @@ +// Copyright (C) 2009-2011 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + + +#ifndef MYGEOM_MYDLGREF_HXX +#define MYGEOM_MYDLGREF_HXX + +#if defined WIN32 +# if defined MYMYDLGREF_EXPORTS || defined DlgRef_EXPORTS +# define MYDLGREF_EXPORT __declspec( dllexport ) +# else +# define MYDLGREF_EXPORT __declspec( dllimport ) +# endif +#else +# define MYDLGREF_EXPORT +#endif + +////////////////////////////////////////// +// DlgRef_1List1Spin1Btn +////////////////////////////////////////// + +#include "ui_DlgRef_1List1Spin1Btn_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1List1Spin1Btn : public QWidget, + public Ui::DlgRef_1List1Spin1Btn_QTD +{ + Q_OBJECT + +public: + DlgRef_1List1Spin1Btn( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1List1Spin1Btn(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1Check1List +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1Check1List_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel1Check1List : public QWidget, + public Ui::DlgRef_1Sel1Check1List_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1Check1List( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1Check1List(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1Check1Sel +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1Check1Sel_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel1Check1Sel : public QWidget, + public Ui::DlgRef_1Sel1Check1Sel_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1Check1Sel( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1Check1Sel(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel1Check : public QWidget, + public Ui::DlgRef_1Sel1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1List1Check3Btn +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1List1Check3Btn_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel1List1Check3Btn : public QWidget, + public Ui::DlgRef_1Sel1List1Check3Btn_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1List1Check3Btn( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1List1Check3Btn(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1Spin1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel1Spin1Check : public QWidget, + public Ui::DlgRef_1Sel1Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel1Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel1Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel1Spin : public QWidget, + public Ui::DlgRef_1Sel1Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel1Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel1Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel2Spin1View1Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel2Spin1View1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel2Spin1View1Check : public QWidget, + public Ui::DlgRef_1Sel2Spin1View1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel2Spin1View1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel2Spin1View1Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel2Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel2Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel2Spin : public QWidget, + public Ui::DlgRef_1Sel2Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel2Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel2Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel3Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel3Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel3Check : public QWidget, + public Ui::DlgRef_1Sel3Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel3Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel3Check(); +}; + + + +////////////////////////////////////////// +// DlgRef_1Sel3Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel3Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel3Spin : public QWidget, + public Ui::DlgRef_1Sel3Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel3Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel3Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel3Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel3Spin1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel3Spin1Check : public QWidget, + public Ui::DlgRef_1Sel3Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel3Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel3Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel4Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel4Spin2Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel4Spin2Check : public QWidget, + public Ui::DlgRef_1Sel4Spin2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel4Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel4Spin2Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel4Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel4Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel4Spin : public QWidget, + public Ui::DlgRef_1Sel4Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel4Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel4Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel5Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel5Spin1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel5Spin1Check : public QWidget, + public Ui::DlgRef_1Sel5Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel5Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel5Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel5Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel5Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel5Spin : public QWidget, + public Ui::DlgRef_1Sel5Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel5Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel5Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Spin +////////////////////////////////////////// + +#include "ui_DlgRef_1Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Spin : public QWidget, + public Ui::DlgRef_1Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_1Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Spin(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel +////////////////////////////////////////// + +#include "ui_DlgRef_1Sel_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1Sel : public QWidget, + public Ui::DlgRef_1Sel_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1Sel(); +}; + +////////////////////////////////////////// +// DlgRef_1SelExt +////////////////////////////////////////// + +#include "ui_DlgRef_1SelExt_QTD.h" + +class MYDLGREF_EXPORT DlgRef_1SelExt : public QWidget, + public Ui::DlgRef_1SelExt_QTD +{ + Q_OBJECT + +public: + DlgRef_1SelExt( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_1SelExt(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1List1Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1List1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel1List1Check : public QWidget, + public Ui::DlgRef_2Sel1List1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1List1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1List1Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1List2Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1List2Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel1List2Check : public QWidget, + public Ui::DlgRef_2Sel1List2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1List2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1List2Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1List +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1List_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel1List : public QWidget, + public Ui::DlgRef_2Sel1List_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1List( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1List(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1Spin2Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel1Spin2Check : public QWidget, + public Ui::DlgRef_2Sel1Spin2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1Spin2Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1Spin +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel1Spin : public QWidget, + public Ui::DlgRef_2Sel1Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1Spin(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel1SpinInt +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel1SpinInt_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel1SpinInt : public QWidget, + public Ui::DlgRef_2Sel1SpinInt_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel1SpinInt( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel1SpinInt(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel2List +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel2List_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel2List : public QWidget, + public Ui::DlgRef_2Sel2List_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel2List( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel2List(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel2Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel2Spin1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel2Spin1Check : public QWidget, + public Ui::DlgRef_2Sel2Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel2Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel2Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel2Spin3Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel2Spin3Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel2Spin3Check : public QWidget, + public Ui::DlgRef_2Sel2Spin3Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel2Spin3Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel2Spin3Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel2Spin +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel2Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel2Spin : public QWidget, + public Ui::DlgRef_2Sel2Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel2Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel2Spin(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel3Spin2Rb +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel3Spin2Rb_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel3Spin2Rb : public QWidget, + public Ui::DlgRef_2Sel3Spin2Rb_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel3Spin2Rb( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel3Spin2Rb(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel3Spin +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel3Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel3Spin : public QWidget, + public Ui::DlgRef_2Sel3Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel3Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel3Spin(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel4Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel4Spin1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel4Spin1Check : public QWidget, + public Ui::DlgRef_2Sel4Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel4Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel4Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_2Sel +////////////////////////////////////////// + +#include "ui_DlgRef_2Sel_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Sel : public QWidget, + public Ui::DlgRef_2Sel_QTD +{ + Q_OBJECT + +public: + DlgRef_2Sel( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Sel(); +}; + +////////////////////////////////////////// +// DlgRef_2SelExt +////////////////////////////////////////// + +#include "ui_DlgRef_2SelExt_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2SelExt : public QWidget, + public Ui::DlgRef_2SelExt_QTD +{ + Q_OBJECT + +public: + DlgRef_2SelExt( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2SelExt(); +}; + +////////////////////////////////////////// +// DlgRef_2Spin +////////////////////////////////////////// + +#include "ui_DlgRef_2Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_2Spin : public QWidget, + public Ui::DlgRef_2Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_2Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_2Spin(); +}; + +////////////////////////////////////////// +// DlgRef_3Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Check : public QWidget, + public Ui::DlgRef_3Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Check(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel3Radio +////////////////////////////////////////// + +#include "ui_DlgRef_3Radio_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Radio : public QWidget, + public Ui::DlgRef_3Radio_QTD +{ + Q_OBJECT + +public: + DlgRef_3Radio( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Radio(); +}; + +////////////////////////////////////////// +// DlgRef_1Sel3Radio1Sel1Spin +////////////////////////////////////////// + +#include "ui_DlgRef_3Radio1Sel1Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Radio1Sel1Spin : public QWidget, + public Ui::DlgRef_3Radio1Sel1Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_3Radio1Sel1Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Radio1Sel1Spin(); +}; + +////////////////////////////////////////// +// DlgRef_3Sel1Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Sel1Check : public QWidget, + public Ui::DlgRef_3Sel1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel1Check(); +}; + +////////////////////////////////////////// +// DlgRef_3Sel1Spin +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel1Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Sel1Spin : public QWidget, + public Ui::DlgRef_3Sel1Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel1Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel1Spin(); +}; + +////////////////////////////////////////// +// DlgRef_3Sel2Spin +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel2Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Sel2Spin : public QWidget, + public Ui::DlgRef_3Sel2Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel2Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel2Spin(); +}; + +////////////////////////////////////////// +// DlgRef_3Sel3Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel3Spin1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Sel3Spin1Check : public QWidget, + public Ui::DlgRef_3Sel3Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel3Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel3Spin1Check(); + + void ShowRows( int, int, bool = true ); +}; + +////////////////////////////////////////// +// DlgRef_3Sel3Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel3Spin2Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Sel3Spin2Check : public QWidget, + public Ui::DlgRef_3Sel3Spin2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel3Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel3Spin2Check(); + + void ShowRows( int, int, bool = true ); +}; + +////////////////////////////////////////// +// DlgRef_3Sel4Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel4Spin2Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Sel4Spin2Check : public QWidget, + public Ui::DlgRef_3Sel4Spin2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel4Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel4Spin2Check(); +}; + +////////////////////////////////////////// +// DlgRef_3Sel +////////////////////////////////////////// + +#include "ui_DlgRef_3Sel_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Sel : public QWidget, + public Ui::DlgRef_3Sel_QTD +{ + Q_OBJECT + +public: + DlgRef_3Sel( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Sel(); +}; + +////////////////////////////////////////// +// DlgRef_3Spin1Check +////////////////////////////////////////// + +#include "ui_DlgRef_3Spin1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Spin1Check : public QWidget, + public Ui::DlgRef_3Spin1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_3Spin1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Spin1Check(); +}; + +////////////////////////////////////////// +// DlgRef_3Spin +////////////////////////////////////////// + +#include "ui_DlgRef_3Spin_QTD.h" + +class MYDLGREF_EXPORT DlgRef_3Spin : public QWidget, + public Ui::DlgRef_3Spin_QTD +{ + Q_OBJECT + +public: + DlgRef_3Spin( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_3Spin(); +}; + +////////////////////////////////////////// +// DlgRef_4Sel1List1Check +////////////////////////////////////////// + +#include "ui_DlgRef_4Sel1List1Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_4Sel1List1Check : public QWidget, + public Ui::DlgRef_4Sel1List1Check_QTD +{ + Q_OBJECT + +public: + DlgRef_4Sel1List1Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_4Sel1List1Check(); +}; + +////////////////////////////////////////// +// DlgRef_4Sel1List +////////////////////////////////////////// + +#include "ui_DlgRef_4Sel1List_QTD.h" + +class MYDLGREF_EXPORT DlgRef_4Sel1List : public QWidget, + public Ui::DlgRef_4Sel1List_QTD +{ + Q_OBJECT + +public: + DlgRef_4Sel1List( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_4Sel1List(); +}; + +////////////////////////////////////////// +// DlgRef_4Sel1Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_4Sel1Spin2Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_4Sel1Spin2Check : public QWidget, + public Ui::DlgRef_4Sel1Spin2Check_QTD +{ + Q_OBJECT + +public: + DlgRef_4Sel1Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_4Sel1Spin2Check(); + + void ShowRows( int, int, bool = true ); +}; + +////////////////////////////////////////// +// DlgRef_4Sel1Spin2Check +////////////////////////////////////////// + +#include "ui_DlgRef_4Sel1Spin3Check_QTD.h" + +class MYDLGREF_EXPORT DlgRef_4Sel1Spin3Check : public QWidget, + public Ui::DlgRef_4Sel1Spin3Check_QTD +{ + Q_OBJECT + +public: + DlgRef_4Sel1Spin3Check( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_4Sel1Spin3Check(); +}; + +////////////////////////////////////////// +// DlgRef_6Sel +////////////////////////////////////////// + +#include "ui_DlgRef_6Sel_QTD.h" + +class MYDLGREF_EXPORT DlgRef_6Sel : public QWidget, + public Ui::DlgRef_6Sel_QTD +{ + Q_OBJECT + +public: + DlgRef_6Sel( QWidget* = 0, Qt::WindowFlags = 0 ); + ~DlgRef_6Sel(); +}; + +////////////////////////////////////////// +// DlgRef_Skeleton +////////////////////////////////////////// + +#include "ui_DlgRef_Skeleton_QTD.h" + +class MYDLGREF_EXPORT MyDlgRef_Skeleton : public QWidget, + public Ui::MyDlgRef_Skeleton_QTD +{ + Q_OBJECT + +public: + MyDlgRef_Skeleton( QWidget* = 0, Qt::WindowFlags = 0 ); + ~MyDlgRef_Skeleton(); +}; + +////////////////////////////////////////// +// Utility functions +////////////////////////////////////////// + +namespace DlgRef +{ + MYDLGREF_EXPORT QString PrintDoubleValue( double, int = 16 ); +}; + +#endif // GEOM_MYDLGREF_H diff --git a/src/HEXABLOCKGUI/MyGEOMBase_Helper.cxx b/src/HEXABLOCKGUI/MyGEOMBase_Helper.cxx new file mode 100644 index 0000000..d8228fb --- /dev/null +++ b/src/HEXABLOCKGUI/MyGEOMBase_Helper.cxx @@ -0,0 +1,1343 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MyGEOMBase_Helper.hxx" +#include "GEOMBase.h" +#include "GEOM_Operation.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include + +//To disable automatic genericobj management, the following line should be commented. +//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx +#define WITHGENERICOBJ + +//================================================================ +// Function : getActiveView +// Purpose : Get active view window, returns 0 if no open study frame +//================================================================ +static SUIT_ViewWindow* getActiveView() +{ + SUIT_Study* activeStudy = SUIT_Session::session()->activeApplication()->activeStudy(); + if ( activeStudy ) + return SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); + + return 0; +} + + +//================================================================ +// Function : getGeomEngine +// Purpose : Static method +//================================================================ +GEOM::GEOM_Gen_ptr MyGEOMBase_Helper::getGeomEngine() +{ + return GeometryGUI::GetGeomGen(); +} + +//================================================================ +// Function : MyGEOMBase_Helper +// Purpose : +//================================================================ +MyGEOMBase_Helper::MyGEOMBase_Helper( SUIT_Desktop* desktop ) + : myDesktop( desktop ), myViewWindow( 0 ), myDisplayer( 0 ), myCommand( 0 ), isPreview( false ), + myIsApplyAndClose( false ), myIsOptimizedBrowsing( false ) +{ +} + +//================================================================ +// Function : ~MyGEOMBase_Helper +// Purpose : +//================================================================ +MyGEOMBase_Helper::~MyGEOMBase_Helper() +{ + MESSAGE("DESSSSSSSSSSTTTRRRRUUUCCCCCCCCCCCTTTTOOOOORRRRR"); + //rnv: Fix for the "IPAL21922 : WinTC5.1.4: incorrect quit salome" + if ( !SUIT_Session::session()->activeApplication() || !SUIT_Session::session()->activeApplication()->desktop() ) + return; + + if ( myPreview.size() ) + erasePreview(); + if ( hasCommand() ) + abortCommand(); +// SalomeApp_Application* app = (SalomeApp_Application*)(SUIT_Session::session()->activeApplication()); +// if (app) { +// GeometryGUI* aGeomGUI = dynamic_cast( app->module( "Geometry" ) ); +// if(aGeomGUI) +// globalSelection(aGeomGUI->getLocalSelectionMode() , true ); +// } + + if (myDisplayer) + delete myDisplayer; + if ( !CORBA::is_nil( myOperation ) ) + myOperation->UnRegister(); +} + +//================================================================ +// Function : display +// Purpose : +//================================================================ +void MyGEOMBase_Helper::display( const ObjectList& objList, const bool updateView ) +{ + ObjectList::const_iterator it; + for ( it = objList.begin(); it != objList.end(); it++ ) { + display( *it, false ); + } + if ( !objList.empty() && updateView ) + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : display +// Purpose : Display object. +// Important : Object must be already in study +//================================================================ +void MyGEOMBase_Helper::display( GEOM::GEOM_Object_ptr object, const bool updateView ) +{ + // Unset color of shape ( this color may be set during preview displaying ) + // Default color will be used + getDisplayer()->UnsetColor(); + getDisplayer()->UnsetWidth(); + + // Enable activisation of selection + getDisplayer()->SetToActivate( true ); + + // Display object + getDisplayer()->Display( object, updateView ); +} + +//================================================================ +// Function : erase +// Purpose : +//================================================================ +void MyGEOMBase_Helper::erase( const ObjectList& objList, const bool updateView ) +{ + ObjectList::const_iterator it = objList.begin(); + for ( ; it != objList.end(); it++ ) { + erase( *it, false ); + } + if ( !objList.empty() && updateView ) + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : erase +// Purpose : +//================================================================ +void MyGEOMBase_Helper::erase( GEOM::GEOM_Object_ptr object, const bool updateView ) +{ + if ( !object->_is_nil() ) { + QString entry = getEntry( object ); + getDisplayer()->Erase( new SALOME_InteractiveObject( + entry.toLatin1().constData(), + "GEOM", strdup( GEOMBase::GetName( object ).toLatin1().constData() ) ), true, updateView ); + } +} + +//================================================================ +// Function : redisplay +// Purpose : +//================================================================ +void MyGEOMBase_Helper::redisplay( const ObjectList& objList, + const bool withChildren, + const bool updateView ) +{ + ObjectList::const_iterator it = objList.begin(); + for ( ; it != objList.end(); it++ ) { + redisplay( *it, withChildren, false ); + } + if ( !objList.empty() && updateView ) + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : redisplay +// Purpose : +//================================================================ +void MyGEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, + const bool withChildren, + const bool updateView ) +{ + if ( !object->_is_nil() ) { + // Unset color of shape ( this color may be set during preview displaying ) + // Default color will be used + getDisplayer()->UnsetColor(); + getDisplayer()->UnsetWidth(); + + // Enable activisation of selection + getDisplayer()->SetToActivate( true ); + + QString entry = getEntry( object ); + getDisplayer()->Redisplay(new SALOME_InteractiveObject + (entry.toLatin1().constData(), "GEOM", strdup(GEOMBase::GetName(object).toLatin1().constData())), false); + } + + if ( withChildren ) { + SalomeApp_Study* aDoc = getStudy(); + if ( aDoc && aDoc->studyDS() ) { + _PTR(Study) aStudy = aDoc->studyDS(); + CORBA::String_var objStr = SalomeApp_Application::orb()->object_to_string(object); + _PTR(SObject) aSObj (aStudy->FindObjectIOR(std::string(objStr.in()))); + if ( aSObj ) { + _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) ); + for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { + GEOM::GEOM_Object_var aChild = GEOM::GEOM_Object::_narrow + (GeometryGUI::ClientSObjectToObject(anIt->Value())); + if ( !CORBA::is_nil( aChild ) ) { + if ( !aChild->_is_nil() ) { + QString entry = getEntry( aChild ); + getDisplayer()->Redisplay( new SALOME_InteractiveObject( + entry.toLatin1().constData(), "GEOM", strdup( GEOMBase::GetName( aChild ).toLatin1().constData() ) ), false ); + } + } + } + } + } + } + + if ( updateView ) + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : displayPreview +// Purpose : Method for displaying preview based on execute() results +//================================================================ +void MyGEOMBase_Helper::displayPreview( const bool display, + const bool activate, + const bool update, + const bool toRemoveFromEngine, + const double lineWidth, + const int displayMode, + const int color ) +{ + if(!display) { + erasePreview( update ); + return; + } + + isPreview = true; + QString msg; + if ( !isValid( msg ) ) + { + erasePreview( update ); + isPreview = false; + return; + } + + erasePreview( false ); + + try { + SUIT_OverrideCursor wc; + ObjectList objects; + if ( !execute( objects ) || !getOperation()->IsDone() ) { + wc.suspend(); + } + else { + for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) + { + GEOM::GEOM_Object_var obj=*it; + displayPreview( obj, true, activate, false, lineWidth, displayMode, color ); + if ( toRemoveFromEngine ) + obj->UnRegister(); + } + } + } + catch( const SALOME::SALOME_Exception& e ) { + SalomeApp_Tools::QtCatchCorbaException( e ); + } + + isPreview = false; + + if ( update ) + updateViewer(); +} + +//================================================================ +// Function : displayPreview +// Purpose : Method for displaying preview of resulting shape +//================================================================ +void MyGEOMBase_Helper::displayPreview( GEOM::GEOM_Object_ptr object, + const bool append, + const bool activate, + const bool update, + const double lineWidth, + const int displayMode, + const int color ) +{ + // Set color for preview shape + getDisplayer()->SetColor( color == -1 ? Quantity_NOC_VIOLET : color ); + + // set width of displayed shape + getDisplayer()->SetWidth( lineWidth ); + + // set display mode of displayed shape + int aPrevDispMode = getDisplayer()->SetDisplayMode( displayMode ); + + // Disable activation of selection + getDisplayer()->SetToActivate( activate ); + + // Make a reference to GEOM_Object + CORBA::String_var objStr = SalomeApp_Application::orb()->object_to_string( object ); + getDisplayer()->SetName( objStr.in() ); + + // Build prs + SALOME_Prs* aPrs = getDisplayer()->BuildPrs( object ); + if ( aPrs == 0 || aPrs->IsNull() ) + return; + + // Display prs + displayPreview( aPrs, append, update ); + + getDisplayer()->UnsetName(); + getDisplayer()->UnsetColor(); + getDisplayer()->SetDisplayMode( aPrevDispMode ); + + // Enable activation of displayed objects + getDisplayer()->SetToActivate( true ); +} + +//================================================================ +// Function : displayPreview +// Purpose : Method for displaying arbitrary preview objects (not limited to shapes) +//================================================================ +void MyGEOMBase_Helper::displayPreview( const SALOME_Prs* prs, + const bool append, + const bool update ) +{ + if ( !append ) + erasePreview( false ); + + // remember current view frame to make correct erase preview later + myViewWindow = getActiveView(); + + if ( myViewWindow == 0 ) + return; + + // Display prs + SUIT_ViewManager* aViewManager = myViewWindow->getViewManager(); + if ( aViewManager->getType() == OCCViewer_Viewer::Type() || + aViewManager->getType() == SVTK_Viewer::Type() ) + { + SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); + SALOME_View* aView = dynamic_cast(aViewModel); + if (aView) + aView->Display( prs ); + } + + // Add prs to the preview list + myPreview.push_back( (SALOME_Prs*)prs ); + + // Update viewer + if ( update ) + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : erasePreview +// Purpose : +//================================================================ +void MyGEOMBase_Helper::erasePreview( const bool update ) +{ + // check view frame where the preview was displayed + bool vfOK = checkViewWindow() && myViewWindow; + // Iterate through presentations and delete them + for ( PrsList::iterator anIter = myPreview.begin(); anIter != myPreview.end(); ++anIter ) { + if ( vfOK ) + { + SUIT_ViewManager* aViewManager = myViewWindow->getViewManager(); + if ( aViewManager->getType() == OCCViewer_Viewer::Type() || + aViewManager->getType() == SVTK_Viewer::Type() ) + { + SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); + SALOME_View* aView = dynamic_cast(aViewModel); + if (aView) + aView->Erase( *anIter, true ); + } + } + delete *anIter; + } + myPreview.clear(); + + // Update viewer + if ( update ) + updateViewer(); +} + +//================================================================ +// Function : localSelection +// Purpose : Activate selection of objects of a given type +// IMPORTANT : Works after localSelection( ... ) method call only +//================================================================ +void MyGEOMBase_Helper::activate( const int theType ) +{ + if (!getStudy()) return; + _PTR(Study) aStudy = getStudy()->studyDS(); + _PTR(SComponent) aGeom ( aStudy->FindComponent( "GEOM" ) ); + if ( !aGeom ) + return; + + SALOME_ListIO aList; + _PTR(ChildIterator) anIter ( aStudy->NewChildIterator( aGeom ) ); + for ( ; anIter->More(); anIter->Next() ) + { + _PTR(SObject) aSO ( anIter->Value() ); + if ( aSO ) + { + _PTR(SObject) aRefSO; + if ( !aSO->ReferencedObject( aRefSO ) ) + { + GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow + (GeometryGUI::ClientSObjectToObject(aSO)); + if ( !anObj->_is_nil() && anObj->GetType() == theType ) + aList.Append( new SALOME_InteractiveObject( aSO->GetID().c_str(), "GEOM", aSO->GetName().c_str()) ); + } + } + } + + getDisplayer()->LocalSelection( aList, 0 ); +} + +//================================================================ +// Function : localSelection +// Purpose : Activate selection of subshapes in accordance with mode +// theMode is from TopAbs_ShapeEnum +//================================================================ +void MyGEOMBase_Helper::localSelection( const ObjectList& theObjs, const int theMode ) +{ + SALOME_ListIO aListOfIO; + + ObjectList::const_iterator anIter = theObjs.begin(); + for ( ; anIter != theObjs.end(); ++anIter ) + { + GEOM::GEOM_Object_ptr anObj = *anIter; + if ( anObj->_is_nil() ) + continue; + QString anEntry = getEntry( anObj ); + if ( anEntry != "" ) + aListOfIO.Append( new SALOME_InteractiveObject( + anEntry.toLatin1().constData(), "GEOM", strdup( GEOMBase::GetName( anObj ).toLatin1().constData() ) ) ); + } + + getDisplayer()->LocalSelection( aListOfIO, theMode ); +} + +//================================================================ +// Function : localSelection +// Purpose : Activate selection of subshapes in accordance with mode +// theMode is from TopAbs_ShapeEnum +//================================================================ +void MyGEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const int mode ) +{ + // If object is null local selection for all objects is activated + if ( obj->_is_nil() ) { + getDisplayer()->LocalSelection( Handle(SALOME_InteractiveObject)(), mode ); + return; + } + + ObjectList objList; + objList.push_back( obj ); + localSelection( objList, mode ); +} + + +//================================================================ +// Function : globalSelection +// Purpose : Activate selection of subshapes. Set selection filters +// in accordance with mode. theMode is from GEOMImpl_Types +//================================================================ +void MyGEOMBase_Helper::globalSelection( const int theMode, const bool update ) +{ + getDisplayer()->GlobalSelection( theMode, update ); +} + +//================================================================ +// Function : globalSelection +// Purpose : Activate selection of subshapes. Set selection filters +// in accordance with mode. theMode is from GEOMImpl_Types +//================================================================ +void MyGEOMBase_Helper::globalSelection( const TColStd_MapOfInteger& theModes, + const bool update ) +{ + getDisplayer()->GlobalSelection( theModes, update ); +} + +//================================================================ +// Function : globalSelection +// Purpose : Activate selection of subshapes. Set selection filters +// in accordance with mode. theMode is from GEOMImpl_Types +//================================================================ +void MyGEOMBase_Helper::globalSelection( const TColStd_MapOfInteger& theModes, + const QList& subShapes, + const bool update ) +{ + getDisplayer()->GlobalSelection( theModes, update, &subShapes ); +} + +//================================================================ +// Function : addInStudy +// Purpose : Add object in study +//================================================================ +QString MyGEOMBase_Helper::addInStudy( GEOM::GEOM_Object_ptr theObj, const char* theName ) +{ + if ( !hasCommand() ) + return QString(); + + _PTR(Study) aStudy = getStudy()->studyDS(); + if ( !aStudy || theObj->_is_nil() ) + return QString(); + + SALOMEDS::Study_var aStudyDS = GeometryGUI::ClientStudyToStudy(aStudy); + + GEOM::GEOM_Object_ptr aFatherObj = getFather( theObj ); + + SALOMEDS::SObject_var aSO = + getGeomEngine()->AddInStudy(aStudyDS, theObj, theName, aFatherObj); + + QString anEntry; + if ( !aSO->_is_nil() ) + anEntry = aSO->GetID(); + + // Each dialog is responsible for this method implementation, + // default implementation does nothing + restoreSubShapes(aStudyDS, aSO); + aSO->UnRegister(); + + return anEntry; +} + +//================================================================ +// Function : restoreSubShapes +// Purpose : restore tree of argument's sub-shapes under the resulting shape +//================================================================ +void MyGEOMBase_Helper::restoreSubShapes (SALOMEDS::Study_ptr /*theStudy*/, + SALOMEDS::SObject_ptr /*theSObject*/) +{ + // do nothing by default + + // example of implementation in particular dialog: + // GEOM::ListOfGO anArgs; + // anArgs.length(0); // empty list means that all arguments should be restored + // getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, anArgs, + // /*theFindMethod=*/GEOM::FSM_GetInPlace, + // /*theInheritFirstArg=*/false); +} + +//================================================================ +// Function : updateObjBrowser +// Purpose : Update object browser +//================================================================ +void MyGEOMBase_Helper::updateObjBrowser() const +{ + SalomeApp_Application* app = dynamic_cast(SUIT_Session::session()->activeApplication()); + if (app) { + CAM_Module* module = app->module( "Geometry" ); + SalomeApp_Module* appMod = dynamic_cast( module ); + if ( appMod ) { + appMod->updateObjBrowser( true ); + } + } +} + +//================================================================ +// Function : updateViewer +// Purpose : Update active 3D view +//================================================================ +void MyGEOMBase_Helper::updateViewer() +{ + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : getStudyId +// Purpose : Get study Id +//================================================================ +int MyGEOMBase_Helper::getStudyId() const +{ + int anId = -1; + if ( getStudy() ) + anId = getStudy()->id(); + return anId; +} + +//================================================================ +// Function : getStudy +// Purpose : Returns the active study. It is recommended to use +// this method instead of direct desktop->getActiveStudy() calls +//================================================================ +SalomeApp_Study* MyGEOMBase_Helper::getStudy() const +{ + SUIT_Desktop* aDesktop = getDesktop(); + if (!aDesktop) + return 0; + + QList anAppList = SUIT_Session::session()->applications(); + + SUIT_Application* anApp = 0; + QListIterator it( anAppList ); + while ( it.hasNext() ) + { + anApp = it.next(); + if ( anApp && anApp->desktop() == aDesktop ) + break; + } + + return dynamic_cast(anApp->activeStudy()); +} + +//================================================================ +// Function : getEntry +// Purpose : +//================================================================ +QString MyGEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const +{ + SalomeApp_Study* study = getStudy(); + if ( study ) { + QString objIOR = GEOMBase::GetIORFromObject( object ); + if ( objIOR != "" ) { + _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( objIOR.toLatin1().constData() ) ); + if ( SO ) + return QString::fromStdString(SO->GetID()); + } + } + return ""; +} + +//================================================================ +// Function : getDisplayer +// Purpose : +//================================================================ +GEOM_Displayer* MyGEOMBase_Helper::getDisplayer() +{ + if ( !myDisplayer ) + myDisplayer = new GEOM_Displayer( getStudy() ); + return myDisplayer; +} + +//================================================================ +// Function : clearShapeBuffer +// Purpose : +//================================================================ +void MyGEOMBase_Helper::clearShapeBuffer( GEOM::GEOM_Object_ptr theObj ) +{ + if ( CORBA::is_nil( theObj ) ) + return; + + CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj ); + TCollection_AsciiString asciiIOR( (char *)IOR.in() ); + GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR ); + + if ( !getStudy() || !getStudy()->studyDS() ) + return; + + _PTR(Study) aStudy = getStudy()->studyDS(); + _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR ) ) ); + if ( !aSObj ) + return; + + _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) ); + for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { + _PTR(GenericAttribute) anAttr; + if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) { + _PTR(AttributeIOR) anIOR ( anAttr ); + TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() ); + GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR ); + } + } +} + +//================================================================ +// Function : openCommand +// Purpose : +//================================================================ +bool MyGEOMBase_Helper::openCommand() +{ + bool res = false; + if ( !getStudy() || hasCommand() ) + return res; + + GEOM::GEOM_IOperations_var anOp = GEOM::GEOM_IOperations::_narrow( getOperation() ); + if ( !anOp->_is_nil() ) { + myCommand = new GEOM_Operation( SUIT_Session::session()->activeApplication(), anOp.in() ); + myCommand->start(); + res = true; + } + + return res; +} + +//================================================================ +// Function : abortCommand +// Purpose : +//================================================================ +bool MyGEOMBase_Helper::abortCommand() +{ + if ( !hasCommand() ) + return false; + + myCommand->abort(); + delete myCommand; // I don't know where to delete this object here ? + myCommand = 0; + + return true; +} + +//================================================================ +// Function : commitCommand +// Purpose : +//================================================================ +bool MyGEOMBase_Helper::commitCommand( const char* ) +{ + if ( !hasCommand() ) + return false; + + myCommand->commit(); + delete myCommand; // I don't know where to delete this object here ? + myCommand = 0; + + return true; +} + +//================================================================ +// Function : hasCommand +// Purpose : +//================================================================ +bool MyGEOMBase_Helper::hasCommand() const +{ + return (bool)myCommand; +} + +//================================================================ +// Function : getOperation +// Purpose : +//================================================================ +GEOM::GEOM_IOperations_ptr MyGEOMBase_Helper::getOperation() +{ + if ( myOperation->_is_nil() ) + myOperation = createOperation(); + + return myOperation; +} + + + +//================================================================ +// Function : checkViewWindow +// Purpose : +//================================================================ +bool MyGEOMBase_Helper::checkViewWindow() +{ + if ( myViewWindow ){ + QList aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows(); + QListIterator it( aViewWindowsList ); + while ( it.hasNext() ) + { + if ( myViewWindow == it.next() ) + return true; + } + } + myViewWindow = 0; + return false; +} + +//================================================================ +// Function : onAccept +// Purpose : This method should be called from dialog's slots onOk() and onApply() +// It perfroms user input validation, then it +// performs a proper operation and manages transactions, etc. +//================================================================ +bool MyGEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) +{ + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return false; + _PTR(Study) aStudy = appStudy->studyDS(); + + bool aLocked = (_PTR(AttributeStudyProperties) (aStudy->GetProperties()))->IsLocked(); + if ( aLocked ) { + MESSAGE("MyGEOMBase_Helper::onAccept - ActiveStudy is locked"); + SUIT_MessageBox::warning ( (QWidget*)SUIT_Session::session()->activeApplication()->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("WRN_STUDY_LOCKED"), + QObject::tr("BUT_OK") ); + return false; + } + + QString msg; + if ( !isValid( msg ) ) { + showError( msg ); + return false; + } + + erasePreview( false ); + + bool result = false; + + try { + if ( ( !publish && !useTransaction ) || openCommand() ) { + SUIT_OverrideCursor wc; + SUIT_Session::session()->activeApplication()->putInfo( "" ); + ObjectList objects; + if ( !execute( objects ) || !getOperation()->IsDone() ) { + wc.suspend(); + abortCommand(); + showError(); + } + else { + addSubshapesToStudy(); // add Subshapes if local selection + const int nbObjs = objects.size(); + QStringList anEntryList; + int aNumber = 1; + for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) { + GEOM::GEOM_Object_var obj=*it; + if ( publish ) { + QString aName = getNewObjectName(); + if ( nbObjs > 1 ) { + if (aName.isEmpty()) + aName = getPrefix(obj); + if (nbObjs <= 30) { + // Try to find a unique name + aName = GEOMBase::GetDefaultName(aName, extractPrefix()); + } else { + // Don't check name uniqueness in case of numerous objects + aName = aName + "_" + QString::number(aNumber++); + } + } else { + // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName() + if ( aName.isEmpty() ) + aName = GEOMBase::GetDefaultName( getPrefix( obj ) ); + } + anEntryList << addInStudy( obj, aName.toLatin1().constData() ); + // updateView=false + display( obj, false ); +#ifdef WITHGENERICOBJ + // obj has been published in study. Its refcount has been incremented. + // It is safe to decrement its refcount + // so that it will be destroyed when the entry in study will be removed + obj->UnRegister(); +#endif + } + else { + // asv : fix of PAL6454. If publish==false, then the original shape + // was modified, and need to be re-cached in GEOM_Client before redisplay + clearShapeBuffer( obj ); + // withChildren=true, updateView=false + redisplay( obj, true, false ); + } + } + + if ( nbObjs ) { + commitCommand(); + updateObjBrowser(); + if( SUIT_Application* anApp = SUIT_Session::session()->activeApplication() ) { + if( LightApp_Application* aLightApp = dynamic_cast( anApp ) ) + aLightApp->browseObjects( anEntryList, isApplyAndClose(), isOptimizedBrowsing() ); + anApp->putInfo( QObject::tr("GEOM_PRP_DONE") ); + } + result = true; + } + else + abortCommand(); + } + } + } + catch( const SALOME::SALOME_Exception& e ) { + SalomeApp_Tools::QtCatchCorbaException( e ); + abortCommand(); + } + + updateViewer(); + + return result; +} + + +//================================================================ +// Function : showError +// Purpose : Shows a message box with infromation about an error taken from getOperation()->GetErrorCode() +//================================================================ +void MyGEOMBase_Helper::showError() +{ + QString msg; + if ( !getOperation()->_is_nil() ) + msg = QObject::tr( getOperation()->GetErrorCode() ); + + if ( msg.isEmpty() ) + msg = QObject::tr( "GEOM_PRP_ABORT" ); + + SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(), + QObject::tr( "GEOM_ERROR_STATUS" ), + msg, + QObject::tr( "BUT_OK" ) ); +} + +//================================================================ +// Function : showError +// Purpose : Shows a error message followed by +//================================================================ +void MyGEOMBase_Helper::showError( const QString& msg ) +{ + QString str( QObject::tr( "GEOM_INCORRECT_INPUT" ) ); + if ( !msg.isEmpty() ) + str += "\n" + msg; + SUIT_MessageBox::critical(SUIT_Session::session()->activeApplication()->desktop(), QObject::tr( "GEOM_ERROR" ), str, QObject::tr( "BUT_OK" ) ); +} + +////////////////////////////////////////////////////////////////// +// Virtual methods to be redefined in dialogs +////////////////////////////////////////////////////////////////// + +//================================================================ +// Function : createOperation +// Purpose : Redefine this method to return proper IOperation reference +//================================================================ +GEOM::GEOM_IOperations_ptr MyGEOMBase_Helper::createOperation() +{ + GEOM::GEOM_IOperations_var aNilOp; + return aNilOp._retn(); +} + +//================================================================ +// Function : isValid +// Purpose : Called by onAccept(). Redefine this method to check validity of user input in dialog boxes. +//================================================================ +bool MyGEOMBase_Helper::isValid( QString& ) +{ + return true; +} + +//================================================================ +// Function : execute +// Purpose : This method is called by onAccept(). +// It should perform the required operation and put all new or modified objects into +// argument.Should return if some error occurs during its execution. +//================================================================ +bool MyGEOMBase_Helper::execute( ObjectList& objects ) +{ + return false; +} + +//================================================================ +// Function : getFather +// Purpose : This method is called by addInStudy(). It should return a father object +// for or a nil reference if should be published +// as a top-level object. +//================================================================ +GEOM::GEOM_Object_ptr MyGEOMBase_Helper::getFather( GEOM::GEOM_Object_ptr theObj ) +{ + return GEOM::GEOM_Object::_nil(); +} + +//================================================================ +// Function : getNewObjectName +// Purpose : Redefine this method to return proper name for a new object +//================================================================ +QString MyGEOMBase_Helper::getNewObjectName() const +{ + return QString::null; +} + +//================================================================ +// Function : extractPrefix +// Purpose : Redefine this method to return \c true if necessary +// to extract prefix when generating new name for the +// object(s) being created +//================================================================ +bool MyGEOMBase_Helper::extractPrefix() const +{ + return false; +} + +//================================================================ +// Function : getPrefix +// Purpose : Get prefix for name of created object +//================================================================ +QString MyGEOMBase_Helper::getPrefix( GEOM::GEOM_Object_ptr theObj ) const +{ + if ( !myPrefix.isEmpty() || theObj->_is_nil() ) + return myPrefix; + + GEOM::shape_type aType = theObj->GetShapeType(); + + switch ( aType ) + { + case GEOM::VERTEX : return QObject::tr( "GEOM_VERTEX" ); + case GEOM::EDGE : return QObject::tr( "GEOM_EDGE" ); + case GEOM::WIRE : return QObject::tr( "GEOM_WIRE" ); + case GEOM::FACE : return QObject::tr( "GEOM_FACE" ); + case GEOM::SHELL : return QObject::tr( "GEOM_SHELL" ); + case GEOM::SOLID : return QObject::tr( "GEOM_SOLID" ); + case GEOM::COMPSOLID: return QObject::tr( "GEOM_COMPOUNDSOLID" ); + case GEOM::COMPOUND : return QObject::tr( "GEOM_COMPOUND" ); + default : return ""; + } +} + +//================================================================ +// Function : getDesktop +// Purpose : Returns myDesktop field. Initialized in constructor, +// usually as dynamic_cast(parentWidget()) +//================================================================ +SUIT_Desktop* MyGEOMBase_Helper::getDesktop() const +{ + return myDesktop; +} + +//================================================================ +// Function : selectObjects +// Purpose : Selects list of objects +//================================================================ +bool MyGEOMBase_Helper::selectObjects( ObjectList& objects ) +{ + SUIT_DataOwnerPtrList aList; + ObjectList::iterator anIter; + for ( anIter = objects.begin(); anIter != objects.end(); ++anIter ) + { + QString anEntry = getEntry( *anIter ); + LightApp_DataOwner* anOwher = new LightApp_DataOwner( anEntry ); + aList.append( anOwher ); + } + + SUIT_Session* session = SUIT_Session::session(); + SalomeApp_Application* app = dynamic_cast( session->activeApplication() ); + if ( !app ) + return false; + + LightApp_SelectionMgr* aMgr = app->selectionMgr(); + if ( !aMgr ) + return false; + + aMgr->setSelected( aList, false ); + + return true; +} + +//================================================================ +// Function : findObjectInFather +// Purpose : It should return an object if its founded in study or +// return Null object if the object is not founded +//================================================================ +GEOM::GEOM_Object_ptr MyGEOMBase_Helper::findObjectInFather (GEOM::GEOM_Object_ptr theFather, + const QString& theName) +{ + SalomeApp_Application* app = + dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + _PTR(Study) aDStudy = appStudy->studyDS(); + QString IOR = GEOMBase::GetIORFromObject( theFather ); + _PTR(SObject) SObj ( aDStudy->FindObjectIOR( IOR.toLatin1().constData() ) ); + + bool inStudy = false; + GEOM::GEOM_Object_var aReturnObject; + for (_PTR(ChildIterator) iit (aDStudy->NewChildIterator( SObj )); iit->More() && !inStudy; iit->Next()) { + _PTR(SObject) child (iit->Value()); + QString aChildName = child->GetName().c_str(); + if (aChildName == theName) { + inStudy = true; + CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(iit->Value()); + aReturnObject = GEOM::GEOM_Object::_narrow( corbaObj ); + } + } + if (inStudy) + return aReturnObject._retn(); + + return GEOM::GEOM_Object::_nil(); +} + +//================================================================ +// Function : findObjectInFather +// Purpose : It should return an object if its founded in study or +// return Null object if the object is not founded +//================================================================ +GEOM::GEOM_Object_ptr MyGEOMBase_Helper::findObjectInFather( GEOM::GEOM_Object_ptr theFather, + int theIndex ) +{ + GEOM::GEOM_Object_var object; + bool found = false; + + SalomeApp_Study* study = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( study ) { + _PTR(Study) studyDS = study->studyDS(); + QString IOR = GEOMBase::GetIORFromObject( theFather ); + _PTR(SObject) sobject( studyDS->FindObjectIOR( IOR.toLatin1().constData() ) ); + if ( sobject ) { + _PTR(ChildIterator) it( studyDS->NewChildIterator( sobject ) ); + for ( ; it->More() && !found; it->Next() ) { + GEOM::GEOM_Object_var cobject = GEOM::GEOM_Object::_narrow( GeometryGUI::ClientSObjectToObject( it->Value() ) ); + if ( !CORBA::is_nil( cobject ) ) { + GEOM::ListOfLong_var indices = cobject->GetSubShapeIndices(); + int length = indices->length(); + for ( int i = 0; i < length && !found; i++ ) { + if ( indices[i] == theIndex ) { + object = cobject; + found = true; + } + } + } + } + } + } + + return object._retn(); +} + +//================================================================ +// Function : addSubshapesToStudy +// Purpose : Virtual method to add subshapes if needs +//================================================================ +void MyGEOMBase_Helper::addSubshapesToStudy() +{ + //Impemented in Dialogs, called from Accept method +} + +//================================================================ +// Function : getSelected +// Purpose : Get selected object by specified type +// +// Returns valid object if only one object of the specified type is selected +// (no matter global or local selection is activated). If \a type is TopAbs_SHAPE, +// geometrical object of any valid type is expected. +// +// \param type type of the object to be obtained from selection +// \return selected geometrical object or nil object if selection is not satisfactory +//================================================================ +GEOM::GeomObjPtr MyGEOMBase_Helper::getSelected( TopAbs_ShapeEnum type ) +{ + QList types; + types << type; + return getSelected( types ); +} + +//================================================================ +// Function : getSelected +// Purpose : Get selected object by specified types +// +// Returns valid object if only one object of the specified type is selected +// (no matter global or local selection is activated). The list of allowed +// shape types is passed via \a types. If \a types includes TopAbs_SHAPE, +// geometrical object of any valid type is expected. +// +// \param types list of allowed shape types for the objects to be obtained from selection +// \return selected geometrical object or nil object if selection is not satisfactory +//================================================================ +GEOM::GeomObjPtr MyGEOMBase_Helper::getSelected( const QList& types ) +{ + QList selected = getSelected( types, 1 ); + return selected.count() > 0 ? selected[0] : GEOM::GeomObjPtr(); +} + +//================================================================ +// Function : getSelected +// Purpose : Get selected object(s) by specified type +// +// Returns list of selected objects if selection satisfies specifies selection options. +// (no matter global or local selection is activated). If \a type is TopAbs_SHAPE, +// geometrical objects of any valid type are expected. +// +// The \a type parameter specifies allowed type of the object(s) being selected. +// The \a count parameter specifies exact number of the objects to be retrieved from selection. +// The \a strict parameter specifies policy being applied to the selection. +// If \a count < 0, then any number of the selected objects is valid (including 0). +// In this case, if \a strict is \c true (default), all selected objects should satisfy +// the specified \a type. +// If \a count > 0, only specified number of the objects is retrieved from the selection. +// In this case, if \a strict is \c true (default), function returns empty list if total number of selected +// objects does not correspond to the \a count parameter. Otherwise (if \a strict is \c false), +// function returns valid list of objects if at least \a count objects satisfy specified \a type. +// +// \param type type of the object(s) to be obtained from selection +// \param count number of items to be retrieved from selection +// \param strict selection policy +// \return list of selected geometrical objects or empty list if selection is not satisfactory +//================================================================ +QList MyGEOMBase_Helper::getSelected( TopAbs_ShapeEnum type, int count, bool strict ) +{ + QList types; + types << type; + return getSelected( types, count, strict ); +} + +static bool typeInList( TopAbs_ShapeEnum type, const QList& types ) +{ + bool ok = false; + for ( int i = 0; i < types.count() && !ok; i++ ) + ok = types[i] == TopAbs_SHAPE || types[i] == type; + return ok; +} + +//================================================================ +// Function : getSelected +// Purpose : Get selected objects by specified types +// +// Returns list of selected objects if selection satisfies specifies selection options. +// (no matter global or local selection is activated). If \a types includes TopAbs_SHAPE, +// geometrical objects of any valid type are expected. +// +// The \a types parameter specifies allowed types of the object(s) being selected. +// The \a count parameter specifies exact number of the objects to be retrieved from selection. +// The \a strict parameter specifies policy being applied to the selection. +// If \a count < 0, then any number of the selected objects is valid (including 0). +// In this case, if \a strict is \c true (default), all selected objects should satisfy +// the specified \a type. +// If \a count > 0, only specified number of the objects is retrieved from the selection. +// In this case, if \a strict is \c true (default), function returns empty list if total number of selected +// objects does not correspond to the \a count parameter. Otherwise (if \a strict is \c false), +// function returns valid list of objects if at least \a count objects satisfy specified \a type. +// +// \param types list of allowed shape types for the objects to be obtained from selection +// \param count number of items to be retrieved from selection +// \param strict selection policy +// \return list of selected geometrical objects or empty list if selection is not satisfactory +//================================================================ +QList MyGEOMBase_Helper::getSelected( const QList& types, int count, bool strict ) +{ + SUIT_Session* session = SUIT_Session::session(); + QList result; + + SalomeApp_Application* app = dynamic_cast( session->activeApplication() ); + if ( app ) { + LightApp_SelectionMgr* selMgr = app->selectionMgr(); + if ( selMgr ) { + SALOME_ListIO selected; + selMgr->selectedObjects( selected ); + SALOME_ListIteratorOfListIO it( selected ); + bool stopped = false; + for ( ; it.More() && !stopped; it.Next() ) { + Handle(SALOME_InteractiveObject) IO = it.Value(); + GEOM::GeomObjPtr object = GEOMBase::ConvertIOinGEOMObject( IO ); + if ( object ) { + TColStd_IndexedMapOfInteger subShapes; + selMgr->GetIndexes( IO, subShapes ); + int nbSubShapes = subShapes.Extent(); + if ( nbSubShapes == 0 ) { + // global selection + if ( typeInList( (TopAbs_ShapeEnum)(object->GetShapeType()), types ) ) { + result << object; + if ( count > 0 ) { + if ( strict && result.count() > count ) { + result.clear(); + stopped = true; + } + else if ( !strict && result.count() == count ) + stopped = true; + } + } + else if ( strict ) { + result.clear(); + stopped = true; + } + } + else { + // local selection + for ( int i = 1; i <= nbSubShapes && !stopped; i++ ) { + int idx = subShapes( i ); + GEOM::GeomObjPtr subShape = findObjectInFather( object.get(), idx ); + if ( !subShape ) { + // sub-shape is not yet published in the study + GEOM::ShapesOpPtr shapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() ); + subShape.take( shapesOp->GetSubShape( object.get(), idx ) ); // take ownership! + } + if ( typeInList( (TopAbs_ShapeEnum)(subShape->GetShapeType()), types ) ) { + result << subShape; + if ( count > 0 ) { + if ( strict && result.count() > count ) { + result.clear(); + stopped = true; + } + else if ( !strict && result.count() == count ) + stopped = true; + } + } + else if ( strict ) { + result.clear(); + stopped = true; + } + } + } + } + } + } + } + return result; +} + +//================================================================ +// Function : setIsApplyAndClose +// Purpose : Set value of the flag indicating that the dialog is +// accepted by Apply & Close button +//================================================================ +void MyGEOMBase_Helper::setIsApplyAndClose( const bool theFlag ) +{ + myIsApplyAndClose = theFlag; +} + +//================================================================ +// Function : isApplyAndClose +// Purpose : Get value of the flag indicating that the dialog is +// accepted by Apply & Close button +//================================================================ +bool MyGEOMBase_Helper::isApplyAndClose() const +{ + return myIsApplyAndClose; +} + +//================================================================ +// Function : setIsOptimizedBrowsing +// Purpose : Set value of the flag switching to optimized +// browsing mode (to select the first published +// object only) +//================================================================ +void MyGEOMBase_Helper::setIsOptimizedBrowsing( const bool theFlag ) +{ + myIsOptimizedBrowsing = theFlag; +} + +//================================================================ +// Function : isOptimizedBrowsing +// Purpose : Get value of the flag switching to optimized +// browsing mode (to select the first published +// object only) +//================================================================ +bool MyGEOMBase_Helper::isOptimizedBrowsing() const +{ + return myIsOptimizedBrowsing; +} diff --git a/src/HEXABLOCKGUI/MyGEOMBase_Helper.hxx b/src/HEXABLOCKGUI/MyGEOMBase_Helper.hxx new file mode 100644 index 0000000..4bfdab2 --- /dev/null +++ b/src/HEXABLOCKGUI/MyGEOMBase_Helper.hxx @@ -0,0 +1,205 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef MYGEOMBASE_HELPER_HXX +#define MYGEOMBASE_HELPER_HXX + +#include "GEOM_GEOMBase.hxx" +#include "GEOM_GenericObjPtr.h" + +#include +#include +#include +#include CORBA_CLIENT_HEADER(GEOM_Gen) + +#include +#include + +#include + +typedef std::list ObjectList; + +class SalomeApp_Study; +class SUIT_Desktop; +class SUIT_ViewWindow; +class SALOME_Prs; +class GEOM_Operation; +class TColStd_MapOfInteger; + +//================================================================ +// Class : MyGEOMBase_Helper +// Description : Helper class for dialog box development, can be used as +// the second base class for dialog boxes. Contains convenient methods +// performing common operations (display/erase, selection activation, +// publication in a study, transaction management) +//================================================================ +class GEOMBASE_EXPORT MyGEOMBase_Helper +{ +public: + MyGEOMBase_Helper( SUIT_Desktop* ); + virtual ~MyGEOMBase_Helper(); + +protected: + static GEOM::GEOM_Gen_ptr getGeomEngine(); + + void display ( const ObjectList&, const bool = true ); + void display ( GEOM::GEOM_Object_ptr, const bool = true ); + void erase ( const ObjectList&, const bool = true ); + void erase ( GEOM::GEOM_Object_ptr, const bool = true ); + void redisplay ( const ObjectList&, const bool = true, const bool = true ); + void redisplay ( GEOM::GEOM_Object_ptr, const bool = true, const bool = true ); + + virtual void displayPreview ( const bool display, + const bool activate = false, + const bool update = true, + const bool toRemoveFromEngine = true, + const double lineWidth = -1, + const int displayMode = -1, + const int color = -1 ); + // This is the easiest way to show preview. It is based on execute() method. + // It removes temporary GEOM::GEOM_Objects automatically. + + virtual void displayPreview ( GEOM::GEOM_Object_ptr obj, + const bool append = false, + const bool activate = false, + const bool update = true, + const double lineWidth = -1, + const int displayMode = -1, + const int color = -1 ); + void displayPreview ( const SALOME_Prs* prs, + const bool append = false, + const bool = true ); + void erasePreview ( const bool = true ); + + void localSelection( const ObjectList&, const int ); + void localSelection( GEOM::GEOM_Object_ptr, const int ); + void activate( const int ); + void globalSelection( const int = GEOM_ALLOBJECTS, const bool = false ); + void globalSelection( const TColStd_MapOfInteger&, const bool = false ); + void globalSelection( const TColStd_MapOfInteger&, const QList& ,const bool = false ); + void updateViewer (); + + void prepareSelection( const ObjectList&, const int ); + void prepareSelection( GEOM::GEOM_Object_ptr, const int ); + + QString addInStudy ( GEOM::GEOM_Object_ptr, const char* theName ); + + bool openCommand (); + bool abortCommand (); + bool commitCommand ( const char* = 0 ); + bool hasCommand () const; + + void updateObjBrowser() const; + int getStudyId () const; + SalomeApp_Study* getStudy () const; + bool checkViewWindow (); + + bool onAccept( const bool publish = true, const bool useTransaction = true ); + // This method should be called from "OK" button handler. + // == true means that objects returned by execute() + // should be published in a study. + + void showError(); + // Shows a message box with infromation about an error taken from getOperation()->GetErrorCode() + void showError( const QString& msg ); + // Shows a error message followed by + + GEOM::GEOM_IOperations_ptr getOperation(); + // If is nil --> calls createOperation() and put the result + // into and returns it; + // otherwise, simply returns + + inline void setPrefix( const QString& prefix ) { myPrefix = prefix; } + QString getPrefix( GEOM::GEOM_Object_ptr = GEOM::GEOM_Object::_nil() ) const; + + bool selectObjects( ObjectList& objects ); + // Selects list of objects + + //////////////////////////////////////////////////////////////////////////// + // Virtual methods, to be redefined in dialog classes + //////////////////////////////////////////////////////////////////////////// + + virtual GEOM::GEOM_IOperations_ptr createOperation(); + // This method should be redefined in dialog boxes so as to return + // proper GEOM_IOperation interface. + // Returns nil reference by default + + virtual bool isValid( QString& msg ); + // Called by onAccept(). Redefine this method to check validity of user input in dialog boxes. + + virtual bool execute( ObjectList& objects ); + // This method is called by onAccept(). + // It should perform the required operation and put all new or modified objects into + // argument.Should return if some error occurs during its execution. + + virtual void restoreSubShapes( SALOMEDS::Study_ptr theStudy, SALOMEDS::SObject_ptr theSObject ); + // This method is called by addInStudy(). + + virtual GEOM::GEOM_Object_ptr getFather( GEOM::GEOM_Object_ptr theObj ); + // This method is called by addInStudy(). It should return a father object + // for or a nil reference if should be published + // as a top-level object. + + virtual QString getNewObjectName() const; + virtual bool extractPrefix() const; + virtual void addSubshapesToStudy(); + + GEOM::GEOM_Object_ptr findObjectInFather( GEOM::GEOM_Object_ptr theFather, const QString& theName ); + GEOM::GEOM_Object_ptr findObjectInFather( GEOM::GEOM_Object_ptr theFather, int theIndex ); + // These methods are used to find published sub-object (sub-shape) in the parent object (main shape) + + GEOM::GeomObjPtr getSelected( TopAbs_ShapeEnum type ); + GEOM::GeomObjPtr getSelected( const QList& types ); + QList getSelected( TopAbs_ShapeEnum type, int count, bool strict = true ); + QList getSelected( const QList& types, int count, bool strict = true ); + + void SetIsPreview(const bool thePreview) {isPreview = thePreview;} + bool IsPreview() {return isPreview;} + + GEOM_Displayer* getDisplayer(); + SUIT_Desktop* getDesktop() const; + + virtual void setIsApplyAndClose( const bool theFlag ); + virtual bool isApplyAndClose() const; + + virtual void setIsOptimizedBrowsing( const bool theFlag ); + virtual bool isOptimizedBrowsing() const; + +private: + QString getEntry( GEOM::GEOM_Object_ptr ) const; + void clearShapeBuffer( GEOM::GEOM_Object_ptr ); + +private: + typedef std::list PrsList; + + PrsList myPreview; + GEOM_Displayer* myDisplayer; + GEOM_Operation* myCommand; + GEOM::GEOM_IOperations_var myOperation; + SUIT_ViewWindow* myViewWindow; + QString myPrefix; + bool isPreview; + SALOME_ListIO mySelected; + SUIT_Desktop* myDesktop; + bool myIsApplyAndClose; + bool myIsOptimizedBrowsing; + +}; + +#endif // GEOMBASE_HELPER_HXX diff --git a/src/HEXABLOCKGUI/MyGEOMBase_Skeleton.cxx b/src/HEXABLOCKGUI/MyGEOMBase_Skeleton.cxx new file mode 100755 index 0000000..b7690c9 --- /dev/null +++ b/src/HEXABLOCKGUI/MyGEOMBase_Skeleton.cxx @@ -0,0 +1,433 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "MyGEOMBase_Skeleton.hxx" +#include "GEOMBase.h" + +#include "MyDlgRef.hxx" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +//================================================================================= +// class : MyGEOMBase_Skeleton() +// purpose : Constructs a MyGEOMBase_Skeleton which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// true to construct a modal dialog. +//================================================================================= +MyGEOMBase_Skeleton::MyGEOMBase_Skeleton( GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal, Qt::WindowFlags fl ) + : QDialog( parent, fl ), + MyGEOMBase_Helper( dynamic_cast( parent ) ), + myGeomGUI( theGeometryGUI ), + myRBGroup( 0 ) +{ +// setAttribute( Qt::WA_DeleteOnClose ); + + setModal( modal ); + MESSAGE("MyGEOMBase_Skeleton::MyGEOMBase_Skeleton()"); + + myMainFrame = new MyDlgRef_Skeleton( this ); + QVBoxLayout* topLayout = new QVBoxLayout( this ); + topLayout->setMargin( 0 ); topLayout->setSpacing( 0 ); + topLayout->addWidget( myMainFrame ); + + myMainFrame->GroupBoxName->setTitle( tr( "GEOM_RESULT_NAME_GRP" ) ); + myMainFrame->NameLabel->setText( tr( "GEOM_RESULT_NAME_LBL" ) ); + + myMainFrame->GroupBoxPublish->setTitle( tr( "GEOM_PUBLISH_RESULT_GRP" ) ); + myMainFrame->CheckBoxRestoreSS->setText( tr( "GEOM_RESTORE_SUB_SHAPES" ) ); + myMainFrame->CheckBoxAddPrefix->setText( tr( "GEOM_RSS_ADD_FREFIX" ) ); + myMainFrame->CheckBoxPreview->setText( tr("GEOM_PREVIEW") ); + + buttonCancel()->setText( tr( "GEOM_BUT_CLOSE" ) ); + //buttonOk()->setText( tr( "GEOM_BUT_APPLY_AND_CLOSE" ) ); + buttonApply()->setText( tr( "GEOM_BUT_APPLY" ) ); + buttonHelp()->setText( tr( "GEOM_BUT_HELP" ) ); + + myRBGroup = new QButtonGroup( this ); + myRBGroup->addButton( myMainFrame->RadioButton1, 0 ); + myRBGroup->addButton( myMainFrame->RadioButton2, 1 ); + myRBGroup->addButton( myMainFrame->RadioButton3, 2 ); + myRBGroup->addButton( myMainFrame->RadioButton4, 3 ); + myRBGroup->addButton( myMainFrame->RadioButton5, 4 ); + + connect( myRBGroup, SIGNAL( buttonClicked( int ) ), this, SIGNAL( constructorsClicked( int ) ) ); + + Init(); +} + +//================================================================================= +// function : ~MyGEOMBase_Skeleton() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +MyGEOMBase_Skeleton::~MyGEOMBase_Skeleton() +{ + if ( myGeomGUI ) + myGeomGUI->SetActiveDialogBox( 0 ); +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void MyGEOMBase_Skeleton::Init() +{ + SalomeApp_Application* app = (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ); + if ( !myGeomGUI && app ) + myGeomGUI = dynamic_cast( app->module( "Geometry" ) ); + + /* init variables */ + if ( myGeomGUI ) + myGeomGUI->SetActiveDialogBox( this ); + + /* signals and slots connections */ + connect( buttonCancel(), SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) ); + if ( myGeomGUI ) { + connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ); + connect( myGeomGUI, SIGNAL( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ); + } + + // connect help button on a private slot that displays help information + connect( buttonHelp(), SIGNAL( clicked() ), this, SLOT( ClickOnHelp() ) ); + + connect( myMainFrame->CheckBoxPreview, SIGNAL(toggled(bool)), this, SLOT(processPreview()) ); + + /* displays Dialog */ + myMainFrame->RadioButton1->setChecked( true ); + myMainFrame->RadioButton4->hide(); + myMainFrame->RadioButton5->hide(); + + myMainFrame->CheckBoxRestoreSS->setChecked( false ); + myMainFrame->CheckBoxAddPrefix->setChecked( true ); + + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + bool aPrv = (resMgr == 0) ? false : resMgr->booleanValue( "Geometry", "geom_preview", false ); + + myMainFrame->CheckBoxPreview->setChecked( aPrv ); + myMainFrame->GroupBoxPublish->hide(); +} + +//================================================================================= +// function : initSpinBox() +// purpose : +//================================================================================= +void MyGEOMBase_Skeleton::initSpinBox( QSpinBox* spinBox, + int min, int max, int step ) +{ + spinBox->setRange( min, max ); + spinBox->setSingleStep( step ); +} + +//================================================================================= +// function : initSpinBox() +// purpose : +//================================================================================= +void MyGEOMBase_Skeleton::initSpinBox( SalomeApp_DoubleSpinBox* spinBox, + double min, double max, + double step, const char* quantity ) +{ + // Obtain precision from preferences + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", quantity, 6 ); + + spinBox->setPrecision( aPrecision ); + spinBox->setDecimals( qAbs( aPrecision ) ); // it's necessary to set decimals before the range setting, + // by default Qt rounds boundaries to 2 decimals at setRange + spinBox->setRange( min, max ); + spinBox->setSingleStep( step ); + + // Add a hint for the user saying how to tune precision + QString userPropName = QObject::tr( QString( "GEOM_PREF_%1" ).arg( quantity ).toLatin1().constData() ); + spinBox->setProperty( "validity_tune_hint", + QVariant( QObject::tr( "GEOM_PRECISION_HINT" ).arg( userPropName ) ) ); +} + +//================================================================================= +// function : updateAttributes() +// purpose : Workaround for Translation and Rotation operations with unchecked option "Create a copy". +// In this case PublishInStudy isn't called, so we need to update object's attributes manually +//================================================================================= +void MyGEOMBase_Skeleton::updateAttributes( GEOM::GEOM_Object_ptr theObj, + const QStringList& theParameters) +{ + SALOMEDS::Study_var aStudy = GeometryGUI::ClientStudyToStudy(getStudy()->studyDS()); + SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + SALOMEDS::SObject_var aSObject = aStudy->FindObjectID(theObj->GetStudyEntry()); + SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aSObject, "AttributeString"); + SALOMEDS::AttributeString_var aStringAttrib = SALOMEDS::AttributeString::_narrow(anAttr); + + std::string aValue = aStringAttrib->Value(); + if( aValue != "" ) + aValue += "|"; + for( int i = 0, n = theParameters.count(); i < n; i++ ) { + std::string aParameter = theParameters[i].toStdString(); + if(aStudy->IsVariable(aParameter.c_str())) + aValue += aParameter; + if(i != n-1) + aValue += ":"; + } + aStringAttrib->SetValue(aValue.c_str()); +} + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void MyGEOMBase_Skeleton::ClickOnCancel() +{ + close(); +} + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void MyGEOMBase_Skeleton::LineEditReturnPressed() +{ + if (!myEditCurrentArgument) + return; + + /* User name of object input management */ + /* If successfull the selection is changed and signal emitted... */ + /* so SelectionIntoArgument() is automatically called. */ + const QString objectUserName = myEditCurrentArgument->text(); + QWidget* thisWidget = (QWidget*)this; + + SALOME_ListIO aList; + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + if (aSelMgr) + aSelMgr->selectedObjects(aList); + if (GEOMBase::SelectionByNameInDialogs(thisWidget, objectUserName, aList)) + myEditCurrentArgument->setText(objectUserName); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void MyGEOMBase_Skeleton::DeactivateActiveDialog() +{ + this->setEnabled( false ); + globalSelection(); + if ( myGeomGUI ) { + myGeomGUI->SetActiveDialogBox( 0 ); + disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 ); + } + erasePreview(); +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void MyGEOMBase_Skeleton::ActivateThisDialog() +{ + /* Emit a signal to deactivate the active dialog */ + if ( myGeomGUI ) myGeomGUI->EmitSignalDeactivateDialog(); + this->setEnabled( true ); + if ( myGeomGUI ) myGeomGUI->SetActiveDialogBox( (QDialog*)this ); + return; +} + +//================================================================================= +// function : closeEvent() +// purpose : same than click on cancel button +//================================================================================= +void MyGEOMBase_Skeleton::closeEvent( QCloseEvent* e ) +{ + if ( myGeomGUI ) { + disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 ); + myGeomGUI->getApp()->updateActions(); + } + QDialog::closeEvent( e ); +} + +//================================================================================= +// function : initName() +// purpose : initialize the Name field with a string "thePrefix_X" (Vertex_3) +//================================================================================= +void MyGEOMBase_Skeleton::initName( const QString& thePrefix ) +{ + if ( !thePrefix.isNull() ) + setPrefix( thePrefix ); + myMainFrame->ResultName->setText( GEOMBase::GetDefaultName( getPrefix() ) ); +} + +//================================================================================= +// function : getNewObjectName() +// purpose : returns contents of Name field +//================================================================================= +QString MyGEOMBase_Skeleton::getNewObjectName() const +{ + return myMainFrame->ResultName->text(); +} + +//================================================================================= +// function : getConstructorId() +// purpose : +//================================================================================= +int MyGEOMBase_Skeleton::getConstructorId() const +{ + if ( myRBGroup ) + return myRBGroup->checkedId(); + return -1; +} + +//================================================================================= +// function : setConstructorId( id ) +// purpose : +//================================================================================= +void MyGEOMBase_Skeleton::setConstructorId( const int id ) +{ + if ( myRBGroup && myRBGroup->button( id ) ) + myRBGroup->button( id )->setChecked( true ); +} + +//================================================================================= +// function : unsetConstructorId +// purpose : +//================================================================================= +void MyGEOMBase_Skeleton::unsetConstructorId() +{ + // 0020428: EDF 906 GEOM : Performance for Group creation in GEOM + // uncheck all buttons + // workaround, because setChecked( false ) does not result in Qt4 + bool isExclusive = myRBGroup->exclusive(); + myRBGroup->setExclusive( false ); + QList btnList = myRBGroup->buttons(); + for ( int j = 0; j < 2; j++ ) + { + QList::const_iterator it = btnList.constBegin(); + for ( ; it != btnList.constEnd(); ++it ) + (*it)->setCheckable( j == 1 ); + } + myRBGroup->setExclusive( isExclusive ); +} + +//================================================================================= +// function : ClickOnHelp() +// purpose : +//================================================================================= +void MyGEOMBase_Skeleton::ClickOnHelp() +{ + LightApp_Application* app = (LightApp_Application*)( SUIT_Session::session()->activeApplication() ); + if ( app ) + app->onHelpContextModule( myGeomGUI ? app->moduleName( myGeomGUI->moduleName() ) : QString(""), myHelpFileName ); + else { + QString platform; +#ifdef WIN32 + platform = "winapplication"; +#else + platform = "application"; +#endif + SUIT_MessageBox::warning( 0, QObject::tr( "WRN_WARNING" ), + QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ). + arg( app->resourceMgr()->stringValue( "ExternalBrowser", platform ) ).arg( myHelpFileName ), + QObject::tr( "BUT_OK" ) ); + } +} + +//================================================================================= +// function : setHelpFileName() +// purpose : set name for help file html +//================================================================================= +void MyGEOMBase_Skeleton::setHelpFileName( const QString& theName ) +{ + myHelpFileName = theName; +} + +MyDlgRef_Skeleton* MyGEOMBase_Skeleton::mainFrame() +{ + return myMainFrame; +} + +QWidget* MyGEOMBase_Skeleton::centralWidget() +{ + return myMainFrame->GroupMedium; +} + +QPushButton* MyGEOMBase_Skeleton::buttonCancel() const +{ + return myMainFrame->buttonCancel; +} + +/*QPushButton* MyGEOMBase_Skeleton::buttonOk() const +{ + return myMainFrame->buttonOk; +}*/ + +QPushButton* MyGEOMBase_Skeleton::buttonApply() const +{ + return myMainFrame->buttonApply; +} + +QPushButton* MyGEOMBase_Skeleton::buttonHelp() const +{ + return myMainFrame->buttonHelp; +} + +//================================================================================= +// function : keyPressEvent() +// purpose : +//================================================================================= +void MyGEOMBase_Skeleton::keyPressEvent( QKeyEvent* e ) +{ + QDialog::keyPressEvent( e ); + if ( e->isAccepted() ) + return; + + if ( e->key() == Qt::Key_F1 ) { + e->accept(); + ClickOnHelp(); + } +} + + +//================================================================================= +// function : showOnlyPreviewControl() +// purpose : display only CheckBoxPreview check box, +// hide CheckBoxRestoreSS and CheckBoxAddPrefix +//================================================================================= +void MyGEOMBase_Skeleton::showOnlyPreviewControl(){ + mainFrame()->GroupBoxPublish->show(); + mainFrame()->CheckBoxRestoreSS->hide(); + mainFrame()->CheckBoxAddPrefix->hide(); +} + +//================================================================================= +// function : processPreview() +// purpose : Display preview if CheckBoxPreview is checked +//================================================================================= +void MyGEOMBase_Skeleton::processPreview() { + displayPreview(mainFrame()->CheckBoxPreview->isChecked()); +} diff --git a/src/HEXABLOCKGUI/MyGEOMBase_Skeleton.hxx b/src/HEXABLOCKGUI/MyGEOMBase_Skeleton.hxx new file mode 100755 index 0000000..76defa6 --- /dev/null +++ b/src/HEXABLOCKGUI/MyGEOMBase_Skeleton.hxx @@ -0,0 +1,113 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef MYGEOMBASE_SKELETON_H +#define MYGEOMBASE_SKELETON_H + +#include "GEOM_GEOMBase.hxx" +#include "MyGEOMBase_Helper.hxx" + +#include + +class SalomeApp_DoubleSpinBox; +class GeometryGUI; +class MyDlgRef_Skeleton; +class QSpinBox; +class QDoubleSpinBox; +class QLineEdit; +class QButtonGroup; +class QPushButton; + +#ifndef COORD_MIN +# define COORD_MIN -1e+15 +# define COORD_MAX +1e+15 +# define MAX_NUMBER 100000 +# define DBL_DIGITS_DISPLAY 16 +#endif // COORD_MIN + +class GEOMBASE_EXPORT MyGEOMBase_Skeleton : public QDialog, public MyGEOMBase_Helper +{ + Q_OBJECT + +public: + MyGEOMBase_Skeleton( GeometryGUI*, QWidget* = 0, bool = false, Qt::WindowFlags = 0 ); + ~MyGEOMBase_Skeleton(); + +private: + void Init(); + +protected: + void initSpinBox( QSpinBox*, int, int, int = 1 ); + void initSpinBox( SalomeApp_DoubleSpinBox*, double, double, double = 0.1, const char* = "length_precision" ); + + void updateAttributes( GEOM::GEOM_Object_ptr, const QStringList& ); + + void closeEvent( QCloseEvent* ); + void keyPressEvent( QKeyEvent* ); + + /*! initialize "Name" field with a string "thePrefix_X" (Vertex_3) + */ + void initName( const QString& = QString() ); + + /*! returns contents of "Name" field + */ + virtual QString getNewObjectName() const; + + /*! returns id of a selected "constructor" radio button or '-1' in case of error + */ + int getConstructorId() const; + /*! set selected "constructor" radio button id + */ + void setConstructorId( const int ); + /*! unset selection on all "constructor" radio buttons + */ + void unsetConstructorId(); + + void showOnlyPreviewControl(); + + void setHelpFileName( const QString& ); + + MyDlgRef_Skeleton* mainFrame(); + QWidget* centralWidget(); + QPushButton* buttonCancel() const; + //QPushButton* buttonOk() const; + QPushButton* buttonApply() const; + QPushButton* buttonHelp() const; + +protected: + QLineEdit* myEditCurrentArgument; //!< Current LineEdit + GeometryGUI* myGeomGUI; //!< reference GEOM GUI + QString myHelpFileName; //!< Associated HTML help file name + + QButtonGroup* myRBGroup; //!< radio button group + MyDlgRef_Skeleton* myMainFrame; //!< dialog box's mainframe widgetx + +protected slots: + virtual void ClickOnCancel(); + virtual void processPreview(); + void LineEditReturnPressed(); + void DeactivateActiveDialog(); + void ActivateThisDialog(); + void ClickOnHelp(); + +signals: + void constructorsClicked( int ); +}; + +#endif // MYGEOMBASE_SKELETON_H diff --git a/src/HEXABLOCKGUI/Pipe_QTD.ui b/src/HEXABLOCKGUI/Pipe_QTD.ui new file mode 100644 index 0000000..cd5fa44 --- /dev/null +++ b/src/HEXABLOCKGUI/Pipe_QTD.ui @@ -0,0 +1,195 @@ + + + PipeDialog + + + + 0 + 0 + 297 + 241 + + + + + 0 + 0 + + + + + 5 + 0 + + + + Pipe Construction + + + + + + + 5 + 0 + + + + Arguments + + + + + + Point + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + Vector + + + + + + + + 127 + 16777215 + + + + false + + + + + + + internal radius + + + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + external radius + + + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + 2.000000000000000 + + + + + + + height + + + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + Name + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/PrismQuad_QTD.ui b/src/HEXABLOCKGUI/PrismQuad_QTD.ui new file mode 100644 index 0000000..daa9ece --- /dev/null +++ b/src/HEXABLOCKGUI/PrismQuad_QTD.ui @@ -0,0 +1,106 @@ + + + PrismQuadDialog + + + + 0 + 0 + 318 + 381 + + + + + 0 + 0 + + + + + 5 + 0 + + + + Prism Quad(s) Operation + + + + + + + 5 + 0 + + + + Arguments + + + + + + Quad(s) + + + + + + + + + + + + Direction + + + + + + Vector + + + + + + + + 127 + 16777215 + + + + false + + + + + + + nb + + + + + + + 1000000 + + + 1 + + + + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/Propagation_QTD.ui b/src/HEXABLOCKGUI/Propagation_QTD.ui new file mode 100644 index 0000000..d56c98e --- /dev/null +++ b/src/HEXABLOCKGUI/Propagation_QTD.ui @@ -0,0 +1,129 @@ + + + PropagationDialog + + + + 0 + 0 + 196 + 297 + + + + + 0 + 0 + + + + Propagation + + + + + + Arguments + + + + + + + 16777215 + 131 + + + + Propagation(s) + + + + + + + + + + + + Law + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + way + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::NoButton + + + false + + + + + + + + + buttonBox + accepted() + PropagationDialog + accept() + + + 403 + 725 + + + 157 + 274 + + + + + buttonBox + rejected() + PropagationDialog + reject() + + + 403 + 725 + + + 286 + 274 + + + + + diff --git a/src/HEXABLOCKGUI/QuadAssoc_QTD.ui b/src/HEXABLOCKGUI/QuadAssoc_QTD.ui new file mode 100644 index 0000000..e302fa9 --- /dev/null +++ b/src/HEXABLOCKGUI/QuadAssoc_QTD.ui @@ -0,0 +1,101 @@ + + + QuadAssocDialog + + + + 0 + 0 + 260 + 280 + + + + + 0 + 0 + + + + + 260 + 0 + + + + Quad Association + + + + + + + 5 + 0 + + + + Arguments + + + + + + + 16777215 + 58 + + + + Quad + + + + + + + 0 + 0 + + + + false + + + + + + + + + + + 16777215 + 156 + + + + Face(s) + + + + + + + 0 + 0 + + + + + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/QuadRevolution_QTD.ui b/src/HEXABLOCKGUI/QuadRevolution_QTD.ui new file mode 100644 index 0000000..406af8f --- /dev/null +++ b/src/HEXABLOCKGUI/QuadRevolution_QTD.ui @@ -0,0 +1,196 @@ + + + QuadRevolutionDialog + + + + 0 + 0 + 279 + 451 + + + + + 5 + 0 + + + + Quad(s) Revolution + + + + + + + 5 + 0 + + + + Result Name + + + + + + Name : + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + + + + + + + + + 5 + 0 + + + + Arguments + + + + + + Quads : + + + + + + + + + + Center : + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + Select a vertex + + + + false + + + + + + + Axis : + + + + + + + + 127 + 16777215 + + + + Select a vector + + + + false + + + + + + + true + + + + 0 + 0 + + + + + + + + + + + + + 0 + 0 + + + + - + + + + + + + Angles : + + + + + + + Qt::Vertical + + + + 20 + 45 + + + + + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/Quad_QTD.ui b/src/HEXABLOCKGUI/Quad_QTD.ui new file mode 100755 index 0000000..dd0c95f --- /dev/null +++ b/src/HEXABLOCKGUI/Quad_QTD.ui @@ -0,0 +1,373 @@ + + + QuadDialog + + + + 0 + 0 + 255 + 437 + + + + + 0 + 0 + + + + + 5 + 0 + + + + Quad Construction + + + + QLayout::SetMinimumSize + + + + + + 0 + 0 + + + + + 5 + 0 + + + + Quad + + + + + + + 0 + 0 + + + + vertices + + + true + + + + + + + + 0 + 0 + + + + edges + + + + + + + + + + + 5 + 0 + + + + Arguments + + + + + + Name + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + + + + + + + + Vertex 1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Vertex 2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Vertex 3 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Vertex 4 + + + + + + + + 127 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + edge 1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + edge 2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + edge 3 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + edge 4 + + + + + + + + 127 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + + + rb0 + clicked() + widget + show() + + + 86 + 46 + + + 85 + 106 + + + + + rb0 + clicked() + widget_2 + hide() + + + 174 + 50 + + + 192 + 263 + + + + + rb1 + clicked() + widget_2 + show() + + + 297 + 46 + + + 310 + 264 + + + + + rb1 + clicked() + widget + hide() + + + 353 + 49 + + + 351 + 110 + + + + + diff --git a/src/HEXABLOCKGUI/RemoveHexa_QTD.ui b/src/HEXABLOCKGUI/RemoveHexa_QTD.ui new file mode 100644 index 0000000..703a519 --- /dev/null +++ b/src/HEXABLOCKGUI/RemoveHexa_QTD.ui @@ -0,0 +1,75 @@ + + + RemoveHexaDialog + + + + 0 + 0 + 225 + 103 + + + + + 0 + 0 + + + + + 5 + 0 + + + + Remove Hexa + + + + + + + 5 + 0 + + + + Arguments + + + + + + Hexa + + + + + + + + 127 + 16777215 + + + + false + + + + + + + including connected hexa + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/ReplaceHexa_QTD.ui b/src/HEXABLOCKGUI/ReplaceHexa_QTD.ui new file mode 100644 index 0000000..12ac32d --- /dev/null +++ b/src/HEXABLOCKGUI/ReplaceHexa_QTD.ui @@ -0,0 +1,264 @@ + + + ReplaceHexaDialog + + + + 0 + 0 + 229 + 459 + + + + + 5 + 0 + + + + Replace Hexahedron + + + + + + + 5 + 0 + + + + Result Name + + + + + + Name + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + + + + + + + + + 5 + 0 + + + + Arguments + + + + + + Quad(s) source + + + + + + Select hexa + + + + + + + Point a + + + + + + + + 0 + 0 + + + + Select vertex + + + + + + false + + + + + + + Point b + + + + + + + + 0 + 0 + + + + Select vertex + + + + + + false + + + + + + + Point c + + + + + + + + 0 + 0 + + + + Select vertex + + + + + + false + + + + + + + + + + Quad destination + + + + QFormLayout::ExpandingFieldsGrow + + + + + Point a + + + + + + + + 0 + 0 + + + + Select vertex + + + + + + false + + + + + + + Point b + + + + + + + + 0 + 0 + + + + Select vertex + + + + + + false + + + + + + + Point c + + + + + + + + 0 + 0 + + + + Select vertex + + + + + + false + + + + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/Resource.cxx b/src/HEXABLOCKGUI/Resource.cxx new file mode 100755 index 0000000..137107e --- /dev/null +++ b/src/HEXABLOCKGUI/Resource.cxx @@ -0,0 +1,147 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "Resource.hxx" + +using namespace HEXABLOCK::GUI; + +// Statics for general resources +// ----------------------------- + +bool Resource::COMPONENT_INSTANCE_NEW = COMPONENTINSTANCENEW; +QString Resource::userCatalog = USERCATALOG; +bool Resource::addRowCols = ADDROWCOLS; +bool Resource::straightLinks = STRAIGHTLINKS; +bool Resource::autoComputeLinks = AUTOCOMPUTELINKS; +bool Resource::simplifyLink = SIMPLIFYLINK; +bool Resource::ensureVisibleWhenMoved = ENSUREVISIBLEWHENMOVED; + +// Statics for color of states +// --------------------------- + +QColor Resource::editedNodeBrushColor = EDITEDNODEBRUSHCOLOR; +QColor Resource::normalNodeBrushColor = NORMALNODEBRUSHCOLOR; +QColor Resource::runNodeBrushColor = RUNNODEBRUSHCOLOR; +QColor Resource::validNodeColor = VALIDNODECOLOR; +QColor Resource::invalidNodeColor = INVALIDNODECOLOR; + +QColor Resource::emphasizeBrushColor = EMPHASIZEBRUSHCOLOR; + +QColor Resource::NOTYETINITIALIZED = NOTYETINITIALIZED_; +QColor Resource::INITIALISED = INITIALISED_; +QColor Resource::RUNNING = RUNNING_; +QColor Resource::WAITINGTASKS = WAITINGTASKS_; +QColor Resource::PAUSED = PAUSED_; +QColor Resource::FINISHED = FINISHED_; +QColor Resource::STOPPED = STOPPED_; +QColor Resource::UNKNOWN = UNKNOWN_; + +QColor Resource::UNDEFINED = UNDEFINED_; +QColor Resource::INVALID = INVALID_; +QColor Resource::READY = READY_; +QColor Resource::TOLOAD = TOLOAD_; +QColor Resource::LOADED = LOADED_; +QColor Resource::TOACTIVATE = TOACTIVATE_; +QColor Resource::ACTIVATED = ACTIVATED_; +QColor Resource::DESACTIVATED = DESACTIVATED_; +QColor Resource::DONE = DONE_; +QColor Resource::SUSPENDED = SUSPENDED_; +QColor Resource::LOADFAILED = LOADFAILED_; +QColor Resource::EXECFAILED = EXECFAILED_; +QColor Resource::PAUSE = PAUSE_; +QColor Resource::INTERNALERR = INTERNALERR_; +QColor Resource::DISABLED = DISABLED_; +QColor Resource::FAILED = FAILED_; +QColor Resource::ERROR = ERROR_; +QColor Resource::DEFAULT = DEFAULT_; + +// Statics for color of links +// -------------------------- + +QFont Resource::pythonfont = PYTHONFONT; + +QColor Resource::link_draw_color = LINKDRAW_COLOR; +QColor Resource::stream_link_draw_color = STREAMLINKDRAW_COLOR; +QColor Resource::stream_link_select_color = STREAMLINK_SELECT_COLOR; +QColor Resource::link_select_color = LINK_SELECT_COLOR; +QColor Resource::control_link_select_color = CTRLLINK_SELECT_COLOR; +QColor Resource::control_link_draw_color = CTRLLINKDRAW_COLOR; + +int Resource::link_pen_darkness = LINK_PEN_DARKNESS; + +// Statics for color of nodes +// -------------------------- + +QColor Resource::Scene_pen = Scene_pen_; +QColor Resource::Scene_hiPen = Scene_hiPen_; +QColor Resource::Scene_brush = Scene_brush_; +QColor Resource::Scene_hiBrush = Scene_hiBrush_; +QColor Resource::ComposedNode_brush = ComposedNode_brush_; +QColor Resource::ComposedNode_hiBrush = ComposedNode_hiBrush_; +QColor Resource::ComposedNode_pen = ComposedNode_pen_; +QColor Resource::ComposedNode_hiPen = ComposedNode_hiPen_; +QColor Resource::ElementaryNode_brush = ElementaryNode_brush_; +QColor Resource::ElementaryNode_hiBrush = ElementaryNode_hiBrush_; +QColor Resource::ElementaryNode_pen = ElementaryNode_pen_; +QColor Resource::ElementaryNode_hiPen = ElementaryNode_hiPen_; +QColor Resource::Header_brush = Header_brush_; +QColor Resource::Header_hiBrush = Header_hiBrush_; +QColor Resource::Header_pen = Header_pen_; +QColor Resource::Header_hiPen = Header_hiPen_; +QColor Resource::CtrlPort_brush = CtrlPort_brush_; +QColor Resource::CtrlPort_hiBrush = CtrlPort_hiBrush_; +QColor Resource::CtrlPort_pen = CtrlPort_pen_; +QColor Resource::CtrlPort_hiPen = CtrlPort_hiPen_; +QColor Resource::DataPort_brush = DataPort_brush_; +QColor Resource::DataPort_hiBrush = DataPort_hiBrush_; +QColor Resource::DataPort_pen = DataPort_pen_; +QColor Resource::DataPort_hiPen = DataPort_hiPen_; + +QColor Resource::dragOver = dragOver_; + +// Statics for geometry values for nodes +// ------------------------------------- + +int Resource::CtrlPort_Width = 24; +int Resource::CtrlPort_Height = 20; +int Resource::DataPort_Width = 72; +int Resource::DataPort_Height = 25; + +int Resource::Thickness = 1; + +int Resource::Border_Margin = 4; +int Resource::Space_Margin = 2; + +int Resource::Line_Space = 2; +int Resource::Line_Width = 2; + +int Resource::Text_DX = 3; + +int Resource::Corner_Margin = ( Resource::Border_Margin + Resource::Space_Margin ); +int Resource::Header_Height = ( Resource::Corner_Margin + Resource::CtrlPort_Height + Resource::Line_Space + Resource::Line_Width + Resource::Line_Space ); +int Resource::Radius = 3; + +bool Resource::tabPanelsUp = TABPANELSUP; + +// Constructor +// ----------- + +Resource::Resource() +{ +} diff --git a/src/HEXABLOCKGUI/Resource.hxx b/src/HEXABLOCKGUI/Resource.hxx new file mode 100755 index 0000000..284348e --- /dev/null +++ b/src/HEXABLOCKGUI/Resource.hxx @@ -0,0 +1,303 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _RESOURCE_HXX_ +#define _RESOURCE_HXX_ + +#include "HEXABLOCKGUI_Export.hxx" + +#include +#include + +// Define the general names of the resources +// ----------------------------------------- + +#define _COMPONENT_INSTANCE_NEW "COMPONENT_INSTANCE_NEW" + +// Define the names of the resources for colors +// -------------------------------------------- + +#define _editedNodeBrushColor "editedNodeBrushColor" +#define _normalNodeBrushColor "normalNodeBrushColor" +#define _runNodeBrushColor "runNodeBrushColor" +#define _validNodeColor "validNodeColor" +#define _invalidNodeColor "invalidNodeColor" + +#define _NOTYETINITIALIZED "NOTYETINITIALIZED" +#define _INITIALISED "INITIALISED" +#define _RUNNING "RUNNING" +#define _WAITINGTASKS "WAITINGTASKS" +#define _PAUSED "PAUSED" +#define _FINISHED "FINISHED" +#define _STOPPED "STOPPED" +#define _UNKNOWN "UNKNOWN" + +#define _UNDEFINED "UNDEFINED" +#define _INVALID "INVALID" +#define _READY "READY" +#define _TOLOAD "TOLOAD" +#define _LOADED "LOADED" +#define _TOACTIVATE "TOACTIVATE" +#define _ACTIVATED "ACTIVATED" +#define _DESACTIVATED "DESACTIVATED" +#define _DONE "DONE" +#define _SUSPENDED "SUSPENDED" +#define _LOADFAILED "LOADFAILED" +#define _EXECFAILED "EXECFAILED" +#define _PAUSE "PAUSE" +#define _INTERNALERR "INTERNALERR" +#define _DISABLED "DISABLED" +#define _FAILED "FAILED" +#define _ERROR "ERROR" +#define _DEFAULT "DEFAULT" + +#define _Scene_pen "Scene_pen" +#define _Scene_hiPen "Scene_hiPen" +#define _Scene_brush "Scene_brush" +#define _Scene_hiBrush "Scene_hiBrush" +#define _ComposedNode_brush "ComposedNode_brush" +#define _ComposedNode_hiBrush "ComposedNode_hiBrush" +#define _ComposedNode_pen "ComposedNode_pen" +#define _ComposedNode_hiPen "ComposedNode_hiPen" +#define _ElementaryNode_brush "ElementaryNode_brush" +#define _ElementaryNode_hiBrush "ElementaryNode_hiBrush" +#define _ElementaryNode_pen "ElementaryNode_pen" +#define _ElementaryNode_hiPen "ElementaryNode_hiPen" +#define _Header_brush "Header_brush" +#define _Header_hiBrush "Header_hiBrush" +#define _Header_pen "Header_pen" +#define _Header_hiPen "Header_hiPen" +#define _CtrlPort_brush "CtrlPort_brush" +#define _CtrlPort_hiBrush "CtrlPort_hiBrush" +#define _CtrlPort_pen "CtrlPort_pen" +#define _CtrlPort_hiPen "CtrlPort_hiPen" +#define _DataPort_brush "DataPort_brush" +#define _DataPort_hiBrush "DataPort_hiBrush" +#define _DataPort_pen "DataPort_pen" +#define _DataPort_hiPen "DataPort_hiPen" + +#define __dragOver "dragOver" + +// Default values +// -------------- + +#define COMPONENTINSTANCENEW true +#define PYTHONFONT QFont("Courier") +#define USERCATALOG "HEXABLOCKUserCatalog.xml" +#define ADDROWCOLS true +#define STRAIGHTLINKS false +#define AUTOCOMPUTELINKS true +#define SIMPLIFYLINK true +#define ENSUREVISIBLEWHENMOVED true +#define TABPANELSUP true + +#define EDITEDNODEBRUSHCOLOR QColor(255, 255, 190) +#define NORMALNODEBRUSHCOLOR QColor(230, 235, 255) +#define RUNNODEBRUSHCOLOR QColor(205, 218, 255) +#define VALIDNODECOLOR QColor(128, 255, 128) +#define INVALIDNODECOLOR QColor(255, 128, 128) + +#define EMPHASIZEBRUSHCOLOR QColor( 0, 255, 0) + +#define NOTYETINITIALIZED_ QColor(255, 243, 205) +#define INITIALISED_ QColor(230, 255, 205) +#define RUNNING_ QColor(205, 255, 218) +#define WAITINGTASKS_ QColor(205, 255, 255) +#define PAUSED_ QColor(205, 218, 255) +#define FINISHED_ QColor(230, 205, 255) +#define STOPPED_ QColor(255, 205, 243) +#define UNKNOWN_ QColor(255, 205, 205) + +#define UNDEFINED_ Qt::lightGray +#define INVALID_ Qt::red +#define READY_ Qt::gray +#define TOLOAD_ Qt::darkYellow +#define LOADED_ Qt::darkMagenta +#define TOACTIVATE_ Qt::darkCyan +#define ACTIVATED_ Qt::darkBlue +#define DESACTIVATED_ Qt::gray +#define DONE_ Qt::darkGreen +#define SUSPENDED_ Qt::gray +#define LOADFAILED_ QColor(255, 0, 170) +#define EXECFAILED_ QColor(255, 85, 0) +#define PAUSE_ QColor(0, 255, 255) +#define INTERNALERR_ QColor(255, 0, 85) +#define DISABLED_ QColor(255, 170, 0) +#define FAILED_ QColor(170, 85, 0) +#define ERROR_ QColor(255, 0, 0) +#define DEFAULT_ Qt::lightGray + +#define LINKDRAW_COLOR QColor( 0, 0, 192) +#define LINK_SELECT_COLOR QColor(192, 192, 255) +#define STREAMLINKDRAW_COLOR QColor(192, 192, 0) +#define STREAMLINK_SELECT_COLOR QColor(255, 255, 192) +#define CTRLLINKDRAW_COLOR QColor(192, 0, 192) +#define CTRLLINK_SELECT_COLOR QColor(255, 192, 255) +#define LINK_PEN_DARKNESS 150 + +#define Scene_pen_ QColor( 0, 0, 128) +#define Scene_hiPen_ QColor( 0, 0, 190) +#define Scene_brush_ QColor(128, 128, 128) +#define Scene_hiBrush_ QColor(190, 190, 190) +#define ComposedNode_brush_ QColor(213, 213, 213) +#define ComposedNode_hiBrush_ QColor(225, 225, 225) +#define ComposedNode_pen_ QColor(120, 120, 120) +#define ComposedNode_hiPen_ QColor( 60, 60, 60) +#define ElementaryNode_brush_ QColor(189, 230, 185) +#define ElementaryNode_hiBrush_ QColor(209, 255, 205) +#define ElementaryNode_pen_ QColor( 15, 180, 0) +#define ElementaryNode_hiPen_ QColor( 11, 128, 0) +#define Header_brush_ QColor(215, 220, 238) +#define Header_hiBrush_ QColor(161, 178, 238) +#define Header_pen_ QColor(120, 120, 120) +#define Header_hiPen_ QColor( 60, 60, 60) +#define CtrlPort_brush_ QColor(205, 210, 227) +#define CtrlPort_hiBrush_ QColor(161, 176, 227) +#define CtrlPort_pen_ QColor(120, 120, 120) +#define CtrlPort_hiPen_ QColor( 60, 60, 60) +#define DataPort_brush_ QColor(158, 227, 151) +#define DataPort_hiBrush_ QColor(127, 227, 116) +#define DataPort_pen_ QColor( 15, 180, 0) +#define DataPort_hiPen_ QColor( 11, 128, 0) + +#define dragOver_ QColor(255, 0, 0) + +// Define Resource class +// --------------------- + +namespace HEXABLOCK { + namespace GUI { + class HEXABLOCKGUI_EXPORT Resource { + public: + Resource(); + + public: + // General resource + static bool COMPONENT_INSTANCE_NEW; + static QString userCatalog; + static bool addRowCols; + static bool straightLinks; + static bool autoComputeLinks; + static bool simplifyLink; + static bool ensureVisibleWhenMoved; + + // Colors of state of nodes + static QColor editedNodeBrushColor; + static QColor normalNodeBrushColor; + static QColor runNodeBrushColor; + static QColor validNodeColor; + static QColor invalidNodeColor; + + static QColor emphasizeBrushColor; + + static QColor NOTYETINITIALIZED; + static QColor INITIALISED; + static QColor RUNNING; + static QColor WAITINGTASKS; + static QColor PAUSED; + static QColor FINISHED; + static QColor STOPPED; + static QColor UNKNOWN; + + static QColor UNDEFINED; + static QColor INVALID; + static QColor READY; + static QColor TOLOAD; + static QColor LOADED; + static QColor TOACTIVATE; + static QColor ACTIVATED; + static QColor DESACTIVATED; + static QColor DONE; + static QColor SUSPENDED; + static QColor LOADFAILED; + static QColor EXECFAILED; + static QColor PAUSE; + static QColor INTERNALERR; + static QColor DISABLED; + static QColor FAILED; + static QColor ERROR; + static QColor DEFAULT; + + // Python font + static QFont pythonfont; + + // Link colors + static QColor link_draw_color; + static QColor stream_link_draw_color; + static QColor link_select_color; + static QColor stream_link_select_color; + static QColor control_link_draw_color; + static QColor control_link_select_color; + + static int link_pen_darkness; + + // Node colors + static QColor Scene_pen; + static QColor Scene_hiPen; + static QColor Scene_brush; + static QColor Scene_hiBrush; + static QColor ComposedNode_brush; + static QColor ComposedNode_hiBrush; + static QColor ComposedNode_pen; + static QColor ComposedNode_hiPen; + static QColor ElementaryNode_brush; + static QColor ElementaryNode_hiBrush; + static QColor ElementaryNode_pen; + static QColor ElementaryNode_hiPen; + static QColor Header_brush; + static QColor Header_hiBrush; + static QColor Header_pen; + static QColor Header_hiPen; + static QColor CtrlPort_brush; + static QColor CtrlPort_hiBrush; + static QColor CtrlPort_pen; + static QColor CtrlPort_hiPen; + static QColor DataPort_brush; + static QColor DataPort_hiBrush; + static QColor DataPort_pen; + static QColor DataPort_hiPen; + + static QColor dragOver; + + // Node parameters + static int CtrlPort_Width; + static int CtrlPort_Height; + static int DataPort_Width; + static int DataPort_Height; + + static int Thickness; + + static int Border_Margin; + static int Space_Margin; + + static int Line_Space; + static int Line_Width; + + static int Text_DX; + + static int Corner_Margin; + static int Header_Height; + static int Radius; + + static bool tabPanelsUp; + }; + } +} + +#endif diff --git a/src/HEXABLOCKGUI/Symmetry_QTD.ui b/src/HEXABLOCKGUI/Symmetry_QTD.ui new file mode 100644 index 0000000..391b69b --- /dev/null +++ b/src/HEXABLOCKGUI/Symmetry_QTD.ui @@ -0,0 +1,446 @@ + + + SymmetryDialog + + + + 0 + 0 + 244 + 466 + + + + + 0 + 0 + + + + + 5 + 0 + + + + Symmetry Operation + + + + QLayout::SetMinimumSize + + + + + + 0 + 0 + + + + + 5 + 50 + + + + + 16777215 + 50 + + + + Make + + + + + + + 0 + 0 + + + + Point + + + true + + + + + + + + 0 + 0 + + + + Line + + + + + + + Plan + + + + + + + + + + + 5 + 0 + + + + Arguments + + + + + + + QFormLayout::ExpandingFieldsGrow + + + + + elements + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vertex + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + elements + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vertex + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vector + + + + + + + + + + + + + elements + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vertex + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vector + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + + + rb0 + clicked() + widget + show() + + + 61 + 48 + + + 76 + 104 + + + + + rb0 + clicked() + widget_2 + hide() + + + 94 + 46 + + + 181 + 180 + + + + + rb0 + clicked() + widget_3 + hide() + + + 41 + 49 + + + 73 + 310 + + + + + rb1 + clicked() + widget + hide() + + + 153 + 51 + + + 143 + 109 + + + + + rb1 + clicked() + widget_2 + show() + + + 197 + 48 + + + 218 + 182 + + + + + rb1 + clicked() + widget_3 + hide() + + + 182 + 38 + + + 190 + 310 + + + + + rb2 + clicked() + widget_3 + show() + + + 258 + 46 + + + 238 + 310 + + + + + rb2 + clicked() + widget_2 + hide() + + + 271 + 46 + + + 268 + 194 + + + + + rb2 + clicked() + widget + hide() + + + 255 + 48 + + + 250 + 111 + + + + + diff --git a/src/HEXABLOCKGUI/Transformation_QTD.ui b/src/HEXABLOCKGUI/Transformation_QTD.ui new file mode 100644 index 0000000..2a175b9 --- /dev/null +++ b/src/HEXABLOCKGUI/Transformation_QTD.ui @@ -0,0 +1,463 @@ + + + TransformationDialog + + + + 0 + 0 + 312 + 483 + + + + + 0 + 0 + + + + Transform Operation + + + + QLayout::SetMinimumSize + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Make + + + + + + + 0 + 0 + + + + Translation + + + true + + + + + + + + 0 + 0 + + + + Scale + + + + + + + + 0 + 0 + + + + Rotation + + + + + + + + + + Arguments + + + + + + + QFormLayout::ExpandingFieldsGrow + + + + + elements + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vector + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vertex + + + + + + + + 127 + 16777215 + + + + false + + + + + + + k + + + + + + + 6 + + + 1000000000.000000000000000 + + + 1.000000000000000 + + + + + + + elements + + + + + + + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vertex + + + + + + + + 127 + 16777215 + + + + false + + + + + + + vector + + + + + + + + 127 + 16777215 + + + + false + + + + + + + angle + + + + + + + false + + + + + + + + + 6 + + + 360.000000000000000 + + + 360.000000000000000 + + + + + + + elements + + + + + + + + + + + + + + + rb0 + clicked() + widget + show() + + + 61 + 48 + + + 76 + 104 + + + + + rb0 + clicked() + widget_2 + hide() + + + 94 + 46 + + + 181 + 180 + + + + + rb0 + clicked() + widget_3 + hide() + + + 41 + 49 + + + 73 + 310 + + + + + rb1 + clicked() + widget + hide() + + + 153 + 51 + + + 143 + 109 + + + + + rb1 + clicked() + widget_2 + show() + + + 197 + 48 + + + 218 + 182 + + + + + rb1 + clicked() + widget_3 + hide() + + + 182 + 38 + + + 190 + 310 + + + + + rb2 + clicked() + widget_3 + show() + + + 258 + 46 + + + 238 + 310 + + + + + rb2 + clicked() + widget_2 + hide() + + + 271 + 46 + + + 268 + 194 + + + + + rb2 + clicked() + widget + hide() + + + 255 + 48 + + + 250 + 111 + + + + + diff --git a/src/HEXABLOCKGUI/Vector_QTD.ui b/src/HEXABLOCKGUI/Vector_QTD.ui new file mode 100644 index 0000000..1b9eef8 --- /dev/null +++ b/src/HEXABLOCKGUI/Vector_QTD.ui @@ -0,0 +1,322 @@ + + + VectorDialog + + + + 0 + 0 + 284 + 359 + + + + + 0 + 0 + + + + Vector Construction + + + + QLayout::SetMinimumSize + + + + + + 0 + 0 + + + + Vector + + + + + + + 0 + 0 + + + + ( dx, dy, dz ) + + + true + + + + + + + + 0 + 0 + + + + ( vertex + vertex ) + + + + + + + + + + Arguments + + + + + + Name + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + + + + + + + + + 0 + 0 + + + + dx : + + + + + + + + 0 + 0 + + + + 6 + + + -1000000000.000000000000000 + + + 1000000000.000000000000000 + + + 0.000000000000000 + + + + + + + + 0 + 0 + + + + dy : + + + + + + + + 0 + 0 + + + + 6 + + + -1000000000.000000000000000 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + dz : + + + + + + + + 0 + 0 + + + + 6 + + + -1000000000.000000000000000 + + + 1000000000.000000000000000 + + + + + + + + + + + + + Point 1 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + Point 2 + + + + + + + + 127 + 16777215 + + + + false + + + + + + + + + + + + + + + rb0 + clicked() + widget + show() + + + 75 + 46 + + + 75 + 107 + + + + + rb0 + clicked() + widget_2 + hide() + + + 145 + 49 + + + 157 + 236 + + + + + rb1 + clicked() + widget_2 + show() + + + 251 + 43 + + + 253 + 242 + + + + + rb1 + clicked() + widget + hide() + + + 222 + 47 + + + 210 + 111 + + + + + diff --git a/src/HEXABLOCKGUI/Vertex_QTD.ui b/src/HEXABLOCKGUI/Vertex_QTD.ui new file mode 100755 index 0000000..9ec0f48 --- /dev/null +++ b/src/HEXABLOCKGUI/Vertex_QTD.ui @@ -0,0 +1,164 @@ + + + VertexDialog + + + + 0 + 0 + 260 + 160 + + + + + 0 + 0 + + + + + 260 + 0 + + + + + 16777215 + 16777215 + + + + Vertex Construction + + + + QLayout::SetDefaultConstraint + + + + + Arguments + + + + QFormLayout::ExpandingFieldsGrow + + + + + Name + + + + + + + + 0 + 0 + + + + + 127 + 16777215 + + + + + + + + + 0 + 0 + + + + x : + + + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + y : + + + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + 0 + 0 + + + + z : + + + + + + + + 0 + 0 + + + + 6 + + + 1000000000.000000000000000 + + + + + + + + + + + diff --git a/src/HEXABLOCKGUI/klinkitemselectionmodel.cxx b/src/HEXABLOCKGUI/klinkitemselectionmodel.cxx new file mode 100644 index 0000000..d41011c --- /dev/null +++ b/src/HEXABLOCKGUI/klinkitemselectionmodel.cxx @@ -0,0 +1,126 @@ +/* + Copyright (C) 2010 Klarälvdalens Datakonsult AB, + a KDAB Group company, info@kdab.net, + author Stephen Kelly + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This library is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include +#include "klinkitemselectionmodel.hxx" +// #include "klinkitemselectionmodel_p.hxx" + +#include "kmodelindexproxymapper.hxx" + +// #include "kdebug.h" + +#include + +#include + + +KLinkItemSelectionModel::KLinkItemSelectionModel(QAbstractItemModel *model, QItemSelectionModel *proxySelector, QObject *parent) + : QItemSelectionModel(model, parent), + d_ptr(new KLinkItemSelectionModelPrivate(this, model, proxySelector)) +{ + connect(proxySelector, SIGNAL(selectionChanged(QItemSelection, QItemSelection)), SLOT(sourceSelectionChanged(QItemSelection, QItemSelection))); +} + +KLinkItemSelectionModel::~KLinkItemSelectionModel() +{ + delete d_ptr; +} + +void KLinkItemSelectionModel::select(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) +{ + //std::cout<<"KLinkItemSelectionModel::select(const QModelIndex &index"<m_ignoreCurrentChanged) { + return; + } + QItemSelectionModel::select(index, command); + if (index.isValid()) + d->m_linkedItemSelectionModel->select(d->m_indexMapper->mapSelectionLeftToRight(QItemSelection(index, index)), command); + else { + d->m_linkedItemSelectionModel->clearSelection(); + } +} + +// // QAbstractProxyModel::mapSelectionFromSource creates invalid ranges to we filter +// // those out manually in a loop. Hopefully fixed in Qt 4.7.2, so we ifdef it out. +// // http://qt.gitorious.org/qt/qt/merge_requests/2474 +// // http://qt.gitorious.org/qt/qt/merge_requests/831 +// #if QT_VERSION < 0x040702 +// #define RANGE_FIX_HACK +// #endif +// +// #ifdef RANGE_FIX_HACK +// static QItemSelection klink_removeInvalidRanges(const QItemSelection &selection) +// { +// QItemSelection result; +// Q_FOREACH(const QItemSelectionRange &range, selection) +// { +// if (!range.isValid()) +// continue; +// result << range; +// } +// return result; +// } +// #endif + +void KLinkItemSelectionModel::select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command) +{ + std::cout<<"KLinkItemSelectionModel::select(const QItemSelection &selection"<"< " << i.data().toString().toStdString() << std::endl; + } else { + std::cout<<"range NOT VALID"<m_ignoreCurrentChanged = true; +#ifdef RANGE_FIX_HACK + QItemSelection _selection = klink_removeInvalidRanges(selection); +#else + QItemSelection _selection = selection; +#endif + QItemSelectionModel::select(_selection, command); + Q_ASSERT(d->assertSelectionValid(_selection)); + QItemSelection mappedSelection = d->m_indexMapper->mapSelectionLeftToRight(_selection); + Q_ASSERT(d->assertSelectionValid(mappedSelection)); + d->m_linkedItemSelectionModel->select(mappedSelection, command); + d->m_ignoreCurrentChanged = false; +} + + + +// #include "klinkitemselectionmodel_moc.cxx" +// #include "klinkitemselectionmodel.moc" + diff --git a/src/HEXABLOCKGUI/klinkitemselectionmodel.hxx b/src/HEXABLOCKGUI/klinkitemselectionmodel.hxx new file mode 100644 index 0000000..b49219b --- /dev/null +++ b/src/HEXABLOCKGUI/klinkitemselectionmodel.hxx @@ -0,0 +1,161 @@ +/* + Copyright (C) 2010 Klarälvdalens Datakonsult AB, + a KDAB Group company, info@kdab.net, + author Stephen Kelly + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This library is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef KLINKITEMSELECTIONMODEL_H +#define KLINKITEMSELECTIONMODEL_H + +#include +#include +#include + +#include + +// #include "kdeui_export.h" +// #include "klinkitemselectionmodel_p.hxx" + +#include "kmodelindexproxymapper.hxx" + +class KLinkItemSelectionModelPrivate; + +class KLinkItemSelectionModel : public QItemSelectionModel +{ + Q_OBJECT +public: + KLinkItemSelectionModel(QAbstractItemModel *targetModel, QItemSelectionModel *linkedItemSelectionModel, QObject *parent = 0); + ~KLinkItemSelectionModel(); + /* reimp */ void select(const QModelIndex &index, QItemSelectionModel::SelectionFlags command); + /* reimp */ void select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command); + +protected: + KLinkItemSelectionModelPrivate * const d_ptr; + +private: + Q_DECLARE_PRIVATE(KLinkItemSelectionModel) + Q_PRIVATE_SLOT( d_func(), void sourceSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)) + +}; + + +// QAbstractProxyModel::mapSelectionFromSource creates invalid ranges to we filter +// those out manually in a loop. Hopefully fixed in Qt 4.7.2, so we ifdef it out. +// http://qt.gitorious.org/qt/qt/merge_requests/2474 +// http://qt.gitorious.org/qt/qt/merge_requests/831 +#if QT_VERSION < 0x040702 +#define RANGE_FIX_HACK +#endif + +#ifdef RANGE_FIX_HACK +static QItemSelection klink_removeInvalidRanges(const QItemSelection &selection) +{ +// std::cout<< " klink_removeInvalidRanges " << std::endl; + QItemSelection result; + Q_FOREACH(const QItemSelectionRange &range, selection) + { + + Q_FOREACH(const QModelIndex &i, range.indexes ()) + { +// std::cout<< " =====> " << i.data().toString().toStdString() << std::endl; + } + if (!range.isValid()) + continue; +// std::cout<< " is VALID !!"<< std::endl; + result << range; + } + return result; +} +#endif + + +class KLinkItemSelectionModelPrivate +{ +public: + KLinkItemSelectionModelPrivate(KLinkItemSelectionModel *proxySelectionModel, QAbstractItemModel *model, + QItemSelectionModel *linkedItemSelectionModel) + : q_ptr(proxySelectionModel), + m_model(model), + m_linkedItemSelectionModel(linkedItemSelectionModel), + m_ignoreCurrentChanged(false), + m_indexMapper(new KModelIndexProxyMapper(model, linkedItemSelectionModel->model(), proxySelectionModel)) + { + } + + Q_DECLARE_PUBLIC(KLinkItemSelectionModel) + KLinkItemSelectionModel * const q_ptr; + + + bool assertSelectionValid(const QItemSelection &selection) const { + foreach(const QItemSelectionRange &range, selection) { +// if (!range.isValid()) { +// kDebug() << selection; +// } + + Q_ASSERT(range.isValid()); + } + return true; + } + +void sourceSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected) +{ + + + Q_Q(KLinkItemSelectionModel); +#ifdef RANGE_FIX_HACK +// std::cout<<"XXXXXXXXXXXXX sourceSelectionChanged!!!!!!!! RANGE_FIX_HACK"<mapSelectionRightToLeft(_deselected); + const QItemSelection mappedSelection = m_indexMapper->mapSelectionRightToLeft(_selected); + +// const QItemSelection mappedDeselection = _deselected; +// const QItemSelection mappedSelection = _selected; + +// std::cout << "XXXXXXXXXXXXX mappedSelection.count() " << mappedSelection.count() << std::endl; +// std::cout << "XXXXXXXXXXXXX mappedDeselection.count() " << mappedDeselection.count() << std::endl; + + q->QItemSelectionModel::select(mappedDeselection, QItemSelectionModel::Deselect); + q->QItemSelectionModel::select(mappedSelection, QItemSelectionModel::Select); + +// q->select(mappedDeselection, QItemSelectionModel::Deselect); +// q->select(mappedSelection, QItemSelectionModel::Select); + + +} + + QAbstractItemModel * const m_model; + QItemSelectionModel * const m_linkedItemSelectionModel; + bool m_ignoreCurrentChanged; + KModelIndexProxyMapper * const m_indexMapper; +}; + + + +#endif diff --git a/src/HEXABLOCKGUI/kmodelindexproxymapper.cxx b/src/HEXABLOCKGUI/kmodelindexproxymapper.cxx new file mode 100644 index 0000000..a215ae0 --- /dev/null +++ b/src/HEXABLOCKGUI/kmodelindexproxymapper.cxx @@ -0,0 +1,310 @@ +/* + Copyright (C) 2010 Klarälvdalens Datakonsult AB, + a KDAB Group company, info@kdab.net, + author Stephen Kelly + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This library is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "kmodelindexproxymapper.hxx" + +#include +#include +#include +#include + +// #include "kdebug.h" + +class KModelIndexProxyMapperPrivate +{ + KModelIndexProxyMapperPrivate(const QAbstractItemModel *leftModel, const QAbstractItemModel *rightModel, KModelIndexProxyMapper *qq) + : q_ptr(qq), m_leftModel(leftModel), m_rightModel(rightModel) + { + createProxyChain(); + } + + void createProxyChain(); + bool assertValid(); + + bool assertSelectionValid(const QItemSelection &selection) const { + foreach(const QItemSelectionRange &range, selection) { + if (!range.isValid()) { +// kDebug() << selection << m_leftModel << m_rightModel << m_proxyChainDown << m_proxyChainUp; + } + Q_ASSERT(range.isValid()); + } + return true; + } + + Q_DECLARE_PUBLIC(KModelIndexProxyMapper) + KModelIndexProxyMapper * const q_ptr; + + QList > m_proxyChainUp; + QList > m_proxyChainDown; + + QWeakPointer m_leftModel; + QWeakPointer m_rightModel; +}; + + +/* + + The idea here is that this selection model and proxySelectionModel might be in different parts of the + proxy chain. We need to build up to two chains of proxy models to create mappings between them. + + Example 1: + + Root model + | + / \ + Proxy 1 Proxy 3 + | | + Proxy 2 Proxy 4 + + Need Proxy 1 and Proxy 2 in one chain, and Proxy 3 and 4 in the other. + + Example 2: + + Root model + | + Proxy 1 + | + Proxy 2 + / \ + Proxy 3 Proxy 6 + | | + Proxy 4 Proxy 7 + | + Proxy 5 + + We first build the chain from 1 to 5, then start building the chain from 7 to 1. We stop when we find that proxy 2 is + already in the first chain. + + Stephen Kelly, 30 March 2010. +*/ + +void KModelIndexProxyMapperPrivate::createProxyChain() +{ + QWeakPointer targetModel = m_rightModel; + + if (!targetModel) + return; + + if (m_leftModel == targetModel) + return; + + QList > proxyChainDown; + QWeakPointer selectionTargetProxyModel = qobject_cast(targetModel.data()); + while( selectionTargetProxyModel ) + { + proxyChainDown.prepend( selectionTargetProxyModel ); + + selectionTargetProxyModel = qobject_cast(selectionTargetProxyModel.data()->sourceModel()); + + if (selectionTargetProxyModel.data() == m_leftModel.data()) + { + m_proxyChainDown = proxyChainDown; + return; + } + } + + QWeakPointer sourceModel = m_leftModel; + QWeakPointer sourceProxyModel = qobject_cast(sourceModel.data()); + + while(sourceProxyModel) + { + m_proxyChainUp.append(sourceProxyModel); + + sourceProxyModel = qobject_cast(sourceProxyModel.data()->sourceModel()); + + const int targetIndex = proxyChainDown.indexOf(sourceProxyModel); + + if (targetIndex != -1) + { + m_proxyChainDown = proxyChainDown.mid(targetIndex + 1, proxyChainDown.size()); + return; + } + } + m_proxyChainDown = proxyChainDown; + Q_ASSERT(assertValid()); +} + +bool KModelIndexProxyMapperPrivate::assertValid() +{ + if ( m_proxyChainDown.isEmpty()) + { + Q_ASSERT( !m_proxyChainUp.isEmpty() ); + Q_ASSERT( m_proxyChainUp.last().data()->sourceModel() == m_rightModel.data() ); + } + else if ( m_proxyChainUp.isEmpty()) + { + Q_ASSERT( !m_proxyChainDown.isEmpty() ); + Q_ASSERT( m_proxyChainDown.first().data()->sourceModel() == m_leftModel.data() ); + } else { + Q_ASSERT( m_proxyChainDown.first().data()->sourceModel() == m_proxyChainUp.last().data()->sourceModel() ); + } + return true; +} + +KModelIndexProxyMapper::KModelIndexProxyMapper(const QAbstractItemModel* leftModel, const QAbstractItemModel* rightModel, QObject* parent) + : QObject(parent), d_ptr( new KModelIndexProxyMapperPrivate(leftModel, rightModel, this) ) +{ + +} + +KModelIndexProxyMapper::~KModelIndexProxyMapper() +{ + delete d_ptr; +} + +QModelIndex KModelIndexProxyMapper::mapLeftToRight(const QModelIndex& index) const +{ + const QItemSelection selection = mapSelectionLeftToRight(QItemSelection(index, index)); + if (selection.isEmpty()) + return QModelIndex(); + + return selection.indexes().first(); +} + +QModelIndex KModelIndexProxyMapper::mapRightToLeft(const QModelIndex& index) const +{ + const QItemSelection selection = mapSelectionRightToLeft(QItemSelection(index, index)); + if (selection.isEmpty()) + return QModelIndex(); + + return selection.indexes().first(); +} + +// QAbstractProxyModel::mapSelectionFromSource creates invalid ranges to we filter +// those out manually in a loop. Hopefully fixed in Qt 4.7.2, so we ifdef it out. +// http://qt.gitorious.org/qt/qt/merge_requests/2474 +// http://qt.gitorious.org/qt/qt/merge_requests/831 +#if QT_VERSION < 0x040702 +#define RANGE_FIX_HACK +#endif + +#ifdef RANGE_FIX_HACK +static QItemSelection removeInvalidRanges(const QItemSelection &selection) +{ + QItemSelection result; + Q_FOREACH(const QItemSelectionRange &range, selection) + { + if (!range.isValid()) + continue; + result << range; + } + return result; +} +#endif + +QItemSelection KModelIndexProxyMapper::mapSelectionLeftToRight(const QItemSelection& selection) const +{ + Q_D(const KModelIndexProxyMapper); + + if (selection.isEmpty()) + return QItemSelection(); + +// if (selection.first().model() != d->m_leftModel.data()) +// kDebug() << "FAIL" << selection.first().model() << d->m_leftModel.data() << d->m_rightModel.data(); + Q_ASSERT(selection.first().model() == d->m_leftModel.data()); + + QItemSelection seekSelection = selection; + Q_ASSERT(d->assertSelectionValid(seekSelection)); + QListIterator > iUp(d->m_proxyChainUp); + + while (iUp.hasNext()) + { + const QWeakPointer proxy = iUp.next(); + if (!proxy.data()) + return QItemSelection(); + seekSelection = proxy.data()->mapSelectionToSource(seekSelection); + +#ifdef RANGE_FIX_HACK + seekSelection = removeInvalidRanges(seekSelection); +#endif + Q_ASSERT(d->assertSelectionValid(seekSelection)); + } + + QListIterator > iDown(d->m_proxyChainDown); + + while (iDown.hasNext()) + { + const QWeakPointer proxy = iDown.next(); + if (!proxy.data()) + return QItemSelection(); + seekSelection = proxy.data()->mapSelectionFromSource(seekSelection); + +#ifdef RANGE_FIX_HACK + seekSelection = removeInvalidRanges(seekSelection); +#endif + Q_ASSERT(d->assertSelectionValid(seekSelection)); + } + + Q_ASSERT( ( !seekSelection.isEmpty() && seekSelection.first().model() == d->m_rightModel.data() ) || true ); + return seekSelection; +} + +QItemSelection KModelIndexProxyMapper::mapSelectionRightToLeft(const QItemSelection& selection) const +{ + Q_D(const KModelIndexProxyMapper); + + if (selection.isEmpty()) + return QItemSelection(); + +// if (selection.first().model() != d->m_rightModel.data()) +// kDebug() << "FAIL" << selection.first().model() << d->m_leftModel.data() << d->m_rightModel.data(); + Q_ASSERT(selection.first().model() == d->m_rightModel.data()); + + QItemSelection seekSelection = selection; + Q_ASSERT(d->assertSelectionValid(seekSelection)); + QListIterator > iDown(d->m_proxyChainDown); + + iDown.toBack(); + while (iDown.hasPrevious()) + { + const QWeakPointer proxy = iDown.previous(); + if (!proxy.data()) + return QItemSelection(); + seekSelection = proxy.data()->mapSelectionToSource(seekSelection); + +#ifdef RANGE_FIX_HACK + seekSelection = removeInvalidRanges(seekSelection); +#endif + Q_ASSERT(d->assertSelectionValid(seekSelection)); + } + + QListIterator > iUp(d->m_proxyChainUp); + + iUp.toBack(); + while (iUp.hasPrevious()) + { + const QWeakPointer proxy = iUp.previous(); + if (!proxy.data()) + return QItemSelection(); + seekSelection = proxy.data()->mapSelectionFromSource(seekSelection); + +#ifdef RANGE_FIX_HACK + seekSelection = removeInvalidRanges(seekSelection); +#endif + Q_ASSERT(d->assertSelectionValid(seekSelection)); + } + + Q_ASSERT( ( !seekSelection.isEmpty() && seekSelection.first().model() == d->m_leftModel.data() ) || true ); + return seekSelection; +} + +// #include "kmodelindexproxymapper_moc.cxx" +// #include "kmodelindexproxymapper.moc" \ No newline at end of file diff --git a/src/HEXABLOCKGUI/kmodelindexproxymapper.hxx b/src/HEXABLOCKGUI/kmodelindexproxymapper.hxx new file mode 100644 index 0000000..3a81de1 --- /dev/null +++ b/src/HEXABLOCKGUI/kmodelindexproxymapper.hxx @@ -0,0 +1,58 @@ +/* + Copyright (C) 2010 Klarälvdalens Datakonsult AB, + a KDAB Group company, info@kdab.net, + author Stephen Kelly + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This library is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef KMODELINDEXPROXYMAPPER_H +#define KMODELINDEXPROXYMAPPER_H + +#include + +// #include "kdeui_export.h" + +class QAbstractItemModel; +class QModelIndex; +class QItemSelection; +class KModelIndexProxyMapperPrivate; + +class KModelIndexProxyMapper : public QObject +{ + Q_OBJECT +public: + KModelIndexProxyMapper(const QAbstractItemModel *leftModel, const QAbstractItemModel *rightModel, QObject* parent = 0); + + ~KModelIndexProxyMapper(); + + QModelIndex mapLeftToRight(const QModelIndex &index) const; + + QModelIndex mapRightToLeft(const QModelIndex &index) const; + + QItemSelection mapSelectionLeftToRight(const QItemSelection &selection) const; + + QItemSelection mapSelectionRightToLeft(const QItemSelection &selection) const; + +private: + //@cond PRIVATE + Q_DECLARE_PRIVATE(KModelIndexProxyMapper) + KModelIndexProxyMapperPrivate * const d_ptr; + //@endcond +}; + +#endif + diff --git a/src/HEXABLOCKGUI/resources/ExecHEXABLOCK.png b/src/HEXABLOCKGUI/resources/ExecHEXABLOCK.png new file mode 100755 index 0000000000000000000000000000000000000000..16a20c116e8243a6b49ed862613d2cc49bdf4caa GIT binary patch literal 831 zcmV-F1Hk-=P)A+3!%gdoE?w?yY*XMamxaAW~()k6;QGVVf3ZPpQcy+38CrH3{Qk zoaxN-vWJ+OcH(Y#5qvHK|CitMf1CdUU;7AQ8zF4-#i736F~#EMso~pq*Ek7JMLa$}POH_T(b)M|f)>8t;^3f3 zKA)#ntMKyW+7Z-s>l6xWsZ53jrMAEC5{41RXe`Snj$`6DMr+Vop|xgsc$hE@Sz20V zb@eG)%b|Y+_m{*NND_%L1}POFH@MUObOdhQq^%&CMdWZvC2q+x@_Pg_JQ$DGG%bJbwIyVzG#2o#E=$@5yGf z#Bm5%IplY1BB@I((}Bdlpj1;;nAaqNZEDBWHP2)F0;K|LMcrchIBe@ z&Ye4p5H>e&{)pCc=qTd1Z_6|q4IIZIpUy{Fg7-dG2KQ=nb2l+s9 + + + + + + + + + + + + + + + HEXABLOCK + HEXABLOCK TUI + Data + CS + @VERSION@ + CEA - RD + 1 + ModuleHexablock.png + 'linux' ~ OS + + + + diff --git a/src/HEXABLOCKGUI/resources/HEXABLOCK_icons.ts b/src/HEXABLOCKGUI/resources/HEXABLOCK_icons.ts new file mode 100755 index 0000000..69dafca --- /dev/null +++ b/src/HEXABLOCKGUI/resources/HEXABLOCK_icons.ts @@ -0,0 +1,208 @@ + + + + + @default + + ICON_NEW_DOCUMENT + new_document.png + + + ICON_LOAD_DOCUMENT + load_document.png + + + ICON_SAVE_DOCUMENT + save_document.png + + + ICON_ADD_VERTEX + add_vertex.png + + + ICON_ADD_EDGE + add_edge.png + + + ICON_ADD_QUAD + add_quad.png + + + ICON_ADD_HEXA + add_hexa.png + + + ICON_ADD_VECTOR + add_vector.png + + + ICON_ADD_CYLINDER + add_cylinder.png + + + ICON_ADD_PIPE + add_pipe.png + + + ICON_MAKE_GRID + make_grid.png + + + ICON_MAKE_CYLINDER + make_cylinder.png + + + ICON_MAKE_PIPE + make_pipe.png + + + ICON_MAKE_CYLINDERS + make_cylinders.png + + + ICON_MAKE_PIPES + make_pipes.png + + + ICON_REMOVE_HEXA + remove_hexa.png + + + ICON_PRISM_QUAD + prism_quad.png + + + ICON_JOIN_QUAD + join_quad.png + + + ICON_MERGE + merge.png + + + ICON_DISCONNECT + disconnect.png + + + ICON_CUT_EDGE + cut_edge.png + + + ICON_MAKE_TRANSFORMATION + make_transformation.png + + + ICON_MAKE_SYMMETRY + make_symmetry.png + + + ICON_PERFORM_TRANSFORMATION + perform_transformation.png + + + ICON_PERFORM_SYMMETRY + perform_symmetry.png + + + ICON_VERTEX_ASSOCIATION + assoc_vertex.png + + + ICON_EDGE_ASSOCIATION + assoc_edge.png + + + ICON_QUAD_ASSOCIATION + assoc_quad.png + + + ICON_ADD_GROUP + add_group.png + + + ICON_REMOVE_GROUP + remove_group.png + + + ICON_ADD_LAW + add_law.png + + + ICON_REMOVE_LAW + remove_law.png + + + ICON_SET_PROPAGATION + set_propagation.png + + + ICON_COMPUTE_MESH + compute_mesh.png + + + ICON_QUAD_REVOLUTION + quad_revolution.png + + + ICON_REPLACE_HEXA + replace_hexa.png + + + ICON_MAKE_HEMISPHERE + make_hemisphere.png + + + + ICON_DLG_POINT + point2.png + + + ICON_DLG_POINT_EDGE + pointonedge.png + + + ICON_SELECT + select1.png + + + ICON_DLG_POINT_REF + point3.png + + + ICON_DLG_POINT_LINES + point_line_intersection.png + + + ICON_DLG_POINT_FACE + pointonface.png + + + ICO_LINE + line.png + + + ICO_WIRE + build_wire.png + + + + diff --git a/src/HEXABLOCKGUI/resources/HEXABLOCK_msg_en.ts b/src/HEXABLOCKGUI/resources/HEXABLOCK_msg_en.ts new file mode 100755 index 0000000..9cc0fc8 --- /dev/null +++ b/src/HEXABLOCKGUI/resources/HEXABLOCK_msg_en.ts @@ -0,0 +1,1369 @@ + + + + + HEXABLOCK::GUI::ComputeMeshDialog + + Compute mesh + + + + + HEXABLOCK::GUI::CutEdgeDialog + + ERR_ERROR + Error + + + CANNOT CUT EDGE + Cannot cut edge + + + + HEXABLOCK::GUI::CylinderDialog + + Cylinder Information + + + + ERR_ERROR + Error + + + CANNOT ADD CYLINDER + Cannot add cylinder + + + + HEXABLOCK::GUI::DisconnectDialog + + ERR_ERROR + Error + + + CANNOT DISCONNECT + Cannot disconnect + + + + HEXABLOCK::GUI::DocumentModel + + TREE_ITEM_VERTEX + Vertices + + + TREE_ITEM_EDGE + Edges + + + TREE_ITEM_QUAD + Quadrangles + + + TREE_ITEM_HEXA + Hexahedra + + + TREE_ITEM_VECTOR + Vectors + + + TREE_ITEM_CYLINDER + Cylinders + + + TREE_ITEM_PIPE + Pipes + + + TREE_ITEM_ELEMENT + Elements + + + TREE_ITEM_CROSSELEMENT + Cross Elements + + + TREE_ITEM_GROUP + Groups + + + TREE_ITEM_LAW + Laws + + + TREE_ITEM_PROPAGATION + Propagations + + + + HEXABLOCK::GUI::EdgeAssocDialog + + ERR_ERROR + Error + + + CANNOT MAKE EDGE ASSOCIATION + Cannot make edge association + + + + HEXABLOCK::GUI::EdgeDialog + + Edge Information + + + + ERR_ERROR + Error + + + CANNOT BUILD EDGE + Cannot build edge + + + + HEXABLOCK::GUI::GroupDialog + + Group Construction + + + + Group Modification + + + + Group Information + + + + ERR_ERROR + Error + + + CANNOT ADD GROUP + Cannot add group + + + + HEXABLOCK::GUI::HexaBaseDialog + + VERTEX + Vertex + + + EDGE + Edge + + + QUAD + Quadrangle + + + HEXA + Hexahedron + + + VECTOR + Vector + + + CYLINDER + Cylinder + + + PIPE + Pipe + + + ELEMENTS + Elements + + + CROSSELEMENTS + Cross Elements + + + GROUP + Group + + + LAW + Law + + + PROPAGATION + Propagation + + + Close + + + + Help + + + + Apply And Close + + + + Apply + + + + HEXA_INFO + HexaBlock + + + %1: Bad type selected +Please select a %2. + + + + + HEXABLOCK::GUI::HexaDialog + + Hexahedron Information + + + + ERR_ERROR + Error + + + CANNOT BUILD HEXA + Cannot build hexahedra + + + + HEXABLOCK::GUI::JoinQuadDialog + + ERR_ERROR + Error + + + CANNOT JOIN QUAD(S) + Cannot join quadrangle(s) + + + + HEXABLOCK::GUI::LawDialog + + Law Construction + + + + Law Modification + + + + ERR_ERROR + Error + + + CANNOT ADD LAW + Cannot add law + + + + HEXABLOCK::GUI::MakeCylinderDialog + + ERR_ERROR + Error + + + CANNOT MAKE CYLINDER + Cannot make cylinder + + + + HEXABLOCK::GUI::MakeCylindersDialog + + ERR_ERROR + Error + + + CANNOT MAKE CYLINDERS + Cannot make cylinders + + + + HEXABLOCK::GUI::MakeGridDialog + + ERR_ERROR + Error + + + CANNOT MAKE GRID + Cannot make grid + + + + HEXABLOCK::GUI::MakeHemiSphereDialog + + ERR_ERROR + Error + + + CANNOT MAKE RIND + Cannot make hemisphere + + + + HEXABLOCK::GUI::MakePipeDialog + + ERR_ERROR + Error + + + CANNOT MAKE PIPE + Cannot make pipe + + + + HEXABLOCK::GUI::MakePipesDialog + + ERR_ERROR + Error + + + CANNOT MAKE PIPES + Cannot make pipes + + + + HEXABLOCK::GUI::MakeSymmetryDialog + + ERR_ERROR + Error + + + CANNOT MAKE TRANSFORMATION + Cannot make symmetry + + + + HEXABLOCK::GUI::MakeTransformationDialog + + ERR_ERROR + Error + + + CANNOT MAKE TRANSFORMATION + Cannot make transformation + + + + HEXABLOCK::GUI::MergeDialog + + ERR_ERROR + Error + + + CANNOT MERGE + Cannot merge + + + + HEXABLOCK::GUI::MyBasicGUI_PointDlg + + ICON_DLG_POINT + + + + ICON_DLG_POINT_EDGE + + + + ICON_SELECT + + + + ICON_DLG_POINT_REF + + + + ICON_DLG_POINT_LINES + + + + ICON_DLG_POINT_FACE + + + + ICO_LINE + + + + ICO_WIRE + + + + Vertex Association + + + + GEOM_POINTS + + + + GEOM_PARAM_VALUE + + + + GEOM_LENGTH_VALUE + + + + GEOM_COORD_VALUE + + + + GEOM_COORDINATES + + + + GEOM_X + + + + GEOM_Y + + + + GEOM_Z + + + + GEOM_POINT_ON_EDGE + + + + GEOM_EDGE + + + + GEOM_START_POINT + + + + GEOM_PARAMETER + + + + GEOM_POINT_ON_FACE + + + + GEOM_FACE + + + + GEOM_UPARAMETER + + + + GEOM_VPARAMETER + + + + GEOM_REF_POINT + + + + GEOM_POINT + + + + GEOM_DX + + + + GEOM_DY + + + + GEOM_DZ + + + + GEOM_LINE_INTERSECTION + + + + GEOM_LINE1 + + + + GEOM_LINE2 + + + + GEOM_COORDINATES_RES + + + + GEOM_VERTEX + + + + GEOM_COMPOUND + + + + GEOM_LENGTH + + + + HEXA_INFO + HexaBlock + + + ERR_ERROR + Error + + + CANNOT MAKE VERTEX ASSOCIATION + Cannot make vertex association + + + Bad selection type: please select a %1 + + + + + HEXABLOCK::GUI::PerformSymmetryDialog + + ERR_ERROR + Error + + + CANNOT PERFORM SYMMETRY + Cannot perform symmetry + + + + HEXABLOCK::GUI::PerformTransformationDialog + + ERR_ERROR + Error + + + CANNOT PERFORM TRANSFORMATION + Cannot perform transformation + + + + HEXABLOCK::GUI::PipeDialog + + Pipe Information + + + + ERR_ERROR + Error + + + CANNOT ADD PIPE + Cannot add pipe + + + + HEXABLOCK::GUI::PrismQuadDialog + + ERR_ERROR + Error + + + CANNOT PRISM QUAD(S) + Cannot prism quadrangle(s) + + + + HEXABLOCK::GUI::PropagationDialog + + Propagation Information + + + + Propagation Modification + + + + Propagation Setting + + + + ERR_ERROR + Error + + + CANNOT SET PROPAGATION + Cannot set propagation + + + + HEXABLOCK::GUI::QuadDialog + + Quad Information + Quadrangle information + + + ERR_ERROR + Error + + + CANNOT BUILD QUAD + Cannot build quadrangle + + + + HEXABLOCK::GUI::QuadRevolutionDialog + + ERR_ERROR + Error + + + CANNOT MAKE QUAD REVOLUTION + Cannot make revolution + + + + HEXABLOCK::GUI::RemoveHexaDialog + + ERR_ERROR + Error + + + CANNOT REMOVE HEXA + Cannot remove hexahedra + + + + HEXABLOCK::GUI::ReplaceHexaDialog + + ERR_ERROR + Error + + + CANNOT REPLACE HEXA + Cannot replace hexahedra + + + + HEXABLOCK::GUI::VectorDialog + + Vector Information + + + + ERR_ERROR + Error + + + CANNOT BUILD VECTOR + Cannot build vector + + + + HEXABLOCK::GUI::VertexDialog + + Vertex Construction + + + + Vertex Modification + + + + ERR_ERROR + Error + + + VERTEX UPDATE/CONSTRUCTION + Vertext Update/Construction + + + + HEXABLOCKGUI + + ERR_ERROR + Error + + + Create a new document + + + + ICON_NEW_DOCUMENT + + + + New Document + + + + Load a document + + + + ICON_LOAD_DOCUMENT + + + + Load Document + + + + Save the document + + + + ICON_SAVE_DOCUMENT + + + + Save Document + + + + Create a vertex + + + + ICON_ADD_VERTEX + + + + Add Vertex + + + + Create a new vertex + + + + Create an edge + + + + ICON_ADD_EDGE + + + + Add Edge + + + + Create a new edge + + + + Create a quadrangle + + + + ICON_ADD_QUAD + + + + Add Quadrangle + + + + Create a new quadrangle + + + + Create an hexahedron + + + + ICON_ADD_HEXA + + + + Add Hexahedron + + + + Create a new hexahedron + + + + Create a vector + + + + ICON_ADD_VECTOR + + + + Add Vector + + + + Create a new vector + + + + Create a cylinder + + + + ICON_ADD_CYLINDER + + + + Add Cylinder + + + + Create a new cylinder + + + + Create a pipe + + + + ICON_ADD_PIPE + + + + Add Pipe + + + + Create a new pipe + + + + Make a grid + + + + ICON_MAKE_GRID + + + + Make Grid + + + + Make a cylinder + + + + ICON_MAKE_CYLINDER + + + + Make Cylinder + + + + Make a pipe + + + + ICON_MAKE_PIPE + + + + Make Pipe + + + + Make cylinders + + + + ICON_MAKE_CYLINDERS + + + + Make Cylinders + + + + Make pipes + + + + ICON_MAKE_PIPES + + + + Make Pipes + + + + Make an hemisphere + + + + ICON_MAKE_HEMISPHERE + + + + Make Hemisphere + + + + Remove hexahedra + + + + ICON_REMOVE_HEXA + + + + Remove Hexahedra + + + + Prism quadrangles + + + + ICON_PRISM_QUAD + + + + Prism Quadrangles + + + + Join quadrangles + + + + ICON_JOIN_QUAD + + + + Join Quadrangles + + + + Join quadrangles with hexahedra + + + + Merge + + + + ICON_MERGE + + + + Disconnect + + + + ICON_DISCONNECT + + + + Disconnect edges, vertexes or quadrangles + + + + Cut edge + + + + ICON_CUT_EDGE + + + + Cut Edge + + + + Make transformation + + + + ICON_MAKE_TRANSFORMATION + + + + Make Transformation + + + + Make symmetry + + + + ICON_MAKE_SYMMETRY + + + + Make Symmetry + + + + Perform transformation + + + + ICON_PERFORM_TRANSFORMATION + + + + Perform Transformation + + + + Perform symmetry + + + + ICON_PERFORM_SYMMETRY + + + + Perform Symmetry + + + + Replace hexahedron + + + + ICON_REPLACE_HEXA + + + + Replace Hexahedron + + + + Quad revolution + + + + ICON_QUAD_REVOLUTION + + + + Quad Revolution + + + + Make vertex association + + + + ICON_VERTEX_ASSOCIATION + + + + Make Vertex association + + + + Make edge association + + + + ICON_EDGE_ASSOCIATION + + + + Make Edge Association + + + + Make quadrangle association + + + + ICON_QUAD_ASSOCIATION + + + + Make Quadrangle Association + + + + Add a group + + + + ICON_ADD_GROUP + + + + Add Group + + + + Remove a group + + + + ICON_REMOVE_GROUP + + + + Remove Group + + + + Add a law + + + + ICON_ADD_LAW + + + + Add Law + + + + Remove a law + + + + ICON_REMOVE_LAW + + + + Remove Law + + + + Set propagation + + + + ICON_SET_PROPAGATION + + + + Set Propagation + + + + Compute mesh + + + + ICON_COMPUTE_MESH + + + + Compute Mesh + + + + MEN_FILE + + + + HEXABLOCK + HexaBlock + + + Document + + + + Model + + + + Association + + + + Groups + + + + Mesh + + + + HexaBlock Toolbar + + + + Open HexaBlock Document + + + + XML-Files (*.xml);;All Files (*) + + + + Save HexaBlock Document + + + + CANNOT REMOVE %1 + Cannot remove %1 + + + HEXA_INFO + HexaBlock + + + GROUP REMOVED + Group removed + + + CANNOT REMOVE GROUP + Cannot remove group + + + LAW REMOVED + Law removed + + + CANNOT REMOVE LAW + Cannot remove law + + + PLEASE SELECT A PROPAGATION + Please select a propagation + + + ASSOCIATION CLEARED + association cleared + + + + MyGEOMBase_Skeleton + + GEOM_RESULT_NAME_GRP + Result name + + + GEOM_RESULT_NAME_LBL + Name + + + GEOM_PUBLISH_RESULT_GRP + Advanced options + + + GEOM_RESTORE_SUB_SHAPES + Set presentation parameters and sub-shapes from arguments + + + GEOM_RSS_ADD_FREFIX + Add prefix to names of restored sub-shapes + + + GEOM_PREVIEW + Preview + + + GEOM_BUT_CLOSE + Close + + + GEOM_BUT_APPLY_AND_CLOSE + Apply and Close + + + GEOM_BUT_APPLY + Apply + + + GEOM_BUT_HELP + Help + + + + QObject + + XML_FILES_FILTER + XML Files + + + ALL_FILES_FILTER + All files + + + WRN_WARNING + Warning + + + EXTERNAL_BROWSER_CANNOT_SHOW_PAGE + External browser '%1' cannot show help page '%2'. Do you want to change it in preferences? + + + BUT_OK + OK + + + WRN_STUDY_LOCKED + + + + GEOM_PRP_DONE + + + + GEOM_PRP_ABORT + + + + GEOM_ERROR_STATUS + + + + GEOM_INCORRECT_INPUT + + + + GEOM_ERROR + + + + GEOM_VERTEX + + + + GEOM_EDGE + + + + GEOM_WIRE + + + + GEOM_FACE + + + + GEOM_SHELL + + + + GEOM_SOLID + + + + GEOM_COMPOUNDSOLID + + + + GEOM_COMPOUND + + + + GEOM_PRECISION_HINT + + + + diff --git a/src/HEXABLOCKGUI/resources/HEXABLOCK_msg_fr.ts b/src/HEXABLOCKGUI/resources/HEXABLOCK_msg_fr.ts new file mode 100755 index 0000000..6432157 --- /dev/null +++ b/src/HEXABLOCKGUI/resources/HEXABLOCK_msg_fr.ts @@ -0,0 +1,1370 @@ + + + + + HEXABLOCK::GUI::ComputeMeshDialog + + Compute mesh + Calculer + + + + HEXABLOCK::GUI::CutEdgeDialog + + ERR_ERROR + Erreur + + + CANNOT CUT EDGE + Impossible de couper l'arête + + + + HEXABLOCK::GUI::CylinderDialog + + Cylinder Information + Information sur le cylindre + + + ERR_ERROR + Erreur + + + CANNOT ADD CYLINDER + Impossible d'ajouter le cylindre + + + + HEXABLOCK::GUI::DisconnectDialog + + ERR_ERROR + Erreur + + + CANNOT DISCONNECT + Impossible de déconnecter + + + + HEXABLOCK::GUI::DocumentModel + + TREE_ITEM_VERTEX + Sommets + + + TREE_ITEM_EDGE + Arêtes + + + TREE_ITEM_QUAD + Quadrangles + + + TREE_ITEM_HEXA + Hexaèdres + + + TREE_ITEM_VECTOR + Vecteurs + + + TREE_ITEM_CYLINDER + Cylindres + + + TREE_ITEM_PIPE + Tuyaux + + + TREE_ITEM_ELEMENT + Eléments + + + TREE_ITEM_CROSSELEMENT + Eléments de croix + + + TREE_ITEM_GROUP + Groupes + + + TREE_ITEM_LAW + Lois + + + TREE_ITEM_PROPAGATION + Propagations + + + + HEXABLOCK::GUI::EdgeAssocDialog + + ERR_ERROR + Erreur + + + CANNOT MAKE EDGE ASSOCIATION + Impossible d'associer les arêtes + + + + HEXABLOCK::GUI::EdgeDialog + + Edge Information + Information sur l'arête + + + ERR_ERROR + Erreur + + + CANNOT BUILD EDGE + Impossible de construire l'arête + + + + HEXABLOCK::GUI::GroupDialog + + Group Construction + Création d'un groupe + + + Group Modification + Modification d'un groupe + + + Group Information + Information sur le groupe + + + ERR_ERROR + Erreur + + + CANNOT ADD GROUP + Impossible d'ajouter le groupe + + + + HEXABLOCK::GUI::HexaBaseDialog + + VERTEX + Sommet + + + EDGE + Arête + + + QUAD + Quadrangle + + + HEXA + Hexaèdre + + + VECTOR + Vecteur + + + CYLINDER + Cylindre + + + PIPE + Tuyau + + + ELEMENTS + Eléments + + + CROSSELEMENTS + Eléments de croix + + + GROUP + Groupe + + + LAW + Loi + + + PROPAGATION + Propagation + + + Close + Fermer + + + Help + Aide + + + Apply And Close + Appliquer et Fermer + + + Apply + Appliquer + + + HEXA_INFO + HexaBlock + + + %1: Bad type selected +Please select a %2. + %1 : Mauvais type sélectionné +Choisissez un(e) %2. + + + + HEXABLOCK::GUI::HexaDialog + + Hexahedron Information + Information sur l'hexaèdre + + + ERR_ERROR + Erreur + + + CANNOT BUILD HEXA + Impossible de construire l'hexaèdre + + + + HEXABLOCK::GUI::JoinQuadDialog + + ERR_ERROR + Erreur + + + CANNOT JOIN QUAD(S) + Impossible de joindre les quadrangles + + + + HEXABLOCK::GUI::LawDialog + + Law Construction + Création d'une loi + + + Law Modification + Modification de la loi + + + ERR_ERROR + Erreur + + + CANNOT ADD LAW + Impossible d'ajouter la loi + + + + HEXABLOCK::GUI::MakeCylinderDialog + + ERR_ERROR + Erreur + + + CANNOT MAKE CYLINDER + Impossible de créer le cylindre + + + + HEXABLOCK::GUI::MakeCylindersDialog + + ERR_ERROR + Erreur + + + CANNOT MAKE CYLINDERS + Impossible de créer les cylindres + + + + HEXABLOCK::GUI::MakeGridDialog + + ERR_ERROR + Erreur + + + CANNOT MAKE GRID + Impossible de créer la grille + + + + HEXABLOCK::GUI::MakeHemiSphereDialog + + ERR_ERROR + Erreur + + + CANNOT MAKE RIND + Impossible de créer l'hémisphère + + + + HEXABLOCK::GUI::MakePipeDialog + + ERR_ERROR + Erreur + + + CANNOT MAKE PIPE + Impossible de créer le tuyau + + + + HEXABLOCK::GUI::MakePipesDialog + + ERR_ERROR + Erreur + + + CANNOT MAKE PIPES + Impossible de créer les tuyaux + + + + HEXABLOCK::GUI::MakeSymmetryDialog + + ERR_ERROR + Erreur + + + CANNOT MAKE TRANSFORMATION + Impossible de réaliser la symétrie + + + + HEXABLOCK::GUI::MakeTransformationDialog + + ERR_ERROR + Erreur + + + CANNOT MAKE TRANSFORMATION + Impossible de réaliser la transformation + + + + HEXABLOCK::GUI::MergeDialog + + ERR_ERROR + Erreur + + + CANNOT MERGE + Impossible de fusionner + + + + HEXABLOCK::GUI::MyBasicGUI_PointDlg + + ICON_DLG_POINT + + + + ICON_DLG_POINT_EDGE + + + + ICON_SELECT + + + + ICON_DLG_POINT_REF + + + + ICON_DLG_POINT_LINES + + + + ICON_DLG_POINT_FACE + + + + ICO_LINE + + + + ICO_WIRE + + + + Vertex Association + Associer sommets + + + GEOM_POINTS + + + + GEOM_PARAM_VALUE + + + + GEOM_LENGTH_VALUE + + + + GEOM_COORD_VALUE + + + + GEOM_COORDINATES + coordonnées + + + GEOM_X + X + + + GEOM_Y + Y + + + GEOM_Z + Z + + + GEOM_POINT_ON_EDGE + + + + GEOM_EDGE + Arête + + + GEOM_START_POINT + + + + GEOM_PARAMETER + + + + GEOM_POINT_ON_FACE + + + + GEOM_FACE + Face + + + GEOM_UPARAMETER + + + + GEOM_VPARAMETER + + + + GEOM_REF_POINT + + + + GEOM_POINT + + + + GEOM_DX + Dx + + + GEOM_DY + Dy + + + GEOM_DZ + Dz + + + GEOM_LINE_INTERSECTION + + + + GEOM_LINE1 + + + + GEOM_LINE2 + + + + GEOM_COORDINATES_RES + + + + GEOM_VERTEX + Sommet + + + GEOM_COMPOUND + + + + GEOM_LENGTH + + + + HEXA_INFO + HexaBlock + + + ERR_ERROR + Erreur + + + CANNOT MAKE VERTEX ASSOCIATION + Impossible d'associer les sommets + + + Bad selection type: please select a %1 + + + + + HEXABLOCK::GUI::PerformSymmetryDialog + + ERR_ERROR + Erreur + + + CANNOT PERFORM SYMMETRY + Impossible de réaliser la symétrie + + + + HEXABLOCK::GUI::PerformTransformationDialog + + ERR_ERROR + Erreur + + + CANNOT PERFORM TRANSFORMATION + Impossible de réaliser la transformation + + + + HEXABLOCK::GUI::PipeDialog + + Pipe Information + Information sur le tuyau + + + ERR_ERROR + Erreur + + + CANNOT ADD PIPE + Impossible d'ajouter le tuyau + + + + HEXABLOCK::GUI::PrismQuadDialog + + ERR_ERROR + Erreur + + + CANNOT PRISM QUAD(S) + Impossible d'extruder le(s) quadrangle(s) + + + + HEXABLOCK::GUI::PropagationDialog + + Propagation Information + Information sur la propagation + + + Propagation Modification + Modification de la propagation + + + Propagation Setting + Paramètres de la propagation + + + ERR_ERROR + Erreur + + + CANNOT SET PROPAGATION + Impossible d'appliquer la propagation + + + + HEXABLOCK::GUI::QuadDialog + + Quad Information + Information du quadrangle + + + ERR_ERROR + Erreur + + + CANNOT BUILD QUAD + Impossible de construire le quadrangle + + + + HEXABLOCK::GUI::QuadRevolutionDialog + + ERR_ERROR + Erreur + + + CANNOT MAKE QUAD REVOLUTION + Impossible d'effectuer la révolution + + + + HEXABLOCK::GUI::RemoveHexaDialog + + ERR_ERROR + Erreur + + + CANNOT REMOVE HEXA + Impossible de supprimer l'hexaèdre + + + + HEXABLOCK::GUI::ReplaceHexaDialog + + ERR_ERROR + Erreur + + + CANNOT REPLACE HEXA + Impossible de remplacer l'hexaèdre + + + + HEXABLOCK::GUI::VectorDialog + + Vector Information + Information sur le vecteur + + + ERR_ERROR + Erreur + + + CANNOT BUILD VECTOR + Impossible de créer le vecteur + + + + HEXABLOCK::GUI::VertexDialog + + Vertex Construction + Création d'un sommet + + + Vertex Modification + Modification d'un sommet + + + ERR_ERROR + Erreur + + + VERTEX UPDATE/CONSTRUCTION + Création/Mise à jour d'un sommet + + + + HEXABLOCKGUI + + Create a new document + Créer un document + + + New Document + Nouveau + + + Load a document + Ouvrir un document + + + Load Document + Ouvrir + + + Save the document + Enregistrer le document + + + Save Document + Enregistrer + + + Create a vertex + Créer un sommet + + + Add Vertex + Ajouter sommet + + + Create a new vertex + Créer un nouveau sommet + + + Create an edge + Créer une arête + + + Add Edge + Ajouter arête + + + Create a new edge + Créer une nouvelle arête + + + Create a quadrangle + Créer un quadrangle + + + Add Quadrangle + Ajouter quadrangle + + + Create a new quadrangle + Créer un nouveau quadrangle + + + Create an hexahedron + Créer un hexaèdre + + + Add Hexahedron + Ajouter hexaèdre + + + Create a new hexahedron + Créer un nouveau hexaèdre + + + Create a vector + Créer un vecteur + + + Add Vector + Ajouter vecteur + + + Create a new vector + Créer un nouveau vecteur + + + Create a cylinder + Créer un cylindre + + + Add Cylinder + Ajouter cylindre + + + Create a new cylinder + Créer un nouveau cylindre + + + Create a pipe + Créer un tuyau + + + Add Pipe + Ajouter tuyau + + + Create a new pipe + Créer un nouveau tuyau + + + Make a grid + Créer une grille + + + Make Grid + Créer grille + + + Make a cylinder + Créer un cylindre + + + Make Cylinder + Créer cylindre + + + Make a pipe + Créer un tuyau + + + Make Pipe + Créer tuyau + + + Make cylinders + Créer des cylindres + + + Make Cylinders + Créer cylindres + + + Make pipes + Créer des tuyaux + + + Make Pipes + Créer tuyaux + + + Make an hemisphere + Créer une hémisphère + + + Make Hemisphere + Créer hémisphère + + + Remove hexahedra + Supprimer des hexaèdres + + + Remove Hexahedra + Supprimer hexaèdres + + + Prism quadrangles + Extruder des quadrangles + + + Prism Quadrangles + Extruder quadrangles + + + Join quadrangles + Joindre des quadrangles + + + Join Quadrangles + Joindre quadrangles + + + Join quadrangles with hexahedra + Joindre des quadrangles par des hexaèdres + + + Merge + Fusionner + + + Disconnect + Déconnecter + + + Disconnect edges, vertexes or quadrangles + Déconnecter des arêtes, des sommets ou des quadrangles + + + Cut edge + Couper les arêtes + + + Cut Edge + Couper arêtes + + + Make transformation + Créer par transformation + + + Make Transformation + Créer un élément par transformation + + + Make symmetry + Créer par symétrie + + + Make Symmetry + Créer un élément par symétrie + + + Perform transformation + Transformer un élément + + + Perform Transformation + Transformer élément + + + Perform symmetry + Appliquer une symétrie à un élément + + + Perform Symmetry + Appliquer symétrie + + + Replace hexahedron + Remplacer un hexaèdre + + + Replace Hexahedron + Remplacer hexaèdre + + + Quad revolution + Révolution + + + Quad Revolution + Révolution + + + Make vertex association + Associer des sommets + + + Make Vertex association + Associer sommets + + + Make edge association + Associer des arêtes + + + Make Edge Association + Associer arêtes + + + Make quadrangle association + Associer des quadrangles + + + Make Quadrangle Association + Associer quadrangles + + + Add a group + Ajouter un groupe + + + Add Group + Ajouter groupe + + + Remove a group + Supprimer un groupe + + + Remove Group + Supprimer groupe + + + Add a law + Ajouter une loi + + + Add Law + Ajouter loi + + + Remove a law + Supprimer une loi + + + Remove Law + Supprimer loi + + + Set propagation + Propager une loi de discrétisation + + + Set Propagation + Propager loi + + + Compute mesh + Calculer + + + Compute Mesh + Calculer + + + HEXABLOCK + HexaBlock + + + Document + Document + + + Model + Modèle + + + Association + Association + + + Groups + Groupes + + + Mesh + Maillage + + + HexaBlock Toolbar + Barre d'outils de HexaBlock + + + Open HexaBlock Document + Ouvrir un document HexaBlock + + + XML-Files (*.xml);;All Files (*) + Fichiers XML (*.xml);;Tous les fichiers (*) + + + ERR_ERROR + Erreur + + + CANNOT REMOVE %1 + Impossible de supprimer %1 + + + HEXA_INFO + + + + GROUP REMOVED + Groupe supprimé + + + CANNOT REMOVE GROUP + Impossible de supprimer le groupe + + + LAW REMOVED + Loi supprimée + + + CANNOT REMOVE LAW + Impossible de supprimer la loi + + + PLEASE SELECT A PROPAGATION + Veuillez choisir une propagation + + + ASSOCIATION CLEARED + Association supprimée + + + Save HexaBlock Document + Enregistrer le document HexaBlock + + + ICON_NEW_DOCUMENT + + + + ICON_LOAD_DOCUMENT + + + + ICON_SAVE_DOCUMENT + + + + ICON_ADD_VERTEX + + + + ICON_ADD_EDGE + + + + ICON_ADD_QUAD + + + + ICON_ADD_HEXA + + + + ICON_ADD_VECTOR + + + + ICON_ADD_CYLINDER + + + + ICON_ADD_PIPE + + + + ICON_MAKE_GRID + + + + ICON_MAKE_CYLINDER + + + + ICON_MAKE_PIPE + + + + ICON_MAKE_CYLINDERS + + + + ICON_MAKE_PIPES + + + + ICON_MAKE_HEMISPHERE + + + + ICON_REMOVE_HEXA + + + + ICON_PRISM_QUAD + + + + ICON_JOIN_QUAD + + + + ICON_MERGE + + + + ICON_DISCONNECT + + + + ICON_CUT_EDGE + + + + ICON_MAKE_TRANSFORMATION + + + + ICON_MAKE_SYMMETRY + + + + ICON_PERFORM_TRANSFORMATION + + + + ICON_PERFORM_SYMMETRY + + + + ICON_REPLACE_HEXA + + + + ICON_QUAD_REVOLUTION + + + + ICON_VERTEX_ASSOCIATION + + + + ICON_EDGE_ASSOCIATION + + + + ICON_QUAD_ASSOCIATION + + + + ICON_ADD_GROUP + + + + ICON_REMOVE_GROUP + + + + ICON_ADD_LAW + + + + ICON_REMOVE_LAW + + + + ICON_SET_PROPAGATION + + + + ICON_COMPUTE_MESH + + + + MEN_FILE + + + + + MyGEOMBase_Skeleton + + GEOM_RESULT_NAME_GRP + Nom du résultat + + + GEOM_RESULT_NAME_LBL + Nom + + + GEOM_PUBLISH_RESULT_GRP + Options avancées + + + GEOM_RESTORE_SUB_SHAPES + Récupérer les groupes et les sous-objets + + + GEOM_RSS_ADD_FREFIX + Ajouter un préfixe aux noms des sous-objets restaurés + + + GEOM_PREVIEW + Prévisualiser + + + GEOM_BUT_CLOSE + Fermer + + + GEOM_BUT_APPLY_AND_CLOSE + Appliquer et fermer + + + GEOM_BUT_APPLY + Appliquer + + + GEOM_BUT_HELP + Aide + + + + QObject + + XML_FILES_FILTER + Fichiers XML + + + ALL_FILES_FILTER + Tous les fichiers + + + WRN_WARNING + Attention + + + EXTERNAL_BROWSER_CANNOT_SHOW_PAGE + + + + BUT_OK + OK + + + WRN_STUDY_LOCKED + + + + GEOM_PRP_DONE + + + + GEOM_PRP_ABORT + + + + GEOM_ERROR_STATUS + + + + GEOM_INCORRECT_INPUT + + + + GEOM_ERROR + Erreur + + + GEOM_VERTEX + Sommet + + + GEOM_EDGE + Arête + + + GEOM_WIRE + Contour + + + GEOM_FACE + Face + + + GEOM_SHELL + + + + GEOM_SOLID + Solide + + + GEOM_COMPOUNDSOLID + + + + GEOM_COMPOUND + + + + GEOM_PRECISION_HINT + + + + diff --git a/src/HEXABLOCKGUI/resources/ModuleHexablock.png b/src/HEXABLOCKGUI/resources/ModuleHexablock.png new file mode 100755 index 0000000000000000000000000000000000000000..84d4eb1180c4a191c22ea3f15ce8f54b719f4848 GIT binary patch literal 38519 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%0DJ+!X(YWnpTu7CB?dzbXR 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 + +
      + + + + + +
      +
      + + +
      +
      + + +
      +
      diff --git a/src/HEXABLOCKGUI/resources/add_cylinder.png b/src/HEXABLOCKGUI/resources/add_cylinder.png new file mode 100644 index 0000000000000000000000000000000000000000..b982e25748a105f4587c573cea41bf302363290f GIT binary patch literal 780 zcmV+n1M~ceP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2iyV` z3Je#P-pwQc00N9jL_t(I%Y~FZs~$xZ$A7!`8XG@Adcnp*1qF))LI?!O6)hA}`2lSG zB=${%7WN5dlEg zbu97G*KfCv4s|r9r^0wt7>|VEF!SiEzjmAFSUCH~Ki<9fR_wpnbMw`A+a?0B%4Azc zO=KOJG;#QQis9eNlRw8Z;BFzm|LGfXaO*ufdit)z!iWfpH^?AcCQVG5$Wx^x;mZ$y z26zb=&SWT)@xxEw)9=CU8+V9s#4FXyn%M&T?BF3`u}EJB9s$D%pl0LtJGbcQx&PgL zOdZY6cvN}%_r$Y*GU>3e-DK{5{w8%)zWw+YfNQ`8czgm_lTxh^I5+QHM_o~`6r0$} ze~c+pM@0r}>*R~{>Rk5OlEo_?hKHdch)XMVEYzgPw1a6j&Wjb8w@S7F568k#t5nbA zk}1!GG6S_Vm`s-dTZV$UAYM_gh-niSM~h+A(dtMswEDTg{&-W|4GqP^+Oe^~Ex?0t zh@ib&5W&SjnGA`YhY>+|v^CmIaGSvn_M8lNT^MY zK}mvUM~hR3-GO!s!kTw``~A7V?%05RZJrw3_~ezv0GG literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/add_edge.png b/src/HEXABLOCKGUI/resources/add_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..33e8ed74863e109b218703ca2b489208244a3c58 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~wj^(N7l!{J zxM1({$v_d#0*}aI1_o{+5N5n|x9$&6kiEpy*OmPalPI5ty4$lYpMXM_JY5_^EKZ-j zvXS?Yfk5lS`(m+149o#d3)B~?eL3Ug%4%)MXv?a~Y|!9(@?wkMp3h2Ac+Qdhn*n0ioHYu10BYcKtNzZQ!)vO@HX(i)~`2UM7h^L@lbv_-iO z_?9=c`)3rhPN}M4(-XY0{warcBhv&ko`jSm(++IrW{28e|P`@ literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/add_group.png b/src/HEXABLOCKGUI/resources/add_group.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb484cdc4250c9243f23dbd3efe970cd5b616d5 GIT binary patch literal 1106 zcmV-Y1g-mtP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyV` z4ln^0@Tpb+00YuVL_t(I%Y~G0NL^(d$3Mq=y?VE6a_3&y^~H8oYC2g`PFne|ja9UU zT837F4irX>VK5_>Fa}}&UUZ3#6}VWfLEwZjl*O#}C);2X@?E&eXo};m$xOZXo^#Ki z=hutQx!oDHFPsj@0(U4k&SoOuYcr5aq+sVD=P^M zJ4M=mi^kS#Ed2Q~06z{_<8J>xkO0zv<0v7=J7LSRu$9f*-!`+bV9i!lMP~{NeVw28 z4)J)=Nq$>+gB7_6Ky=4b3?A^~9@G+G0M1V*eR&y&rfH(Y!4aGN!>=$ha&=lMH78rPDjJ%_rkV<{6`Y(x}F z91dOX;&8)>;fjh4ZAvLCkL69okY zQ->~fp~S{kHt*LSCoeB|Fciwava+I&`g}QPnudtbJ+_UZ7bZ|j0QP8_7Pl<>SASMJ zB@DyBbPQ}|;)sKYU>Ig;I&B?1aCtYDn51nTGwE<_`z3%6L?i^10V@DG^&R8hsKhPH z!c+#jlj88xrvNSj2@xS_FOy0oF_tWj@18(JhD4;?o%aL~-}dU+c*dcKBsEPV?HGLc z%;^ja=-E5ofSIxx+BM;oUj&MQDPY2F?6}XL|KKcZnkHEb62Qy7=jw4x#aGS0c;9jV zO#$BnQzDYgF#ZEL>Mj__%Gev~xa(+QHEeZ;o?`AI5B6RbYzjE-KL3K%cZ`dF^>qle zxxi{SrxzdQDqDV!?7o)+Q(Ja?b~=zB{%CTnyA7Dx+&Fk77>Y1C)*TX&q*w3V1KGR$ Y3tU_e3V@C&UjP6A07*qoM6N<$g7tOzy#N3J literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/add_hexa.png b/src/HEXABLOCKGUI/resources/add_hexa.png new file mode 100644 index 0000000000000000000000000000000000000000..861343bb2c0571c53c4ef4e4f506bd44553f9362 GIT binary patch literal 733 zcmV<30wVp1P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2iyV` z3K0>2(F6?u00Lb}L_t(I%dM2VjuclAhQHH0hQK@kIhG>_i&LZp2_Yc}u&_XcyaUhR zoB%lm5kTm~fkT27B7+AYvV|Bepk;Tu``qe6&=+Qz3BaO~(`xB_^;i8>C%8M`GZp|L zgcCn+J~;0HDvlPz)Uj%~gQ<~^g>+PD-(`;9Mn3)*X%BLkfnUP*E?i{MoI19Q%9jkiC z!`u7(c7J!eeib-7E4=o{FMj#bN-p`&^!e3ARru0fWs&wx&@vtIU=RN|IUWtcghSjK>rqrlhzq5x}p<3a6d`k#n zhPi{=08}v^-+Do51t~`9w*b>hNZO$$MC~c9KnQ46tomria6yXA;2MX7TNPHTh!(0Q zq!`Uk*nmwchi~RFT8{>xbb@H1SVBxN@!5oRm^&~+O&k}Wlb%qh#SpKU>)bEXO_-_A z=15X%lIDKJ`~EBadnVcoNhLj-kqUelQARc<lumsw9^^V>|nw>y8DoAl8DL%pmlN?u{=kN>ID_|d326rcf@P8h~ zb=W`S*-Z*}fxF}RwXp$Pe-B&W^*1V9j%Cg;fT`pkfwRDwZ&bKkhXH&7MU5p|nkjbK P00000NkvXXu0mjfA}l*T literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/add_law.png b/src/HEXABLOCKGUI/resources/add_law.png new file mode 100644 index 0000000000000000000000000000000000000000..6bd1db605c1a96bbadcf6ec275d94706d596653a GIT binary patch literal 1240 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 literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/add_vertex.png b/src/HEXABLOCKGUI/resources/add_vertex.png new file mode 100644 index 0000000000000000000000000000000000000000..60e7957cb62c8e85a4e04876a5e670704f845918 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~wj^(N7l!{J zxM1({$v_d#0*}aI1_o|n5N2eUHAey{$X?><>&kwINt91hyi#SWJWyz%r;B5V#p$<` z9k~t}2)N##u2;sr$DHIt4m}hr*y-$L`(|6VUEANEY7H;u&2)V#dv*EigALpT zELjJRmaXz(dd{e5bl}UP)QPH={I{5`A28l&ym)3GQ!$@^)#XFLD^ literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/assoc_edge.png b/src/HEXABLOCKGUI/resources/assoc_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..6990fcfc7b217b1bc3c9bb597dbcf47e1a0221e5 GIT binary patch literal 502 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyV` z4k_CX>@2HRA^-&M@dak?_?!z0003^ zNklzL`4{$Wt zMIo6Tq&T=s6^=vtlDtRqjMBje7jl!l@1AqtO@t(Nx%RN*We4{AM5jZDXg0z)D-)4l z09PwPucvJc;|v%q7{(by!Q`miL$W!>W0C}2mjn<*DS~81k_eI+gD5Q+>V7i};1-H4 zw1h>e2B{XRw>+H^q(B5%E_16Fcg5rD^RuFlss(tw6y37xQd2gWXo{68GdET17KcLx zwfEM9R*ID`I8L4_g)PHWUR?Nz*QMj+>RKwS3oY@Zr$2*Kl&8F20|0{f**fdmS5mjk z3V!0h($07*qoM6N<$g2JH4+W-In literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/assoc_quad.png b/src/HEXABLOCKGUI/resources/assoc_quad.png new file mode 100644 index 0000000000000000000000000000000000000000..24dad639650d7084343d8fb921d3bdeb2e099982 GIT binary patch literal 510 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2iyV` z4kiwo*8va!00DkUL_t(I%f*zjYr;Sj#=loGynsUl2RD~Yp%h$%j$OsoKftYI@6>cC zJv%uS$tsjOIg0;+gQJ5}7AL!TL!=Ic*TE!>i5j6oAG{&l-S57;@4FBL7p*H?yd>&F zL#8PLh!9C`4Is(dR8s;Y;KiTkpx(o+V6%bp=L7&x?hOElnswkc27rJfO2kSj%mSs^ z+)XK!(h5b*I!VXhv0~%UQI)^Iqw7ew)g#sFp$m|T6}!&<+*#-N9mWc!-7fMzr!wXw z3dOcX0VIHQ@16;x5tP3;1|+ZHB%2Q3hh&W{Fmoz4K>+XLUI?Ib!lC>H?W_c?^%^?V z*lxEeV66sBrx4pdJL>TXbg1zaeqsBa0@89x%AXSj0sSS`#;L)qqsOX#UB~Kk6~*~C z*mB~ok`1y(d9DNXs!**|QLdEt6=pN#H3t9xbGSIrD4LKprpTy5Q~Gax(xEO?mN!N6 zFJv;FK!+O4TnIEvCfMN9M`mVNu+9Rq!C+?m0NrM%o)RqLNB{r;07*qoM6N<$f;$q~ Am;e9( literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/assoc_vertex.png b/src/HEXABLOCKGUI/resources/assoc_vertex.png new file mode 100644 index 0000000000000000000000000000000000000000..334473d1c8525bf1eda704b4b8dc592aadefeb0e GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`j)FbFd;%$g$s6l5>) z^mS#w&B4XX%%mpm6ABcPEpd$~an8@pP0cG|a4t$sEJ;mKD9+4%hSa%#NzbRDYo2A2_miYwOdu3E(AC?cYjg-!~L$$aetf?bF7I4Z{knG8SAY| zAL_8*Yd>6V?<3?r?f4;6`HW}&%xsMY!t<6Zo@U{&eq(>nzh0tkk&fdgIUa_se?GQk zYIPmrINW#F;ns$aEoqCsAK0rIX(oBi<-b;+DrckBKbBJ736qXUnz6WDyqz`4>cq9^ zy*BKd-@Z8-`PbsgKfi9q`Nt=lmAaPh-RT^ye3*I1eErSGj{SRZ;M*(Kkj3(+y6@gB Q1^R-))78&qol`;+07}1{rUgjp4pVqfx)nmLriSie+3_2W=5tC&Y8)xFMO15(KHlLXpnG> zOG`(hX@Nn_1*e*KZD9}xvO)Bi&9DFNI9|X#27z#X#ePWQxz@e~dZ_nx5 z42&(0oQyu1v~6c(;yCJ-miFww0*`OAOiN71l6ykazN!DCzvva=}hDp{|3kfYu4_Y-nv`*4XXIWct=wKR00=)3bcP z6;HbYq+-Mv&Q>uBIP|yb=^94GcL6;a99U2%Jwx4rgnUfg=jAsT0Pgg&ebxsLQ05fC3eEPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyW2 z4;Uc~2?B`#00XT_L_t(I%Y~FrOk7nI#(($Cd%PKj8B$6qnqV*{#DfSMQ*5|dI2LCXj>AZRJ}F+-UtGcdypk9qUw zy}2$rk4~Ay-kY2Ia_*P&&Uemtj*wFFq~#525+J{4KU+2>nq~984y9Df#&l7yau!a#v8xB$SVUc02n|o&@S8@dV`u=jD&DXMe>ft z>F2tcSot2am}0lEL(bmEvQ5llnh#EW$y+zNiLNBsm`^eH)jGg15E7L|@dh>dhcQjo z-XoQdlgh=3Wy53&JJcv%Ji>!5i54NI&ZzZ|@$v*(2zySl$G_1KL$@P?Ixj69D9$9NSiuR6apIW3%v0 z1nI~FO4e@irT4l9Ccn7#A!acRKugCXEpE&uCslxSeg}Y(bSRYas6wN*p$3mCupJ4I z07B)1U#mw5LD6!mg`LY3g-aLUTIgfEs-MQzAm>Ip896`KXIsuyH^<}4BgCx@5>}M$ zHIt3GWTn4RrQ8{H`8~T6pis)ADH=z8PjT${Q7&EYLl3C$>H&4~=cPf?g>7Q{VeTz# zl8R&x9F=vrejpnmgdaGj2UO$Jn-{U1eM-_n5gzKadg^N$ANHGdpTE}US^6o;{MX^b zvZ)sK)tPrl=XbDd6Co4?0^Q@oqp0jyG1gb2MCOvjmNIT306qt90F#fk-e=Qqvz3hy z-P&aE>@4TMJx$4x*g1z>x=7-#No*;NF|&QRx&ZG3Q=E}!=#pJDw+H3r**iu5dl|TLqPH0{QE(%v z%-NMg_>dao;a=TbrH!^apuJ+|g%IErs;0WD%ck-ye1zAf4k=hzSYT{y48UKWcddZG nzrUXfszWX{ptYx`rwacc1u63NQLkof00000NkvXXu0mjfKlSC8 literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/cut_edge.png b/src/HEXABLOCKGUI/resources/cut_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..b460f73c5628638fa9311b840b181b0a50b22710 GIT binary patch literal 660 zcmV;F0&D$=P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyV` z4k!(sU40|~00I0CZp%H~dheU_<1{W;= z57*mJZI4zqs>0@i&D`WycCo@mi}eQMbF4R5Z@72y(`a^15bKfB<87SIHtR1>Oy|S3 z`hoP^EIK11Rn`5O-`GorKPFTW^r*b0hfV=v9xKmS_{Bw;N%o3__eXk u?v*XjoibLtL;RS+S>SM!8V4-fPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyV` z4kruqro`R=00UAoHA)wnBvJx;zG@E5M>#Xy*Gk4~`&NIb~6Ze(I(|o5m z{P_L9^L-Bg<5Y?z`_Yvwr)MtkPgJI|`#0WEkGJac_TT%`)V6aN?DAK6PL7<#Pj+cW zHG-YwaNt&b-Y!jT7l3gfzaL&Hmh9(OrPK_2()@|9vKUVBGyYu zxFruY9Pia;4@RX}if1?03nJ2JZOG+vIJn&TaGRGtm_{WUYrz`uD#cR2;k*Ks;=+Ri z`8U=Jz-)6X;`o^nbVjp&^)Jr9HAAoyW3n1xv+Mev?HrUoOBes&GSxT^*q){0E8=k%qaUK|TB065iZ^~Cy> zC!`&T2)iR=q(uvZo9X_q_w%j07;O-3O&kb1zhzmzI7C7dtxPxM&q@+U-MmY z^%wv~Ta30Sp>c8XUVM2GWdu@6lD6chA9j$@03y<;)L@MHFR%$bXfzrt_r9^$&tICx z=&m6Klu}1-3INvhBlit^!+y{A{gwOIYG`55!k~n~Xp5Vuh%^x-ZAseE7-Nu$>OVZ> z?1BFNZ5^#FMj5OHH*G6A)s%K6A*`lot%-d}8c0N>_8T66wpy)~hd2CZW7DZ7gmppe zOTt=;Qi{lzL`~WKMPrWYNFN#m!OEkX0U6K1OInJ!CAzZ}Dx{QzHK)HyM;Pvh5(L4@ z=54NfQ6nX4NaChMgc79`VLgxILN+g-XLu;|Dbk1>c-6$gY5)KL07*qoM6N<$f`+rc AaR2}S literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/join_quad.png b/src/HEXABLOCKGUI/resources/join_quad.png new file mode 100644 index 0000000000000000000000000000000000000000..187cf8c19b12fa9f2423c9303350c45a40560009 GIT binary patch literal 710 zcmV;%0y+JOP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2iyV` z3KIa>S4MpR00KryL_t(I%bk?HZd5T4g+K2)A%rTTNlB3h00~j2K`E$^kf1{d9w2W6 z4bbxjX_27g4MLv+kU|!AuRU{y!grnB{0PKISGsqu{dtb(*y+KGJF#&qGtG&V5)px0 z5FP+nal8b>&&uMbF`QL?|0sO>I!gd4B~~N51WK*9QTw;a@GzfOYPej6k>y564sx(JNLs7S`X# z*aJRsA#xqW;PVbN88u2D;A-*%^<0`Ju8UlM8KyEytyC3Gzn>AJOJ1_lG?69{9&F#< zJe+P!4gqZ8)VX7WQnsQsm_foic8QguRmC)?Cb>8(o+ktMfak#7 z72f{lt=xUrymn5EoTziB4vy-YZOG$oaeSe`{ZJ4(MRjPfIOScX6}CM?ku0(-CeviIaXTJmXnvpmSWBP9hh?_rFL6O sLTbx>c=d(}1{rUgjp4pVqfx)nWXUUa-$v^6LFfuT@OlH z&NG9AH26$?7+x*XTEV?GaT+6wfG3-hWE#(rdlxnYw@Dv6aDYR=!9|+Gw1@u)OOn3A zHFqNpJ_e=^4d#VyjV97e8`Y;gJGM+rp@BoHBSqqb>pP2BHdY44mg^3ac$t|R7!GAB zM7A*k-JU4XF=eiYIS&T|6UR}9EpJkMHzhhS2smi4ElO3t!s4yMz@f0CF(6;dnKz1W z=~U0NPZ$`Fa1_fbD=VK+Wpl`3o@&i>M7-gLwk8`Bi@>JF1)qFawf-@6?Vt3@se!?X j&pEF`(UXyZ!+>G-&vkMbP0l+XkKZ6k_M literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/load_document.png b/src/HEXABLOCKGUI/resources/load_document.png new file mode 100755 index 0000000000000000000000000000000000000000..ccb7377dba338ca7c5b41a528baf5cae316d5023 GIT binary patch literal 874 zcmV-w1C{)VP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyV{ z3^oqIBxu0^00QbsL_t(I%bk?VYh6Vg$3MTBIVZhsG;K^GmQoO<(C!M-jbIl=bfu^i z7w#&!>BfD*e?XB!7X=a8O{p&2b>Xv=EQ+>10@hTT+tAov8WZ!n_uPAO&Yby;i~GoJ zrE2qq;SBudd>_Ag2*CT(ufBI|-|Ln1MaLiQ-r)~zO{B{`t;mKK+^#P z^*C`vQ4*65elTLGV#QcGVfXBKx@N^9NSDkwoFt6c8uzmLYok-&Udon=8*W%}n9Q04 zK@c%Sl%R?daK?3o)Kk$-q%qX;bw35v+%Q2_itgq%iup45zBO@e9|#2-z@_-*z3 z)h&mTaIbZfPL<&#A)*Los0EH9?6t&r4StJwi)XuJL3#PP1I)edQ*VpJk=Kon6bt$Oo_Ak3}LEYDuLUw7SxZjx6Sf}sdG8UtR-!S}zAn3T=X-UKq& zkC6E$G3tQuap1MY2fqm9J%_ogw508uY!}zh-}x12JAg)eK6T=#Vzn(YCrPXPyj{Xh+RkKVtduc$y9r~`9<1JkT|&RXeSxc~qF07*qoM6N<$f@nCF AG5`Po literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/make_cylinder.png b/src/HEXABLOCKGUI/resources/make_cylinder.png new file mode 100644 index 0000000000000000000000000000000000000000..1f2b6dc43464d6438613d641bea10ee3dd73496a GIT binary patch literal 859 zcmV-h1ElPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2iyc1 z4-OMx*yBt900P@dL_t(I%Y~Fbh+S0>hrfH@Zq_1dW3fdFMG_E6+$O;ypeT|U6Ve!1 zgiR{35(AbtTS>5zASk#&5fK(e1VKa)1)~UBY$1V2)*=XbX31mCyZ_FaGczgfyD#sp zyS}L|_ni6o&2Q#R=I#JwSwTMZlQf8W16ijFfk`E&WB zqdvEg^W2kX+Dka1k=2#UyuNmhCRNm_VC&Dq%R77QxbVt(l7+D^ljSybWbO3TNrj7}vZp zcW*W0lFz(zgw!bCy!8irHl-OR8ZD{PkQY~ulQa^o;rI1T<_{`QJ#+x6l@yHBC{ioC z#gsxZK}`^gB#Ve9nqh(((t@JVNYRj>q-eVW^U0=|Daq6Qu~A2A<-p=2xPd!hj;rI& zY=u93{To?s96Rv@?v9(c<*DKBm^yCo{iW-ZP1zk7OXb+fLm0+S>(`KwkkatF$F(nS zO*Q42iwBWl{QTaHy@6pUh$K=lmR@)ijjg(0KKP5nCl-liLZcC@wjq0YI0jbRGES0U zm>5zkVJL(`klNa&G>Rs}WJbx=AQFleSZswhIVjb(Q2Y~+T2XN<8NGe^Y!6ed4Eqfl zjeI^Iud`|pad)yj1Dq^x?Xg)vfZo0wO-?9;)L1*jwGzvApiLdu*1O(ZJ`=d~)f*cd z0MEX8s2%jtYluZ^eH%TF>)-afoF8`rvx$xUIPmgldz|L~qXQMdRp1ME-`uINKRWEb lr?$wBC`NZ~jB>`3?*aTODvc+Yc_aV;002ovPDHLkV1irej}`y` literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/make_cylinders.png b/src/HEXABLOCKGUI/resources/make_cylinders.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a579ff7a9b14d9d680195d59831529280f4971 GIT binary patch literal 791 zcmV+y1L*vTP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyV` z3Kcp?0XRtj0013yMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak?_?!z0007R zNklF*~tMJQI=?Xx7W9|&YDAmbO(r!!a0YIQDIa#c(0 zag7C34DkvVl;o*Fp4hbmw<*`WYv-?@eFT8Up}ta?QO~-KQ3%m#b zd1`DL=`Vmg7+5$bmnf%{aSBIrsEY7QQ))5m>BZ8N`VnmVqt+`s)BU!0mpVIA$6?k1pbz}md1hAn?JSPNtVS6r!vfY= zP)+d-uFt`ysMJ0QOnud4N621Xm`*r3};qRwXgJ`VNcf8MgSDvv|4*5076JHLYE{&t2m(leA%-&z3Hf=~i3 z7;z*6my8R=XOm7gb!a%~RCap-e;592KJPV>kNsv^HQG*q5C;SRvB*YWvG zoIGSKP{Whny~2pQG+a~j0F2Q#{r0JGnVckG84HN?`K&)GAI9zM^Y%vJ4f*dA`wz=& V{zC`Seg*&l002ovPDHLkV1ldYTFd|d literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/make_grid.png b/src/HEXABLOCKGUI/resources/make_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..7497d7618702e6f64a11c476f5158533151e841d GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85pG3gD_*9)I=GeAbW|YuPgf7v28z*fLW@ni2CqSi;lYwFBGxN+w zhEEZK8tT~lC0fWNPlXx#I^8$+|){5?0ZUa$1OT5%%3gEwinKJUfmJ-Yjs zDu23nFK%k9|Mmy%l2IFE7du&>F?n^PYi;X?328y@j-DNUrd*y+-j&xeOsfyyTxFY` Q26P~Ur>mdKI;Vst0CT=&L;wH) literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/make_hemisphere.png b/src/HEXABLOCKGUI/resources/make_hemisphere.png new file mode 100644 index 0000000000000000000000000000000000000000..9277d35cbb55cca40812f9955ec200958606a0b0 GIT binary patch literal 2291 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyc1 z4-zRrqi3T400?tQL_t(o!|j)AkQCJw$A9;B&-C=n&c5I5i```xL~s%0A+jn+P(jhC zi54bUsWOG845q9y8p|qFN~4t$#Zscg7geYUrqrlGlvg1J#5Ze%?81V}V_|1svpdgz z-Fz6Fg`k$^OY*_&DY4o-L+P`X%Pb+q zWFeWP`D92)fsh~s2u&b0fo^ChSD`>Tme=Mv>NyX!b!a%T|D(dL*!KpQbgVk3urPF+ z=9f#P6s6xZS$PWGkm!a6faiF4E_j~uT+3@yu-;C)Zx0M7c70ZKDEW21J`JGda8-VO zLFmEU-0)9KBbaL%L4rmI(+FbvgPE%lB4`A$(hgq^?xi!b7Y{ePhUY4jr*LhR_FV6P z=dmL>WIeJyZ{O$N3UE*TUBOusrmyxi@5h=Z{X$5jlt>|wLPJV{5L)(GA{Iybp?lyE z@BM2d2YcJIAWA7v85k$+*^ce)KG4zIx_@jWbuxg)1qgt9&$!Ef>5O@IhjYS<9c2gl z?V}8(2YK}6`=*)pi%m2(z{lf zN_UYy2ao{iGVwyo#W&RvYFnMh;BIOernMPICk_U<-1d-l>ZbQB>)xtXKiJR@4)xr5FKfPP_h z>-cauyeyjRYkqg%dH_t*JdsQziRC&jE7v^4?TeOE5H3R3b%YRn^u_yZ*!3#?!x07( zeeBq?g@1neDXkNK#98%Is4T4E%<9Q>9&cxR+a}+z9la^9old zt$54M1DnOZ=SZ@ zXN@_BhK2?#JwePHATOtYDRt*@`HXAPq*kiwa&c{OQ3HS;kH^P$CHBhQk@rwSo#O6| zZ)^eJmy2#e(fOp&Q!L0$=D185@po z%nKHfzNl5@SD0! zt8~iH10UoEisBD2`kgs9)0dX9)9}%Ot}S=@=j|qnjC2{ z>;AHim)E^a&9oxIH_x~p>c`en*I2`WjxJ`-ol0#( z6}64k)HYO6Q&&aTfx|SkmZCHVPJC7>>d?KnpW3oUs>-S}o$#j{7xzaKu_tN*XFM_~ ze@@gCIU~nOI+-HVQp?8Iw&B>$f2fyC7!o2%TnrLpfEWV|(R<2xCRAW091KEKS5^}Y z1&6YMx@yCs$nnA6$IE5?^7D$WbWM>9KmT22eHWs`rWPcNVHv$)>3>d9AD_$nskVkO<|fU{)TVXp#VnkAHAjwgUz61XU)k2~cRdYl_mtwP-J@&kW<-XL8;)m7 zg@-ul&0vwAV38l!Qus|Dfsmg-$iNH-2<8Paa|0kmrlARut+b||!`Wk|Q(alt6-`I) zJ`Diiv;H=9PR``LC3?mFGP7Fu3nQp$damQz!tv~^cU{LLHS7Qi*Y$85H&YGMHmQV# zm9$R@g(h_BE1H?qI1OF;{@gu$?2T`fzbnr&OoHR0TxDotu7j_Z_o$_=I6 zq==`6Nu^Vi<&UDgxbm=VIcttZjz6vC>5;WNUrN3?xWW73pYZ?2{taK^# literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/make_pipe.png b/src/HEXABLOCKGUI/resources/make_pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..04fe38f3298ccfe1f6a846fcfdb8bf48e65101ed GIT binary patch literal 887 zcmV--1Bm>IP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2iyc1 z4-F+P~i-ZV!F@6z*H6o%&L?ar4J0Ttv z1R*5ejE5EU=FL;cK@$)`6b&k3@B_VwpurpxF(5cX5F*(&pFba(x#>R;WJxH|wzk}$SIpFY@ZMhJybt_sC+O|dNGgNokiEB{^|*_bo6cJtZy z@As*hl*jHq&|Jb13w*M0o+pm)q|$;?GX}q9p8pkC`MtOXoQ%m&oxIn(j~^r)+wE;6)dnEa096zj!Izen z)+V(F=(&5ou4Ju@gRjp4aKqF#K0Nw8-U`%cn}%&g2Zwe071e0}t%q)pRv_Q=UcKooJ3nICJdM z+NNv_47u@8cMgrp*^e)R!%SzII#YiA;_AAlJo3^VNF6!<=H<QnNBfv z>P*loHjlV8Lf$;+XpUQ>U1utt2;BYULazt#=*xFD4}J6-LZ*#wqt9{aoBr76?56WD zNs`-ur$^JH%m3RLlmX{}&)j|SzZv#NhvW5*(eT{JveBK(BcC?qe*kdaGW@VLBennl N002ovPDHLkV1hLEmv{gG literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/make_pipes.png b/src/HEXABLOCKGUI/resources/make_pipes.png new file mode 100644 index 0000000000000000000000000000000000000000..e005070d0933ecf78eb605609d382992b0c216d0 GIT binary patch literal 791 zcmV+y1L*vTP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyV` z3Katv1h7E>0013yMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak?_?!z0007R zNklF*~tMJQI=?Xx7W9|&YDAmbO(r!!a0YIQDIa#c(0 zag7C34DkvVl;o*Fp4hbmw<*`WYv-?@eFT8Up}ta?QO~-KQ3%m#b zd1`DL=`Vmg7+5$bmnf%{aSBIrsEY7QQ))5m>BZ8N`VnmVqt+`s)BU!0mpVIA$6?k1pbz}md1hAn?JSPNtVS6r!vfY= zP)+d-uFt`ysMJ0QOnud4N621Xm`*r3};qRwXgJ`VNcf8MgSDvv|4*5076JHLYE{&t2m(leA%-&z3Hf=~i3 z7;z*6my8R=XOm7gb!a%~RCap-e;592KJPV>kNsv^HQG*q5C;SRvB*YWvG zoIGSKP{Whny~2pQG+a~j0F2Q#{r0JGnVckG84HN?`K&)GAI9zM^Y%vJ4f*dA`wz=& V{zC`Seg*&l002ovPDHLkV1mepTGs#o literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/make_symmetry.png b/src/HEXABLOCKGUI/resources/make_symmetry.png new file mode 100644 index 0000000000000000000000000000000000000000..8f29775738f67d6d778d6d92fa6b6b08bd66e65f GIT binary patch literal 633 zcmV-<0*3vGP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2iyV` z3KR&L%~*&400H?)L_t(I%axSBY7|iv#(#Gw7QzOsWD5(6g>5$kL=lTr1_U9kO-$t@ zq)6ur_yi$^g%2PIR@x{?3N3sDVIyeVnVq@+?_7(WS=Vvzt~qcRhBN1z@1Fa8N5mKb z5JIpVcaCnyYu7WJ3Rvl>epqJT4f!{Tn!3L~UW%<$!Aj5mvwMWvV}qgc1!m?ref$An z2wVVVx38B1RJlicN#$qEY>qA*a_ZXhLtwC~F9~Q0hYl6mDQxM{g~L_8Ef0bIm5!_n zk1-Zoc}(eXD&TF+rbq%76NUO^u`*yQk2f`5hmC;ABg>z5=jD@6cpa!iB)FP4Ctm^H zuSJY8(n_ZjL*Q6sA_8r`16~8iP5qw`DIGRLA2&BTZr)4a3-GpimPx?#(I|>u53&rA zWe_9LdunT`l|sjeiILDy&Ds=#9@BgPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2iyV` z3KTKM$k2cQ00KctL_t(I%gvNAYZO5gfWJ+y%VFsy5>dE75)r(B2#SiL34wru1|k+A zVqsw+R$4?zXXy{Hu?YSGixi?30f{yNQACqcE{0%k_jYe)cV_lkxO?uMC#Y#07)=`u-J|S_@DC28#RM--6bvRS|0uV=yA5z`1(e+e@|sK=sAY zkO239t3WkBX{kH<`1~Q!zCj0;jhEZKzFY=IvH}ifdto-C4&aF!hh_TKNwjSd8lUY? zO$olJG7uHQLSW-Uy*>+!02|p1J8C#_?V!xuIYn$0kqyv+Ar381=ieYsx}jug=D^K- zvji}5e!pD2JwY?sMaLTDCz!~Qv}_(%1J=8sTZL5Hqf|MvPbMFX6Q~A8Idou1LW@mO zT$1K-r!&B2;oYdmspLV7>)pBt8=mk-G3ROOf3;${BSfN5ZHa&esJ4?h-R>%dB0 z!`j@iT)KM(lNyu_S-!c-&gZb*G_N3Q4Vd=&y~W?bMyDz=yL1+tTH;ipjY9hgPp-Vq z{cL*}WiKI4DCn?K?5^?+k!_MVjnR%cG$f(xFrn1dwe@VB13Oe{eM@MyB8+mxp~WbN zQLe*;?yHwWbMrg2Xl`j#!;nNjVFk4YfpV!w=X?4E5H~GqH)+F6>`2Yte$diAy?!rW nKLU=G{t{RN7P2RWCbq|S_iIp%Sq^R900000NkvXXu0mjf$S5=$ literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/merge.png b/src/HEXABLOCKGUI/resources/merge.png new file mode 100644 index 0000000000000000000000000000000000000000..daf2951c4ca2f060c24ff28c0ce938375c1934d9 GIT binary patch literal 841 zcmV-P1GfB$P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyV` z3KJhyUrUGp00PNLL_t(I%dL}3XjE4ifWI*prsB+^1!X8Gf>|ht1ZtJ~!Uw^}LWu-i zNFzaOL{utOK{FuHyHHTb0|ilZ<7-j6C@umDW-%6QH`8^~jhl`SB=Mg6IQO21i<}wm z7$1xDhr2lZ=X~e8|M`EcwftYPU}4cRSK#8+Ut56EqM`*B%$uuK8fnUvudH|_D?sO* zf$?-k8Y+rquK`rNk8SF%uCRrU0svN9jJD|1ki{A)6!BC_@KW;bzl5n5Q5Vn)lz>vf zT1%l&m{s5I>I!kF?+6x)wFYGs+GJ!VB{dSMW6o~6h78mWpvwX4ZHDWQF0)>-0{|%$ zqr;;dIWd5-8f`L^QKTjzHIhVy&0}3a9cTce4fyQ(zoj+(OU2Onix{i1Sk4?j$H_~F z(N>WeNoF#nj);|L9;-Om-vILfI=3vc%Xe1n%01tT=xxd`$Ii3>7l*419T*|i38|hj zi?V=N35=fIavs3s(^sV>Yrhe9e!T&Jv6>%u4KVWC1uT}!_Xat*_8fzc_milQSV#F^ zZi{BylwLf4+q-XTzpGWo?MGwu|8RQ7%t%ISXYse)ZNZe(d~7C~Kmjz~{3HCH)%_T& zNp-^A=Og^Irb?<4q>1n+4l}lW93?eMn$H@B?xn`V*V5m+>JW*J2vxw%KYdQDyF{!6 ziH*lKJCD*>G@S<6{890&((Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyV{ z3^fCkxJSPL00F{DL_t(I%dM2ZZWBQehrjjNIooFvjGT}tQVJ9rBxsNL-y8sMfj6@+RQ2y;Ea0U?(bME)sQX8s2c65U-BIGoBH(K$Lp@F3 ze}B~wgT6o9?H8;0JK**-R8>!A04kz_k3Olx{x^KIT?07i$4wj3~Vyb?fz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;p-DtRRCwBA{Qv(y12q9a0FjMOYiM9~2|xfbk!#?; zKYu`!I1qCqivt7@BdG?RR961~A86SB-@h4t1B2@yP|V@^bGSJG0YnZ0xk!1Rq$J48 zg0%caijd#o}rPfB*t{nVX%R{fl+sT82MAzd;NG(*OSaWH`UH zjN$L!zXzbMTL8ot2_*r500Jd!o}WK|ChY6*Vfgj!BN+ew{u$Y@FG$`418ZyR|K{fA z{|yWbFmek(05L*i4HQNmKwM)O)xmISWi_&4AlL1Hg`tg&&41&VZiZif{(@7(?!G97 zr%#{4BMl&c7?F|!*idF><{Dgvfm~#jIu&Tye}ZIl;nX^2?Vm z!1VbWY}k*VzaWwL6D|!-2>=0vp7mgc-hpK$WXTU7J}`Xv3Nh#}Fj@Wi^_}70Z+Kb- zPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2iye% z4k`_3Im`6`00HnxL_t(I%axS9ixW{4#eXjo3tQi#KJ#8u+=7oSj58rV13g@H}7Mvg)?Dxl9}vYxG>Cp=WykZcIe1r6IYdoz|N^! z){!I64JL8qvBPE_XNpx_!ojrqRM@DKQ=fIWn z5@O&RFe&TnBdFAU9gRfwdJqJtAOI1>ISOMavJ5RkE`l$m230D>ZRxLOscJ7}r}S3S z4)y=>CPPa&n5x;~Wnk8C0EbP(Uc7q#UAAzT*s+}H{rc=S%slQ?INA-TFP^+!A?`o8 zhd0H|y24W3xKgj$mc#JY1$p`O&6MZaNI`|JIviorHQ}y9jTb zdO4(jIu(X(%b}y?PKE8!@${sbwP*OMoa4#Y7cd4M)q&z=tH6JzO%9oxz9str0000< KMNUMnLSTX%njf(M literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/perform_transformation.png b/src/HEXABLOCKGUI/resources/perform_transformation.png new file mode 100644 index 0000000000000000000000000000000000000000..b7816621c03d638bef314a38c3fe396c40d9a18c GIT binary patch literal 680 zcmV;Z0$2TsP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU(%pXi00007bV*G`2iye% z4lN{Q%Eev)00JmUL_t(I%gvNOXcKW1$3K^5>)|A(m5M?tO+_#TBWOD)+EVCXK%wGL z>Llpks6z$8$;nw<#krtEC+pCqb}5JwBpoHO6m2edy+6O-fF6!ktqxd-o!N-osTbw!gH+ z`Rdz%XN0*x{c59e6Bq^RiMjiFIC1NQ%sse7sC_)`5IBm^)x2K#fW*=ZB`GrnZl%sV z!044@a_#;E?dS(V7~r=elou22=`^kkZ1zB#MycJCFPu3d(~rk-{9TkE6F7><)##{0 z9CgyTsRXcP-1RcDCim^LW51kR!`lh*c0&B!2*0HW9nITEACXwzC(XD2L;^X$)_%PB z>h?N8OA+j9!nR`N$)^fBl z<@pg=US96n(bKk=e~V>6%fPHPU@aM$Z2~LlK*nYY^6cJ=-!iIJtEoP_I`ooDNGup~ zSTU#Tw^YCOm4QuD*xp8|w3fb9YPG3esqB4^`T?haX6Cl3)M`T}EL~OYX3!5f1lYL@ zn6*(VHBDHhR z$)QE|hk?P&7`?@_}w;@O1TaS?83{1OP30YLx&0 literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/point3.png b/src/HEXABLOCKGUI/resources/point3.png new file mode 100755 index 0000000000000000000000000000000000000000..de84d9652ed8697df71d5ab5fae610b2f8a826d0 GIT binary patch literal 363 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 literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/remove_group.png b/src/HEXABLOCKGUI/resources/remove_group.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc5b804e4127ff318c7e179a466ccfeeaa32fbf GIT binary patch literal 1084 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 Hu0mjf(nh&% literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/select1.png b/src/HEXABLOCKGUI/resources/select1.png new file mode 100755 index 0000000000000000000000000000000000000000..ecb252ab77e4d4b1c8b37de449155e4e77806fd8 GIT binary patch literal 1143 zcmV--1c>{IP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ*Y z+1|@J&vTys*x8s(A9y&=ABPX$@Ar2R#uxzVK5M}eVA}#m3ZfBZ@`~am4@2{B2*kg@6q&*BNEwM?&B@+_EcgOBFPbq)fl4T!YS@w}t zFVDWmkpfEygkanm1x6e}ti+})Zj&gJl$S{orION^4KN{5Ud{{4>Hywey>xcXnpdU^ zrOY^>9C?&PZQ`Xi@t94l#NwI9rp^VH0yU-aL{&Q7&jSk=qk`z-UEi)-47^pla@I!R z8mbt{@XMVYl*J`Wp1gAbuzXHs^@|Tb`aE;0?qkxevlz^2GOi+>_33PD%CS{TeJaziQldy^CkLzy55TqhE(>~8;uAP9aj#$*8>=mlDV z%OSJ~1Y?1RF1MZ}lj=tKMI0xJ5JCc(Vj=&Y5Te@{(;r&%LUkP>tN;Xn8J(1OKW)?| z(4U<8>jw;m@|$iW5{<`&5INwYG3M{E03-Jja23df6*kw5p4J*;%$DPazoU@LAZ3IZ z6*btlT@k9d8dkC^{H8*i=DM?NOn~qE?Y@`a@O%A60II4V$F}7nA%q2}(3%^n@@h9X zn;R|%hWpWYo>$k_dVI&xgWD)8pG4)ok07Od6>vt(tlM~A*KWEnelv^(3SqH!{b>Uf zl~V8gd%Avi!~U&Q&wrL%CeL_UN;waR@_&yvR44?NWdkTbOZ1|fK+8*w^>#Xem1^}qu>hx~?yEOm+002ov JPDHLkV1g&y5jFq- literal 0 HcmV?d00001 diff --git a/src/HEXABLOCKGUI/resources/set_propagation.png b/src/HEXABLOCKGUI/resources/set_propagation.png new file mode 100644 index 0000000000000000000000000000000000000000..69a88a10754deed73e237cec9600ba5e54a78850 GIT binary patch literal 693 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`j)FbFd;%$g$s6l6(v z^mSxl*w|O|J8&|PuaN8!dvUJQ@P{la|B-gZ)&&574xSB8IiH3s02iYYIYJG3GO%AIp2$FKpVMti8H+{n#a+ZHa640uHj}FN@G@CAzGI3~Q{@G>VsbDR5GF1M8DKm?} z8HX81m^J<}mZ#>cjh%^NMfB)wZdCc;>eM2hjmyv6gEt6%>2kc>7W6R(GM1Z z`wW%BnoJIl#21)&-Do}}rO>dUQZnrzcgB(eh02eNA%B=Xcmw=|rWh?qp0`A6j*8R%c4=8gfG+da> zdtz$a0u~+<6TyrZg)6)R7^?Cd`$~ZhcF|8*c&}yW8}=(p6T%sJH?>p=Pm9iLFu1@| zA;!X?ki&M!n{UN*7Kb*bSSb!(f4(IKwT@aZ?>ztj literal 0 HcmV?d00001 diff --git a/src/HEXABLOCK_I/HEXABLOCK.cxx b/src/HEXABLOCK_I/HEXABLOCK.cxx new file mode 100755 index 0000000..8959a5e --- /dev/null +++ b/src/HEXABLOCK_I/HEXABLOCK.cxx @@ -0,0 +1,833 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; + + +static bool db = false; + + + +// #include +// +// #include +// #include +// #include +// #include +// #include +// #include +// #include +// #include +// #include +// #include +// #include +// #include +// #include +// #include + +//////////// + + + + + + +#include +#include +#include +#include +#include +#include + + +#include + +#include +#include +#include +#include + +#include "SALOME_NamingService.hxx" +#include "SALOME_LifeCycleCORBA.hxx" +#include "Utils_SINGLETON.hxx" +#include "Utils_ExceptHandlers.hxx" +#include "HexElements_grid.cxx" + + +#include "HEXABLOCK.hxx" +#include "utilities.h" + +#include "HexDocument_impl.hxx" +#include + +// #include "SALOMEDS_Tool.hxx" +// #include "SALOMEDSImpl_TMPFile.hxx" + +using namespace HEXABLOCK_ORB; + + +// Static variables definition +PortableServer::POA_var HEXABLOCK_Gen_i::_poa; +HEXABLOCK_Gen_i* HEXABLOCK_Gen_i::_HEXABLOCKGen = NULL; +SALOME_LifeCycleCORBA* HEXABLOCK_Gen_i::_lcc = NULL; +GEOM::GEOM_Gen_var HEXABLOCK_Gen_i::_geomGen = GEOM::GEOM_Gen::_nil(); +// GEOM_Client* HEXABLOCK_Gen_i::_geomClient = NULL; +CORBA::ORB_var HEXABLOCK_Gen_i::_orb; +SALOME_NamingService* HEXABLOCK_Gen_i::_ns = NULL; + +//============================================================================= +/*! + * standard constructor + */ +//============================================================================= + +HEXABLOCK_Gen_i::HEXABLOCK_Gen_i(CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char *interfaceName) : + Engines_Component_i(orb, poa, contId, instanceName, interfaceName) +{ + MESSAGE("activate object"); + _thisObj = this ; + _poa = PortableServer::POA::_duplicate(poa); + _orb = CORBA::ORB::_duplicate(orb); + _id = _poa->activate_object(_thisObj); + _engine_cpp = new HEXA_NS::Hex; + _geomClient = NULL; + _HEXABLOCKGen = this; + MESSAGE("ALRRRRRIGHTTTTT"); +} + +//============================================================================= +/*! + * GetServant [ static ] + * + * Get servant of the CORBA object + */ +//============================================================================= + +PortableServer::ServantBase_var HEXABLOCK_Gen_i::GetServant( CORBA::Object_ptr theObject ) +{ + if( CORBA::is_nil( theObject ) || CORBA::is_nil( GetPOA() ) ) + return NULL; + try { + PortableServer::Servant aServant = GetPOA()->reference_to_servant( theObject ); + return aServant; + } + catch (...) { + INFOS( "GetServant - Unknown exception was caught!!!" ); + return NULL; + } +} + + + +//============================================================================= +// destructor +//============================================================================= +HEXABLOCK_Gen_i::~HEXABLOCK_Gen_i() +{ +} + + + + +//============================================================================= +/*! + * DumpPython + */ +//============================================================================= +Engines::TMPFile* HEXABLOCK_Gen_i::DumpPython(CORBA::Object_ptr theStudy, + CORBA::Boolean /*isPublished*/, + CORBA::Boolean /*isMultiFile*/, + CORBA::Boolean& isValidScript) +{ + MESSAGE("DumpPython DumpPython DumpPython DumpPython"); + std::cout << "DumpPython DumpPython DumpPython DumpPython" << std::endl; + isValidScript = true; // to avoid dump python operation failing + Engines::TMPFile_var aStreamFile = new Engines::TMPFile(0); + return aStreamFile._retn(); +} +// SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(theStudy); +// if(CORBA::is_nil(aStudy)) +// return new Engines::TMPFile(0); +// +// SALOMEDS::SObject_var aSO = aStudy->FindComponent(ComponentDataType()); +// if(CORBA::is_nil(aSO)) +// return new Engines::TMPFile(0); +// +// TObjectData objData; +// std::vector objectDataVec; +// +// TVariablesList aVariableMap; +// +// SALOMEDS::ChildIterator_var Itr = aStudy->NewChildIterator(aSO); +// for(Itr->InitEx(true); Itr->More(); Itr->Next()) { +// SALOMEDS::SObject_var aValue = Itr->Value(); +// CORBA::String_var IOR = aValue->GetIOR(); +// if(strlen(IOR.in()) > 0) { +// CORBA::Object_var obj = _orb->string_to_object(IOR); +// GEOM::GEOM_Object_var GO = GEOM::GEOM_Object::_narrow(obj); +// if(!CORBA::is_nil(GO)) { +// CORBA::String_var aName = aValue->GetName(); +// CORBA::String_var anEntry = GO->GetEntry(); +// CORBA::String_var aStudyEntry = aValue->GetID(); +// objData._name = aName.in(); +// objData._entry = anEntry.in(); +// objData._studyEntry = aStudyEntry.in(); +// objectDataVec.push_back( objData ); +// +// //Find attribute with list of used notebook variables +// SALOMEDS::GenericAttribute_var anAttr; +// SALOMEDS::AttributeString_var anAttrStr; +// if(aValue->FindAttribute(anAttr,"AttributeString")){ +// anAttrStr = SALOMEDS::AttributeString::_narrow(anAttr); +// SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(anAttrStr->Value()); +// ObjectStates* aStates = new ObjectStates(); +// for(int i = 0; i < aSections->length(); i++) { +// TState aState; +// SALOMEDS::ListOfStrings aListOfVars = aSections[i]; +// for(int j = 0; j < aListOfVars.length(); j++) { +// bool isVar = aStudy->IsVariable(aListOfVars[j].in()); +// TVariable aVar = TVariable( (char*)aListOfVars[j].in(), isVar ); +// aState.push_back(aVar); +// } +// aStates->AddState(aState); +// } +// aVariableMap.insert(std::make_pair(TCollection_AsciiString(anEntry),aStates)); +// } +// } +// } +// } +// +// TCollection_AsciiString aScript; +// aScript += _impl->DumpPython(aStudy->StudyId(), objectDataVec, aVariableMap, isPublished, isValidScript); +// +// if (isPublished) +// { +// //Output the script that sets up the visual parameters. +// char* script = aStudy->GetDefaultScript(ComponentDataType(), "\t"); +// if (script && strlen(script) > 0) { +// aScript += "\n\t### Store presentation parameters of displayed objects\n"; +// aScript += script; +// CORBA::string_free(script); +// } +// } +// +// aScript += "\n\tpass\n"; +// +// int aLen = aScript.Length(); +// unsigned char* aBuffer = new unsigned char[aLen+1]; +// strcpy((char*)aBuffer, aScript.ToCString()); +// +// CORBA::Octet* anOctetBuf = (CORBA::Octet*)aBuffer; +// Engines::TMPFile_var aStreamFile = new Engines::TMPFile(aLen+1, aLen+1, anOctetBuf, 1); +// +// return aStreamFile._retn(); +// } + + + + +void HEXABLOCK_Gen_i::test() +{ + MESSAGE("HEEEEEEEEEEEEEEYYYYYYYYYYY"); +} + +CORBA::Long HEXABLOCK_Gen_i::countDocument() +{ + CORBA::Long nbDocument = _engine_cpp->countDocument(); +// CORBA::Long nbDocument = 333; + return nbDocument; +} + +Document_ptr HEXABLOCK_Gen_i::getDocument(CORBA::Long i) +{ + HEXA_NS::Document *doc=_engine_cpp->getDocument(i); + if ( doc == NULL ) return Document::_nil(); + Document_impl *servantCorba = new Document_impl( GetPOA(), doc ); + return servantCorba->_this(); +} + +void HEXABLOCK_Gen_i::removeDocument(HEXABLOCK_ORB::Document_ptr docIn) +{ + Document_impl* docServant = ::DownCast( docIn ); + ASSERT( docServant ); + if ( docServant ) { + HEXA_NS::Document* doc = docServant->GetImpl(); + _engine_cpp->removeDocument( doc ); + } +} + + +Document_ptr HEXABLOCK_Gen_i::addDocument(const char* name) +{ + // HEXA_NS::Document *doc=_engine_cpp->addDocument (name); + // Document_impl *servantCorba=new Document_impl( GetPOA(), doc); + // return servantCorba->_this(); + + return createDocInStudy(name); +} + + + +Document_ptr HEXABLOCK_Gen_i::loadDocument(const char* xmlFilename) +{ + HEXA_NS::Document *doc=_engine_cpp->loadDocument(xmlFilename); + Document_impl *servantCorba=new Document_impl( GetPOA(), doc ); + return servantCorba->_this(); +} + +GEOM_Client* HEXABLOCK_Gen_i::getGeomClient() +{ + // create shape reader if necessary + if ( _geomClient == NULL ) + _geomClient = new GEOM_Client(GetContainerRef()); + ASSERT( _geomClient); + return _geomClient; +} + + +TopoDS_Shape HEXABLOCK_Gen_i::geomObjectToShape(GEOM::GEOM_Object_ptr theGeomObject) +{ + TopoDS_Shape S; + if ( !theGeomObject->_is_nil() ){ + _geomClient = getGeomClient(); + + if(CORBA::is_nil(_geomGen)) { + Engines::EngineComponent_ptr temp=GetLCC()->FindOrLoad_Component("FactoryServer","GEOM"); + _geomGen=GEOM::GEOM_Gen::_narrow(temp); + } + if ( _geomClient != NULL && !_geomGen->_is_nil () ) + S = _geomClient->GetShape( _geomGen, theGeomObject ); + } + return S; +} + + + + + +// HEXABLOCK_ORB::GEOM_Object_ptr HEXABLOCK_Gen_i::shapeToGeomObject (const TopoDS_Shape& theShape ) +// { +// HEXABLOCK_ORB::GEOM_Object_var aShapeObj; +// if ( !theShape.IsNull() ) { +// _geomClient = getGeomClient();//new GEOM_Client(GetContainerRef()); +// TCollection_AsciiString IOR; +// bool found = _geomClient->Find(theShape, IOR); +// if (found){ +// CORBA::Object_var obj = _orb->string_to_object( IOR.ToCString() ); +// aShapeObj = HEXABLOCK_ORB::GEOM_Object::_narrow ( obj ); +// } +// } +// return aShapeObj._retn(); +// } + + + +// GEOM::GEOM_Object_ptr HEXABLOCK_Gen_i::_makeFace( const TopoDS_Shape& theShape ) +// { +// ASSERT ( theShape.ShapeType() == TopAbs_FACE ); +// +// int theStudyID = 0; +// GEOM::GEOM_Object_var result; +// +// // PrimOp = self.GetI3DPrimOperations +// // GEOM_IShapesOperations +// return result._retn(); +// } + +// GEOM::GEOM_Object_ptr HEXABLOCK_Gen_i::_makeEdge( const TopoDS_Shape& theShape ) +// { +// ASSERT ( theShape.ShapeType() == TopAbs_EDGE ); +// int theStudyID = 0; +// GEOM::GEOM_Object_var result; +// GEOM::GEOM_Object_var p1; +// GEOM::GEOM_Object_var p2; +// +// if ( CORBA::is_nil(_geomGen) ) { //_geomGen->_is_nil() +// Engines::EngineComponent_ptr temp=GetLCC()->FindOrLoad_Component("FactoryServer","GEOM"); +// _geomGen=GEOM::GEOM_Gen::_narrow(temp); +// } +// GEOM::GEOM_IBasicOperations_var aBasicOp = _geomGen->GetIBasicOperations(theStudyID); +// GEOM::GEOM_IShapesOperations_var aShapesOp = _geomGen->GetIShapesOperations(theStudyID); +// +// TopoDS_Edge anEdge = TopoDS::Edge( theShape ); +// double f, l; +// Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, f, l); +// +// gp_Pnt aCurveStart = aCurve->Value( f ); +// gp_Pnt aCurveEnd = aCurve->Value( l ); +// +// double x1, y1, z1; +// double x2, y2, z2; +// +// x1 = aCurveStart.X(); y1 = aCurveStart.Y(); z1 = aCurveStart.Z(); +// x2 = aCurveEnd.X(); y2 = aCurveEnd.Y(); z2 = aCurveEnd.Z(); +// p1= aBasicOp->MakePointXYZ(x1, y1, z1); +// p2= aBasicOp->MakePointXYZ(x2, y2, z2); +// result = aShapesOp->MakeEdge(p1, p2); +// +// return result._retn(); +// } + +// GEOM::GEOM_Object_ptr HEXABLOCK_Gen_i::_makeVertex( const TopoDS_Shape& theShape ) +// { +// ASSERT ( theShape.ShapeType() == TopAbs_VERTEX ); +// +// int theStudyID = 0; +// GEOM::GEOM_Object_var result; +// +// TopoDS_Vertex aPoint; +// aPoint = TopoDS::Vertex( theShape ); +// gp_Pnt aPnt = BRep_Tool::Pnt( aPoint ); +// double x = aPnt.X(); +// double y = aPnt.Y(); +// double z = aPnt.Z(); +// +// GEOM::GEOM_IBasicOperations_var aBasicOp = _geomGen->GetIBasicOperations(theStudyID); +// result = aBasicOp->MakePointXYZ(x, y, z); +// +// return result._retn(); +// } + + +// GEOM::GEOM_Object_ptr HEXABLOCK_Gen_i::shapeToGeomObject (const TopoDS_Shape& theShape ) +// { +// std::cout << "XXXXXXXX shapeToGeomObject "<< std::endl; +// GEOM::GEOM_Object_var aShapeObj; +// if ( !theShape.IsNull() ) { +// switch ( theShape.ShapeType() ){ +// case TopAbs_VERTEX: aShapeObj = _makeVertex( theShape ); break; +// // case TopAbs_FACE: aShapeObj = _makeFace( theShape ); break; //CS_TODO +// case TopAbs_EDGE: aShapeObj = _makeEdge( theShape ); break; +// default: throw (SALOME_Exception(LOCALIZED("shapeToGeomObject : shape type not supported"))); +// } +// } +// return aShapeObj._retn(); +// } + + + + +GEOM::GEOM_Object_ptr HEXABLOCK_Gen_i::brepToGeomObject(const std::string& theBrep) +{ + int theStudyID = 0; //CS_TODO + GEOM::GEOM_Object_var aShapeObj; + + if ( CORBA::is_nil(_geomGen) ){ + Engines::EngineComponent_ptr temp=GetLCC()->FindOrLoad_Component("FactoryServer","GEOM"); + _geomGen=GEOM::GEOM_Gen::_narrow(temp); + } + GEOM::GEOM_IInsertOperations_var aInsOp = _geomGen->GetIInsertOperations(theStudyID); + + // char *tmpname = strdup("HexaAssocXXXXXX"); // killed by Abu + char tmpname [32]; // Abu 11/07 + sprintf (tmpname, "/tmp/tmpHexaAsso%dXXXXXX", getpid()); // Abu 11/07 + // strcpy (tmpname, "HexaAssocXXXXXX"); // killed by Abu + + int fd = mkstemp( tmpname ); + if ( fd != -1 ) + { + ofstream tmpfile( tmpname ); + tmpfile << theBrep; + tmpfile.close(); + aShapeObj = aInsOp->ImportFile( tmpname, "BREP" ); + close(fd); + unlink(tmpname); + } + + return aShapeObj._retn(); +} + + + + + + +// GEOM::GEOM_Object_ptr HEXABLOCK_Gen_i::shapeToGeomObject (const TopoDS_Shape& theShape ) +// { +// GEOM::GEOM_Object_var aShapeObj; +// std::cout<<"shapeToGeomObject "<Find(theShape, IOR); +// std::cout<<"shapeToGeomObject found"<string_to_object( IOR.ToCString() ); +// aShapeObj = GEOM::GEOM_Object::_narrow ( obj ); +// } +// } +// return aShapeObj._retn(); +// } + + +StudyContext* HEXABLOCK_Gen_i::GetCurrentStudyContext() +{ + if ( !CORBA::is_nil( myCurrentStudy ) && + myStudyContextMap.find( GetCurrentStudyID() ) != myStudyContextMap.end() ) + return myStudyContextMap[ myCurrentStudy->StudyId() ]; + else + return 0; +} + +int HEXABLOCK_Gen_i::RegisterObject(CORBA::Object_ptr theObject) +{ + StudyContext* myStudyContext = GetCurrentStudyContext(); + if ( myStudyContext && !CORBA::is_nil( theObject )) { + CORBA::String_var iorString = GetORB()->object_to_string( theObject ); + return myStudyContext->addObject( string( iorString.in() ) ); + } + return 0; +} + + +// SMESH::SMESH_Mesh_ptr SMESH_Gen_i::createMesh() +// throw ( SALOME::SALOME_Exception ) + + +char* HEXABLOCK_Gen_i::ComponentDataType() +{ +// if(MYDEBUG) MESSAGE( "HEXABLOCK_Gen_i::ComponentDataType" ); + return CORBA::string_dup( "HEXABLOCK" ); +} + + + +// SMESH_Mesh* SMESH_Gen::CreateMesh(int theStudyId, bool theIsEmbeddedMode) +// throw(SALOME_Exception) +// { +// Unexpect aCatch(SalomeException); +// MESSAGE("SMESH_Gen::CreateMesh"); +// +// // Get studyContext, create it if it does'nt exist, with a SMESHDS_Document +// StudyContextStruct *aStudyContext = GetStudyContext(theStudyId); +// +// // create a new SMESH_mesh object +// SMESH_Mesh *aMesh = new SMESH_Mesh(_localId++, +// theStudyId, +// this, +// theIsEmbeddedMode, +// aStudyContext->myDocument); +// aStudyContext->mapMesh[_localId] = aMesh; +// +// return aMesh; +// } + + + + +Document_ptr HEXABLOCK_Gen_i::createDoc (const char* name) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); +// if(MYDEBUG) MESSAGE( "SMESH_Gen_i::createMesh" ); + + // Get or create the GEOM_Client instance + try { + HEXA_NS::Document *d = _engine_cpp->addDocument (name); + Document_impl *docImpl = new Document_impl( GetPOA(), d ); + + // activate the CORBA servant of Mesh + Document_var docServant = Document::_narrow( docImpl->_this() ); + /* int nextId = */ RegisterObject( docServant ); +// if(MYDEBUG) MESSAGE( "Add mesh to map with id = "<< nextId); + return docServant._retn(); + } + catch (SALOME_Exception& S_ex) { +// THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), SALOME::BAD_PARAM ); + } + return Document::_nil(); +} + +Document_ptr HEXABLOCK_Gen_i::createDocInStudy (const char* name) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); +// if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMesh" ); + // create mesh + Document_var doc = this->createDoc (name); + + // publish mesh in the study + if ( CanPublishInStudy( doc ) ) { + SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); + aStudyBuilder->NewCommand(); // There is a transaction + SALOMEDS::SObject_var aSO = PublishDoc( myCurrentStudy, doc.in() ); + aStudyBuilder->CommitCommand(); +// if ( !aSO->_is_nil() ) { +// // Update Python script +// TPythonDump() << aSO << " = " << this << ".CreateEmptyMesh()"; +// } + } + + return doc._retn(); +} + + + + +SALOME_LifeCycleCORBA* HEXABLOCK_Gen_i::GetLCC() { + if ( _lcc == NULL ) { + _lcc = new SALOME_LifeCycleCORBA( GetNS() ); + } + return _lcc; +} + +SALOME_NamingService* HEXABLOCK_Gen_i::GetNS() +{ + if ( _ns == NULL ) { + _ns = SINGLETON_::Instance(); + ASSERT(SINGLETON_::IsAlreadyExisting()); + _ns->init_orb( _orb ); + } + return _ns; +} + + + +int HEXABLOCK_Gen_i::GetCurrentStudyID() +{ + return myCurrentStudy->_is_nil() || myCurrentStudy->_non_existent() ? -1 : myCurrentStudy->StudyId(); +} + + +void HEXABLOCK_Gen_i::SetCurrentStudy( SALOMEDS::Study_ptr theStudy ) +{ + /*int curStudyId = */ GetCurrentStudyID(); + myCurrentStudy = SALOMEDS::Study::_duplicate( theStudy ); + // create study context, if it doesn't exist and set current study + int studyId = GetCurrentStudyID(); + if ( myStudyContextMap.find( studyId ) == myStudyContextMap.end() ) { + myStudyContextMap[ studyId ] = new StudyContext; + } + +// // myCurrentStudy may be nil +// if ( !CORBA::is_nil( myCurrentStudy ) ) { +// SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); +// if( !myCurrentStudy->FindComponent( "GEOM" )->_is_nil() ) +// aStudyBuilder->LoadWith( myCurrentStudy->FindComponent( "GEOM" ), GetGeomEngine() ); +// +// // NPAL16168, issue 0020210 +// // Let meshes update their data depending on GEOM groups that could change +// if ( curStudyId != studyId ) +// { +// //SALOMEDS::SComponent_var me = PublishComponent( myCurrentStudy ); +// SALOMEDS::SComponent_var me = SALOMEDS::SComponent::_narrow +// ( myCurrentStudy->FindComponent( ComponentDataType() ) ); +// if ( !me->_is_nil() ) { +// SALOMEDS::ChildIterator_var anIter = myCurrentStudy->NewChildIterator( me ); +// for ( ; anIter->More(); anIter->Next() ) { +// SALOMEDS::SObject_var so = anIter->Value(); +// CORBA::Object_var ior = SObjectToObject( so ); +// if ( SMESH_Mesh_i* mesh = SMESH::DownCast( ior )) +// mesh->CheckGeomGroupModif(); +// } +// } +// } +// } +} + + + + + + +TopoDS_Shape string2shape( const string& brep ) +{ + TopoDS_Shape shape; + +// istringstream streamBrep(brep.c_str()); + istringstream streamBrep(brep); +// char* chaine = new char[brep.size()]; +// strcpy(chaine, brep.c_str()); +// istringstream streamBrep( chaine ); + + BRep_Builder aBuilder; + BRepTools::Read(shape, streamBrep, aBuilder); +// BRepTools::Read(shape, brep, aBuilder); + return shape; +} + +// TopoDS_Shape STRING_TO_SHAPE( char* buf, int sizebuf ) +// { +// TopoDS_Shape shape; +// std::istrstream streamBrep(buf,sizebuf); +// BRep_Builder aBuilder; +// BRepTools::Read(shape, streamBrep, aBuilder); +// return(shape); +// } + +// ===================================================== shape2string +string shape2string( const TopoDS_Shape& aShape ) +{ + ostringstream streamShape; +// string strShape; + BRepTools::Write(aShape, streamShape); +// BRepTools::Write(aShape, strShape); + + return streamShape.str(); +} +// ===================================================== HEXABLOCKEngine_factory +extern "C" +{ + PortableServer::ObjectId * HEXABLOCKEngine_factory( + CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char *interfaceName) + { + MESSAGE("PortableServer::ObjectId * HEXABLOCKEngine_factory()"); + SCRUTE(interfaceName); + HEXABLOCK_Gen_i *myHEXABLOCK + = new HEXABLOCK_Gen_i(orb, poa, contId, instanceName, interfaceName); + return myHEXABLOCK->getId() ; + } +} +// ------------------------------------------------------------------------ +// +// Heritage de SALOMEDSImpl_Driver +// +// ------------------------------------------------------------------------ +// +/* *********************************************************************** +// ========================================================= GetIOR +std::string HEXABLOCK_Gen_i::GetIOR() +{ + return ""; +} + *********************************************************************** */ +// =========================================================== SaveASCII +SALOMEDS::TMPFile* HEXABLOCK_Gen_i::SaveASCII ( + const SALOMEDS::SComponent_ptr compo, + const char* theURL, + bool isMultiFile) +{ + SALOMEDS::TMPFile* fic = Save (compo, theURL, isMultiFile); + return fic; +} +// =========================================================== LoadASCII +CORBA::Boolean HEXABLOCK_Gen_i::LoadASCII(SALOMEDS::SComponent_ptr compo, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile) +{ + bool rep = Load (compo, theStream, theURL, isMultiFile); + return rep; +} +// =========================================================== Close +void HEXABLOCK_Gen_i::Close(SALOMEDS::SComponent_ptr theComponent) +{ + if (db) cout << " +++++++ Je suis passe par HEXABLOCK_Gen_i::" + << "Close" << endl; +} +// =================================================== IORToLocalPersistentID +char* HEXABLOCK_Gen_i::IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject, + const char* IORString, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII) +{ + if (db) cout << " +++++++ Je suis passe par HEXABLOCK_Gen_i::" + << "IORToLocalPersistentID" << endl; + static char empty [8] = ""; + return empty; +} +// =================================================== LocalPersistentIDToIOR +char* HEXABLOCK_Gen_i::LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject, + const char* aLocalPersistentID, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII) +{ + if (db) cout << " +++++++ Je suis passe par HEXABLOCK_Gen_i::" + << "LocalPersistentIDToIOR" << endl; + static char empty [8] = ""; + return empty; +} +// +// =========================================================== CanCopy +CORBA::Boolean HEXABLOCK_Gen_i::CanCopy (SALOMEDS::SObject_ptr theObject) +{ + if (db) cout << " +++++++ Je suis passe par HEXABLOCK_Gen_i::" + << "CanCopy" << endl; + return false; +} +// =========================================================== CopyFrom +SALOMEDS::TMPFile* HEXABLOCK_Gen_i::CopyFrom(SALOMEDS::SObject_ptr theObject, + CORBA::Long& theObjectID) +{ + if (db) cout << " +++++++ Je suis passe par HEXABLOCK_Gen_i::" + << "CopyFrom" << endl; + return NULL; +} +// =========================================================== CanPaste +CORBA::Boolean HEXABLOCK_Gen_i:: CanPaste (const char* theComponentName, + CORBA::Long theObjectID) +{ + if (db) cout << " +++++++ Je suis passe par HEXABLOCK_Gen_i::" + << "CanPaste" << endl; + return false; +} +// =========================================================== PasteInto +SALOMEDS::SObject_ptr HEXABLOCK_Gen_i::PasteInto(const SALOMEDS::TMPFile& fic, + CORBA::Long theObjectID, + SALOMEDS::SObject_ptr theObject) +{ + if (db) cout << " +++++++ Je suis passe par HEXABLOCK_Gen_i::" + << "PasteInto" << endl; + return NULL; +} +// ======================================================== CanPublishInStudy +// bool HEXABLOCK_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) +// { + // return NULL; +// } +// =========================================================== CanPaste +SALOMEDS::SObject_ptr HEXABLOCK_Gen_i::PublishInStudy (SALOMEDS::Study_ptr stud, + SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theObject, + const char* theName) + throw (SALOME::SALOME_Exception) +{ + if (db) cout << " +++++++ Je suis passe par HEXABLOCK_Gen_i::" + << "PublishInStudy" << endl; + return NULL; +} +// =========================================================== Save +SALOMEDS::TMPFile* HEXABLOCK_Gen_i::Save( + const SALOMEDS::SComponent_ptr compo, + const char* theURL, + bool isMultiFile) +{ + if (db) cout << " +++++++ Je suis passe par HEXABLOCK_Gen_i::" + << "Save" << endl; + return NULL; +} +// =========================================================== Load +CORBA::Boolean HEXABLOCK_Gen_i::Load(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile) +{ + if (db) cout << " +++++++ Je suis passe par HEXABLOCK_Gen_i::" + << "Load" << endl; + + return false; +} diff --git a/src/HEXABLOCK_I/HEXABLOCK.hxx b/src/HEXABLOCK_I/HEXABLOCK.hxx new file mode 100755 index 0000000..6a7b164 --- /dev/null +++ b/src/HEXABLOCK_I/HEXABLOCK.hxx @@ -0,0 +1,411 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef _HEXABLOCK_HXX_ +#define _HEXABLOCK_HXX_ + +#include +#include CORBA_SERVER_HEADER(HEXABLOCK_Gen) +#include "SALOME_Component_i.hxx" +// #include "SALOMEDSImpl_TMPFile.hxx" +// #include "SALOMEDSImpl_SComponent.hxx" + + + +#include + + +#include +#include "GEOM_Client.hxx" + +#include "hexa_base.hxx" +#include "Hex.hxx" + +using namespace HEXABLOCK_ORB; + +class SALOME_LifeCycleCORBA; +class SALOME_NamingService; + + + + + +// =========================================================== +// Study context - stores study-connected objects references +// ========================================================== +class StudyContext +{ +public: + // constructor + StudyContext() {} + // destructor + ~StudyContext() + { + mapIdToIOR.clear(); + mapIdToId.clear(); + } + // register object in the internal map and return its id + int addObject( string theIOR ) + { + int nextId = getNextId(); + mapIdToIOR[ nextId ] = theIOR; + return nextId; + } + // find the object id in the internal map by the IOR + int findId( string theIOR ) + { + map::iterator imap; + for ( imap = mapIdToIOR.begin(); imap != mapIdToIOR.end(); ++imap ) { + if ( imap->second == theIOR ) + return imap->first; + } + return 0; + } + // get object's IOR by id + string getIORbyId( const int theId ) + { + if ( mapIdToIOR.find( theId ) != mapIdToIOR.end() ) + return mapIdToIOR[ theId ]; + return string( "" ); + } + // get object's IOR by old id + string getIORbyOldId( const int theOldId ) + { + if ( mapIdToId.find( theOldId ) != mapIdToId.end() ) + return getIORbyId( mapIdToId[ theOldId ] ); + return string( "" ); + } + // maps old object id to the new one (used when restoring data) + void mapOldToNew( const int oldId, const int newId ) { + mapIdToId[ oldId ] = newId; + } + // get old id by a new one + int getOldId( const int newId ) { + map::iterator imap; + for ( imap = mapIdToId.begin(); imap != mapIdToId.end(); ++imap ) { + if ( imap->second == newId ) + return imap->first; + } + return 0; + } + +private: + // get next free object identifier + int getNextId() + { + int id = 1; + while( mapIdToIOR.find( id ) != mapIdToIOR.end() ) + id++; + return id; + } + + map mapIdToIOR; // persistent-to-transient map + map mapIdToId; // used to translate object from persistent to transient form +}; + + + +class HEXABLOCK_Gen_i: public POA_HEXABLOCK_ORB::HEXABLOCK_Gen, + public Engines_Component_i +{ +public: + HEXABLOCK_Gen_i( CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char *interfaceName); + // Get object of the CORBA reference + static CORBA::ORB_var GetORB() { return _orb;} + static PortableServer::POA_var GetPOA() { return _poa;} + static PortableServer::ServantBase_var GetServant( CORBA::Object_ptr theObject ); + + virtual ~HEXABLOCK_Gen_i(); + + void test(); + ::CORBA::Long countDocument(); + Document_ptr getDocument(::CORBA::Long i); + void removeDocument(Document_ptr d); //CS_TODO + Document_ptr addDocument (const char* name); + Document_ptr loadDocument (const char* xmlFilename); + + GEOM_Client* getGeomClient(); + TopoDS_Shape geomObjectToShape(GEOM::GEOM_Object_ptr theGeomObject); +// GEOM::GEOM_Object_ptr shapeToGeomObject(const TopoDS_Shape& theShape ); + GEOM::GEOM_Object_ptr brepToGeomObject(const std::string& theBrep); + static SALOME_LifeCycleCORBA* GetLCC(); + static SALOME_NamingService* GetNS(); + static HEXABLOCK_Gen_i* GetHEXABLOCKGen() { return _HEXABLOCKGen;} + + + virtual Engines::TMPFile* DumpPython(CORBA::Object_ptr theStudy, + CORBA::Boolean isPublished, + CORBA::Boolean isMultiFile, + CORBA::Boolean& isValidScript); + + void SetCurrentStudy( SALOMEDS::Study_ptr theStudy ); + int GetCurrentStudyID(); + StudyContext* GetCurrentStudyContext(); + std::string /*void */SetName( SALOMEDS::SObject_ptr theSObject, + const char* theName, + const char* theDefaultName ); + int RegisterObject(CORBA::Object_ptr theObject); +// SMESH::SMESH_Mesh_ptr SMESH_Gen_i::createMesh() throw ( SALOME::SALOME_Exception ) + char* ComponentDataType(); + + + bool CanPublishInStudy(CORBA::Object_ptr theIOR); + SALOMEDS::SComponent_ptr PublishComponent(SALOMEDS::Study_ptr theStudy); + static SALOMEDS::SObject_ptr ObjectToSObject(SALOMEDS::Study_ptr theStudy, CORBA::Object_ptr theObject); + + SALOMEDS::SObject_ptr PublishDoc( SALOMEDS::Study_ptr theStudy, + Document_ptr theDoc, + const char* theName = 0); + + + + Document_ptr createDoc(const char* name) + throw ( SALOME::SALOME_Exception ); + Document_ptr createDocInStudy(const char* name) + throw ( SALOME::SALOME_Exception ); + + //-----------------------------------------------------------------------// + // Inherited methods from SALOMEDS::Driver // + //-----------------------------------------------------------------------// + +public : + SALOMEDS::TMPFile* Save(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile); + + SALOMEDS::TMPFile* SaveASCII(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile); + + CORBA::Boolean Load(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile); + + CORBA::Boolean LoadASCII(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile); + + void Close(SALOMEDS::SComponent_ptr theComponent); + // char* ComponentDataType(); Deja la + + CORBA::Boolean CanCopy (SALOMEDS::SObject_ptr theObject); + CORBA::Boolean CanPaste (const char* theComponentName, + CORBA::Long theObjectID); + + SALOMEDS::TMPFile* CopyFrom(SALOMEDS::SObject_ptr theObject, + CORBA::Long& theObjectID); + + SALOMEDS::SObject_ptr PasteInto(const SALOMEDS::TMPFile& theStream, + CORBA::Long theObjectID, + SALOMEDS::SObject_ptr theObject); + SALOMEDS::SObject_ptr PublishInStudy(SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theObject, + const char* theName) throw (SALOME::SALOME_Exception) ; + + + char* IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject, + const char* IORString, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII); + char* LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject, + const char* aLocalPersistentID, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII); + + +#if 0 + virtual std::string GetIOR(); + + /******************* + virtual SALOMEDSImpl_TMPFile* Save(const SALOMEDSImpl_SComponent& compo, + const std::string& theURL, + long& theStreamLength, + bool isMultiFile); + + virtual SALOMEDSImpl_TMPFile* SaveASCII(const SALOMEDSImpl_SComponent& compo, + const std::string& theURL, + long& theStreamLength, + bool isMultiFile); + *********************/ + + virtual SALOMEDS::TMPFile* Save(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile); + + + virtual SALOMEDS::TMPFile* SaveASCII(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile); + + + + virtual bool Load(const SALOMEDSImpl_SComponent& compo, + const unsigned char* theStream, + const long theStreamLength, + const std::string& theURL, + bool isMultiFile); + + virtual bool LoadASCII(const SALOMEDSImpl_SComponent& theComponent, + const unsigned char* theStream, + const long theStreamLength, + const std::string& theURL, + bool isMultiFile); + + virtual void Close(const SALOMEDSImpl_SComponent& theComponent); + + // virtual std::string ComponentDataType(); + + virtual std::string IORToLocalPersistentID(const SALOMEDSImpl_SObject& theSObject, + const std::string& IORString, + bool isMultiFile, + bool isASCII); + + virtual std::string LocalPersistentIDToIOR(const SALOMEDSImpl_SObject& theSObject, + const std::string& aLocalPersistentID, + bool isMultiFile, + bool isASCII); + + virtual bool CanCopy(const SALOMEDSImpl_SObject& theObject); + + virtual SALOMEDSImpl_TMPFile* CopyFrom(const SALOMEDSImpl_SObject& theObject, + int& theObjectID, + long& theStreamLength); + + virtual bool CanPaste(const std::string& theComponentName, int theObjectID); + + virtual std::string PasteInto(const unsigned char* theStream, + const long theStreamLength, + int theObjectID, + const SALOMEDSImpl_SObject& theObject); + + virtual SALOMEDSImpl_TMPFile* DumpPython(SALOMEDSImpl_Study* theStudy, + bool isPublished, + bool isMultiFile, + bool& isValidScript, + long& theStreamLength); +#endif +private : + HEXA_NS::Hex* _engine_cpp; + GEOM_Client* _geomClient; + + + static PortableServer::POA_var _poa;// POA reference + static GEOM::GEOM_Gen_var _geomGen; + static SALOME_LifeCycleCORBA* _lcc; + static CORBA::ORB_var _orb; + static SALOME_NamingService* _ns; + static HEXABLOCK_Gen_i* _HEXABLOCKGen; + + + GEOM::GEOM_Object_ptr _makeVertex( const TopoDS_Shape& theShape ); + GEOM::GEOM_Object_ptr _makeEdge( const TopoDS_Shape& theShape ); + + map myStudyContextMap; // Map of study context objects + SALOMEDS::Study_var myCurrentStudy; // Current study + +}; + +extern "C" + PortableServer::ObjectId * HEXABLOCKEngine_factory( + CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char *interfaceName + ); + + +template + T + DownCast(CORBA::Object_ptr theArg) + { + return dynamic_cast(HEXABLOCK_Gen_i::GetServant(theArg).in()); + } + + + + + +TopoDS_Shape string2shape( const string& brep ); + + +string shape2string( const TopoDS_Shape& aShape ); + + + + +#endif + + +// 1) Séquence de code convertissant une chaîne au format BREP vers un TopoDS_Shape +// +// TopoDS_Shape STRING_TO_SHAPE( char* buf, int sizebuf ) +// { +// TopoDS_Shape shape; +// std::istrstream streamBrep(buf,sizebuf); +// BRep_Builder aBuilder; +// BRepTools::Read(shape, streamBrep, aBuilder); +// return(shape); +// } +// +// 2) Séquence de code convertissant un TopoDS_Shape en une chaîne au format BREP +// +// char* SHAPE_TO_STRING( TopoDS_Shape aShape, int& sizebuf ) +// { +// ostrstream streamShape; +// BRepTools::Write(aShape, streamShape); +// sizebuf = streamShape.pcount(); +// char* buf = new char [sizebuf]; +// char* valueOfStream = streamShape.str(); +// memcpy(buf, valueOfStream, size); +// return buf; +// } +// +// 3) Séquence de code accédant aux coordonnées d'un TopoDS_Shape qui est un Vertex +// +// bool SHAPE_TO_COORD(TopoDS_Shape aShape, double& x, double& y, double& z) +// { +// if ( aShape.ShapeType() == TopAbs_VERTEX ) { +// TopoDS_Vertex aPoint; +// aPoint = TopoDS::Vertex( aShape ); +// gp_Pnt aPnt = BRep_Tool::Pnt( aPoint ); +// x = aPnt.X(); +// y = aPnt.Y(); +// z = aPnt.Z(); +// return(1); +// } else { +// return(0); +// }; +// } +// +// 4) Séquence de code créant un TopoDS_Shape à partir de coordonnées +// +// TopoDS_Shape COORD_TO_SHAPE(double x, double y, double z) +// { +// gp_Pnt aPnt(x, y, z); +// BRepBuilderAPI_MakeVertex mkVertex (aPnt); +// TopoDS_Vertex aVertex = TopoDS::Vertex(mkVertex.Shape()); +// return aVertex; +// } diff --git a/src/HEXABLOCK_I/HEXABLOCK_1.cxx b/src/HEXABLOCK_I/HEXABLOCK_1.cxx new file mode 100644 index 0000000..26491b5 --- /dev/null +++ b/src/HEXABLOCK_I/HEXABLOCK_1.cxx @@ -0,0 +1,1268 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + + +#include "HEXABLOCK.hxx" +// #include "SMESH_Mesh_i.hxx" +// #include "SMESH_Hypothesis_i.hxx" +// #include "SMESH_Algo_i.hxx" +// #include "SMESH_Group_i.hxx" +// #include "SMESH_subMesh_i.hxx" + +#include "SALOME_NamingService.hxx" + +#include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog) + +#include "utilities.h" +#include "Utils_ExceptHandlers.hxx" + +#include + +// #ifdef _DEBUG_ +// static int MYDEBUG = 0; +// static int VARIABLE_DEBUG = 0; +// #else +// static int MYDEBUG = 0; +// static int VARIABLE_DEBUG = 0; +// #endif + +static int MYDEBUG = 1; + + +using namespace HEXABLOCK_ORB; + + +//============================================================================= +/*! + * Get...Tag [ static ] + * + * Methods which determine SMESH data model structure + */ +//============================================================================= + +// long SMESH_Gen_i::GetHypothesisRootTag() +// { +// return SMESH::Tag_HypothesisRoot; +// } +// +// long SMESH_Gen_i::GetAlgorithmsRootTag() +// { +// return SMESH::Tag_AlgorithmsRoot; +// } +// +// long SMESH_Gen_i::GetRefOnShapeTag() +// { +// return SMESH::Tag_RefOnShape; +// } +// +// long SMESH_Gen_i::GetRefOnAppliedHypothesisTag() +// { +// return SMESH::Tag_RefOnAppliedHypothesis; +// } +// +// long SMESH_Gen_i::GetRefOnAppliedAlgorithmsTag() +// { +// return SMESH::Tag_RefOnAppliedAlgorithms; +// } +// +// long SMESH_Gen_i::GetSubMeshOnVertexTag() +// { +// return SMESH::Tag_SubMeshOnVertex; +// } +// +// long SMESH_Gen_i::GetSubMeshOnEdgeTag() +// { +// return SMESH::Tag_SubMeshOnEdge; +// } +// +// long SMESH_Gen_i::GetSubMeshOnFaceTag() +// { +// return SMESH::Tag_SubMeshOnFace; +// } +// +// long SMESH_Gen_i::GetSubMeshOnSolidTag() +// { +// return SMESH::Tag_SubMeshOnSolid; +// } +// +// long SMESH_Gen_i::GetSubMeshOnCompoundTag() +// { +// return SMESH::Tag_SubMeshOnCompound; +// } +// +// long SMESH_Gen_i::GetSubMeshOnWireTag() +// { +// return SMESH::Tag_SubMeshOnWire; +// } +// +// long SMESH_Gen_i::GetSubMeshOnShellTag() +// { +// return SMESH::Tag_SubMeshOnShell; +// } +// +// long SMESH_Gen_i::GetNodeGroupsTag() +// { +// return SMESH::Tag_NodeGroups; +// } +// +// long SMESH_Gen_i::GetEdgeGroupsTag() +// { +// return SMESH::Tag_EdgeGroups; +// } +// +// long SMESH_Gen_i::GetFaceGroupsTag() +// { +// return SMESH::Tag_FaceGroups; +// } +// +// long SMESH_Gen_i::GetVolumeGroupsTag() +// { +// return SMESH::Tag_VolumeGroups; +// } +// +// long SMESH_Gen_i::Get0DElementsGroupsTag() +// { +// return SMESH::Tag_0DElementsGroups; +// } + + +//============================================================================= +/*! + * SMESH_Gen_i::CanPublishInStudy + * + * Returns true if object can be published in the study + */ +//============================================================================= +bool HEXABLOCK_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) +{ + if(MYDEBUG) MESSAGE("CanPublishInStudy - "<_is_nil() ) + return true; + +// SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(theIOR); +// if( !aSubMesh->_is_nil() ) +// return true; +// +// SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow(theIOR); +// if( !aHyp->_is_nil() ) +// return true; +// +// SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(theIOR); +// if( !aGroup->_is_nil() ) +// return true; + + if(MYDEBUG) MESSAGE("CanPublishInStudy--CANT"); + return false; +} + +//======================================================================= +//function : ObjectToSObject +//purpose : +//======================================================================= + +SALOMEDS::SObject_ptr HEXABLOCK_Gen_i::ObjectToSObject( SALOMEDS::Study_ptr theStudy, + CORBA::Object_ptr theObject ) +{ + SALOMEDS::SObject_var aSO; + if ( !CORBA::is_nil( theStudy ) && !CORBA::is_nil( theObject )) + { + CORBA::String_var objStr = HEXABLOCK_Gen_i::GetORB()->object_to_string( theObject ); + aSO = theStudy->FindObjectIOR( objStr.in() ); + } + return aSO._retn(); +} + +//======================================================================= +//function : objectToServant +//purpose : +//======================================================================= + +// template static inline T* objectToServant( CORBA::Object_ptr theIOR ) +// { +// return dynamic_cast( SMESH_Gen_i::GetServant( theIOR ).in() ); +// } + +//======================================================================= +//function : ShapeToGeomObject +//purpose : +//======================================================================= + +// GEOM::GEOM_Object_ptr SMESH_Gen_i::ShapeToGeomObject (const TopoDS_Shape& theShape ) +// { +// GEOM::GEOM_Object_var aShapeObj; +// if ( !theShape.IsNull() ) { +// GEOM_Client* aClient = GetShapeReader(); +// TCollection_AsciiString IOR; +// if ( aClient && aClient->Find( theShape, IOR )) +// { +// CORBA::Object_var obj = GetORB()->string_to_object( IOR.ToCString() ); +// aShapeObj = GEOM::GEOM_Object::_narrow ( obj ); +// } +// } +// return aShapeObj._retn(); +// } + +//======================================================================= +//function : GeomObjectToShape +//purpose : +//======================================================================= + +// TopoDS_Shape SMESH_Gen_i::GeomObjectToShape(GEOM::GEOM_Object_ptr theGeomObject) +// { +// TopoDS_Shape S; +// if ( !theGeomObject->_is_nil() ) { +// GEOM_Client* aClient = GetShapeReader(); +// GEOM::GEOM_Gen_ptr aGeomEngine = GetGeomEngine(); +// if ( aClient && !aGeomEngine->_is_nil () ) +// S = aClient->GetShape( aGeomEngine, theGeomObject ); +// } +// return S; +// } + + + + + + + + + + + + + + + +//======================================================================= +//function : publish +//purpose : +//======================================================================= + +static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr theStudy, + CORBA::Object_ptr theIOR, + SALOMEDS::SObject_ptr theFatherObject, + const int theTag = 0, + const char* thePixMap = 0, + const bool theSelectable = true) +{ + SALOMEDS::SObject_var SO = HEXABLOCK_Gen_i::ObjectToSObject( theStudy, theIOR ); + SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); + if ( SO->_is_nil() ) { + if ( theTag == 0 ) + SO = aStudyBuilder->NewObject( theFatherObject ); + else if ( !theFatherObject->FindSubObject( theTag, SO )) + SO = aStudyBuilder->NewObjectToTag( theFatherObject, theTag ); + } + + SALOMEDS::GenericAttribute_var anAttr; + if ( !CORBA::is_nil( theIOR )) { + anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeIOR" ); + CORBA::String_var objStr = HEXABLOCK_Gen_i::GetORB()->object_to_string( theIOR ); + SALOMEDS::AttributeIOR::_narrow(anAttr)->SetValue( objStr.in() ); + } + + if ( thePixMap ) { + anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributePixMap" ); + SALOMEDS::AttributePixMap_var pm = SALOMEDS::AttributePixMap::_narrow( anAttr ); + pm->SetPixMap( thePixMap ); + } + +// if ( !theSelectable ) { +// anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeSelectable" ); +// SALOMEDS::AttributeSelectable::_narrow( anAttr )->SetSelectable( false ); +// } + return SO._retn(); +} + + +//======================================================================= +//function : setName +//purpose : +//======================================================================= +std::string HEXABLOCK_Gen_i::SetName( SALOMEDS::SObject_ptr theSObject, + const char* theName, + const char* theDefaultName ) +{ + std::string attrName; + if ( !theSObject->_is_nil() ) { + SALOMEDS::StudyBuilder_var aStudyBuilder = theSObject->GetStudy()->NewBuilder(); + SALOMEDS::GenericAttribute_var anAttr = + aStudyBuilder->FindOrCreateAttribute( theSObject, "AttributeName" ); + SALOMEDS::AttributeName_var aNameAttr = SALOMEDS::AttributeName::_narrow( anAttr ); + if ( theName && strlen( theName ) != 0 ) +// aNameAttr->SetValue( theName ); + attrName = theName; + else { + CORBA::String_var curName = CORBA::string_dup( aNameAttr->Value() ); + if ( strlen( curName ) == 0 ) { + TCollection_AsciiString aName( (char*) theDefaultName ); + aName += TCollection_AsciiString("_") + TCollection_AsciiString( theSObject->Tag() ); + attrName = aName.ToCString(); +// aNameAttr->SetValue( aName.ToCString() ); + } + } + aNameAttr->SetValue( attrName.c_str() ); + } + return attrName; +} + +//======================================================================= +//function : SetPixMap +//purpose : +//======================================================================= +// void SMESH_Gen_i::SetPixMap(SALOMEDS::SObject_ptr theSObject, +// const char* thePixMap) +// { +// if ( !theSObject->_is_nil() && thePixMap && strlen( thePixMap )) +// { +// SALOMEDS::Study_var aStudy = theSObject->GetStudy(); +// SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); +// SALOMEDS::GenericAttribute_var anAttr = +// aStudyBuilder->FindOrCreateAttribute( theSObject, "AttributePixMap" ); +// SALOMEDS::AttributePixMap_var aPMAttr = SALOMEDS::AttributePixMap::_narrow( anAttr ); +// aPMAttr->SetPixMap( thePixMap ); +// } +// } + +//======================================================================= +//function : addReference +//purpose : +//======================================================================= + +// static void addReference (SALOMEDS::Study_ptr theStudy, +// SALOMEDS::SObject_ptr theSObject, +// CORBA::Object_ptr theToObject, +// int theTag = 0) +// { +// SALOMEDS::SObject_var aToObjSO = SMESH_Gen_i::ObjectToSObject( theStudy, theToObject ); +// if ( !aToObjSO->_is_nil() && !theSObject->_is_nil() ) { +// SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); +// SALOMEDS::SObject_var aReferenceSO; +// if ( !theTag ) { +// // check if the reference to theToObject already exists +// // and find a free label for the reference object +// bool isReferred = false; +// int tag = 1; +// SALOMEDS::ChildIterator_var anIter = theStudy->NewChildIterator( theSObject ); +// for ( ; !isReferred && anIter->More(); anIter->Next(), ++tag ) { +// if ( anIter->Value()->ReferencedObject( aReferenceSO )) { +// if ( strcmp( aReferenceSO->GetID(), aToObjSO->GetID() ) == 0 ) +// isReferred = true; +// } +// else if ( !theTag ) { +// SALOMEDS::GenericAttribute_var anAttr; +// if ( !anIter->Value()->FindAttribute( anAttr, "AttributeIOR" )) +// theTag = tag; +// } +// } +// if ( isReferred ) +// return; +// if ( !theTag ) +// theTag = tag; +// } +// if ( !theSObject->FindSubObject( theTag, aReferenceSO )) +// aReferenceSO = aStudyBuilder->NewObjectToTag( theSObject, theTag ); +// aStudyBuilder->Addreference( aReferenceSO, aToObjSO ); +// } +// } + +//============================================================================= +/*! + * SMESH_Gen_i::PublishInStudy + * + * Publish object in the study + */ +//============================================================================= + +// SALOMEDS::SObject_ptr HEXABLOCK_Gen_i::PublishInStudy( SALOMEDS::Study_ptr theStudy, +// SALOMEDS::SObject_ptr theSObject, +// CORBA::Object_ptr theIOR, +// const char* theName ) +// throw (SALOME::SALOME_Exception) +// { +// Unexpect aCatch(SALOME_SalomeException); +// SALOMEDS::SObject_var aSO; +// if ( CORBA::is_nil( theStudy ) || CORBA::is_nil( theIOR )) +// return aSO._retn(); +// if(MYDEBUG) MESSAGE("PublishInStudy"); +// +// // Publishing a mesh +// // SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( theIOR ); +// HEXABLOCK_Gen_i::Document_var aDoc = HEXABLOCK_Gen_i::Document::_narrow( theIOR ); +// if( !aDoc->_is_nil() ) +// aSO = PublishDoc( theStudy, aDoc, theName ); +// +// // // Publishing a sub-mesh +// // SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( theIOR ); +// // if( aSO->_is_nil() && !aSubMesh->_is_nil() ) { +// // GEOM::GEOM_Object_var aShapeObject = aSubMesh->GetSubShape(); +// // aMesh = aSubMesh->GetFather(); +// // aSO = PublishSubMesh( theStudy, aMesh, aSubMesh, aShapeObject, theName ); +// // } +// // +// // // Publishing a hypothesis or algorithm +// // SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( theIOR ); +// // if ( aSO->_is_nil() && !aHyp->_is_nil() ) +// // aSO = PublishHypothesis( theStudy, aHyp ); +// // +// // // Publishing a group +// // SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(theIOR); +// // if ( aSO->_is_nil() && !aGroup->_is_nil() ) { +// // GEOM::GEOM_Object_var aShapeObject; +// // aMesh = aGroup->GetMesh(); +// // aSO = PublishGroup( theStudy, aMesh, aGroup, aShapeObject, theName ); +// // } +// if(MYDEBUG) MESSAGE("PublishInStudy_END"); +// +// return aSO._retn(); +// } + +// ======================================================================= +// function : PublishComponent +// purpose : +// ======================================================================= +SALOMEDS::SComponent_ptr HEXABLOCK_Gen_i::PublishComponent(SALOMEDS::Study_ptr theStudy) +{ + if ( CORBA::is_nil( theStudy )) + return SALOMEDS::SComponent::_nil(); + if(MYDEBUG) MESSAGE("PublishComponent"); + + SALOMEDS::SComponent_var father = + SALOMEDS::SComponent::_narrow( theStudy->FindComponent( ComponentDataType() ) ); + if ( !CORBA::is_nil( father ) ) + return father._retn(); + MESSAGE("AAAAAAAAAAA"); + + SALOME_ModuleCatalog::ModuleCatalog_var aCat = + SALOME_ModuleCatalog::ModuleCatalog::_narrow( GetNS()->Resolve("/Kernel/ModulCatalog") ); + if ( CORBA::is_nil( aCat ) ) + return father._retn(); + MESSAGE("BBBBBBBBBBB"); + + SALOME_ModuleCatalog::Acomponent_var aComp = aCat->GetComponent( ComponentDataType() ); + if ( CORBA::is_nil( aComp ) ) + return father._retn(); + MESSAGE("CCCCCCCCCCC"); + + SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributePixMap_var aPixmap; + + father = aStudyBuilder->NewComponent( ComponentDataType() ); + aStudyBuilder->DefineComponentInstance( father, HEXABLOCK_Gen_i::_this() ); +// aStudyBuilder->DefineComponentInstance( father, _orb->object_to_string( HEXABLOCK_Gen_i::_this() ) ); + +// MESSAGE("PublishComponent-- _orb->object_to_string( this ) =>"<< _orb->object_to_string( this ) ); + MESSAGE("PublishComponent-- HEXABLOCK_Gen_i::_this() =>"<< HEXABLOCK_Gen_i::_this() ); + + anAttr = aStudyBuilder->FindOrCreateAttribute( father, "AttributePixMap" ); + aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr ); + aPixmap ->SetPixMap( "ICON_OBJBROWSER_HEXABLOCK" ); + SetName( father, aComp->componentusername(), "HEXABLOCK" ); + if(MYDEBUG) MESSAGE("PublishComponent--END"); + + return father._retn(); +} + + + + + + +// bool HEXABLOCKGUI::createSComponent() //addComponent +// { +// DEBTRACE("HEXABLOCKGUI::createSComponent"); +// _PTR(Study) aStudy = (( SalomeApp_Study* )(getApp()->activeStudy()))->studyDS(); +// _PTR(StudyBuilder) aBuilder (aStudy->NewBuilder()); +// _PTR(GenericAttribute) anAttr; +// _PTR(AttributeName) aName; +// +// // --- Find or create "HEXABLOCK" SComponent in the study +// _PTR(SComponent) aComponent = aStudy->FindComponent("HEXABLOCK"); +// if ( !aComponent ) +// { +// aComponent = aBuilder->NewComponent("HEXABLOCK"); +// anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributeName"); +// aName = _PTR(AttributeName) (anAttr); +// aName->SetValue(getApp()->moduleTitle("HEXABLOCK").toStdString()); +// +// anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributePixMap"); +// _PTR(AttributePixMap) aPixmap(anAttr); +// aPixmap->SetPixMap("share/salome/resources/hexablock/ModuleHexablock.png"); +// +// aBuilder->DefineComponentInstance(aComponent, getApp()->defaultEngineIOR().toStdString()); +// +// DEBTRACE("HEXABLOCKGUI::createSComponent defaultEngineIOR=>"<defaultEngineIOR().toStdString()); +// // SalomeApp_DataModel::synchronize( aComponent, HEXABLOCKGUI::activeStudy() ); +// return true; +// } +// return false; +// } + + + + + + + + + + + + + + + + + +// SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, +// SALOMEDS::SObject_ptr theSObject, +// CORBA::Object_ptr theObject, +// const char* theName) throw (SALOME::SALOME_Exception) +// { +// Unexpect aCatch(SALOME_SalomeException); +// SALOMEDS::SObject_var aResultSO; +// if(CORBA::is_nil(theObject) || theStudy->_is_nil()) return aResultSO; +// +// +// GEOM::GEOM_Object_var aShape = GEOM::GEOM_Object::_narrow(theObject); +// if(aShape->_is_nil()) return aResultSO; +// +// SALOMEDS::GenericAttribute_var anAttr; +// SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); +// +// SALOMEDS::SComponent_var aFather = theStudy->FindComponent("GEOM"); +// if (aFather->_is_nil()) { +// aFather = aStudyBuilder->NewComponent("GEOM"); +// anAttr = aStudyBuilder->FindOrCreateAttribute(aFather, "AttributeName"); +// SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr); +// aName->SetValue("Geometry"); +// aName->UnRegister(); +// anAttr = aStudyBuilder->FindOrCreateAttribute(aFather, "AttributePixMap"); +// SALOMEDS::AttributePixMap_var aPixMap=SALOMEDS::AttributePixMap::_narrow(anAttr); +// aPixMap->SetPixMap("ICON_OBJBROWSER_Geometry"); +// aPixMap->UnRegister(); +// aStudyBuilder->DefineComponentInstance(aFather, (GEOM::GEOM_Gen_var)GEOM_Gen::_this()); +// } +// if (aFather->_is_nil()) return aResultSO; +// +// if (CORBA::is_nil(theSObject)) { +// aResultSO = aStudyBuilder->NewObject(aFather); +// } else { +// if (!theSObject->ReferencedObject(aResultSO)) +// aResultSO = SALOMEDS::SObject::_duplicate(theSObject); //SRN: Added Aug 24,2004 : for the method AddInStudy with theFather argumenet != NULL +// //THROW_SALOME_CORBA_EXCEPTION("Publish in study supervision graph error",SALOME::BAD_PARAM); +// } +// CORBA::String_var aGeomObjIOR = _orb->object_to_string(theObject); +// aResultSO->SetAttrString("AttributeIOR",aGeomObjIOR); +// +// TCollection_AsciiString aShapeName("Shape_"); +// +// CORBA::Long mytype=aShape->GetType(); +// if ( mytype == GEOM_GROUP ) { +// GEOM::GEOM_IGroupOperations_var anOp = GetIGroupOperations( theStudy->StudyId() ); +// switch ( (TopAbs_ShapeEnum)anOp->GetType( aShape ) ) { +// case TopAbs_VERTEX: +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_PNT" ); +// aShapeName = "Group_Of_Vertices_"; +// break; +// case TopAbs_EDGE: +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_EDGE"); +// aShapeName = "Group_Of_Edges_"; +// break; +// case TopAbs_FACE: +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_FACE"); +// aShapeName = "Group_Of_Faces_"; +// break; +// case TopAbs_SOLID: +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_SOLID"); +// aShapeName = "Group_Of_Solids_"; +// break; +// } +// } else if ( mytype == GEOM_MARKER ) { +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_LCS"); +// aShapeName = "LocalCS_"; +// } else if ( mytype > ADVANCED_BASE ) { +// char buf[20]; +// sprintf( buf, "%d", aShape->GetType() ); +// std::string advId = "ICON_OBJBROWSER_ADVANCED_"; advId += buf; +// aResultSO->SetAttrString("AttributePixMap",advId.c_str()); +// aShapeName = "Advanced_"; +// } else { +// GEOM::shape_type myshapetype=aShape->GetShapeType(); +// if ( myshapetype == GEOM::COMPOUND ) { +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPOUND" ); +// aShapeName = "Compound_"; +// } else if ( myshapetype == GEOM::COMPSOLID ) { +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPSOLID"); +// aShapeName = "Compsolid_"; +// } else if ( myshapetype == GEOM::SOLID ) { +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SOLID"); +// aShapeName = "Solid_"; +// } else if ( myshapetype == GEOM::SHELL ) { +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SHELL"); +// aShapeName = "Shell_"; +// } else if ( myshapetype == GEOM::FACE ) { +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_FACE"); +// aShapeName = "Face_"; +// } else if ( myshapetype == GEOM::WIRE ) { +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_WIRE"); +// aShapeName = "Wire_"; +// } else if ( myshapetype == GEOM::EDGE ) { +// aResultSO->SetAttrString("AttributePixMap", "ICON_OBJBROWSER_EDGE"); +// aShapeName = "Edge_"; +// } else if ( myshapetype == GEOM::VERTEX ) { +// aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_VERTEX" ); +// aShapeName = "Vertex_"; +// } +// } +// //if (strlen(theName) == 0) aShapeName += TCollection_AsciiString(aResultSO->Tag()); +// //else aShapeName = TCollection_AsciiString(CORBA::string_dup(theName)); +// +// // BEGIN: try to find existed name for current shape +// bool HasName = false; +// // recieve current TopoDS shape +// CORBA::String_var entry = aShape->GetEntry(); +// Handle(GEOM_Object) aGShape = _impl->GetObject(aShape->GetStudyID(), entry); +// TopoDS_Shape TopoSh = aGShape->GetValue(); +// // find label of main shape +// GEOM::GEOM_Object_var aMainSh = aShape; +// while( !aMainSh->IsMainShape() ) { +// aMainSh = aMainSh->GetMainShape(); +// } +// entry = aMainSh->GetEntry(); +// Handle(GEOM_Object) anObj = _impl->GetObject(aMainSh->GetStudyID(), entry); +// TDF_Label aMainLbl = anObj->GetFunction(1)->GetNamingEntry(); +// +// // check all named shapes using iterator +// TDF_ChildIDIterator anIt (aMainLbl, TNaming_NamedShape::GetID(), Standard_True); +// +// for (; anIt.More() && !HasName; anIt.Next()) { +// Handle(TNaming_NamedShape) anAttr = +// Handle(TNaming_NamedShape)::DownCast(anIt.Value()); +// if (anAttr.IsNull()) continue; +// TopoDS_Shape S = anAttr->Get(); +// if (S.IsEqual(TopoSh)) { +// TDF_Label L = anAttr->Label(); +// Handle(TDataStd_Name) aName; +// if (L.FindAttribute(TDataStd_Name::GetID(), aName)) { +// aShapeName = aName->Get(); +// HasName = true; +// } +// } +// } +// // END: try to find existed name for current shape +// +// +// aResultSO->SetAttrString("AttributeString",aVars.ToCString()); +// +// aFather->UnRegister(); +// +// //Set a name of the GEOM object +// aShape->SetName(aShapeName.ToCString()); +// +// return aResultSO._retn(); +// } + + + + + +//============================================================================= +/*! + * findMaxChildTag [ static internal ] + * + * Finds maximum child tag for the given object + */ +//============================================================================= + +static long findMaxChildTag( SALOMEDS::SObject_ptr theSObject ) +{ + long aTag = 0; + if ( !theSObject->_is_nil() ) { + SALOMEDS::Study_var aStudy = theSObject->GetStudy(); + if ( !aStudy->_is_nil() ) { + SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator( theSObject ); + for ( ; anIter->More(); anIter->Next() ) { + long nTag = anIter->Value()->Tag(); + if ( nTag > aTag ) + aTag = nTag; + } + } + } + return aTag; +} + +//======================================================================= +//function : PublishMesh +//purpose : +//======================================================================= +SALOMEDS::SObject_ptr HEXABLOCK_Gen_i::PublishDoc ( SALOMEDS::Study_ptr theStudy, + Document_ptr theDoc, + const char* theName) +{ + if ( CORBA::is_nil( theStudy ) || + CORBA::is_nil( theDoc )) + return SALOMEDS::SComponent::_nil(); + if(MYDEBUG) MESSAGE("PublishMesh--IN"); + + // find or publish a mesh + + SALOMEDS::SObject_var aDocSO = ObjectToSObject( theStudy, theDoc ); + if ( aDocSO->_is_nil() ) + { + SALOMEDS::SComponent_var father = PublishComponent( theStudy ); + if ( father->_is_nil() ) + return aDocSO._retn(); + + // Find correct free tag + long aTag = findMaxChildTag( father.in() ); +// if ( aTag <= GetAlgorithmsRootTag() ) +// aTag = GetAlgorithmsRootTag() + 1; +// else +// aTag++; + aTag++; + + aDocSO = publish (theStudy, theDoc, father, aTag);//, "ICON_DOC_TREE_MESH_WARN" ); + if ( aDocSO->_is_nil() ) + return aDocSO._retn(); + } + std::string docName = SetName( aDocSO, theName, theDoc->getName()); // Bph + // theDoc->setName( docName.c_str() ); // Abu + + // Add shape reference +// GEOM::GEOM_Object_var aShapeObject = theMesh->GetShapeToMesh(); +// if ( !CORBA::is_nil( aShapeObject )) { +// addReference( theStudy, aMeshSO, aShapeObject, GetRefOnShapeTag() ); +// +// // Publish global hypotheses +// +// SMESH::ListOfHypothesis_var hypList = theMesh->GetHypothesisList( aShapeObject ); +// for ( int i = 0; i < hypList->length(); i++ ) { +// SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( hypList[ i ]); +// PublishHypothesis( theStudy, aHyp ); +// AddHypothesisToShape( theStudy, theMesh, aShapeObject, aHyp ); +// } +// } +// +// // Publish submeshes +// +// SMESH_Mesh_i* mesh_i = objectToServant( theMesh ); +// if ( !mesh_i ) +// return aMeshSO._retn(); +// map& subMap = mesh_i->_mapSubMesh_i; +// map::iterator subIt = subMap.begin(); +// for ( ; subIt != subMap.end(); subIt++ ) { +// SMESH::SMESH_subMesh_ptr aSubMesh = (*subIt).second->_this(); +// if ( !CORBA::is_nil( aSubMesh )) { +// aShapeObject = aSubMesh->GetSubShape(); +// PublishSubMesh( theStudy, theMesh, aSubMesh, aShapeObject ); +// } +// } +// +// // Publish groups +// const map& grMap = mesh_i->getGroups(); +// map::const_iterator it = grMap.begin(); +// for ( ; it != grMap.end(); it++ ) +// { +// SMESH::SMESH_GroupBase_ptr aGroup = (*it).second; +// if ( !aGroup->_is_nil() ) { +// GEOM::GEOM_Object_var aShapeObj; +// SMESH::SMESH_GroupOnGeom_var aGeomGroup = +// SMESH::SMESH_GroupOnGeom::_narrow( aGroup ); +// if ( !aGeomGroup->_is_nil() ) +// aShapeObj = aGeomGroup->GetShape(); +// PublishGroup( theStudy, theMesh, aGroup, aShapeObj ); +// } +// } + + if(MYDEBUG) MESSAGE("PublishDoc_END"); + return aDocSO._retn(); +} + +//======================================================================= +//function : PublishSubMesh +//purpose : +//======================================================================= + +// SALOMEDS::SObject_ptr SMESH_Gen_i::PublishSubMesh (SALOMEDS::Study_ptr theStudy, +// SMESH::SMESH_Mesh_ptr theMesh, +// SMESH::SMESH_subMesh_ptr theSubMesh, +// GEOM::GEOM_Object_ptr theShapeObject, +// const char* theName) +// { +// if (theStudy->_is_nil() || theMesh->_is_nil() || +// theSubMesh->_is_nil() || theShapeObject->_is_nil() ) +// return SALOMEDS::SObject::_nil(); +// +// SALOMEDS::SObject_var aSubMeshSO = ObjectToSObject( theStudy, theSubMesh ); +// if ( aSubMeshSO->_is_nil() ) +// { +// SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); +// if ( aMeshSO->_is_nil() ) { +// aMeshSO = PublishMesh( theStudy, theMesh ); +// if ( aMeshSO->_is_nil()) +// return SALOMEDS::SObject::_nil(); +// } +// // Find submesh sub-tree tag +// long aRootTag; +// const char* aRootName = ""; +// switch ( theShapeObject->GetShapeType() ) { +// case GEOM::VERTEX: +// aRootTag = GetSubMeshOnVertexTag(); +// aRootName = "SubMeshes on Vertex"; +// break; +// case GEOM::EDGE: +// aRootTag = GetSubMeshOnEdgeTag(); +// aRootName = "SubMeshes on Edge"; +// break; +// case GEOM::WIRE: +// aRootTag = GetSubMeshOnWireTag(); +// aRootName = "SubMeshes on Wire"; +// break; +// case GEOM::FACE: +// aRootTag = GetSubMeshOnFaceTag(); +// aRootName = "SubMeshes on Face"; +// break; +// case GEOM::SHELL: +// aRootTag = GetSubMeshOnShellTag(); +// aRootName = "SubMeshes on Shell"; +// break; +// case GEOM::SOLID: +// aRootTag = GetSubMeshOnSolidTag(); +// aRootName = "SubMeshes on Solid"; +// break; +// default: +// aRootTag = GetSubMeshOnCompoundTag(); +// aRootName = "SubMeshes on Compound"; +// break; +// } +// +// // Find or create submesh root +// SALOMEDS::SObject_var aRootSO = publish (theStudy, CORBA::Object::_nil(), +// aMeshSO, aRootTag, 0, false ); +// SetName( aRootSO, aRootName ); +// +// // Add new submesh to corresponding sub-tree +// aSubMeshSO = publish (theStudy, theSubMesh, aRootSO, 0, "ICON_SMESH_TREE_MESH_WARN"); +// if ( aSubMeshSO->_is_nil() ) +// return aSubMeshSO._retn(); +// } +// SetName( aSubMeshSO, theName, "SubMesh" ); +// +// // Add reference to theShapeObject +// +// addReference( theStudy, aSubMeshSO, theShapeObject, 1 ); +// +// // Publish hypothesis +// +// SMESH::ListOfHypothesis * hypList = theMesh->GetHypothesisList( theShapeObject ); +// if ( hypList ) +// for ( int i = 0; i < hypList->length(); i++ ) { +// SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( (*hypList)[ i ]); +// PublishHypothesis( theStudy, aHyp ); +// AddHypothesisToShape( theStudy, theMesh, theShapeObject, aHyp ); +// } +// +// return aSubMeshSO._retn(); +// } + +//======================================================================= +//function : PublishGroup +//purpose : +//======================================================================= + +// SALOMEDS::SObject_ptr SMESH_Gen_i::PublishGroup (SALOMEDS::Study_ptr theStudy, +// SMESH::SMESH_Mesh_ptr theMesh, +// SMESH::SMESH_GroupBase_ptr theGroup, +// GEOM::GEOM_Object_ptr theShapeObject, +// const char* theName) +// { +// if (theStudy->_is_nil() || theMesh->_is_nil() || theGroup->_is_nil() ) +// return SALOMEDS::SObject::_nil(); +// +// SALOMEDS::SObject_var aGroupSO = ObjectToSObject( theStudy, theGroup ); +// if ( aGroupSO->_is_nil() ) +// { +// SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); +// if ( aMeshSO->_is_nil() ) { +// aMeshSO = PublishInStudy( theStudy, SALOMEDS::SObject::_nil(), theMesh, ""); +// if ( aMeshSO->_is_nil()) +// return SALOMEDS::SObject::_nil(); +// } +// int aType = (int)theGroup->GetType(); +// const char* aRootNames[] = { +// "Compound Groups", "Groups of Nodes", "Groups of Edges", +// "Groups of Faces", "Groups of Volumes", "Groups of 0D Elements" }; +// +// // Currently, groups with heterogenous content are not supported +// if ( aType != SMESH::ALL ) { +// long aRootTag = GetNodeGroupsTag() + aType - 1; +// +// // Find or create groups root +// SALOMEDS::SObject_var aRootSO = publish (theStudy, CORBA::Object::_nil(), +// aMeshSO, aRootTag, 0, false ); +// if ( aType < 6 ) +// SetName( aRootSO, aRootNames[aType] ); +// +// // Add new group to corresponding sub-tree +// aGroupSO = publish (theStudy, theGroup, aRootSO, 0, "ICON_SMESH_TREE_GROUP" ); +// } +// if ( aGroupSO->_is_nil() ) +// return aGroupSO._retn(); +// } +// +// SetName( aGroupSO, theName, "Group" ); +// +// //Add reference to geometry +// if ( !theShapeObject->_is_nil() ) +// addReference( theStudy, aGroupSO, theShapeObject, 1 ); +// +// return aGroupSO._retn(); +// } + +//======================================================================= +//function : PublishHypothesis +//purpose : +//======================================================================= + +// SALOMEDS::SObject_ptr +// SMESH_Gen_i::PublishHypothesis (SALOMEDS::Study_ptr theStudy, +// SMESH::SMESH_Hypothesis_ptr theHyp, +// const char* theName) +// { +// if(MYDEBUG) MESSAGE("PublishHypothesis") +// if (theStudy->_is_nil() || theHyp->_is_nil()) +// return SALOMEDS::SObject::_nil(); +// +// SALOMEDS::SObject_var aHypSO = ObjectToSObject( theStudy, theHyp ); +// if ( aHypSO->_is_nil() ) +// { +// SALOMEDS::SComponent_var father = PublishComponent( theStudy ); +// if ( father->_is_nil() ) +// return aHypSO._retn(); +// +// //Find or Create Hypothesis root +// bool isAlgo = ( !SMESH::SMESH_Algo::_narrow( theHyp )->_is_nil() ); +// int aRootTag = isAlgo ? GetAlgorithmsRootTag() : GetHypothesisRootTag(); +// SALOMEDS::SObject_var aRootSO = +// publish (theStudy, CORBA::Object::_nil(),father, aRootTag, +// isAlgo ? "ICON_SMESH_TREE_ALGO" : "ICON_SMESH_TREE_HYPO", false); +// SetName( aRootSO, isAlgo ? "Algorithms" : "Hypotheses" ); +// +// // Add New Hypothesis +// string aPmName = isAlgo ? "ICON_SMESH_TREE_ALGO_" : "ICON_SMESH_TREE_HYPO_"; +// aPmName += theHyp->GetName(); +// // prepend plugin name to pixmap name +// string pluginName = myHypCreatorMap[string(theHyp->GetName())]->GetModuleName(); +// if ( pluginName != "StdMeshers" ) +// aPmName = pluginName + "::" + aPmName; +// aHypSO = publish( theStudy, theHyp, aRootSO, 0, aPmName.c_str() ); +// } +// +// if ( !aHypSO->_is_nil() ) { +// CORBA::String_var aHypName = CORBA::string_dup( theHyp->GetName() ); +// SetName( aHypSO, theName, aHypName ); +// } +// +// if(MYDEBUG) MESSAGE("PublishHypothesis--END") +// return aHypSO._retn(); +// } + +//======================================================================= +//function : GetMeshOrSubmeshByShape +//purpose : +//======================================================================= + +// SALOMEDS::SObject_ptr +// SMESH_Gen_i::GetMeshOrSubmeshByShape (SALOMEDS::Study_ptr theStudy, +// SMESH::SMESH_Mesh_ptr theMesh, +// GEOM::GEOM_Object_ptr theShape) +// { +// if(MYDEBUG) MESSAGE("GetMeshOrSubmeshByShape") +// SALOMEDS::SObject_var aMeshOrSubMesh; +// if (theMesh->_is_nil() || ( theShape->_is_nil() && theMesh->HasShapeToMesh())) +// return aMeshOrSubMesh._retn(); +// +// TopoDS_Shape aShape; +// if(theMesh->HasShapeToMesh()) +// aShape = GeomObjectToShape( theShape ); +// else +// aShape = SMESH_Mesh::PseudoShape(); +// +// SMESH_Mesh_i* mesh_i = objectToServant( theMesh ); +// +// if ( !aShape.IsNull() && mesh_i && mesh_i->GetImpl().GetMeshDS() ) { +// SMESHDS_Mesh* meshDS = mesh_i->GetImpl().GetMeshDS(); +// if ( aShape.IsSame( meshDS->ShapeToMesh() )) +// aMeshOrSubMesh = ObjectToSObject( theStudy, theMesh ); +// else { +// int shapeID = meshDS->ShapeToIndex( aShape ); +// SMESH::SMESH_subMesh_var aSubMesh = mesh_i->getSubMesh(shapeID); +// if ( !aSubMesh->_is_nil() ) +// aMeshOrSubMesh = ObjectToSObject( theStudy, aSubMesh ); +// } +// } +// if(MYDEBUG) MESSAGE("GetMeshOrSubmeshByShape--END") +// return aMeshOrSubMesh._retn(); +// } + +//======================================================================= +//function : AddHypothesisToShape +//purpose : +//======================================================================= + +// bool SMESH_Gen_i::AddHypothesisToShape(SALOMEDS::Study_ptr theStudy, +// SMESH::SMESH_Mesh_ptr theMesh, +// GEOM::GEOM_Object_ptr theShape, +// SMESH::SMESH_Hypothesis_ptr theHyp) +// { +// if(MYDEBUG) MESSAGE("AddHypothesisToShape") +// if (theStudy->_is_nil() || theMesh->_is_nil() || +// theHyp->_is_nil() || (theShape->_is_nil() +// && theMesh->HasShapeToMesh()) ) +// return false; +// +// SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); +// if ( aMeshSO->_is_nil() ) +// aMeshSO = PublishMesh( theStudy, theMesh ); +// SALOMEDS::SObject_var aHypSO = PublishHypothesis( theStudy, theHyp ); +// if ( aMeshSO->_is_nil() || aHypSO->_is_nil()) +// return false; +// +// // Find a mesh or submesh refering to theShape +// SALOMEDS::SObject_var aMeshOrSubMesh = +// GetMeshOrSubmeshByShape( theStudy, theMesh, theShape ); +// if ( aMeshOrSubMesh->_is_nil() ) +// { +// // publish submesh +// TopoDS_Shape aShape = GeomObjectToShape( theShape ); +// SMESH_Mesh_i* mesh_i = objectToServant( theMesh ); +// if ( !aShape.IsNull() && mesh_i && mesh_i->GetImpl().GetMeshDS() ) { +// SMESHDS_Mesh* meshDS = mesh_i->GetImpl().GetMeshDS(); +// int shapeID = meshDS->ShapeToIndex( aShape ); +// SMESH::SMESH_subMesh_var aSubMesh = mesh_i->getSubMesh(shapeID); +// aMeshOrSubMesh = PublishSubMesh( theStudy, theMesh, aSubMesh, theShape ); +// } +// if ( aMeshOrSubMesh->_is_nil() ) +// return false; +// } +// +// //Find or Create Applied Hypothesis root +// bool aIsAlgo = !SMESH::SMESH_Algo::_narrow( theHyp )->_is_nil(); +// SALOMEDS::SObject_var AHR = +// publish (theStudy, CORBA::Object::_nil(), aMeshOrSubMesh, +// aIsAlgo ? GetRefOnAppliedAlgorithmsTag() : GetRefOnAppliedHypothesisTag(), +// aIsAlgo ? "ICON_SMESH_TREE_ALGO" : "ICON_SMESH_TREE_HYPO", false); +// SetName( AHR, aIsAlgo ? "Applied algorithms" : "Applied hypotheses" ); +// if ( AHR->_is_nil() ) +// return false; +// +// addReference( theStudy, AHR, theHyp ); +// if(MYDEBUG) MESSAGE("AddHypothesisToShape--END") +// return true; +// } + +//======================================================================= +//function : RemoveHypothesisFromShape +//purpose : +//======================================================================= + +// bool SMESH_Gen_i::RemoveHypothesisFromShape(SALOMEDS::Study_ptr theStudy, +// SMESH::SMESH_Mesh_ptr theMesh, +// GEOM::GEOM_Object_ptr theShape, +// SMESH::SMESH_Hypothesis_ptr theHyp) +// { +// if (theStudy->_is_nil() || theMesh->_is_nil() || +// theHyp->_is_nil() || (theShape->_is_nil() +// && theMesh->HasShapeToMesh())) +// return false; +// +// SALOMEDS::SObject_var aHypSO = ObjectToSObject( theStudy, theHyp ); +// if ( aHypSO->_is_nil() ) +// return false; +// +// // Find a mesh or submesh refering to theShape +// SALOMEDS::SObject_var aMeshOrSubMesh = +// GetMeshOrSubmeshByShape( theStudy, theMesh, theShape ); +// if ( aMeshOrSubMesh->_is_nil() ) +// return false; +// +// // Find and remove a reference to aHypSO +// SALOMEDS::SObject_var aRef, anObj; +// CORBA::String_var anID = CORBA::string_dup( aHypSO->GetID() ); +// SALOMEDS::ChildIterator_var it = theStudy->NewChildIterator( aMeshOrSubMesh ); +// for ( it->InitEx( true ); it->More(); it->Next() ) { +// anObj = it->Value(); +// if (anObj->ReferencedObject( aRef ) && strcmp( aRef->GetID(), anID ) == 0 ) { +// theStudy->NewBuilder()->RemoveObject( anObj ); +// break; +// } +// } +// return true; +// } + +//======================================================================= +//function : UpdateParameters +//purpose : +//======================================================================= +// void SMESH_Gen_i::UpdateParameters(CORBA::Object_ptr theObject, const char* theParameters) +// { +// +// if(VARIABLE_DEBUG) +// cout<<"UpdateParameters : "<_is_nil() || CORBA::is_nil(theObject)) +// return; +// +// SALOMEDS::SObject_var aSObj = ObjectToSObject(aStudy,theObject); +// if(aSObj->_is_nil()) +// return; +// +// SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); +// +// SALOMEDS::GenericAttribute_var aFindAttr; +// bool hasAttr = aSObj->FindAttribute(aFindAttr, "AttributeString"); +// if(VARIABLE_DEBUG) +// cout<<"Find Attribute "<FindOrCreateAttribute( aSObj, "AttributeString"); +// SALOMEDS::AttributeString_var aStringAttr = SALOMEDS::AttributeString::_narrow(anAttr); +// +// CORBA::String_var oldparVar = aStringAttr->Value(); +// CORBA::String_var inpparVar = ParseParameters(theParameters); +// TCollection_AsciiString aNewParams; +// TCollection_AsciiString aOldParameters(oldparVar.inout()); +// TCollection_AsciiString anInputParams(inpparVar.inout()); +// if(!hasAttr) +// aNewParams = anInputParams; +// else +// { +// int pos = aOldParameters.SearchFromEnd("|"); +// if(pos==-1) pos = 0; +// TCollection_AsciiString previousParamFull(aOldParameters.Split(pos)); +// TCollection_AsciiString previousParam(previousParamFull); +// TCollection_AsciiString theRepet("1"); +// pos = previousParam.SearchFromEnd(";*="); +// if(pos >= 0) +// { +// theRepet = previousParam.Split(pos+2); +// pos = pos-1; +// if(pos==-1) pos = 0; +// previousParam.Split(pos); +// } +// if(previousParam == anInputParams) +// { +// theRepet = theRepet.IntegerValue()+1; +// aNewParams = aOldParameters + previousParam + ";*=" + theRepet; +// } +// else +// { +// aNewParams = aOldParameters + previousParamFull + "|" + anInputParams; +// } +// } +// +// if(VARIABLE_DEBUG) +// { +// cout<<"Input Parameters : "<SetValue( aNewParams.ToCString() ); +// } + +//======================================================================= +//function : ParseParameters +//purpose : +//======================================================================= +// char* SMESH_Gen_i::ParseParameters(const char* theParameters) +// { +// //const char* aParameters = theParameters; +// // const char* aParameters = CORBA::string_dup(theParameters); +// TCollection_AsciiString anInputParams; +// SALOMEDS::Study_var aStudy = GetCurrentStudy(); +// if( !aStudy->_is_nil() ) { +// // SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(theParameters); +// // for(int j=0;jlength();j++) { +// // SALOMEDS::ListOfStrings aVars= aSections[j]; +// // for(int i=0;iIsVariable(aVars[i].in()) ? +// // TCollection_AsciiString(aVars[i].in()) : TCollection_AsciiString(""); +// // if(i != aVars.length()-1) +// // anInputParams+=":"; +// // } +// // if(j!=aSections->length()-1) +// // anInputParams+="|"; +// // } +// TCollection_AsciiString paramStr( theParameters ); +// static TCollection_AsciiString separators(":|"); +// int beg = 0, end; +// char sep, *pParams = (char*)paramStr.ToCString(); +// while ( beg < paramStr.Length() ) +// { +// end = beg-1; +// while ( ++end < paramStr.Length() ) +// if ( pParams[end] == ':' || pParams[end] == '|') +// break; +// if ( end < paramStr.Length()) +// { +// sep = pParams[end]; +// pParams[end] = '\0'; +// } +// if ( aStudy->IsVariable( pParams+beg )) +// anInputParams += pParams+beg; +// if ( end < paramStr.Length() ) +// anInputParams += sep; +// else +// break; +// beg = end + 1; +// } +// } +// return CORBA::string_dup(anInputParams.ToCString()); +// } + +//======================================================================= +//function : GetParameters +//purpose : +//======================================================================= +// char* SMESH_Gen_i::GetParameters(CORBA::Object_ptr theObject) +// { +// TCollection_AsciiString aResult; +// +// SALOMEDS::Study_ptr aStudy = GetCurrentStudy(); +// SALOMEDS::SObject_var aSObj = ObjectToSObject(aStudy,theObject); +// +// if(!aStudy->_is_nil() && +// !CORBA::is_nil(theObject) && +// !aSObj->_is_nil()){ +// +// SALOMEDS::GenericAttribute_var anAttr; +// if ( aSObj->FindAttribute(anAttr, "AttributeString")) { +// aResult = TCollection_AsciiString(SALOMEDS::AttributeString::_narrow(anAttr)->Value()); +// } +// } +// +// return CORBA::string_dup( aResult.ToCString() ); +// } diff --git a/src/HEXABLOCK_I/HexCrossElements_impl.cxx b/src/HEXABLOCK_I/HexCrossElements_impl.cxx new file mode 100755 index 0000000..f89765c --- /dev/null +++ b/src/HEXABLOCK_I/HexCrossElements_impl.cxx @@ -0,0 +1,362 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "hexa_base.hxx" +#include "HexVertex_impl.hxx" +#include "HexEdge_impl.hxx" +#include "HexQuad_impl.hxx" +#include "HexHexa_impl.hxx" +#include "HexCylinder_impl.hxx" +#include "HexCrossElements_impl.hxx" +#include "HEXABLOCK.hxx" + + +CrossElements_impl::CrossElements_impl( HEXA_NS::CrossElements *ptrCpp ):_crossElements_cpp(ptrCpp) +{ +} + + +HEXA_NS::CrossElements* CrossElements_impl::GetImpl() +{ + return _crossElements_cpp; +} + + +Vertex_ptr CrossElements_impl::getVertexIJK(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + HEXA_NS::Vertex* v = _crossElements_cpp->getVertexIJK(part, x, y, z); + if ( v != NULL ){ + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + return result; +} + + +Edge_ptr CrossElements_impl::getEdgeI(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + HEXA_NS::Edge* e = _crossElements_cpp->getEdgeI(part, x, y, z); + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + return result; +} + + +Edge_ptr CrossElements_impl::getEdgeJ(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + HEXA_NS::Edge* e = _crossElements_cpp->getEdgeJ(part, x, y, z); + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + return result; +} + + +Edge_ptr CrossElements_impl::getEdgeK(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + HEXA_NS::Edge* e = _crossElements_cpp->getEdgeK(part, x, y, z); + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + return result; +} + +Quad_ptr CrossElements_impl::getQuadIJ(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + HEXA_NS::Quad* q = _crossElements_cpp->getQuadIJ(part, x, y, z); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + return result; +} + + +Quad_ptr CrossElements_impl::getQuadIK(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + HEXA_NS::Quad* q = _crossElements_cpp->getQuadIK(part, x, y, z); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + return result; +} + + +Quad_ptr CrossElements_impl::getQuadJK(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + HEXA_NS::Quad* q = _crossElements_cpp->getQuadJK(part, x, y, z); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + return result; +} + + +Hexa_ptr CrossElements_impl::getHexaIJK(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + HEXA_NS::Hexa* h = _crossElements_cpp->getHexaIJK(part, x, y, z); + if ( h != NULL ){ + Hexa_impl* servantCorba = new Hexa_impl(h); + result = servantCorba->_this(); + } + return result; +} + +::CORBA::Long CrossElements_impl::crossCylinders(Cylinder_ptr c1In, Cylinder_ptr c2In) +throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long result; + Cylinder_impl* c1InServant = ::DownCast( c1In ); + Cylinder_impl* c2InServant = ::DownCast( c2In ); + + ASSERT( c1InServant ); + ASSERT( c2InServant ); + + if ( c1InServant && c2InServant ) { + HEXA_NS::Cylinder* c1 = c1InServant->GetImpl(); + HEXA_NS::Cylinder* c2 = c2InServant->GetImpl(); + + result = _crossElements_cpp->crossCylinders(c1,c2); + } + return result; + +} + + + +::CORBA::Long CrossElements_impl::saveVtk(const char* fname) throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long ret = _crossElements_cpp->saveVtk( fname ); + return ret; +} + + + +void CrossElements_impl::dump() throw (SALOME::SALOME_Exception) +{ + _crossElements_cpp->dump(); +} + + +void CrossElements_impl::printName() throw (SALOME::SALOME_Exception) +{ + _crossElements_cpp->printName(); +} + +char* CrossElements_impl::getName() throw (SALOME::SALOME_Exception) +{ + return CORBA::string_dup( _crossElements_cpp->getName() ); +} + +// ========================================================= setName +void CrossElements_impl::setName(const char* name) + throw (SALOME::SALOME_Exception) +{ + _crossElements_cpp->setName (name); +} + +// ::CORBA::Long CrossElements_impl::countVertex() throw (SALOME::SALOME_Exception) +// { +// ::CORBA::Long n = _crossElements_cpp->countVertex(); +// return n; +// } +// +// ::CORBA::Long CrossElements_impl::countEdge() throw (SALOME::SALOME_Exception) +// { +// ::CORBA::Long n = _crossElements_cpp->countEdge(); +// return n; +// } +// +// ::CORBA::Long CrossElements_impl::countQuad() throw (SALOME::SALOME_Exception) +// { +// ::CORBA::Long n = _crossElements_cpp->countQuad(); +// return n; +// } +// +// ::CORBA::Long CrossElements_impl::countHexa() throw (SALOME::SALOME_Exception) +// { +// ::CORBA::Long n = _crossElements_cpp->countHexa(); +// return n; +// } +// +// +// +// Vertex_ptr CrossElements_impl::getVertex(::CORBA::Long n) throw (SALOME::SALOME_Exception) +// { +// HEXA_NS::Vertex* v = _crossElements_cpp->getVertex(n); +// Vertex_impl* servantCorba = new Vertex_impl(v); +// return servantCorba->_this(); +// } +// +// Edge_ptr CrossElements_impl::getEdge(::CORBA::Long n) throw (SALOME::SALOME_Exception) +// { +// HEXA_NS::Edge* e = _crossElements_cpp->getEdge(n); +// Edge_impl* servantCorba = new Edge_impl(e); +// return servantCorba->_this(); +// } +// +// Quad_ptr CrossElements_impl::getQuad(::CORBA::Long n) throw (SALOME::SALOME_Exception) +// { +// HEXA_NS::Quad* q = _crossElements_cpp->getQuad(n); +// Quad_impl* servantCorba = new Quad_impl(q); +// return servantCorba->_this(); +// } +// +// Hexa_ptr CrossElements_impl::getHexa(::CORBA::Long n) throw (SALOME::SALOME_Exception) +// { +// HEXA_NS::Hexa* h = _crossElements_cpp->getHexa(n); +// Hexa_impl* servantCorba = new Hexa_impl(h); +// return servantCorba->_this(); +// } +// +// +// +// ::CORBA::Long CrossElements_impl::saveVtk( const char* fname ) throw (SALOME::SALOME_Exception) +// { +// ::CORBA::Long ret = _crossElements_cpp->saveVtk( fname ); +// return ret; +// } +// +// +// +// Vertex_ptr CrossElements_impl::getVertexIJK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) +// throw (SALOME::SALOME_Exception) +// { +// Vertex_ptr result = Vertex::_nil(); +// // HEXA_NS::Vertex* v = _crossElements_cpp->getVertexIJK(x, y,z); +// HEXA_NS::Vertex* v = NULL; +// _crossElements_cpp->toto(); +// if ( v != NULL ){ +// Vertex_impl* servantCorba = new Vertex_impl(v); +// result = servantCorba->_this(); +// } +// return result; +// } +// +// +// Edge_ptr CrossElements_impl::getEdgeI(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) +// throw (SALOME::SALOME_Exception) +// { +// Edge_ptr result = Edge::_nil(); +// HEXA_NS::Edge* e = _crossElements_cpp->getEdgeI(x, y, z); +// if ( e != NULL ){ +// Edge_impl* servantCorba = new Edge_impl(e); +// result = servantCorba->_this(); +// } +// return result; +// } +// +// +// Edge_ptr CrossElements_impl::getEdgeJ(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) +// throw (SALOME::SALOME_Exception) +// { +// Edge_ptr result = Edge::_nil(); +// HEXA_NS::Edge* e = _crossElements_cpp->getEdgeJ(x, y, z); +// if ( e != NULL ){ +// Edge_impl* servantCorba = new Edge_impl(e); +// result = servantCorba->_this(); +// } +// return result; +// } +// +// +// Edge_ptr CrossElements_impl::getEdgeK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) +// throw (SALOME::SALOME_Exception) +// { +// Edge_ptr result = Edge::_nil(); +// HEXA_NS::Edge* e = _crossElements_cpp->getEdgeK(x, y, z); +// if ( e != NULL ){ +// Edge_impl* servantCorba = new Edge_impl(e); +// result = servantCorba->_this(); +// } +// return result; +// } +// +// Quad_ptr CrossElements_impl::getQuadIJ(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) +// throw (SALOME::SALOME_Exception) +// { +// Quad_ptr result = Quad::_nil(); +// HEXA_NS::Quad* q = _crossElements_cpp->getQuadIJ(x, y, z); +// if ( q != NULL ){ +// Quad_impl* servantCorba = new Quad_impl(q); +// result = servantCorba->_this(); +// } +// return result; +// } +// +// +// Quad_ptr CrossElements_impl::getQuadIK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) +// throw (SALOME::SALOME_Exception) +// { +// Quad_ptr result = Quad::_nil(); +// HEXA_NS::Quad* q = _crossElements_cpp->getQuadIK(x, y, z); +// if ( q != NULL ){ +// Quad_impl* servantCorba = new Quad_impl(q); +// result = servantCorba->_this(); +// } +// return result; +// } +// +// +// Quad_ptr CrossElements_impl::getQuadJK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) +// throw (SALOME::SALOME_Exception) +// { +// Quad_ptr result = Quad::_nil(); +// HEXA_NS::Quad* q = _crossElements_cpp->getQuadJK(x, y, z); +// if ( q != NULL ){ +// Quad_impl* servantCorba = new Quad_impl(q); +// result = servantCorba->_this(); +// } +// return result; +// } +// +// +// Hexa_ptr CrossElements_impl::getHexaIJK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception) +// { +// Hexa_ptr result = Hexa::_nil(); +// HEXA_NS::Hexa* h = _crossElements_cpp->getHexaIJK(x, y, z); +// if ( h != NULL ){ +// Hexa_impl* servantCorba = new Hexa_impl(h); +// result = servantCorba->_this(); +// } +// return result; +// } + + diff --git a/src/HEXABLOCK_I/HexCrossElements_impl.hxx b/src/HEXABLOCK_I/HexCrossElements_impl.hxx new file mode 100755 index 0000000..87b9438 --- /dev/null +++ b/src/HEXABLOCK_I/HexCrossElements_impl.hxx @@ -0,0 +1,62 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HexCrossElements_impl__ +#define __HexCrossElements_impl__ + +#include +#include CORBA_SERVER_HEADER(CrossElements) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexCrossElements.hxx" + +using namespace HEXABLOCK_ORB; + +class CrossElements_impl : public POA_HEXABLOCK_ORB::CrossElements, + public SALOME::GenericObj_i +{ +public: + CrossElements_impl(HEXA_NS::CrossElements *ptrCpp); + HEXA_NS::CrossElements* GetImpl(); + + Vertex_ptr getVertexIJK(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + + Edge_ptr getEdgeI(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + Edge_ptr getEdgeJ(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + Edge_ptr getEdgeK(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + + Quad_ptr getQuadIJ(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + Quad_ptr getQuadIK(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + Quad_ptr getQuadJK(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + + Hexa_ptr getHexaIJK(::CORBA::Long part, ::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + + ::CORBA::Long crossCylinders(Cylinder_ptr cyl1, Cylinder_ptr cyl2) throw (SALOME::SALOME_Exception); + + ::CORBA::Long saveVtk(const char* fname) throw (SALOME::SALOME_Exception); + void dump() throw (SALOME::SALOME_Exception); + void printName() throw (SALOME::SALOME_Exception); + char* getName() throw (SALOME::SALOME_Exception); + void setName (const char* name) throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::CrossElements *_crossElements_cpp; +}; + +#endif diff --git a/src/HEXABLOCK_I/HexCylinder_impl.cxx b/src/HEXABLOCK_I/HexCylinder_impl.cxx new file mode 100755 index 0000000..cb4cd04 --- /dev/null +++ b/src/HEXABLOCK_I/HexCylinder_impl.cxx @@ -0,0 +1,115 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "HEXABLOCK.hxx" +#include "utilities.h" + +#include + +#include "hexa_base.hxx" +#include "HexCylinder_impl.hxx" +#include "HexVertex_impl.hxx" +#include "HexVector_impl.hxx" + +Cylinder_impl::Cylinder_impl( HEXA_NS::Cylinder *ptrCpp ):_cylinder_cpp(ptrCpp) +{ +} + +HEXA_NS::Cylinder* Cylinder_impl::GetImpl() + throw (SALOME::SALOME_Exception) +{ + return _cylinder_cpp; +} + + +Vertex_ptr Cylinder_impl::getBase() + throw (SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + + HEXA_NS::Vertex* v = _cylinder_cpp->getBase(); + if ( v!= NULL ){ + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + + return result; +} + +Vector_ptr Cylinder_impl::getDirection() + throw (SALOME::SALOME_Exception) +{ + Vector_ptr result = Vector::_nil(); + + HEXA_NS::Vector* v = _cylinder_cpp->getDirection(); + if ( v!= NULL ){ + Vector_impl* servantCorba = new Vector_impl(v); + result = servantCorba->_this(); + } + return result; +} + + +::CORBA::Double Cylinder_impl::getRadius() + throw (SALOME::SALOME_Exception) +{ + ::CORBA::Double d = _cylinder_cpp->getRadius(); + return d; +} + + +::CORBA::Double Cylinder_impl::getHeight() + throw (SALOME::SALOME_Exception) +{ + ::CORBA::Double d = _cylinder_cpp->getHeight(); + return d; +} + + +void Cylinder_impl::dump() throw (SALOME::SALOME_Exception) +{ + _cylinder_cpp->dump(); +} + + +void Cylinder_impl::printName() throw (SALOME::SALOME_Exception) +{ + _cylinder_cpp->printName(); +} + + +char* Cylinder_impl::getName() throw (SALOME::SALOME_Exception) +{ + char name[12]; + return CORBA::string_dup( _cylinder_cpp->getName(name) ); +} +// ========================================================= setName +void Cylinder_impl::setName(const char* name) + throw (SALOME::SALOME_Exception) +{ + _cylinder_cpp->setName (name); +} + +// ::CORBA::Long Cylinder_impl::saveVtk(const char* fname) throw (SALOME::SALOME_Exception) +// { +// ::CORBA::Long ret = _cylinder_cpp->saveVtk( fname ); +// return ret; +// } + + diff --git a/src/HEXABLOCK_I/HexCylinder_impl.hxx b/src/HEXABLOCK_I/HexCylinder_impl.hxx new file mode 100755 index 0000000..f4f25e9 --- /dev/null +++ b/src/HEXABLOCK_I/HexCylinder_impl.hxx @@ -0,0 +1,53 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HexCylinder_impl__ +#define __HexCylinder_impl__ + +#include +#include CORBA_SERVER_HEADER(Cylinder) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexCylinder.hxx" + +using namespace HEXABLOCK_ORB; + +class Cylinder_impl : public POA_HEXABLOCK_ORB::Cylinder, + public SALOME::GenericObj_i +{ +public: + Cylinder_impl(HEXA_NS::Cylinder *ptrCpp); + HEXA_NS::Cylinder* GetImpl() throw (SALOME::SALOME_Exception); + + Vertex_ptr getBase() throw (SALOME::SALOME_Exception); + Vector_ptr getDirection() throw (SALOME::SALOME_Exception); + ::CORBA::Double getRadius() throw (SALOME::SALOME_Exception); + ::CORBA::Double getHeight() throw (SALOME::SALOME_Exception); + +// ::CORBA::Long saveVtk(const char* fname) throw (SALOME::SALOME_Exception); + void dump() throw (SALOME::SALOME_Exception); + void printName() throw (SALOME::SALOME_Exception); + char* getName() throw (SALOME::SALOME_Exception); + void setName (const char* name) throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::Cylinder *_cylinder_cpp; +}; + +#endif diff --git a/src/HEXABLOCK_I/HexDocument_impl.cxx b/src/HEXABLOCK_I/HexDocument_impl.cxx new file mode 100755 index 0000000..77fb534 --- /dev/null +++ b/src/HEXABLOCK_I/HexDocument_impl.cxx @@ -0,0 +1,2438 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; + +#include "utilities.h" + +#include + +#include "HEXABLOCK.hxx" +#include "HexDocument_impl.hxx" +// + +#include "HexVertex_impl.hxx" +#include "HexEdge_impl.hxx" +#include "HexQuad_impl.hxx" +#include "HexHexa_impl.hxx" +#include "HexVector_impl.hxx" +#include "HexElements_impl.hxx" +#include "HexCrossElements_impl.hxx" +#include "HexCylinder_impl.hxx" +#include "HexPipe_impl.hxx" +#include "HexLaw_impl.hxx" +#include "HexPropagation_impl.hxx" +#include "HexGroup_impl.hxx" +#include "HexPipe_impl.hxx" + +#include "HexShape.hxx" + + +using namespace HEXABLOCK_ORB; + + +Document_impl::Document_impl( PortableServer::POA_ptr thePOA, HEXA_NS::Document *ptrCpp): +SALOME::GenericObj_i( thePOA ), +_document_cpp(ptrCpp) +{ +} + + +// Document_impl::Document_impl(HEXA_NS::Document *ptrCpp):_document_cpp(ptrCpp) +// { +// } + +::CORBA::Long Document_impl::saveVtk(const char* fname) throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long ret = _document_cpp->saveVtk( fname ); + return ret; +} +void Document_impl::purge() throw (SALOME::SALOME_Exception) +{ + _document_cpp->purge(); +} +void Document_impl::dump() throw (SALOME::SALOME_Exception) +{ + _document_cpp->dump(); +} + +HEXA_NS::Document* Document_impl::GetImpl() throw (SALOME::SALOME_Exception) +{ + return _document_cpp; +} + +::CORBA::Long Document_impl::save(const char* fileName) + throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long ret = _document_cpp->save(fileName); + return ret; +} + +::CORBA::Long Document_impl::setName(const char* name) + throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long ret = _document_cpp->setName(name); + return ret; +} + +void Document_impl::setTolerance(::CORBA::Double tol) + throw (SALOME::SALOME_Exception) +{ + _document_cpp->setTolerance(tol); +} + +::CORBA::Double Document_impl::getTolerance() throw (SALOME::SALOME_Exception) +{ + return _document_cpp->getTolerance(); +} + +Vertex_ptr Document_impl::addVertex(::CORBA::Double x, ::CORBA::Double y, ::CORBA::Double z) + throw(SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + + HEXA_NS::Vertex* v = _document_cpp->addVertex( x, y, z ); + if ( v != NULL ){ + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + return result; +} + +::CORBA::Long Document_impl::countVertex() throw (SALOME::SALOME_Exception) +{ + return _document_cpp->countVertex(); +} + +Vertex_ptr Document_impl::getVertex(::CORBA::Long i) throw (SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + + HEXA_NS::Vertex* v = _document_cpp->getVertex(i); + if ( v != NULL ){ + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + return result; +} + + +Vertex_ptr Document_impl::findVertex(::CORBA::Double x, ::CORBA::Double y, ::CORBA::Double z) + throw (SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + + HEXA_NS::Vertex* v = _document_cpp->findVertex( x, y, z); + if ( v != NULL ){ + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + return result; +} + + +Edge_ptr Document_impl::addEdge(Vertex_ptr v0In, Vertex_ptr v1In) + throw(SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + + Vertex_impl* v0InServant = ::DownCast( v0In ); + Vertex_impl* v1InServant = ::DownCast( v1In ); + ASSERT( v0InServant ); + ASSERT( v1InServant ); + if ( v0InServant && v1InServant ) { + HEXA_NS::Vertex* v0 = v0InServant->GetImpl(); + HEXA_NS::Vertex* v1 = v1InServant->GetImpl(); + HEXA_NS::Edge* e = _document_cpp->addEdge( v0, v1 ); + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + } + return result; +} + + +::CORBA::Long Document_impl::countEdge() throw (SALOME::SALOME_Exception) +{ + return _document_cpp->countEdge(); +} + +Edge_ptr Document_impl::getEdge(::CORBA::Long i) throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + + HEXA_NS::Edge* e = _document_cpp->getEdge(i); + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + return result; +} + +Edge_ptr Document_impl::findEdge(Vertex_ptr p0In, Vertex_ptr p1In) + throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + + Vertex_impl* p0InServant = ::DownCast( p0In ); + Vertex_impl* p1InServant = ::DownCast( p1In ); + ASSERT( p0InServant ); + ASSERT( p1InServant ); + + if ( p0InServant && p1InServant ) { + HEXA_NS::Vertex* p0 = p0InServant->GetImpl(); + HEXA_NS::Vertex* p1 = p1InServant->GetImpl(); + HEXA_NS::Edge* e = _document_cpp->findEdge( p0, p1 ); + + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + } + return result; +} + + +Quad_ptr Document_impl::addQuad(Edge_ptr e0In, Edge_ptr e1In, Edge_ptr e2In, Edge_ptr e3In) +throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + + Edge_impl* e0InServant = ::DownCast( e0In ); + Edge_impl* e1InServant = ::DownCast( e1In ); + Edge_impl* e2InServant = ::DownCast( e2In ); + Edge_impl* e3InServant = ::DownCast( e3In ); + ASSERT( e0InServant ); + ASSERT( e1InServant ); + ASSERT( e2InServant ); + ASSERT( e3InServant ); + if ( e0InServant && e1InServant && e2InServant && e3InServant) { + HEXA_NS::Edge* e0 = e0InServant->GetImpl(); + HEXA_NS::Edge* e1 = e1InServant->GetImpl(); + HEXA_NS::Edge* e2 = e2InServant->GetImpl(); + HEXA_NS::Edge* e3 = e3InServant->GetImpl(); + HEXA_NS::Quad* q = _document_cpp->addQuad( e0, e1, e2, e3 ); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + } + return result; +} + +Quad_ptr Document_impl::addQuadVertices( Vertex_ptr v0In, Vertex_ptr v1In, + Vertex_ptr v2In, Vertex_ptr v3In ) + throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + + Vertex_impl* v0InServant = ::DownCast( v0In ); + Vertex_impl* v1InServant = ::DownCast( v1In ); + Vertex_impl* v2InServant = ::DownCast( v2In ); + Vertex_impl* v3InServant = ::DownCast( v3In ); + ASSERT( v0InServant ); + ASSERT( v1InServant ); + ASSERT( v2InServant ); + ASSERT( v3InServant ); + + if ( v0InServant && v1InServant && v2InServant && v3InServant) { + HEXA_NS::Vertex* v0 = v0InServant->GetImpl(); + HEXA_NS::Vertex* v1 = v1InServant->GetImpl(); + HEXA_NS::Vertex* v2 = v2InServant->GetImpl(); + HEXA_NS::Vertex* v3 = v3InServant->GetImpl(); + HEXA_NS::Quad* q = _document_cpp->addQuadVertices( v0, v1, v2, v3 ); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + } + return result; +} + +::CORBA::Long Document_impl::countQuad() throw (SALOME::SALOME_Exception) +{ + return _document_cpp->countQuad(); +} + +Quad_ptr Document_impl::getQuad(::CORBA::Long i) throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + + HEXA_NS::Quad* q = _document_cpp->getQuad(i); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + return result; +} + +Quad_ptr Document_impl::findQuad(Vertex_ptr p0In, Vertex_ptr p1In) throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + + Vertex_impl* p0InServant = ::DownCast( p0In ); + Vertex_impl* p1InServant = ::DownCast( p1In ); + ASSERT( p0InServant ); + ASSERT( p1InServant ); + + if ( p0InServant && p1InServant ) { + HEXA_NS::Vertex* p0 = p0InServant->GetImpl(); + HEXA_NS::Vertex* p1 = p1InServant->GetImpl(); + + HEXA_NS::Quad* q = _document_cpp->findQuad( p0, p1 ); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + } + return result; +} + + +Hexa_ptr Document_impl::addHexa(Quad_ptr q0In, Quad_ptr q1In, Quad_ptr q2In, Quad_ptr q3In, Quad_ptr q4In, Quad_ptr q5In) + throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + + Quad_impl* q0InServant = ::DownCast( q0In ); + Quad_impl* q1InServant = ::DownCast( q1In ); + Quad_impl* q2InServant = ::DownCast( q2In ); + Quad_impl* q3InServant = ::DownCast( q3In ); + Quad_impl* q4InServant = ::DownCast( q4In ); + Quad_impl* q5InServant = ::DownCast( q5In ); + + ASSERT( q0InServant ); + ASSERT( q1InServant ); + ASSERT( q2InServant ); + ASSERT( q3InServant ); + ASSERT( q4InServant ); + ASSERT( q5InServant ); + + if ( q0InServant && q1InServant && q2InServant && q3InServant + && q4InServant && q5InServant ){ + HEXA_NS::Quad* q0 = q0InServant->GetImpl(); + HEXA_NS::Quad* q1 = q1InServant->GetImpl(); + HEXA_NS::Quad* q2 = q2InServant->GetImpl(); + HEXA_NS::Quad* q3 = q3InServant->GetImpl(); + HEXA_NS::Quad* q4 = q4InServant->GetImpl(); + HEXA_NS::Quad* q5 = q5InServant->GetImpl(); + HEXA_NS::Hexa* h = _document_cpp->addHexa( q0, q1, q2, q3, q4, q5 ); + if ( h != NULL ){ + Hexa_impl* servantCorba = new Hexa_impl(h); + result = servantCorba->_this(); + } + } + return result; +} + + + +Hexa_ptr Document_impl::addHexaVertices( Vertex_ptr v0In, Vertex_ptr v1In, Vertex_ptr v2In, Vertex_ptr v3In, Vertex_ptr v4In, Vertex_ptr v5In, Vertex_ptr v6In, Vertex_ptr v7In ) + throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + + Vertex_impl* v0InServant = ::DownCast( v0In ); + Vertex_impl* v1InServant = ::DownCast( v1In ); + Vertex_impl* v2InServant = ::DownCast( v2In ); + Vertex_impl* v3InServant = ::DownCast( v3In ); + Vertex_impl* v4InServant = ::DownCast( v4In ); + Vertex_impl* v5InServant = ::DownCast( v5In ); + Vertex_impl* v6InServant = ::DownCast( v6In ); + Vertex_impl* v7InServant = ::DownCast( v7In ); + ASSERT( v0InServant ); + ASSERT( v1InServant ); + ASSERT( v2InServant ); + ASSERT( v3InServant ); + ASSERT( v4InServant ); + ASSERT( v5InServant ); + ASSERT( v6InServant ); + ASSERT( v7InServant ); + + if ( v0InServant && v1InServant && v2InServant && v3InServant + && v4InServant && v5InServant && v6InServant && v7InServant ){ + HEXA_NS::Vertex* v0 = v0InServant->GetImpl(); + HEXA_NS::Vertex* v1 = v1InServant->GetImpl(); + HEXA_NS::Vertex* v2 = v2InServant->GetImpl(); + HEXA_NS::Vertex* v3 = v3InServant->GetImpl(); + HEXA_NS::Vertex* v4 = v4InServant->GetImpl(); + HEXA_NS::Vertex* v5 = v5InServant->GetImpl(); + HEXA_NS::Vertex* v6 = v6InServant->GetImpl(); + HEXA_NS::Vertex* v7 = v7InServant->GetImpl(); + + HEXA_NS::Hexa* h = _document_cpp->addHexaVertices( v0, v1, v2, v3, v4, v5, v6, v7 ); + if ( h != NULL ){ + Hexa_impl* servantCorba = new Hexa_impl(h); + result = servantCorba->_this(); + } + } + return result; +} + + + +::CORBA::Long Document_impl::countHexa() throw (SALOME::SALOME_Exception) +{ + return _document_cpp->countHexa(); +} + +Hexa_ptr Document_impl::getHexa(::CORBA::Long i) throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + + HEXA_NS::Hexa* h = _document_cpp->getHexa(i); + if ( h!= NULL ){ + Hexa_impl* servantCorba = new Hexa_impl(h); + result = servantCorba->_this(); + } + return result; +} + + +Hexa_ptr Document_impl::findHexa(Vertex_ptr p0In, Vertex_ptr p1In) throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + + Vertex_impl* v0InServant = ::DownCast( p0In ); + Vertex_impl* v1InServant = ::DownCast( p1In ); + ASSERT( v0InServant ); + ASSERT( v1InServant ); + + if ( v0InServant && v1InServant ) { + HEXA_NS::Vertex* v0 = v0InServant->GetImpl(); + HEXA_NS::Vertex* v1 = v1InServant->GetImpl(); + HEXA_NS::Hexa* h = _document_cpp->findHexa( v0, v1 ); + if ( h != NULL ){ + Hexa_impl* servantCorba = new Hexa_impl(h); + result = servantCorba->_this(); + } + } + return result; +} + +Vector_ptr Document_impl::addVector( ::CORBA::Double dx, ::CORBA::Double dy, ::CORBA::Double dz ) + throw(SALOME::SALOME_Exception) +{ + Vector_ptr result = Vector::_nil(); + HEXA_NS::Vector* v = _document_cpp->addVector( dx, dy, dz ); + + if ( v != NULL ){ + Vector_impl* servantCorba = new Vector_impl(v); + result = servantCorba->_this(); + } + return result; +} + +Vector_ptr Document_impl::addVectorVertices( Vertex_ptr v0In, Vertex_ptr v1In ) + throw(SALOME::SALOME_Exception) +{ + Vector_ptr result = Vector::_nil(); + + Vertex_impl* v0InServant = ::DownCast( v0In ); + Vertex_impl* v1InServant = ::DownCast( v1In ); + ASSERT( v0InServant ); + ASSERT( v1InServant ); + + if ( v0InServant && v1InServant ) { + HEXA_NS::Vertex* v0 = v0InServant->GetImpl(); + HEXA_NS::Vertex* v1 = v1InServant->GetImpl(); + HEXA_NS::Vector* v = _document_cpp->addVectorVertices( v0, v1 ); + if ( v != NULL ){ + Vector_impl* servantCorba = new Vector_impl(v); + result = servantCorba->_this(); + } + } + return result; +} + + +// ::CORBA::Long Document_impl::countVector() throw (SALOME::SALOME_Exception) +// { +// return _document_cpp->countVector(); +// } +// +// Vector_ptr Document_impl::getVector(::CORBA::Long i) throw (SALOME::SALOME_Exception) +// { +// HEXA_NS::Vector* h = _document_cpp->getVector(i); +// Vector_impl* servantCorba = new Vector_impl(h); +// return servantCorba->_this(); +// } + + +Cylinder_ptr Document_impl::addCylinder( Vertex_ptr baseIn, Vector_ptr directionIn, + ::CORBA::Double radius, ::CORBA::Double height) +throw (SALOME::SALOME_Exception) +{ + Cylinder_ptr result = Cylinder::_nil(); + + Vertex_impl* baseServant = ::DownCast( baseIn ); + Vector_impl* directionServant = ::DownCast( directionIn ); + ASSERT( baseServant ); + ASSERT( directionServant ); + + if ( baseServant && directionServant ) { + HEXA_NS::Vertex* base = baseServant->GetImpl(); + HEXA_NS::Vector* direction = directionServant->GetImpl(); + HEXA_NS::Cylinder* c = _document_cpp->addCylinder( base, direction, radius, height ); + if ( c!= NULL ){ + Cylinder_impl* servantCorba = new Cylinder_impl(c); + result = servantCorba->_this(); + } + } + + return result; +} + +// ::CORBA::Long Document_impl::countCylinder() throw (SALOME::SALOME_Exception) +// { +// return _document_cpp->countCylinder(); +// } +// +// +// Cylinder_ptr Document_impl::getCylinder(::CORBA::Long i) throw (SALOME::SALOME_Exception) +// { +// HEXA_NS::Cylinder* c = _document_cpp->getCylinder(i); +// Cylinder_impl* servantCorba = new Cylinder_impl(c); +// return servantCorba->_this(); +// } + + +Pipe_ptr Document_impl::addPipe( Vertex_ptr baseIn, Vector_ptr directionIn, + ::CORBA::Double int_radius, ::CORBA::Double ext_radius, ::CORBA::Double height) +throw (SALOME::SALOME_Exception) +{ + Pipe_ptr result = Pipe::_nil(); + + Vertex_impl* baseServant = ::DownCast( baseIn ); + Vector_impl* directionServant = ::DownCast( directionIn ); + ASSERT( baseServant ); + ASSERT( directionServant ); + + if ( baseServant && directionServant ) { + HEXA_NS::Vertex* base = baseServant->GetImpl(); + HEXA_NS::Vector* direction = directionServant->GetImpl(); + HEXA_NS::Pipe* c = _document_cpp->addPipe( base, direction, int_radius, ext_radius, height ); + if ( c!= NULL ){ + Pipe_impl* servantCorba = new Pipe_impl(c); + result = servantCorba->_this(); + } + } + + return result; +} + + +// ::CORBA::Long Document_impl::countPipe() throw (SALOME::SALOME_Exception) +// { +// return _document_cpp->countPipe(); +// } +// +// Pipe_ptr Document_impl::getPipe(::CORBA::Long i) throw (SALOME::SALOME_Exception) +// { +// HEXA_NS::Pipe* p = _document_cpp->getPipe(i); +// Pipe_impl* servantCorba = new Pipe_impl(p); +// return servantCorba->_this(); +// } + +::CORBA::Boolean Document_impl::removeHexa(Hexa_ptr hIn) throw (SALOME::SALOME_Exception) +{ + Hexa_impl* hServant = ::DownCast( hIn ); + ASSERT( hServant ); + + if ( hServant ) { + HEXA_NS::Hexa* h = hServant->GetImpl(); + int ok = _document_cpp->removeHexa(h); + if ( ok == HOK ) + return true; + else + return false; + } +} + + +::CORBA::Boolean Document_impl::removeConnectedHexa(Hexa_ptr hIn) throw (SALOME::SALOME_Exception) +{ + Hexa_impl* hServant = ::DownCast( hIn ); + ASSERT( hServant ); + + if ( hServant ) { + HEXA_NS::Hexa* h = hServant->GetImpl(); + int ok = _document_cpp->removeConnectedHexa(h); + if ( ok == HOK ) + return true; + else + return false; + } +} + + +Elements_ptr Document_impl::makeCartesian( Vertex_ptr ptIn, + Vector_ptr vxIn, Vector_ptr vyIn, Vector_ptr vzIn, + ::CORBA::Long nx, ::CORBA::Long ny, ::CORBA::Long nz) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Vertex_impl* ptInServant = ::DownCast( ptIn); + Vector_impl* vxInServant = ::DownCast( vxIn ); + Vector_impl* vyInServant = ::DownCast( vyIn ); + Vector_impl* vzInServant = ::DownCast( vzIn ); + ASSERT( ptInServant ); + ASSERT( vxInServant ); + ASSERT( vyInServant ); + ASSERT( vzInServant ); + + if ( ptInServant && vxInServant && vyInServant && vzInServant ){ + HEXA_NS::Vertex* pt = ptInServant->GetImpl(); + HEXA_NS::Vector* vx = vxInServant->GetImpl(); + HEXA_NS::Vector* vy = vyInServant->GetImpl(); + HEXA_NS::Vector* vz = vzInServant->GetImpl(); + + HEXA_NS::Elements* l = _document_cpp->makeCartesian( + pt, + vx, vy, vz, + nx, ny, nz ); + if ( l != NULL ){ + Elements_impl* servantCorba = new Elements_impl(l); + result = servantCorba->_this(); + } + } + return result; + +} + + + +Elements_ptr Document_impl::makeCartesian1( + Vertex_ptr vxIn, + Vector_ptr vr1In, + ::CORBA::Long px, ::CORBA::Long py, ::CORBA::Long pz, + ::CORBA::Long mx, ::CORBA::Long my, ::CORBA::Long mz ) + throw(SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Vertex_impl* vxInServant = ::DownCast( vxIn ); + Vector_impl* vr1InServant = ::DownCast( vr1In ); + ASSERT( vxInServant ); + ASSERT( vr1InServant ); + + if ( vxInServant && vr1InServant ){ + HEXA_NS::Vertex* vx = vxInServant->GetImpl(); + HEXA_NS::Vector* vr1 = vr1InServant->GetImpl(); + + HEXA_NS::Elements* l = _document_cpp->makeCartesian( + vx, + vr1, + px, py, pz, + mx, my, mz ); + + if ( l != NULL ){ + Elements_impl* servantCorba = new Elements_impl(l); + result = servantCorba->_this(); + } + } + return result; +} + + +Elements_ptr Document_impl::makeCylindrical( Vertex_ptr ptIn, + Vector_ptr vexIn, Vector_ptr vezIn, + ::CORBA::Double dr, ::CORBA::Double da, ::CORBA::Double dl, + ::CORBA::Long nr, ::CORBA::Long na, ::CORBA::Long nl, + ::CORBA::Boolean fill) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Vertex_impl* ptServant = ::DownCast( ptIn ); + Vector_impl* vexServant = ::DownCast( vexIn ); + Vector_impl* vezServant = ::DownCast( vezIn ); + ASSERT( ptServant ); + ASSERT( vexServant ); + ASSERT( vezServant ); + + if ( ptServant && vexServant && vezServant) { + HEXA_NS::Vertex* pt = ptServant->GetImpl(); + HEXA_NS::Vector* vex = vexServant->GetImpl(); + HEXA_NS::Vector* vez = vezServant->GetImpl(); + HEXA_NS::Elements* l = _document_cpp->makeCylindrical( pt, + vex, vez, + dr, da, dl, nr, na, nl, fill ); + if ( l != NULL ){ + Elements_impl* servantCorba = new Elements_impl(l); + result = servantCorba->_this(); + } + } + return result; +} + +// =================================================== makeCylindricals +Elements_ptr Document_impl::makeCylindricals (Vertex_ptr ptin, + Vector_ptr vexin, Vector_ptr vezin, + const RealVector& tdr, const RealVector& tda, const RealVector& tdl, + ::CORBA::Boolean fill) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Vertex_impl* ptServant = ::DownCast( ptin ); + Vector_impl* vexServant = ::DownCast( vexin ); + Vector_impl* vezServant = ::DownCast( vezin ); + + ASSERT( ptServant ); + ASSERT( vexServant ); + ASSERT( vezServant ); + + if ( ptServant==NULL || vexServant == NULL || vezServant== NULL ) + return result; + + std::vector cdr, cda, cdl; + for ( int nro = 0; nro < tdr.length(); nro++) + cdr.push_back (tdr[nro]); + + for ( int nro = 0; nro < tda.length(); nro++) + cda.push_back (tda[nro]); + + for ( int nro = 0; nro < tdl.length(); nro++) + cdl.push_back (tdl[nro]); + + HEXA_NS::Vertex* pt = ptServant->GetImpl(); + HEXA_NS::Vector* vex = vexServant->GetImpl(); + HEXA_NS::Vector* vez = vezServant->GetImpl(); + HEXA_NS::Elements* grid = _document_cpp->makeCylindricals ( pt, vex, vez, + cdr, cda, cdl, fill ); + if ( grid != NULL ) + { + Elements_impl* servantCorba = new Elements_impl (grid); + result = servantCorba->_this(); + } + + return result; +} + + + +// Elements_ptr Document_impl::makeSpherical( Vertex_ptr ptIn, +// ::CORBA::Double dx, ::CORBA::Double dy, ::CORBA::Double dz, +// ::CORBA::Long n) +// throw (SALOME::SALOME_Exception) +// { +// Vertex_impl* ptServant = ::DownCast( ptIn ); +// ASSERT( ptServant ); +// +// if ( ptServant ) { +// HEXA_NS::Vertex* pt = ptServant->GetImpl(); +// HEXA_NS::Elements* l = _document_cpp->makeSpherical( pt, dx, dy, dz, n ); +// Elements_impl* servantCorba = new Elements_impl(l); +// return servantCorba->_this(); +// } +// } + +Elements_ptr Document_impl::makeSpherical( + Vertex_ptr ptIn, + ::CORBA::Double rayon, + ::CORBA::Long n, + ::CORBA::Double k ) + throw (SALOME::SALOME_Exception) //CS_TODO +{ + Elements_ptr result = Elements::_nil(); + + Vertex_impl* ptServant = ::DownCast( ptIn ); + ASSERT( ptServant ); + + if ( ptServant ) { + HEXA_NS::Vertex* pt = ptServant->GetImpl(); + HEXA_NS::Elements* l = _document_cpp->makeSpherical( pt, rayon, n, k ); + if ( l != NULL ){ + Elements_impl* servantCorba = new Elements_impl(l); + result = servantCorba->_this(); + } + } + return result; +} + + + + + + +// Elements_ptr Document_impl::makeCylinder(Cylinder_ptr cylIn, ::CORBA::Long nr, ::CORBA::Long na, ::CORBA::Long nl) +Elements_ptr Document_impl::makeCylinder(Cylinder_ptr cylIn, Vector_ptr vrIn, ::CORBA::Long nr, ::CORBA::Long na, ::CORBA::Long nl) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Cylinder_impl* cylServant = ::DownCast( cylIn ); + Vector_impl* vrServant = ::DownCast( vrIn ); + ASSERT( cylServant ); + ASSERT( vrServant ); + + if ( cylServant && vrServant ) { + HEXA_NS::Cylinder* cyl = cylServant->GetImpl(); + HEXA_NS::Vector* vr = vrServant->GetImpl(); + HEXA_NS::Elements* l = _document_cpp->makeCylinder( cyl, vr, nr, na, nl ); + if ( l != NULL ){ + Elements_impl* servantCorba = new Elements_impl(l); + result = servantCorba->_this(); + } + } + return result; +} + +Elements_ptr Document_impl::makePipe( Pipe_ptr pIn, Vector_ptr vrIn, + ::CORBA::Long nr, ::CORBA::Long na, ::CORBA::Long nl) + throw (SALOME::SALOME_Exception) +{ + Pipe_impl* pServant = ::DownCast( pIn ); + Vector_impl* vrServant = ::DownCast( vrIn ); + ASSERT( pServant ); + + if ( pServant ) { + HEXA_NS::Pipe* p = pServant ->GetImpl(); + HEXA_NS::Vector* vr = vrServant->GetImpl(); + HEXA_NS::Elements* l = _document_cpp->makePipe( p, vr, nr, na, nl ); + Elements_impl* servantCorba = new Elements_impl(l); + return servantCorba->_this(); + } +} + + +CrossElements_ptr Document_impl::makeCylinders(Cylinder_ptr c1In, Cylinder_ptr c2In) + throw (SALOME::SALOME_Exception) +{ + CrossElements_ptr result = CrossElements::_nil(); + + Cylinder_impl* c1Servant = ::DownCast( c1In ); + Cylinder_impl* c2Servant = ::DownCast( c2In ); + ASSERT( c1Servant ); + ASSERT( c2Servant ); + + if ( c1Servant && c2Servant ) { + HEXA_NS::Cylinder* c1= c1Servant->GetImpl(); + HEXA_NS::Cylinder* c2= c2Servant->GetImpl(); + + HEXA_NS::CrossElements* l = _document_cpp->makeCylinders(c1,c2); + if (l != NULL ){ + CrossElements_impl* servantCorba = new CrossElements_impl(l); + result = servantCorba->_this(); + } + } + return result; +} + +Elements_ptr Document_impl::makePipes( Pipe_ptr p1In, Pipe_ptr p2In) + throw (SALOME::SALOME_Exception) +{ + Pipe_impl* p1Servant = ::DownCast( p1In ); + Pipe_impl* p2Servant = ::DownCast( p2In ); + ASSERT( p1Servant ); + ASSERT( p2Servant ); + + if ( p1Servant && p2Servant ) { + HEXA_NS::Pipe* p1= p1Servant->GetImpl(); + HEXA_NS::Pipe* p2= p2Servant->GetImpl(); + + HEXA_NS::Elements* l = _document_cpp->makePipes( p1, p2); + Elements_impl* servantCorba = new Elements_impl(l); + return servantCorba->_this(); + } +} + + + +Elements_ptr Document_impl::prismQuad(Quad_ptr qdIn, Vector_ptr vIn, ::CORBA::Long nb) throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Quad_impl* qServant = ::DownCast( qdIn ); + Vector_impl* vServant = ::DownCast( vIn ); + ASSERT( qServant ); + ASSERT( vServant); + + if ( qServant && vServant ) { + HEXA_NS::Quad* qd = qServant->GetImpl(); + HEXA_NS::Vector* v = vServant->GetImpl(); + + HEXA_NS::Elements* l = _document_cpp->prismQuad(qd, v, nb); + if ( l!= NULL ){ + Elements_impl* servantCorba = new Elements_impl(l); + result = servantCorba->_this(); + } + } + + return result; +} + + +//CS_Bruno + +// // loop on meshes +// for ( int i = 0; i < theMeshesArray.length(); i++) { +// SMESH::SMESH_Mesh_var anInitMesh = theMeshesArray[i]; +// if ( !anInitMesh->_is_nil() ) { +// SMESH_Mesh_i* anInitImpl = dynamic_cast( GetServant( anInitMesh ).in() ); +// if ( anInitImpl ) { +// ::SMESH_Mesh& aInitLocMesh = anInitImpl->GetImpl(); + +Elements_ptr Document_impl::prismQuads(const Quads& qdsIn, Vector_ptr vIn, ::CORBA::Long nb) throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + HEXA_NS::Quads qds; + for ( int i = 0; i < qdsIn.length(); i++) { + Quad_impl* qServant = ::DownCast( qdsIn[i] ); + ASSERT( qServant ); + HEXA_NS::Quad* qd = qServant->GetImpl(); + qds.push_back(qd); + } + + Vector_impl* vServant = ::DownCast( vIn ); + ASSERT( vServant); + + if ( vServant ) { + HEXA_NS::Vector* v = vServant->GetImpl(); + HEXA_NS::Elements* l = _document_cpp->prismQuads(qds, v, nb); + if ( l!= NULL ){ + Elements_impl* servantCorba = new Elements_impl(l); + result = servantCorba->_this(); + } + } + + return result; +} + + +Elements_ptr Document_impl::joinQuad(Quad_ptr qaIn, Quad_ptr qbIn, Vertex_ptr va1In, Vertex_ptr vb1In, Vertex_ptr va2In, Vertex_ptr vb2In, ::CORBA::Long nb) throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Quad_impl* qaServant = ::DownCast( qaIn ); + Quad_impl* qbServant = ::DownCast( qbIn ); + + Vertex_impl* va1Servant = ::DownCast( va1In ); + Vertex_impl* vb1Servant = ::DownCast( vb1In ); + Vertex_impl* va2Servant = ::DownCast( va2In ); + Vertex_impl* vb2Servant = ::DownCast( vb2In ); + + ASSERT( qaServant ); + ASSERT( qbServant ); + ASSERT( va1Servant ); + ASSERT( vb1Servant ); + ASSERT( va2Servant ); + ASSERT( vb2Servant ); + + if ( qaServant && qbServant && va1Servant && vb1Servant && va2Servant && vb2Servant ){ + HEXA_NS::Quad* qa = qaServant->GetImpl(); + HEXA_NS::Quad* qb = qbServant->GetImpl(); + HEXA_NS::Vertex* va1 = va1Servant->GetImpl(); + HEXA_NS::Vertex* vb1 = vb1Servant->GetImpl(); + HEXA_NS::Vertex* va2 = va2Servant->GetImpl(); + HEXA_NS::Vertex* vb2 = vb2Servant->GetImpl(); + + HEXA_NS::Elements* l = _document_cpp->joinQuad(qa, qb, va1, vb1, va2, vb2, nb); + if ( l!= NULL ){ + Elements_impl* servantCorba = new Elements_impl(l); + result = servantCorba->_this(); + } + } + + return result; +} + + + +Elements_ptr Document_impl::joinQuads(const Quads& qdsIn, Quad_ptr qbIn, Vertex_ptr va1In, Vertex_ptr vb1In, Vertex_ptr va2In, Vertex_ptr vb2In, ::CORBA::Long nb) throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Quad_impl* qbServant = ::DownCast( qbIn ); + Vertex_impl* va1Servant = ::DownCast( va1In ); + Vertex_impl* vb1Servant = ::DownCast( vb1In ); + Vertex_impl* va2Servant = ::DownCast( va2In ); + Vertex_impl* vb2Servant = ::DownCast( vb2In ); + + ASSERT( qbServant ); + ASSERT( va1Servant ); + ASSERT( vb1Servant ); + ASSERT( va2Servant ); + ASSERT( vb2Servant ); + + if ( qbServant && va1Servant && vb1Servant && va2Servant && vb2Servant ) { + HEXA_NS::Quad* qb = qbServant->GetImpl(); + HEXA_NS::Vertex* va1 = va1Servant->GetImpl(); + HEXA_NS::Vertex* vb1 = vb1Servant->GetImpl(); + HEXA_NS::Vertex* va2 = va2Servant->GetImpl(); + HEXA_NS::Vertex* vb2 = vb2Servant->GetImpl(); + +// MESSAGE("joinQuads AAAAAAAAAAAAA"); + HEXA_NS::Quads qds; + for ( int i = 0; i < qdsIn.length(); i++) { + Quad_impl* qServant = ::DownCast( qdsIn[i] ); + ASSERT( qServant ); + HEXA_NS::Quad* qd = qServant->GetImpl(); + qds.push_back(qd); + } + + HEXA_NS::Elements* l = _document_cpp->joinQuads(qds, qb, va1, vb1, va2, vb2, nb); + if ( l!= NULL ){ + Elements_impl* servantCorba = new Elements_impl(l); + result = servantCorba->_this(); + } + } + + return result; +} + + + + + + +::CORBA::Long Document_impl::mergeQuads(Quad_ptr qaIn, Quad_ptr qbIn, Vertex_ptr va1In, Vertex_ptr vb1In, Vertex_ptr va2In, Vertex_ptr vb2In) throw (SALOME::SALOME_Exception) +{ + Quad_impl* qaServant = ::DownCast( qaIn ); + Quad_impl* qbServant = ::DownCast( qbIn ); + + Vertex_impl* va1Servant = ::DownCast( va1In ); + Vertex_impl* vb1Servant = ::DownCast( vb1In ); + Vertex_impl* va2Servant = ::DownCast( va2In ); + Vertex_impl* vb2Servant = ::DownCast( vb2In ); + + ASSERT( qaServant ); + ASSERT( qbServant ); + // ASSERT( va1Servant ); Controle supprime Abu + // ASSERT( vb1Servant ); + // ASSERT( va2Servant ); + // ASSERT( vb2Servant ); + + if ( qaServant && qbServant) + { + HEXA_NS::Vertex* va1 = NULL; + HEXA_NS::Vertex* vb1 = NULL; + HEXA_NS::Vertex* va2 = NULL; + HEXA_NS::Vertex* vb2 = NULL; + + if (va1Servant && vb1Servant && va2Servant && vb2Servant ) + { + va1 = va1Servant->GetImpl(); + vb1 = vb1Servant->GetImpl(); + va2 = va2Servant->GetImpl(); + vb2 = vb2Servant->GetImpl(); + } + + HEXA_NS::Quad* qa = qaServant->GetImpl(); + HEXA_NS::Quad* qb = qbServant->GetImpl(); + + return _document_cpp->mergeQuads(qa, qb, va1, vb1, va2, vb2); +// HEXA_NS::Elements* l = _document_cpp->mergeQuads(qa, qb, va1, vb1, va2, vb2); +// Elements_impl* servantCorba = new Elements_impl(l); +// return servantCorba->_this(); + } +} + + + +::CORBA::Long Document_impl::mergeEdges(Edge_ptr e1In, Edge_ptr e2In, Vertex_ptr v1In, Vertex_ptr v2In) throw (SALOME::SALOME_Exception) +{ + Edge_impl* e1Servant = ::DownCast( e1In ); + Edge_impl* e2Servant = ::DownCast( e2In ); + + Vertex_impl* v1Servant = ::DownCast( v1In ); + Vertex_impl* v2Servant = ::DownCast( v2In ); + + ASSERT( e1Servant ); + ASSERT( e2Servant ); + ASSERT( v1Servant ); + ASSERT( v2Servant ); + + if ( e1Servant && e2Servant && v1Servant && v2Servant ){ + HEXA_NS::Edge* e1 = e1Servant->GetImpl(); + HEXA_NS::Edge* e2 = e2Servant->GetImpl(); + + HEXA_NS::Vertex* v1 = v1Servant->GetImpl(); + HEXA_NS::Vertex* v2 = v2Servant->GetImpl(); + +// HEXA_NS::Elements* l = _document_cpp->mergeEdges(e1, e2, v1, v2); +// Elements_impl* servantCorba = new Elements_impl(l); +// return servantCorba->_this(); + + return _document_cpp->mergeEdges(e1, e2, v1, v2); + } +} + +::CORBA::Long Document_impl::mergeVertices(Vertex_ptr v1In, Vertex_ptr v2In) throw (SALOME::SALOME_Exception) +{ + Vertex_impl* v1Servant = ::DownCast( v1In ); + Vertex_impl* v2Servant = ::DownCast( v2In ); + + ASSERT( v1Servant ); + ASSERT( v2Servant ); + + if ( v1Servant && v2Servant ){ + HEXA_NS::Vertex* v1 = v1Servant->GetImpl(); + HEXA_NS::Vertex* v2 = v2Servant->GetImpl(); + +// HEXA_NS::Elements* l = _document_cpp->mergeVertices(v1, v2); +// Elements_impl* servantCorba = new Elements_impl(l); +// return servantCorba->_this(); + return _document_cpp->mergeVertices(v1, v2); + } +} + + +Elements_ptr Document_impl::disconnectQuad(Hexa_ptr hexIn, Quad_ptr quadIn) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); +// Quad_ptr result = Quad::_nil(); + Hexa_impl* hServant = ::DownCast( hexIn ); + Quad_impl* qServant = ::DownCast( quadIn ); + + ASSERT( hServant ); + ASSERT( qServant ); + + if ( hServant && qServant ){ + HEXA_NS::Hexa* h = hServant->GetImpl(); + HEXA_NS::Quad* q = qServant->GetImpl(); + + HEXA_NS::Elements* elements = _document_cpp->disconnectQuad(h, q); + if (elements != NULL ){ + Elements_impl* servantCorba = new Elements_impl(elements); + result = servantCorba->_this(); + } + } + return result; +} + +Elements_ptr Document_impl::disconnectEdge(Hexa_ptr hexIn, Edge_ptr edgeIn) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Hexa_impl* hServant = ::DownCast( hexIn ); + Edge_impl* eServant = ::DownCast( edgeIn ); + + ASSERT( hServant ); + ASSERT( eServant ); + + if ( hServant && eServant ){ + HEXA_NS::Hexa* h = hServant->GetImpl(); + HEXA_NS::Edge* e = eServant->GetImpl(); + + HEXA_NS::Elements* r = _document_cpp->disconnectEdge(h, e); + if ( r!= NULL ){ + Elements_impl* servantCorba = new Elements_impl(r); + result = servantCorba->_this(); + } + } + return result; +} + +Elements_ptr Document_impl::disconnectVertex(Hexa_ptr hexIn, Vertex_ptr vxIn) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Hexa_impl* hServant = ::DownCast( hexIn ); + Vertex_impl* vServant = ::DownCast( vxIn ); + + ASSERT( hServant ); + ASSERT( vServant ); + + if ( hServant && vServant ){ + HEXA_NS::Hexa* h = hServant->GetImpl(); + HEXA_NS::Vertex* v = vServant->GetImpl(); + + HEXA_NS::Elements* r = _document_cpp->disconnectVertex(h, v); + if ( r!= NULL ){ + Elements_impl* servantCorba = new Elements_impl(r); + result = servantCorba->_this(); + } + } + + return result; +} +// ====================================================== disconnectEdges +Elements_ptr Document_impl::disconnectEdges (const Hexas& hexas_in, + const Edges& edges_in) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + std::vector tab_hexas; + for (int i = 0; i < hexas_in.length(); i++) + { + Hexa_impl* im_hexa = ::DownCast ( hexas_in[i] ); + ASSERT( im_hexa ); + HEXA_NS::Hexa* un_hexa = im_hexa->GetImpl(); + tab_hexas.push_back (un_hexa); + } + + std::vector tab_edges; + for (int i = 0; i < edges_in.length(); i++) + { + Edge_impl* im_edge = ::DownCast ( edges_in[i] ); + ASSERT( im_edge ); + HEXA_NS::Edge* un_edge = im_edge->GetImpl(); + tab_edges.push_back (un_edge); + } + + HEXA_NS::Elements* r = _document_cpp->disconnectEdges (tab_hexas, tab_edges); + + if ( r!= NULL ) + { + Elements_impl* servantCorba = new Elements_impl (r); + result = servantCorba->_this(); + } + + return result; +} +// ====================================================== cut +Elements_ptr Document_impl::cut(Edge_ptr eIn, ::CORBA::Long nb_of_cuts) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Edge_impl* eServant = ::DownCast( eIn ); + ASSERT( eServant ); + + if ( eServant ){ + HEXA_NS::Edge* e = eServant->GetImpl(); + HEXA_NS::Elements* r = _document_cpp->cut(e, nb_of_cuts); + if ( r!= NULL ){ + Elements_impl* servantCorba = new Elements_impl(r); + result = servantCorba->_this(); + } + } + + return result; +} + + +Elements_ptr Document_impl::makeTranslation(Elements_ptr lIn, Vector_ptr vecIn) throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Elements_impl* lServant = ::DownCast( lIn ); + Vector_impl* vecServant = ::DownCast( vecIn ); + ASSERT( lServant ); + ASSERT( vecServant ); + + if ( lServant && vecServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vector* vec = vecServant->GetImpl(); + + HEXA_NS::Elements* r = _document_cpp->makeTranslation(l, vec); + if ( r != NULL ){ + Elements_impl* servantCorba = new Elements_impl(r); + result = servantCorba->_this(); + } + } + return result; +} + + +Elements_ptr Document_impl::makeRotation(Elements_ptr lIn, Vertex_ptr pIn, Vector_ptr vecIn, ::CORBA::Double angle) throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Elements_impl* lServant = ::DownCast( lIn ); + Vertex_impl* pServant = ::DownCast( pIn ); + Vector_impl* vecServant = ::DownCast( vecIn ); + + ASSERT( lServant ); + ASSERT( pServant ); + ASSERT( vecServant ); + + if ( lServant && pServant && vecServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vertex* p = pServant->GetImpl(); + HEXA_NS::Vector* vec = vecServant->GetImpl(); + + HEXA_NS::Elements* r = _document_cpp->makeRotation(l, p, vec, angle); + if ( r != NULL ){ + Elements_impl* servantCorba = new Elements_impl(r); + result = servantCorba->_this(); + } + } + return result; +} +void Document_impl::performTranslation(Elements_ptr lIn, Vector_ptr vecIn) throw (SALOME::SALOME_Exception) +{ + Elements_impl* lServant = ::DownCast( lIn ); + Vector_impl* vecServant = ::DownCast( vecIn ); + + ASSERT( lServant ); + ASSERT( vecServant ); + + if ( lServant && vecServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vector* vec = vecServant->GetImpl(); + _document_cpp->performTranslation(l, vec); + } +} + + +void Document_impl::performRotation(Elements_ptr lIn, Vertex_ptr pIn, Vector_ptr vecIn, ::CORBA::Double angle) throw (SALOME::SALOME_Exception) +{ + Elements_impl* lServant = ::DownCast( lIn ); + Vertex_impl* pServant = ::DownCast( pIn ); + Vector_impl* vecServant = ::DownCast( vecIn ); + + ASSERT( lServant ); + ASSERT( pServant ); + ASSERT( vecServant ); + + if ( lServant && pServant && vecServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vertex* p = pServant->GetImpl(); + HEXA_NS::Vector* vec = vecServant->GetImpl(); + _document_cpp->performRotation(l, p, vec, angle); + } +} + +Group_ptr Document_impl::addHexaGroup(const char* name) throw (SALOME::SALOME_Exception) +{ + Group_ptr result = Group::_nil(); + HEXA_NS::Group* g = _document_cpp->addGroup( name, HEXA_NS::HexaCell ); + if ( g != NULL ){ + Group_impl* servantCorba = new Group_impl(g); + result = servantCorba->_this(); + } + return result; +} + + +Group_ptr Document_impl::addQuadGroup(const char* name) throw (SALOME::SALOME_Exception) +{ + Group_ptr result = Group::_nil(); + HEXA_NS::Group* g = _document_cpp->addGroup( name, HEXA_NS::QuadCell ); + if ( g != NULL ){ + Group_impl* servantCorba = new Group_impl(g); + result = servantCorba->_this(); + } + return result; +} + +Group_ptr Document_impl::addEdgeGroup(const char* name) throw (SALOME::SALOME_Exception) +{ + Group_ptr result = Group::_nil(); + HEXA_NS::Group* g = _document_cpp->addGroup( name, HEXA_NS::EdgeCell ); + if ( g != NULL ){ + Group_impl* servantCorba = new Group_impl(g); + result = servantCorba->_this(); + } + return result; +} + + +Group_ptr Document_impl::addHexaNodeGroup(const char* name) throw (SALOME::SALOME_Exception) +{ + Group_ptr result = Group::_nil(); + HEXA_NS::Group* g = _document_cpp->addGroup( name, HEXA_NS::HexaNode ); + if ( g != NULL ){ + Group_impl* servantCorba = new Group_impl(g); + result = servantCorba->_this(); + } + return result; +} + +Group_ptr Document_impl::addQuadNodeGroup(const char* name) throw (SALOME::SALOME_Exception) +{ + Group_ptr result = Group::_nil(); + HEXA_NS::Group* g = _document_cpp->addGroup( name, HEXA_NS::QuadNode ); + if ( g != NULL ){ + Group_impl* servantCorba = new Group_impl(g); + result = servantCorba->_this(); + } + return result; +} + + +Group_ptr Document_impl::addEdgeNodeGroup(const char* name) throw (SALOME::SALOME_Exception) +{ + Group_ptr result = Group::_nil(); + HEXA_NS::Group* g = _document_cpp->addGroup( name, HEXA_NS::EdgeNode ); + if ( g != NULL ){ + Group_impl* servantCorba = new Group_impl(g); + result = servantCorba->_this(); + } + return result; +} + + +Group_ptr Document_impl::addVertexNodeGroup(const char* name) throw (SALOME::SALOME_Exception) +{ + Group_ptr result = Group::_nil(); + HEXA_NS::Group* g = _document_cpp->addGroup( name, HEXA_NS::VertexNode ); + if ( g != NULL ){ + Group_impl* servantCorba = new Group_impl(g); + result = servantCorba->_this(); + } + return result; +} + + +::CORBA::Long Document_impl::removeGroup(Group_ptr gIn) throw (SALOME::SALOME_Exception) +{ + Group_impl* gInServant = ::DownCast( gIn ); + ASSERT( gInServant ); + + if ( gInServant ) { + HEXA_NS::Group* g = gInServant->GetImpl(); + int ok = _document_cpp->removeGroup(g); + return ok; + } +} + +::CORBA::Long Document_impl::countGroup() throw (SALOME::SALOME_Exception) +{ + return _document_cpp->countGroup(); +} + + +Group_ptr Document_impl::getGroup(::CORBA::Long i) throw (SALOME::SALOME_Exception) +{ + Group_ptr result = Group::_nil(); + HEXA_NS::Group* g = _document_cpp->getGroup(i); + if ( g != NULL ){ //CS_TODO + Group_impl* servantCorba = new Group_impl(g); + result = servantCorba->_this(); + } + return result; +} + + +Group_ptr Document_impl::findGroup(const char* name) throw (SALOME::SALOME_Exception) +{ + Group_ptr result = Group::_nil(); + HEXA_NS::Group* g = _document_cpp->findGroup(name); + if ( g != NULL ){ //CS_TODO + Group_impl* servantCorba = new Group_impl(g); + result = servantCorba->_this(); + } + return result; +} + + +Law_ptr Document_impl::addLaw(const char* name, ::CORBA::Long nb_nodes) throw (SALOME::SALOME_Exception) +{ + Law_ptr result = Law::_nil(); + + HEXA_NS::Law* l = _document_cpp->addLaw(name, nb_nodes); + if ( l != NULL ){ + Law_impl* servantCorba = new Law_impl(l); + result = servantCorba->_this(); + } + + return result; +} + + +::CORBA::Long Document_impl::countLaw() throw (SALOME::SALOME_Exception) +{ + return _document_cpp->countLaw(); +} + +Law_ptr Document_impl::getLaw(::CORBA::Long i) throw (SALOME::SALOME_Exception) +{ + Law_ptr result = Law::_nil(); + + HEXA_NS::Law* l = _document_cpp->getLaw(i); + if ( l != NULL ){ + Law_impl* servantCorba = new Law_impl(l); + result = servantCorba->_this(); + } + return result; +} + + +void Document_impl::removeLaw(Law_ptr l) throw (SALOME::SALOME_Exception) +{ + Law_impl* lServant = ::DownCast(l); + ASSERT( lServant ); + if ( lServant ) { + HEXA_NS::Law* l = lServant->GetImpl(); + _document_cpp->removeLaw(l); + } +} + + + +Law_ptr Document_impl::findLaw(const char* name) throw (SALOME::SALOME_Exception) +{ + Law_ptr result = Law::_nil(); + + HEXA_NS::Law* l = _document_cpp->findLaw(name); + if ( l != NULL ){ + Law_impl* servantCorba = new Law_impl(l); + result = servantCorba->_this(); + } + + return result; +} + + +::CORBA::Long Document_impl::countPropagation() throw (SALOME::SALOME_Exception) +{ + return _document_cpp->countPropagation(); +} + + +Propagation_ptr Document_impl::getPropagation(::CORBA::Long i) throw (SALOME::SALOME_Exception) +{ + Propagation_ptr result = Propagation::_nil(); + + HEXA_NS::Propagation* p = _document_cpp->getPropagation(i); +// //CS_Test +// +// const HEXA_NS::Edges& edges_cpp = p->getEdges(); +// +// // HEXA_NS::Edges::const_iterator itertest = edges_cpp.begin(); +// // itertest != edges_cpp.end(); +// for ( HEXA_NS::Edges::const_iterator iter = edges_cpp.begin(); +// iter != edges_cpp.end(); +// ++iter ){ +// *iter; +// } +// //CS_Test + + if ( p != NULL ){ + Propagation_impl* servantCorba = new Propagation_impl(p); + result = servantCorba->_this(); + } + return result; +} + +Propagation_ptr Document_impl::findPropagation(Edge_ptr eIn) throw (SALOME::SALOME_Exception) +{ + Propagation_ptr result = Propagation::_nil(); + + Edge_impl* eServant = ::DownCast( eIn ); + ASSERT( eServant ); + + if ( eServant ) { + HEXA_NS::Edge* e= eServant->GetImpl(); + + HEXA_NS::Propagation* p = _document_cpp->findPropagation(e); + if ( p != NULL ){ + Propagation_impl* servantCorba = new Propagation_impl(p); + result = servantCorba->_this(); + } + } + + return result; +} +// ======================================================= associateOpenedLine +::CORBA::Long Document_impl::associateOpenedLine (Edge_ptr mstart, + const Edges& mline, + GEOM::GEOM_Object_ptr gstart, + ::CORBA::Double pstart, + const Shapes& gline, + ::CORBA::Double pend) + throw (SALOME::SALOME_Exception) +{ + Edge_impl* im_start = ::DownCast( mstart ); + + ASSERT ( im_start ); + if (im_start == NULL) + return HERR; + + std::vector md_line; + for (int i = 0; i < mline.length(); i++) + { + Edge_impl* im_edge = ::DownCast ( mline[i] ); + ASSERT( im_edge ); + HEXA_NS::Edge* un_edge = im_edge->GetImpl(); + md_line.push_back (un_edge); + } + + TopoDS_Shape shape = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->geomObjectToShape(gstart); + string b_rep = shape2string( shape ); + HEXA_NS::Shape* gg_start = new HEXA_NS::Shape( b_rep ); + + std::vector gg_line; + for (int i = 0; i < gline.length(); i++) + { + shape = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->geomObjectToShape(gline[i]); + b_rep = shape2string( shape ); + HEXA_NS::Shape* gg_edge = new HEXA_NS::Shape( b_rep ); + gg_line.push_back (gg_edge); + } + + // Call model + + HEXA_NS::Edge* md_start = im_start->GetImpl(); + + ::CORBA::Long ier = _document_cpp->associateOpenedLine (md_start, md_line, + gg_start, pstart, gg_line, pend); + return ier; +} + +// ======================================================= associateClosedLine +::CORBA::Long Document_impl::associateClosedLine (Vertex_ptr mfirst, + Edge_ptr mstart, + const Edges& mline, + GEOM::GEOM_Object_ptr gstart, + ::CORBA::Double pstart, + ::CORBA::Boolean inv, + const Shapes& gline) + throw (SALOME::SALOME_Exception) +{ + std::vector md_line; + for (int i = 0; i < mline.length(); i++) + { + Edge_impl* im_edge = ::DownCast ( mline[i] ); + ASSERT( im_edge ); + HEXA_NS::Edge* un_edge = im_edge->GetImpl(); + md_line.push_back (un_edge); + } + + TopoDS_Shape shape = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->geomObjectToShape(gstart); + string b_rep = shape2string( shape ); + HEXA_NS::Shape* gg_start = new HEXA_NS::Shape( b_rep ); + + std::vector gg_line; + for (int i = 0; i < gline.length(); i++) + { + shape = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->geomObjectToShape(gline[i]); + b_rep = shape2string( shape ); + HEXA_NS::Shape* gg_edge = new HEXA_NS::Shape( b_rep ); + gg_line.push_back (gg_edge); + } + + // Call model + + Edge_impl* im_start = ::DownCast ( mstart ); + Vertex_impl* im_first = ::DownCast( mfirst ); + + HEXA_NS::Vertex* md_first = im_first->GetImpl(); + HEXA_NS::Edge* md_start = im_start->GetImpl(); + + printf (" +++ HexDocument_impl.cxx : Appel de associateClosedLine \n"); + + ::CORBA::Long ier = _document_cpp->associateClosedLine (md_first, md_start, + md_line, gg_start, pstart, inv, gg_line); + HexDisplay (ier); + return ier; +} +// ---------------------------------------------- Ajouts Abu Sept 2011 +// ===================================================== setShape +void Document_impl::setShape (GEOM::GEOM_Object_ptr geom_object) + throw(SALOME::SALOME_Exception) +{ + TopoDS_Shape shape = HEXABLOCK_Gen_i::GetHEXABLOCKGen() + ->geomObjectToShape(geom_object); + CORBA::String_var anIOR = HEXABLOCK_Gen_i::GetORB()->object_to_string( geom_object); + + string strBrep = shape2string( shape ); + std::cout << "setShape ---------> len(strBrep) = " + << strBrep.size() << std::endl; + HEXA_NS::Shape* s = new HEXA_NS::Shape( strBrep ); + + s->ior = anIOR.in(); + s->ident = geom_object->GetStudyEntry(); + + std::cout << " ............ Shape creee" << std::endl; + _document_cpp->setShape (s); + std::cout << " ............ Shape associee" << std::endl; +} +// ===================================================== getShape +GEOM::GEOM_Object_ptr Document_impl::getShape () + throw (SALOME::SALOME_Exception) +{ + HEXA_NS::Shape* s = _document_cpp->getShape (); + CORBA::Object_var corbaObj; + GEOM::GEOM_Object_var geomObj; // = new GEOM::GEOM_Object; + + if (s != NULL) + { + if ( !s->ior.empty() ) + { // geom object from current session + corbaObj = HEXABLOCK_Gen_i::GetORB()->string_to_object( s->ior.c_str() ); + if ( !CORBA::is_nil( corbaObj ) ) + { + geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); + } + } + else // no geom object => we have to built it + { + geomObj = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->brepToGeomObject( s->getBrep() ); + } + } + return geomObj._retn(); +} + + +/* *********************************************************** + GEOM::GEOM_Object_var result; // = new GEOM::GEOM_Object; + + HEXA_NS::Shape* s = _document_cpp->getShape(); + + std::cout << "getShape ->" << s << std::endl; + + if (s != NULL) + { + string strBrep = s->getBrep(); + std::cout << "getShape -->len (getBrep) = " + << strBrep.size() << std::endl; + TopoDS_Shape shape = string2shape( strBrep ); + std::cout << "getShape -->string2shape->" << std::endl; + result = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->shapeToGeomObject(shape); + std::cout << "getShape -->GetHEXABLOCKGen--" << std::endl; + } + + return result._retn(); + **************************************************************** */ +// ===================================================== getBrep +char* Document_impl::getBrep () throw (SALOME::SALOME_Exception) +{ + const char* brep = NULL; + + HEXA_NS::Shape* shape = _document_cpp->getShape(); + if (shape != NULL) + { + string b_rep = shape->getBrep(); + brep = b_rep.c_str(); + // brep = shape->getBrep().c_str(); + } + + if (brep == NULL) + brep = ""; + return CORBA::string_dup (brep); +} +// ===================================================== getName +char* Document_impl::getName () throw (SALOME::SALOME_Exception) +{ + const char* name = _document_cpp->getName(); + return CORBA::string_dup (name); +} +// ===================================================== countUsedVertex +::CORBA::Long Document_impl::countUsedVertex() + throw (SALOME::SALOME_Exception) +{ + return _document_cpp->countUsedVertex(); +} +// ===================================================== getUsedVertex +Vertex_ptr Document_impl::getUsedVertex(::CORBA::Long i) + throw (SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + + HEXA_NS::Vertex* v = _document_cpp->getUsedVertex(i); + if ( v != NULL ) + { + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + return result; +} +// ===================================================== countUsedEdge +::CORBA::Long Document_impl::countUsedEdge() + throw (SALOME::SALOME_Exception) +{ + return _document_cpp->countUsedEdge(); +} +// ===================================================== getUsedEdge +Edge_ptr Document_impl::getUsedEdge(::CORBA::Long i) + throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + + HEXA_NS::Edge* v = _document_cpp->getUsedEdge(i); + if ( v != NULL ) + { + Edge_impl* servantCorba = new Edge_impl(v); + result = servantCorba->_this(); + } + return result; +} +// ===================================================== countUsedQuad +::CORBA::Long Document_impl::countUsedQuad() + throw (SALOME::SALOME_Exception) +{ + return _document_cpp->countUsedQuad(); +} +// ===================================================== getUsedQuad +Quad_ptr Document_impl::getUsedQuad(::CORBA::Long i) + throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + + HEXA_NS::Quad* v = _document_cpp->getUsedQuad(i); + if ( v != NULL ) + { + Quad_impl* servantCorba = new Quad_impl(v); + result = servantCorba->_this(); + } + return result; +} +// ===================================================== countUsedHexa +::CORBA::Long Document_impl::countUsedHexa() + throw (SALOME::SALOME_Exception) +{ + return _document_cpp->countUsedHexa(); +} +// ===================================================== getUsedHexa +Hexa_ptr Document_impl::getUsedHexa(::CORBA::Long i) + throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + + HEXA_NS::Hexa* v = _document_cpp->getUsedHexa(i); + if ( v != NULL ) + { + Hexa_impl* servantCorba = new Hexa_impl(v); + result = servantCorba->_this(); + } + return result; +} +// ===================================================== addHexa5Quads +Hexa_ptr Document_impl::addHexa5Quads (Quad_ptr q1, Quad_ptr q2, Quad_ptr q3, + Quad_ptr q4, Quad_ptr q5) + throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + + Quad_impl* q1InServant = ::DownCast( q1 ); + Quad_impl* q2InServant = ::DownCast( q2 ); + Quad_impl* q3InServant = ::DownCast( q3 ); + Quad_impl* q4InServant = ::DownCast( q4 ); + Quad_impl* q5InServant = ::DownCast( q5 ); + + ASSERT( q1InServant ); + ASSERT( q2InServant ); + ASSERT( q3InServant ); + ASSERT( q4InServant ); + ASSERT( q5InServant ); + + if (q1InServant && q2InServant && q3InServant && q4InServant && q5InServant) + { + HEXA_NS::Quad* q1 = q1InServant->GetImpl(); + HEXA_NS::Quad* q2 = q2InServant->GetImpl(); + HEXA_NS::Quad* q3 = q3InServant->GetImpl(); + HEXA_NS::Quad* q4 = q4InServant->GetImpl(); + HEXA_NS::Quad* q5 = q5InServant->GetImpl(); + HEXA_NS::Hexa* h = _document_cpp->addHexa5Quads (q1, q2, q3, q4, q5); + + if ( h != NULL ) + { + Hexa_impl* servantCorba = new Hexa_impl(h); + result = servantCorba->_this(); + } + } + return result; +} +// ===================================================== addHexa4Quads +Hexa_ptr Document_impl::addHexa4Quads (Quad_ptr q1, Quad_ptr q2, Quad_ptr q3, + Quad_ptr q4) + throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + + Quad_impl* q1InServant = ::DownCast( q1 ); + Quad_impl* q2InServant = ::DownCast( q2 ); + Quad_impl* q3InServant = ::DownCast( q3 ); + Quad_impl* q4InServant = ::DownCast( q4 ); + + ASSERT( q1InServant ); + ASSERT( q2InServant ); + ASSERT( q3InServant ); + ASSERT( q4InServant ); + + if (q1InServant && q2InServant && q3InServant && q4InServant) + { + HEXA_NS::Quad* q1 = q1InServant->GetImpl(); + HEXA_NS::Quad* q2 = q2InServant->GetImpl(); + HEXA_NS::Quad* q3 = q3InServant->GetImpl(); + HEXA_NS::Quad* q4 = q4InServant->GetImpl(); + HEXA_NS::Hexa* h = _document_cpp->addHexa4Quads (q1, q2, q3, q4); + + if ( h != NULL ) + { + Hexa_impl* servantCorba = new Hexa_impl(h); + result = servantCorba->_this(); + } + } + return result; +} +// ===================================================== addHexa3Quads +Hexa_ptr Document_impl::addHexa3Quads (Quad_ptr q1, Quad_ptr q2, Quad_ptr q3) + throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + + Quad_impl* q1InServant = ::DownCast( q1 ); + Quad_impl* q2InServant = ::DownCast( q2 ); + Quad_impl* q3InServant = ::DownCast( q3 ); + + ASSERT( q1InServant ); + ASSERT( q2InServant ); + ASSERT( q3InServant ); + + if (q1InServant && q2InServant && q3InServant) + { + HEXA_NS::Quad* q1 = q1InServant->GetImpl(); + HEXA_NS::Quad* q2 = q2InServant->GetImpl(); + HEXA_NS::Quad* q3 = q3InServant->GetImpl(); + HEXA_NS::Hexa* h = _document_cpp->addHexa3Quads (q1, q2, q3); + + if ( h != NULL ) + { + Hexa_impl* servantCorba = new Hexa_impl(h); + result = servantCorba->_this(); + } + } + + return result; +} +// ===================================================== addHexa2Quads +Hexa_ptr Document_impl::addHexa2Quads (Quad_ptr q1, Quad_ptr q2) + throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + + Quad_impl* q1InServant = ::DownCast( q1 ); + Quad_impl* q2InServant = ::DownCast( q2 ); + + ASSERT( q1InServant ); + ASSERT( q2InServant ); + + if (q1InServant && q2InServant) + { + HEXA_NS::Quad* q1 = q1InServant->GetImpl(); + HEXA_NS::Quad* q2 = q2InServant->GetImpl(); + HEXA_NS::Hexa* h = _document_cpp->addHexa2Quads (q1, q2); + + if ( h != NULL ) + { + Hexa_impl* servantCorba = new Hexa_impl(h); + result = servantCorba->_this(); + } + } + + return result; +} + +// ===================================================== removeQuad +::CORBA::Boolean Document_impl::removeQuad(Quad_ptr quad) + throw (SALOME::SALOME_Exception) +{ + Quad_impl* hServant = ::DownCast( quad ); + ASSERT( hServant ); + + if ( hServant ) { + HEXA_NS::Quad* q = hServant->GetImpl(); + int ok = _document_cpp->removeQuad(q); + if ( ok == HOK ) + return true; + else + return false; + } +} +// ===================================================== removeElements +::CORBA::Boolean Document_impl::removeElements(Elements_ptr bloc) + throw (SALOME::SALOME_Exception) +{ + Elements_impl* hServant = ::DownCast( bloc ); + ASSERT( hServant ); + + if ( hServant ) { + HEXA_NS::Elements* q = hServant->GetImpl(); + int ok = _document_cpp->removeElements(q); + if ( ok == HOK ) + return true; + else + return false; + } +} +// ===================================================== revolutionQuads +Elements_ptr Document_impl::revolutionQuads (const Quads& start, + Vertex_ptr center, Vector_ptr axis, + const RealVector &angles) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Vector_impl* v_axis = ::DownCast (axis); + Vertex_impl* v_center = ::DownCast (center); + + ASSERT (v_axis); + ASSERT (v_center); + + if (v_axis==NULL || v_center==NULL) + return result; + + HEXA_NS::Quads t_start; + for ( int nq = 0; nq < start.length(); nq++) + { + Quad_impl* v_quad = ::DownCast (start[nq]); + ASSERT( v_quad ); + HEXA_NS::Quad* i_quad = v_quad->GetImpl(); + t_start.push_back(i_quad); + } + + std::vector t_angles; + for ( int na = 0; na < angles.length(); na++) + { + CORBA::Double alpha = angles[na]; + t_angles.push_back (alpha); + } + + HEXA_NS::Vector* i_axis = v_axis ->GetImpl(); + HEXA_NS::Vertex* i_center = v_center->GetImpl(); + HEXA_NS::Elements* i_elts = _document_cpp->revolutionQuads (t_start, + i_center, i_axis, t_angles); + if (i_elts != NULL) + { + Elements_impl* servantCorba = new Elements_impl(i_elts); + result = servantCorba->_this(); + } + + return result; +} +// ===================================================== prismQuadsVec +Elements_ptr Document_impl::prismQuadsVec (const Quads& start, Vector_ptr dir, + const RealVector &thaut, ::CORBA::Long opt) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + Vector_impl* v_dir = ::DownCast (dir); + + ASSERT (v_dir); + + if (v_dir==NULL) + return result; + + HEXA_NS::Quads t_start; + for ( int nq = 0; nq < start.length(); nq++) + { + Quad_impl* v_quad = ::DownCast (start[nq]); + ASSERT( v_quad ); + HEXA_NS::Quad* i_quad = v_quad->GetImpl(); + t_start.push_back(i_quad); + } + + std::vector t_haut; + for ( int na = 0; na < thaut.length(); na++) + { + CORBA::Double alpha = thaut[na]; + t_haut.push_back (alpha); + } + + HEXA_NS::Vector* i_dir = v_dir ->GetImpl(); + HEXA_NS::Elements* i_elts = _document_cpp->prismQuadsVec (t_start, + i_dir, t_haut, opt); + if (i_elts != NULL) + { + Elements_impl* servantCorba = new Elements_impl(i_elts); + result = servantCorba->_this(); + } + + return result; +} +// ===================================================== makeSphere + +Elements_ptr Document_impl::replace (const Quads& pattern, + Vertex_ptr p1, Vertex_ptr c1, + Vertex_ptr p2, Vertex_ptr c2, + Vertex_ptr p3, Vertex_ptr c3) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Vertex_impl* v_p1 = ::DownCast (p1); + Vertex_impl* v_p2 = ::DownCast (p2); + Vertex_impl* v_p3 = ::DownCast (p3); + + Vertex_impl* v_c1 = ::DownCast (c1); + Vertex_impl* v_c2 = ::DownCast (c2); + Vertex_impl* v_c3 = ::DownCast (c3); + + ASSERT (v_p1); ASSERT (v_p2); ASSERT (v_p3); + ASSERT (v_c1); ASSERT (v_c2); ASSERT (v_c3); + + if ( v_c1==NULL || v_c2==NULL || v_c3==NULL + || v_p1==NULL || v_p2==NULL || v_p3==NULL) + return result; + + HEXA_NS::Quads t_pattern; + for ( int nq = 0; nq < pattern.length(); nq++) + { + Quad_impl* v_quad = ::DownCast (pattern[nq]); + ASSERT( v_quad ); + HEXA_NS::Quad* i_quad = v_quad->GetImpl(); + t_pattern.push_back(i_quad); + } + + + HEXA_NS::Vertex* i_p1 = v_p1->GetImpl(); + HEXA_NS::Vertex* i_p2 = v_p2->GetImpl(); + HEXA_NS::Vertex* i_p3 = v_p3->GetImpl(); + + HEXA_NS::Vertex* i_c1 = v_c1->GetImpl(); + HEXA_NS::Vertex* i_c2 = v_c2->GetImpl(); + HEXA_NS::Vertex* i_c3 = v_c3->GetImpl(); + + HEXA_NS::Elements* i_elts = _document_cpp->replace (t_pattern, + i_p1, i_c1, i_p2, i_c2, i_p3, i_c3); + if (i_elts != NULL) + { + Elements_impl* servantCorba = new Elements_impl(i_elts); + result = servantCorba->_this(); + } + + return result; +} +// ===================================================== makeSphere +Elements_ptr Document_impl::makeSphere (Vertex_ptr center, Vector_ptr vx, + Vector_ptr vz, ::CORBA::Double radius, + ::CORBA::Double radhole, Vertex_ptr plorig, + ::CORBA::Long nrad, ::CORBA::Long nang, ::CORBA::Long nhaut) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Vertex_impl* v_center = ::DownCast (center); + Vertex_impl* v_orig = ::DownCast (plorig); + Vector_impl* v_x = ::DownCast (vx); + Vector_impl* v_z = ::DownCast (vz); + + ASSERT (v_center); + ASSERT (v_orig); + ASSERT (v_x); + ASSERT (v_z); + + HEXA_NS::Vertex* i_center = v_center->GetImpl(); + HEXA_NS::Vertex* i_orig = v_orig ->GetImpl(); + HEXA_NS::Vector* i_x = v_x ->GetImpl(); + HEXA_NS::Vector* i_z = v_z ->GetImpl(); + + HEXA_NS::Elements* i_elts = _document_cpp->makeSphere (i_center, i_x, i_z, + radius, radhole, i_orig, nrad, nang, nhaut); + + if (i_elts != NULL) + { + Elements_impl* servantCorba = new Elements_impl(i_elts); + result = servantCorba->_this(); + } + + return result; +} +// ===================================================== makePartSphere +Elements_ptr Document_impl::makePartSphere (Vertex_ptr center, Vector_ptr vx, + Vector_ptr vz, ::CORBA::Double radius, + ::CORBA::Double radhole, + Vertex_ptr plorig, ::CORBA::Double angle, + ::CORBA::Long nrad, ::CORBA::Long nang, ::CORBA::Long nhaut) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + + Vertex_impl* v_center = ::DownCast (center); + Vertex_impl* v_orig = ::DownCast (plorig); + Vector_impl* v_x = ::DownCast (vx); + Vector_impl* v_z = ::DownCast (vz); + + ASSERT (v_center); + ASSERT (v_orig); + ASSERT (v_x); + ASSERT (v_z); + + HEXA_NS::Vertex* i_center = v_center->GetImpl(); + HEXA_NS::Vertex* i_orig = v_orig ->GetImpl(); + HEXA_NS::Vector* i_x = v_x ->GetImpl(); + HEXA_NS::Vector* i_z = v_z ->GetImpl(); + + HEXA_NS::Elements* i_elts = _document_cpp->makePartSphere (i_center, i_x, + i_z, radius, radhole, i_orig, angle, nrad, nang, nhaut); + + if (i_elts != NULL) + { + Elements_impl* servantCorba = new Elements_impl(i_elts); + result = servantCorba->_this(); + } + + return result; +} +// ===================================================== makeRind +Elements_ptr Document_impl::makeRind (Vertex_ptr center, Vector_ptr vx, + Vector_ptr vz, + ::CORBA::Double radext, ::CORBA::Double radint, + ::CORBA::Double radhole, Vertex_ptr plorig, + ::CORBA::Long nrad, ::CORBA::Long nang, ::CORBA::Long nhaut) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Vertex_impl* v_center = ::DownCast (center); + Vertex_impl* v_orig = ::DownCast (plorig); + Vector_impl* v_x = ::DownCast (vx); + Vector_impl* v_z = ::DownCast (vz); + + ASSERT (v_center); + ASSERT (v_orig); + ASSERT (v_x); + ASSERT (v_z); + + HEXA_NS::Vertex* i_center = v_center->GetImpl(); + HEXA_NS::Vertex* i_orig = v_orig ->GetImpl(); + HEXA_NS::Vector* i_x = v_x ->GetImpl(); + HEXA_NS::Vector* i_z = v_z ->GetImpl(); + + HEXA_NS::Elements* i_elts = _document_cpp->makeRind (i_center, i_x, i_z, + radext, radint, radhole, i_orig, nrad, nang, nhaut); + + if (i_elts != NULL) + { + Elements_impl* servantCorba = new Elements_impl(i_elts); + result = servantCorba->_this(); + } + + return result; +} +// ===================================================== makePartRind +Elements_ptr Document_impl::makePartRind (Vertex_ptr center, Vector_ptr vx, + Vector_ptr vz, + ::CORBA::Double radext, ::CORBA::Double radint, + ::CORBA::Double radhole, + Vertex_ptr plorig, ::CORBA::Double angle, + ::CORBA::Long nrad, ::CORBA::Long nang, ::CORBA::Long nhaut) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + + Vertex_impl* v_center = ::DownCast (center); + Vertex_impl* v_orig = ::DownCast (plorig); + Vector_impl* v_x = ::DownCast (vx); + Vector_impl* v_z = ::DownCast (vz); + + ASSERT (v_center); + ASSERT (v_orig); + ASSERT (v_x); + ASSERT (v_z); + + HEXA_NS::Vertex* i_center = v_center->GetImpl(); + HEXA_NS::Vertex* i_orig = v_orig ->GetImpl(); + HEXA_NS::Vector* i_x = v_x ->GetImpl(); + HEXA_NS::Vector* i_z = v_z ->GetImpl(); + + HEXA_NS::Elements* i_elts = _document_cpp->makePartRind (i_center, i_x, i_z, + radext, radint, radhole, i_orig, angle, nrad, nang, nhaut); + if (i_elts != NULL) + { + Elements_impl* servantCorba = new Elements_impl(i_elts); + result = servantCorba->_this(); + } + + return result; +} +// ================================================== makeScale +Elements_ptr Document_impl::makeScale (Elements_ptr lIn, Vertex_ptr pIn, + ::CORBA::Double k) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Elements_impl* lServant = ::DownCast ( lIn ); + Vertex_impl* pServant = ::DownCast ( pIn ); + + ASSERT (lServant); + ASSERT (pServant); + + if ( lServant && pServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vertex* p = pServant->GetImpl(); + + HEXA_NS::Elements* r = _document_cpp->makeScale(l, p, k); + if ( r != NULL ){ + Elements_impl* servantCorba = new Elements_impl(r); + result = servantCorba->_this(); + } + } + return result; +} +// ================================================== makeSymmetryLine +Elements_ptr Document_impl::makeSymmetryLine (Elements_ptr lIn, Vertex_ptr pIn, + Vector_ptr vecIn) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Elements_impl* lServant = ::DownCast( lIn ); + Vertex_impl* pServant = ::DownCast( pIn ); + Vector_impl* vecServant = ::DownCast( vecIn ); + + ASSERT( lServant ); + ASSERT( pServant ); + ASSERT( vecServant ); + + if ( lServant && pServant && vecServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vertex* p = pServant->GetImpl(); + HEXA_NS::Vector* vec = vecServant->GetImpl(); + + HEXA_NS::Elements* r = _document_cpp->makeSymmetryLine(l, p, vec); + if ( r != NULL ){ + Elements_impl* servantCorba = new Elements_impl(r); + result = servantCorba->_this(); + } + } + return result; +} +// ================================================== makeSymmetryPlane +Elements_ptr Document_impl::makeSymmetryPlane (Elements_ptr lIn, Vertex_ptr pIn, + Vector_ptr vecIn) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Elements_impl* lServant = ::DownCast( lIn ); + Vertex_impl* pServant = ::DownCast( pIn ); + Vector_impl* vecServant = ::DownCast( vecIn ); + + ASSERT( lServant ); + ASSERT( pServant ); + ASSERT( vecServant ); + + if ( lServant && pServant && vecServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vertex* p = pServant->GetImpl(); + HEXA_NS::Vector* vec = vecServant->GetImpl(); + + HEXA_NS::Elements* r = _document_cpp->makeSymmetryPlane(l, p, vec); + if ( r != NULL ){ + Elements_impl* servantCorba = new Elements_impl(r); + result = servantCorba->_this(); + } + } + return result; +} +// ================================================== makeSymmetryPoint +Elements_ptr Document_impl::makeSymmetryPoint (Elements_ptr lIn, Vertex_ptr pIn) + throw (SALOME::SALOME_Exception) +{ + Elements_ptr result = Elements::_nil(); + + Elements_impl* lServant = ::DownCast( lIn ); + Vertex_impl* pServant = ::DownCast( pIn ); + + ASSERT( lServant ); + ASSERT( pServant ); + + if ( lServant && pServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vertex* p = pServant->GetImpl(); + + HEXA_NS::Elements* r = _document_cpp->makeSymmetryPoint(l, p); + if ( r != NULL ){ + Elements_impl* servantCorba = new Elements_impl(r); + result = servantCorba->_this(); + } + } + return result; +} +// ================================================== performScale +void Document_impl::performScale (Elements_ptr lIn, Vertex_ptr pIn, + ::CORBA::Double k) + throw (SALOME::SALOME_Exception) +{ + Elements_impl* lServant = ::DownCast( lIn ); + Vertex_impl* pServant = ::DownCast( pIn ); + + ASSERT( lServant ); + ASSERT( pServant ); + + if ( lServant && pServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vertex* p = pServant->GetImpl(); + _document_cpp->performScale (l, p, k); + } +} +// ================================================== performSymmetryPlane +void Document_impl::performSymmetryPlane (Elements_ptr lIn, Vertex_ptr pIn, + Vector_ptr vecIn) + throw (SALOME::SALOME_Exception) +{ + Elements_impl* lServant = ::DownCast( lIn ); + Vertex_impl* pServant = ::DownCast( pIn ); + Vector_impl* vecServant = ::DownCast( vecIn ); + + ASSERT( lServant ); + ASSERT( pServant ); + ASSERT( vecServant ); + + if ( lServant && pServant && vecServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vertex* p = pServant->GetImpl(); + HEXA_NS::Vector* vec = vecServant->GetImpl(); + _document_cpp->performSymmetryPlane (l, p, vec); + } +} +// ================================================== performSymmetryLine +void Document_impl::performSymmetryLine (Elements_ptr lIn, Vertex_ptr pIn, + Vector_ptr vecIn) + throw (SALOME::SALOME_Exception) +{ + Elements_impl* lServant = ::DownCast( lIn ); + Vertex_impl* pServant = ::DownCast( pIn ); + Vector_impl* vecServant = ::DownCast( vecIn ); + + ASSERT( lServant ); + ASSERT( pServant ); + ASSERT( vecServant ); + + if ( lServant && pServant && vecServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vertex* p = pServant->GetImpl(); + HEXA_NS::Vector* vec = vecServant->GetImpl(); + _document_cpp->performSymmetryLine (l, p, vec); + } +} +// ================================================== performSymmetryPoint +void Document_impl::performSymmetryPoint (Elements_ptr lIn, Vertex_ptr pIn) + throw (SALOME::SALOME_Exception) +{ + Elements_impl* lServant = ::DownCast( lIn ); + Vertex_impl* pServant = ::DownCast( pIn ); + + ASSERT( lServant ); + ASSERT( pServant ); + + if ( lServant && pServant ){ + HEXA_NS::Elements* l = lServant->GetImpl(); + HEXA_NS::Vertex* p = pServant->GetImpl(); + _document_cpp->performSymmetryPoint (l, p); + } +} +// ================================================== setLevel +void Document_impl::setLevel(::CORBA::Long debug) + throw (SALOME::SALOME_Exception) +{ + _document_cpp->setLevel (debug); +} +// ================================================== clearAssociation +void Document_impl::clearAssociation () + throw (SALOME::SALOME_Exception) +{ + _document_cpp->clearAssociation (); +} diff --git a/src/HEXABLOCK_I/HexDocument_impl.hxx b/src/HEXABLOCK_I/HexDocument_impl.hxx new file mode 100755 index 0000000..9e76f11 --- /dev/null +++ b/src/HEXABLOCK_I/HexDocument_impl.hxx @@ -0,0 +1,279 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HexDocument_impl__ +#define __HexDocument_impl__ + +#include +#include CORBA_SERVER_HEADER(Document) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexDocument.hxx" + + +// #define HEXA_NS Hex +using namespace HEXABLOCK_ORB; + +class Document_impl: + public POA_HEXABLOCK_ORB::Document, + public SALOME::GenericObj_i +{ + +public: +// Document_impl(HEXA_NS::Document *ptrCpp); + Document_impl( PortableServer::POA_ptr thePOA, HEXA_NS::Document *ptrCpp); + + HEXA_NS::Document* GetImpl() throw (SALOME::SALOME_Exception); + + void purge() throw (SALOME::SALOME_Exception); + void dump() throw (SALOME::SALOME_Exception); + + ::CORBA::Long saveVtk (const char* fname) throw (SALOME::SALOME_Exception); + ::CORBA::Long save (const char* fileName) throw (SALOME::SALOME_Exception); + ::CORBA::Long setName (const char* fileName) throw (SALOME::SALOME_Exception); + char* getName () throw (SALOME::SALOME_Exception); + + + void setTolerance(::CORBA::Double tol) throw (SALOME::SALOME_Exception); + ::CORBA::Double getTolerance() throw (SALOME::SALOME_Exception); + Vertex_ptr addVertex(::CORBA::Double x, ::CORBA::Double y, ::CORBA::Double z) throw (SALOME::SALOME_Exception); + ::CORBA::Long countVertex() throw (SALOME::SALOME_Exception); + Vertex_ptr getVertex(::CORBA::Long i) throw (SALOME::SALOME_Exception); + Vertex_ptr findVertex(::CORBA::Double x, ::CORBA::Double y, ::CORBA::Double z) throw (SALOME::SALOME_Exception); + Edge_ptr addEdge(Vertex_ptr v0, Vertex_ptr v1) throw (SALOME::SALOME_Exception); + ::CORBA::Long countEdge() throw (SALOME::SALOME_Exception); + Edge_ptr getEdge(::CORBA::Long i) throw (SALOME::SALOME_Exception); + Edge_ptr findEdge(Vertex_ptr p1, Vertex_ptr p2) throw (SALOME::SALOME_Exception); + Quad_ptr addQuad(Edge_ptr e0, Edge_ptr e1, Edge_ptr e2, Edge_ptr e3) throw (SALOME::SALOME_Exception); + Quad_ptr addQuadVertices(Vertex_ptr v0, Vertex_ptr v1, Vertex_ptr v2, Vertex_ptr v3) throw (SALOME::SALOME_Exception); + ::CORBA::Long countQuad() throw (SALOME::SALOME_Exception); + Quad_ptr getQuad(::CORBA::Long i) throw (SALOME::SALOME_Exception); + Quad_ptr findQuad(Vertex_ptr v1, Vertex_ptr v2) throw (SALOME::SALOME_Exception); + Hexa_ptr addHexa(Quad_ptr q0, Quad_ptr q1, Quad_ptr q2, Quad_ptr q3, Quad_ptr q4, Quad_ptr q5) throw (SALOME::SALOME_Exception); + Hexa_ptr addHexaVertices(Vertex_ptr v0, Vertex_ptr v1, Vertex_ptr v2, Vertex_ptr v3, Vertex_ptr v4, Vertex_ptr v5, Vertex_ptr v6, Vertex_ptr v7) throw (SALOME::SALOME_Exception); + ::CORBA::Long countHexa() throw (SALOME::SALOME_Exception); + Hexa_ptr getHexa(::CORBA::Long i) throw (SALOME::SALOME_Exception); + Hexa_ptr findHexa(Vertex_ptr p1, Vertex_ptr p2) throw (SALOME::SALOME_Exception); + Vector_ptr addVector(::CORBA::Double dx, ::CORBA::Double dy, ::CORBA::Double dz) throw (SALOME::SALOME_Exception); + Vector_ptr addVectorVertices(Vertex_ptr v1, Vertex_ptr v2) throw (SALOME::SALOME_Exception); +// ::CORBA::Long countVector() throw (SALOME::SALOME_Exception); +// Vector_ptr getVector(::CORBA::Long i) throw (SALOME::SALOME_Exception); + Cylinder_ptr addCylinder(Vertex_ptr base, Vector_ptr direction, ::CORBA::Double radius, ::CORBA::Double height) throw (SALOME::SALOME_Exception); +// ::CORBA::Long countCylinder() throw (SALOME::SALOME_Exception); +// Cylinder_ptr getCylinder(::CORBA::Long i) throw (SALOME::SALOME_Exception); + Pipe_ptr addPipe(Vertex_ptr base, Vector_ptr direction, ::CORBA::Double int_radius, ::CORBA::Double ext_radius, ::CORBA::Double height) throw (SALOME::SALOME_Exception); +// ::CORBA::Long countPipe() throw (SALOME::SALOME_Exception); +// Pipe_ptr getPipe(::CORBA::Long i) throw (SALOME::SALOME_Exception); + ::CORBA::Boolean removeHexa(Hexa_ptr h) throw (SALOME::SALOME_Exception); + ::CORBA::Boolean removeConnectedHexa(Hexa_ptr h) throw (SALOME::SALOME_Exception); + Elements_ptr makeCartesian(Vertex_ptr pt, Vector_ptr vx, Vector_ptr vy, Vector_ptr vz, ::CORBA::Long nx, ::CORBA::Long ny, ::CORBA::Long nz) throw (SALOME::SALOME_Exception); + Elements_ptr makeCartesian1(Vertex_ptr v, Vector_ptr v1, ::CORBA::Long px, ::CORBA::Long py, ::CORBA::Long pz, ::CORBA::Long mx, ::CORBA::Long my, ::CORBA::Long mz) throw (SALOME::SALOME_Exception); + + Elements_ptr makeCylindrical(Vertex_ptr pt, Vector_ptr vex, Vector_ptr vez, ::CORBA::Double dr, ::CORBA::Double da, ::CORBA::Double dl, ::CORBA::Long nr, ::CORBA::Long na, ::CORBA::Long nl, ::CORBA::Boolean fill) throw (SALOME::SALOME_Exception); + + Elements_ptr makeCylindricals (Vertex_ptr pt, Vector_ptr vex, Vector_ptr vez, + const RealVector& tdr, const RealVector& tda, const RealVector& tdl, + ::CORBA::Boolean fill) + throw (SALOME::SALOME_Exception); + + Elements_ptr makeSpherical( Vertex_ptr ptIn, + ::CORBA::Double rayon, + ::CORBA::Long n, + ::CORBA::Double k ) throw (SALOME::SALOME_Exception); + + Elements_ptr makeCylinder(Cylinder_ptr cyl, Vector_ptr vr, ::CORBA::Long nr, ::CORBA::Long na, ::CORBA::Long nl) throw (SALOME::SALOME_Exception); + Elements_ptr makePipe(Pipe_ptr p, Vector_ptr vr, ::CORBA::Long nr, + ::CORBA::Long na, ::CORBA::Long nl) + throw (SALOME::SALOME_Exception); + +// Elements_ptr makeCylinders(Cylinder_ptr c1, Cylinder_ptr c2) throw (SALOME::SALOME_Exception); + CrossElements_ptr makeCylinders(Cylinder_ptr cyl1, Cylinder_ptr cyl2) throw (SALOME::SALOME_Exception); + + Elements_ptr makePipes(Pipe_ptr p1, Pipe_ptr p2) throw (SALOME::SALOME_Exception); + + Elements_ptr prismQuad(Quad_ptr qd, Vector_ptr v, ::CORBA::Long nb) + throw (SALOME::SALOME_Exception); + Elements_ptr prismQuads(const Quads& qds, Vector_ptr v, ::CORBA::Long nb) + throw (SALOME::SALOME_Exception); + Elements_ptr prismQuadsVec(const Quads& qds, Vector_ptr v, + const RealVector &thaut, ::CORBA::Long opt) + throw (SALOME::SALOME_Exception); + + Elements_ptr joinQuad(Quad_ptr qa, Quad_ptr qb, Vertex_ptr va1, Vertex_ptr vb1, Vertex_ptr va2, Vertex_ptr vb2, ::CORBA::Long nb) throw (SALOME::SALOME_Exception); + Elements_ptr joinQuads(const Quads& qds, Quad_ptr qb, Vertex_ptr va1, Vertex_ptr vb1, Vertex_ptr va2, Vertex_ptr vb2, ::CORBA::Long nb) throw (SALOME::SALOME_Exception); + + ::CORBA::Long mergeQuads(Quad_ptr qa, Quad_ptr qb, Vertex_ptr va1, Vertex_ptr vb1, Vertex_ptr va2, Vertex_ptr vb2) throw (SALOME::SALOME_Exception); + ::CORBA::Long mergeEdges(Edge_ptr e1, Edge_ptr e2, Vertex_ptr v1, Vertex_ptr v2) throw (SALOME::SALOME_Exception); + ::CORBA::Long mergeVertices(Vertex_ptr v1, Vertex_ptr v2) throw (SALOME::SALOME_Exception); + + Elements_ptr disconnectQuad(Hexa_ptr h, Quad_ptr q) + throw (SALOME::SALOME_Exception); + Elements_ptr disconnectEdge(Hexa_ptr h, Edge_ptr e) + throw (SALOME::SALOME_Exception); + Elements_ptr disconnectVertex(Hexa_ptr h, Vertex_ptr v) + throw (SALOME::SALOME_Exception); + + Elements_ptr disconnectEdges(const Hexas& th, const Edges& e) + throw (SALOME::SALOME_Exception); + + Elements_ptr cut(Edge_ptr e, ::CORBA::Long nb_of_cuts) throw (SALOME::SALOME_Exception); + + Elements_ptr makeTranslation(Elements_ptr e, Vector_ptr vec) throw (SALOME::SALOME_Exception); + +Elements_ptr makeRotation(Elements_ptr l, Vertex_ptr ver, Vector_ptr vec, + ::CORBA::Double angle) + throw (SALOME::SALOME_Exception); + +Elements_ptr makeScale (Elements_ptr e, Vertex_ptr ver, ::CORBA::Double k) + throw (SALOME::SALOME_Exception); +Elements_ptr makeSymmetryPoint (Elements_ptr e, Vertex_ptr ver) + throw (SALOME::SALOME_Exception); +Elements_ptr makeSymmetryLine (Elements_ptr e, Vertex_ptr ver, Vector_ptr vec) + throw (SALOME::SALOME_Exception); +Elements_ptr makeSymmetryPlane (Elements_ptr e, Vertex_ptr ver, Vector_ptr vec) + throw (SALOME::SALOME_Exception); + +// void performTranslation(Element_ptr e, Vector_ptr vec) throw (SALOME::SALOME_Exception); + void performTranslation(Elements_ptr l, Vector_ptr vec) throw (SALOME::SALOME_Exception); + +void performRotation(Elements_ptr l, Vertex_ptr ver, Vector_ptr vec, ::CORBA::Double angle) throw (SALOME::SALOME_Exception); + +void performScale (Elements_ptr e, Vertex_ptr ver, ::CORBA::Double k) + throw (SALOME::SALOME_Exception); +void performSymmetryPoint (Elements_ptr e, Vertex_ptr ver) + throw (SALOME::SALOME_Exception); +void performSymmetryLine (Elements_ptr e, Vertex_ptr ver, Vector_ptr vec) + throw (SALOME::SALOME_Exception); +void performSymmetryPlane (Elements_ptr e, Vertex_ptr ver, Vector_ptr vec) + throw (SALOME::SALOME_Exception); + + Group_ptr addHexaGroup(const char* name) throw (SALOME::SALOME_Exception); + Group_ptr addQuadGroup(const char* name) throw (SALOME::SALOME_Exception); + Group_ptr addEdgeGroup(const char* name) throw (SALOME::SALOME_Exception); + Group_ptr addHexaNodeGroup(const char* name) throw (SALOME::SALOME_Exception); + Group_ptr addQuadNodeGroup(const char* name) throw (SALOME::SALOME_Exception); + Group_ptr addEdgeNodeGroup(const char* name) throw (SALOME::SALOME_Exception); + Group_ptr addVertexNodeGroup(const char* name) throw (SALOME::SALOME_Exception); + ::CORBA::Long removeGroup(Group_ptr g) throw (SALOME::SALOME_Exception); + ::CORBA::Long countGroup() throw (SALOME::SALOME_Exception); + Group_ptr getGroup(::CORBA::Long i) throw (SALOME::SALOME_Exception); + Group_ptr findGroup(const char* name) throw (SALOME::SALOME_Exception); + + Law_ptr addLaw(const char* name, ::CORBA::Long nb_nodes) throw (SALOME::SALOME_Exception); + ::CORBA::Long countLaw() throw (SALOME::SALOME_Exception); + Law_ptr getLaw(::CORBA::Long i) throw (SALOME::SALOME_Exception); + void removeLaw(Law_ptr l) throw (SALOME::SALOME_Exception); + Law_ptr findLaw(const char* name) throw (SALOME::SALOME_Exception); + ::CORBA::Long countPropagation() throw (SALOME::SALOME_Exception); + Propagation_ptr getPropagation(::CORBA::Long i) throw (SALOME::SALOME_Exception); + Propagation_ptr findPropagation(Edge_ptr e) throw (SALOME::SALOME_Exception); + + // Evols 13/12/2010 + + ::CORBA::Long associateOpenedLine (Edge_ptr mstart, + const Edges& mline, + GEOM::GEOM_Object_ptr gstart, + ::CORBA::Double pstart, + const Shapes& gline, + ::CORBA::Double pend) + throw (SALOME::SALOME_Exception); + ::CORBA::Long associateClosedLine (Vertex_ptr mfirst, + Edge_ptr mstart, + const Edges& mline, + GEOM::GEOM_Object_ptr gstart, + ::CORBA::Double pstart, + ::CORBA::Boolean inv, + const Shapes& gline) + throw (SALOME::SALOME_Exception); + +void setShape (GEOM::GEOM_Object_ptr geom_object) + throw (SALOME::SALOME_Exception); +GEOM::GEOM_Object_ptr getShape () + throw (SALOME::SALOME_Exception); +char* getBrep () throw (SALOME::SALOME_Exception); + + // Evols 05/09/2011 + // + ::CORBA::Long countUsedVertex () throw (SALOME::SALOME_Exception); + ::CORBA::Long countUsedEdge () throw (SALOME::SALOME_Exception); + ::CORBA::Long countUsedQuad () throw (SALOME::SALOME_Exception); + ::CORBA::Long countUsedHexa () throw (SALOME::SALOME_Exception); + + Vertex_ptr getUsedVertex (::CORBA::Long i) throw (SALOME::SALOME_Exception); + Edge_ptr getUsedEdge (::CORBA::Long i) throw (SALOME::SALOME_Exception); + Quad_ptr getUsedQuad (::CORBA::Long i) throw (SALOME::SALOME_Exception); + Hexa_ptr getUsedHexa (::CORBA::Long i) throw (SALOME::SALOME_Exception); + + Hexa_ptr addHexa5Quads (Quad_ptr q1, Quad_ptr q2, Quad_ptr q3, Quad_ptr q4, + Quad_ptr q5) + throw (SALOME::SALOME_Exception); + Hexa_ptr addHexa4Quads (Quad_ptr q1, Quad_ptr q2, Quad_ptr q3, Quad_ptr q4) + throw (SALOME::SALOME_Exception); + Hexa_ptr addHexa3Quads (Quad_ptr q1, Quad_ptr q2, Quad_ptr q3) + throw (SALOME::SALOME_Exception); + Hexa_ptr addHexa2Quads (Quad_ptr q1, Quad_ptr q2) + throw (SALOME::SALOME_Exception); + + Elements_ptr revolutionQuads (const Quads& start, Vertex_ptr center, + Vector_ptr axis, const RealVector &angles) + throw (SALOME::SALOME_Exception); + + Elements_ptr replace (const Quads& pattern, Vertex_ptr p1, Vertex_ptr c1, + Vertex_ptr p2, Vertex_ptr c2, Vertex_ptr p3, Vertex_ptr c3) + throw (SALOME::SALOME_Exception); + + Elements_ptr makeSphere (Vertex_ptr center, Vector_ptr vx, Vector_ptr vz, + ::CORBA::Double radius, ::CORBA::Double radhole, + Vertex_ptr plorig, + ::CORBA::Long nrad, ::CORBA::Long nang, ::CORBA::Long nhaut) + throw (SALOME::SALOME_Exception); + + Elements_ptr makePartSphere (Vertex_ptr center, Vector_ptr vx, Vector_ptr vz, + ::CORBA::Double radius, ::CORBA::Double radhole, + Vertex_ptr plorig, ::CORBA::Double angle, + ::CORBA::Long nrad, ::CORBA::Long nang, ::CORBA::Long nhaut) + throw (SALOME::SALOME_Exception); + + Elements_ptr makeRind (Vertex_ptr center, Vector_ptr vx, Vector_ptr vz, + ::CORBA::Double radext, ::CORBA::Double radint, + ::CORBA::Double radhole, Vertex_ptr plorig, + ::CORBA::Long nrad, ::CORBA::Long nang, ::CORBA::Long nhaut) + throw (SALOME::SALOME_Exception); + + Elements_ptr makePartRind (Vertex_ptr center, Vector_ptr vx, Vector_ptr vz, + ::CORBA::Double radext, ::CORBA::Double radint, + ::CORBA::Double radhole, + Vertex_ptr plorig, ::CORBA::Double angle, + ::CORBA::Long nrad, ::CORBA::Long nang, ::CORBA::Long nhaut) + throw (SALOME::SALOME_Exception); +public: + + ::CORBA::Boolean removeQuad (Quad_ptr quad) + throw (SALOME::SALOME_Exception); + ::CORBA::Boolean removeElements (Elements_ptr bloc) + throw (SALOME::SALOME_Exception); + + void setLevel(::CORBA::Long level) throw (SALOME::SALOME_Exception); + void clearAssociation () throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::Document *_document_cpp; +}; +//--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 +#endif diff --git a/src/HEXABLOCK_I/HexEdge_impl.cxx b/src/HEXABLOCK_I/HexEdge_impl.cxx new file mode 100755 index 0000000..83fdc57 --- /dev/null +++ b/src/HEXABLOCK_I/HexEdge_impl.cxx @@ -0,0 +1,212 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "HEXABLOCK.hxx" +#include "utilities.h" + +#include +#include "hexa_base.hxx" + +#include "HexVertex_impl.hxx" +#include "HexEdge_impl.hxx" +#include "HexShape.hxx" + +using namespace HEXABLOCK_ORB; + +Edge_impl::Edge_impl( HEXA_NS::Edge *ptrCpp ): +_edge_cpp(ptrCpp) +{ +} + +HEXA_NS::Edge* Edge_impl::GetImpl() + throw (SALOME::SALOME_Exception) +{ + return _edge_cpp; +} + + +::CORBA::Boolean Edge_impl::getWay() throw (SALOME::SALOME_Exception) +{ +// bool way = _edge_cpp->getWay(); +// if ( way == true ) { +// return CORBA::TRUE; +// else { +// return CORBA::FALSE; +// } + return _edge_cpp->getWay(); +} + + +Vertex_ptr Edge_impl::getVertex(::CORBA::Long n) + throw (SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + + HEXA_NS::Vertex* v = _edge_cpp->getVertex(n); + if ( v!= NULL ){ + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + return result ; +} + + +void Edge_impl::dump() throw (SALOME::SALOME_Exception) +{ + _edge_cpp->dump(); +} + + +void Edge_impl::printName()throw (SALOME::SALOME_Exception) +{ + _edge_cpp->printName(); +} + +char* Edge_impl::getName() throw (SALOME::SALOME_Exception) +{ + return CORBA::string_dup( _edge_cpp->getName() ); +} + +// ========================================================= setName +void Edge_impl::setName(const char* name) + throw (SALOME::SALOME_Exception) +{ + _edge_cpp->setName (name); +} + + + + +void Edge_impl::setScalar( ::CORBA::Double val )throw (SALOME::SALOME_Exception) +{ + _edge_cpp->setScalar(val); +} + + +::CORBA::Long Edge_impl::addAssociation( GEOM::GEOM_Object_ptr geom_object_1D, double debut, double fin ) + throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long ok; + TopoDS_Shape aShape = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->geomObjectToShape( geom_object_1D ); + string strBrep = shape2string( aShape ); + CORBA::String_var anIOR = HEXABLOCK_Gen_i::GetORB()->object_to_string( geom_object_1D ); + HEXA_NS::Shape* s = new HEXA_NS::Shape( strBrep ); + s->ior = anIOR.in(); //geom_object_1D->GetStudyEntry(); GetEntry() + s->ident = geom_object_1D->GetStudyEntry(); + s->debut = debut; + s->fin = fin; + ok = _edge_cpp->addAssociation( s ); + +// Edge_impl::Assoc assoc; +// assoc.geomObj = GEOM::GEOM_Object::_duplicate( geom_object_1D ); +// assoc.debut = debut; +// assoc.fin = fin; +// _associations.push_back(assoc); + + return ok; +} + +void Edge_impl::clearAssociation() + throw (SALOME::SALOME_Exception) +{ + _edge_cpp->clearAssociation (); +} + + + +// EdgeAssociations* Edge_impl::getAssociations() //CS_NOT_SPEC +// throw (SALOME::SALOME_Exception) +// { +// HEXABLOCK_ORB::EdgeAssociations* result = new HEXABLOCK_ORB::EdgeAssociations; +// result->length( _associations.size() ); +// +// HEXABLOCK_ORB::EdgeAssociation assoc; +// CORBA::ULong i = 0; +// for ( std::vector::const_iterator iter = _associations.begin(); +// iter != _associations.end(); +// ++iter){ +// // assoc.geomObj = (*iter).geomObj; +// assoc.geomObj = GEOM::GEOM_Object::_duplicate( (*iter).geomObj ); +// assoc.debut = (*iter).debut; +// assoc.fin = (*iter).fin; +// (*result)[i++] = assoc; +// } +// return result; +// } + + + + +EdgeAssociations* Edge_impl::getAssociations () + throw (SALOME::SALOME_Exception) +{ + HEXABLOCK_ORB::EdgeAssociations* result = new HEXABLOCK_ORB::EdgeAssociations; +// HEXABLOCK_ORB::GEOM_Object_ptr ge; +// GEOM::GEOM_Object_ptr ge; + TopoDS_Shape aShape; + const std::vector shapes = _edge_cpp->getAssociations(); + + result->length( shapes.size() ); + HEXABLOCK_ORB::EdgeAssociation assoc; + CORBA::ULong i = 0; + CORBA::Object_var corbaObj; + GEOM::GEOM_Object_var geomObj; + +// std::cout << "XXXXXXXX shapes "<< shapes.size() << std::endl; + for ( std::vector::const_iterator iter = shapes.begin(); + iter != shapes.end(); + ++iter ){ +// ge = GEOM::GEOM_Object::_duplicate(HEXABLOCK::GetHEXABLOCKGen()->shapeToGeomObject( aShape )); +// ge = HEXABLOCK_ORB::GEOM_Edge::_duplicate(HEXABLOCK::GetHEXABLOCKGen()->shapeToGeomObject( aShape )); +// ge = HEXABLOCK::GetHEXABLOCKGen()->shapeToGeomObject( aShape ); +// ge->debut( (*iter)->debut ); +// ge->fin( (*iter)->fin ); +// assoc.geomObj = GEOM::GEOM_Object::_duplicate( (*iter).geomObj ); +// aShape = string2shape( (*iter)->getBrep()); +// assoc.geomObj = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->shapeToGeomObject( aShape ); + +// if ( !(*iter)->ior.empty() ){ +// corbaObj = HEXABLOCK_Gen_i::GetORB()->string_to_object( (*iter)->ior.c_str() ); +// if ( !CORBA::is_nil( corbaObj ) ){ +// geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); +// assoc.geomObj = geomObj._retn(); +// assoc.debut = (*iter)->debut; +// assoc.fin = (*iter)->fin; +// (*result)[ i++ ] = assoc; +// } +// } + assoc.debut = (*iter)->debut; + assoc.fin = (*iter)->fin; + + if ( !(*iter)->ior.empty() ){ // geom object from current session + corbaObj = HEXABLOCK_Gen_i::GetORB()->string_to_object( (*iter)->ior.c_str() ); + if ( !CORBA::is_nil( corbaObj ) ){ + geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); + assoc.geomObj = geomObj._retn(); + } + } else { // no geom object => we have to built it + assoc.geomObj = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->brepToGeomObject( (*iter)->getBrep() ); + } + + (*result)[ i++ ] = assoc; + } + return result; +} + + diff --git a/src/HEXABLOCK_I/HexEdge_impl.hxx b/src/HEXABLOCK_I/HexEdge_impl.hxx new file mode 100755 index 0000000..7c34a44 --- /dev/null +++ b/src/HEXABLOCK_I/HexEdge_impl.hxx @@ -0,0 +1,66 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HexEdge_impl__ +#define __HexEdge_impl__ + +#include +#include CORBA_SERVER_HEADER(Edge) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexEdge.hxx" + +using namespace HEXABLOCK_ORB; + +class Edge_impl : public POA_HEXABLOCK_ORB::Edge, + public SALOME::GenericObj_i +{ + struct Assoc { + GEOM::GEOM_Object_ptr geomObj; + double debut; + double fin; + }; + +public: + Edge_impl(HEXA_NS::Edge *ptrCpp); + HEXA_NS::Edge* GetImpl() throw (SALOME::SALOME_Exception); + + ::CORBA::Boolean getWay() throw (SALOME::SALOME_Exception); + Vertex_ptr getVertex(::CORBA::Long n) throw (SALOME::SALOME_Exception); +// void setAssociation(GEOM::GEOM_Object_ptr geom_object_1D) throw (SALOME::SALOME_Exception); +// GEOM::GEOM_Object_ptr getAssociation() throw (SALOME::SALOME_Exception); + ::CORBA::Long addAssociation( GEOM::GEOM_Object_ptr geom_object_1D, double debut, double fin ) //CS_NOT_SPEC + throw (SALOME::SALOME_Exception); + void clearAssociation() throw (SALOME::SALOME_Exception); + + EdgeAssociations* getAssociations () //CS_NOT_SPEC + throw (SALOME::SALOME_Exception); + + void setScalar( ::CORBA::Double val )throw (SALOME::SALOME_Exception); + void dump() throw (SALOME::SALOME_Exception); + void printName() throw (SALOME::SALOME_Exception); + char* getName() throw (SALOME::SALOME_Exception); + void setName (const char* name) throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::Edge* _edge_cpp; + std::vector _associations; +}; + +#endif diff --git a/src/HEXABLOCK_I/HexElements_impl.cxx b/src/HEXABLOCK_I/HexElements_impl.cxx new file mode 100755 index 0000000..3058215 --- /dev/null +++ b/src/HEXABLOCK_I/HexElements_impl.cxx @@ -0,0 +1,313 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "HEXABLOCK.hxx" +#include "hexa_base.hxx" +#include "HexElements_impl.hxx" +#include "HexVertex_impl.hxx" +#include "HexEdge_impl.hxx" +#include "HexQuad_impl.hxx" +#include "HexHexa_impl.hxx" + + +Elements_impl::Elements_impl( HEXA_NS::Elements *ptrCpp ):_elements_cpp(ptrCpp) +{ +} + +HEXA_NS::Elements* Elements_impl::GetImpl() +{ + return _elements_cpp; +} + +::CORBA::Long Elements_impl::countVertex() throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long n = _elements_cpp->countVertex(); + return n; +} + +::CORBA::Long Elements_impl::countEdge() throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long n = _elements_cpp->countEdge(); + return n; +} + +::CORBA::Long Elements_impl::countQuad() throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long n = _elements_cpp->countQuad(); + return n; +} + +::CORBA::Long Elements_impl::countHexa() throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long n = _elements_cpp->countHexa(); + return n; +} + +::CORBA::Long Elements_impl::findVertex( Vertex_ptr pIn ) throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long n; + Vertex_impl* pInServant = ::DownCast( pIn ); + ASSERT( pInServant ); + HEXA_NS::Vertex* p = pInServant->GetImpl(); + n = _elements_cpp->findVertex( p ); + return n; +} + + + +Vertex_ptr Elements_impl::getVertex(::CORBA::Long n) throw (SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + + HEXA_NS::Vertex* v = _elements_cpp->getVertex(n); + if ( v != NULL ){ + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + return result; +} + +Edge_ptr Elements_impl::getEdge(::CORBA::Long n) throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + + HEXA_NS::Edge* e = _elements_cpp->getEdge(n); + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + return result; +} + +Quad_ptr Elements_impl::getQuad(::CORBA::Long n) throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + + HEXA_NS::Quad* q = _elements_cpp->getQuad(n); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + return result; +} + +Hexa_ptr Elements_impl::getHexa(::CORBA::Long n) throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + + HEXA_NS::Hexa* h = _elements_cpp->getHexa(n); + if ( h != NULL ){ + Hexa_impl* servantCorba = new Hexa_impl(h); + result = servantCorba->_this(); + } + return result; +} + + +::CORBA::Long Elements_impl::saveVtk( const char* fname ) throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long ret = _elements_cpp->saveVtk( fname ); + return ret; +} + + +void Elements_impl::dump() throw (SALOME::SALOME_Exception) +{ + _elements_cpp->dump(); +} + + +void Elements_impl::printName() throw (SALOME::SALOME_Exception) +{ + _elements_cpp->printName(); +} + +char* Elements_impl::getName() throw (SALOME::SALOME_Exception) +{ + return CORBA::string_dup( _elements_cpp->getName() ); +} + +// ========================================================= setName +void Elements_impl::setName(const char* name) + throw (SALOME::SALOME_Exception) +{ + _elements_cpp->setName (name); +} + + + + +Vertex_ptr Elements_impl::getVertexIJK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + HEXA_NS::Vertex* v = _elements_cpp->getVertexIJK(x, y, z); + if ( v != NULL ){ + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + return result; +} + + +Edge_ptr Elements_impl::getEdgeI(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + HEXA_NS::Edge* e = _elements_cpp->getEdgeI(x, y, z); + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + return result; +} + + +Edge_ptr Elements_impl::getEdgeJ(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + HEXA_NS::Edge* e = _elements_cpp->getEdgeJ(x, y, z); + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + return result; +} + + +Edge_ptr Elements_impl::getEdgeK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + HEXA_NS::Edge* e = _elements_cpp->getEdgeK(x, y, z); + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + return result; +} + +Quad_ptr Elements_impl::getQuadIJ(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + HEXA_NS::Quad* q = _elements_cpp->getQuadIJ(x, y, z); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + return result; +} + + +Quad_ptr Elements_impl::getQuadIK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + HEXA_NS::Quad* q = _elements_cpp->getQuadIK(x, y, z); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + return result; +} + + +Quad_ptr Elements_impl::getQuadJK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) + throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + HEXA_NS::Quad* q = _elements_cpp->getQuadJK(x, y, z); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + return result; +} + + +Hexa_ptr Elements_impl::getHexaIJK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception) +{ + Hexa_ptr result = Hexa::_nil(); + HEXA_NS::Hexa* h = _elements_cpp->getHexaIJK(x, y, z); + if ( h != NULL ){ + Hexa_impl* servantCorba = new Hexa_impl(h); + result = servantCorba->_this(); + } + return result; +} + +// ================================================== clearAssociation +void Elements_impl::clearAssociation () + throw (SALOME::SALOME_Exception) +{ + _elements_cpp->clearAssociation (); +} + +// Quad_ptr Elements_impl::getQuad1(EnumCoord dirIn, ::CORBA::Long nx, ::CORBA::Long ny, ::CORBA::Long nz) +// throw (SALOME::SALOME_Exception) +// { +// Quad_ptr result = Quad::_nil(); +// +// // EnumCoord k; +// // HEXA_NS::EnumCoord k_cpp; +// HEXA_NS::EnumCoord dir_cpp; +// +// switch (dirIn) { +// case DIR_X : dir_cpp = HEXA_NS::dir_x; break; +// case DIR_Y : dir_cpp = HEXA_NS::dir_y; break; +// case DIR_Z : dir_cpp = HEXA_NS::dir_z; break; +// case DIM3: dir_cpp = HEXA_NS::DIM3; break; +// } +// +// HEXA_NS::Quad* q = _elements_cpp->getQuad(dir_cpp, nx, ny, nz); +// if ( q != NULL ){ +// Quad_impl* servantCorba = new Quad_impl(q); +// result = servantCorba->_this(); +// } +// +// return result; +// } +// +// Edge_ptr Elements_impl::getEdge1(EnumCoord dirIn, ::CORBA::Long nx, ::CORBA::Long ny, ::CORBA::Long nz) +// throw (SALOME::SALOME_Exception) +// { +// Edge_ptr result = Edge::_nil(); +// +// // EnumCoord k; +// // HEXA_NS::EnumCoord k_cpp; +// HEXA_NS::EnumCoord dir_cpp; +// +// switch (dirIn) { +// case DIR_X : dir_cpp = HEXA_NS::dir_x; break; +// case DIR_Y : dir_cpp = HEXA_NS::dir_y; break; +// case DIR_Z : dir_cpp = HEXA_NS::dir_z; break; +// case DIM3: dir_cpp = HEXA_NS::DIM3; break; +// } +// +// HEXA_NS::Edge* e = _elements_cpp->getEdge(dir_cpp, nx, ny, nz); +// if ( e != NULL ){ +// Edge_impl* servantCorba = new Edge_impl(e); +// result = servantCorba->_this(); +// } +// +// return result; +// } + diff --git a/src/HEXABLOCK_I/HexElements_impl.hxx b/src/HEXABLOCK_I/HexElements_impl.hxx new file mode 100755 index 0000000..f8443b9 --- /dev/null +++ b/src/HEXABLOCK_I/HexElements_impl.hxx @@ -0,0 +1,84 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HexElements_impl__ +#define __HexElements_impl__ + +#include +#include CORBA_SERVER_HEADER(Elements) +// #include CORBA_SERVER_HEADER(Vertex) +// #include CORBA_SERVER_HEADER(Edge) +// #include CORBA_SERVER_HEADER(Quad) +// #include CORBA_SERVER_HEADER(Hexa) + +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexElements.hxx" + +using namespace HEXABLOCK_ORB; + +class Elements_impl : public POA_HEXABLOCK_ORB::Elements, + public SALOME::GenericObj_i +{ +public: + Elements_impl(HEXA_NS::Elements *ptrCpp); + HEXA_NS::Elements* GetImpl(); + + ::CORBA::Long countVertex() throw (SALOME::SALOME_Exception); + ::CORBA::Long countEdge() throw (SALOME::SALOME_Exception); + ::CORBA::Long countQuad() throw (SALOME::SALOME_Exception); + ::CORBA::Long countHexa() throw (SALOME::SALOME_Exception); + ::CORBA::Long findVertex( Vertex_ptr p ) throw (SALOME::SALOME_Exception); + Vertex_ptr getVertex(::CORBA::Long n) throw (SALOME::SALOME_Exception); + Edge_ptr getEdge(::CORBA::Long n) throw (SALOME::SALOME_Exception); + Quad_ptr getQuad(::CORBA::Long n) throw (SALOME::SALOME_Exception); + Hexa_ptr getHexa(::CORBA::Long n) throw (SALOME::SALOME_Exception); + + Vertex_ptr getVertexIJK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + + Edge_ptr getEdgeI(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + Edge_ptr getEdgeJ(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + Edge_ptr getEdgeK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + + Quad_ptr getQuadIJ(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + Quad_ptr getQuadIK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + Quad_ptr getQuadJK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + + Hexa_ptr getHexaIJK(::CORBA::Long x, ::CORBA::Long y, ::CORBA::Long z) throw (SALOME::SALOME_Exception); + +// Quad_ptr getQuad1(EnumCoord dir, ::CORBA::Long nx, ::CORBA::Long ny, ::CORBA::Long nz) +// throw (SALOME::SALOME_Exception); +// +// Edge_ptr getEdge1(EnumCoord dir, ::CORBA::Long nx, ::CORBA::Long ny, ::CORBA::Long nz) +// throw (SALOME::SALOME_Exception); + + ::CORBA::Long saveVtk(const char* fname) throw (SALOME::SALOME_Exception); + void dump() throw (SALOME::SALOME_Exception); + void printName() throw (SALOME::SALOME_Exception); + char* getName() throw (SALOME::SALOME_Exception); + void setName (const char* name) throw (SALOME::SALOME_Exception); + void clearAssociation () throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::Elements *_elements_cpp; +// void *_elements_cpp; + +}; + +#endif diff --git a/src/HEXABLOCK_I/HexGroup_impl.cxx b/src/HEXABLOCK_I/HexGroup_impl.cxx new file mode 100755 index 0000000..d675f21 --- /dev/null +++ b/src/HEXABLOCK_I/HexGroup_impl.cxx @@ -0,0 +1,161 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "HEXABLOCK.hxx" +#include "utilities.h" + +#include + +#include "hexa_base.hxx" +#include "HexEltBase.hxx" +#include "HexGroup.hxx" + +#include "HexElements_impl.hxx" + +#include "HexVertex_impl.hxx" +#include "HexEdge_impl.hxx" +#include "HexQuad_impl.hxx" +#include "HexHexa_impl.hxx" +#include "HexGroup_impl.hxx" + +Group_impl::Group_impl( HEXA_NS::Group *ptrCpp ):_group_cpp(ptrCpp) +{ +} + +HEXA_NS::Group* Group_impl::GetImpl() throw (SALOME::SALOME_Exception) +{ + return _group_cpp; +} + +char* Group_impl::getName() throw (SALOME::SALOME_Exception) +{ + return CORBA::string_dup (_group_cpp->getName()); +} + +void Group_impl::setName(const char* name) throw (SALOME::SALOME_Exception) +{ + _group_cpp->setName( name ); +} + + +GroupKind Group_impl::getKind() throw (SALOME::SALOME_Exception) +{ + HEXA_NS::EnumGroup k = _group_cpp->getKind(); + + switch (k){ + case HEXA_NS::HexaCell: return HEXA_GROUP; + case HEXA_NS::QuadCell: return QUAD_GROUP; + case HEXA_NS::EdgeCell: return EDGE_GROUP; + case HEXA_NS::HexaNode: return HEXANODE_GROUP; + case HEXA_NS::QuadNode: return QUADNODE_GROUP; + case HEXA_NS::EdgeNode: return EDGENODE_GROUP; + case HEXA_NS::VertexNode: return VERTEXNODE_GROUP; + default : ASSERT(false); + } +} + + +::CORBA::Long Group_impl::addElement(Element_ptr eIn) throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long ok; + Vertex_impl* vInServant = ::DownCast( eIn ); + Edge_impl* eInServant = ::DownCast( eIn ); + Quad_impl* qInServant = ::DownCast( eIn ); + Hexa_impl* hInServant = ::DownCast( eIn ); + + ASSERT( vInServant or eInServant or qInServant or hInServant ); + HEXA_NS::EltBase* e = NULL; + if ( vInServant ) { + e = vInServant->GetImpl(); + } else if ( eInServant ) { + e = eInServant->GetImpl(); + } else if ( qInServant ) { + e = qInServant->GetImpl(); + } else if ( hInServant ) { + e = hInServant->GetImpl(); + } + ok = _group_cpp->addElement(e); + + return ok; +} + + +::CORBA::Long Group_impl::countElement() throw (SALOME::SALOME_Exception) +{ + return _group_cpp->countElement(); +} + + +Element_ptr Group_impl::getElement(::CORBA::Long index) throw (SALOME::SALOME_Exception) +{ + HEXA_NS::EltBase* elt = _group_cpp->getElement(index); + + HEXA_NS::Vertex* v = dynamic_cast(elt); + HEXA_NS::Edge* e = dynamic_cast(elt); + HEXA_NS::Quad* q = dynamic_cast(elt); + HEXA_NS::Hexa* h = dynamic_cast(elt); + + ASSERT( v or e or q or h ); + + if (v){ + Vertex_impl* servantCorba = new Vertex_impl(v); + return servantCorba->_this(); + } else if (e){ + Edge_impl* servantCorba = new Edge_impl(e); + return servantCorba->_this(); + } else if (q){ + Quad_impl* servantCorba = new Quad_impl(q); + return servantCorba->_this(); + } else if (h){ + Hexa_impl* servantCorba = new Hexa_impl(h); + return servantCorba->_this(); + } else { + return Element::_nil(); + } +} + + +::CORBA::Long Group_impl::removeElement(Element_ptr eIn) + throw (SALOME::SALOME_Exception) +{ + Vertex_impl* vInServant = ::DownCast( eIn ); + Edge_impl* eInServant = ::DownCast( eIn ); + Quad_impl* qInServant = ::DownCast( eIn ); + Hexa_impl* hInServant = ::DownCast( eIn ); + + ASSERT( vInServant or eInServant or qInServant or hInServant ); + HEXA_NS::EltBase* elt = NULL; + if (vInServant != NULL) + elt = vInServant->GetImpl(); + else if (eInServant != NULL) + elt = eInServant->GetImpl(); + else if (qInServant != NULL) + elt = qInServant->GetImpl(); + else if (hInServant != NULL) + elt = hInServant->GetImpl(); + + ::CORBA::Long ier = _group_cpp->removeElement (elt); + return ier; +} + +void Group_impl::clearElement() throw (SALOME::SALOME_Exception) +{ + _group_cpp->clearElement(); +} + diff --git a/src/HEXABLOCK_I/HexGroup_impl.hxx b/src/HEXABLOCK_I/HexGroup_impl.hxx new file mode 100755 index 0000000..7800c71 --- /dev/null +++ b/src/HEXABLOCK_I/HexGroup_impl.hxx @@ -0,0 +1,61 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HexGroup_impl__ +#define __HexGroup_impl__ + +#include +#include CORBA_SERVER_HEADER(Group) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexGroup.hxx" + + +using namespace HEXABLOCK_ORB; +class Group_impl : public POA_HEXABLOCK_ORB::Group, + public SALOME::GenericObj_i +{ + public: + Group_impl(HEXA_NS::Group *ptrCpp); + HEXA_NS::Group* GetImpl() throw (SALOME::SALOME_Exception); + + char* getName() throw (SALOME::SALOME_Exception); + void setName(const char* name) throw (SALOME::SALOME_Exception); + GroupKind getKind() throw (SALOME::SALOME_Exception); + ::CORBA::Long addElement(Element_ptr e) throw (SALOME::SALOME_Exception); + ::CORBA::Long countElement() throw (SALOME::SALOME_Exception); + Element_ptr getElement(::CORBA::Long index) throw (SALOME::SALOME_Exception); + ::CORBA::Long removeElement(Element_ptr elt) throw (SALOME::SALOME_Exception); + void clearElement() throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::Group *_group_cpp; +}; + + +// class HexaGroup_impl : public Group_impl {}; +// class QuadGroup_impl : public Group_impl {}; +// class EdgeGroup_impl : public Group_impl {}; +// class HexaNodeGroup_impl : public Group_impl {}; +// class QuadNodeGroup_impl : public Group_impl {}; +// class EdgeNodeGroup_impl : public Group_impl {}; +// class VertexNodeGroup_impl : public Group_impl {}; + + +#endif diff --git a/src/HEXABLOCK_I/HexHexa_impl.cxx b/src/HEXABLOCK_I/HexHexa_impl.cxx new file mode 100755 index 0000000..1b5c79c --- /dev/null +++ b/src/HEXABLOCK_I/HexHexa_impl.cxx @@ -0,0 +1,107 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "HEXABLOCK.hxx" +#include "utilities.h" + +#include + +#include "hexa_base.hxx" +#include "HexHexa_impl.hxx" +#include "HexQuad_impl.hxx" +#include "HexEdge_impl.hxx" +#include "HexVertex_impl.hxx" + +Hexa_impl::Hexa_impl( HEXA_NS::Hexa *ptrCpp ):_hexa_cpp(ptrCpp) +{ +} + +HEXA_NS::Hexa* Hexa_impl::GetImpl() + throw (SALOME::SALOME_Exception) +{ + return _hexa_cpp; +} + +Quad_ptr Hexa_impl::getQuad(::CORBA::Long n) + throw (SALOME::SALOME_Exception) +{ + Quad_ptr result = Quad::_nil(); + + HEXA_NS::Quad* q = _hexa_cpp->getQuad(n); + if ( q != NULL ){ + Quad_impl* servantCorba = new Quad_impl(q); + result = servantCorba->_this(); + } + return result; +} + +Edge_ptr Hexa_impl::getEdge(::CORBA::Long n) + throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + + HEXA_NS::Edge* e = _hexa_cpp->getEdge(n); + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + return result; +} + +Vertex_ptr Hexa_impl::getVertex(::CORBA::Long n) + throw (SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + + HEXA_NS::Vertex* v = _hexa_cpp->getVertex(n); + if ( v != NULL ){ + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + return result; +} + +void Hexa_impl::setScalar( ::CORBA::Double val )throw (SALOME::SALOME_Exception) +{ + _hexa_cpp->setScalar(val); +} + +void Hexa_impl::dump() throw (SALOME::SALOME_Exception) +{ + _hexa_cpp->dump(); +} + + +void Hexa_impl::printName() throw (SALOME::SALOME_Exception) +{ + _hexa_cpp->printName(); +} + + +char* Hexa_impl::getName() throw (SALOME::SALOME_Exception) +{ + return CORBA::string_dup( _hexa_cpp->getName() ); +} + +// ========================================================= setName +void Hexa_impl::setName(const char* name) + throw (SALOME::SALOME_Exception) +{ + _hexa_cpp->setName (name); +} diff --git a/src/HEXABLOCK_I/HexHexa_impl.hxx b/src/HEXABLOCK_I/HexHexa_impl.hxx new file mode 100755 index 0000000..58e5964 --- /dev/null +++ b/src/HEXABLOCK_I/HexHexa_impl.hxx @@ -0,0 +1,52 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HexHexa_impl__ +#define __HexHexa_impl__ + +#include +#include CORBA_SERVER_HEADER(Hexa) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexHexa.hxx" + +using namespace HEXABLOCK_ORB; + +class Hexa_impl : public POA_HEXABLOCK_ORB::Hexa, + public SALOME::GenericObj_i +{ +public: + Hexa_impl(HEXA_NS::Hexa *ptrCpp); + HEXA_NS::Hexa* GetImpl() throw (SALOME::SALOME_Exception); + + Quad_ptr getQuad(::CORBA::Long n) throw (SALOME::SALOME_Exception); + Edge_ptr getEdge(::CORBA::Long n) throw (SALOME::SALOME_Exception); + Vertex_ptr getVertex(::CORBA::Long n) throw (SALOME::SALOME_Exception); + + void setScalar( ::CORBA::Double val ) throw (SALOME::SALOME_Exception); + void dump() throw (SALOME::SALOME_Exception); + void printName() throw (SALOME::SALOME_Exception); + char* getName() throw (SALOME::SALOME_Exception); + void setName (const char* name) throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::Hexa *_hexa_cpp; +}; + +#endif diff --git a/src/HEXABLOCK_I/HexLaw_impl.cxx b/src/HEXABLOCK_I/HexLaw_impl.cxx new file mode 100755 index 0000000..560236e --- /dev/null +++ b/src/HEXABLOCK_I/HexLaw_impl.cxx @@ -0,0 +1,104 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "HEXABLOCK.hxx" +#include "utilities.h" + +#include + +#include "hexa_base.hxx" +#include "HexLaw_impl.hxx" + +Law_impl::Law_impl( HEXA_NS::Law *ptrCpp ):_law_cpp(ptrCpp) +{ +} + +HEXA_NS::Law* Law_impl::GetImpl() +throw (SALOME::SALOME_Exception) +{ + return _law_cpp; +} + +// HEXA_NS::Vertex* v = _hexa_cpp->getVertex(n); +// Vertex_impl* servantCorba = new Vertex_impl(v); +// return servantCorba->_this(); + + +void Law_impl::setName(const char* name) +throw (SALOME::SALOME_Exception) +{ + _law_cpp->setName(name); +} + +char* Law_impl::getName() +throw (SALOME::SALOME_Exception) +{ + return CORBA::string_dup( _law_cpp->getName() ); +} + +void Law_impl::setNodes(::CORBA::Long n) +throw (SALOME::SALOME_Exception) +{ + _law_cpp->setNodes(n); +} + +::CORBA::Long Law_impl::getNodes() +throw (SALOME::SALOME_Exception) +{ + return _law_cpp->getNodes(); +} + +void Law_impl::setKind( HEXABLOCK_ORB::KindLaw kIn ) +throw (SALOME::SALOME_Exception) +{ + HEXA_NS::KindLaw k_impl; + switch (kIn) { + case HEXABLOCK_ORB::UNIFORM : k_impl = HEXA_NS::Uniform; break; + case HEXABLOCK_ORB::ARITHMETIC : k_impl = HEXA_NS::Arithmetic; break; + case HEXABLOCK_ORB::GEOMETRIC : k_impl = HEXA_NS::Geometric; break; + } + _law_cpp->setKind(k_impl); +} + +HEXABLOCK_ORB::KindLaw Law_impl::getKind() +throw (SALOME::SALOME_Exception) +{ + HEXABLOCK_ORB::KindLaw k; + HEXA_NS::KindLaw k_cpp = _law_cpp->getKind(); + switch (k_cpp) { + case HEXA_NS::Uniform : k = HEXABLOCK_ORB::UNIFORM; break; + case HEXA_NS::Arithmetic : k = HEXABLOCK_ORB::ARITHMETIC; break; + case HEXA_NS::Geometric : k = HEXABLOCK_ORB::GEOMETRIC; break; + default : ASSERT( false ); break; + } + return k; +} + + +void Law_impl::setCoefficient(::CORBA::Double c) +throw (SALOME::SALOME_Exception) +{ + _law_cpp->setCoefficient(c); +} + +::CORBA::Double Law_impl::getCoefficient() +throw (SALOME::SALOME_Exception) +{ + return _law_cpp->getCoefficient(); +} diff --git a/src/HEXABLOCK_I/HexLaw_impl.hxx b/src/HEXABLOCK_I/HexLaw_impl.hxx new file mode 100755 index 0000000..88be9ea --- /dev/null +++ b/src/HEXABLOCK_I/HexLaw_impl.hxx @@ -0,0 +1,52 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Law_impl__ +#define __Law_impl__ + +#include +#include CORBA_SERVER_HEADER(Law) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexLaw.hxx" + + +using namespace HEXABLOCK_ORB; + +class Law_impl : public POA_HEXABLOCK_ORB::Law, + public SALOME::GenericObj_i +{ +public: + Law_impl(HEXA_NS::Law *ptrCpp); + HEXA_NS::Law* GetImpl() throw (SALOME::SALOME_Exception); + + void setName(const char* name) throw (SALOME::SALOME_Exception); + char* getName() throw (SALOME::SALOME_Exception); + void setNodes(::CORBA::Long n) throw (SALOME::SALOME_Exception); + ::CORBA::Long getNodes() throw (SALOME::SALOME_Exception); + void setKind(KindLaw k) throw (SALOME::SALOME_Exception); + KindLaw getKind() throw (SALOME::SALOME_Exception); + void setCoefficient(::CORBA::Double c) throw (SALOME::SALOME_Exception); + ::CORBA::Double getCoefficient() throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::Law *_law_cpp; +}; + +#endif diff --git a/src/HEXABLOCK_I/HexPipe_impl.cxx b/src/HEXABLOCK_I/HexPipe_impl.cxx new file mode 100755 index 0000000..14a4041 --- /dev/null +++ b/src/HEXABLOCK_I/HexPipe_impl.cxx @@ -0,0 +1,105 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "HEXABLOCK.hxx" +#include "utilities.h" + +#include + +#include "hexa_base.hxx" +#include "HexVertex_impl.hxx" +#include "HexVector_impl.hxx" +#include "HexPipe_impl.hxx" + +Pipe_impl::Pipe_impl( HEXA_NS::Pipe *ptrCpp ):_pipe_cpp(ptrCpp) +{ +} + +HEXA_NS::Pipe* Pipe_impl::GetImpl() throw (SALOME::SALOME_Exception) +{ + return _pipe_cpp; +} + +Vertex_ptr Pipe_impl::getBase() throw (SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + + HEXA_NS::Vertex* v = _pipe_cpp->getBase(); + if ( v!= NULL ){ + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + return result; +} + +Vector_ptr Pipe_impl::getDirection() throw (SALOME::SALOME_Exception) +{ + Vector_ptr result = Vector::_nil(); + + HEXA_NS::Vector* v = _pipe_cpp->getDirection(); + + if ( v!= NULL ){ + Vector_impl* servantCorba = new Vector_impl(v); + result = servantCorba->_this(); + } + return result; +} + +::CORBA::Double Pipe_impl::getInternal_radius() throw (SALOME::SALOME_Exception) +{ +// ::CORBA::Double d = _pipe_cpp->getInternal_radius(); CS_TODO + ::CORBA::Double d = _pipe_cpp->getInternalRadius(); + return d; +} + +::CORBA::Double Pipe_impl::getRadius() throw (SALOME::SALOME_Exception) +{ + ::CORBA::Double d = _pipe_cpp->getRadius(); + return d; +} + +::CORBA::Double Pipe_impl::getHeight() throw (SALOME::SALOME_Exception) +{ + ::CORBA::Double d = _pipe_cpp->getHeight(); + return d; +} + + +void Pipe_impl::dump() throw (SALOME::SALOME_Exception) +{ + _pipe_cpp->dump(); +} + + +void Pipe_impl::printName() throw (SALOME::SALOME_Exception) +{ + _pipe_cpp->printName(); +} + + +char* Pipe_impl::getName() throw (SALOME::SALOME_Exception) +{ + return CORBA::string_dup( _pipe_cpp->getName() ); +} +// ========================================================= setName +void Pipe_impl::setName(const char* name) + throw (SALOME::SALOME_Exception) +{ + _pipe_cpp->setName (name); +} diff --git a/src/HEXABLOCK_I/HexPipe_impl.hxx b/src/HEXABLOCK_I/HexPipe_impl.hxx new file mode 100755 index 0000000..aff3735 --- /dev/null +++ b/src/HEXABLOCK_I/HexPipe_impl.hxx @@ -0,0 +1,52 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HexPipe_impl__ +#define __HexPipe_impl__ + +#include +#include CORBA_SERVER_HEADER(Pipe) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexPipe.hxx" + +using namespace HEXABLOCK_ORB; + +class Pipe_impl : public POA_HEXABLOCK_ORB::Pipe, + public SALOME::GenericObj_i +{ +public: + Pipe_impl(HEXA_NS::Pipe *ptrCpp); + HEXA_NS::Pipe* GetImpl() throw (SALOME::SALOME_Exception); + + Vertex_ptr getBase() throw (SALOME::SALOME_Exception); + Vector_ptr getDirection() throw (SALOME::SALOME_Exception); + ::CORBA::Double getInternal_radius() throw (SALOME::SALOME_Exception); + ::CORBA::Double getRadius() throw (SALOME::SALOME_Exception); + ::CORBA::Double getHeight() throw (SALOME::SALOME_Exception); + void dump() throw (SALOME::SALOME_Exception); + void printName() throw (SALOME::SALOME_Exception); + char* getName() throw (SALOME::SALOME_Exception); + void setName (const char* name) throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::Pipe *_pipe_cpp; +}; + +#endif diff --git a/src/HEXABLOCK_I/HexPropagation_impl.cxx b/src/HEXABLOCK_I/HexPropagation_impl.cxx new file mode 100755 index 0000000..49af3b5 --- /dev/null +++ b/src/HEXABLOCK_I/HexPropagation_impl.cxx @@ -0,0 +1,131 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "HEXABLOCK.hxx" +#include "utilities.h" + +#include + + +#include "hexa_base.hxx" +#include "HexPropagation_impl.hxx" +#include "HexEdge_impl.hxx" +#include "HexLaw_impl.hxx" + +Propagation_impl::Propagation_impl( HEXA_NS::Propagation *ptrCpp ):_propagation_cpp(ptrCpp) +{ +} + + + +HEXA_NS::Propagation* Propagation_impl::GetImpl() throw (SALOME::SALOME_Exception) +{ + return _propagation_cpp; +} + + +HEXABLOCK_ORB::Edges* Propagation_impl::getEdges() throw (SALOME::SALOME_Exception) +{ + HEXABLOCK_ORB::Edges* result = new HEXABLOCK_ORB::Edges; + + const HEXA_NS::Edges& edges_cpp = _propagation_cpp->getEdges(); +// HEXA_NS::Edges edges_cpp = _propagation_cpp->getEdges(); + std::cout<<"XX edges_cpp.size() ->"<length( edges_cpp.size() ); +// HEXA_NS::Edges::const_iterator itertest = edges_cpp.begin(); +// itertest != edges_cpp.end(); + for ( HEXA_NS::Edges::const_iterator iter = edges_cpp.begin(); + iter != edges_cpp.end(); + ++iter){ +// printf (" ("); +// (*iter)->getVertex (0)->printName (", "); +// (*iter)->getVertex (1)->printName (")\n"); + Edge_impl *servantEdge = new Edge_impl( *iter ); + (*result)[ i++ ] = servantEdge->_this(); + + } + return result; +} + + +// HEXABLOCK_ORB::Ways* Propagation_impl::getWays() throw (SALOME::SALOME_Exception) +// { +// HEXABLOCK_ORB::Ways* result = new HEXABLOCK_ORB::Ways; +// const vector& ways_cpp = _propagation_cpp->getWays(); +// +// CORBA::ULong i = 0; +// result->length( ways_cpp.size() ); +// for ( vector::const_iterator iter = ways_cpp.begin(); +// iter != ways_cpp.end(); ++iter ){ +// (*result)[ i++ ] = *iter; +// // if (*iter == true ) { +// // (*result)[ i++ ] = ::CORBA::TRUE; +// // } else { +// // (*result)[ i++ ] = ::CORBA::FALSE; +// // } +// } +// return result; +// +// } + +void Propagation_impl::setLaw(HEXABLOCK_ORB::Law_ptr lawIn) throw (SALOME::SALOME_Exception) +{ + Law_impl* lawInServant = ::DownCast( lawIn ); + ASSERT( lawInServant ); + + if ( lawInServant ){ + HEXA_NS::Law* law = lawInServant->GetImpl(); + _propagation_cpp->setLaw(law); + } +} + +HEXABLOCK_ORB::Law_ptr Propagation_impl::getLaw() throw (SALOME::SALOME_Exception) +{ + Law_ptr result = Law::_nil(); + HEXA_NS::Law* l = _propagation_cpp->getLaw(); + + if ( l != NULL ){ + Law_impl* servantCorba = new Law_impl(l); + result = servantCorba->_this(); + } + return result; +} + + + +void Propagation_impl::setWay(::CORBA::Boolean w) throw (SALOME::SALOME_Exception) +{ + _propagation_cpp->setWay(w); +} + + + +::CORBA::Boolean Propagation_impl::getWay() throw (SALOME::SALOME_Exception) +{ +// bool way = _propagation_cpp->getWay(); +// if ( way == true ) { +// return CORBA::TRUE; +// else { +// return CORBA::FALSE; +// } + return _propagation_cpp->getWay(); +} + diff --git a/src/HEXABLOCK_I/HexPropagation_impl.hxx b/src/HEXABLOCK_I/HexPropagation_impl.hxx new file mode 100755 index 0000000..3b5abfc --- /dev/null +++ b/src/HEXABLOCK_I/HexPropagation_impl.hxx @@ -0,0 +1,51 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __Propagation_impl__ +#define __Propagation_impl__ + +#include +#include CORBA_SERVER_HEADER(Propagation) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexPropagation.hxx" + +using namespace HEXABLOCK_ORB; + +class Propagation_impl : public POA_HEXABLOCK_ORB::Propagation, + public SALOME::GenericObj_i +{ +public: + Propagation_impl(HEXA_NS::Propagation *ptrCpp); + HEXA_NS::Propagation* GetImpl() throw (SALOME::SALOME_Exception); + + Edges* getEdges() throw (SALOME::SALOME_Exception); +// Ways* getWays() throw (SALOME::SALOME_Exception); + + void setLaw(Law_ptr l) throw (SALOME::SALOME_Exception); + Law_ptr getLaw() throw (SALOME::SALOME_Exception); + void setWay(::CORBA::Boolean w) throw (SALOME::SALOME_Exception); + ::CORBA::Boolean getWay() throw (SALOME::SALOME_Exception); + + +private: + HEXA_NS::Propagation *_propagation_cpp; +}; + +#endif diff --git a/src/HEXABLOCK_I/HexQuad_impl.cxx b/src/HEXABLOCK_I/HexQuad_impl.cxx new file mode 100755 index 0000000..7ba12d2 --- /dev/null +++ b/src/HEXABLOCK_I/HexQuad_impl.cxx @@ -0,0 +1,184 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "HEXABLOCK.hxx" +#include "utilities.h" + +#include + +#include "hexa_base.hxx" +#include "HexQuad_impl.hxx" +#include "HexVertex_impl.hxx" +#include "HexEdge_impl.hxx" +#include "HexShape.hxx" + +Quad_impl::Quad_impl( HEXA_NS::Quad *ptrCpp ):_quad_cpp(ptrCpp) +{ +} + +HEXA_NS::Quad* Quad_impl::GetImpl() + throw (SALOME::SALOME_Exception) +{ + return _quad_cpp; +} + +Edge_ptr Quad_impl::getEdge(::CORBA::Long n) + throw (SALOME::SALOME_Exception) +{ + Edge_ptr result = Edge::_nil(); + + HEXA_NS::Edge* e = _quad_cpp->getEdge( n ); + if ( e != NULL ){ + Edge_impl* servantCorba = new Edge_impl(e); + result = servantCorba->_this(); + } + return result; +} + + +Vertex_ptr Quad_impl::getVertex(::CORBA::Long n) + throw (SALOME::SALOME_Exception) +{ + Vertex_ptr result = Vertex::_nil(); + + HEXA_NS::Vertex* v = _quad_cpp->getVertex( n ); + if ( v != NULL ){ + Vertex_impl* servantCorba = new Vertex_impl(v); + result = servantCorba->_this(); + } + return result; +} + + + + +::CORBA::Long Quad_impl::addAssociation( GEOM::GEOM_Object_ptr geom_object_2D) + throw (SALOME::SALOME_Exception) +{ + ::CORBA::Long ok; + + TopoDS_Shape aShape = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->geomObjectToShape( geom_object_2D ); + string strBrep = shape2string( aShape ); + + CORBA::String_var anIOR = HEXABLOCK_Gen_i::GetORB()->object_to_string( geom_object_2D ); + HEXA_NS::Shape* s = new HEXA_NS::Shape( strBrep ); + s->ior = anIOR.in(); + s->ident = geom_object_2D->GetStudyEntry(); + + ok = _quad_cpp->addAssociation( s ); +// _associations.push_back(GEOM::GEOM_Object::_duplicate( geom_object_2D )); + return ok; +} + +void Quad_impl::clearAssociation() + throw (SALOME::SALOME_Exception) +{ + _quad_cpp->clearAssociation (); +} + + + +GEOM::ListOfGO* Quad_impl::getAssociations() //CS_NOT_SPEC + throw (SALOME::SALOME_Exception) +// { +// GEOM::ListOfGO* result = new GEOM::ListOfGO; +// result->length( _associations.size() ); +// +// CORBA::ULong i = 0; +// for ( std::vector::const_iterator iter = _associations.begin(); +// iter != _associations.end(); +// ++iter){ +// // (*result)[i++] = *iter; +// (*result)[i++] = GEOM::GEOM_Object::_duplicate( *iter ); +// } +// return result; +// } +{ + TopoDS_Shape aShape; + const std::vector shapes = _quad_cpp->getAssociations(); + + GEOM::ListOfGO* result = new GEOM::ListOfGO; + result->length( shapes.size() ); + + CORBA::Object_var corbaObj; + GEOM::GEOM_Object_var geomObj; + HEXABLOCK_ORB::EdgeAssociation assoc; + CORBA::ULong i = 0; + for ( std::vector::const_iterator iter = shapes.begin(); + iter != shapes.end(); + ++iter ){ + if ( !(*iter)->ior.empty() ){ // geom object from current session + corbaObj = HEXABLOCK_Gen_i::GetORB()->string_to_object( (*iter)->ior.c_str() ); + if ( !CORBA::is_nil( corbaObj ) ){ + geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); + } + } else { // no geom object => we have to built it + geomObj = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->brepToGeomObject( (*iter)->getBrep() ); + } + (*result)[ i++ ] = geomObj._retn(); + } + + return result; +} + + + + + + + + +// void Quad_impl::setAssociation(GEOM::GEOM_Object_ptr geom_object_2D) throw (SALOME::SALOME_Exception) +// { +// } +// +// GEOM::GEOM_Object_ptr Quad_impl::getAssociation() throw (SALOME::SALOME_Exception) +// { +// } +// +// void Quad_impl::removeAssociation() throw (SALOME::SALOME_Exception) +// { +// } + +void Quad_impl::setScalar( ::CORBA::Double val )throw (SALOME::SALOME_Exception) +{ + _quad_cpp->setScalar(val); +} + +void Quad_impl::dump() throw (SALOME::SALOME_Exception) +{ + _quad_cpp->dump(); +} + + +void Quad_impl::printName() throw (SALOME::SALOME_Exception) +{ + _quad_cpp->printName(); +} + +char* Quad_impl::getName() throw (SALOME::SALOME_Exception) +{ + return CORBA::string_dup( _quad_cpp->getName() ); +} +// ========================================================= setName +void Quad_impl::setName(const char* name) + throw (SALOME::SALOME_Exception) +{ + _quad_cpp->setName (name); +} diff --git a/src/HEXABLOCK_I/HexQuad_impl.hxx b/src/HEXABLOCK_I/HexQuad_impl.hxx new file mode 100755 index 0000000..c481293 --- /dev/null +++ b/src/HEXABLOCK_I/HexQuad_impl.hxx @@ -0,0 +1,62 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HexQuad_impl__ +#define __HexQuad_impl__ + +#include +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include CORBA_SERVER_HEADER(Quad) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexQuad.hxx" + +using namespace HEXABLOCK_ORB; + +class Quad_impl : public POA_HEXABLOCK_ORB::Quad, + public SALOME::GenericObj_i +{ +public: + Quad_impl(HEXA_NS::Quad *ptrCpp); + HEXA_NS::Quad* GetImpl() throw (SALOME::SALOME_Exception); + + Edge_ptr getEdge(::CORBA::Long n) throw (SALOME::SALOME_Exception); + Vertex_ptr getVertex(::CORBA::Long n) throw (SALOME::SALOME_Exception); +// void setAssociation(GEOM::GEOM_Object_ptr geom_object_2D) throw (SALOME::SALOME_Exception); +// GEOM::GEOM_Object_ptr getAssociation() throw (SALOME::SALOME_Exception); + ::CORBA::Long addAssociation ( GEOM::GEOM_Object_ptr geom_object_2D) //CS_NOT_SPEC + throw (SALOME::SALOME_Exception); + GEOM::ListOfGO* getAssociations () //CS_NOT_SPEC + throw (SALOME::SALOME_Exception); + + + void clearAssociation() throw (SALOME::SALOME_Exception); + + void setScalar( ::CORBA::Double val )throw (SALOME::SALOME_Exception); + void dump() throw (SALOME::SALOME_Exception); + void printName() throw (SALOME::SALOME_Exception); + char* getName() throw (SALOME::SALOME_Exception); + void setName (const char* name) throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::Quad *_quad_cpp; +// std::vector _associations; +}; + +#endif diff --git a/src/HEXABLOCK_I/HexVector_impl.cxx b/src/HEXABLOCK_I/HexVector_impl.cxx new file mode 100755 index 0000000..f331a5d --- /dev/null +++ b/src/HEXABLOCK_I/HexVector_impl.cxx @@ -0,0 +1,89 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "HEXABLOCK.hxx" +#include "utilities.h" + +#include + +#include "hexa_base.hxx" +#include "HexVector_impl.hxx" + +using namespace HEXABLOCK_ORB; + +Vector_impl::Vector_impl( HEXA_NS::Vector *ptrCpp ):_vector_cpp(ptrCpp) +{ +} + +HEXA_NS::Vector* Vector_impl::GetImpl() throw (SALOME::SALOME_Exception) +{ + return _vector_cpp; +} + +::CORBA::Double Vector_impl::getDX() throw (SALOME::SALOME_Exception) +{ + ::CORBA::Double dx = _vector_cpp->getDx(); + return dx; +} +::CORBA::Double Vector_impl::getDY() throw (SALOME::SALOME_Exception) +{ + ::CORBA::Double dy = _vector_cpp->getDy(); + return dy; +} +::CORBA::Double Vector_impl::getDZ() throw (SALOME::SALOME_Exception) +{ + ::CORBA::Double dz = _vector_cpp->getDz(); + return dz; +} + + +void Vector_impl::dump() throw (SALOME::SALOME_Exception) +{ + _vector_cpp->dump(); +} + + +void Vector_impl::printName() throw (SALOME::SALOME_Exception) +{ + _vector_cpp->printName(); +} + +// ========================================================= getName +char* Vector_impl::getName() throw (SALOME::SALOME_Exception) +{ + return CORBA::string_dup( _vector_cpp->getName() ); +} +// ========================================================= setName +void Vector_impl::setName(const char* name) + throw (SALOME::SALOME_Exception) +{ + _vector_cpp->setName (name); +} +// ========================================================= getNorm +::CORBA::Double Vector_impl::getNorm() throw (SALOME::SALOME_Exception) +{ + ::CORBA::Double val = _vector_cpp->getNorm(); + return val; +} +// ========================================================= getAngleX +::CORBA::Double Vector_impl::getAngleX() throw (SALOME::SALOME_Exception) +{ + ::CORBA::Double val = _vector_cpp->getAngleX(); + return val; +} diff --git a/src/HEXABLOCK_I/HexVector_impl.hxx b/src/HEXABLOCK_I/HexVector_impl.hxx new file mode 100755 index 0000000..56eae41 --- /dev/null +++ b/src/HEXABLOCK_I/HexVector_impl.hxx @@ -0,0 +1,54 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HexVector_impl__ +#define __HexVector_impl__ + +#include +#include CORBA_SERVER_HEADER(Vector) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" +#include "HexVector.hxx" + +using namespace HEXABLOCK_ORB; + +class Vector_impl : public POA_HEXABLOCK_ORB::Vector, + public SALOME::GenericObj_i +{ +public: + Vector_impl(HEXA_NS::Vector *ptrCpp); + HEXA_NS::Vector* GetImpl() throw (SALOME::SALOME_Exception); + + ::CORBA::Double getDX() throw(SALOME::SALOME_Exception); + ::CORBA::Double getDY() throw(SALOME::SALOME_Exception); + ::CORBA::Double getDZ() throw(SALOME::SALOME_Exception); + void dump() throw (SALOME::SALOME_Exception); + void printName() throw (SALOME::SALOME_Exception); + char* getName() throw (SALOME::SALOME_Exception); + void setName (const char* name) throw (SALOME::SALOME_Exception); + + ::CORBA::Double getNorm () throw (SALOME::SALOME_Exception); + ::CORBA::Double getAngleX () throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::Vector *_vector_cpp; + +}; + +#endif diff --git a/src/HEXABLOCK_I/HexVertex_impl.cxx b/src/HEXABLOCK_I/HexVertex_impl.cxx new file mode 100755 index 0000000..94c5780 --- /dev/null +++ b/src/HEXABLOCK_I/HexVertex_impl.cxx @@ -0,0 +1,145 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +using namespace std; +#include "HEXABLOCK.hxx" +#include "utilities.h" + +#include + +#include "hexa_base.hxx" +#include "HexVertex_impl.hxx" +#include "HexShape.hxx" + +Vertex_impl::Vertex_impl( HEXA_NS::Vertex *ptrCpp ): +_vertex_cpp( ptrCpp ) +// _association( GEOM::GEOM_Object::_nil() ) +{ +} + +HEXA_NS::Vertex* Vertex_impl::GetImpl() +{ + return _vertex_cpp; +} + +CORBA::Double Vertex_impl::getX() throw(SALOME::SALOME_Exception) +{ + return _vertex_cpp->getX(); +} + +CORBA::Double Vertex_impl::getY() throw(SALOME::SALOME_Exception) +{ + return _vertex_cpp->getY(); +} + +CORBA::Double Vertex_impl::getZ() throw(SALOME::SALOME_Exception) +{ + return _vertex_cpp->getZ(); +} + + +void Vertex_impl::setX( CORBA::Double x ) throw(SALOME::SALOME_Exception) +{ + _vertex_cpp->setX(x); +} +void Vertex_impl::setY( CORBA::Double y ) throw(SALOME::SALOME_Exception) +{ + _vertex_cpp->setY(y); +} + +void Vertex_impl::setZ( CORBA::Double z ) throw(SALOME::SALOME_Exception) +{ + _vertex_cpp->setZ(z); +} + + +void Vertex_impl::setAssociation(GEOM::GEOM_Object_ptr geom_object_vertex) + throw (SALOME::SALOME_Exception) +{ + TopoDS_Shape shape = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->geomObjectToShape(geom_object_vertex); +// HEXABLOCK::HEXABLOCK* gen = HEXABLOCK::GetHEXABLOCKGen(); +// TopoDS_Shape shape = gen->geomObjectToShape(geom_object_vertex); + string strBrep = shape2string( shape ); + CORBA::String_var anIOR = HEXABLOCK_Gen_i::GetORB()->object_to_string( geom_object_vertex ); + HEXA_NS::Shape* s = new HEXA_NS::Shape( strBrep ); + s->ior = anIOR.in(); + s->ident = geom_object_vertex->GetStudyEntry(); //geom_object_vertex->GetEntry() + _vertex_cpp->setAssociation(s); + +// _association = GEOM::GEOM_Object::_duplicate( geom_object_vertex ); +} + + +GEOM::GEOM_Object_ptr Vertex_impl::getAssociation() + throw (SALOME::SALOME_Exception) +{ +// GEOM::GEOM_Object_var result = GEOM::GEOM_Object::_nil(); +// GEOM::GEOM_Object_ptr result = GEOM::GEOM_Object::_nil(); + GEOM::GEOM_Object_var geomObj; // = new GEOM::GEOM_Object; + CORBA::Object_var corbaObj; + + HEXA_NS::Shape* s = _vertex_cpp->getAssociation(); + if (s != NULL){ + if ( !s->ior.empty() ){ // geom object from current session + corbaObj = HEXABLOCK_Gen_i::GetORB()->string_to_object( s->ior.c_str() ); + if ( !CORBA::is_nil( corbaObj ) ){ + geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); + } + } else { // no geom object => we have to built it + geomObj = HEXABLOCK_Gen_i::GetHEXABLOCKGen()->brepToGeomObject( s->getBrep() ); + } + } + + return geomObj._retn(); +} + + +void Vertex_impl::clearAssociation() + throw (SALOME::SALOME_Exception) +{ + _vertex_cpp->clearAssociation (); +} + + +void Vertex_impl::setScalar( ::CORBA::Double val )throw (SALOME::SALOME_Exception) +{ + _vertex_cpp->setScalar(val); +} + +void Vertex_impl::dump() throw (SALOME::SALOME_Exception) +{ + _vertex_cpp->dump(); +} + + +void Vertex_impl::printName()throw (SALOME::SALOME_Exception) +{ + _vertex_cpp->printName(); +} + + +char* Vertex_impl::getName() throw (SALOME::SALOME_Exception) +{ + return CORBA::string_dup( _vertex_cpp->getName() ); +} +// ========================================================= setName +void Vertex_impl::setName(const char* name) + throw (SALOME::SALOME_Exception) +{ + _vertex_cpp->setName (name); +} diff --git a/src/HEXABLOCK_I/HexVertex_impl.hxx b/src/HEXABLOCK_I/HexVertex_impl.hxx new file mode 100755 index 0000000..6d6da51 --- /dev/null +++ b/src/HEXABLOCK_I/HexVertex_impl.hxx @@ -0,0 +1,62 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#ifndef __HexVertex_impl__ +#define __HexVertex_impl__ + +// #include + +#include +#include CORBA_SERVER_HEADER(Vertex) +#include "SALOME_GenericObj_i.hh" + +#include "hexa_base.hxx" + +#include "hexa_base.hxx" +#include "HexVertex.hxx" + +class Vertex_impl : public POA_HEXABLOCK_ORB::Vertex, + public SALOME::GenericObj_i +{ +public: + Vertex_impl(HEXA_NS::Vertex *ptrCpp); + HEXA_NS::Vertex* GetImpl(); + + ::CORBA::Double getX() throw (SALOME::SALOME_Exception); + ::CORBA::Double getY() throw (SALOME::SALOME_Exception); + ::CORBA::Double getZ() throw (SALOME::SALOME_Exception); + void setX(::CORBA::Double x) throw (SALOME::SALOME_Exception); + void setY(::CORBA::Double y) throw (SALOME::SALOME_Exception); + void setZ(::CORBA::Double z) throw (SALOME::SALOME_Exception); + void setAssociation(GEOM::GEOM_Object_ptr geom_object_vertex) throw (SALOME::SALOME_Exception); + GEOM::GEOM_Object_ptr getAssociation() throw (SALOME::SALOME_Exception); + void clearAssociation() throw (SALOME::SALOME_Exception); + + void setScalar( ::CORBA::Double val )throw (SALOME::SALOME_Exception); + + void dump() throw (SALOME::SALOME_Exception); + void printName() throw (SALOME::SALOME_Exception); + char* getName() throw (SALOME::SALOME_Exception); + void setName (const char* name) throw (SALOME::SALOME_Exception); + +private: + HEXA_NS::Vertex* _vertex_cpp; +// GEOM::GEOM_Object_ptr _association; +}; + +#endif diff --git a/src/HEXABLOCK_I/Makefile.am b/src/HEXABLOCK_I/Makefile.am new file mode 100755 index 0000000..679c294 --- /dev/null +++ b/src/HEXABLOCK_I/Makefile.am @@ -0,0 +1,91 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# File : Makefile.in +# Author : , CEA +# Modified by : Alexander BORODIN (OCN) - autotools usage +# +include $(top_srcdir)/adm_local/unix/make_common_starter.am + + + +# =============================================================== +# Files to be installed +# =============================================================== +# +# header files +salomeinclude_HEADERS = \ + HEXABLOCK.hxx \ + HexCrossElements_impl.hxx \ + HexCylinder_impl.hxx \ + HexDocument_impl.hxx \ + HexEdge_impl.hxx \ + HexElements_impl.hxx \ + HexGroup_impl.hxx \ + HexHexa_impl.hxx \ + HexLaw_impl.hxx \ + HexPipe_impl.hxx \ + HexPropagation_impl.hxx \ + HexQuad_impl.hxx \ + HexVector_impl.hxx \ + HexVertex_impl.hxx + +# Scripts to be installed +dist_salomescript_PYTHON = hexablock.py + +# Libraries targets +# SD/Propagation/HexPropagation.cxx \ +# SD/Law/HexLaw.cxx \ +# +lib_LTLIBRARIES = libHEXABLOCKEngine.la +dist_libHEXABLOCKEngine_la_SOURCES = \ + HexVertex_impl.cxx \ + HexEdge_impl.cxx \ + HexQuad_impl.cxx \ + HexHexa_impl.cxx \ + HexVector_impl.cxx \ + HexElements_impl.cxx \ + HexCrossElements_impl.cxx \ + HexCylinder_impl.cxx \ + HexPipe_impl.cxx \ + HexPropagation_impl.cxx \ + HexLaw_impl.cxx \ + HexGroup_impl.cxx \ + HexDocument_impl.cxx \ + HEXABLOCK.cxx \ + HEXABLOCK_1.cxx + + + +libHEXABLOCKEngine_la_CPPFLAGS = \ + $(CORBA_CXXFLAGS) \ + $(CORBA_INCLUDES) \ + $(KERNEL_CXXFLAGS) \ + $(GEOM_CXXFLAGS) \ + $(CAS_CPPFLAGS) \ + -I$(srcdir)/../HEXABLOCK \ + -I$(top_builddir)/idl \ + -I$(top_builddir)/salome_adm/unix + +libHEXABLOCKEngine_la_LDFLAGS = \ + ../../idl/libSalomeIDLHEXABLOCK.la \ + ../HEXABLOCK/libHEXABLOCKimpl.la \ + $(KERNEL_LDFLAGS) -lOpUtil -lSalomeNS -lSalomeContainer -lSalomeGenericObj -lSalomeLifeCycleCORBA \ + $(CAS_LDPATH) \ + $(GEOM_LDFLAGS) -lGEOMClient + diff --git a/src/HEXABLOCK_I/hexablock.py b/src/HEXABLOCK_I/hexablock.py new file mode 100755 index 0000000..a99d685 --- /dev/null +++ b/src/HEXABLOCK_I/hexablock.py @@ -0,0 +1,188 @@ +# -*- coding: latin-1 -*- + +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Francis KLOSS - 2011-2012 - CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France +# ============================================================================================= + +import salome +import smesh + +from HEXABLOCK_ORB import * +import HEXABLOCKPlugin + +geompy = smesh.geompy + +# Load HEXABLOCK componant +# ------------------------ + +component = salome.lcc.FindOrLoadComponent("FactoryServer", "HEXABLOCK") +component = component._narrow(HEXABLOCK_Gen) + +for k in dir(component): + if k[0] == '_': + continue + globals()[k] = getattr(component, k) + +del k + +# Add laws on propagations based on min or max segment length +# ----------------------------------------------------------- + +def addLaws(doc, lg, lgmax=True): + laws = {} + n = doc.countPropagation() + for i in xrange(n): + p = doc.getPropagation(i) + if lgmax: + m = 0 + else: + m = (max) + for e in p.getEdges(): + a = e.getAssociations() + + if a == []: + vam = e.getVertex(0) + vag = vam.getAssociation() + if vag == None: + vax = vam.getX() + vay = vam.getY() + vaz = vam.getZ() + else: + vax, vay, vaz = geompy.PointCoordinates(vag) + + vbm = e.getVertex(1) + vbg = vbm.getAssociation() + if vbg == None: + vbx = vbm.getX() + vby = vbm.getY() + vbz = vbm.getZ() + else: + vbx, vby, vbz = geompy.PointCoordinates(vbg) + + l = ( (vbx-vax)**2 + (vby-vay)**2 + (vbz-vaz)**2 )**0.5 + + else: + l = 0.0 + for gdf in a: + le, su, vo = geompy.BasicProperties(gdf.geomObj) + l += le * (gdf.fin - gdf.debut) + + if ( lgmax and l>m ) or ( (not lgmax) and l +#include "hexa_base.hxx" +#include "HexEdge.hxx" +#include "HexEdgeTest.hxx" + +CPPUNIT_TEST_SUITE_REGISTRATION( EdgeTest ); + + +EdgeTest::EdgeTest(void) +{ + _myHexEngine = new HEXA_NS::Hex(); + _myDoc= _myHexEngine->addDocument(); +} + +EdgeTest::~EdgeTest(void) +{ + delete _myDoc; + delete _myHexEngine; //CS_TODO : Bug +} + + +void EdgeTest::TestGetVertex(void) +{ + HEXA_NS::Vertex *myVertex0 = NULL; + HEXA_NS::Vertex *myVertex1 = NULL; + + // first vertex of the edge +// double x0Value = 1.; +// double y0Value = 5.; +// double z0Value = 3.; +// myVertex0 = _myDoc->addVertex( x0Value, y0Value, z0Value ); + myVertex0 = _myDoc->addVertex( 1., 5., 3. ); + + // second vertex of the edge + myVertex1 = _myDoc->addVertex( 8., 4., 6.); + + HEXA_NS::Edge *myEdge = _myDoc->addEdge( myVertex0, myVertex1 ); + + // Testing first Vertex + HEXA_NS::Vertex *docVertex0 = myEdge->getVertex(0); + CPPUNIT_ASSERT( docVertex0->getX() == myVertex0->getX() ); + CPPUNIT_ASSERT( docVertex0->getY() == myVertex0->getY() ); + CPPUNIT_ASSERT( docVertex0->getZ() == myVertex0->getZ() ); + + // Testing second Vertex + HEXA_NS::Vertex *docVertex1 = myEdge->getVertex(1); + CPPUNIT_ASSERT( docVertex1->getX() == myVertex1->getX() ); + CPPUNIT_ASSERT( docVertex1->getY() == myVertex1->getY() ); + CPPUNIT_ASSERT( docVertex1->getZ() == myVertex1->getZ() ); +// CPPUNIT_ASSERT_ASSERTION_FAIL( CPPUNIT_ASSERT( myClassa.getVar() == testValue ) ); +} diff --git a/src/TEST_CPP/HexEdgeTest.hxx b/src/TEST_CPP/HexEdgeTest.hxx new file mode 100755 index 0000000..7df05d3 --- /dev/null +++ b/src/TEST_CPP/HexEdgeTest.hxx @@ -0,0 +1,52 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __EdgeTest__ +#define __EdgeTest__ + +#include +#include + +#include "hexa_base.hxx" +#include "Hex.hxx" +#include "HexDocument.hxx" + +class EdgeTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( EdgeTest ); + CPPUNIT_TEST( TestGetVertex ); + CPPUNIT_TEST_SUITE_END(); + + public: + EdgeTest(void); + ~EdgeTest(void); + + //~ Call before tests + void setUp(void) {} + //~ Call after tests + void tearDown(void) {} + void TestGetVertex(void); + + private: + HEXA_NS::Hex *_myHexEngine; + HEXA_NS::Document *_myDoc; + +}; + +#endif diff --git a/src/TEST_CPP/HexVertexTest.cxx b/src/TEST_CPP/HexVertexTest.cxx new file mode 100755 index 0000000..d6ee33a --- /dev/null +++ b/src/TEST_CPP/HexVertexTest.cxx @@ -0,0 +1,73 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include "hexa_base.hxx" +#include "HexVertex.hxx" +#include "HexVertexTest.hxx" + +CPPUNIT_TEST_SUITE_REGISTRATION( VertexTest ); + + +VertexTest::VertexTest(void) +{ + _myHexEngine = new HEXA_NS::Hex(); + _myDoc= _myHexEngine->addDocument(); +} + +VertexTest::~VertexTest(void) +{ + delete _myDoc; + delete _myHexEngine; //CS_TODO : Bug +} + + +void VertexTest::TestGetX(void) +{ + double xValue = 1.; +// std::cout<<"Hellllllooooooo TestGetX"; + +// HEXA_NS::Vertex myVertex( xValue, 8. ,4. ); + HEXA_NS::Vertex *myVertex = _myDoc->addVertex( xValue, 8. ,4. ); + + CPPUNIT_ASSERT( myVertex->getX() == xValue ); +// CPPUNIT_ASSERT_ASSERTION_FAIL( CPPUNIT_ASSERT( myClassa.getVar() == testValue ) ); +} + +void VertexTest::TestGetY(void) +{ + double yValue = 8.; +// HEXA_NS::Vertex myVertex( 1. ,yValue ,4. ); + HEXA_NS::Vertex *myVertex = _myDoc->addVertex( 1. ,yValue ,4. ); + + CPPUNIT_ASSERT( myVertex->getY() == yValue ); +// CPPUNIT_ASSERT_ASSERTION_FAIL( CPPUNIT_ASSERT( myClassa.getVar() == testValue ) ); +} + + +void VertexTest::TestGetZ(void) +{ + double zValue = 1.; + +// HEXA_NS::Vertex myVertex( 1. ,8. ,zValue ); + HEXA_NS::Vertex *myVertex = _myDoc->addVertex( 1. ,8. ,zValue ); + + CPPUNIT_ASSERT( myVertex->getZ() == zValue ); +// CPPUNIT_ASSERT_ASSERTION_FAIL( CPPUNIT_ASSERT( myClassa.getVar() == testValue ) ); +} diff --git a/src/TEST_CPP/HexVertexTest.hxx b/src/TEST_CPP/HexVertexTest.hxx new file mode 100755 index 0000000..c9447d7 --- /dev/null +++ b/src/TEST_CPP/HexVertexTest.hxx @@ -0,0 +1,55 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __VertexTest__ +#define __VertexTest__ + +#include +#include + +#include "hexa_base.hxx" +#include "Hex.hxx" +#include "HexDocument.hxx" + +class VertexTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( VertexTest ); + CPPUNIT_TEST( TestGetX ); + CPPUNIT_TEST( TestGetY ); + CPPUNIT_TEST( TestGetZ ); + CPPUNIT_TEST_SUITE_END(); + + public: + VertexTest(void); + ~VertexTest(void); + //~ Call before tests + void setUp(void) {} + //~ Call after tests + void tearDown(void) {} + + void TestGetX(void); + void TestGetY(void); + void TestGetZ(void); + private: + HEXA_NS::Hex *_myHexEngine; + HEXA_NS::Document *_myDoc; + +}; + +#endif diff --git a/src/TEST_CPP/Makefile.am b/src/TEST_CPP/Makefile.am new file mode 100755 index 0000000..715ef28 --- /dev/null +++ b/src/TEST_CPP/Makefile.am @@ -0,0 +1,206 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +# +# =============================================================== +# Files to be installed +# =============================================================== +# +# header files +# salomeinclude_HEADERS= ../SD/VertexTest.hxx + +# Scripts to be installed + + +# +# =============================================================== +# Local definitions +# =============================================================== +# + +# This directory defines the subdirectory src in the top source directory. +# RPATH=../.. +RPATH=.. + + +# This local variable defines the list of CPPFLAGS common to all target in this package. +COMMON_CPPFLAGS = \ + @CPPUNIT_INCLUDES@ \ + -I$(srcdir)/$(RPATH)/HEXABLOCK/ \ + -I$(top_builddir)/idl \ + @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ + + +# This local variable defines the list of dependant libraries common to all target in this package. +COMMON_LIBS =\ + @CPPUNIT_LIBS@ \ + $(RPATH)/HEXABLOCK/libHEXABLOCKimpl.la \ + $(KERNEL_LDFLAGS) \ + -lSalomeGenericObj + +# =============================================================== +# Libraries targets +# HexVertexTest.cxx \ +# HexEdgeTest.cxx \ +# =============================================================== +lib_LTLIBRARIES = libHEXABLOCKTest.la +libHEXABLOCKTest_la_SOURCES = \ + test_unit.hxx \ + test_hexa1.cxx \ + test_tools.cxx \ + test_quads.cxx \ + ModelTest.cxx ModelTest.hxx + +libHEXABLOCKTest_la_CPPFLAGS = $(COMMON_CPPFLAGS) +libHEXABLOCKTest_la_LDFLAGS = -no-undefined -version-info=0:0:0 +libHEXABLOCKTest_la_LIBADD = $(COMMON_LIBS) + + +# =============================================================== +# Executables targets +# =============================================================== +bin_PROGRAMS = Test_HEXABLOCK +Test_HEXABLOCK_SOURCES = Test_HEXABLOCK.cxx +Test_HEXABLOCK_CPPFLAGS = $(COMMON_CPPFLAGS) +Test_HEXABLOCK_LDADD = \ + libHEXABLOCKTest.la \ + ../HEXABLOCK/libHEXABLOCKimpl.la \ + $(COMMON_LIBS) + +UNIT_TEST_PROG = ./Test_HEXABLOCK + +check : tests + +clean-local: + -rm -fr *.vtk *.xml *.brep + +# bin_PROGRAMS = bielle +# test_hexa1 \ +# test_cartesi1 \ +# test_clone \ +# test_cyl \ +# test_decoupage \ +# test_find \ +# test_gen_xml \ +# test_joint \ +# test_propagation \ +# test_separ \ +# tuyau +# test_lecture + + +# UNIT TEST +# test_cartesi1_SOURCES = test_cartesi1.cpp +# test_cartesi1_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_cartesi1_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_clone_SOURCES = test_clone.cpp +# test_clone_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_clone_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_cyl_SOURCES = test_cyl.cpp +# test_cyl_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_cyl_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_decoupage_SOURCES = test_decoupage.cpp +# test_decoupage_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_decoupage_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_find_SOURCES = test_find.cpp +# test_find_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_find_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_gen_xml_SOURCES = test_gen_xml.cpp +# test_gen_xml_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_gen_xml_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_joint_SOURCES = test_joint.cpp +# test_joint_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_joint_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) + +# test_lecture_SOURCES = test_lecture.cpp +# test_lecture_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_lecture_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) + +# test_propagation_SOURCES = test_propagation.cpp +# test_propagation_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_propagation_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# +# test_separ_SOURCES = test_separ.cpp +# test_separ_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_separ_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) + + + +# test_hexa1_SOURCES = test_hexa1.cpp +# test_hexa1_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_hexa1_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# UNIT_TEST_PROG = ./test_hexa1 + +# libHEXATest.la \ +# USER CASE +# bielle_SOURCES = bielle.cpp +# bielle_CPPFLAGS = $(COMMON_CPPFLAGS) +# bielle_LDADD = \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) + +# tuyau_SOURCES = tuyau.cpp +# tuyau_CPPFLAGS = $(COMMON_CPPFLAGS) +# tuyau_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) diff --git a/src/TEST_CPP/Makefile.orig.am b/src/TEST_CPP/Makefile.orig.am new file mode 100755 index 0000000..54b04b5 --- /dev/null +++ b/src/TEST_CPP/Makefile.orig.am @@ -0,0 +1,206 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +# +# =============================================================== +# Files to be installed +# =============================================================== +# +# header files +# salomeinclude_HEADERS= ../SD/VertexTest.hxx + +# Scripts to be installed + + +# +# =============================================================== +# Local definitions +# =============================================================== +# + +# This directory defines the subdirectory src in the top source directory. +# RPATH=../.. +RPATH=.. + + +# This local variable defines the list of CPPFLAGS common to all target in this package. +COMMON_CPPFLAGS = \ + @CPPUNIT_INCLUDES@ \ + -I$(srcdir)/$(RPATH)/HEXA/ \ + -I$(top_builddir)/idl \ + @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ + + +# This local variable defines the list of dependant libraries common to all target in this package. +COMMON_LIBS =\ + @CPPUNIT_LIBS@ \ + $(RPATH)/HEXA/libHEXAimpl.la \ + $(KERNEL_LDFLAGS) \ + -lSalomeGenericObj + +# =============================================================== +# Libraries targets +# =============================================================== +# HexVertexTest.cxx \ +# HexEdgeTest.cxx +# +# lib_LTLIBRARIES = libHEXATest.la +# libHEXATest_la_SOURCES = \ +# test_hexa1.cxx +# +# +# libHEXATest_la_CPPFLAGS = $(COMMON_CPPFLAGS) +# libHEXATest_la_LDFLAGS = -no-undefined -version-info=0:0:0 +# libHEXATest_la_LIBADD = $(COMMON_LIBS) + +# +# =============================================================== +# Executables targets +# =============================================================== +# +# bin_PROGRAMS = TestHEXA +# TestHEXA_SOURCES = TestHEXA.cxx +# TestHEXA_CPPFLAGS = $(COMMON_CPPFLAGS) +# TestHEXA_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# UNIT_TEST_PROG = ./TestHEXA +# +# + + +bin_PROGRAMS = bielle +# test_hexa1 \ +# test_cartesi1 \ +# test_clone \ +# test_cyl \ +# test_decoupage \ +# test_find \ +# test_gen_xml \ +# test_joint \ +# test_propagation \ +# test_separ \ +# tuyau +# test_lecture + + +# UNIT TEST +# test_cartesi1_SOURCES = test_cartesi1.cpp +# test_cartesi1_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_cartesi1_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_clone_SOURCES = test_clone.cpp +# test_clone_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_clone_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_cyl_SOURCES = test_cyl.cpp +# test_cyl_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_cyl_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_decoupage_SOURCES = test_decoupage.cpp +# test_decoupage_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_decoupage_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_find_SOURCES = test_find.cpp +# test_find_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_find_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_gen_xml_SOURCES = test_gen_xml.cpp +# test_gen_xml_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_gen_xml_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# test_joint_SOURCES = test_joint.cpp +# test_joint_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_joint_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) + +# test_lecture_SOURCES = test_lecture.cpp +# test_lecture_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_lecture_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) + +# test_propagation_SOURCES = test_propagation.cpp +# test_propagation_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_propagation_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# +# test_separ_SOURCES = test_separ.cpp +# test_separ_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_separ_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) + + + +# test_hexa1_SOURCES = test_hexa1.cpp +# test_hexa1_CPPFLAGS = $(COMMON_CPPFLAGS) +# test_hexa1_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) +# +# UNIT_TEST_PROG = ./test_hexa1 + +# libHEXATest.la \ +# USER CASE +bielle_SOURCES = bielle.cpp +bielle_CPPFLAGS = $(COMMON_CPPFLAGS) +bielle_LDADD = \ + ../HEXA/libHEXAimpl.la \ + $(COMMON_LIBS) + +# tuyau_SOURCES = tuyau.cpp +# tuyau_CPPFLAGS = $(COMMON_CPPFLAGS) +# tuyau_LDADD = \ +# libHEXATest.la \ +# ../HEXA/libHEXAimpl.la \ +# $(COMMON_LIBS) + + + diff --git a/src/TEST_CPP/ModelTest.cxx b/src/TEST_CPP/ModelTest.cxx new file mode 100755 index 0000000..28da605 --- /dev/null +++ b/src/TEST_CPP/ModelTest.cxx @@ -0,0 +1,1087 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + + +#include "hexa_base.hxx" +#include "Hex.hxx" +#include "HexDocument.hxx" +#include "HexElements.hxx" +#include "HexCrossElements.hxx" + +#include "HexHexa.hxx" +#include "HexQuad.hxx" +#include "HexEdge.hxx" +#include "HexVertex.hxx" + +#include "HexPropagation.hxx" +#include "HexShape.hxx" +#include "HexLaw.hxx" +#include "HexMatrix.hxx" + +#include "ModelTest.hxx" + +CPPUNIT_TEST_SUITE_REGISTRATION( ModelTest ); + + +ModelTest::ModelTest(void) +{ +// _myHexEngine = new HEXA_NS::Hex(); +// _myDoc= _myHexEngine->addDocument(); +} + +ModelTest::~ModelTest(void) +{ +// delete _myDoc; +// delete _myHexEngine; //CS_TODO : Crash +} + + +// ======================================================== print_propagations +void ModelTest::_print_propagations (Hex::Document* doc) +{ + int nb = doc->countPropagation (); + HexDisplay (nb); + for (int nro=0 ; nrogetPropagation (nro); + const Hex::Edges& table = prop->getEdges (); + printf (" ____________________________________ Prop nro %d\n", nro); + for (int ned=0 ; ned<(int)table.size() ; ned++) + { + bool way = table [ned]->getWay (); + Hex::Edge* edge = table [ned]; + Hex::Vertex* v0 = edge->getVertex (0); + Hex::Vertex* v1 = edge->getVertex (1); + + if (way) + { + printf (" ("); + v0->printName (", "); + v1->printName (")\n"); + } + else + { + v1->printName (", "); + v0->printName (")\n"); + printf (" ("); + } + } + } +} +// // ======================================================== Test_sphere +// void ModelTest::Test_sphere () +// { +// Hex::Hex mon_ex; +// Hex::Document* doc = mon_ex.addDocument (); +// Hex::Vertex* orig = doc->addVertex (0,0,0); +// +// int ncouches = 1; +// double k = 0.8; +// Hex::Vector* decal = doc->addVector (1,1,1); +// Hex::Elements* sphere = doc->makeSpherical (orig, decal, ncouches, k); +// +// for (int nc=0 ; nc <= ncouches ; nc++) +// { +// Hex::Hexa* cell = sphere->getStrate (nc, Hex::Q_A); +// cell->remove (); +// // sphere->getStrate (nc, Hex::Q_A)->remove (); +// // sphere->getStrate (nc, Hex::Q_B)->remove (); +// } +// +// sphere->saveVtk ("sphere.vtk"); +// CPPUNIT_ASSERT( true ); +// } +// ======================================================== Test_cartesi1 +void ModelTest::Test_cartesi1 () +{ + + const int size_x = 15; + const int size_y = 12; + const int size_z = 8; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + Hex::Vertex* orig = doc->addVertex (0,0,0); + + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + // print_propagations (doc); + + for (int nz=0; nzgetHexaIJK (nx, ny, nz); + cell->remove (); + } + + doc->setLevel (1); + _print_propagations (doc); + grid->saveVtk ("grid_cart.vtk"); + + // doc->dump (); + CPPUNIT_ASSERT( true ); +} +// ======================================================== afficher +#define Afficher(elt) _afficher (#elt, elt) +int ModelTest::_afficher (cpchar nom, Hex::EltBase* elt) +{ + if (elt==NULL) + { + printf (" .... %s = 0x0\n", nom); + return HOK; + } + + printf (" .... %s = 0x%08lx = %03d\n", nom, (unsigned long) elt, elt->getId()); + return HOK; +} +// ======================================================== Test_find +void ModelTest::Test_find () +{ + + const int size_x = 2; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + grid->saveVtk ("mini1.vtk"); + doc->dump (); + + Hex::Vertex *v00, *v02, *v06, *v08, *v10, *v22, *v26; + + Afficher ( v00 = doc->findVertex (0, 0, 0)); + Afficher ( v02 = doc->findVertex (1, 1, 0)); + Afficher ( v06 = doc->findVertex (1, 1, 1)); + Afficher ( v08 = doc->findVertex (2, 1, 0)); + Afficher ( v10 = doc->findVertex (2, 1, 1)); + Afficher ( v22 = doc->findVertex (2, 1, 2)); + Afficher ( v26 = doc->findVertex (2, 2, 2)); + + printf ("\n"); + + Afficher (doc->findEdge (v06, v10)); + Afficher (doc->findEdge (v10, v06)); + printf ("\n"); + + Afficher (doc->findQuad (v02, v10)); + Afficher (doc->findQuad (v06, v08)); + Afficher (doc->findQuad (v02, v06)); + + printf ("\n"); + Afficher (doc->findHexa (v00, v06)); + Afficher (doc->findHexa (v06, v26)); + Afficher (doc->findHexa (v26, v06)); + + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_joint +void ModelTest::Test_joint () +{ + + const int dimx = 11; + const int dimy = 11; + const int dimz = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig1 = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + + Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, dimx,dimy,dimz); + + Hex::Vertex* orig2 = doc->addVertex (dimx/2.0,0,8); + Hex::Vector* vectj = doc->addVector (0,1,0); + Hex::Vector* vecti = doc->addVector (1,0,0); + Hex::Elements* grid2 = doc->makeCylindrical (orig2, vecti, vectj, + 1, 180, 1, dimz,dimy,dimx); + + int mx = dimx/2; + int my = dimy/2; + Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz); + Hex::Quad* cible = grid2->getQuadJK (dimz, mx, my); + + + Hex::Vertex* v1 = prems->getVertex (0); + Hex::Vertex* v2 = cible->getVertex (0); + Hex::Vertex* v3 = prems->getVertex (1); + Hex::Vertex* v4 = cible->getVertex (3); + + Hex::Quads liste; + Hex::Quads miroir; + + liste.push_back (prems); + for (int nx=0; nxgetQuadIJ (nx, my, dimz)); + + for (int ny=0; nygetQuadIJ (mx, ny, dimz)); + + // Hex::Elements* joint = + // + doc->joinQuads (liste, cible, v1, v2, v3, v4, 5); + doc->saveVtk ("joint.vtk"); + + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_prism +void ModelTest::Test_prism () +{ + + const int dimx = 11; + const int dimy = 11; + const int dimz = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig1 = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + + Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, dimx,dimy,dimz); + + int mx = dimx/2; + int my = dimy/2; + Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz); + Hex::Quads liste; + + liste.push_back (prems); + for (int nx=0; nxgetQuadIJ (nx, my, dimz)); + + for (int ny=0; nygetQuadIJ (mx, ny, dimz)); + + doc->prismQuads (liste, dir, 5); + doc->saveVtk ("prisme.vtk"); + + CPPUNIT_ASSERT( true ); +} + + +// ======================================================== Test_prism2 +void ModelTest::Test_prism2 () +{ + + const int dimx = 11; + const int dimy = 11; + const int dimz = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig1 = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + + Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, dimx,dimy,dimz); + + int mx = dimx/2; + int my = dimy/2; + Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz); + Hex::Elements* prism = doc->prismQuad(prems, dir, 5); + + int nbHexa = prism->countHexa(); + std::cout << "nbHexa " << nbHexa << std::endl; + Hex::Hexa* hp1 = prism->getHexa(1); + std::cout << "getHexa(1) " << hp1 << std::endl; + Hex::Vertex* hp1_v0 = hp1->getVertex(0); + std::cout << "getVertex ->" << hp1_v0 << std::endl; + Hex::Shape* s = new Hex::Shape("la shape"); + std::cout << "new Hex::Shape->" << s << std::endl; + hp1_v0->setAssociation(s); + std::cout << "setAssociation ->" << std::endl; + doc->saveVtk ("prisme2.vtk"); + + CPPUNIT_ASSERT( true ); +} + + + + + + + + +// ======================================================== Test_hexa1 +void ModelTest::Test_hexa1 () +{ + + const int size_x = 1; + const int size_y = 1; + const int size_z = 1; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + // Hex::Elements* grid = + doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + doc ->dump (); + + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_decoupage +void ModelTest::Test_decoupage () +{ + + const int size_x = 2; + const int size_y = 1; + const int size_z = 1; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + Hex::Edge* arete = grid->getEdgeK (0, 0, 0); + + doc ->dump (); + doc ->saveVtk ("no_decoupe.vtk"); +/* Hex::Elements* grid2 = */ doc->cut (arete, 1); + + doc ->dump (); + doc ->saveVtk ("decoupe.vtk"); + // doc ->saveFile (); + + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_gen_xml +void ModelTest::Test_gen_xml () +{ + + const int size_x = 2; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + Hex::Hexa* cell = grid->getHexa (0); + Hex::Quad* face = cell->getQuad (0); + Hex::Edge* arete = cell->getEdge (0); + Hex::Vertex* noeud = cell->getVertex (0); + + Hex::Shape* shape1 = new Hex::Shape("riri"); + Hex::Shape* shape2 = new Hex::Shape("fifi"); + Hex::Shape* shape3 = new Hex::Shape("loulou"); + + noeud->setAssociation (shape1); + arete->setAssociation (shape2); + face ->setAssociation (shape3); + + Hex::Law* law1 = doc->addLaw("loi1", 1); + Hex::Law* law2 = doc->addLaw("loi2", 2); + Hex::Law* law3 = doc->addLaw("loi3", 3); + + law1->setKind (Hex::Uniform); + law2->setKind (Hex::Arithmetic); + law3->setKind (Hex::Geometric); + + Hex::Propagation* prop1 = doc->getPropagation (0); + Hex::Propagation* prop2 = doc->getPropagation (1); + Hex::Propagation* prop3 = doc->getPropagation (2); + + prop1->setLaw (law1); + prop2->setLaw (law2); + prop3->setLaw (law3); + + prop1->setWay (true); + prop2->setWay (false); + prop3->setWay (true); + + doc ->saveVtk ("mini.vtk"); + doc ->save ("Essai"); + + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_relecture +void ModelTest::Test_relecture () +{ + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.loadDocument ("Essai"); + + doc ->dump (); + doc ->saveVtk ("restore.vtk"); + + CPPUNIT_ASSERT( true ); +} + + +// ======================================================== Test_clone +void ModelTest::Test_clone () +{ + + const int size_x = 2; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + Hex::Vector* bond = doc->addVector (0, 0, 7); + Hex::Elements* grid2 = doc->makeTranslation (grid, bond); + + doc ->saveVtk ("clonage.vtk"); + doc ->dump(); + + HexDump (grid2->getHexa (1)); + HexDump (grid2->getHexaIJK (1,1,1)); + HexDump (grid2->getVertexIJK (1,1,1)); + + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_separ +void ModelTest::Test_separ () +{ + + const int size_x = 2; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + // Hex::Elements* grid = + doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + doc ->saveVtk ("separ.vtk"); + doc ->dump(); + + CPPUNIT_ASSERT( true ); +} +// // ======================================================== Test_cyl_karima +// void ModelTest::Test_cyl_karima () +// { +// +// Hex::Hex mon_ex; +// Hex::Document* doc = mon_ex.addDocument ("foo"); +// +// Hex::Vertex* c2 = doc->addVertex (0,0,0); +// Hex::Vector* dz = doc->addVector (0,0,1); +// Hex::Vector* dx = doc->addVector (1,0,0); +// +// double dr = 4.12; +// +// double a2 = 180; +// int l2 = 70; +// +// int nr2 = 5; +// int na2 = 5; +// int nl2 = 1; +// +// /* Hex::Elements* cyl2 = */ doc->makeCylindrical (c2, dx, dz, dr, a2, l2, +// nr2, na2, nl2, false ); +// doc->saveVtk ("cyl_karima.vtk"); +// // doc->dump (); +// +// CPPUNIT_ASSERT( true ); +// } +// ================================================== Test_grille_cyl +void ModelTest::Test_grille_cyl () +{ + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig1 = doc->addVertex ( 0, 0,0); + Hex::Vertex* orig2 = doc->addVertex (10, 0,0); + + Hex::Vertex* orig3 = doc->addVertex ( 0,10,0); + Hex::Vertex* orig4 = doc->addVertex (10,10,0); + + Hex::Vertex* orig5 = doc->addVertex ( 0,20,0); + Hex::Vertex* orig6 = doc->addVertex (10,20,0); + + Hex::Vector* vz = doc->addVector (0,0,1); + Hex::Vector* vx = doc->addVector (1,0,0); + + double dr = 1; + double dl = 1; + int nr = 2; + int nl = 5; + nl = 1; + + doc->makeCylindrical(orig1,vx,vz,dr, 360, dl,nr,4,nl, true); + doc->makeCylindrical(orig2,vx,vz,dr, 360, dl,nr,8,nl, true); + doc->makeCylindrical(orig3,vx,vz,dr, 270, dl,nr,8,nl, true); + doc->makeCylindrical(orig6,vx,vz,dr, 360, dl,nr,6,nl, true); + doc->makeCylindrical(orig4,vx,vz,dr, 270, dl,nr,7,nl, true); + doc->makeCylindrical(orig5,vx,vz,dr, 360, dl,nr,5,nl, true); + doc->saveVtk ("cylindres.vtk"); + // doc->dump (); + + CPPUNIT_ASSERT( true ); +} +// ===================================================== Test_cylinder +void ModelTest::Test_cylinder () +{ + + int nvtk = 0; + cpchar fic_vtk = "cylindre"; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig1 = doc->addVertex (0, 0,0); + Hex::Vertex* orig2 = doc->addVertex (50,0,0); + Hex::Vector* vz = doc->addVector (0,0,1); + Hex::Vector* vx = doc->addVector (1,0,0); + + int nr = 4; + int nri = 3; + int nre = nr; + int na = 9; + int nl = 5; + + Hex::Cylinder* cyl = doc->addCylinder (orig1, vz, nr, nl); + Hex::Pipe* pipe = doc->addPipe (orig2, vz, nri, nre, nl); + + doc->makeCylinder (cyl, vx, nr, na, nl); + doc ->saveVtk (fic_vtk, nvtk); + + doc->makePipe (pipe, vx, nr, na, nl); + doc ->saveVtk (fic_vtk, nvtk); + + CPPUNIT_ASSERT( true ); +} + + + +void ModelTest::myTest_croix () +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + +// Hex::Vector* dx1 = doc->addVector( -1, 0, 0 ); +// Hex::Vector* dz1 = doc->addVector( 0, 0, 1 ); +// +// Hex::Vertex* c_pte_1 = doc->addVertex ( 195., 0., 220. ); +// Hex::Vertex* c_grd_1 = doc->addVertex ( 300., 0., 400. ); +// Hex::Cylinder* cyl_pte_1 = doc->addCylinder( c_pte_1 , dz1 , 25 , 360 ); +// Hex::Cylinder* cyl_grd_1 = doc->addCylinder( c_grd_1 , dx1 , 50 , 140 ); +// Hex::CrossElements* cross1 = doc->makeCylinders( cyl_pte_1 , cyl_grd_1 ); + + Hex::Vector* dx2 = doc->addVector(-1, 0, 0 ); + Hex::Vector* dz2 = doc->addVector( 0, 0, 1 ); + + Hex::Vertex* c_pte_2 = doc->addVertex( 110., 0. , 400. ); + Hex::Vertex* c_grd_2 = doc->addVertex( 0. , 0. , 0. ); + + Hex::Cylinder* cyl_pte_2 = doc->addCylinder( c_pte_2 , dx2 , 50, 220 ); + Hex::Cylinder* cyl_grd_2 = doc->addCylinder( c_grd_2 , dz2 , 100, 800 ); + Hex::CrossElements* cross2 = doc->makeCylinders( cyl_pte_2, cyl_grd_2 ); + + +/* + Hex::Vector* dx2 = doc->addVector( 1, 0, 0 ); + Hex::Vector* dz2 = doc->addVector( 0, 0, 1 ); + + Hex::Vertex* c_pte_2 = doc->addVertex( -130. , 0. , 400. ); + Hex::Vertex* c_grd_2 = doc->addVertex( 0. , 0. , 0. ); + + Hex::Cylinder* cyl_pte_2 = doc->addCylinder( c_pte_2 , dx2 , 50, 260 ); + Hex::Cylinder* cyl_grd_2 = doc->addCylinder( c_grd_2 , dz2 , 100, 800 ); + + Hex::CrossElements* cross2 = doc->makeCylinders( cyl_pte_2, cyl_grd_2 );*/ + doc->saveVtk ("/tmp/ffffffff.vtk"); + doc->dump (); + + CPPUNIT_ASSERT( true ); +} + + + + +// ======================================================== Test_croix +void ModelTest::Test_croix () +{ + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* ori1 = doc->addVertex ( 0,0,0); + Hex::Vertex* ori2 = doc->addVertex (-5,0,5); + Hex::Vector* vz = doc->addVector ( 0,0,1); + Hex::Vector* vx = doc->addVector ( 1,0,0); + + int nr1 = 2; + int nl1 = 10; + int nr2 = 1; + int nl2 = 10; + + Hex::Cylinder* cyl1 = doc->addCylinder (ori1, vz, nr1, nl1); + Hex::Cylinder* cyl2 = doc->addCylinder (ori2, vx, nr2, nl2); + Hex::CrossElements* grid = doc->makeCylinders (cyl1, cyl2); + + grid->dump(); + grid->dumpVertex(); + +#if 0 + for (int ny=0; nygetHexaIJK (Hex::Cyl1, 1, ny, 0)->remove (); + grid->getHexaIJK (Hex::Cyl1, 1, ny, 1)->remove (); + grid->getHexaIJK (Hex::Cyl1, 1, ny, 2)->remove (); + grid->getHexaIJK (Hex::Cyl1, 1, ny, 3)->remove (); + grid->getHexaIJK (Hex::Cyl1, 1, ny, 4)->remove (); + grid->getHexaIJK (Hex::Cyl1, 1, ny, 5)->remove (); + + grid->getHexaIJK (Hex::Cyl2, 1, ny, 0)->remove (); + // grid->getHexaIJK (Hex::Cyl2, 1, ny, 1)->remove (); + // grid->getHexaIJK (Hex::Cyl2, 1, ny, 2)->remove (); + grid->getHexaIJK (Hex::Cyl2, 1, ny, 3)->remove (); + } + + for (int ny=0; ny<4 ; ny++) + { + grid->getHexaIJK (Hex::Cyl1, 0, ny, 0)->remove (); + grid->getHexaIJK (Hex::Cyl1, 0, ny, 1)->remove (); + grid->getHexaIJK (Hex::Cyl1, 0, ny, 2)->remove (); + grid->getHexaIJK (Hex::Cyl1, 0, ny, 3)->remove (); + grid->getHexaIJK (Hex::Cyl1, 0, ny, 4)->remove (); + grid->getHexaIJK (Hex::Cyl1, 0, ny, 5)->remove (); + + // grid->getHexaIJK (Hex::Cyl2, 0, ny, 0)->remove (); + // grid->getHexaIJK (Hex::Cyl2, 0, ny, 1)->remove (); + // grid->getHexaIJK (Hex::Cyl2, 0, ny, 2)->remove (); + // grid->getHexaIJK (Hex::Cyl2, 0, ny, 3)->remove (); + } + + /********************************* + grid->getHexaIJK (Hex::Cyl2, 0, 3, 1)->remove (); + grid->getHexaIJK (Hex::Cyl2, 1, Hex::S_SE, 2)->remove (); + grid->getHexaIJK (Hex::Cyl2, 1, Hex::S_SE, 1)->remove (); + + grid->getHexaIJK (Hex::Cyl1, 1, Hex::S_SE, 3)->remove (); + grid->getHexaIJK (Hex::Cyl1, 1, Hex::S_SE, 2)->remove (); + grid->getHexaIJK (Hex::Cyl1, 1, Hex::S_SE, 1)->remove (); + ********************************* */ +#endif + + doc->saveVtk ("croix.vtk"); + doc->dump (); + + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_pipes +void ModelTest::Test_pipes () +{ + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* ori1 = doc->addVertex ( 0,0,0); + Hex::Vertex* ori2 = doc->addVertex (-5,0,5); + Hex::Vector* vz = doc->addVector ( 0,0,1); + Hex::Vector* vx = doc->addVector ( 1,0,0); + + double h1 = 10, h2 = 10; + double ri1 = 1, ri2 = 1.5; + double re1 = 2, re2 = 3; + + Hex::Pipe* pipe1 = doc->addPipe (ori1, vz, ri1, re1, h1); + Hex::Pipe* pipe2 = doc->addPipe (ori2, vx, ri2, re2, h2); + Hex::CrossElements* grid = doc->makePipes (pipe1, pipe2); + + grid->dump(); + grid->dumpVertex(); + + doc->saveVtk ("pipes.vtk"); + doc->dump (); + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_lorraine +void ModelTest::Test_lorraine() +{ + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* ori1 = doc->addVertex ( 0,0,0); + Hex::Vertex* ori2 = doc->addVertex (-5,0,5); + Hex::Vertex* ori3 = doc->addVertex ( 0,0,12); + Hex::Vertex* ori4 = doc->addVertex (-5,0,17); + + Hex::Vector* vz = doc->addVector ( 0,0,1); + Hex::Vector* vx = doc->addVector ( 1,0,0); + + int nl1 = 10; + int nl2 = 10; + + double rsmall = 1; + double rmoy = 2; + double rbig = 3; + + Hex::Cylinder* cyl1 = doc->addCylinder (ori1, vz, rmoy, nl1); + Hex::Cylinder* cyl2 = doc->addCylinder (ori2, vx, rsmall, nl2); + + Hex::Cylinder* cyl3 = doc->addCylinder (ori3, vz, rmoy, nl1); + Hex::Cylinder* cyl4 = doc->addCylinder (ori4, vx, rbig, nl2); + + Hex::CrossElements* grid1 = doc->makeCylinders (cyl1, cyl2); + Hex::CrossElements* grid2 = doc->makeCylinders (cyl4, cyl3); + +#define Imprimer(x) printf (#x " = ") ; if (x) x->dump() ; else printf ("NULL\n") + const int nx_int = 0; + const int nx_ext = 1; + + // vc2 = grid1->getVertexIJK (Hex::Cyl2, 0,0,0); + // vc3 = grid2->getVertexIJK (Hex::Cyl1, 0,0,0); + // Cyl i j k + Hex::Quad* qb = grid1-> getQuadIJ (Hex::Cyl2, nx_ext, Hex::S_E, 4); + Hex::Quad* qh = grid2-> getQuadIJ (Hex::Cyl1, nx_ext, Hex::S_N, 0); + + Hex::Vertex* vb0 = qb->getVertex (3); + Hex::Vertex* vb1 = qb->getVertex (2); + Hex::Vertex* vh0 = qh->getVertex (0); + Hex::Vertex* vh1 = qh->getVertex (1); + + vb0 = grid1->getVertexIJK (Hex::Cyl2, 2, Hex::S_E, 4); // cible + vb1 = grid1->getVertexIJK (Hex::Cyl2, 2, Hex::S_NE, 4); + vh0 = grid2->getVertexIJK (Hex::Cyl1, 2, Hex::S_N, 0); // depart + vh1 = grid2->getVertexIJK (Hex::Cyl1, 2, Hex::S_NW, 0); + + Imprimer (vh0); + Imprimer (vh1); + Imprimer (vb0); + Imprimer (vb1); + + // qb->remove (); + // qh->remove (); + Hex::Quads hliste; + + hliste.push_back (qh); + for (int ny=1; nygetQuadIJ (Hex::Cyl1, nx_ext, ns, 0)); + } + + for (int ny=0; ny<4 ; ny++) + hliste.push_back (grid2->getQuadIJ (Hex::Cyl1, nx_int, ny, 0)); + + doc->joinQuads (hliste, qb, vh0, vb0, vh1, vb1, 5); + doc->saveVtk ("lorraine.vtk"); + // doc->dump (); + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_disconnect +void ModelTest::Test_disconnect () +{ + + const int size_x = 2; + const int size_y = 2; + const int size_z = 1; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig1 = doc->addVertex (0,0,0); + Hex::Vertex* orig2 = doc->addVertex (4,0,0); + Hex::Vertex* orig3 = doc->addVertex (8,0,0); + + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, size_x,size_y,size_z); + Hex::Elements* grid2 = doc->makeCartesian (orig2, dir, size_x,size_y,size_z); + Hex::Elements* grid3 = doc->makeCartesian (orig3, dir, size_x,size_y,size_z); + + int nvtk = 0; + doc->setLevel (1); + Hex::Matrix matrice; + Hex::Vector* ecart = doc->addVector (0.5,0.5,0); + matrice.defTranslation (ecart); + + Hex::Hexa* hexa1 = grid1->getHexaIJK (1,1,0); + Hex::Hexa* hexa2 = grid2->getHexaIJK (1,1,0); + Hex::Hexa* hexa3 = grid3->getHexaIJK (1,1,0); + + Hex::Quad* quad = grid1->getQuadJK (1,1,0); + Hex::Edge* edge = grid2->getEdgeK (1,2,0); + Hex::Vertex* vertex = grid3->getVertexIJK (1,1,1); + + quad->setScalar (5); + edge->setScalar (5); + vertex->setScalar (5); + + doc->saveVtk ("Test_disco", nvtk); + doc->disconnectQuad (hexa1, quad); + + hexa1 ->transform (&matrice); + doc->saveVtk ("Test_disco", nvtk); + + doc->disconnectEdge (hexa2, edge); + + hexa2->transform (&matrice); + doc->saveVtk ("Test_disco", nvtk); + + doc->disconnectVertex (hexa3, vertex); + + hexa3->transform (&matrice); + doc->saveVtk ("Test_disco", nvtk); + + doc->dumpPropagation (); + // doc->dump (); + + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_propagation +void ModelTest::Test_propagation () +{ + + const int size_x = 2; + const int size_y = 1; + const int size_z = 1; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + // Hex::Elements* grid = + doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + int nb = doc->countPropagation (); + for (int nro=0 ; nrogetPropagation (nro); + const Hex::Edges& table = prop->getEdges (); + printf (" ____________________________________ Prop nro %d\n", nro); + for (int ned=0 ; ned<(int)table.size() ; ned++) + { + bool way = table [ned]->getWay (); + + if (way) + { + printf (" ("); + table [ned]->getVertex (0)->printName (", "); + table [ned]->getVertex (1)->printName (")\n"); + } + else + { + printf (" ("); + table [ned]->getVertex (1)->printName (", "); + table [ned]->getVertex (0)->printName (")\n"); + } + } + } + + doc->dump (); + doc->saveVtk ("Test_propagation.vtk"); + doc->save ("Test_propagation"); + + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_move +void ModelTest::Test_move () +{ + + const int size_x = 1; + const int size_y = 1; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + Hex::Vector* enhaut = doc->addVector (0, 0, 5); + Hex::Vector* devant = doc->addVector (5, 0, 0); + // Hex::Vector* agauche = doc->addVector (0, 5, 0); + + Hex::Matrix matrice; + matrice.defTranslation (enhaut); + + Hex::Hexa* cube = grid->getHexa (1); + Hex::Quad* dessous = cube->getQuad (Hex::Q_A); + dessous->dump(); + + Hex::Elements* grid2 = doc->makeTranslation (grid, devant); + /* Hex::Elements* grid3 = doc->makeTranslation (grid, agauche); */ + Hex::Hexa* cube2 = grid2->getHexa (1); + + doc ->saveVtk ("move0.vtk"); + + cube ->disconnectQuad (dessous); + cube ->transform (&matrice); + cube2->transform (&matrice); + + doc ->saveVtk ("move1.vtk"); + doc ->dump(); + + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_deux_cyl +void ModelTest::Test_deux_cyl () +{ + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + + Hex::Vertex* orig1 = doc->addVertex (0,0,-5); + Hex::Vertex* orig2 = doc->addVertex (-5,0,0); + + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vy = doc->addVector (0,1,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + double dr = 1; + double da = 360; // degres + double dl = 1.0; + int nr = 2; + int na = 6; + int nl = 10; + + /* Hex::Elements* cyl1 = */ doc->makeCylindrical(orig1, vy,vz, dr, da, + dl,nr,na,nl); + + /* Hex::Elements* cyl2 = */ doc->makeCylindrical(orig2, vz,vx, dr/2, da, + dl,nr,na,nl); + doc->saveVtk ("deux_cylindres.vtk"); + CPPUNIT_ASSERT( true ); +} +// ======================================================== Test_move2 +void ModelTest::Test_transfo () +{ + + const int size_x = 1; + const int size_y = 1; + const int size_z = 2; + + int nvtk = 0; + cpchar fic_vtk = "transfo"; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument ("foo"); + doc ->setLevel (1); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x, size_y, + size_z); + if (grid==NULL) + CPPUNIT_ASSERT( false ); + + orig->setScalar(2); + + doc ->saveVtk (fic_vtk, nvtk); + + Hex::Vector* devant = doc->addVector (5, 0, 0); + + Hex::Elements* grid2 = doc->makeTranslation (grid, devant); + if (grid2==NULL) + CPPUNIT_ASSERT( false ); + doc ->saveVtk (fic_vtk, nvtk); + + Hex::Elements* grid3 = doc->makeScale (grid2, orig, 2); + if (grid3==NULL) + CPPUNIT_ASSERT( false ); + doc ->saveVtk (fic_vtk, nvtk); + + Hex::Elements* grid4 = doc->makeRotation (grid2, orig, dir, 45); + if (grid4==NULL) + CPPUNIT_ASSERT( false ); + doc ->saveVtk (fic_vtk, nvtk); + + Hex::Elements* grid5 = doc->makeSymmetryPoint (grid4, orig); + if (grid5==NULL) + CPPUNIT_ASSERT( false ); + + doc ->saveVtk (fic_vtk, nvtk); + + Hex::Vector* dir1 = doc->addVector (1,0,0); + Hex::Elements* grid6 = doc->makeSymmetryLine (grid4, orig, dir1); + if (grid6==NULL) + CPPUNIT_ASSERT( false ); + + grid4->getHexa(0)->getVertex(0)->setScalar(3); + grid6->getHexa(0)->getVertex(0)->setScalar(3); + doc ->saveVtk (fic_vtk, nvtk); + + grid4->getHexa(0)->getVertex(0)->setScalar(0); + grid6->getHexa(0)->getVertex(0)->setScalar(0); + + Hex::Elements* grid7 = doc->makeSymmetryLine (grid2, orig, dir1); + if (grid7==NULL) + CPPUNIT_ASSERT( false ); + + grid2->getHexa(0)->getVertex(0)->setScalar(4); + grid7->getHexa(0)->getVertex(0)->setScalar(4); + doc ->saveVtk (fic_vtk, nvtk); + + grid2->getHexa(0)->getVertex(0)->setScalar(0); + grid7->getHexa(0)->getVertex(0)->setScalar(0); + + Hex::Elements* grid8 = doc->makeSymmetryPlane (grid2, orig, dir1); + if (grid8==NULL) + CPPUNIT_ASSERT( false ); + + grid2->getHexa(0)->getVertex(0)->setScalar(4); + grid8->getHexa(0)->getVertex(0)->setScalar(4); + doc ->saveVtk (fic_vtk, nvtk); + grid2->getHexa(0)->getVertex(0)->setScalar(0); + grid8->getHexa(0)->getVertex(0)->setScalar(0); + + Hex::Elements* grid9 = doc->makeSymmetryPlane (grid3, orig, dir); + if (grid9==NULL) + CPPUNIT_ASSERT( false ); + + grid3->getHexa(0)->getVertex(0)->setScalar(4); + grid9->getHexa(0)->getVertex(0)->setScalar(4); + doc ->saveVtk (fic_vtk, nvtk); + + grid9->getHexa(0)->removeConnected (); + doc ->saveVtk (fic_vtk, nvtk); + + CPPUNIT_ASSERT( true ); +} + + + + + diff --git a/src/TEST_CPP/ModelTest.hxx b/src/TEST_CPP/ModelTest.hxx new file mode 100755 index 0000000..f75314d --- /dev/null +++ b/src/TEST_CPP/ModelTest.hxx @@ -0,0 +1,102 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __ModelTest__ +#define __ModelTest__ + +#include +#include + +#include "hexa_base.hxx" +// #include "Hex.hxx" +#include "HexDocument.hxx" +#include "HexEltBase.hxx" + +class ModelTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( ModelTest ); + CPPUNIT_TEST( myTest_croix); + CPPUNIT_TEST( Test_croix); + CPPUNIT_TEST( Test_disconnect); + CPPUNIT_TEST( Test_joint); + CPPUNIT_TEST( Test_prism); + CPPUNIT_TEST( Test_cylinder); + CPPUNIT_TEST( Test_find); + CPPUNIT_TEST( Test_lorraine); + CPPUNIT_TEST( Test_propagation); + CPPUNIT_TEST( Test_cartesi1); + CPPUNIT_TEST( Test_decoupage); + CPPUNIT_TEST( Test_grille_cyl); + CPPUNIT_TEST( Test_pipes); + CPPUNIT_TEST( Test_separ); + CPPUNIT_TEST( Test_clone); + CPPUNIT_TEST( Test_deux_cyl); + CPPUNIT_TEST( Test_hexa1); + CPPUNIT_TEST( Test_prism2); + CPPUNIT_TEST( Test_transfo); + CPPUNIT_TEST( Test_hexa1); + CPPUNIT_TEST( Test_move); + CPPUNIT_TEST( Test_gen_xml); + CPPUNIT_TEST( Test_relecture); + CPPUNIT_TEST_SUITE_END(); + + public: + ModelTest(void); + ~ModelTest(void); + //~ Call before tests + void setUp(void) {} + //~ Call after tests + void tearDown(void) {} + +// void Test_bielle(); + void myTest_croix(); + void Test_croix(); + void Test_disconnect(); + void Test_joint(); + void Test_prism(); +// void Test_bride(); + void Test_cylinder(); + void Test_find(); + void Test_lorraine(); + void Test_propagation(); +// void Test_bug1(); +// void Test_debride(); + void Test_gen_xml(); + void Test_move(); + void Test_relecture(); + void Test_cartesi1(); + void Test_decoupage(); + void Test_grille_cyl(); + void Test_pipes(); + void Test_separ(); + void Test_clone(); + void Test_deux_cyl(); + void Test_hexa1(); + void Test_prism2(); + void Test_transfo(); + + private: + int _afficher (cpchar nom, Hex::EltBase* elt); + void _print_propagations (Hex::Document* doc); +// HEXA_NS::Hex *_myHexEngine; +// HEXA_NS::Document *_myDoc; + +}; + +#endif diff --git a/src/TEST_CPP/Test_HEXABLOCK.cxx b/src/TEST_CPP/Test_HEXABLOCK.cxx new file mode 100755 index 0000000..ab912d5 --- /dev/null +++ b/src/TEST_CPP/Test_HEXABLOCK.cxx @@ -0,0 +1,167 @@ +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include +#include +#include +#include +#include +#include +#include + +#include "test_unit.hxx" + +#define TestUnit(call) display(#call); ier=call(nbargs,tabargs); display(ier) + +static int total_tests = 0; +static int total_errors = 0; +static cpchar test_name = "Unknown"; + +static void display (cpchar name); +static void display (int ier); + +// ============================================================== Main +int main (int nbargs, cpchar tabargs []) +{ + int ier; + + goto_workspace (); + + TestUnit (test_sphere ); + TestUnit (test_joint ); + TestUnit (test_prism ); + TestUnit (test_revolution9 ); + TestUnit (test_revolution ); + TestUnit (test_coude ); + TestUnit (test_count ); + TestUnit (test_decoupage ); + TestUnit (test_gen_xml ); + TestUnit (test_string_xml ); + /// TestUnit (test_relecture ); + TestUnit (test_spherical); + TestUnit (test_grille_cyl ); + TestUnit (test_cylindrical ); + TestUnit (test_cylinder ); + TestUnit (test_xml_cylinder ); + TestUnit (test_pipe ); + TestUnit (test_joint2 ); + TestUnit (test_croix ); + TestUnit (test_pipes ); + TestUnit (test_lorraine); + TestUnit (test_disconnect2 ); + TestUnit (test_disconnect4 ); + TestUnit (test_disconnect1 ); + TestUnit (test_disconnect3 ); + TestUnit (test_disconnect ); + TestUnit (test_transfo2 ); + TestUnit (test_transfo ); + TestUnit (test_copy_document ); + TestUnit (test_cylindricals ); + // Dans test_quads + TestUnit (test_hexa_quads_5 ); + TestUnit (test_hexa_quads_ab ); + TestUnit (test_hexa_quads_ac ); + TestUnit (test_hexa_quads_ace ); + TestUnit (test_hexa_quads_acd ); + TestUnit (test_hexa_quads_abcd ); + TestUnit (test_hexa_quads_abce ); + TestUnit (test_cramer ); + TestUnit (test_hexa_quads_ac1 ); + TestUnit (test_asso_grid ); + TestUnit (test_piquage ); + TestUnit (test_replace ); + TestUnit (test_hemispheres ); + + free_workspace (); + + cout << "========================================= " + << endl; + cout << "==== End of tests : Number of Errors = " << total_errors << " / " << total_tests + << endl; + cout << "========================================= " + << endl; + + return total_errors==0 ? 0 : 1; +} + +// ============================================================== main-type +int main_standard (int argc, char* argv[]) +{ + // Retrieve test path from command line first argument. Default to "" which resolve + // to the top level suite. + std::string testPath = (argc > 1) ? std::string(argv[1]) : std::string(""); + + // Create the event manager and test controller + CPPUNIT_NS::TestResult controller; + + // Add a listener that collects test result + CPPUNIT_NS::TestResultCollector result; + + controller.addListener( &result ); + + // Add a listener that print dots as test run. + CPPUNIT_NS::BriefTestProgressListener progress; + + controller.addListener( &progress ); + + // Add the top suite to the test runner + CPPUNIT_NS::TestRunner runner; + runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); + runner.run( controller ); + + // Print test in a compiler compatible format. + CPPUNIT_NS::CompilerOutputter outputter( &result, CPPUNIT_NS::stdCOut() ); + outputter.write(); + + // Uncomment this for XML output + std::ofstream file( "cppunit-report.xml" ); + + CPPUNIT_NS::XmlOutputter xml( &result, file ); + + xml.write(); + + file.close(); + + return result.wasSuccessful() ? 0 : 1; +} +// ============================================================= display name +void display (cpchar nom) +{ + test_name = nom; + cout << endl; + cout << "========================================= Run " + << test_name << endl; +} +// ============================================================= display ier +void display (int result) +{ + cout << ".........................................." + << " End of " << test_name; + total_tests++; + if (result==0) + { + cout << ", Successfull"; + } + else { + cout << ", Code error = " << result; + total_errors++; + }; + cout << endl; + +} diff --git a/src/TEST_CPP/test_hexa1.cxx b/src/TEST_CPP/test_hexa1.cxx new file mode 100755 index 0000000..84217fd --- /dev/null +++ b/src/TEST_CPP/test_hexa1.cxx @@ -0,0 +1,1940 @@ + +// C++ : Tests unitaires + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "test_unit.hxx" + +#include "test_unit.hxx" + +#include "Hex.hxx" +#include "HexDocument.hxx" +#include "HexElements.hxx" +#include "HexCrossElements.hxx" + +#include "HexHexa.hxx" +#include "HexQuad.hxx" +#include "HexEdge.hxx" +#include "HexVertex.hxx" + +#include "HexPropagation.hxx" +#include "HexShape.hxx" +#include "HexLaw.hxx" +#include "HexMatrix.hxx" +#include "HexCramer.hxx" +#include "HexGroup.hxx" + + +#include + +static int nbr_vtk = 0; +static cpchar case_name = "hexa"; +static Hex::Document* docu = NULL; + +// ======================================================== print_propagations +void print_propagations (Hex::Document* doc) +{ + int nb = doc->countPropagation (); + HexDisplay (nb); + for (int nro=0 ; nrogetPropagation (nro); + const Hex::Edges& table = prop->getEdges (); + printf (" ____________________________________ Prop nro %d\n", nro); + for (int ned=0 ; ned<(int)table.size() ; ned++) + { + bool way = table [ned]->getWay (); + Hex::Edge* edge = table [ned]; + Hex::Vertex* v0 = edge->getVertex (0); + Hex::Vertex* v1 = edge->getVertex (1); + + if (way) + { + printf (" ("); + v0->printName (", "); + v1->printName (")\n"); + } + else + { + v1->printName (", "); + v0->printName (")\n"); + printf (" ("); + } + } + } +} +// ======================================================== save_vtk +void save_vtk () +{ + if (docu==NULL) + return; + + docu->saveVtk (case_name, nbr_vtk); +} +// ======================================================== remove_hexa +void remove_hexa (Hex::Hexa* hexa) +{ + if (hexa==NULL) + return; + + hexa->remove(); + + if (docu==NULL) + return; + + docu->saveVtk (case_name, nbr_vtk); +} +// ======================================================== test_sphere +int test_sphere (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + Hex::Vertex* orig = doc->addVertex (0,0,0); + + int ncouches = 0; + double k = 1; + double rayon = 1; + Hex::Elements* sphere = doc->makeSpherical (orig, rayon, ncouches, k); + + if (ncouches>0) + { + for (int nc=0 ; nc <= ncouches ; nc++) + { + Hex::Hexa* cell = sphere->getStrate (nc, Hex::Q_A); + if (nc==0) + cell->dumpFull(); + cell->remove (); + // sphere->getStrate (nc, Hex::Q_A)->remove (); + // sphere->getStrate (nc, Hex::Q_B)->remove (); + } + } + + sphere->saveVtk ("sphere.vtk"); + return HOK; +} +// ======================================================== test_cartesi1 +int test_cartesi1 () +{ + const int size_x = 15; + const int size_y = 12; + const int size_z = 8; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + Hex::Vertex* orig = doc->addVertex (0,0,0); + + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + // print_propagations (doc); + + for (int nz=0; nzgetHexaIJK (nx, ny, nz); + cell->remove (); + } + + doc->setLevel (1); + print_propagations (doc); + grid->saveVtk ("grid_cart.vtk"); + + // doc->dump (); + return HOK; +} +// ======================================================== afficher +#define Afficher(elt) afficher (#elt, elt) +int afficher (cpchar nom, Hex::EltBase* elt) +{ + if (elt==NULL) + { + printf (" .... %s = 0x0\n", nom); + return HOK; + } + + printf (" .... %s = 0x%08lx = %03d\n", nom, (unsigned long) elt, elt->getId()); + return HOK; +} +// ======================================================== test_find +int test_find () +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + grid->saveVtk ("mini1.vtk"); + doc->dump (); + + Hex::Vertex *v00, *v02, *v06, *v08, *v10, *v22, *v26; + + Afficher ( v00 = doc->findVertex (0, 0, 0)); + Afficher ( v02 = doc->findVertex (1, 1, 0)); + Afficher ( v06 = doc->findVertex (1, 1, 1)); + Afficher ( v08 = doc->findVertex (2, 1, 0)); + Afficher ( v10 = doc->findVertex (2, 1, 1)); + Afficher ( v22 = doc->findVertex (2, 1, 2)); + Afficher ( v26 = doc->findVertex (2, 2, 2)); + + printf ("\n"); + + Afficher (doc->findEdge (v06, v10)); + Afficher (doc->findEdge (v10, v06)); + printf ("\n"); + + Afficher (doc->findQuad (v02, v10)); + Afficher (doc->findQuad (v06, v08)); + Afficher (doc->findQuad (v02, v06)); + + printf ("\n"); + Afficher (doc->findHexa (v00, v06)); + Afficher (doc->findHexa (v06, v26)); + Afficher (doc->findHexa (v26, v06)); + + return HOK; +} +// ======================================================== test_joint +int test_joint (int nbargs, cpchar tabargs[]) +{ + const int dimx = 11; + const int dimy = 11; + const int dimz = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + + Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, dimx,dimy,dimz); + + Hex::Vertex* orig2 = doc->addVertex (dimx/2.0,0,8); + Hex::Vector* vectj = doc->addVector (0,1,0); + Hex::Vector* vecti = doc->addVector (1,0,0); + Hex::Elements* grid2 = doc->makeCylindrical (orig2, vecti, vectj, + 1, 180, 1, dimz,dimy,dimx); + + int mx = dimx/2; + int my = dimy/2; + Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz); + Hex::Quad* cible = grid2->getQuadJK (dimz, mx, my); + + Hex::Vertex* v1 = prems->getVertex (0); + Hex::Vertex* v3 = prems->getVertex (1); + + Hex::Vertex* v2 = cible->getVertex (1); + Hex::Vertex* v4 = cible->getVertex (2); + + // v1->setScalar (3); + // v2->setScalar (3); + // v3->setScalar (6); + // v4->setScalar (6); + + Hex::Quads liste; + + liste.push_back (prems); + for (int nx=0; nxgetQuadIJ (nx, my, dimz)); + + for (int ny=0; nygetQuadIJ (mx, ny, dimz)); + + doc->saveVtk ("joint1.vtk"); + const int hauteur = 5; + Hex::Elements* joint = doc->joinQuads(liste, cible, v1,v2,v3,v4, hauteur); + // for (int nh=0 ; nhgetHexa(nh)->setScalar (5); + + int nbr_joint_vertex = joint->countVertex (); + int nbr_surf_vertex = nbr_joint_vertex/(hauteur+1); + + HexDisplay (nbr_joint_vertex); + HexDisplay (nbr_surf_vertex); + + int indice0 = joint->findVertex (v1); + HexDisplay (indice0); + + for (int nh=0 ; nhgetVertex(nh)->setScalar (5); + + for (int nh=0 ; nh<=hauteur ; nh++) + joint->getVertex(nh*nbr_surf_vertex)->setScalar (3); + + doc->saveVtk ("joint2.vtk"); + return HOK; +} +// ======================================================== test_prism +int test_prism (int nbargs, cpchar tabargs[]) +{ + const int dimx = 11; + const int dimy = 11; + const int dimz = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex ( 0,0,0); + Hex::Vector* dir1 = doc->addVector ( 1,1,1); + Hex::Vector* dir2 = doc->addVector ( 1,1,-1); + + Hex::Elements* grid1 = doc->makeCartesian (orig1, dir1, dimx,dimy,dimz); + + int mx = dimx/2; + int my = dimy/2; + Hex::Quads liste1, liste2; + + liste1.push_back (grid1->getQuadIJ (mx, my, dimz)); + liste2.push_back (grid1->getQuadIJ (mx, my, 0)); + for (int nx=0; nxgetQuadIJ (nx, my, dimz)); + liste2.push_back (grid1->getQuadIJ (nx, my, 0)); + } + + for (int ny=0; nygetQuadIJ (mx, ny, dimz)); + liste2.push_back (grid1->getQuadIJ (mx, ny, 0)); + } + + Hex::RealVector tlen; + double dh = 2; + for (int nro=0; nro<5; nro++) + { + dh = 2*dh + 1; + tlen.push_back (dh); + } + + const int nbiter = 5; + doc->saveVtk ("prisme1.vtk"); + Hex::Elements* prisme2 = doc->prismQuads (liste2, dir2, nbiter); + doc->saveVtk ("prisme2.vtk"); + + Hex::Elements* prisme1 = doc->prismQuadsVec (liste1, dir1, tlen, 0); + + PutData (liste1.size()); + PutData (tlen.size()); + PutData (prisme1->countHexa()); + PutData (prisme1->countQuad()); + PutData (prisme1->countEdge()); + PutData (prisme1->countVertex()); + + for (int nro=0 ; nro getHexa (nbiter+nro); + cell->setScalar (5); + } + + doc->saveVtk ("prisme3.vtk"); + return HOK; +} +// ======================================================== test_revolution9 +int test_revolution9 (int nbargs, cpchar tabargs[]) +{ + const int dimx = 11; + const int dimy = 11; + const int dimz = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + + Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, dimx,dimy,dimz); + + int mx = dimx/2; + int my = dimy/2; + Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz); + Hex::Quads liste; + + liste.push_back (prems); + prems -> setScalar (5); + for (int nx=0; nxgetQuadIJ (nx, my, dimz); + liste.push_back (cell); + cell -> setScalar (5); + } + + for (int ny=0; nygetQuadIJ (mx, ny, dimz); + liste.push_back (cell); + cell -> setScalar (5); + } + + Hex::Vertex* center = doc->addVertex (0, -10, 0); + Hex::Vector* axis = doc->addVector (1, 0, 0); + Hex::RealVector angles; + + Hex::Vector* dir1 = doc->addVector (10,0.3,0.3); + Hex::Elements* grid2 = doc->makeCartesian (center, dir1, 1,1,1); + Hex::Hexa* cell = grid2->getHexaIJK (0,0,0); + cell->setScalar (5); + + doc->saveVtk ("revolution1.vtk"); + + double alpha = 5; + int niter = 5; + double coeff = 1.5; + for (int na=0 ; narevolutionQuads (liste, center, axis, angles); + if (bloc != NULL) + doc->saveVtk ("revolution2.vtk"); + + return HOK; +} +// ======================================================== test_revolution +int test_revolution (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* ori = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + int dr = 1; + int da = 360; + int dl = 1; + + int nr = 1; + int na = 6; + int nl = 1; + + Hex::Elements* grid = doc->makeCylindrical (ori, vx,vz, dr,da,dl, + nr,na,nl, false); + + Hex::Quads liste; + for (int nx=0; nxgetQuadIJ (nx, ny, nl); + liste.push_back (cell); + cell -> setScalar (5); + } + + Hex::Vertex* center = doc->addVertex (0, -10, 0); + Hex::Vector* axis = doc->addVector (1, 0, 0); + Hex::RealVector angles; + + Hex::Vector* dir1 = doc->addVector (10,0.3,0.3); + Hex::Elements* grid2 = doc->makeCartesian (center, dir1, 1,1,1); + Hex::Hexa* cell = grid2->getHexaIJK (0,0,0); + cell->setScalar (5); + + doc->saveVtk ("revolution1.vtk"); + + double alpha = 5; + int niter = 5; + double coeff = 1.5; + for (int na=0 ; narevolutionQuads (liste, center, axis, angles); + if (bloc != NULL) + doc->saveVtk ("revolution2.vtk"); + + return HOK; +} +// ======================================================== test_coude +int test_coude (int nbargs, cpchar tabargs[]) +{ +#if 0 + const int dimx = 11; + const int dimy = 11; + const int dimz = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + // grid1 = doc->makeCartesian (orig1, dir, dimx,dimy,dimz); + double dr = 1; + int dl = 5; + int nr = 4; + int na = 8; + + Hex::Elements* grid1 = doc->makeCylindrical (orig1, vx,vz,dr,360, dl, + nr, 10, nl, false); + int mx = dimx/2; + int my = dimy/2; + Hex::Quad* prems = grid1->getQuadIJ (mx, my, dimz); + Hex::Quads liste; + + liste.push_back (prems); + prems -> setScalar (5); + for (int nx=0; nxgetQuadIJ (nx, my, dimz); + liste.push_back (cell); + cell -> setScalar (5); + } + + for (int ny=0; nygetQuadIJ (mx, ny, dimz); + liste.push_back (cell); + cell -> setScalar (5); + } + + + Hex::Vertex* center = doc->addVertex (0, -10, 0); + Hex::Vector* axis = doc->addVector (1, 0, 0); + Hex::RealVector angles; + + Hex::Vector* dir1 = doc->addVector (10,0.3,0.3); + Hex::Elements* grid2 = doc->makeCartesian (center, dir1, 1,1,1); + Hex::Hexa* cell = grid2->getHexaIJK (0,0,0); + cell->setScalar (5); + + doc->saveVtk ("revolution1.vtk"); + + double alpha = 5; + int niter = 5; + double coeff = 1.5; + for (int na=0 ; narevolutionQuads (liste, center, axis, angles); + if (bloc != NULL) + doc->saveVtk ("revolution2.vtk"); +#endif + return HOK; +} +// ======================================================== test_count +int test_count (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex ( 0, 0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + double dr = 1; + double dl = 1; + int nr = 2; + int nl = 3; + + Hex::Elements* c1; + + c1 = doc->makeCylindrical (orig1, vx,vz,dr, 360, dl,nr, 10, nl, false); + + HexDisplay (doc->countVertex ()); + HexDisplay (doc->countUsedVertex ()); + doc ->saveVtk ("hexa1.vtk"); + + return HOK; +} +// ======================================================== test_decoupage +int test_decoupage (int nbargs, cpchar tabargs[]) +{ + const int size_x = 2; + const int size_y = 1; + const int size_z = 1; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + Hex::Edge* arete = grid->getEdgeK (0, 0, 0); + + // doc ->dump (); + int nvtk=0; + doc ->saveVtk ("decoupe", nvtk); +/* Hex::Elements* grid2 = */ doc->cut (arete, 1); + + /// doc ->dump (); + doc ->saveVtk ("decoupe", nvtk); + + return HOK; +} +// ======================================================== test_gen_xml +int test_gen_xml (int nbargs, cpchar tabargs[]) +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + Hex::Hexa* cell = grid->getHexa (0); + Hex::Quad* face = cell->getQuad (0); + Hex::Edge* arete = cell->getEdge (0); + Hex::Vertex* noeud = cell->getVertex (0); + + Hex::Shape* shape1 = new Hex::Shape("riri"); + Hex::Shape* shape2 = new Hex::Shape("fifi"); + Hex::Shape* shape3 = new Hex::Shape("loulou"); + + noeud->setAssociation (shape1); + arete->setAssociation (shape2); + face ->setAssociation (shape3); + + Hex::Law* law1 = doc->addLaw("loi1", 1); + Hex::Law* law2 = doc->addLaw("loi2", 2); + Hex::Law* law3 = doc->addLaw("loi3", 3); + + law1->setKind (Hex::Uniform); + law2->setKind (Hex::Arithmetic); + law3->setKind (Hex::Geometric); + + Hex::Propagation* prop1 = doc->getPropagation (0); + Hex::Propagation* prop2 = doc->getPropagation (1); + Hex::Propagation* prop3 = doc->getPropagation (2); + + prop1->setLaw (law1); + prop2->setLaw (law2); + prop3->setLaw (law3); + + prop1->setWay (true); + prop2->setWay (false); + prop3->setWay (true); + + doc ->saveVtk ("mini.vtk"); + doc ->save ("Essai"); + + return HOK; +} +// ======================================================== test_string_xml +int test_string_xml (int nbargs, cpchar tabargs[]) +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + Hex::Hexa* cell = grid->getHexa (0); + Hex::Quad* face = cell->getQuad (0); + Hex::Edge* arete = cell->getEdge (0); + Hex::Vertex* noeud = cell->getVertex (0); + + Hex::Shape* shape1 = new Hex::Shape("riri"); + Hex::Shape* shape2 = new Hex::Shape("fifi"); + Hex::Shape* shape3 = new Hex::Shape("loulou"); + + noeud->setAssociation (shape1); + arete->setAssociation (shape2); + face ->setAssociation (shape3); + + Hex::Law* law1 = doc->addLaw("loi1", 1); + Hex::Law* law2 = doc->addLaw("loi2", 2); + Hex::Law* law3 = doc->addLaw("loi3", 3); + + law1->setKind (Hex::Uniform); + law2->setKind (Hex::Arithmetic); + law3->setKind (Hex::Geometric); + + Hex::Propagation* prop1 = doc->getPropagation (0); + Hex::Propagation* prop2 = doc->getPropagation (1); + Hex::Propagation* prop3 = doc->getPropagation (2); + + prop1->setLaw (law1); + prop2->setLaw (law2); + prop3->setLaw (law3); + + prop1->setWay (true); + prop2->setWay (false); + prop3->setWay (true); + + doc ->saveVtk ("mini.vtk"); + doc ->save ("Essai"); + + cpchar flux = doc ->getXml (); + Hex::Document* docbis = mon_ex.addDocument (); + docbis->setXml (flux); + docbis->saveVtk ("clone.vtk"); + + return HOK; +} +// ======================================================== test_relecture +int test_relecture (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + cpchar nomdoc = "Essai"; + if (nbargs>1) + nomdoc = tabargs[1]; + Hex::Document* doc = mon_ex.loadDocument (nomdoc); + +/********************* + Hex::Vertex* v4 = doc->findVertex (80.0, 0.0, 0.0); + Hex::Vertex* v5 = doc->findVertex (80.0, 0.0, 40.0); + Hex::Edge* e4 = doc->findEdge (v4, v5); + + HexDump (v4); + HexDump (v5); + HexDump (e4); + + e4->setScalar (5); +***********************/ + + doc ->dump (); + doc ->saveVtk ("restore.vtk"); + doc ->save ("restore"); + + // doc ->reorderFaces (); + // doc ->dump (); + + // Hex::Elements* grid2 = doc->cut (e4, 2); + return HOK; +} +// ======================================================== test_clone +int test_clone () +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + Hex::Vector* bond = doc->addVector (0, 0, 7); + Hex::Elements* grid2 = doc->makeTranslation (grid, bond); + + doc ->saveVtk ("clonage.vtk"); + doc ->dump(); + + HexDump (grid2->getHexa (1)); + HexDump (grid2->getHexaIJK (1,1,1)); + HexDump (grid2->getVertexIJK (1,1,1)); + + return HOK; +} +// ======================================================== test_separ +int test_separ () +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + // Hex::Elements* grid = + doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + doc ->saveVtk ("separ.vtk"); + doc ->dump(); + + return HOK; +} +// ======================================================== test_shperical +int test_spherical (int nbargs, const char* tabargs[]) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + double rayon = 1; + int nbr = 3; + + Hex::Elements* grid = doc->makeSpherical (orig, rayon, nbr); + + int nbhexas = grid->countHexa (); + HexDisplay (nbhexas); + for (int nro=0 ; nrogetHexa(nro)->remove(); + HexDisplay (doc->countHexa ()); + doc->saveVtk ("shperical.vtk"); + // doc->dump (); + + return HOK; +} +// ================================================== test_grille_cyl +int test_grille_cyl (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex ( 0, 0,0); + Hex::Vertex* orig2 = doc->addVertex (10, 0,0); + + Hex::Vertex* orig3 = doc->addVertex ( 0,10,0); + Hex::Vertex* orig4 = doc->addVertex (10,10,0); + + Hex::Vertex* orig5 = doc->addVertex ( 0,20,0); + Hex::Vertex* orig6 = doc->addVertex (10,20,0); + + Hex::Vector* vz = doc->addVector (0,0,1); + Hex::Vector* vx = doc->addVector (1,0,0); + + double dr = 1; + double dl = 1; + int nr = 2; + int nl = 3; + + Hex::Elements *c1, *c2, *c3, *c4, *c5, *c6; + + c1 = doc->makeCylindrical (orig1, vx,vz,dr, 360, dl,nr, 4, nl, true); + c2 = doc->makeCylindrical (orig2, vx,vz,dr, 360, dl,nr, 8, nl, true); + c3 = doc->makeCylindrical (orig3, vx,vz,dr, 270, dl,nr, 8, nl, true); + c4 = doc->makeCylindrical (orig4, vx,vz,dr, 270, dl,nr, 7, nl, true); + c5 = doc->makeCylindrical (orig5, vx,vz,dr, 360, dl,nr, 5, nl, true); + c6 = doc->makeCylindrical (orig6, vx,vz,dr, 360, dl,nr, 6, nl, true); + + int base2 = nr*nl*8; + c2->getHexa(base2 + 0)->setScalar (5); + c2->getHexa(base2 + 1)->setScalar (5); + c2->getHexa(base2 + 2)->setScalar (5); + + doc->saveVtk ("cylindres.vtk"); + // doc->dump (); + + return HOK; +} +// ================================================== test_asso_line +int test_asso_line (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex ( 0, 0,0); + + Hex::Vector* vz = doc->addVector (0,0,1); + Hex::Vector* vx = doc->addVector (1,0,0); + + double dr = 1; + double dl = 1; + int nr = 2; + int nl = 3; + int ntheta = 8; + + Hex::Elements *c1 = NULL; + + c1 = doc->makeCylindrical (orig1, vx,vz,dr, 360, dl,nr, ntheta, nl, true); + + Hex::Edges m_line; + Hex::Edge* m_start = c1->getEdgeJ (nr, 1, 0); + + for (int na=2 ; nagetEdgeJ (nr, na, 0); + arete->setScalar (5); + m_line.push_back (arete); + } + + // m_line.push_back (c1->getEdgeJ (nr, 0, 2)); + // m_line.push_back (NULL); + Hex::Shape* gstart = NULL; + Hex::Shapes gline; + double pstart = 0 , pend = 0; + + int ier = doc-> associateOpenedLine (m_start, m_line, + gstart, pstart, gline, pend); + HexDisplay (ier); + doc->saveVtk ("asso_line.vtk"); + + m_line.push_back (c1->getEdgeJ (nr, 0, 0)); + Hex::Vertex* m_first = m_start->getVertex (Hex::V_AMONT); + ier = doc-> associateClosedLine (m_first, m_start, m_line, + gstart, pstart, false, gline); + HexDisplay (ier); + // doc->dump (); + + return HOK; +} +// ===================================================== test_cylindrical +int test_cylindrical (int nbargs, cpchar tabargs[]) +{ + cpchar fic_vtk = "cylindre"; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0, 0, 0); + Hex::Vector* vx = doc->addVector (1, 0, 0); + Hex::Vector* vz = doc->addVector (0, 0, 1); + + double dr = 1; + double da = 360; + double dl = 1; + + int nr = 1; + int na = 8; + int nl = 2; + + if (nbargs>1) + { + na = atoi (tabargs[1]); + HexDisplay (na); + if (na <= 2) + na = 8; + } + + if (nbargs>2) + { + da = atof (tabargs[2]); + HexDisplay (da); + } + + // Hex::Cylinder* cyl = doc->addCylinder (orig, vz, nr, nl); + // Hex::Elements* grid = doc->makeCylinder (cyl, vx, nr, na, nl); + doc->makeCylindrical (orig,vx, vz, dr,da,dl, nr,na, nl, true); + doc ->saveVtk (fic_vtk, na); + return HOK; +} +// ===================================================== test_cylinder +int test_cylinder (int nbargs, cpchar tabargs[]) +{ + int nvtk = 1; + cpchar fic_vtk = "cylindre"; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0, 0, 0); + Hex::Vector* vx = doc->addVector (1, 0, 0); + Hex::Vector* vz = doc->addVector (0, 0, 1); + + double rayon = 10; + double hauteur = 6; + + int nr = 2; + int na = 8; + int nl = 5; + + Hex::Cylinder* cyl = doc->addCylinder (orig, vz, rayon, hauteur); + doc->makeCylinder (cyl, vx, nr, na, nl); + doc ->saveVtk (fic_vtk, nvtk); + return HOK; +} +// ===================================================== test_xml_cylinder +int test_xml_cylinder (int nbargs, cpchar tabargs[]) +{ + int nvtk = 0; + cpchar fic_vtk = "cylindre"; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex (0, 0,0); + Hex::Vertex* orig2 = doc->addVertex (50,0,0); + Hex::Vector* vz = doc->addVector (0,0,1); + Hex::Vector* vx = doc->addVector (1,0,0); + + vx->setName ("vx"); + vz->setName ("vz"); + orig1->setName ("orig1"); + orig2->setName ("orig2"); + + int nr = 4; + int nri = 3; + int nre = nr; + int na = 9; + int nl = 5; + + Hex::Cylinder* cyl = doc->addCylinder (orig1, vz, nr, nl); + Hex::Pipe* pipe = doc->addPipe (orig2, vz, nri, nre, nl); + + Hex::Elements* grid = doc->makeCylinder (cyl, vx, nr, na, nl); + doc ->saveVtk (fic_vtk, nvtk); + + Hex::Group* groupe = doc->addGroup ("GroupeAMA", Hex::HexaCell); + groupe->addElement (grid->getHexaIJK (0,0,0)); + groupe->addElement (grid->getHexaIJK (1,0,0)); + groupe->addElement (grid->getHexaIJK (0,1,0)); + groupe->addElement (grid->getHexaIJK (1,1,0)); + groupe->addElement (grid->getHexaIJK (2,1,0)); + + grid->getHexaIJK (0,0,0)->setName ("Hexa0"); + grid->getQuadIJ (0,0,0)->setName ("QuadIJ0"); + grid->getEdgeK (0,0,0)->setName ("EdgeK0"); + + doc->makePipe (pipe, vx, nr, na, nl); + doc ->saveVtk (fic_vtk, nvtk); + doc->save ("cylindre"); + + return HOK; +} +// ===================================================== test_pipe +int test_pipe (int nbargs, cpchar tabargs[]) +{ + int nvtk = 0; + cpchar fic_vtk = "cylindre"; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex (0, 0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vy = doc->addVector (0,1,0); + + int nr = 1; + int nri = 1; + int nre = 2; + int na = 2; + int nl = 1; + + Hex::Pipe* pipe = doc->addPipe (orig1, vx, nri, nre, nl); + doc->makePipe (pipe, vy, nr, na, nl); + doc ->saveVtk (fic_vtk, nvtk); + + return HOK; +} +// ======================================================== del_hexa +void del_hexa (Hex::CrossElements* gr, int cyl, int ni, int nj, int nk, int dr) +{ + Hex::Hexa* hexa = gr->getHexaIJK (cyl, ni, nj, nk); + if (hexa!=NULL) + { + hexa->remove (); + if (dr>1) + save_vtk (); + } +} +// ======================================================== del_tranche +int del_tranche (Hex::CrossElements* grid, int cyl, int ni, int nk, int dr=1) +{ + for (int nj = 0 ; nj < 8 ; nj++) + del_hexa (grid, cyl, ni, nj, nk, dr); + + if (dr==1) + save_vtk (); + printf ("del_tranche (g=%d, i=%d, k=%d) : fic = %d\n", + cyl, ni, nk, nbr_vtk-1); + return nbr_vtk; +} +// ======================================================== test_joint2 +int test_joint2 (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + docu = mon_ex.addDocument (); + case_name = "pb_joint"; + + Hex::Vector* vx = docu->addVector (1, 0, 0); + Hex::Vector* vz = docu->addVector (0, 0, 1); + Hex::Vertex* hori = docu->addVertex (0, 0, 0); + + double da = 360; + double dr = 2; + double dl = 1; + int nr = 1; + int na = 8; + int nl = 1; + bool fill = true; + + Hex::Elements *bgrid=NULL, *hgrid=NULL; + + hgrid = docu->makeCylindrical (hori, vx,vz, dr,da,dl, nr,na,nl, fill); + docu->dump (); + save_vtk (); + + Hex::Vertex* bori = docu->addVertex (0, 0, -5); + bgrid = docu->makeCylindrical (bori, vx,vz, dr,da,dl, nr,na,nl, fill); + save_vtk (); + + Hex::Quads qsource, qdest; + printf (" Source = "); + for (int ny=0 ; ny< na ; ny++) + { + Hex::Quad* quad = hgrid->getQuadIJ (0, ny, 0); + PrintName (quad); + qsource.push_back (quad); + } + printf ("\n "); + for (int ny=0 ; ny<4 ; ny++) + { + Hex::Quad* quad = hgrid->getKerHQuad (ny); + PrintName (quad); + qsource.push_back (quad); + } + printf ("\n"); + + + printf (" Cible = "); + for (int ny=0 ; ny< na ; ny++) + { + Hex::Quad* quad = bgrid->getQuadIJ (0, ny, 1); + PrintName (quad); + qdest.push_back (quad); + } + printf ("\n "); + for (int ny=0 ; ny<4 ; ny++) + { + Hex::Quad* quad = bgrid->getKerHQuad (ny+4); + PrintName (quad); + qdest.push_back (quad); + } + printf ("\n"); + docu ->setLevel (1); + Hex::Quad* cible = bgrid->getQuadIJ (0, 1, 1); + Hex::Vertex* vc1 = bgrid->getVertexIJK (0, 1, 1); + Hex::Vertex* vc2 = bgrid->getVertexIJK (1, 1, 1); + + Hex::Vertex* vs1 = hgrid->getVertexIJK (0, 0, 0); + Hex::Vertex* vs2 = hgrid->getVertexIJK (1, 0, 0); + + docu->joinQuads (qsource, cible, vs1, vc1, vs2, vc2, 1); + save_vtk (); + + return HOK; +} +// ======================================================== test_croix +int test_croix (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + docu = mon_ex.addDocument (); + + Hex::Vertex* ori1 = docu->addVertex ( 0,0,0); + Hex::Vertex* ori2 = docu->addVertex (-5,0,5); + Hex::Vector* vz = docu->addVector ( 0,0,1); + Hex::Vector* vx = docu->addVector ( 1,0,0); + + double r1 = 2; + double r2 = 3; + double l2 = 10; + double l1 = 10; + + Hex::Cylinder* cyl1 = docu->addCylinder (ori1, vz, r1, l1); + Hex::Cylinder* cyl2 = docu->addCylinder (ori2, vx, r2, l2); + Hex::CrossElements* grid = docu->makeCylinders (cyl1, cyl2); + + case_name = "croix"; + save_vtk (); + + del_tranche (grid, 0, 1, 0); + del_tranche (grid, 0, 1, 5); + + del_tranche (grid, 1, 1, 0); + del_tranche (grid, 1, 1, 3); + + del_tranche (grid, 1, 0, 0); + del_tranche (grid, 1, 0, 3); + // Le trognon + del_tranche (grid, 0, 0, 0); + del_tranche (grid, 0, 0, 5); + del_tranche (grid, 0, 0, 1); + del_tranche (grid, 0, 0, 2); + del_tranche (grid, 0, 0, 3); + del_tranche (grid, 0, 0, 4); + // Partie critique + + del_tranche (grid, 1, 1, 1, 2); + + del_tranche (grid, 0, 1, 1, 2); + del_tranche (grid, 0, 1, 4, 2); + del_tranche (grid, 0, 1, 3, 2); + del_tranche (grid, 0, 1, 2, 2); + + del_tranche (grid, 1, 1, 2, 2); + return HOK; +} +// ======================================================== test_pipes +int test_pipes (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* ori1 = doc->addVertex ( 0,0,0); + Hex::Vertex* ori2 = doc->addVertex (-5,0,5); + Hex::Vector* vz = doc->addVector ( 0,0,1); + Hex::Vector* vx = doc->addVector ( 1,0,0); + +// double h1 = 5, ri1 = 1, re1 = 2; + double h1 = 10, ri1 = 1, re1 = 2; + double h2 = 10, ri2 = 2, re2 = 3; + + Hex::Pipe* pipe1 = doc->addPipe (ori1, vz, ri1, re1, h1); + Hex::Pipe* pipe2 = doc->addPipe (ori2, vx, ri2, re2, h2); + Hex::CrossElements* grid = doc->makePipes (pipe1, pipe2); + + case_name = "pipe"; + docu = doc; + save_vtk (); + + del_tranche (grid, 0, 1, 0); + del_tranche (grid, 0, 1, 5); + + del_tranche (grid, 1, 1, 0); + del_tranche (grid, 1, 1, 3); + // Partie critique + + del_tranche (grid, 1, 1, 1, 2); + + del_tranche (grid, 0, 1, 1, 2); + del_tranche (grid, 0, 1, 4, 2); + del_tranche (grid, 0, 1, 3, 2); + del_tranche (grid, 0, 1, 2, 2); + + del_tranche (grid, 1, 1, 2, 2); + /* *************************************************** + + int nbz [2] = { 8, 4 }; + int ni = 1; + for (int cyl = 0 ; cyl < 2 ; cyl++) + for (int nk = 0 ; nk < nbz[cyl] ; nk++) + for (int nj = 0 ; nj < 4 ; nj++) + { + int jj = nj; + if (cyl==0) jj = (jj+6) MODULO 8 ; + Hex::Hexa* hexa = grid->getHexaIJK (cyl, ni, jj, nk); + if (hexa!=NULL) + { + hexa->remove (); + doc->saveVtk (case_name, nbr_vtk); + } + } + *************************************************** */ + return HOK; +} +// ======================================================== test_lorraine +int test_lorraine(int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* ori1 = doc->addVertex ( 0,0,0); + Hex::Vertex* ori2 = doc->addVertex (-5,0,5); + Hex::Vertex* ori3 = doc->addVertex ( 0,0,12); + Hex::Vertex* ori4 = doc->addVertex (-5,0,17); + + Hex::Vector* vz = doc->addVector ( 0,0,1); + Hex::Vector* vx = doc->addVector ( 1,0,0); + + int nl1 = 10; + int nl2 = 10; + + double rsmall = 1; + double rmoy = 2; + double rbig = 3; + + Hex::Cylinder* cyl1 = doc->addCylinder (ori1, vz, rmoy, nl1); + Hex::Cylinder* cyl2 = doc->addCylinder (ori2, vx, rsmall, nl2); + + Hex::Cylinder* cyl3 = doc->addCylinder (ori3, vz, rmoy, nl1); + Hex::Cylinder* cyl4 = doc->addCylinder (ori4, vx, rbig, nl2); + + Hex::CrossElements* grid1 = doc->makeCylinders (cyl1, cyl2); + Hex::CrossElements* grid2 = doc->makeCylinders (cyl4, cyl3); + +#define Imprimer(x) printf (#x " = ") ; if (x) x->dump() ; else printf ("NULL\n") + const int nx_int = 0; + const int nx_ext = 1; + + // vc2 = grid1->getVertexIJK (Hex::CylBig, 0,0,0); + // vc3 = grid2->getVertexIJK (Hex::CylSmall, 0,0,0); + // Cyl i j k + Hex::Quad* qb = grid1-> getQuadIJ (Hex::CylBig, nx_ext, Hex::S_E, 4); + Hex::Quad* qh = grid2-> getQuadIJ (Hex::CylSmall, nx_ext, Hex::S_N, 0); + + Hex::Vertex* vb0 = qb->getVertex (3); + Hex::Vertex* vb1 = qb->getVertex (2); + Hex::Vertex* vh0 = qh->getVertex (0); + Hex::Vertex* vh1 = qh->getVertex (1); + + vb0 = grid1->getVertexIJK (Hex::CylBig, 2, Hex::S_E, 4); // cible + vb1 = grid1->getVertexIJK (Hex::CylBig, 2, Hex::S_NE, 4); + vh0 = grid2->getVertexIJK (Hex::CylSmall, 2, Hex::S_N, 0); // depart + vh1 = grid2->getVertexIJK (Hex::CylSmall, 2, Hex::S_NW, 0); + + Imprimer (vh0); + Imprimer (vh1); + Imprimer (vb0); + Imprimer (vb1); + + // qb->remove (); + // qh->remove (); + Hex::Quads hliste; + + hliste.push_back (qh); + for (int ny=1; nygetQuadIJ (Hex::CylSmall, nx_ext, ns, 0)); + } + + for (int ny=0; ny<4 ; ny++) + hliste.push_back (grid2->getQuadIJ (Hex::CylSmall, nx_int, ny, 0)); + + int hauteur = 3; + doc->joinQuads (hliste, qb, vh0, vb0, vh1, vb1, hauteur); + doc->saveVtk ("lorraine.vtk"); + + // doc->dump (); + return HOK; +} +// ======================================================== test_disconnect2 +// === Disconnect Edge seul +int test_disconnect2 (int nbargs, cpchar tabargs[]) +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 1; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig2 = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid2 = doc->makeCartesian (orig2, dir, size_x,size_y,size_z); + + doc->dump (); + + int nvtk = 0; + doc->setLevel (1); + Hex::Matrix matrice; + Hex::Vector* ecart = doc->addVector (0.5,0.5,0); + matrice.defTranslation (ecart); + + Hex::Hexa* hexa2 = grid2->getHexaIJK (1,1,0); + Hex::Edge* edge = grid2->getEdgeK (1,2,0); + + hexa2->setScalar (2); + edge->setScalar (5); + + doc->saveVtk ("test_disco", nvtk); + + doc->setLevel (4); + + Hex::Elements* disco_edges = doc->disconnectEdge (hexa2, edge); + HexDisplay (disco_edges->countVertex()); + HexDisplay (disco_edges->countEdge()); + HexDisplay (disco_edges->countQuad()); + HexDisplay (disco_edges->countHexa()); + + // hexa2->transform (&matrice); + /********************************** + for (int ns=0; nscountVertex(); ns++) + { + Hex::Vertex* sommet = disco_edges->getVertex(ns); + sommet->setX (sommet->getX()+0.5); + sommet->setY (sommet->getY()+0.5); + } + ********************************* */ + + doc->saveVtk ("test_disco", nvtk); + doc->save ("test_disco"); + doc->dump (); + hexa2->dumpFull (); + + doc->setLevel (4); + return HOK; +} +// ======================================================== test_disconnect4 +// === Disconnect Edges +int test_disconnect4 (int nbargs, cpchar tabargs[]) +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 5; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig2 = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid2 = doc->makeCartesian (orig2, dir, size_x,size_y,size_z); + + // doc->dump (); + + int nvtk = 0; + doc->setLevel (1); + + Hex::Hexas t_hexas; + Hex::Edges t_edges; + for (int nk=0 ; nk< size_z; nk++) + { + Hex::Hexa* hexa2 = grid2->getHexaIJK (1,1,nk); + Hex::Edge* edge = grid2->getEdgeK (1,2,nk); + + hexa2->setScalar (2); + edge->setScalar (5); + t_hexas.push_back (hexa2); + t_edges.push_back (edge); + + doc->setLevel (4); + + } + + doc->saveVtk ("test_disco", nvtk); + Hex::Elements* disco_edges = doc->disconnectEdges (t_hexas, t_edges); + doc->saveVtk ("test_disco", nvtk); + // doc->dump (); + // hexa2->dumpFull (); + + doc->setLevel (4); + return HOK; +} +// ======================================================== test_disconnect +// ==== Disconnect Quad +int test_disconnect1 (int nbargs, cpchar tabargs[]) +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 1; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, size_x,size_y,size_z); + + int nvtk = 0; + doc->setLevel (1); + Hex::Matrix matrice; + Hex::Vector* ecart = doc->addVector (0.5,0.5,0); + matrice.defTranslation (ecart); + + Hex::Hexa* hexa1 = grid1->getHexaIJK (1,1,0); + Hex::Quad* quad = grid1->getQuadJK (1,1,0); + + quad->setScalar (5); + + doc->saveVtk ("test_disco", nvtk); + doc->disconnectQuad (hexa1, quad); + // hexa1 ->transform (&matrice); + doc->saveVtk ("test_disco", nvtk); + + // doc->dumpPropagation (); + // doc->dump (); + + doc->save ("disco_all"); + return HOK; +} +// ======================================================== test_disconnect3 +// ==== disconnectVertex +int test_disconnect3 (int nbargs, cpchar tabargs[]) +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 1; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex (0,0,0); + + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, size_x,size_y,size_z); + + int nvtk = 0; + doc->setLevel (1); + Hex::Matrix matrice; + Hex::Vector* ecart = doc->addVector (0.5,0.5,0); + matrice.defTranslation (ecart); + + Hex::Hexa* hexa1 = grid1->getHexaIJK (1,1,0); + Hex::Vertex* vertex = grid1->getVertexIJK (1,1,1); + + vertex->setScalar (5); + + doc->saveVtk ("test_disco", nvtk); + + doc->disconnectVertex (hexa1, vertex); + // hexa1->transform (&matrice); + doc->saveVtk ("test_disco", nvtk); + + // doc->dumpPropagation (); + // doc->dump (); + + doc->save ("disco_all"); + return HOK; +} +// ======================================================== contraction +void contraction (Hex::Hexa* hexa, Hex::Elements* grid) +{ + return; + Hex::Real3 cg = { 0, 0, 0 }; + + for (int nro=0; nrogetVertex(nro)->getX()/Hex::HV_MAXI; + cg [1] += hexa->getVertex(nro)->getY()/Hex::HV_MAXI; + cg [2] += hexa->getVertex(nro)->getZ()/Hex::HV_MAXI; + } + + int nbvertex = grid->countVertex(); + const double coeff = 0.5; + for (int nro=0; nrogetVertex(nro); + Hex::Real3 pold = { pv->getX(), pv->getY(), pv->getZ() }; + Hex::Real3 pnew; + for (int dd=0; dd<3 ; dd++) + pnew [dd] = cg[dd] + coeff * (pold[dd]-cg[dd]); + + pv->setX (pnew[0]); + pv->setY (pnew[1]); + pv->setZ (pnew[2]); + } +} +// ======================================================== test_disconnect +// ==== Les 3 disconnect +int test_disconnect (int nbargs, cpchar tabargs[]) +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 1; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex (0,0,0); + Hex::Vertex* orig2 = doc->addVertex (4,0,0); + Hex::Vertex* orig3 = doc->addVertex (8,0,0); + + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid1 = doc->makeCartesian (orig1, dir, size_x,size_y,size_z); + Hex::Elements* grid2 = doc->makeCartesian (orig2, dir, size_x,size_y,size_z); + Hex::Elements* grid3 = doc->makeCartesian (orig3, dir, size_x,size_y,size_z); + + int nvtk = 0; + doc->setLevel (1); + Hex::Matrix matrice; + Hex::Vector* ecart = doc->addVector (0.5,0.5,0); + matrice.defTranslation (ecart); + + Hex::Hexa* hexa1 = grid1->getHexaIJK (1,1,0); + Hex::Hexa* hexa2 = grid2->getHexaIJK (1,1,0); + Hex::Hexa* hexa3 = grid3->getHexaIJK (1,1,0); + + Hex::Quad* quad = grid1->getQuadJK (1,1,0); + Hex::Edge* edge = grid2->getEdgeK (1,2,0); + Hex::Vertex* vertex = grid3->getVertexIJK (1,1,1); + + quad->setScalar (5); + edge->setScalar (5); + vertex->setScalar (5); + + doc->saveVtk ("test_disco", nvtk); + doc->disconnectQuad (hexa1, quad); + doc->saveVtk ("test_disco", nvtk); + + doc->disconnectEdge (hexa2, edge); + doc->saveVtk ("test_disco", nvtk); + + doc->disconnectVertex (hexa3, vertex); + doc->saveVtk ("test_disco", nvtk); + + // doc->dumpPropagation (); + // doc->dump (); + + doc->save ("disco_all"); + return HOK; +} +// ======================================================== test_propagation +int test_propagation () +{ + const int size_x = 2; + const int size_y = 1; + const int size_z = 1; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + // Hex::Elements* grid = + doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + int nb = doc->countPropagation (); + for (int nro=0 ; nrogetPropagation (nro); + const Hex::Edges& table = prop->getEdges (); + printf (" ____________________________________ Prop nro %d\n", nro); + for (int ned=0 ; ned<(int)table.size() ; ned++) + { + bool way = table [ned]->getWay (); + + if (way) + { + printf (" ("); + table [ned]->getVertex (0)->printName (", "); + table [ned]->getVertex (1)->printName (")\n"); + } + else + { + printf (" ("); + table [ned]->getVertex (1)->printName (", "); + table [ned]->getVertex (0)->printName (")\n"); + } + } + } + + doc->dump (); + doc->saveVtk ("test_propagation.vtk"); + doc->save ("test_propagation"); + + return HOK; +} +// ======================================================== test_move +int test_move () +{ + const int size_x = 1; + const int size_y = 1; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + + Hex::Vector* enhaut = doc->addVector (0, 0, 5); + Hex::Vector* devant = doc->addVector (5, 0, 0); + // Hex::Vector* agauche = doc->addVector (0, 5, 0); + + Hex::Matrix matrice; + matrice.defTranslation (enhaut); + + Hex::Hexa* cube = grid->getHexa (1); + Hex::Quad* dessous = cube->getQuad (Hex::Q_A); + dessous->dump(); + + Hex::Elements* grid2 = doc->makeTranslation (grid, devant); + /* Hex::Elements* grid3 = doc->makeTranslation (grid, agauche); */ + Hex::Hexa* cube2 = grid2->getHexa (1); + + doc ->saveVtk ("move0.vtk"); + + cube ->disconnectQuad (dessous); + cube ->transform (&matrice); + cube2->transform (&matrice); + + doc ->saveVtk ("move1.vtk"); + doc ->dump(); + + return HOK; +} +// ======================================================== test_transfo2 +int test_transfo2 (int nbargs, cpchar tabargs[]) +{ + const int size_x = 1; + const int size_y = 1; + const int size_z = 2; + + int nvtk = 0; + cpchar fic_vtk = "transfo"; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + doc ->setLevel (1); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x, size_y, + size_z); + if (grid==NULL) + return HERR; + + orig->setScalar(2); + + doc ->saveVtk (fic_vtk, nvtk); + + Hex::Vector* devant = doc->addVector (5, 0, 0); + + Hex::Elements* grid2 = doc->makeTranslation (grid, devant); + if (grid2==NULL) + return HERR; + doc ->saveVtk (fic_vtk, nvtk); + + Hex::Elements* grid3 = doc->makeScale (grid2, orig, 2); + if (grid3==NULL) + return HERR; + doc ->saveVtk (fic_vtk, nvtk); + + Hex::Elements* grid4 = doc->makeRotation (grid2, orig, dir, 45); + if (grid4==NULL) + return HERR; + doc ->saveVtk (fic_vtk, nvtk); + + Hex::Elements* grid5 = doc->makeSymmetryPoint (grid4, orig); + if (grid5==NULL) + return HERR; + + doc ->saveVtk (fic_vtk, nvtk); + + Hex::Vector* dir1 = doc->addVector (1,0,0); + Hex::Elements* grid6 = doc->makeSymmetryLine (grid4, orig, dir1); + if (grid6==NULL) + return HERR; + + grid4->getHexa(0)->getVertex(0)->setScalar(3); + grid6->getHexa(0)->getVertex(0)->setScalar(3); + doc ->saveVtk (fic_vtk, nvtk); + + grid4->getHexa(0)->getVertex(0)->setScalar(0); + grid6->getHexa(0)->getVertex(0)->setScalar(0); + + Hex::Elements* grid7 = doc->makeSymmetryLine (grid2, orig, dir1); + if (grid7==NULL) + return HERR; + + grid2->getHexa(0)->getVertex(0)->setScalar(4); + grid7->getHexa(0)->getVertex(0)->setScalar(4); + doc ->saveVtk (fic_vtk, nvtk); + + grid2->getHexa(0)->getVertex(0)->setScalar(0); + grid7->getHexa(0)->getVertex(0)->setScalar(0); + + Hex::Elements* grid8 = doc->makeSymmetryPlane (grid2, orig, dir1); + if (grid8==NULL) + return HERR; + + grid2->getHexa(0)->getVertex(0)->setScalar(4); + grid8->getHexa(0)->getVertex(0)->setScalar(4); + doc ->saveVtk (fic_vtk, nvtk); + grid2->getHexa(0)->getVertex(0)->setScalar(0); + grid8->getHexa(0)->getVertex(0)->setScalar(0); + + Hex::Elements* grid9 = doc->makeSymmetryPlane (grid3, orig, dir); + if (grid9==NULL) + return HERR; + + grid3->getHexa(0)->getVertex(0)->setScalar(4); + grid9->getHexa(0)->getVertex(0)->setScalar(4); + doc ->saveVtk (fic_vtk, nvtk); + + grid9->getHexa(0)->removeConnected (); + doc ->saveVtk (fic_vtk, nvtk); + + return HOK; +} +// ======================================================== test_transfo +int test_transfo (int nbargs, cpchar tabargs[]) +{ + int nvtk = 0; + cpchar fic_vtk = "transfo"; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + doc ->setLevel (1); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vz = doc->addVector (0,0,1); + double dr = 1; + double da = 360; + double dl = 1; + int nr = 3; + int na = 8; + int nl = 3; + Hex::Elements* grid = doc->makeCylindrical (orig, vx,vz, dr, da, dl, + nr, na, nl, false); + if (grid==NULL) + return HERR; + + doc ->saveVtk (fic_vtk, nvtk); + Hex::Vector* devant = doc->addVector (10, 0, 0); + + Hex::Elements* grid2 = doc->makeTranslation (grid, devant); + if (grid2==NULL) + return HERR; + doc ->saveVtk (fic_vtk, nvtk); + + return HOK; +} +// ======================================================== test_copy_document +int test_copy_document (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.loadDocument ("Essai"); + doc ->saveVtk ("restore1.vtk"); + + Hex::Document* clone = doc->copyDocument(); + clone->saveVtk ("restore2.vtk"); + + return HOK; +} +// ======================================================== test_remove +int test_remove () +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vertex* orig1 = doc->addVertex (6,0,0); + Hex::Vector* dir = doc->addVector (1,1,1); + Hex::Elements* grid = doc->makeCartesian (orig, dir, size_x,size_y,size_z); + doc->makeCartesian (orig1, dir, 1,1,1); + doc->saveVtk ("removeConn1.vtk"); + + Echo ("--------- Avant destruction"); + HexDisplay (doc->countVertex ()); + HexDisplay (doc->countEdge ()); + HexDisplay (doc->countQuad ()); + HexDisplay (doc->countHexa ()); + HexDisplay (doc->countUsedVertex ()); + HexDisplay (doc->countUsedEdge ()); + HexDisplay (doc->countUsedQuad ()); + HexDisplay (doc->countUsedHexa ()); + + + doc->removeConnectedHexa (grid->getHexaIJK (0,0,0)); + + Echo ("--------- Apres destruction"); + HexDisplay (doc->countVertex ()); + HexDisplay (doc->countEdge ()); + HexDisplay (doc->countQuad ()); + HexDisplay (doc->countHexa ()); + + HexDisplay (doc->countUsedVertex ()); + HexDisplay (doc->countUsedEdge ()); + HexDisplay (doc->countUsedQuad ()); + HexDisplay (doc->countUsedHexa ()); + doc->saveVtk ("removeConn2.vtk"); + + return HOK; +} +// ================================================== init_vec +void init_vec (Hex::RealVector& tab, double n0=0, double n1=0, double n2=0, + double n3=0, double n4=0, double n5=0, double n6=0, + double n7=0, double n8=0, double n9=0, double n10=0, + double n11=0, double n12=0, double n13=0, double n14=0, + double n15=0, double n16=0) +{ + if (n0>0.0) tab.push_back (n0); + if (n1>0.0) tab.push_back (n1); + if (n2>0.0) tab.push_back (n2); + if (n3>0.0) tab.push_back (n3); + if (n4>0.0) tab.push_back (n4); + if (n5>0.0) tab.push_back (n5); + if (n6>0.0) tab.push_back (n6); + if (n7>0.0) tab.push_back (n7); + if (n8>0.0) tab.push_back (n8); + if (n9>0.0) tab.push_back (n9); + + if (n10>0.0) tab.push_back (n10); + if (n11>0.0) tab.push_back (n11); + if (n12>0.0) tab.push_back (n12); + if (n13>0.0) tab.push_back (n13); + if (n14>0.0) tab.push_back (n14); + if (n15>0.0) tab.push_back (n15); + if (n16>0.0) tab.push_back (n16); +} +// ================================================== test_cylindricals +int test_cylindricals (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0, 0, 0); + Hex::Vector* vz = doc->addVector (0, 0, 1); + Hex::Vector* vx = doc->addVector (1 ,0, 0); + + Hex::RealVector tdr, tda, tdl; + + /****************** + init_vec (tdr, 2, 1, 0.5); + init_vec (tda, 40, 35, 30, 25, 20, 15, 10, 5, + 5, 10, 15, 20, 25, 30, 35, 40); + init_vec (tdl, 1, 2, 3 ); + + init_vec (tdr, 1, 1, 1, 1); + init_vec (tda, 45,45, 45,45, 45,45, 45,45 ); + init_vec (tdl, 1, 1, 1 ); + + ****************** */ + + + init_vec (tdr, 1, 2, 1, 2); + init_vec (tda, 20, 20, 20 ); + init_vec (tdl, 1 ); + + Hex::Elements* grid=doc->makeCylindricals (orig, vx,vz, tdr,tda,tdl, false); + + doc->saveVtk ("cylindricals.vtk"); + doc->dump(); + grid->clearAssociation(); + doc->clearAssociation(); + return HOK; +} +// ======================================================== test_hexa +int test_hexa (int nbargs, cpchar tabargs[]) +{ + goto_workspace (); + int ier = test_cylindricals (nbargs, tabargs); + ier = test_transfo (nbargs, tabargs); + free_workspace (); + + return ier; +} diff --git a/src/TEST_CPP/test_quads.cxx b/src/TEST_CPP/test_quads.cxx new file mode 100755 index 0000000..d1347bb --- /dev/null +++ b/src/TEST_CPP/test_quads.cxx @@ -0,0 +1,823 @@ + +// C++ : Tests unitaires sur les creations h'hexaedres + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +#include "Hex.hxx" + +#include + +#include "HexDocument.hxx" +#include "HexElements.hxx" +#include "HexCrossElements.hxx" + +#include "HexHexa.hxx" +#include "HexQuad.hxx" +#include "HexEdge.hxx" +#include "HexVertex.hxx" + +#include "HexCramer.hxx" + +// ======================================================== test_hexa_quads_5 +int test_hexa_quads_5 (int nbargs, cpchar tabargs[]) +{ + const int size_x = 3; + const int size_y = 3; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vy = doc->addVector (0,1,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + Hex::Elements* grid = doc->makeCartesian (orig, vx, vy, vz, + size_x,size_y,size_z); + + int nvtk = 0; + cpchar fic_vtk = "HexaQuad_5"; + doc->saveVtk (fic_vtk, nvtk); + + Hex::Hexa* hexa = grid->getHexaIJK (1,1,1); + + Hex::Quad* qa = hexa->getQuad (Hex::Q_A); + Hex::Quad* qb = hexa->getQuad (Hex::Q_B); + Hex::Quad* qc = hexa->getQuad (Hex::Q_C); + Hex::Quad* qd = hexa->getQuad (Hex::Q_D); + Hex::Quad* qe = hexa->getQuad (Hex::Q_E); + Hex::Quad* qf = hexa->getQuad (Hex::Q_F); + + qb->setScalar (5); + doc->saveVtk (fic_vtk, nvtk); + + qb->remove (); + doc->saveVtk (fic_vtk, nvtk); + + doc->addHexa5Quads (qa, qc, qd, qe, qf); + doc->saveVtk (fic_vtk, nvtk); + + grid->remove (); + HexDisplay (doc->countHexa ()); + HexDisplay (doc->countQuad ()); + HexDisplay (doc->countEdge ()); + HexDisplay (doc->countVertex ()); + + doc->saveVtk (fic_vtk, nvtk); + return HOK; +} +// ====================================================== test_hexa_quads_ab +int test_hexa_quads_ab (int nbargs, cpchar tabargs[]) +{ + const int size_x = 1; + const int size_y = 1; + const int size_z = 3; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vy = doc->addVector (0,1,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + Hex::Elements* grid = doc->makeCartesian (orig, vx, vy, vz, + size_x,size_y,size_z); + + int nvtk = 0; + cpchar fic_vtk = "HexaQuad_ab"; + doc->saveVtk (fic_vtk, nvtk); + + Hex::Hexa* hexa = grid->getHexaIJK (0, 0, 1); + + Hex::Quad* qa = hexa->getQuad (Hex::Q_A); + Hex::Quad* qb = hexa->getQuad (Hex::Q_B); + Hex::Quad* qc = hexa->getQuad (Hex::Q_C); + Hex::Quad* qd = hexa->getQuad (Hex::Q_D); + Hex::Quad* qe = hexa->getQuad (Hex::Q_E); + Hex::Quad* qf = hexa->getQuad (Hex::Q_F); + + qc->remove (); + qd->remove (); + qe->remove (); + qf->remove (); + doc->saveVtk (fic_vtk, nvtk); + + doc->addHexa2Quads (qa, qb); + doc->saveVtk (fic_vtk, nvtk); + + grid->remove (); + HexDisplay (doc->countHexa ()); + HexDisplay (doc->countQuad ()); + HexDisplay (doc->countEdge ()); + HexDisplay (doc->countVertex ()); + + doc->saveVtk (fic_vtk, nvtk); + return HOK; +} +// ====================================================== test_hexa_quads_ac +int test_hexa_quads_ac (int nbargs, cpchar tabargs[]) +{ + const int size_x = 2; + const int size_y = 1; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vy = doc->addVector (0,1,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + Hex::Elements* grid = doc->makeCartesian (orig, vx, vy, vz, + size_x,size_y,size_z); + int nvtk = 0; + cpchar fic_vtk = "HexaQuad_ac"; + doc->saveVtk (fic_vtk, nvtk); + + Hex::Hexa* hexa = grid->getHexaIJK (1,0,1); + + Hex::Quad* qa = hexa->getQuad (Hex::Q_A); + Hex::Quad* qb = hexa->getQuad (Hex::Q_B); + Hex::Quad* qc = hexa->getQuad (Hex::Q_C); + Hex::Quad* qd = hexa->getQuad (Hex::Q_D); + Hex::Quad* qe = hexa->getQuad (Hex::Q_E); + Hex::Quad* qf = hexa->getQuad (Hex::Q_F); + + qb->remove (); + qc->remove (); + qd->remove (); + qf->remove (); + doc->saveVtk (fic_vtk, nvtk); + + doc->addHexa2Quads (qa, qe); + doc->saveVtk (fic_vtk, nvtk); + + grid->remove (); + HexDisplay (doc->countHexa ()); + HexDisplay (doc->countQuad ()); + HexDisplay (doc->countEdge ()); + HexDisplay (doc->countVertex ()); + + HexDisplay (doc->countUsedHexa ()); + HexDisplay (doc->countUsedQuad ()); + HexDisplay (doc->countUsedEdge ()); + HexDisplay (doc->countUsedVertex ()); + + doc->saveVtk (fic_vtk, nvtk); + return HOK; +} +// ====================================================== test_hexa_quads_ace +int test_hexa_quads_ace (int nbargs, cpchar tabargs[]) +{ + const int size_x = 2; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vy = doc->addVector (0,1,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + Hex::Elements* grid = doc->makeCartesian (orig, vx, vy, vz, + size_x,size_y,size_z); + int nvtk = 0; + cpchar fic_vtk = "HexaQuad_ace"; + doc->saveVtk (fic_vtk, nvtk); + + Hex::Hexa* hexa = grid->getHexaIJK (1,0,1); + + Hex::Quad* qa = hexa->getQuad (Hex::Q_A); + Hex::Quad* qb = hexa->getQuad (Hex::Q_B); + Hex::Quad* qc = hexa->getQuad (Hex::Q_C); + Hex::Quad* qd = hexa->getQuad (Hex::Q_D); + Hex::Quad* qe = hexa->getQuad (Hex::Q_E); + Hex::Quad* qf = hexa->getQuad (Hex::Q_F); + + qb->remove (); + qf->remove (); + qc->remove (); + doc->saveVtk (fic_vtk, nvtk); + + doc->addHexa3Quads (qa, qd, qe); + doc->saveVtk (fic_vtk, nvtk); + + grid->remove (); + HexDisplay (doc->countHexa ()); + HexDisplay (doc->countQuad ()); + HexDisplay (doc->countEdge ()); + HexDisplay (doc->countVertex ()); + + HexDisplay (doc->countUsedHexa ()); + HexDisplay (doc->countUsedQuad ()); + HexDisplay (doc->countUsedEdge ()); + HexDisplay (doc->countUsedVertex ()); + + doc->saveVtk (fic_vtk, nvtk); + return HOK; +} +// ====================================================== test_hexa_quads_acd +int test_hexa_quads_acd (int nbargs, cpchar tabargs[]) +{ + const int size_x = 3; + const int size_y = 1; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vy = doc->addVector (0,1,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + Hex::Elements* grid = doc->makeCartesian (orig, vx, vy, vz, + size_x,size_y,size_z); + int nvtk = 0; + cpchar fic_vtk = "HexaQuad_acd"; + doc->saveVtk (fic_vtk, nvtk); + + Hex::Hexa* hexa = grid->getHexaIJK (1,0,1); + + Hex::Quad* qa = hexa->getQuad (Hex::Q_A); + Hex::Quad* qb = hexa->getQuad (Hex::Q_B); + Hex::Quad* qc = hexa->getQuad (Hex::Q_C); + Hex::Quad* qd = hexa->getQuad (Hex::Q_D); + Hex::Quad* qe = hexa->getQuad (Hex::Q_E); + Hex::Quad* qf = hexa->getQuad (Hex::Q_F); + + qb->remove (); + qc->remove (); + qd->remove (); + doc->saveVtk (fic_vtk, nvtk); + + doc->addHexa3Quads (qa, qe, qf); + doc->saveVtk (fic_vtk, nvtk); + + grid->remove (); + HexDisplay (doc->countHexa ()); + HexDisplay (doc->countQuad ()); + HexDisplay (doc->countEdge ()); + HexDisplay (doc->countVertex ()); + + HexDisplay (doc->countUsedHexa ()); + HexDisplay (doc->countUsedQuad ()); + HexDisplay (doc->countUsedEdge ()); + HexDisplay (doc->countUsedVertex ()); + + doc->saveVtk (fic_vtk, nvtk); + return HOK; +} +// ====================================================== test_hexa_quads_abcd +int test_hexa_quads_abcd (int nbargs, cpchar tabargs[]) +{ + const int size_x = 3; + const int size_y = 1; + const int size_z = 3; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vy = doc->addVector (0,1,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + Hex::Elements* grid = doc->makeCartesian (orig, vx, vy, vz, + size_x,size_y,size_z); + int nvtk = 0; + cpchar fic_vtk = "HexaQuad_abcd"; + doc->saveVtk (fic_vtk, nvtk); + + Hex::Hexa* hexa = grid->getHexaIJK (1,0,1); + + Hex::Quad* qa = hexa->getQuad (Hex::Q_A); + Hex::Quad* qb = hexa->getQuad (Hex::Q_B); + Hex::Quad* qc = hexa->getQuad (Hex::Q_C); + Hex::Quad* qd = hexa->getQuad (Hex::Q_D); + Hex::Quad* qe = hexa->getQuad (Hex::Q_E); + Hex::Quad* qf = hexa->getQuad (Hex::Q_F); + + qc->remove (); + qd->remove (); + doc->saveVtk (fic_vtk, nvtk); + + doc->addHexa4Quads (qa, qe, qf, qb); + doc->saveVtk (fic_vtk, nvtk); + + grid->remove (); + HexDisplay (doc->countHexa ()); + HexDisplay (doc->countQuad ()); + HexDisplay (doc->countEdge ()); + HexDisplay (doc->countVertex ()); + + HexDisplay (doc->countUsedHexa ()); + HexDisplay (doc->countUsedQuad ()); + HexDisplay (doc->countUsedEdge ()); + HexDisplay (doc->countUsedVertex ()); + + doc->saveVtk (fic_vtk, nvtk); + return HOK; +} +// ====================================================== test_hexa_quads_abce +int test_hexa_quads_abce (int nbargs, cpchar tabargs[]) +{ + const int size_x = 3; + const int size_y = 2; + const int size_z = 2; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vy = doc->addVector (0,1,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + Hex::Elements* grid = doc->makeCartesian (orig, vx, vy, vz, + size_x,size_y,size_z); + int nvtk = 0; + cpchar fic_vtk = "HexaQuad_abce"; + doc->saveVtk (fic_vtk, nvtk); + + Hex::Hexa* hexa = grid->getHexaIJK (1,0,1); + + Hex::Quad* qa = hexa->getQuad (Hex::Q_A); + Hex::Quad* qb = hexa->getQuad (Hex::Q_B); + Hex::Quad* qc = hexa->getQuad (Hex::Q_C); + Hex::Quad* qd = hexa->getQuad (Hex::Q_D); + Hex::Quad* qe = hexa->getQuad (Hex::Q_E); + Hex::Quad* qf = hexa->getQuad (Hex::Q_F); + + qc->remove (); + qb->remove (); + doc->saveVtk (fic_vtk, nvtk); + + doc->addHexa4Quads (qa, qe, qf, qd); + doc->saveVtk (fic_vtk, nvtk); + + grid->remove (); + HexDisplay (doc->countHexa ()); + HexDisplay (doc->countQuad ()); + HexDisplay (doc->countEdge ()); + HexDisplay (doc->countVertex ()); + + HexDisplay (doc->countUsedHexa ()); + HexDisplay (doc->countUsedQuad ()); + HexDisplay (doc->countUsedEdge ()); + HexDisplay (doc->countUsedVertex ()); + + doc->saveVtk (fic_vtk, nvtk); + return HOK; +} +// ======================================================== test_cramer +int test_cramer (int nbargs, cpchar tabargs[]) +{ + double matrice [] = { 2, 7, 1, + 0, 3, 0, + 1, 9, 5 }; + double second [] = { 1, 1, 1 }; + + Hex::Real3 solution; + Hex::Cramer systeme(3); + + int ier = systeme.resoudre (matrice, second, solution); + HexDisplay (ier); + cout << endl; + cout << " Second membre = (" << second[Hex::dir_x] << ", " + << second[Hex::dir_y] << ", " << second[Hex::dir_z] << ")" + << endl; + + cout << " Solution = (" << solution[Hex::dir_x] << ", " + << solution[Hex::dir_y] << ", " << solution[Hex::dir_z] << ")" + << endl; + + Hex::Real3 produit; + systeme.multiply (solution, produit); + cout << " Produit = (" << produit[Hex::dir_x] << ", " + << produit[Hex::dir_y] << ", " << produit[Hex::dir_z] << ")" + << endl; + + return HOK; +} +// ====================================================== test_hexa_quads_ac1 +int test_hexa_quads_ac1 (int nbargs, cpchar tabargs[]) +{ + int nbtraces = 0; + cout << "test_hexa_quads_ac1, trace nro " << ++nbtraces <addVertex (0,0,0); + Hex::Vertex* acf = doc->addVertex (1,0,0); + + /**************************************** + Hex::Vertex* ade = doc->addVertex (0,1,0); + Hex::Vertex* adf = doc->addVertex (1,1,0); + + Hex::Vertex* bce = doc->addVertex (0,0,1); + Hex::Vertex* bcf = doc->addVertex (1,0,1); + Hex::Vertex* bde = doc->addVertex (0,1,1); + Hex::Vertex* bdf = doc->addVertex (1,1,1); + *****************************************/ + + Hex::Vertex* ade = doc->addVertex (-2,2,0); + Hex::Vertex* adf = doc->addVertex ( 2,1,0); + Hex::Vertex* bce = doc->addVertex ( 1,0,1); + Hex::Vertex* bcf = doc->addVertex ( 2,0,1); + + Hex::Edge* ac = doc->addEdge (ace, acf); + Hex::Edge* af = doc->addEdge (adf, acf); + Hex::Edge* ad = doc->addEdge (ade, adf); + Hex::Edge* ae = doc->addEdge (ace, ade); + + Hex::Edge* bc = doc->addEdge (bce, bcf); + // Hex::Edge* bf = doc->addEdge (bdf, bcf); + // Hex::Edge* bd = doc->addEdge (bde, bdf); + // Hex::Edge* be = doc->addEdge (bce, bde); + + Hex::Edge* ce = doc->addEdge (ace, bce); + Hex::Edge* cf = doc->addEdge (acf, bcf); + // Hex::Edge* de = doc->addEdge (ade, bde); + // Hex::Edge* df = doc->addEdge (adf, bdf); + + Hex::Quad* qa = doc->addQuad (ac, af, ad, ae); + Hex::Quad* qc = doc->addQuad (ac, cf, bc, ce); + + /* Hex::Hexa* hexa = */ doc->addHexa2Quads (qa, qc); + + // doc->dump(); + doc->saveVtk ("hexa_quads.vtk"); + return HOK; +} +// ======================================================== test_part_rind +int test_part_rind (int& nvtk) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* center = doc->addVertex (0,0,0); + Hex::Real radius = 8; + Hex::Real radint = 7; + Hex::Vertex* orig = NULL; + Hex::Vector* vz = doc->addVector (0,0,1); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Real angle = 90; + Hex::Real radhole = 1; + int nrad = 3; + int nang = 4; + int nhaut = 8; + + Hex::Elements* grid = doc->makePartRind (center, vx, vz, radius, radint, + radhole, orig, angle, nrad, nang, nhaut); + if (grid!=NULL) + doc->saveVtk ("makeSphere", nvtk); + return HOK; +} +// ======================================================== test_rind +int test_rind (int& nvtk) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* center = doc->addVertex (0,0,0); + Hex::Real radius = 8; + Hex::Real radint = 7; + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vz = doc->addVector (0,1,1); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Real radhole = 1; + int nrad = 3; + int nang = 16; + int nhaut = 8; + + Hex::Elements* grid = doc->makeRind (center, vx, vz, radius, radint, + radhole, orig, nrad, nang, nhaut); + if (grid!=NULL) + doc->saveVtk ("makeSphere", nvtk); + return HOK; +} +// ======================================================== test_part_sphere +int test_part_sphere (int& nvtk) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* center = doc->addVertex (0,0,0); + Hex::Real radius = 8; + Hex::Vertex* orig = doc->addVertex (0,0,-4); + Hex::Vector* vz = doc->addVector (0,0,1); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Real angle = 90; + Hex::Real radhole = 1; + int nrad = 3; + int nang = 4; + int nhaut = 8; + + Hex::Elements* grid = doc->makePartSphere (center, vx, vz, radius, + radhole, orig, angle, nrad, nang, nhaut); + if (grid!=NULL) + doc->saveVtk ("makeSphere", nvtk); + return HOK; +} +// ======================================================== test_sphere +int test_sphere (int& nvtk) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* center = doc->addVertex (0,0,0); + Hex::Real radius = 8; + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vz = doc->addVector (0,0,1); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Real radhole = 1; + int nrad = 3; + int nang = 16; + int nhaut = 8; + + Hex::Elements* grid = doc->makeSphere (center, vx, vz, radius, + radhole, orig, nrad, nang, nhaut); + if (grid!=NULL) + doc->saveVtk ("makeSphere", nvtk); + return HOK; +} +// ================================================== test_asso_grid +int test_asso_grid (int nbargs, cpchar tabargs[]) +{ + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig1 = doc->addVertex ( 0, 0,0); + + Hex::Vector* vz = doc->addVector (0,0,1); + Hex::Vector* vx = doc->addVector (1,0,0); + + double dr = 1; + double dl = 1; + int nr = 2; + int nl = 3; + int na = 8; + + Hex::Elements *c1 = NULL; + + c1 = doc->makeCylindrical (orig1, vx,vz,dr, 300, dl, nr, na, nl, false); + for (int ned=0 ; nedgetEdgeJ (nr, ned, 1); + if (edge != NULL) + edge->setScalar (5); + else + printf (" ... c1->getEdgeJ (nr, %d, 1) = NULL\n", ned); + } + + doc->saveVtk ("asso_grid.vtk"); + + return HOK; +} +// ======================================================== test_piquage +int test_piquage (int nbargs, cpchar tabargs[]) +{ + const int size_x = 3; + const int size_y = 3; + const int size_z = 3; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vy = doc->addVector (0,1,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + Hex::Elements* grid = doc->makeCartesian (orig, vx, vy, vz, + size_x,size_y,size_z); + + double dr = 1; + double dl = 1; + + int nr = 1; + int na = 4; + int nl = 1; + + Hex::Vertex* orig2 = doc->addVertex (0,0,5); + Hex::Elements* grid2 = doc->makeCylindrical (orig2, vx,vz, + dr, 360, dl, nr, na, nl, false); + + Hex::Vertex* c1 = grid->getVertexIJK (1, 2, size_z); + Hex::Vertex* c2 = grid->getVertexIJK (1, 1, size_z); + Hex::Vertex* c3 = grid->getVertexIJK (2, 1, size_z); + + Hex::Vertex* p1 = grid2->getVertexIJK (1, 0, 1); + Hex::Vertex* p2 = grid2->getVertexIJK (1, 1, 1); + Hex::Vertex* p3 = grid2->getVertexIJK (1, 2, 1); + + c1->setScalar (4); + c2->setScalar (6); + c3->setScalar (6); + + p1->setScalar (4); + p2->setScalar (6); + p3->setScalar (6); + + int nvtk=0; + doc->saveVtk ("piquage", nvtk); + + Hex::Quads qpattern; + for (int ny=0; ny<4 ; ny++) + { + Hex::Quad* quad = grid2->getQuadIJ (0, ny, 1); + quad->setScalar(5); + qpattern.push_back (quad); + } + + doc->saveVtk ("piquage", nvtk); + doc->replace (qpattern, p1,c1, p2,c2, p3,c3); + + doc->saveVtk ("piquage", nvtk); + + return HOK; +} +// ======================================================== test_replace +int test_replace (int nbargs, cpchar tabargs[]) +{ + const int size_x = 3; + const int size_y = 3; + const int size_z = 3; + + Hex::Hex mon_ex; + Hex::Document* doc = mon_ex.addDocument (); + + Hex::Vertex* orig = doc->addVertex (0,0,0); + Hex::Vector* vx = doc->addVector (1,0,0); + Hex::Vector* vy = doc->addVector (0,1,0); + Hex::Vector* vz = doc->addVector (0,0,1); + + Hex::Elements* grid = doc->makeCartesian (orig, vx, vy, vz, + size_x,size_y,size_z); + + Hex::Vertex* c1 = grid->getVertexIJK (1, 2, size_z); + Hex::Vertex* c2 = grid->getVertexIJK (1, 1, size_z); + Hex::Vertex* c3 = grid->getVertexIJK (2, 1, size_z); + + Hex::Vertex* pa1 = doc->addVertex (-1, -1); + Hex::Vertex* pb1 = doc->addVertex ( 1, -1); + Hex::Vertex* pc1 = doc->addVertex ( 1, 1); + Hex::Vertex* pd1 = doc->addVertex (-1, 1); + + Hex::Vertex* pa2 = doc->addVertex (-2, -2); + Hex::Vertex* pb2 = doc->addVertex ( 2, -2); + Hex::Vertex* pc2 = doc->addVertex ( 2, 2); + Hex::Vertex* pd2 = doc->addVertex (-2, 2); + + Hex::Edge* edab1 = doc->addEdge (pa1, pb1); + Hex::Edge* edbc1 = doc->addEdge (pb1, pc1); + Hex::Edge* edcd1 = doc->addEdge (pc1, pd1); + Hex::Edge* edda1 = doc->addEdge (pd1, pa1); + + Hex::Edge* edab2 = doc->addEdge (pa2, pb2); + Hex::Edge* edbc2 = doc->addEdge (pb2, pc2); + Hex::Edge* edcd2 = doc->addEdge (pc2, pd2); + Hex::Edge* edda2 = doc->addEdge (pd2, pa2); + + Hex::Edge* edaa = doc->addEdge (pa1, pa2); + Hex::Edge* edbb = doc->addEdge (pb1, pb2); + Hex::Edge* edcc = doc->addEdge (pc1, pc2); + Hex::Edge* eddd = doc->addEdge (pd1, pd2); + + Hex::Quads qpattern; + // qpattern.push_back (doc->addQuad (edab1, edbc1, edcd1, edda1)); + qpattern.push_back (doc->addQuad (edab1, edbb, edab2, edaa)); + qpattern.push_back (doc->addQuad (edbc1, edcc, edbc2, edbb)); + qpattern.push_back (doc->addQuad (edcd1, eddd, edcd2, edcc)); + qpattern.push_back (doc->addQuad (edda1, edaa, edda2, eddd)); + + doc->saveVtk ("replace0.vtk"); + + doc->replace (qpattern, pd2,c1, pa2,c2, pb2,c3); + + c1->setScalar (4); + c2->setScalar (6); + c3->setScalar (6); + doc->saveVtk ("replace1.vtk"); + + return HOK; +} +// ======================================================== test_hemispheres +int test_hemispheres (int nbargs, cpchar tabargs[]) +{ + int nvtk = 0; + test_sphere (nvtk); + test_rind (nvtk); + test_part_rind (nvtk); + test_part_sphere (nvtk); + return HOK; +} +// ======================================================== test_quads +int test_quads (int nbargs, cpchar tabargs[]) +{ + cpchar option = "?"; + cpchar appel = strrchr (tabargs[0], '/'); + if (appel != NULL) + appel += 1; + else + { + appel = strrchr (tabargs[0], '\\'); + if (appel!=NULL) + appel += 1; + else + appel = tabargs[0]; + } + + if (nbargs>1) + option = tabargs[1]; + + if (Cestegal (option, "-ab") || Cestegal (option, "-AB")) + { + printf (" __________________ Appel de test_hexa_quads_ab \n"); + test_hexa_quads_ab (nbargs, tabargs); + } + + else if (Cestegal (option, "-ac1") || Cestegal (option, "-AC1")) + { + printf (" __________________ Appel de test_hexa_quads_ac1 \n"); + test_hexa_quads_ac1 (nbargs, tabargs); + } + else if (Cestegal (option, "-ac") || Cestegal (option, "-AC")) + { + printf (" __________________ Appel de test_hexa_quads_ac \n"); + test_hexa_quads_ac (nbargs, tabargs); + } + + else if (Cestegal (option, "-ace") || Cestegal (option, "-ACE")) + { + printf (" __________________ Appel de test_hexa_quads_ace \n"); + test_hexa_quads_ace (nbargs, tabargs); + } + + else if (Cestegal (option, "-acd") || Cestegal (option, "-ACD")) + { + printf (" __________________ Appel de test_hexa_quads_acd \n"); + test_hexa_quads_acd (nbargs, tabargs); + } + + else if (Cestegal (option, "-abcd") || Cestegal (option, "-ABCD")) + { + printf (" __________________ Appel de test_hexa_quads_abcd \n"); + test_hexa_quads_abcd (nbargs, tabargs); + } + + else if (Cestegal (option, "-abce") || Cestegal (option, "-ABCE")) + { + printf (" __________________ Appel de test_hexa_quads_abce \n"); + test_hexa_quads_abce (nbargs, tabargs); + } + + else if (Cestegal (option, "-5") || Cestegal (option, "-abcde") + || Cestegal (option, "-ABCDE")) + { + printf (" __________________ Appel de test_hexa_quads_abcde \n"); + test_hexa_quads_5 (nbargs, tabargs); + } + + else + { + printf (" +++ Veuillez indiquer votre cas-test en argument SVP\n"); + printf (" +++ Creation d'un hexadedre a partir de quadrangles :\n"); + printf (" %s -ab : A partir des quadrangles A et B (opposes)\n", appel); + printf (" %s -ac : A partir des quadrangles A et C (diedre)\n", appel); + printf (" %s -acd : A partir des quadrangles A, C et D (triedre)\n", + appel); + printf (" %s -ace : A partir des quadrangles A, C et E (en U)\n", + appel); + printf (" %s -acbd : A partir des quadrangles A, B, C et D (tunnel)\n", + appel); + printf (" %s -acbe : A partir des quadrangles A, B, C et E (but)\n", + appel); + printf (" %s -5 : A partir de 5 quadrangles (boite sans couvercle)\n", + appel); + } + + return HOK; +} diff --git a/src/TEST_CPP/test_tools.cxx b/src/TEST_CPP/test_tools.cxx new file mode 100755 index 0000000..1b6c61f --- /dev/null +++ b/src/TEST_CPP/test_tools.cxx @@ -0,0 +1,59 @@ + +// C++ : Outils communs aux tests unitaires + +// Copyright (C) 2009-2011 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ +// or email : webmaster.salome@opencascade.com + + +#include "test_unit.hxx" + +#include +#include +#include + +static int nbr_vtk = 0; +static cpchar case_name = "hexa"; +static Hex::Document* docu = NULL; + +static string workspace = "/tmp/test_hexablock"; + +// ======================================================== call_system +void call_system (const string& command) +{ + system (command.c_str()); +} +// ======================================================== goto_workspace +void goto_workspace () +{ + string rmdir = "rm -rf "; + string mkdir = "mkdir -p "; + + call_system (rmdir + workspace); + call_system (mkdir + workspace); + + chdir (workspace.c_str()); +} +// ======================================================== free_workspace +void free_workspace () +{ + string chmod = "chmod 777 "; + + call_system (chmod + workspace); + call_system (chmod + workspace + "/*"); +} diff --git a/src/TEST_CPP/test_unit.hxx b/src/TEST_CPP/test_unit.hxx new file mode 100644 index 0000000..6b20060 --- /dev/null +++ b/src/TEST_CPP/test_unit.hxx @@ -0,0 +1,76 @@ + +// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef _TEST_UNIT_H_ +#define _TEST_UNIT_H_ + +#include "hexa_base.hxx" + +void goto_workspace (); +void free_workspace (); + +int test_sphere (int nbargs, cpchar tabargs[]); +int test_joint (int nbargs, cpchar tabargs[]); +int test_prism (int nbargs, cpchar tabargs[]); +int test_revolution9 (int nbargs, cpchar tabargs[]); +int test_revolution (int nbargs, cpchar tabargs[]); +int test_coude (int nbargs, cpchar tabargs[]); +int test_count (int nbargs, cpchar tabargs[]); +int test_decoupage (int nbargs, cpchar tabargs[]); +int test_gen_xml (int nbargs, cpchar tabargs[]); +int test_string_xml (int nbargs, cpchar tabargs[]); +int test_relecture (int nbargs, cpchar tabargs[]); +int test_spherical (int nbargs, const char* tabargs[]); +int test_grille_cyl (int nbargs, cpchar tabargs[]); +int test_asso_line (int nbargs, cpchar tabargs[]); +int test_cylindrical (int nbargs, cpchar tabargs[]); +int test_cylinder (int nbargs, cpchar tabargs[]); +int test_xml_cylinder (int nbargs, cpchar tabargs[]); +int test_pipe (int nbargs, cpchar tabargs[]); +int test_joint2 (int nbargs, cpchar tabargs[]); +int test_croix (int nbargs, cpchar tabargs[]); +int test_pipes (int nbargs, cpchar tabargs[]); +int test_lorraine(int nbargs, cpchar tabargs[]); +int test_disconnect2 (int nbargs, cpchar tabargs[]); +int test_disconnect4 (int nbargs, cpchar tabargs[]); +int test_disconnect1 (int nbargs, cpchar tabargs[]); +int test_disconnect3 (int nbargs, cpchar tabargs[]); +int test_disconnect (int nbargs, cpchar tabargs[]); +int test_transfo2 (int nbargs, cpchar tabargs[]); +int test_transfo (int nbargs, cpchar tabargs[]); +int test_copy_document (int nbargs, cpchar tabargs[]); +int test_cylindricals (int nbargs, cpchar tabargs[]); +int test_hexa (int nbargs, cpchar tabargs[]); + // Dans test_quads +int test_hexa_quads_5 (int nbargs, cpchar tabargs[]); +int test_hexa_quads_ab (int nbargs, cpchar tabargs[]); +int test_hexa_quads_ac (int nbargs, cpchar tabargs[]); +int test_hexa_quads_ace (int nbargs, cpchar tabargs[]); +int test_hexa_quads_acd (int nbargs, cpchar tabargs[]); +int test_hexa_quads_abcd (int nbargs, cpchar tabargs[]); +int test_hexa_quads_abce (int nbargs, cpchar tabargs[]); +int test_cramer (int nbargs, cpchar tabargs[]); +int test_hexa_quads_ac1 (int nbargs, cpchar tabargs[]); +int test_asso_grid (int nbargs, cpchar tabargs[]); +int test_piquage (int nbargs, cpchar tabargs[]); +int test_replace (int nbargs, cpchar tabargs[]); +int test_hemispheres (int nbargs, cpchar tabargs[]); +int test_quads (int nbargs, cpchar tabargs[]); +#endif diff --git a/src/TEST_PY/INTER_3_CYLINDRE.py b/src/TEST_PY/INTER_3_CYLINDRE.py new file mode 100755 index 0000000..4b0c43d --- /dev/null +++ b/src/TEST_PY/INTER_3_CYLINDRE.py @@ -0,0 +1,415 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#=============================================== +# By Karima DEBCHI YATAGHENE Nov 2009 at CS +#=============================================== + +import os +import SALOME +import geompy +import smesh +import hexablock +import math + + + +# chemin du fichier BREP contenant la CAO +BREP_PATH = os.path.expandvars("$HEXABLOCK_ROOT_DIR/bin/salome/tees.brep") +#=================================================================== +# LE MODELE: +#=================================================================== + + +#============================= +# PARAMETRES +#============================= + +#============================= +# CREATION DOCUMENT +#============================= +doc = hexablock.addDocument("cylindres") + +#============================= +# CREATION DU MODELE +#============================= +CYL1 = 0 +CYL2 = 1 + + +S_E = 0 +S_NE = 1 +S_N = 2 +S_NW = 3 +S_W = 4 +S_SW = 5 +S_S = 6 +S_SE = 7 +S_MAXI = 8 + +##dy = doc.addVector ( 0, 1, 0 ) +dx1 = doc.addVector( -1, 0, 0 ) +dz1 = doc.addVector( 0, 0, 1 ) + + +c_pte_1 = doc.addVertex ( 190., 0., 220. ) +c_grd_1 = doc.addVertex ( 300., 0., 400. ) +cyl_pte_1 = doc.addCylinder( c_pte_1 , dz1 , 20 , 360 ) #580-220 +cyl_grd_1 = doc.addCylinder( c_grd_1 , dx1 , 50 , 140 ) +cross1 = doc.makeCylinders( cyl_pte_1 , cyl_grd_1 ) + + +dx2 = doc.addVector( -1, 0, 0 ) +dz2 = doc.addVector( 0, 0, 1 ) +c_pte_2 = doc.addVertex( 110. , 0. , 400. ) +c_grd_2 = doc.addVertex( 0. , 0. , 0. ) + +cyl_pte_2 = doc.addCylinder( c_pte_2 , dx2 , 50, 220 ) +cyl_grd_2 = doc.addCylinder( c_grd_2 , dz2 , 100, 800 ) +cross2 = doc.makeCylinders( cyl_pte_2, cyl_grd_2 ) + +# Qq constantes +coul1 = 5 +coul2 = 3 + +# Pour les bicylindres +xhint = 0 # indice x pour les hexa interieurs +xhext = 1 # indice x pour les hexa exterieurs +xvint = 0 # indice x pour les vertex interieurs +xvext = 2 # indice x pour les vertex exterieurs +zbas = 0 +zhhaut1 = 5 # hauteur max quad petit cylindre +zhhaut2 = 3 # hauteur max quad gros cylindre +zvhaut1 = 6 # hauteur max vertex du petit cylindre +zvhaut2 = 4 # hauteur max vertex du gros cylindre + +# La jointure +hQuads = [] +for ny in range(8): + hQuads+=[cross2.getQuadIJ(CYL1, xhext, ny, zbas)] + +for ny in range(4): + hQuads+=[cross2.getQuadIJ(CYL1, xhint, ny, zbas)] + +qstart0 = cross2.getQuadIJ (CYL1, xhext, S_E, zbas) +qtarget = cross1.getQuadIJ (CYL2, xhext, S_S, zvhaut2) + +vb0 = qtarget.getVertex (0) +vb1 = qtarget.getVertex (1) +vh0 = qstart0.getVertex (0) +vh1 = qstart0.getVertex (1) + +hauteur = 3 +joint = doc.joinQuads (hQuads, qtarget, vh0,vb0, vh1,vb1, hauteur) + +# Elimination bout en trop +for ny in range(8): + h = cross2.getHexaIJK (CYL1, xhext, ny, zhhaut1) + doc.removeHexa(h) + if ny<4: + h = cross2.getHexaIJK (CYL1, xhint, ny, zhhaut1) + doc.removeHexa(h) + + +#=================================================================== +# Recuperation edges du model pour l'association +#=================================================================== + +##========================= +## EDGES +##========================= +### BIG CYLINDER +top_BIG = [] +bottom_BIG = [] +for ny in range(8): + bottom_BIG += [ cross2.getEdgeJ(CYL2, 2, ny, 0) ] + +for ny in range(8): + top_BIG += [ cross2.getEdgeJ(CYL2, 2, ny, zvhaut2) ] + +### MEDIUM CYLINDER +left_MEDIUM_BIG = [] +right_MEDIUM = [] + +for ny in range(8): + left_MEDIUM_BIG += [cross2.getEdgeJ (CYL1, 2, ny, 1)] + +for ny in range(8): + right_MEDIUM += [ cross1.getEdgeJ (CYL2, 2, ny, 0) ] + +### SMALL CYLINDER +top_SMALL = [] +top_SMALL_MEDIUM = [] +bottom_SMALL_MEDIUM = [] +bottom_SMALL = [] + +for ny in range(8): + top_SMALL += [ cross1.getEdgeJ(CYL1, 2, ny, zvhaut1) ] +for ny in range(8): + top_SMALL_MEDIUM += [ cross1.getEdgeJ(CYL1, 2, ny, zvhaut1-1) ] +for ny in range(8): + bottom_SMALL_MEDIUM += [ cross1.getEdgeJ(CYL1, 2, ny, 1) ] +for ny in range(8): + bottom_SMALL += [ cross1.getEdgeJ(CYL1, 2, ny, 0) ] + + +#=================================================================== +# LA GEOMETRIE +#=================================================================== + +#=================================================================== +# Recuperation des �l�ments de la geometrie tuyau pour l'association +#=================================================================== +tees_ = geompy.Import(BREP_PATH, "BREP") + +##========================= +## EDGES +##========================= +all_edges_ = geompy.SubShapeAllSorted( tees_ , geompy.ShapeType["EDGE"] ) + +### BIG CYLINDER +top_BIG_ = all_edges_[1] +bottom_BIG_ = all_edges_[0] + +### MEDIUM CYLINDER +left_MEDIUM_BIG_ = [ all_edges_[3], all_edges_[5] , all_edges_[4], all_edges_[2], ] +right_MEDIUM_ = all_edges_[20] + +### SMALL CYLINDER +top_SMALL_ = all_edges_[13] +top_SMALL_MEDIUM_ = [ all_edges_[11], all_edges_[16] ] +bottom_SMALL_MEDIUM_ = [ all_edges_[10], all_edges_[9], all_edges_[14], all_edges_[15] ] +bottom_SMALL_ = all_edges_[12] + + +#========================================================== +# LES ASSOCIATIONS +#========================================================== + +##=========================================== +## EDGES +##=========================================== +def associateEdges( edges, edges_, i_assoc, oppositeWay = False ): + nb_points = float( len(i_assoc) ) + #print "nb_points ", nb_points + for i, i_ in i_assoc.items(): + e = edges[i] + e0 = e.getVertex(0) + e1 = e.getVertex(1) + + if oppositeWay: + u0 = (i_+1.)/nb_points + u1 = i_/nb_points + e.addAssociation( edges_ , u1, u0 ) + else: + u0 = i_/nb_points + u1 = (i_+1.)/nb_points + e.addAssociation( edges_ , u0, u1 ) + + e0_ = geompy.MakeVertexOnCurve( edges_, u0 ) + e1_ = geompy.MakeVertexOnCurve( edges_, u1 ) + e0.setAssociation( e0_ ) + e1.setAssociation( e1_ ) + + + +## BIG CYLINDER +assoc = { 4:0, 5:1, 6:2, 7:3, 0:4, 1:5, 2:6, 3:7 } +associateEdges( top_BIG , top_BIG_, assoc ) +associateEdges( bottom_BIG, bottom_BIG_, assoc ) + +## SMALL CYLINDER +assoc = { 4:6, 5:7, 6:0, 7:1, 0:2, 1:3, 2:4, 3:5 } +associateEdges( top_SMALL , top_SMALL_, assoc ) +associateEdges( bottom_SMALL, bottom_SMALL_, assoc ) + + +## SMALL-MEDIUM CYLINDER + +### Top ( un peu 'touchy' ) +e = top_SMALL_MEDIUM[0] +e_0 = e.getVertex(0) +e_0_ = geompy.MakeVertexOnCurve( top_SMALL_MEDIUM_[0], 0.) +e_0.setAssociation( e_0_ ) +top_SMALL_MEDIUM_0_vertices_ = [ e_0_ ] + +for i, e in enumerate( top_SMALL_MEDIUM[0:6] ): + e_1 = e.getVertex(1) + e_1_ = geompy.MakeVertexOnCurve( top_SMALL_MEDIUM_[0], (i+1.)/6.) + e_1.setAssociation( e_1_ ) + top_SMALL_MEDIUM_0_vertices_ += [ e_1_ ] + +partition_ = geompy.MakePartition( [ top_SMALL_MEDIUM_[0] ], + top_SMALL_MEDIUM_0_vertices_, [], [], geompy.ShapeType["EDGE"], 0, [], 0 ) +top_SMALL_MEDIUM_0_edges_ = geompy.SubShapeAllSorted( partition_, geompy.ShapeType["EDGE"] ) + + +assoc = { 0:2, 1:0, 2:1, 3:3, 4:4, 5:5 } +for i,i_ in assoc.items(): + e = top_SMALL_MEDIUM[i] + e_ = top_SMALL_MEDIUM_0_edges_[i_] + e.addAssociation( e_, 0., 1. ) + +assoc = { 6:0, 7:1 } +associateEdges( top_SMALL_MEDIUM, top_SMALL_MEDIUM_[1], assoc ) + + +### Bottom +assocs = [ { 0:1, 1:0 }, { 2:1, 3:0 }, { 4:0, 5:1 }, { 6:0, 7:1 } ] # 4 edges +associateEdges( bottom_SMALL_MEDIUM, bottom_SMALL_MEDIUM_[0], assocs[0], True ) +associateEdges( bottom_SMALL_MEDIUM, bottom_SMALL_MEDIUM_[1], assocs[1], True ) +associateEdges( bottom_SMALL_MEDIUM, bottom_SMALL_MEDIUM_[2], assocs[2] ) +associateEdges( bottom_SMALL_MEDIUM, bottom_SMALL_MEDIUM_[3], assocs[3] ) + + + +## MEDIUM CYLINDER +assocs = [ { 0:0, 1:1 }, { 2:0, 3:1 }, { 4:1, 5:0 }, { 6:1, 7:0 } ] +associateEdges( left_MEDIUM_BIG, left_MEDIUM_BIG_[0], assocs[0] ) +associateEdges( left_MEDIUM_BIG, left_MEDIUM_BIG_[1], assocs[1] ) +associateEdges( left_MEDIUM_BIG, left_MEDIUM_BIG_[2], assocs[2], True ) +associateEdges( left_MEDIUM_BIG, left_MEDIUM_BIG_[3], assocs[3], True ) + +assoc = { 0:3, 1:2, 2:1, 3:0, 4:7, 5:6, 6:5, 7:4 } +associateEdges( right_MEDIUM, right_MEDIUM_, assoc , True ) + + + +#allfaces_ = geompy.SubShapeAllSorted(tees_, geompy.ShapeType["FACE"]) +#for i,f in enumerate( allfaces_ ): + #geompy.addToStudy( f, "allfaces"+str(i) ) + +#for ny in range(8): + #q = cross2.getQuadJK(CYL2,2,ny,0) + #q.addAssociation( allfaces_[2] ) + +#for ny in range(8): + #q = cross2.getQuadJK(CYL2,2,ny,1) + #if q: + #q.addAssociation( allfaces_[2] ) + + + + +##========================================================== +## LA GEOMETRIE DANS L'ARBRE D'ETUDE SALOME +##========================================================== +geompy.addToStudy( tees_, "Tees" ) + +#### BIG CYLINDER +geompy.addToStudy( top_BIG_, "top_BIG" ) +geompy.addToStudy( bottom_BIG_, "bottom_BIG" ) + +#### SMALL CYLINDER +geompy.addToStudy( top_SMALL_, "top_SMALL" ) +for i,e in enumerate(top_SMALL_MEDIUM_): + geompy.addToStudy( e, "top_SMALL_MEDIUM"+str(i) ) +for i,e in enumerate(top_SMALL_MEDIUM_0_edges_): + geompy.addToStudy( e, "top_SMALL_MEDIUM_0_edges_"+str(i) ) +for i,e in enumerate(bottom_SMALL_MEDIUM_): + geompy.addToStudy( e, "bottom_SMALL_MEDIUM"+str(i) ) +geompy.addToStudy( bottom_SMALL_, "bottom_SMALL" ) + +#### MEDIUM CYLINDER +geompy.addToStudy( right_MEDIUM_, "right_MEDIUM" ) +for i,e in enumerate(left_MEDIUM_BIG_): + geompy.addToStudy( e, "left_MEDIUM_BIG"+str(i) ) + + + +#==================================== +# CREATION GROUPES DU MAILLAGE +#==================================== + +#On definit 3 groupes de mailles + +#groupe d edges (aretes) +Edge_grp = doc.addEdgeGroup("Edge_grp") +Nbr_Edg = doc.countEdge() +for i in range(Nbr_Edg): + Edge_i = doc.getEdge(i) + Edge_grp.addElement(Edge_i) + +# groupe de quads (faces) +Quad_grp = doc.addQuadGroup("Quad_grp") +Nbr_Qad = doc.countQuad() +for i in range(Nbr_Qad): + Quad_i = doc.getQuad(i) + Quad_grp.addElement(Quad_i) + +# groupe d hexas (solids) +Hexa_grp = doc.addHexaGroup("Hexa_grp") +Nbr_Hex = doc.countHexa() +for i in range(Nbr_Hex): + Hexa_i = doc.getHexa(i) + Hexa_grp.addElement(Hexa_i) + +# groupe de noeuds de vertex pour tout le modele +Vertex_Nod_Grp = doc.addVertexNodeGroup("Vertex_Nod_Grp") +Nbr_Vx = doc.countVertex() +for i in range(Nbr_Vx): + Vertex_i = doc.getVertex(i) + Vertex_Nod_Grp.addElement(Vertex_i) + + + +##==================================== +## CREATION MAILLAGE +##==================================== + + +##==================================== +## Definir une loi de discretisation +##==================================== + + +# definir une loi: le choix de la loi reste aux utilisateurs +Law = doc.addLaw( "Uniform" , 4 ) +#Law = doc.addLaw( "Uniform" , 8 ) + +# chercher les propagations du modele +N_Propa = doc.countPropagation() + +for j in range(N_Propa): + Propa = doc.getPropagation(j) + Propa.setLaw( Law )# appliquer la loi de discretisation sur tout le modele et generer le maillage + +try: + mesh = hexablock.mesh(doc, "Inter_3_Cylindre") +# mesh = .hexablock.mesh(doc, "Inter_3_Cylindre:quads", 2) +except SALOME.SALOME_Exception, ex: + print "Mesh computation failed, exception caught:" + print " ", ex.details.text +except: + import traceback + print "Mesh computation failed, exception caught:" + traceback.print_exc() + + +print "Nombre d'hexaedres:", mesh.NbHexas() +print "Nombre de quadrangles:", mesh.NbQuadrangles() +print "Nombre de segments:", mesh.NbEdges() +print "Nombre de noeuds:", mesh.NbNodes() + + + + + + diff --git a/src/TEST_PY/Makefile.am b/src/TEST_PY/Makefile.am new file mode 100755 index 0000000..87385ed --- /dev/null +++ b/src/TEST_PY/Makefile.am @@ -0,0 +1,47 @@ +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +# +# =============================================================== +# Files to be installed +# =============================================================== + +# Scripts to be installed +# dist_salomescript_PYTHON = TestHEXA.py +dist_salomescript_PYTHON = \ + bielle.py \ + test_BIELLE_no_assoc.py \ + test_BIELLE_bad_assoc.py \ + TUYAU_COURBE.py \ + test_TUYAU_COURBE_no_assoc.py \ + test_TUYAU_COURBE_weird_assoc.py \ + INTER_3_CYLINDRE.py \ + test_INTER_3_CYLINDRE_no_assoc.py \ + Test_HEXABLOCK.py \ + test_HEXABLOCK.py \ + bride.py \ + test_distrib.py + +dist_salomescript_DATA = \ + tees.brep \ + tuyau.brep \ + crank.stp + diff --git a/src/TEST_PY/TUYAU_COURBE.py b/src/TEST_PY/TUYAU_COURBE.py new file mode 100755 index 0000000..51331bf --- /dev/null +++ b/src/TEST_PY/TUYAU_COURBE.py @@ -0,0 +1,790 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#=============================================== +# By Karima DEBCHI YATAGHENE Nov 2009 at CS +#=============================================== +import os +import geompy +import smesh +import hexablock +import math + +# chemin du fichier BREP contenant la CAO +BREP_PATH = os.path.expandvars("$HEXABLOCK_ROOT_DIR/bin/salome/tuyau.brep") + + + + +#=================================================================== +# LE MODELE: +# (Pour le tuyau on doit creer une grille cylindrique) +#=================================================================== + + +#============================= +# PARAMETRES +#============================= +R = 4.5 +r = 4.5 +r_t = 3.6 +h = 75.0 + + +#================================================= +# Creation du document +#================================================= +doc = hexablock.addDocument("TUYAU_COURBE") + +#================================================= +# Creation du tuyau (grille cylindrique) dans le document +#================================================= +# centre de la grille cylindrique +c = doc.addVertex(0, 0, 0) + +# vecteurs de la grille cylindrique +dx = doc.addVector(h, 0, 0) +dy = doc.addVector(0, h, 0) +dz = doc.addVector(0, 0, h) + +# taille du cylindre +dr = R +da = 360 +dl = h + +nr = 1 +na = 4 +nl = 1 + +model_tuyau_fin = doc.makeCylindrical(c, dx, dz, dr, da, dl, nr, na, nl, False) +# note: on obtient une liste qui contient 4 hexaedres eguaux + + +#=================================================================== +# Recuperation des vertex,edges et quads du model pour l'association +# +# h = haut +# b = bas +# g = grand +# p = petit +# t = trou +#=================================================================== + +#========================= +# VERTEX +#========================= + +# Face du haut +# grand rayon +x_mod_h = doc.findVertex( 2*R , 0 , h ) +y_mod_h = doc.findVertex( 0 , 2*R , h ) +z_mod_h = doc.findVertex( -2*R , 0 , h ) +u_mod_h = doc.findVertex( 0 , -2*R , h ) + +# petit rayon +x_mod_h_t = doc.findVertex( R , 0 , h ) +y_mod_h_t = doc.findVertex( 0 , R , h ) +z_mod_h_t = doc.findVertex( -R , 0 , h ) +u_mod_h_t = doc.findVertex( 0 , -R , h ) + +# Face du bas +# grand rayon +x_mod_b = doc.findVertex( 2*R , 0 , 0 ) +y_mod_b = doc.findVertex( 0 , 2*R , 0 ) +z_mod_b = doc.findVertex( -2*R , 0 , 0 ) +u_mod_b = doc.findVertex( 0 , -2*R , 0 ) + +# petit rayon +x_mod_b_t = doc.findVertex( R , 0 , 0 ) +y_mod_b_t = doc.findVertex( 0 , R , 0 ) +z_mod_b_t = doc.findVertex( -R , 0 , 0 ) +u_mod_b_t = doc.findVertex( 0 , -R , 0 ) + + +# v�rifications +assert x_mod_h +assert y_mod_h +assert z_mod_h +assert u_mod_h + +assert x_mod_h_t +assert y_mod_h_t +assert z_mod_h_t +assert u_mod_h_t + +assert x_mod_b +assert y_mod_b +assert z_mod_b +assert u_mod_b + +assert x_mod_b_t +assert y_mod_b_t +assert z_mod_b_t +assert u_mod_b_t + + +#========================= +# EDGES +#========================= + +# Face du haut + +# grand rayon +edge_mod_face_h_1_1 = doc.findEdge( y_mod_h , z_mod_h ) +edge_mod_face_h_1_2 = doc.findEdge( z_mod_h , u_mod_h ) +edge_mod_face_h_2_1 = doc.findEdge( y_mod_h, x_mod_h ) +edge_mod_face_h_2_2 = doc.findEdge( x_mod_h, u_mod_h ) + +# petit rayon +edge_mod_t_face_h_1_1 = doc.findEdge( y_mod_h_t , z_mod_h_t ) +edge_mod_t_face_h_1_2 = doc.findEdge( z_mod_h_t , u_mod_h_t ) +edge_mod_t_face_h_2_1 = doc.findEdge( y_mod_h_t, x_mod_h_t ) +edge_mod_t_face_h_2_2 = doc.findEdge( x_mod_h_t, u_mod_h_t ) + + +# Face du bas + +# grand rayon +edge_mod_face_b_1_1 = doc.findEdge( y_mod_b , z_mod_b ) +edge_mod_face_b_1_2 = doc.findEdge( z_mod_b , u_mod_b ) +edge_mod_face_b_2_1 = doc.findEdge( y_mod_b, x_mod_b ) +edge_mod_face_b_2_2 = doc.findEdge( x_mod_b, u_mod_b ) + +# petit rayon +edge_mod_t_face_b_1_1 = doc.findEdge( y_mod_b_t , z_mod_b_t ) +edge_mod_t_face_b_1_2 = doc.findEdge( z_mod_b_t , u_mod_b_t ) +edge_mod_t_face_b_2_1 = doc.findEdge( y_mod_b_t, x_mod_b_t ) +edge_mod_t_face_b_2_2 = doc.findEdge( x_mod_b_t, u_mod_b_t ) + + + +# Joignant faces haut et du bas +Edge_Mod_ext_h = doc.findEdge( y_mod_h , y_mod_b ) +Edge_Mod_int_h = doc.findEdge( y_mod_h_t , y_mod_b_t ) + +Edge_Mod_int_b = doc.findEdge( u_mod_h_t , u_mod_b_t ) +Edge_Mod_ext_b = doc.findEdge( u_mod_h , u_mod_b ) + +Edge_Mod_ext_g = doc.findEdge( x_mod_h , x_mod_b ) +Edge_Mod_int_g = doc.findEdge( x_mod_h_t , x_mod_b_t ) + +Edge_Mod_int_d = doc.findEdge( z_mod_h_t , z_mod_b_t ) +Edge_Mod_ext_d = doc.findEdge( z_mod_h , z_mod_b ) + + +# v�rifications +assert edge_mod_face_h_1_1 +assert edge_mod_face_h_1_2 +assert edge_mod_face_h_2_1 +assert edge_mod_face_h_2_2 + +assert edge_mod_t_face_h_1_1 +assert edge_mod_t_face_h_1_2 +assert edge_mod_t_face_h_2_1 +assert edge_mod_t_face_h_2_2 + +assert edge_mod_face_b_1_1 +assert edge_mod_face_b_1_2 +assert edge_mod_face_b_2_1 +assert edge_mod_face_b_2_2 + +assert edge_mod_t_face_b_1_1 +assert edge_mod_t_face_b_1_2 +assert edge_mod_t_face_b_2_1 +assert edge_mod_t_face_b_2_2 + + +assert Edge_Mod_ext_h +assert Edge_Mod_int_h + +assert Edge_Mod_int_b +assert Edge_Mod_ext_b + +assert Edge_Mod_ext_g +assert Edge_Mod_int_g + +assert Edge_Mod_int_d +assert Edge_Mod_ext_d + + + +#========================= +# QUADS +#========================= +Quad_mod_0 = model_tuyau_fin.getQuadJK( 1 , 0 , 0 ) +Quad_mod_1 = model_tuyau_fin.getQuadJK( 1 , 1 , 0 ) +Quad_mod_2 = model_tuyau_fin.getQuadJK( 1 , 2 , 0 ) +Quad_mod_3 = model_tuyau_fin.getQuadJK( 1 , 3 , 0 ) + + + +#=================================================================== +# LA GEOMETRIE +#=================================================================== + +#=================================================================== +# Recuperation des points de la geometrie tuyau pour l'association +# +#=================================================================== +Tuyau_geom = geompy.Import(BREP_PATH, "BREP") +doc.setShape(Tuyau_geom) + +#========================= +# SOMMETS +#========================= +Pt_A = geompy.MakeVertex( h , 20 , 4.5 ) +Pt_B = geompy.MakeVertex( h , 20 , 3.6 ) +Pt_C = geompy.MakeVertex( h , 20 , -4.5 ) +Pt_D = geompy.MakeVertex( h , 20 , -3.6 ) +Pt_E = geompy.MakeVertex( 0 , 0 , 2 ) +Pt_F = geompy.MakeVertex( 0 , 0 , 1.6 ) +Pt_G = geompy.MakeVertex( 0 , 0 , -2 ) +Pt_H = geompy.MakeVertex( 0 , 0 , -1.6 ) + +# Face du bas +Edge_bas_droite_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_E) +Edge_bas_droite_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_F) +Edge_bas_gauche_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_G) +Edge_bas_gauche_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_H) +## Grand rayon +x_b = geompy.MakeVertexOnCurve(Edge_bas_droite_grd, 0.5) +y_b = geompy.MakeVertexOnCurve(Edge_bas_droite_grd, 1) +z_b = geompy.MakeVertexOnCurve(Edge_bas_gauche_grd, 0.5) +u_b = geompy.MakeVertexOnCurve(Edge_bas_gauche_grd, 0) + +## Petit rayon +x_b_t = geompy.MakeVertexOnCurve(Edge_bas_droite_pte, 0.5) +y_b_t = geompy.MakeVertexOnCurve(Edge_bas_droite_pte, 1) +z_b_t = geompy.MakeVertexOnCurve(Edge_bas_gauche_pte, 0.5) +u_b_t = geompy.MakeVertexOnCurve(Edge_bas_gauche_pte, 0) + + +# Face du haut +Edge_haut_droite_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_A) +Edge_haut_droite_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_B) +Edge_haut_gauche_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_C) +Edge_haut_gauche_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_D) +## Grand rayon +x_h = geompy.MakeVertexOnCurve(Edge_haut_droite_grd, 0.5) +y_h = geompy.MakeVertexOnCurve(Edge_haut_droite_grd, 1) +z_h = geompy.MakeVertexOnCurve(Edge_haut_gauche_grd, 0.5) +u_h = geompy.MakeVertexOnCurve(Edge_haut_gauche_grd, 0) + +## Petit rayon +x_h_t = geompy.MakeVertexOnCurve(Edge_haut_droite_pte, 0.5) +y_h_t = geompy.MakeVertexOnCurve(Edge_haut_droite_pte, 1) +z_h_t = geompy.MakeVertexOnCurve(Edge_haut_gauche_pte, 0.5) +u_h_t = geompy.MakeVertexOnCurve(Edge_haut_gauche_pte, 0) + + + +#========================= +# EDGES +#========================= +All_Edges_Tuy_1 = geompy.SubShapeAllSorted( Tuyau_geom , geompy.ShapeType["EDGE"] ) + +# Face du haut +## Grand rayon +edge_face_h_1 = All_Edges_Tuy_1[11] +edge_face_h_2 = All_Edges_Tuy_1[14] +## Petit rayon +edge_t_face_h_1 = All_Edges_Tuy_1[12] +edge_t_face_h_2 = All_Edges_Tuy_1[13] + + +# Face du bas +## Grand rayon +edge_face_b_1 = All_Edges_Tuy_1[1] +edge_face_b_2 = All_Edges_Tuy_1[4] +## Petit rayon +edge_t_face_b_1 = All_Edges_Tuy_1[2] +edge_t_face_b_2 = All_Edges_Tuy_1[3] + + +# Joignant les 2 faces + +## edges compl�tes +Edge_Tuy_ext_h = All_Edges_Tuy_1[6] +Edge_Tuy_int_h = All_Edges_Tuy_1[7] +Edge_Tuy_int_b = All_Edges_Tuy_1[8] +Edge_Tuy_ext_b = All_Edges_Tuy_1[9] + +Pt_Z = geompy.MakeVertex( 75 , 20 , 0 ) +Pt_Z_1 = geompy.MakeVertexWithRef( Pt_Z , 0 , 0 , 10 ) +Pt_Z_2 = geompy.MakeVertexWithRef( Pt_Z , 0 , 0 , -10 ) +Line_Z1_Z2 = geompy.MakeLineTwoPnt( Pt_Z_1 , Pt_Z_2 ) + + +All_Edge_Tuy_ext_h = geompy.SubShapeAllSorted( Edge_Tuy_ext_h , geompy.ShapeType["VERTEX"] ) + +Vx_Edg_Tuy_ext_h_1 = All_Edge_Tuy_ext_h[0] +Vx_Edg_Tuy_ext_h_2 = All_Edge_Tuy_ext_h[1] + +Vx_Edg_Tuy_ext_h_1_trans = geompy.MakeVertexWithRef( Vx_Edg_Tuy_ext_h_1 , -10 , -10 , 0 ) +Vx_Edg_Tuy_ext_h_2_trans = geompy.MakeVertexWithRef( Vx_Edg_Tuy_ext_h_2 , 10 , 0 , 0 ) + +Line_1 = geompy.MakeLineTwoPnt(Vx_Edg_Tuy_ext_h_1, Vx_Edg_Tuy_ext_h_1_trans) +Line_2 = geompy.MakeLineTwoPnt(Vx_Edg_Tuy_ext_h_2, Vx_Edg_Tuy_ext_h_2_trans) + +Wire = geompy.MakeWire([Line_1, Line_2, Edge_Tuy_ext_h]) +Pipe_Z = geompy.MakePipe( Line_Z1_Z2 , Wire ) +Pipe_Ztt = geompy.MakePipe( Line_Z1_Z2 , Edge_Tuy_ext_h ) +Partition_Ztt = geompy.MakePartition([Tuyau_geom], [Pipe_Ztt], [], [], geompy.ShapeType["SOLID"], 0, [], 0) +All_Edges_Tuy_2tt = geompy.SubShapeAllSorted( Partition_Ztt , geompy.ShapeType["EDGE"] ) + +Edge_Tuy_ext_g = All_Edges_Tuy_2tt[12] +Edge_Tuy_int_g = All_Edges_Tuy_2tt[13] +Edge_Tuy_ext_d = All_Edges_Tuy_2tt[10] +Edge_Tuy_int_d = All_Edges_Tuy_2tt[11] + +## une edge en plusieurs(4) morceaux : Edge_Tuy_ext_h +X_pln1 = geompy.MakeVertexWithRef( Pt_Z , -20 , 0 , 0 ) +Vec_X = geompy.MakeVectorDXDYDZ( 1 , 0 , 0 ) + +Plan1 = geompy.MakePlane( X_pln1 , Vec_X , 200 ) +Plan2 = geompy.MakeTranslation( Plan1 , -20 , 0 , 0 ) +Plan3 = geompy.MakeTranslation( Plan1 , -40 , 0 , 0 ) + +Partition_Edge_g_d_h_b = geompy.MakePartition([ + Edge_Tuy_ext_h, + Edge_Tuy_int_h, + Edge_Tuy_ext_b, + Edge_Tuy_int_b, + Edge_Tuy_ext_g, + Edge_Tuy_int_g, + Edge_Tuy_ext_d, + Edge_Tuy_int_d], + [Plan1, Plan2, Plan3], [], [], geompy.ShapeType["EDGE"], 0, [], 0) + +All_Edge_g_d_h_b = geompy.SubShapeAllSorted( Partition_Edge_g_d_h_b , geompy.ShapeType["EDGE"] ) +Edge_Tuy_ext_h_1 = All_Edge_g_d_h_b[0] +Edge_Tuy_ext_h_2 = All_Edge_g_d_h_b[15] +Edge_Tuy_ext_h_3 = All_Edge_g_d_h_b[23] +Edge_Tuy_ext_h_4 = All_Edge_g_d_h_b[31] + + + +#========================= +# FACES +#========================= +All_Faces_Tuy_1 = geompy.SubShapeAllSorted( Tuyau_geom , geompy.ShapeType["FACE"] ) + +Face_Tuy_ext_1 = All_Faces_Tuy_1[4] +Face_Tuy_ext_2 = All_Faces_Tuy_1[5] + +Partition_Face = geompy.MakePartition([ Face_Tuy_ext_1 , Face_Tuy_ext_2 ], [ Plan1 , Plan2 , Plan3 , Pipe_Z ], [], [], geompy.ShapeType["FACE"], 0, [], 0) + + +All_Faces_Partition_Face = geompy.SubShapeAllSorted( Partition_Face , geompy.ShapeType["FACE"] ) + +## ------------------------------------- +Face_0 = All_Faces_Partition_Face[0] +Face_6 = All_Faces_Partition_Face[6] +Face_10 = All_Faces_Partition_Face[10] +Face_14 = All_Faces_Partition_Face[14] + +## ------------------------------------- +Face_1 = All_Faces_Partition_Face[1] +Face_7 = All_Faces_Partition_Face[7] +Face_11 = All_Faces_Partition_Face[11] +Face_15 = All_Faces_Partition_Face[15] + +## ------------------------------------- +Face_2 = All_Faces_Partition_Face[2] +Face_4 = All_Faces_Partition_Face[4] +Face_8 = All_Faces_Partition_Face[8] +Face_12 = All_Faces_Partition_Face[12] + +## ------------------------------------- +Face_3 = All_Faces_Partition_Face[3] +Face_5 = All_Faces_Partition_Face[5] +Face_9 = All_Faces_Partition_Face[9] +Face_13 = All_Faces_Partition_Face[13] + + + + + +#========================================================== +# LES ASSOCIATIONS +#========================================================== + +##=========================================== +## VERTEX +##=========================================== + +# Face du haut + +## Grand rayon +x_mod_h.setAssociation( x_h ) +y_mod_h.setAssociation( y_h ) +z_mod_h.setAssociation( z_h ) +u_mod_h.setAssociation( u_h ) + +## Petit rayon +x_mod_h_t.setAssociation( x_h_t ) +y_mod_h_t.setAssociation( y_h_t ) +z_mod_h_t.setAssociation( z_h_t ) +u_mod_h_t.setAssociation( u_h_t ) + + +# Face du bas + +## Grand rayon +x_mod_b.setAssociation( x_b ) +y_mod_b.setAssociation( y_b ) +z_mod_b.setAssociation( z_b ) +u_mod_b.setAssociation( u_b ) + +## Petit rayon +x_mod_b_t.setAssociation( x_b_t ) +y_mod_b_t.setAssociation( y_b_t ) +z_mod_b_t.setAssociation( z_b_t ) +u_mod_b_t.setAssociation( u_b_t ) + + +##=========================================== +## EDGES +##=========================================== + +# Face du haut + +## Grand rayon +edge_mod_face_h_1_1.addAssociation( edge_face_h_1, 0.5, 1. ) +edge_mod_face_h_1_2.addAssociation( edge_face_h_1, 0., 0.5 ) +edge_mod_face_h_2_1.addAssociation( edge_face_h_2, 0.5, 1. ) +edge_mod_face_h_2_2.addAssociation( edge_face_h_2, 0., 0.5 ) + +## Petit rayon +edge_mod_t_face_h_1_1.addAssociation( edge_t_face_h_1, 0.5, 1. ) +edge_mod_t_face_h_1_2.addAssociation( edge_t_face_h_1, 0., 0.5 ) +edge_mod_t_face_h_2_1.addAssociation( edge_t_face_h_2, 0.5, 1. ) +edge_mod_t_face_h_2_2.addAssociation( edge_t_face_h_2, 0., 0.5 ) + +# Face du bas + +## Grand rayon +edge_mod_face_b_1_1.addAssociation( edge_face_b_1, 0.5, 1. ) +edge_mod_face_b_1_2.addAssociation( edge_face_b_1, 0., 0.5 ) +edge_mod_face_b_2_1.addAssociation( edge_face_b_2, 0.5, 1. ) +edge_mod_face_b_2_2.addAssociation( edge_face_b_2, 0., 0.5 ) + +## Petit rayon +edge_mod_t_face_b_1_1.addAssociation( edge_t_face_b_1, 0.5, 1. ) +edge_mod_t_face_b_1_2.addAssociation( edge_t_face_b_1, 0., 0.5 ) +edge_mod_t_face_b_2_1.addAssociation( edge_t_face_b_2, 0.5, 1. ) +edge_mod_t_face_b_2_2.addAssociation( edge_t_face_b_2, 0., 0.5 ) + + + +# Joignant les 2 faces +#Edge_Mod_ext_h.addAssociation( Edge_Tuy_ext_h, 0., 1. ) +Edge_Mod_ext_h.addAssociation( Edge_Tuy_ext_h_1, 0., 1. ) +Edge_Mod_ext_h.addAssociation( Edge_Tuy_ext_h_2, 0., 1. ) +Edge_Mod_ext_h.addAssociation( Edge_Tuy_ext_h_3, 0., 1. ) +Edge_Mod_ext_h.addAssociation( Edge_Tuy_ext_h_4, 0., 1. ) +Edge_Mod_int_h.addAssociation( Edge_Tuy_int_h, 0., 1. ) + +Edge_Mod_int_b.addAssociation( Edge_Tuy_int_b, 0., 1. ) +Edge_Mod_ext_b.addAssociation( Edge_Tuy_ext_b, 0., 1. ) + +Edge_Mod_ext_g.addAssociation( Edge_Tuy_ext_g, 0., 1. ) +Edge_Mod_int_g.addAssociation( Edge_Tuy_int_g, 0., 1. ) + +Edge_Mod_int_d.addAssociation( Edge_Tuy_int_d, 0., 1. ) +Edge_Mod_ext_d.addAssociation( Edge_Tuy_ext_d, 0., 1. ) + + +#Quad_mod_1.addAssociation( Face_Tuy_ext_1 ) +Quad_mod_1.addAssociation( Face_0 ) +Quad_mod_1.addAssociation( Face_6 ) +Quad_mod_1.addAssociation( Face_10 ) +Quad_mod_1.addAssociation( Face_14 ) + +#Quad_mod_0.addAssociation( Face_Tuy_ext_2 ) +Quad_mod_0.addAssociation( Face_1 ) +Quad_mod_0.addAssociation( Face_7 ) +Quad_mod_0.addAssociation( Face_11 ) +Quad_mod_0.addAssociation( Face_15 ) + +#Quad_mod_2.addAssociation( Face_Tuy_ext_1 ) +Quad_mod_2.addAssociation( Face_2 ) +Quad_mod_2.addAssociation( Face_4 ) +Quad_mod_2.addAssociation( Face_8 ) +Quad_mod_2.addAssociation( Face_12 ) + +#Quad_mod_3.addAssociation( Face_Tuy_ext_2 ) +Quad_mod_3.addAssociation( Face_3 ) +Quad_mod_3.addAssociation( Face_5 ) +Quad_mod_3.addAssociation( Face_9 ) +Quad_mod_3.addAssociation( Face_13 ) + + + +#========================================================== +# LA GEOMETRIE DANS L'ARBRE D'ETUDE SALOME +#========================================================== +#for i,e in enumerate(All_Edges_Tuy_1): geompy.addToStudy( e, "edge_"+str(i) ) +geompy.addToStudy(Tuyau_geom, "Tuyau_geom") +geompy.addToStudy( x_h, "x_h" ) +geompy.addToStudy( y_h, "y_h" ) +geompy.addToStudy( z_h, "z_h" ) +geompy.addToStudy( u_h, "u_h" ) +geompy.addToStudy( x_h_t, "x_h_t") +geompy.addToStudy( y_h_t, "y_h_t" ) +geompy.addToStudy( z_h_t, "z_h_t" ) +geompy.addToStudy( u_h_t, "u_h_t" ) + +geompy.addToStudy( x_b, "x_b") +geompy.addToStudy( y_b, "y_b" ) +geompy.addToStudy( z_b, "z_b" ) +geompy.addToStudy( u_b, "u_b") +geompy.addToStudy( x_b_t, "x_b_t" ) +geompy.addToStudy( y_b_t, "y_b_t" ) +geompy.addToStudy( z_b_t, "z_b_t" ) +geompy.addToStudy( u_b_t, "u_b_t" ) + + +#geompy.addToStudy(Line_Z1_Z2, "Line_Z1_Z2") +#geompy.addToStudy(Pipe_Ztt, "Pipe_Ztt") +#geompy.addToStudy( Partition_Ztt , "Partition_Ztt" ) +geompy.addToStudy( Edge_Tuy_ext_h , "Edge_Tuy_ext_h" ) +geompy.addToStudy( Edge_Tuy_int_h , "Edge_Tuy_int_h" ) +geompy.addToStudy( Edge_Tuy_int_b , "Edge_Tuy_int_b" ) +geompy.addToStudy( Edge_Tuy_ext_b , "Edge_Tuy_ext_b" ) +geompy.addToStudy( Edge_Tuy_ext_g , "Edge_Tuy_ext_g" ) +geompy.addToStudy( Edge_Tuy_int_g , "Edge_Tuy_int_g" ) +geompy.addToStudy( Edge_Tuy_ext_d , "Edge_Tuy_ext_d" ) +geompy.addToStudy( Edge_Tuy_int_d , "Edge_Tuy_int_d" ) +#geompy.addToStudy( Partition_Edge_g_d_h_b , "Partition_Edge_g_d_h_b" ) +geompy.addToStudy( Face_Tuy_ext_1 , "Face_Tuy_ext_1" ) +geompy.addToStudy( Face_Tuy_ext_2 , "Face_Tuy_ext_2" ) +#geompy.addToStudy( Partition_Face , "Partition_Face" ) +geompy.addToStudy( Face_0 , "Face_0" ) +geompy.addToStudy( Face_1 , "Face_1" ) +geompy.addToStudy( Face_2 , "Face_2" ) +geompy.addToStudy( Face_3 , "Face_3" ) +geompy.addToStudy( Face_4 , "Face_4" ) +geompy.addToStudy( Face_5 , "Face_5" ) +geompy.addToStudy( Face_6 , "Face_6" ) +geompy.addToStudy( Face_7 , "Face_7" ) +geompy.addToStudy( Face_8 , "Face_8" ) +geompy.addToStudy( Face_9 , "Face_9" ) +geompy.addToStudy( Face_10 , "Face_10" ) +geompy.addToStudy( Face_11 , "Face_11" ) +geompy.addToStudy( Face_12 , "Face_12" ) +geompy.addToStudy( Face_13 , "Face_13" ) +geompy.addToStudy( Face_14 , "Face_14" ) +geompy.addToStudy( Face_15 , "Face_15" ) + + + + + +#==================================== +# CREATION MAILLAGE +#==================================== + + +##================================================= +## Definir les groupes d'elements pour le maillage +##================================================= + +# groupe de Hexa(volumes) +Hexa_grp = doc.addHexaGroup("Hexa_all_grp") +Nbr_Hex = doc.countHexa() +print "doc.countHexa()->",Nbr_Hex + +for i in range(Nbr_Hex): + Hexa_i = doc.getHexa(i) + Hexa_grp.addElement(Hexa_i) + +#Nbr_elm_hex = Hexa_grp.countElement() +#print "Hexa_all_grp countElement() ->",Nbr_elm_hex + +for i in range(Nbr_Hex): + Hexa_grp = doc.addHexaGroup("Hexa_grp"+str(i)) + Hexa_i = doc.getHexa(i) + Hexa_grp.addElement(Hexa_i) + +# groupe de quads (faces) +Quad_grp_haut = doc.addQuadGroup("Quad_grp_haut") +Quad_h_1 = doc.findQuad( x_mod_h , y_mod_h_t ) +Quad_h_2 = doc.findQuad( y_mod_h_t , z_mod_h ) +Quad_h_3 = doc.findQuad( z_mod_h , u_mod_h_t ) +Quad_h_4 = doc.findQuad( u_mod_h_t , x_mod_h ) + +assert Quad_h_1 +assert Quad_h_2 +assert Quad_h_3 +assert Quad_h_4 + +for Quad_h_i in [ Quad_h_1 , Quad_h_2 , Quad_h_3 , Quad_h_4 ]: + Quad_grp_haut.addElement(Quad_h_i) + + +Quad_grp_bas = doc.addQuadGroup("Quad_grp_bas") +Quad_b_1 = doc.findQuad( x_mod_b , y_mod_b_t ) +Quad_b_2 = doc.findQuad( y_mod_b_t , z_mod_b ) +Quad_b_3 = doc.findQuad( z_mod_b , u_mod_b_t ) +Quad_b_4 = doc.findQuad( u_mod_b_t , x_mod_b ) + + +assert Quad_b_1 +assert Quad_b_2 +assert Quad_b_3 +assert Quad_b_4 + +for Quad_b_i in [ Quad_b_1 , Quad_b_2 , Quad_b_3 , Quad_b_4 ]: + Quad_grp_bas.addElement(Quad_b_i) + +#Nbr_elm_qad_bas = Quad_grp_bas.countElement() +#print "Nbr_elm_qad_bas->",Nbr_elm_qad_bas + + + +# groupe de Edges +Edge_Grp_haut = doc.addEdgeGroup("Edge_Grp_haut") +Edge_Grp_haut.addElement(Edge_Mod_ext_h) +Edge_Grp_haut.addElement(Edge_Mod_int_h) + +Edge_Grp_gauche = doc.addEdgeGroup("Edge_Grp_gauche") +Edge_Grp_gauche.addElement(Edge_Mod_ext_g) +Edge_Grp_gauche.addElement(Edge_Mod_int_g) + +Edge_Grp_bas = doc.addEdgeGroup("Edge_Grp_bas") +Edge_Grp_bas.addElement(Edge_Mod_int_b) +Edge_Grp_bas.addElement(Edge_Mod_ext_b) + +Edge_Grp_droit = doc.addEdgeGroup("Edge_Grp_droit") +Edge_Grp_droit.addElement(Edge_Mod_int_d) +Edge_Grp_droit.addElement(Edge_Mod_ext_d) + + +# groupe de noeuds de Hexa +Hexa_Nod_Grp = doc.addHexaNodeGroup("Hexa_Nod_Grp") +for i in range(Nbr_Hex): + Hexa_i = doc.getHexa(i) + Hexa_Nod_Grp.addElement(Hexa_i) + +# groupe de noeuds de Quad +Quad_Nod_Grp_h_1 = doc.addQuadNodeGroup("Quad_Nod_Grp_h_1") +Quad_Nod_Grp_h_1.addElement(Quad_h_1) + +Quad_Nod_Grp_b_1 = doc.addQuadNodeGroup("Quad_Nod_Grp_b_1") +Quad_Nod_Grp_b_1.addElement(Quad_b_1) + +# groupe de noeuds de Edge +Edge_Nod_Grp_b = doc.addEdgeNodeGroup("Edge_Nod_Grp_b") +Edge_Nod_Grp_b.addElement(Edge_Mod_int_b) +Edge_Nod_Grp_b.addElement(Edge_Mod_ext_b) + +Edge_Nod_Grp_h = doc.addEdgeNodeGroup("Edge_Nod_Grp_h") +Edge_Nod_Grp_h.addElement(Edge_Mod_int_d) +Edge_Nod_Grp_h.addElement(Edge_Mod_ext_d) + + +# groupe de noeuds de vertex pour tout le modele +Vertex_Nod_Grp = doc.addVertexNodeGroup("Vertex_Nod_Grp") +Nbr_Vx = doc.countVertex() +for i in range(Nbr_Vx): + Vertex_i = doc.getVertex(i) + Vertex_Nod_Grp.addElement(Vertex_i) + + +#==================================== +# Definir une loi de discretisation +#==================================== +bp_law = doc.getLaw(0) +bp_law.setNodes(4) + +# definir une loi: le choix de la loi reste aux utilisateurs + +#Law_X = doc.addLaw( "Uniform" , 4 ) +#Law_Y = doc.addLaw( "Arithmetic" , 2 ) +#Law_Z = doc.addLaw( "Geometric" , 3 ) +Law_X = doc.addLaw( "Arithmetic" , 5 ) +Law_X.setKind(hexablock.ARITHMETIC) +Law_X.setCoefficient(0.1) + +Law_Y = doc.addLaw( "Arithmetic" , 3 ) +Law_Y.setKind(hexablock.ARITHMETIC) +Law_Y.setCoefficient(0.1) + +#Law_Z = doc.addLaw( "Geometric" , 4 ) +Law_Z = doc.addLaw( "Arithmetic" , 5 ) +Law_Z.setKind(hexablock.ARITHMETIC) +Law_Z.setCoefficient(0.05) + + +# chercher les propagations du modele +Edge_Law_X = doc.findEdge( x_mod_h , x_mod_h_t ) +Edge_Law_Y = doc.findEdge( y_mod_h , y_mod_h_t ) +Edge_Law_Z = doc.findEdge( y_mod_h , y_mod_b ) + +Propa_X = doc.findPropagation( Edge_Law_X ) +Propa_Y = doc.findPropagation( Edge_Law_Y ) +Propa_Z = doc.findPropagation( Edge_Law_Z ) + +# appliquer la loi de discretisation sur tout le modele et generer le maillage +Propa_X.setLaw( Law_X ) +Propa_Y.setLaw( Law_Y ) +Propa_Z.setLaw( Law_Z ) + +print " --- MAILLAGE HEXAHEDRIQUE --- " +mesh = hexablock.mesh(doc) + +print "Nombre d hexaedres:" , mesh.NbHexas() +print "Nombre de quadrangles:", mesh.NbQuadrangles() +print "Nombre de segments:" , mesh.NbEdges() +print "Nombre de noeuds:" , mesh.NbNodes() + +salome.sg.updateObjBrowser(1) + +#Nombre d hexaedres: 480 +#Nombre de quadrangles: 496 +#Nombre de segments: 160 +#Nombre de noeuds: 700 + +allGroups = mesh.GetGroups() +print " --- GROUPES --- " +for aGroup in allGroups: + print "\nNOM:", aGroup.GetName() + print "IDS:", aGroup.GetIDs() + + + +## -------------------- +## Maillage hexa�drique +## -------------------- +#mesh = mesh.ExportMED( "tuyau.med", 1 ) +#maillages = smesh.CreateMeshesFromMED( "tuyau.med" ) + +#ijk = maillages[0][0] + +#ijk.Hexahedron() + +#ijk.Compute() + +#print " --- MAILLAGE HEXAHEDRIQUE --- " +#print "Nombre d hexaedres:", ijk.NbHexas() +#print "Nombre de quadrangles:", ijk.NbQuadrangles() +#print "Nombre de segments:", ijk.NbEdges() +#print "Nombre de noeuds:", ijk.NbNodes() diff --git a/src/TEST_PY/Test_HEXABLOCK.py b/src/TEST_PY/Test_HEXABLOCK.py new file mode 100755 index 0000000..bbd2843 --- /dev/null +++ b/src/TEST_PY/Test_HEXABLOCK.py @@ -0,0 +1,280 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import hexablock + +# ======================================================== test_sphere +def test_sphere(): + doc = hexablock.addDocument ("default") + orig = doc.addVertex (0,0,0) + + ncouches = 1 + k = 0.8 + decal = doc.addVector (1,1,1) + sphere = doc.makeSpherical(orig, decal, ncouches, k) + + sphere.saveVtk ("test_sphere.vtk") + # doc.dump () + print "test_sphere OK" + + +# ======================================================== test_cartesi1 +def test_cartesi1(): + size_x = 15 + size_y = 12 + size_z = 8 + + doc = hexablock.addDocument() + orig = doc.addVertex (0,0,0) + direc= doc.addVector (1,1,1) + grid = doc.makeCartesian1(orig, direc, size_x,size_y,size_z,0,0,0) + grid.saveVtk ("test_cartesi1.vtk") + # doc.dump () + print "test_cartesi1 OK" + + + +#// ======================================================== test_find +def test_find(): + size_x = 2 + size_y = 2 + size_z = 2 + + doc = hexablock.addDocument() + + orig = doc.addVertex(0,0,0) + direc = doc.addVector (1,1,1) + grid = doc.makeCartesian1 (orig, direc, size_x,size_y,size_z,0,0,0) + + grid.saveVtk ("mini1.vtk") + #doc.dump (). + + v00 = doc.findVertex (0, 0, 0) + v02 = doc.findVertex (1, 1, 0) + v06 = doc.findVertex (1, 1, 1) + v08 = doc.findVertex (2, 1, 0) + v10 = doc.findVertex (2, 1, 1) + v22 = doc.findVertex (2, 1, 2) + v26 = doc.findVertex (2, 2, 2) + + assert v00 + assert v02 + assert v06 + assert v08 + assert v10 + assert v22 + assert v26 + + assert doc.findEdge (v06, v10) + assert doc.findEdge (v10, v06) + + assert doc.findQuad (v02, v10) + assert doc.findQuad (v06, v08) + assert not doc.findQuad (v02, v06) #CS_FAILS + + assert doc.findHexa (v00, v06) + assert doc.findHexa (v06, v26) + assert doc.findHexa (v26, v06) + print "test_find OK" + +#// ======================================================== test_joint +def test_joint(): + import HEXA_ORB + dimx = 11 + dimy = 11 + dimz = 2 + + doc = hexablock.addDocument() + + orig1 = doc.addVertex (0,0,0) + direc = doc.addVector (1,1,1) + + grid1 = doc.makeCartesian1(orig1, direc, dimx, dimy, dimz, 0, 0, 0 ) + + orig2 = doc.addVertex (dimx/2.0,0,8) + vectj = doc.addVector (0,1,0) + vecti = doc.addVector (1,0,0) + grid2 = doc.makeCylindrical (orig2, vecti, vectj, 1, 180, 1,dimz,dimy,dimx, False) + + mx = dimx/2 + my = dimy/2 + prems = grid1.getQuad1 (HEXA_ORB.DIR_Z, mx, my, dimz) + cible = grid2.getQuad1 (HEXA_ORB.DIR_X, dimz, mx, my) + + + v1 = prems.getVertex (0) + v2 = cible.getVertex (0) + v3 = prems.getVertex (1) + v4 = cible.getVertex (3) + + liste = [] + miroir = [] + + liste.append(prems) + + for nx in range(dimx): + if ( nx != mx ): + liste.append(grid1.getQuad1 (HEXA_ORB.DIR_Z, nx, my, dimz)) + + #for (int nx=0. nx pose probl�me car les points associ�s par cette m�thode sont +# uniform�ment r�partis sur le contour => �a d�pend de la longueur +# entre les 2 grilles cylindriques. +# REM : a retester apr�s la correction d'Alain pour voir ce que �a +# donne + +# deuxi�me solution : +# 1. 4 associations par ligne fermee pour les trous +# => pour chaque association, 6 edges du modele <-> 1 ligne de la geometrie +# 2. 4 associations par lignes ouvertes pour les contours externes des +# grilles cylindriques +# => pour chaque association, 4 edges du modele <-> 3 lignes de la geometrie +# 3. 4 associations de points restants (mod_x1, mod_x4, mod_y1, mod_y4) + +# => cette solution pose probl�me (� cause de l'association par ligne +# ouverte) + +bielle_geom = geompy.ImportFile(STEP_PATH, "STEP") +doc.setShape(bielle_geom) +geompy.addToStudy(bielle_geom, "bielle_geom") +all_edges_bielle = geompy.SubShapeAllSorted(bielle_geom, geompy.ShapeType["EDGE"]) + + + +# dictionnaire des edges de la g�om�trie : +# key = nom, value = indice dans all_edges_bielle +dic_edge_names = {"edge_ray_pte_b": 0, "edge_ray_pte_h": 1, + "edge_trou_pte_b": 2, "edge_trou_pte_h" :3, + "edge_arr_pte_g_b": 7, "edge_arr_pte_g_h": 8, + "edge_arr_pte_d_b": 9, "edge_arr_pte_d_h": 10, + "edge_arr_grd_g_b": 19, "edge_arr_grd_g_h": 20, + "edge_arr_grd_d_b": 21, "edge_arr_grd_d_h": 22, + "edge_trou_grd_b": 25, "edge_trou_grd_h": 26, + "edge_ray_grd_b": 27, "edge_ray_grd_h": 28, + "edge_long_g_b": 13, "edge_long_g_h": 14, + "edge_long_d_b": 15, "edge_long_d_h": 16 + } + + +all_faces_bielle = geompy.SubShapeAllSorted(bielle_geom, geompy.ShapeType["FACE"]) +# dictionnaire des faces de la geometrie : +# key = nom, value = indice dans all_faces_bielle +dic_face_names = {"face_ray_pte": 0, "face_trou_pte": 1, "face_pte_g": 2, + "face_pte_d": 3, "face_long_g": 4, "face_long_d": 5, + "face_bas": 6, "face_haut": 7, "face_grd_g": 8, + "face_grd_d": 9, "face_trou_grd": 10, + "face_ray_grd": 11 + } + + +# la clef correspond a la geometrie, la valeur a l'indice en z dans le +# modele de bloc (grille cylindrique) +# NOTE : les dictionnaires ordonn�s ne sont pas encore introduits dans +# la version 2.6.6 de python (Salome 6.2). On ne connait donc pas +# l'ordre de bouclage (haut/bas ou bas/haut) mais �a n'a pas +# d'importance : +dico_haut_bas = {"h": 1, "b": 0} + +# 1. lignes internes (trou) haut/bas du petit cylindre +# ==================================================== +for z in dico_haut_bas.iteritems(): + + # REM : la direction de la ligne geometrique est dans le sens anti-trigonometrique + # => on parcourt le modele en sens inverse + +## # modele de blocs : +## mod_start = grille_cyl_pte.getEdgeJ(0, 5, z[1]) +## mod_first = mod_start.getVertex(1) +## # table des edges : +## mod_line = [grille_cyl_pte.getEdgeJ(0, j, z[1]) for j in range(4, -1, -1)] + + # modele de blocs : + mod_start = grille_cyl_pte.getEdgeJ(0, 0, z[1]) + mod_first = mod_start.getVertex(0) + # table des edges : + mod_line = [grille_cyl_pte.getEdgeJ(0, j, z[1]) for j in range(1, 6)] + + + # geometrie : 1 seule ligne + edge_hole_in = all_edges_bielle[dic_edge_names["edge_trou_pte_"+z[0]]] + geo_start = edge_hole_in + par_start = 0.0 + geo_line = [] + + # association : + ier = doc.associateClosedLine(mod_first, mod_start, mod_line, + geo_start, par_start, geo_line) + + +# 2. lignes internes (trou) haut/bas du grand cylindre +# ===================================================== +for z in dico_haut_bas.iteritems(): + + # REM : la direction de la ligne geometrique est dans le sens anti-trigonometrique + # => on parcourt le modele en sens inverse + +## # modele de blocs : +## mod_start = grille_cyl_grd.getEdgeJ(0, 5, z[1]) +## mod_first = mod_start.getVertex(1) +## # table des edges : +## mod_line = [grille_cyl_grd.getEdgeJ(0, j, z[1]) for j in range(4, -1, -1)] + + mod_start = grille_cyl_grd.getEdgeJ(0, 0, z[1]) + mod_first = mod_start.getVertex(1) + # table des edges : + mod_line = [grille_cyl_grd.getEdgeJ(0, j, z[1]) for j in range(1, 6)] + + # geometrie : 1 seule ligne + edge_hole_in = all_edges_bielle[dic_edge_names["edge_trou_grd_"+z[0]]] + geo_start = edge_hole_in + par_start = 0.0 + geo_line = [] + + # association : + ier = doc.associateClosedLine(mod_first, mod_start, mod_line, + geo_start, par_start, geo_line) + + +# 3. lignes externes haut/bas du petit cylindre +# ============================================= +for z in dico_haut_bas.iteritems(): + + # JPL le 08/07/2011 : on utilise ici l'association par ligne + # ouverte. Avec le nouvelle version, les points sont r�partis de + # mani�re �quidistance sur la ligne geometrique form�e par la + # concat�nation des lignes fournies en entr�e. + + # modele de blocs : + mod_start = grille_cyl_pte.getEdgeJ(1, 1, z[1]) + # table des edges : + mod_line = [grille_cyl_pte.getEdgeJ(1, j, z[1]) for j in [2, 3, 4]] + + # geometrie : + # les edges de la geometrie correspondant sont, dans l'ordre (par + # exemple pour le haut) : + # edge_arr_pte_d_h, edge_ray_pte_h, edge_arr_pte_g_h + geo_start = all_edges_bielle[dic_edge_names["edge_arr_pte_d_"+z[0]]] + + geo_line = [] + geo_line.append(all_edges_bielle[dic_edge_names["edge_ray_pte_"+z[0]]]) + geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_pte_g_"+z[0]]]) + + # association : + # la premi�re est la derni�re ligne sont orient�es "dans le + # mauvais sens" => on fournit cette info : + par_start = 0.0 + par_end = 1.0 + ier = doc.associateOpenedLine(mod_start, mod_line, + geo_start, par_start, geo_line, par_end) + + +## # 4. lignes externes haut/bas du grand cylindre +## # ============================================= +for z in dico_haut_bas.iteritems(): + + # JPL le 08/07/2011 : on utilise ici l'association par ligne + # ouverte. Avec le nouvelle version, les points sont r�partis de + # mani�re �quidistance sur la ligne geometrique form�e par la + # concat�nation des lignes fournies en entr�e. + + # modele de blocs : + mod_start = grille_cyl_grd.getEdgeJ(1, 4, z[1]) + # table des edges : + mod_line = [grille_cyl_grd.getEdgeJ(1, j, z[1]) for j in [5, 0, 1]] + + # geometrie : + # les edges de la geometrie correspondant sont, dans l'ordre (par + # exemple pour le haut) : + # edge_arr_grd_g_h, edge_ray_grd_h, edge_arr_grd_d_h + geo_start = all_edges_bielle[dic_edge_names["edge_arr_grd_g_"+z[0]]] + + geo_line = [] + geo_line.append(all_edges_bielle[dic_edge_names["edge_ray_grd_"+z[0]]]) + geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_grd_d_"+z[0]]]) + + # association : + # la premi�re est la derni�re ligne sont orient�es "dans le + # mauvais sens" => on fournit cette info : + par_start = 0.0 + par_end = 1.0 + ier = doc.associateOpenedLine(mod_start, mod_line, + geo_start, par_start, geo_line, par_end) + +# JPL le 26/07/2011 : +# l'association des edges n'est pas necessaire (implicite) + +# 6. association des 4 points restants (x1, x4, y1, y4) : +# ======================================================= + +# NB: +# h = top (haut) +# b = bottom (bas) +# g = big (grand) +# p = small (petit) +# t = hole (trou) + +# JPL le 08/07/2011 : +# seuls 4 points de la geometrie sont n�cessaires (pour l'association +# vertex/point : pour le reste on utilise l'association par lignes) : +# dictionnaire geom_vertices +# il s'agit de points des grilles cylindriques, � l'int�rieur +# de la bielle, ayant servis au joinQuads (ie: mod_x1, mod_x4, mod_y1, mod_y4) + + +## pt_a = geompy.MakeVertex(0, 0, hauteur/2.) +## face_haut = geompy.GetFaceNearPoint(bielle_geom, pt_a) +## pt_b = geompy.MakeVertex(0, 0, -hauteur/2.) +## face_bas = geompy.GetFaceNearPoint(bielle_geom, pt_b) + +face_haut = all_faces_bielle[dic_face_names["face_haut"]] + +edge_haut_droite = geompy.GetEdgesByLength(face_haut, 0.136, 0.137) +edge_haut_gauche = geompy.GetEdgesByLength(face_haut, 0.131, 0.132) + +# 1. grand cylindre : +y_h_g = geompy.MakeVertexOnSurface(face_haut, 1, 0.5) +u_h_g = geompy.MakeVertexOnCurve(edge_haut_droite, 1) +w_h_g = geompy.MakeVertexOnCurve(edge_haut_gauche, 0) +edge_v_grd = geompy.MakeLineTwoPnt(u_h_g, w_h_g) + +geo_y1 = geompy.MakeVertexOnCurve(edge_v_grd, 0.5) +geo_y4 = geompy.MakeVertexWithRef(geo_y1, 0.0, 0.0, -hauteur) + +# vertex cote grande grille cylindrique : +mod_y1.setAssociation(geo_y1) +mod_y4.setAssociation(geo_y4) + +# 2. petit cylindre : +# REM : le modele grand cylindre a ete cree par translation / au petit +# cylindre. +v_h_p = geompy.MakeVertexOnSurface(face_haut, 0, 0.5) +x_h_p = geompy.MakeVertexOnCurve(edge_haut_droite, 0) +z_h_p = geompy.MakeVertexOnCurve(edge_haut_gauche, 1) +edge_v_pte = geompy.MakeLineTwoPnt(x_h_p, z_h_p) + +geo_x1 = geompy.MakeVertexOnCurve(edge_v_pte, 0.5) +geo_x4 = geompy.MakeVertexWithRef(geo_x1, 0.0, 0.0, -hauteur) + +# vertex cote petite grille cylindrique : +mod_x1.setAssociation(geo_x1) +mod_x4.setAssociation(geo_x4) + +# 7. association des faces : +# REM : l'association des faces internes ne semble pas necessaire (cylindres) +# pas d'association des face_ray_XXX : pas necessaire ? De toute +# fa�on, on a pour chaque 2 quads du mod�le... +# les associations de face_haut, face_bas, face_long_g et face_long_d +# ne sont pas necessaires ? + +# a decommenter donc si necessaire : +## quad1 = grille_cyl_pte.getQuadJK(1, 1, 0) +## quad1.addAssociation(all_faces_bielle[dic_face_names["face_pte_d"]]) +## quad2 = grille_cyl_pte.getQuadJK(1, 4, 0) +## quad2.addAssociation(all_faces_bielle[dic_face_names["face_pte_g"]]) +## quad3 = grille_cyl_grd.getQuadJK(1, 1, 0) +## quad3.addAssociation(all_faces_bielle[dic_face_names["face_grd_d"]]) +## quad4 = grille_cyl_grd.getQuadJK(1, 4, 0) +## quad4.addAssociation(all_faces_bielle[dic_face_names["face_grd_g"]]) + + +############################################################################################# +############################################################################################# +# TEST : + +file_name = os.path.join(os.environ['TMP'], 'bielle2.vtk') +doc.saveVtk(file_name) + +# affichage des points des 2 grilles cylindriques avec les +# nouvelles coordonn�es (apres association) + +for k in range(2): + # petite grille cylindrique + i = 0 + for j in range(6): + vertex = grille_cyl_pte.getVertexIJK(i, j, k) + value = " ".join(["i =", str(i), "j =", str(j), + str(vertex.getX()), str(vertex.getY()), str(vertex.getZ()), '\n']) + f_mod_apres.write(str(value)) + pass + + f_mod_apres.write("stop\n") + + i = 1 + # on n'inclut pas les vertex associ�s individuellement (qui ne + # changent pas de coordonn�es...) : => j = 1 -> 5 + for j in range(1, 6): + vertex = grille_cyl_pte.getVertexIJK(i, j, k) + value = " ".join(["i =", str(i), "j =", str(j), + str(vertex.getX()), str(vertex.getY()), str(vertex.getZ()), '\n']) + f_mod_apres.write(str(value)) + pass + + f_mod_apres.write("stop\n") + + # grande grille cylindrique + i = 0 + for j in range(6): + vertex = grille_cyl_grd.getVertexIJK(i, j, k) + value = " ".join(["i =", str(i), "j =", str(j), + str(vertex.getX()), str(vertex.getY()), str(vertex.getZ()), '\n']) + f_mod_apres.write(str(value)) + pass + + f_mod_apres.write("stop\n") + + i = 1 + # on n'inclut pas les vertex associ�s individuellement (qui ne + # changent pas de coordonn�es...) (j = 3) + # on ecrit les points dans le meme ordre que l'association : + for j in [4, 5, 0, 1, 2]: + vertex = grille_cyl_grd.getVertexIJK(i, j, k) + value = " ".join(["i =", str(i), "j =", str(j), + str(vertex.getX()), str(vertex.getY()), str(vertex.getZ()), '\n']) + f_mod_apres.write(str(value)) + pass + # end TEST + + f_mod_apres.write("stop\n") + +############################################################################################# +############################################################################################# + + +## #================================================= +## # VERTEX, EDGES, FACES DANS L'ARBRE D'ETUDE SALOME +## #================================================= + +# vertices : +geompy.addToStudy(geo_x1, 'vertex_x1') +geompy.addToStudy(geo_x4, 'vertex_x4') +geompy.addToStudy(geo_y1, 'vertex_y1') +geompy.addToStudy(geo_y4, 'vertex_y4') + +# edges : +for key, value in dic_edge_names.iteritems(): + geompy.addToStudy(all_edges_bielle[value], key) + +# faces (juste pour les tests) : +for i, face in enumerate(all_faces_bielle): + geompy.addToStudy(face, "face_"+str(i)) + +#==================================== +# CREATION MAILLAGE +#==================================== + + +#================================================= +# Definir les groupes d elements pour le maillage +#================================================= + +# On definit 3 groupes de mailles + +# JPL (le 09/05/2011) : +# @todo a revoir : apres correction des bugs "countXXX()" dans le moteur + +# groupe d edges (arretes) +edge_grp = doc.addEdgeGroup("Edge_grp") +for i in range(doc.countEdge()): + edge_grp.addElement(doc.getEdge(i)) + +# groupe de quads (faces) +quad_grp = doc.addQuadGroup("Quad_grp") +for i in range(doc.countQuad()): + quad_grp.addElement(doc.getQuad(i)) + +# groupe d hexas (solids) +hexa_grp = doc.addHexaGroup("Hexa_grp") +for i in range(doc.countHexa()): + hexa_grp.addElement(doc.getHexa(i)) + +# groupe de noeuds de vertex pour tout le modele +vertex_nod_grp = doc.addVertexNodeGroup("Vertex_Nod_Grp") +for i in range(doc.countVertex()): + vertex_nod_grp.addElement(doc.getVertex(i)) + +#==================================== +# Definir une loi de discretisation +#==================================== +# definir une loi: le choix de la loi reste aux utilisateurs +law = doc.addLaw("Uniform", 4) + +# TEST : pour avoir le mod�le de blocs : +## law = doc.addLaw("Uniform", 0) + +# chercher les propagations du modele +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) # appliquer la loi de discretisation sur tout le modele et generer le maillage + +#==================================== +# G�n�rer des maillages +#==================================== + +print " --- MAILLAGE HEXAHEDRIQUE --- " +mesh_hexas = hexablock.mesh(doc) + +print "Nombre d hexaedres:", mesh_hexas.NbHexas() +print "Nombre de quadrangles:", mesh_hexas.NbQuadrangles() +print "Nombre de segments:", mesh_hexas.NbEdges() +print "Nombre de noeuds:", mesh_hexas.NbNodes() + +# TESTS : +f_mod_apres.close() diff --git a/src/TEST_PY/bielle_variante.py b/src/TEST_PY/bielle_variante.py new file mode 100644 index 0000000..7d163fd --- /dev/null +++ b/src/TEST_PY/bielle_variante.py @@ -0,0 +1,248 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + + +# Francis KLOSS - 2011 - CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France +# ======================================================================================== + +import geompy +import hexablock + +# Définir les paramètres +# ---------------------- + +nom = "bielle" + +# Construire le modèle de bloc +# ============================ + +doc = hexablock.addDocument(nom) + +# Construire les 2 grilles cylindriques +# ------------------------------------- + +centre_a = doc.addVertex(0, 0, 0) +centre_b = doc.addVertex(6, 0, 0) + +vecteur_a = doc.addVector(1, 1, 0) +vecteur_z = doc.addVector(0, 0, 1) +vecteur_b = doc.addVector(6, 0, 0) + +grille_a = doc.makeCylindrical(centre_a, vecteur_a, vecteur_z, 1, 360, 1, 1, 4, 1, False) + +### grille_b = doc.makeTranslation(grille_a, vecteur_b) +grille_b = doc.makeCylindrical(centre_b, vecteur_a, vecteur_z, 2, 360, 1, 1, 4, 1, False) + +grilles = [ grille_a, grille_b ] + +# Relier les 2 grilles +# -------------------- + +quad_a = grille_a.getQuadJK(1, 3, 0) +quad_b = grille_b.getQuadJK(1, 1, 0) + +point_a1 = grille_a.getVertexIJK(1, 0, 0) +point_a2 = grille_a.getVertexIJK(1, 3, 0) + +point_b1 = grille_b.getVertexIJK(1, 1, 0) +point_b2 = grille_b.getVertexIJK(1, 2, 0) + +prisme = doc.joinQuad(quad_a, quad_b, point_a1, point_b1, point_a2, point_b2, 3) + +# Associer le modèle de bloc avec la géométrie +# ============================================ + +# Charger la géométrie à associer +# ------------------------------- + +bielle = geompy.ImportSTEP("crank.stp") + +doc.setShape(bielle) + +# Extraire les subshapes de la géométrie +# -------------------------------------- + +g_vertices = geompy.SubShapeAllSortedCentres(bielle, geompy.ShapeType["VERTEX"]) +g_edges = geompy.SubShapeAllSortedCentres(bielle, geompy.ShapeType["EDGE" ]) + +sommets = [ [ 8, 6, 9, 7 ], [ 12, 10, 13, 11 ] ] + +cercles = [ [2, 3], [25, 26] ] +arcs_gr = [ [0, 1], [27, 28] ] +arcs_pe = [ [ 9, 7, 10, 8 ], [ 21, 19, 22, 20 ] ] + +# Réparer l'association par ligne fermée +# -------------------------------------- + +def reparer(cercle, grille): + import math + + k = geompy.KindOfShape(cercle) + + centre = geompy.MakeVertex(k[1], k[2], k[3]) + axe = geompy.MakePrismDXDYDZ(centre, k[4], k[5], k[6]) + angle = [ +math.pi/4, -math.pi/4 ][grille] + + if grille==1: + axeY = geompy.MakePrismDXDYDZ(centre, 0, 1, 0) + cercle = geompy.MakeRotation(cercle, axeY, math.pi) + + return geompy.MakeRotation(cercle, axe, angle) + +# Associer les 4 cercles intérieurs +# --------------------------------- + +for k in xrange(0, 2): + for g in xrange(0, 2): + grille = grilles[g] + ve = grille.getVertexIJK(0, g, k) + le = [ grille.getEdgeJ(0, j, k) for j in xrange(0, 4) ] + ed = reparer( g_edges[ cercles[g][k] ], g ) + doc.associateClosedLine(ve, le[0], le[1:], ed, 0.0, []) + +# Associer les 4 grands arcs de cercle extérieurs +# ----------------------------------------------- + +for k in xrange(0, 2): + for g in xrange(0, 2): + grille = grilles[g] + le = [ grille.getEdgeJ(1, j, k) for j in [ [0, 1, 2], [2, 3, 0] ][g] ] + ed = g_edges[ arcs_gr[g][k] ] + doc.associateOpenedLine(le[0], le[1:], ed, 0, [], 1) + +# Associer les 8 sommets des petits arcs de cercle extérieurs +# ----------------------------------------------------------- + +for g, h in [ [0, 1], [1, 2] ]: + hexa = prisme.getHexa(h) + for vi in xrange(0, 4): + vm = hexa.getVertex(vi) + vg = g_vertices[ sommets[g][vi] ] + vm.setAssociation(vg) + +# Associer les 8 petits arcs de cercle extérieurs +# ----------------------------------------------- + +for g, h in [ [0, 0], [1, 2] ]: + hexa = prisme.getHexa(h) + for ei in xrange(0, 4): + em = hexa.getEdge(ei+8) + eg = g_edges[ arcs_pe[g][ei] ] + em.clearAssociation() + em.addAssociation(eg, 0, 1) + +# Associer 4 arcs nouveaux qui complétent les 4 grands arcs de cercle extérieurs +# ------------------------------------------------------------------------------ + +for h, ei, ech in [ [0, 0, 0.9], [0, 1, 0.9], [2, 2, 0.85], [2, 3, 0.85] ]: + hexa = prisme.getHexa(h) + em = hexa.getEdge(ei) + va = em.getVertex(0).getAssociation() + vb = em.getVertex(1).getAssociation() + vax, vay, vaz = geompy.PointCoordinates(va) + vbx, vby, vbz = geompy.PointCoordinates(vb) + vmx = ( vax + vbx ) / 2.0 * ech + vmy = ( vay + vby ) / 2.0 + vmz = ( vaz + vbz ) / 2.0 + vm = geompy.MakeVertex(vmx, vmy, vmz) + eg = geompy.MakeArc(va, vm, vb) + em.clearAssociation() + em.addAssociation(eg, 0, 1) + +# Mailler le modèle de bloc +# ========================= + +# Définir 5 groupes de faces +# -------------------------- + +groupe_trou_p = doc.addQuadGroup("Trou_petit") +groupe_trou_g = doc.addQuadGroup("Trou_grand") +groupe_bas = doc.addQuadGroup("Bas") +groupe_haut = doc.addQuadGroup("Haut") +groupe_contour = doc.addQuadGroup("Contour") + +for i in xrange(4): + groupe_trou_p.addElement(grille_a.getQuadJK(0, i, 0)) + groupe_trou_g.addElement(grille_b.getQuadJK(0, i, 0)) + + groupe_bas.addElement( grille_a.getQuadIJ(0, i, 0)) + groupe_bas.addElement( grille_b.getQuadIJ(0, i, 0)) + groupe_haut.addElement(grille_a.getQuadIJ(0, i, 1)) + groupe_haut.addElement(grille_b.getQuadIJ(0, i, 1)) + +for i in xrange(3): + groupe_contour.addElement(grille_a.getQuadJK(1, i, 0)) + +for i in [0, 2, 3]: + groupe_contour.addElement(grille_b.getQuadJK(1, i, 0)) + +for i in xrange(0, 3): + h = prisme.getHexa(i) + + q = h.getQuad(2) + groupe_bas.addElement(q) + + q = h.getQuad(3) + groupe_haut.addElement(q) + + q = h.getQuad(4) + groupe_contour.addElement(q) + q = h.getQuad(5) + groupe_contour.addElement(q) + +# Définir 3 groupes de volumes +# ---------------------------- + +groupe_cyli_p = doc.addHexaGroup("Cylindre_petit") +groupe_cyli_g = doc.addHexaGroup("Cylindre_grand") +groupe_prisme = doc.addHexaGroup("Prisme") + +for i in xrange(4): + groupe_cyli_p.addElement(grille_a.getHexa(i)) + groupe_cyli_g.addElement(grille_b.getHexa(i)) + +for i in xrange(3): + groupe_prisme.addElement(prisme.getHexa(i)) + +# Mailler le modèle de bloc avec association +# ------------------------------------------ + +l = doc.addLaw("Uniform1", 17) +n = doc.countPropagation() + +for i in xrange(n): + p = doc.getPropagation(i) + p.setLaw(l) + +l = doc.addLaw("Uniform2", 40) +p = doc.getPropagation(11) +p.setLaw(l) + +blocs = hexablock.mesh(doc) + +print "nombre de sommets du modèle de bloc: ", doc.countUsedVertex() +print "nombre d'arêtes du modèle de bloc: ", doc.countUsedEdge() +print "nombre de quadrangles du modèle de bloc: ", doc.countUsedQuad() +print "nombre de blocs du modèle de bloc: ", doc.countUsedHexa() + +print "Nombre de noeuds du maillage: ", blocs.NbNodes() +print "Nombre de segments du maillage: ", blocs.NbEdges() +print "Nombre de quadrangles du maillage: ", blocs.NbQuadrangles() +print "Nombre d'hexaèdres du maillage: ", blocs.NbHexas() diff --git a/src/TEST_PY/bride.py b/src/TEST_PY/bride.py new file mode 100644 index 0000000..b3cb914 --- /dev/null +++ b/src/TEST_PY/bride.py @@ -0,0 +1,410 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import os +import GEOM +import geompy +import smesh +import hexablock +import math +import SALOMEDS + +k1 = 1 + +OPT_QUAD_IK = 1 +OPT_FIRST = 2 + +count = 1 +def save_schema(doc): + """ + sauvegarde vtk du modele de bloc + """ + global count + file_name = os.path.join(os.environ['TMP'], 'bride' + str(count) + '.vtk') + doc.saveVtk(file_name) + count += 1 + pass + +def merge_quads(doc, quart, demi, ni1, nj1, ni2, nj2, option=0) : + """ + fusion des quadrangles entre les 2 grilles cylindriques : + """ + + prems = False + if option == OPT_FIRST: + prems = True + + quad_ik = False + if option == OPT_QUAD_IK: + quad_ik = True + + orig = None + if quad_ik: + orig = grille_cyl_quart.getQuadIK(ni1, nj1, k1) + else: + orig = grille_cyl_quart.getQuadJK(ni1, nj1, k1) + + dest = grille_cyl_demi.getQuadJK(ni2, nj2, k1) + + +# JPL le 10/05/2011 : +# closeQuads() n'est pas accessible en python +# a priori fonctionne avec mergeQuads() +## if prems: + if True: + iq1 = 0 + if quad_ik: + iq1 = 1 + iq3 = 1 - iq1 + v1 = dest.getVertex(iq1) + v3 = dest.getVertex(iq3) + + v2 = orig.getVertex(0) + v4 = orig.getVertex(1) + + doc.mergeQuads(dest, orig, v1, v2, v3, v4) + pass + else: +## doc.closeQuads(dest, orig) + print "closeQuads() : not yet implemented" + pass + + return None + +BREP_PATH = os.path.expandvars("$HEXABLOCK_ROOT_DIR/bin/salome/bride.brep") + +#============================= +# CREATION DOCUMENT +#============================= + +doc = hexablock.addDocument("bride") + +#============================= +# PARAMETRES +#============================= + +height = 1.0 + +# cylinder grid 1 : +nr1 = 8 +na1 = 4 +nl1 = 5 +dr1 = 1.0 +da1 = 45.0 # angle +dl1 = height + +# cylinder grid 2 : +nr2 = 3 +na2 = 8 +nl2 = nl1 +dr2 = 0.5 +da2 = 180.0 # angle +dl2 = dl1 + +#============================= +# Creation du modele de blocs +#============================= + +# JPL (le 09/05/2011) +# repris de test_bride_abu.cxx (version la plus a jour dans ~/IHMHEXA/Alain/models): +# et de BRIDE.py (Karima) pour les "vraies" coordonn�es : + +#================================================= +# Creation des centres des grilles cylindriques +#================================================= + +center1 = doc.addVertex(0, 0, height) +center2 = doc.addVertex(6, 0, height) + +dx = doc.addVector(height, 0, 0) +dz = doc.addVector(0, 0, height) + +# Creation des grilles cylindriques initiales +#============================================ + +# 1. 1 ere grille (quart) : +#========================== + +# JPL (le 10/05/2011) : vu la geometrie, on ne remplit pas le centre : +## grille_cyl_quart = doc.makeCylindrical(orig1, dx, dz, dr_q, 45.0, dl, +## nr_q, na_q, dim_z, True) +grille_cyl_quart = doc.makeCylindrical(center1, dx, dz, dr1, da1, dl1, + nr1, na1, nl1, False) + + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +# Elagage : +for nk in range(2, nl1): + for nj in range(na1): + ideb = 2 + if nk == nl1 - 1: + ideb = 1 + for ni in range(ideb, nr1): + doc.removeHexa(grille_cyl_quart.getHexaIJK(ni, nj, nk)) + pass + pass + pass + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +# Semelle : +k0 = 0 +for nj in range(na1): + for ni in range(2, nr1): + doc.removeHexa(grille_cyl_quart.getHexaIJK(ni, nj, k0)) + pass + pass + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +# @todo JPL : peut-on fusionner les edges du haut des hexaedres du haut du deuxieme +# rang ? (cf. GEOM). Si oui revoir aussi l'association + +# 2. 2�me grille (demi) : +#======================== +grille_cyl_demi = doc.makeCylindrical(center2, dx, dz, dr2, da2, dl2, + nr2, na2, nl2, True) + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +ni0 = [0, nr2, 2, 1, 0] # en fonction de z (ie : nk) +for nk in range(0, nl2): + for nj in range(na2): # elagage suivant toute la demi-circonference + for ni in range(ni0[nk], nr2): + doc.removeHexa(grille_cyl_demi.getHexaIJK(ni, nj, nk)) + pass + pass + pass + + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +# 3. creusement des fondations de demi dans quart : +#================================================== +for nj in range(2): + for ni in range(3, nr1 - 1): + doc.removeHexa(grille_cyl_quart.getHexaIJK(ni, nj, k1)) + pass + pass + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +# 4. Fusion des bords : +#====================== +merge_quads(doc, grille_cyl_quart, grille_cyl_demi, 7, 0, nr2, 0, OPT_FIRST) +merge_quads(doc, grille_cyl_quart, grille_cyl_demi, 7, 1, nr2, 1) +for ni1 in range(2, 6): + merge_quads(doc, grille_cyl_quart, grille_cyl_demi, 8 - ni1, 2, nr2, ni1, OPT_QUAD_IK) + pass +merge_quads(doc, grille_cyl_quart, grille_cyl_demi, 3, 1, nr2, 6) +merge_quads(doc, grille_cyl_quart, grille_cyl_demi, 3, 0, nr2, 7) + +# temporaire : sauvegarde du modele de blocs : +save_schema(doc) +# fin temporaire + +########### +# Geometry +########### + +bride_geom = geompy.ImportFile(BREP_PATH, "BREP") + +geompy.addToStudy(bride_geom, "bride_geom") + + +# parametres de la geometrie : + +r1 = 12.0 +r1_t = 7.88 +r2 = 20.0 +r2_t = 2.0 + +############## +# Association +############## + +# association vertex/points de la grille 1 +# (tous les vertex qui ne sont pas fusionnes avec ceux de la grille # +# 2) + +dz_geom = geompy.MakeVectorDXDYDZ(0., 0., 1.) + +# les vertex du cylindre 1 sont crees de bas en haut, en tournant dans +# le sens trigonometrique : + +# 6 vertex sont necessaires / axe z (pour associer aux 6 vertices du +# modele) : + +z_val = [-1, 1.5, 21.5, 34, 46.5] # nl1 + 1 valeurs +for ni in range(nr1 + 1): + # suivant ni, valeurs des x pour les (nl1 + 1) points (selon l'axe z) + x = [] + z = [] + nb_z = 0 # nombre de points suivant l'axe z + if ni == 0: + z = z_val + x = [r1_t] * len(z) + pass + elif ni == 1: + z = z_val + x = [r1_t + 2.77] * len(z) + pass + elif ni == 2: + z = z_val[0:-1] # tout sauf le dernier + x_last = r1_t + 2.77 + x = [24.0, 24.0, 19.0, (19.0 - x_last)/2 + x_last, x_last] # pour le 4 eme point, moyenne + # entre le 3 eme et le 5 eme + pass + elif ni == 3: + z = z_val[1:3] + x = [24.0, 19.0] + pass + elif ni == 4: + z = z_val[1:3] + x = [26.5, 21.0] # a revoir pour le premier point ?? + pass + elif ni == 8: + z = z_val[1:3] + x = [47.5] * 2 + pass + else: # ni = 5, 6, 7 + z = z_val[1:3] + x = [26.5 + (47.5 - 26.5)/4*(ni - 4)] * 2 + pass + pass + + nb_z = len(z) + + # creation des points pour y = 0 : + vert_grid1_xi = [geompy.MakeVertex(xi, 0, zi) for (xi, zi) in \ + zip(x, z)] + + # les points suivants sont crees par rotation de PI/16 suivant + # l'axe z / aux precedents : + angle = math.pi/4.0/na1 # PI/4 (45 degres), divise par 4 + for j in range(na1): + li = [geompy.MakeRotation(v, dz_geom, angle) for v in vert_grid1_xi[-nb_z:]] + vert_grid1_xi.extend(li) + pass + + # ajout des points a l'etude et association : + # les vertex fusionnes ou correspondant a des hexaedres effaces ne + # sont pas pris en compte. + for nj in range(na1 + 1): + for nk in range(nb_z): + if (ni <= 2) or (3 <= ni <= 7 and nj >= na1 - 1) or \ + (ni == 8 and (nj == 0 or nj >= na1 - 1)): + v_mod = grille_cyl_quart.getVertexIJK(ni, nj, nk) + v_geo = vert_grid1_xi[nk + nj*nb_z] + geompy.addToStudy(v_geo, "vert_grid1_x" + str(ni) + "_y" + \ + str(nj) + "_z" + str(nk)) + v_mod.setAssociation(v_geo) + pass + pass + pass + + pass + +# association vertex/points de la grille 2 +# (tous les vertex qui ne sont pas fusionnes avec ceux de la grille # +# 1) +## dz_geom2 = geompy.MakeVectorDXDYDZ(33.5, 0., 1.) +pt_a = geompy.MakeVertex(33.5, 0, 0) +pt_b = geompy.MakeVertex(33.5, 0, 1.) +dz_geom2 = geompy.MakeVector(pt_a, pt_b) + +# les vertex du cylindre 2 sont crees de bas en haut, en tournant dans +# le sens trigonometrique : + +# REM : pour l'instant on met de cote la partie centrale du cylindre +# (6 vertex selon z) => a faire a la fin. Ils sont d'ailleurs ranges +# apres les autres dans le modele + + +# 6 vertex sont necessaires / axe z (pour associer aux 6 vertices du +# modele) : + +z_val = [-1, 1.5, 21.5, 24, 36, 41.5] # nl2 + 1 valeurs +for ni in range(nr2 + 1): + # suivant ni, valeurs des x pour les (nl1 + 1) points (selon l'axe z) + x = [] + z = [] + nb_z = 0 # nombre de points suivant l'axe z + if ni == 0: + z = z_val + x = [39.5] * len(z) + pass + elif ni == 1: + z = z_val[1:-1] # tout sauf le dernier et le premier + x = [42.5] * len(z) + pass + elif ni == 2: + z = z_val[1:-2] # tout sauf les 2 derniers et le premier + x = [46.] * len(z) + pass + elif ni == 3: + z = z_val[1:3] + x = [46.7] * len(z) # valeur a revoir ?? + pass + pass + + nb_z = len(z) + + # creation des points pour y = 0 : + vert_grid2_xi = [geompy.MakeVertex(xi, 0, zi) for (xi, zi) in \ + zip(x, z)] + + # les points suivants sont crees par rotation de PI/16 suivant + # l'axe z / aux precedents : + angle = math.pi/na2 # PI (180 degres), divise par 8 + for j in range(na2): + li = [geompy.MakeRotation(v, dz_geom2, angle) for v in vert_grid2_xi[-nb_z:]] + vert_grid2_xi.extend(li) + pass + + # ajout des points a l'etude et association : + for nj in range(na2 + 1): + for nk in range(nb_z): + v_mod = grille_cyl_demi.getVertexIJK(ni, nj, nk) + v_geo = vert_grid2_xi[nk + nj*nb_z] + geompy.addToStudy(v_geo, "vert_grid2_x" + str(ni) + "_y" + \ + str(nj) + "_z" + str(nk)) + v_mod.setAssociation(v_geo) + pass + pass + + pass + +# association des vertex communs grille1/grille2 +# REM : cette etape n'est pas necessaire ? En effet, les vertex ayant +# ete fusionnes, l'association a ete faite avec la grille 2 diff --git a/src/TEST_PY/crank.stp b/src/TEST_PY/crank.stp new file mode 100755 index 0000000..0aef5e4 --- /dev/null +++ b/src/TEST_PY/crank.stp @@ -0,0 +1,1178 @@ +ISO-10303-21; +HEADER; + FILE_DESCRIPTION(('a Product shape'),'1'); + FILE_NAME('Euclid Shape Model','1998-12-23T10:04:46',('Author Name'),( + 'MATRA-DATAVISION'),'OL-2.0D','EUCLID','Authorisation status'); + FILE_SCHEMA(('AUTOMOTIVE_DESIGN_CC2 { 1 2 10303 214 -1 1 5 4 }')); +ENDSEC; +DATA; +#1 = PRODUCT_TYPE('part',$,(#2)); +#2 = PRODUCT('the product name','the product name','void',(#3)); +#3 = MECHANICAL_CONTEXT('Mechanical',#4,'Assembly'); +#4 = APPLICATION_CONTEXT('EUCLID'); +#5 = APPLICATION_PROTOCOL_DEFINITION('CommitteeDraft', + 'automotive_design',1997,#4); +#6 = SHAPE_DEFINITION_REPRESENTATION(#7,#11); +#7 = PRODUCT_DEFINITION_SHAPE('void','void',#8); +#8 = PRODUCT_DEFINITION('void','void',#9,#10); +#9 = PRODUCT_DEFINITION_FORMATION('ID','void',#2); +#10 = PRODUCT_DEFINITION_CONTEXT('as proposed',#4,'First_Design'); +#11 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#12),#866); +#12 = MANIFOLD_SOLID_BREP('',#13); +#13 = CLOSED_SHELL('',(#14,#338,#415,#466,#518,#566,#617,#668,#720,#747, + #798,#849)); +#14 = ADVANCED_FACE('',(#15,#270,#304),#30,.F.); +#15 = FACE_BOUND('',#16,.T.); +#16 = EDGE_LOOP('',(#17,#56,#88,#120,#148,#180,#212,#244)); +#17 = ORIENTED_EDGE('',*,*,#18,.T.); +#18 = EDGE_CURVE('',#19,#21,#23,.T.); +#19 = VERTEX_POINT('',#20); +#20 = CARTESIAN_POINT('',(63.609212636948,27.934517711401, + -19.99999955296)); +#21 = VERTEX_POINT('',#22); +#22 = CARTESIAN_POINT('',(93.497879803181,36.745399236679, + -19.99999955296)); +#23 = SURFACE_CURVE('',#24,(#29,#45),.PCURVE_S2.); +#24 = CIRCLE('',#25,74.466478447737); +#25 = AXIS2_PLACEMENT_3D('',#26,#27,#28); +#26 = CARTESIAN_POINT('',(57.963432099881,102.18666633037, + -19.99999955296)); +#27 = DIRECTION('',(0.,0.,1.)); +#28 = DIRECTION('',(1.,0.,0.)); +#29 = PCURVE('',#30,#35); +#30 = PLANE('',#31); +#31 = AXIS2_PLACEMENT_3D('',#32,#33,#34); +#32 = CARTESIAN_POINT('',(0.,0.,-19.99999955296)); +#33 = DIRECTION('',(0.,0.,1.)); +#34 = DIRECTION('',(1.,0.,0.)); +#35 = DEFINITIONAL_REPRESENTATION('',(#36),#44); +#36 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#37,#38,#39,#40,#41,#42,#43), +.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#37 = CARTESIAN_POINT('',(132.42991054761,102.18666633037)); +#38 = CARTESIAN_POINT('',(132.42991054761,231.16639046259)); +#39 = CARTESIAN_POINT('',(20.730192876013,166.67652839648)); +#40 = CARTESIAN_POINT('',(-90.96952479559,102.18666633037)); +#41 = CARTESIAN_POINT('',(20.730192876013,37.696804264271)); +#42 = CARTESIAN_POINT('',(132.42991054761,-26.79305780183)); +#43 = CARTESIAN_POINT('',(132.42991054761,102.18666633037)); +#44 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#45 = PCURVE('',#46,#51); +#46 = CYLINDRICAL_SURFACE('',#47,74.466478447737); +#47 = AXIS2_PLACEMENT_3D('',#48,#49,#50); +#48 = CARTESIAN_POINT('',(57.963432099881,102.18666633037, + -19.99999955296)); +#49 = DIRECTION('',(0.,0.,1.)); +#50 = DIRECTION('',(1.,0.,0.)); +#51 = DEFINITIONAL_REPRESENTATION('',(#52),#55); +#52 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#53,#54),.UNSPECIFIED.,.F.,.F.,(2, + 2),(4.788278205588,5.209840138517),.PIECEWISE_BEZIER_KNOTS.); +#53 = CARTESIAN_POINT('',(4.788278205588,0.)); +#54 = CARTESIAN_POINT('',(5.209840138517,0.)); +#55 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#56 = ORIENTED_EDGE('',*,*,#57,.T.); +#57 = EDGE_CURVE('',#21,#58,#60,.T.); +#58 = VERTEX_POINT('',#59); +#59 = CARTESIAN_POINT('',(93.497879803181,-41.78636148572, + -19.99999955296)); +#60 = SURFACE_CURVE('',#61,(#66,#77),.PCURVE_S2.); +#61 = CIRCLE('',#62,44.68116165083); +#62 = AXIS2_PLACEMENT_3D('',#63,#64,#65); +#63 = CARTESIAN_POINT('',(114.81915663942,-2.52048112452,-19.99999955296 + )); +#64 = DIRECTION('',(0.,0.,-1.)); +#65 = DIRECTION('',(1.,0.,0.)); +#66 = PCURVE('',#30,#67); +#67 = DEFINITIONAL_REPRESENTATION('',(#68),#76); +#68 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#69,#70,#71,#72,#73,#74,#75), +.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#69 = CARTESIAN_POINT('',(159.50031829025,-2.52048112452)); +#70 = CARTESIAN_POINT('',(159.50031829025,-79.91052324495)); +#71 = CARTESIAN_POINT('',(92.478575814005,-41.21550218473)); +#72 = CARTESIAN_POINT('',(25.45683333776,-2.52048112452)); +#73 = CARTESIAN_POINT('',(92.478575814005,36.174539935697)); +#74 = CARTESIAN_POINT('',(159.50031829025,74.869560995915)); +#75 = CARTESIAN_POINT('',(159.50031829025,-2.52048112452)); +#76 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#77 = PCURVE('',#78,#83); +#78 = CYLINDRICAL_SURFACE('',#79,44.68116165083); +#79 = AXIS2_PLACEMENT_3D('',#80,#81,#82); +#80 = CARTESIAN_POINT('',(114.81915663942,-2.52048112452,-19.99999955296 + )); +#81 = DIRECTION('',(0.,0.,-1.)); +#82 = DIRECTION('',(1.,0.,0.)); +#83 = DEFINITIONAL_REPRESENTATION('',(#84),#87); +#84 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#85,#86),.UNSPECIFIED.,.F.,.F.,(2, + 2),(4.214937822253,8.351432792106),.PIECEWISE_BEZIER_KNOTS.); +#85 = CARTESIAN_POINT('',(4.214937822253,0.)); +#86 = CARTESIAN_POINT('',(8.351432792106,0.)); +#87 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#88 = ORIENTED_EDGE('',*,*,#89,.T.); +#89 = EDGE_CURVE('',#58,#90,#92,.T.); +#90 = VERTEX_POINT('',#91); +#91 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + -19.99999955296)); +#92 = SURFACE_CURVE('',#93,(#98,#109),.PCURVE_S2.); +#93 = CIRCLE('',#94,84.24770250966); +#94 = AXIS2_PLACEMENT_3D('',#95,#96,#97); +#95 = CARTESIAN_POINT('',(53.295957524102,-115.8233848133, + -19.99999955296)); +#96 = DIRECTION('',(0.,0.,1.)); +#97 = DIRECTION('',(1.,0.,0.)); +#98 = PCURVE('',#30,#99); +#99 = DEFINITIONAL_REPRESENTATION('',(#100),#108); +#100 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#101,#102,#103,#104,#105,#106 +,#107),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#101 = CARTESIAN_POINT('',(137.54366003376,-115.8233848133)); +#102 = CARTESIAN_POINT('',(137.54366003376,30.097916354281)); +#103 = CARTESIAN_POINT('',(11.172106269272,-42.86273422955)); +#104 = CARTESIAN_POINT('',(-115.1994474952,-115.8233848133)); +#105 = CARTESIAN_POINT('',(11.172106269272,-188.7840353972)); +#106 = CARTESIAN_POINT('',(137.54366003376,-261.744685981)); +#107 = CARTESIAN_POINT('',(137.54366003376,-115.8233848133)); +#108 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#109 = PCURVE('',#110,#115); +#110 = CYLINDRICAL_SURFACE('',#111,84.24770250966); +#111 = AXIS2_PLACEMENT_3D('',#112,#113,#114); +#112 = CARTESIAN_POINT('',(53.295957524102,-115.8233848133, + -19.99999955296)); +#113 = DIRECTION('',(0.,0.,1.)); +#114 = DIRECTION('',(1.,0.,0.)); +#115 = DEFINITIONAL_REPRESENTATION('',(#116),#119); +#116 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#117,#118),.UNSPECIFIED.,.F.,.F., + (2,2),(1.073345168663,1.501387093594),.PIECEWISE_BEZIER_KNOTS.); +#117 = CARTESIAN_POINT('',(1.073345168663,0.)); +#118 = CARTESIAN_POINT('',(1.501387093594,0.)); +#119 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#120 = ORIENTED_EDGE('',*,*,#121,.T.); +#121 = EDGE_CURVE('',#90,#122,#124,.T.); +#122 = VERTEX_POINT('',#123); +#123 = CARTESIAN_POINT('',(-72.42252677679,-22.63227291405, + -19.99999955296)); +#124 = SURFACE_CURVE('',#125,(#129,#136),.PCURVE_S2.); +#125 = LINE('',#126,#127); +#126 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + -19.99999955296)); +#127 = VECTOR('',#128,1.); +#128 = DIRECTION('',(-0.997592146088,6.935351515554E-02,0.)); +#129 = PCURVE('',#30,#130); +#130 = DEFINITIONAL_REPRESENTATION('',(#131),#135); +#131 = LINE('',#132,#133); +#132 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384)); +#133 = VECTOR('',#134,1.); +#134 = DIRECTION('',(-0.997592146088,6.935351515554E-02)); +#135 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#136 = PCURVE('',#137,#142); +#137 = PLANE('',#138); +#138 = AXIS2_PLACEMENT_3D('',#139,#140,#141); +#139 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + -19.99999955296)); +#140 = DIRECTION('',(-6.935351515554E-02,-0.997592146088,0.)); +#141 = DIRECTION('',(-0.997592146088,6.935351515554E-02,0.)); +#142 = DEFINITIONAL_REPRESENTATION('',(#143),#147); +#143 = LINE('',#144,#145); +#144 = CARTESIAN_POINT('',(0.,-3.552713678801E-14)); +#145 = VECTOR('',#146,1.); +#146 = DIRECTION('',(1.,0.)); +#147 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#148 = ORIENTED_EDGE('',*,*,#149,.T.); +#149 = EDGE_CURVE('',#122,#150,#152,.T.); +#150 = VERTEX_POINT('',#151); +#151 = CARTESIAN_POINT('',(-88.51642906665,-27.22925320267, + -19.99999955296)); +#152 = SURFACE_CURVE('',#153,(#158,#169),.PCURVE_S2.); +#153 = CIRCLE('',#154,24.565238684828); +#154 = AXIS2_PLACEMENT_3D('',#155,#156,#157); +#155 = CARTESIAN_POINT('',(-74.12621243021,-47.1383620928, + -19.99999955296)); +#156 = DIRECTION('',(0.,0.,1.)); +#157 = DIRECTION('',(1.,0.,0.)); +#158 = PCURVE('',#30,#159); +#159 = DEFINITIONAL_REPRESENTATION('',(#160),#168); +#160 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#161,#162,#163,#164,#165,#166 +,#167),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#161 = CARTESIAN_POINT('',(-49.56097374539,-47.1383620928)); +#162 = CARTESIAN_POINT('',(-49.56097374539,-4.590120590624)); +#163 = CARTESIAN_POINT('',(-86.40883177263,-25.86424134171)); +#164 = CARTESIAN_POINT('',(-123.2566897998,-47.1383620928)); +#165 = CARTESIAN_POINT('',(-86.40883177263,-68.41248284389)); +#166 = CARTESIAN_POINT('',(-49.56097374539,-89.68660359498)); +#167 = CARTESIAN_POINT('',(-49.56097374539,-47.1383620928)); +#168 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#169 = PCURVE('',#170,#175); +#170 = CYLINDRICAL_SURFACE('',#171,24.565238684828); +#171 = AXIS2_PLACEMENT_3D('',#172,#173,#174); +#172 = CARTESIAN_POINT('',(-74.12621243021,-47.1383620928, + -19.99999955296)); +#173 = DIRECTION('',(0.,0.,1.)); +#174 = DIRECTION('',(1.,0.,0.)); +#175 = DEFINITIONAL_REPRESENTATION('',(#176),#179); +#176 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#177,#178),.UNSPECIFIED.,.F.,.F., + (2,2),(1.501387093594,2.196658099744),.PIECEWISE_BEZIER_KNOTS.); +#177 = CARTESIAN_POINT('',(1.501387093594,0.)); +#178 = CARTESIAN_POINT('',(2.196658099744,0.)); +#179 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#180 = ORIENTED_EDGE('',*,*,#181,.T.); +#181 = EDGE_CURVE('',#150,#182,#184,.T.); +#182 = VERTEX_POINT('',#183); +#183 = CARTESIAN_POINT('',(-88.51642906665,21.039046347141, + -19.99999955296)); +#184 = SURFACE_CURVE('',#185,(#190,#201),.PCURVE_S2.); +#185 = CIRCLE('',#186,29.778387016109); +#186 = AXIS2_PLACEMENT_3D('',#187,#188,#189); +#187 = CARTESIAN_POINT('',(-105.9604867346,-3.095103427768, + -19.99999955296)); +#188 = DIRECTION('',(0.,0.,-1.)); +#189 = DIRECTION('',(1.,0.,0.)); +#190 = PCURVE('',#30,#191); +#191 = DEFINITIONAL_REPRESENTATION('',(#192),#200); +#192 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#193,#194,#195,#196,#197,#198 +,#199),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#193 = CARTESIAN_POINT('',(-76.18209971851,-3.095103427768)); +#194 = CARTESIAN_POINT('',(-76.18209971851,-54.67278270711)); +#195 = CARTESIAN_POINT('',(-120.8496802426,-28.88394306744)); +#196 = CARTESIAN_POINT('',(-165.5172607668,-3.095103427768)); +#197 = CARTESIAN_POINT('',(-120.8496802426,22.693736211908)); +#198 = CARTESIAN_POINT('',(-76.18209971851,48.482575851583)); +#199 = CARTESIAN_POINT('',(-76.18209971851,-3.095103427768)); +#200 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#201 = PCURVE('',#202,#207); +#202 = CYLINDRICAL_SURFACE('',#203,29.778387016109); +#203 = AXIS2_PLACEMENT_3D('',#204,#205,#206); +#204 = CARTESIAN_POINT('',(-105.9604867346,-3.095103427768, + -19.99999955296)); +#205 = DIRECTION('',(0.,0.,-1.)); +#206 = DIRECTION('',(1.,0.,0.)); +#207 = DEFINITIONAL_REPRESENTATION('',(#208),#211); +#208 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#209,#210),.UNSPECIFIED.,.F.,.F., + (2,2),(0.944934553846,5.338250753333),.PIECEWISE_BEZIER_KNOTS.); +#209 = CARTESIAN_POINT('',(0.944934553846,0.)); +#210 = CARTESIAN_POINT('',(5.338250753333,0.)); +#211 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#212 = ORIENTED_EDGE('',*,*,#213,.T.); +#213 = EDGE_CURVE('',#182,#214,#216,.T.); +#214 = VERTEX_POINT('',#215); +#215 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + -19.99999955296)); +#216 = SURFACE_CURVE('',#217,(#222,#233),.PCURVE_S2.); +#217 = CIRCLE('',#218,20.41914254867); +#218 = AXIS2_PLACEMENT_3D('',#219,#220,#221); +#219 = CARTESIAN_POINT('',(-76.55497863763,37.587915977932, + -19.99999955296)); +#220 = DIRECTION('',(0.,0.,1.)); +#221 = DIRECTION('',(1.,0.,0.)); +#222 = PCURVE('',#30,#223); +#223 = DEFINITIONAL_REPRESENTATION('',(#224),#232); +#224 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#225,#226,#227,#228,#229,#230 +,#231),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#225 = CARTESIAN_POINT('',(-56.13583608896,37.587915977932)); +#226 = CARTESIAN_POINT('',(-56.13583608896,72.954908319219)); +#227 = CARTESIAN_POINT('',(-86.76454991196,55.271412148575)); +#228 = CARTESIAN_POINT('',(-117.3932637349,37.587915977932)); +#229 = CARTESIAN_POINT('',(-86.76454991196,19.904419807288)); +#230 = CARTESIAN_POINT('',(-56.13583608896,2.220923636644)); +#231 = CARTESIAN_POINT('',(-56.13583608896,37.587915977932)); +#232 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#233 = PCURVE('',#234,#239); +#234 = CYLINDRICAL_SURFACE('',#235,20.41914254867); +#235 = AXIS2_PLACEMENT_3D('',#236,#237,#238); +#236 = CARTESIAN_POINT('',(-76.55497863763,37.587915977932, + -19.99999955296)); +#237 = DIRECTION('',(0.,0.,1.)); +#238 = DIRECTION('',(1.,0.,0.)); +#239 = DEFINITIONAL_REPRESENTATION('',(#240),#243); +#240 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#241,#242),.UNSPECIFIED.,.F.,.F., + (2,2),(4.086527207436,4.916177873213),.PIECEWISE_BEZIER_KNOTS.); +#241 = CARTESIAN_POINT('',(4.086527207436,0.)); +#242 = CARTESIAN_POINT('',(4.916177873213,0.)); +#243 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#244 = ORIENTED_EDGE('',*,*,#245,.T.); +#245 = EDGE_CURVE('',#214,#19,#246,.T.); +#246 = SURFACE_CURVE('',#247,(#251,#258),.PCURVE_S2.); +#247 = LINE('',#248,#249); +#248 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + -19.99999955296)); +#249 = VECTOR('',#250,1.); +#250 = DIRECTION('',(0.997121794488,7.581640296081E-02,0.)); +#251 = PCURVE('',#30,#252); +#252 = DEFINITIONAL_REPRESENTATION('',(#253),#257); +#253 = LINE('',#254,#255); +#254 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011)); +#255 = VECTOR('',#256,1.); +#256 = DIRECTION('',(0.997121794488,7.581640296081E-02)); +#257 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#258 = PCURVE('',#259,#264); +#259 = PLANE('',#260); +#260 = AXIS2_PLACEMENT_3D('',#261,#262,#263); +#261 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + -19.99999955296)); +#262 = DIRECTION('',(-7.581640296081E-02,0.997121794488,0.)); +#263 = DIRECTION('',(0.997121794488,7.581640296081E-02,0.)); +#264 = DEFINITIONAL_REPRESENTATION('',(#265),#269); +#265 = LINE('',#266,#267); +#266 = CARTESIAN_POINT('',(0.,-3.552713678801E-14)); +#267 = VECTOR('',#268,1.); +#268 = DIRECTION('',(1.,0.)); +#269 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#270 = FACE_BOUND('',#271,.F.); +#271 = EDGE_LOOP('',(#272)); +#272 = ORIENTED_EDGE('',*,*,#273,.T.); +#273 = EDGE_CURVE('',#274,#274,#276,.T.); +#274 = VERTEX_POINT('',#275); +#275 = CARTESIAN_POINT('',(-91.4143372247,-2.809300087392, + -19.99999955296)); +#276 = SURFACE_CURVE('',#277,(#282,#293),.PCURVE_S2.); +#277 = CIRCLE('',#278,15.057678156153); +#278 = AXIS2_PLACEMENT_3D('',#279,#280,#281); +#279 = CARTESIAN_POINT('',(-106.4720153808,-2.809300087392, + -19.99999955296)); +#280 = DIRECTION('',(0.,0.,-1.)); +#281 = DIRECTION('',(0.,1.,0.)); +#282 = PCURVE('',#30,#283); +#283 = DEFINITIONAL_REPRESENTATION('',(#284),#292); +#284 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#285,#286,#287,#288,#289,#290 +,#291),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#285 = CARTESIAN_POINT('',(-106.4720153808,12.24837806876)); +#286 = CARTESIAN_POINT('',(-80.39135177038,12.24837806876)); +#287 = CARTESIAN_POINT('',(-93.43168357562,-10.33813916546)); +#288 = CARTESIAN_POINT('',(-106.4720153808,-32.92465639969)); +#289 = CARTESIAN_POINT('',(-119.512347186,-10.33813916546)); +#290 = CARTESIAN_POINT('',(-132.5526789913,12.24837806876)); +#291 = CARTESIAN_POINT('',(-106.4720153808,12.24837806876)); +#292 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#293 = PCURVE('',#294,#299); +#294 = CYLINDRICAL_SURFACE('',#295,15.057678156153); +#295 = AXIS2_PLACEMENT_3D('',#296,#297,#298); +#296 = CARTESIAN_POINT('',(-106.4720153808,-2.809300087392, + -40.00019910593)); +#297 = DIRECTION('',(0.,0.,1.)); +#298 = DIRECTION('',(1.,0.,0.)); +#299 = DEFINITIONAL_REPRESENTATION('',(#300),#303); +#300 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#301,#302),.UNSPECIFIED.,.F.,.F., + (2,2),(1.570796326795,7.853981633974),.PIECEWISE_BEZIER_KNOTS.); +#301 = CARTESIAN_POINT('',(6.28318530718,20.000199552965)); +#302 = CARTESIAN_POINT('',(0.,20.000199552965)); +#303 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#304 = FACE_BOUND('',#305,.F.); +#305 = EDGE_LOOP('',(#306)); +#306 = ORIENTED_EDGE('',*,*,#307,.T.); +#307 = EDGE_CURVE('',#308,#308,#310,.T.); +#308 = VERTEX_POINT('',#309); +#309 = CARTESIAN_POINT('',(141.97662545896,-4.606760106981, + -19.99999955296)); +#310 = SURFACE_CURVE('',#311,(#316,#327),.PCURVE_S2.); +#311 = CIRCLE('',#312,23.40416683412); +#312 = AXIS2_PLACEMENT_3D('',#313,#314,#315); +#313 = CARTESIAN_POINT('',(118.57245862484,-4.606760106981, + -19.99999955296)); +#314 = DIRECTION('',(0.,0.,-1.)); +#315 = DIRECTION('',(0.,1.,0.)); +#316 = PCURVE('',#30,#317); +#317 = DEFINITIONAL_REPRESENTATION('',(#318),#326); +#318 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#319,#320,#321,#322,#323,#324 +,#325),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#319 = CARTESIAN_POINT('',(118.57245862484,18.797406727139)); +#320 = CARTESIAN_POINT('',(159.10966469035,18.797406727139)); +#321 = CARTESIAN_POINT('',(138.84106165759,-16.30884352404)); +#322 = CARTESIAN_POINT('',(118.57245862484,-51.41509377522)); +#323 = CARTESIAN_POINT('',(98.303855592083,-16.30884352404)); +#324 = CARTESIAN_POINT('',(78.035252559326,18.797406727139)); +#325 = CARTESIAN_POINT('',(118.57245862484,18.797406727139)); +#326 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#327 = PCURVE('',#328,#333); +#328 = CYLINDRICAL_SURFACE('',#329,23.40416683412); +#329 = AXIS2_PLACEMENT_3D('',#330,#331,#332); +#330 = CARTESIAN_POINT('',(118.57245862484,-4.606760106981, + -40.00019910593)); +#331 = DIRECTION('',(0.,0.,1.)); +#332 = DIRECTION('',(1.,0.,0.)); +#333 = DEFINITIONAL_REPRESENTATION('',(#334),#337); +#334 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#335,#336),.UNSPECIFIED.,.F.,.F., + (2,2),(1.570796326795,7.853981633974),.PIECEWISE_BEZIER_KNOTS.); +#335 = CARTESIAN_POINT('',(6.28318530718,20.000199552965)); +#336 = CARTESIAN_POINT('',(0.,20.000199552965)); +#337 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#338 = ADVANCED_FACE('',(#339),#46,.F.); +#339 = FACE_BOUND('',#340,.T.); +#340 = EDGE_LOOP('',(#341,#363,#395,#414)); +#341 = ORIENTED_EDGE('',*,*,#342,.T.); +#342 = EDGE_CURVE('',#19,#343,#345,.T.); +#343 = VERTEX_POINT('',#344); +#344 = CARTESIAN_POINT('',(63.609212636948,27.934517711401, + 19.999999552965)); +#345 = SURFACE_CURVE('',#346,(#350,#356),.PCURVE_S2.); +#346 = LINE('',#347,#348); +#347 = CARTESIAN_POINT('',(63.609212636948,27.934517711401, + -19.99999955296)); +#348 = VECTOR('',#349,1.); +#349 = DIRECTION('',(0.,0.,1.)); +#350 = PCURVE('',#46,#351); +#351 = DEFINITIONAL_REPRESENTATION('',(#352),#355); +#352 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#353,#354),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#353 = CARTESIAN_POINT('',(4.788278205588,0.)); +#354 = CARTESIAN_POINT('',(4.788278205588,39.99999910593)); +#355 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#356 = PCURVE('',#259,#357); +#357 = DEFINITIONAL_REPRESENTATION('',(#358),#362); +#358 = LINE('',#359,#360); +#359 = CARTESIAN_POINT('',(136.42439686482,0.)); +#360 = VECTOR('',#361,1.); +#361 = DIRECTION('',(0.,-1.)); +#362 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#363 = ORIENTED_EDGE('',*,*,#364,.T.); +#364 = EDGE_CURVE('',#343,#365,#367,.T.); +#365 = VERTEX_POINT('',#366); +#366 = CARTESIAN_POINT('',(93.497879803181,36.745399236679, + 19.999999552965)); +#367 = SURFACE_CURVE('',#368,(#373,#379),.PCURVE_S2.); +#368 = CIRCLE('',#369,74.466478447737); +#369 = AXIS2_PLACEMENT_3D('',#370,#371,#372); +#370 = CARTESIAN_POINT('',(57.963432099881,102.18666633037, + 19.999999552965)); +#371 = DIRECTION('',(0.,0.,1.)); +#372 = DIRECTION('',(1.,0.,0.)); +#373 = PCURVE('',#46,#374); +#374 = DEFINITIONAL_REPRESENTATION('',(#375),#378); +#375 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#376,#377),.UNSPECIFIED.,.F.,.F., + (2,2),(4.788278205588,5.209840138517),.PIECEWISE_BEZIER_KNOTS.); +#376 = CARTESIAN_POINT('',(4.788278205588,39.99999910593)); +#377 = CARTESIAN_POINT('',(5.209840138517,39.99999910593)); +#378 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#379 = PCURVE('',#380,#385); +#380 = PLANE('',#381); +#381 = AXIS2_PLACEMENT_3D('',#382,#383,#384); +#382 = CARTESIAN_POINT('',(0.,0.,19.999999552965)); +#383 = DIRECTION('',(0.,0.,1.)); +#384 = DIRECTION('',(1.,0.,0.)); +#385 = DEFINITIONAL_REPRESENTATION('',(#386),#394); +#386 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#387,#388,#389,#390,#391,#392 +,#393),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#387 = CARTESIAN_POINT('',(132.42991054761,102.18666633037)); +#388 = CARTESIAN_POINT('',(132.42991054761,231.16639046259)); +#389 = CARTESIAN_POINT('',(20.730192876013,166.67652839648)); +#390 = CARTESIAN_POINT('',(-90.96952479559,102.18666633037)); +#391 = CARTESIAN_POINT('',(20.730192876013,37.696804264271)); +#392 = CARTESIAN_POINT('',(132.42991054761,-26.79305780183)); +#393 = CARTESIAN_POINT('',(132.42991054761,102.18666633037)); +#394 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#395 = ORIENTED_EDGE('',*,*,#396,.F.); +#396 = EDGE_CURVE('',#21,#365,#397,.T.); +#397 = SURFACE_CURVE('',#398,(#402,#408),.PCURVE_S2.); +#398 = LINE('',#399,#400); +#399 = CARTESIAN_POINT('',(93.497879803181,36.745399236679, + -19.99999955296)); +#400 = VECTOR('',#401,1.); +#401 = DIRECTION('',(0.,0.,1.)); +#402 = PCURVE('',#46,#403); +#403 = DEFINITIONAL_REPRESENTATION('',(#404),#407); +#404 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#405,#406),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#405 = CARTESIAN_POINT('',(5.209840138517,0.)); +#406 = CARTESIAN_POINT('',(5.209840138517,39.99999910593)); +#407 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#408 = PCURVE('',#78,#409); +#409 = DEFINITIONAL_REPRESENTATION('',(#410),#413); +#410 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#411,#412),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#411 = CARTESIAN_POINT('',(4.214937822253,0.)); +#412 = CARTESIAN_POINT('',(4.214937822253,-39.99999910593)); +#413 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#414 = ORIENTED_EDGE('',*,*,#18,.F.); +#415 = ADVANCED_FACE('',(#416),#78,.T.); +#416 = FACE_BOUND('',#417,.T.); +#417 = EDGE_LOOP('',(#418,#419,#446,#465)); +#418 = ORIENTED_EDGE('',*,*,#396,.T.); +#419 = ORIENTED_EDGE('',*,*,#420,.T.); +#420 = EDGE_CURVE('',#365,#421,#423,.T.); +#421 = VERTEX_POINT('',#422); +#422 = CARTESIAN_POINT('',(93.497879803181,-41.78636148572, + 19.999999552965)); +#423 = SURFACE_CURVE('',#424,(#429,#435),.PCURVE_S2.); +#424 = CIRCLE('',#425,44.68116165083); +#425 = AXIS2_PLACEMENT_3D('',#426,#427,#428); +#426 = CARTESIAN_POINT('',(114.81915663942,-2.52048112452, + 19.999999552965)); +#427 = DIRECTION('',(0.,0.,-1.)); +#428 = DIRECTION('',(1.,0.,0.)); +#429 = PCURVE('',#78,#430); +#430 = DEFINITIONAL_REPRESENTATION('',(#431),#434); +#431 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#432,#433),.UNSPECIFIED.,.F.,.F., + (2,2),(4.214937822253,8.351432792106),.PIECEWISE_BEZIER_KNOTS.); +#432 = CARTESIAN_POINT('',(4.214937822253,-39.99999910593)); +#433 = CARTESIAN_POINT('',(8.351432792106,-39.99999910593)); +#434 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#435 = PCURVE('',#380,#436); +#436 = DEFINITIONAL_REPRESENTATION('',(#437),#445); +#437 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#438,#439,#440,#441,#442,#443 +,#444),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#438 = CARTESIAN_POINT('',(159.50031829025,-2.52048112452)); +#439 = CARTESIAN_POINT('',(159.50031829025,-79.91052324495)); +#440 = CARTESIAN_POINT('',(92.478575814005,-41.21550218473)); +#441 = CARTESIAN_POINT('',(25.45683333776,-2.52048112452)); +#442 = CARTESIAN_POINT('',(92.478575814005,36.174539935697)); +#443 = CARTESIAN_POINT('',(159.50031829025,74.869560995915)); +#444 = CARTESIAN_POINT('',(159.50031829025,-2.52048112452)); +#445 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#446 = ORIENTED_EDGE('',*,*,#447,.F.); +#447 = EDGE_CURVE('',#58,#421,#448,.T.); +#448 = SURFACE_CURVE('',#449,(#453,#459),.PCURVE_S2.); +#449 = LINE('',#450,#451); +#450 = CARTESIAN_POINT('',(93.497879803181,-41.78636148572, + -19.99999955296)); +#451 = VECTOR('',#452,1.); +#452 = DIRECTION('',(0.,0.,1.)); +#453 = PCURVE('',#78,#454); +#454 = DEFINITIONAL_REPRESENTATION('',(#455),#458); +#455 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#456,#457),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#456 = CARTESIAN_POINT('',(8.351432792106,0.)); +#457 = CARTESIAN_POINT('',(8.351432792106,-39.99999910593)); +#458 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#459 = PCURVE('',#110,#460); +#460 = DEFINITIONAL_REPRESENTATION('',(#461),#464); +#461 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#462,#463),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#462 = CARTESIAN_POINT('',(1.073345168663,0.)); +#463 = CARTESIAN_POINT('',(1.073345168663,39.99999910593)); +#464 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#465 = ORIENTED_EDGE('',*,*,#57,.F.); +#466 = ADVANCED_FACE('',(#467),#110,.F.); +#467 = FACE_BOUND('',#468,.T.); +#468 = EDGE_LOOP('',(#469,#470,#497,#517)); +#469 = ORIENTED_EDGE('',*,*,#447,.T.); +#470 = ORIENTED_EDGE('',*,*,#471,.T.); +#471 = EDGE_CURVE('',#421,#472,#474,.T.); +#472 = VERTEX_POINT('',#473); +#473 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + 19.999999552965)); +#474 = SURFACE_CURVE('',#475,(#480,#486),.PCURVE_S2.); +#475 = CIRCLE('',#476,84.24770250966); +#476 = AXIS2_PLACEMENT_3D('',#477,#478,#479); +#477 = CARTESIAN_POINT('',(53.295957524102,-115.8233848133, + 19.999999552965)); +#478 = DIRECTION('',(0.,0.,1.)); +#479 = DIRECTION('',(1.,0.,0.)); +#480 = PCURVE('',#110,#481); +#481 = DEFINITIONAL_REPRESENTATION('',(#482),#485); +#482 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#483,#484),.UNSPECIFIED.,.F.,.F., + (2,2),(1.073345168663,1.501387093594),.PIECEWISE_BEZIER_KNOTS.); +#483 = CARTESIAN_POINT('',(1.073345168663,39.99999910593)); +#484 = CARTESIAN_POINT('',(1.501387093594,39.99999910593)); +#485 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#486 = PCURVE('',#380,#487); +#487 = DEFINITIONAL_REPRESENTATION('',(#488),#496); +#488 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#489,#490,#491,#492,#493,#494 +,#495),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#489 = CARTESIAN_POINT('',(137.54366003376,-115.8233848133)); +#490 = CARTESIAN_POINT('',(137.54366003376,30.097916354281)); +#491 = CARTESIAN_POINT('',(11.172106269272,-42.86273422955)); +#492 = CARTESIAN_POINT('',(-115.1994474952,-115.8233848133)); +#493 = CARTESIAN_POINT('',(11.172106269272,-188.7840353972)); +#494 = CARTESIAN_POINT('',(137.54366003376,-261.744685981)); +#495 = CARTESIAN_POINT('',(137.54366003376,-115.8233848133)); +#496 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#497 = ORIENTED_EDGE('',*,*,#498,.F.); +#498 = EDGE_CURVE('',#90,#472,#499,.T.); +#499 = SURFACE_CURVE('',#500,(#504,#510),.PCURVE_S2.); +#500 = LINE('',#501,#502); +#501 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + -19.99999955296)); +#502 = VECTOR('',#503,1.); +#503 = DIRECTION('',(0.,0.,1.)); +#504 = PCURVE('',#110,#505); +#505 = DEFINITIONAL_REPRESENTATION('',(#506),#509); +#506 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#507,#508),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#507 = CARTESIAN_POINT('',(1.501387093594,0.)); +#508 = CARTESIAN_POINT('',(1.501387093594,39.99999910593)); +#509 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#510 = PCURVE('',#137,#511); +#511 = DEFINITIONAL_REPRESENTATION('',(#512),#516); +#512 = LINE('',#513,#514); +#513 = CARTESIAN_POINT('',(0.,0.)); +#514 = VECTOR('',#515,1.); +#515 = DIRECTION('',(0.,-1.)); +#516 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#517 = ORIENTED_EDGE('',*,*,#89,.F.); +#518 = ADVANCED_FACE('',(#519),#137,.T.); +#519 = FACE_BOUND('',#520,.T.); +#520 = EDGE_LOOP('',(#521,#522,#545,#565)); +#521 = ORIENTED_EDGE('',*,*,#498,.T.); +#522 = ORIENTED_EDGE('',*,*,#523,.T.); +#523 = EDGE_CURVE('',#472,#524,#526,.T.); +#524 = VERTEX_POINT('',#525); +#525 = CARTESIAN_POINT('',(-72.42252677679,-22.63227291405, + 19.999999552965)); +#526 = SURFACE_CURVE('',#527,(#531,#538),.PCURVE_S2.); +#527 = LINE('',#528,#529); +#528 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + 19.999999552965)); +#529 = VECTOR('',#530,1.); +#530 = DIRECTION('',(-0.997592146088,6.935351515554E-02,0.)); +#531 = PCURVE('',#137,#532); +#532 = DEFINITIONAL_REPRESENTATION('',(#533),#537); +#533 = LINE('',#534,#535); +#534 = CARTESIAN_POINT('',(0.,-39.99999910593)); +#535 = VECTOR('',#536,1.); +#536 = DIRECTION('',(1.,0.)); +#537 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#538 = PCURVE('',#380,#539); +#539 = DEFINITIONAL_REPRESENTATION('',(#540),#544); +#540 = LINE('',#541,#542); +#541 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384)); +#542 = VECTOR('',#543,1.); +#543 = DIRECTION('',(-0.997592146088,6.935351515554E-02)); +#544 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#545 = ORIENTED_EDGE('',*,*,#546,.F.); +#546 = EDGE_CURVE('',#122,#524,#547,.T.); +#547 = SURFACE_CURVE('',#548,(#552,#559),.PCURVE_S2.); +#548 = LINE('',#549,#550); +#549 = CARTESIAN_POINT('',(-72.42252677679,-22.63227291405, + -19.99999955296)); +#550 = VECTOR('',#551,1.); +#551 = DIRECTION('',(0.,0.,1.)); +#552 = PCURVE('',#137,#553); +#553 = DEFINITIONAL_REPRESENTATION('',(#554),#558); +#554 = LINE('',#555,#556); +#555 = CARTESIAN_POINT('',(131.87890374807,0.)); +#556 = VECTOR('',#557,1.); +#557 = DIRECTION('',(0.,-1.)); +#558 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#559 = PCURVE('',#170,#560); +#560 = DEFINITIONAL_REPRESENTATION('',(#561),#564); +#561 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#562,#563),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#562 = CARTESIAN_POINT('',(1.501387093594,0.)); +#563 = CARTESIAN_POINT('',(1.501387093594,39.99999910593)); +#564 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#565 = ORIENTED_EDGE('',*,*,#121,.F.); +#566 = ADVANCED_FACE('',(#567),#170,.F.); +#567 = FACE_BOUND('',#568,.T.); +#568 = EDGE_LOOP('',(#569,#570,#597,#616)); +#569 = ORIENTED_EDGE('',*,*,#546,.T.); +#570 = ORIENTED_EDGE('',*,*,#571,.T.); +#571 = EDGE_CURVE('',#524,#572,#574,.T.); +#572 = VERTEX_POINT('',#573); +#573 = CARTESIAN_POINT('',(-88.51642906665,-27.22925320267, + 19.999999552965)); +#574 = SURFACE_CURVE('',#575,(#580,#586),.PCURVE_S2.); +#575 = CIRCLE('',#576,24.565238684828); +#576 = AXIS2_PLACEMENT_3D('',#577,#578,#579); +#577 = CARTESIAN_POINT('',(-74.12621243021,-47.1383620928, + 19.999999552965)); +#578 = DIRECTION('',(0.,0.,1.)); +#579 = DIRECTION('',(1.,0.,0.)); +#580 = PCURVE('',#170,#581); +#581 = DEFINITIONAL_REPRESENTATION('',(#582),#585); +#582 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#583,#584),.UNSPECIFIED.,.F.,.F., + (2,2),(1.501387093594,2.196658099744),.PIECEWISE_BEZIER_KNOTS.); +#583 = CARTESIAN_POINT('',(1.501387093594,39.99999910593)); +#584 = CARTESIAN_POINT('',(2.196658099744,39.99999910593)); +#585 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#586 = PCURVE('',#380,#587); +#587 = DEFINITIONAL_REPRESENTATION('',(#588),#596); +#588 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#589,#590,#591,#592,#593,#594 +,#595),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#589 = CARTESIAN_POINT('',(-49.56097374539,-47.1383620928)); +#590 = CARTESIAN_POINT('',(-49.56097374539,-4.590120590624)); +#591 = CARTESIAN_POINT('',(-86.40883177263,-25.86424134171)); +#592 = CARTESIAN_POINT('',(-123.2566897998,-47.1383620928)); +#593 = CARTESIAN_POINT('',(-86.40883177263,-68.41248284389)); +#594 = CARTESIAN_POINT('',(-49.56097374539,-89.68660359498)); +#595 = CARTESIAN_POINT('',(-49.56097374539,-47.1383620928)); +#596 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#597 = ORIENTED_EDGE('',*,*,#598,.F.); +#598 = EDGE_CURVE('',#150,#572,#599,.T.); +#599 = SURFACE_CURVE('',#600,(#604,#610),.PCURVE_S2.); +#600 = LINE('',#601,#602); +#601 = CARTESIAN_POINT('',(-88.51642906665,-27.22925320267, + -19.99999955296)); +#602 = VECTOR('',#603,1.); +#603 = DIRECTION('',(0.,0.,1.)); +#604 = PCURVE('',#170,#605); +#605 = DEFINITIONAL_REPRESENTATION('',(#606),#609); +#606 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#607,#608),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#607 = CARTESIAN_POINT('',(2.196658099744,0.)); +#608 = CARTESIAN_POINT('',(2.196658099744,39.99999910593)); +#609 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#610 = PCURVE('',#202,#611); +#611 = DEFINITIONAL_REPRESENTATION('',(#612),#615); +#612 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#613,#614),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#613 = CARTESIAN_POINT('',(0.944934553846,0.)); +#614 = CARTESIAN_POINT('',(0.944934553846,-39.99999910593)); +#615 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#616 = ORIENTED_EDGE('',*,*,#149,.F.); +#617 = ADVANCED_FACE('',(#618),#202,.T.); +#618 = FACE_BOUND('',#619,.T.); +#619 = EDGE_LOOP('',(#620,#621,#648,#667)); +#620 = ORIENTED_EDGE('',*,*,#598,.T.); +#621 = ORIENTED_EDGE('',*,*,#622,.T.); +#622 = EDGE_CURVE('',#572,#623,#625,.T.); +#623 = VERTEX_POINT('',#624); +#624 = CARTESIAN_POINT('',(-88.51642906665,21.039046347141, + 19.999999552965)); +#625 = SURFACE_CURVE('',#626,(#631,#637),.PCURVE_S2.); +#626 = CIRCLE('',#627,29.778387016109); +#627 = AXIS2_PLACEMENT_3D('',#628,#629,#630); +#628 = CARTESIAN_POINT('',(-105.9604867346,-3.095103427768, + 19.999999552965)); +#629 = DIRECTION('',(0.,0.,-1.)); +#630 = DIRECTION('',(1.,0.,0.)); +#631 = PCURVE('',#202,#632); +#632 = DEFINITIONAL_REPRESENTATION('',(#633),#636); +#633 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#634,#635),.UNSPECIFIED.,.F.,.F., + (2,2),(0.944934553846,5.338250753333),.PIECEWISE_BEZIER_KNOTS.); +#634 = CARTESIAN_POINT('',(0.944934553846,-39.99999910593)); +#635 = CARTESIAN_POINT('',(5.338250753333,-39.99999910593)); +#636 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#637 = PCURVE('',#380,#638); +#638 = DEFINITIONAL_REPRESENTATION('',(#639),#647); +#639 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#640,#641,#642,#643,#644,#645 +,#646),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#640 = CARTESIAN_POINT('',(-76.18209971851,-3.095103427768)); +#641 = CARTESIAN_POINT('',(-76.18209971851,-54.67278270711)); +#642 = CARTESIAN_POINT('',(-120.8496802426,-28.88394306744)); +#643 = CARTESIAN_POINT('',(-165.5172607668,-3.095103427768)); +#644 = CARTESIAN_POINT('',(-120.8496802426,22.693736211908)); +#645 = CARTESIAN_POINT('',(-76.18209971851,48.482575851583)); +#646 = CARTESIAN_POINT('',(-76.18209971851,-3.095103427768)); +#647 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#648 = ORIENTED_EDGE('',*,*,#649,.F.); +#649 = EDGE_CURVE('',#182,#623,#650,.T.); +#650 = SURFACE_CURVE('',#651,(#655,#661),.PCURVE_S2.); +#651 = LINE('',#652,#653); +#652 = CARTESIAN_POINT('',(-88.51642906665,21.039046347141, + -19.99999955296)); +#653 = VECTOR('',#654,1.); +#654 = DIRECTION('',(0.,0.,1.)); +#655 = PCURVE('',#202,#656); +#656 = DEFINITIONAL_REPRESENTATION('',(#657),#660); +#657 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#658,#659),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#658 = CARTESIAN_POINT('',(5.338250753333,0.)); +#659 = CARTESIAN_POINT('',(5.338250753333,-39.99999910593)); +#660 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#661 = PCURVE('',#234,#662); +#662 = DEFINITIONAL_REPRESENTATION('',(#663),#666); +#663 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#664,#665),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#664 = CARTESIAN_POINT('',(4.086527207436,0.)); +#665 = CARTESIAN_POINT('',(4.086527207436,39.99999910593)); +#666 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#667 = ORIENTED_EDGE('',*,*,#181,.F.); +#668 = ADVANCED_FACE('',(#669),#234,.F.); +#669 = FACE_BOUND('',#670,.T.); +#670 = EDGE_LOOP('',(#671,#672,#699,#719)); +#671 = ORIENTED_EDGE('',*,*,#649,.T.); +#672 = ORIENTED_EDGE('',*,*,#673,.T.); +#673 = EDGE_CURVE('',#623,#674,#676,.T.); +#674 = VERTEX_POINT('',#675); +#675 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + 19.999999552965)); +#676 = SURFACE_CURVE('',#677,(#682,#688),.PCURVE_S2.); +#677 = CIRCLE('',#678,20.41914254867); +#678 = AXIS2_PLACEMENT_3D('',#679,#680,#681); +#679 = CARTESIAN_POINT('',(-76.55497863763,37.587915977932, + 19.999999552965)); +#680 = DIRECTION('',(0.,0.,1.)); +#681 = DIRECTION('',(1.,0.,0.)); +#682 = PCURVE('',#234,#683); +#683 = DEFINITIONAL_REPRESENTATION('',(#684),#687); +#684 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#685,#686),.UNSPECIFIED.,.F.,.F., + (2,2),(4.086527207436,4.916177873213),.PIECEWISE_BEZIER_KNOTS.); +#685 = CARTESIAN_POINT('',(4.086527207436,39.99999910593)); +#686 = CARTESIAN_POINT('',(4.916177873213,39.99999910593)); +#687 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#688 = PCURVE('',#380,#689); +#689 = DEFINITIONAL_REPRESENTATION('',(#690),#698); +#690 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#691,#692,#693,#694,#695,#696 +,#697),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#691 = CARTESIAN_POINT('',(-56.13583608896,37.587915977932)); +#692 = CARTESIAN_POINT('',(-56.13583608896,72.954908319219)); +#693 = CARTESIAN_POINT('',(-86.76454991196,55.271412148575)); +#694 = CARTESIAN_POINT('',(-117.3932637349,37.587915977932)); +#695 = CARTESIAN_POINT('',(-86.76454991196,19.904419807288)); +#696 = CARTESIAN_POINT('',(-56.13583608896,2.220923636644)); +#697 = CARTESIAN_POINT('',(-56.13583608896,37.587915977932)); +#698 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#699 = ORIENTED_EDGE('',*,*,#700,.F.); +#700 = EDGE_CURVE('',#214,#674,#701,.T.); +#701 = SURFACE_CURVE('',#702,(#706,#712),.PCURVE_S2.); +#702 = LINE('',#703,#704); +#703 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + -19.99999955296)); +#704 = VECTOR('',#705,1.); +#705 = DIRECTION('',(0.,0.,1.)); +#706 = PCURVE('',#234,#707); +#707 = DEFINITIONAL_REPRESENTATION('',(#708),#711); +#708 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#709,#710),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#709 = CARTESIAN_POINT('',(4.916177873213,0.)); +#710 = CARTESIAN_POINT('',(4.916177873213,39.99999910593)); +#711 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#712 = PCURVE('',#259,#713); +#713 = DEFINITIONAL_REPRESENTATION('',(#714),#718); +#714 = LINE('',#715,#716); +#715 = CARTESIAN_POINT('',(0.,0.)); +#716 = VECTOR('',#717,1.); +#717 = DIRECTION('',(0.,-1.)); +#718 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#719 = ORIENTED_EDGE('',*,*,#213,.F.); +#720 = ADVANCED_FACE('',(#721),#259,.T.); +#721 = FACE_BOUND('',#722,.T.); +#722 = EDGE_LOOP('',(#723,#724,#745,#746)); +#723 = ORIENTED_EDGE('',*,*,#700,.T.); +#724 = ORIENTED_EDGE('',*,*,#725,.T.); +#725 = EDGE_CURVE('',#674,#343,#726,.T.); +#726 = SURFACE_CURVE('',#727,(#731,#738),.PCURVE_S2.); +#727 = LINE('',#728,#729); +#728 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + 19.999999552965)); +#729 = VECTOR('',#730,1.); +#730 = DIRECTION('',(0.997121794488,7.581640296081E-02,0.)); +#731 = PCURVE('',#259,#732); +#732 = DEFINITIONAL_REPRESENTATION('',(#733),#737); +#733 = LINE('',#734,#735); +#734 = CARTESIAN_POINT('',(0.,-39.99999910593)); +#735 = VECTOR('',#736,1.); +#736 = DIRECTION('',(1.,0.)); +#737 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#738 = PCURVE('',#380,#739); +#739 = DEFINITIONAL_REPRESENTATION('',(#740),#744); +#740 = LINE('',#741,#742); +#741 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011)); +#742 = VECTOR('',#743,1.); +#743 = DIRECTION('',(0.997121794488,7.581640296081E-02)); +#744 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#745 = ORIENTED_EDGE('',*,*,#342,.F.); +#746 = ORIENTED_EDGE('',*,*,#245,.F.); +#747 = ADVANCED_FACE('',(#748),#294,.F.); +#748 = FACE_BOUND('',#749,.T.); +#749 = EDGE_LOOP('',(#750,#771,#796,#797)); +#750 = ORIENTED_EDGE('',*,*,#751,.T.); +#751 = EDGE_CURVE('',#274,#752,#754,.T.); +#752 = VERTEX_POINT('',#753); +#753 = CARTESIAN_POINT('',(-91.4143372247,-2.809300087392, + 19.999999552965)); +#754 = SEAM_CURVE('',#755,(#759,#765),.PCURVE_S2.); +#755 = LINE('',#756,#757); +#756 = CARTESIAN_POINT('',(-91.4143372247,-2.809300087392, + -40.00019910593)); +#757 = VECTOR('',#758,1.); +#758 = DIRECTION('',(0.,0.,1.)); +#759 = PCURVE('',#294,#760); +#760 = DEFINITIONAL_REPRESENTATION('',(#761),#764); +#761 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#762,#763),.UNSPECIFIED.,.F.,.F., + (2,2),(20.000199552965,60.000198658895),.PIECEWISE_BEZIER_KNOTS.); +#762 = CARTESIAN_POINT('',(0.,20.000199552965)); +#763 = CARTESIAN_POINT('',(0.,60.000198658895)); +#764 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#765 = PCURVE('',#294,#766); +#766 = DEFINITIONAL_REPRESENTATION('',(#767),#770); +#767 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#768,#769),.UNSPECIFIED.,.F.,.F., + (2,2),(20.000199552965,60.000198658895),.PIECEWISE_BEZIER_KNOTS.); +#768 = CARTESIAN_POINT('',(6.28318530718,20.000199552965)); +#769 = CARTESIAN_POINT('',(6.28318530718,60.000198658895)); +#770 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#771 = ORIENTED_EDGE('',*,*,#772,.F.); +#772 = EDGE_CURVE('',#752,#752,#773,.T.); +#773 = SURFACE_CURVE('',#774,(#779,#785),.PCURVE_S2.); +#774 = CIRCLE('',#775,15.057678156153); +#775 = AXIS2_PLACEMENT_3D('',#776,#777,#778); +#776 = CARTESIAN_POINT('',(-106.4720153808,-2.809300087392, + 19.999999552965)); +#777 = DIRECTION('',(0.,0.,-1.)); +#778 = DIRECTION('',(0.,1.,0.)); +#779 = PCURVE('',#294,#780); +#780 = DEFINITIONAL_REPRESENTATION('',(#781),#784); +#781 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#782,#783),.UNSPECIFIED.,.F.,.F., + (2,2),(1.570796326795,7.853981633974),.PIECEWISE_BEZIER_KNOTS.); +#782 = CARTESIAN_POINT('',(6.28318530718,60.000198658895)); +#783 = CARTESIAN_POINT('',(0.,60.000198658895)); +#784 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#785 = PCURVE('',#380,#786); +#786 = DEFINITIONAL_REPRESENTATION('',(#787),#795); +#787 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#788,#789,#790,#791,#792,#793 +,#794),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#788 = CARTESIAN_POINT('',(-106.4720153808,12.24837806876)); +#789 = CARTESIAN_POINT('',(-80.39135177038,12.24837806876)); +#790 = CARTESIAN_POINT('',(-93.43168357562,-10.33813916546)); +#791 = CARTESIAN_POINT('',(-106.4720153808,-32.92465639969)); +#792 = CARTESIAN_POINT('',(-119.512347186,-10.33813916546)); +#793 = CARTESIAN_POINT('',(-132.5526789913,12.24837806876)); +#794 = CARTESIAN_POINT('',(-106.4720153808,12.24837806876)); +#795 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#796 = ORIENTED_EDGE('',*,*,#751,.F.); +#797 = ORIENTED_EDGE('',*,*,#273,.T.); +#798 = ADVANCED_FACE('',(#799),#328,.F.); +#799 = FACE_BOUND('',#800,.T.); +#800 = EDGE_LOOP('',(#801,#822,#847,#848)); +#801 = ORIENTED_EDGE('',*,*,#802,.T.); +#802 = EDGE_CURVE('',#308,#803,#805,.T.); +#803 = VERTEX_POINT('',#804); +#804 = CARTESIAN_POINT('',(141.97662545896,-4.606760106981, + 19.999999552965)); +#805 = SEAM_CURVE('',#806,(#810,#816),.PCURVE_S2.); +#806 = LINE('',#807,#808); +#807 = CARTESIAN_POINT('',(141.97662545896,-4.606760106981, + -40.00019910593)); +#808 = VECTOR('',#809,1.); +#809 = DIRECTION('',(0.,0.,1.)); +#810 = PCURVE('',#328,#811); +#811 = DEFINITIONAL_REPRESENTATION('',(#812),#815); +#812 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#813,#814),.UNSPECIFIED.,.F.,.F., + (2,2),(20.000199552965,60.000198658895),.PIECEWISE_BEZIER_KNOTS.); +#813 = CARTESIAN_POINT('',(0.,20.000199552965)); +#814 = CARTESIAN_POINT('',(0.,60.000198658895)); +#815 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#816 = PCURVE('',#328,#817); +#817 = DEFINITIONAL_REPRESENTATION('',(#818),#821); +#818 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#819,#820),.UNSPECIFIED.,.F.,.F., + (2,2),(20.000199552965,60.000198658895),.PIECEWISE_BEZIER_KNOTS.); +#819 = CARTESIAN_POINT('',(6.28318530718,20.000199552965)); +#820 = CARTESIAN_POINT('',(6.28318530718,60.000198658895)); +#821 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#822 = ORIENTED_EDGE('',*,*,#823,.F.); +#823 = EDGE_CURVE('',#803,#803,#824,.T.); +#824 = SURFACE_CURVE('',#825,(#830,#836),.PCURVE_S2.); +#825 = CIRCLE('',#826,23.40416683412); +#826 = AXIS2_PLACEMENT_3D('',#827,#828,#829); +#827 = CARTESIAN_POINT('',(118.57245862484,-4.606760106981, + 19.999999552965)); +#828 = DIRECTION('',(0.,0.,-1.)); +#829 = DIRECTION('',(0.,1.,0.)); +#830 = PCURVE('',#328,#831); +#831 = DEFINITIONAL_REPRESENTATION('',(#832),#835); +#832 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#833,#834),.UNSPECIFIED.,.F.,.F., + (2,2),(1.570796326795,7.853981633974),.PIECEWISE_BEZIER_KNOTS.); +#833 = CARTESIAN_POINT('',(6.28318530718,60.000198658895)); +#834 = CARTESIAN_POINT('',(0.,60.000198658895)); +#835 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#836 = PCURVE('',#380,#837); +#837 = DEFINITIONAL_REPRESENTATION('',(#838),#846); +#838 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#839,#840,#841,#842,#843,#844 +,#845),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#839 = CARTESIAN_POINT('',(118.57245862484,18.797406727139)); +#840 = CARTESIAN_POINT('',(159.10966469035,18.797406727139)); +#841 = CARTESIAN_POINT('',(138.84106165759,-16.30884352404)); +#842 = CARTESIAN_POINT('',(118.57245862484,-51.41509377522)); +#843 = CARTESIAN_POINT('',(98.303855592083,-16.30884352404)); +#844 = CARTESIAN_POINT('',(78.035252559326,18.797406727139)); +#845 = CARTESIAN_POINT('',(118.57245862484,18.797406727139)); +#846 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#847 = ORIENTED_EDGE('',*,*,#802,.F.); +#848 = ORIENTED_EDGE('',*,*,#307,.T.); +#849 = ADVANCED_FACE('',(#850,#860,#863),#380,.T.); +#850 = FACE_BOUND('',#851,.F.); +#851 = EDGE_LOOP('',(#852,#853,#854,#855,#856,#857,#858,#859)); +#852 = ORIENTED_EDGE('',*,*,#364,.T.); +#853 = ORIENTED_EDGE('',*,*,#420,.T.); +#854 = ORIENTED_EDGE('',*,*,#471,.T.); +#855 = ORIENTED_EDGE('',*,*,#523,.T.); +#856 = ORIENTED_EDGE('',*,*,#571,.T.); +#857 = ORIENTED_EDGE('',*,*,#622,.T.); +#858 = ORIENTED_EDGE('',*,*,#673,.T.); +#859 = ORIENTED_EDGE('',*,*,#725,.T.); +#860 = FACE_BOUND('',#861,.T.); +#861 = EDGE_LOOP('',(#862)); +#862 = ORIENTED_EDGE('',*,*,#772,.T.); +#863 = FACE_BOUND('',#864,.T.); +#864 = EDGE_LOOP('',(#865)); +#865 = ORIENTED_EDGE('',*,*,#823,.T.); +#866 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#869)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#867,#868)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#867 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#868 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#869 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-04),#867, + 'distance_accuracy_value','Confusion accuracy'); +ENDSEC; +END-ISO-10303-21; + diff --git a/src/TEST_PY/recettes/bielle.py b/src/TEST_PY/recettes/bielle.py new file mode 100644 index 0000000..86eca7c --- /dev/null +++ b/src/TEST_PY/recettes/bielle.py @@ -0,0 +1,258 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Francis KLOSS : 2011-2012 : CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France +# ============================================================================================= + +import math + +import geompy +import hexablock + +# Construire le modèle de bloc +# ============================ + +doc = hexablock.addDocument("bielle") + +# Construire les 2 grilles cylindriques +# ------------------------------------- + +centre_pb = doc.addVertex(0, 0, 0) +centre_gb = doc.addVertex(7, 0, 0) + +angle_px = math.pi / 3 +vecteur_px = doc.addVector(math.cos(angle_px), math.sin(angle_px), 0) +vecteur_gx = doc.addVector(1, 0, 0) + +vecteur_z = doc.addVector(0, 0, 1) + +grille_p = doc.makeCylindrical(centre_pb, vecteur_px, vecteur_z, 1, 360, 1, 1, 3, 1, False) +grille_g = doc.makeCylindrical(centre_gb, vecteur_gx, vecteur_z, 1, 360, 1, 1, 3, 1, False) + +# Relier les 2 grilles +# -------------------- + +quad_p = grille_p.getQuadJK(1, 2, 0) +quad_g = grille_g.getQuadJK(1, 1, 0) + +point_p1 = grille_p.getVertexIJK(1, 0, 0) +point_p2 = grille_p.getVertexIJK(1, 2, 0) + +point_g1 = grille_g.getVertexIJK(1, 1, 0) +point_g2 = grille_g.getVertexIJK(1, 2, 0) + +prisme = doc.joinQuad(quad_p, quad_g, point_p1, point_g1, point_p2, point_g2, 3) + +# Charger la géométrie +# ==================== + +bielle = geompy.ImportSTEP("bielle.stp") + +# Sélectionner des sous-parties de la géométrie +# --------------------------------------------- + +sommets = geompy.SubShapeAllSortedCentres(bielle, geompy.ShapeType["VERTEX"]) + +sommets_petit = [ 6, 8, 7, 9 ] +sommets_grand = [ 10, 12, 11, 13 ] + +aretes = geompy.SubShapeAllSortedCentres(bielle, geompy.ShapeType["EDGE"]) + +aretes_petit = [ 7, 9, 8, 10 ] +aretes_grand = [ 19, 21, 20, 22 ] + +ga_pbcd = aretes[ 0] +ga_pbe = aretes[ 2] + +ga_phcd = aretes[ 1] +ga_phe = aretes[ 3] + +ga_gbcd = aretes[27] +ga_gbe = aretes[25] + +ga_ghcd = aretes[28] +ga_ghe = aretes[26] + +# Associer le modèle de bloc avec la géométrie +# ============================================ + +doc.setShape(bielle) + +# Netoyer les associations implicites du prisme +# --------------------------------------------- + +for i in xrange( prisme.countEdge() ): + em = prisme.getEdge(i) + if em != None: + em.clearAssociation() + +# Associer les cercles extérieurs +# ------------------------------- + +def cercle(grille, k, ge, p): + ms = grille.getVertexIJK(0, 0, k) + + ma1 = grille.getEdgeJ(0, 2, k) + ma2 = grille.getEdgeJ(0, 1, k) + ma3 = grille.getEdgeJ(0, 0, k) + + doc.associateClosedLine(ms, ma1, [ ma2, ma3 ], ge, p, False, []) + +cercle(grille_p, 0, ga_pbe, 5.0/6) +cercle(grille_p, 1, ga_phe, 5.0/6) + +cercle(grille_g, 0, ga_gbe, 0) +cercle(grille_g, 1, ga_ghe, 0) + +# Associer les arcs extérieurs (excentrés) +# ---------------------------------------- + +def arc(grille, i1, i2, k, ge): + ma1 = grille.getEdgeJ(1, i1, k) + ma2 = grille.getEdgeJ(1, i2, k) + + doc.associateOpenedLine(ma1, [ ma2 ], ge, 0, [], 1) + +arc(grille_p, 1, 0, 0, ga_pbcd) +arc(grille_p, 1, 0, 1, ga_phcd) + +arc(grille_g, 0, 2, 0, ga_gbcd) +arc(grille_g, 0, 2, 1, ga_ghcd) + +# Associer les sommets des arcs de cercle de raccord +# -------------------------------------------------- + +hm = prisme.getHexa(1) +for i in xrange(0, 4): + vm = hm.getVertex(i) + ga = sommets[ sommets_petit[i] ] + vm.setAssociation(ga) + +hm = prisme.getHexa(2) +for i in xrange(0, 4): + vm = hm.getVertex(i) + ga = sommets[ sommets_grand[i] ] + vm.setAssociation(ga) + +# Associer les arcs de cercle de raccord +# -------------------------------------- + +hm = prisme.getHexa(0) +for i in xrange(0, 4): + em = hm.getEdge(i+8) + ga = aretes[ aretes_petit[i] ] + em.addAssociation(ga, 0, 1) + +hm = prisme.getHexa(2) +for i in xrange(0, 4): + em = hm.getEdge(i+8) + ga = aretes[ aretes_grand[i] ] + em.addAssociation(ga, 0, 1) + +# Arrondir des associations implicites cylindriques +# ------------------------------------------------- + +for h, i, ech in [ [0, 0, 0.95], [0, 1, 0.95], [2, 2, 0.85], [2, 3, 0.85] ]: + hm = prisme.getHexa(h) + em = hm.getEdge(i) + va = em.getVertex(0).getAssociation() + vb = em.getVertex(1).getAssociation() + vax, vay, vaz = geompy.PointCoordinates(va) + vbx, vby, vbz = geompy.PointCoordinates(vb) + vmx = ( vax + vbx ) / 2.0 * ech + vmy = ( vay + vby ) / 2.0 + vmz = ( vaz + vbz ) / 2.0 + vm = geompy.MakeVertex(vmx, vmy, vmz) + eg = geompy.MakeArc(va, vm, vb) + em.clearAssociation() + em.addAssociation(eg, 0, 1) + +# Mailler le modèle de bloc +# ========================= + +# Définir 5 groupes de faces +# -------------------------- + +groupe_petit = doc.addQuadGroup("Petit") +groupe_grand = doc.addQuadGroup("Grand") +groupe_bas = doc.addQuadGroup("Bas") +groupe_haut = doc.addQuadGroup("Haut") +groupe_contour = doc.addQuadGroup("Contour") + +# Constituer les groupes petit et grand +# ------------------------------------- + +for i in xrange(3): + groupe_petit.addElement( grille_p.getQuadJK(0, i, 0) ) + groupe_grand.addElement( grille_g.getQuadJK(0, i, 0) ) + +# Constituer les groupes bas et haut +# ---------------------------------- + +for i in xrange(3): + groupe_bas.addElement( grille_p.getQuadIJ(0, i, 0) ) + groupe_bas.addElement( grille_g.getQuadIJ(0, i, 0) ) + + groupe_haut.addElement( grille_p.getQuadIJ(0, i, 1) ) + groupe_haut.addElement( grille_g.getQuadIJ(0, i, 1) ) + +for i in xrange(3): + h = prisme.getHexa(i) + + groupe_bas.addElement( h.getQuad(2) ) + groupe_haut.addElement( h.getQuad(3) ) + +# Constituer le groupe contour +# ---------------------------- + +for i in xrange(2): + groupe_contour.addElement( grille_p.getQuadJK(1, i, 0) ) + +for i in [0, 2]: + groupe_contour.addElement( grille_g.getQuadJK(1, i, 0) ) + +for i in xrange(3): + h = prisme.getHexa(i) + + groupe_contour.addElement( h.getQuad(4) ) + groupe_contour.addElement( h.getQuad(5) ) + +# Définir 3 groupes de volumes +# ---------------------------- + +groupe_petit = doc.addHexaGroup("Petit") +groupe_grand = doc.addHexaGroup("Grand") +groupe_prisme = doc.addHexaGroup("Prisme") + +for i in xrange(3): + groupe_petit.addElement( grille_p.getHexa(i) ) + groupe_grand.addElement( grille_g.getHexa(i) ) + +for i in xrange(3): + groupe_prisme.addElement( prisme.getHexa(i) ) + +# Mailler le modèle de bloc avec association +# ------------------------------------------ + +hexablock.addLaws(doc, 0.003, True) + +blocs = hexablock.mesh(doc) + +muv, mue, muq, muh = hexablock.dump(doc, blocs) diff --git a/src/TEST_PY/recettes/bielle.stp b/src/TEST_PY/recettes/bielle.stp new file mode 100644 index 0000000..ef67fa5 --- /dev/null +++ b/src/TEST_PY/recettes/bielle.stp @@ -0,0 +1,1178 @@ +ISO-10303-21; +HEADER; + FILE_DESCRIPTION(('a Product shape'),'1'); + FILE_NAME('Euclid Shape Model','1998-12-23T10:04:46',('Author Name'),( + 'MATRA-DATAVISION'),'OL-2.0D','EUCLID','Authorisation status'); + FILE_SCHEMA(('AUTOMOTIVE_DESIGN_CC2 { 1 2 10303 214 -1 1 5 4 }')); +ENDSEC; +DATA; +#1 = PRODUCT_TYPE('part',$,(#2)); +#2 = PRODUCT('bielle','bielle','void',(#3)); +#3 = MECHANICAL_CONTEXT('Mechanical',#4,'Assembly'); +#4 = APPLICATION_CONTEXT('EUCLID'); +#5 = APPLICATION_PROTOCOL_DEFINITION('CommitteeDraft', + 'automotive_design',1997,#4); +#6 = SHAPE_DEFINITION_REPRESENTATION(#7,#11); +#7 = PRODUCT_DEFINITION_SHAPE('void','void',#8); +#8 = PRODUCT_DEFINITION('void','void',#9,#10); +#9 = PRODUCT_DEFINITION_FORMATION('ID','void',#2); +#10 = PRODUCT_DEFINITION_CONTEXT('as proposed',#4,'First_Design'); +#11 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#12),#866); +#12 = MANIFOLD_SOLID_BREP('',#13); +#13 = CLOSED_SHELL('',(#14,#338,#415,#466,#518,#566,#617,#668,#720,#747, + #798,#849)); +#14 = ADVANCED_FACE('',(#15,#270,#304),#30,.F.); +#15 = FACE_BOUND('',#16,.T.); +#16 = EDGE_LOOP('',(#17,#56,#88,#120,#148,#180,#212,#244)); +#17 = ORIENTED_EDGE('',*,*,#18,.T.); +#18 = EDGE_CURVE('',#19,#21,#23,.T.); +#19 = VERTEX_POINT('',#20); +#20 = CARTESIAN_POINT('',(63.609212636948,27.934517711401, + -19.99999955296)); +#21 = VERTEX_POINT('',#22); +#22 = CARTESIAN_POINT('',(93.497879803181,36.745399236679, + -19.99999955296)); +#23 = SURFACE_CURVE('',#24,(#29,#45),.PCURVE_S2.); +#24 = CIRCLE('',#25,74.466478447737); +#25 = AXIS2_PLACEMENT_3D('',#26,#27,#28); +#26 = CARTESIAN_POINT('',(57.963432099881,102.18666633037, + -19.99999955296)); +#27 = DIRECTION('',(0.,0.,1.)); +#28 = DIRECTION('',(1.,0.,0.)); +#29 = PCURVE('',#30,#35); +#30 = PLANE('',#31); +#31 = AXIS2_PLACEMENT_3D('',#32,#33,#34); +#32 = CARTESIAN_POINT('',(0.,0.,-19.99999955296)); +#33 = DIRECTION('',(0.,0.,1.)); +#34 = DIRECTION('',(1.,0.,0.)); +#35 = DEFINITIONAL_REPRESENTATION('',(#36),#44); +#36 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#37,#38,#39,#40,#41,#42,#43), +.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#37 = CARTESIAN_POINT('',(132.42991054761,102.18666633037)); +#38 = CARTESIAN_POINT('',(132.42991054761,231.16639046259)); +#39 = CARTESIAN_POINT('',(20.730192876013,166.67652839648)); +#40 = CARTESIAN_POINT('',(-90.96952479559,102.18666633037)); +#41 = CARTESIAN_POINT('',(20.730192876013,37.696804264271)); +#42 = CARTESIAN_POINT('',(132.42991054761,-26.79305780183)); +#43 = CARTESIAN_POINT('',(132.42991054761,102.18666633037)); +#44 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#45 = PCURVE('',#46,#51); +#46 = CYLINDRICAL_SURFACE('',#47,74.466478447737); +#47 = AXIS2_PLACEMENT_3D('',#48,#49,#50); +#48 = CARTESIAN_POINT('',(57.963432099881,102.18666633037, + -19.99999955296)); +#49 = DIRECTION('',(0.,0.,1.)); +#50 = DIRECTION('',(1.,0.,0.)); +#51 = DEFINITIONAL_REPRESENTATION('',(#52),#55); +#52 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#53,#54),.UNSPECIFIED.,.F.,.F.,(2, + 2),(4.788278205588,5.209840138517),.PIECEWISE_BEZIER_KNOTS.); +#53 = CARTESIAN_POINT('',(4.788278205588,0.)); +#54 = CARTESIAN_POINT('',(5.209840138517,0.)); +#55 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#56 = ORIENTED_EDGE('',*,*,#57,.T.); +#57 = EDGE_CURVE('',#21,#58,#60,.T.); +#58 = VERTEX_POINT('',#59); +#59 = CARTESIAN_POINT('',(93.497879803181,-41.78636148572, + -19.99999955296)); +#60 = SURFACE_CURVE('',#61,(#66,#77),.PCURVE_S2.); +#61 = CIRCLE('',#62,44.68116165083); +#62 = AXIS2_PLACEMENT_3D('',#63,#64,#65); +#63 = CARTESIAN_POINT('',(114.81915663942,-2.52048112452,-19.99999955296 + )); +#64 = DIRECTION('',(0.,0.,-1.)); +#65 = DIRECTION('',(1.,0.,0.)); +#66 = PCURVE('',#30,#67); +#67 = DEFINITIONAL_REPRESENTATION('',(#68),#76); +#68 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#69,#70,#71,#72,#73,#74,#75), +.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#69 = CARTESIAN_POINT('',(159.50031829025,-2.52048112452)); +#70 = CARTESIAN_POINT('',(159.50031829025,-79.91052324495)); +#71 = CARTESIAN_POINT('',(92.478575814005,-41.21550218473)); +#72 = CARTESIAN_POINT('',(25.45683333776,-2.52048112452)); +#73 = CARTESIAN_POINT('',(92.478575814005,36.174539935697)); +#74 = CARTESIAN_POINT('',(159.50031829025,74.869560995915)); +#75 = CARTESIAN_POINT('',(159.50031829025,-2.52048112452)); +#76 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#77 = PCURVE('',#78,#83); +#78 = CYLINDRICAL_SURFACE('',#79,44.68116165083); +#79 = AXIS2_PLACEMENT_3D('',#80,#81,#82); +#80 = CARTESIAN_POINT('',(114.81915663942,-2.52048112452,-19.99999955296 + )); +#81 = DIRECTION('',(0.,0.,-1.)); +#82 = DIRECTION('',(1.,0.,0.)); +#83 = DEFINITIONAL_REPRESENTATION('',(#84),#87); +#84 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#85,#86),.UNSPECIFIED.,.F.,.F.,(2, + 2),(4.214937822253,8.351432792106),.PIECEWISE_BEZIER_KNOTS.); +#85 = CARTESIAN_POINT('',(4.214937822253,0.)); +#86 = CARTESIAN_POINT('',(8.351432792106,0.)); +#87 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#88 = ORIENTED_EDGE('',*,*,#89,.T.); +#89 = EDGE_CURVE('',#58,#90,#92,.T.); +#90 = VERTEX_POINT('',#91); +#91 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + -19.99999955296)); +#92 = SURFACE_CURVE('',#93,(#98,#109),.PCURVE_S2.); +#93 = CIRCLE('',#94,84.24770250966); +#94 = AXIS2_PLACEMENT_3D('',#95,#96,#97); +#95 = CARTESIAN_POINT('',(53.295957524102,-115.8233848133, + -19.99999955296)); +#96 = DIRECTION('',(0.,0.,1.)); +#97 = DIRECTION('',(1.,0.,0.)); +#98 = PCURVE('',#30,#99); +#99 = DEFINITIONAL_REPRESENTATION('',(#100),#108); +#100 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#101,#102,#103,#104,#105,#106 +,#107),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#101 = CARTESIAN_POINT('',(137.54366003376,-115.8233848133)); +#102 = CARTESIAN_POINT('',(137.54366003376,30.097916354281)); +#103 = CARTESIAN_POINT('',(11.172106269272,-42.86273422955)); +#104 = CARTESIAN_POINT('',(-115.1994474952,-115.8233848133)); +#105 = CARTESIAN_POINT('',(11.172106269272,-188.7840353972)); +#106 = CARTESIAN_POINT('',(137.54366003376,-261.744685981)); +#107 = CARTESIAN_POINT('',(137.54366003376,-115.8233848133)); +#108 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#109 = PCURVE('',#110,#115); +#110 = CYLINDRICAL_SURFACE('',#111,84.24770250966); +#111 = AXIS2_PLACEMENT_3D('',#112,#113,#114); +#112 = CARTESIAN_POINT('',(53.295957524102,-115.8233848133, + -19.99999955296)); +#113 = DIRECTION('',(0.,0.,1.)); +#114 = DIRECTION('',(1.,0.,0.)); +#115 = DEFINITIONAL_REPRESENTATION('',(#116),#119); +#116 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#117,#118),.UNSPECIFIED.,.F.,.F., + (2,2),(1.073345168663,1.501387093594),.PIECEWISE_BEZIER_KNOTS.); +#117 = CARTESIAN_POINT('',(1.073345168663,0.)); +#118 = CARTESIAN_POINT('',(1.501387093594,0.)); +#119 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#120 = ORIENTED_EDGE('',*,*,#121,.T.); +#121 = EDGE_CURVE('',#90,#122,#124,.T.); +#122 = VERTEX_POINT('',#123); +#123 = CARTESIAN_POINT('',(-72.42252677679,-22.63227291405, + -19.99999955296)); +#124 = SURFACE_CURVE('',#125,(#129,#136),.PCURVE_S2.); +#125 = LINE('',#126,#127); +#126 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + -19.99999955296)); +#127 = VECTOR('',#128,1.); +#128 = DIRECTION('',(-0.997592146088,6.935351515554E-02,0.)); +#129 = PCURVE('',#30,#130); +#130 = DEFINITIONAL_REPRESENTATION('',(#131),#135); +#131 = LINE('',#132,#133); +#132 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384)); +#133 = VECTOR('',#134,1.); +#134 = DIRECTION('',(-0.997592146088,6.935351515554E-02)); +#135 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#136 = PCURVE('',#137,#142); +#137 = PLANE('',#138); +#138 = AXIS2_PLACEMENT_3D('',#139,#140,#141); +#139 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + -19.99999955296)); +#140 = DIRECTION('',(-6.935351515554E-02,-0.997592146088,0.)); +#141 = DIRECTION('',(-0.997592146088,6.935351515554E-02,0.)); +#142 = DEFINITIONAL_REPRESENTATION('',(#143),#147); +#143 = LINE('',#144,#145); +#144 = CARTESIAN_POINT('',(0.,-3.552713678801E-14)); +#145 = VECTOR('',#146,1.); +#146 = DIRECTION('',(1.,0.)); +#147 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#148 = ORIENTED_EDGE('',*,*,#149,.T.); +#149 = EDGE_CURVE('',#122,#150,#152,.T.); +#150 = VERTEX_POINT('',#151); +#151 = CARTESIAN_POINT('',(-88.51642906665,-27.22925320267, + -19.99999955296)); +#152 = SURFACE_CURVE('',#153,(#158,#169),.PCURVE_S2.); +#153 = CIRCLE('',#154,24.565238684828); +#154 = AXIS2_PLACEMENT_3D('',#155,#156,#157); +#155 = CARTESIAN_POINT('',(-74.12621243021,-47.1383620928, + -19.99999955296)); +#156 = DIRECTION('',(0.,0.,1.)); +#157 = DIRECTION('',(1.,0.,0.)); +#158 = PCURVE('',#30,#159); +#159 = DEFINITIONAL_REPRESENTATION('',(#160),#168); +#160 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#161,#162,#163,#164,#165,#166 +,#167),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#161 = CARTESIAN_POINT('',(-49.56097374539,-47.1383620928)); +#162 = CARTESIAN_POINT('',(-49.56097374539,-4.590120590624)); +#163 = CARTESIAN_POINT('',(-86.40883177263,-25.86424134171)); +#164 = CARTESIAN_POINT('',(-123.2566897998,-47.1383620928)); +#165 = CARTESIAN_POINT('',(-86.40883177263,-68.41248284389)); +#166 = CARTESIAN_POINT('',(-49.56097374539,-89.68660359498)); +#167 = CARTESIAN_POINT('',(-49.56097374539,-47.1383620928)); +#168 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#169 = PCURVE('',#170,#175); +#170 = CYLINDRICAL_SURFACE('',#171,24.565238684828); +#171 = AXIS2_PLACEMENT_3D('',#172,#173,#174); +#172 = CARTESIAN_POINT('',(-74.12621243021,-47.1383620928, + -19.99999955296)); +#173 = DIRECTION('',(0.,0.,1.)); +#174 = DIRECTION('',(1.,0.,0.)); +#175 = DEFINITIONAL_REPRESENTATION('',(#176),#179); +#176 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#177,#178),.UNSPECIFIED.,.F.,.F., + (2,2),(1.501387093594,2.196658099744),.PIECEWISE_BEZIER_KNOTS.); +#177 = CARTESIAN_POINT('',(1.501387093594,0.)); +#178 = CARTESIAN_POINT('',(2.196658099744,0.)); +#179 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#180 = ORIENTED_EDGE('',*,*,#181,.T.); +#181 = EDGE_CURVE('',#150,#182,#184,.T.); +#182 = VERTEX_POINT('',#183); +#183 = CARTESIAN_POINT('',(-88.51642906665,21.039046347141, + -19.99999955296)); +#184 = SURFACE_CURVE('',#185,(#190,#201),.PCURVE_S2.); +#185 = CIRCLE('',#186,29.778387016109); +#186 = AXIS2_PLACEMENT_3D('',#187,#188,#189); +#187 = CARTESIAN_POINT('',(-105.9604867346,-3.095103427768, + -19.99999955296)); +#188 = DIRECTION('',(0.,0.,-1.)); +#189 = DIRECTION('',(1.,0.,0.)); +#190 = PCURVE('',#30,#191); +#191 = DEFINITIONAL_REPRESENTATION('',(#192),#200); +#192 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#193,#194,#195,#196,#197,#198 +,#199),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#193 = CARTESIAN_POINT('',(-76.18209971851,-3.095103427768)); +#194 = CARTESIAN_POINT('',(-76.18209971851,-54.67278270711)); +#195 = CARTESIAN_POINT('',(-120.8496802426,-28.88394306744)); +#196 = CARTESIAN_POINT('',(-165.5172607668,-3.095103427768)); +#197 = CARTESIAN_POINT('',(-120.8496802426,22.693736211908)); +#198 = CARTESIAN_POINT('',(-76.18209971851,48.482575851583)); +#199 = CARTESIAN_POINT('',(-76.18209971851,-3.095103427768)); +#200 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#201 = PCURVE('',#202,#207); +#202 = CYLINDRICAL_SURFACE('',#203,29.778387016109); +#203 = AXIS2_PLACEMENT_3D('',#204,#205,#206); +#204 = CARTESIAN_POINT('',(-105.9604867346,-3.095103427768, + -19.99999955296)); +#205 = DIRECTION('',(0.,0.,-1.)); +#206 = DIRECTION('',(1.,0.,0.)); +#207 = DEFINITIONAL_REPRESENTATION('',(#208),#211); +#208 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#209,#210),.UNSPECIFIED.,.F.,.F., + (2,2),(0.944934553846,5.338250753333),.PIECEWISE_BEZIER_KNOTS.); +#209 = CARTESIAN_POINT('',(0.944934553846,0.)); +#210 = CARTESIAN_POINT('',(5.338250753333,0.)); +#211 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#212 = ORIENTED_EDGE('',*,*,#213,.T.); +#213 = EDGE_CURVE('',#182,#214,#216,.T.); +#214 = VERTEX_POINT('',#215); +#215 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + -19.99999955296)); +#216 = SURFACE_CURVE('',#217,(#222,#233),.PCURVE_S2.); +#217 = CIRCLE('',#218,20.41914254867); +#218 = AXIS2_PLACEMENT_3D('',#219,#220,#221); +#219 = CARTESIAN_POINT('',(-76.55497863763,37.587915977932, + -19.99999955296)); +#220 = DIRECTION('',(0.,0.,1.)); +#221 = DIRECTION('',(1.,0.,0.)); +#222 = PCURVE('',#30,#223); +#223 = DEFINITIONAL_REPRESENTATION('',(#224),#232); +#224 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#225,#226,#227,#228,#229,#230 +,#231),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#225 = CARTESIAN_POINT('',(-56.13583608896,37.587915977932)); +#226 = CARTESIAN_POINT('',(-56.13583608896,72.954908319219)); +#227 = CARTESIAN_POINT('',(-86.76454991196,55.271412148575)); +#228 = CARTESIAN_POINT('',(-117.3932637349,37.587915977932)); +#229 = CARTESIAN_POINT('',(-86.76454991196,19.904419807288)); +#230 = CARTESIAN_POINT('',(-56.13583608896,2.220923636644)); +#231 = CARTESIAN_POINT('',(-56.13583608896,37.587915977932)); +#232 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#233 = PCURVE('',#234,#239); +#234 = CYLINDRICAL_SURFACE('',#235,20.41914254867); +#235 = AXIS2_PLACEMENT_3D('',#236,#237,#238); +#236 = CARTESIAN_POINT('',(-76.55497863763,37.587915977932, + -19.99999955296)); +#237 = DIRECTION('',(0.,0.,1.)); +#238 = DIRECTION('',(1.,0.,0.)); +#239 = DEFINITIONAL_REPRESENTATION('',(#240),#243); +#240 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#241,#242),.UNSPECIFIED.,.F.,.F., + (2,2),(4.086527207436,4.916177873213),.PIECEWISE_BEZIER_KNOTS.); +#241 = CARTESIAN_POINT('',(4.086527207436,0.)); +#242 = CARTESIAN_POINT('',(4.916177873213,0.)); +#243 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#244 = ORIENTED_EDGE('',*,*,#245,.T.); +#245 = EDGE_CURVE('',#214,#19,#246,.T.); +#246 = SURFACE_CURVE('',#247,(#251,#258),.PCURVE_S2.); +#247 = LINE('',#248,#249); +#248 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + -19.99999955296)); +#249 = VECTOR('',#250,1.); +#250 = DIRECTION('',(0.997121794488,7.581640296081E-02,0.)); +#251 = PCURVE('',#30,#252); +#252 = DEFINITIONAL_REPRESENTATION('',(#253),#257); +#253 = LINE('',#254,#255); +#254 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011)); +#255 = VECTOR('',#256,1.); +#256 = DIRECTION('',(0.997121794488,7.581640296081E-02)); +#257 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#258 = PCURVE('',#259,#264); +#259 = PLANE('',#260); +#260 = AXIS2_PLACEMENT_3D('',#261,#262,#263); +#261 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + -19.99999955296)); +#262 = DIRECTION('',(-7.581640296081E-02,0.997121794488,0.)); +#263 = DIRECTION('',(0.997121794488,7.581640296081E-02,0.)); +#264 = DEFINITIONAL_REPRESENTATION('',(#265),#269); +#265 = LINE('',#266,#267); +#266 = CARTESIAN_POINT('',(0.,-3.552713678801E-14)); +#267 = VECTOR('',#268,1.); +#268 = DIRECTION('',(1.,0.)); +#269 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#270 = FACE_BOUND('',#271,.F.); +#271 = EDGE_LOOP('',(#272)); +#272 = ORIENTED_EDGE('',*,*,#273,.T.); +#273 = EDGE_CURVE('',#274,#274,#276,.T.); +#274 = VERTEX_POINT('',#275); +#275 = CARTESIAN_POINT('',(-91.4143372247,-2.809300087392, + -19.99999955296)); +#276 = SURFACE_CURVE('',#277,(#282,#293),.PCURVE_S2.); +#277 = CIRCLE('',#278,15.057678156153); +#278 = AXIS2_PLACEMENT_3D('',#279,#280,#281); +#279 = CARTESIAN_POINT('',(-106.4720153808,-2.809300087392, + -19.99999955296)); +#280 = DIRECTION('',(0.,0.,-1.)); +#281 = DIRECTION('',(0.,1.,0.)); +#282 = PCURVE('',#30,#283); +#283 = DEFINITIONAL_REPRESENTATION('',(#284),#292); +#284 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#285,#286,#287,#288,#289,#290 +,#291),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#285 = CARTESIAN_POINT('',(-106.4720153808,12.24837806876)); +#286 = CARTESIAN_POINT('',(-80.39135177038,12.24837806876)); +#287 = CARTESIAN_POINT('',(-93.43168357562,-10.33813916546)); +#288 = CARTESIAN_POINT('',(-106.4720153808,-32.92465639969)); +#289 = CARTESIAN_POINT('',(-119.512347186,-10.33813916546)); +#290 = CARTESIAN_POINT('',(-132.5526789913,12.24837806876)); +#291 = CARTESIAN_POINT('',(-106.4720153808,12.24837806876)); +#292 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#293 = PCURVE('',#294,#299); +#294 = CYLINDRICAL_SURFACE('',#295,15.057678156153); +#295 = AXIS2_PLACEMENT_3D('',#296,#297,#298); +#296 = CARTESIAN_POINT('',(-106.4720153808,-2.809300087392, + -40.00019910593)); +#297 = DIRECTION('',(0.,0.,1.)); +#298 = DIRECTION('',(1.,0.,0.)); +#299 = DEFINITIONAL_REPRESENTATION('',(#300),#303); +#300 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#301,#302),.UNSPECIFIED.,.F.,.F., + (2,2),(1.570796326795,7.853981633974),.PIECEWISE_BEZIER_KNOTS.); +#301 = CARTESIAN_POINT('',(6.28318530718,20.000199552965)); +#302 = CARTESIAN_POINT('',(0.,20.000199552965)); +#303 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#304 = FACE_BOUND('',#305,.F.); +#305 = EDGE_LOOP('',(#306)); +#306 = ORIENTED_EDGE('',*,*,#307,.T.); +#307 = EDGE_CURVE('',#308,#308,#310,.T.); +#308 = VERTEX_POINT('',#309); +#309 = CARTESIAN_POINT('',(141.97662545896,-4.606760106981, + -19.99999955296)); +#310 = SURFACE_CURVE('',#311,(#316,#327),.PCURVE_S2.); +#311 = CIRCLE('',#312,23.40416683412); +#312 = AXIS2_PLACEMENT_3D('',#313,#314,#315); +#313 = CARTESIAN_POINT('',(118.57245862484,-4.606760106981, + -19.99999955296)); +#314 = DIRECTION('',(0.,0.,-1.)); +#315 = DIRECTION('',(0.,1.,0.)); +#316 = PCURVE('',#30,#317); +#317 = DEFINITIONAL_REPRESENTATION('',(#318),#326); +#318 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#319,#320,#321,#322,#323,#324 +,#325),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#319 = CARTESIAN_POINT('',(118.57245862484,18.797406727139)); +#320 = CARTESIAN_POINT('',(159.10966469035,18.797406727139)); +#321 = CARTESIAN_POINT('',(138.84106165759,-16.30884352404)); +#322 = CARTESIAN_POINT('',(118.57245862484,-51.41509377522)); +#323 = CARTESIAN_POINT('',(98.303855592083,-16.30884352404)); +#324 = CARTESIAN_POINT('',(78.035252559326,18.797406727139)); +#325 = CARTESIAN_POINT('',(118.57245862484,18.797406727139)); +#326 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#327 = PCURVE('',#328,#333); +#328 = CYLINDRICAL_SURFACE('',#329,23.40416683412); +#329 = AXIS2_PLACEMENT_3D('',#330,#331,#332); +#330 = CARTESIAN_POINT('',(118.57245862484,-4.606760106981, + -40.00019910593)); +#331 = DIRECTION('',(0.,0.,1.)); +#332 = DIRECTION('',(1.,0.,0.)); +#333 = DEFINITIONAL_REPRESENTATION('',(#334),#337); +#334 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#335,#336),.UNSPECIFIED.,.F.,.F., + (2,2),(1.570796326795,7.853981633974),.PIECEWISE_BEZIER_KNOTS.); +#335 = CARTESIAN_POINT('',(6.28318530718,20.000199552965)); +#336 = CARTESIAN_POINT('',(0.,20.000199552965)); +#337 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#338 = ADVANCED_FACE('',(#339),#46,.F.); +#339 = FACE_BOUND('',#340,.T.); +#340 = EDGE_LOOP('',(#341,#363,#395,#414)); +#341 = ORIENTED_EDGE('',*,*,#342,.T.); +#342 = EDGE_CURVE('',#19,#343,#345,.T.); +#343 = VERTEX_POINT('',#344); +#344 = CARTESIAN_POINT('',(63.609212636948,27.934517711401, + 19.999999552965)); +#345 = SURFACE_CURVE('',#346,(#350,#356),.PCURVE_S2.); +#346 = LINE('',#347,#348); +#347 = CARTESIAN_POINT('',(63.609212636948,27.934517711401, + -19.99999955296)); +#348 = VECTOR('',#349,1.); +#349 = DIRECTION('',(0.,0.,1.)); +#350 = PCURVE('',#46,#351); +#351 = DEFINITIONAL_REPRESENTATION('',(#352),#355); +#352 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#353,#354),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#353 = CARTESIAN_POINT('',(4.788278205588,0.)); +#354 = CARTESIAN_POINT('',(4.788278205588,39.99999910593)); +#355 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#356 = PCURVE('',#259,#357); +#357 = DEFINITIONAL_REPRESENTATION('',(#358),#362); +#358 = LINE('',#359,#360); +#359 = CARTESIAN_POINT('',(136.42439686482,0.)); +#360 = VECTOR('',#361,1.); +#361 = DIRECTION('',(0.,-1.)); +#362 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#363 = ORIENTED_EDGE('',*,*,#364,.T.); +#364 = EDGE_CURVE('',#343,#365,#367,.T.); +#365 = VERTEX_POINT('',#366); +#366 = CARTESIAN_POINT('',(93.497879803181,36.745399236679, + 19.999999552965)); +#367 = SURFACE_CURVE('',#368,(#373,#379),.PCURVE_S2.); +#368 = CIRCLE('',#369,74.466478447737); +#369 = AXIS2_PLACEMENT_3D('',#370,#371,#372); +#370 = CARTESIAN_POINT('',(57.963432099881,102.18666633037, + 19.999999552965)); +#371 = DIRECTION('',(0.,0.,1.)); +#372 = DIRECTION('',(1.,0.,0.)); +#373 = PCURVE('',#46,#374); +#374 = DEFINITIONAL_REPRESENTATION('',(#375),#378); +#375 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#376,#377),.UNSPECIFIED.,.F.,.F., + (2,2),(4.788278205588,5.209840138517),.PIECEWISE_BEZIER_KNOTS.); +#376 = CARTESIAN_POINT('',(4.788278205588,39.99999910593)); +#377 = CARTESIAN_POINT('',(5.209840138517,39.99999910593)); +#378 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#379 = PCURVE('',#380,#385); +#380 = PLANE('',#381); +#381 = AXIS2_PLACEMENT_3D('',#382,#383,#384); +#382 = CARTESIAN_POINT('',(0.,0.,19.999999552965)); +#383 = DIRECTION('',(0.,0.,1.)); +#384 = DIRECTION('',(1.,0.,0.)); +#385 = DEFINITIONAL_REPRESENTATION('',(#386),#394); +#386 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#387,#388,#389,#390,#391,#392 +,#393),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#387 = CARTESIAN_POINT('',(132.42991054761,102.18666633037)); +#388 = CARTESIAN_POINT('',(132.42991054761,231.16639046259)); +#389 = CARTESIAN_POINT('',(20.730192876013,166.67652839648)); +#390 = CARTESIAN_POINT('',(-90.96952479559,102.18666633037)); +#391 = CARTESIAN_POINT('',(20.730192876013,37.696804264271)); +#392 = CARTESIAN_POINT('',(132.42991054761,-26.79305780183)); +#393 = CARTESIAN_POINT('',(132.42991054761,102.18666633037)); +#394 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#395 = ORIENTED_EDGE('',*,*,#396,.F.); +#396 = EDGE_CURVE('',#21,#365,#397,.T.); +#397 = SURFACE_CURVE('',#398,(#402,#408),.PCURVE_S2.); +#398 = LINE('',#399,#400); +#399 = CARTESIAN_POINT('',(93.497879803181,36.745399236679, + -19.99999955296)); +#400 = VECTOR('',#401,1.); +#401 = DIRECTION('',(0.,0.,1.)); +#402 = PCURVE('',#46,#403); +#403 = DEFINITIONAL_REPRESENTATION('',(#404),#407); +#404 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#405,#406),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#405 = CARTESIAN_POINT('',(5.209840138517,0.)); +#406 = CARTESIAN_POINT('',(5.209840138517,39.99999910593)); +#407 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#408 = PCURVE('',#78,#409); +#409 = DEFINITIONAL_REPRESENTATION('',(#410),#413); +#410 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#411,#412),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#411 = CARTESIAN_POINT('',(4.214937822253,0.)); +#412 = CARTESIAN_POINT('',(4.214937822253,-39.99999910593)); +#413 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#414 = ORIENTED_EDGE('',*,*,#18,.F.); +#415 = ADVANCED_FACE('',(#416),#78,.T.); +#416 = FACE_BOUND('',#417,.T.); +#417 = EDGE_LOOP('',(#418,#419,#446,#465)); +#418 = ORIENTED_EDGE('',*,*,#396,.T.); +#419 = ORIENTED_EDGE('',*,*,#420,.T.); +#420 = EDGE_CURVE('',#365,#421,#423,.T.); +#421 = VERTEX_POINT('',#422); +#422 = CARTESIAN_POINT('',(93.497879803181,-41.78636148572, + 19.999999552965)); +#423 = SURFACE_CURVE('',#424,(#429,#435),.PCURVE_S2.); +#424 = CIRCLE('',#425,44.68116165083); +#425 = AXIS2_PLACEMENT_3D('',#426,#427,#428); +#426 = CARTESIAN_POINT('',(114.81915663942,-2.52048112452, + 19.999999552965)); +#427 = DIRECTION('',(0.,0.,-1.)); +#428 = DIRECTION('',(1.,0.,0.)); +#429 = PCURVE('',#78,#430); +#430 = DEFINITIONAL_REPRESENTATION('',(#431),#434); +#431 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#432,#433),.UNSPECIFIED.,.F.,.F., + (2,2),(4.214937822253,8.351432792106),.PIECEWISE_BEZIER_KNOTS.); +#432 = CARTESIAN_POINT('',(4.214937822253,-39.99999910593)); +#433 = CARTESIAN_POINT('',(8.351432792106,-39.99999910593)); +#434 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#435 = PCURVE('',#380,#436); +#436 = DEFINITIONAL_REPRESENTATION('',(#437),#445); +#437 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#438,#439,#440,#441,#442,#443 +,#444),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#438 = CARTESIAN_POINT('',(159.50031829025,-2.52048112452)); +#439 = CARTESIAN_POINT('',(159.50031829025,-79.91052324495)); +#440 = CARTESIAN_POINT('',(92.478575814005,-41.21550218473)); +#441 = CARTESIAN_POINT('',(25.45683333776,-2.52048112452)); +#442 = CARTESIAN_POINT('',(92.478575814005,36.174539935697)); +#443 = CARTESIAN_POINT('',(159.50031829025,74.869560995915)); +#444 = CARTESIAN_POINT('',(159.50031829025,-2.52048112452)); +#445 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#446 = ORIENTED_EDGE('',*,*,#447,.F.); +#447 = EDGE_CURVE('',#58,#421,#448,.T.); +#448 = SURFACE_CURVE('',#449,(#453,#459),.PCURVE_S2.); +#449 = LINE('',#450,#451); +#450 = CARTESIAN_POINT('',(93.497879803181,-41.78636148572, + -19.99999955296)); +#451 = VECTOR('',#452,1.); +#452 = DIRECTION('',(0.,0.,1.)); +#453 = PCURVE('',#78,#454); +#454 = DEFINITIONAL_REPRESENTATION('',(#455),#458); +#455 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#456,#457),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#456 = CARTESIAN_POINT('',(8.351432792106,0.)); +#457 = CARTESIAN_POINT('',(8.351432792106,-39.99999910593)); +#458 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#459 = PCURVE('',#110,#460); +#460 = DEFINITIONAL_REPRESENTATION('',(#461),#464); +#461 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#462,#463),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#462 = CARTESIAN_POINT('',(1.073345168663,0.)); +#463 = CARTESIAN_POINT('',(1.073345168663,39.99999910593)); +#464 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#465 = ORIENTED_EDGE('',*,*,#57,.F.); +#466 = ADVANCED_FACE('',(#467),#110,.F.); +#467 = FACE_BOUND('',#468,.T.); +#468 = EDGE_LOOP('',(#469,#470,#497,#517)); +#469 = ORIENTED_EDGE('',*,*,#447,.T.); +#470 = ORIENTED_EDGE('',*,*,#471,.T.); +#471 = EDGE_CURVE('',#421,#472,#474,.T.); +#472 = VERTEX_POINT('',#473); +#473 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + 19.999999552965)); +#474 = SURFACE_CURVE('',#475,(#480,#486),.PCURVE_S2.); +#475 = CIRCLE('',#476,84.24770250966); +#476 = AXIS2_PLACEMENT_3D('',#477,#478,#479); +#477 = CARTESIAN_POINT('',(53.295957524102,-115.8233848133, + 19.999999552965)); +#478 = DIRECTION('',(0.,0.,1.)); +#479 = DIRECTION('',(1.,0.,0.)); +#480 = PCURVE('',#110,#481); +#481 = DEFINITIONAL_REPRESENTATION('',(#482),#485); +#482 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#483,#484),.UNSPECIFIED.,.F.,.F., + (2,2),(1.073345168663,1.501387093594),.PIECEWISE_BEZIER_KNOTS.); +#483 = CARTESIAN_POINT('',(1.073345168663,39.99999910593)); +#484 = CARTESIAN_POINT('',(1.501387093594,39.99999910593)); +#485 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#486 = PCURVE('',#380,#487); +#487 = DEFINITIONAL_REPRESENTATION('',(#488),#496); +#488 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#489,#490,#491,#492,#493,#494 +,#495),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#489 = CARTESIAN_POINT('',(137.54366003376,-115.8233848133)); +#490 = CARTESIAN_POINT('',(137.54366003376,30.097916354281)); +#491 = CARTESIAN_POINT('',(11.172106269272,-42.86273422955)); +#492 = CARTESIAN_POINT('',(-115.1994474952,-115.8233848133)); +#493 = CARTESIAN_POINT('',(11.172106269272,-188.7840353972)); +#494 = CARTESIAN_POINT('',(137.54366003376,-261.744685981)); +#495 = CARTESIAN_POINT('',(137.54366003376,-115.8233848133)); +#496 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#497 = ORIENTED_EDGE('',*,*,#498,.F.); +#498 = EDGE_CURVE('',#90,#472,#499,.T.); +#499 = SURFACE_CURVE('',#500,(#504,#510),.PCURVE_S2.); +#500 = LINE('',#501,#502); +#501 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + -19.99999955296)); +#502 = VECTOR('',#503,1.); +#503 = DIRECTION('',(0.,0.,1.)); +#504 = PCURVE('',#110,#505); +#505 = DEFINITIONAL_REPRESENTATION('',(#506),#509); +#506 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#507,#508),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#507 = CARTESIAN_POINT('',(1.501387093594,0.)); +#508 = CARTESIAN_POINT('',(1.501387093594,39.99999910593)); +#509 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#510 = PCURVE('',#137,#511); +#511 = DEFINITIONAL_REPRESENTATION('',(#512),#516); +#512 = LINE('',#513,#514); +#513 = CARTESIAN_POINT('',(0.,0.)); +#514 = VECTOR('',#515,1.); +#515 = DIRECTION('',(0.,-1.)); +#516 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#517 = ORIENTED_EDGE('',*,*,#89,.F.); +#518 = ADVANCED_FACE('',(#519),#137,.T.); +#519 = FACE_BOUND('',#520,.T.); +#520 = EDGE_LOOP('',(#521,#522,#545,#565)); +#521 = ORIENTED_EDGE('',*,*,#498,.T.); +#522 = ORIENTED_EDGE('',*,*,#523,.T.); +#523 = EDGE_CURVE('',#472,#524,#526,.T.); +#524 = VERTEX_POINT('',#525); +#525 = CARTESIAN_POINT('',(-72.42252677679,-22.63227291405, + 19.999999552965)); +#526 = SURFACE_CURVE('',#527,(#531,#538),.PCURVE_S2.); +#527 = LINE('',#528,#529); +#528 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384, + 19.999999552965)); +#529 = VECTOR('',#530,1.); +#530 = DIRECTION('',(-0.997592146088,6.935351515554E-02,0.)); +#531 = PCURVE('',#137,#532); +#532 = DEFINITIONAL_REPRESENTATION('',(#533),#537); +#533 = LINE('',#534,#535); +#534 = CARTESIAN_POINT('',(0.,-39.99999910593)); +#535 = VECTOR('',#536,1.); +#536 = DIRECTION('',(1.,0.)); +#537 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#538 = PCURVE('',#380,#539); +#539 = DEFINITIONAL_REPRESENTATION('',(#540),#544); +#540 = LINE('',#541,#542); +#541 = CARTESIAN_POINT('',(59.138831836925,-31.77853846384)); +#542 = VECTOR('',#543,1.); +#543 = DIRECTION('',(-0.997592146088,6.935351515554E-02)); +#544 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#545 = ORIENTED_EDGE('',*,*,#546,.F.); +#546 = EDGE_CURVE('',#122,#524,#547,.T.); +#547 = SURFACE_CURVE('',#548,(#552,#559),.PCURVE_S2.); +#548 = LINE('',#549,#550); +#549 = CARTESIAN_POINT('',(-72.42252677679,-22.63227291405, + -19.99999955296)); +#550 = VECTOR('',#551,1.); +#551 = DIRECTION('',(0.,0.,1.)); +#552 = PCURVE('',#137,#553); +#553 = DEFINITIONAL_REPRESENTATION('',(#554),#558); +#554 = LINE('',#555,#556); +#555 = CARTESIAN_POINT('',(131.87890374807,0.)); +#556 = VECTOR('',#557,1.); +#557 = DIRECTION('',(0.,-1.)); +#558 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#559 = PCURVE('',#170,#560); +#560 = DEFINITIONAL_REPRESENTATION('',(#561),#564); +#561 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#562,#563),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#562 = CARTESIAN_POINT('',(1.501387093594,0.)); +#563 = CARTESIAN_POINT('',(1.501387093594,39.99999910593)); +#564 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#565 = ORIENTED_EDGE('',*,*,#121,.F.); +#566 = ADVANCED_FACE('',(#567),#170,.F.); +#567 = FACE_BOUND('',#568,.T.); +#568 = EDGE_LOOP('',(#569,#570,#597,#616)); +#569 = ORIENTED_EDGE('',*,*,#546,.T.); +#570 = ORIENTED_EDGE('',*,*,#571,.T.); +#571 = EDGE_CURVE('',#524,#572,#574,.T.); +#572 = VERTEX_POINT('',#573); +#573 = CARTESIAN_POINT('',(-88.51642906665,-27.22925320267, + 19.999999552965)); +#574 = SURFACE_CURVE('',#575,(#580,#586),.PCURVE_S2.); +#575 = CIRCLE('',#576,24.565238684828); +#576 = AXIS2_PLACEMENT_3D('',#577,#578,#579); +#577 = CARTESIAN_POINT('',(-74.12621243021,-47.1383620928, + 19.999999552965)); +#578 = DIRECTION('',(0.,0.,1.)); +#579 = DIRECTION('',(1.,0.,0.)); +#580 = PCURVE('',#170,#581); +#581 = DEFINITIONAL_REPRESENTATION('',(#582),#585); +#582 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#583,#584),.UNSPECIFIED.,.F.,.F., + (2,2),(1.501387093594,2.196658099744),.PIECEWISE_BEZIER_KNOTS.); +#583 = CARTESIAN_POINT('',(1.501387093594,39.99999910593)); +#584 = CARTESIAN_POINT('',(2.196658099744,39.99999910593)); +#585 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#586 = PCURVE('',#380,#587); +#587 = DEFINITIONAL_REPRESENTATION('',(#588),#596); +#588 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#589,#590,#591,#592,#593,#594 +,#595),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#589 = CARTESIAN_POINT('',(-49.56097374539,-47.1383620928)); +#590 = CARTESIAN_POINT('',(-49.56097374539,-4.590120590624)); +#591 = CARTESIAN_POINT('',(-86.40883177263,-25.86424134171)); +#592 = CARTESIAN_POINT('',(-123.2566897998,-47.1383620928)); +#593 = CARTESIAN_POINT('',(-86.40883177263,-68.41248284389)); +#594 = CARTESIAN_POINT('',(-49.56097374539,-89.68660359498)); +#595 = CARTESIAN_POINT('',(-49.56097374539,-47.1383620928)); +#596 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#597 = ORIENTED_EDGE('',*,*,#598,.F.); +#598 = EDGE_CURVE('',#150,#572,#599,.T.); +#599 = SURFACE_CURVE('',#600,(#604,#610),.PCURVE_S2.); +#600 = LINE('',#601,#602); +#601 = CARTESIAN_POINT('',(-88.51642906665,-27.22925320267, + -19.99999955296)); +#602 = VECTOR('',#603,1.); +#603 = DIRECTION('',(0.,0.,1.)); +#604 = PCURVE('',#170,#605); +#605 = DEFINITIONAL_REPRESENTATION('',(#606),#609); +#606 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#607,#608),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#607 = CARTESIAN_POINT('',(2.196658099744,0.)); +#608 = CARTESIAN_POINT('',(2.196658099744,39.99999910593)); +#609 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#610 = PCURVE('',#202,#611); +#611 = DEFINITIONAL_REPRESENTATION('',(#612),#615); +#612 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#613,#614),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#613 = CARTESIAN_POINT('',(0.944934553846,0.)); +#614 = CARTESIAN_POINT('',(0.944934553846,-39.99999910593)); +#615 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#616 = ORIENTED_EDGE('',*,*,#149,.F.); +#617 = ADVANCED_FACE('',(#618),#202,.T.); +#618 = FACE_BOUND('',#619,.T.); +#619 = EDGE_LOOP('',(#620,#621,#648,#667)); +#620 = ORIENTED_EDGE('',*,*,#598,.T.); +#621 = ORIENTED_EDGE('',*,*,#622,.T.); +#622 = EDGE_CURVE('',#572,#623,#625,.T.); +#623 = VERTEX_POINT('',#624); +#624 = CARTESIAN_POINT('',(-88.51642906665,21.039046347141, + 19.999999552965)); +#625 = SURFACE_CURVE('',#626,(#631,#637),.PCURVE_S2.); +#626 = CIRCLE('',#627,29.778387016109); +#627 = AXIS2_PLACEMENT_3D('',#628,#629,#630); +#628 = CARTESIAN_POINT('',(-105.9604867346,-3.095103427768, + 19.999999552965)); +#629 = DIRECTION('',(0.,0.,-1.)); +#630 = DIRECTION('',(1.,0.,0.)); +#631 = PCURVE('',#202,#632); +#632 = DEFINITIONAL_REPRESENTATION('',(#633),#636); +#633 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#634,#635),.UNSPECIFIED.,.F.,.F., + (2,2),(0.944934553846,5.338250753333),.PIECEWISE_BEZIER_KNOTS.); +#634 = CARTESIAN_POINT('',(0.944934553846,-39.99999910593)); +#635 = CARTESIAN_POINT('',(5.338250753333,-39.99999910593)); +#636 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#637 = PCURVE('',#380,#638); +#638 = DEFINITIONAL_REPRESENTATION('',(#639),#647); +#639 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#640,#641,#642,#643,#644,#645 +,#646),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#640 = CARTESIAN_POINT('',(-76.18209971851,-3.095103427768)); +#641 = CARTESIAN_POINT('',(-76.18209971851,-54.67278270711)); +#642 = CARTESIAN_POINT('',(-120.8496802426,-28.88394306744)); +#643 = CARTESIAN_POINT('',(-165.5172607668,-3.095103427768)); +#644 = CARTESIAN_POINT('',(-120.8496802426,22.693736211908)); +#645 = CARTESIAN_POINT('',(-76.18209971851,48.482575851583)); +#646 = CARTESIAN_POINT('',(-76.18209971851,-3.095103427768)); +#647 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#648 = ORIENTED_EDGE('',*,*,#649,.F.); +#649 = EDGE_CURVE('',#182,#623,#650,.T.); +#650 = SURFACE_CURVE('',#651,(#655,#661),.PCURVE_S2.); +#651 = LINE('',#652,#653); +#652 = CARTESIAN_POINT('',(-88.51642906665,21.039046347141, + -19.99999955296)); +#653 = VECTOR('',#654,1.); +#654 = DIRECTION('',(0.,0.,1.)); +#655 = PCURVE('',#202,#656); +#656 = DEFINITIONAL_REPRESENTATION('',(#657),#660); +#657 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#658,#659),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#658 = CARTESIAN_POINT('',(5.338250753333,0.)); +#659 = CARTESIAN_POINT('',(5.338250753333,-39.99999910593)); +#660 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#661 = PCURVE('',#234,#662); +#662 = DEFINITIONAL_REPRESENTATION('',(#663),#666); +#663 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#664,#665),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#664 = CARTESIAN_POINT('',(4.086527207436,0.)); +#665 = CARTESIAN_POINT('',(4.086527207436,39.99999910593)); +#666 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#667 = ORIENTED_EDGE('',*,*,#181,.F.); +#668 = ADVANCED_FACE('',(#669),#234,.F.); +#669 = FACE_BOUND('',#670,.T.); +#670 = EDGE_LOOP('',(#671,#672,#699,#719)); +#671 = ORIENTED_EDGE('',*,*,#649,.T.); +#672 = ORIENTED_EDGE('',*,*,#673,.T.); +#673 = EDGE_CURVE('',#623,#674,#676,.T.); +#674 = VERTEX_POINT('',#675); +#675 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + 19.999999552965)); +#676 = SURFACE_CURVE('',#677,(#682,#688),.PCURVE_S2.); +#677 = CIRCLE('',#678,20.41914254867); +#678 = AXIS2_PLACEMENT_3D('',#679,#680,#681); +#679 = CARTESIAN_POINT('',(-76.55497863763,37.587915977932, + 19.999999552965)); +#680 = DIRECTION('',(0.,0.,1.)); +#681 = DIRECTION('',(1.,0.,0.)); +#682 = PCURVE('',#234,#683); +#683 = DEFINITIONAL_REPRESENTATION('',(#684),#687); +#684 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#685,#686),.UNSPECIFIED.,.F.,.F., + (2,2),(4.086527207436,4.916177873213),.PIECEWISE_BEZIER_KNOTS.); +#685 = CARTESIAN_POINT('',(4.086527207436,39.99999910593)); +#686 = CARTESIAN_POINT('',(4.916177873213,39.99999910593)); +#687 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#688 = PCURVE('',#380,#689); +#689 = DEFINITIONAL_REPRESENTATION('',(#690),#698); +#690 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#691,#692,#693,#694,#695,#696 +,#697),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#691 = CARTESIAN_POINT('',(-56.13583608896,37.587915977932)); +#692 = CARTESIAN_POINT('',(-56.13583608896,72.954908319219)); +#693 = CARTESIAN_POINT('',(-86.76454991196,55.271412148575)); +#694 = CARTESIAN_POINT('',(-117.3932637349,37.587915977932)); +#695 = CARTESIAN_POINT('',(-86.76454991196,19.904419807288)); +#696 = CARTESIAN_POINT('',(-56.13583608896,2.220923636644)); +#697 = CARTESIAN_POINT('',(-56.13583608896,37.587915977932)); +#698 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#699 = ORIENTED_EDGE('',*,*,#700,.F.); +#700 = EDGE_CURVE('',#214,#674,#701,.T.); +#701 = SURFACE_CURVE('',#702,(#706,#712),.PCURVE_S2.); +#702 = LINE('',#703,#704); +#703 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + -19.99999955296)); +#704 = VECTOR('',#705,1.); +#705 = DIRECTION('',(0.,0.,1.)); +#706 = PCURVE('',#234,#707); +#707 = DEFINITIONAL_REPRESENTATION('',(#708),#711); +#708 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#709,#710),.UNSPECIFIED.,.F.,.F., + (2,2),(0.,39.99999910593),.PIECEWISE_BEZIER_KNOTS.); +#709 = CARTESIAN_POINT('',(4.916177873213,0.)); +#710 = CARTESIAN_POINT('',(4.916177873213,39.99999910593)); +#711 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#712 = PCURVE('',#259,#713); +#713 = DEFINITIONAL_REPRESENTATION('',(#714),#718); +#714 = LINE('',#715,#716); +#715 = CARTESIAN_POINT('',(0.,0.)); +#716 = VECTOR('',#717,1.); +#717 = DIRECTION('',(0.,-1.)); +#718 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#719 = ORIENTED_EDGE('',*,*,#213,.F.); +#720 = ADVANCED_FACE('',(#721),#259,.T.); +#721 = FACE_BOUND('',#722,.T.); +#722 = EDGE_LOOP('',(#723,#724,#745,#746)); +#723 = ORIENTED_EDGE('',*,*,#700,.T.); +#724 = ORIENTED_EDGE('',*,*,#725,.T.); +#725 = EDGE_CURVE('',#674,#343,#726,.T.); +#726 = SURFACE_CURVE('',#727,(#731,#738),.PCURVE_S2.); +#727 = LINE('',#728,#729); +#728 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011, + 19.999999552965)); +#729 = VECTOR('',#730,1.); +#730 = DIRECTION('',(0.997121794488,7.581640296081E-02,0.)); +#731 = PCURVE('',#259,#732); +#732 = DEFINITIONAL_REPRESENTATION('',(#733),#737); +#733 = LINE('',#734,#735); +#734 = CARTESIAN_POINT('',(0.,-39.99999910593)); +#735 = VECTOR('',#736,1.); +#736 = DIRECTION('',(1.,0.)); +#737 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#738 = PCURVE('',#380,#739); +#739 = DEFINITIONAL_REPRESENTATION('',(#740),#744); +#740 = LINE('',#741,#742); +#741 = CARTESIAN_POINT('',(-72.42252677679,17.591310665011)); +#742 = VECTOR('',#743,1.); +#743 = DIRECTION('',(0.997121794488,7.581640296081E-02)); +#744 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#745 = ORIENTED_EDGE('',*,*,#342,.F.); +#746 = ORIENTED_EDGE('',*,*,#245,.F.); +#747 = ADVANCED_FACE('',(#748),#294,.F.); +#748 = FACE_BOUND('',#749,.T.); +#749 = EDGE_LOOP('',(#750,#771,#796,#797)); +#750 = ORIENTED_EDGE('',*,*,#751,.T.); +#751 = EDGE_CURVE('',#274,#752,#754,.T.); +#752 = VERTEX_POINT('',#753); +#753 = CARTESIAN_POINT('',(-91.4143372247,-2.809300087392, + 19.999999552965)); +#754 = SEAM_CURVE('',#755,(#759,#765),.PCURVE_S2.); +#755 = LINE('',#756,#757); +#756 = CARTESIAN_POINT('',(-91.4143372247,-2.809300087392, + -40.00019910593)); +#757 = VECTOR('',#758,1.); +#758 = DIRECTION('',(0.,0.,1.)); +#759 = PCURVE('',#294,#760); +#760 = DEFINITIONAL_REPRESENTATION('',(#761),#764); +#761 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#762,#763),.UNSPECIFIED.,.F.,.F., + (2,2),(20.000199552965,60.000198658895),.PIECEWISE_BEZIER_KNOTS.); +#762 = CARTESIAN_POINT('',(0.,20.000199552965)); +#763 = CARTESIAN_POINT('',(0.,60.000198658895)); +#764 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#765 = PCURVE('',#294,#766); +#766 = DEFINITIONAL_REPRESENTATION('',(#767),#770); +#767 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#768,#769),.UNSPECIFIED.,.F.,.F., + (2,2),(20.000199552965,60.000198658895),.PIECEWISE_BEZIER_KNOTS.); +#768 = CARTESIAN_POINT('',(6.28318530718,20.000199552965)); +#769 = CARTESIAN_POINT('',(6.28318530718,60.000198658895)); +#770 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#771 = ORIENTED_EDGE('',*,*,#772,.F.); +#772 = EDGE_CURVE('',#752,#752,#773,.T.); +#773 = SURFACE_CURVE('',#774,(#779,#785),.PCURVE_S2.); +#774 = CIRCLE('',#775,15.057678156153); +#775 = AXIS2_PLACEMENT_3D('',#776,#777,#778); +#776 = CARTESIAN_POINT('',(-106.4720153808,-2.809300087392, + 19.999999552965)); +#777 = DIRECTION('',(0.,0.,-1.)); +#778 = DIRECTION('',(0.,1.,0.)); +#779 = PCURVE('',#294,#780); +#780 = DEFINITIONAL_REPRESENTATION('',(#781),#784); +#781 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#782,#783),.UNSPECIFIED.,.F.,.F., + (2,2),(1.570796326795,7.853981633974),.PIECEWISE_BEZIER_KNOTS.); +#782 = CARTESIAN_POINT('',(6.28318530718,60.000198658895)); +#783 = CARTESIAN_POINT('',(0.,60.000198658895)); +#784 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#785 = PCURVE('',#380,#786); +#786 = DEFINITIONAL_REPRESENTATION('',(#787),#795); +#787 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#788,#789,#790,#791,#792,#793 +,#794),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#788 = CARTESIAN_POINT('',(-106.4720153808,12.24837806876)); +#789 = CARTESIAN_POINT('',(-80.39135177038,12.24837806876)); +#790 = CARTESIAN_POINT('',(-93.43168357562,-10.33813916546)); +#791 = CARTESIAN_POINT('',(-106.4720153808,-32.92465639969)); +#792 = CARTESIAN_POINT('',(-119.512347186,-10.33813916546)); +#793 = CARTESIAN_POINT('',(-132.5526789913,12.24837806876)); +#794 = CARTESIAN_POINT('',(-106.4720153808,12.24837806876)); +#795 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#796 = ORIENTED_EDGE('',*,*,#751,.F.); +#797 = ORIENTED_EDGE('',*,*,#273,.T.); +#798 = ADVANCED_FACE('',(#799),#328,.F.); +#799 = FACE_BOUND('',#800,.T.); +#800 = EDGE_LOOP('',(#801,#822,#847,#848)); +#801 = ORIENTED_EDGE('',*,*,#802,.T.); +#802 = EDGE_CURVE('',#308,#803,#805,.T.); +#803 = VERTEX_POINT('',#804); +#804 = CARTESIAN_POINT('',(141.97662545896,-4.606760106981, + 19.999999552965)); +#805 = SEAM_CURVE('',#806,(#810,#816),.PCURVE_S2.); +#806 = LINE('',#807,#808); +#807 = CARTESIAN_POINT('',(141.97662545896,-4.606760106981, + -40.00019910593)); +#808 = VECTOR('',#809,1.); +#809 = DIRECTION('',(0.,0.,1.)); +#810 = PCURVE('',#328,#811); +#811 = DEFINITIONAL_REPRESENTATION('',(#812),#815); +#812 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#813,#814),.UNSPECIFIED.,.F.,.F., + (2,2),(20.000199552965,60.000198658895),.PIECEWISE_BEZIER_KNOTS.); +#813 = CARTESIAN_POINT('',(0.,20.000199552965)); +#814 = CARTESIAN_POINT('',(0.,60.000198658895)); +#815 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#816 = PCURVE('',#328,#817); +#817 = DEFINITIONAL_REPRESENTATION('',(#818),#821); +#818 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#819,#820),.UNSPECIFIED.,.F.,.F., + (2,2),(20.000199552965,60.000198658895),.PIECEWISE_BEZIER_KNOTS.); +#819 = CARTESIAN_POINT('',(6.28318530718,20.000199552965)); +#820 = CARTESIAN_POINT('',(6.28318530718,60.000198658895)); +#821 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#822 = ORIENTED_EDGE('',*,*,#823,.F.); +#823 = EDGE_CURVE('',#803,#803,#824,.T.); +#824 = SURFACE_CURVE('',#825,(#830,#836),.PCURVE_S2.); +#825 = CIRCLE('',#826,23.40416683412); +#826 = AXIS2_PLACEMENT_3D('',#827,#828,#829); +#827 = CARTESIAN_POINT('',(118.57245862484,-4.606760106981, + 19.999999552965)); +#828 = DIRECTION('',(0.,0.,-1.)); +#829 = DIRECTION('',(0.,1.,0.)); +#830 = PCURVE('',#328,#831); +#831 = DEFINITIONAL_REPRESENTATION('',(#832),#835); +#832 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#833,#834),.UNSPECIFIED.,.F.,.F., + (2,2),(1.570796326795,7.853981633974),.PIECEWISE_BEZIER_KNOTS.); +#833 = CARTESIAN_POINT('',(6.28318530718,60.000198658895)); +#834 = CARTESIAN_POINT('',(0.,60.000198658895)); +#835 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#836 = PCURVE('',#380,#837); +#837 = DEFINITIONAL_REPRESENTATION('',(#838),#846); +#838 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#839,#840,#841,#842,#843,#844 +,#845),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#839 = CARTESIAN_POINT('',(118.57245862484,18.797406727139)); +#840 = CARTESIAN_POINT('',(159.10966469035,18.797406727139)); +#841 = CARTESIAN_POINT('',(138.84106165759,-16.30884352404)); +#842 = CARTESIAN_POINT('',(118.57245862484,-51.41509377522)); +#843 = CARTESIAN_POINT('',(98.303855592083,-16.30884352404)); +#844 = CARTESIAN_POINT('',(78.035252559326,18.797406727139)); +#845 = CARTESIAN_POINT('',(118.57245862484,18.797406727139)); +#846 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#847 = ORIENTED_EDGE('',*,*,#802,.F.); +#848 = ORIENTED_EDGE('',*,*,#307,.T.); +#849 = ADVANCED_FACE('',(#850,#860,#863),#380,.T.); +#850 = FACE_BOUND('',#851,.F.); +#851 = EDGE_LOOP('',(#852,#853,#854,#855,#856,#857,#858,#859)); +#852 = ORIENTED_EDGE('',*,*,#364,.T.); +#853 = ORIENTED_EDGE('',*,*,#420,.T.); +#854 = ORIENTED_EDGE('',*,*,#471,.T.); +#855 = ORIENTED_EDGE('',*,*,#523,.T.); +#856 = ORIENTED_EDGE('',*,*,#571,.T.); +#857 = ORIENTED_EDGE('',*,*,#622,.T.); +#858 = ORIENTED_EDGE('',*,*,#673,.T.); +#859 = ORIENTED_EDGE('',*,*,#725,.T.); +#860 = FACE_BOUND('',#861,.T.); +#861 = EDGE_LOOP('',(#862)); +#862 = ORIENTED_EDGE('',*,*,#772,.T.); +#863 = FACE_BOUND('',#864,.T.); +#864 = EDGE_LOOP('',(#865)); +#865 = ORIENTED_EDGE('',*,*,#823,.T.); +#866 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#869)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#867,#868)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#867 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#868 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#869 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-04),#867, + 'distance_accuracy_value','Confusion accuracy'); +ENDSEC; +END-ISO-10303-21; + diff --git a/src/TEST_PY/recettes/cuve.brep b/src/TEST_PY/recettes/cuve.brep new file mode 100644 index 0000000..4d89041 --- /dev/null +++ b/src/TEST_PY/recettes/cuve.brep @@ -0,0 +1,1323 @@ +DBRep_DrawableShape + +CASCADE Topology V1, (c) Matra-Datavision +Locations 36 +1 + 1 0 0 0 + 0 1 0 0 + 0 0 1 -0.05 +1 + 1 0 0 0 + 0 1 0 0.15 + 0 0 1 0 +2 2 1 1 1 0 +1 + 1 0 0 0.15 + 0 1 0 0 + 0 0 1 0 +2 4 1 1 1 0 +2 4 1 2 1 0 +2 4 1 2 1 1 1 0 +1 + 1 0 0 1.85 + 0 1 0 0 + 0 0 1 0 +2 8 -1 0 +2 1 1 8 1 0 +2 2 1 8 1 0 +1 + 1 0 0 0 + 0 1 0 1.85 + 0 0 1 0 +2 12 -1 0 +2 1 1 12 1 0 +2 2 1 12 1 0 +2 12 -1 2 -1 0 +2 2 1 1 1 12 1 0 +1 + 1 0 0 1.85 + 0 1 0 1.85 + 0 0 1 0 +2 2 1 18 1 0 +2 18 -1 2 -1 0 +2 2 1 1 1 18 1 0 +2 18 -1 0 +2 1 1 18 1 0 +1 + 1 0 0 0.925 + 0 1 0 0.925 + 0 0 1 0 +1 + 1 0 0 0 + 0 1 0 0 + 0 0 1 0.1 +1 + 1 0 0 0 + 0 1 0 2 + 0 0 1 0 +2 26 1 25 1 0 +1 + 1 0 0 2 + 0 1 0 0 + 0 0 1 0 +2 28 1 25 1 0 +2 28 1 26 1 0 +2 4 1 2 1 8 1 0 +2 4 1 18 1 0 +2 4 1 2 1 12 1 26 -1 0 +2 2 1 18 1 26 -1 0 +2 2 1 24 1 0 +2 28 1 26 1 25 1 0 +Curve2ds 52 +1 0 0 1 0 +2 0 0 1 0 -0 1 0.94999999999999996 +1 0 0 1 0 +2 0 0 1 0 -0 1 0.90000000000000002 +8 0.43213918000000001 1 +7 0 0 8 72 11 2.5236425694120341 1.1500000000000001 2.5236425683191426 1.1403015520909154 2.5228348845828794 1.1306003698069182 2.5212192656726353 1.1210128783693918 2.5188272283365647 1.1116334137525825 2.515709122210974 1.1025376848668826 2.5119247544283074 1.0937854933494229 2.5075375752237332 1.0854227109619752 2.4968853455349729 1.068249470811699 2.4904280242146055 1.0595835604791797 2.4833270105733645 1.051516087115175 2.4756632736353801 1.0440688973344763 2.4675110919195835 1.0372557532262878 2.4589367430178499 1.03108412428609 2.4499969922864464 1.0255573989031896 2.4216542082292061 1.0106205430515762 2.4012023909687357 1.0033056658423609 2.379839987054142 0.99878910199429438 2.3580107724641359 0.99713928835479915 2.3361535826677726 0.99837036150465641 2.3147071915317783 1.0024726748405415 2.2941172111112018 1.0093822111423576 2.2659835067199809 1.023475570025417 2.2573989771523046 1.0284952407085388 2.2491277390441282 1.0340946568121099 2.2412165988327555 1.040271033783295 2.2337194014843225 1.0470188947598489 2.226696127791254 1.0543286289989084 2.2202122536687545 1.0621854859685513 2.2086416095452348 1.0786997286431936 2.2035154811395556 1.0873303162681029 2.1990344093169636 1.0964301375458565 2.1952769629116426 1.1059533307939176 2.192318459186104 1.1158362127022594 2.1902255588593604 1.1259951300277482 2.1890461478836776 1.1363227435623531 2.1885466781535525 1.1563481073299624 2.1891078644778728 1.1660466736318205 2.1904783921525697 1.175658479414494 2.192632095602228 1.1850865198757725 2.1955224888259535 1.1942516731652679 2.1990920591082261 1.2030902984670548 2.2032779764791779 1.2115524984806818 2.213516373048626 1.2289511484322104 2.219764628348837 1.2377484745104383 2.2266720754895424 1.2459581030167104 2.2341567432604177 1.2535558710131363 2.2421431414367876 1.2605265985468377 2.2505638840002038 1.2668620200658793 2.2593613927190024 1.2725584228467506 2.2873714330438832 1.2880713757958904 2.3076748074995552 1.2957902966013424 2.328942563545235 1.3007207340627089 2.3507330242100468 1.3027900120130802 2.3726075578401655 1.3019797850319212 2.3941277573934761 1.2982949535504336 2.4148465162419619 1.2917949327931013 2.4438146824809506 1.2780235722812838 2.4530277974675463 1.2728433452075765 2.4618981004563789 1.2670066896745276 2.4703702513920431 1.2605165902476647 2.4783800732823886 1.2533792693115566 2.4858557204397407 1.2456061025364378 2.4927184557277235 1.2372148845999686 2.5046262707997657 1.2198600892236375 2.5097672895579315 1.2109693186295689 2.5142246710190301 1.2015934064125477 2.5179138519637467 1.1917844555158239 2.5207552809443525 1.1816139787830962 2.5226803096710722 1.1711751156735983 2.5236425682190675 1.1605865258769157 2.5236425694120341 1.1500000000000001 + 0 9 0.073840985206690093 7 0.15970498882719014 7 0.33666247369529484 7 0.41799822796329628 7 0.49688139402059656 7 0.57050503096671323 7 0.65603456252404424 7 0.83295134410099214 7 0.91943110368423631 7 1 9 +8 0.43213918000000001 1 +7 0 0 8 72 11 0 0.91258774101503437 0.064656319393898584 0.91258774085110028 0.12933031390327407 0.91246661747546187 0.19366037126984828 0.91222419361831175 0.25742531971348642 0.91186869550888794 0.3204843867935695 0.91141397332393204 0.3827395801099131 0.91087710479215467 0.44412048984323332 0.91027638195470539 0.57490861614156619 0.90887768236508293 0.6440276192164659 0.90806317247564328 0.71205275101529109 0.90721245597563149 0.77908469897221011 0.90635095610964944 0.84522490698165043 0.90550182260364254 0.91058296867556865 0.90468516052912362 0.97528711629646181 0.90391788023256858 1.1718298829276412 0.90176388552112308 1.302137153163984 0.90058282317537219 1.4313848292800009 0.89980028464217399 1.560094654639486 0.89950392978415405 1.6887796016932857 0.89972654295637855 1.817938639823989 0.90044154957543143 1.9480832947875468 0.9015665596789586 2.1407843793746792 0.90362414224806997 2.2018839672277224 0.9043324414154339 2.2635327058374979 0.90508947612652135 2.3258391857636487 0.90588144380120206 2.3888992800015889 0.90669206504716804 2.4528043565282962 0.90750265047910272 2.5176484640262751 0.90829254572888118 2.6474337984947138 0.90976482628924149 2.7123486389596096 0.91045013717022827 2.7782731920357513 0.91107477771117262 2.8451604415316947 0.91161641086637746 2.9129177941816127 0.91205309723014805 2.9814040612585 0.91236599440793897 3.0503922248876076 0.91254279072748057 3.1839273479256254 0.91261769284168937 3.2484945951658362 0.91253362435340957 3.3127880114922448 0.91232744427405577 3.3765730049422387 0.91200583925394552 3.4396958204284469 0.91158149463156324 3.5020447803764787 0.91107079481629749 3.5635334785105464 0.91049179564299121 3.6944737236149692 0.90913137144465006 3.763645856026629 0.90833193203774287 3.831713149419993 0.90749035597241734 3.8987686092307512 0.9066322618494782 3.9649091497400737 0.90578113920391523 4.0302414985737247 0.90495747691957162 4.0948922768924758 0.90417856223025872 4.2916743249301961 0.90197044191645803 4.4221434504122525 0.90073516124072761 4.5514759545336654 0.89988621464534635 4.6802047572046099 0.89951637280717933 4.8088585153839754 0.89966459088939166 4.9379239210447086 0.90031056524266273 5.0679034062872255 0.90137736851015837 5.2640016913951557 0.90341171093402928 5.3288247923109671 0.90415147997128897 5.3942457123350867 0.90494966886961503 5.4603947106310269 0.90579013983936107 5.5273858463535337 0.90665358174809563 5.5953280919503001 0.90751757984198533 5.664335264128268 0.90835721374486311 5.799936167417048 0.90988122788446191 5.8664158994856255 0.9105727841268868 5.933951445063486 0.91119804733603771 6.0024794822537695 0.91173306295851675 6.0718892115889433 0.91215463016542109 6.1420180297445732 0.91244340723025208 6.2126084680001457 0.91258774083608896 6.2831853071795862 0.91258774101503426 + 0 9 0.073840985206690093 7 0.15970498882719014 7 0.33666247369529484 7 0.41799822796329628 7 0.49688139402059656 7 0.57050503096671323 7 0.65603456252404424 7 0.83295134410099214 7 0.91943110368423631 7 1 9 +8 0 0.43213918000000001 +7 0 0 8 72 11 2.5236425694120341 1.1500000000000001 2.5236425683191426 1.1403015520909154 2.5228348845828794 1.1306003698069182 2.5212192656726353 1.1210128783693918 2.5188272283365647 1.1116334137525825 2.515709122210974 1.1025376848668826 2.5119247544283074 1.0937854933494229 2.5075375752237332 1.0854227109619752 2.4968853455349729 1.068249470811699 2.4904280242146055 1.0595835604791797 2.4833270105733645 1.051516087115175 2.4756632736353801 1.0440688973344763 2.4675110919195835 1.0372557532262878 2.4589367430178499 1.03108412428609 2.4499969922864464 1.0255573989031896 2.4216542082292061 1.0106205430515762 2.4012023909687357 1.0033056658423609 2.379839987054142 0.99878910199429438 2.3580107724641359 0.99713928835479915 2.3361535826677726 0.99837036150465641 2.3147071915317783 1.0024726748405415 2.2941172111112018 1.0093822111423576 2.2659835067199809 1.023475570025417 2.2573989771523046 1.0284952407085388 2.2491277390441282 1.0340946568121099 2.2412165988327555 1.040271033783295 2.2337194014843225 1.0470188947598489 2.226696127791254 1.0543286289989084 2.2202122536687545 1.0621854859685513 2.2086416095452348 1.0786997286431936 2.2035154811395556 1.0873303162681029 2.1990344093169636 1.0964301375458565 2.1952769629116426 1.1059533307939176 2.192318459186104 1.1158362127022594 2.1902255588593604 1.1259951300277482 2.1890461478836776 1.1363227435623531 2.1885466781535525 1.1563481073299624 2.1891078644778728 1.1660466736318205 2.1904783921525697 1.175658479414494 2.192632095602228 1.1850865198757725 2.1955224888259535 1.1942516731652679 2.1990920591082261 1.2030902984670548 2.2032779764791779 1.2115524984806818 2.213516373048626 1.2289511484322104 2.219764628348837 1.2377484745104383 2.2266720754895424 1.2459581030167104 2.2341567432604177 1.2535558710131363 2.2421431414367876 1.2605265985468377 2.2505638840002038 1.2668620200658793 2.2593613927190024 1.2725584228467506 2.2873714330438832 1.2880713757958904 2.3076748074995552 1.2957902966013424 2.328942563545235 1.3007207340627089 2.3507330242100468 1.3027900120130802 2.3726075578401655 1.3019797850319212 2.3941277573934761 1.2982949535504336 2.4148465162419619 1.2917949327931013 2.4438146824809506 1.2780235722812838 2.4530277974675463 1.2728433452075765 2.4618981004563789 1.2670066896745276 2.4703702513920431 1.2605165902476647 2.4783800732823886 1.2533792693115566 2.4858557204397407 1.2456061025364378 2.4927184557277235 1.2372148845999686 2.5046262707997657 1.2198600892236375 2.5097672895579315 1.2109693186295689 2.5142246710190301 1.2015934064125477 2.5179138519637467 1.1917844555158239 2.5207552809443525 1.1816139787830962 2.5226803096710722 1.1711751156735983 2.5236425682190675 1.1605865258769157 2.5236425694120341 1.1500000000000001 + 0 9 0.073840985206690093 7 0.15970498882719014 7 0.33666247369529484 7 0.41799822796329628 7 0.49688139402059656 7 0.57050503096671323 7 0.65603456252404424 7 0.83295134410099214 7 0.91943110368423631 7 1 9 +8 0 0.43213918000000001 +7 0 0 8 72 11 0 0.91258774101503437 0.064656319393898584 0.91258774085110028 0.12933031390327407 0.91246661747546187 0.19366037126984828 0.91222419361831175 0.25742531971348642 0.91186869550888794 0.3204843867935695 0.91141397332393204 0.3827395801099131 0.91087710479215467 0.44412048984323332 0.91027638195470539 0.57490861614156619 0.90887768236508293 0.6440276192164659 0.90806317247564328 0.71205275101529109 0.90721245597563149 0.77908469897221011 0.90635095610964944 0.84522490698165043 0.90550182260364254 0.91058296867556865 0.90468516052912362 0.97528711629646181 0.90391788023256858 1.1718298829276412 0.90176388552112308 1.302137153163984 0.90058282317537219 1.4313848292800009 0.89980028464217399 1.560094654639486 0.89950392978415405 1.6887796016932857 0.89972654295637855 1.817938639823989 0.90044154957543143 1.9480832947875468 0.9015665596789586 2.1407843793746792 0.90362414224806997 2.2018839672277224 0.9043324414154339 2.2635327058374979 0.90508947612652135 2.3258391857636487 0.90588144380120206 2.3888992800015889 0.90669206504716804 2.4528043565282962 0.90750265047910272 2.5176484640262751 0.90829254572888118 2.6474337984947138 0.90976482628924149 2.7123486389596096 0.91045013717022827 2.7782731920357513 0.91107477771117262 2.8451604415316947 0.91161641086637746 2.9129177941816127 0.91205309723014805 2.9814040612585 0.91236599440793897 3.0503922248876076 0.91254279072748057 3.1839273479256254 0.91261769284168937 3.2484945951658362 0.91253362435340957 3.3127880114922448 0.91232744427405577 3.3765730049422387 0.91200583925394552 3.4396958204284469 0.91158149463156324 3.5020447803764787 0.91107079481629749 3.5635334785105464 0.91049179564299121 3.6944737236149692 0.90913137144465006 3.763645856026629 0.90833193203774287 3.831713149419993 0.90749035597241734 3.8987686092307512 0.9066322618494782 3.9649091497400737 0.90578113920391523 4.0302414985737247 0.90495747691957162 4.0948922768924758 0.90417856223025872 4.2916743249301961 0.90197044191645803 4.4221434504122525 0.90073516124072761 4.5514759545336654 0.89988621464534635 4.6802047572046099 0.89951637280717933 4.8088585153839754 0.89966459088939166 4.9379239210447086 0.90031056524266273 5.0679034062872255 0.90137736851015837 5.2640016913951557 0.90341171093402928 5.3288247923109671 0.90415147997128897 5.3942457123350867 0.90494966886961503 5.4603947106310269 0.90579013983936107 5.5273858463535337 0.90665358174809563 5.5953280919503001 0.90751757984198533 5.664335264128268 0.90835721374486311 5.799936167417048 0.90988122788446191 5.8664158994856255 0.9105727841268868 5.933951445063486 0.91119804733603771 6.0024794822537695 0.91173306295851675 6.0718892115889433 0.91215463016542109 6.1420180297445732 0.91244340723025208 6.2126084680001457 0.91258774083608896 6.2831853071795862 0.91258774101503426 + 0 9 0.073840985206690093 7 0.15970498882719014 7 0.33666247369529484 7 0.41799822796329628 7 0.49688139402059656 7 0.57050503096671323 7 0.65603456252404424 7 0.83295134410099214 7 0.91943110368423631 7 1 9 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +7 0 0 8 58 9 0 1.1500000000000001 0.010431194773283109 1.1500000000000001 0.020849989047903396 1.1493284703966891 0.031096120311728953 1.1479883163962781 0.041068454283130419 1.1460235763863611 0.050706002232008954 1.1434873970461039 0.059977417523150452 1.1404290889326325 0.068875477312803857 1.1368870240038074 0.086942682857524572 1.1283949595635283 0.096012064841865336 1.1233340896201689 0.10467612662270122 1.1176980048932865 0.11295761948097738 1.1114555709253888 0.12087066390076719 1.1045819338858629 0.1284075783625869 1.0969632122036779 0.13555980261989836 1.0885148467821006 0.14505876775099205 1.0748151898859339 0.14768338103054846 1.0707086572270215 0.15014318157599571 1.066517952700353 0.15243396413343066 1.0622492155580179 0.15455187623156863 1.0579087732230901 0.15649341818174345 1.0535031412896314 0.1582554430779074 1.0490390235226894 0.16220455019317073 1.0377502508463783 0.1641643778086011 1.0308596062191522 0.16570453833893173 1.0238760027188079 0.16681789702717006 1.0168238288700651 0.16749975874298442 1.0097274086035928 0.16774764946709028 1.0026111944342495 0.16756140618036047 0.99549998219414448 0.16607022194933693 0.97840982498602314 0.16441269310003481 0.96935695482883166 0.16223456272294792 0.96116253340727875 0.15970781250613988 0.95375725649074095 0.15696361478029416 0.94704010086981905 0.15406900495516324 0.94089929299088448 0.1510376572685781 0.93519628677687483 0.14532627592760089 0.92560025405693391 0.14267475479644121 0.92150667908451145 0.13986018738800471 0.91749983736414065 0.13688698577378852 0.91358573606393223 0.13375983175725845 0.90977015665003302 0.13048367687384863 0.90605865488662718 0.12706374239096188 0.90245656083593484 0.11747582424716051 0.89305899082914642 0.11121294559831128 0.88763848979254201 0.10471435314382527 0.88263600945233134 0.09797413920045564 0.87801822269787499 0.090984891856121505 0.87376786428582776 0.083737978258264373 0.86987789996276743 0.076222845674517814 0.86635220919523415 0.060710055364801702 0.86008660598343867 0.05271512024889552 0.85733756638704617 0.044440254269759408 0.85497438146016913 0.035898901658061262 0.85302540846751518 0.027120752691711426 0.85152540347741201 0.018155574858741686 0.85050883252399101 0.0090789617954770054 0.8500000008171068 0 0.84999999999999976 + 0 9 0.13229762403004616 7 0.27996796770557875 7 0.34121855759820813 7 0.43308757253782593 7 0.56295171984466641 7 0.66292718998370481 7 0.8323436611939603 7 1 9 +7 0 0 8 58 9 3.1415926535897931 0.90000000000000013 3.2041798222294915 0.90000000000000013 3.2666923238087273 0.90011191673895308 3.3285334437941523 0.90033529818332136 3.3894513100485621 0.9006599775976728 3.4493672871180543 0.90107189423165146 3.5083169454565675 0.90155659419197354 3.5664598583583911 0.9021011709613791 3.6884684521754991 0.90335868790294416 3.7521417294181201 0.9040830600602584 3.8158010857354543 0.90485655344458504 3.8800726294929015 0.90566883453235847 3.9454423842050073 0.90651032892009054 4.0128898938558457 0.90736983582552433 4.0831559542476281 0.90823666426341521 4.1905074475373336 0.90944887435175958 4.2219871199173689 0.90979173374613254 4.2534741576193067 0.9101198385798791 4.2849689318520037 0.91043111695129797 4.3164716177481353 0.9107236481867732 4.3479821943641968 0.91099566284077371 4.3795004446805024 0.91124554269585423 4.4583106860638395 0.91181121248338559 4.5056220120744612 0.91209763919929221 4.5529477427358467 0.91232620035577872 4.6002825290712606 0.91249312844692709 4.647624665423935 0.91259586324701281 4.6949731042276612 0.9126331080475385 4.7423246841484987 0.91260486789979389 4.8566001564991312 0.91238185790114534 4.9175298932549589 0.91213474338219802 4.9734471600614576 0.91181298508300501 5.0248548514780627 0.91144643456537944 5.0723778036818059 0.91105642538785359 5.1166890069411144 0.91065381960287184 5.1587025909104973 0.91024143354506315 5.2311005241547157 0.90948441466664842 5.2625851972527293 0.90913922071327768 5.2940632133175338 0.90878020154621486 5.3255350420117731 0.90840950745514193 5.357001352285403 0.90802935780255822 5.3884630123756931 0.9076420410237811 5.4199210898072261 0.9072499146269456 5.5046811681357468 0.90618687724245339 5.5565294367492672 0.90552960679963801 5.6075153831747784 0.90488837329785832 5.6580086701726886 0.90426795089502299 5.7083023358027756 0.90367351071952495 5.7586547806839166 0.90311074052241924 5.8092966749922894 0.90258591220765494 5.9111179453213989 0.9016313278808803 5.9623060367547422 0.90120044337752425 6.0141920179006991 0.90082122689279875 6.0668349021431798 0.90050265705403254 6.1202204680401042 0.90025427107114364 6.1742523008577512 0.90008478478757903 6.2287115364067258 0.90000000013618453 6.2831853071795862 0.90000000000000024 + 0 9 0.13229762403004616 7 0.27996796770557875 7 0.34121855759820813 7 0.43308757253782593 7 0.56295171984466641 7 0.66292718998370481 7 0.8323436611939603 7 1 9 +1 0 2 1 0 +2 0 0 1 0 -0 1 0.90000000000000002 +7 0 0 8 65 10 6.2831853071795862 0.84999999999999987 6.2722511243565489 0.85000000098407669 6.2613354160580545 0.85073785813964964 6.2506196626753567 0.85220904801051112 6.2402144388851957 0.8543606904066845 6.2301841088971353 0.85713140947797239 6.2205596680667812 0.86046603673590383 6.2113449610428173 0.86432332927482225 6.1979123547225923 0.87097846333872109 6.1933938987769466 0.873410338009323 6.188972950351415 0.87598695067327503 6.1846561190689497 0.87870449414205343 6.1804498126029275 0.88155890381998692 6.1763602366771515 0.88454585770425698 6.1723933950658472 0.88766077638489826 6.164237023760621 0.89454160206518918 6.1600812110586807 0.89834062923441405 6.1560962725319444 0.90228864811813914 6.1522900775403349 0.90637849695592454 6.1486699176115893 0.91060288062336692 6.1452426802932614 0.91495414259424612 6.1420150230047117 0.91942403690266949 6.1348332550635627 0.93030899536582734 6.1310075635758139 0.93690719284295121 6.1273467715995329 0.94409640378137683 6.1238465563310527 0.95213480001279893 6.1206386201140264 0.96122360731956058 6.117966398333718 0.97150270402638927 6.1161881540091869 0.98308501515356028 6.1156549169398309 1.0007063636426647 6.1157040816928516 1.0054441604746787 6.1159459032193677 1.0101793244374737 6.1163801624911986 1.0149044841660333 6.1170061549710111 1.019612296448277 6.1178226906123196 1.0242954462250593 6.1188280938594879 1.0289466465901682 6.1213613237510289 1.0387471168289739 6.1229389232149103 1.0438865283849501 6.1247497692348185 1.0489661926567349 6.1267901593218808 1.0539762046896515 6.129055842869958 1.0589071821151097 6.1315419427226976 1.063750011889844 6.134242876740589 1.0684955970351526 6.1397384644739059 1.0772582433949125 6.1424896557133009 1.081298155497417 6.1454015749198989 1.0852481991795362 6.1484696824080256 1.0891024614202203 6.1516891769726287 1.0928552566814889 6.1550549958892802 1.0965011269084295 6.1585618149141759 1.1000348415291969 6.1683315413691178 1.1091992232210854 6.1746923063673114 1.1144747706960325 6.1812910829301746 1.1193422446284795 6.1881351492041761 1.1238309526393317 6.1952326926457681 1.1279547218360269 6.2025925179117252 1.1317172353019247 6.2102245241336149 1.1351116158019805 6.2255350321879499 1.1409352982566341 6.2331796559582244 1.1434143495585005 6.2410720104596695 1.1455417030435207 6.2491975956443486 1.1472921060311572 6.2575280369749002 1.1486360617430751 6.2660181332033913 1.1495451935799141 6.2746015711068637 1.1500000000000001 6.2831853071795862 1.1500000000000001 + 0 9 0.20769551692732596 7 0.31619045992063632 7 0.43824648432856717 7 0.60630628727767011 7 0.66802358049470334 7 0.73745535890280278 7 0.79917367506218406 7 0.90300517542744296 7 1 9 +7 0 0 8 65 10 0 0.90000000000000013 0.065605096938223528 0.90000000016401283 0.1310989665820616 0.90012297020742715 0.19581343441641286 0.90036819746015384 0.25949070837694088 0.90072344533202642 0.32206820363949173 0.90117226199594835 0.38360875270147315 0.90169811783933351 0.44431926544977512 0.90228653904354206 0.53609052402787005 0.90326065443951442 0.56757287322912831 0.90361013252625755 0.59904861817168309 0.90397278365279798 0.63051849741588983 0.90434647922112887 0.66198332142436056 0.90472901729368083 0.69344397256196577 0.90511812259331959 0.72490140509583356 0.90551144650334847 0.79174356229415532 0.90635107483803035 0.82713129927355444 0.90679793531463238 0.86251760702700231 0.90724373385101964 0.89790420236879109 0.90768507147468902 0.93329467427540291 0.90811859145054008 0.96869239012686281 0.90854100584448594 1.0040984019480923 0.90894912208706691 1.0882669410291634 0.90987789246356299 1.1376916590662074 0.91039026212722884 1.1901873216996746 0.91089394884709363 1.2474488083152029 0.91138912618748635 1.3106315259878139 0.91185548303304764 1.3805254070567268 0.91225392825484453 1.4579955604597858 0.91252041635675407 1.5755135678421708 0.91260037309219999 1.6070794928372802 0.91259301650134261 1.6386453937444778 0.91255669860449651 1.6702101182150797 0.91249154134403088 1.7017724008116302 0.91239791723116914 1.7333308630079045 0.91227644934598839 1.7648840131889061 0.91212801133742027 1.831919669099106 0.91175765851811852 1.8674039570748313 0.91152884452430549 1.9028777860791892 0.91126887802662571 1.9383402039912558 0.91097968691047326 1.973792560892706 0.91066350808694108 2.0092364388924713 0.91032286121794159 2.0446715819514059 0.90996052244132375 2.1115808665015789 0.90924080331460033 2.1430612457125942 0.90888727950877746 2.1745353401845566 0.90852106087635143 2.2060037137458743 0.90814434072160688 2.237467117208809 0.90775937145528518 2.2689264883694693 0.90736846459458187 2.3003829520078165 0.90697399076314833 2.3847557594717737 0.90591282538357165 2.4363735706090237 0.90526027033327072 2.4872471698577674 0.90462534542106821 2.5377306516235754 0.9040128552018909 2.5881057752898551 0.90342811642446519 2.6386205470096074 0.90287705988625122 2.6894968577270562 0.90236627891453058 2.7890484138037208 0.9014706270468773 2.8376623340440035 0.90107954402946888 2.8869202684930011 0.90073678248023969 2.9368571392238789 0.90045005679238022 2.9874460476666722 0.90022734982617914 3.0385899293252812 0.90007578605279026 3.0900902371534578 0.90000000000000024 3.1415926535897931 0.90000000000000024 + 0 9 0.20769551692732596 7 0.31619045992063632 7 0.43824648432856717 7 0.60630628727767011 7 0.66802358049470334 7 0.73745535890280278 7 0.79917367506218406 7 0.90300517542744296 7 1 9 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +7 0 0 8 58 9 0 1.1500000000000001 0.0098770024738014141 1.1500000000000001 0.0197426346227958 1.149329174595449 0.029445795127387403 1.1479903370412941 0.038890947555268354 1.1460271003364395 0.048020317326499182 1.1434921328298695 0.056804012805391088 1.1404343369856897 0.065234814212553685 1.1368918174222309 0.082347010106017735 1.1284001672939885 0.090934717078194963 1.1233407739324142 0.099139177402613632 1.1177055018221427 0.10698165621369619 1.1114630021517473 0.11447524836062328 1.1045882790283141 0.12161239726894689 1.0969673382132563 0.12838471214153288 1.0885156232909863 0.13737700607371345 1.074810935396213 0.13986084892181716 1.0707039051380214 0.14218852499664933 1.0665127862041435 0.14435608415741022 1.0622437354583703 0.1463599127641626 1.0579030934730163 0.14819673367783212 1.0534973845289224 0.14986360626020717 1.0490333166154546 0.15359924636623221 1.0377449626797324 0.1554528997318958 1.0308548934948272 0.15690947853266685 1.0238721391370944 0.15796234410592275 1.0168210319896571 0.15860713396032478 1.0097258388375341 0.15884155464077973 1.002610947745765 0.15866546056271905 0.99550107453558578 0.15725599432103715 0.97842177976150824 0.15569000273588093 0.96937262139993718 0.15363094008110223 0.96117933149986656 0.15124140609804634 0.95377298166537161 0.14864507438710281 0.94705361795013032 0.14590565617702625 0.94090997773528751 0.14303632687999432 0.93520427909351544 0.13763109971910509 0.9256061279332698 0.13512186290280653 0.92151209577606341 0.13245811805979865 0.91750471197783068 0.12964401323618635 0.91359000269544344 0.12668395814247119 0.9097737694244501 0.12358262415355145 0.90606158899907485 0.1203449443087222 0.90245881359221669 0.11126557177279718 0.89305761281909679 0.1053339708747013 0.88763504123459824 0.099179046014981134 0.88263127810142661 0.092795332548539181 0.87801291993853647 0.08617594888881952 0.8737626155804098 0.079312869360086774 0.86987322749734752 0.072196273248619436 0.86634851296830517 0.057502582279756194 0.86008320081504364 0.04992762919821226 0.8573339451690819 0.042088207457868759 0.85497118559992002 0.033997276248728107 0.8530230825522046 0.025683055642118941 0.85152409962212028 0.017192630586457338 0.85050838501876558 0.008597347005630071 0.85000000081674787 0 0.84999999999999976 + 0 9 0.13245981261509418 7 0.2801979720647354 7 0.34145692201646749 7 0.4333387805098462 7 0.56311923633956151 7 0.66300625907899968 7 0.8323258221702976 7 1 9 +7 0 0 8 58 9 3.1415926535897931 0.84999999999999976 3.2041470025905356 0.84999999999999976 3.2666290774682634 0.85010591523050982 3.3284472419147559 0.85031733173013357 3.3893520023051935 0.85062468363134269 3.4492657658633585 0.85101471831042308 3.5082241661827762 0.85147378799114415 3.5663856589455545 0.8519896773053971 3.6883995715498057 0.85318061346465757 3.7520630373222428 0.85386642461913143 3.8157218924212732 0.8545987975498609 3.8800014155946809 0.85536794655494774 3.9453867345115103 0.85616479008039525 4.0128567587121635 0.85697869019857553 4.0831512272115651 0.8577994790297232 4.1905402226752573 0.85894705082017053 4.2220230882307783 0.85927152785615168 4.2535126033636539 0.85958201593084604 4.2850090711031275 0.85987655675361063 4.3165126240841634 0.86015333603148503 4.3480232245474495 0.86041068346918881 4.3795406643393928 0.86064707276912233 4.4583470366793554 0.86118217198053315 4.5056539531461945 0.86145308439974166 4.552973640022163 0.86166924314685267 4.6003011415211885 0.8618271014371357 4.6476350827576418 0.86192425048685983 4.6949747569552773 0.86195947145785279 4.7423174374690307 0.8619327703030395 4.8565201383482925 0.8617219811603094 4.9174241332959454 0.86148851255591874 4.9733317556483465 0.86118433586349263 5.0247446365750852 0.860837673328126 5.0722810286185869 0.86046865927906158 5.116610981080008 0.86008762145990436 5.1586433115593522 0.85969726545047553 5.2310554248570345 0.858980808148195 5.2625427753256959 0.85865412874985902 5.294024197084239 0.85831433825568348 5.325500082883825 0.85796346984328953 5.3569710075451766 0.85760362330934381 5.3884377279585722 0.85723696506956049 5.4199011830838497 0.85686572815870066 5.5046928992834685 0.85585906137649714 5.5565620148414308 0.85523656430470529 5.6075637540243566 0.85462926536180528 5.6580675987289091 0.85404169917192374 5.7083662763630496 0.853478771435076 5.7587177739843698 0.85294587191820415 5.8093521464427962 0.85244893713469971 5.9111778364177523 0.85154483758353394 5.9623791930915706 0.8511366563924001 6.0142706379674493 0.85077749073420761 6.0669106483567541 0.85047583254196679 6.1202852525274389 0.85024068227530181 6.1742990866934164 0.85008025189640668 6.2287354428105957 0.85000000012896049 6.2831853071795862 0.85000000000000042 + 0 9 0.13245981261509418 7 0.2801979720647354 7 0.34145692201646749 7 0.4333387805098462 7 0.56311923633956151 7 0.66300625907899968 7 0.8323258221702976 7 1 9 +1 0 2 1 0 +2 0 0 1 0 -0 1 0.94999999999999996 +7 0 0 8 65 10 6.2831853071795862 0.84999999999999987 6.2728322564238335 0.85000000098353978 6.262496219234384 0.85073705344169204 6.2523483452553199 0.85220675935034673 6.2424931268192552 0.85435674099642744 6.2329915702494834 0.85712616816968368 6.2238732806425103 0.86046032614507417 6.2151423404435509 0.86431826108309351 6.2024163698396926 0.87097508263801915 6.1981368587804457 0.87340699197375127 6.1939498000866289 0.87598372681721104 6.189861471250194 0.87870148429691008 6.1858779561182873 0.88155619933525842 6.182005144893254 0.88454354464856522 6.1782487341326346 0.88765893074703783 6.1705254323289944 0.89454087950920114 6.1665905126569376 0.89834058306758413 6.1628176449821037 0.90228933592696137 6.1592142811654034 0.9063799495560233 6.1557873140444004 0.91060509990130023 6.15254324379816 0.91495709971333961 6.1494883443120978 0.91942767087288313 6.1426909188353385 0.93031501464196076 6.1390687860376669 0.93691728011764697 6.1356034668961899 0.9441112233390434 6.132291400741277 0.95215347193751254 6.1292579082977321 0.96124448141813579 6.1267322043251076 0.97152226378185613 6.1250531186667976 0.98309962368766834 6.1245491890979906 1.0007061581176486 6.1245956794147043 1.0054430802413579 6.1248243506994582 1.0101773720372325 6.1252349988829646 1.0149016872265124 6.1258269683623299 1.019608706281858 6.1265991520010532 1.0242911364273521 6.127549991129027 1.0289417116385 6.1299458918813245 1.0387410939391579 6.1314380389525107 1.0438800581732839 6.1331509070602142 1.0489594359589394 6.1350810446042647 1.0539693322789927 6.137224482537091 1.0589003597961357 6.1395766588206167 1.0637433921641701 6.142132342883154 1.0684893173392962 6.1473329084911166 1.0772528419367222 6.1499366024156839 1.0812932597643987 6.1526926245394673 1.0852438841119592 6.1555967034726793 1.0890987817285769 6.1586443137462696 1.0928522463750714 6.1618306758119266 1.0964987988239079 6.1651507560420775 1.1000331868591959 6.1744026769982225 1.1092011009276961 6.1804272067257253 1.1144786336505681 6.1866772113967716 1.1193473003311731 6.1931594510456662 1.1238364887236076 6.1998815381838055 1.1279601163376414 6.2068516559995954 1.1317219748778373 6.2140789980600699 1.1351153169185388 6.2285808747041402 1.1409384558352007 6.2358237862661907 1.1434176041555129 6.2433006984091648 1.1455445198075174 6.2509976972562935 1.1472941281783562 6.2588878410234194 1.1486371838983909 6.2669283844629939 1.1495455758526516 6.2750567588028234 1.1500000000000001 6.2831853071795862 1.1500000000000001 + 0 9 0.20764496176684977 7 0.31606848072882715 7 0.43804415241506528 7 0.6060199603204286 7 0.667762211557411 7 0.73722204561262683 7 0.79896523652129325 7 0.90287127033062087 7 1 9 +7 0 0 8 65 10 0 0.84999999999999976 0.065569321453100932 0.85000000015529564 0.13103051284959838 0.85011637107621785 0.19572085625326127 0.8503484571176696 0.25938496610799794 0.85068474367129088 0.32196125286051458 0.85110972189126521 0.38351252180266504 0.85160778055637554 0.44424435032037768 0.85216521680234181 0.53604652772280381 0.8530880109867518 0.56753166977943403 0.8534189844710881 0.59901092010248269 0.85376242929545743 0.63048494021365564 0.85411632724224784 0.66195444595981523 0.85447859049226438 0.69342020751298128 0.85484706162472879 0.7248830493703301 0.85521951361727999 0.79173702305817184 0.85601455038705476 0.82713125482522853 0.85643765802720873 0.8625240638277758 0.85685973498942325 0.89791696527940801 0.85727755971183128 0.93331336895687189 0.857687952124911 0.96871647672204042 0.85808779892868559 1.0041271800438811 0.85847407886992311 1.088312550673741 0.85935316162927244 1.1377670057642983 0.85983827722903772 1.1902949797767628 0.86031509645488691 1.2475803809631025 0.86078369085132311 1.3107746982474544 0.86122472299306019 1.3806564228433114 0.86160132754682273 1.4580929957176822 0.86185295568577924 1.5755121935346037 0.86192851788913649 1.6070723016585957 0.86192156154384603 1.6386323887201435 0.8618872186468276 1.6701914418448862 0.86182560398298802 1.7017483320848719 0.86173706816977291 1.7333018144185575 0.86162219765716597 1.7648505277508111 0.86148181472768959 1.8318781690177908 0.86113153614138715 1.8673589605693293 0.86091511368618279 1.9028302623575859 0.86066920932887181 1.9382912149991467 0.86039563951068965 1.9737431787813979 0.86009651344834359 2.0091877055067986 0.85977420866632814 2.0446245103371528 0.85943134652923936 2.1115388425036374 0.85875024753070894 2.1430223407119526 0.85841566777764433 2.1745002429727411 0.85806904583512378 2.2059730257287202 0.85771245617781 2.2374413371554054 0.85734803043480345 2.2689059971611112 0.85697795738964089 2.3003679973869549 0.8566044829802959 2.3847725769091306 0.85559955153256317 2.4364111890533313 0.85498150174056398 2.4873004148231463 0.85438016400793682 2.537794157706065 0.85380010113460247 2.5881738500500271 0.85324635596782883 2.6386870591184555 0.85272454748563264 2.6895550238374719 0.85224091529286783 2.7891071632956579 0.85139265183303359 2.8377320374952899 0.85102218433168253 2.8869938607747518 0.85069755211461184 2.9369271718851451 0.85042604890240603 2.9875053837220107 0.85021520667960593 3.0386324603916344 0.85007173705333805 3.0901118472036275 0.84999999999999976 3.1415926535897931 0.84999999999999976 + 0 9 0.20764496176684977 7 0.31606848072882715 7 0.43804415241506528 7 0.6060199603204286 7 0.667762211557411 7 0.73722204561262683 7 0.79896523652129325 7 0.90287127033062087 7 1 9 +8 0.43213918000000001 1 +7 0 0 8 72 11 2.5147527708300452 1.1500000000000001 2.5147527697968846 1.1403080939310817 2.5139897471992279 1.1306130592123627 2.5124633407154864 1.1210299264371137 2.5102026254180569 1.1116523473795883 2.5072542888711151 1.1025559225037624 2.5036740970817104 1.0938008009317788 2.4995216513041658 1.0854335528720971 2.4894389793983525 1.0682545848793696 2.4833268717677801 1.059586370186764 2.4766039156521051 1.0515162197365 2.4693469754066948 1.0440667267110091 2.4616267851044293 1.0372520654645236 2.4535066180164891 1.0310798876895924 2.445040817365741 1.0255535774537705 2.4181849235774089 1.0106097220023136 2.3988107391449209 1.0033003027100977 2.3785814050729033 0.99878996126697306 2.3579136853392413 0.99714350899884596 2.3372199636045297 0.99837210809301724 2.3169123518799508 1.0024684679391307 2.2974086837081762 1.009371761947458 2.2707510809045184 1.0234708391771508 2.2626217310887444 1.0284897710688863 2.2547885547628952 1.0340892789857246 2.2472963604958855 1.0402666478468998 2.24019658789204 1.0470163225578755 2.2335464221571057 1.0543284276539069 2.2274081230934186 1.0621876790495597 2.21645405664332 1.0787087767248305 2.2116013279111604 1.0873445808501536 2.2073612289049551 1.0964483186209975 2.2038077327358638 1.1059731897490785 2.2010112543654383 1.1158549285554715 2.1990337638463453 1.1260097624237517 2.1979195332500479 1.1363308368903215 2.1974474267912747 1.1563425267323342 2.1979775274935673 1.1660349832256913 2.1992722496118424 1.175642167352472 2.2013074986723735 1.185067924670004 2.2040402363510845 1.1942333782340526 2.2074169150015321 1.2030746413748339 2.2113786016266168 1.2115411822399724 2.2210689139232094 1.2289450981366352 2.2269826135717889 1.2377444494294323 2.2335218370703096 1.2459566926865131 2.2406088383639302 1.2535568707461198 2.2481717821114025 1.2605293360737604 2.2561463705065368 1.2668655829017634 2.2644774933221616 1.2725618460156369 2.2910186132777173 1.288082955578453 2.3102535793187227 1.2957971742529191 2.3303946297332825 1.3007210744215394 2.3510262684829266 1.3027859962867125 2.371736036811134 1.3019771495875034 2.3921123252206709 1.298297733210946 2.4117364968236794 1.2918044519491163 2.4391835336785435 1.2780286215120875 2.4479081476945974 1.2728493958276725 2.4563087991963068 1.267012808798873 2.4643324990005886 1.2605217312820252 2.4719179254945098 1.2533824526069131 2.4789965704215398 1.2456066462027628 2.4854935619571807 1.2372127466299649 2.4967667285596549 1.2198506792962571 2.5016334779085585 1.210954436903668 2.505850951064815 1.2015745313007971 2.50933959915002 1.1917640480797689 2.5120251248372414 1.1815950578558718 2.5138437849559265 1.1711607131600001 2.5147527697023211 1.1605789847800685 2.5147527708300448 1.1500000000000001 + 0 9 0.073841945479720381 7 0.15965895039044564 7 0.33670575571798533 7 0.41799836750696001 7 0.49687770121375635 7 0.57050640050360513 7 0.6559889661311874 7 0.8329958105429861 7 0.91943143228834223 7 1 9 +8 0.43213918000000001 1 +7 0 0 8 72 11 0 0.86191655651529053 0.064612707126122285 0.86191655636031639 0.12924573020869121 0.86180212960782876 0.19354585986298964 0.86157309471124233 0.25729591690538955 0.86123710569662681 0.32035639097241991 0.86080711576441327 0.38262860369931784 0.86029917448633375 0.44403939645806323 0.85973055859759218 0.57486795355127818 0.85840661295606324 0.64400287432181769 0.8576356184560977 0.71204890605829063 0.85683016101856957 0.77910182489199642 0.85601437172442674 0.84525947275372759 0.85521024659702238 0.91062833301552482 0.85443688833397569 0.97533359101421147 0.85371034777523858 1.1719801299999779 0.8516694748625373 1.3022834888085997 0.85055125474431648 1.4314766584552194 0.84981092916349099 1.5601041519930758 0.84953067224803502 1.6887037287030167 0.84974121718316986 1.8178002752140883 0.85041758551901458 1.9479294730813748 0.85148259056302278 2.1407247176672937 0.85343205566261304 2.2018224006555265 0.85410272515975061 2.2634785459984945 0.85481960219092434 2.3257994445130423 0.85556959404676192 2.3888785304934377 0.85633723805263062 2.4528042944244755 0.85710477479283032 2.5176668897311782 0.85785258844583878 2.6475037518401474 0.85924643915066878 2.7124548059952787 0.85989523815533475 2.7784031961347284 0.86048634285730596 2.8452977635683716 0.86099861475006978 2.9130442766767723 0.86141139853000781 2.9815018328086702 0.86170704183096547 3.0504461980454147 0.8618740676459411 3.1838901307005112 0.86194486627902545 3.2484167898623117 0.86186545349851917 3.3126788740444084 0.86167068082639886 3.3764467099490378 0.86136675926777828 3.439568492257342 0.86096553909032658 3.5019324141407755 0.86048240230117967 3.5634497971151728 0.85993438588595073 3.6944264688738575 0.85864675673827295 3.763611831524952 0.85789009239059277 3.831698590852211 0.85709334149357019 3.8987747301284301 0.85628081102628562 3.96493344513729 0.85547481624035604 4.0302782166345557 0.85469482642125105 4.0949324433709124 0.85395725639069375 4.2918279602021681 0.85186504201537583 4.42230481064309 0.85069535227381643 4.5515912561482157 0.84989213745935965 4.680241461467225 0.8495424263176341 4.8088075381056594 0.84968267570503098 4.9378030231952801 0.85029371126386932 5.0677557379892928 0.85130349444005904 5.2639357073874811 0.85323083557927604 5.3287550797626038 0.8539312901781142 5.3941832619671581 0.85468713755682213 5.4603478208302398 0.85548307392919354 5.5273599902755972 0.85630075741284428 5.5953253964806722 0.85711888670277858 5.664353211856624 0.85791379283252311 5.8000085325218107 0.85935660743541886 5.8665260101888457 0.86001131025199462 5.934085587125824 0.86060297662612295 6.002619791362406 0.86110894688684436 6.0720165141401674 0.86150739360839024 6.1421140407577868 0.86178021334686006 6.212658741979129 0.86191655634613185 6.2831853071795862 0.86191655651529053 + 0 9 0.073841945479720381 7 0.15965895039044564 7 0.33670575571798533 7 0.41799836750696001 7 0.49687770121375635 7 0.57050640050360513 7 0.6559889661311874 7 0.8329958105429861 7 0.91943143228834223 7 1 9 +8 0 0.43213918000000001 +7 0 0 8 72 11 2.5147527708300452 1.1500000000000001 2.5147527697968846 1.1403080939310817 2.5139897471992279 1.1306130592123627 2.5124633407154864 1.1210299264371137 2.5102026254180569 1.1116523473795883 2.5072542888711151 1.1025559225037624 2.5036740970817104 1.0938008009317788 2.4995216513041658 1.0854335528720971 2.4894389793983525 1.0682545848793696 2.4833268717677801 1.059586370186764 2.4766039156521051 1.0515162197365 2.4693469754066948 1.0440667267110091 2.4616267851044293 1.0372520654645236 2.4535066180164891 1.0310798876895924 2.445040817365741 1.0255535774537705 2.4181849235774089 1.0106097220023136 2.3988107391449209 1.0033003027100977 2.3785814050729033 0.99878996126697306 2.3579136853392413 0.99714350899884596 2.3372199636045297 0.99837210809301724 2.3169123518799508 1.0024684679391307 2.2974086837081762 1.009371761947458 2.2707510809045184 1.0234708391771508 2.2626217310887444 1.0284897710688863 2.2547885547628952 1.0340892789857246 2.2472963604958855 1.0402666478468998 2.24019658789204 1.0470163225578755 2.2335464221571057 1.0543284276539069 2.2274081230934186 1.0621876790495597 2.21645405664332 1.0787087767248305 2.2116013279111604 1.0873445808501536 2.2073612289049551 1.0964483186209975 2.2038077327358638 1.1059731897490785 2.2010112543654383 1.1158549285554715 2.1990337638463453 1.1260097624237517 2.1979195332500479 1.1363308368903215 2.1974474267912747 1.1563425267323342 2.1979775274935673 1.1660349832256913 2.1992722496118424 1.175642167352472 2.2013074986723735 1.185067924670004 2.2040402363510845 1.1942333782340526 2.2074169150015321 1.2030746413748339 2.2113786016266168 1.2115411822399724 2.2210689139232094 1.2289450981366352 2.2269826135717889 1.2377444494294323 2.2335218370703096 1.2459566926865131 2.2406088383639302 1.2535568707461198 2.2481717821114025 1.2605293360737604 2.2561463705065368 1.2668655829017634 2.2644774933221616 1.2725618460156369 2.2910186132777173 1.288082955578453 2.3102535793187227 1.2957971742529191 2.3303946297332825 1.3007210744215394 2.3510262684829266 1.3027859962867125 2.371736036811134 1.3019771495875034 2.3921123252206709 1.298297733210946 2.4117364968236794 1.2918044519491163 2.4391835336785435 1.2780286215120875 2.4479081476945974 1.2728493958276725 2.4563087991963068 1.267012808798873 2.4643324990005886 1.2605217312820252 2.4719179254945098 1.2533824526069131 2.4789965704215398 1.2456066462027628 2.4854935619571807 1.2372127466299649 2.4967667285596549 1.2198506792962571 2.5016334779085585 1.210954436903668 2.505850951064815 1.2015745313007971 2.50933959915002 1.1917640480797689 2.5120251248372414 1.1815950578558718 2.5138437849559265 1.1711607131600001 2.5147527697023211 1.1605789847800685 2.5147527708300448 1.1500000000000001 + 0 9 0.073841945479720381 7 0.15965895039044564 7 0.33670575571798533 7 0.41799836750696001 7 0.49687770121375635 7 0.57050640050360513 7 0.6559889661311874 7 0.8329958105429861 7 0.91943143228834223 7 1 9 +8 0 0.43213918000000001 +7 0 0 8 72 11 0 0.86191655651529053 0.064612707126122285 0.86191655636031639 0.12924573020869121 0.86180212960782876 0.19354585986298964 0.86157309471124233 0.25729591690538955 0.86123710569662681 0.32035639097241991 0.86080711576441327 0.38262860369931784 0.86029917448633375 0.44403939645806323 0.85973055859759218 0.57486795355127818 0.85840661295606324 0.64400287432181769 0.8576356184560977 0.71204890605829063 0.85683016101856957 0.77910182489199642 0.85601437172442674 0.84525947275372759 0.85521024659702238 0.91062833301552482 0.85443688833397569 0.97533359101421147 0.85371034777523858 1.1719801299999779 0.8516694748625373 1.3022834888085997 0.85055125474431648 1.4314766584552194 0.84981092916349099 1.5601041519930758 0.84953067224803502 1.6887037287030167 0.84974121718316986 1.8178002752140883 0.85041758551901458 1.9479294730813748 0.85148259056302278 2.1407247176672937 0.85343205566261304 2.2018224006555265 0.85410272515975061 2.2634785459984945 0.85481960219092434 2.3257994445130423 0.85556959404676192 2.3888785304934377 0.85633723805263062 2.4528042944244755 0.85710477479283032 2.5176668897311782 0.85785258844583878 2.6475037518401474 0.85924643915066878 2.7124548059952787 0.85989523815533475 2.7784031961347284 0.86048634285730596 2.8452977635683716 0.86099861475006978 2.9130442766767723 0.86141139853000781 2.9815018328086702 0.86170704183096547 3.0504461980454147 0.8618740676459411 3.1838901307005112 0.86194486627902545 3.2484167898623117 0.86186545349851917 3.3126788740444084 0.86167068082639886 3.3764467099490378 0.86136675926777828 3.439568492257342 0.86096553909032658 3.5019324141407755 0.86048240230117967 3.5634497971151728 0.85993438588595073 3.6944264688738575 0.85864675673827295 3.763611831524952 0.85789009239059277 3.831698590852211 0.85709334149357019 3.8987747301284301 0.85628081102628562 3.96493344513729 0.85547481624035604 4.0302782166345557 0.85469482642125105 4.0949324433709124 0.85395725639069375 4.2918279602021681 0.85186504201537583 4.42230481064309 0.85069535227381643 4.5515912561482157 0.84989213745935965 4.680241461467225 0.8495424263176341 4.8088075381056594 0.84968267570503098 4.9378030231952801 0.85029371126386932 5.0677557379892928 0.85130349444005904 5.2639357073874811 0.85323083557927604 5.3287550797626038 0.8539312901781142 5.3941832619671581 0.85468713755682213 5.4603478208302398 0.85548307392919354 5.5273599902755972 0.85630075741284428 5.5953253964806722 0.85711888670277858 5.664353211856624 0.85791379283252311 5.8000085325218107 0.85935660743541886 5.8665260101888457 0.86001131025199462 5.934085587125824 0.86060297662612295 6.002619791362406 0.86110894688684436 6.0720165141401674 0.86150739360839024 6.1421140407577868 0.86178021334686006 6.212658741979129 0.86191655634613185 6.2831853071795862 0.86191655651529053 + 0 9 0.073841945479720381 7 0.15965895039044564 7 0.33670575571798533 7 0.41799836750696001 7 0.49687770121375635 7 0.57050640050360513 7 0.6559889661311874 7 0.8329958105429861 7 0.91943143228834223 7 1 9 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +1 0 0 1 0 +2 0 0 1 0 -0 1 0.13 +1 0 0 1 0 +2 0 0 1 0 -0 1 0.14999999999999999 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +7 0 0 8 58 9 0 0.84999999999999987 0.066219598462883555 0.84999999913914537 0.13229230998977201 0.85008915220455861 0.19741071392672083 0.8502667683702001 0.26126732658638718 0.85052273477615459 0.32377396440705936 0.85084388710959791 0.38497601664240005 0.85121737280433707 0.44507281173039431 0.85163219976231908 0.56948233112896041 0.85257070859111572 0.63358959270603066 0.85310048868405941 0.69752688942511165 0.85366047238114484 0.76193421637872261 0.85424298923330988 0.8273237271914603 0.85484078393305152 0.89461159393219347 0.85544528441588719 0.9645330968464676 0.85604810168197187 1.0711007134548605 0.85688191770330924 1.1025933837917017 0.85711853515519443 1.1340913752362842 0.85734386313730504 1.1655947298759128 0.85755647756201414 1.1971034071818207 0.85775507002337781 1.2286172840091707 0.85793844779713557 1.2601361545970542 0.85810553384071075 1.3389425127905732 0.85848010395086016 1.3862434300882465 0.8586660988849707 1.4335531664148331 0.8588101554234151 1.480867857284857 0.85890988346591057 1.528186387013746 0.85896375367680178 1.5755080810775259 0.85897113249642831 1.6228307935925168 0.8589322974710849 1.7346402493129238 0.85873413326926218 1.7941673422750319 0.85854498055462125 1.8494253004218832 0.8583051768029486 1.900888851285605 0.85803310727882398 1.9490339085309931 0.8577417765269334 1.9944259322900364 0.8574389717980746 2.0377619545062933 0.85712748678301087 2.1114471517149425 0.85656556026579789 2.1429373616771925 0.85631480425834505 2.1744234732502901 0.85605497810988751 2.205905791579688 0.85578763427635662 2.2373847477782722 0.85551437013422005 2.2688608989263575 0.85523682798048095 2.3003349280716896 0.85495669503267879 2.3839816336611017 0.85420988875649018 2.4351199350629451 0.85375087434421348 2.485728741117339 0.85330202610607908 2.5361454116036009 0.85286690583641978 2.5866458094004852 0.85244953806450063 2.6374787772234831 0.85205449758481289 2.6888778325603853 0.85168697334773191 2.7886586098155259 0.85104878513152438 2.8369227066380098 0.85077224953619945 2.8859969672634476 0.85052853777204696 2.9359050657212715 0.85032359756945619 2.9866049165615367 0.85016370781779127 3.0379761931418181 0.85005458026513847 3.0897802791824049 0.8499999993264391 3.1415926535897931 0.84999999999999976 + 0 9 0.14079435579561092 7 0.29497196915038909 7 0.35963172349361244 7 0.4566160594684977 7 0.588796716995306 7 0.68746682948596005 7 0.85103750386005472 7 1 9 +7 0 0 8 58 9 6.2831853071795862 0.87000000000000011 6.274123677916247 0.86999999370913816 6.2650820870876585 0.87065154376169906 6.256230831027719 0.87194929062480919 6.247669181414496 0.87383823926053128 6.2394523655660166 0.87625544131474553 6.2316048766950729 0.87914453825118577 6.2241264461789783 0.88246189752572235 6.2091898825206924 0.89027891856302988 6.2018091481619848 0.89485706192162007 6.1947974709950993 0.89992018656211537 6.1881319273628712 0.90549267410945278 6.1817992015205157 0.91159631328050705 6.1758067770016778 0.91831938984979844 6.1701644283790511 0.92573249614691444 6.1627254268942675 0.93767735007194353 6.1606610229352761 0.94128190429019376 6.158733760941228 0.9449563667942138 6.1569468851935572 0.94869528921708735 6.1553033359292568 0.95249308146507927 6.1538057493408775 0.95634401171763506 6.1524564575765259 0.96024220642738123 6.1494591336786861 0.97009049352451138 6.1479986499286392 0.97609312425199024 6.1468832822183028 0.98216835353420706 6.1461180489571658 0.98829512009711207 6.145706062359209 0.99445237141706877 6.1456486648811506 1.0006189632662799 6.1459453819753573 1.0067735777475404 6.1474772764612053 1.0212371271328207 6.148945958357813 1.0288761676392935 6.1508279642600439 1.0358654763702093 6.153002260326387 1.042258671527297 6.1553816381296187 1.0481206850563913 6.1579122679352674 1.0535302200611976 6.1605801190821881 1.0585782207079024 6.1655305648262262 1.0669422485911431 6.1677820218999404 1.0704448901954082 6.170165607161576 1.0738698522352905 6.1726776755216424 1.0772119564027276 6.1753143488182056 1.0804662189316701 6.1780715158168924 1.0836278505980821 6.1809448322108844 1.0866922567199426 6.1888779283186457 1.0945665952969792 6.1940348953779978 1.0991017539490948 6.1994065534321718 1.1033070783798715 6.2050011066281234 1.1072028997441776 6.2108277764487552 1.1107968875112233 6.2168965805037972 1.1140880064529868 6.223218960221919 1.117066180082299 6.2358106344546211 1.1221234040122863 6.2420371889454449 1.1242602534217325 6.2484882896653682 1.1261039332875034 6.2551523515922529 1.1276284674450792 6.2620050304470523 1.128803835833855 6.2690061522407907 1.1296010551028626 6.2760951927869986 1.1300000049221754 6.2831853071795862 1.1299999999999999 + 0 9 0.14079435579561092 7 0.29497196915038909 7 0.35963172349361244 7 0.4566160594684977 7 0.588796716995306 7 0.68746682948596005 7 0.85103750386005472 7 1 9 +7 0 0 8 58 9 3.1415926535897931 0.84999999999999976 3.2047178221402373 0.85000000082062699 3.2677415566003973 0.85008101068163233 3.3299449168893789 0.85024259595268015 3.3910264040379108 0.85047635468074478 3.4508815134797159 0.85077103621011096 3.5095288444999584 0.85111538169619083 3.5671188473490822 0.85149954248781401 3.6895658192012704 0.85239650958754343 3.7541263223501495 0.85291964561910794 3.818376582404865 0.85347553212249094 3.8829340891189252 0.85405600846448471 3.9483143540340646 0.85465349566381132 4.0153800776711925 0.85525958942456204 4.0848747711360165 0.85586615881216344 4.2095596153042045 0.8568645934913568 4.2609133705937179 0.85725271253173463 4.3150390661625604 0.85763206516976276 4.3732419793470614 0.85800034468690456 4.4364750904794805 0.85834350333328169 4.5054068595512753 0.85863718204415918 4.5808278167619436 0.85884276409341098 4.6949805168170782 0.85894295859165493 4.7265278090630671 0.85895032071516397 4.7580755692973877 0.85893718619403925 4.7896230422797439 0.85890356121134503 4.8211693717516848 0.85884962808911725 4.8527136004366112 0.85877574528836265 4.8842546700397778 0.85868244740905852 4.9512702210595876 0.85844444285476174 4.9867462729178733 0.85829475073880979 5.0222153245600074 0.8581223766555397 5.0576767367923212 0.85792857506828113 5.0931316953750256 0.85771482953534162 5.12858142290664 0.85748283515489099 5.1640253907084119 0.85723448100984978 5.2309570932999749 0.85673836329967346 5.2624501931158374 0.85649355577355801 5.2939389449124743 0.8562388785069488 5.3254235947921806 0.85597585204037208 5.3569045202033658 0.85570604898236291 5.3883822299405679 0.85543109400946538 5.4198573641444465 0.8551526638662319 5.5038782318290975 0.85440470765690069 5.5552475375077979 0.85394244917052697 5.6059738437770266 0.85348919802090595 5.6564069480615444 0.85304850123775133 5.7068320445954068 0.85262427565439347 5.7575068662420454 0.85222090647378157 5.8086732330824349 0.85184332449602895 5.9106524098403517 0.85116368387005092 5.9614420436231885 0.85085918209556288 6.0131154697420452 0.85058957527927637 6.0657249992310938 0.85036180636122205 6.119237766184396 0.85018333905768806 6.1735305766470869 0.85006113873502309 6.2283461543579355 0.85000000071290893 6.2831853071795871 0.84999999999999976 + 0 9 0.20596730384692036 7 0.44368383357270402 7 0.60514289218842465 7 0.66680163654742453 7 0.73616763538685281 7 0.7978273762506124 7 0.90077382426757679 7 1 9 +7 0 0 8 58 9 0 1.1299999999999999 0.0086381809595322025 1.1299999940031089 0.017262524877675448 1.1294079626582381 0.025722907774901892 1.128227312781658 0.033928067668207169 1.1265039019794363 0.041825217415690119 1.1242921398285946 0.049389014688393393 1.1216422750859287 0.056616031536570313 1.1185946651933789 0.071490059479277168 1.1112105923897 0.079023974987107684 1.1067507438198789 0.086178376884467223 1.101801264585025 0.09297722127594589 1.0963450202162162 0.099435533591396008 1.0903636771084917 0.10555042246974404 1.0837793774986084 0.11131624275759171 1.0765232348773681 0.12034319592416753 1.0627323499475245 0.12372223969081529 1.0568537812650862 0.12692609055068349 1.0504787852923456 0.12994476851171669 1.0434360989057201 0.13267942566296281 1.0355856662796195 0.13496304857690475 1.0268309045958102 0.1365489213254576 1.0170875440299574 0.13732057270330206 1.0022654717398305 0.13737691581262651 0.99816197831772735 0.13727598455992332 0.99405742281944509 0.13701778437534706 0.98995813248438813 0.13660269724980784 0.98587041939048636 0.13603148173497134 0.98180058045419583 0.13530527294325878 0.9777548974304987 0.13343593211656504 0.96922247459798516 0.13225192752397841 0.96474344721901262 0.13087583451202839 0.96031172747848892 0.12931032530523065 0.9559359289837458 0.12755853796027916 0.95162428951051392 0.12562413571565034 0.94738485426649244 0.12351136634120731 0.94322565915492096 0.11919286840170255 0.93553641083453387 0.11702333481873418 0.93198739543514897 0.11471981504009969 0.92851331539090542 0.11228584264027358 0.92511942692710303 0.10972519046700416 0.92181079494343288 0.10704187064131333 0.91859229301397638 0.10424013455749687 0.9154686033872047 0.096456515139690599 0.90739473359413836 0.091379648855932569 0.90273475413539583 0.086089953495579602 0.89841251334245098 0.080580537855307194 0.89440449722865911 0.074842960538239175 0.89070017315110395 0.068867447431417317 0.88729769161764249 0.062642064953042725 0.88420437640941085 0.049894524132731252 0.87876731270391051 0.04338734572938175 0.87639890508868523 0.036626765345237608 0.87435047328128213 0.029622931695382972 0.8726524937450818 0.022401135192405001 0.8713397327376502 0.015005398472097564 0.87044679843357375 0.007504305122960811 0.87000000520971965 0 0.87000000000000011 + 0 9 0.20596730384692036 7 0.44368383357270402 7 0.60514289218842465 7 0.66680163654742453 7 0.73616763538685281 7 0.7978273762506124 7 0.90077382426757679 7 1 9 +1 0 0 1 0 +2 0 0 1 0 -0 1 0.13 +1 0 0 1 0 +2 0 0 1 0 -0 1 0.14999999999999999 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +8 0 0.43213918000000001 +7 0 0 8 72 11 0 0.85893647999848888 0.064861897947164834 0.85893647999848888 0.12973042171217131 0.85885013574865943 0.19417569391513553 0.85867740855830277 0.25795689449264081 0.85842464257783635 0.3209291459059106 0.8581022483559767 0.38300894607144731 0.85772257710540623 0.44417121612850652 0.85729825239785973 0.57410018150605224 0.85631316366234234 0.64258853796098458 0.85574131892481853 0.71013016822021457 0.8551428382963675 0.77690216303009063 0.85453420021051019 0.84306461749434081 0.85393076484818276 0.90877874374944423 0.8533465313920886 0.97422311400669892 0.85279410272214806 1.1684925365731071 0.85128105100916029 1.2986387627962426 0.85043341828261421 1.4290682203287923 0.84985630489132646 1.5596623634692472 0.84963421135537309 1.6903001130486919 0.84979987130081303 1.8208328157986464 0.85032782063386358 1.9511078058575155 0.85113772055628345 2.1417530030802738 0.85258440330952578 2.2035782609144499 0.85309465102001247 2.2655974413453759 0.8536367199701006 2.3279561039833454 0.85420013610803058 2.390790061132881 0.85477338388660229 2.4542374091647838 0.85534393887505444 2.5184532063268517 0.85589839692744596 2.6473932917036009 0.85693568320129621 2.7120933295812208 0.85741992819192192 2.7778208157807831 0.857861542173744 2.8445889807230031 0.85824529585603182 2.9123375937794496 0.85855560024215782 2.9809355755889193 0.85877851361413515 3.050139889398892 0.85890455329089943 3.1841175932900803 0.85895775954498865 3.2488739930127779 0.85889780193167053 3.31329327609303 0.85875079824637957 3.3771076124984418 0.85852201256653826 3.440155495623936 0.85822102781499687 3.5023375885711268 0.85785975620352217 3.5636017781479512 0.85745082109414639 3.6937291984492995 0.85649245120394557 3.762318447582131 0.85593082906475171 3.8299271339983587 0.85533865252464625 3.8967261431028568 0.85473256558366151 3.9628728737761278 0.85412810552490215 4.0285281431971409 0.85353941159590141 4.0938724184069297 0.85297918442443088 4.2880684868757744 0.85143068557333346 4.4180858167072188 0.85054696282356834 4.5484009568323716 0.84992197464711172 4.6789345324202927 0.84964391455978716 4.8095983542375631 0.84975255676698758 4.9402216520929132 0.8502299071629178 5.0706231561507416 0.8510002767102699 5.2651226763495664 0.85243433687630754 5.3307736870065332 0.85296801164223768 5.3966142036358997 0.85354009560431987 5.4628171473792033 0.85413818864159718 5.5295426548859643 0.85474856275711264 5.5969540422965274 0.85535620776357912 5.6652377314536153 0.85594500547648977 5.7998691103770623 0.85701800469362022 5.8661151324476375 0.85750655903719086 5.9334463200598488 0.85794864171406582 6.0018596697936033 0.85832785394961619 6.0712741181855856 0.8586276133427192 6.1415323092262 0.85883350781390044 6.2123525341476284 0.85893647999848888 6.2831853071795862 0.85893647999848888 + 0 9 0.075357895493250907 7 0.16242872596973951 7 0.33405974862499205 7 0.41637394058885624 7 0.49691097150549302 7 0.57200500261053622 7 0.65881447484231137 7 0.83037018105172034 7 0.91779788640262461 7 1 9 +8 0 0.43213918000000001 +7 0 0 8 72 11 2.493467313683551 1.1500000000000001 2.493467313683551 1.1415679532668683 2.4928031076576671 1.133135031276965 2.4914745221230206 1.1248112619066606 2.4895121158410882 1.1166818036303792 2.486960801142724 1.1088118091066748 2.4838714332906355 1.1012493994271155 2.4802957373496493 1.0940277763702753 2.4716399686019654 1.0792409256650637 2.4664113695977115 1.0717948412379577 2.4606541515447131 1.0648429720185941 2.4544209315452319 1.0583984389095791 2.4477582833156437 1.0524728211563799 2.4407070653276035 1.047076319395519 2.4333017310561282 1.0422190190139236 2.4103253817496597 1.0294258777418035 2.3936320374685556 1.022983226508599 2.3759472803376971 1.0189380539946229 2.3577478193076469 1.017436221527297 2.339511999703364 1.0185496919203973 2.3217227994904537 1.0222235327306586 2.3048717982877078 1.0283250991057313 2.28204185960842 1.0404058638719043 2.2749258471615463 1.0448189705199458 2.2681175267544611 1.049717834582955 2.261645671643798 1.0550928947160243 2.2555432374606004 1.0609349730734177 2.2498470938731536 1.0672346326396636 2.2445985057018589 1.0739824186315814 2.2351928630647442 1.0882023699810643 2.231013539813024 1.0956575498259524 2.2273568970763811 1.1035187953946417 2.2242840111802429 1.1117549754242362 2.2218578880072433 1.1203170332447969 2.2201374873458359 1.1291349946821567 2.2191673127249545 1.1381135803423681 2.2187579336883783 1.1555264205678075 2.21921979115052 1.1639565136290542 2.2203471596336293 1.1723027696279913 2.2221151674934485 1.1804763273156329 2.2244813856554457 1.1884081281930663 2.2273958098209583 1.1960460938560409 2.2308073878675971 1.2033528227420063 2.2391289506277214 1.2183392147336538 2.2441918418565669 1.2259028924610857 2.2497942796795201 1.2329785863725917 2.2558820618156026 1.2395519825934054 2.2624072234433048 1.2456112287909304 2.2693279555070709 1.2511464611097989 2.2766094880407772 1.2561483357143595 2.2992778159721712 1.2694140864932304 2.3158061047782752 1.276194001681825 2.3333763651785113 1.2806075823672609 2.351527961806315 1.2824970134348457 2.3697886229769138 1.2817740876326462 2.3876722611656409 1.2784760538147006 2.4046738160333709 1.2727211254279249 2.4282426793638816 1.2608866975083757 2.4358864335665951 1.2563261217318653 2.4431898120855822 1.2512144209504608 2.4501185971459782 1.2455633174002454 2.4566335041673342 1.2393839935120026 2.4626905190673449 1.2326879446683394 2.468240167142755 1.225486566061547 2.4779132716488856 1.2105524397844554 2.4821039681614434 1.2028742827042584 2.485741678436586 1.1947750640181567 2.4887599385170733 1.1862909731351019 2.4910915409252588 1.1774779640377404 2.4926751833927234 1.1684149165903766 2.493467313683551 1.1592082604941545 2.493467313683551 1.1500000000000001 + 0 9 0.075357895493250907 7 0.16242872596973951 7 0.33405974862499205 7 0.41637394058885624 7 0.49691097150549302 7 0.57200500261053622 7 0.65881447484231137 7 0.83037018105172034 7 0.91779788640262461 7 1 9 +8 0.43213918000000001 1 +7 0 0 8 72 11 0 0.85893647999848888 0.064861897947164834 0.85893647999848888 0.12973042171217131 0.85885013574865943 0.19417569391513553 0.85867740855830277 0.25795689449264081 0.85842464257783635 0.3209291459059106 0.8581022483559767 0.38300894607144731 0.85772257710540623 0.44417121612850652 0.85729825239785973 0.57410018150605224 0.85631316366234234 0.64258853796098458 0.85574131892481853 0.71013016822021457 0.8551428382963675 0.77690216303009063 0.85453420021051019 0.84306461749434081 0.85393076484818276 0.90877874374944423 0.8533465313920886 0.97422311400669892 0.85279410272214806 1.1684925365731071 0.85128105100916029 1.2986387627962426 0.85043341828261421 1.4290682203287923 0.84985630489132646 1.5596623634692472 0.84963421135537309 1.6903001130486919 0.84979987130081303 1.8208328157986464 0.85032782063386358 1.9511078058575155 0.85113772055628345 2.1417530030802738 0.85258440330952578 2.2035782609144499 0.85309465102001247 2.2655974413453759 0.8536367199701006 2.3279561039833454 0.85420013610803058 2.390790061132881 0.85477338388660229 2.4542374091647838 0.85534393887505444 2.5184532063268517 0.85589839692744596 2.6473932917036009 0.85693568320129621 2.7120933295812208 0.85741992819192192 2.7778208157807831 0.857861542173744 2.8445889807230031 0.85824529585603182 2.9123375937794496 0.85855560024215782 2.9809355755889193 0.85877851361413515 3.050139889398892 0.85890455329089943 3.1841175932900803 0.85895775954498865 3.2488739930127779 0.85889780193167053 3.31329327609303 0.85875079824637957 3.3771076124984418 0.85852201256653826 3.440155495623936 0.85822102781499687 3.5023375885711268 0.85785975620352217 3.5636017781479512 0.85745082109414639 3.6937291984492995 0.85649245120394557 3.762318447582131 0.85593082906475171 3.8299271339983587 0.85533865252464625 3.8967261431028568 0.85473256558366151 3.9628728737761278 0.85412810552490215 4.0285281431971409 0.85353941159590141 4.0938724184069297 0.85297918442443088 4.2880684868757744 0.85143068557333346 4.4180858167072188 0.85054696282356834 4.5484009568323716 0.84992197464711172 4.6789345324202927 0.84964391455978716 4.8095983542375631 0.84975255676698758 4.9402216520929132 0.8502299071629178 5.0706231561507416 0.8510002767102699 5.2651226763495664 0.85243433687630754 5.3307736870065332 0.85296801164223768 5.3966142036358997 0.85354009560431987 5.4628171473792033 0.85413818864159718 5.5295426548859643 0.85474856275711264 5.5969540422965274 0.85535620776357912 5.6652377314536153 0.85594500547648977 5.7998691103770623 0.85701800469362022 5.8661151324476375 0.85750655903719086 5.9334463200598488 0.85794864171406582 6.0018596697936033 0.85832785394961619 6.0712741181855856 0.8586276133427192 6.1415323092262 0.85883350781390044 6.2123525341476284 0.85893647999848888 6.2831853071795862 0.85893647999848888 + 0 9 0.075357895493250907 7 0.16242872596973951 7 0.33405974862499205 7 0.41637394058885624 7 0.49691097150549302 7 0.57200500261053622 7 0.65881447484231137 7 0.83037018105172034 7 0.91779788640262461 7 1 9 +8 0.43213918000000001 1 +7 0 0 8 72 11 2.493467313683551 1.1500000000000001 2.493467313683551 1.1415679532668683 2.4928031076576671 1.133135031276965 2.4914745221230206 1.1248112619066606 2.4895121158410882 1.1166818036303792 2.486960801142724 1.1088118091066748 2.4838714332906355 1.1012493994271155 2.4802957373496493 1.0940277763702753 2.4716399686019654 1.0792409256650637 2.4664113695977115 1.0717948412379577 2.4606541515447131 1.0648429720185941 2.4544209315452319 1.0583984389095791 2.4477582833156437 1.0524728211563799 2.4407070653276035 1.047076319395519 2.4333017310561282 1.0422190190139236 2.4103253817496597 1.0294258777418035 2.3936320374685556 1.022983226508599 2.3759472803376971 1.0189380539946229 2.3577478193076469 1.017436221527297 2.339511999703364 1.0185496919203973 2.3217227994904537 1.0222235327306586 2.3048717982877078 1.0283250991057313 2.28204185960842 1.0404058638719043 2.2749258471615463 1.0448189705199458 2.2681175267544611 1.049717834582955 2.261645671643798 1.0550928947160243 2.2555432374606004 1.0609349730734177 2.2498470938731536 1.0672346326396636 2.2445985057018589 1.0739824186315814 2.2351928630647442 1.0882023699810643 2.231013539813024 1.0956575498259524 2.2273568970763811 1.1035187953946417 2.2242840111802429 1.1117549754242362 2.2218578880072433 1.1203170332447969 2.2201374873458359 1.1291349946821567 2.2191673127249545 1.1381135803423681 2.2187579336883783 1.1555264205678075 2.21921979115052 1.1639565136290542 2.2203471596336293 1.1723027696279913 2.2221151674934485 1.1804763273156329 2.2244813856554457 1.1884081281930663 2.2273958098209583 1.1960460938560409 2.2308073878675971 1.2033528227420063 2.2391289506277214 1.2183392147336538 2.2441918418565669 1.2259028924610857 2.2497942796795201 1.2329785863725917 2.2558820618156026 1.2395519825934054 2.2624072234433048 1.2456112287909304 2.2693279555070709 1.2511464611097989 2.2766094880407772 1.2561483357143595 2.2992778159721712 1.2694140864932304 2.3158061047782752 1.276194001681825 2.3333763651785113 1.2806075823672609 2.351527961806315 1.2824970134348457 2.3697886229769138 1.2817740876326462 2.3876722611656409 1.2784760538147006 2.4046738160333709 1.2727211254279249 2.4282426793638816 1.2608866975083757 2.4358864335665951 1.2563261217318653 2.4431898120855822 1.2512144209504608 2.4501185971459782 1.2455633174002454 2.4566335041673342 1.2393839935120026 2.4626905190673449 1.2326879446683394 2.468240167142755 1.225486566061547 2.4779132716488856 1.2105524397844554 2.4821039681614434 1.2028742827042584 2.485741678436586 1.1947750640181567 2.4887599385170733 1.1862909731351019 2.4910915409252588 1.1774779640377404 2.4926751833927234 1.1684149165903766 2.493467313683551 1.1592082604941545 2.493467313683551 1.1500000000000001 + 0 9 0.075357895493250907 7 0.16242872596973951 7 0.33405974862499205 7 0.41637394058885624 7 0.49691097150549302 7 0.57200500261053622 7 0.65881447484231137 7 0.83037018105172034 7 0.91779788640262461 7 1 9 +Curves 40 +1 0 0 0 0 0 -1 +1 0 0.14999999999999999 0 0 0 -1 +1 0 0 0 0 1 0 +1 0.14999999999999999 0 0 0 0 -1 +1 0.14999999999999999 0.14999999999999999 0 0 0 -1 +1 0.14999999999999999 0 0 0 1 0 +1 0 0 0 1 0 0 +1 0 0 0 0 0 1 +1 0 0 0 0 1 0 +1 0 2 0 0 0 1 +1 0 0 0 1 0 0 +1 2 0 0 0 0 1 +1 2 0 0 0 1 0 +2 1 1 0.10000000000000001 0 0 1 1 0 -0 -0 1 0 0.94999999999999996 +1 2 2 0 0 0 1 +2 1 1 0.10000000000000001 0 0 1 1 0 -0 -0 1 0 0.90000000000000002 +7 0 0 8 72 11 0.26643896292146124 1.521429002722575 1.25 0.26643896349132645 1.521429003524277 1.2403015520909153 0.26686013881400383 1.5220214731675019 1.2306003698069188 0.26770249852970229 1.5232066719898247 1.2210128783693919 0.2689525125624696 1.5249594362703378 1.2116334137525824 0.27058912777455246 1.5272391257634976 1.2025376848668829 0.27258780383951881 1.5299970485873147 1.1937854933494239 0.27492256833414314 1.5331813634658866 1.1854227109619755 0.28064004033790735 1.5408768953989802 1.1682494708116995 0.28413301714930417 1.5455217631427103 1.1595835604791795 0.28801051119268517 1.5506023519981427 1.1515160871151753 0.2922406732841461 1.5560508588840578 1.1440688973344773 0.29679387782528738 1.5618049195456594 1.1372557532262881 0.30164294638583505 1.567808922687868 1.1310841242860898 0.30676403239003702 1.5740151068935997 1.12555739890319 0.32321374325240793 1.5935110262901762 1.1106205430515763 0.33536994265897924 1.6073375000841199 1.1033056658423601 0.34840662610161 1.6214808601334625 1.0987891019942975 0.36209677952282016 1.635590122614196 1.097139288354795 0.37617245757806439 1.6493509781020745 1.0983703615046598 0.3903235400454001 1.6624908885115866 1.1024726748405405 0.40420104720090855 1.6747773911208723 1.1093822111423579 0.42350094438146968 1.6911674271264932 1.1234755700254171 0.42944224086083133 1.6961070373171521 1.1284952407085393 0.43521447739017793 1.700808665090892 1.13409465681211 0.44077829426009835 1.7052524705343184 1.1402710337832949 0.44608845761219107 1.7094162423264168 1.1470188947598492 0.45109450967700204 1.7132759534799227 1.1543286289989088 0.45574146128230336 1.7168058245101345 1.1621854859685512 0.46407206927093914 1.7230543133626908 1.1786997286431937 0.46778279930694927 1.7257958674563696 1.1873303162681021 0.47104189953142495 1.7281715925562271 1.1964301375458586 0.47378528842606493 1.7301489964969499 1.2059533307939176 0.47595136605262017 1.7316975063453617 1.2158362127022577 0.47748602562824538 1.7327896624885195 1.2259951300277496 0.47835112798048252 1.7334047370878862 1.2363227435623532 0.47871750873401653 1.7336651902556559 1.2563481073299625 0.47830590713001397 1.7333724794479461 1.2660466736318212 0.47730019216790698 1.7326583471503532 1.2756584794144941 0.47572116983722579 1.7315341430008393 1.2850865198757724 0.47360629655048109 1.7300193836341873 1.2942516731652678 0.47100236097931203 1.7281376866680678 1.3030902984670552 0.46796064238961699 1.7259147965618662 1.3115524984806823 0.46055440436508271 1.7204324888892069 1.3289511484322101 0.45605307634021391 1.7170617389158807 1.3377484745104402 0.45110240393601631 1.713301234797036 1.3459581030167105 0.44577090156490634 1.7091832607723798 1.3535558710131343 0.44012186249414609 1.7047378908902167 1.3605265985468376 0.43421178844325392 1.6999926512126577 1.366862020065881 0.42808914180143665 1.6949715562883989 1.3725584228467504 0.4087707984974227 1.6787759666795135 1.3880713757958907 0.39500328459345285 1.6667554034605021 1.3957902966013283 0.38087538906588292 1.6538280997218395 1.4007207340627521 0.36673979176042215 1.6402155377598642 1.4027900120130263 0.3529147460155071 1.6261808799928834 1.4019797850319546 0.33967718269256497 1.6120297709786042 1.3982949535504252 0.32726490516490769 1.5981088058016701 1.3917949327931016 0.31032438290521713 1.5782912888956309 1.3780235722812839 0.3050073003232639 1.5719280149081618 1.3728433452075761 0.29995442219161006 1.5657463272111583 1.3670066896745274 0.29518940036942198 1.5597926999447742 1.360516590247665 0.29073881347395852 1.5541210217916581 1.3533792693115569 0.2866314305983847 1.5487917610938418 1.3456061025364376 0.28289817958884461 1.5438710884314226 1.3372148845999685 0.27647474742058137 1.5352923747976901 1.3198600892236374 0.27372868918535115 1.5315683083452796 1.3109693186295643 0.27136873497113639 1.5283240984206299 1.3015934064125563 0.26942990937129063 1.5256286464713935 1.291784455515824 0.2679444639273465 1.5235470149659935 1.2816139787830885 0.26694071750161885 1.5221348760986779 1.2711751156736035 0.26643896354350843 1.5214290035976878 1.2605865258769158 0.26643896292146124 1.5214290027225745 1.25 + 0 9 0.073840985206690093 7 0.15970498882719014 7 0.33666247369529484 7 0.41799822796329628 7 0.49688139402059656 7 0.57050503096671323 7 0.65603456252404424 7 0.83295134410099214 7 0.91943110368423631 7 1 9 +7 0 0 8 72 11 0.26643896292146124 1.521429002722575 1.25 0.26643896349132645 1.521429003524277 1.2403015520909153 0.26686013881400383 1.5220214731675019 1.2306003698069188 0.26770249852970229 1.5232066719898247 1.2210128783693919 0.2689525125624696 1.5249594362703378 1.2116334137525824 0.27058912777455246 1.5272391257634976 1.2025376848668829 0.27258780383951881 1.5299970485873147 1.1937854933494239 0.27492256833414314 1.5331813634658866 1.1854227109619755 0.28064004033790735 1.5408768953989802 1.1682494708116995 0.28413301714930417 1.5455217631427103 1.1595835604791795 0.28801051119268517 1.5506023519981427 1.1515160871151753 0.2922406732841461 1.5560508588840578 1.1440688973344773 0.29679387782528738 1.5618049195456594 1.1372557532262881 0.30164294638583505 1.567808922687868 1.1310841242860898 0.30676403239003702 1.5740151068935997 1.12555739890319 0.32321374325240793 1.5935110262901762 1.1106205430515763 0.33536994265897924 1.6073375000841199 1.1033056658423601 0.34840662610161 1.6214808601334625 1.0987891019942975 0.36209677952282016 1.635590122614196 1.097139288354795 0.37617245757806439 1.6493509781020745 1.0983703615046598 0.3903235400454001 1.6624908885115866 1.1024726748405405 0.40420104720090855 1.6747773911208723 1.1093822111423579 0.42350094438146968 1.6911674271264932 1.1234755700254171 0.42944224086083133 1.6961070373171521 1.1284952407085393 0.43521447739017793 1.700808665090892 1.13409465681211 0.44077829426009835 1.7052524705343184 1.1402710337832949 0.44608845761219107 1.7094162423264168 1.1470188947598492 0.45109450967700204 1.7132759534799227 1.1543286289989088 0.45574146128230336 1.7168058245101345 1.1621854859685512 0.46407206927093914 1.7230543133626908 1.1786997286431937 0.46778279930694927 1.7257958674563696 1.1873303162681021 0.47104189953142495 1.7281715925562271 1.1964301375458586 0.47378528842606493 1.7301489964969499 1.2059533307939176 0.47595136605262017 1.7316975063453617 1.2158362127022577 0.47748602562824538 1.7327896624885195 1.2259951300277496 0.47835112798048252 1.7334047370878862 1.2363227435623532 0.47871750873401653 1.7336651902556559 1.2563481073299625 0.47830590713001397 1.7333724794479461 1.2660466736318212 0.47730019216790698 1.7326583471503532 1.2756584794144941 0.47572116983722579 1.7315341430008393 1.2850865198757724 0.47360629655048109 1.7300193836341873 1.2942516731652678 0.47100236097931203 1.7281376866680678 1.3030902984670552 0.46796064238961699 1.7259147965618662 1.3115524984806823 0.46055440436508271 1.7204324888892069 1.3289511484322101 0.45605307634021391 1.7170617389158807 1.3377484745104402 0.45110240393601631 1.713301234797036 1.3459581030167105 0.44577090156490634 1.7091832607723798 1.3535558710131343 0.44012186249414609 1.7047378908902167 1.3605265985468376 0.43421178844325392 1.6999926512126577 1.366862020065881 0.42808914180143665 1.6949715562883989 1.3725584228467504 0.4087707984974227 1.6787759666795135 1.3880713757958907 0.39500328459345285 1.6667554034605021 1.3957902966013283 0.38087538906588292 1.6538280997218395 1.4007207340627521 0.36673979176042215 1.6402155377598642 1.4027900120130263 0.3529147460155071 1.6261808799928834 1.4019797850319546 0.33967718269256497 1.6120297709786042 1.3982949535504252 0.32726490516490769 1.5981088058016701 1.3917949327931016 0.31032438290521713 1.5782912888956309 1.3780235722812839 0.3050073003232639 1.5719280149081618 1.3728433452075761 0.29995442219161006 1.5657463272111583 1.3670066896745274 0.29518940036942198 1.5597926999447742 1.360516590247665 0.29073881347395852 1.5541210217916581 1.3533792693115569 0.2866314305983847 1.5487917610938418 1.3456061025364376 0.28289817958884461 1.5438710884314226 1.3372148845999685 0.27647474742058137 1.5352923747976901 1.3198600892236374 0.27372868918535115 1.5315683083452796 1.3109693186295643 0.27136873497113639 1.5283240984206299 1.3015934064125563 0.26942990937129063 1.5256286464713935 1.291784455515824 0.2679444639273465 1.5235470149659935 1.2816139787830885 0.26694071750161885 1.5221348760986779 1.2711751156736035 0.26643896354350843 1.5214290035976878 1.2605865258769158 0.26643896292146124 1.5214290027225745 1.25 + 0 9 0.073840985206690093 7 0.15970498882719014 7 0.33666247369529484 7 0.41799822796329628 7 0.49688139402059656 7 0.57050503096671323 7 0.65603456252404424 7 0.83295134410099214 7 0.91943110368423631 7 1 9 +1 1.8999999999999999 0.99999999999999978 0.10000000000000001 0 0 1 +7 0 0 8 58 9 1.9000000000000001 1 1.25 1.9000000000000001 1.0093880752959545 1.25 1.8998880832610459 1.0187649903859017 1.2493284703966894 1.8996647018166788 1.0279849511063186 1.2479883163962766 1.8993400224023278 1.0369553979623227 1.2460235763863607 1.8989281057683478 1.0456204197795971 1.2434873970461049 1.898443405808026 1.0539513071063547 1.2404290889326322 1.8978988290386209 1.0619413747358664 1.2368870240038072 1.8966413120970558 1.0781531612894755 1.228394959563528 1.8959169399397395 1.0862839361134666 1.2233340896201734 1.8951434465554173 1.0940438257707878 1.2176980048932704 1.89433116546764 1.101453463522666 1.2114555709254144 1.8934896710799087 1.1085258689798945 1.2045819338858417 1.8926301641744767 1.1152547923449947 1.1969632122036855 1.8917633357365846 1.1216333305777615 1.1885148467821007 1.8905511256482403 1.1300960205128068 1.1748151898859336 1.8902082662538671 1.132433168198929 1.1707086572270211 1.8898801614201204 1.1346225568925705 1.1665179527003535 1.8895688830487023 1.1366606446913901 1.1622492155580182 1.8892763518132272 1.13854419744095 1.1579087732230904 1.8890043371592264 1.1402702887347194 1.1535031412896315 1.8887544573041453 1.1418362999140712 1.1490390235226897 1.8881887875166139 1.1453451928688092 1.1377502508463782 1.8879023608007075 1.1470856359500543 1.1308596062191529 1.8876737996442212 1.1484528117952542 1.1238760027188079 1.8875068715530723 1.1494408328971446 1.1168238288700643 1.8874041367529872 1.1500458475466495 1.1097274086035924 1.887366891952462 1.1502658186130665 1.10261119443425 1.8873951321002063 1.1501005953157648 1.0954999821941447 1.8876181420988547 1.1487771879055946 1.078409824986023 1.8878652566178007 1.1473060214762933 1.0693569548288295 1.8881870149169984 1.1453722874306784 1.0611625334072856 1.8885535654346151 1.1431279273311801 1.0537572564907296 1.8889435746121503 1.1406891091900386 1.0470401008698276 1.8893461803971268 1.1381152334941478 1.0408992929908816 1.8897585664549368 1.1354183467400225 1.0351962867768747 1.8905155853333513 1.1303341533287139 1.0256002540569336 1.8908607792867227 1.1279728765801869 1.0215066790845111 1.8912197984537851 1.1254653178975853 1.0174998373641404 1.8915904925448583 1.1228152053282998 1.0135857360639318 1.8919706421974414 1.120026518916142 1.009770156650033 1.8923579589762185 1.1171034907013448 1.0060586548866273 1.8927500853730539 1.1140506047205623 1.002456560835935 1.8938131227575463 1.1054872074549744 0.99305899082914617 1.894470393200363 1.0998889443014692 0.98763848979254176 1.8951116267021417 1.0940752228737132 0.98263600945233109 1.8957320491049765 1.0880404932173113 0.97801822269787475 1.896326489280475 1.0817779119906932 0.97376786428582762 1.896889259477581 1.0752796106041083 0.96987789996276708 1.8974140877923447 1.0685360944178837 0.9663522091952339 1.8983686721191195 1.0546072550567027 0.96008660598343842 1.8987995566224756 1.0474244619345621 0.95733756638704581 1.899178773107201 1.0399862429142961 0.95497438146016889 1.8994973429459678 1.0323049078383915 0.95302540846751493 1.8997457289288564 1.0244076463212879 0.95152540347741199 1.8999152152124208 1.0163400204251363 0.95050883252399088 1.899999999863816 1.0081710656159291 0.95000000081710667 1.9000000000000001 1 0.95000000000000007 + 0 9 0.13229762403004616 7 0.27996796770557875 7 0.34121855759820813 7 0.43308757253782593 7 0.56295171984466641 7 0.66292718998370481 7 0.8323436611939603 7 1 9 +2 1 1 2.1000000000000001 0 0 1 1 0 -0 -0 1 0 0.90000000000000002 +7 0 0 8 65 10 1.9000000000000001 1 0.95000000000000007 1.8999999998359873 0.99015923545926643 0.95000000098407644 1.8998770297925731 0.98033509753454751 0.95073785813964951 1.8996318025398464 0.97069271396954027 0.95220904801051087 1.8992765546679733 0.96133336368217981 0.95436069040668436 1.8988277380040512 0.95231609310861109 0.95713140947797215 1.898301882160667 0.94366929164190994 0.96046603673590358 1.8977134609564574 0.93539656952236416 0.96432332927482201 1.8967393455604853 0.92334653307577219 0.97097846333872073 1.8963898674737425 0.91929490774605149 0.97341033800932275 1.8960272163472021 0.91533252599395676 0.97598695067327523 1.8956535207788709 0.91146529550769506 0.9787044941420534 1.895270982706319 0.90769891121670299 0.98155890381998667 1.8948818774066802 0.90403885529164685 0.98454585770425695 1.8944885534966516 0.90049039714442281 0.98766077638489813 1.8936489251619688 0.89319783912386097 0.99454160206518949 1.8932020646853669 0.88948434783100805 0.9983406292344138 1.8927562661489798 0.88592564900214488 1.0022886481181392 1.8923149285253109 0.88252855544089626 1.0063784969559244 1.8918814085494604 0.87929932813401324 1.0106028806233669 1.8914589941555142 0.87624384108341935 1.0149541425942461 1.8910508779129327 0.87336774613825952 1.0194240369026693 1.8901221075364367 0.86697123176684088 1.0303089953658271 1.8896097378727723 0.86356639905009192 1.0369071928429501 1.8891060511529036 0.86031037106658426 1.0440964037813816 1.8886108738125171 0.85719927621954328 1.0521348000127901 1.8881445169669495 0.85435000117037552 1.0612236073195671 1.8877460717451564 0.85197823864660138 1.0715027040263871 1.8874795836432459 0.850400161013805 1.08308501515356 1.8873996269077993 0.84992695518555794 1.1007063636426642 1.8874069834986571 0.84997058685366578 1.1054441604746783 1.887443301395503 0.85018517440665498 1.1101793244374734 1.8875084586559689 0.85057053894987344 1.1149044841660334 1.8876020827688309 0.8511260998434852 1.1196122964482775 1.8877235506540118 0.85185087470247156 1.1242954462250596 1.8878719886625797 0.8527434793966302 1.1289466465901685 1.8882423414818819 0.85499310475939339 1.1387471168289738 1.8884711554756946 0.85639438703557602 1.1438865283849502 1.8887311219733738 0.85800328478273569 1.1489661926567345 1.8890203130895264 0.85981673027928585 1.1539762046896513 1.8893364919130584 0.86183119774911177 1.1589071821151093 1.8896771387820579 0.86404262293224221 1.1637500118898436 1.8900394775586762 0.86644632265552057 1.1684955970351527 1.8907591966853989 0.8713397066432792 1.1772582433949126 1.8911127204912228 0.87379041897071053 1.1812981554974173 1.8914789391236486 0.87638545383063271 1.1852481991795361 1.8918556592783926 0.87912096697784026 1.1891024614202204 1.8922406285447142 0.88199286747685945 1.192855256681489 1.892631535405418 0.88499681770194905 1.1965011269084294 1.8930260092368518 0.88812823333709912 1.2000348415291968 1.8940871746164283 0.8968567181764483 1.2091992232210858 1.8947397296667303 0.90254422397512546 1.2144747706960328 1.8953746545789314 0.90844934277087031 1.2193422446284785 1.8959871447981085 0.91457883845638988 1.2238309526393318 1.8965718835755352 0.92094023613492482 1.2279547218360272 1.8971229401137486 0.92754154029162428 1.2317172353019237 1.8976337210854692 0.93439163127241198 1.2351116158019808 1.8985293729531225 0.94814194944350438 1.2409352982566344 1.8989204559705315 0.9550112193490955 1.2434143495585004 1.8992632175197603 0.96210650301828959 1.2455417030435205 1.8995499432076202 0.96941452936316508 1.2472921060311568 1.8997726501738206 0.97690932733114288 1.2486360617430747 1.8999242139472099 0.98454954138118977 1.249545193579914 1.9000000000000001 0.99227463753454948 1.25 1.9000000000000001 1 1.25 + 0 9 0.20769551692732596 7 0.31619045992063632 7 0.43824648432856717 7 0.60630628727767011 7 0.66802358049470334 7 0.73745535890280278 7 0.79917367506218406 7 0.90300517542744296 7 1 9 +1 1.95 0.99999999999999978 0.10000000000000001 0 0 1 +7 0 0 8 58 9 1.9499999999999997 0.99999999999999989 1.25 1.9499999999999997 1.0093831523501111 1.25 1.9498940847694906 1.018755503104074 1.2493291745954584 1.9496826682698669 1.0279721100087857 1.2479903370412788 1.9493753163686567 1.0369408341689648 1.24602710033644 1.9489852816895761 1.0456058717608587 1.2434921328298849 1.9485262120088565 1.0539383762802581 1.2404343369856798 1.9480103226946031 1.0619313212151529 1.2368918174222308 1.9468193865353423 1.0781442254168052 1.2284001672939884 1.9461335753808693 1.0862741508364513 1.2233407739324165 1.9454012024501368 1.0940345241138945 1.217705501822131 1.9446320534450561 1.1014456873087646 1.2114630021517698 1.9438352099196017 1.1085203599157183 1.2045882790282938 1.9430213098014257 1.1152519600526669 1.1969673382132637 1.9422005209702768 1.1216332384390482 1.1885156232909864 1.941052949179829 1.1300984878451577 1.1748109353962135 1.9407284721438482 1.1324357321182834 1.1707039051380215 1.9404179840691542 1.1346251332253736 1.1665127862041433 1.9401234432463892 1.1366631559936322 1.1622437354583701 1.9398466639685146 1.1385465760717912 1.1579030934730166 1.9395893165308118 1.1402724799301112 1.1534973845289227 1.9393529272308785 1.14183826486038 1.1490333166154547 1.9388178280194666 1.1453465497195414 1.1377449626797325 1.9385469156002588 1.1470865653315898 1.1308548934948268 1.9383307568531469 1.1484533319875327 1.1238721391370941 1.9381728985628635 1.149441019308145 1.116821031989657 1.93807574951314 1.1500458164262286 1.109725838837534 1.938040528542148 1.1502657134574523 1.1026109477457648 1.9380672296969608 1.1501005683753125 1.0955010745355855 1.9382780188396906 1.1487782711308094 1.0784217797615081 1.9385114874440834 1.1473090126250736 1.0693726213999355 1.9388156641365011 1.1453766950102087 1.0611793314998723 1.9391623266718829 1.1431332449090477 1.0537729816653618 1.9395313407209318 1.1406944647374706 1.0470536179501384 1.939912378540098 1.1381200413488601 1.0409099777352844 1.9403027345495243 1.135422254675696 1.0352042790935154 1.9410191918518054 1.13033751645919 1.0256061279332696 1.9413458712501408 1.1279762265307134 1.0215120957760633 1.9416856617443163 1.12546856832561 1.0175047119778304 1.9420365301567104 1.1228182649415652 1.0135900026954434 1.9423963766906562 1.1200292962183427 1.0097737694244504 1.9427630349304394 1.1171058987377844 1.0060615889990752 1.9431342718412996 1.1140525658238101 1.002458813592217 1.9441409386235031 1.1054861071281046 0.99305761281909688 1.9447634356952941 1.0998854632788677 0.98763504123459844 1.9453707346381957 1.0940696875452121 0.98263127810142636 1.9459583008280759 1.0880333787760088 0.97801291993853645 1.9465212285649236 1.0817698444089954 0.97376261558040988 1.9470541280817961 1.0752713714479174 0.96987322749734739 1.9475510628653006 1.0685286332858577 0.96634851296830515 1.9484551624164663 1.0545989360799992 0.9600832008150435 1.9488633436075999 1.0474140789765889 0.95733394516908177 1.9492225092657927 1.039974844491528 0.95497118559992045 1.9495241674580333 1.0322937340824585 0.95302308255220447 1.9497593177246981 1.0243979787070372 0.95152409962212003 1.9499197481035935 1.0163330017625551 0.95050838501876544 1.9499999998710396 1.0081674796553484 0.95000000081674796 1.9499999999999995 0.99999999999999989 0.95000000000000007 + 0 9 0.13245981261509418 7 0.2801979720647354 7 0.34145692201646749 7 0.4333387805098462 7 0.56311923633956151 7 0.66300625907899968 7 0.8323258221702976 7 1 9 +2 1 1 2.1000000000000001 0 0 1 1 0 -0 -0 1 0 0.94999999999999996 +7 0 0 8 65 10 1.9499999999999997 1 0.95000000000000007 1.9499999998447046 0.9901646017820348 0.95000000098353987 1.9498836289237824 0.98034536605121536 0.95073705344169179 1.9496515428823309 0.9707064936640355 0.9522067593503466 1.9493152563287091 0.96134883164092588 0.9543567409964272 1.9488902781087338 0.95233134174231149 0.95712616816968354 1.9483922194436252 0.94368259534140542 0.96046032614507393 1.9478347831976579 0.93540660759376248 0.96431826108309338 1.946911989013248 0.92335220500624393 0.9709750826380189 1.9465810155289114 0.91930011066199147 0.97340699197375102 1.9462375707045421 0.91533717935735626 0.97598372681721091 1.9458836727577522 0.91146933777759742 0.97870148429690995 1.9455214095077358 0.90770230080672476 0.98155619933525839 1.9451529383752713 0.90404157152750109 0.98454354464856497 1.9447804863827196 0.90049244122144123 0.98765893074703748 1.9439854496129449 0.89319850595392714 0.99454087950920078 1.9435623419727912 0.88948430960542324 0.99834058306758389 1.9431402650105767 0.88592496247179864 1.0022893359269611 1.9427224402881687 0.88252730165643789 1.0063799495560231 1.9423120478750893 0.87929760480642116 1.0106050999013001 1.9419122010713152 0.87624175570133378 1.0149570997133395 1.9415259211300773 0.873365409842077 1.0194276708728831 1.9406468383707276 0.86696797130889225 1.0303150146419606 1.9401617227709613 0.86356127092885682 1.0369172801176407 1.9396849035451167 0.86030389250490302 1.0441112233390628 1.9392163091486723 0.8571924623609033 1.0521534719374841 1.9387752770069431 0.85434455092411543 1.0612444814181567 1.9383986724531761 0.85197487306512754 1.0715222637818493 1.938147044314221 0.85039971327588193 1.0830996236876682 1.938071482110864 0.84992698108400655 1.1007061581176483 1.9380784384561542 0.8499705949171763 1.1054430802413582 1.9381127813531729 0.85018510065790054 1.110177372037233 1.9381743960170121 0.85057032070183647 1.1149016872265127 1.9382629318302276 0.85112567990782795 1.1196087062818583 1.9383778023428344 0.85185020559790758 1.1242911364273525 1.938518185272311 0.85274252755729474 1.1289417116385003 1.9388684638586133 0.85499151891708025 1.1387410939391582 1.939084886313817 0.85639244125386704 1.1438800581732838 1.9393307906711283 0.85800098164906524 1.148959435958939 1.9396043604893103 0.85981409731803526 1.1539693322789923 1.9399034865516565 0.86182828555578872 1.1589003597961354 1.9402257913336722 0.86403950320558887 1.1637433921641698 1.9405686534707609 0.86644308612755083 1.1684893173392958 1.9412497524692909 0.87133645033219165 1.1772528419367219 1.9415843322223556 0.87378723330164942 1.181293259764399 1.9419309541648764 0.876382427571887 1.1852438841119592 1.9422875438221898 0.87911819172554717 1.189098781728577 1.942651969565196 0.88199043293164126 1.1928522463750715 1.9430220426103586 0.88499480694555122 1.1964987988239075 1.9433955170197037 0.88812671810902877 1.2000331868591956 1.9444004484674369 0.89685840437971454 1.2092011009276959 1.9450184982594365 0.90254835622179119 1.2144786336505671 1.9456198359920627 0.90845556161376739 1.219347300331175 1.9461998988653981 0.91458663475370083 1.2238364887236071 1.9467536440321718 0.9209489479254469 1.227960116337639 1.9472754525143672 0.9275503468643399 1.2317219748778392 1.9477590847071327 0.93439953893140726 1.2351153169185389 1.9486073481669659 0.94815018232537451 1.2409384558352006 1.9489778156683173 0.95502117661064101 1.2434176041555129 1.949302447885388 0.96211721545857631 1.2455445198075172 1.9495739510975942 0.96942488085898493 1.2472941281783561 1.9497847933203942 0.97691818742705017 1.2486371838983905 1.9499282629466617 0.98455592161227579 1.2495455758526512 1.9499999999999995 0.99227787904207521 1.25 1.9499999999999995 1 1.25 + 0 9 0.20764496176684977 7 0.31606848072882715 7 0.43804415241506528 7 0.6060199603204286 7 0.667762211557411 7 0.73722204561262683 7 0.79896523652129325 7 0.90287127033062087 7 1 9 +7 0 0 8 72 11 0.23060902475093784 1.5572589408930977 1.25 0.2306090253266759 1.5572589416880023 1.2403080939310815 0.2310342496551667 1.5578459898817596 1.2306130592123639 0.2318847892368833 1.5590204337204854 1.2210299264371134 0.23314715262136432 1.5607579573262438 1.2116523473795875 0.23480019822430456 1.5630191005230041 1.2025559225037628 0.23681910255386118 1.5657563422969101 1.1938008009317798 0.23917736384617608 1.5689187478908639 1.185433552872097 0.24494923151952339 1.5765629574463067 1.16825458487937 0.24847357887202712 1.5811776556771773 1.1595863701867639 0.25238431145417434 1.5862274770913907 1.1515162197365003 0.25664838946694796 1.591645255387979 1.1440667267110092 0.26123499913425202 1.5973690697163032 1.137252065464524 0.26611584998590815 1.6033436143121336 1.1310798876895927 0.27126607531516195 1.6095213231531675 1.1255535774537704 0.28780563333546905 1.6289471113256968 1.1106097220023139 0.30000795570727895 1.6427308357544081 1.1033003027100983 0.31306914770262817 1.6568390062267508 1.0987899612669718 0.32676142464802371 1.6709276263029047 1.0971435089988484 0.34081889164110013 1.684687337793247 1.098372108093016 0.35493623367224481 1.6978481505506715 1.1024684679391314 0.36877177228397623 1.7101775445851723 1.1093717619474581 0.38800439974623274 1.7266532120642146 1.1234708391771506 0.39391917366630935 1.7316195160855685 1.1284897710688866 0.39966394917629372 1.7363504743755143 1.1340892789857251 0.40519953644821743 1.7408254129932434 1.1402666478468999 0.41048093677063863 1.7450212007514907 1.1470163225578758 0.41545801463969217 1.7489128177529336 1.1543284276539072 0.42007623191174137 1.7524734668147708 1.16218767904956 0.42835393761748652 1.7587799699498221 1.1787087767248308 0.4320401685442804 1.7615486605249644 1.1873445808501557 0.43527567979867521 1.7639482234930464 1.1964483186209958 0.43799737095819385 1.7659454527941973 1.2059731897490786 0.44014498323178758 1.767509300647877 1.2158549285554741 0.4416658636698656 1.768612078320114 1.2260097624237507 0.44252307816597386 1.7692330826434173 1.2363308368903219 0.44288630231634618 1.7694961824066842 1.2563425267323345 0.44247850706952085 1.7692006937910796 1.2660349832256914 0.44148202771623252 1.7684796645922805 1.2756421673524727 0.43991693532345949 1.767344382189604 1.285067924670005 0.43781954728438366 1.76581440516698 1.2942333782340523 0.43523546557513676 1.7639135820574288 1.3030746413748331 0.43221500743866798 1.7616681361677782 1.3115411822399725 0.42485902532046971 1.7561331366535327 1.3289450981366353 0.42038758894451689 1.752731785260232 1.3377444494294337 0.41546758440996018 1.7489385566500784 1.3459566926865136 0.41016683717002395 1.7447869010168187 1.353556870746119 0.40454815961726343 1.7403080722215212 1.3605293360737603 0.39866772711397863 1.7355307118989263 1.3668655829017644 0.39257380352485577 1.7304798698502182 1.372561846015637 0.3733268346330022 1.7141917389033312 1.3880829555784531 0.35960277646515681 1.7021218718317648 1.3957971742529021 0.34551140024191235 1.6891664128926345 1.4007210744216003 0.33139876717057209 1.67554834606082 1.4027859962866231 0.31757808203612869 1.6615293183406177 1.4019771495875699 0.30432326733863441 1.6474103688687163 1.3982977332109254 0.29187148809334029 1.6335305405606002 1.3918044519491164 0.27484717429506123 1.613780554783921 1.3780286215120883 0.26950233442909932 1.6074451225244544 1.3728493958276737 0.26441852960733453 1.6012923880886372 1.3670128087988742 0.25962039506134998 1.5953686295300604 1.3605217312820252 0.25513560660008333 1.5897274619964854 1.3533824526069127 0.25099412875401772 1.5844289746128195 1.3456066462027629 0.2472281177677044 1.5795387965970087 1.3372127466299653 0.24074461423512816 1.5710148450850265 1.3198506792962577 0.23797117761198022 1.5673155188593539 1.3109544369036708 0.2355874368923615 1.5640950355290419 1.3015745313007927 0.23362914408119562 1.5614211927130075 1.2917640480797694 0.23212901641521005 1.5593575762895289 1.2815950578558766 0.2311155692546184 1.5579583037547089 1.2711607131599976 0.23060902537937192 1.5572589417607581 1.2605789847800684 0.23060902475093786 1.5572589408930977 1.25 + 0 9 0.073841945479720381 7 0.15965895039044564 7 0.33670575571798533 7 0.41799836750696001 7 0.49687770121375635 7 0.57050640050360513 7 0.6559889661311874 7 0.8329958105429861 7 0.91943143228834223 7 1 9 +7 0 0 8 72 11 0.23060902475093784 1.5572589408930977 1.25 0.2306090253266759 1.5572589416880023 1.2403080939310815 0.2310342496551667 1.5578459898817596 1.2306130592123639 0.2318847892368833 1.5590204337204854 1.2210299264371134 0.23314715262136432 1.5607579573262438 1.2116523473795875 0.23480019822430456 1.5630191005230041 1.2025559225037628 0.23681910255386118 1.5657563422969101 1.1938008009317798 0.23917736384617608 1.5689187478908639 1.185433552872097 0.24494923151952339 1.5765629574463067 1.16825458487937 0.24847357887202712 1.5811776556771773 1.1595863701867639 0.25238431145417434 1.5862274770913907 1.1515162197365003 0.25664838946694796 1.591645255387979 1.1440667267110092 0.26123499913425202 1.5973690697163032 1.137252065464524 0.26611584998590815 1.6033436143121336 1.1310798876895927 0.27126607531516195 1.6095213231531675 1.1255535774537704 0.28780563333546905 1.6289471113256968 1.1106097220023139 0.30000795570727895 1.6427308357544081 1.1033003027100983 0.31306914770262817 1.6568390062267508 1.0987899612669718 0.32676142464802371 1.6709276263029047 1.0971435089988484 0.34081889164110013 1.684687337793247 1.098372108093016 0.35493623367224481 1.6978481505506715 1.1024684679391314 0.36877177228397623 1.7101775445851723 1.1093717619474581 0.38800439974623274 1.7266532120642146 1.1234708391771506 0.39391917366630935 1.7316195160855685 1.1284897710688866 0.39966394917629372 1.7363504743755143 1.1340892789857251 0.40519953644821743 1.7408254129932434 1.1402666478468999 0.41048093677063863 1.7450212007514907 1.1470163225578758 0.41545801463969217 1.7489128177529336 1.1543284276539072 0.42007623191174137 1.7524734668147708 1.16218767904956 0.42835393761748652 1.7587799699498221 1.1787087767248308 0.4320401685442804 1.7615486605249644 1.1873445808501557 0.43527567979867521 1.7639482234930464 1.1964483186209958 0.43799737095819385 1.7659454527941973 1.2059731897490786 0.44014498323178758 1.767509300647877 1.2158549285554741 0.4416658636698656 1.768612078320114 1.2260097624237507 0.44252307816597386 1.7692330826434173 1.2363308368903219 0.44288630231634618 1.7694961824066842 1.2563425267323345 0.44247850706952085 1.7692006937910796 1.2660349832256914 0.44148202771623252 1.7684796645922805 1.2756421673524727 0.43991693532345949 1.767344382189604 1.285067924670005 0.43781954728438366 1.76581440516698 1.2942333782340523 0.43523546557513676 1.7639135820574288 1.3030746413748331 0.43221500743866798 1.7616681361677782 1.3115411822399725 0.42485902532046971 1.7561331366535327 1.3289450981366353 0.42038758894451689 1.752731785260232 1.3377444494294337 0.41546758440996018 1.7489385566500784 1.3459566926865136 0.41016683717002395 1.7447869010168187 1.353556870746119 0.40454815961726343 1.7403080722215212 1.3605293360737603 0.39866772711397863 1.7355307118989263 1.3668655829017644 0.39257380352485577 1.7304798698502182 1.372561846015637 0.3733268346330022 1.7141917389033312 1.3880829555784531 0.35960277646515681 1.7021218718317648 1.3957971742529021 0.34551140024191235 1.6891664128926345 1.4007210744216003 0.33139876717057209 1.67554834606082 1.4027859962866231 0.31757808203612869 1.6615293183406177 1.4019771495875699 0.30432326733863441 1.6474103688687163 1.3982977332109254 0.29187148809334029 1.6335305405606002 1.3918044519491164 0.27484717429506123 1.613780554783921 1.3780286215120883 0.26950233442909932 1.6074451225244544 1.3728493958276737 0.26441852960733453 1.6012923880886372 1.3670128087988742 0.25962039506134998 1.5953686295300604 1.3605217312820252 0.25513560660008333 1.5897274619964854 1.3533824526069127 0.25099412875401772 1.5844289746128195 1.3456066462027629 0.2472281177677044 1.5795387965970087 1.3372127466299653 0.24074461423512816 1.5710148450850265 1.3198506792962577 0.23797117761198022 1.5673155188593539 1.3109544369036708 0.2355874368923615 1.5640950355290419 1.3015745313007927 0.23362914408119562 1.5614211927130075 1.2917640480797694 0.23212901641521005 1.5593575762895289 1.2815950578558766 0.2311155692546184 1.5579583037547089 1.2711607131599976 0.23060902537937192 1.5572589417607581 1.2605789847800684 0.23060902475093786 1.5572589408930977 1.25 + 0 9 0.073841945479720381 7 0.15965895039044564 7 0.33670575571798533 7 0.41799836750696001 7 0.49687770121375635 7 0.57050640050360513 7 0.6559889661311874 7 0.8329958105429861 7 0.91943143228834223 7 1 9 +1 -0.37885801717798212 2.166725982822018 1.2500000000000002 0.70710678118654757 -0.70710678118654757 0 +1 2.7999999999999998 1 0.95000000000000007 -1 0 0 +2 2.7999999999999998 1 1.1000000000000001 -1 0 0 0 0 -1 -0 -1 -0 0.13 +2 2.7999999999999998 1 1.1000000000000001 -1 0 0 0 0 -1 -0 -1 -0 0.14999999999999999 +1 2.7999999999999998 1 0.97000000000000008 -1 0 0 +7 0 0 8 58 9 1.9499999999999995 1 0.96999999999999997 1.950000000860854 0.99139145219982738 0.96999999370913814 1.9499108477954412 0.9828019404658348 0.97065154376169893 1.9497332316297991 0.97439432606805554 0.9719492906248095 1.9494772652238455 0.96626396809759296 0.97383823926053137 1.9491561128904022 0.95846394909061328 0.9762554413147454 1.9487826271956619 0.9510177545827152 0.97914453825118586 1.9483678002376803 0.94392515251930798 0.98246189752572211 1.947429291408884 0.92976648753848123 0.99027891856302985 1.9468995113159404 0.922774519586125 0.99485706192162071 1.9463395276188542 0.91613661784028344 0.99992018656211312 1.9457570107666902 0.90983082248435665 1.005492674109455 1.9451592160669482 0.90384420992789938 1.0115963132805061 1.9445547155841125 0.89818339777693068 1.0183193898497984 1.9439518983180277 0.8928570877674985 1.0257324961469143 1.94311808229669 0.88583939822735502 1.0376773500719434 1.9428814648448054 0.88389253539718926 1.0412819042901935 1.9426561368626947 0.88207554624006324 1.0449563667942134 1.9424435224379855 0.88039137282766655 1.0486952892170871 1.942244929976622 0.87884267559415141 1.052493081465079 1.9420615522028639 0.87743183333613639 1.0563440117176348 1.9418944661592885 0.87616094321270332 1.0602422064273811 1.9415198960491398 0.87333822951793061 1.0700904935245112 1.9413339011150295 0.87196328865204986 1.07609312425199 1.9411898445765852 0.87091352557249191 1.0821683535342068 1.9410901165340888 0.87019342703222968 1.0882951200971125 1.9410362463231974 0.86980576499958895 1.0944523714170689 1.9410288675035712 0.86975173861404065 1.1006189632662797 1.9410677025289149 0.87003093221067129 1.1067735777475407 1.9412658667307374 0.87147267710665643 1.1212371271328208 1.9414550194453779 0.87285504407777859 1.1288761676392951 1.941694823197051 0.87462679749285532 1.135865476370207 1.9419668927211757 0.87667439533996938 1.1422586715272973 1.9422582234730668 0.87891597109030206 1.1481206850563941 1.9425610282019248 0.88130094143314319 1.1535302200611957 1.9428725132169888 0.88381620162512753 1.1585782207079021 1.9434344397342012 0.88848543364229182 1.1669422485911431 1.9436851957416541 0.89060957238728788 1.1704448901954081 1.943945021890112 0.89285903457467564 1.1738698522352908 1.9442123657236432 0.89523049777729258 1.1772119564027277 1.9444856298657802 0.89772041179520778 1.1804662189316699 1.9447631720195189 0.90032499865572457 1.183627850598082 1.9450433049673206 0.90304025261337972 1.1866922567199432 1.9457901112435092 0.91053960111107979 1.1945665952969795 1.9462491256557859 0.91541724162257043 1.1991017539490956 1.9466979738939205 0.92050068327975654 1.2033070783798696 1.9471330941635796 0.92579787523573076 1.2072028997441777 1.9475504619354982 0.93131770388124624 1.2107968875112254 1.9479455024151873 0.93706976978021839 1.214088006452986 1.9483130266522679 0.94306496091202852 1.2170661800822988 1.9489512148684749 0.95501001534618157 1.2221234040122864 1.9492277504638 0.9609189057008708 1.2242602534217328 1.9494714622279525 0.96704285330548823 1.2261039332875034 1.9496764024305435 0.97337075571302889 1.227628467445079 1.9498362921822086 0.97987925548928168 1.2288038358338549 1.9499454197348614 0.98652980125302248 1.2296010551028629 1.9500000006735605 0.99326439132704125 1.230000004922176 1.9499999999999995 1 1.2300000000000002 + 0 9 0.14079435579561092 7 0.29497196915038909 7 0.35963172349361244 7 0.4566160594684977 7 0.588796716995306 7 0.68746682948596005 7 0.85103750386005472 7 1 9 +7 0 0 8 58 9 1.9499999999999997 1 1.2300000000000002 1.9499999991793726 1.0082062719115557 1.2299999940031092 1.9499189893183679 1.0163993988942628 1.2294079626582377 1.9497574040473193 1.0244358286137953 1.228227312781657 1.9495236453192553 1.0322279447921812 1.226503901979437 1.9492289637898892 1.0397250315342561 1.2242921398285955 1.9488846183038087 1.0469027814548271 1.2216422750859273 1.9485004575121858 1.0537578864568746 1.2185946651933792 1.9476034904124564 1.0678597153562226 1.2112105923896999 1.9470803543808919 1.0749981239279209 1.2067507438198737 1.9465244678775084 1.0817724487253648 1.2018012645850409 1.9459439915355157 1.0882056151922106 1.1963450202161965 1.9453465043361882 1.0943121642974394 1.190363677108504 1.9447404105754378 1.1000898110288986 1.183779377498605 1.9441338411878362 1.1055337419672171 1.1765232348773682 1.943135406508643 1.1140510266298582 1.1627323499475246 1.9427472874682656 1.1172376017680634 1.1568537812650794 1.9423679348302356 1.1202575607658447 1.1504787852923701 1.9419996553130976 1.1231016008051353 1.1434360989056829 1.9416564966667158 1.1256767887691439 1.1355856662796486 1.9413628179558418 1.1278262616066757 1.1268309045958003 1.9411572359065887 1.1293187485045231 1.1170875440299577 1.9410570414083448 1.130044937833266 1.1022654717398304 1.9410496792848353 1.1300979554138058 1.0981619783177277 1.9410628138059609 1.1300029746937403 1.0940574228194453 1.9410964387886549 1.1297599998320416 1.0899581324843879 1.941150371910882 1.1293693721527402 1.0858704193904862 1.9412242547116365 1.1288317701449275 1.0818005804541959 1.9413175525909407 1.1281482094627546 1.0777548974304989 1.9415555571452376 1.1263883567604922 1.069222474597985 1.9417052492611897 1.1252735570509262 1.0647434472190125 1.9418776233444606 1.1239776811777047 1.060311727478489 1.9420714249317184 1.1225031247316901 1.0559359289837462 1.942285170464658 1.1208527033803897 1.0516242895105139 1.9425171648451089 1.1190297147347137 1.0473848542664923 1.9427655189901498 1.1170380002157314 1.0432256591549209 1.9432616367003261 1.1129655350179746 1.0355364108345335 1.9435064442264414 1.1109190650075449 1.0319873954351491 1.9437611214930506 1.1087455802918589 1.0285133153909054 1.9440241479596276 1.1064482967054985 1.0251194269271031 1.9442939510176365 1.1040306625159089 1.021810794943433 1.944568905990534 1.1014963584233972 1.0185922930139761 1.9448473361337673 1.098849297561133 1.0154686033872047 1.945595292343099 1.0914927847014859 1.0073947335941384 1.9460575508294728 1.0866918962310779 1.002734754135395 1.9465108019790931 1.0816870301116581 0.99841251334245162 1.946951498762248 1.0764714728099631 0.99440449722865898 1.9473757243456071 1.0710370697163991 0.99070017315110337 1.947779093526218 1.0653744410218586 0.98729769161764291 1.9481566755039712 1.0594722159673613 0.98420437640941061 1.9488363161299489 1.0473811384562006 0.97876731270391049 1.9491408179044369 1.0412066768344772 0.9763989050886851 1.9494104247207233 1.0347894966848354 0.97435047328128199 1.9496381936387781 1.0281393399106786 0.97265249374508178 1.949816660942312 1.0212804666865021 0.97133973273765029 1.949938861264976 1.0142551285649621 0.97044679843357351 1.9499999992870909 1.0071290898668126 0.97000000520971952 1.9499999999999997 0.99999999999999989 0.96999999999999997 + 0 9 0.20596730384692036 7 0.44368383357270402 7 0.60514289218842465 7 0.66680163654742453 7 0.73616763538685281 7 0.7978273762506124 7 0.90077382426757679 7 1 9 +2 -0.27279199999999998 2.2727919999999999 1.25 0.70710678118654746 -0.70710678118654746 0 -0.70710678118654757 -0.70710678118654757 0 0 -0 -1 0.13 +2 -0.27279199999999998 2.2727919999999999 1.25 0.70710678118654746 -0.70710678118654746 0 -0.70710678118654757 -0.70710678118654757 0 0 -0 -1 0.14999999999999999 +1 -0.36471588155425116 2.1808681184457486 1.2500000000000002 0.70710678118654757 -0.70710678118654757 0 +7 0 0 8 72 11 0.24264392806118382 1.5735083088303143 1.25 0.24264392806118382 1.5735083088303143 1.2415679532668684 0.24302485784283032 1.5740113478211013 1.2331350312769644 0.24378680353016197 1.575017566643629 1.2248112619066631 0.24491414880551049 1.5765023769966571 1.2166818036303795 0.24638481516573915 1.5784289776378686 1.2088118091066726 0.24817422695546432 1.5807553256593982 1.2012493994271174 0.25025738143260934 1.5834385658928032 1.1940277763702754 0.25533346977750998 1.5899077800876131 1.179240925665064 0.25841811868008924 1.5938011395735703 1.171794841237958 0.26183923589035851 1.5980686362054128 1.164842972018594 0.26557406077690821 1.6026642053275593 1.1583984389095794 0.26960289791504244 1.6075464289391121 1.1524728211563802 0.2739086910570257 1.6126784529582958 1.1470763193955191 0.27847746017347569 1.6180284741920197 1.1422190190139236 0.29280484062290346 1.6344956328945264 1.1294258777418038 0.30340464420792829 1.646294170177325 1.1229832265085993 0.31487297415183657 1.6585786617062959 1.1189380539946223 0.32694621955328512 1.6709659947982713 1.1174362215272988 0.33931860425884253 1.6831041009623735 1.1185496919203959 0.35163978407534824 1.6946786476717666 1.1222235327306596 0.36351913654113366 1.7054126286831157 1.1283250991057316 0.37984398473295916 1.719691558504854 1.1404058638719046 0.38497152535951268 1.7240974998990666 1.1448189705199459 0.38991249431780706 1.7282718675964071 1.1497178345829551 0.39464032436225222 1.7322029068973326 1.1550928947160242 0.39912508956274695 1.73587697731477 1.160934973073418 0.40333370842738109 1.739278709576654 1.1672346326396641 0.40722969251130331 1.7423905715631183 1.1739824186315819 0.41423870068433188 1.7479326354196041 1.1882023699810649 0.41736766984291895 1.7503767787449376 1.195657549825953 0.42011641373430064 1.7525009861538914 1.2035187953946407 0.42243409525069253 1.7542759580081841 1.2117549754242363 0.42426843185454693 1.755671457940716 1.2203170332447981 0.42557093689244568 1.7566587158647262 1.2291349946821564 0.42630565409597049 1.7572151860479752 1.238113580342368 0.42661569185975629 1.7574499788056244 1.2555264205678081 0.42626595160176289 1.7571850314175552 1.2639565136290549 0.42541186267914372 1.7565388371003914 1.2723027696279914 0.42407349330701777 1.7555240195395732 1.2804763273156325 0.42228545600240219 1.7541616389526564 1.2884081281930666 0.42008894361606841 1.7524760417789718 1.2960460938560419 0.41752633642380238 1.7504917561645139 1.3033528227420066 0.41129987327141837 1.7456206327086221 1.3183392147336539 0.40752497332278809 1.7426399864061679 1.3259028924610858 0.40336606208436848 1.7393185392620862 1.3329785863725918 0.39887035169494406 1.7356799652445802 1.3395519825934055 0.39408027917405702 1.7317447283367025 1.3456112287909305 0.38903339393301467 1.7275303820341383 1.351146461109799 0.38376173840174282 1.7230510073667711 1.3561483357143593 0.36747872052832753 1.7089578975698967 1.3694140864932307 0.35576716580476742 1.6984961155444311 1.3761940016818195 0.34352711674717151 1.6871399332423076 1.3806075823672777 0.33113303563362045 1.6751390884753981 1.3824970134348258 0.31893753519684293 1.6627899447557579 1.3817740876326592 0.30726256869530411 1.6504399028502872 1.3784760538146972 0.29639794599041575 1.6384858130834952 1.3727211254279252 0.28161206847895365 1.6216718682359639 1.3608866975083764 0.27686838612754744 1.6161734557926826 1.3563261217318663 0.27238323938912895 1.6108792601562714 1.3512144209504608 0.26817068066222588 1.6058208701444892 1.345563317400245 0.26424698743664754 1.6010339775666285 1.3393839935120027 0.26063046734938594 1.596558117670114 1.3326879446683402 0.25734209903818228 1.5924370636478171 1.3254865660615471 0.25164735016047757 1.5852248647248304 1.3105524397844555 0.24919893040039237 1.5820855247861139 1.3028742827042572 0.24708791933295149 1.5793493144013422 1.2947750640181597 0.2453463292868158 1.5770714372686749 1.2862909731351022 0.24400643999307586 1.5753076241757618 1.2774779640377381 0.24309822535317083 1.574108230782292 1.2684149165903786 0.24264392806118382 1.5735083088303143 1.2592082604941544 0.24264392806118382 1.5735083088303143 1.25 + 0 9 0.075357895493250907 7 0.16242872596973951 7 0.33405974862499205 7 0.41637394058885624 7 0.49691097150549302 7 0.57200500261053622 7 0.65881447484231137 7 0.83037018105172034 7 0.91779788640262461 7 1 9 +7 0 0 8 72 11 0.24264392806118382 1.5735083088303143 1.25 0.24264392806118382 1.5735083088303143 1.2415679532668684 0.24302485784283032 1.5740113478211013 1.2331350312769644 0.24378680353016197 1.575017566643629 1.2248112619066631 0.24491414880551049 1.5765023769966571 1.2166818036303795 0.24638481516573915 1.5784289776378686 1.2088118091066726 0.24817422695546432 1.5807553256593982 1.2012493994271174 0.25025738143260934 1.5834385658928032 1.1940277763702754 0.25533346977750998 1.5899077800876131 1.179240925665064 0.25841811868008924 1.5938011395735703 1.171794841237958 0.26183923589035851 1.5980686362054128 1.164842972018594 0.26557406077690821 1.6026642053275593 1.1583984389095794 0.26960289791504244 1.6075464289391121 1.1524728211563802 0.2739086910570257 1.6126784529582958 1.1470763193955191 0.27847746017347569 1.6180284741920197 1.1422190190139236 0.29280484062290346 1.6344956328945264 1.1294258777418038 0.30340464420792829 1.646294170177325 1.1229832265085993 0.31487297415183657 1.6585786617062959 1.1189380539946223 0.32694621955328512 1.6709659947982713 1.1174362215272988 0.33931860425884253 1.6831041009623735 1.1185496919203959 0.35163978407534824 1.6946786476717666 1.1222235327306596 0.36351913654113366 1.7054126286831157 1.1283250991057316 0.37984398473295916 1.719691558504854 1.1404058638719046 0.38497152535951268 1.7240974998990666 1.1448189705199459 0.38991249431780706 1.7282718675964071 1.1497178345829551 0.39464032436225222 1.7322029068973326 1.1550928947160242 0.39912508956274695 1.73587697731477 1.160934973073418 0.40333370842738109 1.739278709576654 1.1672346326396641 0.40722969251130331 1.7423905715631183 1.1739824186315819 0.41423870068433188 1.7479326354196041 1.1882023699810649 0.41736766984291895 1.7503767787449376 1.195657549825953 0.42011641373430064 1.7525009861538914 1.2035187953946407 0.42243409525069253 1.7542759580081841 1.2117549754242363 0.42426843185454693 1.755671457940716 1.2203170332447981 0.42557093689244568 1.7566587158647262 1.2291349946821564 0.42630565409597049 1.7572151860479752 1.238113580342368 0.42661569185975629 1.7574499788056244 1.2555264205678081 0.42626595160176289 1.7571850314175552 1.2639565136290549 0.42541186267914372 1.7565388371003914 1.2723027696279914 0.42407349330701777 1.7555240195395732 1.2804763273156325 0.42228545600240219 1.7541616389526564 1.2884081281930666 0.42008894361606841 1.7524760417789718 1.2960460938560419 0.41752633642380238 1.7504917561645139 1.3033528227420066 0.41129987327141837 1.7456206327086221 1.3183392147336539 0.40752497332278809 1.7426399864061679 1.3259028924610858 0.40336606208436848 1.7393185392620862 1.3329785863725918 0.39887035169494406 1.7356799652445802 1.3395519825934055 0.39408027917405702 1.7317447283367025 1.3456112287909305 0.38903339393301467 1.7275303820341383 1.351146461109799 0.38376173840174282 1.7230510073667711 1.3561483357143593 0.36747872052832753 1.7089578975698967 1.3694140864932307 0.35576716580476742 1.6984961155444311 1.3761940016818195 0.34352711674717151 1.6871399332423076 1.3806075823672777 0.33113303563362045 1.6751390884753981 1.3824970134348258 0.31893753519684293 1.6627899447557579 1.3817740876326592 0.30726256869530411 1.6504399028502872 1.3784760538146972 0.29639794599041575 1.6384858130834952 1.3727211254279252 0.28161206847895365 1.6216718682359639 1.3608866975083764 0.27686838612754744 1.6161734557926826 1.3563261217318663 0.27238323938912895 1.6108792601562714 1.3512144209504608 0.26817068066222588 1.6058208701444892 1.345563317400245 0.26424698743664754 1.6010339775666285 1.3393839935120027 0.26063046734938594 1.596558117670114 1.3326879446683402 0.25734209903818228 1.5924370636478171 1.3254865660615471 0.25164735016047757 1.5852248647248304 1.3105524397844555 0.24919893040039237 1.5820855247861139 1.3028742827042572 0.24708791933295149 1.5793493144013422 1.2947750640181597 0.2453463292868158 1.5770714372686749 1.2862909731351022 0.24400643999307586 1.5753076241757618 1.2774779640377381 0.24309822535317083 1.574108230782292 1.2684149165903786 0.24264392806118382 1.5735083088303143 1.2592082604941544 0.24264392806118382 1.5735083088303143 1.25 + 0 9 0.075357895493250907 7 0.16242872596973951 7 0.33405974862499205 7 0.41637394058885624 7 0.49691097150549302 7 0.57200500261053622 7 0.65881447484231137 7 0.83037018105172034 7 0.91779788640262461 7 1 9 +Polygon3D 0 +PolygonOnTriangulations 0 +Surfaces 24 +1 0 0 0 1 -0 0 0 1 0 -0 0 1 +1 0.14999999999999999 0 0 1 -0 0 0 1 0 -0 0 1 +1 0 0 0 0 -1 0 1 0 0 -0 0 1 +1 0 0.14999999999999999 0 0 -1 0 1 0 0 -0 0 1 +1 0 0 0 0 0 -1 1 0 0 0 -1 0 +1 0 0 0 -1 0 0 0 1 0 0 0 -1 +1 0 0 0 0 1 0 1 0 0 0 0 -1 +1 0 0 0 0 0 -1 1 0 0 0 -1 0 +2 1 1 0.10000000000000001 0 0 1 1 0 -0 -0 1 0 0.94999999999999996 +1 1 1 0.10000000000000001 0 0 1 1 0 -0 -0 1 0 +1 0 2 0 0 1 0 1 0 0 0 0 -1 +1 2 0 0 -1 0 0 0 1 0 0 0 -1 +2 1 1 0.10000000000000001 0 0 1 1 0 -0 -0 1 0 0.90000000000000002 +1 1 1 0.10000000000000001 0 0 1 1 0 -0 -0 1 0 +2 -0.27279199999999998 2.2727919999999999 1.25 0.70710678118654746 -0.70710678118654746 0 -0.70710678118654757 -0.70710678118654757 0 0 -0 -1 0.14999999999999999 +2 2.7999999999999998 1 1.1000000000000001 -1 0 0 0 0 -1 -0 -1 -0 0.14999999999999999 +1 1 1 2.1000000000000001 0 0 1 1 0 -0 -0 1 0 +1 1 1 2.1000000000000001 0 0 1 1 0 -0 -0 1 0 +1 2.7999999999999998 1 1.1000000000000001 -1 0 0 0 0 -1 -0 -1 -0 +2 2.7999999999999998 1 1.1000000000000001 -1 0 0 0 0 -1 -0 -1 -0 0.13 +1 2.7999999999999998 1 1.1000000000000001 -1 0 0 0 0 -1 -0 -1 -0 +1 -0.27279199999999998 2.2727919999999999 1.25 0.70710678118654746 -0.70710678118654746 0 -0.70710678118654757 -0.70710678118654757 0 0 -0 -1 +2 -0.27279199999999998 2.2727919999999999 1.25 0.70710678118654746 -0.70710678118654746 0 -0.70710678118654757 -0.70710678118654757 0 0 -0 -1 0.13 +1 -0.27279199999999998 2.2727919999999999 1.25 0.70710678118654746 -0.70710678118654746 0 -0.70710678118654757 -0.70710678118654757 0 0 -0 -1 +Triangulations 0 + +TShapes 183 +Ve +1e-07 +0 0 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 1 0 0 0.05 +0 + +0101000 ++183 0 -183 1 * +Ed + 1e-07 1 1 0 +1 2 0 0 0.05 +0 + +0101000 ++183 2 -183 3 * +Ed + 1e-07 1 1 0 +1 3 0 0 0.15 +0 + +0101000 ++183 0 -183 2 * +Wi + +0101000 ++182 0 -181 0 -180 0 +180 1 * +Fa +0 1e-07 1 0 + +0111000 ++179 0 * +Ed + 1e-07 1 1 0 +1 4 0 0 0.05 +0 + +0101000 ++183 4 -183 5 * +Ed + 1e-07 1 1 0 +1 5 0 0 0.05 +0 + +0101000 ++183 6 -183 7 * +Ed + 1e-07 1 1 0 +1 6 0 0 0.15 +0 + +0101000 ++183 4 -183 6 * +Wi + +0101000 ++177 0 -176 0 -175 0 +175 1 * +Fa +0 1e-07 2 0 + +0111000 ++174 0 * +Ed + 1e-07 1 1 0 +1 7 0 0 0.15 +0 + +0101000 ++183 0 -183 4 * +Wi + +0101000 ++182 0 -177 0 -172 0 +172 1 * +Fa +0 1e-07 3 0 + +0111000 ++171 0 * +Wi + +0101000 ++181 0 -176 0 -172 2 +172 3 * +Fa +0 1e-07 4 0 + +0111000 ++169 0 * +Wi + +0101000 ++180 0 -175 0 -172 0 +172 2 * +Fa +0 1e-07 5 0 + +0111000 ++167 0 * +Sh + +0101000 ++178 0 -173 0 -170 0 +168 0 +166 0 -166 1 * +So + +0100000 +-165 0 * +Ve +1e-07 +2 0 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 7 0 0 0.15 +0 + +0101000 ++183 0 -163 9 * +Ed + 1e-07 1 1 0 +1 4 0 0 0.05 +0 + +0101000 ++163 9 -183 5 * +Wi + +0101000 ++182 8 -162 8 +172 10 -161 8 * +Fa +0 1e-07 3 8 + +0111000 ++160 0 * +Ed + 1e-07 1 1 0 +1 6 0 0 0.15 +0 + +0101000 ++163 9 -183 6 * +Wi + +0101000 ++180 8 -162 8 +172 11 -158 8 * +Fa +0 1e-07 5 8 + +0111000 ++157 0 * +Wi + +0101000 ++161 8 -158 8 +175 10 -176 8 * +Fa +0 1e-07 2 8 + +0111000 ++155 0 * +Sh + +0101000 +-178 8 +159 0 -168 8 -156 0 +166 10 +154 0 * +So + +0100000 ++153 0 * +Ve +1e-07 +0 2 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 3 0 0 0.15 +0 + +0101000 ++183 0 -151 13 * +Ed + 1e-07 1 1 0 +1 2 0 0 0.05 +0 + +0101000 ++151 13 -183 3 * +Wi + +0101000 ++182 12 -150 12 +180 14 -149 12 * +Fa +0 1e-07 1 12 + +0111000 ++148 0 * +Ed + 1e-07 1 1 0 +1 7 0 0 0.15 +0 + +0101000 ++151 16 -183 4 * +Wi + +0101000 ++150 12 -172 12 +146 15 -175 12 * +Fa +0 1e-07 5 12 + +0111000 ++145 0 * +Wi + +0101000 ++149 12 -146 15 +172 17 -176 12 * +Fa +0 1e-07 4 12 + +0111000 ++143 0 * +Sh + +0101000 +-147 0 +170 12 -144 0 +166 14 -142 0 +173 12 * +So + +0100000 ++141 0 * +Ve +1e-07 +2 2 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 7 0 0 0.15 +0 + +0101000 ++183 0 -139 20 * +Ed + 1e-07 1 1 0 +1 5 0 0 0.05 +0 + +0101000 ++139 22 -183 7 * +Wi + +0101000 ++181 18 -138 19 +172 21 -137 18 * +Fa +0 1e-07 4 18 + +0111000 ++136 0 * +Ed + 1e-07 1 1 0 +1 6 0 0 0.15 +0 + +0101000 ++183 4 -139 22 * +Wi + +0101000 ++180 18 -172 18 +138 19 -134 18 * +Fa +0 1e-07 5 18 + +0111000 ++133 0 * +Wi + +0101000 ++177 18 -134 18 +175 23 -137 18 * +Fa +0 1e-07 2 18 + +0111000 ++131 0 * +Sh + +0101000 +-178 18 +170 18 -135 0 -132 0 +166 23 +130 0 * +So + +0100000 ++129 0 * +Ed + 1e-07 1 1 0 +1 8 0 0 0.1 +0 + +0101000 ++183 0 -183 25 * +Ed + 1e-07 1 1 0 +1 9 0 0 2 +0 + +0101000 ++183 0 -183 26 * +Ed + 1e-07 1 1 0 +1 9 0 0.15 1.85 +0 + +0101000 ++183 2 -183 12 * +Ed + 1e-07 1 1 0 +1 10 0 0 0.1 +0 + +0101000 ++151 0 -183 27 * +Wi + +0101000 ++127 0 -180 0 +126 25 -125 0 -124 0 -150 12 * +Fa +0 1e-07 6 0 + +0111000 ++123 0 * +Ed + 1e-07 1 1 0 +1 11 0 0 2 +0 + +0101000 ++183 0 -183 28 * +Ed + 1e-07 1 1 0 +1 11 0 0.15 1.85 +0 + +0101000 ++183 4 -183 8 * +Ed + 1e-07 1 1 0 +1 12 0 0 0.1 +0 + +0101000 ++163 0 -183 29 * +Wi + +0101000 ++127 0 -172 0 +121 25 -120 0 -119 0 -162 8 * +Fa +0 1e-07 7 0 + +0111000 ++118 0 * +Ed + 1e-07 1 1 0 +1 13 0 0 2 +0 + +0101000 ++183 28 -183 30 * +Wi + +0101000 ++126 25 -121 25 +121 27 -116 25 * +Ve +1e-07 +1.95 1 0.1 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 14 0 0 6.28318530717959 +2 1 9 0 0 6.28318530717959 +2 2 10 0 0 6.28318530717959 +0 + +0101100 ++114 0 -114 0 * +Wi + +0101000 ++113 0 * +Fa +0 1e-07 8 25 + +0111000 ++115 0 +112 0 * +Ed + 1e-07 1 1 0 +1 13 0 0.15 1.85 +0 + +0101000 ++183 31 -183 32 * +Ed + 1e-07 1 1 0 +1 11 0 0.15 1.85 +0 + +0101000 ++183 33 -183 34 * +Wi + +0101000 +-172 2 +175 0 -120 0 -180 8 -172 11 -110 0 +172 18 -180 18 +109 26 +175 12 ++172 12 +125 0 * +Wi + +0101000 +-180 24 -172 35 +175 24 +172 24 * +Fa +0 1e-07 8 0 + +0111000 ++108 0 +107 0 * +Ed + 1e-07 1 1 0 +1 15 0 0 0.1 +0 + +0101000 ++139 0 -183 36 * +Wi + +0101000 ++124 0 -146 15 +121 27 -109 26 -105 0 -138 19 * +Fa +0 1e-07 11 0 + +0111000 ++104 0 * +Wi + +0101000 ++119 0 -158 8 +116 25 -110 0 -105 0 -134 18 * +Fa +0 1e-07 12 0 + +0111000 ++102 0 * +Ve +1e-07 +1.9 1 0.1 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 16 0 0 6.28318530717959 +2 3 13 0 0 6.28318530717959 +2 4 14 0 0 6.28318530717959 +0 + +0101100 ++100 0 -100 0 * +Wi + +0101000 +-99 0 * +Wi + +0101000 ++113 0 * +Fa +0 1e-07 10 0 + +0111000 ++98 0 +97 0 * +Wi + +0101000 +-99 0 * +Fa +0 1e-07 8 25 + +0111000 ++95 0 * +Sh + +0101000 ++122 0 -117 0 +166 0 -111 0 +106 0 +103 0 +144 0 -101 0 +156 0 +96 0 ++132 0 +166 24 -94 0 * +So + +0100000 ++93 0 * +Ve +1e-07 +0.465481164306493 1.72407845855426 1.18266817568798 +0 0 + +0101101 +* +Ve +2.00001e-07 +0.266438962921461 1.52142900272257 1.25 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 17 0 0.43213918 1 +2 5 13 0 0.43213918 1 +2 6 15 0 0.43213918 1 +0 + +0101000 ++91 0 -90 0 * +Ed + 1e-07 1 1 0 +1 18 0 0 0.43213918 +2 7 13 0 0 0.43213918 +2 8 15 0 0 0.43213918 +0 + +0101000 ++90 0 -91 0 * +Wi + +0101000 ++89 0 +88 0 * +Ve +3.29263687416892e-07 +1.9 1 0.95 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 19 0 0 0.85 +3 9 10CN 13 0 0 0.85 +0 + +0101000 ++100 0 -86 0 * +Ve +3.29263687416892e-07 +1.9 1 1.25 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 20 0 0 1 +2 11 13 0 0 1 +2 12 16 0 0 1 +0 + +0101000 ++84 0 -86 0 * +Ve +1e-07 +1.9 1 2.1 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 19 0 1.15 2 +3 9 10CN 13 0 1.15 2 +0 + +0101000 ++84 0 -82 0 * +Ed + 1e-07 1 1 0 +1 21 0 0 6.28318530717959 +2 13 13 0 0 6.28318530717959 +2 14 17 0 0 6.28318530717959 +0 + +0101100 ++82 0 -82 0 * +Ed + 1e-07 1 1 0 +1 22 0 0 1 +2 15 13 0 0 1 +2 16 16 0 0 1 +0 + +0101000 ++86 0 -84 0 * +Wi + +0101000 ++99 0 -85 0 +83 0 -81 0 -80 0 +81 0 +79 0 +85 0 * +Fa +0 1e-07 13 0 + +0111000 ++87 0 +78 0 * +Ve +3.31024601526247e-07 +1.95 1 0.95 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 23 0 0 0.85 +3 17 18CN 9 0 0 0.85 +0 + +0101000 ++114 0 -76 0 * +Ve +3.31024601526247e-07 +1.95 1 1.25 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 24 0 0 1 +2 19 9 0 0 1 +2 20 16 0 0 1 +0 + +0101000 ++74 0 -76 0 * +Ve +1e-07 +1.95 1 2.1 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 23 0 1.15 2 +3 17 18CN 9 0 1.15 2 +0 + +0101000 ++74 0 -72 0 * +Ed + 1e-07 1 1 0 +1 25 0 0 6.28318530717959 +2 21 9 0 0 6.28318530717959 +2 22 18 0 0 6.28318530717959 +0 + +0101100 ++72 0 -72 0 * +Ed + 1e-07 1 1 0 +1 26 0 0 1 +2 23 9 0 0 1 +2 24 16 0 0 1 +0 + +0101000 ++76 0 -74 0 * +Wi + +0101000 +-75 0 +73 0 -71 0 -70 0 +71 0 +69 0 +75 0 +113 0 * +Ve +2.0018040942708e-07 +0.429753008548309 1.75981469359311 1.18267954968769 +0 0 + +0101101 +* +Ve +2.00082051969147e-07 +0.430078971550043 1.76005922216117 1.18348884639465 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 27 0 0.43213918 0.433050395544021 +2 25 9 0 0.43213918 0.433050395544021 +2 26 15 0 0.43213918 0.433050395544021 +0 + +0101000 ++67 0 -66 0 * +Ve +2.00001e-07 +0.230609024750938 1.5572589408931 1.25 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 28 0 0 0.43213918 +2 27 9 0 0 0.43213918 +2 28 15 0 0 0.43213918 +0 + +0101000 ++64 0 -67 0 * +Ed + 1e-07 1 1 0 +1 27 0 0.433050395544021 1 +2 25 9 0 0.433050395544021 1 +2 26 15 0 0.433050395544021 1 +0 + +0101000 ++66 0 -64 0 * +Wi + +0101000 ++65 0 +63 0 +62 0 * +Fa +0 1e-07 9 0 + +0111000 ++68 0 +61 0 * +Ed + 1e-07 1 1 0 +1 29 0 0.861916556515291 0.912587741015034 +3 29 30CN 15 0 0.861916556515291 0.912587741015034 +0 + +0101000 ++64 0 -90 0 * +Wi + +0101000 ++62 0 +65 0 +63 0 -59 0 -88 0 -89 0 +59 0 * +Fa +0 1e-07 15 0 + +0111000 ++58 0 * +Ed + 1e-07 1 1 0 +1 30 0 0.85 0.9 +3 31 32CN 16 0 0.85 0.9 +0 + +0101000 ++76 0 -86 0 * +Wi + +0101000 ++73 0 +69 0 -56 0 -79 0 -83 0 +56 0 * +Fa +0 1e-07 16 0 + +0111000 ++55 0 * +Wi + +0101000 +-80 0 * +Wi + +0101000 ++70 0 * +Fa +0 1e-07 18 0 + +0111000 ++53 0 +52 0 * +Sh + +0101000 +-96 0 -77 0 +60 0 -57 0 -54 0 +51 0 * +So + +0100000 ++50 0 * +Ve +1e-07 +2.8 1 0.97 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 31 0 0 6.28318530717959 +2 33 20 0 0 6.28318530717959 +2 34 21 0 0 6.28318530717959 +0 + +0101100 ++48 0 -48 0 * +Wi + +0101000 +-47 0 * +Ve +1e-07 +2.8 1 0.95 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 32 0 0 6.28318530717959 +2 35 16 0 0 6.28318530717959 +2 36 19 0 0 6.28318530717959 +0 + +0101100 ++45 0 -45 0 * +Wi + +0101000 ++44 0 * +Fa +0 1e-07 19 0 + +0111000 ++46 0 +43 0 * +Ve +2.64358491753894e-07 +1.95 1 0.97 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 33 0 0 0.85 +3 37 38CN 20 0 0 0.85 +0 + +0101000 ++48 0 -41 0 * +Ve +2.64358491753894e-07 +1.95 1 1.23 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 34 0 0 1 +2 39 20 0 0 1 +2 40 9 0 0 1 +0 + +0101000 ++41 0 -39 0 * +Ed + 1e-07 1 1 0 +1 35 0 0 1 +2 41 20 0 0 1 +2 42 9 0 0 1 +0 + +0101000 ++39 0 -41 0 * +Wi + +0101000 ++40 0 +47 0 -40 0 -38 0 -37 0 * +Fa +0 1e-07 20 0 + +0111000 ++36 0 * +Ed + 1e-07 1 1 0 +1 30 0 0 0.85 +3 31 32CN 16 0 0 0.85 +0 + +0101000 ++45 0 -76 0 * +Wi + +0101000 ++44 0 -34 0 -69 0 -73 0 +34 0 * +Fa +0 1e-07 16 0 + +0111000 ++33 0 * +Ed + 1e-07 1 1 0 +1 23 0 1.13 1.15 +3 17 18CN 9 0 1.13 1.15 +0 + +0101000 ++39 0 -74 0 * +Ed + 1e-07 1 1 0 +1 23 0 0.85 0.87 +3 17 18CN 9 0 0.85 0.87 +0 + +0101000 ++76 0 -41 0 * +Wi + +0101000 +-69 0 +31 0 +38 0 +30 0 * +Fa +0 1e-07 9 0 + +0111000 ++29 0 * +Wi + +0101000 +-30 0 +37 0 -31 0 -73 0 * +Fa +0 1e-07 9 0 + +0111000 ++27 0 * +Sh + +0101000 +-42 0 -35 0 +32 0 -28 0 -26 0 * +So + +0100000 ++25 0 * +Ve +1e-07 +-0.364715881554251 2.18086811844575 1.25 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 36 0 0 6.28318530717959 +2 43 23 0 0 6.28318530717959 +2 44 24 0 0 6.28318530717959 +0 + +0101100 ++23 0 -23 0 * +Wi + +0101000 +-22 0 * +Ve +1e-07 +-0.378858017177982 2.16672598282202 1.25 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 37 0 0 6.28318530717959 +2 45 15 0 0 6.28318530717959 +2 46 22 0 0 6.28318530717959 +0 + +0101100 ++20 0 -20 0 * +Wi + +0101000 ++19 0 * +Fa +0 1e-07 22 0 + +0111000 ++21 0 +18 0 * +Ve +2.00001e-07 +0.242643928061184 1.57350830883031 1.25 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 38 0 0 0.858936479998489 +3 47 48CN 23 0 0 0.858936479998489 +0 + +0101000 ++23 0 -16 0 * +Ve +1e-07 +0.415820012523814 1.74915535250083 1.19262784272163 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 39 0 0 0.43213918 +2 49 23 0 0 0.43213918 +2 50 9 0 0 0.43213918 +0 + +0101000 ++16 0 -14 0 * +Ed + 1e-07 1 1 0 +1 40 0 0.43213918 1 +2 51 23 0 0.43213918 1 +2 52 9 0 0.43213918 1 +0 + +0101000 ++14 0 -16 0 * +Wi + +0101000 ++15 0 +22 0 -15 0 -13 0 -12 0 * +Fa +0 1e-07 23 0 + +0111000 ++11 0 * +Ed + 1e-07 1 1 0 +1 29 0 0 0.861916556515291 +3 29 30CN 15 0 0 0.861916556515291 +0 + +0101000 ++20 0 -64 0 * +Wi + +0101000 ++19 0 -9 0 -63 0 -65 0 -62 0 +9 0 * +Fa +0 1e-07 15 0 + +0111000 ++8 0 * +Wi + +0101000 +-63 0 -62 0 -65 0 * +Wi + +0101000 ++12 0 +13 0 * +Fa +0 1e-07 9 0 + +0111000 ++6 0 +5 0 * +Sh + +0101000 +-17 0 -10 0 +7 0 -4 0 * +So + +0100000 ++3 0 * +Co + +1100000 ++164 0 +152 0 +140 0 +128 0 +164 24 +92 0 +49 0 +24 0 +2 0 * + ++1 0 \ No newline at end of file diff --git a/src/TEST_PY/recettes/cuve.py b/src/TEST_PY/recettes/cuve.py new file mode 100644 index 0000000..dd42eb6 --- /dev/null +++ b/src/TEST_PY/recettes/cuve.py @@ -0,0 +1,572 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Francis KLOSS - 2011-2012 - CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France +# ============================================================================================= + +import math + +import geompy +import hexablock + +# Charger la géométrie +# ==================== + +nom = "cuve" + +cuve = geompy.ImportBREP(nom+".brep") + +# Sélectionner des sommets de la géométrie +# ----------------------------------------- + +sommets = geompy.SubShapeAllSortedCentres(cuve, geompy.ShapeType["VERTEX"]) + +coin_a = sommets[ 4] +coin_b = sommets[43] +coin_c = sommets[62] +coin_d = sommets[15] + +support_a_o = sommets[ 3] +support_a_x = sommets[ 8] +support_a_y = sommets[ 6] +support_a_d = sommets[10] + +support_b_o = sommets[42] +support_b_x = sommets[36] +support_b_y = sommets[47] +support_b_d = sommets[38] + +support_c_o = sommets[61] +support_c_x = sommets[51] +support_c_y = sommets[59] +support_c_d = sommets[49] + +support_d_o = sommets[14] +support_d_x = sommets[19] +support_d_y = sommets[12] +support_d_d = sommets[17] + +coin_x1, coin_y1, coin_z1 = geompy.PointCoordinates(sommets[ 2]) +coin_x2, coin_y2, coin_z2 = geompy.PointCoordinates(support_a_d) +coin_x3, coin_y3, coin_z3 = geompy.PointCoordinates(support_a_o) +coin_x4, coin_y4, coin_z4 = geompy.PointCoordinates(coin_c) + +base_x, base_y, base_z = geompy.PointCoordinates(sommets[52]) +oppo_x, oppo_y, oppo_z = geompy.PointCoordinates(sommets[57]) + +# Sélectionner des arêtes de la géométrie +# --------------------------------------- + +aretes = geompy.SubShapeAllSortedCentres(cuve, geompy.ShapeType["EDGE"]) + +interne0, interne_x, interne_y, interne_z, interne_dx, interne_dy, interne_dz, interne_rayon = geompy.KindOfShape(aretes[48]) +externe0, externe_x, externe_y, externe_z, externe_dx, externe_dy, externe_dz, externe_rayon = geompy.KindOfShape(aretes[49]) + +cote_a = aretes[41] +cote_b = aretes[91] +cote_c = aretes[59] +cote_d = aretes[12] + +piquage_1_int = aretes[ 0] +piquage_1_ext = aretes[ 1] +piquage_1_feb = aretes[ 36] +piquage_1_feh = aretes[ 38] +piquage_1_eeb = aretes[ 33] +piquage_1_eeh = aretes[ 37] +piquage_1_eib = aretes[ 34] +piquage_1_eih = aretes[ 35] + +piquage_2_int = aretes[103] +piquage_2_ext = aretes[104] +piquage_2_feg = aretes[ 68] +piquage_2_fed = aretes[ 73] +piquage_2_eeg = aretes[ 79] +piquage_2_eed = aretes[ 88] +piquage_2_eig = aretes[ 80] +piquage_2_eid = aretes[ 89] + +support_l, support_a, support_v = geompy.BasicProperties(aretes[43]) +cote_lgr, cote_aire, cote_vol = geompy.BasicProperties(cote_a) + +# Sélectionner des faces de la géométrie +# -------------------------------------- + +faces = geompy.SubShapeAllSortedCentres(cuve, geompy.ShapeType["FACE"]) + +face_cylindrique_int = faces[21] +face_cylindrique_ext = faces[22] + +# Construire le modèle de blocs +# ============================= + +# Créer le document +# ----------------- + +doc = hexablock.addDocument(nom) + +# Calculer l'angle défini par le centre de la cuve et 2 points (projeté dans le plan XY) +# -------------------------------------------------------------------------------------- + +centre_cuve = geompy.MakeVertex(externe_x, externe_y, 0) + +def calculer_angle(point1, point2): + x1, y1, z1 = geompy.PointCoordinates(point1) + x2, y2, z2 = geompy.PointCoordinates(point2) + + p1 = geompy.MakeVertex(x1, y1, 0) + p2 = geompy.MakeVertex(x2, y2, 0) + + a1 = geompy.MakeEdge(centre_cuve, p1) + a2 = geompy.MakeEdge(centre_cuve, p2) + + return geompy.GetAngle(a1, a2) + +# Construire les 8 points de la grille +# ------------------------------------ + +p1_int0, p1_int_x, p1_int_y, p1_int_z, p1_int_dx, p1_int_dy, p1_int_dz, p1_int_rayon = geompy.KindOfShape(piquage_1_int) +p2_int0, p2_int_x, p2_int_y, p2_int_z, p2_int_dx, p2_int_dy, p2_int_dz, p2_int_rayon = geompy.KindOfShape(piquage_2_int) + +p1_int_c = geompy.MakeVertex(p1_int_x, p1_int_y, p1_int_z) +p2_int_c = geompy.MakeVertex(p2_int_x, p2_int_y, p2_int_z) + +p1_int_e = geompy.MakePrismDXDYDZ2Ways(p1_int_c, p1_int_dx*cote_lgr, p1_int_dy*cote_lgr, p1_int_dz*cote_lgr) +p2_int_e = geompy.MakePrismDXDYDZ2Ways(p2_int_c, p2_int_dx*cote_lgr, p2_int_dy*cote_lgr, p2_int_dz*cote_lgr) + +plan_2 = geompy.MakePrismDXDYDZ(p1_int_e, +cote_lgr, +cote_lgr, -cote_lgr) +plan_3 = geompy.MakePrismDXDYDZ(p1_int_e, -cote_lgr, -cote_lgr, -cote_lgr) + +plan_7 = geompy.MakePrismDXDYDZ(p2_int_e, 0, -cote_lgr, -cote_lgr) +plan_8 = geompy.MakePrismDXDYDZ(p2_int_e, 0, +cote_lgr, -cote_lgr) + +part_2 = geompy.MakePartition([piquage_1_eeb], [plan_2], [], [], geompy.ShapeType["VERTEX"]) +part_3 = geompy.MakePartition([piquage_1_eeb], [plan_3], [], [], geompy.ShapeType["VERTEX"]) + +part_7 = geompy.MakePartition([piquage_2_feg], [plan_7], [], [], geompy.ShapeType["VERTEX"]) +part_8 = geompy.MakePartition([piquage_2_fed], [plan_8], [], [], geompy.ShapeType["VERTEX"]) + +point_1 = coin_c +point_2 = geompy.SubShapeAllSortedCentres(part_2, geompy.ShapeType["VERTEX"])[1] +point_3 = geompy.SubShapeAllSortedCentres(part_3, geompy.ShapeType["VERTEX"])[1] +point_4 = geompy.MakeVertexOnCurve(cote_d, 0.55) +point_5 = coin_a +point_6 = coin_b +point_7 = geompy.SubShapeAllSortedCentres(part_7, geompy.ShapeType["VERTEX"])[0] +point_8 = geompy.SubShapeAllSortedCentres(part_8, geompy.ShapeType["VERTEX"])[2] + +# Construire la grille cylindrique +# -------------------------------- + +grille_hauteur = coin_z4-coin_z2 + +centre = doc.addVertex(externe_x, externe_y, externe_z-grille_hauteur) + +grille_x = doc.addVector(1, 1, 0) +grille_z = doc.addVector(0, 0, 1) + +petit_rayon = interne_rayon * 0.2 +grand_rayon = math.sqrt( (coin_x1-externe_x)**2 + (coin_y1-externe_y)**2 ) + +rayons = [ petit_rayon, interne_rayon-petit_rayon, externe_rayon-interne_rayon, grand_rayon-externe_rayon ] + +points = [ point_1, point_2, point_3, point_4, point_5, point_6, point_7, point_8, point_1 ] + +angles = [] +for i in xrange(8): + angle = calculer_angle(points[i], points[i+1]) + angles.append(angle) + +hauteurs = [ grille_hauteur ] + +grille = doc.makeCylindricals(centre, grille_x, grille_z, rayons, angles, hauteurs, False) + +# Ajouter le centre +# ----------------- + +quad_0 = grille.getQuadJK(0, 7, 0) +quad_6 = grille.getQuadJK(0, 0, 0) +quad_7 = grille.getQuadJK(0, 1, 0) + +centre_a = doc.addHexa3Quads(quad_0, quad_6, quad_7) + +quad_2 = grille.getQuadJK(0, 3, 0) +quad_3 = grille.getQuadJK(0, 4, 0) +quad_4 = grille.getQuadJK(0, 5, 0) + +centre_b = doc.addHexa3Quads(quad_2, quad_3, quad_4) + +quad_1 = grille.getQuadJK(0, 2, 0) +quad_5 = grille.getQuadJK(0, 6, 0) + +quad_a = centre_a.getQuad(1) +quad_b = centre_b.getQuad(1) + +centre_c = doc.addHexa4Quads(quad_1, quad_a, quad_5, quad_b) + +# Ajouter l'enceinte +# ------------------ + +plan_0 = geompy.MakePrismDXDYDZ(p1_int_e, +cote_lgr, +cote_lgr, +cote_lgr) +part_0 = geompy.MakePartition([piquage_1_feh], [plan_0], [], [], geompy.ShapeType["VERTEX"]) +point_0 = geompy.SubShapeAllSortedCentres(part_0, geompy.ShapeType["VERTEX"])[1] + +enceinte_quads = [] +for j in xrange(8): + q = grille.getQuadIJ(1, j, 1) + enceinte_quads.append(q) + +point_7x, point_7y, point_7z = geompy.PointCoordinates(point_7) +point_2x, point_2y, point_2z = geompy.PointCoordinates(point_2) +point_0x, point_0y, point_0z = geompy.PointCoordinates(point_0) + +enceinte_h1 = point_7z - base_z +enceinte_h2 = point_2z - base_z +enceinte_h3 = point_0z - base_z +enceinte_h4 = oppo_z - base_z + +enceinte_hauteurs = [ enceinte_h1, enceinte_h2, enceinte_h3, enceinte_h4 ] + +enceinte_pz = doc.addVector(oppo_x - base_x, oppo_y - base_y, enceinte_h4) + +enceinte = doc.prismQuadsVec(enceinte_quads, enceinte_pz, enceinte_hauteurs, 0) + +# Déconnecter via des arêtes, puis prismer, puis compléter (3) ou coller (1) +# -------------------------------------------------------------------------- + +periph_hexas = [] +supports_quads_b = [] +supports_quads_h = [] + +v1 = doc.addVector( 0, +0.1, 0) +v2 = doc.addVector( 0, -0.1, 0) +v3 = doc.addVector(+0.2, -0.1, 0) + +for j, v in [ [0, v1], [1, v1], [4, v2], [5, v3] ]: + h = grille.getHexaIJK(2, j, 0) + a = grille.getEdgeK(3, j, 0) + d = doc.disconnectEdge(h, a) + + q1 = d.getQuad(0) + q2 = grille.getQuadIK(2, j, 0) + if j==1: + h0 = doc.addHexa2Quads(q1, q2) + q3 = grille.getQuadJK(3, j, 0) + q4 = h0.getQuad(3) + h1 = doc.addHexa2Quads(q3, q4) + qb = h1.getQuad(hexablock.Q_E) + qh = h1.getQuad(hexablock.Q_F) + else: + p = doc.prismQuad(q1, v, 2) + + h0 = p.getHexa(0) + q3 = h0.getQuad(5) + h1 = p.getHexa(1) + q4 = h1.getQuad(5) + doc.addHexa3Quads(q2, q3, q4) + periph_hexas.append(h0) + qb = h1.getQuad(hexablock.Q_C) + qh = h1.getQuad(hexablock.Q_D) + + supports_quads_b.append(qb) + supports_quads_h.append(qh) + +# Piquer les 2 tuyaux sur l'enceinte +# ---------------------------------- + +piquage_centre = doc.addVertex(10, 0, 0) + +piquage_vx = doc.addVector(1, 0, 0) +piquage_vz = doc.addVector(0, 0, 1) + +piquage = doc.makeCylindrical(piquage_centre, piquage_vx, piquage_vz, 1, 360, 1, 1, 4, 1, False) + +piquage_quads = [ piquage.getQuadIJ(0, j, 0) for j in xrange(4) ] + +piquage_s1 = piquage.getVertexIJK(1, 0, 0) +piquage_s2 = piquage.getVertexIJK(1, 1, 0) +piquage_s3 = piquage.getVertexIJK(1, 2, 0) + +enceinte_ha = enceinte.getHexa( 6) +enceinte_hb = enceinte.getHexa(25) + +enceinte_s11 = enceinte_ha.getVertex(2) +enceinte_s12 = enceinte_ha.getVertex(3) +enceinte_s13 = enceinte_ha.getVertex(7) + +enceinte_s21 = enceinte_hb.getVertex(2) +enceinte_s22 = enceinte_hb.getVertex(3) +enceinte_s23 = enceinte_hb.getVertex(7) + +piquage_1 = doc.replace(piquage_quads, piquage_s1, enceinte_s11, piquage_s2, enceinte_s12, piquage_s3, enceinte_s13) +piquage_2 = doc.replace(piquage_quads, piquage_s1, enceinte_s21, piquage_s2, enceinte_s22, piquage_s3, enceinte_s23) + +# Nettoyer le template du piquage +# ------------------------------- + +doc.removeElements(piquage) + +# Associer le modèle de blocs avec la géométrie +# ============================================= + +doc.setShape(cuve) + +# Nettoyer les associations implicites du centre et de la périphérie +# ------------------------------------------------------------------ + +for i in xrange(0, 4, 3): + for j in xrange(8): + for k in xrange(2): + e = grille.getEdgeJ(i, j, k) + e.clearAssociation() + +# Associer le centre de l'enceinte +# -------------------------------- + +for j, ig in [ [2, 30], [3, 28], [6, 32], [7, 34] ]: + sm0 = grille.getVertexIJK(0, j, 0) + sg0 = sommets[ig] + sm0.setAssociation(sg0) + + sm1 = grille.getVertexIJK(0, j, 1) + sg1 = geompy.MakeTranslation(sg0, 0, 0, grille_hauteur) + sm1.setAssociation(sg1) + +for j, ig, sens in [ [0, 34, +1], [1, 30, +1], [4, 28, -1], [5, 32, -1] ]: + sm0 = grille.getVertexIJK(0, j, 0) + sg0 = geompy.MakeTranslation(sommets[ig], 0, sens*support_l, 0) + sm0.setAssociation(sg0) + + sm1 = grille.getVertexIJK(0, j, 1) + sg1 = geompy.MakeTranslation(sg0, 0, 0, grille_hauteur) + sm1.setAssociation(sg1) + +# Associer les 16 sommets des 4 supports externes +# ----------------------------------------------- + +supports_points = [ + [ support_c_o, support_c_y, support_c_d, support_c_x ], + [ support_d_d, support_d_y, support_d_o, support_d_x ], + [ support_a_o, support_a_y, support_a_d, support_a_x ], + [ support_b_o, support_b_x, support_b_d, support_b_y ] +] + +for s in xrange(4): + qb = supports_quads_b[s] + qh = supports_quads_h[s] + cs = supports_points[s] + for i in xrange(4): + smb = qb.getVertex(i) + sgb = cs[i] + smb.setAssociation(sgb) + + if s==1: + ind = i + else: + ind = [1, 0, 3, 2][i] + smh = qh.getVertex(ind) + sgh = geompy.MakeTranslation(sgb, 0, 0, grille_hauteur) + smh.setAssociation(sgh) + +# Associer les 7 sommets périphériques de la grille +# ------------------------------------------------- + +par_1 = 0.17 +par_2 = 1 - par_1 + +periph_grille = [ [0, cote_b, par_2], [1, cote_c, 0.22], [3, cote_d, 0.548], [4, cote_d, par_1], [5, cote_a, par_2], [6, cote_b, 0.44], [7, cote_b, 0.555] ] + +for j, ag, p in periph_grille: + smb = grille.getVertexIJK(3, j, 1) + sgb = geompy.MakeVertexOnCurve(ag, p) + smb.setAssociation(sgb) + + smh = grille.getVertexIJK(3, j, 0) + sgh = geompy.MakeTranslation(sgb, 0, 0, -grille_hauteur) + smh.setAssociation(sgh) + +# Associer les 3 sommets liés aux déconnections sur la grille +# ----------------------------------------------------------- + +periph_deco = [ [cote_c, par_2], [cote_a, par_1], [cote_b, par_1] ] + +for i in xrange(3): + hxa = periph_hexas[i] + ag, p = periph_deco[i] + smb = hxa.getVertex(2) + sgb = geompy.MakeVertexOnCurve(ag, p) + smb.setAssociation(sgb) + + smh = hxa.getVertex(0) + sgh = geompy.MakeTranslation(sgb, 0, 0, -grille_hauteur) + smh.setAssociation(sgh) + +# Réparer les piquages +# -------------------- + +piquage_e_base = geompy.MakeVertex(interne_x, interne_y, interne_z) +piquage_e_axe = geompy.MakeVectorDXDYDZ(interne_dx, interne_dy, interne_dz) +piquage_e_cyl = geompy.MakeCylinder(piquage_e_base, piquage_e_axe, interne_rayon, enceinte_h4) + +piquage_1_axe = geompy.MakeVectorDXDYDZ(p1_int_dx, p1_int_dy, p1_int_dz) +piquage_1_cyl = geompy.MakeCylinder(p1_int_c, piquage_1_axe, p1_int_rayon, cote_lgr) + +piquage_2_axe = geompy.MakeVectorDXDYDZ(p2_int_dx, p2_int_dy, p2_int_dz) +piquage_2_cyl = geompy.MakeCylinder(p2_int_c, piquage_2_axe, p2_int_rayon, cote_lgr) + +piquage_1_inter = geompy.SubShapeAllSortedCentres(geompy.MakeSection(piquage_e_cyl, piquage_1_cyl), geompy.ShapeType["EDGE"]) +piquage_2_inter = geompy.SubShapeAllSortedCentres(geompy.MakeSection(piquage_e_cyl, piquage_2_cyl), geompy.ShapeType["EDGE"]) + +piquage_1_fi = piquage_1_inter[0] + +piquage_2_fig = piquage_2_inter[0] +piquage_2_fid = piquage_2_inter[1] + +# Associer les piquages +# --------------------- + +piquages_devant = [ + [ piquage_1, piquage_1_int, 0.375, piquage_1_ext, 0.125 ], + [ piquage_2, piquage_2_int, 0.125, piquage_2_ext, 0.875 ] +] + +for m_piq, a_int, p_int, a_ext, p_ext in piquages_devant: + + i1 = m_piq.getEdge(2) + i2 = m_piq.getEdge(5) + i3 = m_piq.getEdge(7) + i4 = m_piq.getEdge(10) + + doc.associateClosedLine(i1.getVertex(1), i1, [ i2, i3, i4 ], a_int, p_int, True, []) + + e1 = m_piq.getEdge(0) + e2 = m_piq.getEdge(1) + e3 = m_piq.getEdge(9) + e4 = m_piq.getEdge(11) + + doc.associateClosedLine(e1.getVertex(0), e1, [ e2, e3, e4 ], a_ext, p_ext, False, []) + +piquages_milieu = [ + [ piquage_1, piquage_1_eib, piquage_1_eih, 0.30, piquage_1_eeb, piquage_1_eeh, 0.30 ], + [ piquage_2, piquage_2_eid, piquage_2_eig, 0.75, piquage_2_eed, piquage_2_eeg, 0.75 ] +] + +for m_piq, a_int1, a_int2, p_int, a_ext1, a_ext2, p_ext in piquages_milieu: + + i1 = m_piq.getEdge(22) + i2 = m_piq.getEdge(25) + i3 = m_piq.getEdge(27) + i4 = m_piq.getEdge(30) + + doc.associateClosedLine(i1.getVertex(0), i1, [ i4, i3, i2 ], a_int1, p_int, False, [a_int2]) + + e1 = m_piq.getEdge(20) + e2 = m_piq.getEdge(21) + e3 = m_piq.getEdge(29) + e4 = m_piq.getEdge(31) + + doc.associateClosedLine(e1.getVertex(0), e1, [ e2, e3, e4 ], a_ext1, p_ext, False, [a_ext2]) + +piquages_fond = [ + [ piquage_1, piquage_1_fi , [] , 0.125, piquage_1_feb, piquage_1_feh, 0.30 ], + [ piquage_2, piquage_2_fid, [piquage_2_fig], 0.75 , piquage_2_fed, piquage_2_feg, 0.75 ] +] + +for m_piq, a_int1, a_int2, p_int, a_ext1, a_ext2, p_ext in piquages_fond: + + i1 = m_piq.getEdge(42) + i2 = m_piq.getEdge(45) + i3 = m_piq.getEdge(47) + i4 = m_piq.getEdge(50) + + doc.associateClosedLine(i1.getVertex(0), i1, [ i4, i3, i2 ], a_int1, p_int, False, a_int2) + + e1 = m_piq.getEdge(40) + e2 = m_piq.getEdge(41) + e3 = m_piq.getEdge(49) + e4 = m_piq.getEdge(51) + + doc.associateClosedLine(e1.getVertex(1), e1, [ e2, e3, e4 ], a_ext1, p_ext, False, [a_ext2]) + +# Associer quelques faces +# ----------------------- + +for h in [ 2, 5, 7, 10, 21, 24, 26, 29 ]: + enceinte_hc = enceinte.getHexa(h) + + enceinte_qc = enceinte_hc.getQuad(hexablock.Q_C) + enceinte_qc.addAssociation(face_cylindrique_int) + + enceinte_qc = enceinte_hc.getQuad(hexablock.Q_D) + enceinte_qc.addAssociation(face_cylindrique_ext) + +# Primer les 5 supports (finalisation du modèle de blocs) +# ------------------------------------------------------- + +supports_quads_b.append( centre_c.getQuad(hexablock.Q_E) ) + +supports_z = doc.addVector(coin_x1 - coin_x3, coin_y1 - coin_y3, coin_z1 - coin_z3) + +supports = doc.prismQuads(supports_quads_b, supports_z, 1) + +# Mailler le modèle de blocs +# ========================== + +# Définir les groupes volumiques +# ------------------------------ + +groupe_fd = doc.addHexaGroup("fond") +groupe_en = doc.addHexaGroup("enceinte") +groupe_p1 = doc.addHexaGroup("piquage:1") +groupe_p2 = doc.addHexaGroup("piquage:2") +groupe_su = doc.addHexaGroup("supports") + +for i in xrange( doc.countUsedHexa() ): + h = doc.getUsedHexa(i) + groupe_fd.addElement(h) + +for i in xrange( enceinte.countHexa() ): + h = enceinte.getHexa(i) + if h != None: + groupe_en.addElement(h) + groupe_fd.removeElement(h) + +for i in xrange( piquage_1.countHexa() ): + h = piquage_1.getHexa(i) + groupe_p1.addElement(h) + groupe_fd.removeElement(h) + +for i in xrange( piquage_2.countHexa() ): + h = piquage_2.getHexa(i) + groupe_p2.addElement(h) + groupe_fd.removeElement(h) + +for i in xrange( supports.countHexa() ): + h = supports.getHexa(i) + groupe_su.addElement(h) + groupe_fd.removeElement(h) + +# Générer le maillage +# ------------------- + +hexablock.addLaws(doc, 0.015, False) + +maillage = hexablock.mesh(doc) + +muv, mue, muq, muh = hexablock.dump(doc, maillage) diff --git a/src/TEST_PY/recettes/troisCylindres.brep b/src/TEST_PY/recettes/troisCylindres.brep new file mode 100644 index 0000000..9caa182 --- /dev/null +++ b/src/TEST_PY/recettes/troisCylindres.brep @@ -0,0 +1,648 @@ +DBRep_DrawableShape + +CASCADE Topology V1, (c) Matra-Datavision +Locations 8 +1 +1.11022302462516e-16 0 1 0 + 0 1 0 0 + -1 0 1.11022302462516e-16 400 +1 + 1 0 0 190 + 0 1 0 0 + 0 0 1 380 +1 + 1 0 0 190 + 0 1 0 0 + 0 0 1 220 +2 1 -1 0 +2 2 -1 0 +2 2 1 3 -1 0 +2 3 -1 0 +2 3 1 2 -1 0 +Curve2ds 38 +1 0 800 1 0 +2 0 0 1 0 -0 1 100 +7 0 0 8 23 4 5.7595865315812871 400 5.7595865315812871 396.4531264233774 5.7629069293083175 392.92833608277681 5.7694749436140853 389.51230084494648 5.7788372822703087 386.24424709027198 5.7905468978363102 383.14348794697975 5.8042009023008854 380.21545709727701 5.8195042660091962 377.45508725218542 5.8543892203674739 372.04985730479018 5.8742056575325181 369.42820567367704 5.89564313364939 366.96284011636072 5.9186431153591617 364.64644480202827 5.9431911157077195 362.47799188863092 5.969306315324145 360.46051727651405 5.997060367620036 358.60197280754011 6.0537021647479774 355.37514358939779 6.082311505809308 353.97770142062154 6.1125302711814751 352.74076825489283 6.1443482006914323 351.69171562635694 6.1776550181455665 350.86267948835513 6.212224813535169 350.28862243838159 6.2476523776714217 350.00000035532935 6.2831853071795862 350 + 0 9 0.32715155003298801 7 0.67848367377663077 7 1 9 +7 0 0 8 23 4 4.7123889803846897 86.602540378443834 4.7833264519171417 86.602540378443834 4.8538221133434041 86.768554360301735 4.9226876586617614 87.096991301102832 4.9896492478955832 87.559643674082267 5.0546217349220237 88.124612677936994 5.1177137403899753 88.763476885346691 5.1791713917111073 89.453947255999054 5.3042530285650589 90.961452312325122 5.3677102240744938 91.784169844339971 5.4305599185356694 92.631457510690808 5.4932602887666402 93.488642372673752 5.5562165742572436 94.341495300176803 5.6198260616794098 95.175736723592024 5.6845162320744418 95.976668732951339 5.8116848841313695 97.413920783548804 5.8739248236055932 98.05887438439521 5.9379452637785519 98.646808131231438 6.0038837402756018 99.157716247916923 6.071712633333922 99.568620170602287 6.1412648768472247 99.855699662295933 6.2121194481632589 99.999999822335369 6.2831853071795862 100 + 0 9 0.32715155003298801 7 0.67848367377663077 7 1 9 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +1 0 0 1 0 +2 0 0 1 0 -0 1 100 +7 0 0 8 23 4 0 350 0.033576530560921469 349.99999966423474 0.067082892452182463 350.25770810060493 0.099869308879887875 350.77111458667099 0.13156628624254196 351.51570531988671 0.16195866809536152 352.46209608878792 0.19093398028496456 353.58237755135616 0.21846654983792213 354.85222820605424 0.27426368959368119 357.84920888955003 0.3021491186068328 359.61622715531161 0.32842484744605827 361.54040041871144 0.35316416580412735 363.61204164396673 0.37639683220717668 365.8264229027584 0.39812537333505649 368.18305324271273 0.41831630740511905 370.68769525783222 0.4557439761033848 376.0736018517199 0.47292011875991768 378.9594576910697 0.48830018181480117 382.03427944841542 0.50156023379092929 385.30662787333353 0.51222803597861422 388.77333266748747 0.51976991720685906 392.41514581060738 0.52359877559829915 396.1912597343462 0.52359877559829915 400 + 0 9 0.30404471865854837 7 0.64918916271671423 7 1 9 +7 0 0 8 23 4 -8.8817841970012523e-16 100 0.06715306112184205 100.00000016788263 0.13416540811772926 99.871153979566813 0.2000859947170639 99.614413693494853 0.26450877997241218 99.244989236204376 0.32725315809820543 98.782719490159323 0.38826782246932368 98.247314081382243 0.44764126817363259 97.656293340043064 0.57139795897359669 96.305069830741061 0.63542889192342944 95.53220561073141 0.69827952069100885 94.722154327366113 0.76035187352387279 93.8895784161206 0.82202051989645941 93.048311226451347 0.8836693219130547 92.211706870163411 0.9457321983952216 91.393072001530811 1.0730247241787252 89.809460344875689 1.138267311008704 89.045865019642434 1.2052426425872236 88.333353522290537 1.2742871129404838 87.697209384435382 1.3455881079195908 87.171127692761559 1.4190994971417732 86.793973628457834 1.4946215214818199 86.602540378443862 1.5707963267948957 86.602540378443862 + 0 9 0.30404471865854837 7 0.64918916271671423 7 1 9 +7 0 0 8 23 4 0 450 0.033576535464432844 450 0.06708288862795353 449.74229256882165 0.099869310240679354 449.22888491692595 0.13156628503243795 448.48429456674455 0.16195866455356001 447.53790447273542 0.19093398418656715 446.41762209624159 0.21846654988386938 445.14777179147779 0.27426368959368741 442.15079111044957 0.3021491186068106 440.38377284469061 0.32842484744608935 438.45959958128537 0.3531641658041238 436.38795835603389 0.37639683220714382 434.17357709724484 0.39812537333508846 431.81694675728357 0.41831630740511105 429.31230474216915 0.45574397610337858 423.92639814828101 0.4729201187599914 421.04054230892496 0.48830018181460044 417.96572055159834 0.50156023379119397 414.6933721266472 0.51222803597843036 411.22666733252822 0.51976991720691501 407.58485418938534 0.52359877559829915 403.80874026565544 0.52359877559829915 400 + 0 9 0.30404471828653629 7 0.64918916252934122 7 1 9 +7 0 0 8 23 4 3.1415926535897931 100 3.0744395826609292 100 3.0074272532690807 99.871154312247398 2.9415066557379972 99.614413450152753 2.8770838762873723 99.24498917729909 2.8143395030913991 98.782719765237147 2.7533248227475049 98.247313911151892 2.6939513853142487 97.656293338930354 2.5701946946161791 96.305069830740877 2.5061637616664392 95.532205610732049 2.4433131328986759 94.722154327365189 2.3812407800659359 93.889578416120742 2.319572133693443 93.048311226452213 2.257923331676631 92.211706870162374 2.195860455194603 91.393072001531209 2.0685679294110897 89.809460344875959 2.003325342581054 89.04586501964134 1.9363500110025664 88.333353522292768 1.8673055406493542 87.697209384432796 1.7960045456701803 87.171127692763221 1.7224931564479862 86.793973628457351 1.6469711321080045 86.602540378443862 1.5707963267948963 86.602540378443862 + 0 9 0.30404471828653629 7 0.64918916252934122 7 1 9 +7 0 0 8 23 4 5.7595865315812871 400 5.7595865315812871 403.54687357661732 5.7629069293083264 407.0716639172436 5.7694749436140578 410.487699155016 5.7788372822703495 413.75575290976724 5.7905468978362755 416.85651205299661 5.804200902300904 419.78454290273055 5.8195042660091909 422.54491274781367 5.8543892203674712 427.95014269520948 5.874205657532519 430.57179432632284 5.8956431336493971 433.03715988364036 5.9186431153591563 435.35355519797133 5.9431911157077124 437.52200811136817 5.9693063153241566 439.53948272348691 5.9970603676200325 441.39802719245961 6.0537021647981906 444.62485641346274 6.0823115099356198 446.02229896119849 6.1125302674090722 447.25923114449233 6.1443481994298761 448.30828448674504 6.1776550195756252 449.13732104001321 6.2122248094106727 449.71137685489032 6.2476523829853585 450 6.2831853071795862 450 + 0 9 0.32715154983796968 7 0.67848367337201809 7 1 9 +7 0 0 8 23 4 4.7123889803846897 86.602540378443834 4.6414515088523443 86.602540378443834 4.5709558474254868 86.76855436030219 4.5020903021086447 87.096991301101312 4.4351287128726282 87.559643674084498 4.3701562258480955 88.124612677935161 4.3070642203791722 88.7634768853476 4.2456065690582925 89.453947255998813 4.1205249322043267 90.961452312325036 4.0570677366948757 91.784169844340013 3.9942180422337055 92.631457510690936 3.9315176720027551 93.48864237267361 3.8685613865121442 94.341495300176661 3.8049518990899482 95.175736723592308 3.7402617286949473 95.976668732951225 3.6130930765252778 97.413920784822892 3.5508531282366924 98.058874567884871 3.4868327051487182 98.646807838009721 3.4208942233135531 99.157716307234637 3.3530653240854145 99.568620428735727 3.2835130923467619 99.855699311460796 3.2126585019782485 100 3.1415926535897931 100 + 0 9 0.32715154983796968 7 0.67848367337201809 7 1 9 +7 0 0 8 86 13 2.7300758075223057 190 2.7300758075223057 188.76161711057227 2.73198839472064 187.55133668015193 2.7356595879105567 186.40804485479049 2.7406522245640779 185.33795497726547 2.7466665999124618 184.34258844053036 2.7534345015999824 183.4162771353935 2.7608247966701325 182.54924607309326 2.7805106679886924 180.5313877921306 2.7934228662572296 179.44012090542088 2.8074042576548592 178.42489439075112 2.8224021612079322 177.47714125871727 2.8383853128399443 176.58765276942751 2.8553986657883739 175.75234570339671 2.8735299500160485 174.96696097018872 2.9096367995004702 173.60217638596475 2.927074703391964 173.01544757903642 2.9455701846587412 172.46336132523098 2.9653382299711857 171.94696597602535 2.9865550769566158 171.47070368601692 3.0094637838744882 171.044924719389 3.0342362135094789 170.68192128165288 3.0846904814586811 170.16788483391167 3.110457736212882 169.98675095042276 3.1373772459573144 169.90241768877223 3.1644097931300808 169.92983296212577 3.1907387356792545 170.06246027525333 3.2157117427758561 170.28378283343829 3.2387860886964592 170.56795276727468 3.2857128896829386 171.28490034470798 3.3095267559518353 171.75813983885746 3.3315889559519829 172.28669212661248 3.3520793566732001 172.86264456356133 3.3712426139199891 173.47925753251525 3.3892171781517373 174.13467786991569 3.4061709628706178 174.82956714675092 3.4315765607080646 176.00111900189935 3.4406202276953 176.44739232078726 3.4493683641263591 176.90942117645849 3.4578076048696391 177.38676190073474 3.4659242604470752 177.87897923803828 3.473704317034132 178.38564634539176 3.4811334364598099 178.90634479241825 3.4952602825731667 179.97496970201598 3.5019582387828598 180.52299721930251 3.5082759977769666 181.08420673921333 3.5141984025436779 181.65818491571483 3.5197099661181288 182.24464543072799 3.5247948715823951 182.84342899412766 3.5294369720654961 183.45450334374323 3.5385783136065494 184.81704385450712 3.5430774304692174 185.60147540318962 3.5470027815210834 186.43393805468477 3.550193052094881 187.31387149619184 3.552464823959987 188.23647567906212 3.553634828362437 189.1915419192367 3.5535877444215225 190.16041200836165 3.5507263605782593 192.52143481281828 3.5466264819059488 193.84478773876532 3.540673500034889 195.06679581640853 3.5333903287665258 196.19442250073351 3.5251084225945828 197.2339901412731 3.516072019876451 198.19784034352128 3.5063476353219669 199.100910190511 3.4816461951625191 201.11765616922102 3.4662615750150878 202.17669187279171 3.4497197612770401 203.16359594026292 3.4319965274128248 204.08585426002017 3.4130562502099866 204.9499797977617 3.3927629809540236 205.75731315708825 3.370961354722068 206.5085724462667 3.3350837042681274 207.55059273349855 3.3227385987925833 207.87877699148535 3.3101400373711489 208.18373555748497 3.2973072930831178 208.46471177911445 3.2842597447996993 208.72099547901203 3.2710176981806867 208.95192203202214 3.2576032066711278 209.15687144238044 3.2326080049219881 209.48565334621975 3.2207392065634544 209.6214488622964 3.2084220832166892 209.74086778055747 3.1956632541851522 209.841223344334 3.1824987868080563 209.9195218531847 3.1690046109869345 209.9730562872202 3.1553069337122155 209.99999993142859 3.1415926535897936 210 + 0 9 0.073876687960228921 7 0.18146279930185341 7 0.27297502317927325 7 0.35146796836731969 7 0.45078644852611266 7 0.50839166691615778 7 0.56599530822916722 7 0.63428155117843577 7 0.73589383894819183 7 0.87241439129297038 7 0.94164192250558687 7 1 9 +7 0 0 8 86 13 1.5707963267948968 65.825756949558411 1.6327154712662824 65.825756949558411 1.6932291717524472 65.864006867500905 1.7507575795202066 65.937442892223871 1.8052712051910964 66.036312569896907 1.856761496125801 66.15335170344234 1.9055415063953094 66.282483552944811 1.952099936317812 66.420471346860978 2.0629161296348029 66.778932482089601 2.1250872198225084 67.006800398456491 2.1853339544706767 67.244156185569551 2.2442620112456466 67.487414231305635 2.3025351264202438 67.733314062545347 2.3606629110135016 67.979402450812643 2.4192472016931634 68.223500209089394 2.5302050784324877 68.667615336463385 2.5817194923431264 68.866839100938464 2.6345541235314025 69.06107511247879 2.6893439271069774 69.248614551513228 2.746579728106743 69.426477008510119 2.8069200610078164 69.589274370436641 2.8708713445249514 69.730508107268591 2.9992017060969078 69.932606288496331 3.0640476966405026 70.004909868877107 3.1311719850682302 70.039355662624061 3.1983917367763195 70.028318240219718 3.2641727172498611 69.974453483590707 3.3272181349982342 69.886050094789667 3.3862870149554607 69.774683728264634 3.5081798163713582 69.498670248443474 3.5714250919605042 69.319625207022071 3.6315898963777626 69.124464927538256 3.6892108940849053 68.918088997427191 3.7449840031488155 68.70476714178713 3.7993700099136132 68.486956905337252 3.8529595443561395 68.266363258980974 3.937551875106212 67.914511323779521 3.9686270521261031 67.784481815413258 3.9997344878372516 67.654297451190075 4.0308853739217598 67.524679509972557 4.0620919606083179 67.396357443356322 4.0933675566722023 67.270068875670106 4.124726529435276 67.146559603975803 4.1876412188668342 66.906610876783731 4.2192025058601512 66.790155974378578 4.2508767385050721 66.677978633765278 4.2826801747989798 66.570823982696439 4.3146367579775191 66.469422533765098 4.346778116514594 66.374490184404721 4.3791435641223728 66.286728216889173 4.4504690845129815 66.11210000381476 4.491002003142964 66.024851515159256 4.5335175110851669 65.947703969718717 4.5780101363095511 65.884232047726371 4.6242947661492 65.838676004199897 4.671990288798467 65.815204415050005 4.7203649033722543 65.816217123196935 4.8385980686239742 65.873356695599171 4.9051850188102994 65.955074132754632 4.9674898644093322 66.072897682052684 5.0260608936826561 66.214413321800095 5.0812532833458581 66.371581754615221 5.1336879948128482 66.538559525712174 5.1841437822594489 66.713161178984919 5.3004316740301887 67.141550836337416 5.3644149845568734 67.397608881735124 5.4271937142726046 67.659694988105471 5.4894601011457427 67.92460429403188 5.5518865820242498 68.189151454086755 5.6151397004226302 68.450150063818768 5.6799108441584014 68.704352379472581 5.7820106096441055 69.070516194378229 5.8164404445381965 69.188355493726078 5.850946054836804 69.299959962125172 5.8855291296563488 69.404507511993899 5.9201917940156994 69.501233167507081 5.9549345429758302 69.589436335509944 5.9897541757794714 69.668488076432126 6.0540515696396966 69.796299944449615 6.084361898704401 69.849526935371983 6.1156117040988267 69.896686629941101 6.1478015408718143 69.936560691373231 6.1808677843451756 69.967806999600143 6.2146568822517638 69.989221486740504 6.2488996068735307 69.999999972571445 6.2831853071795862 70 + 0 9 0.073876687960228921 7 0.18146279930185341 7 0.27297502317927325 7 0.35146796836731969 7 0.45078644852611266 7 0.50839166691615778 7 0.56599530822916722 7 0.63428155117843577 7 0.73589383894819183 7 0.87241439129297038 7 0.94164192250558687 7 1 9 +7 0 0 8 23 4 3.1415926535897931 210 3.1210614961277394 210.00000010265583 3.1005291311075647 209.93977343220345 3.0802162982823336 209.81934542997405 3.060284995992693 209.64146807704995 3.0408510042354786 209.41030407615489 3.0219936054749454 209.13045541836325 3.0037625031966315 208.80633633462796 2.9570088239511896 207.83713099429386 2.9296594696116953 207.12197755130393 2.9040228867397606 206.31025246004447 2.8800610357605061 205.41069337265455 2.8577522026420392 204.42944864183883 2.8371056950111546 203.36899179251105 2.8181483011816177 202.22871149661322 2.7852216827921472 199.8723811516461 2.7709760875281595 198.67075640785762 2.7583507212744514 197.39099658337528 2.7475970196832398 196.03237707895312 2.739053731187802 194.5987376061355 2.7330886214394798 193.09989869850125 2.7300758075223053 191.554374056744 2.7300758075223053 190 + 0 9 0.23911948610599457 7 0.63591333721726562 7 1 9 +7 0 0 8 23 4 0 70 0.051327893655133572 70.000000041062307 0.1026585095332937 69.975913030090624 0.1536145142233849 69.927731557706068 0.20396142023838504 69.856930569898694 0.25355894084285602 69.765831025734656 0.30232997965063024 69.65711085521778 0.35024725499271447 69.533463217305211 0.47547900793230546 69.171622753195393 0.55125596438760471 68.911912620840965 0.62536924204793554 68.628209581487553 0.69830566983646758 68.329050162545343 0.77052910495163474 68.022247356855743 0.84253146084878594 67.71504812589032 0.91487134073599652 67.414277104885272 1.0559406020423046 66.864292017065196 1.1244501887663443 66.612974265628466 1.1944986103494166 66.379922852188102 1.2663529078851745 66.17381782714574 1.340143255040398 66.005326901049187 1.4158015554213002 65.886011034309178 1.4930776239576975 65.825756949558411 1.5707963267948966 65.825756949558411 + 0 9 0.23911948610599457 7 0.63591333721726562 7 1 9 +7 0 0 7 20 4 5.8716684611120975 190 5.8716684611120975 188.40529526822812 5.8749059028716166 186.81699263164407 5.8813321069643507 185.28146610968872 5.8904651265717982 183.8194733092634 5.9018780409367047 182.44087859992891 5.9151979318998391 181.14756859074458 5.9462084611711727 178.64894098900859 5.9641289663954833 177.45327801148096 5.9838251760732435 176.34076071834318 6.0052210062401752 175.31033358514742 6.0282871279818746 174.36355769593391 6.0530414572620703 173.50466322258802 6.1044269515590086 172.03087512917583 6.1308375000050619 171.40311466706285 6.1588814209752867 170.86877872094436 6.1884827860001463 170.44450690892319 6.2194178500469297 170.14859873510889 6.2512650406347934 170 6.2831853071795862 170 + 0 8 0.32749647483565042 6 0.67535626432716744 6 1 8 +7 0 0 7 20 4 4.7123889803846897 134.17424305044165 4.6326537437960944 134.17424305044165 4.5532394662454161 134.10950158823803 4.4756303392982897 133.98093441747497 4.4000913717954164 133.80144025823813 4.3266832464327729 133.58463698586775 4.2551915157717408 133.34204238483454 4.1106230834163906 132.80607638506953 4.0376765392582641 132.51031302161269 3.9653735469234719 132.20408324999829 3.8931647386010106 131.89522935165351 3.8205023141418311 131.591632576276 3.7468598154328787 131.30105579191766 3.6010565258622278 130.78164824019552 3.5290824764252773 130.54984232049199 3.4551199134103063 130.34511406165251 3.3790487521878019 130.1778232028887 3.3010107446235413 130.05943531939073 3.2213933199517744 130 3.1415926535897931 130 + 0 8 0.32749647483565042 6 0.67535626432716744 6 1 8 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +7 0 0 7 20 4 0 170 0.030225785850175768 170 0.060403942208535177 170.13323829157676 0.089809656452376707 170.39892023771003 0.11805541204867875 170.78166224300142 0.14492818020641529 171.26570088958786 0.17034350106111606 171.83645995042141 0.22097719814426409 173.20566738156501 0.24587007505197889 174.02300961145505 0.26911311729308007 174.92708234710466 0.29073064043857233 175.91279129804428 0.31070894112663172 176.97782263526184 0.32899625972681701 178.12264337007468 0.36230785920280351 180.61524721177804 0.37725325445837399 181.9676846606753 0.39011764872841503 183.41728858328361 0.40046937309713293 184.96339172675098 0.40780791812416606 186.59601333953287 0.41151684606748784 188.29315701982478 0.41151684606748784 190 + 0 8 0.30759457669048318 6 0.64982227833657946 6 1 8 +7 0 0 7 20 4 3.1415926535897931 130 3.0660281889643519 130 2.990583169127206 130.05329228421115 2.9164748151389448 130.15958274693631 2.8440992178683127 130.31074365945841 2.7736158232905277 130.49706344959191 2.70495819896867 130.70955796991018 2.5631379941723229 131.19840252074181 2.490285660793738 131.47942926704206 2.4185365367169682 131.77519479638855 2.3473926232230196 132.07805706842547 2.2763352439147004 132.38049995237745 2.2048371881245359 132.67525479805303 2.0576203695522826 133.23927066004759 1.9818085176967826 133.50790196241167 1.9039233721279634 133.75038739924142 1.8236483193528268 133.95324155007785 1.7409942942068719 134.10007506789546 1.6561384758036586 134.17424305044159 1.5707963267948966 134.17424305044159 + 0 8 0.30759457669048318 6 0.64982227833657946 6 1 8 +7 0 0 7 20 4 0 210 0.030225781949774877 210.00000015112892 0.060403947046212103 209.86676130590678 0.089809652021665798 209.60108031223749 0.11805541820573318 209.218337305402 0.14492817656264201 208.73429928613263 0.17034350101405416 208.16354005084071 0.22097719814238648 206.79433261849749 0.24587007505078695 205.97699038859366 0.26911311729224341 205.07291765293593 0.29073064043839469 204.0872087019697 0.31070894112672143 203.02217736473835 0.32899625972729307 201.87735662989815 0.36230785920336483 199.38475278817143 0.37725325445872215 198.03231533928286 0.390117648728741 196.58271141667572 0.40046937309720754 195.03660827322122 0.40780791812423445 193.40398666044547 0.41151684606748784 191.70684298016479 0.41151684606748784 190 + 0 8 0.30759457708374965 6 0.64982227853976171 6 1 8 +7 0 0 7 20 4 0 130 0.075564454874439413 129.99999993954845 0.15100949674968245 130.05329244438005 0.22511782661739943 130.15958252985621 0.29749345235156621 130.31074383584001 0.36797682046048319 130.49706338173036 0.43663445448953642 130.70955796945879 0.57845465941195773 131.19840252072038 0.65130699279232651 131.47942926702643 0.72305611686996407 131.77519479637638 0.79420003036601372 132.07805706842194 0.86525740967521614 132.38049995237844 0.9367554654670105 132.67525479806048 1.083972284040347 133.23927066005763 1.1597841358952055 133.50790196241874 1.237669281464072 133.75038739924679 1.3179443342382484 133.95324155008026 1.4005983593840572 134.10007506789648 1.4854541777866581 134.17424305044159 1.5707963267948966 134.17424305044159 + 0 8 0.30759457708374965 6 0.64982227853976171 6 1 8 +1 0 300 1 0 +2 0 0 1 0 -0 1 50 +7 0 0 7 20 4 5.8716684611120975 190 5.8716684611120975 191.59470473177032 5.8749059028716193 193.18300736835764 5.8813321069643223 194.71853389030395 5.8904651265718124 196.18052669073927 5.9018780409366576 197.55912140006541 5.9151979318998142 198.85243140925283 5.9462084611708423 201.35105901096543 5.9641289663948038 202.54672198847359 5.9838251760721368 203.65923928159609 6.0052210062386386 204.68966641477729 6.0282871279797714 205.63644230398049 6.0530414572594031 206.49533677731949 6.1044269515080547 207.96912486937774 6.1308374961490646 208.59688514306879 6.1588814275196162 209.13122176228288 6.1884827812567487 209.55549250885861 6.2194178552699579 209.85140168924835 6.2512650364101381 209.99999984039866 6.2831853071795862 210 + 0 8 0.32749647504072238 6 0.67535626474437049 6 1 8 +7 0 0 7 20 4 4.7123889803846897 134.17424305044165 4.792124216973205 134.17424305044165 4.871538494524069 134.109501588238 4.9491476214706687 133.98093441747562 5.0246865889741397 133.80144025823762 5.0980947143362885 133.58463698586883 5.1695864449974964 133.342042384835 5.3141548773514753 132.80607638507519 5.3871014215083353 132.51031302162392 5.4594044138419315 132.20408325001534 5.5316132221631182 131.89522935167579 5.60427564662095 131.59163257630365 5.677918145328567 131.30105579194895 5.8237214347629163 130.78164824070652 5.8956954738428466 130.54984239343437 5.9696580651840625 130.34511387364307 6.0457291958282866 130.17782343218008 6.1237672294309933 130.05943515068626 6.2033846302559654 130.00000006384056 6.2831853071795862 130 + 0 8 0.32749647504072238 6 0.67535626474437049 6 1 8 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +1 0 200 1 0 +2 0 0 1 0 -0 1 20 +1 0 40 1 0 +1 0 0 1 0 +2 0 0 1 0 -0 1 20 +1 0 160 1 0 +Curves 18 +2 0 0 800 0 0 1 1 0 -0 -0 1 0 100 +7 0 0 8 23 4 86.602540378443834 -50.000000000000043 400 86.602540378443834 -50.000000000000043 396.4531264233774 86.768554360301678 -49.712441623392252 392.92833608277681 87.096991301103003 -49.143655969881841 389.51230084494648 87.559643674082039 -48.329700648459557 386.24424709027198 88.124612677937151 -47.303758601946697 383.14348794697975 88.763476885346648 -46.096633933969066 380.21545709727701 89.453947255999054 -44.730534623268426 377.45508725218542 90.961452312325122 -41.584580251230875 372.04985730479018 91.784169844339857 -39.781402281845395 369.42820567367704 92.631457510690922 -37.81125762107866 366.96284011636072 93.48864237267378 -35.675359427746407 364.64644480202827 94.341495300176689 -33.371375094216411 362.47799188863092 95.175736723592081 -30.894400229760695 360.46051727651405 95.976668732951339 -28.235197605551782 358.60197280754011 97.413920783548775 -22.756398616550438 355.37514358939779 98.05887438439548 -19.967859727516355 353.97770142062154 98.646808131230941 -17.001060903351803 352.74076825489283 99.157716247916952 -13.856554777440659 351.69171562635694 99.568620170602742 -10.546176703746648 350.86267948835513 99.855699662295592 -7.0960544318152783 350.28862243838159 99.999999822335354 -3.55329295081635 350.00000035532935 100 0 350 + 0 9 0.32715155003298801 7 0.67848367377663077 7 1 9 +1 100 -2.4492127076447545e-14 0 0 0 1 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 100 +7 0 0 8 23 4 100 0 350 100.00000016788265 3.357653056092063 349.99999966423474 99.871153979567325 6.7082922507060294 350.25770810060493 99.614413693494157 9.9811535532793023 350.77111458667099 99.244989236204319 13.133667254014087 351.51570531988671 98.782719490160005 16.14106204554367 352.46209608878792 98.247314081381845 18.991065369133018 353.58237755135616 97.656293340043064 21.681267443995591 354.85222820605424 96.305069830741061 27.094898672399299 357.84920888955003 95.532205610731751 29.776083412862121 359.61622715531161 94.722154327365587 32.277992523382729 361.54040041871144 93.889578416120571 34.609753071732321 363.61204164396673 93.048311226451844 36.776998731952766 365.8264229027584 92.211706870163113 38.783329440035715 368.18305324271273 91.393072001530825 40.629443402342417 370.68769525783222 89.809460344875703 44.020678864939597 376.0736018517199 89.045865019642378 45.559762660744155 378.9594576910697 88.333353522290722 46.923337441037496 382.03427944841542 87.697209384435155 48.087216148864847 385.30662787333353 87.171127692761729 49.015295205844701 388.77333266748747 86.793973628457792 49.668405227687359 392.41514581060738 86.602540378443862 50 396.1912597343462 86.602540378443862 50 400 + 0 9 0.30404471865854837 7 0.64918916271671423 7 1 9 +7 0 0 8 23 4 100 0 450 100 3.3576535464432191 450 99.871154312247143 6.7082918702808545 449.74229256882165 99.614413450153194 9.9811536835594623 449.22888491692595 99.244989177299104 13.133667136739369 448.48429456674455 98.782719765236706 16.141061698735722 447.53790447273542 98.247313911152233 18.991065751063456 446.41762209624159 97.656293338930354 21.681267448453593 445.14777179147779 96.305069830740891 27.09489867239995 442.15079111044957 95.532205610732319 29.776083412860999 440.38377284469061 94.722154327364748 32.277992523383702 438.45959958128537 93.88957841612077 34.609753071732086 436.38795835603389 93.048311226452682 36.776998731951778 434.17357709724484 92.211706870162118 38.783329440037349 431.81694675728357 91.393072001531223 40.629443402341558 429.31230474216915 89.809460344875973 44.020678864939015 423.92639814828101 89.045865019641511 45.559762660746543 421.04054230892496 88.333353522292256 46.923337441033972 417.96572055159834 87.697209384433535 48.087216148866737 414.6933721266472 87.17112769276271 49.015295205845263 411.22666733252822 86.793973628457522 49.668405227686577 407.58485418938534 86.602540378443862 50 403.80874026565544 86.602540378443862 50 400 + 0 9 0.30404471828653629 7 0.64918916252934122 7 1 9 +7 0 0 8 23 4 86.602540378443834 -50.000000000000043 400 86.602540378443834 -50.000000000000043 403.54687357661732 86.768554360302232 -49.712441623391754 407.0716639172436 87.09699130110117 -49.143655969883547 410.487699155016 87.559643674084654 -48.329700648456935 413.75575290976724 88.124612677935062 -47.303758601949092 416.85651205299661 88.763476885347615 -46.096633933967624 419.78454290273055 89.453947255998813 -44.730534623268937 422.54491274781367 90.961452312325036 -41.584580251231031 427.95014269520948 91.784169844340013 -39.781402281845253 430.57179432632284 92.631457510690936 -37.811257621078354 433.03715988364036 93.488642372673581 -35.675359427746841 435.35355519797133 94.341495300176646 -33.37137509421671 437.52200811136817 95.175736723592308 -30.89440022975991 439.53948272348691 95.976668732951225 -28.235197605552226 441.39802719245961 97.413920784822892 -22.756398611693562 444.62485641346274 98.058874567884601 -19.967859324472435 446.02229896119849 98.646807838010218 -17.001061271986877 447.25923114449233 99.157716307234622 -13.856554899211012 448.30828448674504 99.568620428735201 -10.546176567483982 449.13732104001321 99.855699311461152 -7.0960548419637099 449.71137685489032 100 -3.5532924194227782 450 100 0 450 + 0 9 0.32715154983796968 7 0.67848367337201809 7 1 9 +7 0 0 8 86 13 190 20 445.82575694955841 188.76161711057227 20 445.82575694955841 187.55133668015193 19.91235337387026 445.86400686750096 186.40804485479049 19.744123905050216 445.93744289222383 185.33795497726547 19.514902285540977 446.03631256989695 184.34258844053036 19.237873159851539 446.15335170344235 183.4162771353935 18.925064118927583 446.28248355294483 182.54924607309326 18.582260868803356 446.42047134686101 180.5313877921306 17.665560569655433 446.7789324820896 179.44012090542088 17.061450737150739 447.00680039845656 178.42489439075112 16.40377787695131 447.2441561855693 177.47714125871727 15.694221315276218 447.4874142313061 176.58765276942751 14.933544392727526 447.73331406254499 175.75234570339671 14.118946812391625 447.97940245081276 174.96696097018872 13.245592454199262 448.22350020908942 173.60217638596475 11.495728687255017 448.66761533646343 173.01544757903642 10.646755069979088 448.86683910093825 172.46336132523098 9.7423084173559129 449.0610751124795 171.94696597602535 8.771423029278985 449.24861455151228 171.47070368601692 7.7249441623440038 449.42647700851086 171.044924719389 6.5904239412074901 449.58927437043644 170.68192128165288 5.3591604830220598 449.73050810726863 170.16788483391167 2.8445553031042996 449.93260628849634 169.98675095042276 1.5578500753039846 450.00490986887729 169.90241768877223 0.21126482985045633 450.03935566262362 169.92983296212577 -1.1418347912938847 450.02831824022019 170.06246027525333 -2.4583899354909087 449.97445348359048 170.28378283343829 -3.704622003922788 449.88605009478971 170.56795276727468 -4.8532125714778402 449.77468372826468 171.28490034470798 -7.1832615379201048 449.49867024844349 171.75813983885746 -8.3610693252848058 449.31962520702172 172.28669212661248 -9.4474000731872163 449.12446492753941 172.86264456356133 -10.451521549066081 448.91808899742563 173.47925753251525 -11.386037243846355 448.70476714178824 174.13467786991569 -12.258255622356449 448.48695690533697 174.82956714675092 -13.076870757778455 448.26636325898102 176.00111900189935 -14.297448989351548 447.91451132377955 176.44739232078726 -14.730560988794394 447.78448181541324 176.90942117645849 -15.148186634249697 447.65429745119013 177.38676190073474 -15.549790747042026 447.5246795099726 177.87897923803828 -15.934838498820188 447.39635744335635 178.38564634539176 -16.302795411557238 447.27006887567012 178.90634479241825 -16.653127357550481 447.14655960397596 179.97496970201598 -17.317464667277328 446.90661087678365 180.52299721930251 -17.631473643437698 446.79015597437859 181.08420673921333 -17.926789246506338 446.67797863376529 181.65818491571483 -18.202858939283349 446.57082398269648 182.24464543072799 -18.459115888765186 446.469422533765 182.84342899412766 -18.694978966144653 446.37449018440464 183.45450334374323 -18.909852746810909 446.28672821688906 184.81704385450712 -19.332245100108075 446.1121000038147 185.60147540318962 -19.539596822360508 446.02485151515918 186.43393805468477 -19.720072090406671 445.94770396971876 187.31387149619184 -19.866415718649087 445.8842320477263 188.23647567906212 -19.970468445414252 445.83867600419984 189.1915419192367 -20.02405348878451 445.81520441504995 190.16041200836165 -20.021926857902038 445.81621712319691 192.52143481281828 -19.89076336064802 445.87335669559917 193.84478773876532 -19.702761135389348 445.95507413275465 195.06679581640853 -19.429423733772833 446.07289768205271 196.19442250073351 -19.093863615052797 446.21441332180007 197.2339901412731 -18.710705503299977 446.37158175461525 198.19784034352128 -18.29082509447235 446.53855952571217 199.100910190511 -17.836992814585784 446.71316117898493 201.11765616922102 -16.678595142648216 447.14155083633744 202.17669187279171 -15.953143137007794 447.39760888173515 203.16359594026292 -15.168455096124706 447.6596949881054 204.08585426002017 -14.322479844337014 447.92460429403201 204.9499797977617 -13.41268261852915 448.1891514540867 205.75731315708825 -12.431663425542878 448.4501500638188 206.5085724462667 -11.371142075518817 448.7043523794726 207.55059273349855 -9.6150274534363902 449.07051619437817 207.87877699148535 -9.0090680862683605 449.18835549372614 208.18373555748497 -8.3889992621684186 449.29995996212511 208.46471177911445 -7.7557979054120896 449.40450751199393 208.72099547901203 -7.1104820307283623 449.50123316750705 208.95192203202214 -6.4541494263144097 449.5894363355099 209.15687144238044 -5.7880163368502879 449.66848807643208 209.48565334621975 -4.5448090320959809 449.7962999444498 209.6214488622964 -3.9537215627022064 449.84952693537196 209.74086778055747 -3.3395736896957944 449.89668662994114 209.841223344334 -2.702739282198082 449.93656069137319 209.9195218531847 -2.0451075411731523 449.9678069996001 209.9730562872202 -1.3706044135127382 449.98922148674052 209.99999993142859 -0.68571400612111455 449.9999999725714 210 -9.1940344226770776e-17 450 + 0 9 0.073876687960228921 7 0.18146279930185341 7 0.27297502317927325 7 0.35146796836731969 7 0.45078644852611266 7 0.50839166691615778 7 0.56599530822916722 7 0.63428155117843577 7 0.73589383894819183 7 0.87241439129297038 7 0.94164192250558687 7 1 9 +7 0 0 8 23 4 210 0 450 210.00000010265583 1.0265578731026479 450.00000004106238 209.93977343220345 2.0531775184097456 449.97591303009051 209.81934542997405 3.0681562548346761 449.92773155770618 209.64146807704995 4.0627445455190339 449.85693056989879 209.41030407615489 5.0306400381813221 449.76583102573477 209.13045541836325 5.967555357915689 449.65711085521787 208.80633633462796 6.8708596524406813 449.53346321730521 207.83713099429386 9.18036994382215 449.17162275319538 207.12197755130393 10.523829394329878 448.91191262084078 206.31025246004447 11.774932713181144 448.62820958148819 205.41069337265455 12.936028214861254 448.32905016254443 204.42944864183883 14.00912988520586 448.02224735685644 203.36899179251105 14.995089694532629 447.71504812589012 202.22871149661322 15.894132086087689 447.41427710488529 199.8723811516461 17.445880100292989 446.86429201706522 198.67075640785762 18.112500879287495 446.61297426562851 197.39099658337528 18.699329061251035 446.37992285218809 196.03237707895312 19.196046924645117 446.17381782714585 194.5987376061355 19.588584661696704 446.00532690104916 193.09989869850125 19.861934582966615 445.88601103430921 191.554374056744 20 445.82575694955841 190 20 445.82575694955841 + 0 9 0.23911948610599457 7 0.63591333721726562 7 1 9 +7 0 0 7 20 4 190 -20.000000000000004 354.17424305044159 188.40529526822812 -20.000000000000004 354.17424305044159 186.81699263164407 -19.85163748421305 354.10950158823778 185.28146610968872 -19.557176296119984 353.98093441747551 183.8194733092634 -19.137252010782827 353.80144025823751 182.44087859992891 -18.609272595736567 353.58463698586797 181.14756859074458 -17.988894519498103 353.34204238483449 178.64894098900859 -16.533946836137474 352.8060763850695 177.45327801148096 -15.688010730209923 352.51031302161272 176.34076071834318 -14.751671354023641 352.20408324999806 175.31033358514742 -13.726821040656557 351.89522935165371 174.36355769593391 -12.613431647889318 351.59163257627586 173.50466322258802 -11.409602762233769 351.30105579191763 172.03087512917583 -8.8933777413809842 350.78164824019547 171.40311466706285 -7.5928607668802197 350.54984232049196 170.86877872094436 -6.2046298165562233 350.34511406165245 170.44450690892319 -4.7324669523921434 350.1778232028887 170.14859873510889 -3.188373618690417 350.05943531939067 170 -1.5960133272396184 349.99999999999994 170 0 349.99999999999994 + 0 8 0.32749647483565042 6 0.67535626432716744 6 1 8 +1 50 -1.2246063538223773e-14 0 0 0 1 +7 0 0 7 20 4 170 0 350 170 1.5112892925088235 350 170.13323829157676 3.0201974972875441 350.05329228421118 170.39892023771003 4.4882262522719127 350.15958274693634 170.78166224300142 5.8937836338085239 350.31074365945841 171.26570088958786 7.2253835508502897 350.49706344959191 171.83645995042141 8.4787047126246602 350.70955796991018 173.20566738156501 10.962745615245275 351.19840252074181 174.02300961145505 12.175956849896046 351.47942926704201 174.92708234710466 13.300618833567951 351.77519479638875 175.91279129804428 14.338824970520468 352.07805706842532 176.97782263526184 15.29122457343451 352.38049995237753 178.12264337007468 16.156924091174648 352.67525479805306 180.61524721177804 17.724100774430205 353.23927066004762 181.9676846606753 18.42161104257076 353.50790196241178 183.41728858328361 19.017546268068447 353.75038739924128 184.96339172675098 19.493771560366365 353.95324155007802 186.59601333953287 19.830029166827707 354.10007506789543 188.29315701982478 19.999999999999982 354.17424305044159 190 19.999999999999982 354.17424305044159 + 0 8 0.30759457669048318 6 0.64982227833657946 6 1 8 +7 0 0 7 20 4 210 0 350 210.00000015112892 1.5112890974887772 349.99999993954845 209.86676130590678 3.0201977385758565 350.05329244438008 209.60108031223749 4.4882260331561916 350.15958252985627 209.218337305402 5.8937839375949101 350.31074383584001 208.73429928613263 7.2253833710765241 350.49706338173036 208.16354005084071 8.4787047103152631 350.70955796945879 206.79433261849749 10.962745615153812 351.19840252072038 205.97699038859366 12.175956849838967 351.47942926702643 205.07291765293593 13.300618833526656 351.77519479637635 204.0872087019697 14.338824970513437 352.07805706842197 203.02217736473835 15.291224573438482 352.38049995237844 201.87735662989815 16.156924091197233 352.67525479806051 199.38475278817143 17.724100774456375 353.23927066005763 198.03231533928286 18.421611042587735 353.50790196241871 196.58271141667572 19.017546268081134 353.75038739924679 195.03660827322122 19.493771560372139 353.95324155008029 193.40398666044547 19.830029166829849 354.10007506789646 191.70684298016479 19.999999999999982 354.17424305044159 190 19.999999999999982 354.17424305044159 + 0 8 0.30759457708374965 6 0.64982227853976171 6 1 8 +2 0 0 300 0 0 1 1 0 -0 -0 1 0 50 +7 0 0 7 20 4 190 -20.000000000000004 354.17424305044159 191.59470473177032 -20.000000000000004 354.17424305044165 193.18300736835764 -19.851637484212873 354.10950158823789 194.71853389030395 -19.557176296121398 353.98093441747574 196.18052669073927 -19.13725201078212 353.80144025823745 197.55912140006541 -18.609272595738776 353.58463698586883 198.85243140925283 -17.988894519499269 353.34204238483494 201.35105901096543 -16.533946836152985 352.80607638507519 202.54672198847359 -15.688010730242384 352.51031302162386 203.65923928159609 -14.751671354075334 352.2040832500154 204.68966641477729 -13.726821040731068 351.89522935167571 205.63644230398049 -12.613431647990538 351.59163257630365 206.49533677731949 -11.409602762363491 351.30105579194895 207.96912486937774 -8.8933777438768757 350.78164824070649 208.59688514306879 -7.592860956872455 350.54984239343435 209.13122176228288 -6.2046294940723943 350.34511387364302 209.55549250885861 -4.7324671867573436 350.17782343218005 209.85140168924835 -3.1883733582241396 350.05943515068623 209.99999984039866 -1.5960135384724008 350.0000000638405 210 0 349.99999999999994 + 0 8 0.32749647504072238 6 0.67535626474437049 6 1 8 +1 20 -4.898425415289509e-15 0 0 0 1 +2 0 0 200 0 0 1 1 0 -0 -0 1 0 20 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 20 +Polygon3D 0 +PolygonOnTriangulations 42 +37 73 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 74 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +12 1 3 4 5 6 7 8 9 10 11 12 2 +p 3.2000000008 1 0 0.0801396424729663 0.160279284945933 0.240418927418899 0.344059678311254 0.464269142020703 0.584478605730153 0.692667123068657 0.790036788673312 0.887406454277966 0.943703227138983 1 +12 57 58 59 60 61 62 63 64 65 66 67 56 +p 3.2000000008 1 0 0.0801396424729663 0.160279284945933 0.240418927418899 0.344059678311254 0.464269142020703 0.584478605730153 0.692667123068657 0.790036788673312 0.887406454277966 0.943703227138983 1 +2 13 2 +p 3.2000000008 1 0 350 +2 14 50 +p 3.2000000008 1 0 350 +37 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 13 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +12 50 52 53 54 55 56 57 58 59 60 61 51 +p 3.2000000008 1 0 0.0888380629088787 0.177676125817757 0.266514188726636 0.355352251635515 0.467860989729305 0.587792374656292 0.695730621090579 0.803668867524867 0.900813289315726 0.950406644657863 1 +12 90 91 92 93 94 95 96 97 98 99 100 79 +p 3.2000000008 1 0 0.0888380629088787 0.177676125817757 0.266514188726636 0.355352251635515 0.467860989729305 0.587792374656292 0.695730621090579 0.803668867524867 0.900813289315726 0.950406644657863 1 +12 62 63 64 65 66 67 68 69 70 71 72 51 +p 3.2000000008 1 0 0.088838293672055 0.17767658734411 0.266514881016165 0.35535317468822 0.467862075455604 0.587793771912878 0.695732298724425 0.803670825535972 0.900815499666364 0.950407749833182 1 +12 68 80 81 82 83 84 85 86 87 88 89 79 +p 3.2000000008 1 0 0.088838293672055 0.17767658734411 0.266514881016165 0.35535317468822 0.467862075455604 0.587793771912878 0.695732298724425 0.803670825535972 0.900815499666364 0.950407749833182 1 +2 110 74 +p 3.2000000008 1 450 800 +2 62 73 +p 3.2000000008 1 450 800 +12 1 111 112 113 114 115 116 117 118 119 120 110 +p 3.2000000008 1 0 0.0801396424251088 0.160279284850218 0.240418927275326 0.344059678105756 0.46426914174342 0.584478605381083 0.69266712265498 0.790036788201487 0.887406453747994 0.943703226873997 1 +12 57 69 70 71 72 73 74 75 76 77 78 68 +p 3.2000000008 1 0 0.0801396424251088 0.160279284850218 0.240418927275326 0.344059678105756 0.46426914174342 0.584478605381083 0.69266712265498 0.790036788201487 0.887406453747994 0.943703226873997 1 +33 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 2 +p 3.2000000008 1 0 0.0231285091459492 0.0462570182918985 0.0759211946456314 0.110613958364555 0.145306722083479 0.179999485802403 0.214692249521327 0.245915736868358 0.274016875480686 0.296778797756672 0.317854651715919 0.338930505675165 0.366113007484298 0.397726788423167 0.429340569362036 0.460954350300906 0.492568131239775 0.524181912178644 0.555795693117514 0.587409474056383 0.615861876901365 0.64146903946185 0.667076202022334 0.700055159658209 0.738465903498935 0.776876647339662 0.815287391180388 0.853698135021114 0.892108878861841 0.930519622702567 0.965259811351283 1 +33 2 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 50 +p 3.2000000008 1 0 0.0231285091459492 0.0462570182918985 0.0759211946456314 0.110613958364555 0.145306722083479 0.179999485802403 0.214692249521327 0.245915736868358 0.274016875480686 0.296778797756672 0.317854651715919 0.338930505675165 0.366113007484298 0.397726788423167 0.429340569362036 0.460954350300906 0.492568131239775 0.524181912178644 0.555795693117514 0.587409474056383 0.615861876901365 0.64146903946185 0.667076202022334 0.700055159658209 0.738465903498935 0.776876647339662 0.815287391180388 0.853698135021114 0.892108878861841 0.930519622702567 0.965259811351283 1 +12 2 34 35 36 37 38 39 40 41 42 43 1 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.354638225555721 0.467138225555721 0.568388225555721 0.669638225555721 0.770888225555721 0.872138225555721 0.936069112777861 1 +12 1 3 4 5 6 7 8 9 10 11 12 2 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.354638225555721 0.467138225555721 0.568388225555721 0.669638225555721 0.770888225555721 0.872138225555721 0.936069112777861 1 +12 44 46 47 48 49 50 51 52 53 54 55 45 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.355492542195797 0.467992542195797 0.569242542195797 0.670492542195797 0.771742542195797 0.872992542195797 0.936496271097899 1 +12 1 73 74 75 76 77 78 79 80 81 82 62 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.355492542195797 0.467992542195797 0.569242542195797 0.670492542195797 0.771742542195797 0.872992542195797 0.936496271097899 1 +2 56 45 +p 3.2000000008 1 100 170 +2 90 101 +p 3.2000000008 1 100 170 +12 101 103 104 105 106 107 108 109 110 111 112 102 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.354547464712528 0.467047464712528 0.568297464712528 0.669547464712528 0.770797464712528 0.872047464712528 0.936023732356264 1 +12 62 63 64 65 66 67 68 69 70 71 72 51 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.354547464712528 0.467047464712528 0.568297464712528 0.669547464712528 0.770797464712528 0.872047464712528 0.936023732356264 1 +12 113 114 115 116 117 118 119 120 121 122 123 102 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.35454746277783 0.46704746277783 0.56829746277783 0.66954746277783 0.77079746277783 0.87204746277783 0.936023731388915 1 +12 50 52 53 54 55 56 57 58 59 60 61 51 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.35454746277783 0.46704746277783 0.56829746277783 0.66954746277783 0.77079746277783 0.87204746277783 0.936023731388915 1 +2 161 125 +p 3.2000000008 1 210 300 +2 113 124 +p 3.2000000008 1 210 300 +37 124 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 125 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +12 44 162 163 164 165 166 167 168 169 170 171 161 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.35549254222606 0.46799254222606 0.56924254222606 0.67049254222606 0.77174254222606 0.87299254222606 0.93649627111303 1 +12 1 3 4 5 6 7 8 9 10 11 12 2 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.35549254222606 0.46799254222606 0.56924254222606 0.67049254222606 0.77174254222606 0.87299254222606 0.93649627111303 1 +2 50 14 +p 3.2000000008 1 70 200 +2 1 13 +p 3.2000000008 1 70 200 +37 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 14 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +2 13 2 +p 3.2000000008 1 0 130 +2 14 50 +p 3.2000000008 1 0 130 +37 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 13 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +Surfaces 8 +1 0 0 800 0 0 1 1 0 -0 -0 1 0 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 100 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 50 +1 0 0 0 0 0 1 1 0 -0 -0 1 0 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 20 +1 0 0 300 0 0 1 1 0 -0 -0 1 0 +1 0 0 200 0 0 1 1 0 -0 -0 1 0 +1 0 0 0 0 0 1 1 0 -0 -0 1 0 +Triangulations 9 +37 36 1 0 +100 -2.44921270764475e-14 800 98.4807753012208 17.364817766693 800 93.9692620785908 34.2020143325669 800 86.6025403784439 50 800 76.6044443118978 64.2787609686539 800 64.2787609686539 76.6044443118978 800 50 86.6025403784439 800 34.2020143325669 93.9692620785908 800 17.364817766693 98.4807753012208 800 6.12303176911189e-15 100 800 -17.364817766693 98.4807753012208 800 -34.2020143325669 93.9692620785908 800 -50 86.6025403784439 800 -64.2787609686539 76.6044443118978 800 -76.6044443118978 64.278760968654 800 -86.6025403784438 50.0000000000001 800 -93.9692620785908 34.202014332567 800 -98.4807753012208 17.3648177666932 800 -100 1.45472826493243e-13 800 -98.4807753012208 -17.3648177666929 800 -93.9692620785909 -34.2020143325667 800 -86.602540378444 -49.9999999999998 800 -76.604444311898 -64.2787609686538 800 -64.2787609686541 -76.6044443118977 800 -50.0000000000002 -86.6025403784437 800 -34.2020143325671 -93.9692620785908 800 -17.3648177666933 -98.4807753012208 800 -2.84822621217373e-13 -100 800 17.3648177666927 -98.4807753012209 800 34.2020143325666 -93.969262078591 800 49.9999999999997 -86.602540378444 800 64.2787609686536 -76.604444311898 800 76.6044443118976 -64.2787609686542 800 86.6025403784437 -50.0000000000004 800 93.9692620785907 -34.2020143325673 800 98.4807753012207 -17.3648177666935 800 0 0 800 100 0 98.4807753012208 17.364817766693 93.9692620785908 34.2020143325669 86.6025403784439 50 76.6044443118978 64.2787609686539 64.278760968654 76.6044443118978 50 86.6025403784438 34.2020143325669 93.9692620785908 17.364817766693 98.4807753012208 0 100 -17.364817766693 98.4807753012208 -34.2020143325669 93.9692620785908 -50 86.6025403784439 -64.2787609686539 76.6044443118979 -76.6044443118978 64.278760968654 -86.6025403784438 50.0000000000001 -93.9692620785908 34.202014332567 -98.4807753012208 17.3648177666932 -100 1.4210854715202e-13 -98.4807753012208 -17.3648177666929 -93.9692620785909 -34.2020143325667 -86.602540378444 -49.9999999999998 -76.604444311898 -64.2787609686538 -64.2787609686541 -76.6044443118977 -50.0000000000002 -86.6025403784437 -34.2020143325671 -93.9692620785908 -17.3648177666933 -98.4807753012208 -2.8421709430404e-13 -100 17.3648177666927 -98.4807753012209 34.2020143325666 -93.969262078591 49.9999999999997 -86.602540378444 64.2787609686536 -76.604444311898 76.6044443118976 -64.2787609686542 86.6025403784437 -50.0000000000004 93.9692620785907 -34.2020143325673 98.4807753012207 -17.3648177666935 0 0 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 37 11 12 +512 902 1 1.36386965972777 +86.6025403784438 -50 400 100 -1.83690953073357e-14 350 86.8732667031317 -49.5281290308752 393.146938099824 87.6235772593243 -48.1882631494736 386.662410602174 88.7290516622297 -46.1210945615935 380.690815213948 90.4840004397121 -42.5751772682387 373.782555238023 92.7428861391894 -37.3999606121917 366.815019461706 95.0372320329239 -31.11148437027 360.858265526469 96.9671604229308 -24.4411486760561 356.380850902333 98.4525657430885 -17.52405054016 353.171507010994 99.5231396908821 -9.75421483502655 350.960675236214 99.8776181649079 -4.94584264829443 350.245215525427 100 -2.44921270764475e-14 0 100 -2.44921270764475e-14 0 98.4807753012208 17.364817766693 0 93.9692620785908 34.2020143325669 0 86.6025403784439 50 0 76.6044443118978 64.2787609686539 0 64.2787609686539 76.6044443118978 0 50 86.6025403784439 0 34.2020143325669 93.9692620785908 0 17.364817766693 98.4807753012208 0 6.12303176911189e-15 100 0 -17.364817766693 98.4807753012208 0 -34.2020143325669 93.9692620785908 0 -50 86.6025403784439 0 -64.2787609686539 76.6044443118978 0 -76.6044443118978 64.278760968654 0 -86.6025403784438 50.0000000000001 0 -93.9692620785908 34.202014332567 0 -98.4807753012208 17.3648177666932 0 -100 1.45472826493243e-13 0 -98.4807753012208 -17.3648177666929 0 -93.9692620785909 -34.2020143325667 0 -86.602540378444 -49.9999999999998 0 -76.604444311898 -64.2787609686538 0 -64.2787609686541 -76.6044443118977 0 -50.0000000000002 -86.6025403784437 0 -34.2020143325671 -93.9692620785908 0 -17.3648177666933 -98.4807753012208 0 -2.84822621217373e-13 -100 0 17.3648177666927 -98.4807753012209 0 34.2020143325666 -93.969262078591 0 49.9999999999997 -86.602540378444 0 64.2787609686536 -76.604444311898 0 76.6044443118976 -64.2787609686542 0 86.6025403784437 -50.0000000000004 0 93.9692620785907 -34.2020143325673 0 98.4807753012207 -17.3648177666935 0 100 -1.83690953073357e-14 350 86.6025403784439 50 400 99.6995364250708 7.74612569392024 350.60366789119 98.8633045221148 15.0348597287602 352.314017004824 97.6290308111529 21.6465307979184 354.928638859964 96.1385098653288 27.5206644597269 358.255381554833 94.0483026744096 33.9840672064279 363.324622594048 91.7501351704928 39.7732665735241 369.700044024682 89.7799093309045 44.0405258154732 376.326552497693 88.0846161813635 47.3402622878728 383.90964254567 87.0125364098992 49.2830451608201 391.563087645832 86.7079761092912 49.8169333693719 395.72529258068 100 -2.44921270764475e-14 450 99.6995349038219 7.74614536115343 449.396329038004 98.8632990204773 15.0348959199349 447.685971589172 97.6290200022516 21.6465795167683 445.071337728308 96.1384934421685 27.5207218309807 441.744580622317 94.0482819113588 33.9841246665353 436.675324162327 91.7501087080715 39.7733276178202 430.299875845487 89.779880280166 44.0405850374743 423.673337329156 88.0845894011337 47.3403121169944 416.090210848718 87.0125187464446 49.2830763468782 408.43673018339 86.7079714631656 49.8169414560564 404.274613176575 100 -2.44921270764475e-14 800 100 -2.44921270764475e-14 800 98.4807753012208 17.364817766693 800 93.9692620785908 34.2020143325669 800 86.6025403784439 50 800 76.6044443118978 64.2787609686539 800 64.2787609686539 76.6044443118978 800 50 86.6025403784439 800 34.2020143325669 93.9692620785908 800 17.364817766693 98.4807753012208 800 6.12303176911189e-15 100 800 -17.364817766693 98.4807753012208 800 -34.2020143325669 93.9692620785908 800 -50 86.6025403784439 800 -64.2787609686539 76.6044443118978 800 -76.6044443118978 64.278760968654 800 -86.6025403784438 50.0000000000001 800 -93.9692620785908 34.202014332567 800 -98.4807753012208 17.3648177666932 800 -100 1.45472826493243e-13 800 -98.4807753012208 -17.3648177666929 800 -93.9692620785909 -34.2020143325667 800 -86.602540378444 -49.9999999999998 800 -76.604444311898 -64.2787609686538 800 -64.2787609686541 -76.6044443118977 800 -50.0000000000002 -86.6025403784437 800 -34.2020143325671 -93.9692620785908 800 -17.3648177666933 -98.4807753012208 800 -2.84822621217373e-13 -100 800 17.3648177666927 -98.4807753012209 800 34.2020143325666 -93.969262078591 800 49.9999999999997 -86.602540378444 800 64.2787609686536 -76.604444311898 800 76.6044443118976 -64.2787609686542 800 86.6025403784437 -50.0000000000004 800 93.9692620785907 -34.2020143325673 800 98.4807753012207 -17.3648177666935 800 100 -2.44921270764475e-14 450 86.8732667031312 -49.5281290308762 406.853061900168 87.6235772593223 -48.1882631494772 413.337589397812 88.7290516622257 -46.1210945616012 419.309184786033 90.484000439705 -42.5751772682538 426.217444761952 92.7428861391805 -37.3999606122139 433.184980538269 95.0372320329138 -31.1114843703007 439.141734473506 96.9671604293251 -24.4411486612818 443.619149110997 98.4525657314274 -17.5240505708509 446.828492965207 99.5231396846886 -9.7542149066232 449.039324751509 99.877618163893 -4.94584257239082 449.754784472325 -40.169542465297 -91.5773326655057 730.434782608696 -40.169542465297 -91.5773326655057 695.652173913043 -8.25793454723327 -99.658449300667 695.652173913043 -40.1695424652969 91.5773326655057 278.260869565217 -8.25793454723323 99.658449300667 278.260869565217 -40.1695424652969 91.5773326655057 243.478260869565 54.6948158122427 -83.7166478262529 139.130434782609 54.6948158122427 -83.7166478262529 104.347826086957 78.9140509396393 -61.4212712689668 104.347826086957 -67.7281571625741 -73.5723910673132 765.217391304348 -87.9473751206489 -47.5947393037073 765.217391304348 24.5485487140799 -96.9400265939331 139.130434782609 -67.7281571625741 -73.5723910673132 730.434782608696 -87.9473751206489 47.5947393037074 591.304347826087 -87.9473751206489 47.5947393037074 556.521739130435 -98.6361303402722 16.4594590280734 556.521739130435 -67.7281571625741 73.5723910673132 591.304347826087 -67.7281571625741 73.5723910673132 556.521739130435 24.5485487140799 -96.9400265939331 173.913043478261 -8.25793454723323 99.658449300667 313.04347826087 24.5485487140799 96.940026593933 278.260869565217 -8.25793454723327 -99.658449300667 139.130434782609 94.5817241700635 -32.4699469204684 591.304347826087 78.9140509396393 -61.4212712689668 556.521739130435 94.5817241700635 -32.4699469204684 556.521739130435 -8.25793454723327 -99.658449300667 173.913043478261 78.9140509396393 -61.4212712689668 591.304347826087 24.5485487140799 96.940026593933 313.04347826087 -67.7281571625741 73.5723910673132 626.086956521739 -40.1695424652969 91.5773326655057 591.304347826087 -40.1695424652969 91.5773326655057 626.086956521739 -8.25793454723327 -99.658449300667 208.695652173913 -40.169542465297 -91.5773326655057 208.695652173913 78.9140509396393 -61.4212712689668 626.086956521739 54.6948158122427 -83.7166478262529 626.086956521739 24.5485487140799 96.940026593933 347.826086956522 54.6948158122427 83.7166478262529 347.826086956522 -40.169542465297 -91.5773326655057 243.478260869565 -67.7281571625741 -73.5723910673132 243.478260869565 54.6948158122427 -83.7166478262529 660.869565217391 24.5485487140799 -96.9400265939331 660.869565217391 -67.7281571625741 -73.5723910673132 278.260869565217 -87.9473751206489 -47.5947393037073 243.478260869565 54.6948158122427 83.7166478262529 382.608695652174 78.9140509396394 61.4212712689668 347.826086956522 -40.1695424652969 91.5773326655057 660.869565217391 -8.25793454723323 99.658449300667 660.869565217391 -87.9473751206489 -47.5947393037073 278.260869565217 78.9140509396394 61.4212712689668 382.608695652174 24.5485487140799 -96.9400265939331 695.652173913043 -8.25793454723327 -99.658449300667 660.869565217391 -8.25793454723323 99.658449300667 695.652173913043 24.5485487140799 96.940026593933 660.869565217391 -87.9473751206489 -47.5947393037073 313.04347826087 -98.6361303402722 -16.4594590280734 313.04347826087 -98.6361303402722 -16.4594590280734 278.260869565217 24.5485487140799 96.940026593933 695.652173913043 -8.25793454723327 -99.658449300667 730.434782608696 -40.169542465297 -91.5773326655057 765.217391304348 78.9140509396394 61.4212712689668 417.391304347826 24.5485487140799 96.940026593933 730.434782608696 54.6948158122427 83.7166478262529 730.434782608696 54.6948158122427 83.7166478262529 765.217391304348 78.9140509396394 61.4212712689668 765.217391304348 78.9140509396394 61.4212712689668 730.434782608696 -98.6361303402722 -16.4594590280734 347.826086956522 -98.6361303402722 16.4594590280734 347.826086956522 94.5817241700635 -32.4699469204684 626.086956521739 94.5817241700635 -32.4699469204684 278.260869565217 94.5817241700635 -32.4699469204684 243.478260869565 78.9140509396393 -61.4212712689668 278.260869565217 78.9140509396393 -61.4212712689668 243.478260869565 -98.6361303402722 16.4594590280734 382.608695652174 -87.9473751206489 47.5947393037074 382.608695652174 94.5817241700635 32.4699469204683 452.173913043478 78.9140509396393 -61.4212712689668 660.869565217391 78.9140509396393 -61.4212712689668 313.04347826087 54.6948158122427 -83.7166478262529 313.04347826087 -87.9473751206489 47.5947393037074 417.391304347826 -67.7281571625741 73.5723910673132 417.391304347826 54.6948158122427 -83.7166478262529 695.652173913043 54.6948158122427 -83.7166478262529 347.826086956522 24.5485487140799 -96.9400265939331 347.826086956522 -67.7281571625741 73.5723910673132 452.173913043478 -40.1695424652969 91.5773326655057 452.173913043478 -40.1695424652969 91.5773326655057 417.391304347826 24.5485487140799 -96.9400265939331 730.434782608696 -8.25793454723327 -99.658449300667 34.7826086956522 -40.169542465297 -91.5773326655057 34.7826086956522 94.5817241700635 32.4699469204683 34.7826086956522 24.5485487140799 -96.9400265939331 382.608695652174 -8.25793454723327 -99.658449300667 347.826086956522 -8.25793454723327 -99.658449300667 765.217391304348 -8.25793454723327 -99.658449300667 382.608695652174 -40.1695424652969 91.5773326655057 486.956521739131 -8.25793454723323 99.658449300667 486.956521739131 94.5817241700635 -32.4699469204684 660.869565217391 78.9140509396394 61.4212712689668 34.7826086956522 -8.25793454723327 -99.658449300667 417.391304347826 -40.169542465297 -91.5773326655057 417.391304347826 -40.169542465297 -91.5773326655057 69.5652173913043 -67.7281571625741 -73.5723910673132 34.7826086956522 -67.7281571625741 -73.5723910673132 69.5652173913043 -8.25793454723323 99.658449300667 521.739130434783 24.5485487140799 96.940026593933 486.956521739131 24.5485487140799 96.940026593933 521.739130434783 78.9140509396393 -61.4212712689668 695.652173913043 -40.169542465297 -91.5773326655057 452.173913043478 -67.7281571625741 -73.5723910673132 452.173913043478 -67.7281571625741 -73.5723910673132 104.347826086957 -87.9473751206489 -47.5947393037073 104.347826086957 -87.9473751206489 -47.5947393037073 69.5652173913043 94.5817241700635 32.4699469204683 69.5652173913043 54.6948158122427 -83.7166478262529 730.434782608696 -67.7281571625741 -73.5723910673132 486.956521739131 -87.9473751206489 -47.5947393037073 486.956521739131 -87.9473751206489 -47.5947393037073 452.173913043478 -87.9473751206489 -47.5947393037073 139.130434782609 -98.6361303402722 -16.4594590280734 104.347826086957 24.5485487140799 -96.9400265939331 765.217391304348 24.5485487140799 96.940026593933 556.521739130435 54.6948158122427 83.7166478262529 556.521739130435 -98.6361303402722 -16.4594590280734 139.130434782609 54.6948158122427 83.7166478262529 34.7826086956522 -87.9473751206489 -47.5947393037073 521.739130434783 -98.6361303402722 -16.4594590280734 486.956521739131 94.5817241700635 -32.4699469204684 695.652173913043 54.6948158122427 83.7166478262529 591.304347826087 78.9140509396394 61.4212712689668 556.521739130435 -98.6361303402722 -16.4594590280734 173.913043478261 -98.6361303402722 16.4594590280734 173.913043478261 -98.6361303402722 -16.4594590280734 521.739130434783 78.9140509396394 61.4212712689668 591.304347826087 -98.6361303402722 16.4594590280734 208.695652173913 78.9140509396394 61.4212712689668 69.5652173913043 -87.9473751206489 47.5947393037074 208.695652173913 -98.6361303402722 -16.4594590280734 556.521739130435 78.9140509396393 -61.4212712689668 730.434782608696 54.6948158122427 -83.7166478262529 765.217391304348 -87.9473751206489 47.5947393037074 243.478260869565 -67.7281571625741 73.5723910673132 208.695652173913 -98.6361303402722 16.4594590280734 591.304347826087 78.9140509396394 61.4212712689668 626.086956521739 94.5817241700635 32.4699469204683 591.304347826087 -67.7281571625741 73.5723910673132 243.478260869565 94.5817241700635 32.4699469204683 626.086956521739 94.5817241700635 32.4699469204683 660.869565217391 94.5817241700635 -32.4699469204684 730.434782608696 94.5817241700635 32.4699469204683 104.347826086957 24.5485487140799 96.940026593933 34.7826086956522 78.9140509396393 -61.4212712689668 765.217391304348 -67.7281571625741 73.5723910673132 278.260869565217 -87.9473751206489 47.5947393037074 626.086956521739 94.5817241700635 -32.4699469204684 104.347826086957 78.9140509396393 -61.4212712689668 69.5652173913043 94.5817241700635 -32.4699469204684 69.5652173913043 94.5817241700635 -32.4699469204684 765.217391304348 -40.1695424652969 91.5773326655057 313.04347826087 -67.7281571625741 73.5723910673132 660.869565217391 78.9140509396393 -61.4212712689668 139.130434782609 -8.25793454723323 99.658449300667 347.826086956522 54.6948158122427 83.7166478262529 69.5652173913043 78.9140509396394 61.4212712689668 104.347826086957 54.6948158122427 -83.7166478262529 173.913043478261 24.5485487140799 -96.9400265939331 208.695652173913 -40.1695424652969 91.5773326655057 695.652173913043 -8.25793454723323 99.658449300667 730.434782608696 94.5817241700635 32.4699469204683 139.130434782609 24.5485487140799 96.940026593933 382.608695652174 24.5485487140799 96.940026593933 765.217391304348 -8.25793454723327 -99.658449300667 243.478260869565 -8.25793454723323 99.658449300667 34.7826086956522 54.6948158122427 83.7166478262529 417.391304347826 94.5817241700635 -32.4699469204684 313.04347826087 -40.169542465297 -91.5773326655057 278.260869565217 78.9140509396394 61.4212712689668 452.173913043478 -67.7281571625741 -73.5723910673132 313.04347826087 78.9140509396393 -61.4212712689668 347.826086956522 24.5485487140799 96.940026593933 69.5652173913043 54.6948158122427 83.7166478262529 104.347826086957 54.6948158122427 -83.7166478262529 382.608695652174 -87.9473751206489 -47.5947393037073 347.826086956522 94.5817241700635 32.4699469204683 486.956521739131 24.5485487140799 -96.9400265939331 417.391304347826 -98.6361303402722 -16.4594590280734 382.608695652174 78.9140509396394 61.4212712689668 139.130434782609 -98.6361303402722 16.4594590280734 417.391304347826 94.5817241700635 32.4699469204683 173.913043478261 -8.25793454723327 -99.658449300667 452.173913043478 24.5485487140799 -96.9400265939331 34.7826086956522 -40.169542465297 -91.5773326655057 486.956521739131 -87.9473751206489 47.5947393037074 452.173913043478 -40.1695424652969 91.5773326655057 34.7826086956522 -67.7281571625741 -73.5723910673132 521.739130434783 -8.25793454723327 -99.658449300667 69.5652173913043 -67.7281571625741 73.5723910673132 486.956521739131 -40.169542465297 -91.5773326655057 104.347826086957 -87.9473751206489 -47.5947393037073 556.521739130435 -8.25793454723323 99.658449300667 69.5652173913043 -40.1695424652969 91.5773326655057 521.739130434783 -67.7281571625741 -73.5723910673132 139.130434782609 24.5485487140799 96.940026593933 104.347826086957 -98.6361303402722 -16.4594590280734 591.304347826087 -87.9473751206489 -47.5947393037073 173.913043478261 -8.25793454723323 99.658449300667 556.521739130435 54.6948158122427 83.7166478262529 139.130434782609 -98.6361303402722 16.4594590280734 626.086956521739 -98.6361303402722 -16.4594590280734 208.695652173913 24.5485487140799 96.940026593933 591.304347826087 -87.9473751206489 47.5947393037074 660.869565217391 -98.6361303402722 16.4594590280734 243.478260869565 78.9140509396394 61.4212712689668 173.913043478261 94.5817241700635 32.4699469204683 208.695652173913 54.6948158122427 83.7166478262529 626.086956521739 -87.9473751206489 47.5947393037074 278.260869565217 -67.7281571625741 73.5723910673132 695.652173913043 -67.7281571625741 73.5723910673132 34.7826086956522 78.9140509396394 61.4212712689668 660.869565217391 -67.7281571625741 73.5723910673132 313.04347826087 -40.1695424652969 91.5773326655057 730.434782608696 -40.1695424652969 91.5773326655057 69.5652173913043 -8.25793454723323 99.658449300667 765.217391304348 94.5817241700635 32.4699469204683 695.652173913043 -40.1695424652969 91.5773326655057 347.826086956522 94.5817241700635 -32.4699469204684 347.826086956522 -8.25793454723323 99.658449300667 104.347826086957 94.5817241700635 -32.4699469204684 139.130434782609 -8.25793454723323 99.658449300667 382.608695652174 78.9140509396393 -61.4212712689668 382.608695652174 78.9140509396393 -61.4212712689668 173.913043478261 54.6948158122427 -83.7166478262529 208.695652173913 54.6948158122427 -83.7166478262529 417.391304347826 24.5485487140799 96.940026593933 417.391304347826 24.5485487140799 96.940026593933 139.130434782609 54.6948158122427 83.7166478262529 173.913043478261 24.5485487140799 -96.9400265939331 452.173913043478 24.5485487140799 -96.9400265939331 243.478260869565 78.9140509396394 61.4212712689668 208.695652173913 54.6948158122427 83.7166478262529 452.173913043478 94.5817241700635 32.4699469204683 243.478260869565 -8.25793454723327 -99.658449300667 486.956521739131 -8.25793454723327 -99.658449300667 278.260869565217 78.9140509396394 61.4212712689668 486.956521739131 -40.169542465297 -91.5773326655057 313.04347826087 -87.9473751206489 47.5947393037074 34.7826086956522 -40.169542465297 -91.5773326655057 521.739130434783 -67.7281571625741 -73.5723910673132 347.826086956522 -67.7281571625741 -73.5723910673132 556.521739130435 94.5817241700635 32.4699469204683 521.739130434783 -87.9473751206489 -47.5947393037073 382.608695652174 -67.7281571625741 73.5723910673132 69.5652173913043 -87.9473751206489 -47.5947393037073 591.304347826087 54.6948158122427 -83.7166478262529 34.7826086956522 -98.6361303402722 -16.4594590280734 417.391304347826 -40.1695424652969 91.5773326655057 104.347826086957 -98.6361303402722 -16.4594590280734 626.086956521739 -98.6361303402722 16.4594590280734 452.173913043478 24.5485487140799 -96.9400265939331 69.5652173913043 -8.25793454723323 99.658449300667 139.130434782609 -98.6361303402722 16.4594590280734 660.869565217391 -8.25793454723327 -99.658449300667 104.347826086957 -87.9473751206489 47.5947393037074 486.956521739131 24.5485487140799 96.940026593933 173.913043478261 -87.9473751206489 47.5947393037074 695.652173913043 54.6948158122427 83.7166478262529 208.695652173913 -67.7281571625741 73.5723910673132 521.739130434783 -40.169542465297 -91.5773326655057 139.130434782609 -67.7281571625741 73.5723910673132 730.434782608696 78.9140509396394 61.4212712689668 243.478260869565 -67.7281571625741 -73.5723910673132 173.913043478261 -40.1695424652969 91.5773326655057 765.217391304348 -40.1695424652969 91.5773326655057 556.521739130435 -87.9473751206489 -47.5947393037073 208.695652173913 94.5817241700635 32.4699469204683 278.260869565217 78.9140509396393 -61.4212712689668 417.391304347826 -8.25793454723323 99.658449300667 591.304347826087 -98.6361303402722 16.4594590280734 34.7826086956522 -98.6361303402722 -16.4594590280734 243.478260869565 -98.6361303402722 16.4594590280734 278.260869565217 54.6948158122427 -83.7166478262529 452.173913043478 24.5485487140799 96.940026593933 626.086956521739 54.6948158122427 83.7166478262529 660.869565217391 24.5485487140799 -96.9400265939331 486.956521739131 -87.9473751206489 47.5947393037074 69.5652173913043 -87.9473751206489 47.5947393037074 313.04347826087 -67.7281571625741 73.5723910673132 104.347826086957 78.9140509396394 61.4212712689668 695.652173913043 -8.25793454723327 -99.658449300667 521.739130434783 -67.7281571625741 73.5723910673132 347.826086956522 -40.1695424652969 91.5773326655057 139.130434782609 -40.169542465297 -91.5773326655057 556.521739130435 94.5817241700635 32.4699469204683 730.434782608696 -8.25793454723323 99.658449300667 173.913043478261 -40.1695424652969 91.5773326655057 382.608695652174 94.5817241700635 -32.4699469204684 173.913043478261 -67.7281571625741 -73.5723910673132 591.304347826087 -8.25793454723323 99.658449300667 417.391304347826 78.9140509396393 -61.4212712689668 208.695652173913 -87.9473751206489 -47.5947393037073 626.086956521739 24.5485487140799 96.940026593933 208.695652173913 54.6948158122427 83.7166478262529 243.478260869565 54.6948158122427 -83.7166478262529 243.478260869565 -98.6361303402722 -16.4594590280734 660.869565217391 24.5485487140799 96.940026593933 452.173913043478 24.5485487140799 -96.9400265939331 278.260869565217 78.9140509396394 61.4212712689668 278.260869565217 -98.6361303402722 16.4594590280734 695.652173913043 54.6948158122427 83.7166478262529 486.956521739131 94.5817241700635 32.4699469204683 313.04347826087 -8.25793454723327 -99.658449300667 313.04347826087 -87.9473751206489 47.5947393037074 730.434782608696 78.9140509396394 61.4212712689668 521.739130434783 -98.6361303402722 -16.4594590280734 34.7826086956522 -40.169542465297 -91.5773326655057 347.826086956522 -67.7281571625741 73.5723910673132 765.217391304348 -67.7281571625741 -73.5723910673132 382.608695652174 78.9140509396393 -61.4212712689668 452.173913043478 -98.6361303402722 16.4594590280734 69.5652173913043 -87.9473751206489 -47.5947393037073 417.391304347826 94.5817241700635 32.4699469204683 556.521739130435 54.6948158122427 -83.7166478262529 486.956521739131 78.9140509396393 -61.4212712689668 34.7826086956522 -87.9473751206489 47.5947393037074 104.347826086957 -98.6361303402722 -16.4594590280734 452.173913043478 -67.7281571625741 73.5723910673132 139.130434782609 54.6948158122427 -83.7166478262529 69.5652173913043 24.5485487140799 -96.9400265939331 521.739130434783 -98.6361303402722 16.4594590280734 486.956521739131 -40.1695424652969 91.5773326655057 173.913043478261 24.5485487140799 -96.9400265939331 104.347826086957 -8.25793454723323 99.658449300667 208.695652173913 -87.9473751206489 47.5947393037074 521.739130434783 -8.25793454723327 -99.658449300667 556.521739130435 -40.169542465297 -91.5773326655057 591.304347826087 -40.169542465297 -91.5773326655057 173.913043478261 24.5485487140799 96.940026593933 243.478260869565 -67.7281571625741 -73.5723910673132 626.086956521739 -67.7281571625741 -73.5723910673132 208.695652173913 54.6948158122427 83.7166478262529 278.260869565217 -87.9473751206489 -47.5947393037073 660.869565217391 -98.6361303402722 -16.4594590280734 695.652173913043 -8.25793454723323 99.658449300667 626.086956521739 78.9140509396394 61.4212712689668 313.04347826087 94.5817241700635 32.4699469204683 347.826086956522 -98.6361303402722 16.4594590280734 313.04347826087 -98.6361303402722 16.4594590280734 730.434782608696 -87.9473751206489 -47.5947393037073 34.7826086956522 -87.9473751206489 47.5947393037074 765.217391304348 54.6948158122427 83.7166478262529 695.652173913043 -87.9473751206489 47.5947393037074 347.826086956522 94.5817241700635 -32.4699469204684 452.173913043478 -98.6361303402722 -16.4594590280734 69.5652173913043 -67.7281571625741 73.5723910673132 382.608695652174 78.9140509396393 -61.4212712689668 486.956521739131 -98.6361303402722 16.4594590280734 104.347826086957 94.5817241700635 32.4699469204683 765.217391304348 94.5817241700635 -32.4699469204684 208.695652173913 54.6948158122427 -83.7166478262529 521.739130434783 -87.9473751206489 47.5947393037074 139.130434782609 -8.25793454723323 99.658449300667 452.173913043478 24.5485487140799 -96.9400265939331 556.521739130435 -67.7281571625741 73.5723910673132 173.913043478261 54.6948158122427 -83.7166478262529 278.260869565217 -40.1695424652969 91.5773326655057 208.695652173913 -8.25793454723327 -99.658449300667 591.304347826087 -40.169542465297 -91.5773326655057 626.086956521739 -8.25793454723323 99.658449300667 243.478260869565 24.5485487140799 -96.9400265939331 313.04347826087 54.6948158122427 83.7166478262529 521.739130434783 -67.7281571625741 -73.5723910673132 660.869565217391 -87.9473751206489 -47.5947393037073 695.652173913043 54.6948158122427 83.7166478262529 313.04347826087 -40.169542465297 -91.5773326655057 382.608695652174 -67.7281571625741 -73.5723910673132 417.391304347826 -98.6361303402722 -16.4594590280734 730.434782608696 -98.6361303402722 16.4594590280734 765.217391304348 94.5817241700635 -32.4699469204684 34.7826086956522 94.5817241700635 -32.4699469204684 486.956521739131 78.9140509396393 -61.4212712689668 521.739130434783 54.6948158122427 -83.7166478262529 556.521739130435 -98.6361303402722 16.4594590280734 521.739130434783 24.5485487140799 -96.9400265939331 591.304347826087 -8.25793454723327 -99.658449300667 626.086956521739 -98.6361303402722 16.4594590280734 139.130434782609 -40.169542465297 -91.5773326655057 660.869565217391 -87.9473751206489 47.5947393037074 173.913043478261 -67.7281571625741 -73.5723910673132 695.652173913043 -87.9473751206489 -47.5947393037073 730.434782608696 -98.6361303402722 -16.4594590280734 765.217391304348 94.5817241700635 -32.4699469204684 521.739130434783 54.6948158122427 -83.7166478262529 591.304347826087 24.5485487140799 -96.9400265939331 626.086956521739 5.75958653158129 400 6.28318530717959 350 5.76502671255203 393.146938099824 5.78038331643331 386.662410602174 5.80382582325277 380.690815213948 5.84339274904795 373.782555238023 5.89986744204557 366.815019461706 5.9668194398655 360.858265526469 6.03627258275022 356.380850902333 6.10703525710988 353.171507010994 6.18548781435823 350.960675236214 6.23370669596795 350.245215525427 6.28318530717959 0 0 0 0.174532925199433 0 0.349065850398866 0 0.523598775598299 0 0.698131700797732 0 0.872664625997165 0 1.0471975511966 0 1.22173047639603 0 1.39626340159546 0 1.5707963267949 0 1.74532925199433 0 1.91986217719376 0 2.0943951023932 0 2.26892802759263 0 2.44346095279206 0 2.61799387799149 0 2.79252680319093 0 2.96705972839036 0 3.14159265358979 0 3.31612557878922 0 3.49065850398866 0 3.66519142918809 0 3.83972435438752 0 4.01425727958696 0 4.18879020478639 0 4.36332312998582 0 4.53785605518525 0 4.71238898038469 0 4.88692190558412 0 5.06145483078355 0 5.23598775598299 0 5.41052068118242 0 5.58505360638185 0 5.75958653158128 0 5.93411945678072 0 6.10865238198015 0 0 350 0.523598775598299 400 0.077538932748348 350.60366789119 0.1509208682896 352.314017004824 0.218192472586135 354.928638859964 0.278804640762612 358.255381554833 0.346747481674073 363.324622594048 0.409044313017844 369.700044024682 0.456050013115963 376.326552497693 0.493149687318882 383.90964254567 0.51533969042131 391.563087645832 0.521486191917156 395.72529258068 0 450 0.0775391300147876 449.396329038004 0.15092123436146 447.685971589172 0.218192971604858 445.071337728308 0.278805237518871 441.744580622317 0.346748092637934 436.675324162327 0.409044978349884 430.299875845487 0.456050672751564 423.673337329156 0.493150253015108 416.090210848718 0.51534004882998 408.43673018339 0.521486285180745 404.274613176575 0 800 6.28318530717959 800 0.174532925199433 800 0.349065850398866 800 0.523598775598299 800 0.698131700797732 800 0.872664625997165 800 1.0471975511966 800 1.22173047639603 800 1.39626340159546 800 1.5707963267949 800 1.74532925199433 800 1.91986217719376 800 2.0943951023932 800 2.26892802759263 800 2.44346095279206 800 2.61799387799149 800 2.79252680319093 800 2.96705972839036 800 3.14159265358979 800 3.31612557878922 800 3.49065850398866 800 3.66519142918809 800 3.83972435438752 800 4.01425727958696 800 4.18879020478639 800 4.36332312998582 800 4.53785605518525 800 4.71238898038469 800 4.88692190558412 800 5.06145483078355 800 5.23598775598299 800 5.41052068118242 800 5.58505360638185 800 5.75958653158128 800 5.93411945678072 800 6.10865238198015 800 6.28318530717959 450 5.76502671255202 406.853061900168 5.78038331643326 413.337589397812 5.80382582325268 419.309184786033 5.84339274904778 426.217444761952 5.89986744204533 433.184980538269 5.96681943986518 439.141734473506 6.03627258290147 443.619149110997 6.10703525679861 446.828492965207 6.18548781364045 449.039324751509 6.23370669672657 449.754784472325 4.29902152596498 730.434782608696 4.29902152596498 695.652173913043 4.62971548950075 695.652173913043 1.98416378121461 278.260869565217 1.65346981767884 278.260869565217 1.98416378121461 243.478260869565 5.29110341657228 139.130434782609 5.29110341657228 104.347826086957 5.62179738010805 104.347826086957 3.96832756242921 765.217391304348 3.63763359889344 765.217391304348 4.96040945303652 139.130434782609 3.96832756242921 730.434782608696 2.64555170828614 591.304347826087 2.64555170828614 556.521739130435 2.97624567182191 556.521739130435 2.31485774475037 591.304347826087 2.31485774475037 556.521739130435 4.96040945303652 173.913043478261 1.65346981767884 313.04347826087 1.32277585414307 278.260869565217 4.62971548950075 139.130434782609 5.95249134364382 591.304347826087 5.62179738010805 556.521739130435 5.95249134364382 556.521739130435 4.62971548950075 173.913043478261 5.62179738010805 591.304347826087 1.32277585414307 313.04347826087 2.31485774475037 626.086956521739 1.98416378121461 591.304347826087 1.98416378121461 626.086956521739 4.62971548950075 208.695652173913 4.29902152596498 208.695652173913 5.62179738010805 626.086956521739 5.29110341657228 626.086956521739 1.32277585414307 347.826086956522 0.992081890607303 347.826086956522 4.29902152596498 243.478260869565 3.96832756242921 243.478260869565 5.29110341657228 660.869565217391 4.96040945303652 660.869565217391 3.96832756242921 278.260869565217 3.63763359889344 243.478260869565 0.992081890607303 382.608695652174 0.661387927071535 347.826086956522 1.98416378121461 660.869565217391 1.65346981767884 660.869565217391 3.63763359889344 278.260869565217 0.661387927071535 382.608695652174 4.96040945303652 695.652173913043 4.62971548950075 660.869565217391 1.65346981767884 695.652173913043 1.32277585414307 660.869565217391 3.63763359889344 313.04347826087 3.30693963535768 313.04347826087 3.30693963535768 278.260869565217 1.32277585414307 695.652173913043 4.62971548950075 730.434782608696 4.29902152596498 765.217391304348 0.661387927071535 417.391304347826 1.32277585414307 730.434782608696 0.992081890607303 730.434782608696 0.992081890607303 765.217391304348 0.661387927071535 765.217391304348 0.661387927071535 730.434782608696 3.30693963535768 347.826086956522 2.97624567182191 347.826086956522 5.95249134364382 626.086956521739 5.95249134364382 278.260869565217 5.95249134364382 243.478260869565 5.62179738010805 278.260869565217 5.62179738010805 243.478260869565 2.97624567182191 382.608695652174 2.64555170828614 382.608695652174 0.330693963535768 452.173913043478 5.62179738010805 660.869565217391 5.62179738010805 313.04347826087 5.29110341657228 313.04347826087 2.64555170828614 417.391304347826 2.31485774475037 417.391304347826 5.29110341657228 695.652173913043 5.29110341657228 347.826086956522 4.96040945303652 347.826086956522 2.31485774475037 452.173913043478 1.98416378121461 452.173913043478 1.98416378121461 417.391304347826 4.96040945303652 730.434782608696 4.62971548950075 34.7826086956522 4.29902152596498 34.7826086956522 0.330693963535768 34.7826086956522 4.96040945303652 382.608695652174 4.62971548950075 347.826086956522 4.62971548950075 765.217391304348 4.62971548950075 382.608695652174 1.98416378121461 486.956521739131 1.65346981767884 486.956521739131 5.95249134364382 660.869565217391 0.661387927071535 34.7826086956522 4.62971548950075 417.391304347826 4.29902152596498 417.391304347826 4.29902152596498 69.5652173913043 3.96832756242921 34.7826086956522 3.96832756242921 69.5652173913043 1.65346981767884 521.739130434783 1.32277585414307 486.956521739131 1.32277585414307 521.739130434783 5.62179738010805 695.652173913043 4.29902152596498 452.173913043478 3.96832756242921 452.173913043478 3.96832756242921 104.347826086957 3.63763359889344 104.347826086957 3.63763359889344 69.5652173913043 0.330693963535768 69.5652173913043 5.29110341657228 730.434782608696 3.96832756242921 486.956521739131 3.63763359889344 486.956521739131 3.63763359889344 452.173913043478 3.63763359889344 139.130434782609 3.30693963535768 104.347826086957 4.96040945303652 765.217391304348 1.32277585414307 556.521739130435 0.992081890607303 556.521739130435 3.30693963535768 139.130434782609 0.992081890607303 34.7826086956522 3.63763359889344 521.739130434783 3.30693963535768 486.956521739131 5.95249134364382 695.652173913043 0.992081890607303 591.304347826087 0.661387927071535 556.521739130435 3.30693963535768 173.913043478261 2.97624567182191 173.913043478261 3.30693963535768 521.739130434783 0.661387927071535 591.304347826087 2.97624567182191 208.695652173913 0.661387927071535 69.5652173913043 2.64555170828614 208.695652173913 3.30693963535768 556.521739130435 5.62179738010805 730.434782608696 5.29110341657228 765.217391304348 2.64555170828614 243.478260869565 2.31485774475037 208.695652173913 2.97624567182191 591.304347826087 0.661387927071535 626.086956521739 0.330693963535768 591.304347826087 2.31485774475037 243.478260869565 0.330693963535768 626.086956521739 0.330693963535768 660.869565217391 5.95249134364382 730.434782608696 0.330693963535768 104.347826086957 1.32277585414307 34.7826086956522 5.62179738010805 765.217391304348 2.31485774475037 278.260869565217 2.64555170828614 626.086956521739 5.95249134364382 104.347826086957 5.62179738010805 69.5652173913043 5.95249134364382 69.5652173913043 5.95249134364382 765.217391304348 1.98416378121461 313.04347826087 2.31485774475037 660.869565217391 5.62179738010805 139.130434782609 1.65346981767884 347.826086956522 0.992081890607303 69.5652173913043 0.661387927071535 104.347826086957 5.29110341657228 173.913043478261 4.96040945303652 208.695652173913 1.98416378121461 695.652173913043 1.65346981767884 730.434782608696 0.330693963535768 139.130434782609 1.32277585414307 382.608695652174 1.32277585414307 765.217391304348 4.62971548950075 243.478260869565 1.65346981767884 34.7826086956522 0.992081890607303 417.391304347826 5.95249134364382 313.04347826087 4.29902152596498 278.260869565217 0.661387927071535 452.173913043478 3.96832756242921 313.04347826087 5.62179738010805 347.826086956522 1.32277585414307 69.5652173913043 0.992081890607303 104.347826086957 5.29110341657228 382.608695652174 3.63763359889344 347.826086956522 0.330693963535768 486.956521739131 4.96040945303652 417.391304347826 3.30693963535768 382.608695652174 0.661387927071535 139.130434782609 2.97624567182191 417.391304347826 0.330693963535768 173.913043478261 4.62971548950075 452.173913043478 4.96040945303652 34.7826086956522 4.29902152596498 486.956521739131 2.64555170828614 452.173913043478 1.98416378121461 34.7826086956522 3.96832756242921 521.739130434783 4.62971548950075 69.5652173913043 2.31485774475037 486.956521739131 4.29902152596498 104.347826086957 3.63763359889344 556.521739130435 1.65346981767884 69.5652173913043 1.98416378121461 521.739130434783 3.96832756242921 139.130434782609 1.32277585414307 104.347826086957 3.30693963535768 591.304347826087 3.63763359889344 173.913043478261 1.65346981767884 556.521739130435 0.992081890607303 139.130434782609 2.97624567182191 626.086956521739 3.30693963535768 208.695652173913 1.32277585414307 591.304347826087 2.64555170828614 660.869565217391 2.97624567182191 243.478260869565 0.661387927071535 173.913043478261 0.330693963535768 208.695652173913 0.992081890607303 626.086956521739 2.64555170828614 278.260869565217 2.31485774475037 695.652173913043 2.31485774475037 34.7826086956522 0.661387927071535 660.869565217391 2.31485774475037 313.04347826087 1.98416378121461 730.434782608696 1.98416378121461 69.5652173913043 1.65346981767884 765.217391304348 0.330693963535768 695.652173913043 1.98416378121461 347.826086956522 5.95249134364382 347.826086956522 1.65346981767884 104.347826086957 5.95249134364382 139.130434782609 1.65346981767884 382.608695652174 5.62179738010805 382.608695652174 5.62179738010805 173.913043478261 5.29110341657228 208.695652173913 5.29110341657228 417.391304347826 1.32277585414307 417.391304347826 1.32277585414307 139.130434782609 0.992081890607303 173.913043478261 4.96040945303652 452.173913043478 4.96040945303652 243.478260869565 0.661387927071535 208.695652173913 0.992081890607303 452.173913043478 0.330693963535768 243.478260869565 4.62971548950075 486.956521739131 4.62971548950075 278.260869565217 0.661387927071535 486.956521739131 4.29902152596498 313.04347826087 2.64555170828614 34.7826086956522 4.29902152596498 521.739130434783 3.96832756242921 347.826086956522 3.96832756242921 556.521739130435 0.330693963535768 521.739130434783 3.63763359889344 382.608695652174 2.31485774475037 69.5652173913043 3.63763359889344 591.304347826087 5.29110341657228 34.7826086956522 3.30693963535768 417.391304347826 1.98416378121461 104.347826086957 3.30693963535768 626.086956521739 2.97624567182191 452.173913043478 4.96040945303652 69.5652173913043 1.65346981767884 139.130434782609 2.97624567182191 660.869565217391 4.62971548950075 104.347826086957 2.64555170828614 486.956521739131 1.32277585414307 173.913043478261 2.64555170828614 695.652173913043 0.992081890607303 208.695652173913 2.31485774475037 521.739130434783 4.29902152596498 139.130434782609 2.31485774475037 730.434782608696 0.661387927071535 243.478260869565 3.96832756242921 173.913043478261 1.98416378121461 765.217391304348 1.98416378121461 556.521739130435 3.63763359889344 208.695652173913 0.330693963535768 278.260869565217 5.62179738010805 417.391304347826 1.65346981767884 591.304347826087 2.97624567182191 34.7826086956522 3.30693963535768 243.478260869565 2.97624567182191 278.260869565217 5.29110341657228 452.173913043478 1.32277585414307 626.086956521739 0.992081890607303 660.869565217391 4.96040945303652 486.956521739131 2.64555170828614 69.5652173913043 2.64555170828614 313.04347826087 2.31485774475037 104.347826086957 0.661387927071535 695.652173913043 4.62971548950075 521.739130434783 2.31485774475037 347.826086956522 1.98416378121461 139.130434782609 4.29902152596498 556.521739130435 0.330693963535768 730.434782608696 1.65346981767884 173.913043478261 1.98416378121461 382.608695652174 5.95249134364382 173.913043478261 3.96832756242921 591.304347826087 1.65346981767884 417.391304347826 5.62179738010805 208.695652173913 3.63763359889344 626.086956521739 1.32277585414307 208.695652173913 0.992081890607303 243.478260869565 5.29110341657228 243.478260869565 3.30693963535768 660.869565217391 1.32277585414307 452.173913043478 4.96040945303652 278.260869565217 0.661387927071535 278.260869565217 2.97624567182191 695.652173913043 0.992081890607303 486.956521739131 0.330693963535768 313.04347826087 4.62971548950075 313.04347826087 2.64555170828614 730.434782608696 0.661387927071535 521.739130434783 3.30693963535768 34.7826086956522 4.29902152596498 347.826086956522 2.31485774475037 765.217391304348 3.96832756242921 382.608695652174 5.62179738010805 452.173913043478 2.97624567182191 69.5652173913043 3.63763359889344 417.391304347826 0.330693963535768 556.521739130435 5.29110341657228 486.956521739131 5.62179738010805 34.7826086956522 2.64555170828614 104.347826086957 3.30693963535768 452.173913043478 2.31485774475037 139.130434782609 5.29110341657228 69.5652173913043 4.96040945303652 521.739130434783 2.97624567182191 486.956521739131 1.98416378121461 173.913043478261 4.96040945303652 104.347826086957 1.65346981767884 208.695652173913 2.64555170828614 521.739130434783 4.62971548950075 556.521739130435 4.29902152596498 591.304347826087 4.29902152596498 173.913043478261 1.32277585414307 243.478260869565 3.96832756242921 626.086956521739 3.96832756242921 208.695652173913 0.992081890607303 278.260869565217 3.63763359889344 660.869565217391 3.30693963535768 695.652173913043 1.65346981767884 626.086956521739 0.661387927071535 313.04347826087 0.330693963535768 347.826086956522 2.97624567182191 313.04347826087 2.97624567182191 730.434782608696 3.63763359889344 34.7826086956522 2.64555170828614 765.217391304348 0.992081890607303 695.652173913043 2.64555170828614 347.826086956522 5.95249134364382 452.173913043478 3.30693963535768 69.5652173913043 2.31485774475037 382.608695652174 5.62179738010805 486.956521739131 2.97624567182191 104.347826086957 0.330693963535768 765.217391304348 5.95249134364382 208.695652173913 5.29110341657228 521.739130434783 2.64555170828614 139.130434782609 1.65346981767884 452.173913043478 4.96040945303652 556.521739130435 2.31485774475037 173.913043478261 5.29110341657228 278.260869565217 1.98416378121461 208.695652173913 4.62971548950075 591.304347826087 4.29902152596498 626.086956521739 1.65346981767884 243.478260869565 4.96040945303652 313.04347826087 0.992081890607303 521.739130434783 3.96832756242921 660.869565217391 3.63763359889344 695.652173913043 0.992081890607303 313.04347826087 4.29902152596498 382.608695652174 3.96832756242921 417.391304347826 3.30693963535768 730.434782608696 2.97624567182191 765.217391304348 5.95249134364382 34.7826086956522 5.95249134364382 486.956521739131 5.62179738010805 521.739130434783 5.29110341657228 556.521739130435 2.97624567182191 521.739130434783 4.96040945303652 591.304347826087 4.62971548950075 626.086956521739 2.97624567182191 139.130434782609 4.29902152596498 660.869565217391 2.64555170828614 173.913043478261 3.96832756242921 695.652173913043 3.63763359889344 730.434782608696 3.30693963535768 765.217391304348 5.95249134364382 521.739130434783 5.29110341657228 591.304347826087 4.96040945303652 626.086956521739 121 122 123 124 125 126 127 128 129 130 96 131 127 132 128 130 133 121 134 135 136 130 131 133 130 97 96 134 137 138 130 98 97 134 138 135 139 132 127 140 141 125 139 142 132 143 144 145 139 146 142 143 147 144 140 148 141 143 145 110 140 125 124 149 150 137 149 151 150 152 153 146 154 155 147 156 157 148 158 159 153 158 153 152 160 161 155 160 155 154 162 163 159 164 165 157 166 167 151 162 168 163 164 169 165 170 123 171 170 171 161 172 167 166 170 161 160 172 173 167 174 175 176 174 176 168 172 177 173 178 121 123 174 168 162 164 157 156 179 130 121 180 51 169 179 98 130 179 121 178 181 182 177 180 69 70 179 99 98 183 79 184 180 70 71 179 100 99 183 185 182 180 71 72 186 187 175 180 72 51 183 182 181 183 184 185 183 80 79 188 110 74 183 81 80 188 143 110 188 147 143 189 190 2 188 154 147 189 191 192 189 192 190 193 187 186 193 194 187 195 64 65 195 65 66 196 160 154 197 198 191 195 66 67 199 200 194 201 170 160 201 160 196 202 203 198 204 205 206 207 178 123 202 198 197 208 209 40 207 123 170 204 206 200 210 14 15 207 170 201 208 40 41 210 15 16 210 16 17 211 212 203 213 179 178 211 214 212 213 100 179 211 203 202 213 101 100 215 216 205 217 154 188 218 17 18 217 196 154 218 18 19 219 220 214 221 222 209 217 188 74 221 209 208 221 223 222 224 225 216 218 210 17 224 216 215 224 226 225 227 201 196 228 220 219 228 229 220 230 231 232 233 14 210 230 232 223 234 207 201 234 201 227 235 236 237 238 231 230 238 239 231 240 103 102 241 242 226 238 243 239 240 213 178 235 237 229 244 19 20 240 178 207 244 20 21 240 101 213 240 207 234 240 102 101 245 246 236 247 217 74 245 236 235 248 242 241 248 249 242 250 251 243 245 252 246 248 253 249 247 196 217 247 227 196 244 218 19 254 251 250 255 233 210 254 256 251 255 210 218 257 136 252 258 234 227 259 104 103 259 105 104 259 240 234 260 261 256 259 103 240 262 134 136 259 234 258 263 264 253 260 265 261 262 136 257 263 266 264 260 256 254 267 73 266 268 247 74 268 227 247 268 258 227 269 14 233 270 21 22 271 106 105 272 265 260 270 22 23 271 107 106 272 124 126 273 134 262 271 105 259 273 137 134 272 126 265 273 149 137 271 259 258 274 275 276 277 108 107 277 109 108 278 140 124 270 244 21 277 74 109 274 129 275 277 268 74 274 276 13 277 107 271 277 258 268 277 271 258 279 166 151 280 127 129 281 148 140 282 218 244 281 156 148 279 151 149 281 140 278 282 255 218 282 244 270 283 255 282 284 139 127 284 127 280 285 146 139 283 269 233 286 172 166 283 233 255 287 177 172 285 152 146 287 181 177 288 14 269 285 139 284 287 172 286 289 164 156 290 81 183 290 82 81 291 158 152 290 83 82 292 23 24 293 180 169 293 164 289 290 183 181 294 191 189 294 189 2 295 158 291 292 270 23 294 12 11 295 159 158 294 2 12 294 197 191 295 162 159 293 169 164 296 195 67 297 162 295 298 7 6 296 69 180 296 67 68 298 202 197 296 68 69 297 174 162 299 282 270 300 283 282 301 211 202 302 186 175 301 202 298 302 175 174 303 64 195 304 211 301 303 62 63 300 282 299 303 63 64 305 193 186 306 269 283 304 219 214 304 214 211 307 194 193 306 288 269 308 14 288 308 50 14 307 199 194 309 228 219 307 193 305 310 208 41 310 41 42 310 42 43 311 228 309 312 200 199 313 292 24 313 24 25 312 199 307 313 25 26 311 235 229 312 204 200 311 229 228 314 235 311 315 221 208 314 245 235 316 204 312 317 221 315 316 215 205 317 230 223 316 205 204 318 257 252 318 245 314 317 223 221 319 292 313 318 252 245 319 270 292 320 224 215 319 299 270 321 230 317 321 238 230 322 300 299 323 262 257 324 243 238 324 250 243 325 224 320 326 283 300 325 226 224 324 238 321 326 306 283 325 241 226 327 273 262 327 262 323 328 254 250 326 300 322 329 248 241 330 273 327 331 254 328 331 260 254 332 288 306 332 308 288 330 279 149 330 149 273 333 50 308 334 263 253 334 253 248 335 272 260 334 248 329 336 166 279 336 286 166 337 26 27 337 27 28 338 266 263 338 267 266 339 124 272 339 278 124 337 313 26 340 287 286 341 319 313 342 287 340 342 84 83 343 73 267 344 281 278 342 83 290 342 181 287 342 290 181 345 7 298 345 8 7 345 9 8 345 10 9 346 299 319 345 11 10 347 274 13 345 294 11 348 281 344 345 197 294 347 129 274 348 156 281 346 319 341 345 298 197 347 280 129 349 3 1 349 4 3 349 5 4 349 6 5 346 322 299 349 298 6 349 301 298 350 284 280 351 285 284 348 289 156 352 304 301 353 293 289 354 326 322 352 301 349 351 284 350 355 306 326 356 219 304 357 291 152 357 152 285 356 304 352 355 326 354 355 332 306 357 285 351 358 333 308 359 296 180 356 309 219 358 308 332 360 50 333 361 311 309 362 295 291 359 180 293 359 293 353 363 195 296 363 303 195 364 297 295 364 295 362 365 28 29 365 29 30 366 311 361 367 174 297 366 314 311 367 302 174 368 318 314 369 62 303 370 186 302 365 337 28 368 314 366 370 305 186 371 337 365 370 302 367 371 341 313 372 318 368 371 313 337 372 257 318 373 310 43 372 323 257 374 307 305 373 43 44 373 44 45 375 346 341 376 327 323 377 307 374 378 208 310 377 312 307 379 346 375 380 327 376 378 310 373 380 330 327 379 322 346 379 354 322 378 315 208 381 317 315 382 316 312 383 355 354 384 330 380 384 336 279 384 279 330 385 358 332 385 355 383 386 215 316 387 321 317 386 320 215 387 317 381 388 286 336 385 332 355 388 340 286 389 360 333 390 324 321 391 342 340 392 325 320 390 321 387 391 84 342 389 333 358 391 85 84 391 86 85 393 250 324 394 50 360 395 1 111 393 328 250 395 111 112 395 112 113 393 324 390 395 113 114 396 241 325 396 329 241 395 349 1 395 352 349 396 325 392 397 30 31 398 331 328 397 31 32 399 331 398 400 356 352 399 335 260 400 352 395 397 365 30 399 260 331 401 334 329 402 334 401 403 309 356 403 361 309 404 371 365 405 335 399 405 339 272 403 356 400 405 272 335 402 263 334 402 338 263 406 371 404 407 267 338 406 341 371 407 343 267 408 366 361 409 344 278 406 375 341 409 339 405 410 379 375 409 278 339 411 366 408 411 368 366 412 73 343 413 354 379 414 348 344 413 383 354 415 13 2 416 372 368 415 347 13 415 280 347 415 350 280 416 368 411 413 379 410 417 289 348 417 353 289 418 351 350 419 372 416 417 348 414 419 376 323 419 323 372 420 385 383 421 358 385 421 389 358 422 357 351 423 380 376 422 351 418 424 359 353 421 385 420 425 357 422 426 360 389 427 384 380 425 291 357 425 362 291 428 363 296 427 380 423 428 359 424 428 296 359 426 394 360 429 50 394 429 52 50 429 53 52 430 364 362 431 336 384 431 388 336 431 384 427 432 369 303 432 303 363 433 32 33 434 364 430 433 33 34 434 367 297 435 340 388 434 297 364 435 86 391 435 391 340 435 87 86 435 88 87 436 367 434 437 114 115 433 397 32 438 365 397 436 370 367 437 395 114 437 400 395 439 374 305 438 397 433 438 404 365 439 305 370 440 62 369 441 400 437 442 45 46 442 46 47 443 406 404 441 403 400 444 377 374 442 373 45 445 375 406 446 373 442 447 403 441 446 378 373 445 410 375 447 408 361 448 377 444 447 361 403 448 382 312 449 413 410 448 312 377 450 378 446 450 315 378 450 381 315 451 420 383 452 382 448 453 411 408 452 386 316 142 387 381 452 316 382 451 413 449 454 416 411 451 383 413 454 411 453 455 387 142 456 421 420 457 419 416 138 392 320 455 390 387 457 416 454 138 320 386 458 393 390 459 426 389 458 390 455 459 421 456 459 389 421 460 419 457 460 423 376 163 328 393 460 376 419 150 396 392 163 393 458 163 398 328 461 427 423 462 401 329 463 429 394 462 329 396 463 394 426 462 396 150 176 399 398 464 53 429 464 54 53 465 405 399 464 55 54 466 427 461 465 399 176 464 56 55 466 431 427 173 402 401 467 433 34 467 34 35 467 35 36 468 431 466 468 88 435 468 435 388 468 89 88 469 338 402 468 90 89 469 407 338 468 388 431 470 409 405 471 115 116 471 116 117 471 117 118 471 118 119 472 438 433 469 402 173 473 414 344 471 437 115 185 343 407 185 412 343 474 441 437 473 344 409 475 438 472 476 73 412 476 75 73 476 76 75 206 417 414 475 404 438 476 77 76 475 443 404 477 418 350 478 441 474 479 443 475 478 447 441 479 445 406 479 406 443 477 415 2 477 350 415 480 424 353 192 422 418 481 408 447 480 417 206 481 447 478 480 353 417 482 449 410 481 453 408 482 410 445 483 425 422 484 451 449 485 454 453 483 422 192 486 457 454 486 454 485 487 451 484 225 428 424 487 456 420 488 362 425 489 428 225 488 430 362 487 420 451 490 457 486 488 425 483 489 363 428 490 460 457 489 432 363 212 434 430 249 369 432 491 460 490 141 459 456 491 423 460 492 459 141 493 434 212 493 436 434 491 461 423 249 440 369 264 62 440 492 426 459 494 439 370 492 463 426 494 370 436 165 57 56 165 58 57 495 466 461 496 466 495 496 90 468 496 91 90 496 468 466 165 429 463 496 92 91 237 439 494 165 464 429 165 56 464 237 444 374 497 47 48 498 437 471 497 48 49 498 119 120 237 374 439 497 49 13 222 36 37 498 120 110 222 37 38 498 471 119 497 442 47 498 474 437 275 446 442 499 478 474 246 448 444 222 467 36 128 450 446 128 446 275 232 472 433 500 481 478 501 452 448 501 448 246 232 433 467 500 478 499 132 142 381 132 450 128 132 381 450 135 138 386 239 475 472 502 453 481 502 485 453 135 452 501 146 455 142 502 481 500 135 386 452 503 486 485 504 475 239 504 479 475 137 392 138 153 455 146 153 458 455 137 150 392 505 486 503 505 490 486 159 458 153 506 482 445 506 479 504 506 445 479 159 163 458 507 491 490 151 462 150 507 490 505 261 449 482 261 484 449 168 398 163 168 176 398 508 495 461 508 461 491 167 462 151 508 491 507 167 401 462 126 487 484 175 465 176 509 496 495 167 173 401 187 465 175 509 92 496 125 141 456 509 93 92 509 94 93 177 469 173 187 405 465 125 487 126 510 498 110 125 456 487 187 470 405 510 474 498 182 407 469 510 499 474 182 185 407 182 469 177 194 470 187 194 409 470 144 500 499 194 473 409 184 77 476 184 78 77 148 492 141 184 79 78 184 412 185 184 476 412 200 414 473 157 165 463 190 418 477 200 206 414 157 463 492 511 502 500 200 473 194 157 492 148 511 500 144 512 502 511 190 477 2 190 192 418 512 503 485 205 480 206 512 485 502 169 59 58 169 60 59 191 483 192 169 61 60 169 51 61 171 505 503 169 58 165 209 222 38 198 488 483 216 480 205 198 483 191 216 424 480 122 505 171 122 507 505 216 225 424 209 38 39 209 39 40 203 488 198 133 507 122 203 430 488 133 508 507 203 212 430 226 489 225 223 467 222 131 509 495 131 495 508 214 493 212 131 508 133 223 232 467 131 94 509 131 95 94 231 239 472 131 96 95 242 249 432 220 493 214 220 494 436 242 489 226 242 432 489 145 510 110 145 499 510 231 472 232 145 144 499 220 436 493 253 440 249 229 237 494 253 264 440 243 504 239 147 511 144 229 494 220 155 512 511 155 511 147 266 62 264 236 444 237 251 506 504 266 73 62 251 504 243 236 246 444 161 503 512 256 482 506 256 261 482 161 512 155 276 275 442 161 171 503 252 501 246 276 442 497 256 506 251 276 497 13 123 122 171 265 484 261 129 128 275 265 126 484 136 501 252 121 133 122 136 135 501 +379 587 1 0.681934829863914 +190 20 445.825756949558 210 -4.89842541528951e-15 450 187.024366020417 19.7774012963438 445.922264725258 184.397529800585 19.1992796277918 446.166954243274 181.546913604686 18.125819553687 446.59886977596 178.752969008674 16.5379654738046 447.185757348038 176.369667096977 14.6360522075901 447.809894135463 174.309971315007 12.4025399755702 448.437351320804 172.548649956894 9.76987059841766 449.036207207027 171.242034340645 6.93820726756652 449.51627283167 170.380301086729 3.88167696084131 449.849098129506 170.023096521915 0.960898368304993 449.990765883617 170.086043866562 -1.8531982436549 449.965644740411 170.509841698291 -4.48706231247217 449.798255709213 171.398299667707 -7.34688690845968 449.457287186436 172.743857915231 -10.1106660571351 448.967075069423 174.347888840505 -12.4503589683746 448.425082205426 176.192341023654 -14.4688795692552 447.86074933687 178.295746540249 -16.2176006194872 447.296825505482 180.640667676887 -17.6748961416399 446.7717611852 183.205669615023 -18.8105768661047 446.326693427354 186.059267040101 -19.6079226714758 445.994884340429 189.05297923185 -19.9775663053321 445.835541404226 191.895773051283 -19.9099477889329 445.864953696004 194.48438891673 -19.4907734771899 446.044649514275 197.343898776281 -18.6028803528253 446.410482031254 200.13477025801 -17.2419961803721 446.933075375945 202.522803249016 -15.5942105252608 447.506005983989 204.599616537762 -13.6693524360872 448.095205754853 206.410620564223 -11.4320396201158 448.675542899776 207.946109646233 -8.82820037172931 449.214457777936 209.086918743382 -5.97406825644437 449.641821815127 209.747291812357 -3.16934437217016 449.899454557652 209.797702468142 2.83742874189979 449.91942504134 209.215264429107 5.5473956609573 449.69131111379 208.306916927762 8.05337150161281 449.347170220943 206.788174560315 10.8700135987294 448.804126907314 204.754879178687 13.5016125308194 448.142563877523 202.602997991452 15.5294700803301 447.527208622277 200.14641042884 17.2351489960208 446.935590404877 197.364149940715 18.5948729149583 446.413690924525 194.262428648985 19.5405143016412 446.023562404914 192.165572916192 19.8824116982837 445.876897309791 190 -20 354.174243050442 170 -1.22460635382238e-14 350 187.19152395552 -19.8018301993616 354.088263569037 184.516885484041 -19.2337057450191 353.84737773106 182.039994698179 -18.347706288844 353.488047941608 179.223163623154 -16.8481398588458 352.924101793932 176.597079044967 -14.8445852697679 352.254442215956 174.551494560294 -12.7021125979118 351.640343987994 172.81733759401 -10.2350434370622 351.058771097833 171.42920242427 -7.42465406707688 350.554327671198 170.463556231093 -4.28104719934824 350.183610769691 170.118264986057 -2.17177622757773 350.047188396748 100 -1.83690953073357e-14 350 86.6025403784438 -50 400 86.8732667031317 -49.5281290308752 393.146938099824 87.6235772593243 -48.1882631494736 386.662410602174 88.7290516622297 -46.1210945615935 380.690815213948 90.4840004397121 -42.5751772682387 373.782555238023 92.7428861391894 -37.3999606121917 366.815019461706 95.0372320329239 -31.11148437027 360.858265526469 96.9671604229308 -24.4411486760561 356.380850902333 98.4525657430885 -17.52405054016 353.171507010994 99.5231396908821 -9.75421483502655 350.960675236214 99.8776181649079 -4.94584264829443 350.245215525427 100 -2.44921270764475e-14 450 86.8732667031312 -49.5281290308762 406.853061900168 87.6235772593223 -48.1882631494772 413.337589397812 88.7290516622257 -46.1210945616012 419.309184786033 90.484000439705 -42.5751772682538 426.217444761952 92.7428861391805 -37.3999606122139 433.184980538269 95.0372320329138 -31.1114843703007 439.141734473506 96.9671604293251 -24.4411486612818 443.619149110997 98.4525657314274 -17.5240505708509 446.828492965207 99.5231396846886 -9.7542149066232 449.039324751509 99.877618163893 -4.94584257239082 449.754784472325 86.6025403784439 50 400 99.6995349038219 7.74614536115343 449.396329038004 98.8632990204773 15.0348959199349 447.685971589172 97.6290200022516 21.6465795167683 445.071337728308 96.1384934421685 27.5207218309807 441.744580622317 94.0482819113588 33.9841246665353 436.675324162327 91.7501087080715 39.7733276178202 430.299875845487 89.779880280166 44.0405850374743 423.673337329156 88.0845894011337 47.3403121169944 416.090210848718 87.0125187464446 49.2830763468782 408.43673018339 86.7079714631656 49.8169414560564 404.274613176575 100 -1.83690953073357e-14 350 99.6995364250708 7.74612569392024 350.60366789119 98.8633045221148 15.0348597287602 352.314017004824 97.6290308111529 21.6465307979184 354.928638859964 96.1385098653288 27.5206644597269 358.255381554833 94.0483026744096 33.9840672064279 363.324622594048 91.7501351704928 39.7732665735241 369.700044024682 89.7799093309045 44.0405258154732 376.326552497693 88.0846161813635 47.3402622878728 383.90964254567 87.0125364098992 49.2830451608201 391.563087645832 86.7079761092912 49.8169333693719 395.72529258068 170 -1.22460635382238e-14 350 190 20 354.174243050442 170.202464309206 2.83858896354278 350.080640925493 170.784931061703 5.54807359953334 350.308764553975 171.694405902748 8.05637777047583 350.653320494305 173.214340920064 10.8738982856126 351.196738417424 175.24816387627 13.5049376869178 351.858368714932 177.401364011892 15.5330088161513 352.473947838002 179.857848980619 17.237654925444 353.065330165529 182.637652604668 18.5955872197421 353.586595055644 185.737201868648 19.5404341367349 353.976403390908 187.834463425865 19.8824152894209 354.123104387754 210 -8.57224447675664e-15 350 209.797535684556 2.83858895721841 350.080640928023 209.215068935606 5.54807361321558 350.308764554953 208.305594113848 8.05637773956749 350.653320488076 206.785659117562 10.8738982275306 351.196738404482 204.751836168062 13.5049376384928 351.858368701347 202.598636037752 15.5330087758858 352.473947824842 200.142151074243 17.2376548931651 353.065330153674 197.362347455423 18.5955871959507 353.586595046112 194.262798195698 19.5404341226978 353.976403384948 192.165536607703 19.8824152857648 354.123104386169 300 -1.22460635382238e-14 350 300 -1.22460635382238e-14 350 300 8.68240888334652 350.75961234939 300 17.1010071662834 353.015368960705 300 25 356.698729810778 300 32.139380484327 361.697777844051 300 38.3022221559489 367.860619515673 300 43.3012701892219 375 300 46.9846310392954 382.898992833717 300 49.2403876506104 391.317591116653 300 50 400 300 49.2403876506104 408.682408883347 300 46.9846310392954 417.101007166283 300 43.3012701892219 425 300 38.3022221559489 432.139380484327 300 32.139380484327 438.302222155949 300 25 443.301270189222 300 17.1010071662835 446.984631039295 300 8.68240888334658 449.24038765061 300 7.27364132466213e-14 450 300 -8.68240888334644 449.24038765061 300 -17.1010071662833 446.984631039295 300 -24.9999999999999 443.301270189222 300 -32.1393804843269 438.302222155949 300 -38.3022221559488 432.139380484327 300 -43.3012701892219 425 300 -46.9846310392954 417.101007166284 300 -49.2403876506104 408.682408883347 300 -50 400 300 -49.2403876506104 391.317591116654 300 -46.9846310392955 382.898992833717 300 -43.301270189222 375 300 -38.302222155949 367.860619515673 300 -32.1393804843271 361.697777844051 300 -25.0000000000002 356.698729810778 300 -17.1010071662836 353.015368960705 300 -8.68240888334674 350.75961234939 210 -8.57224447675664e-15 350 192.808476042752 -19.8018301996066 354.088263569143 195.483114512722 -19.2337057459418 353.847377731445 197.960005297371 -18.3477062907747 353.48804794237 200.776836372029 -16.8481398619274 352.924101795035 203.402920949326 -14.8445852749198 352.254442217558 205.448505433598 -12.7021126053398 351.640343989945 207.182662399942 -10.2350434472155 351.058771099956 208.570797574629 -7.42465408034023 350.554327671456 209.536443767991 -4.28104718451168 350.183610770056 209.881735017624 -2.17177625553873 350.047188395291 119.43291878176 45.7886663327529 420.084771232648 135.848107983418 49.8292246503335 404.128967273617 119.43291878176 49.8292246503335 404.128967273617 185.093675588393 -45.7886663327528 420.084771232649 201.508864790051 -36.7861955336566 433.864078581287 185.093675588393 -36.7861955336566 433.864078581287 103.017729580102 45.7886663327529 420.084771232648 267.169621596684 30.7106356344834 360.54297453018 267.169621596684 16.2349734602341 352.709137914968 250.754432395026 16.2349734602341 352.709137914968 250.754432395026 30.7106356344834 360.54297453018 168.678486386735 -45.7886663327528 420.084771232649 152.263297185077 -49.8292246503335 404.128967273617 152.263297185077 -45.7886663327528 420.084771232649 234.339243193367 41.8583239131264 372.652592093879 217.924053991709 30.7106356344834 360.54297453018 217.924053991709 41.8583239131264 372.652592093879 135.848107983418 -49.8292246503335 404.128967273617 234.339243193367 30.7106356344834 360.54297453018 201.508864790051 48.4700132969665 387.72572564296 201.508864790051 41.8583239131264 372.652592093879 119.43291878176 -48.4700132969665 387.72572564296 103.017729580102 -49.8292246503335 404.128967273617 103.017729580102 -48.4700132969665 387.72572564296 119.43291878176 -49.8292246503335 404.128967273617 185.093675588393 48.4700132969665 387.72572564296 267.169621596684 -23.7973696518536 443.973687560324 250.754432395026 -8.22972951403665 449.318065170136 250.754432395026 -23.7973696518536 443.973687560324 267.169621596684 -8.22972951403665 449.318065170136 168.678486386735 49.8292246503335 404.128967273617 168.678486386735 48.4700132969665 387.72572564296 152.263297185077 48.4700132969665 387.72572564296 234.339243193367 -36.7861955336566 433.864078581287 234.339243193367 -23.7973696518536 443.973687560324 217.924053991709 -36.7861955336566 433.864078581287 152.263297185077 49.8292246503335 404.128967273617 201.508864790051 -45.7886663327528 420.084771232649 135.848107983418 45.7886663327529 420.084771232648 103.017729580102 36.7861955336566 433.864078581287 168.678486386735 -49.8292246503335 404.128967273617 283.584810798342 30.7106356344834 360.54297453018 283.584810798342 16.2349734602341 352.709137914968 250.754432395026 41.8583239131264 372.652592093879 135.848107983418 -48.4700132969665 387.72572564296 217.924053991709 48.4700132969665 387.72572564296 103.017729580102 -41.8583239131265 372.652592093879 283.584810798342 -23.7973696518536 443.973687560324 283.584810798342 -8.22972951403665 449.318065170136 185.093675588393 49.8292246503335 404.128967273617 250.754432395026 -36.7861955336566 433.864078581287 217.924053991709 -45.7886663327528 420.084771232649 152.263297185077 45.7886663327529 420.084771232648 185.093675588393 -49.8292246503335 404.128967273617 119.43291878176 36.7861955336566 433.864078581287 152.263297185077 -48.4700132969665 387.72572564296 267.169621596684 41.8583239131264 372.652592093879 234.339243193367 48.4700132969665 387.72572564296 119.43291878176 -41.8583239131265 372.652592093879 201.508864790051 49.8292246503335 404.128967273617 267.169621596684 -36.7861955336566 433.864078581287 234.339243193367 -45.7886663327528 420.084771232649 168.678486386735 45.7886663327529 420.084771232648 201.508864790051 -49.8292246503335 404.128967273617 135.848107983418 36.7861955336566 433.864078581287 168.678486386735 -48.4700132969665 387.72572564296 103.017729580102 23.7973696518537 443.973687560324 283.584810798342 41.8583239131264 372.652592093879 135.848107983418 -41.8583239131265 372.652592093879 250.754432395026 48.4700132969665 387.72572564296 103.017729580102 -30.7106356344834 360.54297453018 283.584810798342 -36.7861955336566 433.864078581287 217.924053991709 49.8292246503335 404.128967273617 250.754432395026 -45.7886663327528 420.084771232649 185.093675588393 45.7886663327529 420.084771232648 217.924053991709 -49.8292246503335 404.128967273617 152.263297185077 36.7861955336566 433.864078581287 185.093675588393 -48.4700132969665 387.72572564296 119.43291878176 23.7973696518537 443.973687560324 152.263297185077 -41.8583239131265 372.652592093879 267.169621596684 48.4700132969665 387.72572564296 119.43291878176 -30.7106356344834 360.54297453018 234.339243193367 49.8292246503335 404.128967273617 201.508864790051 45.7886663327529 420.084771232648 267.169621596684 -45.7886663327528 420.084771232649 234.339243193367 -49.8292246503335 404.128967273617 201.508864790051 -48.4700132969665 387.72572564296 168.678486386735 36.7861955336566 433.864078581287 168.678486386735 -41.8583239131265 372.652592093879 135.848107983418 23.7973696518537 443.973687560324 135.848107983418 -30.7106356344834 360.54297453018 103.017729580102 8.22972951403675 449.318065170136 283.584810798342 48.4700132969665 387.72572564296 250.754432395026 49.8292246503335 404.128967273617 103.017729580102 -16.2349734602342 352.709137914968 283.584810798342 -45.7886663327528 420.084771232649 217.924053991709 45.7886663327529 420.084771232648 250.754432395026 -49.8292246503335 404.128967273617 185.093675588393 36.7861955336566 433.864078581287 217.924053991709 -48.4700132969665 387.72572564296 152.263297185077 23.7973696518537 443.973687560324 185.093675588393 -41.8583239131265 372.652592093879 119.43291878176 8.22972951403675 449.318065170136 152.263297185077 -30.7106356344834 360.54297453018 267.169621596684 49.8292246503335 404.128967273617 119.43291878176 -16.2349734602342 352.709137914968 234.339243193367 45.7886663327529 420.084771232648 267.169621596684 -49.8292246503335 404.128967273617 201.508864790051 36.7861955336566 433.864078581287 234.339243193367 -48.4700132969665 387.72572564296 168.678486386735 23.7973696518537 443.973687560324 201.508864790051 -41.8583239131265 372.652592093879 168.678486386735 -30.7106356344834 360.54297453018 135.848107983418 8.22972951403675 449.318065170136 103.017729580102 -8.22972951403665 449.318065170136 135.848107983418 -16.2349734602342 352.709137914968 283.584810798342 49.8292246503335 404.128967273617 250.754432395026 45.7886663327529 420.084771232648 283.584810798342 -49.8292246503335 404.128967273617 250.754432395026 -48.4700132969665 387.72572564296 217.924053991709 36.7861955336566 433.864078581287 217.924053991709 -41.8583239131265 372.652592093879 185.093675588393 23.7973696518537 443.973687560324 185.093675588393 -30.7106356344834 360.54297453018 152.263297185077 8.22972951403675 449.318065170136 152.263297185077 -16.2349734602342 352.709137914968 119.43291878176 -8.22972951403665 449.318065170136 267.169621596684 -48.4700132969665 387.72572564296 267.169621596684 45.7886663327529 420.084771232648 234.339243193367 -41.8583239131265 372.652592093879 234.339243193367 36.7861955336566 433.864078581287 201.508864790051 -30.7106356344834 360.54297453018 201.508864790051 23.7973696518537 443.973687560324 168.678486386735 -16.2349734602342 352.709137914968 168.678486386735 8.22972951403675 449.318065170136 283.584810798342 -48.4700132969665 387.72572564296 250.754432395026 -41.8583239131265 372.652592093879 135.848107983418 -8.22972951403665 449.318065170136 217.924053991709 -30.7106356344834 360.54297453018 103.017729580102 -23.7973696518536 443.973687560324 283.584810798342 45.7886663327529 420.084771232648 267.169621596684 -41.8583239131265 372.652592093879 250.754432395026 36.7861955336566 433.864078581287 217.924053991709 23.7973696518537 443.973687560324 234.339243193367 -30.7106356344834 360.54297453018 283.584810798342 -41.8583239131265 372.652592093879 103.017729580102 16.2349734602341 352.709137914968 152.263297185077 -8.22972951403665 449.318065170136 119.43291878176 16.2349734602341 352.709137914968 250.754432395026 -30.7106356344834 360.54297453018 217.924053991709 -16.2349734602342 352.709137914968 119.43291878176 -23.7973696518536 443.973687560324 135.848107983418 16.2349734602341 352.709137914968 267.169621596684 36.7861955336566 433.864078581287 267.169621596684 -30.7106356344834 360.54297453018 234.339243193367 -16.2349734602342 352.709137914968 234.339243193367 23.7973696518537 443.973687560324 103.017729580102 30.7106356344834 360.54297453018 152.263297185077 16.2349734602341 352.709137914968 168.678486386735 -8.22972951403665 449.318065170136 283.584810798342 -30.7106356344834 360.54297453018 135.848107983418 -23.7973696518536 443.973687560324 250.754432395026 -16.2349734602342 352.709137914968 119.43291878176 30.7106356344834 360.54297453018 267.169621596684 -16.2349734602342 352.709137914968 103.017729580102 -36.7861955336566 433.864078581287 168.678486386735 16.2349734602341 352.709137914968 283.584810798342 -16.2349734602342 352.709137914968 283.584810798342 36.7861955336566 433.864078581287 250.754432395026 23.7973696518537 443.973687560324 135.848107983418 30.7106356344834 360.54297453018 217.924053991709 8.22972951403675 449.318065170136 103.017729580102 41.8583239131264 372.652592093879 152.263297185077 -23.7973696518536 443.973687560324 152.263297185077 30.7106356344834 360.54297453018 119.43291878176 -36.7861955336566 433.864078581287 267.169621596684 23.7973696518537 443.973687560324 119.43291878176 41.8583239131264 372.652592093879 168.678486386735 30.7106356344834 360.54297453018 234.339243193367 8.22972951403675 449.318065170136 168.678486386735 -23.7973696518536 443.973687560324 135.848107983418 41.8583239131264 372.652592093879 135.848107983418 -36.7861955336566 433.864078581287 103.017729580102 48.4700132969665 387.72572564296 103.017729580102 -45.7886663327528 420.084771232649 217.924053991709 16.2349734602341 352.709137914968 283.584810798342 23.7973696518537 443.973687560324 250.754432395026 8.22972951403675 449.318065170136 185.093675588393 30.7106356344834 360.54297453018 217.924053991709 -8.22972951403665 449.318065170136 185.093675588393 -23.7973696518536 443.973687560324 152.263297185077 41.8583239131264 372.652592093879 119.43291878176 48.4700132969665 387.72572564296 152.263297185077 -36.7861955336566 433.864078581287 234.339243193367 16.2349734602341 352.709137914968 119.43291878176 -45.7886663327528 420.084771232649 201.508864790051 30.7106356344834 360.54297453018 267.169621596684 8.22972951403675 449.318065170136 168.678486386735 41.8583239131264 372.652592093879 234.339243193367 -8.22972951403665 449.318065170136 201.508864790051 -23.7973696518536 443.973687560324 135.848107983418 48.4700132969665 387.72572564296 168.678486386735 -36.7861955336566 433.864078581287 103.017729580102 49.8292246503335 404.128967273617 135.848107983418 -45.7886663327528 420.084771232649 283.584810798342 8.22972951403675 449.318065170136 185.093675588393 41.8583239131264 372.652592093879 217.924053991709 -23.7973696518536 443.973687560324 2.73007580752231 190 3.14159265358979 210 2.73492819040754 187.024366020417 2.7474837119525 184.397529800585 2.77062611730711 181.546913604686 2.80448459564326 178.752969008674 2.84452135903044 176.369667096977 2.89092500251957 174.309971315007 2.94492999675158 172.548649956894 3.00237927612647 171.242034340645 3.06388091972185 170.380301086729 3.122373502916 170.023096521915 3.17866510933174 170.086043866562 3.23145479350909 170.509841698291 3.28906434405541 171.398299667707 3.34521005871398 172.743857915231 3.39324766316843 174.347888840505 3.43516921781859 176.192341023654 3.47191925165955 178.295746540249 3.50290053040403 180.640667676887 3.52729664313396 183.205669615023 3.54456948047501 186.059267040101 3.55262000752568 189.05297923185 3.5511452401824 191.895773051283 3.54202385575198 194.48438891673 3.52281744034578 197.343898776281 3.49366089659563 200.13477025801 3.45876817080794 202.522803249016 3.41850512342417 204.599616537762 3.37227391533675 206.410620564223 3.31908716723907 207.946109646233 3.26136014184309 209.086918743382 3.20502207417703 209.747291812357 3.08481357338775 209.797702468142 3.03041585385138 209.215264429107 2.97982054446045 208.306916927762 2.92244240721551 206.788174560315 2.86816612733564 204.754879178687 2.82577961636135 202.602997991452 2.78967029998251 200.14641042884 2.76054039635132 197.364149940715 2.74008093006067 194.262428648985 2.73264036238492 192.165572916192 5.8716684611121 190 6.28318530717959 170 5.87598882340341 187.19152395552 5.88833055967778 184.516885484041 5.9074527029433 182.039994698179 5.93949613715545 179.223163623154 5.98174936926212 176.597079044967 6.0263279675771 174.551494560294 6.07702721219688 172.81733759401 6.1341410212019 171.42920242427 6.19745940274944 170.463556231093 6.23973611320879 170.118264986057 6.28318530717959 100 4.71238898038469 86.6025403784438 4.84988302442822 86.8732667031317 4.9824100965315 87.6235772593243 5.10887970344934 88.7290516622296 5.26433924207639 90.4840004397121 5.43814296926353 92.7428861391894 5.61159756603283 95.0372320329239 5.77244529009577 96.9671604229308 5.92510064538493 98.4525657430886 6.08684189351647 99.5231396908821 6.1841064433386 99.8776181649079 3.14159265358979 100 4.57489493634131 86.8732667031312 4.44236786423814 87.6235772593223 4.31589825732044 88.7290516622257 4.16043871869357 90.484000439705 3.98663499150652 92.7428861391805 3.81318039473733 95.0372320329138 3.65233267034643 96.9671604293251 3.49967731603553 98.4525657314274 3.33793606869753 99.5231396846886 3.24067151591787 99.877618163893 1.5707963267949 86.6025403784439 2.98604321659331 99.6995349038218 2.836168301898 98.8632990204774 2.69385026307151 97.6290200022515 2.55873212415881 96.1384934421685 2.39426299109247 94.0482819113587 2.22181558536708 91.7501087080715 2.06401881848322 89.779880280166 1.89843078523084 88.0845894011336 1.74034205381637 87.0125187464446 1.65639307408664 86.7079714631655 -8.88178419700125e-16 100 0.155549038831779 99.6995364250708 0.30542359275373 98.8633045221148 0.44774130960487 97.6290308111529 0.582859155090544 96.1385098653288 0.747328095775065 94.0483026744097 0.919775053556721 91.7501351704929 1.07757133347658 89.7799093309045 1.24315877151204 88.0846161813635 1.40124690335627 87.0125364098992 1.48519768772147 86.7079761092912 1.84889274661175e-32 170 0.411516846067488 190 0.0568023201262033 170.202464309206 0.111190443861577 170.784931061703 0.161833030143797 171.694405902748 0.219229844709802 173.214340920064 0.273495595887875 175.24816387627 0.315887495176125 177.401364011892 0.351975748365346 179.857848980619 0.381067644864545 182.637652604668 0.40150997985239 185.737201868648 0.408952371081965 187.834463425865 1.84889274661175e-32 210 0.0568023199990197 209.797535684556 0.111190444137581 209.215068935606 0.16183302951732 208.305594113848 0.219229843519676 206.785659117562 0.273495594881989 204.751836168062 0.315887494328895 202.598636037752 0.351975747677605 200.142151074243 0.381067644351949 197.362347455423 0.40150997954739 194.262798195698 0.408952371002272 192.165536607703 1.84889274661175e-32 300 6.28318530717959 300 0.174532925199433 300 0.349065850398866 300 0.523598775598299 300 0.698131700797732 300 0.872664625997165 300 1.0471975511966 300 1.22173047639603 300 1.39626340159546 300 1.5707963267949 300 1.74532925199433 300 1.91986217719376 300 2.0943951023932 300 2.26892802759263 300 2.44346095279206 300 2.61799387799149 300 2.79252680319093 300 2.96705972839036 300 3.14159265358979 300 3.31612557878922 300 3.49065850398866 300 3.66519142918809 300 3.83972435438752 300 4.01425727958696 300 4.18879020478639 300 4.36332312998582 300 4.53785605518525 300 4.71238898038469 300 4.88692190558412 300 5.06145483078355 300 5.23598775598299 300 5.41052068118242 300 5.58505360638185 300 5.75958653158128 300 5.93411945678072 300 6.10865238198015 300 6.28318530717959 210 5.87598882339807 192.808476042752 5.88833055965779 195.483114512722 5.90745270290179 197.960005297371 5.93949613708999 200.776836372029 5.98174936915421 203.402920949326 6.0263279674235 205.448505433598 6.07702721198942 207.182662399942 6.13414102093299 208.570797574629 6.19745940304688 209.536443767991 6.23973611264938 209.881735017624 1.98416378121461 119.43291878176 1.65346981767884 135.848107983418 1.65346981767884 119.43291878176 4.29902152596498 185.093675588393 3.96832756242921 201.508864790051 3.96832756242921 185.093675588393 1.98416378121461 103.017729580102 0.661387927071534 267.169621596684 0.330693963535767 267.169621596684 0.330693963535767 250.754432395026 0.661387927071534 250.754432395026 4.29902152596498 168.678486386735 4.62971548950075 152.263297185077 4.29902152596498 152.263297185077 0.992081890607302 234.339243193367 0.661387927071534 217.924053991709 0.992081890607302 217.924053991709 4.62971548950075 135.848107983418 0.661387927071534 234.339243193367 1.32277585414307 201.508864790051 0.992081890607302 201.508864790051 4.96040945303651 119.43291878176 4.62971548950075 103.017729580102 4.96040945303651 103.017729580102 4.62971548950075 119.43291878176 1.32277585414307 185.093675588393 3.63763359889344 267.169621596684 3.30693963535768 250.754432395026 3.63763359889344 250.754432395026 3.30693963535768 267.169621596684 1.65346981767884 168.678486386735 1.32277585414307 168.678486386735 1.32277585414307 152.263297185077 3.96832756242921 234.339243193367 3.63763359889344 234.339243193367 3.96832756242921 217.924053991709 1.65346981767884 152.263297185077 4.29902152596498 201.508864790051 1.98416378121461 135.848107983418 2.31485774475037 103.017729580102 4.62971548950075 168.678486386735 0.661387927071534 283.584810798342 0.330693963535767 283.584810798342 0.992081890607302 250.754432395026 4.96040945303651 135.848107983418 1.32277585414307 217.924053991709 5.29110341657228 103.017729580102 3.63763359889344 283.584810798342 3.30693963535768 283.584810798342 1.65346981767884 185.093675588393 3.96832756242921 250.754432395026 4.29902152596498 217.924053991709 1.98416378121461 152.263297185077 4.62971548950075 185.093675588393 2.31485774475037 119.43291878176 4.96040945303651 152.263297185077 0.992081890607302 267.169621596684 1.32277585414307 234.339243193367 5.29110341657228 119.43291878176 1.65346981767884 201.508864790051 3.96832756242921 267.169621596684 4.29902152596498 234.339243193367 1.98416378121461 168.678486386735 4.62971548950075 201.508864790051 2.31485774475037 135.848107983418 4.96040945303651 168.678486386735 2.64555170828614 103.017729580102 0.992081890607302 283.584810798342 5.29110341657228 135.848107983418 1.32277585414307 250.754432395026 5.62179738010805 103.017729580102 3.96832756242921 283.584810798342 1.65346981767884 217.924053991709 4.29902152596498 250.754432395026 1.98416378121461 185.093675588393 4.62971548950075 217.924053991709 2.31485774475037 152.263297185077 4.96040945303651 185.093675588393 2.64555170828614 119.43291878176 5.29110341657228 152.263297185077 1.32277585414307 267.169621596684 5.62179738010805 119.43291878176 1.65346981767884 234.339243193367 1.98416378121461 201.508864790051 4.29902152596498 267.169621596684 4.62971548950075 234.339243193367 4.96040945303651 201.508864790051 2.31485774475037 168.678486386735 5.29110341657228 168.678486386735 2.64555170828614 135.848107983418 5.62179738010805 135.848107983418 2.97624567182191 103.017729580102 1.32277585414307 283.584810798342 1.65346981767884 250.754432395026 5.95249134364382 103.017729580102 4.29902152596498 283.584810798342 1.98416378121461 217.924053991709 4.62971548950075 250.754432395026 2.31485774475037 185.093675588393 4.96040945303651 217.924053991709 2.64555170828614 152.263297185077 5.29110341657228 185.093675588393 2.97624567182191 119.43291878176 5.62179738010805 152.263297185077 1.65346981767884 267.169621596684 5.95249134364382 119.43291878176 1.98416378121461 234.339243193367 4.62971548950075 267.169621596684 2.31485774475037 201.508864790051 4.96040945303651 234.339243193367 2.64555170828614 168.678486386735 5.29110341657228 201.508864790051 5.62179738010805 168.678486386735 2.97624567182191 135.848107983418 3.30693963535768 103.017729580102 5.95249134364382 135.848107983418 1.65346981767884 283.584810798342 1.98416378121461 250.754432395026 4.62971548950075 283.584810798342 4.96040945303651 250.754432395026 2.31485774475037 217.924053991709 5.29110341657228 217.924053991709 2.64555170828614 185.093675588393 5.62179738010805 185.093675588393 2.97624567182191 152.263297185077 5.95249134364382 152.263297185077 3.30693963535768 119.43291878176 4.96040945303651 267.169621596684 1.98416378121461 267.169621596684 5.29110341657228 234.339243193367 2.31485774475037 234.339243193367 5.62179738010805 201.508864790051 2.64555170828614 201.508864790051 5.95249134364382 168.678486386735 2.97624567182191 168.678486386735 4.96040945303651 283.584810798342 5.29110341657228 250.754432395026 3.30693963535768 135.848107983418 5.62179738010805 217.924053991709 3.63763359889344 103.017729580102 1.98416378121461 283.584810798342 5.29110341657228 267.169621596684 2.31485774475037 250.754432395026 2.64555170828614 217.924053991709 5.62179738010805 234.339243193367 5.29110341657228 283.584810798342 0.330693963535767 103.017729580102 3.30693963535768 152.263297185077 0.330693963535767 119.43291878176 5.62179738010805 250.754432395026 5.95249134364382 217.924053991709 3.63763359889344 119.43291878176 0.330693963535767 135.848107983418 2.31485774475037 267.169621596684 5.62179738010805 267.169621596684 5.95249134364382 234.339243193367 2.64555170828614 234.339243193367 0.661387927071534 103.017729580102 0.330693963535767 152.263297185077 3.30693963535768 168.678486386735 5.62179738010805 283.584810798342 3.63763359889344 135.848107983418 5.95249134364382 250.754432395026 0.661387927071534 119.43291878176 5.95249134364382 267.169621596684 3.96832756242921 103.017729580102 0.330693963535767 168.678486386735 5.95249134364382 283.584810798342 2.31485774475037 283.584810798342 2.64555170828614 250.754432395026 0.661387927071534 135.848107983418 2.97624567182191 217.924053991709 0.992081890607302 103.017729580102 3.63763359889344 152.263297185077 0.661387927071534 152.263297185077 3.96832756242921 119.43291878176 2.64555170828614 267.169621596684 0.992081890607302 119.43291878176 0.661387927071534 168.678486386735 2.97624567182191 234.339243193367 3.63763359889344 168.678486386735 0.992081890607302 135.848107983418 3.96832756242921 135.848107983418 1.32277585414307 103.017729580102 4.29902152596498 103.017729580102 0.330693963535767 217.924053991709 2.64555170828614 283.584810798342 2.97624567182191 250.754432395026 0.661387927071534 185.093675588393 3.30693963535768 217.924053991709 3.63763359889344 185.093675588393 0.992081890607302 152.263297185077 1.32277585414307 119.43291878176 3.96832756242921 152.263297185077 0.330693963535767 234.339243193367 4.29902152596498 119.43291878176 0.661387927071534 201.508864790051 2.97624567182191 267.169621596684 0.992081890607302 168.678486386735 3.30693963535768 234.339243193367 3.63763359889344 201.508864790051 1.32277585414307 135.848107983418 3.96832756242921 168.678486386735 1.65346981767884 103.017729580102 4.29902152596498 135.848107983418 2.97624567182191 283.584810798342 0.992081890607302 185.093675588393 3.63763359889344 217.924053991709 172 173 174 175 176 177 172 174 178 179 180 181 179 181 182 175 177 183 184 183 185 186 187 188 184 185 189 186 190 187 191 188 192 193 194 195 193 196 194 191 192 197 198 199 200 198 201 199 202 203 204 205 200 206 205 206 207 202 204 208 209 176 175 209 207 176 210 173 172 210 208 173 211 178 85 212 183 184 211 84 83 211 85 84 213 129 128 213 130 129 212 175 183 213 180 179 213 128 214 213 214 180 215 182 190 216 196 193 216 189 196 215 190 186 217 186 188 218 60 61 218 61 62 218 195 60 218 193 195 219 146 145 217 188 191 219 147 146 219 220 201 219 145 220 221 203 202 219 201 198 221 197 203 222 198 200 222 200 205 223 207 209 224 202 208 223 205 207 224 208 210 225 209 175 226 211 83 226 172 178 226 178 211 225 175 212 227 184 189 227 189 216 228 182 215 228 179 182 229 186 217 229 215 186 230 216 193 231 197 221 230 193 218 232 219 198 231 191 197 232 198 222 233 222 205 233 205 223 234 221 202 234 202 224 235 223 209 235 209 225 236 210 172 236 172 226 237 212 184 238 82 81 238 83 82 239 179 228 237 184 227 239 131 130 239 132 131 240 227 216 239 213 179 239 130 213 241 228 215 240 216 230 242 218 62 241 215 229 242 230 218 242 62 63 242 63 64 243 219 232 243 148 147 243 149 148 243 147 219 244 217 191 244 191 231 245 232 222 246 221 234 246 231 221 245 222 233 247 233 223 247 223 235 248 210 236 248 224 210 249 212 237 250 226 83 250 238 81 250 236 226 249 225 212 250 83 238 251 227 240 251 237 227 252 228 241 252 239 228 253 242 64 254 229 217 253 240 230 253 230 242 254 217 244 255 231 246 256 243 232 256 232 245 257 233 247 255 244 231 257 245 233 258 235 225 259 224 248 259 234 224 258 225 249 260 237 251 261 236 250 261 248 236 260 249 237 262 251 240 263 80 68 263 81 80 264 132 239 264 133 132 264 134 133 264 239 252 262 240 253 265 241 229 266 64 65 266 65 66 265 229 254 267 150 149 268 244 255 267 151 150 267 243 256 267 149 243 269 256 245 269 245 257 268 254 244 270 246 234 270 234 259 271 235 258 272 8 7 271 247 235 272 259 248 273 258 249 272 248 261 273 249 260 274 250 81 275 251 262 274 263 68 274 261 250 274 81 263 276 252 241 275 260 251 276 241 265 277 253 64 277 64 266 277 266 66 277 66 67 278 254 268 279 267 256 278 265 254 280 255 246 279 256 269 281 247 271 281 257 247 280 246 270 282 6 5 283 271 258 282 7 6 283 258 273 282 270 259 282 259 272 282 272 7 284 273 260 284 260 275 284 48 47 285 261 274 285 272 261 286 77 76 286 78 77 287 45 55 288 135 134 287 253 277 287 56 45 288 134 264 288 264 252 287 67 56 288 252 276 287 277 67 287 262 253 289 276 265 290 151 267 290 267 279 290 152 151 289 265 278 291 269 257 292 268 255 291 257 281 293 271 283 292 255 280 294 3 1 293 281 271 294 4 3 294 5 4 294 282 5 294 1 43 294 280 270 295 46 44 294 270 282 295 47 46 295 273 284 295 284 47 296 12 11 295 283 273 296 8 272 296 272 285 297 53 52 297 54 53 297 55 54 297 275 262 298 274 68 297 287 55 297 262 287 298 68 78 298 285 274 298 286 76 298 78 286 299 279 269 300 276 289 299 269 291 301 281 293 300 288 276 302 268 292 301 291 281 303 44 162 303 162 163 303 163 164 302 278 268 303 293 283 303 295 44 304 41 40 303 283 295 304 42 41 304 43 42 305 284 275 304 292 280 305 49 48 304 280 294 305 50 49 305 51 50 304 294 43 305 52 51 306 9 8 305 297 52 306 10 9 305 48 284 306 11 10 305 275 297 306 8 296 307 153 152 306 296 11 307 154 153 307 279 299 307 290 279 307 152 290 308 299 291 308 291 301 309 296 285 309 285 298 310 293 303 310 301 293 311 75 74 311 76 75 312 288 300 312 135 288 312 136 135 312 137 136 310 303 164 313 307 299 314 278 302 313 299 308 314 289 278 315 292 304 316 301 310 315 39 38 316 308 301 315 40 39 317 307 313 315 302 292 317 154 307 315 304 40 318 91 92 317 155 154 319 13 12 318 92 93 317 156 155 319 14 13 319 296 309 320 91 318 321 308 316 320 318 93 319 12 296 321 313 308 320 90 91 322 164 165 323 76 311 322 165 166 323 311 74 322 166 167 322 167 168 324 103 101 322 168 169 323 298 76 322 310 164 325 289 314 326 313 321 326 317 313 325 300 289 324 90 320 324 101 90 327 322 169 328 302 315 327 310 322 329 93 94 329 94 95 327 169 170 328 314 302 330 104 103 327 170 171 331 15 14 330 105 104 327 171 161 331 16 15 330 106 105 327 316 310 331 17 16 332 156 317 331 319 17 331 14 319 332 157 156 332 158 157 333 309 298 332 317 326 330 103 324 334 327 161 333 298 323 335 320 93 334 316 327 334 161 125 335 93 329 334 321 316 336 326 321 336 334 125 337 73 72 337 74 73 338 107 106 336 321 334 338 108 107 339 332 326 338 109 108 339 326 336 340 137 312 338 110 109 339 158 332 339 336 125 340 138 137 338 106 330 339 159 158 340 300 325 339 160 159 340 139 138 339 125 160 340 312 300 341 325 314 342 324 320 342 320 335 341 314 328 343 328 315 343 315 38 343 34 2 343 35 34 343 36 35 343 37 36 343 38 37 344 329 95 344 95 96 345 319 309 344 96 97 345 18 17 346 330 324 345 17 319 345 309 333 346 324 342 347 333 323 347 74 337 347 323 74 348 340 325 349 329 344 349 335 329 350 111 110 348 325 341 351 328 343 351 343 2 351 341 328 350 330 346 350 338 330 350 110 338 352 18 345 352 19 18 353 335 349 352 20 19 352 21 20 353 342 335 354 333 347 355 344 97 355 349 344 354 345 333 355 97 98 355 98 99 356 337 72 355 99 100 357 116 117 357 117 118 356 71 70 357 118 119 356 72 71 357 119 120 356 347 337 357 120 121 358 140 139 358 141 140 358 139 340 358 340 348 359 341 351 360 112 111 360 102 112 359 348 341 360 123 102 360 111 350 361 30 29 361 31 30 361 32 31 361 33 32 361 2 33 362 22 21 363 346 342 362 23 22 362 24 23 362 21 352 363 342 353 364 349 355 364 353 349 365 345 354 366 113 114 366 114 115 366 115 116 365 352 345 367 347 356 367 354 347 366 116 357 368 121 122 368 122 123 368 123 360 369 358 348 369 348 359 370 346 363 371 351 2 371 2 361 371 359 351 370 350 346 372 25 24 372 26 25 373 353 364 372 27 26 373 363 353 372 24 362 374 362 352 375 88 87 375 89 88 375 79 89 375 355 100 374 352 365 375 100 79 181 124 113 181 113 366 376 365 354 376 354 367 194 367 356 194 57 58 187 121 368 187 357 121 194 69 57 194 70 69 194 356 70 377 142 141 377 143 142 377 141 358 378 350 370 377 358 369 378 360 350 199 359 371 204 370 363 199 369 359 204 363 373 379 28 27 379 29 28 174 364 355 174 355 375 379 27 372 379 361 29 177 362 374 177 372 362 180 124 181 185 365 376 185 374 365 190 357 187 190 366 357 192 368 360 196 376 367 196 367 194 192 360 378 192 187 368 201 377 369 201 369 199 203 378 370 203 370 204 173 364 174 206 361 379 173 373 364 206 371 361 176 372 177 178 375 87 178 86 85 178 174 375 176 379 372 178 87 86 214 126 124 214 127 126 214 128 127 214 124 180 183 374 185 182 181 366 183 177 374 189 376 196 182 366 190 188 187 192 189 185 376 195 58 59 195 59 60 195 194 58 220 143 377 220 144 143 220 145 144 220 377 201 200 371 206 197 192 378 200 199 371 197 378 203 208 373 173 207 379 176 207 206 379 208 204 373 +37 36 1 0 +100 -2.44921270764475e-14 0 98.4807753012208 17.364817766693 0 93.9692620785908 34.2020143325669 0 86.6025403784439 50 0 76.6044443118978 64.2787609686539 0 64.2787609686539 76.6044443118978 0 50 86.6025403784439 0 34.2020143325669 93.9692620785908 0 17.364817766693 98.4807753012208 0 6.12303176911189e-15 100 0 -17.364817766693 98.4807753012208 0 -34.2020143325669 93.9692620785908 0 -50 86.6025403784439 0 -64.2787609686539 76.6044443118978 0 -76.6044443118978 64.278760968654 0 -86.6025403784438 50.0000000000001 0 -93.9692620785908 34.202014332567 0 -98.4807753012208 17.3648177666932 0 -100 1.45472826493243e-13 0 -98.4807753012208 -17.3648177666929 0 -93.9692620785909 -34.2020143325667 0 -86.602540378444 -49.9999999999998 0 -76.604444311898 -64.2787609686538 0 -64.2787609686541 -76.6044443118977 0 -50.0000000000002 -86.6025403784437 0 -34.2020143325671 -93.9692620785908 0 -17.3648177666933 -98.4807753012208 0 -2.84822621217373e-13 -100 0 17.3648177666927 -98.4807753012209 0 34.2020143325666 -93.969262078591 0 49.9999999999997 -86.602540378444 0 64.2787609686536 -76.604444311898 0 76.6044443118976 -64.2787609686542 0 86.6025403784437 -50.0000000000004 0 93.9692620785907 -34.2020143325673 0 98.4807753012207 -17.3648177666935 0 0 0 0 100 -2.8421709430404e-14 98.4807753012208 17.364817766693 93.9692620785908 34.2020143325669 86.6025403784439 50 76.6044443118978 64.2787609686539 64.278760968654 76.6044443118978 50 86.6025403784438 34.2020143325669 93.9692620785908 17.364817766693 98.4807753012208 0 100 -17.364817766693 98.4807753012208 -34.2020143325669 93.9692620785908 -50 86.6025403784439 -64.2787609686539 76.6044443118979 -76.6044443118978 64.278760968654 -86.6025403784438 50.0000000000001 -93.9692620785908 34.202014332567 -98.4807753012208 17.3648177666932 -100 1.4210854715202e-13 -98.4807753012208 -17.3648177666929 -93.9692620785909 -34.2020143325667 -86.602540378444 -49.9999999999998 -76.604444311898 -64.2787609686538 -64.2787609686541 -76.6044443118977 -50.0000000000002 -86.6025403784437 -34.2020143325671 -93.9692620785908 -17.3648177666933 -98.4807753012208 -2.8421709430404e-13 -100 17.3648177666927 -98.4807753012209 34.2020143325666 -93.969262078591 49.9999999999997 -86.602540378444 64.2787609686536 -76.604444311898 76.6044443118976 -64.2787609686542 86.6025403784437 -50.0000000000004 93.9692620785907 -34.2020143325673 98.4807753012207 -17.3648177666935 0 0 37 11 12 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 +81 79 1 0.08806932591171 +210 -4.89842541528951e-15 450 190 20 445.825756949558 209.797702468142 2.83742874189979 449.91942504134 209.215264429107 5.5473956609573 449.69131111379 208.306916927762 8.05337150161281 449.347170220943 206.788174560315 10.8700135987294 448.804126907314 204.754879178687 13.5016125308194 448.142563877523 202.602997991452 15.5294700803301 447.527208622277 200.14641042884 17.2351489960208 446.935590404877 197.364149940715 18.5948729149583 446.413690924525 194.262428648985 19.5405143016412 446.023562404914 192.165572916192 19.8824116982837 445.876897309791 210 -4.89842541528951e-15 580 210 -4.89842541528951e-15 580 209.696155060244 3.47296355333861 580 208.793852415718 6.84040286651337 580 207.320508075689 10 580 205.32088886238 12.8557521937308 580 202.855752193731 15.3208888623796 580 200 17.3205080756888 580 196.840402866513 18.7938524157182 580 193.472963553339 19.6961550602442 580 190 20 580 186.527036446661 19.6961550602442 580 183.159597133487 18.7938524157182 580 180 17.3205080756888 580 177.144247806269 15.3208888623796 580 174.67911113762 12.8557521937308 580 172.679491924311 10 580 171.206147584282 6.84040286651339 580 170.303844939756 3.47296355333863 580 170 2.90945652986485e-14 580 170.303844939756 -3.47296355333857 580 171.206147584282 -6.84040286651334 580 172.679491924311 -9.99999999999996 580 174.67911113762 -12.8557521937308 580 177.144247806269 -15.3208888623795 580 180 -17.3205080756887 580 183.159597133487 -18.7938524157181 580 186.527036446661 -19.6961550602442 580 190 -20 580 193.472963553339 -19.6961550602442 580 196.840402866513 -18.7938524157182 580 200 -17.3205080756888 580 202.855752193731 -15.3208888623796 580 205.32088886238 -12.8557521937308 580 207.320508075689 -10.0000000000001 580 208.793852415718 -6.84040286651346 580 209.696155060244 -3.4729635533387 580 210 -4.89842541528951e-15 450 187.024366020417 19.7774012963438 445.922264725258 184.397529800585 19.1992796277918 446.166954243274 181.546913604686 18.125819553687 446.59886977596 178.752969008674 16.5379654738046 447.185757348038 176.369667096977 14.6360522075901 447.809894135463 174.309971315007 12.4025399755702 448.437351320804 172.548649956894 9.76987059841766 449.036207207027 171.242034340645 6.93820726756652 449.51627283167 170.380301086729 3.88167696084131 449.849098129506 170.023096521915 0.960898368304993 449.990765883617 170.086043866562 -1.8531982436549 449.965644740411 170.509841698291 -4.48706231247217 449.798255709213 171.398299667707 -7.34688690845968 449.457287186436 172.743857915231 -10.1106660571351 448.967075069423 174.347888840505 -12.4503589683746 448.425082205426 176.192341023654 -14.4688795692552 447.86074933687 178.295746540249 -16.2176006194872 447.296825505482 180.640667676887 -17.6748961416399 446.7717611852 183.205669615023 -18.8105768661047 446.326693427354 186.059267040101 -19.6079226714758 445.994884340429 189.05297923185 -19.9775663053321 445.835541404226 191.895773051283 -19.9099477889329 445.864953696004 194.48438891673 -19.4907734771899 446.044649514275 197.343898776281 -18.6028803528253 446.410482031254 200.13477025801 -17.2419961803721 446.933075375945 202.522803249016 -15.5942105252608 447.506005983989 204.599616537762 -13.6693524360872 448.095205754853 206.410620564223 -11.4320396201158 448.675542899776 207.946109646233 -8.82820037172931 449.214457777936 209.086918743382 -5.97406825644437 449.641821815127 209.747291812357 -3.16934437217016 449.899454557652 0 70 1.5707963267949 65.8257569495584 0.142351747122082 69.9194250413404 0.281055375999813 69.6913111137899 0.414430358933343 69.347170220943 0.57460191467716 68.8041269073138 0.74107398002479 68.1425638775227 0.889050078939067 67.5272086222772 1.03872370599815 66.9355904048767 1.19371599529568 66.4136909245251 1.35602764574802 66.0235624049143 1.46230497436568 65.8768973097914 0 200 6.28318530717959 200 0.174532925199433 200 0.349065850398866 200 0.523598775598299 200 0.698131700797732 200 0.872664625997165 200 1.0471975511966 200 1.22173047639603 200 1.39626340159546 200 1.5707963267949 200 1.74532925199433 200 1.91986217719376 200 2.0943951023932 200 2.26892802759263 200 2.44346095279206 200 2.61799387799149 200 2.79252680319093 200 2.96705972839036 200 3.14159265358979 200 3.31612557878922 200 3.49065850398866 200 3.66519142918809 200 3.83972435438752 200 4.01425727958696 200 4.18879020478639 200 4.36332312998582 200 4.53785605518525 200 4.71238898038469 200 4.88692190558412 200 5.06145483078355 200 5.23598775598299 200 5.41052068118242 200 5.58505360638185 200 5.75958653158128 200 5.93411945678072 200 6.10865238198015 200 6.28318530717959 70 1.72013247146725 65.9222647252579 1.85471909915631 66.1669542432741 2.00716842603721 66.5988697759599 2.1680232039098 67.1857573480384 2.32062944411443 67.8098941354628 2.47268807187481 68.4373513208037 2.63123021656973 69.0362072070267 2.78731777911728 69.5162728316698 2.94626920198406 69.8490981295058 3.09352922962378 69.9907658836172 3.23438566536289 69.965644740411 3.36787183147278 69.7982557092127 3.51774477754683 69.4572871864363 3.67159260869899 68.9670750694232 3.81354864144537 68.4250822054262 3.95037073077329 67.8607493368701 4.08724665603431 67.2968255054819 4.22540029705421 66.7717611852004 4.3657735702699 66.3266934273543 4.5140545776344 65.9948843404291 4.66502022222132 65.8355414042262 4.8073201484896 65.864953696004 4.93853099433839 66.0446495142749 5.08838047165455 66.4104820312536 5.24378635980383 66.9330753759453 5.38898193691902 67.5060059839887 5.53068286483151 68.0952057548532 5.67472839418684 68.6755428997765 5.82601583894822 69.2144577779357 5.97985154473146 69.6418218151269 6.12404711892915 69.8994545576524 13 1 3 15 3 4 15 13 3 16 4 5 16 15 4 17 5 6 17 16 5 18 6 7 18 17 6 19 7 8 19 18 7 20 8 9 20 19 8 21 9 10 21 10 11 21 20 9 22 11 12 22 21 11 23 12 2 23 2 51 23 22 12 24 23 51 24 51 52 25 24 52 25 52 53 26 25 53 26 53 54 27 26 54 27 54 55 28 55 56 28 56 57 28 27 55 29 28 57 29 57 58 30 58 59 30 29 58 31 30 59 31 59 60 32 60 61 32 31 60 33 61 62 33 32 61 34 62 63 34 33 62 35 63 64 35 34 63 36 64 65 36 65 66 36 35 64 37 66 67 37 36 66 38 67 68 38 37 67 39 38 68 39 68 69 40 39 69 40 69 70 40 70 71 41 71 72 41 40 71 42 41 72 42 72 73 43 42 73 43 73 74 43 74 75 44 43 75 44 75 76 45 44 76 45 76 77 46 45 77 46 77 78 47 46 78 47 78 79 48 47 79 48 79 80 49 48 80 49 80 81 14 49 81 14 81 50 +82 80 1 0.0850572428380306 +190 -20 354.174243050442 210 -8.57224447675664e-15 350 192.808476042752 -19.8018301996066 354.088263569143 195.483114512722 -19.2337057459418 353.847377731445 197.960005297371 -18.3477062907747 353.48804794237 200.776836372029 -16.8481398619274 352.924101795035 203.402920949326 -14.8445852749198 352.254442217558 205.448505433598 -12.7021126053398 351.640343989945 207.182662399942 -10.2350434472155 351.058771099956 208.570797574629 -7.42465408034023 350.554327671456 209.536443767991 -4.28104718451168 350.183610770056 209.881735017624 -2.17177625553873 350.047188395291 210 -4.89842541528951e-15 220 210 -4.89842541528951e-15 220 209.696155060244 3.47296355333861 220 208.793852415718 6.84040286651337 220 207.320508075689 10 220 205.32088886238 12.8557521937308 220 202.855752193731 15.3208888623796 220 200 17.3205080756888 220 196.840402866513 18.7938524157182 220 193.472963553339 19.6961550602442 220 190 20 220 186.527036446661 19.6961550602442 220 183.159597133487 18.7938524157182 220 180 17.3205080756888 220 177.144247806269 15.3208888623796 220 174.67911113762 12.8557521937308 220 172.679491924311 10 220 171.206147584282 6.84040286651339 220 170.303844939756 3.47296355333863 220 170 2.90945652986485e-14 220 170.303844939756 -3.47296355333857 220 171.206147584282 -6.84040286651334 220 172.679491924311 -9.99999999999996 220 174.67911113762 -12.8557521937308 220 177.144247806269 -15.3208888623795 220 180 -17.3205080756887 220 183.159597133487 -18.7938524157181 220 186.527036446661 -19.6961550602442 220 190 -20 220 193.472963553339 -19.6961550602442 220 196.840402866513 -18.7938524157182 220 200 -17.3205080756888 220 202.855752193731 -15.3208888623796 220 205.32088886238 -12.8557521937308 220 207.320508075689 -10.0000000000001 220 208.793852415718 -6.84040286651346 220 209.696155060244 -3.4729635533387 220 210 -8.57224447675664e-15 350 190 20 354.174243050442 209.797535684556 2.83858895721841 350.080640928023 209.215068935606 5.54807361321558 350.308764554953 208.305594113848 8.05637773956749 350.653320488076 206.785659117562 10.8738982275306 351.196738404482 204.751836168062 13.5049376384928 351.858368701347 202.598636037752 15.5330087758858 352.473947824842 200.142151074243 17.2376548931651 353.065330153674 197.362347455423 18.5955871959507 353.586595046112 194.262798195698 19.5404341226978 353.976403384948 192.165536607703 19.8824152857648 354.123104386169 170 -1.22460635382238e-14 350 170.202464309206 2.83858896354278 350.080640925493 170.784931061703 5.54807359953334 350.308764553975 171.694405902748 8.05637777047583 350.653320494305 173.214340920064 10.8738982856126 351.196738417424 175.24816387627 13.5049376869178 351.858368714932 177.401364011892 15.5330088161513 352.473947838002 179.857848980619 17.237654925444 353.065330165529 182.637652604668 18.5955872197421 353.586595055644 185.737201868648 19.5404341367349 353.976403390908 187.834463425865 19.8824152894209 354.123104387754 187.19152395552 -19.8018301993616 354.088263569037 184.516885484041 -19.2337057450191 353.84737773106 182.039994698179 -18.347706288844 353.488047941608 179.223163623154 -16.8481398588458 352.924101793932 176.597079044967 -14.8445852697679 352.254442215956 174.551494560294 -12.7021125979118 351.640343987994 172.81733759401 -10.2350434370622 351.058771097833 171.42920242427 -7.42465406707688 350.554327671198 170.463556231093 -4.28104719934824 350.183610769691 170.118264986057 -2.17177622757773 350.047188396748 4.71238898038469 134.174243050442 6.28318530717959 130 4.85327844788595 134.088263569143 4.99010063715277 133.847377731445 5.12172498674817 133.48804794237 5.28145061948999 132.924101795035 5.44679451827606 132.254442217558 5.59504002539476 131.640343989945 5.74596228873161 131.058771099956 5.90284904650619 130.554327671456 6.0674637066173 130.183610770056 6.1743819504377 130.047188395291 6.28318530717959 0 0 0 0.174532925199433 0 0.349065850398866 0 0.523598775598299 0 0.698131700797732 0 0.872664625997165 0 1.0471975511966 0 1.22173047639603 0 1.39626340159546 0 1.5707963267949 0 1.74532925199433 0 1.91986217719376 0 2.0943951023932 0 2.26892802759263 0 2.44346095279206 0 2.61799387799149 0 2.79252680319093 0 2.96705972839036 0 3.14159265358979 0 3.31612557878922 0 3.49065850398866 0 3.66519142918809 0 3.83972435438752 0 4.01425727958696 0 4.18879020478639 0 4.36332312998582 0 4.53785605518525 0 4.71238898038469 0 4.88692190558412 0 5.06145483078355 0 5.23598775598299 0 5.41052068118242 0 5.58505360638185 0 5.75958653158128 0 5.93411945678072 0 6.10865238198015 0 0 130 1.5707963267949 134.174243050442 0.142410335941526 130.080640928023 0.281090663049982 130.308764554953 0.414594571639405 130.653320488076 0.574833310501752 131.196738404482 0.741299351798358 131.858368701347 0.889330920856856 132.473947824842 1.03897085878836 133.065330153674 1.19381290142985 133.586595046112 1.35600871415747 133.976403384948 1.46230681760685 134.123104386169 3.14159265358979 130 2.99918231731974 130.080640925493 2.86050199126434 130.308764553975 2.72699808025909 130.653320494305 2.56675933962782 131.196738417424 2.4002932985088 131.858368714932 2.25226172953692 132.473947838002 2.10262179161877 133.065330165529 1.94777974892844 133.586595055644 1.78558393613939 133.976403390908 1.67928583429461 134.123104387754 4.57149951279621 134.088263569037 4.43467732344834 133.847377731061 4.30305297377866 133.488047941608 4.14332734099344 132.924101793932 3.97798344210894 132.254442215957 3.8297379348938 131.640343987994 3.67881567144687 131.058771097833 3.52192891353577 130.554327671198 3.35731425490409 130.183610769691 3.25039600893176 130.047188396748 52 14 15 52 50 14 53 15 16 53 52 15 54 53 16 54 16 17 55 17 18 55 54 17 56 55 18 56 18 19 57 56 19 57 19 20 58 20 21 58 57 20 59 58 21 60 21 22 60 59 21 61 22 23 61 60 22 51 61 23 72 23 24 72 51 23 71 24 25 71 72 24 70 71 25 69 25 26 69 70 25 68 26 27 68 69 26 67 27 28 67 68 27 66 28 29 66 67 28 65 29 30 65 66 29 64 30 31 64 65 30 63 31 32 63 64 31 62 63 32 82 32 33 82 62 32 81 33 34 81 82 33 80 34 35 80 81 34 79 35 36 79 80 35 78 36 37 78 79 36 77 78 37 76 37 38 76 77 37 75 76 38 75 38 39 74 75 39 74 39 40 73 74 40 73 40 41 1 73 41 3 1 41 3 41 42 4 3 42 4 42 43 5 4 43 5 43 44 6 5 44 6 44 45 7 6 45 8 7 45 8 45 46 9 8 46 9 46 47 10 9 47 10 47 48 11 10 48 11 48 49 12 11 49 12 49 13 2 12 13 +37 36 1 0 +50 -1.22460635382238e-14 300 49.2403876506104 8.68240888334652 300 46.9846310392954 17.1010071662834 300 43.3012701892219 25 300 38.3022221559489 32.139380484327 300 32.139380484327 38.3022221559489 300 25 43.3012701892219 300 17.1010071662834 46.9846310392954 300 8.68240888334654 49.2403876506104 300 -2.35367281220533e-14 50 300 -8.68240888334653 49.2403876506104 300 -17.1010071662834 46.9846310392954 300 -25 43.3012701892219 300 -32.1393804843269 38.3022221559489 300 -38.3022221559489 32.139380484327 300 -43.3012701892219 25 300 -46.9846310392954 17.1010071662835 300 -49.2403876506104 8.68240888334658 300 -50 7.27364132466213e-14 300 -49.2403876506104 -8.68240888334644 300 -46.9846310392955 -17.1010071662833 300 -43.301270189222 -24.9999999999999 300 -38.3022221559489 -32.1393804843269 300 -32.1393804843271 -38.3022221559488 300 -25.0000000000001 -43.3012701892219 300 -17.1010071662835 -46.9846310392954 300 -8.68240888334665 -49.2403876506104 300 -1.37223565843669e-13 -50 300 8.68240888334637 -49.2403876506104 300 17.1010071662833 -46.9846310392955 300 24.9999999999999 -43.301270189222 300 32.1393804843268 -38.302222155949 300 38.3022221559488 -32.1393804843271 300 43.3012701892218 -25.0000000000002 300 46.9846310392954 -17.1010071662836 300 49.2403876506104 -8.68240888334674 300 -2.35367281220533e-14 0 300 50 0 49.2403876506104 8.68240888334652 46.9846310392954 17.1010071662834 43.3012701892219 25 38.3022221559489 32.139380484327 32.139380484327 38.3022221559489 25 43.3012701892219 17.1010071662834 46.9846310392954 8.68240888334652 49.2403876506104 0 50 -8.68240888334651 49.2403876506104 -17.1010071662834 46.9846310392954 -25 43.3012701892219 -32.1393804843269 38.3022221559489 -38.3022221559489 32.139380484327 -43.3012701892219 25 -46.9846310392954 17.1010071662835 -49.2403876506104 8.68240888334658 -50 7.105427357601e-14 -49.2403876506104 -8.68240888334644 -46.9846310392955 -17.1010071662834 -43.301270189222 -24.9999999999999 -38.302222155949 -32.1393804843269 -32.139380484327 -38.3022221559488 -25.0000000000001 -43.3012701892219 -17.1010071662836 -46.9846310392954 -8.68240888334665 -49.2403876506104 -1.4210854715202e-13 -50 8.68240888334637 -49.2403876506104 17.1010071662833 -46.9846310392955 24.9999999999999 -43.301270189222 32.1393804843268 -38.302222155949 38.3022221559488 -32.1393804843271 43.3012701892218 -25.0000000000002 46.9846310392954 -17.1010071662836 49.2403876506104 -8.68240888334674 0 0 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 37 11 12 +37 36 1 0 +20 -4.89842541528951e-15 200 19.6961550602442 3.47296355333861 200 18.7938524157182 6.84040286651337 200 17.3205080756888 10 200 15.3208888623795 12.8557521937308 200 12.8557521937308 15.3208888623796 200 10 17.3205080756888 200 6.84040286651339 18.7938524157182 200 3.47296355333862 19.6961550602442 200 0 20 200 -3.47296355333862 19.6961550602442 200 -6.84040286651339 18.7938524157182 200 -10 17.3205080756888 200 -12.8557521937308 15.3208888623796 200 -15.3208888623795 12.8557521937308 200 -17.3205080756888 10 200 -18.7938524157182 6.84040286651339 200 -19.6961550602442 3.47296355333863 200 -20 2.90945652986485e-14 200 -19.6961550602442 -3.47296355333857 200 -18.7938524157182 -6.84040286651334 200 -17.3205080756888 -9.99999999999996 200 -15.3208888623796 -12.8557521937308 200 -12.8557521937308 -15.3208888623795 200 -10 -17.3205080756887 200 -6.84040286651341 -18.7938524157181 200 -3.47296355333867 -19.6961550602442 200 -5.6843418860808e-14 -20 200 3.47296355333856 -19.6961550602442 200 6.8404028665133 -18.7938524157182 200 9.99999999999994 -17.3205080756888 200 12.8557521937307 -15.3208888623796 200 15.3208888623795 -12.8557521937308 200 17.3205080756887 -10.0000000000001 200 18.7938524157181 -6.84040286651346 200 19.6961550602441 -3.4729635533387 200 0 0 200 20 0 19.6961550602442 3.47296355333861 18.7938524157182 6.84040286651337 17.3205080756888 10 15.3208888623796 12.8557521937308 12.8557521937308 15.3208888623796 10 17.3205080756888 6.84040286651338 18.7938524157182 3.47296355333861 19.6961550602442 0 20 -3.47296355333861 19.6961550602442 -6.84040286651337 18.7938524157182 -10 17.3205080756888 -12.8557521937308 15.3208888623796 -15.3208888623796 12.8557521937308 -17.3205080756888 10 -18.7938524157182 6.84040286651339 -19.6961550602442 3.47296355333863 -20 2.8421709430404e-14 -19.6961550602442 -3.47296355333857 -18.7938524157182 -6.84040286651334 -17.3205080756888 -9.99999999999996 -15.3208888623796 -12.8557521937308 -12.8557521937308 -15.3208888623795 -10 -17.3205080756887 -6.84040286651342 -18.7938524157181 -3.47296355333866 -19.6961550602442 -5.6843418860808e-14 -20 3.47296355333854 -19.6961550602442 6.84040286651332 -18.7938524157182 9.99999999999994 -17.3205080756888 12.8557521937307 -15.3208888623796 15.3208888623795 -12.8557521937308 17.3205080756887 -10.0000000000001 18.7938524157181 -6.84040286651346 19.6961550602441 -3.47296355333869 0 0 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 37 11 12 37 12 13 37 13 14 37 14 15 +37 36 1 0 +20 -4.89842541528951e-15 0 19.6961550602442 3.47296355333861 0 18.7938524157182 6.84040286651337 0 17.3205080756888 10 0 15.3208888623795 12.8557521937308 0 12.8557521937308 15.3208888623796 0 10 17.3205080756888 0 6.84040286651339 18.7938524157182 0 3.47296355333862 19.6961550602442 0 0 20 0 -3.47296355333862 19.6961550602442 0 -6.84040286651339 18.7938524157182 0 -10 17.3205080756888 0 -12.8557521937308 15.3208888623796 0 -15.3208888623795 12.8557521937308 0 -17.3205080756888 10 0 -18.7938524157182 6.84040286651339 0 -19.6961550602442 3.47296355333863 0 -20 2.90945652986485e-14 0 -19.6961550602442 -3.47296355333857 0 -18.7938524157182 -6.84040286651334 0 -17.3205080756888 -9.99999999999996 0 -15.3208888623796 -12.8557521937308 0 -12.8557521937308 -15.3208888623795 0 -10 -17.3205080756887 0 -6.84040286651341 -18.7938524157181 0 -3.47296355333867 -19.6961550602442 0 -5.6843418860808e-14 -20 0 3.47296355333856 -19.6961550602442 0 6.8404028665133 -18.7938524157182 0 9.99999999999994 -17.3205080756888 0 12.8557521937307 -15.3208888623796 0 15.3208888623795 -12.8557521937308 0 17.3205080756887 -10.0000000000001 0 18.7938524157181 -6.84040286651346 0 19.6961550602441 -3.4729635533387 0 0 0 0 20 -3.5527136788005e-15 19.6961550602442 3.47296355333861 18.7938524157182 6.84040286651337 17.3205080756888 10 15.3208888623796 12.8557521937308 12.8557521937308 15.3208888623796 10 17.3205080756888 6.84040286651338 18.7938524157182 3.47296355333861 19.6961550602442 0 20 -3.47296355333861 19.6961550602442 -6.84040286651337 18.7938524157182 -10 17.3205080756888 -12.8557521937308 15.3208888623796 -15.3208888623796 12.8557521937308 -17.3205080756888 10 -18.7938524157182 6.84040286651339 -19.6961550602442 3.47296355333863 -20 2.8421709430404e-14 -19.6961550602442 -3.47296355333857 -18.7938524157182 -6.84040286651334 -17.3205080756888 -9.99999999999996 -15.3208888623796 -12.8557521937308 -12.8557521937308 -15.3208888623795 -10 -17.3205080756887 -6.84040286651342 -18.7938524157181 -3.47296355333866 -19.6961550602442 -5.6843418860808e-14 -20 3.47296355333854 -19.6961550602442 6.84040286651332 -18.7938524157182 9.99999999999994 -17.3205080756888 12.8557521937307 -15.3208888623796 15.3208888623795 -12.8557521937308 17.3205080756887 -10.0000000000001 18.7938524157181 -6.84040286651346 19.6961550602441 -3.47296355333869 0 0 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 37 11 12 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 + +TShapes 57 +Ve +1e-07 +100 -2.44921270764475e-14 800 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 1 0 0 6.28318530717959 +2 1 2 0 0 6.28318530717959 +2 2 1 0 0 6.28318530717959 +6 1 2 0 +6 2 1 0 +0 + +0101100 ++57 0 -57 0 * +Wi + +0101000 ++56 0 * +Fa +0 1e-07 1 0 +2 1 +0101000 ++55 0 * +Ve +3.77011308578173e-06 +86.6025403784438 -50 400 +0 0 + +0101101 +* +Ve +3.77011308578173e-06 +100 -1.83690953073357e-14 350 +0 0 + +0101101 +* +Ed + 3.77011308578173e-06 1 1 0 +1 2 0 0 1 +2 3 2 0 0 1 +2 4 3 1 0 1 +6 3 2 0 +6 4 3 0 +0 + +0101000 ++53 0 -52 0 * +Ve +1e-07 +100 -2.44921270764475e-14 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 3 0 0 350 +3 5 6CN 2 0 0 350 +7 5 6 2 0 +0 + +0101000 ++50 0 -52 0 * +Ed + 1e-07 1 1 0 +1 4 0 0 6.28318530717959 +2 7 2 0 0 6.28318530717959 +2 8 4 0 0 6.28318530717959 +6 7 2 0 +6 8 4 0 +0 + +0101100 ++50 0 -50 0 * +Ve +3.77011308578173e-06 +86.6025403784439 50 400 +0 0 + +0101101 +* +Ed + 3.77011308578173e-06 1 1 0 +1 5 0 0 1 +2 9 2 0 0 1 +2 10 3 1 0 1 +6 9 2 0 +6 10 3 0 +0 + +0101000 ++52 0 -47 0 * +Ve +3.77011308578173e-06 +100 -2.44921270764475e-14 450 +0 0 + +0101101 +* +Ed + 3.77011308578173e-06 1 1 0 +1 6 0 0 1 +2 11 2 0 0 1 +2 12 3 1 0 1 +6 11 2 0 +6 12 3 0 +0 + +0101000 ++45 0 -47 0 * +Ed + 1e-07 1 1 0 +1 3 0 450 800 +3 5 6CN 2 0 450 800 +7 13 14 2 0 +0 + +0101000 ++45 0 -57 0 * +Ed + 3.77011308578173e-06 1 1 0 +1 7 0 0 1 +2 13 2 0 0 1 +2 14 3 1 0 1 +6 15 2 0 +6 16 3 0 +0 + +0101000 ++53 0 -45 0 * +Wi + +0101000 +-51 0 +49 0 +48 0 -49 0 -46 0 +44 0 -43 0 -56 0 +43 0 +42 0 +* +Fa +0 1e-07 2 0 +2 2 +0101000 ++41 0 * +Ve +7.99539616382488e-05 +190 20 445.825756949558 +0 0 + +0101101 +* +Ve +7.99539616382488e-05 +210 -4.89842541528951e-15 450 +0 0 + +0101101 +* +Ed + 7.99539616382488e-05 1 1 0 +1 8 0 0 1 +2 15 3 1 0 1 +2 16 5 2 0 1 +6 17 3 0 +6 18 5 0 +0 + +0101000 ++39 0 -38 0 * +Ed + 7.99539616382488e-05 1 1 0 +1 9 0 0 1 +2 17 3 1 0 1 +2 18 5 2 0 1 +6 19 3 0 +6 20 5 0 +0 + +0101000 ++38 0 -39 0 * +Wi + +0101000 +-37 0 -36 0 * +Ve +1.92831599071361e-06 +190 -20 354.174243050442 +0 0 + +0101101 +* +Ve +1.92831599071361e-06 +170 -1.22460635382238e-14 350 +0 0 + +0101101 +* +Ed + 1.92831599071361e-06 1 1 0 +1 10 0 0 1 +2 19 3 1 0 1 +2 20 5 3 0 1 +6 21 3 0 +6 22 6 0 +0 + +0101000 ++34 0 -33 0 * +Ed + 1e-07 1 1 0 +1 11 0 100 170 +3 21 22CN 3 0 100 170 +7 23 24 3 4 +0 + +0101000 ++52 4 -33 4 * +Ve +1.92831599071361e-06 +190 20 354.174243050442 +0 0 + +0101101 +* +Ed + 1.92831599071361e-06 1 1 0 +1 12 0 0 1 +2 23 3 1 0 1 +2 24 5 3 0 1 +6 25 3 0 +6 26 6 0 +0 + +0101000 ++33 0 -30 0 * +Ve +1.92831599071361e-06 +210 -8.57224447675664e-15 350 +0 0 + +0101101 +* +Ed + 1.92831599071361e-06 1 1 0 +1 13 0 0 1 +2 25 3 1 0 1 +2 26 5 3 0 1 +6 27 3 0 +6 28 6 0 +0 + +0101000 ++28 0 -30 0 * +Ve +1e-07 +50 -1.22460635382238e-14 300 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 11 0 210 300 +3 21 22CN 3 0 210 300 +7 29 30 3 4 +0 + +0101000 ++28 4 -26 0 * +Ed + 1e-07 1 1 0 +1 14 0 0 6.28318530717959 +2 27 3 0 0 6.28318530717959 +2 28 6 0 0 6.28318530717959 +6 31 3 4 +6 32 7 0 +0 + +0101100 ++26 0 -26 0 * +Ed + 1.92831599071361e-06 1 1 0 +1 15 0 0 1 +2 29 3 1 0 1 +2 30 5 3 0 1 +6 33 3 0 +6 34 6 0 +0 + +0101000 ++34 0 -28 0 * +Wi + +0101000 +-32 0 +31 1 +51 0 -42 0 -44 0 +46 0 -31 1 -29 0 +27 0 -25 1 +-24 1 +25 1 +23 0 * +Fa +0 1e-07 3 1 +2 3 +0101000 ++35 0 +22 0 * +Wi + +0101000 +-48 0 * +Fa +0 1e-07 4 0 +2 4 +0101000 +-20 0 * +Ve +1e-07 +20 -4.89842541528951e-15 200 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 16 0 70 200 +3 31 32CN 5 0 70 200 +7 35 36 5 5 +0 + +0101000 ++38 5 -18 0 * +Ed + 1e-07 1 1 0 +1 17 0 0 6.28318530717959 +2 33 5 0 0 6.28318530717959 +2 34 7 0 0 6.28318530717959 +2 35 5 6 0 6.28318530717959 +6 37 5 5 +6 38 8 0 +0 + +0101100 ++18 0 -18 0 * +Wi + +0101000 ++36 0 -17 2 -16 2 +17 2 +37 0 * +Fa +0 1e-07 5 2 +2 5 +0101000 ++15 0 * +Ve +1e-07 +20 -4.89842541528951e-15 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 16 0 0 130 +3 31 32CN 5 0 0 130 +7 39 40 6 7 +0 + +0101000 ++13 0 -28 7 * +Ed + 1e-07 1 1 0 +1 18 0 0 6.28318530717959 +2 36 5 0 0 6.28318530717959 +2 37 8 0 0 6.28318530717959 +2 38 5 8 0 6.28318530717959 +6 41 6 7 +6 42 9 0 +0 + +0101100 ++13 0 -13 0 * +Wi + +0101000 +-23 0 +12 3 +11 3 -12 3 -27 0 +29 0 +32 0 * +Fa +0 1e-07 5 3 +2 6 +0101000 ++10 0 * +Wi + +0101000 ++24 0 * +Fa +0 1e-07 6 0 +2 7 +0101000 ++8 0 * +Wi + +0101000 ++16 0 * +Fa +0 1e-07 7 0 +2 8 +0101000 ++6 0 * +Wi + +0101000 +-11 0 * +Fa +0 1e-07 8 0 +2 9 +0101000 +-4 0 * +Sh + +0101000 ++54 0 +40 0 +21 0 -19 0 +14 0 +9 0 +7 1 +5 2 -3 3 * +So + +0100000 ++2 0 * + ++1 0 \ No newline at end of file diff --git a/src/TEST_PY/recettes/troisCylindres.py b/src/TEST_PY/recettes/troisCylindres.py new file mode 100644 index 0000000..3fcf56e --- /dev/null +++ b/src/TEST_PY/recettes/troisCylindres.py @@ -0,0 +1,207 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Francis KLOSS : 2012 : CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France +# ======================================================================================== + +import geompy +import hexablock + +# Charger la géométrie +# ==================== + +nom = "troisCylindres" + +piece = geompy.ImportBREP(nom+".brep") + +# Sélectionner des sous-parties de la géométrie +# --------------------------------------------- + +sommets = geompy.SubShapeAllSortedCentres(piece, geompy.ShapeType["VERTEX"]) +aretes = geompy.SubShapeAllSortedCentres(piece, geompy.ShapeType["EDGE" ]) + +moy_b_x, moy_b_y, moy_b_z = geompy.PointCoordinates(sommets[14]) +moy_p_x, moy_p_y, moy_p_z = geompy.PointCoordinates(sommets[ 6]) +moy_g_x, moy_g_y, moy_g_z = geompy.PointCoordinates(sommets[ 3]) + +grand0, grand_xb, grand_yb, grand_zb, grand1, grand2, grand3, grand_rayon = geompy.KindOfShape(aretes[ 0]) +grand4, grand_xh, grand_yh, grand_zh, grand5, grand6, grand7, grand8 = geompy.KindOfShape(aretes[ 1]) + +moyen0, moyen_x , moyen_y , moyen_z , moyen1, moyen2, moyen3, moyen_rayon = geompy.KindOfShape(aretes[20]) + +petit0, petit_xb, petit_yb, petit_zb, petit1, petit2, petit3, petit_rayon = geompy.KindOfShape(aretes[12]) +petit4, petit_xh, petit_yh, petit_zh, petit5, petit6, petit7, petit8 = geompy.KindOfShape(aretes[13]) + +# Construire le modèle de bloc +# ============================ + +doc = hexablock.addDocument(nom) + +doc.setShape(piece) + +# Construire le grand cylindre +# ---------------------------- + +grand_base = doc.addVertex(grand_xb, grand_yb, grand_zb) +grand_oppo = doc.addVertex(grand_xh, grand_yh, grand_zh) + +grand_dir = doc.addVectorVertices(grand_base, grand_oppo) + +grand_hauteur = grand_dir.getNorm() + +grand_cylindre = doc.addCylinder(grand_base, grand_dir, grand_rayon, grand_hauteur) + +# Construire le moyen cylindre coté grand +# --------------------------------------- + +moy_g_r1 = 0.8 +moy_g_r2 = 0.5 + +moy_g_base_x = moy_p_x + (moy_g_x-moy_p_x)*moy_g_r1 + moyen_x - moy_b_x +moy_g_base_y = moy_p_y + (moy_g_y-moy_p_y)*moy_g_r1 + moyen_y - moy_b_y +moy_g_base_z = moy_p_z + (moy_g_z-moy_p_z)*moy_g_r1 + moyen_z - moy_b_z + +moy_g_base = doc.addVertex(moy_g_base_x, moy_g_base_y, moy_g_base_z) +moy_g_oppo = doc.addVertex( (grand_xh+grand_xb) * moy_g_r2, (grand_yh+grand_yb) * moy_g_r2, (grand_zh+grand_zb) * moy_g_r2 ) + +moy_g_dir = doc.addVectorVertices(moy_g_base, moy_g_oppo) + +moy_g_hauteur = moy_g_dir.getNorm() + +moy_g_cylindre = doc.addCylinder(moy_g_base, moy_g_dir, moyen_rayon, moy_g_hauteur) + +# Construire le moyen cylindre coté petit +# --------------------------------------- + +moy_p_r = 0.18 + +moy_p_base = doc.addVertex(moyen_x, moyen_y, moyen_z) +moy_b_base = doc.addVertex(moy_b_x, moy_b_y, moy_b_z) +moy_p_oppo = doc.addVertex( moy_p_x+(moy_g_x-moy_p_x) * moy_p_r, moy_p_y+(moy_g_y-moy_p_y) * moy_p_r, moy_p_z+(moy_g_z-moy_p_z) * moy_p_r ) + +moy_p_dir = doc.addVectorVertices(moy_b_base, moy_p_oppo) + +moy_p_hauteur = moy_p_dir.getNorm() + +moy_p_cylindre = doc.addCylinder(moy_p_base, moy_p_dir, moyen_rayon, moy_p_hauteur) + +# Construire le petit cylindre +# ---------------------------- + +petit_base = doc.addVertex(petit_xb, petit_yb, petit_zb) +petit_oppo = doc.addVertex(petit_xh, petit_yh, petit_zh) + +petit_dir = doc.addVectorVertices(petit_base, petit_oppo) + +petit_hauteur = petit_dir.getNorm() + +petit_cylindre = doc.addCylinder(petit_base, petit_dir, petit_rayon, petit_hauteur) + +# Construire le T et la X +# ----------------------- + +en_te = doc.makeCylinders(grand_cylindre, moy_g_cylindre) +croix = doc.makeCylinders(moy_p_cylindre, petit_cylindre) + +# Relier le T et la X +# ------------------- + +croix_quads = [] + +for i in xrange(1, -1, -1): + for j in xrange( [hexablock.CV_MAXI_INT, hexablock.CV_MAXI_EXT][i] ): + quad = croix.getQuadIJ(hexablock.CYL_BIG, i, j, hexablock.CYL_BIG_SLICES) + croix_quads.append(quad) + +en_te_q = en_te.getQuadIJ(hexablock.CYL_SMALL, 1, hexablock.V_N, 0) + +en_te_v0 = en_te.getVertexIJK(hexablock.CYL_SMALL, 2, hexablock.V_N , 0) +en_te_v1 = en_te.getVertexIJK(hexablock.CYL_SMALL, 2, hexablock.V_NW, 0) + +croix_v0 = croix.getVertexIJK(hexablock.CYL_BIG, 2, hexablock.V_E , hexablock.CYL_BIG_SLICES) +croix_v1 = croix.getVertexIJK(hexablock.CYL_BIG, 2, hexablock.V_NE, hexablock.CYL_BIG_SLICES) + +prisme = doc.joinQuads(croix_quads, en_te_q, croix_v0, en_te_v0, croix_v1, en_te_v1, 1) + +# Associer +# ======== + +# fkl: comme pour la tuyauterie: associer pour le prisme (sauf si item 142 et 146 de Taches.ods) + +# Mailler le modèle de bloc +# ========================= + +# Définir 5 groupes de faces +# -------------------------- + +groupe_grand_a = doc.addQuadGroup("Grand_A") +groupe_grand_b = doc.addQuadGroup("Grand_B") +groupe_moyen_f = doc.addQuadGroup("Moyen") +groupe_petit_a = doc.addQuadGroup("Petit_A") +groupe_petit_b = doc.addQuadGroup("Petit_B") + +for i in xrange(2): + for j in xrange( [hexablock.CV_MAXI_INT, hexablock.CV_MAXI_EXT][i] ): + quad = en_te.getQuadIJ(hexablock.CYL_BIG , i, j, 0) + groupe_grand_a.addElement(quad) + + quad = en_te.getQuadIJ(hexablock.CYL_BIG , i, j, hexablock.CYL_BIG_SLICES) + groupe_grand_b.addElement(quad) + + quad = croix.getQuadIJ(hexablock.CYL_BIG , i, j, 0) + groupe_moyen_f.addElement(quad) + + quad = croix.getQuadIJ(hexablock.CYL_SMALL, i, j, 0) + groupe_petit_a.addElement(quad) + + quad = croix.getQuadIJ(hexablock.CYL_SMALL, i, j, hexablock.CYL_SMALL_SLICES) + groupe_petit_b.addElement(quad) + +# Définir 3 groupes de volumes +# ---------------------------- + +groupe_grand = doc.addHexaGroup("Grand") +groupe_moyen = doc.addHexaGroup("Moyen") +groupe_petit = doc.addHexaGroup("Petit") + +for i in xrange( doc.countUsedHexa() ): + h = doc.getUsedHexa(i) + groupe_moyen.addElement(h) + +for i in xrange(2): + for j in xrange( [hexablock.CV_MAXI_INT, hexablock.CV_MAXI_EXT][i] ): + for k in [ 0, hexablock.CYL_BIG_SLICES-1 ]: + h = en_te.getHexaIJK(hexablock.CYL_BIG, i, j, k) + groupe_grand.addElement(h) + groupe_moyen.removeElement(h) + + for k in [0, hexablock.CYL_SMALL_SLICES-1 ]: + h = croix.getHexaIJK(hexablock.CYL_SMALL, i, j, k) + groupe_petit.addElement(h) + groupe_moyen.removeElement(h) + +# Mailler le modèle de bloc avec association +# ------------------------------------------ + +hexablock.addLaws(doc, 10, True) + +blocs = hexablock.mesh(doc) + +muv, mue, muq, muh = hexablock.dump(doc, blocs) diff --git a/src/TEST_PY/recettes/tuyau.brep b/src/TEST_PY/recettes/tuyau.brep new file mode 100755 index 0000000..ec768b0 --- /dev/null +++ b/src/TEST_PY/recettes/tuyau.brep @@ -0,0 +1,426 @@ +DBRep_DrawableShape + +CASCADE Topology V1, (c) Matra-Datavision +Locations 0 +Curve2ds 28 +1 0 0 0 1 +1 0 0 0 1 +1 0 0 1 0 +3 5.0000000000000009 0 -1 -0 -0 1 5 2 +1 3.1415926535897931 0 0 1 +1 3.1415926535897931 0 0 1 +1 0 1 1 0 +2 0 -4.5 -6.123233995736766e-17 1 1 6.123233995736766e-17 4.5 +3 5.0000000000000009 0 -1 -0 -0 1 5 2 +2 0 -4.5 -6.123233995736766e-17 1 1 6.123233995736766e-17 4.5 +1 0 0 1 0 +1 0 0 1 0 +1 0 0 1 0 +3 5.0000000000000009 0 -1 -0 -0 1 4 1.6000000000000001 +1 10.000000000000002 2.4492935982947064e-16 -1 -4.8985871965894112e-17 +1 10.000000000000002 2.4492935982947064e-16 -1 -4.8985871965894112e-17 +1 0 0 0 1 +1 0 0 0 1 +1 3.1415926535897931 0 0 1 +1 3.1415926535897931 0 0 1 +1 0 1 1 0 +2 0 -4.5 -6.123233995736766e-17 1 1 6.123233995736766e-17 3.6000000000000001 +3 5.0000000000000009 0 -1 -0 -0 1 4 1.6000000000000001 +2 0 -4.5 -6.123233995736766e-17 1 1 6.123233995736766e-17 3.6000000000000001 +1 0 -0 6.1232339957367759e-17 -1 +1 0 -0 6.1232339957367759e-17 -1 +1 1.1021821192326179e-15 -9 -1.8369701987210317e-16 1 +1 1.1021821192326179e-15 -9 -1.8369701987210317e-16 1 +Curves 16 +7 1 0 7 8 2 3.5355339059327386 -3.5355339059327386 4.4408920985006262e-16 1 9.6048855423786907 5.6779402750195374 -5.742238377723344e-16 0.99999999999999989 18.214762018199355 14.344823330601708 -3.1843740466902976e-15 1.0000000000000058 31.904943295729403 14.237869646355081 1.2028108957336017e-14 0.99999999999998868 37.172160522651843 17.64988141136174 -8.7773709183773399e-15 1.0000000000000071 52.812746249130484 14.81612372870539 2.3298725788871153e-15 0.99999999999999833 63.447227270624914 15.5 0 1 75 15.5 0 1 + 0 8 1 8 +7 0 0 10 11 2 3.5355339059327386 -3.5355339059327386 4.4408920985006262e-16 3.5355339059328195 -3.5355339059328195 -0.62831853071801369 3.1478202812511471 -3.1478202812511471 -1.2566370068591419 2.3723834259365431 -2.3723834259365431 -1.7988274783398068 1.2775986014269276 -1.2775986014269276 -2.1687580291315651 1.1719514247943195e-12 -1.1719514247943195e-12 -2.3005529012372383 -1.2775986014289811 1.2775986014289811 -2.1687580291316819 -2.3723834259351833 2.3723834259351833 -1.7988274783396521 -3.1478202812517777 3.1478202812517777 -1.256637006859245 -3.5355339059326556 3.5355339059326556 -0.62831853071798205 -3.5355339059327386 3.5355339059327386 2.2204460492503131e-16 + 0 11 3.1415926535897931 11 +7 1 0 7 8 2 -3.5355339059327386 3.5355339059327386 2.2204460492503131e-16 1 3.5505706064268643 12.92839695201633 -1.5975347728255742e-15 0.99999999999999989 14.233536249242547 23.186298181990903 -5.559004606855246e-15 1.0000000000000058 28.117657554132329 15.130373948082415 1.4762487599297348e-14 0.99999999999998868 41.978695964977959 33.453377516518131 -1.3515968997086305e-14 1.0000000000000071 51.368462505527539 21.938158843438853 1.6901778625232096e-15 0.99999999999999833 63.447227270624914 24.500000000000004 -1.5086264655892687e-15 1 75.000000000000014 24.5 -1.5086264655892687e-15 1 + 0 8 1 8 +7 0 0 10 11 2 75 15.5 0 74.999999999999105 15.49999999999994 -1.4137166941154202 75.000000000003425 15.993478879707238 -2.8274332654334842 74.999999999990621 16.98044886550209 -4.0473618262637086 75.000000000018389 18.373882457535071 -4.8797055655472787 74.999999999974861 19.999999999996184 -5.1762440277824107 75.00000000002386 21.626117542471153 -4.879705565547396 74.999999999984084 23.019551134494474 -4.047361826263554 75.000000000007219 24.006521120294067 -2.8274332654335823 74.999999999998124 24.499999999999748 -1.4137166941153954 75.000000000000014 24.5 -1.5086264655892687e-15 + 0 11 3.1415926535897931 11 +7 0 0 10 11 2 3.5355339059327386 -3.5355339059327386 -4.4408920985006262e-16 3.5355339059328195 -3.5355339059328195 0.62831853071801369 3.1478202812511471 -3.1478202812511471 1.2566370068591419 2.3723834259365431 -2.3723834259365431 1.7988274783398068 1.2775986014269276 -1.2775986014269276 2.1687580291315651 1.1719514247943195e-12 -1.1719514247943195e-12 2.3005529012372383 -1.2775986014289811 1.2775986014289811 2.1687580291316819 -2.3723834259351833 2.3723834259351833 1.7988274783396521 -3.1478202812517777 3.1478202812517777 1.256637006859245 -3.5355339059326556 3.5355339059326556 0.62831853071798205 -3.5355339059327386 3.5355339059327386 -2.2204460492503131e-16 + 0 11 3.1415926535897931 11 +7 0 0 10 11 2 75 15.5 0 74.999999999999105 15.49999999999994 1.4137166941154202 75.000000000003425 15.993478879707238 2.8274332654334842 74.999999999990621 16.98044886550209 4.0473618262637086 75.000000000018389 18.373882457535071 4.8797055655472787 74.999999999974861 19.999999999996184 5.1762440277824107 75.00000000002386 21.626117542471153 4.879705565547396 74.999999999984084 23.019551134494474 4.047361826263554 75.000000000007219 24.006521120294067 2.8274332654335823 74.999999999998124 24.499999999999748 1.4137166941153954 75.000000000000014 24.5 1.5086264655892687e-15 + 0 11 3.1415926535897931 11 +1 3.5355339059327378 -3.5355339059327378 0 -0.70710678118654757 0.70710678118654757 0 +7 0 0 10 11 2 2.8284271247461912 -2.8284271247461912 4.4408920985006262e-16 2.8284271247462276 -2.8284271247462276 -0.50265482457439326 2.5182562250010312 -2.5182562250010312 -1.0053096054873778 1.8979067407489889 -1.8979067407489889 -1.4390619826717084 1.0220788811419279 -1.0220788811419279 -1.7350064233054643 4.6762593797211755e-13 -4.6762593797211755e-13 -1.8404423209895382 -1.0220788811427488 1.0220788811427488 -1.73500642330558 -1.8979067407484411 1.8979067407484411 -1.4390619826715594 -2.5182562250012874 2.5182562250012874 -1.0053096054874726 -2.8284271247461601 2.8284271247461601 -0.50265482457436672 -2.8284271247461903 2.8284271247461903 2.2204460492503131e-16 + 0 11 3.1415926535897931 11 +1 -3.5355339059327378 3.5355339059327378 -2.4492935982947064e-16 0.70710678118654757 -0.70710678118654757 4.8985871965894125e-17 +7 1 0 7 8 2 2.8284271247461912 -2.8284271247461912 4.4408920985006262e-16 1 9.0159805468327825 6.4281751612018496 2.0133058846416192e-16 1 17.777778499972118 15.165580394866463 -8.0236115873956118e-16 0.99999999999998979 31.571168515292573 14.409868988290894 5.8731757129539919e-15 1.0000000000000278 37.64839458161984 19.182925960538899 -3.5800583136374853e-15 0.99999999999997424 52.67616934408646 15.539676739546138 1.5172914623676952e-15 1.0000000000000095 63.449895514329839 16.399999999999999 4.4408920985006262e-16 1 75 16.399999999999999 4.4408920985006262e-16 1 + 0 8 1 8 +7 1 0 7 8 2 -2.8284271247461903 2.8284271247461903 2.2204460492503131e-16 1 4.1746945180469197 12.228938087750445 -4.3498515050138725e-16 1 14.587149100985133 22.237911020917949 -1.2111033831702273e-15 0.99999999999998979 28.549479609839526 15.123956971356947 2.3425383791132212e-15 1.0000000000000278 41.490579147983965 31.827861148346255 -1.0269151715707795e-15 0.99999999999997424 51.521030626222753 21.236230289860686 5.1873396212586411e-16 1.0000000000000095 63.449895514329832 23.600000000000001 2.141842990487521e-16 1 75.000000000000014 23.600000000000001 2.1418429904875208e-16 1 + 0 8 1 8 +7 0 0 10 11 2 75 16.399999999999999 4.4408920985006262e-16 74.999999999999105 16.399999999999604 -1.1309733552923305 75.000000000003425 16.79478310376723 -2.2619466123468186 74.999999999990621 17.584359092398095 -3.2378894610108695 75.000000000018389 18.699105966034271 -3.9037644524379904 74.999999999974861 19.999999999989107 -4.1409952222257402 75.00000000002386 21.300894033984143 -3.9037644524380775 74.999999999984084 22.415640907590802 -3.2378894610107412 75.000000000007219 23.205216896237388 -2.261946612346911 74.999999999998124 23.599999999999262 -1.1309733552923047 75.000000000000014 23.600000000000001 2.1418429904875208e-16 + 0 11 3.1415926535897931 11 +7 0 0 10 11 2 2.8284271247461912 -2.8284271247461912 -4.4408920985006262e-16 2.8284271247462276 -2.8284271247462276 0.50265482457439326 2.5182562250010312 -2.5182562250010312 1.0053096054873778 1.8979067407489889 -1.8979067407489889 1.4390619826717084 1.0220788811419279 -1.0220788811419279 1.7350064233054643 4.6762593797211755e-13 -4.6762593797211755e-13 1.8404423209895382 -1.0220788811427488 1.0220788811427488 1.73500642330558 -1.8979067407484411 1.8979067407484411 1.4390619826715594 -2.5182562250012874 2.5182562250012874 1.0053096054874726 -2.8284271247461601 2.8284271247461601 0.50265482457436672 -2.8284271247461903 2.8284271247461903 -2.2204460492503131e-16 + 0 11 3.1415926535897931 11 +7 0 0 10 11 2 75 16.399999999999999 -4.4408920985006262e-16 74.999999999999105 16.399999999999604 1.1309733552923305 75.000000000003425 16.79478310376723 2.2619466123468186 74.999999999990621 17.584359092398095 3.2378894610108695 75.000000000018389 18.699105966034271 3.9037644524379904 74.999999999974861 19.999999999989107 4.1409952222257402 75.00000000002386 21.300894033984143 3.9037644524380775 74.999999999984084 22.415640907590802 3.2378894610107412 75.000000000007219 23.205216896237388 2.261946612346911 74.999999999998124 23.599999999999262 1.1309733552923047 75.000000000000014 23.600000000000001 -2.1418429904875208e-16 + 0 11 3.1415926535897931 11 +1 75 15.5 2.7554552980815448e-16 0 1 -6.1232339957367759e-17 +1 75 24.5 -8.2663658942446333e-16 0 -1 1.8369701987210317e-16 +Polygon3D 0 +PolygonOnTriangulations 0 +Surfaces 8 +9 1 0 0 0 10 7 11 8 2 2 3.5355339059327386 -3.5355339059327386 4.4408920985006262e-16 1 9.6048855423786907 5.6779402750195374 -5.742238377723344e-16 0.99999999999999989 18.214762018199355 14.344823330601708 -3.1843740466902976e-15 1.0000000000000058 31.904943295729403 14.237869646355081 1.2028108957336017e-14 0.99999999999998868 37.172160522651843 17.64988141136174 -8.7773709183773399e-15 1.0000000000000071 52.812746249130484 14.81612372870539 2.3298725788871153e-15 0.99999999999999833 63.447227270624914 15.5 0 1 75 15.5 0 1 +3.5355339059328195 -3.5355339059328195 -0.62831853071801369 1 9.604885542379284 5.6779402750195667 -0.73164124169730604 0.99999999999999989 18.214762018200037 14.344823330601164 -1.0469888149911395 1.0000000000000058 31.904943295730241 14.237869646359984 -0.39948502431303995 0.99999999999998868 37.172160522650039 17.649881411357878 -2.4092611365725189 1.0000000000000071 52.812746249132488 14.816123728706323 -1.1284938924273324 0.99999999999999833 63.447227270625511 15.499999999999938 -1.4137166941154204 1 74.999999999999105 15.49999999999994 -1.4137166941154202 1 +3.1478202812511471 -3.1478202812511471 -1.2566370068591419 1 9.2729214810444986 6.0754899681670214 -1.463282419842884 0.99999999999999989 17.996467481271083 14.829610120007128 -2.0939775390394035 1.0000000000000058 31.697282681850869 14.286806537772526 -0.79897001392370559 0.99999999999998868 37.435707603251764 18.516402695092999 -4.8185220638754691 1.0000000000000071 52.733554746481623 15.206631940884614 -2.2569876868315566 0.99999999999999833 63.447227270622655 15.993478879707236 -2.8274332654334846 1 75.000000000003425 15.993478879707238 -2.8274332654334842 1 +2.3723834259365431 -2.3723834259365431 -1.7988274783398068 1 8.6089851336806884 6.8705992041127821 -2.0946324284719631 0.99999999999999989 17.559872998990649 15.799195709829741 -2.9974482015801436 1.0000000000000058 31.28195630911361 14.384681533173158 -1.1436948041305759 0.99999999999998868 37.962808294048074 20.249466731308765 -6.897528758237212 1.0000000000000071 52.575169779178417 15.987658040456525 -3.2307909501209608 0.99999999999999833 63.447227270628531 16.98044886550209 -4.0473618262637086 1 74.999999999990621 16.98044886550209 -4.0473618262637086 1 +1.2775986014269276 -1.2775986014269276 -2.1687580291315651 1 7.6716200438365361 7.9931580809223801 -2.5253955435015549 0.99999999999999989 16.943475918531011 17.168085494405027 -3.6138762234641644 1.0000000000000058 30.695586178585053 14.522864363617154 -1.3788967086524706 0.99999999999998868 38.706984732566291 22.696258103010518 -8.3160119887771682 1.0000000000000071 52.351557169731038 17.090333926265838 -3.8952061261517525 0.99999999999999833 63.447227270621916 18.373882457535071 -4.8797055655472787 1 75.000000000018389 18.373882457535071 -4.8797055655472787 1 +1.1719514247943195e-12 -1.1719514247943195e-12 -2.3005529012372383 1 6.5777280744114703 9.3031686135167266 -2.6788631863653043 0.99999999999999989 16.224149133738432 18.76556075628185 -3.8334905595379762 1.0000000000000058 30.011300424905656 14.684121797300168 -1.462691909845385 0.99999999999998868 39.575428243818408 25.551629463869848 -8.8213739156197359 1.0000000000000071 52.09060437734513 18.377141286086164 -4.1319168086379028 0.99999999999999833 63.447227270625667 19.999999999996184 -5.1762440277824107 1 74.999999999974861 19.999999999996184 -5.1762440277824107 1 +-1.2775986014289811 1.2775986014289811 -2.1687580291316819 1 5.4838361049540145 10.613179146115629 -2.5253955435017352 0.99999999999999989 15.504822348881138 20.363036018212849 -3.613876223464215 1.0000000000000058 29.327014671318086 14.845379230678686 -1.3788967086533002 0.99999999999998868 40.443871755058836 28.407000824990529 -8.3160119887766726 1.0000000000000071 51.829651584897462 19.663948645853612 -3.8952061261520572 0.99999999999999833 63.447227270625788 21.626117542471153 -4.879705565547396 1 75.00000000002386 21.626117542471153 -4.879705565547396 1 +-2.3723834259351833 2.3723834259351833 -1.7988274783396521 1 4.5464710151344043 11.735738022921637 -2.0946324284717539 0.99999999999999989 14.888425268470534 21.73192580274673 -2.9974482015801169 1.0000000000000058 28.740644540721632 14.983562061355201 -1.1436948041293928 0.99999999999998868 41.188048193587157 30.853792196494638 -6.8975287582379137 1.0000000000000071 51.606038975498372 20.766624531703982 -3.2307909501205487 0.99999999999999833 63.447227270623706 23.019551134494478 -4.047361826263554 1 74.999999999984084 23.019551134494474 -4.047361826263554 1 +-3.1478202812517777 3.1478202812517777 -1.256637006859245 1 3.8825346677568429 12.530847258869537 -1.4632824198430057 0.99999999999999989 14.451830786163059 22.701511392593083 -2.093977539039428 1.0000000000000058 28.32531816801977 15.081437056623322 -0.79897001392448364 0.99999999999998868 41.715148884378252 32.586856232821489 -4.8185220638750348 1.0000000000000071 51.447654008166793 21.547650631251887 -2.2569876868317986 0.99999999999999833 63.447227270625731 24.006521120294064 -2.8274332654335819 1 75.000000000007219 24.006521120294067 -2.8274332654335823 1 +-3.5355339059326556 3.5355339059326556 -0.62831853071798205 1 3.5505706064273257 12.928396952016087 -0.73164124169727363 0.99999999999999989 14.233536249244064 23.186298181990281 -1.0469888149911422 1.0000000000000058 28.117657554128364 15.130373948086152 -0.39948502431278238 0.99999999999998868 41.978695964980815 33.453377516515026 -2.4092611365726784 1.0000000000000071 51.368462505527397 21.938158843439282 -1.1284938924272563 0.99999999999999833 63.447227270624651 24.499999999999744 -1.4137166941153956 1 74.999999999998124 24.499999999999748 -1.4137166941153954 1 +-3.5355339059327386 3.5355339059327386 2.2204460492503131e-16 1 3.5505706064268643 12.92839695201633 -1.5975347728255742e-15 0.99999999999999989 14.233536249242547 23.186298181990903 -5.559004606855246e-15 1.0000000000000058 28.117657554132329 15.130373948082415 1.4762487599297348e-14 0.99999999999998868 41.978695964977959 33.453377516518131 -1.3515968997086305e-14 1.0000000000000071 51.368462505527539 21.938158843438853 1.6901778625232096e-15 0.99999999999999833 63.447227270624914 24.500000000000004 -1.5086264655892687e-15 1 75.000000000000014 24.5 -1.5086264655892687e-15 1 + +0 11 +3.1415926535897931 11 + +0 8 +1 8 + +9 1 0 0 0 10 7 11 8 2 2 3.5355339059327386 -3.5355339059327386 -4.4408920985006262e-16 1 9.6048855423786907 5.6779402750195374 5.742238377723344e-16 0.99999999999999989 18.214762018199355 14.344823330601708 3.1843740466902976e-15 1.0000000000000058 31.904943295729403 14.237869646355081 -1.2028108957336017e-14 0.99999999999998868 37.172160522651843 17.64988141136174 8.7773709183773399e-15 1.0000000000000071 52.812746249130484 14.81612372870539 -2.3298725788871153e-15 0.99999999999999833 63.447227270624914 15.5 0 1 75 15.5 0 1 +3.5355339059328195 -3.5355339059328195 0.62831853071801369 1 9.604885542379284 5.6779402750195667 0.73164124169730604 0.99999999999999989 18.214762018200037 14.344823330601164 1.0469888149911395 1.0000000000000058 31.904943295730241 14.237869646359984 0.39948502431303995 0.99999999999998868 37.172160522650039 17.649881411357878 2.4092611365725189 1.0000000000000071 52.812746249132488 14.816123728706323 1.1284938924273324 0.99999999999999833 63.447227270625511 15.499999999999938 1.4137166941154204 1 74.999999999999105 15.49999999999994 1.4137166941154202 1 +3.1478202812511471 -3.1478202812511471 1.2566370068591419 1 9.2729214810444986 6.0754899681670214 1.463282419842884 0.99999999999999989 17.996467481271083 14.829610120007128 2.0939775390394035 1.0000000000000058 31.697282681850869 14.286806537772526 0.79897001392370559 0.99999999999998868 37.435707603251764 18.516402695092999 4.8185220638754691 1.0000000000000071 52.733554746481623 15.206631940884614 2.2569876868315566 0.99999999999999833 63.447227270622655 15.993478879707236 2.8274332654334846 1 75.000000000003425 15.993478879707238 2.8274332654334842 1 +2.3723834259365431 -2.3723834259365431 1.7988274783398068 1 8.6089851336806884 6.8705992041127821 2.0946324284719631 0.99999999999999989 17.559872998990649 15.799195709829741 2.9974482015801436 1.0000000000000058 31.28195630911361 14.384681533173158 1.1436948041305759 0.99999999999998868 37.962808294048074 20.249466731308765 6.897528758237212 1.0000000000000071 52.575169779178417 15.987658040456525 3.2307909501209608 0.99999999999999833 63.447227270628531 16.98044886550209 4.0473618262637086 1 74.999999999990621 16.98044886550209 4.0473618262637086 1 +1.2775986014269276 -1.2775986014269276 2.1687580291315651 1 7.6716200438365361 7.9931580809223801 2.5253955435015549 0.99999999999999989 16.943475918531011 17.168085494405027 3.6138762234641644 1.0000000000000058 30.695586178585053 14.522864363617154 1.3788967086524706 0.99999999999998868 38.706984732566291 22.696258103010518 8.3160119887771682 1.0000000000000071 52.351557169731038 17.090333926265838 3.8952061261517525 0.99999999999999833 63.447227270621916 18.373882457535071 4.8797055655472787 1 75.000000000018389 18.373882457535071 4.8797055655472787 1 +1.1719514247943195e-12 -1.1719514247943195e-12 2.3005529012372383 1 6.5777280744114703 9.3031686135167266 2.6788631863653043 0.99999999999999989 16.224149133738432 18.76556075628185 3.8334905595379762 1.0000000000000058 30.011300424905656 14.684121797300168 1.462691909845385 0.99999999999998868 39.575428243818408 25.551629463869848 8.8213739156197359 1.0000000000000071 52.09060437734513 18.377141286086164 4.1319168086379028 0.99999999999999833 63.447227270625667 19.999999999996184 5.1762440277824107 1 74.999999999974861 19.999999999996184 5.1762440277824107 1 +-1.2775986014289811 1.2775986014289811 2.1687580291316819 1 5.4838361049540145 10.613179146115629 2.5253955435017352 0.99999999999999989 15.504822348881138 20.363036018212849 3.613876223464215 1.0000000000000058 29.327014671318086 14.845379230678686 1.3788967086533002 0.99999999999998868 40.443871755058836 28.407000824990529 8.3160119887766726 1.0000000000000071 51.829651584897462 19.663948645853612 3.8952061261520572 0.99999999999999833 63.447227270625788 21.626117542471153 4.879705565547396 1 75.00000000002386 21.626117542471153 4.879705565547396 1 +-2.3723834259351833 2.3723834259351833 1.7988274783396521 1 4.5464710151344043 11.735738022921637 2.0946324284717539 0.99999999999999989 14.888425268470534 21.73192580274673 2.9974482015801169 1.0000000000000058 28.740644540721632 14.983562061355201 1.1436948041293928 0.99999999999998868 41.188048193587157 30.853792196494638 6.8975287582379137 1.0000000000000071 51.606038975498372 20.766624531703982 3.2307909501205487 0.99999999999999833 63.447227270623706 23.019551134494478 4.047361826263554 1 74.999999999984084 23.019551134494474 4.047361826263554 1 +-3.1478202812517777 3.1478202812517777 1.256637006859245 1 3.8825346677568429 12.530847258869537 1.4632824198430057 0.99999999999999989 14.451830786163059 22.701511392593083 2.093977539039428 1.0000000000000058 28.32531816801977 15.081437056623322 0.79897001392448364 0.99999999999998868 41.715148884378252 32.586856232821489 4.8185220638750348 1.0000000000000071 51.447654008166793 21.547650631251887 2.2569876868317986 0.99999999999999833 63.447227270625731 24.006521120294064 2.8274332654335819 1 75.000000000007219 24.006521120294067 2.8274332654335823 1 +-3.5355339059326556 3.5355339059326556 0.62831853071798205 1 3.5505706064273257 12.928396952016087 0.73164124169727363 0.99999999999999989 14.233536249244064 23.186298181990281 1.0469888149911422 1.0000000000000058 28.117657554128364 15.130373948086152 0.39948502431278238 0.99999999999998868 41.978695964980815 33.453377516515026 2.4092611365726784 1.0000000000000071 51.368462505527397 21.938158843439282 1.1284938924272563 0.99999999999999833 63.447227270624651 24.499999999999744 1.4137166941153956 1 74.999999999998124 24.499999999999748 1.4137166941153954 1 +-3.5355339059327386 3.5355339059327386 -2.2204460492503131e-16 1 3.5505706064268643 12.92839695201633 1.5975347728255742e-15 0.99999999999999989 14.233536249242547 23.186298181990903 5.559004606855246e-15 1.0000000000000058 28.117657554132329 15.130373948082415 -1.4762487599297348e-14 0.99999999999998868 41.978695964977959 33.453377516518131 1.3515968997086305e-14 1.0000000000000071 51.368462505527539 21.938158843438853 -1.6901778625232096e-15 0.99999999999999833 63.447227270624914 24.500000000000004 1.5086264655892687e-15 1 75.000000000000014 24.5 1.5086264655892687e-15 1 + +0 11 +3.1415926535897931 11 + +0 8 +1 8 + +1 3.5355339059327378 -3.5355339059327378 0 -0.70710678118654746 -0.70710678118654746 0 -0.70710678118654757 0.70710678118654757 0 -0 0 -1 +1 75 15.5 2.7554552980815448e-16 -1 0 0 0 0 -1 -0 -1 -0 +1 3.5355339059327378 -3.5355339059327378 0 -0.70710678118654757 -0.70710678118654757 -0 -0.70710678118654757 0.70710678118654757 -0 -0 0 1 +1 75 15.5 -2.7554552980815448e-16 -1 -0 -0 -0 -0 1 -0 -1 0 +9 1 0 0 0 10 7 11 8 2 2 2.8284271247461912 -2.8284271247461912 4.4408920985006262e-16 1 9.0159805468327825 6.4281751612018496 2.0133058846416192e-16 1 17.777778499972118 15.165580394866463 -8.0236115873956118e-16 0.99999999999998979 31.571168515292573 14.409868988290894 5.8731757129539919e-15 1.0000000000000278 37.64839458161984 19.182925960538899 -3.5800583136374853e-15 0.99999999999997424 52.67616934408646 15.539676739546138 1.5172914623676952e-15 1.0000000000000095 63.449895514329839 16.399999999999999 4.4408920985006262e-16 1 75 16.399999999999999 4.4408920985006262e-16 1 +2.8284271247462276 -2.8284271247462276 -0.50265482457439326 1 9.0159805468328216 6.4281751612018621 -0.58553428033384047 1 17.777778499971209 15.165580394865655 -0.83702922341251151 0.99999999999998979 31.571168515297988 14.409868988295917 -0.32030380321158969 1.0000000000000278 37.648394581614838 19.182925960534281 -1.9273256235209786 0.99999999999997424 52.676169344089331 15.539676739546854 -0.90272885493142008 1.0000000000000095 63.449895514330436 16.399999999999601 -1.1309733552923305 1 74.999999999999105 16.399999999999604 -1.1309733552923305 1 +2.5182562250010312 -2.5182562250010312 -1.0053096054873778 1 8.7505280572964637 6.7462367156950842 -1.1710685098071594 1 17.602833142044837 15.553363260898562 -1.674058374119779 0.99999999999998979 31.405486331285697 14.449023136926375 -0.64060757859783735 1.0000000000000278 37.85906535224138 19.876260232829232 -3.8546510796345723 0.99999999999997424 52.612831948476334 15.852024391121061 -1.8054576314498902 1.0000000000000095 63.449895514327579 16.79478310376723 -2.2619466123468186 1 75.000000000003425 16.79478310376723 -2.2619466123468186 1 +1.8979067407489889 -1.8979067407489889 -1.4390619826717084 1 8.2196165014000666 7.3823677049416423 -1.676339470317372 1 17.252938091745996 16.328938600612986 -2.3963500893836529 0.99999999999998979 31.074117858447767 14.527332404383019 -0.91700507699040601 1.0000000000000278 38.280412112952412 21.262945955287442 -5.5177845659494009 0.99999999999997424 52.486155588068115 16.476727432979835 -2.5844430656618647 1.0000000000000095 63.449895514333448 17.584359092398095 -3.2378894610108699 1 74.999999999990621 17.584359092398095 -3.2378894610108695 1 +1.0220788811419279 -1.0220788811419279 -1.7350064233054643 1 7.4700597701643572 8.2804763628600888 -2.021080247871553 1 16.758945849069651 17.423918941557226 -2.8891617231474176 0.99999999999998979 30.606281988837953 14.637891757957481 -1.1055880274247882 1.0000000000000278 38.875282006554237 23.220710117598962 -6.6525221148448219 0.99999999999997424 52.307310133244791 17.358701774719187 -3.1159361956481719 1.0000000000000095 63.44989551432684 18.699105966034271 -3.9037644524379909 1 75.000000000018389 18.699105966034271 -3.9037644524379904 1 +4.6762593797211755e-13 -4.6762593797211755e-13 -1.8404423209895382 1 6.5953375324381369 9.3285566244738707 -2.1439007788875823 1 16.182463800463946 18.701745707871858 -3.064735343935824 0.99999999999998979 30.060324062636926 14.76691297991343 -1.1727743297930939 1.0000000000000278 39.569486864737151 25.505393554351894 -7.0567941864600172 0.99999999999997424 52.098599985188997 18.387953514714269 -3.3052908432768442 1.0000000000000095 63.449895514330578 19.999999999989107 -4.1409952222257402 1 74.999999999974861 19.999999999989107 -4.1409952222257402 1 +-1.0220788811427488 1.0220788811427488 -1.73500642330558 1 5.7206152947181215 10.376636886096147 -2.0210802478716676 1 15.605981751912061 19.97957247426147 -2.8891617231474713 0.99999999999998979 29.514366136174079 14.895934201537747 -1.1055880274253354 1.0000000000000278 40.26369172315826 27.790076991440177 -6.6525221148445537 0.99999999999997424 51.889889837005235 19.417205254669291 -3.1159361956483513 1.0000000000000095 63.449895514330713 21.300894033984143 -3.9037644524380779 1 75.00000000002386 21.300894033984143 -3.9037644524380775 1 +-1.8979067407484411 1.8979067407484411 -1.4390619826715594 1 4.9710585634781923 11.274745544008159 -1.6763394703172221 1 15.111989509197203 21.074552815149307 -2.3963500893835668 0.99999999999998979 29.04653026675712 15.006493555362955 -0.91700507698972389 1.0000000000000278 40.858561616586826 29.747841153500076 -5.5177845659496922 0.99999999999997424 51.711044382278359 20.299179596439458 -2.584443065661632 1.0000000000000095 63.449895514328631 22.415640907590799 -3.2378894610107416 1 74.999999999984084 22.415640907590802 -3.2378894610107412 1 +-2.5182562250012874 2.5182562250012874 -1.0053096054874726 1 4.4401470075837057 11.910876533258277 -1.1710685098072586 1 14.762094458918183 21.850128154895057 -1.6740583741198436 0.99999999999998979 28.715161793814971 15.084802822679471 -0.6406075785982992 1.0000000000000278 41.279908377390043 31.134526876097311 -3.8546510796343862 0.99999999999997424 51.584368021816545 20.92388263828046 -1.8054576314500514 1.0000000000000095 63.449895514330656 23.205216896237385 -2.261946612346911 1 75.000000000007219 23.205216896237388 -2.261946612346911 1 +-2.8284271247461601 2.8284271247461601 -0.50265482457436672 1 4.1746945180467883 12.228938087750157 -0.58553428033381372 1 14.587149100984806 22.237911020916648 -0.83702922341252328 0.99999999999998979 28.549479609841558 15.123956971361764 -0.3203038032113672 1.0000000000000278 41.490579147982118 31.82786114834126 -1.9273256235211105 0.99999999999997424 51.521030626224039 21.236230289861044 -0.90272885493134847 1.0000000000000095 63.449895514329569 23.599999999999262 -1.1309733552923047 1 74.999999999998124 23.599999999999262 -1.1309733552923047 1 +-2.8284271247461903 2.8284271247461903 2.2204460492503131e-16 1 4.1746945180469197 12.228938087750445 -4.3498515050138725e-16 1 14.587149100985133 22.237911020917949 -1.2111033831702273e-15 0.99999999999998979 28.549479609839526 15.123956971356947 2.3425383791132212e-15 1.0000000000000278 41.490579147983965 31.827861148346255 -1.0269151715707795e-15 0.99999999999997424 51.521030626222753 21.236230289860686 5.1873396212586411e-16 1.0000000000000095 63.449895514329832 23.600000000000001 2.141842990487521e-16 1 75.000000000000014 23.600000000000001 2.1418429904875208e-16 1 + +0 11 +3.1415926535897931 11 + +0 8 +1 8 + +9 1 0 0 0 10 7 11 8 2 2 2.8284271247461912 -2.8284271247461912 -4.4408920985006262e-16 1 9.0159805468327825 6.4281751612018496 -2.0133058846416192e-16 1 17.777778499972118 15.165580394866463 8.0236115873956118e-16 0.99999999999998979 31.571168515292573 14.409868988290894 -5.8731757129539919e-15 1.0000000000000278 37.64839458161984 19.182925960538899 3.5800583136374853e-15 0.99999999999997424 52.67616934408646 15.539676739546138 -1.5172914623676952e-15 1.0000000000000095 63.449895514329839 16.399999999999999 -4.4408920985006262e-16 1 75 16.399999999999999 -4.4408920985006262e-16 1 +2.8284271247462276 -2.8284271247462276 0.50265482457439326 1 9.0159805468328216 6.4281751612018621 0.58553428033384047 1 17.777778499971209 15.165580394865655 0.83702922341251151 0.99999999999998979 31.571168515297988 14.409868988295917 0.32030380321158969 1.0000000000000278 37.648394581614838 19.182925960534281 1.9273256235209786 0.99999999999997424 52.676169344089331 15.539676739546854 0.90272885493142008 1.0000000000000095 63.449895514330436 16.399999999999601 1.1309733552923305 1 74.999999999999105 16.399999999999604 1.1309733552923305 1 +2.5182562250010312 -2.5182562250010312 1.0053096054873778 1 8.7505280572964637 6.7462367156950842 1.1710685098071594 1 17.602833142044837 15.553363260898562 1.674058374119779 0.99999999999998979 31.405486331285697 14.449023136926375 0.64060757859783735 1.0000000000000278 37.85906535224138 19.876260232829232 3.8546510796345723 0.99999999999997424 52.612831948476334 15.852024391121061 1.8054576314498902 1.0000000000000095 63.449895514327579 16.79478310376723 2.2619466123468186 1 75.000000000003425 16.79478310376723 2.2619466123468186 1 +1.8979067407489889 -1.8979067407489889 1.4390619826717084 1 8.2196165014000666 7.3823677049416423 1.676339470317372 1 17.252938091745996 16.328938600612986 2.3963500893836529 0.99999999999998979 31.074117858447767 14.527332404383019 0.91700507699040601 1.0000000000000278 38.280412112952412 21.262945955287442 5.5177845659494009 0.99999999999997424 52.486155588068115 16.476727432979835 2.5844430656618647 1.0000000000000095 63.449895514333448 17.584359092398095 3.2378894610108699 1 74.999999999990621 17.584359092398095 3.2378894610108695 1 +1.0220788811419279 -1.0220788811419279 1.7350064233054643 1 7.4700597701643572 8.2804763628600888 2.021080247871553 1 16.758945849069651 17.423918941557226 2.8891617231474176 0.99999999999998979 30.606281988837953 14.637891757957481 1.1055880274247882 1.0000000000000278 38.875282006554237 23.220710117598962 6.6525221148448219 0.99999999999997424 52.307310133244791 17.358701774719187 3.1159361956481719 1.0000000000000095 63.44989551432684 18.699105966034271 3.9037644524379909 1 75.000000000018389 18.699105966034271 3.9037644524379904 1 +4.6762593797211755e-13 -4.6762593797211755e-13 1.8404423209895382 1 6.5953375324381369 9.3285566244738707 2.1439007788875823 1 16.182463800463946 18.701745707871858 3.064735343935824 0.99999999999998979 30.060324062636926 14.76691297991343 1.1727743297930939 1.0000000000000278 39.569486864737151 25.505393554351894 7.0567941864600172 0.99999999999997424 52.098599985188997 18.387953514714269 3.3052908432768442 1.0000000000000095 63.449895514330578 19.999999999989107 4.1409952222257402 1 74.999999999974861 19.999999999989107 4.1409952222257402 1 +-1.0220788811427488 1.0220788811427488 1.73500642330558 1 5.7206152947181215 10.376636886096147 2.0210802478716676 1 15.605981751912061 19.97957247426147 2.8891617231474713 0.99999999999998979 29.514366136174079 14.895934201537747 1.1055880274253354 1.0000000000000278 40.26369172315826 27.790076991440177 6.6525221148445537 0.99999999999997424 51.889889837005235 19.417205254669291 3.1159361956483513 1.0000000000000095 63.449895514330713 21.300894033984143 3.9037644524380779 1 75.00000000002386 21.300894033984143 3.9037644524380775 1 +-1.8979067407484411 1.8979067407484411 1.4390619826715594 1 4.9710585634781923 11.274745544008159 1.6763394703172221 1 15.111989509197203 21.074552815149307 2.3963500893835668 0.99999999999998979 29.04653026675712 15.006493555362955 0.91700507698972389 1.0000000000000278 40.858561616586826 29.747841153500076 5.5177845659496922 0.99999999999997424 51.711044382278359 20.299179596439458 2.584443065661632 1.0000000000000095 63.449895514328631 22.415640907590799 3.2378894610107416 1 74.999999999984084 22.415640907590802 3.2378894610107412 1 +-2.5182562250012874 2.5182562250012874 1.0053096054874726 1 4.4401470075837057 11.910876533258277 1.1710685098072586 1 14.762094458918183 21.850128154895057 1.6740583741198436 0.99999999999998979 28.715161793814971 15.084802822679471 0.6406075785982992 1.0000000000000278 41.279908377390043 31.134526876097311 3.8546510796343862 0.99999999999997424 51.584368021816545 20.92388263828046 1.8054576314500514 1.0000000000000095 63.449895514330656 23.205216896237385 2.261946612346911 1 75.000000000007219 23.205216896237388 2.261946612346911 1 +-2.8284271247461601 2.8284271247461601 0.50265482457436672 1 4.1746945180467883 12.228938087750157 0.58553428033381372 1 14.587149100984806 22.237911020916648 0.83702922341252328 0.99999999999998979 28.549479609841558 15.123956971361764 0.3203038032113672 1.0000000000000278 41.490579147982118 31.82786114834126 1.9273256235211105 0.99999999999997424 51.521030626224039 21.236230289861044 0.90272885493134847 1.0000000000000095 63.449895514329569 23.599999999999262 1.1309733552923047 1 74.999999999998124 23.599999999999262 1.1309733552923047 1 +-2.8284271247461903 2.8284271247461903 -2.2204460492503131e-16 1 4.1746945180469197 12.228938087750445 4.3498515050138725e-16 1 14.587149100985133 22.237911020917949 1.2111033831702273e-15 0.99999999999998979 28.549479609839526 15.123956971356947 -2.3425383791132212e-15 1.0000000000000278 41.490579147983965 31.827861148346255 1.0269151715707795e-15 0.99999999999997424 51.521030626222753 21.236230289860686 -5.1873396212586411e-16 1.0000000000000095 63.449895514329832 23.600000000000001 -2.141842990487521e-16 1 75.000000000000014 23.600000000000001 -2.1418429904875208e-16 1 + +0 11 +3.1415926535897931 11 + +0 8 +1 8 + +Triangulations 0 + +TShapes 42 +Ve +1.00000011584738e-07 +3.53553390593274 -3.53553390593274 0 +0 0 + +0101101 +* +Ve +2.00001022062862e-07 +75 15.5 -6.88863824520386e-17 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 1 0 0 1 +2 1 1 0 0 1 +2 2 2 0 0 1 +0 + +0101000 ++42 0 -41 0 * +Ve +2.00001005003195e-07 +-3.53553390593273 3.53553390593274 -7.40818758532816e-16 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 2 0 0 3.14159265358979 +2 3 1 0 0 3.14159265358979 +2 4 3 0 0 3.14159265358979 +0 + +0101000 ++42 0 -39 0 * +Ve +2.00001041588069e-07 +75 24.5 2.06659147356116e-16 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 3 0 0 1 +2 5 1 0 0 1 +2 6 2 0 0 1 +0 + +0101000 ++39 0 -37 0 * +Ed + 1e-07 1 1 0 +1 4 0 0 3.14159265358979 +2 7 1 0 0 3.14159265358979 +2 8 4 0 0 3.14159265358979 +0 + +0101000 ++41 0 -37 0 * +Wi + +0101000 +-40 0 +38 0 +36 0 -35 0 * +Fa +1 1e-07 1 0 + +0111000 ++34 0 * +Ed + 1e-07 1 1 0 +1 5 0 0 3.14159265358979 +2 3 2 0 0 3.14159265358979 +2 9 5 0 0 3.14159265358979 +0 + +0101000 ++42 0 -39 0 * +Ed + 1e-07 1 1 0 +1 6 0 0 3.14159265358979 +2 7 2 0 0 3.14159265358979 +2 10 6 0 0 3.14159265358979 +0 + +0101000 ++41 0 -37 0 * +Wi + +0101000 +-40 0 +32 0 +36 0 -31 0 * +Fa +1 1e-07 2 0 + +0111000 ++30 0 * +Ve +1.00000003092948e-07 +2.82842712474619 -2.82842712474619 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 7 0 0 1 +2 11 3 0 0 1 +2 12 5 0 0 1 +0 + +0101000 ++42 0 -28 0 * +Ve +2.000010012582e-07 +-2.82842712474619 2.82842712474619 9.68596121552874e-16 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 8 0 0 3.14159265358979 +2 13 7 0 0 3.14159265358979 +2 14 3 0 0 3.14159265358979 +0 + +0101000 ++28 0 -26 0 * +Ed + 1e-07 1 1 0 +1 9 0 0 1 +2 15 3 0 0 1 +2 16 5 0 0 1 +0 + +0101000 ++39 0 -26 0 * +Wi + +0101000 ++38 0 -27 0 -25 0 +24 0 * +Fa +0 1e-07 3 0 + +0111000 +-23 0 * +Ve +2.00001030198519e-07 +75 16.4 -5.51091059616309e-17 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 10 0 0 1 +2 17 7 0 0 1 +2 18 8 0 0 1 +0 + +0101000 ++28 0 -21 0 * +Ve +2.00001064344293e-07 +75 23.5999999999999 1.65327317884893e-16 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 11 0 0 1 +2 19 7 0 0 1 +2 20 8 0 0 1 +0 + +0101000 ++26 0 -19 0 * +Ed + 1e-07 1 1 0 +1 12 0 0 3.14159265358979 +2 21 7 0 0 3.14159265358979 +2 22 4 0 0 3.14159265358979 +0 + +0101000 ++21 0 -19 0 * +Wi + +0101000 +-20 0 +25 0 +18 0 -17 0 * +Fa +1 1e-07 7 0 + +0111000 ++16 0 * +Ed + 1e-07 1 1 0 +1 13 0 0 3.14159265358979 +2 13 8 0 0 3.14159265358979 +2 23 5 0 0 3.14159265358979 +0 + +0101000 ++28 0 -26 0 * +Ed + 1e-07 1 1 0 +1 14 0 0 3.14159265358979 +2 21 8 0 0 3.14159265358979 +2 24 6 0 0 3.14159265358979 +0 + +0101000 ++21 0 -19 0 * +Wi + +0101000 +-20 0 +14 0 +18 0 -13 0 * +Fa +1 1e-07 8 0 + +0111000 ++12 0 * +Wi + +0101000 ++32 0 -27 0 -14 0 +24 0 * +Fa +0 1e-07 5 0 + +0111000 +-10 0 * +Ed + 1e-07 1 1 0 +1 15 0 0 0.899999999999999 +2 25 4 0 0 0.899999999999999 +2 26 6 0 0 0.899999999999999 +0 + +0101000 ++41 0 -21 0 * +Ed + 1e-07 1 1 0 +1 16 0 0 0.899999999999999 +2 27 4 0 0 0.899999999999999 +2 28 6 0 0 0.899999999999999 +0 + +0101000 ++37 0 -19 0 * +Wi + +0101000 ++35 0 -8 0 -17 0 +7 0 * +Fa +0 1e-07 4 0 + +0111000 +-6 0 * +Wi + +0101000 ++31 0 -8 0 -13 0 +7 0 * +Fa +0 1e-07 6 0 + +0111000 +-4 0 * +Sh + +0101100 ++33 0 -29 0 +22 0 -15 0 +11 0 -9 0 -5 0 +3 0 * +So + +1100000 ++2 0 * + ++1 0 \ No newline at end of file diff --git a/src/TEST_PY/recettes/tuyau.py b/src/TEST_PY/recettes/tuyau.py new file mode 100644 index 0000000..697c44d --- /dev/null +++ b/src/TEST_PY/recettes/tuyau.py @@ -0,0 +1,220 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Francis KLOSS : 2012 : CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France +# ======================================================================================== + +import geompy +import hexablock + +# Charger la géométrie +# ==================== + +nom = "tuyau" + +geometrie = geompy.ImportBREP(nom+".brep") + +# Sélectionner des sous-parties de la géométrie +# --------------------------------------------- + +aretes = geompy.SubShapeAllSortedCentres(geometrie, geompy.ShapeType["EDGE"]) +faces = geompy.SubShapeAllSortedCentres(geometrie, geompy.ShapeType["FACE"]) + +arc_int_bas = aretes[12] +arc_int_haut = aretes[13] +arc_ext_bas = aretes[11] +arc_ext_haut = aretes[14] + +ell_int_bas = aretes[2] +ell_int_haut = aretes[3] +ell_ext_bas = aretes[1] +ell_ext_haut = aretes[4] + +gen_int_avan = aretes[8] +gen_int_arri = aretes[7] +gen_ext_avan = aretes[9] +gen_ext_arri = aretes[6] + +face_int_bas = faces[4] +face_int_haut = faces[5] +face_ext_bas = faces[2] +face_ext_haut = faces[3] + +# Construire le modèle de bloc +# ============================ + +doc = hexablock.addDocument(nom) + +# Définir le tuyau +# ---------------- + +base = doc.addVertex(0, 0, 0) + +direction = doc.addVector(1, 0, 0) + +tuyau = doc.addPipe(base, direction, 1, 2, 10) + +# Construire le modele de blocs du tuyau +# -------------------------------------- + +depart = doc.addVector(0, 1, 0) + +modele = doc.makePipe(tuyau, depart, 1, 4, 1) + +# Associer le modèle de bloc à la géométrie +# ========================================= + +doc.setShape(geometrie) + +# Associer les cercles +# -------------------- + +cer_int_dep = modele.getVertexIJK(0, 0, 0) +cer_ext_dep = modele.getVertexIJK(1, 0, 0) + +cer_int = [] +cer_ext = [] +for j in xrange(4): + a = modele.getEdgeJ(0, j, 0) + cer_int.append(a) + + a = modele.getEdgeJ(1, j, 0) + cer_ext.append(a) + +doc.associateClosedLine(cer_int_dep, cer_int[0], cer_int[1:], arc_int_haut, 1, True, [arc_int_bas]) +doc.associateClosedLine(cer_ext_dep, cer_ext[0], cer_ext[1:], arc_ext_haut, 1, True, [arc_ext_bas]) + +# Associer les ellipses +# --------------------- + +ell_int_dep = modele.getVertexIJK(0, 0, 1) +ell_ext_dep = modele.getVertexIJK(1, 0, 1) + +ell_int = [] +ell_ext = [] +for j in xrange(4): + a = modele.getEdgeJ(0, j, 1) + ell_int.append(a) + + a = modele.getEdgeJ(1, j, 1) + ell_ext.append(a) + +doc.associateClosedLine(ell_int_dep, ell_int[0], ell_int[1:], ell_int_haut, 1, True, [ell_int_bas]) +doc.associateClosedLine(ell_ext_dep, ell_ext[0], ell_ext[1:], ell_ext_haut, 1, True, [ell_ext_bas]) + +# Associer les génératrices +# ------------------------- + +def generatrice(face): + n = 10 + l = [] + for i in xrange(0, n+1): + v = float(i) / n + s = geompy.MakeVertexOnSurface(face, 0.5, v) + l.append(s) + + return geompy.MakeInterpol(l) + +gen_int_haut = generatrice(face_int_haut) +gen_ext_haut = generatrice(face_ext_haut) +gen_int_bas = generatrice(face_int_bas ) +gen_ext_bas = generatrice(face_ext_bas ) + +modele.getEdgeK(0, 0, 0).addAssociation(gen_int_arri, 0, 1) +modele.getEdgeK(1, 0, 0).addAssociation(gen_ext_arri, 0, 1) + +modele.getEdgeK(0, 1, 0).addAssociation(gen_int_haut, 0, 1) +modele.getEdgeK(1, 1, 0).addAssociation(gen_ext_haut, 0, 1) + +modele.getEdgeK(0, 2, 0).addAssociation(gen_int_avan, 0, 1) +modele.getEdgeK(1, 2, 0).addAssociation(gen_ext_avan, 0, 1) + +modele.getEdgeK(0, 3, 0).addAssociation(gen_int_bas , 0, 1) +modele.getEdgeK(1, 3, 0).addAssociation(gen_ext_bas , 0, 1) + +# Associer les faces courbées +# --------------------------- + +modele.getQuadJK(0, 0, 0).addAssociation(face_int_haut) +modele.getQuadJK(0, 1, 0).addAssociation(face_int_haut) +modele.getQuadJK(0, 2, 0).addAssociation(face_int_bas ) +modele.getQuadJK(0, 3, 0).addAssociation(face_int_bas ) + +modele.getQuadJK(1, 0, 0).addAssociation(face_ext_haut) +modele.getQuadJK(1, 1, 0).addAssociation(face_ext_haut) +modele.getQuadJK(1, 2, 0).addAssociation(face_ext_bas ) +modele.getQuadJK(1, 3, 0).addAssociation(face_ext_bas ) + +# Mailler le modèle de bloc +# ========================= + +# Définir 3 groupes d'arêtes +# -------------------------- + +groupe_cercles = doc.addEdgeGroup("Cercles") +groupe_ellipses = doc.addEdgeGroup("Ellipses") +groupe_generatrices = doc.addEdgeGroup("Generatrices") + +# Définir 4 groupes de faces +# -------------------------- + +groupe_couronne = doc.addQuadGroup("Couronne") +groupe_ovale = doc.addQuadGroup("Ovale") +groupe_interieur = doc.addQuadGroup("Interieur") +groupe_exterieur = doc.addQuadGroup("Exterieur") + +# Constituer les groupes d'arêtes +# ------------------------------- + +for i in xrange(2): + for j in xrange(4): + arete = modele.getEdgeJ(i, j, 0) + groupe_cercles.addElement(arete) + + arete = modele.getEdgeJ(i, j, 1) + groupe_ellipses.addElement(arete) + + arete = modele.getEdgeK(i, j, 0) + groupe_generatrices.addElement(arete) + +# Constituer les groupes de faces +# ------------------------------- + +for j in xrange(4): + quad = modele.getQuadIJ(0, j, 0) + groupe_couronne.addElement(quad) + + quad = modele.getQuadIJ(0, j, 1) + groupe_ovale.addElement(quad) + + quad = modele.getQuadJK(0, j, 0) + groupe_interieur.addElement(quad) + + quad = modele.getQuadJK(1, j, 0) + groupe_exterieur.addElement(quad) + +# Mailler le modèle de bloc avec ses associations +# ----------------------------------------------- + +hexablock.addLaws(doc, 0.7, True) + +blocs = hexablock.mesh(doc) + +muv, mue, muq, muh = hexablock.dump(doc, blocs) diff --git a/src/TEST_PY/recettes/tuyauterie.brep b/src/TEST_PY/recettes/tuyauterie.brep new file mode 100644 index 0000000..53a6f34 --- /dev/null +++ b/src/TEST_PY/recettes/tuyauterie.brep @@ -0,0 +1,453 @@ +DBRep_DrawableShape + +CASCADE Topology V1, (c) Matra-Datavision +Locations 4 +1 + 1 0 0 0 + 0 6.12303176911189e-17 1 -0.85 + -0 -1 6.12303176911189e-17 1.21 +1 + 1 0 0 0 + 0 1 0 2.12454146990217e-33 + 0 0 1 0 +2 2 -1 0 +2 1 -1 0 +Curve2ds 27 +8 0.43213918000000001 1 +7 0 0 8 51 8 0 0.057974973048721644 0.12705880864579566 0.057974973048721644 0.2539099842133129 0.058013130412506338 0.38101230069303388 0.058089233425549794 0.50881796547781766 0.058198420448244463 0.63777598863543805 0.058331366209715796 0.76855845644261167 0.058475210008542951 0.90184942018581316 0.058615837878117798 1.1603908050731355 0.05884638987324451 1.2938176747842225 0.058948538655720792 1.4311004606033966 0.059021738930595521 1.5691233166566314 0.059047237213743158 1.7057690592490571 0.059020605651136274 1.8389589148738439 0.058951314768299831 1.9660231276101112 0.058857055675589999 2.2148472039649869 0.058640879645439452 2.3446449893022403 0.058505685282760289 2.4727406188615979 0.058365061973598448 2.600211396033747 0.058230468440909788 2.7281615831303947 0.058114429959556665 2.8571063406978521 0.058028511035228755 2.9876417533064217 0.05798151257195476 3.2513931986371576 0.057969441199952315 3.3824833645552261 0.058004543027713996 3.5120070075398977 0.058080567537812058 3.6404436556268354 0.058189616224845676 3.7681893264387893 0.058320246353094705 3.8962293587889607 0.058459849104145284 4.025543957259722 0.058596791916897768 4.2177432204344898 0.058772285524456916 4.2771752013433915 0.058822885772890257 4.3376970136244637 0.058869559552688105 4.3995970589881201 0.058911159682938724 4.4630557931214794 0.058946265905414678 4.5281769254055853 0.058973302284005512 4.5949867122135721 0.058990762130679684 4.7324259034809506 0.059004425343315611 4.8020866055298672 0.059000335265522237 4.8713223410804538 0.058984637227204054 4.9395411683433403 0.058958099820587605 5.0064238057271977 0.05892237221742435 5.0718805891607035 0.058879317071258007 5.1361123997452296 0.05883045495943378 5.3440326274238314 0.058654957382429693 5.4833041467557475 0.058509864415703855 5.6197124297447845 0.058358205361044836 5.7540109884226185 0.058216107335680979 5.8869916197472572 0.058098512546392499 6.0191579290315538 0.058016250758760046 6.1510326975834273 0.057974973048721644 6.2831853071795862 0.057974973048721644 + 0 9 0.16892038644087748 7 0.31746884501648859 7 0.49261453710585534 7 0.66792465932236034 7 0.74518911870768723 7 0.82315694109047421 7 1 9 +8 0.43213918000000001 1 +7 0 0 8 51 8 2.8046694147196725 1.02 2.8046694147196725 1.0213912939546714 2.8011845510548969 1.0227802996203506 2.7942354653450616 1.0241379265729234 2.7839013968400326 1.0254349604271367 2.7703349173982392 1.0266431582872593 2.7537177602174125 1.0277330463059269 2.7342864002988745 1.0286767812428046 2.6927352547334862 1.0301113321149289 2.6697527632440652 1.0306938080210208 2.6444873924783496 1.0310677074672538 2.6182882098630955 1.0311916223054141 2.5923953514458202 1.0310634969405577 2.5679301999656405 1.0307054881739262 2.5459402087482967 1.0301694383497306 2.5054575074320851 1.0288407275848013 2.4861726626550951 1.0279496064505724 2.46937130733009 1.0269140562461492 2.4552630924128249 1.0257488479109651 2.4441037478952703 1.0244736092007212 2.4362112430789074 1.0231095676972399 2.431915698688933 1.0216853889159643 2.430813020114603 1.0187980182107645 2.434021842821573 1.0173581233843794 2.4409228881612415 1.0159689014616622 2.4511885657293817 1.0146620388947645 2.4644938590098264 1.0134610113362843 2.4805517273753437 1.0123861271608721 2.4991235770257321 1.0114524146105124 2.5296149696364094 1.0103462092464146 2.5394210081235915 1.0100409510848061 2.5497426109398353 1.0097693958490934 2.5605999069330467 1.0095345759778975 2.5719903532561839 1.0093410062416865 2.5838848741973868 1.0091941462977709 2.5962230362528058 1.0090998249408509 2.6217012623105886 1.0090261204022954 2.634662693294922 1.0090483253525369 2.6475046399494779 1.0091324948761671 2.6600187323625426 1.0092754426083117 2.6720659258951187 1.0094713567959464 2.6835751502964555 1.0097139728150133 2.6945408548679346 1.0099985766824588 2.7287664580042592 1.0110647228661329 2.7496719308055635 1.012009078884508 2.7675835125941544 1.0131176172037806 2.7822241068458125 1.0143591469442126 2.7933883989530917 1.0157000849748916 2.8008995112046935 1.0171089226705528 2.8046694147196725 1.018552928924922 2.8046694147196725 1.02 + 0 9 0.16892038644087748 7 0.31746884501648859 7 0.49261453710585534 7 0.66792465932236034 7 0.74518911870768723 7 0.82315694109047421 7 1 9 +8 0 0.43213918000000001 +7 0 0 8 51 8 0 0.057974973048721644 0.12705880864579566 0.057974973048721644 0.2539099842133129 0.058013130412506338 0.38101230069303388 0.058089233425549794 0.50881796547781766 0.058198420448244463 0.63777598863543805 0.058331366209715796 0.76855845644261167 0.058475210008542951 0.90184942018581316 0.058615837878117798 1.1603908050731355 0.05884638987324451 1.2938176747842225 0.058948538655720792 1.4311004606033966 0.059021738930595521 1.5691233166566314 0.059047237213743158 1.7057690592490571 0.059020605651136274 1.8389589148738439 0.058951314768299831 1.9660231276101112 0.058857055675589999 2.2148472039649869 0.058640879645439452 2.3446449893022403 0.058505685282760289 2.4727406188615979 0.058365061973598448 2.600211396033747 0.058230468440909788 2.7281615831303947 0.058114429959556665 2.8571063406978521 0.058028511035228755 2.9876417533064217 0.05798151257195476 3.2513931986371576 0.057969441199952315 3.3824833645552261 0.058004543027713996 3.5120070075398977 0.058080567537812058 3.6404436556268354 0.058189616224845676 3.7681893264387893 0.058320246353094705 3.8962293587889607 0.058459849104145284 4.025543957259722 0.058596791916897768 4.2177432204344898 0.058772285524456916 4.2771752013433915 0.058822885772890257 4.3376970136244637 0.058869559552688105 4.3995970589881201 0.058911159682938724 4.4630557931214794 0.058946265905414678 4.5281769254055853 0.058973302284005512 4.5949867122135721 0.058990762130679684 4.7324259034809506 0.059004425343315611 4.8020866055298672 0.059000335265522237 4.8713223410804538 0.058984637227204054 4.9395411683433403 0.058958099820587605 5.0064238057271977 0.05892237221742435 5.0718805891607035 0.058879317071258007 5.1361123997452296 0.05883045495943378 5.3440326274238314 0.058654957382429693 5.4833041467557475 0.058509864415703855 5.6197124297447845 0.058358205361044836 5.7540109884226185 0.058216107335680979 5.8869916197472572 0.058098512546392499 6.0191579290315538 0.058016250758760046 6.1510326975834273 0.057974973048721644 6.2831853071795862 0.057974973048721644 + 0 9 0.16892038644087748 7 0.31746884501648859 7 0.49261453710585534 7 0.66792465932236034 7 0.74518911870768723 7 0.82315694109047421 7 1 9 +8 0 0.43213918000000001 +7 0 0 8 51 8 2.8046694147196725 1.02 2.8046694147196725 1.0213912939546714 2.8011845510548969 1.0227802996203506 2.7942354653450616 1.0241379265729234 2.7839013968400326 1.0254349604271367 2.7703349173982392 1.0266431582872593 2.7537177602174125 1.0277330463059269 2.7342864002988745 1.0286767812428046 2.6927352547334862 1.0301113321149289 2.6697527632440652 1.0306938080210208 2.6444873924783496 1.0310677074672538 2.6182882098630955 1.0311916223054141 2.5923953514458202 1.0310634969405577 2.5679301999656405 1.0307054881739262 2.5459402087482967 1.0301694383497306 2.5054575074320851 1.0288407275848013 2.4861726626550951 1.0279496064505724 2.46937130733009 1.0269140562461492 2.4552630924128249 1.0257488479109651 2.4441037478952703 1.0244736092007212 2.4362112430789074 1.0231095676972399 2.431915698688933 1.0216853889159643 2.430813020114603 1.0187980182107645 2.434021842821573 1.0173581233843794 2.4409228881612415 1.0159689014616622 2.4511885657293817 1.0146620388947645 2.4644938590098264 1.0134610113362843 2.4805517273753437 1.0123861271608721 2.4991235770257321 1.0114524146105124 2.5296149696364094 1.0103462092464146 2.5394210081235915 1.0100409510848061 2.5497426109398353 1.0097693958490934 2.5605999069330467 1.0095345759778975 2.5719903532561839 1.0093410062416865 2.5838848741973868 1.0091941462977709 2.5962230362528058 1.0090998249408509 2.6217012623105886 1.0090261204022954 2.634662693294922 1.0090483253525369 2.6475046399494779 1.0091324948761671 2.6600187323625426 1.0092754426083117 2.6720659258951187 1.0094713567959464 2.6835751502964555 1.0097139728150133 2.6945408548679346 1.0099985766824588 2.7287664580042592 1.0110647228661329 2.7496719308055635 1.012009078884508 2.7675835125941544 1.0131176172037806 2.7822241068458125 1.0143591469442126 2.7933883989530917 1.0157000849748916 2.8008995112046935 1.0171089226705528 2.8046694147196725 1.018552928924922 2.8046694147196725 1.02 + 0 9 0.16892038644087748 7 0.31746884501648859 7 0.49261453710585534 7 0.66792465932236034 7 0.74518911870768723 7 0.82315694109047421 7 1 9 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +1 0 0.14999999999999999 1 0 +2 0 0 1 0 -0 1 0.01095 +8 0.43213918000000001 1 +7 0 0 8 149 22 0 0.058999999999999997 0.097444755976146755 0.058999999999999997 0.18299280762162612 0.058521641903140902 0.25829496841018718 0.057768940923599035 0.32417412578674254 0.056884732409759914 0.38195693195367292 0.055965572417881644 0.43334858016886751 0.055046094579629688 0.48108201489215663 0.054112511302666644 0.56026993328171149 0.052422703987095212 0.59146757280750639 0.051720071469471732 0.62241288384917504 0.050989180927233722 0.65311791529610486 0.050233056775998985 0.68359829813091089 0.049454671379663008 0.71387324542943487 0.048656945050399046 0.74396555236074613 0.047842746048658083 0.80758256191447497 0.046083472533341475 0.84105587306945817 0.045135044819999887 0.87437090852161392 0.044173410978671911 0.90756937566490747 0.043202647374945856 0.94069187295574697 0.042227153094711124 0.97378445245098577 0.041251699834398567 1.0069051823459256 0.040281481791220958 1.069667092487977 0.038469365486382148 1.0992720658796193 0.037625865585019458 1.1289955828212435 0.036795294491045981 1.1588895151731511 0.035982452974340849 1.1890076535219487 0.035193313932941617 1.219405707180548 0.034435022393044287 1.2501413041881648 0.033715895509003321 1.3275088166127853 0.032049710262895457 1.3754588870556894 0.03114372415559611 1.424518486344853 0.030385116549664529 1.4743574040257441 0.029826165004021493 1.5248172660906634 0.029509468859583363 1.5758160193040032 0.029466483544411871 1.6270586359203898 0.029696400111757233 1.7029077956997172 0.030390433569122684 1.7279181467482749 0.030678927609708612 1.7527029912048959 0.031019697281673333 1.7772358933900485 0.031407185364548729 1.8015020492252676 0.031835931511690022 1.8254982862331575 0.032300572250275793 1.849233063537389 0.032795840981307979 1.9001515127741098 0.033924438878308767 1.9272529786535986 0.034567578902873222 1.9540696278854053 0.035239425275528168 1.9806399539897328 0.03593420348992233 2.0070021856227438 0.036646927311130333 2.0331942865765651 0.037373398775652621 2.0592539557792842 0.038110208191415522 2.1416301799610853 0.040472311491245735 2.1971389084073514 0.042112542209706956 2.2528790420508198 0.043766328993326456 2.3095653041977062 0.045427431754279345 2.3678287935637043 0.047089653597724032 2.4286242189952887 0.048744577336104482 2.4927864071158048 0.050383840328209396 2.5937759003593466 0.052697258084849576 2.6249024440053916 0.053377431856473534 2.6562815271820059 0.054027205764306918 2.6879227476252332 0.054643590070235698 2.7198305181643279 0.055223593763220544 2.7520040667217565 0.055764224559296881 2.7844374363131958 0.056262488901574897 2.8538781400175268 0.057224788032794009 2.8909698882365054 0.0576771166538241 2.928353960077211 0.058067976505772688 2.9659946334659613 0.058393460239248546 3.0038553525791638 0.058650283419937402 3.0418928465398505 0.058835913475513028 3.0800512481141933 0.058948698642548397 3.1522150939135072 0.059022927591907727 3.1862142334241819 0.058999775488404273 3.2202071736218301 0.058918240199938694 3.2541495872103576 0.058778634036795112 3.2879992769158011 0.058581882022519426 3.3217161754863298 0.058329521893919323 3.3552623456922452 0.058023704101064257 3.4386154597554421 0.057132380299386873 3.4882077258806876 0.056482872769331408 3.5372247262996472 0.0557276330074402 3.58564126300395 0.054876992081749613 3.6334552316512831 0.053941465860426051 3.6806712153179322 0.052931600189871482 3.7273142573763014 0.051858118934155997 3.8280698332236804 0.049396143218409648 3.8795632875986064 0.048044834522254332 3.9289495282055729 0.046685048526312264 3.9767888403769511 0.045321518749168066 4.0235350102768423 0.043958368779218437 4.0696079462415602 0.042599418104824968 4.1153981326692781 0.041248265148776109 4.1909473062313687 0.039052147176252737 4.2204917193889644 0.038201826366864804 4.250129907265249 0.037362056041529972 4.2799114594740839 0.036537320700094564 4.3098887575562692 0.035733170838363915 4.3401169749795416 0.034956222948102376 4.3706540771385782 0.034214159517033244 4.4474724778245696 0.032478217590645189 4.4950004371946886 0.031519457432078526 4.5436024841531566 0.030693455357571849 4.593012060019408 0.030050019802094971 4.6431083973772598 0.029633342319333074 4.6938794814870928 0.029478768288891708 4.7452020054484949 0.029601399481094127 4.8214890943126898 0.030153445189442837 4.846664959949277 0.030397651806103869 4.8716422231791459 0.030697753783434992 4.8963848533542667 0.031048555803700237 4.9208686489934852 0.031444704415912177 4.9450812377825084 0.031880688035831835 4.969022076573915 0.032350836945968742 5.0203513156955415 0.033431348772318993 5.0476590672803274 0.03405290679318191 5.0746613349639045 0.034706847386681339 5.1013946332204831 0.035386883209281711 5.1278963621760898 0.036087589545400166 5.1542048076085649 0.036804404307406578 5.1803591409475667 0.037533628035623531 5.2361582169629042 0.039116718891454627 5.2657583450099237 0.039972879317022876 5.2952513928349756 0.040836461026652046 5.3246848521098267 0.041703399779020218 5.3541021167586713 0.042570011239862662 5.3835424829581253 0.043432990981971752 5.4130411491372277 0.044289414485197034 5.485779627488462 0.046372448860411815 5.5297251589533474 0.04760570566451848 5.5749009607399307 0.048836547172490571 5.6217883113698965 0.050062630562129666 5.6707878060640793 0.051280867696952295 5.7227182801085563 0.052483067090123521 5.7782389476253906 0.053660768371427831 5.8676012402706368 0.055304807998654282 5.8956689927264287 0.055789143562354981 5.9239403774563755 0.056243033452468338 5.9524121818308418 0.056664427129646151 5.9810776238449348 0.057051369020961924 6.0099263521185255 0.057401998519910971 6.0389444458962336 0.057714549986410367 6.0913196754333772 0.058204372485695828 6.1155781114324768 0.058406850493982719 6.1410412339869431 0.058588651989399609 6.1677384865977452 0.05874403084119599 6.1955772453245848 0.058867629570130885 6.2243428187859164 0.058954479348472845 6.2536984481589366 0.058999999999999997 6.2831853071795862 0.058999999999999997 + 0 9 0.068623546075918279 7 0.11385322778022375 7 0.16474102605360236 7 0.20997857762240432 7 0.27716038835682777 7 0.31058166012672478 7 0.34959599695298682 7 0.43435960797271334 7 0.47170937571298865 7 0.51371797917399498 7 0.55105776507644233 7 0.60707195463336927 7 0.67348065683300795 7 0.71601730279657982 7 0.7792050608849922 7 0.81060844589963144 7 0.84727458560147428 7 0.88917660445463709 7 0.9502853401628707 7 0.9779735260978476 7 1 9 +8 0.43213918000000001 1 +7 0 0 8 149 22 4.7123889803846897 0.048999999999999926 4.7966208880928844 0.048999999999999926 4.8705687823774966 0.049553388952159473 4.9353551367342572 0.0504242090388115 4.9916832373536302 0.051455380948773867 5.0407440687321046 0.052535577516685965 5.0840828151649946 0.053624694358571916 5.1240642799743021 0.05473815421032413 5.189739169551645 0.056775650194873219 5.2154411839464236 0.057628203870114518 5.2407475901100335 0.058521359212624885 5.2656511889976318 0.05945283960939466 5.290144997520601 0.060420621952003491 5.3142222485465398 0.061422936636620448 5.3378763908992752 0.062458267564003966 5.3872311377173157 0.064725926244214388 5.4128094008571352 0.065966364829160476 5.4378316676256526 0.067245403979573889 5.4622828096155924 0.068561761619553477 5.4861371403805466 0.069914394942964891 5.5093587746504236 0.071302757844342549 5.5319019875469246 0.072727058349791554 5.5730995669181507 0.075487703087347785 5.5918935647019925 0.076815586964060809 5.610060001753304 0.078172954704011866 5.6275422352759481 0.079560738827393479 5.6442605450748662 0.080980017348607533 5.6601121335560789 0.082432013776265176 5.6749711257266906 0.083918097113186874 5.7090601998176957 0.087699619820017588 5.7272754789731763 0.090078865466081223 5.7422861271748022 0.092545171721189395 5.7532197866704298 0.095074829268770158 5.7593816216817872 0.09765071914959178 5.7602403079116185 0.10025933856619466 5.7557630449099459 0.1028737457504515 5.7420763973787903 0.10671996554095034 5.7363742694169551 0.10798424379487775 5.7296133249398853 0.10923201498892597 5.7218875798824058 0.1104609367109594 5.7132885851957118 0.11166935976625864 5.7039054268473839 0.11285632817752014 5.6938247258213766 0.11402157918485636 5.670646889965627 0.11650095021348718 5.6573164700077712 0.11780752570569314 5.6432430553917579 0.11908624502147105 5.6285150208104078 0.12033804771042861 5.6132054385020504 0.12156383757272352 5.5973720782505358 0.12276448265906362 5.5810574073852264 0.12394081527070679 5.5278562030094971 0.12759827290255232 5.4895844749137437 0.12997148795657359 5.4493824928255847 0.13225720461751894 5.4069738627486092 0.13446975927700411 5.3621068456685936 0.13662068699367216 5.3141113164116707 0.13871091532257768 5.2624002680207234 0.14074035110264177 5.1794641624937414 0.14355734962721917 5.1537119682513497 0.1443791245304786 5.1275786174579707 0.1451587980901527 5.101071704229601 0.14589399649503171 5.0742023316076139 0.14658223728575939 5.0469851115587581 0.14722092935483291 5.0194381649751598 0.14780737294660276 4.9602535702685078 0.14893642906630977 4.9285189898864843 0.14946483050999276 4.8964323634745117 0.14991982270370427 4.8640423983771619 0.15029769228989101 4.8313986521133314 0.1505952870298983 4.7985566581522727 0.15081014899580447 4.7655830516896227 0.15094064776225502 4.7032084291877982 0.15102652638148439 4.6738145833243747 0.15099973652304521 4.644432469757878 0.15090544180587306 4.6151135041638707 0.15074392901072844 4.585907205968752 0.15051607391623809 4.5568611983497576 0.15022334129889517 4.5280212082349589 0.14986778493305936 4.4565423996728457 0.14882839135609593 4.4141785151578503 0.14806860706166369 4.3725160442057653 0.14718124063911861 4.3316199886952189 0.14617589823782434 4.291537412341305 0.14506191773825997 4.2523135816393758 0.14384818147936451 4.2139826592365779 0.14254319923934008 4.1322475991928593 0.13950829866142891 4.0911677613292374 0.13781680740946459 4.0524936820878654 0.13608387980470368 4.0158172852690734 0.13430959398709438 3.9808580524316923 0.1324913122813613 3.9473984588391349 0.13062408546411178 3.915309222268434 0.12869898652640158 3.8647699564185873 0.12541609558845382 3.8456086758192871 0.12410577835926616 3.8270476839097425 0.12276634672551995 3.8091371436296542 0.12139702627269737 3.791948373766437 0.11999683801497874 3.7755738489552271 0.11856459839524222 3.7601271996788808 0.11709891928506415 3.7243759442035036 0.11336891650066601 3.704991082917954 0.1110235914104331 3.6885668464673231 0.10859094933433266 3.6759364944072006 0.10609136216758523 3.6678106119879956 0.1035388854742539 3.6647847354264056 0.10094338391859695 3.6671616815770949 0.098322416804939472 3.6780242015282614 0.094445419552071461 3.6828368062046009 0.093169086762762698 3.6887697526168139 0.091907170910779171 3.6957349392867527 0.090662578272485403 3.703642169998854 0.089437498919070699 3.7123991538001353 0.08823340671654871 3.7219115050001945 0.087051059325757699 3.7439585342537769 0.08453544376274634 3.7567493943704475 0.08320948018147388 3.7703405322482153 0.081911814863836377 3.7846338060406111 0.080641620731522909 3.7995477233277013 0.079398036222618346 3.8150174411160935 0.078180165291603279 3.8309947658389318 0.076987077409354107 3.8662510641488148 0.074481567436999963 3.8856635513675037 0.073176939678848987 3.9056341196483224 0.071902925697917147 3.9261201859530619 0.070658861302484416 3.9470880795689474 0.069444416699883618 3.968513042108635 0.068259596496500471 3.9903792275102186 0.067104739697773572 4.0452020921591494 0.064340988628275433 4.0790976696607286 0.062743717071132202 4.1146182831192544 0.061180887925465798 4.1521082593006602 0.059650412207975984 4.1918622212889911 0.058152112751226316 4.2345540686386336 0.056692466904661648 4.2807277986097638 0.055278541306873236 4.3558601725778274 0.053323123921139637 4.3795621832082876 0.052749761338815218 4.4035300771399424 0.052214647147221127 4.4277521890481548 0.051719611075552958 4.4522139365814466 0.051266429504605159 4.4768978203614918 0.050856825466771088 4.5017834239831211 0.050492468646043003 4.546786290602423 0.049922403497759026 4.5676595894527443 0.049687170830929051 4.5895993900991385 0.049476256442920939 4.6126302045958552 0.049296200456645393 4.6366689775175374 0.049153104052525043 4.6615250859592203 0.04905262946849441 4.6869003395363302 0.048999999999999926 4.7123889803846888 0.048999999999999926 + 0 9 0.068623546075918279 7 0.11385322778022375 7 0.16474102605360236 7 0.20997857762240432 7 0.27716038835682777 7 0.31058166012672478 7 0.34959599695298682 7 0.43435960797271334 7 0.47170937571298865 7 0.51371797917399498 7 0.55105776507644233 7 0.60707195463336927 7 0.67348065683300795 7 0.71601730279657982 7 0.7792050608849922 7 0.81060844589963144 7 0.84727458560147428 7 0.88917660445463709 7 0.9502853401628707 7 0.9779735260978476 7 1 9 +8 0 0.43213918000000001 +7 0 0 8 149 22 0 0.058999999999999997 0.097444755976146755 0.058999999999999997 0.18299280762162612 0.058521641903140902 0.25829496841018718 0.057768940923599035 0.32417412578674254 0.056884732409759914 0.38195693195367292 0.055965572417881644 0.43334858016886751 0.055046094579629688 0.48108201489215663 0.054112511302666644 0.56026993328171149 0.052422703987095212 0.59146757280750639 0.051720071469471732 0.62241288384917504 0.050989180927233722 0.65311791529610486 0.050233056775998985 0.68359829813091089 0.049454671379663008 0.71387324542943487 0.048656945050399046 0.74396555236074613 0.047842746048658083 0.80758256191447497 0.046083472533341475 0.84105587306945817 0.045135044819999887 0.87437090852161392 0.044173410978671911 0.90756937566490747 0.043202647374945856 0.94069187295574697 0.042227153094711124 0.97378445245098577 0.041251699834398567 1.0069051823459256 0.040281481791220958 1.069667092487977 0.038469365486382148 1.0992720658796193 0.037625865585019458 1.1289955828212435 0.036795294491045981 1.1588895151731511 0.035982452974340849 1.1890076535219487 0.035193313932941617 1.219405707180548 0.034435022393044287 1.2501413041881648 0.033715895509003321 1.3275088166127853 0.032049710262895457 1.3754588870556894 0.03114372415559611 1.424518486344853 0.030385116549664529 1.4743574040257441 0.029826165004021493 1.5248172660906634 0.029509468859583363 1.5758160193040032 0.029466483544411871 1.6270586359203898 0.029696400111757233 1.7029077956997172 0.030390433569122684 1.7279181467482749 0.030678927609708612 1.7527029912048959 0.031019697281673333 1.7772358933900485 0.031407185364548729 1.8015020492252676 0.031835931511690022 1.8254982862331575 0.032300572250275793 1.849233063537389 0.032795840981307979 1.9001515127741098 0.033924438878308767 1.9272529786535986 0.034567578902873222 1.9540696278854053 0.035239425275528168 1.9806399539897328 0.03593420348992233 2.0070021856227438 0.036646927311130333 2.0331942865765651 0.037373398775652621 2.0592539557792842 0.038110208191415522 2.1416301799610853 0.040472311491245735 2.1971389084073514 0.042112542209706956 2.2528790420508198 0.043766328993326456 2.3095653041977062 0.045427431754279345 2.3678287935637043 0.047089653597724032 2.4286242189952887 0.048744577336104482 2.4927864071158048 0.050383840328209396 2.5937759003593466 0.052697258084849576 2.6249024440053916 0.053377431856473534 2.6562815271820059 0.054027205764306918 2.6879227476252332 0.054643590070235698 2.7198305181643279 0.055223593763220544 2.7520040667217565 0.055764224559296881 2.7844374363131958 0.056262488901574897 2.8538781400175268 0.057224788032794009 2.8909698882365054 0.0576771166538241 2.928353960077211 0.058067976505772688 2.9659946334659613 0.058393460239248546 3.0038553525791638 0.058650283419937402 3.0418928465398505 0.058835913475513028 3.0800512481141933 0.058948698642548397 3.1522150939135072 0.059022927591907727 3.1862142334241819 0.058999775488404273 3.2202071736218301 0.058918240199938694 3.2541495872103576 0.058778634036795112 3.2879992769158011 0.058581882022519426 3.3217161754863298 0.058329521893919323 3.3552623456922452 0.058023704101064257 3.4386154597554421 0.057132380299386873 3.4882077258806876 0.056482872769331408 3.5372247262996472 0.0557276330074402 3.58564126300395 0.054876992081749613 3.6334552316512831 0.053941465860426051 3.6806712153179322 0.052931600189871482 3.7273142573763014 0.051858118934155997 3.8280698332236804 0.049396143218409648 3.8795632875986064 0.048044834522254332 3.9289495282055729 0.046685048526312264 3.9767888403769511 0.045321518749168066 4.0235350102768423 0.043958368779218437 4.0696079462415602 0.042599418104824968 4.1153981326692781 0.041248265148776109 4.1909473062313687 0.039052147176252737 4.2204917193889644 0.038201826366864804 4.250129907265249 0.037362056041529972 4.2799114594740839 0.036537320700094564 4.3098887575562692 0.035733170838363915 4.3401169749795416 0.034956222948102376 4.3706540771385782 0.034214159517033244 4.4474724778245696 0.032478217590645189 4.4950004371946886 0.031519457432078526 4.5436024841531566 0.030693455357571849 4.593012060019408 0.030050019802094971 4.6431083973772598 0.029633342319333074 4.6938794814870928 0.029478768288891708 4.7452020054484949 0.029601399481094127 4.8214890943126898 0.030153445189442837 4.846664959949277 0.030397651806103869 4.8716422231791459 0.030697753783434992 4.8963848533542667 0.031048555803700237 4.9208686489934852 0.031444704415912177 4.9450812377825084 0.031880688035831835 4.969022076573915 0.032350836945968742 5.0203513156955415 0.033431348772318993 5.0476590672803274 0.03405290679318191 5.0746613349639045 0.034706847386681339 5.1013946332204831 0.035386883209281711 5.1278963621760898 0.036087589545400166 5.1542048076085649 0.036804404307406578 5.1803591409475667 0.037533628035623531 5.2361582169629042 0.039116718891454627 5.2657583450099237 0.039972879317022876 5.2952513928349756 0.040836461026652046 5.3246848521098267 0.041703399779020218 5.3541021167586713 0.042570011239862662 5.3835424829581253 0.043432990981971752 5.4130411491372277 0.044289414485197034 5.485779627488462 0.046372448860411815 5.5297251589533474 0.04760570566451848 5.5749009607399307 0.048836547172490571 5.6217883113698965 0.050062630562129666 5.6707878060640793 0.051280867696952295 5.7227182801085563 0.052483067090123521 5.7782389476253906 0.053660768371427831 5.8676012402706368 0.055304807998654282 5.8956689927264287 0.055789143562354981 5.9239403774563755 0.056243033452468338 5.9524121818308418 0.056664427129646151 5.9810776238449348 0.057051369020961924 6.0099263521185255 0.057401998519910971 6.0389444458962336 0.057714549986410367 6.0913196754333772 0.058204372485695828 6.1155781114324768 0.058406850493982719 6.1410412339869431 0.058588651989399609 6.1677384865977452 0.05874403084119599 6.1955772453245848 0.058867629570130885 6.2243428187859164 0.058954479348472845 6.2536984481589366 0.058999999999999997 6.2831853071795862 0.058999999999999997 + 0 9 0.068623546075918279 7 0.11385322778022375 7 0.16474102605360236 7 0.20997857762240432 7 0.27716038835682777 7 0.31058166012672478 7 0.34959599695298682 7 0.43435960797271334 7 0.47170937571298865 7 0.51371797917399498 7 0.55105776507644233 7 0.60707195463336927 7 0.67348065683300795 7 0.71601730279657982 7 0.7792050608849922 7 0.81060844589963144 7 0.84727458560147428 7 0.88917660445463709 7 0.9502853401628707 7 0.9779735260978476 7 1 9 +8 0 0.43213918000000001 +7 0 0 8 149 22 4.7123889803846897 0.048999999999999926 4.7966208880928844 0.048999999999999926 4.8705687823774966 0.049553388952159473 4.9353551367342572 0.0504242090388115 4.9916832373536302 0.051455380948773867 5.0407440687321046 0.052535577516685965 5.0840828151649946 0.053624694358571916 5.1240642799743021 0.05473815421032413 5.189739169551645 0.056775650194873219 5.2154411839464236 0.057628203870114518 5.2407475901100335 0.058521359212624885 5.2656511889976318 0.05945283960939466 5.290144997520601 0.060420621952003491 5.3142222485465398 0.061422936636620448 5.3378763908992752 0.062458267564003966 5.3872311377173157 0.064725926244214388 5.4128094008571352 0.065966364829160476 5.4378316676256526 0.067245403979573889 5.4622828096155924 0.068561761619553477 5.4861371403805466 0.069914394942964891 5.5093587746504236 0.071302757844342549 5.5319019875469246 0.072727058349791554 5.5730995669181507 0.075487703087347785 5.5918935647019925 0.076815586964060809 5.610060001753304 0.078172954704011866 5.6275422352759481 0.079560738827393479 5.6442605450748662 0.080980017348607533 5.6601121335560789 0.082432013776265176 5.6749711257266906 0.083918097113186874 5.7090601998176957 0.087699619820017588 5.7272754789731763 0.090078865466081223 5.7422861271748022 0.092545171721189395 5.7532197866704298 0.095074829268770158 5.7593816216817872 0.09765071914959178 5.7602403079116185 0.10025933856619466 5.7557630449099459 0.1028737457504515 5.7420763973787903 0.10671996554095034 5.7363742694169551 0.10798424379487775 5.7296133249398853 0.10923201498892597 5.7218875798824058 0.1104609367109594 5.7132885851957118 0.11166935976625864 5.7039054268473839 0.11285632817752014 5.6938247258213766 0.11402157918485636 5.670646889965627 0.11650095021348718 5.6573164700077712 0.11780752570569314 5.6432430553917579 0.11908624502147105 5.6285150208104078 0.12033804771042861 5.6132054385020504 0.12156383757272352 5.5973720782505358 0.12276448265906362 5.5810574073852264 0.12394081527070679 5.5278562030094971 0.12759827290255232 5.4895844749137437 0.12997148795657359 5.4493824928255847 0.13225720461751894 5.4069738627486092 0.13446975927700411 5.3621068456685936 0.13662068699367216 5.3141113164116707 0.13871091532257768 5.2624002680207234 0.14074035110264177 5.1794641624937414 0.14355734962721917 5.1537119682513497 0.1443791245304786 5.1275786174579707 0.1451587980901527 5.101071704229601 0.14589399649503171 5.0742023316076139 0.14658223728575939 5.0469851115587581 0.14722092935483291 5.0194381649751598 0.14780737294660276 4.9602535702685078 0.14893642906630977 4.9285189898864843 0.14946483050999276 4.8964323634745117 0.14991982270370427 4.8640423983771619 0.15029769228989101 4.8313986521133314 0.1505952870298983 4.7985566581522727 0.15081014899580447 4.7655830516896227 0.15094064776225502 4.7032084291877982 0.15102652638148439 4.6738145833243747 0.15099973652304521 4.644432469757878 0.15090544180587306 4.6151135041638707 0.15074392901072844 4.585907205968752 0.15051607391623809 4.5568611983497576 0.15022334129889517 4.5280212082349589 0.14986778493305936 4.4565423996728457 0.14882839135609593 4.4141785151578503 0.14806860706166369 4.3725160442057653 0.14718124063911861 4.3316199886952189 0.14617589823782434 4.291537412341305 0.14506191773825997 4.2523135816393758 0.14384818147936451 4.2139826592365779 0.14254319923934008 4.1322475991928593 0.13950829866142891 4.0911677613292374 0.13781680740946459 4.0524936820878654 0.13608387980470368 4.0158172852690734 0.13430959398709438 3.9808580524316923 0.1324913122813613 3.9473984588391349 0.13062408546411178 3.915309222268434 0.12869898652640158 3.8647699564185873 0.12541609558845382 3.8456086758192871 0.12410577835926616 3.8270476839097425 0.12276634672551995 3.8091371436296542 0.12139702627269737 3.791948373766437 0.11999683801497874 3.7755738489552271 0.11856459839524222 3.7601271996788808 0.11709891928506415 3.7243759442035036 0.11336891650066601 3.704991082917954 0.1110235914104331 3.6885668464673231 0.10859094933433266 3.6759364944072006 0.10609136216758523 3.6678106119879956 0.1035388854742539 3.6647847354264056 0.10094338391859695 3.6671616815770949 0.098322416804939472 3.6780242015282614 0.094445419552071461 3.6828368062046009 0.093169086762762698 3.6887697526168139 0.091907170910779171 3.6957349392867527 0.090662578272485403 3.703642169998854 0.089437498919070699 3.7123991538001353 0.08823340671654871 3.7219115050001945 0.087051059325757699 3.7439585342537769 0.08453544376274634 3.7567493943704475 0.08320948018147388 3.7703405322482153 0.081911814863836377 3.7846338060406111 0.080641620731522909 3.7995477233277013 0.079398036222618346 3.8150174411160935 0.078180165291603279 3.8309947658389318 0.076987077409354107 3.8662510641488148 0.074481567436999963 3.8856635513675037 0.073176939678848987 3.9056341196483224 0.071902925697917147 3.9261201859530619 0.070658861302484416 3.9470880795689474 0.069444416699883618 3.968513042108635 0.068259596496500471 3.9903792275102186 0.067104739697773572 4.0452020921591494 0.064340988628275433 4.0790976696607286 0.062743717071132202 4.1146182831192544 0.061180887925465798 4.1521082593006602 0.059650412207975984 4.1918622212889911 0.058152112751226316 4.2345540686386336 0.056692466904661648 4.2807277986097638 0.055278541306873236 4.3558601725778274 0.053323123921139637 4.3795621832082876 0.052749761338815218 4.4035300771399424 0.052214647147221127 4.4277521890481548 0.051719611075552958 4.4522139365814466 0.051266429504605159 4.4768978203614918 0.050856825466771088 4.5017834239831211 0.050492468646043003 4.546786290602423 0.049922403497759026 4.5676595894527443 0.049687170830929051 4.5895993900991385 0.049476256442920939 4.6126302045958552 0.049296200456645393 4.6366689775175374 0.049153104052525043 4.6615250859592203 0.04905262946849441 4.6869003395363302 0.048999999999999926 4.7123889803846888 0.048999999999999926 + 0 9 0.068623546075918279 7 0.11385322778022375 7 0.16474102605360236 7 0.20997857762240432 7 0.27716038835682777 7 0.31058166012672478 7 0.34959599695298682 7 0.43435960797271334 7 0.47170937571298865 7 0.51371797917399498 7 0.55105776507644233 7 0.60707195463336927 7 0.67348065683300795 7 0.71601730279657982 7 0.7792050608849922 7 0.81060844589963144 7 0.84727458560147428 7 0.88917660445463709 7 0.9502853401628707 7 0.9779735260978476 7 1 9 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +1 0 0 1 0 +2 0 0 1 0 -0 1 0.058999999999999997 +1 0 2.0499999999999998 1 0 +2 0 0 1 0 -0 1 0.058999999999999997 +1 1.5707963267948966 10.995574287564276 -0 -1 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +1 0 0.35899999999999999 1 0 +2 0 0 1 0 -0 1 0.050999999999999997 +8 1.5707963267948966 3.1415926535897931 +1 0 4.7123889803846897 1 0 +1 0 10.995574287564276 1 0 +8 0 6.2831853071795862 +1 1.5707963267948966 10.995574287564276 -0 -1 +8 0 6.2831853071795862 +1 3.1415926535897931 10.995574287564276 -0 -1 +Curves 13 +7 0 0 8 51 8 -0.0556827994439111 0.01950450835292121 -6.0986372202309624e-20 -0.0556827994439111 0.01950450835292121 0.0013912939546714626 -0.05561482733877663 0.019698554220080794 0.0027802996203490798 -0.055479297426835189 0.020085504939596262 0.0041379265729281217 -0.055273926820561141 0.020659591309432179 0.0054349604271301784 -0.054994320583595782 0.021409775040913341 0.0066431582872640707 -0.054633784934225528 0.022321928701216007 0.0077330463059251909 -0.054186437597229596 0.023378012756673484 0.008676781242804809 -0.053165775269001715 0.025606955756789108 0.010111332114929171 -0.052578065020521585 0.026829197332238503 0.010693808021021335 -0.051896588587147838 0.028155949688751462 0.011067707467253194 -0.051145076568110917 0.029508603254517707 0.011191622305414433 -0.050357505192240408 0.03081945376689893 0.011063496940558594 -0.049576262780124461 0.032034023552038 0.010705488173925677 -0.048847531570446585 0.033107704846841737 0.010169438349730659 -0.047470979410838297 0.035059611066250877 0.0088407275848012695 -0.046788793720451277 0.035970802616840443 0.007949606450570891 -0.04617619046427264 0.036750615963094993 0.0069140562461536843 -0.045648790701466824 0.037394912082808041 0.0057488479109600388 -0.045224242525239586 0.037898174131575868 0.0044736092007243563 -0.044921000963439685 0.038251566074931388 0.0031095676972394477 -0.044755778872954649 0.038443742203634314 0.0016853889159642373 -0.044713360598481321 0.038493070066186616 -0.0012019817892355458 -0.04483677830921691 0.038349507976164515 -0.0026418766156193181 -0.045102620265342695 0.038041105221557049 -0.0040310985383402668 -0.045494945879757172 0.037579674698366865 -0.005337961105232973 -0.045995210481875617 0.036974451246747961 -0.0065389886637167716 -0.04658481870815312 0.036232425344386844 -0.0076138728391275607 -0.047247198127308529 0.03535903616202405 -0.0085475853894874561 -0.048294386003606103 0.033896240770324763 -0.0096537907535854343 -0.048626391656185909 0.033422390608523311 -0.0099590489151942952 -0.048970434803703992 0.032919837956621387 -0.010230604150906037 -0.049326122035805005 0.032386969859520408 -0.010465424022101903 -0.049692143324902842 0.031823214835103246 -0.010658993758313388 -0.050066245756993907 0.031229323172667658 -0.010805853702228896 -0.050445277908306538 0.030607739922240584 -0.010900175059148847 -0.051208687218265082 0.029312802635693136 -0.010973879597704132 -0.05158754159679637 0.028648427447820271 -0.010951674647463366 -0.051952777404993905 0.027984424394642271 -0.010867505123831962 -0.052298803072888422 0.027332015543893109 -0.010724557391688023 -0.052622870295298219 0.026699259443285123 -0.010528643204054014 -0.052924464838840765 0.026090772078251195 -0.01028602718498622 -0.053204734703804005 0.025507606208655931 -0.01000142331754111 -0.054058584300373462 0.023677700171367288 -0.0089352771338671363 -0.05454565464713379 0.022543883650466716 -0.0079909211154902803 -0.054937494791069581 0.021561878503406007 -0.0068823827962242005 -0.055240560879673453 0.020752756589166636 -0.0056408530557814319 -0.055462778847121551 0.020132674200613428 -0.0042999150251120683 -0.055609267090452143 0.019714425545189287 -0.0028910773294460487 -0.0556827994439111 0.01950450835292121 -0.0014470710750779392 -0.0556827994439111 0.01950450835292121 -2.4919709308221516e-18 + 0 9 0.16892038644087748 7 0.31746884501648859 7 0.49261453710585534 7 0.66792465932236034 7 0.74518911870768723 7 0.82315694109047421 7 1 9 +7 0 0 8 51 8 -0.0556827994439111 0.01950450835292121 -6.0986372202309624e-20 -0.0556827994439111 0.01950450835292121 0.0013912939546714626 -0.05561482733877663 0.019698554220080794 0.0027802996203490798 -0.055479297426835189 0.020085504939596262 0.0041379265729281217 -0.055273926820561141 0.020659591309432179 0.0054349604271301784 -0.054994320583595782 0.021409775040913341 0.0066431582872640707 -0.054633784934225528 0.022321928701216007 0.0077330463059251909 -0.054186437597229596 0.023378012756673484 0.008676781242804809 -0.053165775269001715 0.025606955756789108 0.010111332114929171 -0.052578065020521585 0.026829197332238503 0.010693808021021335 -0.051896588587147838 0.028155949688751462 0.011067707467253194 -0.051145076568110917 0.029508603254517707 0.011191622305414433 -0.050357505192240408 0.03081945376689893 0.011063496940558594 -0.049576262780124461 0.032034023552038 0.010705488173925677 -0.048847531570446585 0.033107704846841737 0.010169438349730659 -0.047470979410838297 0.035059611066250877 0.0088407275848012695 -0.046788793720451277 0.035970802616840443 0.007949606450570891 -0.04617619046427264 0.036750615963094993 0.0069140562461536843 -0.045648790701466824 0.037394912082808041 0.0057488479109600388 -0.045224242525239586 0.037898174131575868 0.0044736092007243563 -0.044921000963439685 0.038251566074931388 0.0031095676972394477 -0.044755778872954649 0.038443742203634314 0.0016853889159642373 -0.044713360598481321 0.038493070066186616 -0.0012019817892355458 -0.04483677830921691 0.038349507976164515 -0.0026418766156193181 -0.045102620265342695 0.038041105221557049 -0.0040310985383402668 -0.045494945879757172 0.037579674698366865 -0.005337961105232973 -0.045995210481875617 0.036974451246747961 -0.0065389886637167716 -0.04658481870815312 0.036232425344386844 -0.0076138728391275607 -0.047247198127308529 0.03535903616202405 -0.0085475853894874561 -0.048294386003606103 0.033896240770324763 -0.0096537907535854343 -0.048626391656185909 0.033422390608523311 -0.0099590489151942952 -0.048970434803703992 0.032919837956621387 -0.010230604150906037 -0.049326122035805005 0.032386969859520408 -0.010465424022101903 -0.049692143324902842 0.031823214835103246 -0.010658993758313388 -0.050066245756993907 0.031229323172667658 -0.010805853702228896 -0.050445277908306538 0.030607739922240584 -0.010900175059148847 -0.051208687218265082 0.029312802635693136 -0.010973879597704132 -0.05158754159679637 0.028648427447820271 -0.010951674647463366 -0.051952777404993905 0.027984424394642271 -0.010867505123831962 -0.052298803072888422 0.027332015543893109 -0.010724557391688023 -0.052622870295298219 0.026699259443285123 -0.010528643204054014 -0.052924464838840765 0.026090772078251195 -0.01028602718498622 -0.053204734703804005 0.025507606208655931 -0.01000142331754111 -0.054058584300373462 0.023677700171367288 -0.0089352771338671363 -0.05454565464713379 0.022543883650466716 -0.0079909211154902803 -0.054937494791069581 0.021561878503406007 -0.0068823827962242005 -0.055240560879673453 0.020752756589166636 -0.0056408530557814319 -0.055462778847121551 0.020132674200613428 -0.0042999150251120683 -0.055609267090452143 0.019714425545189287 -0.0028910773294460487 -0.0556827994439111 0.01950450835292121 -0.0014470710750779392 -0.0556827994439111 0.01950450835292121 -2.4919709308221516e-18 + 0 9 0.16892038644087748 7 0.31746884501648859 7 0.49261453710585534 7 0.66792465932236034 7 0.74518911870768723 7 0.82315694109047421 7 1 9 +1 -0.005474999999999999 -0.0094829781714396034 -2.6818879148710061e-18 -0.86602540378443871 0.49999999999999994 8.1250169528836513e-33 +2 -0.12990381056766581 0.074999999999999983 0 -0.86602540378443871 0.49999999999999994 0 -0.49999999999999994 -0.86602540378443871 0 0 0 1 0.01095 +7 0 0 8 149 22 -2.5004412602946946e-18 -0.058999999999999997 -0.97100000000000009 0.0049696825547834765 -0.058999999999999997 -0.97100000000000009 0.0093325834605814621 -0.058521641903140638 -0.97044661104784047 0.013101418333911055 -0.057768940923599514 -0.96957579096118907 0.016318044987109044 -0.056884732409759727 -0.96854461905122546 0.01906948829391493 -0.055965572417881422 -0.96746442248331466 0.021459334749957544 -0.055046094579629862 -0.96637530564142793 0.023628175197915435 -0.054112511302666644 -0.96526184578967589 0.027115117917322969 -0.052422703987095212 -0.96322434980512694 0.028459710217652558 -0.051720071469471732 -0.96237179612988566 0.02976290098580683 -0.050989180927233722 -0.96147864078737522 0.031024133582428753 -0.050233056775998985 -0.96054716039060528 0.032243055025160401 -0.049454671379663008 -0.95957937804799642 0.033419515988642928 -0.048656945050399046 -0.95857706336337944 0.034553570804516612 -0.047842746048658083 -0.95754173243599594 0.036873978825926829 -0.046083472533341475 -0.95527407375578577 0.038048725316158584 -0.04513504481999988 -0.95403363517083961 0.039170290381070366 -0.044173410978671897 -0.95275459602042611 0.040238974608944524 -0.043202647374945856 -0.9514382383804465 0.041254888316309996 -0.042227153094711131 -0.95008560505703521 0.04221803413686076 -0.041251699834398567 -0.94869724215565743 0.043128389610374282 -0.040281481791220958 -0.94727294165020837 0.044748367646809659 -0.038469365486382148 -0.94451229691265259 0.045468595650885534 -0.037625865585019458 -0.94318441303593925 0.046146719631528964 -0.036795294491045981 -0.94182704529598837 0.046782357068906821 -0.035982452974340863 -0.94043926117260646 0.047374697075681461 -0.035193313932941624 -0.9390199826513923 0.047922500397010827 -0.034435022393044287 -0.93756798622373483 0.048424099410548448 -0.033715895509003321 -0.93608190288681326 0.049550587268678427 -0.032049710262895457 -0.93230038017998251 0.050129335444327135 -0.031143724155592592 -0.92992113453391656 0.050587171711697701 -0.030385116549675659 -0.92745482827881653 0.050909234076023921 -0.02982616500400628 -0.92492517073122349 0.05108764048313192 -0.0295094688595939 -0.92234928085041179 0.051114653060183222 -0.02946648354440869 -0.91974066143380462 0.050984454592606476 -0.029696400111757237 -0.91712625424954852 0.050571667092538401 -0.030390433569122684 -0.91328003445904971 0.050398607788464403 -0.030678927609708615 -0.91201575620512221 0.050191230809071875 -0.031019697281673347 -0.91076798501107414 0.049951103907107719 -0.031407185364548743 -0.90953906328904077 0.04967975277356048 -0.031835931511690028 -0.90833064023374144 0.049378661037660358 -0.032300572250275793 -0.9071436718224799 0.049049270266879198 -0.032795840981307979 -0.90597842081514379 0.048277064322970839 -0.033924438878308767 -0.90349904978651274 0.047824221999431246 -0.034567578902873222 -0.90219247429430693 0.047336025571794685 -0.035239425275528168 -0.90091375497852921 0.046813757055684524 -0.03593420348992233 -0.89966195228957158 0.046258407906864529 -0.036646927311130333 -0.89843616242727675 0.04567067902123894 -0.037373398775652621 -0.89723551734093654 0.045050980734852378 -0.038110208191415522 -0.89605918472929325 0.04298386208302421 -0.040472311491245735 -0.89240172709744769 0.041429442674571985 -0.042112542209707393 -0.89002851204342892 0.039723843950829382 -0.043766328993325332 -0.88774279538247469 0.037845978677936057 -0.04542743175428051 -0.8855302407230029 0.035776145563714397 -0.047089653597723449 -0.88337931300632444 0.033469784773098483 -0.048744577336104593 -0.88128908467742306 0.030886977671371708 -0.050383840328209396 -0.8792596488973583 0.026575156672211202 -0.052697258084849576 -0.87644265037278057 0.025215819330877302 -0.053377431856473534 -0.87562087546952128 0.023816328025213974 -0.054027205764306918 -0.87484120190984704 0.022377474975260922 -0.054643590070235698 -0.87410600350496825 0.020900480807449766 -0.055223593763220544 -0.87341776271424065 0.019386994554604055 -0.055764224559296881 -0.87277907064516702 0.017839093655939268 -0.056262488901574897 -0.87219262705339695 0.01448241616914368 -0.057224788032794009 -0.87106357093369036 0.012664341512342765 -0.057677116653824106 -0.87053516949000753 0.010809888176166868 -0.058067976505772702 -0.87008017729629583 0.0089241358183845959 -0.058393460239248546 -0.86970230771010915 0.0070126212750772484 -0.058650283419937388 -0.86940471297010191 0.0050815442706897054 -0.058835913475513021 -0.86918985100419577 0.0031379731280812748 -0.058948698642548397 -0.86905935223774511 -0.00054138091153253646 -0.059022927591907727 -0.86897347361851562 -0.0022765174910491207 -0.058999775488404273 -0.86900026347695458 -0.0040097825514356401 -0.058918240199938694 -0.86909455819412695 -0.0057358409944945447 -0.058778634036795112 -0.8692560709892716 -0.0074495993323682678 -0.058581882022519426 -0.86948392608376202 -0.0091462056875392158 -0.058329521893919323 -0.86977665870110499 -0.010821049792829775 -0.058023704101064257 -0.87013221506694083 -0.014943031956337432 -0.057132380299386873 -0.87117160864390419 -0.017359824269599054 -0.056482872769331449 -0.8719313929383351 -0.019704142205801793 -0.055727633007440158 -0.87281875936088349 -0.021967840188780171 -0.054876992081749572 -0.87382410176217562 -0.024145100895452215 -0.053941465860426072 -0.87493808226173786 -0.026231435167424526 -0.052931600189871496 -0.87615181852063695 -0.028224173344926922 -0.05185811893415599 -0.87745680076066002 -0.032370727810448231 -0.049396143218409648 -0.88049170133857102 -0.034387115788041385 -0.048044834522254345 -0.88218319259053524 -0.036224385786954826 -0.046685048526312251 -0.88391612019529675 -0.037909472216589704 -0.045321518749168066 -0.88569040601290561 -0.039461649306085284 -0.043958368779218451 -0.88750868771863822 -0.040896431853979981 -0.042599418104824947 -0.88937591453588849 -0.042224214328679649 -0.041248265148776109 -0.89130101347359858 -0.044241216211312544 -0.039052147176252737 -0.89458390441154645 -0.044986702488051783 -0.038201826366864804 -0.89589422164073373 -0.0456902688892067 -0.037362056041529972 -0.8972336532744799 -0.046351640358389658 -0.036537320700094564 -0.8986029737273028 -0.046970154271562981 -0.035733170838363915 -0.90000316198502128 -0.047544760437038987 -0.034956222948102376 -0.90143540160475766 -0.048074021095479952 -0.034214159517033244 -0.90290108071493569 -0.049272250486433494 -0.032478217590645189 -0.90663108349933408 -0.049896574586265847 -0.031519457432078825 -0.90897640858956852 -0.050404251921731993 -0.030693455357571325 -0.91140905066566491 -0.050780355152930869 -0.030050019802095027 -0.91390863783241483 -0.051017324340267775 -0.029633342319333619 -0.91646111452574874 -0.051106750202303868 -0.029478768288891333 -0.91905661608140143 -0.051038617096464088 -0.029601399481094127 -0.92167758319506055 -0.050713065514755636 -0.030153445189442837 -0.92555458044792871 -0.050568214107868437 -0.030397651806103869 -0.92683091323723754 -0.050388004021440072 -0.030697753783434992 -0.92809282908922097 -0.050173896324957223 -0.031048555803700237 -0.92933742172751466 -0.049927400545448475 -0.031444704415912177 -0.93056250108092931 -0.049650074667484299 -0.031880688035831835 -0.93176659328345124 -0.049343525133177017 -0.032350836945968742 -0.93294894067424239 -0.048619295141518984 -0.033431348772318993 -0.93546455623725377 -0.048191184908312382 -0.03405290679318191 -0.93679051981852601 -0.047726863342594496 -0.034706847386681339 -0.93808818513616377 -0.047227799336003337 -0.035386883209281711 -0.93935837926847732 -0.04669514347178147 -0.036087589545400166 -0.94060196377738192 -0.046129728024776037 -0.036804404307406578 -0.94181983470839692 -0.045532066961438758 -0.037533628035623531 -0.94301292259064595 -0.04418272296743702 -0.039116718891454627 -0.94551843256300028 -0.043421561648771638 -0.039972879317022876 -0.94682306032115104 -0.042619279339682965 -0.040836461026652046 -0.94809707430208268 -0.041776146432214646 -0.041703399779020218 -0.94934113869751546 -0.040892296354600663 -0.042570011239862662 -0.95055558330011625 -0.039967725571265371 -0.043432990981971752 -0.95174040350349942 -0.039002293582823491 -0.044289414485197034 -0.95289526030222627 -0.03652776835209777 -0.046372448860411815 -0.9556590113717246 -0.034951882413013717 -0.047605705664521082 -0.95725628292886789 -0.03325243898636502 -0.048836547172482328 -0.9588191120745343 -0.031407386455908577 -0.050062630562141122 -0.96034958779202395 -0.029396944428309858 -0.051280867696944135 -0.96184788724877379 -0.027178049517528086 -0.052483067090126068 -0.96330753309533834 -0.024714936087704479 -0.053660768371427831 -0.96472145869312687 -0.020598270110407418 -0.055304807998654282 -0.96667687607886055 -0.019285863235498184 -0.055789143562354981 -0.96725023866118498 -0.017945667415101341 -0.056243033452468338 -0.96778535285277878 -0.01657897879069924 -0.056664427129646151 -0.96828038892444701 -0.015187408703495131 -0.057051369020961903 -0.9687335704953951 -0.013772883694413218 -0.05740199851991095 -0.96914317453322918 -0.012337645504098623 -0.057714549986410367 -0.96950753135395706 -0.009728048402828135 -0.058204372485695828 -0.9700775965022409 -0.008512852637472125 -0.058406850493982719 -0.97031282916907113 -0.0072305586269535852 -0.058588651989399609 -0.97052374355707938 -0.0058797907263685749 -0.05874403084119599 -0.97070379954335484 -0.0044659027958050147 -0.058867629570130885 -0.97084689594747486 -0.0030009782003426765 -0.058954479348472845 -0.97094737053150559 -0.0015038298100531853 -0.058999999999999997 -0.97100000000000009 -1.3823577699190182e-17 -0.058999999999999997 -0.97100000000000009 + 0 9 0.068623546075918279 7 0.11385322778022375 7 0.16474102605360236 7 0.20997857762240432 7 0.27716038835682777 7 0.31058166012672478 7 0.34959599695298682 7 0.43435960797271334 7 0.47170937571298865 7 0.51371797917399498 7 0.55105776507644233 7 0.60707195463336927 7 0.67348065683300795 7 0.71601730279657982 7 0.7792050608849922 7 0.81060844589963144 7 0.84727458560147428 7 0.88917660445463709 7 0.9502853401628707 7 0.9779735260978476 7 1 9 +7 0 0 8 149 22 -2.5004412602946946e-18 -0.058999999999999997 -0.97100000000000009 0.0049696825547834765 -0.058999999999999997 -0.97100000000000009 0.0093325834605814621 -0.058521641903140638 -0.97044661104784047 0.013101418333911055 -0.057768940923599514 -0.96957579096118907 0.016318044987109044 -0.056884732409759727 -0.96854461905122546 0.01906948829391493 -0.055965572417881422 -0.96746442248331466 0.021459334749957544 -0.055046094579629862 -0.96637530564142793 0.023628175197915435 -0.054112511302666644 -0.96526184578967589 0.027115117917322969 -0.052422703987095212 -0.96322434980512694 0.028459710217652558 -0.051720071469471732 -0.96237179612988566 0.02976290098580683 -0.050989180927233722 -0.96147864078737522 0.031024133582428753 -0.050233056775998985 -0.96054716039060528 0.032243055025160401 -0.049454671379663008 -0.95957937804799642 0.033419515988642928 -0.048656945050399046 -0.95857706336337944 0.034553570804516612 -0.047842746048658083 -0.95754173243599594 0.036873978825926829 -0.046083472533341475 -0.95527407375578577 0.038048725316158584 -0.04513504481999988 -0.95403363517083961 0.039170290381070366 -0.044173410978671897 -0.95275459602042611 0.040238974608944524 -0.043202647374945856 -0.9514382383804465 0.041254888316309996 -0.042227153094711131 -0.95008560505703521 0.04221803413686076 -0.041251699834398567 -0.94869724215565743 0.043128389610374282 -0.040281481791220958 -0.94727294165020837 0.044748367646809659 -0.038469365486382148 -0.94451229691265259 0.045468595650885534 -0.037625865585019458 -0.94318441303593925 0.046146719631528964 -0.036795294491045981 -0.94182704529598837 0.046782357068906821 -0.035982452974340863 -0.94043926117260646 0.047374697075681461 -0.035193313932941624 -0.9390199826513923 0.047922500397010827 -0.034435022393044287 -0.93756798622373483 0.048424099410548448 -0.033715895509003321 -0.93608190288681326 0.049550587268678427 -0.032049710262895457 -0.93230038017998251 0.050129335444327135 -0.031143724155592592 -0.92992113453391656 0.050587171711697701 -0.030385116549675659 -0.92745482827881653 0.050909234076023921 -0.02982616500400628 -0.92492517073122349 0.05108764048313192 -0.0295094688595939 -0.92234928085041179 0.051114653060183222 -0.02946648354440869 -0.91974066143380462 0.050984454592606476 -0.029696400111757237 -0.91712625424954852 0.050571667092538401 -0.030390433569122684 -0.91328003445904971 0.050398607788464403 -0.030678927609708615 -0.91201575620512221 0.050191230809071875 -0.031019697281673347 -0.91076798501107414 0.049951103907107719 -0.031407185364548743 -0.90953906328904077 0.04967975277356048 -0.031835931511690028 -0.90833064023374144 0.049378661037660358 -0.032300572250275793 -0.9071436718224799 0.049049270266879198 -0.032795840981307979 -0.90597842081514379 0.048277064322970839 -0.033924438878308767 -0.90349904978651274 0.047824221999431246 -0.034567578902873222 -0.90219247429430693 0.047336025571794685 -0.035239425275528168 -0.90091375497852921 0.046813757055684524 -0.03593420348992233 -0.89966195228957158 0.046258407906864529 -0.036646927311130333 -0.89843616242727675 0.04567067902123894 -0.037373398775652621 -0.89723551734093654 0.045050980734852378 -0.038110208191415522 -0.89605918472929325 0.04298386208302421 -0.040472311491245735 -0.89240172709744769 0.041429442674571985 -0.042112542209707393 -0.89002851204342892 0.039723843950829382 -0.043766328993325332 -0.88774279538247469 0.037845978677936057 -0.04542743175428051 -0.8855302407230029 0.035776145563714397 -0.047089653597723449 -0.88337931300632444 0.033469784773098483 -0.048744577336104593 -0.88128908467742306 0.030886977671371708 -0.050383840328209396 -0.8792596488973583 0.026575156672211202 -0.052697258084849576 -0.87644265037278057 0.025215819330877302 -0.053377431856473534 -0.87562087546952128 0.023816328025213974 -0.054027205764306918 -0.87484120190984704 0.022377474975260922 -0.054643590070235698 -0.87410600350496825 0.020900480807449766 -0.055223593763220544 -0.87341776271424065 0.019386994554604055 -0.055764224559296881 -0.87277907064516702 0.017839093655939268 -0.056262488901574897 -0.87219262705339695 0.01448241616914368 -0.057224788032794009 -0.87106357093369036 0.012664341512342765 -0.057677116653824106 -0.87053516949000753 0.010809888176166868 -0.058067976505772702 -0.87008017729629583 0.0089241358183845959 -0.058393460239248546 -0.86970230771010915 0.0070126212750772484 -0.058650283419937388 -0.86940471297010191 0.0050815442706897054 -0.058835913475513021 -0.86918985100419577 0.0031379731280812748 -0.058948698642548397 -0.86905935223774511 -0.00054138091153253646 -0.059022927591907727 -0.86897347361851562 -0.0022765174910491207 -0.058999775488404273 -0.86900026347695458 -0.0040097825514356401 -0.058918240199938694 -0.86909455819412695 -0.0057358409944945447 -0.058778634036795112 -0.8692560709892716 -0.0074495993323682678 -0.058581882022519426 -0.86948392608376202 -0.0091462056875392158 -0.058329521893919323 -0.86977665870110499 -0.010821049792829775 -0.058023704101064257 -0.87013221506694083 -0.014943031956337432 -0.057132380299386873 -0.87117160864390419 -0.017359824269599054 -0.056482872769331449 -0.8719313929383351 -0.019704142205801793 -0.055727633007440158 -0.87281875936088349 -0.021967840188780171 -0.054876992081749572 -0.87382410176217562 -0.024145100895452215 -0.053941465860426072 -0.87493808226173786 -0.026231435167424526 -0.052931600189871496 -0.87615181852063695 -0.028224173344926922 -0.05185811893415599 -0.87745680076066002 -0.032370727810448231 -0.049396143218409648 -0.88049170133857102 -0.034387115788041385 -0.048044834522254345 -0.88218319259053524 -0.036224385786954826 -0.046685048526312251 -0.88391612019529675 -0.037909472216589704 -0.045321518749168066 -0.88569040601290561 -0.039461649306085284 -0.043958368779218451 -0.88750868771863822 -0.040896431853979981 -0.042599418104824947 -0.88937591453588849 -0.042224214328679649 -0.041248265148776109 -0.89130101347359858 -0.044241216211312544 -0.039052147176252737 -0.89458390441154645 -0.044986702488051783 -0.038201826366864804 -0.89589422164073373 -0.0456902688892067 -0.037362056041529972 -0.8972336532744799 -0.046351640358389658 -0.036537320700094564 -0.8986029737273028 -0.046970154271562981 -0.035733170838363915 -0.90000316198502128 -0.047544760437038987 -0.034956222948102376 -0.90143540160475766 -0.048074021095479952 -0.034214159517033244 -0.90290108071493569 -0.049272250486433494 -0.032478217590645189 -0.90663108349933408 -0.049896574586265847 -0.031519457432078825 -0.90897640858956852 -0.050404251921731993 -0.030693455357571325 -0.91140905066566491 -0.050780355152930869 -0.030050019802095027 -0.91390863783241483 -0.051017324340267775 -0.029633342319333619 -0.91646111452574874 -0.051106750202303868 -0.029478768288891333 -0.91905661608140143 -0.051038617096464088 -0.029601399481094127 -0.92167758319506055 -0.050713065514755636 -0.030153445189442837 -0.92555458044792871 -0.050568214107868437 -0.030397651806103869 -0.92683091323723754 -0.050388004021440072 -0.030697753783434992 -0.92809282908922097 -0.050173896324957223 -0.031048555803700237 -0.92933742172751466 -0.049927400545448475 -0.031444704415912177 -0.93056250108092931 -0.049650074667484299 -0.031880688035831835 -0.93176659328345124 -0.049343525133177017 -0.032350836945968742 -0.93294894067424239 -0.048619295141518984 -0.033431348772318993 -0.93546455623725377 -0.048191184908312382 -0.03405290679318191 -0.93679051981852601 -0.047726863342594496 -0.034706847386681339 -0.93808818513616377 -0.047227799336003337 -0.035386883209281711 -0.93935837926847732 -0.04669514347178147 -0.036087589545400166 -0.94060196377738192 -0.046129728024776037 -0.036804404307406578 -0.94181983470839692 -0.045532066961438758 -0.037533628035623531 -0.94301292259064595 -0.04418272296743702 -0.039116718891454627 -0.94551843256300028 -0.043421561648771638 -0.039972879317022876 -0.94682306032115104 -0.042619279339682965 -0.040836461026652046 -0.94809707430208268 -0.041776146432214646 -0.041703399779020218 -0.94934113869751546 -0.040892296354600663 -0.042570011239862662 -0.95055558330011625 -0.039967725571265371 -0.043432990981971752 -0.95174040350349942 -0.039002293582823491 -0.044289414485197034 -0.95289526030222627 -0.03652776835209777 -0.046372448860411815 -0.9556590113717246 -0.034951882413013717 -0.047605705664521082 -0.95725628292886789 -0.03325243898636502 -0.048836547172482328 -0.9588191120745343 -0.031407386455908577 -0.050062630562141122 -0.96034958779202395 -0.029396944428309858 -0.051280867696944135 -0.96184788724877379 -0.027178049517528086 -0.052483067090126068 -0.96330753309533834 -0.024714936087704479 -0.053660768371427831 -0.96472145869312687 -0.020598270110407418 -0.055304807998654282 -0.96667687607886055 -0.019285863235498184 -0.055789143562354981 -0.96725023866118498 -0.017945667415101341 -0.056243033452468338 -0.96778535285277878 -0.01657897879069924 -0.056664427129646151 -0.96828038892444701 -0.015187408703495131 -0.057051369020961903 -0.9687335704953951 -0.013772883694413218 -0.05740199851991095 -0.96914317453322918 -0.012337645504098623 -0.057714549986410367 -0.96950753135395706 -0.009728048402828135 -0.058204372485695828 -0.9700775965022409 -0.008512852637472125 -0.058406850493982719 -0.97031282916907113 -0.0072305586269535852 -0.058588651989399609 -0.97052374355707938 -0.0058797907263685749 -0.05874403084119599 -0.97070379954335484 -0.0044659027958050147 -0.058867629570130885 -0.97084689594747486 -0.0030009782003426765 -0.058954479348472845 -0.97094737053150559 -0.0015038298100531853 -0.058999999999999997 -0.97100000000000009 -1.3823577699190182e-17 -0.058999999999999997 -0.97100000000000009 + 0 9 0.068623546075918279 7 0.11385322778022375 7 0.16474102605360236 7 0.20997857762240432 7 0.27716038835682777 7 0.31058166012672478 7 0.34959599695298682 7 0.43435960797271334 7 0.47170937571298865 7 0.51371797917399498 7 0.55105776507644233 7 0.60707195463336927 7 0.67348065683300795 7 0.71601730279657982 7 0.7792050608849922 7 0.81060844589963144 7 0.84727458560147428 7 0.88917660445463709 7 0.9502853401628707 7 0.9779735260978476 7 1 9 +1 0.058999999999999997 -1.4450354975104052e-17 -1.02 0 0 1 +2 0 0 -1.02 0 0 1 1 0 -0 -0 1 0 0.058999999999999997 +2 0 0 1.0299999999999998 0 0 1 1 0 -0 -0 1 0 0.058999999999999997 +1 -1.2490984808988247e-17 0 -0.97100000000000009 0 -1 0 +2 0 -0.35899999999999999 -0.92000000000000004 0 -1 0 0 -0 -1 1 0 0 0.050999999999999997 +2 0.058999999999999997 0.17999999999999999 1.03 -1 -0 -0 0 1.2335811384723965e-15 -1 0 -1 -1.2335811384723965e-15 0.17999999999999991 +2 0 0 1.0299999999999998 0 0 1 1 0 -0 -0 1 0 0.058999999999999997 +Polygon3D 0 +PolygonOnTriangulations 26 +25 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2 +p 0.00923476774347953 1 0.43213918 0.4558000475 0.479460915 0.5031217825 0.52678265 0.5504435175 0.574104385 0.5977652525 0.62142612 0.6450869875 0.668747855000001 0.692408722500001 0.716069590000001 0.739730457500001 0.763391325000001 0.787052192500001 0.810713060000001 0.834373927500001 0.858034795000001 0.881695662500001 0.905356530000001 0.929017397500001 0.952678265000001 0.976339132500001 1 +25 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2 +p 0.00923476774347953 1 0.43213918 0.4558000475 0.479460915 0.5031217825 0.52678265 0.5504435175 0.574104385 0.5977652525 0.62142612 0.6450869875 0.668747855000001 0.692408722500001 0.716069590000001 0.739730457500001 0.763391325000001 0.787052192500001 0.810713060000001 0.834373927500001 0.858034795000001 0.881695662500001 0.905356530000001 0.929017397500001 0.952678265000001 0.976339132500001 1 +19 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 1 +p 0.00923476774347953 1 0 0.026252455185 0.05250491037 0.078757365555 0.10500982074 0.131262275925 0.15751473111 0.183767186295 0.2073943959615 0.22865888466135 0.2499233733612 0.27118786206105 0.2924523507609 0.31371683946075 0.340439755720475 0.369146815465273 0.394983169235591 0.413561174617795 0.43213918 +19 2 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 1 +p 0.00923476774347953 1 0 0.026252455185 0.05250491037 0.078757365555 0.10500982074 0.131262275925 0.15751473111 0.183767186295 0.2073943959615 0.22865888466135 0.2499233733612 0.27118786206105 0.2924523507609 0.31371683946075 0.340439755720475 0.369146815465273 0.394983169235591 0.413561174617795 0.43213918 +2 2 45 +p 0.00923476774347953 1 0.0579749730487216 0.15 +2 26 44 +p 0.00923476774347953 1 0.0579749730487216 0.15 +37 44 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 45 +p 0.00923476774347953 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 0.00923476774347953 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +30 43 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 44 +p 0.00923476774347953 1 0.43213918 0.454536946990279 0.474694937281531 0.492837128543657 0.510979319805783 0.529121511067909 0.547263702330035 0.565405893592162 0.583548084854288 0.606306022432619 0.633519309325808 0.660732596218997 0.687945883112187 0.715159170005376 0.734997656150511 0.749876520759362 0.763653247249039 0.776052301089749 0.788451354930458 0.804403507587046 0.82300208834811 0.847800196029529 0.875698067171125 0.903595938312721 0.931493809454318 0.951831357516541 0.968779314235061 0.984471866752209 0.992235933376104 1 +30 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 2 +p 0.00923476774347953 1 0.43213918 0.454536946990279 0.474694937281531 0.492837128543657 0.510979319805783 0.529121511067909 0.547263702330035 0.565405893592162 0.583548084854288 0.606306022432619 0.633519309325808 0.660732596218997 0.687945883112187 0.715159170005376 0.734997656150511 0.749876520759362 0.763653247249039 0.776052301089749 0.788451354930458 0.804403507587046 0.82300208834811 0.847800196029529 0.875698067171125 0.903595938312721 0.931493809454318 0.951831357516541 0.968779314235061 0.984471866752209 0.992235933376104 1 +21 44 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 43 +p 0.00923476774347953 1 0 0.0118764833850204 0.0237529667700408 0.0395882779500679 0.0620748133866454 0.0887969010029412 0.115518988619237 0.14997384851518 0.18604866679718 0.212347209324757 0.23207111622044 0.246864046392203 0.26056120395865 0.274258361525096 0.287955519091543 0.305922393545721 0.326468129895391 0.353862445028284 0.384681049552789 0.408410114776395 0.43213918 +21 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 1 +p 0.00923476774347953 1 0 0.0118764833850204 0.0237529667700408 0.0395882779500679 0.0620748133866454 0.0887969010029412 0.115518988619237 0.14997384851518 0.18604866679718 0.212347209324757 0.23207111622044 0.246864046392203 0.26056120395865 0.274258361525096 0.287955519091543 0.305922393545721 0.326468129895391 0.353862445028284 0.384681049552789 0.408410114776395 0.43213918 +2 92 93 +p 0.00923476774347953 1 0 2.05 +2 94 130 +p 0.00923476774347953 1 0 2.05 +37 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 92 +p 0.00923476774347953 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 0.00923476774347953 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 2 +p 0.00923476774347953 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 93 +p 0.00923476774347953 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +2 2 52 +p 0.00923476774347953 1 0.059 0.359 +2 31 51 +p 0.00923476774347953 1 0.059 0.359 +37 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 52 +p 0.00923476774347953 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 0.00923476774347953 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +10 2 83 84 85 86 87 88 89 90 47 +p 0.00923476774347953 1 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 +10 1 39 40 41 42 43 44 45 46 38 +p 0.00923476774347953 1 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 +37 38 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 47 +p 0.00923476774347953 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 0.00923476774347953 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +Surfaces 9 +2 0 0 0 -0.86602540378443871 0.49999999999999994 0 -0.49999999999999994 -0.86602540378443871 0 0 0 1 0.01095 +2 0 0 -1.02 0 0 1 1 0 -0 -0 1 0 0.058999999999999997 +1 -0.12990381056766581 0.074999999999999983 0 -0.86602540378443871 0.49999999999999994 0 -0.49999999999999994 -0.86602540378443871 0 0 0 1 +2 0 0 -0.92000000000000004 0 -1 0 0 -0 -1 1 0 0 0.050999999999999997 +1 0 0 -1.02 0 0 1 1 0 -0 -0 1 0 +1 0 0 1.0299999999999998 0 0 1 1 0 -0 -0 1 0 +10 1.5707963267948966 3.1415926535897931 4.7123889803846897 10.995574287564276 +5 0 0.17999999999999999 1.03 -1 -0 -0 0 1.2335811384723965e-15 -1 0 -1 -1.2335811384723965e-15 0.17999999999999994 0.058999999999999997 +1 0 -0.35899999999999999 -0.92000000000000004 0 -1 0 0 -0 -1 1 0 0 +1 0 0 1.0299999999999998 0 0 1 1 0 -0 -0 1 0 +Triangulations 8 +80 78 1 0.000376268924912778 +-0.0452516081485031 0.0378588424682483 0.0040814575968276 -0.0556827994439111 0.0195045083529212 -2.68188791487101e-18 -0.0449440004035559 0.0382235116836225 0.00262570049051048 -0.0447698960100041 0.0384272869650782 0.00110542603751819 -0.0447389148300229 0.0384633523739504 -0.000449170664265133 -0.0448531919098233 0.0383300298578154 -0.0019871413913789 -0.045105580024204 0.0380327049849712 -0.00347342562505936 -0.0454848031023833 0.0375783538210516 -0.00488210021739919 -0.0459775466574457 0.0369738450901501 -0.00619146483789182 -0.0465698652964758 0.0362249586797729 -0.00738282626269254 -0.047248368026686 0.0353354175121701 -0.00843927704797102 -0.0480013845805218 0.0343054963285484 -0.00934413178463052 -0.0488190360477864 0.0331315819032068 -0.0100775030496812 -0.0496941060301991 0.031804022165388 -0.0106129109281069 -0.0506107030165001 0.0303241939738577 -0.0109081729382156 -0.0515286427056229 0.0287367183035625 -0.0109147757596895 -0.0523754911051059 0.027162620167044 -0.0106209414796212 -0.0531183832008893 0.0256795126330616 -0.0100617790637481 -0.0537549520923741 0.0243188227262401 -0.00927727556389322 -0.0542901464593378 0.0230993503994058 -0.00830159505060414 -0.0547300796136238 0.0220367508689649 -0.0071647244960754 -0.0550807869880959 0.0211449026646725 -0.0058940375050753 -0.0553475695844025 0.0204364021320044 -0.0045160887944694 -0.0555348534379363 0.0199218488750859 -0.00305707430934138 -0.0556459466709498 0.0196094011078699 -0.00154304428303199 -0.0556827994439111 0.0195045083529212 -2.68188791487101e-18 -0.0556368101840428 0.0196353087812375 0.00172214010649706 -0.055497941557225 0.0200244471858943 0.00340452634248419 -0.0552631325751315 0.0206636437636391 0.00501063422149639 -0.0549273164617378 0.0215404250754705 0.00650401500104318 -0.0544838122397786 0.0226387763957884 0.007848037773027 -0.0539246411121843 0.0239401982082393 0.0090053222863341 -0.0532316643852298 0.0254438587288718 0.00994579069174821 -0.0524653480959556 0.0269886499027755 0.0105699543328333 -0.0516824439453187 0.0284591810050448 0.0108846150499938 -0.05084175874558 0.0299351900515401 0.0109384060229904 -0.0499783998668212 0.0313553743935674 0.0107337671578512 -0.0491319767116209 0.0326657143430688 0.0102975318245977 -0.0483451494684189 0.0338193219571295 0.00968147301966754 -0.0474655291809326 0.0350431669744295 0.0087256840036814 -0.0466242186800716 0.036154975112239 0.00747784808900505 -0.0459738887186155 0.0369783932929608 0.00618304263635271 -0.0455786907785877 0.0374644222180483 0.00516411580486915 -0.135378810567666 0.0655170218285604 -2.681887914871e-18 -0.135378810567666 0.0655170218285604 -2.681887914871e-18 -0.135295633015408 0.0656610895751207 0.00190144754545289 -0.135048627666469 0.0660889153892243 0.00374512056941607 -0.134645299653386 0.0667875 0.005475 -0.134097903893742 0.0677356172675501 0.00703852432606761 -0.1334230727307 0.0689044591284707 0.00838818665215281 -0.132641310567666 0.0702585109142802 0.0094829781714396 -0.131776370852374 0.07175663044665 0.0102896341976057 -0.130854534340392 0.0733532981216742 0.0107836448954837 -0.129903810567666 0.075 0.01095 -0.128953086794939 0.0766467018783257 0.0107836448954837 -0.128031250282958 0.0782433695533499 0.0102896341976057 -0.127166310567666 0.0797414890857198 0.0094829781714396 -0.126384548404632 0.0810955408715293 0.00838818665215281 -0.125709717241589 0.0822643827324499 0.00703852432606761 -0.125162321481946 0.0832125 0.00547500000000001 -0.124758993468863 0.0839110846107756 0.00374512056941608 -0.124511988119924 0.0843389104248792 0.0019014475454529 -0.124428810567666 0.0844829781714396 1.59292745010101e-17 -0.124511988119924 0.0843389104248792 -0.00190144754545287 -0.124758993468863 0.0839110846107756 -0.00374512056941605 -0.125162321481946 0.0832125 -0.00547499999999998 -0.125709717241589 0.0822643827324499 -0.00703852432606759 -0.126384548404632 0.0810955408715293 -0.00838818665215279 -0.127166310567666 0.0797414890857198 -0.00948297817143959 -0.128031250282958 0.07824336955335 -0.0102896341976057 -0.128953086794939 0.0766467018783258 -0.0107836448954837 -0.129903810567666 0.075 -0.01095 -0.130854534340392 0.0733532981216743 -0.0107836448954837 -0.131776370852374 0.0717566304466501 -0.0102896341976057 -0.132641310567666 0.0702585109142802 -0.00948297817143962 -0.1334230727307 0.0689044591284707 -0.00838818665215284 -0.134097903893742 0.0677356172675501 -0.00703852432606764 -0.134645299653386 0.0667875 -0.00547500000000004 -0.135048627666469 0.0660889153892244 -0.00374512056941612 -0.135295633015408 0.0656610895751207 -0.00190144754545294 2.75963703894503 0.0581184634528269 6.28318530717959 0.0579749730487216 2.89944317338102 0.0580344019389888 3.04046815805553 0.0579855107519902 3.18262436348129 0.0579767129675233 3.32407786376826 0.0580090185636334 3.46437644984295 0.0580789306458782 3.60372069338022 0.058180171883323 3.74254779763238 0.0583046459541074 3.88151524929184 0.0584431657374539 4.02154764284867 0.0585859957545515 4.16396143309765 0.0587231666278327 4.31049018803561 0.0588443163572547 4.46361741324672 0.0589383693232038 4.62495609786821 0.0589922515026077 4.7926205414376 0.0589934727573824 4.958164219686 0.0589398159162296 5.11794306680756 0.0588416255764575 5.27241798796126 0.0587125654543315 5.4227345379512 0.0585663212086673 5.56991187711454 0.0584160147310254 5.71480438213952 0.0582738121244667 5.8580673344795 0.0581506023638217 6.00024024714361 0.0580555183102414 6.14179737528635 0.0579955039886116 0 0.0579749730487216 0.15792875676578 0.0580005453955325 0.31615626326444 0.0580748508392481 0.47528535461951 0.0581910985845908 0.635989617730726 0.0583386639553074 0.799081436498103 0.0585037536925641 0.965623538480676 0.05867020819723 1.13918123435821 0.0588219030077722 1.30656170677688 0.0589306492208789 1.46146012512916 0.0589878998888336 1.61681749627376 0.0589978496725219 1.76985745149836 0.0589602511219476 1.91774714421665 0.0588823971419436 2.05691513021045 0.0587777885679713 2.21950260159839 0.0586279375619739 2.3898558635916 0.0584552453646625 2.5415697436497 0.0583037521875602 2.65047832487738 0.0582045151945166 0 0.15 6.28318530717959 0.15 0.174532925199433 0.15 0.349065850398866 0.15 0.523598775598299 0.15 0.698131700797732 0.15 0.872664625997165 0.15 1.0471975511966 0.15 1.22173047639603 0.15 1.39626340159546 0.15 1.5707963267949 0.15 1.74532925199433 0.15 1.91986217719376 0.15 2.0943951023932 0.15 2.26892802759263 0.15 2.44346095279206 0.15 2.61799387799149 0.15 2.79252680319093 0.15 2.96705972839036 0.15 3.14159265358979 0.15 3.31612557878922 0.15 3.49065850398866 0.15 3.66519142918809 0.15 3.83972435438752 0.15 4.01425727958696 0.15 4.18879020478639 0.15 4.36332312998582 0.15 4.53785605518525 0.15 4.71238898038469 0.15 4.88692190558412 0.15 5.06145483078355 0.15 5.23598775598299 0.15 5.41052068118242 0.15 5.58505360638185 0.15 5.75958653158128 0.15 5.93411945678072 0.15 6.10865238198015 0.15 67 12 13 67 66 12 68 67 13 69 13 14 69 68 13 70 14 15 70 69 14 71 70 15 72 15 16 72 71 15 73 72 16 74 16 17 74 73 16 75 17 18 75 74 17 76 75 18 77 18 19 77 76 18 78 77 19 78 19 20 79 20 21 79 21 22 79 78 20 80 22 23 80 23 24 80 79 22 45 24 25 45 25 2 45 80 24 44 26 27 44 27 28 46 28 29 46 29 30 46 44 28 47 30 31 47 46 30 48 31 32 48 47 31 49 48 32 49 32 33 50 49 33 51 50 33 51 33 34 52 34 35 52 51 34 53 52 35 54 35 36 54 53 35 55 54 36 55 36 37 56 55 37 57 37 38 57 56 37 58 38 39 58 57 38 59 58 39 59 39 40 60 59 40 60 40 41 61 41 42 61 60 41 62 61 42 62 42 43 62 43 1 63 1 3 63 62 1 63 3 4 63 4 5 63 5 6 63 6 7 64 63 7 64 7 8 64 8 9 65 9 10 65 10 11 65 64 9 66 65 11 66 11 12 +1922 3681 1 0.00114041616427305 +-0.0452516081485031 0.0378588424682483 0.0040814575968276 -0.0556827994439111 0.0195045083529212 -2.68188791487101e-18 -0.0449440004035559 0.0382235116836225 0.00262570049051048 -0.0447698960100041 0.0384272869650782 0.00110542603751819 -0.0447389148300229 0.0384633523739504 -0.000449170664265133 -0.0448531919098233 0.0383300298578154 -0.0019871413913789 -0.045105580024204 0.0380327049849712 -0.00347342562505936 -0.0454848031023833 0.0375783538210516 -0.00488210021739919 -0.0459775466574457 0.0369738450901501 -0.00619146483789182 -0.0465698652964758 0.0362249586797729 -0.00738282626269254 -0.047248368026686 0.0353354175121701 -0.00843927704797102 -0.0480013845805218 0.0343054963285484 -0.00934413178463052 -0.0488190360477864 0.0331315819032068 -0.0100775030496812 -0.0496941060301991 0.031804022165388 -0.0106129109281069 -0.0506107030165001 0.0303241939738577 -0.0109081729382156 -0.0515286427056229 0.0287367183035625 -0.0109147757596895 -0.0523754911051059 0.027162620167044 -0.0106209414796212 -0.0531183832008893 0.0256795126330616 -0.0100617790637481 -0.0537549520923741 0.0243188227262401 -0.00927727556389322 -0.0542901464593378 0.0230993503994058 -0.00830159505060414 -0.0547300796136238 0.0220367508689649 -0.0071647244960754 -0.0550807869880959 0.0211449026646725 -0.0058940375050753 -0.0553475695844025 0.0204364021320044 -0.0045160887944694 -0.0555348534379363 0.0199218488750859 -0.00305707430934138 -0.0556459466709498 0.0196094011078699 -0.00154304428303199 -0.0556368101840428 0.0196353087812375 0.00172214010649706 -0.055497941557225 0.0200244471858943 0.00340452634248419 -0.0552631325751315 0.0206636437636391 0.00501063422149639 -0.0549273164617378 0.0215404250754705 0.00650401500104318 -0.0544838122397786 0.0226387763957884 0.007848037773027 -0.0539246411121843 0.0239401982082393 0.0090053222863341 -0.0532316643852298 0.0254438587288718 0.00994579069174821 -0.0524653480959556 0.0269886499027755 0.0105699543328333 -0.0516824439453187 0.0284591810050448 0.0108846150499938 -0.05084175874558 0.0299351900515401 0.0109384060229904 -0.0499783998668212 0.0313553743935674 0.0107337671578512 -0.0491319767116209 0.0326657143430688 0.0102975318245977 -0.0483451494684189 0.0338193219571295 0.00968147301966754 -0.0474655291809326 0.0350431669744295 0.0087256840036814 -0.0466242186800716 0.036154975112239 0.00747784808900505 -0.0459738887186155 0.0369783932929608 0.00618304263635271 -0.0455786907785877 0.0374644222180483 0.00516411580486915 0.0285134526101169 -0.0516525230498979 -0.877715450616494 -1.24909848089882e-17 -0.059 -0.971 0.0218689537628893 -0.0547973342071952 -0.873926714079115 0.0152432943309105 -0.0569968566883178 -0.871331307133653 0.00885408422920787 -0.0583318593736884 -0.869774450376816 0.00220533221989951 -0.0589587672676645 -0.869047706339065 -0.00452021703437581 -0.0588265763530881 -0.869200725542687 -0.0111222730604825 -0.057942178304755 -0.870227558960192 -0.0174212632071157 -0.0563693147096274 -0.872067759914168 -0.0232858016806991 -0.0542104365049165 -0.874626313499237 -0.0299133744109193 -0.0508545968961581 -0.878693946864086 -0.0364055526574153 -0.0464288249269798 -0.884283956254603 -0.0414604911606737 -0.0419765142239933 -0.890301047998437 -0.0454599405573964 -0.0376085023052696 -0.896883095205712 -0.048477768906044 -0.0336289431418361 -0.904159988127683 -0.0500125776174735 -0.0313008361062597 -0.910012892931646 -0.0507223820320063 -0.0301370159352354 -0.914685889739203 -0.0509929846912805 -0.0296768550886756 -0.919154017069977 -0.0508974922470173 -0.0298403260381806 -0.923231887915664 -0.0504793502812316 -0.0305424952164638 -0.927268264580091 -0.0495067029638172 -0.032094840909959 -0.932251274982488 -0.0478365171105765 -0.0345349752083268 -0.93768239459427 -0.0448299575819992 -0.0383572010050282 -0.944316145473221 -0.0404672041100315 -0.0429349454880199 -0.951038720348503 -0.0350437353916528 -0.0474651119056726 -0.957053162381158 -0.0280326393130683 -0.0519150376126295 -0.962604825208043 -0.021306012776011 -0.0550186720678838 -0.966336316913799 -0.0146841640586707 -0.0571434367699638 -0.96884027478942 -0.00800353134517232 -0.0584555058032915 -0.970369082432513 -0.00416203854328149 -0.058852336496355 -0.970829113665653 0.00637745658187731 -0.058654309018953 -0.970599683375865 0.0117874105676248 -0.0578105272001434 -0.969619119931822 0.0176689960460276 -0.0562921525018941 -0.967841471905639 0.0241008386445522 -0.0538530347922422 -0.964946071751388 0.0304430307465949 -0.0505393060003243 -0.960917241815508 0.0359655758325551 -0.0467704754890113 -0.956159057637936 0.0418706266966591 -0.0415674240281568 -0.94911788161083 0.0465956891649289 -0.0361917466377736 -0.940732602679552 0.0490639245669559 -0.0327678395054133 -0.933918738986464 0.0503181951744449 -0.030807129660349 -0.928311391809156 0.0508522668789505 -0.0299173353680219 -0.923879041668047 0.0509989666893943 -0.0296665701997348 -0.919675378553317 0.0507964095118238 -0.0300120774554979 -0.915447550387328 0.0502525012386535 -0.030914281417931 -0.911300614417913 0.0490754922156223 -0.0327504516820192 -0.906121929969831 0.0471720570893195 -0.0354371925332016 -0.900614516307052 0.0438194866264632 -0.0395076238297127 -0.893906851632219 0.0389820442404017 -0.0442876957323281 -0.887115352553105 0.0343171875743088 -0.0479930267907713 -0.882272945563165 0.059 -1.44503549751041e-17 -1.02 0.059 -1.44503549751041e-17 1.03 0.059 -1.44503549751041e-17 -1.02 0.0581036574277203 0.0102452424823489 -1.02 0.0554418646263686 0.0201791884562145 -1.02 0.0510954988232819 0.0295 -1.02 0.0451966221440197 0.0379244689715058 -1.02 0.0379244689715058 0.0451966221440197 -1.02 0.0295 0.0510954988232819 -1.02 0.0201791884562145 0.0554418646263686 -1.02 0.0102452424823489 0.0581036574277203 -1.02 3.61258874377601e-18 0.059 -1.02 -0.0102452424823489 0.0581036574277203 -1.02 -0.0201791884562145 0.0554418646263686 -1.02 -0.0295 0.0510954988232819 -1.02 -0.0379244689715058 0.0451966221440197 -1.02 -0.0451966221440197 0.0379244689715058 -1.02 -0.0510954988232819 0.0295 -1.02 -0.0554418646263686 0.0201791884562145 -1.02 -0.0581036574277203 0.010245242482349 -1.02 -0.059 8.58289676310131e-17 -1.02 -0.0581036574277203 -0.0102452424823488 -1.02 -0.0554418646263686 -0.0201791884562144 -1.02 -0.0510954988232819 -0.0294999999999999 -1.02 -0.0451966221440198 -0.0379244689715057 -1.02 -0.0379244689715059 -0.0451966221440196 -1.02 -0.0295000000000001 -0.0510954988232818 -1.02 -0.0201791884562146 -0.0554418646263685 -1.02 -0.010245242482349 -0.0581036574277202 -1.02 -1.6804534651825e-16 -0.059 -1.02 0.0102452424823487 -0.0581036574277203 -1.02 0.0201791884562143 -0.0554418646263687 -1.02 0.0294999999999998 -0.051095498823282 -1.02 0.0379244689715056 -0.0451966221440198 -1.02 0.0451966221440196 -0.037924468971506 -1.02 0.0510954988232818 -0.0295000000000002 -1.02 0.0554418646263685 -0.0201791884562147 -1.02 0.0581036574277202 -0.0102452424823492 -1.02 0.059 -1.44503549751041e-17 1.03 0.0581036574277203 0.0102452424823489 1.03 0.0554418646263686 0.0201791884562145 1.03 0.0510954988232819 0.0295 1.03 0.0451966221440197 0.0379244689715058 1.03 0.0379244689715058 0.0451966221440197 1.03 0.0295 0.0510954988232819 1.03 0.0201791884562145 0.0554418646263686 1.03 0.0102452424823489 0.0581036574277203 1.03 3.61258874377601e-18 0.059 1.03 -0.0102452424823489 0.0581036574277203 1.03 -0.0201791884562145 0.0554418646263686 1.03 -0.0295 0.0510954988232819 1.03 -0.0379244689715058 0.0451966221440197 1.03 -0.0451966221440197 0.0379244689715058 1.03 -0.0510954988232819 0.0295 1.03 -0.0554418646263686 0.0201791884562145 1.03 -0.0581036574277203 0.010245242482349 1.03 -0.059 8.58289676310131e-17 1.03 -0.0581036574277203 -0.0102452424823488 1.03 -0.0554418646263686 -0.0201791884562144 1.03 -0.0510954988232819 -0.0294999999999999 1.03 -0.0451966221440198 -0.0379244689715057 1.03 -0.0379244689715059 -0.0451966221440196 1.03 -0.0295000000000001 -0.0510954988232818 1.03 -0.0201791884562146 -0.0554418646263685 1.03 -0.010245242482349 -0.0581036574277202 1.03 -1.6804534651825e-16 -0.059 1.03 0.0102452424823487 -0.0581036574277203 1.03 0.0201791884562143 -0.0554418646263687 1.03 0.0294999999999998 -0.051095498823282 1.03 0.0379244689715056 -0.0451966221440198 1.03 0.0451966221440196 -0.037924468971506 1.03 0.0510954988232818 -0.0295000000000002 1.03 0.0554418646263685 -0.0201791884562147 1.03 0.0581036574277202 -0.0102452424823492 1.03 -0.00487218138286763 -0.0587984850873935 -0.200000000000001 -0.0237000300545252 -0.0540306262726484 -0.2205 -0.00487218138286763 -0.0587984850873935 -0.2205 -0.0581953169007606 0.00971108082656331 -0.6305 -0.0518889513211828 0.0280808961891873 -0.651 -0.0581953169007606 0.00971108082656331 -0.651 -0.0518889513211828 0.0280808961891873 -0.6305 -0.0237000300545252 -0.0540306262726484 -0.200000000000001 -0.0581953169007606 0.00971108082656331 0.763499999999998 -0.0518889513211828 0.0280808961891873 0.763499999999998 -0.0518889513211828 0.0280808961891873 0.742999999999998 -0.0518889513211828 0.0280808961891873 -0.61 -0.0399596127259187 0.0434077107297148 -0.6305 -0.0237000300545252 -0.0540306262726484 -0.179500000000001 -0.0399596127259187 -0.0434077107297148 -0.200000000000001 -0.0399596127259187 0.0434077107297148 -0.61 -0.0581953169007606 0.00971108082656331 0.742999999999998 -0.0399596127259187 -0.0434077107297148 -0.179500000000001 -0.0518889513211828 0.0280808961891873 0.783999999999998 -0.0399596127259187 0.0434077107297148 0.763499999999998 -0.0399596127259187 0.0434077107297148 -0.5895 -0.0237000300545252 0.0540306262726484 -0.5895 -0.0237000300545252 0.0540306262726484 -0.61 -0.0399596127259187 -0.0434077107297148 -0.159000000000001 -0.0518889513211829 -0.0280808961891873 -0.179500000000001 -0.0518889513211829 -0.0280808961891873 -0.159000000000001 -0.0399596127259187 0.0434077107297148 0.783999999999998 -0.0237000300545252 0.0540306262726484 -0.569 -0.0048721813828676 0.0587984850873935 -0.569 -0.0048721813828676 0.0587984850873935 -0.5895 -0.0399596127259187 0.0434077107297148 0.804499999999998 -0.0237000300545252 0.0540306262726484 0.804499999999998 -0.0237000300545252 0.0540306262726484 0.783999999999998 -0.0518889513211829 -0.0280808961891873 -0.138500000000001 -0.0581953169007606 -0.00971108082656329 -0.159000000000001 -0.0581953169007606 -0.00971108082656329 -0.138500000000001 -0.0581953169007606 -0.00971108082656329 -0.118000000000001 -0.0581953169007606 0.00971108082656331 -0.118000000000001 -0.0581953169007606 0.00971108082656331 -0.138500000000001 -0.0048721813828676 0.0587984850873935 -0.5485 0.0144836437413072 0.0571946156904205 -0.569 0.0144836437413072 0.0571946156904205 -0.5485 -0.0237000300545252 0.0540306262726484 0.824999999999998 -0.0048721813828676 0.0587984850873935 0.804499999999998 -0.0581953169007606 0.00971108082656331 -0.0975000000000007 -0.0518889513211828 0.0280808961891873 -0.0975000000000007 -0.0518889513211828 0.0280808961891873 -0.118000000000001 0.0558032172603374 0.0191572686830763 0.476499999999998 0.0558032172603374 0.0191572686830763 0.455999999999998 0.0144836437413072 0.0571946156904205 -0.528 0.0322699413292232 0.0493928222174892 -0.528 0.0322699413292232 0.0493928222174892 -0.5485 0.0558032172603374 -0.0191572686830763 0.148499999999999 0.0465592900543872 -0.0362385500486904 0.148499999999999 0.0465592900543872 -0.0362385500486904 0.127999999999999 0.0558032172603374 -0.0191572686830763 0.127999999999999 -0.0048721813828676 0.0587984850873935 0.824999999999998 0.0465592900543872 -0.0362385500486904 0.168999999999999 0.0322699413292232 -0.0493928222174892 0.148499999999999 0.0322699413292232 0.0493928222174892 -0.5075 0.0465592900543872 0.0362385500486904 -0.528 0.0465592900543872 0.0362385500486904 -0.5075 0.0322699413292232 -0.0493928222174892 0.168999999999999 -0.0048721813828676 0.0587984850873935 0.845499999999998 0.0144836437413072 0.0571946156904205 0.824999999999998 -0.0518889513211828 0.0280808961891873 -0.0770000000000007 -0.0399596127259187 0.0434077107297148 -0.0770000000000007 -0.0399596127259187 0.0434077107297148 -0.0975000000000007 0.0144836437413072 0.0571946156904205 0.845499999999998 0.0144836437413072 0.0571946156904205 0.865999999999998 0.0322699413292232 0.0493928222174892 0.845499999999998 0.0322699413292232 -0.0493928222174892 0.189499999999999 0.0144836437413071 -0.0571946156904205 0.189499999999999 0.0144836437413071 -0.0571946156904205 0.168999999999999 0.0465592900543872 0.0362385500486904 -0.487 0.0558032172603374 0.0191572686830763 -0.5075 0.0558032172603374 0.0191572686830763 -0.487 0.0144836437413071 -0.0571946156904205 0.209999999999999 -0.00487218138286763 -0.0587984850873935 0.189499999999999 -0.0399596127259187 0.0434077107297148 -0.0565000000000008 -0.0237000300545252 0.0540306262726484 -0.0770000000000007 0.0322699413292232 0.0493928222174892 0.865999999999998 -0.00487218138286763 -0.0587984850873935 0.209999999999999 -0.0237000300545252 0.0540306262726484 -0.0565000000000008 0.0322699413292232 0.0493928222174892 0.886499999999998 0.0465592900543872 0.0362385500486904 0.865999999999998 0.0465592900543872 0.0362385500486904 0.886499999999998 -0.00487218138286763 -0.0587984850873935 0.230499999999999 -0.0237000300545252 -0.0540306262726484 0.209999999999999 -0.0237000300545252 -0.0540306262726484 0.230499999999999 0.0558032172603374 0.0191572686830763 -0.4665 -0.0237000300545252 0.0540306262726484 -0.0360000000000008 -0.0048721813828676 0.0587984850873935 -0.0565000000000008 0.0465592900543872 0.0362385500486904 0.906999999999998 0.0558032172603374 0.0191572686830763 0.906999999999998 0.0558032172603374 0.0191572686830763 0.886499999999998 -0.0048721813828676 0.0587984850873935 -0.0360000000000008 -0.0237000300545252 -0.0540306262726484 0.250999999999999 -0.0399596127259187 -0.0434077107297148 0.230499999999999 -0.0399596127259187 -0.0434077107297148 0.250999999999999 -0.0399596127259187 -0.0434077107297148 0.271499999999999 -0.0518889513211829 -0.0280808961891873 0.250999999999999 -0.0048721813828676 0.0587984850873935 -0.0155000000000007 0.0144836437413072 0.0571946156904205 -0.0155000000000007 0.0144836437413072 0.0571946156904205 -0.0360000000000008 0.0558032172603374 -0.0191572686830763 -0.7945 0.0558032172603374 -0.0191572686830763 -0.815 -0.0518889513211829 -0.0280808961891873 0.271499999999999 0.0465592900543872 -0.0362385500486904 -0.815 0.0465592900543872 -0.0362385500486904 -0.7945 0.0465592900543872 -0.0362385500486904 -0.774 0.0322699413292232 -0.0493928222174892 -0.774 0.0322699413292232 -0.0493928222174892 -0.7945 -0.0518889513211829 -0.0280808961891873 0.291999999999999 -0.0581953169007606 -0.00971108082656329 0.291999999999999 -0.0581953169007606 -0.00971108082656329 0.271499999999999 0.0144836437413072 0.0571946156904205 0.00499999999999923 0.0322699413292232 0.0493928222174892 0.00499999999999923 0.0322699413292232 0.0493928222174892 -0.0155000000000007 0.0558032172603374 0.0191572686830763 0.927499999999998 0.0558032172603374 -0.0191572686830763 0.599499999999998 0.0558032172603374 -0.0191572686830763 0.578999999999998 -0.0581953169007606 -0.00971108082656329 0.312499999999999 -0.0581953169007606 0.00971108082656331 0.291999999999999 0.0465592900543872 -0.0362385500486904 0.599499999999998 0.0465592900543872 -0.0362385500486904 0.578999999999998 0.0322699413292232 -0.0493928222174892 -0.7535 0.0144836437413071 -0.0571946156904205 -0.774 -0.0581953169007606 0.00971108082656331 0.312499999999999 0.0465592900543872 -0.0362385500486904 0.619999999999998 0.0322699413292232 -0.0493928222174892 0.619999999999998 0.0322699413292232 -0.0493928222174892 0.599499999999998 -0.0581953169007606 0.00971108082656331 0.332999999999999 -0.0518889513211828 0.0280808961891873 0.312499999999999 -0.0518889513211828 0.0280808961891873 0.332999999999999 0.0144836437413071 -0.0571946156904205 -0.7535 0.0322699413292232 0.0493928222174892 0.0254999999999992 0.0465592900543872 0.0362385500486904 0.0254999999999992 0.0465592900543872 0.0362385500486904 0.00499999999999923 0.0144836437413071 -0.0571946156904205 -0.733 -0.00487218138286763 -0.0587984850873935 -0.7535 0.0322699413292232 -0.0493928222174892 0.640499999999998 0.0144836437413071 -0.0571946156904205 0.619999999999998 0.0465592900543872 0.0362385500486904 0.0459999999999992 0.0558032172603374 0.0191572686830763 0.0254999999999992 0.0144836437413071 -0.0571946156904205 0.640499999999998 0.0144836437413071 -0.0571946156904205 0.660999999999998 -0.00487218138286763 -0.0587984850873935 0.640499999999998 -0.0518889513211828 0.0280808961891873 0.353499999999999 -0.0399596127259187 0.0434077107297148 0.353499999999999 -0.0399596127259187 0.0434077107297148 0.332999999999999 -0.00487218138286763 -0.0587984850873935 -0.733 -0.00487218138286763 -0.0587984850873935 0.660999999999998 -0.00487218138286763 -0.0587984850873935 -0.7125 -0.0237000300545252 -0.0540306262726484 -0.733 -0.00487218138286763 -0.0587984850873935 0.681499999999998 -0.0237000300545252 -0.0540306262726484 0.681499999999998 -0.0237000300545252 -0.0540306262726484 0.660999999999998 0.0558032172603374 0.0191572686830763 0.0459999999999992 -0.0237000300545252 -0.0540306262726484 -0.7125 -0.0237000300545252 -0.0540306262726484 -0.692 -0.0399596127259187 -0.0434077107297148 -0.692 -0.0399596127259187 -0.0434077107297148 -0.7125 -0.0399596127259187 0.0434077107297148 0.373999999999999 -0.0237000300545252 0.0540306262726484 0.373999999999999 -0.0237000300545252 0.0540306262726484 0.353499999999999 -0.0237000300545252 -0.0540306262726484 0.701999999999998 -0.0399596127259187 -0.0434077107297148 0.681499999999998 -0.0237000300545252 0.0540306262726484 0.394499999999999 -0.0048721813828676 0.0587984850873935 0.373999999999999 -0.0048721813828676 0.0587984850873935 0.394499999999999 -0.0399596127259187 -0.0434077107297148 0.701999999999998 -0.0399596127259187 -0.0434077107297148 -0.6715 -0.0518889513211829 -0.0280808961891873 -0.6715 -0.0518889513211829 -0.0280808961891873 -0.692 -0.0518889513211829 -0.0280808961891873 -0.651 -0.0581953169007606 -0.00971108082656329 -0.6715 -0.0581953169007606 -0.00971108082656329 -0.651 -0.0399596127259187 -0.0434077107297148 0.722499999999998 -0.0518889513211829 -0.0280808961891873 0.701999999999998 -0.0518889513211829 -0.0280808961891873 0.722499999999998 -0.0048721813828676 0.0587984850873935 0.414999999999998 0.0144836437413072 0.0571946156904205 0.414999999999998 0.0144836437413072 0.0571946156904205 0.394499999999999 -0.0518889513211829 -0.0280808961891873 0.742999999999998 -0.0581953169007606 -0.00971108082656329 0.742999999999998 -0.0581953169007606 -0.00971108082656329 0.722499999999998 -0.0581953169007606 -0.00971108082656329 -0.6305 0.0558032172603374 0.0191572686830763 0.0664999999999991 -0.0581953169007606 0.00971108082656331 -0.61 -0.0581953169007606 -0.00971108082656329 0.763499999999998 0.0558032172603374 -0.0191572686830763 -0.2615 0.0465592900543872 -0.0362385500486904 -0.282 0.0558032172603374 -0.0191572686830763 -0.282 0.0144836437413072 0.0571946156904205 0.435499999999998 0.0322699413292232 0.0493928222174892 0.414999999999998 0.0322699413292232 0.0493928222174892 0.435499999999998 0.0465592900543872 -0.0362385500486904 -0.2615 -0.0581953169007606 0.00971108082656331 0.783999999999998 -0.0518889513211828 0.0280808961891873 -0.5895 0.0465592900543872 -0.0362385500486904 -0.241 0.0322699413292232 -0.0493928222174892 -0.2615 0.0322699413292232 -0.0493928222174892 -0.241 -0.0399596127259187 0.0434077107297148 -0.569 0.0322699413292232 0.0493928222174892 0.455999999999998 0.0465592900543872 0.0362385500486904 0.455999999999998 0.0465592900543872 0.0362385500486904 0.435499999999998 0.0322699413292232 -0.0493928222174892 -0.2205 0.0144836437413071 -0.0571946156904205 -0.241 -0.0518889513211828 0.0280808961891873 0.804499999999998 0.0144836437413071 -0.0571946156904205 -0.2205 -0.0237000300545252 0.0540306262726484 -0.5485 0.0465592900543872 0.0362385500486904 0.476499999999998 0.0144836437413071 -0.0571946156904205 -0.200000000000001 -0.0048721813828676 0.0587984850873935 -0.528 -0.00487218138286763 -0.0587984850873935 -0.179500000000001 -0.0399596127259187 0.0434077107297148 0.824999999999998 0.0144836437413072 0.0571946156904205 -0.5075 -0.0237000300545252 -0.0540306262726484 -0.159000000000001 0.0322699413292232 0.0493928222174892 -0.487 -0.0399596127259187 -0.0434077107297148 -0.138500000000001 -0.0237000300545252 0.0540306262726484 0.845499999999998 -0.0048721813828676 0.0587984850873935 0.865999999999998 -0.0518889513211829 -0.0280808961891873 -0.118000000000001 0.0558032172603374 0.0191572686830763 0.496999999999998 0.0465592900543872 0.0362385500486904 -0.4665 0.0144836437413072 0.0571946156904205 0.886499999999998 -0.0581953169007606 -0.00971108082656329 -0.0975000000000007 0.0558032172603374 0.0191572686830763 -0.446 -0.0581953169007606 0.00971108082656331 -0.0770000000000007 0.0322699413292232 0.0493928222174892 0.906999999999998 0.0558032172603374 -0.0191572686830763 0.168999999999999 0.0558032172603374 -0.0191572686830763 -0.774 0.0465592900543872 -0.0362385500486904 0.189499999999999 -0.0518889513211828 0.0280808961891873 -0.0565000000000008 0.0465592900543872 0.0362385500486904 0.927499999999998 0.0465592900543872 -0.0362385500486904 -0.7535 0.0322699413292232 -0.0493928222174892 0.209999999999999 0.0322699413292232 -0.0493928222174892 -0.733 0.0144836437413071 -0.0571946156904205 0.230499999999999 0.0558032172603374 0.0191572686830763 0.947999999999998 -0.0399596127259187 0.0434077107297148 -0.0360000000000008 0.0558032172603374 -0.0191572686830763 0.619999999999998 0.0144836437413071 -0.0571946156904205 -0.7125 -0.00487218138286763 -0.0587984850873935 0.250999999999999 0.0465592900543872 -0.0362385500486904 0.640499999999998 -0.0237000300545252 0.0540306262726484 -0.0155000000000007 -0.0237000300545252 -0.0540306262726484 0.271499999999999 0.0322699413292232 -0.0493928222174892 0.660999999999998 -0.00487218138286763 -0.0587984850873935 -0.692 -0.0399596127259187 -0.0434077107297148 0.291999999999999 -0.0048721813828676 0.0587984850873935 0.00499999999999923 0.0144836437413071 -0.0571946156904205 0.681499999999998 -0.0518889513211829 -0.0280808961891873 0.312499999999999 -0.0237000300545252 -0.0540306262726484 -0.6715 -0.00487218138286763 -0.0587984850873935 0.701999999999998 0.0144836437413072 0.0571946156904205 0.0254999999999992 -0.0581953169007606 -0.00971108082656329 0.332999999999999 -0.0237000300545252 -0.0540306262726484 0.722499999999998 -0.0399596127259187 -0.0434077107297148 -0.651 -0.0518889513211829 -0.0280808961891873 -0.6305 0.0322699413292232 0.0493928222174892 0.0459999999999992 -0.0581953169007606 0.00971108082656331 0.353499999999999 -0.0399596127259187 -0.0434077107297148 0.742999999999998 -0.0518889513211828 0.0280808961891873 0.373999999999999 -0.0581953169007606 -0.00971108082656329 -0.61 0.0465592900543872 0.0362385500486904 0.0664999999999991 -0.0518889513211829 -0.0280808961891873 0.763499999999998 -0.0581953169007606 0.00971108082656331 -0.5895 -0.0399596127259187 0.0434077107297148 0.394499999999999 -0.0581953169007606 -0.00971108082656329 0.783999999999998 -0.0518889513211828 0.0280808961891873 -0.569 -0.0237000300545252 0.0540306262726484 0.414999999999998 -0.0399596127259187 0.0434077107297148 -0.5485 -0.0048721813828676 0.0587984850873935 0.435499999999998 -0.0237000300545252 0.0540306262726484 -0.528 -0.0581953169007606 0.00971108082656331 0.804499999999998 -0.0048721813828676 0.0587984850873935 -0.5075 -0.0518889513211828 0.0280808961891873 0.824999999999998 0.0144836437413072 0.0571946156904205 0.455999999999998 0.0144836437413072 0.0571946156904205 -0.487 0.0558032172603374 0.0191572686830763 0.0869999999999991 -0.0399596127259187 0.0434077107297148 0.845499999999998 0.0558032172603374 -0.0191572686830763 -0.241 0.0322699413292232 0.0493928222174892 -0.4665 0.0465592900543872 0.0362385500486904 -0.446 -0.0237000300545252 0.0540306262726484 0.865999999999998 0.0322699413292232 0.0493928222174892 0.476499999999998 0.0465592900543872 -0.0362385500486904 -0.2205 -0.0048721813828676 0.0587984850873935 0.886499999999998 0.0322699413292232 -0.0493928222174892 -0.200000000000001 0.0465592900543872 0.0362385500486904 0.496999999999998 0.0144836437413072 0.0571946156904205 0.906999999999998 0.0558032172603374 0.0191572686830763 -0.4255 0.0144836437413071 -0.0571946156904205 -0.179500000000001 0.0558032172603374 -0.0191572686830763 -0.7535 0.0322699413292232 0.0493928222174892 0.927499999999998 -0.00487218138286763 -0.0587984850873935 -0.159000000000001 0.0465592900543872 -0.0362385500486904 -0.733 0.0465592900543872 0.0362385500486904 0.947999999999998 -0.0237000300545252 -0.0540306262726484 -0.138500000000001 0.0322699413292232 -0.0493928222174892 -0.7125 -0.0399596127259187 -0.0434077107297148 -0.118000000000001 0.0144836437413071 -0.0571946156904205 -0.692 -0.0518889513211829 -0.0280808961891873 -0.0975000000000007 0.0558032172603374 0.0191572686830763 0.968499999999997 0.0558032172603374 -0.0191572686830763 0.640499999999998 0.0558032172603374 0.0191572686830763 0.517499999999998 0.0465592900543872 -0.0362385500486904 0.660999999999998 -0.00487218138286763 -0.0587984850873935 -0.6715 0.0558032172603374 -0.0191572686830763 0.189499999999999 0.0322699413292232 -0.0493928222174892 0.681499999999998 -0.0581953169007606 -0.00971108082656329 -0.0770000000000007 -0.0237000300545252 -0.0540306262726484 -0.651 -0.0581953169007606 0.00971108082656331 -0.0565000000000008 0.0465592900543872 -0.0362385500486904 0.209999999999999 0.0144836437413071 -0.0571946156904205 0.701999999999998 0.0322699413292232 -0.0493928222174892 0.230499999999999 -0.0399596127259187 -0.0434077107297148 -0.6305 -0.00487218138286763 -0.0587984850873935 0.722499999999998 0.0144836437413071 -0.0571946156904205 0.250999999999999 -0.0518889513211829 -0.0280808961891873 -0.61 -0.0237000300545252 -0.0540306262726484 0.742999999999998 -0.0518889513211828 0.0280808961891873 -0.0360000000000008 -0.00487218138286763 -0.0587984850873935 0.271499999999999 -0.0399596127259187 0.0434077107297148 -0.0155000000000007 -0.0581953169007606 -0.00971108082656329 -0.5895 -0.0237000300545252 -0.0540306262726484 0.291999999999999 -0.0399596127259187 -0.0434077107297148 0.763499999999998 -0.0581953169007606 0.00971108082656331 -0.569 -0.0399596127259187 -0.0434077107297148 0.312499999999999 -0.0237000300545252 0.0540306262726484 0.00499999999999923 -0.0518889513211829 -0.0280808961891873 0.332999999999999 -0.0518889513211828 0.0280808961891873 -0.5485 -0.0518889513211829 -0.0280808961891873 0.783999999999998 -0.0048721813828676 0.0587984850873935 0.0254999999999992 -0.0581953169007606 -0.00971108082656329 0.353499999999999 -0.0399596127259187 0.0434077107297148 -0.528 -0.0581953169007606 0.00971108082656331 0.373999999999999 -0.0581953169007606 -0.00971108082656329 0.804499999999998 0.0144836437413072 0.0571946156904205 0.0459999999999992 -0.0237000300545252 0.0540306262726484 -0.5075 -0.0518889513211828 0.0280808961891873 0.394499999999999 -0.0048721813828676 0.0587984850873935 -0.487 -0.0399596127259187 0.0434077107297148 0.414999999999998 0.0322699413292232 0.0493928222174892 0.0664999999999991 -0.0581953169007606 0.00971108082656331 0.824999999999998 0.0144836437413072 0.0571946156904205 -0.4665 -0.0518889513211828 0.0280808961891873 0.845499999999998 0.0322699413292232 0.0493928222174892 -0.446 -0.0237000300545252 0.0540306262726484 0.435499999999998 -0.0399596127259187 0.0434077107297148 0.865999999999998 0.0465592900543872 0.0362385500486904 -0.4255 -0.0048721813828676 0.0587984850873935 0.455999999999998 -0.0237000300545252 0.0540306262726484 0.886499999999998 0.0465592900543872 0.0362385500486904 0.0869999999999991 -0.0048721813828676 0.0587984850873935 0.906999999999998 0.0558032172603374 0.0191572686830763 -0.405 0.0558032172603374 -0.0191572686830763 -0.733 0.0144836437413072 0.0571946156904205 0.927499999999998 0.0465592900543872 -0.0362385500486904 -0.7125 0.0322699413292232 0.0493928222174892 0.947999999999998 0.0144836437413072 0.0571946156904205 0.476499999999998 0.0322699413292232 0.0493928222174892 0.496999999999998 0.0322699413292232 -0.0493928222174892 -0.692 0.0558032172603374 0.0191572686830763 0.107499999999999 0.0465592900543872 0.0362385500486904 0.968499999999997 0.0144836437413071 -0.0571946156904205 -0.6715 0.0558032172603374 -0.0191572686830763 -0.2205 0.0558032172603374 0.0191572686830763 0.988999999999998 0.0558032172603374 -0.0191572686830763 0.660999999999998 -0.00487218138286763 -0.0587984850873935 -0.651 0.0465592900543872 -0.0362385500486904 0.681499999999998 0.0465592900543872 -0.0362385500486904 -0.200000000000001 0.0465592900543872 0.0362385500486904 0.517499999999998 -0.0237000300545252 -0.0540306262726484 -0.6305 0.0322699413292232 -0.0493928222174892 0.701999999999998 0.0322699413292232 -0.0493928222174892 -0.179500000000001 0.0144836437413071 -0.0571946156904205 -0.159000000000001 0.0144836437413071 -0.0571946156904205 0.722499999999998 -0.0399596127259187 -0.0434077107297148 -0.61 -0.00487218138286763 -0.0587984850873935 0.742999999999998 -0.00487218138286763 -0.0587984850873935 -0.138500000000001 -0.0518889513211829 -0.0280808961891873 -0.5895 -0.0237000300545252 -0.0540306262726484 0.763499999999998 -0.0237000300545252 -0.0540306262726484 -0.118000000000001 -0.0581953169007606 -0.00971108082656329 -0.569 0.0558032172603374 0.0191572686830763 0.537999999999998 0.0558032172603374 -0.0191572686830763 0.209999999999999 -0.0581953169007606 0.00971108082656331 -0.5485 -0.0399596127259187 -0.0434077107297148 0.783999999999998 -0.0399596127259187 -0.0434077107297148 -0.0975000000000007 -0.0518889513211829 -0.0280808961891873 -0.0770000000000007 0.0465592900543872 -0.0362385500486904 0.230499999999999 -0.0518889513211828 0.0280808961891873 -0.528 0.0322699413292232 -0.0493928222174892 0.250999999999999 -0.0518889513211829 -0.0280808961891873 0.804499999999998 0.0144836437413071 -0.0571946156904205 0.271499999999999 -0.0399596127259187 0.0434077107297148 -0.5075 -0.0581953169007606 -0.00971108082656329 -0.0565000000000008 -0.00487218138286763 -0.0587984850873935 0.291999999999999 -0.0581953169007606 -0.00971108082656329 0.824999999999998 -0.0237000300545252 0.0540306262726484 -0.487 -0.0237000300545252 -0.0540306262726484 0.312499999999999 -0.0581953169007606 0.00971108082656331 -0.0360000000000008 -0.0048721813828676 0.0587984850873935 -0.4665 -0.0581953169007606 0.00971108082656331 0.845499999999998 -0.0399596127259187 -0.0434077107297148 0.332999999999999 -0.0518889513211828 0.0280808961891873 -0.0155000000000007 0.0144836437413072 0.0571946156904205 -0.446 -0.0518889513211829 -0.0280808961891873 0.353499999999999 0.0322699413292232 0.0493928222174892 -0.4255 -0.0399596127259187 0.0434077107297148 0.00499999999999923 -0.0581953169007606 -0.00971108082656329 0.373999999999999 -0.0518889513211828 0.0280808961891873 0.865999999999998 0.0465592900543872 0.0362385500486904 -0.405 -0.0399596127259187 0.0434077107297148 0.886499999999998 -0.0237000300545252 0.0540306262726484 0.0254999999999992 -0.0581953169007606 0.00971108082656331 0.394499999999999 -0.0237000300545252 0.0540306262726484 0.906999999999998 -0.0518889513211828 0.0280808961891873 0.414999999999998 0.0558032172603374 0.0191572686830763 -0.3845 -0.0048721813828676 0.0587984850873935 0.0459999999999992 -0.0048721813828676 0.0587984850873935 0.927499999999998 -0.0399596127259187 0.0434077107297148 0.435499999999998 0.0558032172603374 -0.0191572686830763 -0.7125 0.0144836437413072 0.0571946156904205 0.0664999999999991 0.0144836437413072 0.0571946156904205 0.947999999999998 -0.0237000300545252 0.0540306262726484 0.455999999999998 0.0465592900543872 -0.0362385500486904 -0.692 0.0322699413292232 0.0493928222174892 0.0869999999999991 0.0322699413292232 0.0493928222174892 0.968499999999997 0.0322699413292232 -0.0493928222174892 -0.6715 -0.0048721813828676 0.0587984850873935 0.476499999999998 0.0465592900543872 0.0362385500486904 0.988999999999998 0.0144836437413071 -0.0571946156904205 -0.651 0.0558032172603374 0.0191572686830763 1.0095 0.0558032172603374 -0.0191572686830763 0.681499999999998 -0.00487218138286763 -0.0587984850873935 -0.6305 0.0465592900543872 0.0362385500486904 0.107499999999999 0.0144836437413072 0.0571946156904205 0.496999999999998 0.0465592900543872 -0.0362385500486904 0.701999999999998 -0.0237000300545252 -0.0540306262726484 -0.61 0.0322699413292232 -0.0493928222174892 0.722499999999998 0.0144836437413071 -0.0571946156904205 0.742999999999998 0.0322699413292232 0.0493928222174892 0.517499999999998 -0.0399596127259187 -0.0434077107297148 -0.5895 -0.00487218138286763 -0.0587984850873935 0.763499999999998 -0.0518889513211829 -0.0280808961891873 -0.569 -0.0237000300545252 -0.0540306262726484 0.783999999999998 -0.0581953169007606 -0.00971108082656329 -0.5485 0.0558032172603374 0.0191572686830763 0.127999999999999 -0.0581953169007606 0.00971108082656331 -0.528 -0.0399596127259187 -0.0434077107297148 0.804499999999998 0.0558032172603374 -0.0191572686830763 -0.200000000000001 -0.0518889513211828 0.0280808961891873 -0.5075 0.0465592900543872 0.0362385500486904 0.537999999999998 -0.0399596127259187 0.0434077107297148 -0.487 -0.0518889513211829 -0.0280808961891873 0.824999999999998 0.0465592900543872 -0.0362385500486904 -0.179500000000001 0.0558032172603374 0.0191572686830763 0.558499999999998 -0.0581953169007606 -0.00971108082656329 0.845499999999998 -0.0237000300545252 0.0540306262726484 -0.4665 0.0322699413292232 -0.0493928222174892 -0.159000000000001 0.0558032172603374 -0.0191572686830763 0.230499999999999 0.0144836437413071 -0.0571946156904205 -0.138500000000001 -0.0048721813828676 0.0587984850873935 -0.446 0.0465592900543872 -0.0362385500486904 0.250999999999999 -0.0581953169007606 0.00971108082656331 0.865999999999998 0.0144836437413072 0.0571946156904205 -0.4255 -0.0518889513211828 0.0280808961891873 0.886499999999998 -0.00487218138286763 -0.0587984850873935 -0.118000000000001 0.0322699413292232 -0.0493928222174892 0.271499999999999 0.0322699413292232 0.0493928222174892 -0.405 -0.0237000300545252 -0.0540306262726484 -0.0975000000000007 0.0144836437413071 -0.0571946156904205 0.291999999999999 -0.0399596127259187 -0.0434077107297148 -0.0770000000000007 0.0465592900543872 0.0362385500486904 -0.3845 -0.00487218138286763 -0.0587984850873935 0.312499999999999 -0.0399596127259187 0.0434077107297148 0.906999999999998 -0.0237000300545252 0.0540306262726484 0.927499999999998 -0.0237000300545252 -0.0540306262726484 0.332999999999999 -0.0518889513211829 -0.0280808961891873 -0.0565000000000008 -0.0399596127259187 -0.0434077107297148 0.353499999999999 0.0558032172603374 0.0191572686830763 -0.364 -0.0048721813828676 0.0587984850873935 0.947999999999998 -0.0581953169007606 -0.00971108082656329 -0.0360000000000008 0.0558032172603374 -0.0191572686830763 -0.692 -0.0518889513211829 -0.0280808961891873 0.373999999999999 0.0144836437413072 0.0571946156904205 0.968499999999997 -0.0581953169007606 0.00971108082656331 -0.0155000000000007 -0.0581953169007606 -0.00971108082656329 0.394499999999999 0.0465592900543872 -0.0362385500486904 -0.6715 0.0322699413292232 0.0493928222174892 0.988999999999998 -0.0581953169007606 0.00971108082656331 0.414999999999998 -0.0399596127259187 0.0434077107297148 0.0254999999999992 0.0322699413292232 -0.0493928222174892 -0.651 0.0465592900543872 0.0362385500486904 1.0095 -0.0518889513211828 0.0280808961891873 0.435499999999998 0.0558032172603374 -0.0191572686830763 0.701999999999998 0.0144836437413071 -0.0571946156904205 -0.6305 0.0465592900543872 -0.0362385500486904 0.722499999999998 -0.0237000300545252 0.0540306262726484 0.0459999999999992 -0.00487218138286763 -0.0587984850873935 -0.61 0.0322699413292232 -0.0493928222174892 0.742999999999998 -0.0399596127259187 0.0434077107297148 0.455999999999998 -0.0048721813828676 0.0587984850873935 0.0664999999999991 0.0144836437413071 -0.0571946156904205 0.763499999999998 -0.0237000300545252 -0.0540306262726484 -0.5895 -0.00487218138286763 -0.0587984850873935 0.783999999999998 0.0144836437413072 0.0571946156904205 0.0869999999999991 -0.0399596127259187 -0.0434077107297148 -0.569 -0.0237000300545252 0.0540306262726484 0.476499999999998 -0.0237000300545252 -0.0540306262726484 0.804499999999998 -0.0518889513211829 -0.0280808961891873 -0.5485 -0.0048721813828676 0.0587984850873935 0.496999999999998 0.0322699413292232 0.0493928222174892 0.107499999999999 0.0465592900543872 0.0362385500486904 0.127999999999999 -0.0581953169007606 -0.00971108082656329 -0.528 -0.0399596127259187 -0.0434077107297148 0.824999999999998 -0.0581953169007606 0.00971108082656331 -0.5075 0.0144836437413072 0.0571946156904205 0.517499999999998 -0.0518889513211829 -0.0280808961891873 0.845499999999998 -0.0518889513211828 0.0280808961891873 -0.487 0.0322699413292232 0.0493928222174892 0.537999999999998 -0.0581953169007606 -0.00971108082656329 0.865999999999998 -0.0399596127259187 0.0434077107297148 -0.4665 -0.0581953169007606 0.00971108082656331 0.886499999999998 -0.0237000300545252 0.0540306262726484 -0.446 0.0465592900543872 0.0362385500486904 0.558499999999998 0.0558032172603374 0.0191572686830763 0.148499999999999 -0.0048721813828676 0.0587984850873935 -0.4255 -0.0518889513211828 0.0280808961891873 0.906999999999998 0.0144836437413072 0.0571946156904205 -0.405 0.0322699413292232 0.0493928222174892 -0.3845 -0.0399596127259187 0.0434077107297148 0.927499999999998 0.0465592900543872 0.0362385500486904 -0.364 -0.0237000300545252 0.0540306262726484 0.947999999999998 0.0558032172603374 -0.0191572686830763 -0.179500000000001 0.0465592900543872 -0.0362385500486904 -0.159000000000001 0.0558032172603374 0.0191572686830763 0.578999999999998 -0.0048721813828676 0.0587984850873935 0.968499999999997 0.0558032172603374 -0.0191572686830763 0.250999999999999 0.0322699413292232 -0.0493928222174892 -0.138500000000001 0.0558032172603374 0.0191572686830763 -0.3435 0.0558032172603374 -0.0191572686830763 -0.6715 0.0144836437413072 0.0571946156904205 0.988999999999998 0.0465592900543872 -0.0362385500486904 0.271499999999999 0.0322699413292232 0.0493928222174892 1.0095 0.0144836437413071 -0.0571946156904205 -0.118000000000001 0.0322699413292232 -0.0493928222174892 0.291999999999999 0.0558032172603374 -0.0191572686830763 0.722499999999998 0.0465592900543872 -0.0362385500486904 -0.651 -0.00487218138286763 -0.0587984850873935 -0.0975000000000007 0.0465592900543872 -0.0362385500486904 0.742999999999998 0.0144836437413071 -0.0571946156904205 0.312499999999999 0.0322699413292232 -0.0493928222174892 -0.6305 -0.0237000300545252 -0.0540306262726484 -0.0770000000000007 -0.00487218138286763 -0.0587984850873935 0.332999999999999 0.0322699413292232 -0.0493928222174892 0.763499999999998 -0.0399596127259187 -0.0434077107297148 -0.0565000000000008 -0.0237000300545252 -0.0540306262726484 0.353499999999999 0.0144836437413071 -0.0571946156904205 0.783999999999998 0.0144836437413071 -0.0571946156904205 -0.61 -0.0518889513211829 -0.0280808961891873 -0.0360000000000008 -0.00487218138286763 -0.0587984850873935 0.804499999999998 -0.0399596127259187 -0.0434077107297148 0.373999999999999 -0.00487218138286763 -0.0587984850873935 -0.5895 -0.0518889513211829 -0.0280808961891873 0.394499999999999 -0.0581953169007606 -0.00971108082656329 -0.0155000000000007 -0.0237000300545252 -0.0540306262726484 -0.569 -0.0581953169007606 -0.00971108082656329 0.414999999999998 -0.0237000300545252 -0.0540306262726484 0.824999999999998 -0.0581953169007606 0.00971108082656331 0.00499999999999923 -0.0581953169007606 0.00971108082656331 0.435499999999998 -0.0399596127259187 -0.0434077107297148 -0.5485 -0.0399596127259187 -0.0434077107297148 0.845499999999998 -0.0518889513211829 -0.0280808961891873 -0.528 -0.0518889513211828 0.0280808961891873 0.455999999999998 -0.0518889513211828 0.0280808961891873 0.0254999999999992 -0.0581953169007606 -0.00971108082656329 -0.5075 -0.0518889513211829 -0.0280808961891873 0.865999999999998 -0.0399596127259187 0.0434077107297148 0.476499999999998 -0.0581953169007606 0.00971108082656331 -0.487 -0.0581953169007606 -0.00971108082656329 0.886499999999998 -0.0399596127259187 0.0434077107297148 0.0459999999999992 -0.0518889513211828 0.0280808961891873 -0.4665 -0.0237000300545252 0.0540306262726484 0.496999999999998 -0.0237000300545252 0.0540306262726484 0.0664999999999991 -0.0048721813828676 0.0587984850873935 0.0869999999999991 -0.0581953169007606 0.00971108082656331 0.906999999999998 -0.0399596127259187 0.0434077107297148 -0.446 -0.0518889513211828 0.0280808961891873 0.927499999999998 0.0144836437413072 0.0571946156904205 0.107499999999999 -0.0048721813828676 0.0587984850873935 0.517499999999998 -0.0237000300545252 0.0540306262726484 -0.4255 -0.0399596127259187 0.0434077107297148 0.947999999999998 0.0322699413292232 0.0493928222174892 0.127999999999999 -0.0048721813828676 0.0587984850873935 -0.405 0.0144836437413072 0.0571946156904205 -0.3845 0.0144836437413072 0.0571946156904205 0.537999999999998 -0.0237000300545252 0.0540306262726484 0.968499999999997 0.0322699413292232 0.0493928222174892 -0.364 -0.0048721813828676 0.0587984850873935 0.988999999999998 0.0144836437413072 0.0571946156904205 1.0095 0.0465592900543872 0.0362385500486904 0.148499999999999 0.0322699413292232 0.0493928222174892 0.558499999999998 0.0558032172603374 -0.0191572686830763 0.742999999999998 0.0465592900543872 0.0362385500486904 -0.3435 0.0465592900543872 -0.0362385500486904 0.763499999999998 0.0322699413292232 -0.0493928222174892 0.783999999999998 0.0558032172603374 0.0191572686830763 -0.323 0.0558032172603374 -0.0191572686830763 -0.651 0.0144836437413071 -0.0571946156904205 0.804499999999998 -0.00487218138286763 -0.0587984850873935 0.824999999999998 0.0465592900543872 -0.0362385500486904 -0.6305 0.0465592900543872 0.0362385500486904 0.578999999999998 -0.0237000300545252 -0.0540306262726484 0.845499999999998 0.0322699413292232 -0.0493928222174892 -0.61 0.0558032172603374 0.0191572686830763 0.168999999999999 -0.0399596127259187 -0.0434077107297148 0.865999999999998 0.0558032172603374 -0.0191572686830763 -0.159000000000001 0.0558032172603374 0.0191572686830763 0.599499999999998 0.0144836437413071 -0.0571946156904205 -0.5895 0.0558032172603374 -0.0191572686830763 0.271499999999999 0.0465592900543872 -0.0362385500486904 0.291999999999999 0.0465592900543872 -0.0362385500486904 -0.138500000000001 -0.00487218138286763 -0.0587984850873935 -0.569 -0.0518889513211829 -0.0280808961891873 0.886499999999998 0.0322699413292232 -0.0493928222174892 -0.118000000000001 -0.0237000300545252 -0.0540306262726484 -0.5485 0.0322699413292232 -0.0493928222174892 0.312499999999999 -0.0581953169007606 -0.00971108082656329 0.906999999999998 0.0144836437413071 -0.0571946156904205 -0.0975000000000007 0.0144836437413071 -0.0571946156904205 0.332999999999999 -0.00487218138286763 -0.0587984850873935 0.353499999999999 -0.0399596127259187 -0.0434077107297148 -0.528 -0.0581953169007606 0.00971108082656331 0.927499999999998 -0.00487218138286763 -0.0587984850873935 -0.0770000000000007 -0.0237000300545252 -0.0540306262726484 0.373999999999999 -0.0237000300545252 -0.0540306262726484 -0.0565000000000008 -0.0518889513211829 -0.0280808961891873 -0.5075 -0.0518889513211828 0.0280808961891873 0.947999999999998 -0.0399596127259187 -0.0434077107297148 0.394499999999999 -0.0581953169007606 -0.00971108082656329 -0.487 -0.0399596127259187 -0.0434077107297148 -0.0360000000000008 -0.0399596127259187 0.0434077107297148 0.968499999999997 -0.0518889513211829 -0.0280808961891873 0.414999999999998 -0.0518889513211829 -0.0280808961891873 -0.0155000000000007 -0.0581953169007606 0.00971108082656331 -0.4665 -0.0518889513211828 0.0280808961891873 -0.446 -0.0581953169007606 -0.00971108082656329 0.435499999999998 -0.0237000300545252 0.0540306262726484 0.988999999999998 -0.0581953169007606 -0.00971108082656329 0.00499999999999923 -0.0399596127259187 0.0434077107297148 -0.4255 -0.0048721813828676 0.0587984850873935 1.0095 -0.0581953169007606 0.00971108082656331 0.0254999999999992 0.0558032172603374 -0.0191572686830763 0.763499999999998 -0.0581953169007606 0.00971108082656331 0.455999999999998 -0.0237000300545252 0.0540306262726484 -0.405 -0.0518889513211828 0.0280808961891873 0.476499999999998 -0.0518889513211828 0.0280808961891873 0.0459999999999992 0.0465592900543872 -0.0362385500486904 0.783999999999998 -0.0048721813828676 0.0587984850873935 -0.3845 0.0322699413292232 -0.0493928222174892 0.804499999999998 -0.0399596127259187 0.0434077107297148 0.0664999999999991 -0.0399596127259187 0.0434077107297148 0.496999999999998 0.0144836437413072 0.0571946156904205 -0.364 0.0144836437413071 -0.0571946156904205 0.824999999999998 -0.0237000300545252 0.0540306262726484 0.0869999999999991 -0.00487218138286763 -0.0587984850873935 0.845499999999998 -0.0237000300545252 0.0540306262726484 0.517499999999998 -0.0048721813828676 0.0587984850873935 0.107499999999999 0.0322699413292232 0.0493928222174892 -0.3435 0.0144836437413072 0.0571946156904205 0.127999999999999 0.0465592900543872 0.0362385500486904 -0.323 -0.0237000300545252 -0.0540306262726484 0.865999999999998 -0.0048721813828676 0.0587984850873935 0.537999999999998 -0.0399596127259187 -0.0434077107297148 0.886499999999998 0.0558032172603374 0.0191572686830763 -0.3025 0.0322699413292232 0.0493928222174892 0.148499999999999 0.0465592900543872 0.0362385500486904 0.168999999999999 -0.0518889513211829 -0.0280808961891873 0.906999999999998 0.0144836437413072 0.0571946156904205 0.558499999999998 0.0558032172603374 -0.0191572686830763 -0.6305 -0.0581953169007606 -0.00971108082656329 0.927499999999998 0.0465592900543872 -0.0362385500486904 -0.61 0.0322699413292232 0.0493928222174892 0.578999999999998 -0.0581953169007606 0.00971108082656331 0.947999999999998 0.0322699413292232 -0.0493928222174892 -0.5895 0.0558032172603374 0.0191572686830763 -0.9995 -0.0518889513211828 0.0280808961891873 0.968499999999997 0.0465592900543872 0.0362385500486904 0.599499999999998 0.0144836437413071 -0.0571946156904205 -0.569 0.0558032172603374 0.0191572686830763 0.189499999999999 0.0465592900543872 0.0362385500486904 -0.9995 -0.00487218138286763 -0.0587984850873935 -0.5485 -0.0399596127259187 0.0434077107297148 0.988999999999998 -0.0237000300545252 0.0540306262726484 1.0095 -0.0237000300545252 -0.0540306262726484 -0.528 0.0558032172603374 0.0191572686830763 0.619999999999998 0.0558032172603374 -0.0191572686830763 0.783999999999998 -0.0399596127259187 -0.0434077107297148 -0.5075 0.0465592900543872 -0.0362385500486904 0.804499999999998 0.0558032172603374 0.0191572686830763 -0.979 0.0558032172603374 -0.0191572686830763 -0.138500000000001 0.0322699413292232 -0.0493928222174892 0.824999999999998 -0.0518889513211829 -0.0280808961891873 -0.487 0.0322699413292232 0.0493928222174892 -0.9995 0.0465592900543872 -0.0362385500486904 -0.118000000000001 0.0558032172603374 -0.0191572686830763 0.291999999999999 -0.0581953169007606 -0.00971108082656329 -0.4665 0.0144836437413071 -0.0571946156904205 0.845499999999998 0.0465592900543872 0.0362385500486904 -0.979 0.0322699413292232 -0.0493928222174892 -0.0975000000000007 0.0465592900543872 -0.0362385500486904 0.312499999999999 -0.0581953169007606 0.00971108082656331 -0.446 0.0558032172603374 0.0191572686830763 -0.9585 -0.00487218138286763 -0.0587984850873935 0.865999999999998 0.0322699413292232 -0.0493928222174892 0.332999999999999 0.0144836437413071 -0.0571946156904205 -0.0770000000000007 0.0144836437413071 -0.0571946156904205 0.353499999999999 -0.0518889513211828 0.0280808961891873 -0.4255 -0.0237000300545252 -0.0540306262726484 0.886499999999998 -0.00487218138286763 -0.0587984850873935 -0.0565000000000008 -0.00487218138286763 -0.0587984850873935 0.373999999999999 0.0144836437413072 0.0571946156904205 -0.9995 -0.0399596127259187 0.0434077107297148 -0.405 -0.0237000300545252 -0.0540306262726484 -0.0360000000000008 -0.0399596127259187 -0.0434077107297148 0.906999999999998 -0.0237000300545252 -0.0540306262726484 0.394499999999999 -0.0237000300545252 0.0540306262726484 -0.3845 -0.0399596127259187 -0.0434077107297148 -0.0155000000000007 -0.0399596127259187 -0.0434077107297148 0.414999999999998 -0.0048721813828676 0.0587984850873935 -0.364 0.0322699413292232 0.0493928222174892 -0.979 0.0465592900543872 0.0362385500486904 -0.9585 -0.0518889513211829 -0.0280808961891873 0.00499999999999923 -0.0518889513211829 -0.0280808961891873 0.435499999999998 -0.0518889513211829 -0.0280808961891873 0.927499999999998 0.0144836437413072 0.0571946156904205 -0.3435 -0.0581953169007606 -0.00971108082656329 0.947999999999998 -0.0581953169007606 -0.00971108082656329 0.0254999999999992 -0.0581953169007606 -0.00971108082656329 0.455999999999998 -0.0581953169007606 0.00971108082656331 0.968499999999997 -0.0581953169007606 0.00971108082656331 0.0459999999999992 0.0322699413292232 0.0493928222174892 -0.323 -0.0581953169007606 0.00971108082656331 0.476499999999998 0.0558032172603374 0.0191572686830763 -0.938 -0.0518889513211828 0.0280808961891873 0.0664999999999991 -0.0518889513211828 0.0280808961891873 0.988999999999998 -0.0048721813828676 0.0587984850873935 -0.9995 0.0465592900543872 0.0362385500486904 -0.3025 -0.0518889513211828 0.0280808961891873 0.496999999999998 -0.0399596127259187 0.0434077107297148 0.0869999999999991 -0.0399596127259187 0.0434077107297148 1.0095 0.0144836437413072 0.0571946156904205 -0.979 0.0558032172603374 -0.0191572686830763 0.804499999999998 -0.0237000300545252 0.0540306262726484 0.107499999999999 0.0558032172603374 0.0191572686830763 -0.282 0.0322699413292232 0.0493928222174892 -0.9585 0.0465592900543872 -0.0362385500486904 0.824999999999998 -0.0048721813828676 0.0587984850873935 0.127999999999999 0.0558032172603374 -0.0191572686830763 -0.61 -0.0399596127259187 0.0434077107297148 0.517499999999998 0.0322699413292232 -0.0493928222174892 0.845499999999998 0.0465592900543872 0.0362385500486904 -0.938 0.0144836437413072 0.0571946156904205 0.148499999999999 0.0144836437413071 -0.0571946156904205 0.865999999999998 0.0465592900543872 -0.0362385500486904 -0.5895 -0.0237000300545252 0.0540306262726484 0.537999999999998 0.0322699413292232 -0.0493928222174892 -0.569 -0.00487218138286763 -0.0587984850873935 0.886499999999998 0.0558032172603374 0.0191572686830763 -0.9175 0.0322699413292232 0.0493928222174892 0.168999999999999 0.0144836437413071 -0.0571946156904205 -0.5485 -0.0237000300545252 0.0540306262726484 -0.9995 -0.0237000300545252 -0.0540306262726484 0.906999999999998 -0.0048721813828676 0.0587984850873935 0.558499999999998 -0.00487218138286763 -0.0587984850873935 -0.528 -0.0048721813828676 0.0587984850873935 -0.979 -0.0399596127259187 -0.0434077107297148 0.927499999999998 -0.0237000300545252 -0.0540306262726484 -0.5075 0.0144836437413072 0.0571946156904205 0.578999999999998 -0.0518889513211829 -0.0280808961891873 0.947999999999998 0.0144836437413072 0.0571946156904205 -0.9585 -0.0399596127259187 -0.0434077107297148 -0.487 0.0322699413292232 0.0493928222174892 0.599499999999998 0.0322699413292232 0.0493928222174892 -0.938 -0.0581953169007606 -0.00971108082656329 0.968499999999997 0.0465592900543872 0.0362385500486904 0.189499999999999 -0.0518889513211829 -0.0280808961891873 -0.4665 0.0465592900543872 0.0362385500486904 -0.9175 0.0465592900543872 0.0362385500486904 0.619999999999998 -0.0581953169007606 0.00971108082656331 0.988999999999998 0.0558032172603374 0.0191572686830763 0.209999999999999 -0.0581953169007606 -0.00971108082656329 -0.446 -0.0518889513211828 0.0280808961891873 1.0095 -0.0581953169007606 0.00971108082656331 -0.4255 0.0558032172603374 -0.0191572686830763 0.824999999999998 0.0558032172603374 0.0191572686830763 -0.897 -0.0518889513211828 0.0280808961891873 -0.405 0.0465592900543872 -0.0362385500486904 0.845499999999998 -0.0399596127259187 0.0434077107297148 -0.3845 0.0322699413292232 -0.0493928222174892 0.865999999999998 -0.0399596127259187 0.0434077107297148 -0.9995 0.0558032172603374 -0.0191572686830763 -0.118000000000001 0.0144836437413071 -0.0571946156904205 0.886499999999998 -0.0237000300545252 0.0540306262726484 -0.364 -0.0237000300545252 0.0540306262726484 -0.979 0.0465592900543872 -0.0362385500486904 -0.0975000000000007 0.0558032172603374 0.0191572686830763 0.640499999999998 0.0558032172603374 -0.0191572686830763 0.312499999999999 -0.0048721813828676 0.0587984850873935 -0.3435 -0.0048721813828676 0.0587984850873935 -0.9585 0.0322699413292232 -0.0493928222174892 -0.0770000000000007 -0.00487218138286763 -0.0587984850873935 0.906999999999998 0.0465592900543872 -0.0362385500486904 0.332999999999999 0.0144836437413072 0.0571946156904205 -0.938 0.0144836437413072 0.0571946156904205 -0.323 -0.0237000300545252 -0.0540306262726484 0.927499999999998 0.0322699413292232 -0.0493928222174892 0.353499999999999 0.0144836437413071 -0.0571946156904205 -0.0565000000000008 -0.00487218138286763 -0.0587984850873935 -0.0360000000000008 0.0144836437413071 -0.0571946156904205 0.373999999999999 0.0322699413292232 0.0493928222174892 -0.9175 0.0322699413292232 0.0493928222174892 -0.3025 -0.0399596127259187 -0.0434077107297148 0.947999999999998 -0.0237000300545252 -0.0540306262726484 -0.0155000000000007 -0.00487218138286763 -0.0587984850873935 0.394499999999999 0.0465592900543872 0.0362385500486904 -0.897 0.0465592900543872 0.0362385500486904 -0.282 -0.0518889513211829 -0.0280808961891873 0.968499999999997 -0.0399596127259187 -0.0434077107297148 0.00499999999999923 -0.0237000300545252 -0.0540306262726484 0.414999999999998 -0.0399596127259187 -0.0434077107297148 0.435499999999998 -0.0518889513211829 -0.0280808961891873 0.0254999999999992 0.0558032172603374 0.0191572686830763 -0.2615 -0.0581953169007606 -0.00971108082656329 0.988999999999998 -0.0581953169007606 0.00971108082656331 1.0095 0.0558032172603374 -0.0191572686830763 -0.5895 -0.0518889513211829 -0.0280808961891873 0.455999999999998 -0.0581953169007606 -0.00971108082656329 0.0459999999999992 0.0558032172603374 0.0191572686830763 -0.8765 -0.0581953169007606 -0.00971108082656329 0.476499999999998 0.0558032172603374 -0.0191572686830763 0.845499999999998 -0.0518889513211828 0.0280808961891873 -0.9995 -0.0581953169007606 0.00971108082656331 0.0664999999999991 0.0465592900543872 -0.0362385500486904 0.865999999999998 -0.0581953169007606 0.00971108082656331 0.496999999999998 0.0465592900543872 -0.0362385500486904 -0.569 -0.0518889513211828 0.0280808961891873 0.0869999999999991 -0.0399596127259187 0.0434077107297148 -0.979 0.0322699413292232 -0.0493928222174892 -0.5485 0.0322699413292232 -0.0493928222174892 0.886499999999998 -0.0237000300545252 0.0540306262726484 -0.9585 -0.0518889513211828 0.0280808961891873 0.517499999999998 -0.0399596127259187 0.0434077107297148 0.107499999999999 0.0144836437413071 -0.0571946156904205 -0.528 -0.0237000300545252 0.0540306262726484 0.127999999999999 0.0144836437413071 -0.0571946156904205 0.906999999999998 -0.0048721813828676 0.0587984850873935 -0.938 -0.00487218138286763 -0.0587984850873935 -0.5075 -0.00487218138286763 -0.0587984850873935 0.927499999999998 0.0144836437413072 0.0571946156904205 -0.9175 -0.0048721813828676 0.0587984850873935 0.148499999999999 -0.0237000300545252 -0.0540306262726484 0.947999999999998 0.0144836437413072 0.0571946156904205 0.168999999999999 -0.0237000300545252 -0.0540306262726484 -0.487 0.0322699413292232 0.0493928222174892 -0.897 -0.0399596127259187 0.0434077107297148 0.537999999999998 -0.0399596127259187 -0.0434077107297148 0.968499999999997 0.0322699413292232 0.0493928222174892 0.189499999999999 -0.0399596127259187 -0.0434077107297148 -0.4665 -0.0518889513211829 -0.0280808961891873 0.988999999999998 0.0465592900543872 0.0362385500486904 -0.8765 -0.0518889513211829 -0.0280808961891873 -0.446 -0.0237000300545252 0.0540306262726484 0.558499999999998 -0.0048721813828676 0.0587984850873935 0.578999999999998 -0.0581953169007606 -0.00971108082656329 1.0095 -0.0581953169007606 -0.00971108082656329 -0.4255 0.0558032172603374 -0.0191572686830763 0.865999999999998 -0.0581953169007606 0.00971108082656331 -0.405 0.0465592900543872 0.0362385500486904 0.209999999999999 0.0558032172603374 0.0191572686830763 -0.856 0.0465592900543872 -0.0362385500486904 0.886499999999998 0.0144836437413072 0.0571946156904205 0.599499999999998 -0.0581953169007606 0.00971108082656331 -0.9995 0.0322699413292232 -0.0493928222174892 0.906999999999998 -0.0518889513211828 0.0280808961891873 -0.3845 -0.0399596127259187 0.0434077107297148 -0.364 -0.0518889513211828 0.0280808961891873 -0.979 0.0144836437413071 -0.0571946156904205 0.927499999999998 0.0322699413292232 0.0493928222174892 0.619999999999998 -0.0399596127259187 0.0434077107297148 -0.9585 0.0558032172603374 0.0191572686830763 0.230499999999999 -0.0237000300545252 0.0540306262726484 -0.3435 -0.00487218138286763 -0.0587984850873935 0.947999999999998 -0.0237000300545252 0.0540306262726484 -0.938 0.0465592900543872 0.0362385500486904 0.640499999999998 -0.0048721813828676 0.0587984850873935 -0.323 -0.0237000300545252 -0.0540306262726484 0.968499999999997 -0.0048721813828676 0.0587984850873935 -0.9175 0.0144836437413072 0.0571946156904205 -0.3025 -0.0399596127259187 -0.0434077107297148 0.988999999999998 0.0144836437413072 0.0571946156904205 -0.897 0.0322699413292232 0.0493928222174892 -0.282 -0.0518889513211829 -0.0280808961891873 1.0095 0.0558032172603374 -0.0191572686830763 -0.0975000000000007 0.0322699413292232 0.0493928222174892 -0.8765 0.0558032172603374 -0.0191572686830763 0.886499999999998 0.0465592900543872 0.0362385500486904 -0.2615 0.0465592900543872 -0.0362385500486904 -0.0770000000000007 0.0465592900543872 0.0362385500486904 -0.856 0.0465592900543872 -0.0362385500486904 0.906999999999998 0.0558032172603374 0.0191572686830763 0.660999999999998 0.0558032172603374 -0.0191572686830763 0.332999999999999 0.0322699413292232 -0.0493928222174892 -0.0565000000000008 0.0322699413292232 -0.0493928222174892 0.927499999999998 0.0558032172603374 0.0191572686830763 -0.241 0.0144836437413071 -0.0571946156904205 -0.0360000000000008 0.0465592900543872 -0.0362385500486904 0.353499999999999 0.0144836437413071 -0.0571946156904205 0.947999999999998 0.0322699413292232 -0.0493928222174892 0.373999999999999 0.0558032172603374 -0.0191572686830763 -0.569 0.0558032172603374 0.0191572686830763 -0.8355 -0.00487218138286763 -0.0587984850873935 -0.0155000000000007 -0.0581953169007606 -0.00971108082656329 -0.9995 0.0144836437413071 -0.0571946156904205 0.394499999999999 -0.00487218138286763 -0.0587984850873935 0.968499999999997 -0.0237000300545252 -0.0540306262726484 0.00499999999999923 0.0465592900543872 -0.0362385500486904 -0.5485 -0.00487218138286763 -0.0587984850873935 0.414999999999998 -0.0237000300545252 -0.0540306262726484 0.988999999999998 -0.0581953169007606 0.00971108082656331 -0.979 -0.0399596127259187 -0.0434077107297148 0.0254999999999992 0.0322699413292232 -0.0493928222174892 -0.528 -0.0237000300545252 -0.0540306262726484 0.435499999999998 -0.0399596127259187 -0.0434077107297148 1.0095 -0.0518889513211828 0.0280808961891873 -0.9585 -0.0518889513211829 -0.0280808961891873 0.0459999999999992 -0.0399596127259187 -0.0434077107297148 0.455999999999998 0.0144836437413071 -0.0571946156904205 -0.5075 0.0558032172603374 -0.0191572686830763 0.906999999999998 -0.0399596127259187 0.0434077107297148 -0.938 -0.0581953169007606 -0.00971108082656329 0.0664999999999991 -0.0518889513211829 -0.0280808961891873 0.476499999999998 -0.00487218138286763 -0.0587984850873935 -0.487 0.0465592900543872 -0.0362385500486904 0.927499999999998 -0.0581953169007606 0.00971108082656331 0.0869999999999991 -0.0237000300545252 -0.0540306262726484 -0.4665 0.0322699413292232 -0.0493928222174892 0.947999999999998 -0.0581953169007606 -0.00971108082656329 0.496999999999998 -0.0237000300545252 0.0540306262726484 -0.9175 -0.0518889513211828 0.0280808961891873 0.107499999999999 -0.0048721813828676 0.0587984850873935 -0.897 -0.0399596127259187 -0.0434077107297148 -0.446 -0.0581953169007606 0.00971108082656331 0.517499999999998 0.0144836437413071 -0.0571946156904205 0.968499999999997 0.0144836437413072 0.0571946156904205 -0.8765 -0.0399596127259187 0.0434077107297148 0.127999999999999 -0.0518889513211829 -0.0280808961891873 -0.4255 -0.0237000300545252 0.0540306262726484 0.148499999999999 -0.00487218138286763 -0.0587984850873935 0.988999999999998 -0.0237000300545252 -0.0540306262726484 1.0095 -0.0048721813828676 0.0587984850873935 0.168999999999999 0.0322699413292232 0.0493928222174892 -0.856 -0.0581953169007606 -0.00971108082656329 -0.405 -0.0518889513211828 0.0280808961891873 0.537999999999998 0.0558032172603374 -0.0191572686830763 0.927499999999998 -0.0581953169007606 0.00971108082656331 -0.3845 0.0144836437413072 0.0571946156904205 0.189499999999999 0.0465592900543872 0.0362385500486904 -0.8355 -0.0518889513211828 0.0280808961891873 -0.364 0.0465592900543872 -0.0362385500486904 0.947999999999998 -0.0399596127259187 0.0434077107297148 0.558499999999998 -0.0399596127259187 0.0434077107297148 -0.3435 0.0322699413292232 0.0493928222174892 0.209999999999999 0.0322699413292232 -0.0493928222174892 0.968499999999997 0.0144836437413071 -0.0571946156904205 0.988999999999998 0.0558032172603374 0.0191572686830763 -0.815 -0.0237000300545252 0.0540306262726484 -0.323 -0.0237000300545252 0.0540306262726484 0.578999999999998 -0.0518889513211829 -0.0280808961891873 -0.9995 0.0465592900543872 0.0362385500486904 0.230499999999999 -0.00487218138286763 -0.0587984850873935 1.0095 -0.0048721813828676 0.0587984850873935 -0.3025 -0.0581953169007606 -0.00971108082656329 -0.979 0.0558032172603374 -0.0191572686830763 0.947999999999998 -0.0048721813828676 0.0587984850873935 0.599499999999998 0.0465592900543872 -0.0362385500486904 0.968499999999997 0.0144836437413072 0.0571946156904205 -0.282 -0.0581953169007606 0.00971108082656331 -0.9585 0.0144836437413072 0.0571946156904205 0.619999999999998 0.0322699413292232 0.0493928222174892 -0.2615 -0.0518889513211828 0.0280808961891873 -0.938 0.0322699413292232 -0.0493928222174892 0.988999999999998 0.0322699413292232 0.0493928222174892 0.640499999999998 0.0144836437413071 -0.0571946156904205 1.0095 0.0465592900543872 0.0362385500486904 -0.241 -0.0399596127259187 0.0434077107297148 -0.9175 0.0558032172603374 -0.0191572686830763 0.968499999999997 0.0465592900543872 0.0362385500486904 0.660999999999998 -0.0237000300545252 0.0540306262726484 -0.897 0.0465592900543872 -0.0362385500486904 0.988999999999998 0.0558032172603374 0.0191572686830763 -0.2205 -0.0048721813828676 0.0587984850873935 -0.8765 0.0322699413292232 -0.0493928222174892 1.0095 0.0558032172603374 -0.0191572686830763 -0.5485 0.0558032172603374 -0.0191572686830763 0.988999999999998 0.0144836437413072 0.0571946156904205 -0.856 0.0558032172603374 0.0191572686830763 0.250999999999999 0.0465592900543872 -0.0362385500486904 -0.528 0.0465592900543872 -0.0362385500486904 1.0095 0.0558032172603374 -0.0191572686830763 -0.0770000000000007 0.0558032172603374 0.0191572686830763 0.681499999999998 0.0322699413292232 0.0493928222174892 -0.8355 0.0558032172603374 -0.0191572686830763 1.0095 0.0465592900543872 -0.0362385500486904 -0.0565000000000008 0.0322699413292232 -0.0493928222174892 -0.5075 0.0465592900543872 0.0362385500486904 -0.815 0.0558032172603374 -0.0191572686830763 0.353499999999999 0.0322699413292232 -0.0493928222174892 -0.0360000000000008 0.0144836437413071 -0.0571946156904205 -0.487 0.0465592900543872 -0.0362385500486904 0.373999999999999 0.0144836437413071 -0.0571946156904205 -0.0155000000000007 -0.00487218138286763 -0.0587984850873935 -0.4665 0.0322699413292232 -0.0493928222174892 0.394499999999999 -0.00487218138286763 -0.0587984850873935 0.00499999999999923 0.0558032172603374 0.0191572686830763 -0.7945 -0.0399596127259187 -0.0434077107297148 -0.9995 -0.0237000300545252 -0.0540306262726484 -0.446 0.0144836437413071 -0.0571946156904205 0.414999999999998 -0.0237000300545252 -0.0540306262726484 0.0254999999999992 -0.00487218138286763 -0.0587984850873935 0.435499999999998 -0.0399596127259187 -0.0434077107297148 -0.4255 -0.0518889513211829 -0.0280808961891873 -0.979 -0.0399596127259187 -0.0434077107297148 0.0459999999999992 -0.0237000300545252 -0.0540306262726484 0.455999999999998 -0.0581953169007606 -0.00971108082656329 -0.9585 -0.0399596127259187 -0.0434077107297148 0.476499999999998 -0.0518889513211829 -0.0280808961891873 0.0664999999999991 -0.0518889513211829 -0.0280808961891873 -0.405 -0.0581953169007606 -0.00971108082656329 -0.3845 -0.0518889513211829 -0.0280808961891873 0.496999999999998 -0.0581953169007606 0.00971108082656331 -0.938 -0.0581953169007606 -0.00971108082656329 0.0869999999999991 -0.0518889513211828 0.0280808961891873 -0.9175 -0.0581953169007606 0.00971108082656331 -0.364 -0.0581953169007606 -0.00971108082656329 0.517499999999998 -0.0581953169007606 0.00971108082656331 0.107499999999999 -0.0518889513211828 0.0280808961891873 -0.3435 -0.0399596127259187 0.0434077107297148 -0.897 -0.0518889513211828 0.0280808961891873 0.127999999999999 -0.0237000300545252 0.0540306262726484 -0.8765 -0.0581953169007606 0.00971108082656331 0.537999999999998 -0.0399596127259187 0.0434077107297148 0.148499999999999 -0.0399596127259187 0.0434077107297148 -0.323 -0.0237000300545252 0.0540306262726484 0.168999999999999 -0.0518889513211828 0.0280808961891873 0.558499999999998 -0.0048721813828676 0.0587984850873935 -0.856 -0.0237000300545252 0.0540306262726484 -0.3025 -0.0048721813828676 0.0587984850873935 0.189499999999999 0.0144836437413072 0.0571946156904205 -0.8355 -0.0048721813828676 0.0587984850873935 -0.282 -0.0399596127259187 0.0434077107297148 0.578999999999998 0.0322699413292232 0.0493928222174892 -0.815 0.0144836437413072 0.0571946156904205 0.209999999999999 0.0144836437413072 0.0571946156904205 -0.2615 0.0322699413292232 0.0493928222174892 0.230499999999999 0.0465592900543872 0.0362385500486904 -0.7945 0.0322699413292232 0.0493928222174892 -0.241 -0.0237000300545252 0.0540306262726484 0.599499999999998 0.0465592900543872 0.0362385500486904 -0.2205 -0.0048721813828676 0.0587984850873935 0.619999999999998 0.0465592900543872 0.0362385500486904 0.250999999999999 0.0558032172603374 0.0191572686830763 -0.774 -0.0237000300545252 -0.0540306262726484 -0.9995 0.0558032172603374 0.0191572686830763 -0.200000000000001 0.0558032172603374 -0.0191572686830763 -0.528 -0.0399596127259187 -0.0434077107297148 -0.979 0.0144836437413072 0.0571946156904205 0.640499999999998 0.0465592900543872 -0.0362385500486904 -0.5075 -0.0518889513211829 -0.0280808961891873 -0.9585 -0.0581953169007606 -0.00971108082656329 -0.938 0.0558032172603374 0.0191572686830763 0.271499999999999 0.0322699413292232 -0.0493928222174892 -0.487 0.0322699413292232 0.0493928222174892 0.660999999999998 0.0144836437413071 -0.0571946156904205 -0.4665 -0.0581953169007606 0.00971108082656331 -0.9175 -0.00487218138286763 -0.0587984850873935 -0.446 -0.0518889513211828 0.0280808961891873 -0.897 -0.0399596127259187 0.0434077107297148 -0.8765 0.0465592900543872 0.0362385500486904 0.681499999999998 -0.0237000300545252 -0.0540306262726484 -0.4255 -0.0237000300545252 0.0540306262726484 -0.856 -0.0399596127259187 -0.0434077107297148 -0.405 0.0558032172603374 -0.0191572686830763 -0.0565000000000008 -0.0048721813828676 0.0587984850873935 -0.8355 0.0465592900543872 -0.0362385500486904 -0.0360000000000008 0.0558032172603374 0.0191572686830763 0.701999999999998 -0.0518889513211829 -0.0280808961891873 -0.3845 0.0558032172603374 -0.0191572686830763 0.373999999999999 0.0322699413292232 -0.0493928222174892 -0.0155000000000007 0.0465592900543872 -0.0362385500486904 0.394499999999999 0.0144836437413072 0.0571946156904205 -0.815 -0.0581953169007606 -0.00971108082656329 -0.364 0.0144836437413071 -0.0571946156904205 0.00499999999999923 0.0322699413292232 -0.0493928222174892 0.414999999999998 -0.0581953169007606 0.00971108082656331 -0.3435 0.0322699413292232 0.0493928222174892 -0.7945 -0.00487218138286763 -0.0587984850873935 0.0254999999999992 0.0144836437413071 -0.0571946156904205 0.435499999999998 -0.0518889513211828 0.0280808961891873 -0.323 0.0465592900543872 0.0362385500486904 -0.774 -0.0237000300545252 -0.0540306262726484 0.0459999999999992 -0.00487218138286763 -0.0587984850873935 0.455999999999998 0.0558032172603374 0.0191572686830763 -0.7535 -0.0399596127259187 -0.0434077107297148 0.0664999999999991 -0.0399596127259187 0.0434077107297148 -0.3025 -0.0237000300545252 -0.0540306262726484 0.476499999999998 -0.0399596127259187 -0.0434077107297148 0.496999999999998 -0.0518889513211829 -0.0280808961891873 0.0869999999999991 -0.0237000300545252 0.0540306262726484 -0.282 -0.00487218138286763 -0.0587984850873935 -0.9995 -0.0581953169007606 -0.00971108082656329 0.107499999999999 -0.0518889513211829 -0.0280808961891873 0.517499999999998 -0.0048721813828676 0.0587984850873935 -0.2615 -0.0581953169007606 -0.00971108082656329 0.537999999999998 -0.0237000300545252 -0.0540306262726484 -0.979 -0.0581953169007606 0.00971108082656331 0.127999999999999 0.0144836437413072 0.0571946156904205 -0.241 -0.0399596127259187 -0.0434077107297148 -0.9585 -0.0518889513211828 0.0280808961891873 0.148499999999999 -0.0581953169007606 0.00971108082656331 0.558499999999998 -0.0518889513211829 -0.0280808961891873 -0.938 0.0322699413292232 0.0493928222174892 -0.2205 -0.0399596127259187 0.0434077107297148 0.168999999999999 -0.0581953169007606 -0.00971108082656329 -0.9175 -0.0518889513211828 0.0280808961891873 0.578999999999998 0.0465592900543872 0.0362385500486904 -0.200000000000001 -0.0237000300545252 0.0540306262726484 0.189499999999999 -0.0581953169007606 0.00971108082656331 -0.897 -0.0048721813828676 0.0587984850873935 0.209999999999999 -0.0518889513211828 0.0280808961891873 -0.8765 -0.0399596127259187 0.0434077107297148 0.599499999999998 0.0558032172603374 0.0191572686830763 -0.179500000000001 0.0558032172603374 -0.0191572686830763 -0.5075 0.0144836437413072 0.0571946156904205 0.230499999999999 -0.0399596127259187 0.0434077107297148 -0.856 -0.0237000300545252 0.0540306262726484 -0.8355 -0.0237000300545252 0.0540306262726484 0.619999999999998 0.0465592900543872 -0.0362385500486904 -0.487 0.0322699413292232 0.0493928222174892 0.250999999999999 0.0322699413292232 -0.0493928222174892 -0.4665 -0.0048721813828676 0.0587984850873935 -0.815 0.0465592900543872 0.0362385500486904 0.271499999999999 0.0144836437413071 -0.0571946156904205 -0.446 0.0144836437413072 0.0571946156904205 -0.7945 -0.0048721813828676 0.0587984850873935 0.640499999999998 -0.00487218138286763 -0.0587984850873935 -0.4255 0.0144836437413072 0.0571946156904205 0.660999999999998 0.0322699413292232 0.0493928222174892 -0.774 0.0465592900543872 0.0362385500486904 -0.7535 -0.0237000300545252 -0.0540306262726484 -0.405 -0.0399596127259187 -0.0434077107297148 -0.3845 -0.0518889513211829 -0.0280808961891873 -0.364 0.0322699413292232 0.0493928222174892 0.681499999999998 0.0465592900543872 0.0362385500486904 0.701999999999998 0.0558032172603374 0.0191572686830763 -0.733 0.0144836437413071 -0.0571946156904205 -0.9995 -0.0581953169007606 -0.00971108082656329 -0.3435 -0.0581953169007606 0.00971108082656331 -0.323 -0.00487218138286763 -0.0587984850873935 -0.979 0.0558032172603374 0.0191572686830763 0.722499999999998 0.0558032172603374 0.0191572686830763 0.291999999999999 -0.0518889513211829 -0.0280808961891873 -0.9175 -0.0518889513211828 0.0280808961891873 -0.3025 0.0558032172603374 -0.0191572686830763 -0.0360000000000008 -0.0581953169007606 -0.00971108082656329 -0.897 0.0558032172603374 -0.0191572686830763 0.394499999999999 -0.0399596127259187 0.0434077107297148 -0.282 0.0465592900543872 -0.0362385500486904 -0.0155000000000007 -0.0581953169007606 0.00971108082656331 -0.8765 0.0465592900543872 -0.0362385500486904 0.414999999999998 -0.0237000300545252 0.0540306262726484 -0.2615 0.0322699413292232 -0.0493928222174892 0.00499999999999923 -0.0518889513211828 0.0280808961891873 -0.856 0.0322699413292232 -0.0493928222174892 0.435499999999998 0.0144836437413071 -0.0571946156904205 0.0254999999999992 -0.0048721813828676 0.0587984850873935 -0.241 0.0144836437413071 -0.0571946156904205 0.455999999999998 -0.0399596127259187 0.0434077107297148 -0.8355 -0.00487218138286763 -0.0587984850873935 0.476499999999998 -0.00487218138286763 -0.0587984850873935 0.0459999999999992 0.0144836437413072 0.0571946156904205 -0.2205 -0.0237000300545252 0.0540306262726484 -0.815 -0.0237000300545252 -0.0540306262726484 0.496999999999998 -0.0237000300545252 -0.0540306262726484 0.0664999999999991 0.0322699413292232 0.0493928222174892 -0.200000000000001 -0.0048721813828676 0.0587984850873935 -0.7945 -0.0399596127259187 -0.0434077107297148 0.517499999999998 -0.0399596127259187 -0.0434077107297148 0.0869999999999991 0.0465592900543872 0.0362385500486904 -0.179500000000001 0.0144836437413072 0.0571946156904205 -0.774 -0.0518889513211829 -0.0280808961891873 0.107499999999999 -0.0518889513211829 -0.0280808961891873 0.537999999999998 -0.0581953169007606 -0.00971108082656329 0.127999999999999 0.0322699413292232 0.0493928222174892 -0.7535 0.0558032172603374 0.0191572686830763 -0.159000000000001 -0.0581953169007606 0.00971108082656331 0.148499999999999 -0.0581953169007606 -0.00971108082656329 0.558499999999998 0.0558032172603374 -0.0191572686830763 -0.487 0.0465592900543872 0.0362385500486904 -0.733 -0.0581953169007606 0.00971108082656331 0.578999999999998 -0.0518889513211828 0.0280808961891873 0.168999999999999 0.0465592900543872 -0.0362385500486904 -0.4665 -0.0518889513211828 0.0280808961891873 0.599499999999998 -0.0399596127259187 0.0434077107297148 0.189499999999999 0.0322699413292232 -0.0493928222174892 -0.446 -0.0237000300545252 0.0540306262726484 0.209999999999999 0.0558032172603374 0.0191572686830763 -0.7125 0.0322699413292232 -0.0493928222174892 -0.9995 0.0144836437413071 -0.0571946156904205 -0.4255 -0.0048721813828676 0.0587984850873935 0.230499999999999 -0.0399596127259187 0.0434077107297148 0.619999999999998 0.0144836437413071 -0.0571946156904205 -0.979 -0.00487218138286763 -0.0587984850873935 -0.405 0.0144836437413072 0.0571946156904205 0.250999999999999 -0.0518889513211829 -0.0280808961891873 -0.897 -0.0237000300545252 -0.0540306262726484 -0.3845 -0.0237000300545252 0.0540306262726484 0.640499999999998 -0.0581953169007606 -0.00971108082656329 -0.8765 -0.0399596127259187 -0.0434077107297148 -0.364 -0.0581953169007606 0.00971108082656331 -0.856 -0.0518889513211829 -0.0280808961891873 -0.3435 -0.0048721813828676 0.0587984850873935 0.660999999999998 0.0322699413292232 0.0493928222174892 0.271499999999999 0.0465592900543872 0.0362385500486904 0.291999999999999 -0.0518889513211828 0.0280808961891873 -0.8355 -0.0581953169007606 -0.00971108082656329 -0.323 0.0144836437413072 0.0571946156904205 0.681499999999998 -0.0399596127259187 0.0434077107297148 -0.815 -0.0581953169007606 0.00971108082656331 -0.3025 -0.0237000300545252 0.0540306262726484 -0.7945 -0.0518889513211828 0.0280808961891873 -0.282 -0.0048721813828676 0.0587984850873935 -0.774 0.0322699413292232 0.0493928222174892 0.701999999999998 -0.0399596127259187 0.0434077107297148 -0.2615 0.0558032172603374 0.0191572686830763 0.312499999999999 0.0465592900543872 0.0362385500486904 0.722499999999998 -0.0237000300545252 0.0540306262726484 -0.241 0.0144836437413072 0.0571946156904205 -0.7535 -0.0048721813828676 0.0587984850873935 -0.2205 0.0558032172603374 0.0191572686830763 0.742999999999998 0.0322699413292232 0.0493928222174892 -0.733 0.0144836437413072 0.0571946156904205 -0.200000000000001 0.0465592900543872 0.0362385500486904 -0.7125 0.0322699413292232 0.0493928222174892 -0.179500000000001 0.0558032172603374 -0.0191572686830763 -0.0155000000000007 0.0558032172603374 -0.0191572686830763 0.414999999999998 0.0465592900543872 -0.0362385500486904 0.435499999999998 0.0465592900543872 0.0362385500486904 -0.159000000000001 0.0465592900543872 -0.0362385500486904 0.00499999999999923 0.0322699413292232 -0.0493928222174892 0.455999999999998 0.0558032172603374 0.0191572686830763 -0.692 0.0322699413292232 -0.0493928222174892 0.0254999999999992 0.0465592900543872 -0.0362385500486904 -0.9995 0.0144836437413071 -0.0571946156904205 0.476499999999998 0.0558032172603374 0.0191572686830763 -0.138500000000001 0.0322699413292232 -0.0493928222174892 -0.979 0.0144836437413071 -0.0571946156904205 0.0459999999999992 -0.00487218138286763 -0.0587984850873935 0.496999999999998 0.0558032172603374 -0.0191572686830763 -0.4665 -0.00487218138286763 -0.0587984850873935 0.0664999999999991 -0.0518889513211829 -0.0280808961891873 -0.8765 -0.0237000300545252 -0.0540306262726484 0.517499999999998 -0.0237000300545252 -0.0540306262726484 0.0869999999999991 0.0465592900543872 -0.0362385500486904 -0.446 -0.0581953169007606 -0.00971108082656329 -0.856 -0.0399596127259187 -0.0434077107297148 0.537999999999998 0.0322699413292232 -0.0493928222174892 -0.4255 -0.0399596127259187 -0.0434077107297148 0.107499999999999 -0.0518889513211829 -0.0280808961891873 0.558499999999998 -0.0518889513211829 -0.0280808961891873 0.127999999999999 0.0144836437413071 -0.0571946156904205 -0.405 -0.0581953169007606 0.00971108082656331 -0.8355 -0.0581953169007606 -0.00971108082656329 0.578999999999998 -0.0581953169007606 -0.00971108082656329 0.148499999999999 -0.0518889513211828 0.0280808961891873 -0.815 -0.0581953169007606 0.00971108082656331 0.168999999999999 -0.00487218138286763 -0.0587984850873935 -0.3845 -0.0399596127259187 0.0434077107297148 -0.7945 -0.0237000300545252 -0.0540306262726484 -0.364 -0.0518889513211828 0.0280808961891873 0.189499999999999 -0.0237000300545252 0.0540306262726484 -0.774 -0.0581953169007606 0.00971108082656331 0.599499999999998 -0.0399596127259187 -0.0434077107297148 -0.3435 -0.0399596127259187 0.0434077107297148 0.209999999999999 -0.0048721813828676 0.0587984850873935 -0.7535 -0.0518889513211829 -0.0280808961891873 -0.323 -0.0237000300545252 0.0540306262726484 0.230499999999999 0.0144836437413072 0.0571946156904205 -0.733 -0.0518889513211828 0.0280808961891873 0.619999999999998 -0.0399596127259187 0.0434077107297148 0.640499999999998 -0.0581953169007606 -0.00971108082656329 -0.3025 -0.0048721813828676 0.0587984850873935 0.250999999999999 0.0322699413292232 0.0493928222174892 -0.7125 0.0144836437413072 0.0571946156904205 0.271499999999999 0.0465592900543872 0.0362385500486904 -0.692 -0.0237000300545252 0.0540306262726484 0.660999999999998 -0.0581953169007606 0.00971108082656331 -0.282 -0.0518889513211828 0.0280808961891873 -0.2615 -0.0048721813828676 0.0587984850873935 0.681499999999998 -0.0399596127259187 0.0434077107297148 -0.241 0.0558032172603374 0.0191572686830763 -0.6715 0.0322699413292232 0.0493928222174892 0.291999999999999 0.0558032172603374 -0.0191572686830763 -0.9995 -0.0237000300545252 0.0540306262726484 -0.2205 0.0465592900543872 -0.0362385500486904 -0.979 -0.0048721813828676 0.0587984850873935 -0.200000000000001 0.0144836437413072 0.0571946156904205 0.701999999999998 -0.0399596127259187 -0.0434077107297148 -0.8765 0.0465592900543872 0.0362385500486904 0.312499999999999 -0.0518889513211829 -0.0280808961891873 -0.856 0.0144836437413072 0.0571946156904205 -0.179500000000001 0.0322699413292232 0.0493928222174892 0.722499999999998 0.0465592900543872 0.0362385500486904 0.742999999999998 0.0322699413292232 0.0493928222174892 -0.159000000000001 -0.0581953169007606 -0.00971108082656329 -0.8355 0.0465592900543872 0.0362385500486904 -0.138500000000001 -0.0581953169007606 0.00971108082656331 -0.815 -0.0518889513211828 0.0280808961891873 -0.7945 0.0558032172603374 0.0191572686830763 -0.118000000000001 0.0558032172603374 0.0191572686830763 0.763499999999998 0.0558032172603374 -0.0191572686830763 -0.446 0.0558032172603374 -0.0191572686830763 0.435499999999998 -0.0399596127259187 0.0434077107297148 -0.774 0.0558032172603374 0.0191572686830763 0.332999999999999 0.0465592900543872 -0.0362385500486904 0.455999999999998 0.0465592900543872 -0.0362385500486904 -0.4255 0.0558032172603374 -0.0191572686830763 0.00499999999999923 -0.0237000300545252 0.0540306262726484 -0.7535 0.0322699413292232 -0.0493928222174892 0.476499999999998 0.0322699413292232 -0.0493928222174892 -0.405 0.0465592900543872 -0.0362385500486904 0.0254999999999992 0.0144836437413071 -0.0571946156904205 0.496999999999998 -0.0048721813828676 0.0587984850873935 -0.733 0.0144836437413071 -0.0571946156904205 -0.3845 0.0322699413292232 -0.0493928222174892 0.0459999999999992 -0.00487218138286763 -0.0587984850873935 0.517499999999998 0.0144836437413072 0.0571946156904205 -0.7125 -0.00487218138286763 -0.0587984850873935 -0.364 -0.0237000300545252 -0.0540306262726484 0.537999999999998 0.0322699413292232 0.0493928222174892 -0.692 0.0144836437413071 -0.0571946156904205 0.0664999999999991 -0.0399596127259187 -0.0434077107297148 0.558499999999998 -0.0237000300545252 -0.0540306262726484 -0.3435 -0.00487218138286763 -0.0587984850873935 0.0869999999999991 -0.0518889513211829 -0.0280808961891873 0.578999999999998 0.0465592900543872 0.0362385500486904 -0.6715 -0.0399596127259187 -0.0434077107297148 -0.323 -0.0237000300545252 -0.0540306262726484 0.107499999999999 0.0558032172603374 0.0191572686830763 -0.651 -0.0581953169007606 -0.00971108082656329 0.599499999999998 -0.0399596127259187 -0.0434077107297148 0.127999999999999 -0.0518889513211829 -0.0280808961891873 -0.3025 -0.0518889513211829 -0.0280808961891873 0.148499999999999 -0.0581953169007606 0.00971108082656331 0.619999999999998 0.0558032172603374 -0.0191572686830763 -0.979 -0.0581953169007606 -0.00971108082656329 -0.282 -0.0581953169007606 -0.00971108082656329 0.168999999999999 -0.0581953169007606 0.00971108082656331 0.189499999999999 0.0465592900543872 -0.0362385500486904 -0.9585 -0.0581953169007606 0.00971108082656331 -0.2615 -0.0399596127259187 -0.0434077107297148 -0.856 -0.0518889513211828 0.0280808961891873 0.640499999999998 -0.0518889513211828 0.0280808961891873 0.209999999999999 -0.0518889513211828 0.0280808961891873 -0.241 -0.0399596127259187 0.0434077107297148 0.230499999999999 -0.0518889513211829 -0.0280808961891873 -0.8355 -0.0399596127259187 0.0434077107297148 0.660999999999998 -0.0399596127259187 0.0434077107297148 -0.2205 -0.0237000300545252 0.0540306262726484 0.250999999999999 -0.0581953169007606 -0.00971108082656329 -0.815 -0.0237000300545252 0.0540306262726484 -0.200000000000001 -0.0048721813828676 0.0587984850873935 0.271499999999999 -0.0581953169007606 0.00971108082656331 -0.7945 -0.0237000300545252 0.0540306262726484 0.681499999999998 -0.0048721813828676 0.0587984850873935 -0.179500000000001 0.0144836437413072 0.0571946156904205 0.291999999999999 -0.0048721813828676 0.0587984850873935 0.701999999999998 -0.0518889513211828 0.0280808961891873 -0.774 0.0144836437413072 0.0571946156904205 -0.159000000000001 -0.0399596127259187 0.0434077107297148 -0.7535 0.0322699413292232 0.0493928222174892 0.312499999999999 0.0322699413292232 0.0493928222174892 -0.138500000000001 0.0144836437413072 0.0571946156904205 0.722499999999998 -0.0237000300545252 0.0540306262726484 -0.733 0.0465592900543872 0.0362385500486904 -0.118000000000001 -0.0048721813828676 0.0587984850873935 -0.7125 0.0322699413292232 0.0493928222174892 0.742999999999998 0.0465592900543872 0.0362385500486904 0.332999999999999 0.0144836437413072 0.0571946156904205 -0.692 0.0558032172603374 0.0191572686830763 -0.0975000000000007 0.0558032172603374 -0.0191572686830763 -0.4255 0.0465592900543872 0.0362385500486904 0.763499999999998 0.0322699413292232 0.0493928222174892 -0.6715 0.0465592900543872 -0.0362385500486904 -0.405 0.0465592900543872 0.0362385500486904 -0.651 0.0322699413292232 -0.0493928222174892 -0.3845 0.0144836437413071 -0.0571946156904205 -0.364 0.0558032172603374 0.0191572686830763 -0.6305 0.0558032172603374 0.0191572686830763 0.783999999999998 0.0558032172603374 -0.0191572686830763 0.455999999999998 0.0558032172603374 -0.0191572686830763 -0.9585 -0.00487218138286763 -0.0587984850873935 -0.3435 0.0465592900543872 -0.0362385500486904 0.476499999999998 -0.0237000300545252 -0.0540306262726484 -0.856 0.0322699413292232 -0.0493928222174892 0.496999999999998 -0.0237000300545252 -0.0540306262726484 -0.323 0.0558032172603374 0.0191572686830763 0.353499999999999 0.0558032172603374 -0.0191572686830763 0.0254999999999992 0.0144836437413071 -0.0571946156904205 0.517499999999998 -0.0399596127259187 -0.0434077107297148 -0.3025 0.0465592900543872 -0.0362385500486904 0.0459999999999992 -0.00487218138286763 -0.0587984850873935 0.537999999999998 -0.0399596127259187 -0.0434077107297148 -0.8355 -0.0518889513211829 -0.0280808961891873 -0.815 -0.0237000300545252 -0.0540306262726484 0.558499999999998 -0.0518889513211829 -0.0280808961891873 -0.282 0.0322699413292232 -0.0493928222174892 0.0664999999999991 -0.0581953169007606 -0.00971108082656329 -0.7945 -0.0581953169007606 -0.00971108082656329 -0.2615 -0.0399596127259187 -0.0434077107297148 0.578999999999998 0.0144836437413071 -0.0571946156904205 0.0869999999999991 -0.0518889513211829 -0.0280808961891873 0.599499999999998 -0.00487218138286763 -0.0587984850873935 0.107499999999999 -0.0581953169007606 0.00971108082656331 -0.241 -0.0581953169007606 0.00971108082656331 -0.774 -0.0237000300545252 -0.0540306262726484 0.127999999999999 -0.0518889513211828 0.0280808961891873 -0.2205 -0.0518889513211828 0.0280808961891873 -0.7535 -0.0399596127259187 -0.0434077107297148 0.148499999999999 -0.0581953169007606 -0.00971108082656329 0.619999999999998 -0.0399596127259187 0.0434077107297148 -0.733 -0.0399596127259187 0.0434077107297148 -0.200000000000001 -0.0581953169007606 0.00971108082656331 0.640499999999998 -0.0518889513211829 -0.0280808961891873 0.168999999999999 -0.0237000300545252 0.0540306262726484 -0.179500000000001 -0.0581953169007606 -0.00971108082656329 0.189499999999999 -0.0237000300545252 0.0540306262726484 -0.7125 -0.0581953169007606 0.00971108082656331 0.209999999999999 -0.0048721813828676 0.0587984850873935 -0.692 -0.0048721813828676 0.0587984850873935 -0.159000000000001 0.0144836437413072 0.0571946156904205 -0.138500000000001 -0.0518889513211828 0.0280808961891873 0.660999999999998 -0.0518889513211828 0.0280808961891873 0.230499999999999 0.0144836437413072 0.0571946156904205 -0.6715 -0.0399596127259187 0.0434077107297148 0.681499999999998 0.0322699413292232 0.0493928222174892 -0.118000000000001 -0.0399596127259187 0.0434077107297148 0.250999999999999 0.0322699413292232 0.0493928222174892 -0.651 -0.0237000300545252 0.0540306262726484 0.271499999999999 0.0465592900543872 0.0362385500486904 -0.0975000000000007 -0.0237000300545252 0.0540306262726484 0.701999999999998 0.0465592900543872 0.0362385500486904 -0.6305 -0.0048721813828676 0.0587984850873935 0.291999999999999 0.0558032172603374 0.0191572686830763 -0.0770000000000007 0.0144836437413072 0.0571946156904205 0.312499999999999 0.0558032172603374 -0.0191572686830763 -0.405 0.0558032172603374 0.0191572686830763 -0.61 -0.0048721813828676 0.0587984850873935 0.722499999999998 0.0558032172603374 -0.0191572686830763 -0.938 0.0322699413292232 0.0493928222174892 0.332999999999999 0.0465592900543872 -0.0362385500486904 -0.3845 0.0144836437413072 0.0571946156904205 0.742999999999998 -0.00487218138286763 -0.0587984850873935 -0.856 0.0322699413292232 -0.0493928222174892 -0.364 0.0322699413292232 0.0493928222174892 0.763499999999998 0.0144836437413071 -0.0571946156904205 -0.3435 -0.0237000300545252 -0.0540306262726484 -0.8355 0.0465592900543872 0.0362385500486904 0.783999999999998 -0.00487218138286763 -0.0587984850873935 -0.323 -0.0399596127259187 -0.0434077107297148 -0.815 0.0558032172603374 0.0191572686830763 0.804499999999998 -0.0237000300545252 -0.0540306262726484 -0.3025 -0.0518889513211829 -0.0280808961891873 -0.7945 -0.0399596127259187 -0.0434077107297148 -0.282 0.0558032172603374 -0.0191572686830763 0.476499999999998 0.0465592900543872 0.0362385500486904 0.353499999999999 -0.0581953169007606 -0.00971108082656329 -0.774 -0.0518889513211829 -0.0280808961891873 -0.2615 0.0465592900543872 -0.0362385500486904 0.496999999999998 -0.0581953169007606 0.00971108082656331 -0.7535 -0.0581953169007606 -0.00971108082656329 -0.241 0.0322699413292232 -0.0493928222174892 0.517499999999998 0.0144836437413071 -0.0571946156904205 0.537999999999998 -0.0518889513211828 0.0280808961891873 -0.733 -0.00487218138286763 -0.0587984850873935 0.558499999999998 -0.0581953169007606 0.00971108082656331 -0.2205 -0.0399596127259187 0.0434077107297148 -0.7125 0.0558032172603374 0.0191572686830763 0.373999999999999 -0.0237000300545252 -0.0540306262726484 0.578999999999998 0.0558032172603374 -0.0191572686830763 0.0459999999999992 -0.0518889513211828 0.0280808961891873 -0.200000000000001 -0.0237000300545252 0.0540306262726484 -0.692 -0.0399596127259187 -0.0434077107297148 0.599499999999998 0.0465592900543872 -0.0362385500486904 0.0664999999999991 -0.0399596127259187 0.0434077107297148 -0.179500000000001 0.0322699413292232 -0.0493928222174892 0.0869999999999991 -0.0518889513211829 -0.0280808961891873 0.619999999999998 -0.0048721813828676 0.0587984850873935 -0.6715 -0.0237000300545252 0.0540306262726484 -0.159000000000001 0.0144836437413072 0.0571946156904205 -0.651 -0.0048721813828676 0.0587984850873935 -0.138500000000001 -0.0581953169007606 -0.00971108082656329 0.640499999999998 0.0144836437413071 -0.0571946156904205 0.107499999999999 0.0322699413292232 0.0493928222174892 -0.6305 -0.00487218138286763 -0.0587984850873935 0.127999999999999 0.0144836437413072 0.0571946156904205 -0.118000000000001 -0.0237000300545252 -0.0540306262726484 0.148499999999999 0.0465592900543872 0.0362385500486904 -0.61 -0.0581953169007606 0.00971108082656331 0.660999999999998 0.0322699413292232 0.0493928222174892 -0.0975000000000007 -0.0399596127259187 -0.0434077107297148 0.168999999999999 -0.0518889513211829 -0.0280808961891873 0.189499999999999 -0.0518889513211828 0.0280808961891873 0.681499999999998 0.0558032172603374 0.0191572686830763 -0.5895 0.0558032172603374 -0.0191572686830763 -0.9175 0.0465592900543872 0.0362385500486904 -0.0770000000000007 -0.0581953169007606 -0.00971108082656329 0.209999999999999 0.0558032172603374 0.0191572686830763 -0.0565000000000008 -0.0399596127259187 0.0434077107297148 0.701999999999998 -0.0581953169007606 0.00971108082656331 0.230499999999999 0.0558032172603374 -0.0191572686830763 -0.3845 0.0465592900543872 -0.0362385500486904 -0.897 -0.0518889513211828 0.0280808961891873 0.250999999999999 0.0322699413292232 -0.0493928222174892 -0.8765 -0.0399596127259187 0.0434077107297148 0.271499999999999 -0.0237000300545252 0.0540306262726484 0.722499999999998 0.0465592900543872 -0.0362385500486904 -0.364 0.0144836437413071 -0.0571946156904205 -0.856 -0.0237000300545252 0.0540306262726484 0.291999999999999 0.0322699413292232 -0.0493928222174892 -0.3435 -0.0048721813828676 0.0587984850873935 0.742999999999998 0.0144836437413071 -0.0571946156904205 -0.323 -0.00487218138286763 -0.0587984850873935 -0.8355 -0.0048721813828676 0.0587984850873935 0.312499999999999 -0.0237000300545252 -0.0540306262726484 -0.815 -0.00487218138286763 -0.0587984850873935 -0.3025 0.0144836437413072 0.0571946156904205 0.332999999999999 0.0144836437413072 0.0571946156904205 0.763499999999998 -0.0399596127259187 -0.0434077107297148 -0.7945 0.0322699413292232 0.0493928222174892 0.783999999999998 -0.0237000300545252 -0.0540306262726484 -0.282 0.0322699413292232 0.0493928222174892 0.353499999999999 -0.0399596127259187 -0.0434077107297148 -0.2615 -0.0518889513211829 -0.0280808961891873 -0.774 -0.0581953169007606 -0.00971108082656329 -0.7535 -0.0518889513211829 -0.0280808961891873 -0.241 0.0465592900543872 0.0362385500486904 0.804499999999998 -0.0581953169007606 0.00971108082656331 -0.733 0.0465592900543872 0.0362385500486904 0.373999999999999 -0.0581953169007606 -0.00971108082656329 -0.2205 -0.0518889513211828 0.0280808961891873 -0.7125 -0.0581953169007606 0.00971108082656331 -0.200000000000001 0.0558032172603374 0.0191572686830763 0.824999999999998 0.0558032172603374 -0.0191572686830763 0.496999999999998 -0.0399596127259187 0.0434077107297148 -0.692 0.0465592900543872 -0.0362385500486904 0.517499999999998 -0.0518889513211828 0.0280808961891873 -0.179500000000001 -0.0237000300545252 0.0540306262726484 -0.6715 -0.0399596127259187 0.0434077107297148 -0.159000000000001 0.0322699413292232 -0.0493928222174892 0.537999999999998 -0.0048721813828676 0.0587984850873935 -0.651 -0.0237000300545252 0.0540306262726484 -0.138500000000001 0.0144836437413071 -0.0571946156904205 0.558499999999998 0.0144836437413072 0.0571946156904205 -0.6305 -0.00487218138286763 -0.0587984850873935 0.578999999999998 -0.0048721813828676 0.0587984850873935 -0.118000000000001 -0.0237000300545252 -0.0540306262726484 0.599499999999998 0.0322699413292232 0.0493928222174892 -0.61 0.0144836437413072 0.0571946156904205 -0.0975000000000007 0.0558032172603374 0.0191572686830763 0.394499999999999 0.0558032172603374 -0.0191572686830763 0.0664999999999991 -0.0399596127259187 -0.0434077107297148 0.619999999999998 0.0465592900543872 0.0362385500486904 -0.5895 -0.0518889513211829 -0.0280808961891873 0.640499999999998 0.0465592900543872 -0.0362385500486904 0.0869999999999991 0.0322699413292232 0.0493928222174892 -0.0770000000000007 0.0465592900543872 0.0362385500486904 -0.0565000000000008 0.0322699413292232 -0.0493928222174892 0.107499999999999 0.0558032172603374 0.0191572686830763 -0.569 0.0144836437413071 -0.0571946156904205 0.127999999999999 0.0558032172603374 0.0191572686830763 -0.0360000000000008 0.0558032172603374 -0.0191572686830763 -0.897 -0.0581953169007606 -0.00971108082656329 0.660999999999998 -0.00487218138286763 -0.0587984850873935 0.148499999999999 -0.0581953169007606 0.00971108082656331 0.681499999999998 0.0558032172603374 -0.0191572686830763 -0.364 0.0465592900543872 -0.0362385500486904 -0.8765 -0.0237000300545252 -0.0540306262726484 0.168999999999999 -0.0518889513211828 0.0280808961891873 0.701999999999998 -0.0399596127259187 -0.0434077107297148 0.189499999999999 0.0465592900543872 -0.0362385500486904 -0.3435 0.0322699413292232 -0.0493928222174892 -0.856 -0.0518889513211829 -0.0280808961891873 0.209999999999999 0.0322699413292232 -0.0493928222174892 -0.323 0.0144836437413071 -0.0571946156904205 -0.8355 -0.0581953169007606 -0.00971108082656329 0.230499999999999 0.0144836437413071 -0.0571946156904205 -0.3025 -0.0581953169007606 0.00971108082656331 0.250999999999999 -0.00487218138286763 -0.0587984850873935 -0.815 -0.0399596127259187 0.0434077107297148 0.722499999999998 -0.0237000300545252 0.0540306262726484 0.742999999999998 -0.00487218138286763 -0.0587984850873935 -0.282 -0.0237000300545252 -0.0540306262726484 -0.7945 -0.0518889513211828 0.0280808961891873 0.271499999999999 -0.0237000300545252 -0.0540306262726484 -0.2615 -0.0048721813828676 0.0587984850873935 0.763499999999998 -0.0399596127259187 0.0434077107297148 0.291999999999999 -0.0399596127259187 -0.0434077107297148 -0.774 -0.0399596127259187 -0.0434077107297148 -0.241 -0.0518889513211829 -0.0280808961891873 -0.7535 -0.0237000300545252 0.0540306262726484 0.312499999999999 -0.0518889513211829 -0.0280808961891873 -0.2205 -0.0048721813828676 0.0587984850873935 0.332999999999999 0.0144836437413072 0.0571946156904205 0.783999999999998 -0.0581953169007606 -0.00971108082656329 -0.733 -0.0581953169007606 -0.00971108082656329 -0.200000000000001 0.0322699413292232 0.0493928222174892 0.804499999999998 -0.0581953169007606 0.00971108082656331 -0.7125 -0.0581953169007606 0.00971108082656331 -0.179500000000001 -0.0518889513211828 0.0280808961891873 -0.692 0.0465592900543872 0.0362385500486904 0.824999999999998 -0.0518889513211828 0.0280808961891873 -0.159000000000001 -0.0399596127259187 0.0434077107297148 -0.6715 0.0144836437413072 0.0571946156904205 0.353499999999999 0.0322699413292232 0.0493928222174892 0.373999999999999 0.0558032172603374 0.0191572686830763 0.845499999999998 -0.0399596127259187 0.0434077107297148 -0.138500000000001 -0.0237000300545252 0.0540306262726484 -0.651 -0.0237000300545252 0.0540306262726484 -0.118000000000001 0.0558032172603374 -0.0191572686830763 0.517499999999998 -0.0048721813828676 0.0587984850873935 -0.6305 -0.0048721813828676 0.0587984850873935 -0.0975000000000007 0.0465592900543872 -0.0362385500486904 0.537999999999998 0.0144836437413072 0.0571946156904205 -0.61 0.0465592900543872 0.0362385500486904 0.394499999999999 0.0322699413292232 -0.0493928222174892 0.558499999999998 0.0144836437413072 0.0571946156904205 -0.0770000000000007 0.0322699413292232 0.0493928222174892 -0.5895 0.0144836437413071 -0.0571946156904205 0.578999999999998 -0.00487218138286763 -0.0587984850873935 0.599499999999998 0.0465592900543872 0.0362385500486904 -0.569 0.0322699413292232 0.0493928222174892 -0.0565000000000008 -0.0237000300545252 -0.0540306262726484 0.619999999999998 0.0465592900543872 0.0362385500486904 -0.0360000000000008 -0.0399596127259187 -0.0434077107297148 0.640499999999998 0.0558032172603374 0.0191572686830763 -0.5485 0.0558032172603374 0.0191572686830763 -0.0155000000000007 -0.0518889513211829 -0.0280808961891873 0.660999999999998 0.0558032172603374 -0.0191572686830763 -0.8765 0.0558032172603374 -0.0191572686830763 -0.3435 0.0558032172603374 0.0191572686830763 0.414999999999998 0.0465592900543872 -0.0362385500486904 -0.856 -0.0581953169007606 -0.00971108082656329 0.681499999999998 0.0558032172603374 -0.0191572686830763 0.0869999999999991 0.0465592900543872 -0.0362385500486904 -0.323 0.0465592900543872 -0.0362385500486904 0.107499999999999 0.0322699413292232 -0.0493928222174892 -0.8355 0.0322699413292232 -0.0493928222174892 -0.3025 0.0322699413292232 -0.0493928222174892 0.127999999999999 -0.0581953169007606 0.00971108082656331 0.701999999999998 0.0144836437413071 -0.0571946156904205 -0.815 0.0144836437413071 -0.0571946156904205 -0.282 -0.0518889513211828 0.0280808961891873 0.722499999999998 0.0144836437413071 -0.0571946156904205 0.148499999999999 -0.00487218138286763 -0.0587984850873935 0.168999999999999 -0.00487218138286763 -0.0587984850873935 -0.7945 -0.00487218138286763 -0.0587984850873935 -0.2615 -0.0237000300545252 -0.0540306262726484 -0.774 -0.0399596127259187 0.0434077107297148 0.742999999999998 -0.0237000300545252 -0.0540306262726484 -0.241 -0.0237000300545252 -0.0540306262726484 0.189499999999999 -0.0399596127259187 -0.0434077107297148 -0.7535 -0.0399596127259187 -0.0434077107297148 0.209999999999999 -0.0399596127259187 -0.0434077107297148 -0.2205 -0.0237000300545252 0.0540306262726484 0.763499999999998 -0.0518889513211829 -0.0280808961891873 0.230499999999999 -0.0518889513211829 -0.0280808961891873 -0.733 -0.0518889513211829 -0.0280808961891873 -0.200000000000001 -0.0581953169007606 -0.00971108082656329 0.250999999999999 -0.0581953169007606 -0.00971108082656329 -0.7125 -0.0581953169007606 0.00971108082656331 0.271499999999999 -0.0581953169007606 -0.00971108082656329 -0.179500000000001 -0.0581953169007606 0.00971108082656331 -0.159000000000001 -0.0518889513211828 0.0280808961891873 0.291999999999999 -0.0581953169007606 0.00971108082656331 -0.692 -0.0048721813828676 0.0587984850873935 0.783999999999998 -0.0518889513211828 0.0280808961891873 -0.6715 0.0144836437413072 0.0571946156904205 0.804499999999998 -0.0518889513211828 0.0280808961891873 -0.138500000000001 -0.0399596127259187 0.0434077107297148 0.312499999999999 -0.0399596127259187 0.0434077107297148 -0.651 -0.0399596127259187 0.0434077107297148 -0.118000000000001 -0.0237000300545252 0.0540306262726484 0.332999999999999 0.0322699413292232 0.0493928222174892 0.824999999999998 -0.0237000300545252 0.0540306262726484 -0.6305 -0.0237000300545252 0.0540306262726484 -0.0975000000000007 -0.0048721813828676 0.0587984850873935 0.353499999999999 -0.0048721813828676 0.0587984850873935 -0.61 0.0465592900543872 0.0362385500486904 0.845499999999998 -0.0048721813828676 0.0587984850873935 -0.0770000000000007 0.0144836437413072 0.0571946156904205 -0.5895 0.0322699413292232 0.0493928222174892 -0.569 0.0558032172603374 0.0191572686830763 0.865999999999998 0.0144836437413072 0.0571946156904205 -0.0565000000000008 0.0558032172603374 -0.0191572686830763 0.537999999999998 0.0144836437413072 0.0571946156904205 0.373999999999999 0.0465592900543872 -0.0362385500486904 0.558499999999998 0.0465592900543872 0.0362385500486904 -0.5485 0.0322699413292232 0.0493928222174892 0.394499999999999 0.0322699413292232 0.0493928222174892 -0.0360000000000008 0.0322699413292232 -0.0493928222174892 0.578999999999998 0.0465592900543872 0.0362385500486904 -0.0155000000000007 0.0144836437413071 -0.0571946156904205 0.599499999999998 0.0558032172603374 0.0191572686830763 0.00499999999999923 0.0558032172603374 0.0191572686830763 -0.528 0.0465592900543872 0.0362385500486904 0.414999999999998 -0.00487218138286763 -0.0587984850873935 0.619999999999998 0.0558032172603374 -0.0191572686830763 -0.856 -0.0237000300545252 -0.0540306262726484 0.640499999999998 0.0558032172603374 -0.0191572686830763 -0.323 0.0465592900543872 -0.0362385500486904 -0.8355 -0.0399596127259187 -0.0434077107297148 0.660999999999998 0.0465592900543872 -0.0362385500486904 -0.3025 -0.0518889513211829 -0.0280808961891873 0.681499999999998 0.0322699413292232 -0.0493928222174892 -0.815 0.0558032172603374 0.0191572686830763 0.435499999999998 0.0322699413292232 -0.0493928222174892 -0.282 0.0144836437413071 -0.0571946156904205 -0.7945 -0.0581953169007606 -0.00971108082656329 0.701999999999998 0.0144836437413071 -0.0571946156904205 -0.2615 -0.00487218138286763 -0.0587984850873935 -0.774 -0.00487218138286763 -0.0587984850873935 -0.241 0.0558032172603374 -0.0191572686830763 0.107499999999999 -0.0237000300545252 -0.0540306262726484 -0.7535 -0.0581953169007606 0.00971108082656331 0.722499999999998 -0.0399596127259187 -0.0434077107297148 -0.733 -0.0518889513211829 -0.0280808961891873 -0.7125 -0.0581953169007606 -0.00971108082656329 -0.692 -0.0581953169007606 0.00971108082656331 -0.6715 0.0558032172603374 -0.0191572686830763 0.558499999999998 0.0558032172603374 -0.0191572686830763 -0.8355 0.0558032172603374 -0.0191572686830763 -0.3025 2.44491209137882 1.02408145759683 2.80466941471967 1.02 2.43682595242471 1.02262570049051 2.43228317468685 1.02110542603752 2.43147732351593 1.01955082933573 2.43445353651065 1.01801285860862 2.44106375825978 1.01652657437494 2.45109456503888 1.0151178997826 2.46431312024691 1.01380853516211 2.48049660718631 1.01261717373731 2.49945911807856 1.01156072295203 2.52108397202452 1.01065586821537 2.54533209854467 1.00992249695032 2.57228239892396 1.00938708907189 2.60178688339833 1.00909182706178 2.63286888882329 1.00908522424031 2.66316561916797 1.00937905852038 2.69128118220668 1.00993822093625 2.71674340697798 1.01072272443611 2.73931584114892 1.0116984049494 2.75880884681155 1.01283527550392 2.7750518403938 1.01410596249492 2.78788352180574 1.01548391120553 2.79716451764025 1.01694292569066 2.80278503600547 1.01845695571697 2.80231941769651 1.0217221401065 2.7953164453513 1.02340452634248 2.78377467368384 1.0250106342215 2.76786108472268 1.02650401500104 2.74778425147719 1.02784803777303 2.72377580609183 1.02900532228633 2.69571283467172 1.02994579069175 2.66648436882374 1.03056995433283 2.63824692780407 1.03088461504999 2.60945553704275 1.03093840602299 2.58128477911954 1.03073376715785 2.55484428085387 1.0302975318246 2.53117608812927 1.02968147301967 2.50563032671709 1.02872568400368 2.48199849629822 1.027477848089 2.46421419375261 1.02618304263635 2.45359680871256 1.02516411580487 5.21678510256759 0.142284549383506 4.71238898038469 0.0489999999999999 5.09210881641073 0.146073285920885 4.97371410732076 0.148668692866347 4.86302728622468 0.150225549623184 4.74977619301859 0.150952293660935 4.63570036088527 0.150799274457313 4.52274085728771 0.149772441039808 4.41264496310949 0.147932240085832 4.30667530044136 0.145373686500763 4.18068090090791 0.141306053135914 4.04740914706245 0.135716043745398 3.93317531615928 0.129698952001563 3.83275320077941 0.123116904794288 3.74807671672864 0.115840011872317 3.70080964619026 0.109987107068354 3.67770413480935 0.105314110260797 3.66865614859585 0.100845982930023 3.67186494178191 0.0967681120843361 3.68571668723299 0.0927317354199091 3.71676672763877 0.0877487250175123 3.76689048548964 0.0823176054057297 3.84933771250034 0.0756838545267796 3.95657072643189 0.0689612796514967 4.07641468880921 0.0629468376188425 4.21727780416317 0.0573951747919572 4.3429215438403 0.0536636830862009 4.46086101623767 0.05115972521058 4.57631717307016 0.0496309175674873 4.64178684569344 0.0491708863343469 4.82069306641309 0.0494003166241355 4.91352913136335 0.0503808800681784 5.01653081003707 0.0521585280943614 5.13318677592423 0.0550539282486119 5.25454451226385 0.0590827581844917 5.36792725191684 0.0638409423620643 5.50142100122972 0.07088211838917 5.62280229242527 0.0792673973204479 5.69435690919954 0.0860812610135355 5.73380979054753 0.0916886081908445 5.75139933738764 0.0961209583319534 5.75632347492835 0.100324621446683 5.7495352297098 0.104552449612672 5.73167944066085 0.108699385582087 5.69471092788781 0.113878070030169 5.63889576997943 0.119385483692949 5.54948723189013 0.126093148367781 5.43415670461436 0.132884647446895 5.3331412447393 0.137727054436835 6.28318530717959 0 6.28318530717959 2.05 0 0 0.174532925199433 0 0.349065850398866 0 0.523598775598299 0 0.698131700797732 0 0.872664625997165 0 1.0471975511966 0 1.22173047639603 0 1.39626340159546 0 1.5707963267949 0 1.74532925199433 0 1.91986217719376 0 2.0943951023932 0 2.26892802759263 0 2.44346095279206 0 2.61799387799149 0 2.79252680319093 0 2.96705972839036 0 3.14159265358979 0 3.31612557878922 0 3.49065850398866 0 3.66519142918809 0 3.83972435438752 0 4.01425727958696 0 4.18879020478639 0 4.36332312998582 0 4.53785605518525 0 4.71238898038469 0 4.88692190558412 0 5.06145483078355 0 5.23598775598299 0 5.41052068118242 0 5.58505360638185 0 5.75958653158128 0 5.93411945678072 0 6.10865238198015 0 0 2.05 0.174532925199433 2.05 0.349065850398866 2.05 0.523598775598299 2.05 0.698131700797732 2.05 0.872664625997165 2.05 1.0471975511966 2.05 1.22173047639603 2.05 1.39626340159546 2.05 1.5707963267949 2.05 1.74532925199433 2.05 1.91986217719376 2.05 2.0943951023932 2.05 2.26892802759263 2.05 2.44346095279206 2.05 2.61799387799149 2.05 2.79252680319093 2.05 2.96705972839036 2.05 3.14159265358979 2.05 3.31612557878922 2.05 3.49065850398866 2.05 3.66519142918809 2.05 3.83972435438752 2.05 4.01425727958696 2.05 4.18879020478639 2.05 4.36332312998582 2.05 4.53785605518525 2.05 4.71238898038469 2.05 4.88692190558412 2.05 5.06145483078355 2.05 5.23598775598299 2.05 5.41052068118242 2.05 5.58505360638185 2.05 5.75958653158128 2.05 5.93411945678072 2.05 6.10865238198015 2.05 4.62971548950075 0.82 4.29902152596498 0.7995 4.62971548950075 0.7995 2.97624567182191 0.3895 2.64555170828614 0.369 2.97624567182191 0.369 2.64555170828614 0.3895 4.29902152596498 0.82 2.97624567182191 1.7835 2.64555170828614 1.7835 2.64555170828614 1.763 2.64555170828614 0.41 2.31485774475037 0.3895 4.29902152596498 0.840499999999999 3.96832756242921 0.82 2.31485774475037 0.41 2.97624567182191 1.763 3.96832756242921 0.840499999999999 2.64555170828614 1.804 2.31485774475037 1.7835 2.31485774475037 0.4305 1.98416378121461 0.4305 1.98416378121461 0.41 3.96832756242921 0.860999999999999 3.63763359889344 0.840499999999999 3.63763359889344 0.860999999999999 2.31485774475037 1.804 1.98416378121461 0.451 1.65346981767884 0.451 1.65346981767884 0.4305 2.31485774475037 1.8245 1.98416378121461 1.8245 1.98416378121461 1.804 3.63763359889344 0.881499999999999 3.30693963535768 0.860999999999999 3.30693963535768 0.881499999999999 3.30693963535768 0.901999999999999 2.97624567182191 0.901999999999999 2.97624567182191 0.881499999999999 1.65346981767884 0.4715 1.32277585414307 0.451 1.32277585414307 0.4715 1.98416378121461 1.845 1.65346981767884 1.8245 2.97624567182191 0.922499999999999 2.64555170828614 0.922499999999999 2.64555170828614 0.901999999999999 0.330693963535768 1.4965 0.330693963535768 1.476 1.32277585414307 0.492 0.992081890607303 0.492 0.992081890607303 0.4715 5.95249134364382 1.1685 5.62179738010805 1.1685 5.62179738010805 1.148 5.95249134364382 1.148 1.65346981767884 1.845 5.62179738010805 1.189 5.29110341657228 1.1685 0.992081890607303 0.5125 0.661387927071535 0.492 0.661387927071535 0.5125 5.29110341657228 1.189 1.65346981767884 1.8655 1.32277585414307 1.845 2.64555170828614 0.942999999999999 2.31485774475037 0.942999999999999 2.31485774475037 0.922499999999999 1.32277585414307 1.8655 1.32277585414307 1.886 0.992081890607303 1.8655 5.29110341657228 1.2095 4.96040945303652 1.2095 4.96040945303652 1.189 0.661387927071535 0.533 0.330693963535768 0.5125 0.330693963535768 0.533 4.96040945303652 1.23 4.62971548950075 1.2095 2.31485774475037 0.963499999999999 1.98416378121461 0.942999999999999 0.992081890607303 1.886 4.62971548950075 1.23 1.98416378121461 0.963499999999999 0.992081890607303 1.9065 0.661387927071535 1.886 0.661387927071535 1.9065 4.62971548950075 1.2505 4.29902152596498 1.23 4.29902152596498 1.2505 0.330693963535768 0.5535 1.98416378121461 0.983999999999999 1.65346981767884 0.963499999999999 0.661387927071535 1.927 0.330693963535768 1.927 0.330693963535768 1.9065 1.65346981767884 0.983999999999999 4.29902152596498 1.271 3.96832756242921 1.2505 3.96832756242921 1.271 3.96832756242921 1.2915 3.63763359889344 1.271 1.65346981767884 1.0045 1.32277585414307 1.0045 1.32277585414307 0.983999999999999 5.95249134364382 0.2255 5.95249134364382 0.205 3.63763359889344 1.2915 5.62179738010805 0.205 5.62179738010805 0.2255 5.62179738010805 0.246 5.29110341657228 0.246 5.29110341657228 0.2255 3.63763359889344 1.312 3.30693963535768 1.312 3.30693963535768 1.2915 1.32277585414307 1.025 0.992081890607303 1.025 0.992081890607303 1.0045 0.330693963535768 1.9475 5.95249134364382 1.6195 5.95249134364382 1.599 3.30693963535768 1.3325 2.97624567182191 1.312 5.62179738010805 1.6195 5.62179738010805 1.599 5.29110341657228 0.2665 4.96040945303652 0.246 2.97624567182191 1.3325 5.62179738010805 1.64 5.29110341657228 1.64 5.29110341657228 1.6195 2.97624567182191 1.353 2.64555170828614 1.3325 2.64555170828614 1.353 4.96040945303652 0.2665 0.992081890607303 1.0455 0.661387927071535 1.0455 0.661387927071535 1.025 4.96040945303652 0.287 4.62971548950075 0.2665 5.29110341657228 1.6605 4.96040945303652 1.64 0.661387927071535 1.066 0.330693963535768 1.0455 4.96040945303652 1.6605 4.96040945303652 1.681 4.62971548950075 1.6605 2.64555170828614 1.3735 2.31485774475037 1.3735 2.31485774475037 1.353 4.62971548950075 0.287 4.62971548950075 1.681 4.62971548950075 0.3075 4.29902152596498 0.287 4.62971548950075 1.7015 4.29902152596498 1.7015 4.29902152596498 1.681 0.330693963535768 1.066 4.29902152596498 0.3075 4.29902152596498 0.328 3.96832756242921 0.328 3.96832756242921 0.3075 2.31485774475037 1.394 1.98416378121461 1.394 1.98416378121461 1.3735 4.29902152596498 1.722 3.96832756242921 1.7015 1.98416378121461 1.4145 1.65346981767884 1.394 1.65346981767884 1.4145 3.96832756242921 1.722 3.96832756242921 0.3485 3.63763359889344 0.3485 3.63763359889344 0.328 3.63763359889344 0.369 3.30693963535768 0.3485 3.30693963535768 0.369 3.96832756242921 1.7425 3.63763359889344 1.722 3.63763359889344 1.7425 1.65346981767884 1.435 1.32277585414307 1.435 1.32277585414307 1.4145 3.63763359889344 1.763 3.30693963535768 1.763 3.30693963535768 1.7425 3.30693963535768 0.3895 0.330693963535768 1.0865 2.97624567182191 0.41 3.30693963535768 1.7835 5.95249134364382 0.7585 5.62179738010805 0.738 5.95249134364382 0.738 1.32277585414307 1.4555 0.992081890607303 1.435 0.992081890607303 1.4555 5.62179738010805 0.7585 2.97624567182191 1.804 2.64555170828614 0.4305 5.62179738010805 0.779 5.29110341657228 0.7585 5.29110341657228 0.779 2.31485774475037 0.451 0.992081890607303 1.476 0.661387927071535 1.476 0.661387927071535 1.4555 5.29110341657228 0.7995 4.96040945303652 0.779 2.64555170828614 1.8245 4.96040945303652 0.7995 1.98416378121461 0.4715 0.661387927071535 1.4965 4.96040945303652 0.82 1.65346981767884 0.492 4.62971548950075 0.840499999999999 2.31485774475037 1.845 1.32277585414307 0.5125 4.29902152596498 0.860999999999999 0.992081890607303 0.533 3.96832756242921 0.881499999999999 1.98416378121461 1.8655 1.65346981767884 1.886 3.63763359889344 0.901999999999999 0.330693963535768 1.517 0.661387927071535 0.5535 1.32277585414307 1.9065 3.30693963535768 0.922499999999999 0.330693963535768 0.574 2.97624567182191 0.942999999999999 0.992081890607303 1.927 5.95249134364382 1.189 5.95249134364382 0.246 5.62179738010805 1.2095 2.64555170828614 0.963499999999999 0.661387927071535 1.9475 5.62179738010805 0.2665 5.29110341657228 1.23 5.29110341657228 0.287 4.96040945303652 1.2505 0.330693963535768 1.968 2.31485774475037 0.983999999999999 5.95249134364382 1.64 4.96040945303652 0.3075 4.62971548950075 1.271 5.62179738010805 1.6605 1.98416378121461 1.0045 4.29902152596498 1.2915 5.29110341657228 1.681 4.62971548950075 0.328 3.96832756242921 1.312 1.65346981767884 1.025 4.96040945303652 1.7015 3.63763359889344 1.3325 4.29902152596498 0.3485 4.62971548950075 1.722 1.32277585414307 1.0455 3.30693963535768 1.353 4.29902152596498 1.7425 3.96832756242921 0.369 3.63763359889344 0.3895 0.992081890607303 1.066 2.97624567182191 1.3735 3.96832756242921 1.763 2.64555170828614 1.394 3.30693963535768 0.41 0.661387927071535 1.0865 3.63763359889344 1.7835 2.97624567182191 0.4305 2.31485774475037 1.4145 3.30693963535768 1.804 2.64555170828614 0.451 1.98416378121461 1.435 2.31485774475037 0.4715 1.65346981767884 1.4555 1.98416378121461 0.492 2.97624567182191 1.8245 1.65346981767884 0.5125 2.64555170828614 1.845 1.32277585414307 1.476 1.32277585414307 0.533 0.330693963535768 1.107 2.31485774475037 1.8655 5.95249134364382 0.779 0.992081890607303 0.5535 0.661387927071535 0.574 1.98416378121461 1.886 0.992081890607303 1.4965 5.62179738010805 0.7995 1.65346981767884 1.9065 5.29110341657228 0.82 0.661387927071535 1.517 1.32277585414307 1.927 0.330693963535768 0.5945 4.96040945303652 0.840499999999999 5.95249134364382 0.2665 0.992081890607303 1.9475 4.62971548950075 0.860999999999999 5.62179738010805 0.287 0.661387927071535 1.968 4.29902152596498 0.881499999999999 5.29110341657228 0.3075 3.96832756242921 0.901999999999999 4.96040945303652 0.328 3.63763359889344 0.922499999999999 0.330693963535768 1.9885 5.95249134364382 1.6605 0.330693963535768 1.5375 5.62179738010805 1.681 4.62971548950075 0.3485 5.95249134364382 1.2095 5.29110341657228 1.7015 3.30693963535768 0.942999999999999 4.29902152596498 0.369 2.97624567182191 0.963499999999999 5.62179738010805 1.23 4.96040945303652 1.722 5.29110341657228 1.2505 3.96832756242921 0.3895 4.62971548950075 1.7425 4.96040945303652 1.271 3.63763359889344 0.41 4.29902152596498 1.763 2.64555170828614 0.983999999999999 4.62971548950075 1.2915 2.31485774475037 1.0045 3.30693963535768 0.4305 4.29902152596498 1.312 3.96832756242921 1.7835 2.97624567182191 0.451 3.96832756242921 1.3325 1.98416378121461 1.025 3.63763359889344 1.353 2.64555170828614 0.4715 3.63763359889344 1.804 1.65346981767884 1.0455 3.30693963535768 1.3735 2.31485774475037 0.492 2.97624567182191 1.394 3.30693963535768 1.8245 1.32277585414307 1.066 1.98416378121461 0.5125 2.64555170828614 1.4145 1.65346981767884 0.533 2.31485774475037 1.435 0.992081890607303 1.0865 2.97624567182191 1.845 1.32277585414307 0.5535 2.64555170828614 1.8655 0.992081890607303 0.574 1.98416378121461 1.4555 2.31485774475037 1.886 0.661387927071535 0.5945 1.65346981767884 1.476 1.98416378121461 1.9065 0.661387927071535 1.107 1.65346981767884 1.927 0.330693963535768 0.615 5.95249134364382 0.287 1.32277585414307 1.9475 5.62179738010805 0.3075 0.992081890607303 1.968 1.32277585414307 1.4965 0.992081890607303 1.517 5.29110341657228 0.328 0.330693963535768 1.1275 0.661387927071535 1.9885 4.96040945303652 0.3485 5.95249134364382 0.7995 0.330693963535768 2.009 5.95249134364382 1.681 4.62971548950075 0.369 5.62179738010805 1.7015 5.62179738010805 0.82 0.661387927071535 1.5375 4.29902152596498 0.3895 5.29110341657228 1.722 5.29110341657228 0.840499999999999 4.96040945303652 0.860999999999999 4.96040945303652 1.7425 3.96832756242921 0.41 4.62971548950075 1.763 4.62971548950075 0.881499999999999 3.63763359889344 0.4305 4.29902152596498 1.7835 4.29902152596498 0.901999999999999 3.30693963535768 0.451 0.330693963535768 1.558 5.95249134364382 1.23 2.97624567182191 0.4715 3.96832756242921 1.804 3.96832756242921 0.922499999999999 3.63763359889344 0.942999999999999 5.62179738010805 1.2505 2.64555170828614 0.492 5.29110341657228 1.271 3.63763359889344 1.8245 4.96040945303652 1.2915 2.31485774475037 0.5125 3.30693963535768 0.963499999999999 4.62971548950075 1.312 3.30693963535768 1.845 1.98416378121461 0.533 4.29902152596498 1.3325 2.97624567182191 0.983999999999999 1.65346981767884 0.5535 2.97624567182191 1.8655 3.96832756242921 1.353 2.64555170828614 1.0045 1.32277585414307 0.574 3.63763359889344 1.3735 0.992081890607303 0.5945 2.31485774475037 1.025 3.30693963535768 1.394 2.64555170828614 1.886 0.661387927071535 0.615 2.31485774475037 1.9065 1.98416378121461 1.0455 2.97624567182191 1.4145 1.98416378121461 1.927 2.64555170828614 1.435 0.330693963535768 0.6355 1.65346981767884 1.066 1.65346981767884 1.9475 2.31485774475037 1.4555 5.95249134364382 0.3075 1.32277585414307 1.0865 1.32277585414307 1.968 1.98416378121461 1.476 5.62179738010805 0.328 0.992081890607303 1.107 0.992081890607303 1.9885 5.29110341657228 0.3485 1.65346981767884 1.4965 0.661387927071535 2.009 4.96040945303652 0.369 0.330693963535768 2.0295 5.95249134364382 1.7015 4.62971548950075 0.3895 0.661387927071535 1.1275 1.32277585414307 1.517 5.62179738010805 1.722 4.29902152596498 0.41 5.29110341657228 1.7425 4.96040945303652 1.763 0.992081890607303 1.5375 3.96832756242921 0.4305 4.62971548950075 1.7835 3.63763359889344 0.451 4.29902152596498 1.804 3.30693963535768 0.4715 0.330693963535768 1.148 2.97624567182191 0.492 3.96832756242921 1.8245 5.95249134364382 0.82 2.64555170828614 0.5125 0.661387927071535 1.558 2.31485774475037 0.533 3.63763359889344 1.845 5.62179738010805 0.840499999999999 0.330693963535768 1.5785 3.30693963535768 1.8655 1.98416378121461 0.5535 5.29110341657228 0.860999999999999 5.95249134364382 1.2505 4.96040945303652 0.881499999999999 1.65346981767884 0.574 5.62179738010805 1.271 2.97624567182191 1.886 1.32277585414307 0.5945 2.64555170828614 1.9065 4.62971548950075 0.901999999999999 5.29110341657228 1.2915 0.992081890607303 0.615 4.29902152596498 0.922499999999999 4.96040945303652 1.312 3.96832756242921 0.942999999999999 0.661387927071535 0.6355 4.62971548950075 1.3325 2.31485774475037 1.927 1.98416378121461 1.9475 4.29902152596498 1.353 3.63763359889344 0.963499999999999 3.96832756242921 1.3735 0.330693963535768 0.656 1.65346981767884 1.968 3.30693963535768 0.983999999999999 5.95249134364382 0.328 3.63763359889344 1.394 1.32277585414307 1.9885 2.97624567182191 1.0045 3.30693963535768 1.4145 5.62179738010805 0.3485 0.992081890607303 2.009 2.97624567182191 1.435 2.31485774475037 1.0455 5.29110341657228 0.369 0.661387927071535 2.0295 2.64555170828614 1.4555 5.95249134364382 1.722 4.96040945303652 0.3895 5.62179738010805 1.7425 1.98416378121461 1.066 4.62971548950075 0.41 5.29110341657228 1.763 2.31485774475037 1.476 1.65346981767884 1.0865 4.96040945303652 1.7835 4.29902152596498 0.4305 4.62971548950075 1.804 1.32277585414307 1.107 3.96832756242921 0.451 1.98416378121461 1.4965 4.29902152596498 1.8245 3.63763359889344 0.4715 1.65346981767884 1.517 0.992081890607303 1.1275 0.661387927071535 1.148 3.30693963535768 0.492 3.96832756242921 1.845 2.97624567182191 0.5125 1.32277585414307 1.5375 3.63763359889344 1.8655 2.64555170828614 0.533 0.992081890607303 1.558 3.30693963535768 1.886 2.31485774475037 0.5535 2.97624567182191 1.9065 1.98416378121461 0.574 0.661387927071535 1.5785 0.330693963535768 1.1685 1.65346981767884 0.5945 2.64555170828614 1.927 1.32277585414307 0.615 0.992081890607303 0.6355 2.31485774475037 1.9475 0.661387927071535 0.656 1.98416378121461 1.968 5.95249134364382 0.840499999999999 5.62179738010805 0.860999999999999 0.330693963535768 1.599 1.65346981767884 1.9885 5.95249134364382 1.271 5.29110341657228 0.881499999999999 0.330693963535768 0.6765 5.95249134364382 0.3485 1.32277585414307 2.009 5.62179738010805 1.2915 0.992081890607303 2.0295 4.96040945303652 0.901999999999999 5.29110341657228 1.312 5.95249134364382 1.7425 5.62179738010805 0.369 4.62971548950075 0.922499999999999 5.62179738010805 1.763 4.96040945303652 1.3325 5.29110341657228 0.3895 4.29902152596498 0.942999999999999 4.62971548950075 1.353 5.29110341657228 1.7835 3.96832756242921 0.963499999999999 4.29902152596498 1.3735 4.96040945303652 1.804 4.96040945303652 0.41 3.63763359889344 0.983999999999999 4.62971548950075 1.8245 3.96832756242921 1.394 4.62971548950075 0.4305 3.63763359889344 1.4145 3.30693963535768 1.0045 4.29902152596498 0.451 3.30693963535768 1.435 4.29902152596498 1.845 2.97624567182191 1.025 2.97624567182191 1.4555 3.96832756242921 0.4715 3.96832756242921 1.8655 3.63763359889344 0.492 2.64555170828614 1.476 2.64555170828614 1.0455 3.30693963535768 0.5125 3.63763359889344 1.886 2.31485774475037 1.4965 2.97624567182191 0.533 3.30693963535768 1.9065 2.31485774475037 1.066 2.64555170828614 0.5535 1.98416378121461 1.517 1.98416378121461 1.0865 1.65346981767884 1.107 2.97624567182191 1.927 2.31485774475037 0.574 2.64555170828614 1.9475 1.32277585414307 1.1275 1.65346981767884 1.5375 1.98416378121461 0.5945 2.31485774475037 1.968 0.992081890607303 1.148 1.65346981767884 0.615 1.32277585414307 0.6355 1.32277585414307 1.558 1.98416378121461 1.9885 0.992081890607303 0.656 1.65346981767884 2.009 1.32277585414307 2.0295 0.661387927071535 1.1685 0.992081890607303 1.5785 5.95249134364382 1.763 0.661387927071535 0.6765 5.62179738010805 1.7835 5.29110341657228 1.804 0.330693963535768 0.697 5.95249134364382 0.369 4.96040945303652 1.8245 4.62971548950075 1.845 5.62179738010805 0.3895 0.661387927071535 1.599 4.29902152596498 1.8655 5.29110341657228 0.41 0.330693963535768 1.189 3.96832756242921 1.886 5.95249134364382 0.860999999999999 0.330693963535768 1.6195 4.96040945303652 0.4305 5.95249134364382 1.2915 5.62179738010805 1.312 5.62179738010805 0.881499999999999 4.62971548950075 0.451 3.63763359889344 1.9065 5.29110341657228 0.901999999999999 4.29902152596498 0.4715 5.29110341657228 1.3325 3.30693963535768 1.927 4.96040945303652 0.922499999999999 4.96040945303652 1.353 4.62971548950075 1.3735 3.96832756242921 0.492 2.97624567182191 1.9475 4.62971548950075 0.942999999999999 4.29902152596498 1.394 4.29902152596498 0.963499999999999 3.63763359889344 0.5125 2.64555170828614 1.968 3.96832756242921 1.4145 3.30693963535768 0.533 3.96832756242921 0.983999999999999 2.31485774475037 1.9885 3.63763359889344 1.435 3.63763359889344 1.0045 2.97624567182191 0.5535 2.64555170828614 0.574 3.30693963535768 1.4555 1.98416378121461 2.009 3.30693963535768 1.025 2.31485774475037 0.5945 1.65346981767884 2.0295 2.97624567182191 1.0455 5.95249134364382 1.7835 2.97624567182191 1.476 1.98416378121461 0.615 2.64555170828614 1.4965 2.64555170828614 1.066 5.62179738010805 1.804 1.65346981767884 0.6355 5.29110341657228 1.8245 2.31485774475037 1.0865 2.31485774475037 1.517 1.32277585414307 0.656 4.96040945303652 1.845 1.98416378121461 1.107 4.62971548950075 1.8655 1.98416378121461 1.5375 1.65346981767884 1.1275 0.992081890607303 0.6765 1.32277585414307 1.148 0.661387927071535 0.697 4.29902152596498 1.886 1.65346981767884 1.558 3.96832756242921 1.9065 0.330693963535768 0.7175 0.992081890607303 1.1685 0.661387927071535 1.189 3.63763359889344 1.927 1.32277585414307 1.5785 5.95249134364382 0.3895 3.30693963535768 1.9475 5.62179738010805 0.41 0.992081890607303 1.599 2.97624567182191 1.968 5.29110341657228 0.4305 0.330693963535768 0.0205 2.64555170828614 1.9885 0.661387927071535 1.6195 4.96040945303652 0.451 0.330693963535768 1.2095 0.661387927071535 0.0205 4.62971548950075 0.4715 2.31485774475037 2.009 1.98416378121461 2.0295 4.29902152596498 0.492 0.330693963535768 1.64 5.95249134364382 1.804 3.96832756242921 0.5125 5.62179738010805 1.8245 0.330693963535768 0.041 5.95249134364382 0.881499999999999 5.29110341657228 1.845 3.63763359889344 0.533 0.992081890607303 0.0205 5.62179738010805 0.901999999999999 5.95249134364382 1.312 3.30693963535768 0.5535 4.96040945303652 1.8655 0.661387927071535 0.041 5.29110341657228 0.922499999999999 5.62179738010805 1.3325 2.97624567182191 0.574 0.330693963535768 0.0615 4.62971548950075 1.886 5.29110341657228 1.353 4.96040945303652 0.942999999999999 4.96040945303652 1.3735 2.64555170828614 0.5945 4.29902152596498 1.9065 4.62971548950075 0.963499999999999 4.62971548950075 1.394 1.32277585414307 0.0205 2.31485774475037 0.615 4.29902152596498 0.983999999999999 3.96832756242921 1.927 4.29902152596498 1.4145 1.98416378121461 0.6355 3.96832756242921 1.0045 3.96832756242921 1.435 1.65346981767884 0.656 0.992081890607303 0.041 0.661387927071535 0.0615 3.63763359889344 1.025 3.63763359889344 1.4555 3.63763359889344 1.9475 1.32277585414307 0.6765 3.30693963535768 1.968 3.30693963535768 1.0455 3.30693963535768 1.476 2.97624567182191 1.9885 2.97624567182191 1.066 0.992081890607303 0.697 2.97624567182191 1.4965 0.330693963535768 0.082 2.64555170828614 1.0865 2.64555170828614 2.009 1.65346981767884 0.0205 0.661387927071535 0.7175 2.64555170828614 1.517 2.31485774475037 1.107 2.31485774475037 2.0295 1.32277585414307 0.041 5.95249134364382 1.8245 1.98416378121461 1.1275 0.330693963535768 0.738 0.992081890607303 0.0615 5.62179738010805 1.845 1.65346981767884 1.148 5.95249134364382 0.41 2.31485774475037 1.5375 5.29110341657228 1.8655 0.661387927071535 0.082 1.32277585414307 1.1685 4.96040945303652 1.886 5.62179738010805 0.4305 1.98416378121461 1.558 5.29110341657228 0.451 4.62971548950075 1.9065 0.330693963535768 0.1025 0.992081890607303 1.189 4.96040945303652 0.4715 1.98416378121461 0.0205 4.29902152596498 1.927 1.65346981767884 1.5785 4.62971548950075 0.492 1.65346981767884 0.041 3.96832756242921 1.9475 4.29902152596498 0.5125 1.32277585414307 1.599 3.63763359889344 1.968 1.32277585414307 0.0615 3.96832756242921 0.533 0.992081890607303 1.6195 0.992081890607303 0.082 3.30693963535768 1.9885 0.661387927071535 1.2095 3.63763359889344 0.5535 0.661387927071535 0.1025 0.661387927071535 1.64 2.97624567182191 2.009 0.330693963535768 1.23 3.30693963535768 0.574 2.64555170828614 2.0295 2.97624567182191 0.5945 5.95249134364382 1.845 0.330693963535768 0.123 2.64555170828614 0.615 5.62179738010805 1.8655 2.31485774475037 0.6355 5.29110341657228 1.886 2.31485774475037 0.0205 5.95249134364382 0.901999999999999 4.96040945303652 1.9065 1.98416378121461 0.656 1.98416378121461 0.041 5.62179738010805 0.922499999999999 0.330693963535768 1.6605 5.95249134364382 1.3325 1.65346981767884 0.6765 1.65346981767884 0.0615 5.29110341657228 0.942999999999999 4.62971548950075 1.927 5.62179738010805 1.353 1.32277585414307 0.082 1.32277585414307 0.697 4.29902152596498 1.9475 5.29110341657228 1.3735 4.96040945303652 0.963499999999999 4.62971548950075 0.983999999999999 4.96040945303652 1.394 0.992081890607303 0.1025 0.992081890607303 0.7175 3.96832756242921 1.968 4.29902152596498 1.0045 4.62971548950075 1.4145 0.661387927071535 0.123 0.661387927071535 0.738 3.63763359889344 1.9885 3.96832756242921 1.025 4.29902152596498 1.435 3.96832756242921 1.4555 3.63763359889344 1.0455 0.330693963535768 0.7585 3.30693963535768 2.009 2.97624567182191 2.0295 5.95249134364382 0.4305 3.63763359889344 1.476 3.30693963535768 1.066 0.330693963535768 0.1435 3.30693963535768 1.4965 5.95249134364382 1.8655 2.64555170828614 0.0205 2.97624567182191 1.0865 5.62179738010805 1.886 2.97624567182191 1.517 5.62179738010805 0.451 2.64555170828614 1.107 2.31485774475037 0.041 5.29110341657228 0.4715 5.29110341657228 1.9065 1.98416378121461 0.0615 2.64555170828614 1.5375 2.31485774475037 1.1275 4.96040945303652 0.492 1.98416378121461 1.148 4.96040945303652 1.927 1.65346981767884 0.082 4.62971548950075 0.5125 4.62971548950075 1.9475 1.32277585414307 0.1025 1.65346981767884 1.1685 4.29902152596498 1.968 1.32277585414307 1.189 4.29902152596498 0.533 0.992081890607303 0.123 2.31485774475037 1.558 3.96832756242921 1.9885 0.992081890607303 1.2095 3.96832756242921 0.5535 3.63763359889344 2.009 0.661387927071535 0.1435 3.63763359889344 0.574 1.98416378121461 1.5785 1.65346981767884 1.599 3.30693963535768 2.0295 3.30693963535768 0.5945 5.95249134364382 1.886 2.97624567182191 0.615 0.661387927071535 1.23 0.330693963535768 0.164 5.62179738010805 1.9065 1.32277585414307 1.6195 2.97624567182191 0.0205 5.29110341657228 1.927 2.64555170828614 0.6355 2.31485774475037 0.656 2.64555170828614 0.041 4.96040945303652 1.9475 0.992081890607303 1.64 2.31485774475037 0.0615 0.330693963535768 1.2505 1.98416378121461 0.6765 4.62971548950075 1.968 1.98416378121461 0.082 0.661387927071535 1.6605 1.65346981767884 0.697 4.29902152596498 1.9885 1.65346981767884 0.1025 1.32277585414307 0.7175 3.96832756242921 2.009 1.32277585414307 0.123 0.992081890607303 0.738 3.63763359889344 2.0295 5.95249134364382 0.922499999999999 0.992081890607303 0.1435 5.95249134364382 1.9065 0.661387927071535 0.7585 5.62179738010805 0.942999999999999 0.661387927071535 0.164 5.62179738010805 1.927 0.330693963535768 1.681 5.95249134364382 1.353 5.29110341657228 0.963499999999999 5.29110341657228 1.9475 0.330693963535768 0.779 4.96040945303652 0.983999999999999 5.62179738010805 1.3735 4.96040945303652 1.968 5.29110341657228 1.394 5.95249134364382 0.451 0.330693963535768 0.1845 4.62971548950075 1.0045 3.30693963535768 0.0205 4.96040945303652 1.4145 4.62971548950075 1.9885 4.29902152596498 1.025 5.62179738010805 0.4715 4.62971548950075 1.435 4.29902152596498 2.009 2.97624567182191 0.041 3.96832756242921 1.0455 5.29110341657228 0.492 4.29902152596498 1.4555 3.96832756242921 2.0295 2.64555170828614 0.0615 3.63763359889344 1.066 3.96832756242921 1.476 4.96040945303652 0.5125 5.95249134364382 1.927 2.31485774475037 0.082 3.30693963535768 1.0865 3.63763359889344 1.4965 4.62971548950075 0.533 5.62179738010805 1.9475 2.97624567182191 1.107 4.29902152596498 0.5535 5.29110341657228 1.968 3.30693963535768 1.517 1.98416378121461 0.1025 2.64555170828614 1.1275 1.65346981767884 0.123 3.96832756242921 0.574 2.97624567182191 1.5375 4.96040945303652 1.9885 1.32277585414307 0.1435 2.31485774475037 1.148 3.63763359889344 0.5945 1.98416378121461 1.1685 4.62971548950075 2.009 4.29902152596498 2.0295 1.65346981767884 1.189 0.992081890607303 0.164 3.30693963535768 0.615 2.64555170828614 1.558 5.95249134364382 1.9475 2.97624567182191 0.6355 1.32277585414307 1.2095 0.661387927071535 0.1845 2.64555170828614 0.656 5.62179738010805 1.968 2.31485774475037 1.5785 2.31485774475037 0.6765 0.992081890607303 1.23 5.29110341657228 1.9885 4.96040945303652 2.009 0.330693963535768 0.205 1.98416378121461 0.697 1.98416378121461 1.599 3.63763359889344 0.0205 0.661387927071535 1.2505 4.62971548950075 2.0295 1.65346981767884 0.7175 3.30693963535768 0.041 5.95249134364382 1.968 1.65346981767884 1.6195 5.62179738010805 1.9885 1.32277585414307 0.738 2.97624567182191 0.0615 1.32277585414307 1.64 0.992081890607303 0.7585 2.64555170828614 0.082 5.29110341657228 2.009 0.992081890607303 1.6605 4.96040945303652 2.0295 0.661387927071535 0.779 2.31485774475037 0.1025 5.95249134364382 1.9885 0.661387927071535 1.681 1.98416378121461 0.123 5.62179738010805 2.009 0.330693963535768 0.7995 1.65346981767884 0.1435 5.29110341657228 2.0295 5.95249134364382 0.4715 5.95249134364382 2.009 1.32277585414307 0.164 0.330693963535768 1.271 5.62179738010805 0.492 5.62179738010805 2.0295 5.95249134364382 0.942999999999999 0.330693963535768 1.7015 0.992081890607303 0.1845 5.95249134364382 2.0295 5.62179738010805 0.963499999999999 5.29110341657228 0.5125 0.661387927071535 0.205 5.95249134364382 1.3735 5.29110341657228 0.983999999999999 4.96040945303652 0.533 5.62179738010805 1.394 4.96040945303652 1.0045 4.62971548950075 0.5535 5.29110341657228 1.4145 4.62971548950075 1.025 0.330693963535768 0.2255 3.96832756242921 0.0205 4.29902152596498 0.574 4.96040945303652 1.435 4.29902152596498 1.0455 4.62971548950075 1.4555 3.96832756242921 0.5945 3.63763359889344 0.041 3.96832756242921 1.066 4.29902152596498 1.476 3.30693963535768 0.0615 3.96832756242921 1.4965 3.63763359889344 1.0865 3.63763359889344 0.615 3.30693963535768 0.6355 3.63763359889344 1.517 2.97624567182191 0.082 3.30693963535768 1.107 2.64555170828614 0.1025 2.97624567182191 0.656 3.30693963535768 1.5375 2.97624567182191 1.1275 2.64555170828614 0.6765 2.31485774475037 0.123 2.64555170828614 1.148 1.98416378121461 0.1435 2.97624567182191 1.558 2.31485774475037 1.1685 2.31485774475037 0.697 1.98416378121461 1.189 2.64555170828614 1.5785 1.65346981767884 0.164 1.98416378121461 0.7175 1.65346981767884 1.2095 1.32277585414307 0.1845 1.65346981767884 0.738 2.31485774475037 1.599 0.992081890607303 0.205 1.32277585414307 1.23 1.32277585414307 0.7585 0.992081890607303 1.2505 0.661387927071535 0.2255 0.992081890607303 0.779 1.98416378121461 1.6195 0.661387927071535 0.7995 1.65346981767884 1.64 0.661387927071535 1.271 0.330693963535768 0.246 4.29902152596498 0.0205 0.330693963535768 0.82 5.95249134364382 0.492 3.96832756242921 0.041 1.32277585414307 1.6605 5.62179738010805 0.5125 3.63763359889344 0.0615 3.30693963535768 0.082 0.330693963535768 1.2915 5.29110341657228 0.533 0.992081890607303 1.681 4.96040945303652 0.5535 2.97624567182191 0.1025 4.62971548950075 0.574 2.64555170828614 0.123 2.31485774475037 0.1435 0.661387927071535 1.7015 4.29902152596498 0.5945 1.98416378121461 0.164 3.96832756242921 0.615 5.95249134364382 0.963499999999999 1.65346981767884 0.1845 5.62179738010805 0.983999999999999 0.330693963535768 1.722 3.63763359889344 0.6355 5.95249134364382 1.394 5.29110341657228 1.0045 5.62179738010805 1.4145 1.32277585414307 0.205 3.30693963535768 0.656 4.96040945303652 1.025 5.29110341657228 1.435 2.97624567182191 0.6765 0.992081890607303 0.2255 4.62971548950075 1.0455 4.96040945303652 1.4555 2.64555170828614 0.697 0.661387927071535 0.246 4.29902152596498 1.066 4.62971548950075 1.476 0.330693963535768 0.2665 3.96832756242921 1.0865 2.31485774475037 0.7175 4.29902152596498 1.4965 3.96832756242921 1.517 3.63763359889344 1.107 1.98416378121461 0.738 4.62971548950075 0.0205 3.30693963535768 1.1275 3.63763359889344 1.5375 1.65346981767884 0.7585 3.30693963535768 1.558 4.29902152596498 0.041 2.97624567182191 1.148 1.32277585414307 0.779 3.96832756242921 0.0615 2.64555170828614 1.1685 2.97624567182191 1.5785 3.63763359889344 0.082 0.992081890607303 0.7995 2.31485774475037 1.189 3.30693963535768 0.1025 2.64555170828614 1.599 0.661387927071535 0.82 1.98416378121461 1.2095 2.97624567182191 0.123 1.65346981767884 1.23 2.64555170828614 0.1435 2.31485774475037 1.6195 0.330693963535768 0.840499999999999 5.95249134364382 0.5125 1.32277585414307 1.2505 2.31485774475037 0.164 1.98416378121461 0.1845 1.98416378121461 1.64 5.62179738010805 0.533 0.992081890607303 1.271 5.29110341657228 0.5535 1.65346981767884 0.205 0.661387927071535 1.2915 4.96040945303652 0.574 1.32277585414307 0.2255 1.65346981767884 1.6605 4.62971548950075 0.5945 1.32277585414307 1.681 0.992081890607303 0.246 0.661387927071535 0.2665 4.29902152596498 0.615 3.96832756242921 0.6355 3.63763359889344 0.656 0.992081890607303 1.7015 0.661387927071535 1.722 0.330693963535768 0.287 4.96040945303652 0.0205 3.30693963535768 0.6765 2.97624567182191 0.697 4.62971548950075 0.041 0.330693963535768 1.7425 0.330693963535768 1.312 3.63763359889344 0.1025 2.64555170828614 0.7175 5.95249134364382 0.983999999999999 3.30693963535768 0.123 5.95249134364382 1.4145 2.31485774475037 0.738 5.62179738010805 1.0045 2.97624567182191 0.1435 5.62179738010805 1.435 1.98416378121461 0.7585 5.29110341657228 1.025 2.64555170828614 0.164 5.29110341657228 1.4555 4.96040945303652 1.0455 1.65346981767884 0.779 4.96040945303652 1.476 2.31485774475037 0.1845 4.62971548950075 1.4965 4.62971548950075 1.066 1.32277585414307 0.7995 1.98416378121461 0.205 4.29902152596498 1.517 4.29902152596498 1.0865 0.992081890607303 0.82 1.65346981767884 0.2255 3.96832756242921 1.5375 3.96832756242921 1.107 0.661387927071535 0.840499999999999 1.32277585414307 0.246 3.63763359889344 1.1275 3.63763359889344 1.558 3.30693963535768 1.148 0.992081890607303 0.2665 0.330693963535768 0.860999999999999 2.97624567182191 1.1685 3.30693963535768 1.5785 5.95249134364382 0.533 0.661387927071535 0.287 2.97624567182191 1.599 2.64555170828614 1.189 5.62179738010805 0.5535 2.64555170828614 1.6195 2.31485774475037 1.2095 5.29110341657228 0.574 1.98416378121461 1.23 0.330693963535768 0.3075 5.29110341657228 0.0205 4.96040945303652 0.5945 1.65346981767884 1.2505 2.31485774475037 1.64 4.96040945303652 0.041 4.62971548950075 0.615 1.32277585414307 1.271 3.63763359889344 0.123 4.29902152596498 0.6355 1.98416378121461 1.6605 3.30693963535768 0.1435 3.96832756242921 0.656 2.97624567182191 0.164 3.63763359889344 0.6765 1.65346981767884 1.681 0.992081890607303 1.2915 0.661387927071535 1.312 2.64555170828614 0.1845 3.30693963535768 0.697 1.32277585414307 1.7015 2.31485774475037 0.205 2.97624567182191 0.7175 1.98416378121461 0.2255 2.64555170828614 0.738 1.65346981767884 0.246 0.992081890607303 1.722 2.31485774475037 0.7585 0.330693963535768 1.3325 0.661387927071535 1.7425 1.98416378121461 0.779 1.32277585414307 0.2665 1.65346981767884 0.7995 0.330693963535768 1.763 0.992081890607303 0.287 1.32277585414307 0.82 0.661387927071535 0.3075 0.992081890607303 0.840499999999999 5.95249134364382 1.0045 5.95249134364382 1.435 5.62179738010805 1.4555 0.661387927071535 0.860999999999999 5.62179738010805 1.025 5.29110341657228 1.476 0.330693963535768 0.328 5.29110341657228 1.0455 5.62179738010805 0.0205 4.96040945303652 1.4965 0.330693963535768 0.881499999999999 5.29110341657228 0.041 4.96040945303652 1.066 4.62971548950075 1.517 5.95249134364382 0.5535 4.62971548950075 1.0865 3.63763359889344 0.1435 4.29902152596498 1.5375 4.29902152596498 1.107 5.62179738010805 0.574 3.30693963535768 0.164 3.96832756242921 1.558 5.29110341657228 0.5945 3.96832756242921 1.1275 3.63763359889344 1.5785 3.63763359889344 1.148 4.96040945303652 0.615 2.97624567182191 0.1845 3.30693963535768 1.599 3.30693963535768 1.1685 2.64555170828614 0.205 2.97624567182191 1.189 4.62971548950075 0.6355 2.31485774475037 0.2255 4.29902152596498 0.656 2.64555170828614 1.2095 1.98416378121461 0.246 2.97624567182191 1.6195 3.96832756242921 0.6765 2.31485774475037 1.23 1.65346981767884 0.2665 3.63763359889344 0.697 1.98416378121461 1.2505 1.32277585414307 0.287 2.64555170828614 1.64 2.31485774475037 1.6605 3.30693963535768 0.7175 1.65346981767884 1.271 0.992081890607303 0.3075 1.32277585414307 1.2915 0.661387927071535 0.328 1.98416378121461 1.681 2.97624567182191 0.738 2.64555170828614 0.7585 1.65346981767884 1.7015 2.31485774475037 0.779 0.330693963535768 0.3485 0.992081890607303 1.312 5.95249134364382 0.0205 1.98416378121461 0.7995 5.62179738010805 0.041 1.65346981767884 0.82 1.32277585414307 1.722 3.96832756242921 0.1435 0.661387927071535 1.3325 3.63763359889344 0.164 1.32277585414307 0.840499999999999 0.992081890607303 1.7425 0.661387927071535 1.763 0.992081890607303 0.860999999999999 3.30693963535768 0.1845 0.661387927071535 0.881499999999999 2.97624567182191 0.205 2.64555170828614 0.2255 0.330693963535768 0.901999999999999 0.330693963535768 1.7835 5.95249134364382 0.574 5.95249134364382 1.4555 2.31485774475037 0.246 0.330693963535768 1.353 5.62179738010805 1.476 5.62179738010805 0.5945 5.95249134364382 1.025 1.98416378121461 0.2665 5.29110341657228 1.4965 5.29110341657228 0.615 5.62179738010805 1.0455 4.96040945303652 1.517 1.65346981767884 0.287 4.96040945303652 0.6355 5.29110341657228 1.066 4.62971548950075 1.5375 1.32277585414307 0.3075 4.62971548950075 0.656 4.29902152596498 1.558 0.992081890607303 0.328 4.96040945303652 1.0865 3.96832756242921 1.5785 4.29902152596498 0.6765 4.62971548950075 1.107 3.63763359889344 1.599 0.661387927071535 0.3485 3.96832756242921 0.697 4.29902152596498 1.1275 0.330693963535768 0.369 3.30693963535768 1.6195 3.96832756242921 1.148 3.63763359889344 0.7175 3.63763359889344 1.1685 2.97624567182191 1.64 5.95249134364382 0.041 3.30693963535768 0.738 3.30693963535768 1.189 2.97624567182191 1.2095 5.62179738010805 0.0615 2.97624567182191 0.7585 3.96832756242921 0.164 2.64555170828614 1.6605 2.64555170828614 1.23 2.64555170828614 0.779 2.31485774475037 1.2505 3.63763359889344 0.1845 2.31485774475037 1.681 2.31485774475037 0.7995 1.98416378121461 1.271 3.30693963535768 0.205 1.98416378121461 0.82 1.65346981767884 1.2915 2.97624567182191 0.2255 1.98416378121461 1.7015 1.65346981767884 0.840499999999999 1.32277585414307 1.312 1.65346981767884 1.722 2.64555170828614 0.246 1.32277585414307 0.860999999999999 2.31485774475037 0.2665 0.992081890607303 1.3325 0.992081890607303 0.881499999999999 1.32277585414307 1.7425 1.98416378121461 0.287 0.661387927071535 0.901999999999999 1.65346981767884 0.3075 0.992081890607303 1.763 0.661387927071535 1.353 1.32277585414307 0.328 0.330693963535768 0.922499999999999 5.95249134364382 0.5945 0.661387927071535 1.7835 0.992081890607303 0.3485 5.62179738010805 0.615 0.661387927071535 0.369 5.29110341657228 0.6355 4.96040945303652 0.656 0.330693963535768 0.3895 0.330693963535768 1.804 5.95249134364382 1.476 5.95249134364382 0.0615 4.62971548950075 0.6765 5.62179738010805 1.4965 4.29902152596498 0.164 5.29110341657228 1.517 4.29902152596498 0.697 0.330693963535768 1.3735 5.95249134364382 1.0455 4.96040945303652 1.5375 3.96832756242921 0.7175 5.62179738010805 1.066 4.62971548950075 1.558 3.96832756242921 0.1845 3.63763359889344 0.205 4.29902152596498 1.5785 3.63763359889344 0.738 5.29110341657228 1.0865 3.30693963535768 0.2255 3.30693963535768 0.7585 3.96832756242921 1.599 4.96040945303652 1.107 3.63763359889344 1.6195 4.62971548950075 1.1275 2.97624567182191 0.779 2.97624567182191 0.246 4.29902152596498 1.148 2.64555170828614 0.7995 2.64555170828614 0.2665 3.96832756242921 1.1685 3.30693963535768 1.64 2.31485774475037 0.287 2.31485774475037 0.82 2.97624567182191 1.6605 3.63763359889344 1.189 1.98416378121461 0.840499999999999 3.30693963535768 1.2095 1.98416378121461 0.3075 2.97624567182191 1.23 1.65346981767884 0.328 1.65346981767884 0.860999999999999 1.32277585414307 0.881499999999999 2.64555170828614 1.681 2.64555170828614 1.2505 1.32277585414307 0.3485 2.31485774475037 1.7015 0.992081890607303 0.901999999999999 2.31485774475037 1.271 0.992081890607303 0.369 1.98416378121461 1.2915 0.661387927071535 0.922499999999999 1.98416378121461 1.722 0.661387927071535 0.3895 1.65346981767884 1.312 0.330693963535768 0.942999999999999 1.32277585414307 1.3325 5.95249134364382 0.615 0.330693963535768 0.41 1.65346981767884 1.7425 5.95249134364382 0.082 0.992081890607303 1.353 5.62179738010805 0.6355 1.32277585414307 1.763 4.62971548950075 0.164 5.29110341657228 0.656 0.992081890607303 1.7835 4.96040945303652 0.6765 4.29902152596498 0.1845 0.661387927071535 1.804 4.62971548950075 0.697 3.96832756242921 0.205 0.330693963535768 1.8245 4.29902152596498 0.7175 3.63763359889344 0.2255 3.96832756242921 0.738 5.95249134364382 1.4965 0.661387927071535 1.3735 3.30693963535768 0.246 3.63763359889344 0.7585 5.62179738010805 1.517 2.97624567182191 0.2665 3.30693963535768 0.779 5.29110341657228 1.5375 4.96040945303652 1.558 2.64555170828614 0.287 4.62971548950075 1.5785 2.97624567182191 0.7995 2.31485774475037 0.3075 0.330693963535768 1.394 4.29902152596498 1.599 5.95249134364382 1.066 2.64555170828614 0.82 1.98416378121461 0.328 3.96832756242921 1.6195 5.62179738010805 1.0865 2.31485774475037 0.840499999999999 5.29110341657228 1.107 3.63763359889344 1.64 1.65346981767884 0.3485 1.98416378121461 0.860999999999999 1.32277585414307 0.369 1.65346981767884 0.881499999999999 3.30693963535768 1.6605 4.96040945303652 1.1275 0.992081890607303 0.3895 4.62971548950075 1.148 1.32277585414307 0.901999999999999 4.29902152596498 1.1685 0.661387927071535 0.41 2.97624567182191 1.681 0.992081890607303 0.922499999999999 3.96832756242921 1.189 3.63763359889344 1.2095 2.64555170828614 1.7015 0.330693963535768 0.4305 5.95249134364382 0.1025 0.661387927071535 0.942999999999999 3.30693963535768 1.23 0.330693963535768 0.963499999999999 2.31485774475037 1.722 2.97624567182191 1.2505 5.95249134364382 0.6355 5.62179738010805 0.123 2.64555170828614 1.271 5.29110341657228 0.1435 2.31485774475037 1.2915 1.98416378121461 1.7425 5.62179738010805 0.656 4.96040945303652 0.164 1.98416378121461 1.312 5.29110341657228 0.6765 1.65346981767884 1.763 4.96040945303652 0.697 4.62971548950075 0.1845 1.65346981767884 1.3325 4.29902152596498 0.205 4.62971548950075 0.7175 1.32277585414307 1.353 1.32277585414307 1.7835 3.96832756242921 0.2255 0.992081890607303 1.804 4.29902152596498 0.738 0.992081890607303 1.3735 3.96832756242921 0.7585 3.63763359889344 0.246 3.30693963535768 0.2665 3.63763359889344 0.779 0.661387927071535 1.8245 2.97624567182191 0.287 0.661387927071535 1.394 3.30693963535768 0.7995 2.64555170828614 0.3075 2.97624567182191 0.82 0.330693963535768 1.845 5.95249134364382 1.517 2.31485774475037 0.328 5.62179738010805 1.5375 2.64555170828614 0.840499999999999 1.98416378121461 0.3485 2.31485774475037 0.860999999999999 5.29110341657228 1.558 1.65346981767884 0.369 1.98416378121461 0.881499999999999 4.96040945303652 1.5785 1.32277585414307 0.3895 4.62971548950075 1.599 1.65346981767884 0.901999999999999 4.29902152596498 1.6195 0.992081890607303 0.41 1.32277585414307 0.922499999999999 0.330693963535768 1.4145 5.95249134364382 1.0865 3.96832756242921 1.64 0.661387927071535 0.4305 3.63763359889344 1.6605 5.62179738010805 1.107 0.992081890607303 0.942999999999999 0.661387927071535 0.963499999999999 5.29110341657228 1.1275 0.330693963535768 0.451 4.96040945303652 1.148 0.330693963535768 0.983999999999999 5.95249134364382 0.123 3.30693963535768 1.681 4.62971548950075 1.1685 2.97624567182191 1.7015 5.95249134364382 0.656 5.62179738010805 0.1435 4.29902152596498 1.189 2.64555170828614 1.722 3.96832756242921 1.2095 5.62179738010805 0.6765 5.29110341657228 0.164 3.63763359889344 1.23 5.29110341657228 0.697 4.96040945303652 0.1845 3.30693963535768 1.2505 4.96040945303652 0.7175 2.97624567182191 1.271 4.62971548950075 0.205 2.31485774475037 1.7425 1.98416378121461 1.763 4.62971548950075 0.738 4.29902152596498 0.2255 2.64555170828614 1.2915 4.29902152596498 0.7585 1.65346981767884 1.7835 2.31485774475037 1.312 3.96832756242921 0.246 3.96832756242921 0.779 3.63763359889344 0.2665 1.98416378121461 1.3325 3.63763359889344 0.7995 1.65346981767884 1.353 1.32277585414307 1.804 3.30693963535768 0.287 3.30693963535768 0.82 0.992081890607303 1.8245 2.97624567182191 0.3075 2.97624567182191 0.840499999999999 2.64555170828614 0.328 0.661387927071535 1.845 2.64555170828614 0.860999999999999 2.31485774475037 0.3485 1.32277585414307 1.3735 0.992081890607303 1.394 0.330693963535768 1.8655 2.31485774475037 0.881499999999999 1.98416378121461 0.369 1.98416378121461 0.901999999999999 5.95249134364382 1.5375 1.65346981767884 0.3895 1.65346981767884 0.922499999999999 5.62179738010805 1.558 1.32277585414307 0.41 0.661387927071535 1.4145 5.29110341657228 1.5785 1.32277585414307 0.942999999999999 0.992081890607303 0.4305 4.96040945303652 1.599 4.62971548950075 1.6195 0.661387927071535 0.451 0.992081890607303 0.963499999999999 4.29902152596498 1.64 0.661387927071535 0.983999999999999 3.96832756242921 1.6605 0.330693963535768 0.4715 0.330693963535768 1.0045 3.63763359889344 1.681 5.95249134364382 0.1435 5.95249134364382 0.6765 0.330693963535768 1.435 5.62179738010805 0.164 3.30693963535768 1.7015 5.95249134364382 1.107 5.62179738010805 0.697 5.62179738010805 1.1275 5.29110341657228 0.1845 5.29110341657228 0.7175 5.29110341657228 1.148 2.97624567182191 1.722 4.96040945303652 0.205 4.96040945303652 0.738 2.64555170828614 1.7425 4.96040945303652 1.1685 4.62971548950075 1.189 4.62971548950075 0.2255 4.62971548950075 0.7585 4.29902152596498 0.246 2.31485774475037 1.763 4.29902152596498 0.779 4.29902152596498 1.2095 3.96832756242921 0.2665 3.96832756242921 1.23 3.96832756242921 0.7995 1.98416378121461 1.7835 3.63763359889344 1.2505 3.63763359889344 0.287 3.63763359889344 0.82 3.30693963535768 1.271 3.30693963535768 0.3075 2.97624567182191 1.2915 3.30693963535768 0.840499999999999 2.97624567182191 0.860999999999999 2.64555170828614 1.312 2.97624567182191 0.328 1.65346981767884 1.804 2.64555170828614 0.3485 1.32277585414307 1.8245 2.64555170828614 0.881499999999999 2.31485774475037 1.3325 2.31485774475037 0.369 2.31485774475037 0.901999999999999 1.98416378121461 1.353 0.992081890607303 1.845 1.98416378121461 0.3895 1.98416378121461 0.922499999999999 1.65346981767884 1.3735 1.65346981767884 0.41 0.661387927071535 1.8655 1.65346981767884 0.942999999999999 1.32277585414307 0.4305 0.992081890607303 0.451 0.330693963535768 1.886 1.32277585414307 0.963499999999999 5.95249134364382 1.558 1.32277585414307 1.394 5.62179738010805 1.5785 0.661387927071535 0.4715 0.992081890607303 1.4145 0.992081890607303 0.983999999999999 5.29110341657228 1.599 0.661387927071535 1.0045 4.96040945303652 1.6195 0.330693963535768 1.025 0.330693963535768 0.492 0.661387927071535 1.435 4.62971548950075 1.64 5.95249134364382 0.164 4.29902152596498 1.6605 5.95249134364382 0.697 5.62179738010805 0.1845 3.96832756242921 1.681 5.62179738010805 0.7175 3.63763359889344 1.7015 5.29110341657228 0.205 0.330693963535768 1.4555 5.29110341657228 0.738 4.96040945303652 0.2255 3.30693963535768 1.722 4.96040945303652 0.7585 4.62971548950075 0.246 4.62971548950075 0.779 5.95249134364382 1.1275 4.29902152596498 0.2665 2.97624567182191 1.7425 3.96832756242921 0.287 3.63763359889344 0.3075 3.30693963535768 0.328 2.97624567182191 0.3485 5.95249134364382 1.5785 5.95249134364382 0.1845 5.95249134364382 0.7175 166 167 168 169 170 171 169 172 170 166 173 167 174 175 176 177 178 172 179 180 173 177 181 178 174 176 182 179 183 180 184 185 175 186 187 188 189 190 183 186 188 181 189 191 190 184 192 185 193 194 195 196 197 198 193 195 187 199 200 191 199 201 200 202 203 204 196 198 192 205 206 194 205 207 206 208 209 197 202 204 201 210 211 212 213 130 214 215 216 217 218 219 220 215 217 207 218 221 93 208 222 209 218 220 221 210 212 203 223 224 219 225 226 216 225 227 226 223 228 224 229 230 222 231 232 233 231 233 211 229 234 230 235 236 234 237 238 239 237 239 228 240 241 227 240 242 241 243 244 238 245 246 232 235 247 236 243 248 244 245 249 246 250 251 247 250 252 251 253 254 248 253 255 254 256 94 242 257 258 249 259 260 261 257 262 258 259 261 252 263 264 255 263 265 264 266 267 265 268 269 270 271 272 92 266 273 267 271 274 272 271 275 274 276 277 278 268 270 262 279 280 281 282 283 284 282 284 269 279 281 273 285 130 260 286 287 93 288 289 280 276 278 275 286 290 291 292 293 277 288 294 289 286 291 287 295 296 297 298 299 294 295 297 290 298 300 299 292 301 293 302 303 304 305 306 301 302 304 283 307 308 296 309 310 303 307 311 308 312 313 311 314 315 316 305 317 306 312 318 313 314 316 300 319 320 317 321 322 323 309 324 310 319 325 320 321 323 318 326 327 328 329 330 331 329 331 315 332 333 322 334 335 330 334 336 335 326 328 325 332 337 333 338 339 340 338 340 327 341 342 339 341 343 342 344 345 337 344 346 345 347 348 349 347 349 336 350 351 352 350 352 346 353 169 171 353 171 343 354 130 324 355 172 169 356 182 351 355 177 172 357 358 359 360 361 348 360 362 361 357 359 92 356 174 182 357 363 358 364 184 175 365 181 177 364 175 174 366 367 363 365 186 181 366 368 367 369 193 187 370 371 372 369 187 186 373 374 368 375 196 192 373 376 374 377 194 193 377 205 194 370 372 362 375 192 184 378 213 214 379 168 376 379 166 168 380 215 207 381 179 173 382 208 197 380 207 205 383 216 215 381 173 166 384 183 179 384 189 183 383 225 216 382 197 196 385 227 225 385 240 227 386 191 189 386 199 191 387 222 208 378 214 371 387 229 222 388 235 234 389 201 199 390 130 213 391 242 240 391 256 242 388 234 229 389 202 201 392 250 247 393 210 203 392 247 235 394 94 256 393 203 202 395 211 210 395 231 211 396 259 252 397 218 93 397 223 219 398 275 271 397 219 218 398 271 92 396 252 250 398 276 275 399 237 228 399 228 223 400 232 231 400 245 232 401 260 259 402 277 276 402 292 277 401 285 260 403 238 237 403 243 238 404 301 292 405 248 243 404 305 301 405 253 248 406 130 285 407 257 249 407 249 245 408 290 286 408 286 93 408 295 290 409 317 305 410 255 253 409 319 317 411 307 296 410 263 255 411 296 295 412 262 257 413 266 265 413 265 263 414 312 311 412 268 262 414 311 307 415 325 319 416 273 266 415 326 325 417 282 269 416 279 273 418 318 312 418 321 318 419 280 279 420 327 326 417 269 268 419 288 280 421 332 322 420 338 327 422 283 282 421 322 321 423 294 288 424 344 337 423 298 294 425 341 339 425 339 338 422 302 283 426 343 341 427 303 302 428 300 298 424 337 332 428 314 300 429 346 344 429 350 346 426 353 343 427 309 303 430 329 315 430 315 314 431 355 169 431 169 353 432 354 324 433 351 350 434 177 355 433 356 351 434 365 177 435 330 329 435 334 330 436 364 174 437 186 365 436 174 356 438 347 336 437 369 186 432 324 309 439 377 193 439 193 369 438 336 334 440 348 347 441 205 377 441 380 205 442 184 364 442 375 184 443 215 380 444 382 196 443 383 215 440 360 348 445 370 362 444 196 375 446 225 383 447 130 354 446 385 225 448 387 208 449 357 92 449 366 363 450 240 385 445 362 360 450 391 240 448 208 382 451 394 256 452 229 387 453 378 371 449 363 357 453 371 370 454 368 366 451 256 391 454 373 368 452 388 229 455 392 235 455 235 388 456 376 373 456 379 376 457 390 213 458 250 392 458 396 250 459 94 394 460 166 379 461 398 92 460 381 166 461 402 276 462 401 259 463 179 381 461 276 398 463 384 179 464 404 292 464 292 402 462 259 396 457 213 378 465 285 401 466 386 189 466 189 384 467 305 404 467 409 305 468 199 386 468 389 199 465 406 285 469 319 409 469 415 319 470 393 202 470 202 389 471 130 406 472 295 408 473 130 390 472 408 93 472 411 295 474 307 411 475 420 326 474 414 307 476 397 93 476 399 223 476 223 397 477 418 312 475 326 415 478 395 210 478 210 393 477 312 414 479 338 420 480 231 395 480 400 231 481 237 399 482 321 418 481 403 237 479 425 338 482 421 321 483 405 243 484 341 425 483 243 403 485 332 421 484 426 341 485 424 332 486 253 405 487 431 353 486 410 253 488 429 344 487 353 426 489 245 400 489 407 245 490 413 263 491 7 6 491 8 7 491 9 8 490 263 410 492 355 431 491 10 9 491 11 10 491 12 11 492 434 355 491 13 12 488 344 424 493 266 413 491 257 407 494 433 350 493 416 266 491 412 257 495 437 365 495 365 434 496 279 416 496 419 279 494 350 429 497 268 412 498 423 288 499 439 369 497 417 268 500 356 433 498 288 419 499 369 437 501 282 417 500 436 356 501 422 282 502 298 423 503 441 377 502 428 298 504 314 428 503 377 439 504 430 314 505 364 436 506 427 302 506 302 422 507 443 380 508 329 430 507 380 441 505 442 364 509 383 443 509 446 383 508 435 329 510 334 435 511 309 427 512 375 442 512 444 375 511 432 309 513 385 446 513 450 385 510 438 334 514 382 444 514 448 382 515 391 450 516 347 438 515 451 391 517 452 387 517 387 448 518 394 451 518 459 394 516 440 347 519 445 360 520 455 388 520 388 452 521 447 354 522 458 392 522 392 455 521 354 432 523 94 459 519 360 440 524 464 402 524 461 92 524 402 461 525 396 458 526 467 404 525 462 396 527 465 401 528 453 370 528 370 445 529 457 378 526 404 464 527 401 462 530 469 409 530 409 467 531 130 447 532 406 465 532 471 406 529 378 453 533 475 415 534 449 92 534 454 366 534 366 449 535 130 471 533 415 469 536 474 411 536 472 93 536 411 472 537 420 475 537 479 420 538 414 474 539 456 373 539 373 454 538 477 414 540 390 457 541 425 479 541 484 425 542 482 418 543 379 456 542 418 477 543 460 379 540 473 390 544 381 460 545 485 421 546 426 484 544 463 381 546 487 426 545 421 482 547 488 424 548 384 463 548 466 384 549 431 487 549 492 431 547 424 485 550 429 488 551 468 386 552 495 434 552 434 492 553 130 473 554 399 476 554 481 399 555 437 495 551 386 466 550 494 429 556 500 433 554 476 93 555 499 437 557 470 389 557 389 468 556 433 494 558 393 470 559 403 481 560 439 499 559 483 403 560 503 439 561 405 483 558 478 393 562 436 500 561 486 405 563 410 486 562 505 436 564 441 503 564 507 441 563 490 410 565 395 478 566 413 490 567 442 505 565 480 395 566 493 413 567 512 442 568 509 443 568 443 507 569 416 493 570 489 400 569 496 416 571 446 509 571 513 446 570 400 480 572 444 512 573 419 496 574 14 13 573 498 419 574 15 14 575 515 450 574 16 15 574 17 16 574 18 17 574 19 18 574 491 407 576 502 423 574 13 491 572 514 444 576 423 498 575 450 513 574 407 489 577 451 515 578 3 1 577 518 451 578 4 3 578 5 4 578 6 5 578 497 412 579 428 502 578 412 491 579 504 428 580 448 514 581 459 518 580 517 448 578 41 40 582 452 517 578 42 41 578 1 42 578 491 6 583 501 417 581 523 459 584 430 504 582 520 452 584 508 430 585 522 455 586 510 435 583 417 497 586 435 508 587 94 523 588 506 422 585 455 520 588 422 501 589 458 522 590 516 438 591 526 464 592 427 506 590 438 510 589 525 458 591 524 92 593 462 525 591 464 524 593 527 462 592 511 427 594 440 516 595 530 467 596 432 511 597 532 465 595 467 526 598 533 469 596 521 432 597 465 527 598 469 530 594 519 440 599 445 519 600 471 532 600 535 471 601 537 475 602 131 130 602 132 131 602 133 132 602 130 535 601 475 533 603 536 93 604 479 537 603 538 474 605 447 521 599 528 445 603 474 536 604 541 479 606 529 453 605 531 447 607 477 538 606 453 528 607 542 477 608 484 541 609 545 482 608 546 484 609 482 542 610 485 545 610 547 485 611 540 457 612 549 487 611 457 529 613 488 547 612 487 546 613 550 488 614 552 492 614 492 549 615 556 494 616 555 495 617 130 531 615 494 550 616 495 552 618 499 555 619 562 500 618 560 499 619 500 556 620 534 92 620 539 454 621 503 560 622 553 473 622 473 540 621 564 503 620 454 534 623 507 564 624 505 562 625 456 539 625 543 456 626 130 553 623 568 507 624 567 505 627 512 567 628 509 568 629 460 543 629 544 460 628 571 509 627 572 512 630 481 554 631 548 463 632 513 571 632 575 513 630 554 93 630 559 481 633 483 559 631 463 544 634 514 572 635 515 575 634 580 514 633 561 483 635 577 515 636 582 517 637 466 548 637 551 466 638 486 561 639 581 518 638 563 486 640 557 468 639 518 577 636 517 580 641 490 563 640 468 551 641 566 490 642 558 470 643 523 581 644 493 566 643 587 523 644 569 493 645 520 582 645 585 520 642 470 557 646 522 585 647 573 496 647 496 569 646 589 522 648 478 558 648 565 478 649 498 573 650 94 587 651 593 525 652 480 565 649 576 498 653 526 591 654 579 502 653 591 92 651 525 589 653 595 526 655 527 593 655 597 527 652 570 480 654 502 576 656 20 19 657 504 579 656 21 20 656 19 574 656 22 21 656 23 22 656 24 23 657 584 504 658 530 595 658 598 530 656 489 570 659 532 597 660 508 584 656 574 489 659 600 532 660 586 508 661 583 497 661 497 578 662 533 598 663 134 133 663 135 134 662 601 533 663 133 602 663 535 600 664 510 586 661 38 37 663 602 535 661 39 38 665 603 93 661 40 39 661 578 40 665 538 603 666 537 601 665 607 538 667 609 542 666 604 537 664 590 510 668 501 583 669 541 604 667 542 607 668 588 501 670 610 545 671 516 590 669 608 541 670 545 609 672 592 506 673 613 547 672 506 588 674 546 608 671 594 516 674 612 546 673 547 610 675 550 613 676 596 511 677 549 612 675 615 550 676 511 592 677 614 549 678 599 519 679 556 615 678 519 594 679 619 556 680 552 614 681 528 599 680 616 552 682 605 521 682 521 596 683 617 531 684 555 616 684 618 555 685 562 619 681 606 528 686 560 618 687 529 606 686 621 560 685 624 562 688 567 624 688 627 567 687 611 529 689 564 621 689 623 564 690 622 540 690 540 611 691 634 572 683 531 605 692 568 623 692 628 568 691 572 627 693 636 580 694 632 571 695 553 622 694 571 628 696 130 617 697 575 632 693 580 634 698 582 636 697 635 575 699 577 635 698 645 582 695 626 553 699 639 577 700 643 581 701 585 645 700 581 639 702 587 643 701 646 585 703 589 646 703 651 589 704 620 92 704 625 539 702 650 587 704 539 620 705 629 543 706 130 626 707 655 593 705 543 625 707 593 651 708 633 559 708 630 93 709 544 629 710 94 650 709 631 544 708 559 630 711 595 653 712 659 597 713 638 561 712 597 655 713 561 633 714 135 663 715 548 631 714 136 135 715 637 548 714 137 136 711 658 595 711 653 92 714 600 659 716 563 638 714 663 600 717 607 665 717 667 607 718 662 598 719 551 637 718 598 658 716 641 563 717 665 93 719 640 551 720 609 667 721 644 566 720 670 609 721 566 641 722 601 662 723 642 557 724 569 644 725 610 670 724 647 569 725 673 610 722 666 601 723 557 640 726 648 558 727 573 647 728 675 613 727 649 573 729 604 666 726 558 642 729 669 604 728 613 673 730 565 648 731 615 675 732 576 649 733 608 669 732 654 576 733 674 608 731 679 615 734 579 654 730 652 565 734 657 579 735 570 652 736 612 674 735 656 570 737 660 584 736 677 612 738 619 679 737 584 657 739 24 656 738 685 619 740 664 586 739 25 24 741 614 677 740 586 660 739 2 25 739 26 2 739 27 26 739 28 27 741 680 614 742 688 624 739 29 28 739 30 29 742 624 685 743 616 680 744 590 664 744 671 590 745 661 37 743 684 616 745 32 31 746 686 618 745 33 32 745 34 33 746 618 684 745 35 34 745 36 35 745 37 36 747 627 688 747 691 627 748 678 594 749 621 686 748 594 671 750 634 691 749 689 621 751 668 583 751 583 661 750 693 634 752 623 689 753 599 678 752 692 623 754 672 588 753 681 599 754 588 668 755 592 672 756 636 693 756 698 636 757 628 692 755 676 592 757 694 628 758 701 645 759 596 676 760 687 606 761 697 632 758 645 698 760 606 681 761 632 694 759 682 596 762 703 646 763 605 682 764 635 697 764 699 635 762 646 701 765 639 699 766 690 611 763 683 605 765 700 639 767 651 703 767 707 651 768 643 700 769 655 707 768 702 643 769 712 655 770 138 137 770 139 138 766 611 687 771 617 683 772 695 622 770 659 712 770 137 714 770 714 659 773 667 717 774 650 702 773 720 667 774 710 650 773 717 93 772 622 690 775 725 670 775 670 720 776 673 725 771 696 617 776 728 673 777 94 710 778 658 711 778 718 658 779 731 675 779 675 728 778 711 92 780 679 731 781 722 662 782 626 695 782 706 626 781 662 718 780 738 679 783 742 685 784 729 666 784 666 722 785 130 696 783 685 738 786 747 688 787 704 92 787 625 704 788 130 706 789 733 669 789 669 729 790 708 93 790 713 633 790 633 708 787 705 625 786 688 742 791 716 638 792 629 705 793 674 733 792 709 629 791 638 713 794 750 691 793 736 674 794 691 747 795 631 709 796 677 736 795 715 631 797 721 641 797 641 716 796 741 677 798 693 750 799 637 715 800 724 644 800 644 721 799 719 637 798 756 693 801 727 647 802 680 741 803 758 698 804 640 719 801 647 724 802 743 680 804 723 640 803 698 756 805 649 727 806 642 723 807 684 743 807 746 684 805 732 649 808 762 701 809 734 654 806 726 642 810 686 746 810 749 686 811 730 648 809 654 732 811 648 726 808 701 758 812 703 762 813 657 734 813 737 657 814 652 730 815 752 689 814 735 652 815 689 749 812 767 703 816 757 692 817 740 660 818 769 707 819 656 735 817 660 737 819 739 656 816 692 752 818 707 767 820 761 694 821 139 770 820 694 757 821 770 712 821 140 139 822 31 30 822 30 739 822 745 31 821 712 769 823 720 773 824 664 740 825 697 761 824 744 664 825 764 697 823 773 93 823 775 720 826 748 671 827 661 745 828 725 775 827 751 661 829 699 764 828 776 725 829 765 699 830 728 776 830 779 728 831 668 751 826 671 744 832 678 748 831 754 668 833 700 765 834 731 779 833 768 700 834 780 731 835 672 754 835 755 672 836 783 738 836 738 780 832 753 678 837 760 681 838 759 676 839 774 702 838 676 755 839 702 768 840 763 682 841 710 774 841 777 710 840 682 759 837 681 753 842 786 742 843 687 760 843 766 687 842 742 783 844 794 747 844 747 786 845 94 777 846 771 683 846 683 763 847 785 696 848 750 794 849 690 766 849 772 690 850 778 92 850 718 778 850 781 718 848 798 750 847 696 771 851 803 756 851 756 798 852 784 722 853 782 695 853 695 772 852 722 781 854 758 803 855 789 729 855 729 784 856 94 95 854 808 758 856 95 96 856 96 97 857 762 808 858 788 706 859 733 789 860 130 785 859 793 733 861 856 97 857 812 762 862 736 793 863 767 812 863 818 767 861 97 98 861 98 99 862 796 736 864 141 140 865 741 796 864 142 141 864 769 818 858 706 782 864 821 769 866 130 788 864 140 821 865 802 741 867 828 775 867 775 823 868 743 802 868 807 743 867 823 93 869 830 776 869 776 828 870 94 856 871 792 705 872 834 779 873 810 746 871 787 92 871 705 787 872 779 830 874 861 99 873 746 807 874 99 100 874 100 101 875 795 709 875 709 792 876 713 790 877 749 810 878 836 780 876 790 93 877 815 749 876 791 713 878 780 834 879 870 856 880 799 715 881 716 791 879 856 861 881 797 716 882 752 815 883 94 870 880 715 795 882 816 752 884 783 836 885 800 721 885 721 797 886 719 799 886 804 719 884 842 783 887 724 800 888 757 816 887 801 724 888 820 757 889 844 786 890 723 804 889 786 842 890 806 723 891 727 801 892 102 103 893 761 820 891 805 727 894 726 806 895 848 794 894 811 726 893 825 761 896 732 805 896 809 732 892 874 101 892 101 102 897 829 764 898 730 811 897 764 825 895 794 844 899 734 809 900 833 765 900 765 829 901 879 861 899 813 734 898 814 730 901 861 874 902 870 879 903 735 814 904 737 813 903 819 735 905 798 848 904 817 737 905 851 798 906 768 833 907 803 851 902 883 870 907 854 803 908 822 739 906 839 768 909 824 740 909 740 817 908 739 819 910 857 808 910 808 854 911 827 745 912 774 839 912 841 774 911 745 822 913 826 744 914 94 883 915 751 827 916 863 812 917 103 104 918 777 841 913 744 824 918 845 777 915 831 751 917 892 103 916 812 857 919 832 748 919 748 826 920 754 831 921 864 818 921 143 142 921 144 143 922 874 892 921 818 863 920 835 754 921 142 864 923 867 93 924 755 835 925 94 845 923 869 828 923 828 867 922 901 874 924 838 755 926 902 879 927 872 830 928 840 759 926 879 901 929 781 850 927 830 869 928 759 838 930 753 832 929 850 92 929 852 781 931 878 834 930 837 753 932 914 883 932 883 902 933 763 840 933 846 763 931 834 872 934 836 878 935 784 852 936 843 760 935 855 784 936 760 837 934 884 836 937 789 855 938 842 884 939 94 914 937 859 789 940 847 771 941 793 859 938 889 842 940 771 846 941 862 793 942 104 105 943 844 889 942 105 106 944 766 843 944 849 766 945 865 796 942 917 104 943 895 844 945 796 862 946 922 892 947 905 848 946 892 917 948 868 802 947 848 895 948 802 865 949 853 772 950 907 851 949 772 849 951 901 922 952 807 868 950 851 905 952 873 807 953 782 853 951 926 901 954 902 926 955 854 907 955 910 854 956 860 785 954 932 902 956 785 847 957 810 873 957 877 810 953 858 782 958 914 932 959 788 858 960 916 857 958 939 914 960 857 910 961 130 860 962 815 877 963 863 916 962 882 815 963 921 863 964 888 816 963 145 144 963 146 145 963 144 921 964 816 882 965 869 923 965 923 93 965 927 869 966 94 939 967 893 820 967 820 888 968 872 927 968 931 872 959 866 788 969 825 893 970 878 931 971 106 107 970 934 878 971 107 108 972 871 92 969 897 825 971 942 106 972 792 871 972 875 792 973 938 884 974 900 829 975 946 917 974 829 897 975 917 942 976 795 875 977 130 866 978 791 876 976 880 795 979 833 900 973 884 934 978 876 93 979 906 833 978 881 791 980 922 946 981 799 880 982 943 889 980 951 922 983 797 881 983 885 797 981 886 799 982 889 938 984 926 951 985 839 906 984 954 926 986 947 895 987 800 885 988 804 886 988 890 804 986 895 943 987 887 800 985 912 839 989 894 806 990 801 887 991 958 932 992 841 912 990 891 801 989 806 890 992 918 841 993 905 947 993 950 905 991 932 954 994 898 811 994 811 894 995 896 805 996 939 958 996 966 939 997 845 918 995 805 891 997 925 845 998 955 907 999 814 898 999 903 814 1000 899 809 1000 809 896 998 907 950 1001 904 813 1002 908 819 1002 819 903 1001 813 899 1003 94 925 1004 910 955 1004 960 910 1005 963 916 1006 852 929 1005 147 146 1007 909 817 1008 822 908 1005 916 960 1007 817 904 1005 148 147 1006 935 852 1008 911 822 1009 94 966 1010 824 909 1005 146 963 1011 968 927 1012 108 109 1011 965 93 1010 913 824 1006 929 92 1012 109 110 1011 927 965 1012 971 108 1013 915 827 1013 827 911 1014 931 968 1015 919 826 1014 970 931 1016 855 935 1016 937 855 1017 920 831 1018 942 971 1019 941 859 1017 831 915 1020 934 970 1015 826 913 1019 859 937 1018 975 942 1020 973 934 1021 980 946 1022 930 832 1022 832 919 1023 835 920 1023 924 835 1024 945 862 1021 946 975 1025 838 924 1026 938 973 1027 951 980 1024 862 941 1025 928 838 1026 982 938 1028 865 945 1027 984 951 1029 986 943 1030 954 984 1029 943 982 1028 948 865 1031 840 928 1031 933 840 1030 991 954 1032 947 986 1033 846 933 1034 952 868 1034 868 948 1033 940 846 1035 996 958 1036 837 930 1036 936 837 1032 993 947 1035 958 991 1037 998 950 1038 847 940 1039 873 952 1039 957 873 1037 950 993 1040 955 998 1041 966 996 1041 1009 966 1042 877 957 1043 843 936 1042 962 877 1043 944 843 1040 1004 955 1044 949 849 1038 956 847 1045 148 1005 1045 960 1004 1045 1005 960 1045 149 148 1045 150 149 1046 964 882 1046 882 962 1047 1011 93 1047 1014 968 1048 888 964 1049 961 860 1047 968 1011 1044 849 944 1050 94 1009 1051 970 1014 1052 953 853 1048 967 888 1053 110 111 1053 111 112 1051 1020 970 1049 860 956 1053 1012 110 1054 1026 973 1055 893 967 1055 969 893 1052 853 949 1054 973 1020 1056 897 969 1057 971 1012 1058 1029 982 1059 858 953 1056 974 897 1059 959 858 1057 1018 971 1060 975 1018 1060 1021 975 1058 982 1026 1061 130 961 1062 979 900 1063 986 1029 1062 900 974 1064 980 1021 1065 866 959 1065 977 866 1063 1032 986 1066 906 979 1067 993 1032 1066 985 906 1064 1027 980 1068 984 1027 1067 1037 993 1069 912 985 1069 992 912 1070 998 1037 1068 1030 984 1071 991 1030 1070 1040 998 1072 918 992 1073 1045 1004 1072 997 918 1073 150 1045 1071 1035 991 1073 151 150 1074 875 972 1073 152 151 1075 996 1035 1074 976 875 1073 1004 1040 1074 972 92 1076 1047 93 1076 1014 1047 1075 1041 996 1077 925 997 1078 880 976 1077 1003 925 1076 1051 1014 1079 1050 1009 1080 1020 1051 1078 981 880 1079 1009 1041 1081 130 977 1082 881 978 1082 983 881 1083 886 981 1080 1054 1020 1084 1058 1026 1082 978 93 1084 1026 1054 1083 988 886 1085 94 1003 1086 989 890 1087 885 983 1086 890 988 1087 987 885 1088 1063 1029 1089 887 987 1088 1029 1058 1089 990 887 1090 1016 935 1091 94 1050 1090 935 1006 1092 894 989 1092 994 894 1090 1006 92 1093 112 113 1094 891 990 1093 113 114 1095 1067 1032 1096 898 994 1094 995 891 1096 999 898 1097 1019 937 1093 1053 112 1097 937 1016 1095 1032 1063 1098 896 995 1098 1000 896 1099 1070 1037 1100 1057 1012 1100 1012 1053 1101 903 999 1101 1002 903 1102 941 1019 1102 1024 941 1099 1037 1067 1103 899 1000 1103 1001 899 1104 152 1073 1105 1018 1057 1104 153 152 1106 908 1002 1104 154 153 1107 1007 904 1106 1008 908 1104 1073 1040 1107 904 1001 1108 1028 945 1104 1040 1070 1108 945 1024 1109 1076 93 1105 1060 1018 1109 1080 1051 1110 1064 1021 1109 1051 1076 1111 911 1008 1111 1013 911 1112 1010 909 1113 948 1028 1110 1021 1060 1114 1084 1054 1112 909 1007 1113 1034 948 1114 1054 1080 1115 915 1013 1116 1039 952 1115 1017 915 1117 1088 1058 1118 1015 913 1116 952 1034 1119 1027 1064 1119 1068 1027 1118 913 1010 1117 1058 1084 1120 1023 920 1121 1071 1030 1122 957 1039 1121 1030 1068 1123 1022 919 1124 1063 1088 1123 919 1015 1124 1095 1063 1120 920 1017 1122 1042 957 1125 1075 1035 1126 924 1023 1126 1025 924 1127 1046 962 1125 1035 1071 1128 928 1025 1128 1031 928 1129 1067 1095 1127 962 1042 1129 1099 1067 1130 155 154 1130 156 155 1131 1033 933 1132 1041 1075 1130 1070 1099 1132 1079 1041 1133 1048 964 1130 154 1104 1134 1036 930 1133 964 1046 1130 1104 1070 1135 1080 1109 1134 930 1022 1136 967 1048 1135 1109 93 1131 933 1031 1135 1114 1080 1137 940 1033 1138 1091 1050 1137 1038 940 1136 1055 967 1138 1050 1079 1139 1056 969 1139 969 1055 1140 1084 1114 1140 1117 1084 1141 936 1036 1141 1043 936 1142 974 1056 1143 956 1038 1142 1062 974 1144 1124 1088 1144 1088 1117 1145 1129 1095 1146 94 1091 1147 1066 979 1148 944 1043 1149 114 115 1148 1044 944 1149 115 116 1145 1095 1124 1143 1049 956 1147 979 1062 1150 1061 961 1151 1130 1099 1149 1093 114 1151 156 1130 1151 157 156 1152 985 1066 1151 1099 1129 1152 1069 985 1153 1053 1093 1153 1100 1053 1154 1140 1114 1154 1114 1135 1155 1052 949 1154 1135 93 1155 949 1044 1156 1117 1140 1157 1072 992 1158 1105 1057 1159 1059 953 1157 992 1069 1159 953 1052 1158 1057 1100 1156 1144 1117 1160 997 1072 1160 1077 997 1161 1060 1105 1162 1145 1124 1161 1110 1060 1163 959 1059 1162 1124 1144 1164 157 1151 1150 961 1049 1164 1151 1129 1165 1003 1077 1164 158 157 1165 1085 1003 1164 1129 1145 1166 1119 1064 1164 159 158 1166 1064 1110 1167 1156 1140 1163 1065 959 1167 1154 93 1168 1081 977 1169 1121 1068 1168 977 1065 1167 1140 1154 1170 1144 1156 1170 1162 1144 1169 1068 1119 1171 94 1085 1172 1125 1071 1173 1145 1162 1173 1164 1145 1173 159 1164 1174 1090 92 1172 1071 1121 1173 160 159 1174 1097 1016 1173 161 160 1175 1170 1156 1176 1132 1075 1175 1167 93 1174 1016 1090 1176 1075 1125 1175 1156 1167 1177 130 1061 1178 1102 1019 1179 1173 1162 1180 1078 976 1179 1162 1170 1180 1074 92 1178 1019 1097 1179 161 1173 1180 976 1074 1181 130 1081 1179 162 161 1179 163 162 1182 1138 1079 1182 1079 1132 1183 1170 1175 1183 1175 93 1183 1179 1170 1183 163 1179 1184 981 1078 1185 1024 1102 1183 164 163 1183 165 164 1183 93 165 1184 1083 981 1185 1108 1024 1186 1146 1091 1187 983 1082 1187 1087 983 1188 1086 988 1187 1082 93 1189 1028 1108 1186 1091 1138 1188 988 1083 1190 987 1087 1189 1113 1028 1190 1089 987 1191 989 1086 1191 1092 989 1192 1034 1113 1193 990 1089 1192 1116 1034 1193 1094 990 1194 1096 994 1195 94 1146 1196 116 117 1197 1039 1116 1196 117 118 1194 994 1092 1196 1149 116 1198 995 1094 1199 1101 999 1198 1098 995 1199 999 1096 1200 1103 1000 1197 1122 1039 1201 1042 1122 1202 1153 1093 1202 1093 1149 1200 1000 1098 1203 1106 1002 1204 1107 1001 1201 1127 1042 1203 1002 1101 1205 1158 1100 1204 1001 1103 1205 1100 1153 1206 1112 1007 1207 1008 1106 1208 1133 1046 1207 1111 1008 1208 1046 1127 1206 1007 1107 1209 1048 1133 1210 1010 1112 1209 1136 1048 1210 1118 1010 1211 1105 1158 1212 1115 1013 1212 1013 1111 1211 1161 1105 1213 1110 1161 1214 1139 1055 1213 1166 1110 1215 1123 1015 1214 1055 1136 1215 1015 1118 1216 1017 1115 1216 1120 1017 1217 1056 1139 1218 1169 1119 1217 1142 1056 1219 1023 1120 1219 1126 1023 1218 1119 1166 1220 1121 1169 1220 1172 1121 1221 1022 1123 1222 1128 1025 1223 1062 1142 1222 1025 1126 1223 1147 1062 1221 1134 1022 1224 1031 1128 1225 1036 1134 1226 1176 1125 1224 1131 1031 1225 1141 1036 1227 1152 1066 1227 1066 1147 1228 1033 1131 1226 1125 1172 1228 1137 1033 1229 1132 1176 1230 1069 1152 1230 1157 1069 1231 1043 1141 1229 1182 1132 1232 1186 1138 1233 1038 1137 1231 1148 1043 1233 1143 1038 1234 1160 1072 1234 1072 1157 1232 1138 1182 1235 1049 1143 1236 1146 1186 1237 1077 1160 1238 1044 1148 1235 1150 1049 1237 1165 1077 1236 1195 1146 1239 1085 1165 1239 1171 1085 1238 1155 1044 1240 1052 1155 1240 1159 1052 1241 1061 1150 1242 94 1195 1243 118 119 1243 119 120 1244 94 1171 1243 1196 118 1245 1097 1174 1245 1174 92 1246 1149 1196 1246 1202 1149 1241 1177 1061 1245 1178 1097 1247 1059 1159 1247 1163 1059 1248 1102 1178 1249 66 65 1249 1153 1202 1248 1185 1102 1249 1205 1153 1250 1158 1205 1250 1211 1158 1251 130 1177 1252 1108 1185 1252 1189 1108 1250 62 61 1253 1168 1065 1254 1192 1113 1255 1213 1161 1253 1065 1163 1254 1113 1189 1255 1161 1211 1256 1116 1192 1257 1166 1213 1257 1218 1166 1256 1197 1116 1258 1169 1218 1259 1081 1168 1260 1122 1197 1260 1201 1122 1258 1220 1169 1259 1181 1081 1261 1172 1220 1262 1127 1201 1263 1180 92 1262 1208 1127 1263 1078 1180 1263 1184 1078 1261 1226 1172 1264 1176 1226 1265 1083 1184 1264 1229 1176 1266 130 1181 1265 1188 1083 1267 1209 1133 1267 1133 1208 1268 1087 1187 1268 1190 1087 1268 1187 93 1269 1191 1086 1270 1193 1089 1269 1086 1188 1271 1182 1229 1272 1136 1209 1271 1232 1182 1270 1089 1190 1272 1214 1136 1273 1194 1092 1274 1094 1193 1275 1139 1214 1276 1186 1232 1274 1198 1094 1273 1092 1191 1277 1096 1194 1278 1098 1198 1275 1217 1139 1276 1236 1186 1278 1200 1098 1277 1199 1096 1279 1142 1217 1280 1242 1195 1280 1195 1236 1281 1101 1199 1282 1103 1200 1281 1203 1101 1282 1204 1103 1279 1223 1142 1283 94 1242 1284 1106 1203 1285 1147 1223 1286 1107 1204 1284 1207 1106 1286 1206 1107 1285 1227 1147 1287 1112 1206 1288 1212 1111 1287 1210 1112 1289 1152 1227 1288 1111 1207 1289 1230 1152 1290 120 121 1291 1216 1115 1292 1118 1210 1293 1157 1230 1292 1215 1118 1291 1115 1212 1290 1243 120 1294 1221 1123 1293 1234 1157 1295 1196 1243 1294 1123 1215 1295 1246 1196 1296 1219 1120 1296 1120 1216 1297 1237 1160 1295 69 68 1295 70 69 1295 68 1246 1298 1202 1246 1297 1160 1234 1298 67 66 1298 68 67 1298 1246 68 1299 1222 1126 1298 66 1249 1300 1134 1221 1298 1249 1202 1300 1225 1134 1301 1205 1249 1301 1250 1205 1299 1126 1219 1301 1249 65 1302 1165 1237 1301 63 62 1303 1224 1128 1301 64 63 1302 1239 1165 1301 65 64 1301 62 1250 1304 1255 1211 1303 1128 1222 1304 1211 1250 1305 1231 1141 1304 1250 61 1306 1171 1239 1307 1228 1131 1306 1244 1171 1307 1131 1224 1308 1213 1255 1308 1257 1213 1305 1141 1225 1309 1233 1137 1310 1218 1257 1310 1258 1218 1311 1148 1231 1312 94 1244 1309 1137 1228 1313 1248 1178 1314 1235 1143 1314 1143 1233 1313 1178 1245 1315 1261 1220 1315 1220 1258 1311 1238 1148 1316 1264 1226 1313 1245 92 1316 1226 1261 1317 1155 1238 1317 1240 1155 1318 1185 1248 1318 1252 1185 1319 1150 1235 1320 1254 1189 1319 1241 1150 1320 1189 1252 1321 1271 1229 1321 1229 1264 1322 1177 1241 1323 1192 1254 1324 1232 1271 1322 1251 1177 1324 1276 1232 1323 1256 1192 1325 1159 1240 1325 1247 1159 1326 1260 1197 1327 1163 1247 1326 1197 1256 1328 1236 1276 1328 1280 1236 1329 1242 1280 1330 1262 1201 1327 1253 1163 1330 1201 1260 1329 1283 1242 1331 1267 1208 1331 1208 1262 1332 1209 1267 1333 1168 1253 1332 1272 1209 1333 1259 1168 1334 1266 1181 1334 1181 1259 1335 94 1283 1336 121 122 1336 122 123 1336 1290 121 1337 1214 1272 1337 1275 1214 1338 1279 1217 1339 70 1295 1339 1295 1243 1340 130 1266 1339 1243 1290 1341 130 1251 1339 71 70 1338 1217 1275 1339 72 71 1339 44 72 1339 73 44 1342 1304 61 1342 58 1304 1342 59 58 1343 1285 1223 1342 60 59 1342 61 60 1343 1223 1279 1344 1184 1263 1345 1304 58 1344 1263 92 1344 1265 1184 1345 1255 1304 1345 1308 1255 1346 1190 1268 1347 1227 1285 1346 1268 93 1347 1289 1227 1346 1270 1190 1348 1269 1188 1349 1257 1308 1348 1188 1265 1350 1193 1270 1349 1310 1257 1351 1230 1289 1351 1293 1230 1352 1191 1269 1353 1315 1258 1350 1274 1193 1352 1273 1191 1354 1278 1198 1353 1258 1310 1354 1198 1274 1355 1194 1273 1356 1234 1293 1357 1200 1278 1355 1277 1194 1356 1297 1234 1357 1282 1200 1358 1261 1315 1359 1204 1282 1360 1199 1277 1361 1237 1297 1358 1316 1261 1360 1281 1199 1362 1264 1316 1361 1302 1237 1362 1321 1264 1359 1286 1204 1363 1206 1286 1364 1284 1203 1364 1203 1281 1365 1239 1302 1366 1271 1321 1365 1306 1239 1366 1324 1271 1363 1287 1206 1367 1210 1287 1367 1292 1210 1368 1207 1284 1368 1288 1207 1369 1244 1306 1369 1312 1244 1370 1328 1276 1371 1212 1288 1370 1276 1324 1372 1294 1215 1371 1291 1212 1372 1215 1292 1373 1296 1216 1374 1329 1280 1373 1216 1291 1374 1280 1328 1375 94 1312 1376 1299 1219 1377 1221 1294 1377 1300 1221 1378 1318 1248 1378 1248 1313 1379 1283 1329 1380 1225 1300 1379 1335 1283 1380 1305 1225 1376 1219 1296 1381 1303 1222 1378 1313 92 1382 1252 1318 1382 1320 1252 1381 1222 1299 1383 1231 1305 1384 1307 1224 1385 1323 1254 1384 1224 1303 1386 1228 1307 1385 1254 1320 1386 1309 1228 1387 94 1335 1388 123 124 1388 124 125 1389 1256 1323 1388 1336 123 1383 1311 1231 1390 1233 1309 1389 1326 1256 1391 1238 1311 1390 1314 1233 1391 1317 1238 1392 1339 1290 1393 1260 1326 1392 1290 1336 1393 1330 1260 1392 73 1339 1392 74 73 1392 75 74 1394 1319 1235 1394 1235 1314 1395 1345 58 1396 1331 1262 1395 57 56 1395 58 57 1397 1240 1317 1398 1308 1345 1396 1262 1330 1398 1349 1308 1399 1267 1331 1399 1332 1267 1397 1325 1240 1400 1310 1349 1401 1272 1332 1402 1247 1325 1400 1353 1310 1401 1337 1272 1403 1322 1241 1403 1241 1319 1404 1341 1251 1404 1251 1322 1405 1358 1315 1402 1327 1247 1405 1315 1353 1406 1275 1337 1406 1338 1275 1407 1333 1253 1408 1316 1358 1407 1253 1327 1409 1279 1338 1408 1362 1316 1409 1343 1279 1410 1321 1362 1410 1366 1321 1411 1285 1343 1411 1347 1285 1412 1324 1366 1413 1334 1259 1414 1289 1347 1412 1370 1324 1413 1259 1333 1414 1351 1289 1415 130 1341 1416 1266 1334 1417 1293 1351 1418 1328 1370 1418 1374 1328 1417 1356 1293 1419 1297 1356 1416 1340 1266 1420 130 1340 1421 1329 1374 1419 1361 1297 1421 1379 1329 1422 1302 1361 1422 1365 1302 1423 1335 1379 1423 1387 1335 1424 1306 1365 1425 1344 92 1424 1369 1306 1426 1346 93 1426 1270 1346 1426 1350 1270 1425 1265 1344 1427 1274 1350 1425 1348 1265 1428 1312 1369 1428 1375 1312 1427 1354 1274 1429 1352 1269 1430 1357 1278 1429 1269 1348 1431 94 1387 1432 1273 1352 1433 125 126 1433 126 127 1430 1278 1354 1432 1355 1273 1433 1388 125 1434 1282 1357 1434 1359 1282 1435 94 1375 1436 76 75 1436 77 76 1436 78 77 1437 1277 1355 1436 75 1392 1437 1360 1277 1436 1392 1336 1438 1363 1286 1436 1336 1388 1439 1382 1318 1438 1286 1359 1439 1378 92 1440 1281 1360 1441 1345 1395 1442 1287 1363 1440 1364 1281 1441 56 55 1439 1318 1378 1442 1367 1287 1441 1398 1345 1443 1284 1364 1441 1395 56 1443 1368 1284 1444 1385 1320 1444 1320 1382 1445 1400 1349 1446 1372 1292 1445 1349 1398 1447 1389 1323 1446 1292 1367 1448 1288 1368 1449 1377 1294 1449 1294 1372 1448 1371 1288 1447 1323 1385 1450 1291 1371 1451 1326 1389 1450 1373 1291 1452 1353 1400 1452 1405 1353 1453 1300 1377 1451 1393 1326 1454 1296 1373 1454 1376 1296 1455 1408 1358 1455 1358 1405 1453 1380 1300 1456 1299 1376 1457 1330 1393 1457 1396 1330 1458 1362 1408 1456 1381 1299 1458 1410 1362 1459 1331 1396 1459 1399 1331 1460 1384 1303 1461 1412 1366 1462 1305 1380 1462 1383 1305 1463 1332 1399 1460 1303 1381 1461 1366 1410 1464 1307 1384 1465 1418 1370 1463 1401 1332 1464 1386 1307 1466 1337 1401 1467 1390 1309 1465 1370 1412 1467 1309 1386 1468 1421 1374 1466 1406 1337 1469 1391 1311 1468 1374 1418 1469 1311 1383 1470 1317 1391 1471 1409 1338 1472 1314 1390 1473 1379 1421 1472 1394 1314 1471 1338 1406 1470 1397 1317 1473 1423 1379 1474 1403 1319 1474 1319 1394 1475 1387 1423 1476 1402 1325 1477 1343 1409 1477 1411 1343 1475 1431 1387 1478 1347 1411 1478 1414 1347 1476 1325 1397 1479 1327 1402 1479 1407 1327 1480 1417 1351 1480 1351 1414 1481 94 1431 1482 1404 1322 1483 127 128 1484 1419 1356 1482 1322 1403 1483 128 129 1483 129 92 1484 1356 1417 1483 1433 127 1485 1436 1388 1486 1361 1419 1487 1333 1407 1485 78 1436 1486 1422 1361 1487 1413 1333 1485 1388 1433 1488 1441 55 1488 54 53 1489 1415 1341 1488 55 54 1490 1445 1398 1491 1365 1422 1490 1398 1441 1491 1424 1365 1492 1334 1413 1492 1416 1334 1493 1340 1416 1494 1369 1424 1495 1400 1445 1494 1428 1369 1496 1435 1375 1489 1341 1404 1495 1452 1400 1497 1405 1452 1493 1420 1340 1496 1375 1428 1497 1455 1405 1498 1458 1408 1498 1408 1455 1499 94 1435 1500 130 1420 1501 1444 1382 1502 1427 1350 1503 1410 1458 1502 1426 93 1504 130 1415 1501 1382 1439 1501 1439 92 1502 1350 1426 1505 1430 1354 1505 1354 1427 1503 1461 1410 1506 1447 1385 1507 1425 92 1507 1348 1425 1507 1429 1348 1508 1412 1461 1509 1357 1430 1509 1434 1357 1507 92 93 1506 1385 1444 1510 1451 1389 1511 1352 1429 1510 1389 1447 1511 1432 1352 1508 1465 1412 1512 1359 1434 1512 1438 1359 1513 1418 1465 1513 1468 1418 1514 1393 1451 1515 1355 1432 1516 1363 1438 1515 1437 1355 1517 1473 1421 1514 1457 1393 1517 1421 1468 1516 1442 1363 1518 1396 1457 1519 1367 1442 1518 1459 1396 1520 1475 1423 1521 1360 1437 1521 1440 1360 1519 1446 1367 1522 1372 1446 1520 1423 1473 1522 1449 1372 1523 1399 1459 1524 1443 1364 1524 1364 1440 1525 1377 1449 1523 1463 1399 1526 1431 1475 1525 1453 1377 1526 1481 1431 1527 1401 1463 1528 1368 1443 1528 1448 1368 1529 94 1481 1527 1466 1401 1530 1380 1453 1531 1450 1371 1530 1462 1380 1531 1371 1448 1532 1406 1466 1533 1454 1373 1532 1471 1406 1533 1373 1450 1534 1383 1462 1535 1485 1433 1536 1477 1409 1536 1409 1471 1537 1456 1376 1535 1483 92 1537 1376 1454 1535 1433 1483 1538 1381 1456 1538 1460 1381 1539 78 1485 1539 79 78 1540 1478 1411 1534 1469 1383 1539 80 79 1540 1411 1477 1541 1441 1488 1541 1490 1441 1542 1391 1469 1543 1464 1384 1544 1414 1478 1543 1384 1460 1541 1488 53 1545 1386 1464 1544 1480 1414 1546 1445 1490 1546 1495 1445 1542 1470 1391 1547 1476 1397 1545 1467 1386 1548 1417 1480 1549 1390 1467 1548 1484 1417 1549 1472 1390 1547 1397 1470 1550 1497 1452 1550 1452 1495 1551 1486 1419 1551 1419 1484 1552 1394 1472 1553 1498 1455 1554 1479 1402 1553 1455 1497 1552 1474 1394 1555 1422 1486 1555 1491 1422 1556 1482 1403 1554 1402 1476 1557 1487 1407 1558 1503 1458 1559 1424 1491 1559 1494 1424 1558 1458 1498 1560 1508 1461 1556 1403 1474 1560 1461 1503 1561 1489 1404 1562 1428 1494 1562 1496 1428 1557 1407 1479 1563 1492 1413 1564 1513 1465 1564 1465 1508 1565 1435 1496 1565 1499 1435 1563 1413 1487 1566 1517 1468 1561 1404 1482 1566 1468 1513 1567 1416 1492 1568 1504 1415 1568 1415 1489 1569 1473 1517 1570 94 1499 1569 1520 1473 1571 1444 1501 1571 1506 1444 1567 1493 1416 1572 1420 1493 1571 1501 92 1573 1475 1520 1573 1526 1475 1574 1510 1447 1572 1500 1420 1575 1529 1481 1574 1447 1506 1575 1481 1526 1576 1451 1510 1576 1514 1451 1577 1457 1514 1578 94 1529 1579 130 1500 1580 1427 1502 1577 1518 1457 1580 1505 1427 1580 1502 93 1581 80 1539 1582 1459 1518 1581 1539 1485 1581 1485 1535 1583 1509 1430 1583 1430 1505 1582 1523 1459 1581 1535 92 1584 1541 53 1585 1434 1509 1586 1527 1463 1585 1512 1434 1587 130 1504 1584 51 50 1584 52 51 1584 53 52 1586 1463 1523 1588 1511 1429 1589 1438 1512 1588 1507 93 1589 1516 1438 1588 1429 1507 1590 1466 1527 1590 1532 1466 1591 1432 1511 1592 1519 1442 1591 1515 1432 1593 1546 1490 1592 1442 1516 1593 1490 1541 1594 1550 1495 1595 1522 1446 1596 1471 1532 1595 1446 1519 1596 1536 1471 1597 1437 1515 1594 1495 1546 1597 1521 1437 1598 1553 1497 1599 1477 1536 1600 1525 1449 1601 1440 1521 1599 1540 1477 1600 1449 1522 1601 1524 1440 1602 1453 1525 1602 1530 1453 1598 1497 1550 1603 1443 1524 1603 1528 1443 1604 1544 1478 1605 1498 1553 1604 1478 1540 1606 1448 1528 1606 1531 1448 1607 1480 1544 1605 1558 1498 1607 1548 1480 1608 1560 1503 1609 1533 1450 1610 1462 1530 1610 1534 1462 1608 1503 1558 1609 1450 1531 1611 1508 1560 1612 1484 1548 1613 1542 1469 1612 1551 1484 1614 1454 1533 1614 1537 1454 1611 1564 1508 1615 1486 1551 1615 1555 1486 1616 1456 1537 1613 1469 1534 1617 1513 1564 1617 1566 1513 1616 1538 1456 1618 1460 1538 1619 1517 1566 1620 1491 1555 1618 1543 1460 1620 1559 1491 1619 1569 1517 1621 1494 1559 1622 1547 1470 1623 1464 1543 1622 1470 1542 1623 1545 1464 1624 1520 1569 1621 1562 1494 1625 1476 1547 1626 1565 1496 1625 1554 1476 1627 1467 1545 1627 1549 1467 1624 1573 1520 1628 1526 1573 1629 1472 1549 1628 1575 1526 1626 1496 1562 1629 1552 1472 1630 1499 1565 1631 1557 1479 1631 1479 1554 1632 1529 1575 1632 1578 1529 1633 1474 1552 1630 1570 1499 1633 1556 1474 1634 94 1570 1635 1561 1482 1636 1571 92 1635 1482 1556 1636 1574 1506 1637 94 1578 1638 1563 1487 1639 1581 92 1638 1487 1557 1636 1506 1571 1639 80 1581 1639 81 80 1639 82 81 1639 83 82 1640 1568 1489 1641 1510 1574 1642 1492 1563 1641 1576 1510 1642 1567 1492 1643 1584 50 1644 1514 1576 1643 49 48 1643 50 49 1645 1572 1493 1644 1577 1514 1646 1582 1518 1646 1518 1577 1645 1493 1567 1640 1489 1561 1647 1541 1584 1648 1500 1572 1647 1593 1541 1648 1579 1500 1649 1523 1582 1650 1594 1546 1649 1586 1523 1651 130 1579 1650 1546 1593 1652 1527 1586 1652 1590 1527 1653 1550 1594 1653 1598 1550 1654 1596 1532 1654 1532 1590 1655 1583 1505 1655 1580 93 1656 1587 1504 1657 1605 1553 1656 1504 1568 1655 1505 1580 1657 1553 1598 1658 1536 1596 1658 1599 1536 1659 1509 1583 1659 1585 1509 1660 1608 1558 1660 1558 1605 1661 1540 1599 1662 1589 1512 1662 1512 1585 1661 1604 1540 1663 1592 1516 1664 1560 1608 1664 1611 1560 1663 1516 1589 1665 1595 1519 1666 1607 1544 1667 1617 1564 1666 1544 1604 1667 1564 1611 1665 1519 1592 1668 130 1587 1669 1522 1595 1669 1600 1522 1670 1511 1588 1670 1591 1511 1671 1548 1607 1670 1588 93 1672 1619 1566 1671 1612 1548 1672 1566 1617 1673 1525 1600 1674 1515 1591 1673 1602 1525 1674 1597 1515 1675 1551 1612 1675 1615 1551 1676 1601 1521 1677 1610 1530 1678 1569 1619 1677 1530 1602 1678 1624 1569 1679 1555 1615 1676 1521 1597 1679 1620 1555 1680 1573 1624 1680 1628 1573 1681 1559 1620 1682 1534 1610 1683 1524 1601 1682 1613 1534 1683 1603 1524 1684 1575 1628 1681 1621 1559 1684 1632 1575 1685 1606 1528 1685 1528 1603 1686 1562 1621 1686 1626 1562 1687 1609 1531 1688 1578 1632 1689 1622 1542 1688 1637 1578 1687 1531 1606 1690 1630 1565 1690 1565 1626 1691 1614 1533 1691 1533 1609 1689 1542 1613 1692 1537 1614 1692 1616 1537 1693 1547 1622 1694 94 1637 1695 1639 92 1696 1570 1630 1696 1634 1570 1697 1618 1538 1697 1538 1616 1695 83 1639 1695 84 83 1695 85 84 1695 86 85 1698 94 1634 1693 1625 1547 1699 1554 1625 1700 1543 1618 1700 1623 1543 1701 1636 92 1702 89 88 1703 1545 1623 1703 1627 1545 1701 1574 1636 1704 45 43 1701 1641 1574 1699 1631 1554 1705 1629 1549 1706 1638 1557 1704 43 91 1707 1576 1641 1705 1549 1627 1707 1644 1576 1708 46 45 1708 47 46 1708 48 47 1709 1633 1552 1706 1557 1631 1708 1643 48 1710 1577 1644 1711 1563 1638 1710 1646 1577 1709 1552 1629 1712 1582 1646 1713 1584 1643 1713 1647 1584 1712 1649 1582 1711 1642 1563 1714 1635 1556 1715 1593 1647 1714 1556 1633 1716 1652 1586 1717 1640 1561 1715 1650 1593 1716 1586 1649 1717 1561 1635 1718 1645 1567 1719 1594 1650 1718 1567 1642 1720 1572 1645 1721 1590 1652 1721 1654 1590 1719 1653 1594 1720 1648 1572 1722 1656 1568 1723 1596 1654 1723 1658 1596 1724 1598 1653 1724 1657 1598 1725 1660 1605 1726 1599 1658 1725 1605 1657 1726 1661 1599 1727 1579 1648 1727 1651 1579 1722 1568 1640 1728 1664 1608 1729 1668 1587 1729 1587 1656 1730 1604 1661 1730 1666 1604 1728 1608 1660 1731 1667 1611 1731 1611 1664 1732 1607 1666 1733 130 1651 1734 1655 93 1732 1671 1607 1735 1672 1617 1734 1583 1655 1734 1659 1583 1735 1617 1667 1736 1585 1659 1737 1612 1671 1736 1662 1585 1737 1675 1612 1738 1678 1619 1738 1619 1672 1739 1679 1615 1740 1663 1589 1740 1589 1662 1741 1624 1678 1739 1615 1675 1742 1620 1679 1742 1681 1620 1743 1592 1663 1741 1680 1624 1743 1665 1592 1744 1628 1680 1745 1595 1665 1746 1621 1681 1745 1669 1595 1744 1684 1628 1747 1673 1600 1748 1632 1684 1746 1686 1621 1749 1626 1686 1748 1688 1632 1747 1600 1669 1750 130 1668 1751 1591 1670 1749 1690 1626 1752 1677 1602 1751 1674 1591 1753 1637 1688 1753 1694 1637 1752 1602 1673 1751 1670 93 1754 1610 1677 1755 1597 1674 1755 1676 1597 1756 1696 1630 1756 1630 1690 1754 1682 1610 1757 1698 1634 1758 1601 1676 1758 1683 1601 1759 94 1694 1757 1634 1696 1760 1685 1603 1761 94 1698 1762 1702 88 1763 1613 1682 1763 1689 1613 1760 1603 1683 1762 1695 92 1764 1606 1685 1764 1687 1606 1762 87 86 1765 1622 1689 1762 88 87 1766 1641 1701 1766 1707 1641 1762 86 1695 1767 89 1702 1767 1704 91 1768 1609 1687 1765 1693 1622 1768 1691 1609 1766 1701 92 1767 90 89 1767 91 90 1769 1699 1625 1770 1692 1614 1771 1644 1707 1771 1710 1644 1770 1614 1691 1772 45 1704 1772 1708 45 1773 1616 1692 1769 1625 1693 1773 1697 1616 1774 1712 1646 1775 1643 1708 1774 1646 1710 1775 1713 1643 1776 1618 1697 1776 1700 1618 1777 1716 1649 1778 1703 1623 1777 1649 1712 1779 1647 1713 1780 1706 1631 1780 1631 1699 1779 1715 1647 1781 1711 1638 1778 1623 1700 1781 1638 1706 1782 1721 1652 1782 1652 1716 1783 1650 1715 1784 1627 1703 1784 1705 1627 1783 1719 1650 1785 1654 1721 1786 1642 1711 1785 1723 1654 1786 1718 1642 1787 1629 1705 1788 1724 1653 1787 1709 1629 1788 1653 1719 1789 1658 1723 1789 1726 1658 1790 1657 1724 1790 1725 1657 1791 1633 1709 1791 1714 1633 1792 1661 1726 1792 1730 1661 1793 1717 1635 1793 1635 1714 1794 1645 1718 1795 1660 1725 1795 1728 1660 1794 1720 1645 1796 1666 1730 1796 1732 1666 1797 1648 1720 1797 1727 1648 1798 1664 1728 1798 1731 1664 1799 1671 1732 1799 1737 1671 1800 1735 1667 1800 1667 1731 1801 1733 1651 1801 1651 1727 1802 1739 1675 1802 1675 1737 1803 1672 1735 1804 1640 1717 1804 1722 1640 1803 1738 1672 1805 1729 1656 1805 1656 1722 1806 130 1733 1807 1679 1739 1808 1678 1738 1807 1742 1679 1809 1746 1681 1808 1741 1678 1810 1736 1659 1809 1681 1742 1811 1744 1680 1810 1659 1734 1811 1680 1741 1810 1734 93 1812 1749 1686 1813 1740 1662 1813 1662 1736 1814 1748 1684 1815 1668 1729 1814 1684 1744 1812 1686 1746 1816 1663 1740 1816 1743 1663 1817 1690 1749 1818 1688 1748 1819 1665 1743 1817 1756 1690 1818 1753 1688 1819 1745 1665 1820 1669 1745 1821 1759 1694 1820 1747 1669 1821 1694 1753 1822 1757 1696 1822 1696 1756 1815 1750 1668 1823 1752 1673 1823 1673 1747 1824 1698 1757 1825 1754 1677 1825 1677 1752 1824 1761 1698 1826 94 1759 1827 94 1761 1828 1763 1682 1829 1762 92 1829 1702 1762 1830 1707 1766 1829 1767 1702 1830 1771 1707 1828 1682 1754 1830 1766 92 1831 130 1750 1832 1772 1704 1833 1765 1689 1834 1755 1674 1834 1751 93 1835 1710 1771 1832 1704 1767 1834 1674 1751 1836 1676 1755 1835 1774 1710 1837 1775 1708 1838 1777 1712 1833 1689 1763 1836 1758 1676 1837 1708 1772 1838 1712 1774 1839 1760 1683 1840 1693 1765 1841 1779 1713 1839 1683 1758 1841 1713 1775 1840 1769 1693 1842 1716 1777 1842 1782 1716 1843 1780 1699 1843 1699 1769 1844 1764 1685 1844 1685 1760 1845 1687 1764 1845 1768 1687 1846 1783 1715 1847 1721 1782 1846 1715 1779 1847 1785 1721 1848 1788 1719 1849 1706 1780 1850 1723 1785 1851 1770 1691 1850 1789 1723 1848 1719 1783 1851 1691 1768 1852 1790 1724 1853 1773 1692 1852 1724 1788 1854 1792 1726 1853 1692 1770 1854 1726 1789 1849 1781 1706 1855 1786 1711 1856 1697 1773 1857 1725 1790 1855 1711 1781 1856 1776 1697 1858 1796 1730 1859 1700 1776 1857 1795 1725 1858 1730 1792 1860 1728 1795 1860 1798 1728 1859 1778 1700 1861 1703 1778 1862 1799 1732 1861 1784 1703 1862 1732 1796 1863 1802 1737 1864 1705 1784 1865 1800 1731 1866 1718 1786 1866 1794 1718 1865 1731 1798 1863 1737 1799 1867 1803 1735 1868 1720 1794 1864 1787 1705 1869 1807 1739 1870 1709 1787 1867 1735 1800 1871 1808 1738 1869 1739 1802 1870 1791 1709 1872 1809 1742 1868 1797 1720 1872 1742 1807 1873 1793 1714 1874 1801 1727 1871 1738 1803 1875 1811 1741 1875 1741 1808 1876 1746 1809 1874 1727 1797 1873 1714 1791 1877 1804 1717 1878 1814 1744 1876 1812 1746 1879 1733 1801 1879 1806 1733 1878 1744 1811 1880 1817 1749 1877 1717 1793 1880 1749 1812 1881 1748 1814 1881 1818 1748 1882 1753 1818 1883 130 1806 1884 1756 1817 1882 1821 1753 1885 1736 1810 1885 1810 93 1886 1805 1722 1884 1822 1756 1885 1813 1736 1886 1722 1804 1887 1740 1813 1888 1759 1821 1889 1815 1729 1890 1757 1822 1887 1816 1740 1888 1826 1759 1890 1824 1757 1891 1819 1743 1892 1827 1761 1892 1761 1824 1891 1743 1816 1893 1820 1745 1893 1745 1819 1889 1729 1805 1894 94 1827 1894 130 94 1895 94 1826 1896 1750 1815 1897 1747 1820 1897 1823 1747 1898 1832 1767 1899 1752 1823 1900 1771 1830 1898 1767 1829 1899 1825 1752 1898 1829 92 1900 1830 92 1900 1835 1771 1901 1837 1772 1902 1754 1825 1902 1828 1754 1901 1772 1832 1903 1774 1835 1904 1763 1828 1905 1775 1837 1903 1838 1774 1896 1831 1750 1906 130 1831 1905 1841 1775 1907 1842 1777 1907 1777 1838 1904 1833 1763 1908 1779 1841 1908 1846 1779 1909 1840 1765 1910 1847 1782 1911 1783 1846 1910 1782 1842 1912 1850 1785 1909 1765 1833 1912 1785 1847 1911 1848 1783 1913 1834 93 1914 1788 1848 1914 1852 1788 1913 1836 1755 167 1789 1850 167 1854 1789 1913 1755 1834 1915 1769 1840 1916 1857 1790 1915 1843 1769 220 1758 1836 220 1839 1758 1916 1790 1852 180 1792 1854 180 1858 1792 224 1760 1839 224 1844 1760 1917 1795 1857 1917 1860 1795 176 1780 1843 176 1849 1780 190 1796 1858 190 1862 1796 239 1845 1764 1918 1865 1798 239 1764 1844 185 1781 1849 244 1768 1845 200 1799 1862 1918 1798 1860 200 1863 1799 244 1851 1768 1919 1800 1865 185 1855 1781 204 1802 1863 198 1866 1786 1919 1867 1800 254 1770 1851 254 1853 1770 204 1869 1802 170 1803 1867 170 1871 1803 264 1856 1773 198 1786 1855 264 1773 1853 209 1794 1866 209 1868 1794 178 1875 1808 212 1807 1869 212 1872 1807 178 1808 1871 267 1776 1856 233 1876 1809 267 1859 1776 281 1861 1778 230 1797 1868 281 1778 1859 188 1811 1875 230 1874 1797 233 1809 1872 188 1878 1811 246 1880 1812 246 1812 1876 289 1784 1861 289 1864 1784 195 1814 1878 195 1881 1814 236 1879 1801 299 1870 1787 299 1787 1864 206 1818 1881 206 1882 1818 236 1801 1874 258 1817 1880 258 1884 1817 251 1883 1806 316 1791 1870 251 1806 1879 316 1873 1791 217 1888 1821 217 1821 1882 270 1890 1822 331 1793 1873 270 1822 1884 331 1877 1793 261 130 1883 226 1826 1888 226 1895 1826 284 1892 1824 284 1824 1890 335 1804 1877 335 1886 1804 1920 1887 1813 1920 1813 1885 1920 1885 93 291 1816 1887 241 94 1895 291 1891 1816 304 1827 1892 304 1894 1827 297 1819 1891 297 1893 1819 1921 1832 1898 1921 1901 1832 1921 1898 92 308 1820 1893 308 1897 1820 313 1823 1897 313 1899 1823 349 1805 1886 274 1837 1901 349 1889 1805 274 1905 1837 310 130 1894 361 1815 1889 323 1902 1825 323 1825 1899 1922 1903 1835 1922 1900 92 1922 1835 1900 278 1841 1905 278 1908 1841 358 1907 1838 361 1896 1815 358 1838 1903 293 1846 1908 293 1911 1846 333 1904 1828 306 1848 1911 333 1828 1902 345 1909 1833 367 1842 1907 367 1910 1842 306 1914 1848 320 1852 1914 320 1916 1852 374 1912 1847 374 1847 1910 345 1833 1904 168 167 1850 328 1917 1857 352 1915 1840 168 1850 1912 372 1906 1831 372 1831 1896 328 1857 1916 340 1918 1860 352 1840 1909 182 1843 1915 173 180 1854 182 176 1843 173 1854 167 340 1860 1917 183 1858 180 183 190 1858 342 1919 1865 342 1865 1918 175 1849 176 191 1862 190 191 200 1862 171 1867 1919 214 130 1906 171 170 1867 221 1913 93 221 220 1836 175 185 1849 172 178 1871 192 1855 185 221 1836 1913 219 1839 220 201 1863 200 201 204 1863 172 1871 170 192 198 1855 219 224 1839 203 1869 204 181 1875 178 228 1844 224 228 239 1844 181 188 1875 197 209 1866 203 212 1869 197 1866 198 211 1872 212 238 1845 239 187 1878 188 187 195 1878 238 244 1845 211 233 1872 232 246 1876 232 1876 233 248 1851 244 194 1881 195 222 230 1868 248 254 1851 194 206 1881 255 1853 254 222 1868 209 255 264 1853 207 1882 206 207 217 1882 249 1880 246 265 1856 264 234 1874 230 265 267 1856 216 1888 217 216 226 1888 249 258 1880 234 236 1874 247 1879 236 247 251 1879 273 1859 267 227 1895 226 262 270 1884 227 241 1895 273 281 1859 280 1861 281 280 289 1861 262 1884 258 269 1890 270 294 1864 289 252 1883 251 294 299 1864 269 284 1890 252 261 1883 283 304 1892 242 94 241 300 316 1870 300 1870 299 283 1892 284 272 1921 92 315 331 1873 315 1873 316 303 310 1894 272 274 1901 260 130 261 303 1894 304 287 1920 93 272 1901 1921 287 291 1887 287 1887 1920 290 297 1891 290 1891 291 275 1905 274 330 1877 331 275 278 1905 296 1893 297 296 308 1893 277 1908 278 330 335 1877 277 293 1908 311 313 1897 311 1897 308 301 306 1911 336 349 1886 318 1899 313 318 323 1899 301 1911 293 317 1914 306 336 1886 335 322 1902 323 348 1889 349 317 320 1914 322 333 1902 324 130 310 359 358 1903 359 1922 92 359 1903 1922 325 1916 320 325 328 1916 337 1904 333 337 345 1904 348 361 1889 363 1907 358 363 367 1907 346 1909 345 327 340 1917 346 352 1909 362 1896 361 327 1917 328 368 374 1910 339 1918 340 368 1910 367 339 342 1918 351 182 1915 362 372 1896 351 1915 352 371 1906 372 376 168 1912 343 1919 342 343 171 1919 376 1912 374 371 214 1906 +37 36 1 1.59986714424437e-17 +-0.135378810567666 0.0655170218285604 -2.681887914871e-18 -0.135295633015408 0.0656610895751207 0.00190144754545289 -0.135048627666469 0.0660889153892243 0.00374512056941607 -0.134645299653386 0.0667875 0.005475 -0.134097903893742 0.0677356172675501 0.00703852432606761 -0.1334230727307 0.0689044591284707 0.00838818665215281 -0.132641310567666 0.0702585109142802 0.0094829781714396 -0.131776370852374 0.07175663044665 0.0102896341976057 -0.130854534340392 0.0733532981216742 0.0107836448954837 -0.129903810567666 0.075 0.01095 -0.128953086794939 0.0766467018783257 0.0107836448954837 -0.128031250282958 0.0782433695533499 0.0102896341976057 -0.127166310567666 0.0797414890857198 0.0094829781714396 -0.126384548404632 0.0810955408715293 0.00838818665215281 -0.125709717241589 0.0822643827324499 0.00703852432606761 -0.125162321481946 0.0832125 0.00547500000000001 -0.124758993468863 0.0839110846107756 0.00374512056941608 -0.124511988119924 0.0843389104248792 0.0019014475454529 -0.124428810567666 0.0844829781714396 1.59292745010101e-17 -0.124511988119924 0.0843389104248792 -0.00190144754545287 -0.124758993468863 0.0839110846107756 -0.00374512056941605 -0.125162321481946 0.0832125 -0.00547499999999998 -0.125709717241589 0.0822643827324499 -0.00703852432606759 -0.126384548404632 0.0810955408715293 -0.00838818665215279 -0.127166310567666 0.0797414890857198 -0.00948297817143959 -0.128031250282958 0.07824336955335 -0.0102896341976057 -0.128953086794939 0.0766467018783258 -0.0107836448954837 -0.129903810567666 0.075 -0.01095 -0.130854534340392 0.0733532981216743 -0.0107836448954837 -0.131776370852374 0.0717566304466501 -0.0102896341976057 -0.132641310567666 0.0702585109142802 -0.00948297817143962 -0.1334230727307 0.0689044591284707 -0.00838818665215284 -0.134097903893742 0.0677356172675501 -0.00703852432606764 -0.134645299653386 0.0667875 -0.00547500000000004 -0.135048627666469 0.0660889153892244 -0.00374512056941612 -0.135295633015408 0.0656610895751207 -0.00190144754545294 -0.129903810567666 0.075 0 0.01095 8.60585474410369e-19 0.0107836448954837 0.00190144754545289 0.0102896341976057 0.00374512056941607 0.00948297817143961 0.005475 0.00838818665215281 0.00703852432606761 0.0070385243260676 0.00838818665215281 0.005475 0.0094829781714396 0.00374512056941607 0.0102896341976057 0.00190144754545289 0.0107836448954837 5.19231196666886e-19 0.01095 -0.00190144754545289 0.0107836448954837 -0.00374512056941607 0.0102896341976057 -0.005475 0.0094829781714396 -0.0070385243260676 0.00838818665215281 -0.0083881866521528 0.00703852432606761 -0.0094829781714396 0.00547500000000001 -0.0102896341976057 0.00374512056941608 -0.0107836448954837 0.0019014475454529 -0.01095 1.64730967582016e-17 -0.0107836448954837 -0.00190144754545287 -0.0102896341976057 -0.00374512056941605 -0.00948297817143961 -0.00547499999999998 -0.00838818665215283 -0.00703852432606759 -0.00703852432606762 -0.00838818665215279 -0.00547500000000002 -0.00948297817143959 -0.0037451205694161 -0.0102896341976057 -0.00190144754545292 -0.0107836448954837 -3.07057913709156e-17 -0.01095 0.00190144754545285 -0.0107836448954837 0.00374512056941604 -0.0102896341976057 0.00547499999999997 -0.00948297817143962 0.00703852432606758 -0.00838818665215284 0.00838818665215278 -0.00703852432606764 0.00948297817143958 -0.00547500000000004 0.0102896341976057 -0.00374512056941612 0.0107836448954837 -0.00190144754545293 5.19231196666886e-19 8.60585474410369e-19 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 37 11 12 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 +403 717 1 0.000695573526461213 +0.0285134526101169 -0.0516525230498979 -0.877715450616494 -1.24909848089882e-17 -0.059 -0.971 0.0218689537628893 -0.0547973342071952 -0.873926714079115 0.0152432943309105 -0.0569968566883178 -0.871331307133653 0.00885408422920787 -0.0583318593736884 -0.869774450376816 0.00220533221989951 -0.0589587672676645 -0.869047706339065 -0.00452021703437581 -0.0588265763530881 -0.869200725542687 -0.0111222730604825 -0.057942178304755 -0.870227558960192 -0.0174212632071157 -0.0563693147096274 -0.872067759914168 -0.0232858016806991 -0.0542104365049165 -0.874626313499237 -0.0299133744109193 -0.0508545968961581 -0.878693946864086 -0.0364055526574153 -0.0464288249269798 -0.884283956254603 -0.0414604911606737 -0.0419765142239933 -0.890301047998437 -0.0454599405573964 -0.0376085023052696 -0.896883095205712 -0.048477768906044 -0.0336289431418361 -0.904159988127683 -0.0500125776174735 -0.0313008361062597 -0.910012892931646 -0.0507223820320063 -0.0301370159352354 -0.914685889739203 -0.0509929846912805 -0.0296768550886756 -0.919154017069977 -0.0508974922470173 -0.0298403260381806 -0.923231887915664 -0.0504793502812316 -0.0305424952164638 -0.927268264580091 -0.0495067029638172 -0.032094840909959 -0.932251274982488 -0.0478365171105765 -0.0345349752083268 -0.93768239459427 -0.0448299575819992 -0.0383572010050282 -0.944316145473221 -0.0404672041100315 -0.0429349454880199 -0.951038720348503 -0.0350437353916528 -0.0474651119056726 -0.957053162381158 -0.0280326393130683 -0.0519150376126295 -0.962604825208043 -0.021306012776011 -0.0550186720678838 -0.966336316913799 -0.0146841640586707 -0.0571434367699638 -0.96884027478942 -0.00800353134517232 -0.0584555058032915 -0.970369082432513 -0.00416203854328149 -0.058852336496355 -0.970829113665653 -1.24909848089882e-17 -0.059 -0.971 0.00637745658187731 -0.058654309018953 -0.970599683375865 0.0117874105676248 -0.0578105272001434 -0.969619119931822 0.0176689960460276 -0.0562921525018941 -0.967841471905639 0.0241008386445522 -0.0538530347922422 -0.964946071751388 0.0304430307465949 -0.0505393060003243 -0.960917241815508 0.0359655758325551 -0.0467704754890113 -0.956159057637936 0.0418706266966591 -0.0415674240281568 -0.94911788161083 0.0465956891649289 -0.0361917466377736 -0.940732602679552 0.0490639245669559 -0.0327678395054133 -0.933918738986464 0.0503181951744449 -0.030807129660349 -0.928311391809156 0.0508522668789505 -0.0299173353680219 -0.923879041668047 0.0509989666893943 -0.0296665701997348 -0.919675378553317 0.0507964095118238 -0.0300120774554979 -0.915447550387328 0.0502525012386535 -0.030914281417931 -0.911300614417913 0.0490754922156223 -0.0327504516820192 -0.906121929969831 0.0471720570893195 -0.0354371925332016 -0.900614516307052 0.0438194866264632 -0.0395076238297127 -0.893906851632219 0.0389820442404017 -0.0442876957323281 -0.887115352553105 0.0343171875743088 -0.0479930267907713 -0.882272945563165 -1.24909848089882e-17 -0.359 -0.971 -1.24909848089882e-17 -0.359 -0.971 0.00885605706101345 -0.359 -0.970225195403623 0.0174430273096091 -0.359 -0.967924323660081 0.0255 -0.359 -0.964167295593006 0.0327821680940135 -0.359 -0.959068266599068 0.0390682665990679 -0.359 -0.952782168094014 0.0441672955930064 -0.359 -0.9455 0.0479243236600813 -0.359 -0.937443027309609 0.0502251954036226 -0.359 -0.928856057061013 0.051 -0.359 -0.92 0.0502251954036226 -0.359 -0.911143942938987 0.0479243236600813 -0.359 -0.902556972690391 0.0441672955930064 -0.359 -0.8945 0.0390682665990679 -0.359 -0.887217831905987 0.0327821680940135 -0.359 -0.880931733400932 0.0255 -0.359 -0.875832704406994 0.0174430273096092 -0.359 -0.872075676339919 0.00885605706101351 -0.359 -0.869774804596377 7.41911415115537e-17 -0.359 -0.869 -0.00885605706101336 -0.359 -0.869774804596377 -0.017443027309609 -0.359 -0.872075676339919 -0.0254999999999999 -0.359 -0.875832704406994 -0.0327821680940134 -0.359 -0.880931733400932 -0.0390682665990678 -0.359 -0.887217831905986 -0.0441672955930063 -0.359 -0.8945 -0.0479243236600813 -0.359 -0.902556972690391 -0.0502251954036226 -0.359 -0.911143942938986 -0.051 -0.359 -0.92 -0.0502251954036226 -0.359 -0.928856057061013 -0.0479243236600814 -0.359 -0.937443027309609 -0.0441672955930065 -0.359 -0.9455 -0.039068266599068 -0.359 -0.952782168094013 -0.0327821680940137 -0.359 -0.959068266599068 -0.0255000000000002 -0.359 -0.964167295593006 -0.0174430273096093 -0.359 -0.967924323660081 -0.00885605706101367 -0.359 -0.970225195403623 0.0165596729294389 -0.34166666158946 -0.968236679326732 0.0508258091433402 -0.046999908610275 -0.915788453380911 0.0494394135629058 -0.046999908610275 -0.932519759844181 0.0494394135629058 -0.0643332470208152 -0.932519759844181 0.042695490391389 -0.0643332470208152 -0.947894356064244 0.042695490391389 -0.046999908610275 -0.947894356064244 0.0165596729294389 -0.324333323178919 -0.968236679326732 0.00839432410431743 -0.324333323178919 -0.869695573526461 0.0242733170448908 -0.306999984768379 -0.875146838688469 0.00839432410431743 -0.306999984768379 -0.869695573526461 -0.0165596729294389 -0.0643332470208152 -0.968236679326732 0.0494394135629058 -0.202999954305137 -0.932519759844181 0.042695490391389 -0.202999954305137 -0.947894356064244 0.042695490391389 -0.185666615894597 -0.947894356064244 0.0242733170448908 -0.324333323178919 -0.875146838688469 -0.0313248483471731 -0.0643332470208152 -0.960246165979216 0.0242733170448908 -0.34166666158946 -0.875146838688469 0.0375219194443297 -0.34166666158946 -0.885458639847087 0.042695490391389 -0.0816665854313555 -0.947894356064244 0.0313248483471731 -0.0643332470208152 -0.960246165979216 -0.0313248483471731 -0.0816665854313555 -0.960246165979216 -0.042695490391389 -0.0643332470208152 -0.947894356064244 0.0494394135629058 -0.185666615894597 -0.932519759844181 -0.042695490391389 -0.0816665854313555 -0.947894356064244 0.0375219194443297 -0.324333323178919 -0.885458639847087 0.042695490391389 -0.220333292715678 -0.947894356064244 0.0313248483471731 -0.202999954305137 -0.960246165979216 0.0313248483471731 -0.0816665854313555 -0.960246165979216 -0.0165596729294389 -0.185666615894597 -0.968236679326732 -0.0165596729294389 -0.168333277484057 -0.968236679326732 0.0313248483471731 -0.220333292715678 -0.960246165979216 -0.0313248483471731 -0.185666615894597 -0.960246165979216 -0.0313248483471731 -0.168333277484057 -0.960246165979216 0.0313248483471731 -0.0989999238418958 -0.960246165979216 0.0165596729294389 -0.0816665854313555 -0.968236679326732 -0.042695490391389 -0.0989999238418958 -0.947894356064244 -0.0494394135629059 -0.0989999238418958 -0.932519759844181 -0.0494394135629059 -0.0816665854313555 -0.932519759844181 0.0165596729294389 -0.0989999238418958 -0.968236679326732 -0.0313248483471731 -0.202999954305137 -0.960246165979216 -0.042695490391389 -0.185666615894597 -0.947894356064244 -0.042695490391389 -0.202999954305137 -0.947894356064244 0.0313248483471731 -0.237666631126218 -0.960246165979216 0.0165596729294389 -0.220333292715678 -0.968236679326732 -0.0494394135629059 -0.116333262252436 -0.932519759844181 -0.0508258091433402 -0.0989999238418958 -0.915788453380911 -0.0508258091433402 -0.116333262252436 -0.915788453380911 -0.0508258091433402 -0.133666600662976 -0.915788453380911 -0.0467044396594079 -0.133666600662976 -0.899513533342699 -0.0467044396594079 -0.116333262252436 -0.899513533342699 -0.042695490391389 -0.220333292715678 -0.947894356064244 -0.0494394135629059 -0.220333292715678 -0.932519759844181 -0.0494394135629059 -0.202999954305137 -0.932519759844181 0.0165596729294389 -0.237666631126218 -0.968236679326732 0.0165596729294389 -0.254999969536758 -0.968236679326732 -0.0494394135629059 -0.237666631126218 -0.932519759844181 -0.0508258091433402 -0.220333292715678 -0.915788453380911 -0.0467044396594079 -0.150999939073517 -0.899513533342699 -0.0375219194443297 -0.133666600662976 -0.885458639847087 0.0165596729294389 -0.116333262252436 -0.968236679326732 -0.0375219194443297 -0.150999939073517 -0.885458639847087 -0.0508258091433402 -0.046999908610275 -0.915788453380911 -0.0508258091433402 -0.237666631126218 -0.915788453380911 -0.0508258091433402 -0.254999969536758 -0.915788453380911 -0.0467044396594079 -0.237666631126218 -0.899513533342699 -0.0467044396594079 -0.254999969536758 -0.899513533342699 0.0467044396594079 -0.046999908610275 -0.899513533342699 -0.0467044396594079 -0.046999908610275 -0.899513533342699 -0.0375219194443297 -0.168333277484057 -0.885458639847087 -0.0242733170448907 -0.150999939073517 -0.875146838688469 -0.0242733170448907 -0.168333277484057 -0.875146838688469 -0.0467044396594079 -0.272333307947299 -0.899513533342699 -0.0375219194443297 -0.272333307947299 -0.885458639847087 -0.0375219194443297 -0.254999969536758 -0.885458639847087 -0.0467044396594079 -0.0643332470208152 -0.899513533342699 -0.0375219194443297 -0.046999908610275 -0.885458639847087 -0.0375219194443297 -0.0643332470208152 -0.885458639847087 0.0508258091433402 -0.0643332470208152 -0.915788453380911 -0.0375219194443297 -0.289666646357839 -0.885458639847087 -0.0242733170448907 -0.289666646357839 -0.875146838688469 -0.0242733170448907 -0.272333307947299 -0.875146838688469 -0.0242733170448907 -0.185666615894597 -0.875146838688469 -0.00839432410431742 -0.168333277484057 -0.869695573526461 -0.0375219194443297 -0.0816665854313555 -0.885458639847087 -0.0242733170448907 -0.0816665854313555 -0.875146838688469 -0.0242733170448907 -0.0643332470208152 -0.875146838688469 -0.00839432410431742 -0.185666615894597 -0.869695573526461 0.0494394135629058 -0.0816665854313555 -0.932519759844181 -0.0242733170448907 -0.306999984768379 -0.875146838688469 -0.00839432410431742 -0.306999984768379 -0.869695573526461 -0.00839432410431742 -0.289666646357839 -0.869695573526461 -0.0242733170448907 -0.0989999238418958 -0.875146838688469 -0.00839432410431742 -0.0816665854313555 -0.869695573526461 -0.00839432410431742 -0.0989999238418958 -0.869695573526461 0.042695490391389 -0.0989999238418958 -0.947894356064244 -0.00839432410431742 -0.202999954305137 -0.869695573526461 0.00839432410431743 -0.202999954305137 -0.869695573526461 0.00839432410431743 -0.185666615894597 -0.869695573526461 -0.00839432410431742 -0.324333323178919 -0.869695573526461 0.00839432410431743 -0.220333292715678 -0.869695573526461 0.0242733170448908 -0.202999954305137 -0.875146838688469 0.0313248483471731 -0.116333262252436 -0.960246165979216 -0.00839432410431742 -0.116333262252436 -0.869695573526461 0.00839432410431743 -0.0989999238418958 -0.869695573526461 0.00839432410431743 -0.34166666158946 -0.869695573526461 0.0242733170448908 -0.220333292715678 -0.875146838688469 0.00839432410431743 -0.116333262252436 -0.869695573526461 0.0242733170448908 -0.237666631126218 -0.875146838688469 0.0375219194443297 -0.237666631126218 -0.885458639847087 0.0375219194443297 -0.220333292715678 -0.885458639847087 -0.0165596729294389 -0.202999954305137 -0.968236679326732 0.00839432410431743 -0.133666600662976 -0.869695573526461 0.0242733170448908 -0.133666600662976 -0.875146838688469 0.0242733170448908 -0.116333262252436 -0.875146838688469 -0.0313248483471731 -0.220333292715678 -0.960246165979216 0.0375219194443297 -0.254999969536758 -0.885458639847087 0.0467044396594079 -0.237666631126218 -0.899513533342699 0.0467044396594079 -0.254999969536758 -0.899513533342699 -0.042695490391389 -0.237666631126218 -0.947894356064244 0.0242733170448908 -0.150999939073517 -0.875146838688469 0.0375219194443297 -0.150999939073517 -0.885458639847087 0.0375219194443297 -0.133666600662976 -0.885458639847087 0.0467044396594079 -0.272333307947299 -0.899513533342699 0.0508258091433402 -0.254999969536758 -0.915788453380911 0.0165596729294389 -0.133666600662976 -0.968236679326732 -0.0494394135629059 -0.254999969536758 -0.932519759844181 0.0375219194443297 -0.046999908610275 -0.885458639847087 0.0508258091433402 -0.272333307947299 -0.915788453380911 0.0508258091433402 -0.289666646357839 -0.915788453380911 0.0494394135629058 -0.272333307947299 -0.932519759844181 0.0375219194443297 -0.168333277484057 -0.885458639847087 0.0467044396594079 -0.150999939073517 -0.899513533342699 0.0467044396594079 -0.0643332470208152 -0.899513533342699 -0.0508258091433402 -0.272333307947299 -0.915788453380911 0.0494394135629058 -0.289666646357839 -0.932519759844181 0.0508258091433402 -0.0816665854313555 -0.915788453380911 0.0494394135629058 -0.306999984768379 -0.932519759844181 0.042695490391389 -0.306999984768379 -0.947894356064244 0.042695490391389 -0.289666646357839 -0.947894356064244 0.0467044396594079 -0.168333277484057 -0.899513533342699 -0.0467044396594079 -0.289666646357839 -0.899513533342699 0.0467044396594079 -0.185666615894597 -0.899513533342699 0.0508258091433402 -0.185666615894597 -0.915788453380911 0.0508258091433402 -0.168333277484057 -0.915788453380911 0.0494394135629058 -0.0989999238418958 -0.932519759844181 0.042695490391389 -0.324333323178919 -0.947894356064244 0.0313248483471731 -0.324333323178919 -0.960246165979216 0.0313248483471731 -0.306999984768379 -0.960246165979216 0.0508258091433402 -0.202999954305137 -0.915788453380911 -0.0375219194443297 -0.306999984768379 -0.885458639847087 0.0313248483471731 -0.34166666158946 -0.960246165979216 0.042695490391389 -0.116333262252436 -0.947894356064244 -0.0242733170448907 -0.324333323178919 -0.875146838688469 -0.0165596729294389 -0.0816665854313555 -0.968236679326732 0.0494394135629058 -0.220333292715678 -0.932519759844181 -0.00839432410431742 -0.34166666158946 -0.869695573526461 -0.0313248483471731 -0.0989999238418958 -0.960246165979216 0.0313248483471731 -0.133666600662976 -0.960246165979216 0.042695490391389 -0.237666631126218 -0.947894356064244 -0.0165596729294389 -0.220333292715678 -0.968236679326732 -0.042695490391389 -0.116333262252436 -0.947894356064244 -0.0313248483471731 -0.237666631126218 -0.960246165979216 -0.0494394135629059 -0.133666600662976 -0.932519759844181 0.0313248483471731 -0.254999969536758 -0.960246165979216 -0.042695490391389 -0.254999969536758 -0.947894356064244 0.0165596729294389 -0.150999939073517 -0.968236679326732 -0.0508258091433402 -0.150999939073517 -0.915788453380911 -0.0494394135629059 -0.272333307947299 -0.932519759844181 -0.0467044396594079 -0.168333277484057 -0.899513533342699 0.0165596729294389 -0.272333307947299 -0.968236679326732 0.0375219194443297 -0.0643332470208152 -0.885458639847087 -0.0494394135629059 -0.046999908610275 -0.932519759844181 -0.0508258091433402 -0.289666646357839 -0.915788453380911 -0.0508258091433402 -0.0643332470208152 -0.915788453380911 -0.0375219194443297 -0.185666615894597 -0.885458639847087 -0.0467044396594079 -0.306999984768379 -0.899513533342699 0.0467044396594079 -0.0816665854313555 -0.899513533342699 -0.0467044396594079 -0.0816665854313555 -0.899513533342699 -0.0375219194443297 -0.324333323178919 -0.885458639847087 0.0508258091433402 -0.0989999238418958 -0.915788453380911 -0.0242733170448907 -0.202999954305137 -0.875146838688469 -0.0242733170448907 -0.34166666158946 -0.875146838688469 -0.0375219194443297 -0.0989999238418958 -0.885458639847087 -0.0165596729294389 -0.237666631126218 -0.968236679326732 0.0494394135629058 -0.116333262252436 -0.932519759844181 -0.00839432410431742 -0.220333292715678 -0.869695573526461 -0.0313248483471731 -0.254999969536758 -0.960246165979216 0.00839432410431743 -0.237666631126218 -0.869695573526461 -0.0242733170448907 -0.116333262252436 -0.875146838688469 0.042695490391389 -0.133666600662976 -0.947894356064244 0.0242733170448908 -0.254999969536758 -0.875146838688469 -0.042695490391389 -0.272333307947299 -0.947894356064244 -0.00839432410431742 -0.133666600662976 -0.869695573526461 0.0313248483471731 -0.150999939073517 -0.960246165979216 -0.0494394135629059 -0.289666646357839 -0.932519759844181 0.0375219194443297 -0.272333307947299 -0.885458639847087 -0.0508258091433402 -0.306999984768379 -0.915788453380911 0.00839432410431743 -0.150999939073517 -0.869695573526461 0.0165596729294389 -0.168333277484057 -0.968236679326732 0.0467044396594079 -0.289666646357839 -0.899513533342699 0.0242733170448908 -0.168333277484057 -0.875146838688469 -0.0467044396594079 -0.324333323178919 -0.899513533342699 -0.0375219194443297 -0.34166666158946 -0.885458639847087 0.0242733170448908 -0.0643332470208152 -0.875146838688469 0.0508258091433402 -0.306999984768379 -0.915788453380911 -0.0165596729294389 -0.254999969536758 -0.968236679326732 0.0494394135629058 -0.324333323178919 -0.932519759844181 0.0375219194443297 -0.0816665854313555 -0.885458639847087 0.0375219194443297 -0.185666615894597 -0.885458639847087 -0.0313248483471731 -0.272333307947299 -0.960246165979216 0.042695490391389 -0.34166666158946 -0.947894356064244 -0.042695490391389 -0.289666646357839 -0.947894356064244 0.0467044396594079 -0.202999954305137 -0.899513533342699 -0.0165596729294389 -0.0989999238418958 -0.968236679326732 0.0467044396594079 -0.0989999238418958 -0.899513533342699 -0.0313248483471731 -0.116333262252436 -0.960246165979216 -0.0494394135629059 -0.306999984768379 -0.932519759844181 0.0508258091433402 -0.220333292715678 -0.915788453380911 -0.042695490391389 -0.133666600662976 -0.947894356064244 0.0508258091433402 -0.116333262252436 -0.915788453380911 -0.0508258091433402 -0.324333323178919 -0.915788453380911 -0.0494394135629059 -0.150999939073517 -0.932519759844181 0.0494394135629058 -0.237666631126218 -0.932519759844181 -0.0467044396594079 -0.34166666158946 -0.899513533342699 -0.0508258091433402 -0.168333277484057 -0.915788453380911 0.042695490391389 -0.254999969536758 -0.947894356064244 -0.0165596729294389 -0.272333307947299 -0.968236679326732 0.0494394135629058 -0.133666600662976 -0.932519759844181 -0.0313248483471731 -0.289666646357839 -0.960246165979216 -0.0467044396594079 -0.185666615894597 -0.899513533342699 0.0313248483471731 -0.272333307947299 -0.960246165979216 -0.042695490391389 -0.306999984768379 -0.947894356064244 0.042695490391389 -0.150999939073517 -0.947894356064244 0.0165596729294389 -0.289666646357839 -0.968236679326732 -0.0375219194443297 -0.202999954305137 -0.885458639847087 0.0313248483471731 -0.168333277484057 -0.960246165979216 -0.0494394135629059 -0.324333323178919 -0.932519759844181 -0.042695490391389 -0.046999908610275 -0.947894356064244 -0.0508258091433402 -0.34166666158946 -0.915788453380911 -0.0242733170448907 -0.220333292715678 -0.875146838688469 0.0165596729294389 -0.185666615894597 -0.968236679326732 -0.0494394135629059 -0.0643332470208152 -0.932519759844181 -0.0165596729294389 -0.289666646357839 -0.968236679326732 -0.00839432410431742 -0.237666631126218 -0.869695573526461 -0.0313248483471731 -0.306999984768379 -0.960246165979216 -0.0508258091433402 -0.0816665854313555 -0.915788453380911 0.00839432410431743 -0.0643332470208152 -0.869695573526461 -0.042695490391389 -0.324333323178919 -0.947894356064244 0.00839432410431743 -0.254999969536758 -0.869695573526461 -0.0467044396594079 -0.0989999238418958 -0.899513533342699 0.0242733170448908 -0.0816665854313555 -0.875146838688469 -0.0494394135629059 -0.34166666158946 -0.932519759844181 -0.0165596729294389 -0.306999984768379 -0.968236679326732 0.0375219194443297 -0.0989999238418958 -0.885458639847087 0.0242733170448908 -0.272333307947299 -0.875146838688469 -0.0375219194443297 -0.116333262252436 -0.885458639847087 0.0375219194443297 -0.289666646357839 -0.885458639847087 -0.0313248483471731 -0.324333323178919 -0.960246165979216 -0.0242733170448907 -0.133666600662976 -0.875146838688469 -0.042695490391389 -0.34166666158946 -0.947894356064244 0.0467044396594079 -0.306999984768379 -0.899513533342699 0.0467044396594079 -0.116333262252436 -0.899513533342699 -0.0165596729294389 -0.324333323178919 -0.968236679326732 0.0508258091433402 -0.324333323178919 -0.915788453380911 -0.00839432410431742 -0.150999939073517 -0.869695573526461 0.0508258091433402 -0.133666600662976 -0.915788453380911 -0.0313248483471731 -0.34166666158946 -0.960246165979216 0.0494394135629058 -0.34166666158946 -0.932519759844181 -0.0165596729294389 -0.34166666158946 -0.968236679326732 -0.0165596729294389 -0.116333262252436 -0.968236679326732 0.00839432410431743 -0.168333277484057 -0.869695573526461 0.0494394135629058 -0.150999939073517 -0.932519759844181 -0.0313248483471731 -0.133666600662976 -0.960246165979216 -0.042695490391389 -0.150999939073517 -0.947894356064244 0.0242733170448908 -0.185666615894597 -0.875146838688469 0.042695490391389 -0.168333277484057 -0.947894356064244 -0.0494394135629059 -0.168333277484057 -0.932519759844181 0.0375219194443297 -0.202999954305137 -0.885458639847087 -0.0508258091433402 -0.185666615894597 -0.915788453380911 0.0467044396594079 -0.220333292715678 -0.899513533342699 0.0313248483471731 -0.185666615894597 -0.960246165979216 0.0165596729294389 -0.202999954305137 -0.968236679326732 -0.0467044396594079 -0.202999954305137 -0.899513533342699 0.0508258091433402 -0.237666631126218 -0.915788453380911 -0.0375219194443297 -0.220333292715678 -0.885458639847087 -0.00839432410431742 -0.0643332470208152 -0.869695573526461 0.0494394135629058 -0.254999969536758 -0.932519759844181 -0.0242733170448907 -0.237666631126218 -0.875146838688469 0.042695490391389 -0.272333307947299 -0.947894356064244 0.00839432410431743 -0.0816665854313555 -0.869695573526461 -0.00839432410431742 -0.254999969536758 -0.869695573526461 0.0313248483471731 -0.289666646357839 -0.960246165979216 0.0165596729294389 -0.306999984768379 -0.968236679326732 0.0242733170448908 -0.0989999238418958 -0.875146838688469 0.00839432410431743 -0.272333307947299 -0.869695573526461 0.0375219194443297 -0.116333262252436 -0.885458639847087 0.0242733170448908 -0.289666646357839 -0.875146838688469 0.0467044396594079 -0.133666600662976 -0.899513533342699 0.0375219194443297 -0.306999984768379 -0.885458639847087 0.0467044396594079 -0.324333323178919 -0.899513533342699 0.0508258091433402 -0.150999939073517 -0.915788453380911 0.0508258091433402 -0.34166666158946 -0.915788453380911 -0.0165596729294389 -0.133666600662976 -0.968236679326732 0.0494394135629058 -0.168333277484057 -0.932519759844181 -0.0313248483471731 -0.150999939073517 -0.960246165979216 -0.042695490391389 -0.168333277484057 -0.947894356064244 -0.0494394135629059 -0.185666615894597 -0.932519759844181 -0.0508258091433402 -0.202999954305137 -0.915788453380911 -0.0467044396594079 -0.220333292715678 -0.899513533342699 -0.0375219194443297 -0.237666631126218 -0.885458639847087 -0.0242733170448907 -0.254999969536758 -0.875146838688469 -0.00839432410431742 -0.272333307947299 -0.869695573526461 0.00839432410431743 -0.289666646357839 -0.869695573526461 0.0467044396594079 -0.34166666158946 -0.899513533342699 -0.0165596729294389 -0.150999939073517 -0.968236679326732 0.0165596729294389 -0.0643332470208152 -0.968236679326732 2.5483080791105 0.0516525230498979 6.28318530717959 0.059 2.69842514541459 0.0547973342071952 2.83806535412409 0.0569968566883178 2.96709899005554 0.0583318593736884 3.09833736888163 0.0589587672676645 3.23034036002918 0.0588265763530881 3.36144350654417 0.057942178304755 3.4902044063814 0.0563693147096274 3.61574486072379 0.0542104365049165 3.76836881833325 0.0508545968961581 3.93655089681558 0.0464288249269798 4.09079420129765 0.0419765142239933 4.24195603391166 0.0376085023052696 4.39657691325956 0.0336289431418361 4.51528964610026 0.0313008361062597 4.60800128352614 0.0301370159352354 4.69580029810189 0.0296768550886756 4.77580184417805 0.0298403260381806 4.85539095216929 0.0305424952164638 4.95498241065549 0.032094840909959 5.06645453412493 0.0345349752083268 5.20938503250915 0.0383572010050282 5.36668691983052 0.0429349454880199 5.52565110790293 0.0474651119056726 5.70122860570006 0.0519150376126296 5.85220139658127 0.0550186720678838 5.99112609172523 0.0571434367699638 6.12560313624305 0.0584555058032915 6.20148513995915 0.058852336496355 0 0.059 0.125376369506014 0.058654309018953 0.233234562744136 0.0578105272001434 0.353785015517849 0.0562921525018941 0.492199498877033 0.0538530347922422 0.639659618740747 0.0505393060003243 0.782715562444035 0.0467704754890113 0.963147414232909 0.0415674240281568 1.15215275308634 0.0361917466377736 1.29437305861398 0.0327678395054134 1.40709772732558 0.0308071296603489 1.49466315943586 0.029917335368022 1.5771614966377 0.0296665701997347 1.66017901357556 0.030012077455498 1.742210925639 0.0309142814179309 1.84639061320153 0.0327504516820192 1.96070913177636 0.0354371925332016 2.10787762194113 0.0395076238297126 2.2715540635553 0.0442876957323281 2.40348937682447 0.0479930267907713 0 0.359 6.28318530717959 0.359 0.174532925199433 0.359 0.349065850398866 0.359 0.523598775598299 0.359 0.698131700797732 0.359 0.872664625997165 0.359 1.0471975511966 0.359 1.22173047639603 0.359 1.39626340159546 0.359 1.5707963267949 0.359 1.74532925199433 0.359 1.91986217719376 0.359 2.0943951023932 0.359 2.26892802759263 0.359 2.44346095279206 0.359 2.61799387799149 0.359 2.79252680319093 0.359 2.96705972839036 0.359 3.14159265358979 0.359 3.31612557878922 0.359 3.49065850398866 0.359 3.66519142918809 0.359 3.83972435438752 0.359 4.01425727958696 0.359 4.18879020478639 0.359 4.36332312998582 0.359 4.53785605518525 0.359 4.71238898038469 0.359 4.88692190558412 0.359 5.06145483078355 0.359 5.23598775598299 0.359 5.41052068118242 0.359 5.58505360638185 0.359 5.75958653158128 0.359 5.93411945678072 0.359 6.10865238198015 0.359 0.330693963535768 0.34166666158946 1.65346981767884 0.046999908610275 1.32277585414307 0.046999908610275 1.32277585414307 0.0643332470208152 0.992081890607303 0.0643332470208152 0.992081890607303 0.046999908610275 0.330693963535768 0.324333323178919 2.97624567182191 0.324333323178919 2.64555170828614 0.306999984768379 2.97624567182191 0.306999984768379 5.95249134364382 0.0643332470208152 1.32277585414307 0.202999954305137 0.992081890607303 0.202999954305137 0.992081890607303 0.185666615894597 2.64555170828614 0.324333323178919 5.62179738010805 0.0643332470208152 2.64555170828614 0.34166666158946 2.31485774475037 0.34166666158946 0.992081890607303 0.0816665854313555 0.661387927071535 0.0643332470208152 5.62179738010805 0.0816665854313555 5.29110341657228 0.0643332470208152 1.32277585414307 0.185666615894597 5.29110341657228 0.0816665854313555 2.31485774475037 0.324333323178919 0.992081890607303 0.220333292715678 0.661387927071535 0.202999954305137 0.661387927071535 0.0816665854313555 5.95249134364382 0.185666615894597 5.95249134364382 0.168333277484057 0.661387927071535 0.220333292715678 5.62179738010805 0.185666615894597 5.62179738010805 0.168333277484057 0.661387927071535 0.0989999238418958 0.330693963535768 0.0816665854313555 5.29110341657228 0.0989999238418958 4.96040945303652 0.0989999238418958 4.96040945303652 0.0816665854313555 0.330693963535768 0.0989999238418958 5.62179738010805 0.202999954305137 5.29110341657228 0.185666615894597 5.29110341657228 0.202999954305137 0.661387927071535 0.237666631126218 0.330693963535768 0.220333292715678 4.96040945303652 0.116333262252436 4.62971548950075 0.0989999238418958 4.62971548950075 0.116333262252436 4.62971548950075 0.133666600662976 4.29902152596498 0.133666600662976 4.29902152596498 0.116333262252436 5.29110341657228 0.220333292715678 4.96040945303652 0.220333292715678 4.96040945303652 0.202999954305137 0.330693963535768 0.237666631126218 0.330693963535768 0.254999969536758 4.96040945303652 0.237666631126218 4.62971548950075 0.220333292715678 4.29902152596498 0.150999939073517 3.96832756242921 0.133666600662976 0.330693963535768 0.116333262252436 3.96832756242921 0.150999939073517 4.62971548950075 0.046999908610275 4.62971548950075 0.237666631126218 4.62971548950075 0.254999969536758 4.29902152596498 0.237666631126218 4.29902152596498 0.254999969536758 1.98416378121461 0.046999908610275 4.29902152596498 0.046999908610275 3.96832756242921 0.168333277484057 3.63763359889344 0.150999939073517 3.63763359889344 0.168333277484057 4.29902152596498 0.272333307947299 3.96832756242921 0.272333307947299 3.96832756242921 0.254999969536758 4.29902152596498 0.0643332470208152 3.96832756242921 0.046999908610275 3.96832756242921 0.0643332470208152 1.65346981767884 0.0643332470208152 3.96832756242921 0.289666646357839 3.63763359889344 0.289666646357839 3.63763359889344 0.272333307947299 3.63763359889344 0.185666615894597 3.30693963535768 0.168333277484057 3.96832756242921 0.0816665854313555 3.63763359889344 0.0816665854313555 3.63763359889344 0.0643332470208152 3.30693963535768 0.185666615894597 1.32277585414307 0.0816665854313555 3.63763359889344 0.306999984768379 3.30693963535768 0.306999984768379 3.30693963535768 0.289666646357839 3.63763359889344 0.0989999238418958 3.30693963535768 0.0816665854313555 3.30693963535768 0.0989999238418958 0.992081890607303 0.0989999238418958 3.30693963535768 0.202999954305137 2.97624567182191 0.202999954305137 2.97624567182191 0.185666615894597 3.30693963535768 0.324333323178919 2.97624567182191 0.220333292715678 2.64555170828614 0.202999954305137 0.661387927071535 0.116333262252436 3.30693963535768 0.116333262252436 2.97624567182191 0.0989999238418958 2.97624567182191 0.34166666158946 2.64555170828614 0.220333292715678 2.97624567182191 0.116333262252436 2.64555170828614 0.237666631126218 2.31485774475037 0.237666631126218 2.31485774475037 0.220333292715678 5.95249134364382 0.202999954305137 2.97624567182191 0.133666600662976 2.64555170828614 0.133666600662976 2.64555170828614 0.116333262252436 5.62179738010805 0.220333292715678 2.31485774475037 0.254999969536758 1.98416378121461 0.237666631126218 1.98416378121461 0.254999969536758 5.29110341657228 0.237666631126218 2.64555170828614 0.150999939073517 2.31485774475037 0.150999939073517 2.31485774475037 0.133666600662976 1.98416378121461 0.272333307947299 1.65346981767884 0.254999969536758 0.330693963535768 0.133666600662976 4.96040945303652 0.254999969536758 2.31485774475037 0.046999908610275 1.65346981767884 0.272333307947299 1.65346981767884 0.289666646357839 1.32277585414307 0.272333307947299 2.31485774475037 0.168333277484057 1.98416378121461 0.150999939073517 1.98416378121461 0.0643332470208152 4.62971548950075 0.272333307947299 1.32277585414307 0.289666646357839 1.65346981767884 0.0816665854313555 1.32277585414307 0.306999984768379 0.992081890607303 0.306999984768379 0.992081890607303 0.289666646357839 1.98416378121461 0.168333277484057 4.29902152596498 0.289666646357839 1.98416378121461 0.185666615894597 1.65346981767884 0.185666615894597 1.65346981767884 0.168333277484057 1.32277585414307 0.0989999238418958 0.992081890607303 0.324333323178919 0.661387927071535 0.324333323178919 0.661387927071535 0.306999984768379 1.65346981767884 0.202999954305137 3.96832756242921 0.306999984768379 0.661387927071535 0.34166666158946 0.992081890607303 0.116333262252436 3.63763359889344 0.324333323178919 5.95249134364382 0.0816665854313555 1.32277585414307 0.220333292715678 3.30693963535768 0.34166666158946 5.62179738010805 0.0989999238418958 0.661387927071535 0.133666600662976 0.992081890607303 0.237666631126218 5.95249134364382 0.220333292715678 5.29110341657228 0.116333262252436 5.62179738010805 0.237666631126218 4.96040945303652 0.133666600662976 0.661387927071535 0.254999969536758 5.29110341657228 0.254999969536758 0.330693963535768 0.150999939073517 4.62971548950075 0.150999939073517 4.96040945303652 0.272333307947299 4.29902152596498 0.168333277484057 0.330693963535768 0.272333307947299 2.31485774475037 0.0643332470208152 4.96040945303652 0.046999908610275 4.62971548950075 0.289666646357839 4.62971548950075 0.0643332470208152 3.96832756242921 0.185666615894597 4.29902152596498 0.306999984768379 1.98416378121461 0.0816665854313555 4.29902152596498 0.0816665854313555 3.96832756242921 0.324333323178919 1.65346981767884 0.0989999238418958 3.63763359889344 0.202999954305137 3.63763359889344 0.34166666158946 3.96832756242921 0.0989999238418958 5.95249134364382 0.237666631126218 1.32277585414307 0.116333262252436 3.30693963535768 0.220333292715678 5.62179738010805 0.254999969536758 2.97624567182191 0.237666631126218 3.63763359889344 0.116333262252436 0.992081890607303 0.133666600662976 2.64555170828614 0.254999969536758 5.29110341657228 0.272333307947299 3.30693963535768 0.133666600662976 0.661387927071535 0.150999939073517 4.96040945303652 0.289666646357839 2.31485774475037 0.272333307947299 4.62971548950075 0.306999984768379 2.97624567182191 0.150999939073517 0.330693963535768 0.168333277484057 1.98416378121461 0.289666646357839 2.64555170828614 0.168333277484057 4.29902152596498 0.324333323178919 3.96832756242921 0.34166666158946 2.64555170828614 0.0643332470208152 1.65346981767884 0.306999984768379 5.95249134364382 0.254999969536758 1.32277585414307 0.324333323178919 2.31485774475037 0.0816665854313555 2.31485774475037 0.185666615894597 5.62179738010805 0.272333307947299 0.992081890607303 0.34166666158946 5.29110341657228 0.289666646357839 1.98416378121461 0.202999954305137 5.95249134364382 0.0989999238418958 1.98416378121461 0.0989999238418958 5.62179738010805 0.116333262252436 4.96040945303652 0.306999984768379 1.65346981767884 0.220333292715678 5.29110341657228 0.133666600662976 1.65346981767884 0.116333262252436 4.62971548950075 0.324333323178919 4.96040945303652 0.150999939073517 1.32277585414307 0.237666631126218 4.29902152596498 0.34166666158946 4.62971548950075 0.168333277484057 0.992081890607303 0.254999969536758 5.95249134364382 0.272333307947299 1.32277585414307 0.133666600662976 5.62179738010805 0.289666646357839 4.29902152596498 0.185666615894597 0.661387927071535 0.272333307947299 5.29110341657228 0.306999984768379 0.992081890607303 0.150999939073517 0.330693963535768 0.289666646357839 3.96832756242921 0.202999954305137 0.661387927071535 0.168333277484057 4.96040945303652 0.324333323178919 5.29110341657228 0.046999908610275 4.62971548950075 0.34166666158946 3.63763359889344 0.220333292715678 0.330693963535768 0.185666615894597 4.96040945303652 0.0643332470208152 5.95249134364382 0.289666646357839 3.30693963535768 0.237666631126218 5.62179738010805 0.306999984768379 4.62971548950075 0.0816665854313555 2.97624567182191 0.0643332470208152 5.29110341657228 0.324333323178919 2.97624567182191 0.254999969536758 4.29902152596498 0.0989999238418958 2.64555170828614 0.0816665854313555 4.96040945303652 0.34166666158946 5.95249134364382 0.306999984768379 2.31485774475037 0.0989999238418958 2.64555170828614 0.272333307947299 3.96832756242921 0.116333262252436 2.31485774475037 0.289666646357839 5.62179738010805 0.324333323178919 3.63763359889344 0.133666600662976 5.29110341657228 0.34166666158946 1.98416378121461 0.306999984768379 1.98416378121461 0.116333262252436 5.95249134364382 0.324333323178919 1.65346981767884 0.324333323178919 3.30693963535768 0.150999939073517 1.65346981767884 0.133666600662976 5.62179738010805 0.34166666158946 1.32277585414307 0.34166666158946 5.95249134364382 0.34166666158946 5.95249134364382 0.116333262252436 2.97624567182191 0.168333277484057 1.32277585414307 0.150999939073517 5.62179738010805 0.133666600662976 5.29110341657228 0.150999939073517 2.64555170828614 0.185666615894597 0.992081890607303 0.168333277484057 4.96040945303652 0.168333277484057 2.31485774475037 0.202999954305137 4.62971548950075 0.185666615894597 1.98416378121461 0.220333292715678 0.661387927071535 0.185666615894597 0.330693963535768 0.202999954305137 4.29902152596498 0.202999954305137 1.65346981767884 0.237666631126218 3.96832756242921 0.220333292715678 3.30693963535768 0.0643332470208152 1.32277585414307 0.254999969536758 3.63763359889344 0.237666631126218 0.992081890607303 0.272333307947299 2.97624567182191 0.0816665854313555 3.30693963535768 0.254999969536758 0.661387927071535 0.289666646357839 0.330693963535768 0.306999984768379 2.64555170828614 0.0989999238418958 2.97624567182191 0.272333307947299 2.31485774475037 0.116333262252436 2.64555170828614 0.289666646357839 1.98416378121461 0.133666600662976 2.31485774475037 0.306999984768379 1.98416378121461 0.324333323178919 1.65346981767884 0.150999939073517 1.65346981767884 0.34166666158946 5.95249134364382 0.133666600662976 1.32277585414307 0.168333277484057 5.62179738010805 0.150999939073517 5.29110341657228 0.168333277484057 4.96040945303652 0.185666615894597 4.62971548950075 0.202999954305137 4.29902152596498 0.220333292715678 3.96832756242921 0.237666631126218 3.63763359889344 0.254999969536758 3.30693963535768 0.272333307947299 2.97624567182191 0.289666646357839 1.98416378121461 0.34166666158946 5.95249134364382 0.150999939073517 0.330693963535768 0.0643332470208152 88 53 51 89 90 41 88 54 53 88 55 54 91 92 93 88 51 94 91 93 90 95 96 97 98 27 28 99 100 101 98 28 29 98 29 30 95 102 96 98 103 27 104 66 105 106 107 92 108 109 103 104 67 66 99 101 110 104 68 67 108 111 109 104 112 102 113 114 100 104 105 112 106 115 107 116 117 2 113 118 114 116 119 120 121 122 115 116 120 117 123 124 125 123 125 111 121 126 122 127 128 119 127 129 128 130 131 118 132 133 124 132 134 133 135 136 137 138 139 140 130 141 131 138 140 129 142 51 141 135 137 134 143 144 139 145 146 136 147 31 126 145 148 146 149 15 16 143 150 144 149 16 17 149 17 18 151 152 150 149 18 19 149 19 20 151 153 152 154 46 47 154 47 48 154 48 49 149 155 15 156 157 148 154 89 46 156 158 157 159 160 161 162 163 155 162 164 163 165 90 89 165 91 90 159 161 153 166 167 168 169 170 158 171 172 173 169 174 170 175 106 92 171 173 164 166 168 160 176 177 178 176 178 167 175 92 91 179 180 172 179 181 180 182 115 106 183 184 185 186 97 177 183 185 174 186 95 97 187 188 184 182 121 115 189 126 121 190 191 181 192 104 102 192 102 95 192 68 104 192 69 68 187 193 188 192 70 69 190 194 191 195 196 197 198 116 2 198 119 116 195 197 193 198 2 52 198 127 119 199 200 201 202 129 127 189 147 126 199 201 194 202 138 129 203 204 196 203 205 204 206 143 139 206 139 138 207 208 209 210 211 205 212 31 147 213 151 150 214 49 50 213 150 143 214 154 49 207 209 200 210 215 211 216 217 215 218 219 208 220 165 89 221 153 151 220 89 154 216 222 217 223 175 91 224 225 226 218 227 219 223 91 165 221 159 153 228 160 159 228 166 160 229 230 231 224 226 222 232 106 175 233 234 235 229 231 227 232 182 106 236 99 110 237 176 167 237 167 166 233 235 225 238 88 94 238 94 234 238 55 88 239 189 121 240 177 176 238 56 55 240 186 177 238 57 56 236 110 230 239 121 182 241 103 98 242 100 99 241 108 103 241 30 2 241 98 30 243 192 95 243 95 186 243 71 70 243 72 71 244 111 108 244 123 111 242 113 100 245 147 189 243 70 192 246 130 118 247 127 198 247 198 52 247 202 127 248 124 123 248 132 124 249 206 138 249 138 202 250 134 132 246 118 113 250 135 134 251 142 141 245 212 147 252 143 206 253 31 212 252 213 143 254 145 136 254 136 135 251 141 130 255 151 213 255 221 151 256 148 145 257 51 142 258 220 154 259 149 20 258 214 50 259 20 21 259 21 22 256 156 148 259 22 23 260 228 159 258 154 214 258 50 1 261 155 149 260 159 221 262 158 156 263 166 228 261 162 155 263 237 166 264 165 220 262 169 158 264 223 165 265 164 162 266 240 176 267 232 175 266 176 237 268 183 174 268 174 169 269 72 243 265 171 164 269 243 186 267 175 223 269 73 72 270 179 172 269 74 73 269 186 240 271 202 247 272 239 182 272 182 232 271 249 202 271 247 52 273 187 184 274 252 206 270 172 171 273 184 183 275 193 187 274 206 249 276 190 181 275 195 193 277 189 239 276 181 179 278 196 195 277 245 189 279 213 252 280 199 194 279 255 213 281 253 212 282 221 255 280 194 190 282 260 221 278 203 196 283 210 205 283 205 203 284 228 260 285 207 200 281 212 245 286 31 253 284 263 228 287 216 215 285 200 199 288 208 207 288 218 208 289 237 263 287 215 210 289 266 237 290 74 269 290 269 240 291 1 3 291 3 4 290 75 74 290 76 75 292 222 216 290 240 266 293 249 271 292 224 222 291 258 1 293 271 52 294 225 224 295 264 220 293 274 249 296 227 218 297 279 252 294 233 225 298 57 238 297 252 274 298 234 233 298 238 234 298 58 57 296 229 227 298 59 58 299 282 255 300 236 230 295 220 258 301 108 241 301 241 2 299 255 279 302 267 223 301 244 108 303 123 244 300 230 229 304 260 282 305 99 236 305 242 99 303 248 123 304 284 260 306 132 248 302 223 264 307 232 267 306 250 132 308 289 263 309 254 135 310 246 113 310 113 242 308 263 284 309 135 250 311 290 266 311 266 289 307 272 232 311 76 290 311 77 76 311 78 77 312 256 145 313 130 246 314 297 274 312 145 254 314 274 293 314 293 52 315 277 239 316 299 279 315 239 272 317 156 256 313 251 130 316 279 297 318 142 251 318 257 142 317 262 156 319 304 282 319 282 299 320 281 245 321 51 257 322 169 262 320 245 277 323 253 281 323 286 253 324 284 304 324 308 284 322 268 169 325 23 24 325 24 25 325 259 23 326 289 308 327 183 268 326 311 289 326 78 311 328 31 286 326 79 78 329 149 259 330 297 314 329 261 149 330 316 297 327 273 183 330 314 52 331 275 187 331 187 273 332 299 316 333 265 162 332 319 299 333 162 261 334 4 5 334 5 6 334 291 4 335 324 304 335 304 319 336 278 195 337 270 171 337 171 265 338 258 291 336 195 275 338 295 258 339 308 324 339 326 308 339 79 326 339 80 79 339 81 80 340 332 316 341 302 264 340 316 330 342 203 278 343 276 179 340 330 52 342 283 203 343 179 270 341 264 295 344 210 283 345 319 332 345 335 319 344 287 210 346 190 276 347 324 335 348 292 216 349 267 302 349 307 267 347 339 324 347 82 81 347 83 82 347 81 339 348 216 287 350 340 52 351 294 224 346 280 190 350 332 340 351 224 292 350 345 332 352 199 280 353 315 272 352 285 199 353 272 307 354 335 345 354 84 83 354 85 84 355 233 294 355 298 233 354 347 335 355 59 298 355 60 59 354 83 347 355 61 60 356 85 354 356 86 85 356 87 86 357 303 244 356 52 87 357 301 2 356 350 52 358 207 285 356 345 350 356 354 345 357 244 301 358 288 207 359 277 315 360 248 303 359 320 277 360 306 248 361 309 250 361 250 306 362 296 218 362 218 288 363 323 281 363 281 320 364 254 309 364 312 254 365 300 229 365 229 296 366 317 256 366 256 312 367 305 236 367 236 300 368 286 323 368 328 286 369 31 328 369 51 31 370 322 262 371 242 305 370 262 317 372 327 268 371 310 242 373 6 7 373 7 8 373 8 9 372 268 322 373 334 6 374 313 246 374 246 310 375 273 327 376 251 313 376 318 251 375 331 273 377 291 334 378 275 331 377 338 291 378 336 275 379 321 257 379 257 318 380 51 321 381 341 295 381 295 338 382 278 336 382 342 278 109 259 325 383 349 302 384 283 342 109 325 25 109 329 259 384 344 283 383 302 341 125 333 261 125 261 329 385 353 307 386 287 344 386 348 287 385 307 349 387 351 292 133 265 333 387 292 348 388 359 315 133 337 265 388 315 353 389 355 294 389 294 351 389 62 61 137 343 270 137 270 337 389 61 355 390 357 2 390 303 357 391 320 359 391 363 320 390 360 303 392 361 306 146 346 276 392 306 360 393 364 309 101 368 323 393 309 361 146 276 343 394 312 364 394 366 312 157 280 346 101 323 363 114 328 368 157 352 280 395 317 366 395 370 317 114 369 328 131 51 369 170 358 285 170 285 352 396 322 370 396 372 322 185 288 358 163 11 12 163 12 13 397 327 372 185 362 288 397 375 327 188 365 296 173 9 10 173 10 11 173 373 9 398 331 375 188 296 362 398 378 331 180 377 334 180 334 373 197 300 365 197 367 300 399 336 378 399 382 336 191 338 377 400 342 382 204 371 305 204 305 367 191 381 338 211 374 310 400 384 342 96 386 344 201 341 381 211 310 371 217 313 374 96 344 384 112 348 386 217 376 313 201 383 341 112 387 348 226 318 376 209 385 349 401 62 389 401 63 62 401 64 63 401 351 387 401 389 351 226 379 318 402 360 390 402 390 2 235 321 379 402 392 360 235 380 321 209 349 383 219 388 353 219 353 385 120 361 392 120 393 361 94 51 380 128 364 393 128 394 364 231 359 388 231 391 359 103 25 26 103 26 27 140 366 394 140 395 366 103 109 25 111 329 109 111 125 329 110 363 391 110 101 363 144 396 370 144 370 395 124 133 333 124 333 125 100 114 368 152 397 372 100 368 101 152 372 396 134 337 133 134 137 337 118 131 369 161 398 375 118 369 114 403 32 33 136 146 343 403 33 34 136 343 137 403 34 35 161 375 397 168 399 378 141 51 131 168 378 398 148 346 146 93 37 38 178 400 382 93 38 39 155 13 14 178 382 399 148 157 346 155 14 15 158 352 157 158 170 352 107 403 35 107 35 36 97 384 400 107 36 37 155 163 13 97 96 384 102 386 96 102 112 386 174 358 170 174 185 358 164 173 11 164 11 163 105 401 387 172 180 373 105 387 112 172 373 173 105 65 64 105 66 65 122 31 32 184 362 185 184 188 362 105 64 401 117 120 392 117 402 2 117 392 402 119 393 120 119 128 393 181 377 180 122 32 403 181 191 377 90 39 40 90 40 41 129 394 128 193 197 365 129 140 394 193 365 188 194 201 381 194 381 191 139 395 140 139 144 395 90 93 39 92 37 93 196 367 197 196 204 367 150 396 144 92 107 37 150 152 396 200 209 383 115 403 107 205 371 204 115 122 403 205 211 371 215 217 374 200 383 201 215 374 211 153 397 152 153 161 397 208 219 385 208 385 209 222 376 217 160 168 398 160 398 161 222 226 376 225 379 226 227 231 388 225 235 379 126 31 122 167 399 168 167 178 399 89 41 42 89 42 43 89 43 44 227 388 219 89 44 45 234 94 380 89 45 46 230 110 391 230 391 231 177 97 400 234 380 235 177 400 178 +37 36 1 0 +0.059 -1.44503549751041e-17 -1.02 0.0581036574277203 0.0102452424823489 -1.02 0.0554418646263686 0.0201791884562145 -1.02 0.0510954988232819 0.0295 -1.02 0.0451966221440197 0.0379244689715058 -1.02 0.0379244689715058 0.0451966221440197 -1.02 0.0295 0.0510954988232819 -1.02 0.0201791884562145 0.0554418646263686 -1.02 0.0102452424823489 0.0581036574277203 -1.02 3.61258874377601e-18 0.059 -1.02 -0.0102452424823489 0.0581036574277203 -1.02 -0.0201791884562145 0.0554418646263686 -1.02 -0.0295 0.0510954988232819 -1.02 -0.0379244689715058 0.0451966221440197 -1.02 -0.0451966221440197 0.0379244689715058 -1.02 -0.0510954988232819 0.0295 -1.02 -0.0554418646263686 0.0201791884562145 -1.02 -0.0581036574277203 0.010245242482349 -1.02 -0.059 8.58289676310131e-17 -1.02 -0.0581036574277203 -0.0102452424823488 -1.02 -0.0554418646263686 -0.0201791884562144 -1.02 -0.0510954988232819 -0.0294999999999999 -1.02 -0.0451966221440198 -0.0379244689715057 -1.02 -0.0379244689715059 -0.0451966221440196 -1.02 -0.0295000000000001 -0.0510954988232818 -1.02 -0.0201791884562146 -0.0554418646263685 -1.02 -0.010245242482349 -0.0581036574277202 -1.02 -1.6804534651825e-16 -0.059 -1.02 0.0102452424823487 -0.0581036574277203 -1.02 0.0201791884562143 -0.0554418646263687 -1.02 0.0294999999999998 -0.051095498823282 -1.02 0.0379244689715056 -0.0451966221440198 -1.02 0.0451966221440196 -0.037924468971506 -1.02 0.0510954988232818 -0.0295000000000002 -1.02 0.0554418646263685 -0.0201791884562147 -1.02 0.0581036574277202 -0.0102452424823492 -1.02 0 0 -1.02 0.059 -1.46536699874994e-17 0.0581036574277203 0.0102452424823489 0.0554418646263686 0.0201791884562144 0.0510954988232819 0.0295 0.0451966221440197 0.0379244689715058 0.0379244689715058 0.0451966221440197 0.0295 0.0510954988232819 0.0201791884562145 0.0554418646263686 0.0102452424823489 0.0581036574277203 6.16301172422229e-18 0.059 -0.0102452424823489 0.0581036574277203 -0.0201791884562145 0.0554418646263686 -0.0295 0.0510954988232819 -0.0379244689715058 0.0451966221440197 -0.0451966221440197 0.0379244689715058 -0.0510954988232819 0.0295 -0.0554418646263686 0.0201791884562145 -0.0581036574277203 0.010245242482349 -0.059 8.24908446672018e-17 -0.0581036574277203 -0.0102452424823488 -0.0554418646263686 -0.0201791884562144 -0.0510954988232819 -0.0294999999999999 -0.0451966221440198 -0.0379244689715057 -0.0379244689715059 -0.0451966221440196 -0.0295000000000001 -0.0510954988232818 -0.0201791884562146 -0.0554418646263685 -0.010245242482349 -0.0581036574277202 -1.67309335873458e-16 -0.059 0.0102452424823487 -0.0581036574277203 0.0201791884562143 -0.0554418646263687 0.0294999999999998 -0.051095498823282 0.0379244689715056 -0.0451966221440198 0.0451966221440195 -0.037924468971506 0.0510954988232818 -0.0295000000000002 0.0554418646263685 -0.0201791884562147 0.0581036574277202 -0.0102452424823492 -7.75882179684939e-19 -7.75882179684939e-19 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 37 11 12 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 +370 648 1 0.00112884631280738 +0.059 -1.44503549751041e-17 1.03 0.059 -1.44503549751041e-17 1.03 0.0581036574277203 0.0102452424823489 1.03 0.0554418646263686 0.0201791884562145 1.03 0.0510954988232819 0.0295 1.03 0.0451966221440197 0.0379244689715058 1.03 0.0379244689715058 0.0451966221440197 1.03 0.0295 0.0510954988232819 1.03 0.0201791884562145 0.0554418646263686 1.03 0.0102452424823489 0.0581036574277203 1.03 3.61258874377601e-18 0.059 1.03 -0.0102452424823489 0.0581036574277203 1.03 -0.0201791884562145 0.0554418646263686 1.03 -0.0295 0.0510954988232819 1.03 -0.0379244689715058 0.0451966221440197 1.03 -0.0451966221440197 0.0379244689715058 1.03 -0.0510954988232819 0.0295 1.03 -0.0554418646263686 0.0201791884562145 1.03 -0.0581036574277203 0.010245242482349 1.03 -0.059 8.58289676310131e-17 1.03 -0.0581036574277203 -0.0102452424823488 1.03 -0.0554418646263686 -0.0201791884562144 1.03 -0.0510954988232819 -0.0294999999999999 1.03 -0.0451966221440198 -0.0379244689715057 1.03 -0.0379244689715059 -0.0451966221440196 1.03 -0.0295000000000001 -0.0510954988232818 1.03 -0.0201791884562146 -0.0554418646263685 1.03 -0.010245242482349 -0.0581036574277202 1.03 -1.6804534651825e-16 -0.059 1.03 0.0102452424823487 -0.0581036574277203 1.03 0.0201791884562143 -0.0554418646263687 1.03 0.0294999999999998 -0.051095498823282 1.03 0.0379244689715056 -0.0451966221440198 1.03 0.0451966221440196 -0.037924468971506 1.03 0.0510954988232818 -0.0295000000000002 1.03 0.0554418646263685 -0.0201791884562147 1.03 0.0581036574277202 -0.0102452424823492 1.03 0.059 0.18 1.21 0.059 0.00273460445780259 1.06125667198005 0.059 0.0108553282585365 1.09156362579862 0.059 0.024115427318801 1.12 0.059 0.0421120002385838 1.14570176974358 0.059 0.0642982302564227 1.16788799976142 0.059 0.0899999999999997 1.1858845726812 0.059 0.118436374201379 1.19914467174146 0.059 0.148743328019952 1.2072653955422 0.059 0.18 1.21 0.0581036574277203 0.18 1.19975475751765 0.0554418646263686 0.18 1.18982081154379 0.0510954988232819 0.18 1.1805 0.0451966221440197 0.18 1.17207553102849 0.0379244689715058 0.18 1.16480337785598 0.0295 0.18 1.15890450117672 0.0201791884562145 0.18 1.15455813537363 0.0102452424823489 0.18 1.15189634257228 3.61258874377601e-18 0.18 1.151 -0.0102452424823489 0.18 1.15189634257228 -0.0201791884562145 0.18 1.15455813537363 -0.0295 0.18 1.15890450117672 -0.0379244689715058 0.18 1.16480337785598 -0.0451966221440197 0.18 1.17207553102849 -0.0510954988232819 0.18 1.1805 -0.0554418646263686 0.18 1.18982081154379 -0.0581036574277203 0.18 1.19975475751765 -0.059 0.18 1.21 -0.0581036574277203 0.18 1.22024524248235 -0.0554418646263686 0.18 1.23017918845621 -0.0510954988232819 0.18 1.2395 -0.0451966221440198 0.18 1.24792446897151 -0.0379244689715059 0.18 1.25519662214402 -0.0295000000000001 0.18 1.26109549882328 -0.0201791884562146 0.18 1.26544186462637 -0.010245242482349 0.18 1.26810365742772 -1.6804534651825e-16 0.18 1.269 0.0102452424823487 0.18 1.26810365742772 0.0201791884562143 0.18 1.26544186462637 0.0294999999999998 0.18 1.26109549882328 0.0379244689715056 0.18 1.25519662214402 0.0451966221440196 0.18 1.24792446897151 0.0510954988232818 0.18 1.2395 0.0554418646263685 0.18 1.23017918845621 0.0581036574277202 0.18 1.22024524248235 0.059 0.00273460445780259 1.06125667198005 0.059 0.0108553282585365 1.09156362579862 0.059 0.024115427318801 1.12 0.059 0.0421120002385838 1.14570176974358 0.059 0.0642982302564227 1.16788799976142 0.059 0.0899999999999997 1.1858845726812 0.059 0.118436374201379 1.19914467174146 0.059 0.148743328019952 1.2072653955422 -0.0581036574277203 0.0499603113105937 1.13911625481769 -0.0581036574277203 0.0329880675764467 1.11487737875883 -0.059 0.0421120002385839 1.14570176974358 0.0554418646263685 0.0799104057718923 1.20336026251203 0.0510954988232818 0.0453359957706696 1.19048631083343 0.0554418646263685 0.0513272979432382 1.18334615494495 0.0451966221440197 0.108962234485753 1.15304101912684 0.0451966221440197 0.0886756090152483 1.13883617104756 0.0379244689715058 0.11259831107201 1.14674314973923 0.0581036574277203 0.0499603113105937 1.13911625481769 0.0581036574277203 0.0329880675764467 1.11487737875883 0.0554418646263686 0.0415911171496364 1.10991040577189 0.0379244689715057 0.00748937899740922 1.17475359845744 0.0379244689715057 -0.0150259956231665 1.14259831107201 0.0451966221440196 0.0130601715247235 1.1700791485024 0.0554418646263686 0.0575701554221175 1.13273083743039 0.0379244689715058 0.133894529384913 1.15667373942828 0.0294999999999999 0.115547749411641 1.1416345726812 0.0294999999999999 0.135912064032215 1.15113060854185 -0.0451966221440197 0.0464926718982847 1.07859269348544 -0.0451966221440197 0.0400829155298124 1.05467115705416 -0.0510954988232819 0.0385762605717208 1.08147403157051 0.0102452424823487 -0.0437442498669647 1.11143624703979 0.0201791884562143 -0.0518649736676986 1.07088405073887 0.0201791884562143 -0.0412429828134735 1.11052586028437 0.0554418646263686 0.077269162569607 1.15242984457788 0.0510954988232819 0.0647103113105937 1.12673953525782 -0.0510954988232819 0.108346779973272 1.22686560405465 -0.0510954988232819 0.0752499999999997 1.21143232209284 -0.0451966221440198 0.0710377655142468 1.21872812623556 -0.0451966221440198 0.105465441888195 1.23478201538121 -0.0554418646263686 0.0799104057718925 1.20336026251203 0.0102452424823487 -0.0544863278553818 1.07134626620815 0.0510954988232819 0.0832604647421756 1.14528968868941 0.0294999999999999 0.157615968277598 1.156946152157 0.0201791884562144 0.158370706778778 1.1526658174167 -0.059 0.0642982302564228 1.16788799976142 -0.0581036574277203 0.034263689166574 1.15228728466946 0.0581036574277202 0.11493229489916 1.20877205050029 0.0581036574277202 0.0848773787588251 1.19475721293884 0.0510954988232819 0.10475 1.16033682326956 -0.0581036574277203 0.0577127153305347 1.17573631083343 0.0451966221440196 0.039920851497597 1.19693982847528 0.0510954988232818 0.0195136891665738 1.16466400422933 -0.0510954988232819 0.049663176730442 1.10525 0.0451966221440197 0.131407306514564 1.16350732810172 -0.0554418646263686 0.0298175627442894 1.08466193687063 -0.0554418646263686 0.0415911171496364 1.10991040577189 -0.0295 0.0530538478429967 1.0523840317224 -0.0379244689715058 0.0472445883551965 1.05340836090804 0.0201791884562143 -0.0238986358808122 1.14772093231318 0.0294999999999998 -0.0201345726811991 1.14554774941164 0.0581036574277203 0.0708837451823107 1.16003968868941 0.0379244689715058 0.156591639091962 1.1627554116448 -0.010245242482349 -0.0544863278553817 1.07134626620815 -0.0451966221440198 0.142157813094064 1.24461370661421 -0.0379244689715059 0.102978219017845 1.24161560405465 0 -0.0553690529699177 1.0715019144624 0.0510954988232818 0.0752499999999996 1.21143232209284 -0.0379244689715059 0.140895016947942 1.25177537943959 0.0554418646263686 0.100089594228107 1.16840888285036 0.0294999999999998 0.00297057729661632 1.17854532329794 -0.0581036574277203 0.0848773787588253 1.19475721293884 0.0510954988232819 0.128525968429487 1.17142373942828 -0.0554418646263686 0.0575701554221176 1.13273083743039 0.0451966221440197 0.15532884294584 1.16991708447019 0.0581036574277203 0.0951226212411742 1.17701193242355 -0.0379244689715058 0.0533262605717208 1.07610547061509 0 -0.0445865363678321 1.11174281425483 0.0554418646263686 0.125338063129369 1.18018243725571 0.0554418646263685 0.111534685273389 1.21810690622722 -0.0554418646263686 0.111534685273389 1.21810690622722 0.0510954988232819 0.153865949261127 1.17821356682834 0.0379244689715057 0.0352464015425624 1.20251062100259 -0.0581036574277203 0.0708837451823108 1.16003968868941 0.0581036574277203 0.121940453503598 1.18951729298264 0.0102452424823487 -0.0262038160663933 1.14905182871386 0.0554418646263686 0.152247407322171 1.18739277430102 0.0581036574277203 0.150522395706768 1.19717580131409 -0.0451966221440197 0.0569589808731597 1.10103776551425 -0.0201791884562146 -0.0518649736676985 1.07088405073887 -0.0201791884562145 0.0573341825833036 1.05162929322122 0.0581036574277202 0.146964260333136 1.2173549897703 -0.0510954988232819 0.143620706778778 1.23631722425606 0.0451966221440196 0.0710377655142466 1.21872812623556 -0.059 0.0899999999999997 1.1858845726812 -0.0510954988232819 0.0647103113105937 1.12673953525782 0.0201791884562143 -0.000358932074600604 1.18133911338332 -0.0295 0.0588693914581495 1.07408793596778 -0.010245242482349 -0.0437442498669646 1.11143624703979 0.0510954988232818 0.108346779973272 1.22686560405465 0.0294999999999998 0.0314546767020638 1.20702942270338 -0.0581036574277203 0.11493229489916 1.20877205050029 -0.0554418646263686 0.0772691625696071 1.15242984457788 0 -0.026980071504481 1.1495 -0.0379244689715058 0.0632568502607684 1.09740168892799 -0.0295000000000001 -0.0475846389273915 1.07012931223769 -0.0102452424823489 0.0599555367709869 1.05116707775194 0.0554418646263685 0.145239248717733 1.22713801678337 -0.0554418646263686 0.145239248717733 1.22713801678337 0.0379244689715057 0.0674016889279897 1.22502599562317 0.0102452424823487 -0.00239798365881013 1.18305008081559 -0.0581036574277203 0.0951226212411742 1.17701193242355 -0.0201791884562146 -0.0412429828134734 1.11052586028437 -0.0451966221440197 0.071163828952444 1.12132439098475 -0.0201791884562145 0.0629536393305463 1.07260139131287 0.0451966221440196 0.105465441888195 1.23478201538121 -0.059 0.118436374201379 1.19914467174146 -0.0510954988232819 0.0832604647421757 1.14528968868941 0.0201791884562143 0.0286608866166744 1.2103589320746 -0.010245242482349 -0.0262038160663932 1.14905182871386 -0.0295 0.068365427318801 1.09445225058836 -0.0379244689715059 -0.0417753794395912 1.06910498305206 0.0510954988232818 0.143620706778778 1.23631722425606 0 0.0608382618855228 1.0510114294977 0.0294999999999998 0.0644522505883586 1.2301345726812 -0.0581036574277203 0.146964260333136 1.2173549897703 0 -0.00308462190543596 1.18362623871508 -0.0554418646263686 0.100089594228107 1.16840888285036 -0.0379244689715058 0.0767346214797583 1.11664994102972 -0.0295000000000001 -0.0371587349410765 1.10903931562946 -0.0102452424823489 0.0654549063840376 1.07169100455745 0.0379244689715057 0.102978219017845 1.24161560405465 0.0102452424823487 0.0269499191844127 1.21239798365881 -0.0581036574277203 0.121940453503599 1.18951729298264 -0.0451966221440197 0.0886756090152483 1.13883617104756 -0.0201791884562146 -0.0238986358808121 1.14772093231318 -0.0201791884562145 0.072129490518414 1.09227906768682 -0.0451966221440198 -0.0346137066142072 1.06784218690594 0.0102452424823489 0.0599555367709869 1.05116707775194 0.0451966221440196 0.142157813094064 1.24461370661421 -0.059 0.148743328019952 1.2072653955422 0.0201791884562143 0.0622790676868153 1.23389863588081 -0.0510954988232819 0.10475 1.16033682326956 -0.010245242482349 -0.00239798365881009 1.18305008081559 -0.0295 0.0812534231805512 1.11285821618922 -0.0379244689715059 -0.0316156040546478 1.10702178098215 0.0294999999999998 0.100960684370544 1.24715873494108 0 0.0662971928849051 1.07138443734241 -0.0554418646263686 0.125338063129369 1.18018243725571 0 0.0263737612849168 1.21308462190544 -0.0295000000000001 -0.020134572681199 1.14554774941164 -0.0379244689715058 0.0933500589702829 1.13326537852024 -0.0102452424823489 0.0744346707039951 1.09094817128614 -0.0510954988232819 -0.0263172242560575 1.06637929322122 0.0201791884562144 0.0573341825833037 1.05162929322122 0.0379244689715057 0.140895016947942 1.25177537943959 0.0102452424823487 0.0609481712861394 1.23620381606639 -0.0581036574277203 0.150522395706768 1.19717580131409 -0.0451966221440197 0.108962234485753 1.15304101912684 -0.0201791884562146 -0.000358932074600519 1.18133911338332 -0.0201791884562145 0.0845829325517682 1.11006442610383 0.0102452424823489 0.0654549063840376 1.07169100455745 -0.0451966221440198 -0.0247820153812116 1.1045345581118 -0.0510954988232819 0.128525968429487 1.17142373942828 0.0201791884562143 0.0994741397156262 1.25124298281347 -0.0295 0.0971417838107815 1.12874657681945 -0.010245242482349 0.0269499191844128 1.21239798365881 -0.0379244689715059 -0.0150259956231664 1.14259831107201 0 0.0752109261420829 1.0905 -0.0554418646263686 -0.0171380167833718 1.06476075128227 0.0294999999999999 0.0530538478429967 1.0523840317224 0.0294999999999998 0.139870687762306 1.25758463892739 -0.0554418646263686 0.152247407322171 1.18739277430102 0 0.0604999999999996 1.23698007150448 -0.0379244689715058 0.11259831107201 1.14674314973923 -0.0102452424823489 0.0866219841359777 1.10835345867157 -0.0295000000000001 0.00297057729661643 1.17854532329794 -0.0510954988232819 -0.0168656040546477 1.10165322002673 0.0201791884562144 0.0629536393305463 1.07260139131287 -0.0451966221440197 0.131407306514564 1.16350732810172 0.0102452424823487 0.0985637529602047 1.25374424986696 -0.0201791884562146 0.0286608866166745 1.2103589320746 -0.0201791884562145 0.0999355738961709 1.12541706744823 0.0102452424823489 0.0744346707039951 1.09094817128614 -0.0451966221440198 -0.00872812623555773 1.13896223448575 0.0379244689715058 0.0472445883551965 1.05340836090804 -0.0510954988232819 0.153865949261127 1.17821356682834 -0.0581036574277203 -0.00735498977030456 1.06303573966686 0.0201791884562143 0.139115949261126 1.2618649736677 -0.0295 0.115547749411641 1.1416345726812 -0.010245242482349 0.0609481712861395 1.23620381606639 -0.0379244689715059 0.00748937899740935 1.17475359845744 0 0.0873086223826036 1.10777730077207 0.0294999999999999 0.0588693914581496 1.07408793596778 -0.0554418646263686 -0.00810690622721636 1.09846531472661 -0.0379244689715058 0.133894529384913 1.15667373942828 0 0.0982571857451647 1.25458653636783 -0.0102452424823489 0.101646541328433 1.12337801586402 -0.0295000000000001 0.0314546767020639 1.20702942270338 0.0201791884562144 0.0721294905184141 1.09227906768682 -0.0510954988232819 -0.00143232209283991 1.13475 0.0451966221440197 0.0400829155298124 1.05467115705416 -0.059 0.00273460445780265 1.06125667198005 -0.0451966221440197 0.15532884294584 1.16991708447019 0.0102452424823487 0.138653733791845 1.26448632785538 -0.0201791884562145 0.117720932313184 1.13787050948159 0.0102452424823489 0.0866219841359777 1.10835345867157 -0.0201791884562146 0.0622790676868153 1.23389863588081 0.0379244689715058 0.0533262605717208 1.07610547061509 -0.0451966221440198 0.0130601715247237 1.1700791485024 -0.0295 0.135912064032215 1.15113060854185 -0.0581036574277203 0.001227949499711 1.09506770510084 0 0.102222699227929 1.1226913776174 -0.010245242482349 0.0985637529602047 1.25374424986696 0.0294999999999999 0.068365427318801 1.09445225058836 -0.0379244689715059 0.0352464015425625 1.20251062100259 0.0510954988232819 0.0317864331716627 1.05613405073887 -0.0554418646263686 0.00663973748796562 1.13008959422811 -0.0379244689715058 0.156591639091962 1.1627554116448 -0.0102452424823489 0.11905182871386 1.135565329296 -0.0581036574277203 0.0128241986859099 1.05947760429323 0.0201791884562144 0.0845829325517682 1.11006442610383 0 0.138498085537603 1.26536905296992 -0.0295000000000001 0.0644522505883587 1.2301345726812 0.0451966221440197 0.0464926718982846 1.07859269348544 -0.0510954988232819 0.019513689166574 1.16466400422933 0.0581036574277202 -0.00735498977030489 1.06303573966686 -0.0201791884562145 0.137398608687132 1.14704636066945 0.0102452424823489 0.101646541328433 1.12337801586402 -0.059 0.0108553282585365 1.09156362579862 0.0554418646263685 -0.0171380167833721 1.06476075128227 0.0379244689715058 0.0632568502607684 1.09740168892799 0.0581036574277202 0.00122794949971069 1.09506770510084 -0.0201791884562146 0.0994741397156262 1.25124298281347 0.0554418646263686 0.022607225698977 1.05775259267783 0.0510954988232818 -0.0263172242560578 1.06637929322122 -0.0451966221440198 0.0399208514975972 1.19693982847528 -0.0295 0.157615968277598 1.156946152157 0.0554418646263685 -0.00810690622721665 1.09846531472661 0 0.1195 1.13478907385792 -0.0581036574277203 0.0152427870611554 1.12512262124117 0.0294999999999999 0.0812534231805512 1.11285821618922 0.0581036574277202 0.0152427870611551 1.12512262124117 -0.0554418646263686 0.0226072256989771 1.05775259267783 0.0510954988232819 0.0385762605717208 1.08147403157051 -0.010245242482349 0.138653733791845 1.26448632785538 0.0451966221440196 -0.0346137066142074 1.06784218690594 -0.0102452424823489 0.138308995442554 1.14454509361596 0.0510954988232818 -0.016865604054648 1.10165322002673 -0.0379244689715059 0.0674016889279898 1.22502599562317 0.0201791884562144 0.0999355738961709 1.12541706744823 -0.0554418646263686 0.0266538450550501 1.15867270205676 0.0554418646263685 0.00663973748796536 1.13008959422811 0.0451966221440197 0.0569589808731597 1.10103776551425 -0.0581036574277203 0.0204827070173621 1.0880595464964 0.0581036574277203 0.0128241986859098 1.05947760429323 0.0379244689715057 -0.0417753794395914 1.06910498305206 -0.0201791884562145 0.158370706778778 1.1526658174167 -0.0295000000000001 0.100960684370544 1.24715873494108 0.0102452424823489 0.11905182871386 1.135565329296 0.0581036574277202 0.0342636891665738 1.15228728466946 -0.0510954988232819 0.0453359957706698 1.19048631083343 0.0379244689715058 0.0767346214797583 1.11664994102972 0.0451966221440196 -0.0247820153812119 1.1045345581118 -0.059 0.024115427318801 1.12 0.0554418646263686 0.0298175627442894 1.08466193687063 0.0510954988232818 -0.00143232209284017 1.13475 -0.0510954988232819 0.0317864331716628 1.05613405073887 0 0.138615562657594 1.14370280711509 0.0294999999999998 -0.0475846389273917 1.07012931223769 0.0294999999999999 0.0971417838107815 1.12874657681945 -0.0201791884562146 0.139115949261126 1.2618649736677 0.0554418646263685 0.0266538450550499 1.15867270205676 0.0510954988232819 0.0496631767304419 1.10525 -0.0102452424823489 0.158832922248059 1.15004446322901 0.0379244689715057 -0.031615604054648 1.10702178098215 0.0201791884562144 0.117720932313184 1.13787050948159 0.0581036574277202 0.0577127153305345 1.17573631083343 0.0451966221440197 0.071163828952444 1.12132439098475 0.0451966221440196 -0.00872812623555795 1.13896223448575 0.0581036574277203 0.020482707017362 1.0880595464964 -0.0554418646263686 0.0513272979432384 1.18334615494495 0.0102452424823489 0.138308995442554 1.14454509361596 0.0379244689715058 0.0933500589702829 1.13326537852024 0.0294999999999998 -0.0371587349410767 1.10903931562946 0 0.158988570502301 1.14916173811448 -0.0295000000000001 0.139870687762306 1.25758463892739 0.0201791884562144 0.137398608687132 1.14704636066945 0.0102452424823489 0.158832922248059 1.15004446322901 1.5707963267949 10.9955742875643 1.5707963267949 4.71238898038469 1.5707963267949 10.8210413623648 1.5707963267949 10.6465084371654 1.5707963267949 10.471975511966 1.5707963267949 10.2974425867665 1.5707963267949 10.1229096615671 1.5707963267949 9.94837673636768 1.5707963267949 9.77384381116824 1.5707963267949 9.59931088596881 1.5707963267949 9.42477796076938 1.5707963267949 9.25024503556995 1.5707963267949 9.07571211037051 1.5707963267949 8.90117918517108 1.5707963267949 8.72664625997165 1.5707963267949 8.55211333477222 1.5707963267949 8.37758040957278 1.5707963267949 8.20304748437335 1.5707963267949 8.02851455917392 1.5707963267949 7.85398163397448 1.5707963267949 7.67944870877505 1.5707963267949 7.50491578357562 1.5707963267949 7.33038285837619 1.5707963267949 7.15584993317675 1.5707963267949 6.98131700797732 1.5707963267949 6.80678408277789 1.5707963267949 6.63225115757845 1.5707963267949 6.45771823237902 1.5707963267949 6.28318530717959 1.5707963267949 6.10865238198016 1.5707963267949 5.93411945678072 1.5707963267949 5.75958653158129 1.5707963267949 5.58505360638186 1.5707963267949 5.41052068118243 1.5707963267949 5.23598775598299 1.5707963267949 5.06145483078356 1.5707963267949 4.88692190558413 3.14159265358979 10.9955742875643 1.74532925199433 10.9955742875643 1.91986217719376 10.9955742875643 2.0943951023932 10.9955742875643 2.26892802759263 10.9955742875643 2.44346095279206 10.9955742875643 2.61799387799149 10.9955742875643 2.79252680319093 10.9955742875643 2.96705972839036 10.9955742875643 3.14159265358979 4.71238898038469 3.14159265358979 10.8210413623648 3.14159265358979 10.6465084371654 3.14159265358979 10.471975511966 3.14159265358979 10.2974425867665 3.14159265358979 10.1229096615671 3.14159265358979 9.94837673636768 3.14159265358979 9.77384381116824 3.14159265358979 9.59931088596881 3.14159265358979 9.42477796076938 3.14159265358979 9.25024503556995 3.14159265358979 9.07571211037051 3.14159265358979 8.90117918517108 3.14159265358979 8.72664625997165 3.14159265358979 8.55211333477222 3.14159265358979 8.37758040957278 3.14159265358979 8.20304748437335 3.14159265358979 8.02851455917392 3.14159265358979 7.85398163397448 3.14159265358979 7.67944870877505 3.14159265358979 7.50491578357562 3.14159265358979 7.33038285837619 3.14159265358979 7.15584993317675 3.14159265358979 6.98131700797732 3.14159265358979 6.80678408277789 3.14159265358979 6.63225115757845 3.14159265358979 6.45771823237902 3.14159265358979 6.28318530717959 3.14159265358979 6.10865238198016 3.14159265358979 5.93411945678072 3.14159265358979 5.75958653158129 3.14159265358979 5.58505360638186 3.14159265358979 5.41052068118243 3.14159265358979 5.23598775598299 3.14159265358979 5.06145483078356 3.14159265358979 4.88692190558413 1.74532925199433 4.71238898038469 1.91986217719376 4.71238898038469 2.0943951023932 4.71238898038469 2.26892802759263 4.71238898038469 2.44346095279206 4.71238898038469 2.61799387799149 4.71238898038469 2.79252680319093 4.71238898038469 2.96705972839036 4.71238898038469 2.26892802759263 8.02851455917392 2.0943951023932 8.02851455917392 2.26892802759263 7.85398163397448 2.61799387799149 5.06145483078356 2.44346095279206 5.23598775598299 2.44346095279206 5.06145483078356 2.61799387799149 10.2974425867665 2.44346095279206 10.2974425867665 2.61799387799149 10.1229096615671 2.26892802759263 10.8210413623648 2.0943951023932 10.8210413623648 2.0943951023932 10.6465084371654 2.26892802759263 5.58505360638186 2.0943951023932 5.58505360638186 2.26892802759263 5.41052068118243 2.26892802759263 10.6465084371654 2.79252680319093 10.1229096615671 2.61799387799149 9.94837673636768 2.79252680319093 9.94837673636768 1.91986217719376 8.55211333477222 1.74532925199433 8.55211333477222 1.91986217719376 8.37758040957278 1.91986217719376 6.10865238198016 1.74532925199433 5.93411945678072 1.91986217719376 5.93411945678072 2.44346095279206 10.6465084371654 2.26892802759263 10.471975511966 2.79252680319093 7.33038285837619 2.61799387799149 7.33038285837619 2.61799387799149 7.15584993317675 2.79252680319093 7.15584993317675 2.61799387799149 7.50491578357562 1.74532925199433 6.10865238198016 2.44346095279206 10.471975511966 2.96705972839036 9.94837673636768 2.96705972839036 9.77384381116824 2.44346095279206 7.85398163397448 2.26892802759263 7.67944870877505 2.79252680319093 4.88692190558413 2.61799387799149 4.88692190558413 2.61799387799149 10.471975511966 2.44346095279206 7.67944870877505 2.44346095279206 5.41052068118243 2.26892802759263 5.23598775598299 2.0943951023932 8.37758040957278 2.79252680319093 10.2974425867665 1.91986217719376 8.20304748437335 2.0943951023932 8.20304748437335 1.74532925199433 8.90117918517108 1.74532925199433 8.72664625997165 2.0943951023932 5.93411945678072 2.0943951023932 5.75958653158129 2.44346095279206 10.8210413623648 2.96705972839036 10.1229096615671 1.74532925199433 6.45771823237902 2.96705972839036 7.15584993317675 2.79252680319093 6.98131700797732 1.74532925199433 6.28318530717959 2.61799387799149 5.23598775598299 2.96705972839036 6.98131700797732 2.61799387799149 10.6465084371654 2.26892802759263 5.75958653158129 2.61799387799149 7.67944870877505 2.79252680319093 10.471975511966 2.26892802759263 8.20304748437335 2.96705972839036 10.2974425867665 2.61799387799149 10.8210413623648 1.91986217719376 8.72664625997165 1.91986217719376 6.28318530717959 2.79252680319093 10.6465084371654 2.79252680319093 5.06145483078356 2.79252680319093 7.50491578357562 2.96705972839036 10.471975511966 2.44346095279206 5.58505360638186 2.44346095279206 8.02851455917392 2.79252680319093 10.8210413623648 2.0943951023932 6.10865238198016 2.96705972839036 10.6465084371654 2.96705972839036 10.8210413623648 2.0943951023932 8.55211333477222 1.74532925199433 6.63225115757845 1.74532925199433 9.07571211037051 2.96705972839036 4.88692190558413 2.96705972839036 7.33038285837619 2.61799387799149 5.41052068118243 2.61799387799149 7.85398163397448 2.26892802759263 8.37758040957278 2.26892802759263 5.93411945678072 1.91986217719376 8.90117918517108 1.91986217719376 6.45771823237902 2.79252680319093 5.23598775598299 2.44346095279206 5.75958653158129 2.79252680319093 7.67944870877505 2.44346095279206 8.20304748437335 2.0943951023932 6.28318530717959 2.0943951023932 8.72664625997165 1.74532925199433 6.80678408277789 1.74532925199433 9.25024503556995 2.96705972839036 5.06145483078356 2.96705972839036 7.50491578357562 2.61799387799149 5.58505360638186 2.26892802759263 6.10865238198016 2.61799387799149 8.02851455917392 1.91986217719376 6.63225115757845 2.26892802759263 8.55211333477222 1.91986217719376 9.07571211037051 2.79252680319093 5.41052068118243 2.79252680319093 7.85398163397448 2.44346095279206 8.37758040957278 2.44346095279206 5.93411945678072 2.0943951023932 6.45771823237902 2.0943951023932 8.90117918517108 1.74532925199433 6.98131700797732 2.96705972839036 5.23598775598299 1.74532925199433 9.42477796076938 2.61799387799149 5.75958653158129 2.96705972839036 7.67944870877505 2.26892802759263 6.28318530717959 2.61799387799149 8.20304748437335 2.26892802759263 8.72664625997165 1.91986217719376 6.80678408277789 1.91986217719376 9.25024503556995 2.79252680319093 5.58505360638186 2.44346095279206 6.10865238198016 2.79252680319093 8.02851455917392 2.44346095279206 8.55211333477222 2.0943951023932 6.63225115757845 2.0943951023932 9.07571211037051 1.74532925199433 7.15584993317675 1.74532925199433 9.59931088596881 2.96705972839036 5.41052068118243 2.96705972839036 7.85398163397448 2.61799387799149 5.93411945678072 2.61799387799149 8.37758040957278 2.26892802759263 6.45771823237902 2.26892802759263 8.90117918517108 1.91986217719376 6.98131700797732 2.79252680319093 5.75958653158129 1.91986217719376 9.42477796076938 2.79252680319093 8.20304748437335 2.44346095279206 6.28318530717959 2.0943951023932 6.80678408277789 2.44346095279206 8.72664625997165 2.0943951023932 9.25024503556995 1.74532925199433 7.33038285837619 1.74532925199433 9.77384381116824 2.96705972839036 5.58505360638186 2.61799387799149 6.10865238198016 2.96705972839036 8.02851455917392 2.61799387799149 8.55211333477222 2.26892802759263 6.63225115757845 2.26892802759263 9.07571211037051 1.91986217719376 9.59931088596881 1.91986217719376 7.15584993317675 2.79252680319093 8.37758040957278 2.79252680319093 5.93411945678072 2.44346095279206 8.90117918517108 2.44346095279206 6.45771823237902 2.0943951023932 6.98131700797732 2.0943951023932 9.42477796076938 1.74532925199433 7.50491578357562 1.74532925199433 9.94837673636768 2.96705972839036 5.75958653158129 2.96705972839036 8.20304748437335 2.61799387799149 6.28318530717959 2.61799387799149 8.72664625997165 2.26892802759263 9.25024503556995 2.26892802759263 6.80678408277789 1.91986217719376 7.33038285837619 1.91986217719376 9.77384381116824 2.79252680319093 8.55211333477222 2.79252680319093 6.10865238198016 2.44346095279206 6.63225115757845 2.44346095279206 9.07571211037051 2.0943951023932 9.59931088596881 2.0943951023932 7.15584993317675 1.74532925199433 10.1229096615671 2.96705972839036 8.37758040957278 1.74532925199433 7.67944870877505 2.96705972839036 5.93411945678072 2.61799387799149 8.90117918517108 2.61799387799149 6.45771823237902 2.26892802759263 6.98131700797732 2.26892802759263 9.42477796076938 1.91986217719376 9.94837673636768 1.91986217719376 7.50491578357562 2.79252680319093 8.72664625997165 2.79252680319093 6.28318530717959 2.44346095279206 9.25024503556995 2.44346095279206 6.80678408277789 2.0943951023932 9.77384381116824 2.0943951023932 7.33038285837619 1.74532925199433 10.2974425867665 1.74532925199433 7.85398163397448 2.96705972839036 8.55211333477222 2.96705972839036 6.10865238198016 2.61799387799149 9.07571211037051 2.26892802759263 9.59931088596881 2.61799387799149 6.63225115757845 1.91986217719376 10.1229096615671 2.26892802759263 7.15584993317675 2.79252680319093 8.90117918517108 1.91986217719376 7.67944870877505 2.44346095279206 9.42477796076938 2.79252680319093 6.45771823237902 2.0943951023932 9.94837673636768 2.44346095279206 6.98131700797732 1.74532925199433 10.471975511966 2.0943951023932 7.50491578357562 2.96705972839036 8.72664625997165 2.61799387799149 9.25024503556995 1.74532925199433 8.02851455917392 2.26892802759263 9.77384381116824 2.96705972839036 6.28318530717959 2.61799387799149 6.80678408277789 1.91986217719376 10.2974425867665 2.26892802759263 7.33038285837619 1.74532925199433 4.88692190558413 2.79252680319093 9.07571211037051 2.44346095279206 9.59931088596881 1.91986217719376 7.85398163397448 1.74532925199433 5.06145483078356 2.0943951023932 10.1229096615671 1.91986217719376 4.88692190558413 2.79252680319093 6.63225115757845 1.74532925199433 10.6465084371654 1.74532925199433 5.23598775598299 2.44346095279206 7.15584993317675 2.96705972839036 8.90117918517108 1.91986217719376 5.06145483078356 2.61799387799149 9.42477796076938 2.0943951023932 7.67944870877505 2.26892802759263 9.94837673636768 2.0943951023932 4.88692190558413 1.74532925199433 8.20304748437335 1.91986217719376 10.471975511966 2.96705972839036 6.45771823237902 1.74532925199433 5.41052068118243 2.79252680319093 9.25024503556995 1.91986217719376 5.23598775598299 2.61799387799149 6.98131700797732 2.44346095279206 9.77384381116824 2.26892802759263 7.50491578357562 2.0943951023932 5.06145483078356 2.0943951023932 10.2974425867665 1.91986217719376 8.02851455917392 1.74532925199433 10.8210413623648 1.74532925199433 5.58505360638186 2.96705972839036 9.07571211037051 2.79252680319093 6.80678408277789 2.61799387799149 9.59931088596881 2.26892802759263 4.88692190558413 2.44346095279206 7.33038285837619 2.26892802759263 10.1229096615671 1.91986217719376 5.41052068118243 2.0943951023932 7.85398163397448 1.91986217719376 10.6465084371654 2.0943951023932 5.23598775598299 1.74532925199433 8.37758040957278 2.79252680319093 9.42477796076938 1.74532925199433 5.75958653158129 2.44346095279206 9.94837673636768 2.96705972839036 6.63225115757845 2.26892802759263 5.06145483078356 2.0943951023932 10.471975511966 2.96705972839036 9.25024503556995 1.91986217719376 5.58505360638186 2.61799387799149 9.77384381116824 2.44346095279206 4.88692190558413 2.26892802759263 10.2974425867665 2.0943951023932 5.41052068118243 1.91986217719376 10.8210413623648 2.44346095279206 7.50491578357562 2.79252680319093 9.59931088596881 2.44346095279206 10.1229096615671 1.91986217719376 5.75958653158129 2.96705972839036 9.42477796076938 2.96705972839036 6.80678408277789 2.79252680319093 9.77384381116824 2.96705972839036 9.59931088596881 91 92 93 94 95 96 97 98 99 100 101 102 100 42 101 103 104 105 83 37 2 100 43 42 100 102 106 107 108 109 107 97 99 110 111 112 107 99 108 113 114 115 116 106 117 118 119 120 118 120 121 118 122 119 113 123 114 116 117 124 125 126 53 127 93 128 129 94 130 129 130 88 125 109 126 129 88 89 131 124 97 127 128 132 133 103 105 127 91 93 133 134 95 133 105 134 135 110 112 136 131 97 135 112 137 136 97 107 135 137 138 139 14 140 141 115 142 143 44 43 143 100 106 143 106 116 139 13 14 143 43 100 144 125 53 145 27 28 144 52 51 146 121 147 144 53 52 144 107 109 144 109 125 146 70 69 145 28 148 144 136 107 149 95 94 146 147 150 149 133 95 146 150 70 151 124 131 151 116 124 152 142 104 152 141 142 153 132 122 152 104 103 154 131 136 155 92 91 156 51 50 156 144 51 156 136 144 155 138 92 156 154 136 157 44 143 158 111 110 157 45 44 157 143 116 159 123 113 157 116 151 159 145 148 159 148 123 158 140 111 160 151 131 161 149 94 160 131 154 162 153 122 163 156 50 161 94 129 162 122 118 163 154 156 164 103 133 165 91 127 166 157 151 166 46 45 166 45 157 166 151 160 167 113 115 168 50 49 167 115 141 168 163 50 168 160 154 168 154 163 82 90 47 169 166 160 170 110 135 169 49 48 171 27 145 169 48 46 169 168 49 169 160 168 169 46 166 172 13 139 173 161 129 173 90 82 174 121 146 173 129 89 174 146 69 173 82 81 174 162 118 173 89 90 174 68 67 174 69 68 175 164 133 174 118 121 175 133 149 176 127 132 176 165 127 176 132 153 177 135 138 177 138 155 178 141 152 177 170 135 179 140 158 180 145 159 181 175 149 181 149 161 179 172 139 179 139 140 182 152 103 182 178 152 183 153 162 184 91 165 182 103 164 184 155 91 185 159 113 185 113 167 186 110 170 185 180 159 186 158 110 187 25 26 187 26 27 188 11 12 187 27 171 188 12 13 189 173 81 189 181 161 189 161 173 188 13 172 190 174 67 190 183 162 190 67 66 190 162 174 191 164 175 192 141 178 193 165 176 192 167 141 194 145 180 195 170 177 196 172 179 194 171 145 197 175 181 198 153 183 197 191 175 198 193 176 198 176 153 199 177 155 200 178 182 201 180 185 199 155 184 199 195 177 202 196 179 203 25 187 203 24 25 202 158 186 202 179 158 204 181 189 204 197 181 205 11 188 204 81 80 204 189 81 206 182 164 206 164 191 206 200 182 207 183 190 207 190 66 208 201 185 208 185 167 209 184 165 209 165 193 208 167 192 210 170 195 210 186 170 211 187 171 212 205 188 211 171 194 213 191 197 212 172 196 212 188 172 214 192 178 215 193 198 216 195 199 214 178 200 217 180 201 217 194 180 218 196 202 219 23 24 219 24 203 220 9 10 220 10 11 221 213 197 221 197 204 221 204 80 220 11 205 221 79 78 221 80 79 222 198 183 222 215 198 223 200 206 222 65 64 222 66 65 222 183 207 222 207 66 224 184 209 225 201 208 224 199 184 224 216 199 226 218 202 226 186 210 227 203 187 227 187 211 226 202 186 228 191 213 229 205 212 228 223 206 228 206 191 230 209 193 231 208 192 231 192 214 230 193 215 231 225 208 232 211 194 232 194 217 233 210 195 233 195 216 234 196 218 234 229 212 235 22 23 234 212 196 235 23 219 236 8 9 237 213 221 237 221 78 236 9 220 238 214 200 238 200 223 239 222 64 239 215 222 240 216 224 241 201 225 241 217 201 242 218 226 243 205 229 244 203 227 243 220 205 244 219 203 245 224 209 246 223 228 245 209 230 245 240 224 247 226 210 247 210 233 247 242 226 248 225 231 249 227 211 249 211 232 250 229 234 251 21 22 252 7 8 251 22 235 253 237 78 253 246 228 252 8 236 254 215 239 253 228 213 254 230 215 254 239 64 253 77 76 253 78 77 253 213 237 255 248 231 254 64 63 255 231 214 255 214 238 256 233 216 256 216 240 257 234 218 257 218 242 258 217 241 258 232 217 259 235 219 257 250 234 259 219 244 260 220 243 260 236 220 259 251 235 260 252 236 261 240 245 262 223 246 262 238 223 263 225 248 264 242 247 265 243 229 263 241 225 266 227 249 265 229 250 266 244 227 267 6 7 267 7 252 268 230 254 268 261 245 269 21 251 268 62 61 268 63 62 270 246 253 268 254 63 270 253 76 268 245 230 271 247 233 271 233 256 272 248 255 271 264 247 273 249 232 273 232 258 274 250 257 275 252 260 276 269 251 277 240 261 277 256 240 276 251 259 278 238 262 278 255 238 279 257 242 278 272 255 279 242 264 280 241 263 279 274 257 280 258 241 39 1 3 281 243 265 281 260 243 282 276 259 281 275 260 283 5 6 282 259 244 283 6 267 282 244 266 284 21 269 285 261 268 284 19 20 285 268 61 284 20 21 286 262 246 286 246 270 287 264 271 286 76 75 286 270 76 288 265 250 288 250 274 289 248 272 289 263 248 290 283 267 291 266 249 290 267 252 291 249 273 290 252 275 292 287 271 292 256 277 292 271 256 293 269 276 294 274 279 295 272 278 296 275 281 297 258 280 297 273 258 298 4 5 298 5 283 299 276 282 300 261 285 300 61 60 300 277 261 299 293 276 300 285 61 301 264 287 301 294 279 302 18 19 302 19 284 301 279 264 303 281 265 304 278 262 303 296 281 304 262 286 303 265 288 304 74 73 304 75 74 304 286 75 304 295 278 305 280 263 305 263 289 306 298 283 306 283 290 307 266 291 38 46 48 307 282 266 308 36 37 309 287 292 310 288 274 307 299 282 308 37 83 310 274 294 311 284 269 312 35 36 312 36 308 313 290 275 313 275 296 311 269 293 311 302 284 314 83 84 313 306 290 315 272 295 314 308 83 315 289 272 316 3 4 317 35 312 316 4 298 317 34 35 318 291 273 319 292 277 319 300 60 319 309 292 319 59 58 318 273 297 320 308 314 319 60 59 319 277 300 321 294 301 322 293 299 320 312 308 323 296 303 324 320 314 324 314 84 324 84 85 325 18 302 326 298 306 327 304 73 328 33 34 328 34 317 327 295 304 329 287 309 329 301 287 330 312 320 331 280 305 331 297 280 330 317 312 329 321 301 332 288 310 333 322 299 332 303 288 332 323 303 333 299 307 334 320 324 335 306 313 334 330 320 336 302 311 335 326 306 337 3 316 337 39 3 338 33 328 337 40 39 339 309 319 339 319 58 340 289 315 341 294 321 340 305 289 342 324 85 341 310 294 342 334 324 343 291 318 342 85 86 343 333 307 344 335 313 343 307 291 345 338 328 346 311 293 344 296 323 344 313 296 345 328 317 347 316 298 346 293 322 345 317 330 346 336 311 347 298 326 348 345 330 349 16 17 349 17 18 348 330 334 349 18 325 350 321 329 351 33 338 352 323 332 353 327 73 351 31 32 353 295 327 351 32 33 353 73 72 353 315 295 354 334 342 120 297 331 354 348 334 120 318 297 355 326 335 356 339 58 356 57 56 357 338 345 356 58 57 356 329 309 356 309 339 356 350 329 358 310 341 128 322 333 358 332 310 137 302 336 359 342 86 358 352 332 359 86 87 360 335 344 137 325 302 361 357 345 360 355 335 362 41 40 147 331 305 361 345 348 362 316 347 362 337 316 362 40 337 147 305 340 114 31 351 363 333 343 363 128 333 364 341 321 364 321 350 365 360 344 92 336 346 134 348 354 134 361 348 365 344 323 365 323 352 102 347 326 366 114 351 366 338 357 102 326 355 366 351 338 367 350 356 111 16 349 368 315 353 368 340 315 367 356 56 368 353 72 108 352 358 368 72 71 96 342 359 119 318 120 96 354 342 119 363 343 117 355 360 119 343 318 93 322 128 93 346 322 369 341 364 93 92 346 369 108 358 104 357 361 123 29 30 369 358 341 123 30 31 123 31 114 112 349 325 98 117 360 130 359 87 130 96 359 98 360 365 101 362 347 112 111 349 130 87 88 101 42 41 112 325 137 101 347 102 121 120 331 101 41 362 121 331 147 370 364 350 370 367 56 105 104 361 105 361 134 370 56 55 132 128 363 370 350 367 99 365 352 99 352 108 99 98 365 115 114 366 138 336 92 95 134 354 106 102 355 138 137 336 106 355 117 95 354 96 109 108 369 140 14 15 140 15 16 142 115 366 142 366 357 142 357 104 140 16 111 124 117 98 150 147 340 150 340 368 126 370 55 150 71 70 150 368 71 126 54 53 122 363 119 148 28 29 126 55 54 148 29 123 126 109 369 126 369 364 126 364 370 122 132 363 97 124 98 94 96 130 +37 36 1 0 +-1.24909848089882e-17 -0.359 -0.971 0.00885605706101345 -0.359 -0.970225195403623 0.0174430273096091 -0.359 -0.967924323660081 0.0255 -0.359 -0.964167295593006 0.0327821680940135 -0.359 -0.959068266599068 0.0390682665990679 -0.359 -0.952782168094014 0.0441672955930064 -0.359 -0.9455 0.0479243236600813 -0.359 -0.937443027309609 0.0502251954036226 -0.359 -0.928856057061013 0.051 -0.359 -0.92 0.0502251954036226 -0.359 -0.911143942938987 0.0479243236600813 -0.359 -0.902556972690391 0.0441672955930064 -0.359 -0.8945 0.0390682665990679 -0.359 -0.887217831905987 0.0327821680940135 -0.359 -0.880931733400932 0.0255 -0.359 -0.875832704406994 0.0174430273096092 -0.359 -0.872075676339919 0.00885605706101351 -0.359 -0.869774804596377 7.41911415115537e-17 -0.359 -0.869 -0.00885605706101336 -0.359 -0.869774804596377 -0.017443027309609 -0.359 -0.872075676339919 -0.0254999999999999 -0.359 -0.875832704406994 -0.0327821680940134 -0.359 -0.880931733400932 -0.0390682665990678 -0.359 -0.887217831905986 -0.0441672955930063 -0.359 -0.8945 -0.0479243236600813 -0.359 -0.902556972690391 -0.0502251954036226 -0.359 -0.911143942938986 -0.051 -0.359 -0.92 -0.0502251954036226 -0.359 -0.928856057061013 -0.0479243236600814 -0.359 -0.937443027309609 -0.0441672955930065 -0.359 -0.9455 -0.039068266599068 -0.359 -0.952782168094013 -0.0327821680940137 -0.359 -0.959068266599068 -0.0255000000000002 -0.359 -0.964167295593006 -0.0174430273096093 -0.359 -0.967924323660081 -0.00885605706101367 -0.359 -0.970225195403623 0 -0.359 -0.92 0.051 2.55465136891897e-18 0.0502251954036226 0.00885605706101344 0.0479243236600813 0.0174430273096091 0.0441672955930064 0.0255 0.0390682665990679 0.0327821680940135 0.0327821680940135 0.0390682665990679 0.0255 0.0441672955930064 0.0174430273096091 0.0479243236600813 0.00885605706101346 0.0502251954036226 4.5502609926501e-18 0.051 -0.00885605706101344 0.0502251954036226 -0.0174430273096091 0.0479243236600813 -0.0255 0.0441672955930064 -0.0327821680940135 0.0390682665990679 -0.0390682665990679 0.0327821680940135 -0.0441672955930063 0.0255 -0.0479243236600813 0.0174430273096092 -0.0502251954036226 0.00885605706101351 -0.051 7.19435904079913e-17 -0.0502251954036226 -0.00885605706101336 -0.0479243236600814 -0.017443027309609 -0.0441672955930064 -0.0254999999999999 -0.039068266599068 -0.0327821680940134 -0.0327821680940136 -0.0390682665990678 -0.0255000000000001 -0.0441672955930063 -0.0174430273096092 -0.0479243236600813 -0.00885605706101358 -0.0502251954036226 -1.48105404893309e-16 -0.051 0.0088560570610133 -0.0502251954036226 0.0174430273096089 -0.0479243236600814 0.0254999999999998 -0.0441672955930065 0.0327821680940134 -0.039068266599068 0.0390682665990677 -0.0327821680940137 0.0441672955930063 -0.0255000000000002 0.0479243236600813 -0.0174430273096093 0.0502251954036226 -0.00885605706101367 -2.38863291125713e-18 2.55465136891897e-18 37 10 11 37 11 12 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 +37 36 1 0 +0.059 1.10588621593521e-17 1.03 0.0581036574277203 0.0102452424823489 1.03 0.0554418646263686 0.0201791884562144 1.03 0.0510954988232819 0.0294999999999999 1.03 0.0451966221440197 0.0379244689715057 1.03 0.0379244689715058 0.0451966221440197 1.03 0.0295 0.0510954988232819 1.03 0.0201791884562145 0.0554418646263686 1.03 0.0102452424823489 0.0581036574277203 1.03 3.61258874377601e-18 0.059 1.03 -0.0102452424823489 0.0581036574277203 1.03 -0.0201791884562145 0.0554418646263686 1.03 -0.0295 0.0510954988232819 1.03 -0.0379244689715058 0.0451966221440197 1.03 -0.0451966221440197 0.0379244689715057 1.03 -0.0510954988232819 0.0295000000000001 1.03 -0.0554418646263686 0.0201791884562144 1.03 -0.0581036574277203 0.0102452424823489 1.03 -0.059 1.10588621593521e-17 1.03 -0.0581036574277203 -0.0102452424823489 1.03 -0.0554418646263686 -0.0201791884562143 1.03 -0.0510954988232819 -0.0294999999999998 1.03 -0.0451966221440198 -0.0379244689715057 1.03 -0.0379244689715059 -0.0451966221440196 1.03 -0.0295000000000001 -0.0510954988232819 1.03 -0.0201791884562146 -0.0554418646263686 1.03 -0.010245242482349 -0.0581036574277203 1.03 -1.6804534651825e-16 -0.0590000000000001 1.03 0.0102452424823487 -0.0581036574277203 1.03 0.0201791884562143 -0.0554418646263688 1.03 0.0294999999999998 -0.0510954988232821 1.03 0.0379244689715056 -0.0451966221440199 1.03 0.0451966221440196 -0.0379244689715061 1.03 0.0510954988232818 -0.0295000000000003 1.03 0.0554418646263685 -0.0201791884562148 1.03 0.0581036574277202 -0.0102452424823491 1.03 0 1.10588621593521e-17 1.03 0.059 3.11030498231779e-18 0.0581036574277203 0.0102452424823489 0.0554418646263686 0.0201791884562145 0.0510954988232819 0.0295 0.0451966221440197 0.0379244689715058 0.0379244689715058 0.0451966221440197 0.0295 0.0510954988232819 0.0201791884562145 0.0554418646263686 0.0102452424823489 0.0581036574277203 6.16301172422229e-18 0.059 -0.0102452424823489 0.0581036574277203 -0.0201791884562145 0.0554418646263686 -0.0295 0.0510954988232819 -0.0379244689715058 0.0451966221440197 -0.0451966221440197 0.0379244689715059 -0.0510954988232819 0.0295 -0.0554418646263686 0.0201791884562145 -0.0581036574277203 0.010245242482349 -0.059 8.63770318292045e-17 -0.0581036574277203 -0.0102452424823488 -0.0554418646263686 -0.0201791884562144 -0.0510954988232819 -0.0294999999999999 -0.0451966221440198 -0.0379244689715057 -0.0379244689715059 -0.0451966221440196 -0.0295000000000001 -0.0510954988232818 -0.0201791884562146 -0.0554418646263685 -0.010245242482349 -0.0581036574277202 -1.67309335873458e-16 -0.059 0.0102452424823487 -0.0581036574277203 0.0201791884562143 -0.0554418646263687 0.0294999999999998 -0.051095498823282 0.0379244689715056 -0.0451966221440198 0.0451966221440195 -0.037924468971506 0.0510954988232818 -0.0295000000000002 0.0554418646263685 -0.0201791884562147 0.0581036574277202 -0.0102452424823492 -7.75882179684939e-19 3.11030498231779e-18 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 37 11 12 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 + +TShapes 42 +Ve +1e-07 +-0.0452516081485031 0.0378588424682483 0.0040814575968276 +0 0 + +0101101 +* +Ve +2.00001e-07 +-0.0556827994439111 0.0195045083529212 -2.68188791487101e-18 +0 0 + +0101101 +* +Ed + 2.00001e-07 1 1 0 +1 1 0 0.43213918 1 +2 1 1 0 0.43213918 1 +2 2 2 0 0.43213918 1 +6 1 1 0 +6 2 2 0 +0 + +0101000 ++42 0 -41 0 * +Ed + 2.00001e-07 1 1 0 +1 2 0 0 0.43213918 +2 3 1 0 0 0.43213918 +2 4 2 0 0 0.43213918 +6 3 1 0 +6 4 2 0 +0 + +0101000 ++41 0 -42 0 * +Ve +1e-07 +-0.135378810567666 0.0655170218285604 -2.681887914871e-18 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 3 0 0.0579749730487216 0.15 +3 5 6CN 1 0 0.0579749730487216 0.15 +7 5 6 1 0 +0 + +0101000 ++41 0 -38 0 * +Ed + 1e-07 1 1 0 +1 4 0 0 6.28318530717959 +2 7 1 0 0 6.28318530717959 +2 8 3 0 0 6.28318530717959 +6 7 1 0 +6 8 3 0 +0 + +0101100 ++38 0 -38 0 * +Wi + +0101000 ++40 0 +39 0 -37 0 -36 0 +37 0 * +Fa +0 1e-07 1 0 +2 1 +0101000 ++35 0 * +Wi + +0101000 +-40 0 -39 0 * +Ve +3.42021715226519e-06 +0.0285134526101169 -0.0516525230498979 -0.877715450616494 +0 0 + +0101101 +* +Ve +3.42021715226519e-06 +-1.24909848089882e-17 -0.059 -0.971 +0 0 + +0101101 +* +Ed + 3.42021715226519e-06 1 1 0 +1 5 0 0.43213918 1 +2 9 4 0 0.43213918 1 +2 10 2 0 0.43213918 1 +6 9 2 0 +6 10 4 0 +0 + +0101000 ++32 0 -31 0 * +Ed + 3.42021715226519e-06 1 1 0 +1 6 0 0 0.43213918 +2 11 4 0 0 0.43213918 +2 12 2 0 0 0.43213918 +6 11 2 0 +6 12 4 0 +0 + +0101000 ++31 0 -32 0 * +Wi + +0101000 +-30 0 -29 0 * +Ve +1e-07 +0.059 -1.44503549751041e-17 -1.02 +0 0 + +0101101 +* +Ve +1.00000000058742e-07 +0.059 -1.44503549751041e-17 1.03 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 7 0 0 2.05 +3 13 14CN 2 0 0 2.05 +7 13 14 2 0 +0 + +0101000 ++27 0 -26 0 * +Ed + 1e-07 1 1 0 +1 8 0 0 6.28318530717959 +2 15 2 0 0 6.28318530717959 +2 16 5 0 0 6.28318530717959 +6 15 2 0 +6 16 5 0 +0 + +0101100 ++27 0 -27 0 * +Ed + 1e-07 1 1 0 +1 9 0 0 6.28318530717959 +2 17 2 0 0 6.28318530717959 +2 18 6 0 0 6.28318530717959 +2 19 7 0 0 6.28318530717959 +6 17 6 0 +6 18 2 0 +0 + +0101100 ++26 0 -26 0 * +Wi + +0101000 ++25 0 +24 0 -25 0 -23 0 * +Fa +0 1e-07 2 0 +2 2 +0101000 ++33 0 +28 0 +22 0 * +Wi + +0101000 ++36 0 * +Fa +0 1e-07 3 0 +2 3 +0101000 ++20 0 * +Ve +1e-07 +-1.24909848089882e-17 -0.359 -0.971 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 10 0 0.059 0.359 +3 20 21CN 4 0 0.059 0.359 +7 19 20 4 0 +0 + +0101000 ++31 0 -18 0 * +Ed + 1e-07 1 1 0 +1 11 0 0 6.28318530717959 +2 22 4 0 0 6.28318530717959 +2 23 8 0 0 6.28318530717959 +6 21 4 0 +6 22 7 0 +0 + +0101100 ++18 0 -18 0 * +Wi + +0101000 ++30 0 +29 0 -17 0 -16 0 +17 0 * +Fa +0 1e-07 4 0 +2 4 +0101000 ++15 0 * +Wi + +0101000 +-24 0 * +Fa +0 1e-07 5 0 +2 5 +0101000 +-13 0 * +Ve +1.00000000058742e-07 +0.059 -1.44503549751041e-17 1.03 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 12 0 1.5707963267949 3.14159265358979 +3 24 25G1 7 0 1.5707963267949 3.14159265358979 +7 23 24 6 0 +0 + +0101000 ++26 0 -11 1 * +Ed + 1e-07 1 1 0 +1 13 0 0 6.28318530717959 +2 18 9 0 0 6.28318530717959 +2 26 7 3 0 6.28318530717959 +2 27 7 4 0 6.28318530717959 +6 25 6 4 +6 26 8 0 +0 + +0101100 ++11 0 -11 0 * +Wi + +0101000 ++23 0 -10 0 -9 1 +10 0 * +Fa +0 1e-07 7 0 +2 6 +0101000 ++8 0 * +Wi + +0101000 ++16 0 * +Fa +0 1e-07 8 0 +2 7 +0101000 ++6 0 * +Wi + +0101000 ++9 0 * +Fa +0 1e-07 9 0 +2 8 +0101000 ++4 0 * +Sh + +0101000 ++34 0 +21 0 +19 0 +14 0 -12 0 +7 0 +5 0 +3 1 * +So + +0100000 ++2 0 * + ++1 0 \ No newline at end of file diff --git a/src/TEST_PY/recettes/tuyauterie.py b/src/TEST_PY/recettes/tuyauterie.py new file mode 100644 index 0000000..d18e76d --- /dev/null +++ b/src/TEST_PY/recettes/tuyauterie.py @@ -0,0 +1,259 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Francis KLOSS : 2012 : CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France +# ======================================================================================== + +import math + +import geompy +import hexablock + +# Charger la géométrie +# ==================== + +nom = "tuyauterie" + +geometrie = geompy.ImportBREP(nom+".brep") + +# Sélectionner des sous-parties de la géométrie +# --------------------------------------------- + +sommets = geompy.SubShapeAllSortedCentres(geometrie, geompy.ShapeType["VERTEX"]) +aretes = geompy.SubShapeAllSortedCentres(geometrie, geompy.ShapeType["EDGE" ]) +faces = geompy.SubShapeAllSortedCentres(geometrie, geompy.ShapeType["FACE" ]) + +petit_arri_v = sommets[0] +petit_arri_x, petit_arri_y, petit_arri_z = geompy.PointCoordinates(petit_arri_v) +petit_avan_x, petit_avan_y, petit_avan_z = geompy.PointCoordinates(sommets[1]) + +moyen_arri_v = sommets[3] +moyen_arri_x, moyen_arri_y, moyen_arri_z = geompy.PointCoordinates(moyen_arri_v) +moyen_avan_x, moyen_avan_y, moyen_avan_z = geompy.PointCoordinates(sommets[4]) + +petit0, petit_x, petit_y, petit_z, petit1, petit2, petit3, petit_rayon = geompy.KindOfShape(aretes[0]) + +moyen0, moyen_x, moyen_y, moyen_z, moyen1, moyen2, moyen3, moyen_rayon = geompy.KindOfShape(aretes[4]) + +grand0, grand_xb, grand_yb, grand_zb, grand1, grand2, grand3, grand_rayon = geompy.KindOfShape(aretes[7]) +grand4, grand_xh, grand_yh, grand_zh, grand5, grand6, grand7, grand8 = geompy.KindOfShape(aretes[8]) + +grand_generat = aretes[11] + +arc0, arc_x, arc_y, arc_z, arc_dx, arc_dy, arc_dz, arc_rayon, arc_x1, arc_y1, arc_z1, arc_x2, arc_y2, arc_z2 = geompy.KindOfShape(aretes[12]) + +face_cylindre = faces[5] + +# Construire des géométries intermédiaires +# ---------------------------------------- + +arc_sc = geompy.MakeVertex(arc_x , arc_y , arc_z ) +arc_s1 = geompy.MakeVertex(arc_x1, arc_y1, arc_z1) +arc_s2 = geompy.MakeVertex(arc_x2, arc_y2, arc_z2) + +arc_a1 = geompy.MakeEdge(arc_sc, arc_s1) +arc_a2 = geompy.MakeEdge(arc_sc, arc_s2) + +# Construire le modèle de bloc +# ============================ + +doc = hexablock.addDocument(nom) + +# Construire le grand cylindre en 2 parties +# ----------------------------------------- + +grand_base = doc.addVertex(grand_xb, grand_yb, grand_zb) +grand_oppo = doc.addVertex(grand_xh, grand_yh, grand_zh) + +grand_dir_a = doc.addVectorVertices(grand_base, grand_oppo) +grand_dir_b = doc.addVectorVertices(grand_oppo, grand_base) + +grand_hauteur_a = grand_dir_a.getNorm()*0.20 +grand_hauteur_b = grand_dir_b.getNorm()*0.60 + +grand_cylindre_a = doc.addCylinder(grand_base, grand_dir_a, grand_rayon, grand_hauteur_a) +grand_cylindre_b = doc.addCylinder(grand_oppo, grand_dir_b, grand_rayon, grand_hauteur_b) + +# Construire le moyen cylindre +# ---------------------------- + +moyen_base = doc.addVertex(moyen_x, moyen_y, moyen_z) + +moyen_arri = doc.addVertex(moyen_arri_x, moyen_arri_y, moyen_arri_z) +moyen_avan = doc.addVertex(moyen_avan_x, moyen_avan_y, moyen_avan_z) + +moyen_dir = doc.addVectorVertices(moyen_arri, moyen_avan) + +moyen_hauteur = geompy.MinDistance(moyen_arri_v, grand_generat) - grand_rayon + +moyen_cylindre = doc.addCylinder(moyen_base, moyen_dir, moyen_rayon, moyen_hauteur) + +# Construire le petit cylindre +# ---------------------------- + +petit_base = doc.addVertex(petit_x, petit_y, petit_z) + +petit_arri = doc.addVertex(petit_arri_x, petit_arri_y, petit_arri_z) +petit_avan = doc.addVertex(petit_avan_x, petit_avan_y, petit_avan_z) + +petit_dir = doc.addVectorVertices(petit_arri, petit_avan) + +petit_hauteur = geompy.MinDistance(petit_arri_v, grand_generat) + +petit_cylindre = doc.addCylinder(petit_base, petit_dir, petit_rayon, petit_hauteur) + +# Construire les 2 cylindres qui s'intersectent +# --------------------------------------------- + +cylindres_gm = doc.makeCylinders(grand_cylindre_a, moyen_cylindre) +cylindres_gp = doc.makeCylinders(grand_cylindre_b, petit_cylindre) + +# Joindre les 2 croix +# ------------------- + +gm_quads = [] + +for i in xrange(1, -1, -1): + for j in xrange( [hexablock.CV_MAXI_INT, hexablock.CV_MAXI_EXT][i] ): + quad = cylindres_gm.getQuadIJ(hexablock.CYL_BIG, i, j, hexablock.CYL_BIG_SLICES) + gm_quads.append(quad) + +gp_q = cylindres_gp.getQuadIJ(hexablock.CYL_BIG, 1, hexablock.V_SW, hexablock.CYL_BIG_SLICES) + +gp_v0 = cylindres_gp.getVertexIJK(hexablock.CYL_BIG, 2, hexablock.V_S , hexablock.CYL_BIG_SLICES) +gp_v1 = cylindres_gp.getVertexIJK(hexablock.CYL_BIG, 2, hexablock.V_SW, hexablock.CYL_BIG_SLICES) + +gm_v0 = cylindres_gm.getVertexIJK(hexablock.CYL_BIG, 2, hexablock.V_E , hexablock.CYL_BIG_SLICES) +gm_v1 = cylindres_gm.getVertexIJK(hexablock.CYL_BIG, 2, hexablock.V_NE, hexablock.CYL_BIG_SLICES) + +prisme = doc.joinQuads(gm_quads, gp_q, gm_v0, gp_v0, gm_v1, gp_v1, 1) + +# Ajouter le coude au grand cylindre +# ---------------------------------- + +coude_quads = [] + +for i in xrange(1, -1, -1): + for j in xrange( [hexablock.CV_MAXI_INT, hexablock.CV_MAXI_EXT][i] ): + quad = cylindres_gp.getQuadIJ(hexablock.CYL_BIG, i, j, 0) + coude_quads.append(quad) + +coude_centre = doc.addVertex(arc_x , arc_y , arc_z ) +coude_dir = doc.addVector(arc_dx, arc_dy, arc_dz) +coude_angle = geompy.GetAngle(arc_a1, arc_a2) + +coude = doc.revolutionQuads(coude_quads, coude_centre, coude_dir, [coude_angle]) + +# Associer la géométrie au modèle de bloc +# ======================================= + +doc.setShape(geometrie) + +# Associer les arêtes du modèle issues du joinQuads +# ------------------------------------------------- + +for i in xrange(hexablock.CV_MAXI_EXT): + asso_h = prisme.getHexa(i) + asso_a = [ hexablock.E_CE, hexablock.E_CF, hexablock.E_CE, hexablock.E_CF, hexablock.E_CE, hexablock.E_CF, hexablock.E_CE, hexablock.E_CF ][i] + asso_e = asso_h.getEdge(asso_a) + asso_s1 = asso_e.getVertex(0) + asso_s2 = asso_e.getVertex(1) + asso_v1 = asso_s1.getAssociation() + asso_v2 = asso_s2.getAssociation() + x1, y1, z1 = geompy.PointCoordinates(asso_v1) + x2, y2, z2 = geompy.PointCoordinates(asso_v2) + asso_pts = [ asso_v1 ] + n = 9 + pas = math.sqrt( (x2-x1)**2 + (y2-y1)**2 + (z2-z1)**2 ) / n + for i in xrange(1, n): + x = x1 + (x2 - x1) * i * pas + y = y1 + (y2 - y1) * i * pas + z = z1 + (z2 - z1) * i * pas + asso_v = geompy.MakeVertexOnSurfaceByCoord(face_cylindre, x, y, z) + asso_pts.append(asso_v) + asso_pts.append(asso_v2) + asso_curve = geompy.MakeInterpol(asso_pts) + asso_e.addAssociation(asso_curve, 0, 1) + +# Associer les quadrangles du modèle issues du joinQuads +# ------------------------------------------------------ + +for i in xrange(hexablock.CV_MAXI_EXT): + asso_h = prisme.getHexa(i) + asso_f = [ hexablock.Q_C, hexablock.Q_F, hexablock.Q_E, hexablock.Q_F, hexablock.Q_E, hexablock.Q_F, hexablock.Q_E, hexablock.Q_F ][i] + asso_q = asso_h.getQuad(asso_f) + asso_q.addAssociation(face_cylindre) + +# Mailler le modèle de bloc +# ========================= + +# Définir 4 groupes de faces +# -------------------------- + +groupe_d_grand = doc.addQuadGroup("grand:disque") +groupe_d_moyen = doc.addQuadGroup("moyen:disque") +groupe_d_petit = doc.addQuadGroup("petit:disque") +groupe_d_coude = doc.addQuadGroup("coude:disque") + +for i in xrange(2): + for j in xrange( [hexablock.CV_MAXI_INT, hexablock.CV_MAXI_EXT][i] ): + quad = cylindres_gm.getQuadIJ(hexablock.CYL_BIG , i, j, 0) + groupe_d_grand.addElement(quad) + + quad = cylindres_gm.getQuadIJ(hexablock.CYL_SMALL, i, j, 0) + groupe_d_moyen.addElement(quad) + + quad = cylindres_gp.getQuadIJ(hexablock.CYL_SMALL, i, j, 0) + groupe_d_petit.addElement(quad) + +for i in xrange( hexablock.CV_MAXI_INT + hexablock.CV_MAXI_EXT ): + h = coude.getHexa(i) + quad = h.getQuad(hexablock.Q_B) + groupe_d_coude.addElement(quad) + +# Définir 3 groupes de volumes +# ---------------------------- + +groupe_grand = doc.addHexaGroup("grand") +groupe_moyen = doc.addHexaGroup("moyen") +groupe_petit = doc.addHexaGroup("petit") + +for i in xrange( doc.countUsedHexa() ): + h = doc.getUsedHexa(i) + groupe_grand.addElement(h) + +for i in xrange(2): + for j in xrange( [hexablock.CV_MAXI_INT, hexablock.CV_MAXI_EXT][i] ): + h = cylindres_gm.getHexaIJK(hexablock.CYL_SMALL, i, j, 0) + groupe_moyen.addElement(h) + groupe_grand.removeElement(h) + + h = cylindres_gp.getHexaIJK(hexablock.CYL_SMALL, i, j, 0) + groupe_petit.addElement(h) + groupe_grand.removeElement(h) + +# Mailler le modèle de bloc avec ses associations +# ----------------------------------------------- + +hexablock.addLaws(doc, 0.02, True) + +blocs = hexablock.mesh(doc) + +muv, mue, muq, muh = hexablock.dump(doc, blocs) diff --git a/src/TEST_PY/tees.brep b/src/TEST_PY/tees.brep new file mode 100755 index 0000000..9caa182 --- /dev/null +++ b/src/TEST_PY/tees.brep @@ -0,0 +1,648 @@ +DBRep_DrawableShape + +CASCADE Topology V1, (c) Matra-Datavision +Locations 8 +1 +1.11022302462516e-16 0 1 0 + 0 1 0 0 + -1 0 1.11022302462516e-16 400 +1 + 1 0 0 190 + 0 1 0 0 + 0 0 1 380 +1 + 1 0 0 190 + 0 1 0 0 + 0 0 1 220 +2 1 -1 0 +2 2 -1 0 +2 2 1 3 -1 0 +2 3 -1 0 +2 3 1 2 -1 0 +Curve2ds 38 +1 0 800 1 0 +2 0 0 1 0 -0 1 100 +7 0 0 8 23 4 5.7595865315812871 400 5.7595865315812871 396.4531264233774 5.7629069293083175 392.92833608277681 5.7694749436140853 389.51230084494648 5.7788372822703087 386.24424709027198 5.7905468978363102 383.14348794697975 5.8042009023008854 380.21545709727701 5.8195042660091962 377.45508725218542 5.8543892203674739 372.04985730479018 5.8742056575325181 369.42820567367704 5.89564313364939 366.96284011636072 5.9186431153591617 364.64644480202827 5.9431911157077195 362.47799188863092 5.969306315324145 360.46051727651405 5.997060367620036 358.60197280754011 6.0537021647479774 355.37514358939779 6.082311505809308 353.97770142062154 6.1125302711814751 352.74076825489283 6.1443482006914323 351.69171562635694 6.1776550181455665 350.86267948835513 6.212224813535169 350.28862243838159 6.2476523776714217 350.00000035532935 6.2831853071795862 350 + 0 9 0.32715155003298801 7 0.67848367377663077 7 1 9 +7 0 0 8 23 4 4.7123889803846897 86.602540378443834 4.7833264519171417 86.602540378443834 4.8538221133434041 86.768554360301735 4.9226876586617614 87.096991301102832 4.9896492478955832 87.559643674082267 5.0546217349220237 88.124612677936994 5.1177137403899753 88.763476885346691 5.1791713917111073 89.453947255999054 5.3042530285650589 90.961452312325122 5.3677102240744938 91.784169844339971 5.4305599185356694 92.631457510690808 5.4932602887666402 93.488642372673752 5.5562165742572436 94.341495300176803 5.6198260616794098 95.175736723592024 5.6845162320744418 95.976668732951339 5.8116848841313695 97.413920783548804 5.8739248236055932 98.05887438439521 5.9379452637785519 98.646808131231438 6.0038837402756018 99.157716247916923 6.071712633333922 99.568620170602287 6.1412648768472247 99.855699662295933 6.2121194481632589 99.999999822335369 6.2831853071795862 100 + 0 9 0.32715155003298801 7 0.67848367377663077 7 1 9 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +1 0 0 1 0 +2 0 0 1 0 -0 1 100 +7 0 0 8 23 4 0 350 0.033576530560921469 349.99999966423474 0.067082892452182463 350.25770810060493 0.099869308879887875 350.77111458667099 0.13156628624254196 351.51570531988671 0.16195866809536152 352.46209608878792 0.19093398028496456 353.58237755135616 0.21846654983792213 354.85222820605424 0.27426368959368119 357.84920888955003 0.3021491186068328 359.61622715531161 0.32842484744605827 361.54040041871144 0.35316416580412735 363.61204164396673 0.37639683220717668 365.8264229027584 0.39812537333505649 368.18305324271273 0.41831630740511905 370.68769525783222 0.4557439761033848 376.0736018517199 0.47292011875991768 378.9594576910697 0.48830018181480117 382.03427944841542 0.50156023379092929 385.30662787333353 0.51222803597861422 388.77333266748747 0.51976991720685906 392.41514581060738 0.52359877559829915 396.1912597343462 0.52359877559829915 400 + 0 9 0.30404471865854837 7 0.64918916271671423 7 1 9 +7 0 0 8 23 4 -8.8817841970012523e-16 100 0.06715306112184205 100.00000016788263 0.13416540811772926 99.871153979566813 0.2000859947170639 99.614413693494853 0.26450877997241218 99.244989236204376 0.32725315809820543 98.782719490159323 0.38826782246932368 98.247314081382243 0.44764126817363259 97.656293340043064 0.57139795897359669 96.305069830741061 0.63542889192342944 95.53220561073141 0.69827952069100885 94.722154327366113 0.76035187352387279 93.8895784161206 0.82202051989645941 93.048311226451347 0.8836693219130547 92.211706870163411 0.9457321983952216 91.393072001530811 1.0730247241787252 89.809460344875689 1.138267311008704 89.045865019642434 1.2052426425872236 88.333353522290537 1.2742871129404838 87.697209384435382 1.3455881079195908 87.171127692761559 1.4190994971417732 86.793973628457834 1.4946215214818199 86.602540378443862 1.5707963267948957 86.602540378443862 + 0 9 0.30404471865854837 7 0.64918916271671423 7 1 9 +7 0 0 8 23 4 0 450 0.033576535464432844 450 0.06708288862795353 449.74229256882165 0.099869310240679354 449.22888491692595 0.13156628503243795 448.48429456674455 0.16195866455356001 447.53790447273542 0.19093398418656715 446.41762209624159 0.21846654988386938 445.14777179147779 0.27426368959368741 442.15079111044957 0.3021491186068106 440.38377284469061 0.32842484744608935 438.45959958128537 0.3531641658041238 436.38795835603389 0.37639683220714382 434.17357709724484 0.39812537333508846 431.81694675728357 0.41831630740511105 429.31230474216915 0.45574397610337858 423.92639814828101 0.4729201187599914 421.04054230892496 0.48830018181460044 417.96572055159834 0.50156023379119397 414.6933721266472 0.51222803597843036 411.22666733252822 0.51976991720691501 407.58485418938534 0.52359877559829915 403.80874026565544 0.52359877559829915 400 + 0 9 0.30404471828653629 7 0.64918916252934122 7 1 9 +7 0 0 8 23 4 3.1415926535897931 100 3.0744395826609292 100 3.0074272532690807 99.871154312247398 2.9415066557379972 99.614413450152753 2.8770838762873723 99.24498917729909 2.8143395030913991 98.782719765237147 2.7533248227475049 98.247313911151892 2.6939513853142487 97.656293338930354 2.5701946946161791 96.305069830740877 2.5061637616664392 95.532205610732049 2.4433131328986759 94.722154327365189 2.3812407800659359 93.889578416120742 2.319572133693443 93.048311226452213 2.257923331676631 92.211706870162374 2.195860455194603 91.393072001531209 2.0685679294110897 89.809460344875959 2.003325342581054 89.04586501964134 1.9363500110025664 88.333353522292768 1.8673055406493542 87.697209384432796 1.7960045456701803 87.171127692763221 1.7224931564479862 86.793973628457351 1.6469711321080045 86.602540378443862 1.5707963267948963 86.602540378443862 + 0 9 0.30404471828653629 7 0.64918916252934122 7 1 9 +7 0 0 8 23 4 5.7595865315812871 400 5.7595865315812871 403.54687357661732 5.7629069293083264 407.0716639172436 5.7694749436140578 410.487699155016 5.7788372822703495 413.75575290976724 5.7905468978362755 416.85651205299661 5.804200902300904 419.78454290273055 5.8195042660091909 422.54491274781367 5.8543892203674712 427.95014269520948 5.874205657532519 430.57179432632284 5.8956431336493971 433.03715988364036 5.9186431153591563 435.35355519797133 5.9431911157077124 437.52200811136817 5.9693063153241566 439.53948272348691 5.9970603676200325 441.39802719245961 6.0537021647981906 444.62485641346274 6.0823115099356198 446.02229896119849 6.1125302674090722 447.25923114449233 6.1443481994298761 448.30828448674504 6.1776550195756252 449.13732104001321 6.2122248094106727 449.71137685489032 6.2476523829853585 450 6.2831853071795862 450 + 0 9 0.32715154983796968 7 0.67848367337201809 7 1 9 +7 0 0 8 23 4 4.7123889803846897 86.602540378443834 4.6414515088523443 86.602540378443834 4.5709558474254868 86.76855436030219 4.5020903021086447 87.096991301101312 4.4351287128726282 87.559643674084498 4.3701562258480955 88.124612677935161 4.3070642203791722 88.7634768853476 4.2456065690582925 89.453947255998813 4.1205249322043267 90.961452312325036 4.0570677366948757 91.784169844340013 3.9942180422337055 92.631457510690936 3.9315176720027551 93.48864237267361 3.8685613865121442 94.341495300176661 3.8049518990899482 95.175736723592308 3.7402617286949473 95.976668732951225 3.6130930765252778 97.413920784822892 3.5508531282366924 98.058874567884871 3.4868327051487182 98.646807838009721 3.4208942233135531 99.157716307234637 3.3530653240854145 99.568620428735727 3.2835130923467619 99.855699311460796 3.2126585019782485 100 3.1415926535897931 100 + 0 9 0.32715154983796968 7 0.67848367337201809 7 1 9 +7 0 0 8 86 13 2.7300758075223057 190 2.7300758075223057 188.76161711057227 2.73198839472064 187.55133668015193 2.7356595879105567 186.40804485479049 2.7406522245640779 185.33795497726547 2.7466665999124618 184.34258844053036 2.7534345015999824 183.4162771353935 2.7608247966701325 182.54924607309326 2.7805106679886924 180.5313877921306 2.7934228662572296 179.44012090542088 2.8074042576548592 178.42489439075112 2.8224021612079322 177.47714125871727 2.8383853128399443 176.58765276942751 2.8553986657883739 175.75234570339671 2.8735299500160485 174.96696097018872 2.9096367995004702 173.60217638596475 2.927074703391964 173.01544757903642 2.9455701846587412 172.46336132523098 2.9653382299711857 171.94696597602535 2.9865550769566158 171.47070368601692 3.0094637838744882 171.044924719389 3.0342362135094789 170.68192128165288 3.0846904814586811 170.16788483391167 3.110457736212882 169.98675095042276 3.1373772459573144 169.90241768877223 3.1644097931300808 169.92983296212577 3.1907387356792545 170.06246027525333 3.2157117427758561 170.28378283343829 3.2387860886964592 170.56795276727468 3.2857128896829386 171.28490034470798 3.3095267559518353 171.75813983885746 3.3315889559519829 172.28669212661248 3.3520793566732001 172.86264456356133 3.3712426139199891 173.47925753251525 3.3892171781517373 174.13467786991569 3.4061709628706178 174.82956714675092 3.4315765607080646 176.00111900189935 3.4406202276953 176.44739232078726 3.4493683641263591 176.90942117645849 3.4578076048696391 177.38676190073474 3.4659242604470752 177.87897923803828 3.473704317034132 178.38564634539176 3.4811334364598099 178.90634479241825 3.4952602825731667 179.97496970201598 3.5019582387828598 180.52299721930251 3.5082759977769666 181.08420673921333 3.5141984025436779 181.65818491571483 3.5197099661181288 182.24464543072799 3.5247948715823951 182.84342899412766 3.5294369720654961 183.45450334374323 3.5385783136065494 184.81704385450712 3.5430774304692174 185.60147540318962 3.5470027815210834 186.43393805468477 3.550193052094881 187.31387149619184 3.552464823959987 188.23647567906212 3.553634828362437 189.1915419192367 3.5535877444215225 190.16041200836165 3.5507263605782593 192.52143481281828 3.5466264819059488 193.84478773876532 3.540673500034889 195.06679581640853 3.5333903287665258 196.19442250073351 3.5251084225945828 197.2339901412731 3.516072019876451 198.19784034352128 3.5063476353219669 199.100910190511 3.4816461951625191 201.11765616922102 3.4662615750150878 202.17669187279171 3.4497197612770401 203.16359594026292 3.4319965274128248 204.08585426002017 3.4130562502099866 204.9499797977617 3.3927629809540236 205.75731315708825 3.370961354722068 206.5085724462667 3.3350837042681274 207.55059273349855 3.3227385987925833 207.87877699148535 3.3101400373711489 208.18373555748497 3.2973072930831178 208.46471177911445 3.2842597447996993 208.72099547901203 3.2710176981806867 208.95192203202214 3.2576032066711278 209.15687144238044 3.2326080049219881 209.48565334621975 3.2207392065634544 209.6214488622964 3.2084220832166892 209.74086778055747 3.1956632541851522 209.841223344334 3.1824987868080563 209.9195218531847 3.1690046109869345 209.9730562872202 3.1553069337122155 209.99999993142859 3.1415926535897936 210 + 0 9 0.073876687960228921 7 0.18146279930185341 7 0.27297502317927325 7 0.35146796836731969 7 0.45078644852611266 7 0.50839166691615778 7 0.56599530822916722 7 0.63428155117843577 7 0.73589383894819183 7 0.87241439129297038 7 0.94164192250558687 7 1 9 +7 0 0 8 86 13 1.5707963267948968 65.825756949558411 1.6327154712662824 65.825756949558411 1.6932291717524472 65.864006867500905 1.7507575795202066 65.937442892223871 1.8052712051910964 66.036312569896907 1.856761496125801 66.15335170344234 1.9055415063953094 66.282483552944811 1.952099936317812 66.420471346860978 2.0629161296348029 66.778932482089601 2.1250872198225084 67.006800398456491 2.1853339544706767 67.244156185569551 2.2442620112456466 67.487414231305635 2.3025351264202438 67.733314062545347 2.3606629110135016 67.979402450812643 2.4192472016931634 68.223500209089394 2.5302050784324877 68.667615336463385 2.5817194923431264 68.866839100938464 2.6345541235314025 69.06107511247879 2.6893439271069774 69.248614551513228 2.746579728106743 69.426477008510119 2.8069200610078164 69.589274370436641 2.8708713445249514 69.730508107268591 2.9992017060969078 69.932606288496331 3.0640476966405026 70.004909868877107 3.1311719850682302 70.039355662624061 3.1983917367763195 70.028318240219718 3.2641727172498611 69.974453483590707 3.3272181349982342 69.886050094789667 3.3862870149554607 69.774683728264634 3.5081798163713582 69.498670248443474 3.5714250919605042 69.319625207022071 3.6315898963777626 69.124464927538256 3.6892108940849053 68.918088997427191 3.7449840031488155 68.70476714178713 3.7993700099136132 68.486956905337252 3.8529595443561395 68.266363258980974 3.937551875106212 67.914511323779521 3.9686270521261031 67.784481815413258 3.9997344878372516 67.654297451190075 4.0308853739217598 67.524679509972557 4.0620919606083179 67.396357443356322 4.0933675566722023 67.270068875670106 4.124726529435276 67.146559603975803 4.1876412188668342 66.906610876783731 4.2192025058601512 66.790155974378578 4.2508767385050721 66.677978633765278 4.2826801747989798 66.570823982696439 4.3146367579775191 66.469422533765098 4.346778116514594 66.374490184404721 4.3791435641223728 66.286728216889173 4.4504690845129815 66.11210000381476 4.491002003142964 66.024851515159256 4.5335175110851669 65.947703969718717 4.5780101363095511 65.884232047726371 4.6242947661492 65.838676004199897 4.671990288798467 65.815204415050005 4.7203649033722543 65.816217123196935 4.8385980686239742 65.873356695599171 4.9051850188102994 65.955074132754632 4.9674898644093322 66.072897682052684 5.0260608936826561 66.214413321800095 5.0812532833458581 66.371581754615221 5.1336879948128482 66.538559525712174 5.1841437822594489 66.713161178984919 5.3004316740301887 67.141550836337416 5.3644149845568734 67.397608881735124 5.4271937142726046 67.659694988105471 5.4894601011457427 67.92460429403188 5.5518865820242498 68.189151454086755 5.6151397004226302 68.450150063818768 5.6799108441584014 68.704352379472581 5.7820106096441055 69.070516194378229 5.8164404445381965 69.188355493726078 5.850946054836804 69.299959962125172 5.8855291296563488 69.404507511993899 5.9201917940156994 69.501233167507081 5.9549345429758302 69.589436335509944 5.9897541757794714 69.668488076432126 6.0540515696396966 69.796299944449615 6.084361898704401 69.849526935371983 6.1156117040988267 69.896686629941101 6.1478015408718143 69.936560691373231 6.1808677843451756 69.967806999600143 6.2146568822517638 69.989221486740504 6.2488996068735307 69.999999972571445 6.2831853071795862 70 + 0 9 0.073876687960228921 7 0.18146279930185341 7 0.27297502317927325 7 0.35146796836731969 7 0.45078644852611266 7 0.50839166691615778 7 0.56599530822916722 7 0.63428155117843577 7 0.73589383894819183 7 0.87241439129297038 7 0.94164192250558687 7 1 9 +7 0 0 8 23 4 3.1415926535897931 210 3.1210614961277394 210.00000010265583 3.1005291311075647 209.93977343220345 3.0802162982823336 209.81934542997405 3.060284995992693 209.64146807704995 3.0408510042354786 209.41030407615489 3.0219936054749454 209.13045541836325 3.0037625031966315 208.80633633462796 2.9570088239511896 207.83713099429386 2.9296594696116953 207.12197755130393 2.9040228867397606 206.31025246004447 2.8800610357605061 205.41069337265455 2.8577522026420392 204.42944864183883 2.8371056950111546 203.36899179251105 2.8181483011816177 202.22871149661322 2.7852216827921472 199.8723811516461 2.7709760875281595 198.67075640785762 2.7583507212744514 197.39099658337528 2.7475970196832398 196.03237707895312 2.739053731187802 194.5987376061355 2.7330886214394798 193.09989869850125 2.7300758075223053 191.554374056744 2.7300758075223053 190 + 0 9 0.23911948610599457 7 0.63591333721726562 7 1 9 +7 0 0 8 23 4 0 70 0.051327893655133572 70.000000041062307 0.1026585095332937 69.975913030090624 0.1536145142233849 69.927731557706068 0.20396142023838504 69.856930569898694 0.25355894084285602 69.765831025734656 0.30232997965063024 69.65711085521778 0.35024725499271447 69.533463217305211 0.47547900793230546 69.171622753195393 0.55125596438760471 68.911912620840965 0.62536924204793554 68.628209581487553 0.69830566983646758 68.329050162545343 0.77052910495163474 68.022247356855743 0.84253146084878594 67.71504812589032 0.91487134073599652 67.414277104885272 1.0559406020423046 66.864292017065196 1.1244501887663443 66.612974265628466 1.1944986103494166 66.379922852188102 1.2663529078851745 66.17381782714574 1.340143255040398 66.005326901049187 1.4158015554213002 65.886011034309178 1.4930776239576975 65.825756949558411 1.5707963267948966 65.825756949558411 + 0 9 0.23911948610599457 7 0.63591333721726562 7 1 9 +7 0 0 7 20 4 5.8716684611120975 190 5.8716684611120975 188.40529526822812 5.8749059028716166 186.81699263164407 5.8813321069643507 185.28146610968872 5.8904651265717982 183.8194733092634 5.9018780409367047 182.44087859992891 5.9151979318998391 181.14756859074458 5.9462084611711727 178.64894098900859 5.9641289663954833 177.45327801148096 5.9838251760732435 176.34076071834318 6.0052210062401752 175.31033358514742 6.0282871279818746 174.36355769593391 6.0530414572620703 173.50466322258802 6.1044269515590086 172.03087512917583 6.1308375000050619 171.40311466706285 6.1588814209752867 170.86877872094436 6.1884827860001463 170.44450690892319 6.2194178500469297 170.14859873510889 6.2512650406347934 170 6.2831853071795862 170 + 0 8 0.32749647483565042 6 0.67535626432716744 6 1 8 +7 0 0 7 20 4 4.7123889803846897 134.17424305044165 4.6326537437960944 134.17424305044165 4.5532394662454161 134.10950158823803 4.4756303392982897 133.98093441747497 4.4000913717954164 133.80144025823813 4.3266832464327729 133.58463698586775 4.2551915157717408 133.34204238483454 4.1106230834163906 132.80607638506953 4.0376765392582641 132.51031302161269 3.9653735469234719 132.20408324999829 3.8931647386010106 131.89522935165351 3.8205023141418311 131.591632576276 3.7468598154328787 131.30105579191766 3.6010565258622278 130.78164824019552 3.5290824764252773 130.54984232049199 3.4551199134103063 130.34511406165251 3.3790487521878019 130.1778232028887 3.3010107446235413 130.05943531939073 3.2213933199517744 130 3.1415926535897931 130 + 0 8 0.32749647483565042 6 0.67535626432716744 6 1 8 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +7 0 0 7 20 4 0 170 0.030225785850175768 170 0.060403942208535177 170.13323829157676 0.089809656452376707 170.39892023771003 0.11805541204867875 170.78166224300142 0.14492818020641529 171.26570088958786 0.17034350106111606 171.83645995042141 0.22097719814426409 173.20566738156501 0.24587007505197889 174.02300961145505 0.26911311729308007 174.92708234710466 0.29073064043857233 175.91279129804428 0.31070894112663172 176.97782263526184 0.32899625972681701 178.12264337007468 0.36230785920280351 180.61524721177804 0.37725325445837399 181.9676846606753 0.39011764872841503 183.41728858328361 0.40046937309713293 184.96339172675098 0.40780791812416606 186.59601333953287 0.41151684606748784 188.29315701982478 0.41151684606748784 190 + 0 8 0.30759457669048318 6 0.64982227833657946 6 1 8 +7 0 0 7 20 4 3.1415926535897931 130 3.0660281889643519 130 2.990583169127206 130.05329228421115 2.9164748151389448 130.15958274693631 2.8440992178683127 130.31074365945841 2.7736158232905277 130.49706344959191 2.70495819896867 130.70955796991018 2.5631379941723229 131.19840252074181 2.490285660793738 131.47942926704206 2.4185365367169682 131.77519479638855 2.3473926232230196 132.07805706842547 2.2763352439147004 132.38049995237745 2.2048371881245359 132.67525479805303 2.0576203695522826 133.23927066004759 1.9818085176967826 133.50790196241167 1.9039233721279634 133.75038739924142 1.8236483193528268 133.95324155007785 1.7409942942068719 134.10007506789546 1.6561384758036586 134.17424305044159 1.5707963267948966 134.17424305044159 + 0 8 0.30759457669048318 6 0.64982227833657946 6 1 8 +7 0 0 7 20 4 0 210 0.030225781949774877 210.00000015112892 0.060403947046212103 209.86676130590678 0.089809652021665798 209.60108031223749 0.11805541820573318 209.218337305402 0.14492817656264201 208.73429928613263 0.17034350101405416 208.16354005084071 0.22097719814238648 206.79433261849749 0.24587007505078695 205.97699038859366 0.26911311729224341 205.07291765293593 0.29073064043839469 204.0872087019697 0.31070894112672143 203.02217736473835 0.32899625972729307 201.87735662989815 0.36230785920336483 199.38475278817143 0.37725325445872215 198.03231533928286 0.390117648728741 196.58271141667572 0.40046937309720754 195.03660827322122 0.40780791812423445 193.40398666044547 0.41151684606748784 191.70684298016479 0.41151684606748784 190 + 0 8 0.30759457708374965 6 0.64982227853976171 6 1 8 +7 0 0 7 20 4 0 130 0.075564454874439413 129.99999993954845 0.15100949674968245 130.05329244438005 0.22511782661739943 130.15958252985621 0.29749345235156621 130.31074383584001 0.36797682046048319 130.49706338173036 0.43663445448953642 130.70955796945879 0.57845465941195773 131.19840252072038 0.65130699279232651 131.47942926702643 0.72305611686996407 131.77519479637638 0.79420003036601372 132.07805706842194 0.86525740967521614 132.38049995237844 0.9367554654670105 132.67525479806048 1.083972284040347 133.23927066005763 1.1597841358952055 133.50790196241874 1.237669281464072 133.75038739924679 1.3179443342382484 133.95324155008026 1.4005983593840572 134.10007506789648 1.4854541777866581 134.17424305044159 1.5707963267948966 134.17424305044159 + 0 8 0.30759457708374965 6 0.64982227853976171 6 1 8 +1 0 300 1 0 +2 0 0 1 0 -0 1 50 +7 0 0 7 20 4 5.8716684611120975 190 5.8716684611120975 191.59470473177032 5.8749059028716193 193.18300736835764 5.8813321069643223 194.71853389030395 5.8904651265718124 196.18052669073927 5.9018780409366576 197.55912140006541 5.9151979318998142 198.85243140925283 5.9462084611708423 201.35105901096543 5.9641289663948038 202.54672198847359 5.9838251760721368 203.65923928159609 6.0052210062386386 204.68966641477729 6.0282871279797714 205.63644230398049 6.0530414572594031 206.49533677731949 6.1044269515080547 207.96912486937774 6.1308374961490646 208.59688514306879 6.1588814275196162 209.13122176228288 6.1884827812567487 209.55549250885861 6.2194178552699579 209.85140168924835 6.2512650364101381 209.99999984039866 6.2831853071795862 210 + 0 8 0.32749647504072238 6 0.67535626474437049 6 1 8 +7 0 0 7 20 4 4.7123889803846897 134.17424305044165 4.792124216973205 134.17424305044165 4.871538494524069 134.109501588238 4.9491476214706687 133.98093441747562 5.0246865889741397 133.80144025823762 5.0980947143362885 133.58463698586883 5.1695864449974964 133.342042384835 5.3141548773514753 132.80607638507519 5.3871014215083353 132.51031302162392 5.4594044138419315 132.20408325001534 5.5316132221631182 131.89522935167579 5.60427564662095 131.59163257630365 5.677918145328567 131.30105579194895 5.8237214347629163 130.78164824070652 5.8956954738428466 130.54984239343437 5.9696580651840625 130.34511387364307 6.0457291958282866 130.17782343218008 6.1237672294309933 130.05943515068626 6.2033846302559654 130.00000006384056 6.2831853071795862 130 + 0 8 0.32749647504072238 6 0.67535626474437049 6 1 8 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +1 0 200 1 0 +2 0 0 1 0 -0 1 20 +1 0 40 1 0 +1 0 0 1 0 +2 0 0 1 0 -0 1 20 +1 0 160 1 0 +Curves 18 +2 0 0 800 0 0 1 1 0 -0 -0 1 0 100 +7 0 0 8 23 4 86.602540378443834 -50.000000000000043 400 86.602540378443834 -50.000000000000043 396.4531264233774 86.768554360301678 -49.712441623392252 392.92833608277681 87.096991301103003 -49.143655969881841 389.51230084494648 87.559643674082039 -48.329700648459557 386.24424709027198 88.124612677937151 -47.303758601946697 383.14348794697975 88.763476885346648 -46.096633933969066 380.21545709727701 89.453947255999054 -44.730534623268426 377.45508725218542 90.961452312325122 -41.584580251230875 372.04985730479018 91.784169844339857 -39.781402281845395 369.42820567367704 92.631457510690922 -37.81125762107866 366.96284011636072 93.48864237267378 -35.675359427746407 364.64644480202827 94.341495300176689 -33.371375094216411 362.47799188863092 95.175736723592081 -30.894400229760695 360.46051727651405 95.976668732951339 -28.235197605551782 358.60197280754011 97.413920783548775 -22.756398616550438 355.37514358939779 98.05887438439548 -19.967859727516355 353.97770142062154 98.646808131230941 -17.001060903351803 352.74076825489283 99.157716247916952 -13.856554777440659 351.69171562635694 99.568620170602742 -10.546176703746648 350.86267948835513 99.855699662295592 -7.0960544318152783 350.28862243838159 99.999999822335354 -3.55329295081635 350.00000035532935 100 0 350 + 0 9 0.32715155003298801 7 0.67848367377663077 7 1 9 +1 100 -2.4492127076447545e-14 0 0 0 1 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 100 +7 0 0 8 23 4 100 0 350 100.00000016788265 3.357653056092063 349.99999966423474 99.871153979567325 6.7082922507060294 350.25770810060493 99.614413693494157 9.9811535532793023 350.77111458667099 99.244989236204319 13.133667254014087 351.51570531988671 98.782719490160005 16.14106204554367 352.46209608878792 98.247314081381845 18.991065369133018 353.58237755135616 97.656293340043064 21.681267443995591 354.85222820605424 96.305069830741061 27.094898672399299 357.84920888955003 95.532205610731751 29.776083412862121 359.61622715531161 94.722154327365587 32.277992523382729 361.54040041871144 93.889578416120571 34.609753071732321 363.61204164396673 93.048311226451844 36.776998731952766 365.8264229027584 92.211706870163113 38.783329440035715 368.18305324271273 91.393072001530825 40.629443402342417 370.68769525783222 89.809460344875703 44.020678864939597 376.0736018517199 89.045865019642378 45.559762660744155 378.9594576910697 88.333353522290722 46.923337441037496 382.03427944841542 87.697209384435155 48.087216148864847 385.30662787333353 87.171127692761729 49.015295205844701 388.77333266748747 86.793973628457792 49.668405227687359 392.41514581060738 86.602540378443862 50 396.1912597343462 86.602540378443862 50 400 + 0 9 0.30404471865854837 7 0.64918916271671423 7 1 9 +7 0 0 8 23 4 100 0 450 100 3.3576535464432191 450 99.871154312247143 6.7082918702808545 449.74229256882165 99.614413450153194 9.9811536835594623 449.22888491692595 99.244989177299104 13.133667136739369 448.48429456674455 98.782719765236706 16.141061698735722 447.53790447273542 98.247313911152233 18.991065751063456 446.41762209624159 97.656293338930354 21.681267448453593 445.14777179147779 96.305069830740891 27.09489867239995 442.15079111044957 95.532205610732319 29.776083412860999 440.38377284469061 94.722154327364748 32.277992523383702 438.45959958128537 93.88957841612077 34.609753071732086 436.38795835603389 93.048311226452682 36.776998731951778 434.17357709724484 92.211706870162118 38.783329440037349 431.81694675728357 91.393072001531223 40.629443402341558 429.31230474216915 89.809460344875973 44.020678864939015 423.92639814828101 89.045865019641511 45.559762660746543 421.04054230892496 88.333353522292256 46.923337441033972 417.96572055159834 87.697209384433535 48.087216148866737 414.6933721266472 87.17112769276271 49.015295205845263 411.22666733252822 86.793973628457522 49.668405227686577 407.58485418938534 86.602540378443862 50 403.80874026565544 86.602540378443862 50 400 + 0 9 0.30404471828653629 7 0.64918916252934122 7 1 9 +7 0 0 8 23 4 86.602540378443834 -50.000000000000043 400 86.602540378443834 -50.000000000000043 403.54687357661732 86.768554360302232 -49.712441623391754 407.0716639172436 87.09699130110117 -49.143655969883547 410.487699155016 87.559643674084654 -48.329700648456935 413.75575290976724 88.124612677935062 -47.303758601949092 416.85651205299661 88.763476885347615 -46.096633933967624 419.78454290273055 89.453947255998813 -44.730534623268937 422.54491274781367 90.961452312325036 -41.584580251231031 427.95014269520948 91.784169844340013 -39.781402281845253 430.57179432632284 92.631457510690936 -37.811257621078354 433.03715988364036 93.488642372673581 -35.675359427746841 435.35355519797133 94.341495300176646 -33.37137509421671 437.52200811136817 95.175736723592308 -30.89440022975991 439.53948272348691 95.976668732951225 -28.235197605552226 441.39802719245961 97.413920784822892 -22.756398611693562 444.62485641346274 98.058874567884601 -19.967859324472435 446.02229896119849 98.646807838010218 -17.001061271986877 447.25923114449233 99.157716307234622 -13.856554899211012 448.30828448674504 99.568620428735201 -10.546176567483982 449.13732104001321 99.855699311461152 -7.0960548419637099 449.71137685489032 100 -3.5532924194227782 450 100 0 450 + 0 9 0.32715154983796968 7 0.67848367337201809 7 1 9 +7 0 0 8 86 13 190 20 445.82575694955841 188.76161711057227 20 445.82575694955841 187.55133668015193 19.91235337387026 445.86400686750096 186.40804485479049 19.744123905050216 445.93744289222383 185.33795497726547 19.514902285540977 446.03631256989695 184.34258844053036 19.237873159851539 446.15335170344235 183.4162771353935 18.925064118927583 446.28248355294483 182.54924607309326 18.582260868803356 446.42047134686101 180.5313877921306 17.665560569655433 446.7789324820896 179.44012090542088 17.061450737150739 447.00680039845656 178.42489439075112 16.40377787695131 447.2441561855693 177.47714125871727 15.694221315276218 447.4874142313061 176.58765276942751 14.933544392727526 447.73331406254499 175.75234570339671 14.118946812391625 447.97940245081276 174.96696097018872 13.245592454199262 448.22350020908942 173.60217638596475 11.495728687255017 448.66761533646343 173.01544757903642 10.646755069979088 448.86683910093825 172.46336132523098 9.7423084173559129 449.0610751124795 171.94696597602535 8.771423029278985 449.24861455151228 171.47070368601692 7.7249441623440038 449.42647700851086 171.044924719389 6.5904239412074901 449.58927437043644 170.68192128165288 5.3591604830220598 449.73050810726863 170.16788483391167 2.8445553031042996 449.93260628849634 169.98675095042276 1.5578500753039846 450.00490986887729 169.90241768877223 0.21126482985045633 450.03935566262362 169.92983296212577 -1.1418347912938847 450.02831824022019 170.06246027525333 -2.4583899354909087 449.97445348359048 170.28378283343829 -3.704622003922788 449.88605009478971 170.56795276727468 -4.8532125714778402 449.77468372826468 171.28490034470798 -7.1832615379201048 449.49867024844349 171.75813983885746 -8.3610693252848058 449.31962520702172 172.28669212661248 -9.4474000731872163 449.12446492753941 172.86264456356133 -10.451521549066081 448.91808899742563 173.47925753251525 -11.386037243846355 448.70476714178824 174.13467786991569 -12.258255622356449 448.48695690533697 174.82956714675092 -13.076870757778455 448.26636325898102 176.00111900189935 -14.297448989351548 447.91451132377955 176.44739232078726 -14.730560988794394 447.78448181541324 176.90942117645849 -15.148186634249697 447.65429745119013 177.38676190073474 -15.549790747042026 447.5246795099726 177.87897923803828 -15.934838498820188 447.39635744335635 178.38564634539176 -16.302795411557238 447.27006887567012 178.90634479241825 -16.653127357550481 447.14655960397596 179.97496970201598 -17.317464667277328 446.90661087678365 180.52299721930251 -17.631473643437698 446.79015597437859 181.08420673921333 -17.926789246506338 446.67797863376529 181.65818491571483 -18.202858939283349 446.57082398269648 182.24464543072799 -18.459115888765186 446.469422533765 182.84342899412766 -18.694978966144653 446.37449018440464 183.45450334374323 -18.909852746810909 446.28672821688906 184.81704385450712 -19.332245100108075 446.1121000038147 185.60147540318962 -19.539596822360508 446.02485151515918 186.43393805468477 -19.720072090406671 445.94770396971876 187.31387149619184 -19.866415718649087 445.8842320477263 188.23647567906212 -19.970468445414252 445.83867600419984 189.1915419192367 -20.02405348878451 445.81520441504995 190.16041200836165 -20.021926857902038 445.81621712319691 192.52143481281828 -19.89076336064802 445.87335669559917 193.84478773876532 -19.702761135389348 445.95507413275465 195.06679581640853 -19.429423733772833 446.07289768205271 196.19442250073351 -19.093863615052797 446.21441332180007 197.2339901412731 -18.710705503299977 446.37158175461525 198.19784034352128 -18.29082509447235 446.53855952571217 199.100910190511 -17.836992814585784 446.71316117898493 201.11765616922102 -16.678595142648216 447.14155083633744 202.17669187279171 -15.953143137007794 447.39760888173515 203.16359594026292 -15.168455096124706 447.6596949881054 204.08585426002017 -14.322479844337014 447.92460429403201 204.9499797977617 -13.41268261852915 448.1891514540867 205.75731315708825 -12.431663425542878 448.4501500638188 206.5085724462667 -11.371142075518817 448.7043523794726 207.55059273349855 -9.6150274534363902 449.07051619437817 207.87877699148535 -9.0090680862683605 449.18835549372614 208.18373555748497 -8.3889992621684186 449.29995996212511 208.46471177911445 -7.7557979054120896 449.40450751199393 208.72099547901203 -7.1104820307283623 449.50123316750705 208.95192203202214 -6.4541494263144097 449.5894363355099 209.15687144238044 -5.7880163368502879 449.66848807643208 209.48565334621975 -4.5448090320959809 449.7962999444498 209.6214488622964 -3.9537215627022064 449.84952693537196 209.74086778055747 -3.3395736896957944 449.89668662994114 209.841223344334 -2.702739282198082 449.93656069137319 209.9195218531847 -2.0451075411731523 449.9678069996001 209.9730562872202 -1.3706044135127382 449.98922148674052 209.99999993142859 -0.68571400612111455 449.9999999725714 210 -9.1940344226770776e-17 450 + 0 9 0.073876687960228921 7 0.18146279930185341 7 0.27297502317927325 7 0.35146796836731969 7 0.45078644852611266 7 0.50839166691615778 7 0.56599530822916722 7 0.63428155117843577 7 0.73589383894819183 7 0.87241439129297038 7 0.94164192250558687 7 1 9 +7 0 0 8 23 4 210 0 450 210.00000010265583 1.0265578731026479 450.00000004106238 209.93977343220345 2.0531775184097456 449.97591303009051 209.81934542997405 3.0681562548346761 449.92773155770618 209.64146807704995 4.0627445455190339 449.85693056989879 209.41030407615489 5.0306400381813221 449.76583102573477 209.13045541836325 5.967555357915689 449.65711085521787 208.80633633462796 6.8708596524406813 449.53346321730521 207.83713099429386 9.18036994382215 449.17162275319538 207.12197755130393 10.523829394329878 448.91191262084078 206.31025246004447 11.774932713181144 448.62820958148819 205.41069337265455 12.936028214861254 448.32905016254443 204.42944864183883 14.00912988520586 448.02224735685644 203.36899179251105 14.995089694532629 447.71504812589012 202.22871149661322 15.894132086087689 447.41427710488529 199.8723811516461 17.445880100292989 446.86429201706522 198.67075640785762 18.112500879287495 446.61297426562851 197.39099658337528 18.699329061251035 446.37992285218809 196.03237707895312 19.196046924645117 446.17381782714585 194.5987376061355 19.588584661696704 446.00532690104916 193.09989869850125 19.861934582966615 445.88601103430921 191.554374056744 20 445.82575694955841 190 20 445.82575694955841 + 0 9 0.23911948610599457 7 0.63591333721726562 7 1 9 +7 0 0 7 20 4 190 -20.000000000000004 354.17424305044159 188.40529526822812 -20.000000000000004 354.17424305044159 186.81699263164407 -19.85163748421305 354.10950158823778 185.28146610968872 -19.557176296119984 353.98093441747551 183.8194733092634 -19.137252010782827 353.80144025823751 182.44087859992891 -18.609272595736567 353.58463698586797 181.14756859074458 -17.988894519498103 353.34204238483449 178.64894098900859 -16.533946836137474 352.8060763850695 177.45327801148096 -15.688010730209923 352.51031302161272 176.34076071834318 -14.751671354023641 352.20408324999806 175.31033358514742 -13.726821040656557 351.89522935165371 174.36355769593391 -12.613431647889318 351.59163257627586 173.50466322258802 -11.409602762233769 351.30105579191763 172.03087512917583 -8.8933777413809842 350.78164824019547 171.40311466706285 -7.5928607668802197 350.54984232049196 170.86877872094436 -6.2046298165562233 350.34511406165245 170.44450690892319 -4.7324669523921434 350.1778232028887 170.14859873510889 -3.188373618690417 350.05943531939067 170 -1.5960133272396184 349.99999999999994 170 0 349.99999999999994 + 0 8 0.32749647483565042 6 0.67535626432716744 6 1 8 +1 50 -1.2246063538223773e-14 0 0 0 1 +7 0 0 7 20 4 170 0 350 170 1.5112892925088235 350 170.13323829157676 3.0201974972875441 350.05329228421118 170.39892023771003 4.4882262522719127 350.15958274693634 170.78166224300142 5.8937836338085239 350.31074365945841 171.26570088958786 7.2253835508502897 350.49706344959191 171.83645995042141 8.4787047126246602 350.70955796991018 173.20566738156501 10.962745615245275 351.19840252074181 174.02300961145505 12.175956849896046 351.47942926704201 174.92708234710466 13.300618833567951 351.77519479638875 175.91279129804428 14.338824970520468 352.07805706842532 176.97782263526184 15.29122457343451 352.38049995237753 178.12264337007468 16.156924091174648 352.67525479805306 180.61524721177804 17.724100774430205 353.23927066004762 181.9676846606753 18.42161104257076 353.50790196241178 183.41728858328361 19.017546268068447 353.75038739924128 184.96339172675098 19.493771560366365 353.95324155007802 186.59601333953287 19.830029166827707 354.10007506789543 188.29315701982478 19.999999999999982 354.17424305044159 190 19.999999999999982 354.17424305044159 + 0 8 0.30759457669048318 6 0.64982227833657946 6 1 8 +7 0 0 7 20 4 210 0 350 210.00000015112892 1.5112890974887772 349.99999993954845 209.86676130590678 3.0201977385758565 350.05329244438008 209.60108031223749 4.4882260331561916 350.15958252985627 209.218337305402 5.8937839375949101 350.31074383584001 208.73429928613263 7.2253833710765241 350.49706338173036 208.16354005084071 8.4787047103152631 350.70955796945879 206.79433261849749 10.962745615153812 351.19840252072038 205.97699038859366 12.175956849838967 351.47942926702643 205.07291765293593 13.300618833526656 351.77519479637635 204.0872087019697 14.338824970513437 352.07805706842197 203.02217736473835 15.291224573438482 352.38049995237844 201.87735662989815 16.156924091197233 352.67525479806051 199.38475278817143 17.724100774456375 353.23927066005763 198.03231533928286 18.421611042587735 353.50790196241871 196.58271141667572 19.017546268081134 353.75038739924679 195.03660827322122 19.493771560372139 353.95324155008029 193.40398666044547 19.830029166829849 354.10007506789646 191.70684298016479 19.999999999999982 354.17424305044159 190 19.999999999999982 354.17424305044159 + 0 8 0.30759457708374965 6 0.64982227853976171 6 1 8 +2 0 0 300 0 0 1 1 0 -0 -0 1 0 50 +7 0 0 7 20 4 190 -20.000000000000004 354.17424305044159 191.59470473177032 -20.000000000000004 354.17424305044165 193.18300736835764 -19.851637484212873 354.10950158823789 194.71853389030395 -19.557176296121398 353.98093441747574 196.18052669073927 -19.13725201078212 353.80144025823745 197.55912140006541 -18.609272595738776 353.58463698586883 198.85243140925283 -17.988894519499269 353.34204238483494 201.35105901096543 -16.533946836152985 352.80607638507519 202.54672198847359 -15.688010730242384 352.51031302162386 203.65923928159609 -14.751671354075334 352.2040832500154 204.68966641477729 -13.726821040731068 351.89522935167571 205.63644230398049 -12.613431647990538 351.59163257630365 206.49533677731949 -11.409602762363491 351.30105579194895 207.96912486937774 -8.8933777438768757 350.78164824070649 208.59688514306879 -7.592860956872455 350.54984239343435 209.13122176228288 -6.2046294940723943 350.34511387364302 209.55549250885861 -4.7324671867573436 350.17782343218005 209.85140168924835 -3.1883733582241396 350.05943515068623 209.99999984039866 -1.5960135384724008 350.0000000638405 210 0 349.99999999999994 + 0 8 0.32749647504072238 6 0.67535626474437049 6 1 8 +1 20 -4.898425415289509e-15 0 0 0 1 +2 0 0 200 0 0 1 1 0 -0 -0 1 0 20 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 20 +Polygon3D 0 +PolygonOnTriangulations 42 +37 73 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 74 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +12 1 3 4 5 6 7 8 9 10 11 12 2 +p 3.2000000008 1 0 0.0801396424729663 0.160279284945933 0.240418927418899 0.344059678311254 0.464269142020703 0.584478605730153 0.692667123068657 0.790036788673312 0.887406454277966 0.943703227138983 1 +12 57 58 59 60 61 62 63 64 65 66 67 56 +p 3.2000000008 1 0 0.0801396424729663 0.160279284945933 0.240418927418899 0.344059678311254 0.464269142020703 0.584478605730153 0.692667123068657 0.790036788673312 0.887406454277966 0.943703227138983 1 +2 13 2 +p 3.2000000008 1 0 350 +2 14 50 +p 3.2000000008 1 0 350 +37 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 13 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +12 50 52 53 54 55 56 57 58 59 60 61 51 +p 3.2000000008 1 0 0.0888380629088787 0.177676125817757 0.266514188726636 0.355352251635515 0.467860989729305 0.587792374656292 0.695730621090579 0.803668867524867 0.900813289315726 0.950406644657863 1 +12 90 91 92 93 94 95 96 97 98 99 100 79 +p 3.2000000008 1 0 0.0888380629088787 0.177676125817757 0.266514188726636 0.355352251635515 0.467860989729305 0.587792374656292 0.695730621090579 0.803668867524867 0.900813289315726 0.950406644657863 1 +12 62 63 64 65 66 67 68 69 70 71 72 51 +p 3.2000000008 1 0 0.088838293672055 0.17767658734411 0.266514881016165 0.35535317468822 0.467862075455604 0.587793771912878 0.695732298724425 0.803670825535972 0.900815499666364 0.950407749833182 1 +12 68 80 81 82 83 84 85 86 87 88 89 79 +p 3.2000000008 1 0 0.088838293672055 0.17767658734411 0.266514881016165 0.35535317468822 0.467862075455604 0.587793771912878 0.695732298724425 0.803670825535972 0.900815499666364 0.950407749833182 1 +2 110 74 +p 3.2000000008 1 450 800 +2 62 73 +p 3.2000000008 1 450 800 +12 1 111 112 113 114 115 116 117 118 119 120 110 +p 3.2000000008 1 0 0.0801396424251088 0.160279284850218 0.240418927275326 0.344059678105756 0.46426914174342 0.584478605381083 0.69266712265498 0.790036788201487 0.887406453747994 0.943703226873997 1 +12 57 69 70 71 72 73 74 75 76 77 78 68 +p 3.2000000008 1 0 0.0801396424251088 0.160279284850218 0.240418927275326 0.344059678105756 0.46426914174342 0.584478605381083 0.69266712265498 0.790036788201487 0.887406453747994 0.943703226873997 1 +33 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 2 +p 3.2000000008 1 0 0.0231285091459492 0.0462570182918985 0.0759211946456314 0.110613958364555 0.145306722083479 0.179999485802403 0.214692249521327 0.245915736868358 0.274016875480686 0.296778797756672 0.317854651715919 0.338930505675165 0.366113007484298 0.397726788423167 0.429340569362036 0.460954350300906 0.492568131239775 0.524181912178644 0.555795693117514 0.587409474056383 0.615861876901365 0.64146903946185 0.667076202022334 0.700055159658209 0.738465903498935 0.776876647339662 0.815287391180388 0.853698135021114 0.892108878861841 0.930519622702567 0.965259811351283 1 +33 2 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 50 +p 3.2000000008 1 0 0.0231285091459492 0.0462570182918985 0.0759211946456314 0.110613958364555 0.145306722083479 0.179999485802403 0.214692249521327 0.245915736868358 0.274016875480686 0.296778797756672 0.317854651715919 0.338930505675165 0.366113007484298 0.397726788423167 0.429340569362036 0.460954350300906 0.492568131239775 0.524181912178644 0.555795693117514 0.587409474056383 0.615861876901365 0.64146903946185 0.667076202022334 0.700055159658209 0.738465903498935 0.776876647339662 0.815287391180388 0.853698135021114 0.892108878861841 0.930519622702567 0.965259811351283 1 +12 2 34 35 36 37 38 39 40 41 42 43 1 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.354638225555721 0.467138225555721 0.568388225555721 0.669638225555721 0.770888225555721 0.872138225555721 0.936069112777861 1 +12 1 3 4 5 6 7 8 9 10 11 12 2 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.354638225555721 0.467138225555721 0.568388225555721 0.669638225555721 0.770888225555721 0.872138225555721 0.936069112777861 1 +12 44 46 47 48 49 50 51 52 53 54 55 45 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.355492542195797 0.467992542195797 0.569242542195797 0.670492542195797 0.771742542195797 0.872992542195797 0.936496271097899 1 +12 1 73 74 75 76 77 78 79 80 81 82 62 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.355492542195797 0.467992542195797 0.569242542195797 0.670492542195797 0.771742542195797 0.872992542195797 0.936496271097899 1 +2 56 45 +p 3.2000000008 1 100 170 +2 90 101 +p 3.2000000008 1 100 170 +12 101 103 104 105 106 107 108 109 110 111 112 102 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.354547464712528 0.467047464712528 0.568297464712528 0.669547464712528 0.770797464712528 0.872047464712528 0.936023732356264 1 +12 62 63 64 65 66 67 68 69 70 71 72 51 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.354547464712528 0.467047464712528 0.568297464712528 0.669547464712528 0.770797464712528 0.872047464712528 0.936023732356264 1 +12 113 114 115 116 117 118 119 120 121 122 123 102 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.35454746277783 0.46704746277783 0.56829746277783 0.66954746277783 0.77079746277783 0.87204746277783 0.936023731388915 1 +12 50 52 53 54 55 56 57 58 59 60 61 51 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.35454746277783 0.46704746277783 0.56829746277783 0.66954746277783 0.77079746277783 0.87204746277783 0.936023731388915 1 +2 161 125 +p 3.2000000008 1 210 300 +2 113 124 +p 3.2000000008 1 210 300 +37 124 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 125 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +12 44 162 163 164 165 166 167 168 169 170 171 161 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.35549254222606 0.46799254222606 0.56924254222606 0.67049254222606 0.77174254222606 0.87299254222606 0.93649627111303 1 +12 1 3 4 5 6 7 8 9 10 11 12 2 +p 3.2000000008 1 0 0.0833333333333333 0.166666666666667 0.25 0.35549254222606 0.46799254222606 0.56924254222606 0.67049254222606 0.77174254222606 0.87299254222606 0.93649627111303 1 +2 50 14 +p 3.2000000008 1 70 200 +2 1 13 +p 3.2000000008 1 70 200 +37 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 14 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +2 13 2 +p 3.2000000008 1 0 130 +2 14 50 +p 3.2000000008 1 0 130 +37 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 13 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +37 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 +p 3.2000000008 1 0 0.174532925199433 0.349065850398866 0.523598775598299 0.698131700797732 0.872664625997165 1.0471975511966 1.22173047639603 1.39626340159546 1.5707963267949 1.74532925199433 1.91986217719376 2.0943951023932 2.26892802759263 2.44346095279206 2.61799387799149 2.79252680319093 2.96705972839036 3.14159265358979 3.31612557878922 3.49065850398866 3.66519142918809 3.83972435438752 4.01425727958696 4.18879020478639 4.36332312998582 4.53785605518525 4.71238898038469 4.88692190558412 5.06145483078355 5.23598775598299 5.41052068118242 5.58505360638185 5.75958653158128 5.93411945678072 6.10865238198015 6.28318530717959 +Surfaces 8 +1 0 0 800 0 0 1 1 0 -0 -0 1 0 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 100 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 50 +1 0 0 0 0 0 1 1 0 -0 -0 1 0 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 20 +1 0 0 300 0 0 1 1 0 -0 -0 1 0 +1 0 0 200 0 0 1 1 0 -0 -0 1 0 +1 0 0 0 0 0 1 1 0 -0 -0 1 0 +Triangulations 9 +37 36 1 0 +100 -2.44921270764475e-14 800 98.4807753012208 17.364817766693 800 93.9692620785908 34.2020143325669 800 86.6025403784439 50 800 76.6044443118978 64.2787609686539 800 64.2787609686539 76.6044443118978 800 50 86.6025403784439 800 34.2020143325669 93.9692620785908 800 17.364817766693 98.4807753012208 800 6.12303176911189e-15 100 800 -17.364817766693 98.4807753012208 800 -34.2020143325669 93.9692620785908 800 -50 86.6025403784439 800 -64.2787609686539 76.6044443118978 800 -76.6044443118978 64.278760968654 800 -86.6025403784438 50.0000000000001 800 -93.9692620785908 34.202014332567 800 -98.4807753012208 17.3648177666932 800 -100 1.45472826493243e-13 800 -98.4807753012208 -17.3648177666929 800 -93.9692620785909 -34.2020143325667 800 -86.602540378444 -49.9999999999998 800 -76.604444311898 -64.2787609686538 800 -64.2787609686541 -76.6044443118977 800 -50.0000000000002 -86.6025403784437 800 -34.2020143325671 -93.9692620785908 800 -17.3648177666933 -98.4807753012208 800 -2.84822621217373e-13 -100 800 17.3648177666927 -98.4807753012209 800 34.2020143325666 -93.969262078591 800 49.9999999999997 -86.602540378444 800 64.2787609686536 -76.604444311898 800 76.6044443118976 -64.2787609686542 800 86.6025403784437 -50.0000000000004 800 93.9692620785907 -34.2020143325673 800 98.4807753012207 -17.3648177666935 800 0 0 800 100 0 98.4807753012208 17.364817766693 93.9692620785908 34.2020143325669 86.6025403784439 50 76.6044443118978 64.2787609686539 64.278760968654 76.6044443118978 50 86.6025403784438 34.2020143325669 93.9692620785908 17.364817766693 98.4807753012208 0 100 -17.364817766693 98.4807753012208 -34.2020143325669 93.9692620785908 -50 86.6025403784439 -64.2787609686539 76.6044443118979 -76.6044443118978 64.278760968654 -86.6025403784438 50.0000000000001 -93.9692620785908 34.202014332567 -98.4807753012208 17.3648177666932 -100 1.4210854715202e-13 -98.4807753012208 -17.3648177666929 -93.9692620785909 -34.2020143325667 -86.602540378444 -49.9999999999998 -76.604444311898 -64.2787609686538 -64.2787609686541 -76.6044443118977 -50.0000000000002 -86.6025403784437 -34.2020143325671 -93.9692620785908 -17.3648177666933 -98.4807753012208 -2.8421709430404e-13 -100 17.3648177666927 -98.4807753012209 34.2020143325666 -93.969262078591 49.9999999999997 -86.602540378444 64.2787609686536 -76.604444311898 76.6044443118976 -64.2787609686542 86.6025403784437 -50.0000000000004 93.9692620785907 -34.2020143325673 98.4807753012207 -17.3648177666935 0 0 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 37 11 12 +512 902 1 1.36386965972777 +86.6025403784438 -50 400 100 -1.83690953073357e-14 350 86.8732667031317 -49.5281290308752 393.146938099824 87.6235772593243 -48.1882631494736 386.662410602174 88.7290516622297 -46.1210945615935 380.690815213948 90.4840004397121 -42.5751772682387 373.782555238023 92.7428861391894 -37.3999606121917 366.815019461706 95.0372320329239 -31.11148437027 360.858265526469 96.9671604229308 -24.4411486760561 356.380850902333 98.4525657430885 -17.52405054016 353.171507010994 99.5231396908821 -9.75421483502655 350.960675236214 99.8776181649079 -4.94584264829443 350.245215525427 100 -2.44921270764475e-14 0 100 -2.44921270764475e-14 0 98.4807753012208 17.364817766693 0 93.9692620785908 34.2020143325669 0 86.6025403784439 50 0 76.6044443118978 64.2787609686539 0 64.2787609686539 76.6044443118978 0 50 86.6025403784439 0 34.2020143325669 93.9692620785908 0 17.364817766693 98.4807753012208 0 6.12303176911189e-15 100 0 -17.364817766693 98.4807753012208 0 -34.2020143325669 93.9692620785908 0 -50 86.6025403784439 0 -64.2787609686539 76.6044443118978 0 -76.6044443118978 64.278760968654 0 -86.6025403784438 50.0000000000001 0 -93.9692620785908 34.202014332567 0 -98.4807753012208 17.3648177666932 0 -100 1.45472826493243e-13 0 -98.4807753012208 -17.3648177666929 0 -93.9692620785909 -34.2020143325667 0 -86.602540378444 -49.9999999999998 0 -76.604444311898 -64.2787609686538 0 -64.2787609686541 -76.6044443118977 0 -50.0000000000002 -86.6025403784437 0 -34.2020143325671 -93.9692620785908 0 -17.3648177666933 -98.4807753012208 0 -2.84822621217373e-13 -100 0 17.3648177666927 -98.4807753012209 0 34.2020143325666 -93.969262078591 0 49.9999999999997 -86.602540378444 0 64.2787609686536 -76.604444311898 0 76.6044443118976 -64.2787609686542 0 86.6025403784437 -50.0000000000004 0 93.9692620785907 -34.2020143325673 0 98.4807753012207 -17.3648177666935 0 100 -1.83690953073357e-14 350 86.6025403784439 50 400 99.6995364250708 7.74612569392024 350.60366789119 98.8633045221148 15.0348597287602 352.314017004824 97.6290308111529 21.6465307979184 354.928638859964 96.1385098653288 27.5206644597269 358.255381554833 94.0483026744096 33.9840672064279 363.324622594048 91.7501351704928 39.7732665735241 369.700044024682 89.7799093309045 44.0405258154732 376.326552497693 88.0846161813635 47.3402622878728 383.90964254567 87.0125364098992 49.2830451608201 391.563087645832 86.7079761092912 49.8169333693719 395.72529258068 100 -2.44921270764475e-14 450 99.6995349038219 7.74614536115343 449.396329038004 98.8632990204773 15.0348959199349 447.685971589172 97.6290200022516 21.6465795167683 445.071337728308 96.1384934421685 27.5207218309807 441.744580622317 94.0482819113588 33.9841246665353 436.675324162327 91.7501087080715 39.7733276178202 430.299875845487 89.779880280166 44.0405850374743 423.673337329156 88.0845894011337 47.3403121169944 416.090210848718 87.0125187464446 49.2830763468782 408.43673018339 86.7079714631656 49.8169414560564 404.274613176575 100 -2.44921270764475e-14 800 100 -2.44921270764475e-14 800 98.4807753012208 17.364817766693 800 93.9692620785908 34.2020143325669 800 86.6025403784439 50 800 76.6044443118978 64.2787609686539 800 64.2787609686539 76.6044443118978 800 50 86.6025403784439 800 34.2020143325669 93.9692620785908 800 17.364817766693 98.4807753012208 800 6.12303176911189e-15 100 800 -17.364817766693 98.4807753012208 800 -34.2020143325669 93.9692620785908 800 -50 86.6025403784439 800 -64.2787609686539 76.6044443118978 800 -76.6044443118978 64.278760968654 800 -86.6025403784438 50.0000000000001 800 -93.9692620785908 34.202014332567 800 -98.4807753012208 17.3648177666932 800 -100 1.45472826493243e-13 800 -98.4807753012208 -17.3648177666929 800 -93.9692620785909 -34.2020143325667 800 -86.602540378444 -49.9999999999998 800 -76.604444311898 -64.2787609686538 800 -64.2787609686541 -76.6044443118977 800 -50.0000000000002 -86.6025403784437 800 -34.2020143325671 -93.9692620785908 800 -17.3648177666933 -98.4807753012208 800 -2.84822621217373e-13 -100 800 17.3648177666927 -98.4807753012209 800 34.2020143325666 -93.969262078591 800 49.9999999999997 -86.602540378444 800 64.2787609686536 -76.604444311898 800 76.6044443118976 -64.2787609686542 800 86.6025403784437 -50.0000000000004 800 93.9692620785907 -34.2020143325673 800 98.4807753012207 -17.3648177666935 800 100 -2.44921270764475e-14 450 86.8732667031312 -49.5281290308762 406.853061900168 87.6235772593223 -48.1882631494772 413.337589397812 88.7290516622257 -46.1210945616012 419.309184786033 90.484000439705 -42.5751772682538 426.217444761952 92.7428861391805 -37.3999606122139 433.184980538269 95.0372320329138 -31.1114843703007 439.141734473506 96.9671604293251 -24.4411486612818 443.619149110997 98.4525657314274 -17.5240505708509 446.828492965207 99.5231396846886 -9.7542149066232 449.039324751509 99.877618163893 -4.94584257239082 449.754784472325 -40.169542465297 -91.5773326655057 730.434782608696 -40.169542465297 -91.5773326655057 695.652173913043 -8.25793454723327 -99.658449300667 695.652173913043 -40.1695424652969 91.5773326655057 278.260869565217 -8.25793454723323 99.658449300667 278.260869565217 -40.1695424652969 91.5773326655057 243.478260869565 54.6948158122427 -83.7166478262529 139.130434782609 54.6948158122427 -83.7166478262529 104.347826086957 78.9140509396393 -61.4212712689668 104.347826086957 -67.7281571625741 -73.5723910673132 765.217391304348 -87.9473751206489 -47.5947393037073 765.217391304348 24.5485487140799 -96.9400265939331 139.130434782609 -67.7281571625741 -73.5723910673132 730.434782608696 -87.9473751206489 47.5947393037074 591.304347826087 -87.9473751206489 47.5947393037074 556.521739130435 -98.6361303402722 16.4594590280734 556.521739130435 -67.7281571625741 73.5723910673132 591.304347826087 -67.7281571625741 73.5723910673132 556.521739130435 24.5485487140799 -96.9400265939331 173.913043478261 -8.25793454723323 99.658449300667 313.04347826087 24.5485487140799 96.940026593933 278.260869565217 -8.25793454723327 -99.658449300667 139.130434782609 94.5817241700635 -32.4699469204684 591.304347826087 78.9140509396393 -61.4212712689668 556.521739130435 94.5817241700635 -32.4699469204684 556.521739130435 -8.25793454723327 -99.658449300667 173.913043478261 78.9140509396393 -61.4212712689668 591.304347826087 24.5485487140799 96.940026593933 313.04347826087 -67.7281571625741 73.5723910673132 626.086956521739 -40.1695424652969 91.5773326655057 591.304347826087 -40.1695424652969 91.5773326655057 626.086956521739 -8.25793454723327 -99.658449300667 208.695652173913 -40.169542465297 -91.5773326655057 208.695652173913 78.9140509396393 -61.4212712689668 626.086956521739 54.6948158122427 -83.7166478262529 626.086956521739 24.5485487140799 96.940026593933 347.826086956522 54.6948158122427 83.7166478262529 347.826086956522 -40.169542465297 -91.5773326655057 243.478260869565 -67.7281571625741 -73.5723910673132 243.478260869565 54.6948158122427 -83.7166478262529 660.869565217391 24.5485487140799 -96.9400265939331 660.869565217391 -67.7281571625741 -73.5723910673132 278.260869565217 -87.9473751206489 -47.5947393037073 243.478260869565 54.6948158122427 83.7166478262529 382.608695652174 78.9140509396394 61.4212712689668 347.826086956522 -40.1695424652969 91.5773326655057 660.869565217391 -8.25793454723323 99.658449300667 660.869565217391 -87.9473751206489 -47.5947393037073 278.260869565217 78.9140509396394 61.4212712689668 382.608695652174 24.5485487140799 -96.9400265939331 695.652173913043 -8.25793454723327 -99.658449300667 660.869565217391 -8.25793454723323 99.658449300667 695.652173913043 24.5485487140799 96.940026593933 660.869565217391 -87.9473751206489 -47.5947393037073 313.04347826087 -98.6361303402722 -16.4594590280734 313.04347826087 -98.6361303402722 -16.4594590280734 278.260869565217 24.5485487140799 96.940026593933 695.652173913043 -8.25793454723327 -99.658449300667 730.434782608696 -40.169542465297 -91.5773326655057 765.217391304348 78.9140509396394 61.4212712689668 417.391304347826 24.5485487140799 96.940026593933 730.434782608696 54.6948158122427 83.7166478262529 730.434782608696 54.6948158122427 83.7166478262529 765.217391304348 78.9140509396394 61.4212712689668 765.217391304348 78.9140509396394 61.4212712689668 730.434782608696 -98.6361303402722 -16.4594590280734 347.826086956522 -98.6361303402722 16.4594590280734 347.826086956522 94.5817241700635 -32.4699469204684 626.086956521739 94.5817241700635 -32.4699469204684 278.260869565217 94.5817241700635 -32.4699469204684 243.478260869565 78.9140509396393 -61.4212712689668 278.260869565217 78.9140509396393 -61.4212712689668 243.478260869565 -98.6361303402722 16.4594590280734 382.608695652174 -87.9473751206489 47.5947393037074 382.608695652174 94.5817241700635 32.4699469204683 452.173913043478 78.9140509396393 -61.4212712689668 660.869565217391 78.9140509396393 -61.4212712689668 313.04347826087 54.6948158122427 -83.7166478262529 313.04347826087 -87.9473751206489 47.5947393037074 417.391304347826 -67.7281571625741 73.5723910673132 417.391304347826 54.6948158122427 -83.7166478262529 695.652173913043 54.6948158122427 -83.7166478262529 347.826086956522 24.5485487140799 -96.9400265939331 347.826086956522 -67.7281571625741 73.5723910673132 452.173913043478 -40.1695424652969 91.5773326655057 452.173913043478 -40.1695424652969 91.5773326655057 417.391304347826 24.5485487140799 -96.9400265939331 730.434782608696 -8.25793454723327 -99.658449300667 34.7826086956522 -40.169542465297 -91.5773326655057 34.7826086956522 94.5817241700635 32.4699469204683 34.7826086956522 24.5485487140799 -96.9400265939331 382.608695652174 -8.25793454723327 -99.658449300667 347.826086956522 -8.25793454723327 -99.658449300667 765.217391304348 -8.25793454723327 -99.658449300667 382.608695652174 -40.1695424652969 91.5773326655057 486.956521739131 -8.25793454723323 99.658449300667 486.956521739131 94.5817241700635 -32.4699469204684 660.869565217391 78.9140509396394 61.4212712689668 34.7826086956522 -8.25793454723327 -99.658449300667 417.391304347826 -40.169542465297 -91.5773326655057 417.391304347826 -40.169542465297 -91.5773326655057 69.5652173913043 -67.7281571625741 -73.5723910673132 34.7826086956522 -67.7281571625741 -73.5723910673132 69.5652173913043 -8.25793454723323 99.658449300667 521.739130434783 24.5485487140799 96.940026593933 486.956521739131 24.5485487140799 96.940026593933 521.739130434783 78.9140509396393 -61.4212712689668 695.652173913043 -40.169542465297 -91.5773326655057 452.173913043478 -67.7281571625741 -73.5723910673132 452.173913043478 -67.7281571625741 -73.5723910673132 104.347826086957 -87.9473751206489 -47.5947393037073 104.347826086957 -87.9473751206489 -47.5947393037073 69.5652173913043 94.5817241700635 32.4699469204683 69.5652173913043 54.6948158122427 -83.7166478262529 730.434782608696 -67.7281571625741 -73.5723910673132 486.956521739131 -87.9473751206489 -47.5947393037073 486.956521739131 -87.9473751206489 -47.5947393037073 452.173913043478 -87.9473751206489 -47.5947393037073 139.130434782609 -98.6361303402722 -16.4594590280734 104.347826086957 24.5485487140799 -96.9400265939331 765.217391304348 24.5485487140799 96.940026593933 556.521739130435 54.6948158122427 83.7166478262529 556.521739130435 -98.6361303402722 -16.4594590280734 139.130434782609 54.6948158122427 83.7166478262529 34.7826086956522 -87.9473751206489 -47.5947393037073 521.739130434783 -98.6361303402722 -16.4594590280734 486.956521739131 94.5817241700635 -32.4699469204684 695.652173913043 54.6948158122427 83.7166478262529 591.304347826087 78.9140509396394 61.4212712689668 556.521739130435 -98.6361303402722 -16.4594590280734 173.913043478261 -98.6361303402722 16.4594590280734 173.913043478261 -98.6361303402722 -16.4594590280734 521.739130434783 78.9140509396394 61.4212712689668 591.304347826087 -98.6361303402722 16.4594590280734 208.695652173913 78.9140509396394 61.4212712689668 69.5652173913043 -87.9473751206489 47.5947393037074 208.695652173913 -98.6361303402722 -16.4594590280734 556.521739130435 78.9140509396393 -61.4212712689668 730.434782608696 54.6948158122427 -83.7166478262529 765.217391304348 -87.9473751206489 47.5947393037074 243.478260869565 -67.7281571625741 73.5723910673132 208.695652173913 -98.6361303402722 16.4594590280734 591.304347826087 78.9140509396394 61.4212712689668 626.086956521739 94.5817241700635 32.4699469204683 591.304347826087 -67.7281571625741 73.5723910673132 243.478260869565 94.5817241700635 32.4699469204683 626.086956521739 94.5817241700635 32.4699469204683 660.869565217391 94.5817241700635 -32.4699469204684 730.434782608696 94.5817241700635 32.4699469204683 104.347826086957 24.5485487140799 96.940026593933 34.7826086956522 78.9140509396393 -61.4212712689668 765.217391304348 -67.7281571625741 73.5723910673132 278.260869565217 -87.9473751206489 47.5947393037074 626.086956521739 94.5817241700635 -32.4699469204684 104.347826086957 78.9140509396393 -61.4212712689668 69.5652173913043 94.5817241700635 -32.4699469204684 69.5652173913043 94.5817241700635 -32.4699469204684 765.217391304348 -40.1695424652969 91.5773326655057 313.04347826087 -67.7281571625741 73.5723910673132 660.869565217391 78.9140509396393 -61.4212712689668 139.130434782609 -8.25793454723323 99.658449300667 347.826086956522 54.6948158122427 83.7166478262529 69.5652173913043 78.9140509396394 61.4212712689668 104.347826086957 54.6948158122427 -83.7166478262529 173.913043478261 24.5485487140799 -96.9400265939331 208.695652173913 -40.1695424652969 91.5773326655057 695.652173913043 -8.25793454723323 99.658449300667 730.434782608696 94.5817241700635 32.4699469204683 139.130434782609 24.5485487140799 96.940026593933 382.608695652174 24.5485487140799 96.940026593933 765.217391304348 -8.25793454723327 -99.658449300667 243.478260869565 -8.25793454723323 99.658449300667 34.7826086956522 54.6948158122427 83.7166478262529 417.391304347826 94.5817241700635 -32.4699469204684 313.04347826087 -40.169542465297 -91.5773326655057 278.260869565217 78.9140509396394 61.4212712689668 452.173913043478 -67.7281571625741 -73.5723910673132 313.04347826087 78.9140509396393 -61.4212712689668 347.826086956522 24.5485487140799 96.940026593933 69.5652173913043 54.6948158122427 83.7166478262529 104.347826086957 54.6948158122427 -83.7166478262529 382.608695652174 -87.9473751206489 -47.5947393037073 347.826086956522 94.5817241700635 32.4699469204683 486.956521739131 24.5485487140799 -96.9400265939331 417.391304347826 -98.6361303402722 -16.4594590280734 382.608695652174 78.9140509396394 61.4212712689668 139.130434782609 -98.6361303402722 16.4594590280734 417.391304347826 94.5817241700635 32.4699469204683 173.913043478261 -8.25793454723327 -99.658449300667 452.173913043478 24.5485487140799 -96.9400265939331 34.7826086956522 -40.169542465297 -91.5773326655057 486.956521739131 -87.9473751206489 47.5947393037074 452.173913043478 -40.1695424652969 91.5773326655057 34.7826086956522 -67.7281571625741 -73.5723910673132 521.739130434783 -8.25793454723327 -99.658449300667 69.5652173913043 -67.7281571625741 73.5723910673132 486.956521739131 -40.169542465297 -91.5773326655057 104.347826086957 -87.9473751206489 -47.5947393037073 556.521739130435 -8.25793454723323 99.658449300667 69.5652173913043 -40.1695424652969 91.5773326655057 521.739130434783 -67.7281571625741 -73.5723910673132 139.130434782609 24.5485487140799 96.940026593933 104.347826086957 -98.6361303402722 -16.4594590280734 591.304347826087 -87.9473751206489 -47.5947393037073 173.913043478261 -8.25793454723323 99.658449300667 556.521739130435 54.6948158122427 83.7166478262529 139.130434782609 -98.6361303402722 16.4594590280734 626.086956521739 -98.6361303402722 -16.4594590280734 208.695652173913 24.5485487140799 96.940026593933 591.304347826087 -87.9473751206489 47.5947393037074 660.869565217391 -98.6361303402722 16.4594590280734 243.478260869565 78.9140509396394 61.4212712689668 173.913043478261 94.5817241700635 32.4699469204683 208.695652173913 54.6948158122427 83.7166478262529 626.086956521739 -87.9473751206489 47.5947393037074 278.260869565217 -67.7281571625741 73.5723910673132 695.652173913043 -67.7281571625741 73.5723910673132 34.7826086956522 78.9140509396394 61.4212712689668 660.869565217391 -67.7281571625741 73.5723910673132 313.04347826087 -40.1695424652969 91.5773326655057 730.434782608696 -40.1695424652969 91.5773326655057 69.5652173913043 -8.25793454723323 99.658449300667 765.217391304348 94.5817241700635 32.4699469204683 695.652173913043 -40.1695424652969 91.5773326655057 347.826086956522 94.5817241700635 -32.4699469204684 347.826086956522 -8.25793454723323 99.658449300667 104.347826086957 94.5817241700635 -32.4699469204684 139.130434782609 -8.25793454723323 99.658449300667 382.608695652174 78.9140509396393 -61.4212712689668 382.608695652174 78.9140509396393 -61.4212712689668 173.913043478261 54.6948158122427 -83.7166478262529 208.695652173913 54.6948158122427 -83.7166478262529 417.391304347826 24.5485487140799 96.940026593933 417.391304347826 24.5485487140799 96.940026593933 139.130434782609 54.6948158122427 83.7166478262529 173.913043478261 24.5485487140799 -96.9400265939331 452.173913043478 24.5485487140799 -96.9400265939331 243.478260869565 78.9140509396394 61.4212712689668 208.695652173913 54.6948158122427 83.7166478262529 452.173913043478 94.5817241700635 32.4699469204683 243.478260869565 -8.25793454723327 -99.658449300667 486.956521739131 -8.25793454723327 -99.658449300667 278.260869565217 78.9140509396394 61.4212712689668 486.956521739131 -40.169542465297 -91.5773326655057 313.04347826087 -87.9473751206489 47.5947393037074 34.7826086956522 -40.169542465297 -91.5773326655057 521.739130434783 -67.7281571625741 -73.5723910673132 347.826086956522 -67.7281571625741 -73.5723910673132 556.521739130435 94.5817241700635 32.4699469204683 521.739130434783 -87.9473751206489 -47.5947393037073 382.608695652174 -67.7281571625741 73.5723910673132 69.5652173913043 -87.9473751206489 -47.5947393037073 591.304347826087 54.6948158122427 -83.7166478262529 34.7826086956522 -98.6361303402722 -16.4594590280734 417.391304347826 -40.1695424652969 91.5773326655057 104.347826086957 -98.6361303402722 -16.4594590280734 626.086956521739 -98.6361303402722 16.4594590280734 452.173913043478 24.5485487140799 -96.9400265939331 69.5652173913043 -8.25793454723323 99.658449300667 139.130434782609 -98.6361303402722 16.4594590280734 660.869565217391 -8.25793454723327 -99.658449300667 104.347826086957 -87.9473751206489 47.5947393037074 486.956521739131 24.5485487140799 96.940026593933 173.913043478261 -87.9473751206489 47.5947393037074 695.652173913043 54.6948158122427 83.7166478262529 208.695652173913 -67.7281571625741 73.5723910673132 521.739130434783 -40.169542465297 -91.5773326655057 139.130434782609 -67.7281571625741 73.5723910673132 730.434782608696 78.9140509396394 61.4212712689668 243.478260869565 -67.7281571625741 -73.5723910673132 173.913043478261 -40.1695424652969 91.5773326655057 765.217391304348 -40.1695424652969 91.5773326655057 556.521739130435 -87.9473751206489 -47.5947393037073 208.695652173913 94.5817241700635 32.4699469204683 278.260869565217 78.9140509396393 -61.4212712689668 417.391304347826 -8.25793454723323 99.658449300667 591.304347826087 -98.6361303402722 16.4594590280734 34.7826086956522 -98.6361303402722 -16.4594590280734 243.478260869565 -98.6361303402722 16.4594590280734 278.260869565217 54.6948158122427 -83.7166478262529 452.173913043478 24.5485487140799 96.940026593933 626.086956521739 54.6948158122427 83.7166478262529 660.869565217391 24.5485487140799 -96.9400265939331 486.956521739131 -87.9473751206489 47.5947393037074 69.5652173913043 -87.9473751206489 47.5947393037074 313.04347826087 -67.7281571625741 73.5723910673132 104.347826086957 78.9140509396394 61.4212712689668 695.652173913043 -8.25793454723327 -99.658449300667 521.739130434783 -67.7281571625741 73.5723910673132 347.826086956522 -40.1695424652969 91.5773326655057 139.130434782609 -40.169542465297 -91.5773326655057 556.521739130435 94.5817241700635 32.4699469204683 730.434782608696 -8.25793454723323 99.658449300667 173.913043478261 -40.1695424652969 91.5773326655057 382.608695652174 94.5817241700635 -32.4699469204684 173.913043478261 -67.7281571625741 -73.5723910673132 591.304347826087 -8.25793454723323 99.658449300667 417.391304347826 78.9140509396393 -61.4212712689668 208.695652173913 -87.9473751206489 -47.5947393037073 626.086956521739 24.5485487140799 96.940026593933 208.695652173913 54.6948158122427 83.7166478262529 243.478260869565 54.6948158122427 -83.7166478262529 243.478260869565 -98.6361303402722 -16.4594590280734 660.869565217391 24.5485487140799 96.940026593933 452.173913043478 24.5485487140799 -96.9400265939331 278.260869565217 78.9140509396394 61.4212712689668 278.260869565217 -98.6361303402722 16.4594590280734 695.652173913043 54.6948158122427 83.7166478262529 486.956521739131 94.5817241700635 32.4699469204683 313.04347826087 -8.25793454723327 -99.658449300667 313.04347826087 -87.9473751206489 47.5947393037074 730.434782608696 78.9140509396394 61.4212712689668 521.739130434783 -98.6361303402722 -16.4594590280734 34.7826086956522 -40.169542465297 -91.5773326655057 347.826086956522 -67.7281571625741 73.5723910673132 765.217391304348 -67.7281571625741 -73.5723910673132 382.608695652174 78.9140509396393 -61.4212712689668 452.173913043478 -98.6361303402722 16.4594590280734 69.5652173913043 -87.9473751206489 -47.5947393037073 417.391304347826 94.5817241700635 32.4699469204683 556.521739130435 54.6948158122427 -83.7166478262529 486.956521739131 78.9140509396393 -61.4212712689668 34.7826086956522 -87.9473751206489 47.5947393037074 104.347826086957 -98.6361303402722 -16.4594590280734 452.173913043478 -67.7281571625741 73.5723910673132 139.130434782609 54.6948158122427 -83.7166478262529 69.5652173913043 24.5485487140799 -96.9400265939331 521.739130434783 -98.6361303402722 16.4594590280734 486.956521739131 -40.1695424652969 91.5773326655057 173.913043478261 24.5485487140799 -96.9400265939331 104.347826086957 -8.25793454723323 99.658449300667 208.695652173913 -87.9473751206489 47.5947393037074 521.739130434783 -8.25793454723327 -99.658449300667 556.521739130435 -40.169542465297 -91.5773326655057 591.304347826087 -40.169542465297 -91.5773326655057 173.913043478261 24.5485487140799 96.940026593933 243.478260869565 -67.7281571625741 -73.5723910673132 626.086956521739 -67.7281571625741 -73.5723910673132 208.695652173913 54.6948158122427 83.7166478262529 278.260869565217 -87.9473751206489 -47.5947393037073 660.869565217391 -98.6361303402722 -16.4594590280734 695.652173913043 -8.25793454723323 99.658449300667 626.086956521739 78.9140509396394 61.4212712689668 313.04347826087 94.5817241700635 32.4699469204683 347.826086956522 -98.6361303402722 16.4594590280734 313.04347826087 -98.6361303402722 16.4594590280734 730.434782608696 -87.9473751206489 -47.5947393037073 34.7826086956522 -87.9473751206489 47.5947393037074 765.217391304348 54.6948158122427 83.7166478262529 695.652173913043 -87.9473751206489 47.5947393037074 347.826086956522 94.5817241700635 -32.4699469204684 452.173913043478 -98.6361303402722 -16.4594590280734 69.5652173913043 -67.7281571625741 73.5723910673132 382.608695652174 78.9140509396393 -61.4212712689668 486.956521739131 -98.6361303402722 16.4594590280734 104.347826086957 94.5817241700635 32.4699469204683 765.217391304348 94.5817241700635 -32.4699469204684 208.695652173913 54.6948158122427 -83.7166478262529 521.739130434783 -87.9473751206489 47.5947393037074 139.130434782609 -8.25793454723323 99.658449300667 452.173913043478 24.5485487140799 -96.9400265939331 556.521739130435 -67.7281571625741 73.5723910673132 173.913043478261 54.6948158122427 -83.7166478262529 278.260869565217 -40.1695424652969 91.5773326655057 208.695652173913 -8.25793454723327 -99.658449300667 591.304347826087 -40.169542465297 -91.5773326655057 626.086956521739 -8.25793454723323 99.658449300667 243.478260869565 24.5485487140799 -96.9400265939331 313.04347826087 54.6948158122427 83.7166478262529 521.739130434783 -67.7281571625741 -73.5723910673132 660.869565217391 -87.9473751206489 -47.5947393037073 695.652173913043 54.6948158122427 83.7166478262529 313.04347826087 -40.169542465297 -91.5773326655057 382.608695652174 -67.7281571625741 -73.5723910673132 417.391304347826 -98.6361303402722 -16.4594590280734 730.434782608696 -98.6361303402722 16.4594590280734 765.217391304348 94.5817241700635 -32.4699469204684 34.7826086956522 94.5817241700635 -32.4699469204684 486.956521739131 78.9140509396393 -61.4212712689668 521.739130434783 54.6948158122427 -83.7166478262529 556.521739130435 -98.6361303402722 16.4594590280734 521.739130434783 24.5485487140799 -96.9400265939331 591.304347826087 -8.25793454723327 -99.658449300667 626.086956521739 -98.6361303402722 16.4594590280734 139.130434782609 -40.169542465297 -91.5773326655057 660.869565217391 -87.9473751206489 47.5947393037074 173.913043478261 -67.7281571625741 -73.5723910673132 695.652173913043 -87.9473751206489 -47.5947393037073 730.434782608696 -98.6361303402722 -16.4594590280734 765.217391304348 94.5817241700635 -32.4699469204684 521.739130434783 54.6948158122427 -83.7166478262529 591.304347826087 24.5485487140799 -96.9400265939331 626.086956521739 5.75958653158129 400 6.28318530717959 350 5.76502671255203 393.146938099824 5.78038331643331 386.662410602174 5.80382582325277 380.690815213948 5.84339274904795 373.782555238023 5.89986744204557 366.815019461706 5.9668194398655 360.858265526469 6.03627258275022 356.380850902333 6.10703525710988 353.171507010994 6.18548781435823 350.960675236214 6.23370669596795 350.245215525427 6.28318530717959 0 0 0 0.174532925199433 0 0.349065850398866 0 0.523598775598299 0 0.698131700797732 0 0.872664625997165 0 1.0471975511966 0 1.22173047639603 0 1.39626340159546 0 1.5707963267949 0 1.74532925199433 0 1.91986217719376 0 2.0943951023932 0 2.26892802759263 0 2.44346095279206 0 2.61799387799149 0 2.79252680319093 0 2.96705972839036 0 3.14159265358979 0 3.31612557878922 0 3.49065850398866 0 3.66519142918809 0 3.83972435438752 0 4.01425727958696 0 4.18879020478639 0 4.36332312998582 0 4.53785605518525 0 4.71238898038469 0 4.88692190558412 0 5.06145483078355 0 5.23598775598299 0 5.41052068118242 0 5.58505360638185 0 5.75958653158128 0 5.93411945678072 0 6.10865238198015 0 0 350 0.523598775598299 400 0.077538932748348 350.60366789119 0.1509208682896 352.314017004824 0.218192472586135 354.928638859964 0.278804640762612 358.255381554833 0.346747481674073 363.324622594048 0.409044313017844 369.700044024682 0.456050013115963 376.326552497693 0.493149687318882 383.90964254567 0.51533969042131 391.563087645832 0.521486191917156 395.72529258068 0 450 0.0775391300147876 449.396329038004 0.15092123436146 447.685971589172 0.218192971604858 445.071337728308 0.278805237518871 441.744580622317 0.346748092637934 436.675324162327 0.409044978349884 430.299875845487 0.456050672751564 423.673337329156 0.493150253015108 416.090210848718 0.51534004882998 408.43673018339 0.521486285180745 404.274613176575 0 800 6.28318530717959 800 0.174532925199433 800 0.349065850398866 800 0.523598775598299 800 0.698131700797732 800 0.872664625997165 800 1.0471975511966 800 1.22173047639603 800 1.39626340159546 800 1.5707963267949 800 1.74532925199433 800 1.91986217719376 800 2.0943951023932 800 2.26892802759263 800 2.44346095279206 800 2.61799387799149 800 2.79252680319093 800 2.96705972839036 800 3.14159265358979 800 3.31612557878922 800 3.49065850398866 800 3.66519142918809 800 3.83972435438752 800 4.01425727958696 800 4.18879020478639 800 4.36332312998582 800 4.53785605518525 800 4.71238898038469 800 4.88692190558412 800 5.06145483078355 800 5.23598775598299 800 5.41052068118242 800 5.58505360638185 800 5.75958653158128 800 5.93411945678072 800 6.10865238198015 800 6.28318530717959 450 5.76502671255202 406.853061900168 5.78038331643326 413.337589397812 5.80382582325268 419.309184786033 5.84339274904778 426.217444761952 5.89986744204533 433.184980538269 5.96681943986518 439.141734473506 6.03627258290147 443.619149110997 6.10703525679861 446.828492965207 6.18548781364045 449.039324751509 6.23370669672657 449.754784472325 4.29902152596498 730.434782608696 4.29902152596498 695.652173913043 4.62971548950075 695.652173913043 1.98416378121461 278.260869565217 1.65346981767884 278.260869565217 1.98416378121461 243.478260869565 5.29110341657228 139.130434782609 5.29110341657228 104.347826086957 5.62179738010805 104.347826086957 3.96832756242921 765.217391304348 3.63763359889344 765.217391304348 4.96040945303652 139.130434782609 3.96832756242921 730.434782608696 2.64555170828614 591.304347826087 2.64555170828614 556.521739130435 2.97624567182191 556.521739130435 2.31485774475037 591.304347826087 2.31485774475037 556.521739130435 4.96040945303652 173.913043478261 1.65346981767884 313.04347826087 1.32277585414307 278.260869565217 4.62971548950075 139.130434782609 5.95249134364382 591.304347826087 5.62179738010805 556.521739130435 5.95249134364382 556.521739130435 4.62971548950075 173.913043478261 5.62179738010805 591.304347826087 1.32277585414307 313.04347826087 2.31485774475037 626.086956521739 1.98416378121461 591.304347826087 1.98416378121461 626.086956521739 4.62971548950075 208.695652173913 4.29902152596498 208.695652173913 5.62179738010805 626.086956521739 5.29110341657228 626.086956521739 1.32277585414307 347.826086956522 0.992081890607303 347.826086956522 4.29902152596498 243.478260869565 3.96832756242921 243.478260869565 5.29110341657228 660.869565217391 4.96040945303652 660.869565217391 3.96832756242921 278.260869565217 3.63763359889344 243.478260869565 0.992081890607303 382.608695652174 0.661387927071535 347.826086956522 1.98416378121461 660.869565217391 1.65346981767884 660.869565217391 3.63763359889344 278.260869565217 0.661387927071535 382.608695652174 4.96040945303652 695.652173913043 4.62971548950075 660.869565217391 1.65346981767884 695.652173913043 1.32277585414307 660.869565217391 3.63763359889344 313.04347826087 3.30693963535768 313.04347826087 3.30693963535768 278.260869565217 1.32277585414307 695.652173913043 4.62971548950075 730.434782608696 4.29902152596498 765.217391304348 0.661387927071535 417.391304347826 1.32277585414307 730.434782608696 0.992081890607303 730.434782608696 0.992081890607303 765.217391304348 0.661387927071535 765.217391304348 0.661387927071535 730.434782608696 3.30693963535768 347.826086956522 2.97624567182191 347.826086956522 5.95249134364382 626.086956521739 5.95249134364382 278.260869565217 5.95249134364382 243.478260869565 5.62179738010805 278.260869565217 5.62179738010805 243.478260869565 2.97624567182191 382.608695652174 2.64555170828614 382.608695652174 0.330693963535768 452.173913043478 5.62179738010805 660.869565217391 5.62179738010805 313.04347826087 5.29110341657228 313.04347826087 2.64555170828614 417.391304347826 2.31485774475037 417.391304347826 5.29110341657228 695.652173913043 5.29110341657228 347.826086956522 4.96040945303652 347.826086956522 2.31485774475037 452.173913043478 1.98416378121461 452.173913043478 1.98416378121461 417.391304347826 4.96040945303652 730.434782608696 4.62971548950075 34.7826086956522 4.29902152596498 34.7826086956522 0.330693963535768 34.7826086956522 4.96040945303652 382.608695652174 4.62971548950075 347.826086956522 4.62971548950075 765.217391304348 4.62971548950075 382.608695652174 1.98416378121461 486.956521739131 1.65346981767884 486.956521739131 5.95249134364382 660.869565217391 0.661387927071535 34.7826086956522 4.62971548950075 417.391304347826 4.29902152596498 417.391304347826 4.29902152596498 69.5652173913043 3.96832756242921 34.7826086956522 3.96832756242921 69.5652173913043 1.65346981767884 521.739130434783 1.32277585414307 486.956521739131 1.32277585414307 521.739130434783 5.62179738010805 695.652173913043 4.29902152596498 452.173913043478 3.96832756242921 452.173913043478 3.96832756242921 104.347826086957 3.63763359889344 104.347826086957 3.63763359889344 69.5652173913043 0.330693963535768 69.5652173913043 5.29110341657228 730.434782608696 3.96832756242921 486.956521739131 3.63763359889344 486.956521739131 3.63763359889344 452.173913043478 3.63763359889344 139.130434782609 3.30693963535768 104.347826086957 4.96040945303652 765.217391304348 1.32277585414307 556.521739130435 0.992081890607303 556.521739130435 3.30693963535768 139.130434782609 0.992081890607303 34.7826086956522 3.63763359889344 521.739130434783 3.30693963535768 486.956521739131 5.95249134364382 695.652173913043 0.992081890607303 591.304347826087 0.661387927071535 556.521739130435 3.30693963535768 173.913043478261 2.97624567182191 173.913043478261 3.30693963535768 521.739130434783 0.661387927071535 591.304347826087 2.97624567182191 208.695652173913 0.661387927071535 69.5652173913043 2.64555170828614 208.695652173913 3.30693963535768 556.521739130435 5.62179738010805 730.434782608696 5.29110341657228 765.217391304348 2.64555170828614 243.478260869565 2.31485774475037 208.695652173913 2.97624567182191 591.304347826087 0.661387927071535 626.086956521739 0.330693963535768 591.304347826087 2.31485774475037 243.478260869565 0.330693963535768 626.086956521739 0.330693963535768 660.869565217391 5.95249134364382 730.434782608696 0.330693963535768 104.347826086957 1.32277585414307 34.7826086956522 5.62179738010805 765.217391304348 2.31485774475037 278.260869565217 2.64555170828614 626.086956521739 5.95249134364382 104.347826086957 5.62179738010805 69.5652173913043 5.95249134364382 69.5652173913043 5.95249134364382 765.217391304348 1.98416378121461 313.04347826087 2.31485774475037 660.869565217391 5.62179738010805 139.130434782609 1.65346981767884 347.826086956522 0.992081890607303 69.5652173913043 0.661387927071535 104.347826086957 5.29110341657228 173.913043478261 4.96040945303652 208.695652173913 1.98416378121461 695.652173913043 1.65346981767884 730.434782608696 0.330693963535768 139.130434782609 1.32277585414307 382.608695652174 1.32277585414307 765.217391304348 4.62971548950075 243.478260869565 1.65346981767884 34.7826086956522 0.992081890607303 417.391304347826 5.95249134364382 313.04347826087 4.29902152596498 278.260869565217 0.661387927071535 452.173913043478 3.96832756242921 313.04347826087 5.62179738010805 347.826086956522 1.32277585414307 69.5652173913043 0.992081890607303 104.347826086957 5.29110341657228 382.608695652174 3.63763359889344 347.826086956522 0.330693963535768 486.956521739131 4.96040945303652 417.391304347826 3.30693963535768 382.608695652174 0.661387927071535 139.130434782609 2.97624567182191 417.391304347826 0.330693963535768 173.913043478261 4.62971548950075 452.173913043478 4.96040945303652 34.7826086956522 4.29902152596498 486.956521739131 2.64555170828614 452.173913043478 1.98416378121461 34.7826086956522 3.96832756242921 521.739130434783 4.62971548950075 69.5652173913043 2.31485774475037 486.956521739131 4.29902152596498 104.347826086957 3.63763359889344 556.521739130435 1.65346981767884 69.5652173913043 1.98416378121461 521.739130434783 3.96832756242921 139.130434782609 1.32277585414307 104.347826086957 3.30693963535768 591.304347826087 3.63763359889344 173.913043478261 1.65346981767884 556.521739130435 0.992081890607303 139.130434782609 2.97624567182191 626.086956521739 3.30693963535768 208.695652173913 1.32277585414307 591.304347826087 2.64555170828614 660.869565217391 2.97624567182191 243.478260869565 0.661387927071535 173.913043478261 0.330693963535768 208.695652173913 0.992081890607303 626.086956521739 2.64555170828614 278.260869565217 2.31485774475037 695.652173913043 2.31485774475037 34.7826086956522 0.661387927071535 660.869565217391 2.31485774475037 313.04347826087 1.98416378121461 730.434782608696 1.98416378121461 69.5652173913043 1.65346981767884 765.217391304348 0.330693963535768 695.652173913043 1.98416378121461 347.826086956522 5.95249134364382 347.826086956522 1.65346981767884 104.347826086957 5.95249134364382 139.130434782609 1.65346981767884 382.608695652174 5.62179738010805 382.608695652174 5.62179738010805 173.913043478261 5.29110341657228 208.695652173913 5.29110341657228 417.391304347826 1.32277585414307 417.391304347826 1.32277585414307 139.130434782609 0.992081890607303 173.913043478261 4.96040945303652 452.173913043478 4.96040945303652 243.478260869565 0.661387927071535 208.695652173913 0.992081890607303 452.173913043478 0.330693963535768 243.478260869565 4.62971548950075 486.956521739131 4.62971548950075 278.260869565217 0.661387927071535 486.956521739131 4.29902152596498 313.04347826087 2.64555170828614 34.7826086956522 4.29902152596498 521.739130434783 3.96832756242921 347.826086956522 3.96832756242921 556.521739130435 0.330693963535768 521.739130434783 3.63763359889344 382.608695652174 2.31485774475037 69.5652173913043 3.63763359889344 591.304347826087 5.29110341657228 34.7826086956522 3.30693963535768 417.391304347826 1.98416378121461 104.347826086957 3.30693963535768 626.086956521739 2.97624567182191 452.173913043478 4.96040945303652 69.5652173913043 1.65346981767884 139.130434782609 2.97624567182191 660.869565217391 4.62971548950075 104.347826086957 2.64555170828614 486.956521739131 1.32277585414307 173.913043478261 2.64555170828614 695.652173913043 0.992081890607303 208.695652173913 2.31485774475037 521.739130434783 4.29902152596498 139.130434782609 2.31485774475037 730.434782608696 0.661387927071535 243.478260869565 3.96832756242921 173.913043478261 1.98416378121461 765.217391304348 1.98416378121461 556.521739130435 3.63763359889344 208.695652173913 0.330693963535768 278.260869565217 5.62179738010805 417.391304347826 1.65346981767884 591.304347826087 2.97624567182191 34.7826086956522 3.30693963535768 243.478260869565 2.97624567182191 278.260869565217 5.29110341657228 452.173913043478 1.32277585414307 626.086956521739 0.992081890607303 660.869565217391 4.96040945303652 486.956521739131 2.64555170828614 69.5652173913043 2.64555170828614 313.04347826087 2.31485774475037 104.347826086957 0.661387927071535 695.652173913043 4.62971548950075 521.739130434783 2.31485774475037 347.826086956522 1.98416378121461 139.130434782609 4.29902152596498 556.521739130435 0.330693963535768 730.434782608696 1.65346981767884 173.913043478261 1.98416378121461 382.608695652174 5.95249134364382 173.913043478261 3.96832756242921 591.304347826087 1.65346981767884 417.391304347826 5.62179738010805 208.695652173913 3.63763359889344 626.086956521739 1.32277585414307 208.695652173913 0.992081890607303 243.478260869565 5.29110341657228 243.478260869565 3.30693963535768 660.869565217391 1.32277585414307 452.173913043478 4.96040945303652 278.260869565217 0.661387927071535 278.260869565217 2.97624567182191 695.652173913043 0.992081890607303 486.956521739131 0.330693963535768 313.04347826087 4.62971548950075 313.04347826087 2.64555170828614 730.434782608696 0.661387927071535 521.739130434783 3.30693963535768 34.7826086956522 4.29902152596498 347.826086956522 2.31485774475037 765.217391304348 3.96832756242921 382.608695652174 5.62179738010805 452.173913043478 2.97624567182191 69.5652173913043 3.63763359889344 417.391304347826 0.330693963535768 556.521739130435 5.29110341657228 486.956521739131 5.62179738010805 34.7826086956522 2.64555170828614 104.347826086957 3.30693963535768 452.173913043478 2.31485774475037 139.130434782609 5.29110341657228 69.5652173913043 4.96040945303652 521.739130434783 2.97624567182191 486.956521739131 1.98416378121461 173.913043478261 4.96040945303652 104.347826086957 1.65346981767884 208.695652173913 2.64555170828614 521.739130434783 4.62971548950075 556.521739130435 4.29902152596498 591.304347826087 4.29902152596498 173.913043478261 1.32277585414307 243.478260869565 3.96832756242921 626.086956521739 3.96832756242921 208.695652173913 0.992081890607303 278.260869565217 3.63763359889344 660.869565217391 3.30693963535768 695.652173913043 1.65346981767884 626.086956521739 0.661387927071535 313.04347826087 0.330693963535768 347.826086956522 2.97624567182191 313.04347826087 2.97624567182191 730.434782608696 3.63763359889344 34.7826086956522 2.64555170828614 765.217391304348 0.992081890607303 695.652173913043 2.64555170828614 347.826086956522 5.95249134364382 452.173913043478 3.30693963535768 69.5652173913043 2.31485774475037 382.608695652174 5.62179738010805 486.956521739131 2.97624567182191 104.347826086957 0.330693963535768 765.217391304348 5.95249134364382 208.695652173913 5.29110341657228 521.739130434783 2.64555170828614 139.130434782609 1.65346981767884 452.173913043478 4.96040945303652 556.521739130435 2.31485774475037 173.913043478261 5.29110341657228 278.260869565217 1.98416378121461 208.695652173913 4.62971548950075 591.304347826087 4.29902152596498 626.086956521739 1.65346981767884 243.478260869565 4.96040945303652 313.04347826087 0.992081890607303 521.739130434783 3.96832756242921 660.869565217391 3.63763359889344 695.652173913043 0.992081890607303 313.04347826087 4.29902152596498 382.608695652174 3.96832756242921 417.391304347826 3.30693963535768 730.434782608696 2.97624567182191 765.217391304348 5.95249134364382 34.7826086956522 5.95249134364382 486.956521739131 5.62179738010805 521.739130434783 5.29110341657228 556.521739130435 2.97624567182191 521.739130434783 4.96040945303652 591.304347826087 4.62971548950075 626.086956521739 2.97624567182191 139.130434782609 4.29902152596498 660.869565217391 2.64555170828614 173.913043478261 3.96832756242921 695.652173913043 3.63763359889344 730.434782608696 3.30693963535768 765.217391304348 5.95249134364382 521.739130434783 5.29110341657228 591.304347826087 4.96040945303652 626.086956521739 121 122 123 124 125 126 127 128 129 130 96 131 127 132 128 130 133 121 134 135 136 130 131 133 130 97 96 134 137 138 130 98 97 134 138 135 139 132 127 140 141 125 139 142 132 143 144 145 139 146 142 143 147 144 140 148 141 143 145 110 140 125 124 149 150 137 149 151 150 152 153 146 154 155 147 156 157 148 158 159 153 158 153 152 160 161 155 160 155 154 162 163 159 164 165 157 166 167 151 162 168 163 164 169 165 170 123 171 170 171 161 172 167 166 170 161 160 172 173 167 174 175 176 174 176 168 172 177 173 178 121 123 174 168 162 164 157 156 179 130 121 180 51 169 179 98 130 179 121 178 181 182 177 180 69 70 179 99 98 183 79 184 180 70 71 179 100 99 183 185 182 180 71 72 186 187 175 180 72 51 183 182 181 183 184 185 183 80 79 188 110 74 183 81 80 188 143 110 188 147 143 189 190 2 188 154 147 189 191 192 189 192 190 193 187 186 193 194 187 195 64 65 195 65 66 196 160 154 197 198 191 195 66 67 199 200 194 201 170 160 201 160 196 202 203 198 204 205 206 207 178 123 202 198 197 208 209 40 207 123 170 204 206 200 210 14 15 207 170 201 208 40 41 210 15 16 210 16 17 211 212 203 213 179 178 211 214 212 213 100 179 211 203 202 213 101 100 215 216 205 217 154 188 218 17 18 217 196 154 218 18 19 219 220 214 221 222 209 217 188 74 221 209 208 221 223 222 224 225 216 218 210 17 224 216 215 224 226 225 227 201 196 228 220 219 228 229 220 230 231 232 233 14 210 230 232 223 234 207 201 234 201 227 235 236 237 238 231 230 238 239 231 240 103 102 241 242 226 238 243 239 240 213 178 235 237 229 244 19 20 240 178 207 244 20 21 240 101 213 240 207 234 240 102 101 245 246 236 247 217 74 245 236 235 248 242 241 248 249 242 250 251 243 245 252 246 248 253 249 247 196 217 247 227 196 244 218 19 254 251 250 255 233 210 254 256 251 255 210 218 257 136 252 258 234 227 259 104 103 259 105 104 259 240 234 260 261 256 259 103 240 262 134 136 259 234 258 263 264 253 260 265 261 262 136 257 263 266 264 260 256 254 267 73 266 268 247 74 268 227 247 268 258 227 269 14 233 270 21 22 271 106 105 272 265 260 270 22 23 271 107 106 272 124 126 273 134 262 271 105 259 273 137 134 272 126 265 273 149 137 271 259 258 274 275 276 277 108 107 277 109 108 278 140 124 270 244 21 277 74 109 274 129 275 277 268 74 274 276 13 277 107 271 277 258 268 277 271 258 279 166 151 280 127 129 281 148 140 282 218 244 281 156 148 279 151 149 281 140 278 282 255 218 282 244 270 283 255 282 284 139 127 284 127 280 285 146 139 283 269 233 286 172 166 283 233 255 287 177 172 285 152 146 287 181 177 288 14 269 285 139 284 287 172 286 289 164 156 290 81 183 290 82 81 291 158 152 290 83 82 292 23 24 293 180 169 293 164 289 290 183 181 294 191 189 294 189 2 295 158 291 292 270 23 294 12 11 295 159 158 294 2 12 294 197 191 295 162 159 293 169 164 296 195 67 297 162 295 298 7 6 296 69 180 296 67 68 298 202 197 296 68 69 297 174 162 299 282 270 300 283 282 301 211 202 302 186 175 301 202 298 302 175 174 303 64 195 304 211 301 303 62 63 300 282 299 303 63 64 305 193 186 306 269 283 304 219 214 304 214 211 307 194 193 306 288 269 308 14 288 308 50 14 307 199 194 309 228 219 307 193 305 310 208 41 310 41 42 310 42 43 311 228 309 312 200 199 313 292 24 313 24 25 312 199 307 313 25 26 311 235 229 312 204 200 311 229 228 314 235 311 315 221 208 314 245 235 316 204 312 317 221 315 316 215 205 317 230 223 316 205 204 318 257 252 318 245 314 317 223 221 319 292 313 318 252 245 319 270 292 320 224 215 319 299 270 321 230 317 321 238 230 322 300 299 323 262 257 324 243 238 324 250 243 325 224 320 326 283 300 325 226 224 324 238 321 326 306 283 325 241 226 327 273 262 327 262 323 328 254 250 326 300 322 329 248 241 330 273 327 331 254 328 331 260 254 332 288 306 332 308 288 330 279 149 330 149 273 333 50 308 334 263 253 334 253 248 335 272 260 334 248 329 336 166 279 336 286 166 337 26 27 337 27 28 338 266 263 338 267 266 339 124 272 339 278 124 337 313 26 340 287 286 341 319 313 342 287 340 342 84 83 343 73 267 344 281 278 342 83 290 342 181 287 342 290 181 345 7 298 345 8 7 345 9 8 345 10 9 346 299 319 345 11 10 347 274 13 345 294 11 348 281 344 345 197 294 347 129 274 348 156 281 346 319 341 345 298 197 347 280 129 349 3 1 349 4 3 349 5 4 349 6 5 346 322 299 349 298 6 349 301 298 350 284 280 351 285 284 348 289 156 352 304 301 353 293 289 354 326 322 352 301 349 351 284 350 355 306 326 356 219 304 357 291 152 357 152 285 356 304 352 355 326 354 355 332 306 357 285 351 358 333 308 359 296 180 356 309 219 358 308 332 360 50 333 361 311 309 362 295 291 359 180 293 359 293 353 363 195 296 363 303 195 364 297 295 364 295 362 365 28 29 365 29 30 366 311 361 367 174 297 366 314 311 367 302 174 368 318 314 369 62 303 370 186 302 365 337 28 368 314 366 370 305 186 371 337 365 370 302 367 371 341 313 372 318 368 371 313 337 372 257 318 373 310 43 372 323 257 374 307 305 373 43 44 373 44 45 375 346 341 376 327 323 377 307 374 378 208 310 377 312 307 379 346 375 380 327 376 378 310 373 380 330 327 379 322 346 379 354 322 378 315 208 381 317 315 382 316 312 383 355 354 384 330 380 384 336 279 384 279 330 385 358 332 385 355 383 386 215 316 387 321 317 386 320 215 387 317 381 388 286 336 385 332 355 388 340 286 389 360 333 390 324 321 391 342 340 392 325 320 390 321 387 391 84 342 389 333 358 391 85 84 391 86 85 393 250 324 394 50 360 395 1 111 393 328 250 395 111 112 395 112 113 393 324 390 395 113 114 396 241 325 396 329 241 395 349 1 395 352 349 396 325 392 397 30 31 398 331 328 397 31 32 399 331 398 400 356 352 399 335 260 400 352 395 397 365 30 399 260 331 401 334 329 402 334 401 403 309 356 403 361 309 404 371 365 405 335 399 405 339 272 403 356 400 405 272 335 402 263 334 402 338 263 406 371 404 407 267 338 406 341 371 407 343 267 408 366 361 409 344 278 406 375 341 409 339 405 410 379 375 409 278 339 411 366 408 411 368 366 412 73 343 413 354 379 414 348 344 413 383 354 415 13 2 416 372 368 415 347 13 415 280 347 415 350 280 416 368 411 413 379 410 417 289 348 417 353 289 418 351 350 419 372 416 417 348 414 419 376 323 419 323 372 420 385 383 421 358 385 421 389 358 422 357 351 423 380 376 422 351 418 424 359 353 421 385 420 425 357 422 426 360 389 427 384 380 425 291 357 425 362 291 428 363 296 427 380 423 428 359 424 428 296 359 426 394 360 429 50 394 429 52 50 429 53 52 430 364 362 431 336 384 431 388 336 431 384 427 432 369 303 432 303 363 433 32 33 434 364 430 433 33 34 434 367 297 435 340 388 434 297 364 435 86 391 435 391 340 435 87 86 435 88 87 436 367 434 437 114 115 433 397 32 438 365 397 436 370 367 437 395 114 437 400 395 439 374 305 438 397 433 438 404 365 439 305 370 440 62 369 441 400 437 442 45 46 442 46 47 443 406 404 441 403 400 444 377 374 442 373 45 445 375 406 446 373 442 447 403 441 446 378 373 445 410 375 447 408 361 448 377 444 447 361 403 448 382 312 449 413 410 448 312 377 450 378 446 450 315 378 450 381 315 451 420 383 452 382 448 453 411 408 452 386 316 142 387 381 452 316 382 451 413 449 454 416 411 451 383 413 454 411 453 455 387 142 456 421 420 457 419 416 138 392 320 455 390 387 457 416 454 138 320 386 458 393 390 459 426 389 458 390 455 459 421 456 459 389 421 460 419 457 460 423 376 163 328 393 460 376 419 150 396 392 163 393 458 163 398 328 461 427 423 462 401 329 463 429 394 462 329 396 463 394 426 462 396 150 176 399 398 464 53 429 464 54 53 465 405 399 464 55 54 466 427 461 465 399 176 464 56 55 466 431 427 173 402 401 467 433 34 467 34 35 467 35 36 468 431 466 468 88 435 468 435 388 468 89 88 469 338 402 468 90 89 469 407 338 468 388 431 470 409 405 471 115 116 471 116 117 471 117 118 471 118 119 472 438 433 469 402 173 473 414 344 471 437 115 185 343 407 185 412 343 474 441 437 473 344 409 475 438 472 476 73 412 476 75 73 476 76 75 206 417 414 475 404 438 476 77 76 475 443 404 477 418 350 478 441 474 479 443 475 478 447 441 479 445 406 479 406 443 477 415 2 477 350 415 480 424 353 192 422 418 481 408 447 480 417 206 481 447 478 480 353 417 482 449 410 481 453 408 482 410 445 483 425 422 484 451 449 485 454 453 483 422 192 486 457 454 486 454 485 487 451 484 225 428 424 487 456 420 488 362 425 489 428 225 488 430 362 487 420 451 490 457 486 488 425 483 489 363 428 490 460 457 489 432 363 212 434 430 249 369 432 491 460 490 141 459 456 491 423 460 492 459 141 493 434 212 493 436 434 491 461 423 249 440 369 264 62 440 492 426 459 494 439 370 492 463 426 494 370 436 165 57 56 165 58 57 495 466 461 496 466 495 496 90 468 496 91 90 496 468 466 165 429 463 496 92 91 237 439 494 165 464 429 165 56 464 237 444 374 497 47 48 498 437 471 497 48 49 498 119 120 237 374 439 497 49 13 222 36 37 498 120 110 222 37 38 498 471 119 497 442 47 498 474 437 275 446 442 499 478 474 246 448 444 222 467 36 128 450 446 128 446 275 232 472 433 500 481 478 501 452 448 501 448 246 232 433 467 500 478 499 132 142 381 132 450 128 132 381 450 135 138 386 239 475 472 502 453 481 502 485 453 135 452 501 146 455 142 502 481 500 135 386 452 503 486 485 504 475 239 504 479 475 137 392 138 153 455 146 153 458 455 137 150 392 505 486 503 505 490 486 159 458 153 506 482 445 506 479 504 506 445 479 159 163 458 507 491 490 151 462 150 507 490 505 261 449 482 261 484 449 168 398 163 168 176 398 508 495 461 508 461 491 167 462 151 508 491 507 167 401 462 126 487 484 175 465 176 509 496 495 167 173 401 187 465 175 509 92 496 125 141 456 509 93 92 509 94 93 177 469 173 187 405 465 125 487 126 510 498 110 125 456 487 187 470 405 510 474 498 182 407 469 510 499 474 182 185 407 182 469 177 194 470 187 194 409 470 144 500 499 194 473 409 184 77 476 184 78 77 148 492 141 184 79 78 184 412 185 184 476 412 200 414 473 157 165 463 190 418 477 200 206 414 157 463 492 511 502 500 200 473 194 157 492 148 511 500 144 512 502 511 190 477 2 190 192 418 512 503 485 205 480 206 512 485 502 169 59 58 169 60 59 191 483 192 169 61 60 169 51 61 171 505 503 169 58 165 209 222 38 198 488 483 216 480 205 198 483 191 216 424 480 122 505 171 122 507 505 216 225 424 209 38 39 209 39 40 203 488 198 133 507 122 203 430 488 133 508 507 203 212 430 226 489 225 223 467 222 131 509 495 131 495 508 214 493 212 131 508 133 223 232 467 131 94 509 131 95 94 231 239 472 131 96 95 242 249 432 220 493 214 220 494 436 242 489 226 242 432 489 145 510 110 145 499 510 231 472 232 145 144 499 220 436 493 253 440 249 229 237 494 253 264 440 243 504 239 147 511 144 229 494 220 155 512 511 155 511 147 266 62 264 236 444 237 251 506 504 266 73 62 251 504 243 236 246 444 161 503 512 256 482 506 256 261 482 161 512 155 276 275 442 161 171 503 252 501 246 276 442 497 256 506 251 276 497 13 123 122 171 265 484 261 129 128 275 265 126 484 136 501 252 121 133 122 136 135 501 +379 587 1 0.681934829863914 +190 20 445.825756949558 210 -4.89842541528951e-15 450 187.024366020417 19.7774012963438 445.922264725258 184.397529800585 19.1992796277918 446.166954243274 181.546913604686 18.125819553687 446.59886977596 178.752969008674 16.5379654738046 447.185757348038 176.369667096977 14.6360522075901 447.809894135463 174.309971315007 12.4025399755702 448.437351320804 172.548649956894 9.76987059841766 449.036207207027 171.242034340645 6.93820726756652 449.51627283167 170.380301086729 3.88167696084131 449.849098129506 170.023096521915 0.960898368304993 449.990765883617 170.086043866562 -1.8531982436549 449.965644740411 170.509841698291 -4.48706231247217 449.798255709213 171.398299667707 -7.34688690845968 449.457287186436 172.743857915231 -10.1106660571351 448.967075069423 174.347888840505 -12.4503589683746 448.425082205426 176.192341023654 -14.4688795692552 447.86074933687 178.295746540249 -16.2176006194872 447.296825505482 180.640667676887 -17.6748961416399 446.7717611852 183.205669615023 -18.8105768661047 446.326693427354 186.059267040101 -19.6079226714758 445.994884340429 189.05297923185 -19.9775663053321 445.835541404226 191.895773051283 -19.9099477889329 445.864953696004 194.48438891673 -19.4907734771899 446.044649514275 197.343898776281 -18.6028803528253 446.410482031254 200.13477025801 -17.2419961803721 446.933075375945 202.522803249016 -15.5942105252608 447.506005983989 204.599616537762 -13.6693524360872 448.095205754853 206.410620564223 -11.4320396201158 448.675542899776 207.946109646233 -8.82820037172931 449.214457777936 209.086918743382 -5.97406825644437 449.641821815127 209.747291812357 -3.16934437217016 449.899454557652 209.797702468142 2.83742874189979 449.91942504134 209.215264429107 5.5473956609573 449.69131111379 208.306916927762 8.05337150161281 449.347170220943 206.788174560315 10.8700135987294 448.804126907314 204.754879178687 13.5016125308194 448.142563877523 202.602997991452 15.5294700803301 447.527208622277 200.14641042884 17.2351489960208 446.935590404877 197.364149940715 18.5948729149583 446.413690924525 194.262428648985 19.5405143016412 446.023562404914 192.165572916192 19.8824116982837 445.876897309791 190 -20 354.174243050442 170 -1.22460635382238e-14 350 187.19152395552 -19.8018301993616 354.088263569037 184.516885484041 -19.2337057450191 353.84737773106 182.039994698179 -18.347706288844 353.488047941608 179.223163623154 -16.8481398588458 352.924101793932 176.597079044967 -14.8445852697679 352.254442215956 174.551494560294 -12.7021125979118 351.640343987994 172.81733759401 -10.2350434370622 351.058771097833 171.42920242427 -7.42465406707688 350.554327671198 170.463556231093 -4.28104719934824 350.183610769691 170.118264986057 -2.17177622757773 350.047188396748 100 -1.83690953073357e-14 350 86.6025403784438 -50 400 86.8732667031317 -49.5281290308752 393.146938099824 87.6235772593243 -48.1882631494736 386.662410602174 88.7290516622297 -46.1210945615935 380.690815213948 90.4840004397121 -42.5751772682387 373.782555238023 92.7428861391894 -37.3999606121917 366.815019461706 95.0372320329239 -31.11148437027 360.858265526469 96.9671604229308 -24.4411486760561 356.380850902333 98.4525657430885 -17.52405054016 353.171507010994 99.5231396908821 -9.75421483502655 350.960675236214 99.8776181649079 -4.94584264829443 350.245215525427 100 -2.44921270764475e-14 450 86.8732667031312 -49.5281290308762 406.853061900168 87.6235772593223 -48.1882631494772 413.337589397812 88.7290516622257 -46.1210945616012 419.309184786033 90.484000439705 -42.5751772682538 426.217444761952 92.7428861391805 -37.3999606122139 433.184980538269 95.0372320329138 -31.1114843703007 439.141734473506 96.9671604293251 -24.4411486612818 443.619149110997 98.4525657314274 -17.5240505708509 446.828492965207 99.5231396846886 -9.7542149066232 449.039324751509 99.877618163893 -4.94584257239082 449.754784472325 86.6025403784439 50 400 99.6995349038219 7.74614536115343 449.396329038004 98.8632990204773 15.0348959199349 447.685971589172 97.6290200022516 21.6465795167683 445.071337728308 96.1384934421685 27.5207218309807 441.744580622317 94.0482819113588 33.9841246665353 436.675324162327 91.7501087080715 39.7733276178202 430.299875845487 89.779880280166 44.0405850374743 423.673337329156 88.0845894011337 47.3403121169944 416.090210848718 87.0125187464446 49.2830763468782 408.43673018339 86.7079714631656 49.8169414560564 404.274613176575 100 -1.83690953073357e-14 350 99.6995364250708 7.74612569392024 350.60366789119 98.8633045221148 15.0348597287602 352.314017004824 97.6290308111529 21.6465307979184 354.928638859964 96.1385098653288 27.5206644597269 358.255381554833 94.0483026744096 33.9840672064279 363.324622594048 91.7501351704928 39.7732665735241 369.700044024682 89.7799093309045 44.0405258154732 376.326552497693 88.0846161813635 47.3402622878728 383.90964254567 87.0125364098992 49.2830451608201 391.563087645832 86.7079761092912 49.8169333693719 395.72529258068 170 -1.22460635382238e-14 350 190 20 354.174243050442 170.202464309206 2.83858896354278 350.080640925493 170.784931061703 5.54807359953334 350.308764553975 171.694405902748 8.05637777047583 350.653320494305 173.214340920064 10.8738982856126 351.196738417424 175.24816387627 13.5049376869178 351.858368714932 177.401364011892 15.5330088161513 352.473947838002 179.857848980619 17.237654925444 353.065330165529 182.637652604668 18.5955872197421 353.586595055644 185.737201868648 19.5404341367349 353.976403390908 187.834463425865 19.8824152894209 354.123104387754 210 -8.57224447675664e-15 350 209.797535684556 2.83858895721841 350.080640928023 209.215068935606 5.54807361321558 350.308764554953 208.305594113848 8.05637773956749 350.653320488076 206.785659117562 10.8738982275306 351.196738404482 204.751836168062 13.5049376384928 351.858368701347 202.598636037752 15.5330087758858 352.473947824842 200.142151074243 17.2376548931651 353.065330153674 197.362347455423 18.5955871959507 353.586595046112 194.262798195698 19.5404341226978 353.976403384948 192.165536607703 19.8824152857648 354.123104386169 300 -1.22460635382238e-14 350 300 -1.22460635382238e-14 350 300 8.68240888334652 350.75961234939 300 17.1010071662834 353.015368960705 300 25 356.698729810778 300 32.139380484327 361.697777844051 300 38.3022221559489 367.860619515673 300 43.3012701892219 375 300 46.9846310392954 382.898992833717 300 49.2403876506104 391.317591116653 300 50 400 300 49.2403876506104 408.682408883347 300 46.9846310392954 417.101007166283 300 43.3012701892219 425 300 38.3022221559489 432.139380484327 300 32.139380484327 438.302222155949 300 25 443.301270189222 300 17.1010071662835 446.984631039295 300 8.68240888334658 449.24038765061 300 7.27364132466213e-14 450 300 -8.68240888334644 449.24038765061 300 -17.1010071662833 446.984631039295 300 -24.9999999999999 443.301270189222 300 -32.1393804843269 438.302222155949 300 -38.3022221559488 432.139380484327 300 -43.3012701892219 425 300 -46.9846310392954 417.101007166284 300 -49.2403876506104 408.682408883347 300 -50 400 300 -49.2403876506104 391.317591116654 300 -46.9846310392955 382.898992833717 300 -43.301270189222 375 300 -38.302222155949 367.860619515673 300 -32.1393804843271 361.697777844051 300 -25.0000000000002 356.698729810778 300 -17.1010071662836 353.015368960705 300 -8.68240888334674 350.75961234939 210 -8.57224447675664e-15 350 192.808476042752 -19.8018301996066 354.088263569143 195.483114512722 -19.2337057459418 353.847377731445 197.960005297371 -18.3477062907747 353.48804794237 200.776836372029 -16.8481398619274 352.924101795035 203.402920949326 -14.8445852749198 352.254442217558 205.448505433598 -12.7021126053398 351.640343989945 207.182662399942 -10.2350434472155 351.058771099956 208.570797574629 -7.42465408034023 350.554327671456 209.536443767991 -4.28104718451168 350.183610770056 209.881735017624 -2.17177625553873 350.047188395291 119.43291878176 45.7886663327529 420.084771232648 135.848107983418 49.8292246503335 404.128967273617 119.43291878176 49.8292246503335 404.128967273617 185.093675588393 -45.7886663327528 420.084771232649 201.508864790051 -36.7861955336566 433.864078581287 185.093675588393 -36.7861955336566 433.864078581287 103.017729580102 45.7886663327529 420.084771232648 267.169621596684 30.7106356344834 360.54297453018 267.169621596684 16.2349734602341 352.709137914968 250.754432395026 16.2349734602341 352.709137914968 250.754432395026 30.7106356344834 360.54297453018 168.678486386735 -45.7886663327528 420.084771232649 152.263297185077 -49.8292246503335 404.128967273617 152.263297185077 -45.7886663327528 420.084771232649 234.339243193367 41.8583239131264 372.652592093879 217.924053991709 30.7106356344834 360.54297453018 217.924053991709 41.8583239131264 372.652592093879 135.848107983418 -49.8292246503335 404.128967273617 234.339243193367 30.7106356344834 360.54297453018 201.508864790051 48.4700132969665 387.72572564296 201.508864790051 41.8583239131264 372.652592093879 119.43291878176 -48.4700132969665 387.72572564296 103.017729580102 -49.8292246503335 404.128967273617 103.017729580102 -48.4700132969665 387.72572564296 119.43291878176 -49.8292246503335 404.128967273617 185.093675588393 48.4700132969665 387.72572564296 267.169621596684 -23.7973696518536 443.973687560324 250.754432395026 -8.22972951403665 449.318065170136 250.754432395026 -23.7973696518536 443.973687560324 267.169621596684 -8.22972951403665 449.318065170136 168.678486386735 49.8292246503335 404.128967273617 168.678486386735 48.4700132969665 387.72572564296 152.263297185077 48.4700132969665 387.72572564296 234.339243193367 -36.7861955336566 433.864078581287 234.339243193367 -23.7973696518536 443.973687560324 217.924053991709 -36.7861955336566 433.864078581287 152.263297185077 49.8292246503335 404.128967273617 201.508864790051 -45.7886663327528 420.084771232649 135.848107983418 45.7886663327529 420.084771232648 103.017729580102 36.7861955336566 433.864078581287 168.678486386735 -49.8292246503335 404.128967273617 283.584810798342 30.7106356344834 360.54297453018 283.584810798342 16.2349734602341 352.709137914968 250.754432395026 41.8583239131264 372.652592093879 135.848107983418 -48.4700132969665 387.72572564296 217.924053991709 48.4700132969665 387.72572564296 103.017729580102 -41.8583239131265 372.652592093879 283.584810798342 -23.7973696518536 443.973687560324 283.584810798342 -8.22972951403665 449.318065170136 185.093675588393 49.8292246503335 404.128967273617 250.754432395026 -36.7861955336566 433.864078581287 217.924053991709 -45.7886663327528 420.084771232649 152.263297185077 45.7886663327529 420.084771232648 185.093675588393 -49.8292246503335 404.128967273617 119.43291878176 36.7861955336566 433.864078581287 152.263297185077 -48.4700132969665 387.72572564296 267.169621596684 41.8583239131264 372.652592093879 234.339243193367 48.4700132969665 387.72572564296 119.43291878176 -41.8583239131265 372.652592093879 201.508864790051 49.8292246503335 404.128967273617 267.169621596684 -36.7861955336566 433.864078581287 234.339243193367 -45.7886663327528 420.084771232649 168.678486386735 45.7886663327529 420.084771232648 201.508864790051 -49.8292246503335 404.128967273617 135.848107983418 36.7861955336566 433.864078581287 168.678486386735 -48.4700132969665 387.72572564296 103.017729580102 23.7973696518537 443.973687560324 283.584810798342 41.8583239131264 372.652592093879 135.848107983418 -41.8583239131265 372.652592093879 250.754432395026 48.4700132969665 387.72572564296 103.017729580102 -30.7106356344834 360.54297453018 283.584810798342 -36.7861955336566 433.864078581287 217.924053991709 49.8292246503335 404.128967273617 250.754432395026 -45.7886663327528 420.084771232649 185.093675588393 45.7886663327529 420.084771232648 217.924053991709 -49.8292246503335 404.128967273617 152.263297185077 36.7861955336566 433.864078581287 185.093675588393 -48.4700132969665 387.72572564296 119.43291878176 23.7973696518537 443.973687560324 152.263297185077 -41.8583239131265 372.652592093879 267.169621596684 48.4700132969665 387.72572564296 119.43291878176 -30.7106356344834 360.54297453018 234.339243193367 49.8292246503335 404.128967273617 201.508864790051 45.7886663327529 420.084771232648 267.169621596684 -45.7886663327528 420.084771232649 234.339243193367 -49.8292246503335 404.128967273617 201.508864790051 -48.4700132969665 387.72572564296 168.678486386735 36.7861955336566 433.864078581287 168.678486386735 -41.8583239131265 372.652592093879 135.848107983418 23.7973696518537 443.973687560324 135.848107983418 -30.7106356344834 360.54297453018 103.017729580102 8.22972951403675 449.318065170136 283.584810798342 48.4700132969665 387.72572564296 250.754432395026 49.8292246503335 404.128967273617 103.017729580102 -16.2349734602342 352.709137914968 283.584810798342 -45.7886663327528 420.084771232649 217.924053991709 45.7886663327529 420.084771232648 250.754432395026 -49.8292246503335 404.128967273617 185.093675588393 36.7861955336566 433.864078581287 217.924053991709 -48.4700132969665 387.72572564296 152.263297185077 23.7973696518537 443.973687560324 185.093675588393 -41.8583239131265 372.652592093879 119.43291878176 8.22972951403675 449.318065170136 152.263297185077 -30.7106356344834 360.54297453018 267.169621596684 49.8292246503335 404.128967273617 119.43291878176 -16.2349734602342 352.709137914968 234.339243193367 45.7886663327529 420.084771232648 267.169621596684 -49.8292246503335 404.128967273617 201.508864790051 36.7861955336566 433.864078581287 234.339243193367 -48.4700132969665 387.72572564296 168.678486386735 23.7973696518537 443.973687560324 201.508864790051 -41.8583239131265 372.652592093879 168.678486386735 -30.7106356344834 360.54297453018 135.848107983418 8.22972951403675 449.318065170136 103.017729580102 -8.22972951403665 449.318065170136 135.848107983418 -16.2349734602342 352.709137914968 283.584810798342 49.8292246503335 404.128967273617 250.754432395026 45.7886663327529 420.084771232648 283.584810798342 -49.8292246503335 404.128967273617 250.754432395026 -48.4700132969665 387.72572564296 217.924053991709 36.7861955336566 433.864078581287 217.924053991709 -41.8583239131265 372.652592093879 185.093675588393 23.7973696518537 443.973687560324 185.093675588393 -30.7106356344834 360.54297453018 152.263297185077 8.22972951403675 449.318065170136 152.263297185077 -16.2349734602342 352.709137914968 119.43291878176 -8.22972951403665 449.318065170136 267.169621596684 -48.4700132969665 387.72572564296 267.169621596684 45.7886663327529 420.084771232648 234.339243193367 -41.8583239131265 372.652592093879 234.339243193367 36.7861955336566 433.864078581287 201.508864790051 -30.7106356344834 360.54297453018 201.508864790051 23.7973696518537 443.973687560324 168.678486386735 -16.2349734602342 352.709137914968 168.678486386735 8.22972951403675 449.318065170136 283.584810798342 -48.4700132969665 387.72572564296 250.754432395026 -41.8583239131265 372.652592093879 135.848107983418 -8.22972951403665 449.318065170136 217.924053991709 -30.7106356344834 360.54297453018 103.017729580102 -23.7973696518536 443.973687560324 283.584810798342 45.7886663327529 420.084771232648 267.169621596684 -41.8583239131265 372.652592093879 250.754432395026 36.7861955336566 433.864078581287 217.924053991709 23.7973696518537 443.973687560324 234.339243193367 -30.7106356344834 360.54297453018 283.584810798342 -41.8583239131265 372.652592093879 103.017729580102 16.2349734602341 352.709137914968 152.263297185077 -8.22972951403665 449.318065170136 119.43291878176 16.2349734602341 352.709137914968 250.754432395026 -30.7106356344834 360.54297453018 217.924053991709 -16.2349734602342 352.709137914968 119.43291878176 -23.7973696518536 443.973687560324 135.848107983418 16.2349734602341 352.709137914968 267.169621596684 36.7861955336566 433.864078581287 267.169621596684 -30.7106356344834 360.54297453018 234.339243193367 -16.2349734602342 352.709137914968 234.339243193367 23.7973696518537 443.973687560324 103.017729580102 30.7106356344834 360.54297453018 152.263297185077 16.2349734602341 352.709137914968 168.678486386735 -8.22972951403665 449.318065170136 283.584810798342 -30.7106356344834 360.54297453018 135.848107983418 -23.7973696518536 443.973687560324 250.754432395026 -16.2349734602342 352.709137914968 119.43291878176 30.7106356344834 360.54297453018 267.169621596684 -16.2349734602342 352.709137914968 103.017729580102 -36.7861955336566 433.864078581287 168.678486386735 16.2349734602341 352.709137914968 283.584810798342 -16.2349734602342 352.709137914968 283.584810798342 36.7861955336566 433.864078581287 250.754432395026 23.7973696518537 443.973687560324 135.848107983418 30.7106356344834 360.54297453018 217.924053991709 8.22972951403675 449.318065170136 103.017729580102 41.8583239131264 372.652592093879 152.263297185077 -23.7973696518536 443.973687560324 152.263297185077 30.7106356344834 360.54297453018 119.43291878176 -36.7861955336566 433.864078581287 267.169621596684 23.7973696518537 443.973687560324 119.43291878176 41.8583239131264 372.652592093879 168.678486386735 30.7106356344834 360.54297453018 234.339243193367 8.22972951403675 449.318065170136 168.678486386735 -23.7973696518536 443.973687560324 135.848107983418 41.8583239131264 372.652592093879 135.848107983418 -36.7861955336566 433.864078581287 103.017729580102 48.4700132969665 387.72572564296 103.017729580102 -45.7886663327528 420.084771232649 217.924053991709 16.2349734602341 352.709137914968 283.584810798342 23.7973696518537 443.973687560324 250.754432395026 8.22972951403675 449.318065170136 185.093675588393 30.7106356344834 360.54297453018 217.924053991709 -8.22972951403665 449.318065170136 185.093675588393 -23.7973696518536 443.973687560324 152.263297185077 41.8583239131264 372.652592093879 119.43291878176 48.4700132969665 387.72572564296 152.263297185077 -36.7861955336566 433.864078581287 234.339243193367 16.2349734602341 352.709137914968 119.43291878176 -45.7886663327528 420.084771232649 201.508864790051 30.7106356344834 360.54297453018 267.169621596684 8.22972951403675 449.318065170136 168.678486386735 41.8583239131264 372.652592093879 234.339243193367 -8.22972951403665 449.318065170136 201.508864790051 -23.7973696518536 443.973687560324 135.848107983418 48.4700132969665 387.72572564296 168.678486386735 -36.7861955336566 433.864078581287 103.017729580102 49.8292246503335 404.128967273617 135.848107983418 -45.7886663327528 420.084771232649 283.584810798342 8.22972951403675 449.318065170136 185.093675588393 41.8583239131264 372.652592093879 217.924053991709 -23.7973696518536 443.973687560324 2.73007580752231 190 3.14159265358979 210 2.73492819040754 187.024366020417 2.7474837119525 184.397529800585 2.77062611730711 181.546913604686 2.80448459564326 178.752969008674 2.84452135903044 176.369667096977 2.89092500251957 174.309971315007 2.94492999675158 172.548649956894 3.00237927612647 171.242034340645 3.06388091972185 170.380301086729 3.122373502916 170.023096521915 3.17866510933174 170.086043866562 3.23145479350909 170.509841698291 3.28906434405541 171.398299667707 3.34521005871398 172.743857915231 3.39324766316843 174.347888840505 3.43516921781859 176.192341023654 3.47191925165955 178.295746540249 3.50290053040403 180.640667676887 3.52729664313396 183.205669615023 3.54456948047501 186.059267040101 3.55262000752568 189.05297923185 3.5511452401824 191.895773051283 3.54202385575198 194.48438891673 3.52281744034578 197.343898776281 3.49366089659563 200.13477025801 3.45876817080794 202.522803249016 3.41850512342417 204.599616537762 3.37227391533675 206.410620564223 3.31908716723907 207.946109646233 3.26136014184309 209.086918743382 3.20502207417703 209.747291812357 3.08481357338775 209.797702468142 3.03041585385138 209.215264429107 2.97982054446045 208.306916927762 2.92244240721551 206.788174560315 2.86816612733564 204.754879178687 2.82577961636135 202.602997991452 2.78967029998251 200.14641042884 2.76054039635132 197.364149940715 2.74008093006067 194.262428648985 2.73264036238492 192.165572916192 5.8716684611121 190 6.28318530717959 170 5.87598882340341 187.19152395552 5.88833055967778 184.516885484041 5.9074527029433 182.039994698179 5.93949613715545 179.223163623154 5.98174936926212 176.597079044967 6.0263279675771 174.551494560294 6.07702721219688 172.81733759401 6.1341410212019 171.42920242427 6.19745940274944 170.463556231093 6.23973611320879 170.118264986057 6.28318530717959 100 4.71238898038469 86.6025403784438 4.84988302442822 86.8732667031317 4.9824100965315 87.6235772593243 5.10887970344934 88.7290516622296 5.26433924207639 90.4840004397121 5.43814296926353 92.7428861391894 5.61159756603283 95.0372320329239 5.77244529009577 96.9671604229308 5.92510064538493 98.4525657430886 6.08684189351647 99.5231396908821 6.1841064433386 99.8776181649079 3.14159265358979 100 4.57489493634131 86.8732667031312 4.44236786423814 87.6235772593223 4.31589825732044 88.7290516622257 4.16043871869357 90.484000439705 3.98663499150652 92.7428861391805 3.81318039473733 95.0372320329138 3.65233267034643 96.9671604293251 3.49967731603553 98.4525657314274 3.33793606869753 99.5231396846886 3.24067151591787 99.877618163893 1.5707963267949 86.6025403784439 2.98604321659331 99.6995349038218 2.836168301898 98.8632990204774 2.69385026307151 97.6290200022515 2.55873212415881 96.1384934421685 2.39426299109247 94.0482819113587 2.22181558536708 91.7501087080715 2.06401881848322 89.779880280166 1.89843078523084 88.0845894011336 1.74034205381637 87.0125187464446 1.65639307408664 86.7079714631655 -8.88178419700125e-16 100 0.155549038831779 99.6995364250708 0.30542359275373 98.8633045221148 0.44774130960487 97.6290308111529 0.582859155090544 96.1385098653288 0.747328095775065 94.0483026744097 0.919775053556721 91.7501351704929 1.07757133347658 89.7799093309045 1.24315877151204 88.0846161813635 1.40124690335627 87.0125364098992 1.48519768772147 86.7079761092912 1.84889274661175e-32 170 0.411516846067488 190 0.0568023201262033 170.202464309206 0.111190443861577 170.784931061703 0.161833030143797 171.694405902748 0.219229844709802 173.214340920064 0.273495595887875 175.24816387627 0.315887495176125 177.401364011892 0.351975748365346 179.857848980619 0.381067644864545 182.637652604668 0.40150997985239 185.737201868648 0.408952371081965 187.834463425865 1.84889274661175e-32 210 0.0568023199990197 209.797535684556 0.111190444137581 209.215068935606 0.16183302951732 208.305594113848 0.219229843519676 206.785659117562 0.273495594881989 204.751836168062 0.315887494328895 202.598636037752 0.351975747677605 200.142151074243 0.381067644351949 197.362347455423 0.40150997954739 194.262798195698 0.408952371002272 192.165536607703 1.84889274661175e-32 300 6.28318530717959 300 0.174532925199433 300 0.349065850398866 300 0.523598775598299 300 0.698131700797732 300 0.872664625997165 300 1.0471975511966 300 1.22173047639603 300 1.39626340159546 300 1.5707963267949 300 1.74532925199433 300 1.91986217719376 300 2.0943951023932 300 2.26892802759263 300 2.44346095279206 300 2.61799387799149 300 2.79252680319093 300 2.96705972839036 300 3.14159265358979 300 3.31612557878922 300 3.49065850398866 300 3.66519142918809 300 3.83972435438752 300 4.01425727958696 300 4.18879020478639 300 4.36332312998582 300 4.53785605518525 300 4.71238898038469 300 4.88692190558412 300 5.06145483078355 300 5.23598775598299 300 5.41052068118242 300 5.58505360638185 300 5.75958653158128 300 5.93411945678072 300 6.10865238198015 300 6.28318530717959 210 5.87598882339807 192.808476042752 5.88833055965779 195.483114512722 5.90745270290179 197.960005297371 5.93949613708999 200.776836372029 5.98174936915421 203.402920949326 6.0263279674235 205.448505433598 6.07702721198942 207.182662399942 6.13414102093299 208.570797574629 6.19745940304688 209.536443767991 6.23973611264938 209.881735017624 1.98416378121461 119.43291878176 1.65346981767884 135.848107983418 1.65346981767884 119.43291878176 4.29902152596498 185.093675588393 3.96832756242921 201.508864790051 3.96832756242921 185.093675588393 1.98416378121461 103.017729580102 0.661387927071534 267.169621596684 0.330693963535767 267.169621596684 0.330693963535767 250.754432395026 0.661387927071534 250.754432395026 4.29902152596498 168.678486386735 4.62971548950075 152.263297185077 4.29902152596498 152.263297185077 0.992081890607302 234.339243193367 0.661387927071534 217.924053991709 0.992081890607302 217.924053991709 4.62971548950075 135.848107983418 0.661387927071534 234.339243193367 1.32277585414307 201.508864790051 0.992081890607302 201.508864790051 4.96040945303651 119.43291878176 4.62971548950075 103.017729580102 4.96040945303651 103.017729580102 4.62971548950075 119.43291878176 1.32277585414307 185.093675588393 3.63763359889344 267.169621596684 3.30693963535768 250.754432395026 3.63763359889344 250.754432395026 3.30693963535768 267.169621596684 1.65346981767884 168.678486386735 1.32277585414307 168.678486386735 1.32277585414307 152.263297185077 3.96832756242921 234.339243193367 3.63763359889344 234.339243193367 3.96832756242921 217.924053991709 1.65346981767884 152.263297185077 4.29902152596498 201.508864790051 1.98416378121461 135.848107983418 2.31485774475037 103.017729580102 4.62971548950075 168.678486386735 0.661387927071534 283.584810798342 0.330693963535767 283.584810798342 0.992081890607302 250.754432395026 4.96040945303651 135.848107983418 1.32277585414307 217.924053991709 5.29110341657228 103.017729580102 3.63763359889344 283.584810798342 3.30693963535768 283.584810798342 1.65346981767884 185.093675588393 3.96832756242921 250.754432395026 4.29902152596498 217.924053991709 1.98416378121461 152.263297185077 4.62971548950075 185.093675588393 2.31485774475037 119.43291878176 4.96040945303651 152.263297185077 0.992081890607302 267.169621596684 1.32277585414307 234.339243193367 5.29110341657228 119.43291878176 1.65346981767884 201.508864790051 3.96832756242921 267.169621596684 4.29902152596498 234.339243193367 1.98416378121461 168.678486386735 4.62971548950075 201.508864790051 2.31485774475037 135.848107983418 4.96040945303651 168.678486386735 2.64555170828614 103.017729580102 0.992081890607302 283.584810798342 5.29110341657228 135.848107983418 1.32277585414307 250.754432395026 5.62179738010805 103.017729580102 3.96832756242921 283.584810798342 1.65346981767884 217.924053991709 4.29902152596498 250.754432395026 1.98416378121461 185.093675588393 4.62971548950075 217.924053991709 2.31485774475037 152.263297185077 4.96040945303651 185.093675588393 2.64555170828614 119.43291878176 5.29110341657228 152.263297185077 1.32277585414307 267.169621596684 5.62179738010805 119.43291878176 1.65346981767884 234.339243193367 1.98416378121461 201.508864790051 4.29902152596498 267.169621596684 4.62971548950075 234.339243193367 4.96040945303651 201.508864790051 2.31485774475037 168.678486386735 5.29110341657228 168.678486386735 2.64555170828614 135.848107983418 5.62179738010805 135.848107983418 2.97624567182191 103.017729580102 1.32277585414307 283.584810798342 1.65346981767884 250.754432395026 5.95249134364382 103.017729580102 4.29902152596498 283.584810798342 1.98416378121461 217.924053991709 4.62971548950075 250.754432395026 2.31485774475037 185.093675588393 4.96040945303651 217.924053991709 2.64555170828614 152.263297185077 5.29110341657228 185.093675588393 2.97624567182191 119.43291878176 5.62179738010805 152.263297185077 1.65346981767884 267.169621596684 5.95249134364382 119.43291878176 1.98416378121461 234.339243193367 4.62971548950075 267.169621596684 2.31485774475037 201.508864790051 4.96040945303651 234.339243193367 2.64555170828614 168.678486386735 5.29110341657228 201.508864790051 5.62179738010805 168.678486386735 2.97624567182191 135.848107983418 3.30693963535768 103.017729580102 5.95249134364382 135.848107983418 1.65346981767884 283.584810798342 1.98416378121461 250.754432395026 4.62971548950075 283.584810798342 4.96040945303651 250.754432395026 2.31485774475037 217.924053991709 5.29110341657228 217.924053991709 2.64555170828614 185.093675588393 5.62179738010805 185.093675588393 2.97624567182191 152.263297185077 5.95249134364382 152.263297185077 3.30693963535768 119.43291878176 4.96040945303651 267.169621596684 1.98416378121461 267.169621596684 5.29110341657228 234.339243193367 2.31485774475037 234.339243193367 5.62179738010805 201.508864790051 2.64555170828614 201.508864790051 5.95249134364382 168.678486386735 2.97624567182191 168.678486386735 4.96040945303651 283.584810798342 5.29110341657228 250.754432395026 3.30693963535768 135.848107983418 5.62179738010805 217.924053991709 3.63763359889344 103.017729580102 1.98416378121461 283.584810798342 5.29110341657228 267.169621596684 2.31485774475037 250.754432395026 2.64555170828614 217.924053991709 5.62179738010805 234.339243193367 5.29110341657228 283.584810798342 0.330693963535767 103.017729580102 3.30693963535768 152.263297185077 0.330693963535767 119.43291878176 5.62179738010805 250.754432395026 5.95249134364382 217.924053991709 3.63763359889344 119.43291878176 0.330693963535767 135.848107983418 2.31485774475037 267.169621596684 5.62179738010805 267.169621596684 5.95249134364382 234.339243193367 2.64555170828614 234.339243193367 0.661387927071534 103.017729580102 0.330693963535767 152.263297185077 3.30693963535768 168.678486386735 5.62179738010805 283.584810798342 3.63763359889344 135.848107983418 5.95249134364382 250.754432395026 0.661387927071534 119.43291878176 5.95249134364382 267.169621596684 3.96832756242921 103.017729580102 0.330693963535767 168.678486386735 5.95249134364382 283.584810798342 2.31485774475037 283.584810798342 2.64555170828614 250.754432395026 0.661387927071534 135.848107983418 2.97624567182191 217.924053991709 0.992081890607302 103.017729580102 3.63763359889344 152.263297185077 0.661387927071534 152.263297185077 3.96832756242921 119.43291878176 2.64555170828614 267.169621596684 0.992081890607302 119.43291878176 0.661387927071534 168.678486386735 2.97624567182191 234.339243193367 3.63763359889344 168.678486386735 0.992081890607302 135.848107983418 3.96832756242921 135.848107983418 1.32277585414307 103.017729580102 4.29902152596498 103.017729580102 0.330693963535767 217.924053991709 2.64555170828614 283.584810798342 2.97624567182191 250.754432395026 0.661387927071534 185.093675588393 3.30693963535768 217.924053991709 3.63763359889344 185.093675588393 0.992081890607302 152.263297185077 1.32277585414307 119.43291878176 3.96832756242921 152.263297185077 0.330693963535767 234.339243193367 4.29902152596498 119.43291878176 0.661387927071534 201.508864790051 2.97624567182191 267.169621596684 0.992081890607302 168.678486386735 3.30693963535768 234.339243193367 3.63763359889344 201.508864790051 1.32277585414307 135.848107983418 3.96832756242921 168.678486386735 1.65346981767884 103.017729580102 4.29902152596498 135.848107983418 2.97624567182191 283.584810798342 0.992081890607302 185.093675588393 3.63763359889344 217.924053991709 172 173 174 175 176 177 172 174 178 179 180 181 179 181 182 175 177 183 184 183 185 186 187 188 184 185 189 186 190 187 191 188 192 193 194 195 193 196 194 191 192 197 198 199 200 198 201 199 202 203 204 205 200 206 205 206 207 202 204 208 209 176 175 209 207 176 210 173 172 210 208 173 211 178 85 212 183 184 211 84 83 211 85 84 213 129 128 213 130 129 212 175 183 213 180 179 213 128 214 213 214 180 215 182 190 216 196 193 216 189 196 215 190 186 217 186 188 218 60 61 218 61 62 218 195 60 218 193 195 219 146 145 217 188 191 219 147 146 219 220 201 219 145 220 221 203 202 219 201 198 221 197 203 222 198 200 222 200 205 223 207 209 224 202 208 223 205 207 224 208 210 225 209 175 226 211 83 226 172 178 226 178 211 225 175 212 227 184 189 227 189 216 228 182 215 228 179 182 229 186 217 229 215 186 230 216 193 231 197 221 230 193 218 232 219 198 231 191 197 232 198 222 233 222 205 233 205 223 234 221 202 234 202 224 235 223 209 235 209 225 236 210 172 236 172 226 237 212 184 238 82 81 238 83 82 239 179 228 237 184 227 239 131 130 239 132 131 240 227 216 239 213 179 239 130 213 241 228 215 240 216 230 242 218 62 241 215 229 242 230 218 242 62 63 242 63 64 243 219 232 243 148 147 243 149 148 243 147 219 244 217 191 244 191 231 245 232 222 246 221 234 246 231 221 245 222 233 247 233 223 247 223 235 248 210 236 248 224 210 249 212 237 250 226 83 250 238 81 250 236 226 249 225 212 250 83 238 251 227 240 251 237 227 252 228 241 252 239 228 253 242 64 254 229 217 253 240 230 253 230 242 254 217 244 255 231 246 256 243 232 256 232 245 257 233 247 255 244 231 257 245 233 258 235 225 259 224 248 259 234 224 258 225 249 260 237 251 261 236 250 261 248 236 260 249 237 262 251 240 263 80 68 263 81 80 264 132 239 264 133 132 264 134 133 264 239 252 262 240 253 265 241 229 266 64 65 266 65 66 265 229 254 267 150 149 268 244 255 267 151 150 267 243 256 267 149 243 269 256 245 269 245 257 268 254 244 270 246 234 270 234 259 271 235 258 272 8 7 271 247 235 272 259 248 273 258 249 272 248 261 273 249 260 274 250 81 275 251 262 274 263 68 274 261 250 274 81 263 276 252 241 275 260 251 276 241 265 277 253 64 277 64 266 277 266 66 277 66 67 278 254 268 279 267 256 278 265 254 280 255 246 279 256 269 281 247 271 281 257 247 280 246 270 282 6 5 283 271 258 282 7 6 283 258 273 282 270 259 282 259 272 282 272 7 284 273 260 284 260 275 284 48 47 285 261 274 285 272 261 286 77 76 286 78 77 287 45 55 288 135 134 287 253 277 287 56 45 288 134 264 288 264 252 287 67 56 288 252 276 287 277 67 287 262 253 289 276 265 290 151 267 290 267 279 290 152 151 289 265 278 291 269 257 292 268 255 291 257 281 293 271 283 292 255 280 294 3 1 293 281 271 294 4 3 294 5 4 294 282 5 294 1 43 294 280 270 295 46 44 294 270 282 295 47 46 295 273 284 295 284 47 296 12 11 295 283 273 296 8 272 296 272 285 297 53 52 297 54 53 297 55 54 297 275 262 298 274 68 297 287 55 297 262 287 298 68 78 298 285 274 298 286 76 298 78 286 299 279 269 300 276 289 299 269 291 301 281 293 300 288 276 302 268 292 301 291 281 303 44 162 303 162 163 303 163 164 302 278 268 303 293 283 303 295 44 304 41 40 303 283 295 304 42 41 304 43 42 305 284 275 304 292 280 305 49 48 304 280 294 305 50 49 305 51 50 304 294 43 305 52 51 306 9 8 305 297 52 306 10 9 305 48 284 306 11 10 305 275 297 306 8 296 307 153 152 306 296 11 307 154 153 307 279 299 307 290 279 307 152 290 308 299 291 308 291 301 309 296 285 309 285 298 310 293 303 310 301 293 311 75 74 311 76 75 312 288 300 312 135 288 312 136 135 312 137 136 310 303 164 313 307 299 314 278 302 313 299 308 314 289 278 315 292 304 316 301 310 315 39 38 316 308 301 315 40 39 317 307 313 315 302 292 317 154 307 315 304 40 318 91 92 317 155 154 319 13 12 318 92 93 317 156 155 319 14 13 319 296 309 320 91 318 321 308 316 320 318 93 319 12 296 321 313 308 320 90 91 322 164 165 323 76 311 322 165 166 323 311 74 322 166 167 322 167 168 324 103 101 322 168 169 323 298 76 322 310 164 325 289 314 326 313 321 326 317 313 325 300 289 324 90 320 324 101 90 327 322 169 328 302 315 327 310 322 329 93 94 329 94 95 327 169 170 328 314 302 330 104 103 327 170 171 331 15 14 330 105 104 327 171 161 331 16 15 330 106 105 327 316 310 331 17 16 332 156 317 331 319 17 331 14 319 332 157 156 332 158 157 333 309 298 332 317 326 330 103 324 334 327 161 333 298 323 335 320 93 334 316 327 334 161 125 335 93 329 334 321 316 336 326 321 336 334 125 337 73 72 337 74 73 338 107 106 336 321 334 338 108 107 339 332 326 338 109 108 339 326 336 340 137 312 338 110 109 339 158 332 339 336 125 340 138 137 338 106 330 339 159 158 340 300 325 339 160 159 340 139 138 339 125 160 340 312 300 341 325 314 342 324 320 342 320 335 341 314 328 343 328 315 343 315 38 343 34 2 343 35 34 343 36 35 343 37 36 343 38 37 344 329 95 344 95 96 345 319 309 344 96 97 345 18 17 346 330 324 345 17 319 345 309 333 346 324 342 347 333 323 347 74 337 347 323 74 348 340 325 349 329 344 349 335 329 350 111 110 348 325 341 351 328 343 351 343 2 351 341 328 350 330 346 350 338 330 350 110 338 352 18 345 352 19 18 353 335 349 352 20 19 352 21 20 353 342 335 354 333 347 355 344 97 355 349 344 354 345 333 355 97 98 355 98 99 356 337 72 355 99 100 357 116 117 357 117 118 356 71 70 357 118 119 356 72 71 357 119 120 356 347 337 357 120 121 358 140 139 358 141 140 358 139 340 358 340 348 359 341 351 360 112 111 360 102 112 359 348 341 360 123 102 360 111 350 361 30 29 361 31 30 361 32 31 361 33 32 361 2 33 362 22 21 363 346 342 362 23 22 362 24 23 362 21 352 363 342 353 364 349 355 364 353 349 365 345 354 366 113 114 366 114 115 366 115 116 365 352 345 367 347 356 367 354 347 366 116 357 368 121 122 368 122 123 368 123 360 369 358 348 369 348 359 370 346 363 371 351 2 371 2 361 371 359 351 370 350 346 372 25 24 372 26 25 373 353 364 372 27 26 373 363 353 372 24 362 374 362 352 375 88 87 375 89 88 375 79 89 375 355 100 374 352 365 375 100 79 181 124 113 181 113 366 376 365 354 376 354 367 194 367 356 194 57 58 187 121 368 187 357 121 194 69 57 194 70 69 194 356 70 377 142 141 377 143 142 377 141 358 378 350 370 377 358 369 378 360 350 199 359 371 204 370 363 199 369 359 204 363 373 379 28 27 379 29 28 174 364 355 174 355 375 379 27 372 379 361 29 177 362 374 177 372 362 180 124 181 185 365 376 185 374 365 190 357 187 190 366 357 192 368 360 196 376 367 196 367 194 192 360 378 192 187 368 201 377 369 201 369 199 203 378 370 203 370 204 173 364 174 206 361 379 173 373 364 206 371 361 176 372 177 178 375 87 178 86 85 178 174 375 176 379 372 178 87 86 214 126 124 214 127 126 214 128 127 214 124 180 183 374 185 182 181 366 183 177 374 189 376 196 182 366 190 188 187 192 189 185 376 195 58 59 195 59 60 195 194 58 220 143 377 220 144 143 220 145 144 220 377 201 200 371 206 197 192 378 200 199 371 197 378 203 208 373 173 207 379 176 207 206 379 208 204 373 +37 36 1 0 +100 -2.44921270764475e-14 0 98.4807753012208 17.364817766693 0 93.9692620785908 34.2020143325669 0 86.6025403784439 50 0 76.6044443118978 64.2787609686539 0 64.2787609686539 76.6044443118978 0 50 86.6025403784439 0 34.2020143325669 93.9692620785908 0 17.364817766693 98.4807753012208 0 6.12303176911189e-15 100 0 -17.364817766693 98.4807753012208 0 -34.2020143325669 93.9692620785908 0 -50 86.6025403784439 0 -64.2787609686539 76.6044443118978 0 -76.6044443118978 64.278760968654 0 -86.6025403784438 50.0000000000001 0 -93.9692620785908 34.202014332567 0 -98.4807753012208 17.3648177666932 0 -100 1.45472826493243e-13 0 -98.4807753012208 -17.3648177666929 0 -93.9692620785909 -34.2020143325667 0 -86.602540378444 -49.9999999999998 0 -76.604444311898 -64.2787609686538 0 -64.2787609686541 -76.6044443118977 0 -50.0000000000002 -86.6025403784437 0 -34.2020143325671 -93.9692620785908 0 -17.3648177666933 -98.4807753012208 0 -2.84822621217373e-13 -100 0 17.3648177666927 -98.4807753012209 0 34.2020143325666 -93.969262078591 0 49.9999999999997 -86.602540378444 0 64.2787609686536 -76.604444311898 0 76.6044443118976 -64.2787609686542 0 86.6025403784437 -50.0000000000004 0 93.9692620785907 -34.2020143325673 0 98.4807753012207 -17.3648177666935 0 0 0 0 100 -2.8421709430404e-14 98.4807753012208 17.364817766693 93.9692620785908 34.2020143325669 86.6025403784439 50 76.6044443118978 64.2787609686539 64.278760968654 76.6044443118978 50 86.6025403784438 34.2020143325669 93.9692620785908 17.364817766693 98.4807753012208 0 100 -17.364817766693 98.4807753012208 -34.2020143325669 93.9692620785908 -50 86.6025403784439 -64.2787609686539 76.6044443118979 -76.6044443118978 64.278760968654 -86.6025403784438 50.0000000000001 -93.9692620785908 34.202014332567 -98.4807753012208 17.3648177666932 -100 1.4210854715202e-13 -98.4807753012208 -17.3648177666929 -93.9692620785909 -34.2020143325667 -86.602540378444 -49.9999999999998 -76.604444311898 -64.2787609686538 -64.2787609686541 -76.6044443118977 -50.0000000000002 -86.6025403784437 -34.2020143325671 -93.9692620785908 -17.3648177666933 -98.4807753012208 -2.8421709430404e-13 -100 17.3648177666927 -98.4807753012209 34.2020143325666 -93.969262078591 49.9999999999997 -86.602540378444 64.2787609686536 -76.604444311898 76.6044443118976 -64.2787609686542 86.6025403784437 -50.0000000000004 93.9692620785907 -34.2020143325673 98.4807753012207 -17.3648177666935 0 0 37 11 12 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 +81 79 1 0.08806932591171 +210 -4.89842541528951e-15 450 190 20 445.825756949558 209.797702468142 2.83742874189979 449.91942504134 209.215264429107 5.5473956609573 449.69131111379 208.306916927762 8.05337150161281 449.347170220943 206.788174560315 10.8700135987294 448.804126907314 204.754879178687 13.5016125308194 448.142563877523 202.602997991452 15.5294700803301 447.527208622277 200.14641042884 17.2351489960208 446.935590404877 197.364149940715 18.5948729149583 446.413690924525 194.262428648985 19.5405143016412 446.023562404914 192.165572916192 19.8824116982837 445.876897309791 210 -4.89842541528951e-15 580 210 -4.89842541528951e-15 580 209.696155060244 3.47296355333861 580 208.793852415718 6.84040286651337 580 207.320508075689 10 580 205.32088886238 12.8557521937308 580 202.855752193731 15.3208888623796 580 200 17.3205080756888 580 196.840402866513 18.7938524157182 580 193.472963553339 19.6961550602442 580 190 20 580 186.527036446661 19.6961550602442 580 183.159597133487 18.7938524157182 580 180 17.3205080756888 580 177.144247806269 15.3208888623796 580 174.67911113762 12.8557521937308 580 172.679491924311 10 580 171.206147584282 6.84040286651339 580 170.303844939756 3.47296355333863 580 170 2.90945652986485e-14 580 170.303844939756 -3.47296355333857 580 171.206147584282 -6.84040286651334 580 172.679491924311 -9.99999999999996 580 174.67911113762 -12.8557521937308 580 177.144247806269 -15.3208888623795 580 180 -17.3205080756887 580 183.159597133487 -18.7938524157181 580 186.527036446661 -19.6961550602442 580 190 -20 580 193.472963553339 -19.6961550602442 580 196.840402866513 -18.7938524157182 580 200 -17.3205080756888 580 202.855752193731 -15.3208888623796 580 205.32088886238 -12.8557521937308 580 207.320508075689 -10.0000000000001 580 208.793852415718 -6.84040286651346 580 209.696155060244 -3.4729635533387 580 210 -4.89842541528951e-15 450 187.024366020417 19.7774012963438 445.922264725258 184.397529800585 19.1992796277918 446.166954243274 181.546913604686 18.125819553687 446.59886977596 178.752969008674 16.5379654738046 447.185757348038 176.369667096977 14.6360522075901 447.809894135463 174.309971315007 12.4025399755702 448.437351320804 172.548649956894 9.76987059841766 449.036207207027 171.242034340645 6.93820726756652 449.51627283167 170.380301086729 3.88167696084131 449.849098129506 170.023096521915 0.960898368304993 449.990765883617 170.086043866562 -1.8531982436549 449.965644740411 170.509841698291 -4.48706231247217 449.798255709213 171.398299667707 -7.34688690845968 449.457287186436 172.743857915231 -10.1106660571351 448.967075069423 174.347888840505 -12.4503589683746 448.425082205426 176.192341023654 -14.4688795692552 447.86074933687 178.295746540249 -16.2176006194872 447.296825505482 180.640667676887 -17.6748961416399 446.7717611852 183.205669615023 -18.8105768661047 446.326693427354 186.059267040101 -19.6079226714758 445.994884340429 189.05297923185 -19.9775663053321 445.835541404226 191.895773051283 -19.9099477889329 445.864953696004 194.48438891673 -19.4907734771899 446.044649514275 197.343898776281 -18.6028803528253 446.410482031254 200.13477025801 -17.2419961803721 446.933075375945 202.522803249016 -15.5942105252608 447.506005983989 204.599616537762 -13.6693524360872 448.095205754853 206.410620564223 -11.4320396201158 448.675542899776 207.946109646233 -8.82820037172931 449.214457777936 209.086918743382 -5.97406825644437 449.641821815127 209.747291812357 -3.16934437217016 449.899454557652 0 70 1.5707963267949 65.8257569495584 0.142351747122082 69.9194250413404 0.281055375999813 69.6913111137899 0.414430358933343 69.347170220943 0.57460191467716 68.8041269073138 0.74107398002479 68.1425638775227 0.889050078939067 67.5272086222772 1.03872370599815 66.9355904048767 1.19371599529568 66.4136909245251 1.35602764574802 66.0235624049143 1.46230497436568 65.8768973097914 0 200 6.28318530717959 200 0.174532925199433 200 0.349065850398866 200 0.523598775598299 200 0.698131700797732 200 0.872664625997165 200 1.0471975511966 200 1.22173047639603 200 1.39626340159546 200 1.5707963267949 200 1.74532925199433 200 1.91986217719376 200 2.0943951023932 200 2.26892802759263 200 2.44346095279206 200 2.61799387799149 200 2.79252680319093 200 2.96705972839036 200 3.14159265358979 200 3.31612557878922 200 3.49065850398866 200 3.66519142918809 200 3.83972435438752 200 4.01425727958696 200 4.18879020478639 200 4.36332312998582 200 4.53785605518525 200 4.71238898038469 200 4.88692190558412 200 5.06145483078355 200 5.23598775598299 200 5.41052068118242 200 5.58505360638185 200 5.75958653158128 200 5.93411945678072 200 6.10865238198015 200 6.28318530717959 70 1.72013247146725 65.9222647252579 1.85471909915631 66.1669542432741 2.00716842603721 66.5988697759599 2.1680232039098 67.1857573480384 2.32062944411443 67.8098941354628 2.47268807187481 68.4373513208037 2.63123021656973 69.0362072070267 2.78731777911728 69.5162728316698 2.94626920198406 69.8490981295058 3.09352922962378 69.9907658836172 3.23438566536289 69.965644740411 3.36787183147278 69.7982557092127 3.51774477754683 69.4572871864363 3.67159260869899 68.9670750694232 3.81354864144537 68.4250822054262 3.95037073077329 67.8607493368701 4.08724665603431 67.2968255054819 4.22540029705421 66.7717611852004 4.3657735702699 66.3266934273543 4.5140545776344 65.9948843404291 4.66502022222132 65.8355414042262 4.8073201484896 65.864953696004 4.93853099433839 66.0446495142749 5.08838047165455 66.4104820312536 5.24378635980383 66.9330753759453 5.38898193691902 67.5060059839887 5.53068286483151 68.0952057548532 5.67472839418684 68.6755428997765 5.82601583894822 69.2144577779357 5.97985154473146 69.6418218151269 6.12404711892915 69.8994545576524 13 1 3 15 3 4 15 13 3 16 4 5 16 15 4 17 5 6 17 16 5 18 6 7 18 17 6 19 7 8 19 18 7 20 8 9 20 19 8 21 9 10 21 10 11 21 20 9 22 11 12 22 21 11 23 12 2 23 2 51 23 22 12 24 23 51 24 51 52 25 24 52 25 52 53 26 25 53 26 53 54 27 26 54 27 54 55 28 55 56 28 56 57 28 27 55 29 28 57 29 57 58 30 58 59 30 29 58 31 30 59 31 59 60 32 60 61 32 31 60 33 61 62 33 32 61 34 62 63 34 33 62 35 63 64 35 34 63 36 64 65 36 65 66 36 35 64 37 66 67 37 36 66 38 67 68 38 37 67 39 38 68 39 68 69 40 39 69 40 69 70 40 70 71 41 71 72 41 40 71 42 41 72 42 72 73 43 42 73 43 73 74 43 74 75 44 43 75 44 75 76 45 44 76 45 76 77 46 45 77 46 77 78 47 46 78 47 78 79 48 47 79 48 79 80 49 48 80 49 80 81 14 49 81 14 81 50 +82 80 1 0.0850572428380306 +190 -20 354.174243050442 210 -8.57224447675664e-15 350 192.808476042752 -19.8018301996066 354.088263569143 195.483114512722 -19.2337057459418 353.847377731445 197.960005297371 -18.3477062907747 353.48804794237 200.776836372029 -16.8481398619274 352.924101795035 203.402920949326 -14.8445852749198 352.254442217558 205.448505433598 -12.7021126053398 351.640343989945 207.182662399942 -10.2350434472155 351.058771099956 208.570797574629 -7.42465408034023 350.554327671456 209.536443767991 -4.28104718451168 350.183610770056 209.881735017624 -2.17177625553873 350.047188395291 210 -4.89842541528951e-15 220 210 -4.89842541528951e-15 220 209.696155060244 3.47296355333861 220 208.793852415718 6.84040286651337 220 207.320508075689 10 220 205.32088886238 12.8557521937308 220 202.855752193731 15.3208888623796 220 200 17.3205080756888 220 196.840402866513 18.7938524157182 220 193.472963553339 19.6961550602442 220 190 20 220 186.527036446661 19.6961550602442 220 183.159597133487 18.7938524157182 220 180 17.3205080756888 220 177.144247806269 15.3208888623796 220 174.67911113762 12.8557521937308 220 172.679491924311 10 220 171.206147584282 6.84040286651339 220 170.303844939756 3.47296355333863 220 170 2.90945652986485e-14 220 170.303844939756 -3.47296355333857 220 171.206147584282 -6.84040286651334 220 172.679491924311 -9.99999999999996 220 174.67911113762 -12.8557521937308 220 177.144247806269 -15.3208888623795 220 180 -17.3205080756887 220 183.159597133487 -18.7938524157181 220 186.527036446661 -19.6961550602442 220 190 -20 220 193.472963553339 -19.6961550602442 220 196.840402866513 -18.7938524157182 220 200 -17.3205080756888 220 202.855752193731 -15.3208888623796 220 205.32088886238 -12.8557521937308 220 207.320508075689 -10.0000000000001 220 208.793852415718 -6.84040286651346 220 209.696155060244 -3.4729635533387 220 210 -8.57224447675664e-15 350 190 20 354.174243050442 209.797535684556 2.83858895721841 350.080640928023 209.215068935606 5.54807361321558 350.308764554953 208.305594113848 8.05637773956749 350.653320488076 206.785659117562 10.8738982275306 351.196738404482 204.751836168062 13.5049376384928 351.858368701347 202.598636037752 15.5330087758858 352.473947824842 200.142151074243 17.2376548931651 353.065330153674 197.362347455423 18.5955871959507 353.586595046112 194.262798195698 19.5404341226978 353.976403384948 192.165536607703 19.8824152857648 354.123104386169 170 -1.22460635382238e-14 350 170.202464309206 2.83858896354278 350.080640925493 170.784931061703 5.54807359953334 350.308764553975 171.694405902748 8.05637777047583 350.653320494305 173.214340920064 10.8738982856126 351.196738417424 175.24816387627 13.5049376869178 351.858368714932 177.401364011892 15.5330088161513 352.473947838002 179.857848980619 17.237654925444 353.065330165529 182.637652604668 18.5955872197421 353.586595055644 185.737201868648 19.5404341367349 353.976403390908 187.834463425865 19.8824152894209 354.123104387754 187.19152395552 -19.8018301993616 354.088263569037 184.516885484041 -19.2337057450191 353.84737773106 182.039994698179 -18.347706288844 353.488047941608 179.223163623154 -16.8481398588458 352.924101793932 176.597079044967 -14.8445852697679 352.254442215956 174.551494560294 -12.7021125979118 351.640343987994 172.81733759401 -10.2350434370622 351.058771097833 171.42920242427 -7.42465406707688 350.554327671198 170.463556231093 -4.28104719934824 350.183610769691 170.118264986057 -2.17177622757773 350.047188396748 4.71238898038469 134.174243050442 6.28318530717959 130 4.85327844788595 134.088263569143 4.99010063715277 133.847377731445 5.12172498674817 133.48804794237 5.28145061948999 132.924101795035 5.44679451827606 132.254442217558 5.59504002539476 131.640343989945 5.74596228873161 131.058771099956 5.90284904650619 130.554327671456 6.0674637066173 130.183610770056 6.1743819504377 130.047188395291 6.28318530717959 0 0 0 0.174532925199433 0 0.349065850398866 0 0.523598775598299 0 0.698131700797732 0 0.872664625997165 0 1.0471975511966 0 1.22173047639603 0 1.39626340159546 0 1.5707963267949 0 1.74532925199433 0 1.91986217719376 0 2.0943951023932 0 2.26892802759263 0 2.44346095279206 0 2.61799387799149 0 2.79252680319093 0 2.96705972839036 0 3.14159265358979 0 3.31612557878922 0 3.49065850398866 0 3.66519142918809 0 3.83972435438752 0 4.01425727958696 0 4.18879020478639 0 4.36332312998582 0 4.53785605518525 0 4.71238898038469 0 4.88692190558412 0 5.06145483078355 0 5.23598775598299 0 5.41052068118242 0 5.58505360638185 0 5.75958653158128 0 5.93411945678072 0 6.10865238198015 0 0 130 1.5707963267949 134.174243050442 0.142410335941526 130.080640928023 0.281090663049982 130.308764554953 0.414594571639405 130.653320488076 0.574833310501752 131.196738404482 0.741299351798358 131.858368701347 0.889330920856856 132.473947824842 1.03897085878836 133.065330153674 1.19381290142985 133.586595046112 1.35600871415747 133.976403384948 1.46230681760685 134.123104386169 3.14159265358979 130 2.99918231731974 130.080640925493 2.86050199126434 130.308764553975 2.72699808025909 130.653320494305 2.56675933962782 131.196738417424 2.4002932985088 131.858368714932 2.25226172953692 132.473947838002 2.10262179161877 133.065330165529 1.94777974892844 133.586595055644 1.78558393613939 133.976403390908 1.67928583429461 134.123104387754 4.57149951279621 134.088263569037 4.43467732344834 133.847377731061 4.30305297377866 133.488047941608 4.14332734099344 132.924101793932 3.97798344210894 132.254442215957 3.8297379348938 131.640343987994 3.67881567144687 131.058771097833 3.52192891353577 130.554327671198 3.35731425490409 130.183610769691 3.25039600893176 130.047188396748 52 14 15 52 50 14 53 15 16 53 52 15 54 53 16 54 16 17 55 17 18 55 54 17 56 55 18 56 18 19 57 56 19 57 19 20 58 20 21 58 57 20 59 58 21 60 21 22 60 59 21 61 22 23 61 60 22 51 61 23 72 23 24 72 51 23 71 24 25 71 72 24 70 71 25 69 25 26 69 70 25 68 26 27 68 69 26 67 27 28 67 68 27 66 28 29 66 67 28 65 29 30 65 66 29 64 30 31 64 65 30 63 31 32 63 64 31 62 63 32 82 32 33 82 62 32 81 33 34 81 82 33 80 34 35 80 81 34 79 35 36 79 80 35 78 36 37 78 79 36 77 78 37 76 37 38 76 77 37 75 76 38 75 38 39 74 75 39 74 39 40 73 74 40 73 40 41 1 73 41 3 1 41 3 41 42 4 3 42 4 42 43 5 4 43 5 43 44 6 5 44 6 44 45 7 6 45 8 7 45 8 45 46 9 8 46 9 46 47 10 9 47 10 47 48 11 10 48 11 48 49 12 11 49 12 49 13 2 12 13 +37 36 1 0 +50 -1.22460635382238e-14 300 49.2403876506104 8.68240888334652 300 46.9846310392954 17.1010071662834 300 43.3012701892219 25 300 38.3022221559489 32.139380484327 300 32.139380484327 38.3022221559489 300 25 43.3012701892219 300 17.1010071662834 46.9846310392954 300 8.68240888334654 49.2403876506104 300 -2.35367281220533e-14 50 300 -8.68240888334653 49.2403876506104 300 -17.1010071662834 46.9846310392954 300 -25 43.3012701892219 300 -32.1393804843269 38.3022221559489 300 -38.3022221559489 32.139380484327 300 -43.3012701892219 25 300 -46.9846310392954 17.1010071662835 300 -49.2403876506104 8.68240888334658 300 -50 7.27364132466213e-14 300 -49.2403876506104 -8.68240888334644 300 -46.9846310392955 -17.1010071662833 300 -43.301270189222 -24.9999999999999 300 -38.3022221559489 -32.1393804843269 300 -32.1393804843271 -38.3022221559488 300 -25.0000000000001 -43.3012701892219 300 -17.1010071662835 -46.9846310392954 300 -8.68240888334665 -49.2403876506104 300 -1.37223565843669e-13 -50 300 8.68240888334637 -49.2403876506104 300 17.1010071662833 -46.9846310392955 300 24.9999999999999 -43.301270189222 300 32.1393804843268 -38.302222155949 300 38.3022221559488 -32.1393804843271 300 43.3012701892218 -25.0000000000002 300 46.9846310392954 -17.1010071662836 300 49.2403876506104 -8.68240888334674 300 -2.35367281220533e-14 0 300 50 0 49.2403876506104 8.68240888334652 46.9846310392954 17.1010071662834 43.3012701892219 25 38.3022221559489 32.139380484327 32.139380484327 38.3022221559489 25 43.3012701892219 17.1010071662834 46.9846310392954 8.68240888334652 49.2403876506104 0 50 -8.68240888334651 49.2403876506104 -17.1010071662834 46.9846310392954 -25 43.3012701892219 -32.1393804843269 38.3022221559489 -38.3022221559489 32.139380484327 -43.3012701892219 25 -46.9846310392954 17.1010071662835 -49.2403876506104 8.68240888334658 -50 7.105427357601e-14 -49.2403876506104 -8.68240888334644 -46.9846310392955 -17.1010071662834 -43.301270189222 -24.9999999999999 -38.302222155949 -32.1393804843269 -32.139380484327 -38.3022221559488 -25.0000000000001 -43.3012701892219 -17.1010071662836 -46.9846310392954 -8.68240888334665 -49.2403876506104 -1.4210854715202e-13 -50 8.68240888334637 -49.2403876506104 17.1010071662833 -46.9846310392955 24.9999999999999 -43.301270189222 32.1393804843268 -38.302222155949 38.3022221559488 -32.1393804843271 43.3012701892218 -25.0000000000002 46.9846310392954 -17.1010071662836 49.2403876506104 -8.68240888334674 0 0 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 37 11 12 +37 36 1 0 +20 -4.89842541528951e-15 200 19.6961550602442 3.47296355333861 200 18.7938524157182 6.84040286651337 200 17.3205080756888 10 200 15.3208888623795 12.8557521937308 200 12.8557521937308 15.3208888623796 200 10 17.3205080756888 200 6.84040286651339 18.7938524157182 200 3.47296355333862 19.6961550602442 200 0 20 200 -3.47296355333862 19.6961550602442 200 -6.84040286651339 18.7938524157182 200 -10 17.3205080756888 200 -12.8557521937308 15.3208888623796 200 -15.3208888623795 12.8557521937308 200 -17.3205080756888 10 200 -18.7938524157182 6.84040286651339 200 -19.6961550602442 3.47296355333863 200 -20 2.90945652986485e-14 200 -19.6961550602442 -3.47296355333857 200 -18.7938524157182 -6.84040286651334 200 -17.3205080756888 -9.99999999999996 200 -15.3208888623796 -12.8557521937308 200 -12.8557521937308 -15.3208888623795 200 -10 -17.3205080756887 200 -6.84040286651341 -18.7938524157181 200 -3.47296355333867 -19.6961550602442 200 -5.6843418860808e-14 -20 200 3.47296355333856 -19.6961550602442 200 6.8404028665133 -18.7938524157182 200 9.99999999999994 -17.3205080756888 200 12.8557521937307 -15.3208888623796 200 15.3208888623795 -12.8557521937308 200 17.3205080756887 -10.0000000000001 200 18.7938524157181 -6.84040286651346 200 19.6961550602441 -3.4729635533387 200 0 0 200 20 0 19.6961550602442 3.47296355333861 18.7938524157182 6.84040286651337 17.3205080756888 10 15.3208888623796 12.8557521937308 12.8557521937308 15.3208888623796 10 17.3205080756888 6.84040286651338 18.7938524157182 3.47296355333861 19.6961550602442 0 20 -3.47296355333861 19.6961550602442 -6.84040286651337 18.7938524157182 -10 17.3205080756888 -12.8557521937308 15.3208888623796 -15.3208888623796 12.8557521937308 -17.3205080756888 10 -18.7938524157182 6.84040286651339 -19.6961550602442 3.47296355333863 -20 2.8421709430404e-14 -19.6961550602442 -3.47296355333857 -18.7938524157182 -6.84040286651334 -17.3205080756888 -9.99999999999996 -15.3208888623796 -12.8557521937308 -12.8557521937308 -15.3208888623795 -10 -17.3205080756887 -6.84040286651342 -18.7938524157181 -3.47296355333866 -19.6961550602442 -5.6843418860808e-14 -20 3.47296355333854 -19.6961550602442 6.84040286651332 -18.7938524157182 9.99999999999994 -17.3205080756888 12.8557521937307 -15.3208888623796 15.3208888623795 -12.8557521937308 17.3205080756887 -10.0000000000001 18.7938524157181 -6.84040286651346 19.6961550602441 -3.47296355333869 0 0 37 15 16 37 16 17 37 17 18 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 37 11 12 37 12 13 37 13 14 37 14 15 +37 36 1 0 +20 -4.89842541528951e-15 0 19.6961550602442 3.47296355333861 0 18.7938524157182 6.84040286651337 0 17.3205080756888 10 0 15.3208888623795 12.8557521937308 0 12.8557521937308 15.3208888623796 0 10 17.3205080756888 0 6.84040286651339 18.7938524157182 0 3.47296355333862 19.6961550602442 0 0 20 0 -3.47296355333862 19.6961550602442 0 -6.84040286651339 18.7938524157182 0 -10 17.3205080756888 0 -12.8557521937308 15.3208888623796 0 -15.3208888623795 12.8557521937308 0 -17.3205080756888 10 0 -18.7938524157182 6.84040286651339 0 -19.6961550602442 3.47296355333863 0 -20 2.90945652986485e-14 0 -19.6961550602442 -3.47296355333857 0 -18.7938524157182 -6.84040286651334 0 -17.3205080756888 -9.99999999999996 0 -15.3208888623796 -12.8557521937308 0 -12.8557521937308 -15.3208888623795 0 -10 -17.3205080756887 0 -6.84040286651341 -18.7938524157181 0 -3.47296355333867 -19.6961550602442 0 -5.6843418860808e-14 -20 0 3.47296355333856 -19.6961550602442 0 6.8404028665133 -18.7938524157182 0 9.99999999999994 -17.3205080756888 0 12.8557521937307 -15.3208888623796 0 15.3208888623795 -12.8557521937308 0 17.3205080756887 -10.0000000000001 0 18.7938524157181 -6.84040286651346 0 19.6961550602441 -3.4729635533387 0 0 0 0 20 -3.5527136788005e-15 19.6961550602442 3.47296355333861 18.7938524157182 6.84040286651337 17.3205080756888 10 15.3208888623796 12.8557521937308 12.8557521937308 15.3208888623796 10 17.3205080756888 6.84040286651338 18.7938524157182 3.47296355333861 19.6961550602442 0 20 -3.47296355333861 19.6961550602442 -6.84040286651337 18.7938524157182 -10 17.3205080756888 -12.8557521937308 15.3208888623796 -15.3208888623796 12.8557521937308 -17.3205080756888 10 -18.7938524157182 6.84040286651339 -19.6961550602442 3.47296355333863 -20 2.8421709430404e-14 -19.6961550602442 -3.47296355333857 -18.7938524157182 -6.84040286651334 -17.3205080756888 -9.99999999999996 -15.3208888623796 -12.8557521937308 -12.8557521937308 -15.3208888623795 -10 -17.3205080756887 -6.84040286651342 -18.7938524157181 -3.47296355333866 -19.6961550602442 -5.6843418860808e-14 -20 3.47296355333854 -19.6961550602442 6.84040286651332 -18.7938524157182 9.99999999999994 -17.3205080756888 12.8557521937307 -15.3208888623796 15.3208888623795 -12.8557521937308 17.3205080756887 -10.0000000000001 18.7938524157181 -6.84040286651346 19.6961550602441 -3.47296355333869 0 0 37 18 19 37 19 20 37 20 21 37 21 22 37 22 23 37 23 24 37 24 25 37 25 26 37 26 27 37 27 28 37 28 29 37 29 30 37 30 31 37 31 32 37 32 33 37 33 34 37 34 35 37 35 36 37 36 1 37 1 2 37 2 3 37 3 4 37 4 5 37 5 6 37 6 7 37 7 8 37 8 9 37 9 10 37 10 11 37 11 12 37 12 13 37 13 14 37 14 15 37 15 16 37 16 17 37 17 18 + +TShapes 57 +Ve +1e-07 +100 -2.44921270764475e-14 800 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 1 0 0 6.28318530717959 +2 1 2 0 0 6.28318530717959 +2 2 1 0 0 6.28318530717959 +6 1 2 0 +6 2 1 0 +0 + +0101100 ++57 0 -57 0 * +Wi + +0101000 ++56 0 * +Fa +0 1e-07 1 0 +2 1 +0101000 ++55 0 * +Ve +3.77011308578173e-06 +86.6025403784438 -50 400 +0 0 + +0101101 +* +Ve +3.77011308578173e-06 +100 -1.83690953073357e-14 350 +0 0 + +0101101 +* +Ed + 3.77011308578173e-06 1 1 0 +1 2 0 0 1 +2 3 2 0 0 1 +2 4 3 1 0 1 +6 3 2 0 +6 4 3 0 +0 + +0101000 ++53 0 -52 0 * +Ve +1e-07 +100 -2.44921270764475e-14 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 3 0 0 350 +3 5 6CN 2 0 0 350 +7 5 6 2 0 +0 + +0101000 ++50 0 -52 0 * +Ed + 1e-07 1 1 0 +1 4 0 0 6.28318530717959 +2 7 2 0 0 6.28318530717959 +2 8 4 0 0 6.28318530717959 +6 7 2 0 +6 8 4 0 +0 + +0101100 ++50 0 -50 0 * +Ve +3.77011308578173e-06 +86.6025403784439 50 400 +0 0 + +0101101 +* +Ed + 3.77011308578173e-06 1 1 0 +1 5 0 0 1 +2 9 2 0 0 1 +2 10 3 1 0 1 +6 9 2 0 +6 10 3 0 +0 + +0101000 ++52 0 -47 0 * +Ve +3.77011308578173e-06 +100 -2.44921270764475e-14 450 +0 0 + +0101101 +* +Ed + 3.77011308578173e-06 1 1 0 +1 6 0 0 1 +2 11 2 0 0 1 +2 12 3 1 0 1 +6 11 2 0 +6 12 3 0 +0 + +0101000 ++45 0 -47 0 * +Ed + 1e-07 1 1 0 +1 3 0 450 800 +3 5 6CN 2 0 450 800 +7 13 14 2 0 +0 + +0101000 ++45 0 -57 0 * +Ed + 3.77011308578173e-06 1 1 0 +1 7 0 0 1 +2 13 2 0 0 1 +2 14 3 1 0 1 +6 15 2 0 +6 16 3 0 +0 + +0101000 ++53 0 -45 0 * +Wi + +0101000 +-51 0 +49 0 +48 0 -49 0 -46 0 +44 0 -43 0 -56 0 +43 0 +42 0 +* +Fa +0 1e-07 2 0 +2 2 +0101000 ++41 0 * +Ve +7.99539616382488e-05 +190 20 445.825756949558 +0 0 + +0101101 +* +Ve +7.99539616382488e-05 +210 -4.89842541528951e-15 450 +0 0 + +0101101 +* +Ed + 7.99539616382488e-05 1 1 0 +1 8 0 0 1 +2 15 3 1 0 1 +2 16 5 2 0 1 +6 17 3 0 +6 18 5 0 +0 + +0101000 ++39 0 -38 0 * +Ed + 7.99539616382488e-05 1 1 0 +1 9 0 0 1 +2 17 3 1 0 1 +2 18 5 2 0 1 +6 19 3 0 +6 20 5 0 +0 + +0101000 ++38 0 -39 0 * +Wi + +0101000 +-37 0 -36 0 * +Ve +1.92831599071361e-06 +190 -20 354.174243050442 +0 0 + +0101101 +* +Ve +1.92831599071361e-06 +170 -1.22460635382238e-14 350 +0 0 + +0101101 +* +Ed + 1.92831599071361e-06 1 1 0 +1 10 0 0 1 +2 19 3 1 0 1 +2 20 5 3 0 1 +6 21 3 0 +6 22 6 0 +0 + +0101000 ++34 0 -33 0 * +Ed + 1e-07 1 1 0 +1 11 0 100 170 +3 21 22CN 3 0 100 170 +7 23 24 3 4 +0 + +0101000 ++52 4 -33 4 * +Ve +1.92831599071361e-06 +190 20 354.174243050442 +0 0 + +0101101 +* +Ed + 1.92831599071361e-06 1 1 0 +1 12 0 0 1 +2 23 3 1 0 1 +2 24 5 3 0 1 +6 25 3 0 +6 26 6 0 +0 + +0101000 ++33 0 -30 0 * +Ve +1.92831599071361e-06 +210 -8.57224447675664e-15 350 +0 0 + +0101101 +* +Ed + 1.92831599071361e-06 1 1 0 +1 13 0 0 1 +2 25 3 1 0 1 +2 26 5 3 0 1 +6 27 3 0 +6 28 6 0 +0 + +0101000 ++28 0 -30 0 * +Ve +1e-07 +50 -1.22460635382238e-14 300 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 11 0 210 300 +3 21 22CN 3 0 210 300 +7 29 30 3 4 +0 + +0101000 ++28 4 -26 0 * +Ed + 1e-07 1 1 0 +1 14 0 0 6.28318530717959 +2 27 3 0 0 6.28318530717959 +2 28 6 0 0 6.28318530717959 +6 31 3 4 +6 32 7 0 +0 + +0101100 ++26 0 -26 0 * +Ed + 1.92831599071361e-06 1 1 0 +1 15 0 0 1 +2 29 3 1 0 1 +2 30 5 3 0 1 +6 33 3 0 +6 34 6 0 +0 + +0101000 ++34 0 -28 0 * +Wi + +0101000 +-32 0 +31 1 +51 0 -42 0 -44 0 +46 0 -31 1 -29 0 +27 0 -25 1 +-24 1 +25 1 +23 0 * +Fa +0 1e-07 3 1 +2 3 +0101000 ++35 0 +22 0 * +Wi + +0101000 +-48 0 * +Fa +0 1e-07 4 0 +2 4 +0101000 +-20 0 * +Ve +1e-07 +20 -4.89842541528951e-15 200 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 16 0 70 200 +3 31 32CN 5 0 70 200 +7 35 36 5 5 +0 + +0101000 ++38 5 -18 0 * +Ed + 1e-07 1 1 0 +1 17 0 0 6.28318530717959 +2 33 5 0 0 6.28318530717959 +2 34 7 0 0 6.28318530717959 +2 35 5 6 0 6.28318530717959 +6 37 5 5 +6 38 8 0 +0 + +0101100 ++18 0 -18 0 * +Wi + +0101000 ++36 0 -17 2 -16 2 +17 2 +37 0 * +Fa +0 1e-07 5 2 +2 5 +0101000 ++15 0 * +Ve +1e-07 +20 -4.89842541528951e-15 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 16 0 0 130 +3 31 32CN 5 0 0 130 +7 39 40 6 7 +0 + +0101000 ++13 0 -28 7 * +Ed + 1e-07 1 1 0 +1 18 0 0 6.28318530717959 +2 36 5 0 0 6.28318530717959 +2 37 8 0 0 6.28318530717959 +2 38 5 8 0 6.28318530717959 +6 41 6 7 +6 42 9 0 +0 + +0101100 ++13 0 -13 0 * +Wi + +0101000 +-23 0 +12 3 +11 3 -12 3 -27 0 +29 0 +32 0 * +Fa +0 1e-07 5 3 +2 6 +0101000 ++10 0 * +Wi + +0101000 ++24 0 * +Fa +0 1e-07 6 0 +2 7 +0101000 ++8 0 * +Wi + +0101000 ++16 0 * +Fa +0 1e-07 7 0 +2 8 +0101000 ++6 0 * +Wi + +0101000 +-11 0 * +Fa +0 1e-07 8 0 +2 9 +0101000 +-4 0 * +Sh + +0101000 ++54 0 +40 0 +21 0 -19 0 +14 0 +9 0 +7 1 +5 2 -3 3 * +So + +0100000 ++2 0 * + ++1 0 \ No newline at end of file diff --git a/src/TEST_PY/test_BIELLE_bad_assoc.py b/src/TEST_PY/test_BIELLE_bad_assoc.py new file mode 100755 index 0000000..507389a --- /dev/null +++ b/src/TEST_PY/test_BIELLE_bad_assoc.py @@ -0,0 +1,1081 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#=============================================== +# By Karima DEBCHI YATAGHENE Nov 2009 at CS +#=============================================== + + +import os +import GEOM +import geompy +import smesh +import hexablock +import math +import SALOMEDS + + +STEP_PATH = os.path.expandvars("$HEXA_ROOT_DIR/bin/salome/crank.stp") + + +#============================= +# CREATION DOCUMENT +#============================= + +doc = hexablock.addDocument("default") + +#============================= +# CREATION DU MODELE +#============================= + +# Pour la bielle on doit creer deux grilles cylindriques et prismer les quadrangles entre ces deux dernieres + +#============================= +# PARAMETRES +#============================= + +R = 40.0 + +r_grd = R +r_grd_t = R/2 + +r_pte = R +r_pte_t = R/2 + +l = 200.0 +h = 0.019999999553*2 +#h = 40. + +# Taille du grand cylindre +dr_grd = R +da_grd = 360 +dl_grd = h + +nr_grd = 1 +na_grd = 6 +nl_grd = 1 + +# Taille du petit cylindre +dr_pte = R +da_pte = 360 +dl_pte = h + +nr_pte = 1 +na_pte = 6 +nl_pte = 1 + + +#============================= +# Creation des vecteurs +#============================= + +dx = doc.addVector(l, 0, 0) +dy = doc.addVector(0, l, 0) +dz = doc.addVector(0, 0, l) + +#================================================= +# Creation des centres des grilles cylindriques +#================================================= + +c_grd = doc.addVertex(0, 0, 0) +c_pte = doc.addVertex(2*l, 0, 0) +dx_prime = doc.addVectorVertices( c_grd, c_pte ) + +#================================================= +# Creation de la grande grille cylindrique +#================================================= + +grille_cyl_grd = doc.makeCylindrical(c_grd, dx, dz, dr_grd, da_grd, dl_grd, nr_grd, na_grd, nl_grd, False) + +# on obtient une liste qui contient 6 hexaedres eguaux + +# 30 = pi/6 +# 60 = pi/3 +# 45 = pi/4 +# 90 = pi/2 +# 180 = pi + +alpha_x = 2*R*math.cos(math.pi/3) +alpha_y = 2*R*math.sin(math.pi/3) + +x1 = doc.findVertex( 2*R, 0, h ) +x2 = doc.findVertex( alpha_x, alpha_y, 0 ) +x3 = doc.findVertex( alpha_x, -alpha_y, 0 ) +x4 = doc.findVertex( 2*R, 0, 0 ) + +quad_11 = doc.findQuad(x1, x2) +quad_12 = doc.findQuad(x1, x3) + +quad_list = [ quad_11 , quad_12 ] + +#================================================= +# Creation de la petite grille cylindrique +#================================================= + +grille_cyl_pte = doc.makeTranslation( grille_cyl_grd , dx_prime ) + +# on obtient une liste qui contient 6 hexaedres eguaux + +y1 = doc.findVertex( 2*l - 2*R , 0 , h ) +y2 = doc.findVertex( 2*l - alpha_x , alpha_y , 0 ) +y3 = doc.findVertex( 2*l - alpha_x , -alpha_y , 0 ) +y4 = doc.findVertex( 2*l - 2*R , 0 , 0 ) + +quad_21 = doc.findQuad(y1, y2) +quad_22 = doc.findQuad(y1, y3) + +#================================================= +# Assemblage des deux grilles cylindriques +#================================================= +model_biell_fin = doc.joinQuads( quad_list , quad_21 , x1 , y1 , x4 , y4 , 1 ) + + +#=================================================================== +# Recuperation des vertex du model hexa bielle pour l association +#=================================================================== + +# NB: +# h = haut +# b = bas +# g = grand +# p = petit +# t = trou + +alpha_x = 2*R*math.cos(math.pi/3) +alpha_y = 2*R*math.sin(math.pi/3) + +# Face du haut grand trou + +## RQ:On remplace la fonction findVertex par getVertexIJK + +v_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 0 , 1 ) +w_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 1 , 1 ) +z_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 2 , 1 ) + +y_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 3 , 1 ) +x_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 4 , 1 ) +u_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 5 , 1 ) + +v_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 0 , 1 ) +w_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 1 , 1 ) +z_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 2 , 1 ) + +y_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 3 , 1 ) +x_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 4 , 1 ) +u_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 5 , 1 ) + +#----------- +#x_mod_h_g = doc.findVertex( -alpha_x , -alpha_y , h ) +#y_mod_h_g = doc.findVertex( -alpha_x , 0 , h ) +#z_mod_h_g = doc.findVertex( -alpha_x , alpha_y , h ) + +#u_mod_h_g = doc.findVertex( alpha_x , -alpha_y , h ) +#v_mod_h_g = doc.findVertex( alpha_x , 0 , h ) +#w_mod_h_g = doc.findVertex( alpha_x , alpha_y , h ) + +#x_mod_h_g_t = doc.findVertex( -alpha_x/2 , -alpha_y/2 , h ) +#y_mod_h_g_t = doc.findVertex( -alpha_x/2 , 0 , h ) +#z_mod_h_g_t = doc.findVertex( -alpha_x/2 , alpha_y/2 , h ) + +#u_mod_h_g_t = doc.findVertex( alpha_x/2 , -alpha_y/2 , h ) +#v_mod_h_g_t = doc.findVertex( alpha_x/2 , 0 , h ) +#w_mod_h_g_t = doc.findVertex( alpha_x/2 , alpha_y/2 , h ) +#----------- + +assert x_mod_h_g +assert y_mod_h_g +assert z_mod_h_g + +assert u_mod_h_g +assert v_mod_h_g +assert w_mod_h_g + +assert x_mod_h_g_t +assert y_mod_h_g_t # +assert z_mod_h_g_t + +assert u_mod_h_g_t # +assert v_mod_h_g_t +assert w_mod_h_g_t # + + +# Face du haut petit trou + +## RQ:On remplace la fonction findVertex par getVertexIJK +v_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 0 , 1 ) +w_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 1 , 1 ) +z_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 2 , 1 ) + +y_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 3 , 1 ) +x_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 4 , 1 ) +u_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 5 , 1 ) + +v_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 0 , 1 ) +w_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 1 , 1 ) +z_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 2 , 1 ) + +y_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 3 , 1 ) +x_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 4 , 1 ) +u_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 5 , 1 ) + + +#----------- +#x_mod_h_p = doc.findVertex( l + alpha_x , -alpha_y , h ) +#y_mod_h_p = doc.findVertex( l + alpha_x , 0 , h ) +#z_mod_h_p = doc.findVertex( l + alpha_x , alpha_y , h ) + +#u_mod_h_p = doc.findVertex( l - alpha_x , -alpha_y , h ) +#v_mod_h_p = doc.findVertex( l - alpha_x , 0 , h ) +#w_mod_h_p = doc.findVertex( l - alpha_x , alpha_y , h ) + +#x_mod_h_p_t = doc.findVertex( l + (alpha_x/2) , -alpha_y/2 , h ) +#y_mod_h_p_t = doc.findVertex( l + (alpha_x/2) , 0 , h ) +#z_mod_h_p_t = doc.findVertex( l + (alpha_x/2) , alpha_y/2 , h ) + +#u_mod_h_p_t = doc.findVertex( l - (alpha_x/2) , -alpha_y/2 , h ) +#v_mod_h_p_t = doc.findVertex( l - (alpha_x/2) , 0 , h ) +#w_mod_h_p_t = doc.findVertex( l - (alpha_x/2) , alpha_y/2 , h ) +#----------- + +#----------- +assert x_mod_h_p +assert y_mod_h_p +assert z_mod_h_p + +assert u_mod_h_p +assert v_mod_h_p +assert w_mod_h_p + +assert x_mod_h_p_t +assert y_mod_h_p_t +assert z_mod_h_p_t + +assert u_mod_h_p_t +assert v_mod_h_p_t +assert w_mod_h_p_t +#----------- + +# Face du bas grand trou + +## RQ:On remplace la fonction findVertex par getVertexIJK + +v_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 0 , 0 ) +w_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 1 , 0 ) +z_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 2 , 0 ) + +y_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 3 , 0 ) +x_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 4 , 0 ) +u_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 5 , 0 ) + +v_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 0 , 0 ) +w_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 1 , 0 ) +z_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 2 , 0 ) + +y_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 3 , 0 ) +x_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 4 , 0 ) +u_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 5 , 0 ) + +#----------- +#x_mod_b_g = doc.findVertex( -alpha_x , -alpha_y , 0 ) +#y_mod_b_g = doc.findVertex( -alpha_x , 0 , 0 ) +#z_mod_b_g = doc.findVertex( -alpha_x , alpha_y , 0 ) + +#u_mod_b_g = doc.findVertex( alpha_x , -alpha_y , 0 ) +#v_mod_b_g = doc.findVertex( alpha_x , 0 , 0 ) +#w_mod_b_g = doc.findVertex( alpha_x , alpha_y , 0 ) + +#x_mod_b_g_t = doc.findVertex( -alpha_x/2 , -alpha_y/2 , 0 ) +#y_mod_b_g_t = doc.findVertex( -alpha_x/2 , 0 , 0 ) +#z_mod_b_g_t = doc.findVertex( -alpha_x/2 , alpha_y/2 , 0 ) + +#u_mod_b_g_t = doc.findVertex( alpha_x/2 , -alpha_y/2 , 0 ) +#v_mod_b_g_t = doc.findVertex( alpha_x/2 , 0 , 0 ) +#w_mod_b_g_t = doc.findVertex( alpha_x/2 , alpha_y/2 , 0 ) +#----------- + +assert x_mod_b_g +assert y_mod_b_g +assert z_mod_b_g + +assert u_mod_b_g +assert v_mod_b_g +assert w_mod_b_g + +assert x_mod_b_g_t +assert y_mod_b_g_t +assert z_mod_b_g_t + +assert u_mod_b_g_t +assert v_mod_b_g_t +assert w_mod_b_g_t + + +# Face du bas petit trou + + +## RQ:On remplace la fonction findVertex par getVertexIJK + +v_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 0 , 0 ) +w_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 1 , 0 ) +z_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 2 , 0 ) + +y_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 3 , 0 ) +x_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 4 , 0 ) +u_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 5 , 0 ) + +v_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 0 , 0 ) +w_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 1 , 0 ) +z_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 2 , 0 ) + +y_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 3 , 0 ) +x_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 4 , 0 ) +u_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 5 , 0 ) + + +#----------- +#x_mod_b_p = doc.findVertex( l + alpha_x , -alpha_y , 0 ) +#y_mod_b_p = doc.findVertex( l + alpha_x , 0 , 0 ) +#z_mod_b_p = doc.findVertex( l + alpha_x , alpha_y , 0 ) + +#u_mod_b_p = doc.findVertex( l - alpha_x , -alpha_y , 0 ) +#v_mod_b_p = doc.findVertex( l - alpha_x , 0 , 0 ) +#w_mod_b_p = doc.findVertex( l - alpha_x , alpha_y , 0 ) + +#x_mod_b_p_t = doc.findVertex( l + (alpha_x/2) , -alpha_y/2 , 0 ) +#y_mod_b_p_t = doc.findVertex( l + (alpha_x/2) , 0 , 0 ) +#z_mod_b_p_t = doc.findVertex( l + (alpha_x/2) , alpha_y/2 , 0 ) + +#u_mod_b_p_t = doc.findVertex( l - (alpha_x/2) , -alpha_y/2 , 0 ) +#v_mod_b_p_t = doc.findVertex( l - (alpha_x/2) , 0 , 0 ) +#w_mod_b_p_t = doc.findVertex( l - (alpha_x/2) , alpha_y/2 , 0 ) +#----------- + +#----------- +assert x_mod_b_p +assert y_mod_b_p +assert z_mod_b_p + +assert u_mod_b_p +assert v_mod_b_p +assert w_mod_b_p + +assert x_mod_b_p_t +assert y_mod_b_p_t +assert z_mod_b_p_t + +assert u_mod_b_p_t +assert v_mod_b_p_t +assert w_mod_b_p_t +#----------- + + + +#=================================================================== +# Recuperation des points de la geometrie bielle pour l association +#=================================================================== +Bielle_geom = geompy.Import(STEP_PATH, "STEP") + +geompy.addToStudy(Bielle_geom, "Bielle_geom") + +Pt_A = geompy.MakeVertex(0, 0, h/2.) +Face_haut = geompy.GetFaceNearPoint(Bielle_geom, Pt_A) + + +Pt_B = geompy.MakeVertex(0, 0, -h/2.) +Face_bas = geompy.GetFaceNearPoint(Bielle_geom, Pt_B) + + +# NB: +# h = haut +# b = bas +# g = grand +# p = petit +# t = trou + + +y_h_g = geompy.MakeVertexOnSurface(Face_haut, 1, 0.5) +geompy.addToStudy( y_h_g , "y_h_g" ) +y_b_g = geompy.MakeVertexWithRef(y_h_g, 0, 0, -h) +geompy.addToStudy( y_b_g , "y_b_g" ) + +v_h_p = geompy.MakeVertexOnSurface(Face_haut, 0, 0.5) +geompy.addToStudy( v_h_p , "v_h_p" ) +v_b_p = geompy.MakeVertexWithRef(v_h_p, 0, 0, -h) +geompy.addToStudy( v_b_p , "v_b_p" ) + +Edge_haut_grd = geompy.GetEdgeNearPoint(Bielle_geom, y_h_g) +Edge_haut_pte = geompy.GetEdgeNearPoint(Bielle_geom, v_h_p) + + + +x_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, 0) +geompy.addToStudy( x_h_g , "x_h_g" ) +x_b_g = geompy.MakeVertexWithRef(x_h_g, 0, 0, -h) +geompy.addToStudy( x_b_g , "x_b_g" ) + +z_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, 1) +geompy.addToStudy( z_h_g , "z_h_g" ) +z_b_g = geompy.MakeVertexWithRef(z_h_g, 0, 0, -h) +geompy.addToStudy( z_b_g , "z_b_g" ) + +w_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, 0) +geompy.addToStudy( w_h_p , "w_h_p" ) +w_b_p = geompy.MakeVertexWithRef(w_h_p, 0, 0, -h) +geompy.addToStudy( w_b_p , "w_b_p" ) + +u_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, 1) +geompy.addToStudy( u_h_p , "u_h_p" ) +u_b_p = geompy.MakeVertexWithRef(u_h_p, 0, 0, -h) +geompy.addToStudy( u_b_p , "u_b_p" ) + + + +Edge_haut_grd_trou = geompy.GetEdgesByLength(Face_haut, 0.147, 0.148) + + + +y_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0) +geompy.addToStudy(y_h_g_t, "y_h_g_t") +y_b_g_t = geompy.MakeVertexWithRef(y_h_g_t, 0, 0, -h) +geompy.addToStudy(y_b_g_t, "y_b_g_t") + +z_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.2) +geompy.addToStudy(z_h_g_t, "z_h_g_t") +z_b_g_t = geompy.MakeVertexWithRef(z_h_g_t, 0, 0, -h) +geompy.addToStudy(z_b_g_t, "z_b_g_t") + +w_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.35) +geompy.addToStudy(w_h_g_t, "w_h_g_t") +w_b_g_t = geompy.MakeVertexWithRef(w_h_g_t, 0, 0, -h) +geompy.addToStudy(w_b_g_t, "w_b_g_t") + +v_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.5) +geompy.addToStudy(v_h_g_t, "v_h_g_t") +v_b_g_t = geompy.MakeVertexWithRef(v_h_g_t, 0, 0, -h) +geompy.addToStudy(v_b_g_t, "v_b_g_t") + +u_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.65) +geompy.addToStudy(u_h_g_t, "u_h_g_t") +u_b_g_t = geompy.MakeVertexWithRef(u_h_g_t, 0, 0, -h) +geompy.addToStudy(u_b_g_t, "u_b_g_t") + +x_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.8) +geompy.addToStudy(x_h_g_t, "x_h_g_t") +x_b_g_t = geompy.MakeVertexWithRef(x_h_g_t, 0, 0, -h) +geompy.addToStudy(x_b_g_t, "x_b_g_t") + + + +Edge_haut_pte_trou = geompy.GetEdgesByLength(Face_haut, 0.094, 0.095) + +y_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0) +geompy.addToStudy(y_h_p_t, "y_h_p_t") +y_b_p_t = geompy.MakeVertexWithRef(y_h_p_t, 0, 0, -h) +geompy.addToStudy(y_b_p_t, "y_b_p_t") + +z_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.2) +geompy.addToStudy(z_h_p_t, "z_h_p_t") +z_b_p_t = geompy.MakeVertexWithRef(z_h_p_t, 0, 0, -h) +geompy.addToStudy(z_b_p_t, "z_b_p_t") + +w_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.35) +geompy.addToStudy(w_h_p_t, "w_h_p_t") +w_b_p_t = geompy.MakeVertexWithRef(w_h_p_t, 0, 0, -h) +geompy.addToStudy(w_b_p_t, "w_b_p_t") + +v_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.5) +geompy.addToStudy(v_h_p_t, "v_h_p_t") +v_b_p_t = geompy.MakeVertexWithRef(v_h_p_t, 0, 0, -h) +geompy.addToStudy(v_b_p_t, "v_b_p_t") + +u_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.65) +geompy.addToStudy(u_h_p_t, "u_h_p_t") +u_b_p_t = geompy.MakeVertexWithRef(u_h_p_t, 0, 0, -h) +geompy.addToStudy(u_b_p_t, "u_b_p_t") + +x_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.8) +geompy.addToStudy(x_h_p_t, "x_h_p_t") +x_b_p_t = geompy.MakeVertexWithRef(x_h_p_t, 0, 0, -h) +geompy.addToStudy(x_b_p_t, "x_b_p_t") + + + +Edge_haut_droite = geompy.GetEdgesByLength(Face_haut, 0.136, 0.137) + +u_h_g = geompy.MakeVertexOnCurve(Edge_haut_droite, 1) +geompy.addToStudy(u_h_g, "u_h_g") + +u_b_g = geompy.MakeVertexWithRef(u_h_g, 0, 0, -h) +geompy.addToStudy(u_b_g, "u_b_g") + +x_h_p = geompy.MakeVertexOnCurve(Edge_haut_droite, 0) +geompy.addToStudy(x_h_p, "x_h_p") +x_b_p = geompy.MakeVertexWithRef(x_h_p, 0, 0, -h) +geompy.addToStudy(x_b_p, "x_b_p") + + +Edge_haut_gauche = geompy.GetEdgesByLength(Face_haut, 0.131, 0.132) + +w_h_g = geompy.MakeVertexOnCurve(Edge_haut_gauche, 0) +geompy.addToStudy(w_h_g, "w_h_g") + +w_b_g = geompy.MakeVertexWithRef(w_h_g, 0, 0, -h) +geompy.addToStudy(w_b_g, "w_b_g") + +z_h_p = geompy.MakeVertexOnCurve(Edge_haut_gauche, 1) +geompy.addToStudy(z_h_p, "z_h_p") +z_b_p = geompy.MakeVertexWithRef(z_h_p, 0, 0, -h) +geompy.addToStudy(z_b_p, "z_b_p") + +Edge_v_grd = geompy.MakeLineTwoPnt(u_h_g, w_h_g) + +v_h_g = geompy.MakeVertexOnCurve(Edge_v_grd, 0.5) +geompy.addToStudy(v_h_g, "v_h_g") +v_b_g = geompy.MakeVertexWithRef(v_h_g, 0, 0, -h) +geompy.addToStudy(v_b_g, "v_b_g") + + +Edge_v_pte = geompy.MakeLineTwoPnt(x_h_p, z_h_p) + +y_h_p = geompy.MakeVertexOnCurve(Edge_v_pte, 0.5) +geompy.addToStudy(y_h_p, "y_h_p") +y_b_p = geompy.MakeVertexWithRef(y_h_p, 0, 0, -h) +geompy.addToStudy(y_b_p, "y_b_p") + + +#======================= +# CREATION ASSOCIATION +#======================= + +#=========================================== +# association des sommets de la face du haut +#=========================================== + +# grand trou + +x_mod_h_g.setAssociation( x_h_g ) +y_mod_h_g.setAssociation( y_h_g ) +z_mod_h_g.setAssociation( z_h_g ) +u_mod_h_g.setAssociation( u_h_g ) +v_mod_h_g.setAssociation( v_h_g ) +w_mod_h_g.setAssociation( w_h_g ) + +x_mod_h_g_t.setAssociation( x_h_g_t ) +y_mod_h_g_t.setAssociation( y_h_g_t ) +z_mod_h_g_t.setAssociation( z_h_g_t ) +u_mod_h_g_t.setAssociation( u_h_g_t ) +v_mod_h_g_t.setAssociation( v_h_g_t ) +w_mod_h_g_t.setAssociation( w_h_g_t ) + +# petit trou + +x_mod_h_p.setAssociation( x_h_p ) +y_mod_h_p.setAssociation( y_h_p ) +z_mod_h_p.setAssociation( z_h_p ) +u_mod_h_p.setAssociation( u_h_p ) +v_mod_h_p.setAssociation( v_h_p ) +w_mod_h_p.setAssociation( w_h_p ) + +x_mod_h_p_t.setAssociation( x_h_p_t ) +y_mod_h_p_t.setAssociation( y_h_p_t ) +z_mod_h_p_t.setAssociation( z_h_p_t ) +u_mod_h_p_t.setAssociation( u_h_p_t ) +v_mod_h_p_t.setAssociation( v_h_p_t ) +w_mod_h_p_t.setAssociation( w_h_p_t ) + + +#=========================================== +# association des sommets de la face du bas +#=========================================== + +# grand trou + +x_mod_b_g.setAssociation( x_b_g ) +y_mod_b_g.setAssociation( y_b_g ) +z_mod_b_g.setAssociation( z_b_g ) +u_mod_b_g.setAssociation( u_b_g ) +v_mod_b_g.setAssociation( v_b_g ) +w_mod_b_g.setAssociation( w_b_g ) + +x_mod_b_g_t.setAssociation( x_b_g_t ) +y_mod_b_g_t.setAssociation( y_b_g_t ) +z_mod_b_g_t.setAssociation( z_b_g_t ) +u_mod_b_g_t.setAssociation( u_b_g_t ) +v_mod_b_g_t.setAssociation( v_b_g_t ) +w_mod_b_g_t.setAssociation( w_b_g_t ) + +# petit trou + +x_mod_b_p.setAssociation( x_b_p ) +y_mod_b_p.setAssociation( y_b_p ) +z_mod_b_p.setAssociation( z_b_p ) +u_mod_b_p.setAssociation( u_b_p ) +v_mod_b_p.setAssociation( v_b_p ) +w_mod_b_p.setAssociation( w_b_p ) + +x_mod_b_p_t.setAssociation( x_b_p_t ) +y_mod_b_p_t.setAssociation( y_b_p_t ) +z_mod_b_p_t.setAssociation( z_b_p_t ) +u_mod_b_p_t.setAssociation( u_b_p_t ) +v_mod_b_p_t.setAssociation( v_b_p_t ) +w_mod_b_p_t.setAssociation( w_b_p_t ) + + + + +#================================= +# Creation association des edges +#================================= + + +All_Edges_Bielle = geompy.SubShapeAllSorted(Bielle_geom, geompy.ShapeType["EDGE"]) + +## recuperer les arrondies du haut de la geometrie + +Edge_Arr_grd_g_h = All_Edges_Bielle[20] +geompy.addToStudy( Edge_Arr_grd_g_h , "Edge_Arr_grd_g_h" ) + +Edge_Arr_grd_g_h_mod = grille_cyl_grd.getEdgeJ( 1 , 1 , 1 ) +Edge_Arr_grd_g_h_mod.addAssociation( Edge_Arr_grd_g_h, 0., 1. ) + + +Edge_Arr_grd_d_h = All_Edges_Bielle[22] +geompy.addToStudy( Edge_Arr_grd_d_h , "Edge_Arr_grd_d_h" ) + +Edge_Arr_grd_d_h_mod = grille_cyl_grd.getEdgeJ( 1 , 4 , 1 ) +Edge_Arr_grd_d_h_mod.addAssociation( Edge_Arr_grd_d_h, 0., 1. ) + + +Edge_Arr_pte_g_h = All_Edges_Bielle[8] +geompy.addToStudy( Edge_Arr_pte_g_h , "Edge_Arr_pte_g_h" ) + +Edge_Arr_pte_g_h_mod = grille_cyl_pte.getEdgeJ( 1 , 1 , 1 ) +Edge_Arr_pte_g_h_mod.addAssociation( Edge_Arr_pte_g_h, 0., 1. ) + +Edge_Arr_pte_d_h = All_Edges_Bielle[10] +geompy.addToStudy( Edge_Arr_pte_d_h , "Edge_Arr_pte_d_h" ) + +Edge_Arr_pte_d_h_mod = grille_cyl_pte.getEdgeJ( 1 , 4 , 1 ) +Edge_Arr_pte_d_h_mod.addAssociation( Edge_Arr_pte_d_h, 0., 1. ) + +# recuperer les arrondies du bas de la geometrie + +Edge_Arr_grd_g_b = All_Edges_Bielle[19] +geompy.addToStudy( Edge_Arr_grd_g_b , "Edge_Arr_grd_g_b" ) + +Edge_Arr_grd_g_b_mod = grille_cyl_grd.getEdgeJ( 1 , 1 , 0 ) +Edge_Arr_grd_g_b_mod.addAssociation( Edge_Arr_grd_g_b, 0., 1. ) + +Edge_Arr_grd_d_b = All_Edges_Bielle[21] +geompy.addToStudy( Edge_Arr_grd_d_b , "Edge_Arr_grd_d_b" ) + +Edge_Arr_grd_d_b_mod = grille_cyl_grd.getEdgeJ( 1 , 4 , 0 ) +Edge_Arr_grd_d_b_mod.addAssociation( Edge_Arr_grd_d_b, 0., 1. ) + +Edge_Arr_pte_g_b = All_Edges_Bielle[7] +geompy.addToStudy( Edge_Arr_pte_g_b , "Edge_Arr_pte_g_b" ) + +Edge_Arr_pte_g_b_mod = grille_cyl_pte.getEdgeJ( 1 , 1 , 0 ) +Edge_Arr_pte_g_b_mod.addAssociation( Edge_Arr_pte_g_b, 0., 1. ) + +Edge_Arr_pte_d_b = All_Edges_Bielle[9] +geompy.addToStudy( Edge_Arr_pte_d_b , "Edge_Arr_pte_d_b" ) + +Edge_Arr_pte_d_b_mod = grille_cyl_pte.getEdgeJ( 1 , 4 , 0 ) +Edge_Arr_pte_d_b_mod.addAssociation( Edge_Arr_pte_d_b, 0., 1. ) + + +# recuperer les grand rayons de la geometrie + +Edge_Ray_grd_g_h = All_Edges_Bielle[28] +geompy.addToStudy( Edge_Ray_grd_g_h , "Edge_Ray_grd_g_h" ) +Edge_Ray_grd_d_h = All_Edges_Bielle[1] +geompy.addToStudy( Edge_Ray_grd_d_h , "Edge_Ray_grd_d_h" ) + +Edge_Ray_grd_g_b = All_Edges_Bielle[27] +geompy.addToStudy( Edge_Ray_grd_g_b , "Edge_Ray_grd_g_b" ) +Edge_Ray_grd_d_b = All_Edges_Bielle[0] +geompy.addToStudy( Edge_Ray_grd_d_b , "Edge_Ray_grd_d_b" ) + + + +X_pln1 = geompy.MakeVertex( 0 , 0 , 0 ) +Vec_X = geompy.MakeVectorDXDYDZ( 0 , 1 , 0 ) +Plan1 = geompy.MakePlane( X_pln1 , Vec_X , 200 ) + +Parti_Grd_Ray = geompy.MakePartition([ Edge_Ray_grd_g_h , Edge_Ray_grd_d_h , Edge_Ray_grd_g_b , Edge_Ray_grd_d_b ], [ Plan1 ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +geompy.addToStudy( Parti_Grd_Ray , "Parti_Grd_Ray" ) + + +All_Edges_Parti_Grd_Ray = geompy.SubShapeAllSorted(Parti_Grd_Ray, geompy.ShapeType["EDGE"]) + + +Grd_Ray_0 = All_Edges_Parti_Grd_Ray[0] +geompy.addToStudy( Grd_Ray_0 , "Grd_Ray_0" ) + +##Edge_Arr_grd_g_h_mod = grille_cyl_pte.getEdgeJ( 1 , 2 , 0 ) +Edge_Grd_Ray_0_mod = grille_cyl_pte.getEdgeJ( 1 , 0 , 0 ) +Edge_Grd_Ray_0_mod.addAssociation( Grd_Ray_0, 0., 1. ) + + +Grd_Ray_1 = All_Edges_Parti_Grd_Ray[1] +geompy.addToStudy( Grd_Ray_1 , "Grd_Ray_1" ) + +##Edge_Grd_Ray_1_mod = grille_cyl_pte.getEdgeJ( 1 , 2 , 1 ) +Edge_Grd_Ray_1_mod = grille_cyl_pte.getEdgeJ( 1 , 0 , 1 ) +Edge_Grd_Ray_1_mod.addAssociation( Grd_Ray_1, 0., 1. ) + +Grd_Ray_2 = All_Edges_Parti_Grd_Ray[2] +geompy.addToStudy( Grd_Ray_2 , "Grd_Ray_2" ) + +##Edge_Grd_Ray_2_mod = grille_cyl_pte.getEdgeJ( 1 , 3 , 0 ) +Edge_Grd_Ray_2_mod = grille_cyl_pte.getEdgeJ( 1 , 5 , 0 ) +Edge_Grd_Ray_2_mod.addAssociation( Grd_Ray_2, 0., 1. ) + +Grd_Ray_3 = All_Edges_Parti_Grd_Ray[3] +geompy.addToStudy( Grd_Ray_3 , "Grd_Ray_3" ) + +##Edge_Grd_Ray_3_mod = grille_cyl_pte.getEdgeJ( 1 , 3 , 1 ) +Edge_Grd_Ray_3_mod = grille_cyl_pte.getEdgeJ( 1 , 5 , 1 ) +Edge_Grd_Ray_3_mod.addAssociation( Grd_Ray_3, 0., 1. ) + +Grd_Ray_4 = All_Edges_Parti_Grd_Ray[4] +geompy.addToStudy( Grd_Ray_4 , "Grd_Ray_4" ) + +Edge_Grd_Ray_4_mod = grille_cyl_grd.getEdgeJ( 1 , 2 , 0 ) +Edge_Grd_Ray_4_mod.addAssociation( Grd_Ray_4, 0., 1. ) +#Edge_Grd_Ray_4_mod.addAssociation( Edge_Ray_grd_g_b , 0., 1. ) + + +Grd_Ray_5 = All_Edges_Parti_Grd_Ray[5] +geompy.addToStudy( Grd_Ray_5 , "Grd_Ray_5" ) + +Edge_Grd_Ray_5_mod = grille_cyl_grd.getEdgeJ( 1 , 2 , 1 ) +Edge_Grd_Ray_5_mod.addAssociation( Grd_Ray_5, 0., 1. ) + +Grd_Ray_6 = All_Edges_Parti_Grd_Ray[6] +geompy.addToStudy( Grd_Ray_6 , "Grd_Ray_6" ) + +Edge_Grd_Ray_6_mod = grille_cyl_grd.getEdgeJ( 1 , 3 , 0 ) +Edge_Grd_Ray_6_mod.addAssociation( Grd_Ray_6, 0., 1. ) + +Grd_Ray_7 = All_Edges_Parti_Grd_Ray[7] +geompy.addToStudy( Grd_Ray_7 , "Grd_Ray_7" ) + +Edge_Arr_grd_g_h_mod = grille_cyl_grd.getEdgeJ( 1 , 3 , 1 ) +Edge_Arr_grd_g_h_mod.addAssociation( Grd_Ray_7, 0., 1. ) + + +# recuperer les rayons des trous de la bielle de la geometrie + +Edge_Trou_grd_h = All_Edges_Bielle[26] +geompy.addToStudy( Edge_Trou_grd_h , "Edge_Trou_grd_h" ) + +Edge_Trou_grd_b = All_Edges_Bielle[25] +geompy.addToStudy( Edge_Trou_grd_b , "Edge_Trou_grd_b" ) + +Edge_Trou_pte_h = All_Edges_Bielle[3] +geompy.addToStudy( Edge_Trou_pte_h , "Edge_Trou_pte_h" ) + +Edge_Trou_pte_b = All_Edges_Bielle[2] +geompy.addToStudy( Edge_Trou_pte_b , "Edge_Trou_pte_b" ) + +Partition_Trou_grd_haut = geompy.MakePartition([ Edge_Trou_grd_h ], [ z_h_g_t , w_h_g_t , v_h_g_t , u_h_g_t , x_h_g_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +geompy.addToStudy( Partition_Trou_grd_haut , "Partition_Trou_grd_haut" ) + +All_Edge_Partition_Trou_grd_haut = geompy.SubShapeAllSorted(Partition_Trou_grd_haut, geompy.ShapeType["EDGE"]) + +Edge_Trou_grd_h_0 = All_Edge_Partition_Trou_grd_haut[0] +geompy.addToStudy( Edge_Trou_grd_h_0 , "Edge_Trou_grd_h_0" ) + +Edge_Trou_grd_h_0_mod = grille_cyl_grd.getEdgeJ( 0 , 0 , 1 ) +Edge_Trou_grd_h_0_mod.addAssociation( Edge_Trou_grd_h_0, 0., 1. ) + +Edge_Trou_grd_h_2 = All_Edge_Partition_Trou_grd_haut[2] +geompy.addToStudy( Edge_Trou_grd_h_2 , "Edge_Trou_grd_h_2" ) + +Edge_Trou_grd_h_2_mod = grille_cyl_grd.getEdgeJ( 0 , 1 , 1 ) +Edge_Trou_grd_h_2_mod.addAssociation( Edge_Trou_grd_h_2, 0., 1. ) + +Edge_Trou_grd_h_4 = All_Edge_Partition_Trou_grd_haut[4] +geompy.addToStudy( Edge_Trou_grd_h_4 , "Edge_Trou_grd_h_4" ) + +Edge_Trou_grd_h_4_mod = grille_cyl_grd.getEdgeJ( 0 , 2 , 1 ) +Edge_Trou_grd_h_4_mod.addAssociation( Edge_Trou_grd_h_4, 0., 1. ) + +Edge_Trou_grd_h_5 = All_Edge_Partition_Trou_grd_haut[5] +geompy.addToStudy( Edge_Trou_grd_h_5 , "Edge_Trou_grd_h_5" ) + +Edge_Trou_grd_h_5_mod = grille_cyl_grd.getEdgeJ( 0 , 3 , 1 ) +Edge_Trou_grd_h_5_mod.addAssociation( Edge_Trou_grd_h_5, 0., 1. ) + +Edge_Trou_grd_h_3 = All_Edge_Partition_Trou_grd_haut[3] +geompy.addToStudy( Edge_Trou_grd_h_3 , "Edge_Trou_grd_h_3" ) + +Edge_Trou_grd_h_3_mod = grille_cyl_grd.getEdgeJ( 0 , 4 , 1 ) +Edge_Trou_grd_h_3_mod.addAssociation( Edge_Trou_grd_h_3, 0., 1. ) + +Edge_Trou_grd_h_1 = All_Edge_Partition_Trou_grd_haut[1] +geompy.addToStudy( Edge_Trou_grd_h_1 , "Edge_Trou_grd_h_1" ) + +Edge_Trou_grd_h_1_mod = grille_cyl_grd.getEdgeJ( 0 , 5 , 1 ) +Edge_Trou_grd_h_1_mod.addAssociation( Edge_Trou_grd_h_1, 0., 1. ) + + + +Partition_Trou_grd_bas = geompy.MakePartition([ Edge_Trou_grd_b ], [ z_b_g_t , w_b_g_t , v_b_g_t , u_b_g_t , x_b_g_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +geompy.addToStudy( Partition_Trou_grd_bas , "Partition_Trou_grd_bas" ) + + +All_Edge_Partition_Trou_grd_bas = geompy.SubShapeAllSorted(Partition_Trou_grd_bas, geompy.ShapeType["EDGE"]) + +Edge_Trou_grd_b_0 = All_Edge_Partition_Trou_grd_bas[0] +geompy.addToStudy( Edge_Trou_grd_b_0 , "Edge_Trou_grd_b_0" ) + +Edge_Trou_grd_b_0_mod = grille_cyl_grd.getEdgeJ( 0 , 0 , 0 ) +Edge_Trou_grd_b_0_mod.addAssociation( Edge_Trou_grd_b_0, 0., 1. ) + +Edge_Trou_grd_b_2 = All_Edge_Partition_Trou_grd_bas[2] +geompy.addToStudy( Edge_Trou_grd_b_2 , "Edge_Trou_grd_b_2" ) + +Edge_Trou_grd_b_2_mod = grille_cyl_grd.getEdgeJ( 0 , 1 , 0 ) +Edge_Trou_grd_b_2_mod.addAssociation( Edge_Trou_grd_b_2, 0., 1. ) + +Edge_Trou_grd_b_4 = All_Edge_Partition_Trou_grd_bas[4] +geompy.addToStudy( Edge_Trou_grd_b_4 , "Edge_Trou_grd_b_4" ) + +Edge_Trou_grd_b_4_mod = grille_cyl_grd.getEdgeJ( 0 , 2 , 0 ) +Edge_Trou_grd_b_4_mod.addAssociation( Edge_Trou_grd_b_4, 0., 1. ) + +Edge_Trou_grd_b_5 = All_Edge_Partition_Trou_grd_bas[5] +geompy.addToStudy( Edge_Trou_grd_b_5 , "Edge_Trou_grd_b_5" ) + +Edge_Trou_grd_b_5_mod = grille_cyl_grd.getEdgeJ( 0 , 3 , 0 ) +Edge_Trou_grd_b_5_mod.addAssociation( Edge_Trou_grd_b_5, 0., 1. ) + +Edge_Trou_grd_b_3 = All_Edge_Partition_Trou_grd_bas[3] +geompy.addToStudy( Edge_Trou_grd_b_3 , "Edge_Trou_grd_b_3" ) + +Edge_Trou_grd_b_3_mod = grille_cyl_grd.getEdgeJ( 0 , 4 , 0 ) +Edge_Trou_grd_b_3_mod.addAssociation( Edge_Trou_grd_b_3, 0., 1. ) + +Edge_Trou_grd_b_1 = All_Edge_Partition_Trou_grd_bas[1] +geompy.addToStudy( Edge_Trou_grd_b_1 , "Edge_Trou_grd_b_1" ) + +Edge_Trou_grd_b_1_mod = grille_cyl_grd.getEdgeJ( 0 , 5 , 0 ) +Edge_Trou_grd_b_1_mod.addAssociation( Edge_Trou_grd_b_1, 0., 1. ) + + + + + +Partition_Trou_pte_haut = geompy.MakePartition([ Edge_Trou_pte_h ], [ z_h_p_t , w_h_p_t , v_h_p_t , u_h_p_t , x_h_p_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +geompy.addToStudy( Partition_Trou_pte_haut , "Partition_Trou_pte_haut" ) + + +All_Edge_Partition_Trou_pte_haut = geompy.SubShapeAllSorted(Partition_Trou_pte_haut, geompy.ShapeType["EDGE"]) + +Edge_Trou_pte_h_0 = All_Edge_Partition_Trou_pte_haut[0] +geompy.addToStudy( Edge_Trou_pte_h_0 , "Edge_Trou_pte_h_0" ) + +Edge_Trou_pte_h_0_mod = grille_cyl_pte.getEdgeJ( 0 , 0 , 1 ) +Edge_Trou_pte_h_0_mod.addAssociation( Edge_Trou_pte_h_0, 0., 1. ) + +Edge_Trou_pte_h_2 = All_Edge_Partition_Trou_pte_haut[2] +geompy.addToStudy( Edge_Trou_pte_h_2 , "Edge_Trou_pte_h_2" ) + +Edge_Trou_pte_h_2_mod = grille_cyl_pte.getEdgeJ( 0 , 1 , 1 ) +Edge_Trou_pte_h_2_mod.addAssociation( Edge_Trou_pte_h_2, 0., 1. ) + +Edge_Trou_pte_h_4 = All_Edge_Partition_Trou_pte_haut[4] +geompy.addToStudy( Edge_Trou_pte_h_4 , "Edge_Trou_pte_h_4" ) + +Edge_Trou_pte_h_4_mod = grille_cyl_pte.getEdgeJ( 0 , 2 , 1 ) +Edge_Trou_pte_h_4_mod.addAssociation( Edge_Trou_pte_h_4, 0., 1. ) + +Edge_Trou_pte_h_5 = All_Edge_Partition_Trou_pte_haut[5] +geompy.addToStudy( Edge_Trou_pte_h_5 , "Edge_Trou_pte_h_5" ) + +Edge_Trou_pte_h_5_mod = grille_cyl_pte.getEdgeJ( 0 , 3 , 1 ) +Edge_Trou_pte_h_5_mod.addAssociation( Edge_Trou_pte_h_5, 0., 1. ) + +Edge_Trou_pte_h_3 = All_Edge_Partition_Trou_pte_haut[3] +geompy.addToStudy( Edge_Trou_pte_h_3 , "Edge_Trou_pte_h_3" ) + +Edge_Trou_pte_h_3_mod = grille_cyl_pte.getEdgeJ( 0 , 4 , 1 ) +Edge_Trou_pte_h_3_mod.addAssociation( Edge_Trou_pte_h_3, 0., 1. ) + +Edge_Trou_pte_h_1 = All_Edge_Partition_Trou_pte_haut[1] +geompy.addToStudy( Edge_Trou_pte_h_1 , "Edge_Trou_pte_h_1" ) + +Edge_Trou_pte_h_1_mod = grille_cyl_pte.getEdgeJ( 0 , 5 , 1 ) +Edge_Trou_pte_h_1_mod.addAssociation( Edge_Trou_pte_h_1, 0., 1. ) + + + + +Partition_Trou_pte_bas = geompy.MakePartition([ Edge_Trou_pte_b ], [ z_b_p_t , w_b_p_t , v_b_p_t , u_b_p_t , x_b_p_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +geompy.addToStudy( Partition_Trou_pte_bas , "Partition_Trou_pte_bas" ) + + +All_Edge_Partition_Trou_pte_bas = geompy.SubShapeAllSorted(Partition_Trou_pte_bas, geompy.ShapeType["EDGE"]) + +Edge_Trou_pte_b_0 = All_Edge_Partition_Trou_pte_bas[0] +geompy.addToStudy( Edge_Trou_pte_b_0 , "Edge_Trou_pte_b_0" ) + +Edge_Trou_pte_b_0_mod = grille_cyl_pte.getEdgeJ( 0 , 0 , 0 ) +Edge_Trou_pte_b_0_mod.addAssociation( Edge_Trou_pte_b_0, 0., 1. ) + +Edge_Trou_pte_b_2 = All_Edge_Partition_Trou_pte_bas[2] +geompy.addToStudy( Edge_Trou_pte_b_2 , "Edge_Trou_pte_b_2" ) + +Edge_Trou_pte_b_2_mod = grille_cyl_pte.getEdgeJ( 0 , 1 , 0 ) +Edge_Trou_pte_b_2_mod.addAssociation( Edge_Trou_pte_b_2, 0., 1. ) + +Edge_Trou_pte_b_4 = All_Edge_Partition_Trou_pte_bas[4] +geompy.addToStudy( Edge_Trou_pte_b_4 , "Edge_Trou_pte_b_4" ) + +Edge_Trou_pte_b_4_mod = grille_cyl_pte.getEdgeJ( 0 , 2 , 0 ) +Edge_Trou_pte_b_4_mod.addAssociation( Edge_Trou_pte_b_4, 0., 1. ) + +Edge_Trou_pte_b_5 = All_Edge_Partition_Trou_pte_bas[5] +geompy.addToStudy( Edge_Trou_pte_b_5 , "Edge_Trou_pte_b_5" ) + +Edge_Trou_pte_b_5_mod = grille_cyl_pte.getEdgeJ( 0 , 3 , 0 ) +Edge_Trou_pte_b_5_mod.addAssociation( Edge_Trou_pte_b_5, 0., 1. ) + +Edge_Trou_pte_b_3 = All_Edge_Partition_Trou_pte_bas[3] +geompy.addToStudy( Edge_Trou_pte_b_3 , "Edge_Trou_pte_b_3" ) + +Edge_Trou_pte_b_3_mod = grille_cyl_pte.getEdgeJ( 0 , 4 , 0 ) +Edge_Trou_pte_b_3_mod.addAssociation( Edge_Trou_pte_b_3, 0., 1. ) + +Edge_Trou_pte_b_1 = All_Edge_Partition_Trou_pte_bas[1] +geompy.addToStudy( Edge_Trou_pte_b_1 , "Edge_Trou_pte_b_1" ) + +Edge_Trou_pte_b_1_mod = grille_cyl_pte.getEdgeJ( 0 , 5 , 0 ) +Edge_Trou_pte_b_1_mod.addAssociation( Edge_Trou_pte_b_1, 0., 1. ) + +#==================================== +# CREATION DES FACES DES ARRONDIES +#==================================== + +All_Face_Arron_Bielle = geompy.SubShapeAllSorted(Bielle_geom, geompy.ShapeType["FACE"]) + +Face_Arron_1 = All_Face_Arron_Bielle[2] +geompy.addToStudy(Face_Arron_1, "Face_Arron_1") + +Quad_Arron_1 = grille_cyl_pte.getQuadJK( 1 , 1 , 0 ) + +Face_Arron_2 = All_Face_Arron_Bielle[3] +geompy.addToStudy(Face_Arron_2, "Face_Arron_2") + +Quad_Arron_2 = grille_cyl_pte.getQuadJK( 1 , 4 , 0 ) + +Face_Arron_3 = All_Face_Arron_Bielle[8] +geompy.addToStudy(Face_Arron_3, "Face_Arron_3") + +Quad_Arron_3 = grille_cyl_grd.getQuadJK( 1 , 1 , 0 ) + +Face_Arron_4 = All_Face_Arron_Bielle[9] +geompy.addToStudy(Face_Arron_4, "Face_Arron_4") + +Quad_Arron_4 = grille_cyl_grd.getQuadJK( 1 , 4 , 0 ) + + + + + + +#==================================== +# CREATION MAILLAGE +#==================================== + + +#================================================= +# Definir les groupes d elements pour le maillage +#================================================= + +# On definit 3 groupes de mailles + +# groupe d edges (arretes) + +Edge_grp = doc.addEdgeGroup("Edge_grp") +Nbr_Edg = doc.countEdge() +#print Nbr_Edg +for i in range(Nbr_Edg): + Edge_i = doc.getEdge(i) + Edge_grp.addElement(Edge_i) + + +# groupe de quads (faces) +Quad_grp = doc.addQuadGroup("Quad_grp") +Nbr_Qad = doc.countQuad() +#print Nbr_Qad +for i in range(Nbr_Qad): + Quad_i = doc.getQuad(i) + Quad_grp.addElement(Quad_i) + +# groupe d hexas (solids) +Hexa_grp = doc.addHexaGroup("Hexa_grp") +Nbr_Hex = doc.countHexa() +#print Nbr_Hex +for i in range(Nbr_Hex): + Hexa_i = doc.getHexa(i) + Hexa_grp.addElement(Hexa_i) + + + +# groupe de noeuds de vertex pour tout le modele + +Vertex_Nod_Grp = doc.addVertexNodeGroup("Vertex_Nod_Grp") +Nbr_Vx = doc.countVertex() +print Nbr_Vx + +for i in range(Nbr_Vx): + Vertex_i = doc.getVertex(i) + Vertex_Nod_Grp.addElement(Vertex_i) + +#==================================== +# Definir une loi de discretisation +#==================================== +# definir une loi: le choix de la loi reste aux utilisateurs +Law = doc.addLaw( "Uniform" , 4 ) + +#n = doc.countLaw() +#print n + +# chercher les propagations du modele +N_Propa = doc.countPropagation() + +for j in range(N_Propa): + Propa = doc.getPropagation(j) + Propa.setLaw( Law )# appliquer la loi de discretisation sur tout le modele et generer le maillage + +mesh = hexablock.mesh(doc, "test_BIELLE_bad_assoc:hexas") +#mesh = hexablock.mesh(doc, "test_BIELLE_bad_assoc:quads", 2) +#mesh = hexablock.mesh(doc, "test_BIELLE_bad_assoc:edges", 1) +#mesh = hexablock.mesh(doc, "test_BIELLE_bad_assoc:nodes", 0) + +print " --- MAILLAGE HEXAHEDRIQUE --- " +print "Nombre d hexaedres:" , mesh.NbHexas() +print "Nombre de quadrangles:", mesh.NbQuadrangles() +print "Nombre de segments:" , mesh.NbEdges() +print "Nombre de noeuds:" , mesh.NbNodes() diff --git a/src/TEST_PY/test_BIELLE_no_assoc.py b/src/TEST_PY/test_BIELLE_no_assoc.py new file mode 100755 index 0000000..f699d4a --- /dev/null +++ b/src/TEST_PY/test_BIELLE_no_assoc.py @@ -0,0 +1,1075 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#=============================================== +# By Karima DEBCHI YATAGHENE Nov 2009 at CS +#=============================================== + +import os +import GEOM +import geompy +import smesh +import hexablock +import math +import SALOMEDS + + +#STEP_PATH = os.path.expandvars("$HEXA_ROOT_DIR/bin/salome/crank.stp") + +#============================= +# CREATION DOCUMENT +#============================= + +doc = hexablock.addDocument("default") + +#============================= +# CREATION DU MODELE +#============================= + +# Pour la bielle on doit creer deux grilles cylindriques et prismer les quadrangles entre ces deux dernieres + +#============================= +# PARAMETRES +#============================= + +R = 40.0 + +r_grd = R +r_grd_t = R/2 + +r_pte = R +r_pte_t = R/2 + +l = 200.0 +#h = 0.019999999553*2 +h = 40. + +# Taille du grand cylindre +dr_grd = R +da_grd = 360 +dl_grd = h + +nr_grd = 1 +na_grd = 6 +nl_grd = 1 + +# Taille du petit cylindre +dr_pte = R +da_pte = 360 +dl_pte = h + +nr_pte = 1 +na_pte = 6 +nl_pte = 1 + + +#============================= +# Creation des vecteurs +#============================= + +dx = doc.addVector(l, 0, 0) +dy = doc.addVector(0, l, 0) +dz = doc.addVector(0, 0, l) + +#================================================= +# Creation des centres des grilles cylindriques +#================================================= + +c_grd = doc.addVertex(0, 0, 0) +c_pte = doc.addVertex(2*l, 0, 0) +dx_prime = doc.addVectorVertices( c_grd, c_pte ) + +#================================================= +# Creation de la grande grille cylindrique +#================================================= + +grille_cyl_grd = doc.makeCylindrical(c_grd, dx, dz, dr_grd, da_grd, dl_grd, nr_grd, na_grd, nl_grd, False) + +# on obtient une liste qui contient 6 hexaedres eguaux + +# 30 = pi/6 +# 60 = pi/3 +# 45 = pi/4 +# 90 = pi/2 +# 180 = pi + +alpha_x = 2*R*math.cos(math.pi/3) +alpha_y = 2*R*math.sin(math.pi/3) + +x1 = doc.findVertex( 2*R, 0, h ) +x2 = doc.findVertex( alpha_x, alpha_y, 0 ) +x3 = doc.findVertex( alpha_x, -alpha_y, 0 ) +x4 = doc.findVertex( 2*R, 0, 0 ) + +quad_11 = doc.findQuad(x1, x2) +quad_12 = doc.findQuad(x1, x3) + +quad_list = [ quad_11 , quad_12 ] + +#================================================= +# Creation de la petite grille cylindrique +#================================================= + +grille_cyl_pte = doc.makeTranslation( grille_cyl_grd , dx_prime ) + +# on obtient une liste qui contient 6 hexaedres eguaux + +y1 = doc.findVertex( 2*l - 2*R , 0 , h ) +y2 = doc.findVertex( 2*l - alpha_x , alpha_y , 0 ) +y3 = doc.findVertex( 2*l - alpha_x , -alpha_y , 0 ) +y4 = doc.findVertex( 2*l - 2*R , 0 , 0 ) + +quad_21 = doc.findQuad(y1, y2) +quad_22 = doc.findQuad(y1, y3) + +#================================================= +# Assemblage des deux grilles cylindriques +#================================================= +model_biell_fin = doc.joinQuads( quad_list , quad_21 , x1 , y1 , x4 , y4 , 1 ) + + +#=================================================================== +# Recuperation des vertex du model hexa bielle pour l association +#=================================================================== + +# NB: +# h = haut +# b = bas +# g = grand +# p = petit +# t = trou + +alpha_x = 2*R*math.cos(math.pi/3) +alpha_y = 2*R*math.sin(math.pi/3) + +# Face du haut grand trou + +## RQ:On remplace la fonction findVertex par getVertexIJK + +v_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 0 , 1 ) +w_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 1 , 1 ) +z_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 2 , 1 ) + +y_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 3 , 1 ) +x_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 4 , 1 ) +u_mod_h_g = grille_cyl_grd.getVertexIJK( 1 , 5 , 1 ) + +v_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 0 , 1 ) +w_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 1 , 1 ) +z_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 2 , 1 ) + +y_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 3 , 1 ) +x_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 4 , 1 ) +u_mod_h_g_t = grille_cyl_grd.getVertexIJK( 0 , 5 , 1 ) + +#----------- +#x_mod_h_g = doc.findVertex( -alpha_x , -alpha_y , h ) +#y_mod_h_g = doc.findVertex( -alpha_x , 0 , h ) +#z_mod_h_g = doc.findVertex( -alpha_x , alpha_y , h ) + +#u_mod_h_g = doc.findVertex( alpha_x , -alpha_y , h ) +#v_mod_h_g = doc.findVertex( alpha_x , 0 , h ) +#w_mod_h_g = doc.findVertex( alpha_x , alpha_y , h ) + +#x_mod_h_g_t = doc.findVertex( -alpha_x/2 , -alpha_y/2 , h ) +#y_mod_h_g_t = doc.findVertex( -alpha_x/2 , 0 , h ) +#z_mod_h_g_t = doc.findVertex( -alpha_x/2 , alpha_y/2 , h ) + +#u_mod_h_g_t = doc.findVertex( alpha_x/2 , -alpha_y/2 , h ) +#v_mod_h_g_t = doc.findVertex( alpha_x/2 , 0 , h ) +#w_mod_h_g_t = doc.findVertex( alpha_x/2 , alpha_y/2 , h ) +#----------- + +assert x_mod_h_g +assert y_mod_h_g +assert z_mod_h_g + +assert u_mod_h_g +assert v_mod_h_g +assert w_mod_h_g + +assert x_mod_h_g_t +assert y_mod_h_g_t # +assert z_mod_h_g_t + +assert u_mod_h_g_t # +assert v_mod_h_g_t +assert w_mod_h_g_t # + + +# Face du haut petit trou + +## RQ:On remplace la fonction findVertex par getVertexIJK +v_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 0 , 1 ) +w_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 1 , 1 ) +z_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 2 , 1 ) + +y_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 3 , 1 ) +x_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 4 , 1 ) +u_mod_h_p = grille_cyl_pte.getVertexIJK( 1 , 5 , 1 ) + +v_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 0 , 1 ) +w_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 1 , 1 ) +z_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 2 , 1 ) + +y_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 3 , 1 ) +x_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 4 , 1 ) +u_mod_h_p_t = grille_cyl_pte.getVertexIJK( 0 , 5 , 1 ) + + +#----------- +#x_mod_h_p = doc.findVertex( l + alpha_x , -alpha_y , h ) +#y_mod_h_p = doc.findVertex( l + alpha_x , 0 , h ) +#z_mod_h_p = doc.findVertex( l + alpha_x , alpha_y , h ) + +#u_mod_h_p = doc.findVertex( l - alpha_x , -alpha_y , h ) +#v_mod_h_p = doc.findVertex( l - alpha_x , 0 , h ) +#w_mod_h_p = doc.findVertex( l - alpha_x , alpha_y , h ) + +#x_mod_h_p_t = doc.findVertex( l + (alpha_x/2) , -alpha_y/2 , h ) +#y_mod_h_p_t = doc.findVertex( l + (alpha_x/2) , 0 , h ) +#z_mod_h_p_t = doc.findVertex( l + (alpha_x/2) , alpha_y/2 , h ) + +#u_mod_h_p_t = doc.findVertex( l - (alpha_x/2) , -alpha_y/2 , h ) +#v_mod_h_p_t = doc.findVertex( l - (alpha_x/2) , 0 , h ) +#w_mod_h_p_t = doc.findVertex( l - (alpha_x/2) , alpha_y/2 , h ) +#----------- + +#----------- +assert x_mod_h_p +assert y_mod_h_p +assert z_mod_h_p + +assert u_mod_h_p +assert v_mod_h_p +assert w_mod_h_p + +assert x_mod_h_p_t +assert y_mod_h_p_t +assert z_mod_h_p_t + +assert u_mod_h_p_t +assert v_mod_h_p_t +assert w_mod_h_p_t +#----------- + +# Face du bas grand trou + +## RQ:On remplace la fonction findVertex par getVertexIJK + +v_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 0 , 0 ) +w_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 1 , 0 ) +z_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 2 , 0 ) + +y_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 3 , 0 ) +x_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 4 , 0 ) +u_mod_b_g = grille_cyl_grd.getVertexIJK( 1 , 5 , 0 ) + +v_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 0 , 0 ) +w_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 1 , 0 ) +z_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 2 , 0 ) + +y_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 3 , 0 ) +x_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 4 , 0 ) +u_mod_b_g_t = grille_cyl_grd.getVertexIJK( 0 , 5 , 0 ) + +#----------- +#x_mod_b_g = doc.findVertex( -alpha_x , -alpha_y , 0 ) +#y_mod_b_g = doc.findVertex( -alpha_x , 0 , 0 ) +#z_mod_b_g = doc.findVertex( -alpha_x , alpha_y , 0 ) + +#u_mod_b_g = doc.findVertex( alpha_x , -alpha_y , 0 ) +#v_mod_b_g = doc.findVertex( alpha_x , 0 , 0 ) +#w_mod_b_g = doc.findVertex( alpha_x , alpha_y , 0 ) + +#x_mod_b_g_t = doc.findVertex( -alpha_x/2 , -alpha_y/2 , 0 ) +#y_mod_b_g_t = doc.findVertex( -alpha_x/2 , 0 , 0 ) +#z_mod_b_g_t = doc.findVertex( -alpha_x/2 , alpha_y/2 , 0 ) + +#u_mod_b_g_t = doc.findVertex( alpha_x/2 , -alpha_y/2 , 0 ) +#v_mod_b_g_t = doc.findVertex( alpha_x/2 , 0 , 0 ) +#w_mod_b_g_t = doc.findVertex( alpha_x/2 , alpha_y/2 , 0 ) +#----------- + +assert x_mod_b_g +assert y_mod_b_g +assert z_mod_b_g + +assert u_mod_b_g +assert v_mod_b_g +assert w_mod_b_g + +assert x_mod_b_g_t +assert y_mod_b_g_t +assert z_mod_b_g_t + +assert u_mod_b_g_t +assert v_mod_b_g_t +assert w_mod_b_g_t + + +# Face du bas petit trou + + +## RQ:On remplace la fonction findVertex par getVertexIJK + +v_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 0 , 0 ) +w_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 1 , 0 ) +z_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 2 , 0 ) + +y_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 3 , 0 ) +x_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 4 , 0 ) +u_mod_b_p = grille_cyl_pte.getVertexIJK( 1 , 5 , 0 ) + +v_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 0 , 0 ) +w_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 1 , 0 ) +z_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 2 , 0 ) + +y_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 3 , 0 ) +x_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 4 , 0 ) +u_mod_b_p_t = grille_cyl_pte.getVertexIJK( 0 , 5 , 0 ) + + +#----------- +#x_mod_b_p = doc.findVertex( l + alpha_x , -alpha_y , 0 ) +#y_mod_b_p = doc.findVertex( l + alpha_x , 0 , 0 ) +#z_mod_b_p = doc.findVertex( l + alpha_x , alpha_y , 0 ) + +#u_mod_b_p = doc.findVertex( l - alpha_x , -alpha_y , 0 ) +#v_mod_b_p = doc.findVertex( l - alpha_x , 0 , 0 ) +#w_mod_b_p = doc.findVertex( l - alpha_x , alpha_y , 0 ) + +#x_mod_b_p_t = doc.findVertex( l + (alpha_x/2) , -alpha_y/2 , 0 ) +#y_mod_b_p_t = doc.findVertex( l + (alpha_x/2) , 0 , 0 ) +#z_mod_b_p_t = doc.findVertex( l + (alpha_x/2) , alpha_y/2 , 0 ) + +#u_mod_b_p_t = doc.findVertex( l - (alpha_x/2) , -alpha_y/2 , 0 ) +#v_mod_b_p_t = doc.findVertex( l - (alpha_x/2) , 0 , 0 ) +#w_mod_b_p_t = doc.findVertex( l - (alpha_x/2) , alpha_y/2 , 0 ) +#----------- + +#----------- +assert x_mod_b_p +assert y_mod_b_p +assert z_mod_b_p + +assert u_mod_b_p +assert v_mod_b_p +assert w_mod_b_p + +assert x_mod_b_p_t +assert y_mod_b_p_t +assert z_mod_b_p_t + +assert u_mod_b_p_t +assert v_mod_b_p_t +assert w_mod_b_p_t +#----------- + + + +##=================================================================== +## Recuperation des points de la geometrie bielle pour l association +##=================================================================== +#Bielle_geom = geompy.Import(STEP_PATH, "STEP") + +#geompy.addToStudy(Bielle_geom, "Bielle_geom") + +#Pt_A = geompy.MakeVertex(0, 0, h/2.) +#Face_haut = geompy.GetFaceNearPoint(Bielle_geom, Pt_A) + + +#Pt_B = geompy.MakeVertex(0, 0, -h/2.) +#Face_bas = geompy.GetFaceNearPoint(Bielle_geom, Pt_B) + + +## NB: +## h = haut +## b = bas +## g = grand +## p = petit +## t = trou + + +#y_h_g = geompy.MakeVertexOnSurface(Face_haut, 1, 0.5) +#geompy.addToStudy( y_h_g , "y_h_g" ) +#y_b_g = geompy.MakeVertexWithRef(y_h_g, 0, 0, -h) +#geompy.addToStudy( y_b_g , "y_b_g" ) + +#v_h_p = geompy.MakeVertexOnSurface(Face_haut, 0, 0.5) +#geompy.addToStudy( v_h_p , "v_h_p" ) +#v_b_p = geompy.MakeVertexWithRef(v_h_p, 0, 0, -h) +#geompy.addToStudy( v_b_p , "v_b_p" ) + +#Edge_haut_grd = geompy.GetEdgeNearPoint(Bielle_geom, y_h_g) +#Edge_haut_pte = geompy.GetEdgeNearPoint(Bielle_geom, v_h_p) + + + +#x_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, 0) +#geompy.addToStudy( x_h_g , "x_h_g" ) +#x_b_g = geompy.MakeVertexWithRef(x_h_g, 0, 0, -h) +#geompy.addToStudy( x_b_g , "x_b_g" ) + +#z_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, 1) +#geompy.addToStudy( z_h_g , "z_h_g" ) +#z_b_g = geompy.MakeVertexWithRef(z_h_g, 0, 0, -h) +#geompy.addToStudy( z_b_g , "z_b_g" ) + +#w_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, 0) +#geompy.addToStudy( w_h_p , "w_h_p" ) +#w_b_p = geompy.MakeVertexWithRef(w_h_p, 0, 0, -h) +#geompy.addToStudy( w_b_p , "w_b_p" ) + +#u_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, 1) +#geompy.addToStudy( u_h_p , "u_h_p" ) +#u_b_p = geompy.MakeVertexWithRef(u_h_p, 0, 0, -h) +#geompy.addToStudy( u_b_p , "u_b_p" ) + + + +#Edge_haut_grd_trou = geompy.GetEdgesByLength(Face_haut, 0.147, 0.148) + + + +#y_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0) +#geompy.addToStudy(y_h_g_t, "y_h_g_t") +#y_b_g_t = geompy.MakeVertexWithRef(y_h_g_t, 0, 0, -h) +#geompy.addToStudy(y_b_g_t, "y_b_g_t") + +#z_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.2) +#geompy.addToStudy(z_h_g_t, "z_h_g_t") +#z_b_g_t = geompy.MakeVertexWithRef(z_h_g_t, 0, 0, -h) +#geompy.addToStudy(z_b_g_t, "z_b_g_t") + +#w_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.35) +#geompy.addToStudy(w_h_g_t, "w_h_g_t") +#w_b_g_t = geompy.MakeVertexWithRef(w_h_g_t, 0, 0, -h) +#geompy.addToStudy(w_b_g_t, "w_b_g_t") + +#v_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.5) +#geompy.addToStudy(v_h_g_t, "v_h_g_t") +#v_b_g_t = geompy.MakeVertexWithRef(v_h_g_t, 0, 0, -h) +#geompy.addToStudy(v_b_g_t, "v_b_g_t") + +#u_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.65) +#geompy.addToStudy(u_h_g_t, "u_h_g_t") +#u_b_g_t = geompy.MakeVertexWithRef(u_h_g_t, 0, 0, -h) +#geompy.addToStudy(u_b_g_t, "u_b_g_t") + +#x_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.8) +#geompy.addToStudy(x_h_g_t, "x_h_g_t") +#x_b_g_t = geompy.MakeVertexWithRef(x_h_g_t, 0, 0, -h) +#geompy.addToStudy(x_b_g_t, "x_b_g_t") + + + +#Edge_haut_pte_trou = geompy.GetEdgesByLength(Face_haut, 0.094, 0.095) + +#y_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0) +#geompy.addToStudy(y_h_p_t, "y_h_p_t") +#y_b_p_t = geompy.MakeVertexWithRef(y_h_p_t, 0, 0, -h) +#geompy.addToStudy(y_b_p_t, "y_b_p_t") + +#z_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.2) +#geompy.addToStudy(z_h_p_t, "z_h_p_t") +#z_b_p_t = geompy.MakeVertexWithRef(z_h_p_t, 0, 0, -h) +#geompy.addToStudy(z_b_p_t, "z_b_p_t") + +#w_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.35) +#geompy.addToStudy(w_h_p_t, "w_h_p_t") +#w_b_p_t = geompy.MakeVertexWithRef(w_h_p_t, 0, 0, -h) +#geompy.addToStudy(w_b_p_t, "w_b_p_t") + +#v_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.5) +#geompy.addToStudy(v_h_p_t, "v_h_p_t") +#v_b_p_t = geompy.MakeVertexWithRef(v_h_p_t, 0, 0, -h) +#geompy.addToStudy(v_b_p_t, "v_b_p_t") + +#u_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.65) +#geompy.addToStudy(u_h_p_t, "u_h_p_t") +#u_b_p_t = geompy.MakeVertexWithRef(u_h_p_t, 0, 0, -h) +#geompy.addToStudy(u_b_p_t, "u_b_p_t") + +#x_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.8) +#geompy.addToStudy(x_h_p_t, "x_h_p_t") +#x_b_p_t = geompy.MakeVertexWithRef(x_h_p_t, 0, 0, -h) +#geompy.addToStudy(x_b_p_t, "x_b_p_t") + + + +#Edge_haut_droite = geompy.GetEdgesByLength(Face_haut, 0.136, 0.137) + +#u_h_g = geompy.MakeVertexOnCurve(Edge_haut_droite, 1) +#geompy.addToStudy(u_h_g, "u_h_g") + +#u_b_g = geompy.MakeVertexWithRef(u_h_g, 0, 0, -h) +#geompy.addToStudy(u_b_g, "u_b_g") + +#x_h_p = geompy.MakeVertexOnCurve(Edge_haut_droite, 0) +#geompy.addToStudy(x_h_p, "x_h_p") +#x_b_p = geompy.MakeVertexWithRef(x_h_p, 0, 0, -h) +#geompy.addToStudy(x_b_p, "x_b_p") + + +#Edge_haut_gauche = geompy.GetEdgesByLength(Face_haut, 0.131, 0.132) + +#w_h_g = geompy.MakeVertexOnCurve(Edge_haut_gauche, 0) +#geompy.addToStudy(w_h_g, "w_h_g") + +#w_b_g = geompy.MakeVertexWithRef(w_h_g, 0, 0, -h) +#geompy.addToStudy(w_b_g, "w_b_g") + +#z_h_p = geompy.MakeVertexOnCurve(Edge_haut_gauche, 1) +#geompy.addToStudy(z_h_p, "z_h_p") +#z_b_p = geompy.MakeVertexWithRef(z_h_p, 0, 0, -h) +#geompy.addToStudy(z_b_p, "z_b_p") + +#Edge_v_grd = geompy.MakeLineTwoPnt(u_h_g, w_h_g) + +#v_h_g = geompy.MakeVertexOnCurve(Edge_v_grd, 0.5) +#geompy.addToStudy(v_h_g, "v_h_g") +#v_b_g = geompy.MakeVertexWithRef(v_h_g, 0, 0, -h) +#geompy.addToStudy(v_b_g, "v_b_g") + + +#Edge_v_pte = geompy.MakeLineTwoPnt(x_h_p, z_h_p) + +#y_h_p = geompy.MakeVertexOnCurve(Edge_v_pte, 0.5) +#geompy.addToStudy(y_h_p, "y_h_p") +#y_b_p = geompy.MakeVertexWithRef(y_h_p, 0, 0, -h) +#geompy.addToStudy(y_b_p, "y_b_p") + + +##======================= +## CREATION ASSOCIATION +##======================= + +##=========================================== +## association des sommets de la face du haut +##=========================================== + +## grand trou + +#x_mod_h_g.setAssociation( x_h_g ) +#y_mod_h_g.setAssociation( y_h_g ) +#z_mod_h_g.setAssociation( z_h_g ) +#u_mod_h_g.setAssociation( u_h_g ) +#v_mod_h_g.setAssociation( v_h_g ) +#w_mod_h_g.setAssociation( w_h_g ) + +#x_mod_h_g_t.setAssociation( x_h_g_t ) +#y_mod_h_g_t.setAssociation( y_h_g_t ) +#z_mod_h_g_t.setAssociation( z_h_g_t ) +#u_mod_h_g_t.setAssociation( u_h_g_t ) +#v_mod_h_g_t.setAssociation( v_h_g_t ) +#w_mod_h_g_t.setAssociation( w_h_g_t ) + +## petit trou + +#x_mod_h_p.setAssociation( x_h_p ) +#y_mod_h_p.setAssociation( y_h_p ) +#z_mod_h_p.setAssociation( z_h_p ) +#u_mod_h_p.setAssociation( u_h_p ) +#v_mod_h_p.setAssociation( v_h_p ) +#w_mod_h_p.setAssociation( w_h_p ) + +#x_mod_h_p_t.setAssociation( x_h_p_t ) +#y_mod_h_p_t.setAssociation( y_h_p_t ) +#z_mod_h_p_t.setAssociation( z_h_p_t ) +#u_mod_h_p_t.setAssociation( u_h_p_t ) +#v_mod_h_p_t.setAssociation( v_h_p_t ) +#w_mod_h_p_t.setAssociation( w_h_p_t ) + + +##=========================================== +## association des sommets de la face du bas +##=========================================== + +## grand trou + +#x_mod_b_g.setAssociation( x_b_g ) +#y_mod_b_g.setAssociation( y_b_g ) +#z_mod_b_g.setAssociation( z_b_g ) +#u_mod_b_g.setAssociation( u_b_g ) +#v_mod_b_g.setAssociation( v_b_g ) +#w_mod_b_g.setAssociation( w_b_g ) + +#x_mod_b_g_t.setAssociation( x_b_g_t ) +#y_mod_b_g_t.setAssociation( y_b_g_t ) +#z_mod_b_g_t.setAssociation( z_b_g_t ) +#u_mod_b_g_t.setAssociation( u_b_g_t ) +#v_mod_b_g_t.setAssociation( v_b_g_t ) +#w_mod_b_g_t.setAssociation( w_b_g_t ) + +## petit trou + +#x_mod_b_p.setAssociation( x_b_p ) +#y_mod_b_p.setAssociation( y_b_p ) +#z_mod_b_p.setAssociation( z_b_p ) +#u_mod_b_p.setAssociation( u_b_p ) +#v_mod_b_p.setAssociation( v_b_p ) +#w_mod_b_p.setAssociation( w_b_p ) + +#x_mod_b_p_t.setAssociation( x_b_p_t ) +#y_mod_b_p_t.setAssociation( y_b_p_t ) +#z_mod_b_p_t.setAssociation( z_b_p_t ) +#u_mod_b_p_t.setAssociation( u_b_p_t ) +#v_mod_b_p_t.setAssociation( v_b_p_t ) +#w_mod_b_p_t.setAssociation( w_b_p_t ) + + + + +##================================= +## Creation association des edges +##================================= + + +#All_Edges_Bielle = geompy.SubShapeAllSorted(Bielle_geom, geompy.ShapeType["EDGE"]) + +### recuperer les arrondies du haut de la geometrie + +#Edge_Arr_grd_g_h = All_Edges_Bielle[20] +#geompy.addToStudy( Edge_Arr_grd_g_h , "Edge_Arr_grd_g_h" ) + +#Edge_Arr_grd_g_h_mod = grille_cyl_grd.getEdgeJ( 1 , 1 , 1 ) +#Edge_Arr_grd_g_h_mod.addAssociation( Edge_Arr_grd_g_h, 0., 1. ) + + +#Edge_Arr_grd_d_h = All_Edges_Bielle[22] +#geompy.addToStudy( Edge_Arr_grd_d_h , "Edge_Arr_grd_d_h" ) + +#Edge_Arr_grd_d_h_mod = grille_cyl_grd.getEdgeJ( 1 , 4 , 1 ) +#Edge_Arr_grd_d_h_mod.addAssociation( Edge_Arr_grd_d_h, 0., 1. ) + + +#Edge_Arr_pte_g_h = All_Edges_Bielle[8] +#geompy.addToStudy( Edge_Arr_pte_g_h , "Edge_Arr_pte_g_h" ) + +#Edge_Arr_pte_g_h_mod = grille_cyl_pte.getEdgeJ( 1 , 1 , 1 ) +#Edge_Arr_pte_g_h_mod.addAssociation( Edge_Arr_pte_g_h, 0., 1. ) + +#Edge_Arr_pte_d_h = All_Edges_Bielle[10] +#geompy.addToStudy( Edge_Arr_pte_d_h , "Edge_Arr_pte_d_h" ) + +#Edge_Arr_pte_d_h_mod = grille_cyl_pte.getEdgeJ( 1 , 4 , 1 ) +#Edge_Arr_pte_d_h_mod.addAssociation( Edge_Arr_pte_d_h, 0., 1. ) + +## recuperer les arrondies du bas de la geometrie + +#Edge_Arr_grd_g_b = All_Edges_Bielle[19] +#geompy.addToStudy( Edge_Arr_grd_g_b , "Edge_Arr_grd_g_b" ) + +#Edge_Arr_grd_g_b_mod = grille_cyl_grd.getEdgeJ( 1 , 1 , 0 ) +#Edge_Arr_grd_g_b_mod.addAssociation( Edge_Arr_grd_g_b, 0., 1. ) + +#Edge_Arr_grd_d_b = All_Edges_Bielle[21] +#geompy.addToStudy( Edge_Arr_grd_d_b , "Edge_Arr_grd_d_b" ) + +#Edge_Arr_grd_d_b_mod = grille_cyl_grd.getEdgeJ( 1 , 4 , 0 ) +#Edge_Arr_grd_d_b_mod.addAssociation( Edge_Arr_grd_d_b, 0., 1. ) + +#Edge_Arr_pte_g_b = All_Edges_Bielle[7] +#geompy.addToStudy( Edge_Arr_pte_g_b , "Edge_Arr_pte_g_b" ) + +#Edge_Arr_pte_g_b_mod = grille_cyl_pte.getEdgeJ( 1 , 1 , 0 ) +#Edge_Arr_pte_g_b_mod.addAssociation( Edge_Arr_pte_g_b, 0., 1. ) + +#Edge_Arr_pte_d_b = All_Edges_Bielle[9] +#geompy.addToStudy( Edge_Arr_pte_d_b , "Edge_Arr_pte_d_b" ) + +#Edge_Arr_pte_d_b_mod = grille_cyl_pte.getEdgeJ( 1 , 4 , 0 ) +#Edge_Arr_pte_d_b_mod.addAssociation( Edge_Arr_pte_d_b, 0., 1. ) + + +## recuperer les grand rayons de la geometrie + +#Edge_Ray_grd_g_h = All_Edges_Bielle[28] +#geompy.addToStudy( Edge_Ray_grd_g_h , "Edge_Ray_grd_g_h" ) +#Edge_Ray_grd_d_h = All_Edges_Bielle[1] +#geompy.addToStudy( Edge_Ray_grd_d_h , "Edge_Ray_grd_d_h" ) + +#Edge_Ray_grd_g_b = All_Edges_Bielle[27] +#geompy.addToStudy( Edge_Ray_grd_g_b , "Edge_Ray_grd_g_b" ) +#Edge_Ray_grd_d_b = All_Edges_Bielle[0] +#geompy.addToStudy( Edge_Ray_grd_d_b , "Edge_Ray_grd_d_b" ) + + + +#X_pln1 = geompy.MakeVertex( 0 , 0 , 0 ) +#Vec_X = geompy.MakeVectorDXDYDZ( 0 , 1 , 0 ) +#Plan1 = geompy.MakePlane( X_pln1 , Vec_X , 200 ) + +#Parti_Grd_Ray = geompy.MakePartition([ Edge_Ray_grd_g_h , Edge_Ray_grd_d_h , Edge_Ray_grd_g_b , Edge_Ray_grd_d_b ], [ Plan1 ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +#geompy.addToStudy( Parti_Grd_Ray , "Parti_Grd_Ray" ) + + +#All_Edges_Parti_Grd_Ray = geompy.SubShapeAllSorted(Parti_Grd_Ray, geompy.ShapeType["EDGE"]) + + +#Grd_Ray_0 = All_Edges_Parti_Grd_Ray[0] +#geompy.addToStudy( Grd_Ray_0 , "Grd_Ray_0" ) + +###Edge_Arr_grd_g_h_mod = grille_cyl_pte.getEdgeJ( 1 , 2 , 0 ) +#Edge_Grd_Ray_0_mod = grille_cyl_pte.getEdgeJ( 1 , 0 , 0 ) +#Edge_Grd_Ray_0_mod.addAssociation( Grd_Ray_0, 0., 1. ) + + +#Grd_Ray_1 = All_Edges_Parti_Grd_Ray[1] +#geompy.addToStudy( Grd_Ray_1 , "Grd_Ray_1" ) + +###Edge_Grd_Ray_1_mod = grille_cyl_pte.getEdgeJ( 1 , 2 , 1 ) +#Edge_Grd_Ray_1_mod = grille_cyl_pte.getEdgeJ( 1 , 0 , 1 ) +#Edge_Grd_Ray_1_mod.addAssociation( Grd_Ray_1, 0., 1. ) + +#Grd_Ray_2 = All_Edges_Parti_Grd_Ray[2] +#geompy.addToStudy( Grd_Ray_2 , "Grd_Ray_2" ) + +###Edge_Grd_Ray_2_mod = grille_cyl_pte.getEdgeJ( 1 , 3 , 0 ) +#Edge_Grd_Ray_2_mod = grille_cyl_pte.getEdgeJ( 1 , 5 , 0 ) +#Edge_Grd_Ray_2_mod.addAssociation( Grd_Ray_2, 0., 1. ) + +#Grd_Ray_3 = All_Edges_Parti_Grd_Ray[3] +#geompy.addToStudy( Grd_Ray_3 , "Grd_Ray_3" ) + +###Edge_Grd_Ray_3_mod = grille_cyl_pte.getEdgeJ( 1 , 3 , 1 ) +#Edge_Grd_Ray_3_mod = grille_cyl_pte.getEdgeJ( 1 , 5 , 1 ) +#Edge_Grd_Ray_3_mod.addAssociation( Grd_Ray_3, 0., 1. ) + +#Grd_Ray_4 = All_Edges_Parti_Grd_Ray[4] +#geompy.addToStudy( Grd_Ray_4 , "Grd_Ray_4" ) + +#Edge_Grd_Ray_4_mod = grille_cyl_grd.getEdgeJ( 1 , 2 , 0 ) +#Edge_Grd_Ray_4_mod.addAssociation( Grd_Ray_4, 0., 1. ) +##Edge_Grd_Ray_4_mod.addAssociation( Edge_Ray_grd_g_b , 0., 1. ) + + +#Grd_Ray_5 = All_Edges_Parti_Grd_Ray[5] +#geompy.addToStudy( Grd_Ray_5 , "Grd_Ray_5" ) + +#Edge_Grd_Ray_5_mod = grille_cyl_grd.getEdgeJ( 1 , 2 , 1 ) +#Edge_Grd_Ray_5_mod.addAssociation( Grd_Ray_5, 0., 1. ) + +#Grd_Ray_6 = All_Edges_Parti_Grd_Ray[6] +#geompy.addToStudy( Grd_Ray_6 , "Grd_Ray_6" ) + +#Edge_Grd_Ray_6_mod = grille_cyl_grd.getEdgeJ( 1 , 3 , 0 ) +#Edge_Grd_Ray_6_mod.addAssociation( Grd_Ray_6, 0., 1. ) + +#Grd_Ray_7 = All_Edges_Parti_Grd_Ray[7] +#geompy.addToStudy( Grd_Ray_7 , "Grd_Ray_7" ) + +#Edge_Arr_grd_g_h_mod = grille_cyl_grd.getEdgeJ( 1 , 3 , 1 ) +#Edge_Arr_grd_g_h_mod.addAssociation( Grd_Ray_7, 0., 1. ) + + +## recuperer les rayons des trous de la bielle de la geometrie + +#Edge_Trou_grd_h = All_Edges_Bielle[26] +#geompy.addToStudy( Edge_Trou_grd_h , "Edge_Trou_grd_h" ) + +#Edge_Trou_grd_b = All_Edges_Bielle[25] +#geompy.addToStudy( Edge_Trou_grd_b , "Edge_Trou_grd_b" ) + +#Edge_Trou_pte_h = All_Edges_Bielle[3] +#geompy.addToStudy( Edge_Trou_pte_h , "Edge_Trou_pte_h" ) + +#Edge_Trou_pte_b = All_Edges_Bielle[2] +#geompy.addToStudy( Edge_Trou_pte_b , "Edge_Trou_pte_b" ) + +#Partition_Trou_grd_haut = geompy.MakePartition([ Edge_Trou_grd_h ], [ z_h_g_t , w_h_g_t , v_h_g_t , u_h_g_t , x_h_g_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +#geompy.addToStudy( Partition_Trou_grd_haut , "Partition_Trou_grd_haut" ) + +#All_Edge_Partition_Trou_grd_haut = geompy.SubShapeAllSorted(Partition_Trou_grd_haut, geompy.ShapeType["EDGE"]) + +#Edge_Trou_grd_h_0 = All_Edge_Partition_Trou_grd_haut[0] +#geompy.addToStudy( Edge_Trou_grd_h_0 , "Edge_Trou_grd_h_0" ) + +#Edge_Trou_grd_h_0_mod = grille_cyl_grd.getEdgeJ( 0 , 0 , 1 ) +#Edge_Trou_grd_h_0_mod.addAssociation( Edge_Trou_grd_h_0, 0., 1. ) + +#Edge_Trou_grd_h_2 = All_Edge_Partition_Trou_grd_haut[2] +#geompy.addToStudy( Edge_Trou_grd_h_2 , "Edge_Trou_grd_h_2" ) + +#Edge_Trou_grd_h_2_mod = grille_cyl_grd.getEdgeJ( 0 , 1 , 1 ) +#Edge_Trou_grd_h_2_mod.addAssociation( Edge_Trou_grd_h_2, 0., 1. ) + +#Edge_Trou_grd_h_4 = All_Edge_Partition_Trou_grd_haut[4] +#geompy.addToStudy( Edge_Trou_grd_h_4 , "Edge_Trou_grd_h_4" ) + +#Edge_Trou_grd_h_4_mod = grille_cyl_grd.getEdgeJ( 0 , 2 , 1 ) +#Edge_Trou_grd_h_4_mod.addAssociation( Edge_Trou_grd_h_4, 0., 1. ) + +#Edge_Trou_grd_h_5 = All_Edge_Partition_Trou_grd_haut[5] +#geompy.addToStudy( Edge_Trou_grd_h_5 , "Edge_Trou_grd_h_5" ) + +#Edge_Trou_grd_h_5_mod = grille_cyl_grd.getEdgeJ( 0 , 3 , 1 ) +#Edge_Trou_grd_h_5_mod.addAssociation( Edge_Trou_grd_h_5, 0., 1. ) + +#Edge_Trou_grd_h_3 = All_Edge_Partition_Trou_grd_haut[3] +#geompy.addToStudy( Edge_Trou_grd_h_3 , "Edge_Trou_grd_h_3" ) + +#Edge_Trou_grd_h_3_mod = grille_cyl_grd.getEdgeJ( 0 , 4 , 1 ) +#Edge_Trou_grd_h_3_mod.addAssociation( Edge_Trou_grd_h_3, 0., 1. ) + +#Edge_Trou_grd_h_1 = All_Edge_Partition_Trou_grd_haut[1] +#geompy.addToStudy( Edge_Trou_grd_h_1 , "Edge_Trou_grd_h_1" ) + +#Edge_Trou_grd_h_1_mod = grille_cyl_grd.getEdgeJ( 0 , 5 , 1 ) +#Edge_Trou_grd_h_1_mod.addAssociation( Edge_Trou_grd_h_1, 0., 1. ) + + + +#Partition_Trou_grd_bas = geompy.MakePartition([ Edge_Trou_grd_b ], [ z_b_g_t , w_b_g_t , v_b_g_t , u_b_g_t , x_b_g_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +#geompy.addToStudy( Partition_Trou_grd_bas , "Partition_Trou_grd_bas" ) + + +#All_Edge_Partition_Trou_grd_bas = geompy.SubShapeAllSorted(Partition_Trou_grd_bas, geompy.ShapeType["EDGE"]) + +#Edge_Trou_grd_b_0 = All_Edge_Partition_Trou_grd_bas[0] +#geompy.addToStudy( Edge_Trou_grd_b_0 , "Edge_Trou_grd_b_0" ) + +#Edge_Trou_grd_b_0_mod = grille_cyl_grd.getEdgeJ( 0 , 0 , 0 ) +#Edge_Trou_grd_b_0_mod.addAssociation( Edge_Trou_grd_b_0, 0., 1. ) + +#Edge_Trou_grd_b_2 = All_Edge_Partition_Trou_grd_bas[2] +#geompy.addToStudy( Edge_Trou_grd_b_2 , "Edge_Trou_grd_b_2" ) + +#Edge_Trou_grd_b_2_mod = grille_cyl_grd.getEdgeJ( 0 , 1 , 0 ) +#Edge_Trou_grd_b_2_mod.addAssociation( Edge_Trou_grd_b_2, 0., 1. ) + +#Edge_Trou_grd_b_4 = All_Edge_Partition_Trou_grd_bas[4] +#geompy.addToStudy( Edge_Trou_grd_b_4 , "Edge_Trou_grd_b_4" ) + +#Edge_Trou_grd_b_4_mod = grille_cyl_grd.getEdgeJ( 0 , 2 , 0 ) +#Edge_Trou_grd_b_4_mod.addAssociation( Edge_Trou_grd_b_4, 0., 1. ) + +#Edge_Trou_grd_b_5 = All_Edge_Partition_Trou_grd_bas[5] +#geompy.addToStudy( Edge_Trou_grd_b_5 , "Edge_Trou_grd_b_5" ) + +#Edge_Trou_grd_b_5_mod = grille_cyl_grd.getEdgeJ( 0 , 3 , 0 ) +#Edge_Trou_grd_b_5_mod.addAssociation( Edge_Trou_grd_b_5, 0., 1. ) + +#Edge_Trou_grd_b_3 = All_Edge_Partition_Trou_grd_bas[3] +#geompy.addToStudy( Edge_Trou_grd_b_3 , "Edge_Trou_grd_b_3" ) + +#Edge_Trou_grd_b_3_mod = grille_cyl_grd.getEdgeJ( 0 , 4 , 0 ) +#Edge_Trou_grd_b_3_mod.addAssociation( Edge_Trou_grd_b_3, 0., 1. ) + +#Edge_Trou_grd_b_1 = All_Edge_Partition_Trou_grd_bas[1] +#geompy.addToStudy( Edge_Trou_grd_b_1 , "Edge_Trou_grd_b_1" ) + +#Edge_Trou_grd_b_1_mod = grille_cyl_grd.getEdgeJ( 0 , 5 , 0 ) +#Edge_Trou_grd_b_1_mod.addAssociation( Edge_Trou_grd_b_1, 0., 1. ) + + + + + +#Partition_Trou_pte_haut = geompy.MakePartition([ Edge_Trou_pte_h ], [ z_h_p_t , w_h_p_t , v_h_p_t , u_h_p_t , x_h_p_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +#geompy.addToStudy( Partition_Trou_pte_haut , "Partition_Trou_pte_haut" ) + + +#All_Edge_Partition_Trou_pte_haut = geompy.SubShapeAllSorted(Partition_Trou_pte_haut, geompy.ShapeType["EDGE"]) + +#Edge_Trou_pte_h_0 = All_Edge_Partition_Trou_pte_haut[0] +#geompy.addToStudy( Edge_Trou_pte_h_0 , "Edge_Trou_pte_h_0" ) + +#Edge_Trou_pte_h_0_mod = grille_cyl_pte.getEdgeJ( 0 , 0 , 1 ) +#Edge_Trou_pte_h_0_mod.addAssociation( Edge_Trou_pte_h_0, 0., 1. ) + +#Edge_Trou_pte_h_2 = All_Edge_Partition_Trou_pte_haut[2] +#geompy.addToStudy( Edge_Trou_pte_h_2 , "Edge_Trou_pte_h_2" ) + +#Edge_Trou_pte_h_2_mod = grille_cyl_pte.getEdgeJ( 0 , 1 , 1 ) +#Edge_Trou_pte_h_2_mod.addAssociation( Edge_Trou_pte_h_2, 0., 1. ) + +#Edge_Trou_pte_h_4 = All_Edge_Partition_Trou_pte_haut[4] +#geompy.addToStudy( Edge_Trou_pte_h_4 , "Edge_Trou_pte_h_4" ) + +#Edge_Trou_pte_h_4_mod = grille_cyl_pte.getEdgeJ( 0 , 2 , 1 ) +#Edge_Trou_pte_h_4_mod.addAssociation( Edge_Trou_pte_h_4, 0., 1. ) + +#Edge_Trou_pte_h_5 = All_Edge_Partition_Trou_pte_haut[5] +#geompy.addToStudy( Edge_Trou_pte_h_5 , "Edge_Trou_pte_h_5" ) + +#Edge_Trou_pte_h_5_mod = grille_cyl_pte.getEdgeJ( 0 , 3 , 1 ) +#Edge_Trou_pte_h_5_mod.addAssociation( Edge_Trou_pte_h_5, 0., 1. ) + +#Edge_Trou_pte_h_3 = All_Edge_Partition_Trou_pte_haut[3] +#geompy.addToStudy( Edge_Trou_pte_h_3 , "Edge_Trou_pte_h_3" ) + +#Edge_Trou_pte_h_3_mod = grille_cyl_pte.getEdgeJ( 0 , 4 , 1 ) +#Edge_Trou_pte_h_3_mod.addAssociation( Edge_Trou_pte_h_3, 0., 1. ) + +#Edge_Trou_pte_h_1 = All_Edge_Partition_Trou_pte_haut[1] +#geompy.addToStudy( Edge_Trou_pte_h_1 , "Edge_Trou_pte_h_1" ) + +#Edge_Trou_pte_h_1_mod = grille_cyl_pte.getEdgeJ( 0 , 5 , 1 ) +#Edge_Trou_pte_h_1_mod.addAssociation( Edge_Trou_pte_h_1, 0., 1. ) + + + + +#Partition_Trou_pte_bas = geompy.MakePartition([ Edge_Trou_pte_b ], [ z_b_p_t , w_b_p_t , v_b_p_t , u_b_p_t , x_b_p_t ], [], [], geompy.ShapeType["EDGE"], 0, [], 0) +#geompy.addToStudy( Partition_Trou_pte_bas , "Partition_Trou_pte_bas" ) + + +#All_Edge_Partition_Trou_pte_bas = geompy.SubShapeAllSorted(Partition_Trou_pte_bas, geompy.ShapeType["EDGE"]) + +#Edge_Trou_pte_b_0 = All_Edge_Partition_Trou_pte_bas[0] +#geompy.addToStudy( Edge_Trou_pte_b_0 , "Edge_Trou_pte_b_0" ) + +#Edge_Trou_pte_b_0_mod = grille_cyl_pte.getEdgeJ( 0 , 0 , 0 ) +#Edge_Trou_pte_b_0_mod.addAssociation( Edge_Trou_pte_b_0, 0., 1. ) + +#Edge_Trou_pte_b_2 = All_Edge_Partition_Trou_pte_bas[2] +#geompy.addToStudy( Edge_Trou_pte_b_2 , "Edge_Trou_pte_b_2" ) + +#Edge_Trou_pte_b_2_mod = grille_cyl_pte.getEdgeJ( 0 , 1 , 0 ) +#Edge_Trou_pte_b_2_mod.addAssociation( Edge_Trou_pte_b_2, 0., 1. ) + +#Edge_Trou_pte_b_4 = All_Edge_Partition_Trou_pte_bas[4] +#geompy.addToStudy( Edge_Trou_pte_b_4 , "Edge_Trou_pte_b_4" ) + +#Edge_Trou_pte_b_4_mod = grille_cyl_pte.getEdgeJ( 0 , 2 , 0 ) +#Edge_Trou_pte_b_4_mod.addAssociation( Edge_Trou_pte_b_4, 0., 1. ) + +#Edge_Trou_pte_b_5 = All_Edge_Partition_Trou_pte_bas[5] +#geompy.addToStudy( Edge_Trou_pte_b_5 , "Edge_Trou_pte_b_5" ) + +#Edge_Trou_pte_b_5_mod = grille_cyl_pte.getEdgeJ( 0 , 3 , 0 ) +#Edge_Trou_pte_b_5_mod.addAssociation( Edge_Trou_pte_b_5, 0., 1. ) + +#Edge_Trou_pte_b_3 = All_Edge_Partition_Trou_pte_bas[3] +#geompy.addToStudy( Edge_Trou_pte_b_3 , "Edge_Trou_pte_b_3" ) + +#Edge_Trou_pte_b_3_mod = grille_cyl_pte.getEdgeJ( 0 , 4 , 0 ) +#Edge_Trou_pte_b_3_mod.addAssociation( Edge_Trou_pte_b_3, 0., 1. ) + +#Edge_Trou_pte_b_1 = All_Edge_Partition_Trou_pte_bas[1] +#geompy.addToStudy( Edge_Trou_pte_b_1 , "Edge_Trou_pte_b_1" ) + +#Edge_Trou_pte_b_1_mod = grille_cyl_pte.getEdgeJ( 0 , 5 , 0 ) +#Edge_Trou_pte_b_1_mod.addAssociation( Edge_Trou_pte_b_1, 0., 1. ) + +##==================================== +## CREATION DES FACES DES ARRONDIES +##==================================== + +#All_Face_Arron_Bielle = geompy.SubShapeAllSorted(Bielle_geom, geompy.ShapeType["FACE"]) + +#Face_Arron_1 = All_Face_Arron_Bielle[2] +#geompy.addToStudy(Face_Arron_1, "Face_Arron_1") + +#Quad_Arron_1 = grille_cyl_pte.getQuadJK( 1 , 1 , 0 ) + +#Face_Arron_2 = All_Face_Arron_Bielle[3] +#geompy.addToStudy(Face_Arron_2, "Face_Arron_2") + +#Quad_Arron_2 = grille_cyl_pte.getQuadJK( 1 , 4 , 0 ) + +#Face_Arron_3 = All_Face_Arron_Bielle[8] +#geompy.addToStudy(Face_Arron_3, "Face_Arron_3") + +#Quad_Arron_3 = grille_cyl_grd.getQuadJK( 1 , 1 , 0 ) + +#Face_Arron_4 = All_Face_Arron_Bielle[9] +#geompy.addToStudy(Face_Arron_4, "Face_Arron_4") + +#Quad_Arron_4 = grille_cyl_grd.getQuadJK( 1 , 4 , 0 ) + + + + + + +#==================================== +# CREATION MAILLAGE +#==================================== + + +#================================================= +# Definir les groupes d elements pour le maillage +#================================================= + +# On definit 3 groupes de mailles + +# groupe d edges (arretes) + +Edge_grp = doc.addEdgeGroup("Edge_grp") +Nbr_Edg = doc.countEdge() +#print Nbr_Edg +for i in range(Nbr_Edg): + Edge_i = doc.getEdge(i) + Edge_grp.addElement(Edge_i) + + +# groupe de quads (faces) +Quad_grp = doc.addQuadGroup("Quad_grp") +Nbr_Qad = doc.countQuad() +#print Nbr_Qad +for i in range(Nbr_Qad): + Quad_i = doc.getQuad(i) + Quad_grp.addElement(Quad_i) + +# groupe d hexas (solids) +Hexa_grp = doc.addHexaGroup("Hexa_grp") +Nbr_Hex = doc.countHexa() +#print Nbr_Hex +for i in range(Nbr_Hex): + Hexa_i = doc.getHexa(i) + Hexa_grp.addElement(Hexa_i) + + + +# groupe de noeuds de vertex pour tout le modele +Vertex_Nod_Grp = doc.addVertexNodeGroup("Vertex_Nod_Grp") +Nbr_Vx = doc.countVertex() +#print Nbr_Vx +for i in range(Nbr_Vx): + Vertex_i = doc.getVertex(i) + Vertex_Nod_Grp.addElement(Vertex_i) + + +#==================================== +# Definir une loi de discretisation +#==================================== +# definir une loi: le choix de la loi reste aux utilisateurs +Law = doc.addLaw( "Uniform" , 4 ) + +#n = doc.countLaw() +#print n + +# chercher les propagations du modele +N_Propa = doc.countPropagation() + +for j in range(N_Propa): + Propa = doc.getPropagation(j) + Propa.setLaw( Law )# appliquer la loi de discretisation sur tout le modele et generer le maillage + +mesh = hexablock.mesh(doc, "test_BIELLE_no_assoc") + +print " --- MAILLAGE HEXAHEDRIQUE --- " +print "Nombre d hexaedres:" , mesh.NbHexas() +print "Nombre de quadrangles:", mesh.NbQuadrangles() +print "Nombre de segments:" , mesh.NbEdges() +print "Nombre de noeuds:" , mesh.NbNodes() diff --git a/src/TEST_PY/test_HEXABLOCK.py b/src/TEST_PY/test_HEXABLOCK.py new file mode 100755 index 0000000..e53d07d --- /dev/null +++ b/src/TEST_PY/test_HEXABLOCK.py @@ -0,0 +1,418 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import hexablock + + +# ======================================================== test_sphere +def test_sphere (): + doc = hexablock.addDocument ("default") + orig = doc.addVertex (0,0,0) + + ncouches = 1 + k = 0.8 + decal = doc.addVector (1,1,1) + sphere = doc.makeSpherical (orig, decal, ncouches, k) + + for nc in range(ncouches): + cell = sphere.getStrate (nc, Q_A) + cell.remove () + + sphere.saveVtk ("sphere.vtk") + print "test_sphere OK" + +# ======================================================== test_cartesi1 +def test_cartesi1 (): + size_x = 15 + size_y = 12 + size_z = 8 + + doc = hexablock.addDocument () + orig = doc.addVertex (0,0,0) + + dirVr = doc.addVector (1,1,1) + grid = doc.makeCartesian1 (orig, dirVr, size_x,size_y,size_z, 0, 0, 0 ) #CS_NOT_SPEC (makeCartesian1) + + #for (int nz=0 nz",j + #print "ok ->",ok + + +## -------------------- +## Maillage hexa�drique +## -------------------- +#mesh = mesh.ExportMED( "3cyl.med", 1 ) +#maillages = smesh.CreateMeshesFromMED( "3cyl.med" ) + +#ijk = maillages[0][0] + +#ijk.Hexahedron() + +#ijk.Compute() + +#print 4*" -- ijk --- " +#print "Nombre d hexaedres:", ijk.NbHexas() +#print "Nombre de quadrangles:", ijk.NbQuadrangles() +#print "Nombre de segments:", ijk.NbEdges() +#print "Nombre de noeuds:", ijk.NbNodes() + + + + + + + + + + + diff --git a/src/TEST_PY/test_TUYAU_COURBE_no_assoc.py b/src/TEST_PY/test_TUYAU_COURBE_no_assoc.py new file mode 100755 index 0000000..b326461 --- /dev/null +++ b/src/TEST_PY/test_TUYAU_COURBE_no_assoc.py @@ -0,0 +1,466 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#=============================================== +# By Karima DEBCHI YATAGHENE Nov 2009 at CS +#=============================================== + +import os +#import GEOM +import geompy +import smesh +import hexablock +import math +#import SALOMEDS + + +BREP_PATH = os.path.expandvars("$HEXABLOCK_ROOT_DIR/bin/salome/tuyau.brep") + +#============================= +# CREATION DOCUMENT +#============================= + +doc = hexablock.addDocument ("default") + +#============================= +# CREATION DU MODELE +#============================= + +# Pour le tuyau on doit creer une grille cylindrique + +#============================= +# PARAMETRES +#============================= + +R = 4.5 + +r = 4.5 +r_t = 3.6 + +h = 75.0 + +# Taille du cylindre +dr = R +da = 360 +dl = h + +nr = 1 +na = 4 +nl = 1 + + +#============================= +# Creation des vecteurs +#============================= + +dx = doc.addVector(h, 0, 0) +dy = doc.addVector(0, h, 0) +dz = doc.addVector(0, 0, h) + + +#================================================= +# Creation du centre de la grille cylindrique +#================================================= + +c = doc.addVertex(0, 0, 0) + +#================================================= +# Creation de la grille cylindrique +#================================================= + +grille_cyl = doc.makeCylindrical(c, dx, dz, dr, da, dl, nr, na, nl, False) + +# on obtient une liste qui contient 4 hexaedres eguaux + +# 30� = pi/6 +# 60� = pi/3 +# 45� = pi/4 +# 90� = pi/2 +# 180� = pi + + +#================================================= +# Model tuyau final +#================================================= + +model_tuyau_fin = grille_cyl + + +#model_tuyau_fin.saveVtk("/tmp/tuyau.vtk") +#grille_cyl.saveVtk("/tmp/grille_cyl.vtk") + + + +#=================================================================== +# Recuperation des vertex du model hexa tuyau pour l'association +#=================================================================== + +## NB: +## h = haut +## b = bas +## g = grand +## p = petit +## t = trou + + +# Face du haut grand rayon + +x_mod_h = doc.findVertex( 2*R , 0 , h ) +y_mod_h = doc.findVertex( 0 , 2*R , h ) +z_mod_h = doc.findVertex( -2*R , 0 , h ) +u_mod_h = doc.findVertex( 0 , -2*R , h ) + +# Face du haut petit rayon + +x_mod_h_t = doc.findVertex( R , 0 , h ) +y_mod_h_t = doc.findVertex( 0 , R , h ) +z_mod_h_t = doc.findVertex( -R , 0 , h ) +u_mod_h_t = doc.findVertex( 0 , -R , h ) + + +# Face du bas grand rayon + +x_mod_b = doc.findVertex( 2*R , 0 , 0 ) +y_mod_b = doc.findVertex( 0 , 2*R , 0 ) +z_mod_b = doc.findVertex( -2*R , 0 , 0 ) +u_mod_b = doc.findVertex( 0 , -2*R , 0 ) + +# Face du bas petit rayon + +x_mod_b_t = doc.findVertex( R , 0 , 0 ) +y_mod_b_t = doc.findVertex( 0 , R , 0 ) +z_mod_b_t = doc.findVertex( -R , 0 , 0 ) +u_mod_b_t = doc.findVertex( 0 , -R , 0 ) + + +#=================================================================== +# Recuperation des points de la geometrie tuyau pour l'association +#=================================================================== +Tuyau_geom = geompy.Import(BREP_PATH, "BREP") +geompy.addToStudy(Tuyau_geom, "Tuyau_geom") + + +Pt_A = geompy.MakeVertex( h , 20 , 4.5 ) +Edge_haut_droite_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_A) + + +Pt_B = geompy.MakeVertex( h , 20 , 3.6 ) +Edge_haut_droite_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_B) + + +Pt_C = geompy.MakeVertex( h , 20 , -4.5 ) +Edge_haut_gauche_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_C) + + + +Pt_D = geompy.MakeVertex( h , 20 , -3.6 ) +Edge_haut_gauche_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_D) + + + +# NB: +# h = haut +# b = bas +# g = grand +# p = petit +# t = trou + +# Face tuyau du haut +x_h = geompy.MakeVertexOnCurve(Edge_haut_droite_grd, 0.5) +y_h = geompy.MakeVertexOnCurve(Edge_haut_droite_grd, 1) +z_h = geompy.MakeVertexOnCurve(Edge_haut_gauche_grd, 0.5) +u_h = geompy.MakeVertexOnCurve(Edge_haut_gauche_grd, 0) + + + +x_h_t = geompy.MakeVertexOnCurve(Edge_haut_droite_pte, 0.5) +y_h_t = geompy.MakeVertexOnCurve(Edge_haut_droite_pte, 1) +z_h_t = geompy.MakeVertexOnCurve(Edge_haut_gauche_pte, 0.5) +u_h_t = geompy.MakeVertexOnCurve(Edge_haut_gauche_pte, 0) + + + +Pt_E = geompy.MakeVertex( 0 , 0 , 2 ) +Edge_bas_droite_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_E) + + +Pt_F = geompy.MakeVertex( 0 , 0 , 1.6 ) +Edge_bas_droite_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_F) + + +Pt_G = geompy.MakeVertex( 0 , 0 , -2 ) +Edge_bas_gauche_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_G) + + + +Pt_H = geompy.MakeVertex( 0 , 0 , -1.6 ) +Edge_bas_gauche_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_H) + + + +# Face tuyau du bas +x_b = geompy.MakeVertexOnCurve(Edge_bas_droite_grd, 0.5) +y_b = geompy.MakeVertexOnCurve(Edge_bas_droite_grd, 1) +z_b = geompy.MakeVertexOnCurve(Edge_bas_gauche_grd, 0.5) +u_b = geompy.MakeVertexOnCurve(Edge_bas_gauche_grd, 0) + + + +x_b_t = geompy.MakeVertexOnCurve(Edge_bas_droite_pte, 0.5) +y_b_t = geompy.MakeVertexOnCurve(Edge_bas_droite_pte, 1) +z_b_t = geompy.MakeVertexOnCurve(Edge_bas_gauche_pte, 0.5) +u_b_t = geompy.MakeVertexOnCurve(Edge_bas_gauche_pte, 0) + + + + +bp_law = doc.getLaw(0) +bp_law.setNodes(4) + +#==================================== +# CREATION MAILLAGE +#==================================== +##================================================= +## Definir les groupes d'elements pour le maillage +##================================================= + +# groupe de Hexa(volumes) +Hexa_grp = doc.addHexaGroup("Hexa_all_grp") +Nbr_Hex = doc.countHexa() +print "doc.countHexa()->",Nbr_Hex + +for i in range(Nbr_Hex): + Hexa_i = doc.getHexa(i) + Hexa_grp.addElement(Hexa_i) + +#Nbr_elm_hex = Hexa_grp.countElement() +#print "Hexa_all_grp countElement() ->",Nbr_elm_hex + +for i in range(Nbr_Hex): + Hexa_grp = doc.addHexaGroup("Hexa_grp"+str(i)) + Hexa_i = doc.getHexa(i) + Hexa_grp.addElement(Hexa_i) + + +# groupe de quads (faces) +Quad_grp_haut = doc.addQuadGroup("Quad_grp_haut") + +Quad_h_1 = doc.findQuad( x_mod_h , y_mod_h_t ) +Quad_h_2 = doc.findQuad( y_mod_h_t , z_mod_h ) +Quad_h_3 = doc.findQuad( z_mod_h , u_mod_h_t ) +Quad_h_4 = doc.findQuad( u_mod_h_t , x_mod_h ) + +assert Quad_h_1 +assert Quad_h_2 +assert Quad_h_3 +assert Quad_h_4 + + +for Quad_h_i in [ Quad_h_1 , Quad_h_2 , Quad_h_3 , Quad_h_4 ]: + Quad_grp_haut.addElement(Quad_h_i) + + + +Nbr_elm_qad_haut = Quad_grp_haut.countElement() +print "Nbr_elm_qad_haut ->",Nbr_elm_qad_haut + + +Quad_grp_bas = doc.addQuadGroup("Quad_grp_bas") + +Quad_b_1 = doc.findQuad( x_mod_b , y_mod_b_t ) +Quad_b_2 = doc.findQuad( y_mod_b_t , z_mod_b ) +Quad_b_3 = doc.findQuad( z_mod_b , u_mod_b_t ) +Quad_b_4 = doc.findQuad( u_mod_b_t , x_mod_b ) + + +assert Quad_b_1 +assert Quad_b_2 +assert Quad_b_3 +assert Quad_b_4 + +for Quad_b_i in [ Quad_b_1 , Quad_b_2 , Quad_b_3 , Quad_b_4 ]: + Quad_grp_bas.addElement(Quad_b_i) + + +Nbr_elm_qad_bas = Quad_grp_bas.countElement() +print "Nbr_elm_qad_bas->",Nbr_elm_qad_bas + + +# groupe de Edges + +Edge_Mod_ext_h = doc.findEdge( y_mod_h , y_mod_b ) +Edge_Mod_int_h = doc.findEdge( y_mod_h_t , y_mod_b_t ) + +Edge_Mod_int_b = doc.findEdge( u_mod_h_t , u_mod_b_t ) +Edge_Mod_ext_b = doc.findEdge( u_mod_h , u_mod_b ) + +Edge_Mod_ext_g = doc.findEdge( x_mod_h , x_mod_b ) +Edge_Mod_int_g = doc.findEdge( x_mod_h_t , x_mod_b_t ) + +Edge_Mod_int_d = doc.findEdge( z_mod_h_t , z_mod_b_t ) +Edge_Mod_ext_d = doc.findEdge( z_mod_h , z_mod_b ) + + +Edge_Grp_haut = doc.addEdgeGroup("Edge_Grp_haut") +Edge_Grp_haut.addElement(Edge_Mod_ext_h) +Edge_Grp_haut.addElement(Edge_Mod_int_h) + +Edge_Grp_gauche = doc.addEdgeGroup("Edge_Grp_gauche") +Edge_Grp_gauche.addElement(Edge_Mod_ext_g) +Edge_Grp_gauche.addElement(Edge_Mod_int_g) + +Edge_Grp_bas = doc.addEdgeGroup("Edge_Grp_bas") +Edge_Grp_bas.addElement(Edge_Mod_int_b) +Edge_Grp_bas.addElement(Edge_Mod_ext_b) + +Edge_Grp_droit = doc.addEdgeGroup("Edge_Grp_droit") +Edge_Grp_droit.addElement(Edge_Mod_int_d) +Edge_Grp_droit.addElement(Edge_Mod_ext_d) + + + +# groupe de noeuds de Hexa +Hexa_Nod_Grp = doc.addHexaNodeGroup("Hexa_Nod_Grp") +for i in range(Nbr_Hex): + Hexa_i = doc.getHexa(i) + Hexa_Nod_Grp.addElement(Hexa_i) + + +# groupe de noeuds de Quad +Quad_Nod_Grp_h_1 = doc.addQuadNodeGroup("Quad_Nod_Grp_h_1") +Quad_Nod_Grp_h_1.addElement(Quad_h_1) + +Quad_Nod_Grp_b_1 = doc.addQuadNodeGroup("Quad_Nod_Grp_b_1") +Quad_Nod_Grp_b_1.addElement(Quad_b_1) + +# groupe de noeuds de Edge +Edge_Nod_Grp_b = doc.addEdgeNodeGroup("Edge_Nod_Grp_b") +Edge_Nod_Grp_b.addElement(Edge_Mod_int_b) +Edge_Nod_Grp_b.addElement(Edge_Mod_ext_b) + +Edge_Nod_Grp_h = doc.addEdgeNodeGroup("Edge_Nod_Grp_h") +Edge_Nod_Grp_h.addElement(Edge_Mod_int_d) +Edge_Nod_Grp_h.addElement(Edge_Mod_ext_d) + + + + +# groupe de noeuds de vertex pour tout le modele +Vertex_Nod_Grp = doc.addVertexNodeGroup("Vertex_Nod_Grp") + +Nbr_Vx = doc.countVertex() +print "doc.countVertex()->",Nbr_Vx + +for i in range(Nbr_Vx): + Vertex_i = doc.getVertex(i) + Vertex_Nod_Grp.addElement(Vertex_i) + + +Nbr_elm_vex = Vertex_Nod_Grp.countElement() + +if Nbr_elm_vex == Nbr_Vx: + print "Vertex node group OK (on group :%s on model : %s)"%(Nbr_elm_vex, Nbr_Vx) +else: + print "Vertex node group KO (on group :%s on model : %s)"%(Nbr_elm_vex, Nbr_Vx) + + +#==================================== +# Definir une loi de discretisation +#==================================== + + +# definir une loi: le choix de la loi reste aux utilisateurs + +#Law_X = doc.addLaw( "Uniform" , 4 ) +#Law_Y = doc.addLaw( "Arithmetic" , 2 ) +#Law_Z = doc.addLaw( "Geometric" , 3 ) + + +Law_X = doc.addLaw( "Arithmetic" , 5 ) +Law_X.setKind(hexablock.ARITHMETIC) +Law_X.setCoefficient(0.1) + +Law_Y = doc.addLaw( "Arithmetic" , 3 ) +Law_Y.setKind(hexablock.ARITHMETIC) +Law_Y.setCoefficient(0.1) + +#Law_Z = doc.addLaw( "Geometric" , 4 ) +Law_Z = doc.addLaw( "Arithmetic" , 5 ) +Law_Z.setKind(hexablock.ARITHMETIC) +Law_Z.setCoefficient(0.05) + + +# chercher les propagations du modele +Edge_Law_X = doc.findEdge( x_mod_h , x_mod_h_t ) +Edge_Law_Y = doc.findEdge( y_mod_h , y_mod_h_t ) +Edge_Law_Z = doc.findEdge( y_mod_h , y_mod_b ) + + +Propa_X = doc.findPropagation( Edge_Law_X ) +Propa_Y = doc.findPropagation( Edge_Law_Y ) +Propa_Z = doc.findPropagation( Edge_Law_Z ) + + + +# appliquer la loi de discretisation sur tout le modele et generer le maillage +Propa_X.setLaw( Law_X ) +Propa_Y.setLaw( Law_Y ) +Propa_Z.setLaw( Law_Z ) + +print " --- MAILLAGE HEXAHEDRIQUE --- " +mesh = hexablock.mesh(doc, "test_TUYAU_COURBE_no_assoc") + +print "Nombre d hexaedres:" , mesh.NbHexas() +print "Nombre de quadrangles:", mesh.NbQuadrangles() +print "Nombre de segments:" , mesh.NbEdges() +print "Nombre de noeuds:" , mesh.NbNodes() + +salome.sg.updateObjBrowser(1) + +#Nombre d hexaedres: 480 +#Nombre de quadrangles: 496 +#Nombre de segments: 160 +#Nombre de noeuds: 700 + +allGroups = mesh.GetGroups() +print " --- GROUPES --- " +for aGroup in allGroups: + print "\nNOM:", aGroup.GetName() + print "IDS:", aGroup.GetIDs() + + + +## -------------------- +## Maillage hexa�drique +## -------------------- +#mesh = mesh.ExportMED( "tuyau.noassoc.med", 1 ) +#maillages = smesh.CreateMeshesFromMED( "tuyau.noassoc.med" ) + +#ijk = maillages[0][0] + +#ijk.Hexahedron() + +#ijk.Compute() + +#print " --- MAILLAGE HEXAHEDRIQUE --- " +#print "Nombre d hexaedres:", ijk.NbHexas() +#print "Nombre de quadrangles:", ijk.NbQuadrangles() +#print "Nombre de segments:", ijk.NbEdges() +#print "Nombre de noeuds:", ijk.NbNodes() diff --git a/src/TEST_PY/test_TUYAU_COURBE_weird_assoc.py b/src/TEST_PY/test_TUYAU_COURBE_weird_assoc.py new file mode 100755 index 0000000..3df354f --- /dev/null +++ b/src/TEST_PY/test_TUYAU_COURBE_weird_assoc.py @@ -0,0 +1,808 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#=============================================== +# By Karima DEBCHI YATAGHENE Nov 2009 at CS +#=============================================== +import os +import geompy +import smesh +import hexablock +import math + +# chemin du fichier BREP contenant la CAO +BREP_PATH = os.path.expandvars("$HEXA_ROOT_DIR/bin/salome/tuyau.brep") + + + + +#=================================================================== +# LE MODELE: +# (Pour le tuyau on doit creer une grille cylindrique) +#=================================================================== + + +#============================= +# PARAMETRES +#============================= +R = 4.5 +r = 4.5 +r_t = 3.6 +h = 75.0 + + +#================================================= +# Creation du document +#================================================= +doc = hexablock.addDocument ("default") + +#================================================= +# Creation du tuyau (grille cylindrique) dans le document +#================================================= +# centre de la grille cylindrique +c = doc.addVertex(0, 0, 0) + +# vecteurs de la grille cylindrique +dx = doc.addVector(h, 0, 0) +dy = doc.addVector(0, h, 0) +dz = doc.addVector(0, 0, h) + +# taille du cylindre +dr = R +da = 360 +dl = h + +nr = 1 +na = 4 +nl = 1 + +model_tuyau_fin = doc.makeCylindrical(c, dx, dz, dr, da, dl, nr, na, nl, False) +# note: on obtient une liste qui contient 4 hexaedres eguaux + + +#=================================================================== +# Recuperation des vertex,edges et quads du model pour l'association +# +# h = haut +# b = bas +# g = grand +# p = petit +# t = trou +#=================================================================== + +#========================= +# VERTEX +#========================= + +# Face du haut +# grand rayon +x_mod_h = doc.findVertex( 2*R , 0 , h ) +y_mod_h = doc.findVertex( 0 , 2*R , h ) +z_mod_h = doc.findVertex( -2*R , 0 , h ) +u_mod_h = doc.findVertex( 0 , -2*R , h ) + +# petit rayon +x_mod_h_t = doc.findVertex( R , 0 , h ) +y_mod_h_t = doc.findVertex( 0 , R , h ) +z_mod_h_t = doc.findVertex( -R , 0 , h ) +u_mod_h_t = doc.findVertex( 0 , -R , h ) + +# Face du bas +# grand rayon +x_mod_b = doc.findVertex( 2*R , 0 , 0 ) +y_mod_b = doc.findVertex( 0 , 2*R , 0 ) +z_mod_b = doc.findVertex( -2*R , 0 , 0 ) +u_mod_b = doc.findVertex( 0 , -2*R , 0 ) + +# petit rayon +x_mod_b_t = doc.findVertex( R , 0 , 0 ) +y_mod_b_t = doc.findVertex( 0 , R , 0 ) +z_mod_b_t = doc.findVertex( -R , 0 , 0 ) +u_mod_b_t = doc.findVertex( 0 , -R , 0 ) + + +# v�rifications +assert x_mod_h +assert y_mod_h +assert z_mod_h +assert u_mod_h + +assert x_mod_h_t +assert y_mod_h_t +assert z_mod_h_t +assert u_mod_h_t + +assert x_mod_b +assert y_mod_b +assert z_mod_b +assert u_mod_b + +assert x_mod_b_t +assert y_mod_b_t +assert z_mod_b_t +assert u_mod_b_t + + +#========================= +# EDGES +#========================= + +# Face du haut + +# grand rayon +edge_mod_face_h_1_1 = doc.findEdge( y_mod_h , z_mod_h ) +edge_mod_face_h_1_2 = doc.findEdge( z_mod_h , u_mod_h ) +edge_mod_face_h_2_1 = doc.findEdge( y_mod_h, x_mod_h ) +edge_mod_face_h_2_2 = doc.findEdge( x_mod_h, u_mod_h ) + +# petit rayon +edge_mod_t_face_h_1_1 = doc.findEdge( y_mod_h_t , z_mod_h_t ) +edge_mod_t_face_h_1_2 = doc.findEdge( z_mod_h_t , u_mod_h_t ) +edge_mod_t_face_h_2_1 = doc.findEdge( y_mod_h_t, x_mod_h_t ) +edge_mod_t_face_h_2_2 = doc.findEdge( x_mod_h_t, u_mod_h_t ) + + +# Face du bas + +# grand rayon +edge_mod_face_b_1_1 = doc.findEdge( y_mod_b , z_mod_b ) +edge_mod_face_b_1_2 = doc.findEdge( z_mod_b , u_mod_b ) +edge_mod_face_b_2_1 = doc.findEdge( y_mod_b, x_mod_b ) +edge_mod_face_b_2_2 = doc.findEdge( x_mod_b, u_mod_b ) + +# petit rayon +edge_mod_t_face_b_1_1 = doc.findEdge( y_mod_b_t , z_mod_b_t ) +edge_mod_t_face_b_1_2 = doc.findEdge( z_mod_b_t , u_mod_b_t ) +edge_mod_t_face_b_2_1 = doc.findEdge( y_mod_b_t, x_mod_b_t ) +edge_mod_t_face_b_2_2 = doc.findEdge( x_mod_b_t, u_mod_b_t ) + + + +# Joignant faces haut et du bas +Edge_Mod_ext_h = doc.findEdge( y_mod_h , y_mod_b ) +Edge_Mod_int_h = doc.findEdge( y_mod_h_t , y_mod_b_t ) + +Edge_Mod_int_b = doc.findEdge( u_mod_h_t , u_mod_b_t ) +Edge_Mod_ext_b = doc.findEdge( u_mod_h , u_mod_b ) + +Edge_Mod_ext_g = doc.findEdge( x_mod_h , x_mod_b ) +Edge_Mod_int_g = doc.findEdge( x_mod_h_t , x_mod_b_t ) + +Edge_Mod_int_d = doc.findEdge( z_mod_h_t , z_mod_b_t ) +Edge_Mod_ext_d = doc.findEdge( z_mod_h , z_mod_b ) + + +# v�rifications +assert edge_mod_face_h_1_1 +assert edge_mod_face_h_1_2 +assert edge_mod_face_h_2_1 +assert edge_mod_face_h_2_2 + +assert edge_mod_t_face_h_1_1 +assert edge_mod_t_face_h_1_2 +assert edge_mod_t_face_h_2_1 +assert edge_mod_t_face_h_2_2 + +assert edge_mod_face_b_1_1 +assert edge_mod_face_b_1_2 +assert edge_mod_face_b_2_1 +assert edge_mod_face_b_2_2 + +assert edge_mod_t_face_b_1_1 +assert edge_mod_t_face_b_1_2 +assert edge_mod_t_face_b_2_1 +assert edge_mod_t_face_b_2_2 + + +assert Edge_Mod_ext_h +assert Edge_Mod_int_h + +assert Edge_Mod_int_b +assert Edge_Mod_ext_b + +assert Edge_Mod_ext_g +assert Edge_Mod_int_g + +assert Edge_Mod_int_d +assert Edge_Mod_ext_d + + + +#========================= +# QUADS +#========================= +Quad_mod_0 = model_tuyau_fin.getQuadJK( 1 , 0 , 0 ) +Quad_mod_1 = model_tuyau_fin.getQuadJK( 1 , 1 , 0 ) +Quad_mod_2 = model_tuyau_fin.getQuadJK( 1 , 2 , 0 ) +Quad_mod_3 = model_tuyau_fin.getQuadJK( 1 , 3 , 0 ) + + + +#=================================================================== +# LA GEOMETRIE +#=================================================================== + +#=================================================================== +# Recuperation des points de la geometrie tuyau pour l'association +# +#=================================================================== +Tuyau_geom = geompy.Import(BREP_PATH, "BREP") + + +#========================= +# SOMMETS +#========================= +Pt_A = geompy.MakeVertex( h , 20 , 4.5 ) +Pt_B = geompy.MakeVertex( h , 20 , 3.6 ) +Pt_C = geompy.MakeVertex( h , 20 , -4.5 ) +Pt_D = geompy.MakeVertex( h , 20 , -3.6 ) +Pt_E = geompy.MakeVertex( 0 , 0 , 2 ) +Pt_F = geompy.MakeVertex( 0 , 0 , 1.6 ) +Pt_G = geompy.MakeVertex( 0 , 0 , -2 ) +Pt_H = geompy.MakeVertex( 0 , 0 , -1.6 ) + +# Face du bas +Edge_bas_droite_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_E) +Edge_bas_droite_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_F) +Edge_bas_gauche_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_G) +Edge_bas_gauche_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_H) +## Grand rayon +x_b = geompy.MakeVertexOnCurve(Edge_bas_droite_grd, 0.5) +y_b = geompy.MakeVertexOnCurve(Edge_bas_droite_grd, 1) +z_b = geompy.MakeVertexOnCurve(Edge_bas_gauche_grd, 0.5) +u_b = geompy.MakeVertexOnCurve(Edge_bas_gauche_grd, 0) + +## Petit rayon +x_b_t = geompy.MakeVertexOnCurve(Edge_bas_droite_pte, 0.5) +y_b_t = geompy.MakeVertexOnCurve(Edge_bas_droite_pte, 1) +z_b_t = geompy.MakeVertexOnCurve(Edge_bas_gauche_pte, 0.5) +u_b_t = geompy.MakeVertexOnCurve(Edge_bas_gauche_pte, 0) + + +# Face du haut +Edge_haut_droite_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_A) +Edge_haut_droite_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_B) +Edge_haut_gauche_grd = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_C) +Edge_haut_gauche_pte = geompy.GetEdgeNearPoint(Tuyau_geom, Pt_D) +## Grand rayon +x_h = geompy.MakeVertexOnCurve(Edge_haut_droite_grd, 0.5) +y_h = geompy.MakeVertexOnCurve(Edge_haut_droite_grd, 1) +z_h = geompy.MakeVertexOnCurve(Edge_haut_gauche_grd, 0.5) +u_h = geompy.MakeVertexOnCurve(Edge_haut_gauche_grd, 0) + +## Petit rayon +x_h_t = geompy.MakeVertexOnCurve(Edge_haut_droite_pte, 0.5) +y_h_t = geompy.MakeVertexOnCurve(Edge_haut_droite_pte, 1) +z_h_t = geompy.MakeVertexOnCurve(Edge_haut_gauche_pte, 0.5) +u_h_t = geompy.MakeVertexOnCurve(Edge_haut_gauche_pte, 0) + + + +#========================= +# EDGES +#========================= +All_Edges_Tuy_1 = geompy.SubShapeAllSorted( Tuyau_geom , geompy.ShapeType["EDGE"] ) + +# Face du haut +## Grand rayon +edge_face_h_1 = All_Edges_Tuy_1[11] +edge_face_h_2 = All_Edges_Tuy_1[14] +## Petit rayon +edge_t_face_h_1 = All_Edges_Tuy_1[12] +edge_t_face_h_2 = All_Edges_Tuy_1[13] + + +# Face du bas +## Grand rayon +edge_face_b_1 = All_Edges_Tuy_1[1] +edge_face_b_2 = All_Edges_Tuy_1[4] +## Petit rayon +edge_t_face_b_1 = All_Edges_Tuy_1[2] +edge_t_face_b_2 = All_Edges_Tuy_1[3] + + +# Joignant les 2 faces + +## edges compl�tes +Edge_Tuy_ext_h = All_Edges_Tuy_1[6] +Edge_Tuy_int_h = All_Edges_Tuy_1[7] +Edge_Tuy_int_b = All_Edges_Tuy_1[8] +Edge_Tuy_ext_b = All_Edges_Tuy_1[9] + +Pt_Z = geompy.MakeVertex( 75 , 20 , 0 ) +Pt_Z_1 = geompy.MakeVertexWithRef( Pt_Z , 0 , 0 , 10 ) +Pt_Z_2 = geompy.MakeVertexWithRef( Pt_Z , 0 , 0 , -10 ) +Line_Z1_Z2 = geompy.MakeLineTwoPnt( Pt_Z_1 , Pt_Z_2 ) + + +All_Edge_Tuy_ext_h = geompy.SubShapeAllSorted( Edge_Tuy_ext_h , geompy.ShapeType["VERTEX"] ) + +Vx_Edg_Tuy_ext_h_1 = All_Edge_Tuy_ext_h[0] +Vx_Edg_Tuy_ext_h_2 = All_Edge_Tuy_ext_h[1] + +Vx_Edg_Tuy_ext_h_1_trans = geompy.MakeVertexWithRef( Vx_Edg_Tuy_ext_h_1 , -10 , -10 , 0 ) +Vx_Edg_Tuy_ext_h_2_trans = geompy.MakeVertexWithRef( Vx_Edg_Tuy_ext_h_2 , 10 , 0 , 0 ) + +Line_1 = geompy.MakeLineTwoPnt(Vx_Edg_Tuy_ext_h_1, Vx_Edg_Tuy_ext_h_1_trans) +Line_2 = geompy.MakeLineTwoPnt(Vx_Edg_Tuy_ext_h_2, Vx_Edg_Tuy_ext_h_2_trans) + +Wire = geompy.MakeWire([Line_1, Line_2, Edge_Tuy_ext_h]) +Pipe_Z = geompy.MakePipe( Line_Z1_Z2 , Wire ) +Pipe_Ztt = geompy.MakePipe( Line_Z1_Z2 , Edge_Tuy_ext_h ) +Partition_Ztt = geompy.MakePartition([Tuyau_geom], [Pipe_Ztt], [], [], geompy.ShapeType["SOLID"], 0, [], 0) +All_Edges_Tuy_2tt = geompy.SubShapeAllSorted( Partition_Ztt , geompy.ShapeType["EDGE"] ) + +Edge_Tuy_ext_g = All_Edges_Tuy_2tt[12] +Edge_Tuy_int_g = All_Edges_Tuy_2tt[13] +Edge_Tuy_ext_d = All_Edges_Tuy_2tt[10] +Edge_Tuy_int_d = All_Edges_Tuy_2tt[11] + +## une edge en plusieurs(4) morceaux : Edge_Tuy_ext_h +X_pln1 = geompy.MakeVertexWithRef( Pt_Z , -20 , 0 , 0 ) +Vec_X = geompy.MakeVectorDXDYDZ( 1 , 0 , 0 ) + +Plan1 = geompy.MakePlane( X_pln1 , Vec_X , 200 ) +Plan2 = geompy.MakeTranslation( Plan1 , -20 , 0 , 0 ) +Plan3 = geompy.MakeTranslation( Plan1 , -40 , 0 , 0 ) + +Partition_Edge_g_d_h_b = geompy.MakePartition([ + Edge_Tuy_ext_h, + Edge_Tuy_int_h, + Edge_Tuy_ext_b, + Edge_Tuy_int_b, + Edge_Tuy_ext_g, + Edge_Tuy_int_g, + Edge_Tuy_ext_d, + Edge_Tuy_int_d], + [Plan1, Plan2, Plan3], [], [], geompy.ShapeType["EDGE"], 0, [], 0) + +All_Edge_g_d_h_b = geompy.SubShapeAllSorted( Partition_Edge_g_d_h_b , geompy.ShapeType["EDGE"] ) +Edge_Tuy_ext_h_1 = All_Edge_g_d_h_b[0] +Edge_Tuy_ext_h_2 = All_Edge_g_d_h_b[15] +Edge_Tuy_ext_h_3 = All_Edge_g_d_h_b[23] +Edge_Tuy_ext_h_4 = All_Edge_g_d_h_b[31] + + + +## une edge d�coup�e en plusieurs morceaux n'�pousant pas la g�om�trie: +VX_A = geompy.MakeVertexOnCurve(Edge_Tuy_ext_d, 0.) +VX_B = geompy.MakeVertexOnCurve(Edge_Tuy_ext_d, 1.) +VX_C = geompy.MakeVertexOnCurve(Edge_Tuy_ext_d, 0.25) +#VX_Cbis = geompy.MakeVertexWithRef(VX_C, -10, 10, 0) +VX_Cbis = geompy.MakeVertexWithRef(VX_C, -5, 1, -4) + +weird_part = geompy.MakePartition([Edge_Tuy_ext_d], [VX_C], [], [], geompy.ShapeType["EDGE"]) + +weird_edge0 = geompy.GetEdge(weird_part, VX_C, VX_B) +weird_edge1 = geompy.MakeEdge(VX_Cbis, VX_C ) +weird_edge2 = geompy.MakeEdge(VX_A, VX_Cbis ) + + +#========================= +# FACES +#========================= +All_Faces_Tuy_1 = geompy.SubShapeAllSorted( Tuyau_geom , geompy.ShapeType["FACE"] ) + +Face_Tuy_ext_1 = All_Faces_Tuy_1[4] +Face_Tuy_ext_2 = All_Faces_Tuy_1[5] + +Partition_Face = geompy.MakePartition([ Face_Tuy_ext_1 , Face_Tuy_ext_2 ], [ Plan1 , Plan2 , Plan3 , Pipe_Z ], [], [], geompy.ShapeType["FACE"], 0, [], 0) + + +All_Faces_Partition_Face = geompy.SubShapeAllSorted( Partition_Face , geompy.ShapeType["FACE"] ) + +## ------------------------------------- +Face_0 = All_Faces_Partition_Face[0] +Face_6 = All_Faces_Partition_Face[6] +Face_10 = All_Faces_Partition_Face[10] +Face_14 = All_Faces_Partition_Face[14] + +## ------------------------------------- +Face_1 = All_Faces_Partition_Face[1] +Face_7 = All_Faces_Partition_Face[7] +Face_11 = All_Faces_Partition_Face[11] +Face_15 = All_Faces_Partition_Face[15] + +## ------------------------------------- +Face_2 = All_Faces_Partition_Face[2] +Face_4 = All_Faces_Partition_Face[4] +Face_8 = All_Faces_Partition_Face[8] +Face_12 = All_Faces_Partition_Face[12] + +## ------------------------------------- +Face_3 = All_Faces_Partition_Face[3] +Face_5 = All_Faces_Partition_Face[5] +Face_9 = All_Faces_Partition_Face[9] +Face_13 = All_Faces_Partition_Face[13] + + + + + +#========================================================== +# LES ASSOCIATIONS +#========================================================== + +##=========================================== +## VERTEX +##=========================================== + +# Face du haut + +## Grand rayon +x_mod_h.setAssociation( x_h ) +y_mod_h.setAssociation( y_h ) +z_mod_h.setAssociation( z_h ) +u_mod_h.setAssociation( u_h ) + +## Petit rayon +x_mod_h_t.setAssociation( x_h_t ) +y_mod_h_t.setAssociation( y_h_t ) +z_mod_h_t.setAssociation( z_h_t ) +u_mod_h_t.setAssociation( u_h_t ) + + +# Face du bas + +## Grand rayon +x_mod_b.setAssociation( x_b ) +y_mod_b.setAssociation( y_b ) +z_mod_b.setAssociation( z_b ) +u_mod_b.setAssociation( u_b ) + +## Petit rayon +x_mod_b_t.setAssociation( x_b_t ) +y_mod_b_t.setAssociation( y_b_t ) +z_mod_b_t.setAssociation( z_b_t ) +u_mod_b_t.setAssociation( u_b_t ) + + +##=========================================== +## EDGES +##=========================================== + +# Face du haut + +## Grand rayon +edge_mod_face_h_1_1.addAssociation( edge_face_h_1, 0.5, 1. ) +edge_mod_face_h_1_2.addAssociation( edge_face_h_1, 0., 0.5 ) +edge_mod_face_h_2_1.addAssociation( edge_face_h_2, 0.5, 1. ) +edge_mod_face_h_2_2.addAssociation( edge_face_h_2, 0., 0.5 ) + +## Petit rayon +edge_mod_t_face_h_1_1.addAssociation( edge_t_face_h_1, 0.5, 1. ) +edge_mod_t_face_h_1_2.addAssociation( edge_t_face_h_1, 0., 0.5 ) +edge_mod_t_face_h_2_1.addAssociation( edge_t_face_h_2, 0.5, 1. ) +edge_mod_t_face_h_2_2.addAssociation( edge_t_face_h_2, 0., 0.5 ) + +# Face du bas + +## Grand rayon +edge_mod_face_b_1_1.addAssociation( edge_face_b_1, 0.5, 1. ) +edge_mod_face_b_1_2.addAssociation( edge_face_b_1, 0., 0.5 ) +edge_mod_face_b_2_1.addAssociation( edge_face_b_2, 0.5, 1. ) +edge_mod_face_b_2_2.addAssociation( edge_face_b_2, 0., 0.5 ) + +## Petit rayon +edge_mod_t_face_b_1_1.addAssociation( edge_t_face_b_1, 0.5, 1. ) +edge_mod_t_face_b_1_2.addAssociation( edge_t_face_b_1, 0., 0.5 ) +edge_mod_t_face_b_2_1.addAssociation( edge_t_face_b_2, 0.5, 1. ) +edge_mod_t_face_b_2_2.addAssociation( edge_t_face_b_2, 0., 0.5 ) + + + +# Joignant les 2 faces +#Edge_Mod_ext_h.addAssociation( Edge_Tuy_ext_h, 0., 1. ) +Edge_Mod_ext_h.addAssociation( Edge_Tuy_ext_h_1, 0., 1. ) +Edge_Mod_ext_h.addAssociation( Edge_Tuy_ext_h_2, 0., 1. ) +Edge_Mod_ext_h.addAssociation( Edge_Tuy_ext_h_3, 0., 1. ) +Edge_Mod_ext_h.addAssociation( Edge_Tuy_ext_h_4, 0., 1. ) +Edge_Mod_int_h.addAssociation( Edge_Tuy_int_h, 0., 1. ) + +Edge_Mod_int_b.addAssociation( Edge_Tuy_int_b, 0., 1. ) +Edge_Mod_ext_b.addAssociation( Edge_Tuy_ext_b, 0., 1. ) + +Edge_Mod_ext_g.addAssociation( Edge_Tuy_ext_g, 0., 1. ) +Edge_Mod_int_g.addAssociation( Edge_Tuy_int_g, 0., 1. ) + +Edge_Mod_int_d.addAssociation( Edge_Tuy_int_d, 0., 1. ) +#Edge_Mod_ext_d.addAssociation( Edge_Tuy_ext_d, 0., 1. ) +Edge_Mod_ext_d.addAssociation( weird_edge0, 0., 1. ) +Edge_Mod_ext_d.addAssociation( weird_edge1, 0., 1. ) +Edge_Mod_ext_d.addAssociation( weird_edge2, 0., 1. ) + + + +##=========================================== +## FACES +##=========================================== + +#Quad_mod_1.addAssociation( Face_Tuy_ext_1 ) +Quad_mod_1.addAssociation( Face_0 ) +Quad_mod_1.addAssociation( Face_6 ) +Quad_mod_1.addAssociation( Face_10 ) +Quad_mod_1.addAssociation( Face_14 ) + +#Quad_mod_0.addAssociation( Face_Tuy_ext_2 ) +Quad_mod_0.addAssociation( Face_1 ) +Quad_mod_0.addAssociation( Face_7 ) +Quad_mod_0.addAssociation( Face_11 ) +Quad_mod_0.addAssociation( Face_15 ) + +#Quad_mod_2.addAssociation( Face_Tuy_ext_1 ) +Quad_mod_2.addAssociation( Face_2 ) +Quad_mod_2.addAssociation( Face_4 ) +Quad_mod_2.addAssociation( Face_8 ) +Quad_mod_2.addAssociation( Face_12 ) + +#Quad_mod_3.addAssociation( Face_Tuy_ext_2 ) +Quad_mod_3.addAssociation( Face_3 ) +Quad_mod_3.addAssociation( Face_5 ) +Quad_mod_3.addAssociation( Face_9 ) +Quad_mod_3.addAssociation( Face_13 ) + + + +#========================================================== +# LA GEOMETRIE DANS L'ARBRE D'ETUDE SALOME +#========================================================== +#for i,e in enumerate(All_Edges_Tuy_1): geompy.addToStudy( e, "edge_"+str(i) ) +geompy.addToStudy(Tuyau_geom, "Tuyau_geom") +geompy.addToStudy( x_h, "x_h" ) +geompy.addToStudy( y_h, "y_h" ) +geompy.addToStudy( z_h, "z_h" ) +geompy.addToStudy( u_h, "u_h" ) +geompy.addToStudy( x_h_t, "x_h_t") +geompy.addToStudy( y_h_t, "y_h_t" ) +geompy.addToStudy( z_h_t, "z_h_t" ) +geompy.addToStudy( u_h_t, "u_h_t" ) + +geompy.addToStudy( x_b, "x_b") +geompy.addToStudy( y_b, "y_b" ) +geompy.addToStudy( z_b, "z_b" ) +geompy.addToStudy( u_b, "u_b") +geompy.addToStudy( x_b_t, "x_b_t" ) +geompy.addToStudy( y_b_t, "y_b_t" ) +geompy.addToStudy( z_b_t, "z_b_t" ) +geompy.addToStudy( u_b_t, "u_b_t" ) + + +#geompy.addToStudy(Line_Z1_Z2, "Line_Z1_Z2") +#geompy.addToStudy(Pipe_Ztt, "Pipe_Ztt") +#geompy.addToStudy( Partition_Ztt , "Partition_Ztt" ) +geompy.addToStudy( Edge_Tuy_ext_h , "Edge_Tuy_ext_h" ) +geompy.addToStudy( Edge_Tuy_int_h , "Edge_Tuy_int_h" ) +geompy.addToStudy( Edge_Tuy_int_b , "Edge_Tuy_int_b" ) +geompy.addToStudy( Edge_Tuy_ext_b , "Edge_Tuy_ext_b" ) +geompy.addToStudy( Edge_Tuy_ext_g , "Edge_Tuy_ext_g" ) +geompy.addToStudy( Edge_Tuy_int_g , "Edge_Tuy_int_g" ) +geompy.addToStudy( Edge_Tuy_ext_d , "Edge_Tuy_ext_d" ) +geompy.addToStudy( Edge_Tuy_int_d , "Edge_Tuy_int_d" ) +#geompy.addToStudy( Partition_Edge_g_d_h_b , "Partition_Edge_g_d_h_b" ) +geompy.addToStudy( Face_Tuy_ext_1 , "Face_Tuy_ext_1" ) +geompy.addToStudy( Face_Tuy_ext_2 , "Face_Tuy_ext_2" ) +#geompy.addToStudy( Partition_Face , "Partition_Face" ) +geompy.addToStudy( Face_0 , "Face_0" ) +geompy.addToStudy( Face_1 , "Face_1" ) +geompy.addToStudy( Face_2 , "Face_2" ) +geompy.addToStudy( Face_3 , "Face_3" ) +geompy.addToStudy( Face_4 , "Face_4" ) +geompy.addToStudy( Face_5 , "Face_5" ) +geompy.addToStudy( Face_6 , "Face_6" ) +geompy.addToStudy( Face_7 , "Face_7" ) +geompy.addToStudy( Face_8 , "Face_8" ) +geompy.addToStudy( Face_9 , "Face_9" ) +geompy.addToStudy( Face_10 , "Face_10" ) +geompy.addToStudy( Face_11 , "Face_11" ) +geompy.addToStudy( Face_12 , "Face_12" ) +geompy.addToStudy( Face_13 , "Face_13" ) +geompy.addToStudy( Face_14 , "Face_14" ) +geompy.addToStudy( Face_15 , "Face_15" ) + + + + + +#==================================== +# CREATION MAILLAGE +#==================================== + + +##================================================= +## Definir les groupes d'elements pour le maillage +##================================================= + +# groupe de Hexa(volumes) +Hexa_grp = doc.addHexaGroup("Hexa_grp") +Nbr_Hex = doc.countHexa() + + +for i in range(Nbr_Hex): + Hexa_i = doc.getHexa(i) + Hexa_grp.addElement(Hexa_i) + +Nbr_elm_hex = Hexa_grp.countElement() +print "Hexa_grp.countElement() ->",Nbr_elm_hex + + +# groupe de quads (faces) +Quad_grp_haut = doc.addQuadGroup("Quad_grp_haut") +Quad_h_1 = doc.findQuad( x_mod_h , y_mod_h_t ) +Quad_h_2 = doc.findQuad( y_mod_h_t , z_mod_h ) +Quad_h_3 = doc.findQuad( z_mod_h , u_mod_h_t ) +Quad_h_4 = doc.findQuad( u_mod_h_t , x_mod_h ) + +assert Quad_h_1 +assert Quad_h_2 +assert Quad_h_3 +assert Quad_h_4 + +for Quad_h_i in [ Quad_h_1 , Quad_h_2 , Quad_h_3 , Quad_h_4 ]: + Quad_grp_haut.addElement(Quad_h_i) + + +Quad_grp_bas = doc.addQuadGroup("Quad_grp_bas") +Quad_b_1 = doc.findQuad( x_mod_b , y_mod_b_t ) +Quad_b_2 = doc.findQuad( y_mod_b_t , z_mod_b ) +Quad_b_3 = doc.findQuad( z_mod_b , u_mod_b_t ) +Quad_b_4 = doc.findQuad( u_mod_b_t , x_mod_b ) + + +assert Quad_b_1 +assert Quad_b_2 +assert Quad_b_3 +assert Quad_b_4 + +for Quad_b_i in [ Quad_b_1 , Quad_b_2 , Quad_b_3 , Quad_b_4 ]: + Quad_grp_bas.addElement(Quad_b_i) + +#Nbr_elm_qad_bas = Quad_grp_bas.countElement() +#print "Nbr_elm_qad_bas->",Nbr_elm_qad_bas + + + +# groupe de Edges +Edge_Grp_haut = doc.addEdgeGroup("Edge_Grp_haut") +Edge_Grp_haut.addElement(Edge_Mod_ext_h) +Edge_Grp_haut.addElement(Edge_Mod_int_h) + +Edge_Grp_gauche = doc.addEdgeGroup("Edge_Grp_gauche") +Edge_Grp_gauche.addElement(Edge_Mod_ext_g) +Edge_Grp_gauche.addElement(Edge_Mod_int_g) + +Edge_Grp_bas = doc.addEdgeGroup("Edge_Grp_bas") +Edge_Grp_bas.addElement(Edge_Mod_int_b) +Edge_Grp_bas.addElement(Edge_Mod_ext_b) + +Edge_Grp_droit = doc.addEdgeGroup("Edge_Grp_droit") +Edge_Grp_droit.addElement(Edge_Mod_int_d) +Edge_Grp_droit.addElement(Edge_Mod_ext_d) + + +# groupe de noeuds de Hexa +Hexa_Nod_Grp = doc.addHexaNodeGroup("Hexa_Nod_Grp") +for i in range(Nbr_Hex): + Hexa_i = doc.getHexa(i) + Hexa_Nod_Grp.addElement(Hexa_i) + +# groupe de noeuds de Quad +Quad_Nod_Grp_h_1 = doc.addQuadNodeGroup("Quad_Nod_Grp_h_1") +Quad_Nod_Grp_h_1.addElement(Quad_h_1) + +Quad_Nod_Grp_b_1 = doc.addQuadNodeGroup("Quad_Nod_Grp_b_1") +Quad_Nod_Grp_b_1.addElement(Quad_b_1) + +# groupe de noeuds de Edge +Edge_Nod_Grp_b = doc.addEdgeNodeGroup("Edge_Nod_Grp_b") +Edge_Nod_Grp_b.addElement(Edge_Mod_int_b) +Edge_Nod_Grp_b.addElement(Edge_Mod_ext_b) + +Edge_Nod_Grp_h = doc.addEdgeNodeGroup("Edge_Nod_Grp_h") +Edge_Nod_Grp_h.addElement(Edge_Mod_int_d) +Edge_Nod_Grp_h.addElement(Edge_Mod_ext_d) + + +# groupe de noeuds de vertex pour tout le modele +Vertex_Nod_Grp = doc.addVertexNodeGroup("Vertex_Nod_Grp") +Nbr_Vx = doc.countVertex() +for i in range(Nbr_Vx): + Vertex_i = doc.getVertex(i) + Vertex_Nod_Grp.addElement(Vertex_i) + + +#==================================== +# Definir une loi de discretisation +#==================================== +bp_law = doc.getLaw(0) +bp_law.setNodes(4) + +# definir une loi: le choix de la loi reste aux utilisateurs + +#Law_X = doc.addLaw( "Uniform" , 4 ) +#Law_Y = doc.addLaw( "Arithmetic" , 2 ) +#Law_Z = doc.addLaw( "Geometric" , 3 ) +Law_X = doc.addLaw( "Arithmetic" , 5 ) +Law_X.setKind(hexablock.ARITHMETIC) +Law_X.setCoefficient(0.1) + +Law_Y = doc.addLaw( "Arithmetic" , 3 ) +Law_Y.setKind(hexablock.ARITHMETIC) +Law_Y.setCoefficient(0.1) + +#Law_Z = doc.addLaw( "Geometric" , 4 ) +Law_Z = doc.addLaw( "Arithmetic" , 5 ) +Law_Z.setKind(hexablock.ARITHMETIC) +Law_Z.setCoefficient(0.05) + + +# chercher les propagations du modele +Edge_Law_X = doc.findEdge( x_mod_h , x_mod_h_t ) +Edge_Law_Y = doc.findEdge( y_mod_h , y_mod_h_t ) +Edge_Law_Z = doc.findEdge( y_mod_h , y_mod_b ) + +Propa_X = doc.findPropagation( Edge_Law_X ) +Propa_Y = doc.findPropagation( Edge_Law_Y ) +Propa_Z = doc.findPropagation( Edge_Law_Z ) + +# appliquer la loi de discretisation sur tout le modele et generer le maillage +Propa_X.setLaw( Law_X ) +Propa_Y.setLaw( Law_Y ) +Propa_Z.setLaw( Law_Z ) + +print " --- MAILLAGE HEXAHEDRIQUE --- " +mesh = hexablock.mesh(doc, "test_TUYAU_COURBE_weird_assoc") + +print "Nombre d hexaedres:" , mesh.NbHexas() +print "Nombre de quadrangles:", mesh.NbQuadrangles() +print "Nombre de segments:" , mesh.NbEdges() +print "Nombre de noeuds:" , mesh.NbNodes() + +salome.sg.updateObjBrowser(1) + +#Nombre d hexaedres: 480 +#Nombre de quadrangles: 496 +#Nombre de segments: 160 +#Nombre de noeuds: 700 + +allGroups = mesh.GetGroups() +print " --- GROUPES --- " +for aGroup in allGroups: + print "\nNOM:", aGroup.GetName() + print "IDS:", aGroup.GetIDs() + + + +## -------------------- +## Maillage hexa�drique +## -------------------- +#mesh = mesh.ExportMED( "tuyau.med", 1 ) +#maillages = smesh.CreateMeshesFromMED( "tuyau.med" ) + +#ijk = maillages[0][0] + +#ijk.Hexahedron() + +#ijk.Compute() + +#print " --- MAILLAGE HEXAHEDRIQUE --- " +#print "Nombre d hexaedres:", ijk.NbHexas() +#print "Nombre de quadrangles:", ijk.NbQuadrangles() +#print "Nombre de segments:", ijk.NbEdges() +#print "Nombre de noeuds:", ijk.NbNodes() diff --git a/src/TEST_PY/test_distrib.py b/src/TEST_PY/test_distrib.py new file mode 100755 index 0000000..a62fc88 --- /dev/null +++ b/src/TEST_PY/test_distrib.py @@ -0,0 +1,111 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Francis KLOSS - 2010 - CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France +# ======================================================================================== + +import geompy +import hexablock + +# Build the geometry to mesh with hexahedra: a sphere +# --------------------------------------------------- + +name = "Sphere" + +cx = 0 +cy = 0 +cz = 0 + +radius = 5 + +sphere = geompy.MakeSphere(cx, cy, cz, radius) + +geompy.addToStudy(sphere, name) + +# Add a new document +# ------------------ + +doc = hexablock.addDocument(name) + +doc.addShape(sphere) + +# Build the model of blocks: a catesian grid +# ------------------------------------------ + +center = doc.addVertex(cx, cy, cz) + +axis_x = doc.addVector(1, 0, 0) +axis_y = doc.addVector(0, 1, 0) +axis_z = doc.addVector(0, 0, 1) + +doc.makeCartesian(center, axis_x, axis_y, axis_z, 5, 4, 3) + +# Associate the model of block to the geometry +# -------------------------------------------- + +# Define group of all hexahedra +# ----------------------------- + +group_h = doc.addHexaGroup(name+":hexas") +for i in xrange(doc.countHexa()): + e = doc.getHexa(i) + group_h.addElement(e) + +# Define group of all quadrangles +# ------------------------------- + +group_q = doc.addQuadGroup(name+":quadrangles") +for i in xrange(doc.countQuad()): + e = doc.getQuad(i) + group_q.addElement(e) + +# Define the laws for discretization +# ---------------------------------- + +law = doc.addLaw("Uniform" , 3) + +# Set the law on all edges of the model of blocks +# ----------------------------------------------- + +for i in xrange(doc.countPropagation()): + p = doc.getPropagation(i) + p.setLaw(law) + +# Generate the hexehadral mesh on FactoryServer +# --------------------------------------------- + +mesh_1 = hexablock.mesh(doc) + +print "Number of hexaedra :", mesh_1.NbHexas() +print "Number of quadrangles:", mesh_1.NbQuadrangles() +print "Number of segments :", mesh_1.NbEdges() +print "Number de nodes :", mesh_1.NbNodes() + +# Generate the hexehadral mesh on FooBar container +# ------------------------------------------------ + +container = "FooBar" + +mesh_2 = hexablock.mesh(doc, name+":"+container, 3, container) + +print "Number of hexaedra :", mesh_2.NbHexas() +print "Number of quadrangles:", mesh_2.NbQuadrangles() +print "Number of segments :", mesh_2.NbEdges() +print "Number de nodes :", mesh_2.NbNodes() diff --git a/src/TEST_PY/test_unit/asso_grid.py b/src/TEST_PY/test_unit/asso_grid.py new file mode 100644 index 0000000..4b5eee1 --- /dev/null +++ b/src/TEST_PY/test_unit/asso_grid.py @@ -0,0 +1,62 @@ +# -*- coding: latin-1 -*- + +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import os +import geompy +import hexablock +import math + +STEP_PATH = os.path.expandvars("$HEXABLOCK_ROOT_DIR/bin/salome/crank.stp") + +#========================================================================== + +doc = hexablock.addDocument ("default") + + +orig1 = doc.addVertex ( 0, 0,0); +vz = doc.addVector (0,0,1); +vx = doc.addVector (1,0,0); + +dr = 1.0 +dl = 1.0 +nr = 2 +nl = 3 +na = 8 + +c1 = doc.makeCylindrical (orig1, vx,vz,dr, 300, dl, nr, na, nl, False); + +#==================================== +# Definir une loi de discretisation +#==================================== +law = doc.addLaw("Uniform", 4) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc, "Grille:hexas") + +print "Nombre d hexaedres:", mesh_hexas.NbHexas() +print "Nombre de quadrangles:", mesh_hexas.NbQuadrangles() +print "Nombre de segments:", mesh_hexas.NbEdges() +print "Nombre de noeuds:", mesh_hexas.NbNodes() + + diff --git a/src/TEST_PY/test_unit/bielle.py b/src/TEST_PY/test_unit/bielle.py new file mode 100644 index 0000000..b19126d --- /dev/null +++ b/src/TEST_PY/test_unit/bielle.py @@ -0,0 +1,239 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Francis KLOSS - 2011 - CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France +# ======================================================================================== + +import geompy +import hexablock + +# Définir les paramètres +# ---------------------- + +nom = "bielle" + +# Construire le modèle de bloc +# ============================ + +doc = hexablock.addDocument(nom) + +# Construire les 2 grilles cylindriques +# ------------------------------------- + +centre_a = doc.addVertex(0, 0, 0) +centre_b = doc.addVertex(6, 0, 0) + +vecteur_a = doc.addVector(1, 1, 0) +vecteur_z = doc.addVector(0, 0, 1) +vecteur_b = doc.addVector(6, 0, 0) + +grille_a = doc.makeCylindrical(centre_a, vecteur_a, vecteur_z, 1, 360, 1, 1, 4, 1, False) + +### grille_b = doc.makeTranslation(grille_a, vecteur_b) +grille_b = doc.makeCylindrical(centre_b, vecteur_a, vecteur_z, 2, 360, 1, 1, 4, 1, False) + +grilles = [ grille_a, grille_b ] + +# Relier les 2 grilles +# -------------------- + +quad_a = grille_a.getQuadJK(1, 3, 0) +quad_b = grille_b.getQuadJK(1, 1, 0) + +point_a1 = grille_a.getVertexIJK(1, 0, 0) +point_a2 = grille_a.getVertexIJK(1, 3, 0) + +point_b1 = grille_b.getVertexIJK(1, 1, 0) +point_b2 = grille_b.getVertexIJK(1, 2, 0) + +prisme = doc.joinQuad(quad_a, quad_b, point_a1, point_b1, point_a2, point_b2, 3) + +# Associer le modèle de bloc avec la géométrie +# ============================================ + +# Charger la géométrie à associer +# ------------------------------- + +bielle = geompy.ImportSTEP("crank.stp") + +doc.setShape(bielle) + +# Extraire les subshapes de la géométrie +# -------------------------------------- + +g_vertices = geompy.SubShapeAllSortedCentres(bielle, geompy.ShapeType["VERTEX"]) +g_edges = geompy.SubShapeAllSortedCentres(bielle, geompy.ShapeType["EDGE" ]) + +sommets = [ [ 8, 6, 9, 7 ], [ 12, 10, 13, 11 ] ] + +cercles = [ [2, 3], [25, 26] ] +arcs_gr = [ [0, 1], [27, 28] ] +arcs_pe = [ [ 9, 7, 10, 8 ], [ 21, 19, 22, 20 ] ] + +# Associer les 4 cercles intérieurs +# --------------------------------- + +for k in xrange(0, 2): + for g in xrange(0, 2): + grille = grilles[g] + ve = grille.getVertexIJK(0, 1, k) + le = [ grille.getEdgeJ(0, j, k) for j in xrange(0, 4) ] + cercle = g_edges[ cercles[g][k] ] + doc.associateClosedLine(ve, le[0], le[1:], cercle, 0.625, False, []) + +# Associer les 4 grands arcs de cercle extérieurs +# ----------------------------------------------- + +for k in xrange(0, 2): + g=0 + grille = grilles[g] + le = [ grille.getEdgeJ(1, j, k) for j in [2, 1, 0] ] + ed = g_edges[ arcs_gr[g][k] ] + doc.associateOpenedLine(le[0], le[1:], ed, 0, [], 1) + +for k in xrange(0, 2): + g=1 + grille = grilles[g] + le = [ grille.getEdgeJ(1, j, k) for j in [0, 3, 2] ] + ed = g_edges[ arcs_gr[g][k] ] + doc.associateOpenedLine(le[0], le[1:], ed, 0, [], 1) + +# Associer les 8 sommets des petits arcs de cercle extérieurs +# ----------------------------------------------------------- + +for g, h in [ [0, 1], [1, 2] ]: + hexa = prisme.getHexa(h) + for vi in xrange(0, 4): + nv = 2*(vi/2) + 1 - vi % 2 + vm = hexa.getVertex(nv) + vg = g_vertices[ sommets[g][vi] ] + x, y, z = geompy.PointCoordinates(vg) + vm.setAssociation(vg) + +# Associer les 8 petits arcs de cercle extérieurs +# ----------------------------------------------- + +for g, h in [ [0, 0], [1, 2] ]: + hexa = prisme.getHexa(h) + for ei in xrange(0, 4): + nv = 2*(ei/2) + 1 - ei % 2 + em = hexa.getEdge(nv+8) + eg = g_edges[ arcs_pe[g][ei] ] + em.clearAssociation() + em.addAssociation(eg, 0, 1) + +# Associer 4 arcs nouveaux qui complétent les 4 grands arcs de cercle extérieurs +# ------------------------------------------------------------------------------ + +for h, ei, ech in [ [0, 0, 0.9], [0, 1, 0.9], [2, 2, 0.85], [2, 3, 0.85] ]: + hexa = prisme.getHexa(h) + em = hexa.getEdge(ei) + va = em.getVertex(0).getAssociation() + vb = em.getVertex(1).getAssociation() + vax, vay, vaz = geompy.PointCoordinates(va) + vbx, vby, vbz = geompy.PointCoordinates(vb) + vmx = ( vax + vbx ) / 2.0 * ech + vmy = ( vay + vby ) / 2.0 + vmz = ( vaz + vbz ) / 2.0 + vm = geompy.MakeVertex(vmx, vmy, vmz) + eg = geompy.MakeArc(va, vm, vb) + em.clearAssociation() + em.addAssociation(eg, 0, 1) + +# Mailler le modèle de bloc +# ========================= + +# Définir 5 groupes de faces +# -------------------------- + +groupe_trou_p = doc.addQuadGroup("Trou_petit") +groupe_trou_g = doc.addQuadGroup("Trou_grand") +groupe_bas = doc.addQuadGroup("Bas") +groupe_haut = doc.addQuadGroup("Haut") +groupe_contour = doc.addQuadGroup("Contour") + +for i in xrange(4): + groupe_trou_p.addElement(grille_a.getQuadJK(0, i, 0)) + groupe_trou_g.addElement(grille_b.getQuadJK(0, i, 0)) + + groupe_bas.addElement( grille_a.getQuadIJ(0, i, 0)) + groupe_bas.addElement( grille_b.getQuadIJ(0, i, 0)) + groupe_haut.addElement(grille_a.getQuadIJ(0, i, 1)) + groupe_haut.addElement(grille_b.getQuadIJ(0, i, 1)) + +for i in xrange(3): + groupe_contour.addElement(grille_a.getQuadJK(1, i, 0)) + +for i in [0, 2, 3]: + groupe_contour.addElement(grille_b.getQuadJK(1, i, 0)) + +for i in xrange(0, 3): + h = prisme.getHexa(i) + + q = h.getQuad(2) + groupe_bas.addElement(q) + + q = h.getQuad(3) + groupe_haut.addElement(q) + + q = h.getQuad(4) + groupe_contour.addElement(q) + q = h.getQuad(5) + groupe_contour.addElement(q) + +# Définir 3 groupes de volumes +# ---------------------------- + +groupe_cyli_p = doc.addHexaGroup("Cylindre_petit") +groupe_cyli_g = doc.addHexaGroup("Cylindre_grand") +groupe_prisme = doc.addHexaGroup("Prisme") + +for i in xrange(4): + groupe_cyli_p.addElement(grille_a.getHexa(i)) + groupe_cyli_g.addElement(grille_b.getHexa(i)) + +for i in xrange(3): + groupe_prisme.addElement(prisme.getHexa(i)) + +# Mailler le modèle de bloc avec association +# ------------------------------------------ + +l = doc.addLaw("Uniform1", 17) +n = doc.countPropagation() + +for i in xrange(n): + p = doc.getPropagation(i) + p.setLaw(l) + +l = doc.addLaw("Uniform2", 40) +p = doc.getPropagation(11) +p.setLaw(l) + +blocs = hexablock.mesh (doc) + +print "nombre de sommets du modèle de bloc: ", doc.countUsedVertex() +print "nombre d'arêtes du modèle de bloc: ", doc.countUsedEdge() +print "nombre de quadrangles du modèle de bloc: ", doc.countUsedQuad() +print "nombre de blocs du modèle de bloc: ", doc.countUsedHexa() + +print "Nombre de noeuds du maillage: ", blocs.NbNodes() +print "Nombre de segments du maillage: ", blocs.NbEdges() +print "Nombre de quadrangles du maillage: ", blocs.NbQuadrangles() +print "Nombre d'hexaèdres du maillage: ", blocs.NbHexas() diff --git a/src/TEST_PY/test_unit/hexa_quads.py b/src/TEST_PY/test_unit/hexa_quads.py new file mode 100644 index 0000000..15cda17 --- /dev/null +++ b/src/TEST_PY/test_unit/hexa_quads.py @@ -0,0 +1,254 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 +# ================================================================= save_schema +class FileVtk : + def __init__ (self, doc, radical): + self.document = doc + self.count = 0 + self.radical = radical + + def save (self) : + """ + sauvegarde vtk du modele de bloc + """ + self.count += 1 + file_name = os.path.join(self.radical + str(self.count) + '.vtk') + self.document.saveVtk(file_name) + +# ================================================================= add_grid +def add_grid (doc, size_x, size_y, size_z) : + orig = doc.addVertex(0, 0, 0) + + vx = doc.addVector (1, 0, 0) + vy = doc.addVector (0, 1, 0) + vz = doc.addVector (0, 0, 1) + grid = doc.makeCartesian (orig, vx, vy, vz, size_x, size_y, size_z) + return grid + +# ========================================================== test_hexa_quads_5 +def test_hexa_quads_5 () : + doc = hexablock.addDocument ("default") + vtk = FileVtk (doc, "HexaQuads5"); + grid = add_grid (doc, 3, 3, 2) + vtk.save () + + hexa = grid.getHexaIJK (1,1,1) + + qa = hexa.getQuad (0) + qb = hexa.getQuad (1) + qc = hexa.getQuad (2) + qd = hexa.getQuad (3) + qe = hexa.getQuad (4) + qf = hexa.getQuad (5) + + doc.removeQuad (qb) + vtk.save () + + doc.addHexa5Quads (qa, qc, qd, qe, qf); + vtk.save () + + doc.removeElements (grid) + vtk.save () + +# ========================================================== test_hexa_quads_ab +def test_hexa_quads_ab () : + doc = hexablock.addDocument() + vtk = FileVtk (doc, "HexaQuadsAB"); + grid = add_grid (doc, 1, 1, 3) + vtk.save () + + hexa = grid.getHexaIJK (0,0,1) + + qa = hexa.getQuad (0) + qb = hexa.getQuad (1) + qc = hexa.getQuad (2) + qd = hexa.getQuad (3) + qe = hexa.getQuad (4) + qf = hexa.getQuad (5) + + doc.removeQuad (qc) + doc.removeQuad (qd) + doc.removeQuad (qe) + doc.removeQuad (qf) + vtk.save () + + doc.addHexa2Quads (qa, qb) + vtk.save () + + doc.removeElements (grid) + vtk.save () + +# ========================================================== test_hexa_quads_ac +def test_hexa_quads_ac () : + doc = hexablock.addDocument() + vtk = FileVtk (doc, "HexaQuadsAC"); + grid = add_grid (doc, 2, 1, 2) + vtk.save () + + hexa = grid.getHexaIJK (1,0,1) + + qa = hexa.getQuad (0) + qb = hexa.getQuad (1) + qc = hexa.getQuad (2) + qd = hexa.getQuad (3) + qe = hexa.getQuad (4) + qf = hexa.getQuad (5) + + doc.removeQuad (qb) + doc.removeQuad (qc) + doc.removeQuad (qd) + doc.removeQuad (qf) + vtk.save () + + doc.addHexa2Quads (qa, qe) + vtk.save () + + doc.removeElements (grid) + vtk.save () + +# ======================================================= test_hexa_quads_acd +def test_hexa_quads_acd () : + + doc = hexablock.addDocument() + vtk = FileVtk (doc, "HexaQuadsACD"); + grid = add_grid (doc, 3, 1, 2) + vtk.save () + + hexa = grid.getHexaIJK (1,0,1) + + qa = hexa.getQuad (0) + qb = hexa.getQuad (1) + qc = hexa.getQuad (2) + qd = hexa.getQuad (3) + qe = hexa.getQuad (4) + qf = hexa.getQuad (5) + + doc.removeQuad (qb) + doc.removeQuad (qc) + doc.removeQuad (qd) + vtk.save () + + doc.addHexa3Quads (qa, qe, qf) + vtk.save () + + doc.removeElements (grid) + vtk.save () + + +# ======================================================= test_hexa_quads_ace +def test_hexa_quads_ace () : + + doc = hexablock.addDocument() + vtk = FileVtk (doc, "HexaQuadsACE"); + grid = add_grid (doc, 2, 2, 2) + vtk.save () + + hexa = grid.getHexaIJK (1,0,1) + + qa = hexa.getQuad (0) + qb = hexa.getQuad (1) + qc = hexa.getQuad (2) + qd = hexa.getQuad (3) + qe = hexa.getQuad (4) + qf = hexa.getQuad (5) + + doc.removeQuad (qb) + doc.removeQuad (qc) + doc.removeQuad (qf) + vtk.save () + + doc.addHexa3Quads (qa, qd, qe) + vtk.save () + + doc.removeElements (grid) + vtk.save () + +# ======================================================= test_hexa_quads_abcd +def test_hexa_quads_abcd () : + + doc = hexablock.addDocument() + vtk = FileVtk (doc, "HexaQuadsABCD"); + grid = add_grid (doc, 3, 1, 3) + vtk.save () + + hexa = grid.getHexaIJK (1,0,1) + + qa = hexa.getQuad (0) + qb = hexa.getQuad (1) + qc = hexa.getQuad (2) + qd = hexa.getQuad (3) + qe = hexa.getQuad (4) + qf = hexa.getQuad (5) + + doc.removeQuad (qc) + doc.removeQuad (qd) + vtk.save () + + doc.addHexa4Quads (qa, qb, qe, qf) + vtk.save () + + doc.removeElements (grid) + vtk.save () + +# ======================================================= test_hexa_quads_abce +def test_hexa_quads_abce () : + + doc = hexablock.addDocument() + vtk = FileVtk (doc, "HexaQuadsABCE"); + grid = add_grid (doc, 3, 2, 2) + vtk.save () + + hexa = grid.getHexaIJK (1,0,1) + + qa = hexa.getQuad (0) + qb = hexa.getQuad (1) + qc = hexa.getQuad (2) + qd = hexa.getQuad (3) + qe = hexa.getQuad (4) + qf = hexa.getQuad (5) + + doc.removeQuad (qc) + doc.removeQuad (qb) + vtk.save () + + doc.addHexa4Quads (qa, qd, qe, qf) + vtk.save () + + doc.removeElements (grid) + vtk.save () + + +# ================================================================= Begin + +test_hexa_quads_5 () +test_hexa_quads_ab () +test_hexa_quads_ac () +test_hexa_quads_acd () +test_hexa_quads_ace () +test_hexa_quads_abcd () +test_hexa_quads_abce () diff --git a/src/TEST_PY/test_unit/revolution.py b/src/TEST_PY/test_unit/revolution.py new file mode 100644 index 0000000..cc210a1 --- /dev/null +++ b/src/TEST_PY/test_unit/revolution.py @@ -0,0 +1,144 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 +# ================================================================= save_schema +class FileVtk : + def __init__ (self, doc, radical): + self.document = doc + self.count = 0 + self.radical = radical + + def save (self) : + """ + sauvegarde vtk du modele de bloc + """ + self.count += 1 + file_name = os.path.join(self.radical + str(self.count) + '.vtk') + self.document.saveVtk(file_name) + +# ======================================================= make_grid +def make_grid (doc, nr, na, nl) : + + ori = doc.addVertex ( 0, 0, 0) + vx = doc.addVector ( 1 ,0, 0) + vz = doc.addVector ( 0, 0, 1) + + dr = 1 + da = 360 + dl = 1 + + grid = doc.makeCylindrical (ori, vx,vz, dr,da,dl, nr,na,nl, False) + return grid + + +# ========================================================== test_revolution +def test_revolution () : + doc = hexablock.addDocument ("default") + vtk = FileVtk (doc, "Revolution"); + nr = 1 + na = 6 + nl = 1 + grid = make_grid (doc, nr, na, nl) + vtk.save () + + liste = [ ] + for nx in range (nr) : + for ny in range (na) : + cell = grid.getQuadIJ (nx, ny, nl) + print " ... cell = ", cell + liste.append (cell); + + center = doc.addVertex (0, -10, 0); + axis = doc.addVector (1, 0, 0); + angles = [5, 10, 15, 20, 30, 20, 15, 10, 5 ] + + vtk.save () + bloc = doc.revolutionQuads (liste, center, axis, angles); + vtk.save () + return doc + +# ========================================================== test_prism +def test_prism () : + doc = hexablock.addDocument("prism") + vtk = FileVtk (doc, "prism"); + nr = 1 + na = 6 + nl = 1 + grid = make_grid (doc, nr, na, nl) + vtk.save () + + liste = [ ] + for nx in range (nr) : + for ny in range (na) : + cell = grid.getQuadIJ (nx, ny, nl) + print " ... cell = ", cell + liste.append (cell); + + axis = doc.addVector (1, 1, 1); + + bloc = doc.prismQuads (liste, axis, 3) + vtk.save () + return doc + +# ========================================================== test_prism +def test_prism_vec () : + doc = hexablock.addDocument("prism_vec") + vtk = FileVtk (doc, "prism_vec"); + nr = 1 + na = 6 + nl = 1 + grid = make_grid (doc, nr, na, nl) + vtk.save () + + liste = [ ] + for nx in range (nr) : + for ny in range (na) : + cell = grid.getQuadIJ (nx, ny, nl) + print " ... cell = ", cell + liste.append (cell); + + axis = doc.addVector (1, 1, 1); + hauteurs = [1, 3, 7, 15] + + bloc = doc.prismQuadsVec (liste, axis, hauteurs, 0) + vtk.save () + return doc + +# ================================================================= Begin + +### doc = test_revolution () +### doc = test_prism () +doc = test_prism_vec () + +law = doc.addLaw("Uniform", 3) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc, "maillage:hexas") + diff --git a/src/TEST_PY/test_unit/test_asso_lines.py b/src/TEST_PY/test_unit/test_asso_lines.py new file mode 100644 index 0000000..c4b44bf --- /dev/null +++ b/src/TEST_PY/test_unit/test_asso_lines.py @@ -0,0 +1,185 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Association par lignes + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 +# +# . ed_nord1 ed_nord2 +# . v_nw v_n v_ne +# v9 v10 v11 +# 1 +----e18----+----e19----+ +# . | | | +# . | | | +# 0 ed_west e13 o e17 ed_est +# . | | | +# . | | | +# -1 +----e14----+----e16----+ +# . v6 v10 v8 +# . v_sw v_s v_se +# . ed_sud1 ed_sud2 +# . +# +..........-2...........0...........2............... + +global ed_west, ed_est, ed_nord1, ed_nord2, ed_sud1, ed_sud2 +global v_sw, v_s , v_se, v_nw, v_n , v_ne +global p_w, p_e, p_n, p_s, p_n1, p_n2, p_s1, p_s2, p_nw, p_sw, p_ne, p_se +global arc_s, arc_e, arc_n, arc_w, arc_n1, arc_n2, arc_s1, arc_s2 + + +# ======================================================= init_globale +def init_globale (name) : + + global ed_west, ed_est, ed_nord1, ed_nord2, ed_sud1, ed_sud2 + global v_sw, v_s , v_se, v_nw, v_n , v_ne + global p_w, p_e, p_n, p_s, p_n1, p_n2, p_s1, p_s2, p_nw, p_sw, p_ne, p_se + global arc_s, arc_e, arc_n, arc_w, arc_n1, arc_n2, arc_s1, arc_s2 + + nom = name + doc = hexablock.addDocument (nom) + + orig = doc.addVertex (-2, -1, -1) + vx = doc.addVector (2,0,0) + vy = doc.addVector (0,2,0) + vz = doc.addVector (0,0,2) + grid = doc.makeCartesian (orig, vx, vy, vz, 2, 1, 1) + + nz = 1 + vz = 1.0 + + ed_west = grid.getEdgeJ (0, 0, nz) + ed_est = grid.getEdgeJ (2, 0, nz) + ed_nord1 = grid.getEdgeI (0, 1, nz) + ed_nord2 = grid.getEdgeI (1, 1, nz) + ed_sud1 = grid.getEdgeI (0, 0, nz) + ed_sud2 = grid.getEdgeI (1, 0, nz) + + v_sw = grid.getVertexIJK (0, 0, nz) + v_s = grid.getVertexIJK (1, 0, nz) + v_se = grid.getVertexIJK (2, 0, nz) + + v_nw = grid.getVertexIJK (0, 1, nz) + v_n = grid.getVertexIJK (1, 1, nz) + v_ne = grid.getVertexIJK (2, 1, nz) + + doc.saveVtk (nom + ".vtk"); + ## ______________________________________________________________ Geom + + p_w = geompy.MakeVertex (-2.55, 0, vz) + p_e = geompy.MakeVertex ( 2.55, 0, vz) + p_n = geompy.MakeVertex ( 0, 2.0, vz) + p_s = geompy.MakeVertex ( 0, -2.0, vz) + + p_n1 = geompy.MakeVertex ( 0.5, 2.0, vz) + p_n2 = geompy.MakeVertex (-0.5, 2.0, vz) + p_s1 = geompy.MakeVertex (-0.5, -2.0, vz) + p_s2 = geompy.MakeVertex ( 0.5, -2.0, vz) + + p_nw = geompy.MakeVertex (-2, 1, vz) + p_sw = geompy.MakeVertex (-2, -1, vz) + p_ne = geompy.MakeVertex ( 2, 1, vz) + p_se = geompy.MakeVertex ( 2, -1, vz) + + arc_s = geompy.MakeArc (p_sw, p_s, p_se) + arc_e = geompy.MakeArc (p_se, p_e, p_ne) + arc_n = geompy.MakeArc (p_ne, p_n, p_nw) + arc_w = geompy.MakeArc (p_nw, p_w, p_sw) + + arc_n1 = geompy.MakeArc (p_ne, p_n1, p_n) + arc_n2 = geompy.MakeArc (p_n, p_n2, p_nw) + arc_s1 = geompy.MakeArc (p_sw, p_s1, p_s) + arc_s2 = geompy.MakeArc (p_s, p_s2, p_se) + + return doc + +# ======================================================= test_asso_mano +def test_asso_mano () : + + doc = init_globale ("asso_mano") + + ed_west.addAssociation (arc_w, 0, 1) + ed_est .addAssociation (arc_e, 0, 1) + + v_n.setAssociation (p_n) + ed_nord2.addAssociation (arc_n1, 0.0, 1.0) + ed_nord1.addAssociation (arc_n2, 0.0, 1.0) + + v_s.setAssociation (p_s) + ## ed_sud1.addAssociation (arc_s, 0.0, 0.5) + ## ed_sud2.addAssociation (arc_s, 0.5, 1.0) + + ed_sud1.addAssociation (arc_s1, 0.0, 1.0) + ed_sud2.addAssociation (arc_s2, 0.0, 1.0) + + return doc + +# ======================================================= test_asso_closed +def test_asso_closed () : + + doc = init_globale ("asso_closed") + + les_edges = [ ed_sud1, ed_sud2, ed_est, ed_nord1, ed_nord2, ed_west ] + les_arcs = [ arc_s1, arc_s2, arc_e, arc_n1, arc_n2, arc_w ] + + doc.associateClosedLine (v_sw, les_edges[0], les_edges[1:], + les_arcs [0], 0.0, False, les_arcs[1:]) + return doc + +# ======================================================= test_asso_closed_inv +def test_asso_closed_inv () : + + doc = init_globale ("asso_closed_inv") + + les_edges = [ ed_sud1, ed_sud2, ed_est, ed_nord1, ed_nord2, ed_west ] + les_arcs = [ arc_s1, arc_s2, arc_e, arc_n1, arc_n2, arc_w ] + + doc.associateClosedLine (v_s , les_edges[0], les_edges[1:], + les_arcs [0], 1.0, True, les_arcs[1:]) + return doc + +# ======================================================= test_asso_opened +def test_asso_opened () : + + doc = init_globale ("asso_opened") + + les_edges = [ ed_sud2, ed_est, ed_nord2 ] + les_arcs = [ arc_s, arc_e, arc_n ] + + doc.associateOpenedLine (les_edges[0], les_edges[1:], + les_arcs [0], 0.5, les_arcs[1:], 0.5) + return doc + +# ================================================================= Begin + +doc = test_asso_closed_inv () + +law = doc.addLaw("Uniform", 3) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh (doc) + + diff --git a/src/TEST_PY/test_unit/test_bugs.py b/src/TEST_PY/test_unit/test_bugs.py new file mode 100644 index 0000000..4d93705 --- /dev/null +++ b/src/TEST_PY/test_unit/test_bugs.py @@ -0,0 +1,128 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 + + +# ======================================================= bug_quad2 +def bug_quad2 () : + + doc = hexablock.addDocument ("default") + + ori = doc.addVertex ( 0, 0, 0) + vz = doc.addVector ( 0, 0, 1) + vx = doc.addVector ( 1 ,0, 0) + + dr = 1; + dl = 1; + phi = 360; + nr = 1; + na = 8; + nl = 1; + + c1 = doc.makeCylindrical (ori, vx,vz,dr, phi,dl, nr,na,nl, False); + nvtk = 0; + nom = "bugs_hexas"; + doc.saveVtk ("bugs_hexa_ab1.vtk") + + qa = c1.getQuadJK (0, 0, 0); + qb = c1.getQuadJK (0, 4, 0); + hexa = doc.addHexa2Quads (qa, qb); + + + doc.setFile (nom); + doc.saveFile (); + doc.saveVtk ("bugs_hexa_ab2.vtk") + return doc + +# ======================================================= bug_quad3 +def bug_quad3 () : + + doc = hexablock.addDocument("quad3") + + ori = doc.addVertex ( 0, 0, 0) + vz = doc.addVector ( 0, 0, 1) + vx = doc.addVector ( 1 ,0, 0) + + dr = 1; + dl = 1; + phi = 360; + nr = 1; + na = 8; + nl = 1; + + c1 = doc.makeCylindrical (ori, vx,vz,dr, phi,dl, nr,na,nl, False); + nvtk = 0; + nom = "bugs_hexas"; + doc.saveVtk ("bugs_hexa_acd1.vtk") + + qc = c1.getQuadJK (0, 0, 0); + qa = c1.getQuadJK (0, 1, 0); + qd = c1.getQuadJK (0, 2, 0); + + hexa = doc.addHexa3Quads (qa, qc, qd); + + + doc.setFile (nom); + doc.saveFile (); + doc.saveVtk ("bugs_hexa_acd2.vtk") + return doc + + +# ======================================================= bug_quad3 +def bug_quad1 () : + + doc = hexablock.addDocument("quad1") + centre = doc.addVertex(0, 0, 0) + vecteur_px = doc.addVector(1, 0, 0) + vecteur_pz = doc.addVector(0, 0, 1) + + grille = doc.makeCylindrical(centre, vecteur_px, vecteur_pz, 1, 360, 1, 3, 8, 1, False) + + quad_1 = grille.getQuadIK(0, 1, 0) + quad_5 = grille.getQuadIK(0, 5, 0) + + quad_1 = grille.getQuadJK(0, 1, 0) + quad_5 = grille.getQuadJK(0, 4, 0) + quad_1.setScalar (5) + + doc.saveVtk ("bugs_hexa_ab1.vtk") + doc.addHexa2Quads(quad_1, quad_5) + doc.saveVtk ("bugs_hexa_ab2.vtk") + + return doc + +# ================================================================= Begin + +doc = bug_quad1 () + +law = doc.addLaw("Uniform", 4) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc, "maillage:hexas") diff --git a/src/TEST_PY/test_unit/test_carre.py b/src/TEST_PY/test_unit/test_carre.py new file mode 100644 index 0000000..e28a256 --- /dev/null +++ b/src/TEST_PY/test_unit/test_carre.py @@ -0,0 +1,68 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 + + +# ======================================================= test_croix +def test_croix () : + + nom = "test_croix" + doc = hexablock.addDocument(nom) + doc.setLevel (1) + nvtk = 0 + + ori = doc.addVertex ( 0, 0, 0) + vz = doc.addVector ( 0, 0, 1) + vx = doc.addVector ( 1 ,0, 0) + + dr = 1.0 + angle = 360.0 + dl = 1.0 + + nr = 1 + na = 4 + nl = 5 + fill = True + + grid = doc.makeCylindrical (ori, vx, vz, dr, angle, dl, nr, na, nl, fill) + + doc.saveVtk ("carre.vtk") + return doc + +# ================================================================= Begin + +doc = test_croix () +### doc = test_pipes () + +law = doc.addLaw("Uniform", 4) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc) +muv, mue, muq, muh = hexablock.dump(doc, mesh_hexas) diff --git a/src/TEST_PY/test_unit/test_cross.py b/src/TEST_PY/test_unit/test_cross.py new file mode 100644 index 0000000..05b2e28 --- /dev/null +++ b/src/TEST_PY/test_unit/test_cross.py @@ -0,0 +1,89 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 + + +# ======================================================= test_pipes +def test_pipes () : + + doc = hexablock.addDocument ("default") + + ori1 = doc.addVertex ( 0, 0, 0) + ori2 = doc.addVertex (-5, 0, 5) + vz = doc.addVector ( 0, 0, 1) + vx = doc.addVector ( 1 ,0, 0) + + nr1 = 2 + ni1 = 1 + nl1 = 10 + nr2 = 1 + ni2 = 0.5 + nl2 = 10 + + pipe1 = doc.addPipe (ori1, vz, ni1, nr1, nl1) + pipe2 = doc.addPipe (ori2, vx, ni2, nr2, nl2) + grid = doc.makePipes (pipe1, pipe2) + + doc.saveVtk ("pipes.vtk") + return doc + + +# ======================================================= test_croix +def test_croix () : + + doc = hexablock.addDocument ("default") + + ori1 = doc.addVertex ( 0, 0, 0) + ori2 = doc.addVertex (-5, 0, 5) + vz = doc.addVector ( 0, 0, 1) + vx = doc.addVector ( 1 ,0, 0) + + nr1 = 2 + nl1 = 10 + nr2 = 1 + nl2 = 10 + + cyl1 = doc.addCylinder (ori1, vz, nr1, nl1) + cyl2 = doc.addCylinder (ori2, vx, nr2, nl2) + grid = doc.makeCylinders (cyl1, cyl2) + ### grid = doc.makePipes (cyl1, cyl2) + + doc.saveVtk ("croix.vtk") + return doc + +# ================================================================= Begin + +doc = test_pipes () + +law = doc.addLaw("Uniform", 4) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc, "maillage:hexas") + diff --git a/src/TEST_PY/test_unit/test_cuve.py b/src/TEST_PY/test_unit/test_cuve.py new file mode 100644 index 0000000..16f2f68 --- /dev/null +++ b/src/TEST_PY/test_unit/test_cuve.py @@ -0,0 +1,71 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + + +# Francis KLOSS - 2011-2012 - CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France +# ============================================================================================= + +import hexablock + +doc = hexablock.addDocument("cuve") + +# Construire la grille cylindrique +# -------------------------------- + +centre = doc.addVertex(0, 0, 0) + +vecteur_px = doc.addVector(1, 0, 0) +vecteur_pz = doc.addVector(0, 0, 1) + +grille = doc.makeCylindrical(centre, vecteur_px, vecteur_pz, 1, 360, 1, 3, 8, 1, False) + +# Ajouter le centre +# ----------------- + +quad_0 = grille.getQuadJK(0, 0, 0) +quad_6 = grille.getQuadJK(0, 6, 0) +quad_7 = grille.getQuadJK(0, 7, 0) + +hexa_a = doc.addHexa3Quads(quad_0, quad_6, quad_7) + +quad_2 = grille.getQuadJK(0, 2, 0) +quad_3 = grille.getQuadJK(0, 3, 0) +quad_4 = grille.getQuadJK(0, 4, 0) + +hexa_b = doc.addHexa3Quads(quad_2, quad_3, quad_4) + +quad_1 = grille.getQuadJK(0, 1, 0) +quad_5 = grille.getQuadJK(0, 5, 0) + +quad_a = hexa_a.getQuad(1) +quad_b = hexa_b.getQuad(1) + +hexa_c = doc.addHexa4Quads(quad_1, quad_a, quad_5, quad_b) + + +law = doc.addLaw("Uniform", 3) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh (doc) + + diff --git a/src/TEST_PY/test_unit/test_cylinders.py b/src/TEST_PY/test_unit/test_cylinders.py new file mode 100644 index 0000000..ef33272 --- /dev/null +++ b/src/TEST_PY/test_unit/test_cylinders.py @@ -0,0 +1,69 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 + + +# ======================================================= test_cylindricals +def test_cylindricals () : + + doc = hexablock.addDocument ("rind:hexas") + + orig = doc.addVertex (0, 0, 0) + vz = doc.addVector (0, 0, 1) + vx = doc.addVector (1 ,0, 0) + + + tdr = [ 1, 2, 0.5 ] + tda = [ 30, 30, 30, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 30, 30, 30, 10, 10, 10, 10, 10, 10, 10, 10, 10 ] + tdl = [ 1, 2, 3 ] + + tdr = [ 1, 1, 1, 1 ] + tda = [ 45, 45, 45, 45, 45, 45, 45, 45 ] + tdl = [ 1, 1, 1 ] + + + c1 = doc.makeCylindricals (orig, vx,vz, tdr, tda, tdl, False) + ## c1 = doc.makeCylindrical (orig, vx,vz, 1.0, 360.0, 1.0, 3, 8, 3, False) + + + doc.saveVtk ("cylindricals.vtk") + return doc + +# ================================================================= Begin + +doc = test_cylindricals () + +law = doc.addLaw("Uniform", 4) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc) + + diff --git a/src/TEST_PY/test_unit/test_disco.py b/src/TEST_PY/test_unit/test_disco.py new file mode 100644 index 0000000..0d53e73 --- /dev/null +++ b/src/TEST_PY/test_unit/test_disco.py @@ -0,0 +1,68 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 + +# ======================================================= test_disco_edges +def test_disco_edges () : + + nom = "test_disco_edges" + doc = hexablock.addDocument(nom) + doc.setLevel (0) + + ori = doc.addVertex ( 0, 0, 0) + vz = doc.addVector ( 0, 0, 1) + vy = doc.addVector ( 0, 1, 1) + vx = doc.addVector ( 1 ,0, 0) + + size_x = 2 + size_y = 2 + size_z = 5 + + grid = doc.makeCartesian (ori, vx, vy, vz, size_x, size_y, size_z) + + t_hexas = [] + t_edges = [] + + for nk in range (size_z) : + t_hexas.append (grid.getHexaIJK (1,1,nk)) + t_edges.append (grid.getEdgeK (1,2,nk)) + + disco_edges = doc.disconnectEdges (t_hexas, t_edges) + return doc + +# ================================================================= Begin + +doc = test_disco_edges () + +law = doc.addLaw("Uniform", 4) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc) +muv, mue, muq, muh = hexablock.dump(doc, mesh_hexas) diff --git a/src/TEST_PY/test_unit/test_double_t.py b/src/TEST_PY/test_unit/test_double_t.py new file mode 100644 index 0000000..d02fca6 --- /dev/null +++ b/src/TEST_PY/test_unit/test_double_t.py @@ -0,0 +1,166 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 + + +# ======================================================= test_double_t +def test_double_t () : + + doc = hexablock.addDocument ("default") + + ori1 = doc.addVertex ( 0, 0, 0) + ori2 = doc.addVertex (-5, 0, 5) + ori3 = doc.addVertex ( 0, 0, 12) + ori4 = doc.addVertex (-5, 0, 17) + + vx = doc.addVector ( 1 ,0, 0) + vz = doc.addVector ( 0, 0, 1) + + nl1 = 10 + nl2 = 10 + + rsmall = 1 + rmoy = 2 + rbig = 3 + + cyl1 = doc.addCylinder (ori1, vz, rbig, nl1) + cyl2 = doc.addCylinder (ori2, vx, rmoy, nl2) + + cyl3 = doc.addCylinder (ori3, vz, rbig, nl1) + cyl4 = doc.addCylinder (ori4, vx, rmoy, nl2) + + grid1 = doc.makeCylinders (cyl1, cyl2) + grid2 = doc.makeCylinders (cyl4, cyl3) + + nx_int = 0 + nx_ext = 1 + cyl_big = 1 + cyl_small = 0 + S_E = 0 + S_NE = 1 + S_N = 2 + S_NW = 3 + S_MAXI = 8 + ## Cyl i j k + qb = grid1. getQuadIJ (cyl_big, nx_ext, S_E, 4) + qh = grid2. getQuadIJ (cyl_big, nx_ext, S_E, 0) + + vb0 = grid1.getVertexIJK (cyl_big, 2, S_E, 4) ## cible + vb1 = grid1.getVertexIJK (cyl_big, 2, S_NE, 4) + vh0 = grid2.getVertexIJK (cyl_big, 2, S_E, 0) ## depart + vh1 = grid2.getVertexIJK (cyl_big, 2, S_NE, 0) + + hliste = [] + + hliste.append (qh) + for ny in range (S_MAXI) : + if ny != S_E : + hliste.append (grid2.getQuadIJ (cyl_big, nx_ext, ny, 0)) + + for ny in range (4) : + hliste.append (grid2.getQuadIJ (cyl_big, nx_int, ny, 0)) + + hauteur = 3 + doc.joinQuads (hliste, qb, vh0, vb0, vh1, vb1, hauteur) + + doc.saveVtk ("double_t.vtk") + return doc + +# ======================================================= test_lorraine +def test_lorraine () : + + doc = hexablock.addDocument ("default") + + ori1 = doc.addVertex ( 0, 0, 0) + ori2 = doc.addVertex (-5, 0, 5) + ori3 = doc.addVertex ( 0, 0, 12) + ori4 = doc.addVertex (-5, 0, 17) + + vx = doc.addVector ( 1 ,0, 0) + vz = doc.addVector ( 0, 0, 1) + + nl1 = 10 + nl2 = 10 + + rsmall = 1 + rmoy = 3 + rbig = 5 + + cyl1 = doc.addCylinder (ori1, vz, rmoy, nl1) + cyl2 = doc.addCylinder (ori2, vx, rsmall, nl2) + + cyl3 = doc.addCylinder (ori3, vz, rmoy, nl1) + cyl4 = doc.addCylinder (ori4, vx, rbig, nl2) + + grid1 = doc.makeCylinders (cyl1, cyl2) + grid2 = doc.makeCylinders (cyl4, cyl3) + + nx_int = 0 + nx_ext = 1 + cyl_big = 1 + cyl_small = 0 + S_E = 0 + S_NE = 1 + S_N = 2 + S_NW = 3 + S_MAXI = 8 + ## Cyl i j k + qb = grid1. getQuadIJ (cyl_big, nx_ext, S_E, 4) + qh = grid2. getQuadIJ (cyl_small, nx_ext, S_N, 0) + + vb0 = grid1.getVertexIJK (cyl_big, 2, S_E, 4) ## cible + vb1 = grid1.getVertexIJK (cyl_big, 2, S_NE, 4) + vh0 = grid2.getVertexIJK (cyl_small, 2, S_N, 0) ## depart + vh1 = grid2.getVertexIJK (cyl_small, 2, S_NW, 0) + + hliste = [] + + hliste.append (qh) + for ny in range (S_MAXI) : + if ny != S_N : + hliste.append (grid2.getQuadIJ (cyl_small, nx_ext, ny, 0)) + + for ny in range (4) : + hliste.append (grid2.getQuadIJ (cyl_small, nx_int, ny, 0)) + + hauteur = 3 + doc.joinQuads (hliste, qb, vh0, vb0, vh1, vb1, hauteur) + + doc.saveVtk ("lorraine.vtk") + return doc + +# ================================================================= Begin + +doc = test_lorraine () + +law = doc.addLaw("Uniform", 4) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc, "maillage:hexas") diff --git a/src/TEST_PY/test_unit/test_piquage.py b/src/TEST_PY/test_unit/test_piquage.py new file mode 100644 index 0000000..30ecee3 --- /dev/null +++ b/src/TEST_PY/test_unit/test_piquage.py @@ -0,0 +1,99 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 + + +# ======================================================= test_pipes +def test_piquage () : + + doc = hexablock.addDocument ("default") + + orig = doc.addVertex ( 0, 0, 0) + vx = doc.addVector ( 1 ,0, 0) + vy = doc.addVector ( 0, 1, 0) + vz = doc.addVector ( 0, 0, 1) + + size_x = 3 + size_y = 3 + size_z = 3 + + grid = doc.makeCartesian (orig, vx, vy, vz, size_x, size_y, size_z) + + c1 = grid.getVertexIJK (1, 2, size_z) + c2 = grid.getVertexIJK (1, 1, size_z) + c3 = grid.getVertexIJK (2, 1, size_z) + + pa1 = doc.addVertex (-1, -1, 0) + pb1 = doc.addVertex ( 1, -1, 0) + pc1 = doc.addVertex ( 1, 1, 0) + pd1 = doc.addVertex (-1, 1, 0) + + pa2 = doc.addVertex (-2, -2, 0) + pb2 = doc.addVertex ( 2, -2, 0) + pc2 = doc.addVertex ( 2, 2, 0) + pd2 = doc.addVertex (-2, 2, 0) + + edab1 = doc.addEdge (pa1, pb1) + edbc1 = doc.addEdge (pb1, pc1) + edcd1 = doc.addEdge (pc1, pd1) + edda1 = doc.addEdge (pd1, pa1) + + edab2 = doc.addEdge (pa2, pb2) + edbc2 = doc.addEdge (pb2, pc2) + edcd2 = doc.addEdge (pc2, pd2) + edda2 = doc.addEdge (pd2, pa2) + + edaa = doc.addEdge (pa1, pa2) + edbb = doc.addEdge (pb1, pb2) + edcc = doc.addEdge (pc1, pc2) + eddd = doc.addEdge (pd1, pd2) + + qpattern = [] + qpattern.append (doc.addQuad (edab1, edbc1, edcd1, edda1)) + qpattern.append (doc.addQuad (edab1, edbb, edab2, edaa)) + qpattern.append (doc.addQuad (edbc1, edcc, edbc2, edbb)) + qpattern.append (doc.addQuad (edcd1, eddd, edcd2, edcc)) + qpattern.append (doc.addQuad (edda1, edaa, edda2, eddd)) + + doc.saveVtk ("replace0.vtk") + + doc.replace (qpattern, pd2,c1, pa2,c2, pb2,c3) + + doc.saveVtk ("replace1.vtk") + return doc + +# ================================================================= Begin + +doc = test_piquage () + +law = doc.addLaw("Uniform", 0) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc, "maillage:hexas") diff --git a/src/TEST_PY/test_unit/test_rind.py b/src/TEST_PY/test_unit/test_rind.py new file mode 100644 index 0000000..4f656ed --- /dev/null +++ b/src/TEST_PY/test_unit/test_rind.py @@ -0,0 +1,126 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 + + +# ======================================================= test_sphere +def test_sphere () : + + doc = hexablock.addDocument ("default") + + center = doc.addVertex (0,0,0) + radius = 8 + orig = doc.addVertex (0,0,0) + vz = doc.addVector (0,0,1) + vx = doc.addVector (1,0,0) + radhole = 1 + nrad = 3 + nang = 16 + nhaut = 8 + + doc.makeSphere (center, vx, vz, radius, radhole, orig, nrad, nang, nhaut) + doc.saveVtk ("Rind1.vtk") + return doc + +# ======================================================= test_part_sphere +def test_part_sphere () : + + doc = hexablock.addDocument ("default") + + center = doc.addVertex (0,0,0) + radius = 8 + orig = doc.addVertex (0,0,-4) + vz = doc.addVector (0,0,1) + vx = doc.addVector (1,0,0) + angle = 90 + radhole = 1 + nrad = 3 + nang = 4 + nhaut = 8 + + doc.makePartSphere (center, vx, vz, radius, radhole, orig, angle, + nrad, nang, nhaut) + doc.saveVtk ("Rind2.vtk") + return doc + +# ======================================================= test_rind +def test_rind () : + + doc = hexablock.addDocument ("default") + + center = doc.addVertex (0,0,0) + radius = 8 + radint = 7 + orig = doc.addVertex (0,0,0) + vz = doc.addVector (0,0,1) + vx = doc.addVector (1,0,0) + radhole = 1 + nrad = 3 + nang = 16 + nhaut = 8 + + doc.makeRind (center, vx, vz, radius, radint, radhole, orig, + nrad, nang, nhaut) + doc.saveVtk ("Rind3.vtk") + return doc + +# ======================================================= test_part_rind +def test_part_rind () : + + doc = hexablock.addDocument ("default") + + center = doc.addVertex (0,0,0) + radius = 8 + radint = 7 + orig = doc.addVertex (0,0,0) + vz = doc.addVector (0,0,1) + vx = doc.addVector (1,0,0) + angle = 90 + radhole = 1 + nrad = 3 + nang = 14 + nhaut = 8 + + doc.makePartRind (center, vx, vz, radius, radint, radhole, orig, angle, + nrad, nang, nhaut) + doc.saveVtk ("Rind4.vtk") + return doc + +# ================================================================= Begin + +##test_sphere () +##test_part_sphere () +doc = test_part_rind () +##test_rind () + +law = doc.addLaw("Uniform", 4) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc, "rind:hexas") diff --git a/src/TEST_PY/test_unit/test_sphere.py b/src/TEST_PY/test_unit/test_sphere.py new file mode 100644 index 0000000..8bbd723 --- /dev/null +++ b/src/TEST_PY/test_unit/test_sphere.py @@ -0,0 +1,56 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 + + +# ======================================================= test_sphere +def test_sphere () : + + doc = hexablock.addDocument ("rind") + + center = doc.addVertex (0,0,0) + radius = 1 + ncouches = 1 + k = 1 + + doc.makeSpherical (center, radius, ncouches, k) + doc.saveVtk ("Sphere.vtk") + return doc + +# ================================================================= Begin + +doc = test_sphere () + +law = doc.addLaw("Uniform", 4) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc) + + diff --git a/src/TEST_PY/test_unit/test_transfo.py b/src/TEST_PY/test_unit/test_transfo.py new file mode 100644 index 0000000..a67b9d8 --- /dev/null +++ b/src/TEST_PY/test_unit/test_transfo.py @@ -0,0 +1,125 @@ +# -*- coding: latin-1 -*- +# Copyright (C) 2009-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Hexa : Creation d'hexaedres + +import hexablock +import os +import geompy + +#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 + + +# ======================================================= make_grid +def make_grid (doc) : + + ori = doc.addVertex ( 0, 0, 0) + vz = doc.addVector ( 0, 0, 1) + vx = doc.addVector ( 1 ,0, 0) + + dr = 1 + da = 360 + dl = 1 + + nr = 1 + na = 6 + nl = 1 + grid = doc.makeCylindrical (ori, vx,vz, dr,da,dl, nr,na,nl, False) + doc .saveVtk ("transfo1.vtk") + return grid + +# ======================================================= test_translation +def test_translation () : + + doc = hexablock.addDocument ("default") + grid = make_grid (doc) + + devant = doc.addVector (10, 0, 0) + grid2 = doc.makeTranslation (grid, devant) + + doc .saveVtk ("transfo2.vtk") + return doc + +# ======================================================= test_scale +def test_scale () : + + doc = hexablock.addDocument ("default") + grid = make_grid (doc) + + dest = doc.addVertex (15, 0, 0) + grid2 = doc.makeScale (grid, dest, 0.5) + + doc .saveVtk ("transfo3.vtk") + return doc + +# ======================================================= test_sym_point +def test_sym_point () : + + doc = hexablock.addDocument ("default") + grid = make_grid (doc) + + orig = doc.addVertex (5, 0, 0) + grid2 = doc.makeSymmetryPoint (grid, orig) + + doc .saveVtk ("transfo4.vtk") + return doc + +# ======================================================= test_sym_line +def test_sym_line () : + + doc = hexablock.addDocument ("default") + grid = make_grid (doc) + + orig = doc.addVertex (5, 0, 0) + dir = doc.addVector (0, 0, 1); + grid2 = doc.makeSymmetryLine (grid, orig, dir) + + doc .saveVtk ("transfo5.vtk") + return doc + +# ======================================================= test_sym_plan +def test_sym_plan () : + + doc = hexablock.addDocument ("default") + grid = make_grid (doc) + + orig = doc.addVertex (5, 0, 0) + dir = doc.addVector (1, 0, 0); + grid2 = doc.makeSymmetryPlane (grid, orig, dir) + + doc .saveVtk ("transfo6.vtk") + return doc + +# ================================================================= Begin + +### doc = test_translation () +doc = test_scale () +### doc = test_sym_point () +### doc = test_sym_line () +### doc = test_sym_plan () + +law = doc.addLaw("Uniform", 4) + +for j in range(doc.countPropagation()): + propa = doc.getPropagation(j) + propa.setLaw(law) + +mesh_hexas = hexablock.mesh(doc, "maillage:hexas") + diff --git a/src/TEST_PY/tuyau.brep b/src/TEST_PY/tuyau.brep new file mode 100755 index 0000000..ec768b0 --- /dev/null +++ b/src/TEST_PY/tuyau.brep @@ -0,0 +1,426 @@ +DBRep_DrawableShape + +CASCADE Topology V1, (c) Matra-Datavision +Locations 0 +Curve2ds 28 +1 0 0 0 1 +1 0 0 0 1 +1 0 0 1 0 +3 5.0000000000000009 0 -1 -0 -0 1 5 2 +1 3.1415926535897931 0 0 1 +1 3.1415926535897931 0 0 1 +1 0 1 1 0 +2 0 -4.5 -6.123233995736766e-17 1 1 6.123233995736766e-17 4.5 +3 5.0000000000000009 0 -1 -0 -0 1 5 2 +2 0 -4.5 -6.123233995736766e-17 1 1 6.123233995736766e-17 4.5 +1 0 0 1 0 +1 0 0 1 0 +1 0 0 1 0 +3 5.0000000000000009 0 -1 -0 -0 1 4 1.6000000000000001 +1 10.000000000000002 2.4492935982947064e-16 -1 -4.8985871965894112e-17 +1 10.000000000000002 2.4492935982947064e-16 -1 -4.8985871965894112e-17 +1 0 0 0 1 +1 0 0 0 1 +1 3.1415926535897931 0 0 1 +1 3.1415926535897931 0 0 1 +1 0 1 1 0 +2 0 -4.5 -6.123233995736766e-17 1 1 6.123233995736766e-17 3.6000000000000001 +3 5.0000000000000009 0 -1 -0 -0 1 4 1.6000000000000001 +2 0 -4.5 -6.123233995736766e-17 1 1 6.123233995736766e-17 3.6000000000000001 +1 0 -0 6.1232339957367759e-17 -1 +1 0 -0 6.1232339957367759e-17 -1 +1 1.1021821192326179e-15 -9 -1.8369701987210317e-16 1 +1 1.1021821192326179e-15 -9 -1.8369701987210317e-16 1 +Curves 16 +7 1 0 7 8 2 3.5355339059327386 -3.5355339059327386 4.4408920985006262e-16 1 9.6048855423786907 5.6779402750195374 -5.742238377723344e-16 0.99999999999999989 18.214762018199355 14.344823330601708 -3.1843740466902976e-15 1.0000000000000058 31.904943295729403 14.237869646355081 1.2028108957336017e-14 0.99999999999998868 37.172160522651843 17.64988141136174 -8.7773709183773399e-15 1.0000000000000071 52.812746249130484 14.81612372870539 2.3298725788871153e-15 0.99999999999999833 63.447227270624914 15.5 0 1 75 15.5 0 1 + 0 8 1 8 +7 0 0 10 11 2 3.5355339059327386 -3.5355339059327386 4.4408920985006262e-16 3.5355339059328195 -3.5355339059328195 -0.62831853071801369 3.1478202812511471 -3.1478202812511471 -1.2566370068591419 2.3723834259365431 -2.3723834259365431 -1.7988274783398068 1.2775986014269276 -1.2775986014269276 -2.1687580291315651 1.1719514247943195e-12 -1.1719514247943195e-12 -2.3005529012372383 -1.2775986014289811 1.2775986014289811 -2.1687580291316819 -2.3723834259351833 2.3723834259351833 -1.7988274783396521 -3.1478202812517777 3.1478202812517777 -1.256637006859245 -3.5355339059326556 3.5355339059326556 -0.62831853071798205 -3.5355339059327386 3.5355339059327386 2.2204460492503131e-16 + 0 11 3.1415926535897931 11 +7 1 0 7 8 2 -3.5355339059327386 3.5355339059327386 2.2204460492503131e-16 1 3.5505706064268643 12.92839695201633 -1.5975347728255742e-15 0.99999999999999989 14.233536249242547 23.186298181990903 -5.559004606855246e-15 1.0000000000000058 28.117657554132329 15.130373948082415 1.4762487599297348e-14 0.99999999999998868 41.978695964977959 33.453377516518131 -1.3515968997086305e-14 1.0000000000000071 51.368462505527539 21.938158843438853 1.6901778625232096e-15 0.99999999999999833 63.447227270624914 24.500000000000004 -1.5086264655892687e-15 1 75.000000000000014 24.5 -1.5086264655892687e-15 1 + 0 8 1 8 +7 0 0 10 11 2 75 15.5 0 74.999999999999105 15.49999999999994 -1.4137166941154202 75.000000000003425 15.993478879707238 -2.8274332654334842 74.999999999990621 16.98044886550209 -4.0473618262637086 75.000000000018389 18.373882457535071 -4.8797055655472787 74.999999999974861 19.999999999996184 -5.1762440277824107 75.00000000002386 21.626117542471153 -4.879705565547396 74.999999999984084 23.019551134494474 -4.047361826263554 75.000000000007219 24.006521120294067 -2.8274332654335823 74.999999999998124 24.499999999999748 -1.4137166941153954 75.000000000000014 24.5 -1.5086264655892687e-15 + 0 11 3.1415926535897931 11 +7 0 0 10 11 2 3.5355339059327386 -3.5355339059327386 -4.4408920985006262e-16 3.5355339059328195 -3.5355339059328195 0.62831853071801369 3.1478202812511471 -3.1478202812511471 1.2566370068591419 2.3723834259365431 -2.3723834259365431 1.7988274783398068 1.2775986014269276 -1.2775986014269276 2.1687580291315651 1.1719514247943195e-12 -1.1719514247943195e-12 2.3005529012372383 -1.2775986014289811 1.2775986014289811 2.1687580291316819 -2.3723834259351833 2.3723834259351833 1.7988274783396521 -3.1478202812517777 3.1478202812517777 1.256637006859245 -3.5355339059326556 3.5355339059326556 0.62831853071798205 -3.5355339059327386 3.5355339059327386 -2.2204460492503131e-16 + 0 11 3.1415926535897931 11 +7 0 0 10 11 2 75 15.5 0 74.999999999999105 15.49999999999994 1.4137166941154202 75.000000000003425 15.993478879707238 2.8274332654334842 74.999999999990621 16.98044886550209 4.0473618262637086 75.000000000018389 18.373882457535071 4.8797055655472787 74.999999999974861 19.999999999996184 5.1762440277824107 75.00000000002386 21.626117542471153 4.879705565547396 74.999999999984084 23.019551134494474 4.047361826263554 75.000000000007219 24.006521120294067 2.8274332654335823 74.999999999998124 24.499999999999748 1.4137166941153954 75.000000000000014 24.5 1.5086264655892687e-15 + 0 11 3.1415926535897931 11 +1 3.5355339059327378 -3.5355339059327378 0 -0.70710678118654757 0.70710678118654757 0 +7 0 0 10 11 2 2.8284271247461912 -2.8284271247461912 4.4408920985006262e-16 2.8284271247462276 -2.8284271247462276 -0.50265482457439326 2.5182562250010312 -2.5182562250010312 -1.0053096054873778 1.8979067407489889 -1.8979067407489889 -1.4390619826717084 1.0220788811419279 -1.0220788811419279 -1.7350064233054643 4.6762593797211755e-13 -4.6762593797211755e-13 -1.8404423209895382 -1.0220788811427488 1.0220788811427488 -1.73500642330558 -1.8979067407484411 1.8979067407484411 -1.4390619826715594 -2.5182562250012874 2.5182562250012874 -1.0053096054874726 -2.8284271247461601 2.8284271247461601 -0.50265482457436672 -2.8284271247461903 2.8284271247461903 2.2204460492503131e-16 + 0 11 3.1415926535897931 11 +1 -3.5355339059327378 3.5355339059327378 -2.4492935982947064e-16 0.70710678118654757 -0.70710678118654757 4.8985871965894125e-17 +7 1 0 7 8 2 2.8284271247461912 -2.8284271247461912 4.4408920985006262e-16 1 9.0159805468327825 6.4281751612018496 2.0133058846416192e-16 1 17.777778499972118 15.165580394866463 -8.0236115873956118e-16 0.99999999999998979 31.571168515292573 14.409868988290894 5.8731757129539919e-15 1.0000000000000278 37.64839458161984 19.182925960538899 -3.5800583136374853e-15 0.99999999999997424 52.67616934408646 15.539676739546138 1.5172914623676952e-15 1.0000000000000095 63.449895514329839 16.399999999999999 4.4408920985006262e-16 1 75 16.399999999999999 4.4408920985006262e-16 1 + 0 8 1 8 +7 1 0 7 8 2 -2.8284271247461903 2.8284271247461903 2.2204460492503131e-16 1 4.1746945180469197 12.228938087750445 -4.3498515050138725e-16 1 14.587149100985133 22.237911020917949 -1.2111033831702273e-15 0.99999999999998979 28.549479609839526 15.123956971356947 2.3425383791132212e-15 1.0000000000000278 41.490579147983965 31.827861148346255 -1.0269151715707795e-15 0.99999999999997424 51.521030626222753 21.236230289860686 5.1873396212586411e-16 1.0000000000000095 63.449895514329832 23.600000000000001 2.141842990487521e-16 1 75.000000000000014 23.600000000000001 2.1418429904875208e-16 1 + 0 8 1 8 +7 0 0 10 11 2 75 16.399999999999999 4.4408920985006262e-16 74.999999999999105 16.399999999999604 -1.1309733552923305 75.000000000003425 16.79478310376723 -2.2619466123468186 74.999999999990621 17.584359092398095 -3.2378894610108695 75.000000000018389 18.699105966034271 -3.9037644524379904 74.999999999974861 19.999999999989107 -4.1409952222257402 75.00000000002386 21.300894033984143 -3.9037644524380775 74.999999999984084 22.415640907590802 -3.2378894610107412 75.000000000007219 23.205216896237388 -2.261946612346911 74.999999999998124 23.599999999999262 -1.1309733552923047 75.000000000000014 23.600000000000001 2.1418429904875208e-16 + 0 11 3.1415926535897931 11 +7 0 0 10 11 2 2.8284271247461912 -2.8284271247461912 -4.4408920985006262e-16 2.8284271247462276 -2.8284271247462276 0.50265482457439326 2.5182562250010312 -2.5182562250010312 1.0053096054873778 1.8979067407489889 -1.8979067407489889 1.4390619826717084 1.0220788811419279 -1.0220788811419279 1.7350064233054643 4.6762593797211755e-13 -4.6762593797211755e-13 1.8404423209895382 -1.0220788811427488 1.0220788811427488 1.73500642330558 -1.8979067407484411 1.8979067407484411 1.4390619826715594 -2.5182562250012874 2.5182562250012874 1.0053096054874726 -2.8284271247461601 2.8284271247461601 0.50265482457436672 -2.8284271247461903 2.8284271247461903 -2.2204460492503131e-16 + 0 11 3.1415926535897931 11 +7 0 0 10 11 2 75 16.399999999999999 -4.4408920985006262e-16 74.999999999999105 16.399999999999604 1.1309733552923305 75.000000000003425 16.79478310376723 2.2619466123468186 74.999999999990621 17.584359092398095 3.2378894610108695 75.000000000018389 18.699105966034271 3.9037644524379904 74.999999999974861 19.999999999989107 4.1409952222257402 75.00000000002386 21.300894033984143 3.9037644524380775 74.999999999984084 22.415640907590802 3.2378894610107412 75.000000000007219 23.205216896237388 2.261946612346911 74.999999999998124 23.599999999999262 1.1309733552923047 75.000000000000014 23.600000000000001 -2.1418429904875208e-16 + 0 11 3.1415926535897931 11 +1 75 15.5 2.7554552980815448e-16 0 1 -6.1232339957367759e-17 +1 75 24.5 -8.2663658942446333e-16 0 -1 1.8369701987210317e-16 +Polygon3D 0 +PolygonOnTriangulations 0 +Surfaces 8 +9 1 0 0 0 10 7 11 8 2 2 3.5355339059327386 -3.5355339059327386 4.4408920985006262e-16 1 9.6048855423786907 5.6779402750195374 -5.742238377723344e-16 0.99999999999999989 18.214762018199355 14.344823330601708 -3.1843740466902976e-15 1.0000000000000058 31.904943295729403 14.237869646355081 1.2028108957336017e-14 0.99999999999998868 37.172160522651843 17.64988141136174 -8.7773709183773399e-15 1.0000000000000071 52.812746249130484 14.81612372870539 2.3298725788871153e-15 0.99999999999999833 63.447227270624914 15.5 0 1 75 15.5 0 1 +3.5355339059328195 -3.5355339059328195 -0.62831853071801369 1 9.604885542379284 5.6779402750195667 -0.73164124169730604 0.99999999999999989 18.214762018200037 14.344823330601164 -1.0469888149911395 1.0000000000000058 31.904943295730241 14.237869646359984 -0.39948502431303995 0.99999999999998868 37.172160522650039 17.649881411357878 -2.4092611365725189 1.0000000000000071 52.812746249132488 14.816123728706323 -1.1284938924273324 0.99999999999999833 63.447227270625511 15.499999999999938 -1.4137166941154204 1 74.999999999999105 15.49999999999994 -1.4137166941154202 1 +3.1478202812511471 -3.1478202812511471 -1.2566370068591419 1 9.2729214810444986 6.0754899681670214 -1.463282419842884 0.99999999999999989 17.996467481271083 14.829610120007128 -2.0939775390394035 1.0000000000000058 31.697282681850869 14.286806537772526 -0.79897001392370559 0.99999999999998868 37.435707603251764 18.516402695092999 -4.8185220638754691 1.0000000000000071 52.733554746481623 15.206631940884614 -2.2569876868315566 0.99999999999999833 63.447227270622655 15.993478879707236 -2.8274332654334846 1 75.000000000003425 15.993478879707238 -2.8274332654334842 1 +2.3723834259365431 -2.3723834259365431 -1.7988274783398068 1 8.6089851336806884 6.8705992041127821 -2.0946324284719631 0.99999999999999989 17.559872998990649 15.799195709829741 -2.9974482015801436 1.0000000000000058 31.28195630911361 14.384681533173158 -1.1436948041305759 0.99999999999998868 37.962808294048074 20.249466731308765 -6.897528758237212 1.0000000000000071 52.575169779178417 15.987658040456525 -3.2307909501209608 0.99999999999999833 63.447227270628531 16.98044886550209 -4.0473618262637086 1 74.999999999990621 16.98044886550209 -4.0473618262637086 1 +1.2775986014269276 -1.2775986014269276 -2.1687580291315651 1 7.6716200438365361 7.9931580809223801 -2.5253955435015549 0.99999999999999989 16.943475918531011 17.168085494405027 -3.6138762234641644 1.0000000000000058 30.695586178585053 14.522864363617154 -1.3788967086524706 0.99999999999998868 38.706984732566291 22.696258103010518 -8.3160119887771682 1.0000000000000071 52.351557169731038 17.090333926265838 -3.8952061261517525 0.99999999999999833 63.447227270621916 18.373882457535071 -4.8797055655472787 1 75.000000000018389 18.373882457535071 -4.8797055655472787 1 +1.1719514247943195e-12 -1.1719514247943195e-12 -2.3005529012372383 1 6.5777280744114703 9.3031686135167266 -2.6788631863653043 0.99999999999999989 16.224149133738432 18.76556075628185 -3.8334905595379762 1.0000000000000058 30.011300424905656 14.684121797300168 -1.462691909845385 0.99999999999998868 39.575428243818408 25.551629463869848 -8.8213739156197359 1.0000000000000071 52.09060437734513 18.377141286086164 -4.1319168086379028 0.99999999999999833 63.447227270625667 19.999999999996184 -5.1762440277824107 1 74.999999999974861 19.999999999996184 -5.1762440277824107 1 +-1.2775986014289811 1.2775986014289811 -2.1687580291316819 1 5.4838361049540145 10.613179146115629 -2.5253955435017352 0.99999999999999989 15.504822348881138 20.363036018212849 -3.613876223464215 1.0000000000000058 29.327014671318086 14.845379230678686 -1.3788967086533002 0.99999999999998868 40.443871755058836 28.407000824990529 -8.3160119887766726 1.0000000000000071 51.829651584897462 19.663948645853612 -3.8952061261520572 0.99999999999999833 63.447227270625788 21.626117542471153 -4.879705565547396 1 75.00000000002386 21.626117542471153 -4.879705565547396 1 +-2.3723834259351833 2.3723834259351833 -1.7988274783396521 1 4.5464710151344043 11.735738022921637 -2.0946324284717539 0.99999999999999989 14.888425268470534 21.73192580274673 -2.9974482015801169 1.0000000000000058 28.740644540721632 14.983562061355201 -1.1436948041293928 0.99999999999998868 41.188048193587157 30.853792196494638 -6.8975287582379137 1.0000000000000071 51.606038975498372 20.766624531703982 -3.2307909501205487 0.99999999999999833 63.447227270623706 23.019551134494478 -4.047361826263554 1 74.999999999984084 23.019551134494474 -4.047361826263554 1 +-3.1478202812517777 3.1478202812517777 -1.256637006859245 1 3.8825346677568429 12.530847258869537 -1.4632824198430057 0.99999999999999989 14.451830786163059 22.701511392593083 -2.093977539039428 1.0000000000000058 28.32531816801977 15.081437056623322 -0.79897001392448364 0.99999999999998868 41.715148884378252 32.586856232821489 -4.8185220638750348 1.0000000000000071 51.447654008166793 21.547650631251887 -2.2569876868317986 0.99999999999999833 63.447227270625731 24.006521120294064 -2.8274332654335819 1 75.000000000007219 24.006521120294067 -2.8274332654335823 1 +-3.5355339059326556 3.5355339059326556 -0.62831853071798205 1 3.5505706064273257 12.928396952016087 -0.73164124169727363 0.99999999999999989 14.233536249244064 23.186298181990281 -1.0469888149911422 1.0000000000000058 28.117657554128364 15.130373948086152 -0.39948502431278238 0.99999999999998868 41.978695964980815 33.453377516515026 -2.4092611365726784 1.0000000000000071 51.368462505527397 21.938158843439282 -1.1284938924272563 0.99999999999999833 63.447227270624651 24.499999999999744 -1.4137166941153956 1 74.999999999998124 24.499999999999748 -1.4137166941153954 1 +-3.5355339059327386 3.5355339059327386 2.2204460492503131e-16 1 3.5505706064268643 12.92839695201633 -1.5975347728255742e-15 0.99999999999999989 14.233536249242547 23.186298181990903 -5.559004606855246e-15 1.0000000000000058 28.117657554132329 15.130373948082415 1.4762487599297348e-14 0.99999999999998868 41.978695964977959 33.453377516518131 -1.3515968997086305e-14 1.0000000000000071 51.368462505527539 21.938158843438853 1.6901778625232096e-15 0.99999999999999833 63.447227270624914 24.500000000000004 -1.5086264655892687e-15 1 75.000000000000014 24.5 -1.5086264655892687e-15 1 + +0 11 +3.1415926535897931 11 + +0 8 +1 8 + +9 1 0 0 0 10 7 11 8 2 2 3.5355339059327386 -3.5355339059327386 -4.4408920985006262e-16 1 9.6048855423786907 5.6779402750195374 5.742238377723344e-16 0.99999999999999989 18.214762018199355 14.344823330601708 3.1843740466902976e-15 1.0000000000000058 31.904943295729403 14.237869646355081 -1.2028108957336017e-14 0.99999999999998868 37.172160522651843 17.64988141136174 8.7773709183773399e-15 1.0000000000000071 52.812746249130484 14.81612372870539 -2.3298725788871153e-15 0.99999999999999833 63.447227270624914 15.5 0 1 75 15.5 0 1 +3.5355339059328195 -3.5355339059328195 0.62831853071801369 1 9.604885542379284 5.6779402750195667 0.73164124169730604 0.99999999999999989 18.214762018200037 14.344823330601164 1.0469888149911395 1.0000000000000058 31.904943295730241 14.237869646359984 0.39948502431303995 0.99999999999998868 37.172160522650039 17.649881411357878 2.4092611365725189 1.0000000000000071 52.812746249132488 14.816123728706323 1.1284938924273324 0.99999999999999833 63.447227270625511 15.499999999999938 1.4137166941154204 1 74.999999999999105 15.49999999999994 1.4137166941154202 1 +3.1478202812511471 -3.1478202812511471 1.2566370068591419 1 9.2729214810444986 6.0754899681670214 1.463282419842884 0.99999999999999989 17.996467481271083 14.829610120007128 2.0939775390394035 1.0000000000000058 31.697282681850869 14.286806537772526 0.79897001392370559 0.99999999999998868 37.435707603251764 18.516402695092999 4.8185220638754691 1.0000000000000071 52.733554746481623 15.206631940884614 2.2569876868315566 0.99999999999999833 63.447227270622655 15.993478879707236 2.8274332654334846 1 75.000000000003425 15.993478879707238 2.8274332654334842 1 +2.3723834259365431 -2.3723834259365431 1.7988274783398068 1 8.6089851336806884 6.8705992041127821 2.0946324284719631 0.99999999999999989 17.559872998990649 15.799195709829741 2.9974482015801436 1.0000000000000058 31.28195630911361 14.384681533173158 1.1436948041305759 0.99999999999998868 37.962808294048074 20.249466731308765 6.897528758237212 1.0000000000000071 52.575169779178417 15.987658040456525 3.2307909501209608 0.99999999999999833 63.447227270628531 16.98044886550209 4.0473618262637086 1 74.999999999990621 16.98044886550209 4.0473618262637086 1 +1.2775986014269276 -1.2775986014269276 2.1687580291315651 1 7.6716200438365361 7.9931580809223801 2.5253955435015549 0.99999999999999989 16.943475918531011 17.168085494405027 3.6138762234641644 1.0000000000000058 30.695586178585053 14.522864363617154 1.3788967086524706 0.99999999999998868 38.706984732566291 22.696258103010518 8.3160119887771682 1.0000000000000071 52.351557169731038 17.090333926265838 3.8952061261517525 0.99999999999999833 63.447227270621916 18.373882457535071 4.8797055655472787 1 75.000000000018389 18.373882457535071 4.8797055655472787 1 +1.1719514247943195e-12 -1.1719514247943195e-12 2.3005529012372383 1 6.5777280744114703 9.3031686135167266 2.6788631863653043 0.99999999999999989 16.224149133738432 18.76556075628185 3.8334905595379762 1.0000000000000058 30.011300424905656 14.684121797300168 1.462691909845385 0.99999999999998868 39.575428243818408 25.551629463869848 8.8213739156197359 1.0000000000000071 52.09060437734513 18.377141286086164 4.1319168086379028 0.99999999999999833 63.447227270625667 19.999999999996184 5.1762440277824107 1 74.999999999974861 19.999999999996184 5.1762440277824107 1 +-1.2775986014289811 1.2775986014289811 2.1687580291316819 1 5.4838361049540145 10.613179146115629 2.5253955435017352 0.99999999999999989 15.504822348881138 20.363036018212849 3.613876223464215 1.0000000000000058 29.327014671318086 14.845379230678686 1.3788967086533002 0.99999999999998868 40.443871755058836 28.407000824990529 8.3160119887766726 1.0000000000000071 51.829651584897462 19.663948645853612 3.8952061261520572 0.99999999999999833 63.447227270625788 21.626117542471153 4.879705565547396 1 75.00000000002386 21.626117542471153 4.879705565547396 1 +-2.3723834259351833 2.3723834259351833 1.7988274783396521 1 4.5464710151344043 11.735738022921637 2.0946324284717539 0.99999999999999989 14.888425268470534 21.73192580274673 2.9974482015801169 1.0000000000000058 28.740644540721632 14.983562061355201 1.1436948041293928 0.99999999999998868 41.188048193587157 30.853792196494638 6.8975287582379137 1.0000000000000071 51.606038975498372 20.766624531703982 3.2307909501205487 0.99999999999999833 63.447227270623706 23.019551134494478 4.047361826263554 1 74.999999999984084 23.019551134494474 4.047361826263554 1 +-3.1478202812517777 3.1478202812517777 1.256637006859245 1 3.8825346677568429 12.530847258869537 1.4632824198430057 0.99999999999999989 14.451830786163059 22.701511392593083 2.093977539039428 1.0000000000000058 28.32531816801977 15.081437056623322 0.79897001392448364 0.99999999999998868 41.715148884378252 32.586856232821489 4.8185220638750348 1.0000000000000071 51.447654008166793 21.547650631251887 2.2569876868317986 0.99999999999999833 63.447227270625731 24.006521120294064 2.8274332654335819 1 75.000000000007219 24.006521120294067 2.8274332654335823 1 +-3.5355339059326556 3.5355339059326556 0.62831853071798205 1 3.5505706064273257 12.928396952016087 0.73164124169727363 0.99999999999999989 14.233536249244064 23.186298181990281 1.0469888149911422 1.0000000000000058 28.117657554128364 15.130373948086152 0.39948502431278238 0.99999999999998868 41.978695964980815 33.453377516515026 2.4092611365726784 1.0000000000000071 51.368462505527397 21.938158843439282 1.1284938924272563 0.99999999999999833 63.447227270624651 24.499999999999744 1.4137166941153956 1 74.999999999998124 24.499999999999748 1.4137166941153954 1 +-3.5355339059327386 3.5355339059327386 -2.2204460492503131e-16 1 3.5505706064268643 12.92839695201633 1.5975347728255742e-15 0.99999999999999989 14.233536249242547 23.186298181990903 5.559004606855246e-15 1.0000000000000058 28.117657554132329 15.130373948082415 -1.4762487599297348e-14 0.99999999999998868 41.978695964977959 33.453377516518131 1.3515968997086305e-14 1.0000000000000071 51.368462505527539 21.938158843438853 -1.6901778625232096e-15 0.99999999999999833 63.447227270624914 24.500000000000004 1.5086264655892687e-15 1 75.000000000000014 24.5 1.5086264655892687e-15 1 + +0 11 +3.1415926535897931 11 + +0 8 +1 8 + +1 3.5355339059327378 -3.5355339059327378 0 -0.70710678118654746 -0.70710678118654746 0 -0.70710678118654757 0.70710678118654757 0 -0 0 -1 +1 75 15.5 2.7554552980815448e-16 -1 0 0 0 0 -1 -0 -1 -0 +1 3.5355339059327378 -3.5355339059327378 0 -0.70710678118654757 -0.70710678118654757 -0 -0.70710678118654757 0.70710678118654757 -0 -0 0 1 +1 75 15.5 -2.7554552980815448e-16 -1 -0 -0 -0 -0 1 -0 -1 0 +9 1 0 0 0 10 7 11 8 2 2 2.8284271247461912 -2.8284271247461912 4.4408920985006262e-16 1 9.0159805468327825 6.4281751612018496 2.0133058846416192e-16 1 17.777778499972118 15.165580394866463 -8.0236115873956118e-16 0.99999999999998979 31.571168515292573 14.409868988290894 5.8731757129539919e-15 1.0000000000000278 37.64839458161984 19.182925960538899 -3.5800583136374853e-15 0.99999999999997424 52.67616934408646 15.539676739546138 1.5172914623676952e-15 1.0000000000000095 63.449895514329839 16.399999999999999 4.4408920985006262e-16 1 75 16.399999999999999 4.4408920985006262e-16 1 +2.8284271247462276 -2.8284271247462276 -0.50265482457439326 1 9.0159805468328216 6.4281751612018621 -0.58553428033384047 1 17.777778499971209 15.165580394865655 -0.83702922341251151 0.99999999999998979 31.571168515297988 14.409868988295917 -0.32030380321158969 1.0000000000000278 37.648394581614838 19.182925960534281 -1.9273256235209786 0.99999999999997424 52.676169344089331 15.539676739546854 -0.90272885493142008 1.0000000000000095 63.449895514330436 16.399999999999601 -1.1309733552923305 1 74.999999999999105 16.399999999999604 -1.1309733552923305 1 +2.5182562250010312 -2.5182562250010312 -1.0053096054873778 1 8.7505280572964637 6.7462367156950842 -1.1710685098071594 1 17.602833142044837 15.553363260898562 -1.674058374119779 0.99999999999998979 31.405486331285697 14.449023136926375 -0.64060757859783735 1.0000000000000278 37.85906535224138 19.876260232829232 -3.8546510796345723 0.99999999999997424 52.612831948476334 15.852024391121061 -1.8054576314498902 1.0000000000000095 63.449895514327579 16.79478310376723 -2.2619466123468186 1 75.000000000003425 16.79478310376723 -2.2619466123468186 1 +1.8979067407489889 -1.8979067407489889 -1.4390619826717084 1 8.2196165014000666 7.3823677049416423 -1.676339470317372 1 17.252938091745996 16.328938600612986 -2.3963500893836529 0.99999999999998979 31.074117858447767 14.527332404383019 -0.91700507699040601 1.0000000000000278 38.280412112952412 21.262945955287442 -5.5177845659494009 0.99999999999997424 52.486155588068115 16.476727432979835 -2.5844430656618647 1.0000000000000095 63.449895514333448 17.584359092398095 -3.2378894610108699 1 74.999999999990621 17.584359092398095 -3.2378894610108695 1 +1.0220788811419279 -1.0220788811419279 -1.7350064233054643 1 7.4700597701643572 8.2804763628600888 -2.021080247871553 1 16.758945849069651 17.423918941557226 -2.8891617231474176 0.99999999999998979 30.606281988837953 14.637891757957481 -1.1055880274247882 1.0000000000000278 38.875282006554237 23.220710117598962 -6.6525221148448219 0.99999999999997424 52.307310133244791 17.358701774719187 -3.1159361956481719 1.0000000000000095 63.44989551432684 18.699105966034271 -3.9037644524379909 1 75.000000000018389 18.699105966034271 -3.9037644524379904 1 +4.6762593797211755e-13 -4.6762593797211755e-13 -1.8404423209895382 1 6.5953375324381369 9.3285566244738707 -2.1439007788875823 1 16.182463800463946 18.701745707871858 -3.064735343935824 0.99999999999998979 30.060324062636926 14.76691297991343 -1.1727743297930939 1.0000000000000278 39.569486864737151 25.505393554351894 -7.0567941864600172 0.99999999999997424 52.098599985188997 18.387953514714269 -3.3052908432768442 1.0000000000000095 63.449895514330578 19.999999999989107 -4.1409952222257402 1 74.999999999974861 19.999999999989107 -4.1409952222257402 1 +-1.0220788811427488 1.0220788811427488 -1.73500642330558 1 5.7206152947181215 10.376636886096147 -2.0210802478716676 1 15.605981751912061 19.97957247426147 -2.8891617231474713 0.99999999999998979 29.514366136174079 14.895934201537747 -1.1055880274253354 1.0000000000000278 40.26369172315826 27.790076991440177 -6.6525221148445537 0.99999999999997424 51.889889837005235 19.417205254669291 -3.1159361956483513 1.0000000000000095 63.449895514330713 21.300894033984143 -3.9037644524380779 1 75.00000000002386 21.300894033984143 -3.9037644524380775 1 +-1.8979067407484411 1.8979067407484411 -1.4390619826715594 1 4.9710585634781923 11.274745544008159 -1.6763394703172221 1 15.111989509197203 21.074552815149307 -2.3963500893835668 0.99999999999998979 29.04653026675712 15.006493555362955 -0.91700507698972389 1.0000000000000278 40.858561616586826 29.747841153500076 -5.5177845659496922 0.99999999999997424 51.711044382278359 20.299179596439458 -2.584443065661632 1.0000000000000095 63.449895514328631 22.415640907590799 -3.2378894610107416 1 74.999999999984084 22.415640907590802 -3.2378894610107412 1 +-2.5182562250012874 2.5182562250012874 -1.0053096054874726 1 4.4401470075837057 11.910876533258277 -1.1710685098072586 1 14.762094458918183 21.850128154895057 -1.6740583741198436 0.99999999999998979 28.715161793814971 15.084802822679471 -0.6406075785982992 1.0000000000000278 41.279908377390043 31.134526876097311 -3.8546510796343862 0.99999999999997424 51.584368021816545 20.92388263828046 -1.8054576314500514 1.0000000000000095 63.449895514330656 23.205216896237385 -2.261946612346911 1 75.000000000007219 23.205216896237388 -2.261946612346911 1 +-2.8284271247461601 2.8284271247461601 -0.50265482457436672 1 4.1746945180467883 12.228938087750157 -0.58553428033381372 1 14.587149100984806 22.237911020916648 -0.83702922341252328 0.99999999999998979 28.549479609841558 15.123956971361764 -0.3203038032113672 1.0000000000000278 41.490579147982118 31.82786114834126 -1.9273256235211105 0.99999999999997424 51.521030626224039 21.236230289861044 -0.90272885493134847 1.0000000000000095 63.449895514329569 23.599999999999262 -1.1309733552923047 1 74.999999999998124 23.599999999999262 -1.1309733552923047 1 +-2.8284271247461903 2.8284271247461903 2.2204460492503131e-16 1 4.1746945180469197 12.228938087750445 -4.3498515050138725e-16 1 14.587149100985133 22.237911020917949 -1.2111033831702273e-15 0.99999999999998979 28.549479609839526 15.123956971356947 2.3425383791132212e-15 1.0000000000000278 41.490579147983965 31.827861148346255 -1.0269151715707795e-15 0.99999999999997424 51.521030626222753 21.236230289860686 5.1873396212586411e-16 1.0000000000000095 63.449895514329832 23.600000000000001 2.141842990487521e-16 1 75.000000000000014 23.600000000000001 2.1418429904875208e-16 1 + +0 11 +3.1415926535897931 11 + +0 8 +1 8 + +9 1 0 0 0 10 7 11 8 2 2 2.8284271247461912 -2.8284271247461912 -4.4408920985006262e-16 1 9.0159805468327825 6.4281751612018496 -2.0133058846416192e-16 1 17.777778499972118 15.165580394866463 8.0236115873956118e-16 0.99999999999998979 31.571168515292573 14.409868988290894 -5.8731757129539919e-15 1.0000000000000278 37.64839458161984 19.182925960538899 3.5800583136374853e-15 0.99999999999997424 52.67616934408646 15.539676739546138 -1.5172914623676952e-15 1.0000000000000095 63.449895514329839 16.399999999999999 -4.4408920985006262e-16 1 75 16.399999999999999 -4.4408920985006262e-16 1 +2.8284271247462276 -2.8284271247462276 0.50265482457439326 1 9.0159805468328216 6.4281751612018621 0.58553428033384047 1 17.777778499971209 15.165580394865655 0.83702922341251151 0.99999999999998979 31.571168515297988 14.409868988295917 0.32030380321158969 1.0000000000000278 37.648394581614838 19.182925960534281 1.9273256235209786 0.99999999999997424 52.676169344089331 15.539676739546854 0.90272885493142008 1.0000000000000095 63.449895514330436 16.399999999999601 1.1309733552923305 1 74.999999999999105 16.399999999999604 1.1309733552923305 1 +2.5182562250010312 -2.5182562250010312 1.0053096054873778 1 8.7505280572964637 6.7462367156950842 1.1710685098071594 1 17.602833142044837 15.553363260898562 1.674058374119779 0.99999999999998979 31.405486331285697 14.449023136926375 0.64060757859783735 1.0000000000000278 37.85906535224138 19.876260232829232 3.8546510796345723 0.99999999999997424 52.612831948476334 15.852024391121061 1.8054576314498902 1.0000000000000095 63.449895514327579 16.79478310376723 2.2619466123468186 1 75.000000000003425 16.79478310376723 2.2619466123468186 1 +1.8979067407489889 -1.8979067407489889 1.4390619826717084 1 8.2196165014000666 7.3823677049416423 1.676339470317372 1 17.252938091745996 16.328938600612986 2.3963500893836529 0.99999999999998979 31.074117858447767 14.527332404383019 0.91700507699040601 1.0000000000000278 38.280412112952412 21.262945955287442 5.5177845659494009 0.99999999999997424 52.486155588068115 16.476727432979835 2.5844430656618647 1.0000000000000095 63.449895514333448 17.584359092398095 3.2378894610108699 1 74.999999999990621 17.584359092398095 3.2378894610108695 1 +1.0220788811419279 -1.0220788811419279 1.7350064233054643 1 7.4700597701643572 8.2804763628600888 2.021080247871553 1 16.758945849069651 17.423918941557226 2.8891617231474176 0.99999999999998979 30.606281988837953 14.637891757957481 1.1055880274247882 1.0000000000000278 38.875282006554237 23.220710117598962 6.6525221148448219 0.99999999999997424 52.307310133244791 17.358701774719187 3.1159361956481719 1.0000000000000095 63.44989551432684 18.699105966034271 3.9037644524379909 1 75.000000000018389 18.699105966034271 3.9037644524379904 1 +4.6762593797211755e-13 -4.6762593797211755e-13 1.8404423209895382 1 6.5953375324381369 9.3285566244738707 2.1439007788875823 1 16.182463800463946 18.701745707871858 3.064735343935824 0.99999999999998979 30.060324062636926 14.76691297991343 1.1727743297930939 1.0000000000000278 39.569486864737151 25.505393554351894 7.0567941864600172 0.99999999999997424 52.098599985188997 18.387953514714269 3.3052908432768442 1.0000000000000095 63.449895514330578 19.999999999989107 4.1409952222257402 1 74.999999999974861 19.999999999989107 4.1409952222257402 1 +-1.0220788811427488 1.0220788811427488 1.73500642330558 1 5.7206152947181215 10.376636886096147 2.0210802478716676 1 15.605981751912061 19.97957247426147 2.8891617231474713 0.99999999999998979 29.514366136174079 14.895934201537747 1.1055880274253354 1.0000000000000278 40.26369172315826 27.790076991440177 6.6525221148445537 0.99999999999997424 51.889889837005235 19.417205254669291 3.1159361956483513 1.0000000000000095 63.449895514330713 21.300894033984143 3.9037644524380779 1 75.00000000002386 21.300894033984143 3.9037644524380775 1 +-1.8979067407484411 1.8979067407484411 1.4390619826715594 1 4.9710585634781923 11.274745544008159 1.6763394703172221 1 15.111989509197203 21.074552815149307 2.3963500893835668 0.99999999999998979 29.04653026675712 15.006493555362955 0.91700507698972389 1.0000000000000278 40.858561616586826 29.747841153500076 5.5177845659496922 0.99999999999997424 51.711044382278359 20.299179596439458 2.584443065661632 1.0000000000000095 63.449895514328631 22.415640907590799 3.2378894610107416 1 74.999999999984084 22.415640907590802 3.2378894610107412 1 +-2.5182562250012874 2.5182562250012874 1.0053096054874726 1 4.4401470075837057 11.910876533258277 1.1710685098072586 1 14.762094458918183 21.850128154895057 1.6740583741198436 0.99999999999998979 28.715161793814971 15.084802822679471 0.6406075785982992 1.0000000000000278 41.279908377390043 31.134526876097311 3.8546510796343862 0.99999999999997424 51.584368021816545 20.92388263828046 1.8054576314500514 1.0000000000000095 63.449895514330656 23.205216896237385 2.261946612346911 1 75.000000000007219 23.205216896237388 2.261946612346911 1 +-2.8284271247461601 2.8284271247461601 0.50265482457436672 1 4.1746945180467883 12.228938087750157 0.58553428033381372 1 14.587149100984806 22.237911020916648 0.83702922341252328 0.99999999999998979 28.549479609841558 15.123956971361764 0.3203038032113672 1.0000000000000278 41.490579147982118 31.82786114834126 1.9273256235211105 0.99999999999997424 51.521030626224039 21.236230289861044 0.90272885493134847 1.0000000000000095 63.449895514329569 23.599999999999262 1.1309733552923047 1 74.999999999998124 23.599999999999262 1.1309733552923047 1 +-2.8284271247461903 2.8284271247461903 -2.2204460492503131e-16 1 4.1746945180469197 12.228938087750445 4.3498515050138725e-16 1 14.587149100985133 22.237911020917949 1.2111033831702273e-15 0.99999999999998979 28.549479609839526 15.123956971356947 -2.3425383791132212e-15 1.0000000000000278 41.490579147983965 31.827861148346255 1.0269151715707795e-15 0.99999999999997424 51.521030626222753 21.236230289860686 -5.1873396212586411e-16 1.0000000000000095 63.449895514329832 23.600000000000001 -2.141842990487521e-16 1 75.000000000000014 23.600000000000001 -2.1418429904875208e-16 1 + +0 11 +3.1415926535897931 11 + +0 8 +1 8 + +Triangulations 0 + +TShapes 42 +Ve +1.00000011584738e-07 +3.53553390593274 -3.53553390593274 0 +0 0 + +0101101 +* +Ve +2.00001022062862e-07 +75 15.5 -6.88863824520386e-17 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 1 0 0 1 +2 1 1 0 0 1 +2 2 2 0 0 1 +0 + +0101000 ++42 0 -41 0 * +Ve +2.00001005003195e-07 +-3.53553390593273 3.53553390593274 -7.40818758532816e-16 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 2 0 0 3.14159265358979 +2 3 1 0 0 3.14159265358979 +2 4 3 0 0 3.14159265358979 +0 + +0101000 ++42 0 -39 0 * +Ve +2.00001041588069e-07 +75 24.5 2.06659147356116e-16 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 3 0 0 1 +2 5 1 0 0 1 +2 6 2 0 0 1 +0 + +0101000 ++39 0 -37 0 * +Ed + 1e-07 1 1 0 +1 4 0 0 3.14159265358979 +2 7 1 0 0 3.14159265358979 +2 8 4 0 0 3.14159265358979 +0 + +0101000 ++41 0 -37 0 * +Wi + +0101000 +-40 0 +38 0 +36 0 -35 0 * +Fa +1 1e-07 1 0 + +0111000 ++34 0 * +Ed + 1e-07 1 1 0 +1 5 0 0 3.14159265358979 +2 3 2 0 0 3.14159265358979 +2 9 5 0 0 3.14159265358979 +0 + +0101000 ++42 0 -39 0 * +Ed + 1e-07 1 1 0 +1 6 0 0 3.14159265358979 +2 7 2 0 0 3.14159265358979 +2 10 6 0 0 3.14159265358979 +0 + +0101000 ++41 0 -37 0 * +Wi + +0101000 +-40 0 +32 0 +36 0 -31 0 * +Fa +1 1e-07 2 0 + +0111000 ++30 0 * +Ve +1.00000003092948e-07 +2.82842712474619 -2.82842712474619 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 7 0 0 1 +2 11 3 0 0 1 +2 12 5 0 0 1 +0 + +0101000 ++42 0 -28 0 * +Ve +2.000010012582e-07 +-2.82842712474619 2.82842712474619 9.68596121552874e-16 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 8 0 0 3.14159265358979 +2 13 7 0 0 3.14159265358979 +2 14 3 0 0 3.14159265358979 +0 + +0101000 ++28 0 -26 0 * +Ed + 1e-07 1 1 0 +1 9 0 0 1 +2 15 3 0 0 1 +2 16 5 0 0 1 +0 + +0101000 ++39 0 -26 0 * +Wi + +0101000 ++38 0 -27 0 -25 0 +24 0 * +Fa +0 1e-07 3 0 + +0111000 +-23 0 * +Ve +2.00001030198519e-07 +75 16.4 -5.51091059616309e-17 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 10 0 0 1 +2 17 7 0 0 1 +2 18 8 0 0 1 +0 + +0101000 ++28 0 -21 0 * +Ve +2.00001064344293e-07 +75 23.5999999999999 1.65327317884893e-16 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 11 0 0 1 +2 19 7 0 0 1 +2 20 8 0 0 1 +0 + +0101000 ++26 0 -19 0 * +Ed + 1e-07 1 1 0 +1 12 0 0 3.14159265358979 +2 21 7 0 0 3.14159265358979 +2 22 4 0 0 3.14159265358979 +0 + +0101000 ++21 0 -19 0 * +Wi + +0101000 +-20 0 +25 0 +18 0 -17 0 * +Fa +1 1e-07 7 0 + +0111000 ++16 0 * +Ed + 1e-07 1 1 0 +1 13 0 0 3.14159265358979 +2 13 8 0 0 3.14159265358979 +2 23 5 0 0 3.14159265358979 +0 + +0101000 ++28 0 -26 0 * +Ed + 1e-07 1 1 0 +1 14 0 0 3.14159265358979 +2 21 8 0 0 3.14159265358979 +2 24 6 0 0 3.14159265358979 +0 + +0101000 ++21 0 -19 0 * +Wi + +0101000 +-20 0 +14 0 +18 0 -13 0 * +Fa +1 1e-07 8 0 + +0111000 ++12 0 * +Wi + +0101000 ++32 0 -27 0 -14 0 +24 0 * +Fa +0 1e-07 5 0 + +0111000 +-10 0 * +Ed + 1e-07 1 1 0 +1 15 0 0 0.899999999999999 +2 25 4 0 0 0.899999999999999 +2 26 6 0 0 0.899999999999999 +0 + +0101000 ++41 0 -21 0 * +Ed + 1e-07 1 1 0 +1 16 0 0 0.899999999999999 +2 27 4 0 0 0.899999999999999 +2 28 6 0 0 0.899999999999999 +0 + +0101000 ++37 0 -19 0 * +Wi + +0101000 ++35 0 -8 0 -17 0 +7 0 * +Fa +0 1e-07 4 0 + +0111000 +-6 0 * +Wi + +0101000 ++31 0 -8 0 -13 0 +7 0 * +Fa +0 1e-07 6 0 + +0111000 +-4 0 * +Sh + +0101100 ++33 0 -29 0 +22 0 -15 0 +11 0 -9 0 -5 0 +3 0 * +So + +1100000 ++2 0 * + ++1 0 \ No newline at end of file -- 2.39.2

      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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_merge_edges.png b/doc/_static/gui_merge_edges.png new file mode 100644 index 0000000000000000000000000000000000000000..eb0c4f2e365f7b212430f9efe12053d2859b102d GIT binary patch literal 10724 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_merge_quads.png b/doc/_static/gui_merge_quads.png new file mode 100644 index 0000000000000000000000000000000000000000..caf75e9b863add08889bc55fd6a772eeba7a871e GIT binary patch literal 11245 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 IOTT#gU(8xAfdBvi literal 0 HcmV?d00001 diff --git a/doc/_static/gui_modify_point_symmetry.png b/doc/_static/gui_modify_point_symmetry.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc3a16728b054cbb18211efcf441de072950268 GIT binary patch literal 10120 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 Zr`IaDt=b@N4{W`LJdszGD~3IP^FLM1lA-_r literal 0 HcmV?d00001 diff --git a/doc/_static/gui_modify_transfo_translation.png b/doc/_static/gui_modify_transfo_translation.png new file mode 100644 index 0000000000000000000000000000000000000000..d503cef04f02ae9980bf69793b24999a8630dbe9 GIT binary patch literal 10924 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_new_document.png b/doc/_static/gui_new_document.png new file mode 100644 index 0000000000000000000000000000000000000000..a64bfea217f42fc5ea6612a58148b7c30d8780d3 GIT binary patch literal 87863 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 D1AX>` literal 0 HcmV?d00001 diff --git a/doc/_static/gui_parthemispherical.png b/doc/_static/gui_parthemispherical.png new file mode 100644 index 0000000000000000000000000000000000000000..3346eb862418c8fc917bb4464a695c64aa78abed GIT binary patch literal 30030 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_partrind.png b/doc/_static/gui_partrind.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ec679e0385b95a6f108eea01147b540bd0e0c7 GIT binary patch literal 28630 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_pipe.png b/doc/_static/gui_pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..77ec2fa5cb2f47144807e39014ceda6f1958405e GIT binary patch literal 9480 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_quad_edges.png b/doc/_static/gui_quad_edges.png new file mode 100644 index 0000000000000000000000000000000000000000..473dae7ab55ac7e14e465f669156dbbb969c52f0 GIT binary patch literal 11940 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_quad_vertices.png b/doc/_static/gui_quad_vertices.png new file mode 100644 index 0000000000000000000000000000000000000000..56bc1677037fa821882236c03db2cf95283c4076 GIT binary patch literal 12725 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 W_Fr!gfd5hfc`l_SnGb*Y?tcNlw7Mby literal 0 HcmV?d00001 diff --git a/doc/_static/gui_quadrevolution.png b/doc/_static/gui_quadrevolution.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe4639bb2754e4f7f64121c8cfb8fa7c832f285 GIT binary patch literal 16922 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 literal 0 HcmV?d00001 diff --git a/doc/_static/gui_replacehexa.png b/doc/_static/gui_replacehexa.png new file mode 100644 index 0000000000000000000000000000000000000000..139cc5453e1dab2b11b9738139dca88e8fca8dad GIT binary patch literal 14649 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 literal 0 HcmV?d00001 diff --git a/doc/_static/cut.png b/doc/_static/cut.png new file mode 100644 index 0000000000000000000000000000000000000000..40abf2bdb3411bf457b054d2026733060ec86248 GIT binary patch literal 19057 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 literal 0 HcmV?d00001 diff --git a/doc/_static/cyl_grid1.PNG b/doc/_static/cyl_grid1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..59f4c2f3e9abc537de81ddf092b9b0ea3c30284f GIT binary patch literal 5550 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 literal 0 HcmV?d00001 diff --git a/doc/_static/cyl_grid2.PNG b/doc/_static/cyl_grid2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..3acae07c44be0ebfbab01a3d52aa3806de557360 GIT binary patch literal 6777 zcmZ`;Rag@awBH7kF&g%#q!kz;OptKYC_x!8LO`SyMCnkZ#zuF?2w@;dcM1YSP&xz^ zq*GEtr0a6O@4nub)8~BW;rE?~--*EJXwX2}p#T7Y=AovVJ^%nTzP3{#pli7jZ?;ZY3geO06qc$04^8+IK2+x)&PLl2moNi z3IIS7000)(tY$rV0D$f2p_;PcTZ=#D%F$dJ)m&9Z51t5NzXoeFcf;>SacYV}n4#_} z7-|MqhA6nAV=yGr=6-n4QJ~%;+3)$3z~FyIlVmpK@=rwSMq79esabT)WN&lGlJHs; z_gxoAynYJxQ&U&x`@@Duo=4vY4C_?-n+ppIn>RK~DodM{-Yk3$QModpEF%9Pj6a(7 ztpq^V0)&Anr04v*-!!;|py)S;2c3^W4?vNi5(;5_u@*|tYJ;6PSILNhVK_0AX!Glg z!8qUon}W;3ZID7rvY&h*v7=;e$}K;y(*&RNGC9Atu2e9(Vj z0Yop080qhv-!cQ?;FJhBrscM|;$`iAj?ckB`a_5_J9jZ0 z@!9)wlBEr$bNRb~>8XooCO;>YZ_qoB%Lp^FDczHR#)>z}zvXMChWK|O7&h4Q3a+$QE>vl|aX=2Sh!g{`V6z5_l?Hu?w>aP@94|U05 zE^D%pBmDB5n^VSUe5TVy+7|;*qe&d>Jf?Igi`rXPwImBrlN_OOmTcUw!T*g)Jh*OK z+p?krlQnuD#t)O-?~a&lsq1(ZP+#|=Y=8C9l=D2pUgiD{=*=hW1lhOv+i z8EFfIcv1O%*keex+qoP%E{TEzo3S*_7GDO zca==@I>lF!;sz-^4+$*+Pol_iQ@?|~nLU!u-xB=46Z?css&6_(bzUoXqr zNGiS7-Lr(&r@m>EosG7B(#C>>ud4(j*PHRN9m5a2M^;!IIQa%G|0$EJI5mjCWzr`~M9U6V^a{!|@SG)yQ? z*a_36#%}8MmCw}aa+-CqE1f1p8^~iBUZ*y;=btY!SfQ!Fw2XiI6Q|H0k;}_d!Re0o zuxhoHo?w_JG?_u8;+$_-iuFDe^JfNa>a50J`lm!?snbqk8T{cA-WYH!e&3R1)7%lu zAky`{fwwyp)V0dVnVU8_R-xUmZ9L1}f4lkLvr@_y&(X754(#58C(!%&)3uKGxbjw2 zpI;pvCdE<%0Ay(TjH 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 Z8PldI%^f)#a0j^o+8PEBlo~ARe*g_ASGfQH literal 0 HcmV?d00001 diff --git a/doc/_static/cylgrid.PNG b/doc/_static/cylgrid.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d5994d11b3310c635ffcfb5386ada31b7538cae5 GIT binary patch literal 5615 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 KqDI{@>VE(@APbZL literal 0 HcmV?d00001 diff --git a/doc/_static/cylgrid1.PNG b/doc/_static/cylgrid1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d18191bf3d38ce381f62134fd3e31aab692ab638 GIT binary patch literal 11385 zcmeHt=U-D#uy=?-DWV7>Dk2>up-T}_ic%y5P!a;6g9(C2S9(`eK&2jfSAv014AQ%x zKxhI2(mROsqJXsLpuc^~LK?o$^ z83ghN{1os50(l|9`M2O5Q~-%z=grrDt?#K2^nf2dLn90^#~g%K}al63r+5uT>&chbb|KLjKCc9T5*fYbIaH;Q2dG z;Y}JMWuFBE{fIWO5f+b}oTg*?*IEL3TZ)4~{>jKMSchQ|(y;m0dZZgbdQ=O8{6$8Y zTat$Oe+QopYu!F5mrSQY#^4{XVa2wD`0ElnHMW+MBAG&O(?M6tVk5uU-4N>ZO zQ8tEmRaFBVaj1B>(}nfi>kRiltnANR(GwoCQiB8zgPXd%_tJqba4vPtR6{Xqx|hrM zOd|UqDZI|*AW)k`ZUvA;qVDuu(;82AUjL$&`WsW$IshxX464D)GZt`3o%|f#ag(Wc zFGwB_F#c=_G*G%%pi+Igy4C0mOB`sKkO%JQ3b?%95Szlj5aJ0?W`d%!)KgV22s!N+ z>ooE!p6Wba@W|zYd&t}&|*4sb7Afppc99G^~+;@92A~&smf!hwM=V<3;%&H0+d7(c;i(sGIUMeXX`^=kV)z_chc5| zs1;0)*#a)yeHZak^r8@Ih7#H6I4xG}x2_ge#}B#^mTkT8kq^$FFq5CUR*}nk4<9g# zK<|V4BAL8!ld$!L9&P)B%l-MJ*e}`BXZXH?)^B_Aup&`1^55eU=M6{?!kI=gx9$!T zDqpuhGXVVpwqvQUK>S4cbtFj)dm6xq6|9MxqDP+6O%a9Ficb4 znwXS^6TNe!bC}oBH4ihhrTXDtZlqL-P&gC6JOs6M;uR%2!wvkd&aQVexbo~McW})q z8ls*^oY?}Zh?N*c<*}x1Fb%a&_+)yt$*F3uqt8B^Tj|H!}c@!%auFbfBU-b#onBBWkn#2YUNnm(0-6{5VwMV2%%=8& z>Nmy&U=?DVWqH2loV5?K%e5^r<-ik)DRzq4^b%}00Y~$ca{YVdHwH?2f4H1?Xj30Q z@J`FVI*G{6P2%X|sl)iqthczEJ{Y3;9R1HY`0F2c$Ak|=0#D!t3CWNMgum7wl>1sFza(R_-E+8 zr?b=`wSkya&?I%!BiJY|C<`RvBF^h3LdRm+Y8(-|`xAs__?sk+xhp3Jg zujqBs+KO+@Q(i=F+|Ty8CXAUFgmMcz3OZM{&zbh$FG$Z!Ty0Zw%WKz4oEO)uqxi*P z!G1HAW_0FYtl8TX-Uw|&8G~4nZ$rAFq)Q3Nl9V6cWPeWjfySa#qOaajF7HD|wF67J zyGTepRYf)>zZdJN1G=fT5FKYha|oW0b*p;cB%Zp)!i~Vs&<9Qj=b$}h7pF2Jrlq9~ z-nhFPd;@X3<;e^7B0v+V(s5@JpY!H2XJ#MlFvWnrD`d89-iWf!PDAY0rt0|4BQG6#byTFj#|3IXZSl>`rD$L zqfP9MDMKTsDRB_Ad>qFKY&-*cz?~_kFGkn7%S66(q0&ncbVb)s;0a^5er;>zq#{2( z*XWPHQm^6UtJf+m1;O56MH~;}@QmS<++u#OZ$iC6_t|y;QCZ_{&0+y(pU>69f4=zL zhKc+zD-pqt2pD<}e(rZhU^v)v48|}YP@Q$Eqs)f-Xla9d$HV1I$N`i!z{0lSh1r&Y+`mE+&`dY`xdd>ZHgDop9B zZ+QZFQ2>DwFkGdY3KoskyeXeiw-tfufFcS7a+>O3Wuw@Bk&}Z|p}$Ax6a?CVw<%+3 z?w}llQv!&}=Fq5f!h6N}kv&^u0dw*8yP=kipc9yh?;1cP=M&(S%nRA+pU+jy!F8+8oxtJDvGK^lLZA#K ztD6-<-h^|0@dZPR$0p}akwwH14~IyDv3pib03-b*f|K!O#vy1$z6Qr|I2<;f8ax=g zaW2tCUL2q0$Rzp4AJpuvC(77ZfQ{%SfQTJX(OwXX5D4?$IPU>WSXOKqVBWepZg*@q2p zciA9M&*BMp^#^`Pq6j9G7HT4;`+kAkECi}rguvHG<(H5T`H51}O{d6YL4=?1iqX;^ zCLQ#j5BrxA$R|a`5lXK}uR6qVI3&n@Kv4hG8J7O1Ker^6UVUX>4bQ)tdo!GbYQBQQ zX<*M*NzxW9q49a5oef>h)MwX=zVRhclOIO`YIwDF1+w0N*y`v5q`I`hY)qnBDit%! z-#u?cq|gNl6IMEIx6E*Q$*uI7B%qzBN&pF^#e>6TU=ZGNTK(fgGjY z$E)ZQO?==tQ%P-|=Ws1z2;JAy_s9JI$WFYj$LF5gZ3HpwFxdch1l}vdPy%XE&B*Jx z9S06wxjz>BQ(~^IcnNLSr^CPJ@d9dWNKP19GxG8Y>}(P>=}Suzi_1<5)cpcBUVP5R z@Y&_fuGCFhXJP8SFWm9SSaJkFPhokKyeR?nr-f`6vn2Q0>($yKSzp~h&V#^F?^Rrj zM`p%E0Lv7YJZGsdm@=(!mmk%-r*ll3rV$~bda-xGSx`QWD%inRq^rWt!M*f+4)@h) zjRvbLo7_ymt(HF}9j^B6nF*kEqdp%lPU!T@MgY47PlAm1HjRE%wdSIR&A9FpP+Z_ zH<342#a28eO}7i;c6u8Qd9RR4x(K0@QY)`wTkhmMN#!};4pe>4@y4UF6ebl;f4_%i zk=5y2AgMCw-g9@pArLiO(QlJKOu9l?A;1UFrNQKHlxXqFJ;f}^+RDY~u!rk;^Z#O~c64knuD-2KHN zWAFu&PSUl6qu0_rJzgI}hCz{S<5NO!M*>%~-c1&xvh@0*sMP0f>t#v1 z_6L6Ul~ZEUGm3{Y>f;C?XQ13Lfhup-Q_#VSP^jvocNjwn(Ea>IaCWahJo~*^ToBQt zg-L_NBf0W#YNYTXlH_!%_7lt|%*tCg>tGSDA?EYA0OG554AG)?_p3^_os15zapBlJ zUyPT@M!BN*Nr$#>STl8mH+sR37=_?kv#Dqf{n8RVl0Y&Ea661`ni77KGdx#5P3I$E zcF)DU1>-U|XaCq9ADl8g{5FBA9nkM^7?eUbX(-z>#b-H%?6O`*3nzbBIDxI|vn^A} zjbySs{=)0w3$x?2^Y$JW%!N&U95AMkzUf$Cu+lnzmO4;bTtnG>wI{?lpZ46FamHu4 zQYMIVl*;B%x}0bq{_qv%p&VEn=lN5OStA*o&LeZCdVKY;rvF?dl`f0S;W4l(gr!b zH;H->%HNmZ!P-VdX)9rZN=W7 z$lyY@maVDbd3I`7{3XCUbQYOT#+N-K;hS$2ozLW=g_maFPZ_dZibzpNoSdcxzyQBz zv&bTrZ+6_o?yyC&a|`uH2?KiGH0vUZ!!^tbj>Dgyh9Z?~^*OZ_W0j0FRl`1~hEDbu zXKvOF-EYfhKB@Q|V%}mjACK&78xCs?1iC0v)DQpKM0xcKh5S`DA> zLXXs=1BH)HxSV@85RK+7PtgJ_g3wVFI_Xf2a&-Tf;1CTk70d;)$=!#Eet)Rb4$z zO5L~wBX|N8vv-VZxelp;vxL9+#qFnZJU$Vz=F?j(6-A&(72c`#Jd19Le8F=s0x+XQ zWt8=ao)3@A<|UO=zGVJU414)@&lfY(-wW^&ZC(hmL|Tw}rNuDR0{Ns!DvH3phzjRLh!WIjD$zp^yK>o1SKZk|YS~VCs{iy@`7L?=;q&E3ic=Wn*hz z_NZ%Xv5{|FzGHU=a9t+z2Fpj$H$mO4B9=5P;FMvde8o7Qy8ZgcpbnImhZ67dRH+Q_S+0iAUv6I|y3Av8&&AE)8ZzvvrkDsX^U%8i! z{5DwDmpVdHEv@jV1EqZbf|yyw0BqQe@VAXa zaD3M7o%?XkbnN9QvPldulk3_KbY9?ADxErR7=b6MUR>ohj{8{ z#NU5{pU>_oUV6xjwrz6Bh&&1#v*|DOb)^s-bhQ*rSh7#~H)<^S624;mE*s+Bi?k&( zytz96z)uz@Z;<0I))4tAK)0$&%_HAg`_r)^mBRW*Qh>VJ8AD!YioZ2upa^f9? zi&FW}wkpo^lFi6FAln@17V{@xG|DmxU|PG|CMMoiPS-nnOWud0vS>f|HgO}GD4#H? z4qF_3Qyv3DCv*zmH+2!pq!fkifgyn?(y)42J>(SVK<-1w!kQF;ZJh~|B)zKSG0STU zqvMMo^&Jc}i7p%ymybmNPxY$Zs>`wTn+ZX~ea1I>Pq(EahbOK-fS2a-qsw1ACDAlf z6>zwM?=U&LCbUD4(c*oTdfD3uo1P~6j()~;?_hAfsnUTF{7e?OVpC$^mtqE^MB_qh zbH3=``Qzkb{pDUH(ItG$&t1WE*942~k1ruWLX&Q^(wxLDBpG&(UQVtlp}ux$!8p_n z{lZe#Rk2k4IKSP43Au=NIY;#R=Qc*K3vT`?>ohp8ZlTVIbioWrN_zKl{ez3km!DX@~jZKJ{ z=TZ|O1#Gkpuf2xgc66~NzWX1R8Xxp_c-*UEw(PGLZ$$ry<-TqYY{w#J z*Avc#75SK3!T=CI@_M=@m$b8S{giJ#-2H{hGIqwpN4`4979K+=R2U6edDdbUWpA+_ z)c>jA7_!@7`m_oCf%nCOSF!RvnZOYOp>+9Hw3KJw<+6pyx*1hiD}2xys`AbZl0trm zn&Fp-s}(3LCO@))uW=3oru4}GV4<>faUrc6(tb>IG0*a@uQ??M-*AJ^o`lsB=zhmT*gq*bPk!1>C?p zKS!zdJ1SHkCY6Nvlq2hd9{DWFE}!-L9c--l zG~9f!V*8`CSS`0*)|CFoL3rT$Ck!;g#3j5=j6!jiretVrDeoyXpWua=t)^} z+^d!*+}POCeN`Y`o|IH+L9BvYhfAVnUPdT6YFKFFJokEk_ttifh&d{btjx&K$X4An z+_{`~#g}O(jT0VUkQP@wWW#=mK7}?q(G3}P$uQ)7%Y@8>(kfj4ZkErv9q~@4zN(cj z>iF=<Shr zF8ESv=Qn`sjR4A=RQW{GdGI7p`hbxeADFh1HQ-m!cY|)m=-WytJ=r)9gor# z2_wT^Pkj5b>AW_u&io4hsxq1B0LoQbHUC!nMT0^T-|N%O7zYDB(5+?A){Ayjx? zI^JICJTXjSuD_d9$*64`wU2%Z3mYIwa*46HD_ zU~@dcUCa)F(AB=8IM!hCtw^C<@rh%hSIWgA^A`pB=e^&sb{3aVi+JB=cb9EmTowtm zrm&Fv(6ZFqN;c>9BN}>YTAQzN=#=-}4WB-tp>zAhvBLxC@{wYqW*(h+vVR`hPY^H! zgdB9!!c(u%s32MS+9J|vBpdxdET3(&Ojz7BX*l3!?gag4>8H2ZQp9uKRGPpafq+F< zd->Jbdw~Y$m9~14Aq(nk1$w4)@egR-QmhB-pSA{&B-p4Cv2|KFVS6FnaDabUv-Y;m zdHm;ypwG77zkSqyo^f!HK5n%NeMx$k*8|;E8IL2wdf)v>P1@TU%$_q4bXb1E#VMlo zR4CqOhlwb8;9Retk+<%yw)y)7&ouAqoc%J|{6cNfriaz~Llvxp;7!BV4vI7DOKNO~ z>ptj_^CldikOBsTbM10abAmvxdJjC_h>}^Nwtisa5xMZdG}>pW{gc#exe9v6(+cIh z%^wi_IpR&-uW;z=0Xw6c0-p6wE&{1PJa$6D2Ue)lj0Izj(XTFBYi9d$)L2fKC&a|au^-e#%> zZxF%Sq3={$exA$A_hYp60`KxZVSbAq^jg{ETQsGSV6@)g2kQ^8z#I4kZ6?B=IVB#`Vs-KK5$FUD91}Zb)E_}aM9#R%oSrrEu)shM_aB&ESJiKYDbq7ZS zk+KuFa1}_>uUm4ZLq!0n*U?E|hss)e%$w}=_l>&Ta*7AxDRt`4nG&hLxeTn~a$7#7 zx_lD1us@}B9EcN{m6xcnHyV=KfhvSR|9 zUL4o@w0W)RM0%c7>P|3FzE*B@6ZkH;l+y^yZ>Gu?JgJyn%B`&0dE7E=)O_z0;zJ3Q zC)1A|)<5^f9=xPI5t7^HhBkrM+{NJ;37C%yO-CzWdgNv^K<`FY_@)Us8`X&!1h{RVa@A8(gu^>`;9>{ zJ6&dw_I4d7nyUc6cd`VSlcj-9B_irY{Tw*qYme=L5L*VZDN%FCJW1s485B)m70gW5 zAn{TWlfyD=t8Si#U2a>ufz!>EeykBm*1K#Nd%*9}X^m4!REL$a z1nR}&IuYh(opfzifii$A7RFx13!><3-x#-L4Pq1J>(9;wZDlTd(k5FIqDz)$ypc$1 z)3$O-ada~ZCW)YFQLw;^FdaFAAn&bVXi;}hH6$^CFi9JFf|>C~TU zXb|i3v4lGO@p#<6j(ET(hU)Mes*!#z@UAPtq5b>s`9U};B`q>~rdK<_E? zu|0_a`ip)Kd;=#q6!&2hnw1{G6_P;+f0epjRkjd?`upzISjkr#>YTLL(0D;0@}B)U=?O4a|*ub-6$`*-)v(>+w512U`3z z{^?DC=}1maSsz!`bcsOsv2rQOqs1K&qLkc<3JzBdO3AP?eoMoG6$NUwWAdHAa%9kb=>~9v5VSZ6avriZ#QTr?1qB{4c-OS+3!{x;) zNaB(3xqgh7&;#}ja^|oc7I5S+Ho-7Q&j0aOOy7Q)6q;0F7sdgqxlJxgmJQsZPiJEQ zwZn_tM9PqZV+|b!Obu8khPoEB$`E#s(D<1z>Hw4FAE*6_!a3)cyd;xLuSx*FTpp^^ ziD)Ss6Nq3ecvcelb%YFI>oMzX3r*-C{3=1sn25nNYijb8zWWxOYWkAW_C3gq};53aS@Y>A{ zt!5zrzSj^*N4tsstpGX{>|h1RN%avYXl!z>C@+HX5d(@4$e##>CLLjJ3m=55fgeBs z2|c2tAI}&*1t&&%cnV5!Z>KB~(@P!2Cxr_4U|a&K?%a16ng0 z>jSmPBtPl_A!~iqFBk+8|AS+PFq1Y|T;sNx;Y30AryAj>j#Iq@DRwAo5#@*2pW_&Ttk78?bnTr%O$r@ ziF+is=7uFu8H`ip!QvzW)C}Sa05^a#EB+TQ5lcbwWX#@~el#gwMiMONV1*I};cTsL zsqsZSDkUDH{+uT5;7j3$DX{N4%%NC+{p?g|q|ez!f$%KtYIX6x}W|WkQ{49)*sC=4-)9X7@DaAIp}3CN)!*lk&xBbc>_%X z#JhL{>Ldfhz-O}x5!Pe4mI$f=MQDG@ zfOup%r(qo(H#4s?R?xp8^jOIS)XZA0!{sUAUJ#HB(M~lw?z@o?Fdex;k6#5=QUE>B zAL}{qvR#GJsnSOPJ6VHv>0}DazHp*1Cpsa8rc(nF*Z~8xq6xa(8RTzAk$;ExyNNT( z+%(_=X)R`fj0banQ5JSAP_Wi(^~Jxrr=tND?`NsV5NUcA8rVf&_SI<63Ji00xfx8&=Z(9CH zAkCa9Zm;ROw@=F&Jy`A*3g(E9rlx{-?0t8Kxa}PRT%eo(4vg7GHvr7q$ij?<8a~%r zZK$1J@^^V2-i&$9x1|hYzH>W({86}<-RoFd>E;5N`K7dyjodLy@RhZKlLq#Xl^gMv z5Ul*|AS8kLCOQE!!Uqb>MnmcT{p9vWmtNkv`u~cGRKck<#todSH_p9nsvbN&j|~kF z1apO~>E8TMI(~j;P&*?eJZ~8#LeRMD)q-Hb-UB*mfBQB0@q{ZTVGyW4m?k|3`&Uv& zHw`+s^;vcNzq&Or$xZ%S-3Ig&Lw9>Zh*5k-KR>6Rpp$bUt00TA?u zy1D>mGq4)N(LwcpDgaTRFa9fzgMf#AJaTmS<;njR zjt`ajSHuVTug2)ih5vY!V6*#IiAMul2a~Fvu6$DeYWP6u|F@p-{{#Zj`oA3lRrUW= k?#TB3)#?4O4ecq-^?k6raiFdV)&@f~)pS(zZ&?KWKQL-Q-T(jq literal 0 HcmV?d00001 diff --git a/doc/_static/cylgrid1.png b/doc/_static/cylgrid1.png new file mode 100644 index 0000000000000000000000000000000000000000..dea67bcfef829301c5c49b640c781259abace251 GIT binary patch literal 19319 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 KMNUMnLSTYR@5^QY literal 0 HcmV?d00001 diff --git a/doc/_static/cylgrid2.png b/doc/_static/cylgrid2.png new file mode 100644 index 0000000000000000000000000000000000000000..bd4ffa22fbd864ac0944901ac880b91c4b0eb9f4 GIT binary patch literal 36207 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 literal 0 HcmV?d00001 diff --git a/doc/_static/cylgrid3.png b/doc/_static/cylgrid3.png new file mode 100644 index 0000000000000000000000000000000000000000..56e284dff142947e413bd4cac6f1278a26d72c1c GIT binary patch literal 34059 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 literal 0 HcmV?d00001 diff --git a/doc/_static/cylgrid4.png b/doc/_static/cylgrid4.png new file mode 100644 index 0000000000000000000000000000000000000000..afd9d3945ffc2044ec29de499e98921cf59e02db GIT binary patch literal 31866 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 efBL`b;=dyy%Kva}86pQ4azx{vqq}8wh literal 0 HcmV?d00001 diff --git a/doc/_static/cylgrid5.png b/doc/_static/cylgrid5.png new file mode 100644 index 0000000000000000000000000000000000000000..7b04914ca6c9783bcd85d934eb39914447cb9615 GIT binary patch literal 26754 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